diff --git a/.babelrc b/.babelrc index 6dbbd780..6d91df1a 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,4 @@ { "presets": ["@babel/preset-env"], - "plugins": ["syntax-dynamic-import"] + "plugins": ["@babel/plugin-syntax-dynamic-import"] } diff --git a/dist/PEP.js b/dist/PEP.js index cfcef673..8479d4dd 100644 --- a/dist/PEP.js +++ b/dist/PEP.js @@ -1,5 +1,5 @@ // version: 0.16.0 -// date: Wed Jan 16 2019 10:39:53 GMT+0000 (GMT) +// date: Mon Mar 18 2019 14:21:50 GMT+0000 (Western European Standard Time) // licence: /** * Copyright 2016 PT Inovação e Sistemas SA @@ -25,4 +25,4 @@ **/ -!function(n,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("PEP",[],e):"object"==typeof exports?exports.PEP=e():n.PEP=e()}(window,function(){return function(n){var e={};function c(t){if(e[t])return e[t].exports;var l=e[t]={i:t,l:!1,exports:{}};return n[t].call(l.exports,l,l.exports,c),l.l=!0,l.exports}return c.m=n,c.c=e,c.d=function(n,e,t){c.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:t})},c.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},c.t=function(n,e){if(1&e&&(n=c(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var t=Object.create(null);if(c.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var l in n)c.d(t,l,function(e){return n[e]}.bind(null,l));return t},c.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return c.d(e,"a",e),e},c.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},c.p="",c(c.s=23)}({0:function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"k\", function() { return divideURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"l\", function() { return emptyObject; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"C\", function() { return secondsSinceEpoch; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"i\", function() { return deepClone; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"B\", function() { return removePathFromURL; });\n/* unused harmony export getUserURLFromEmail */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"p\", function() { return getUserEmailFromURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"f\", function() { return convertToUserURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"s\", function() { return isDataObjectURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"u\", function() { return isLegacy; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"v\", function() { return isURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"w\", function() { return isUserURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"t\", function() { return isHypertyURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"o\", function() { return getConfigurationResources; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return buildURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"n\", function() { return generateGUID; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"q\", function() { return getUserIdentityDomain; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"r\", function() { return isBackendServiceURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"j\", function() { return divideEmail; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return assign; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"D\", function() { return splitObjectURL; });\n/* unused harmony export checkAttribute */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"y\", function() { return parseAttributes; });\n/* unused harmony export isEmpty */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"e\", function() { return chatkeysToStringCloner; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"d\", function() { return chatkeysToArrayCloner; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"z\", function() { return parseMessageURL; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return availableSpace; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"m\", function() { return encode; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"g\", function() { return decode; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"h\", function() { return decodeToUint8Array; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"E\", function() { return stringify; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"x\", function() { return parse; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"A\", function() { return parseToUint8Array; });\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Support module with some functions will be useful\r\n * @module utils\r\n */\n\n/**\r\n * @typedef divideURL\r\n * @type Object\r\n * @property {string} type The type of URL\r\n * @property {string} domain The domain of URL\r\n * @property {string} identity The identity of URL\r\n */\n\n/**\r\n * Divide an url in type, domain and identity\r\n * @param {URL.URL} url - url address\r\n * @return {divideURL} the result of divideURL\r\n */\nfunction divideURL(url) {\n function recurse(value) {\n var regex = /([a-zA-Z-]*)(:\\/\\/(?:\\.)?|:)([-a-zA-Z0-9@:%._+~#=]{2,256})([-a-zA-Z0-9@:%._+~#=/]*)/gi;\n var subst = '$1,$3,$4';\n var parts = value.replace(regex, subst).split(',');\n return parts;\n }\n\n var parts = recurse(url); // If the url has no scheme\n\n if (parts[0] === url && !parts[0].includes('@')) {\n var _result = {\n type: '',\n domain: url,\n identity: ''\n };\n console.warn('[DivideURL] DivideURL don\\'t support url without scheme. Please review your url address', url);\n return _result;\n } // check if the url has the scheme and includes an @\n\n\n if (parts[0] === url && parts[0].includes('@')) {\n var scheme = parts[0] === url ? 'smtp' : parts[0];\n parts = recurse(scheme + '://' + parts[0]);\n } // if the domain includes an @, divide it to domain and identity respectively\n\n\n if (parts[1].includes('@')) {\n parts[2] = parts[0] + '://' + parts[1];\n parts[1] = parts[1].substr(parts[1].indexOf('@') + 1);\n }\n /*else if (parts[2].includes('/')) {\r\n parts[2] = parts[2].substr(parts[2].lastIndexOf('/')+1);\r\n }*/\n\n\n var result = {\n type: parts[0],\n domain: parts[1],\n identity: parts[2]\n };\n return result;\n}\n/**\r\n * Check if an Object is empty\r\n * @param {Object} object Object to be checked\r\n * @return {Boolean} status of Object, empty or not (true|false);\r\n */\n\nfunction emptyObject(object) {\n return Object.keys(object).length > 0 ? false : true;\n}\nfunction secondsSinceEpoch() {\n return Math.floor(Date.now() / 1000);\n}\n/**\r\n * Make a COPY of the original data\r\n * @param {Object} obj - object to be cloned\r\n * @return {Object}\r\n */\n\nfunction deepClone(obj) {\n //TODO: simple but inefficient JSON deep clone...\n if (obj) return JSON.parse(JSON.stringify(obj));\n}\nfunction removePathFromURL(url) {\n var splitURL = url.split('/');\n return splitURL[0] + '//' + splitURL[2] + '/' + splitURL[3];\n}\n/**\r\n * Obtains the user URL that corresponds to a given email\r\n * @param {string} userEmail The user email\r\n * @return {URL.URL} userURL The user URL\r\n */\n\nfunction getUserURLFromEmail(userEmail) {\n var indexOfAt = userEmail.indexOf('@');\n return 'user://' + userEmail.substring(indexOfAt + 1, userEmail.length) + '/' + userEmail.substring(0, indexOfAt);\n}\n/**\r\n * Obtains the user email that corresponds to a given URL\r\n * @param {URL.URL} userURL The user URL\r\n * @return {string} userEmail The user email\r\n */\n\nfunction getUserEmailFromURL(userURL) {\n var url = divideURL(userURL);\n return url.identity.replace('/', '') + '@' + url.domain; // identity field has '/exampleID' instead of 'exampleID'\n}\n/**\r\n * Check if the user identifier is already in the URL format, if not, convert to URL format\r\n * @param {string} identifier user identifier\r\n * @return {string} userURL the user URL\r\n */\n\nfunction convertToUserURL(identifier) {\n // check if the identifier is already in the url format\n if (identifier.substring(0, 7) === 'user://') {\n var dividedURL = divideURL(identifier); //check if the url is well formated\n\n if (dividedURL.domain && dividedURL.identity) {\n return identifier;\n } else {\n throw 'userURL with wrong format';\n } //if not, convert the user email to URL format\n\n } else {\n return getUserURLFromEmail(identifier);\n }\n}\nfunction isDataObjectURL(url) {\n var schemasToIgnore = ['domain-idp', 'runtime', 'domain', 'hyperty'];\n var splitURL = url.split('://');\n var urlSchema = splitURL[0];\n return schemasToIgnore.indexOf(urlSchema) === -1;\n}\nfunction isLegacy(url) {\n if (url.split('@').length > 1) {\n return true;\n } else {\n return false;\n }\n}\nfunction isURL(url) {\n return url.split('/').length >= 3;\n}\nfunction isUserURL(url) {\n return divideURL(url).type === 'user';\n}\nfunction isHypertyURL(url) {\n return divideURL(url).type === 'hyperty';\n}\n/**\r\n * get information relative each component configured on runtime configuration;\r\n * @param {object} configuration object with all configuration\r\n * @param {string} component string with the component to get the configuration, like, runtimeURLS, catalogueURLs, msgNodeURL, domainRegistryURL;\r\n * @param {string} resource type of resource to get, like, catalogue, runtimeUA, protocolstub, idpProxy\r\n * @return {object} return an object with all configurations;\r\n */\n\nfunction getConfigurationResources(configuration, component, resource) {\n var objectResource = configuration[component];\n var resourceType = objectResource[resource];\n return resourceType;\n}\n/**\r\n * Build a full url with the runtime configuration;\r\n * @param {object} configuration object with all configuration\r\n * @param {string} component string with the component to get the configuration, like, runtimeURLS, catalogueURLs, msgNodeURL, domainRegistryURL;\r\n * @param {string} resource type of resource to get, like, catalogue, runtimeUA, protocolstub, idpProxy\r\n * @param {string} type resource to get, like a hyperty name or protocolstub name;\r\n * @param {boolean} useFallback if true the function will check if have a fallback url;\r\n * @return {string} partial url to contact the resource;\r\n */\n\nfunction buildURL(configuration, component, resource, type) {\n var useFallback = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var objectResource = configuration[component];\n var url;\n\n if (!objectResource.hasOwnProperty(resource)) {\n throw Error('The configuration ' + JSON.stringify(objectResource, '', 2) + ' don\\'t have the ' + resource + ' resource you are looking for');\n }\n\n var resourceType = objectResource[resource];\n\n if (type) {\n url = resourceType.prefix + configuration.domain + resourceType.suffix + type;\n\n if (resourceType.hasOwnProperty('fallback') && useFallback) {\n if (resourceType.fallback.indexOf('%domain%')) {\n url = resourceType.fallback.replace(/(%domain%)/g, configuration.domain) + type;\n } else {\n url = resourceType.fallback + type;\n }\n }\n } else {\n url = resourceType.prefix + configuration.domain + resourceType.suffix;\n } // console.log(url);\n\n\n return url;\n}\n/**\r\n * Generate a Global Unique ID\r\n *\r\n * @returns String;\r\n */\n\nfunction generateGUID() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n}\nfunction getUserIdentityDomain(url) {\n var dividedURL = divideURL(url);\n var splitedDomain = dividedURL.domain.split('.');\n var splitedLength = splitedDomain.length;\n\n if (splitedLength == 1) {\n return splitedDomain[splitedLength - 1];\n }\n\n var domain = splitedDomain[splitedLength - 2] + '.' + splitedDomain[splitedLength - 1];\n return domain;\n}\n/**\r\n * Check if URL is from a backend service\r\n * @param {string} url URL to be processed\r\n * @return {boolean}\r\n */\n\nfunction isBackendServiceURL(url) {\n var dividedURL = divideURL(url);\n var splitedDomain = dividedURL.domain.split('.');\n var backendSchemes = ['domain', 'global', 'domain-idp']; // should be defined in the runtime configuration\n\n var backendSubDomains = ['registry', 'msg-node']; // should be defined in the runtime configuration\n\n var subDomain;\n\n if (splitedDomain.length > 1) {\n subDomain = splitedDomain.filter(function (item) {\n return backendSubDomains.indexOf(item) !== -1;\n })[0];\n }\n\n if (subDomain && backendSubDomains.indexOf(subDomain) !== -1) {\n return true;\n }\n\n if (dividedURL.type) {\n return backendSchemes.indexOf(dividedURL.type) !== -1;\n }\n\n return false;\n}\nfunction divideEmail(email) {\n var indexOfAt = email.indexOf('@');\n var result = {\n username: email.substring(0, indexOfAt),\n domain: email.substring(indexOfAt + 1, email.length)\n };\n return result;\n}\nfunction assign(obj, keyPath, value) {\n if (!obj) obj = {};\n if (typeof keyPath === 'string') keyPath = parseAttributes(keyPath);\n var lastKeyIndex = keyPath.length - 1;\n\n for (var i = 0; i < lastKeyIndex; ++i) {\n var key = keyPath[i];\n\n if (!(key in obj)) {\n obj[key] = {};\n }\n\n obj = obj[key];\n }\n\n obj[keyPath[lastKeyIndex]] = value;\n}\nfunction splitObjectURL(dataObjectURL) {\n console.info('[utils - splitObjectURL]: ', dataObjectURL);\n var splitedURL = dataObjectURL.split('/');\n var url = splitedURL[0] + '//' + splitedURL[2] + '/' + splitedURL[3];\n var resource = splitedURL[5];\n var result = {\n url: url,\n resource: resource\n };\n console.info('[utils - splitObjectURL]: ', result);\n return result;\n}\nfunction checkAttribute(path) {\n var regex = /((([a-zA-Z]+):\\/\\/([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})\\/[a-zA-Z0-9.]+@[a-zA-Z0-9]+(-)?[a-zA-Z0-9]+(\\.)?[a-zA-Z0-9]{2,10}?\\.[a-zA-Z]{2,10})(.+(?=.identity))?/gm;\n var list = [];\n var final = [];\n var test = path.match(regex);\n\n if (test == null) {\n final = path.split('.');\n } else {\n var m;\n\n while ((m = regex.exec(path)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n } // The result can be accessed through the `m`-variable.\n\n\n m.forEach(function (match, groupIndex) {\n if (groupIndex === 0) {\n list.push(match);\n }\n });\n }\n\n var result;\n list.forEach(function (url) {\n result = path.replace(url, '*-*');\n final = result.split('.').map(function (item) {\n if (item === '*-*') {\n return url;\n }\n\n return item;\n });\n });\n }\n\n console.log('[RuntimeCore.Utils.checkAttribute]', final);\n return final;\n}\nfunction parseAttributes(path) {\n var regex = /([0-9a-zA-Z][-\\w]*):\\/\\//g;\n var string3 = 'identity';\n\n if (!path.includes('://')) {\n return path.split('.');\n } else {\n var string1 = path.split(regex)[0];\n var array1 = string1.split('.');\n var string2 = path.replace(string1, '');\n\n if (path.includes(string3)) {\n var array2 = string2.split(string3 + '.');\n console.log('array2 ' + array2);\n string2 = array2[0].slice('.', -1);\n array2 = array2[1].split('.');\n array1.push(string2, string3);\n array1 = array1.concat(array2);\n } else {\n array1.push(string2);\n }\n\n return array1.filter(Boolean);\n }\n}\nfunction isEmpty(obj) {\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n return false;\n }\n }\n\n return JSON.stringify(obj) === JSON.stringify({});\n}\nfunction chatkeysToStringCloner(sessionKeys) {\n var dataObjectSessionKeysClone = {};\n var fields = Object.keys(sessionKeys);\n\n if (fields) {\n try {\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n dataObjectSessionKeysClone[field] = {};\n dataObjectSessionKeysClone[field].sessionKey = sessionKeys[field].sessionKey.toString();\n dataObjectSessionKeysClone[field].isToEncrypt = sessionKeys[field].isToEncrypt;\n }\n } catch (err) {\n console.error('_chatkeysToStringCloner:err', err);\n }\n }\n\n return dataObjectSessionKeysClone;\n}\nfunction chatkeysToArrayCloner(sessionKeys) {\n var dataObjectSessionKeysClone = {};\n var fields = Object.keys(sessionKeys);\n\n if (fields) {\n try {\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n dataObjectSessionKeysClone[field] = {};\n var arrayValues = JSON.parse('[' + sessionKeys[field].sessionKey + ']');\n dataObjectSessionKeysClone[field].sessionKey = new Uint8Array(arrayValues);\n dataObjectSessionKeysClone[field].isToEncrypt = sessionKeys[field].isToEncrypt;\n }\n } catch (err) {\n console.error('_chatkeysToArrayCloner:err', err);\n }\n }\n\n return dataObjectSessionKeysClone;\n}\nfunction parseMessageURL(URL) {\n var splitedToURL = URL.split('/');\n\n if (splitedToURL.length <= 6) {\n return splitedToURL[0] + '//' + splitedToURL[2] + '/' + splitedToURL[3];\n } else {\n return splitedToURL[0] + '//' + splitedToURL[2] + '/' + splitedToURL[3] + '/' + splitedToURL[4];\n }\n}\nfunction availableSpace(usage, quota) {\n var available = (usage / quota).toFixed(2);\n return {\n quota: quota,\n usage: usage,\n percent: Number(available)\n };\n}\n/**\r\n* Encodes a JS object to base 64 encode\r\n* @param {Object} value byteArray value\r\n* @return {string} encoded value\r\n*/\n\nfunction encode(value) {\n try {\n var stringValue = stringify(value);\n return btoa(stringValue);\n } catch (err) {\n console.error('[Utils.encode:err] ' + err);\n throw err;\n }\n}\n/**\r\n * Decode a base64 string to object\r\n * @param {string_b64} value value encoded in base 64\r\n * @return {Object} decodedValue\r\n */\n\nfunction decode(value) {\n try {\n return JSON.parse(atob(value));\n } catch (err) {\n console.log('[Utils.decode:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Decode a base64 string to Uint8Array\r\n* @param {string_b64} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction decodeToUint8Array(value) {\n try {\n return new Uint8Array(decode(value));\n } catch (err) {\n console.error('[Utils.decodeToUint8Array:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Converts a JS object to string\r\n* NOTE: Special conversion for Uint8Arrays\r\n* @param {Object} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction stringify(value) {\n try {\n var stringValue;\n\n if (value.constructor === Uint8Array) {\n stringValue = '[' + value.toString() + ']'; // the [] is for JSON.parse compatibility\n } else {\n stringValue = JSON.stringify(value);\n }\n\n return stringValue;\n } catch (err) {\n console.error('[Utils.stringify:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Converts a stringified object to object\r\n* @param {String} value byteArray value\r\n* @return {Object} encoded value\r\n*/\n\nfunction parse(value) {\n try {\n return JSON.parse(value);\n } catch (err) {\n console.error('[Utils.parse:err]' + err);\n console.trace();\n console.error('That that cause the error:', value);\n throw err;\n }\n}\n/**\r\n* Converts a stringified object to object\r\n* @param {String} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction parseToUint8Array(value) {\n try {\n return new Uint8Array(parse(value));\n } catch (err) {\n console.error('[Utils.parseToUint8Array:err]' + err);\n throw err;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy91dGlscy91dGlscy5qcz9mYTdkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuLyoqXHJcbiAqIFN1cHBvcnQgbW9kdWxlIHdpdGggc29tZSBmdW5jdGlvbnMgd2lsbCBiZSB1c2VmdWxcclxuICogQG1vZHVsZSB1dGlsc1xyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiBkaXZpZGVVUkxcclxuICogQHR5cGUgT2JqZWN0XHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIFVSTFxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gb2YgVVJMXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZGVudGl0eSBUaGUgaWRlbnRpdHkgb2YgVVJMXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIERpdmlkZSBhbiB1cmwgaW4gdHlwZSwgZG9tYWluIGFuZCBpZGVudGl0eVxyXG4gKiBAcGFyYW0gIHtVUkwuVVJMfSB1cmwgLSB1cmwgYWRkcmVzc1xyXG4gKiBAcmV0dXJuIHtkaXZpZGVVUkx9IHRoZSByZXN1bHQgb2YgZGl2aWRlVVJMXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlVVJMKHVybCkge1xyXG5cclxuICBmdW5jdGlvbiByZWN1cnNlKHZhbHVlKSB7XHJcbiAgICBjb25zdCByZWdleCA9IC8oW2EtekEtWi1dKikoOlxcL1xcLyg/OlxcLik/fDopKFstYS16QS1aMC05QDolLl8rfiM9XXsyLDI1Nn0pKFstYS16QS1aMC05QDolLl8rfiM9L10qKS9naTtcclxuICAgIGNvbnN0IHN1YnN0ID0gJyQxLCQzLCQ0JztcclxuICAgIGxldCBwYXJ0cyA9IHZhbHVlLnJlcGxhY2UocmVnZXgsIHN1YnN0KS5zcGxpdCgnLCcpO1xyXG4gICAgcmV0dXJuIHBhcnRzO1xyXG4gIH1cclxuXHJcbiAgbGV0IHBhcnRzID0gcmVjdXJzZSh1cmwpO1xyXG5cclxuICAvLyBJZiB0aGUgdXJsIGhhcyBubyBzY2hlbWVcclxuICBpZiAocGFydHNbMF0gPT09IHVybCAmJiAhcGFydHNbMF0uaW5jbHVkZXMoJ0AnKSkge1xyXG5cclxuICAgIGxldCByZXN1bHQgPSB7XHJcbiAgICAgIHR5cGU6ICcnLFxyXG4gICAgICBkb21haW46IHVybCxcclxuICAgICAgaWRlbnRpdHk6ICcnXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnNvbGUud2FybignW0RpdmlkZVVSTF0gRGl2aWRlVVJMIGRvblxcJ3Qgc3VwcG9ydCB1cmwgd2l0aG91dCBzY2hlbWUuIFBsZWFzZSByZXZpZXcgeW91ciB1cmwgYWRkcmVzcycsIHVybCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vIGNoZWNrIGlmIHRoZSB1cmwgaGFzIHRoZSBzY2hlbWUgYW5kIGluY2x1ZGVzIGFuIEBcclxuICBpZiAocGFydHNbMF0gPT09IHVybCAmJiBwYXJ0c1swXS5pbmNsdWRlcygnQCcpKSB7XHJcbiAgICBsZXQgc2NoZW1lID0gcGFydHNbMF0gPT09IHVybCA/ICdzbXRwJyA6IHBhcnRzWzBdO1xyXG4gICAgcGFydHMgPSByZWN1cnNlKHNjaGVtZSArICc6Ly8nICsgcGFydHNbMF0pO1xyXG4gIH1cclxuXHJcbiAgLy8gaWYgdGhlIGRvbWFpbiBpbmNsdWRlcyBhbiBALCBkaXZpZGUgaXQgdG8gZG9tYWluIGFuZCBpZGVudGl0eSByZXNwZWN0aXZlbHlcclxuICBpZiAocGFydHNbMV0uaW5jbHVkZXMoJ0AnKSkge1xyXG4gICAgcGFydHNbMl0gPSBwYXJ0c1swXSArICc6Ly8nICsgcGFydHNbMV07XHJcbiAgICBwYXJ0c1sxXSA9IHBhcnRzWzFdLnN1YnN0cihwYXJ0c1sxXS5pbmRleE9mKCdAJykgKyAxKTtcclxuICB9IFx0LyplbHNlIGlmIChwYXJ0c1syXS5pbmNsdWRlcygnLycpKSB7XHJcbiAgICBwYXJ0c1syXSA9IHBhcnRzWzJdLnN1YnN0cihwYXJ0c1syXS5sYXN0SW5kZXhPZignLycpKzEpO1xyXG4gIH0qL1xyXG5cclxuICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgdHlwZTogcGFydHNbMF0sXHJcbiAgICBkb21haW46IHBhcnRzWzFdLFxyXG4gICAgaWRlbnRpdHk6IHBhcnRzWzJdXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBhbiBPYmplY3QgaXMgZW1wdHlcclxuICogQHBhcmFtICB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIGNoZWNrZWRcclxuICogQHJldHVybiB7Qm9vbGVhbn0gICAgICAgc3RhdHVzIG9mIE9iamVjdCwgZW1wdHkgb3Igbm90ICh0cnVlfGZhbHNlKTtcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBlbXB0eU9iamVjdChvYmplY3QpIHtcclxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5sZW5ndGggPiAwID8gZmFsc2UgOiB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2Vjb25kc1NpbmNlRXBvY2goKSB7XHJcbiAgcmV0dXJuIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIE1ha2UgYSBDT1BZIG9mIHRoZSBvcmlnaW5hbCBkYXRhXHJcbiAqIEBwYXJhbSAge09iamVjdH0gIG9iaiAtIG9iamVjdCB0byBiZSBjbG9uZWRcclxuICogQHJldHVybiB7T2JqZWN0fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDbG9uZShvYmopIHtcclxuICAvL1RPRE86IHNpbXBsZSBidXQgaW5lZmZpY2llbnQgSlNPTiBkZWVwIGNsb25lLi4uXHJcbiAgaWYgKG9iaikgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQYXRoRnJvbVVSTCh1cmwpIHtcclxuICBsZXQgc3BsaXRVUkwgPSB1cmwuc3BsaXQoJy8nKTtcclxuICByZXR1cm4gc3BsaXRVUkxbMF0gKyAnLy8nICsgc3BsaXRVUkxbMl0gKyAnLycgKyBzcGxpdFVSTFszXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE9idGFpbnMgdGhlIHVzZXIgVVJMIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBlbWFpbFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVzZXJFbWFpbCBUaGUgdXNlciBlbWFpbFxyXG4gKiBAcmV0dXJuIHtVUkwuVVJMfSB1c2VyVVJMIFRoZSB1c2VyIFVSTFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJVUkxGcm9tRW1haWwodXNlckVtYWlsKSB7XHJcbiAgbGV0IGluZGV4T2ZBdCA9IHVzZXJFbWFpbC5pbmRleE9mKCdAJyk7XHJcbiAgcmV0dXJuICd1c2VyOi8vJyArIHVzZXJFbWFpbC5zdWJzdHJpbmcoaW5kZXhPZkF0ICsgMSwgdXNlckVtYWlsLmxlbmd0aCkgKyAnLycgKyB1c2VyRW1haWwuc3Vic3RyaW5nKDAsIGluZGV4T2ZBdCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPYnRhaW5zIHRoZSB1c2VyIGVtYWlsIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBVUkxcclxuICogQHBhcmFtICB7VVJMLlVSTH0gdXNlclVSTCBUaGUgdXNlciBVUkxcclxuICogQHJldHVybiB7c3RyaW5nfSB1c2VyRW1haWwgVGhlIHVzZXIgZW1haWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VyRW1haWxGcm9tVVJMKHVzZXJVUkwpIHtcclxuICBsZXQgdXJsID0gZGl2aWRlVVJMKHVzZXJVUkwpO1xyXG4gIHJldHVybiB1cmwuaWRlbnRpdHkucmVwbGFjZSgnLycsICcnKSArICdAJyArIHVybC5kb21haW47IC8vIGlkZW50aXR5IGZpZWxkIGhhcyAnL2V4YW1wbGVJRCcgaW5zdGVhZCBvZiAnZXhhbXBsZUlEJ1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhlIHVzZXIgaWRlbnRpZmllciBpcyBhbHJlYWR5IGluIHRoZSBVUkwgZm9ybWF0LCBpZiBub3QsIGNvbnZlcnQgdG8gVVJMIGZvcm1hdFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgaWRlbnRpZmllciAgdXNlciBpZGVudGlmaWVyXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gICB1c2VyVVJMICAgIHRoZSB1c2VyIFVSTFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1VzZXJVUkwoaWRlbnRpZmllcikge1xyXG5cclxuICAvLyBjaGVjayBpZiB0aGUgaWRlbnRpZmllciBpcyBhbHJlYWR5IGluIHRoZSB1cmwgZm9ybWF0XHJcbiAgaWYgKGlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIDcpID09PSAndXNlcjovLycpIHtcclxuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKGlkZW50aWZpZXIpO1xyXG5cclxuICAgIC8vY2hlY2sgaWYgdGhlIHVybCBpcyB3ZWxsIGZvcm1hdGVkXHJcbiAgICBpZiAoZGl2aWRlZFVSTC5kb21haW4gJiYgZGl2aWRlZFVSTC5pZGVudGl0eSkge1xyXG4gICAgICByZXR1cm4gaWRlbnRpZmllcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93ICd1c2VyVVJMIHdpdGggd3JvbmcgZm9ybWF0JztcclxuICAgIH1cclxuXHJcbiAgLy9pZiBub3QsIGNvbnZlcnQgdGhlIHVzZXIgZW1haWwgdG8gVVJMIGZvcm1hdFxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZ2V0VXNlclVSTEZyb21FbWFpbChpZGVudGlmaWVyKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFPYmplY3RVUkwodXJsKSB7XHJcbiAgbGV0IHNjaGVtYXNUb0lnbm9yZSA9IFsnZG9tYWluLWlkcCcsICdydW50aW1lJywgJ2RvbWFpbicsICdoeXBlcnR5J107XHJcbiAgbGV0IHNwbGl0VVJMID0gKHVybCkuc3BsaXQoJzovLycpO1xyXG4gIGxldCB1cmxTY2hlbWEgPSBzcGxpdFVSTFswXTtcclxuXHJcbiAgcmV0dXJuIHNjaGVtYXNUb0lnbm9yZS5pbmRleE9mKHVybFNjaGVtYSkgPT09IC0xO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNMZWdhY3kodXJsKSB7XHJcbiAgaWYgKHVybC5zcGxpdCgnQCcpLmxlbmd0aCA+IDEpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNVUkwodXJsKSB7XHJcbiAgcmV0dXJuICh1cmwpLnNwbGl0KCcvJykubGVuZ3RoID49IDM7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1VzZXJVUkwodXJsKSB7XHJcbiAgcmV0dXJuIGRpdmlkZVVSTCh1cmwpLnR5cGUgPT09ICd1c2VyJztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSHlwZXJ0eVVSTCh1cmwpIHtcclxuICByZXR1cm4gZGl2aWRlVVJMKHVybCkudHlwZSA9PT0gJ2h5cGVydHknO1xyXG59XHJcblxyXG4vKipcclxuICogZ2V0IGluZm9ybWF0aW9uIHJlbGF0aXZlIGVhY2ggY29tcG9uZW50IGNvbmZpZ3VyZWQgb24gcnVudGltZSBjb25maWd1cmF0aW9uO1xyXG4gKiBAcGFyYW0gIHtvYmplY3R9IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggYWxsIGNvbmZpZ3VyYXRpb25cclxuICogQHBhcmFtICB7c3RyaW5nfSBjb21wb25lbnQgICAgIHN0cmluZyB3aXRoIHRoZSBjb21wb25lbnQgdG8gZ2V0IHRoZSBjb25maWd1cmF0aW9uLCBsaWtlLCBydW50aW1lVVJMUywgY2F0YWxvZ3VlVVJMcywgbXNnTm9kZVVSTCwgZG9tYWluUmVnaXN0cnlVUkw7XHJcbiAqIEBwYXJhbSAge3N0cmluZ30gcmVzb3VyY2UgICAgICB0eXBlIG9mIHJlc291cmNlIHRvIGdldCwgbGlrZSwgY2F0YWxvZ3VlLCBydW50aW1lVUEsIHByb3RvY29sc3R1YiwgaWRwUHJveHlcclxuICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAgICAgIHJldHVybiBhbiBvYmplY3Qgd2l0aCBhbGwgY29uZmlndXJhdGlvbnM7XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlndXJhdGlvblJlc291cmNlcyhjb25maWd1cmF0aW9uLCBjb21wb25lbnQsIHJlc291cmNlKSB7XHJcbiAgbGV0IG9iamVjdFJlc291cmNlID0gY29uZmlndXJhdGlvbltjb21wb25lbnRdO1xyXG4gIGxldCByZXNvdXJjZVR5cGUgPSBvYmplY3RSZXNvdXJjZVtyZXNvdXJjZV07XHJcblxyXG4gIHJldHVybiByZXNvdXJjZVR5cGU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZCBhIGZ1bGwgdXJsIHdpdGggdGhlIHJ1bnRpbWUgY29uZmlndXJhdGlvbjtcclxuICogQHBhcmFtICB7b2JqZWN0fSBjb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIGFsbCBjb25maWd1cmF0aW9uXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gY29tcG9uZW50ICAgICBzdHJpbmcgd2l0aCB0aGUgY29tcG9uZW50IHRvIGdldCB0aGUgY29uZmlndXJhdGlvbiwgbGlrZSwgcnVudGltZVVSTFMsIGNhdGFsb2d1ZVVSTHMsIG1zZ05vZGVVUkwsIGRvbWFpblJlZ2lzdHJ5VVJMO1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHJlc291cmNlICAgICAgdHlwZSBvZiByZXNvdXJjZSB0byBnZXQsIGxpa2UsIGNhdGFsb2d1ZSwgcnVudGltZVVBLCBwcm90b2NvbHN0dWIsIGlkcFByb3h5XHJcbiAqIEBwYXJhbSAge3N0cmluZ30gdHlwZSAgICAgICAgICByZXNvdXJjZSB0byBnZXQsIGxpa2UgYSBoeXBlcnR5IG5hbWUgb3IgcHJvdG9jb2xzdHViIG5hbWU7XHJcbiAqIEBwYXJhbSAge2Jvb2xlYW59IHVzZUZhbGxiYWNrICBpZiB0cnVlIHRoZSBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIGhhdmUgYSBmYWxsYmFjayB1cmw7XHJcbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICBwYXJ0aWFsIHVybCB0byBjb250YWN0IHRoZSByZXNvdXJjZTtcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZFVSTChjb25maWd1cmF0aW9uLCBjb21wb25lbnQsIHJlc291cmNlLCB0eXBlLCB1c2VGYWxsYmFjayA9IGZhbHNlKSB7XHJcbiAgbGV0IG9iamVjdFJlc291cmNlID0gY29uZmlndXJhdGlvbltjb21wb25lbnRdO1xyXG4gIGxldCB1cmw7XHJcblxyXG4gIGlmICghb2JqZWN0UmVzb3VyY2UuaGFzT3duUHJvcGVydHkocmVzb3VyY2UpKSB7XHJcbiAgICB0aHJvdyBFcnJvcignVGhlIGNvbmZpZ3VyYXRpb24gJyArIEpTT04uc3RyaW5naWZ5KG9iamVjdFJlc291cmNlLCAnJywgMikgKyAnIGRvblxcJ3QgaGF2ZSB0aGUgJyArIHJlc291cmNlICsgJyByZXNvdXJjZSB5b3UgYXJlIGxvb2tpbmcgZm9yJyk7XHJcbiAgfVxyXG5cclxuICBsZXQgcmVzb3VyY2VUeXBlID0gb2JqZWN0UmVzb3VyY2VbcmVzb3VyY2VdO1xyXG5cclxuICBpZiAodHlwZSkge1xyXG4gICAgdXJsID0gcmVzb3VyY2VUeXBlLnByZWZpeCArIGNvbmZpZ3VyYXRpb24uZG9tYWluICsgcmVzb3VyY2VUeXBlLnN1ZmZpeCArIHR5cGU7XHJcbiAgICBpZiAocmVzb3VyY2VUeXBlLmhhc093blByb3BlcnR5KCdmYWxsYmFjaycpICYmIHVzZUZhbGxiYWNrKSB7XHJcbiAgICAgIGlmIChyZXNvdXJjZVR5cGUuZmFsbGJhY2suaW5kZXhPZignJWRvbWFpbiUnKSkge1xyXG4gICAgICAgIHVybCA9IHJlc291cmNlVHlwZS5mYWxsYmFjay5yZXBsYWNlKC8oJWRvbWFpbiUpL2csIGNvbmZpZ3VyYXRpb24uZG9tYWluKSArIHR5cGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXJsID0gcmVzb3VyY2VUeXBlLmZhbGxiYWNrICsgdHlwZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICB1cmwgPSByZXNvdXJjZVR5cGUucHJlZml4ICsgY29uZmlndXJhdGlvbi5kb21haW4gKyByZXNvdXJjZVR5cGUuc3VmZml4O1xyXG4gIH1cclxuXHJcbiAgLy8gY29uc29sZS5sb2codXJsKTtcclxuXHJcbiAgcmV0dXJuIHVybDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIGEgR2xvYmFsIFVuaXF1ZSBJRFxyXG4gKlxyXG4gKiBAcmV0dXJucyBTdHJpbmc7XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVHVUlEKCkge1xyXG5cclxuICBmdW5jdGlvbiBzNCgpIHtcclxuICAgIHJldHVybiBNYXRoLmZsb29yKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKVxyXG4gICAgICAudG9TdHJpbmcoMTYpXHJcbiAgICAgIC5zdWJzdHJpbmcoMSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gczQoKSArIHM0KCkgKyAnLScgKyBzNCgpICsgJy0nICsgczQoKSArICctJyArIHM0KCkgKyAnLScgKyBzNCgpICsgczQoKSArIHM0KCk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlcklkZW50aXR5RG9tYWluKHVybCkge1xyXG4gIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKHVybCk7XHJcbiAgbGV0IHNwbGl0ZWREb21haW4gPSBkaXZpZGVkVVJMLmRvbWFpbi5zcGxpdCgnLicpO1xyXG4gIGxldCBzcGxpdGVkTGVuZ3RoID0gc3BsaXRlZERvbWFpbi5sZW5ndGg7XHJcbiAgaWYgKHNwbGl0ZWRMZW5ndGggPT0gMSkge1xyXG4gICAgcmV0dXJuIHNwbGl0ZWREb21haW5bc3BsaXRlZExlbmd0aCAtIDFdO1xyXG4gIH1cclxuICBsZXQgZG9tYWluID0gc3BsaXRlZERvbWFpbltzcGxpdGVkTGVuZ3RoIC0gMl0gKyAnLicgKyBzcGxpdGVkRG9tYWluW3NwbGl0ZWRMZW5ndGggLSAxXTtcclxuICByZXR1cm4gZG9tYWluO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgVVJMIGlzIGZyb20gYSBiYWNrZW5kIHNlcnZpY2VcclxuICogQHBhcmFtICB7c3RyaW5nfSB1cmwgICAgIFVSTCB0byBiZSBwcm9jZXNzZWRcclxuICogQHJldHVybiB7Ym9vbGVhbn1cclxuICovXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNCYWNrZW5kU2VydmljZVVSTCh1cmwpIHtcclxuICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTCh1cmwpO1xyXG4gIGxldCBzcGxpdGVkRG9tYWluID0gZGl2aWRlZFVSTC5kb21haW4uc3BsaXQoJy4nKTtcclxuICBsZXQgYmFja2VuZFNjaGVtZXMgPSBbJ2RvbWFpbicsICdnbG9iYWwnLCAnZG9tYWluLWlkcCddOyAvLyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uXHJcbiAgbGV0IGJhY2tlbmRTdWJEb21haW5zID0gWydyZWdpc3RyeScsICdtc2ctbm9kZSddOyAvLyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uXHJcbiAgbGV0IHN1YkRvbWFpbjtcclxuXHJcbiAgaWYgKHNwbGl0ZWREb21haW4ubGVuZ3RoID4gMSkge1xyXG4gICAgc3ViRG9tYWluID0gc3BsaXRlZERvbWFpbi5maWx0ZXIoaXRlbSA9PiBiYWNrZW5kU3ViRG9tYWlucy5pbmRleE9mKGl0ZW0pICE9PSAtMSlbMF07XHJcbiAgfVxyXG5cclxuICBpZiAoc3ViRG9tYWluICYmIGJhY2tlbmRTdWJEb21haW5zLmluZGV4T2Yoc3ViRG9tYWluKSAhPT0gLTEpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgaWYgKGRpdmlkZWRVUkwudHlwZSkge1xyXG4gICAgcmV0dXJuIChiYWNrZW5kU2NoZW1lcy5pbmRleE9mKGRpdmlkZWRVUkwudHlwZSkgIT09IC0xKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZUVtYWlsKGVtYWlsKSB7XHJcbiAgbGV0IGluZGV4T2ZBdCA9IGVtYWlsLmluZGV4T2YoJ0AnKTtcclxuXHJcbiAgbGV0IHJlc3VsdCA9IHtcclxuICAgIHVzZXJuYW1lOiBlbWFpbC5zdWJzdHJpbmcoMCwgaW5kZXhPZkF0KSxcclxuICAgIGRvbWFpbjogZW1haWwuc3Vic3RyaW5nKGluZGV4T2ZBdCArIDEsIGVtYWlsLmxlbmd0aClcclxuICB9O1xyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbihvYmosIGtleVBhdGgsIHZhbHVlKSB7XHJcblxyXG4gIGlmICghb2JqKSBvYmogPSB7fTtcclxuICBpZiAodHlwZW9mKGtleVBhdGgpID09PSAnc3RyaW5nJykga2V5UGF0aCA9IHBhcnNlQXR0cmlidXRlcyhrZXlQYXRoKTtcclxuXHJcbiAgbGV0IGxhc3RLZXlJbmRleCA9IGtleVBhdGgubGVuZ3RoIC0gMTtcclxuXHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0S2V5SW5kZXg7ICsraSkge1xyXG4gICAgbGV0IGtleSA9IGtleVBhdGhbaV07XHJcbiAgICBpZiAoIShrZXkgaW4gb2JqKSkge1xyXG4gICAgICBvYmpba2V5XSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIG9iaiA9IG9ialtrZXldO1xyXG5cclxuICB9XHJcblxyXG4gIG9ialtrZXlQYXRoW2xhc3RLZXlJbmRleF1dID0gdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdE9iamVjdFVSTChkYXRhT2JqZWN0VVJMKSB7XHJcbiAgY29uc29sZS5pbmZvKCdbdXRpbHMgLSBzcGxpdE9iamVjdFVSTF06ICcsIGRhdGFPYmplY3RVUkwpO1xyXG5cclxuICBsZXQgc3BsaXRlZFVSTCA9IGRhdGFPYmplY3RVUkwuc3BsaXQoJy8nKTtcclxuICBsZXQgdXJsID0gc3BsaXRlZFVSTFswXSArICcvLycgKyBzcGxpdGVkVVJMWzJdICsgJy8nICsgc3BsaXRlZFVSTFszXTtcclxuICBsZXQgcmVzb3VyY2UgPSBzcGxpdGVkVVJMWzVdO1xyXG5cclxuICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgdXJsOiB1cmwsXHJcbiAgICByZXNvdXJjZTogcmVzb3VyY2VcclxuICB9O1xyXG5cclxuICBjb25zb2xlLmluZm8oJ1t1dGlscyAtIHNwbGl0T2JqZWN0VVJMXTogJywgcmVzdWx0KTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQXR0cmlidXRlKHBhdGgpIHtcclxuXHJcbiAgbGV0IHJlZ2V4ID0gLygoKFthLXpBLVpdKyk6XFwvXFwvKFswLTlhLXpBLVpdWy1cXHddKlswLTlhLXpBLVpdXFwuKStbYS16QS1aXXsyLDl9KVxcL1thLXpBLVowLTkuXStAW2EtekEtWjAtOV0rKC0pP1thLXpBLVowLTldKyhcXC4pP1thLXpBLVowLTldezIsMTB9P1xcLlthLXpBLVpdezIsMTB9KSguKyg/PS5pZGVudGl0eSkpPy9nbTtcclxuXHJcbiAgbGV0IGxpc3QgPSBbXTtcclxuICBsZXQgZmluYWwgPSBbXTtcclxuICBsZXQgdGVzdCA9IHBhdGgubWF0Y2gocmVnZXgpO1xyXG5cclxuICBpZiAodGVzdCA9PSBudWxsKSB7XHJcbiAgICBmaW5hbCA9IHBhdGguc3BsaXQoJy4nKTtcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IG07XHJcbiAgICB3aGlsZSAoKG0gPSByZWdleC5leGVjKHBhdGgpKSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBpbmZpbml0ZSBsb29wcyB3aXRoIHplcm8td2lkdGggbWF0Y2hlc1xyXG4gICAgICBpZiAobS5pbmRleCA9PT0gcmVnZXgubGFzdEluZGV4KSB7XHJcbiAgICAgICAgcmVnZXgubGFzdEluZGV4Kys7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRoZSByZXN1bHQgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGBtYC12YXJpYWJsZS5cclxuICAgICAgbS5mb3JFYWNoKChtYXRjaCwgZ3JvdXBJbmRleCkgPT4ge1xyXG4gICAgICAgIGlmIChncm91cEluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICBsaXN0LnB1c2gobWF0Y2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzdWx0O1xyXG4gICAgbGlzdC5mb3JFYWNoKCh1cmwpID0+IHtcclxuXHJcbiAgICAgIHJlc3VsdCA9IHBhdGgucmVwbGFjZSh1cmwsICcqLSonKTtcclxuICAgICAgZmluYWwgPSByZXN1bHQuc3BsaXQoJy4nKS5tYXAoKGl0ZW0pID0+IHtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0gPT09ICcqLSonKSB7IHJldHVybiB1cmw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zb2xlLmxvZygnW1J1bnRpbWVDb3JlLlV0aWxzLmNoZWNrQXR0cmlidXRlXScsIGZpbmFsKTtcclxuICByZXR1cm4gZmluYWw7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMocGF0aCkge1xyXG4gIGxldCByZWdleCA9IC8oWzAtOWEtekEtWl1bLVxcd10qKTpcXC9cXC8vZztcclxuXHJcbiAgbGV0IHN0cmluZzMgPSAnaWRlbnRpdHknO1xyXG5cclxuICBpZiAoIXBhdGguaW5jbHVkZXMoJzovLycpKSB7XHJcbiAgICByZXR1cm4gKHBhdGguc3BsaXQoJy4nKSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCBzdHJpbmcxID0gcGF0aC5zcGxpdChyZWdleClbMF07XHJcblxyXG4gICAgbGV0IGFycmF5MSA9IHN0cmluZzEuc3BsaXQoJy4nKTtcclxuXHJcbiAgICBsZXQgc3RyaW5nMiA9IHBhdGgucmVwbGFjZShzdHJpbmcxLCAnJyk7XHJcblxyXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoc3RyaW5nMykpIHtcclxuXHJcbiAgICAgIGxldCBhcnJheTIgPSBzdHJpbmcyLnNwbGl0KHN0cmluZzMgKyAnLicpO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coJ2FycmF5MiAnICsgYXJyYXkyKTtcclxuXHJcbiAgICAgIHN0cmluZzIgPSBhcnJheTJbMF0uc2xpY2UoJy4nLCAtMSk7XHJcblxyXG4gICAgICBhcnJheTIgPSBhcnJheTJbMV0uc3BsaXQoJy4nKTtcclxuXHJcbiAgICAgIGFycmF5MS5wdXNoKHN0cmluZzIsIHN0cmluZzMpO1xyXG5cclxuICAgICAgYXJyYXkxID0gYXJyYXkxLmNvbmNhdChhcnJheTIpO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFycmF5MS5wdXNoKHN0cmluZzIpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGFycmF5MS5maWx0ZXIoQm9vbGVhbikpO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcclxuICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xyXG5cclxuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopID09PSBKU09OLnN0cmluZ2lmeSh7fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGF0a2V5c1RvU3RyaW5nQ2xvbmVyKHNlc3Npb25LZXlzKSB7XHJcbiAgbGV0IGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lID0ge307XHJcbiAgbGV0IGZpZWxkcyA9IE9iamVjdC5rZXlzKHNlc3Npb25LZXlzKTtcclxuICBpZiAoZmllbGRzKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHNbaV07XHJcbiAgICAgICAgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmVbZmllbGRdID0ge307XHJcbiAgICAgICAgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmVbZmllbGRdLnNlc3Npb25LZXkgPSBzZXNzaW9uS2V5c1tmaWVsZF0uc2Vzc2lvbktleS50b1N0cmluZygpO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXS5pc1RvRW5jcnlwdCA9IHNlc3Npb25LZXlzW2ZpZWxkXS5pc1RvRW5jcnlwdDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ19jaGF0a2V5c1RvU3RyaW5nQ2xvbmVyOmVycicsIGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoYXRrZXlzVG9BcnJheUNsb25lcihzZXNzaW9uS2V5cykge1xyXG4gIGxldCBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZSA9IHt9O1xyXG4gIGxldCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzZXNzaW9uS2V5cyk7XHJcbiAgaWYgKGZpZWxkcykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAgZmllbGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW2ldO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXSA9IHt9O1xyXG4gICAgICAgIGxldCBhcnJheVZhbHVlcyA9IEpTT04ucGFyc2UoJ1snICsgc2Vzc2lvbktleXNbZmllbGRdLnNlc3Npb25LZXkgKyAnXScpO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXS5zZXNzaW9uS2V5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlWYWx1ZXMpO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXS5pc1RvRW5jcnlwdCA9IHNlc3Npb25LZXlzW2ZpZWxkXS5pc1RvRW5jcnlwdDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ19jaGF0a2V5c1RvQXJyYXlDbG9uZXI6ZXJyJywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNZXNzYWdlVVJMKFVSTCkge1xyXG4gIGxldCBzcGxpdGVkVG9VUkwgPSBVUkwuc3BsaXQoJy8nKTtcclxuICBpZiAoc3BsaXRlZFRvVVJMLmxlbmd0aCA8PSA2KSB7XHJcbiAgICByZXR1cm4gc3BsaXRlZFRvVVJMWzBdICsgJy8vJyArIHNwbGl0ZWRUb1VSTFsyXSArICcvJyArIHNwbGl0ZWRUb1VSTFszXTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHNwbGl0ZWRUb1VSTFswXSArICcvLycgKyBzcGxpdGVkVG9VUkxbMl0gKyAnLycgKyBzcGxpdGVkVG9VUkxbM10gKyAnLycgKyBzcGxpdGVkVG9VUkxbNF07XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXZhaWxhYmxlU3BhY2UodXNhZ2UsIHF1b3RhKSB7XHJcbiAgY29uc3QgYXZhaWxhYmxlID0gKHVzYWdlIC8gcXVvdGEpLnRvRml4ZWQoMik7XHJcbiAgcmV0dXJuIHtcclxuICAgIHF1b3RhOiBxdW90YSxcclxuICAgIHVzYWdlOiB1c2FnZSxcclxuICAgIHBlcmNlbnQ6IE51bWJlcihhdmFpbGFibGUpXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiogRW5jb2RlcyBhIEpTIG9iamVjdCB0byBiYXNlIDY0IGVuY29kZVxyXG4qIEBwYXJhbSAgIHtPYmplY3R9ICAgIHZhbHVlICAgIGJ5dGVBcnJheSB2YWx1ZVxyXG4qIEByZXR1cm4gIHtzdHJpbmd9ICAgZW5jb2RlZCB2YWx1ZVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIGxldCBzdHJpbmdWYWx1ZSA9IHN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICByZXR1cm4gYnRvYShzdHJpbmdWYWx1ZSk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMuZW5jb2RlOmVycl0gJyArIGVycik7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICAqIERlY29kZSBhIGJhc2U2NCBzdHJpbmcgdG8gb2JqZWN0XHJcbiAgKiBAcGFyYW0gICB7c3RyaW5nX2I2NH0gICAgdmFsdWUgICAgdmFsdWUgZW5jb2RlZCBpbiBiYXNlIDY0XHJcbiAgKiBAcmV0dXJuICB7T2JqZWN0fSBkZWNvZGVkVmFsdWVcclxuICAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKGF0b2IodmFsdWUpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUubG9nKCdbVXRpbHMuZGVjb2RlOmVycl0gJyArIGVycik7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIHRvIFVpbnQ4QXJyYXlcclxuKiBAcGFyYW0gICB7c3RyaW5nX2I2NH0gICAgdmFsdWUgICAgYnl0ZUFycmF5IHZhbHVlXHJcbiogQHJldHVybiAge1VpbnQ4QXJyYXl9ICAgZW5jb2RlZCB2YWx1ZVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVG9VaW50OEFycmF5KHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWNvZGUodmFsdWUpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ1tVdGlscy5kZWNvZGVUb1VpbnQ4QXJyYXk6ZXJyXSAnICsgZXJyKTtcclxuICAgIHRocm93IGVycjtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4qIENvbnZlcnRzIGEgSlMgb2JqZWN0IHRvIHN0cmluZ1xyXG4qIE5PVEU6IFNwZWNpYWwgY29udmVyc2lvbiBmb3IgVWludDhBcnJheXNcclxuKiBAcGFyYW0gICB7T2JqZWN0fSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcclxuKiBAcmV0dXJuICB7VWludDhBcnJheX0gICBlbmNvZGVkIHZhbHVlXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUpIHtcclxuICB0cnkge1xyXG4gICAgbGV0IHN0cmluZ1ZhbHVlO1xyXG4gICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBVaW50OEFycmF5KSB7XHJcbiAgICAgIHN0cmluZ1ZhbHVlID0gJ1snICsgdmFsdWUudG9TdHJpbmcoKSArICddJzsgLy8gdGhlIFtdIGlzIGZvciBKU09OLnBhcnNlIGNvbXBhdGliaWxpdHlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0cmluZ1ZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY29uc29sZS5lcnJvcignW1V0aWxzLnN0cmluZ2lmeTplcnJdICcgKyBlcnIpO1xyXG4gICAgdGhyb3cgZXJyO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiogQ29udmVydHMgYSBzdHJpbmdpZmllZCBvYmplY3QgdG8gb2JqZWN0XHJcbiogQHBhcmFtICAge1N0cmluZ30gICAgdmFsdWUgICAgYnl0ZUFycmF5IHZhbHVlXHJcbiogQHJldHVybiAge09iamVjdH0gICBlbmNvZGVkIHZhbHVlXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZSh2YWx1ZSkge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMucGFyc2U6ZXJyXScgKyBlcnIpO1xyXG4gICAgY29uc29sZS50cmFjZSgpO1xyXG4gICAgY29uc29sZS5lcnJvcignVGhhdCB0aGF0IGNhdXNlIHRoZSBlcnJvcjonLCB2YWx1ZSk7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuKiBDb252ZXJ0cyBhIHN0cmluZ2lmaWVkIG9iamVjdCB0byBvYmplY3RcclxuKiBAcGFyYW0gICB7U3RyaW5nfSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcclxuKiBAcmV0dXJuICB7VWludDhBcnJheX0gICBlbmNvZGVkIHZhbHVlXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRvVWludDhBcnJheSh2YWx1ZSkge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocGFyc2UodmFsdWUpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ1tVdGlscy5wYXJzZVRvVWludDhBcnJheTplcnJdJyArIGVycik7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7Ozs7O0FBS0E7Ozs7Ozs7O0FBUUE7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFFQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQVNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///0\n")},1:function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n "use strict";\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(this, function () {\n "use strict";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = "undefined";\n\n var logMethods = [\n "trace",\n "debug",\n "info",\n "warn",\n "error"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === \'function\') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === \'debug\') {\n methodName = \'log\';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, \'log\');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn\'t present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n var storageKey = "loglevel";\n if (name) {\n storageKey += ":" + name;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || \'silent\').toUpperCase();\n\n if (typeof window === undefinedType) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + "=" + levelName + ";";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + "=");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3,\n "ERROR": 4, "SILENT": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return "No console available for logging";\n }\n } else {\n throw "log.setLevel() called with invalid level: " + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel == null ? "WARN" : defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== "string" || name === "") {\n throw new TypeError("You must supply a name when creating a logger.");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n return defaultLogger;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanM/NWM3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGVbbWV0aG9kTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgJ2xvZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGVzZSBwcml2YXRlIGZ1bmN0aW9ucyBhbHdheXMgbmVlZCBgdGhpc2AgdG8gYmUgc2V0IHByb3Blcmx5XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlTG9nZ2luZ01ldGhvZHMobGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2dNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IGxvZ01ldGhvZHNbaV07XG4gICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdID0gKGkgPCBsZXZlbCkgP1xuICAgICAgICAgICAgICAgIG5vb3AgOlxuICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgbG9nLmxvZyBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcbiAgICB9XG5cbiAgICAvLyBJbiBvbGQgSUUgdmVyc2lvbnMsIHRoZSBjb25zb2xlIGlzbid0IHByZXNlbnQgdW50aWwgeW91IGZpcnN0IG9wZW4gaXQuXG4gICAgLy8gV2UgYnVpbGQgcmVhbE1ldGhvZCgpIHJlcGxhY2VtZW50cyBoZXJlIHRoYXQgcmVnZW5lcmF0ZSBsb2dnaW5nIG1ldGhvZHNcbiAgICBmdW5jdGlvbiBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzKG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbCh0aGlzLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHVzZSBjbG9zZWx5IGJvdW5kIHJlYWwgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZSwgYW5kXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIGEgY29uc29sZSB0byBhcHBlYXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICBmdW5jdGlvbiBkZWZhdWx0TWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICByZXR1cm4gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB8fFxuICAgICAgICAgICAgICAgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvZ2dlcihuYW1lLCBkZWZhdWx0TGV2ZWwsIGZhY3RvcnkpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBjdXJyZW50TGV2ZWw7XG4gICAgICB2YXIgc3RvcmFnZUtleSA9IFwibG9nbGV2ZWxcIjtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICpcbiAgICAgICAqIFB1YmxpYyBsb2dnZXIgQVBJIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbCBmb3IgZGV0YWlsc1xuICAgICAgICpcbiAgICAgICAqL1xuXG4gICAgICBzZWxmLm5hbWUgPSBuYW1lO1xuXG4gICAgICBzZWxmLmxldmVscyA9IHsgXCJUUkFDRVwiOiAwLCBcIkRFQlVHXCI6IDEsIFwiSU5GT1wiOiAyLCBcIldBUk5cIjogMyxcbiAgICAgICAgICBcIkVSUk9SXCI6IDQsIFwiU0lMRU5UXCI6IDV9O1xuXG4gICAgICBzZWxmLm1ldGhvZEZhY3RvcnkgPSBmYWN0b3J5IHx8IGRlZmF1bHRNZXRob2RGYWN0b3J5O1xuXG4gICAgICBzZWxmLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50TGV2ZWw7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsLCBwZXJzaXN0KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gXCJzdHJpbmdcIiAmJiBzZWxmLmxldmVsc1tsZXZlbC50b1VwcGVyQ2FzZSgpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGxldmVsID0gc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwibnVtYmVyXCIgJiYgbGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgY3VycmVudExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgICAgIGlmIChwZXJzaXN0ICE9PSBmYWxzZSkgeyAgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgcGVyc2lzdExldmVsSWZQb3NzaWJsZShsZXZlbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZiwgbGV2ZWwsIG5hbWUpO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUgJiYgbGV2ZWwgPCBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIk5vIGNvbnNvbGUgYXZhaWxhYmxlIGZvciBsb2dnaW5nXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgbGV2ZWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXREZWZhdWx0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgICBpZiAoIWdldFBlcnNpc3RlZExldmVsKCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZW5hYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuVFJBQ0UsIHBlcnNpc3QpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5kaXNhYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuU0lMRU5ULCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEluaXRpYWxpemUgd2l0aCB0aGUgcmlnaHQgbGV2ZWxcbiAgICAgIHZhciBpbml0aWFsTGV2ZWwgPSBnZXRQZXJzaXN0ZWRMZXZlbCgpO1xuICAgICAgaWYgKGluaXRpYWxMZXZlbCA9PSBudWxsKSB7XG4gICAgICAgICAgaW5pdGlhbExldmVsID0gZGVmYXVsdExldmVsID09IG51bGwgPyBcIldBUk5cIiA6IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhIG5hbWUgd2hlbiBjcmVhdGluZyBhIGxvZ2dlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV07XG4gICAgICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgICAgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV0gPSBuZXcgTG9nZ2VyKFxuICAgICAgICAgICAgbmFtZSwgZGVmYXVsdExvZ2dlci5nZXRMZXZlbCgpLCBkZWZhdWx0TG9nZ2VyLm1ldGhvZEZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dnZXI7XG4gICAgfTtcblxuICAgIC8vIEdyYWIgdGhlIGN1cnJlbnQgZ2xvYmFsIGxvZyB2YXJpYWJsZSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuICAgIHZhciBfbG9nID0gKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUpID8gd2luZG93LmxvZyA6IHVuZGVmaW5lZDtcbiAgICBkZWZhdWx0TG9nZ2VyLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUgJiZcbiAgICAgICAgICAgICAgIHdpbmRvdy5sb2cgPT09IGRlZmF1bHRMb2dnZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2cgPSBfbG9nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG4gICAgfTtcblxuICAgIGRlZmF1bHRMb2dnZXIuZ2V0TG9nZ2VycyA9IGZ1bmN0aW9uIGdldExvZ2dlcnMoKSB7XG4gICAgICAgIHJldHVybiBfbG9nZ2Vyc0J5TmFtZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxhQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n')},15:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\r\n*/\nvar AllowOverrides =\n/*#__PURE__*/\nfunction () {\n function AllowOverrides() {\n _classCallCheck(this, AllowOverrides);\n }\n\n _createClass(AllowOverrides, [{\n key: "combine",\n\n /**\r\n * Given an array of individual authorization decisions, prioritizes a positive one.\r\n * @param {boolean[]} decisions\r\n * @returns {boolean}\r\n */\n value: function combine(decisions) {\n if (decisions.indexOf(true) !== -1) {\n return true;\n } else {\n if (decisions.indexOf(false) !== -1) {\n return false;\n } else {\n return \'Not Applicable\';\n }\n }\n }\n }]);\n\n return AllowOverrides;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (AllowOverrides);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvQWxsb3dPdmVycmlkZXMuanM/MGQxNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuKiBAYXV0aG9yIEFuYSBDYWxkZWlyYSA8YW5hLmNhbGRlaXJhQHRlY25pY28udWxpc2JvYS5wdD5cclxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIGNvbWJpbmUgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb25zIHRoYXQgcmVzdWx0IGZyb20gcnVsZXMgZXZhbHVhdGlvbi5cclxuKi9cclxuY2xhc3MgQWxsb3dPdmVycmlkZXMge1xyXG5cclxuICAvKipcclxuICAqIEdpdmVuIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgYXV0aG9yaXphdGlvbiBkZWNpc2lvbnMsIHByaW9yaXRpemVzIGEgcG9zaXRpdmUgb25lLlxyXG4gICogQHBhcmFtICAgIHtib29sZWFuW119ICAgZGVjaXNpb25zXHJcbiAgKiBAcmV0dXJucyAge2Jvb2xlYW59XHJcbiAgKi9cclxuICBjb21iaW5lKGRlY2lzaW9ucykge1xyXG4gICAgaWYgKGRlY2lzaW9ucy5pbmRleE9mKHRydWUpICE9PSAtMSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChkZWNpc2lvbnMuaW5kZXhPZihmYWxzZSkgIT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnTm90IEFwcGxpY2FibGUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQWxsb3dPdmVycmlkZXM7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7O0FBSUE7Ozs7Ozs7Ozs7QUFFQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFJQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///15\n')},16:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\r\n*/\nvar BlockOverrides =\n/*#__PURE__*/\nfunction () {\n function BlockOverrides() {\n _classCallCheck(this, BlockOverrides);\n }\n\n _createClass(BlockOverrides, [{\n key: "combine",\n\n /**\r\n * Given an array of individual authorisation decisions, prioritises a negative one.\r\n * @param {boolean[]} decisions\r\n * @returns {boolean}\r\n */\n value: function combine(decisions) {\n if (decisions.indexOf(false) !== -1) {\n return false;\n } else {\n if (decisions.indexOf(true) !== -1) {\n return true;\n } else {\n return \'Not Applicable\';\n }\n }\n }\n }]);\n\n return BlockOverrides;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (BlockOverrides);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvQmxvY2tPdmVycmlkZXMuanM/N2Q2NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuKiBAYXV0aG9yIEFuYSBDYWxkZWlyYSA8YW5hLmNhbGRlaXJhQHRlY25pY28udWxpc2JvYS5wdD5cclxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIGNvbWJpbmUgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb25zIHRoYXQgcmVzdWx0IGZyb20gcnVsZXMgZXZhbHVhdGlvbi5cclxuKi9cclxuY2xhc3MgQmxvY2tPdmVycmlkZXMge1xyXG5cclxuICAvKipcclxuICAqIEdpdmVuIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgYXV0aG9yaXNhdGlvbiBkZWNpc2lvbnMsIHByaW9yaXRpc2VzIGEgbmVnYXRpdmUgb25lLlxyXG4gICogQHBhcmFtICAgIHtib29sZWFuW119ICAgZGVjaXNpb25zXHJcbiAgKiBAcmV0dXJucyAge2Jvb2xlYW59XHJcbiAgKi9cclxuICBjb21iaW5lKGRlY2lzaW9ucykge1xyXG4gICAgaWYgKGRlY2lzaW9ucy5pbmRleE9mKGZhbHNlKSAhPT0gLTEpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGRlY2lzaW9ucy5pbmRleE9mKHRydWUpICE9PSAtMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnTm90IEFwcGxpY2FibGUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmxvY2tPdmVycmlkZXM7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7O0FBSUE7Ozs7Ozs7Ozs7QUFFQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFJQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///16\n')},17:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\r\n*/\nvar FirstApplicable =\n/*#__PURE__*/\nfunction () {\n function FirstApplicable() {\n _classCallCheck(this, FirstApplicable);\n }\n\n _createClass(FirstApplicable, [{\n key: "combine",\n\n /**\r\n * Given an array of individual authorisation decisions, returns the first one different from \'Not Applicable\', either positive or negative.\r\n * @param {boolean[]} decisions\r\n * @returns {boolean}\r\n */\n value: function combine(decisions) {\n for (var i in decisions) {\n if (decisions[i] !== \'Not Applicable\') {\n return decisions[i];\n }\n }\n\n return \'Not Applicable\';\n }\n }]);\n\n return FirstApplicable;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (FirstApplicable);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvRmlyc3RBcHBsaWNhYmxlLmpzP2ExMzIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLyoqXHJcbiogQGF1dGhvciBBbmEgQ2FsZGVpcmEgPGFuYS5jYWxkZWlyYUB0ZWNuaWNvLnVsaXNib2EucHQ+XHJcbiogQGNsYXNzZGVzYyBDbGFzcyB0byBjb21iaW5lIHRoZSBhdXRob3JpemF0aW9uIGRlY2lzaW9ucyB0aGF0IHJlc3VsdCBmcm9tIHJ1bGVzIGV2YWx1YXRpb24uXHJcbiovXHJcbmNsYXNzIEZpcnN0QXBwbGljYWJsZSB7XHJcblxyXG4gIC8qKlxyXG4gICogR2l2ZW4gYW4gYXJyYXkgb2YgaW5kaXZpZHVhbCBhdXRob3Jpc2F0aW9uIGRlY2lzaW9ucywgcmV0dXJucyB0aGUgZmlyc3Qgb25lIGRpZmZlcmVudCBmcm9tICdOb3QgQXBwbGljYWJsZScsIGVpdGhlciBwb3NpdGl2ZSBvciBuZWdhdGl2ZS5cclxuICAqIEBwYXJhbSAgICB7Ym9vbGVhbltdfSAgICAgZGVjaXNpb25zXHJcbiAgKiBAcmV0dXJucyAge2Jvb2xlYW59XHJcbiAgKi9cclxuICBjb21iaW5lKGRlY2lzaW9ucykge1xyXG4gICAgZm9yIChsZXQgaSBpbiBkZWNpc2lvbnMpIHtcclxuICAgICAgaWYgKGRlY2lzaW9uc1tpXSAhPT0gJ05vdCBBcHBsaWNhYmxlJykge1xyXG4gICAgICAgIHJldHVybiBkZWNpc2lvbnNbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAnTm90IEFwcGxpY2FibGUnO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZpcnN0QXBwbGljYWJsZTtcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7QUFJQTs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7O0FBSUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17\n')},23:function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/loglevel/lib/loglevel.js\nvar loglevel = __webpack_require__(1);\n\n// CONCATENATED MODULE: ./src/policy/ActionsService.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar ActionsService =\n/*#__PURE__*/\nfunction () {\n function ActionsService(context) {\n _classCallCheck(this, ActionsService);\n\n this.context = context;\n }\n\n _createClass(ActionsService, [{\n key: \"enforcePolicies\",\n value: function enforcePolicies(message, isIncomingMessage) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var policies = _this.context.getPolicies(message, isIncomingMessage);\n\n if (policies !== undefined) {\n if (policies.serviceProviderPolicy !== undefined) {\n policies.serviceProviderPolicy.enforceActions(_this.context, message).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n if (policies.userPolicy !== undefined) {\n policies.userPolicy.enforceActions(_this.context, message).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve([message]);\n }\n }\n } else {\n resolve([message]);\n }\n });\n }\n }, {\n key: \"forwardToID\",\n value: function forwardToID(message, email) {\n var _this = this;\n\n if (!_this.context.runtimeRegistry) throw new Error('forward message to given ID is unsupported in this environment');\n return new Promise(function (resolve, reject) {\n if (_this.context.runtimeRegistry.hypertiesList[0].hypertyURL === message.to) {\n var splitTo = message.to.split('://');\n\n if (splitTo[0] !== 'runtime') {\n _this.context.runtimeRegistry.discoverHypertyPerUser(email).then(function (result) {\n message.to = result.hypertyURL;\n message.body.via = undefined;\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(message);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve(message);\n }\n } else {\n resolve(message);\n }\n });\n }\n }, {\n key: \"forwardToHyperty\",\n value: function forwardToHyperty(message, hypertyURL) {\n var _this = this;\n\n if (!_this.context.runtimeRegistry) throw new Error('forward message to given ID is unsupported in this environment');\n return new Promise(function (resolve) {\n if (_this.context.runtimeRegistry.hypertiesList[0].hypertyURL === message.to) {\n var splitTo = message.to.split('://');\n\n if (splitTo[0] !== 'runtime') {\n message.to = hypertyURL;\n message.body.via = undefined;\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(message);\n } else {\n resolve(message);\n }\n } else {\n resolve(message);\n }\n });\n }\n }, {\n key: \"sendAutomaticMessage\",\n value: function sendAutomaticMessage(message, text) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var automaticMessage = {\n from: message.to,\n to: message.from,\n body: {\n value: text\n },\n type: message.type\n };\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(automaticMessage);\n });\n }\n }]);\n\n return ActionsService;\n}();\n\n/* harmony default export */ var policy_ActionsService = (ActionsService);\n// CONCATENATED MODULE: ./src/policy/Operators.js\nfunction Operators_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Operators_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Operators_createClass(Constructor, protoProps, staticProps) { if (protoProps) Operators_defineProperties(Constructor.prototype, protoProps); if (staticProps) Operators_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar Operators =\n/*#__PURE__*/\nfunction () {\n function Operators() {\n Operators_classCallCheck(this, Operators);\n }\n\n Operators_createClass(Operators, [{\n key: \"and\",\n value: function and(params) {\n return params[0] && params[1];\n }\n }, {\n key: \"between\",\n value: function between(params) {\n var start = parseInt(params[0][0]);\n var end = parseInt(params[0][1]);\n var now = params[1];\n\n if (end < start) {\n now = now < start ? now += 2400 : now;\n end += 2400;\n }\n\n return now > start && now < end;\n }\n }, {\n key: \"equals\",\n value: function equals(params) {\n return String(params[0]) === '*' || String(params[0]) === String(params[1]);\n }\n }, {\n key: \"greaterThan\",\n value: function greaterThan(params) {\n return params[1] > params[0];\n }\n }, {\n key: \"in\",\n value: function _in(params) {\n return params[0].indexOf(params[1]) > -1;\n }\n }, {\n key: \"lessThan\",\n value: function lessThan(params) {\n return params[1] < params[0];\n }\n }, {\n key: \"not\",\n value: function not(params) {\n return !params[0];\n }\n }, {\n key: \"or\",\n value: function or(params) {\n return params[0] || params[1];\n }\n }]);\n\n return Operators;\n}();\n\n/* harmony default export */ var policy_Operators = (Operators);\n// CONCATENATED MODULE: ./src/policy/PDP.js\nfunction PDP_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction PDP_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction PDP_createClass(Constructor, protoProps, staticProps) { if (protoProps) PDP_defineProperties(Constructor.prototype, protoProps); if (staticProps) PDP_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/**\r\n* The Policy Decision Point (PDP) decides if a message is to be authorised by checking a set of\r\n* policies. The resource to be verified is specified in the first word of the 'condition' field of\r\n* a Policy object. The implementation that verifies if the message is compliant with a policy is\r\n* specified in a hashtable to allow dynamic definition of the implementation, providing\r\n* extensibility to the Policy Engine functionalities.\r\n*/\n\nvar PDP_PDP =\n/*#__PURE__*/\nfunction () {\n function PDP(context) {\n PDP_classCallCheck(this, PDP);\n\n this.context = context;\n this.operators = new policy_Operators();\n }\n\n PDP_createClass(PDP, [{\n key: \"evaluatePolicies\",\n value: function evaluatePolicies(message, isIncomingMessage) {\n var policies = this.context.getPolicies(message, isIncomingMessage);\n var result = 'Not Applicable';\n\n if (policies !== undefined) {\n result = this.evaluatePolicy(message, policies.serviceProviderPolicy, isIncomingMessage);\n\n if (result || result === 'Not Applicable') {\n var userResult = this.evaluatePolicy(message, policies.userPolicy, isIncomingMessage);\n\n if (userResult !== 'Not Applicable') {\n result = userResult;\n }\n }\n }\n\n return result;\n }\n }, {\n key: \"evaluatePolicy\",\n value: function evaluatePolicy(message, policy, isIncoming) {\n var result = 'Not Applicable';\n\n if (policy) {\n result = policy.evaluateRules(this.context, message, isIncoming);\n }\n\n return result;\n }\n }]);\n\n return PDP;\n}();\n\n/* harmony default export */ var policy_PDP = (PDP_PDP);\n// EXTERNAL MODULE: ./src/policy/combiningAlgorithms/AllowOverrides.js\nvar AllowOverrides = __webpack_require__(15);\n\n// EXTERNAL MODULE: ./src/policy/combiningAlgorithms/BlockOverrides.js\nvar BlockOverrides = __webpack_require__(16);\n\n// EXTERNAL MODULE: ./src/policy/combiningAlgorithms/FirstApplicable.js\nvar FirstApplicable = __webpack_require__(17);\n\n// CONCATENATED MODULE: ./src/policy/conditions/Condition.js\nfunction Condition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Condition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Condition_createClass(Constructor, protoProps, staticProps) { if (protoProps) Condition_defineProperties(Constructor.prototype, protoProps); if (staticProps) Condition_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to represent a condition and evaluate its applicability.\r\n*/\n\nvar Condition_Condition =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates a new Condition.\r\n * @class\r\n * @param {string} attribute\r\n * @param {string} operator\r\n * @param {*} params\r\n */\n function Condition(attribute, operator, params) {\n Condition_classCallCheck(this, Condition);\n\n this.attribute = attribute;\n this.operator = operator;\n this.params = params;\n this.operators = new policy_Operators();\n }\n /**\r\n * Verifies if the condition is applicable to the message. First, the system value that corresponds to the attribute is retrieved; then, that value is compared with the parameter specified in the condition by executing the operator implementation. If the operator is 'in' and the name of a group is given, then the array holding the members of the group is retrieved before the comparison.\r\n * @param {Object} context environment where the Policy Engine is being used\r\n * @param {Object} message\r\n */\n\n\n Condition_createClass(Condition, [{\n key: \"isApplicable\",\n value: function isApplicable(context, message) {\n context[this.attribute] = {\n message: message\n };\n var value = context[this.attribute];\n var tempParam;\n\n if (this.operator === 'in') {\n if (!Array.isArray(this.params)) {\n tempParam = context.getGroup(this.params, message.to);\n return this.operators[this.operator]([tempParam, value]);\n }\n }\n\n return this.operators[this.operator]([this.params, value]);\n }\n }]);\n\n return Condition;\n}();\n\n/* harmony default export */ var conditions_Condition = (Condition_Condition);\n// CONCATENATED MODULE: ./src/policy/conditions/SubscriptionCondition.js\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction SubscriptionCondition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SubscriptionCondition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SubscriptionCondition_createClass(Constructor, protoProps, staticProps) { if (protoProps) SubscriptionCondition_defineProperties(Constructor.prototype, protoProps); if (staticProps) SubscriptionCondition_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to represent a subscription condition and evaluate its applicability.\r\n*/\n\nvar SubscriptionCondition =\n/*#__PURE__*/\nfunction (_Condition) {\n _inherits(SubscriptionCondition, _Condition);\n\n /**\r\n * Creates a new SubscriptionCondition.\r\n * @class\r\n * @param {string} attribute\r\n * @param {string} operator\r\n * @param {*} params\r\n */\n function SubscriptionCondition(attribute, operator, params) {\n SubscriptionCondition_classCallCheck(this, SubscriptionCondition);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(SubscriptionCondition).call(this, attribute, operator, params));\n }\n /**\r\n * Verifies if the subscription condition is applicable to the message. First, verifies if the message is of the subscription type; second, verifies if the message is from a remote runtime to guarantee that the subscription is being validated in the destination runtime; third, verifies if the subscription preference is met.\r\n * @param {Object} context environment where the Policy Engine is being used\r\n * @param {Object} message\r\n */\n\n\n SubscriptionCondition_createClass(SubscriptionCondition, [{\n key: \"isApplicable\",\n value: function isApplicable(context, message) {\n var isSubscription = message.type === 'subscribe';\n var isFromRemoteSM = context.isFromRemoteSM(message.from);\n\n if (isSubscription & isFromRemoteSM) {\n return _get(_getPrototypeOf(SubscriptionCondition.prototype), \"isApplicable\", this).call(this, context, message);\n } else {\n return false;\n }\n }\n }]);\n\n return SubscriptionCondition;\n}(conditions_Condition);\n\n/* harmony default export */ var conditions_SubscriptionCondition = (SubscriptionCondition);\n// CONCATENATED MODULE: ./src/policy/conditions/AdvancedCondition.js\nfunction AdvancedCondition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction AdvancedCondition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction AdvancedCondition_createClass(Constructor, protoProps, staticProps) { if (protoProps) AdvancedCondition_defineProperties(Constructor.prototype, protoProps); if (staticProps) AdvancedCondition_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar AdvancedCondition_AdvancedCondition =\n/*#__PURE__*/\nfunction () {\n function AdvancedCondition(condition) {\n AdvancedCondition_classCallCheck(this, AdvancedCondition);\n\n this.operators = new policy_Operators();\n\n if (condition.operators !== undefined) {\n condition = condition.condition;\n }\n\n condition = this.buildCondition(condition);\n this.condition = condition;\n }\n\n AdvancedCondition_createClass(AdvancedCondition, [{\n key: \"buildCondition\",\n value: function buildCondition(condition) {\n if (Array.isArray(condition[1])) {\n condition[1] = this.buildCondition(condition[1]);\n } else {\n if (condition[1].attribute === 'subscription') {\n condition[1] = new conditions_SubscriptionCondition(condition[1].attribute, condition[1].operator, condition[1].params);\n } else {\n condition[1] = new conditions_Condition(condition[1].attribute, condition[1].operator, condition[1].params);\n }\n }\n\n if (condition[2] !== undefined) {\n if (Array.isArray(condition[2])) {\n condition[2] = this.buildCondition(condition[2]);\n } else {\n if (condition[2].attribute === 'subscription') {\n condition[2] = new conditions_SubscriptionCondition(condition[2].attribute, condition[2].operator, condition[2].params);\n } else {\n condition[2] = new conditions_Condition(condition[2].attribute, condition[2].operator, condition[2].params);\n }\n }\n }\n\n return condition;\n }\n }, {\n key: \"isApplicable\",\n value: function isApplicable(context, message, scope, target, operator, left, right) {\n if (!operator) {\n operator = this.condition[0];\n left = this.condition[1];\n right = this.condition[2];\n }\n\n while (!(left instanceof conditions_Condition) & !(left instanceof conditions_SubscriptionCondition) & typeof left !== 'boolean') {\n left = this.isApplicable(context, message, scope, target, left[0], left[1], left[2]);\n }\n\n if (right !== undefined) {\n while (!(right instanceof conditions_Condition) & !(right instanceof conditions_SubscriptionCondition) & typeof right !== 'boolean') {\n right = this.isApplicable(context, message, scope, target, right[0], right[1], right[2]);\n }\n }\n\n var resultLeft = typeof left === 'boolean' ? left : left.isApplicable(context, message, scope, target);\n var resultRight;\n\n if (right !== undefined) {\n resultRight = typeof right === 'boolean' ? right : right.isApplicable(context, message, scope, target);\n }\n\n return this.operators[operator]([resultLeft, resultRight]);\n }\n }]);\n\n return AdvancedCondition;\n}();\n\n/* harmony default export */ var conditions_AdvancedCondition = (AdvancedCondition_AdvancedCondition);\n// EXTERNAL MODULE: ./src/utils/utils.js\nvar utils = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./src/policy/Rule.js\nfunction Rule_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Rule_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Rule_createClass(Constructor, protoProps, staticProps) { if (protoProps) Rule_defineProperties(Constructor.prototype, protoProps); if (staticProps) Rule_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\nvar Rule_Rule =\n/*#__PURE__*/\nfunction () {\n function Rule(decision, condition, scope, target, priority) {\n Rule_classCallCheck(this, Rule);\n\n this.decision = decision;\n this.setCondition(condition);\n this.priority = priority;\n this.scope = scope;\n this.target = target;\n }\n\n Rule_createClass(Rule, [{\n key: \"setCondition\",\n value: function setCondition(condition) {\n if (!(condition instanceof conditions_Condition || condition instanceof conditions_AdvancedCondition || condition instanceof conditions_AdvancedCondition)) {\n var attribute = condition.attribute;\n\n switch (attribute) {\n case 'subscription':\n this.condition = new conditions_AdvancedCondition(condition.attribute, condition.operator, condition.params);\n break;\n\n case undefined:\n this.condition = new conditions_AdvancedCondition(condition);\n break;\n\n default:\n this.condition = new conditions_Condition(condition.attribute, condition.operator, condition.params);\n }\n } else {\n this.condition = condition;\n }\n }\n }, {\n key: \"evaluate\",\n value: function evaluate(context, message, isIncoming) {\n var field = isIncoming ? message.to : message.from;\n var hypertyName;\n\n switch (this.scope) {\n case 'global':\n break;\n\n case 'hyperty':\n if (Object(utils[\"s\" /* isDataObjectURL */])(field)) {\n var reporter = context.runtimeRegistry.getReporterURLSynchonous(Object(utils[\"B\" /* removePathFromURL */])(field));\n\n if (reporter !== undefined) {\n hypertyName = context.runtimeRegistry.getHypertyName(reporter);\n }\n } else {\n if (field.split('://')[0] === 'hyperty') {\n hypertyName = context.runtimeRegistry.getHypertyName(Object(utils[\"B\" /* removePathFromURL */])(field));\n }\n }\n\n if (hypertyName === this.target) {\n break;\n }\n\n return 'Not Applicable';\n\n case 'identity':\n var owner;\n\n if (Object(utils[\"s\" /* isDataObjectURL */])(field)) {\n var _reporter = context.runtimeRegistry.getReporterURLSynchonous(Object(utils[\"B\" /* removePathFromURL */])(field));\n\n owner = context.runtimeRegistry.getHypertyOwner(_reporter);\n } else {\n if (field.split('://')[0] === 'hyperty') {\n owner = context.runtimeRegistry.getHypertyOwner(Object(utils[\"B\" /* removePathFromURL */])(field));\n }\n }\n\n if (owner !== undefined) {\n owner = Object(utils[\"p\" /* getUserEmailFromURL */])(owner);\n }\n\n if (owner === this.target) {\n break;\n }\n\n return 'Not Applicable';\n }\n\n if (this.condition.isApplicable(context, message, this.scope, this.target)) {\n return this.decision;\n } else {\n return 'Not Applicable';\n }\n }\n }]);\n\n return Rule;\n}();\n\n/* harmony default export */ var policy_Rule = (Rule_Rule);\n// CONCATENATED MODULE: ./src/policy/Policy.js\nfunction Policy_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Policy_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Policy_createClass(Constructor, protoProps, staticProps) { if (protoProps) Policy_defineProperties(Constructor.prototype, protoProps); if (staticProps) Policy_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\nvar Policy_Policy =\n/*#__PURE__*/\nfunction () {\n function Policy(key, rules, actions, combiningAlgorithm) {\n Policy_classCallCheck(this, Policy);\n\n if (!key) throw new Error('key is not defined');\n if (!actions) throw new Error('actions are not defined');\n this.actions = actions;\n this.key = key;\n\n this._setRules(rules);\n\n this._setCombiningAlgorithm(combiningAlgorithm);\n }\n\n Policy_createClass(Policy, [{\n key: \"addAction\",\n value: function addAction(method, param) {\n this.actions.push({\n method: method,\n param: param\n });\n }\n }, {\n key: \"createRule\",\n value: function createRule(decision, condition, scope, target, priority) {\n if (priority === undefined) {\n priority = this.getLastPriority() + 1;\n }\n\n var rule = new policy_Rule(decision, condition, scope, target, priority);\n this.rules.push(rule);\n }\n }, {\n key: \"deleteRule\",\n value: function deleteRule(rule) {\n var indexToRemove = this.rules.indexOf(rule);\n this.rules.splice(indexToRemove, 1);\n }\n }, {\n key: \"enforceActions\",\n value: function enforceActions(context, message) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var results = [];\n\n if (_this.actions.length !== 0) {\n for (var i in _this.actions) {\n var result = context.pep.actionsService[_this.actions[i].method](message, _this.actions[i].param);\n\n results.push(result);\n }\n\n Promise.all(results).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve([message]);\n }\n });\n }\n }, {\n key: \"evaluateRules\",\n value: function evaluateRules(context, message, isIncoming) {\n var results = [];\n\n for (var i in this.rules) {\n results.push(this.rules[i].evaluate(context, message, isIncoming));\n }\n\n return this.combiningAlgorithm.combine(results);\n }\n }, {\n key: \"getLastPriority\",\n value: function getLastPriority() {\n var priorities = [];\n\n if (this.rules.length !== 0) {\n for (var i in this.rules) {\n priorities.push(this.rules[i].priority);\n }\n\n return Math.max.apply(Math, priorities);\n } else {\n return -1;\n }\n }\n }, {\n key: \"getRuleByPriority\",\n value: function getRuleByPriority(priority) {\n for (var i in this.rules) {\n if (String(this.rules[i].priority) === String(priority)) {\n return this.rules[i];\n }\n }\n\n throw Error('Rule with priority ' + priority + ' does not exist!');\n }\n }, {\n key: \"_setCombiningAlgorithm\",\n value: function _setCombiningAlgorithm(combiningAlgorithm) {\n if (!combiningAlgorithm) {\n combiningAlgorithm = 'blockOverrides';\n }\n\n switch (combiningAlgorithm) {\n case 'blockOverrides':\n this.combiningAlgorithm = new BlockOverrides[\"a\" /* default */]();\n break;\n\n case 'allowOverrides':\n this.combiningAlgorithm = new AllowOverrides[\"a\" /* default */]();\n break;\n\n case 'firstApplicable':\n this.combiningAlgorithm = new FirstApplicable[\"a\" /* default */]();\n break;\n\n default:\n throw Error('Unknown algorithm: ' + combiningAlgorithm);\n }\n }\n }, {\n key: \"_setRules\",\n value: function _setRules(rules) {\n this.rules = [];\n\n for (var i in rules) {\n var rule = rules[i];\n\n if (rule.priority === undefined) {\n rule.priority = this.getLastPriority() + 1;\n }\n\n if (!(rule instanceof policy_Rule)) {\n rule = new policy_Rule(rule.decision, rule.condition, rule.scope, rule.target, rule.priority);\n }\n\n this.rules.push(rule);\n }\n }\n }, {\n key: \"sortRules\",\n value: function sortRules() {\n return this.rules.sort(function (a, b) {\n var x = a.priority;\n var y = b.priority;\n return x < y ? -1 : x > y ? 1 : 0;\n });\n }\n }]);\n\n return Policy;\n}();\n\n/* harmony default export */ var policy_Policy = (Policy_Policy);\n// CONCATENATED MODULE: ./src/policy/PEP.js\nfunction PEP_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction PEP_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction PEP_createClass(Constructor, protoProps, staticProps) { if (protoProps) PEP_defineProperties(Constructor.prototype, protoProps); if (staticProps) PEP_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar log = loglevel[\"getLogger\"]('PEP');\n\n\n\n\n\nvar PEP_PEP =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates a Policy Enforcement Point (PEP) instance\r\n * @param {Object} context\r\n */\n function PEP(context) {\n PEP_classCallCheck(this, PEP);\n\n var _this = this;\n\n _this.pdp = new policy_PDP(context);\n _this.actionsService = new policy_ActionsService(context);\n _this.context = context;\n context.pep = _this; //TODO should be added a trigger to verify when the loadConfigurations is successfully completed\n\n context.loadConfigurations();\n }\n /**\r\n * return the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n\n\n PEP_createClass(PEP, [{\n key: \"addGUIListeners\",\n value: function addGUIListeners() {\n var _this = this;\n\n _this.context.messageBus.addListener(_this.context.pepURL, function (msg) {\n var funcName = msg.body.method;\n var returnedValue;\n\n if (funcName === 'addToGroup') {\n var groupName = msg.body.params.groupName;\n var userEmail = msg.body.params.userEmail;\n returnedValue = _this.context.addToGroup(groupName, userEmail);\n } else if (funcName === 'createGroup') {\n var _groupName = msg.body.params.groupName;\n returnedValue = _this.context.createGroup(_groupName);\n } else if (funcName === 'addPolicy') {\n var source = msg.body.params.source;\n var key = msg.body.params.key;\n var policy = msg.body.params.policy;\n var combiningAlgorithm = msg.body.params.combiningAlgorithm;\n returnedValue = _this.addPolicy(source, key, policy, combiningAlgorithm);\n } else if (funcName === 'deleteGroup') {\n var _groupName2 = msg.body.params.groupName;\n returnedValue = _this.context.deleteGroup(_groupName2);\n } else if (funcName === 'removePolicy') {\n var _source = msg.body.params.source;\n var _key = msg.body.params.key;\n returnedValue = _this.removePolicy(_source, _key);\n } else if (funcName === 'savePolicies') {\n var _source2 = msg.body.params.source;\n returnedValue = _this.context.savePolicies(_source2);\n } else if (funcName === 'userPolicies') {\n returnedValue = _this.context.userPolicies;\n } else if (funcName === 'activeUserPolicy') {\n var userPolicy = msg.body.params.userPolicy;\n\n if (userPolicy) {\n _this.context.activeUserPolicy = userPolicy;\n }\n\n returnedValue = _this.context.activeUserPolicy;\n } else if (funcName === 'userPolicy') {\n var _key2 = msg.body.params.key;\n returnedValue = _this.context.userPolicies[_key2];\n } else if (funcName === 'saveActivePolicy') {\n returnedValue = _this.context.saveActivePolicy();\n } else if (funcName === 'getMyEmails') {\n returnedValue = _this.context.getMyEmails();\n } else if (funcName === 'getMyHyperties') {\n returnedValue = _this.context.getMyHyperties();\n } else if (funcName === 'groups') {\n returnedValue = _this.context.groups;\n } else if (funcName === 'getGroupsNames') {\n returnedValue = _this.context.getGroupsNames();\n }\n\n if (funcName === 'removeFromGroup') {\n var _groupName3 = msg.body.params.groupName;\n var _userEmail = msg.body.params.userEmail;\n returnedValue = _this.context.removeFromGroup(_groupName3, _userEmail);\n }\n\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n _this.context.messageBus.postMessage(replyMsg);\n });\n }\n /**\r\n * Adds a policy to the Policy Enforcement Point (PEP). The policy can be created by the service\r\n * provider or by the user.\r\n * @param {String} source\r\n * @param {String} key\r\n * @param {Object} policy\r\n */\n\n }, {\n key: \"addPolicy\",\n value: function addPolicy(source, key, policy, combiningAlgorithm) {\n if (!source) throw new Error('source is not defined');\n if (!key) throw new Error('key is not defined');\n\n if (policy === undefined) {\n policy = new policy_Policy(key, [], [], combiningAlgorithm);\n } else {\n if (!(policy instanceof policy_Policy)) {\n policy = new policy_Policy(policy.key, policy.rules, policy.actions, policy.combiningAlgorithm);\n }\n }\n\n switch (source) {\n case 'SERVICE_PROVIDER':\n this.context.savePolicies(source, policy, key);\n break;\n\n case 'USER':\n this.context.userPolicies[key] = policy;\n this.context.savePolicies(source);\n break;\n\n default:\n throw Error('Unknown policy source: ' + source);\n }\n }\n }, {\n key: \"authorise\",\n value: function authorise(message, isIncoming) {\n var _this2 = this;\n\n // log.log('[Policy.PEP Authorise] ', message);\n // log.log(message);\n if (!message) throw new Error('message is not defined');\n if (!message.from) throw new Error('message.from is not defined');\n if (!message.to) throw new Error('message.to is not defined');\n if (!message.type) throw new Error('message.type is not defined');\n message.body = message.body || {};\n return new Promise(function (resolve, reject) {\n message.body = message.body || {};\n var _this = _this2;\n\n var result = _this.pdp.evaluatePolicies(message, isIncoming);\n\n if (result === 'Not Applicable') {\n result = _this.context.defaultBehaviour;\n message.body.auth = false;\n }\n\n _this.actionsService.enforcePolicies(message, isIncoming).then(function (messages) {\n for (var i in messages) {\n message = messages[i];\n\n if (result) {\n message.body.auth = message.body.auth === undefined ? true : message.body.auth;\n resolve(message);\n } else {\n var errorMessage = {\n body: {\n code: 403,\n description: 'Blocked by policy'\n },\n from: message.to,\n to: message.from,\n type: 'response'\n };\n reject(errorMessage);\n }\n }\n }, function (error) {\n reject(error);\n });\n });\n }\n }, {\n key: \"authoriseSync\",\n value: function authoriseSync(message) {\n var result;\n message.body = message.body || {};\n result = this.pdp.evaluatePolicies(message, true);\n\n if (result === 'Not Applicable') {\n result = this.context.defaultBehaviour;\n }\n\n return result;\n }\n }, {\n key: \"removePolicy\",\n value: function removePolicy(source, key) {\n if (!source) throw new Error('source is not defined');\n if (source !== '*' && !key) throw new Error('key is not defined');\n\n switch (source) {\n case '*':\n this.context.serviceProviderPolicy = {};\n this.context.userPolicies = {};\n this.context.activeUserPolicy = undefined;\n this.context.savePolicies('USER');\n this.context.savePolicies('SERVICE_PROVIDER');\n this.context.saveActivePolicy();\n break;\n\n case 'SERVICE_PROVIDER':\n delete this.context.serviceProviderPolicy[key];\n this.context.savePolicies();\n break;\n\n case 'USER':\n delete this.context.userPolicies[key];\n\n if (key === this.context.activeUserPolicy) {\n this.context.activeUserPolicy = undefined;\n this.context.saveActivePolicy();\n }\n\n this.context.savePolicies('USER');\n break;\n\n default:\n throw Error('Unknown policy source: ' + source);\n }\n }\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this.context.messageBus;\n }\n /**\r\n * Set the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this.context.messageBus = messageBus;\n\n _this.addGUIListeners();\n }\n }]);\n\n return PEP;\n}();\n\n/* harmony default export */ var policy_PEP = __webpack_exports__[\"default\"] = (PEP_PEP);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L0FjdGlvbnNTZXJ2aWNlLmpzPzllNzIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9PcGVyYXRvcnMuanM/M2IyZiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L1BEUC5qcz8yMmVkIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9wb2xpY3kvY29uZGl0aW9ucy9Db25kaXRpb24uanM/MzMxNSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbmRpdGlvbnMvU3Vic2NyaXB0aW9uQ29uZGl0aW9uLmpzPzdlMWIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9jb25kaXRpb25zL0FkdmFuY2VkQ29uZGl0aW9uLmpzPzljMzIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9SdWxlLmpzPzVkZDgiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9Qb2xpY3kuanM/ZDFhZCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L1BFUC5qcz85YTFmIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEFjdGlvbnNTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICB9XHJcblxyXG4gIGVuZm9yY2VQb2xpY2llcyhtZXNzYWdlLCBpc0luY29taW5nTWVzc2FnZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgcG9saWNpZXMgPSBfdGhpcy5jb250ZXh0LmdldFBvbGljaWVzKG1lc3NhZ2UsIGlzSW5jb21pbmdNZXNzYWdlKTtcclxuXHJcbiAgICAgIGlmIChwb2xpY2llcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHBvbGljaWVzLnNlcnZpY2VQcm92aWRlclBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBwb2xpY2llcy5zZXJ2aWNlUHJvdmlkZXJQb2xpY3kuZW5mb3JjZUFjdGlvbnMoX3RoaXMuY29udGV4dCwgbWVzc2FnZSkudGhlbihtZXNzYWdlcyA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZXMpO1xyXG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHBvbGljaWVzLnVzZXJQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwb2xpY2llcy51c2VyUG9saWN5LmVuZm9yY2VBY3Rpb25zKF90aGlzLmNvbnRleHQsIG1lc3NhZ2UpLnRoZW4obWVzc2FnZXMgPT4ge1xyXG4gICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZXMpO1xyXG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoW21lc3NhZ2VdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShbbWVzc2FnZV0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZvcndhcmRUb0lEKG1lc3NhZ2UsIGVtYWlsKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgaWYgKCFfdGhpcy5jb250ZXh0LnJ1bnRpbWVSZWdpc3RyeSkgdGhyb3cgbmV3IEVycm9yKCdmb3J3YXJkIG1lc3NhZ2UgdG8gZ2l2ZW4gSUQgaXMgdW5zdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5jb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5oeXBlcnRpZXNMaXN0WzBdLmh5cGVydHlVUkwgPT09IG1lc3NhZ2UudG8pIHtcclxuICAgICAgICBsZXQgc3BsaXRUbyA9IChtZXNzYWdlLnRvKS5zcGxpdCgnOi8vJyk7XHJcbiAgICAgICAgaWYgKHNwbGl0VG9bMF0gIT09ICdydW50aW1lJykge1xyXG4gICAgICAgICAgX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZGlzY292ZXJIeXBlcnR5UGVyVXNlcihlbWFpbCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBtZXNzYWdlLnRvID0gcmVzdWx0Lmh5cGVydHlVUkw7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UuYm9keS52aWEgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5Ll9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmb3J3YXJkVG9IeXBlcnR5KG1lc3NhZ2UsIGh5cGVydHlVUkwpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBpZiAoIV90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5KSB0aHJvdyBuZXcgRXJyb3IoJ2ZvcndhcmQgbWVzc2FnZSB0byBnaXZlbiBJRCBpcyB1bnN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50Jyk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5jb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5oeXBlcnRpZXNMaXN0WzBdLmh5cGVydHlVUkwgPT09IG1lc3NhZ2UudG8pIHtcclxuICAgICAgICBsZXQgc3BsaXRUbyA9IChtZXNzYWdlLnRvKS5zcGxpdCgnOi8vJyk7XHJcbiAgICAgICAgaWYgKHNwbGl0VG9bMF0gIT09ICdydW50aW1lJykge1xyXG4gICAgICAgICAgbWVzc2FnZS50byA9IGh5cGVydHlVUkw7XHJcbiAgICAgICAgICBtZXNzYWdlLmJvZHkudmlhID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgICAgIF90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5Ll9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbmRBdXRvbWF0aWNNZXNzYWdlKG1lc3NhZ2UsIHRleHQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgbGV0IGF1dG9tYXRpY01lc3NhZ2UgPSB7XHJcbiAgICAgICAgZnJvbTogbWVzc2FnZS50byxcclxuICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxyXG4gICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgIHZhbHVlOiB0ZXh0XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0eXBlOiBtZXNzYWdlLnR5cGVcclxuICAgICAgfTtcclxuICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UoYXV0b21hdGljTWVzc2FnZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBY3Rpb25zU2VydmljZTtcclxuIiwiY2xhc3MgT3BlcmF0b3JzIHtcclxuXHJcbiAgYW5kKHBhcmFtcykge1xyXG4gICAgcmV0dXJuIHBhcmFtc1swXSAmJiBwYXJhbXNbMV07XHJcbiAgfVxyXG5cclxuICBiZXR3ZWVuKHBhcmFtcykge1xyXG4gICAgbGV0IHN0YXJ0ID0gcGFyc2VJbnQocGFyYW1zWzBdWzBdKTtcclxuICAgIGxldCBlbmQgPSBwYXJzZUludChwYXJhbXNbMF1bMV0pO1xyXG4gICAgbGV0IG5vdyA9IHBhcmFtc1sxXTtcclxuXHJcbiAgICBpZiAoZW5kIDwgc3RhcnQpIHtcclxuICAgICAgbm93ID0gKG5vdyA8IHN0YXJ0KSA/IG5vdyArPSAyNDAwIDogbm93O1xyXG4gICAgICBlbmQgKz0gMjQwMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKG5vdyA+IHN0YXJ0ICYmIG5vdyA8IGVuZCk7XHJcbiAgfVxyXG5cclxuICBlcXVhbHMocGFyYW1zKSB7XHJcbiAgICByZXR1cm4gU3RyaW5nKHBhcmFtc1swXSkgPT09ICcqJyB8fCBTdHJpbmcocGFyYW1zWzBdKSA9PT0gU3RyaW5nKHBhcmFtc1sxXSk7XHJcbiAgfVxyXG5cclxuICBncmVhdGVyVGhhbihwYXJhbXMpIHtcclxuICAgIHJldHVybiBwYXJhbXNbMV0gPiBwYXJhbXNbMF07XHJcbiAgfVxyXG5cclxuICBpbihwYXJhbXMpIHtcclxuICAgIHJldHVybiBwYXJhbXNbMF0uaW5kZXhPZihwYXJhbXNbMV0pID4gLTE7XHJcbiAgfVxyXG5cclxuICBsZXNzVGhhbihwYXJhbXMpIHtcclxuICAgIHJldHVybiBwYXJhbXNbMV0gPCBwYXJhbXNbMF07XHJcbiAgfVxyXG5cclxuICBub3QocGFyYW1zKSB7XHJcbiAgICByZXR1cm4gIXBhcmFtc1swXTtcclxuICB9XHJcblxyXG4gIG9yKHBhcmFtcykge1xyXG4gICAgcmV0dXJuIHBhcmFtc1swXSB8fCBwYXJhbXNbMV07XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgT3BlcmF0b3JzO1xyXG4iLCJpbXBvcnQgT3BlcmF0b3JzIGZyb20gJy4vT3BlcmF0b3JzJztcclxuXHJcbi8qKlxyXG4qIFRoZSBQb2xpY3kgRGVjaXNpb24gUG9pbnQgKFBEUCkgZGVjaWRlcyBpZiBhIG1lc3NhZ2UgaXMgdG8gYmUgYXV0aG9yaXNlZCBieSBjaGVja2luZyBhIHNldCBvZlxyXG4qIHBvbGljaWVzLiBUaGUgcmVzb3VyY2UgdG8gYmUgdmVyaWZpZWQgaXMgc3BlY2lmaWVkIGluIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSAnY29uZGl0aW9uJyBmaWVsZCBvZlxyXG4qIGEgUG9saWN5IG9iamVjdC4gVGhlIGltcGxlbWVudGF0aW9uIHRoYXQgdmVyaWZpZXMgaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxpYW50IHdpdGggYSBwb2xpY3kgaXNcclxuKiBzcGVjaWZpZWQgaW4gYSBoYXNodGFibGUgdG8gYWxsb3cgZHluYW1pYyBkZWZpbml0aW9uIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgcHJvdmlkaW5nXHJcbiogZXh0ZW5zaWJpbGl0eSB0byB0aGUgUG9saWN5IEVuZ2luZSBmdW5jdGlvbmFsaXRpZXMuXHJcbiovXHJcbmNsYXNzIFBEUCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLm9wZXJhdG9ycyA9IG5ldyBPcGVyYXRvcnMoKTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlUG9saWNpZXMobWVzc2FnZSwgaXNJbmNvbWluZ01lc3NhZ2UpIHtcclxuICAgIGxldCBwb2xpY2llcyA9IHRoaXMuY29udGV4dC5nZXRQb2xpY2llcyhtZXNzYWdlLCBpc0luY29taW5nTWVzc2FnZSk7XHJcbiAgICBsZXQgcmVzdWx0ID0gJ05vdCBBcHBsaWNhYmxlJztcclxuICAgIGlmIChwb2xpY2llcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZXZhbHVhdGVQb2xpY3kobWVzc2FnZSwgcG9saWNpZXMuc2VydmljZVByb3ZpZGVyUG9saWN5LCBpc0luY29taW5nTWVzc2FnZSk7XHJcbiAgICAgIGlmIChyZXN1bHQgfHwgcmVzdWx0ID09PSAnTm90IEFwcGxpY2FibGUnKSB7XHJcbiAgICAgICAgbGV0IHVzZXJSZXN1bHQgPSB0aGlzLmV2YWx1YXRlUG9saWN5KG1lc3NhZ2UsIHBvbGljaWVzLnVzZXJQb2xpY3ksIGlzSW5jb21pbmdNZXNzYWdlKTtcclxuICAgICAgICBpZiAodXNlclJlc3VsdCAhPT0gJ05vdCBBcHBsaWNhYmxlJykge1xyXG4gICAgICAgICAgcmVzdWx0ID0gdXNlclJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVQb2xpY3kobWVzc2FnZSwgcG9saWN5LCBpc0luY29taW5nKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gJ05vdCBBcHBsaWNhYmxlJztcclxuICAgIGlmIChwb2xpY3kpIHtcclxuICAgICAgcmVzdWx0ID0gcG9saWN5LmV2YWx1YXRlUnVsZXModGhpcy5jb250ZXh0LCBtZXNzYWdlLCBpc0luY29taW5nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBEUDtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuaW1wb3J0IE9wZXJhdG9ycyBmcm9tICcuLi9PcGVyYXRvcnMnO1xyXG5cclxuLyoqXHJcbiogQGF1dGhvciBBbmEgQ2FsZGVpcmEgPGFuYS5jYWxkZWlyYUB0ZWNuaWNvLnVsaXNib2EucHQ+XHJcbiogQGNsYXNzZGVzYyBDbGFzcyB0byByZXByZXNlbnQgYSBjb25kaXRpb24gYW5kIGV2YWx1YXRlIGl0cyBhcHBsaWNhYmlsaXR5LlxyXG4qL1xyXG5jbGFzcyBDb25kaXRpb24ge1xyXG5cclxuICAvKipcclxuICAqIENyZWF0ZXMgYSBuZXcgQ29uZGl0aW9uLlxyXG4gICogQGNsYXNzXHJcbiAgKiBAcGFyYW0gIHtzdHJpbmd9ICBhdHRyaWJ1dGVcclxuICAqIEBwYXJhbSAge3N0cmluZ30gIG9wZXJhdG9yXHJcbiAgKiBAcGFyYW0gIHsqfSAgICAgICBwYXJhbXNcclxuICAqL1xyXG4gIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZSwgb3BlcmF0b3IsIHBhcmFtcykge1xyXG4gICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7XHJcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XHJcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgIHRoaXMub3BlcmF0b3JzID0gbmV3IE9wZXJhdG9ycygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBWZXJpZmllcyBpZiB0aGUgY29uZGl0aW9uIGlzIGFwcGxpY2FibGUgdG8gdGhlIG1lc3NhZ2UuIEZpcnN0LCB0aGUgc3lzdGVtIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGF0dHJpYnV0ZSBpcyByZXRyaWV2ZWQ7IHRoZW4sIHRoYXQgdmFsdWUgaXMgY29tcGFyZWQgd2l0aCB0aGUgcGFyYW1ldGVyIHNwZWNpZmllZCBpbiB0aGUgY29uZGl0aW9uIGJ5IGV4ZWN1dGluZyB0aGUgb3BlcmF0b3IgaW1wbGVtZW50YXRpb24uIElmIHRoZSBvcGVyYXRvciBpcyAnaW4nIGFuZCB0aGUgbmFtZSBvZiBhIGdyb3VwIGlzIGdpdmVuLCB0aGVuIHRoZSBhcnJheSBob2xkaW5nIHRoZSBtZW1iZXJzIG9mIHRoZSBncm91cCBpcyByZXRyaWV2ZWQgYmVmb3JlIHRoZSBjb21wYXJpc29uLlxyXG4gICogQHBhcmFtICB7T2JqZWN0fSAgICBjb250ZXh0ICAgZW52aXJvbm1lbnQgd2hlcmUgdGhlIFBvbGljeSBFbmdpbmUgaXMgYmVpbmcgdXNlZFxyXG4gICogQHBhcmFtICB7T2JqZWN0fSAgICBtZXNzYWdlXHJcbiAgKi9cclxuICBpc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSkge1xyXG4gICAgY29udGV4dFt0aGlzLmF0dHJpYnV0ZV0gPSB7IG1lc3NhZ2U6IG1lc3NhZ2UgfTtcclxuICAgIGxldCB2YWx1ZSA9IGNvbnRleHRbdGhpcy5hdHRyaWJ1dGVdO1xyXG4gICAgbGV0IHRlbXBQYXJhbTtcclxuXHJcbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJ2luJykge1xyXG4gICAgICBpZiAoIShBcnJheS5pc0FycmF5KHRoaXMucGFyYW1zKSkpIHtcclxuICAgICAgICB0ZW1wUGFyYW0gPSBjb250ZXh0LmdldEdyb3VwKHRoaXMucGFyYW1zLCBtZXNzYWdlLnRvKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0oW3RlbXBQYXJhbSwgdmFsdWVdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yc1t0aGlzLm9wZXJhdG9yXShbdGhpcy5wYXJhbXMsIHZhbHVlXSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29uZGl0aW9uO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG5pbXBvcnQgQ29uZGl0aW9uIGZyb20gJy4vQ29uZGl0aW9uJztcclxuXHJcbi8qKlxyXG4qIEBhdXRob3IgQW5hIENhbGRlaXJhIDxhbmEuY2FsZGVpcmFAdGVjbmljby51bGlzYm9hLnB0PlxyXG4qIEBjbGFzc2Rlc2MgQ2xhc3MgdG8gcmVwcmVzZW50IGEgc3Vic2NyaXB0aW9uIGNvbmRpdGlvbiBhbmQgZXZhbHVhdGUgaXRzIGFwcGxpY2FiaWxpdHkuXHJcbiovXHJcbmNsYXNzIFN1YnNjcmlwdGlvbkNvbmRpdGlvbiBleHRlbmRzIENvbmRpdGlvbiB7XHJcblxyXG4gIC8qKlxyXG4gICogQ3JlYXRlcyBhIG5ldyBTdWJzY3JpcHRpb25Db25kaXRpb24uXHJcbiAgKiBAY2xhc3NcclxuICAqIEBwYXJhbSAge3N0cmluZ30gIGF0dHJpYnV0ZVxyXG4gICogQHBhcmFtICB7c3RyaW5nfSAgb3BlcmF0b3JcclxuICAqIEBwYXJhbSAgeyp9ICAgICAgIHBhcmFtc1xyXG4gICovXHJcbiAgY29uc3RydWN0b3IoYXR0cmlidXRlLCBvcGVyYXRvciwgcGFyYW1zKSB7XHJcbiAgICBzdXBlcihhdHRyaWJ1dGUsIG9wZXJhdG9yLCBwYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBWZXJpZmllcyBpZiB0aGUgc3Vic2NyaXB0aW9uIGNvbmRpdGlvbiBpcyBhcHBsaWNhYmxlIHRvIHRoZSBtZXNzYWdlLiBGaXJzdCwgdmVyaWZpZXMgaWYgdGhlIG1lc3NhZ2UgaXMgb2YgdGhlIHN1YnNjcmlwdGlvbiB0eXBlOyBzZWNvbmQsIHZlcmlmaWVzIGlmIHRoZSBtZXNzYWdlIGlzIGZyb20gYSByZW1vdGUgcnVudGltZSB0byBndWFyYW50ZWUgdGhhdCB0aGUgc3Vic2NyaXB0aW9uIGlzIGJlaW5nIHZhbGlkYXRlZCBpbiB0aGUgZGVzdGluYXRpb24gcnVudGltZTsgdGhpcmQsIHZlcmlmaWVzIGlmIHRoZSBzdWJzY3JpcHRpb24gcHJlZmVyZW5jZSBpcyBtZXQuXHJcbiAgKiBAcGFyYW0gIHtPYmplY3R9ICAgIGNvbnRleHQgICBlbnZpcm9ubWVudCB3aGVyZSB0aGUgUG9saWN5IEVuZ2luZSBpcyBiZWluZyB1c2VkXHJcbiAgKiBAcGFyYW0gIHtPYmplY3R9ICAgIG1lc3NhZ2VcclxuICAqL1xyXG4gIGlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlKSB7XHJcbiAgICBsZXQgaXNTdWJzY3JpcHRpb24gPSBtZXNzYWdlLnR5cGUgPT09ICdzdWJzY3JpYmUnO1xyXG4gICAgbGV0IGlzRnJvbVJlbW90ZVNNID0gY29udGV4dC5pc0Zyb21SZW1vdGVTTShtZXNzYWdlLmZyb20pO1xyXG4gICAgaWYgKGlzU3Vic2NyaXB0aW9uICYgaXNGcm9tUmVtb3RlU00pIHtcclxuICAgICAgcmV0dXJuIHN1cGVyLmlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdWJzY3JpcHRpb25Db25kaXRpb247XHJcbiIsImltcG9ydCBDb25kaXRpb24gZnJvbSAnLi9Db25kaXRpb24nO1xyXG5pbXBvcnQgT3BlcmF0b3JzIGZyb20gJy4uL09wZXJhdG9ycyc7XHJcbmltcG9ydCBTdWJzY3JpcHRpb25Db25kaXRpb24gZnJvbSAnLi9TdWJzY3JpcHRpb25Db25kaXRpb24nO1xyXG5cclxuY2xhc3MgQWR2YW5jZWRDb25kaXRpb24ge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb25kaXRpb24pIHtcclxuICAgIHRoaXMub3BlcmF0b3JzID0gbmV3IE9wZXJhdG9ycygpO1xyXG4gICAgaWYgKGNvbmRpdGlvbi5vcGVyYXRvcnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uY29uZGl0aW9uO1xyXG4gICAgfVxyXG4gICAgY29uZGl0aW9uID0gdGhpcy5idWlsZENvbmRpdGlvbihjb25kaXRpb24pO1xyXG4gICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XHJcbiAgfVxyXG5cclxuICBidWlsZENvbmRpdGlvbihjb25kaXRpb24pIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmRpdGlvblsxXSkpIHtcclxuICAgICAgY29uZGl0aW9uWzFdID0gdGhpcy5idWlsZENvbmRpdGlvbihjb25kaXRpb25bMV0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGNvbmRpdGlvblsxXS5hdHRyaWJ1dGUgPT09ICdzdWJzY3JpcHRpb24nKSB7XHJcbiAgICAgICAgY29uZGl0aW9uWzFdID0gbmV3IFN1YnNjcmlwdGlvbkNvbmRpdGlvbihjb25kaXRpb25bMV0uYXR0cmlidXRlLCBjb25kaXRpb25bMV0ub3BlcmF0b3IsIGNvbmRpdGlvblsxXS5wYXJhbXMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbmRpdGlvblsxXSA9IG5ldyBDb25kaXRpb24oY29uZGl0aW9uWzFdLmF0dHJpYnV0ZSwgY29uZGl0aW9uWzFdLm9wZXJhdG9yLCBjb25kaXRpb25bMV0ucGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25kaXRpb25bMl0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25kaXRpb25bMl0pKSB7XHJcbiAgICAgICAgY29uZGl0aW9uWzJdID0gdGhpcy5idWlsZENvbmRpdGlvbihjb25kaXRpb25bMl0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChjb25kaXRpb25bMl0uYXR0cmlidXRlID09PSAnc3Vic2NyaXB0aW9uJykge1xyXG4gICAgICAgICAgY29uZGl0aW9uWzJdID0gbmV3IFN1YnNjcmlwdGlvbkNvbmRpdGlvbihjb25kaXRpb25bMl0uYXR0cmlidXRlLCBjb25kaXRpb25bMl0ub3BlcmF0b3IsIGNvbmRpdGlvblsyXS5wYXJhbXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25kaXRpb25bMl0gPSBuZXcgQ29uZGl0aW9uKGNvbmRpdGlvblsyXS5hdHRyaWJ1dGUsIGNvbmRpdGlvblsyXS5vcGVyYXRvciwgY29uZGl0aW9uWzJdLnBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29uZGl0aW9uO1xyXG4gIH1cclxuXHJcbiAgaXNBcHBsaWNhYmxlKGNvbnRleHQsIG1lc3NhZ2UsIHNjb3BlLCB0YXJnZXQsIG9wZXJhdG9yLCBsZWZ0LCByaWdodCkge1xyXG4gICAgaWYgKCFvcGVyYXRvcikge1xyXG4gICAgICBvcGVyYXRvciA9IHRoaXMuY29uZGl0aW9uWzBdO1xyXG4gICAgICBsZWZ0ID0gdGhpcy5jb25kaXRpb25bMV07XHJcbiAgICAgIHJpZ2h0ID0gdGhpcy5jb25kaXRpb25bMl07XHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUgKCEobGVmdCBpbnN0YW5jZW9mIENvbmRpdGlvbikgJiAhKGxlZnQgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb25Db25kaXRpb24pICYgKHR5cGVvZiBsZWZ0ICE9PSAnYm9vbGVhbicpKSB7XHJcbiAgICAgIGxlZnQgPSB0aGlzLmlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlLCBzY29wZSwgdGFyZ2V0LCBsZWZ0WzBdLCBsZWZ0WzFdLCBsZWZ0WzJdKTtcclxuICAgIH1cclxuICAgIGlmIChyaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHdoaWxlICghKHJpZ2h0IGluc3RhbmNlb2YgQ29uZGl0aW9uKSAmICEocmlnaHQgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb25Db25kaXRpb24pICYgKHR5cGVvZiByaWdodCAhPT0gJ2Jvb2xlYW4nKSkge1xyXG4gICAgICAgIHJpZ2h0ID0gdGhpcy5pc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSwgc2NvcGUsIHRhcmdldCwgcmlnaHRbMF0sIHJpZ2h0WzFdLCByaWdodFsyXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0TGVmdCA9ICh0eXBlb2YgbGVmdCA9PT0gJ2Jvb2xlYW4nKSA/IGxlZnQgOiBsZWZ0LmlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlLCBzY29wZSwgdGFyZ2V0KTtcclxuICAgIGxldCByZXN1bHRSaWdodDtcclxuICAgIGlmIChyaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJlc3VsdFJpZ2h0ID0gKHR5cGVvZiByaWdodCA9PT0gJ2Jvb2xlYW4nKSA/IHJpZ2h0IDogcmlnaHQuaXNBcHBsaWNhYmxlKGNvbnRleHQsIG1lc3NhZ2UsIHNjb3BlLCB0YXJnZXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0b3JzW29wZXJhdG9yXShbcmVzdWx0TGVmdCwgcmVzdWx0UmlnaHRdKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBZHZhbmNlZENvbmRpdGlvbjtcclxuIiwiaW1wb3J0IEFkdmFuY2VkQ29uZGl0aW9uIGZyb20gJy4vY29uZGl0aW9ucy9BZHZhbmNlZENvbmRpdGlvbic7XHJcbmltcG9ydCBDb25kaXRpb24gZnJvbSAnLi9jb25kaXRpb25zL0NvbmRpdGlvbic7XHJcbmltcG9ydCB7Z2V0VXNlckVtYWlsRnJvbVVSTCwgaXNEYXRhT2JqZWN0VVJMLCByZW1vdmVQYXRoRnJvbVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgU3Vic2NyaXB0aW9uQ29uZGl0aW9uIGZyb20gJy4vY29uZGl0aW9ucy9BZHZhbmNlZENvbmRpdGlvbic7XHJcblxyXG5jbGFzcyBSdWxlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoZGVjaXNpb24sIGNvbmRpdGlvbiwgc2NvcGUsIHRhcmdldCwgcHJpb3JpdHkpIHtcclxuICAgIHRoaXMuZGVjaXNpb24gPSBkZWNpc2lvbjtcclxuICAgIHRoaXMuc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7XHJcbiAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7XHJcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XHJcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICB9XHJcblxyXG4gIHNldENvbmRpdGlvbihjb25kaXRpb24pIHtcclxuICAgIGlmICghKGNvbmRpdGlvbiBpbnN0YW5jZW9mIENvbmRpdGlvbiB8fCBjb25kaXRpb24gaW5zdGFuY2VvZiBTdWJzY3JpcHRpb25Db25kaXRpb24gfHwgY29uZGl0aW9uIGluc3RhbmNlb2YgQWR2YW5jZWRDb25kaXRpb24pKSB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGUgPSBjb25kaXRpb24uYXR0cmlidXRlO1xyXG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGNhc2UgJ3N1YnNjcmlwdGlvbic6XHJcbiAgICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IG5ldyBTdWJzY3JpcHRpb25Db25kaXRpb24oY29uZGl0aW9uLmF0dHJpYnV0ZSwgY29uZGl0aW9uLm9wZXJhdG9yLCBjb25kaXRpb24ucGFyYW1zKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgdW5kZWZpbmVkOlxyXG4gICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBuZXcgQWR2YW5jZWRDb25kaXRpb24oY29uZGl0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oY29uZGl0aW9uLmF0dHJpYnV0ZSwgY29uZGl0aW9uLm9wZXJhdG9yLCBjb25kaXRpb24ucGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZShjb250ZXh0LCBtZXNzYWdlLCBpc0luY29taW5nKSB7XHJcbiAgICBsZXQgZmllbGQgPSAoaXNJbmNvbWluZykgPyBtZXNzYWdlLnRvIDogbWVzc2FnZS5mcm9tO1xyXG4gICAgbGV0IGh5cGVydHlOYW1lO1xyXG4gICAgc3dpdGNoICh0aGlzLnNjb3BlKSB7XHJcbiAgICAgIGNhc2UgJ2dsb2JhbCc6XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdoeXBlcnR5JzpcclxuICAgICAgICBpZiAoaXNEYXRhT2JqZWN0VVJMKGZpZWxkKSkge1xyXG4gICAgICAgICAgbGV0IHJlcG9ydGVyID0gY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZ2V0UmVwb3J0ZXJVUkxTeW5jaG9ub3VzKHJlbW92ZVBhdGhGcm9tVVJMKGZpZWxkKSk7XHJcbiAgICAgICAgICBpZiAocmVwb3J0ZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBoeXBlcnR5TmFtZSA9IGNvbnRleHQucnVudGltZVJlZ2lzdHJ5LmdldEh5cGVydHlOYW1lKHJlcG9ydGVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGZpZWxkLnNwbGl0KCc6Ly8nKVswXSA9PT0gJ2h5cGVydHknKSB7XHJcbiAgICAgICAgICAgIGh5cGVydHlOYW1lID0gY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZ2V0SHlwZXJ0eU5hbWUocmVtb3ZlUGF0aEZyb21VUkwoZmllbGQpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGh5cGVydHlOYW1lID09PSB0aGlzLnRhcmdldCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gJ05vdCBBcHBsaWNhYmxlJztcclxuXHJcbiAgICAgIGNhc2UgJ2lkZW50aXR5JzpcclxuICAgICAgICBsZXQgb3duZXI7XHJcblxyXG4gICAgICAgIGlmIChpc0RhdGFPYmplY3RVUkwoZmllbGQpKSB7XHJcbiAgICAgICAgICBsZXQgcmVwb3J0ZXIgPSBjb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5nZXRSZXBvcnRlclVSTFN5bmNob25vdXMocmVtb3ZlUGF0aEZyb21VUkwoZmllbGQpKTtcclxuICAgICAgICAgIG93bmVyID0gY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKHJlcG9ydGVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGZpZWxkLnNwbGl0KCc6Ly8nKVswXSA9PT0gJ2h5cGVydHknKSB7XHJcbiAgICAgICAgICAgIG93bmVyID0gY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKHJlbW92ZVBhdGhGcm9tVVJMKGZpZWxkKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvd25lciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBvd25lciA9IGdldFVzZXJFbWFpbEZyb21VUkwob3duZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3duZXIgPT09IHRoaXMudGFyZ2V0KSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAnTm90IEFwcGxpY2FibGUnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmRpdGlvbi5pc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSwgdGhpcy5zY29wZSwgdGhpcy50YXJnZXQpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlY2lzaW9uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdOb3QgQXBwbGljYWJsZSc7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSdWxlO1xyXG4iLCJpbXBvcnQgQWxsb3dPdmVycmlkZXMgZnJvbSAnLi9jb21iaW5pbmdBbGdvcml0aG1zL0FsbG93T3ZlcnJpZGVzJztcclxuaW1wb3J0IEJsb2NrT3ZlcnJpZGVzIGZyb20gJy4vY29tYmluaW5nQWxnb3JpdGhtcy9CbG9ja092ZXJyaWRlcyc7XHJcbmltcG9ydCBGaXJzdEFwcGxpY2FibGUgZnJvbSAnLi9jb21iaW5pbmdBbGdvcml0aG1zL0ZpcnN0QXBwbGljYWJsZSc7XHJcbmltcG9ydCBSdWxlIGZyb20gJy4vUnVsZSc7XHJcblxyXG5jbGFzcyBQb2xpY3kge1xyXG5cclxuICBjb25zdHJ1Y3RvcihrZXksIHJ1bGVzLCBhY3Rpb25zLCBjb21iaW5pbmdBbGdvcml0aG0pIHtcclxuICAgIGlmICgha2V5KSB0aHJvdyBuZXcgRXJyb3IoJ2tleSBpcyBub3QgZGVmaW5lZCcpO1xyXG4gICAgaWYgKCFhY3Rpb25zKSB0aHJvdyBuZXcgRXJyb3IoJ2FjdGlvbnMgYXJlIG5vdCBkZWZpbmVkJyk7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25zID0gYWN0aW9ucztcclxuICAgIHRoaXMua2V5ID0ga2V5O1xyXG4gICAgdGhpcy5fc2V0UnVsZXMocnVsZXMpO1xyXG4gICAgdGhpcy5fc2V0Q29tYmluaW5nQWxnb3JpdGhtKGNvbWJpbmluZ0FsZ29yaXRobSk7XHJcbiAgfVxyXG5cclxuICBhZGRBY3Rpb24obWV0aG9kLCBwYXJhbSkge1xyXG4gICAgdGhpcy5hY3Rpb25zLnB1c2goeyBtZXRob2Q6IG1ldGhvZCwgcGFyYW06IHBhcmFtIH0pO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlUnVsZShkZWNpc2lvbiwgY29uZGl0aW9uLCBzY29wZSwgdGFyZ2V0LCBwcmlvcml0eSkge1xyXG4gICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcHJpb3JpdHkgPSB0aGlzLmdldExhc3RQcmlvcml0eSgpICsgMTtcclxuICAgIH1cclxuICAgIGxldCBydWxlID0gbmV3IFJ1bGUoZGVjaXNpb24sIGNvbmRpdGlvbiwgc2NvcGUsIHRhcmdldCwgcHJpb3JpdHkpO1xyXG4gICAgdGhpcy5ydWxlcy5wdXNoKHJ1bGUpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlUnVsZShydWxlKSB7XHJcbiAgICBsZXQgaW5kZXhUb1JlbW92ZSA9IHRoaXMucnVsZXMuaW5kZXhPZihydWxlKTtcclxuICAgIHRoaXMucnVsZXMuc3BsaWNlKGluZGV4VG9SZW1vdmUsIDEpO1xyXG4gIH1cclxuXHJcbiAgZW5mb3JjZUFjdGlvbnMoY29udGV4dCwgbWVzc2FnZSkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcclxuICAgICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGggIT09IDApIHtcclxuICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMuYWN0aW9ucykge1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IGNvbnRleHQucGVwLmFjdGlvbnNTZXJ2aWNlW3RoaXMuYWN0aW9uc1tpXS5tZXRob2RdKG1lc3NhZ2UsIHRoaXMuYWN0aW9uc1tpXS5wYXJhbSk7XHJcbiAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgUHJvbWlzZS5hbGwocmVzdWx0cykudGhlbigobWVzc2FnZXMpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUobWVzc2FnZXMpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShbbWVzc2FnZV0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlUnVsZXMoY29udGV4dCwgbWVzc2FnZSwgaXNJbmNvbWluZykge1xyXG4gICAgbGV0IHJlc3VsdHMgPSBbXTtcclxuICAgIGZvciAobGV0IGkgaW4gdGhpcy5ydWxlcykge1xyXG4gICAgICByZXN1bHRzLnB1c2godGhpcy5ydWxlc1tpXS5ldmFsdWF0ZShjb250ZXh0LCBtZXNzYWdlLCBpc0luY29taW5nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29tYmluaW5nQWxnb3JpdGhtLmNvbWJpbmUocmVzdWx0cyk7XHJcbiAgfVxyXG5cclxuICBnZXRMYXN0UHJpb3JpdHkoKSB7XHJcbiAgICBsZXQgcHJpb3JpdGllcyA9IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLnJ1bGVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICBmb3IgKGxldCBpIGluIHRoaXMucnVsZXMpIHtcclxuICAgICAgICBwcmlvcml0aWVzLnB1c2godGhpcy5ydWxlc1tpXS5wcmlvcml0eSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsIHByaW9yaXRpZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UnVsZUJ5UHJpb3JpdHkocHJpb3JpdHkpIHtcclxuICAgIGZvciAobGV0IGkgaW4gdGhpcy5ydWxlcykge1xyXG4gICAgICBpZiAoU3RyaW5nKHRoaXMucnVsZXNbaV0ucHJpb3JpdHkpID09PSBTdHJpbmcocHJpb3JpdHkpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucnVsZXNbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRocm93IEVycm9yKCdSdWxlIHdpdGggcHJpb3JpdHkgJyArIHByaW9yaXR5ICsgJyBkb2VzIG5vdCBleGlzdCEnKTtcclxuICB9XHJcblxyXG4gIF9zZXRDb21iaW5pbmdBbGdvcml0aG0oY29tYmluaW5nQWxnb3JpdGhtKSB7XHJcbiAgICBpZiAoIWNvbWJpbmluZ0FsZ29yaXRobSkge1xyXG4gICAgICBjb21iaW5pbmdBbGdvcml0aG0gPSAnYmxvY2tPdmVycmlkZXMnO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoIChjb21iaW5pbmdBbGdvcml0aG0pIHtcclxuICAgICAgY2FzZSAnYmxvY2tPdmVycmlkZXMnOlxyXG4gICAgICAgIHRoaXMuY29tYmluaW5nQWxnb3JpdGhtID0gbmV3IEJsb2NrT3ZlcnJpZGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2FsbG93T3ZlcnJpZGVzJzpcclxuICAgICAgICB0aGlzLmNvbWJpbmluZ0FsZ29yaXRobSA9IG5ldyBBbGxvd092ZXJyaWRlcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdmaXJzdEFwcGxpY2FibGUnOlxyXG4gICAgICAgIHRoaXMuY29tYmluaW5nQWxnb3JpdGhtID0gbmV3IEZpcnN0QXBwbGljYWJsZSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIGFsZ29yaXRobTogJyArIGNvbWJpbmluZ0FsZ29yaXRobSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfc2V0UnVsZXMocnVsZXMpIHtcclxuICAgIHRoaXMucnVsZXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpIGluIHJ1bGVzKSB7XHJcbiAgICAgIGxldCBydWxlID0gcnVsZXNbaV07XHJcbiAgICAgIGlmIChydWxlLnByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBydWxlLnByaW9yaXR5ID0gdGhpcy5nZXRMYXN0UHJpb3JpdHkoKSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCEocnVsZSBpbnN0YW5jZW9mIFJ1bGUpKSB7XHJcbiAgICAgICAgcnVsZSA9IG5ldyBSdWxlKHJ1bGUuZGVjaXNpb24sIHJ1bGUuY29uZGl0aW9uLCBydWxlLnNjb3BlLCBydWxlLnRhcmdldCwgcnVsZS5wcmlvcml0eSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ydWxlcy5wdXNoKHJ1bGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc29ydFJ1bGVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucnVsZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XHJcbiAgICAgIGxldCB4ID0gYS5wcmlvcml0eTsgbGV0IHkgPSBiLnByaW9yaXR5O1xyXG4gICAgICByZXR1cm4gKCh4IDwgeSkgPyAtMSA6ICgoeCA+IHkpID8gMSA6IDApKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvbGljeTtcclxuIiwiLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignUEVQJyk7XHJcblxyXG5pbXBvcnQgQWN0aW9uc1NlcnZpY2UgZnJvbSAnLi9BY3Rpb25zU2VydmljZSc7XHJcbmltcG9ydCBQRFAgZnJvbSAnLi9QRFAnO1xyXG5pbXBvcnQgUG9saWN5IGZyb20gJy4vUG9saWN5JztcclxuaW1wb3J0IHtpc0h5cGVydHlVUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbmNsYXNzIFBFUCB7XHJcblxyXG4gIC8qKlxyXG4gICogQ3JlYXRlcyBhIFBvbGljeSBFbmZvcmNlbWVudCBQb2ludCAoUEVQKSBpbnN0YW5jZVxyXG4gICogQHBhcmFtICAgIHtPYmplY3R9ICAgIGNvbnRleHRcclxuICAqL1xyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMucGRwID0gbmV3IFBEUChjb250ZXh0KTtcclxuICAgIF90aGlzLmFjdGlvbnNTZXJ2aWNlID0gbmV3IEFjdGlvbnNTZXJ2aWNlKGNvbnRleHQpO1xyXG4gICAgX3RoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICBjb250ZXh0LnBlcCA9IF90aGlzO1xyXG5cclxuICAgIC8vVE9ETyBzaG91bGQgYmUgYWRkZWQgYSB0cmlnZ2VyIHRvIHZlcmlmeSB3aGVuIHRoZSBsb2FkQ29uZmlndXJhdGlvbnMgaXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZFxyXG4gICAgY29udGV4dC5sb2FkQ29uZmlndXJhdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogcmV0dXJuIHRoZSBtZXNzYWdlQnVzIGluIHRoaXMgUmVnaXN0cnlcclxuICAqIEBwYXJhbSB7TWVzc2FnZUJ1c30gICAgICAgICAgIG1lc3NhZ2VCdXNcclxuICAqL1xyXG4gIGdldCBtZXNzYWdlQnVzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5jb250ZXh0Lm1lc3NhZ2VCdXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNldCB0aGUgbWVzc2FnZUJ1cyBpbiB0aGlzIFJlZ2lzdHJ5XHJcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXHJcbiAgKi9cclxuICBzZXQgbWVzc2FnZUJ1cyhtZXNzYWdlQnVzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuY29udGV4dC5tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcclxuICAgIF90aGlzLmFkZEdVSUxpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgYWRkR1VJTGlzdGVuZXJzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5jb250ZXh0Lm1lc3NhZ2VCdXMuYWRkTGlzdGVuZXIoX3RoaXMuY29udGV4dC5wZXBVUkwsIChtc2cpID0+IHtcclxuICAgICAgbGV0IGZ1bmNOYW1lID0gbXNnLmJvZHkubWV0aG9kO1xyXG5cclxuICAgICAgbGV0IHJldHVybmVkVmFsdWU7XHJcbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gJ2FkZFRvR3JvdXAnKSB7XHJcbiAgICAgICAgbGV0IGdyb3VwTmFtZSA9IG1zZy5ib2R5LnBhcmFtcy5ncm91cE5hbWU7XHJcbiAgICAgICAgbGV0IHVzZXJFbWFpbCA9IG1zZy5ib2R5LnBhcmFtcy51c2VyRW1haWw7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuYWRkVG9Hcm91cChncm91cE5hbWUsIHVzZXJFbWFpbCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdjcmVhdGVHcm91cCcpIHtcclxuICAgICAgICBsZXQgZ3JvdXBOYW1lID0gbXNnLmJvZHkucGFyYW1zLmdyb3VwTmFtZTtcclxuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC5jcmVhdGVHcm91cChncm91cE5hbWUpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnYWRkUG9saWN5Jykge1xyXG4gICAgICAgIGxldCBzb3VyY2UgPSBtc2cuYm9keS5wYXJhbXMuc291cmNlO1xyXG4gICAgICAgIGxldCBrZXkgPSBtc2cuYm9keS5wYXJhbXMua2V5O1xyXG4gICAgICAgIGxldCBwb2xpY3kgPSBtc2cuYm9keS5wYXJhbXMucG9saWN5O1xyXG4gICAgICAgIGxldCBjb21iaW5pbmdBbGdvcml0aG0gPSBtc2cuYm9keS5wYXJhbXMuY29tYmluaW5nQWxnb3JpdGhtO1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5hZGRQb2xpY3koc291cmNlLCBrZXksIHBvbGljeSwgY29tYmluaW5nQWxnb3JpdGhtKTtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2RlbGV0ZUdyb3VwJykge1xyXG4gICAgICAgIGxldCBncm91cE5hbWUgPSBtc2cuYm9keS5wYXJhbXMuZ3JvdXBOYW1lO1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LmRlbGV0ZUdyb3VwKGdyb3VwTmFtZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdyZW1vdmVQb2xpY3knKSB7XHJcbiAgICAgICAgbGV0IHNvdXJjZSA9IG1zZy5ib2R5LnBhcmFtcy5zb3VyY2U7XHJcbiAgICAgICAgbGV0IGtleSA9IG1zZy5ib2R5LnBhcmFtcy5rZXk7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLnJlbW92ZVBvbGljeShzb3VyY2UsIGtleSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdzYXZlUG9saWNpZXMnKSB7XHJcbiAgICAgICAgbGV0IHNvdXJjZSA9IG1zZy5ib2R5LnBhcmFtcy5zb3VyY2U7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuc2F2ZVBvbGljaWVzKHNvdXJjZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICd1c2VyUG9saWNpZXMnKSB7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQudXNlclBvbGljaWVzO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnYWN0aXZlVXNlclBvbGljeScpIHtcclxuICAgICAgICBsZXQgdXNlclBvbGljeSA9IG1zZy5ib2R5LnBhcmFtcy51c2VyUG9saWN5O1xyXG4gICAgICAgIGlmICh1c2VyUG9saWN5KSB7IF90aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeSA9IHVzZXJQb2xpY3k7IH1cclxuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC5hY3RpdmVVc2VyUG9saWN5O1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAndXNlclBvbGljeScpIHtcclxuICAgICAgICBsZXQga2V5ID0gbXNnLmJvZHkucGFyYW1zLmtleTtcclxuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC51c2VyUG9saWNpZXNba2V5XTtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ3NhdmVBY3RpdmVQb2xpY3knKSB7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuc2F2ZUFjdGl2ZVBvbGljeSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnZ2V0TXlFbWFpbHMnKSB7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuZ2V0TXlFbWFpbHMoKTtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2dldE15SHlwZXJ0aWVzJykge1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LmdldE15SHlwZXJ0aWVzKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdncm91cHMnKSB7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuZ3JvdXBzO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnZ2V0R3JvdXBzTmFtZXMnKSB7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuZ2V0R3JvdXBzTmFtZXMoKTtcclxuICAgICAgfSBpZiAoZnVuY05hbWUgPT09ICdyZW1vdmVGcm9tR3JvdXAnKSB7XHJcbiAgICAgICAgbGV0IGdyb3VwTmFtZSA9IG1zZy5ib2R5LnBhcmFtcy5ncm91cE5hbWU7XHJcbiAgICAgICAgbGV0IHVzZXJFbWFpbCA9IG1zZy5ib2R5LnBhcmFtcy51c2VyRW1haWw7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQucmVtb3ZlRnJvbUdyb3VwKGdyb3VwTmFtZSwgdXNlckVtYWlsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHZhbHVlID0ge3R5cGU6ICdleGVjdXRlJywgdmFsdWU6IHJldHVybmVkVmFsdWUsIGNvZGU6IDIwMH07XHJcbiAgICAgIGxldCByZXBseU1zZyA9IHtpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCB0bzogbXNnLmZyb20sIGZyb206IG1zZy50bywgYm9keTogdmFsdWV9O1xyXG4gICAgICBfdGhpcy5jb250ZXh0Lm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFkZHMgYSBwb2xpY3kgdG8gdGhlIFBvbGljeSBFbmZvcmNlbWVudCBQb2ludCAoUEVQKS4gVGhlIHBvbGljeSBjYW4gYmUgY3JlYXRlZCBieSB0aGUgc2VydmljZVxyXG4gICogcHJvdmlkZXIgb3IgYnkgdGhlIHVzZXIuXHJcbiAgKiBAcGFyYW0gICAge1N0cmluZ30gICAgc291cmNlXHJcbiAgKiBAcGFyYW0gICAge1N0cmluZ30gICAga2V5XHJcbiAgKiBAcGFyYW0gICAge09iamVjdH0gICAgcG9saWN5XHJcbiAgKi9cclxuICBhZGRQb2xpY3koc291cmNlLCBrZXksIHBvbGljeSwgY29tYmluaW5nQWxnb3JpdGhtKSB7XHJcbiAgICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IEVycm9yKCdzb3VyY2UgaXMgbm90IGRlZmluZWQnKTtcclxuICAgIGlmICgha2V5KSB0aHJvdyBuZXcgRXJyb3IoJ2tleSBpcyBub3QgZGVmaW5lZCcpO1xyXG5cclxuICAgIGlmIChwb2xpY3kgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBwb2xpY3kgPSBuZXcgUG9saWN5KGtleSwgW10sIFtdLCBjb21iaW5pbmdBbGdvcml0aG0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCEocG9saWN5IGluc3RhbmNlb2YgUG9saWN5KSkge1xyXG4gICAgICAgIHBvbGljeSA9IG5ldyBQb2xpY3kocG9saWN5LmtleSwgcG9saWN5LnJ1bGVzLCBwb2xpY3kuYWN0aW9ucywgcG9saWN5LmNvbWJpbmluZ0FsZ29yaXRobSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHNvdXJjZSkge1xyXG4gICAgICBjYXNlICdTRVJWSUNFX1BST1ZJREVSJzpcclxuICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZVBvbGljaWVzKHNvdXJjZSwgcG9saWN5LCBrZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdVU0VSJzpcclxuICAgICAgICB0aGlzLmNvbnRleHQudXNlclBvbGljaWVzW2tleV0gPSBwb2xpY3k7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcyhzb3VyY2UpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIHBvbGljeSBzb3VyY2U6ICcgKyBzb3VyY2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXV0aG9yaXNlKG1lc3NhZ2UsIGlzSW5jb21pbmcpIHtcclxuICAgIC8vIGxvZy5sb2coJ1tQb2xpY3kuUEVQIEF1dGhvcmlzZV0gJywgbWVzc2FnZSk7XHJcbiAgICAvLyBsb2cubG9nKG1lc3NhZ2UpO1xyXG4gICAgaWYgKCFtZXNzYWdlKSB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgaXMgbm90IGRlZmluZWQnKTtcclxuICAgIGlmICghbWVzc2FnZS5mcm9tKSB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UuZnJvbSBpcyBub3QgZGVmaW5lZCcpO1xyXG4gICAgaWYgKCFtZXNzYWdlLnRvKSB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UudG8gaXMgbm90IGRlZmluZWQnKTtcclxuICAgIGlmICghbWVzc2FnZS50eXBlKSB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UudHlwZSBpcyBub3QgZGVmaW5lZCcpO1xyXG4gICAgbWVzc2FnZS5ib2R5ID0gbWVzc2FnZS5ib2R5IHx8IHt9O1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBtZXNzYWdlLmJvZHkgPSBtZXNzYWdlLmJvZHkgfHwge307XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICBsZXQgcmVzdWx0ID0gX3RoaXMucGRwLmV2YWx1YXRlUG9saWNpZXMobWVzc2FnZSwgaXNJbmNvbWluZyk7XHJcbiAgICAgIGlmIChyZXN1bHQgPT09ICdOb3QgQXBwbGljYWJsZScpIHtcclxuICAgICAgICByZXN1bHQgPSBfdGhpcy5jb250ZXh0LmRlZmF1bHRCZWhhdmlvdXI7XHJcbiAgICAgICAgbWVzc2FnZS5ib2R5LmF1dGggPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBfdGhpcy5hY3Rpb25zU2VydmljZS5lbmZvcmNlUG9saWNpZXMobWVzc2FnZSwgaXNJbmNvbWluZykudGhlbihtZXNzYWdlcyA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSBpbiBtZXNzYWdlcykge1xyXG4gICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICBtZXNzYWdlLmJvZHkuYXV0aCA9IChtZXNzYWdlLmJvZHkuYXV0aCA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBtZXNzYWdlLmJvZHkuYXV0aDtcclxuICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSB7IGJvZHk6IHsgY29kZTogNDAzLCBkZXNjcmlwdGlvbjogJ0Jsb2NrZWQgYnkgcG9saWN5JyB9LCBmcm9tOiBtZXNzYWdlLnRvLCB0bzogbWVzc2FnZS5mcm9tLCB0eXBlOiAncmVzcG9uc2UnIH07XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGF1dGhvcmlzZVN5bmMobWVzc2FnZSkge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIG1lc3NhZ2UuYm9keSA9IG1lc3NhZ2UuYm9keSB8fCB7fTtcclxuICAgIHJlc3VsdCA9IHRoaXMucGRwLmV2YWx1YXRlUG9saWNpZXMobWVzc2FnZSwgdHJ1ZSk7XHJcbiAgICBpZiAocmVzdWx0ID09PSAnTm90IEFwcGxpY2FibGUnKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuY29udGV4dC5kZWZhdWx0QmVoYXZpb3VyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgfVxyXG5cclxuICByZW1vdmVQb2xpY3koc291cmNlLCBrZXkpIHtcclxuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgRXJyb3IoJ3NvdXJjZSBpcyBub3QgZGVmaW5lZCcpO1xyXG4gICAgaWYgKHNvdXJjZSAhPT0gJyonICYmICFrZXkpIHRocm93IG5ldyBFcnJvcigna2V5IGlzIG5vdCBkZWZpbmVkJyk7XHJcblxyXG4gICAgc3dpdGNoIChzb3VyY2UpIHtcclxuICAgICAgY2FzZSAnKic6XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNlcnZpY2VQcm92aWRlclBvbGljeSA9IHt9O1xyXG4gICAgICAgIHRoaXMuY29udGV4dC51c2VyUG9saWNpZXMgPSB7fTtcclxuICAgICAgICB0aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZVBvbGljaWVzKCdVU0VSJyk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcygnU0VSVklDRV9QUk9WSURFUicpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlQWN0aXZlUG9saWN5KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1NFUlZJQ0VfUFJPVklERVInOlxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmNvbnRleHQuc2VydmljZVByb3ZpZGVyUG9saWN5W2tleV07XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdVU0VSJzpcclxuICAgICAgICBkZWxldGUgdGhpcy5jb250ZXh0LnVzZXJQb2xpY2llc1trZXldO1xyXG4gICAgICAgIGlmIChrZXkgPT09IHRoaXMuY29udGV4dC5hY3RpdmVVc2VyUG9saWN5KSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIHRoaXMuY29udGV4dC5zYXZlQWN0aXZlUG9saWN5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlUG9saWNpZXMoJ1VTRVInKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBwb2xpY3kgc291cmNlOiAnICsgc291cmNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQRVA7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFOQTtBQVFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQ3BHQTs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQzdDQTtBQUVBOzs7Ozs7OztBQU9BOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7OztBQzNDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUVBOzs7OztBQUlBOzs7QUFFQTs7Ozs7OztBQU9BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFFQTs7Ozs7QUFJQTs7Ozs7QUFFQTs7Ozs7OztBQU9BO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFFQTs7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUExQkE7QUFDQTtBQTZCQTs7Ozs7Ozs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7QUFJQTs7Ozs7Ozs7Ozs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBUkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF2Q0E7QUFDQTtBQXlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7OztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFYQTtBQWFBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDL0hBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7Ozs7QUFJQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBVEE7QUFXQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUF0QkE7QUF3QkE7OztBQXZMQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7Ozs7OztBQThLQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///23\n")}})}); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("PEP",[],t):"object"==typeof exports?exports.PEP=t():e.PEP=t()}(window,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=23)}({0:function(e,t,n){"use strict";function r(e){function t(e){return e.replace(/([a-zA-Z-]*)(:\/\/(?:\.)?|:)([-a-zA-Z0-9@:%._+~#=]{2,256})([-a-zA-Z0-9@:%._+~#=\/]*)/gi,"$1,$3,$4").split(",")}var n=t(e);if(n[0]===e&&!n[0].includes("@")){var r={type:"",domain:e,identity:""};return console.warn("[DivideURL] DivideURL don't support url without scheme. Please review your url address",e),r}return n[0]===e&&n[0].includes("@")&&(n=t((n[0]===e?"smtp":n[0])+"://"+n[0])),n[1].includes("@")&&(n[2]=n[0]+"://"+n[1],n[1]=n[1].substr(n[1].indexOf("@")+1)),{type:n[0],domain:n[1],identity:n[2]}}function o(e){return!(Object.keys(e).length>0)}function i(){return Math.floor(Date.now()/1e3)}function a(e){if(e)return JSON.parse(JSON.stringify(e))}function u(e){var t=e.split("/");return t[0]+"//"+t[2]+"/"+t[3]}function c(e){var t=r(e);return t.identity.replace("/","")+"@"+t.domain}function s(e){if("user://"===e.substring(0,7)){var t=r(e);if(t.domain&&t.identity)return e;throw"userURL with wrong format"}return function(e){var t=e.indexOf("@");return"user://"+e.substring(t+1,e.length)+"/"+e.substring(0,t)}(e)}function l(e){var t=e.split("://")[0];return-1===["domain-idp","runtime","domain","hyperty"].indexOf(t)}function f(e){return e.split("@").length>1}function p(e){return e.split("/").length>=3}function y(e){return"user"===r(e).type}function d(e){return"hyperty"===r(e).type}function v(e,t,n){return e[t][n]}function h(e,t,n,r){var o,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4],a=e[t];if(!a.hasOwnProperty(n))throw Error("The configuration "+JSON.stringify(a,"",2)+" don't have the "+n+" resource you are looking for");var u=a[n];return r?(o=u.prefix+e.domain+u.suffix+r,u.hasOwnProperty("fallback")&&i&&(o=u.fallback.indexOf("%domain%")?u.fallback.replace(/(%domain%)/g,e.domain)+r:u.fallback+r)):o=u.prefix+e.domain+u.suffix,o}function b(){function e(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}function g(e){var t=r(e).domain.split("."),n=t.length;return 1==n?t[n-1]:t[n-2]+"."+t[n-1]}function m(e){var t,n=r(e),o=n.domain.split("."),i=["registry","msg-node"];return o.length>1&&(t=o.filter(function(e){return-1!==i.indexOf(e)})[0]),!(!t||-1===i.indexOf(t))||!!n.type&&-1!==["domain","global","domain-idp"].indexOf(n.type)}function w(e){var t=e.indexOf("@");return{username:e.substring(0,t),domain:e.substring(t+1,e.length)}}function P(e,t,n){e||(e={}),"string"==typeof t&&(t=x(t));for(var r=t.length-1,o=0;o=0&&r<=c.levels.SILENT))throw"log.setLevel() called with invalid level: "+r;if(u=r,!1!==i&&function(e){var r=(n[e]||"silent").toUpperCase();if(typeof window!==t){try{return void(window.localStorage[s]=r)}catch(e){}try{window.document.cookie=encodeURIComponent(s)+"="+r+";"}catch(e){}}}(r),o.call(c,r,e),typeof console===t&&rt&&re[0]}},{key:"in",value:function(e){return e[0].indexOf(e[1])>-1}},{key:"lessThan",value:function(e){return e[1]r?1:0})}}]),e}();function S(e,t){for(var n=0;n 0 ? false : true;\n}\nfunction secondsSinceEpoch() {\n return Math.floor(Date.now() / 1000);\n}\n/**\r\n * Make a COPY of the original data\r\n * @param {Object} obj - object to be cloned\r\n * @return {Object}\r\n */\n\nfunction deepClone(obj) {\n //TODO: simple but inefficient JSON deep clone...\n if (obj) return JSON.parse(JSON.stringify(obj));\n}\nfunction removePathFromURL(url) {\n var splitURL = url.split('/');\n return splitURL[0] + '//' + splitURL[2] + '/' + splitURL[3];\n}\n/**\r\n * Obtains the user URL that corresponds to a given email\r\n * @param {string} userEmail The user email\r\n * @return {URL.URL} userURL The user URL\r\n */\n\nfunction getUserURLFromEmail(userEmail) {\n var indexOfAt = userEmail.indexOf('@');\n return 'user://' + userEmail.substring(indexOfAt + 1, userEmail.length) + '/' + userEmail.substring(0, indexOfAt);\n}\n/**\r\n * Obtains the user email that corresponds to a given URL\r\n * @param {URL.URL} userURL The user URL\r\n * @return {string} userEmail The user email\r\n */\n\nfunction getUserEmailFromURL(userURL) {\n var url = divideURL(userURL);\n return url.identity.replace('/', '') + '@' + url.domain; // identity field has '/exampleID' instead of 'exampleID'\n}\n/**\r\n * Check if the user identifier is already in the URL format, if not, convert to URL format\r\n * @param {string} identifier user identifier\r\n * @return {string} userURL the user URL\r\n */\n\nfunction convertToUserURL(identifier) {\n // check if the identifier is already in the url format\n if (identifier.substring(0, 7) === 'user://') {\n var dividedURL = divideURL(identifier); //check if the url is well formated\n\n if (dividedURL.domain && dividedURL.identity) {\n return identifier;\n } else {\n throw 'userURL with wrong format';\n } //if not, convert the user email to URL format\n\n } else {\n return getUserURLFromEmail(identifier);\n }\n}\nfunction isDataObjectURL(url) {\n var schemasToIgnore = ['domain-idp', 'runtime', 'domain', 'hyperty'];\n var splitURL = url.split('://');\n var urlSchema = splitURL[0];\n return schemasToIgnore.indexOf(urlSchema) === -1;\n}\nfunction isLegacy(url) {\n if (url.split('@').length > 1) {\n return true;\n } else {\n return false;\n }\n}\nfunction isURL(url) {\n return url.split('/').length >= 3;\n}\nfunction isUserURL(url) {\n return divideURL(url).type === 'user';\n}\nfunction isHypertyURL(url) {\n return divideURL(url).type === 'hyperty';\n}\n/**\r\n * get information relative each component configured on runtime configuration;\r\n * @param {object} configuration object with all configuration\r\n * @param {string} component string with the component to get the configuration, like, runtimeURLS, catalogueURLs, msgNodeURL, domainRegistryURL;\r\n * @param {string} resource type of resource to get, like, catalogue, runtimeUA, protocolstub, idpProxy\r\n * @return {object} return an object with all configurations;\r\n */\n\nfunction getConfigurationResources(configuration, component, resource) {\n var objectResource = configuration[component];\n var resourceType = objectResource[resource];\n return resourceType;\n}\n/**\r\n * Build a full url with the runtime configuration;\r\n * @param {object} configuration object with all configuration\r\n * @param {string} component string with the component to get the configuration, like, runtimeURLS, catalogueURLs, msgNodeURL, domainRegistryURL;\r\n * @param {string} resource type of resource to get, like, catalogue, runtimeUA, protocolstub, idpProxy\r\n * @param {string} type resource to get, like a hyperty name or protocolstub name;\r\n * @param {boolean} useFallback if true the function will check if have a fallback url;\r\n * @return {string} partial url to contact the resource;\r\n */\n\nfunction buildURL(configuration, component, resource, type) {\n var useFallback = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var objectResource = configuration[component];\n var url;\n\n if (!objectResource.hasOwnProperty(resource)) {\n throw Error('The configuration ' + JSON.stringify(objectResource, '', 2) + ' don\\'t have the ' + resource + ' resource you are looking for');\n }\n\n var resourceType = objectResource[resource];\n\n if (type) {\n url = resourceType.prefix + configuration.domain + resourceType.suffix + type;\n\n if (resourceType.hasOwnProperty('fallback') && useFallback) {\n if (resourceType.fallback.indexOf('%domain%')) {\n url = resourceType.fallback.replace(/(%domain%)/g, configuration.domain) + type;\n } else {\n url = resourceType.fallback + type;\n }\n }\n } else {\n url = resourceType.prefix + configuration.domain + resourceType.suffix;\n } // console.log(url);\n\n\n return url;\n}\n/**\r\n * Generate a Global Unique ID\r\n *\r\n * @returns String;\r\n */\n\nfunction generateGUID() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n}\nfunction getUserIdentityDomain(url) {\n var dividedURL = divideURL(url);\n var splitedDomain = dividedURL.domain.split('.');\n var splitedLength = splitedDomain.length;\n\n if (splitedLength == 1) {\n return splitedDomain[splitedLength - 1];\n }\n\n var domain = splitedDomain[splitedLength - 2] + '.' + splitedDomain[splitedLength - 1];\n return domain;\n}\n/**\r\n * Check if URL is from a backend service\r\n * @param {string} url URL to be processed\r\n * @return {boolean}\r\n */\n\nfunction isBackendServiceURL(url) {\n var dividedURL = divideURL(url);\n var splitedDomain = dividedURL.domain.split('.');\n var backendSchemes = ['domain', 'global', 'domain-idp']; // should be defined in the runtime configuration\n\n var backendSubDomains = ['registry', 'msg-node']; // should be defined in the runtime configuration\n\n var subDomain;\n\n if (splitedDomain.length > 1) {\n subDomain = splitedDomain.filter(function (item) {\n return backendSubDomains.indexOf(item) !== -1;\n })[0];\n }\n\n if (subDomain && backendSubDomains.indexOf(subDomain) !== -1) {\n return true;\n }\n\n if (dividedURL.type) {\n return backendSchemes.indexOf(dividedURL.type) !== -1;\n }\n\n return false;\n}\nfunction divideEmail(email) {\n var indexOfAt = email.indexOf('@');\n var result = {\n username: email.substring(0, indexOfAt),\n domain: email.substring(indexOfAt + 1, email.length)\n };\n return result;\n}\nfunction assign(obj, keyPath, value) {\n if (!obj) obj = {};\n if (typeof keyPath === 'string') keyPath = parseAttributes(keyPath);\n var lastKeyIndex = keyPath.length - 1;\n\n for (var i = 0; i < lastKeyIndex; ++i) {\n var key = keyPath[i];\n\n if (!(key in obj)) {\n obj[key] = {};\n }\n\n obj = obj[key];\n }\n\n obj[keyPath[lastKeyIndex]] = value;\n}\nfunction splitObjectURL(dataObjectURL) {\n console.info('[utils - splitObjectURL]: ', dataObjectURL);\n var splitedURL = dataObjectURL.split('/');\n var url = splitedURL[0] + '//' + splitedURL[2] + '/' + splitedURL[3];\n var resource = splitedURL[5];\n var result = {\n url: url,\n resource: resource\n };\n console.info('[utils - splitObjectURL]: ', result);\n return result;\n}\nfunction checkAttribute(path) {\n var regex = /((([a-zA-Z]+):\\/\\/([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})\\/[a-zA-Z0-9.]+@[a-zA-Z0-9]+(-)?[a-zA-Z0-9]+(\\.)?[a-zA-Z0-9]{2,10}?\\.[a-zA-Z]{2,10})(.+(?=.identity))?/gm;\n var list = [];\n var final = [];\n var test = path.match(regex);\n\n if (test == null) {\n final = path.split('.');\n } else {\n var m;\n\n while ((m = regex.exec(path)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n } // The result can be accessed through the `m`-variable.\n\n\n m.forEach(function (match, groupIndex) {\n if (groupIndex === 0) {\n list.push(match);\n }\n });\n }\n\n var result;\n list.forEach(function (url) {\n result = path.replace(url, '*-*');\n final = result.split('.').map(function (item) {\n if (item === '*-*') {\n return url;\n }\n\n return item;\n });\n });\n }\n\n console.log('[RuntimeCore.Utils.checkAttribute]', final);\n return final;\n}\nfunction parseAttributes(path) {\n var regex = /([0-9a-zA-Z][-\\w]*):\\/\\//g;\n var string3 = 'identity';\n\n if (!path.includes('://')) {\n return path.split('.');\n } else {\n var string1 = path.split(regex)[0];\n var array1 = string1.split('.');\n var string2 = path.replace(string1, '');\n\n if (path.includes(string3)) {\n var array2 = string2.split(string3 + '.');\n console.log('array2 ' + array2);\n string2 = array2[0].slice('.', -1);\n array2 = array2[1].split('.');\n array1.push(string2, string3);\n array1 = array1.concat(array2);\n } else {\n array1.push(string2);\n }\n\n return array1.filter(Boolean);\n }\n}\nfunction isEmpty(obj) {\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n return false;\n }\n }\n\n return JSON.stringify(obj) === JSON.stringify({});\n}\nfunction chatkeysToStringCloner(sessionKeys) {\n var dataObjectSessionKeysClone = {};\n var fields = Object.keys(sessionKeys);\n\n if (fields) {\n try {\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n dataObjectSessionKeysClone[field] = {};\n dataObjectSessionKeysClone[field].sessionKey = sessionKeys[field].sessionKey.toString();\n dataObjectSessionKeysClone[field].isToEncrypt = sessionKeys[field].isToEncrypt;\n }\n } catch (err) {\n console.error('_chatkeysToStringCloner:err', err);\n }\n }\n\n return dataObjectSessionKeysClone;\n}\nfunction chatkeysToArrayCloner(sessionKeys) {\n var dataObjectSessionKeysClone = {};\n var fields = Object.keys(sessionKeys);\n\n if (fields) {\n try {\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n dataObjectSessionKeysClone[field] = {};\n var arrayValues = JSON.parse('[' + sessionKeys[field].sessionKey + ']');\n dataObjectSessionKeysClone[field].sessionKey = new Uint8Array(arrayValues);\n dataObjectSessionKeysClone[field].isToEncrypt = sessionKeys[field].isToEncrypt;\n }\n } catch (err) {\n console.error('_chatkeysToArrayCloner:err', err);\n }\n }\n\n return dataObjectSessionKeysClone;\n}\nfunction parseMessageURL(URL) {\n var splitedToURL = URL.split('/');\n\n if (splitedToURL.length <= 6) {\n return splitedToURL[0] + '//' + splitedToURL[2] + '/' + splitedToURL[3];\n } else {\n return splitedToURL[0] + '//' + splitedToURL[2] + '/' + splitedToURL[3] + '/' + splitedToURL[4];\n }\n}\nfunction availableSpace(usage, quota) {\n var available = (usage / quota).toFixed(2);\n return {\n quota: quota,\n usage: usage,\n percent: Number(available)\n };\n}\n/**\r\n* Encodes a JS object to base 64 encode\r\n* @param {Object} value byteArray value\r\n* @return {string} encoded value\r\n*/\n\nfunction encode(value) {\n try {\n var stringValue = stringify(value);\n return btoa(stringValue);\n } catch (err) {\n console.error('[Utils.encode:err] ' + err);\n throw err;\n }\n}\n/**\r\n * Decode a base64 string to object\r\n * @param {string_b64} value value encoded in base 64\r\n * @return {Object} decodedValue\r\n */\n\nfunction decode(value) {\n try {\n return JSON.parse(atob(value));\n } catch (err) {\n console.log('[Utils.decode:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Decode a base64 string to Uint8Array\r\n* @param {string_b64} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction decodeToUint8Array(value) {\n try {\n return new Uint8Array(decode(value));\n } catch (err) {\n console.error('[Utils.decodeToUint8Array:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Converts a JS object to string\r\n* NOTE: Special conversion for Uint8Arrays\r\n* @param {Object} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction stringify(value) {\n try {\n var stringValue;\n\n if (value.constructor === Uint8Array) {\n stringValue = '[' + value.toString() + ']'; // the [] is for JSON.parse compatibility\n } else {\n stringValue = JSON.stringify(value);\n }\n\n return stringValue;\n } catch (err) {\n console.error('[Utils.stringify:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Converts a stringified object to object\r\n* @param {String} value byteArray value\r\n* @return {Object} encoded value\r\n*/\n\nfunction parse(value) {\n try {\n return JSON.parse(value);\n } catch (err) {\n console.error('[Utils.parse:err]' + err);\n console.trace();\n console.error('That that cause the error:', value);\n throw err;\n }\n}\n/**\r\n* Converts a stringified object to object\r\n* @param {String} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction parseToUint8Array(value) {\n try {\n return new Uint8Array(parse(value));\n } catch (err) {\n console.error('[Utils.parseToUint8Array:err]' + err);\n throw err;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy91dGlscy91dGlscy5qcz9mYTdkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuLyoqXHJcbiAqIFN1cHBvcnQgbW9kdWxlIHdpdGggc29tZSBmdW5jdGlvbnMgd2lsbCBiZSB1c2VmdWxcclxuICogQG1vZHVsZSB1dGlsc1xyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiBkaXZpZGVVUkxcclxuICogQHR5cGUgT2JqZWN0XHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIFVSTFxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gb2YgVVJMXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZGVudGl0eSBUaGUgaWRlbnRpdHkgb2YgVVJMXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIERpdmlkZSBhbiB1cmwgaW4gdHlwZSwgZG9tYWluIGFuZCBpZGVudGl0eVxyXG4gKiBAcGFyYW0gIHtVUkwuVVJMfSB1cmwgLSB1cmwgYWRkcmVzc1xyXG4gKiBAcmV0dXJuIHtkaXZpZGVVUkx9IHRoZSByZXN1bHQgb2YgZGl2aWRlVVJMXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlVVJMKHVybCkge1xyXG5cclxuICBmdW5jdGlvbiByZWN1cnNlKHZhbHVlKSB7XHJcbiAgICBjb25zdCByZWdleCA9IC8oW2EtekEtWi1dKikoOlxcL1xcLyg/OlxcLik/fDopKFstYS16QS1aMC05QDolLl8rfiM9XXsyLDI1Nn0pKFstYS16QS1aMC05QDolLl8rfiM9L10qKS9naTtcclxuICAgIGNvbnN0IHN1YnN0ID0gJyQxLCQzLCQ0JztcclxuICAgIGxldCBwYXJ0cyA9IHZhbHVlLnJlcGxhY2UocmVnZXgsIHN1YnN0KS5zcGxpdCgnLCcpO1xyXG4gICAgcmV0dXJuIHBhcnRzO1xyXG4gIH1cclxuXHJcbiAgbGV0IHBhcnRzID0gcmVjdXJzZSh1cmwpO1xyXG5cclxuICAvLyBJZiB0aGUgdXJsIGhhcyBubyBzY2hlbWVcclxuICBpZiAocGFydHNbMF0gPT09IHVybCAmJiAhcGFydHNbMF0uaW5jbHVkZXMoJ0AnKSkge1xyXG5cclxuICAgIGxldCByZXN1bHQgPSB7XHJcbiAgICAgIHR5cGU6ICcnLFxyXG4gICAgICBkb21haW46IHVybCxcclxuICAgICAgaWRlbnRpdHk6ICcnXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnNvbGUud2FybignW0RpdmlkZVVSTF0gRGl2aWRlVVJMIGRvblxcJ3Qgc3VwcG9ydCB1cmwgd2l0aG91dCBzY2hlbWUuIFBsZWFzZSByZXZpZXcgeW91ciB1cmwgYWRkcmVzcycsIHVybCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vIGNoZWNrIGlmIHRoZSB1cmwgaGFzIHRoZSBzY2hlbWUgYW5kIGluY2x1ZGVzIGFuIEBcclxuICBpZiAocGFydHNbMF0gPT09IHVybCAmJiBwYXJ0c1swXS5pbmNsdWRlcygnQCcpKSB7XHJcbiAgICBsZXQgc2NoZW1lID0gcGFydHNbMF0gPT09IHVybCA/ICdzbXRwJyA6IHBhcnRzWzBdO1xyXG4gICAgcGFydHMgPSByZWN1cnNlKHNjaGVtZSArICc6Ly8nICsgcGFydHNbMF0pO1xyXG4gIH1cclxuXHJcbiAgLy8gaWYgdGhlIGRvbWFpbiBpbmNsdWRlcyBhbiBALCBkaXZpZGUgaXQgdG8gZG9tYWluIGFuZCBpZGVudGl0eSByZXNwZWN0aXZlbHlcclxuICBpZiAocGFydHNbMV0uaW5jbHVkZXMoJ0AnKSkge1xyXG4gICAgcGFydHNbMl0gPSBwYXJ0c1swXSArICc6Ly8nICsgcGFydHNbMV07XHJcbiAgICBwYXJ0c1sxXSA9IHBhcnRzWzFdLnN1YnN0cihwYXJ0c1sxXS5pbmRleE9mKCdAJykgKyAxKTtcclxuICB9IFx0LyplbHNlIGlmIChwYXJ0c1syXS5pbmNsdWRlcygnLycpKSB7XHJcbiAgICBwYXJ0c1syXSA9IHBhcnRzWzJdLnN1YnN0cihwYXJ0c1syXS5sYXN0SW5kZXhPZignLycpKzEpO1xyXG4gIH0qL1xyXG5cclxuICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgdHlwZTogcGFydHNbMF0sXHJcbiAgICBkb21haW46IHBhcnRzWzFdLFxyXG4gICAgaWRlbnRpdHk6IHBhcnRzWzJdXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBhbiBPYmplY3QgaXMgZW1wdHlcclxuICogQHBhcmFtICB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIGNoZWNrZWRcclxuICogQHJldHVybiB7Qm9vbGVhbn0gICAgICAgc3RhdHVzIG9mIE9iamVjdCwgZW1wdHkgb3Igbm90ICh0cnVlfGZhbHNlKTtcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBlbXB0eU9iamVjdChvYmplY3QpIHtcclxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5sZW5ndGggPiAwID8gZmFsc2UgOiB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2Vjb25kc1NpbmNlRXBvY2goKSB7XHJcbiAgcmV0dXJuIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIE1ha2UgYSBDT1BZIG9mIHRoZSBvcmlnaW5hbCBkYXRhXHJcbiAqIEBwYXJhbSAge09iamVjdH0gIG9iaiAtIG9iamVjdCB0byBiZSBjbG9uZWRcclxuICogQHJldHVybiB7T2JqZWN0fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDbG9uZShvYmopIHtcclxuICAvL1RPRE86IHNpbXBsZSBidXQgaW5lZmZpY2llbnQgSlNPTiBkZWVwIGNsb25lLi4uXHJcbiAgaWYgKG9iaikgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQYXRoRnJvbVVSTCh1cmwpIHtcclxuICBsZXQgc3BsaXRVUkwgPSB1cmwuc3BsaXQoJy8nKTtcclxuICByZXR1cm4gc3BsaXRVUkxbMF0gKyAnLy8nICsgc3BsaXRVUkxbMl0gKyAnLycgKyBzcGxpdFVSTFszXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE9idGFpbnMgdGhlIHVzZXIgVVJMIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBlbWFpbFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVzZXJFbWFpbCBUaGUgdXNlciBlbWFpbFxyXG4gKiBAcmV0dXJuIHtVUkwuVVJMfSB1c2VyVVJMIFRoZSB1c2VyIFVSTFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJVUkxGcm9tRW1haWwodXNlckVtYWlsKSB7XHJcbiAgbGV0IGluZGV4T2ZBdCA9IHVzZXJFbWFpbC5pbmRleE9mKCdAJyk7XHJcbiAgcmV0dXJuICd1c2VyOi8vJyArIHVzZXJFbWFpbC5zdWJzdHJpbmcoaW5kZXhPZkF0ICsgMSwgdXNlckVtYWlsLmxlbmd0aCkgKyAnLycgKyB1c2VyRW1haWwuc3Vic3RyaW5nKDAsIGluZGV4T2ZBdCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPYnRhaW5zIHRoZSB1c2VyIGVtYWlsIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBVUkxcclxuICogQHBhcmFtICB7VVJMLlVSTH0gdXNlclVSTCBUaGUgdXNlciBVUkxcclxuICogQHJldHVybiB7c3RyaW5nfSB1c2VyRW1haWwgVGhlIHVzZXIgZW1haWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VyRW1haWxGcm9tVVJMKHVzZXJVUkwpIHtcclxuICBsZXQgdXJsID0gZGl2aWRlVVJMKHVzZXJVUkwpO1xyXG4gIHJldHVybiB1cmwuaWRlbnRpdHkucmVwbGFjZSgnLycsICcnKSArICdAJyArIHVybC5kb21haW47IC8vIGlkZW50aXR5IGZpZWxkIGhhcyAnL2V4YW1wbGVJRCcgaW5zdGVhZCBvZiAnZXhhbXBsZUlEJ1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhlIHVzZXIgaWRlbnRpZmllciBpcyBhbHJlYWR5IGluIHRoZSBVUkwgZm9ybWF0LCBpZiBub3QsIGNvbnZlcnQgdG8gVVJMIGZvcm1hdFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgaWRlbnRpZmllciAgdXNlciBpZGVudGlmaWVyXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gICB1c2VyVVJMICAgIHRoZSB1c2VyIFVSTFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1VzZXJVUkwoaWRlbnRpZmllcikge1xyXG5cclxuICAvLyBjaGVjayBpZiB0aGUgaWRlbnRpZmllciBpcyBhbHJlYWR5IGluIHRoZSB1cmwgZm9ybWF0XHJcbiAgaWYgKGlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIDcpID09PSAndXNlcjovLycpIHtcclxuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKGlkZW50aWZpZXIpO1xyXG5cclxuICAgIC8vY2hlY2sgaWYgdGhlIHVybCBpcyB3ZWxsIGZvcm1hdGVkXHJcbiAgICBpZiAoZGl2aWRlZFVSTC5kb21haW4gJiYgZGl2aWRlZFVSTC5pZGVudGl0eSkge1xyXG4gICAgICByZXR1cm4gaWRlbnRpZmllcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93ICd1c2VyVVJMIHdpdGggd3JvbmcgZm9ybWF0JztcclxuICAgIH1cclxuXHJcbiAgLy9pZiBub3QsIGNvbnZlcnQgdGhlIHVzZXIgZW1haWwgdG8gVVJMIGZvcm1hdFxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZ2V0VXNlclVSTEZyb21FbWFpbChpZGVudGlmaWVyKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFPYmplY3RVUkwodXJsKSB7XHJcbiAgbGV0IHNjaGVtYXNUb0lnbm9yZSA9IFsnZG9tYWluLWlkcCcsICdydW50aW1lJywgJ2RvbWFpbicsICdoeXBlcnR5J107XHJcbiAgbGV0IHNwbGl0VVJMID0gKHVybCkuc3BsaXQoJzovLycpO1xyXG4gIGxldCB1cmxTY2hlbWEgPSBzcGxpdFVSTFswXTtcclxuXHJcbiAgcmV0dXJuIHNjaGVtYXNUb0lnbm9yZS5pbmRleE9mKHVybFNjaGVtYSkgPT09IC0xO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNMZWdhY3kodXJsKSB7XHJcbiAgaWYgKHVybC5zcGxpdCgnQCcpLmxlbmd0aCA+IDEpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNVUkwodXJsKSB7XHJcbiAgcmV0dXJuICh1cmwpLnNwbGl0KCcvJykubGVuZ3RoID49IDM7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1VzZXJVUkwodXJsKSB7XHJcbiAgcmV0dXJuIGRpdmlkZVVSTCh1cmwpLnR5cGUgPT09ICd1c2VyJztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSHlwZXJ0eVVSTCh1cmwpIHtcclxuICByZXR1cm4gZGl2aWRlVVJMKHVybCkudHlwZSA9PT0gJ2h5cGVydHknO1xyXG59XHJcblxyXG4vKipcclxuICogZ2V0IGluZm9ybWF0aW9uIHJlbGF0aXZlIGVhY2ggY29tcG9uZW50IGNvbmZpZ3VyZWQgb24gcnVudGltZSBjb25maWd1cmF0aW9uO1xyXG4gKiBAcGFyYW0gIHtvYmplY3R9IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggYWxsIGNvbmZpZ3VyYXRpb25cclxuICogQHBhcmFtICB7c3RyaW5nfSBjb21wb25lbnQgICAgIHN0cmluZyB3aXRoIHRoZSBjb21wb25lbnQgdG8gZ2V0IHRoZSBjb25maWd1cmF0aW9uLCBsaWtlLCBydW50aW1lVVJMUywgY2F0YWxvZ3VlVVJMcywgbXNnTm9kZVVSTCwgZG9tYWluUmVnaXN0cnlVUkw7XHJcbiAqIEBwYXJhbSAge3N0cmluZ30gcmVzb3VyY2UgICAgICB0eXBlIG9mIHJlc291cmNlIHRvIGdldCwgbGlrZSwgY2F0YWxvZ3VlLCBydW50aW1lVUEsIHByb3RvY29sc3R1YiwgaWRwUHJveHlcclxuICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAgICAgIHJldHVybiBhbiBvYmplY3Qgd2l0aCBhbGwgY29uZmlndXJhdGlvbnM7XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlndXJhdGlvblJlc291cmNlcyhjb25maWd1cmF0aW9uLCBjb21wb25lbnQsIHJlc291cmNlKSB7XHJcbiAgbGV0IG9iamVjdFJlc291cmNlID0gY29uZmlndXJhdGlvbltjb21wb25lbnRdO1xyXG4gIGxldCByZXNvdXJjZVR5cGUgPSBvYmplY3RSZXNvdXJjZVtyZXNvdXJjZV07XHJcblxyXG4gIHJldHVybiByZXNvdXJjZVR5cGU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZCBhIGZ1bGwgdXJsIHdpdGggdGhlIHJ1bnRpbWUgY29uZmlndXJhdGlvbjtcclxuICogQHBhcmFtICB7b2JqZWN0fSBjb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIGFsbCBjb25maWd1cmF0aW9uXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gY29tcG9uZW50ICAgICBzdHJpbmcgd2l0aCB0aGUgY29tcG9uZW50IHRvIGdldCB0aGUgY29uZmlndXJhdGlvbiwgbGlrZSwgcnVudGltZVVSTFMsIGNhdGFsb2d1ZVVSTHMsIG1zZ05vZGVVUkwsIGRvbWFpblJlZ2lzdHJ5VVJMO1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHJlc291cmNlICAgICAgdHlwZSBvZiByZXNvdXJjZSB0byBnZXQsIGxpa2UsIGNhdGFsb2d1ZSwgcnVudGltZVVBLCBwcm90b2NvbHN0dWIsIGlkcFByb3h5XHJcbiAqIEBwYXJhbSAge3N0cmluZ30gdHlwZSAgICAgICAgICByZXNvdXJjZSB0byBnZXQsIGxpa2UgYSBoeXBlcnR5IG5hbWUgb3IgcHJvdG9jb2xzdHViIG5hbWU7XHJcbiAqIEBwYXJhbSAge2Jvb2xlYW59IHVzZUZhbGxiYWNrICBpZiB0cnVlIHRoZSBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIGhhdmUgYSBmYWxsYmFjayB1cmw7XHJcbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICBwYXJ0aWFsIHVybCB0byBjb250YWN0IHRoZSByZXNvdXJjZTtcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZFVSTChjb25maWd1cmF0aW9uLCBjb21wb25lbnQsIHJlc291cmNlLCB0eXBlLCB1c2VGYWxsYmFjayA9IGZhbHNlKSB7XHJcbiAgbGV0IG9iamVjdFJlc291cmNlID0gY29uZmlndXJhdGlvbltjb21wb25lbnRdO1xyXG4gIGxldCB1cmw7XHJcblxyXG4gIGlmICghb2JqZWN0UmVzb3VyY2UuaGFzT3duUHJvcGVydHkocmVzb3VyY2UpKSB7XHJcbiAgICB0aHJvdyBFcnJvcignVGhlIGNvbmZpZ3VyYXRpb24gJyArIEpTT04uc3RyaW5naWZ5KG9iamVjdFJlc291cmNlLCAnJywgMikgKyAnIGRvblxcJ3QgaGF2ZSB0aGUgJyArIHJlc291cmNlICsgJyByZXNvdXJjZSB5b3UgYXJlIGxvb2tpbmcgZm9yJyk7XHJcbiAgfVxyXG5cclxuICBsZXQgcmVzb3VyY2VUeXBlID0gb2JqZWN0UmVzb3VyY2VbcmVzb3VyY2VdO1xyXG5cclxuICBpZiAodHlwZSkge1xyXG4gICAgdXJsID0gcmVzb3VyY2VUeXBlLnByZWZpeCArIGNvbmZpZ3VyYXRpb24uZG9tYWluICsgcmVzb3VyY2VUeXBlLnN1ZmZpeCArIHR5cGU7XHJcbiAgICBpZiAocmVzb3VyY2VUeXBlLmhhc093blByb3BlcnR5KCdmYWxsYmFjaycpICYmIHVzZUZhbGxiYWNrKSB7XHJcbiAgICAgIGlmIChyZXNvdXJjZVR5cGUuZmFsbGJhY2suaW5kZXhPZignJWRvbWFpbiUnKSkge1xyXG4gICAgICAgIHVybCA9IHJlc291cmNlVHlwZS5mYWxsYmFjay5yZXBsYWNlKC8oJWRvbWFpbiUpL2csIGNvbmZpZ3VyYXRpb24uZG9tYWluKSArIHR5cGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXJsID0gcmVzb3VyY2VUeXBlLmZhbGxiYWNrICsgdHlwZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICB1cmwgPSByZXNvdXJjZVR5cGUucHJlZml4ICsgY29uZmlndXJhdGlvbi5kb21haW4gKyByZXNvdXJjZVR5cGUuc3VmZml4O1xyXG4gIH1cclxuXHJcbiAgLy8gY29uc29sZS5sb2codXJsKTtcclxuXHJcbiAgcmV0dXJuIHVybDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIGEgR2xvYmFsIFVuaXF1ZSBJRFxyXG4gKlxyXG4gKiBAcmV0dXJucyBTdHJpbmc7XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVHVUlEKCkge1xyXG5cclxuICBmdW5jdGlvbiBzNCgpIHtcclxuICAgIHJldHVybiBNYXRoLmZsb29yKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKVxyXG4gICAgICAudG9TdHJpbmcoMTYpXHJcbiAgICAgIC5zdWJzdHJpbmcoMSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gczQoKSArIHM0KCkgKyAnLScgKyBzNCgpICsgJy0nICsgczQoKSArICctJyArIHM0KCkgKyAnLScgKyBzNCgpICsgczQoKSArIHM0KCk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlcklkZW50aXR5RG9tYWluKHVybCkge1xyXG4gIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKHVybCk7XHJcbiAgbGV0IHNwbGl0ZWREb21haW4gPSBkaXZpZGVkVVJMLmRvbWFpbi5zcGxpdCgnLicpO1xyXG4gIGxldCBzcGxpdGVkTGVuZ3RoID0gc3BsaXRlZERvbWFpbi5sZW5ndGg7XHJcbiAgaWYgKHNwbGl0ZWRMZW5ndGggPT0gMSkge1xyXG4gICAgcmV0dXJuIHNwbGl0ZWREb21haW5bc3BsaXRlZExlbmd0aCAtIDFdO1xyXG4gIH1cclxuICBsZXQgZG9tYWluID0gc3BsaXRlZERvbWFpbltzcGxpdGVkTGVuZ3RoIC0gMl0gKyAnLicgKyBzcGxpdGVkRG9tYWluW3NwbGl0ZWRMZW5ndGggLSAxXTtcclxuICByZXR1cm4gZG9tYWluO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgVVJMIGlzIGZyb20gYSBiYWNrZW5kIHNlcnZpY2VcclxuICogQHBhcmFtICB7c3RyaW5nfSB1cmwgICAgIFVSTCB0byBiZSBwcm9jZXNzZWRcclxuICogQHJldHVybiB7Ym9vbGVhbn1cclxuICovXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNCYWNrZW5kU2VydmljZVVSTCh1cmwpIHtcclxuICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTCh1cmwpO1xyXG4gIGxldCBzcGxpdGVkRG9tYWluID0gZGl2aWRlZFVSTC5kb21haW4uc3BsaXQoJy4nKTtcclxuICBsZXQgYmFja2VuZFNjaGVtZXMgPSBbJ2RvbWFpbicsICdnbG9iYWwnLCAnZG9tYWluLWlkcCddOyAvLyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uXHJcbiAgbGV0IGJhY2tlbmRTdWJEb21haW5zID0gWydyZWdpc3RyeScsICdtc2ctbm9kZSddOyAvLyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uXHJcbiAgbGV0IHN1YkRvbWFpbjtcclxuXHJcbiAgaWYgKHNwbGl0ZWREb21haW4ubGVuZ3RoID4gMSkge1xyXG4gICAgc3ViRG9tYWluID0gc3BsaXRlZERvbWFpbi5maWx0ZXIoaXRlbSA9PiBiYWNrZW5kU3ViRG9tYWlucy5pbmRleE9mKGl0ZW0pICE9PSAtMSlbMF07XHJcbiAgfVxyXG5cclxuICBpZiAoc3ViRG9tYWluICYmIGJhY2tlbmRTdWJEb21haW5zLmluZGV4T2Yoc3ViRG9tYWluKSAhPT0gLTEpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgaWYgKGRpdmlkZWRVUkwudHlwZSkge1xyXG4gICAgcmV0dXJuIChiYWNrZW5kU2NoZW1lcy5pbmRleE9mKGRpdmlkZWRVUkwudHlwZSkgIT09IC0xKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZUVtYWlsKGVtYWlsKSB7XHJcbiAgbGV0IGluZGV4T2ZBdCA9IGVtYWlsLmluZGV4T2YoJ0AnKTtcclxuXHJcbiAgbGV0IHJlc3VsdCA9IHtcclxuICAgIHVzZXJuYW1lOiBlbWFpbC5zdWJzdHJpbmcoMCwgaW5kZXhPZkF0KSxcclxuICAgIGRvbWFpbjogZW1haWwuc3Vic3RyaW5nKGluZGV4T2ZBdCArIDEsIGVtYWlsLmxlbmd0aClcclxuICB9O1xyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbihvYmosIGtleVBhdGgsIHZhbHVlKSB7XHJcblxyXG4gIGlmICghb2JqKSBvYmogPSB7fTtcclxuICBpZiAodHlwZW9mKGtleVBhdGgpID09PSAnc3RyaW5nJykga2V5UGF0aCA9IHBhcnNlQXR0cmlidXRlcyhrZXlQYXRoKTtcclxuXHJcbiAgbGV0IGxhc3RLZXlJbmRleCA9IGtleVBhdGgubGVuZ3RoIC0gMTtcclxuXHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0S2V5SW5kZXg7ICsraSkge1xyXG4gICAgbGV0IGtleSA9IGtleVBhdGhbaV07XHJcbiAgICBpZiAoIShrZXkgaW4gb2JqKSkge1xyXG4gICAgICBvYmpba2V5XSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIG9iaiA9IG9ialtrZXldO1xyXG5cclxuICB9XHJcblxyXG4gIG9ialtrZXlQYXRoW2xhc3RLZXlJbmRleF1dID0gdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdE9iamVjdFVSTChkYXRhT2JqZWN0VVJMKSB7XHJcbiAgY29uc29sZS5pbmZvKCdbdXRpbHMgLSBzcGxpdE9iamVjdFVSTF06ICcsIGRhdGFPYmplY3RVUkwpO1xyXG5cclxuICBsZXQgc3BsaXRlZFVSTCA9IGRhdGFPYmplY3RVUkwuc3BsaXQoJy8nKTtcclxuICBsZXQgdXJsID0gc3BsaXRlZFVSTFswXSArICcvLycgKyBzcGxpdGVkVVJMWzJdICsgJy8nICsgc3BsaXRlZFVSTFszXTtcclxuICBsZXQgcmVzb3VyY2UgPSBzcGxpdGVkVVJMWzVdO1xyXG5cclxuICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgdXJsOiB1cmwsXHJcbiAgICByZXNvdXJjZTogcmVzb3VyY2VcclxuICB9O1xyXG5cclxuICBjb25zb2xlLmluZm8oJ1t1dGlscyAtIHNwbGl0T2JqZWN0VVJMXTogJywgcmVzdWx0KTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQXR0cmlidXRlKHBhdGgpIHtcclxuXHJcbiAgbGV0IHJlZ2V4ID0gLygoKFthLXpBLVpdKyk6XFwvXFwvKFswLTlhLXpBLVpdWy1cXHddKlswLTlhLXpBLVpdXFwuKStbYS16QS1aXXsyLDl9KVxcL1thLXpBLVowLTkuXStAW2EtekEtWjAtOV0rKC0pP1thLXpBLVowLTldKyhcXC4pP1thLXpBLVowLTldezIsMTB9P1xcLlthLXpBLVpdezIsMTB9KSguKyg/PS5pZGVudGl0eSkpPy9nbTtcclxuXHJcbiAgbGV0IGxpc3QgPSBbXTtcclxuICBsZXQgZmluYWwgPSBbXTtcclxuICBsZXQgdGVzdCA9IHBhdGgubWF0Y2gocmVnZXgpO1xyXG5cclxuICBpZiAodGVzdCA9PSBudWxsKSB7XHJcbiAgICBmaW5hbCA9IHBhdGguc3BsaXQoJy4nKTtcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IG07XHJcbiAgICB3aGlsZSAoKG0gPSByZWdleC5leGVjKHBhdGgpKSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBpbmZpbml0ZSBsb29wcyB3aXRoIHplcm8td2lkdGggbWF0Y2hlc1xyXG4gICAgICBpZiAobS5pbmRleCA9PT0gcmVnZXgubGFzdEluZGV4KSB7XHJcbiAgICAgICAgcmVnZXgubGFzdEluZGV4Kys7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRoZSByZXN1bHQgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGBtYC12YXJpYWJsZS5cclxuICAgICAgbS5mb3JFYWNoKChtYXRjaCwgZ3JvdXBJbmRleCkgPT4ge1xyXG4gICAgICAgIGlmIChncm91cEluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICBsaXN0LnB1c2gobWF0Y2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzdWx0O1xyXG4gICAgbGlzdC5mb3JFYWNoKCh1cmwpID0+IHtcclxuXHJcbiAgICAgIHJlc3VsdCA9IHBhdGgucmVwbGFjZSh1cmwsICcqLSonKTtcclxuICAgICAgZmluYWwgPSByZXN1bHQuc3BsaXQoJy4nKS5tYXAoKGl0ZW0pID0+IHtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0gPT09ICcqLSonKSB7IHJldHVybiB1cmw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zb2xlLmxvZygnW1J1bnRpbWVDb3JlLlV0aWxzLmNoZWNrQXR0cmlidXRlXScsIGZpbmFsKTtcclxuICByZXR1cm4gZmluYWw7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMocGF0aCkge1xyXG4gIGxldCByZWdleCA9IC8oWzAtOWEtekEtWl1bLVxcd10qKTpcXC9cXC8vZztcclxuXHJcbiAgbGV0IHN0cmluZzMgPSAnaWRlbnRpdHknO1xyXG5cclxuICBpZiAoIXBhdGguaW5jbHVkZXMoJzovLycpKSB7XHJcbiAgICByZXR1cm4gKHBhdGguc3BsaXQoJy4nKSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCBzdHJpbmcxID0gcGF0aC5zcGxpdChyZWdleClbMF07XHJcblxyXG4gICAgbGV0IGFycmF5MSA9IHN0cmluZzEuc3BsaXQoJy4nKTtcclxuXHJcbiAgICBsZXQgc3RyaW5nMiA9IHBhdGgucmVwbGFjZShzdHJpbmcxLCAnJyk7XHJcblxyXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoc3RyaW5nMykpIHtcclxuXHJcbiAgICAgIGxldCBhcnJheTIgPSBzdHJpbmcyLnNwbGl0KHN0cmluZzMgKyAnLicpO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coJ2FycmF5MiAnICsgYXJyYXkyKTtcclxuXHJcbiAgICAgIHN0cmluZzIgPSBhcnJheTJbMF0uc2xpY2UoJy4nLCAtMSk7XHJcblxyXG4gICAgICBhcnJheTIgPSBhcnJheTJbMV0uc3BsaXQoJy4nKTtcclxuXHJcbiAgICAgIGFycmF5MS5wdXNoKHN0cmluZzIsIHN0cmluZzMpO1xyXG5cclxuICAgICAgYXJyYXkxID0gYXJyYXkxLmNvbmNhdChhcnJheTIpO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFycmF5MS5wdXNoKHN0cmluZzIpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGFycmF5MS5maWx0ZXIoQm9vbGVhbikpO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcclxuICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xyXG5cclxuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopID09PSBKU09OLnN0cmluZ2lmeSh7fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGF0a2V5c1RvU3RyaW5nQ2xvbmVyKHNlc3Npb25LZXlzKSB7XHJcbiAgbGV0IGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lID0ge307XHJcbiAgbGV0IGZpZWxkcyA9IE9iamVjdC5rZXlzKHNlc3Npb25LZXlzKTtcclxuICBpZiAoZmllbGRzKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHNbaV07XHJcbiAgICAgICAgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmVbZmllbGRdID0ge307XHJcbiAgICAgICAgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmVbZmllbGRdLnNlc3Npb25LZXkgPSBzZXNzaW9uS2V5c1tmaWVsZF0uc2Vzc2lvbktleS50b1N0cmluZygpO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXS5pc1RvRW5jcnlwdCA9IHNlc3Npb25LZXlzW2ZpZWxkXS5pc1RvRW5jcnlwdDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ19jaGF0a2V5c1RvU3RyaW5nQ2xvbmVyOmVycicsIGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoYXRrZXlzVG9BcnJheUNsb25lcihzZXNzaW9uS2V5cykge1xyXG4gIGxldCBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZSA9IHt9O1xyXG4gIGxldCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzZXNzaW9uS2V5cyk7XHJcbiAgaWYgKGZpZWxkcykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAgZmllbGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW2ldO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXSA9IHt9O1xyXG4gICAgICAgIGxldCBhcnJheVZhbHVlcyA9IEpTT04ucGFyc2UoJ1snICsgc2Vzc2lvbktleXNbZmllbGRdLnNlc3Npb25LZXkgKyAnXScpO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXS5zZXNzaW9uS2V5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlWYWx1ZXMpO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXS5pc1RvRW5jcnlwdCA9IHNlc3Npb25LZXlzW2ZpZWxkXS5pc1RvRW5jcnlwdDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ19jaGF0a2V5c1RvQXJyYXlDbG9uZXI6ZXJyJywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNZXNzYWdlVVJMKFVSTCkge1xyXG4gIGxldCBzcGxpdGVkVG9VUkwgPSBVUkwuc3BsaXQoJy8nKTtcclxuICBpZiAoc3BsaXRlZFRvVVJMLmxlbmd0aCA8PSA2KSB7XHJcbiAgICByZXR1cm4gc3BsaXRlZFRvVVJMWzBdICsgJy8vJyArIHNwbGl0ZWRUb1VSTFsyXSArICcvJyArIHNwbGl0ZWRUb1VSTFszXTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHNwbGl0ZWRUb1VSTFswXSArICcvLycgKyBzcGxpdGVkVG9VUkxbMl0gKyAnLycgKyBzcGxpdGVkVG9VUkxbM10gKyAnLycgKyBzcGxpdGVkVG9VUkxbNF07XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXZhaWxhYmxlU3BhY2UodXNhZ2UsIHF1b3RhKSB7XHJcbiAgY29uc3QgYXZhaWxhYmxlID0gKHVzYWdlIC8gcXVvdGEpLnRvRml4ZWQoMik7XHJcbiAgcmV0dXJuIHtcclxuICAgIHF1b3RhOiBxdW90YSxcclxuICAgIHVzYWdlOiB1c2FnZSxcclxuICAgIHBlcmNlbnQ6IE51bWJlcihhdmFpbGFibGUpXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiogRW5jb2RlcyBhIEpTIG9iamVjdCB0byBiYXNlIDY0IGVuY29kZVxyXG4qIEBwYXJhbSAgIHtPYmplY3R9ICAgIHZhbHVlICAgIGJ5dGVBcnJheSB2YWx1ZVxyXG4qIEByZXR1cm4gIHtzdHJpbmd9ICAgZW5jb2RlZCB2YWx1ZVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIGxldCBzdHJpbmdWYWx1ZSA9IHN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICByZXR1cm4gYnRvYShzdHJpbmdWYWx1ZSk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMuZW5jb2RlOmVycl0gJyArIGVycik7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICAqIERlY29kZSBhIGJhc2U2NCBzdHJpbmcgdG8gb2JqZWN0XHJcbiAgKiBAcGFyYW0gICB7c3RyaW5nX2I2NH0gICAgdmFsdWUgICAgdmFsdWUgZW5jb2RlZCBpbiBiYXNlIDY0XHJcbiAgKiBAcmV0dXJuICB7T2JqZWN0fSBkZWNvZGVkVmFsdWVcclxuICAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKGF0b2IodmFsdWUpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUubG9nKCdbVXRpbHMuZGVjb2RlOmVycl0gJyArIGVycik7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIHRvIFVpbnQ4QXJyYXlcclxuKiBAcGFyYW0gICB7c3RyaW5nX2I2NH0gICAgdmFsdWUgICAgYnl0ZUFycmF5IHZhbHVlXHJcbiogQHJldHVybiAge1VpbnQ4QXJyYXl9ICAgZW5jb2RlZCB2YWx1ZVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVG9VaW50OEFycmF5KHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWNvZGUodmFsdWUpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ1tVdGlscy5kZWNvZGVUb1VpbnQ4QXJyYXk6ZXJyXSAnICsgZXJyKTtcclxuICAgIHRocm93IGVycjtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4qIENvbnZlcnRzIGEgSlMgb2JqZWN0IHRvIHN0cmluZ1xyXG4qIE5PVEU6IFNwZWNpYWwgY29udmVyc2lvbiBmb3IgVWludDhBcnJheXNcclxuKiBAcGFyYW0gICB7T2JqZWN0fSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcclxuKiBAcmV0dXJuICB7VWludDhBcnJheX0gICBlbmNvZGVkIHZhbHVlXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUpIHtcclxuICB0cnkge1xyXG4gICAgbGV0IHN0cmluZ1ZhbHVlO1xyXG4gICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBVaW50OEFycmF5KSB7XHJcbiAgICAgIHN0cmluZ1ZhbHVlID0gJ1snICsgdmFsdWUudG9TdHJpbmcoKSArICddJzsgLy8gdGhlIFtdIGlzIGZvciBKU09OLnBhcnNlIGNvbXBhdGliaWxpdHlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0cmluZ1ZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY29uc29sZS5lcnJvcignW1V0aWxzLnN0cmluZ2lmeTplcnJdICcgKyBlcnIpO1xyXG4gICAgdGhyb3cgZXJyO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiogQ29udmVydHMgYSBzdHJpbmdpZmllZCBvYmplY3QgdG8gb2JqZWN0XHJcbiogQHBhcmFtICAge1N0cmluZ30gICAgdmFsdWUgICAgYnl0ZUFycmF5IHZhbHVlXHJcbiogQHJldHVybiAge09iamVjdH0gICBlbmNvZGVkIHZhbHVlXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZSh2YWx1ZSkge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMucGFyc2U6ZXJyXScgKyBlcnIpO1xyXG4gICAgY29uc29sZS50cmFjZSgpO1xyXG4gICAgY29uc29sZS5lcnJvcignVGhhdCB0aGF0IGNhdXNlIHRoZSBlcnJvcjonLCB2YWx1ZSk7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuKiBDb252ZXJ0cyBhIHN0cmluZ2lmaWVkIG9iamVjdCB0byBvYmplY3RcclxuKiBAcGFyYW0gICB7U3RyaW5nfSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcclxuKiBAcmV0dXJuICB7VWludDhBcnJheX0gICBlbmNvZGVkIHZhbHVlXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRvVWludDhBcnJheSh2YWx1ZSkge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocGFyc2UodmFsdWUpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ1tVdGlscy5wYXJzZVRvVWludDhBcnJheTplcnJdJyArIGVycik7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7Ozs7O0FBS0E7Ozs7Ozs7O0FBUUE7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFFQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQVNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///0\n")},20:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar ReThinkCtx =\n/*#__PURE__*/\nfunction () {\n function ReThinkCtx() {\n _classCallCheck(this, ReThinkCtx);\n\n this.defaultBehaviour = true;\n this.groups = {};\n }\n\n _createClass(ReThinkCtx, [{\n key: "scheme",\n get: function get() {\n return this._scheme;\n },\n set: function set(params) {\n var from = params.message.from;\n\n if (Object(_utils_utils__WEBPACK_IMPORTED_MODULE_0__[/* isDataObjectURL */ "s"])(from)) {\n this._scheme = Object(_utils_utils__WEBPACK_IMPORTED_MODULE_0__[/* divideURL */ "k"])(from).type;\n } else {\n this._scheme = undefined;\n }\n }\n }, {\n key: "date",\n get: function get() {\n return this._date;\n },\n set: function set(now) {\n var date = new Date();\n var day = String(date.getDate());\n\n if (day.length === 1) {\n day = \'0\' + day;\n }\n\n var month = String(date.getMonth() + 1);\n\n if (month.length === 1) {\n month = \'0\' + month;\n }\n\n this._date = day + \'/\' + month + \'/\' + date.getFullYear();\n }\n }, {\n key: "domain",\n get: function get() {\n return this._domain;\n },\n set: function set(params) {\n if (params.message.body.identity !== undefined) {\n this._domain = Object(_utils_utils__WEBPACK_IMPORTED_MODULE_0__[/* divideEmail */ "j"])(params.message.body.identity.userProfile.username).domain;\n }\n }\n }, {\n key: "type",\n get: function get() {\n return this._type;\n },\n set: function set(params) {\n var message = params.message;\n\n if (message.body.value !== undefined) {\n this._type = message.body.value.resourceType;\n }\n }\n }, {\n key: "source",\n get: function get() {\n return this._source;\n },\n set: function set(params) {\n if (params.message.body.identity !== undefined) {\n this._source = params.message.body.identity.userProfile.username;\n }\n }\n }, {\n key: "time",\n get: function get() {\n return this._time;\n },\n set: function set(now) {\n now = new Date();\n var minutes = String(now.getMinutes());\n\n if (minutes.length === 1) {\n minutes = \'0\' + minutes;\n }\n\n this._time = parseInt(String(now.getHours()) + minutes);\n }\n }, {\n key: "weekday",\n get: function get() {\n return this._weekday;\n },\n set: function set(now) {\n this._weekday = String(new Date().getDay());\n }\n }]);\n\n return ReThinkCtx;\n}();\n\n/* harmony default export */ __webpack_exports__["default"] = (ReThinkCtx);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L1JlVGhpbmtDdHguanM/Y2MzMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2RpdmlkZUVtYWlsLCBkaXZpZGVVUkwsIGlzRGF0YU9iamVjdFVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuY2xhc3MgUmVUaGlua0N0eCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5kZWZhdWx0QmVoYXZpb3VyID0gdHJ1ZTtcclxuICAgIHRoaXMuZ3JvdXBzID0ge307XHJcbiAgfVxyXG5cclxuICBnZXQgc2NoZW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NjaGVtZTtcclxuICB9XHJcblxyXG4gIGdldCBkYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGU7XHJcbiAgfVxyXG5cclxuICBnZXQgZG9tYWluKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpbjtcclxuICB9XHJcblxyXG4gIGdldCB0eXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XHJcbiAgfVxyXG5cclxuICBnZXQgc291cmNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcclxuICB9XHJcblxyXG4gIGdldCB0aW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RpbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgd2Vla2RheSgpIHtcclxuICAgIHJldHVybiB0aGlzLl93ZWVrZGF5O1xyXG4gIH1cclxuXHJcbiAgc2V0IHNjaGVtZShwYXJhbXMpIHtcclxuICAgIGxldCBmcm9tID0gcGFyYW1zLm1lc3NhZ2UuZnJvbTtcclxuICAgIGlmIChpc0RhdGFPYmplY3RVUkwoZnJvbSkpIHtcclxuICAgICAgdGhpcy5fc2NoZW1lID0gZGl2aWRlVVJMKGZyb20pLnR5cGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zY2hlbWUgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0ZShub3cpIHtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIGxldCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgaWYgKGRheS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgZGF5ID0gJzAnICsgZGF5O1xyXG4gICAgfVxyXG4gICAgbGV0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xyXG4gICAgaWYgKG1vbnRoLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICBtb250aCA9ICcwJyArIG1vbnRoO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGF0ZSA9IGRheSArICcvJyArIG1vbnRoICsgJy8nICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRvbWFpbihwYXJhbXMpIHtcclxuICAgIGlmIChwYXJhbXMubWVzc2FnZS5ib2R5LmlkZW50aXR5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fZG9tYWluID0gZGl2aWRlRW1haWwocGFyYW1zLm1lc3NhZ2UuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZS51c2VybmFtZSkuZG9tYWluO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IHR5cGUocGFyYW1zKSB7XHJcbiAgICBsZXQgbWVzc2FnZSA9IHBhcmFtcy5tZXNzYWdlO1xyXG4gICAgaWYgKG1lc3NhZ2UuYm9keS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuX3R5cGUgPSBtZXNzYWdlLmJvZHkudmFsdWUucmVzb3VyY2VUeXBlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IHNvdXJjZShwYXJhbXMpIHtcclxuICAgIGlmIChwYXJhbXMubWVzc2FnZS5ib2R5LmlkZW50aXR5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fc291cmNlID0gcGFyYW1zLm1lc3NhZ2UuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZS51c2VybmFtZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCB0aW1lKG5vdykge1xyXG4gICAgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIGxldCBtaW51dGVzID0gU3RyaW5nKG5vdy5nZXRNaW51dGVzKCkpO1xyXG4gICAgaWYgKG1pbnV0ZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIG1pbnV0ZXMgPSAnMCcgKyBtaW51dGVzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGltZSA9IHBhcnNlSW50KFN0cmluZyhub3cuZ2V0SG91cnMoKSkgKyBtaW51dGVzKTtcclxuICB9XHJcblxyXG4gIHNldCB3ZWVrZGF5KG5vdykge1xyXG4gICAgdGhpcy5fd2Vla2RheSA9IFN0cmluZyhuZXcgRGF0ZSgpLmdldERheSgpKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZVRoaW5rQ3R4O1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBMEJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBL0JBO0FBQ0E7QUFDQTtBQStCQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBeENBO0FBQ0E7QUFDQTtBQXdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUExQ0E7QUFDQTtBQUNBO0FBMENBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUE3Q0E7QUFDQTtBQUNBO0FBNkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQS9DQTtBQUNBO0FBQ0E7QUErQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQXBEQTtBQUNBO0FBQ0E7QUFvREE7QUFDQTtBQUNBOzs7Ozs7QUFJQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///20\n')}})}); \ No newline at end of file +!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("ReThinkCtx",[],n):"object"==typeof exports?exports.ReThinkCtx=n():t.ReThinkCtx=n()}(window,function(){return function(t){var n={};function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{enumerable:!0,get:r})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,n){if(1&n&&(t=e(t)),8&n)return t;if(4&n&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(e.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&n&&"string"!=typeof t)for(var i in t)e.d(r,i,function(n){return t[n]}.bind(null,i));return r},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="",e(e.s=20)}({0:function(t,n,e){"use strict";function r(t){function n(t){return t.replace(/([a-zA-Z-]*)(:\/\/(?:\.)?|:)([-a-zA-Z0-9@:%._+~#=]{2,256})([-a-zA-Z0-9@:%._+~#=\/]*)/gi,"$1,$3,$4").split(",")}var e=n(t);if(e[0]===t&&!e[0].includes("@")){var r={type:"",domain:t,identity:""};return console.warn("[DivideURL] DivideURL don't support url without scheme. Please review your url address",t),r}return e[0]===t&&e[0].includes("@")&&(e=n((e[0]===t?"smtp":e[0])+"://"+e[0])),e[1].includes("@")&&(e[2]=e[0]+"://"+e[1],e[1]=e[1].substr(e[1].indexOf("@")+1)),{type:e[0],domain:e[1],identity:e[2]}}function i(t){return!(Object.keys(t).length>0)}function o(){return Math.floor(Date.now()/1e3)}function u(t){if(t)return JSON.parse(JSON.stringify(t))}function c(t){var n=t.split("/");return n[0]+"//"+n[2]+"/"+n[3]}function s(t){var n=r(t);return n.identity.replace("/","")+"@"+n.domain}function a(t){if("user://"===t.substring(0,7)){var n=r(t);if(n.domain&&n.identity)return t;throw"userURL with wrong format"}return function(t){var n=t.indexOf("@");return"user://"+t.substring(n+1,t.length)+"/"+t.substring(0,n)}(t)}function f(t){var n=t.split("://")[0];return-1===["domain-idp","runtime","domain","hyperty"].indexOf(n)}function d(t){return t.split("@").length>1}function l(t){return t.split("/").length>=3}function y(t){return"user"===r(t).type}function p(t){return"hyperty"===r(t).type}function h(t,n,e){return t[n][e]}function g(t,n,e,r){var i,o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],u=t[n];if(!u.hasOwnProperty(e))throw Error("The configuration "+JSON.stringify(u,"",2)+" don't have the "+e+" resource you are looking for");var c=u[e];return r?(i=c.prefix+t.domain+c.suffix+r,c.hasOwnProperty("fallback")&&o&&(i=c.fallback.indexOf("%domain%")?c.fallback.replace(/(%domain%)/g,t.domain)+r:c.fallback+r)):i=c.prefix+t.domain+c.suffix,i}function v(){function t(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return t()+t()+"-"+t()+"-"+t()+"-"+t()+"-"+t()+t()+t()}function m(t){var n=r(t).domain.split("."),e=n.length;return 1==e?n[e-1]:n[e-2]+"."+n[e-1]}function b(t){var n,e=r(t),i=e.domain.split("."),o=["registry","msg-node"];return i.length>1&&(n=i.filter(function(t){return-1!==o.indexOf(t)})[0]),!(!n||-1===o.indexOf(n))||!!e.type&&-1!==["domain","global","domain-idp"].indexOf(e.type)}function w(t){var n=t.indexOf("@");return{username:t.substring(0,n),domain:t.substring(n+1,t.length)}}function O(t,n,e){t||(t={}),"string"==typeof n&&(n=x(n));for(var r=n.length-1,i=0;i= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return "No console available for logging";\n }\n } else {\n throw "log.setLevel() called with invalid level: " + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel == null ? "WARN" : defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== "string" || name === "") {\n throw new TypeError("You must supply a name when creating a logger.");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n return defaultLogger;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanM/NWM3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGVbbWV0aG9kTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgJ2xvZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGVzZSBwcml2YXRlIGZ1bmN0aW9ucyBhbHdheXMgbmVlZCBgdGhpc2AgdG8gYmUgc2V0IHByb3Blcmx5XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlTG9nZ2luZ01ldGhvZHMobGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2dNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IGxvZ01ldGhvZHNbaV07XG4gICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdID0gKGkgPCBsZXZlbCkgP1xuICAgICAgICAgICAgICAgIG5vb3AgOlxuICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgbG9nLmxvZyBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcbiAgICB9XG5cbiAgICAvLyBJbiBvbGQgSUUgdmVyc2lvbnMsIHRoZSBjb25zb2xlIGlzbid0IHByZXNlbnQgdW50aWwgeW91IGZpcnN0IG9wZW4gaXQuXG4gICAgLy8gV2UgYnVpbGQgcmVhbE1ldGhvZCgpIHJlcGxhY2VtZW50cyBoZXJlIHRoYXQgcmVnZW5lcmF0ZSBsb2dnaW5nIG1ldGhvZHNcbiAgICBmdW5jdGlvbiBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzKG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbCh0aGlzLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHVzZSBjbG9zZWx5IGJvdW5kIHJlYWwgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZSwgYW5kXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIGEgY29uc29sZSB0byBhcHBlYXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICBmdW5jdGlvbiBkZWZhdWx0TWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICByZXR1cm4gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB8fFxuICAgICAgICAgICAgICAgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvZ2dlcihuYW1lLCBkZWZhdWx0TGV2ZWwsIGZhY3RvcnkpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBjdXJyZW50TGV2ZWw7XG4gICAgICB2YXIgc3RvcmFnZUtleSA9IFwibG9nbGV2ZWxcIjtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICpcbiAgICAgICAqIFB1YmxpYyBsb2dnZXIgQVBJIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbCBmb3IgZGV0YWlsc1xuICAgICAgICpcbiAgICAgICAqL1xuXG4gICAgICBzZWxmLm5hbWUgPSBuYW1lO1xuXG4gICAgICBzZWxmLmxldmVscyA9IHsgXCJUUkFDRVwiOiAwLCBcIkRFQlVHXCI6IDEsIFwiSU5GT1wiOiAyLCBcIldBUk5cIjogMyxcbiAgICAgICAgICBcIkVSUk9SXCI6IDQsIFwiU0lMRU5UXCI6IDV9O1xuXG4gICAgICBzZWxmLm1ldGhvZEZhY3RvcnkgPSBmYWN0b3J5IHx8IGRlZmF1bHRNZXRob2RGYWN0b3J5O1xuXG4gICAgICBzZWxmLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50TGV2ZWw7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsLCBwZXJzaXN0KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gXCJzdHJpbmdcIiAmJiBzZWxmLmxldmVsc1tsZXZlbC50b1VwcGVyQ2FzZSgpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGxldmVsID0gc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwibnVtYmVyXCIgJiYgbGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgY3VycmVudExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgICAgIGlmIChwZXJzaXN0ICE9PSBmYWxzZSkgeyAgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgcGVyc2lzdExldmVsSWZQb3NzaWJsZShsZXZlbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZiwgbGV2ZWwsIG5hbWUpO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUgJiYgbGV2ZWwgPCBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIk5vIGNvbnNvbGUgYXZhaWxhYmxlIGZvciBsb2dnaW5nXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgbGV2ZWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXREZWZhdWx0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgICBpZiAoIWdldFBlcnNpc3RlZExldmVsKCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZW5hYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuVFJBQ0UsIHBlcnNpc3QpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5kaXNhYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuU0lMRU5ULCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEluaXRpYWxpemUgd2l0aCB0aGUgcmlnaHQgbGV2ZWxcbiAgICAgIHZhciBpbml0aWFsTGV2ZWwgPSBnZXRQZXJzaXN0ZWRMZXZlbCgpO1xuICAgICAgaWYgKGluaXRpYWxMZXZlbCA9PSBudWxsKSB7XG4gICAgICAgICAgaW5pdGlhbExldmVsID0gZGVmYXVsdExldmVsID09IG51bGwgPyBcIldBUk5cIiA6IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhIG5hbWUgd2hlbiBjcmVhdGluZyBhIGxvZ2dlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV07XG4gICAgICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgICAgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV0gPSBuZXcgTG9nZ2VyKFxuICAgICAgICAgICAgbmFtZSwgZGVmYXVsdExvZ2dlci5nZXRMZXZlbCgpLCBkZWZhdWx0TG9nZ2VyLm1ldGhvZEZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dnZXI7XG4gICAgfTtcblxuICAgIC8vIEdyYWIgdGhlIGN1cnJlbnQgZ2xvYmFsIGxvZyB2YXJpYWJsZSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuICAgIHZhciBfbG9nID0gKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUpID8gd2luZG93LmxvZyA6IHVuZGVmaW5lZDtcbiAgICBkZWZhdWx0TG9nZ2VyLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUgJiZcbiAgICAgICAgICAgICAgIHdpbmRvdy5sb2cgPT09IGRlZmF1bHRMb2dnZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2cgPSBfbG9nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG4gICAgfTtcblxuICAgIGRlZmF1bHRMb2dnZXIuZ2V0TG9nZ2VycyA9IGZ1bmN0aW9uIGdldExvZ2dlcnMoKSB7XG4gICAgICAgIHJldHVybiBfbG9nZ2Vyc0J5TmFtZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxhQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n')},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(3);\nvar core = __webpack_require__(9);\nvar hide = __webpack_require__(14);\nvar redefine = __webpack_require__(11);\nvar ctx = __webpack_require__(21);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcz81Y2ExIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KTtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYgKHRhcmdldCkgcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYgKGV4cG9ydHNba2V5XSAhPSBvdXQpIGhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmIChJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dCkgZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n")},function(module,exports){eval("module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzPzc5ZTUiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///2\n")},function(module,exports){eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2dsb2JhbC5qcz83NzI2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmICh0eXBlb2YgX19nID09ICdudW1iZXInKSBfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3\n")},function(module,exports){eval("module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcz9kM2Y0Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(4);\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qcz9jYjdjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///5\n")},function(module,exports,__webpack_require__){eval("var store = __webpack_require__(58)('wks');\nvar uid = __webpack_require__(30);\nvar Symbol = __webpack_require__(3).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcz8yYjRjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6\n")},function(module,exports,__webpack_require__){eval("var anObject = __webpack_require__(5);\nvar IE8_DOM_DEFINE = __webpack_require__(84);\nvar toPrimitive = __webpack_require__(27);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(8) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcz84NmNjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///7\n")},function(module,exports,__webpack_require__){eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(2)(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzPzllMWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8\n")},function(module,exports){eval("var core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvcmUuanM/ODM3OCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi41LjcnIH07XG5pZiAodHlwZW9mIF9fZSA9PSAnbnVtYmVyJykgX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9\n")},function(module,exports,__webpack_require__){eval("// 7.1.15 ToLength\nvar toInteger = __webpack_require__(25);\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1sZW5ndGguanM/OWRlZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///10\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(3);\nvar hide = __webpack_require__(14);\nvar has = __webpack_require__(13);\nvar SRC = __webpack_require__(30)('src');\nvar TO_STRING = 'toString';\nvar $toString = Function[TO_STRING];\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(9).inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcz8yYWJhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyICR0b1N0cmluZyA9IEZ1bmN0aW9uW1RPX1NUUklOR107XG52YXIgVFBMID0gKCcnICsgJHRvU3RyaW5nKS5zcGxpdChUT19TVFJJTkcpO1xuXG5yZXF1aXJlKCcuL19jb3JlJykuaW5zcGVjdFNvdXJjZSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gJHRvU3RyaW5nLmNhbGwoaXQpO1xufTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIGtleSwgdmFsLCBzYWZlKSB7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZiAoaXNGdW5jdGlvbikgaGFzKHZhbCwgJ25hbWUnKSB8fCBoaWRlKHZhbCwgJ25hbWUnLCBrZXkpO1xuICBpZiAoT1trZXldID09PSB2YWwpIHJldHVybjtcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZiAoTyA9PT0gZ2xvYmFsKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2UgaWYgKCFzYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgICBoaWRlKE8sIGtleSwgdmFsKTtcbiAgfSBlbHNlIGlmIChPW2tleV0pIHtcbiAgICBPW2tleV0gPSB2YWw7XG4gIH0gZWxzZSB7XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH1cbi8vIGFkZCBmYWtlIEZ1bmN0aW9uI3RvU3RyaW5nIGZvciBjb3JyZWN0IHdvcmsgd3JhcHBlZCBtZXRob2RzIC8gY29uc3RydWN0b3JzIHdpdGggbWV0aG9kcyBsaWtlIExvRGFzaCBpc05hdGl2ZVxufSkoRnVuY3Rpb24ucHJvdG90eXBlLCBUT19TVFJJTkcsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiB0aGlzW1NSQ10gfHwgJHRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///11\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar fails = __webpack_require__(2);\nvar defined = __webpack_require__(24);\nvar quot = /\"/g;\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\nvar createHTML = function (string, tag, attribute, value) {\n var S = String(defined(string));\n var p1 = '<' + tag;\n if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '"') + '\"';\n return p1 + '>' + S + '';\n};\nmodule.exports = function (NAME, exec) {\n var O = {};\n O[NAME] = exec(createHTML);\n $export($export.P + $export.F * fails(function () {\n var test = ''[NAME]('\"');\n return test !== test.toLowerCase() || test.split('\"').length > 3;\n }), 'String', O);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctaHRtbC5qcz8zODZiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG52YXIgcXVvdCA9IC9cIi9nO1xuLy8gQi4yLjMuMi4xIENyZWF0ZUhUTUwoc3RyaW5nLCB0YWcsIGF0dHJpYnV0ZSwgdmFsdWUpXG52YXIgY3JlYXRlSFRNTCA9IGZ1bmN0aW9uIChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSkge1xuICB2YXIgUyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICB2YXIgcDEgPSAnPCcgKyB0YWc7XG4gIGlmIChhdHRyaWJ1dGUgIT09ICcnKSBwMSArPSAnICcgKyBhdHRyaWJ1dGUgKyAnPVwiJyArIFN0cmluZyh2YWx1ZSkucmVwbGFjZShxdW90LCAnJnF1b3Q7JykgKyAnXCInO1xuICByZXR1cm4gcDEgKyAnPicgKyBTICsgJzwvJyArIHRhZyArICc+Jztcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FLCBleGVjKSB7XG4gIHZhciBPID0ge307XG4gIE9bTkFNRV0gPSBleGVjKGNyZWF0ZUhUTUwpO1xuICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGVzdCA9ICcnW05BTUVdKCdcIicpO1xuICAgIHJldHVybiB0ZXN0ICE9PSB0ZXN0LnRvTG93ZXJDYXNlKCkgfHwgdGVzdC5zcGxpdCgnXCInKS5sZW5ndGggPiAzO1xuICB9KSwgJ1N0cmluZycsIE8pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///12\n")},function(module,exports){eval("var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanM/NjlhOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///13\n")},function(module,exports,__webpack_require__){eval("var dP = __webpack_require__(7);\nvar createDesc = __webpack_require__(29);\nmodule.exports = __webpack_require__(8) ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzPzMyZTkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///14\n")},function(module,exports,__webpack_require__){eval("// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(44);\nvar defined = __webpack_require__(24);\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzPzY4MjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///15\n")},function(module,exports,__webpack_require__){eval("// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(24);\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanM/NGJmOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///16\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar fails = __webpack_require__(2);\n\nmodule.exports = function (method, arg) {\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call\n arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpY3QtbWV0aG9kLmpzPzJmMjEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsXG4gICAgYXJnID8gbWV0aG9kLmNhbGwobnVsbCwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAxKSA6IG1ldGhvZC5jYWxsKG51bGwpO1xuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17\n")},function(module,exports,__webpack_require__){eval("var pIE = __webpack_require__(45);\nvar createDesc = __webpack_require__(29);\nvar toIObject = __webpack_require__(15);\nvar toPrimitive = __webpack_require__(27);\nvar has = __webpack_require__(13);\nvar IE8_DOM_DEFINE = __webpack_require__(84);\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(8) ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qcz8xMWU5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSU9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzKE8sIFApKSByZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///18\n")},function(module,exports,__webpack_require__){eval("// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(1);\nvar core = __webpack_require__(9);\nvar fails = __webpack_require__(2);\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qtc2FwLmpzPzVlZGEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjKSB7XG4gIHZhciBmbiA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXTtcbiAgdmFyIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///19\n")},function(module,exports,__webpack_require__){eval("// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = __webpack_require__(21);\nvar IObject = __webpack_require__(44);\nvar toObject = __webpack_require__(16);\nvar toLength = __webpack_require__(10);\nvar asc = __webpack_require__(208);\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1tZXRob2RzLmpzPzBhNDkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFzYyA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUWVBFLCAkY3JlYXRlKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgdmFyIGNyZWF0ZSA9ICRjcmVhdGUgfHwgYXNjO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJT2JqZWN0KE8pO1xuICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsLCByZXM7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSByZXN1bHRbaW5kZXhdID0gcmVzOyAgIC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXMpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWw7ICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///20\n")},function(module,exports,__webpack_require__){eval("// optional / simple context binding\nvar aFunction = __webpack_require__(22);\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jdHguanM/OWI0MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///21\n")},function(module,exports){eval("module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzP2Q4ZTgiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///22\n")},function(module,exports){eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2YuanM/MmQ5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///23\n")},function(module,exports){eval('// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError("Can\'t call method on " + it);\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzP2JlMTMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///24\n')},function(module,exports){eval("// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbnRlZ2VyLmpzPzQ1ODgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///25\n")},function(module,exports,__webpack_require__){"use strict";eval("\nif (__webpack_require__(8)) {\n var LIBRARY = __webpack_require__(31);\n var global = __webpack_require__(3);\n var fails = __webpack_require__(2);\n var $export = __webpack_require__(1);\n var $typed = __webpack_require__(56);\n var $buffer = __webpack_require__(81);\n var ctx = __webpack_require__(21);\n var anInstance = __webpack_require__(41);\n var propertyDesc = __webpack_require__(29);\n var hide = __webpack_require__(14);\n var redefineAll = __webpack_require__(42);\n var toInteger = __webpack_require__(25);\n var toLength = __webpack_require__(10);\n var toIndex = __webpack_require__(109);\n var toAbsoluteIndex = __webpack_require__(33);\n var toPrimitive = __webpack_require__(27);\n var has = __webpack_require__(13);\n var classof = __webpack_require__(48);\n var isObject = __webpack_require__(4);\n var toObject = __webpack_require__(16);\n var isArrayIter = __webpack_require__(74);\n var create = __webpack_require__(34);\n var getPrototypeOf = __webpack_require__(36);\n var gOPN = __webpack_require__(35).f;\n var getIterFn = __webpack_require__(76);\n var uid = __webpack_require__(30);\n var wks = __webpack_require__(6);\n var createArrayMethod = __webpack_require__(20);\n var createArrayIncludes = __webpack_require__(46);\n var speciesConstructor = __webpack_require__(53);\n var ArrayIterators = __webpack_require__(78);\n var Iterators = __webpack_require__(38);\n var $iterDetect = __webpack_require__(50);\n var setSpecies = __webpack_require__(40);\n var arrayFill = __webpack_require__(77);\n var arrayCopyWithin = __webpack_require__(101);\n var $DP = __webpack_require__(7);\n var $GOPD = __webpack_require__(18);\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC1hcnJheS5qcz9lYzMwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbmlmIChyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpKSB7XG4gIHZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xuICB2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG4gIHZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG4gIHZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4gIHZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xuICB2YXIgJGJ1ZmZlciA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpO1xuICB2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG4gIHZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbiAgdmFyIHByb3BlcnR5RGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbiAgdmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG4gIHZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xuICB2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xuICB2YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbiAgdmFyIHRvSW5kZXggPSByZXF1aXJlKCcuL190by1pbmRleCcpO1xuICB2YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbiAgdmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG4gIHZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbiAgdmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG4gIHZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuICB2YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbiAgdmFyIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpO1xuICB2YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xuICB2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG4gIHZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xuICB2YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbiAgdmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xuICB2YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG4gIHZhciBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKTtcbiAgdmFyIGNyZWF0ZUFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpO1xuICB2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuICB2YXIgQXJyYXlJdGVyYXRvcnMgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xuICB2YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG4gIHZhciAkaXRlckRldGVjdCA9IHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0Jyk7XG4gIHZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbiAgdmFyIGFycmF5RmlsbCA9IHJlcXVpcmUoJy4vX2FycmF5LWZpbGwnKTtcbiAgdmFyIGFycmF5Q29weVdpdGhpbiA9IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJyk7XG4gIHZhciAkRFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbiAgdmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbiAgdmFyIGRQID0gJERQLmY7XG4gIHZhciBnT1BEID0gJEdPUEQuZjtcbiAgdmFyIFJhbmdlRXJyb3IgPSBnbG9iYWwuUmFuZ2VFcnJvcjtcbiAgdmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG4gIHZhciBVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXk7XG4gIHZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInO1xuICB2YXIgU0hBUkVEX0JVRkZFUiA9ICdTaGFyZWQnICsgQVJSQVlfQlVGRkVSO1xuICB2YXIgQllURVNfUEVSX0VMRU1FTlQgPSAnQllURVNfUEVSX0VMRU1FTlQnO1xuICB2YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG4gIHZhciBBcnJheVByb3RvID0gQXJyYXlbUFJPVE9UWVBFXTtcbiAgdmFyICRBcnJheUJ1ZmZlciA9ICRidWZmZXIuQXJyYXlCdWZmZXI7XG4gIHZhciAkRGF0YVZpZXcgPSAkYnVmZmVyLkRhdGFWaWV3O1xuICB2YXIgYXJyYXlGb3JFYWNoID0gY3JlYXRlQXJyYXlNZXRob2QoMCk7XG4gIHZhciBhcnJheUZpbHRlciA9IGNyZWF0ZUFycmF5TWV0aG9kKDIpO1xuICB2YXIgYXJyYXlTb21lID0gY3JlYXRlQXJyYXlNZXRob2QoMyk7XG4gIHZhciBhcnJheUV2ZXJ5ID0gY3JlYXRlQXJyYXlNZXRob2QoNCk7XG4gIHZhciBhcnJheUZpbmQgPSBjcmVhdGVBcnJheU1ldGhvZCg1KTtcbiAgdmFyIGFycmF5RmluZEluZGV4ID0gY3JlYXRlQXJyYXlNZXRob2QoNik7XG4gIHZhciBhcnJheUluY2x1ZGVzID0gY3JlYXRlQXJyYXlJbmNsdWRlcyh0cnVlKTtcbiAgdmFyIGFycmF5SW5kZXhPZiA9IGNyZWF0ZUFycmF5SW5jbHVkZXMoZmFsc2UpO1xuICB2YXIgYXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9ycy52YWx1ZXM7XG4gIHZhciBhcnJheUtleXMgPSBBcnJheUl0ZXJhdG9ycy5rZXlzO1xuICB2YXIgYXJyYXlFbnRyaWVzID0gQXJyYXlJdGVyYXRvcnMuZW50cmllcztcbiAgdmFyIGFycmF5TGFzdEluZGV4T2YgPSBBcnJheVByb3RvLmxhc3RJbmRleE9mO1xuICB2YXIgYXJyYXlSZWR1Y2UgPSBBcnJheVByb3RvLnJlZHVjZTtcbiAgdmFyIGFycmF5UmVkdWNlUmlnaHQgPSBBcnJheVByb3RvLnJlZHVjZVJpZ2h0O1xuICB2YXIgYXJyYXlKb2luID0gQXJyYXlQcm90by5qb2luO1xuICB2YXIgYXJyYXlTb3J0ID0gQXJyYXlQcm90by5zb3J0O1xuICB2YXIgYXJyYXlTbGljZSA9IEFycmF5UHJvdG8uc2xpY2U7XG4gIHZhciBhcnJheVRvU3RyaW5nID0gQXJyYXlQcm90by50b1N0cmluZztcbiAgdmFyIGFycmF5VG9Mb2NhbGVTdHJpbmcgPSBBcnJheVByb3RvLnRvTG9jYWxlU3RyaW5nO1xuICB2YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG4gIHZhciBUQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJyk7XG4gIHZhciBUWVBFRF9DT05TVFJVQ1RPUiA9IHVpZCgndHlwZWRfY29uc3RydWN0b3InKTtcbiAgdmFyIERFRl9DT05TVFJVQ1RPUiA9IHVpZCgnZGVmX2NvbnN0cnVjdG9yJyk7XG4gIHZhciBBTExfQ09OU1RSVUNUT1JTID0gJHR5cGVkLkNPTlNUUjtcbiAgdmFyIFRZUEVEX0FSUkFZID0gJHR5cGVkLlRZUEVEO1xuICB2YXIgVklFVyA9ICR0eXBlZC5WSUVXO1xuICB2YXIgV1JPTkdfTEVOR1RIID0gJ1dyb25nIGxlbmd0aCEnO1xuXG4gIHZhciAkbWFwID0gY3JlYXRlQXJyYXlNZXRob2QoMSwgZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICAgIHJldHVybiBhbGxvY2F0ZShzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSwgbGVuZ3RoKTtcbiAgfSk7XG5cbiAgdmFyIExJVFRMRV9FTkRJQU4gPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBVaW50MTZBcnJheShbMV0pLmJ1ZmZlcilbMF0gPT09IDE7XG4gIH0pO1xuXG4gIHZhciBGT1JDRURfU0VUID0gISFVaW50OEFycmF5ICYmICEhVWludDhBcnJheVtQUk9UT1RZUEVdLnNldCAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IFVpbnQ4QXJyYXkoMSkuc2V0KHt9KTtcbiAgfSk7XG5cbiAgdmFyIHRvT2Zmc2V0ID0gZnVuY3Rpb24gKGl0LCBCWVRFUykge1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXIoaXQpO1xuICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQhJyk7XG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfTtcblxuICB2YXIgdmFsaWRhdGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICBpZiAoaXNPYmplY3QoaXQpICYmIFRZUEVEX0FSUkFZIGluIGl0KSByZXR1cm4gaXQ7XG4gICAgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSB0eXBlZCBhcnJheSEnKTtcbiAgfTtcblxuICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbiAoQywgbGVuZ3RoKSB7XG4gICAgaWYgKCEoaXNPYmplY3QoQykgJiYgVFlQRURfQ09OU1RSVUNUT1IgaW4gQykpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSXQgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IhJyk7XG4gICAgfSByZXR1cm4gbmV3IEMobGVuZ3RoKTtcbiAgfTtcblxuICB2YXIgc3BlY2llc0Zyb21MaXN0ID0gZnVuY3Rpb24gKE8sIGxpc3QpIHtcbiAgICByZXR1cm4gZnJvbUxpc3Qoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSksIGxpc3QpO1xuICB9O1xuXG4gIHZhciBmcm9tTGlzdCA9IGZ1bmN0aW9uIChDLCBsaXN0KSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gICAgdmFyIHJlc3VsdCA9IGFsbG9jYXRlKEMsIGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciBhZGRHZXR0ZXIgPSBmdW5jdGlvbiAoaXQsIGtleSwgaW50ZXJuYWwpIHtcbiAgICBkUChpdCwga2V5LCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZFtpbnRlcm5hbF07IH0gfSk7XG4gIH07XG5cbiAgdmFyICRmcm9tID0gZnVuY3Rpb24gZnJvbShzb3VyY2UgLyogLCBtYXBmbiwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3Qoc291cmNlKTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpdGVyRm4gPSBnZXRJdGVyRm4oTyk7XG4gICAgdmFyIGksIGxlbmd0aCwgdmFsdWVzLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICFpc0FycmF5SXRlcihpdGVyRm4pKSB7XG4gICAgICBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHZhbHVlcyA9IFtdLCBpID0gMDsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyBpKyspIHtcbiAgICAgICAgdmFsdWVzLnB1c2goc3RlcC52YWx1ZSk7XG4gICAgICB9IE8gPSB2YWx1ZXM7XG4gICAgfVxuICAgIGlmIChtYXBwaW5nICYmIGFMZW4gPiAyKSBtYXBmbiA9IGN0eChtYXBmbiwgYXJndW1lbnRzWzJdLCAyKTtcbiAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCksIHJlc3VsdCA9IGFsbG9jYXRlKHRoaXMsIGxlbmd0aCk7IGxlbmd0aCA+IGk7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gbWFwcGluZyA/IG1hcGZuKE9baV0sIGkpIDogT1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgJG9mID0gZnVuY3Rpb24gb2YoLyogLi4uaXRlbXMgKi8pIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBhbGxvY2F0ZSh0aGlzLCBsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleCsrXTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIGlPUyBTYWZhcmkgNi54IGZhaWxzIGhlcmVcbiAgdmFyIFRPX0xPQ0FMRV9CVUcgPSAhIVVpbnQ4QXJyYXkgJiYgZmFpbHMoZnVuY3Rpb24gKCkgeyBhcnJheVRvTG9jYWxlU3RyaW5nLmNhbGwobmV3IFVpbnQ4QXJyYXkoMSkpOyB9KTtcblxuICB2YXIgJHRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9Mb2NhbGVTdHJpbmcoKSB7XG4gICAgcmV0dXJuIGFycmF5VG9Mb2NhbGVTdHJpbmcuYXBwbHkoVE9fTE9DQUxFX0JVRyA/IGFycmF5U2xpY2UuY2FsbCh2YWxpZGF0ZSh0aGlzKSkgOiB2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgfTtcblxuICB2YXIgcHJvdG8gPSB7XG4gICAgY29weVdpdGhpbjogZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0IC8qICwgZW5kICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlDb3B5V2l0aGluLmNhbGwodmFsaWRhdGUodGhpcyksIHRhcmdldCwgc3RhcnQsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5RXZlcnkodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZpbGw6IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCwgZW5kICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUZpbGwuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIHNwZWNpZXNGcm9tTGlzdCh0aGlzLCBhcnJheUZpbHRlcih2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbixcbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpKTtcbiAgICB9LFxuICAgIGZpbmQ6IGZ1bmN0aW9uIGZpbmQocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5RmluZCh2YWxpZGF0ZSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChwcmVkaWNhdGUgLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaW5kSW5kZXgodmFsaWRhdGUodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgYXJyYXlGb3JFYWNoKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUluZGV4T2YodmFsaWRhdGUodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlJbmNsdWRlcyh2YWxpZGF0ZSh0aGlzKSwgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5Sm9pbi5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUxhc3RJbmRleE9mLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgbWFwOiBmdW5jdGlvbiBtYXAobWFwZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gJG1hcCh2YWxpZGF0ZSh0aGlzKSwgbWFwZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlUmlnaHQuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgdmFyIGxlbmd0aCA9IHZhbGlkYXRlKHRoYXQpLmxlbmd0aDtcbiAgICAgIHZhciBtaWRkbGUgPSBNYXRoLmZsb29yKGxlbmd0aCAvIDIpO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIHdoaWxlIChpbmRleCA8IG1pZGRsZSkge1xuICAgICAgICB2YWx1ZSA9IHRoYXRbaW5kZXhdO1xuICAgICAgICB0aGF0W2luZGV4KytdID0gdGhhdFstLWxlbmd0aF07XG4gICAgICAgIHRoYXRbbGVuZ3RoXSA9IHZhbHVlO1xuICAgICAgfSByZXR1cm4gdGhhdDtcbiAgICB9LFxuICAgIHNvbWU6IGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheVNvbWUodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gICAgICByZXR1cm4gYXJyYXlTb3J0LmNhbGwodmFsaWRhdGUodGhpcyksIGNvbXBhcmVmbik7XG4gICAgfSxcbiAgICBzdWJhcnJheTogZnVuY3Rpb24gc3ViYXJyYXkoYmVnaW4sIGVuZCkge1xuICAgICAgdmFyIE8gPSB2YWxpZGF0ZSh0aGlzKTtcbiAgICAgIHZhciBsZW5ndGggPSBPLmxlbmd0aDtcbiAgICAgIHZhciAkYmVnaW4gPSB0b0Fic29sdXRlSW5kZXgoYmVnaW4sIGxlbmd0aCk7XG4gICAgICByZXR1cm4gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSkoXG4gICAgICAgIE8uYnVmZmVyLFxuICAgICAgICBPLmJ5dGVPZmZzZXQgKyAkYmVnaW4gKiBPLkJZVEVTX1BFUl9FTEVNRU5ULFxuICAgICAgICB0b0xlbmd0aCgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpKSAtICRiZWdpbilcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHZhciAkc2xpY2UgPSBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHNwZWNpZXNGcm9tTGlzdCh0aGlzLCBhcnJheVNsaWNlLmNhbGwodmFsaWRhdGUodGhpcyksIHN0YXJ0LCBlbmQpKTtcbiAgfTtcblxuICB2YXIgJHNldCA9IGZ1bmN0aW9uIHNldChhcnJheUxpa2UgLyogLCBvZmZzZXQgKi8pIHtcbiAgICB2YWxpZGF0ZSh0aGlzKTtcbiAgICB2YXIgb2Zmc2V0ID0gdG9PZmZzZXQoYXJndW1lbnRzWzFdLCAxKTtcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgdmFyIHNyYyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHNyYy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgaWYgKGxlbiArIG9mZnNldCA+IGxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHdoaWxlIChpbmRleCA8IGxlbikgdGhpc1tvZmZzZXQgKyBpbmRleF0gPSBzcmNbaW5kZXgrK107XG4gIH07XG5cbiAgdmFyICRpdGVyYXRvcnMgPSB7XG4gICAgZW50cmllczogZnVuY3Rpb24gZW50cmllcygpIHtcbiAgICAgIHJldHVybiBhcnJheUVudHJpZXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfSxcbiAgICBrZXlzOiBmdW5jdGlvbiBrZXlzKCkge1xuICAgICAgcmV0dXJuIGFycmF5S2V5cy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9LFxuICAgIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkge1xuICAgICAgcmV0dXJuIGFycmF5VmFsdWVzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaXNUQUluZGV4ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHRhcmdldClcbiAgICAgICYmIHRhcmdldFtUWVBFRF9BUlJBWV1cbiAgICAgICYmIHR5cGVvZiBrZXkgIT0gJ3N5bWJvbCdcbiAgICAgICYmIGtleSBpbiB0YXJnZXRcbiAgICAgICYmIFN0cmluZygra2V5KSA9PSBTdHJpbmcoa2V5KTtcbiAgfTtcbiAgdmFyICRnZXREZXNjID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSB7XG4gICAgcmV0dXJuIGlzVEFJbmRleCh0YXJnZXQsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpXG4gICAgICA/IHByb3BlcnR5RGVzYygyLCB0YXJnZXRba2V5XSlcbiAgICAgIDogZ09QRCh0YXJnZXQsIGtleSk7XG4gIH07XG4gIHZhciAkc2V0RGVzYyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgaWYgKGlzVEFJbmRleCh0YXJnZXQsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpXG4gICAgICAmJiBpc09iamVjdChkZXNjKVxuICAgICAgJiYgaGFzKGRlc2MsICd2YWx1ZScpXG4gICAgICAmJiAhaGFzKGRlc2MsICdnZXQnKVxuICAgICAgJiYgIWhhcyhkZXNjLCAnc2V0JylcbiAgICAgIC8vIFRPRE86IGFkZCB2YWxpZGF0aW9uIGRlc2NyaXB0b3Igdy9vIGNhbGxpbmcgYWNjZXNzb3JzXG4gICAgICAmJiAhZGVzYy5jb25maWd1cmFibGVcbiAgICAgICYmICghaGFzKGRlc2MsICd3cml0YWJsZScpIHx8IGRlc2Mud3JpdGFibGUpXG4gICAgICAmJiAoIWhhcyhkZXNjLCAnZW51bWVyYWJsZScpIHx8IGRlc2MuZW51bWVyYWJsZSlcbiAgICApIHtcbiAgICAgIHRhcmdldFtrZXldID0gZGVzYy52YWx1ZTtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSByZXR1cm4gZFAodGFyZ2V0LCBrZXksIGRlc2MpO1xuICB9O1xuXG4gIGlmICghQUxMX0NPTlNUUlVDVE9SUykge1xuICAgICRHT1BELmYgPSAkZ2V0RGVzYztcbiAgICAkRFAuZiA9ICRzZXREZXNjO1xuICB9XG5cbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhQUxMX0NPTlNUUlVDVE9SUywgJ09iamVjdCcsIHtcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXREZXNjLFxuICAgIGRlZmluZVByb3BlcnR5OiAkc2V0RGVzY1xuICB9KTtcblxuICBpZiAoZmFpbHMoZnVuY3Rpb24gKCkgeyBhcnJheVRvU3RyaW5nLmNhbGwoe30pOyB9KSkge1xuICAgIGFycmF5VG9TdHJpbmcgPSBhcnJheVRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciAkVHlwZWRBcnJheVByb3RvdHlwZSQgPSByZWRlZmluZUFsbCh7fSwgcHJvdG8pO1xuICByZWRlZmluZUFsbCgkVHlwZWRBcnJheVByb3RvdHlwZSQsICRpdGVyYXRvcnMpO1xuICBoaWRlKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgSVRFUkFUT1IsICRpdGVyYXRvcnMudmFsdWVzKTtcbiAgcmVkZWZpbmVBbGwoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCB7XG4gICAgc2xpY2U6ICRzbGljZSxcbiAgICBzZXQ6ICRzZXQsXG4gICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsgLyogbm9vcCAqLyB9LFxuICAgIHRvU3RyaW5nOiBhcnJheVRvU3RyaW5nLFxuICAgIHRvTG9jYWxlU3RyaW5nOiAkdG9Mb2NhbGVTdHJpbmdcbiAgfSk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdidWZmZXInLCAnYicpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnl0ZU9mZnNldCcsICdvJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdieXRlTGVuZ3RoJywgJ2wnKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2xlbmd0aCcsICdlJyk7XG4gIGRQKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgVEFHLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzW1RZUEVEX0FSUkFZXTsgfVxuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBCWVRFUywgd3JhcHBlciwgQ0xBTVBFRCkge1xuICAgIENMQU1QRUQgPSAhIUNMQU1QRUQ7XG4gICAgdmFyIE5BTUUgPSBLRVkgKyAoQ0xBTVBFRCA/ICdDbGFtcGVkJyA6ICcnKSArICdBcnJheSc7XG4gICAgdmFyIEdFVFRFUiA9ICdnZXQnICsgS0VZO1xuICAgIHZhciBTRVRURVIgPSAnc2V0JyArIEtFWTtcbiAgICB2YXIgVHlwZWRBcnJheSA9IGdsb2JhbFtOQU1FXTtcbiAgICB2YXIgQmFzZSA9IFR5cGVkQXJyYXkgfHwge307XG4gICAgdmFyIFRBQyA9IFR5cGVkQXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoVHlwZWRBcnJheSk7XG4gICAgdmFyIEZPUkNFRCA9ICFUeXBlZEFycmF5IHx8ICEkdHlwZWQuQUJWO1xuICAgIHZhciBPID0ge307XG4gICAgdmFyIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5ICYmIFR5cGVkQXJyYXlbUFJPVE9UWVBFXTtcbiAgICB2YXIgZ2V0dGVyID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoYXQuX2Q7XG4gICAgICByZXR1cm4gZGF0YS52W0dFVFRFUl0oaW5kZXggKiBCWVRFUyArIGRhdGEubywgTElUVExFX0VORElBTik7XG4gICAgfTtcbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGF0Ll9kO1xuICAgICAgaWYgKENMQU1QRUQpIHZhbHVlID0gKHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSkpIDwgMCA/IDAgOiB2YWx1ZSA+IDB4ZmYgPyAweGZmIDogdmFsdWUgJiAweGZmO1xuICAgICAgZGF0YS52W1NFVFRFUl0oaW5kZXggKiBCWVRFUyArIGRhdGEubywgdmFsdWUsIExJVFRMRV9FTkRJQU4pO1xuICAgIH07XG4gICAgdmFyIGFkZEVsZW1lbnQgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIGRQKHRoYXQsIGluZGV4LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBnZXR0ZXIodGhpcywgaW5kZXgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBzZXR0ZXIodGhpcywgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSB7XG4gICAgICBUeXBlZEFycmF5ID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgZGF0YSwgJG9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXksIE5BTUUsICdfZCcpO1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIGJ1ZmZlciwgYnl0ZUxlbmd0aCwgbGVuZ3RoLCBrbGFzcztcbiAgICAgICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgICAgIGxlbmd0aCA9IHRvSW5kZXgoZGF0YSk7XG4gICAgICAgICAgYnl0ZUxlbmd0aCA9IGxlbmd0aCAqIEJZVEVTO1xuICAgICAgICAgIGJ1ZmZlciA9IG5ldyAkQXJyYXlCdWZmZXIoYnl0ZUxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mICRBcnJheUJ1ZmZlciB8fCAoa2xhc3MgPSBjbGFzc29mKGRhdGEpKSA9PSBBUlJBWV9CVUZGRVIgfHwga2xhc3MgPT0gU0hBUkVEX0JVRkZFUikge1xuICAgICAgICAgIGJ1ZmZlciA9IGRhdGE7XG4gICAgICAgICAgb2Zmc2V0ID0gdG9PZmZzZXQoJG9mZnNldCwgQllURVMpO1xuICAgICAgICAgIHZhciAkbGVuID0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIGlmICgkbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICgkbGVuICUgQllURVMpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSAkbGVuIC0gb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKGJ5dGVMZW5ndGggPCAwKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSB0b0xlbmd0aCgkbGVuZ3RoKSAqIEJZVEVTO1xuICAgICAgICAgICAgaWYgKGJ5dGVMZW5ndGggKyBvZmZzZXQgPiAkbGVuKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbmd0aCA9IGJ5dGVMZW5ndGggLyBCWVRFUztcbiAgICAgICAgfSBlbHNlIGlmIChUWVBFRF9BUlJBWSBpbiBkYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIGZyb21MaXN0KFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAkZnJvbS5jYWxsKFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGhpZGUodGhhdCwgJ19kJywge1xuICAgICAgICAgIGI6IGJ1ZmZlcixcbiAgICAgICAgICBvOiBvZmZzZXQsXG4gICAgICAgICAgbDogYnl0ZUxlbmd0aCxcbiAgICAgICAgICBlOiBsZW5ndGgsXG4gICAgICAgICAgdjogbmV3ICREYXRhVmlldyhidWZmZXIpXG4gICAgICAgIH0pO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIGFkZEVsZW1lbnQodGhhdCwgaW5kZXgrKyk7XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5W1BST1RPVFlQRV0gPSBjcmVhdGUoJFR5cGVkQXJyYXlQcm90b3R5cGUkKTtcbiAgICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgVHlwZWRBcnJheSk7XG4gICAgfSBlbHNlIGlmICghZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgVHlwZWRBcnJheSgxKTtcbiAgICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgbmV3IFR5cGVkQXJyYXkoLTEpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIH0pIHx8ICEkaXRlckRldGVjdChmdW5jdGlvbiAoaXRlcikge1xuICAgICAgbmV3IFR5cGVkQXJyYXkoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KG51bGwpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgbmV3IFR5cGVkQXJyYXkoMS41KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KGl0ZXIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIH0sIHRydWUpKSB7XG4gICAgICBUeXBlZEFycmF5ID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgZGF0YSwgJG9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXksIE5BTUUpO1xuICAgICAgICB2YXIga2xhc3M7XG4gICAgICAgIC8vIGB3c2AgbW9kdWxlIGJ1ZywgdGVtcG9yYXJpbHkgcmVtb3ZlIHZhbGlkYXRpb24gbGVuZ3RoIGZvciBVaW50OEFycmF5XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzL3B1bGwvNjQ1XG4gICAgICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHJldHVybiBuZXcgQmFzZSh0b0luZGV4KGRhdGEpKTtcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiAkQXJyYXlCdWZmZXIgfHwgKGtsYXNzID0gY2xhc3NvZihkYXRhKSkgPT0gQVJSQVlfQlVGRkVSIHx8IGtsYXNzID09IFNIQVJFRF9CVUZGRVIpIHtcbiAgICAgICAgICByZXR1cm4gJGxlbmd0aCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IG5ldyBCYXNlKGRhdGEsIHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKSwgJGxlbmd0aClcbiAgICAgICAgICAgIDogJG9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gbmV3IEJhc2UoZGF0YSwgdG9PZmZzZXQoJG9mZnNldCwgQllURVMpKVxuICAgICAgICAgICAgICA6IG5ldyBCYXNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChUWVBFRF9BUlJBWSBpbiBkYXRhKSByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIHJldHVybiAkZnJvbS5jYWxsKFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgfSk7XG4gICAgICBhcnJheUZvckVhY2goVEFDICE9PSBGdW5jdGlvbi5wcm90b3R5cGUgPyBnT1BOKEJhc2UpLmNvbmNhdChnT1BOKFRBQykpIDogZ09QTihCYXNlKSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gVHlwZWRBcnJheSkpIGhpZGUoVHlwZWRBcnJheSwga2V5LCBCYXNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgICBUeXBlZEFycmF5W1BST1RPVFlQRV0gPSBUeXBlZEFycmF5UHJvdG90eXBlO1xuICAgICAgaWYgKCFMSUJSQVJZKSBUeXBlZEFycmF5UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHlwZWRBcnJheTtcbiAgICB9XG4gICAgdmFyICRuYXRpdmVJdGVyYXRvciA9IFR5cGVkQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdO1xuICAgIHZhciBDT1JSRUNUX0lURVJfTkFNRSA9ICEhJG5hdGl2ZUl0ZXJhdG9yXG4gICAgICAmJiAoJG5hdGl2ZUl0ZXJhdG9yLm5hbWUgPT0gJ3ZhbHVlcycgfHwgJG5hdGl2ZUl0ZXJhdG9yLm5hbWUgPT0gdW5kZWZpbmVkKTtcbiAgICB2YXIgJGl0ZXJhdG9yID0gJGl0ZXJhdG9ycy52YWx1ZXM7XG4gICAgaGlkZShUeXBlZEFycmF5LCBUWVBFRF9DT05TVFJVQ1RPUiwgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBUWVBFRF9BUlJBWSwgTkFNRSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBWSUVXLCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIERFRl9DT05TVFJVQ1RPUiwgVHlwZWRBcnJheSk7XG5cbiAgICBpZiAoQ0xBTVBFRCA/IG5ldyBUeXBlZEFycmF5KDEpW1RBR10gIT0gTkFNRSA6ICEoVEFHIGluIFR5cGVkQXJyYXlQcm90b3R5cGUpKSB7XG4gICAgICBkUChUeXBlZEFycmF5UHJvdG90eXBlLCBUQUcsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBOQU1FOyB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBPW05BTUVdID0gVHlwZWRBcnJheTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogKFR5cGVkQXJyYXkgIT0gQmFzZSksIE8pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlMsIE5BTUUsIHtcbiAgICAgIEJZVEVTX1BFUl9FTEVNRU5UOiBCWVRFU1xuICAgIH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7IEJhc2Uub2YuY2FsbChUeXBlZEFycmF5LCAxKTsgfSksIE5BTUUsIHtcbiAgICAgIGZyb206ICRmcm9tLFxuICAgICAgb2Y6ICRvZlxuICAgIH0pO1xuXG4gICAgaWYgKCEoQllURVNfUEVSX0VMRU1FTlQgaW4gVHlwZWRBcnJheVByb3RvdHlwZSkpIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgQllURVNfUEVSX0VMRU1FTlQsIEJZVEVTKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QLCBOQU1FLCBwcm90byk7XG5cbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRURfU0VULCBOQU1FLCB7IHNldDogJHNldCB9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIUNPUlJFQ1RfSVRFUl9OQU1FLCBOQU1FLCAkaXRlcmF0b3JzKTtcblxuICAgIGlmICghTElCUkFSWSAmJiBUeXBlZEFycmF5UHJvdG90eXBlLnRvU3RyaW5nICE9IGFycmF5VG9TdHJpbmcpIFR5cGVkQXJyYXlQcm90b3R5cGUudG9TdHJpbmcgPSBhcnJheVRvU3RyaW5nO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBuZXcgVHlwZWRBcnJheSgxKS5zbGljZSgpO1xuICAgIH0pLCBOQU1FLCB7IHNsaWNlOiAkc2xpY2UgfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gWzEsIDJdLnRvTG9jYWxlU3RyaW5nKCkgIT0gbmV3IFR5cGVkQXJyYXkoWzEsIDJdKS50b0xvY2FsZVN0cmluZygpO1xuICAgIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nLmNhbGwoWzEsIDJdKTtcbiAgICB9KSksIE5BTUUsIHsgdG9Mb2NhbGVTdHJpbmc6ICR0b0xvY2FsZVN0cmluZyB9KTtcblxuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IENPUlJFQ1RfSVRFUl9OQU1FID8gJG5hdGl2ZUl0ZXJhdG9yIDogJGl0ZXJhdG9yO1xuICAgIGlmICghTElCUkFSWSAmJiAhQ09SUkVDVF9JVEVSX05BTUUpIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgSVRFUkFUT1IsICRpdGVyYXRvcik7XG4gIH07XG59IGVsc2UgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///26\n")},function(module,exports,__webpack_require__){eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(4);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1wcmltaXRpdmUuanM/NmE5OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///27\n")},function(module,exports,__webpack_require__){eval("var META = __webpack_require__(30)('meta');\nvar isObject = __webpack_require__(4);\nvar has = __webpack_require__(13);\nvar setDesc = __webpack_require__(7).f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !__webpack_require__(2)(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tZXRhLmpzPzY3YWIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIE1FVEEgPSByZXF1aXJlKCcuL191aWQnKSgnbWV0YScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgc2V0RGVzYyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaWQgPSAwO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgRlJFRVpFID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBzZXREZXNjKGl0LCBNRVRBLCB7IHZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBXS5pO1xufTtcbnZhciBnZXRXZWFrID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBXS53O1xufTtcbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWkUgJiYgbWV0YS5ORUVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQSkpIHNldE1ldGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgS0VZOiBNRVRBLFxuICBORUVEOiBmYWxzZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2VhazogZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///28\n")},function(module,exports){eval("module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzPzQ2MzAiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///29\n")},function(module,exports){eval("var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL191aWQuanM/Y2E1YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///30\n")},function(module,exports){eval("module.exports = false;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzPzJkMDAiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///31\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(86);\nvar enumBugKeys = __webpack_require__(61);\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcz8wZDU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///32\n")},function(module,exports,__webpack_require__){eval("var toInteger = __webpack_require__(25);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcz83N2YxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///33\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(5);\nvar dPs = __webpack_require__(87);\nvar enumBugKeys = __webpack_require__(61);\nvar IE_PROTO = __webpack_require__(60)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = __webpack_require__(57)('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n __webpack_require__(63).appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzPzJhZWIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///34\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(86);\nvar hiddenKeys = __webpack_require__(61).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qcz85MDkzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///35\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(13);\nvar toObject = __webpack_require__(16);\nvar IE_PROTO = __webpack_require__(60)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzPzM4ZmQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///36\n")},function(module,exports,__webpack_require__){eval("var def = __webpack_require__(7).f;\nvar has = __webpack_require__(13);\nvar TAG = __webpack_require__(6)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcz83ZjIwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///37\n")},function(module,exports){eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanM/ODRmMiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///38\n")},function(module,exports,__webpack_require__){eval("// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(6)('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(14)(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanM/OWM2YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuaWYgKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///39\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar global = __webpack_require__(3);\nvar dP = __webpack_require__(7);\nvar DESCRIPTORS = __webpack_require__(8);\nvar SPECIES = __webpack_require__(6)('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtc3BlY2llcy5qcz83YTU2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///40\n")},function(module,exports){eval("module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1pbnN0YW5jZS5qcz9mNjA1Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///41\n")},function(module,exports,__webpack_require__){eval("var redefine = __webpack_require__(11);\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanM/ZGNiYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIHNhZmUpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBzYWZlKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///42\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(4);\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL192YWxpZGF0ZS1jb2xsZWN0aW9uLmpzP2IzOWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVFlQRSkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSB8fCBpdC5fdCAhPT0gVFlQRSkgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///43\n")},function(module,exports,__webpack_require__){eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(23);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzPzYyNmEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///44\n")},function(module,exports){eval("exports.f = {}.propertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzPzUyYTciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///45\n")},function(module,exports,__webpack_require__){eval("// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = __webpack_require__(15);\nvar toLength = __webpack_require__(10);\nvar toAbsoluteIndex = __webpack_require__(33);\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcz9jMzY2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///46\n")},function(module,exports){eval("exports.f = Object.getOwnPropertySymbols;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcz8yNjIxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///47\n")},function(module,exports,__webpack_require__){eval("// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(23);\nvar TAG = __webpack_require__(6)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzPzIzYzYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///48\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar defined = __webpack_require__(24);\nvar fails = __webpack_require__(2);\nvar spaces = __webpack_require__(65);\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctdHJpbS5qcz9hYTc3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc3BhY2VzID0gcmVxdWlyZSgnLi9fc3RyaW5nLXdzJyk7XG52YXIgc3BhY2UgPSAnWycgKyBzcGFjZXMgKyAnXSc7XG52YXIgbm9uID0gJ1xcdTIwMGJcXHUwMDg1JztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cChzcGFjZSArIHNwYWNlICsgJyokJyk7XG5cbnZhciBleHBvcnRlciA9IGZ1bmN0aW9uIChLRVksIGV4ZWMsIEFMSUFTKSB7XG4gIHZhciBleHAgPSB7fTtcbiAgdmFyIEZPUkNFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXNwYWNlc1tLRVldKCkgfHwgbm9uW0tFWV0oKSAhPSBub247XG4gIH0pO1xuICB2YXIgZm4gPSBleHBbS0VZXSA9IEZPUkNFID8gZXhlYyh0cmltKSA6IHNwYWNlc1tLRVldO1xuICBpZiAoQUxJQVMpIGV4cFtBTElBU10gPSBmbjtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///49\n")},function(module,exports,__webpack_require__){eval("var ITERATOR = __webpack_require__(6)('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qcz81Y2M1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uICgpIHsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBza2lwQ2xvc2luZykge1xuICBpZiAoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gWzddO1xuICAgIHZhciBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHsgZG9uZTogc2FmZSA9IHRydWUgfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///50\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar hide = __webpack_require__(14);\nvar redefine = __webpack_require__(11);\nvar fails = __webpack_require__(2);\nvar defined = __webpack_require__(24);\nvar wks = __webpack_require__(6);\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n var fns = exec(defined, SYMBOL, ''[KEY]);\n var strfn = fns[0];\n var rxfn = fns[1];\n if (fails(function () {\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n })) {\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19maXgtcmUtd2tzLmpzPzIxNGYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGxlbmd0aCwgZXhlYykge1xuICB2YXIgU1lNQk9MID0gd2tzKEtFWSk7XG4gIHZhciBmbnMgPSBleGVjKGRlZmluZWQsIFNZTUJPTCwgJydbS0VZXSk7XG4gIHZhciBzdHJmbiA9IGZuc1swXTtcbiAgdmFyIHJ4Zm4gPSBmbnNbMV07XG4gIGlmIChmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIE8gPSB7fTtcbiAgICBPW1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9O1xuICAgIHJldHVybiAnJ1tLRVldKE8pICE9IDc7XG4gIH0pKSB7XG4gICAgcmVkZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgS0VZLCBzdHJmbik7XG4gICAgaGlkZShSZWdFeHAucHJvdG90eXBlLCBTWU1CT0wsIGxlbmd0aCA9PSAyXG4gICAgICAvLyAyMS4yLjUuOCBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV0oc3RyaW5nLCByZXBsYWNlVmFsdWUpXG4gICAgICAvLyAyMS4yLjUuMTEgUmVnRXhwLnByb3RvdHlwZVtAQHNwbGl0XShzdHJpbmcsIGxpbWl0KVxuICAgICAgPyBmdW5jdGlvbiAoc3RyaW5nLCBhcmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMsIGFyZyk7IH1cbiAgICAgIC8vIDIxLjIuNS42IFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF0oc3RyaW5nKVxuICAgICAgLy8gMjEuMi41LjkgUmVnRXhwLnByb3RvdHlwZVtAQHNlYXJjaF0oc3RyaW5nKVxuICAgICAgOiBmdW5jdGlvbiAoc3RyaW5nKSB7IHJldHVybiByeGZuLmNhbGwoc3RyaW5nLCB0aGlzKTsgfVxuICAgICk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///51\n")},function(module,exports,__webpack_require__){eval("var ctx = __webpack_require__(21);\nvar call = __webpack_require__(99);\nvar isArrayIter = __webpack_require__(74);\nvar anObject = __webpack_require__(5);\nvar toLength = __webpack_require__(10);\nvar getIterFn = __webpack_require__(76);\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanM/NGE1OSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpO1xudmFyIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBnZXRJdGVyRm4gPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIEJSRUFLID0ge307XG52YXIgUkVUVVJOID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1IpIHtcbiAgdmFyIGl0ZXJGbiA9IElURVJBVE9SID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpO1xuICB2YXIgZiA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZiAoaXNBcnJheUl0ZXIoaXRlckZuKSkgZm9yIChsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTspIHtcbiAgICByZXN1bHQgPSBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgPSBCUkVBSztcbmV4cG9ydHMuUkVUVVJOID0gUkVUVVJOO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///52\n")},function(module,exports,__webpack_require__){eval("// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(5);\nvar aFunction = __webpack_require__(22);\nvar SPECIES = __webpack_require__(6)('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzP2ViZDYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///53\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(3);\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL191c2VyLWFnZW50LmpzP2EyNWYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG5hdmlnYXRvciA9IGdsb2JhbC5uYXZpZ2F0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///54\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar global = __webpack_require__(3);\nvar $export = __webpack_require__(1);\nvar redefine = __webpack_require__(11);\nvar redefineAll = __webpack_require__(42);\nvar meta = __webpack_require__(28);\nvar forOf = __webpack_require__(52);\nvar anInstance = __webpack_require__(41);\nvar isObject = __webpack_require__(4);\nvar fails = __webpack_require__(2);\nvar $iterDetect = __webpack_require__(50);\nvar setToStringTag = __webpack_require__(37);\nvar inheritIfRequired = __webpack_require__(66);\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLmpzP2UwYjgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJGl0ZXJEZXRlY3QgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBnbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgZm4gPSBwcm90b1tLRVldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBLRVksXG4gICAgICBLRVkgPT0gJ2RlbGV0ZScgPyBmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyB1bmRlZmluZWQgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKGEpIHsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpOyByZXR1cm4gdGhpczsgfVxuICAgICAgICA6IGZ1bmN0aW9uIHNldChhLCBiKSB7IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhLCBiKTsgcmV0dXJuIHRoaXM7IH1cbiAgICApO1xuICB9O1xuICBpZiAodHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgICBtZXRhLk5FRUQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiAgQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pO1xuICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICB2YXIgQUNDRVBUX0lURVJBQkxFUyA9ICRpdGVyRGV0ZWN0KGZ1bmN0aW9uIChpdGVyKSB7IG5ldyBDKGl0ZXIpOyB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgICB2YXIgaW5kZXggPSA1O1xuICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgfSk7XG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UoKSwgdGFyZ2V0LCBDKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQy5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQztcbiAgICB9XG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuICAgIGlmIChCVUdHWV9aRVJPIHx8IEhBU05UX0NIQUlOSU5HKSBmaXhNZXRob2QoQURERVIpO1xuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgcHJvdG8uY2xlYXIpIGRlbGV0ZSBwcm90by5jbGVhcjtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChDICE9IEJhc2UpLCBPKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///55\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(3);\nvar hide = __webpack_require__(14);\nvar uid = __webpack_require__(30);\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC5qcz8wZjg4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFRZUEVEID0gdWlkKCd0eXBlZF9hcnJheScpO1xudmFyIFZJRVcgPSB1aWQoJ3ZpZXcnKTtcbnZhciBBQlYgPSAhIShnbG9iYWwuQXJyYXlCdWZmZXIgJiYgZ2xvYmFsLkRhdGFWaWV3KTtcbnZhciBDT05TVFIgPSBBQlY7XG52YXIgaSA9IDA7XG52YXIgbCA9IDk7XG52YXIgVHlwZWQ7XG5cbnZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzID0gKFxuICAnSW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXknXG4pLnNwbGl0KCcsJyk7XG5cbndoaWxlIChpIDwgbCkge1xuICBpZiAoVHlwZWQgPSBnbG9iYWxbVHlwZWRBcnJheUNvbnN0cnVjdG9yc1tpKytdXSkge1xuICAgIGhpZGUoVHlwZWQucHJvdG90eXBlLCBUWVBFRCwgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFZJRVcsIHRydWUpO1xuICB9IGVsc2UgQ09OU1RSID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBQlY6IEFCVixcbiAgQ09OU1RSOiBDT05TVFIsXG4gIFRZUEVEOiBUWVBFRCxcbiAgVklFVzogVklFV1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///56\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(4);\nvar document = __webpack_require__(3).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzPzIzMGUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///57\n")},function(module,exports,__webpack_require__){eval("var core = __webpack_require__(9);\nvar global = __webpack_require__(3);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: __webpack_require__(31) ? 'pure' : 'global',\n copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQuanM/NTUzNyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///58\n")},function(module,exports,__webpack_require__){eval("exports.f = __webpack_require__(6);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MtZXh0LmpzPzM3YzgiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fd2tzJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///59\n")},function(module,exports,__webpack_require__){eval("var shared = __webpack_require__(58)('keys');\nvar uid = __webpack_require__(30);\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzPzYxM2IiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///60\n")},function(module,exports){eval("// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzP2UxMWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///61\n")},function(module,exports,__webpack_require__){eval("// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(23);\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS5qcz8xMTY5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNvZihhcmcpID09ICdBcnJheSc7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///62\n")},function(module,exports,__webpack_require__){eval("var document = __webpack_require__(3).document;\nmodule.exports = document && document.documentElement;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19odG1sLmpzP2ZhYjIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///63\n")},function(module,exports,__webpack_require__){eval("// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(4);\nvar anObject = __webpack_require__(5);\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = __webpack_require__(21)(Function.call, __webpack_require__(18).f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtcHJvdG8uanM/OGI5NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkgdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24gKHRlc3QsIGJ1Z2d5LCBzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vX2N0eCcpKEZ1bmN0aW9uLmNhbGwsIHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoIChlKSB7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYgKGJ1Z2d5KSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///64\n")},function(module,exports){eval("module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanM/ZmRlZiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///65\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(4);\nvar setPrototypeOf = __webpack_require__(64).set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pbmhlcml0LWlmLXJlcXVpcmVkLmpzPzVkYmMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQ7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCB0YXJnZXQsIEMpIHtcbiAgdmFyIFMgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gIHZhciBQO1xuICBpZiAoUyAhPT0gQyAmJiB0eXBlb2YgUyA9PSAnZnVuY3Rpb24nICYmIChQID0gUy5wcm90b3R5cGUpICE9PSBDLnByb3RvdHlwZSAmJiBpc09iamVjdChQKSAmJiBzZXRQcm90b3R5cGVPZikge1xuICAgIHNldFByb3RvdHlwZU9mKHRoYXQsIFApO1xuICB9IHJldHVybiB0aGF0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///66\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar toInteger = __webpack_require__(25);\nvar defined = __webpack_require__(24);\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctcmVwZWF0LmpzPzk3NDQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gU3RyaW5nKGRlZmluZWQodGhpcykpO1xuICB2YXIgcmVzID0gJyc7XG4gIHZhciBuID0gdG9JbnRlZ2VyKGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoXCJDb3VudCBjYW4ndCBiZSBuZWdhdGl2ZVwiKTtcbiAgZm9yICg7biA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKSBpZiAobiAmIDEpIHJlcyArPSBzdHI7XG4gIHJldHVybiByZXM7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///67\n")},function(module,exports){eval("// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLXNpZ24uanM/OTZmYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMjggTWF0aC5zaWduKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbiBzaWduKHgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4gKHggPSAreCkgPT0gMCB8fCB4ICE9IHggPyB4IDogeCA8IDAgPyAtMSA6IDE7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///68\n")},function(module,exports){eval("// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLWV4cG0xLmpzPzJkNWMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjE0IE1hdGguZXhwbTEoeClcbnZhciAkZXhwbTEgPSBNYXRoLmV4cG0xO1xubW9kdWxlLmV4cG9ydHMgPSAoISRleHBtMVxuICAvLyBPbGQgRkYgYnVnXG4gIHx8ICRleHBtMSgxMCkgPiAyMjAyNS40NjU3OTQ4MDY3MTkgfHwgJGV4cG0xKDEwKSA8IDIyMDI1LjQ2NTc5NDgwNjcxNjUxNjhcbiAgLy8gVG9yIEJyb3dzZXIgYnVnXG4gIHx8ICRleHBtMSgtMmUtMTcpICE9IC0yZS0xN1xuKSA/IGZ1bmN0aW9uIGV4cG0xKHgpIHtcbiAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogeCA+IC0xZS02ICYmIHggPCAxZS02ID8geCArIHggKiB4IC8gMiA6IE1hdGguZXhwKHgpIC0gMTtcbn0gOiAkZXhwbTE7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///69\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar LIBRARY = __webpack_require__(31);\nvar $export = __webpack_require__(1);\nvar redefine = __webpack_require__(11);\nvar hide = __webpack_require__(14);\nvar Iterators = __webpack_require__(38);\nvar $iterCreate = __webpack_require__(98);\nvar setToStringTag = __webpack_require__(37);\nvar getPrototypeOf = __webpack_require__(36);\nvar ITERATOR = __webpack_require__(6)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qcz8wMWY5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///70\n")},function(module,exports,__webpack_require__){eval("// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(72);\nvar defined = __webpack_require__(24);\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctY29udGV4dC5qcz9kMmM4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGhlbHBlciBmb3IgU3RyaW5nI3tzdGFydHNXaXRoLCBlbmRzV2l0aCwgaW5jbHVkZXN9XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBzZWFyY2hTdHJpbmcsIE5BTUUpIHtcbiAgaWYgKGlzUmVnRXhwKHNlYXJjaFN0cmluZykpIHRocm93IFR5cGVFcnJvcignU3RyaW5nIycgKyBOQU1FICsgXCIgZG9lc24ndCBhY2NlcHQgcmVnZXghXCIpO1xuICByZXR1cm4gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///71\n")},function(module,exports,__webpack_require__){eval("// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(4);\nvar cof = __webpack_require__(23);\nvar MATCH = __webpack_require__(6)('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1yZWdleHAuanM/YWFlMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjIuOCBJc1JlZ0V4cChhcmd1bWVudClcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIE1BVENIID0gcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjb2YoaXQpID09ICdSZWdFeHAnKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///72\n")},function(module,exports,__webpack_require__){eval("var MATCH = __webpack_require__(6)('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mYWlscy1pcy1yZWdleHAuanM/NTE0NyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSkge1xuICB2YXIgcmUgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbS0VZXShyZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgcmVbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gIScvLi8nW0tFWV0ocmUpO1xuICAgIH0gY2F0Y2ggKGYpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiB0cnVlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///73\n")},function(module,exports,__webpack_require__){eval("// check on default Array iterator\nvar Iterators = __webpack_require__(38);\nvar ITERATOR = __webpack_require__(6)('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzPzMzYTQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///74\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $defineProperty = __webpack_require__(7);\nvar createDesc = __webpack_require__(29);\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanM/ZjFhZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgaWYgKGluZGV4IGluIG9iamVjdCkgJGRlZmluZVByb3BlcnR5LmYob2JqZWN0LCBpbmRleCwgY3JlYXRlRGVzYygwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtpbmRleF0gPSB2YWx1ZTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///75\n")},function(module,exports,__webpack_require__){eval("var classof = __webpack_require__(48);\nvar ITERATOR = __webpack_require__(6)('iterator');\nvar Iterators = __webpack_require__(38);\nmodule.exports = __webpack_require__(9).getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcz8yN2VlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///76\n")},function(module,exports,__webpack_require__){"use strict";eval("// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n\nvar toObject = __webpack_require__(16);\nvar toAbsoluteIndex = __webpack_require__(33);\nvar toLength = __webpack_require__(10);\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1maWxsLmpzPzM2YmQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG4ndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGVuZFBvcyA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKTtcbiAgd2hpbGUgKGVuZFBvcyA+IGluZGV4KSBPW2luZGV4KytdID0gdmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///77\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar addToUnscopables = __webpack_require__(39);\nvar step = __webpack_require__(102);\nvar Iterators = __webpack_require__(38);\nvar toIObject = __webpack_require__(15);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(70)(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcz9jYWRmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///78\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(5);\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mbGFncy5qcz8wYmZiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC51bmljb2RlKSByZXN1bHQgKz0gJ3UnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///79\n")},function(module,exports,__webpack_require__){eval("var ctx = __webpack_require__(21);\nvar invoke = __webpack_require__(91);\nvar html = __webpack_require__(63);\nvar cel = __webpack_require__(57);\nvar global = __webpack_require__(3);\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (__webpack_require__(23)(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190YXNrLmpzPzE5OTEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGludm9rZSA9IHJlcXVpcmUoJy4vX2ludm9rZScpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuL19odG1sJyk7XG52YXIgY2VsID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBzZXRUYXNrID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhclRhc2sgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpZCA9ICt0aGlzO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0VGFzayB8fCAhY2xlYXJUYXNrKSB7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChyZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2VzcycpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3coY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///80\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar global = __webpack_require__(3);\nvar DESCRIPTORS = __webpack_require__(8);\nvar LIBRARY = __webpack_require__(31);\nvar $typed = __webpack_require__(56);\nvar hide = __webpack_require__(14);\nvar redefineAll = __webpack_require__(42);\nvar fails = __webpack_require__(2);\nvar anInstance = __webpack_require__(41);\nvar toInteger = __webpack_require__(25);\nvar toLength = __webpack_require__(10);\nvar toIndex = __webpack_require__(109);\nvar gOPN = __webpack_require__(35).f;\nvar dP = __webpack_require__(7).f;\nvar arrayFill = __webpack_require__(77);\nvar setToStringTag = __webpack_require__(37);\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC1idWZmZXIuanM/ZWQwYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgJHR5cGVkID0gcmVxdWlyZSgnLi9fdHlwZWQnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvSW5kZXggPSByZXF1aXJlKCcuL190by1pbmRleCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGFycmF5RmlsbCA9IHJlcXVpcmUoJy4vX2FycmF5LWZpbGwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcbnZhciBEQVRBX1ZJRVcgPSAnRGF0YVZpZXcnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFdST05HX0xFTkdUSCA9ICdXcm9uZyBsZW5ndGghJztcbnZhciBXUk9OR19JTkRFWCA9ICdXcm9uZyBpbmRleCEnO1xudmFyICRBcnJheUJ1ZmZlciA9IGdsb2JhbFtBUlJBWV9CVUZGRVJdO1xudmFyICREYXRhVmlldyA9IGdsb2JhbFtEQVRBX1ZJRVddO1xudmFyIE1hdGggPSBnbG9iYWwuTWF0aDtcbnZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93LXJlc3RyaWN0ZWQtbmFtZXNcbnZhciBJbmZpbml0eSA9IGdsb2JhbC5JbmZpbml0eTtcbnZhciBCYXNlQnVmZmVyID0gJEFycmF5QnVmZmVyO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcbnZhciBCVUZGRVIgPSAnYnVmZmVyJztcbnZhciBCWVRFX0xFTkdUSCA9ICdieXRlTGVuZ3RoJztcbnZhciBCWVRFX09GRlNFVCA9ICdieXRlT2Zmc2V0JztcbnZhciAkQlVGRkVSID0gREVTQ1JJUFRPUlMgPyAnX2InIDogQlVGRkVSO1xudmFyICRMRU5HVEggPSBERVNDUklQVE9SUyA/ICdfbCcgOiBCWVRFX0xFTkdUSDtcbnZhciAkT0ZGU0VUID0gREVTQ1JJUFRPUlMgPyAnX28nIDogQllURV9PRkZTRVQ7XG5cbi8vIElFRUU3NTQgY29udmVyc2lvbnMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9pZWVlNzU0XG5mdW5jdGlvbiBwYWNrSUVFRTc1NCh2YWx1ZSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobkJ5dGVzKTtcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBydCA9IG1MZW4gPT09IDIzID8gcG93KDIsIC0yNCkgLSBwb3coMiwgLTc3KSA6IDA7XG4gIHZhciBpID0gMDtcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/IDEgOiAwO1xuICB2YXIgZSwgbSwgYztcbiAgdmFsdWUgPSBhYnModmFsdWUpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIGlmICh2YWx1ZSAhPSB2YWx1ZSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgbSA9IHZhbHVlICE9IHZhbHVlID8gMSA6IDA7XG4gICAgZSA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZSA9IGZsb29yKGxvZyh2YWx1ZSkgLyBMTjIpO1xuICAgIGlmICh2YWx1ZSAqIChjID0gcG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS07XG4gICAgICBjICo9IDI7XG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIHBvdygyLCAxIC0gZUJpYXMpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMDtcbiAgICAgIGUgPSBlTWF4O1xuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBwb3coMiwgbUxlbik7XG4gICAgICBlID0gZSArIGVCaWFzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSAwO1xuICAgIH1cbiAgfVxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbaSsrXSA9IG0gJiAyNTUsIG0gLz0gMjU2LCBtTGVuIC09IDgpO1xuICBlID0gZSA8PCBtTGVuIHwgbTtcbiAgZUxlbiArPSBtTGVuO1xuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltpKytdID0gZSAmIDI1NSwgZSAvPSAyNTYsIGVMZW4gLT0gOCk7XG4gIGJ1ZmZlclstLWldIHw9IHMgKiAxMjg7XG4gIHJldHVybiBidWZmZXI7XG59XG5mdW5jdGlvbiB1bnBhY2tJRUVFNzU0KGJ1ZmZlciwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTtcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICB2YXIgbkJpdHMgPSBlTGVuIC0gNztcbiAgdmFyIGkgPSBuQnl0ZXMgLSAxO1xuICB2YXIgcyA9IGJ1ZmZlcltpLS1dO1xuICB2YXIgZSA9IHMgJiAxMjc7XG4gIHZhciBtO1xuICBzID4+PSA3O1xuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltpXSwgaS0tLCBuQml0cyAtPSA4KTtcbiAgbSA9IGUgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgZSA+Pj0gLW5CaXRzO1xuICBuQml0cyArPSBtTGVuO1xuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltpXSwgaS0tLCBuQml0cyAtPSA4KTtcbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzO1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6IHMgPyAtSW5maW5pdHkgOiBJbmZpbml0eTtcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIHBvdygyLCBtTGVuKTtcbiAgICBlID0gZSAtIGVCaWFzO1xuICB9IHJldHVybiAocyA/IC0xIDogMSkgKiBtICogcG93KDIsIGUgLSBtTGVuKTtcbn1cblxuZnVuY3Rpb24gdW5wYWNrSTMyKGJ5dGVzKSB7XG4gIHJldHVybiBieXRlc1szXSA8PCAyNCB8IGJ5dGVzWzJdIDw8IDE2IHwgYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdO1xufVxuZnVuY3Rpb24gcGFja0k4KGl0KSB7XG4gIHJldHVybiBbaXQgJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tJMTYoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmYsIGl0ID4+IDggJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tJMzIoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmYsIGl0ID4+IDggJiAweGZmLCBpdCA+PiAxNiAmIDB4ZmYsIGl0ID4+IDI0ICYgMHhmZl07XG59XG5mdW5jdGlvbiBwYWNrRjY0KGl0KSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChpdCwgNTIsIDgpO1xufVxuZnVuY3Rpb24gcGFja0YzMihpdCkge1xuICByZXR1cm4gcGFja0lFRUU3NTQoaXQsIDIzLCA0KTtcbn1cblxuZnVuY3Rpb24gYWRkR2V0dGVyKEMsIGtleSwgaW50ZXJuYWwpIHtcbiAgZFAoQ1tQUk9UT1RZUEVdLCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzW2ludGVybmFsXTsgfSB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0KHZpZXcsIGJ5dGVzLCBpbmRleCwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIG51bUluZGV4ID0gK2luZGV4O1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KG51bUluZGV4KTtcbiAgaWYgKGludEluZGV4ICsgYnl0ZXMgPiB2aWV3WyRMRU5HVEhdKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIHN0b3JlID0gdmlld1skQlVGRkVSXS5fYjtcbiAgdmFyIHN0YXJ0ID0gaW50SW5kZXggKyB2aWV3WyRPRkZTRVRdO1xuICB2YXIgcGFjayA9IHN0b3JlLnNsaWNlKHN0YXJ0LCBzdGFydCArIGJ5dGVzKTtcbiAgcmV0dXJuIGlzTGl0dGxlRW5kaWFuID8gcGFjayA6IHBhY2sucmV2ZXJzZSgpO1xufVxuZnVuY3Rpb24gc2V0KHZpZXcsIGJ5dGVzLCBpbmRleCwgY29udmVyc2lvbiwgdmFsdWUsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBudW1JbmRleCA9ICtpbmRleDtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChudW1JbmRleCk7XG4gIGlmIChpbnRJbmRleCArIGJ5dGVzID4gdmlld1skTEVOR1RIXSkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBzdG9yZSA9IHZpZXdbJEJVRkZFUl0uX2I7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgdmlld1skT0ZGU0VUXTtcbiAgdmFyIHBhY2sgPSBjb252ZXJzaW9uKCt2YWx1ZSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXM7IGkrKykgc3RvcmVbc3RhcnQgKyBpXSA9IHBhY2tbaXNMaXR0bGVFbmRpYW4gPyBpIDogYnl0ZXMgLSBpIC0gMV07XG59XG5cbmlmICghJHR5cGVkLkFCVikge1xuICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbiAgICB2YXIgYnl0ZUxlbmd0aCA9IHRvSW5kZXgobGVuZ3RoKTtcbiAgICB0aGlzLl9iID0gYXJyYXlGaWxsLmNhbGwobmV3IEFycmF5KGJ5dGVMZW5ndGgpLCAwKTtcbiAgICB0aGlzWyRMRU5HVEhdID0gYnl0ZUxlbmd0aDtcbiAgfTtcblxuICAkRGF0YVZpZXcgPSBmdW5jdGlvbiBEYXRhVmlldyhidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICREYXRhVmlldywgREFUQV9WSUVXKTtcbiAgICBhbkluc3RhbmNlKGJ1ZmZlciwgJEFycmF5QnVmZmVyLCBEQVRBX1ZJRVcpO1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBidWZmZXJbJExFTkdUSF07XG4gICAgdmFyIG9mZnNldCA9IHRvSW50ZWdlcihieXRlT2Zmc2V0KTtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCEnKTtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA9PT0gdW5kZWZpbmVkID8gYnVmZmVyTGVuZ3RoIC0gb2Zmc2V0IDogdG9MZW5ndGgoYnl0ZUxlbmd0aCk7XG4gICAgaWYgKG9mZnNldCArIGJ5dGVMZW5ndGggPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB0aGlzWyRCVUZGRVJdID0gYnVmZmVyO1xuICAgIHRoaXNbJE9GRlNFVF0gPSBvZmZzZXQ7XG4gICAgdGhpc1skTEVOR1RIXSA9IGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgYWRkR2V0dGVyKCRBcnJheUJ1ZmZlciwgQllURV9MRU5HVEgsICdfbCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJVRkZFUiwgJ19iJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQllURV9MRU5HVEgsICdfbCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJZVEVfT0ZGU0VULCAnX28nKTtcbiAgfVxuXG4gIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7XG4gICAgZ2V0SW50ODogZnVuY3Rpb24gZ2V0SW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdIDw8IDI0ID4+IDI0O1xuICAgIH0sXG4gICAgZ2V0VWludDg6IGZ1bmN0aW9uIGdldFVpbnQ4KGJ5dGVPZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywgMSwgYnl0ZU9mZnNldClbMF07XG4gICAgfSxcbiAgICBnZXRJbnQxNjogZnVuY3Rpb24gZ2V0SW50MTYoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgdmFyIGJ5dGVzID0gZ2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSk7XG4gICAgICByZXR1cm4gKGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXSkgPDwgMTYgPj4gMTY7XG4gICAgfSxcbiAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIGdldFVpbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICB2YXIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKTtcbiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gZ2V0SW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0kzMihnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSk7XG4gICAgfSxcbiAgICBnZXRVaW50MzI6IGZ1bmN0aW9uIGdldFVpbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSTMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pKSA+Pj4gMDtcbiAgICB9LFxuICAgIGdldEZsb2F0MzI6IGZ1bmN0aW9uIGdldEZsb2F0MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSksIDIzLCA0KTtcbiAgICB9LFxuICAgIGdldEZsb2F0NjQ6IGZ1bmN0aW9uIGdldEZsb2F0NjQoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSksIDUyLCA4KTtcbiAgICB9LFxuICAgIHNldEludDg6IGZ1bmN0aW9uIHNldEludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSTgsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJOCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0SW50MTY6IGZ1bmN0aW9uIHNldEludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0kxNiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRVaW50MTY6IGZ1bmN0aW9uIHNldFVpbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJMTYsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0SW50MzI6IGZ1bmN0aW9uIHNldEludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0kzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRVaW50MzI6IGZ1bmN0aW9uIHNldFVpbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tGMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0RmxvYXQ2NDogZnVuY3Rpb24gc2V0RmxvYXQ2NChieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIHBhY2tGNjQsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICBpZiAoIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAkQXJyYXlCdWZmZXIoMSk7XG4gIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigtMSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gIH0pIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgJEFycmF5QnVmZmVyKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigxLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoTmFOKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICByZXR1cm4gJEFycmF5QnVmZmVyLm5hbWUgIT0gQVJSQVlfQlVGRkVSO1xuICB9KSkge1xuICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgICAgYW5JbnN0YW5jZSh0aGlzLCAkQXJyYXlCdWZmZXIpO1xuICAgICAgcmV0dXJuIG5ldyBCYXNlQnVmZmVyKHRvSW5kZXgobGVuZ3RoKSk7XG4gICAgfTtcbiAgICB2YXIgQXJyYXlCdWZmZXJQcm90byA9ICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdID0gQmFzZUJ1ZmZlcltQUk9UT1RZUEVdO1xuICAgIGZvciAodmFyIGtleXMgPSBnT1BOKEJhc2VCdWZmZXIpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7KSB7XG4gICAgICBpZiAoISgoa2V5ID0ga2V5c1tqKytdKSBpbiAkQXJyYXlCdWZmZXIpKSBoaWRlKCRBcnJheUJ1ZmZlciwga2V5LCBCYXNlQnVmZmVyW2tleV0pO1xuICAgIH1cbiAgICBpZiAoIUxJQlJBUlkpIEFycmF5QnVmZmVyUHJvdG8uY29uc3RydWN0b3IgPSAkQXJyYXlCdWZmZXI7XG4gIH1cbiAgLy8gaU9TIFNhZmFyaSA3LnggYnVnXG4gIHZhciB2aWV3ID0gbmV3ICREYXRhVmlldyhuZXcgJEFycmF5QnVmZmVyKDIpKTtcbiAgdmFyICRzZXRJbnQ4ID0gJERhdGFWaWV3W1BST1RPVFlQRV0uc2V0SW50ODtcbiAgdmlldy5zZXRJbnQ4KDAsIDIxNDc0ODM2NDgpO1xuICB2aWV3LnNldEludDgoMSwgMjE0NzQ4MzY0OSk7XG4gIGlmICh2aWV3LmdldEludDgoMCkgfHwgIXZpZXcuZ2V0SW50OCgxKSkgcmVkZWZpbmVBbGwoJERhdGFWaWV3W1BST1RPVFlQRV0sIHtcbiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICAkc2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgJHNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfVxuICB9LCB0cnVlKTtcbn1cbnNldFRvU3RyaW5nVGFnKCRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbnNldFRvU3RyaW5nVGFnKCREYXRhVmlldywgREFUQV9WSUVXKTtcbmhpZGUoJERhdGFWaWV3W1BST1RPVFlQRV0sICR0eXBlZC5WSUVXLCB0cnVlKTtcbmV4cG9ydHNbQVJSQVlfQlVGRkVSXSA9ICRBcnJheUJ1ZmZlcjtcbmV4cG9ydHNbREFUQV9WSUVXXSA9ICREYXRhVmlldztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///81\n")},function(module,exports){eval('// proxy-observe v0.0.18\r\n// Copyright (c) 2015, 2016 Simon Y. Blackwell, AnyWhichWay\r\n// MIT License - http://opensource.org/licenses/mit-license.php\r\n(function() {\r\n\t"use strict";\r\n\t// Creates and returns a Proxy wrapping a target so that all changes can be trapped and forwarded to\r\n\t// a callback. The callback takes an array of changes just like the traditional original Chrome Object.observe\r\n\t// {object:,name:,type:add|update|delete|reconfigure|preventExtensions|setPrototype,oldValue:}\r\n\t// The acceptlist can be add|update|delete|reconfigure|preventExtensions|setPrototype.\r\n\t// v 0.0.10 to support pausing and restarting observation two additional constructor arguments are available to Object.observe:\r\n\t// pausable - create the Observer so it can be paused\r\n\t// pause - create observer in paused state\r\n\t// if pausable is true then an additional method deliver(ignorePrevious) is available to start delivery\r\n\t// to pause delivery set a property called pause on the function deliver to true\r\n\t// pausable is optional to reduce the chance of shadowing a property or method on any existing code called deliver\r\n\tif(!Object.observe && typeof(Proxy)==="function") {\r\n\t\tfunction Observer(target,callback,acceptlist,pausable,pause,delay) {\r\n\t \tvar me = this, proxy;\r\n\t \tfunction deliver(ignorePrevious,delay) {\r\n\t \t\tdeliver.delay = delay;\r\n\t \t\tif(!deliver.pause) {\r\n\t \t\tif(me.changeset.length>0) {\r\n\t \t\t\tif(!ignorePrevious) {\r\n\t\t \t \t\tvar changes = me.changeset.filter(function(change) { return !acceptlist || acceptlist.indexOf(change.type)>=0; });\r\n\t\t \t\t\tif(changes.length>0) {\r\n\t\t \t\t\t\tcallback(changes);\r\n\t\t \t\t\t}\r\n\t \t\t\t}\r\n\t \t\t\tme.changeset = [];\r\n\t \t\t}\r\n\t \t\t}\r\n\t \t}\r\n\t \tdeliver.pause = pause;\r\n\t \tdeliver.delay = delay;\r\n\t\t me.get = function(target, property) {\r\n\t\t \tif(property==="__observer__") {\r\n\t\t \t\treturn me;\r\n\t\t \t}\r\n\t\t \tif(property==="unobserve") {\r\n\t\t \t\treturn function() {\r\n\t\t \t\t\tObject.unobserve(target);\r\n\t\t \t\t\treturn target;\r\n\t\t \t\t};\r\n\t\t \t}\r\n\t\t \tif(property==="deliver") {\r\n\t\t \t\treturn deliver;\r\n\t\t \t}\r\n\t\t \treturn target[property];\r\n\t\t }\r\n\t \tme.target = target;\r\n\t \tme.changeset = [];\r\n\t \tif(!me.target.__observerCallbacks__) {\r\n\t \t\t// __observerCallbacks__ is used as an index to get at the proxy which is the observer, so we can unobserve\r\n\t \t\tObject.defineProperty(target,"__observerCallbacks__",{enumerable:false,configurable:true,writable:false,value:[]});\r\n\t \t\tObject.defineProperty(target,"__observers__",{enumerable:false,configurable:true,writable:false,value:[]});\r\n\t \t}\r\n\t \tme.target.__observerCallbacks__.push(callback);\r\n\t \tme.target.__observers__.push(this);\r\n\t \tproxy = new Proxy(target,me);\r\n\t \tdeliver(false,delay);\r\n\t \treturn proxy;\r\n\t }\r\n\t\tObserver.prototype.deliver = function() {\r\n\t\t\treturn this.get(null,"deliver");\r\n\t\t}\r\n\t Observer.prototype.set = function(target, property, value) { // , receiver\r\n\t \tvar oldvalue = target[property];\r\n\t \tvar type = (oldvalue===undefined ? "add" : "update");\r\n\t \ttarget[property] = value;\r\n\t \tif(target.__observers__.indexOf(this)>=0 && (!this.acceptlist || this.acceptlist.indexOf(type)>=0)) {\r\n\t \tvar change = {object:target,name:property,type:type},\r\n\t \t\tstart = this.changeset.length === 0,\r\n\t \t\tdeliver = this.deliver();\r\n\t \tif(type==="update") {\r\n\t \t\tchange.oldValue = oldvalue;\r\n\t \t}\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.deleteProperty = function(target, property) {\r\n\t \tvar oldvalue = target[property];\r\n\t \t//if(typeof(oldvalue)!=="undefined") {\r\n\t\t \tdelete target[property];\r\n\t\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("delete")>=0) {\r\n\t\t \tvar change = {object:target,name:property,type:"delete",oldValue:oldvalue},\r\n\t\t \t\tstart = this.changeset.length === 0,\r\n\t\t \t\tdeliver = this.deliver();\r\n\t\t \tthis.changeset.push(change);\r\n\t\t \tif(start) {\r\n\t\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t\t \t}\r\n\t\t \t}\r\n\t \t//}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.defineProperty = function(target, property, descriptor) {\r\n\t \tObject.defineProperty(target, property, descriptor);\r\n\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("reconfigure")>=0) {\r\n\t \tvar change = {object:target,name:property,type:"reconfigure"},\r\n \t\t\tstart = this.changeset.length === 0,\r\n \t\t\tdeliver = this.deliver();\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.setPrototypeOf = function(target, prototype) {\r\n\t \tvar oldvalue = Object.getPrototypeOf(target);\r\n\t \tObject.setPrototypeOf(target, prototype);\r\n\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("setPrototype")>=0) {\r\n\t \tvar change = {object:target,name:"__proto__",type:"setPrototype",oldValue:oldvalue},\r\n \t\t\t\tstart = this.changeset.length === 0,\r\n \t\t\t\tdeliver = this.deliver();\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.preventExtensions = function(target) {\r\n\t Object.preventExtensions(target);\r\n\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("preventExtensions")>=0) {\r\n\t \tvar change = {object:target,type:"preventExtensions"},\r\n\t\t\t\t\tstart = this.changeset.length === 0,\r\n\t\t\t\t\tdeliver = this.deliver();\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Object.observe = function(object,callback,acceptlist,pausable,pause,delay) {\r\n\t \treturn new Observer(object,callback,acceptlist,pausable,pause,delay);\r\n\t };\r\n\t Object.unobserve = function(object,callback) {\r\n\t \tif(object.__observerCallbacks__) {\r\n\t \t\tif(!callback) {\r\n\t \t\t\tobject.__observerCallbacks__.splice(0,object.__observerCallbacks__.length);\r\n\t \t\t\tobject.__observers__.splice(0,object.__observers__.length);\r\n\t \t\t\treturn;\r\n\t \t\t}\r\n\t \t\tobject.__observerCallbacks__.forEach(function(observercallback,i) {\r\n\t \t\t\tif(callback===observercallback) {\r\n\t \t\t\t\tobject.__observerCallbacks__.splice(i,1);\r\n\t \t\t\t\tdelete object.__observers__[i].callback;\r\n\t \t\t\t\tobject.__observers__.splice(i,1);\r\n\t \t\t\t}\r\n\t \t\t});\r\n\t \t}\r\n\t };\r\n\t Array.observe = function(object,callback,acceptlist,pausable,pause,delay) {\r\n\t \tif(!(object instanceof Array) && !Array.isArray(object)) {\r\n\t \t\tthrow new TypeError("First argument to Array.observer is not an Array");\r\n\t \t}\r\n \tacceptlist = acceptlist || ["add", "update", "delete", "splice"];\r\n\t \tvar arrayproxy = new Proxy(object,{get: function(target,property) {\r\n\t \t\tif(property==="unobserve") {\r\n\t\t \t\treturn function(callback) {\r\n\t\t \t\t\tif(callback) {\r\n\t\t \t\t\t\treturn Object.unobserve(target,callback);\r\n\t\t \t\t\t}\r\n\t\t \t\t\treturn target.unobserve();\r\n\t\t \t\t};\r\n\t\t \t}\r\n\t \t\tif(property==="splice") {\r\n\t \t\t\treturn function(start,end) {\r\n\t \t\t\t\tif(typeof(start)!=="number" || typeof(end)!=="number") {\r\n\t \t\t\t\t\tthrow new TypeError("First two arguments to Array splice are not number, number");\r\n\t \t\t\t\t}\r\n\t \t \t\tvar removed = this.slice(start,start+end),\r\n\t \t \t\t\taddedCount = (arguments.length > 1 ? arguments.length-2 : 0),\r\n\t \t \t\t\tchange = {object:object,type:"splice",index:start,removed:removed,addedCount:addedCount};\r\n\t \t \t\ttarget.splice.apply(target,arguments);\r\n\t \t \t\tif(acceptlist.indexOf("splice")>=0) {\r\n\t \t \t\t\tvar start = proxy.__observer__.changeset.length === 0,\r\n\t \t \t\t\tdeliver = proxy.__observer__.deliver();\r\n\t \t \t\t\tproxy.__observer__.changeset.push(change);\r\n\t \t \t\t\tif(start) {\r\n\t \t\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t\t \t}\r\n\t \t \t\t}\r\n\t \t \t}\r\n\t \t\t}\r\n\t \t\tif(property==="push") {\r\n\t \t\t\t return function(item) {\r\n\t \t\t \treturn this.splice(this.length,0,item);\r\n\t \t\t }\r\n\t \t\t}\r\n\t \t\tif(property==="pop") {\r\n\t \t\t\t return function() {\r\n\t \t\t \treturn this.splice(this.length-1,1);\r\n\t \t\t }\r\n\t \t\t}\r\n\t \t\tif(property==="unshift") {\r\n\t \t\t\t return function(item) {\r\n \t\t \t\treturn this.splice(0,0,item);\r\n \t\t \t}\r\n\t \t\t}\r\n\t \t\tif(property==="shift") {\r\n\t \t\t\treturn function() {\r\n\t \t \t\treturn this.splice(0,1);\r\n\t \t \t}\r\n\t \t\t}\r\n\t \t\treturn target[property];\r\n\t \t}});\r\n\t \tvar proxy = Object.observe(arrayproxy,function(changeset) { \r\n\t \t\tvar changes = changeset.filter(function(change) { return change.name!=="length" && change.name!=="add" && (!acceptlist || acceptlist.indexOf(change.type)>=0); });\r\n\t \t\tif(changes.length>0) {\r\n\t \t\t\tcallback(changes);\r\n\t \t\t}\r\n\t \t},acceptlist,pausable,pause,delay);\r\n\t \treturn proxy;\r\n\t };\r\n\t Array.unobserve = function(object,callback) {\r\n\t\t return object.unobserve(callback);\r\n\t }\r\n\t}\r\n\tObject.deepObserve = function(object,callback,parts) {\r\n\r\n\t\tparts = (parts ? parts : []);\r\n\r\n\t\tvar toTypeName = function(obj) {\r\n\t\t\treturn ({}).toString.call(obj).match(/\\s([a-zA-Z]+)/)[1].toLowerCase()\r\n\t\t}\r\n\r\n\t\tfunction reobserve(value, parts) {\r\n\t\t\tvar keys = Object.keys(value);\r\n\t\t\tkeys.forEach(function(key) {\r\n\t\t\t\tif((toTypeName(value[key]) === \'object\' || toTypeName(value[key]) === \'array\') && !value[key].hasOwnProperty(\'__observers__\')) {\r\n\t\t\t\t\tvar newparts = parts.slice(0);\r\n\t\t\t\t\tnewparts.push(key);\r\n\t\t\t\t\tvalue[key] = Object.deepObserve(value[key],callback,newparts);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treobserve(object, parts);\r\n\r\n\t\tvar observed = Object.observe(object,function(changeset) {\r\n\t\t\tvar changes = [];\r\n\t\t\tfunction recurse(name,rootObject,oldObject,newObject,path) {\r\n\t\t\t\tif(newObject instanceof Object) {\r\n\t\t\t\t\tvar newkeys = Object.keys(newObject);\r\n\t\t\t\t\tnewkeys.forEach(function(key) {\r\n\t\t\t\t\t\tif(!oldObject || (oldObject[key]!==newObject[key])) {\r\n\t\t\t\t\t\t\tvar oldvalue = (oldObject && oldObject[key]!==undefined ? oldObject[key] : undefined),\r\n\t\t\t\t\t\t\t\tchange = (oldvalue===undefined ? "add" : "update"),\r\n\t\t\t\t\t\t\t\tkeypath = path + "." + key;\r\n\r\n\t\t\t\t\t\t\tchanges.push({name:name,object:rootObject,type:change,oldValue:oldvalue,newValue:newObject[key],keypath:keypath});\r\n\t\t\t\t\t\t\trecurse(name,rootObject,oldvalue,newObject[key],keypath);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t} else if(oldObject instanceof Object) {\r\n\t\t\t\t\tvar oldkeys = Object.keys(oldObject);\r\n\t\t\t\t\toldkeys.forEach(function(key) {\r\n\t\t\t\t\t\tvar change = (newObject===null ? "update" : "delete"),\r\n\t\t\t\t\t\t\tkeypath = path + "." + key;\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\tchanges.push({name:name,object:rootObject,type:change,oldValue:oldObject[key],newValue:newObject,keypath:keypath});\r\n\t\t\t\t\t\trecurse(name,rootObject,oldObject[key],undefined,keypath);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tchangeset.forEach(function(change) {\r\n\t\t\t\tvar keypath = (parts.length>0 ? parts.join(".") + "." : "") + change.name;\r\n\r\n\t\t\t\tif (change.type === "update" || change.type === "add") { \r\n\t\t\t\t\treobserve(change.object, parts);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tchanges.push({name:change.name,object:change.object,type:change.type,oldValue:change.oldValue,newValue:change.object[change.name],keypath:keypath});\r\n\t\t\t\trecurse(change.name,change.object,change.oldValue,change.object[change.name],keypath);\r\n\t\t\t});\r\n\t\t\tcallback(changes);\r\n\t\t});\r\n\t\treturn observed;\r\n\t};\r\n})();\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvcHJveHktb2JzZXJ2ZS9pbmRleC5qcz85NWViIl0sInNvdXJjZXNDb250ZW50IjpbIi8vICAgICBwcm94eS1vYnNlcnZlIHYwLjAuMThcclxuLy8gICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNiBTaW1vbiBZLiBCbGFja3dlbGwsIEFueVdoaWNoV2F5XHJcbi8vICAgICBNSVQgTGljZW5zZSAtIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcclxuKGZ1bmN0aW9uKCkge1xyXG5cdFwidXNlIHN0cmljdFwiO1xyXG5cdC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm94eSB3cmFwcGluZyBhIHRhcmdldCBzbyB0aGF0IGFsbCBjaGFuZ2VzIGNhbiBiZSB0cmFwcGVkIGFuZCBmb3J3YXJkZWQgdG9cclxuXHQvLyBhIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgdGFrZXMgYW4gYXJyYXkgb2YgY2hhbmdlcyBqdXN0IGxpa2UgdGhlIHRyYWRpdGlvbmFsIG9yaWdpbmFsIENocm9tZSBPYmplY3Qub2JzZXJ2ZVxyXG5cdC8vIHtvYmplY3Q6PG9iamVjdCBjaGFuZ2VkPixuYW1lOjxmaWVsZCBjaGFuZ2VkPix0eXBlOmFkZHx1cGRhdGV8ZGVsZXRlfHJlY29uZmlndXJlfHByZXZlbnRFeHRlbnNpb25zfHNldFByb3RvdHlwZSxvbGRWYWx1ZTo8b2xkIHZhbHVlIGlmIHVwZGF0ZSB8IGRlbGV0ZT59XHJcblx0Ly8gVGhlIGFjY2VwdGxpc3QgY2FuIGJlIGFkZHx1cGRhdGV8ZGVsZXRlfHJlY29uZmlndXJlfHByZXZlbnRFeHRlbnNpb25zfHNldFByb3RvdHlwZS5cclxuXHQvLyB2IDAuMC4xMCB0byBzdXBwb3J0IHBhdXNpbmcgYW5kIHJlc3RhcnRpbmcgb2JzZXJ2YXRpb24gdHdvIGFkZGl0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIGFyZSBhdmFpbGFibGUgdG8gT2JqZWN0Lm9ic2VydmU6XHJcblx0Ly8gcGF1c2FibGUgLSBjcmVhdGUgdGhlIE9ic2VydmVyIHNvIGl0IGNhbiBiZSBwYXVzZWRcclxuXHQvLyBwYXVzZSAtIGNyZWF0ZSBvYnNlcnZlciBpbiBwYXVzZWQgc3RhdGVcclxuXHQvLyBpZiBwYXVzYWJsZSBpcyB0cnVlIHRoZW4gYW4gYWRkaXRpb25hbCBtZXRob2QgZGVsaXZlcihpZ25vcmVQcmV2aW91cykgaXMgYXZhaWxhYmxlIHRvIHN0YXJ0IGRlbGl2ZXJ5XHJcblx0Ly8gdG8gcGF1c2UgZGVsaXZlcnkgc2V0IGEgcHJvcGVydHkgY2FsbGVkIHBhdXNlIG9uIHRoZSBmdW5jdGlvbiBkZWxpdmVyIHRvIHRydWVcclxuXHQvLyBwYXVzYWJsZSBpcyBvcHRpb25hbCB0byByZWR1Y2UgdGhlIGNoYW5jZSBvZiBzaGFkb3dpbmcgYSBwcm9wZXJ0eSBvciBtZXRob2Qgb24gYW55IGV4aXN0aW5nIGNvZGUgY2FsbGVkIGRlbGl2ZXJcclxuXHRpZighT2JqZWN0Lm9ic2VydmUgJiYgdHlwZW9mKFByb3h5KT09PVwiZnVuY3Rpb25cIikge1xyXG5cdFx0ZnVuY3Rpb24gT2JzZXJ2ZXIodGFyZ2V0LGNhbGxiYWNrLGFjY2VwdGxpc3QscGF1c2FibGUscGF1c2UsZGVsYXkpIHtcclxuXHQgICAgXHR2YXIgbWUgPSB0aGlzLCBwcm94eTtcclxuXHQgICAgXHRmdW5jdGlvbiBkZWxpdmVyKGlnbm9yZVByZXZpb3VzLGRlbGF5KSB7XHJcblx0ICAgIFx0XHRkZWxpdmVyLmRlbGF5ID0gZGVsYXk7XHJcblx0ICAgIFx0XHRpZighZGVsaXZlci5wYXVzZSkge1xyXG5cdCAgICAgICAgXHRcdGlmKG1lLmNoYW5nZXNldC5sZW5ndGg+MCkge1xyXG5cdCAgICAgICAgXHRcdFx0aWYoIWlnbm9yZVByZXZpb3VzKSB7XHJcblx0XHQgICAgXHQgICAgXHRcdHZhciBjaGFuZ2VzID0gbWUuY2hhbmdlc2V0LmZpbHRlcihmdW5jdGlvbihjaGFuZ2UpIHsgcmV0dXJuICFhY2NlcHRsaXN0IHx8IGFjY2VwdGxpc3QuaW5kZXhPZihjaGFuZ2UudHlwZSk+PTA7IH0pO1xyXG5cdFx0ICAgICAgICBcdFx0XHRpZihjaGFuZ2VzLmxlbmd0aD4wKSB7XHJcblx0XHQgICAgICAgIFx0XHRcdFx0Y2FsbGJhY2soY2hhbmdlcyk7XHJcblx0XHQgICAgICAgIFx0XHRcdH1cclxuXHQgICAgICAgIFx0XHRcdH1cclxuXHQgICAgICAgIFx0XHRcdG1lLmNoYW5nZXNldCA9IFtdO1xyXG5cdCAgICAgICAgXHRcdH1cclxuXHQgICAgXHRcdH1cclxuXHQgICAgXHR9XHJcblx0ICAgIFx0ZGVsaXZlci5wYXVzZSA9IHBhdXNlO1xyXG5cdCAgICBcdGRlbGl2ZXIuZGVsYXkgPSBkZWxheTtcclxuXHRcdCAgICBtZS5nZXQgPSBmdW5jdGlvbih0YXJnZXQsIHByb3BlcnR5KSB7XHJcblx0XHQgICAgXHRpZihwcm9wZXJ0eT09PVwiX19vYnNlcnZlcl9fXCIpIHtcclxuXHRcdCAgICBcdFx0cmV0dXJuIG1lO1xyXG5cdFx0ICAgIFx0fVxyXG5cdFx0ICAgIFx0aWYocHJvcGVydHk9PT1cInVub2JzZXJ2ZVwiKSB7XHJcblx0XHQgICAgXHRcdHJldHVybiBmdW5jdGlvbigpIHtcclxuXHRcdCAgICBcdFx0XHRPYmplY3QudW5vYnNlcnZlKHRhcmdldCk7XHJcblx0XHQgICAgXHRcdFx0cmV0dXJuIHRhcmdldDtcclxuXHRcdCAgICBcdFx0fTtcclxuXHRcdCAgICBcdH1cclxuXHRcdCAgICBcdGlmKHByb3BlcnR5PT09XCJkZWxpdmVyXCIpIHtcclxuXHRcdCAgICBcdFx0cmV0dXJuIGRlbGl2ZXI7XHJcblx0XHQgICAgXHR9XHJcblx0XHQgICAgXHRyZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XTtcclxuXHRcdCAgICB9XHJcblx0ICAgIFx0bWUudGFyZ2V0ID0gdGFyZ2V0O1xyXG5cdCAgICBcdG1lLmNoYW5nZXNldCA9IFtdO1xyXG5cdCAgICBcdGlmKCFtZS50YXJnZXQuX19vYnNlcnZlckNhbGxiYWNrc19fKSB7XHJcblx0ICAgIFx0XHQvLyBfX29ic2VydmVyQ2FsbGJhY2tzX18gaXMgdXNlZCBhcyBhbiBpbmRleCB0byBnZXQgYXQgdGhlIHByb3h5IHdoaWNoIGlzIHRoZSBvYnNlcnZlciwgc28gd2UgY2FuIHVub2JzZXJ2ZVxyXG5cdCAgICBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxcIl9fb2JzZXJ2ZXJDYWxsYmFja3NfX1wiLHtlbnVtZXJhYmxlOmZhbHNlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOmZhbHNlLHZhbHVlOltdfSk7XHJcblx0ICAgIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LFwiX19vYnNlcnZlcnNfX1wiLHtlbnVtZXJhYmxlOmZhbHNlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOmZhbHNlLHZhbHVlOltdfSk7XHJcblx0ICAgIFx0fVxyXG5cdCAgICBcdG1lLnRhcmdldC5fX29ic2VydmVyQ2FsbGJhY2tzX18ucHVzaChjYWxsYmFjayk7XHJcblx0ICAgIFx0bWUudGFyZ2V0Ll9fb2JzZXJ2ZXJzX18ucHVzaCh0aGlzKTtcclxuXHQgICAgXHRwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsbWUpO1xyXG5cdCAgICBcdGRlbGl2ZXIoZmFsc2UsZGVsYXkpO1xyXG5cdCAgICBcdHJldHVybiBwcm94eTtcclxuXHQgICAgfVxyXG5cdFx0T2JzZXJ2ZXIucHJvdG90eXBlLmRlbGl2ZXIgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KG51bGwsXCJkZWxpdmVyXCIpO1xyXG5cdFx0fVxyXG5cdCAgICBPYnNlcnZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24odGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUpIHsgLy8gLCByZWNlaXZlclxyXG5cdCAgICBcdHZhciBvbGR2YWx1ZSA9IHRhcmdldFtwcm9wZXJ0eV07XHJcblx0ICAgIFx0dmFyIHR5cGUgPSAob2xkdmFsdWU9PT11bmRlZmluZWQgPyBcImFkZFwiIDogXCJ1cGRhdGVcIik7XHJcblx0ICAgIFx0dGFyZ2V0W3Byb3BlcnR5XSA9IHZhbHVlO1xyXG5cdCAgICBcdGlmKHRhcmdldC5fX29ic2VydmVyc19fLmluZGV4T2YodGhpcyk+PTAgJiYgKCF0aGlzLmFjY2VwdGxpc3QgfHwgdGhpcy5hY2NlcHRsaXN0LmluZGV4T2YodHlwZSk+PTApKSB7XHJcblx0ICAgICAgICBcdHZhciBjaGFuZ2UgPSB7b2JqZWN0OnRhcmdldCxuYW1lOnByb3BlcnR5LHR5cGU6dHlwZX0sXHJcblx0ICAgICAgICBcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcblx0ICAgICAgICBcdFx0ZGVsaXZlciA9IHRoaXMuZGVsaXZlcigpO1xyXG5cdCAgICAgICAgXHRpZih0eXBlPT09XCJ1cGRhdGVcIikge1xyXG5cdCAgICAgICAgXHRcdGNoYW5nZS5vbGRWYWx1ZSA9IG9sZHZhbHVlO1xyXG5cdCAgICAgICAgXHR9XHJcblx0ICAgICAgICBcdHRoaXMuY2hhbmdlc2V0LnB1c2goY2hhbmdlKTtcclxuXHQgICAgICAgIFx0aWYoc3RhcnQpIHtcclxuXHQgICAgICAgIFx0XHRkZWxpdmVyKGZhbHNlLCh0eXBlb2YoZGVsaXZlci5kZWxheSk9PT1cIm51bWJlclwiID8gZGVsaXZlci5kZWxheSA6IDEwKSk7XHJcblx0ICAgICAgICBcdH1cclxuXHQgICAgXHR9XHJcblx0ICAgIFx0cmV0dXJuIHRydWU7XHJcblx0ICAgIH07XHJcblx0ICAgIE9ic2VydmVyLnByb3RvdHlwZS5kZWxldGVQcm9wZXJ0eSA9IGZ1bmN0aW9uKHRhcmdldCwgcHJvcGVydHkpIHtcclxuXHQgICAgXHR2YXIgb2xkdmFsdWUgPSB0YXJnZXRbcHJvcGVydHldO1xyXG5cdCAgICBcdC8vaWYodHlwZW9mKG9sZHZhbHVlKSE9PVwidW5kZWZpbmVkXCIpIHtcclxuXHRcdCAgICBcdGRlbGV0ZSB0YXJnZXRbcHJvcGVydHldO1xyXG5cdFx0ICAgIFx0aWYodGFyZ2V0Ll9fb2JzZXJ2ZXJzX18uaW5kZXhPZih0aGlzKT49MCAmJiAhdGhpcy5hY2NlcHRsaXN0IHx8IHRoaXMuYWNjZXB0bGlzdC5pbmRleE9mKFwiZGVsZXRlXCIpPj0wKSB7XHJcblx0XHQgICAgICAgIFx0dmFyIGNoYW5nZSA9IHtvYmplY3Q6dGFyZ2V0LG5hbWU6cHJvcGVydHksdHlwZTpcImRlbGV0ZVwiLG9sZFZhbHVlOm9sZHZhbHVlfSxcclxuXHRcdCAgICAgICAgXHRcdHN0YXJ0ID0gdGhpcy5jaGFuZ2VzZXQubGVuZ3RoID09PSAwLFxyXG5cdFx0ICAgICAgICBcdFx0ZGVsaXZlciA9IHRoaXMuZGVsaXZlcigpO1xyXG5cdFx0ICAgICAgICBcdHRoaXMuY2hhbmdlc2V0LnB1c2goY2hhbmdlKTtcclxuXHRcdCAgICAgICAgXHRpZihzdGFydCkge1xyXG5cdFx0ICAgICAgICBcdFx0ZGVsaXZlcihmYWxzZSwodHlwZW9mKGRlbGl2ZXIuZGVsYXkpPT09XCJudW1iZXJcIiA/IGRlbGl2ZXIuZGVsYXkgOiAxMCkpO1xyXG5cdFx0ICAgICAgICBcdH1cclxuXHRcdCAgICBcdH1cclxuXHQgICAgXHQvL31cclxuXHQgICAgXHRyZXR1cm4gdHJ1ZTtcclxuXHQgICAgfTtcclxuXHQgICAgT2JzZXJ2ZXIucHJvdG90eXBlLmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24odGFyZ2V0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikge1xyXG5cdCAgICBcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjcmlwdG9yKTtcclxuXHQgICAgXHRpZih0YXJnZXQuX19vYnNlcnZlcnNfXy5pbmRleE9mKHRoaXMpPj0wICYmICF0aGlzLmFjY2VwdGxpc3QgfHwgdGhpcy5hY2NlcHRsaXN0LmluZGV4T2YoXCJyZWNvbmZpZ3VyZVwiKT49MCkge1xyXG5cdCAgICAgICAgXHR2YXIgY2hhbmdlID0ge29iamVjdDp0YXJnZXQsbmFtZTpwcm9wZXJ0eSx0eXBlOlwicmVjb25maWd1cmVcIn0sXHJcbiAgICAgICAgXHRcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcbiAgICAgICAgXHRcdFx0ZGVsaXZlciA9IHRoaXMuZGVsaXZlcigpO1xyXG5cdCAgICAgICAgXHR0aGlzLmNoYW5nZXNldC5wdXNoKGNoYW5nZSk7XHJcblx0ICAgICAgICBcdGlmKHN0YXJ0KSB7XHJcblx0ICAgICAgICBcdFx0ZGVsaXZlcihmYWxzZSwodHlwZW9mKGRlbGl2ZXIuZGVsYXkpPT09XCJudW1iZXJcIiA/IGRlbGl2ZXIuZGVsYXkgOiAxMCkpO1xyXG5cdCAgICAgICAgXHR9XHJcblx0ICAgIFx0fVxyXG5cdCAgICBcdHJldHVybiB0cnVlO1xyXG5cdCAgICB9O1xyXG5cdCAgICBPYnNlcnZlci5wcm90b3R5cGUuc2V0UHJvdG90eXBlT2YgPSBmdW5jdGlvbih0YXJnZXQsIHByb3RvdHlwZSkge1xyXG5cdCAgICBcdHZhciBvbGR2YWx1ZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpO1xyXG5cdCAgICBcdE9iamVjdC5zZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvdHlwZSk7XHJcblx0ICAgIFx0aWYodGFyZ2V0Ll9fb2JzZXJ2ZXJzX18uaW5kZXhPZih0aGlzKT49MCAmJiAhdGhpcy5hY2NlcHRsaXN0IHx8IHRoaXMuYWNjZXB0bGlzdC5pbmRleE9mKFwic2V0UHJvdG90eXBlXCIpPj0wKSB7XHJcblx0ICAgICAgICBcdHZhciBjaGFuZ2UgPSB7b2JqZWN0OnRhcmdldCxuYW1lOlwiX19wcm90b19fXCIsdHlwZTpcInNldFByb3RvdHlwZVwiLG9sZFZhbHVlOm9sZHZhbHVlfSxcclxuICAgIFx0XHRcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcbiAgICBcdFx0XHRcdGRlbGl2ZXIgPSB0aGlzLmRlbGl2ZXIoKTtcclxuXHQgICAgICAgIFx0dGhpcy5jaGFuZ2VzZXQucHVzaChjaGFuZ2UpO1xyXG5cdCAgICAgICAgXHRpZihzdGFydCkge1xyXG5cdCAgICAgICAgXHRcdGRlbGl2ZXIoZmFsc2UsKHR5cGVvZihkZWxpdmVyLmRlbGF5KT09PVwibnVtYmVyXCIgPyBkZWxpdmVyLmRlbGF5IDogMTApKTtcclxuXHQgICAgICAgIFx0fVxyXG5cdCAgICBcdH1cclxuXHQgICAgXHRyZXR1cm4gdHJ1ZTtcclxuXHQgICAgfTtcclxuXHQgICAgT2JzZXJ2ZXIucHJvdG90eXBlLnByZXZlbnRFeHRlbnNpb25zID0gZnVuY3Rpb24odGFyZ2V0KSB7XHJcblx0ICAgICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcclxuXHQgICAgXHRpZih0YXJnZXQuX19vYnNlcnZlcnNfXy5pbmRleE9mKHRoaXMpPj0wICYmICF0aGlzLmFjY2VwdGxpc3QgfHwgdGhpcy5hY2NlcHRsaXN0LmluZGV4T2YoXCJwcmV2ZW50RXh0ZW5zaW9uc1wiKT49MCkge1xyXG5cdCAgICAgICAgXHR2YXIgY2hhbmdlID0ge29iamVjdDp0YXJnZXQsdHlwZTpcInByZXZlbnRFeHRlbnNpb25zXCJ9LFxyXG5cdFx0XHRcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcblx0XHRcdFx0XHRkZWxpdmVyID0gdGhpcy5kZWxpdmVyKCk7XHJcblx0ICAgICAgICBcdHRoaXMuY2hhbmdlc2V0LnB1c2goY2hhbmdlKTtcclxuXHQgICAgICAgIFx0aWYoc3RhcnQpIHtcclxuXHQgICAgICAgIFx0XHRkZWxpdmVyKGZhbHNlLCh0eXBlb2YoZGVsaXZlci5kZWxheSk9PT1cIm51bWJlclwiID8gZGVsaXZlci5kZWxheSA6IDEwKSk7XHJcblx0ICAgICAgICBcdH1cclxuXHQgICAgXHR9XHJcblx0ICAgIFx0cmV0dXJuIHRydWU7XHJcblx0ICAgIH07XHJcblx0ICAgIE9iamVjdC5vYnNlcnZlID0gZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrLGFjY2VwdGxpc3QscGF1c2FibGUscGF1c2UsZGVsYXkpIHtcclxuXHQgICAgXHRyZXR1cm4gbmV3IE9ic2VydmVyKG9iamVjdCxjYWxsYmFjayxhY2NlcHRsaXN0LHBhdXNhYmxlLHBhdXNlLGRlbGF5KTtcclxuXHQgICAgfTtcclxuXHQgICAgT2JqZWN0LnVub2JzZXJ2ZSA9IGZ1bmN0aW9uKG9iamVjdCxjYWxsYmFjaykge1xyXG5cdCAgICBcdGlmKG9iamVjdC5fX29ic2VydmVyQ2FsbGJhY2tzX18pIHtcclxuXHQgICAgXHRcdGlmKCFjYWxsYmFjaykge1xyXG5cdCAgICBcdFx0XHRvYmplY3QuX19vYnNlcnZlckNhbGxiYWNrc19fLnNwbGljZSgwLG9iamVjdC5fX29ic2VydmVyQ2FsbGJhY2tzX18ubGVuZ3RoKTtcclxuXHQgICAgXHRcdFx0b2JqZWN0Ll9fb2JzZXJ2ZXJzX18uc3BsaWNlKDAsb2JqZWN0Ll9fb2JzZXJ2ZXJzX18ubGVuZ3RoKTtcclxuXHQgICAgXHRcdFx0cmV0dXJuO1xyXG5cdCAgICBcdFx0fVxyXG5cdCAgICBcdFx0b2JqZWN0Ll9fb2JzZXJ2ZXJDYWxsYmFja3NfXy5mb3JFYWNoKGZ1bmN0aW9uKG9ic2VydmVyY2FsbGJhY2ssaSkge1xyXG5cdCAgICBcdFx0XHRpZihjYWxsYmFjaz09PW9ic2VydmVyY2FsbGJhY2spIHtcclxuXHQgICAgXHRcdFx0XHRvYmplY3QuX19vYnNlcnZlckNhbGxiYWNrc19fLnNwbGljZShpLDEpO1xyXG5cdCAgICBcdFx0XHRcdGRlbGV0ZSBvYmplY3QuX19vYnNlcnZlcnNfX1tpXS5jYWxsYmFjaztcclxuXHQgICAgXHRcdFx0XHRvYmplY3QuX19vYnNlcnZlcnNfXy5zcGxpY2UoaSwxKTtcclxuXHQgICAgXHRcdFx0fVxyXG5cdCAgICBcdFx0fSk7XHJcblx0ICAgIFx0fVxyXG5cdCAgICB9O1xyXG5cdCAgICBBcnJheS5vYnNlcnZlID0gZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrLGFjY2VwdGxpc3QscGF1c2FibGUscGF1c2UsZGVsYXkpIHtcclxuXHQgICAgXHRpZighKG9iamVjdCBpbnN0YW5jZW9mIEFycmF5KSAmJiAhQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XHJcblx0ICAgIFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmlyc3QgYXJndW1lbnQgdG8gQXJyYXkub2JzZXJ2ZXIgaXMgbm90IGFuIEFycmF5XCIpO1xyXG5cdCAgICBcdH1cclxuICAgICAgICAgICAgXHRhY2NlcHRsaXN0ID0gYWNjZXB0bGlzdCB8fCBbXCJhZGRcIiwgXCJ1cGRhdGVcIiwgXCJkZWxldGVcIiwgXCJzcGxpY2VcIl07XHJcblx0ICAgIFx0dmFyIGFycmF5cHJveHkgPSBuZXcgUHJveHkob2JqZWN0LHtnZXQ6IGZ1bmN0aW9uKHRhcmdldCxwcm9wZXJ0eSkge1xyXG5cdCAgICBcdFx0aWYocHJvcGVydHk9PT1cInVub2JzZXJ2ZVwiKSB7XHJcblx0XHQgICAgXHRcdHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xyXG5cdFx0ICAgIFx0XHRcdGlmKGNhbGxiYWNrKSB7XHJcblx0XHQgICAgXHRcdFx0XHRyZXR1cm4gT2JqZWN0LnVub2JzZXJ2ZSh0YXJnZXQsY2FsbGJhY2spO1xyXG5cdFx0ICAgIFx0XHRcdH1cclxuXHRcdCAgICBcdFx0XHRyZXR1cm4gdGFyZ2V0LnVub2JzZXJ2ZSgpO1xyXG5cdFx0ICAgIFx0XHR9O1xyXG5cdFx0ICAgIFx0fVxyXG5cdCAgICBcdFx0aWYocHJvcGVydHk9PT1cInNwbGljZVwiKSB7XHJcblx0ICAgIFx0XHRcdHJldHVybiBmdW5jdGlvbihzdGFydCxlbmQpIHtcclxuXHQgICAgXHRcdFx0XHRpZih0eXBlb2Yoc3RhcnQpIT09XCJudW1iZXJcIiB8fCB0eXBlb2YoZW5kKSE9PVwibnVtYmVyXCIpIHtcclxuXHQgICAgXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCB0d28gYXJndW1lbnRzIHRvIEFycmF5IHNwbGljZSBhcmUgbm90IG51bWJlciwgbnVtYmVyXCIpO1xyXG5cdCAgICBcdFx0XHRcdH1cclxuXHQgICAgXHQgICAgXHRcdHZhciByZW1vdmVkID0gdGhpcy5zbGljZShzdGFydCxzdGFydCtlbmQpLFxyXG5cdCAgICBcdCAgICBcdFx0XHRhZGRlZENvdW50ID0gKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzLmxlbmd0aC0yIDogMCksXHJcblx0ICAgIFx0ICAgIFx0XHRcdGNoYW5nZSA9ICB7b2JqZWN0Om9iamVjdCx0eXBlOlwic3BsaWNlXCIsaW5kZXg6c3RhcnQscmVtb3ZlZDpyZW1vdmVkLGFkZGVkQ291bnQ6YWRkZWRDb3VudH07XHJcblx0ICAgIFx0ICAgIFx0XHR0YXJnZXQuc3BsaWNlLmFwcGx5KHRhcmdldCxhcmd1bWVudHMpO1xyXG5cdCAgICBcdCAgICBcdFx0aWYoYWNjZXB0bGlzdC5pbmRleE9mKFwic3BsaWNlXCIpPj0wKSB7XHJcblx0ICAgIFx0ICAgIFx0XHRcdHZhciBzdGFydCA9IHByb3h5Ll9fb2JzZXJ2ZXJfXy5jaGFuZ2VzZXQubGVuZ3RoID09PSAwLFxyXG5cdCAgICBcdCAgICAgICAgXHRcdFx0ZGVsaXZlciA9IHByb3h5Ll9fb2JzZXJ2ZXJfXy5kZWxpdmVyKCk7XHJcblx0ICAgIFx0ICAgIFx0XHRcdHByb3h5Ll9fb2JzZXJ2ZXJfXy5jaGFuZ2VzZXQucHVzaChjaGFuZ2UpO1xyXG5cdCAgICBcdCAgICBcdFx0XHRpZihzdGFydCkge1xyXG5cdCAgICBcdFx0ICAgICAgICBcdFx0ZGVsaXZlcihmYWxzZSwodHlwZW9mKGRlbGl2ZXIuZGVsYXkpPT09XCJudW1iZXJcIiA/IGRlbGl2ZXIuZGVsYXkgOiAxMCkpO1xyXG5cdCAgICBcdFx0ICAgICAgICBcdH1cclxuXHQgICAgXHQgICAgXHRcdH1cclxuXHQgICAgXHQgICAgXHR9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRpZihwcm9wZXJ0eT09PVwicHVzaFwiKSB7XHJcblx0ICAgIFx0XHRcdCByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xyXG5cdCAgICBcdFx0ICAgIFx0cmV0dXJuIHRoaXMuc3BsaWNlKHRoaXMubGVuZ3RoLDAsaXRlbSk7XHJcblx0ICAgIFx0XHQgICAgfVxyXG5cdCAgICBcdFx0fVxyXG5cdCAgICBcdFx0aWYocHJvcGVydHk9PT1cInBvcFwiKSB7XHJcblx0ICAgIFx0XHRcdCByZXR1cm4gZnVuY3Rpb24oKSB7XHJcblx0ICAgIFx0XHQgICAgXHRyZXR1cm4gdGhpcy5zcGxpY2UodGhpcy5sZW5ndGgtMSwxKTtcclxuXHQgICAgXHRcdCAgICB9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRpZihwcm9wZXJ0eT09PVwidW5zaGlmdFwiKSB7XHJcblx0ICAgIFx0XHRcdCByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgXHRcdCAgICBcdFx0cmV0dXJuIHRoaXMuc3BsaWNlKDAsMCxpdGVtKTtcclxuICAgIFx0XHQgICAgXHR9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRpZihwcm9wZXJ0eT09PVwic2hpZnRcIikge1xyXG5cdCAgICBcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XHJcblx0ICAgIFx0ICAgIFx0XHRyZXR1cm4gdGhpcy5zcGxpY2UoMCwxKTtcclxuXHQgICAgXHQgICAgXHR9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRyZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XTtcclxuXHQgICAgXHR9fSk7XHJcblx0ICAgIFx0dmFyIHByb3h5ID0gT2JqZWN0Lm9ic2VydmUoYXJyYXlwcm94eSxmdW5jdGlvbihjaGFuZ2VzZXQpIHsgXHJcblx0ICAgIFx0XHR2YXIgY2hhbmdlcyA9IGNoYW5nZXNldC5maWx0ZXIoZnVuY3Rpb24oY2hhbmdlKSB7IHJldHVybiBjaGFuZ2UubmFtZSE9PVwibGVuZ3RoXCIgJiYgY2hhbmdlLm5hbWUhPT1cImFkZFwiICYmICghYWNjZXB0bGlzdCB8fCBhY2NlcHRsaXN0LmluZGV4T2YoY2hhbmdlLnR5cGUpPj0wKTsgfSk7XHJcblx0ICAgIFx0XHRpZihjaGFuZ2VzLmxlbmd0aD4wKSB7XHJcblx0ICAgIFx0XHRcdGNhbGxiYWNrKGNoYW5nZXMpO1xyXG5cdCAgICBcdFx0fVxyXG5cdCAgICBcdH0sYWNjZXB0bGlzdCxwYXVzYWJsZSxwYXVzZSxkZWxheSk7XHJcblx0ICAgIFx0cmV0dXJuIHByb3h5O1xyXG5cdCAgICB9O1xyXG5cdCAgICBBcnJheS51bm9ic2VydmUgPSBmdW5jdGlvbihvYmplY3QsY2FsbGJhY2spIHtcclxuXHRcdCAgcmV0dXJuIG9iamVjdC51bm9ic2VydmUoY2FsbGJhY2spO1xyXG5cdCAgICB9XHJcblx0fVxyXG5cdE9iamVjdC5kZWVwT2JzZXJ2ZSA9IGZ1bmN0aW9uKG9iamVjdCxjYWxsYmFjayxwYXJ0cykge1xyXG5cclxuXHRcdHBhcnRzID0gKHBhcnRzID8gcGFydHMgOiBbXSk7XHJcblxyXG5cdFx0dmFyIHRvVHlwZU5hbWUgPSBmdW5jdGlvbihvYmopIHtcclxuXHRcdFx0cmV0dXJuICh7fSkudG9TdHJpbmcuY2FsbChvYmopLm1hdGNoKC9cXHMoW2EtekEtWl0rKS8pWzFdLnRvTG93ZXJDYXNlKClcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiByZW9ic2VydmUodmFsdWUsIHBhcnRzKSB7XHJcblx0XHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xyXG5cdFx0XHRrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XHJcblx0XHRcdFx0aWYoKHRvVHlwZU5hbWUodmFsdWVba2V5XSkgPT09ICdvYmplY3QnIHx8IHRvVHlwZU5hbWUodmFsdWVba2V5XSkgPT09ICdhcnJheScpICYmICF2YWx1ZVtrZXldLmhhc093blByb3BlcnR5KCdfX29ic2VydmVyc19fJykpIHtcclxuXHRcdFx0XHRcdHZhciBuZXdwYXJ0cyA9IHBhcnRzLnNsaWNlKDApO1xyXG5cdFx0XHRcdFx0bmV3cGFydHMucHVzaChrZXkpO1xyXG5cdFx0XHRcdFx0dmFsdWVba2V5XSA9IE9iamVjdC5kZWVwT2JzZXJ2ZSh2YWx1ZVtrZXldLGNhbGxiYWNrLG5ld3BhcnRzKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlb2JzZXJ2ZShvYmplY3QsIHBhcnRzKTtcclxuXHJcblx0XHR2YXIgb2JzZXJ2ZWQgPSBPYmplY3Qub2JzZXJ2ZShvYmplY3QsZnVuY3Rpb24oY2hhbmdlc2V0KSB7XHJcblx0XHRcdHZhciBjaGFuZ2VzID0gW107XHJcblx0XHRcdGZ1bmN0aW9uIHJlY3Vyc2UobmFtZSxyb290T2JqZWN0LG9sZE9iamVjdCxuZXdPYmplY3QscGF0aCkge1xyXG5cdFx0XHRcdGlmKG5ld09iamVjdCBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG5cdFx0XHRcdFx0dmFyIG5ld2tleXMgPSBPYmplY3Qua2V5cyhuZXdPYmplY3QpO1xyXG5cdFx0XHRcdFx0bmV3a2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xyXG5cdFx0XHRcdFx0XHRpZighb2xkT2JqZWN0IHx8IChvbGRPYmplY3Rba2V5XSE9PW5ld09iamVjdFtrZXldKSkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBvbGR2YWx1ZSA9IChvbGRPYmplY3QgJiYgb2xkT2JqZWN0W2tleV0hPT11bmRlZmluZWQgPyBvbGRPYmplY3Rba2V5XSA6IHVuZGVmaW5lZCksXHJcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2UgPSAob2xkdmFsdWU9PT11bmRlZmluZWQgPyBcImFkZFwiIDogXCJ1cGRhdGVcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRrZXlwYXRoID0gcGF0aCArIFwiLlwiICsga2V5O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe25hbWU6bmFtZSxvYmplY3Q6cm9vdE9iamVjdCx0eXBlOmNoYW5nZSxvbGRWYWx1ZTpvbGR2YWx1ZSxuZXdWYWx1ZTpuZXdPYmplY3Rba2V5XSxrZXlwYXRoOmtleXBhdGh9KTtcclxuXHRcdFx0XHRcdFx0XHRyZWN1cnNlKG5hbWUscm9vdE9iamVjdCxvbGR2YWx1ZSxuZXdPYmplY3Rba2V5XSxrZXlwYXRoKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmKG9sZE9iamVjdCBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG5cdFx0XHRcdFx0dmFyIG9sZGtleXMgPSBPYmplY3Qua2V5cyhvbGRPYmplY3QpO1xyXG5cdFx0XHRcdFx0b2xka2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xyXG5cdFx0XHRcdFx0XHR2YXIgY2hhbmdlID0gKG5ld09iamVjdD09PW51bGwgPyBcInVwZGF0ZVwiIDogXCJkZWxldGVcIiksXHJcblx0XHRcdFx0XHRcdFx0a2V5cGF0aCA9IHBhdGggKyBcIi5cIiArIGtleTtcclxuXHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtuYW1lOm5hbWUsb2JqZWN0OnJvb3RPYmplY3QsdHlwZTpjaGFuZ2Usb2xkVmFsdWU6b2xkT2JqZWN0W2tleV0sbmV3VmFsdWU6bmV3T2JqZWN0LGtleXBhdGg6a2V5cGF0aH0pO1xyXG5cdFx0XHRcdFx0XHRyZWN1cnNlKG5hbWUscm9vdE9iamVjdCxvbGRPYmplY3Rba2V5XSx1bmRlZmluZWQsa2V5cGF0aCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Y2hhbmdlc2V0LmZvckVhY2goZnVuY3Rpb24oY2hhbmdlKSB7XHJcblx0XHRcdFx0dmFyIGtleXBhdGggPSAocGFydHMubGVuZ3RoPjAgPyBwYXJ0cy5qb2luKFwiLlwiKSArIFwiLlwiIDogXCJcIikgKyBjaGFuZ2UubmFtZTtcclxuXHJcblx0XHRcdFx0aWYgKGNoYW5nZS50eXBlID09PSBcInVwZGF0ZVwiIHx8IGNoYW5nZS50eXBlID09PSBcImFkZFwiKSB7IFxyXG5cdFx0XHRcdFx0cmVvYnNlcnZlKGNoYW5nZS5vYmplY3QsIHBhcnRzKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNoYW5nZXMucHVzaCh7bmFtZTpjaGFuZ2UubmFtZSxvYmplY3Q6Y2hhbmdlLm9iamVjdCx0eXBlOmNoYW5nZS50eXBlLG9sZFZhbHVlOmNoYW5nZS5vbGRWYWx1ZSxuZXdWYWx1ZTpjaGFuZ2Uub2JqZWN0W2NoYW5nZS5uYW1lXSxrZXlwYXRoOmtleXBhdGh9KTtcclxuXHRcdFx0XHRyZWN1cnNlKGNoYW5nZS5uYW1lLGNoYW5nZS5vYmplY3QsY2hhbmdlLm9sZFZhbHVlLGNoYW5nZS5vYmplY3RbY2hhbmdlLm5hbWVdLGtleXBhdGgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Y2FsbGJhY2soY2hhbmdlcyk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiBvYnNlcnZlZDtcclxuXHR9O1xyXG59KSgpO1xyXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///82\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\r\nAuthor: Geraint Luff and others\r\nYear: 2013\r\n\r\nThis code is released into the "public domain" by its author(s). Anybody may use, alter and distribute the code without restriction. The author makes no guarantees, and takes no liability of any kind for use of this code.\r\n\r\nIf you find a bug or make an improvement, it would be courteous to let the author know, but it is not compulsory.\r\n*/\r\n(function (global, factory) {\r\n if (true) {\r\n // AMD. Register as an anonymous module.\r\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n } else {}\r\n}(this, function () {\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FObject%2Fkeys\r\nif (!Object.keys) {\r\n\tObject.keys = (function () {\r\n\t\tvar hasOwnProperty = Object.prototype.hasOwnProperty,\r\n\t\t\thasDontEnumBug = !({toString: null}).propertyIsEnumerable(\'toString\'),\r\n\t\t\tdontEnums = [\r\n\t\t\t\t\'toString\',\r\n\t\t\t\t\'toLocaleString\',\r\n\t\t\t\t\'valueOf\',\r\n\t\t\t\t\'hasOwnProperty\',\r\n\t\t\t\t\'isPrototypeOf\',\r\n\t\t\t\t\'propertyIsEnumerable\',\r\n\t\t\t\t\'constructor\'\r\n\t\t\t],\r\n\t\t\tdontEnumsLength = dontEnums.length;\r\n\r\n\t\treturn function (obj) {\r\n\t\t\tif (typeof obj !== \'object\' && typeof obj !== \'function\' || obj === null) {\r\n\t\t\t\tthrow new TypeError(\'Object.keys called on non-object\');\r\n\t\t\t}\r\n\r\n\t\t\tvar result = [];\r\n\r\n\t\t\tfor (var prop in obj) {\r\n\t\t\t\tif (hasOwnProperty.call(obj, prop)) {\r\n\t\t\t\t\tresult.push(prop);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (hasDontEnumBug) {\r\n\t\t\t\tfor (var i=0; i < dontEnumsLength; i++) {\r\n\t\t\t\t\tif (hasOwnProperty.call(obj, dontEnums[i])) {\r\n\t\t\t\t\t\tresult.push(dontEnums[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t};\r\n\t})();\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create\r\nif (!Object.create) {\r\n\tObject.create = (function(){\r\n\t\tfunction F(){}\r\n\r\n\t\treturn function(o){\r\n\t\t\tif (arguments.length !== 1) {\r\n\t\t\t\tthrow new Error(\'Object.create implementation only accepts one parameter.\');\r\n\t\t\t}\r\n\t\t\tF.prototype = o;\r\n\t\t\treturn new F();\r\n\t\t};\r\n\t})();\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FisArray\r\nif(!Array.isArray) {\r\n\tArray.isArray = function (vArg) {\r\n\t\treturn Object.prototype.toString.call(vArg) === "[object Array]";\r\n\t};\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FindexOf\r\nif (!Array.prototype.indexOf) {\r\n\tArray.prototype.indexOf = function (searchElement /*, fromIndex */ ) {\r\n\t\tif (this === null) {\r\n\t\t\tthrow new TypeError();\r\n\t\t}\r\n\t\tvar t = Object(this);\r\n\t\tvar len = t.length >>> 0;\r\n\r\n\t\tif (len === 0) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tvar n = 0;\r\n\t\tif (arguments.length > 1) {\r\n\t\t\tn = Number(arguments[1]);\r\n\t\t\tif (n !== n) { // shortcut for verifying if it\'s NaN\r\n\t\t\t\tn = 0;\r\n\t\t\t} else if (n !== 0 && n !== Infinity && n !== -Infinity) {\r\n\t\t\t\tn = (n > 0 || -1) * Math.floor(Math.abs(n));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (n >= len) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tvar k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\r\n\t\tfor (; k < len; k++) {\r\n\t\t\tif (k in t && t[k] === searchElement) {\r\n\t\t\t\treturn k;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t};\r\n}\r\n\r\n// Grungey Object.isFrozen hack\r\nif (!Object.isFrozen) {\r\n\tObject.isFrozen = function (obj) {\r\n\t\tvar key = "tv4_test_frozen_key";\r\n\t\twhile (obj.hasOwnProperty(key)) {\r\n\t\t\tkey += Math.random();\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tobj[key] = true;\r\n\t\t\tdelete obj[key];\r\n\t\t\treturn false;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t};\r\n}\r\n// Based on: https://github.com/geraintluff/uri-templates, but with all the de-substitution stuff removed\r\n\r\nvar uriTemplateGlobalModifiers = {\r\n\t"+": true,\r\n\t"#": true,\r\n\t".": true,\r\n\t"/": true,\r\n\t";": true,\r\n\t"?": true,\r\n\t"&": true\r\n};\r\nvar uriTemplateSuffices = {\r\n\t"*": true\r\n};\r\n\r\nfunction notReallyPercentEncode(string) {\r\n\treturn encodeURI(string).replace(/%25[0-9][0-9]/g, function (doubleEncoded) {\r\n\t\treturn "%" + doubleEncoded.substring(3);\r\n\t});\r\n}\r\n\r\nfunction uriTemplateSubstitution(spec) {\r\n\tvar modifier = "";\r\n\tif (uriTemplateGlobalModifiers[spec.charAt(0)]) {\r\n\t\tmodifier = spec.charAt(0);\r\n\t\tspec = spec.substring(1);\r\n\t}\r\n\tvar separator = "";\r\n\tvar prefix = "";\r\n\tvar shouldEscape = true;\r\n\tvar showVariables = false;\r\n\tvar trimEmptyString = false;\r\n\tif (modifier === \'+\') {\r\n\t\tshouldEscape = false;\r\n\t} else if (modifier === ".") {\r\n\t\tprefix = ".";\r\n\t\tseparator = ".";\r\n\t} else if (modifier === "/") {\r\n\t\tprefix = "/";\r\n\t\tseparator = "/";\r\n\t} else if (modifier === \'#\') {\r\n\t\tprefix = "#";\r\n\t\tshouldEscape = false;\r\n\t} else if (modifier === \';\') {\r\n\t\tprefix = ";";\r\n\t\tseparator = ";";\r\n\t\tshowVariables = true;\r\n\t\ttrimEmptyString = true;\r\n\t} else if (modifier === \'?\') {\r\n\t\tprefix = "?";\r\n\t\tseparator = "&";\r\n\t\tshowVariables = true;\r\n\t} else if (modifier === \'&\') {\r\n\t\tprefix = "&";\r\n\t\tseparator = "&";\r\n\t\tshowVariables = true;\r\n\t}\r\n\r\n\tvar varNames = [];\r\n\tvar varList = spec.split(",");\r\n\tvar varSpecs = [];\r\n\tvar varSpecMap = {};\r\n\tfor (var i = 0; i < varList.length; i++) {\r\n\t\tvar varName = varList[i];\r\n\t\tvar truncate = null;\r\n\t\tif (varName.indexOf(":") !== -1) {\r\n\t\t\tvar parts = varName.split(":");\r\n\t\t\tvarName = parts[0];\r\n\t\t\ttruncate = parseInt(parts[1], 10);\r\n\t\t}\r\n\t\tvar suffices = {};\r\n\t\twhile (uriTemplateSuffices[varName.charAt(varName.length - 1)]) {\r\n\t\t\tsuffices[varName.charAt(varName.length - 1)] = true;\r\n\t\t\tvarName = varName.substring(0, varName.length - 1);\r\n\t\t}\r\n\t\tvar varSpec = {\r\n\t\t\ttruncate: truncate,\r\n\t\t\tname: varName,\r\n\t\t\tsuffices: suffices\r\n\t\t};\r\n\t\tvarSpecs.push(varSpec);\r\n\t\tvarSpecMap[varName] = varSpec;\r\n\t\tvarNames.push(varName);\r\n\t}\r\n\tvar subFunction = function (valueFunction) {\r\n\t\tvar result = "";\r\n\t\tvar startIndex = 0;\r\n\t\tfor (var i = 0; i < varSpecs.length; i++) {\r\n\t\t\tvar varSpec = varSpecs[i];\r\n\t\t\tvar value = valueFunction(varSpec.name);\r\n\t\t\tif (value === null || value === undefined || (Array.isArray(value) && value.length === 0) || (typeof value === \'object\' && Object.keys(value).length === 0)) {\r\n\t\t\t\tstartIndex++;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (i === startIndex) {\r\n\t\t\t\tresult += prefix;\r\n\t\t\t} else {\r\n\t\t\t\tresult += (separator || ",");\r\n\t\t\t}\r\n\t\t\tif (Array.isArray(value)) {\r\n\t\t\t\tif (showVariables) {\r\n\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t}\r\n\t\t\t\tfor (var j = 0; j < value.length; j++) {\r\n\t\t\t\t\tif (j > 0) {\r\n\t\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? (separator || ",") : ",";\r\n\t\t\t\t\t\tif (varSpec.suffices[\'*\'] && showVariables) {\r\n\t\t\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(value[j]).replace(/!/g, "%21") : notReallyPercentEncode(value[j]);\r\n\t\t\t\t}\r\n\t\t\t} else if (typeof value === "object") {\r\n\t\t\t\tif (showVariables && !varSpec.suffices[\'*\']) {\r\n\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t}\r\n\t\t\t\tvar first = true;\r\n\t\t\t\tfor (var key in value) {\r\n\t\t\t\t\tif (!first) {\r\n\t\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? (separator || ",") : ",";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfirst = false;\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(key).replace(/!/g, "%21") : notReallyPercentEncode(key);\r\n\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? \'=\' : ",";\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(value[key]).replace(/!/g, "%21") : notReallyPercentEncode(value[key]);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (showVariables) {\r\n\t\t\t\t\tresult += varSpec.name;\r\n\t\t\t\t\tif (!trimEmptyString || value !== "") {\r\n\t\t\t\t\t\tresult += "=";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (varSpec.truncate != null) {\r\n\t\t\t\t\tvalue = value.substring(0, varSpec.truncate);\r\n\t\t\t\t}\r\n\t\t\t\tresult += shouldEscape ? encodeURIComponent(value).replace(/!/g, "%21"): notReallyPercentEncode(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t};\r\n\tsubFunction.varNames = varNames;\r\n\treturn {\r\n\t\tprefix: prefix,\r\n\t\tsubstitution: subFunction\r\n\t};\r\n}\r\n\r\nfunction UriTemplate(template) {\r\n\tif (!(this instanceof UriTemplate)) {\r\n\t\treturn new UriTemplate(template);\r\n\t}\r\n\tvar parts = template.split("{");\r\n\tvar textParts = [parts.shift()];\r\n\tvar prefixes = [];\r\n\tvar substitutions = [];\r\n\tvar varNames = [];\r\n\twhile (parts.length > 0) {\r\n\t\tvar part = parts.shift();\r\n\t\tvar spec = part.split("}")[0];\r\n\t\tvar remainder = part.substring(spec.length + 1);\r\n\t\tvar funcs = uriTemplateSubstitution(spec);\r\n\t\tsubstitutions.push(funcs.substitution);\r\n\t\tprefixes.push(funcs.prefix);\r\n\t\ttextParts.push(remainder);\r\n\t\tvarNames = varNames.concat(funcs.substitution.varNames);\r\n\t}\r\n\tthis.fill = function (valueFunction) {\r\n\t\tvar result = textParts[0];\r\n\t\tfor (var i = 0; i < substitutions.length; i++) {\r\n\t\t\tvar substitution = substitutions[i];\r\n\t\t\tresult += substitution(valueFunction);\r\n\t\t\tresult += textParts[i + 1];\r\n\t\t}\r\n\t\treturn result;\r\n\t};\r\n\tthis.varNames = varNames;\r\n\tthis.template = template;\r\n}\r\nUriTemplate.prototype = {\r\n\ttoString: function () {\r\n\t\treturn this.template;\r\n\t},\r\n\tfillFromObject: function (obj) {\r\n\t\treturn this.fill(function (varName) {\r\n\t\t\treturn obj[varName];\r\n\t\t});\r\n\t}\r\n};\r\nvar ValidatorContext = function ValidatorContext(parent, collectMultiple, errorReporter, checkRecursive, trackUnknownProperties) {\r\n\tthis.missing = [];\r\n\tthis.missingMap = {};\r\n\tthis.formatValidators = parent ? Object.create(parent.formatValidators) : {};\r\n\tthis.schemas = parent ? Object.create(parent.schemas) : {};\r\n\tthis.collectMultiple = collectMultiple;\r\n\tthis.errors = [];\r\n\tthis.handleError = collectMultiple ? this.collectError : this.returnError;\r\n\tif (checkRecursive) {\r\n\t\tthis.checkRecursive = true;\r\n\t\tthis.scanned = [];\r\n\t\tthis.scannedFrozen = [];\r\n\t\tthis.scannedFrozenSchemas = [];\r\n\t\tthis.scannedFrozenValidationErrors = [];\r\n\t\tthis.validatedSchemasKey = \'tv4_validation_id\';\r\n\t\tthis.validationErrorsKey = \'tv4_validation_errors_id\';\r\n\t}\r\n\tif (trackUnknownProperties) {\r\n\t\tthis.trackUnknownProperties = true;\r\n\t\tthis.knownPropertyPaths = {};\r\n\t\tthis.unknownPropertyPaths = {};\r\n\t}\r\n\tthis.errorReporter = errorReporter || defaultErrorReporter(\'en\');\r\n\tif (typeof this.errorReporter === \'string\') {\r\n\t\tthrow new Error(\'debug\');\r\n\t}\r\n\tthis.definedKeywords = {};\r\n\tif (parent) {\r\n\t\tfor (var key in parent.definedKeywords) {\r\n\t\t\tthis.definedKeywords[key] = parent.definedKeywords[key].slice(0);\r\n\t\t}\r\n\t}\r\n};\r\nValidatorContext.prototype.defineKeyword = function (keyword, keywordFunction) {\r\n\tthis.definedKeywords[keyword] = this.definedKeywords[keyword] || [];\r\n\tthis.definedKeywords[keyword].push(keywordFunction);\r\n};\r\nValidatorContext.prototype.createError = function (code, messageParams, dataPath, schemaPath, subErrors, data, schema) {\r\n\tvar error = new ValidationError(code, messageParams, dataPath, schemaPath, subErrors);\r\n\terror.message = this.errorReporter(error, data, schema);\r\n\treturn error;\r\n};\r\nValidatorContext.prototype.returnError = function (error) {\r\n\treturn error;\r\n};\r\nValidatorContext.prototype.collectError = function (error) {\r\n\tif (error) {\r\n\t\tthis.errors.push(error);\r\n\t}\r\n\treturn null;\r\n};\r\nValidatorContext.prototype.prefixErrors = function (startIndex, dataPath, schemaPath) {\r\n\tfor (var i = startIndex; i < this.errors.length; i++) {\r\n\t\tthis.errors[i] = this.errors[i].prefixWith(dataPath, schemaPath);\r\n\t}\r\n\treturn this;\r\n};\r\nValidatorContext.prototype.banUnknownProperties = function (data, schema) {\r\n\tfor (var unknownPath in this.unknownPropertyPaths) {\r\n\t\tvar error = this.createError(ErrorCodes.UNKNOWN_PROPERTY, {path: unknownPath}, unknownPath, "", null, data, schema);\r\n\t\tvar result = this.handleError(error);\r\n\t\tif (result) {\r\n\t\t\treturn result;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.addFormat = function (format, validator) {\r\n\tif (typeof format === \'object\') {\r\n\t\tfor (var key in format) {\r\n\t\t\tthis.addFormat(key, format[key]);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\tthis.formatValidators[format] = validator;\r\n};\r\nValidatorContext.prototype.resolveRefs = function (schema, urlHistory) {\r\n\tif (schema[\'$ref\'] !== undefined) {\r\n\t\turlHistory = urlHistory || {};\r\n\t\tif (urlHistory[schema[\'$ref\']]) {\r\n\t\t\treturn this.createError(ErrorCodes.CIRCULAR_REFERENCE, {urls: Object.keys(urlHistory).join(\', \')}, \'\', \'\', null, undefined, schema);\r\n\t\t}\r\n\t\turlHistory[schema[\'$ref\']] = true;\r\n\t\tschema = this.getSchema(schema[\'$ref\'], urlHistory);\r\n\t}\r\n\treturn schema;\r\n};\r\nValidatorContext.prototype.getSchema = function (url, urlHistory) {\r\n\tvar schema;\r\n\tif (this.schemas[url] !== undefined) {\r\n\t\tschema = this.schemas[url];\r\n\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t}\r\n\tvar baseUrl = url;\r\n\tvar fragment = "";\r\n\tif (url.indexOf(\'#\') !== -1) {\r\n\t\tfragment = url.substring(url.indexOf("#") + 1);\r\n\t\tbaseUrl = url.substring(0, url.indexOf("#"));\r\n\t}\r\n\tif (typeof this.schemas[baseUrl] === \'object\') {\r\n\t\tschema = this.schemas[baseUrl];\r\n\t\tvar pointerPath = decodeURIComponent(fragment);\r\n\t\tif (pointerPath === "") {\r\n\t\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t\t} else if (pointerPath.charAt(0) !== "/") {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tvar parts = pointerPath.split("/").slice(1);\r\n\t\tfor (var i = 0; i < parts.length; i++) {\r\n\t\t\tvar component = parts[i].replace(/~1/g, "/").replace(/~0/g, "~");\r\n\t\t\tif (schema[component] === undefined) {\r\n\t\t\t\tschema = undefined;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tschema = schema[component];\r\n\t\t}\r\n\t\tif (schema !== undefined) {\r\n\t\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t\t}\r\n\t}\r\n\tif (this.missing[baseUrl] === undefined) {\r\n\t\tthis.missing.push(baseUrl);\r\n\t\tthis.missing[baseUrl] = baseUrl;\r\n\t\tthis.missingMap[baseUrl] = baseUrl;\r\n\t}\r\n};\r\nValidatorContext.prototype.searchSchemas = function (schema, url) {\r\n\tif (Array.isArray(schema)) {\r\n\t\tfor (var i = 0; i < schema.length; i++) {\r\n\t\t\tthis.searchSchemas(schema[i], url);\r\n\t\t}\r\n\t} else if (schema && typeof schema === "object") {\r\n\t\tif (typeof schema.id === "string") {\r\n\t\t\tif (isTrustedUrl(url, schema.id)) {\r\n\t\t\t\tif (this.schemas[schema.id] === undefined) {\r\n\t\t\t\t\tthis.schemas[schema.id] = schema;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (var key in schema) {\r\n\t\t\tif (key !== "enum") {\r\n\t\t\t\tif (typeof schema[key] === "object") {\r\n\t\t\t\t\tthis.searchSchemas(schema[key], url);\r\n\t\t\t\t} else if (key === "$ref") {\r\n\t\t\t\t\tvar uri = getDocumentUri(schema[key]);\r\n\t\t\t\t\tif (uri && this.schemas[uri] === undefined && this.missingMap[uri] === undefined) {\r\n\t\t\t\t\t\tthis.missingMap[uri] = uri;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\nValidatorContext.prototype.addSchema = function (url, schema) {\r\n\t//overload\r\n\tif (typeof url !== \'string\' || typeof schema === \'undefined\') {\r\n\t\tif (typeof url === \'object\' && typeof url.id === \'string\') {\r\n\t\t\tschema = url;\r\n\t\t\turl = schema.id;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\tif (url === getDocumentUri(url) + "#") {\r\n\t\t// Remove empty fragment\r\n\t\turl = getDocumentUri(url);\r\n\t}\r\n\tthis.schemas[url] = schema;\r\n\tdelete this.missingMap[url];\r\n\tnormSchema(schema, url);\r\n\tthis.searchSchemas(schema, url);\r\n};\r\n\r\nValidatorContext.prototype.getSchemaMap = function () {\r\n\tvar map = {};\r\n\tfor (var key in this.schemas) {\r\n\t\tmap[key] = this.schemas[key];\r\n\t}\r\n\treturn map;\r\n};\r\n\r\nValidatorContext.prototype.getSchemaUris = function (filterRegExp) {\r\n\tvar list = [];\r\n\tfor (var key in this.schemas) {\r\n\t\tif (!filterRegExp || filterRegExp.test(key)) {\r\n\t\t\tlist.push(key);\r\n\t\t}\r\n\t}\r\n\treturn list;\r\n};\r\n\r\nValidatorContext.prototype.getMissingUris = function (filterRegExp) {\r\n\tvar list = [];\r\n\tfor (var key in this.missingMap) {\r\n\t\tif (!filterRegExp || filterRegExp.test(key)) {\r\n\t\t\tlist.push(key);\r\n\t\t}\r\n\t}\r\n\treturn list;\r\n};\r\n\r\nValidatorContext.prototype.dropSchemas = function () {\r\n\tthis.schemas = {};\r\n\tthis.reset();\r\n};\r\nValidatorContext.prototype.reset = function () {\r\n\tthis.missing = [];\r\n\tthis.missingMap = {};\r\n\tthis.errors = [];\r\n};\r\n\r\nValidatorContext.prototype.validateAll = function (data, schema, dataPathParts, schemaPathParts, dataPointerPath) {\r\n\tvar topLevel;\r\n\tschema = this.resolveRefs(schema);\r\n\tif (!schema) {\r\n\t\treturn null;\r\n\t} else if (schema instanceof ValidationError) {\r\n\t\tthis.errors.push(schema);\r\n\t\treturn schema;\r\n\t}\r\n\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar frozenIndex, scannedFrozenSchemaIndex = null, scannedSchemasIndex = null;\r\n\tif (this.checkRecursive && data && typeof data === \'object\') {\r\n\t\ttopLevel = !this.scanned.length;\r\n\t\tif (data[this.validatedSchemasKey]) {\r\n\t\t\tvar schemaIndex = data[this.validatedSchemasKey].indexOf(schema);\r\n\t\t\tif (schemaIndex !== -1) {\r\n\t\t\t\tthis.errors = this.errors.concat(data[this.validationErrorsKey][schemaIndex]);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (Object.isFrozen(data)) {\r\n\t\t\tfrozenIndex = this.scannedFrozen.indexOf(data);\r\n\t\t\tif (frozenIndex !== -1) {\r\n\t\t\t\tvar frozenSchemaIndex = this.scannedFrozenSchemas[frozenIndex].indexOf(schema);\r\n\t\t\t\tif (frozenSchemaIndex !== -1) {\r\n\t\t\t\t\tthis.errors = this.errors.concat(this.scannedFrozenValidationErrors[frozenIndex][frozenSchemaIndex]);\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.scanned.push(data);\r\n\t\tif (Object.isFrozen(data)) {\r\n\t\t\tif (frozenIndex === -1) {\r\n\t\t\t\tfrozenIndex = this.scannedFrozen.length;\r\n\t\t\t\tthis.scannedFrozen.push(data);\r\n\t\t\t\tthis.scannedFrozenSchemas.push([]);\r\n\t\t\t}\r\n\t\t\tscannedFrozenSchemaIndex = this.scannedFrozenSchemas[frozenIndex].length;\r\n\t\t\tthis.scannedFrozenSchemas[frozenIndex][scannedFrozenSchemaIndex] = schema;\r\n\t\t\tthis.scannedFrozenValidationErrors[frozenIndex][scannedFrozenSchemaIndex] = [];\r\n\t\t} else {\r\n\t\t\tif (!data[this.validatedSchemasKey]) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tObject.defineProperty(data, this.validatedSchemasKey, {\r\n\t\t\t\t\t\tvalue: [],\r\n\t\t\t\t\t\tconfigurable: true\r\n\t\t\t\t\t});\r\n\t\t\t\t\tObject.defineProperty(data, this.validationErrorsKey, {\r\n\t\t\t\t\t\tvalue: [],\r\n\t\t\t\t\t\tconfigurable: true\r\n\t\t\t\t\t});\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\t//IE 7/8 workaround\r\n\t\t\t\t\tdata[this.validatedSchemasKey] = [];\r\n\t\t\t\t\tdata[this.validationErrorsKey] = [];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tscannedSchemasIndex = data[this.validatedSchemasKey].length;\r\n\t\t\tdata[this.validatedSchemasKey][scannedSchemasIndex] = schema;\r\n\t\t\tdata[this.validationErrorsKey][scannedSchemasIndex] = [];\r\n\t\t}\r\n\t}\r\n\r\n\tvar errorCount = this.errors.length;\r\n\tvar error = this.validateBasic(data, schema, dataPointerPath)\r\n\t\t|| this.validateNumeric(data, schema, dataPointerPath)\r\n\t\t|| this.validateString(data, schema, dataPointerPath)\r\n\t\t|| this.validateArray(data, schema, dataPointerPath)\r\n\t\t|| this.validateObject(data, schema, dataPointerPath)\r\n\t\t|| this.validateCombinations(data, schema, dataPointerPath)\r\n\t\t|| this.validateHypermedia(data, schema, dataPointerPath)\r\n\t\t|| this.validateFormat(data, schema, dataPointerPath)\r\n\t\t|| this.validateDefinedKeywords(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n\r\n\tif (topLevel) {\r\n\t\twhile (this.scanned.length) {\r\n\t\t\tvar item = this.scanned.pop();\r\n\t\t\tdelete item[this.validatedSchemasKey];\r\n\t\t}\r\n\t\tthis.scannedFrozen = [];\r\n\t\tthis.scannedFrozenSchemas = [];\r\n\t}\r\n\r\n\tif (error || errorCount !== this.errors.length) {\r\n\t\twhile ((dataPathParts && dataPathParts.length) || (schemaPathParts && schemaPathParts.length)) {\r\n\t\t\tvar dataPart = (dataPathParts && dataPathParts.length) ? "" + dataPathParts.pop() : null;\r\n\t\t\tvar schemaPart = (schemaPathParts && schemaPathParts.length) ? "" + schemaPathParts.pop() : null;\r\n\t\t\tif (error) {\r\n\t\t\t\terror = error.prefixWith(dataPart, schemaPart);\r\n\t\t\t}\r\n\t\t\tthis.prefixErrors(errorCount, dataPart, schemaPart);\r\n\t\t}\r\n\t}\r\n\r\n\tif (scannedFrozenSchemaIndex !== null) {\r\n\t\tthis.scannedFrozenValidationErrors[frozenIndex][scannedFrozenSchemaIndex] = this.errors.slice(startErrorCount);\r\n\t} else if (scannedSchemasIndex !== null) {\r\n\t\tdata[this.validationErrorsKey][scannedSchemasIndex] = this.errors.slice(startErrorCount);\r\n\t}\r\n\r\n\treturn this.handleError(error);\r\n};\r\nValidatorContext.prototype.validateFormat = function (data, schema) {\r\n\tif (typeof schema.format !== \'string\' || !this.formatValidators[schema.format]) {\r\n\t\treturn null;\r\n\t}\r\n\tvar errorMessage = this.formatValidators[schema.format].call(null, data, schema);\r\n\tif (typeof errorMessage === \'string\' || typeof errorMessage === \'number\') {\r\n\t\treturn this.createError(ErrorCodes.FORMAT_CUSTOM, {message: errorMessage}, \'\', \'/format\', null, data, schema);\r\n\t} else if (errorMessage && typeof errorMessage === \'object\') {\r\n\t\treturn this.createError(ErrorCodes.FORMAT_CUSTOM, {message: errorMessage.message || "?"}, errorMessage.dataPath || \'\', errorMessage.schemaPath || "/format", null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\nValidatorContext.prototype.validateDefinedKeywords = function (data, schema, dataPointerPath) {\r\n\tfor (var key in this.definedKeywords) {\r\n\t\tif (typeof schema[key] === \'undefined\') {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tvar validationFunctions = this.definedKeywords[key];\r\n\t\tfor (var i = 0; i < validationFunctions.length; i++) {\r\n\t\t\tvar func = validationFunctions[i];\r\n\t\t\tvar result = func(data, schema[key], schema, dataPointerPath);\r\n\t\t\tif (typeof result === \'string\' || typeof result === \'number\') {\r\n\t\t\t\treturn this.createError(ErrorCodes.KEYWORD_CUSTOM, {key: key, message: result}, \'\', \'\', null, data, schema).prefixWith(null, key);\r\n\t\t\t} else if (result && typeof result === \'object\') {\r\n\t\t\t\tvar code = result.code;\r\n\t\t\t\tif (typeof code === \'string\') {\r\n\t\t\t\t\tif (!ErrorCodes[code]) {\r\n\t\t\t\t\t\tthrow new Error(\'Undefined error code (use defineError): \' + code);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcode = ErrorCodes[code];\r\n\t\t\t\t} else if (typeof code !== \'number\') {\r\n\t\t\t\t\tcode = ErrorCodes.KEYWORD_CUSTOM;\r\n\t\t\t\t}\r\n\t\t\t\tvar messageParams = (typeof result.message === \'object\') ? result.message : {key: key, message: result.message || "?"};\r\n\t\t\t\tvar schemaPath = result.schemaPath || ("/" + key.replace(/~/g, \'~0\').replace(/\\//g, \'~1\'));\r\n\t\t\t\treturn this.createError(code, messageParams, result.dataPath || null, schemaPath, null, data, schema);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nfunction recursiveCompare(A, B) {\r\n\tif (A === B) {\r\n\t\treturn true;\r\n\t}\r\n\tif (A && B && typeof A === "object" && typeof B === "object") {\r\n\t\tif (Array.isArray(A) !== Array.isArray(B)) {\r\n\t\t\treturn false;\r\n\t\t} else if (Array.isArray(A)) {\r\n\t\t\tif (A.length !== B.length) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor (var i = 0; i < A.length; i++) {\r\n\t\t\t\tif (!recursiveCompare(A[i], B[i])) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvar key;\r\n\t\t\tfor (key in A) {\r\n\t\t\t\tif (B[key] === undefined && A[key] !== undefined) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (key in B) {\r\n\t\t\t\tif (A[key] === undefined && B[key] !== undefined) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (key in A) {\r\n\t\t\t\tif (!recursiveCompare(A[key], B[key])) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nValidatorContext.prototype.validateBasic = function validateBasic(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tif (error = this.validateType(data, schema, dataPointerPath)) {\r\n\t\treturn error.prefixWith(null, "type");\r\n\t}\r\n\tif (error = this.validateEnum(data, schema, dataPointerPath)) {\r\n\t\treturn error.prefixWith(null, "type");\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateType = function validateType(data, schema) {\r\n\tif (schema.type === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar dataType = typeof data;\r\n\tif (data === null) {\r\n\t\tdataType = "null";\r\n\t} else if (Array.isArray(data)) {\r\n\t\tdataType = "array";\r\n\t}\r\n\tvar allowedTypes = schema.type;\r\n\tif (!Array.isArray(allowedTypes)) {\r\n\t\tallowedTypes = [allowedTypes];\r\n\t}\r\n\r\n\tfor (var i = 0; i < allowedTypes.length; i++) {\r\n\t\tvar type = allowedTypes[i];\r\n\t\tif (type === dataType || (type === "integer" && dataType === "number" && (data % 1 === 0))) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\treturn this.createError(ErrorCodes.INVALID_TYPE, {type: dataType, expected: allowedTypes.join("/")}, \'\', \'\', null, data, schema);\r\n};\r\n\r\nValidatorContext.prototype.validateEnum = function validateEnum(data, schema) {\r\n\tif (schema["enum"] === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tfor (var i = 0; i < schema["enum"].length; i++) {\r\n\t\tvar enumVal = schema["enum"][i];\r\n\t\tif (recursiveCompare(data, enumVal)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\treturn this.createError(ErrorCodes.ENUM_MISMATCH, {value: (typeof JSON !== \'undefined\') ? JSON.stringify(data) : data}, \'\', \'\', null, data, schema);\r\n};\r\n\r\nValidatorContext.prototype.validateNumeric = function validateNumeric(data, schema, dataPointerPath) {\r\n\treturn this.validateMultipleOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateMinMax(data, schema, dataPointerPath)\r\n\t\t|| this.validateNaN(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nvar CLOSE_ENOUGH_LOW = Math.pow(2, -51);\r\nvar CLOSE_ENOUGH_HIGH = 1 - CLOSE_ENOUGH_LOW;\r\nValidatorContext.prototype.validateMultipleOf = function validateMultipleOf(data, schema) {\r\n\tvar multipleOf = schema.multipleOf || schema.divisibleBy;\r\n\tif (multipleOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tif (typeof data === "number") {\r\n\t\tvar remainder = (data/multipleOf)%1;\r\n\t\tif (remainder >= CLOSE_ENOUGH_LOW && remainder < CLOSE_ENOUGH_HIGH) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MULTIPLE_OF, {value: data, multipleOf: multipleOf}, \'\', \'\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateMinMax = function validateMinMax(data, schema) {\r\n\tif (typeof data !== "number") {\r\n\t\treturn null;\r\n\t}\r\n\tif (schema.minimum !== undefined) {\r\n\t\tif (data < schema.minimum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MINIMUM, {value: data, minimum: schema.minimum}, \'\', \'/minimum\', null, data, schema);\r\n\t\t}\r\n\t\tif (schema.exclusiveMinimum && data === schema.minimum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MINIMUM_EXCLUSIVE, {value: data, minimum: schema.minimum}, \'\', \'/exclusiveMinimum\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\tif (schema.maximum !== undefined) {\r\n\t\tif (data > schema.maximum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MAXIMUM, {value: data, maximum: schema.maximum}, \'\', \'/maximum\', null, data, schema);\r\n\t\t}\r\n\t\tif (schema.exclusiveMaximum && data === schema.maximum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MAXIMUM_EXCLUSIVE, {value: data, maximum: schema.maximum}, \'\', \'/exclusiveMaximum\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateNaN = function validateNaN(data, schema) {\r\n\tif (typeof data !== "number") {\r\n\t\treturn null;\r\n\t}\r\n\tif (isNaN(data) === true || data === Infinity || data === -Infinity) {\r\n\t\treturn this.createError(ErrorCodes.NUMBER_NOT_A_NUMBER, {value: data}, \'\', \'/type\', null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateString = function validateString(data, schema, dataPointerPath) {\r\n\treturn this.validateStringLength(data, schema, dataPointerPath)\r\n\t\t|| this.validateStringPattern(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateStringLength = function validateStringLength(data, schema) {\r\n\tif (typeof data !== "string") {\r\n\t\treturn null;\r\n\t}\r\n\tif (schema.minLength !== undefined) {\r\n\t\tif (data.length < schema.minLength) {\r\n\t\t\treturn this.createError(ErrorCodes.STRING_LENGTH_SHORT, {length: data.length, minimum: schema.minLength}, \'\', \'/minLength\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\tif (schema.maxLength !== undefined) {\r\n\t\tif (data.length > schema.maxLength) {\r\n\t\t\treturn this.createError(ErrorCodes.STRING_LENGTH_LONG, {length: data.length, maximum: schema.maxLength}, \'\', \'/maxLength\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateStringPattern = function validateStringPattern(data, schema) {\r\n\tif (typeof data !== "string" || (typeof schema.pattern !== "string" && !(schema.pattern instanceof RegExp))) {\r\n\t\treturn null;\r\n\t}\r\n\tvar regexp;\r\n\tif (schema.pattern instanceof RegExp) {\r\n\t regexp = schema.pattern;\r\n\t}\r\n\telse {\r\n\t var body, flags = \'\';\r\n\t // Check for regular expression literals\r\n\t // @see http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.5\r\n\t var literal = schema.pattern.match(/^\\/(.+)\\/([img]*)$/);\r\n\t if (literal) {\r\n\t body = literal[1];\r\n\t flags = literal[2];\r\n\t }\r\n\t else {\r\n\t body = schema.pattern;\r\n\t }\r\n\t regexp = new RegExp(body, flags);\r\n\t}\r\n\tif (!regexp.test(data)) {\r\n\t\treturn this.createError(ErrorCodes.STRING_PATTERN, {pattern: schema.pattern}, \'\', \'/pattern\', null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArray = function validateArray(data, schema, dataPointerPath) {\r\n\tif (!Array.isArray(data)) {\r\n\t\treturn null;\r\n\t}\r\n\treturn this.validateArrayLength(data, schema, dataPointerPath)\r\n\t\t|| this.validateArrayUniqueItems(data, schema, dataPointerPath)\r\n\t\t|| this.validateArrayItems(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayLength = function validateArrayLength(data, schema) {\r\n\tvar error;\r\n\tif (schema.minItems !== undefined) {\r\n\t\tif (data.length < schema.minItems) {\r\n\t\t\terror = this.createError(ErrorCodes.ARRAY_LENGTH_SHORT, {length: data.length, minimum: schema.minItems}, \'\', \'/minItems\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (schema.maxItems !== undefined) {\r\n\t\tif (data.length > schema.maxItems) {\r\n\t\t\terror = this.createError(ErrorCodes.ARRAY_LENGTH_LONG, {length: data.length, maximum: schema.maxItems}, \'\', \'/maxItems\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayUniqueItems = function validateArrayUniqueItems(data, schema) {\r\n\tif (schema.uniqueItems) {\r\n\t\tfor (var i = 0; i < data.length; i++) {\r\n\t\t\tfor (var j = i + 1; j < data.length; j++) {\r\n\t\t\t\tif (recursiveCompare(data[i], data[j])) {\r\n\t\t\t\t\tvar error = this.createError(ErrorCodes.ARRAY_UNIQUE, {match1: i, match2: j}, \'\', \'/uniqueItems\', null, data, schema);\r\n\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayItems = function validateArrayItems(data, schema, dataPointerPath) {\r\n\tif (schema.items === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error, i;\r\n\tif (Array.isArray(schema.items)) {\r\n\t\tfor (i = 0; i < data.length; i++) {\r\n\t\t\tif (i < schema.items.length) {\r\n\t\t\t\tif (error = this.validateAll(data[i], schema.items[i], [i], ["items", i], dataPointerPath + "/" + i)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t} else if (schema.additionalItems !== undefined) {\r\n\t\t\t\tif (typeof schema.additionalItems === "boolean") {\r\n\t\t\t\t\tif (!schema.additionalItems) {\r\n\t\t\t\t\t\terror = (this.createError(ErrorCodes.ARRAY_ADDITIONAL_ITEMS, {}, \'/\' + i, \'/additionalItems\', null, data, schema));\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (error = this.validateAll(data[i], schema.additionalItems, [i], ["additionalItems"], dataPointerPath + "/" + i)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tfor (i = 0; i < data.length; i++) {\r\n\t\t\tif (error = this.validateAll(data[i], schema.items, [i], ["items"], dataPointerPath + "/" + i)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObject = function validateObject(data, schema, dataPointerPath) {\r\n\tif (typeof data !== "object" || data === null || Array.isArray(data)) {\r\n\t\treturn null;\r\n\t}\r\n\treturn this.validateObjectMinMaxProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectRequiredProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectDependencies(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectMinMaxProperties = function validateObjectMinMaxProperties(data, schema) {\r\n\tvar keys = Object.keys(data);\r\n\tvar error;\r\n\tif (schema.minProperties !== undefined) {\r\n\t\tif (keys.length < schema.minProperties) {\r\n\t\t\terror = this.createError(ErrorCodes.OBJECT_PROPERTIES_MINIMUM, {propertyCount: keys.length, minimum: schema.minProperties}, \'\', \'/minProperties\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (schema.maxProperties !== undefined) {\r\n\t\tif (keys.length > schema.maxProperties) {\r\n\t\t\terror = this.createError(ErrorCodes.OBJECT_PROPERTIES_MAXIMUM, {propertyCount: keys.length, maximum: schema.maxProperties}, \'\', \'/maxProperties\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectRequiredProperties = function validateObjectRequiredProperties(data, schema) {\r\n\tif (schema.required !== undefined) {\r\n\t\tfor (var i = 0; i < schema.required.length; i++) {\r\n\t\t\tvar key = schema.required[i];\r\n\t\t\tif (data[key] === undefined) {\r\n\t\t\t\tvar error = this.createError(ErrorCodes.OBJECT_REQUIRED, {key: key}, \'\', \'/required/\' + i, null, data, schema);\r\n\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectProperties = function validateObjectProperties(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tfor (var key in data) {\r\n\t\tvar keyPointerPath = dataPointerPath + "/" + key.replace(/~/g, \'~0\').replace(/\\//g, \'~1\');\r\n\t\tvar foundMatch = false;\r\n\t\tif (schema.properties !== undefined && schema.properties[key] !== undefined) {\r\n\t\t\tfoundMatch = true;\r\n\t\t\tif (error = this.validateAll(data[key], schema.properties[key], [key], ["properties", key], keyPointerPath)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (schema.patternProperties !== undefined) {\r\n\t\t\tfor (var patternKey in schema.patternProperties) {\r\n\t\t\t\tvar regexp = new RegExp(patternKey);\r\n\t\t\t\tif (regexp.test(key)) {\r\n\t\t\t\t\tfoundMatch = true;\r\n\t\t\t\t\tif (error = this.validateAll(data[key], schema.patternProperties[patternKey], [key], ["patternProperties", patternKey], keyPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!foundMatch) {\r\n\t\t\tif (schema.additionalProperties !== undefined) {\r\n\t\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\t\tthis.knownPropertyPaths[keyPointerPath] = true;\r\n\t\t\t\t\tdelete this.unknownPropertyPaths[keyPointerPath];\r\n\t\t\t\t}\r\n\t\t\t\tif (typeof schema.additionalProperties === "boolean") {\r\n\t\t\t\t\tif (!schema.additionalProperties) {\r\n\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_ADDITIONAL_PROPERTIES, {key: key}, \'\', \'/additionalProperties\', null, data, schema).prefixWith(key, null);\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (error = this.validateAll(data[key], schema.additionalProperties, [key], ["additionalProperties"], keyPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (this.trackUnknownProperties && !this.knownPropertyPaths[keyPointerPath]) {\r\n\t\t\t\tthis.unknownPropertyPaths[keyPointerPath] = true;\r\n\t\t\t}\r\n\t\t} else if (this.trackUnknownProperties) {\r\n\t\t\tthis.knownPropertyPaths[keyPointerPath] = true;\r\n\t\t\tdelete this.unknownPropertyPaths[keyPointerPath];\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectDependencies = function validateObjectDependencies(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tif (schema.dependencies !== undefined) {\r\n\t\tfor (var depKey in schema.dependencies) {\r\n\t\t\tif (data[depKey] !== undefined) {\r\n\t\t\t\tvar dep = schema.dependencies[depKey];\r\n\t\t\t\tif (typeof dep === "string") {\r\n\t\t\t\t\tif (data[dep] === undefined) {\r\n\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_DEPENDENCY_KEY, {key: depKey, missing: dep}, \'\', \'\', null, data, schema).prefixWith(null, depKey).prefixWith(null, "dependencies");\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (Array.isArray(dep)) {\r\n\t\t\t\t\tfor (var i = 0; i < dep.length; i++) {\r\n\t\t\t\t\t\tvar requiredKey = dep[i];\r\n\t\t\t\t\t\tif (data[requiredKey] === undefined) {\r\n\t\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_DEPENDENCY_KEY, {key: depKey, missing: requiredKey}, \'\', \'/\' + i, null, data, schema).prefixWith(null, depKey).prefixWith(null, "dependencies");\r\n\t\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (error = this.validateAll(data, dep, [], ["dependencies", depKey], dataPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateCombinations = function validateCombinations(data, schema, dataPointerPath) {\r\n\treturn this.validateAllOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateAnyOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateOneOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateNot(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateAllOf = function validateAllOf(data, schema, dataPointerPath) {\r\n\tif (schema.allOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error;\r\n\tfor (var i = 0; i < schema.allOf.length; i++) {\r\n\t\tvar subSchema = schema.allOf[i];\r\n\t\tif (error = this.validateAll(data, subSchema, [], ["allOf", i], dataPointerPath)) {\r\n\t\t\treturn error;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateAnyOf = function validateAnyOf(data, schema, dataPointerPath) {\r\n\tif (schema.anyOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar errors = [];\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t}\r\n\tvar errorAtEnd = true;\r\n\tfor (var i = 0; i < schema.anyOf.length; i++) {\r\n\t\tif (this.trackUnknownProperties) {\r\n\t\t\tthis.unknownPropertyPaths = {};\r\n\t\t\tthis.knownPropertyPaths = {};\r\n\t\t}\r\n\t\tvar subSchema = schema.anyOf[i];\r\n\r\n\t\tvar errorCount = this.errors.length;\r\n\t\tvar error = this.validateAll(data, subSchema, [], ["anyOf", i], dataPointerPath);\r\n\r\n\t\tif (error === null && errorCount === this.errors.length) {\r\n\t\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\r\n\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\tfor (var knownKey in this.knownPropertyPaths) {\r\n\t\t\t\t\toldKnownPropertyPaths[knownKey] = true;\r\n\t\t\t\t\tdelete oldUnknownPropertyPaths[knownKey];\r\n\t\t\t\t}\r\n\t\t\t\tfor (var unknownKey in this.unknownPropertyPaths) {\r\n\t\t\t\t\tif (!oldKnownPropertyPaths[unknownKey]) {\r\n\t\t\t\t\t\toldUnknownPropertyPaths[unknownKey] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// We need to continue looping so we catch all the property definitions, but we don\'t want to return an error\r\n\t\t\t\terrorAtEnd = false;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tif (error) {\r\n\t\t\terrors.push(error.prefixWith(null, "" + i).prefixWith(null, "anyOf"));\r\n\t\t}\r\n\t}\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (errorAtEnd) {\r\n\t\terrors = errors.concat(this.errors.slice(startErrorCount));\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\treturn this.createError(ErrorCodes.ANY_OF_MISSING, {}, "", "/anyOf", errors, data, schema);\r\n\t}\r\n};\r\n\r\nValidatorContext.prototype.validateOneOf = function validateOneOf(data, schema, dataPointerPath) {\r\n\tif (schema.oneOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar validIndex = null;\r\n\tvar errors = [];\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t}\r\n\tfor (var i = 0; i < schema.oneOf.length; i++) {\r\n\t\tif (this.trackUnknownProperties) {\r\n\t\t\tthis.unknownPropertyPaths = {};\r\n\t\t\tthis.knownPropertyPaths = {};\r\n\t\t}\r\n\t\tvar subSchema = schema.oneOf[i];\r\n\r\n\t\tvar errorCount = this.errors.length;\r\n\t\tvar error = this.validateAll(data, subSchema, [], ["oneOf", i], dataPointerPath);\r\n\r\n\t\tif (error === null && errorCount === this.errors.length) {\r\n\t\t\tif (validIndex === null) {\r\n\t\t\t\tvalidIndex = i;\r\n\t\t\t} else {\r\n\t\t\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\t\t\treturn this.createError(ErrorCodes.ONE_OF_MULTIPLE, {index1: validIndex, index2: i}, "", "/oneOf", null, data, schema);\r\n\t\t\t}\r\n\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\tfor (var knownKey in this.knownPropertyPaths) {\r\n\t\t\t\t\toldKnownPropertyPaths[knownKey] = true;\r\n\t\t\t\t\tdelete oldUnknownPropertyPaths[knownKey];\r\n\t\t\t\t}\r\n\t\t\t\tfor (var unknownKey in this.unknownPropertyPaths) {\r\n\t\t\t\t\tif (!oldKnownPropertyPaths[unknownKey]) {\r\n\t\t\t\t\t\toldUnknownPropertyPaths[unknownKey] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (error) {\r\n\t\t\terrors.push(error);\r\n\t\t}\r\n\t}\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (validIndex === null) {\r\n\t\terrors = errors.concat(this.errors.slice(startErrorCount));\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\treturn this.createError(ErrorCodes.ONE_OF_MISSING, {}, "", "/oneOf", errors, data, schema);\r\n\t} else {\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateNot = function validateNot(data, schema, dataPointerPath) {\r\n\tif (schema.not === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar oldErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t\tthis.unknownPropertyPaths = {};\r\n\t\tthis.knownPropertyPaths = {};\r\n\t}\r\n\tvar error = this.validateAll(data, schema.not, null, null, dataPointerPath);\r\n\tvar notErrors = this.errors.slice(oldErrorCount);\r\n\tthis.errors = this.errors.slice(0, oldErrorCount);\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (error === null && notErrors.length === 0) {\r\n\t\treturn this.createError(ErrorCodes.NOT_PASSED, {}, "", "/not", null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateHypermedia = function validateCombinations(data, schema, dataPointerPath) {\r\n\tif (!schema.links) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error;\r\n\tfor (var i = 0; i < schema.links.length; i++) {\r\n\t\tvar ldo = schema.links[i];\r\n\t\tif (ldo.rel === "describedby") {\r\n\t\t\tvar template = new UriTemplate(ldo.href);\r\n\t\t\tvar allPresent = true;\r\n\t\t\tfor (var j = 0; j < template.varNames.length; j++) {\r\n\t\t\t\tif (!(template.varNames[j] in data)) {\r\n\t\t\t\t\tallPresent = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (allPresent) {\r\n\t\t\t\tvar schemaUrl = template.fillFromObject(data);\r\n\t\t\t\tvar subSchema = {"$ref": schemaUrl};\r\n\t\t\t\tif (error = this.validateAll(data, subSchema, [], ["links", i], dataPointerPath)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// parseURI() and resolveUrl() are from https://gist.github.com/1088850\r\n// - released as public domain by author ("Yaffle") - see comments on gist\r\n\r\nfunction parseURI(url) {\r\n\tvar m = String(url).replace(/^\\s+|\\s+$/g, \'\').match(/^([^:\\/?#]+:)?(\\/\\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\\/?#]*)(?::(\\d*))?))?([^?#]*)(\\?[^#]*)?(#[\\s\\S]*)?/);\r\n\t// authority = \'//\' + user + \':\' + pass \'@\' + hostname + \':\' port\r\n\treturn (m ? {\r\n\t\thref : m[0] || \'\',\r\n\t\tprotocol : m[1] || \'\',\r\n\t\tauthority: m[2] || \'\',\r\n\t\thost : m[3] || \'\',\r\n\t\thostname : m[4] || \'\',\r\n\t\tport : m[5] || \'\',\r\n\t\tpathname : m[6] || \'\',\r\n\t\tsearch : m[7] || \'\',\r\n\t\thash : m[8] || \'\'\r\n\t} : null);\r\n}\r\n\r\nfunction resolveUrl(base, href) {// RFC 3986\r\n\r\n\tfunction removeDotSegments(input) {\r\n\t\tvar output = [];\r\n\t\tinput.replace(/^(\\.\\.?(\\/|$))+/, \'\')\r\n\t\t\t.replace(/\\/(\\.(\\/|$))+/g, \'/\')\r\n\t\t\t.replace(/\\/\\.\\.$/, \'/../\')\r\n\t\t\t.replace(/\\/?[^\\/]*/g, function (p) {\r\n\t\t\t\tif (p === \'/..\') {\r\n\t\t\t\t\toutput.pop();\r\n\t\t\t\t} else {\r\n\t\t\t\t\toutput.push(p);\r\n\t\t\t\t}\r\n\t\t});\r\n\t\treturn output.join(\'\').replace(/^\\//, input.charAt(0) === \'/\' ? \'/\' : \'\');\r\n\t}\r\n\r\n\thref = parseURI(href || \'\');\r\n\tbase = parseURI(base || \'\');\r\n\r\n\treturn !href || !base ? null : (href.protocol || base.protocol) +\r\n\t\t(href.protocol || href.authority ? href.authority : base.authority) +\r\n\t\tremoveDotSegments(href.protocol || href.authority || href.pathname.charAt(0) === \'/\' ? href.pathname : (href.pathname ? ((base.authority && !base.pathname ? \'/\' : \'\') + base.pathname.slice(0, base.pathname.lastIndexOf(\'/\') + 1) + href.pathname) : base.pathname)) +\r\n\t\t(href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) +\r\n\t\thref.hash;\r\n}\r\n\r\nfunction getDocumentUri(uri) {\r\n\treturn uri.split(\'#\')[0];\r\n}\r\nfunction normSchema(schema, baseUri) {\r\n\tif (schema && typeof schema === "object") {\r\n\t\tif (baseUri === undefined) {\r\n\t\t\tbaseUri = schema.id;\r\n\t\t} else if (typeof schema.id === "string") {\r\n\t\t\tbaseUri = resolveUrl(baseUri, schema.id);\r\n\t\t\tschema.id = baseUri;\r\n\t\t}\r\n\t\tif (Array.isArray(schema)) {\r\n\t\t\tfor (var i = 0; i < schema.length; i++) {\r\n\t\t\t\tnormSchema(schema[i], baseUri);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (typeof schema[\'$ref\'] === "string") {\r\n\t\t\t\tschema[\'$ref\'] = resolveUrl(baseUri, schema[\'$ref\']);\r\n\t\t\t}\r\n\t\t\tfor (var key in schema) {\r\n\t\t\t\tif (key !== "enum") {\r\n\t\t\t\t\tnormSchema(schema[key], baseUri);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction defaultErrorReporter(language) {\r\n\tlanguage = language || \'en\';\r\n\r\n\tvar errorMessages = languages[language];\r\n\r\n\treturn function (error) {\r\n\t\tvar messageTemplate = errorMessages[error.code] || ErrorMessagesDefault[error.code];\r\n\t\tif (typeof messageTemplate !== \'string\') {\r\n\t\t\treturn "Unknown error code " + error.code + ": " + JSON.stringify(error.messageParams);\r\n\t\t}\r\n\t\tvar messageParams = error.params;\r\n\t\t// Adapted from Crockford\'s supplant()\r\n\t\treturn messageTemplate.replace(/\\{([^{}]*)\\}/g, function (whole, varName) {\r\n\t\t\tvar subValue = messageParams[varName];\r\n\t\t\treturn typeof subValue === \'string\' || typeof subValue === \'number\' ? subValue : whole;\r\n\t\t});\r\n\t};\r\n}\r\n\r\nvar ErrorCodes = {\r\n\tINVALID_TYPE: 0,\r\n\tENUM_MISMATCH: 1,\r\n\tANY_OF_MISSING: 10,\r\n\tONE_OF_MISSING: 11,\r\n\tONE_OF_MULTIPLE: 12,\r\n\tNOT_PASSED: 13,\r\n\t// Numeric errors\r\n\tNUMBER_MULTIPLE_OF: 100,\r\n\tNUMBER_MINIMUM: 101,\r\n\tNUMBER_MINIMUM_EXCLUSIVE: 102,\r\n\tNUMBER_MAXIMUM: 103,\r\n\tNUMBER_MAXIMUM_EXCLUSIVE: 104,\r\n\tNUMBER_NOT_A_NUMBER: 105,\r\n\t// String errors\r\n\tSTRING_LENGTH_SHORT: 200,\r\n\tSTRING_LENGTH_LONG: 201,\r\n\tSTRING_PATTERN: 202,\r\n\t// Object errors\r\n\tOBJECT_PROPERTIES_MINIMUM: 300,\r\n\tOBJECT_PROPERTIES_MAXIMUM: 301,\r\n\tOBJECT_REQUIRED: 302,\r\n\tOBJECT_ADDITIONAL_PROPERTIES: 303,\r\n\tOBJECT_DEPENDENCY_KEY: 304,\r\n\t// Array errors\r\n\tARRAY_LENGTH_SHORT: 400,\r\n\tARRAY_LENGTH_LONG: 401,\r\n\tARRAY_UNIQUE: 402,\r\n\tARRAY_ADDITIONAL_ITEMS: 403,\r\n\t// Custom/user-defined errors\r\n\tFORMAT_CUSTOM: 500,\r\n\tKEYWORD_CUSTOM: 501,\r\n\t// Schema structure\r\n\tCIRCULAR_REFERENCE: 600,\r\n\t// Non-standard validation options\r\n\tUNKNOWN_PROPERTY: 1000\r\n};\r\nvar ErrorCodeLookup = {};\r\nfor (var key in ErrorCodes) {\r\n\tErrorCodeLookup[ErrorCodes[key]] = key;\r\n}\r\nvar ErrorMessagesDefault = {\r\n\tINVALID_TYPE: "Invalid type: {type} (expected {expected})",\r\n\tENUM_MISMATCH: "No enum match for: {value}",\r\n\tANY_OF_MISSING: "Data does not match any schemas from \\"anyOf\\"",\r\n\tONE_OF_MISSING: "Data does not match any schemas from \\"oneOf\\"",\r\n\tONE_OF_MULTIPLE: "Data is valid against more than one schema from \\"oneOf\\": indices {index1} and {index2}",\r\n\tNOT_PASSED: "Data matches schema from \\"not\\"",\r\n\t// Numeric errors\r\n\tNUMBER_MULTIPLE_OF: "Value {value} is not a multiple of {multipleOf}",\r\n\tNUMBER_MINIMUM: "Value {value} is less than minimum {minimum}",\r\n\tNUMBER_MINIMUM_EXCLUSIVE: "Value {value} is equal to exclusive minimum {minimum}",\r\n\tNUMBER_MAXIMUM: "Value {value} is greater than maximum {maximum}",\r\n\tNUMBER_MAXIMUM_EXCLUSIVE: "Value {value} is equal to exclusive maximum {maximum}",\r\n\tNUMBER_NOT_A_NUMBER: "Value {value} is not a valid number",\r\n\t// String errors\r\n\tSTRING_LENGTH_SHORT: "String is too short ({length} chars), minimum {minimum}",\r\n\tSTRING_LENGTH_LONG: "String is too long ({length} chars), maximum {maximum}",\r\n\tSTRING_PATTERN: "String does not match pattern: {pattern}",\r\n\t// Object errors\r\n\tOBJECT_PROPERTIES_MINIMUM: "Too few properties defined ({propertyCount}), minimum {minimum}",\r\n\tOBJECT_PROPERTIES_MAXIMUM: "Too many properties defined ({propertyCount}), maximum {maximum}",\r\n\tOBJECT_REQUIRED: "Missing required property: {key}",\r\n\tOBJECT_ADDITIONAL_PROPERTIES: "Additional properties not allowed",\r\n\tOBJECT_DEPENDENCY_KEY: "Dependency failed - key must exist: {missing} (due to key: {key})",\r\n\t// Array errors\r\n\tARRAY_LENGTH_SHORT: "Array is too short ({length}), minimum {minimum}",\r\n\tARRAY_LENGTH_LONG: "Array is too long ({length}), maximum {maximum}",\r\n\tARRAY_UNIQUE: "Array items are not unique (indices {match1} and {match2})",\r\n\tARRAY_ADDITIONAL_ITEMS: "Additional items not allowed",\r\n\t// Format errors\r\n\tFORMAT_CUSTOM: "Format validation failed ({message})",\r\n\tKEYWORD_CUSTOM: "Keyword failed: {key} ({message})",\r\n\t// Schema structure\r\n\tCIRCULAR_REFERENCE: "Circular $refs: {urls}",\r\n\t// Non-standard validation options\r\n\tUNKNOWN_PROPERTY: "Unknown property (not in schema)"\r\n};\r\n\r\nfunction ValidationError(code, params, dataPath, schemaPath, subErrors) {\r\n\tError.call(this);\r\n\tif (code === undefined) {\r\n\t\tthrow new Error ("No error code supplied: " + schemaPath);\r\n\t}\r\n\tthis.message = \'\';\r\n\tthis.params = params;\r\n\tthis.code = code;\r\n\tthis.dataPath = dataPath || "";\r\n\tthis.schemaPath = schemaPath || "";\r\n\tthis.subErrors = subErrors || null;\r\n\r\n\tvar err = new Error(this.message);\r\n\tthis.stack = err.stack || err.stacktrace;\r\n\tif (!this.stack) {\r\n\t\ttry {\r\n\t\t\tthrow err;\r\n\t\t}\r\n\t\tcatch(err) {\r\n\t\t\tthis.stack = err.stack || err.stacktrace;\r\n\t\t}\r\n\t}\r\n}\r\nValidationError.prototype = Object.create(Error.prototype);\r\nValidationError.prototype.constructor = ValidationError;\r\nValidationError.prototype.name = \'ValidationError\';\r\n\r\nValidationError.prototype.prefixWith = function (dataPrefix, schemaPrefix) {\r\n\tif (dataPrefix !== null) {\r\n\t\tdataPrefix = dataPrefix.replace(/~/g, "~0").replace(/\\//g, "~1");\r\n\t\tthis.dataPath = "/" + dataPrefix + this.dataPath;\r\n\t}\r\n\tif (schemaPrefix !== null) {\r\n\t\tschemaPrefix = schemaPrefix.replace(/~/g, "~0").replace(/\\//g, "~1");\r\n\t\tthis.schemaPath = "/" + schemaPrefix + this.schemaPath;\r\n\t}\r\n\tif (this.subErrors !== null) {\r\n\t\tfor (var i = 0; i < this.subErrors.length; i++) {\r\n\t\t\tthis.subErrors[i].prefixWith(dataPrefix, schemaPrefix);\r\n\t\t}\r\n\t}\r\n\treturn this;\r\n};\r\n\r\nfunction isTrustedUrl(baseUrl, testUrl) {\r\n\tif(testUrl.substring(0, baseUrl.length) === baseUrl){\r\n\t\tvar remainder = testUrl.substring(baseUrl.length);\r\n\t\tif ((testUrl.length > 0 && testUrl.charAt(baseUrl.length - 1) === "/")\r\n\t\t\t|| remainder.charAt(0) === "#"\r\n\t\t\t|| remainder.charAt(0) === "?") {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nvar languages = {};\r\nfunction createApi(language) {\r\n\tvar globalContext = new ValidatorContext();\r\n\tvar currentLanguage;\r\n\tvar customErrorReporter;\r\n\tvar api = {\r\n\t\tsetErrorReporter: function (reporter) {\r\n\t\t\tif (typeof reporter === \'string\') {\r\n\t\t\t\treturn this.language(reporter);\r\n\t\t\t}\r\n\t\t\tcustomErrorReporter = reporter;\r\n\t\t\treturn true;\r\n\t\t},\r\n\t\taddFormat: function () {\r\n\t\t\tglobalContext.addFormat.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tlanguage: function (code) {\r\n\t\t\tif (!code) {\r\n\t\t\t\treturn currentLanguage;\r\n\t\t\t}\r\n\t\t\tif (!languages[code]) {\r\n\t\t\t\tcode = code.split(\'-\')[0]; // fall back to base language\r\n\t\t\t}\r\n\t\t\tif (languages[code]) {\r\n\t\t\t\tcurrentLanguage = code;\r\n\t\t\t\treturn code; // so you can tell if fall-back has happened\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t},\r\n\t\taddLanguage: function (code, messageMap) {\r\n\t\t\tvar key;\r\n\t\t\tfor (key in ErrorCodes) {\r\n\t\t\t\tif (messageMap[key] && !messageMap[ErrorCodes[key]]) {\r\n\t\t\t\t\tmessageMap[ErrorCodes[key]] = messageMap[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar rootCode = code.split(\'-\')[0];\r\n\t\t\tif (!languages[rootCode]) { // use for base language if not yet defined\r\n\t\t\t\tlanguages[code] = messageMap;\r\n\t\t\t\tlanguages[rootCode] = messageMap;\r\n\t\t\t} else {\r\n\t\t\t\tlanguages[code] = Object.create(languages[rootCode]);\r\n\t\t\t\tfor (key in messageMap) {\r\n\t\t\t\t\tif (typeof languages[rootCode][key] === \'undefined\') {\r\n\t\t\t\t\t\tlanguages[rootCode][key] = messageMap[key];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlanguages[code][key] = messageMap[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t},\r\n\t\tfreshApi: function (language) {\r\n\t\t\tvar result = createApi();\r\n\t\t\tif (language) {\r\n\t\t\t\tresult.language(language);\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\tvalidate: function (data, schema, checkRecursive, banUnknownProperties) {\r\n\t\t\tvar def = defaultErrorReporter(currentLanguage);\r\n\t\t\tvar errorReporter = customErrorReporter ? function (error, data, schema) {\r\n\t\t\t\treturn customErrorReporter(error, data, schema) || def(error, data, schema);\r\n\t\t\t} : def;\r\n\t\t\tvar context = new ValidatorContext(globalContext, false, errorReporter, checkRecursive, banUnknownProperties);\r\n\t\t\tif (typeof schema === "string") {\r\n\t\t\t\tschema = {"$ref": schema};\r\n\t\t\t}\r\n\t\t\tcontext.addSchema("", schema);\r\n\t\t\tvar error = context.validateAll(data, schema, null, null, "");\r\n\t\t\tif (!error && banUnknownProperties) {\r\n\t\t\t\terror = context.banUnknownProperties(data, schema);\r\n\t\t\t}\r\n\t\t\tthis.error = error;\r\n\t\t\tthis.missing = context.missing;\r\n\t\t\tthis.valid = (error === null);\r\n\t\t\treturn this.valid;\r\n\t\t},\r\n\t\tvalidateResult: function () {\r\n\t\t\tvar result = {toString: function () {\r\n\t\t\t\treturn this.valid ? \'valid\' : this.error.message;\r\n\t\t\t}};\r\n\t\t\tthis.validate.apply(result, arguments);\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\tvalidateMultiple: function (data, schema, checkRecursive, banUnknownProperties) {\r\n\t\t\tvar def = defaultErrorReporter(currentLanguage);\r\n\t\t\tvar errorReporter = customErrorReporter ? function (error, data, schema) {\r\n\t\t\t\treturn customErrorReporter(error, data, schema) || def(error, data, schema);\r\n\t\t\t} : def;\r\n\t\t\tvar context = new ValidatorContext(globalContext, true, errorReporter, checkRecursive, banUnknownProperties);\r\n\t\t\tif (typeof schema === "string") {\r\n\t\t\t\tschema = {"$ref": schema};\r\n\t\t\t}\r\n\t\t\tcontext.addSchema("", schema);\r\n\t\t\tcontext.validateAll(data, schema, null, null, "");\r\n\t\t\tif (banUnknownProperties) {\r\n\t\t\t\tcontext.banUnknownProperties(data, schema);\r\n\t\t\t}\r\n\t\t\tvar result = {toString: function () {\r\n\t\t\t\treturn this.valid ? \'valid\' : this.error.message;\r\n\t\t\t}};\r\n\t\t\tresult.errors = context.errors;\r\n\t\t\tresult.missing = context.missing;\r\n\t\t\tresult.valid = (result.errors.length === 0);\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\taddSchema: function () {\r\n\t\t\treturn globalContext.addSchema.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchema: function () {\r\n\t\t\treturn globalContext.getSchema.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchemaMap: function () {\r\n\t\t\treturn globalContext.getSchemaMap.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchemaUris: function () {\r\n\t\t\treturn globalContext.getSchemaUris.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetMissingUris: function () {\r\n\t\t\treturn globalContext.getMissingUris.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdropSchemas: function () {\r\n\t\t\tglobalContext.dropSchemas.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdefineKeyword: function () {\r\n\t\t\tglobalContext.defineKeyword.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdefineError: function (codeName, codeNumber, defaultMessage) {\r\n\t\t\tif (typeof codeName !== \'string\' || !/^[A-Z]+(_[A-Z]+)*$/.test(codeName)) {\r\n\t\t\t\tthrow new Error(\'Code name must be a string in UPPER_CASE_WITH_UNDERSCORES\');\r\n\t\t\t}\r\n\t\t\tif (typeof codeNumber !== \'number\' || codeNumber%1 !== 0 || codeNumber < 10000) {\r\n\t\t\t\tthrow new Error(\'Code number must be an integer > 10000\');\r\n\t\t\t}\r\n\t\t\tif (typeof ErrorCodes[codeName] !== \'undefined\') {\r\n\t\t\t\tthrow new Error(\'Error already defined: \' + codeName + \' as \' + ErrorCodes[codeName]);\r\n\t\t\t}\r\n\t\t\tif (typeof ErrorCodeLookup[codeNumber] !== \'undefined\') {\r\n\t\t\t\tthrow new Error(\'Error code already used: \' + ErrorCodeLookup[codeNumber] + \' as \' + codeNumber);\r\n\t\t\t}\r\n\t\t\tErrorCodes[codeName] = codeNumber;\r\n\t\t\tErrorCodeLookup[codeNumber] = codeName;\r\n\t\t\tErrorMessagesDefault[codeName] = ErrorMessagesDefault[codeNumber] = defaultMessage;\r\n\t\t\tfor (var langCode in languages) {\r\n\t\t\t\tvar language = languages[langCode];\r\n\t\t\t\tif (language[codeName]) {\r\n\t\t\t\t\tlanguage[codeNumber] = language[codeNumber] || language[codeName];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\treset: function () {\r\n\t\t\tglobalContext.reset();\r\n\t\t\tthis.error = null;\r\n\t\t\tthis.missing = [];\r\n\t\t\tthis.valid = true;\r\n\t\t},\r\n\t\tmissing: [],\r\n\t\terror: null,\r\n\t\tvalid: true,\r\n\t\tnormSchema: normSchema,\r\n\t\tresolveUrl: resolveUrl,\r\n\t\tgetDocumentUri: getDocumentUri,\r\n\t\terrorCodes: ErrorCodes\r\n\t};\r\n\tapi.language(language || \'en\');\r\n\treturn api;\r\n}\r\n\r\nvar tv4 = createApi();\r\ntv4.addLanguage(\'en-gb\', ErrorMessagesDefault);\r\n\r\n//legacy property\r\ntv4.tv4 = tv4;\r\n\r\nreturn tv4; // used by _header.js to globalise.\r\n\r\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvdHY0L3R2NC5qcz84ZTUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbkF1dGhvcjogR2VyYWludCBMdWZmIGFuZCBvdGhlcnNcclxuWWVhcjogMjAxM1xyXG5cclxuVGhpcyBjb2RlIGlzIHJlbGVhc2VkIGludG8gdGhlIFwicHVibGljIGRvbWFpblwiIGJ5IGl0cyBhdXRob3IocykuICBBbnlib2R5IG1heSB1c2UsIGFsdGVyIGFuZCBkaXN0cmlidXRlIHRoZSBjb2RlIHdpdGhvdXQgcmVzdHJpY3Rpb24uICBUaGUgYXV0aG9yIG1ha2VzIG5vIGd1YXJhbnRlZXMsIGFuZCB0YWtlcyBubyBsaWFiaWxpdHkgb2YgYW55IGtpbmQgZm9yIHVzZSBvZiB0aGlzIGNvZGUuXHJcblxyXG5JZiB5b3UgZmluZCBhIGJ1ZyBvciBtYWtlIGFuIGltcHJvdmVtZW50LCBpdCB3b3VsZCBiZSBjb3VydGVvdXMgdG8gbGV0IHRoZSBhdXRob3Iga25vdywgYnV0IGl0IGlzIG5vdCBjb21wdWxzb3J5LlxyXG4qL1xyXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xyXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcclxuICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cclxuICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XHJcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cyl7XHJcbiAgICAvLyBDb21tb25KUy4gRGVmaW5lIGV4cG9ydC5cclxuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBCcm93c2VyIGdsb2JhbHNcclxuICAgIGdsb2JhbC50djQgPSBmYWN0b3J5KCk7XHJcbiAgfVxyXG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcclxuXHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9rZXlzP3JlZGlyZWN0bG9jYWxlPWVuLVVTJnJlZGlyZWN0c2x1Zz1KYXZhU2NyaXB0JTJGUmVmZXJlbmNlJTJGR2xvYmFsX09iamVjdHMlMkZPYmplY3QlMkZrZXlzXHJcbmlmICghT2JqZWN0LmtleXMpIHtcclxuXHRPYmplY3Qua2V5cyA9IChmdW5jdGlvbiAoKSB7XHJcblx0XHR2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxyXG5cdFx0XHRoYXNEb250RW51bUJ1ZyA9ICEoe3RvU3RyaW5nOiBudWxsfSkucHJvcGVydHlJc0VudW1lcmFibGUoJ3RvU3RyaW5nJyksXHJcblx0XHRcdGRvbnRFbnVtcyA9IFtcclxuXHRcdFx0XHQndG9TdHJpbmcnLFxyXG5cdFx0XHRcdCd0b0xvY2FsZVN0cmluZycsXHJcblx0XHRcdFx0J3ZhbHVlT2YnLFxyXG5cdFx0XHRcdCdoYXNPd25Qcm9wZXJ0eScsXHJcblx0XHRcdFx0J2lzUHJvdG90eXBlT2YnLFxyXG5cdFx0XHRcdCdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXHJcblx0XHRcdFx0J2NvbnN0cnVjdG9yJ1xyXG5cdFx0XHRdLFxyXG5cdFx0XHRkb250RW51bXNMZW5ndGggPSBkb250RW51bXMubGVuZ3RoO1xyXG5cclxuXHRcdHJldHVybiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nIHx8IG9iaiA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBub24tb2JqZWN0Jyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHJcblx0XHRcdGZvciAodmFyIHByb3AgaW4gb2JqKSB7XHJcblx0XHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkge1xyXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2gocHJvcCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoaGFzRG9udEVudW1CdWcpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpPTA7IGkgPCBkb250RW51bXNMZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBkb250RW51bXNbaV0pKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGRvbnRFbnVtc1tpXSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9O1xyXG5cdH0pKCk7XHJcbn1cclxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2NyZWF0ZVxyXG5pZiAoIU9iamVjdC5jcmVhdGUpIHtcclxuXHRPYmplY3QuY3JlYXRlID0gKGZ1bmN0aW9uKCl7XHJcblx0XHRmdW5jdGlvbiBGKCl7fVxyXG5cclxuXHRcdHJldHVybiBmdW5jdGlvbihvKXtcclxuXHRcdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDEpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ09iamVjdC5jcmVhdGUgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG9uZSBwYXJhbWV0ZXIuJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ri5wcm90b3R5cGUgPSBvO1xyXG5cdFx0XHRyZXR1cm4gbmV3IEYoKTtcclxuXHRcdH07XHJcblx0fSkoKTtcclxufVxyXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5P3JlZGlyZWN0bG9jYWxlPWVuLVVTJnJlZGlyZWN0c2x1Zz1KYXZhU2NyaXB0JTJGUmVmZXJlbmNlJTJGR2xvYmFsX09iamVjdHMlMkZBcnJheSUyRmlzQXJyYXlcclxuaWYoIUFycmF5LmlzQXJyYXkpIHtcclxuXHRBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gKHZBcmcpIHtcclxuXHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodkFyZykgPT09IFwiW29iamVjdCBBcnJheV1cIjtcclxuXHR9O1xyXG59XHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2luZGV4T2Y/cmVkaXJlY3Rsb2NhbGU9ZW4tVVMmcmVkaXJlY3RzbHVnPUphdmFTY3JpcHQlMkZSZWZlcmVuY2UlMkZHbG9iYWxfT2JqZWN0cyUyRkFycmF5JTJGaW5kZXhPZlxyXG5pZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XHJcblx0QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ICovICkge1xyXG5cdFx0aWYgKHRoaXMgPT09IG51bGwpIHtcclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcigpO1xyXG5cdFx0fVxyXG5cdFx0dmFyIHQgPSBPYmplY3QodGhpcyk7XHJcblx0XHR2YXIgbGVuID0gdC5sZW5ndGggPj4+IDA7XHJcblxyXG5cdFx0aWYgKGxlbiA9PT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gLTE7XHJcblx0XHR9XHJcblx0XHR2YXIgbiA9IDA7XHJcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcclxuXHRcdFx0biA9IE51bWJlcihhcmd1bWVudHNbMV0pO1xyXG5cdFx0XHRpZiAobiAhPT0gbikgeyAvLyBzaG9ydGN1dCBmb3IgdmVyaWZ5aW5nIGlmIGl0J3MgTmFOXHJcblx0XHRcdFx0biA9IDA7XHJcblx0XHRcdH0gZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSBJbmZpbml0eSAmJiBuICE9PSAtSW5maW5pdHkpIHtcclxuXHRcdFx0XHRuID0gKG4gPiAwIHx8IC0xKSAqIE1hdGguZmxvb3IoTWF0aC5hYnMobikpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAobiA+PSBsZW4pIHtcclxuXHRcdFx0cmV0dXJuIC0xO1xyXG5cdFx0fVxyXG5cdFx0dmFyIGsgPSBuID49IDAgPyBuIDogTWF0aC5tYXgobGVuIC0gTWF0aC5hYnMobiksIDApO1xyXG5cdFx0Zm9yICg7IGsgPCBsZW47IGsrKykge1xyXG5cdFx0XHRpZiAoayBpbiB0ICYmIHRba10gPT09IHNlYXJjaEVsZW1lbnQpIHtcclxuXHRcdFx0XHRyZXR1cm4gaztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIC0xO1xyXG5cdH07XHJcbn1cclxuXHJcbi8vIEdydW5nZXkgT2JqZWN0LmlzRnJvemVuIGhhY2tcclxuaWYgKCFPYmplY3QuaXNGcm96ZW4pIHtcclxuXHRPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHR2YXIga2V5ID0gXCJ0djRfdGVzdF9mcm96ZW5fa2V5XCI7XHJcblx0XHR3aGlsZSAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuXHRcdFx0a2V5ICs9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRvYmpba2V5XSA9IHRydWU7XHJcblx0XHRcdGRlbGV0ZSBvYmpba2V5XTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcbi8vIEJhc2VkIG9uOiBodHRwczovL2dpdGh1Yi5jb20vZ2VyYWludGx1ZmYvdXJpLXRlbXBsYXRlcywgYnV0IHdpdGggYWxsIHRoZSBkZS1zdWJzdGl0dXRpb24gc3R1ZmYgcmVtb3ZlZFxyXG5cclxudmFyIHVyaVRlbXBsYXRlR2xvYmFsTW9kaWZpZXJzID0ge1xyXG5cdFwiK1wiOiB0cnVlLFxyXG5cdFwiI1wiOiB0cnVlLFxyXG5cdFwiLlwiOiB0cnVlLFxyXG5cdFwiL1wiOiB0cnVlLFxyXG5cdFwiO1wiOiB0cnVlLFxyXG5cdFwiP1wiOiB0cnVlLFxyXG5cdFwiJlwiOiB0cnVlXHJcbn07XHJcbnZhciB1cmlUZW1wbGF0ZVN1ZmZpY2VzID0ge1xyXG5cdFwiKlwiOiB0cnVlXHJcbn07XHJcblxyXG5mdW5jdGlvbiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKHN0cmluZykge1xyXG5cdHJldHVybiBlbmNvZGVVUkkoc3RyaW5nKS5yZXBsYWNlKC8lMjVbMC05XVswLTldL2csIGZ1bmN0aW9uIChkb3VibGVFbmNvZGVkKSB7XHJcblx0XHRyZXR1cm4gXCIlXCIgKyBkb3VibGVFbmNvZGVkLnN1YnN0cmluZygzKTtcclxuXHR9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXJpVGVtcGxhdGVTdWJzdGl0dXRpb24oc3BlYykge1xyXG5cdHZhciBtb2RpZmllciA9IFwiXCI7XHJcblx0aWYgKHVyaVRlbXBsYXRlR2xvYmFsTW9kaWZpZXJzW3NwZWMuY2hhckF0KDApXSkge1xyXG5cdFx0bW9kaWZpZXIgPSBzcGVjLmNoYXJBdCgwKTtcclxuXHRcdHNwZWMgPSBzcGVjLnN1YnN0cmluZygxKTtcclxuXHR9XHJcblx0dmFyIHNlcGFyYXRvciA9IFwiXCI7XHJcblx0dmFyIHByZWZpeCA9IFwiXCI7XHJcblx0dmFyIHNob3VsZEVzY2FwZSA9IHRydWU7XHJcblx0dmFyIHNob3dWYXJpYWJsZXMgPSBmYWxzZTtcclxuXHR2YXIgdHJpbUVtcHR5U3RyaW5nID0gZmFsc2U7XHJcblx0aWYgKG1vZGlmaWVyID09PSAnKycpIHtcclxuXHRcdHNob3VsZEVzY2FwZSA9IGZhbHNlO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09IFwiLlwiKSB7XHJcblx0XHRwcmVmaXggPSBcIi5cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiLlwiO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09IFwiL1wiKSB7XHJcblx0XHRwcmVmaXggPSBcIi9cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiL1wiO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICcjJykge1xyXG5cdFx0cHJlZml4ID0gXCIjXCI7XHJcblx0XHRzaG91bGRFc2NhcGUgPSBmYWxzZTtcclxuXHR9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnOycpIHtcclxuXHRcdHByZWZpeCA9IFwiO1wiO1xyXG5cdFx0c2VwYXJhdG9yID0gXCI7XCI7XHJcblx0XHRzaG93VmFyaWFibGVzID0gdHJ1ZTtcclxuXHRcdHRyaW1FbXB0eVN0cmluZyA9IHRydWU7XHJcblx0fSBlbHNlIGlmIChtb2RpZmllciA9PT0gJz8nKSB7XHJcblx0XHRwcmVmaXggPSBcIj9cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiJlwiO1xyXG5cdFx0c2hvd1ZhcmlhYmxlcyA9IHRydWU7XHJcblx0fSBlbHNlIGlmIChtb2RpZmllciA9PT0gJyYnKSB7XHJcblx0XHRwcmVmaXggPSBcIiZcIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiJlwiO1xyXG5cdFx0c2hvd1ZhcmlhYmxlcyA9IHRydWU7XHJcblx0fVxyXG5cclxuXHR2YXIgdmFyTmFtZXMgPSBbXTtcclxuXHR2YXIgdmFyTGlzdCA9IHNwZWMuc3BsaXQoXCIsXCIpO1xyXG5cdHZhciB2YXJTcGVjcyA9IFtdO1xyXG5cdHZhciB2YXJTcGVjTWFwID0ge307XHJcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB2YXJMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgdmFyTmFtZSA9IHZhckxpc3RbaV07XHJcblx0XHR2YXIgdHJ1bmNhdGUgPSBudWxsO1xyXG5cdFx0aWYgKHZhck5hbWUuaW5kZXhPZihcIjpcIikgIT09IC0xKSB7XHJcblx0XHRcdHZhciBwYXJ0cyA9IHZhck5hbWUuc3BsaXQoXCI6XCIpO1xyXG5cdFx0XHR2YXJOYW1lID0gcGFydHNbMF07XHJcblx0XHRcdHRydW5jYXRlID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcclxuXHRcdH1cclxuXHRcdHZhciBzdWZmaWNlcyA9IHt9O1xyXG5cdFx0d2hpbGUgKHVyaVRlbXBsYXRlU3VmZmljZXNbdmFyTmFtZS5jaGFyQXQodmFyTmFtZS5sZW5ndGggLSAxKV0pIHtcclxuXHRcdFx0c3VmZmljZXNbdmFyTmFtZS5jaGFyQXQodmFyTmFtZS5sZW5ndGggLSAxKV0gPSB0cnVlO1xyXG5cdFx0XHR2YXJOYW1lID0gdmFyTmFtZS5zdWJzdHJpbmcoMCwgdmFyTmFtZS5sZW5ndGggLSAxKTtcclxuXHRcdH1cclxuXHRcdHZhciB2YXJTcGVjID0ge1xyXG5cdFx0XHR0cnVuY2F0ZTogdHJ1bmNhdGUsXHJcblx0XHRcdG5hbWU6IHZhck5hbWUsXHJcblx0XHRcdHN1ZmZpY2VzOiBzdWZmaWNlc1xyXG5cdFx0fTtcclxuXHRcdHZhclNwZWNzLnB1c2godmFyU3BlYyk7XHJcblx0XHR2YXJTcGVjTWFwW3Zhck5hbWVdID0gdmFyU3BlYztcclxuXHRcdHZhck5hbWVzLnB1c2godmFyTmFtZSk7XHJcblx0fVxyXG5cdHZhciBzdWJGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZUZ1bmN0aW9uKSB7XHJcblx0XHR2YXIgcmVzdWx0ID0gXCJcIjtcclxuXHRcdHZhciBzdGFydEluZGV4ID0gMDtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdmFyU3BlY3MubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIHZhclNwZWMgPSB2YXJTcGVjc1tpXTtcclxuXHRcdFx0dmFyIHZhbHVlID0gdmFsdWVGdW5jdGlvbih2YXJTcGVjLm5hbWUpO1xyXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB8fCAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKSkge1xyXG5cdFx0XHRcdHN0YXJ0SW5kZXgrKztcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoaSA9PT0gc3RhcnRJbmRleCkge1xyXG5cdFx0XHRcdHJlc3VsdCArPSBwcmVmaXg7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmVzdWx0ICs9IChzZXBhcmF0b3IgfHwgXCIsXCIpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG5cdFx0XHRcdGlmIChzaG93VmFyaWFibGVzKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5uYW1lICsgXCI9XCI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdGlmIChqID4gMCkge1xyXG5cdFx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5zdWZmaWNlc1snKiddID8gKHNlcGFyYXRvciB8fCBcIixcIikgOiBcIixcIjtcclxuXHRcdFx0XHRcdFx0aWYgKHZhclNwZWMuc3VmZmljZXNbJyonXSAmJiBzaG93VmFyaWFibGVzKSB7XHJcblx0XHRcdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMubmFtZSArIFwiPVwiO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gc2hvdWxkRXNjYXBlID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2pdKS5yZXBsYWNlKC8hL2csIFwiJTIxXCIpIDogbm90UmVhbGx5UGVyY2VudEVuY29kZSh2YWx1ZVtqXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG5cdFx0XHRcdGlmIChzaG93VmFyaWFibGVzICYmICF2YXJTcGVjLnN1ZmZpY2VzWycqJ10pIHtcclxuXHRcdFx0XHRcdHJlc3VsdCArPSB2YXJTcGVjLm5hbWUgKyBcIj1cIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dmFyIGZpcnN0ID0gdHJ1ZTtcclxuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcclxuXHRcdFx0XHRcdGlmICghZmlyc3QpIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMuc3VmZmljZXNbJyonXSA/IChzZXBhcmF0b3IgfHwgXCIsXCIpIDogXCIsXCI7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRmaXJzdCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0cmVzdWx0ICs9IHNob3VsZEVzY2FwZSA/IGVuY29kZVVSSUNvbXBvbmVudChrZXkpLnJlcGxhY2UoLyEvZywgXCIlMjFcIikgOiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKGtleSk7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5zdWZmaWNlc1snKiddID8gJz0nIDogXCIsXCI7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gc2hvdWxkRXNjYXBlID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2tleV0pLnJlcGxhY2UoLyEvZywgXCIlMjFcIikgOiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKHZhbHVlW2tleV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAoc2hvd1ZhcmlhYmxlcykge1xyXG5cdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMubmFtZTtcclxuXHRcdFx0XHRcdGlmICghdHJpbUVtcHR5U3RyaW5nIHx8IHZhbHVlICE9PSBcIlwiKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdCArPSBcIj1cIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKHZhclNwZWMudHJ1bmNhdGUgIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFyU3BlYy50cnVuY2F0ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJlc3VsdCArPSBzaG91bGRFc2NhcGUgPyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoLyEvZywgXCIlMjFcIik6IG5vdFJlYWxseVBlcmNlbnRFbmNvZGUodmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH07XHJcblx0c3ViRnVuY3Rpb24udmFyTmFtZXMgPSB2YXJOYW1lcztcclxuXHRyZXR1cm4ge1xyXG5cdFx0cHJlZml4OiBwcmVmaXgsXHJcblx0XHRzdWJzdGl0dXRpb246IHN1YkZ1bmN0aW9uXHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gVXJpVGVtcGxhdGUodGVtcGxhdGUpIHtcclxuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgVXJpVGVtcGxhdGUpKSB7XHJcblx0XHRyZXR1cm4gbmV3IFVyaVRlbXBsYXRlKHRlbXBsYXRlKTtcclxuXHR9XHJcblx0dmFyIHBhcnRzID0gdGVtcGxhdGUuc3BsaXQoXCJ7XCIpO1xyXG5cdHZhciB0ZXh0UGFydHMgPSBbcGFydHMuc2hpZnQoKV07XHJcblx0dmFyIHByZWZpeGVzID0gW107XHJcblx0dmFyIHN1YnN0aXR1dGlvbnMgPSBbXTtcclxuXHR2YXIgdmFyTmFtZXMgPSBbXTtcclxuXHR3aGlsZSAocGFydHMubGVuZ3RoID4gMCkge1xyXG5cdFx0dmFyIHBhcnQgPSBwYXJ0cy5zaGlmdCgpO1xyXG5cdFx0dmFyIHNwZWMgPSBwYXJ0LnNwbGl0KFwifVwiKVswXTtcclxuXHRcdHZhciByZW1haW5kZXIgPSBwYXJ0LnN1YnN0cmluZyhzcGVjLmxlbmd0aCArIDEpO1xyXG5cdFx0dmFyIGZ1bmNzID0gdXJpVGVtcGxhdGVTdWJzdGl0dXRpb24oc3BlYyk7XHJcblx0XHRzdWJzdGl0dXRpb25zLnB1c2goZnVuY3Muc3Vic3RpdHV0aW9uKTtcclxuXHRcdHByZWZpeGVzLnB1c2goZnVuY3MucHJlZml4KTtcclxuXHRcdHRleHRQYXJ0cy5wdXNoKHJlbWFpbmRlcik7XHJcblx0XHR2YXJOYW1lcyA9IHZhck5hbWVzLmNvbmNhdChmdW5jcy5zdWJzdGl0dXRpb24udmFyTmFtZXMpO1xyXG5cdH1cclxuXHR0aGlzLmZpbGwgPSBmdW5jdGlvbiAodmFsdWVGdW5jdGlvbikge1xyXG5cdFx0dmFyIHJlc3VsdCA9IHRleHRQYXJ0c1swXTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic3RpdHV0aW9ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uc1tpXTtcclxuXHRcdFx0cmVzdWx0ICs9IHN1YnN0aXR1dGlvbih2YWx1ZUZ1bmN0aW9uKTtcclxuXHRcdFx0cmVzdWx0ICs9IHRleHRQYXJ0c1tpICsgMV07XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH07XHJcblx0dGhpcy52YXJOYW1lcyA9IHZhck5hbWVzO1xyXG5cdHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxufVxyXG5VcmlUZW1wbGF0ZS5wcm90b3R5cGUgPSB7XHJcblx0dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiB0aGlzLnRlbXBsYXRlO1xyXG5cdH0sXHJcblx0ZmlsbEZyb21PYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdHJldHVybiB0aGlzLmZpbGwoZnVuY3Rpb24gKHZhck5hbWUpIHtcclxuXHRcdFx0cmV0dXJuIG9ialt2YXJOYW1lXTtcclxuXHRcdH0pO1xyXG5cdH1cclxufTtcclxudmFyIFZhbGlkYXRvckNvbnRleHQgPSBmdW5jdGlvbiBWYWxpZGF0b3JDb250ZXh0KHBhcmVudCwgY29sbGVjdE11bHRpcGxlLCBlcnJvclJlcG9ydGVyLCBjaGVja1JlY3Vyc2l2ZSwgdHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdHRoaXMubWlzc2luZ01hcCA9IHt9O1xyXG5cdHRoaXMuZm9ybWF0VmFsaWRhdG9ycyA9IHBhcmVudCA/IE9iamVjdC5jcmVhdGUocGFyZW50LmZvcm1hdFZhbGlkYXRvcnMpIDoge307XHJcblx0dGhpcy5zY2hlbWFzID0gcGFyZW50ID8gT2JqZWN0LmNyZWF0ZShwYXJlbnQuc2NoZW1hcykgOiB7fTtcclxuXHR0aGlzLmNvbGxlY3RNdWx0aXBsZSA9IGNvbGxlY3RNdWx0aXBsZTtcclxuXHR0aGlzLmVycm9ycyA9IFtdO1xyXG5cdHRoaXMuaGFuZGxlRXJyb3IgPSBjb2xsZWN0TXVsdGlwbGUgPyB0aGlzLmNvbGxlY3RFcnJvciA6IHRoaXMucmV0dXJuRXJyb3I7XHJcblx0aWYgKGNoZWNrUmVjdXJzaXZlKSB7XHJcblx0XHR0aGlzLmNoZWNrUmVjdXJzaXZlID0gdHJ1ZTtcclxuXHRcdHRoaXMuc2Nhbm5lZCA9IFtdO1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuID0gW107XHJcblx0XHR0aGlzLnNjYW5uZWRGcm96ZW5TY2hlbWFzID0gW107XHJcblx0XHR0aGlzLnNjYW5uZWRGcm96ZW5WYWxpZGF0aW9uRXJyb3JzID0gW107XHJcblx0XHR0aGlzLnZhbGlkYXRlZFNjaGVtYXNLZXkgPSAndHY0X3ZhbGlkYXRpb25faWQnO1xyXG5cdFx0dGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5ID0gJ3R2NF92YWxpZGF0aW9uX2Vycm9yc19pZCc7XHJcblx0fVxyXG5cdGlmICh0cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHR0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMgPSB0cnVlO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSB7fTtcclxuXHRcdHRoaXMudW5rbm93blByb3BlcnR5UGF0aHMgPSB7fTtcclxuXHR9XHJcblx0dGhpcy5lcnJvclJlcG9ydGVyID0gZXJyb3JSZXBvcnRlciB8fCBkZWZhdWx0RXJyb3JSZXBvcnRlcignZW4nKTtcclxuXHRpZiAodHlwZW9mIHRoaXMuZXJyb3JSZXBvcnRlciA9PT0gJ3N0cmluZycpIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcignZGVidWcnKTtcclxuXHR9XHJcblx0dGhpcy5kZWZpbmVkS2V5d29yZHMgPSB7fTtcclxuXHRpZiAocGFyZW50KSB7XHJcblx0XHRmb3IgKHZhciBrZXkgaW4gcGFyZW50LmRlZmluZWRLZXl3b3Jkcykge1xyXG5cdFx0XHR0aGlzLmRlZmluZWRLZXl3b3Jkc1trZXldID0gcGFyZW50LmRlZmluZWRLZXl3b3Jkc1trZXldLnNsaWNlKDApO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuZGVmaW5lS2V5d29yZCA9IGZ1bmN0aW9uIChrZXl3b3JkLCBrZXl3b3JkRnVuY3Rpb24pIHtcclxuXHR0aGlzLmRlZmluZWRLZXl3b3Jkc1trZXl3b3JkXSA9IHRoaXMuZGVmaW5lZEtleXdvcmRzW2tleXdvcmRdIHx8IFtdO1xyXG5cdHRoaXMuZGVmaW5lZEtleXdvcmRzW2tleXdvcmRdLnB1c2goa2V5d29yZEZ1bmN0aW9uKTtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRXJyb3IgPSBmdW5jdGlvbiAoY29kZSwgbWVzc2FnZVBhcmFtcywgZGF0YVBhdGgsIHNjaGVtYVBhdGgsIHN1YkVycm9ycywgZGF0YSwgc2NoZW1hKSB7XHJcblx0dmFyIGVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihjb2RlLCBtZXNzYWdlUGFyYW1zLCBkYXRhUGF0aCwgc2NoZW1hUGF0aCwgc3ViRXJyb3JzKTtcclxuXHRlcnJvci5tZXNzYWdlID0gdGhpcy5lcnJvclJlcG9ydGVyKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdHJldHVybiBlcnJvcjtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUucmV0dXJuRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcclxuXHRyZXR1cm4gZXJyb3I7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmNvbGxlY3RFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xyXG5cdGlmIChlcnJvcikge1xyXG5cdFx0dGhpcy5lcnJvcnMucHVzaChlcnJvcik7XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5wcmVmaXhFcnJvcnMgPSBmdW5jdGlvbiAoc3RhcnRJbmRleCwgZGF0YVBhdGgsIHNjaGVtYVBhdGgpIHtcclxuXHRmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRoaXMuZXJyb3JzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR0aGlzLmVycm9yc1tpXSA9IHRoaXMuZXJyb3JzW2ldLnByZWZpeFdpdGgoZGF0YVBhdGgsIHNjaGVtYVBhdGgpO1xyXG5cdH1cclxuXHRyZXR1cm4gdGhpcztcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuYmFuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hKSB7XHJcblx0Zm9yICh2YXIgdW5rbm93blBhdGggaW4gdGhpcy51bmtub3duUHJvcGVydHlQYXRocykge1xyXG5cdFx0dmFyIGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLlVOS05PV05fUFJPUEVSVFksIHtwYXRoOiB1bmtub3duUGF0aH0sIHVua25vd25QYXRoLCBcIlwiLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG5cdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmFkZEZvcm1hdCA9IGZ1bmN0aW9uIChmb3JtYXQsIHZhbGlkYXRvcikge1xyXG5cdGlmICh0eXBlb2YgZm9ybWF0ID09PSAnb2JqZWN0Jykge1xyXG5cdFx0Zm9yICh2YXIga2V5IGluIGZvcm1hdCkge1xyXG5cdFx0XHR0aGlzLmFkZEZvcm1hdChrZXksIGZvcm1hdFtrZXldKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHR0aGlzLmZvcm1hdFZhbGlkYXRvcnNbZm9ybWF0XSA9IHZhbGlkYXRvcjtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUucmVzb2x2ZVJlZnMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1cmxIaXN0b3J5KSB7XHJcblx0aWYgKHNjaGVtYVsnJHJlZiddICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdHVybEhpc3RvcnkgPSB1cmxIaXN0b3J5IHx8IHt9O1xyXG5cdFx0aWYgKHVybEhpc3Rvcnlbc2NoZW1hWyckcmVmJ11dKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuQ0lSQ1VMQVJfUkVGRVJFTkNFLCB7dXJsczogT2JqZWN0LmtleXModXJsSGlzdG9yeSkuam9pbignLCAnKX0sICcnLCAnJywgbnVsbCwgdW5kZWZpbmVkLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdFx0dXJsSGlzdG9yeVtzY2hlbWFbJyRyZWYnXV0gPSB0cnVlO1xyXG5cdFx0c2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoc2NoZW1hWyckcmVmJ10sIHVybEhpc3RvcnkpO1xyXG5cdH1cclxuXHRyZXR1cm4gc2NoZW1hO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5nZXRTY2hlbWEgPSBmdW5jdGlvbiAodXJsLCB1cmxIaXN0b3J5KSB7XHJcblx0dmFyIHNjaGVtYTtcclxuXHRpZiAodGhpcy5zY2hlbWFzW3VybF0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0c2NoZW1hID0gdGhpcy5zY2hlbWFzW3VybF07XHJcblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlUmVmcyhzY2hlbWEsIHVybEhpc3RvcnkpO1xyXG5cdH1cclxuXHR2YXIgYmFzZVVybCA9IHVybDtcclxuXHR2YXIgZnJhZ21lbnQgPSBcIlwiO1xyXG5cdGlmICh1cmwuaW5kZXhPZignIycpICE9PSAtMSkge1xyXG5cdFx0ZnJhZ21lbnQgPSB1cmwuc3Vic3RyaW5nKHVybC5pbmRleE9mKFwiI1wiKSArIDEpO1xyXG5cdFx0YmFzZVVybCA9IHVybC5zdWJzdHJpbmcoMCwgdXJsLmluZGV4T2YoXCIjXCIpKTtcclxuXHR9XHJcblx0aWYgKHR5cGVvZiB0aGlzLnNjaGVtYXNbYmFzZVVybF0gPT09ICdvYmplY3QnKSB7XHJcblx0XHRzY2hlbWEgPSB0aGlzLnNjaGVtYXNbYmFzZVVybF07XHJcblx0XHR2YXIgcG9pbnRlclBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoZnJhZ21lbnQpO1xyXG5cdFx0aWYgKHBvaW50ZXJQYXRoID09PSBcIlwiKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVSZWZzKHNjaGVtYSwgdXJsSGlzdG9yeSk7XHJcblx0XHR9IGVsc2UgaWYgKHBvaW50ZXJQYXRoLmNoYXJBdCgwKSAhPT0gXCIvXCIpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHRcdHZhciBwYXJ0cyA9IHBvaW50ZXJQYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgxKTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIGNvbXBvbmVudCA9IHBhcnRzW2ldLnJlcGxhY2UoL34xL2csIFwiL1wiKS5yZXBsYWNlKC9+MC9nLCBcIn5cIik7XHJcblx0XHRcdGlmIChzY2hlbWFbY29tcG9uZW50XSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0c2NoZW1hID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdHNjaGVtYSA9IHNjaGVtYVtjb21wb25lbnRdO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVSZWZzKHNjaGVtYSwgdXJsSGlzdG9yeSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICh0aGlzLm1pc3NpbmdbYmFzZVVybF0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0dGhpcy5taXNzaW5nLnB1c2goYmFzZVVybCk7XHJcblx0XHR0aGlzLm1pc3NpbmdbYmFzZVVybF0gPSBiYXNlVXJsO1xyXG5cdFx0dGhpcy5taXNzaW5nTWFwW2Jhc2VVcmxdID0gYmFzZVVybDtcclxuXHR9XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnNlYXJjaFNjaGVtYXMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1cmwpIHtcclxuXHRpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XHJcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR0aGlzLnNlYXJjaFNjaGVtYXMoc2NoZW1hW2ldLCB1cmwpO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAoc2NoZW1hICYmIHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdGlmICh0eXBlb2Ygc2NoZW1hLmlkID09PSBcInN0cmluZ1wiKSB7XHJcblx0XHRcdGlmIChpc1RydXN0ZWRVcmwodXJsLCBzY2hlbWEuaWQpKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuc2NoZW1hc1tzY2hlbWEuaWRdID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2NoZW1hc1tzY2hlbWEuaWRdID0gc2NoZW1hO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Zm9yICh2YXIga2V5IGluIHNjaGVtYSkge1xyXG5cdFx0XHRpZiAoa2V5ICE9PSBcImVudW1cIikge1xyXG5cdFx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hW2tleV0gPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2VhcmNoU2NoZW1hcyhzY2hlbWFba2V5XSwgdXJsKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGtleSA9PT0gXCIkcmVmXCIpIHtcclxuXHRcdFx0XHRcdHZhciB1cmkgPSBnZXREb2N1bWVudFVyaShzY2hlbWFba2V5XSk7XHJcblx0XHRcdFx0XHRpZiAodXJpICYmIHRoaXMuc2NoZW1hc1t1cmldID09PSB1bmRlZmluZWQgJiYgdGhpcy5taXNzaW5nTWFwW3VyaV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLm1pc3NpbmdNYXBbdXJpXSA9IHVyaTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmFkZFNjaGVtYSA9IGZ1bmN0aW9uICh1cmwsIHNjaGVtYSkge1xyXG5cdC8vb3ZlcmxvYWRcclxuXHRpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHNjaGVtYSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdGlmICh0eXBlb2YgdXJsID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdXJsLmlkID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRzY2hlbWEgPSB1cmw7XHJcblx0XHRcdHVybCA9IHNjaGVtYS5pZDtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICh1cmwgPT09IGdldERvY3VtZW50VXJpKHVybCkgKyBcIiNcIikge1xyXG5cdFx0Ly8gUmVtb3ZlIGVtcHR5IGZyYWdtZW50XHJcblx0XHR1cmwgPSBnZXREb2N1bWVudFVyaSh1cmwpO1xyXG5cdH1cclxuXHR0aGlzLnNjaGVtYXNbdXJsXSA9IHNjaGVtYTtcclxuXHRkZWxldGUgdGhpcy5taXNzaW5nTWFwW3VybF07XHJcblx0bm9ybVNjaGVtYShzY2hlbWEsIHVybCk7XHJcblx0dGhpcy5zZWFyY2hTY2hlbWFzKHNjaGVtYSwgdXJsKTtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldFNjaGVtYU1hcCA9IGZ1bmN0aW9uICgpIHtcclxuXHR2YXIgbWFwID0ge307XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMuc2NoZW1hcykge1xyXG5cdFx0bWFwW2tleV0gPSB0aGlzLnNjaGVtYXNba2V5XTtcclxuXHR9XHJcblx0cmV0dXJuIG1hcDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldFNjaGVtYVVyaXMgPSBmdW5jdGlvbiAoZmlsdGVyUmVnRXhwKSB7XHJcblx0dmFyIGxpc3QgPSBbXTtcclxuXHRmb3IgKHZhciBrZXkgaW4gdGhpcy5zY2hlbWFzKSB7XHJcblx0XHRpZiAoIWZpbHRlclJlZ0V4cCB8fCBmaWx0ZXJSZWdFeHAudGVzdChrZXkpKSB7XHJcblx0XHRcdGxpc3QucHVzaChrZXkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbGlzdDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldE1pc3NpbmdVcmlzID0gZnVuY3Rpb24gKGZpbHRlclJlZ0V4cCkge1xyXG5cdHZhciBsaXN0ID0gW107XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMubWlzc2luZ01hcCkge1xyXG5cdFx0aWYgKCFmaWx0ZXJSZWdFeHAgfHwgZmlsdGVyUmVnRXhwLnRlc3Qoa2V5KSkge1xyXG5cdFx0XHRsaXN0LnB1c2goa2V5KTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGxpc3Q7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5kcm9wU2NoZW1hcyA9IGZ1bmN0aW9uICgpIHtcclxuXHR0aGlzLnNjaGVtYXMgPSB7fTtcclxuXHR0aGlzLnJlc2V0KCk7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xyXG5cdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdHRoaXMubWlzc2luZ01hcCA9IHt9O1xyXG5cdHRoaXMuZXJyb3JzID0gW107XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFsbCA9IGZ1bmN0aW9uIChkYXRhLCBzY2hlbWEsIGRhdGFQYXRoUGFydHMsIHNjaGVtYVBhdGhQYXJ0cywgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0dmFyIHRvcExldmVsO1xyXG5cdHNjaGVtYSA9IHRoaXMucmVzb2x2ZVJlZnMoc2NoZW1hKTtcclxuXHRpZiAoIXNjaGVtYSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fSBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcclxuXHRcdHRoaXMuZXJyb3JzLnB1c2goc2NoZW1hKTtcclxuXHRcdHJldHVybiBzY2hlbWE7XHJcblx0fVxyXG5cclxuXHR2YXIgc3RhcnRFcnJvckNvdW50ID0gdGhpcy5lcnJvcnMubGVuZ3RoO1xyXG5cdHZhciBmcm96ZW5JbmRleCwgc2Nhbm5lZEZyb3plblNjaGVtYUluZGV4ID0gbnVsbCwgc2Nhbm5lZFNjaGVtYXNJbmRleCA9IG51bGw7XHJcblx0aWYgKHRoaXMuY2hlY2tSZWN1cnNpdmUgJiYgZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdHRvcExldmVsID0gIXRoaXMuc2Nhbm5lZC5sZW5ndGg7XHJcblx0XHRpZiAoZGF0YVt0aGlzLnZhbGlkYXRlZFNjaGVtYXNLZXldKSB7XHJcblx0XHRcdHZhciBzY2hlbWFJbmRleCA9IGRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XS5pbmRleE9mKHNjaGVtYSk7XHJcblx0XHRcdGlmIChzY2hlbWFJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHR0aGlzLmVycm9ycyA9IHRoaXMuZXJyb3JzLmNvbmNhdChkYXRhW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV1bc2NoZW1hSW5kZXhdKTtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKE9iamVjdC5pc0Zyb3plbihkYXRhKSkge1xyXG5cdFx0XHRmcm96ZW5JbmRleCA9IHRoaXMuc2Nhbm5lZEZyb3plbi5pbmRleE9mKGRhdGEpO1xyXG5cdFx0XHRpZiAoZnJvemVuSW5kZXggIT09IC0xKSB7XHJcblx0XHRcdFx0dmFyIGZyb3plblNjaGVtYUluZGV4ID0gdGhpcy5zY2FubmVkRnJvemVuU2NoZW1hc1tmcm96ZW5JbmRleF0uaW5kZXhPZihzY2hlbWEpO1xyXG5cdFx0XHRcdGlmIChmcm96ZW5TY2hlbWFJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuY29uY2F0KHRoaXMuc2Nhbm5lZEZyb3plblZhbGlkYXRpb25FcnJvcnNbZnJvemVuSW5kZXhdW2Zyb3plblNjaGVtYUluZGV4XSk7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHRoaXMuc2Nhbm5lZC5wdXNoKGRhdGEpO1xyXG5cdFx0aWYgKE9iamVjdC5pc0Zyb3plbihkYXRhKSkge1xyXG5cdFx0XHRpZiAoZnJvemVuSW5kZXggPT09IC0xKSB7XHJcblx0XHRcdFx0ZnJvemVuSW5kZXggPSB0aGlzLnNjYW5uZWRGcm96ZW4ubGVuZ3RoO1xyXG5cdFx0XHRcdHRoaXMuc2Nhbm5lZEZyb3plbi5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdHRoaXMuc2Nhbm5lZEZyb3plblNjaGVtYXMucHVzaChbXSk7XHJcblx0XHRcdH1cclxuXHRcdFx0c2Nhbm5lZEZyb3plblNjaGVtYUluZGV4ID0gdGhpcy5zY2FubmVkRnJvemVuU2NoZW1hc1tmcm96ZW5JbmRleF0ubGVuZ3RoO1xyXG5cdFx0XHR0aGlzLnNjYW5uZWRGcm96ZW5TY2hlbWFzW2Zyb3plbkluZGV4XVtzY2FubmVkRnJvemVuU2NoZW1hSW5kZXhdID0gc2NoZW1hO1xyXG5cdFx0XHR0aGlzLnNjYW5uZWRGcm96ZW5WYWxpZGF0aW9uRXJyb3JzW2Zyb3plbkluZGV4XVtzY2FubmVkRnJvemVuU2NoZW1hSW5kZXhdID0gW107XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAoIWRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XSkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0YSwgdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5LCB7XHJcblx0XHRcdFx0XHRcdHZhbHVlOiBbXSxcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRhLCB0aGlzLnZhbGlkYXRpb25FcnJvcnNLZXksIHtcclxuXHRcdFx0XHRcdFx0dmFsdWU6IFtdLFxyXG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRcdC8vSUUgNy84IHdvcmthcm91bmRcclxuXHRcdFx0XHRcdGRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XSA9IFtdO1xyXG5cdFx0XHRcdFx0ZGF0YVt0aGlzLnZhbGlkYXRpb25FcnJvcnNLZXldID0gW107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHNjYW5uZWRTY2hlbWFzSW5kZXggPSBkYXRhW3RoaXMudmFsaWRhdGVkU2NoZW1hc0tleV0ubGVuZ3RoO1xyXG5cdFx0XHRkYXRhW3RoaXMudmFsaWRhdGVkU2NoZW1hc0tleV1bc2Nhbm5lZFNjaGVtYXNJbmRleF0gPSBzY2hlbWE7XHJcblx0XHRcdGRhdGFbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XVtzY2FubmVkU2NoZW1hc0luZGV4XSA9IFtdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dmFyIGVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIGVycm9yID0gdGhpcy52YWxpZGF0ZUJhc2ljKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU51bWVyaWMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlU3RyaW5nKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZUFycmF5KGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9iamVjdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVDb21iaW5hdGlvbnMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlSHlwZXJtZWRpYShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVGb3JtYXQoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlRGVmaW5lZEtleXdvcmRzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxuXHJcblx0aWYgKHRvcExldmVsKSB7XHJcblx0XHR3aGlsZSAodGhpcy5zY2FubmVkLmxlbmd0aCkge1xyXG5cdFx0XHR2YXIgaXRlbSA9IHRoaXMuc2Nhbm5lZC5wb3AoKTtcclxuXHRcdFx0ZGVsZXRlIGl0ZW1bdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XTtcclxuXHRcdH1cclxuXHRcdHRoaXMuc2Nhbm5lZEZyb3plbiA9IFtdO1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuU2NoZW1hcyA9IFtdO1xyXG5cdH1cclxuXHJcblx0aWYgKGVycm9yIHx8IGVycm9yQ291bnQgIT09IHRoaXMuZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0d2hpbGUgKChkYXRhUGF0aFBhcnRzICYmIGRhdGFQYXRoUGFydHMubGVuZ3RoKSB8fCAoc2NoZW1hUGF0aFBhcnRzICYmIHNjaGVtYVBhdGhQYXJ0cy5sZW5ndGgpKSB7XHJcblx0XHRcdHZhciBkYXRhUGFydCA9IChkYXRhUGF0aFBhcnRzICYmIGRhdGFQYXRoUGFydHMubGVuZ3RoKSA/IFwiXCIgKyBkYXRhUGF0aFBhcnRzLnBvcCgpIDogbnVsbDtcclxuXHRcdFx0dmFyIHNjaGVtYVBhcnQgPSAoc2NoZW1hUGF0aFBhcnRzICYmIHNjaGVtYVBhdGhQYXJ0cy5sZW5ndGgpID8gXCJcIiArIHNjaGVtYVBhdGhQYXJ0cy5wb3AoKSA6IG51bGw7XHJcblx0XHRcdGlmIChlcnJvcikge1xyXG5cdFx0XHRcdGVycm9yID0gZXJyb3IucHJlZml4V2l0aChkYXRhUGFydCwgc2NoZW1hUGFydCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5wcmVmaXhFcnJvcnMoZXJyb3JDb3VudCwgZGF0YVBhcnQsIHNjaGVtYVBhcnQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKHNjYW5uZWRGcm96ZW5TY2hlbWFJbmRleCAhPT0gbnVsbCkge1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuVmFsaWRhdGlvbkVycm9yc1tmcm96ZW5JbmRleF1bc2Nhbm5lZEZyb3plblNjaGVtYUluZGV4XSA9IHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCk7XHJcblx0fSBlbHNlIGlmIChzY2FubmVkU2NoZW1hc0luZGV4ICE9PSBudWxsKSB7XHJcblx0XHRkYXRhW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV1bc2Nhbm5lZFNjaGVtYXNJbmRleF0gPSB0aGlzLmVycm9ycy5zbGljZShzdGFydEVycm9yQ291bnQpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIChkYXRhLCBzY2hlbWEpIHtcclxuXHRpZiAodHlwZW9mIHNjaGVtYS5mb3JtYXQgIT09ICdzdHJpbmcnIHx8ICF0aGlzLmZvcm1hdFZhbGlkYXRvcnNbc2NoZW1hLmZvcm1hdF0pIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHR2YXIgZXJyb3JNZXNzYWdlID0gdGhpcy5mb3JtYXRWYWxpZGF0b3JzW3NjaGVtYS5mb3JtYXRdLmNhbGwobnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRpZiAodHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ251bWJlcicpIHtcclxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRk9STUFUX0NVU1RPTSwge21lc3NhZ2U6IGVycm9yTWVzc2FnZX0sICcnLCAnL2Zvcm1hdCcsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0fSBlbHNlIGlmIChlcnJvck1lc3NhZ2UgJiYgdHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRk9STUFUX0NVU1RPTSwge21lc3NhZ2U6IGVycm9yTWVzc2FnZS5tZXNzYWdlIHx8IFwiP1wifSwgZXJyb3JNZXNzYWdlLmRhdGFQYXRoIHx8ICcnLCBlcnJvck1lc3NhZ2Uuc2NoZW1hUGF0aCB8fCBcIi9mb3JtYXRcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlRGVmaW5lZEtleXdvcmRzID0gZnVuY3Rpb24gKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMuZGVmaW5lZEtleXdvcmRzKSB7XHJcblx0XHRpZiAodHlwZW9mIHNjaGVtYVtrZXldID09PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRjb250aW51ZTtcclxuXHRcdH1cclxuXHRcdHZhciB2YWxpZGF0aW9uRnVuY3Rpb25zID0gdGhpcy5kZWZpbmVkS2V5d29yZHNba2V5XTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdmFsaWRhdGlvbkZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgZnVuYyA9IHZhbGlkYXRpb25GdW5jdGlvbnNbaV07XHJcblx0XHRcdHZhciByZXN1bHQgPSBmdW5jKGRhdGEsIHNjaGVtYVtrZXldLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCk7XHJcblx0XHRcdGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuS0VZV09SRF9DVVNUT00sIHtrZXk6IGtleSwgbWVzc2FnZTogcmVzdWx0fSwgJycsICcnLCBudWxsLCBkYXRhLCBzY2hlbWEpLnByZWZpeFdpdGgobnVsbCwga2V5KTtcclxuXHRcdFx0fSBlbHNlIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHR2YXIgY29kZSA9IHJlc3VsdC5jb2RlO1xyXG5cdFx0XHRcdGlmICh0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRcdGlmICghRXJyb3JDb2Rlc1tjb2RlXSkge1xyXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuZGVmaW5lZCBlcnJvciBjb2RlICh1c2UgZGVmaW5lRXJyb3IpOiAnICsgY29kZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb2RlID0gRXJyb3JDb2Rlc1tjb2RlXTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb2RlICE9PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdFx0Y29kZSA9IEVycm9yQ29kZXMuS0VZV09SRF9DVVNUT007XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBtZXNzYWdlUGFyYW1zID0gKHR5cGVvZiByZXN1bHQubWVzc2FnZSA9PT0gJ29iamVjdCcpID8gcmVzdWx0Lm1lc3NhZ2UgOiB7a2V5OiBrZXksIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIHx8IFwiP1wifTtcclxuXHRcdFx0XHR2YXIgc2NoZW1hUGF0aCA9IHJlc3VsdC5zY2hlbWFQYXRoIHx8IChcIi9cIiArIGtleS5yZXBsYWNlKC9+L2csICd+MCcpLnJlcGxhY2UoL1xcLy9nLCAnfjEnKSk7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoY29kZSwgbWVzc2FnZVBhcmFtcywgcmVzdWx0LmRhdGFQYXRoIHx8IG51bGwsIHNjaGVtYVBhdGgsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5mdW5jdGlvbiByZWN1cnNpdmVDb21wYXJlKEEsIEIpIHtcclxuXHRpZiAoQSA9PT0gQikge1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cdGlmIChBICYmIEIgJiYgdHlwZW9mIEEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIEIgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdGlmIChBcnJheS5pc0FycmF5KEEpICE9PSBBcnJheS5pc0FycmF5KEIpKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShBKSkge1xyXG5cdFx0XHRpZiAoQS5sZW5ndGggIT09IEIubGVuZ3RoKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgQS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmICghcmVjdXJzaXZlQ29tcGFyZShBW2ldLCBCW2ldKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dmFyIGtleTtcclxuXHRcdFx0Zm9yIChrZXkgaW4gQSkge1xyXG5cdFx0XHRcdGlmIChCW2tleV0gPT09IHVuZGVmaW5lZCAmJiBBW2tleV0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGtleSBpbiBCKSB7XHJcblx0XHRcdFx0aWYgKEFba2V5XSA9PT0gdW5kZWZpbmVkICYmIEJba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAoa2V5IGluIEEpIHtcclxuXHRcdFx0XHRpZiAoIXJlY3Vyc2l2ZUNvbXBhcmUoQVtrZXldLCBCW2tleV0pKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblx0cmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUJhc2ljID0gZnVuY3Rpb24gdmFsaWRhdGVCYXNpYyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlVHlwZShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdHJldHVybiBlcnJvci5wcmVmaXhXaXRoKG51bGwsIFwidHlwZVwiKTtcclxuXHR9XHJcblx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUVudW0oZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpKSB7XHJcblx0XHRyZXR1cm4gZXJyb3IucHJlZml4V2l0aChudWxsLCBcInR5cGVcIik7XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVUeXBlID0gZnVuY3Rpb24gdmFsaWRhdGVUeXBlKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmIChzY2hlbWEudHlwZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGRhdGFUeXBlID0gdHlwZW9mIGRhdGE7XHJcblx0aWYgKGRhdGEgPT09IG51bGwpIHtcclxuXHRcdGRhdGFUeXBlID0gXCJudWxsXCI7XHJcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcblx0XHRkYXRhVHlwZSA9IFwiYXJyYXlcIjtcclxuXHR9XHJcblx0dmFyIGFsbG93ZWRUeXBlcyA9IHNjaGVtYS50eXBlO1xyXG5cdGlmICghQXJyYXkuaXNBcnJheShhbGxvd2VkVHlwZXMpKSB7XHJcblx0XHRhbGxvd2VkVHlwZXMgPSBbYWxsb3dlZFR5cGVzXTtcclxuXHR9XHJcblxyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYWxsb3dlZFR5cGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgdHlwZSA9IGFsbG93ZWRUeXBlc1tpXTtcclxuXHRcdGlmICh0eXBlID09PSBkYXRhVHlwZSB8fCAodHlwZSA9PT0gXCJpbnRlZ2VyXCIgJiYgZGF0YVR5cGUgPT09IFwibnVtYmVyXCIgJiYgKGRhdGEgJSAxID09PSAwKSkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuSU5WQUxJRF9UWVBFLCB7dHlwZTogZGF0YVR5cGUsIGV4cGVjdGVkOiBhbGxvd2VkVHlwZXMuam9pbihcIi9cIil9LCAnJywgJycsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUVudW0gPSBmdW5jdGlvbiB2YWxpZGF0ZUVudW0oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHNjaGVtYVtcImVudW1cIl0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hW1wiZW51bVwiXS5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIGVudW1WYWwgPSBzY2hlbWFbXCJlbnVtXCJdW2ldO1xyXG5cdFx0aWYgKHJlY3Vyc2l2ZUNvbXBhcmUoZGF0YSwgZW51bVZhbCkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRU5VTV9NSVNNQVRDSCwge3ZhbHVlOiAodHlwZW9mIEpTT04gIT09ICd1bmRlZmluZWQnKSA/IEpTT04uc3RyaW5naWZ5KGRhdGEpIDogZGF0YX0sICcnLCAnJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTnVtZXJpYyA9IGZ1bmN0aW9uIHZhbGlkYXRlTnVtZXJpYyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHJldHVybiB0aGlzLnZhbGlkYXRlTXVsdGlwbGVPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVNaW5NYXgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlTmFOKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcbnZhciBDTE9TRV9FTk9VR0hfTE9XID0gTWF0aC5wb3coMiwgLTUxKTtcclxudmFyIENMT1NFX0VOT1VHSF9ISUdIID0gMSAtIENMT1NFX0VOT1VHSF9MT1c7XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTXVsdGlwbGVPZiA9IGZ1bmN0aW9uIHZhbGlkYXRlTXVsdGlwbGVPZihkYXRhLCBzY2hlbWEpIHtcclxuXHR2YXIgbXVsdGlwbGVPZiA9IHNjaGVtYS5tdWx0aXBsZU9mIHx8IHNjaGVtYS5kaXZpc2libGVCeTtcclxuXHRpZiAobXVsdGlwbGVPZiA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiKSB7XHJcblx0XHR2YXIgcmVtYWluZGVyID0gKGRhdGEvbXVsdGlwbGVPZiklMTtcclxuXHRcdGlmIChyZW1haW5kZXIgPj0gQ0xPU0VfRU5PVUdIX0xPVyAmJiByZW1haW5kZXIgPCBDTE9TRV9FTk9VR0hfSElHSCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5VTUJFUl9NVUxUSVBMRV9PRiwge3ZhbHVlOiBkYXRhLCBtdWx0aXBsZU9mOiBtdWx0aXBsZU9mfSwgJycsICcnLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTWluTWF4ID0gZnVuY3Rpb24gdmFsaWRhdGVNaW5NYXgoZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKHNjaGVtYS5taW5pbXVtICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhIDwgc2NoZW1hLm1pbmltdW0pIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5OVU1CRVJfTUlOSU1VTSwge3ZhbHVlOiBkYXRhLCBtaW5pbXVtOiBzY2hlbWEubWluaW11bX0sICcnLCAnL21pbmltdW0nLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICYmIGRhdGEgPT09IHNjaGVtYS5taW5pbXVtKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuTlVNQkVSX01JTklNVU1fRVhDTFVTSVZFLCB7dmFsdWU6IGRhdGEsIG1pbmltdW06IHNjaGVtYS5taW5pbXVtfSwgJycsICcvZXhjbHVzaXZlTWluaW11bScsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWF4aW11bSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRpZiAoZGF0YSA+IHNjaGVtYS5tYXhpbXVtKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuTlVNQkVSX01BWElNVU0sIHt2YWx1ZTogZGF0YSwgbWF4aW11bTogc2NoZW1hLm1heGltdW19LCAnJywgJy9tYXhpbXVtJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdH1cclxuXHRcdGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAmJiBkYXRhID09PSBzY2hlbWEubWF4aW11bSkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5VTUJFUl9NQVhJTVVNX0VYQ0xVU0lWRSwge3ZhbHVlOiBkYXRhLCBtYXhpbXVtOiBzY2hlbWEubWF4aW11bX0sICcnLCAnL2V4Y2x1c2l2ZU1heGltdW0nLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTmFOID0gZnVuY3Rpb24gdmFsaWRhdGVOYU4oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKGlzTmFOKGRhdGEpID09PSB0cnVlIHx8IGRhdGEgPT09IEluZmluaXR5IHx8IGRhdGEgPT09IC1JbmZpbml0eSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5OVU1CRVJfTk9UX0FfTlVNQkVSLCB7dmFsdWU6IGRhdGF9LCAnJywgJy90eXBlJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZyA9IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0cmV0dXJuIHRoaXMudmFsaWRhdGVTdHJpbmdMZW5ndGgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlU3RyaW5nUGF0dGVybihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZ0xlbmd0aCA9IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nTGVuZ3RoKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWluTGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA8IHNjaGVtYS5taW5MZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5TVFJJTkdfTEVOR1RIX1NIT1JULCB7bGVuZ3RoOiBkYXRhLmxlbmd0aCwgbWluaW11bTogc2NoZW1hLm1pbkxlbmd0aH0sICcnLCAnL21pbkxlbmd0aCcsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA+IHNjaGVtYS5tYXhMZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5TVFJJTkdfTEVOR1RIX0xPTkcsIHtsZW5ndGg6IGRhdGEubGVuZ3RoLCBtYXhpbXVtOiBzY2hlbWEubWF4TGVuZ3RofSwgJycsICcvbWF4TGVuZ3RoJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZ1BhdHRlcm4gPSBmdW5jdGlvbiB2YWxpZGF0ZVN0cmluZ1BhdHRlcm4oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8ICh0eXBlb2Ygc2NoZW1hLnBhdHRlcm4gIT09IFwic3RyaW5nXCIgJiYgIShzY2hlbWEucGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkpKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIHJlZ2V4cDtcclxuXHRpZiAoc2NoZW1hLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcclxuXHQgIHJlZ2V4cCA9IHNjaGVtYS5wYXR0ZXJuO1xyXG5cdH1cclxuXHRlbHNlIHtcclxuXHQgIHZhciBib2R5LCBmbGFncyA9ICcnO1xyXG5cdCAgLy8gQ2hlY2sgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsc1xyXG5cdCAgLy8gQHNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtNy44LjVcclxuXHQgIHZhciBsaXRlcmFsID0gc2NoZW1hLnBhdHRlcm4ubWF0Y2goL15cXC8oLispXFwvKFtpbWddKikkLyk7XHJcblx0ICBpZiAobGl0ZXJhbCkge1xyXG5cdCAgICBib2R5ID0gbGl0ZXJhbFsxXTtcclxuXHQgICAgZmxhZ3MgPSBsaXRlcmFsWzJdO1xyXG5cdCAgfVxyXG5cdCAgZWxzZSB7XHJcblx0ICAgIGJvZHkgPSBzY2hlbWEucGF0dGVybjtcclxuXHQgIH1cclxuXHQgIHJlZ2V4cCA9IG5ldyBSZWdFeHAoYm9keSwgZmxhZ3MpO1xyXG5cdH1cclxuXHRpZiAoIXJlZ2V4cC50ZXN0KGRhdGEpKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLlNUUklOR19QQVRURVJOLCB7cGF0dGVybjogc2NoZW1hLnBhdHRlcm59LCAnJywgJy9wYXR0ZXJuJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFycmF5ID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLnZhbGlkYXRlQXJyYXlMZW5ndGgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlQXJyYXlVbmlxdWVJdGVtcyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVBcnJheUl0ZW1zKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQXJyYXlMZW5ndGggPSBmdW5jdGlvbiB2YWxpZGF0ZUFycmF5TGVuZ3RoKGRhdGEsIHNjaGVtYSkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoc2NoZW1hLm1pbkl0ZW1zICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA8IHNjaGVtYS5taW5JdGVtcykge1xyXG5cdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9MRU5HVEhfU0hPUlQsIHtsZW5ndGg6IGRhdGEubGVuZ3RoLCBtaW5pbXVtOiBzY2hlbWEubWluSXRlbXN9LCAnJywgJy9taW5JdGVtcycsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRpZiAoc2NoZW1hLm1heEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA+IHNjaGVtYS5tYXhJdGVtcykge1xyXG5cdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9MRU5HVEhfTE9ORywge2xlbmd0aDogZGF0YS5sZW5ndGgsIG1heGltdW06IHNjaGVtYS5tYXhJdGVtc30sICcnLCAnL21heEl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVBcnJheVVuaXF1ZUl0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheVVuaXF1ZUl0ZW1zKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmIChzY2hlbWEudW5pcXVlSXRlbXMpIHtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRmb3IgKHZhciBqID0gaSArIDE7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0aWYgKHJlY3Vyc2l2ZUNvbXBhcmUoZGF0YVtpXSwgZGF0YVtqXSkpIHtcclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9VTklRVUUsIHttYXRjaDE6IGksIG1hdGNoMjogan0sICcnLCAnL3VuaXF1ZUl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVBcnJheUl0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheUl0ZW1zKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0aWYgKHNjaGVtYS5pdGVtcyA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9yLCBpO1xyXG5cdGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmIChpIDwgc2NoZW1hLml0ZW1zLmxlbmd0aCkge1xyXG5cdFx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YVtpXSwgc2NoZW1hLml0ZW1zW2ldLCBbaV0sIFtcIml0ZW1zXCIsIGldLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcclxuXHRcdFx0XHRcdGlmICghc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykge1xyXG5cdFx0XHRcdFx0XHRlcnJvciA9ICh0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuQVJSQVlfQURESVRJT05BTF9JVEVNUywge30sICcvJyArIGksICcvYWRkaXRpb25hbEl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKSk7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFbaV0sIHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMsIFtpXSwgW1wiYWRkaXRpb25hbEl0ZW1zXCJdLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YVtpXSwgc2NoZW1hLml0ZW1zLCBbaV0sIFtcIml0ZW1zXCJdLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVPYmplY3QgPSBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICh0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBkYXRhID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHRyZXR1cm4gdGhpcy52YWxpZGF0ZU9iamVjdE1pbk1heFByb3BlcnRpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlT2JqZWN0UmVxdWlyZWRQcm9wZXJ0aWVzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9iamVjdFByb3BlcnRpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlT2JqZWN0RGVwZW5kZW5jaWVzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0TWluTWF4UHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0TWluTWF4UHJvcGVydGllcyhkYXRhLCBzY2hlbWEpIHtcclxuXHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoc2NoZW1hLm1pblByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0aWYgKGtleXMubGVuZ3RoIDwgc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcclxuXHRcdFx0ZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuT0JKRUNUX1BST1BFUlRJRVNfTUlOSU1VTSwge3Byb3BlcnR5Q291bnQ6IGtleXMubGVuZ3RoLCBtaW5pbXVtOiBzY2hlbWEubWluUHJvcGVydGllc30sICcnLCAnL21pblByb3BlcnRpZXMnLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHRpZiAodGhpcy5oYW5kbGVFcnJvcihlcnJvcikpIHtcclxuXHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHNjaGVtYS5tYXhQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChrZXlzLmxlbmd0aCA+IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XHJcblx0XHRcdGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9CSkVDVF9QUk9QRVJUSUVTX01BWElNVU0sIHtwcm9wZXJ0eUNvdW50OiBrZXlzLmxlbmd0aCwgbWF4aW11bTogc2NoZW1hLm1heFByb3BlcnRpZXN9LCAnJywgJy9tYXhQcm9wZXJ0aWVzJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVPYmplY3RSZXF1aXJlZFByb3BlcnRpZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdFJlcXVpcmVkUHJvcGVydGllcyhkYXRhLCBzY2hlbWEpIHtcclxuXHRpZiAoc2NoZW1hLnJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHZhciBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XHJcblx0XHRcdGlmIChkYXRhW2tleV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdHZhciBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PQkpFQ1RfUkVRVUlSRUQsIHtrZXk6IGtleX0sICcnLCAnL3JlcXVpcmVkLycgKyBpLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0UHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0UHJvcGVydGllcyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xyXG5cdFx0dmFyIGtleVBvaW50ZXJQYXRoID0gZGF0YVBvaW50ZXJQYXRoICsgXCIvXCIgKyBrZXkucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XHJcblx0XHR2YXIgZm91bmRNYXRjaCA9IGZhbHNlO1xyXG5cdFx0aWYgKHNjaGVtYS5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLnByb3BlcnRpZXNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGZvdW5kTWF0Y2ggPSB0cnVlO1xyXG5cdFx0XHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFba2V5XSwgc2NoZW1hLnByb3BlcnRpZXNba2V5XSwgW2tleV0sIFtcInByb3BlcnRpZXNcIiwga2V5XSwga2V5UG9pbnRlclBhdGgpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0Zm9yICh2YXIgcGF0dGVybktleSBpbiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHR2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cChwYXR0ZXJuS2V5KTtcclxuXHRcdFx0XHRpZiAocmVnZXhwLnRlc3Qoa2V5KSkge1xyXG5cdFx0XHRcdFx0Zm91bmRNYXRjaCA9IHRydWU7XHJcblx0XHRcdFx0XHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFba2V5XSwgc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5LZXldLCBba2V5XSwgW1wicGF0dGVyblByb3BlcnRpZXNcIiwgcGF0dGVybktleV0sIGtleVBvaW50ZXJQYXRoKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoIWZvdW5kTWF0Y2gpIHtcclxuXHRcdFx0aWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0XHRcdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzW2tleVBvaW50ZXJQYXRoXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKHR5cGVvZiBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiKSB7XHJcblx0XHRcdFx0XHRpZiAoIXNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcykge1xyXG5cdFx0XHRcdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PQkpFQ1RfQURESVRJT05BTF9QUk9QRVJUSUVTLCB7a2V5OiBrZXl9LCAnJywgJy9hZGRpdGlvbmFsUHJvcGVydGllcycsIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChrZXksIG51bGwpO1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5oYW5kbGVFcnJvcihlcnJvcikpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhW2tleV0sIHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcywgW2tleV0sIFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdLCBrZXlQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMgJiYgIXRoaXMua25vd25Qcm9wZXJ0eVBhdGhzW2tleVBvaW50ZXJQYXRoXSkge1xyXG5cdFx0XHRcdHRoaXMudW5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0ZGVsZXRlIHRoaXMudW5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0RGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gdmFsaWRhdGVPYmplY3REZXBlbmRlbmNpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHR2YXIgZXJyb3I7XHJcblx0aWYgKHNjaGVtYS5kZXBlbmRlbmNpZXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0Zm9yICh2YXIgZGVwS2V5IGluIHNjaGVtYS5kZXBlbmRlbmNpZXMpIHtcclxuXHRcdFx0aWYgKGRhdGFbZGVwS2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0dmFyIGRlcCA9IHNjaGVtYS5kZXBlbmRlbmNpZXNbZGVwS2V5XTtcclxuXHRcdFx0XHRpZiAodHlwZW9mIGRlcCA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdFx0aWYgKGRhdGFbZGVwXSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9CSkVDVF9ERVBFTkRFTkNZX0tFWSwge2tleTogZGVwS2V5LCBtaXNzaW5nOiBkZXB9LCAnJywgJycsIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChudWxsLCBkZXBLZXkpLnByZWZpeFdpdGgobnVsbCwgXCJkZXBlbmRlbmNpZXNcIik7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkZXApKSB7XHJcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHR2YXIgcmVxdWlyZWRLZXkgPSBkZXBbaV07XHJcblx0XHRcdFx0XHRcdGlmIChkYXRhW3JlcXVpcmVkS2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0ZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuT0JKRUNUX0RFUEVOREVOQ1lfS0VZLCB7a2V5OiBkZXBLZXksIG1pc3Npbmc6IHJlcXVpcmVkS2V5fSwgJycsICcvJyArIGksIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChudWxsLCBkZXBLZXkpLnByZWZpeFdpdGgobnVsbCwgXCJkZXBlbmRlbmNpZXNcIik7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgZGVwLCBbXSwgW1wiZGVwZW5kZW5jaWVzXCIsIGRlcEtleV0sIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQ29tYmluYXRpb25zID0gZnVuY3Rpb24gdmFsaWRhdGVDb21iaW5hdGlvbnMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHRyZXR1cm4gdGhpcy52YWxpZGF0ZUFsbE9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZUFueU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9uZU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU5vdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFsbE9mID0gZnVuY3Rpb24gdmFsaWRhdGVBbGxPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmIChzY2hlbWEuYWxsT2YgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHZhciBlcnJvcjtcclxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5hbGxPZi5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5hbGxPZltpXTtcclxuXHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgc3ViU2NoZW1hLCBbXSwgW1wiYWxsT2ZcIiwgaV0sIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQW55T2YgPSBmdW5jdGlvbiB2YWxpZGF0ZUFueU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0aWYgKHNjaGVtYS5hbnlPZiA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciBzdGFydEVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzLCBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0b2xkVW5rbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzID0gdGhpcy5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdHZhciBlcnJvckF0RW5kID0gdHJ1ZTtcclxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5hbnlPZi5sZW5ndGg7IGkrKykge1xyXG5cdFx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0XHR0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHRcdHRoaXMua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHR9XHJcblx0XHR2YXIgc3ViU2NoZW1hID0gc2NoZW1hLmFueU9mW2ldO1xyXG5cclxuXHRcdHZhciBlcnJvckNvdW50ID0gdGhpcy5lcnJvcnMubGVuZ3RoO1xyXG5cdFx0dmFyIGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhLCBzdWJTY2hlbWEsIFtdLCBbXCJhbnlPZlwiLCBpXSwgZGF0YVBvaW50ZXJQYXRoKTtcclxuXHJcblx0XHRpZiAoZXJyb3IgPT09IG51bGwgJiYgZXJyb3JDb3VudCA9PT0gdGhpcy5lcnJvcnMubGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgc3RhcnRFcnJvckNvdW50KTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBrbm93bktleSBpbiB0aGlzLmtub3duUHJvcGVydHlQYXRocykge1xyXG5cdFx0XHRcdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzW2tub3duS2V5XSA9IHRydWU7XHJcblx0XHRcdFx0XHRkZWxldGUgb2xkVW5rbm93blByb3BlcnR5UGF0aHNba25vd25LZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmb3IgKHZhciB1bmtub3duS2V5IGluIHRoaXMudW5rbm93blByb3BlcnR5UGF0aHMpIHtcclxuXHRcdFx0XHRcdGlmICghb2xkS25vd25Qcm9wZXJ0eVBhdGhzW3Vua25vd25LZXldKSB7XHJcblx0XHRcdFx0XHRcdG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzW3Vua25vd25LZXldID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBjb250aW51ZSBsb29waW5nIHNvIHdlIGNhdGNoIGFsbCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHJldHVybiBhbiBlcnJvclxyXG5cdFx0XHRcdGVycm9yQXRFbmQgPSBmYWxzZTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRpZiAoZXJyb3IpIHtcclxuXHRcdFx0ZXJyb3JzLnB1c2goZXJyb3IucHJlZml4V2l0aChudWxsLCBcIlwiICsgaSkucHJlZml4V2l0aChudWxsLCBcImFueU9mXCIpKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmIChlcnJvckF0RW5kKSB7XHJcblx0XHRlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCkpO1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BTllfT0ZfTUlTU0lORywge30sIFwiXCIsIFwiL2FueU9mXCIsIGVycm9ycywgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZU9uZU9mID0gZnVuY3Rpb24gdmFsaWRhdGVPbmVPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmIChzY2hlbWEub25lT2YgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHZhciB2YWxpZEluZGV4ID0gbnVsbDtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHN0YXJ0RXJyb3JDb3VudCA9IHRoaXMuZXJyb3JzLmxlbmd0aDtcclxuXHR2YXIgb2xkVW5rbm93blByb3BlcnR5UGF0aHMsIG9sZEtub3duUHJvcGVydHlQYXRocztcclxuXHRpZiAodGhpcy50cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRvbGRVbmtub3duUHJvcGVydHlQYXRocyA9IHRoaXMudW5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0XHRvbGRLbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLmtub3duUHJvcGVydHlQYXRocztcclxuXHR9XHJcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlbWEub25lT2YubGVuZ3RoOyBpKyspIHtcclxuXHRcdGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdFx0XHR0aGlzLmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdFx0fVxyXG5cdFx0dmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5vbmVPZltpXTtcclxuXHJcblx0XHR2YXIgZXJyb3JDb3VudCA9IHRoaXMuZXJyb3JzLmxlbmd0aDtcclxuXHRcdHZhciBlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgc3ViU2NoZW1hLCBbXSwgW1wib25lT2ZcIiwgaV0sIGRhdGFQb2ludGVyUGF0aCk7XHJcblxyXG5cdFx0aWYgKGVycm9yID09PSBudWxsICYmIGVycm9yQ291bnQgPT09IHRoaXMuZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRpZiAodmFsaWRJbmRleCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdHZhbGlkSW5kZXggPSBpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgc3RhcnRFcnJvckNvdW50KTtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9ORV9PRl9NVUxUSVBMRSwge2luZGV4MTogdmFsaWRJbmRleCwgaW5kZXgyOiBpfSwgXCJcIiwgXCIvb25lT2ZcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy50cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRcdFx0Zm9yICh2YXIga25vd25LZXkgaW4gdGhpcy5rbm93blByb3BlcnR5UGF0aHMpIHtcclxuXHRcdFx0XHRcdG9sZEtub3duUHJvcGVydHlQYXRoc1trbm93bktleV0gPSB0cnVlO1xyXG5cdFx0XHRcdFx0ZGVsZXRlIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzW2tub3duS2V5XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Zm9yICh2YXIgdW5rbm93bktleSBpbiB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzKSB7XHJcblx0XHRcdFx0XHRpZiAoIW9sZEtub3duUHJvcGVydHlQYXRoc1t1bmtub3duS2V5XSkge1xyXG5cdFx0XHRcdFx0XHRvbGRVbmtub3duUHJvcGVydHlQYXRoc1t1bmtub3duS2V5XSA9IHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGVycm9yKSB7XHJcblx0XHRcdGVycm9ycy5wdXNoKGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmICh2YWxpZEluZGV4ID09PSBudWxsKSB7XHJcblx0XHRlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCkpO1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PTkVfT0ZfTUlTU0lORywge30sIFwiXCIsIFwiL29uZU9mXCIsIGVycm9ycywgZGF0YSwgc2NoZW1hKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTm90ID0gZnVuY3Rpb24gdmFsaWRhdGVOb3QoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHRpZiAoc2NoZW1hLm5vdCA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIG9sZEVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzLCBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0b2xkVW5rbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzID0gdGhpcy5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0XHR0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHR0aGlzLmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdH1cclxuXHR2YXIgZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGEsIHNjaGVtYS5ub3QsIG51bGwsIG51bGwsIGRhdGFQb2ludGVyUGF0aCk7XHJcblx0dmFyIG5vdEVycm9ycyA9IHRoaXMuZXJyb3JzLnNsaWNlKG9sZEVycm9yQ291bnQpO1xyXG5cdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgb2xkRXJyb3JDb3VudCk7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmIChlcnJvciA9PT0gbnVsbCAmJiBub3RFcnJvcnMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5PVF9QQVNTRUQsIHt9LCBcIlwiLCBcIi9ub3RcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUh5cGVybWVkaWEgPSBmdW5jdGlvbiB2YWxpZGF0ZUNvbWJpbmF0aW9ucyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICghc2NoZW1hLmxpbmtzKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9yO1xyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hLmxpbmtzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgbGRvID0gc2NoZW1hLmxpbmtzW2ldO1xyXG5cdFx0aWYgKGxkby5yZWwgPT09IFwiZGVzY3JpYmVkYnlcIikge1xyXG5cdFx0XHR2YXIgdGVtcGxhdGUgPSBuZXcgVXJpVGVtcGxhdGUobGRvLmhyZWYpO1xyXG5cdFx0XHR2YXIgYWxsUHJlc2VudCA9IHRydWU7XHJcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdGVtcGxhdGUudmFyTmFtZXMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRpZiAoISh0ZW1wbGF0ZS52YXJOYW1lc1tqXSBpbiBkYXRhKSkge1xyXG5cdFx0XHRcdFx0YWxsUHJlc2VudCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChhbGxQcmVzZW50KSB7XHJcblx0XHRcdFx0dmFyIHNjaGVtYVVybCA9IHRlbXBsYXRlLmZpbGxGcm9tT2JqZWN0KGRhdGEpO1xyXG5cdFx0XHRcdHZhciBzdWJTY2hlbWEgPSB7XCIkcmVmXCI6IHNjaGVtYVVybH07XHJcblx0XHRcdFx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhLCBzdWJTY2hlbWEsIFtdLCBbXCJsaW5rc1wiLCBpXSwgZGF0YVBvaW50ZXJQYXRoKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbi8vIHBhcnNlVVJJKCkgYW5kIHJlc29sdmVVcmwoKSBhcmUgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xMDg4ODUwXHJcbi8vICAgLSAgcmVsZWFzZWQgYXMgcHVibGljIGRvbWFpbiBieSBhdXRob3IgKFwiWWFmZmxlXCIpIC0gc2VlIGNvbW1lbnRzIG9uIGdpc3RcclxuXHJcbmZ1bmN0aW9uIHBhcnNlVVJJKHVybCkge1xyXG5cdHZhciBtID0gU3RyaW5nKHVybCkucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpLm1hdGNoKC9eKFteOlxcLz8jXSs6KT8oXFwvXFwvKD86W146QF0qKD86OlteOkBdKik/QCk/KChbXjpcXC8/I10qKSg/OjooXFxkKikpPykpPyhbXj8jXSopKFxcP1teI10qKT8oI1tcXHNcXFNdKik/Lyk7XHJcblx0Ly8gYXV0aG9yaXR5ID0gJy8vJyArIHVzZXIgKyAnOicgKyBwYXNzICdAJyArIGhvc3RuYW1lICsgJzonIHBvcnRcclxuXHRyZXR1cm4gKG0gPyB7XHJcblx0XHRocmVmICAgICA6IG1bMF0gfHwgJycsXHJcblx0XHRwcm90b2NvbCA6IG1bMV0gfHwgJycsXHJcblx0XHRhdXRob3JpdHk6IG1bMl0gfHwgJycsXHJcblx0XHRob3N0ICAgICA6IG1bM10gfHwgJycsXHJcblx0XHRob3N0bmFtZSA6IG1bNF0gfHwgJycsXHJcblx0XHRwb3J0ICAgICA6IG1bNV0gfHwgJycsXHJcblx0XHRwYXRobmFtZSA6IG1bNl0gfHwgJycsXHJcblx0XHRzZWFyY2ggICA6IG1bN10gfHwgJycsXHJcblx0XHRoYXNoICAgICA6IG1bOF0gfHwgJydcclxuXHR9IDogbnVsbCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVVcmwoYmFzZSwgaHJlZikgey8vIFJGQyAzOTg2XHJcblxyXG5cdGZ1bmN0aW9uIHJlbW92ZURvdFNlZ21lbnRzKGlucHV0KSB7XHJcblx0XHR2YXIgb3V0cHV0ID0gW107XHJcblx0XHRpbnB1dC5yZXBsYWNlKC9eKFxcLlxcLj8oXFwvfCQpKSsvLCAnJylcclxuXHRcdFx0LnJlcGxhY2UoL1xcLyhcXC4oXFwvfCQpKSsvZywgJy8nKVxyXG5cdFx0XHQucmVwbGFjZSgvXFwvXFwuXFwuJC8sICcvLi4vJylcclxuXHRcdFx0LnJlcGxhY2UoL1xcLz9bXlxcL10qL2csIGZ1bmN0aW9uIChwKSB7XHJcblx0XHRcdFx0aWYgKHAgPT09ICcvLi4nKSB7XHJcblx0XHRcdFx0XHRvdXRwdXQucG9wKCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHApO1xyXG5cdFx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKS5yZXBsYWNlKC9eXFwvLywgaW5wdXQuY2hhckF0KDApID09PSAnLycgPyAnLycgOiAnJyk7XHJcblx0fVxyXG5cclxuXHRocmVmID0gcGFyc2VVUkkoaHJlZiB8fCAnJyk7XHJcblx0YmFzZSA9IHBhcnNlVVJJKGJhc2UgfHwgJycpO1xyXG5cclxuXHRyZXR1cm4gIWhyZWYgfHwgIWJhc2UgPyBudWxsIDogKGhyZWYucHJvdG9jb2wgfHwgYmFzZS5wcm90b2NvbCkgK1xyXG5cdFx0KGhyZWYucHJvdG9jb2wgfHwgaHJlZi5hdXRob3JpdHkgPyBocmVmLmF1dGhvcml0eSA6IGJhc2UuYXV0aG9yaXR5KSArXHJcblx0XHRyZW1vdmVEb3RTZWdtZW50cyhocmVmLnByb3RvY29sIHx8IGhyZWYuYXV0aG9yaXR5IHx8IGhyZWYucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycgPyBocmVmLnBhdGhuYW1lIDogKGhyZWYucGF0aG5hbWUgPyAoKGJhc2UuYXV0aG9yaXR5ICYmICFiYXNlLnBhdGhuYW1lID8gJy8nIDogJycpICsgYmFzZS5wYXRobmFtZS5zbGljZSgwLCBiYXNlLnBhdGhuYW1lLmxhc3RJbmRleE9mKCcvJykgKyAxKSArIGhyZWYucGF0aG5hbWUpIDogYmFzZS5wYXRobmFtZSkpICtcclxuXHRcdChocmVmLnByb3RvY29sIHx8IGhyZWYuYXV0aG9yaXR5IHx8IGhyZWYucGF0aG5hbWUgPyBocmVmLnNlYXJjaCA6IChocmVmLnNlYXJjaCB8fCBiYXNlLnNlYXJjaCkpICtcclxuXHRcdGhyZWYuaGFzaDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRVcmkodXJpKSB7XHJcblx0cmV0dXJuIHVyaS5zcGxpdCgnIycpWzBdO1xyXG59XHJcbmZ1bmN0aW9uIG5vcm1TY2hlbWEoc2NoZW1hLCBiYXNlVXJpKSB7XHJcblx0aWYgKHNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiKSB7XHJcblx0XHRpZiAoYmFzZVVyaSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGJhc2VVcmkgPSBzY2hlbWEuaWQ7XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzY2hlbWEuaWQgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0YmFzZVVyaSA9IHJlc29sdmVVcmwoYmFzZVVyaSwgc2NoZW1hLmlkKTtcclxuXHRcdFx0c2NoZW1hLmlkID0gYmFzZVVyaTtcclxuXHRcdH1cclxuXHRcdGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcclxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRub3JtU2NoZW1hKHNjaGVtYVtpXSwgYmFzZVVyaSk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hWyckcmVmJ10gPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRzY2hlbWFbJyRyZWYnXSA9IHJlc29sdmVVcmwoYmFzZVVyaSwgc2NoZW1hWyckcmVmJ10pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAodmFyIGtleSBpbiBzY2hlbWEpIHtcclxuXHRcdFx0XHRpZiAoa2V5ICE9PSBcImVudW1cIikge1xyXG5cdFx0XHRcdFx0bm9ybVNjaGVtYShzY2hlbWFba2V5XSwgYmFzZVVyaSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JSZXBvcnRlcihsYW5ndWFnZSkge1xyXG5cdGxhbmd1YWdlID0gbGFuZ3VhZ2UgfHwgJ2VuJztcclxuXHJcblx0dmFyIGVycm9yTWVzc2FnZXMgPSBsYW5ndWFnZXNbbGFuZ3VhZ2VdO1xyXG5cclxuXHRyZXR1cm4gZnVuY3Rpb24gKGVycm9yKSB7XHJcblx0XHR2YXIgbWVzc2FnZVRlbXBsYXRlID0gZXJyb3JNZXNzYWdlc1tlcnJvci5jb2RlXSB8fCBFcnJvck1lc3NhZ2VzRGVmYXVsdFtlcnJvci5jb2RlXTtcclxuXHRcdGlmICh0eXBlb2YgbWVzc2FnZVRlbXBsYXRlICE9PSAnc3RyaW5nJykge1xyXG5cdFx0XHRyZXR1cm4gXCJVbmtub3duIGVycm9yIGNvZGUgXCIgKyBlcnJvci5jb2RlICsgXCI6IFwiICsgSlNPTi5zdHJpbmdpZnkoZXJyb3IubWVzc2FnZVBhcmFtcyk7XHJcblx0XHR9XHJcblx0XHR2YXIgbWVzc2FnZVBhcmFtcyA9IGVycm9yLnBhcmFtcztcclxuXHRcdC8vIEFkYXB0ZWQgZnJvbSBDcm9ja2ZvcmQncyBzdXBwbGFudCgpXHJcblx0XHRyZXR1cm4gbWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoL1xceyhbXnt9XSopXFx9L2csIGZ1bmN0aW9uICh3aG9sZSwgdmFyTmFtZSkge1xyXG5cdFx0XHR2YXIgc3ViVmFsdWUgPSBtZXNzYWdlUGFyYW1zW3Zhck5hbWVdO1xyXG5cdFx0XHRyZXR1cm4gdHlwZW9mIHN1YlZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygc3ViVmFsdWUgPT09ICdudW1iZXInID8gc3ViVmFsdWUgOiB3aG9sZTtcclxuXHRcdH0pO1xyXG5cdH07XHJcbn1cclxuXHJcbnZhciBFcnJvckNvZGVzID0ge1xyXG5cdElOVkFMSURfVFlQRTogMCxcclxuXHRFTlVNX01JU01BVENIOiAxLFxyXG5cdEFOWV9PRl9NSVNTSU5HOiAxMCxcclxuXHRPTkVfT0ZfTUlTU0lORzogMTEsXHJcblx0T05FX09GX01VTFRJUExFOiAxMixcclxuXHROT1RfUEFTU0VEOiAxMyxcclxuXHQvLyBOdW1lcmljIGVycm9yc1xyXG5cdE5VTUJFUl9NVUxUSVBMRV9PRjogMTAwLFxyXG5cdE5VTUJFUl9NSU5JTVVNOiAxMDEsXHJcblx0TlVNQkVSX01JTklNVU1fRVhDTFVTSVZFOiAxMDIsXHJcblx0TlVNQkVSX01BWElNVU06IDEwMyxcclxuXHROVU1CRVJfTUFYSU1VTV9FWENMVVNJVkU6IDEwNCxcclxuXHROVU1CRVJfTk9UX0FfTlVNQkVSOiAxMDUsXHJcblx0Ly8gU3RyaW5nIGVycm9yc1xyXG5cdFNUUklOR19MRU5HVEhfU0hPUlQ6IDIwMCxcclxuXHRTVFJJTkdfTEVOR1RIX0xPTkc6IDIwMSxcclxuXHRTVFJJTkdfUEFUVEVSTjogMjAyLFxyXG5cdC8vIE9iamVjdCBlcnJvcnNcclxuXHRPQkpFQ1RfUFJPUEVSVElFU19NSU5JTVVNOiAzMDAsXHJcblx0T0JKRUNUX1BST1BFUlRJRVNfTUFYSU1VTTogMzAxLFxyXG5cdE9CSkVDVF9SRVFVSVJFRDogMzAyLFxyXG5cdE9CSkVDVF9BRERJVElPTkFMX1BST1BFUlRJRVM6IDMwMyxcclxuXHRPQkpFQ1RfREVQRU5ERU5DWV9LRVk6IDMwNCxcclxuXHQvLyBBcnJheSBlcnJvcnNcclxuXHRBUlJBWV9MRU5HVEhfU0hPUlQ6IDQwMCxcclxuXHRBUlJBWV9MRU5HVEhfTE9ORzogNDAxLFxyXG5cdEFSUkFZX1VOSVFVRTogNDAyLFxyXG5cdEFSUkFZX0FERElUSU9OQUxfSVRFTVM6IDQwMyxcclxuXHQvLyBDdXN0b20vdXNlci1kZWZpbmVkIGVycm9yc1xyXG5cdEZPUk1BVF9DVVNUT006IDUwMCxcclxuXHRLRVlXT1JEX0NVU1RPTTogNTAxLFxyXG5cdC8vIFNjaGVtYSBzdHJ1Y3R1cmVcclxuXHRDSVJDVUxBUl9SRUZFUkVOQ0U6IDYwMCxcclxuXHQvLyBOb24tc3RhbmRhcmQgdmFsaWRhdGlvbiBvcHRpb25zXHJcblx0VU5LTk9XTl9QUk9QRVJUWTogMTAwMFxyXG59O1xyXG52YXIgRXJyb3JDb2RlTG9va3VwID0ge307XHJcbmZvciAodmFyIGtleSBpbiBFcnJvckNvZGVzKSB7XHJcblx0RXJyb3JDb2RlTG9va3VwW0Vycm9yQ29kZXNba2V5XV0gPSBrZXk7XHJcbn1cclxudmFyIEVycm9yTWVzc2FnZXNEZWZhdWx0ID0ge1xyXG5cdElOVkFMSURfVFlQRTogXCJJbnZhbGlkIHR5cGU6IHt0eXBlfSAoZXhwZWN0ZWQge2V4cGVjdGVkfSlcIixcclxuXHRFTlVNX01JU01BVENIOiBcIk5vIGVudW0gbWF0Y2ggZm9yOiB7dmFsdWV9XCIsXHJcblx0QU5ZX09GX01JU1NJTkc6IFwiRGF0YSBkb2VzIG5vdCBtYXRjaCBhbnkgc2NoZW1hcyBmcm9tIFxcXCJhbnlPZlxcXCJcIixcclxuXHRPTkVfT0ZfTUlTU0lORzogXCJEYXRhIGRvZXMgbm90IG1hdGNoIGFueSBzY2hlbWFzIGZyb20gXFxcIm9uZU9mXFxcIlwiLFxyXG5cdE9ORV9PRl9NVUxUSVBMRTogXCJEYXRhIGlzIHZhbGlkIGFnYWluc3QgbW9yZSB0aGFuIG9uZSBzY2hlbWEgZnJvbSBcXFwib25lT2ZcXFwiOiBpbmRpY2VzIHtpbmRleDF9IGFuZCB7aW5kZXgyfVwiLFxyXG5cdE5PVF9QQVNTRUQ6IFwiRGF0YSBtYXRjaGVzIHNjaGVtYSBmcm9tIFxcXCJub3RcXFwiXCIsXHJcblx0Ly8gTnVtZXJpYyBlcnJvcnNcclxuXHROVU1CRVJfTVVMVElQTEVfT0Y6IFwiVmFsdWUge3ZhbHVlfSBpcyBub3QgYSBtdWx0aXBsZSBvZiB7bXVsdGlwbGVPZn1cIixcclxuXHROVU1CRVJfTUlOSU1VTTogXCJWYWx1ZSB7dmFsdWV9IGlzIGxlc3MgdGhhbiBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE5VTUJFUl9NSU5JTVVNX0VYQ0xVU0lWRTogXCJWYWx1ZSB7dmFsdWV9IGlzIGVxdWFsIHRvIGV4Y2x1c2l2ZSBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE5VTUJFUl9NQVhJTVVNOiBcIlZhbHVlIHt2YWx1ZX0gaXMgZ3JlYXRlciB0aGFuIG1heGltdW0ge21heGltdW19XCIsXHJcblx0TlVNQkVSX01BWElNVU1fRVhDTFVTSVZFOiBcIlZhbHVlIHt2YWx1ZX0gaXMgZXF1YWwgdG8gZXhjbHVzaXZlIG1heGltdW0ge21heGltdW19XCIsXHJcblx0TlVNQkVSX05PVF9BX05VTUJFUjogXCJWYWx1ZSB7dmFsdWV9IGlzIG5vdCBhIHZhbGlkIG51bWJlclwiLFxyXG5cdC8vIFN0cmluZyBlcnJvcnNcclxuXHRTVFJJTkdfTEVOR1RIX1NIT1JUOiBcIlN0cmluZyBpcyB0b28gc2hvcnQgKHtsZW5ndGh9IGNoYXJzKSwgbWluaW11bSB7bWluaW11bX1cIixcclxuXHRTVFJJTkdfTEVOR1RIX0xPTkc6IFwiU3RyaW5nIGlzIHRvbyBsb25nICh7bGVuZ3RofSBjaGFycyksIG1heGltdW0ge21heGltdW19XCIsXHJcblx0U1RSSU5HX1BBVFRFUk46IFwiU3RyaW5nIGRvZXMgbm90IG1hdGNoIHBhdHRlcm46IHtwYXR0ZXJufVwiLFxyXG5cdC8vIE9iamVjdCBlcnJvcnNcclxuXHRPQkpFQ1RfUFJPUEVSVElFU19NSU5JTVVNOiBcIlRvbyBmZXcgcHJvcGVydGllcyBkZWZpbmVkICh7cHJvcGVydHlDb3VudH0pLCBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE9CSkVDVF9QUk9QRVJUSUVTX01BWElNVU06IFwiVG9vIG1hbnkgcHJvcGVydGllcyBkZWZpbmVkICh7cHJvcGVydHlDb3VudH0pLCBtYXhpbXVtIHttYXhpbXVtfVwiLFxyXG5cdE9CSkVDVF9SRVFVSVJFRDogXCJNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5OiB7a2V5fVwiLFxyXG5cdE9CSkVDVF9BRERJVElPTkFMX1BST1BFUlRJRVM6IFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG5vdCBhbGxvd2VkXCIsXHJcblx0T0JKRUNUX0RFUEVOREVOQ1lfS0VZOiBcIkRlcGVuZGVuY3kgZmFpbGVkIC0ga2V5IG11c3QgZXhpc3Q6IHttaXNzaW5nfSAoZHVlIHRvIGtleToge2tleX0pXCIsXHJcblx0Ly8gQXJyYXkgZXJyb3JzXHJcblx0QVJSQVlfTEVOR1RIX1NIT1JUOiBcIkFycmF5IGlzIHRvbyBzaG9ydCAoe2xlbmd0aH0pLCBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdEFSUkFZX0xFTkdUSF9MT05HOiBcIkFycmF5IGlzIHRvbyBsb25nICh7bGVuZ3RofSksIG1heGltdW0ge21heGltdW19XCIsXHJcblx0QVJSQVlfVU5JUVVFOiBcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlIChpbmRpY2VzIHttYXRjaDF9IGFuZCB7bWF0Y2gyfSlcIixcclxuXHRBUlJBWV9BRERJVElPTkFMX0lURU1TOiBcIkFkZGl0aW9uYWwgaXRlbXMgbm90IGFsbG93ZWRcIixcclxuXHQvLyBGb3JtYXQgZXJyb3JzXHJcblx0Rk9STUFUX0NVU1RPTTogXCJGb3JtYXQgdmFsaWRhdGlvbiBmYWlsZWQgKHttZXNzYWdlfSlcIixcclxuXHRLRVlXT1JEX0NVU1RPTTogXCJLZXl3b3JkIGZhaWxlZDoge2tleX0gKHttZXNzYWdlfSlcIixcclxuXHQvLyBTY2hlbWEgc3RydWN0dXJlXHJcblx0Q0lSQ1VMQVJfUkVGRVJFTkNFOiBcIkNpcmN1bGFyICRyZWZzOiB7dXJsc31cIixcclxuXHQvLyBOb24tc3RhbmRhcmQgdmFsaWRhdGlvbiBvcHRpb25zXHJcblx0VU5LTk9XTl9QUk9QRVJUWTogXCJVbmtub3duIHByb3BlcnR5IChub3QgaW4gc2NoZW1hKVwiXHJcbn07XHJcblxyXG5mdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3IoY29kZSwgcGFyYW1zLCBkYXRhUGF0aCwgc2NoZW1hUGF0aCwgc3ViRXJyb3JzKSB7XHJcblx0RXJyb3IuY2FsbCh0aGlzKTtcclxuXHRpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiTm8gZXJyb3IgY29kZSBzdXBwbGllZDogXCIgKyBzY2hlbWFQYXRoKTtcclxuXHR9XHJcblx0dGhpcy5tZXNzYWdlID0gJyc7XHJcblx0dGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcblx0dGhpcy5jb2RlID0gY29kZTtcclxuXHR0aGlzLmRhdGFQYXRoID0gZGF0YVBhdGggfHwgXCJcIjtcclxuXHR0aGlzLnNjaGVtYVBhdGggPSBzY2hlbWFQYXRoIHx8IFwiXCI7XHJcblx0dGhpcy5zdWJFcnJvcnMgPSBzdWJFcnJvcnMgfHwgbnVsbDtcclxuXHJcblx0dmFyIGVyciA9IG5ldyBFcnJvcih0aGlzLm1lc3NhZ2UpO1xyXG5cdHRoaXMuc3RhY2sgPSBlcnIuc3RhY2sgfHwgZXJyLnN0YWNrdHJhY2U7XHJcblx0aWYgKCF0aGlzLnN0YWNrKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR0aHJvdyBlcnI7XHJcblx0XHR9XHJcblx0XHRjYXRjaChlcnIpIHtcclxuXHRcdFx0dGhpcy5zdGFjayA9IGVyci5zdGFjayB8fCBlcnIuc3RhY2t0cmFjZTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZhbGlkYXRpb25FcnJvcjtcclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZS5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcic7XHJcblxyXG5WYWxpZGF0aW9uRXJyb3IucHJvdG90eXBlLnByZWZpeFdpdGggPSBmdW5jdGlvbiAoZGF0YVByZWZpeCwgc2NoZW1hUHJlZml4KSB7XHJcblx0aWYgKGRhdGFQcmVmaXggIT09IG51bGwpIHtcclxuXHRcdGRhdGFQcmVmaXggPSBkYXRhUHJlZml4LnJlcGxhY2UoL34vZywgXCJ+MFwiKS5yZXBsYWNlKC9cXC8vZywgXCJ+MVwiKTtcclxuXHRcdHRoaXMuZGF0YVBhdGggPSBcIi9cIiArIGRhdGFQcmVmaXggKyB0aGlzLmRhdGFQYXRoO1xyXG5cdH1cclxuXHRpZiAoc2NoZW1hUHJlZml4ICE9PSBudWxsKSB7XHJcblx0XHRzY2hlbWFQcmVmaXggPSBzY2hlbWFQcmVmaXgucmVwbGFjZSgvfi9nLCBcIn4wXCIpLnJlcGxhY2UoL1xcLy9nLCBcIn4xXCIpO1xyXG5cdFx0dGhpcy5zY2hlbWFQYXRoID0gXCIvXCIgKyBzY2hlbWFQcmVmaXggKyB0aGlzLnNjaGVtYVBhdGg7XHJcblx0fVxyXG5cdGlmICh0aGlzLnN1YkVycm9ycyAhPT0gbnVsbCkge1xyXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YkVycm9ycy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR0aGlzLnN1YkVycm9yc1tpXS5wcmVmaXhXaXRoKGRhdGFQcmVmaXgsIHNjaGVtYVByZWZpeCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gaXNUcnVzdGVkVXJsKGJhc2VVcmwsIHRlc3RVcmwpIHtcclxuXHRpZih0ZXN0VXJsLnN1YnN0cmluZygwLCBiYXNlVXJsLmxlbmd0aCkgPT09IGJhc2VVcmwpe1xyXG5cdFx0dmFyIHJlbWFpbmRlciA9IHRlc3RVcmwuc3Vic3RyaW5nKGJhc2VVcmwubGVuZ3RoKTtcclxuXHRcdGlmICgodGVzdFVybC5sZW5ndGggPiAwICYmIHRlc3RVcmwuY2hhckF0KGJhc2VVcmwubGVuZ3RoIC0gMSkgPT09IFwiL1wiKVxyXG5cdFx0XHR8fCByZW1haW5kZXIuY2hhckF0KDApID09PSBcIiNcIlxyXG5cdFx0XHR8fCByZW1haW5kZXIuY2hhckF0KDApID09PSBcIj9cIikge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG52YXIgbGFuZ3VhZ2VzID0ge307XHJcbmZ1bmN0aW9uIGNyZWF0ZUFwaShsYW5ndWFnZSkge1xyXG5cdHZhciBnbG9iYWxDb250ZXh0ID0gbmV3IFZhbGlkYXRvckNvbnRleHQoKTtcclxuXHR2YXIgY3VycmVudExhbmd1YWdlO1xyXG5cdHZhciBjdXN0b21FcnJvclJlcG9ydGVyO1xyXG5cdHZhciBhcGkgPSB7XHJcblx0XHRzZXRFcnJvclJlcG9ydGVyOiBmdW5jdGlvbiAocmVwb3J0ZXIpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiByZXBvcnRlciA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5sYW5ndWFnZShyZXBvcnRlcik7XHJcblx0XHRcdH1cclxuXHRcdFx0Y3VzdG9tRXJyb3JSZXBvcnRlciA9IHJlcG9ydGVyO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHRhZGRGb3JtYXQ6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5hZGRGb3JtYXQuYXBwbHkoZ2xvYmFsQ29udGV4dCwgYXJndW1lbnRzKTtcclxuXHRcdH0sXHJcblx0XHRsYW5ndWFnZTogZnVuY3Rpb24gKGNvZGUpIHtcclxuXHRcdFx0aWYgKCFjb2RlKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRMYW5ndWFnZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIWxhbmd1YWdlc1tjb2RlXSkge1xyXG5cdFx0XHRcdGNvZGUgPSBjb2RlLnNwbGl0KCctJylbMF07IC8vIGZhbGwgYmFjayB0byBiYXNlIGxhbmd1YWdlXHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGxhbmd1YWdlc1tjb2RlXSkge1xyXG5cdFx0XHRcdGN1cnJlbnRMYW5ndWFnZSA9IGNvZGU7XHJcblx0XHRcdFx0cmV0dXJuIGNvZGU7IC8vIHNvIHlvdSBjYW4gdGVsbCBpZiBmYWxsLWJhY2sgaGFzIGhhcHBlbmVkXHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fSxcclxuXHRcdGFkZExhbmd1YWdlOiBmdW5jdGlvbiAoY29kZSwgbWVzc2FnZU1hcCkge1xyXG5cdFx0XHR2YXIga2V5O1xyXG5cdFx0XHRmb3IgKGtleSBpbiBFcnJvckNvZGVzKSB7XHJcblx0XHRcdFx0aWYgKG1lc3NhZ2VNYXBba2V5XSAmJiAhbWVzc2FnZU1hcFtFcnJvckNvZGVzW2tleV1dKSB7XHJcblx0XHRcdFx0XHRtZXNzYWdlTWFwW0Vycm9yQ29kZXNba2V5XV0gPSBtZXNzYWdlTWFwW2tleV07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHZhciByb290Q29kZSA9IGNvZGUuc3BsaXQoJy0nKVswXTtcclxuXHRcdFx0aWYgKCFsYW5ndWFnZXNbcm9vdENvZGVdKSB7IC8vIHVzZSBmb3IgYmFzZSBsYW5ndWFnZSBpZiBub3QgeWV0IGRlZmluZWRcclxuXHRcdFx0XHRsYW5ndWFnZXNbY29kZV0gPSBtZXNzYWdlTWFwO1xyXG5cdFx0XHRcdGxhbmd1YWdlc1tyb290Q29kZV0gPSBtZXNzYWdlTWFwO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGxhbmd1YWdlc1tjb2RlXSA9IE9iamVjdC5jcmVhdGUobGFuZ3VhZ2VzW3Jvb3RDb2RlXSk7XHJcblx0XHRcdFx0Zm9yIChrZXkgaW4gbWVzc2FnZU1hcCkge1xyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBsYW5ndWFnZXNbcm9vdENvZGVdW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XHJcblx0XHRcdFx0XHRcdGxhbmd1YWdlc1tyb290Q29kZV1ba2V5XSA9IG1lc3NhZ2VNYXBba2V5XTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxhbmd1YWdlc1tjb2RlXVtrZXldID0gbWVzc2FnZU1hcFtrZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdH0sXHJcblx0XHRmcmVzaEFwaTogZnVuY3Rpb24gKGxhbmd1YWdlKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSBjcmVhdGVBcGkoKTtcclxuXHRcdFx0aWYgKGxhbmd1YWdlKSB7XHJcblx0XHRcdFx0cmVzdWx0Lmxhbmd1YWdlKGxhbmd1YWdlKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fSxcclxuXHRcdHZhbGlkYXRlOiBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dmFyIGRlZiA9IGRlZmF1bHRFcnJvclJlcG9ydGVyKGN1cnJlbnRMYW5ndWFnZSk7XHJcblx0XHRcdHZhciBlcnJvclJlcG9ydGVyID0gY3VzdG9tRXJyb3JSZXBvcnRlciA/IGZ1bmN0aW9uIChlcnJvciwgZGF0YSwgc2NoZW1hKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1c3RvbUVycm9yUmVwb3J0ZXIoZXJyb3IsIGRhdGEsIHNjaGVtYSkgfHwgZGVmKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9IDogZGVmO1xyXG5cdFx0XHR2YXIgY29udGV4dCA9IG5ldyBWYWxpZGF0b3JDb250ZXh0KGdsb2JhbENvbnRleHQsIGZhbHNlLCBlcnJvclJlcG9ydGVyLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpO1xyXG5cdFx0XHRpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdHNjaGVtYSA9IHtcIiRyZWZcIjogc2NoZW1hfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb250ZXh0LmFkZFNjaGVtYShcIlwiLCBzY2hlbWEpO1xyXG5cdFx0XHR2YXIgZXJyb3IgPSBjb250ZXh0LnZhbGlkYXRlQWxsKGRhdGEsIHNjaGVtYSwgbnVsbCwgbnVsbCwgXCJcIik7XHJcblx0XHRcdGlmICghZXJyb3IgJiYgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHRlcnJvciA9IGNvbnRleHQuYmFuVW5rbm93blByb3BlcnRpZXMoZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmVycm9yID0gZXJyb3I7XHJcblx0XHRcdHRoaXMubWlzc2luZyA9IGNvbnRleHQubWlzc2luZztcclxuXHRcdFx0dGhpcy52YWxpZCA9IChlcnJvciA9PT0gbnVsbCk7XHJcblx0XHRcdHJldHVybiB0aGlzLnZhbGlkO1xyXG5cdFx0fSxcclxuXHRcdHZhbGlkYXRlUmVzdWx0OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZCA/ICd2YWxpZCcgOiB0aGlzLmVycm9yLm1lc3NhZ2U7XHJcblx0XHRcdH19O1xyXG5cdFx0XHR0aGlzLnZhbGlkYXRlLmFwcGx5KHJlc3VsdCwgYXJndW1lbnRzKTtcclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdH0sXHJcblx0XHR2YWxpZGF0ZU11bHRpcGxlOiBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dmFyIGRlZiA9IGRlZmF1bHRFcnJvclJlcG9ydGVyKGN1cnJlbnRMYW5ndWFnZSk7XHJcblx0XHRcdHZhciBlcnJvclJlcG9ydGVyID0gY3VzdG9tRXJyb3JSZXBvcnRlciA/IGZ1bmN0aW9uIChlcnJvciwgZGF0YSwgc2NoZW1hKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1c3RvbUVycm9yUmVwb3J0ZXIoZXJyb3IsIGRhdGEsIHNjaGVtYSkgfHwgZGVmKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9IDogZGVmO1xyXG5cdFx0XHR2YXIgY29udGV4dCA9IG5ldyBWYWxpZGF0b3JDb250ZXh0KGdsb2JhbENvbnRleHQsIHRydWUsIGVycm9yUmVwb3J0ZXIsIGNoZWNrUmVjdXJzaXZlLCBiYW5Vbmtub3duUHJvcGVydGllcyk7XHJcblx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XHJcblx0XHRcdFx0c2NoZW1hID0ge1wiJHJlZlwiOiBzY2hlbWF9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnRleHQuYWRkU2NoZW1hKFwiXCIsIHNjaGVtYSk7XHJcblx0XHRcdGNvbnRleHQudmFsaWRhdGVBbGwoZGF0YSwgc2NoZW1hLCBudWxsLCBudWxsLCBcIlwiKTtcclxuXHRcdFx0aWYgKGJhblVua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRcdFx0Y29udGV4dC5iYW5Vbmtub3duUHJvcGVydGllcyhkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhciByZXN1bHQgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZCA/ICd2YWxpZCcgOiB0aGlzLmVycm9yLm1lc3NhZ2U7XHJcblx0XHRcdH19O1xyXG5cdFx0XHRyZXN1bHQuZXJyb3JzID0gY29udGV4dC5lcnJvcnM7XHJcblx0XHRcdHJlc3VsdC5taXNzaW5nID0gY29udGV4dC5taXNzaW5nO1xyXG5cdFx0XHRyZXN1bHQudmFsaWQgPSAocmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDApO1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fSxcclxuXHRcdGFkZFNjaGVtYTogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRyZXR1cm4gZ2xvYmFsQ29udGV4dC5hZGRTY2hlbWEuYXBwbHkoZ2xvYmFsQ29udGV4dCwgYXJndW1lbnRzKTtcclxuXHRcdH0sXHJcblx0XHRnZXRTY2hlbWE6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIGdsb2JhbENvbnRleHQuZ2V0U2NoZW1hLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0Z2V0U2NoZW1hTWFwOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJldHVybiBnbG9iYWxDb250ZXh0LmdldFNjaGVtYU1hcC5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGdldFNjaGVtYVVyaXM6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIGdsb2JhbENvbnRleHQuZ2V0U2NoZW1hVXJpcy5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGdldE1pc3NpbmdVcmlzOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJldHVybiBnbG9iYWxDb250ZXh0LmdldE1pc3NpbmdVcmlzLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0ZHJvcFNjaGVtYXM6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5kcm9wU2NoZW1hcy5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGRlZmluZUtleXdvcmQ6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5kZWZpbmVLZXl3b3JkLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0ZGVmaW5lRXJyb3I6IGZ1bmN0aW9uIChjb2RlTmFtZSwgY29kZU51bWJlciwgZGVmYXVsdE1lc3NhZ2UpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiBjb2RlTmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW0EtWl0rKF9bQS1aXSspKiQvLnRlc3QoY29kZU5hbWUpKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDb2RlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBpbiBVUFBFUl9DQVNFX1dJVEhfVU5ERVJTQ09SRVMnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodHlwZW9mIGNvZGVOdW1iZXIgIT09ICdudW1iZXInIHx8IGNvZGVOdW1iZXIlMSAhPT0gMCB8fCBjb2RlTnVtYmVyIDwgMTAwMDApIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvZGUgbnVtYmVyIG11c3QgYmUgYW4gaW50ZWdlciA+IDEwMDAwJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHR5cGVvZiBFcnJvckNvZGVzW2NvZGVOYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGFscmVhZHkgZGVmaW5lZDogJyArIGNvZGVOYW1lICsgJyBhcyAnICsgRXJyb3JDb2Rlc1tjb2RlTmFtZV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0eXBlb2YgRXJyb3JDb2RlTG9va3VwW2NvZGVOdW1iZXJdICE9PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignRXJyb3IgY29kZSBhbHJlYWR5IHVzZWQ6ICcgKyBFcnJvckNvZGVMb29rdXBbY29kZU51bWJlcl0gKyAnIGFzICcgKyBjb2RlTnVtYmVyKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRFcnJvckNvZGVzW2NvZGVOYW1lXSA9IGNvZGVOdW1iZXI7XHJcblx0XHRcdEVycm9yQ29kZUxvb2t1cFtjb2RlTnVtYmVyXSA9IGNvZGVOYW1lO1xyXG5cdFx0XHRFcnJvck1lc3NhZ2VzRGVmYXVsdFtjb2RlTmFtZV0gPSBFcnJvck1lc3NhZ2VzRGVmYXVsdFtjb2RlTnVtYmVyXSA9IGRlZmF1bHRNZXNzYWdlO1xyXG5cdFx0XHRmb3IgKHZhciBsYW5nQ29kZSBpbiBsYW5ndWFnZXMpIHtcclxuXHRcdFx0XHR2YXIgbGFuZ3VhZ2UgPSBsYW5ndWFnZXNbbGFuZ0NvZGVdO1xyXG5cdFx0XHRcdGlmIChsYW5ndWFnZVtjb2RlTmFtZV0pIHtcclxuXHRcdFx0XHRcdGxhbmd1YWdlW2NvZGVOdW1iZXJdID0gbGFuZ3VhZ2VbY29kZU51bWJlcl0gfHwgbGFuZ3VhZ2VbY29kZU5hbWVdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGdsb2JhbENvbnRleHQucmVzZXQoKTtcclxuXHRcdFx0dGhpcy5lcnJvciA9IG51bGw7XHJcblx0XHRcdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdFx0XHR0aGlzLnZhbGlkID0gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHRtaXNzaW5nOiBbXSxcclxuXHRcdGVycm9yOiBudWxsLFxyXG5cdFx0dmFsaWQ6IHRydWUsXHJcblx0XHRub3JtU2NoZW1hOiBub3JtU2NoZW1hLFxyXG5cdFx0cmVzb2x2ZVVybDogcmVzb2x2ZVVybCxcclxuXHRcdGdldERvY3VtZW50VXJpOiBnZXREb2N1bWVudFVyaSxcclxuXHRcdGVycm9yQ29kZXM6IEVycm9yQ29kZXNcclxuXHR9O1xyXG5cdGFwaS5sYW5ndWFnZShsYW5ndWFnZSB8fCAnZW4nKTtcclxuXHRyZXR1cm4gYXBpO1xyXG59XHJcblxyXG52YXIgdHY0ID0gY3JlYXRlQXBpKCk7XHJcbnR2NC5hZGRMYW5ndWFnZSgnZW4tZ2InLCBFcnJvck1lc3NhZ2VzRGVmYXVsdCk7XHJcblxyXG4vL2xlZ2FjeSBwcm9wZXJ0eVxyXG50djQudHY0ID0gdHY0O1xyXG5cclxucmV0dXJuIHR2NDsgLy8gdXNlZCBieSBfaGVhZGVyLmpzIHRvIGdsb2JhbGlzZS5cclxuXHJcbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///83\n')},function(module,exports,__webpack_require__){eval("module.exports = !__webpack_require__(8) && !__webpack_require__(2)(function () {\n return Object.defineProperty(__webpack_require__(57)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcz9jNjlhIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///84\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(3);\nvar core = __webpack_require__(9);\nvar LIBRARY = __webpack_require__(31);\nvar wksExt = __webpack_require__(59);\nvar defineProperty = __webpack_require__(7).f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MtZGVmaW5lLmpzPzNhNzIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZiAobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSkgZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwgeyB2YWx1ZTogd2tzRXh0LmYobmFtZSkgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///85\n")},function(module,exports,__webpack_require__){eval("var has = __webpack_require__(13);\nvar toIObject = __webpack_require__(15);\nvar arrayIndexOf = __webpack_require__(46)(false);\nvar IE_PROTO = __webpack_require__(60)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcz9jZTEwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///86\n")},function(module,exports,__webpack_require__){eval("var dP = __webpack_require__(7);\nvar anObject = __webpack_require__(5);\nvar getKeys = __webpack_require__(32);\n\nmodule.exports = __webpack_require__(8) ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzPzE0OTUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///87\n")},function(module,exports,__webpack_require__){eval("// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = __webpack_require__(15);\nvar gOPN = __webpack_require__(35).f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanM/N2JiYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///88\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = __webpack_require__(32);\nvar gOPS = __webpack_require__(47);\nvar pIE = __webpack_require__(45);\nvar toObject = __webpack_require__(16);\nvar IObject = __webpack_require__(44);\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(2)(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzPzczMzMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBTID0gU3ltYm9sKCk7XG4gIHZhciBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICB2YXIgaXNFbnVtID0gcElFLmY7XG4gIHdoaWxlIChhTGVuID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSBpZiAoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSkgVFtrZXldID0gU1trZXldO1xuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///89\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar aFunction = __webpack_require__(22);\nvar isObject = __webpack_require__(4);\nvar invoke = __webpack_require__(91);\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19iaW5kLmpzP2YwYzEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGludm9rZSA9IHJlcXVpcmUoJy4vX2ludm9rZScpO1xudmFyIGFycmF5U2xpY2UgPSBbXS5zbGljZTtcbnZhciBmYWN0b3JpZXMgPSB7fTtcblxudmFyIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIChGLCBsZW4sIGFyZ3MpIHtcbiAgaWYgKCEobGVuIGluIGZhY3RvcmllcykpIHtcbiAgICBmb3IgKHZhciBuID0gW10sIGkgPSAwOyBpIDwgbGVuOyBpKyspIG5baV0gPSAnYVsnICsgaSArICddJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICBmYWN0b3JpZXNbbGVuXSA9IEZ1bmN0aW9uKCdGLGEnLCAncmV0dXJuIG5ldyBGKCcgKyBuLmpvaW4oJywnKSArICcpJyk7XG4gIH0gcmV0dXJuIGZhY3Rvcmllc1tsZW5dKEYsIGFyZ3MpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5iaW5kIHx8IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgdmFyIGZuID0gYUZ1bmN0aW9uKHRoaXMpO1xuICB2YXIgcGFydEFyZ3MgPSBhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGJvdW5kID0gZnVuY3Rpb24gKC8qIGFyZ3MuLi4gKi8pIHtcbiAgICB2YXIgYXJncyA9IHBhcnRBcmdzLmNvbmNhdChhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBib3VuZCA/IGNvbnN0cnVjdChmbiwgYXJncy5sZW5ndGgsIGFyZ3MpIDogaW52b2tlKGZuLCBhcmdzLCB0aGF0KTtcbiAgfTtcbiAgaWYgKGlzT2JqZWN0KGZuLnByb3RvdHlwZSkpIGJvdW5kLnByb3RvdHlwZSA9IGZuLnByb3RvdHlwZTtcbiAgcmV0dXJuIGJvdW5kO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///90\n")},function(module,exports){eval("// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pbnZva2UuanM/MzFmNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///91\n")},function(module,exports,__webpack_require__){eval("var $parseInt = __webpack_require__(3).parseInt;\nvar $trim = __webpack_require__(49).trim;\nvar ws = __webpack_require__(65);\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n var string = $trim(String(str), 3);\n return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wYXJzZS1pbnQuanM/M2NhNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VJbnQ7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd3MgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKTtcbnZhciBoZXggPSAvXlstK10/MFt4WF0vO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICRwYXJzZUludCh3cyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3cyArICcweDE2JykgIT09IDIyID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyLCByYWRpeCkge1xuICB2YXIgc3RyaW5nID0gJHRyaW0oU3RyaW5nKHN0ciksIDMpO1xuICByZXR1cm4gJHBhcnNlSW50KHN0cmluZywgKHJhZGl4ID4+PiAwKSB8fCAoaGV4LnRlc3Qoc3RyaW5nKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///92\n")},function(module,exports,__webpack_require__){eval("var $parseFloat = __webpack_require__(3).parseFloat;\nvar $trim = __webpack_require__(49).trim;\n\nmodule.exports = 1 / $parseFloat(__webpack_require__(65) + '-0') !== -Infinity ? function parseFloat(str) {\n var string = $trim(String(str), 3);\n var result = $parseFloat(string);\n return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : $parseFloat;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wYXJzZS1mbG9hdC5qcz9kNzUyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLnBhcnNlRmxvYXQ7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG5cbm1vZHVsZS5leHBvcnRzID0gMSAvICRwYXJzZUZsb2F0KHJlcXVpcmUoJy4vX3N0cmluZy13cycpICsgJy0wJykgIT09IC1JbmZpbml0eSA/IGZ1bmN0aW9uIHBhcnNlRmxvYXQoc3RyKSB7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMyk7XG4gIHZhciByZXN1bHQgPSAkcGFyc2VGbG9hdChzdHJpbmcpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHN0cmluZy5jaGFyQXQoMCkgPT0gJy0nID8gLTAgOiByZXN1bHQ7XG59IDogJHBhcnNlRmxvYXQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///93\n")},function(module,exports,__webpack_require__){eval("var cof = __webpack_require__(23);\nmodule.exports = function (it, msg) {\n if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);\n return +it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLW51bWJlci12YWx1ZS5qcz9iZWY5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBtc2cpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnbnVtYmVyJyAmJiBjb2YoaXQpICE9ICdOdW1iZXInKSB0aHJvdyBUeXBlRXJyb3IobXNnKTtcbiAgcmV0dXJuICtpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///94\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(4);\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1pbnRlZ2VyLmpzPzljMTIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMS4yLjMgTnVtYmVyLmlzSW50ZWdlcihudW1iZXIpXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzSW50ZWdlcihpdCkge1xuICByZXR1cm4gIWlzT2JqZWN0KGl0KSAmJiBpc0Zpbml0ZShpdCkgJiYgZmxvb3IoaXQpID09PSBpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///95\n")},function(module,exports){eval("// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLWxvZzFwLmpzP2Q2YzYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5sb2cxcCB8fCBmdW5jdGlvbiBsb2cxcCh4KSB7XG4gIHJldHVybiAoeCA9ICt4KSA+IC0xZS04ICYmIHggPCAxZS04ID8geCAtIHggKiB4IC8gMiA6IE1hdGgubG9nKDEgKyB4KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///96\n")},function(module,exports,__webpack_require__){eval("var toInteger = __webpack_require__(25);\nvar defined = __webpack_require__(24);\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanM/MDJmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///97\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar create = __webpack_require__(34);\nvar descriptor = __webpack_require__(29);\nvar setToStringTag = __webpack_require__(37);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(14)(IteratorPrototype, __webpack_require__(6)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcz80MWEwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///98\n")},function(module,exports,__webpack_require__){eval("// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(5);\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanM/MWZhOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIGFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///99\n")},function(module,exports,__webpack_require__){eval("var aFunction = __webpack_require__(22);\nvar toObject = __webpack_require__(16);\nvar IObject = __webpack_require__(44);\nvar toLength = __webpack_require__(10);\n\nmodule.exports = function (that, callbackfn, aLen, memo, isRight) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IObject(O);\n var length = toLength(O.length);\n var index = isRight ? length - 1 : 0;\n var i = isRight ? -1 : 1;\n if (aLen < 2) for (;;) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (isRight ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;isRight ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktcmVkdWNlLmpzPzdiMjMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgY2FsbGJhY2tmbiwgYUxlbiwgbWVtbywgaXNSaWdodCkge1xuICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XG4gIHZhciBPID0gdG9PYmplY3QodGhhdCk7XG4gIHZhciBzZWxmID0gSU9iamVjdChPKTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIGluZGV4ID0gaXNSaWdodCA/IGxlbmd0aCAtIDEgOiAwO1xuICB2YXIgaSA9IGlzUmlnaHQgPyAtMSA6IDE7XG4gIGlmIChhTGVuIDwgMikgZm9yICg7Oykge1xuICAgIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgICBtZW1vID0gc2VsZltpbmRleF07XG4gICAgICBpbmRleCArPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGluZGV4ICs9IGk7XG4gICAgaWYgKGlzUmlnaHQgPyBpbmRleCA8IDAgOiBsZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgIH1cbiAgfVxuICBmb3IgKDtpc1JpZ2h0ID8gaW5kZXggPj0gMCA6IGxlbmd0aCA+IGluZGV4OyBpbmRleCArPSBpKSBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgIG1lbW8gPSBjYWxsYmFja2ZuKG1lbW8sIHNlbGZbaW5kZXhdLCBpbmRleCwgTyk7XG4gIH1cbiAgcmV0dXJuIG1lbW87XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///100\n")},function(module,exports,__webpack_require__){"use strict";eval("// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n\nvar toObject = __webpack_require__(16);\nvar toAbsoluteIndex = __webpack_require__(33);\nvar toLength = __webpack_require__(10);\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktY29weS13aXRoaW4uanM/YmE5MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0IC8qID0gMCAqLywgc3RhcnQgLyogPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciB0byA9IHRvQWJzb2x1dGVJbmRleCh0YXJnZXQsIGxlbik7XG4gIHZhciBmcm9tID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW4pO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBjb3VudCA9IE1hdGgubWluKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbikpIC0gZnJvbSwgbGVuIC0gdG8pO1xuICB2YXIgaW5jID0gMTtcbiAgaWYgKGZyb20gPCB0byAmJiB0byA8IGZyb20gKyBjb3VudCkge1xuICAgIGluYyA9IC0xO1xuICAgIGZyb20gKz0gY291bnQgLSAxO1xuICAgIHRvICs9IGNvdW50IC0gMTtcbiAgfVxuICB3aGlsZSAoY291bnQtLSA+IDApIHtcbiAgICBpZiAoZnJvbSBpbiBPKSBPW3RvXSA9IE9bZnJvbV07XG4gICAgZWxzZSBkZWxldGUgT1t0b107XG4gICAgdG8gKz0gaW5jO1xuICAgIGZyb20gKz0gaW5jO1xuICB9IHJldHVybiBPO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///101\n")},function(module,exports){eval("module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzP2Q1M2IiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///102\n")},function(module,exports,__webpack_require__){eval("// 21.2.5.3 get RegExp.prototype.flags()\nif (__webpack_require__(8) && /./g.flags != 'g') __webpack_require__(7).f(RegExp.prototype, 'flags', {\n configurable: true,\n get: __webpack_require__(79)\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzLmpzPzM4NDYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3MoKVxuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgLy4vZy5mbGFncyAhPSAnZycpIHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogcmVxdWlyZSgnLi9fZmxhZ3MnKVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///103\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar LIBRARY = __webpack_require__(31);\nvar global = __webpack_require__(3);\nvar ctx = __webpack_require__(21);\nvar classof = __webpack_require__(48);\nvar $export = __webpack_require__(1);\nvar isObject = __webpack_require__(4);\nvar aFunction = __webpack_require__(22);\nvar anInstance = __webpack_require__(41);\nvar forOf = __webpack_require__(52);\nvar speciesConstructor = __webpack_require__(53);\nvar task = __webpack_require__(80).set;\nvar microtask = __webpack_require__(229)();\nvar newPromiseCapabilityModule = __webpack_require__(105);\nvar perform = __webpack_require__(230);\nvar userAgent = __webpack_require__(54);\nvar promiseResolve = __webpack_require__(106);\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[__webpack_require__(6)('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = __webpack_require__(42)($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(37)($Promise, PROMISE);\n__webpack_require__(40)(PROMISE);\nWrapper = __webpack_require__(9)[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(50)(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qcz81NTFjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///104\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(22);\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcz9hNWI4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xuXG5mdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///105\n")},function(module,exports,__webpack_require__){eval("var anObject = __webpack_require__(5);\nvar isObject = __webpack_require__(4);\nvar newPromiseCapability = __webpack_require__(105);\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcHJvbWlzZS1yZXNvbHZlLmpzP2JjYWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///106\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar dP = __webpack_require__(7).f;\nvar create = __webpack_require__(34);\nvar redefineAll = __webpack_require__(42);\nvar ctx = __webpack_require__(21);\nvar anInstance = __webpack_require__(41);\nvar forOf = __webpack_require__(52);\nvar $iterDefine = __webpack_require__(70);\nvar step = __webpack_require__(102);\nvar setSpecies = __webpack_require__(40);\nvar DESCRIPTORS = __webpack_require__(8);\nvar fastKey = __webpack_require__(28).fastKey;\nvar validate = __webpack_require__(43);\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi1zdHJvbmcuanM/YzI2YiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgJGl0ZXJEZWZpbmUgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5O1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNJWkUgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgdmFyIGVudHJ5O1xuICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yIChlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICBpZiAoZW50cnkuayA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBmb3IgKHZhciB0aGF0ID0gdmFsaWRhdGUodGhpcywgTkFNRSksIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucCkgZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm47XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmICh0aGF0Ll9mID09IGVudHJ5KSB0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZiAodGhhdC5fbCA9PSBlbnRyeSkgdGhhdC5fbCA9IHByZXY7XG4gICAgICAgICAgdGhhdFtTSVpFXS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZiA9IGN0eChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZikge1xuICAgICAgICAgIGYoZW50cnkudiwgZW50cnkuaywgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZFAoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLCBOQU1FKVtTSVpFXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgdmFyIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYgKCF0aGF0Ll9mKSB0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZiAocHJldikgcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSB0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQywgTkFNRSwgSVNfTUFQKSB7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgdGhpcy5fdCA9IHZhbGlkYXRlKGl0ZXJhdGVkLCBOQU1FKTsgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAgICAgICAgICAgICAgICAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBraW5kID0gdGhhdC5faztcbiAgICAgIHZhciBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///107\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar redefineAll = __webpack_require__(42);\nvar getWeak = __webpack_require__(28).getWeak;\nvar anObject = __webpack_require__(5);\nvar isObject = __webpack_require__(4);\nvar anInstance = __webpack_require__(41);\nvar forOf = __webpack_require__(52);\nvar createArrayMethod = __webpack_require__(20);\nvar $has = __webpack_require__(13);\nvar validate = __webpack_require__(43);\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi13ZWFrLmpzPzY0M2UiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgZ2V0V2VhayA9IHJlcXVpcmUoJy4vX21ldGEnKS5nZXRXZWFrO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIGNyZWF0ZUFycmF5TWV0aG9kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpO1xudmFyICRoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBhcnJheUZpbmQgPSBjcmVhdGVBcnJheU1ldGhvZCg1KTtcbnZhciBhcnJheUZpbmRJbmRleCA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpO1xudmFyIGlkID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIHVuY2F1Z2h0IGZyb3plbiBrZXlzXG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICh0aGF0KSB7XG4gIHJldHVybiB0aGF0Ll9sIHx8ICh0aGF0Ll9sID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xudmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYSA9IFtdO1xufTtcbnZhciBmaW5kVW5jYXVnaHRGcm96ZW4gPSBmdW5jdGlvbiAoc3RvcmUsIGtleSkge1xuICByZXR1cm4gYXJyYXlGaW5kKHN0b3JlLmEsIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5VbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSByZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSBlbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5hLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaW5kZXggPSBhcnJheUZpbmRJbmRleCh0aGlzLmEsIGZ1bmN0aW9uIChpdCkge1xuICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKH5pbmRleCkgdGhpcy5hLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX3QgPSBOQU1FOyAgICAgIC8vIGNvbGxlY3Rpb24gdHlwZVxuICAgICAgdGhhdC5faSA9IGlkKys7ICAgICAgLy8gY29sbGVjdGlvbiBpZFxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgLy8gbGVhayBzdG9yZSBmb3IgdW5jYXVnaHQgZnJvemVuIG9iamVjdHNcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIE5BTUUpKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKSAmJiBkZWxldGUgZGF0YVt0aGlzLl9pXTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuNC4zLjQgV2Vha1NldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIE5BTUUpKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBkYXRhID0gZ2V0V2Vhayhhbk9iamVjdChrZXkpLCB0cnVlKTtcbiAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgdW5jYXVnaHRGcm96ZW5TdG9yZSh0aGF0KS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgZWxzZSBkYXRhW3RoYXQuX2ldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIHVmc3RvcmU6IHVuY2F1Z2h0RnJvemVuU3RvcmVcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///108\n")},function(module,exports,__webpack_require__){eval("// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = __webpack_require__(25);\nvar toLength = __webpack_require__(10);\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanM/MDlmYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2luZGV4XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHZhciBudW1iZXIgPSB0b0ludGVnZXIoaXQpO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgobnVtYmVyKTtcbiAgaWYgKG51bWJlciAhPT0gbGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBsZW5ndGghJyk7XG4gIHJldHVybiBsZW5ndGg7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///109\n")},function(module,exports,__webpack_require__){eval("// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(35);\nvar gOPS = __webpack_require__(47);\nvar anObject = __webpack_require__(5);\nvar Reflect = __webpack_require__(3).Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb3duLWtleXMuanM/OTkwYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBSZWZsZWN0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdDtcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJiBSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdPUE4uZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgcmV0dXJuIGdldFN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///110\n")},function(module,exports,__webpack_require__){eval("// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = __webpack_require__(10);\nvar repeat = __webpack_require__(67);\nvar defined = __webpack_require__(24);\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXBhZC5qcz8yZTA4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCcuL19zdHJpbmctcmVwZWF0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nLCBsZWZ0KSB7XG4gIHZhciBTID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7XG4gIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpO1xuICB2YXIgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTtcbiAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykgcmV0dXJuIFM7XG4gIHZhciBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoO1xuICB2YXIgc3RyaW5nRmlsbGVyID0gcmVwZWF0LmNhbGwoZmlsbFN0ciwgTWF0aC5jZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpO1xuICBpZiAoc3RyaW5nRmlsbGVyLmxlbmd0aCA+IGZpbGxMZW4pIHN0cmluZ0ZpbGxlciA9IHN0cmluZ0ZpbGxlci5zbGljZSgwLCBmaWxsTGVuKTtcbiAgcmV0dXJuIGxlZnQgPyBzdHJpbmdGaWxsZXIgKyBTIDogUyArIHN0cmluZ0ZpbGxlcjtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///111\n")},function(module,exports,__webpack_require__){eval("var getKeys = __webpack_require__(32);\nvar toIObject = __webpack_require__(15);\nvar isEnum = __webpack_require__(45).f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzPzUwNGMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBpc0VudW0gPSByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlzRW50cmllcykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gZ2V0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoTywga2V5ID0ga2V5c1tpKytdKSkge1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///112\n")},function(c,e,n){n(114),c.exports=n(283)},function(module,exports,__webpack_require__){"use strict";eval('/* WEBPACK VAR INJECTION */(function(global) {\n\n__webpack_require__(116);\n\n__webpack_require__(260);\n\n__webpack_require__(262);\n\n__webpack_require__(264);\n\n__webpack_require__(266);\n\n__webpack_require__(268);\n\n__webpack_require__(270);\n\n__webpack_require__(272);\n\n__webpack_require__(274);\n\n__webpack_require__(276);\n\n__webpack_require__(280);\n\nif (global._babelPolyfill && typeof console !== "undefined" && console.warn) {\n console.warn("@babel/polyfill is loaded more than once on this page. This is probably not desirable/intended " + "and may have consequences if different versions of the polyfills are applied sequentially. " + "If you do need to load the polyfill more than once, use @babel/polyfill/noConflict " + "instead to bypass the warning.");\n}\n\nglobal._babelPolyfill = true;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(115)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wb2x5ZmlsbC9saWIvaW5kZXguanM/ZTc5MiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvZXM2XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9mbi9hcnJheS9pbmNsdWRlc1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvZm4vc3RyaW5nL3BhZC1zdGFydFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvZm4vc3RyaW5nL3BhZC1lbmRcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL2ZuL3N5bWJvbC9hc3luYy1pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL2ZuL29iamVjdC92YWx1ZXNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL2ZuL29iamVjdC9lbnRyaWVzXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9mbi9wcm9taXNlL2ZpbmFsbHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL3dlYlwiKTtcblxucmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZVwiKTtcblxuaWYgKGdsb2JhbC5fYmFiZWxQb2x5ZmlsbCAmJiB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlLndhcm4pIHtcbiAgY29uc29sZS53YXJuKFwiQGJhYmVsL3BvbHlmaWxsIGlzIGxvYWRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGlzIHBhZ2UuIFRoaXMgaXMgcHJvYmFibHkgbm90IGRlc2lyYWJsZS9pbnRlbmRlZCBcIiArIFwiYW5kIG1heSBoYXZlIGNvbnNlcXVlbmNlcyBpZiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHBvbHlmaWxscyBhcmUgYXBwbGllZCBzZXF1ZW50aWFsbHkuIFwiICsgXCJJZiB5b3UgZG8gbmVlZCB0byBsb2FkIHRoZSBwb2x5ZmlsbCBtb3JlIHRoYW4gb25jZSwgdXNlIEBiYWJlbC9wb2x5ZmlsbC9ub0NvbmZsaWN0IFwiICsgXCJpbnN0ZWFkIHRvIGJ5cGFzcyB0aGUgd2FybmluZy5cIik7XG59XG5cbmdsb2JhbC5fYmFiZWxQb2x5ZmlsbCA9IHRydWU7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///114\n')},function(module,exports){eval('var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function("return this")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === "object") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it\'s\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcz9jZDAwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///115\n')},function(module,exports,__webpack_require__){eval("__webpack_require__(117);\n__webpack_require__(119);\n__webpack_require__(120);\n__webpack_require__(121);\n__webpack_require__(122);\n__webpack_require__(123);\n__webpack_require__(124);\n__webpack_require__(125);\n__webpack_require__(126);\n__webpack_require__(127);\n__webpack_require__(128);\n__webpack_require__(129);\n__webpack_require__(130);\n__webpack_require__(131);\n__webpack_require__(132);\n__webpack_require__(133);\n__webpack_require__(135);\n__webpack_require__(136);\n__webpack_require__(137);\n__webpack_require__(138);\n__webpack_require__(139);\n__webpack_require__(140);\n__webpack_require__(141);\n__webpack_require__(142);\n__webpack_require__(143);\n__webpack_require__(144);\n__webpack_require__(145);\n__webpack_require__(146);\n__webpack_require__(147);\n__webpack_require__(148);\n__webpack_require__(149);\n__webpack_require__(150);\n__webpack_require__(151);\n__webpack_require__(152);\n__webpack_require__(153);\n__webpack_require__(154);\n__webpack_require__(155);\n__webpack_require__(156);\n__webpack_require__(157);\n__webpack_require__(158);\n__webpack_require__(159);\n__webpack_require__(160);\n__webpack_require__(161);\n__webpack_require__(163);\n__webpack_require__(164);\n__webpack_require__(165);\n__webpack_require__(166);\n__webpack_require__(167);\n__webpack_require__(168);\n__webpack_require__(169);\n__webpack_require__(170);\n__webpack_require__(171);\n__webpack_require__(172);\n__webpack_require__(173);\n__webpack_require__(174);\n__webpack_require__(175);\n__webpack_require__(176);\n__webpack_require__(177);\n__webpack_require__(178);\n__webpack_require__(179);\n__webpack_require__(180);\n__webpack_require__(181);\n__webpack_require__(182);\n__webpack_require__(183);\n__webpack_require__(184);\n__webpack_require__(185);\n__webpack_require__(186);\n__webpack_require__(187);\n__webpack_require__(188);\n__webpack_require__(189);\n__webpack_require__(190);\n__webpack_require__(191);\n__webpack_require__(192);\n__webpack_require__(193);\n__webpack_require__(194);\n__webpack_require__(195);\n__webpack_require__(196);\n__webpack_require__(198);\n__webpack_require__(199);\n__webpack_require__(201);\n__webpack_require__(202);\n__webpack_require__(203);\n__webpack_require__(204);\n__webpack_require__(205);\n__webpack_require__(206);\n__webpack_require__(207);\n__webpack_require__(210);\n__webpack_require__(211);\n__webpack_require__(212);\n__webpack_require__(213);\n__webpack_require__(214);\n__webpack_require__(215);\n__webpack_require__(216);\n__webpack_require__(217);\n__webpack_require__(218);\n__webpack_require__(219);\n__webpack_require__(220);\n__webpack_require__(221);\n__webpack_require__(222);\n__webpack_require__(78);\n__webpack_require__(223);\n__webpack_require__(224);\n__webpack_require__(103);\n__webpack_require__(225);\n__webpack_require__(226);\n__webpack_require__(227);\n__webpack_require__(228);\n__webpack_require__(104);\n__webpack_require__(231);\n__webpack_require__(232);\n__webpack_require__(233);\n__webpack_require__(234);\n__webpack_require__(235);\n__webpack_require__(236);\n__webpack_require__(237);\n__webpack_require__(238);\n__webpack_require__(239);\n__webpack_require__(240);\n__webpack_require__(241);\n__webpack_require__(242);\n__webpack_require__(243);\n__webpack_require__(244);\n__webpack_require__(245);\n__webpack_require__(246);\n__webpack_require__(247);\n__webpack_require__(248);\n__webpack_require__(249);\n__webpack_require__(250);\n__webpack_require__(251);\n__webpack_require__(252);\n__webpack_require__(253);\n__webpack_require__(254);\n__webpack_require__(255);\n__webpack_require__(256);\n__webpack_require__(257);\n__webpack_require__(258);\n__webpack_require__(259);\nmodule.exports = __webpack_require__(9);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXM2L2luZGV4LmpzPzViZDciXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LmlzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5wYXJzZS1pbnQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm51bWJlci50by1maXhlZCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC5hY29zaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC5hc2luaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC5hdGFuaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC5jYnJ0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXRoLmNsejMyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXRoLmNvc2gnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGguZnJvdW5kJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXRoLmh5cG90Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXRoLmltdWwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGgubG9nMicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC5zaWduJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXRoLnNpbmgnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGgudGFuaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC50cnVuYycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLnJhdycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGgnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuYmlnJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5mb250Y29sb3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5saW5rJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5zdHJpa2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5zdWInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5zdXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmRhdGUubm93Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5kYXRlLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmRhdGUudG8tcHJpbWl0aXZlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuYXJyYXkuZnJvbScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuYXJyYXkub2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LmpvaW4nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LnNsaWNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5zb3J0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuYXJyYXkubWFwJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5maWx0ZXInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LnNvbWUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LmV2ZXJ5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5maWxsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWdleHAudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2gnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWFwJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zZXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LndlYWstbWFwJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi53ZWFrLXNldCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYudHlwZWQuYXJyYXktYnVmZmVyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi50eXBlZC5kYXRhLXZpZXcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnR5cGVkLmludDgtYXJyYXknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1jbGFtcGVkLWFycmF5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQxNi1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYudHlwZWQudWludDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDY0LWFycmF5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmFwcGx5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmNvbnN0cnVjdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVsZXRlLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmVudW1lcmF0ZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZmxlY3QuaGFzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmlzLWV4dGVuc2libGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZmxlY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnNldCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///116\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// ECMAScript 6 symbols shim\nvar global = __webpack_require__(3);\nvar has = __webpack_require__(13);\nvar DESCRIPTORS = __webpack_require__(8);\nvar $export = __webpack_require__(1);\nvar redefine = __webpack_require__(11);\nvar META = __webpack_require__(28).KEY;\nvar $fails = __webpack_require__(2);\nvar shared = __webpack_require__(58);\nvar setToStringTag = __webpack_require__(37);\nvar uid = __webpack_require__(30);\nvar wks = __webpack_require__(6);\nvar wksExt = __webpack_require__(59);\nvar wksDefine = __webpack_require__(85);\nvar enumKeys = __webpack_require__(118);\nvar isArray = __webpack_require__(62);\nvar anObject = __webpack_require__(5);\nvar isObject = __webpack_require__(4);\nvar toIObject = __webpack_require__(15);\nvar toPrimitive = __webpack_require__(27);\nvar createDesc = __webpack_require__(29);\nvar _create = __webpack_require__(34);\nvar gOPNExt = __webpack_require__(88);\nvar $GOPD = __webpack_require__(18);\nvar $DP = __webpack_require__(7);\nvar $keys = __webpack_require__(32);\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n __webpack_require__(35).f = gOPNExt.f = $getOwnPropertyNames;\n __webpack_require__(45).f = $propertyIsEnumerable;\n __webpack_require__(47).f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !__webpack_require__(31)) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(14)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3ltYm9sLmpzPzhhODEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIE1FVEEgPSByZXF1aXJlKCcuL19tZXRhJykuS0VZO1xudmFyICRmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciB3a3NEZWZpbmUgPSByZXF1aXJlKCcuL193a3MtZGVmaW5lJyk7XG52YXIgZW51bUtleXMgPSByZXF1aXJlKCcuL19lbnVtLWtleXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBfY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGdPUE5FeHQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbi1leHQnKTtcbnZhciAkR09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgJERQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUEQgPSAkR09QRC5mO1xudmFyIGRQID0gJERQLmY7XG52YXIgZ09QTiA9IGdPUE5FeHQuZjtcbnZhciAkU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciAkSlNPTiA9IGdsb2JhbC5KU09OO1xudmFyIF9zdHJpbmdpZnkgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgSElEREVOID0gd2tzKCdfaGlkZGVuJyk7XG52YXIgVE9fUFJJTUlUSVZFID0gd2tzKCd0b1ByaW1pdGl2ZScpO1xudmFyIGlzRW51bSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKTtcbnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7XG52YXIgT1BTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3RbUFJPVE9UWVBFXTtcbnZhciBVU0VfTkFUSVZFID0gdHlwZW9mICRTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcbnZhciBRT2JqZWN0ID0gZ2xvYmFsLlFPYmplY3Q7XG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBzZXR0ZXIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF9jcmVhdGUoZFAoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZFAodGhpcywgJ2EnLCB7IHZhbHVlOiA3IH0pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24gKGl0LCBrZXksIEQpIHtcbiAgdmFyIHByb3RvRGVzYyA9IGdPUEQoT2JqZWN0UHJvdG8sIGtleSk7XG4gIGlmIChwcm90b0Rlc2MpIGRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuICBkUChpdCwga2V5LCBEKTtcbiAgaWYgKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8pIGRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG59IDogZFA7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24gKHRhZykge1xuICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuICBzeW0uX2sgPSB0YWc7XG4gIHJldHVybiBzeW07XG59O1xuXG52YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCkge1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvKSAkZGVmaW5lUHJvcGVydHkoT1BTeW1ib2xzLCBrZXksIEQpO1xuICBhbk9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEQpO1xuICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkpIHtcbiAgICBpZiAoIUQuZW51bWVyYWJsZSkge1xuICAgICAgaWYgKCFoYXMoaXQsIEhJRERFTikpIGRQKGl0LCBISURERU4sIGNyZWF0ZURlc2MoMSwge30pKTtcbiAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSBpdFtISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEQgPSBfY3JlYXRlKEQsIHsgZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSkgfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzYyhpdCwga2V5LCBEKTtcbiAgfSByZXR1cm4gZFAoaXQsIGtleSwgRCk7XG59O1xudmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhpdCwgUCkge1xuICBhbk9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gZW51bUtleXMoUCA9IHRvSU9iamVjdChQKSk7XG4gIHZhciBpID0gMDtcbiAgdmFyIGwgPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGwgPiBpKSAkZGVmaW5lUHJvcGVydHkoaXQsIGtleSA9IGtleXNbaSsrXSwgUFtrZXldKTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGl0LCBQKSB7XG4gIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcbn07XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KSB7XG4gIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSk7XG4gIGlmICh0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICBpdCA9IHRvSU9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybjtcbiAgdmFyIEQgPSBnT1BEKGl0LCBrZXkpO1xuICBpZiAoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKSBELmVudW1lcmFibGUgPSB0cnVlO1xuICByZXR1cm4gRDtcbn07XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHZhciBuYW1lcyA9IGdPUE4odG9JT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmICghaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkge1xuICB2YXIgSVNfT1AgPSBpdCA9PT0gT2JqZWN0UHJvdG87XG4gIHZhciBuYW1lcyA9IGdPUE4oSVNfT1AgPyBPUFN5bWJvbHMgOiB0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSkgcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gMTkuNC4xLjEgU3ltYm9sKFtkZXNjcmlwdGlvbl0pXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpIHRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuICAgIHZhciB0YWcgPSB1aWQoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICAgIHZhciAkc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8pICRzZXQuY2FsbChPUFN5bWJvbHMsIHZhbHVlKTtcbiAgICAgIGlmIChoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKSB0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmIChERVNDUklQVE9SUyAmJiBzZXR0ZXIpIHNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8sIHRhZywgeyBjb25maWd1cmFibGU6IHRydWUsIHNldDogJHNldCB9KTtcbiAgICByZXR1cm4gd3JhcCh0YWcpO1xuICB9O1xuICByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9rO1xuICB9KTtcblxuICAkR09QRC5mID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgJERQLmYgPSAkZGVmaW5lUHJvcGVydHk7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZiA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgIXJlcXVpcmUoJy4vX2xpYnJhcnknKSkge1xuICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuICB9XG5cbiAgd2tzRXh0LmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgU3ltYm9sOiAkU3ltYm9sIH0pO1xuXG5mb3IgKHZhciBlczZTeW1ib2xzID0gKFxuICAvLyAxOS40LjIuMiwgMTkuNC4yLjMsIDE5LjQuMi40LCAxOS40LjIuNiwgMTkuNC4yLjgsIDE5LjQuMi45LCAxOS40LjIuMTAsIDE5LjQuMi4xMSwgMTkuNC4yLjEyLCAxOS40LjIuMTMsIDE5LjQuMi4xNFxuICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG4pLnNwbGl0KCcsJyksIGogPSAwOyBlczZTeW1ib2xzLmxlbmd0aCA+IGo7KXdrcyhlczZTeW1ib2xzW2orK10pO1xuXG5mb3IgKHZhciB3ZWxsS25vd25TeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgayA9IDA7IHdlbGxLbm93blN5bWJvbHMubGVuZ3RoID4gazspIHdrc0RlZmluZSh3ZWxsS25vd25TeW1ib2xzW2srK10pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnU3ltYm9sJywge1xuICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkge1xuICAgIGlmICghaXNTeW1ib2woc3ltKSkgdGhyb3cgVHlwZUVycm9yKHN5bSArICcgaXMgbm90IGEgc3ltYm9sIScpO1xuICAgIGZvciAodmFyIGtleSBpbiBTeW1ib2xSZWdpc3RyeSkgaWYgKFN5bWJvbFJlZ2lzdHJ5W2tleV0gPT09IHN5bSkgcmV0dXJuIGtleTtcbiAgfSxcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSBmYWxzZTsgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCFVU0VfTkFUSVZFIHx8ICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBTID0gJFN5bWJvbCgpO1xuICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHsgYTogUyB9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSkpLCAnSlNPTicsIHtcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpIHtcbiAgICB2YXIgYXJncyA9IFtpdF07XG4gICAgdmFyIGkgPSAxO1xuICAgIHZhciByZXBsYWNlciwgJHJlcGxhY2VyO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICAkcmVwbGFjZXIgPSByZXBsYWNlciA9IGFyZ3NbMV07XG4gICAgaWYgKCFpc09iamVjdChyZXBsYWNlcikgJiYgaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgJHJlcGxhY2VyID09ICdmdW5jdGlvbicpIHZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgYXJnc1sxXSA9IHJlcGxhY2VyO1xuICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcbiAgfVxufSk7XG5cbi8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcbiRTeW1ib2xbUFJPVE9UWVBFXVtUT19QUklNSVRJVkVdIHx8IHJlcXVpcmUoJy4vX2hpZGUnKSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xuLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgJ1N5bWJvbCcpO1xuLy8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcbi8vIDI0LjMuMyBKU09OW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///117\n")},function(module,exports,__webpack_require__){eval("// all enumerable object keys, includes symbols\nvar getKeys = __webpack_require__(32);\nvar gOPS = __webpack_require__(47);\nvar pIE = __webpack_require__(45);\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZW51bS1rZXlzLmpzP2Q0YzAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgcmVzdWx0ID0gZ2V0S2V5cyhpdCk7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICBpZiAoZ2V0U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdCk7XG4gICAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChzeW1ib2xzLmxlbmd0aCA+IGkpIGlmIChpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///118\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: __webpack_require__(34) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZS5qcz84NDc4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBjcmVhdGU6IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///119\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !__webpack_require__(8), 'Object', { defineProperty: __webpack_require__(7).f });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcz8xYzAxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSwgJ09iamVjdCcsIHsgZGVmaW5lUHJvcGVydHk6IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYgfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///120\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\n// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n$export($export.S + $export.F * !__webpack_require__(8), 'Object', { defineProperties: __webpack_require__(87) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzLmpzPzU4YjIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi4zIC8gMTUuMi4zLjcgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnRpZXM6IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///121\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = __webpack_require__(15);\nvar $getOwnPropertyDescriptor = __webpack_require__(18).f;\n\n__webpack_require__(19)('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcz85OTg2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///122\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(16);\nvar $getPrototypeOf = __webpack_require__(36);\n\n__webpack_require__(19)('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanM/ZTRmNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuOSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRQcm90b3R5cGVPZicsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKGl0KSB7XG4gICAgcmV0dXJuICRnZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///123\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(16);\nvar $keys = __webpack_require__(32);\n\n__webpack_require__(19)('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanM/NDU2ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///124\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.7 Object.getOwnPropertyNames(O)\n__webpack_require__(19)('getOwnPropertyNames', function () {\n return __webpack_require__(88).f;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMuanM/MjVkYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JykuZjtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///125\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.5 Object.freeze(O)\nvar isObject = __webpack_require__(4);\nvar meta = __webpack_require__(28).onFreeze;\n\n__webpack_require__(19)('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZS5qcz8wZDZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi41IE9iamVjdC5mcmVlemUoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZnJlZXplJywgZnVuY3Rpb24gKCRmcmVlemUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShpdCkge1xuICAgIHJldHVybiAkZnJlZXplICYmIGlzT2JqZWN0KGl0KSA/ICRmcmVlemUobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///126\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.17 Object.seal(O)\nvar isObject = __webpack_require__(4);\nvar meta = __webpack_require__(28).onFreeze;\n\n__webpack_require__(19)('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNlYWwuanM/Y2Y2YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTcgT2JqZWN0LnNlYWwoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnc2VhbCcsIGZ1bmN0aW9uICgkc2VhbCkge1xuICByZXR1cm4gZnVuY3Rpb24gc2VhbChpdCkge1xuICAgIHJldHVybiAkc2VhbCAmJiBpc09iamVjdChpdCkgPyAkc2VhbChtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///127\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = __webpack_require__(4);\nvar meta = __webpack_require__(28).onFreeze;\n\n__webpack_require__(19)('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcz85YWVhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi4xNSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgncHJldmVudEV4dGVuc2lvbnMnLCBmdW5jdGlvbiAoJHByZXZlbnRFeHRlbnNpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhpdCkge1xuICAgIHJldHVybiAkcHJldmVudEV4dGVuc2lvbnMgJiYgaXNPYmplY3QoaXQpID8gJHByZXZlbnRFeHRlbnNpb25zKG1ldGEoaXQpKSA6IGl0O1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///128\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.12 Object.isFrozen(O)\nvar isObject = __webpack_require__(4);\n\n__webpack_require__(19)('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qcz82NmM4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi4xMiBPYmplY3QuaXNGcm96ZW4oTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzRnJvemVuJywgZnVuY3Rpb24gKCRpc0Zyb3plbikge1xuICByZXR1cm4gZnVuY3Rpb24gaXNGcm96ZW4oaXQpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzRnJvemVuID8gJGlzRnJvemVuKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///129\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.13 Object.isSealed(O)\nvar isObject = __webpack_require__(4);\n\n__webpack_require__(19)('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZC5qcz81N2YwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi4xMyBPYmplY3QuaXNTZWFsZWQoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzU2VhbGVkJywgZnVuY3Rpb24gKCRpc1NlYWxlZCkge1xuICByZXR1cm4gZnVuY3Rpb24gaXNTZWFsZWQoaXQpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzU2VhbGVkID8gJGlzU2VhbGVkKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///130\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.11 Object.isExtensible(O)\nvar isObject = __webpack_require__(4);\n\n__webpack_require__(19)('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanM/MTY1YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTEgT2JqZWN0LmlzRXh0ZW5zaWJsZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNFeHRlbnNpYmxlJywgZnVuY3Rpb24gKCRpc0V4dGVuc2libGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlIDogZmFsc2U7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///131\n")},function(module,exports,__webpack_require__){eval("// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(1);\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(89) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcz9mNzUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHsgYXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJykgfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///132\n")},function(module,exports,__webpack_require__){eval("// 19.1.3.10 Object.is(value1, value2)\nvar $export = __webpack_require__(1);\n$export($export.S, 'Object', { is: __webpack_require__(134) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLmpzP2RiOTciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4zLjEwIE9iamVjdC5pcyh2YWx1ZTEsIHZhbHVlMilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgaXM6IHJlcXVpcmUoJy4vX3NhbWUtdmFsdWUnKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///133\n")},function(module,exports){eval("// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2FtZS12YWx1ZS5qcz84M2ExIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMi45IFNhbWVWYWx1ZSh4LCB5KVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaXMgfHwgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiB4ID09PSB5ID8geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkgOiB4ICE9IHggJiYgeSAhPSB5O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///134\n")},function(module,exports,__webpack_require__){eval("// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_require__(1);\n$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(64).set });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanM/ZmQyNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///135\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 19.1.3.6 Object.prototype.toString()\nvar classof = __webpack_require__(48);\nvar test = {};\ntest[__webpack_require__(6)('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n __webpack_require__(11)(Object.prototype, 'toString', function toString() {\n return '[object ' + classof(this) + ']';\n }, true);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcz8wNmRiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgdGVzdCA9IHt9O1xudGVzdFtyZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKV0gPSAneic7XG5pZiAodGVzdCArICcnICE9ICdbb2JqZWN0IHpdJykge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbiAgfSwgdHJ1ZSk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///136\n")},function(module,exports,__webpack_require__){eval("// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\nvar $export = __webpack_require__(1);\n\n$export($export.P, 'Function', { bind: __webpack_require__(90) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZC5qcz9kOTJhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjIuMy4yIC8gMTUuMy40LjUgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQodGhpc0FyZywgYXJncy4uLilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnRnVuY3Rpb24nLCB7IGJpbmQ6IHJlcXVpcmUoJy4vX2JpbmQnKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///137\n")},function(module,exports,__webpack_require__){eval("var dP = __webpack_require__(7).f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(8) && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZS5qcz83ZjdmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgRlByb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIG5hbWVSRSA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopLztcbnZhciBOQU1FID0gJ25hbWUnO1xuXG4vLyAxOS4yLjQuMiBuYW1lXG5OQU1FIGluIEZQcm90byB8fCByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmIGRQKEZQcm90bywgTkFNRSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKCcnICsgdGhpcykubWF0Y2gobmFtZVJFKVsxXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///138\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar isObject = __webpack_require__(4);\nvar getPrototypeOf = __webpack_require__(36);\nvar HAS_INSTANCE = __webpack_require__(6)('hasInstance');\nvar FunctionProto = Function.prototype;\n// 19.2.3.6 Function.prototype[@@hasInstance](V)\nif (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(7).f(FunctionProto, HAS_INSTANCE, { value: function (O) {\n if (typeof this != 'function' || !isObject(O)) return false;\n if (!isObject(this.prototype)) return O instanceof this;\n // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n while (O = getPrototypeOf(O)) if (this.prototype === O) return true;\n return false;\n} });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlLmpzPzIxN2IiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgSEFTX0lOU1RBTkNFID0gcmVxdWlyZSgnLi9fd2tzJykoJ2hhc0luc3RhbmNlJyk7XG52YXIgRnVuY3Rpb25Qcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIDE5LjIuMy42IEZ1bmN0aW9uLnByb3RvdHlwZVtAQGhhc0luc3RhbmNlXShWKVxuaWYgKCEoSEFTX0lOU1RBTkNFIGluIEZ1bmN0aW9uUHJvdG8pKSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mKEZ1bmN0aW9uUHJvdG8sIEhBU19JTlNUQU5DRSwgeyB2YWx1ZTogZnVuY3Rpb24gKE8pIHtcbiAgaWYgKHR5cGVvZiB0aGlzICE9ICdmdW5jdGlvbicgfHwgIWlzT2JqZWN0KE8pKSByZXR1cm4gZmFsc2U7XG4gIGlmICghaXNPYmplY3QodGhpcy5wcm90b3R5cGUpKSByZXR1cm4gTyBpbnN0YW5jZW9mIHRoaXM7XG4gIC8vIGZvciBlbnZpcm9ubWVudCB3L28gbmF0aXZlIGBAQGhhc0luc3RhbmNlYCBsb2dpYyBlbm91Z2ggYGluc3RhbmNlb2ZgLCBidXQgYWRkIHRoaXM6XG4gIHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpIGlmICh0aGlzLnByb3RvdHlwZSA9PT0gTykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn0gfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///139\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar $parseInt = __webpack_require__(92);\n// 18.2.5 parseInt(string, radix)\n$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtaW50LmpzPzE4ZDAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19wYXJzZS1pbnQnKTtcbi8vIDE4LjIuNSBwYXJzZUludChzdHJpbmcsIHJhZGl4KVxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkYgKiAocGFyc2VJbnQgIT0gJHBhcnNlSW50KSwgeyBwYXJzZUludDogJHBhcnNlSW50IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///140\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar $parseFloat = __webpack_require__(93);\n// 18.2.4 parseFloat(string)\n$export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtZmxvYXQuanM/YjcyYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fcGFyc2UtZmxvYXQnKTtcbi8vIDE4LjIuNCBwYXJzZUZsb2F0KHN0cmluZylcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5GICogKHBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCB7IHBhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///141\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar global = __webpack_require__(3);\nvar has = __webpack_require__(13);\nvar cof = __webpack_require__(23);\nvar inheritIfRequired = __webpack_require__(66);\nvar toPrimitive = __webpack_require__(27);\nvar fails = __webpack_require__(2);\nvar gOPN = __webpack_require__(35).f;\nvar gOPD = __webpack_require__(18).f;\nvar dP = __webpack_require__(7).f;\nvar $trim = __webpack_require__(49).trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(__webpack_require__(34)(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = __webpack_require__(8) ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n __webpack_require__(11)(global, NUMBER, $Number);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmNvbnN0cnVjdG9yLmpzP2M1ZjYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG52YXIgTlVNQkVSID0gJ051bWJlcic7XG52YXIgJE51bWJlciA9IGdsb2JhbFtOVU1CRVJdO1xudmFyIEJhc2UgPSAkTnVtYmVyO1xudmFyIHByb3RvID0gJE51bWJlci5wcm90b3R5cGU7XG4vLyBPcGVyYSB+MTIgaGFzIGJyb2tlbiBPYmplY3QjdG9TdHJpbmdcbnZhciBCUk9LRU5fQ09GID0gY29mKHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKShwcm90bykpID09IE5VTUJFUjtcbnZhciBUUklNID0gJ3RyaW0nIGluIFN0cmluZy5wcm90b3R5cGU7XG5cbi8vIDcuMS4zIFRvTnVtYmVyKGFyZ3VtZW50KVxudmFyIHRvTnVtYmVyID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBpdCA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCBmYWxzZSk7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgJiYgaXQubGVuZ3RoID4gMikge1xuICAgIGl0ID0gVFJJTSA/IGl0LnRyaW0oKSA6ICR0cmltKGl0LCAzKTtcbiAgICB2YXIgZmlyc3QgPSBpdC5jaGFyQ29kZUF0KDApO1xuICAgIHZhciB0aGlyZCwgcmFkaXgsIG1heENvZGU7XG4gICAgaWYgKGZpcnN0ID09PSA0MyB8fCBmaXJzdCA9PT0gNDUpIHtcbiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTtcbiAgICAgIGlmICh0aGlyZCA9PT0gODggfHwgdGhpcmQgPT09IDEyMCkgcmV0dXJuIE5hTjsgLy8gTnVtYmVyKCcrMHgxJykgc2hvdWxkIGJlIE5hTiwgb2xkIFY4IGZpeFxuICAgIH0gZWxzZSBpZiAoZmlyc3QgPT09IDQ4KSB7XG4gICAgICBzd2l0Y2ggKGl0LmNoYXJDb2RlQXQoMSkpIHtcbiAgICAgICAgY2FzZSA2NjogY2FzZSA5ODogcmFkaXggPSAyOyBtYXhDb2RlID0gNDk7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMGJbMDFdKyQvaVxuICAgICAgICBjYXNlIDc5OiBjYXNlIDExMTogcmFkaXggPSA4OyBtYXhDb2RlID0gNTU7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMG9bMC03XSskL2lcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICtpdDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGRpZ2l0cyA9IGl0LnNsaWNlKDIpLCBpID0gMCwgbCA9IGRpZ2l0cy5sZW5ndGgsIGNvZGU7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAvLyBwYXJzZUludCBwYXJzZXMgYSBzdHJpbmcgdG8gYSBmaXJzdCB1bmF2YWlsYWJsZSBzeW1ib2xcbiAgICAgICAgLy8gYnV0IFRvTnVtYmVyIHNob3VsZCByZXR1cm4gTmFOIGlmIGEgc3RyaW5nIGNvbnRhaW5zIHVuYXZhaWxhYmxlIHN5bWJvbHNcbiAgICAgICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gbWF4Q29kZSkgcmV0dXJuIE5hTjtcbiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpO1xuICAgIH1cbiAgfSByZXR1cm4gK2l0O1xufTtcblxuaWYgKCEkTnVtYmVyKCcgMG8xJykgfHwgISROdW1iZXIoJzBiMScpIHx8ICROdW1iZXIoJysweDEnKSkge1xuICAkTnVtYmVyID0gZnVuY3Rpb24gTnVtYmVyKHZhbHVlKSB7XG4gICAgdmFyIGl0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyAwIDogdmFsdWU7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHJldHVybiB0aGF0IGluc3RhbmNlb2YgJE51bWJlclxuICAgICAgLy8gY2hlY2sgb24gMS4uY29uc3RydWN0b3IoZm9vKSBjYXNlXG4gICAgICAmJiAoQlJPS0VOX0NPRiA/IGZhaWxzKGZ1bmN0aW9uICgpIHsgcHJvdG8udmFsdWVPZi5jYWxsKHRoYXQpOyB9KSA6IGNvZih0aGF0KSAhPSBOVU1CRVIpXG4gICAgICAgID8gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UodG9OdW1iZXIoaXQpKSwgdGhhdCwgJE51bWJlcikgOiB0b051bWJlcihpdCk7XG4gIH07XG4gIGZvciAodmFyIGtleXMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QTihCYXNlKSA6IChcbiAgICAvLyBFUzM6XG4gICAgJ01BWF9WQUxVRSxNSU5fVkFMVUUsTmFOLE5FR0FUSVZFX0lORklOSVRZLFBPU0lUSVZFX0lORklOSVRZLCcgK1xuICAgIC8vIEVTNiAoaW4gY2FzZSwgaWYgbW9kdWxlcyB3aXRoIEVTNiBOdW1iZXIgc3RhdGljcyByZXF1aXJlZCBiZWZvcmUpOlxuICAgICdFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsJyArXG4gICAgJ01JTl9TQUZFX0lOVEVHRVIscGFyc2VGbG9hdCxwYXJzZUludCxpc0ludGVnZXInXG4gICkuc3BsaXQoJywnKSwgaiA9IDAsIGtleTsga2V5cy5sZW5ndGggPiBqOyBqKyspIHtcbiAgICBpZiAoaGFzKEJhc2UsIGtleSA9IGtleXNbal0pICYmICFoYXMoJE51bWJlciwga2V5KSkge1xuICAgICAgZFAoJE51bWJlciwga2V5LCBnT1BEKEJhc2UsIGtleSkpO1xuICAgIH1cbiAgfVxuICAkTnVtYmVyLnByb3RvdHlwZSA9IHByb3RvO1xuICBwcm90by5jb25zdHJ1Y3RvciA9ICROdW1iZXI7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoZ2xvYmFsLCBOVU1CRVIsICROdW1iZXIpO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///142\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar toInteger = __webpack_require__(25);\nvar aNumberValue = __webpack_require__(94);\nvar repeat = __webpack_require__(67);\nvar $toFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\nvar ERROR = 'Number.toFixed: incorrect invocation!';\nvar ZERO = '0';\n\nvar multiply = function (n, c) {\n var i = -1;\n var c2 = c;\n while (++i < 6) {\n c2 += n * data[i];\n data[i] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n};\nvar divide = function (n) {\n var i = 6;\n var c = 0;\n while (--i >= 0) {\n c += data[i];\n data[i] = floor(c / n);\n c = (c % n) * 1e7;\n }\n};\nvar numToString = function () {\n var i = 6;\n var s = '';\n while (--i >= 0) {\n if (s !== '' || i === 0 || data[i] !== 0) {\n var t = String(data[i]);\n s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n }\n } return s;\n};\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\n$export($export.P + $export.F * (!!$toFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !__webpack_require__(2)(function () {\n // V8 ~ Android 4.3-\n $toFixed.call({});\n})), 'Number', {\n toFixed: function toFixed(fractionDigits) {\n var x = aNumberValue(this, ERROR);\n var f = toInteger(fractionDigits);\n var s = '';\n var m = ZERO;\n var e, z, j, k;\n if (f < 0 || f > 20) throw RangeError(ERROR);\n // eslint-disable-next-line no-self-compare\n if (x != x) return 'NaN';\n if (x <= -1e21 || x >= 1e21) return String(x);\n if (x < 0) {\n s = '-';\n x = -x;\n }\n if (x > 1e-21) {\n e = log(x * pow(2, 69, 1)) - 69;\n z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = f;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n m = numToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n m = numToString() + repeat.call(ZERO, f);\n }\n }\n if (f > 0) {\n k = m.length;\n m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n } else {\n m = s + m;\n } return m;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkLmpzPzAzNmMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgYU51bWJlclZhbHVlID0gcmVxdWlyZSgnLi9fYS1udW1iZXItdmFsdWUnKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCcuL19zdHJpbmctcmVwZWF0Jyk7XG52YXIgJHRvRml4ZWQgPSAxLjAudG9GaXhlZDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgZGF0YSA9IFswLCAwLCAwLCAwLCAwLCAwXTtcbnZhciBFUlJPUiA9ICdOdW1iZXIudG9GaXhlZDogaW5jb3JyZWN0IGludm9jYXRpb24hJztcbnZhciBaRVJPID0gJzAnO1xuXG52YXIgbXVsdGlwbHkgPSBmdW5jdGlvbiAobiwgYykge1xuICB2YXIgaSA9IC0xO1xuICB2YXIgYzIgPSBjO1xuICB3aGlsZSAoKytpIDwgNikge1xuICAgIGMyICs9IG4gKiBkYXRhW2ldO1xuICAgIGRhdGFbaV0gPSBjMiAlIDFlNztcbiAgICBjMiA9IGZsb29yKGMyIC8gMWU3KTtcbiAgfVxufTtcbnZhciBkaXZpZGUgPSBmdW5jdGlvbiAobikge1xuICB2YXIgaSA9IDY7XG4gIHZhciBjID0gMDtcbiAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgYyArPSBkYXRhW2ldO1xuICAgIGRhdGFbaV0gPSBmbG9vcihjIC8gbik7XG4gICAgYyA9IChjICUgbikgKiAxZTc7XG4gIH1cbn07XG52YXIgbnVtVG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpID0gNjtcbiAgdmFyIHMgPSAnJztcbiAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgaWYgKHMgIT09ICcnIHx8IGkgPT09IDAgfHwgZGF0YVtpXSAhPT0gMCkge1xuICAgICAgdmFyIHQgPSBTdHJpbmcoZGF0YVtpXSk7XG4gICAgICBzID0gcyA9PT0gJycgPyB0IDogcyArIHJlcGVhdC5jYWxsKFpFUk8sIDcgLSB0Lmxlbmd0aCkgKyB0O1xuICAgIH1cbiAgfSByZXR1cm4gcztcbn07XG52YXIgcG93ID0gZnVuY3Rpb24gKHgsIG4sIGFjYykge1xuICByZXR1cm4gbiA9PT0gMCA/IGFjYyA6IG4gJSAyID09PSAxID8gcG93KHgsIG4gLSAxLCBhY2MgKiB4KSA6IHBvdyh4ICogeCwgbiAvIDIsIGFjYyk7XG59O1xudmFyIGxvZyA9IGZ1bmN0aW9uICh4KSB7XG4gIHZhciBuID0gMDtcbiAgdmFyIHgyID0geDtcbiAgd2hpbGUgKHgyID49IDQwOTYpIHtcbiAgICBuICs9IDEyO1xuICAgIHgyIC89IDQwOTY7XG4gIH1cbiAgd2hpbGUgKHgyID49IDIpIHtcbiAgICBuICs9IDE7XG4gICAgeDIgLz0gMjtcbiAgfSByZXR1cm4gbjtcbn07XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKCEhJHRvRml4ZWQgJiYgKFxuICAwLjAwMDA4LnRvRml4ZWQoMykgIT09ICcwLjAwMCcgfHxcbiAgMC45LnRvRml4ZWQoMCkgIT09ICcxJyB8fFxuICAxLjI1NS50b0ZpeGVkKDIpICE9PSAnMS4yNScgfHxcbiAgMTAwMDAwMDAwMDAwMDAwMDEyOC4wLnRvRml4ZWQoMCkgIT09ICcxMDAwMDAwMDAwMDAwMDAwMTI4J1xuKSB8fCAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXG4gICR0b0ZpeGVkLmNhbGwoe30pO1xufSkpLCAnTnVtYmVyJywge1xuICB0b0ZpeGVkOiBmdW5jdGlvbiB0b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKSB7XG4gICAgdmFyIHggPSBhTnVtYmVyVmFsdWUodGhpcywgRVJST1IpO1xuICAgIHZhciBmID0gdG9JbnRlZ2VyKGZyYWN0aW9uRGlnaXRzKTtcbiAgICB2YXIgcyA9ICcnO1xuICAgIHZhciBtID0gWkVSTztcbiAgICB2YXIgZSwgeiwgaiwgaztcbiAgICBpZiAoZiA8IDAgfHwgZiA+IDIwKSB0aHJvdyBSYW5nZUVycm9yKEVSUk9SKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKHggIT0geCkgcmV0dXJuICdOYU4nO1xuICAgIGlmICh4IDw9IC0xZTIxIHx8IHggPj0gMWUyMSkgcmV0dXJuIFN0cmluZyh4KTtcbiAgICBpZiAoeCA8IDApIHtcbiAgICAgIHMgPSAnLSc7XG4gICAgICB4ID0gLXg7XG4gICAgfVxuICAgIGlmICh4ID4gMWUtMjEpIHtcbiAgICAgIGUgPSBsb2coeCAqIHBvdygyLCA2OSwgMSkpIC0gNjk7XG4gICAgICB6ID0gZSA8IDAgPyB4ICogcG93KDIsIC1lLCAxKSA6IHggLyBwb3coMiwgZSwgMSk7XG4gICAgICB6ICo9IDB4MTAwMDAwMDAwMDAwMDA7XG4gICAgICBlID0gNTIgLSBlO1xuICAgICAgaWYgKGUgPiAwKSB7XG4gICAgICAgIG11bHRpcGx5KDAsIHopO1xuICAgICAgICBqID0gZjtcbiAgICAgICAgd2hpbGUgKGogPj0gNykge1xuICAgICAgICAgIG11bHRpcGx5KDFlNywgMCk7XG4gICAgICAgICAgaiAtPSA3O1xuICAgICAgICB9XG4gICAgICAgIG11bHRpcGx5KHBvdygxMCwgaiwgMSksIDApO1xuICAgICAgICBqID0gZSAtIDE7XG4gICAgICAgIHdoaWxlIChqID49IDIzKSB7XG4gICAgICAgICAgZGl2aWRlKDEgPDwgMjMpO1xuICAgICAgICAgIGogLT0gMjM7XG4gICAgICAgIH1cbiAgICAgICAgZGl2aWRlKDEgPDwgaik7XG4gICAgICAgIG11bHRpcGx5KDEsIDEpO1xuICAgICAgICBkaXZpZGUoMik7XG4gICAgICAgIG0gPSBudW1Ub1N0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXVsdGlwbHkoMCwgeik7XG4gICAgICAgIG11bHRpcGx5KDEgPDwgLWUsIDApO1xuICAgICAgICBtID0gbnVtVG9TdHJpbmcoKSArIHJlcGVhdC5jYWxsKFpFUk8sIGYpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZiA+IDApIHtcbiAgICAgIGsgPSBtLmxlbmd0aDtcbiAgICAgIG0gPSBzICsgKGsgPD0gZiA/ICcwLicgKyByZXBlYXQuY2FsbChaRVJPLCBmIC0gaykgKyBtIDogbS5zbGljZSgwLCBrIC0gZikgKyAnLicgKyBtLnNsaWNlKGsgLSBmKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBzICsgbTtcbiAgICB9IHJldHVybiBtO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///143\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $fails = __webpack_require__(2);\nvar aNumberValue = __webpack_require__(94);\nvar $toPrecision = 1.0.toPrecision;\n\n$export($export.P + $export.F * ($fails(function () {\n // IE7-\n return $toPrecision.call(1, undefined) !== '1';\n}) || !$fails(function () {\n // V8 ~ Android 4.3-\n $toPrecision.call({});\n})), 'Number', {\n toPrecision: function toPrecision(precision) {\n var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbi5qcz81NGE4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBhTnVtYmVyVmFsdWUgPSByZXF1aXJlKCcuL19hLW51bWJlci12YWx1ZScpO1xudmFyICR0b1ByZWNpc2lvbiA9IDEuMC50b1ByZWNpc2lvbjtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gSUU3LVxuICByZXR1cm4gJHRvUHJlY2lzaW9uLmNhbGwoMSwgdW5kZWZpbmVkKSAhPT0gJzEnO1xufSkgfHwgISRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXG4gICR0b1ByZWNpc2lvbi5jYWxsKHt9KTtcbn0pKSwgJ051bWJlcicsIHtcbiAgdG9QcmVjaXNpb246IGZ1bmN0aW9uIHRvUHJlY2lzaW9uKHByZWNpc2lvbikge1xuICAgIHZhciB0aGF0ID0gYU51bWJlclZhbHVlKHRoaXMsICdOdW1iZXIjdG9QcmVjaXNpb246IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICAgIHJldHVybiBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQpIDogJHRvUHJlY2lzaW9uLmNhbGwodGhhdCwgcHJlY2lzaW9uKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///144\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.1 Number.EPSILON\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24uanM/MmUzNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuMSBOdW1iZXIuRVBTSUxPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IEVQU0lMT046IE1hdGgucG93KDIsIC01MikgfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///145\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(1);\nvar _isFinite = __webpack_require__(3).isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZS5qcz9mY2EwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi4yIE51bWJlci5pc0Zpbml0ZShudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIF9pc0Zpbml0ZSA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmlzRmluaXRlO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNGaW5pdGU6IGZ1bmN0aW9uIGlzRmluaXRlKGl0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnbnVtYmVyJyAmJiBfaXNGaW5pdGUoaXQpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///146\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Number', { isInteger: __webpack_require__(95) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXIuanM/N2NkZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBpc0ludGVnZXI6IHJlcXVpcmUoJy4vX2lzLWludGVnZXInKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///147\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qcz9lZTFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi40IE51bWJlci5pc05hTihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///148\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require__(1);\nvar isInteger = __webpack_require__(95);\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlci5qcz9iMWIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi41IE51bWJlci5pc1NhZmVJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi9faXMtaW50ZWdlcicpO1xudmFyIGFicyA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNTYWZlSW50ZWdlcjogZnVuY3Rpb24gaXNTYWZlSW50ZWdlcihudW1iZXIpIHtcbiAgICByZXR1cm4gaXNJbnRlZ2VyKG51bWJlcikgJiYgYWJzKG51bWJlcikgPD0gMHgxZmZmZmZmZmZmZmZmZjtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///149\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXIuanM/ODdmMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuNiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IE1BWF9TQUZFX0lOVEVHRVI6IDB4MWZmZmZmZmZmZmZmZmYgfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///150\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanM/OTI3OCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuMTAgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBNSU5fU0FGRV9JTlRFR0VSOiAtMHgxZmZmZmZmZmZmZmZmZiB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///151\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar $parseFloat = __webpack_require__(93);\n// 20.1.2.12 Number.parseFloat(string)\n$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0LmpzPzVkZjIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX3BhcnNlLWZsb2F0Jyk7XG4vLyAyMC4xLjIuMTIgTnVtYmVyLnBhcnNlRmxvYXQoc3RyaW5nKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTnVtYmVyLnBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCAnTnVtYmVyJywgeyBwYXJzZUZsb2F0OiAkcGFyc2VGbG9hdCB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///152\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar $parseInt = __webpack_require__(92);\n// 20.1.2.13 Number.parseInt(string, radix)\n$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludC5qcz8wNGZmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAyMC4xLjIuMTMgTnVtYmVyLnBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChOdW1iZXIucGFyc2VJbnQgIT0gJHBhcnNlSW50KSwgJ051bWJlcicsIHsgcGFyc2VJbnQ6ICRwYXJzZUludCB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///153\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.3 Math.acosh(x)\nvar $export = __webpack_require__(1);\nvar log1p = __webpack_require__(96);\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hY29zaC5qcz83ZjI1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4zIE1hdGguYWNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbG9nMXAgPSByZXF1aXJlKCcuL19tYXRoLWxvZzFwJyk7XG52YXIgc3FydCA9IE1hdGguc3FydDtcbnZhciAkYWNvc2ggPSBNYXRoLmFjb3NoO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFjb3NoXG4gIC8vIFY4IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM1MDlcbiAgJiYgTWF0aC5mbG9vcigkYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpID09IDcxMFxuICAvLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYWNvc2goSW5maW5pdHkpIC0+IE5hTlxuICAmJiAkYWNvc2goSW5maW5pdHkpID09IEluZmluaXR5XG4pLCAnTWF0aCcsIHtcbiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpIHtcbiAgICByZXR1cm4gKHggPSAreCkgPCAxID8gTmFOIDogeCA+IDk0OTA2MjY1LjYyNDI1MTU2XG4gICAgICA/IE1hdGgubG9nKHgpICsgTWF0aC5MTjJcbiAgICAgIDogbG9nMXAoeCAtIDEgKyBzcXJ0KHggLSAxKSAqIHNxcnQoeCArIDEpKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///154\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.5 Math.asinh(x)\nvar $export = __webpack_require__(1);\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hc2luaC5qcz81MzZiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi41IE1hdGguYXNpbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGFzaW5oID0gTWF0aC5hc2luaDtcblxuZnVuY3Rpb24gYXNpbmgoeCkge1xuICByZXR1cm4gIWlzRmluaXRlKHggPSAreCkgfHwgeCA9PSAwID8geCA6IHggPCAwID8gLWFzaW5oKC14KSA6IE1hdGgubG9nKHggKyBNYXRoLnNxcnQoeCAqIHggKyAxKSk7XG59XG5cbi8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hc2luaCgwKSAtPiAtMFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKCRhc2luaCAmJiAxIC8gJGFzaW5oKDApID4gMCksICdNYXRoJywgeyBhc2luaDogYXNpbmggfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///155\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.7 Math.atanh(x)\nvar $export = __webpack_require__(1);\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qcz9kOWFiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi43IE1hdGguYXRhbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGF0YW5oID0gTWF0aC5hdGFuaDtcblxuLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmF0YW5oKC0wKSAtPiAwXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGF0YW5oICYmIDEgLyAkYXRhbmgoLTApIDwgMCksICdNYXRoJywge1xuICBhdGFuaDogZnVuY3Rpb24gYXRhbmgoeCkge1xuICAgIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IE1hdGgubG9nKCgxICsgeCkgLyAoMSAtIHgpKSAvIDI7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///156\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.9 Math.cbrt(x)\nvar $export = __webpack_require__(1);\nvar sign = __webpack_require__(68);\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jYnJ0LmpzP2Y5YWIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjkgTWF0aC5jYnJ0KHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNpZ24gPSByZXF1aXJlKCcuL19tYXRoLXNpZ24nKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjYnJ0OiBmdW5jdGlvbiBjYnJ0KHgpIHtcbiAgICByZXR1cm4gc2lnbih4ID0gK3gpICogTWF0aC5wb3coTWF0aC5hYnMoeCksIDEgLyAzKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///157\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.11 Math.clz32(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jbHozMi5qcz8zMmQ3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4xMSBNYXRoLmNsejMyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNsejMyOiBmdW5jdGlvbiBjbHozMih4KSB7XG4gICAgcmV0dXJuICh4ID4+Pj0gMCkgPyAzMSAtIE1hdGguZmxvb3IoTWF0aC5sb2coeCArIDAuNSkgKiBNYXRoLkxPRzJFKSA6IDMyO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///158\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.12 Math.cosh(x)\nvar $export = __webpack_require__(1);\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jb3NoLmpzPzI1YzkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjEyIE1hdGguY29zaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjb3NoOiBmdW5jdGlvbiBjb3NoKHgpIHtcbiAgICByZXR1cm4gKGV4cCh4ID0gK3gpICsgZXhwKC14KSkgLyAyO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///159\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.14 Math.expm1(x)\nvar $export = __webpack_require__(1);\nvar $expm1 = __webpack_require__(69);\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5leHBtMS5qcz85ZjNjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4xNCBNYXRoLmV4cG0xKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoJGV4cG0xICE9IE1hdGguZXhwbTEpLCAnTWF0aCcsIHsgZXhwbTE6ICRleHBtMSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///160\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.16 Math.fround(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', { fround: __webpack_require__(162) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5mcm91bmQuanM/MDQyZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgZnJvdW5kOiByZXF1aXJlKCcuL19tYXRoLWZyb3VuZCcpIH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///161\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.16 Math.fround(x)\nvar sign = __webpack_require__(68);\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1mcm91bmQuanM/OTFjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciBzaWduID0gcmVxdWlyZSgnLi9fbWF0aC1zaWduJyk7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgRVBTSUxPTiA9IHBvdygyLCAtNTIpO1xudmFyIEVQU0lMT04zMiA9IHBvdygyLCAtMjMpO1xudmFyIE1BWDMyID0gcG93KDIsIDEyNykgKiAoMiAtIEVQU0lMT04zMik7XG52YXIgTUlOMzIgPSBwb3coMiwgLTEyNik7XG5cbnZhciByb3VuZFRpZXNUb0V2ZW4gPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gbiArIDEgLyBFUFNJTE9OIC0gMSAvIEVQU0lMT047XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguZnJvdW5kIHx8IGZ1bmN0aW9uIGZyb3VuZCh4KSB7XG4gIHZhciAkYWJzID0gTWF0aC5hYnMoeCk7XG4gIHZhciAkc2lnbiA9IHNpZ24oeCk7XG4gIHZhciBhLCByZXN1bHQ7XG4gIGlmICgkYWJzIDwgTUlOMzIpIHJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7XG4gIGEgPSAoMSArIEVQU0lMT04zMiAvIEVQU0lMT04pICogJGFicztcbiAgcmVzdWx0ID0gYSAtIChhIC0gJGFicyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgaWYgKHJlc3VsdCA+IE1BWDMyIHx8IHJlc3VsdCAhPSByZXN1bHQpIHJldHVybiAkc2lnbiAqIEluZmluaXR5O1xuICByZXR1cm4gJHNpZ24gKiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///162\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = __webpack_require__(1);\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5oeXBvdC5qcz9jN2M2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4xNyBNYXRoLmh5cG90KFt2YWx1ZTFbLCB2YWx1ZTJbLCDigKYgXV1dKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhYnMgPSBNYXRoLmFicztcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBoeXBvdDogZnVuY3Rpb24gaHlwb3QodmFsdWUxLCB2YWx1ZTIpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGxhcmcgPSAwO1xuICAgIHZhciBhcmcsIGRpdjtcbiAgICB3aGlsZSAoaSA8IGFMZW4pIHtcbiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7XG4gICAgICBpZiAobGFyZyA8IGFyZykge1xuICAgICAgICBkaXYgPSBsYXJnIC8gYXJnO1xuICAgICAgICBzdW0gPSBzdW0gKiBkaXYgKiBkaXYgKyAxO1xuICAgICAgICBsYXJnID0gYXJnO1xuICAgICAgfSBlbHNlIGlmIChhcmcgPiAwKSB7XG4gICAgICAgIGRpdiA9IGFyZyAvIGxhcmc7XG4gICAgICAgIHN1bSArPSBkaXYgKiBkaXY7XG4gICAgICB9IGVsc2Ugc3VtICs9IGFyZztcbiAgICB9XG4gICAgcmV0dXJuIGxhcmcgPT09IEluZmluaXR5ID8gSW5maW5pdHkgOiBsYXJnICogTWF0aC5zcXJ0KHN1bSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///163\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.18 Math.imul(x, y)\nvar $export = __webpack_require__(1);\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * __webpack_require__(2)(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5pbXVsLmpzP2Y0ZmYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjE4IE1hdGguaW11bCh4LCB5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkaW11bCA9IE1hdGguaW11bDtcblxuLy8gc29tZSBXZWJLaXQgdmVyc2lvbnMgZmFpbHMgd2l0aCBiaWcgbnVtYmVycywgc29tZSBoYXMgd3JvbmcgYXJpdHlcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkaW11bCgweGZmZmZmZmZmLCA1KSAhPSAtNSB8fCAkaW11bC5sZW5ndGggIT0gMjtcbn0pLCAnTWF0aCcsIHtcbiAgaW11bDogZnVuY3Rpb24gaW11bCh4LCB5KSB7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZjtcbiAgICB2YXIgeG4gPSAreDtcbiAgICB2YXIgeW4gPSAreTtcbiAgICB2YXIgeGwgPSBVSU5UMTYgJiB4bjtcbiAgICB2YXIgeWwgPSBVSU5UMTYgJiB5bjtcbiAgICByZXR1cm4gMCB8IHhsICogeWwgKyAoKFVJTlQxNiAmIHhuID4+PiAxNikgKiB5bCArIHhsICogKFVJTlQxNiAmIHluID4+PiAxNikgPDwgMTYgPj4+IDApO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///164\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.21 Math.log10(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxMC5qcz83ODcyIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4yMSBNYXRoLmxvZzEwKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGxvZzEwOiBmdW5jdGlvbiBsb2cxMCh4KSB7XG4gICAgcmV0dXJuIE1hdGgubG9nKHgpICogTWF0aC5MT0cxMEU7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///165\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.20 Math.log1p(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', { log1p: __webpack_require__(96) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxcC5qcz8wNDlmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IGxvZzFwOiByZXF1aXJlKCcuL19tYXRoLWxvZzFwJykgfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///166\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.22 Math.log2(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cyLmpzP2E2OWYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjIyIE1hdGgubG9nMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBsb2cyOiBmdW5jdGlvbiBsb2cyKHgpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgLyBNYXRoLkxOMjtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///167\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.28 Math.sign(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', { sign: __webpack_require__(68) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaWduLmpzPzBiMjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjI4IE1hdGguc2lnbih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBzaWduOiByZXF1aXJlKCcuL19tYXRoLXNpZ24nKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///168\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.30 Math.sinh(x)\nvar $export = __webpack_require__(1);\nvar expm1 = __webpack_require__(69);\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * __webpack_require__(2)(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaW5oLmpzPzZjMWEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjMwIE1hdGguc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuLy8gVjggbmVhciBDaHJvbWl1bSAzOCBoYXMgYSBwcm9ibGVtIHdpdGggdmVyeSBzbWFsbCBudW1iZXJzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIU1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNztcbn0pLCAnTWF0aCcsIHtcbiAgc2luaDogZnVuY3Rpb24gc2luaCh4KSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHggPSAreCkgPCAxXG4gICAgICA/IChleHBtMSh4KSAtIGV4cG0xKC14KSkgLyAyXG4gICAgICA6IChleHAoeCAtIDEpIC0gZXhwKC14IC0gMSkpICogKE1hdGguRSAvIDIpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///169\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.33 Math.tanh(x)\nvar $export = __webpack_require__(1);\nvar expm1 = __webpack_require__(69);\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50YW5oLmpzP2M3YzYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjMzIE1hdGgudGFuaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB0YW5oOiBmdW5jdGlvbiB0YW5oKHgpIHtcbiAgICB2YXIgYSA9IGV4cG0xKHggPSAreCk7XG4gICAgdmFyIGIgPSBleHBtMSgteCk7XG4gICAgcmV0dXJuIGEgPT0gSW5maW5pdHkgPyAxIDogYiA9PSBJbmZpbml0eSA/IC0xIDogKGEgLSBiKSAvIChleHAoeCkgKyBleHAoLXgpKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///170\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.34 Math.trunc(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50cnVuYy5qcz84NGI0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4zNCBNYXRoLnRydW5jKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHRydW5jOiBmdW5jdGlvbiB0cnVuYyhpdCkge1xuICAgIHJldHVybiAoaXQgPiAwID8gTWF0aC5mbG9vciA6IE1hdGguY2VpbCkoaXQpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///171\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar toAbsoluteIndex = __webpack_require__(33);\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcz81Njk1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyICRmcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG5cbi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW1cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCEhJGZyb21Db2RlUG9pbnQgJiYgJGZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDEpLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuMiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5jb2RlUG9pbnRzKVxuICBmcm9tQ29kZVBvaW50OiBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBjb2RlO1xuICAgIHdoaWxlIChhTGVuID4gaSkge1xuICAgICAgY29kZSA9ICthcmd1bWVudHNbaSsrXTtcbiAgICAgIGlmICh0b0Fic29sdXRlSW5kZXgoY29kZSwgMHgxMGZmZmYpICE9PSBjb2RlKSB0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIHJlcy5wdXNoKGNvZGUgPCAweDEwMDAwXG4gICAgICAgID8gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweGQ4MDAsIGNvZGUgJSAweDQwMCArIDB4ZGMwMClcbiAgICAgICk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///172\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar toIObject = __webpack_require__(15);\nvar toLength = __webpack_require__(10);\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTczLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJhdy5qcz83ODhkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuNCBTdHJpbmcucmF3KGNhbGxTaXRlLCAuLi5zdWJzdGl0dXRpb25zKVxuICByYXc6IGZ1bmN0aW9uIHJhdyhjYWxsU2l0ZSkge1xuICAgIHZhciB0cGwgPSB0b0lPYmplY3QoY2FsbFNpdGUucmF3KTtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodHBsLmxlbmd0aCk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGxlbiA+IGkpIHtcbiAgICAgIHJlcy5wdXNoKFN0cmluZyh0cGxbaSsrXSkpO1xuICAgICAgaWYgKGkgPCBhTGVuKSByZXMucHVzaChTdHJpbmcoYXJndW1lbnRzW2ldKSk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///173\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 21.1.3.25 String.prototype.trim()\n__webpack_require__(49)('trim', function ($trim) {\n return function trim() {\n return $trim(this, 3);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0uanM/NGYzNyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyAyMS4xLjMuMjUgU3RyaW5nLnByb3RvdHlwZS50cmltKClcbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW0nLCBmdW5jdGlvbiAoJHRyaW0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDMpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///174\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $at = __webpack_require__(97)(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\n__webpack_require__(70)(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzPzVkZjMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGluZGV4ID0gdGhpcy5faTtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gTy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///175\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $at = __webpack_require__(97)(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanM/YTAzMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKGZhbHNlKTtcbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMyBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KHBvcylcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcykge1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///176\n")},function(module,exports,__webpack_require__){"use strict";eval("// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n\nvar $export = __webpack_require__(1);\nvar toLength = __webpack_require__(10);\nvar context = __webpack_require__(71);\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(73)(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aC5qcz9hZWY2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIxLjEuMy42IFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgoc2VhcmNoU3RyaW5nIFssIGVuZFBvc2l0aW9uXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjb250ZXh0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKTtcbnZhciBFTkRTX1dJVEggPSAnZW5kc1dpdGgnO1xudmFyICRlbmRzV2l0aCA9ICcnW0VORFNfV0lUSF07XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMtaXMtcmVnZXhwJykoRU5EU19XSVRIKSwgJ1N0cmluZycsIHtcbiAgZW5kc1dpdGg6IGZ1bmN0aW9uIGVuZHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIGVuZFBvc2l0aW9uID0gQGxlbmd0aCAqLykge1xuICAgIHZhciB0aGF0ID0gY29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIEVORFNfV0lUSCk7XG4gICAgdmFyIGVuZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKTtcbiAgICB2YXIgZW5kID0gZW5kUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IGxlbiA6IE1hdGgubWluKHRvTGVuZ3RoKGVuZFBvc2l0aW9uKSwgbGVuKTtcbiAgICB2YXIgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRlbmRzV2l0aFxuICAgICAgPyAkZW5kc1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///177\n")},function(module,exports,__webpack_require__){"use strict";eval("// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\nvar $export = __webpack_require__(1);\nvar context = __webpack_require__(71);\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * __webpack_require__(73)(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzLmpzPzJmZGIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjEuMS4zLjcgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyhzZWFyY2hTdHJpbmcsIHBvc2l0aW9uID0gMClcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgSU5DTFVERVMgPSAnaW5jbHVkZXMnO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKElOQ0xVREVTKSwgJ1N0cmluZycsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5jb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgSU5DTFVERVMpXG4gICAgICAuaW5kZXhPZihzZWFyY2hTdHJpbmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///178\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: __webpack_require__(67)\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdC5qcz8xNGI5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMTMgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQoY291bnQpXG4gIHJlcGVhdDogcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///179\n")},function(module,exports,__webpack_require__){"use strict";eval("// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\nvar $export = __webpack_require__(1);\nvar toLength = __webpack_require__(10);\nvar context = __webpack_require__(71);\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(73)(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoLmpzP2Y1NTkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjEuMS4zLjE4IFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgWywgcG9zaXRpb24gXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjb250ZXh0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKTtcbnZhciBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJztcbnZhciAkc3RhcnRzV2l0aCA9ICcnW1NUQVJUU19XSVRIXTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShTVEFSVFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgU1RBUlRTX1dJVEgpO1xuICAgIHZhciBpbmRleCA9IHRvTGVuZ3RoKE1hdGgubWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gJHN0YXJ0c1dpdGhcbiAgICAgID8gJHN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///180\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.2 String.prototype.anchor(name)\n__webpack_require__(12)('anchor', function (createHTML) {\n return function anchor(name) {\n return createHTML(this, 'a', 'name', name);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmFuY2hvci5qcz84NDQ5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjIgU3RyaW5nLnByb3RvdHlwZS5hbmNob3IobmFtZSlcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2FuY2hvcicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBhbmNob3IobmFtZSkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ25hbWUnLCBuYW1lKTtcbiAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///181\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.3 String.prototype.big()\n__webpack_require__(12)('big', function (createHTML) {\n return function big() {\n return createHTML(this, 'big', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJpZy5qcz85Yzg2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjMgU3RyaW5nLnByb3RvdHlwZS5iaWcoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYmlnJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJpZygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYmlnJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///182\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.4 String.prototype.blink()\n__webpack_require__(12)('blink', function (createHTML) {\n return function blink() {\n return createHTML(this, 'blink', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJsaW5rLmpzP2ZhODMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNCBTdHJpbmcucHJvdG90eXBlLmJsaW5rKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JsaW5rJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJsaW5rKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdibGluaycsICcnLCAnJyk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///183\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.5 String.prototype.bold()\n__webpack_require__(12)('bold', function (createHTML) {\n return function bold() {\n return createHTML(this, 'b', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJvbGQuanM/NDhjMCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy41IFN0cmluZy5wcm90b3R5cGUuYm9sZCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdib2xkJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJvbGQoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2InLCAnJywgJycpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///184\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.6 String.prototype.fixed()\n__webpack_require__(12)('fixed', function (createHTML) {\n return function fixed() {\n return createHTML(this, 'tt', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkLmpzP2QyNjMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNiBTdHJpbmcucHJvdG90eXBlLmZpeGVkKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZpeGVkJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZpeGVkKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICd0dCcsICcnLCAnJyk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///185\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.7 String.prototype.fontcolor(color)\n__webpack_require__(12)('fontcolor', function (createHTML) {\n return function fontcolor(color) {\n return createHTML(this, 'font', 'color', color);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvci5qcz82YzM3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjcgU3RyaW5nLnByb3RvdHlwZS5mb250Y29sb3IoY29sb3IpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmb250Y29sb3InLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9udGNvbG9yKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2ZvbnQnLCAnY29sb3InLCBjb2xvcik7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///186\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.8 String.prototype.fontsize(size)\n__webpack_require__(12)('fontsize', function (createHTML) {\n return function fontsize(size) {\n return createHTML(this, 'font', 'size', size);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRzaXplLmpzPzllYzgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuOCBTdHJpbmcucHJvdG90eXBlLmZvbnRzaXplKHNpemUpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmb250c2l6ZScsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb250c2l6ZShzaXplKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2ZvbnQnLCAnc2l6ZScsIHNpemUpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///187\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.9 String.prototype.italics()\n__webpack_require__(12)('italics', function (createHTML) {\n return function italics() {\n return createHTML(this, 'i', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MuanM/ZDBiMCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy45IFN0cmluZy5wcm90b3R5cGUuaXRhbGljcygpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdpdGFsaWNzJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGl0YWxpY3MoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2knLCAnJywgJycpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///188\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.10 String.prototype.link(url)\n__webpack_require__(12)('link', function (createHTML) {\n return function link(url) {\n return createHTML(this, 'a', 'href', url);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmxpbmsuanM/YjU0YSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMCBTdHJpbmcucHJvdG90eXBlLmxpbmsodXJsKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnbGluaycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBsaW5rKHVybCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ2hyZWYnLCB1cmwpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///189\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.11 String.prototype.small()\n__webpack_require__(12)('small', function (createHTML) {\n return function small() {\n return createHTML(this, 'small', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnNtYWxsLmpzP2YzODYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTEgU3RyaW5nLnByb3RvdHlwZS5zbWFsbCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzbWFsbCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzbWFsbCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc21hbGwnLCAnJywgJycpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///190\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.12 String.prototype.strike()\n__webpack_require__(12)('strike', function (createHTML) {\n return function strike() {\n return createHTML(this, 'strike', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0cmlrZS5qcz8xNDQ4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEyIFN0cmluZy5wcm90b3R5cGUuc3RyaWtlKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N0cmlrZScsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdHJpa2UoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N0cmlrZScsICcnLCAnJyk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///191\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.13 String.prototype.sub()\n__webpack_require__(12)('sub', function (createHTML) {\n return function sub() {\n return createHTML(this, 'sub', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1Yi5qcz82NzNlIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEzIFN0cmluZy5wcm90b3R5cGUuc3ViKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1YicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdWIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1YicsICcnLCAnJyk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///192\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.14 String.prototype.sup()\n__webpack_require__(12)('sup', function (createHTML) {\n return function sup() {\n return createHTML(this, 'sup', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1cC5qcz8yNDJhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjE0IFN0cmluZy5wcm90b3R5cGUuc3VwKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1cCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdXAoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1cCcsICcnLCAnJyk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///193\n")},function(module,exports,__webpack_require__){eval("// 20.3.3.1 / 15.9.4.4 Date.now()\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Date', { now: function () { return new Date().getTime(); } });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS5ub3cuanM/NzhjZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4zLjMuMSAvIDE1LjkuNC40IERhdGUubm93KClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnRGF0ZScsIHsgbm93OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgfSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///194\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar toObject = __webpack_require__(16);\nvar toPrimitive = __webpack_require__(27);\n\n$export($export.P + $export.F * __webpack_require__(2)(function () {\n return new Date(NaN).toJSON() !== null\n || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;\n}), 'Date', {\n // eslint-disable-next-line no-unused-vars\n toJSON: function toJSON(key) {\n var O = toObject(this);\n var pv = toPrimitive(O);\n return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1qc29uLmpzPzAyOTgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgRGF0ZShOYU4pLnRvSlNPTigpICE9PSBudWxsXG4gICAgfHwgRGF0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoeyB0b0lTT1N0cmluZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSB9KSAhPT0gMTtcbn0pLCAnRGF0ZScsIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHRvSlNPTjogZnVuY3Rpb24gdG9KU09OKGtleSkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHB2ID0gdG9QcmltaXRpdmUoTyk7XG4gICAgcmV0dXJuIHR5cGVvZiBwdiA9PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUocHYpID8gbnVsbCA6IE8udG9JU09TdHJpbmcoKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///195\n")},function(module,exports,__webpack_require__){eval("// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar $export = __webpack_require__(1);\nvar toISOString = __webpack_require__(197);\n\n// PhantomJS / old WebKit has a broken implementations\n$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {\n toISOString: toISOString\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1pc28tc3RyaW5nLmpzPzhlYTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JU09TdHJpbmcgPSByZXF1aXJlKCcuL19kYXRlLXRvLWlzby1zdHJpbmcnKTtcblxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyAhPT0gdG9JU09TdHJpbmcpLCAnRGF0ZScsIHtcbiAgdG9JU09TdHJpbmc6IHRvSVNPU3RyaW5nXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///196\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar fails = __webpack_require__(2);\nvar getTime = Date.prototype.getTime;\nvar $toISOString = Date.prototype.toISOString;\n\nvar lz = function (num) {\n return num > 9 ? num : '0' + num;\n};\n\n// PhantomJS / old WebKit has a broken implementations\nmodule.exports = (fails(function () {\n return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';\n}) || !fails(function () {\n $toISOString.call(new Date(NaN));\n})) ? function toISOString() {\n if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');\n var d = this;\n var y = d.getUTCFullYear();\n var m = d.getUTCMilliseconds();\n var s = y < 0 ? '-' : y > 9999 ? '+' : '';\n return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +\n '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +\n 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +\n ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n} : $toISOString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1pc28tc3RyaW5nLmpzPzhlZDAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZ2V0VGltZSA9IERhdGUucHJvdG90eXBlLmdldFRpbWU7XG52YXIgJHRvSVNPU3RyaW5nID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBseiA9IGZ1bmN0aW9uIChudW0pIHtcbiAgcmV0dXJuIG51bSA+IDkgPyBudW0gOiAnMCcgKyBudW07XG59O1xuXG4vLyBQaGFudG9tSlMgLyBvbGQgV2ViS2l0IGhhcyBhIGJyb2tlbiBpbXBsZW1lbnRhdGlvbnNcbm1vZHVsZS5leHBvcnRzID0gKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICR0b0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKC01ZTEzIC0gMSkpICE9ICcwMzg1LTA3LTI1VDA3OjA2OjM5Ljk5OVonO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgJHRvSVNPU3RyaW5nLmNhbGwobmV3IERhdGUoTmFOKSk7XG59KSkgPyBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHtcbiAgaWYgKCFpc0Zpbml0ZShnZXRUaW1lLmNhbGwodGhpcykpKSB0aHJvdyBSYW5nZUVycm9yKCdJbnZhbGlkIHRpbWUgdmFsdWUnKTtcbiAgdmFyIGQgPSB0aGlzO1xuICB2YXIgeSA9IGQuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIG0gPSBkLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICB2YXIgcyA9IHkgPCAwID8gJy0nIDogeSA+IDk5OTkgPyAnKycgOiAnJztcbiAgcmV0dXJuIHMgKyAoJzAwMDAwJyArIE1hdGguYWJzKHkpKS5zbGljZShzID8gLTYgOiAtNCkgK1xuICAgICctJyArIGx6KGQuZ2V0VVRDTW9udGgoKSArIDEpICsgJy0nICsgbHooZC5nZXRVVENEYXRlKCkpICtcbiAgICAnVCcgKyBseihkLmdldFVUQ0hvdXJzKCkpICsgJzonICsgbHooZC5nZXRVVENNaW51dGVzKCkpICtcbiAgICAnOicgKyBseihkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAobSA+IDk5ID8gbSA6ICcwJyArIGx6KG0pKSArICdaJztcbn0gOiAkdG9JU09TdHJpbmc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///197\n")},function(module,exports,__webpack_require__){eval("var DateProto = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar $toString = DateProto[TO_STRING];\nvar getTime = DateProto.getTime;\nif (new Date(NaN) + '' != INVALID_DATE) {\n __webpack_require__(11)(DateProto, TO_STRING, function toString() {\n var value = getTime.call(this);\n // eslint-disable-next-line no-self-compare\n return value === value ? $toString.call(this) : INVALID_DATE;\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcuanM/ODdiMyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgRGF0ZVByb3RvID0gRGF0ZS5wcm90b3R5cGU7XG52YXIgSU5WQUxJRF9EQVRFID0gJ0ludmFsaWQgRGF0ZSc7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciAkdG9TdHJpbmcgPSBEYXRlUHJvdG9bVE9fU1RSSU5HXTtcbnZhciBnZXRUaW1lID0gRGF0ZVByb3RvLmdldFRpbWU7XG5pZiAobmV3IERhdGUoTmFOKSArICcnICE9IElOVkFMSURfREFURSkge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKERhdGVQcm90bywgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRUaW1lLmNhbGwodGhpcyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyAkdG9TdHJpbmcuY2FsbCh0aGlzKSA6IElOVkFMSURfREFURTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///198\n")},function(module,exports,__webpack_require__){eval("var TO_PRIMITIVE = __webpack_require__(6)('toPrimitive');\nvar proto = Date.prototype;\n\nif (!(TO_PRIMITIVE in proto)) __webpack_require__(14)(proto, TO_PRIMITIVE, __webpack_require__(200));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUuanM/YzhjZSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgVE9fUFJJTUlUSVZFID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvUHJpbWl0aXZlJyk7XG52YXIgcHJvdG8gPSBEYXRlLnByb3RvdHlwZTtcblxuaWYgKCEoVE9fUFJJTUlUSVZFIGluIHByb3RvKSkgcmVxdWlyZSgnLi9faGlkZScpKHByb3RvLCBUT19QUklNSVRJVkUsIHJlcXVpcmUoJy4vX2RhdGUtdG8tcHJpbWl0aXZlJykpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///199\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar anObject = __webpack_require__(5);\nvar toPrimitive = __webpack_require__(27);\nvar NUMBER = 'number';\n\nmodule.exports = function (hint) {\n if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');\n return toPrimitive(anObject(this), hint != NUMBER);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1wcmltaXRpdmUuanM/ODM4MSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIE5VTUJFUiA9ICdudW1iZXInO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChoaW50KSB7XG4gIGlmIChoaW50ICE9PSAnc3RyaW5nJyAmJiBoaW50ICE9PSBOVU1CRVIgJiYgaGludCAhPT0gJ2RlZmF1bHQnKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7XG4gIHJldHVybiB0b1ByaW1pdGl2ZShhbk9iamVjdCh0aGlzKSwgaGludCAhPSBOVU1CRVIpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///200\n")},function(module,exports,__webpack_require__){eval("// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Array', { isArray: __webpack_require__(62) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXMtYXJyYXkuanM/MmNhZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjIuMiAvIDE1LjQuMy4yIEFycmF5LmlzQXJyYXkoYXJnKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdBcnJheScsIHsgaXNBcnJheTogcmVxdWlyZSgnLi9faXMtYXJyYXknKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///201\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar ctx = __webpack_require__(21);\nvar $export = __webpack_require__(1);\nvar toObject = __webpack_require__(16);\nvar call = __webpack_require__(99);\nvar isArrayIter = __webpack_require__(74);\nvar toLength = __webpack_require__(10);\nvar createProperty = __webpack_require__(75);\nvar getIterFn = __webpack_require__(76);\n\n$export($export.S + $export.F * !__webpack_require__(50)(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qcz8xYzRjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChtYXBwaW5nKSBtYXBmbiA9IGN0eChtYXBmbiwgYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQygpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IGNhbGwoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IgKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///202\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar createProperty = __webpack_require__(75);\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * __webpack_require__(2)(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanM/ZTgwNCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG5cbi8vIFdlYktpdCBBcnJheS5vZiBpc24ndCBnZW5lcmljXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTtcbn0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4zIEFycmF5Lm9mKCAuLi5pdGVtcylcbiAgb2Y6IGZ1bmN0aW9uIG9mKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gbmV3ICh0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5KShhTGVuKTtcbiAgICB3aGlsZSAoYUxlbiA+IGluZGV4KSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHJlc3VsdC5sZW5ndGggPSBhTGVuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///203\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 22.1.3.13 Array.prototype.join(separator)\nvar $export = __webpack_require__(1);\nvar toIObject = __webpack_require__(15);\nvar arrayJoin = [].join;\n\n// fallback for not array-like strings\n$export($export.P + $export.F * (__webpack_require__(44) != Object || !__webpack_require__(17)(arrayJoin)), 'Array', {\n join: function join(separator) {\n return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuam9pbi5qcz8zNzNmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUuam9pbihzZXBhcmF0b3IpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBhcnJheUpvaW4gPSBbXS5qb2luO1xuXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2Ugc3RyaW5nc1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAocmVxdWlyZSgnLi9faW9iamVjdCcpICE9IE9iamVjdCB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKGFycmF5Sm9pbikpLCAnQXJyYXknLCB7XG4gIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7XG4gICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRvSU9iamVjdCh0aGlzKSwgc2VwYXJhdG9yID09PSB1bmRlZmluZWQgPyAnLCcgOiBzZXBhcmF0b3IpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///204\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar html = __webpack_require__(63);\nvar cof = __webpack_require__(23);\nvar toAbsoluteIndex = __webpack_require__(33);\nvar toLength = __webpack_require__(10);\nvar arraySlice = [].slice;\n\n// fallback for not array-like ES3 strings and DOM objects\n$export($export.P + $export.F * __webpack_require__(2)(function () {\n if (html) arraySlice.call(html);\n}), 'Array', {\n slice: function slice(begin, end) {\n var len = toLength(this.length);\n var klass = cof(this);\n end = end === undefined ? len : end;\n if (klass == 'Array') return arraySlice.call(this, begin, end);\n var start = toAbsoluteIndex(begin, len);\n var upTo = toAbsoluteIndex(end, len);\n var size = toLength(upTo - start);\n var cloned = new Array(size);\n var i = 0;\n for (; i < size; i++) cloned[i] = klass == 'String'\n ? this.charAt(start + i)\n : this[start + i];\n return cloned;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UuanM/MjNiZiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuL19odG1sJyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFycmF5U2xpY2UgPSBbXS5zbGljZTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgaWYgKGh0bWwpIGFycmF5U2xpY2UuY2FsbChodG1sKTtcbn0pLCAnQXJyYXknLCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShiZWdpbiwgZW5kKSB7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoaXMubGVuZ3RoKTtcbiAgICB2YXIga2xhc3MgPSBjb2YodGhpcyk7XG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiBlbmQ7XG4gICAgaWYgKGtsYXNzID09ICdBcnJheScpIHJldHVybiBhcnJheVNsaWNlLmNhbGwodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgdmFyIHN0YXJ0ID0gdG9BYnNvbHV0ZUluZGV4KGJlZ2luLCBsZW4pO1xuICAgIHZhciB1cFRvID0gdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKTtcbiAgICB2YXIgc2l6ZSA9IHRvTGVuZ3RoKHVwVG8gLSBzdGFydCk7XG4gICAgdmFyIGNsb25lZCA9IG5ldyBBcnJheShzaXplKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBzaXplOyBpKyspIGNsb25lZFtpXSA9IGtsYXNzID09ICdTdHJpbmcnXG4gICAgICA/IHRoaXMuY2hhckF0KHN0YXJ0ICsgaSlcbiAgICAgIDogdGhpc1tzdGFydCArIGldO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///205\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar aFunction = __webpack_require__(22);\nvar toObject = __webpack_require__(16);\nvar fails = __webpack_require__(2);\nvar $sort = [].sort;\nvar test = [1, 2, 3];\n\n$export($export.P + $export.F * (fails(function () {\n // IE8-\n test.sort(undefined);\n}) || !fails(function () {\n // V8 bug\n test.sort(null);\n // Old WebKit\n}) || !__webpack_require__(17)($sort)), 'Array', {\n // 22.1.3.25 Array.prototype.sort(comparefn)\n sort: function sort(comparefn) {\n return comparefn === undefined\n ? $sort.call(toObject(this))\n : $sort.call(toObject(this), aFunction(comparefn));\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc29ydC5qcz81NWRkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyICRzb3J0ID0gW10uc29ydDtcbnZhciB0ZXN0ID0gWzEsIDIsIDNdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIElFOC1cbiAgdGVzdC5zb3J0KHVuZGVmaW5lZCk7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCBidWdcbiAgdGVzdC5zb3J0KG51bGwpO1xuICAvLyBPbGQgV2ViS2l0XG59KSB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRzb3J0KSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjI1IEFycmF5LnByb3RvdHlwZS5zb3J0KGNvbXBhcmVmbilcbiAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHtcbiAgICByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWRcbiAgICAgID8gJHNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSlcbiAgICAgIDogJHNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSwgYUZ1bmN0aW9uKGNvbXBhcmVmbikpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///206\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $forEach = __webpack_require__(20)(0);\nvar STRICT = __webpack_require__(17)([].forEach, true);\n\n$export($export.P + $export.F * !STRICT, 'Array', {\n // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n forEach: function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZm9yLWVhY2guanM/ZjNlMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmb3JFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIFNUUklDVCA9IHJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5mb3JFYWNoLCB0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhU1RSSUNULCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xMCAvIDE1LjQuNC4xOCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmb3JFYWNoKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///207\n")},function(module,exports,__webpack_require__){eval("// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = __webpack_require__(209);\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanM/Y2QxYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA5LjQuMi4zIEFycmF5U3BlY2llc0NyZWF0ZShvcmlnaW5hbEFycmF5LCBsZW5ndGgpXG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///208\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(4);\nvar isArray = __webpack_require__(62);\nvar SPECIES = __webpack_require__(6)('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcz9lODUzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWwpKSB7XG4gICAgQyA9IG9yaWdpbmFsLmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///209\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $map = __webpack_require__(20)(1);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].map, true), 'Array', {\n // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubWFwLmpzPzZkNjciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkbWFwID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDEpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ubWFwLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTUgLyAxNS40LjQuMTkgQXJyYXkucHJvdG90eXBlLm1hcChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkbWFwKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///210\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $filter = __webpack_require__(20)(2);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].filter, true), 'Array', {\n // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyLmpzP2QyNWYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDIpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZmlsdGVyLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNyAvIDE1LjQuNC4yMCBBcnJheS5wcm90b3R5cGUuZmlsdGVyKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///211\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $some = __webpack_require__(20)(3);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].some, true), 'Array', {\n // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc29tZS5qcz83NTlmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHNvbWUgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5zb21lLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMjMgLyAxNS40LjQuMTcgQXJyYXkucHJvdG90eXBlLnNvbWUoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkc29tZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///212\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $every = __webpack_require__(20)(4);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].every, true), 'Array', {\n // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZXZlcnkuanM/NjA5NSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRldmVyeSA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg0KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmV2ZXJ5LCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNSAvIDE1LjQuNC4xNiBBcnJheS5wcm90b3R5cGUuZXZlcnkoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRldmVyeSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///213\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $reduce = __webpack_require__(100);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].reduce, true), 'Array', {\n // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments[1], false);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLmpzPzBjZDgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXktcmVkdWNlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5yZWR1Y2UsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xOCAvIDE1LjQuNC4yMSBBcnJheS5wcm90b3R5cGUucmVkdWNlKGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgZmFsc2UpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///214\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $reduce = __webpack_require__(100);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].reduceRight, true), 'Array', {\n // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n reduceRight: function reduceRight(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments[1], true);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLXJpZ2h0LmpzPzQ4ZjgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXktcmVkdWNlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5yZWR1Y2VSaWdodCwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE5IC8gMTUuNC40LjIyIEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodChjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXG4gIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7XG4gICAgcmV0dXJuICRyZWR1Y2UodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCwgYXJndW1lbnRzWzFdLCB0cnVlKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///215\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $indexOf = __webpack_require__(46)(false);\nvar $native = [].indexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(17)($native)), 'Array', {\n // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? $native.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YuanM/NTdlNyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgJG5hdGl2ZSA9IFtdLmluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmluZGV4T2YoMSwgLTApIDwgMDtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoTkVHQVRJVkVfWkVSTyB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRuYXRpdmUpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTEgLyAxNS40LjQuMTQgQXJyYXkucHJvdG90eXBlLmluZGV4T2Yoc2VhcmNoRWxlbWVudCBbLCBmcm9tSW5kZXhdKVxuICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuIE5FR0FUSVZFX1pFUk9cbiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgICAgID8gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDBcbiAgICAgIDogJGluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///216\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar toIObject = __webpack_require__(15);\nvar toInteger = __webpack_require__(25);\nvar toLength = __webpack_require__(10);\nvar $native = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(17)($native)), 'Array', {\n // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;\n var O = toIObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0;\n return -1;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubGFzdC1pbmRleC1vZi5qcz85ODY1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyICRuYXRpdmUgPSBbXS5sYXN0SW5kZXhPZjtcbnZhciBORUdBVElWRV9aRVJPID0gISEkbmF0aXZlICYmIDEgLyBbMV0ubGFzdEluZGV4T2YoMSwgLTApIDwgMDtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoTkVHQVRJVkVfWkVSTyB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRuYXRpdmUpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTQgLyAxNS40LjQuMTUgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcbiAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSBAWyotMV0gKi8pIHtcbiAgICAvLyBjb252ZXJ0IC0wIHRvICswXG4gICAgaWYgKE5FR0FUSVZFX1pFUk8pIHJldHVybiAkbmF0aXZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMDtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSBpbmRleCA9IE1hdGgubWluKGluZGV4LCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7XG4gICAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSBsZW5ndGggKyBpbmRleDtcbiAgICBmb3IgKDtpbmRleCA+PSAwOyBpbmRleC0tKSBpZiAoaW5kZXggaW4gTykgaWYgKE9baW5kZXhdID09PSBzZWFyY2hFbGVtZW50KSByZXR1cm4gaW5kZXggfHwgMDtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///217\n")},function(module,exports,__webpack_require__){eval("// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = __webpack_require__(1);\n\n$export($export.P, 'Array', { copyWithin: __webpack_require__(101) });\n\n__webpack_require__(39)('copyWithin');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuY29weS13aXRoaW4uanM/NzQ0ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7IGNvcHlXaXRoaW46IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJykgfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdjb3B5V2l0aGluJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///218\n")},function(module,exports,__webpack_require__){eval("// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = __webpack_require__(1);\n\n$export($export.P, 'Array', { fill: __webpack_require__(77) });\n\n__webpack_require__(39)('fill');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsbC5qcz82YzdiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHsgZmlsbDogcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpIH0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmlsbCcpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///219\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = __webpack_require__(1);\nvar $find = __webpack_require__(20)(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n__webpack_require__(39)(KEY);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qcz83NTE0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy44IEFycmF5LnByb3RvdHlwZS5maW5kKHByZWRpY2F0ZSwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoNSk7XG52YXIgS0VZID0gJ2ZpbmQnO1xudmFyIGZvcmNlZCA9IHRydWU7XG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYgKEtFWSBpbiBbXSkgQXJyYXkoMSlbS0VZXShmdW5jdGlvbiAoKSB7IGZvcmNlZCA9IGZhbHNlOyB9KTtcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZm9yY2VkLCAnQXJyYXknLCB7XG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKEtFWSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///220\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = __webpack_require__(1);\nvar $find = __webpack_require__(20)(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n__webpack_require__(39)(KEY);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC1pbmRleC5qcz8yMGQ2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy45IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgocHJlZGljYXRlLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmluZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg2KTtcbnZhciBLRVkgPSAnZmluZEluZGV4JztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoS0VZKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///221\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(40)('Array');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcy5qcz9kMDRmIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ0FycmF5Jyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///222\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(3);\nvar inheritIfRequired = __webpack_require__(66);\nvar dP = __webpack_require__(7).f;\nvar gOPN = __webpack_require__(35).f;\nvar isRegExp = __webpack_require__(72);\nvar $flags = __webpack_require__(79);\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (__webpack_require__(8) && (!CORRECT_NEW || __webpack_require__(2)(function () {\n re2[__webpack_require__(6)('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n __webpack_require__(11)(global, 'RegExp', $RegExp);\n}\n\n__webpack_require__(40)('RegExp');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yLmpzPzNiMmIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgJGZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcbnZhciAkUmVnRXhwID0gZ2xvYmFsLlJlZ0V4cDtcbnZhciBCYXNlID0gJFJlZ0V4cDtcbnZhciBwcm90byA9ICRSZWdFeHAucHJvdG90eXBlO1xudmFyIHJlMSA9IC9hL2c7XG52YXIgcmUyID0gL2EvZztcbi8vIFwibmV3XCIgY3JlYXRlcyBhIG5ldyBvYmplY3QsIG9sZCB3ZWJraXQgYnVnZ3kgaGVyZVxudmFyIENPUlJFQ1RfTkVXID0gbmV3ICRSZWdFeHAocmUxKSAhPT0gcmUxO1xuXG5pZiAocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAoIUNPUlJFQ1RfTkVXIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZTJbcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyldID0gZmFsc2U7XG4gIC8vIFJlZ0V4cCBjb25zdHJ1Y3RvciBjYW4gYWx0ZXIgZmxhZ3MgYW5kIElzUmVnRXhwIHdvcmtzIGNvcnJlY3Qgd2l0aCBAQG1hdGNoXG4gIHJldHVybiAkUmVnRXhwKHJlMSkgIT0gcmUxIHx8ICRSZWdFeHAocmUyKSA9PSByZTIgfHwgJFJlZ0V4cChyZTEsICdpJykgIT0gJy9hL2knO1xufSkpKSB7XG4gICRSZWdFeHAgPSBmdW5jdGlvbiBSZWdFeHAocCwgZikge1xuICAgIHZhciB0aVJFID0gdGhpcyBpbnN0YW5jZW9mICRSZWdFeHA7XG4gICAgdmFyIHBpUkUgPSBpc1JlZ0V4cChwKTtcbiAgICB2YXIgZmlVID0gZiA9PT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiAhdGlSRSAmJiBwaVJFICYmIHAuY29uc3RydWN0b3IgPT09ICRSZWdFeHAgJiYgZmlVID8gcFxuICAgICAgOiBpbmhlcml0SWZSZXF1aXJlZChDT1JSRUNUX05FV1xuICAgICAgICA/IG5ldyBCYXNlKHBpUkUgJiYgIWZpVSA/IHAuc291cmNlIDogcCwgZilcbiAgICAgICAgOiBCYXNlKChwaVJFID0gcCBpbnN0YW5jZW9mICRSZWdFeHApID8gcC5zb3VyY2UgOiBwLCBwaVJFICYmIGZpVSA/ICRmbGFncy5jYWxsKHApIDogZilcbiAgICAgICwgdGlSRSA/IHRoaXMgOiBwcm90bywgJFJlZ0V4cCk7XG4gIH07XG4gIHZhciBwcm94eSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBrZXkgaW4gJFJlZ0V4cCB8fCBkUCgkUmVnRXhwLCBrZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gQmFzZVtrZXldOyB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAoaXQpIHsgQmFzZVtrZXldID0gaXQ7IH1cbiAgICB9KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IGdPUE4oQmFzZSksIGkgPSAwOyBrZXlzLmxlbmd0aCA+IGk7KSBwcm94eShrZXlzW2krK10pO1xuICBwcm90by5jb25zdHJ1Y3RvciA9ICRSZWdFeHA7XG4gICRSZWdFeHAucHJvdG90eXBlID0gcHJvdG87XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoZ2xvYmFsLCAnUmVnRXhwJywgJFJlZ0V4cCk7XG59XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ1JlZ0V4cCcpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///223\n")},function(module,exports,__webpack_require__){"use strict";eval("\n__webpack_require__(103);\nvar anObject = __webpack_require__(5);\nvar $flags = __webpack_require__(79);\nvar DESCRIPTORS = __webpack_require__(8);\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n __webpack_require__(11)(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (__webpack_require__(2)(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZy5qcz82YjU0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4vZXM2LnJlZ2V4cC5mbGFncycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJGZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciAkdG9TdHJpbmcgPSAvLi9bVE9fU1RSSU5HXTtcblxudmFyIGRlZmluZSA9IGZ1bmN0aW9uIChmbikge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKFJlZ0V4cC5wcm90b3R5cGUsIFRPX1NUUklORywgZm4sIHRydWUpO1xufTtcblxuLy8gMjEuMi41LjE0IFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcoKVxuaWYgKHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkgeyByZXR1cm4gJHRvU3RyaW5nLmNhbGwoeyBzb3VyY2U6ICdhJywgZmxhZ3M6ICdiJyB9KSAhPSAnL2EvYic7IH0pKSB7XG4gIGRlZmluZShmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgUiA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHJldHVybiAnLycuY29uY2F0KFIuc291cmNlLCAnLycsXG4gICAgICAnZmxhZ3MnIGluIFIgPyBSLmZsYWdzIDogIURFU0NSSVBUT1JTICYmIFIgaW5zdGFuY2VvZiBSZWdFeHAgPyAkZmxhZ3MuY2FsbChSKSA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuLy8gRkY0NC0gUmVnRXhwI3RvU3RyaW5nIGhhcyBhIHdyb25nIG5hbWVcbn0gZWxzZSBpZiAoJHRvU3RyaW5nLm5hbWUgIT0gVE9fU1RSSU5HKSB7XG4gIGRlZmluZShmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJHRvU3RyaW5nLmNhbGwodGhpcyk7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///224\n")},function(module,exports,__webpack_require__){eval("// @@match logic\n__webpack_require__(51)('match', 1, function (defined, MATCH, $match) {\n // 21.1.3.11 String.prototype.match(regexp)\n return [function match(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n }, $match];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoLmpzPzQ5MTciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQEBtYXRjaCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdtYXRjaCcsIDEsIGZ1bmN0aW9uIChkZWZpbmVkLCBNQVRDSCwgJG1hdGNoKSB7XG4gIC8vIDIxLjEuMy4xMSBTdHJpbmcucHJvdG90eXBlLm1hdGNoKHJlZ2V4cClcbiAgcmV0dXJuIFtmdW5jdGlvbiBtYXRjaChyZWdleHApIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgIHZhciBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbTUFUQ0hdO1xuICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXShTdHJpbmcoTykpO1xuICB9LCAkbWF0Y2hdO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///225\n")},function(module,exports,__webpack_require__){eval("// @@replace logic\n__webpack_require__(51)('replace', 2, function (defined, REPLACE, $replace) {\n // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n return [function replace(searchValue, replaceValue) {\n 'use strict';\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n }, $replace];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanM/YTQ4MSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAQHJlcGxhY2UgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgncmVwbGFjZScsIDIsIGZ1bmN0aW9uIChkZWZpbmVkLCBSRVBMQUNFLCAkcmVwbGFjZSkge1xuICAvLyAyMS4xLjMuMTQgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpXG4gIHJldHVybiBbZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICB2YXIgZm4gPSBzZWFyY2hWYWx1ZSA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZWFyY2hWYWx1ZVtSRVBMQUNFXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZFxuICAgICAgPyBmbi5jYWxsKHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpXG4gICAgICA6ICRyZXBsYWNlLmNhbGwoU3RyaW5nKE8pLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKTtcbiAgfSwgJHJlcGxhY2VdO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///226\n")},function(module,exports,__webpack_require__){eval("// @@search logic\n__webpack_require__(51)('search', 1, function (defined, SEARCH, $search) {\n // 21.1.3.15 String.prototype.search(regexp)\n return [function search(regexp) {\n 'use strict';\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n }, $search];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaC5qcz8zODZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEBAc2VhcmNoIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3NlYXJjaCcsIDEsIGZ1bmN0aW9uIChkZWZpbmVkLCBTRUFSQ0gsICRzZWFyY2gpIHtcbiAgLy8gMjEuMS4zLjE1IFN0cmluZy5wcm90b3R5cGUuc2VhcmNoKHJlZ2V4cClcbiAgcmV0dXJuIFtmdW5jdGlvbiBzZWFyY2gocmVnZXhwKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICB2YXIgZm4gPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW1NFQVJDSF07XG4gICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWQgPyBmbi5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbU0VBUkNIXShTdHJpbmcoTykpO1xuICB9LCAkc2VhcmNoXTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///227\n")},function(module,exports,__webpack_require__){eval("// @@split logic\n__webpack_require__(51)('split', 2, function (defined, SPLIT, $split) {\n 'use strict';\n var isRegExp = __webpack_require__(72);\n var _split = $split;\n var $push = [].push;\n var $SPLIT = 'split';\n var LENGTH = 'length';\n var LAST_INDEX = 'lastIndex';\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group\n // based on es5-shim implementation, need to rework it\n $split = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return _split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var separator2, match, lastIndex, lastLength, i;\n // Doesn't need flags gy, but they don't hurt\n if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n while (match = separatorCopy.exec(string)) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0][LENGTH];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG\n // eslint-disable-next-line no-loop-func\n if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {\n for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;\n });\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n $split = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);\n };\n }\n // 21.1.3.17 String.prototype.split(separator, limit)\n return [function split(separator, limit) {\n var O = defined(this);\n var fn = separator == undefined ? undefined : separator[SPLIT];\n return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n }, $split];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0LmpzPzI4YTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQEBzcGxpdCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdzcGxpdCcsIDIsIGZ1bmN0aW9uIChkZWZpbmVkLCBTUExJVCwgJHNwbGl0KSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG4gIHZhciBfc3BsaXQgPSAkc3BsaXQ7XG4gIHZhciAkcHVzaCA9IFtdLnB1c2g7XG4gIHZhciAkU1BMSVQgPSAnc3BsaXQnO1xuICB2YXIgTEVOR1RIID0gJ2xlbmd0aCc7XG4gIHZhciBMQVNUX0lOREVYID0gJ2xhc3RJbmRleCc7XG4gIGlmIChcbiAgICAnYWJiYydbJFNQTElUXSgvKGIpKi8pWzFdID09ICdjJyB8fFxuICAgICd0ZXN0J1skU1BMSVRdKC8oPzopLywgLTEpW0xFTkdUSF0gIT0gNCB8fFxuICAgICdhYidbJFNQTElUXSgvKD86YWIpKi8pW0xFTkdUSF0gIT0gMiB8fFxuICAgICcuJ1skU1BMSVRdKC8oLj8pKC4/KS8pW0xFTkdUSF0gIT0gNCB8fFxuICAgICcuJ1skU1BMSVRdKC8oKSgpLylbTEVOR1RIXSA+IDEgfHxcbiAgICAnJ1skU1BMSVRdKC8uPy8pW0xFTkdUSF1cbiAgKSB7XG4gICAgdmFyIE5QQ0cgPSAvKCk/Py8uZXhlYygnJylbMV0gPT09IHVuZGVmaW5lZDsgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBcbiAgICAvLyBiYXNlZCBvbiBlczUtc2hpbSBpbXBsZW1lbnRhdGlvbiwgbmVlZCB0byByZXdvcmsgaXRcbiAgICAkc3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkgcmV0dXJuIF9zcGxpdC5jYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHNwbGl0TGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gNDI5NDk2NzI5NSA6IGxpbWl0ID4+PiAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgc2VwYXJhdG9yMiwgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aCwgaTtcbiAgICAgIC8vIERvZXNuJ3QgbmVlZCBmbGFncyBneSwgYnV0IHRoZXkgZG9uJ3QgaHVydFxuICAgICAgaWYgKCFOUENHKSBzZXBhcmF0b3IyID0gbmV3IFJlZ0V4cCgnXicgKyBzZXBhcmF0b3JDb3B5LnNvdXJjZSArICckKD8hXFxcXHMpJywgZmxhZ3MpO1xuICAgICAgd2hpbGUgKG1hdGNoID0gc2VwYXJhdG9yQ29weS5leGVjKHN0cmluZykpIHtcbiAgICAgICAgLy8gYHNlcGFyYXRvckNvcHkubGFzdEluZGV4YCBpcyBub3QgcmVsaWFibGUgY3Jvc3MtYnJvd3NlclxuICAgICAgICBsYXN0SW5kZXggPSBtYXRjaC5pbmRleCArIG1hdGNoWzBdW0xFTkdUSF07XG4gICAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgsIG1hdGNoLmluZGV4KSk7XG4gICAgICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGAgZm9yIE5QQ0dcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gICAgICAgICAgaWYgKCFOUENHICYmIG1hdGNoW0xFTkdUSF0gPiAxKSBtYXRjaFswXS5yZXBsYWNlKHNlcGFyYXRvcjIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmd1bWVudHNbTEVOR1RIXSAtIDI7IGkrKykgaWYgKGFyZ3VtZW50c1tpXSA9PT0gdW5kZWZpbmVkKSBtYXRjaFtpXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAobWF0Y2hbTEVOR1RIXSA+IDEgJiYgbWF0Y2guaW5kZXggPCBzdHJpbmdbTEVOR1RIXSkgJHB1c2guYXBwbHkob3V0cHV0LCBtYXRjaC5zbGljZSgxKSk7XG4gICAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdW0xFTkdUSF07XG4gICAgICAgICAgbGFzdExhc3RJbmRleCA9IGxhc3RJbmRleDtcbiAgICAgICAgICBpZiAob3V0cHV0W0xFTkdUSF0gPj0gc3BsaXRMaW1pdCkgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0gPT09IG1hdGNoLmluZGV4KSBzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdKys7IC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3BcbiAgICAgIH1cbiAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmdbTEVOR1RIXSkge1xuICAgICAgICBpZiAobGFzdExlbmd0aCB8fCAhc2VwYXJhdG9yQ29weS50ZXN0KCcnKSkgb3V0cHV0LnB1c2goJycpO1xuICAgICAgfSBlbHNlIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4KSk7XG4gICAgICByZXR1cm4gb3V0cHV0W0xFTkdUSF0gPiBzcGxpdExpbWl0ID8gb3V0cHV0LnNsaWNlKDAsIHNwbGl0TGltaXQpIDogb3V0cHV0O1xuICAgIH07XG4gIC8vIENoYWtyYSwgVjhcbiAgfSBlbHNlIGlmICgnMCdbJFNQTElUXSh1bmRlZmluZWQsIDApW0xFTkdUSF0pIHtcbiAgICAkc3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiBfc3BsaXQuY2FsbCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9O1xuICB9XG4gIC8vIDIxLjEuMy4xNyBTdHJpbmcucHJvdG90eXBlLnNwbGl0KHNlcGFyYXRvciwgbGltaXQpXG4gIHJldHVybiBbZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICB2YXIgZm4gPSBzZXBhcmF0b3IgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VwYXJhdG9yW1NQTElUXTtcbiAgICByZXR1cm4gZm4gIT09IHVuZGVmaW5lZCA/IGZuLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdCkgOiAkc3BsaXQuY2FsbChTdHJpbmcoTyksIHNlcGFyYXRvciwgbGltaXQpO1xuICB9LCAkc3BsaXRdO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///228\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(3);\nvar macrotask = __webpack_require__(80).set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(23)(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzPzgwNzkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChpc05vZGUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgU2FmYXJpIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE9ic2VydmVyICYmICEoZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpKSB7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZiAoIWhlYWQpIHtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///229\n")},function(module,exports){eval("module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcz85YzgwIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///230\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar strong = __webpack_require__(107);\nvar validate = __webpack_require__(43);\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = __webpack_require__(55)(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWFwLmpzP2Y0MDAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTUFQID0gJ01hcCc7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKE1BUCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBzdHJvbmcuZ2V0RW50cnkodmFsaWRhdGUodGhpcywgTUFQKSwga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nLCB0cnVlKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///231\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar strong = __webpack_require__(107);\nvar validate = __webpack_require__(43);\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = __webpack_require__(55)(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc2V0LmpzPzRmN2YiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgU0VUID0gJ1NldCc7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFNFVCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodmFsaWRhdGUodGhpcywgU0VUKSwgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///232\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar each = __webpack_require__(20)(0);\nvar redefine = __webpack_require__(11);\nvar meta = __webpack_require__(28);\nvar assign = __webpack_require__(89);\nvar weak = __webpack_require__(108);\nvar isObject = __webpack_require__(4);\nvar fails = __webpack_require__(2);\nvar validate = __webpack_require__(43);\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar tmp = {};\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = __webpack_require__(55)(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1tYXAuanM/MTBhZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJyk7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFdFQUtfTUFQID0gJ1dlYWtNYXAnO1xudmFyIGdldFdlYWsgPSBtZXRhLmdldFdlYWs7XG52YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcbnZhciB1bmNhdWdodEZyb3plblN0b3JlID0gd2Vhay51ZnN0b3JlO1xudmFyIHRtcCA9IHt9O1xudmFyIEludGVybmFsTWFwO1xuXG52YXIgd3JhcHBlciA9IGZ1bmN0aW9uIChnZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFdlYWtNYXAoKSB7XG4gICAgcmV0dXJuIGdldCh0aGlzLCBhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gIH07XG59O1xuXG52YXIgbWV0aG9kcyA9IHtcbiAgLy8gMjMuMy4zLjMgV2Vha01hcC5wcm90b3R5cGUuZ2V0KGtleSlcbiAgZ2V0OiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgaWYgKGlzT2JqZWN0KGtleSkpIHtcbiAgICAgIHZhciBkYXRhID0gZ2V0V2VhayhrZXkpO1xuICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIFdFQUtfTUFQKSkuZ2V0KGtleSk7XG4gICAgICByZXR1cm4gZGF0YSA/IGRhdGFbdGhpcy5faV0gOiB1bmRlZmluZWQ7XG4gICAgfVxuICB9LFxuICAvLyAyMy4zLjMuNSBXZWFrTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB3ZWFrLmRlZih2YWxpZGF0ZSh0aGlzLCBXRUFLX01BUCksIGtleSwgdmFsdWUpO1xuICB9XG59O1xuXG4vLyAyMy4zIFdlYWtNYXAgT2JqZWN0c1xudmFyICRXZWFrTWFwID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uJykoV0VBS19NQVAsIHdyYXBwZXIsIG1ldGhvZHMsIHdlYWssIHRydWUsIHRydWUpO1xuXG4vLyBJRTExIFdlYWtNYXAgZnJvemVuIGtleXMgZml4XG5pZiAoZmFpbHMoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3ICRXZWFrTWFwKCkuc2V0KChPYmplY3QuZnJlZXplIHx8IE9iamVjdCkodG1wKSwgNykuZ2V0KHRtcCkgIT0gNzsgfSkpIHtcbiAgSW50ZXJuYWxNYXAgPSB3ZWFrLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIFdFQUtfTUFQKTtcbiAgYXNzaWduKEludGVybmFsTWFwLnByb3RvdHlwZSwgbWV0aG9kcyk7XG4gIG1ldGEuTkVFRCA9IHRydWU7XG4gIGVhY2goWydkZWxldGUnLCAnaGFzJywgJ2dldCcsICdzZXQnXSwgZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBwcm90byA9ICRXZWFrTWFwLnByb3RvdHlwZTtcbiAgICB2YXIgbWV0aG9kID0gcHJvdG9ba2V5XTtcbiAgICByZWRlZmluZShwcm90bywga2V5LCBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgLy8gc3RvcmUgZnJvemVuIG9iamVjdHMgb24gaW50ZXJuYWwgd2Vha21hcCBzaGltXG4gICAgICBpZiAoaXNPYmplY3QoYSkgJiYgIWlzRXh0ZW5zaWJsZShhKSkge1xuICAgICAgICBpZiAoIXRoaXMuX2YpIHRoaXMuX2YgPSBuZXcgSW50ZXJuYWxNYXAoKTtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2Zba2V5XShhLCBiKTtcbiAgICAgICAgcmV0dXJuIGtleSA9PSAnc2V0JyA/IHRoaXMgOiByZXN1bHQ7XG4gICAgICAvLyBzdG9yZSBhbGwgdGhlIHJlc3Qgb24gbmF0aXZlIHdlYWttYXBcbiAgICAgIH0gcmV0dXJuIG1ldGhvZC5jYWxsKHRoaXMsIGEsIGIpO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///233\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar weak = __webpack_require__(108);\nvar validate = __webpack_require__(43);\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\n__webpack_require__(55)(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1zZXQuanM/YzAyYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFdFQUtfU0VUID0gJ1dlYWtTZXQnO1xuXG4vLyAyMy40IFdlYWtTZXQgT2JqZWN0c1xucmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfU0VULCBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuNC4zLjEgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiB3ZWFrLmRlZih2YWxpZGF0ZSh0aGlzLCBXRUFLX1NFVCksIHZhbHVlLCB0cnVlKTtcbiAgfVxufSwgd2VhaywgZmFsc2UsIHRydWUpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///234\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $typed = __webpack_require__(56);\nvar buffer = __webpack_require__(81);\nvar anObject = __webpack_require__(5);\nvar toAbsoluteIndex = __webpack_require__(33);\nvar toLength = __webpack_require__(10);\nvar isObject = __webpack_require__(4);\nvar ArrayBuffer = __webpack_require__(3).ArrayBuffer;\nvar speciesConstructor = __webpack_require__(53);\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * __webpack_require__(2)(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var fin = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < fin) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\n__webpack_require__(40)(ARRAY_BUFFER);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuYXJyYXktYnVmZmVyLmpzP2M2NmYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5BcnJheUJ1ZmZlcjtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgJEFycmF5QnVmZmVyID0gYnVmZmVyLkFycmF5QnVmZmVyO1xudmFyICREYXRhVmlldyA9IGJ1ZmZlci5EYXRhVmlldztcbnZhciAkaXNWaWV3ID0gJHR5cGVkLkFCViAmJiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG52YXIgJHNsaWNlID0gJEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZTtcbnZhciBWSUVXID0gJHR5cGVkLlZJRVc7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoQXJyYXlCdWZmZXIgIT09ICRBcnJheUJ1ZmZlciksIHsgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlciB9KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhJHR5cGVkLkNPTlNUUiwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuMy4xIEFycmF5QnVmZmVyLmlzVmlldyhhcmcpXG4gIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gICAgcmV0dXJuICRpc1ZpZXcgJiYgJGlzVmlldyhpdCkgfHwgaXNPYmplY3QoaXQpICYmIFZJRVcgaW4gaXQ7XG4gIH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuVSArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIW5ldyAkQXJyYXlCdWZmZXIoMikuc2xpY2UoMSwgdW5kZWZpbmVkKS5ieXRlTGVuZ3RoO1xufSksIEFSUkFZX0JVRkZFUiwge1xuICAvLyAyNC4xLjQuMyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2Uoc3RhcnQsIGVuZClcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoJHNsaWNlICE9PSB1bmRlZmluZWQgJiYgZW5kID09PSB1bmRlZmluZWQpIHJldHVybiAkc2xpY2UuY2FsbChhbk9iamVjdCh0aGlzKSwgc3RhcnQpOyAvLyBGRiBmaXhcbiAgICB2YXIgbGVuID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IGVuZCwgbGVuKTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJEFycmF5QnVmZmVyKSkodG9MZW5ndGgoZmluIC0gZmlyc3QpKTtcbiAgICB2YXIgdmlld1MgPSBuZXcgJERhdGFWaWV3KHRoaXMpO1xuICAgIHZhciB2aWV3VCA9IG5ldyAkRGF0YVZpZXcocmVzdWx0KTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChmaXJzdCA8IGZpbikge1xuICAgICAgdmlld1Quc2V0VWludDgoaW5kZXgrKywgdmlld1MuZ2V0VWludDgoZmlyc3QrKykpO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoQVJSQVlfQlVGRkVSKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///235\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\n$export($export.G + $export.W + $export.F * !__webpack_require__(56).ABV, {\n DataView: __webpack_require__(81).DataView\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZGF0YS12aWV3LmpzPzI2MmYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3R5cGVkJykuQUJWLCB7XG4gIERhdGFWaWV3OiByZXF1aXJlKCcuL190eXBlZC1idWZmZXInKS5EYXRhVmlld1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///236\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50OC1hcnJheS5qcz9iMDVjIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///237\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDgtYXJyYXkuanM/MzRlZiJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///238\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDgtY2xhbXBlZC1hcnJheS5qcz82YWEyIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQ4JywgMSwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59LCB0cnVlKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///239\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXkuanM/MTVhYyJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQxNicsIDIsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///240\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5LmpzP2FmNTYiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDE2JywgMiwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///241\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MzItYXJyYXkuanM/YjZlNCJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///242\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDMyLWFycmF5LmpzPzljMjkiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDMyJywgNCwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///243\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQzMi1hcnJheS5qcz82M2Q5Il0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0Zsb2F0MzInLCA0LCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gRmxvYXQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///244\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQ2NC1hcnJheS5qcz80ZGRhIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0Zsb2F0NjQnLCA4LCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gRmxvYXQ2NEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///245\n")},function(module,exports,__webpack_require__){eval("// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = __webpack_require__(1);\nvar aFunction = __webpack_require__(22);\nvar anObject = __webpack_require__(5);\nvar rApply = (__webpack_require__(3).Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !__webpack_require__(2)(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseS5qcz9kZjFiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDI2LjEuMSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciByQXBwbHkgPSAocmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdCB8fCB7fSkuYXBwbHk7XG52YXIgZkFwcGx5ID0gRnVuY3Rpb24uYXBwbHk7XG4vLyBNUyBFZGdlIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByQXBwbHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KSB7XG4gICAgdmFyIFQgPSBhRnVuY3Rpb24odGFyZ2V0KTtcbiAgICB2YXIgTCA9IGFuT2JqZWN0KGFyZ3VtZW50c0xpc3QpO1xuICAgIHJldHVybiByQXBwbHkgPyByQXBwbHkoVCwgdGhpc0FyZ3VtZW50LCBMKSA6IGZBcHBseS5jYWxsKFQsIHRoaXNBcmd1bWVudCwgTCk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///246\n")},function(module,exports,__webpack_require__){eval("// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = __webpack_require__(1);\nvar create = __webpack_require__(34);\nvar aFunction = __webpack_require__(22);\nvar anObject = __webpack_require__(5);\nvar isObject = __webpack_require__(4);\nvar fails = __webpack_require__(2);\nvar bind = __webpack_require__(90);\nvar rConstruct = (__webpack_require__(3).Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanM/MjM5NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjIgUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmd1bWVudHNMaXN0IFssIG5ld1RhcmdldF0pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9fYmluZCcpO1xudmFyIHJDb25zdHJ1Y3QgPSAocmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdCB8fCB7fSkuY29uc3RydWN0O1xuXG4vLyBNUyBFZGdlIHN1cHBvcnRzIG9ubHkgMiBhcmd1bWVudHMgYW5kIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbi8vIEZGIE5pZ2h0bHkgc2V0cyB0aGlyZCBhcmd1bWVudCBhcyBgbmV3LnRhcmdldGAsIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYHRoaXNgIGZyb20gaXRcbnZhciBORVdfVEFSR0VUX0JVRyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gIShyQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgW10sIEYpIGluc3RhbmNlb2YgRik7XG59KTtcbnZhciBBUkdTX0JVRyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChORVdfVEFSR0VUX0JVRyB8fCBBUkdTX0JVRyksICdSZWZsZWN0Jywge1xuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChUYXJnZXQsIGFyZ3MgLyogLCBuZXdUYXJnZXQgKi8pIHtcbiAgICBhRnVuY3Rpb24oVGFyZ2V0KTtcbiAgICBhbk9iamVjdChhcmdzKTtcbiAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBUYXJnZXQgOiBhRnVuY3Rpb24oYXJndW1lbnRzWzJdKTtcbiAgICBpZiAoQVJHU19CVUcgJiYgIU5FV19UQVJHRVRfQlVHKSByZXR1cm4gckNvbnN0cnVjdChUYXJnZXQsIGFyZ3MsIG5ld1RhcmdldCk7XG4gICAgaWYgKFRhcmdldCA9PSBuZXdUYXJnZXQpIHtcbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgb3B0aW1pemF0aW9uIGZvciAwLTQgYXJndW1lbnRzXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQoKTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIH1cbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgbG90IG9mIGFyZ3VtZW50cyBjYXNlXG4gICAgICB2YXIgJGFyZ3MgPSBbbnVsbF07XG4gICAgICAkYXJncy5wdXNoLmFwcGx5KCRhcmdzLCBhcmdzKTtcbiAgICAgIHJldHVybiBuZXcgKGJpbmQuYXBwbHkoVGFyZ2V0LCAkYXJncykpKCk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byA9IG5ld1RhcmdldC5wcm90b3R5cGU7XG4gICAgdmFyIGluc3RhbmNlID0gY3JlYXRlKGlzT2JqZWN0KHByb3RvKSA/IHByb3RvIDogT2JqZWN0LnByb3RvdHlwZSk7XG4gICAgdmFyIHJlc3VsdCA9IEZ1bmN0aW9uLmFwcGx5LmNhbGwoVGFyZ2V0LCBpbnN0YW5jZSwgYXJncyk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///247\n")},function(module,exports,__webpack_require__){eval("// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = __webpack_require__(7);\nvar $export = __webpack_require__(1);\nvar anObject = __webpack_require__(5);\nvar toPrimitive = __webpack_require__(27);\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * __webpack_require__(2)(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanM/ODhjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjMgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKVxudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcblxuLy8gTVMgRWRnZSBoYXMgYnJva2VuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkgLSB0aHJvd2luZyBpbnN0ZWFkIG9mIHJldHVybmluZyBmYWxzZVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZFAuZih7fSwgMSwgeyB2YWx1ZTogMSB9KSwgMSwgeyB2YWx1ZTogMiB9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUocHJvcGVydHlLZXksIHRydWUpO1xuICAgIGFuT2JqZWN0KGF0dHJpYnV0ZXMpO1xuICAgIHRyeSB7XG4gICAgICBkUC5mKHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///248\n")},function(module,exports,__webpack_require__){eval("// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = __webpack_require__(1);\nvar gOPD = __webpack_require__(18).f;\nvar anObject = __webpack_require__(5);\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHkuanM/YmExNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjQgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICB2YXIgZGVzYyA9IGdPUEQoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICAgIHJldHVybiBkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSA/IGZhbHNlIDogZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///249\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 26.1.5 Reflect.enumerate(target)\nvar $export = __webpack_require__(1);\nvar anObject = __webpack_require__(5);\nvar Enumerate = function (iterated) {\n this._t = anObject(iterated); // target\n this._i = 0; // next index\n var keys = this._k = []; // keys\n var key;\n for (key in iterated) keys.push(key);\n};\n__webpack_require__(98)(Enumerate, 'Object', function () {\n var that = this;\n var keys = that._k;\n var key;\n do {\n if (that._i >= keys.length) return { value: undefined, done: true };\n } while (!((key = keys[that._i++]) in that._t));\n return { value: key, done: false };\n});\n\n$export($export.S, 'Reflect', {\n enumerate: function enumerate(target) {\n return new Enumerate(target);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUuanM/N2ZmNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyAyNi4xLjUgUmVmbGVjdC5lbnVtZXJhdGUodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIEVudW1lcmF0ZSA9IGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gYW5PYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB2YXIga2V5cyA9IHRoaXMuX2sgPSBbXTsgICAgICAvLyBrZXlzXG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIGl0ZXJhdGVkKSBrZXlzLnB1c2goa2V5KTtcbn07XG5yZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpKEVudW1lcmF0ZSwgJ09iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSB0aGlzO1xuICB2YXIga2V5cyA9IHRoYXQuX2s7XG4gIHZhciBrZXk7XG4gIGRvIHtcbiAgICBpZiAodGhhdC5faSA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9IHdoaWxlICghKChrZXkgPSBrZXlzW3RoYXQuX2krK10pIGluIHRoYXQuX3QpKTtcbiAgcmV0dXJuIHsgdmFsdWU6IGtleSwgZG9uZTogZmFsc2UgfTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGVudW1lcmF0ZTogZnVuY3Rpb24gZW51bWVyYXRlKHRhcmdldCkge1xuICAgIHJldHVybiBuZXcgRW51bWVyYXRlKHRhcmdldCk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///250\n")},function(module,exports,__webpack_require__){eval("// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = __webpack_require__(18);\nvar getPrototypeOf = __webpack_require__(36);\nvar has = __webpack_require__(13);\nvar $export = __webpack_require__(1);\nvar isObject = __webpack_require__(4);\nvar anObject = __webpack_require__(5);\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanM/ZDE4NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTtcbiAgdmFyIGRlc2MsIHByb3RvO1xuICBpZiAoYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpIHJldHVybiB0YXJnZXRbcHJvcGVydHlLZXldO1xuICBpZiAoZGVzYyA9IGdPUEQuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgID8gZGVzYy52YWx1ZVxuICAgIDogZGVzYy5nZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSByZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IGdldDogZ2V0IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///251\n")},function(module,exports,__webpack_require__){eval("// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = __webpack_require__(18);\nvar $export = __webpack_require__(1);\nvar anObject = __webpack_require__(5);\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanM/ZWJkZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjcgUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgcmV0dXJuIGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///252\n")},function(module,exports,__webpack_require__){eval("// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = __webpack_require__(1);\nvar getProto = __webpack_require__(36);\nvar anObject = __webpack_require__(5);\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mLmpzPzJkMzQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS44IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnZXRQcm90byA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZih0YXJnZXQpIHtcbiAgICByZXR1cm4gZ2V0UHJvdG8oYW5PYmplY3QodGFyZ2V0KSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///253\n")},function(module,exports,__webpack_require__){eval("// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5oYXMuanM/ZjZiMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjkgUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaGFzOiBmdW5jdGlvbiBoYXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgIHJldHVybiBwcm9wZXJ0eUtleSBpbiB0YXJnZXQ7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///254\n")},function(module,exports,__webpack_require__){eval("// 26.1.10 Reflect.isExtensible(target)\nvar $export = __webpack_require__(1);\nvar anObject = __webpack_require__(5);\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzPzIyNTEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS4xMCBSZWZsZWN0LmlzRXh0ZW5zaWJsZSh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaXNFeHRlbnNpYmxlOiBmdW5jdGlvbiBpc0V4dGVuc2libGUodGFyZ2V0KSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICByZXR1cm4gJGlzRXh0ZW5zaWJsZSA/ICRpc0V4dGVuc2libGUodGFyZ2V0KSA6IHRydWU7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///255\n")},function(module,exports,__webpack_require__){eval("// 26.1.11 Reflect.ownKeys(target)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Reflect', { ownKeys: __webpack_require__(110) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cy5qcz9jNjk4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDI2LjEuMTEgUmVmbGVjdC5vd25LZXlzKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHsgb3duS2V5czogcmVxdWlyZSgnLi9fb3duLWtleXMnKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///256\n")},function(module,exports,__webpack_require__){eval("// 26.1.12 Reflect.preventExtensions(target)\nvar $export = __webpack_require__(1);\nvar anObject = __webpack_require__(5);\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanM/YTE5ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjEyIFJlZmxlY3QucHJldmVudEV4dGVuc2lvbnModGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyICRwcmV2ZW50RXh0ZW5zaW9ucyA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucztcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBwcmV2ZW50RXh0ZW5zaW9uczogZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgaWYgKCRwcmV2ZW50RXh0ZW5zaW9ucykgJHByZXZlbnRFeHRlbnNpb25zKHRhcmdldCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///257\n")},function(module,exports,__webpack_require__){eval("// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = __webpack_require__(7);\nvar gOPD = __webpack_require__(18);\nvar getPrototypeOf = __webpack_require__(36);\nvar has = __webpack_require__(13);\nvar $export = __webpack_require__(1);\nvar createDesc = __webpack_require__(29);\nvar anObject = __webpack_require__(5);\nvar isObject = __webpack_require__(4);\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n if (existingDescriptor = gOPD.f(receiver, propertyKey)) {\n if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n } else dP.f(receiver, propertyKey, createDesc(0, V));\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanM/OTI1MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjEzIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcGVydHlLZXksIFYgWywgcmVjZWl2ZXJdKVxudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViAvKiAsIHJlY2VpdmVyICovKSB7XG4gIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPCA0ID8gdGFyZ2V0IDogYXJndW1lbnRzWzNdO1xuICB2YXIgb3duRGVzYyA9IGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIHZhciBleGlzdGluZ0Rlc2NyaXB0b3IsIHByb3RvO1xuICBpZiAoIW93bkRlc2MpIHtcbiAgICBpZiAoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkge1xuICAgICAgcmV0dXJuIHNldChwcm90bywgcHJvcGVydHlLZXksIFYsIHJlY2VpdmVyKTtcbiAgICB9XG4gICAgb3duRGVzYyA9IGNyZWF0ZURlc2MoMCk7XG4gIH1cbiAgaWYgKGhhcyhvd25EZXNjLCAndmFsdWUnKSkge1xuICAgIGlmIChvd25EZXNjLndyaXRhYmxlID09PSBmYWxzZSB8fCAhaXNPYmplY3QocmVjZWl2ZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRvciA9IGdPUEQuZihyZWNlaXZlciwgcHJvcGVydHlLZXkpKSB7XG4gICAgICBpZiAoZXhpc3RpbmdEZXNjcmlwdG9yLmdldCB8fCBleGlzdGluZ0Rlc2NyaXB0b3Iuc2V0IHx8IGV4aXN0aW5nRGVzY3JpcHRvci53cml0YWJsZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGV4aXN0aW5nRGVzY3JpcHRvci52YWx1ZSA9IFY7XG4gICAgICBkUC5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSwgZXhpc3RpbmdEZXNjcmlwdG9yKTtcbiAgICB9IGVsc2UgZFAuZihyZWNlaXZlciwgcHJvcGVydHlLZXksIGNyZWF0ZURlc2MoMCwgVikpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBvd25EZXNjLnNldCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAob3duRGVzYy5zZXQuY2FsbChyZWNlaXZlciwgViksIHRydWUpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IHNldDogc2V0IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///258\n")},function(module,exports,__webpack_require__){eval("// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = __webpack_require__(1);\nvar setProto = __webpack_require__(64);\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzPzkyNzUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS4xNCBSZWZsZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNldFByb3RvID0gcmVxdWlyZSgnLi9fc2V0LXByb3RvJyk7XG5cbmlmIChzZXRQcm90bykgJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBzZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bykge1xuICAgIHNldFByb3RvLmNoZWNrKHRhcmdldCwgcHJvdG8pO1xuICAgIHRyeSB7XG4gICAgICBzZXRQcm90by5zZXQodGFyZ2V0LCBwcm90byk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///259\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(261);\nmodule.exports = __webpack_require__(9).Array.includes;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vYXJyYXkvaW5jbHVkZXMuanM/MTQzYSJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuQXJyYXkuaW5jbHVkZXM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///260\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// https://github.com/tc39/Array.prototype.includes\nvar $export = __webpack_require__(1);\nvar $includes = __webpack_require__(46)(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n__webpack_require__(39)('includes');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanM/Njc2MiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9BcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdpbmNsdWRlcycpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///261\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(263);\nmodule.exports = __webpack_require__(9).String.padStart;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vc3RyaW5nL3BhZC1zdGFydC5qcz9jMThjIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtc3RhcnQnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlN0cmluZy5wYWRTdGFydDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///262\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(1);\nvar $pad = __webpack_require__(111);\nvar userAgent = __webpack_require__(54);\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydC5qcz9mNTc2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYWQgPSByZXF1aXJlKCcuL19zdHJpbmctcGFkJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMjgwXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIC9WZXJzaW9uXFwvMTBcXC5cXGQrKFxcLlxcZCspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KSwgJ1N0cmluZycsIHtcbiAgcGFkU3RhcnQ6IGZ1bmN0aW9uIHBhZFN0YXJ0KG1heExlbmd0aCAvKiAsIGZpbGxTdHJpbmcgPSAnICcgKi8pIHtcbiAgICByZXR1cm4gJHBhZCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///263\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(265);\nmodule.exports = __webpack_require__(9).String.padEnd;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vc3RyaW5nL3BhZC1lbmQuanM/NDBkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLWVuZCcpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuU3RyaW5nLnBhZEVuZDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///264\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(1);\nvar $pad = __webpack_require__(111);\nvar userAgent = __webpack_require__(54);\n\n// https://github.com/zloirock/core-js/issues/280\n$export($export.P + $export.F * /Version\\/10\\.\\d+(\\.\\d+)? Safari\\//.test(userAgent), 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQuanM/ZWQ1MCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFkID0gcmVxdWlyZSgnLi9fc3RyaW5nLXBhZCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzI4MFxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAvVmVyc2lvblxcLzEwXFwuXFxkKyhcXC5cXGQrKT8gU2FmYXJpXFwvLy50ZXN0KHVzZXJBZ2VudCksICdTdHJpbmcnLCB7XG4gIHBhZEVuZDogZnVuY3Rpb24gcGFkRW5kKG1heExlbmd0aCAvKiAsIGZpbGxTdHJpbmcgPSAnICcgKi8pIHtcbiAgICByZXR1cm4gJHBhZCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCBmYWxzZSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///265\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(267);\nmodule.exports = __webpack_require__(59).f('asyncIterator');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vc3ltYm9sL2FzeW5jLWl0ZXJhdG9yLmpzP2MwM2MiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX3drcy1leHQnKS5mKCdhc3luY0l0ZXJhdG9yJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///266\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(85)('asyncIterator');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzP2FjNGQiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///267\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(269);\nmodule.exports = __webpack_require__(9).Object.getOwnPropertyDescriptors;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanM/Zjk3OSJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///268\n")},function(module,exports,__webpack_require__){eval("// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(1);\nvar ownKeys = __webpack_require__(110);\nvar toIObject = __webpack_require__(15);\nvar gOPD = __webpack_require__(18);\nvar createProperty = __webpack_require__(75);\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanM/OGU2ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi9fb3duLWtleXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgICB2YXIgZ2V0RGVzYyA9IGdPUEQuZjtcbiAgICB2YXIga2V5cyA9IG93bktleXMoTyk7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5LCBkZXNjO1xuICAgIHdoaWxlIChrZXlzLmxlbmd0aCA+IGkpIHtcbiAgICAgIGRlc2MgPSBnZXREZXNjKE8sIGtleSA9IGtleXNbaSsrXSk7XG4gICAgICBpZiAoZGVzYyAhPT0gdW5kZWZpbmVkKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGtleSwgZGVzYyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///269\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(271);\nmodule.exports = __webpack_require__(9).Object.values;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vb2JqZWN0L3ZhbHVlcy5qcz9jYzUxIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC52YWx1ZXM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///270\n")},function(module,exports,__webpack_require__){eval("// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(1);\nvar $values = __webpack_require__(112)(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcy5qcz84NjE1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdmFsdWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpIHtcbiAgICByZXR1cm4gJHZhbHVlcyhpdCk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///271\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(273);\nmodule.exports = __webpack_require__(9).Object.entries;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vb2JqZWN0L2VudHJpZXMuanM/MjViNCJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmVudHJpZXM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///272\n")},function(module,exports,__webpack_require__){eval("// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(1);\nvar $entries = __webpack_require__(112)(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjczLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanM/ZmZjMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGVudHJpZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoaXQpIHtcbiAgICByZXR1cm4gJGVudHJpZXMoaXQpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///273\n")},function(module,exports,__webpack_require__){"use strict";eval("\n__webpack_require__(104);\n__webpack_require__(275);\nmodule.exports = __webpack_require__(9).Promise['finally'];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vcHJvbWlzZS9maW5hbGx5LmpzPzRjOGEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5Qcm9taXNlWydmaW5hbGx5J107XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///274\n")},function(module,exports,__webpack_require__){"use strict";eval("// https://github.com/tc39/proposal-promise-finally\n\nvar $export = __webpack_require__(1);\nvar core = __webpack_require__(9);\nvar global = __webpack_require__(3);\nvar speciesConstructor = __webpack_require__(53);\nvar promiseResolve = __webpack_require__(106);\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n var C = speciesConstructor(this, core.Promise || global.Promise);\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n} });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzPzA5N2QiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1maW5hbGx5XG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnUHJvbWlzZScsIHsgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSk7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHksXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICB9IDogb25GaW5hbGx5XG4gICk7XG59IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///275\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(277);\n__webpack_require__(278);\n__webpack_require__(279);\nmodule.exports = __webpack_require__(9);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvd2ViL2luZGV4LmpzPzE3MTUiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIudGltZXJzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5pbW1lZGlhdGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///276\n")},function(module,exports,__webpack_require__){eval("// ie9- setTimeout & setInterval additional parameters fix\nvar global = __webpack_require__(3);\nvar $export = __webpack_require__(1);\nvar userAgent = __webpack_require__(54);\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzPzQ3OTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaWU5LSBzZXRUaW1lb3V0ICYgc2V0SW50ZXJ2YWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgc2xpY2UgPSBbXS5zbGljZTtcbnZhciBNU0lFID0gL01TSUUgLlxcLi8udGVzdCh1c2VyQWdlbnQpOyAvLyA8LSBkaXJ0eSBpZTktIGNoZWNrXG52YXIgd3JhcCA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChmbiwgdGltZSAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgICB2YXIgYm91bmRBcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgdmFyIGFyZ3MgPSBib3VuZEFyZ3MgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiBmYWxzZTtcbiAgICByZXR1cm4gc2V0KGJvdW5kQXJncyA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gOiBmbiwgdGltZSk7XG4gIH07XG59O1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkIgKyAkZXhwb3J0LkYgKiBNU0lFLCB7XG4gIHNldFRpbWVvdXQ6IHdyYXAoZ2xvYmFsLnNldFRpbWVvdXQpLFxuICBzZXRJbnRlcnZhbDogd3JhcChnbG9iYWwuc2V0SW50ZXJ2YWwpXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///277\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar $task = __webpack_require__(80);\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuaW1tZWRpYXRlLmpzPzEzMGYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CLCB7XG4gIHNldEltbWVkaWF0ZTogJHRhc2suc2V0LFxuICBjbGVhckltbWVkaWF0ZTogJHRhc2suY2xlYXJcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///278\n")},function(module,exports,__webpack_require__){eval("var $iterators = __webpack_require__(78);\nvar getKeys = __webpack_require__(32);\nvar redefine = __webpack_require__(11);\nvar global = __webpack_require__(3);\nvar hide = __webpack_require__(14);\nvar Iterators = __webpack_require__(38);\nvar wks = __webpack_require__(6);\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzP2FjNmEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRpdGVyYXRvcnMgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIElURVJBVE9SID0gd2tzKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbnZhciBET01JdGVyYWJsZXMgPSB7XG4gIENTU1J1bGVMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogZmFsc2UsXG4gIENTU1ZhbHVlTGlzdDogZmFsc2UsXG4gIENsaWVudFJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NUmVjdExpc3Q6IGZhbHNlLFxuICBET01TdHJpbmdMaXN0OiBmYWxzZSxcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogZmFsc2UsXG4gIEZpbGVMaXN0OiBmYWxzZSxcbiAgSFRNTEFsbENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxGb3JtRWxlbWVudDogZmFsc2UsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiBmYWxzZSxcbiAgTWVkaWFMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgTWltZVR5cGVBcnJheTogZmFsc2UsXG4gIE5hbWVkTm9kZU1hcDogZmFsc2UsXG4gIE5vZGVMaXN0OiB0cnVlLFxuICBQYWludFJlcXVlc3RMaXN0OiBmYWxzZSxcbiAgUGx1Z2luOiBmYWxzZSxcbiAgUGx1Z2luQXJyYXk6IGZhbHNlLFxuICBTVkdMZW5ndGhMaXN0OiBmYWxzZSxcbiAgU1ZHTnVtYmVyTGlzdDogZmFsc2UsXG4gIFNWR1BhdGhTZWdMaXN0OiBmYWxzZSxcbiAgU1ZHUG9pbnRMaXN0OiBmYWxzZSxcbiAgU1ZHU3RyaW5nTGlzdDogZmFsc2UsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IGZhbHNlLFxuICBTb3VyY2VCdWZmZXJMaXN0OiBmYWxzZSxcbiAgU3R5bGVTaGVldExpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBUZXh0VHJhY2tDdWVMaXN0OiBmYWxzZSxcbiAgVGV4dFRyYWNrTGlzdDogZmFsc2UsXG4gIFRvdWNoTGlzdDogZmFsc2Vcbn07XG5cbmZvciAodmFyIGNvbGxlY3Rpb25zID0gZ2V0S2V5cyhET01JdGVyYWJsZXMpLCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gY29sbGVjdGlvbnNbaV07XG4gIHZhciBleHBsaWNpdCA9IERPTUl0ZXJhYmxlc1tOQU1FXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIHZhciBrZXk7XG4gIGlmIChwcm90bykge1xuICAgIGlmICghcHJvdG9bSVRFUkFUT1JdKSBoaWRlKHByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIGlmICghcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IEFycmF5VmFsdWVzO1xuICAgIGlmIChleHBsaWNpdCkgZm9yIChrZXkgaW4gJGl0ZXJhdG9ycykgaWYgKCFwcm90b1trZXldKSByZWRlZmluZShwcm90bywga2V5LCAkaXRlcmF0b3JzW2tleV0sIHRydWUpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///279\n")},function(module,exports){eval('/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n "use strict";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === "function" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || "@@iterator";\n var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";\n var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";\n\n var inModule = typeof module === "object";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we\'re in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don\'t bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we\'re in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there\'s no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don\'t have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: "normal", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: "throw", arg: err };\n }\n }\n\n var GenStateSuspendedStart = "suspendedStart";\n var GenStateSuspendedYield = "suspendedYield";\n var GenStateExecuting = "executing";\n var GenStateCompleted = "completed";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don\'t natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = "GeneratorFunction";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n ["next", "throw", "return"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === "function" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === "GeneratorFunction"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = "GeneratorFunction";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, "__await")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === "throw") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === "object" &&\n hasOwn.call(value, "__await")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke("next", value, resolve, reject);\n }, function(err) {\n invoke("throw", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error("Generator is already running");\n }\n\n if (state === GenStateCompleted) {\n if (method === "throw") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === "next") {\n // Setting context._sent for legacy support of Babel\'s\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === "throw") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === "return") {\n context.abrupt("return", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === "normal") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === "throw") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = "throw";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === "throw") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = "return";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === "throw") {\n // If maybeInvokeDelegate(context) changed context.method from\n // "return" to "throw", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = "throw";\n context.arg = new TypeError(\n "The iterator does not provide a \'throw\' method");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === "throw") {\n context.method = "throw";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = "throw";\n context.arg = new TypeError("iterator result is not an object");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was "throw" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was "next", forget context.arg since it has been\n // "consumed" by the delegate iterator. If context.method was\n // "return", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== "return") {\n context.method = "next";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = "Generator";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers\' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn\'t happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return "[object Generator]";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = "normal";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: "root" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === "function") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel\'s\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = "next";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === "t" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === "throw") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = "throw";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = "next";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === "root") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle("end");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, "catchLoc");\n var hasFinally = hasOwn.call(entry, "finallyLoc");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error("try statement without catch or finally");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, "finallyLoc") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === "break" ||\n type === "continue") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = "next";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === "throw") {\n throw record.arg;\n }\n\n if (record.type === "break" ||\n record.type === "continue") {\n this.next = record.arg;\n } else if (record.type === "return") {\n this.rval = this.arg = record.arg;\n this.method = "return";\n this.next = "end";\n } else if (record.type === "normal" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n "catch": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === "throw") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error("illegal catch attempt");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === "next") {\n // Deliberately forget the last sent value so that we don\'t\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we\'re in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function("return this")()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcz85NmNmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLiBJZiB0aGUgUHJvbWlzZSBpcyByZWplY3RlZCwgaG93ZXZlciwgdGhlXG4gICAgICAgICAgLy8gcmVzdWx0IGZvciB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHJlamVjdGVkIHdpdGggdGhlIHNhbWVcbiAgICAgICAgICAvLyByZWFzb24uIE5vdGUgdGhhdCByZWplY3Rpb25zIG9mIHlpZWxkZWQgUHJvbWlzZXMgYXJlIG5vdFxuICAgICAgICAgIC8vIHRocm93biBiYWNrIGludG8gdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgYXMgaXMgdGhlIGNhc2VcbiAgICAgICAgICAvLyB3aGVuIGFuIGF3YWl0ZWQgUHJvbWlzZSBpcyByZWplY3RlZC4gVGhpcyBkaWZmZXJlbmNlIGluXG4gICAgICAgICAgLy8gYmVoYXZpb3IgYmV0d2VlbiB5aWVsZCBhbmQgYXdhaXQgaXMgaW1wb3J0YW50LCBiZWNhdXNlIGl0XG4gICAgICAgICAgLy8gYWxsb3dzIHRoZSBjb25zdW1lciB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZSB5aWVsZGVkXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIChzd2FsbG93IGl0IGFuZCBjb250aW51ZSwgbWFudWFsbHkgLnRocm93IGl0IGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBnZW5lcmF0b3IsIGFiYW5kb24gaXRlcmF0aW9uLCB3aGF0ZXZlcikuIFdpdGhcbiAgICAgICAgICAvLyBhd2FpdCwgYnkgY29udHJhc3QsIHRoZXJlIGlzIG5vIG9wcG9ydHVuaXR5IHRvIGV4YW1pbmUgdGhlXG4gICAgICAgICAgLy8gcmVqZWN0aW9uIHJlYXNvbiBvdXRzaWRlIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIHNvIHRoZVxuICAgICAgICAgIC8vIG9ubHkgb3B0aW9uIGlzIHRvIHRocm93IGl0IGZyb20gdGhlIGF3YWl0IGV4cHJlc3Npb24sIGFuZFxuICAgICAgICAgIC8vIGxldCB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhbmRsZSB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZSA9XG4gICAgICAgIC8vIElmIGVucXVldWUgaGFzIGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiB3ZSB3YW50IHRvIHdhaXQgdW50aWxcbiAgICAgICAgLy8gYWxsIHByZXZpb3VzIFByb21pc2VzIGhhdmUgYmVlbiByZXNvbHZlZCBiZWZvcmUgY2FsbGluZyBpbnZva2UsXG4gICAgICAgIC8vIHNvIHRoYXQgcmVzdWx0cyBhcmUgYWx3YXlzIGRlbGl2ZXJlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4gSWZcbiAgICAgICAgLy8gZW5xdWV1ZSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSwgdGhlbiBpdCBpcyBpbXBvcnRhbnQgdG9cbiAgICAgICAgLy8gY2FsbCBpbnZva2UgaW1tZWRpYXRlbHksIHdpdGhvdXQgd2FpdGluZyBvbiBhIGNhbGxiYWNrIHRvIGZpcmUsXG4gICAgICAgIC8vIHNvIHRoYXQgdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIGRvXG4gICAgICAgIC8vIGFueSBuZWNlc3Nhcnkgc2V0dXAgaW4gYSBwcmVkaWN0YWJsZSB3YXkuIFRoaXMgcHJlZGljdGFiaWxpdHlcbiAgICAgICAgLy8gaXMgd2h5IHRoZSBQcm9taXNlIGNvbnN0cnVjdG9yIHN5bmNocm9ub3VzbHkgaW52b2tlcyBpdHNcbiAgICAgICAgLy8gZXhlY3V0b3IgY2FsbGJhY2ssIGFuZCB3aHkgYXN5bmMgZnVuY3Rpb25zIHN5bmNocm9ub3VzbHlcbiAgICAgICAgLy8gZXhlY3V0ZSBjb2RlIGJlZm9yZSB0aGUgZmlyc3QgYXdhaXQuIFNpbmNlIHdlIGltcGxlbWVudCBzaW1wbGVcbiAgICAgICAgLy8gYXN5bmMgZnVuY3Rpb25zIGluIHRlcm1zIG9mIGFzeW5jIGdlbmVyYXRvcnMsIGl0IGlzIGVzcGVjaWFsbHlcbiAgICAgICAgLy8gaW1wb3J0YW50IHRvIGdldCB0aGlzIHJpZ2h0LCBldmVuIHRob3VnaCBpdCByZXF1aXJlcyBjYXJlLlxuICAgICAgICBwcmV2aW91c1Byb21pc2UgPyBwcmV2aW91c1Byb21pc2UudGhlbihcbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyxcbiAgICAgICAgICAvLyBBdm9pZCBwcm9wYWdhdGluZyBmYWlsdXJlcyB0byBQcm9taXNlcyByZXR1cm5lZCBieSBsYXRlclxuICAgICAgICAgIC8vIGludm9jYXRpb25zIG9mIHRoZSBpdGVyYXRvci5cbiAgICAgICAgICBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZ1xuICAgICAgICApIDogY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZpbmUgdGhlIHVuaWZpZWQgaGVscGVyIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gKHNlZSBkZWZpbmVJdGVyYXRvck1ldGhvZHMpLlxuICAgIHRoaXMuX2ludm9rZSA9IGVucXVldWU7XG4gIH1cblxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoQXN5bmNJdGVyYXRvci5wcm90b3R5cGUpO1xuICBBc3luY0l0ZXJhdG9yLnByb3RvdHlwZVthc3luY0l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgcnVudGltZS5Bc3luY0l0ZXJhdG9yID0gQXN5bmNJdGVyYXRvcjtcblxuICAvLyBOb3RlIHRoYXQgc2ltcGxlIGFzeW5jIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgb24gdG9wIG9mXG4gIC8vIEFzeW5jSXRlcmF0b3Igb2JqZWN0czsgdGhleSBqdXN0IHJldHVybiBhIFByb21pc2UgZm9yIHRoZSB2YWx1ZSBvZlxuICAvLyB0aGUgZmluYWwgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpdGVyYXRvci5cbiAgcnVudGltZS5hc3luYyA9IGZ1bmN0aW9uKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpXG4gICAgKTtcblxuICAgIHJldHVybiBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3IucmV0dXJuKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBhIHJldHVybiBtZXRob2QsIGdpdmUgaXQgYVxuICAgICAgICAgIC8vIGNoYW5jZSB0byBjbGVhbiB1cC5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG5cbiAgICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgLy8gSWYgbWF5YmVJbnZva2VEZWxlZ2F0ZShjb250ZXh0KSBjaGFuZ2VkIGNvbnRleHQubWV0aG9kIGZyb21cbiAgICAgICAgICAgIC8vIFwicmV0dXJuXCIgdG8gXCJ0aHJvd1wiLCBsZXQgdGhhdCBvdmVycmlkZSB0aGUgVHlwZUVycm9yIGJlbG93LlxuICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBcIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJ3Rocm93JyBtZXRob2RcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChtZXRob2QsIGRlbGVnYXRlLml0ZXJhdG9yLCBjb250ZXh0LmFyZyk7XG5cbiAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIHZhciBpbmZvID0gcmVjb3JkLmFyZztcblxuICAgIGlmICghIGluZm8pIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIik7XG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cblxuICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgIC8vIEFzc2lnbiB0aGUgcmVzdWx0IG9mIHRoZSBmaW5pc2hlZCBkZWxlZ2F0ZSB0byB0aGUgdGVtcG9yYXJ5XG4gICAgICAvLyB2YXJpYWJsZSBzcGVjaWZpZWQgYnkgZGVsZWdhdGUucmVzdWx0TmFtZSAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dFtkZWxlZ2F0ZS5yZXN1bHROYW1lXSA9IGluZm8udmFsdWU7XG5cbiAgICAgIC8vIFJlc3VtZSBleGVjdXRpb24gYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24gKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHQubmV4dCA9IGRlbGVnYXRlLm5leHRMb2M7XG5cbiAgICAgIC8vIElmIGNvbnRleHQubWV0aG9kIHdhcyBcInRocm93XCIgYnV0IHRoZSBkZWxlZ2F0ZSBoYW5kbGVkIHRoZVxuICAgICAgLy8gZXhjZXB0aW9uLCBsZXQgdGhlIG91dGVyIGdlbmVyYXRvciBwcm9jZWVkIG5vcm1hbGx5LiBJZlxuICAgICAgLy8gY29udGV4dC5tZXRob2Qgd2FzIFwibmV4dFwiLCBmb3JnZXQgY29udGV4dC5hcmcgc2luY2UgaXQgaGFzIGJlZW5cbiAgICAgIC8vIFwiY29uc3VtZWRcIiBieSB0aGUgZGVsZWdhdGUgaXRlcmF0b3IuIElmIGNvbnRleHQubWV0aG9kIHdhc1xuICAgICAgLy8gXCJyZXR1cm5cIiwgYWxsb3cgdGhlIG9yaWdpbmFsIC5yZXR1cm4gY2FsbCB0byBjb250aW51ZSBpbiB0aGVcbiAgICAgIC8vIG91dGVyIGdlbmVyYXRvci5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCAhPT0gXCJyZXR1cm5cIikge1xuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZS15aWVsZCB0aGUgcmVzdWx0IHJldHVybmVkIGJ5IHRoZSBkZWxlZ2F0ZSBtZXRob2QuXG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9XG5cbiAgICAvLyBUaGUgZGVsZWdhdGUgaXRlcmF0b3IgaXMgZmluaXNoZWQsIHNvIGZvcmdldCBpdCBhbmQgY29udGludWUgd2l0aFxuICAgIC8vIHRoZSBvdXRlciBnZW5lcmF0b3IuXG4gICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gIH1cblxuICAvLyBEZWZpbmUgR2VuZXJhdG9yLnByb3RvdHlwZS57bmV4dCx0aHJvdyxyZXR1cm59IGluIHRlcm1zIG9mIHRoZVxuICAvLyB1bmlmaWVkIC5faW52b2tlIGhlbHBlciBtZXRob2QuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhHcCk7XG5cbiAgR3BbdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JcIjtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBydW50aW1lLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgcnVudGltZS52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcbn0pKFxuICAvLyBJbiBzbG9wcHkgbW9kZSwgdW5ib3VuZCBgdGhpc2AgcmVmZXJzIHRvIHRoZSBnbG9iYWwgb2JqZWN0LCBmYWxsYmFjayB0b1xuICAvLyBGdW5jdGlvbiBjb25zdHJ1Y3RvciBpZiB3ZSdyZSBpbiBnbG9iYWwgc3RyaWN0IG1vZGUuIFRoYXQgaXMgc2FkbHkgYSBmb3JtXG4gIC8vIG9mIGluZGlyZWN0IGV2YWwgd2hpY2ggdmlvbGF0ZXMgQ29udGVudCBTZWN1cml0eSBQb2xpY3kuXG4gIChmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMgfSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKClcbik7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///280\n')},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(process) {// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(282)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcz9kZjdjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XSwgdW5peCB2ZXJzaW9uXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxudmFyIHNwbGl0UGF0aFJlID1cbiAgICAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbnZhciBzcGxpdFBhdGggPSBmdW5jdGlvbihmaWxlbmFtZSkge1xuICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7XG59O1xuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc29sdmVkUGF0aCA9ICcnLFxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgdmFyIHBhdGggPSAoaSA+PSAwKSA/IGFyZ3VtZW50c1tpXSA6IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpLFxuICAgICAgdHJhaWxpbmdTbGFzaCA9IHN1YnN0cihwYXRoLCAtMSkgPT09ICcvJztcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihwYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBwYXRoID0gJy4nO1xuICB9XG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcbiAgICBwYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHBhdGg7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5qb2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gIHJldHVybiBleHBvcnRzLm5vcm1hbGl6ZShmaWx0ZXIocGF0aHMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pLmpvaW4oJy8nKSk7XG59O1xuXG5cbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgZnJvbSA9IGV4cG9ydHMucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7XG4gIHRvID0gZXhwb3J0cy5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59O1xuXG5leHBvcnRzLnNlcCA9ICcvJztcbmV4cG9ydHMuZGVsaW1pdGVyID0gJzonO1xuXG5leHBvcnRzLmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciByZXN1bHQgPSBzcGxpdFBhdGgocGF0aCksXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xuXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgcmV0dXJuICcuJztcbiAgfVxuXG4gIGlmIChkaXIpIHtcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QgKyBkaXI7XG59O1xuXG5cbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcbiAgdmFyIGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZjtcbn07XG5cblxuZXhwb3J0cy5leHRuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gc3BsaXRQYXRoKHBhdGgpWzNdO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///281\n")},function(module,exports){eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcz9mMjhjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///282\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/loglevel/lib/loglevel.js\nvar loglevel = __webpack_require__(0);\nvar loglevel_default = /*#__PURE__*/__webpack_require__.n(loglevel);\n\n// CONCATENATED MODULE: ./src/logLevels.js\n\nvar a = loglevel_default.a.getLogger('address-allocation');\nvar b = loglevel_default.a.getLogger('Bus');\nvar c = loglevel_default.a.getLogger('MessageBus');\nvar d = loglevel_default.a.getLogger('CoreDiscovery');\nvar e = loglevel_default.a.getLogger('StorageManager');\nvar f = loglevel_default.a.getLogger('HypertyResourcesStorage');\nvar g = loglevel_default.a.getLogger('IdentityModule');\nvar h = loglevel_default.a.getLogger('PEP');\nvar logLevels_i = loglevel_default.a.getLogger('P2PConnectionResolve');\nvar j = loglevel_default.a.getLogger('Registry');\nvar k = loglevel_default.a.getLogger('RuntimeUA');\nvar l = loglevel_default.a.getLogger('Loader');\nvar m = loglevel_default.a.getLogger('Descriptors');\nvar n = loglevel_default.a.getLogger('DataObjectsStorage');\nvar o = loglevel_default.a.getLogger('Subscription');\nvar p = loglevel_default.a.getLogger('SubscriptionManager');\nvar q = loglevel_default.a.getLogger('ObserverObject');\nvar r = loglevel_default.a.getLogger('ReporterObject');\nvar s = loglevel_default.a.getLogger('SynSubscription');\nvar t = loglevel_default.a.getLogger('SyncherManager');\nvar u = loglevel_default.a.getLogger('IdentityHandler');\nvar v = loglevel_default.a.getLogger('CryptoManager');\nvar x = loglevel_default.a.getLogger('Pipeline');\nvar f1 = loglevel_default.a.getLogger('Syncher');\nvar f2 = loglevel_default.a.getLogger('RuntimeCatalogue');\n\n/**\r\n 0 actual logging methods, ordered and available as:\r\n\r\n 0 - log.trace(msg)\r\n 1 - log.debug(msg)\r\n 2 - log.info(msg)\r\n 3 - log.warn(msg)\r\n 4 - log.error(msg)\r\n\r\n log.log(msg) is also available, as an alias for log.debug(msg), to improve compatibility with console, and make migration easier.\r\n\r\n Exact output formatting of these will depend on the console available in the current context of your application. For example, many environments will include a full stack trace with all trace() calls, and icons or similar to highlight other calls.\r\n\r\n These methods should never fail in any environment, even if no console object is currently available, and should always fall back to an available log method even if the specific method called (e.g. warn) isn't available.\r\n\r\n Be aware that all this means that these method won't necessarily always produce exactly the output you expect in every environment; loglevel only guarantees that these methods will never explode on you, and that it will call the most relevant method it can find, with your argument. Firefox is a notable example here: due to a current Firefox bug log.trace(msg) calls in Firefox will print only the stacktrace, and won't include any passed message arguments.\r\n\r\n*/\n// address-allocation\n\na.setLevel(0); // Bus\n\nb.setLevel(3); // MessageBus\n\nc.setLevel(3); // CoreDiscovery\n\nd.setLevel(5); // StorageManager\n\ne.setLevel(0); // HypertyResourcesStorage\n\nf.setLevel(3); // IdentityModule\n\ng.setLevel(0); // PEP\n\nh.setLevel(3); // P2PConnectionResolve\n\nlogLevels_i.setLevel(3); // Registry\n\nj.setLevel(0); // RuntimeUA\n\nk.setLevel(0); // Loader\n\nl.setLevel(0); // Descriptors\n\nm.setLevel(3); // DataObjectsStorage\n\nn.setLevel(0); // Subscription\n\no.setLevel(3); // SubscriptionManager\n\np.setLevel(3); // ObserverObject\n\nq.setLevel(0); // ReporterObject\n\nr.setLevel(0); // SynSubscription\n\ns.setLevel(3); // SyncherManager\n\nt.setLevel(0); // IdentityHandler\n\nu.setLevel(3); // CryptoManager\n\nv.setLevel(0); // Pipeline\n\nx.setLevel(0); // Syncher\n\nf1.setLevel(0); // Syncher DataObjectObserver\n\nf1.setLevel(0); // RuntimeCatalogue\n\nf2.setLevel(0);\n// CONCATENATED MODULE: ./src/runtime/runtimeUtils.js\nvar runtimeUtils = {\n runtimeDescriptor: {},\n runtimeCapabilities: {\n constraints: {}\n }\n};\n// CONCATENATED MODULE: ./src/utils/utils.js\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Support module with some functions will be useful\r\n * @module utils\r\n */\n\n/**\r\n * @typedef divideURL\r\n * @type Object\r\n * @property {string} type The type of URL\r\n * @property {string} domain The domain of URL\r\n * @property {string} identity The identity of URL\r\n */\n\n/**\r\n * Divide an url in type, domain and identity\r\n * @param {URL.URL} url - url address\r\n * @return {divideURL} the result of divideURL\r\n */\nfunction divideURL(url) {\n function recurse(value) {\n var regex = /([a-zA-Z-]*)(:\\/\\/(?:\\.)?|:)([-a-zA-Z0-9@:%._+~#=]{2,256})([-a-zA-Z0-9@:%._+~#=/]*)/gi;\n var subst = '$1,$3,$4';\n var parts = value.replace(regex, subst).split(',');\n return parts;\n }\n\n var parts = recurse(url); // If the url has no scheme\n\n if (parts[0] === url && !parts[0].includes('@')) {\n var _result = {\n type: '',\n domain: url,\n identity: ''\n };\n console.warn('[DivideURL] DivideURL don\\'t support url without scheme. Please review your url address', url);\n return _result;\n } // check if the url has the scheme and includes an @\n\n\n if (parts[0] === url && parts[0].includes('@')) {\n var scheme = parts[0] === url ? 'smtp' : parts[0];\n parts = recurse(scheme + '://' + parts[0]);\n } // if the domain includes an @, divide it to domain and identity respectively\n\n\n if (parts[1].includes('@')) {\n parts[2] = parts[0] + '://' + parts[1];\n parts[1] = parts[1].substr(parts[1].indexOf('@') + 1);\n }\n /*else if (parts[2].includes('/')) {\r\n parts[2] = parts[2].substr(parts[2].lastIndexOf('/')+1);\r\n }*/\n\n\n var result = {\n type: parts[0],\n domain: parts[1],\n identity: parts[2]\n };\n return result;\n}\n/**\r\n * Check if an Object is empty\r\n * @param {Object} object Object to be checked\r\n * @return {Boolean} status of Object, empty or not (true|false);\r\n */\n\nfunction emptyObject(object) {\n return Object.keys(object).length > 0 ? false : true;\n}\nfunction secondsSinceEpoch() {\n return Math.floor(Date.now() / 1000);\n}\n/**\r\n * Make a COPY of the original data\r\n * @param {Object} obj - object to be cloned\r\n * @return {Object}\r\n */\n\nfunction deepClone(obj) {\n //TODO: simple but inefficient JSON deep clone...\n if (obj) return JSON.parse(JSON.stringify(obj));\n}\nfunction removePathFromURL(url) {\n var splitURL = url.split('/');\n return splitURL[0] + '//' + splitURL[2] + '/' + splitURL[3];\n}\n/**\r\n * Obtains the user URL that corresponds to a given email\r\n * @param {string} userEmail The user email\r\n * @return {URL.URL} userURL The user URL\r\n */\n\nfunction getUserURLFromEmail(userEmail) {\n var indexOfAt = userEmail.indexOf('@');\n return 'user://' + userEmail.substring(indexOfAt + 1, userEmail.length) + '/' + userEmail.substring(0, indexOfAt);\n}\n/**\r\n * Obtains the user email that corresponds to a given URL\r\n * @param {URL.URL} userURL The user URL\r\n * @return {string} userEmail The user email\r\n */\n\nfunction getUserEmailFromURL(userURL) {\n var url = divideURL(userURL);\n return url.identity.replace('/', '') + '@' + url.domain; // identity field has '/exampleID' instead of 'exampleID'\n}\n/**\r\n * Check if the user identifier is already in the URL format, if not, convert to URL format\r\n * @param {string} identifier user identifier\r\n * @return {string} userURL the user URL\r\n */\n\nfunction convertToUserURL(identifier) {\n // check if the identifier is already in the url format\n if (identifier.substring(0, 7) === 'user://') {\n var dividedURL = divideURL(identifier); //check if the url is well formated\n\n if (dividedURL.domain && dividedURL.identity) {\n return identifier;\n } else {\n throw 'userURL with wrong format';\n } //if not, convert the user email to URL format\n\n } else {\n return getUserURLFromEmail(identifier);\n }\n}\nfunction isDataObjectURL(url) {\n var schemasToIgnore = ['domain-idp', 'runtime', 'domain', 'hyperty'];\n var splitURL = url.split('://');\n var urlSchema = splitURL[0];\n return schemasToIgnore.indexOf(urlSchema) === -1;\n}\nfunction utils_isLegacy(url) {\n if (url.split('@').length > 1) {\n return true;\n } else {\n return false;\n }\n}\nfunction isURL(url) {\n return url.split('/').length >= 3;\n}\nfunction isUserURL(url) {\n return divideURL(url).type === 'user';\n}\nfunction utils_isHypertyURL(url) {\n return divideURL(url).type === 'hyperty';\n}\n/**\r\n * get information relative each component configured on runtime configuration;\r\n * @param {object} configuration object with all configuration\r\n * @param {string} component string with the component to get the configuration, like, runtimeURLS, catalogueURLs, msgNodeURL, domainRegistryURL;\r\n * @param {string} resource type of resource to get, like, catalogue, runtimeUA, protocolstub, idpProxy\r\n * @return {object} return an object with all configurations;\r\n */\n\nfunction getConfigurationResources(configuration, component, resource) {\n var objectResource = configuration[component];\n var resourceType = objectResource[resource];\n return resourceType;\n}\n/**\r\n * Build a full url with the runtime configuration;\r\n * @param {object} configuration object with all configuration\r\n * @param {string} component string with the component to get the configuration, like, runtimeURLS, catalogueURLs, msgNodeURL, domainRegistryURL;\r\n * @param {string} resource type of resource to get, like, catalogue, runtimeUA, protocolstub, idpProxy\r\n * @param {string} type resource to get, like a hyperty name or protocolstub name;\r\n * @param {boolean} useFallback if true the function will check if have a fallback url;\r\n * @return {string} partial url to contact the resource;\r\n */\n\nfunction buildURL(configuration, component, resource, type) {\n var useFallback = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var objectResource = configuration[component];\n var url;\n\n if (!objectResource.hasOwnProperty(resource)) {\n throw Error('The configuration ' + JSON.stringify(objectResource, '', 2) + ' don\\'t have the ' + resource + ' resource you are looking for');\n }\n\n var resourceType = objectResource[resource];\n\n if (type) {\n url = resourceType.prefix + configuration.domain + resourceType.suffix + type;\n\n if (resourceType.hasOwnProperty('fallback') && useFallback) {\n if (resourceType.fallback.indexOf('%domain%')) {\n url = resourceType.fallback.replace(/(%domain%)/g, configuration.domain) + type;\n } else {\n url = resourceType.fallback + type;\n }\n }\n } else {\n url = resourceType.prefix + configuration.domain + resourceType.suffix;\n } // console.log(url);\n\n\n return url;\n}\n/**\r\n * Generate a Global Unique ID\r\n *\r\n * @returns String;\r\n */\n\nfunction generateGUID() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n}\nfunction getUserIdentityDomain(url) {\n var dividedURL = divideURL(url);\n var splitedDomain = dividedURL.domain.split('.');\n var splitedLength = splitedDomain.length;\n\n if (splitedLength == 1) {\n return splitedDomain[splitedLength - 1];\n }\n\n var domain = splitedDomain[splitedLength - 2] + '.' + splitedDomain[splitedLength - 1];\n return domain;\n}\n/**\r\n * Check if URL is from a backend service\r\n * @param {string} url URL to be processed\r\n * @return {boolean}\r\n */\n\nfunction isBackendServiceURL(url) {\n var dividedURL = divideURL(url);\n var splitedDomain = dividedURL.domain.split('.');\n var backendSchemes = ['domain', 'global', 'domain-idp']; // should be defined in the runtime configuration\n\n var backendSubDomains = ['registry', 'msg-node']; // should be defined in the runtime configuration\n\n var subDomain;\n\n if (splitedDomain.length > 1) {\n subDomain = splitedDomain.filter(function (item) {\n return backendSubDomains.indexOf(item) !== -1;\n })[0];\n }\n\n if (subDomain && backendSubDomains.indexOf(subDomain) !== -1) {\n return true;\n }\n\n if (dividedURL.type) {\n return backendSchemes.indexOf(dividedURL.type) !== -1;\n }\n\n return false;\n}\nfunction divideEmail(email) {\n var indexOfAt = email.indexOf('@');\n var result = {\n username: email.substring(0, indexOfAt),\n domain: email.substring(indexOfAt + 1, email.length)\n };\n return result;\n}\nfunction utils_assign(obj, keyPath, value) {\n if (!obj) obj = {};\n if (typeof keyPath === 'string') keyPath = parseAttributes(keyPath);\n var lastKeyIndex = keyPath.length - 1;\n\n for (var i = 0; i < lastKeyIndex; ++i) {\n var key = keyPath[i];\n\n if (!(key in obj)) {\n obj[key] = {};\n }\n\n obj = obj[key];\n }\n\n obj[keyPath[lastKeyIndex]] = value;\n}\nfunction splitObjectURL(dataObjectURL) {\n console.info('[utils - splitObjectURL]: ', dataObjectURL);\n var splitedURL = dataObjectURL.split('/');\n var url = splitedURL[0] + '//' + splitedURL[2] + '/' + splitedURL[3];\n var resource = splitedURL[5];\n var result = {\n url: url,\n resource: resource\n };\n console.info('[utils - splitObjectURL]: ', result);\n return result;\n}\nfunction checkAttribute(path) {\n var regex = /((([a-zA-Z]+):\\/\\/([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})\\/[a-zA-Z0-9.]+@[a-zA-Z0-9]+(-)?[a-zA-Z0-9]+(\\.)?[a-zA-Z0-9]{2,10}?\\.[a-zA-Z]{2,10})(.+(?=.identity))?/gm;\n var list = [];\n var final = [];\n var test = path.match(regex);\n\n if (test == null) {\n final = path.split('.');\n } else {\n var m;\n\n while ((m = regex.exec(path)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n } // The result can be accessed through the `m`-variable.\n\n\n m.forEach(function (match, groupIndex) {\n if (groupIndex === 0) {\n list.push(match);\n }\n });\n }\n\n var result;\n list.forEach(function (url) {\n result = path.replace(url, '*-*');\n final = result.split('.').map(function (item) {\n if (item === '*-*') {\n return url;\n }\n\n return item;\n });\n });\n }\n\n console.log('[RuntimeCore.Utils.checkAttribute]', final);\n return final;\n}\nfunction parseAttributes(path) {\n var regex = /([0-9a-zA-Z][-\\w]*):\\/\\//g;\n var string3 = 'identity';\n\n if (!path.includes('://')) {\n return path.split('.');\n } else {\n var string1 = path.split(regex)[0];\n var array1 = string1.split('.');\n var string2 = path.replace(string1, '');\n\n if (path.includes(string3)) {\n var array2 = string2.split(string3 + '.');\n console.log('array2 ' + array2);\n string2 = array2[0].slice('.', -1);\n array2 = array2[1].split('.');\n array1.push(string2, string3);\n array1 = array1.concat(array2);\n } else {\n array1.push(string2);\n }\n\n return array1.filter(Boolean);\n }\n}\nfunction isEmpty(obj) {\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n return false;\n }\n }\n\n return JSON.stringify(obj) === JSON.stringify({});\n}\nfunction chatkeysToStringCloner(sessionKeys) {\n var dataObjectSessionKeysClone = {};\n var fields = Object.keys(sessionKeys);\n\n if (fields) {\n try {\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n dataObjectSessionKeysClone[field] = {};\n dataObjectSessionKeysClone[field].sessionKey = sessionKeys[field].sessionKey.toString();\n dataObjectSessionKeysClone[field].isToEncrypt = sessionKeys[field].isToEncrypt;\n }\n } catch (err) {\n console.error('_chatkeysToStringCloner:err', err);\n }\n }\n\n return dataObjectSessionKeysClone;\n}\nfunction chatkeysToArrayCloner(sessionKeys) {\n var dataObjectSessionKeysClone = {};\n var fields = Object.keys(sessionKeys);\n\n if (fields) {\n try {\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n dataObjectSessionKeysClone[field] = {};\n var arrayValues = JSON.parse('[' + sessionKeys[field].sessionKey + ']');\n dataObjectSessionKeysClone[field].sessionKey = new Uint8Array(arrayValues);\n dataObjectSessionKeysClone[field].isToEncrypt = sessionKeys[field].isToEncrypt;\n }\n } catch (err) {\n console.error('_chatkeysToArrayCloner:err', err);\n }\n }\n\n return dataObjectSessionKeysClone;\n}\nfunction parseMessageURL(URL) {\n var splitedToURL = URL.split('/');\n\n if (splitedToURL.length <= 6) {\n return splitedToURL[0] + '//' + splitedToURL[2] + '/' + splitedToURL[3];\n } else {\n return splitedToURL[0] + '//' + splitedToURL[2] + '/' + splitedToURL[3] + '/' + splitedToURL[4];\n }\n}\nfunction availableSpace(usage, quota) {\n var available = (usage / quota).toFixed(2);\n return {\n quota: quota,\n usage: usage,\n percent: Number(available)\n };\n}\n/**\r\n* Encodes a JS object to base 64 encode\r\n* @param {Object} value byteArray value\r\n* @return {string} encoded value\r\n*/\n\nfunction encode(value) {\n try {\n var stringValue = stringify(value);\n return btoa(stringValue);\n } catch (err) {\n console.error('[Utils.encode:err] ' + err);\n throw err;\n }\n}\n/**\r\n * Decode a base64 string to object\r\n * @param {string_b64} value value encoded in base 64\r\n * @return {Object} decodedValue\r\n */\n\nfunction decode(value) {\n try {\n return JSON.parse(atob(value));\n } catch (err) {\n console.log('[Utils.decode:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Decode a base64 string to Uint8Array\r\n* @param {string_b64} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction decodeToUint8Array(value) {\n try {\n return new Uint8Array(decode(value));\n } catch (err) {\n console.error('[Utils.decodeToUint8Array:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Converts a JS object to string\r\n* NOTE: Special conversion for Uint8Arrays\r\n* @param {Object} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction stringify(value) {\n try {\n var stringValue;\n\n if (value.constructor === Uint8Array) {\n stringValue = '[' + value.toString() + ']'; // the [] is for JSON.parse compatibility\n } else {\n stringValue = JSON.stringify(value);\n }\n\n return stringValue;\n } catch (err) {\n console.error('[Utils.stringify:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Converts a stringified object to object\r\n* @param {String} value byteArray value\r\n* @return {Object} encoded value\r\n*/\n\nfunction parse(value) {\n try {\n return JSON.parse(value);\n } catch (err) {\n console.error('[Utils.parse:err]' + err);\n console.trace();\n console.error('That that cause the error:', value);\n throw err;\n }\n}\n/**\r\n* Converts a stringified object to object\r\n* @param {String} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction parseToUint8Array(value) {\n try {\n return new Uint8Array(parse(value));\n } catch (err) {\n console.error('[Utils.parseToUint8Array:err]' + err);\n throw err;\n }\n}\n// EXTERNAL MODULE: ./node_modules/proxy-observe/index.js\nvar proxy_observe = __webpack_require__(82);\n\n// CONCATENATED MODULE: ./src/syncher/ProxyObject.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar ProxyObject_objectType = {\n ARRAY: '[object Array]',\n OBJECT: '[object Object]'\n};\n/**\r\n * @access private\r\n * Main class that maintains a JSON object, and observes changes in this object, recursively.\r\n * Internal objects and arrays are also observed.\r\n */\n\nvar ProxyObject_SyncObject =\n/*#__PURE__*/\nfunction () {\n function SyncObject(initialData) {\n _classCallCheck(this, SyncObject);\n\n var _this = this;\n\n _this._observers = [];\n _this._filters = {};\n this._data = initialData || {};\n\n this._internalObserve(this._data);\n }\n\n _createClass(SyncObject, [{\n key: \"observe\",\n value: function observe(callback) {\n this._observers.push(callback);\n }\n }, {\n key: \"find\",\n value: function find(path) {\n var list = parseAttributes(path);\n return this._findWithSplit(list);\n }\n }, {\n key: \"findBefore\",\n value: function findBefore(path) {\n var result = {};\n var list = parseAttributes(path);\n result.last = list.pop();\n result.obj = this._findWithSplit(list);\n return result;\n }\n }, {\n key: \"_findWithSplit\",\n value: function _findWithSplit(list) {\n var obj = this._data;\n list.forEach(function (value) {\n obj = obj[value];\n });\n return obj;\n }\n }, {\n key: \"_internalObserve\",\n value: function _internalObserve(object) {\n var _this2 = this;\n\n var handler = function handler(changeset) {\n changeset.every(function (change) {\n _this2._onChanges(change);\n });\n };\n\n this._data = Object.deepObserve(object, handler);\n }\n }, {\n key: \"_fireEvent\",\n value: function _fireEvent(event) {\n this._observers.forEach(function (callback) {\n callback(event);\n });\n }\n }, {\n key: \"_onChanges\",\n value: function _onChanges(change) {\n var obj = change.object;\n var objType;\n\n if (obj.constructor === Object) {\n objType = ObjectType.OBJECT;\n }\n\n if (obj.constructor === Array) {\n objType = ObjectType.ARRAY;\n }\n\n var fieldString = change.keypath; // console.log('Field:', fieldString);\n // console.log('type:', change.type);\n //let oldValue = change.oldValue;\n\n var newValue = obj[change.name]; // console.info(change.type + ' | Field: ' + fieldString + ' | New Value:', JSON.stringify(newValue), fieldString.includes('length'));\n\n if (change.type === 'update' && !fieldString.includes('.length')) {\n this._fireEvent({\n cType: ChangeType.UPDATE,\n oType: objType,\n field: fieldString,\n data: newValue\n });\n }\n\n if (change.type === 'add') {\n this._fireEvent({\n cType: ChangeType.ADD,\n oType: objType,\n field: fieldString,\n data: newValue\n });\n }\n\n if (change.type === 'delete') {\n this._fireEvent({\n cType: ChangeType.REMOVE,\n oType: objType,\n field: fieldString\n });\n }\n }\n }, {\n key: \"data\",\n get: function get() {\n return this._data;\n }\n }]);\n\n return SyncObject;\n}();\n\nvar ChangeType = {\n UPDATE: 'update',\n ADD: 'add',\n REMOVE: 'remove'\n};\nvar ObjectType = {\n OBJECT: 'object',\n ARRAY: 'array'\n};\n/* harmony default export */ var ProxyObject = (ProxyObject_SyncObject);\n// CONCATENATED MODULE: ./src/syncher/DataObjectChild.js\nfunction DataObjectChild_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectChild_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectChild_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectChild_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectChild_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar DataObjectChild_log = loglevel[\"getLogger\"]('DataObjectChild');\n\n\n/**\r\n * The class returned from the DataObject addChildren call or from onAddChildren if remotely created.\r\n */\n\nvar DataObjectChild_DataObjectChild\n/* implements SyncStatus */\n=\n/*#__PURE__*/\nfunction () {\n /* private\r\n ----event handlers----\r\n _onResponseHandler: (event) => void\r\n */\n\n /**\r\n * @ignore\r\n * Should not be used directly by Hyperties. It's called by the DataObject.addChild\r\n */\n function DataObjectChild(input) {\n DataObjectChild_classCallCheck(this, DataObjectChild);\n\n var _this = this;\n\n function throwMandatoryParmMissingError(par) {\n throw '[DataObjectChild] ' + par + ' mandatory parameter is missing';\n }\n\n input.parent ? _this._parent = input.parent : throwMandatoryParmMissingError('parent');\n input.url ? _this._url = input.url : throwMandatoryParmMissingError('url');\n input.created ? _this._created = input.created : throwMandatoryParmMissingError('created');\n input.reporter ? _this._reporter = input.reporter : throwMandatoryParmMissingError('reporter');\n input.runtime ? _this._runtime = input.runtime : throwMandatoryParmMissingError('runtime');\n input.schema ? _this._schema = input.schema : throwMandatoryParmMissingError('schema');\n input.parentObject ? _this._parentObject = input.parentObject : throwMandatoryParmMissingError('parentObject');\n if (input.name) _this._name = input.name;\n if (input.description) _this._description = input.description;\n if (input.tags) _this._tags = input.tags;\n if (input.resources) _this._resources = input.resources;\n if (input.observerStorage) _this._observerStorage = input.observerStorage;\n if (input.publicObservation) _this._publicObservation = input.publicObservation;\n _this._childId = input.url;\n\n if (input.data) {\n _this._syncObj = new ProxyObject(input.data);\n } else {\n _this._syncObj = new ProxyObject({});\n }\n\n DataObjectChild_log.log('[DataObjectChild - Constructor] - ', _this._syncObj);\n _this._bus = _this._parentObject._bus;\n _this._owner = _this._parentObject._owner;\n\n _this._allocateListeners();\n\n _this._metadata = input; // delete _this._metadata.data;\n\n delete _this._metadata.parentObject;\n _this._sharingStatus = false;\n }\n\n DataObjectChild_createClass(DataObjectChild, [{\n key: \"share\",\n\n /**\r\n * This function is used to share the child Object among authorised Hyperties\r\n * @param {boolean} reporter If true the child object is only shared to Parent reporter\r\n * @return {Promise} It returns a promise with the sharing results.\r\n */\n value: function share(toReporter) {\n var _this = this;\n\n _this._sharingStatus = new Promise(function (resolve, reject) {\n var to;\n var reporter = toReporter;\n\n if (reporter) {\n to = _this.metadata.parent;\n } else to = _this.metadata.parent + '/children/';\n\n var childValue = _this.metadata;\n childValue.data = _this.data; //FLOW-OUT: this message will be sent directly to a resource child address: MessageBus\n\n var requestMsg = {\n type: 'create',\n from: _this.metadata.reporter,\n to: to,\n body: {\n resource: childValue.url,\n value: childValue\n }\n };\n\n if (_this.identity) {\n requestMsg.body.identity = _this.identity;\n } //to be used to disable mutual authentication for legacy users\n\n\n if (_this._parentObject.data.hasOwnProperty('mutual')) requestMsg.body.mutual = _this._parentObject.data.mutual;\n\n if (_this._parentObject.metadata.reporter === _this.metadata.reporter) {\n _this._bus.postMessage(deepClone(requestMsg));\n\n return resolve();\n } else {\n var callback = function callback(reply) {\n if (reply.to === _this._reporter) {\n _this._bus.removeResponseListener(requestMsg.from, reply.id);\n\n DataObjectChild_log.log('[Syncher.DataObjectChild.share] Parent reporter reply ', reply);\n var result = {\n code: reply.body && reply.body.code ? reply.body.code : 500,\n desc: reply.body && reply.body.desc ? reply.body.desc : 'Unknown'\n };\n\n if (reply.body.code < 300) {\n return resolve(result);\n } else return reject(result);\n }\n };\n\n var id = _this._bus.postMessage(deepClone(requestMsg), callback, false);\n\n setTimeout(function () {\n // If Reporter does not reply the promise is rejected\n _this._bus.removeResponseListener(requestMsg.from, id);\n\n var result = {\n code: 408,\n desc: 'timout'\n };\n return reject(result);\n }, 3000);\n }\n });\n }\n /**\r\n * This function is used to share the child Object among authorised Hyperties\r\n * @param {boolean} reporter If true the child object is only shared to Parent reporter\r\n * @return {Promise} It returns a promise with the sharing results.\r\n */\n\n }, {\n key: \"store\",\n value: function store() {\n var _this = this;\n\n var child = {};\n var key = _this.metadata.children + '.' + _this.metadata.url;\n child.value = _this.metadata;\n child.identity = _this.identity;\n var msg = {\n from: _this.metadata.reporter,\n to: _this._parentObject._syncher._subURL,\n type: 'create',\n body: {\n resource: _this.metadata.parent,\n attribute: key,\n value: child\n }\n };\n DataObjectChild_log.log('[DataObjectChild.store]:', msg);\n\n _this._bus.postMessage(msg);\n }\n }, {\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this = this; //this is only needed for children reporters\n\n\n if (_this._reporter === _this._owner) {\n _this._listener = _this._bus.addListener(_this._reporter, function (msg) {\n if (msg.type === 'response' && msg.id === _this._msgId) {\n DataObjectChild_log.log('DataObjectChild.onResponse:', msg);\n\n _this._onResponse(msg);\n }\n });\n }\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n if (_this._listener) {\n _this._listener.remove();\n }\n }\n /**\r\n * Release and delete object data\r\n */\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n _this._releaseListeners(); //TODO: send delete message ?\n // nothing to be done\n // return new Promise((resolve) => {\n // log.log('[DataObjectChild.delete]');\n // resolve();\n // });\n\n }\n /**\r\n * All Metadata about the Child Data Object\r\n * @type {Object} -\r\n */\n\n }, {\n key: \"onChange\",\n\n /**\r\n * Register the change listeners sent by the reporter child\r\n * @param {function(event: MsgEvent)} callback\r\n */\n value: function onChange(callback) {\n this._syncObj.observe(function (event) {\n DataObjectChild_log.log('[DataObjectChild - observer] - ', event);\n callback(event);\n });\n }\n /**\r\n * Setup the callback to process response notifications of the creates\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n this._onResponseHandler = callback;\n } //FLOW-IN: message received from a remote DataObject -> _onChildCreate\n\n }, {\n key: \"_onResponse\",\n value: function _onResponse(msg) {\n var _this = this;\n\n var event = {\n type: msg.type,\n url: msg.body.source,\n code: msg.body.code\n };\n\n if (_this._onResponseHandler) {\n _this._onResponseHandler(event);\n }\n }\n }, {\n key: \"shareable\",\n get: function get() {\n var shareable = this.metadata;\n shareable.data = this.data;\n return shareable;\n }\n }, {\n key: \"metadata\",\n get: function get() {\n return this._metadata;\n }\n /**\r\n * Children ID generated on addChildren. Unique identifier\r\n * @type {URL} - URL of the format #\r\n */\n\n }, {\n key: \"childId\",\n get: function get() {\n return this._childId;\n }\n /**\r\n * Data Structure to be synchronized.\r\n * @type {JSON} - JSON structure that should follow the defined schema, if any.\r\n */\n\n }, {\n key: \"sharingStatus\",\n get: function get() {\n return this._sharingStatus;\n }\n /**\r\n * Data Structure to be synchronized.\r\n * @type {JSON} - JSON structure that should follow the defined schema, if any.\r\n */\n\n }, {\n key: \"data\",\n get: function get() {\n return this._syncObj.data;\n }\n /**\r\n * Set for this dataObjectChild an identity\r\n * @method identity\r\n * @param {Identity} identity identity from who created the message\r\n */\n\n }, {\n key: \"identity\",\n set: function set(identity) {\n this._identity = identity;\n }\n /**\r\n * Get for this dataObjectChild an identity\r\n * @method identity\r\n * @return {Identity} identity from who created the message\r\n */\n ,\n get: function get() {\n return this._identity;\n }\n }]);\n\n return DataObjectChild;\n}();\n\n/* harmony default export */ var syncher_DataObjectChild = (DataObjectChild_DataObjectChild);\n// CONCATENATED MODULE: ./src/syncher/HeartBeat.js\nfunction HeartBeat_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HeartBeat_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HeartBeat_createClass(Constructor, protoProps, staticProps) { if (protoProps) HeartBeat_defineProperties(Constructor.prototype, protoProps); if (staticProps) HeartBeat_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/**\r\n * Class to handle Children Data Object Heart beats \r\n * required to manage synchronisation with remote storage servers.\r\n */\n\nvar HeartBeat_HeartBeat =\n/*#__PURE__*/\nfunction () {\n /* private\r\n */\n\n /**\r\n * @ignore\r\n * Should not be used directly by Hyperties. It's called by the DataObject constructor\r\n */\n function HeartBeat(bus, hypertyUrl, runtimeUrl, dataObject) {\n var heartBeatRate = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 60;\n\n HeartBeat_classCallCheck(this, HeartBeat);\n\n var _this = this;\n\n function throwMandatoryParmMissingError(par) {\n throw '[HeartBeat] ' + par + ' mandatory parameter is missing';\n }\n\n bus ? _this._bus = bus : throwMandatoryParmMissingError('bus');\n dataObject ? _this._dataObject = dataObject : throwMandatoryParmMissingError('dataObject');\n heartBeatRate ? _this._heartBeatRate = heartBeatRate : throwMandatoryParmMissingError('heartBeatRate');\n runtimeUrl ? _this._runtimeUrl = runtimeUrl : throwMandatoryParmMissingError('runtimeUrl');\n hypertyUrl ? _this._hypertyUrl = hypertyUrl : throwMandatoryParmMissingError('hypertyUrl');\n this.heartbeat = 0;\n _this._stop = {\n heartBeat: false,\n sync: function sync(bus) {\n var stopSyncMsg = {\n from: hypertyUrl,\n to: runtimeUrl + '/sm',\n type: 'execute',\n body: {\n method: 'stopSync',\n params: [dataObject.url]\n }\n };\n console.log('[Heartbeat.stop.sync()] sending msg:', stopSyncMsg);\n bus.postMessage(stopSyncMsg);\n }\n };\n }\n\n HeartBeat_createClass(HeartBeat, [{\n key: \"start\",\n value: function start(resume) {\n var _this2 = this;\n\n var isReporter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n console.log('[HeartBeat] starting. isReporter: ', isReporter);\n\n if (resume || !isReporter) {\n this._getLastHearBeat().then(function () {\n var isHeartBeatActive = _this2._isHeartBeatActive(_this2.heartBeat, _this2._heartBeatRate * 2);\n\n if (!isHeartBeatActive) {\n console.log('[HeartBeat] heart beats are disabled for ', _this2._dataObject); // Is disabled: lets start observer heart beat and start synching with remote storage server\n\n _this2._stop.heartBeat = _this2._startHeartBeat(_this2._heartBeatRate);\n console.log('[HeartBeat] ', _this2._hypertyUrl, ' started synching with remote storage server');\n\n _this2._startSync();\n } else {\n // heart beat is active, \n // it means the data object is already being synchronised with remote storage server\n // we only need to watch the heart beat and try to replace it in case it fails.\n _this2._watchHeartBeat(_this2._heartBeatRate, true, _this2._onHertbeatStopped);\n }\n });\n } else {\n this._startHeartBeat(this._heartBeatRate);\n\n this._startSync();\n }\n }\n }, {\n key: \"_getLastHearBeat\",\n value: function _getLastHearBeat() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n setTimeout(function () {\n console.log('[HeartBeat._getLastHearBeat] stop waiting ');\n resolve();\n }, _this3._heartBeatRate * 1000 * 1.5);\n });\n }\n }, {\n key: \"stop\",\n value: function stop() {\n if (this._stop.heartBeat) this._stop.heartBeat();\n\n this._stop.sync(this._bus);\n }\n }, {\n key: \"onNewHeartbeat\",\n value: function onNewHeartbeat(heartbeat) {\n this.heartbeat = heartbeat;\n }\n }, {\n key: \"_isHeartBeatActive\",\n value: function _isHeartBeatActive(lastHeartbeat, maxHeartBeatInterval) {\n var lastHeartPeriodInterval = secondsSinceEpoch() - lastHeartbeat;\n console.log('[HeartBeat._isHeartBeatActive] now - lastHeartBeat', lastHeartPeriodInterval);\n console.log('[HeartBeat._isHeartBeatActive] ', !(lastHeartPeriodInterval > maxHeartBeatInterval * 2));\n return !(lastHeartPeriodInterval > maxHeartBeatInterval * 2);\n }\n }, {\n key: \"_startHeartBeat\",\n value: function _startHeartBeat(rate) {\n var _this = this;\n\n var msg = {\n from: _this._hypertyUrl,\n to: _this._dataObject.url + '/children/',\n type: 'create',\n body: {\n resource: 'heartbeat',\n mutual: false,\n value: secondsSinceEpoch()\n }\n };\n console.log('[HeartBeat._startHeartBeat] starting ... ', msg.body.value);\n\n this._bus.postMessage(msg);\n\n this.heartbeat = secondsSinceEpoch();\n var id = setInterval(function () {\n var msg = {\n from: _this._hypertyUrl,\n to: _this._dataObject.url + '/children/',\n type: 'create',\n body: {\n resource: 'heartbeat',\n mutual: false,\n value: secondsSinceEpoch()\n }\n };\n console.log('[HeartBeat] ', msg);\n\n _this._bus.postMessage(msg);\n\n this.heartbeat = secondsSinceEpoch();\n }, rate * 1000); // returns function to stop the heart beat\n\n return function () {\n clearInterval(id);\n };\n }\n }, {\n key: \"_startSync\",\n value: function _startSync() {\n console.log('[HeartBeat._startSync] starting observer sync ', this._dataObject.data);\n var backupRevision = this._dataObject.data.backupRevision;\n console.log('[HeartBeat._startSync] backupRevision ', backupRevision);\n var msg = {\n from: this._hypertyUrl,\n to: this._runtimeUrl + '/sm',\n type: 'execute',\n body: {\n method: 'sync',\n params: [this._dataObject.url, backupRevision]\n }\n };\n console.log('[HeartBeat._startSync] sending msg ', msg);\n\n this._bus.postMessage(msg);\n }\n }, {\n key: \"_watchHeartBeat\",\n value: function _watchHeartBeat(rate, onWatchingIsEnabled, callback) {\n // qdo o heartBeat terminar chama callback \n // usa heartBeat Rating para iniciar timer no respectivo \n // campo do DO chamando isHeartBeatActive()\n var _this = this;\n\n var syncFun = callback;\n console.log('[HeartBeat._watchHeartBeat] started watching ', _this.heartBeat); //let heartBeat = type + 'HeartBeat';\n\n var watcher = setInterval(function () {\n if (onWatchingIsEnabled && !_this._isHeartBeatActive(_this.heartBeat, _this._heartBeatRate)) {\n console.log('[HeartBeat._watchHeartBeat] has stopped ', _this._dataObject.data);\n clearInterval(watcher);\n syncFun(_this);\n } else if (!onWatchingIsEnabled && this._isHeartBeatActive(_this.heartBeat, _this._heartBeatRate)) {\n console.log('[HeartBeat._watchHeartBeat] has changed to disabled ', _this._dataObject.data);\n clearInterval(watcher);\n syncFun();\n }\n }, rate * 1000 * 2);\n }\n }, {\n key: \"_onHertbeatStopped\",\n value: function _onHertbeatStopped(_this) {\n _this._startHeartBeat(_this._heartBeatRate);\n\n _this._startSync();\n }\n }, {\n key: \"heartBeat\",\n get: function get() {\n if (this.heartbeat) return this.heartbeat;else return 0;\n }\n }]);\n\n return HeartBeat;\n}();\n\n/* harmony default export */ var syncher_HeartBeat = (HeartBeat_HeartBeat);\n// CONCATENATED MODULE: ./src/hyperty-resource/HypertyResource.js\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction HypertyResource_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyResource_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyResource_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyResource_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyResource_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* The Hyperty Resource Data Model is used to model resouces handled by Hyperties and Data Objects including chat messages, files, real time human audio and video..\r\n*\r\n*/\n// Log System\n\nvar HypertyResource_log = loglevel[\"getLogger\"]('HypertyResource');\n\n\n\nvar HypertyResource_HypertyResource =\n/*#__PURE__*/\nfunction (_DataObjectChild) {\n _inherits(HypertyResource, _DataObjectChild);\n\n /**\r\n * HypertyResource constructor\r\n *\r\n * @param {URL} localRuntimeURL RuntimeURL of local runtime\r\n * @param {URL} input.owner HypertyURL of the Hyperty handling this resource\r\n * @param {URL} input.runtime Runtime URL where this resource is hosted\r\n * @param {Bus} input.bus sandbox message bus\r\n * @param {DataObject} input.parent Parent Data Object where the HypertyResource is handled as a child\r\n * @param {Boolean} isSender indicates if parent is Reporter or an Observer\r\n * @param {Array} input optional input parameters\r\n */\n function HypertyResource(isSender, input) {\n var _this2;\n\n HypertyResource_classCallCheck(this, HypertyResource);\n\n _this2 = _possibleConstructorReturn(this, _getPrototypeOf(HypertyResource).call(this, input));\n\n var _this = _assertThisInitialized(_assertThisInitialized(_this2));\n\n _this.arraybufferSizeLimit = 5242880; //above this limit content is not saved as ArrayBuffer\n\n _this._isSender = isSender;\n _this._localStorageURL = _this._parentObject._syncher._runtimeUrl + '/storage';\n return _this2;\n }\n\n HypertyResource_createClass(HypertyResource, [{\n key: \"save\",\n\n /*\r\n set parent(parent) {\r\n let _this = this;\r\n _this._parent = parent;\r\n }*/\n value: function save() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var msg = {\n from: _this._owner,\n to: _this._localStorageURL,\n type: 'create',\n body: {\n value: deepClone(_this._metadata)\n }\n };\n\n var callback = function callback(reply) {\n HypertyResource_log.info('[HypertyResource.save] reply: ', reply);\n\n _this._bus.removeResponseListener(_this._owner, reply.id);\n\n if (reply.body.code === 200) {\n if (reply.body.value) {\n if (!_this._metadata.contentURL) _this._metadata.contentURL = [];\n\n _this._metadata.contentURL.push(reply.body.value);\n }\n\n resolve();\n } else reject(reply.body.code + ' ' + reply.body.desc);\n };\n\n msg.body.value.content = _this._content;\n\n _this._bus.postMessage(msg, callback, false);\n });\n }\n /**\r\n * Function to Read HypertyResource\r\n *\r\n * @param {} callback callback to be called with progress information in terms of percentage\r\n * @return {Promise} input optional input parameters\r\n */\n\n }, {\n key: \"read\",\n value: function read(callback) {\n var _this = this;\n\n HypertyResource_log.info('[HypertyResource.read] ', this);\n return new Promise(function (resolve, reject) {\n if (_this.content) {\n resolve(_this);\n } else {\n //TODO: use an iteration to get online runtime storages when some are offline\n var storage = _this._getBestContentURL(_this._metadata.contentURL);\n\n HypertyResource_log.log('Storage:', storage);\n var msg = {\n from: _this._owner,\n to: storage.url,\n type: 'read',\n body: {\n resource: storage.url + '/' + storage.resource,\n p2p: true\n }\n };\n\n if (_this.metadata.p2pRequester && _this.metadata.p2pHandler) {\n msg.body.p2pRequester = _this.metadata.p2pRequester;\n msg.body.p2pHandler = _this.metadata.p2pHandler;\n } // get the resource first on the Local Hyperty Resource Storage;\n\n\n _this._getBestResource(msg, callback).then(function (reply) {\n HypertyResource_log.info('[HypertyResource] - get locally the resource:', reply);\n resolve(_this);\n }).catch(function (reply) {\n HypertyResource_log.warn('[HypertyResource] - get locally the resource fail', reply); // Generate new message to not use the same id of the last one;\n\n var msg = {\n from: _this._owner,\n to: storage.remoteURL,\n type: 'read',\n body: {\n resource: storage.remoteURL + '/' + storage.resource,\n p2p: true\n }\n };\n\n if (_this.metadata.p2pRequester && _this.metadata.p2pHandler) {\n msg.body.p2pRequester = _this.metadata.p2pRequester;\n msg.body.p2pHandler = _this.metadata.p2pHandler;\n } // get the resource on the Remote Hyperty Resource Storage;\n\n\n _this._getBestResource(msg, callback).then(function (reply) {\n HypertyResource_log.warn('[HypertyResource] - get remotely the resource', reply);\n resolve(_this);\n }).catch(function (reply) {\n HypertyResource_log.warn('[HypertyResource] - get remotely the resource fail', reply);\n reject(reply.body.code + ' ' + reply.body.desc);\n });\n });\n }\n });\n }\n }, {\n key: \"_getBestResource\",\n value: function _getBestResource(msg, inProgressCallback) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var waitForResponse = setTimeout(function () {\n // If Reporter does not reply the promise is rejected\n _this._bus.removeResponseListener(_this._owner, id);\n\n msg.body.code = 408;\n msg.body.desc = 'Response timeout';\n return reject(msg);\n }, 3000);\n\n var callback = function callback(reply) {\n HypertyResource_log.log('[HypertyResource.read] reply: ', reply);\n var id = reply.id;\n clearTimeout(waitForResponse);\n\n switch (reply.body.code) {\n case 200:\n _this._content = reply.body.value.content; // save locally if not too big\n\n if (reply.body.value.size < _this.arraybufferSizeLimit) {\n _this.save();\n }\n\n _this._bus.removeResponseListener(_this._owner, id);\n\n resolve(reply);\n break;\n\n case 183:\n inProgressCallback(reply.body.value);\n break;\n\n default:\n _this._bus.removeResponseListener(_this._owner, id);\n\n reject(reply);\n break;\n }\n };\n\n var id = _this._bus.postMessage(msg, callback, false);\n });\n } // Remove Hyperty from the local storage\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n HypertyResource_log.info('[HypertyResource.delete]', _this.metadata);\n var msg = {\n from: _this._owner,\n to: _this._localStorageURL,\n type: 'delete',\n body: {\n resources: _this.metadata.contentURL\n }\n };\n return new Promise(function (resolve) {\n _this._bus.postMessage(msg, function (reply) {\n if (reply.body.code < 300) resolve(true);else resolve(false);\n });\n });\n }\n }, {\n key: \"_getBestContentURL\",\n value: function _getBestContentURL(contentURLList) {\n var _this = this;\n\n var contentURL = contentURLList[0];\n var splitedResource = contentURL.substr(contentURL.lastIndexOf('/') + 1);\n var url = _this._localStorageURL; // contentURL.substr(0, contentURL.lastIndexOf('/'));\n\n var remoteResource = contentURL.substr(0, contentURL.lastIndexOf('/'));\n return {\n url: url,\n resource: splitedResource,\n remoteURL: remoteResource\n };\n }\n }, {\n key: \"resourceType\",\n get: function get() {\n var _this = this;\n\n return _this.metadata.resourceType;\n }\n }, {\n key: \"mimetype\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.type;\n }\n }, {\n key: \"content\",\n get: function get() {\n var _this = this;\n\n return _this._content;\n }\n }, {\n key: \"contentURL\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.contentURL;\n }\n }, {\n key: \"shareable\",\n get: function get() {\n var _this = this;\n\n var shareable = _get(_getPrototypeOf(HypertyResource.prototype), \"metadata\", this);\n\n shareable.resourceType = _this.resourceType;\n return shareable;\n }\n }]);\n\n return HypertyResource;\n}(syncher_DataObjectChild);\n\n/* harmony default export */ var hyperty_resource_HypertyResource = (HypertyResource_HypertyResource);\n// CONCATENATED MODULE: ./src/utils/ImageTools.js\nfunction ImageTools_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ImageTools_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ImageTools_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageTools_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageTools_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar hasBlobConstructor = typeof Blob !== 'undefined' && function () {\n try {\n return Boolean(new Blob());\n } catch (e) {\n return false;\n }\n}();\n\nvar hasArrayBufferViewSupport = hasBlobConstructor && typeof Uint8Array !== 'undefined' && function () {\n try {\n return new Blob([new Uint8Array(100)]).size === 100;\n } catch (e) {\n return false;\n }\n}();\n\nvar hasToBlobSupport = typeof HTMLCanvasElement !== \"undefined\" ? HTMLCanvasElement.prototype.toBlob : false;\nvar hasBlobSupport = hasToBlobSupport || typeof Uint8Array !== 'undefined' && typeof ArrayBuffer !== 'undefined' && typeof atob !== 'undefined';\nvar hasReaderSupport = typeof FileReader !== 'undefined' || typeof URL !== 'undefined';\n\nvar ImageTools =\n/*#__PURE__*/\nfunction () {\n function ImageTools() {\n ImageTools_classCallCheck(this, ImageTools);\n }\n\n ImageTools_createClass(ImageTools, null, [{\n key: \"resize\",\n value: function resize(file, maxDimensions, callback) {\n if (typeof maxDimensions === 'function') {\n callback = maxDimensions;\n maxDimensions = {\n width: 640,\n height: 480\n };\n }\n\n var maxWidth = maxDimensions.width;\n var maxHeight = maxDimensions.height;\n\n if (!ImageTools.isSupported() || !file.type.match(/image.*/)) {\n callback(file, false);\n return false;\n }\n\n if (file.type.match(/image\\/gif/)) {\n // Not attempting, could be an animated gif\n callback(file, false); // TODO: use https://github.com/antimatter15/whammy to convert gif to webm\n\n return false;\n }\n\n var image = document.createElement('img');\n\n image.onload = function (imgEvt) {\n var width = image.width;\n var height = image.height;\n var isTooLarge = false;\n\n if (width >= height && width > maxDimensions.width) {\n // width is the largest dimension, and it's too big.\n height *= maxDimensions.width / width;\n width = maxDimensions.width;\n isTooLarge = true;\n } else if (height > maxDimensions.height) {\n // either width wasn't over-size or height is the largest dimension\n // and the height is over-size\n width *= maxDimensions.height / height;\n height = maxDimensions.height;\n isTooLarge = true;\n }\n\n if (!isTooLarge) {\n // early exit; no need to resize\n callback(file, false);\n return;\n }\n\n var canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n var ctx = canvas.getContext('2d');\n ctx.drawImage(image, 0, 0, width, height);\n\n if (hasToBlobSupport) {\n canvas.toBlob(function (blob) {\n callback(blob, true);\n }, file.type);\n } else {\n var blob = ImageTools._toBlob(canvas, file.type);\n\n callback(blob, true);\n }\n };\n\n ImageTools._loadImage(image, file);\n\n return true;\n }\n }, {\n key: \"_toBlob\",\n value: function _toBlob(canvas, type) {\n var dataURI = canvas.toDataURL(type);\n var dataURIParts = dataURI.split(',');\n var byteString;\n\n if (dataURIParts[0].indexOf('base64') >= 0) {\n // Convert base64 to raw binary data held in a string:\n byteString = atob(dataURIParts[1]);\n } else {\n // Convert base64/URLEncoded data component to raw binary data:\n byteString = decodeURIComponent(dataURIParts[1]);\n }\n\n var arrayBuffer = new ArrayBuffer(byteString.length);\n var intArray = new Uint8Array(arrayBuffer);\n\n for (var i = 0; i < byteString.length; i += 1) {\n intArray[i] = byteString.charCodeAt(i);\n }\n\n var mimeString = dataURIParts[0].split(':')[1].split(';')[0];\n var blob = null;\n\n if (hasBlobConstructor) {\n blob = new Blob([hasArrayBufferViewSupport ? intArray : arrayBuffer], {\n type: mimeString\n });\n } else {\n var bb = new BlobBuilder();\n bb.append(arrayBuffer);\n blob = bb.getBlob(mimeString);\n }\n\n return blob;\n }\n }, {\n key: \"_loadImage\",\n value: function _loadImage(image, file, callback) {\n if (typeof URL === 'undefined') {\n var reader = new FileReader();\n\n reader.onload = function (evt) {\n image.src = evt.target.result;\n\n if (callback) {\n callback();\n }\n };\n\n reader.readAsDataURL(file);\n } else {\n image.src = URL.createObjectURL(file);\n\n if (callback) {\n callback();\n }\n }\n }\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n return typeof HTMLCanvasElement !== 'undefined' && hasBlobSupport && hasReaderSupport;\n }\n }]);\n\n return ImageTools;\n}();\n\n\n// CONCATENATED MODULE: ./src/hyperty-resource/FileHypertyResource.js\nfunction FileHypertyResource_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { FileHypertyResource_typeof = function _typeof(obj) { return typeof obj; }; } else { FileHypertyResource_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return FileHypertyResource_typeof(obj); }\n\nfunction FileHypertyResource_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction FileHypertyResource_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction FileHypertyResource_createClass(Constructor, protoProps, staticProps) { if (protoProps) FileHypertyResource_defineProperties(Constructor.prototype, protoProps); if (staticProps) FileHypertyResource_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction FileHypertyResource_possibleConstructorReturn(self, call) { if (call && (FileHypertyResource_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return FileHypertyResource_assertThisInitialized(self); }\n\nfunction FileHypertyResource_getPrototypeOf(o) { FileHypertyResource_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FileHypertyResource_getPrototypeOf(o); }\n\nfunction FileHypertyResource_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) FileHypertyResource_setPrototypeOf(subClass, superClass); }\n\nfunction FileHypertyResource_setPrototypeOf(o, p) { FileHypertyResource_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FileHypertyResource_setPrototypeOf(o, p); }\n\nfunction FileHypertyResource_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* The Hyperty Resource Data Model is used to model resouces handled by Hyperties and Data Objects including chat messages, files, real time human audio and video..\r\n*\r\n*/\n// Log System\n\nvar FileHypertyResource_log = loglevel[\"getLogger\"]('FileHypertyResource');\n\n\n\n\nvar FileHypertyResource_FileHypertyResource =\n/*#__PURE__*/\nfunction (_HypertyResource) {\n FileHypertyResource_inherits(FileHypertyResource, _HypertyResource);\n\n /**\r\n * FileHypertyResource constructor\r\n *\r\n * @param {URL} owner HypertyURL of the Hyperty handling this resource\r\n * @param {URL} runtime Runtime URL where this resource is hosted\r\n * @param {Bus} bus sandbox message bus\r\n * @param {DataObject} parent Parent Data Object where the HypertyResource is handled as a child\r\n * @param {File} file file to be encoded as HypertyResource\r\n * @param {Boolean} isReporter indicates if parent is Reporter or an Observer\r\n * @param {Array} input optional input parameters\r\n */\n function FileHypertyResource(isSender, input) {\n var _this2;\n\n FileHypertyResource_classCallCheck(this, FileHypertyResource);\n\n _this2 = FileHypertyResource_possibleConstructorReturn(this, FileHypertyResource_getPrototypeOf(FileHypertyResource).call(this, isSender, input));\n\n var _this = FileHypertyResource_assertThisInitialized(FileHypertyResource_assertThisInitialized(_this2));\n\n _this.metadata.resourceType = 'file';\n return _this2;\n }\n\n FileHypertyResource_createClass(FileHypertyResource, [{\n key: \"init\",\n value: function init(file) {\n var _this = this;\n\n if (!file) throw new Error('[FileHypertyResource.constructor] missing mandatory *file* input ');\n return new Promise(function (resolve, reject) {\n _this._metadata.name = file.name;\n _this._metadata.lastModified = file.lastModified;\n _this._metadata.size = file.size;\n _this._metadata.mimetype = file.type;\n FileHypertyResource_log.log('[FileHypertyResource.init] file: ', file);\n\n if (_this._isSender) {\n var mimetype = file.type.split('/')[0];\n\n switch (mimetype) {\n case 'image':\n _this._getImagePreview(file).then(function (preview) {\n _this._metadata.preview = preview;\n _this._content = file;\n resolve();\n });\n\n break;\n\n default:\n _this._content = file;\n resolve();\n break;\n } // if too big lets store as File and asArray Buffer\n // if (file.size > _this.arraybufferSizeLimit) {\n\n /* } else {\r\n let reader = new FileReader();\r\n reader.onload = function(theFile) {\r\n log.log('[FileHypertyResource.init] file loaded ', theFile);\r\n _this._content = theFile.target.result;\r\n resolve();\r\n }\r\n reader.readAsArrayBuffer(file);\r\n }*/\n\n } else {\n _this._content = file.content;\n if (file.preview) _this._metadata.preview = file.preview;\n resolve();\n }\n });\n }\n }, {\n key: \"_getImagePreview\",\n value: function _getImagePreview(image) {\n var reader = new FileReader();\n return new Promise(function (resolve, reject) {\n ImageTools.resize(image, {\n width: 100,\n // maximum width\n height: 100 // maximum height\n\n }, function (blob, didItResize) {\n // didItResize will be true if it managed to resize it, otherwise false (and will return the original file as 'blob')\n if (didItResize) {\n reader.readAsDataURL(blob);\n\n reader.onload = function (theImage) {\n resolve(theImage.target.result);\n };\n } else {\n FileHypertyResource_log.warn('[FileHypertyResource._getImagePreview] unable to create image preview from original image ');\n resolve(undefined);\n }\n });\n });\n }\n }, {\n key: \"toMessage\",\n\n /**\r\n * Share file as a data object child of a data object parent\r\n *\r\n * @param {string} children Data Object Parent children name where the file is shared\r\n */\n\n /* share(children) {\r\n let _this = this;\r\n \r\n return new Promise(function(resolve, reject) {\r\n //to be improved and adapted\r\n \r\n if (!_this._isSender) return reject('[FileHypertyResource.share] Observers can not share files');\r\n \r\n let file2share = _this._metadata;\r\n file2share.type = _this._type;\r\n \r\n _this._parent.addChild(children, file2share).then(function(dataObjectChild) {\r\n log.log('[FileHypertyResource.share] object child: ', dataObjectChild);\r\n \r\n let sharedFile = dataObjectChild.data;\r\n \r\n resolve(sharedFile);\r\n \r\n }).catch(function(reason) {\r\n log.error('Reason:', reason);\r\n reject(reason);\r\n });\r\n \r\n });\r\n \r\n }*/\n\n /**\r\n * Returns file content optimised to be displayed in a message line\r\n *\r\n * @param {string} children Data Object Parent children name where the file is shared\r\n */\n value: function toMessage() {//TODO: to be implemented. It should return HTML with img attribute as a thumbnail plus the name.\n }\n }, {\n key: \"name\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.name;\n }\n }, {\n key: \"preview\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.preview;\n }\n }]);\n\n return FileHypertyResource;\n}(hyperty_resource_HypertyResource);\n\n/* harmony default export */ var hyperty_resource_FileHypertyResource = (FileHypertyResource_FileHypertyResource);\n// CONCATENATED MODULE: ./src/hyperty-resource/HypertyResourceFactory.js\nfunction HypertyResourceFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyResourceFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyResourceFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyResourceFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyResourceFactory_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* The Hyperty Resource Data Model is used to model resouces handled by Hyperties and Data Objects including chat messages, files, real time human audio and video..\r\n*\r\n*/\n\n\nvar HypertyResourceFactory_HypertyResourceFactory =\n/*#__PURE__*/\nfunction () {\n /**\r\n * HypertyResourceFactory constructor\r\n *\r\n */\n function HypertyResourceFactory() {\n HypertyResourceFactory_classCallCheck(this, HypertyResourceFactory);\n }\n\n HypertyResourceFactory_createClass(HypertyResourceFactory, [{\n key: \"createHypertyResource\",\n value: function createHypertyResource(isSender, type, metadata) {\n var newHypertyResource;\n\n switch (type) {\n case 'file':\n newHypertyResource = new hyperty_resource_FileHypertyResource(isSender, metadata);\n break;\n\n default:\n throw new Error('[HypertyResourceFactory.createHypertyResource] not supported type: ', type);\n break;\n }\n\n return newHypertyResource;\n }\n }, {\n key: \"createHypertyResourceWithContent\",\n value: function createHypertyResourceWithContent(isSender, type, content, metadata) {\n var newHypertyResource;\n return new Promise(function (resolve) {\n switch (type) {\n case 'file':\n newHypertyResource = new hyperty_resource_FileHypertyResource(isSender, metadata);\n break;\n\n default:\n reject();\n break;\n }\n\n newHypertyResource.init(content).then(function () {\n return newHypertyResource.save(); // skip save?\n }).then(function () {\n resolve(newHypertyResource);\n });\n });\n }\n }]);\n\n return HypertyResourceFactory;\n}();\n\n/* harmony default export */ var hyperty_resource_HypertyResourceFactory = (HypertyResourceFactory_HypertyResourceFactory);\n// CONCATENATED MODULE: ./src/syncher/DataObject.js\nfunction DataObject_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObject_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObject_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObject_typeof(obj); }\n\nfunction DataObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObject_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar DataObject_log = loglevel[\"getLogger\"]('DataObject');\n\n\n\n\n\n/**\r\n * Main extension class for observers and reporters, with common properties and methods.\r\n * Children management is common for observers and reporters.\r\n */\n\nvar DataObject_DataObject =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _version: number\r\n _owner: HypertyURL\r\n _url: ObjectURL\r\n _schema: Schema\r\n _bus: MiniBus\r\n _status: on | paused\r\n _syncObj: SyncData\r\n _children: { id: DataObjectChild }\r\n _childrenListener: [MsgListener]\r\n ----event handlers----\r\n _onAddChildHandler: (event) => void\r\n */\n\n /**\r\n * @ignore\r\n * Should not be used directly by Hyperties. It's called by the Syncher create or subscribe method's\r\n */\n function DataObject(input) {\n DataObject_classCallCheck(this, DataObject);\n\n var _this = this;\n\n function throwMandatoryParmMissingError(par) {\n throw '[DataObject] ' + par + ' mandatory parameter is missing';\n }\n\n input.syncher ? _this._syncher = input.syncher : throwMandatoryParmMissingError('syncher');\n input.url ? _this._url = input.url : throwMandatoryParmMissingError('url');\n input.created ? _this._created = input.created : throwMandatoryParmMissingError('created');\n input.reporter ? _this._reporter = input.reporter : throwMandatoryParmMissingError('reporter');\n input.runtime ? _this._runtime = input.runtime : throwMandatoryParmMissingError('runtime');\n input.schema ? _this._schema = input.schema : throwMandatoryParmMissingError('schema');\n input.name ? _this._name = input.name : throwMandatoryParmMissingError('name');\n _this._status = input.status;\n\n if (input.data) {\n _this._syncObj = new ProxyObject(input.data);\n } else {\n _this._syncObj = new ProxyObject({});\n }\n\n _this._childrens = input.childrens; //TODO: For Further Study\n\n _this._mutual = input.mutual;\n _this._version = 0;\n _this._childId = 1;\n _this._childrenListener; //bus listener for children\n\n _this._onAddChildrenHandler; //Hyperty side handlers to process child objects created by remote Hyperties\n\n _this._resumed = input.resume;\n\n if (input.resume) {\n _this._version = input.version;\n }\n\n _this._owner = input.syncher._owner;\n _this._bus = input.syncher._bus;\n if (input.description) _this._description = input.description;\n if (input.tags) _this._tags = input.tags;\n if (input.resources) _this._resources = input.resources;\n if (input.observerStorage) _this._observerStorage = input.observerStorage;\n if (input.publicObservation) _this._publicObservation = input.publicObservation;\n _this._metadata = Object.assign(input); // console.log('[DataObject] mutual ', _this._metadata.mutual);\n\n if (!input.hasOwnProperty('resume') || input.hasOwnProperty('resume') && !input.resume) {\n _this._metadata.lastModified = _this._metadata.created;\n }\n\n delete _this._metadata.data;\n delete _this._metadata.syncher;\n delete _this._metadata.authorise;\n _this._hypertyResourceFactory = new hyperty_resource_HypertyResourceFactory();\n _this._childrenObjects = {};\n _this._sharedChilds = []; //childObjects that were not sent yet to Reporters\n\n if (input.backup && _this._childrens) {\n var lastHeartbeat = input.hasOwnProperty('childrenObjects') && input.childrenObjects.hasOwnProperty('heartbeat') ? input.childrenObjects.heartbeat : 0;\n _this._heartBeat = new syncher_HeartBeat(_this._bus, _this._owner, _this._syncher._runtimeUrl, this, 15, lastHeartbeat);\n if (_this._resumed) _this._heartBeat.start(true, _this.metadata.isReporter);else _this._heartBeat.start(false, _this.metadata.isReporter);\n }\n }\n\n DataObject_createClass(DataObject, [{\n key: \"_getLastChildId\",\n value: function _getLastChildId() {\n var _this = this;\n\n var childIdInt = 0;\n var childIdString = _this._owner + '#' + childIdInt;\n Object.keys(_this._childrens).filter(function (key) {\n if (_this._childrens[key].childId > childIdString) {\n childIdString = _this._childrens[key].childId;\n }\n });\n return childIdInt = Number(childIdString.split('#')[1]);\n }\n }, {\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this2 = this;\n\n var _this = this;\n\n var childBaseURL = _this._url + '/children/';\n DataObject_log.log('[Data Object - AllocateListeners] - ', _this._childrens);\n\n if (_this._childrens) {\n // _this._childrens.forEach((child) => {\n var childURL = childBaseURL;\n\n var listener = _this._bus.addListener(childURL, function (msg) {\n //ignore msg sent by himself\n if (msg.from !== _this2._owner) {\n DataObject_log.log('DataObject-Children-RCV: ', msg);\n\n switch (msg.type) {\n case 'create':\n _this._onChildCreate(msg);\n\n break;\n\n case 'delete':\n DataObject_log.log(msg);\n break;\n\n default:\n _this._changeChildren(msg);\n\n break;\n }\n } // });\n\n\n _this._childrenListener = listener;\n });\n }\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n if (_this._childrenListener) {\n _this._childrenListener.remove();\n\n Object.keys(_this._childrenObjects).forEach(function (child) {\n /* if (children === 'resources') {\r\n Object.keys(_this._childrenObjects[children]).forEach((child) => {\r\n _this._childrenObjects[children][child]._releaseListeners();\r\n });\r\n } else {*/\n _this._childrenObjects[child]._releaseListeners(); // }\n\n });\n }\n }\n /**\r\n * Sync Data Object Observer with last version of Data Object Reporter. Useful for Resumes\r\n */\n\n }, {\n key: \"sync\",\n value: function sync() {\n var _this3 = this;\n\n var _this = this;\n\n DataObject_log.info('[DataObject.sync] synchronising ');\n return new Promise(function (resolve, reject) {\n var criteria = {};\n if (_this3.metadata.backupRevision) criteria.backupRevision = _this3.metadata.backupRevision;\n\n _this._syncher.read(_this._metadata.url, criteria).then(function (value) {\n DataObject_log.info('[DataObject.sync] value to sync: ', value);\n Object.assign(_this.data, deepClone(value.data));\n _this._version = value.version;\n _this._metadata.lastModified = value.lastModified; //TODO: check first if there are new childrenObjects to avoid overhead\n\n if (value.childrenObjects) {\n _this.resumeChildrens(value.childrenObjects);\n\n _this._storeChildrens();\n\n resolve(true);\n } else resolve(true);\n /*if (value.version != _this._version) {\r\n log.info('[DataObject.sync] updating existing data: ', _this.data);\r\n Object.assign(_this.data || {}, deepClone(value.data));\r\n _this._metadata = deepClone(value);\r\n delete _this._metadata.data;\r\n _this._version = value.version;\r\n } else {\r\n log.info('[DataObject.sync] existing data is updated: ', value);\r\n }*/\n\n }).catch(function (reason) {\n DataObject_log.info('[DataObject.sync] sync failed: ', reason);\n resolve(false);\n });\n });\n }\n /**\r\n *\r\n */\n\n }, {\n key: \"resumeChildrens\",\n value: function resumeChildrens(childrens) {\n var _this4 = this;\n\n var _this = this;\n\n var childIdString = this._owner.split('/')[3] + '#' + this._childId; //setup childrens data from subscription\n // Object.keys(childrens).forEach((childrenResource) => {\n // let children = childrens[childrenResource];\n\n\n var children = childrens; //_this._childrenObjects[childrenResource] = {};\n\n Object.keys(children).forEach(function (childId) {\n var newChild = false;\n /* if (!_this._childrenObjects.hasOwnProperty(childrenResource))\r\n _this._childrenObjects[childrenResource] = {};*/\n // check if it is the last heartbeat\n\n if (childId === 'heartbeat') {// _this._heartBeat.onNewHeartbeat(children[childId].value);\n // _this._heartBeat.start(true);\n } else if (children[childId].hasOwnProperty('value') && children[childId].value.resourceType && !_this._childrenObjects.hasOwnProperty(childId)) {\n _this._childrenObjects[childId] = _this._resumeHypertyResource(children[childId]);\n newChild = true;\n } else if (!_this._childrenObjects.hasOwnProperty(childId)) {\n _this._childrenObjects[childId] = _this._resumeChild(children[childId]);\n DataObject_log.log('[DataObject.resumeChildrens] new DataObjectChild: ', _this._childrenObjects[childId]);\n newChild = true;\n }\n\n if (newChild && childId > childIdString) {\n childIdString = childId;\n DataObject_log.log('[DataObjectReporter.resumeChildrens] - resuming: ', _this4._childrenObjects[childId]);\n }\n }); // });\n\n this._childId = Number(childIdString.split('#')[1]);\n }\n }, {\n key: \"_resumeChild\",\n value: function _resumeChild(input) {\n var _this = this;\n\n var childInput = input.value;\n childInput.parentObject = _this;\n childInput.parent = _this._url;\n var child = new syncher_DataObjectChild(childInput);\n child.identity = input.identity;\n var event = {\n type: 'create',\n from: child.reporter,\n url: child.parent,\n value: child.data,\n childId: child.url,\n identity: child.identity,\n child: child\n };\n\n if (child.resourceType) {\n event.resource = child;\n }\n\n if (_this._onAddChildrenHandler) _this._onAddChildrenHandler(event);\n return child;\n }\n }, {\n key: \"_resumeHypertyResource\",\n value: function _resumeHypertyResource(input) {\n var _this = this;\n\n var childInput = input.value;\n childInput.parentObject = _this;\n childInput.parent = _this._url;\n\n var hypertyResource = _this._hypertyResourceFactory.createHypertyResource(false, childInput.resourceType, childInput);\n\n hypertyResource.identity = input.identity;\n var event = {\n type: 'create',\n from: hypertyResource.reporter,\n url: hypertyResource.parent,\n value: hypertyResource.data,\n childId: hypertyResource.url,\n identity: hypertyResource.identity,\n child: hypertyResource\n };\n\n if (hypertyResource.resourceType) {\n event.resource = hypertyResource;\n }\n\n if (_this._onAddChildrenHandler) _this._onAddChildrenHandler(event);\n return hypertyResource;\n }\n /**\r\n * All Metadata about the Data Object\r\n * @type {Object} -\r\n */\n\n }, {\n key: \"pause\",\n\n /**\r\n * @ignore\r\n */\n value: function pause() {\n //TODO: this feature needs more analise\n throw 'Not implemented';\n }\n /**\r\n * @ignore\r\n */\n\n }, {\n key: \"resume\",\n value: function resume() {\n //TODO: this feature needs more analise\n throw 'Not implemented';\n }\n /**\r\n * @ignore\r\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n //TODO: should remove the subscription and send message unsubscribe?\n throw 'Not implemented';\n }\n /**\r\n * Create and add a DataObjectChild to a children collection.\r\n * @param {JSON} initialData - Initial data of the child\r\n * @param {MessageBodyIdentity} identity - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\r\n * @param {SyncChildMetadata} input - (optional) All additional metadata about the DataObjectChild.\r\n * @return {Promise} - Return Promise to a new DataObjectChild.\r\n */\n\n }, {\n key: \"addChild\",\n value: function addChild(initialData, identity, input) {\n var _this = this;\n\n var newChild; //returns promise, in the future, the API may change to asynchronous call\n\n return new Promise(function (resolve) {\n var msgChildPath = _this._url + '/children/';\n\n var childInput = _this._getChildInput(input);\n\n childInput.data = initialData; // childInput.children = children;\n\n newChild = new syncher_DataObjectChild(childInput);\n if (identity) newChild.identity = identity;\n newChild.share();\n console.log('[DataObject.addChild] added ', newChild);\n newChild.onChange(function (event) {\n _this._onChange(event, {\n path: msgChildPath,\n childId: childInput.url\n });\n }); // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[childInput.url] = newChild;\n resolve(newChild);\n });\n }\n }, {\n key: \"_deleteChildrens\",\n value: function _deleteChildrens() {\n var _this = this;\n\n var deletePromises = [];\n return new Promise(function (resolve) {\n if (_this.childrens) {\n DataObject_log.log('[DataObject.deleteChildrens]', _this.childrens);\n var child;\n\n for (child in _this.childrens) {\n // let child;\n\n /* if (children === 'resources') {\r\n for (child in _this.childrens[children]) {\r\n let childObj = _this.childrens[children][child];\r\n log.log('[DataObject._deleteChildrens] child',childObj);\r\n if (childObj.metadata.hasOwnProperty('resourceType'))\r\n deletePromises.push(_this.childrens[children][child].delete());\r\n }\r\n } else {*/\n var childObj = _this.childrens[child];\n DataObject_log.log('[DataObject._deleteChildrens] child', childObj);\n if (childObj.metadata.hasOwnProperty('resourceType')) deletePromises.push(_this.childrens[child].delete());\n } // }\n\n\n DataObject_log.log('[DataObject._deleteChildrens] promises ', deletePromises);\n\n if (deletePromises.length > 0) {\n Promise.all(deletePromises).then(function () {\n resolve('[DataObject._deleteChildrens] done');\n });\n } else resolve('[DataObject._deleteChildrens] nothing to delete');\n }\n });\n }\n }, {\n key: \"_getChildInput\",\n value: function _getChildInput(input) {\n var _this = this;\n\n var childInput = Object.assign({}, input);\n _this._childId++; //removing domain from childId to avoid backup issues with '.'\n\n childInput.url = _this._owner.split('/')[3] + '#' + _this._childId;\n childInput.parentObject = _this;\n childInput.reporter = _this._owner;\n childInput.created = new Date().toISOString();\n childInput.runtime = _this._syncher._runtimeUrl;\n childInput.p2pHandler = _this._syncher._p2pHandler;\n childInput.p2pRequester = _this._syncher._p2pRequester;\n childInput.schema = _this._schema;\n childInput.parent = _this.url;\n childInput.mutual = _this.metadata.mutual; // console.log('[DataObject._getChildInput] mutual ', childInput.mutual);\n\n return childInput;\n }\n }, {\n key: \"addHypertyResource\",\n value: function addHypertyResource(type, resource, identity, input) {\n var _this = this; //returns promise, in the future, the API may change to asynchronous call\n\n\n return new Promise(function (resolve) {\n var hypertyResource;\n var msgChildPath = _this._url + '/children/';\n\n var childInput = _this._getChildInput(input); // childInput.children = children;\n\n\n _this._hypertyResourceFactory.createHypertyResourceWithContent(true, type, resource, childInput).then(function (resource) {\n hypertyResource = resource;\n if (identity) hypertyResource.identity = identity;\n hypertyResource.share();\n DataObject_log.log('[DataObject.addHypertyResource] added ', hypertyResource);\n hypertyResource.onChange(function (event) {\n _this._onChange(event, {\n path: msgChildPath,\n childId: hypertyResource.childId\n });\n }); // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[hypertyResource.childId] = hypertyResource;\n resolve(hypertyResource);\n });\n });\n }\n /**\r\n * Setup the callback to process create and delete of childrens.\r\n * @param {function(event: MsgEvent)} callback\r\n * TODO: add childrenId to support different handlers per children\r\n */\n\n }, {\n key: \"onAddChild\",\n value: function onAddChild(callback) {\n this._onAddChildrenHandler = callback;\n } //FLOW-IN: message received from a remote DataObject -> addChild\n\n }, {\n key: \"_onChildCreate\",\n value: function _onChildCreate(msg) {\n var _this = this; // console.log('[DataObject._onChildCreate] receivedBy ' + _this._owner + ' : ', msg);\n // if this is an heartbeat msg foward it to heatbeat handler\n\n\n if (msg.body.resource === 'heartbeat') {\n console.log('[DataObject._onChildCreate] new heartbeat received ' + msg.body.value);\n\n this._heartBeat.onNewHeartbeat(msg.body.value);\n } else {\n console.log('[DataObject._onChildCreate] new child receivedBy ' + _this._owner + ' : ', msg);\n var response = {\n from: msg.to,\n to: msg.from,\n type: 'response',\n id: msg.id,\n body: {\n code: 100\n }\n };\n\n _this._bus.postMessage(response);\n\n if (msg.body.value.resourceType) {\n _this._onHypertyResourceAdded(msg);\n } else _this._onChildAdded(msg);\n }\n }\n }, {\n key: \"_onChildAdded\",\n value: function _onChildAdded(msg) {\n var _this = this;\n\n var childInput = deepClone(msg.body.value);\n childInput.parentObject = _this; // let children = childInput.children;\n\n var newChild = new syncher_DataObjectChild(childInput);\n newChild.identity = msg.body.identity; // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[childInput.url] = newChild;\n if (msg.to === _this.metadata.url) newChild.store();\n\n _this._hypertyEvt(msg, newChild);\n }\n }, {\n key: \"_onHypertyResourceAdded\",\n value: function _onHypertyResourceAdded(msg) {\n var _this = this;\n\n var input = msg.body.value;\n var hypertyResource; // let children = input.children;\n\n input.parentObject = _this;\n hypertyResource = _this._hypertyResourceFactory.createHypertyResource(false, input.resourceType, input);\n hypertyResource.identity = msg.body.identity; // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[hypertyResource.childId] = hypertyResource;\n\n _this._hypertyEvt(msg, hypertyResource); // locally store messages that are directly sent to the hyperty\n // ie to sync with messages sent when offline\n\n\n if (msg.to === _this.metadata.url) hypertyResource.store();\n }\n }, {\n key: \"_hypertyEvt\",\n value: function _hypertyEvt(msg, child) {\n var _this = this;\n\n var event = {\n type: msg.type,\n from: msg.from,\n url: msg.to,\n value: child.data,\n childId: child.url,\n identity: msg.body.identity,\n child: child\n };\n\n if (child.resourceType) {\n event.resource = child;\n }\n\n if (_this._onAddChildrenHandler) _this._onAddChildrenHandler(event);\n } //send delta messages to subscriptions\n\n }, {\n key: \"_onChange\",\n value: function _onChange(event, childInfo) {\n var _this = this;\n\n _this._metadata.lastModified = new Date().toISOString();\n _this._version++;\n\n if (_this._status === 'live') {\n //FLOW-OUT: this message will be sent directly to a resource changes address: MessageBus\n var changeMsg = {\n type: 'update',\n from: _this._url,\n to: _this._url + '/changes',\n body: {\n version: _this._version,\n source: _this._owner,\n attribute: event.field,\n lastModified: _this._metadata.lastModified\n }\n };\n DataObject_log.log('[DataObject - _onChange] - ', event, childInfo, changeMsg);\n\n if (event.oType === ObjectType.OBJECT) {\n if (event.cType !== ChangeType.REMOVE) {\n changeMsg.body.value = deepClone(event.data);\n }\n } else {\n changeMsg.body.attributeType = event.oType;\n changeMsg.body.value = event.data;\n\n if (event.cType !== ChangeType.UPDATE) {\n changeMsg.body.operation = event.cType;\n }\n } //childInfo must have (path, childId)\n\n\n if (childInfo) {\n changeMsg.to = childInfo.path;\n changeMsg.body.resource = childInfo.childId;\n } //TODO: For Further Study\n\n\n if (!_this.data._mutual) changeMsg.body.mutual = _this._mutual;\n\n _this._bus.postMessage(changeMsg);\n }\n } //FLOW-IN: delta message received from a remote DataObjectReporter or DataObjectChild when changing data\n\n }, {\n key: \"_changeObject\",\n value: function _changeObject(syncObj, msg) {\n var _this = this; //TODO: update version ?\n //how to handle an incorrect version ? Example: receive a version 3 when the observer is in version 1, where is the version 2 ?\n //will we need to confirm the reception ?\n\n\n if (_this._version + 1 <= msg.body.version) {\n _this._version = msg.body.version;\n var path = msg.body.attribute;\n var value;\n if (DataObject_typeof(msg.body.value) === 'object') value = deepClone(msg.body.value);else value = msg.body.value;\n var findResult = syncObj.findBefore(path);\n\n if (msg.body.lastModified) {\n _this._metadata.lastModified = msg.body.lastModified;\n } else {\n _this._metadata.lastModified = new Date().toISOString();\n }\n\n if (msg.body.attributeType === ObjectType.ARRAY) {\n if (msg.body.operation === ChangeType.ADD) {\n var arr = findResult.obj;\n var index = findResult.last;\n Array.prototype.splice.apply(arr, [index, 0].concat(value));\n } else if (msg.body.operation === ChangeType.REMOVE) {\n var _arr = findResult.obj;\n var _index = findResult.last;\n\n _arr.splice(_index, value);\n } else {\n findResult.obj[findResult.last] = value; // UPDATE\n }\n } else {\n if (msg.body.hasOwnProperty('value')) {\n findResult.obj[findResult.last] = value; // UPDATE or ADD\n } else {\n delete findResult.obj[findResult.last]; // REMOVE\n }\n }\n } else {\n //TODO: how to handle unsynchronized versions?\n DataObject_log.log('UNSYNCHRONIZED VERSION: (data => ' + _this._version + ', msg => ' + msg.body.version + ')');\n }\n } //FLOW-IN: message received from a remote DataObjectChild when changing data\n\n }, {\n key: \"_changeChildren\",\n value: function _changeChildren(msg) {\n var _this = this;\n\n var dividedURL = divideURL(msg.to);\n var identity = dividedURL.identity; // const resource = identity ? identity.substring(identity.lastIndexOf('/') + 1) : undefined;\n\n var childId = msg.body.resource;\n var children = _this._childrenObjects[childId];\n DataObject_log.log('Change children: ', _this._owner, msg, resource);\n\n if (children) {\n _this._changeObject(children._syncObj, msg);\n } else {\n DataObject_log.warn('No children found for: ', childId);\n }\n }\n }, {\n key: \"metadata\",\n get: function get() {\n return this._metadata;\n }\n /**\r\n * Object URL of reporter or observer\r\n * @type {ObjectURL}\r\n */\n\n }, {\n key: \"url\",\n get: function get() {\n return this._url;\n }\n /**\r\n * Object schema URL (this field is not yet stable, and is subsject to change)\r\n * @type {SchemaURL}\r\n */\n\n }, {\n key: \"schema\",\n get: function get() {\n return this._schema;\n }\n /**\r\n * Status of the reporter or observer connection (this field is not yet stable, and is subsject to change)\r\n * @type {Status} - Enum of: on | paused\r\n */\n\n }, {\n key: \"status\",\n get: function get() {\n return this._status;\n }\n /**\r\n * Data structure to be synchronized.\r\n * @type {JSON} - JSON structure that should follow the defined schema, if any.\r\n */\n\n }, {\n key: \"data\",\n get: function get() {\n return this._syncObj.data;\n }\n /**\r\n * All created children's since the subscription, doesn't contain all children's since reporter creation.\r\n * @type {Object}\r\n */\n\n }, {\n key: \"childrens\",\n get: function get() {\n return this._childrenObjects;\n }\n }]);\n\n return DataObject;\n}();\n\n/* harmony default export */ var syncher_DataObject = (DataObject_DataObject);\n// CONCATENATED MODULE: ./src/syncher/DataObjectReporter.js\nfunction DataObjectReporter_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObjectReporter_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectReporter_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObjectReporter_typeof(obj); }\n\nfunction DataObjectReporter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectReporter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectReporter_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectReporter_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectReporter_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction DataObjectReporter_possibleConstructorReturn(self, call) { if (call && (DataObjectReporter_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return DataObjectReporter_assertThisInitialized(self); }\n\nfunction DataObjectReporter_get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { DataObjectReporter_get = Reflect.get; } else { DataObjectReporter_get = function _get(target, property, receiver) { var base = DataObjectReporter_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return DataObjectReporter_get(target, property, receiver || target); }\n\nfunction DataObjectReporter_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DataObjectReporter_getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction DataObjectReporter_getPrototypeOf(o) { DataObjectReporter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataObjectReporter_getPrototypeOf(o); }\n\nfunction DataObjectReporter_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DataObjectReporter_setPrototypeOf(subClass, superClass); }\n\nfunction DataObjectReporter_setPrototypeOf(o, p) { DataObjectReporter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataObjectReporter_setPrototypeOf(o, p); }\n\nfunction DataObjectReporter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar DataObjectReporter_log = loglevel[\"getLogger\"]('DataObjectReporter');\n\n\n/**\r\n * The class returned from the Syncher create call.\r\n * To be used as a reporter point, changes will be submited to DataObjectObserver instances.\r\n */\n\nvar DataObjectReporter_DataObjectReporter =\n/*#__PURE__*/\nfunction (_DataObject) {\n DataObjectReporter_inherits(DataObjectReporter, _DataObject);\n\n /* private\r\n _subscriptions: \r\n ----event handlers----\r\n _onSubscriptionHandler: (event) => void\r\n _onResponseHandler: (event) => void\r\n _onReadHandler: (event) => void\r\n */\n\n /**\r\n * @ignore\r\n * Should not be used directly by Hyperties. It's called by the Syncher.create method\r\n */\n //constructor(syncher, url, created, reporter, runtime, schema, name, initialStatus, initialData, childrens, mutual = true, resumed = false, description, tags, resources, observerStorage, publicObservation) {\n function DataObjectReporter(input) {\n var _this2;\n\n DataObjectReporter_classCallCheck(this, DataObjectReporter);\n\n _this2 = DataObjectReporter_possibleConstructorReturn(this, DataObjectReporter_getPrototypeOf(DataObjectReporter).call(this, input));\n\n var _this = DataObjectReporter_assertThisInitialized(DataObjectReporter_assertThisInitialized(_this2));\n\n _this._subscriptions = {};\n\n _this._syncObj.observe(function (event) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] ' + _this.url + ' publish change: ', event);\n\n _this._onChange(event);\n });\n\n _this._allocateListeners();\n\n _this.invitations = []; // array of promises with pending invitations\n\n _this._childrenSizeThreshold = 50000; // to be used when replying to sync requests to ensure each response msg is not too large\n\n return _this2;\n }\n\n DataObjectReporter_createClass(DataObjectReporter, [{\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n DataObjectReporter_get(DataObjectReporter_getPrototypeOf(DataObjectReporter.prototype), \"_allocateListeners\", this).call(this);\n\n var _this = this;\n\n _this._objectListener = _this._bus.addListener(_this._url, function (msg) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] listener ' + _this._url + ' Received: ', msg);\n\n switch (msg.type) {\n case 'response':\n _this._onResponse(msg);\n\n break;\n\n case 'read':\n _this._onRead(msg);\n\n break;\n\n case 'execute':\n _this._onExecute(msg);\n\n break;\n\n case 'create':\n _this._onChildCreate(msg);\n\n break;\n // to create child objects that were sent whenn offline\n }\n });\n _this._runtimeStatusListener = _this._bus.addListener(_this._syncher._runtimeUrl + '/status', function (evt) {\n console.log('[Syncher.DataObjectReporter] runtime status event received ' + evt);\n\n if (evt.body && evt.body.resource && evt.body.resource === _this._url && evt.body.value && evt.body.value.backupRevision) {\n // broadcast backupRevision update\n _this.data.backupRevision = evt.body.value.backupRevision;\n console.log('[Syncher.DataObjectReporter] DO updated with backup revision ' + _this.data.backupRevision);\n }\n });\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n DataObjectReporter_get(DataObjectReporter_getPrototypeOf(DataObjectReporter.prototype), \"_releaseListeners\", this).call(this);\n\n var _this = this;\n\n _this._objectListener.remove();\n }\n /**\r\n * Send invitations (create messages) to hyperties, observers list.\r\n * @param {HypertyURL[]} observers List of Hyperty URL's\r\n */\n\n }, {\n key: \"inviteObservers\",\n value: function inviteObservers(observers, p2p) {\n var _this = this; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onCreate\n // TODO: remove value and add resources? should similar to 1st create\n\n\n var toInvite = observers; // let invitePromises = [];\n\n /* observers.forEach((observer)=> {\r\n if (!_this.invitations[observer]) {\r\n toInvite.push(observer);\r\n _this.invitations[observer] = observer;\r\n }\r\n });*/\n\n if (toInvite.length > 0) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] InviteObservers ', toInvite, _this._metadata);\n toInvite.forEach(function (observer) {\n var invitation = new Promise(function (resolve, reject) {\n var inviteMsg = {\n type: 'create',\n from: _this._syncher._owner,\n to: _this._syncher._subURL,\n body: {\n resume: false,\n resource: _this._url,\n schema: _this._schema,\n value: _this._metadata,\n authorise: [observer]\n }\n };\n if (p2p) inviteMsg.body.p2p = p2p;\n if (!_this.data.mutual) inviteMsg.body.mutual = _this.data.mutual;\n\n _this._bus.postMessage(inviteMsg, function (reply) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] Invitation reply ', reply);\n var result = {\n invited: observer,\n code: reply.body && reply.body.code ? reply.body.code : 500,\n desc: reply.body && reply.body.desc ? reply.body.desc : 'Unknown'\n };\n if (result.code < 300) resolve(result);\n /* else if (result.code >= 300) {\r\n if (_this.metadata.offline) {\r\n resolve(_this._processOfflineInvitation(inviteMsg));\r\n }*/\n else reject(result); // } \n });\n });\n\n _this.invitations.push(invitation);\n }); // return(invitePromises);\n }\n }\n /**\r\n * Release and delete object data\r\n */\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n if (_this._heartBeat) _this._heartBeat.stop();\n\n _this._deleteChildrens().then(function (result) {\n DataObjectReporter_log.log(result); //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onDelete\n\n var deleteMsg = {\n type: 'delete',\n from: _this._owner,\n to: _this._syncher._subURL,\n body: {\n resource: _this._url\n }\n };\n\n _this._bus.postMessage(deleteMsg, function (reply) {\n DataObjectReporter_log.log('DataObjectReporter-DELETE: ', reply);\n\n if (reply.body.code === 200) {\n _this._releaseListeners();\n\n delete _this._syncher._reporters[_this._url]; //_this._syncObj.unobserve();\n\n _this._syncObj = {};\n }\n });\n });\n }\n /**\r\n * Subscriptions requested and accepted to this reporter\r\n * @type {Object}\r\n */\n\n }, {\n key: \"onSubscription\",\n\n /**\r\n * Setup the callback to process subscribe and unsubscribe notifications\r\n * @param {function(event: MsgEvent)} callback function to receive events\r\n */\n value: function onSubscription(callback) {\n this._onSubscriptionHandler = callback;\n }\n /**\r\n * Setup the callback to process response notifications of the create's\r\n * @param {function(event: MsgEvent)} callback function to receive events\r\n */\n\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n this._onResponseHandler = callback;\n }\n /**\r\n * Setup the callback to process read notifications\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onRead\",\n value: function onRead(callback) {\n this._onReadHandler = callback;\n }\n /**\r\n * Setup the callback to process execute notifications\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onExecute\",\n value: function onExecute(callback) {\n this._onExecuteHandler = callback;\n } //FLOW-IN: message received from parent Syncher -> _onForward\n\n }, {\n key: \"_onForward\",\n value: function _onForward(msg) {\n var _this = this;\n\n DataObjectReporter_log.log('DataObjectReporter-RCV: ', msg);\n\n switch (msg.body.type) {\n case 'subscribe':\n _this._onSubscribe(msg);\n\n break;\n\n case 'unsubscribe':\n _this._onUnSubscribe(msg);\n\n break;\n }\n } //FLOW-IN: message received from this -> _onForward: emitted by a remote Syncher -> subscribe\n\n }, {\n key: \"_onSubscribe\",\n value: function _onSubscribe(msg) {\n var _this = this;\n\n var hypertyUrl = msg.body.from;\n var dividedURL = divideURL(hypertyUrl);\n var domain = dividedURL.domain;\n var mutual = true;\n if (msg.body.hasOwnProperty('mutual') && !msg.body.mutual) mutual = false;\n console.log('[DataObjectReporter._onSubscribe]', msg, domain, dividedURL);\n var event = {\n type: msg.body.type,\n url: hypertyUrl,\n domain: domain,\n identity: msg.body.identity,\n nutual: mutual,\n accept: function accept() {\n //create new subscription\n var sub = {\n url: hypertyUrl,\n status: 'live'\n };\n _this._subscriptions[hypertyUrl] = sub;\n\n if (_this.metadata.subscriptions) {\n _this.metadata.subscriptions.push(sub.url);\n }\n\n var msgValue = deepClone(_this._metadata);\n msgValue.data = deepClone(_this.data);\n msgValue.version = _this._version; //process and send childrens data\n // let childrenValues = {};\n //\n // if (_this._childrenObjects) {\n // Object.keys(_this._childrenObjects).forEach((childrenId) => {\n // let childrenData = _this._childrenObjects[childrenId];\n // childrenValues[childrenId] = deepClone(childrenData);\n // });\n // msgValue.childrenObjects = childrenValues;\n // }\n\n var sendMsg = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n schema: _this._schema,\n value: msgValue\n }\n }; //TODO: For Further Study\n\n if (msg.body.hasOwnProperty('mutual') && !msg.body.mutual) {\n sendMsg.body.mutual = msg.body.mutual; // TODO: remove?\n\n _this.data.mutual = false;\n }\n\n if (_this._heartBeat) {\n sendMsg.body.value.childrenObjects = {};\n sendMsg.body.value.childrenObjects.heartbeat = _this._heartBeat.heartbeat;\n }\n\n console.log('[DataObjectReporter._onSubscribe.accept] sending response: ', sendMsg); //send ok response message\n\n _this._bus.postMessage(sendMsg);\n\n return sub;\n },\n reject: function reject(reason) {\n //send reject response message\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 403,\n desc: reason\n }\n });\n }\n };\n\n if (_this._onSubscriptionHandler) {\n DataObjectReporter_log.log('SUBSCRIPTION-EVENT: ', event);\n\n _this._onSubscriptionHandler(event);\n }\n } //FLOW-IN: message received from this -> _onForward: emitted by a remote DataObjectObserver -> unsubscribe\n\n }, {\n key: \"_onUnSubscribe\",\n value: function _onUnSubscribe(msg) {\n var _this = this;\n\n var hypertyUrl = msg.body.from;\n var dividedURL = divideURL(hypertyUrl);\n var domain = dividedURL.domain;\n DataObjectReporter_log.log('[DataObjectReporter._onUnSubscribe]', msg, domain, dividedURL); //let sub = _this._subscriptions[hypertyUrl];\n\n delete _this._subscriptions[hypertyUrl];\n delete _this.invitations[hypertyUrl];\n var event = {\n type: msg.body.type,\n url: hypertyUrl,\n domain: domain,\n identity: msg.body.identity\n }; // TODO: check if the _onSubscriptionHandler it is the same of the subscriptions???\n\n if (_this._onSubscriptionHandler) {\n DataObjectReporter_log.log('UN-SUBSCRIPTION-EVENT: ', event);\n\n _this._onSubscriptionHandler(event);\n }\n } //FLOW-IN: message received from ReporterURL address: emited by a remote Syncher -> _onRemoteCreate -> event.ack\n\n }, {\n key: \"_onResponse\",\n value: function _onResponse(msg) {\n var _this = this;\n\n var event = {\n type: msg.type,\n url: msg.from,\n code: msg.body.code\n };\n\n if (_this._onResponseHandler) {\n DataObjectReporter_log.log('RESPONSE-EVENT: ', event);\n\n _this._onResponseHandler(event);\n }\n } //FLOW-IN: message received from ReporterURL address: emited by a remote Syncher -> read\n\n }, {\n key: \"_onRead\",\n value: function _onRead(msg) {\n var _this = this;\n\n var childrensSize = JSON.stringify(_this.childrensJSON).length;\n var largeObject = childrensSize > _this._childrenSizeThreshold ? true : false;\n var event = {\n type: msg.type,\n url: msg.from,\n accept: function accept() {\n if (largeObject) _this._syncReplyForLargeData(msg);else _this._syncReply(msg);\n },\n reject: function reject(reason) {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 401,\n desc: reason\n }\n });\n }\n }; // if the requester is an authorised observer, the data object is responded otherwise an event is triggered\n\n var subscriptions = [];\n\n if (_this.metadata.subscriptions) {\n subscriptions = _this.metadata.subscriptions;\n } else if (_this._subscriptions) {\n subscriptions = Object.keys(_this._subscriptions).map(function (key) {\n return _this._subscriptions[key].url;\n });\n }\n\n if (subscriptions.indexOf(msg.from) != -1) {\n if (largeObject) _this._syncReplyForLargeData(msg);else _this._syncReply(msg);\n } else if (_this._onReadHandler) {\n DataObjectReporter_log.log('READ-EVENT: ', event);\n\n _this._onReadHandler(event);\n }\n }\n }, {\n key: \"_syncReply\",\n value: function _syncReply(msg) {\n var _this = this;\n\n var objectValue = deepClone(_this.metadata);\n objectValue.data = deepClone(_this.data);\n objectValue.childrenObjects = deepClone(_this.childrensJSON);\n objectValue.version = _this._version;\n var response = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n value: objectValue\n }\n };\n\n _this._bus.postMessage(response);\n } // This function is only used if the data object to be synched has childrenOjects too large\n\n }, {\n key: \"_syncReplyForLargeData\",\n value: function _syncReplyForLargeData(msg) {\n //set attribute with number of spllited messages\n var _this = this; // lets set the initial message with no childObjects\n\n\n var objectValue = deepClone(_this.metadata);\n objectValue.data = deepClone(_this.data);\n objectValue.version = _this._version;\n delete objectValue.childrenObjects;\n var children;\n var values = []; // array of values to be sent in separated responses\n\n var childrenValue = {}; // value to be used in each response\n\n for (child in _this._childrenObjects) {\n // let child;\n childrenValue[child] = {}; // for (child in _this._childrenObjects[children]) {\n\n if (JSON.stringify(childrenValue).length > _this._childrenSizeThreshold) {\n //childrenValue big enough to be sent in a response message\n values.push(childrenValue); // childrenValue = {};\n // childrenValue[child] = {};\n }\n\n childrenValue[child] = {};\n childrenValue[child].value = _this._childrenObjects[child].metadata;\n childrenValue[child].identity = _this._childrenObjects[child].identity; // }\n }\n\n values.push(childrenValue);\n objectValue.responses = values.length + 1; //number of responses to be sent\n\n var initialResponse = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 100,\n value: objectValue\n }\n };\n\n _this._bus.postMessage(initialResponse);\n\n values.forEach(function (value) {\n var response = deepClone(initialResponse);\n response.body.value = value;\n response.body.value.responses = objectValue.responses;\n setTimeout(function () {\n _this._bus.postMessage(response);\n }, 50); // should put a timeout?\n });\n } // Execute request received\n\n }, {\n key: \"_onExecute\",\n value: function _onExecute(msg) {\n var _this = this;\n\n if (!msg.body.method) throw '[DataObjectReporter._onExecute] method missing ', msg;\n var response = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n };\n var event = {\n type: msg.type,\n url: msg.from,\n method: msg.body.method,\n params: msg.body.params,\n accept: function accept() {\n _this._bus.postMessage(response);\n },\n reject: function reject(reason) {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 401,\n desc: reason\n }\n });\n }\n };\n\n if (_this._onExecuteHandler) {\n DataObjectReporter_log.log('[DataObjectReporter] EXECUTE-EVENT: ', event);\n\n _this._onExecuteHandler(event);\n }\n }\n }, {\n key: \"subscriptions\",\n get: function get() {\n return this._subscriptions;\n }\n }, {\n key: \"childrensJSON\",\n get: function get() {\n var _this = this;\n\n var childrens = {}; // let children;\n // for (children in _this._childrenObjects) {\n\n var child; // childrens[children] = {};\n\n for (child in _this._childrenObjects) {\n childrens[child] = {};\n childrens[child].value = _this._childrenObjects[child].metadata;\n childrens[child].identity = _this._childrenObjects[child].identity;\n } // }\n\n\n return childrens;\n }\n }]);\n\n return DataObjectReporter;\n}(syncher_DataObject\n/* implements SyncStatus */\n);\n\n/* harmony default export */ var syncher_DataObjectReporter = (DataObjectReporter_DataObjectReporter);\n// CONCATENATED MODULE: ./src/syncher/DataObjectObserver.js\nfunction DataObjectObserver_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObjectObserver_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectObserver_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObjectObserver_typeof(obj); }\n\nfunction DataObjectObserver_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectObserver_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectObserver_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectObserver_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectObserver_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction DataObjectObserver_possibleConstructorReturn(self, call) { if (call && (DataObjectObserver_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return DataObjectObserver_assertThisInitialized(self); }\n\nfunction DataObjectObserver_get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { DataObjectObserver_get = Reflect.get; } else { DataObjectObserver_get = function _get(target, property, receiver) { var base = DataObjectObserver_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return DataObjectObserver_get(target, property, receiver || target); }\n\nfunction DataObjectObserver_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DataObjectObserver_getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction DataObjectObserver_getPrototypeOf(o) { DataObjectObserver_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataObjectObserver_getPrototypeOf(o); }\n\nfunction DataObjectObserver_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DataObjectObserver_setPrototypeOf(subClass, superClass); }\n\nfunction DataObjectObserver_setPrototypeOf(o, p) { DataObjectObserver_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataObjectObserver_setPrototypeOf(o, p); }\n\nfunction DataObjectObserver_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar DataObjectObserver_log = loglevel[\"getLogger\"]('DataObjectObserver');\n\n\nvar FilterType = {\n ANY: 'any',\n START: 'start',\n EXACT: 'exact'\n};\n/**\r\n * The class returned from the Syncher subscribe call.\r\n * To be used as an observation point from a DataObjectReporter change.\r\n */\n\nvar DataObjectObserver_DataObjectObserver =\n/*#__PURE__*/\nfunction (_DataObject) {\n DataObjectObserver_inherits(DataObjectObserver, _DataObject);\n\n /* private\r\n _changeListener: MsgListener\r\n ----event handlers----\r\n _filters: {: {type: , callback: } }\r\n */\n\n /**\r\n * @ignore\r\n * Should not be used directly by Hyperties. It's called by the Syncher.subscribe method\r\n */\n //TODO: For Further Study\n function DataObjectObserver(input) {\n var _this2;\n\n DataObjectObserver_classCallCheck(this, DataObjectObserver);\n\n //todo: check why\n //input.initialData = input.initialData.data;\n _this2 = DataObjectObserver_possibleConstructorReturn(this, DataObjectObserver_getPrototypeOf(DataObjectObserver).call(this, input));\n\n var _this = DataObjectObserver_assertThisInitialized(DataObjectObserver_assertThisInitialized(_this2));\n\n _this._version = input.version;\n _this._filters = {};\n\n _this._syncObj.observe(function (event) {\n _this._onFilter(event);\n });\n\n _this._allocateListeners();\n\n return _this2;\n }\n /**\r\n * Sync Data Object Observer with last version of Data Object Reporter. Useful for Resumes\r\n */\n\n\n DataObjectObserver_createClass(DataObjectObserver, [{\n key: \"sync\",\n value: function sync() {\n var _this = this;\n\n DataObjectObserver_log.info('[DataObjectObserver_sync] synchronising ');\n return new Promise(function (resolve, reject) {\n var criteria = {}; // if (this.metadata.backupRevision) criteria.backupRevision = this.metadata.backupRevision;\n\n _this._syncher.read(_this._metadata.url, criteria).then(function (value) {\n DataObjectObserver_log.info('[DataObjectObserver_sync] value to sync: ', value);\n Object.assign(_this.data, deepClone(value.data));\n _this._version = value.version;\n _this._metadata.lastModified = value.lastModified; //TODO: check first if there are new childrenObjects to avoid overhead\n\n if (value.childrenObjects) {\n _this.resumeChildrens(value.childrenObjects);\n\n _this._storeChildrens();\n\n resolve(true);\n } else resolve(true);\n /*if (value.version != _this._version) {\r\n log.info('[DataObjectObserver_sync] updating existing data: ', _this.data);\r\n Object.assign(_this.data || {}, deepClone(value.data));\r\n _this._metadata = deepClone(value);\r\n delete _this._metadata.data;\r\n _this._version = value.version;\r\n } else {\r\n log.info('[DataObjectObserver_sync] existing data is updated: ', value);\r\n }*/\n\n }).catch(function (reason) {\n DataObjectObserver_log.info('[DataObjectObserver_sync] sync failed: ', reason);\n resolve(false);\n });\n });\n }\n }, {\n key: \"_storeChildrens\",\n value: function _storeChildrens() {\n var _this = this;\n\n var childrens = {}; //TODO: to be sent to HypertyResourceStorage when ready to handle Chat Messages\n\n Object.keys(_this._childrenObjects).forEach(function (childId) {\n var children = _this._childrenObjects; // childrens[childrenResource] = {};\n // Object.keys(children).forEach((childId) => {\n\n childrens[childId] = {};\n childrens[childId].value = children[childId].metadata;\n childrens[childId].identity = children[childId].identity; // });\n });\n var msg = {\n from: _this._owner,\n to: _this._syncher._subURL,\n type: 'create',\n body: {\n resource: _this._url,\n attribute: 'childrenObjects',\n value: childrens\n }\n };\n\n _this._bus.postMessage(msg);\n }\n }, {\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n DataObjectObserver_get(DataObjectObserver_getPrototypeOf(DataObjectObserver.prototype), \"_allocateListeners\", this).call(this);\n\n var _this = this;\n\n _this._changeListener = _this._bus.addListener(_this._url + '/changes', function (msg) {\n if (msg.type === 'update') {\n DataObjectObserver_log.log('DataObjectObserver-' + _this._url + '-RCV: ', msg);\n\n _this._changeObject(_this._syncObj, msg);\n }\n });\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n DataObjectObserver_get(DataObjectObserver_getPrototypeOf(DataObjectObserver.prototype), \"_releaseListeners\", this).call(this);\n\n var _this = this;\n\n _this._changeListener.remove();\n }\n /**\r\n * Release and delete object data\r\n */\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n if (_this._heartBeat) _this._heartBeat.stop();\n\n _this._deleteChildrens().then(function () {\n _this.unsubscribe();\n\n _this._releaseListeners();\n\n delete _this._syncher._observers[_this._url];\n });\n }\n /**\r\n * Release and delete object data\r\n */\n\n }, {\n key: \"unsubscribe\",\n value: function unsubscribe() {\n var _this = this; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onLocalUnSubscribe\n\n\n var unSubscribeMsg = {\n type: 'unsubscribe',\n from: _this._owner,\n to: _this._syncher._subURL,\n body: {\n resource: _this._url\n }\n };\n\n _this._bus.postMessage(unSubscribeMsg, function (reply) {\n DataObjectObserver_log.log('DataObjectObserver-UNSUBSCRIBE: ', reply);\n\n if (reply.body.code === 200) {\n _this._releaseListeners();\n\n delete _this._syncher._observers[_this._url];\n }\n });\n }\n /**\r\n * Register the change listeners sent by the reporter\r\n * @param {string} filter - Filter that identifies the field (separated dot path). Accepts * at the end for a more unrestricted filtering.\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onChange\",\n value: function onChange(filter, callback) {\n var key = filter;\n var filterObj = {\n type: FilterType.EXACT,\n callback: callback\n };\n var idx = filter.indexOf('*');\n\n if (idx === filter.length - 1) {\n if (idx === 0) {\n filterObj.type = FilterType.ANY;\n } else {\n filterObj.type = FilterType.START;\n key = filter.substr(0, filter.length - 1);\n }\n }\n\n this._filters[key] = filterObj;\n }\n }, {\n key: \"_onFilter\",\n value: function _onFilter(event) {\n var _this = this;\n\n Object.keys(_this._filters).forEach(function (key) {\n var filter = _this._filters[key];\n\n if (filter.type === FilterType.ANY) {\n //match anything\n filter.callback(event);\n } else if (filter.type === FilterType.START) {\n //if starts with filter...\n if (event.field.indexOf(key) === 0) {\n filter.callback(event);\n }\n } else if (filter.type === FilterType.EXACT) {\n //exact match\n if (event.field === key) {\n filter.callback(event);\n }\n }\n });\n }\n }, {\n key: \"onDisconnected\",\n value: function onDisconnected(callback) {\n var _this3 = this;\n\n return new Promise(function (resolve, reject) {\n _this3._subscribeRegistration().then(function () {\n _this3._onDisconnected = callback;\n resolve();\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n }, {\n key: \"_subscribeRegistration\",\n value: function _subscribeRegistration() {\n var _this4 = this;\n\n var msg = {\n type: 'subscribe',\n from: this._owner,\n to: this._syncher._runtimeUrl + '/subscriptions',\n body: {\n resources: [this._url + '/registration']\n }\n };\n return new Promise(function (resolve, reject) {\n _this4._bus.postMessage(msg, function (reply) {\n DataObjectObserver_log.log(\"[DataObjectObserver._subscribeRegistration] \".concat(_this4._url, \" rcved reply \"), reply);\n\n if (reply.body.code === 200) {\n _this4._generateListener(_this4._url + '/registration');\n\n resolve();\n } else {\n DataObjectObserver_log.error('Error subscribing registration status for ', _this4._url);\n reject('Error subscribing registration status for ' + _this4._url);\n }\n });\n });\n }\n }, {\n key: \"_generateListener\",\n value: function _generateListener(notificationURL) {\n var _this = this;\n\n _this._bus.addListener(notificationURL, function (msg) {\n DataObjectObserver_log.log(\"[DataObjectObserver.registrationNotification] \".concat(_this._url, \": \"), msg);\n\n if (msg.body.value && msg.body.value === 'disconnected' && _this._onDisconnected) {\n DataObjectObserver_log.log(\"[DataObjectObserver] \".concat(_this._url, \": was disconnected \"), msg);\n\n _this._onDisconnected();\n }\n });\n }\n /**\r\n * Requests the reporter to execute a method on the data object\r\n * @param {string} method - Name of the function to be executed.\r\n * @param {array} params - array of parameters for the requested function\r\n * @return {promise}\r\n */\n\n }, {\n key: \"execute\",\n value: function execute(method, params) {\n var _this5 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var msg = {\n type: 'execute',\n from: _this5._owner,\n to: _this._url,\n body: {\n method: method,\n params: params\n }\n };\n\n _this._bus.postMessage(msg, function (reply) {\n DataObjectObserver_log.log(\"[DataObjectObserver.execute] \".concat(_this._url, \" rcved reply \"), reply);\n\n if (reply.body.code === 200) {\n resolve();\n } else {\n DataObjectObserver_log.warn(\"[DataObjectObserver.execute] execution of method \".concat(method, \" was reject by reporter\"));\n reject(\"[DataObjectObserver.execute] execution of method \".concat(method, \" was reject by reporter\"));\n }\n });\n });\n }\n }]);\n\n return DataObjectObserver;\n}(syncher_DataObject\n/* implements SyncStatus */\n);\n\n/* harmony default export */ var syncher_DataObjectObserver = (DataObjectObserver_DataObjectObserver);\n// CONCATENATED MODULE: ./src/syncher/DataProvisional.js\nfunction DataProvisional_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataProvisional_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataProvisional_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataProvisional_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataProvisional_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * @access private\r\n * This class is responsible for collecting delta changes in remote objects, before the response of subscription reach the observer.\r\n * It's used in Syncher -> subscribe. The flow is defined as:\r\n * 1. (observer) --subscribe--\x3e (reporter)\r\n * 2. (observer) <--delta updates-- (reporter)\r\n * 3. (observer) <--subscribe response-- (reporter)\r\n * This means that there could be delta updates transferred before the subscription confirmation.\r\n * Since there is no DataObjectObserver before the ubscription confirmation, there should be some other object collecting the updates.\r\n * Provisional data is applied to the DataObjectObserver after confirmation. Or discarded if there is no confirmation.\r\n */\n// Log System\n\nvar DataProvisional_log = loglevel[\"getLogger\"]('DataProvisional');\n\nvar DataProvisional =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _childrenListeners: [MsgListener]\r\n _listener: MsgListener\r\n _changes: []\r\n */\n function DataProvisional(owner, url, bus, children) {\n DataProvisional_classCallCheck(this, DataProvisional);\n\n var _this = this;\n\n _this._owner = owner;\n _this._url = url;\n _this._bus = bus;\n _this._children = children;\n _this._changes = [];\n\n _this._allocateListeners();\n }\n\n DataProvisional_createClass(DataProvisional, [{\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this = this;\n\n _this._listener = _this._bus.addListener(_this._url, function (msg) {\n DataProvisional_log.log('DataProvisional-' + _this._url + '-RCV: ', msg);\n\n _this._changes.push(msg);\n });\n /*\r\n _this._childrenListeners = [];\r\n if (_this._children) {\r\n let childBaseURL = url + '/children/';\r\n _this._children.forEach((child) => {\r\n let childURL = childBaseURL + child;\r\n let listener = _this._bus.addListener(childURL, (msg) => {\r\n //ignore msg sent by himself\r\n if (msg.from !== owner) {\r\n log.log(msg);\r\n }\r\n });\r\n _this._childrenListeners.push(listener);\r\n });\r\n }*/\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n _this._listener.remove();\n /*_this._childrenListeners.forEach((listener) => {\r\n listener.remove();\r\n });*/\n\n }\n }, {\n key: \"apply\",\n value: function apply(observer) {\n var _this = this;\n\n _this._changes.forEach(function (change) {\n observer._changeObject(observer._syncObj, change);\n });\n }\n }, {\n key: \"children\",\n get: function get() {\n return this._children;\n }\n }]);\n\n return DataProvisional;\n}();\n\n/* harmony default export */ var syncher_DataProvisional = (DataProvisional);\n// CONCATENATED MODULE: ./src/syncher/Syncher.js\nfunction Syncher_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Syncher_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Syncher_createClass(Constructor, protoProps, staticProps) { if (protoProps) Syncher_defineProperties(Constructor.prototype, protoProps); if (staticProps) Syncher_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar Syncher_log = loglevel[\"getLogger\"]('Syncher');\n\n\n\n\n/**\r\n* The main class for the syncher package.\r\n* The Syncher is a singleton class per Hyperty/URL and it is the owner of all created Data Sync Objects according to the Reporter - Observer pattern.\r\n* Main functionality is to create reporters and to subscribe to existing ones.\r\n*/\n\nvar Syncher_Syncher =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _owner: URL\r\n _bus: MiniBus\r\n _subURL: URL\r\n _reporters: \r\n _observers: \r\n _provisionals: \r\n ----event handlers----\r\n _onNotificationHandler: (event) => void\r\n _onResume: (event) => void\r\n */\n\n /**\r\n * Constructor that should be used by the Hyperty owner\r\n * @param {HypertyURL} owner - Hyperty URL owner. An URL allocated by the runtime that uniquely identifies the Hyperty.\r\n * @param {MiniBus} bus - An instance of the MiniBus provided in the sandbox. When an object (Reporter or Observed) is created, the SyncherManager will add a listener in the MiniBus to receive/send Messages of that object.\r\n * @param {JSON} config - Configuration data. The only required field for now is the runtimeURL.\r\n */\n function Syncher(owner, bus, config) {\n Syncher_classCallCheck(this, Syncher);\n\n var _this = this;\n\n _this._owner = owner;\n _this._bus = bus;\n _this._subURL = config.runtimeURL + '/sm';\n _this._runtimeUrl = config.runtimeURL;\n _this._p2pHandler = config.p2pHandler;\n _this._p2pRequester = config.p2pRequester;\n _this._reporters = {};\n _this._observers = {};\n _this._provisionals = {};\n bus.addListener(owner, function (msg) {\n //ignore msg sent by himself\n if (msg.from !== owner) {\n Syncher_log.info('[Syncher] Syncher-RCV: ', msg, _this);\n\n switch (msg.type) {\n case 'forward':\n _this._onForward(msg);\n\n break;\n\n case 'create':\n _this._onRemoteCreate(msg);\n\n break;\n\n case 'delete':\n _this._onRemoteDelete(msg);\n\n break;\n\n case 'execute':\n _this._onExecute(msg);\n\n break;\n }\n }\n });\n }\n /**\r\n * The owner of the Syncher and all created reporters.\r\n * @type {HypertyURL}\r\n */\n\n\n Syncher_createClass(Syncher, [{\n key: \"create\",\n\n /**\r\n * Request a DataObjectReporter creation. The URL will be be requested by the allocation mechanism.\r\n * @param {SchemaURL} schema - Hyperty Catalogue URL address that can be used to retrieve the JSON-Schema describing the Data Object schema\r\n * @param {HypertyURL[]} observers - List of hyperties that are pre-authorized for subscription\r\n * @param {JSON} initialData - Initial data of the reporter\r\n * @param {boolean} store - (Optional) if true, object will be stored by the runtime\r\n * @param {boolean} p2p - (Optional) if true, data synchronisation stream will use p2p connection as much as possible\r\n * @param {string} name - (Optional) the name of the dataobject\r\n * @param {MessageBodyIdentity} identity - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\r\n * @param {SyncMetadata} input - (optional) all metadata required to sunc the Data Object.\r\n * @return {Promise} Return Promise to a new Reporter. The reporter can be accepted or rejected by the PEP\r\n */\n value: function create(schema, observers, initialData) {\n var store = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var p2p = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var name = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'no name';\n var identity = arguments.length > 6 ? arguments[6] : undefined;\n var input = arguments.length > 7 ? arguments[7] : undefined;\n if (!schema) throw Error('[Syncher - Create] - You need specify the data object schema');\n if (!observers) throw Error('[Syncher - Create] -The observers should be defined');\n\n var _this = this;\n\n input = input || {};\n var createInput = Object.assign({}, input);\n createInput.p2p = p2p;\n createInput.store = store;\n createInput.schema = schema;\n createInput.authorise = observers;\n createInput.p2pHandler = _this._p2pHandler;\n createInput.p2pRequester = _this._p2pRequester;\n initialData ? createInput.data = deepClone(initialData) : createInput.data = {};\n createInput.name = name.length === 0 ? 'no name' : name;\n createInput.reporter = input.hasOwnProperty('reporter') && typeof input.reporter !== 'boolean' ? input.reporter : _this._owner;\n createInput.resume = false;\n\n if (input) {\n createInput.mutual = input.hasOwnProperty('mutual') ? input.mutual : false;\n createInput.name = input.hasOwnProperty('name') ? input.name : createInput.name;\n } else {\n createInput.mutual = false;\n }\n\n if (input.hasOwnProperty('reuseURL')) {\n createInput.resource = input.reuseURL;\n }\n\n if (identity) {\n createInput.identity = identity;\n } //Object.assign(createInput, {resume: false});\n //debugger;\n // console.log('[syncher - create] - create Reporter - createInput: ', createInput);\n\n\n return _this._create(createInput);\n }\n /**\r\n * Request a DataObjectReporter creation. The URL will be be requested by the allocation mechanism.\r\n * @param {Object} criteria - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\r\n * @return {Promise[]} Return a promise with a list of DataObjectReporter to be resumed;\r\n */\n\n }, {\n key: \"resumeReporters\",\n value: function resumeReporters(criteria) {\n var _this = this;\n\n Syncher_log.log('[syncher - create] - resume Reporter - criteria: ', criteria);\n Object.assign(criteria, {\n resume: true\n });\n return _this._resumeCreate(criteria);\n }\n /**\r\n * Request a subscription to an existent reporter object.\r\n * @param {SchemaURL} schema - Hyperty Catalogue URL address that can be used to retrieve the JSON-Schema describing the Data Object schema\r\n * @param {ObjectURL} objURL - Address of the existent reporter object to be observed\r\n * @param {Boolean} [store=false] - Save the subscription on the Syncher Manager for further resume (Default is false)\r\n * @param {Boolean} [p2p=false] - Info about if should use p2p connection (Default is false)\r\n * @param {Boolean} [mutual=true] - Info about if messages of this object should be encrypted (Default is true)\r\n * @param {MessageBodyIdentity} identity - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\r\n * @return {Promise} Return Promise to a new observer. It's associated with the reporter.\r\n */\n\n }, {\n key: \"subscribe\",\n value: function subscribe(input) {\n /* let _this = this;\r\n let criteria = {};\r\n criteria.p2p = p2p;\r\n criteria.store = store;\r\n criteria.schema = schema;\r\n criteria.domain_subscription = domain_subscription;\r\n criteria.resource = objURL;\r\n if (identity) { criteria.identity = identity; }\r\n //TODO: For Further Study\r\n criteria.mutual = mutual;\r\n log.log('[syncher - subscribe] - subscribe criteria: ', criteria);\r\n Object.assign(criteria, {resume: false});*/\n return this._subscribe(input);\n }\n /**\r\n * Request a subscription to an existent reporter object.\r\n * @param {criteria} criteria - Information to discovery the observer object\r\n * @return {Promise} Return Promise to a new observer. It's associated with the reporter.\r\n */\n\n }, {\n key: \"resumeObservers\",\n value: function resumeObservers(criteria) {\n var _this = this;\n\n var _criteria = criteria || {};\n\n Object.assign(_criteria, {\n resume: true\n });\n return _this._resumeSubscribe(_criteria);\n }\n /**\r\n * Request a read action on the reporter object\r\n * @param {ObjectURL} objURL - URL of the reporter object to be read\r\n * @return {Promise} Return Promise to last available data of the reporter\r\n */\n\n }, {\n key: \"read\",\n value: function read(objURL, criteria) {\n var _this = this;\n\n console.log('[Syncher.read] ', objURL);\n return new Promise(function (resolve, reject) {\n // in case the object is synched in a remote storage, lets sync with it\n\n /* if (_this._observers[objURL] && _this._observers[objURL].metadata.hasOwnProperty('backup') && _this._observers[objURL].metadata.backup) {\r\n \r\n let readMsg = {\r\n type: 'read', from: _this._owner, to: _this._subURL, \r\n body: { resource: objURL}\r\n };\r\n \r\n if (criteria) readMsg.body.criteria = criteria;\r\n \r\n let callback = (reply) => {\r\n return _this._readCallBack(reply, resolve, reject);\r\n };\r\n \r\n _this._bus.postMessage(readMsg, callback, false);\r\n \r\n } else {*/\n _this._readReporter(objURL).then(function (result) {\n resolve(result);\n }); // }\n\n });\n }\n }, {\n key: \"_readCallBack\",\n value: function _readCallBack(reply, resolve, reject) {\n var _this = this;\n\n console.log('[Syncher.read] reply: ', reply);\n var childrens = {};\n var value = {};\n var n = 0;\n\n if (reply.body.code < 300) {\n if (!reply.body.value.hasOwnProperty('responses')) {\n _this._bus.removeResponseListener(reply.from, reply.id);\n\n resolve(reply.body.value);\n } else {\n //data object is sent in separated messages\n if (n === 0) {\n //initial response without childrens\n value = reply.body.value;\n ++n;\n } else {\n // received response contains childrens\n delete reply.body.value.responses;\n var children;\n\n for (children in reply.body.value) {\n if (!childrens.hasOwnProperty(children)) childrens[children] = {};\n Object.assign(childrens[children], reply.body.value[children]);\n }\n\n ++n;\n\n if (n === value.responses) {\n value.childrenObjects = childrens;\n delete value.responses;\n\n _this._bus.removeResponseListener(reply.from, reply.id);\n\n resolve(value);\n }\n }\n }\n } else {\n reject(reply.body.desc);\n }\n }\n }, {\n key: \"_readReporter\",\n value: function _readReporter(objURL) {\n var _this = this; //FLOW-OUT: this message will be sent directly to reporter object (maybe there is no listener available, so it will be resolved with MessageBus -> resolve)\n //will reach the remote object in DataObjectReporter -> _onRead\n\n\n var readMsg = {\n type: 'read',\n from: _this._owner,\n to: objURL\n };\n return new Promise(function (resolve, reject) {\n _this._bus.postMessage(readMsg, function (reply) {\n return _this._readCallBack(reply, resolve, reject);\n }, false);\n });\n }\n /**\r\n * Setup the callback to process create and delete events of remove Reporter objects.\r\n * This is releated to the messagens sent by create to the observers Hyperty array.\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onNotification\",\n value: function onNotification(callback) {\n this._onNotificationHandler = callback;\n }\n /**\r\n * Setup the callback to process close events from the runtime.\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n this._onClose = callback;\n }\n }, {\n key: \"_create\",\n value: function _create(input) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var reporterInput = Object.assign({}, input);\n var resume = input.resume;\n reporterInput.created = new Date().toISOString();\n reporterInput.runtime = _this._runtimeUrl;\n var requestValue = deepClone(reporterInput);\n delete requestValue.p2p;\n delete requestValue.store;\n delete requestValue.observers;\n delete requestValue.identity; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onCreate\n //debugger;\n\n var requestMsg = {\n type: 'create',\n from: _this._owner,\n to: _this._subURL,\n body: {\n resume: resume,\n value: requestValue\n }\n };\n requestMsg.body.schema = reporterInput.schema;\n if (reporterInput.p2p) requestMsg.body.p2p = reporterInput.p2p;\n if (reporterInput.store) requestMsg.body.store = reporterInput.store;\n if (reporterInput.identity) requestMsg.body.identity = reporterInput.identity;\n console.log('[syncher._create]: ', reporterInput, requestMsg); //request create to the allocation system. Can be rejected by the PolicyEngine.\n\n _this._bus.postMessage(requestMsg, function (reply) {\n Syncher_log.log('[syncher - create] - create-response: ', reply);\n\n if (reply.body.code === 200) {\n //reporter creation accepted\n reporterInput.url = reply.body.resource;\n /* if (reply.body.p2pHandler) reporterInput.p2pHandler = reply.body.p2pHandler;\r\n if (reply.body.p2pRequester) reporterInput.p2pRequester = reply.body.p2pRequester;*/\n\n reporterInput.status = 'live'; // pch: do we ned this?\n\n reporterInput.syncher = _this;\n reporterInput.childrens = reply.body.childrenResources;\n var newObj = _this._reporters[reporterInput.url];\n\n if (!newObj) {\n newObj = new syncher_DataObjectReporter(reporterInput);\n _this._reporters[reporterInput.url] = newObj;\n }\n\n newObj.inviteObservers(input.authorise, input.p2p);\n resolve(newObj);\n } else {\n //reporter creation rejected\n reject(reply.body.desc);\n }\n });\n });\n }\n }, {\n key: \"_resumeCreate\",\n value: function _resumeCreate(criteria) {\n var _this2 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var resume = criteria.resume; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onCreate\n\n var requestMsg = {\n type: 'create',\n from: _this._owner,\n to: _this._subURL,\n body: {\n resume: resume\n }\n };\n Syncher_log.log('[syncher - create]: ', criteria, requestMsg);\n\n if (criteria) {\n requestMsg.body.value = criteria;\n\n if (criteria.hasOwnProperty('reporter')) {\n requestMsg.body.value.reporter = criteria.reporter;\n } else {\n requestMsg.body.value.reporter = _this._owner;\n }\n }\n\n if (criteria.p2p) requestMsg.body.p2p = criteria.p2p;\n if (criteria.store) requestMsg.body.store = criteria.store;\n if (criteria.observers) requestMsg.body.authorise = criteria.observers;\n if (criteria.identity) requestMsg.body.identity = criteria.identity;\n Syncher_log.log('[syncher._resumeCreate] - resume message: ', requestMsg); //debugger;\n //request create to the allocation system. Can be rejected by the PolicyEngine.\n\n _this._bus.postMessage(requestMsg, function (reply) {\n Syncher_log.log('[syncher._resumeCreate] - create-resumed-response: ', reply);\n\n if (reply.body.code === 200) {\n //debugger;\n var listOfReporters = reply.body.value;\n\n for (var index in listOfReporters) {\n var dataObject = listOfReporters[index]; //reporter creation accepted\n\n dataObject.data = deepClone(dataObject.data) || {};\n\n if (dataObject.childrenObjects) {\n dataObject.childrenObjects = deepClone(dataObject.childrenObjects);\n }\n\n dataObject.mutual = false;\n dataObject.resume = true;\n dataObject.status = 'live'; // pch: do we ned this?\n\n dataObject.syncher = _this;\n Syncher_log.log('[syncher._resumeCreate] - create-resumed-dataObjectReporter', dataObject);\n var newObj = new syncher_DataObjectReporter(dataObject);\n\n if (dataObject.childrenObjects) {\n newObj.resumeChildrens(dataObject.childrenObjects);\n }\n\n _this._reporters[dataObject.url] = newObj;\n }\n\n resolve(_this._reporters);\n if (_this2._onReportersResume) _this2._onReportersResume(_this2._reporters);\n } else if (reply.body.code === 404) {\n resolve({});\n } else {\n //reporter creation rejected\n reject(reply.body.desc);\n }\n });\n });\n }\n }, {\n key: \"_subscribe\",\n value: function _subscribe(input) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onLocalSubscribe\n var subscribeMsg = {\n type: 'subscribe',\n from: _this._owner,\n to: _this._subURL,\n body: input\n }; // Hyperty request to be an Observer\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#hyperty-request-to-be-an-observer\n // Resume Subscriptions for the same Hyperty URL\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-the-same-hyperty-url\n // Resume Subscriptions for a certain user and data schema independently of the Hyperty URL.\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-a-certain-user-and-data-schema-independently-of-the-hyperty-url\n\n /* if (input) {\r\n if (input.hasOwnProperty('p2p')) subscribeMsg.body.p2p = input.p2p;\r\n if (input.hasOwnProperty('store')) subscribeMsg.body.store = input.store;\r\n if (input.hasOwnProperty('schema')) subscribeMsg.body.schema = input.schema;\r\n if (input.hasOwnProperty('identity')) subscribeMsg.body.identity = input.identity;\r\n if (input.hasOwnProperty('resource')) subscribeMsg.body.resource = input.resource;\r\n if (input.hasOwnProperty('domain_subscription')) subscribeMsg.body.domain_subscription = input.domain_subscription;\r\n }\r\n \r\n \r\n subscribeMsg.body.resume = input.resume;\r\n \r\n //TODO: For Further Study\r\n if (input.hasOwnProperty('mutual')) subscribeMsg.body.mutual = input.mutual;*/\n\n Syncher_log.log('[syncher_subscribe] - subscribe message: ', input, subscribeMsg); //request subscription\n //Provisional data is applied to the DataObjectObserver after confirmation. Or discarded if there is no confirmation.\n //for more info see the DataProvisional class documentation.\n\n _this._bus.postMessage(subscribeMsg, function (reply) {\n Syncher_log.log('[syncher] - subscribe-response: ', reply);\n var objURL = reply.body.resource;\n var newProvisional = _this._provisionals[objURL];\n delete _this._provisionals[objURL];\n if (newProvisional) newProvisional._releaseListeners();\n\n if (reply.body.code < 200) {\n Syncher_log.log('[syncher] - new DataProvisional: ', reply.body.childrenResources, objURL);\n newProvisional = new syncher_DataProvisional(_this._owner, objURL, _this._bus, reply.body.childrenResources);\n _this._provisionals[objURL] = newProvisional;\n } else if (reply.body.code === 200) {\n Syncher_log.log('[syncher] - new Data Object Observer: ', reply, _this._provisionals);\n var observerInput = reply.body.value;\n observerInput.syncher = _this;\n observerInput.p2p = input.p2p;\n observerInput.store = input.store;\n observerInput.identity = input.identity;\n observerInput.resume = false; // todo: For Further Study\n\n observerInput.mutual = input.mutual; //observerInput.children = newProvisional.children;\n //TODO: mutual For Further Study\n\n var newObj = _this._observers[objURL];\n\n if (!newObj) {\n newObj = new syncher_DataObjectObserver(observerInput);\n _this._observers[objURL] = newObj;\n } else {\n newObj.sync();\n }\n\n Syncher_log.log('[syncher] - new Data Object Observer already exist: ', newObj);\n resolve(newObj);\n\n if (newProvisional) {\n newProvisional.apply(newObj);\n }\n } else {\n reject(reply.body.desc);\n }\n });\n });\n }\n /*\r\n _processOfflineSubscription(subscription, redirectTo) {\r\n let _this = this;\r\n \r\n let forward = {\r\n from: subscription.from,\r\n type: 'forward',\r\n to: redirectTo,\r\n body: subscription\r\n };\r\n \r\n console.log('[Syncher._processOfflineSubscription] forwading ', forward);\r\n \r\n _this._bus.postMessage(forward);\r\n \r\n let result = {\r\n code: 302,\r\n desc: \"Found \" + redirectTo\r\n };\r\n \r\n return(result);\r\n \r\n }*/\n\n }, {\n key: \"_resumeSubscribe\",\n value: function _resumeSubscribe(criteria) {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onLocalSubscribe\n var subscribeMsg = {\n type: 'subscribe',\n from: _this._owner,\n to: _this._subURL,\n body: {}\n }; // Hyperty request to be an Observer\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#hyperty-request-to-be-an-observer\n // Resume Subscriptions for the same Hyperty URL\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-the-same-hyperty-url\n // Resume Subscriptions for a certain user and data schema independently of the Hyperty URL.\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-a-certain-user-and-data-schema-independently-of-the-hyperty-url\n\n if (criteria) {\n if (criteria.hasOwnProperty('p2p')) subscribeMsg.body.p2p = criteria.p2p;\n if (criteria.hasOwnProperty('store')) subscribeMsg.body.store = criteria.store;\n if (criteria.hasOwnProperty('schema')) subscribeMsg.body.schema = criteria.schema;\n if (criteria.hasOwnProperty('identity')) subscribeMsg.body.identity = criteria.identity;\n if (criteria.hasOwnProperty('resource')) subscribeMsg.body.resource = criteria.resource;\n }\n\n subscribeMsg.body.resume = criteria.resume; //TODO: For Further Study\n\n var mutual = criteria.mutual;\n if (criteria.hasOwnProperty('mutual')) subscribeMsg.body.mutual = mutual;\n console.log('[syncher] - subscribe message: ', criteria, subscribeMsg); //request subscription\n //Provisional data is applied to the DataObjectObserver after confirmation. Or discarded if there is no confirmation.\n //for more info see the DataProvisional class documentation.\n\n _this._bus.postMessage(subscribeMsg, function (reply) {\n console.log('[syncher] - subscribe-resumed-response: ', reply);\n var objURL = reply.body.resource;\n var newProvisional = _this._provisionals[objURL];\n delete _this._provisionals[objURL];\n if (newProvisional) newProvisional._releaseListeners();\n\n if (reply.body.code < 200) {\n // todo: check if this is needed for the resume\n Syncher_log.log('[syncher] - resume new DataProvisional: ', reply, objURL);\n newProvisional = new syncher_DataProvisional(_this._owner, objURL, _this._bus, reply.body.childrenResources);\n _this._provisionals[objURL] = newProvisional;\n } else if (reply.body.code === 200) {\n var listOfObservers = reply.body.value;\n\n for (var index in listOfObservers) {\n var dataObject = listOfObservers[index];\n console.log('[syncher] - Resume Object Observer: ', reply, dataObject, _this._provisionals);\n\n if (dataObject.childrenObjects) {\n dataObject.childrenObjects = deepClone(dataObject.childrenObjects);\n }\n\n dataObject.data = deepClone(dataObject.data) || {};\n dataObject.resume = true;\n dataObject.syncher = _this; //TODO: mutual For Further Study\n\n console.log('[syncher._resumeSubscribe] - create new dataObject: ', dataObject);\n var newObj = new syncher_DataObjectObserver(dataObject);\n\n if (dataObject.childrenObjects) {\n newObj.resumeChildrens(dataObject.childrenObjects);\n }\n\n Syncher_log.log('[syncher._resumeSubscribe] - new dataObject', newObj);\n _this._observers[newObj.url] = newObj;\n\n if (_this._provisionals[newObj.url]) {\n _this._provisionals[newObj.url].apply(newObj);\n } //lets sync with Reporter\n // it was commented to let hyperties decide when to sync\n //newObj.sync();\n\n }\n\n resolve(_this._observers);\n if (_this3._onObserversResume) _this3._onObserversResume(_this._observers);\n } else if (reply.body.code === 404) {\n resolve({});\n } else {\n reject(reply.body.desc);\n }\n });\n });\n } //FLOW-IN: message received from a local runtime ReporterObject -> _onRemoteSubscribe\n\n }, {\n key: \"_onForward\",\n value: function _onForward(msg) {\n var _this = this;\n\n var reporter = _this._reporters[msg.body.to];\n\n reporter._onForward(msg);\n } //FLOW-IN: message received from a remote Syncher -> create (this is actually an invitation to subscribe)\n\n }, {\n key: \"_onRemoteCreate\",\n value: function _onRemoteCreate(msg) {\n var _this = this;\n\n var resource = msg.from.slice(0, -13); //remove \"/subscription\" from the URL\n\n var dividedURL = divideURL(resource);\n var domain = dividedURL.domain;\n var event = {\n type: msg.type,\n from: msg.body.source,\n url: resource,\n domain: domain,\n schema: msg.body.schema,\n value: msg.body.value,\n identity: msg.body.identity,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType\n }\n });\n }\n };\n\n if (_this._onNotificationHandler) {\n Syncher_log.info('[Syncher] NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler(event);\n }\n } //FLOW-IN: message received from a remote DataObjectReporter -> delete\n\n }, {\n key: \"_onRemoteDelete\",\n value: function _onRemoteDelete(msg) {\n var _this = this; //remove \"/subscription\" from the URL\n\n\n var resource = msg.body.resource;\n var object = _this._observers[resource];\n var unsubscribe = {\n from: _this.owner,\n to: _this._subURL,\n id: msg.id,\n type: 'unsubscribe',\n body: {\n resource: msg.body.resource\n }\n };\n\n _this._bus.postMessage(unsubscribe);\n\n delete _this._observers[resource];\n\n if (object) {\n var event = {\n type: msg.type,\n url: resource,\n identity: msg.body.identity,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //TODO: any other different options for the release process, like accept but nor release local?\n\n\n if (lType === 200) {\n object.delete();\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType,\n source: _this._owner\n }\n });\n }\n };\n\n if (_this._onNotificationHandler) {\n Syncher_log.log('NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler(event);\n }\n } else {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 404,\n source: _this._owner\n }\n });\n }\n } // close event received from runtime registry\n\n }, {\n key: \"_onExecute\",\n value: function _onExecute(msg) {\n var _this = this;\n\n var reply = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n };\n\n if ((msg.from === _this._runtimeUrl + '/registry/' || msg.from === _this._runtimeUrl + '/registry') && msg.body && msg.body.method && msg.body.method === 'close' && _this._onClose) {\n var event = {\n type: 'close',\n ack: function ack(type) {\n if (type) {\n reply.body.code = type;\n } //send ack response message\n\n\n _this._bus.postMessage(reply);\n }\n };\n Syncher_log.info('[Syncher] Close-EVENT: ', event);\n\n _this._onClose(event);\n } else {\n _this._bus.postMessage(reply);\n }\n }\n /**\r\n * Callback system to trigger the resumed reporters\r\n * @param {Function} callback - function callback which will be invoked\r\n * @return {Object} Return one object with all resumed reporters;\r\n */\n\n }, {\n key: \"onReportersResume\",\n value: function onReportersResume(callback) {\n this._onReportersResume = callback;\n }\n /**\r\n * Callback system to trigger the resumed observers\r\n * @param {Function} callback - function callback which will be invoked\r\n * @return {Object} Return one object with all resumed observers;\r\n */\n\n }, {\n key: \"onObserversResume\",\n value: function onObserversResume(callback) {\n this._onObserversResume = callback;\n }\n }, {\n key: \"owner\",\n get: function get() {\n return this._owner;\n }\n /**\r\n * All owned reporters, the ones that were created by a create\r\n * @type {Object}\r\n */\n\n }, {\n key: \"reporters\",\n get: function get() {\n return this._reporters;\n }\n /**\r\n * All owned observers, the ones that were created by a local subscription\r\n * @type {Object}\r\n */\n\n }, {\n key: \"observers\",\n get: function get() {\n return this._observers;\n }\n }]);\n\n return Syncher;\n}();\n\n/* harmony default export */ var syncher_Syncher = (Syncher_Syncher);\n// CONCATENATED MODULE: ./src/syncher/NotificationHandler.js\nfunction NotificationHandler_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction NotificationHandler_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction NotificationHandler_createClass(Constructor, protoProps, staticProps) { if (protoProps) NotificationHandler_defineProperties(Constructor.prototype, protoProps); if (staticProps) NotificationHandler_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* The Notitification Handler is used to handle notifications not processed by the syncher when running in a sandbox.\r\n*/\n\n\nvar NotificationHandler_NotificationHandler =\n/*#__PURE__*/\nfunction () {\n function NotificationHandler(bus) {\n NotificationHandler_classCallCheck(this, NotificationHandler);\n\n if (!bus) throw Error('[NotificationHandler Constructor] bus input is mandatory');\n this._bus = bus;\n this._onNotificationHandler = {};\n }\n\n NotificationHandler_createClass(NotificationHandler, [{\n key: \"onNotification\",\n value: function onNotification(scheme, callback) {\n this._onNotificationHandler[scheme] = callback;\n }\n }, {\n key: \"onCreate\",\n value: function onCreate(msg) {\n var _this = this; // let resource = msg.from.slice(0, -13); //remove \"/subscription\" from the URL\n\n\n var resource = msg.body.hasOwnProperty('resource') ? msg.body.resource : msg.from.slice(0, -13);\n var dividedURL = divideURL(resource);\n var domain = dividedURL.domain;\n var scheme = resource.split('://')[0];\n\n var _error = function error(reason) {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 400,\n desc: 'Bad Request: ' + reason\n }\n });\n };\n\n if (!msg.body.hasOwnProperty('source')) {\n _error('Missing source');\n }\n\n if (!msg.body.hasOwnProperty('schema')) {\n _error('Missing schema');\n }\n\n if (!msg.body.hasOwnProperty('value')) {\n _error('Missing value');\n }\n\n if (!msg.body.hasOwnProperty('identity')) {\n _error('Missing identity');\n }\n\n var event = {\n type: msg.type,\n from: msg.body.source,\n url: resource,\n domain: domain,\n schema: msg.body.schema,\n value: msg.body.value,\n identity: msg.body.identity,\n to: msg.to,\n via: msg.body.via,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType\n }\n });\n },\n error: function error(reason) {\n _error(reason);\n }\n };\n\n if (_this._onNotificationHandler[scheme]) {\n console.info('[NotificationHandler] NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler[scheme](event);\n }\n }\n }, {\n key: \"onDelete\",\n value: function onDelete(msg) {\n var _this = this; //remove \"/subscription\" from the URL\n\n\n var resource = msg.body.resource;\n var object = _this._observers[resource];\n var unsubscribe = {\n from: _this.owner,\n to: _this._subURL,\n id: msg.id,\n type: 'unsubscribe',\n body: {\n resource: msg.body.resource\n }\n };\n\n _this._bus.postMessage(unsubscribe);\n\n delete _this._observers[resource];\n\n if (object) {\n var event = {\n type: msg.type,\n url: resource,\n identity: msg.body.identity,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //TODO: any other different options for the release process, like accept but nor release local?\n\n\n if (lType === 200) {\n object.delete();\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType,\n source: _this._owner\n }\n });\n }\n };\n\n if (_this._onNotificationHandler) {\n log.log('NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler(event);\n }\n } else {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 404,\n source: _this._owner\n }\n });\n }\n }\n }]);\n\n return NotificationHandler;\n}();\n\n/* harmony default export */ var syncher_NotificationHandler = (NotificationHandler_NotificationHandler);\n// CONCATENATED MODULE: ./src/identity/IdentityManager.js\nfunction IdentityManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction IdentityManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction IdentityManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) IdentityManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) IdentityManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* Core IdentityManager interface\r\n* Class to allow applications to search for Identities registered in runtime-core\r\n*/\n\nvar IdentityManager_IdentityManager =\n/*#__PURE__*/\nfunction () {\n /**\r\n * To initialise the IdentityManager, which will provide the support for hyperties to\r\n * query about identities registered\r\n * @param {String} owner owner\r\n * @param {String} runtimeURL runtimeURL\r\n * @param {MessageBus} msgbus msgbus\r\n */\n function IdentityManager(owner, runtimeURL, msgBus) {\n IdentityManager_classCallCheck(this, IdentityManager);\n\n var _this = this;\n\n _this.messageBus = msgBus;\n _this.domain = divideURL(owner).domain;\n _this.owner = owner;\n _this.runtimeURL = runtimeURL;\n }\n /**\r\n * Function to query the runtime registry about the identity to which the hyperty was associated\r\n * @param {String} type (Optional) type of user info required\r\n * @param {String} owner (Optional) owner to search for\r\n * @return {Promise} userURL userURL associated to the hyperty\r\n */\n\n\n IdentityManager_createClass(IdentityManager, [{\n key: \"discoverUserRegistered\",\n value: function discoverUserRegistered(type, hyperty) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var activeHypertyURL; // if any type of search is selected query for that type, otherwise query for default user info\n\n var searchType = type ? type : '.';\n\n if (!hyperty) {\n activeHypertyURL = _this.owner;\n } else {\n activeHypertyURL = hyperty;\n }\n\n var msg = {\n type: 'read',\n from: activeHypertyURL,\n to: _this.runtimeURL + '/registry/',\n body: {\n resource: searchType,\n criteria: activeHypertyURL\n }\n };\n\n _this.messageBus.postMessage(msg, function (reply) {\n var userURL = reply.body.resource;\n\n if (userURL && reply.body.code === 200) {\n resolve(userURL);\n } else {\n reject('code: ' + reply.body.code + ' No user was found');\n }\n });\n });\n }\n /**\r\n * Function to query the Identity Module about authenticated identities from a certain domain\r\n * @param {String} idp idp domain of the identity to be discovered\r\n * @return {Promise} identity\r\n */\n\n }, {\n key: \"discoverIdentityPerIdP\",\n value: function discoverIdentityPerIdP(idp) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var msg = {\n type: 'read',\n from: this.owner,\n to: _this.runtimeURL + '/idm',\n body: {\n resource: idp,\n criteria: 'idp'\n }\n };\n\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n resolve(reply.body.value);\n } else {\n reject(reply.body.code + ' ' + reply.body.desc);\n }\n });\n });\n }\n }]);\n\n return IdentityManager;\n}();\n\n/* harmony default export */ var identity_IdentityManager = (IdentityManager_IdentityManager);\n// CONCATENATED MODULE: ./src/discovery/RegistrationStatus.js\nfunction RegistrationStatus_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RegistrationStatus_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RegistrationStatus_createClass(Constructor, protoProps, staticProps) { if (protoProps) RegistrationStatus_defineProperties(Constructor.prototype, protoProps); if (staticProps) RegistrationStatus_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar RegistrationStatus_log = loglevel[\"getLogger\"]('RegistrationStatus');\n\n/**\r\n* The RegistrationStatus lib allows to monitor registration status of an Hyperty or Data Object\r\n*\r\n*/\n\nvar RegistrationStatus_RegistrationStatus =\n/*#__PURE__*/\nfunction () {\n /**\r\n * @param {URL} url URL address of the entity to be monitored\r\n * @param {URL} runtimeURL the current URL of the Runtime Instance used\r\n * @param {HypertyURL} owner the URL of the Hyperty instance that is using this lib\r\n * @param {MiniBus} owner the URL of the Hyperty instance that is using this lib\r\n *\r\n */\n function RegistrationStatus(url, runtimeURL, owner, msgBus) {\n RegistrationStatus_classCallCheck(this, RegistrationStatus);\n\n this._registryObjectURL = url;\n this._runtimeURL = runtimeURL;\n this._domain = divideURL(runtimeURL).domain;\n this._discoveredObjectURL = owner;\n this._messageBus = msgBus;\n this._subscriptionSet = false;\n this._subscribers = {\n live: {},\n disconnected: {}\n };\n }\n\n RegistrationStatus_createClass(RegistrationStatus, [{\n key: \"onLive\",\n value: function onLive(subscriber, callback) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (!_this._subscriptionSet) {\n _this._subscribe().then(function () {\n _this._subscribers.live[subscriber] = callback;\n resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n _this._subscribers.live[subscriber] = callback;\n resolve();\n }\n });\n }\n }, {\n key: \"onDisconnected\",\n value: function onDisconnected(subscriber, callback) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n if (!_this2._subscriptionSet) {\n _this2._subscribe().then(function () {\n _this2._subscribers.disconnected[subscriber] = callback;\n resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n _this2._subscribers.disconnected[subscriber] = callback;\n resolve();\n }\n });\n }\n }, {\n key: \"_subscribe\",\n value: function _subscribe() {\n var _this3 = this;\n\n var msg = {\n type: 'subscribe',\n from: this._discoveredObjectURL,\n to: this._runtimeURL + '/subscriptions',\n body: {\n resources: [this._registryObjectURL + '/registration']\n }\n };\n return new Promise(function (resolve, reject) {\n _this3._messageBus.postMessage(msg, function (reply) {\n RegistrationStatus_log.log(\"[DiscoveredObject.subscribe] \".concat(_this3._registryObjectURL, \" rcved reply \"), reply);\n\n if (reply.body.code === 200) {\n _this3._generateListener(_this3._registryObjectURL + '/registration');\n\n _this3._subscriptionSet = true;\n resolve();\n } else {\n RegistrationStatus_log.error('Error subscribing ', _this3._registryObjectURL);\n reject('Error subscribing ' + _this3._registryObjectURL);\n }\n });\n });\n }\n }, {\n key: \"_generateListener\",\n value: function _generateListener(notificationURL) {\n var _this4 = this;\n\n this._messageBus.addListener(notificationURL, function (msg) {\n RegistrationStatus_log.log(\"[DiscoveredObject.notification] \".concat(_this4._registryObjectURL, \": \"), msg);\n\n _this4._processNotification(msg);\n });\n }\n }, {\n key: \"_processNotification\",\n value: function _processNotification(msg) {\n var _this5 = this;\n\n var status = msg.body.value;\n setTimeout(function () {\n // Hack to give time for onLive Hyperties to get ready. To be removed when Hyperty State machaine is implemented\n Object.keys(_this5._subscribers[status]).forEach(function (subscriber) {\n return _this5._subscribers[status][subscriber]();\n });\n }, 5000);\n }\n }, {\n key: \"_unsubscribe\",\n value: function _unsubscribe() {\n var _this6 = this;\n\n var msg = {\n type: 'unsubscribe',\n from: this._discoveredObjectURL,\n to: this._runtimeURL + '/subscriptions',\n body: {\n resource: this._registryObjectURL + '/registration'\n }\n };\n return new Promise(function (resolve, reject) {\n _this6._messageBus.postMessage(msg, function (reply) {\n RegistrationStatus_log.log(\"[DiscoveredObject.unsubscribe] \".concat(_this6._registryObjectURL, \" rcved reply \"), reply);\n\n if (reply.body.code === 200) {\n resolve();\n } else {\n RegistrationStatus_log.error('Error unsubscribing ', _this6._registryObjectURL);\n reject('Error unsubscribing ' + _this6._registryObjectURL);\n }\n });\n });\n }\n }, {\n key: \"unsubscribeLive\",\n value: function unsubscribeLive(subscriber) {\n var _this7 = this;\n\n return new Promise(function (resolve, reject) {\n if (subscriber in _this7._subscribers.live) {\n //TODO: unsubscribe outside this condition\n delete _this7._subscribers.live[subscriber];\n }\n\n if (_this7._areSubscriptionsEmpty()) {\n _this7._unsubscribe().then(function () {\n return resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n resolve();\n }\n /* } else {\r\n reject(`${subscriber} doesn't subscribe onLive for ${this._registryObjectURL}`);\r\n }*/\n\n });\n }\n }, {\n key: \"unsubscribeDisconnected\",\n value: function unsubscribeDisconnected(subscriber) {\n var _this8 = this;\n\n return new Promise(function (resolve, reject) {\n if (subscriber in _this8._subscribers.disconnected) {\n delete _this8._subscribers.disconnected[subscriber];\n\n if (_this8._areSubscriptionsEmpty()) {\n _this8._unsubscribe().then(function () {\n return resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n resolve();\n }\n } else {\n reject(\"\".concat(subscriber, \" doesn't subscribe onDisconnected for \").concat(_this8._registryObjectURL));\n }\n });\n }\n }, {\n key: \"_areSubscriptionsEmpty\",\n value: function _areSubscriptionsEmpty() {\n return Object.keys(this._subscribers.live).length === 0 && Object.keys(this._subscribers.disconnected).length === 0;\n }\n }]);\n\n return RegistrationStatus;\n}();\n\n/* harmony default export */ var discovery_RegistrationStatus = (RegistrationStatus_RegistrationStatus);\n// CONCATENATED MODULE: ./src/discovery/DiscoveredObject.js\nfunction DiscoveredObject_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DiscoveredObject_typeof = function _typeof(obj) { return typeof obj; }; } else { DiscoveredObject_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DiscoveredObject_typeof(obj); }\n\nfunction DiscoveredObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DiscoveredObject_possibleConstructorReturn(self, call) { if (call && (DiscoveredObject_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return DiscoveredObject_assertThisInitialized(self); }\n\nfunction DiscoveredObject_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction DiscoveredObject_getPrototypeOf(o) { DiscoveredObject_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DiscoveredObject_getPrototypeOf(o); }\n\nfunction DiscoveredObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DiscoveredObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) DiscoveredObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) DiscoveredObject_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction DiscoveredObject_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DiscoveredObject_setPrototypeOf(subClass, superClass); }\n\nfunction DiscoveredObject_setPrototypeOf(o, p) { DiscoveredObject_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DiscoveredObject_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n//import {divideURL, convertToUserURL} from '../utils/utils';\n\n/**\r\n* Discovered Object interface\r\n*/\n\nvar DiscoveredObject =\n/*#__PURE__*/\nfunction (_RegistrationStatus) {\n DiscoveredObject_inherits(DiscoveredObject, _RegistrationStatus);\n\n DiscoveredObject_createClass(DiscoveredObject, [{\n key: \"data\",\n get: function get() {\n return this._data;\n }\n }]);\n\n function DiscoveredObject(data, runtimeURL, discoveryURL, msgBus, discovery) {\n var _this2;\n\n DiscoveredObject_classCallCheck(this, DiscoveredObject);\n\n _this2 = DiscoveredObject_possibleConstructorReturn(this, DiscoveredObject_getPrototypeOf(DiscoveredObject).call(this, data.hypertyID || data.url, runtimeURL, discoveryURL, msgBus));\n _this2._data = data;\n _this2._discovery = discovery;\n return _this2;\n }\n /**\r\n * function to check the status of the DiscoveredObject.\r\n * Depending on existing subscribers it may trigger onLive or onDisconnected events.\r\n *\r\n */\n\n\n DiscoveredObject_createClass(DiscoveredObject, [{\n key: \"check\",\n value: function check() {\n // query DR for the status and call processNotification with msg received\n var _this = this;\n\n var message = {\n body: {}\n };\n\n if (_this._discoveredObjectURL.startsWith('hyperty://')) {\n _this._discovery.discoverHypertyPerURL(_this._discoveredObjectURL).then(function (registration) {\n message.body.status = registration.status;\n\n _this._processNotification(message);\n });\n } else {\n _this._discovery.discoverDataObjectsPerURL(_this._discoveredObjectURL).then(function (registration) {\n message.body.status = registration.status;\n\n _this._processNotification(message);\n });\n }\n }\n }]);\n\n return DiscoveredObject;\n}(discovery_RegistrationStatus);\n\n/* harmony default export */ var discovery_DiscoveredObject = (DiscoveredObject);\n// CONCATENATED MODULE: ./src/discovery/Discovery.js\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction Discovery_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Discovery_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Discovery_createClass(Constructor, protoProps, staticProps) { if (protoProps) Discovery_defineProperties(Constructor.prototype, protoProps); if (staticProps) Discovery_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar Discovery_log = loglevel[\"getLogger\"]('Discovery');\n\n\n/**\r\n* Core Discovery interface\r\n* Class to allow applications to search for hyperties and DataObjects using the message bus\r\n*/\n\nvar Discovery_Discovery =\n/*#__PURE__*/\nfunction () {\n /**\r\n * To initialise the HypertyDiscover, which will provide the support for hyperties to\r\n * query users registered in outside the internal core.\r\n * @param {MessageBus} msgbus msgbus\r\n * @param {RuntimeURL} runtimeURL runtimeURL\r\n */\n function Discovery(hypertyURL, runtimeURL, msgBus) {\n Discovery_classCallCheck(this, Discovery);\n\n var _this = this;\n\n _this.messageBus = msgBus;\n _this.runtimeURL = runtimeURL;\n _this.domain = divideURL(hypertyURL).domain;\n _this.discoveryURL = hypertyURL;\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\r\n * @param {String} userIdentifier\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n\n Discovery_createClass(Discovery, [{\n key: \"_isLegacyUser\",\n value: function _isLegacyUser(userIdentifier) {\n if (userIdentifier.includes(':') && !userIdentifier.includes('user://')) {\n return true;\n } else {\n return false;\n }\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\r\n * @param {String} userIdentifier\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverHypertiesPerUserProfileData\",\n value: function discoverHypertiesPerUserProfileData(userIdentifier, schema, resources) {\n var _this = this;\n\n var filteredHyperties = [];\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/userprofile/' + userIdentifier\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n if (!_this._isLegacyUser(userIdentifier)) {\n // todo: to reomve when discovery of legcay users are supported\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n reply.body.value.map(function (hyperty) {\n if (hyperty.hypertyID != _this.discoveryURL) filteredHyperties.push(hyperty);\n });\n if (filteredHyperties.length === 0) resolve([]);else {\n Discovery_log.log(\"[Discovery.discoverHypertiesPerUserProfileData] Reply log: \", filteredHyperties);\n resolve(filteredHyperties);\n }\n } else {\n Discovery_log.warn(\"[Discovery.discoverHypertiesPerUserProfileData] Error Reply for \" + userIdentifier + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n } else {\n resolve([{\n hypertyID: userIdentifier,\n status: 'live'\n }]);\n }\n });\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\r\n * returns DiscoveredObject\r\n * @param {String} userIdentifier\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverHypertiesPerUserProfileDataDO\",\n value: function discoverHypertiesPerUserProfileDataDO(userIdentifier, schema, resources) {\n var _this2 = this,\n _arguments = arguments;\n\n return new Promise(function (resolve, reject) {\n _this2.discoverHypertiesPerUserProfileData.apply(_this2, _toConsumableArray(_arguments)).then(function (hyperties) {\n resolve(_this2._convertToDiscoveredObject(hyperties));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * Advanced Search for DataObjects registered in domain registry associated with some user identifier (eg email, name ...)\r\n * @param {String} userIdentifier\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverDataObjectsPerUserProfileData\",\n value: function discoverDataObjectsPerUserProfileData(userIdentifier, schema, resources) {\n var _this = this;\n\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/userprofile/' + userIdentifier\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n if (!_this._isLegacyUser(userIdentifier)) {\n // todo: to reomve when discovery of legcay users are supported\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjectsPerUserProfileData] Error Reply for \" + userIdentifier + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n } else {\n resolve([{\n hypertyID: userIdentifier,\n status: 'live'\n }]);\n }\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} guidURL guid URL e.g user-guid://\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjectsPerUserProfileDataDO\",\n value: function discoverDataObjectsPerUserProfileDataDO(guidURL, schema, resources) {\n var _this3 = this,\n _arguments2 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this3.discoverDataObjectsPerUserProfileData.apply(_this3, _toConsumableArray(_arguments2)).then(function (registryObjects) {\n return resolve(_this3._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some GUID\r\n * @param {String} guidURL guid URL e.g user-guid://\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverHypertiesPerGUID\",\n value: function discoverHypertiesPerGUID(guidURL, schema, resources) {\n var _this = this;\n\n var filteredHyperties = [];\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/guid/' + guidURL\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n reply.body.value.map(function (hyperty) {\n if (hyperty.hypertyID != _this.discoveryURL) filteredHyperties.push(hyperty);\n });\n if (filteredHyperties.length === 0) reject('No Hyperty was found');else {\n Discovery_log.log(\"Reply log: \", filteredHyperties);\n resolve(filteredHyperties);\n }\n } else {\n Discovery_log.warn(\"[Discovery.discoverHypertiesPerGUID] Error Reply for \" + guidURL + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some GUID\r\n * returns DiscoveredObject\r\n * @param {String} guidURL guid URL e.g user-guid://\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverHypertiesPerGUIDDO\",\n value: function discoverHypertiesPerGUIDDO(guidURL, schema, resources) {\n var _this4 = this,\n _arguments3 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this4.discoverHypertiesPerGUID.apply(_this4, _toConsumableArray(_arguments3)).then(function (hyperties) {\n resolve(_this4._convertToDiscoveredObject(hyperties));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * Advanced Search for DataObjects registered in domain registry associated with some GUID\r\n * @param {String} guidURL guid URL e.g user-guid://\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjectsPerGUID\",\n value: function discoverDataObjectsPerGUID(guidURL, schema, resources) {\n var _this = this;\n\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/guid/' + guidURL\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjectsPerGUID] Error Reply for \" + guidURL + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} guidURL guid URL e.g user-guid://\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjectsPerGUIDDO\",\n value: function discoverDataObjectsPerGUIDDO(guidURL, schema, resources) {\n var _this5 = this,\n _arguments4 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this5.discoverDataObjectsPerGUID.apply(_this5, _toConsumableArray(_arguments4)).then(function (registryObjects) {\n return resolve(_this5._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /** Advanced Search for Hyperties registered in domain registry\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverHyperties\",\n value: function discoverHyperties(user, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n var filteredHyperties = [];\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/user/' + user\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n if (!_this._isLegacyUser(user)) {\n // todo: to reomve when discovery of legcay users are supported\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200 || reply.body.code === 500) {\n reply.body.value.map(function (hyperty) {\n if (hyperty.hypertyID != _this.discoveryURL) filteredHyperties.push(hyperty);\n });\n /* if(filteredHyperties.length === 0)\r\n reject('No Hyperty was found');\r\n else {*/\n\n Discovery_log.log(\"[Discovery.discoverHyperties] Reply : \", filteredHyperties);\n resolve(filteredHyperties); // }\n } else {\n Discovery_log.warn(\"[Discovery.discoverHyperties] Error Reply for \" + user + \" Reason: \", reply.body.description);\n resolve(filteredHyperties);\n }\n });\n } else {\n resolve([{\n hypertyID: user,\n status: 'live'\n }]);\n }\n });\n }\n /** Advanced Search for Hyperties registered in domain registry,\r\n *returns DiscoveredObject\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverHypertiesDO\",\n value: function discoverHypertiesDO(user, schema, resources, domain) {\n var _this6 = this,\n _arguments5 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this6.discoverHyperties.apply(_this6, _toConsumableArray(_arguments5)).then(function (hyperties) {\n resolve(_this6._convertToDiscoveredObject(hyperties));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /** Advanced Search for DataObjects registered in domain registry\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjects\",\n value: function discoverDataObjects(user, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/user/' + user\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjects] Error Reply for \" + user + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjectsDO\",\n value: function discoverDataObjectsDO(user, schema, resources, domain) {\n var _this7 = this,\n _arguments6 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this7.discoverDataObjects.apply(_this7, _toConsumableArray(_arguments6)).then(function (registryObjects) {\n return resolve(_this7._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * function to request about hyperties registered in domain registry, and\r\n * return the hyperty information, if found.\r\n * @param {String} url hyperty URL\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverHypertyPerURL\",\n value: function discoverHypertyPerURL(url, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/url/' + url,\n criteria: {\n domain: activeDomain\n }\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverHypertyPerURL] Error Reply for \" + url + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about hyperties registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} url hyperty URL\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverHypertyPerURLDO\",\n value: function discoverHypertyPerURLDO(url, domain) {\n var _this8 = this,\n _arguments7 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this8.discoverHypertyPerURL.apply(_this8, _toConsumableArray(_arguments7)).then(function (hyperty) {\n return resolve(new discovery_DiscoveredObject(hyperty, _this8.runtimeURL, _this8.discoveryURL, _this8.messageBus, _this8));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * return the dataObject information, if found.\r\n * @param {String} url dataObject URL\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectPerURL\",\n value: function discoverDataObjectPerURL(url, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/url/' + url,\n criteria: {\n domain: activeDomain\n }\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjectPerURL] Error Reply for \" + url + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} url dataObject URL\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectPerURLDO\",\n value: function discoverDataObjectPerURLDO(url, domain) {\n var _this9 = this,\n _arguments8 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this9.discoverDataObjectPerURL.apply(_this9, _toConsumableArray(_arguments8)).then(function (registryObject) {\n return resolve(new discovery_DiscoveredObject(registryObject, _this9.runtimeURL, _this9.discoveryURL, _this9.messageBus, _this9));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * function to request about an dataObjects registered in domain registry with a given name, and\r\n * return the dataObjects information, if found.\r\n * @param {String} name dataObject URL\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectsPerName\",\n value: function discoverDataObjectsPerName(name, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/name/' + name\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjectsPerName] Error Reply for \" + name + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} name dataObject URL\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectsPerNameDO\",\n value: function discoverDataObjectsPerNameDO(name, schema, resources, domain) {\n var _this10 = this,\n _arguments9 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this10.discoverDataObjectsPerName.apply(_this10, _toConsumableArray(_arguments9)).then(function (registryObjects) {\n return resolve(_this10._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * function to request about specific reporter dataObject registered in domain registry, and\r\n * return the dataObjects from that reporter.\r\n * @param {String} reporter dataObject reporter\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectsPerReporter\",\n value: function discoverDataObjectsPerReporter(reporter, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/reporter/' + reporter\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjectsPerName] Error Reply for \" + reporter + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} name dataObject URL\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectsPerReporterDO\",\n value: function discoverDataObjectsPerReporterDO(reporter, schema, resources, domain) {\n var _this11 = this,\n _arguments10 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this11.discoverDataObjectsPerReporter.apply(_this11, _toConsumableArray(_arguments10)).then(function (registryObjects) {\n return resolve(_this11._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n }, {\n key: \"_convertToDiscoveredObject\",\n value: function _convertToDiscoveredObject(registryObjects) {\n var _this12 = this;\n\n return registryObjects.map(function (registryObject) {\n return new discovery_DiscoveredObject(registryObject, _this12.runtimeURL, _this12.discoveryURL, _this12.messageBus, _this12);\n });\n }\n /** Advanced Search for dataObjects registered in domain registry\r\n * @deprecated Deprecated. Use discoverDataObjectsPerName instead\r\n * @param {String} name name of the dataObject\r\n * @param {Array} schema (Optional) types of dataObject schemas\r\n * @param {Array} resources (Optional) types of dataObject resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObject\",\n value: function discoverDataObject(name, schema, resources, domain) {\n var _this = this;\n\n var activeDomain; //let userIdentifier = convertToUserURL(user);\n\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: name,\n criteria: {\n resources: resources,\n dataSchemes: schema\n }\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n Discovery_log.log('[Discovery]', reply);\n\n if (reply.body.code > 299) {\n Discovery_log.warn(\"[Discovery.discoverDataObject] Error Reply for \" + name + \" Reason: \", reply.body.description);\n return resolve([]);\n }\n\n var hyperties = reply.body.value;\n\n if (hyperties) {\n resolve(hyperties);\n } else {\n resolve([]);\n }\n });\n });\n }\n /** Advanced Search for Hyperties registered in domain registry\r\n * @deprecated Deprecated. Use discoverHyperties instead\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverHyperty\",\n value: function discoverHyperty(user, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n var userIdentifier = convertToUserURL(user);\n\n if (!domain) {\n activeDomain = _this.domain;\n } else {\n activeDomain = domain;\n }\n\n return new Promise(function (resolve, reject) {\n Discovery_log.log('[Discovery.discoverHyperty] ACTIVE DOMAIN -> ', activeDomain, 'user->', user, 'schema->', schema, 'resources->', resources, 'domain->', domain);\n\n if (user.includes(':') && !user.includes('user://')) {\n Discovery_log.log('[Discovery.discoverHyperty] ' + user + ' is legacy domain');\n var legacyUser = {\n userID: user,\n hypertyID: user,\n schema: schema,\n resources: resources\n };\n return resolve(legacyUser);\n }\n\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: userIdentifier,\n criteria: {\n resources: resources,\n dataSchemes: schema\n }\n }\n };\n Discovery_log.info('[Discovery] msg to send->', msg);\n\n _this.messageBus.postMessage(msg, function (reply) {\n Discovery_log.info('[Discovery] ON discoverHyperty->', reply);\n var hyperties = reply.body.value;\n\n if (hyperties) {\n resolve(hyperties);\n } else {\n reject('No Hyperty was found');\n }\n });\n });\n }\n /**\r\n * function to request about users registered in domain registry, and\r\n * return the last hyperty instance registered by the user.\r\n * @deprecated Deprecated. Use discoverHyperty instead\r\n * @param {email} email\r\n * @param {domain} domain (Optional)\r\n */\n\n }, {\n key: \"discoverHypertyPerUser\",\n value: function discoverHypertyPerUser(email, domain) {\n var _this = this;\n\n var activeDomain;\n return new Promise(function (resolve, reject) {\n // Hack for legacy users\n if (email.includes(':') && !email.includes('user://')) {\n Discovery_log.log('[Discovery.discoverHyperty] ' + email + 'is legacy domain');\n var legacyUser = {\n id: email,\n hypertyURL: email,\n descriptor: 'unknown'\n };\n return resolve(legacyUser);\n }\n\n if (!domain) {\n activeDomain = _this.domain;\n } else {\n activeDomain = domain;\n }\n\n var identityURL = 'user://' + email.substring(email.indexOf('@') + 1, email.length) + '/' + email.substring(0, email.indexOf('@')); // message to query domain registry, asking for a user hyperty.\n\n var message = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: identityURL\n }\n };\n Discovery_log.info('[Discovery] Message: ', message, activeDomain, identityURL); //log.info('[Discovery] message READ', message);\n\n _this.messageBus.postMessage(message, function (reply) {\n Discovery_log.info('[Discovery] message reply', reply);\n var hyperty;\n var mostRecent;\n var lastHyperty;\n var value = reply.body.value;\n\n for (hyperty in value) {\n if (value[hyperty].lastModified !== undefined) {\n if (mostRecent === undefined) {\n mostRecent = new Date(value[hyperty].lastModified);\n lastHyperty = hyperty;\n } else {\n var hypertyDate = new Date(value[hyperty].lastModified);\n\n if (mostRecent.getTime() < hypertyDate.getTime()) {\n mostRecent = hypertyDate;\n lastHyperty = hyperty;\n }\n }\n }\n }\n\n Discovery_log.info('[Discovery] Last Hyperty: ', lastHyperty, mostRecent);\n var hypertyURL = lastHyperty;\n\n if (hypertyURL === undefined) {\n return reject('User Hyperty not found');\n }\n\n var idPackage = {\n id: email,\n descriptor: value[hypertyURL].descriptor,\n hypertyURL: hypertyURL\n };\n Discovery_log.info('[Discovery] ===> hypertyDiscovery messageBundle: ', idPackage);\n resolve(idPackage);\n });\n });\n }\n /**\r\n * function to request about users registered in domain registry, and\r\n * return the all the hyperties registered by the user\r\n * @deprecated Deprecated. Use discoverHyperty instead\r\n * @param {email} email\r\n * @param {domain} domain (Optional)\r\n */\n\n }, {\n key: \"discoverHypertiesPerUser\",\n value: function discoverHypertiesPerUser(email, domain) {\n var _this = this;\n\n var activeDomain;\n Discovery_log.log('on Function->', email);\n return new Promise(function (resolve, reject) {\n if (email.includes(':') && !email.includes('user://')) {\n Discovery_log.log('[Discovery.discoverHyperty] is legacy domain');\n var legacyUser = {\n userID: email,\n hypertyID: email,\n schema: schema,\n resources: resources\n };\n return resolve(legacyUser);\n }\n\n if (!domain) {\n activeDomain = _this.domain;\n } else {\n activeDomain = domain;\n }\n\n var identityURL = 'user://' + email.substring(email.indexOf('@') + 1, email.length) + '/' + email.substring(0, email.indexOf('@')); // message to query domain registry, asking for a user hyperty.\n\n var message = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: identityURL\n }\n };\n Discovery_log.log('[Discovery] Message discoverHypertiesPerUser: ', message, activeDomain, identityURL); //log.info('[Discovery] message READ', message);\n\n _this.messageBus.postMessage(message, function (reply) {\n Discovery_log.info('[Discovery] discoverHypertiesPerUser reply', reply);\n var value = reply.body.value;\n\n if (!value) {\n return reject('User Hyperty not found');\n }\n\n resolve(value);\n });\n });\n }\n /**\r\n * function to request about users registered in domain registry, and\r\n * return the all the hyperties registered by the user\r\n * @deprecated Deprecated. Use discoverHyperty instead\r\n * @param {email} email\r\n * @param {domain} domain (Optional)\r\n */\n\n }, {\n key: \"resumeDiscoveries\",\n value: function resumeDiscoveries() {\n var _this = this;\n\n Discovery_log.log('[Discovery] resumeDiscoveries');\n return new Promise(function (resolve, reject) {\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/subscriptions',\n body: {\n resource: _this.discoveryURL\n }\n };\n\n _this.messageBus.postMessage(msg, function (reply) {\n Discovery_log.log('[Discovery.resumeDiscoveries] reply: ', reply);\n var notifications = [];\n\n if (reply.body.code === 200) {\n var urls = reply.body.value; // URLs to add listeners to\n //lets create one DiscoveryObject per notification\n\n urls.forEach(function (url) {\n var objectUrl = url.split('/registration')[0];\n var data = {};\n data.url = objectUrl;\n Discovery_log.log('[Discovery.resumeDiscoveries] adding listener to: ', objectUrl);\n\n if (objectUrl.includes('hyperty://')) {\n notifications.push(_this.discoverHypertyPerURLDO(objectUrl));\n } else {\n notifications.push(_this.discoverDataObjectPerURLDO(objectUrl));\n }\n });\n Promise.all(notifications).then(function (values) {\n resolve(values);\n });\n } else {\n resolve([]);\n }\n });\n });\n }\n }]);\n\n return Discovery;\n}();\n\n/* harmony default export */ var discovery_Discovery = (Discovery_Discovery);\n// CONCATENATED MODULE: ./src/utils/Search.js\nfunction Search_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Search_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Search_createClass(Constructor, protoProps, staticProps) { if (protoProps) Search_defineProperties(Constructor.prototype, protoProps); if (staticProps) Search_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar Search =\n/*#__PURE__*/\nfunction () {\n function Search(discovery, identityManager) {\n Search_classCallCheck(this, Search);\n\n if (!discovery) throw new Error('The discovery component is a needed parameter');\n if (!identityManager) throw new Error('The identityManager component is a needed parameter');\n\n var _this = this;\n\n _this.discovery = discovery;\n _this.identityManager = identityManager;\n }\n\n Search_createClass(Search, [{\n key: \"myIdentity\",\n value: function myIdentity() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.identityManager.discoverUserRegistered().then(function (result) {\n resolve(result);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"hyperties\",\n value: function hyperties(users, schemes, resources) {\n var globalFlag = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n } //TODO: reuse users or the other way around\n\n /**\r\n * List of usersURL to search\r\n * @param {array} users List of UserUR, like this format user:///\r\n * @return {Promise}\r\n */\n\n }, {\n key: \"users\",\n value: function users(usersURLs, providedDomains, schemes, resources) {\n var globalFlag = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n if (!usersURLs) throw new Error('You need to provide a list of users');\n if (!providedDomains) throw new Error('You need to provide a list of domains');\n if (!resources) throw new Error('You need to provide a list of resources');\n if (!schemes) throw new Error('You need to provide a list of schemes');\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.info('[Search] Users: ', usersURLs, usersURLs.length);\n console.info('[Search] Domains: ', providedDomains, providedDomains.length);\n\n if (usersURLs.length === 0) {\n console.info('Don\\'t have users to discovery');\n resolve(usersURLs);\n } else {\n var getUsers = [];\n usersURLs.forEach(function (userURL, index) {\n var currentDomain = providedDomains[index];\n console.info('[Search] Search user ' + userURL + ' for provided domain:', currentDomain);\n\n if (!globalFlag) {\n getUsers.push(_this.discovery.discoverHyperties(userURL, schemes, resources, currentDomain));\n } else {\n getUsers.push(_this.discovery.discoverHypertiesPerUserProfileData(userURL, schemes, resources));\n }\n });\n console.info('Requests promises: ', getUsers);\n Promise.all(getUsers.map(function (promise) {\n return promise.then(function (hyperty) {\n return hyperty;\n }, function (error) {\n return error;\n });\n })).then(function (hyperties) {\n console.info('[Search] Hyperties from new Discovery', hyperties);\n var result = hyperties.map(function (hyperty) {\n if (hyperty.hasOwnProperty('hypertyID')) return hyperty;\n var recent = Object.keys(hyperty).reduceRight(function (a, b) {\n var hypertyDate = new Date(hyperty[b].lastModified);\n var hypertyDateP = new Date(hyperty[a].lastModified);\n\n if (hypertyDateP.getTime() < hypertyDate.getTime()) {\n return b;\n }\n\n return a;\n });\n return hyperty[recent];\n });\n var clean = result.filter(function (hyperty) {\n return hyperty.hasOwnProperty('hypertyID');\n });\n console.log('Requests result: ', clean);\n hyperties.forEach(function (entry) {\n if (entry !== 'No Hyperty was found') {\n return resolve(clean);\n }\n });\n reject('No Hyperty was found');\n }).catch(function (reason) {\n console.error(reason);\n resolve(usersURLs);\n });\n }\n });\n }\n }]);\n\n return Search;\n}();\n\n/* harmony default export */ var utils_Search = (Search);\n// CONCATENATED MODULE: ./src/utils/EventEmitter.js\nfunction EventEmitter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction EventEmitter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction EventEmitter_createClass(Constructor, protoProps, staticProps) { if (protoProps) EventEmitter_defineProperties(Constructor.prototype, protoProps); if (staticProps) EventEmitter_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * EventEmitter\r\n * All classes which extends this, can have addEventListener and trigger events;\r\n */\nvar EventEmitter =\n/*#__PURE__*/\nfunction () {\n function EventEmitter() {\n EventEmitter_classCallCheck(this, EventEmitter);\n }\n\n EventEmitter_createClass(EventEmitter, [{\n key: \"addEventListener\",\n\n /**\r\n * addEventListener listen for an eventType\r\n * @param {string} eventType - listening for this type of event\r\n * @param {Function} cb - callback function will be executed when the event it is invoked\r\n */\n value: function addEventListener(eventType, cb) {\n var _this = this;\n\n _this[eventType] = cb;\n }\n /**\r\n * Invoke the eventType\r\n * @param {string} eventType - event will be invoked\r\n * @param {object} params - parameters will be passed to the addEventListener\r\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(eventType, params) {\n var _this = this;\n\n if (_this[eventType]) {\n _this[eventType](params);\n }\n }\n }]);\n\n return EventEmitter;\n}();\n\n/* harmony default export */ var utils_EventEmitter = (EventEmitter);\n// CONCATENATED MODULE: ./src/contextManager/ContextObserver.js\nfunction ContextObserver_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { ContextObserver_typeof = function _typeof(obj) { return typeof obj; }; } else { ContextObserver_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return ContextObserver_typeof(obj); }\n\nfunction ContextObserver_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ContextObserver_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ContextObserver_createClass(Constructor, protoProps, staticProps) { if (protoProps) ContextObserver_defineProperties(Constructor.prototype, protoProps); if (staticProps) ContextObserver_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction ContextObserver_possibleConstructorReturn(self, call) { if (call && (ContextObserver_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return ContextObserver_assertThisInitialized(self); }\n\nfunction ContextObserver_getPrototypeOf(o) { ContextObserver_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ContextObserver_getPrototypeOf(o); }\n\nfunction ContextObserver_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ContextObserver_setPrototypeOf(subClass, superClass); }\n\nfunction ContextObserver_setPrototypeOf(o, p) { ContextObserver_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ContextObserver_setPrototypeOf(o, p); }\n\nfunction ContextObserver_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n//import IdentityManager from '../identityManager/IdentityManager';\n//import Syncher from '../syncher/Syncher.js';\n//import Discovery from '../discovery/Discovery.js';\n//import {divideURL} from '../utils/utils';\n//import Search from '../utils/Search';\n\n/**\r\n* Context Observer;\r\n* @author Paulo Chainho [paulo-g-chainho@alticelabs.com]\r\n*/\n\nvar ContextObserver =\n/*#__PURE__*/\nfunction (_EventEmitter) {\n ContextObserver_inherits(ContextObserver, _EventEmitter);\n\n function ContextObserver(hypertyURL, bus, configuration, contextResourceTypes, factory, syncher) {\n var _this2;\n\n ContextObserver_classCallCheck(this, ContextObserver);\n\n if (!hypertyURL) throw new Error('The hypertyURL is a needed parameter');\n if (!bus) throw new Error('The MiniBus is a needed parameter');\n if (!configuration) throw new Error('The configuration is a needed parameter ');\n if (!factory) throw new Error('The factory is a needed parameter ');\n _this2 = ContextObserver_possibleConstructorReturn(this, ContextObserver_getPrototypeOf(ContextObserver).call(this));\n\n var _this = ContextObserver_assertThisInitialized(ContextObserver_assertThisInitialized(_this2));\n\n _this._contextResourceTypes = contextResourceTypes;\n _this._url = hypertyURL;\n _this._discoverUsersPromises = {}; // object with promises executed at discoverUsers function\n\n _this._observePromises = {}; // object with promises executed at observe function\n //let identityManager = new IdentityManager(hypertyURL, configuration.runtimeURL, bus);\n\n console.log('[ContextObserver] started with hypertyURL->', hypertyURL);\n _this._domain = factory.divideURL(configuration.runtimeURL).domain;\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + _this._domain + '/.well-known/dataschema/Context';\n _this._users2observe = [];\n _this._observers = {};\n _this2._syncher = syncher ? syncher : factory.createSyncher(hypertyURL, bus, configuration);\n var discovery = factory.createDiscovery(hypertyURL, configuration.runtimeURL, bus);\n _this._discovery = discovery;\n _this._discoveries = {}; //list of discovered objects\n //_this.identityManager = identityManager;\n //_this.search = new Search(discovery, identityManager);\n\n window.discovery = _this._discovery;\n return _this2;\n }\n\n ContextObserver_createClass(ContextObserver, [{\n key: \"start\",\n value: function start(resumedContext, disconnectedCallBack) {\n var _this = this;\n\n console.log('[ContextObserver.start] ');\n return new Promise(function (resolve, reject) {\n _this._syncher.resumeObservers({\n store: true\n }).then(function (observers) {\n var observersList = Object.keys(observers);\n\n if (observersList.length > 0) {\n console.log('[ContextObserver.start] resuming: ', observers);\n /*observersList.forEach((i)=>{\r\n _this._users2observe.push(new UserAvailabilityController(observers[i]));\r\n });*/\n\n _this._observers = observers;\n resolve(observers);\n observersList.forEach(function (observer) {\n var Context = observers[observer]; // By default resumed context is set with resumedContext.\n\n if (resumedContext) context.data.values = resumedContext; // Context will will be updated with value synchronized with reporter if connected\n\n Context.sync(); //Add listener to be notified when reporter is abruptly disconnected\n\n if (disconnectedCallBack) Context.onDisconnected(disconnectedCallBack);\n });\n } else {\n resolve(false);\n }\n }).catch(function (reason) {\n console.info('[ContextObserver] Resume Observer failed | ', reason);\n resolve(false);\n });\n }).catch(function (reason) {\n reject('[ContextObserver] Start failed | ', reason);\n });\n }\n }, {\n key: \"resumeDiscoveries\",\n value: function resumeDiscoveries() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._discovery.resumeDiscoveries().then(function (discoveries) {\n console.log('[ContextObserver._resumeDiscoveries] found: ', discoveries);\n discoveries.forEach(function (discovery) {\n if (discovery.data.resources && discovery.data.resources[0] === _this._contextResourceTypes[0]) {\n console.log('[ContextObserver._resumeDiscoveries] resuming: ', discovery);\n\n if (discovery.data.status === 'live') {\n // previously discovered object is now live\n resolve([discovery.data]);\n discovery.unsubscribeLive(_this._url);\n } else {\n // previously discovered object is still disconnected\n discovery.onLive(_this._url, function () {\n console.log('[ContextObserver._resumeDiscoveries] disconnected Hyperty is back to live', discovery);\n resolve([discovery.data]);\n discovery.unsubscribeLive(_this._url);\n });\n }\n }\n });\n });\n }).catch(function (reason) {\n reject('[ContextObserver] resumeDiscoveries failed | ', reason);\n });\n }\n }, {\n key: \"onResumeObserver\",\n value: function onResumeObserver(callback) {\n var _this = this;\n\n _this._onResumeObserver = callback;\n }\n }, {\n key: \"discoverUsers\",\n value: function discoverUsers(email, domain) {\n var _this = this;\n\n var user = email + '@' + domain;\n\n if (!_this._discoverUsersPromises[user]) {\n _this._discoverUsersPromises[user] = new Promise(function (resolve, reject) {\n _this._discovery.discoverHypertiesDO(email, ['context'], _this._contextResourceTypes, domain).then(function (hyperties) {\n //_this.search.users([email], [domain], ['context'], ['Context_context']).then(function(a) {\n console.log('[ContextObserver.discoverUsers] discovery result->', hyperties);\n var discovered = [];\n var disconnected = [];\n hyperties.forEach(function (hyperty) {\n _this._discoveries[hyperty.data.hypertyID] = hyperty;\n\n if (hyperty.data.status === 'live') {\n discovered.push(hyperty.data);\n } else {\n disconnected.push(hyperty);\n }\n });\n\n if (discovered.length > 0) {\n console.log('[ContextObserver.discoverUsers] returning discovered hyperties data->', discovered);\n resolve(discovered);\n } else if (disconnected.length > 0) {\n console.log('[ContextObserver.discoverUsers] disconnected Hyperties ', disconnected); //resolve([]);\n\n disconnected[0].onLive(_this._url, function () {\n console.log('[ContextObserver.discoverUsers] disconnected Hyperty is back to live', disconnected[0]);\n discovered.push(disconnected[0].data);\n resolve(discovered);\n disconnected[0].unsubscribeLive(_this._url);\n });\n }\n });\n });\n }\n\n return _this._discoverUsersPromises[user];\n }\n /**\r\n * This function is used to start the user Context observation for a certain user Context reporter\r\n * @param {DiscoveredObject} hyperty Hyperty to be observed.\r\n * @return { DataObjectObserver} It returns as a Promise the UserAvailability Data Object Observer.\r\n */\n\n }, {\n key: \"observe\",\n value: function observe(hyperty) {\n var domainSubscription = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var _this = this;\n\n if (!_this._observePromises[hyperty.hypertyID]) {\n _this._observePromises[hyperty.hypertyID] = new Promise(function (resolve, reject) {\n //check if we are already observing it\n _this._users2observe.forEach(function (Context) {\n if (Context._reporter === hyperty.hypertyID) return resolve(Context);\n });\n\n _this._discovery.discoverDataObjectsPerReporter(hyperty.hypertyID, ['context'], _this._contextResourceTypes, _this._domain).then(function (dataObjects) {\n console.log('[ContextObserver.discoverAvailability] discovered context objects ', dataObjects);\n var last = 0;\n var url;\n dataObjects.forEach(function (dataObject) {\n if (dataObject.hasOwnProperty('lastModified') && dataObject.hasOwnProperty('url') && Date.parse(dataObject.lastModified) > last) {\n last = dataObject.lastModified;\n url = dataObject.url; //console.log('URL DATA Object', url);\n }\n });\n\n if (last != 0 && url) {\n resolve(_this._subscribeContext(hyperty, url, domainSubscription));\n } else {\n reject('[ContextObserver.observe] discovered DataObjecs are invalid', dataObjects);\n }\n });\n });\n }\n\n return _this._observePromises[hyperty.hypertyID];\n }\n }, {\n key: \"_subscribeContext\",\n value: function _subscribeContext(hyperty, url) {\n var domainSubscription = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var _this = this; // avoid duplicated subscriptions\n\n\n return new Promise(function (resolve, reject) {\n _this._users2observe.forEach(function (Context) {\n if (Context.url === url) return resolve(Context);\n });\n\n var input = {\n schema: _this._objectDescURL,\n resource: url,\n store: null,\n p2p: null,\n mutual: null,\n domain_subscription: domainSubscription\n };\n\n _this._syncher.subscribe(input).then(function (Context) {\n console.log('[ContextObserver._subscribeContext] observer object', Context); //let newUserAvailability = new UserAvailabilityController(Context, userID);\n\n _this._users2observe.push(Context); // When Object is disconnected set user Context status as unavailable\n\n\n Context.onDisconnected(function () {\n console.log('[ContextObserver.onDisconnected]: ', Context);\n Context.data.values[0].value = 'unavailable';\n Context.sync();\n });\n resolve(Context);\n });\n });\n }\n }, {\n key: \"_discoverAndSubscribeLegacyUsers\",\n value: function _discoverAndSubscribeLegacyUsers(name) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._discovery.discoverDataObjectsPerName(name).then(function (result) {\n console.log('[ContextObserver._discoverAndSubscribeLegacyUsers] All DataObjects Result', result);\n result.forEach(function (obj) {\n if (obj.status === 'live') {\n console.log('Live obj', obj);\n\n if (!obj.hypertyID) {\n obj.hypertyID = obj.reporter;\n }\n\n _this._subscribeContext(obj.schema, obj.url).then(function (resultSubscribe) {\n console.log('[ContextObserver._discoverAndSubscribeLegacyUsers] _subscribeContext', resultSubscribe);\n return resolve(resultSubscribe);\n });\n }\n });\n }).catch(function (err) {\n console.log('error ', err);\n });\n });\n }\n /**\r\n * This function is used to stop the user Context observation for a certain user\r\n * @param {string} Context the UserAvailability Data Object Observer URL to be unobserved.\r\n */\n\n }, {\n key: \"unobserve\",\n value: function unobserve(Context) {\n var _this = this;\n\n _this._users2observe.forEach(function (user, index) {\n if (user.url === Context) {\n user.unsubscribe();\n\n _this._users2observe.splice(index, 1);\n }\n });\n }\n }]);\n\n return ContextObserver;\n}(utils_EventEmitter);\n\n/* harmony default export */ var contextManager_ContextObserver = (ContextObserver);\n// CONCATENATED MODULE: ./src/contextManager/ContextReporter.js\nfunction ContextReporter_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { ContextReporter_typeof = function _typeof(obj) { return typeof obj; }; } else { ContextReporter_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return ContextReporter_typeof(obj); }\n\nfunction ContextReporter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ContextReporter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ContextReporter_createClass(Constructor, protoProps, staticProps) { if (protoProps) ContextReporter_defineProperties(Constructor.prototype, protoProps); if (staticProps) ContextReporter_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction ContextReporter_possibleConstructorReturn(self, call) { if (call && (ContextReporter_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return ContextReporter_assertThisInitialized(self); }\n\nfunction ContextReporter_getPrototypeOf(o) { ContextReporter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ContextReporter_getPrototypeOf(o); }\n\nfunction ContextReporter_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ContextReporter_setPrototypeOf(subClass, superClass); }\n\nfunction ContextReporter_setPrototypeOf(o, p) { ContextReporter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ContextReporter_setPrototypeOf(o, p); }\n\nfunction ContextReporter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Service Framework\n//import Syncher from '../syncher/Syncher';\n// Utils\n //import {divideURL} from '../utils/utils.js';\n// import availability from './availability.js';\n\n/**\r\n* Context Reporter;\r\n* @author Paulo Chainho [paulo-g-chainho@alticelabs.com]\r\n*/\n\nvar ContextReporter =\n/*#__PURE__*/\nfunction (_EventEmitter) {\n ContextReporter_inherits(ContextReporter, _EventEmitter);\n\n function ContextReporter(hypertyURL, bus, configuration, factory, syncher) {\n var _this2;\n\n ContextReporter_classCallCheck(this, ContextReporter);\n\n if (!hypertyURL) throw new Error('The hypertyURL is a needed parameter');\n if (!bus) throw new Error('The MiniBus is a needed parameter');\n if (!configuration) throw new Error('The configuration is a needed parameter');\n _this2 = ContextReporter_possibleConstructorReturn(this, ContextReporter_getPrototypeOf(ContextReporter).call(this, hypertyURL, bus, configuration));\n\n var _this = ContextReporter_assertThisInitialized(ContextReporter_assertThisInitialized(_this2));\n\n console.info('[ContextReporter] started with url: ', hypertyURL);\n _this2.syncher = syncher ? syncher : factory.createSyncher(hypertyURL, bus, configuration); // this.discovery = new Discovery(hypertyURL, bus);\n\n _this2.domain = factory.divideURL(configuration.runtimeURL).domain;\n _this2.contexts = {};\n _this2.contextDescURL = 'hyperty-catalogue://catalogue.' + _this2.domain + '/.well-known/dataschema/Context'; // this.heartbeat = [];\n\n _this2.syncher.onNotification(function (event) {\n var _this = ContextReporter_assertThisInitialized(ContextReporter_assertThisInitialized(_this2));\n\n _this.onNotification(event);\n }); //TODO: uncomment when used with service framework develop branch\n\n\n _this2.syncher.onClose(function (event) {\n console.log('[ContextReporter.onClose]');\n\n var _this = ContextReporter_assertThisInitialized(ContextReporter_assertThisInitialized(_this2));\n\n _this.setStatus(event.id, 'unavailable');\n\n event.ack();\n });\n\n return _this2;\n } //TODO: move to User availability Reporter or to abstract HypertyContextReporter\n\n\n ContextReporter_createClass(ContextReporter, [{\n key: \"start\",\n value: function start() {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this3.syncher.resumeReporters({\n store: true\n }).then(function (reporters) {\n var reportersList = Object.keys(reporters);\n\n if (reportersList.length > 0) {\n console.log('[ContextReporter.start] resuming ', reporters[reportersList[0]]); // set availability to available\n\n _this.contexts = reporters; //TODO:\n\n reportersList.forEach(function (context) {\n _this._onSubscription(_this.contexts[context]);\n });\n resolve(_this.contexts);\n } else {\n console.log('[ContextReporter.start] nothing to resume ', reporters);\n resolve(false);\n }\n }).catch(function (reason) {\n console.error('[ContextReporter] Resume failed | ', reason);\n });\n }).catch(function (reason) {\n reject('[ContextReporter] Start failed | ', reason);\n });\n }\n }, {\n key: \"processNotification\",\n value: function processNotification(event) {\n var _this = this;\n\n console.log('[ContextReporter.processNotification: ', event);\n event.ack();\n }\n /**\r\n * This function is used to create a new status object syncher\r\n * @param {URL.UserURL} contacts List of Users\r\n * @return {Promise}\r\n */\n\n }, {\n key: \"create\",\n value: function create(id, init, resources) {\n var name = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'myContext';\n var reporter = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n var reuseURL = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;\n\n //debugger;\n var _this = this;\n\n var input;\n return new Promise(function (resolve, reject) {\n if (!reporter && !reuseURL) {\n input = {\n resources: resources,\n expires: 30\n };\n } else if (reporter && !reuseURL) {\n input = {\n resources: resources,\n expires: 30,\n reporter: reporter\n };\n } else if (!reporter && reuseURL) {\n input = {\n resources: resources,\n expires: 30,\n reuseURL: reuseURL\n };\n } else {\n input = {\n resources: resources,\n expires: 30,\n reuseURL: reuseURL,\n reporter: reporter\n };\n }\n\n console.info('[ContextReporter.create] lets create a new User availability Context Object ', input);\n\n _this.syncher.create(_this.contextDescURL, [], init, true, false, name, null, input).then(function (context) {\n _this.contexts[id] = context;\n\n _this._onSubscription(context);\n\n resolve(context);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"_onSubscription\",\n value: function _onSubscription(context) {\n context.onSubscription(function (event) {\n console.info('[ContextReporter._onSubscription] accepting: ', event);\n event.accept();\n });\n }\n }, {\n key: \"setContext\",\n value: function setContext(id, newContext) {\n var _this = this;\n\n console.log('THIS [ContextReporter.setContext] before change :', _this.contexts[id]);\n console.log('[ContextReporter.setContext] before change :', _this.contexts[id].data); // _this.contexts[id].data.values[0].value = newContext;\n\n _this.contexts[id].data.values = newContext;\n console.debug('[ContextReporter.setContext] after change :', _this.contexts[id].data);\n\n _this.trigger(id + '-context-update', newContext);\n }\n }]);\n\n return ContextReporter;\n}(utils_EventEmitter);\n\n/* harmony default export */ var contextManager_ContextReporter = (ContextReporter);\n// CONCATENATED MODULE: ./src/identity/UserProfile.js\nfunction UserProfile_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\r\n* The UserProfile according to User Identity Data Model\r\n*/\nvar UserProfile = function UserProfile(username, userURL, picture, name, locale, profile) {\n UserProfile_classCallCheck(this, UserProfile);\n\n if (username) {\n this.preferred_username = username;\n }\n\n if (picture) {\n this.picture = picture;\n }\n\n if (name) {\n this.name = name;\n }\n\n if (locale) {\n this.locale = locale;\n }\n\n if (userURL) {\n this.userURL = userURL;\n }\n\n if (profile) Object.assign(this, profile);\n};\n\n/* harmony default export */ var identity_UserProfile = (UserProfile);\n// CONCATENATED MODULE: ./src/identity/MessageBodyIdentity.js\nfunction MessageBodyIdentity_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\r\n* The Identity info to be added to Message.Body.Identity\r\n*/\n\n\nvar MessageBodyIdentity_MessageBodyIdentity = function MessageBodyIdentity(username, userURL, picture, name, locale, idp, assertion, profile) {\n MessageBodyIdentity_classCallCheck(this, MessageBodyIdentity);\n\n if (!idp) throw new Error('IDP should be a parameter');\n if (!username) throw new Error('username should be a parameter');\n this.idp = idp;\n\n if (assertion) {\n this.assertion = assertion;\n }\n\n this.userProfile = new identity_UserProfile(username, userURL, picture, name, locale, profile);\n};\n\n/* harmony default export */ var identity_MessageBodyIdentity = (MessageBodyIdentity_MessageBodyIdentity);\n// CONCATENATED MODULE: ./src/chatManager/communication.js\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\nvar CommunicationStatus = {\n OPEN: 'open',\n PENDING: 'pending',\n CLOSED: 'closed',\n PAUSED: 'paused',\n FAILED: 'failed'\n};\nvar communicationObject = {\n startingTime: '',\n status: '',\n participants: {}\n};\nvar communicationChildren = {\n \"parent\": \"communication\",\n \"listener\": \"resources\",\n \"type\": \"HypertyResource\"\n};\n/*\r\nexport let communicationObject = {\r\n id: '',\r\n name: '',\r\n owner: '',\r\n scheme: 'comm',\r\n startingTime: '',\r\n lastModified: '',\r\n duration: '',\r\n status: '',\r\n participants: []\r\n};\r\n*/\n// CONCATENATED MODULE: ./src/chatManager/InvitationsHandler.js\nfunction InvitationsHandler_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction InvitationsHandler_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction InvitationsHandler_createClass(Constructor, protoProps, staticProps) { if (protoProps) InvitationsHandler_defineProperties(Constructor.prototype, protoProps); if (staticProps) InvitationsHandler_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* To manage Group Chat Invitations\r\n* @author Paulo Chainho [paulo-g-chainho@alticelabs.com]\r\n* @version 0.1.0\r\n*/\n// TODO: have an instance per ChatController\nvar InvitationsHandler =\n/*#__PURE__*/\nfunction () {\n function InvitationsHandler(hypertyURL) {\n InvitationsHandler_classCallCheck(this, InvitationsHandler);\n\n if (!hypertyURL) throw Error('hypertyURL is a necessary dependecy');\n\n var _this = this;\n\n _this._hypertyURL = hypertyURL;\n _this._pending = {}; // All pending invitations\n }\n\n InvitationsHandler_createClass(InvitationsHandler, [{\n key: \"inviteDisconnectedHyperties\",\n\n /**\r\n * This function is used to handle notifications for disconnected Hy+erties.\r\n * @param {DiscoveredObject[]} disconnected array of discovered hyperties that are disconnected\r\n * @param {DataObjectReporter} DataObjectReporter Data Object Reporter addressed by invitations\r\n */\n value: function inviteDisconnectedHyperties(disconnected, dataObjectReporter) {\n var _this = this;\n\n console.log('[GroupChatManager.InvitationsHandler.inviteDisconnectedHyperties] lets invite ', disconnected);\n disconnected.forEach(function (disconnectedHyperty) {\n if (!_this._pending[dataObjectReporter]) {\n _this._pending[dataObjectReporter] = {};\n }\n\n _this._pending[dataObjectReporter][disconnectedHyperty.data.hypertyID] = disconnectedHyperty;\n disconnectedHyperty.onLive(_this._hypertyURL, function () {\n console.log('[GroupChatManager.create] disconnected Hyperty is back to live', disconnectedHyperty);\n dataObjectReporter.inviteObservers([disconnectedHyperty.data.hypertyID]);\n disconnectedHyperty.unsubscribeLive(_this._hypertyURL);\n delete _this._pending[dataObjectReporter][disconnectedHyperty.data.hypertyID];\n });\n });\n }\n /**\r\n * This function is used to process sent invitations. In case invitations are not acknowledge by recipient it will be handled as a disconnected hyperty\r\n * @param {DiscoveredObject[]} live array of discovered hyperties that are or were live\r\n * @param {DataObjectReporter} DataObjectReporter Data Object Reporter addressed by invitations\r\n */\n\n }, {\n key: \"processInvitations\",\n value: function processInvitations(live, dataObjectReporter) {\n var _this2 = this;\n\n var _this = this;\n\n var invitations = dataObjectReporter.invitations || [];\n console.log('[GroupChatManager.InvitationsHandler.processInvitations] waiting for replies ', invitations, this._invitationsResponse);\n invitations.forEach(function (invitation) {\n invitation.then(function (result) {\n console.log('[GroupChatManager.InvitationsHandler.processInvitations] - OK: ', result, _this2._invitationsResponse);\n\n if (_this2._invitationsResponse) {\n _this2._invitationsResponse(result);\n }\n }).catch(function (result) {\n console.log('[GroupChatManager.InvitationsHandler.processInvitations] - NOT OK: ', result, _this2._invitationsResponse);\n\n if (_this2._invitationsResponse) {\n _this2._invitationsResponse(result);\n }\n\n _this.inviteDisconnectedHyperties([live[result.invited]], dataObjectReporter);\n });\n });\n }\n }, {\n key: \"resumeDiscoveries\",\n value: function resumeDiscoveries(discoveryEngine, groupChat) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var live = {};\n var liveHyperties = [];\n var disconnected = [];\n var unsubscriptonPromises = [];\n discoveryEngine.resumeDiscoveries().then(function (discoveries) {\n console.log('[GroupChatManager.InvitationsHandler.resumeDiscoveries] found: ', discoveries);\n discoveries.forEach(function (discovery) {\n if (discovery.data.resources && discovery.data.resources[0] === 'chat') {\n console.log('[GroupChatManager.InvitationsHandler.resumeDiscoveries] resuming: ', discovery);\n\n if (discovery.data.status === 'live') {\n // previously discovered object is now live\n live[discovery.data.hypertyID] = discovery;\n liveHyperties.push(discovery.data.hypertyID);\n unsubscriptonPromises.push(discovery.unsubscribeLive(_this._hypertyURL));\n } else {\n // previously discovered object is still disconnected\n disconnected.push(discovery);\n }\n }\n });\n if (disconnected.length > 0) _this.inviteDisconnectedHyperties(disconnected, groupChat);\n\n if (Object.keys(live).length > 0) {\n groupChat.inviteObservers(liveHyperties);\n if (groupChat.invitations.length > 0) _this.processInvitations(live, groupChat);\n Promise.all(unsubscriptonPromises).then(function () {\n resolve();\n });\n } else resolve();\n });\n }).catch(function (reason) {\n reject('[GroupChatManager.InvitationsHandler.resumeDiscoveries] failed | ', reason);\n });\n }\n /**\r\n * This function is used to remove and clean all pending invitations.\r\n * @param {DataObjectReporter} DataObjectReporter Data Object Reporter addressed by invitations\r\n * @return {Promise} return a promise when all unsubscriptons for pending invitations are finished\r\n */\n\n }, {\n key: \"cleanInvitations\",\n value: function cleanInvitations(dataObjectReporter) {\n var _this = this;\n\n var chatInvitations = _this._pending[dataObjectReporter];\n console.log('[GroupChatManager.InvitationsHandler.cleanInvitations] ', chatInvitations);\n\n if (chatInvitations) {\n return new Promise(function (resolve, reject) {\n var pendingInvitations = Object.keys(chatInvitations);\n var unsubscriptonPromises = [];\n pendingInvitations.forEach(function (invitation) {\n unsubscriptonPromises.push(chatInvitations[invitation].unsubscribeLive(_this._hypertyURL));\n });\n Promise.all(pendingInvitations).then(function () {\n resolve();\n });\n });\n } else return Promise.resolve();\n }\n }, {\n key: \"invitationResponse\",\n set: function set(callback) {\n this._invitationsResponse = callback;\n }\n }]);\n\n return InvitationsHandler;\n}();\n\n/* harmony default export */ var chatManager_InvitationsHandler = (InvitationsHandler);\n// CONCATENATED MODULE: ./src/chatManager/ChatController.js\nfunction ChatController_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ChatController_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ChatController_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChatController_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChatController_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* The Group Chat API is used to control a Group Chat instance.\r\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\r\n* @version 0.1.0\r\n*/\n//import { UserInfo } from './UserInfo';\n\n\n\nvar ChatController_ChatController =\n/*#__PURE__*/\nfunction () {\n function ChatController(syncher, discovery, domain, search, identity, manager) {\n ChatController_classCallCheck(this, ChatController);\n\n if (!syncher) throw Error('Syncher is a necessary dependecy');\n if (!discovery) throw Error('Discover is a necessary dependecy');\n if (!domain) throw Error('Domain is a necessary dependecy');\n if (!search) throw Error('Search is a necessary dependecy');\n\n var _this = this;\n\n _this._syncher = syncher;\n _this.discovery = discovery;\n _this.search = search;\n _this.myIdentity = identity;\n _this.controllerMode = 'reporter';\n _this.child_cseq = 0;\n _this.domain = domain;\n _this._manager = manager;\n var hypertyURL = syncher.owner;\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication';\n _this._invitationsHandler = new chatManager_InvitationsHandler(hypertyURL);\n }\n\n ChatController_createClass(ChatController, [{\n key: \"_setOnAddChildListener\",\n value: function _setOnAddChildListener(dataObject) {\n var _this = this;\n\n dataObject.onAddChild(function (child) {\n _this.child_cseq += 1;\n console.info('[ChatManager.ChatController._setOnAddChildListener] new Child received: ', child);\n if (_this._onMessage) _this._onMessage(child);\n });\n }\n }, {\n key: \"_onSubscribe\",\n value: function _onSubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n event.accept();\n console.log('[ChatManager.ChatController.onSubscribe] event', event, dataObjectReporter.url);\n console.log('[ChatManager.ChatController.onSubscribe] New user has subscribe this object: ', dataObjectReporter.data, event.identity);\n var identity = JSON.parse(JSON.stringify(event.identity));\n\n if (identity.hasOwnProperty('assertion')) {\n delete identity.assertion;\n }\n\n var userInfo = {\n hypertyURL: event.url,\n domain: event.domain,\n identity: identity\n };\n var userURL = event.identity.userProfile.guid;\n console.log('[ChatManager.ChatController.onSubscribe] new participant', userInfo);\n\n if (event.identity.legacy) {\n userInfo.legacy = event.identity.legacy;\n }\n\n dataObjectReporter.data.participants[userURL] = userInfo;\n console.log('[ChatManager.ChatController.onSubscribe] communicationObject OBJ chatcontroller', dataObjectReporter.data.participants);\n console.log('[ChatManager.ChatController.onSubscribe - onSubscription] ', userInfo); // console.log('[ChatManager.ChatController.onSubscribe - this._onUserAdded] ', this._onUserAdded);\n\n if (this._onUserAdded) this._onUserAdded(userInfo);\n }\n }, {\n key: \"_onUnsubscribe\",\n value: function _onUnsubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n console.log('[ChatManager.ChatController.onUnsubscribe] event', event, dataObjectReporter.url);\n var participant = event.identity.userProfile;\n console.log('[ChatManager.ChatController.onUnsubscribe] participant left', participant);\n\n if (event.identity.legacy) {\n participant.legacy = event.identity.legacy;\n }\n\n delete dataObjectReporter.data.participants[participant.userURL];\n console.log('[ChatManager.ChatController.onUnsubscribe - this._onUserRemoved] ', this.onUserRemoved);\n if (this._onUserRemoved) this._onUserRemoved(participant);\n }\n /**\r\n * This function is used to send a file.\r\n * @param {string} file Is the file to be sent.\r\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\r\n */\n\n }, {\n key: \"sendFile\",\n value: function sendFile(file) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n var identity = {\n userProfile: _this.myIdentity\n };\n dataObject.addHypertyResource('resources', 'file', file, identity).then(function (resourceFile) {\n var identity = {\n userProfile: _this.myIdentity\n };\n var fileSentEvt = {\n value: resourceFile,\n identity: identity,\n resource: resourceFile\n };\n var reporterStatus = new discovery_RegistrationStatus(dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus); // recursive function to sync with chat reporter\n\n var share2Reporter = function share2Reporter(file, subscriber, evt, status) {\n var statusOfReporter = status;\n file.sharingStatus.then(resolve(evt)).catch(function (result) {\n console.log('[ChatManager.ChatController.sendFile] share failed: ', result);\n statusOfReporter.onLive(subscriber, function () {\n statusOfReporter.unsubscribeLive(subscriber);\n file.share(true);\n share2Reporter(file, subscriber, evt, statusOfReporter);\n }); //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\n });\n };\n\n share2Reporter(resourceFile, _this._manager._hypertyURL, fileSentEvt, reporterStatus);\n });\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n }\n /**\r\n * This function is used to send a chat message.\r\n * @param {string} message Is the ChatMessage to be sent.\r\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\r\n */\n\n }, {\n key: \"send\",\n value: function send(message, identity) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n // let _dataObjectChild;\n _this.child_cseq += 1;\n var msg = {\n /* url: dataObject.data.url,\r\n cseq: _this.child_cseq,\r\n reporter: dataObject.data.reporter,\r\n schema: dataObject.data.schema,\r\n name: dataObject.data.name,\r\n created : new Date().toJSON(),*/\n type: 'chat',\n content: message\n };\n var sender = identity ? identity : {\n userProfile: _this.myIdentity\n }; // TODO: change chatmessages to resource - chat, file\n // TODO: change message to hypertyResource - https://github.com/reTHINK-project/dev-service-framework/tree/develop/docs/datamodel/data-objects/hyperty-resource\n // TODO: handle with multiple resources - if the \"message\" will be different for each type of resources\n\n dataObject.addChild(msg, sender).then(function (dataObjectChild) {\n console.log('[ChatManager.ChatController][addChild - Chat Message]: ', dataObjectChild); //resolve(dataObjectChild);\n //TODO: move to separate function\n\n var msg = {\n childId: dataObjectChild._childId,\n from: dataObjectChild._owner,\n value: dataObjectChild.data,\n type: 'create',\n identity: sender\n };\n var reporterStatus = new discovery_RegistrationStatus(dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus); // recursive function to sync with chat reporter\n\n var share2Reporter = function share2Reporter(child, subscriber, msg, status) {\n var statusOfReporter = status;\n child.sharingStatus.then(resolve(msg)).catch(function (result) {\n statusOfReporter.onLive(subscriber, function () {\n statusOfReporter.unsubscribeLive(subscriber);\n child.share(true);\n share2Reporter(child, subscriber, msg, statusOfReporter);\n }); //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\n });\n };\n\n share2Reporter(dataObjectChild, _this._manager._hypertyURL, msg, reporterStatus);\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n });\n }\n /**\r\n * [onChange description]\r\n * @param {Function} callback [description]\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onChange\",\n value: function onChange(callback) {\n var _this = this;\n\n _this._onChange = callback;\n }\n /**\r\n * This function is used to receive new messages.\r\n * @param {Function} callback Function to handle with new messages\r\n * @return {Communication.ChatMessage} m\r\n */\n\n }, {\n key: \"onMessage\",\n value: function onMessage(callback) {\n var _this = this;\n\n _this._onMessage = callback;\n }\n /**\r\n * [onUserAdded description]\r\n * @param {Function} callback [description]\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onUserAdded\",\n value: function onUserAdded(callback) {\n var _this = this;\n\n _this._onUserAdded = callback;\n }\n /**\r\n * When the an user was removed\r\n * @param {Function} callback Function handle with the removed user\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onUserRemoved\",\n value: function onUserRemoved(callback) {\n var _this = this;\n\n _this._onUserRemoved = callback;\n }\n /**\r\n * This function is used to receive requests to close the Group Chat instance.\r\n * @return {DeleteEvent} The DeleteEvent fired by the Syncher when the Chat is closed.\r\n */\n\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n var _this = this;\n\n _this._onClose = callback;\n }\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n var _this = this;\n\n _this._onResponse = callback;\n }\n /**\r\n * This function is used to add / invite new user on an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\r\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\r\n */\n\n }, {\n key: \"addUser\",\n value: function addUser(users) {\n var _this = this;\n\n var haveEmptyElements = function haveEmptyElements(element) {\n console.log('Element:', element.length);\n return element.length !== 0;\n };\n\n var notFoundElements = function notFoundElements(element) {\n console.log('user not found: ', element);\n return !(element instanceof String);\n };\n\n return new Promise(function (resolve, reject) {\n if (users.filter(haveEmptyElements).length === 0) {\n return reject('Don\\'t have users to invite');\n }\n\n console.info('[ChatManager.ChatController.addUsers ]: ', users);\n /*_this.search.users(users, domains, ['comm'], ['chat'])\r\n .then((hypertiesIDs) => {\r\n if (hypertiesIDs.filter(notFoundElements).length === 0) {\r\n throw 'User(s) not found';\r\n }\r\n let selectedHyperties = hypertiesIDs.map((hyperty) => {\r\n return hyperty.hypertyID;\r\n });*/\n\n var usersDiscovery = [];\n var disconnected = [];\n var live = {};\n users.forEach(function (user) {\n var userDiscoveryPromise = _this.discovery.discoverHypertiesDO(user.user, ['comm'], ['chat'], user.domain);\n\n usersDiscovery.push(userDiscoveryPromise);\n });\n Promise.all(usersDiscovery).then(function (userDiscoveryResults) {\n console.log('[ChatManager.ChatController.addUsers] Users Discovery Results->', userDiscoveryResults);\n var selectedHyperties = [];\n userDiscoveryResults.forEach(function (userDiscoveryResult) {\n userDiscoveryResult.forEach(function (discovered) {\n if (discovered.data.status === 'live') {\n selectedHyperties.push(discovered.data.hypertyID);\n live[discovered.data.hypertyID] = discovered;\n } else if (disconnected.length < 5) disconnected.push(discovered);\n });\n });\n console.info('[ChatManager.ChatController]------------------------ Syncher Create ---------------------- \\n');\n console.info('[ChatManager.ChatController]Selected Hyperties: !!! ', selectedHyperties);\n console.info(\"Have \".concat(selectedHyperties.length, \" users;\")); // console.info('[ChatManager] HypertiesIDs ', hypertiesIDs);\n\n var dataObject = _this.controllerMode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n if (disconnected.length > 0) _this._invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObject);\n dataObject.inviteObservers(selectedHyperties);\n if (dataObject.invitations.length > 0) _this._invitationsHandler.processInvitations(live, dataObject);\n return;\n }).then(function () {\n console.info('[ChatManager.ChatController]Are invited with success ' + users.length + ' users;');\n resolve(true);\n }).catch(function (reason) {\n console.error('An error occurred when trying to invite users;\\n', reason);\n reject(reason);\n });\n });\n }\n /**\r\n * This function is used to request the Reporter to add / invite new user on an existing Group Chat instance.\r\n * Only Observers are allowed to use this function.\r\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\r\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\r\n */\n\n }, {\n key: \"addUserReq\",\n value: function addUserReq(users) {\n var _this = this; //check is Observer and invoke observer.execute() with new promise\n\n\n var haveEmptyElements = function haveEmptyElements(element) {\n console.log('Element:', element.length);\n return element.length !== 0;\n };\n\n return new Promise(function (resolve, reject) {\n if (users.filter(haveEmptyElements).length === 0) {\n return reject('[ChatManager.ChatController.addUserReq] Don\\'t have users to add');\n }\n\n if (!_this.controllerMode === 'observer') {\n return reject('[ChatManager.ChatController.addUserReq] only allowed to Chat Observer');\n\n var addUser = _this.addUser(users);\n\n if (_this._dataObjectObserver) {\n addUser = _this._dataObjectObserver.execute('addUser', users);\n }\n\n addUser.then(function () {\n console.info('[ChatManager.ChatController.addUserReq] Request accepted by Reporter ');\n resolve(true);\n }).catch(function (reason) {\n console.error('[ChatManager.ChatController.addUserReq] Request rejected by Reporter;\\n', reason);\n reject(reason);\n });\n }\n });\n }\n }, {\n key: \"onInvitationResponse\",\n value: function onInvitationResponse(callback) {\n var _this = this;\n\n _this._onInvitationResponse = callback;\n _this._invitationsHandler.invitationResponse = callback;\n }\n /**\r\n * This function is used to remove a user from an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @return { boolean} Promise with the status\r\n */\n\n /**\r\n * This function is used to remove a user from an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @param {URL.UserURL} user User to be removed from the Group Chat that is identified with reTHINK User URL.\r\n * @return { boolean} It returns as a Promise true if successfully removed or false otherwise.\r\n */\n\n }, {\n key: \"removeUser\",\n value: function removeUser(user) {\n // TODO: implement the removeUser;\n console.log('[ChatManager.ChatController]Not yet implemented: ', user);\n }\n /**\r\n * This function is used to close an existing Group Chat instance.\r\n * Only available to Chat Group Reporters i.e. the Hyperty instance that created the Group Chat.\r\n * @return {Boolean} It returns as a Promise true if successfully closed or false otherwise.\r\n */\n\n }, {\n key: \"close\",\n value: function close() {\n var del = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n // TODO: the dataObjectReporter.delete should be a Promise;\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this.controllerMode === 'reporter') {\n // reporter\n _this._invitationsHandler.cleanInvitations(_this.dataObjectReporter).then(function () {\n if (!del) {\n _this._manager.communicationObject.status = 'closed';\n resolve(true);\n } else {\n try {\n delete _this._manager._reportersControllers[_this.dataObjectReporter.url];\n\n _this.dataObjectReporter.delete();\n\n resolve(true);\n if (_this._onClose) _this._onClose({\n code: 200,\n desc: 'deleted',\n url: _this.dataObjectReporter.url\n });\n } catch (e) {\n console.error(e);\n reject(false);\n }\n }\n });\n } else {\n // observer\n if (del) {\n try {\n delete _this._manager._observersControllers[_this.dataObjectObserver.url];\n\n _this.dataObjectObserver.unsubscribe();\n\n resolve(true);\n } catch (e) {\n console.error(e);\n reject(false);\n }\n } else {\n // TODO: send message \n resolve(true);\n }\n }\n });\n }\n }, {\n key: \"invitationsHandler\",\n get: function get() {\n return this._invitationsHandler;\n }\n }, {\n key: \"url\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter.url : this.dataObjectObserver.url;\n }\n }, {\n key: \"dataObjectReporter\",\n set: function set(dataObjectReporter) {\n if (!dataObjectReporter) throw new Error('[ChatController] The data object reporter is necessary parameter ');\n\n var _this = this;\n\n _this.controllerMode = 'reporter'; // Handler to process received files\n // dataObjectReporter.onResponse(function(event) {\n // console.log('[DataObjectReporter - onResponse]', event);\n // if (_this._onInvitationResponse) {\n // _this._onInvitationResponse(event);\n // }\n //\n // });\n\n dataObjectReporter.onSubscription(function (event) {\n switch (event.type) {\n case 'subscribe':\n _this._onSubscribe(event);\n\n break;\n\n case 'unsubscribe':\n _this._onUnsubscribe(event);\n\n break;\n }\n });\n\n _this._setOnAddChildListener(dataObjectReporter);\n\n dataObjectReporter.onRead(function (event) {\n event.accept();\n });\n dataObjectReporter.onExecute(function (event) {\n switch (event.method) {\n case 'addUser':\n _this.addUser(event.params[0]).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n case 'removeUser':\n _this.removeUser(event.params).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n default:\n event.reject('[ChatController.onExecute] Chat method execution not accepted by Reporter');\n break;\n }\n });\n _this._dataObjectReporter = dataObjectReporter;\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectReporter;\n }\n }, {\n key: \"messages\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this._dataObjectReporter._childrenObjects : this._dataObjectObserver._childrenObjects;\n }\n }, {\n key: \"dataObjectObserver\",\n set: function set(dataObjectObserver) {\n var _this = this;\n\n _this.controllerMode = 'observer';\n _this._dataObjectObserver = dataObjectObserver;\n dataObjectObserver.onChange('*', function (event) {\n console.info('[ChatManager.ChatController]Observer - onChange', event);\n\n if (event.field.includes('participants')) {\n switch (event.cType) {\n case 'add':\n if (_this._onUserAdded) _this._onUserAdded(event);\n break;\n\n case 'remove':\n if (_this._onUserRemoved) _this._onUserRemoved(event);\n break;\n }\n }\n\n if (_this._onChange) _this._onChange(event);\n });\n\n _this._setOnAddChildListener(dataObjectObserver); // let childrens = dataObjectObserver.childrens;\n // Object.keys(childrens).forEach((child) => {\n // if (_this._onMessage) _this._onMessage({\n // childId: child,\n // identity: childrens[child].identity,\n // value: childrens[child].data\n // });\n // })\n\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectObserver;\n }\n }, {\n key: \"dataObject\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter : this.dataObjectObserver;\n }\n }, {\n key: \"closeEvent\",\n set: function set(event) {\n var _this = this;\n\n _this._closeEvent = event;\n if (_this._onClose) _this._onClose(event);\n },\n get: function get() {\n var _this = this;\n\n return _this._closeEvent;\n }\n }]);\n\n return ChatController;\n}();\n\n/* harmony default export */ var chatManager_ChatController = (ChatController_ChatController);\n// CONCATENATED MODULE: ./src/chatManager/UserInfo.js\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction UserInfo_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\nvar UserInfo_UserInfo = function UserInfo(hypertyURL, domain, identity) {\n var _ref;\n\n UserInfo_classCallCheck(this, UserInfo);\n\n var completeIdentity = deepClone(identity);\n\n if (!identity.hasOwnProperty('userProfile')) {\n completeIdentity['userProfile'] = identity;\n }\n\n return _ref = {\n hypertyURL: hypertyURL,\n domain: domain\n }, _defineProperty(_ref, \"domain\", domain), _defineProperty(_ref, \"identity\", completeIdentity), _ref;\n};\n// CONCATENATED MODULE: ./src/chatManager/ChatManager.js\nfunction ChatManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ChatManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ChatManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChatManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChatManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Service Framework\n//import IdentityManager from '../identityManager/IdentityManager';\n//import RegistrationStatus from '../discovery/RegistrationStatus';\n//import Discovery from '../discovery/Discovery';\n//import Syncher from '../syncher/Syncher';\n// Utils\n//import {divideURL} from '../utils/utils';\n//import Search from '../utils/Search';\n// Internals\n\n\n\n/**\r\n* Hyperty Group Chat Manager API (HypertyChat)\r\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\r\n* @version 0.1.0\r\n*/\n\nvar ChatManager_ChatManager =\n/*#__PURE__*/\nfunction () {\n function ChatManager(myUrl, bus, configuration, syncher, factory) {\n ChatManager_classCallCheck(this, ChatManager);\n\n if (!myUrl) throw new Error('[ChatManager.constructor] The myUrl is a needed parameter');\n if (!bus) throw new Error('[ChatManager.constructor] The MiniBus is a needed parameter');\n if (!configuration) throw new Error('[ChatManager.constructor] The configuration is a needed parameter');\n\n var _this = this;\n\n if (!syncher) {\n syncher = factory.createSyncher(myUrl, bus, configuration);\n }\n\n _this._runtimeURL = configuration.runtimeURL;\n var domain = factory.divideURL(_this._runtimeURL).domain;\n var discovery = factory.createDiscovery(myUrl, configuration.runtimeURL, bus);\n var identityManager = factory.createIdentityManager(myUrl, configuration.runtimeURL, bus);\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication';\n _this._reportersControllers = {};\n _this._observersControllers = {};\n _this._myUrl = myUrl;\n _this._bus = bus;\n _this._syncher = syncher;\n _this._domain = domain;\n _this.discovery = discovery;\n _this.identityManager = identityManager;\n _this.currentIdentity;\n _this.search = factory.createSearch(discovery, identityManager);\n _this.communicationObject = communicationObject;\n _this.communicationChildren = communicationChildren;\n console.log('[ChatManager] Discover ', discovery);\n console.log('[ChatManager] Identity Manager ', identityManager);\n }\n\n ChatManager_createClass(ChatManager, [{\n key: \"processNotification\",\n value: function processNotification(event) {\n var _this = this;\n\n console.log('[ChatManager.processNotification: ', event);\n\n if (event.type === 'create') {\n // TODO: replace the 100 for Message.Response\n // event.ack(200);\n if (_this._onInvitation) {\n _this._onInvitation(event);\n }\n }\n\n if (event.type === 'delete') {\n // TODO: replace the 200 for Message.Response\n event.ack(200);\n _this._observersControllers[event.url].closeEvent = event;\n delete _this._observersControllers[event.url];\n _this._observersControllers.closeEvent = event;\n _this.communicationObject = communicationObject;\n\n for (var url in this._reportersControllers) {\n this._reportersControllers[url].close(event);\n }\n\n for (var _url in this._observersControllers) {\n this._observersControllers[_url].close(event);\n }\n }\n }\n }, {\n key: \"myIdentity\",\n value: function myIdentity(identity) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.info('[ChatManager.myIdentity]');\n if (identity) return resolve(identity);\n\n if (_this._myUrl.includes('hyperty://')) {\n _this.identityManager.discoverUserRegistered().then(function (identity) {\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n } else {\n _this.identityManager.discoverIdentityPerIdP().then(function (identity) {\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n }\n });\n }\n /**\r\n * This function is used to create a new Group Chat providing the name and the identifiers of users to be invited.\r\n * @param {string} name Is a string to identify the Group Chat\r\n * @param {array} users Array of users to be invited to join the Group Chat. Users are identified with reTHINK User URL, like this format user:///\r\n * @return {ChatController} A ChatController object as a Promise.\r\n */\n\n }, {\n key: \"create\",\n value: function create(name, users) {\n var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var _this = this;\n\n var syncher = _this._syncher;\n return new Promise(function (resolve, reject) {\n _this.communicationObject = communicationObject;\n _this.communicationObject.cseq = 1;\n _this.communicationObject.startingTime = new Date().toJSON();\n _this.communicationObject.status = CommunicationStatus.OPEN;\n var myIdentity;\n\n _this.myIdentity().then(function (identity) {\n myIdentity = identity;\n console.log('[ChatManager.create ] My Identity', identity); // let url = _this.communicationObject.reporter;\n\n var userInfo = new UserInfo_UserInfo(_this._myUrl, _this._domain, identity); // Add my identity\n\n _this.communicationObject.participants[identity.guid] = userInfo;\n console.log('[ChatManager.create ] participants: ', _this.communicationObject.participants);\n console.log('[ChatManager.create ] communicationObject', _this.communicationObject);\n console.info('[ChatManager.create] searching ' + users); //let usersSearch = _this.search.users(users, domains, ['comm'], ['chat']);\n\n var usersDiscovery = [];\n var disconnected = [];\n var live = {};\n users.forEach(function (user) {\n var userDiscoveryPromise = _this.discovery.discoverHypertiesDO(user.user, ['comm'], ['chat'], user.domain);\n\n usersDiscovery.push(userDiscoveryPromise); //if (user.user.includes('://')) mutual = false;\n });\n Promise.all(usersDiscovery).then(function (userDiscoveryResults) {\n console.log('[ChatManager.create] Users Discovery Results->', userDiscoveryResults);\n var selectedHyperties = [];\n userDiscoveryResults.forEach(function (userDiscoveryResult) {\n userDiscoveryResult.forEach(function (discovered) {\n if (discovered.data.status === 'live') {\n selectedHyperties.push(discovered.data.hypertyID);\n live[discovered.data.hypertyID] = discovered;\n } else {\n // To control the number of subscriptions to disconnected devices\n if (disconnected.length < 5) {\n disconnected.push(discovered);\n }\n }\n });\n });\n /* return usersSearch;\r\n }).then((hypertiesIDs) => {\r\n let selectedHyperties = hypertiesIDs.map((hyperty) => {\r\n return hyperty.hypertyID;\r\n }); */\n\n console.info('[ChatManager] ---------------------- Syncher Create ---------------------- \\n');\n console.info('[ChatManager] Selected Hyperties: !!! ', selectedHyperties);\n console.info(\"Have \".concat(selectedHyperties.length, \" users;\"));\n var mutual = extra.mutual ? extra.mutual : true;\n var input = Object.assign({\n resources: ['chat'],\n mutual: mutual\n }, extra);\n delete input.name;\n if (_this.offline) input.offline = _this.offline;\n console.info('[ChatManager] input data:', input);\n return syncher.create(_this._objectDescURL, selectedHyperties, _this.communicationObject, true, false, name, {}, input);\n }).then(function (dataObjectReporter) {\n console.info('[ChatManager] 3. Return Create Data Object Reporter', dataObjectReporter);\n var chatController = new chatManager_ChatController(syncher, _this.discovery, _this._domain, _this.search, myIdentity, _this);\n chatController.dataObjectReporter = dataObjectReporter;\n _this._reportersControllers[dataObjectReporter.url] = chatController;\n console.log('[ChatManager] chatController invitationsHandler: ', chatController.invitationsHandler); // process invitations to handle not received invitations\n\n if (dataObjectReporter.invitations.length > 0) {\n chatController.invitationsHandler.processInvitations(live, dataObjectReporter);\n } // If any invited User is disconnected let's wait until it is connected again\n\n\n if (disconnected.length > 0) chatController.invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObjectReporter);\n resolve(chatController);\n }).catch(function (reason) {\n reject(reason);\n });\n }).catch(function (reason) {\n console.log('[ChatManager.create] MyIdentity Error:', reason);\n return reject(reason);\n });\n });\n }\n /**\r\n * This function is used to handle notifications about incoming invitations to join a Group Chat.\r\n * @param {Function} CreateEvent The CreateEvent fired by the Syncher when an invitaion is received\r\n */\n\n }, {\n key: \"onInvitation\",\n value: function onInvitation(callback) {\n var _this = this;\n\n _this._onInvitation = callback;\n }\n /**\r\n * This function is used to join a Group Chat.\r\n * @param {URL.CommunicationURL} invitationURL The Communication URL of the Group Chat to join that is provided in the invitation event\r\n * @return {ChatController} It returns the ChatController object as a Promise\r\n */\n\n }, {\n key: \"join\",\n value: function join(invitationURL) {\n var mutual = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var identity = arguments.length > 2 ? arguments[2] : undefined;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var syncher = _this._syncher;\n var myIdentity;\n console.info('[ChatManager] ------------------------ Syncher subscribe ---------------------- \\n');\n console.info('invitationURL', invitationURL);\n\n _this.myIdentity(identity).then(function (identity) {\n myIdentity = identity;\n var input = {\n schema: _this._objectDescURL,\n resource: invitationURL,\n store: true,\n p2p: false,\n mutual: mutual,\n domain_subscription: true,\n identity: identity\n };\n if (_this.offline) input.offline = _this.offline;\n return syncher.subscribe(input);\n }).then(function (dataObjectObserver) {\n console.info('Data Object Observer: ', dataObjectObserver);\n var chatController = new chatManager_ChatController(syncher, _this.discovery, _this._domain, _this.search, myIdentity, _this);\n resolve(chatController);\n chatController.dataObjectObserver = dataObjectObserver;\n _this._observersControllers[dataObjectObserver.url] = chatController;\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"offline\",\n set: function set(offline) {\n this._offline = offline;\n },\n get: function get() {\n return this._offline ? this._offline : false;\n }\n }]);\n\n return ChatManager;\n}();\n\n/* harmony default export */ var chatManager_ChatManager = (ChatManager_ChatManager);\n// CONCATENATED MODULE: ./src/chatManager/Chat.js\nfunction Chat_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Chat_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Chat_createClass(Constructor, protoProps, staticProps) { if (protoProps) Chat_defineProperties(Constructor.prototype, protoProps); if (staticProps) Chat_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* The Group Chat API is used to control a Group Chat instance.\r\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\r\n* @version 0.1.0\r\n*/\n//import { UserInfo } from './UserInfo';\n//import RegistrationStatus from '../discovery/RegistrationStatus';\n//import InvitationsHandler from './InvitationsHandler';\nvar Chat =\n/*#__PURE__*/\nfunction () {\n function Chat(syncher, domain, identity, manager) {\n Chat_classCallCheck(this, Chat);\n\n if (!syncher) throw Error('Syncher is a necessary dependecy'); // if (!discovery) throw Error('Discover is a necessary dependecy');\n\n if (!domain) throw Error('Domain is a necessary dependecy'); // if (!search) throw Error('Search is a necessary dependecy');\n\n var _this = this;\n\n _this._syncher = syncher; // _this.discovery = discovery;\n // _this.search = search;\n\n _this.myIdentity = identity;\n _this.controllerMode = 'reporter';\n _this.child_cseq = 0;\n _this.domain = domain;\n _this._manager = manager;\n var hypertyURL = syncher.owner;\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication'; // _this._invitationsHandler = new InvitationsHandler(hypertyURL);\n }\n /* get invitationsHandler() {\r\n return this._invitationsHandler;\r\n }*/\n\n\n Chat_createClass(Chat, [{\n key: \"_setOnAddChildListener\",\n value: function _setOnAddChildListener(dataObject) {\n var _this = this;\n\n dataObject.onAddChild(function (child) {\n _this.child_cseq += 1;\n console.info('[ChatManager.ChatController._setOnAddChildListener] new Child received: ', child);\n if (_this._onMessage) _this._onMessage(child);\n });\n }\n }, {\n key: \"_onSubscribe\",\n value: function _onSubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n event.accept();\n console.log('[ChatManager.ChatController.onSubscribe] event', event, dataObjectReporter.url);\n console.log('[ChatManager.ChatController.onSubscribe] New user has subscribe this object: ', dataObjectReporter.data, event.identity);\n var identity = JSON.parse(JSON.stringify(event.identity));\n\n if (identity.hasOwnProperty('assertion')) {\n delete identity.assertion;\n }\n\n var userInfo = {\n hypertyURL: event.url,\n domain: event.domain,\n identity: identity\n };\n var userURL = event.identity.userProfile.guid;\n console.log('[ChatManager.ChatController.onSubscribe] new participant', userInfo);\n\n if (event.identity.legacy) {\n userInfo.legacy = event.identity.legacy;\n }\n\n dataObjectReporter.data.participants[userURL] = userInfo;\n console.log('[ChatManager.ChatController.onSubscribe] communicationObject OBJ chatcontroller', dataObjectReporter.data.participants);\n console.log('[ChatManager.ChatController.onSubscribe - onSubscription] ', userInfo); // console.log('[ChatManager.ChatController.onSubscribe - this._onUserAdded] ', this._onUserAdded);\n\n if (this._onUserAdded) this._onUserAdded(userInfo);\n }\n }, {\n key: \"_onUnsubscribe\",\n value: function _onUnsubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n console.log('[ChatManager.ChatController.onUnsubscribe] event', event, dataObjectReporter.url);\n var participant = event.identity.userProfile;\n console.log('[ChatManager.ChatController.onUnsubscribe] participant left', participant);\n\n if (event.identity.legacy) {\n participant.legacy = event.identity.legacy;\n }\n\n delete dataObjectReporter.data.participants[participant.userURL];\n console.log('[ChatManager.ChatController.onUnsubscribe - this._onUserRemoved] ', this.onUserRemoved);\n if (this._onUserRemoved) this._onUserRemoved(participant);\n }\n /**\r\n * This function is used to send a file.\r\n * @param {string} file Is the file to be sent.\r\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\r\n */\n\n }, {\n key: \"sendFile\",\n value: function sendFile(file) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n var identity = {\n userProfile: _this.myIdentity\n };\n dataObject.addHypertyResource('resources', 'file', file, identity).then(function (resourceFile) {\n var identity = {\n userProfile: _this.myIdentity\n };\n var fileSentEvt = {\n value: resourceFile,\n identity: identity,\n resource: resourceFile\n };\n /* let reporterStatus = new RegistrationStatus(dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus );\r\n \r\n // recursive function to sync with chat reporter\r\n \r\n let share2Reporter = function(file, subscriber, evt, status) {\r\n let statusOfReporter = status;\r\n file.sharingStatus.then(resolve(evt)).catch((result)=>{\r\n console.log('[ChatManager.ChatController.sendFile] share failed: ', result);\r\n \r\n statusOfReporter.onLive( subscriber, () => {\r\n statusOfReporter.unsubscribeLive(subscriber);\r\n file.share(true);\r\n share2Reporter(file, subscriber, evt, statusOfReporter);\r\n });\r\n //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\r\n });\r\n }*/\n // resourceFile.share(true).then(()=>{\n\n resolve(fileSentEvt); // });\n // share2Reporter(resourceFile, _this._manager._hypertyURL, fileSentEvt, reporterStatus);\n });\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n }\n /**\r\n * This function is used to send a chat message.\r\n * @param {string} message Is the ChatMessage to be sent.\r\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\r\n */\n\n }, {\n key: \"send\",\n value: function send(message, identity) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n // let _dataObjectChild;\n _this.child_cseq += 1;\n var msg = {\n /* url: dataObject.data.url,\r\n cseq: _this.child_cseq,\r\n reporter: dataObject.data.reporter,\r\n schema: dataObject.data.schema,\r\n name: dataObject.data.name,\r\n created : new Date().toJSON(),*/\n type: 'chat',\n content: message\n };\n var sender = identity ? identity : {\n userProfile: _this.myIdentity\n }; // TODO: change chatmessages to resource - chat, file\n // TODO: change message to hypertyResource - https://github.com/reTHINK-project/dev-service-framework/tree/develop/docs/datamodel/data-objects/hyperty-resource\n // TODO: handle with multiple resources - if the \"message\" will be different for each type of resources\n\n dataObject.addChild(msg, sender).then(function (dataObjectChild) {\n console.log('[ChatManager.ChatController][addChild - Chat Message]: ', dataObjectChild); //resolve(dataObjectChild);\n //TODO: move to separate function\n\n var msg = {\n childId: dataObjectChild._childId,\n from: dataObjectChild._owner,\n value: dataObjectChild.data,\n type: 'create',\n identity: sender\n };\n /* let reporterStatus = new RegistrationStatus(dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus );\r\n \r\n // recursive function to sync with chat reporter\r\n \r\n let share2Reporter = function(child, subscriber, msg, status) {\r\n let statusOfReporter = status;\r\n child.sharingStatus.then(resolve(msg)).catch((result)=>{\r\n \r\n statusOfReporter.onLive( subscriber, () => {\r\n statusOfReporter.unsubscribeLive(subscriber);\r\n child.share(true);\r\n share2Reporter(child, subscriber, msg, statusOfReporter);\r\n });\r\n //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\r\n });\r\n }*/\n // share2Reporter(dataObjectChild, _this._manager._hypertyURL, msg, reporterStatus);\n // dataObjectChild.share(true);\n\n resolve(msg);\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n });\n }\n /**\r\n * [onChange description]\r\n * @param {Function} callback [description]\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onChange\",\n value: function onChange(callback) {\n var _this = this;\n\n _this._onChange = callback;\n }\n /**\r\n * This function is used to receive new messages.\r\n * @param {Function} callback Function to handle with new messages\r\n * @return {Communication.ChatMessage} m\r\n */\n\n }, {\n key: \"onMessage\",\n value: function onMessage(callback) {\n var _this = this;\n\n _this._onMessage = callback;\n }\n /**\r\n * [onUserAdded description]\r\n * @param {Function} callback [description]\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onUserAdded\",\n value: function onUserAdded(callback) {\n var _this = this;\n\n _this._onUserAdded = callback;\n }\n /**\r\n * When the an user was removed\r\n * @param {Function} callback Function handle with the removed user\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onUserRemoved\",\n value: function onUserRemoved(callback) {\n var _this = this;\n\n _this._onUserRemoved = callback;\n }\n /**\r\n * This function is used to receive requests to close the Group Chat instance.\r\n * @return {DeleteEvent} The DeleteEvent fired by the Syncher when the Chat is closed.\r\n */\n\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n var _this = this;\n\n _this._onClose = callback;\n }\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n var _this = this;\n\n _this._onResponse = callback;\n }\n /**\r\n * This function is used to add / invite new user on an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\r\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\r\n */\n\n /* addUser(users) {\r\n \r\n let _this = this;\r\n \r\n let haveEmptyElements = (element) => {\r\n console.log('Element:', element.length);\r\n return element.length !== 0;\r\n };\r\n \r\n let notFoundElements = (element) => {\r\n console.log('user not found: ', element);\r\n return !(element instanceof String);\r\n };\r\n \r\n return new Promise(function(resolve, reject) {\r\n \r\n if (users.filter(haveEmptyElements).length === 0) {\r\n return reject('Don\\'t have users to invite');\r\n }\r\n \r\n console.info('[ChatManager.ChatController.addUsers ]: ', users);\r\n \r\n /*_this.search.users(users, domains, ['comm'], ['chat'])\r\n \r\n .then((hypertiesIDs) => {\r\n \r\n if (hypertiesIDs.filter(notFoundElements).length === 0) {\r\n throw 'User(s) not found';\r\n }\r\n \r\n let selectedHyperties = hypertiesIDs.map((hyperty) => {\r\n return hyperty.hypertyID;\r\n });*/\n\n /* let usersDiscovery = [];\r\n let disconnected = [];\r\n let live = {};\r\n \r\n users.forEach((user) => {\r\n let userDiscoveryPromise = _this.discovery.discoverHypertiesDO(user.user, ['comm'], ['chat'], user.domain);\r\n usersDiscovery.push(userDiscoveryPromise);\r\n });\r\n \r\n Promise.all(usersDiscovery).then((userDiscoveryResults) => {\r\n console.log('[ChatManager.ChatController.addUsers] Users Discovery Results->', userDiscoveryResults);\r\n \r\n let selectedHyperties = [];\r\n \r\n userDiscoveryResults.forEach((userDiscoveryResult) => {\r\n \r\n userDiscoveryResult.forEach((discovered)=>{\r\n if (discovered.data.status === 'live'){\r\n selectedHyperties.push(discovered.data.hypertyID);\r\n live[discovered.data.hypertyID] = discovered;\r\n }\r\n else if (disconnected.length < 5) disconnected.push(discovered);\r\n });\r\n \r\n });\r\n \r\n console.info('[ChatManager.ChatController]------------------------ Syncher Create ---------------------- \\n');\r\n console.info('[ChatManager.ChatController]Selected Hyperties: !!! ', selectedHyperties);\r\n console.info(`Have ${selectedHyperties.length} users;`);\r\n // console.info('[ChatManager] HypertiesIDs ', hypertiesIDs);\r\n \r\n let dataObject = _this.controllerMode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\r\n \r\n if (disconnected.length > 0) _this._invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObject);\r\n \r\n dataObject.inviteObservers(selectedHyperties);\r\n \r\n if (dataObject.invitations.length > 0) _this._invitationsHandler.processInvitations(live, dataObject);\r\n \r\n return;\r\n \r\n })\r\n .then(() => {\r\n console.info('[ChatManager.ChatController]Are invited with success ' + users.length + ' users;');\r\n resolve(true);\r\n \r\n \r\n \r\n }).catch((reason) => {\r\n console.error('An error occurred when trying to invite users;\\n', reason);\r\n reject(reason);\r\n });\r\n \r\n });\r\n \r\n }*/\n\n /**\r\n * This function is used to request the Reporter to add / invite new user on an existing Group Chat instance.\r\n * Only Observers are allowed to use this function.\r\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\r\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\r\n */\n\n /* addUserReq(users) {\r\n \r\n let _this = this;\r\n \r\n //check is Observer and invoke observer.execute() with new promise\r\n let haveEmptyElements = (element) => {\r\n console.log('Element:', element.length);\r\n return element.length !== 0;\r\n };\r\n \r\n return new Promise(function(resolve, reject) {\r\n \r\n if (users.filter(haveEmptyElements).length === 0) {\r\n return reject('[ChatManager.ChatController.addUserReq] Don\\'t have users to add');\r\n }\r\n if (!_this.controllerMode === 'observer') {\r\n return reject('[ChatManager.ChatController.addUserReq] only allowed to Chat Observer');\r\n \r\n let addUser = _this.addUser(users);\r\n \r\n if (_this._dataObjectObserver) {\r\n addUser = _this._dataObjectObserver.execute('addUser', users);\r\n }\r\n \r\n addUser.then(() => {\r\n console.info('[ChatManager.ChatController.addUserReq] Request accepted by Reporter ');\r\n resolve(true);\r\n }).catch((reason) => {\r\n console.error('[ChatManager.ChatController.addUserReq] Request rejected by Reporter;\\n', reason);\r\n reject(reason);\r\n });\r\n }\r\n \r\n });\r\n \r\n }*/\n\n }, {\n key: \"onInvitationResponse\",\n value: function onInvitationResponse(callback) {\n var _this = this;\n\n _this._onInvitationResponse = callback; // _this._invitationsHandler.invitationResponse = callback;\n }\n /**\r\n * This function is used to remove a user from an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @return { boolean} Promise with the status\r\n */\n\n /**\r\n * This function is used to remove a user from an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @param {URL.UserURL} user User to be removed from the Group Chat that is identified with reTHINK User URL.\r\n * @return { boolean} It returns as a Promise true if successfully removed or false otherwise.\r\n */\n\n }, {\n key: \"removeUser\",\n value: function removeUser(user) {\n // TODO: implement the removeUser;\n console.log('[ChatManager.ChatController]Not yet implemented: ', user);\n }\n /**\r\n * This function is used to close an existing Group Chat instance.\r\n * Only available to Chat Group Reporters i.e. the Hyperty instance that created the Group Chat.\r\n * @return {Boolean} It returns as a Promise true if successfully closed or false otherwise.\r\n */\n\n }, {\n key: \"close\",\n value: function close() {\n var del = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n // TODO: the dataObjectReporter.delete should be a Promise;\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this.controllerMode === 'reporter') {\n // reporter\n // _this._invitationsHandler.cleanInvitations(_this.dataObjectReporter).then(() => {\n if (!del) {\n _this._manager.communicationObject.status = 'closed';\n resolve(true);\n } else {\n try {\n delete _this._manager._reportersControllers[_this.dataObjectReporter.url];\n\n _this.dataObjectReporter.delete();\n\n resolve(true);\n if (_this._onClose) _this._onClose({\n code: 200,\n desc: 'deleted',\n url: _this.dataObjectReporter.url\n });\n } catch (e) {\n console.error(e);\n reject(false);\n }\n } // });\n\n } else {\n // observer\n if (del) {\n try {\n delete _this._manager._observersControllers[_this.dataObjectObserver.url];\n\n _this.dataObjectObserver.unsubscribe();\n\n resolve(true);\n } catch (e) {\n console.error(e);\n reject(false);\n }\n } else {\n // TODO: send message \n resolve(true);\n }\n }\n });\n }\n }, {\n key: \"url\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter.url : this.dataObjectObserver.url;\n }\n }, {\n key: \"dataObjectReporter\",\n set: function set(dataObjectReporter) {\n if (!dataObjectReporter) throw new Error('[ChatController] The data object reporter is necessary parameter ');\n\n var _this = this;\n\n _this.controllerMode = 'reporter'; // Handler to process received files\n // dataObjectReporter.onResponse(function(event) {\n // console.log('[DataObjectReporter - onResponse]', event);\n // if (_this._onInvitationResponse) {\n // _this._onInvitationResponse(event);\n // }\n //\n // });\n\n dataObjectReporter.onSubscription(function (event) {\n switch (event.type) {\n case 'subscribe':\n _this._onSubscribe(event);\n\n break;\n\n case 'unsubscribe':\n _this._onUnsubscribe(event);\n\n break;\n }\n });\n\n _this._setOnAddChildListener(dataObjectReporter);\n\n dataObjectReporter.onRead(function (event) {\n event.accept();\n });\n dataObjectReporter.onExecute(function (event) {\n switch (event.method) {\n case 'addUser':\n _this.addUser(event.params[0]).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n case 'removeUser':\n _this.removeUser(event.params).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n default:\n event.reject('[ChatController.onExecute] Chat method execution not accepted by Reporter');\n break;\n }\n });\n _this._dataObjectReporter = dataObjectReporter;\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectReporter;\n }\n }, {\n key: \"messages\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this._dataObjectReporter._childrenObjects : this._dataObjectObserver._childrenObjects;\n }\n }, {\n key: \"dataObjectObserver\",\n set: function set(dataObjectObserver) {\n var _this = this;\n\n _this.controllerMode = 'observer';\n _this._dataObjectObserver = dataObjectObserver;\n dataObjectObserver.onChange('*', function (event) {\n console.info('[ChatManager.ChatController]Observer - onChange', event);\n\n if (event.field.includes('participants')) {\n switch (event.cType) {\n case 'add':\n if (_this._onUserAdded) _this._onUserAdded(event);\n break;\n\n case 'remove':\n if (_this._onUserRemoved) _this._onUserRemoved(event);\n break;\n }\n }\n\n if (_this._onChange) _this._onChange(event);\n });\n\n _this._setOnAddChildListener(dataObjectObserver); // let childrens = dataObjectObserver.childrens;\n // Object.keys(childrens).forEach((child) => {\n // if (_this._onMessage) _this._onMessage({\n // childId: child,\n // identity: childrens[child].identity,\n // value: childrens[child].data\n // });\n // })\n\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectObserver;\n }\n }, {\n key: \"dataObject\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter : this.dataObjectObserver;\n }\n }, {\n key: \"closeEvent\",\n set: function set(event) {\n var _this = this;\n\n _this._closeEvent = event;\n if (_this._onClose) _this._onClose(event);\n },\n get: function get() {\n var _this = this;\n\n return _this._closeEvent;\n }\n }]);\n\n return Chat;\n}();\n\n/* harmony default export */ var chatManager_Chat = (Chat);\n// CONCATENATED MODULE: ./src/chatManager/SimpleChatManager.js\nfunction SimpleChatManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SimpleChatManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SimpleChatManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) SimpleChatManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) SimpleChatManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Service Framework\n//import IdentityManager from '../identityManager/IdentityManager';\n//import RegistrationStatus from '../discovery/RegistrationStatus';\n//import Discovery from '../discovery/Discovery';\n//import Syncher from '../syncher/Syncher';\n// Utils\n//import {divideURL} from '../utils/utils';\n//import Search from '../utils/Search';\n// Internals\n\n\n\n/**\r\n* Hyperty Simple Group Chat Manager API \r\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\r\n* @version 0.1.0\r\n*/\n\nvar SimpleChatManager_SimpleSimpleChatManager =\n/*#__PURE__*/\nfunction () {\n function SimpleSimpleChatManager(myUrl, bus, configuration, syncher, factory) {\n SimpleChatManager_classCallCheck(this, SimpleSimpleChatManager);\n\n if (!myUrl) throw new Error('[SimpleChatManager.constructor] The myUrl is a needed parameter');\n if (!bus) throw new Error('[SimpleChatManager.constructor] The MiniBus is a needed parameter');\n if (!configuration) throw new Error('[SimpleChatManager.constructor] The configuration is a needed parameter');\n\n var _this = this;\n\n if (!syncher) {\n syncher = factory.createSyncher(myUrl, bus, configuration);\n }\n\n _this._runtimeURL = configuration.runtimeURL;\n var domain = factory.divideURL(_this._runtimeURL).domain; // let discovery = factory.createDiscovery(myUrl, configuration.runtimeURL, bus);\n\n var identityManager = factory.createIdentityManager(myUrl, configuration.runtimeURL, bus);\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication';\n _this._reportersControllers = {};\n _this._observersControllers = {};\n _this._myUrl = myUrl;\n _this._bus = bus;\n _this._syncher = syncher;\n _this._domain = domain; // _this.discovery = discovery;\n\n _this.identityManager = identityManager;\n _this.currentIdentity; // _this.search = factory.createSearch(discovery, identityManager);\n\n _this.communicationObject = communicationObject;\n _this.communicationChildren = communicationChildren; // console.log('[SimpleChatManager] Discover ', discovery);\n\n console.log('[SimpleChatManager] Identity Manager ', identityManager);\n }\n\n SimpleChatManager_createClass(SimpleSimpleChatManager, [{\n key: \"processNotification\",\n value: function processNotification(event) {\n var _this = this;\n\n console.log('[SimpleChatManager.processNotification: ', event);\n\n if (event.type === 'create') {\n // TODO: replace the 100 for Message.Response\n // event.ack(200);\n if (_this._onInvitation) {\n _this._onInvitation(event);\n }\n }\n\n if (event.type === 'delete') {\n // TODO: replace the 200 for Message.Response\n event.ack(200);\n _this._observersControllers[event.url].closeEvent = event;\n delete _this._observersControllers[event.url];\n _this._observersControllers.closeEvent = event;\n _this.communicationObject = communicationObject;\n\n for (var url in this._reportersControllers) {\n this._reportersControllers[url].close(event);\n }\n\n for (var _url in this._observersControllers) {\n this._observersControllers[_url].close(event);\n }\n }\n }\n }, {\n key: \"myIdentity\",\n value: function myIdentity(identity) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.info('[SimpleChatManager.myIdentity]');\n if (identity) return resolve(identity);\n\n if (_this._myUrl.includes('hyperty://')) {\n _this.identityManager.discoverUserRegistered().then(function (identity) {\n _this.currentIdentity = identity;\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n } else {\n _this.identityManager.discoverIdentityPerIdP().then(function (identity) {\n _this.currentIdentity = identity;\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n }\n });\n }\n /**\r\n * This function is used to create a new Group Chat providing the name and the identifiers of users to be invited.\r\n * @param {string} name Is a string to identify the Group Chat\r\n * @param {array} hyperties Array of hyperties to be invited to join the Group Chat. Users are identified with reTHINK User URL, like this format user:///\r\n * @return {ChatController} A ChatController object as a Promise.\r\n */\n\n }, {\n key: \"create\",\n value: function create(name, hyperties) {\n var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var _this = this;\n\n var syncher = _this._syncher;\n return new Promise(function (resolve, reject) {\n _this.communicationObject = communicationObject;\n _this.communicationObject.cseq = 1;\n _this.communicationObject.startingTime = new Date().toJSON();\n _this.communicationObject.status = CommunicationStatus.OPEN;\n var myIdentity;\n\n _this.myIdentity().then(function (identity) {\n myIdentity = identity;\n console.log('[SimpleChatManager.create ] My Identity', identity); // let url = _this.communicationObject.reporter;\n\n var userInfo = new UserInfo_UserInfo(_this._myUrl, _this._domain, identity); // Add my identity\n\n _this.communicationObject.participants[identity.guid] = userInfo;\n console.log('[SimpleChatManager.create ] participants: ', _this.communicationObject.participants);\n console.log('[SimpleChatManager.create ] communicationObject', _this.communicationObject);\n console.info('[SimpleChatManager] ---------------------- Syncher Create ---------------------- \\n');\n console.info('[SimpleChatManager] Selected Hyperties: !!! ', hyperties); // console.info(`Have ${hyperties.length} users;`);\n\n var mutual = extra.mutual ? extra.mutual : true;\n var input = Object.assign({\n resources: ['chat'],\n mutual: mutual\n }, extra);\n delete input.name;\n if (_this.offline) input.offline = _this.offline;\n if (_this.backup) input.backup = _this.backup;\n console.log('[SimpleChatManager] input data:', input);\n return syncher.create(_this._objectDescURL, hyperties, _this.communicationObject, true, false, name, {}, input);\n }).then(function (dataObjectReporter) {\n console.info('[SimpleChatManager] 3. Return Create Data Object Reporter', dataObjectReporter);\n var chat = new chatManager_Chat(syncher, _this._domain, myIdentity, _this);\n chat.dataObjectReporter = dataObjectReporter;\n _this._reportersControllers[dataObjectReporter.url] = chat; // console.log('[SimpleChatManager] chat invitationsHandler: ', chat.invitationsHandler);\n // process invitations to handle not received invitations\n\n /* if (dataObjectReporter.invitations.length > 0) {\r\n chat.invitationsHandler.processInvitations(live, dataObjectReporter);\r\n }\r\n \r\n // If any invited User is disconnected let's wait until it is connected again\r\n if (disconnected.length > 0) chat.invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObjectReporter);\r\n */\n\n resolve(chat);\n }).catch(function (reason) {\n reject(reason);\n });\n }).catch(function (reason) {\n console.log('[SimpleChatManager.create] MyIdentity Error:', reason);\n return reject(reason);\n }); // });\n }\n /**\r\n * This function is used to handle notifications about incoming invitations to join a Group Chat.\r\n * @param {Function} CreateEvent The CreateEvent fired by the Syncher when an invitaion is received\r\n */\n\n }, {\n key: \"onInvitation\",\n value: function onInvitation(callback) {\n var _this = this;\n\n _this._onInvitation = callback;\n }\n /**\r\n * This function is used to join a Group Chat.\r\n * @param {URL.CommunicationURL} invitationURL The Communication URL of the Group Chat to join that is provided in the invitation event\r\n * @return {ChatController} It returns the ChatController object as a Promise\r\n */\n\n }, {\n key: \"join\",\n value: function join(invitationURL) {\n var mutual = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var identity = arguments.length > 2 ? arguments[2] : undefined;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var syncher = _this._syncher;\n var myIdentity;\n console.info('[SimpleChatManager] ------------------------ Syncher subscribe ---------------------- \\n');\n console.info('invitationURL', invitationURL);\n\n _this.myIdentity(identity).then(function (identity) {\n myIdentity = identity;\n var input = {\n schema: _this._objectDescURL,\n resource: invitationURL,\n store: true,\n p2p: false,\n mutual: mutual,\n domain_subscription: true,\n identity: identity\n };\n if (_this.offline) input.offline = _this.offline;\n return syncher.subscribe(input);\n }).then(function (dataObjectObserver) {\n console.info('Data Object Observer: ', dataObjectObserver);\n var chat = new chatManager_Chat(syncher, _this._domain, myIdentity, _this);\n resolve(chat);\n chat.dataObjectObserver = dataObjectObserver;\n _this._observersControllers[dataObjectObserver.url] = chat;\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"offline\",\n set: function set(offline) {\n this._offline = offline;\n },\n get: function get() {\n return this._offline ? this._offline : false;\n }\n }, {\n key: \"backup\",\n set: function set(backup) {\n this._backup = backup;\n },\n get: function get() {\n return this._backup ? this._backup : false;\n }\n }]);\n\n return SimpleSimpleChatManager;\n}();\n\n/* harmony default export */ var SimpleChatManager = (SimpleChatManager_SimpleSimpleChatManager);\n// CONCATENATED MODULE: ./src/sandbox/SandboxFactory.js\nfunction SandboxFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SandboxFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SandboxFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) SandboxFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) SandboxFactory_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\r\n * Internal component to instantiate framework functionalities.\r\n */\n\nvar SandboxFactory_SandboxFactory =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _components: \r\n */\n function SandboxFactory(bus) {\n SandboxFactory_classCallCheck(this, SandboxFactory);\n\n var _this = this;\n\n _this._bus = bus;\n _this._divideURL = divideURL;\n }\n\n SandboxFactory_createClass(SandboxFactory, [{\n key: \"createSyncher\",\n value: function createSyncher(owner, bus, config) {\n return new syncher_Syncher(owner, bus, config);\n }\n }, {\n key: \"createIdentityManager\",\n value: function createIdentityManager(hypertyURL, runtimeURL, bus) {\n var _this = this;\n\n return new identity_IdentityManager(hypertyURL, runtimeURL, bus);\n }\n }, {\n key: \"createDiscovery\",\n value: function createDiscovery(hypertyURL, runtimeURL, bus) {\n var _this = this;\n\n return new discovery_Discovery(hypertyURL, runtimeURL, bus);\n }\n }, {\n key: \"createSearch\",\n value: function createSearch(discovery, identityManager) {\n var _this = this;\n\n return new utils_Search(discovery, identityManager);\n }\n }, {\n key: \"createContextObserver\",\n value: function createContextObserver(hypertyURL, bus, config, schemes) {\n return new contextManager_ContextObserver(hypertyURL, bus, config, schemes, this);\n }\n }, {\n key: \"createContextReporter\",\n value: function createContextReporter(hypertyURL, bus, config) {\n var _this = this;\n\n return new contextManager_ContextReporter(hypertyURL, bus, config, this);\n }\n }, {\n key: \"createNotificationHandler\",\n value: function createNotificationHandler(bus) {\n var _this = this;\n\n return new syncher_NotificationHandler(bus);\n }\n }, {\n key: \"createMessageBodyIdentity\",\n value: function createMessageBodyIdentity(username, userURL, picture, name, locale, idp, assertion, profile) {\n return new identity_MessageBodyIdentity(username, userURL, picture, name, locale, idp, assertion, profile);\n }\n }, {\n key: \"createChatManager\",\n value: function createChatManager(hypertyURL, bus, configuration, syncher) {\n return new chatManager_ChatManager(hypertyURL, bus, configuration, syncher, this);\n }\n }, {\n key: \"createChatController\",\n value: function createChatController(syncher, discovery, domain, search, identity, manager) {\n return new chatManager_ChatController(syncher, discovery, domain, search, identity, manager);\n }\n }, {\n key: \"createSimpleChatManager\",\n value: function createSimpleChatManager(hypertyURL, bus, configuration, syncher) {\n return new SimpleChatManager(hypertyURL, bus, configuration, syncher, this);\n }\n }, {\n key: \"createChat\",\n value: function createChat(syncher, domain, identity, manager) {\n return new chatManager_Chat(syncher, domain, identity, manager);\n }\n }, {\n key: \"createRegistrationStatus\",\n value: function createRegistrationStatus(observer, runtimeURL, chatUrl, bus) {\n return new discovery_RegistrationStatus(observer, runtimeURL, chatUrl, bus);\n }\n }, {\n key: \"divideURL\",\n get: function get() {\n return this._divideURL;\n }\n }]);\n\n return SandboxFactory;\n}();\n\n/* harmony default export */ var sandbox_SandboxFactory = (SandboxFactory_SandboxFactory);\n// CONCATENATED MODULE: ./src/sandbox/SandboxRegistry.js\nfunction SandboxRegistry_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SandboxRegistry_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SandboxRegistry_createClass(Constructor, protoProps, staticProps) { if (protoProps) SandboxRegistry_defineProperties(Constructor.prototype, protoProps); if (staticProps) SandboxRegistry_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * @author micaelpedrosa@gmail.com\r\n * Base class to implement internal deploy manager of components.\r\n */\n\n/**\r\n * @author micaelpedrosa@gmail.com\r\n * Internal component registry of all sandboxes.\r\n * Process internal request's for component deploy.\r\n */\n\nvar SandboxRegistry_SandboxRegistry =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _components: \r\n */\n function SandboxRegistry(bus) {\n SandboxRegistry_classCallCheck(this, SandboxRegistry);\n\n var _this = this;\n\n _this._bus = bus;\n _this._factory = new sandbox_SandboxFactory(bus);\n _this._components = {};\n bus.addListener(SandboxRegistry.InternalDeployAddress, function (msg) {\n console.log('SandboxRegistry-RCV: ', msg); // let responseMsg = {\n // id: msg.id, type: 'response', from: SandboxRegistry.InternalDeployAddress, to: SandboxRegistry.ExternalDeployAddress\n // };\n\n switch (msg.type) {\n case 'create':\n _this._onDeploy(msg);\n\n break;\n\n case 'delete':\n _this._onRemove(msg);\n\n break;\n }\n });\n }\n\n SandboxRegistry_createClass(SandboxRegistry, [{\n key: \"_responseMsg\",\n value: function _responseMsg(msg, code, value) {\n var _this = this; // let messageFactory = _this.messageFactory;\n //FLOW-OUT: generic response message to external Sandbox (deploy and un-deploy responses)\n\n\n var responseMsg = {\n id: msg.id,\n type: 'response',\n from: SandboxRegistry.InternalDeployAddress,\n to: SandboxRegistry.ExternalDeployAddress\n }; // Chanege the origin message, because the response;\n // msg.from = SandboxRegistry.InternalDeployAddress;\n // msg.to = SandboxRegistry.ExternalDeployAddress;\n\n var body = {};\n if (code) body.code = code;\n if (value) body.desc = value;\n responseMsg.body = body; // return messageFactory.createResponse(msg, code, value);\n\n return responseMsg;\n } //FLOW-IN: message from the runtime core Sandbox -> deployComponent\n\n }, {\n key: \"_onDeploy\",\n value: function _onDeploy(msg) {\n var _this = this;\n\n var config = msg.body.config;\n var componentURL = msg.body.url;\n var sourceCode = msg.body.sourceCode;\n var responseCode;\n var responseDesc;\n\n if (!_this._components.hasOwnProperty(componentURL)) {\n try {\n console.log('SandboxRegistry-onDeploy: ', msg);\n _this._components[componentURL] = _this._create(componentURL, sourceCode, config, _this._factory);\n responseCode = 200;\n } catch (error) {\n responseCode = 500;\n responseDesc = error;\n }\n } else {\n responseCode = 500;\n responseDesc = 'Instance ' + componentURL + ' already exist!';\n }\n\n var responseMsg = _this._responseMsg(msg, responseCode, responseDesc);\n\n _this._bus.postMessage(responseMsg);\n } //FLOW-IN: message from the runtime core Sandbox -> removeComponent\n\n }, {\n key: \"_onRemove\",\n value: function _onRemove(msg) {\n var _this = this;\n\n var componentURL = msg.body.url;\n var responseCode;\n var responseDesc;\n\n if (_this._components.hasOwnProperty(componentURL)) {\n //remove component from the pool and all listeners\n delete _this._components[componentURL];\n\n _this._bus.removeAllListenersOf(componentURL);\n\n responseCode = 200;\n } else {\n responseCode = 500;\n responseDesc = 'Instance ' + componentURL + ' doesn\\'t exist!';\n }\n\n var responseMsg = _this._responseMsg(msg, responseCode, responseDesc);\n\n _this._bus.postMessage(responseMsg);\n }\n /**\r\n * This method should be implemented by the internal sandbox code.\r\n * @param {ComponentURL} url URL used for the instance\r\n * @param {string} sourceCode Code of the component\r\n * @param {Config} config Configuration parameters\r\n * @return {Object} Returns instance of the component or throw an error \"throw 'error message'\"\r\n */\n\n }, {\n key: \"_create\",\n value: function _create(url, sourceCode, config, factory) {//implementation specific\n\n /* example code:\r\n eval(sourceCode);\r\n return activate(url, _this._bus, config);\r\n */\n }\n }, {\n key: \"components\",\n get: function get() {\n return this._components;\n }\n }]);\n\n return SandboxRegistry;\n}();\n\nSandboxRegistry_SandboxRegistry.ExternalDeployAddress = 'hyperty-runtime://sandbox/external';\nSandboxRegistry_SandboxRegistry.InternalDeployAddress = 'hyperty-runtime://sandbox/internal';\n/* harmony default export */ var sandbox_SandboxRegistry = (SandboxRegistry_SandboxRegistry);\n// CONCATENATED MODULE: ./src/bus/Bus.js\nfunction Bus_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Bus_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Bus_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bus_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bus_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log system\n\nvar Bus_log = loglevel[\"getLogger\"]('Bus');\n/**\r\n* @author micaelpedrosa@gmail.com\r\n* Minimal interface and implementation to send and receive messages. It can be reused in many type of components.\r\n* Components that need a message system should receive this class as a dependency or extend it.\r\n* Extensions should implement the following private methods: _onPostMessage and _registerExternalListener\r\n*/\n\nvar Bus =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _msgId: number;\r\n _subscriptions: \r\n _responseTimeOut: number\r\n _responseCallbacks: void>\r\n */\n function Bus() {\n Bus_classCallCheck(this, Bus);\n\n var _this = this;\n\n _this._msgId = 0;\n _this._subscriptions = {};\n _this._responseTimeOut = 15000; //default to 3s\n\n _this._responseCallbacks = {};\n\n _this._registerExternalListener();\n }\n /**\r\n * Register listener to receive message when \"msg.to === url\".\r\n * Special url \"*\" for default listener is accepted to intercept all messages.\r\n * @param {URL} url Address to intercept, tha is in the message \"to\"\r\n * @param {Listener} listener listener\r\n * @return {MsgListener} instance of MsgListener\r\n */\n\n\n Bus_createClass(Bus, [{\n key: \"addListener\",\n value: function addListener(url, listener) {\n var _this = this;\n\n var item = new MsgListener(_this._subscriptions, url, listener);\n var itemList = _this._subscriptions[url];\n\n if (!itemList) {\n itemList = [];\n _this._subscriptions[url] = itemList;\n }\n\n itemList.push(item);\n return item;\n }\n /**\r\n * Manually add a response listener. Only one listener per message ID should exist.\r\n * ATENTION, there is no timeout for this listener.\r\n * The listener should be removed with a removeResponseListener, failing to do this will result in a unreleased memory problem.\r\n * @param {URL} url Origin address of the message sent, \"msg.from\".\r\n * @param {number} msgId Message ID that is returned from the postMessage.\r\n * @param {Function} responseListener Callback function for the response\r\n */\n\n }, {\n key: \"addResponseListener\",\n value: function addResponseListener(url, msgId, responseListener) {\n this._responseCallbacks[url + msgId] = responseListener;\n }\n /**\r\n * Remove the response listener.\r\n * @param {URL} url Origin address of the message sent, \"msg.from\".\r\n * @param {number} msgId Message ID that is returned from the postMessage\r\n */\n\n }, {\n key: \"removeResponseListener\",\n value: function removeResponseListener(url, msgId) {\n delete this._responseCallbacks[url + msgId];\n }\n /**\r\n * Remove all existent listeners for the URL\r\n * @param {URL} url Address registered\r\n */\n\n }, {\n key: \"removeAllListenersOf\",\n value: function removeAllListenersOf(url) {\n delete this._subscriptions[url];\n }\n /**\r\n * Helper method to bind listeners (in both directions) into other MiniBus target.\r\n * @param {URL} outUrl Outbound URL, register listener for url in direction \"this -> target\"\r\n * @param {URL} inUrl Inbound URL, register listener for url in direction \"target -> this\"\r\n * @param {MiniBus} target The other target MiniBus\r\n * @return {Bound} an object that contains the properties [thisListener, targetListener] and the unbind method.\r\n */\n\n }, {\n key: \"bind\",\n value: function bind(outUrl, inUrl, target) {\n var _this2 = this;\n\n var _this = this;\n\n var thisListn = _this.addListener(outUrl, function (msg) {\n target.postMessage(msg);\n });\n\n var targetListn = target.addListener(inUrl, function (msg) {\n _this.postMessage(msg);\n });\n return {\n thisListener: thisListn,\n targetListener: targetListn,\n unbind: function unbind() {\n _this2.thisListener.remove();\n\n _this2.targetListener.remove();\n }\n };\n } //publish on default listeners\n\n }, {\n key: \"_publishOnDefault\",\n value: function _publishOnDefault(msg) {\n //is there any \"*\" (default) listeners?\n var itemList = this._subscriptions['*'];\n\n if (itemList) {\n this._publishOn(itemList, msg);\n }\n } //publish on a subscription list.\n\n }, {\n key: \"_publishOn\",\n value: function _publishOn(itemList, msg) {\n itemList.forEach(function (sub) {\n sub._callback(msg);\n });\n }\n }, {\n key: \"_responseCallback\",\n value: function _responseCallback(inMsg, responseCallback) {\n var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var _this = this; //automatic management of response handlers\n\n\n if (responseCallback) {\n var responseId = inMsg.from + inMsg.id;\n _this._responseCallbacks[responseId] = responseCallback;\n\n if (timeout) {\n setTimeout(function () {\n var responseFun = _this._responseCallbacks[responseId];\n delete _this._responseCallbacks[responseId];\n\n if (responseFun) {\n var errorMsg = {\n id: inMsg.id,\n type: 'response',\n body: {\n code: 408,\n desc: 'Response timeout!',\n value: inMsg\n }\n };\n responseFun(errorMsg);\n }\n }, _this._responseTimeOut);\n }\n }\n } //TODO: provisional responses should reset timeout\n\n }, {\n key: \"_onResponse\",\n value: function _onResponse(msg) {\n var _this = this;\n\n if (msg.type === 'response') {\n var responseId = msg.to + msg.id;\n var responseFun = _this._responseCallbacks[responseId];\n\n if (msg.body.code >= 200) {\n //if it's a provisional response, don't delete response listener\n delete _this._responseCallbacks[responseId];\n }\n\n if (responseFun) {\n responseFun(msg);\n return true;\n }\n }\n\n return false;\n } //receive messages from external interface\n\n }, {\n key: \"_onMessage\",\n value: function _onMessage(msg) {\n var _this = this;\n\n if (!_this._onResponse(msg)) {\n var itemList = _this._subscriptions[msg.to];\n\n if (itemList) {\n _this._publishOn(itemList, msg);\n } else {\n _this._publishOnDefault(msg);\n }\n }\n }\n }, {\n key: \"_genId\",\n value: function _genId(inMsg) {\n //TODO: how do we manage message ID's? Should it be a global runtime counter, or per URL address?\n //Global counter will not work, because there will be multiple MiniBus instances!\n //Per URL, can be a lot of data to maintain!\n //Maybe a counter per MiniBus instance. This is the assumed solution for now.\n if (!inMsg.id || inMsg.id === 0) {\n this._msgId++;\n inMsg.id = this._msgId;\n }\n }\n /**\r\n * Send messages to local listeners, or if not exists to external listeners.\r\n * It's has an optional mechanism for automatic management of response handlers.\r\n * The response handler will be unregistered after receiving the response, or after response timeout (default to 3s).\r\n * @param {Message} msg Message to send. Message ID is automatically added to the message.\r\n * @param {Function} responseCallback Optional parameter, if the developer what's automatic response management.\r\n * @return {number} Returns the message ID, in case it should be needed for manual management of the response handler.\r\n */\n\n }, {\n key: \"postMessage\",\n value: function postMessage(inMsg, responseCallback) {}\n /**\r\n * Function to post messages with a number of retries in case timeouts occur.\r\n * @param {Message} msg Message to send. Message ID is automatically added to the message.\r\n * @param {Function} responseCallback Optional parameter, if the developer what's automatic response management.\r\n * @param {integer} retries number of retries when timeouts occur\r\n * @return {boolean} message delivery result;\r\n */\n\n }, {\n key: \"postMessageWithRetries\",\n value: function postMessageWithRetries(msg, retries, callback) {\n var _this = this;\n\n var retry = 0; //let timeout = true;\n\n var sendMsg = function sendMsg() {\n return new Promise(function (resolve, reject) {\n _this.postMessage(msg, function (reply) {\n if (reply.body.code === 408 || reply.body.code === 500) reject();else {\n Bus_log.info('[Bus.postMessageWithRetries] msg delivered: ', msg);\n callback(reply);\n resolve();\n }\n });\n });\n };\n\n var tryAgain = function tryAgain() {\n sendMsg().then(function () {\n //timeout = false;\n return;\n }, function () {\n Bus_log.warn(\"[Bus.postMessageWithRetries] Message Bounced (retry \".concat(retry, \"): '\"), msg);\n\n if (retry++ < retries) {\n tryAgain(); // setTimeout(() => { tryAgain(); }, 1000);\n } else {\n var error = \"[Error] Message Bounced (delivery attempts \".concat(retries, \"): '\");\n throw new Error(error + msg);\n }\n });\n };\n\n tryAgain();\n }\n /**\r\n * Not public available, used by the class extension implementation, to process messages from the public \"postMessage\" without a registered listener.\r\n * Used to send the message to an external interface, like a WebWorker, IFrame, etc.\r\n * @param {Message.Message} msg Message\r\n */\n\n }, {\n key: \"_onPostMessage\",\n value: function _onPostMessage(msg) {}\n /*implementation will send message to external system*/\n\n /**\r\n * Not public available, used by the class extension implementation, to process all messages that enter the MiniBus from an external interface, like a WebWorker, IFrame, etc.\r\n * This method is called one time in the constructor to register external listeners.\r\n * The implementation will probably call the \"_onMessage\" method to publish in the local listeners.\r\n * DO NOT call \"postMessage\", there is a danger that the message enters in a cycle!\r\n */\n\n }, {\n key: \"_registerExternalListener\",\n value: function _registerExternalListener() {\n /*implementation will register external listener and call \"this._onMessage(msg)\" */\n }\n }]);\n\n return Bus;\n}();\n\nvar MsgListener =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _subscriptions: ;\r\n _url: string;\r\n _callback: (msg) => void;\r\n */\n function MsgListener(subscriptions, url, callback) {\n Bus_classCallCheck(this, MsgListener);\n\n var _this = this;\n\n _this._subscriptions = subscriptions;\n _this._url = url;\n _this._callback = callback;\n }\n\n Bus_createClass(MsgListener, [{\n key: \"remove\",\n\n /**\r\n * Remove this listener from the Bus\r\n */\n value: function remove() {\n var _this = this;\n\n var subs = _this._subscriptions[_this._url];\n\n if (subs) {\n var index = subs.indexOf(_this);\n subs.splice(index, 1); //if there are no listeners, remove the subscription entirely.\n\n if (subs.length === 0) {\n delete _this._subscriptions[_this._url];\n }\n }\n }\n }, {\n key: \"url\",\n get: function get() {\n return this._url;\n }\n }]);\n\n return MsgListener;\n}();\n\n/* harmony default export */ var bus_Bus = (Bus);\n// CONCATENATED MODULE: ./src/bus/MiniBus.js\nfunction MiniBus_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { MiniBus_typeof = function _typeof(obj) { return typeof obj; }; } else { MiniBus_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return MiniBus_typeof(obj); }\n\nfunction MiniBus_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction MiniBus_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction MiniBus_createClass(Constructor, protoProps, staticProps) { if (protoProps) MiniBus_defineProperties(Constructor.prototype, protoProps); if (staticProps) MiniBus_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction MiniBus_possibleConstructorReturn(self, call) { if (call && (MiniBus_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return MiniBus_assertThisInitialized(self); }\n\nfunction MiniBus_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction MiniBus_getPrototypeOf(o) { MiniBus_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MiniBus_getPrototypeOf(o); }\n\nfunction MiniBus_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) MiniBus_setPrototypeOf(subClass, superClass); }\n\nfunction MiniBus_setPrototypeOf(o, p) { MiniBus_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MiniBus_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author micaelpedrosa@gmail.com\r\n* Message BUS Interface is an extension of the Bus\r\n* It is used mainly in the internal sandbox routing.\r\n*/\n\nvar MiniBus =\n/*#__PURE__*/\nfunction (_Bus) {\n MiniBus_inherits(MiniBus, _Bus);\n\n function MiniBus() {\n MiniBus_classCallCheck(this, MiniBus);\n\n return MiniBus_possibleConstructorReturn(this, MiniBus_getPrototypeOf(MiniBus).call(this));\n }\n /**\r\n * Post a message for routing. Message is routed directly to the external routing _onPostMessage.\r\n * @param {Message} inMsg JSON with mandatory Message structure {id, type, from, to}\r\n * @param {Callback} responseCallback Optional callback if a response is expected from the request. A response will be always sent, even if it is a \"Timeout\".\r\n * @return {number} the Message id\r\n */\n\n\n MiniBus_createClass(MiniBus, [{\n key: \"postMessage\",\n value: function postMessage(inMsg, responseCallback, timeout) {\n var _this = this;\n\n _this._genId(inMsg);\n\n _this._responseCallback(inMsg, responseCallback, timeout); //always send to external (to core MessageBus)\n\n\n _this._onPostMessage(inMsg);\n\n return inMsg.id;\n } //internal method used when a message is received by an external routing system\n\n }, {\n key: \"_onMessage\",\n value: function _onMessage(msg) {\n var _this = this;\n\n if (!_this._onResponse(msg)) {\n var itemList = _this._subscriptions[msg.to];\n\n if (itemList) {\n _this._publishOn(itemList, msg);\n\n if (!msg.to.startsWith('hyperty')) {\n _this._publishOnDefault(msg);\n }\n } else {\n _this._publishOnDefault(msg);\n }\n }\n }\n }]);\n\n return MiniBus;\n}(bus_Bus);\n\n/* harmony default export */ var bus_MiniBus = (MiniBus);\n// CONCATENATED MODULE: ./src/sandbox/Sandbox.js\nfunction Sandbox_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { Sandbox_typeof = function _typeof(obj) { return typeof obj; }; } else { Sandbox_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return Sandbox_typeof(obj); }\n\nfunction Sandbox_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Sandbox_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Sandbox_createClass(Constructor, protoProps, staticProps) { if (protoProps) Sandbox_defineProperties(Constructor.prototype, protoProps); if (staticProps) Sandbox_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction Sandbox_possibleConstructorReturn(self, call) { if (call && (Sandbox_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return Sandbox_assertThisInitialized(self); }\n\nfunction Sandbox_getPrototypeOf(o) { Sandbox_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Sandbox_getPrototypeOf(o); }\n\nfunction Sandbox_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) Sandbox_setPrototypeOf(subClass, superClass); }\n\nfunction Sandbox_setPrototypeOf(o, p) { Sandbox_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Sandbox_setPrototypeOf(o, p); }\n\nfunction Sandbox_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n\nvar SandboxType = {\n APP: 'app',\n NORMAL: 'normal',\n WINDOW: 'window'\n};\n/**\r\n * @author micaelpedrosa@gmail.com\r\n * Base class to implement external sandbox component\r\n */\n\nvar Sandbox_Sandbox =\n/*#__PURE__*/\nfunction (_MiniBus) {\n Sandbox_inherits(Sandbox, _MiniBus);\n\n function Sandbox(capabilities) {\n var _this2;\n\n Sandbox_classCallCheck(this, Sandbox);\n\n _this2 = Sandbox_possibleConstructorReturn(this, Sandbox_getPrototypeOf(Sandbox).call(this));\n\n var _this = Sandbox_assertThisInitialized(Sandbox_assertThisInitialized(_this2));\n\n if (capabilities) {\n _this.capabilities = capabilities;\n }\n\n return _this2;\n }\n /**\r\n * Deploy an instance of the component into the sandbox.\r\n * @param {string} componentSourceCode Component source code (Hyperty, ProtoStub, etc)\r\n * @param {URL} componentURL Hyperty, ProtoStub, or any other component address.\r\n * @param {Config} configuration Config parameters of the component\r\n * @return {Promise} return deployed if successful, or any other string with an error\r\n */\n\n\n Sandbox_createClass(Sandbox, [{\n key: \"deployComponent\",\n value: function deployComponent(componentSourceCode, componentURL, configuration) {\n var _this = this; // let messageFactory = _this.messageFactory;\n\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: deploy message for the internal SandboxRegistry -> _onDeploy\n var deployMessage = {\n type: 'create',\n from: sandbox_SandboxRegistry.ExternalDeployAddress,\n to: sandbox_SandboxRegistry.InternalDeployAddress,\n body: {\n url: componentURL,\n sourceCode: componentSourceCode,\n config: configuration\n }\n }; //send message into the sandbox internals and wait for reply\n\n _this.postMessage(deployMessage, function (reply) {\n if (reply.body.code === 200) {\n //is this response complaint with the spec?\n resolve('deployed');\n } else {\n reject(reply.body.desc);\n }\n });\n });\n }\n /**\r\n * Remove the instance of a previously deployed component.\r\n * @param {URL} componentURL Hyperty, ProtoStub, or any other component address.\r\n * @return {Promise} return undeployed if successful, or any other string with an error\r\n */\n\n }, {\n key: \"removeComponent\",\n value: function removeComponent(componentURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: un-deploy message for the internal SandboxRegistry -> _onRemove\n var removeMessage = {\n type: 'delete',\n from: sandbox_SandboxRegistry.ExternalDeployAddress,\n to: sandbox_SandboxRegistry.InternalDeployAddress,\n body: {\n url: componentURL\n }\n }; //send message into the sandbox internals and wait for reply\n\n _this.postMessage(removeMessage, function (reply) {\n if (reply.body.code === 200) {\n //is this response complaint with the spec?\n resolve('undeployed');\n } else {\n reject(reply.body.desc);\n }\n });\n });\n }\n /**\r\n * Matches Sandbox capabilities against provided capabilities. Used to check if sandbox provides all required capabilities\r\n * @param {RuntimeCapabilities} constraints set of RuntimeCapabilities to match with.\r\n * @return {boolean} return true if constraints are matched false otherwise\r\n */\n\n }, {\n key: \"matches\",\n value: function matches(constraints) {\n var _this = this;\n\n var filtered = Object.keys(constraints).filter(function (key) {\n return !(_this.capabilities[key] && _this.capabilities[key] === constraints[key]);\n });\n\n if (filtered.length === 0) {\n return true;\n } else {\n return !constraints[filtered];\n }\n }\n }]);\n\n return Sandbox;\n}(bus_MiniBus);\n\n/* harmony default export */ var sandbox_Sandbox = (Sandbox_Sandbox);\n// CONCATENATED MODULE: ./src/allocation/AddressAllocation.js\nfunction AddressAllocation_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction AddressAllocation_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction AddressAllocation_createClass(Constructor, protoProps, staticProps) { if (protoProps) AddressAllocation_defineProperties(Constructor.prototype, protoProps); if (staticProps) AddressAllocation_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log system\n\nvar AddressAllocation_log = loglevel[\"getLogger\"]('address-allocation');\n // TODO: this could not be the best way to do a Singleton but at this moment it works;\n\nvar AddressAllocation_instance;\n/**\r\n * Class will ask to the message node for addresses\r\n */\n\nvar AddressAllocation_AddressAllocation =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _url: URL\r\n _bus: MiniBus\r\n */\n\n /**\r\n * Create an Address Allocation\r\n * @param {URL.URL} url - url from who is sending the message\r\n * @param {MiniBus} bus - MiniBus used for address allocation\r\n */\n function AddressAllocation(url, bus, registry, subscriptionManager) {\n AddressAllocation_classCallCheck(this, AddressAllocation);\n\n if (!AddressAllocation_instance) {\n this._url = url + '/address-allocation';\n this._bus = bus;\n this._registry = registry;\n this._subscriptionManager = subscriptionManager;\n AddressAllocation_instance = this;\n } else {\n return AddressAllocation_instance;\n }\n }\n\n AddressAllocation_createClass(AddressAllocation, [{\n key: \"create\",\n\n /**\r\n *\r\n * Ask for creation of a number of Hyperty addresses, to the domain message node.\r\n *\r\n * @param {Domain} domain - domain of the message node\r\n * @param {Number} number - number of address to be allocated\r\n * @param {Descriptor} info - descriptor to search for the hyperty (TODO:// this should be confirmed)\r\n * @see https://github.com/reTHINK-project/specs/blob/master/datamodel/core/hyperty-catalogue/readme.md#catalogue-data-model\r\n * @param {scheme} scheme - scheme of address to be created or reused, like: hyperty, comm, context, etc;\r\n * @param {boolean|URL.HypertyURL} reuseURL - reuseURL is used to reuse the hypertyURL previously registred;\r\n * @returns {Promise} this is Promise and returns an object with the address information\r\n *\r\n * @memberOf AddressAllocation\r\n */\n value: function create(domain, number, info, scheme, reuseURL) {\n AddressAllocation_log.log('[AddressAllocation.create] info ', info); //debugger;\n\n if (reuseURL) {\n if (typeof reuseURL === 'boolean') {\n if (reuseURL) {\n return this._reuseAllocatedAddress(domain, number, info, scheme, reuseURL);\n } else {\n return this._allocateNewAddress(domain, scheme, number, info);\n }\n }\n\n if (typeof reuseURL === 'string' && isURL(reuseURL)) {\n //return this._reuseAllocatedAddress(domain, number, info, scheme, reuseURL);\n return new Promise(function (resolve, reject) {\n var value = {\n newAddress: false,\n address: [reuseURL]\n };\n return resolve(value);\n });\n }\n } else {\n AddressAllocation_log.log('[AddressAllocation] - new address will be allocated'); // if there is no URL saved request a new URL\n\n return this._allocateNewAddress(domain, scheme, number, info);\n }\n }\n }, {\n key: \"_reuseAllocatedAddress\",\n value: function _reuseAllocatedAddress(domain, number, info, scheme, reuseURL) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n console.log('REUSETEST - _reuseAllocatedAddress', domain, number, info, scheme, reuseURL);\n\n _this2._registry.checkRegisteredURLs(info, reuseURL).then(function (urls) {\n console.log('REUSETEST - registeredurls', urls);\n\n if (urls) {\n AddressAllocation_log.info('[AddressAllocation - ' + scheme + '] - Reuse URL');\n var value = {\n newAddress: false,\n address: urls\n };\n resolve(value);\n } else {\n if (typeof reuseURL === 'string') {\n AddressAllocation_log.info('[AddressAllocation - reuseURL] - Object ' + reuseURL + ' not found');\n reject('URL Not Found');\n } else if (typeof reuseURL === 'boolean') {\n _this2._allocateNewAddress(domain, scheme, number, info).then(resolve).catch(reject);\n } else {\n reject('URL Not Found');\n }\n }\n });\n });\n }\n }, {\n key: \"_allocateNewAddress\",\n value: function _allocateNewAddress(domain, scheme, number, info) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var addresses = [];\n var i;\n\n for (i = 0; i < number; i++) {\n addresses.push(scheme + '://' + domain + '/' + generateGUID());\n }\n\n var result = {\n newAddress: true,\n address: addresses\n };\n\n if (scheme === 'hyperty') {\n if (info.hasOwnProperty('configuration') && info.configuration.hasOwnProperty('domain_routing') && !info.configuration.domain_routing) resolve(result);else {\n _this._subscriptionManager.createSubscription(domain, addresses, _this._url).then(function () {\n resolve(result);\n });\n }\n } else resolve(result);\n /* let msg = {\r\n type: 'create', from: this._url, to: 'domain://msg-node.' + domain + '/address-allocation',\r\n body: {value: { number: number } }\r\n };\r\n \r\n if (scheme !== 'hyperty') msg.body.scheme = scheme;\r\n \r\n log.info('[AddressAllocation - ' + scheme + '] - Request new URL');\r\n \r\n this._bus.postMessage(msg, (reply) => {\r\n if (reply.body.code === 200) {\r\n let result = {newAddress: true, address: reply.body.value.allocated};\r\n resolve(result);\r\n } else {\r\n reject(reply.body.desc);\r\n }\r\n });*/\n\n });\n }\n /**\r\n * Send a request to the domain message node, to deallocate one or more addresses\r\n * @param {Domain} domain - Domain of the message node.\r\n * @param {addresses} addresses to request the deallocation\r\n * @returns {Promise} the response by the message node\r\n */\n\n }, {\n key: \"delete\",\n value: function _delete(domain, addresses) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n resolve(200);\n /* let message = {\r\n type: 'delete', from: _this._url, to: 'domain://msg-node.' + domain + '/address-allocation',\r\n body: {childrenResources: addresses}\r\n };\r\n \r\n _this._bus.postMessage(message, (reply) => {\r\n if (reply.body.code === 200) {\r\n resolve(reply.body.code);\r\n } else {\r\n reject(reply.body.desc);\r\n }\r\n });*/\n });\n }\n }, {\n key: \"url\",\n\n /**\r\n * get the URL value\r\n * @return {string} The url value;\r\n */\n get: function get() {\n return this._url;\n }\n }], [{\n key: \"instance\",\n get: function get() {\n if (!AddressAllocation_instance) {\n throw new Error('The address allocation was not instantiated');\n }\n\n return AddressAllocation_instance;\n }\n }]);\n\n return AddressAllocation;\n}();\n\n/* harmony default export */ var allocation_AddressAllocation = (AddressAllocation_AddressAllocation);\n// CONCATENATED MODULE: ./src/registry/RegistryDataModel.js\nfunction RegistryDataModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RegistryDataModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RegistryDataModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) RegistryDataModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) RegistryDataModel_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author: Gil Dias (gil.dias@tecnico.ulisboa.pt)\r\n* Registry Data Model includes all Objects to be handled by the Registry functionality including\r\n*/\nvar RegistryDataModel =\n/*#__PURE__*/\nfunction () {\n function RegistryDataModel(id, url, descriptorURL, p2pRequester, startingTime, lastModified, status, stubs, stubsConfiguration) {\n RegistryDataModel_classCallCheck(this, RegistryDataModel);\n\n var _this = this;\n\n _this._id = id;\n _this._url = url;\n _this._descriptorURL = descriptorURL;\n _this._startingTime = startingTime;\n _this._lastModified = lastModified;\n _this._status = status;\n _this._stubs = stubs;\n _this._stubsConfiguration = stubsConfiguration;\n _this._p2pRequester = p2pRequester;\n }\n\n RegistryDataModel_createClass(RegistryDataModel, [{\n key: \"id\",\n get: function get() {\n var _this = this;\n\n return _this._id;\n }\n }, {\n key: \"url\",\n get: function get() {\n var _this = this;\n\n return _this._url;\n }\n }, {\n key: \"descriptorURL\",\n get: function get() {\n var _this = this;\n\n return _this._descriptorURL;\n }\n }, {\n key: \"p2pRequester\",\n get: function get() {\n var _this = this;\n\n return _this._p2pRequester;\n }\n }, {\n key: \"lastModified\",\n get: function get() {\n var _this = this;\n\n return _this._lastModified;\n }\n }]);\n\n return RegistryDataModel;\n}();\n\n/* harmony default export */ var registry_RegistryDataModel = (RegistryDataModel);\n// CONCATENATED MODULE: ./src/registry/HypertyInstance.js\nfunction HypertyInstance_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { HypertyInstance_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyInstance_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return HypertyInstance_typeof(obj); }\n\nfunction HypertyInstance_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyInstance_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyInstance_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyInstance_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyInstance_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyInstance_possibleConstructorReturn(self, call) { if (call && (HypertyInstance_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return HypertyInstance_assertThisInitialized(self); }\n\nfunction HypertyInstance_getPrototypeOf(o) { HypertyInstance_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyInstance_getPrototypeOf(o); }\n\nfunction HypertyInstance_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyInstance_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyInstance_setPrototypeOf(o, p) { HypertyInstance_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyInstance_setPrototypeOf(o, p); }\n\nfunction HypertyInstance_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author: Gil Dias (gil.dias@tecnico.ulisboa.pt)\r\n* HypertyInstance Data Model used to model instances of Hyperties running in devices and servers.\r\n*/\n\nvar HypertyInstance =\n/*#__PURE__*/\nfunction (_RegistryDataModel) {\n HypertyInstance_inherits(HypertyInstance, _RegistryDataModel);\n\n function HypertyInstance(id, url, descriptorURL, descriptor, hypertyURL, user, guid, runtime, context, p2pHandler, p2pRequester, dataSchemes, resources, startingTime, lastModified) {\n var _this2;\n\n HypertyInstance_classCallCheck(this, HypertyInstance);\n\n _this2 = HypertyInstance_possibleConstructorReturn(this, HypertyInstance_getPrototypeOf(HypertyInstance).call(this, id, url, descriptorURL, p2pRequester, startingTime, lastModified));\n\n var _this = HypertyInstance_assertThisInitialized(HypertyInstance_assertThisInitialized(_this2));\n\n _this._descriptor = descriptor;\n _this._hypertyURL = hypertyURL;\n _this._user = user;\n _this._guid = guid;\n _this._runtime = runtime;\n _this._context = context;\n _this._p2pHandler = p2pHandler;\n _this._dataSchemes = dataSchemes;\n _this._resources = resources;\n return _this2;\n }\n\n HypertyInstance_createClass(HypertyInstance, [{\n key: \"user\",\n set: function set(identity) {\n var _this = this;\n\n _this.user = identity;\n },\n get: function get() {\n var _this = this;\n\n return _this._user;\n }\n }, {\n key: \"hypertyURL\",\n get: function get() {\n var _this = this;\n\n return _this._hypertyURL;\n }\n }, {\n key: \"descriptor\",\n get: function get() {\n var _this = this;\n\n return _this._descriptor;\n }\n }, {\n key: \"objectName\",\n get: function get() {\n var _this = this;\n\n return _this._descriptor._objectName;\n }\n }, {\n key: \"p2pHandler\",\n get: function get() {\n var _this = this;\n\n return _this._p2pHandler;\n }\n }, {\n key: \"dataSchemes\",\n get: function get() {\n var _this = this;\n\n return _this._dataSchemes;\n }\n }, {\n key: \"resources\",\n get: function get() {\n var _this = this;\n\n return _this._resources;\n }\n }, {\n key: \"runtimeURL\",\n get: function get() {\n var _this = this;\n\n return _this._runtime;\n }\n }]);\n\n return HypertyInstance;\n}(registry_RegistryDataModel);\n\n/* harmony default export */ var registry_HypertyInstance = (HypertyInstance);\n// CONCATENATED MODULE: ./src/registry/DomainRegistration.js\nfunction DomainRegistration_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DomainRegistration_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DomainRegistration_createClass(Constructor, protoProps, staticProps) { if (protoProps) DomainRegistration_defineProperties(Constructor.prototype, protoProps); if (staticProps) DomainRegistration_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar DomainRegistration_log = loglevel[\"getLogger\"]('Registry');\n\n\n/**\r\n* Runtime DomainRegistration Interface\r\n*/\n\nvar DomainRegistration_DomainRegistration =\n/*#__PURE__*/\nfunction () {\n /**\r\n * To initialise the Runtime Registry with the RuntimeURL that will be the basis to derive the internal runtime addresses when allocating addresses to internal runtime component. In addition, the Registry domain back-end to be used to remotely register Runtime components, is also passed as input parameter.\r\n * @param {MessageBus} messageBus msgbus\r\n * @param {HypertyRuntimeURL} runtimeURL runtimeURL\r\n * @param {DomainURL} domain remoteRegistry\r\n */\n function DomainRegistration(runtimeURL, registryURL, domain, messageBus) {\n DomainRegistration_classCallCheck(this, DomainRegistration);\n\n if (!runtimeURL) throw new Error('runtimeURL is missing.');\n if (!registryURL) throw new Error('registryURL is missing.');\n if (!domain) throw new Error('domain is missing.');\n if (!messageBus) throw new Error('messageBus is missing.');\n\n var _this = this;\n\n _this.registryURL = registryURL;\n _this.runtimeURL = runtimeURL;\n _this._registrationRetries = 5; // number of attempts to register Hyperties and DataObjects when errors occurs\n // the expires in 3600, represents 1 hour\n //the expires is in seconds, unit of measure received by the domain registry\n\n _this.expiresTime = 3600;\n _this._domain = domain;\n _this._messageBus = messageBus;\n }\n /**\r\n * function to unregister an hypertyInstance in the Domain Registry\r\n * @param {String} hypertyInstance HypertyInsntance url\r\n *\r\n */\n\n\n DomainRegistration_createClass(DomainRegistration, [{\n key: \"unregisterHyperty\",\n value: function unregisterHyperty(hypertyInstance) {\n var _this = this;\n\n var message = {\n type: 'update',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n resource: '/hyperty/' + hypertyInstance,\n value: 'disconnected',\n attribute: 'status'\n }\n };\n\n _this._messageBus.postMessage(message, function (reply) {\n DomainRegistration_log.log('[DomainRegistration] unregister hyperty Reply', reply);\n });\n }\n /**\r\n * function to unregister a Data Object in the Domain Registry\r\n * @param {String} hypertyInstance HypertyInsntance url\r\n *\r\n */\n\n }, {\n key: \"unregisterDataObject\",\n value: function unregisterDataObject(url) {\n var _this = this;\n\n var message = {\n type: 'update',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n resource: url,\n value: {\n status: 'disconnected'\n }\n }\n };\n\n _this._messageBus.postMessage(message, function (reply) {\n DomainRegistration_log.log('[DomainRegistration] unregister dataObject Reply', reply);\n });\n }\n /**\r\n * function to delete an dataObjectInstance in the Domain Registry\r\n * @param {String} name DataObjectName\r\n */\n\n }, {\n key: \"deleteDataObjectInstance\",\n value: function deleteDataObjectInstance(name) {\n var _this = this;\n\n var message = {\n type: 'delete',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n value: {\n name: name\n }\n }\n };\n\n _this._messageBus.postMessage(message, function (reply) {\n DomainRegistration_log.log('[DomainRegistration] unregister dataObject Reply', reply);\n });\n }\n /**\r\n * Function to update an Hyperty\r\n */\n\n }, {\n key: \"updateHypertyInstance\",\n value: function updateHypertyInstance(resource, value) {\n var _this = this;\n\n var message = {\n type: 'UPDATE',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n resource: resource,\n value: value\n }\n };\n\n _this._messageBus.post.postMessage(message, function (reply) {// log.log('[Registry] Updated hyperty reply', reply);\n });\n }\n /**\r\n * To register a new Data Object in the Domain Registry.\r\n * @param {JSON} registration registration data to be used\r\n * @param {boolean} resume if this is just to update the registration with the resume of a data object\r\n */\n\n }, {\n key: \"registerDataObject\",\n value: function registerDataObject(registration, resume, p2pHandlerStub) {\n var _this = this;\n\n var p2pHandler;\n var p2pRequester;\n return new Promise(function (resolve, reject) {\n var dataScheme = [];\n var filteredDataScheme = registration.url.split(':');\n dataScheme.push(filteredDataScheme[0]);\n\n if (Object.keys(p2pHandlerStub).length !== 0) {\n p2pHandler = p2pHandlerStub[_this.runtimeURL].url;\n p2pRequester = runtimeUtils.runtimeDescriptor.p2pRequesterStub;\n }\n\n registration.startingTime = registration.created;\n delete registration.authorise;\n delete registration.created;\n delete registration.mutual;\n delete registration.resume;\n if (!registration.expires) registration.expires = _this.expiresTime;\n registration.dataSchemes = dataScheme;\n\n if (p2pHandler) {\n registration.p2pHandler = p2pHandler;\n registration.p2pRequester = p2pRequester;\n }\n\n registration.status = 'live';\n var message;\n\n if (!resume) {\n DomainRegistration_log.log('[Registry.registerDataObject] registering new data object URL', registration);\n message = {\n type: 'create',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n value: registration,\n policy: 'policy'\n }\n };\n } else {\n DomainRegistration_log.log('[Registry.registerDataObject] registering previously registered data object URL', registration);\n message = {\n type: 'update',\n to: 'domain://registry.' + _this._domain,\n from: _this.registryURL,\n body: {\n resource: registration.url,\n value: {\n status: 'live'\n }\n }\n };\n }\n\n try {\n _this._messageBus.postMessageWithRetries(message, _this._registrationRetries, function (reply) {\n // log.log('[Registry.registerDataObject] ===> registerDataObject Reply: ', reply);\n if (reply.body.code === 200) {\n resolve(registration);\n } else {\n reject('error on register DataObject');\n }\n });\n } catch (e) {\n DomainRegistration_log.error(e);\n reject(e);\n } //timer to keep the registration alive\n // the time is defined by a little less than half of the expires time defined\n\n\n var keepAliveTimer = setInterval(function () {\n var message = {\n type: 'update',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n resource: registration.url,\n value: {\n status: 'live'\n },\n method: 'refresh'\n }\n };\n\n _this._messageBus.postMessage(message, function (reply) {// log.log('[Registry.registerDataObject] KeepAlive Reply: ', reply);\n });\n }, registration.expires / 1.1 / 2 * 1000);\n });\n }\n /**\r\n * To register a new Hyperty in the Domain Registry.\r\n * @param {HypertyInstance} hyperty Hyperty to be registered\r\n * @param {boolean} resume if this is just to update the registration with the resume of a data object\r\n */\n\n }, {\n key: \"registerHyperty\",\n value: function registerHyperty(hyperty, resume) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var runtime = _this.runtimeURL;\n var status = 'live'; //message to register the new hyperty, within the domain registry\n\n var message;\n var registrationExpires = _this.expiresTime;\n var messageValue = {\n user: hyperty.user.email,\n descriptor: hyperty.descriptorURL,\n url: hyperty.hypertyURL,\n expires: registrationExpires,\n resources: hyperty.resources,\n dataSchemes: hyperty.dataSchemes,\n runtime: runtime,\n status: status\n }; // set a different expires if defined in the hyperty configuration\n\n if (hyperty.p2pHandler) {\n messageValue.p2pHandler = hyperty.p2pHandler;\n messageValue.p2pRequester = hyperty.p2pRequester;\n } // set a different expires value if configured in the Hyperty descriptor\n\n\n if (hyperty.descriptor.configuration && hyperty.descriptor.configuration.expires) registrationExpires = hyperty.descriptor.configuration.expires;\n\n if (!resume) {\n // log.log('[Registry registerHyperty] registering new Hyperty URL', addressURL.address[0]);\n // set a different expires if defined in the hyperty configuration\n // log.log('[Registry registerHyperty] registering new Hyperty at domain registry ', messageValue);\n message = {\n type: 'create',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n value: messageValue,\n policy: 'policy'\n }\n };\n } else {\n // log.log('[Registry registerHyperty] registering previously registered Hyperty URL', addressURL.address[0]);\n message = {\n type: 'update',\n to: 'domain://registry.' + _this._domain,\n from: _this.registryURL,\n body: {\n resource: hyperty.hypertyURL,\n value: {\n status: 'live',\n user: hyperty.user.email\n }\n }\n };\n\n if (hyperty.p2pHandler) {\n message.body.value.p2pHandler = hyperty.p2pHandler;\n message.body.value.p2pRequester = hyperty.p2pRequester;\n }\n } // log.log('[Registry registerHyperty] Hyperty registration at domain registry - ', message);\n\n\n try {\n _this._messageBus.postMessageWithRetries(message, _this._registrationRetries, function (reply) {\n // log.log('[Registry registerHyperty] Hyperty registration response: ', reply);\n if (reply.body.code === 200) {\n var result = {\n url: hyperty.hypertyURL\n };\n\n if (hyperty.p2pHandler) {\n result.p2pHandler = hyperty.p2pHandler;\n result.p2pRequester = hyperty.p2pRequester;\n }\n\n resolve(result);\n } else if (reply.body.code === 404) {\n // log.log('[Registry registerHyperty] The update was not possible. Registering new Hyperty at domain registry');\n message = {\n type: 'create',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n value: messageValue,\n policy: 'policy'\n }\n };\n\n try {\n _this._messageBus.postMessageWithRetries(message, _this._registrationRetries, function (reply) {\n // log.log('[Registry registerHyperty] Hyperty registration update response: ', reply);\n if (reply.body.code === 200) {\n var _result = {\n url: hyperty.hypertyURL\n };\n\n if (hyperty.p2pHandler) {\n _result.p2pHandler = hyperty.p2pHandler;\n _result.p2pRequester = hyperty.p2pRequester;\n }\n\n resolve(_result);\n } else {\n throw new Error('Failed to register an Hyperty: ' + reply);\n }\n });\n } catch (e) {\n DomainRegistration_log.error(e);\n reject(e);\n }\n } else {\n throw new Error('Failed to register an Hyperty to domain: ', reply);\n }\n });\n } catch (e) {\n DomainRegistration_log.error(e);\n reject(e);\n } //timer to keep the registration alive\n // the time is defined by a little less than half of the expires time defined\n\n\n var keepAliveTimer = setInterval(function () {\n var message = {\n type: 'update',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n resource: hyperty.hypertyURL,\n value: {\n status: 'live'\n },\n method: 'refresh'\n }\n };\n\n _this._messageBus.postMessage(message, function (reply) {// log.log('[Registry registerHyperty] KeepAlive Reply: ', reply);\n });\n }, registrationExpires / 1.1 / 2 * 1000);\n });\n }\n }]);\n\n return DomainRegistration;\n}();\n\n/* harmony default export */ var registry_DomainRegistration = (DomainRegistration_DomainRegistration);\n// CONCATENATED MODULE: ./src/registry/P2PConnectionResolve.js\nfunction P2PConnectionResolve_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction P2PConnectionResolve_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction P2PConnectionResolve_createClass(Constructor, protoProps, staticProps) { if (protoProps) P2PConnectionResolve_defineProperties(Constructor.prototype, protoProps); if (staticProps) P2PConnectionResolve_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar P2PConnectionResolve_log = loglevel[\"getLogger\"]('P2PConnectionResolve');\n/**\r\n* To process address resolution for p2p connections\r\n*/\n\nvar P2PConnectionResolve =\n/*#__PURE__*/\nfunction () {\n function P2PConnectionResolve(registry) {\n P2PConnectionResolve_classCallCheck(this, P2PConnectionResolve);\n\n var _this = this;\n\n _this._registry = registry;\n _this._remoteP2PEntities = {}; // All remote entities and associated runtime url that are reachable with existing p2p connections\n }\n /**\r\n * Verifies if remote Entity can be reached with a P2P Connection.\r\n * @param {URL.URL} info object URL\r\n * @return {HypertyDataObjectInstance} addressURL return the Data Object instance registered URL, return undefined otherwise\r\n */\n\n\n P2PConnectionResolve_createClass(P2PConnectionResolve, [{\n key: \"checkP2P\",\n value: function checkP2P(msg) {\n if (!msg.hasOwnProperty('to')) {\n // throw Error('The p2p verification was failed');\n return Promise.reject('The p2p verification was failed');\n }\n\n var scheme = msg.to.split('://')[0];\n var comp = msg.to.split('://')[1].split('/')[2];\n var url;\n if (comp) url = msg.to.substring(0, msg.to.indexOf('/' + comp));else url = msg.to;\n var p2p = {};\n if (msg.body && msg.body.p2p) p2p.p2p = msg.body.p2p;\n\n if (msg.body && msg.body.p2pHandler && msg.body.p2pRequester) {\n p2p.p2pHandler = msg.body.p2pHandler;\n p2p.p2pRequester = msg.body.p2pRequester;\n p2p.runtime = msg.body.p2pHandler.split('/p2phandler/')[0];\n }\n\n switch (scheme) {\n case 'runtime':\n return this.checkP2PRuntime(url, p2p);\n break;\n\n default:\n return this.checkP2PEntity(url, p2p);\n break;\n }\n }\n /**\r\n * Verifies if remote Entity (Hyperty or Data Object) can be reached with a P2P Connection.\r\n * @param {string} url Remote Entity URL to be checked\r\n * @param {object} p2p p2p information to be used including ´runtime´ with remote Runtime URL, 'p2pHandler' remote P2P Handler Stub URL and p2pRequester with Catalogue URL of P2P Requester to be used\r\n * @return {promise} registeredEntity if p2p connection is possible it returns p2p information to be used in the connection, otherwise the promise is rejected\r\n */\n\n }, {\n key: \"checkP2PEntity\",\n value: function checkP2PEntity(url, p2p) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var remoteEntity = _this._remoteP2PEntities[url];\n if (remoteEntity) resolve(remoteEntity);else if (p2p.runtime) resolve(p2p); // use provided p2p if available in the message body\n else if (p2p.p2p) {\n // otherwise look on Domain Registry\n P2PConnectionResolve_log.log('[Registry - checkP2PEntity] - search in Domain Registry: ', url);\n var message = {\n type: 'read',\n from: _this._registry.registryURL,\n to: 'domain://registry.' + _this._registry._domain,\n body: {\n resource: url\n }\n };\n\n _this._registry._messageBus.postMessage(message, function (reply) {\n P2PConnectionResolve_log.log('[Registry - checkP2PEntity] Domain Registry reply', reply);\n\n if ('value' in reply.body) {\n //todo: store retrieved entity\n var resolvedEntity = reply.body.value;\n\n if (resolvedEntity.hasOwnProperty('p2pHandler')) {\n resolve(resolvedEntity);\n } else {\n reject('[Registry checkP2PEntity] Hyperty found does not support P2P', reply.body.value);\n }\n } else {\n reject('[Registry checkP2PEntity] Hyperty with P2PHandler not found', reply.body.code);\n }\n });\n } else reject('[Registry checkP2PEntity] No P2P Connection available for ', url);\n });\n }\n /**\r\n * Verifies if remote Runtime can be reached with a P2P Connection.\r\n * @param {URL.URL} runtimeURL Runtime URL\r\n * @return {Object} p2pConnection return the P2PConnection instance registered URL, return undefined otherwise\r\n */\n\n }, {\n key: \"checkP2PRuntime\",\n value: function checkP2PRuntime(runtimeURL, p2p) {\n var _this = this;\n\n var registeredRuntime = {}; // look on locally stored p2p connections\n\n return new Promise(function (resolve, reject) {\n if (_this._registry.p2pConnectionList[runtimeURL]) {\n resolve({\n runtime: runtimeURL\n });\n } else if (p2p.runtime) {\n registeredRuntime = p2p;\n resolve(registeredRuntime);\n } else reject('[Registry.P2PConnectionResolve.checkP2PRuntime] No P2P Connection found to ', runtimeURL);\n });\n }\n /**\r\n * Verifies if remote Hyperty can be reached with a P2P Connection.\r\n * @param {JSON} info object or entity charateristics info\r\n * @return {addressURL} addressURL return the URL if there is any previousy registered URL, return undefined otherwise\r\n */\n\n }, {\n key: \"checkP2PHyperty\",\n value: function checkP2PHyperty(hypertyURL, p2p) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var hyperty; // look on locally stored hyperties\n\n for (var i in _this._registry.remoteHypertyList) {\n hyperty = _this._registry.remoteHypertyList[i];\n P2PConnectionResolve_log.log('[Registry - checkP2PHyperty] - for each Hyperty: ', hyperty); // todo: change to \"hyperty.url\" to be aligned with hyperty instance data model spec\n\n if (hyperty.hypertyID === hypertyURL) {\n if (hyperty.hasOwnProperty('p2pHandler')) {\n resolve(hyperty);\n } else {\n reject('[Registry checkP2PHyperty] Hyperty found does not support P2P', hyperty);\n }\n\n return;\n }\n }\n\n if (!hyperty && p2p.runtime) resolve(p2p); // use provided p2p if available in the message body\n else if (!hyperty && p2p.p2p) {\n // otherwise look on Domain Registry\n P2PConnectionResolve_log.log('[Registry - checkP2PHyperty] - search in Domain Registry: ', hyperty);\n var message = {\n type: 'read',\n from: _this._registry.registryURL,\n to: 'domain://registry.' + _this._registry._domain,\n body: {\n resource: hypertyURL\n }\n };\n\n _this._registry._messageBus.postMessage(message, function (reply) {\n P2PConnectionResolve_log.log('[Registry - checkP2PHyperty] Domain Registry reply', reply);\n\n if ('value' in reply.body) {\n //todo: store retrieved hyperty\n var resolvedHyperty = reply.body.value;\n\n _this._registry.remoteHypertyList.push(resolvedHyperty);\n\n if (resolvedHyperty.hasOwnProperty('p2pHandler')) {\n resolve(resolvedHyperty);\n } else {\n reject('[Registry checkP2PHyperty] Hyperty found does not support P2P', reply.body.value);\n }\n } else {\n reject('[Registry checkP2PHyperty] Hyperty with P2PHandler not found', reply.body.code);\n }\n });\n } else reject('[Registry checkP2PHyperty] No P2P Connection available for ', hypertyURL);\n });\n }\n /**\r\n * Verifies if remote Data Object can be reached with a P2P Connection.\r\n * @param {URL.URL} DataObjectURL object URL\r\n * @return {HypertyDataObjectInstance} addressURL return the Data Object instance registered URL, return undefined otherwise\r\n */\n\n }, {\n key: \"checkP2PDataObject\",\n value: function checkP2PDataObject(url, p2p) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n // look on locally stored Remote Data Objects\n var dataobject = _this._registry.remoteDataObjectList.filter(function (i) {\n return _this._registry.remoteDataObjectList[i].url === url;\n });\n\n if (dataobject.length !== 0 && dataobject[0].p2pRequester) {\n resolve(dataobject[0]);\n } else if (dataobject.length !== 0) {\n reject('[Registry checkP2PDataObject] Data Object found does not support P2P', dataobject[0]);\n } else if (dataobject.length === 0 && p2p.runtime) resolve(p2p); // use provided p2p info if available in the message body\n else if (dataobject.length && p2p.p2p) {\n // otherwise look on Domain Registry\n // look on Domain Registry\n var message = {\n type: 'read',\n from: _this._registry.registryURL,\n to: 'domain://registry.' + _this._registry._domain,\n body: {\n resource: url\n }\n };\n\n _this._registry._messageBus.postMessage(message, function (reply) {\n P2PConnectionResolve_log.log('discover data object per url reply', reply);\n\n if ('value' in reply.body) {\n //todo: store retrieved hyperty\n var resolvedDataObject = reply.body.value;\n\n _this._registry.remoteDataObjectList.push(resolvedDataObject);\n\n if (resolvedDataObject.p2pRequester) {\n resolve(resolvedDataObject);\n } else {\n reject('[Registry checkP2PDataObject] Data Object found does not support P2P', reply.body.value);\n }\n } else {\n reject('[Registry checkP2PDataObject] not found', reply.body.code);\n }\n });\n } else reject('[Registry checkP2PDataObject] no P2P Connection found');\n });\n }\n }, {\n key: \"addRemoteP2PEntity\",\n value: function addRemoteP2PEntity(url, runtime) {\n this._remoteP2PEntities[url] = runtime;\n }\n }, {\n key: \"removeRemoteP2PEntity\",\n value: function removeRemoteP2PEntity(url) {\n delete this._remoteP2PEntities[url];\n }\n }, {\n key: \"reconnectP2PRequester\",\n value: function reconnectP2PRequester(p2pRequester) {\n var _this = this;\n\n P2PConnectionResolve_log.log('[P2PConenctionResolve.reconnectP2PRequester] lets try to reconnect P2P Requester Stub: ', p2pRequester);\n return new Promise(function (resolve, reject) {\n var remoteRuntime = p2pRequester.runtime;\n var message = {\n type: 'execute',\n from: _this._registry.registryURL,\n to: p2pRequester.url,\n body: {\n method: 'connect',\n params: [p2pRequester.p2pHandler]\n }\n }; // lets prepare the p2pRequesterSTub reconnect by setting an observer to its status changes\n\n _this._registry.watchingYou.observe('p2pRequesterStub', function (change) {\n P2PConnectionResolve_log.log('[P2PConenctionResolve.reconnectP2PRequester] p2pRequesterStubs changed ' + _this._registry.p2pRequesterStub);\n\n if (change.keypath.split('.')[0] === remoteRuntime && change.name === 'status') {\n switch (change.newValue) {\n case 'live':\n P2PConnectionResolve_log.log('[P2PConenctionResolve.reconnectP2PRequester] p2pRequester is live ' + _this._registry.p2pRequesterStub[remoteRuntime]);\n resolve(_this._registry.p2pRequesterStub[remoteRuntime].url);\n break;\n\n case 'failed':\n P2PConnectionResolve_log.log('[P2PConenctionResolve.reconnectP2PRequester] p2pRequester reconnect failed ' + _this._registry.p2pRequesterStub[remoteRuntime]);\n reject('P2P Requester reconnect failed');\n break;\n\n default:\n }\n }\n }); // stub load\n\n\n _this._registry._messageBus.postMessage(message, function (reply) {\n P2PConnectionResolve_log.log('[P2PConenctionResolve.reconnectP2PRequester] reconnect request reply', reply);\n });\n });\n }\n }]);\n\n return P2PConnectionResolve;\n}();\n\n/* harmony default export */ var registry_P2PConnectionResolve = (P2PConnectionResolve);\n// CONCATENATED MODULE: ./src/utils/WatchingYou.js\nfunction WatchingYou_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction WatchingYou_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction WatchingYou_createClass(Constructor, protoProps, staticProps) { if (protoProps) WatchingYou_defineProperties(Constructor.prototype, protoProps); if (staticProps) WatchingYou_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar WatchingYou =\n/*#__PURE__*/\nfunction () {\n function WatchingYou() {\n WatchingYou_classCallCheck(this, WatchingYou);\n\n this._watching = {};\n this._observers = [];\n }\n\n WatchingYou_createClass(WatchingYou, [{\n key: \"watch\",\n value: function watch(key, object) {\n var _this = this;\n\n var deep = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (deep) {\n this._watching[key] = Object.deepObserve(object, function (changes) {\n changes.every(function (change) {\n _this._fireEvent(key, change);\n });\n });\n } else {\n this._watching[key] = Object.observe(object, function (changes) {\n changes.every(function (change) {\n _this._fireEvent(key, change);\n });\n });\n }\n\n return this._watching[key];\n }\n }, {\n key: \"observe\",\n value: function observe(key, callback) {\n this._observers.push({\n key: key,\n callback: callback\n });\n }\n }, {\n key: \"_fireEvent\",\n value: function _fireEvent(key, change) {\n this._observers.filter(function (observe) {\n return observe.key === key;\n }).forEach(function (observe) {\n observe.callback(change);\n });\n }\n }]);\n\n return WatchingYou;\n}();\n\n/* harmony default export */ var utils_WatchingYou = (WatchingYou);\n/*let watchChanges = new WatchChanges();\r\nlet p2pRequesterStub = watchChanges.watch('p2p', {}, true);\r\nlet stub = watchChanges.watch('stub', {});\r\n\r\nwatchChanges.observe('p2p', (change) => {\r\n console.log('p2pRequesterStub: ' + change.name + ' - ' + JSON.stringify(change.newValue));\r\n});\r\n\r\nwatchChanges.observe('p2p', (change) => {\r\n console.log('p2pRequesterStub: ' + change.name + ' - ' + JSON.stringify(change.newValue));\r\n});\r\n\r\nwatchChanges.observe('stub', (change) => {\r\n console.log('stub ' + change.name);\r\n});\r\n\r\np2pRequesterStub.a = {};\r\nstub.b = {name: 'vitor'};\r\np2pRequesterStub.a.name = 'Hello';\r\nstub.b = {name: 'vitor'};\r\np2pRequesterStub.a.age = '32';\r\np2pRequesterStub.a.name = 'World';*/\n// CONCATENATED MODULE: ./src/Utils.js\n\n\n// CONCATENATED MODULE: ./src/registry/Registry.js\nfunction Registry_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { Registry_typeof = function _typeof(obj) { return typeof obj; }; } else { Registry_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return Registry_typeof(obj); }\n\nfunction Registry_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Registry_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Registry_createClass(Constructor, protoProps, staticProps) { if (protoProps) Registry_defineProperties(Constructor.prototype, protoProps); if (staticProps) Registry_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar Registry_log = loglevel[\"getLogger\"]('Registry');\n\n\n\n\n\n\n\n\n // import DiscoveryServiceFramework from './DiscoveryServiceFramework';\n\nvar STATUS = {\n CREATED: 'created',\n LIVE: 'live',\n DEPLOYING: 'deploying',\n DEPLOYED: 'deployed',\n PROGRESS: 'in-progress',\n DISCONNECTED: 'disconnected',\n FAILED: 'deployment-failed',\n DEAD: 'dead'\n};\n/*import IdentityManager from './IdentityManager';\r\nimport Discovery from './Discovery';*/\n\n/**\r\n* Runtime Registry Interface\r\n*/\n\nvar Registry_Registry =\n/*#__PURE__*/\nfunction () {\n /**\r\n * To initialise the Runtime Registry with the RuntimeURL that will be the basis to derive the internal runtime addresses when allocating addresses to internal runtime component. In addition, the Registry domain back-end to be used to remotely register Runtime components, is also passed as input parameter.\r\n * @param {MessageBus} msgbus msgbus\r\n * @param {HypertyRuntimeURL} runtimeURL runtimeURL\r\n * @param {AppSandbox} appSandbox appSandbox\r\n * @param {runtimeCatalogue} runtimeCatalogue runtimeCatalogue\r\n * @param {DomainURL} remoteRegistry remoteRegistry\r\n * @param {storageManager} storageManager\r\n */\n function Registry(runtimeURL, appSandbox, identityModule, runtimeCatalogue, runtimeCapabilities, storageManager, p2pHandlerURL, remoteRegistry) {\n Registry_classCallCheck(this, Registry);\n\n // how some functions receive the parameters for example:\n // new Registry('hyperty-runtime://sp1/123', appSandbox, idModule, remoteRegistry);\n // registry.registerStub(sandbox, 'sp1');\n // registry.registerHyperty(sandBox, 'hyperty-runtime://sp1/123');\n // registry.resolve('hyperty-runtime://sp1/123');\n if (!runtimeURL) throw new Error('runtimeURL is missing.');\n if (!storageManager) throw new Error('storageManager is missing.');\n /*if (!remoteRegistry) throw new Error('remoteRegistry is missing');*/\n\n var _this = this;\n\n _this.registryURL = runtimeURL + '/registry/';\n _this.appSandbox = appSandbox;\n _this.runtimeURL = runtimeURL;\n _this.p2pHandlerURL = p2pHandlerURL;\n _this.runtimeCatalogue = runtimeCatalogue;\n _this.remoteRegistry = remoteRegistry;\n _this.idModule = identityModule;\n _this.storageManager = storageManager;\n _this.runtimeCapabilities = runtimeCapabilities;\n _this.identifier = generateGUID();\n _this.hypertiesListToRemove = {};\n _this.hypertiesList = [];\n _this.remoteHypertyList = [];\n _this.remoteDataObjectList = [];\n _this.idpLegacyProxyList = {};\n _this.watchingYou = new utils_WatchingYou();\n _this.p2pHandlerStub = {};\n _this.p2pRequesterStub = _this.watchingYou.watch('p2pRequesterStub', {}, true);\n _this.p2pConnectionList = _this.watchingYou.watch('p2pConnectionList', {}, true);\n _this.p2pHandlerAssociation = {};\n _this.protostubsList = _this.watchingYou.watch('protostubsList', {}, true);\n _this.idpProxyList = _this.watchingYou.watch('idpProxyList', {}, true);\n _this.dataObjectList = {};\n _this.subscribedDataObjectList = {};\n _this.sandboxesList = {\n sandbox: {},\n appSandbox: {}\n };\n _this.pepList = {};\n _this.registries = {};\n _this._domain = divideURL(_this.registryURL).domain;\n _this.sandboxesList.appSandbox[runtimeURL] = appSandbox;\n var p2pConnectionResolve = new registry_P2PConnectionResolve(_this);\n _this._p2pConnectionResolve = p2pConnectionResolve;\n _this._hypertyUrls = {};\n _this._dataObjectUrls = {};\n }\n\n Registry_createClass(Registry, [{\n key: \"loadRegistry\",\n value: function loadRegistry() {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this.storageManager.get('registry:HypertyURLs').then(function (urlsList) {\n if (urlsList) _this._hypertyUrls = urlsList;\n\n _this.storageManager.get('registry:DataObjectURLs').then(function (urlsList) {\n if (urlsList) _this._dataObjectUrls = urlsList;\n resolve();\n });\n });\n });\n }\n }, {\n key: \"_getIdentityAssociated\",\n value: function _getIdentityAssociated(type, hypertyURL) {\n var _this = this;\n\n for (var hyperty in _this.hypertiesList) {\n var value = _this.hypertiesList[hyperty];\n\n if (value._hypertyURL === hypertyURL) {\n switch (type) {\n case 'username':\n return value._user.username;\n\n case 'cn':\n return value._user.cn;\n\n case 'locale':\n return value._user.locale;\n\n case 'avatar':\n return value._user.avatar;\n\n case 'userURL':\n return value._user.userURL;\n\n case '.':\n return value._user;\n\n default:\n return '';\n }\n }\n }\n\n return '';\n }\n /**\r\n * This function is used to return the sandbox instance where the Application is executing. It is assumed there is just one App per Runtime instance.\r\n */\n\n }, {\n key: \"getAppSandbox\",\n value: function getAppSandbox() {\n var _this = this;\n\n return _this.appSandbox;\n }\n /**\r\n * This function returns the user associated to the hyperty URL\r\n * @param {String} hypertyURL hyperty URL\r\n * @return {String} userURL user URL\r\n */\n\n }, {\n key: \"getHypertyOwner\",\n value: function getHypertyOwner(hypertyURL) {\n var _this = this;\n\n var userURL;\n\n for (var index in _this.hypertiesList) {\n var hyperty = _this.hypertiesList[index];\n\n if (hyperty.hypertyURL === hypertyURL) {\n return hyperty.user.userURL;\n }\n }\n\n return userURL;\n }\n /**\r\n * This function returns the user associated to the hyperty URL\r\n * @param {String} dataObjectURL dataObjectURL URL\r\n * @return {String} userURL user URL\r\n */\n\n }, {\n key: \"getDataObjectReporter\",\n value: function getDataObjectReporter(dataObjectURL) {\n var _this = this;\n\n var DOurl = removePathFromURL(dataObjectURL);\n\n for (var index in _this.dataObjectList) {\n var dataObject = _this.dataObjectList[index];\n\n if (dataObject.url === DOurl) {\n return dataObject.reporter;\n }\n }\n\n return null;\n }\n /**\r\n * returns the hyperty Name from a given url. This url could be from a dataObject or hyperty\r\n * @param {String} url hyperty or dataObject URL\r\n * @return {String} hypertyName hyperty Name\r\n */\n\n }, {\n key: \"getHypertyName\",\n value: function getHypertyName(url) {\n var _this = this;\n\n var isHypertyURL = divideURL(url).type === 'hyperty'; //value to be returned in the end\n\n var hypertyName; //if is not an hyperty, check if is a dataObject and obtain his reporter\n\n var hypertyURL = isHypertyURL ? url : _this.getReporterURLSynchonous(url);\n\n for (var index in _this.hypertiesList) {\n var hyperty = _this.hypertiesList[index];\n\n if (hyperty.hypertyURL === hypertyURL) {\n hypertyName = hyperty.objectName;\n break;\n }\n }\n\n return hypertyName;\n }\n /**\r\n * function to return the reporterURL associated with the dataobject URL\r\n * @param {String} dataObjectURL dataObjectURL\r\n * @return {String} reporterURL reporterURL\r\n */\n\n }, {\n key: \"getReporterURL\",\n value: function getReporterURL(dataObjectURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var dataObject = _this.dataObjectList[dataObjectURL];\n\n if (dataObject) {\n resolve(dataObject.reporter);\n } else {\n reject('No reporter was found');\n }\n });\n }\n /**\r\n * function to return the reporterURL associated with the dataobject URL. no promise returned\r\n * @param {String} dataObjectURL dataObjectURL\r\n * @return {String} reporterURL reporterURL\r\n */\n\n }, {\n key: \"getReporterURLSynchonous\",\n value: function getReporterURLSynchonous(dataObjectURL) {\n var _this = this;\n\n var dataObject = _this.dataObjectList[dataObjectURL];\n return dataObject ? dataObject.reporter : undefined;\n }\n /**\r\n * returns the hyperty URL that subscribed the dataObject\r\n * @param {String} url url format\r\n * @return {String} Hyperty URL subscribed to the URL\r\n */\n\n }, {\n key: \"getDataObjectSubscriberHyperty\",\n value: function getDataObjectSubscriberHyperty(url) {\n var _this = this;\n\n return _this.subscribedDataObjectList[url];\n }\n /**\r\n * register a desired dataObject to subscribe\r\n * @param {String} dataObjectURL dataObject URL\r\n */\n\n }, {\n key: \"registerSubscribedDataObject\",\n value: function registerSubscribedDataObject(dataObjectURL, hypertyURL) {\n var _this = this;\n\n if (_this.subscribedDataObjectList[dataObjectURL] === undefined) {\n _this.subscribedDataObjectList[dataObjectURL] = hypertyURL;\n }\n }\n /**\r\n * Function to return the list of pre authorised users received in the creation of a data object\r\n * @param {String} dataObjectURL dataObjectURL\r\n * @return {Array} preAuth List of pre authorised users\r\n */\n\n }, {\n key: \"getPreAuthSubscribers\",\n value: function getPreAuthSubscribers(dataObjectURL) {\n var _this = this;\n\n var dataObject = _this.dataObjectList[dataObjectURL];\n var preAuth = [];\n\n if (dataObject) {\n preAuth = dataObject.authorise;\n }\n\n return preAuth;\n }\n /**\r\n * send requests to unregister all hyperties registered in domain registry\r\n * @return {Promise} return a promise if the result of unregistration all hyperties\r\n */\n\n }, {\n key: \"unregisterAllHyperties\",\n value: function unregisterAllHyperties() {\n var _this = this;\n\n var unregisterResults = [];\n return new Promise(function (resolve, reject) {\n for (var index in _this.hypertiesList) {\n var hyperty = _this.hypertiesList[index];\n\n var result = _this.unregisterHypertyInstance(hyperty.hypertyURL);\n\n unregisterResults.push(result);\n }\n\n Promise.all(unregisterResults).then(function () {\n resolve('successfully unregistered all hyperties');\n }, function (error) {\n reject(error);\n });\n });\n }\n /**\r\n * function to unregister an hypertyInstance in the Domain Registry\r\n * @param {String} hypertyInstance HypertyInsntance url\r\n *\r\n */\n\n }, {\n key: \"unregisterHypertyInstance\",\n value: function unregisterHypertyInstance(hypertyInstance) {\n //TODO working but the user\n var _this = this;\n\n var closeMsg = {\n type: 'execute',\n from: _this.registryURL,\n to: hypertyInstance,\n body: {\n method: 'close'\n }\n }; // Send message to hyperty to close\n\n _this._messageBus.postMessage(closeMsg, function (reply) {\n Registry_log.log('[Registry.unregisterHypertyInstance] Close Reply', reply);\n\n _this._domainRegistration.unregisterHyperty(hypertyInstance);\n });\n }\n /**\r\n * function to unregister a Data Object in the Domain Registry\r\n * @param {String} hypertyInstance HypertyInsntance url\r\n *\r\n */\n\n }, {\n key: \"unregisterDataObject\",\n value: function unregisterDataObject(url) {\n this._domainRegistration.unregisterDataObject(url);\n }\n /**\r\n * register a new subscriber in the dataObject registered\r\n * @param {String} dataObjectURL dataObject URL\r\n * @param {String} subscriberURL subscriber URL\r\n */\n\n }, {\n key: \"registerSubscriber\",\n value: function registerSubscriber(dataObjectURL, subscriberURL) {\n var _this = this;\n\n var dataObject = _this.dataObjectList[dataObjectURL];\n\n if (dataObject) {\n if (!dataObject.subscribers) dataObject.subscribers = [];\n dataObject.subscribers.push(subscriberURL);\n _this.dataObjectList[dataObjectURL] = dataObject;\n }\n }\n /**\r\n * get the subscribers registered within a dataObject\r\n * @param {String} dataObjectURL dataObject URL\r\n * @param {Array} Substribers List\r\n */\n\n }, {\n key: \"getDataObjectSubscribers\",\n value: function getDataObjectSubscribers(dataObjectURL) {\n var _this = this;\n\n var dataObject = _this.dataObjectList[dataObjectURL];\n\n if (dataObject) {\n return dataObject.subscribers;\n } else {\n throw 'No dataObject was found';\n }\n }\n /**\r\n * To register a new Data Object in the runtime which returns the dataObjectURL allocated to the new Data Object.\r\n * @param {String} identifier identifier\r\n * @param {String} dataObjectschema dataObjectschema\r\n * @param {String} dataObjectUrl dataObjectUrl\r\n * @param {String} dataObjectReporter dataObjectReporter\r\n * @param {Array} resources dataObject resources\r\n * @param {Array} authorise list of pre authorised authorised IDs\r\n */\n //registerDataObject(identifier, dataObjectschema, dataObjectUrl, dataObjectReporter, resources, addressURL, authorise) {\n\n }, {\n key: \"registerDataObject\",\n value: function registerDataObject(objectRegistration) {\n var _this = this;\n\n var registration = deepClone(objectRegistration);\n return new Promise(function (resolve, reject) {\n _this.dataObjectList[objectRegistration.url] = objectRegistration; // _this.storageManager.get('registry:DataObjectURLs').then((urlsList) => {\n\n /* if (!urlsList) {\r\n urlsList = {};\r\n }*/\n //update the list with the new elements\n\n _this._dataObjectUrls[objectRegistration.name + objectRegistration.schema + objectRegistration.resources + objectRegistration.reporter] = objectRegistration.url; // step to obtain the list of all URL registered to updated with the new one.\n\n _this.storageManager.set('registry:DataObjectURLs', 0, _this._dataObjectUrls).then(function () {\n if (_this.isInterworkingProtoStub(registration.reporter)) {\n registration.interworking = true;\n }\n\n var domainRegistration = true;\n if (registration.hasOwnProperty(\"domain_registration\")) domainRegistration = registration.domain_registration;\n if (domainRegistration) _this._domainRegistration.registerDataObject(registration, objectRegistration.resume, _this.p2pHandlerStub).then(function (registered) {\n resolve(registered);\n });else resolve(registration);\n }).catch(function (reason) {\n Registry_log.error('[Registry registerDataObject] Error: ', reason);\n reject(reason);\n });\n }); // });\n }\n }, {\n key: \"_getResourcesAndSchemes\",\n value: function _getResourcesAndSchemes(descriptor) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var resources; // check if the hyperty resources is a vector or a string\n // TODO delete later when catalogue is fixed\n\n if (typeof descriptor.hypertyType === 'string') {\n resources = [];\n resources.push(descriptor.hypertyType);\n } else {\n resources = descriptor.hypertyType;\n }\n\n var objName = descriptor.objectName;\n var descriptorDataSchema = descriptor.dataObjects;\n var dataSchemasArray = []; //this will create a array with a Promise in each position\n\n for (var index in descriptorDataSchema) {\n dataSchemasArray.push(_this.runtimeCatalogue.getDataSchemaDescriptor(descriptorDataSchema[index]));\n } // as soon as the previous array is completed, this will wait for the resolve of all promises in the array\n\n\n Promise.all(dataSchemasArray).then(function (dataSchemas) {\n var filteredDataSchemas = [];\n\n for (var _index in dataSchemas) {\n var dataSchema = dataSchemas[_index];\n filteredDataSchemas.push(dataSchema.sourcePackage.sourceCode.properties.scheme);\n } // log.log('[Registry] Hyperty Schemas', filteredDataSchemas);\n // log.log('[Registry] Hyperty resources', resources);\n\n\n resolve({\n resources: resources,\n dataSchema: filteredDataSchemas,\n name: objName\n });\n });\n });\n }\n /**\r\n * method that returns previously registered Hyperty or DataObjects URLS, for given characteristics\r\n * @param {JSON} info object or hyperty charateristics info\r\n * @return {addressURL} addressURL return the URL if there is any previousy registered URL, return undefined otherwise\r\n */\n\n }, {\n key: \"checkRegisteredURLs\",\n value: function checkRegisteredURLs(info, reuseURL) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var objectType = info.reporter ? 'registry:DataObjectURLs' : 'registry:HypertyURLs';\n\n if (typeof reuseURL === 'string') {\n objectType = reuseURL && divideURL(reuseURL).type !== 'hyperty' ? 'registry:DataObjectURLs' : 'registry:HypertyURLs';\n } //debugger;\n\n\n _this.storageManager.get(objectType).then(function (urlsList) {\n if (!urlsList) {\n urlsList = {};\n }\n\n if (typeof reuseURL === 'string') {\n Registry_log.info('[Registry - checkRegisteredURLs] - look for ' + reuseURL + ' on ', urlsList);\n var searchResult = Object.keys(urlsList).map(function (key) {\n var indexOf = urlsList[key].indexOf(reuseURL);\n return urlsList[key][indexOf];\n });\n Registry_log.info('[Registry - checkRegisteredURLs] - found ' + searchResult.length + ' results on ', searchResult);\n\n if (searchResult.length === 1) {\n return resolve(searchResult);\n } else {\n return resolve(undefined);\n }\n }\n\n if (objectType === 'registry:HypertyURLs') {\n _this._getResourcesAndSchemes(info).then(function (value) {\n if (urlsList[value.resources + value.dataSchema + value.name]) {\n // log.log('[Registry] reusage of hyperty URL');\n return resolve(urlsList[value.resources + value.dataSchema + value.name]);\n } else {\n // log.log('[Registry] no hyperty URL was previously registered ');\n return resolve(undefined);\n }\n });\n } else {\n var characteristics = info.name + info.schema + info.resources + info.reporter;\n\n if (urlsList[characteristics]) {\n // log.log('[Registry] reusage of dataObject URL');\n if (typeof urlsList[characteristics] === 'string') {\n var arrayToResolve = [];\n arrayToResolve.push(urlsList[characteristics]);\n return resolve(arrayToResolve);\n } else {\n return resolve(urlsList[characteristics]);\n }\n } else {\n // log.log('[Registry] no dataObject URL was previously registered');\n return resolve(undefined);\n }\n }\n });\n });\n }\n /**\r\n * To register a new Hyperty in the runtime which returns the HypertyURL allocated to the new Hyperty.\r\n * @param {Sandbox} sandbox sandbox\r\n * @param {HypertyCatalogueURL} HypertyCatalogueURL descriptor\r\n * @param {object} IdpConstraint - constraints to be used when selecting the identity to be associated with the Hyperty including origin, idp, and idHint.\r\n * @return {HypertyURL} HypertyURL\r\n */\n\n }, {\n key: \"registerHyperty\",\n value: function registerHyperty(sandbox, importPath, descriptor, addressURL, IdpConstraint) {\n var _this = this;\n\n var hypertyCapabilities;\n return new Promise(function (resolve, reject) {\n _this.idModule.getIdentityAssertion(IdpConstraint).then(function (result) {\n var userProfile = result.userProfile; // log.log('[Registry registerHyperty] userProfile', userProfile);\n\n if (_this._messageBus === undefined) {\n reject('[Registry registerHyperty] MessageBus is undefined');\n } else {\n //call check if the protostub exist: to be removed\n\n /* _this.resolve(domainUrl).then(function(a) {\r\n // log.log('[Registry registerHyperty] stub to domain registry- ', a);*/\n // _this.storageManager.get('registry:HypertyURLs').then((urlsList) => {\n // log.log('[Registry registerHyperty] storageManager] - ', urlsList);\n _this._getResourcesAndSchemes(descriptor).then(function (value) {\n hypertyCapabilities = value;\n /* if (!urlsList) {\r\n urlsList = {};\r\n }*/\n\n _this._hypertyUrls[hypertyCapabilities.resources + hypertyCapabilities.dataSchema + hypertyCapabilities.name] = addressURL.address;\n\n _this.storageManager.set('registry:HypertyURLs', 0, _this._hypertyUrls).then(function () {\n //check whether the received sanbox e ApplicationSandbox or a normal sandbox\n if (sandbox.type === 'app') {\n _this.sandboxesList.appSandbox[addressURL.address[0]] = sandbox;\n } else if (sandbox.type === 'normal') {\n _this.sandboxesList.sandbox[addressURL.address[0]] = sandbox;\n } else {\n reject('Wrong SandboxType');\n }\n\n var p2pHandler;\n var p2pRequester;\n\n if (Object.keys(_this.p2pHandlerStub).length !== 0) {\n p2pHandler = _this.p2pHandlerStub[_this.runtimeURL].url;\n p2pRequester = runtimeUtils.runtimeDescriptor.p2pRequesterStub;\n }\n\n var hyperty = new registry_HypertyInstance(_this.identifier, _this.registryURL, importPath, descriptor, addressURL.address[0], userProfile, 'guid', _this.runtimeURL, 'ctx', p2pHandler, p2pRequester, hypertyCapabilities.dataSchema, hypertyCapabilities.resources);\n\n _this.hypertiesList.push(hyperty);\n /*--- start here move p2p and domain registry related features to a separated function.-------..*/\n\n\n var registrationAtdomain = true;\n\n if (descriptor.hasOwnProperty(\"_configuration\") && descriptor.configuration.hasOwnProperty(\"domain_registration\")) {\n registrationAtdomain = descriptor.configuration.domain_registration;\n }\n\n if (registrationAtdomain) _this._domainRegistration.registerHyperty(hyperty, addressURL.newAddress).then(function (registered) {\n resolve(registered);\n });else resolve({\n url: hyperty.hypertyURL\n });\n /*------------------- END HERE MOVE DOMAIN REGISTRY ------------------*/\n }).catch(function (reason) {\n // log.log('[Registry registerHyperty] Error: ', reason);\n reject(reason);\n });\n }); // });\n\n }\n }, function (err) {\n reject('[Registry registerHyperty] ', err);\n });\n });\n }\n /**\r\n * To unregister a previously registered Hyperty\r\n * @param {HypertyURL} HypertyURL url url\r\n */\n\n }, {\n key: \"unregisterHyperty\",\n value: function unregisterHyperty(url) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var found = false;\n var index = 0;\n\n for (index = 0; index < _this.hypertiesList.length; index++) {\n var hyperty = _this.hypertiesList[index];\n\n if (hyperty !== undefined) {\n if (hyperty.hypertyURL === url) {\n found = true;\n break;\n }\n }\n }\n\n if (found === false) {\n reject('Hyperty not found');\n } else {\n delete _this.hypertiesList[index];\n resolve('Hyperty successfully deleted');\n }\n });\n }\n /**\r\n * To discover protocol stubs available in the runtime for a certain domain. If available, it returns the runtime url for the protocol stub that connects to the requested domain. Required by the runtime BUS to route messages to remote servers or peers (do we need something similar for Hyperties?).\r\n * @param {DomainURL} DomainURL url\r\n * @return {RuntimeURL} RuntimeURL\r\n */\n\n }, {\n key: \"discoverProtostub\",\n value: function discoverProtostub(url) {\n if (!url) throw new Error('Parameter url needed');\n\n var _this = this;\n\n var dividedURL = divideURL(url);\n var domainURL = dividedURL.domain;\n\n if (_this.protostubsList.hasOwnProperty(domainURL) && _this.protostubsList[domainURL].status === STATUS.LIVE) {\n return _this.protostubsList[domainURL];\n } else {\n _this.protostubsList[domainURL] = {\n status: STATUS.DEPLOYING\n };\n throw new Error('[Registry - discoverProtoStub ] Message Node Protostub Not Found. Creating one');\n }\n }\n /**\r\n * To discover protocol stubs available in the runtime for a certain remote runtime URL. If available, it returns the runtime url for the protocol stub that connects to the requested domain.\r\n * Required by the runtime BUS to route messages to remote servers or peers (do we need something similar for Hyperties?).\r\n * @param {RuntimeURL} RuntimeURL url\r\n * @return {p2pRequester} RuntimeURL\r\n */\n\n }, {\n key: \"discoverP2PStub\",\n value: function discoverP2PStub(runtimeURL) {\n var _this = this;\n\n if (runtimeURL) {\n if (_this.p2pRequesterStub.hasOwnProperty(runtimeURL) && _this.p2pRequesterStub[runtimeURL].status === STATUS.LIVE) {\n return _this.p2pRequesterStub[runtimeURL];\n } else {\n _this.p2pRequesterStub[runtimeURL] = {\n status: STATUS.CREATED\n };\n throw new Error('[Registry - discoverP2PStub ] P2P Requester Stub Not Found. Creating one');\n }\n } else {\n if (_this.p2pHandlerStub.hasOwnProperty(_this.runtimeURL)) {\n return _this.p2pHandlerStub[_this.runtimeURL];\n } else {\n _this.p2pHandlerStub[_this.runtimeURL] = {\n status: STATUS.CREATED\n };\n throw new Error('[Registry - discoverP2PStub ] P2P Handler Stub Not Found.');\n }\n }\n }\n /**\r\n * To register a new Protocol Stub in the runtime including as input parameters the function to postMessage, the DomainURL that is connected with the stub, which returns the RuntimeURL allocated to the new ProtocolStub.\r\n * @param {Sandbox} Sandbox\r\n * @param {stubID} Domain or hyperty runtime to register the stub\r\n * @param {descriptorURL} Catalogue URL of the Protostub descriptor\r\n * @param {descriptor} Protostub descriptor\r\n * @return {RuntimeProtoStubURL}\r\n */\n\n }, {\n key: \"registerStub\",\n value: function registerStub(sandbox, stubID, p2pConfig, descriptorURL, descriptor) {\n var _this = this;\n\n var _stubDescriptor = descriptor;\n return new Promise(function (resolve, reject) {\n var runtimeProtoStubURL; //check if messageBus is registered in registry or not\n\n if (_this._messageBus === undefined) {\n reject('MessageBus not found on registerStub');\n }\n\n Registry_log.info('[Registry - registerStub] - stubID ', stubID);\n /* if (!stubID.indexOf('msg-node.')) {\r\n stubID = stubID.substring(stubID.indexOf('.') + 1);\r\n }*/\n\n var P2PRequesterStub;\n\n if (p2pConfig) {\n if (p2pConfig.hasOwnProperty('isHandlerStub') && p2pConfig.isHandlerStub) {\n runtimeProtoStubURL = _this.p2pHandlerURL;\n _this.p2pHandlerStub[stubID] = {\n url: runtimeProtoStubURL,\n status: STATUS.CREATED\n };\n _this.p2pHandlerAssociation[_this.runtimeURL] = [];\n _this.sandboxesList.sandbox[runtimeProtoStubURL] = sandbox;\n Registry_log.info('[Registry - registerStub - P2PHandlerStub] - ', stubID, ' - ', runtimeProtoStubURL);\n resolve(_this.p2pHandlerStub[stubID]);\n } else {\n P2PRequesterStub = p2pConfig.p2pRequesterStub;\n runtimeProtoStubURL = 'runtime://' + divideURL(p2pConfig.remoteRuntimeURL).domain + '/p2prequester/' + generateGUID();\n Registry_log.info('[Registry - registerStub - P2PRequesterStub] - ', P2PRequesterStub, ' - ', runtimeProtoStubURL); // to be clarified what is this p2pHandlerAssociation\n\n _this.p2pHandlerAssociation[_this.runtimeURL].push(runtimeProtoStubURL);\n\n _this.p2pRequesterStub[stubID] = {\n url: runtimeProtoStubURL,\n status: STATUS.CREATED\n };\n _this.sandboxesList.sandbox[runtimeProtoStubURL] = sandbox; //Setup P2P Requester path into MN\n\n var msg = {\n type: 'subscribe',\n from: _this.registryURL,\n to: 'domain://msg-node.' + _this._domain + '/sm',\n body: {\n subscribe: [runtimeProtoStubURL],\n source: _this.registryURL\n }\n };\n\n _this._messageBus.postMessage(msg, function (reply) {// log.log('[Registry - register Stub] p2pRequester path setup: ', reply);\n });\n\n resolve(_this.p2pRequesterStub[stubID]);\n }\n } else {\n console.log('[Registry - registerStub - Normal Stub] descriptor', descriptor);\n\n if (!Registry_typeof(descriptor) === 'string' && descriptor.hasOwnProperty('_interworking') && descriptor._interworking) {\n runtimeProtoStubURL = 'runtime://' + stubID + '/protostub/' + 'scheme1';\n } else {\n runtimeProtoStubURL = 'runtime://' + stubID + '/protostub/' + generateGUID();\n }\n\n Registry_log.info('[Registry - registerStub - Normal Stub] - ', stubID); // TODO: Optimize this\n\n _this.protostubsList[stubID] = {\n url: runtimeProtoStubURL,\n status: STATUS.DEPLOYING\n };\n\n if (descriptorURL) {\n _this.protostubsList[stubID].descriptorURL = descriptorURL;\n }\n\n if (_stubDescriptor && _stubDescriptor.interworking) {\n _this.protostubsList[stubID].interworking = _stubDescriptor.interworking;\n }\n\n _this.sandboxesList.sandbox[runtimeProtoStubURL] = sandbox;\n resolve(_this.protostubsList[stubID]);\n } // resolve(runtimeProtoStubURL);\n\n\n _this._messageBus.addListener(runtimeProtoStubURL + '/status', function (msg) {\n _this._onProtostubStatusEvent(msg);\n });\n });\n }\n /**\r\n * To Process status events fired by protostubs\r\n * @param {Message} message Event Message\r\n */\n\n }, {\n key: \"_onProtostubStatusEvent\",\n value: function _onProtostubStatusEvent(msg) {\n var _this = this; // log.log('[Registry onProtostubStatusEvent]: ', msg);\n\n\n var runtimeProtoStubURL = msg.from;\n\n if (!msg.to.includes('/status')) {\n Registry_log.error('[Registry onProtostubStatusEvent] Not Status Event: ', msg);\n return;\n } else {\n // broadcast Protostub status event to all Hyperties\n var from = msg.from;\n msg.from = _this.runtimeURL;\n msg.to = _this.runtimeURL + '/status';\n msg.body.resource = from;\n\n _this._messageBus.postMessage(msg);\n } // process status events from message node protostubs\n\n\n if (runtimeProtoStubURL.includes('/protostub/')) {\n // TODO: uncomment below when protostubs are updated with new status value \"live\"\n Object.keys(_this.protostubsList).filter(function (key) {\n return _this.protostubsList[key].url === runtimeProtoStubURL;\n }).map(function (key) {\n _this.protostubsList[key].status = msg.body.value; // log.log('[Registry - onProtostubStatusEvent] - Protostub status: ', _this.protostubsList[key]);\n });\n } else {\n // process status events from p2p connections\n if (msg.body.resource) {\n var remoteRuntimeURL = msg.body.resource;\n\n if (_this.p2pConnectionList[remoteRuntimeURL]) {\n _this.p2pConnectionList[remoteRuntimeURL].status = msg.body.value;\n _this.p2pConnectionList[remoteRuntimeURL].url = runtimeProtoStubURL;\n } else {\n var p2pConnection = {\n status: msg.body.value,\n url: runtimeProtoStubURL\n };\n _this.p2pConnectionList[remoteRuntimeURL] = p2pConnection;\n } // log.log('[Registry - onProtostubStatusEvent] - P2PConnection status: ', _this.p2pConnectionList[remoteRuntimeURL]);\n // Update P2P Requester protostub if it is coming from there\n\n\n if (runtimeProtoStubURL.includes('/p2prequester/')) {\n _this.p2pRequesterStub[remoteRuntimeURL].status = msg.body.value; // log.log('[Registry - onProtostubStatusEvent] - P2P Requester status: ', _this.p2pRequesterStub[remoteRuntimeURL]);\n } else {\n // if from P2PHandler with status disconencted, lets remove from p2pConnectionList\n if (msg.body.value === 'disconnected') delete _this.p2pConnectionList[remoteRuntimeURL];\n }\n } else {\n if (runtimeProtoStubURL.includes('/p2prequester/')) {\n // It is an event from P2P Requester without mandatory \"resource\" field\n Registry_log.error('[Registry onProtostubStatusEvent] resource missing: ', msg);\n return;\n } else {\n // It is an event from P2P Handler\n _this.p2pHandlerStub[_this.runtimeURL].status = msg.body.value; // log.log('[Registry - onProtostubStatusEvent] - P2PHandler Stub status: ', _this.p2pHandlerStub[_this.runtimeURL]);\n }\n }\n }\n }\n /**\r\n * To unregister a previously registered protocol stub\r\n * @param {HypertyRuntimeURL} HypertyRuntimeURL hypertyRuntimeURL\r\n */\n\n }, {\n key: \"unregisterStub\",\n value: function unregisterStub(hypertyRuntimeURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this.protostubsList.hasOwnProperty(hypertyRuntimeURL)) {\n delete _this.protostubsList[hypertyRuntimeURL];\n resolve('ProtostubURL removed');\n } else {\n reject('Error on unregisterStub: Hyperty not found');\n }\n });\n }\n /**\r\n * To register a new Identity Provider proxy in the runtime including as input parameters the function to postMessage, the DomainURL that is connected with the stub, which returns the RuntimeURL allocated to the new ProtocolStub.\r\n * @param {Sandbox} Sandbox\r\n * @param {DomainURL} DomainURL service provider domain\r\n * @return {RuntimeIdpProxyURL}\r\n */\n\n }, {\n key: \"registerIdpProxy\",\n value: function registerIdpProxy(sandbox, domainURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var idpProxyStubURL; //check if messageBus is registered in registry or not\n\n if (_this._messageBus === undefined) {\n reject('MessageBus not found on registerStub');\n }\n\n idpProxyStubURL = 'domain-idp://' + domainURL + '/stub/' + generateGUID(); // TODO: Optimize this\n\n _this.idpProxyList[domainURL] = {\n url: idpProxyStubURL,\n status: STATUS.DEPLOYING\n };\n _this.sandboxesList.sandbox[idpProxyStubURL] = sandbox; // sandbox.addListener('*', function(msg) {\n // _this._messageBus.postMessage(msg);\n // });\n\n resolve(idpProxyStubURL);\n\n _this._messageBus.addListener(idpProxyStubURL + '/status', function (msg) {\n _this._onIdpProxyStatusEvent(msg);\n });\n });\n }\n /**\r\n * To Process status events fired by Idp Proxies\r\n * @param {Message} message Event Message\r\n */\n\n }, {\n key: \"_onIdpProxyStatusEvent\",\n value: function _onIdpProxyStatusEvent(msg) {\n var _this = this; // log.log('[Registry onIdpProxyStatusEvent]: ', msg);\n\n\n var idpProxyURL = msg.from;\n\n if (!msg.to.includes('/status')) {\n Registry_log.error('[Registry onIdpProxyStatusEvent] Not Status Event: ', msg);\n return;\n }\n\n Object.keys(_this.idpProxyList).filter(function (key) {\n return _this.idpProxyList[key].url === idpProxyURL;\n }).map(function (key) {\n _this.idpProxyList[key].status = msg.body.value; // log.log('[Registry - onIdpProxyStatusEvent] - Idp Proxy status: ', _this.idpProxyList[key]);\n });\n }\n /**\r\n * To discover idpProxy stubs available in the runtime for a certain domain. If available, it returns the runtime url for the idpProxy stub that connects to the requested domain. Required by the runtime BUS to route messages to remote servers or peers\r\n * @param {DomainURL} DomainURL url\r\n * @return {RuntimeURL} RuntimeURL idpProxyUrl\r\n */\n\n }, {\n key: \"discoverIdpProxy\",\n value: function discoverIdpProxy(url) {\n if (!url) throw new Error('Parameter url needed');\n\n var _this = this;\n\n var dividedURL = divideURL(url);\n var domainURL = dividedURL.domain;\n\n if (_this.idpProxyList.hasOwnProperty(domainURL) && _this.idpProxyList[domainURL].status === STATUS.LIVE) {\n return _this.idpProxyList[domainURL];\n } else {\n _this.idpProxyList[domainURL] = {\n status: STATUS.PROGRESS\n };\n throw new Error('[Registry - discoverIdpProxy ] Idp Proxy Not Found. Creating one');\n }\n }\n /**\r\n * To register a new Policy Enforcer in the runtime including as input parameters the function to postMessage, the HypertyURL associated with the PEP, which returns the RuntimeURL allocated to the new Policy Enforcer component.\r\n * @param {Message.Message} postMessage postMessage\r\n * @param {HypertyURL} HypertyURL hyperty\r\n * @return {HypertyRuntimeURL} HypertyRuntimeURL\r\n */\n\n }, {\n key: \"registerPEP\",\n value: function registerPEP(postMessage, hyperty) {\n var _this = this;\n\n return new Promise(function (resolve) {\n //TODO check what parameter in the postMessage the pep is.\n _this.pepList[hyperty] = postMessage;\n resolve('PEP registered with success');\n });\n }\n /**\r\n * To unregister a previously registered protocol stub\r\n * @param {HypertyRuntimeURL} HypertyRuntimeURL HypertyRuntimeURL\r\n */\n\n }, {\n key: \"unregisterPEP\",\n value: function unregisterPEP(HypertyRuntimeURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var result = _this.pepList[HypertyRuntimeURL];\n\n if (result === undefined) {\n reject('Pep Not found.');\n } else {\n resolve('PEP successfully removed.');\n }\n });\n }\n /**\r\n * To discover sandboxes available in the runtime for a certain domain and a certain set of capabilities. Required by the runtime UA to avoid more than one sandbox for the same domain.\r\n * @param {DomainURL} DomainURL url\r\n * @return {RuntimeSandbox} RuntimeSandbox\r\n */\n\n }, {\n key: \"getSandbox\",\n value: function getSandbox(url, constraints) {\n if (!url) throw new Error('Parameter url needed'); // log.log('[Registry getSandbox] getSandbox for: ', url, ' and capabilities: ', constraints);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var request; //first try to find the url in the appSandbox list\n\n request = _this.sandboxesList.appSandbox[url]; //if no appSandbox was found, try to search in the normal sandboxes list\n\n if (!request) {\n request = _this.sandboxesList.sandbox[url];\n\n if (!request) {\n var domain;\n\n if (url.includes('://')) {\n domain = divideURL(url).domain;\n } else {\n domain = url;\n } // search in the sandboxes list for a entry containing the domain given\n\n\n for (var sandbox in _this.sandboxesList.sandbox) {\n //todo: uncomment sandbox constraints match condition with runtime sharing\n if (sandbox.includes(domain) && _this.sandboxesList.sandbox[sandbox].matches(constraints)) {\n var _ret = function () {\n var current = _this.sandboxesList.sandbox[sandbox];\n var match = Object.keys(constraints).filter(function (constraint) {\n return constraint === 'browser' && current.type === SandboxType.NORMAL || constraint === 'windowSanbox' && current.type === SandboxType.WINDOW;\n }).length > 0 ? true : false;\n\n if (match) {\n request = current;\n }\n\n return \"break\";\n }();\n\n if (_ret === \"break\") break;\n }\n }\n }\n }\n\n if (!request) {\n reject('no sandbox found for: ' + url);\n } else {\n resolve(request);\n }\n });\n }\n }, {\n key: \"resolveNormalStub\",\n value: function resolveNormalStub(url) {\n // log.log('resolveNormalStub ' + url);\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //split the url to find the domainURL. deals with the url for example as:\n //\"hyperty-runtime://sp1/protostub/123\",\n var dividedURL = divideURL(url);\n var domainUrl = dividedURL.domain;\n var type = dividedURL.type;\n\n if (url.includes(_this.runtimeURL) || url.includes('://sandbox/')) {\n Registry_log.error('[Registry - resolve] URL to be resolved should have listeners ', url);\n reject('[Registry - resolve] URL to be resolved should have listeners ', url);\n } // resolve the domain protostub in case of a message to global registry\n\n\n if (url.includes('global://registry')) {\n domainUrl = _this._domain;\n } else {\n if (!domainUrl.indexOf('msg-node.') || !domainUrl.indexOf('registry.')) {\n domainUrl = domainUrl.substring(domainUrl.indexOf('.') + 1);\n }\n }\n\n _this.isLegacy(url).then(function (isLegacy) {\n // if legacy it should resolve for .\n if (isLegacy && type !== 'domain-idp') {\n domainUrl = type + '.' + getUserIdentityDomain(url);\n }\n\n Registry_log.info('[Registry.resolve] domainUrl:', domainUrl);\n var registredComponent;\n\n if (type === 'domain-idp') {\n registredComponent = _this.idpProxyList.hasOwnProperty(domainUrl) ? _this.idpProxyList[domainUrl] : false;\n } else {\n registredComponent = _this.protostubsList.hasOwnProperty(domainUrl) ? _this.protostubsList[domainUrl] : false;\n }\n\n Registry_log.info('[Registry.resolve] registred:', registredComponent); // TODO since the protostubs have other states this should be revised, because the status could change from DEPLOYED to LIVE\n // TODO and this validation will trigger a new load of IDPProxy or Protostub;\n\n if (registredComponent && registredComponent.hasOwnProperty('status') && (registredComponent.status === STATUS.DEPLOYED || registredComponent.status === STATUS.CREATED || registredComponent.status === STATUS.LIVE || registredComponent.status === STATUS.DISCONNECTED)) {\n Registry_log.info('[Registry.resolve] Resolved: ', registredComponent.url, registredComponent.status);\n resolve(registredComponent.url);\n } else {\n //todo: use switch-case to support other types of stubs\n if (type === 'domain-idp') {\n // The IdP Proxy does not exist, let's prepare its deployment by watching its status\n _this.watchingYou.observe('idpProxyList', function (change) {\n // log.log('[Registry - resolveNormalStub] idpProxyList changed ' + _this.idpProxyList);\n var keypath = change.keypath;\n if (keypath.includes('status')) keypath = keypath.replace('.status', '');\n\n if (keypath === domainUrl && change.name === 'status' && change.newValue === STATUS.CREATED) {\n // log.log('[Registry - resolveNormalStub] idpProxyList is live ' + _this.idpProxyList[domainUrl]);\n resolve(_this.idpProxyList[domainUrl].url);\n }\n });\n\n if (!registredComponent || registredComponent.status === STATUS.FAILED) {\n // this process will load the idp proxy, because is not yet registered;\n Registry_log.info('[Registry.resolveNormalStub] deploy new IDPProxy: ', domainUrl);\n\n _this.loader.loadIdpProxy(domainUrl).then(function () {\n Registry_log.info('[Registry.resolveNormalStub] IdP Proxy deployed: ', _this.idpProxyList[domainUrl]);\n }).catch(function (reason) {\n Registry_log.error('[Registry.resolve] Error resolving Load IDPProxy: ', reason);\n _this.idpProxyList[domainUrl].status = 'deployment-failed';\n reject(reason);\n });\n }\n } else {\n // The protoStub does not exist, let's prepare its deployment by watching its status\n _this.watchingYou.observe('protostubsList', function (change) {\n // log.log('[Registry - resolveNormalStub] protostubsList changed ' + _this.protostubsList);\n var keypath = change.keypath;\n if (keypath.includes('status')) keypath = keypath.replace('.status', '');\n\n if (keypath === domainUrl && change.name === 'status' && change.newValue === STATUS.CREATED) {\n // log.log('[Registry - resolve] protostub is live ' + _this.protostubsList[domainUrl]);\n resolve(_this.protostubsList[domainUrl].url);\n }\n });\n\n if (!registredComponent || registredComponent.status === STATUS.FAILED) {\n // lets deploy the protostub\n Registry_log.info('[Registry.resolve] trigger new ProtocolStub: ', domainUrl);\n\n _this.loader.loadStub(domainUrl).then(function () {// log.log('[Registry - resolveNormalStub] Stub deployed: ', _this.protostubsList[domainUrl]);\n }).catch(function (reason) {\n Registry_log.error('[Registry.resolveNormalStub] Error resolving Load ProtocolStub: ', reason);\n reject(reason);\n });\n }\n }\n }\n }).catch(function (reason) {\n Registry_log.error('[Registry.resolve] Error resolving islegacy: ', reason);\n reject(reason);\n });\n });\n }\n /**\r\n * To verify if source is valid and to resolve target runtime url address if needed (eg protostub runtime url in case the message is to be dispatched to a remote endpoint).\r\n * @param {URL.URL} url url\r\n * @return {Promise} Promise \r\n */\n\n }, {\n key: \"resolve\",\n value: function resolve(msg) {\n Registry_log.info('[Registry - Resolve] - ', msg);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var url = msg.to ? msg.to : msg;\n var p2p = msg.body && msg.body.p2p ? msg.body.p2p : false; // log.log('P2P: ', p2p, url);\n // log.log('P2P - p2pHandlerStub: ', !_this.p2pHandlerStub[_this.runtimeURL], _this.p2pHandlerStub, _this.runtimeURL);\n // log.log('P2P - isBackendServiceURL: ', isBackendServiceURL(url), isBackendServiceURL, url);\n // log.log('P2P - includes runtimeURL: ', url.includes(_this.runtimeURL));\n // log.log('P2P - includes p2phandler: ', url.includes('/p2phandler/'));\n // log.log('P2P - includes p2prequester: ', url.includes('/p2prequester/'));\n // Skip p2p procedure when not supported by the Runtime or for backend services\n\n if (!_this.p2pHandlerStub[_this.runtimeURL] || isBackendServiceURL(url) || url.includes(_this.runtimeURL) || url.includes('/p2phandler/') || url.includes('/p2prequester/')) {\n Registry_log.info('[Registry - resolve] - Resolve normal stub: ', _this.p2pHandlerStub, _this.runtimeURL, isBackendServiceURL(url), p2p, url);\n\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n } else {\n Registry_log.info('[Registry - resolve] - checkP2P: ', p2p, url, _this._p2pConnectionResolve);\n\n _this._p2pConnectionResolve.checkP2P(msg).then(function (registeredP2P) {\n // log.log('[Registry - resolve] found registered P2P: ', registeredP2P);\n var p2pConnection = _this.p2pConnectionList[registeredP2P.runtime];\n\n if (!p2pConnection) {\n p2pConnection = registeredP2P;\n _this.p2pConnectionList[registeredP2P.runtime] = p2pConnection;\n }\n\n switch (p2pConnection.status) {\n case STATUS.LIVE:\n msg.body.peer = registeredP2P.runtime;\n resolve(p2pConnection.url, msg);\n break;\n\n case STATUS.CREATED: // p2p connection setup is ongoing, use MN Stub\n\n case STATUS.PROGRESS:\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n\n break;\n\n case STATUS.DISCONNECTED:\n // p2p connection stub was disconnected, let's ask to connect again\n Registry_log.info('[Registry - Resolve] - p2pConnection is disconnected lets try to reconnect');\n\n _this._p2pConnectionResolve.reconnectP2PRequester(p2pConnection).then(function (returnURL) {\n // log.log('[Registry - Resolve] - was reconnected with p2pRequesterStubt: ', returnURL);\n resolve(returnURL);\n }, function (reason) {\n Registry_log.info('[Registry - Resolve] - Reason: ', reason);\n\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n });\n\n break;\n\n default:\n Registry_log.info('[Registry - resolve] - P2P: ', p2p);\n\n if (!p2p) {\n // no p2p connection exists and the message sender does not ask one. Lets use the MN Stub\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n } else {\n _this._setupP2PRequester(registeredP2P).then(function (returnURL) {\n // no p2p connection exists but the message sender is asking one. Lets try to setup one\n resolve(returnURL);\n }, function (reason) {\n Registry_log.info('[Registry - Resolve] - Reason: ', reason);\n\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n });\n }\n\n break;\n }\n }, function (reason) {\n Registry_log.info('[Registry - Resolve] - Reason: ', reason);\n\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n });\n }\n });\n }\n }, {\n key: \"_setupP2PRequester\",\n value: function _setupP2PRequester(input) {\n var _this = this;\n\n Registry_log.log('[Registry._setupP2PConnection] loadStub with p2pRequester: ', input);\n return new Promise(function (resolve, reject) {\n var remoteRuntime = input.runtime;\n var p2pConfig = {\n remoteRuntimeURL: remoteRuntime,\n p2pHandler: input.p2pHandler,\n p2pRequesterStub: true\n }; // lets prepare the p2pRequesterSTub deployment by setting an observer to its status changes\n\n _this.watchingYou.observe('p2pRequesterStub', function (change) {\n Registry_log.log('[Registry._setupP2PConnection] p2pRequesterStubs changed ' + _this.p2pRequesterStub);\n\n if (change.keypath.split('.')[0] === remoteRuntime && change.name === 'status' && change.newValue === STATUS.LIVE) {\n Registry_log.log('[Registry._setupP2PConnection] p2pRequester is live ' + _this.p2pRequesterStub[remoteRuntime]);\n resolve(_this.p2pRequesterStub[remoteRuntime].url);\n }\n }); // stub load\n\n\n _this.loader.loadStub(input.p2pRequester, p2pConfig).then(function () {\n Registry_log.log('[Registry._setupP2PConnection] p2pRequester deployed: ', _this.p2pRequesterStub[remoteRuntime]);\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n /**\r\n * To verify if url is for a legacy service.\r\n * @param {URL.URL} url url\r\n * @return {boolean}\r\n */\n\n }, {\n key: \"isLegacy\",\n value: function isLegacy(url) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (url === _this._domain) {\n return resolve(false);\n }\n\n Registry_log.log('[Registry] [Registry.Registry.isLegacy] ', url); // TODO: to be defined in the runtime configuration\n\n var nonLegacy = ['hyperty-runtime', 'domain', 'global', 'hyperty'];\n var urlDivided = divideURL(url);\n\n if (nonLegacy.indexOf(urlDivided.type) !== -1 || urlDivided.domain === _this._domain) {\n return resolve(false);\n } // process User URLs\n\n\n if (url.split('@').length > 1) {\n var domain = urlDivided.domain; // log.log('[Registry] [Registry.Registry.isLegacy] domain: ', domain);\n\n if (_this.idpLegacyProxyList.hasOwnProperty(domain)) {\n var result = _this.idpLegacyProxyList[domain];\n\n if (result.interworking) {\n return resolve(result.interworking);\n } else {\n return resolve(false);\n }\n }\n\n _this._loader.descriptors.getIdpProxyDescriptor(domain).then(function (result) {\n // log.log('[Registry] [Registry.Registry.isLegacy] Legacy stub descriptor: ', result);\n if (result.interworking) {\n _this.idpLegacyProxyList[domain] = result;\n resolve(result.interworking);\n } else {\n resolve(false);\n }\n }).catch(function (reason) {\n Registry_log.warn('problem loading idp proxy descriptor for domain:', domain, ' because ', reason);\n reject(reason);\n });\n } else {\n // process protostub URLs\n resolve(_this.isInterworkingProtoStub(url));\n }\n });\n }\n /**\r\n * To verify if URL is locally registered or not.\r\n * @param {URL.URL} url url\r\n * @return {boolean}\r\n */\n\n }, {\n key: \"isLocal\",\n value: function isLocal(url) {\n var runtimeScheme = ['hyperty-runtime', 'runtime'];\n var hypertyScheme = ['hyperty'];\n var urlScheme = url.split('://')[0]; // Process Runtime Core URLs.\n // Messages originated from protostubs should also not include the runtimeURL in its URL.\n\n if (runtimeScheme.indexOf(urlScheme) !== -1) {\n return url.includes(this.runtimeURL);\n } // Process Hyperty URLs\n // Todo: hypertiesList should be an object not an array\n\n\n if (hypertyScheme.indexOf(urlScheme) !== -1) {\n for (var index in this.hypertiesList) {\n var hyperty = this.hypertiesList[index];\n\n if (hyperty.hypertyURL === url) {\n return true;\n }\n }\n\n return false;\n } // Process Data Object URLs\n\n\n if (url.includes('/subscription')) {\n url = url.substring(0, url.indexOf('/subscription'));\n }\n\n var dataObject = this.dataObjectList[url];\n\n if (dataObject) {\n if (dataObject.interworking) {\n return !dataObject.interworking;\n }\n\n return true;\n }\n\n return false;\n }\n /**\r\n * To verify if protostub is to interwork with a legacy domain.\r\n * @param {URL.URL} runtimeProtostubURL The runtime URL of the Protostub\r\n * @return {boolean}\r\n */\n\n }, {\n key: \"isInterworkingProtoStub\",\n value: function isInterworkingProtoStub(runtimeProtostubURL) {\n var _this = this;\n\n if (typeof runtimeProtostubURL === 'boolean') {\n return false;\n }\n\n if (!runtimeProtostubURL.includes('/protostub/')) {\n return false;\n }\n\n var filtered = Object.keys(_this.protostubsList).filter(function (key) {\n return _this.protostubsList[key].url === runtimeProtostubURL;\n }).map(function (key) {\n if (_this.protostubsList[key].hasOwnProperty('interworking')) {\n return _this.protostubsList[key].interworking;\n } else {\n return false;\n }\n })[0];\n return filtered;\n }\n }, {\n key: \"loader\",\n set: function set(loader) {\n var _this = this;\n\n _this._loader = loader;\n },\n get: function get() {\n var _this = this;\n\n return _this._loader;\n }\n /**\r\n * return the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this._messageBus;\n }\n /**\r\n * Set the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this._messageBus = messageBus;\n\n _this._messageBus.addListener(_this.registryURL, function (msg) {\n // log.log('[Registry listener] ', msg);\n var isHyperty = utils_isHypertyURL(msg.from);\n var hasCriteria = msg.body.hasOwnProperty('criteria');\n var isURLResource;\n var isUserResource;\n var isHypertyResource;\n\n if (msg.body.hasOwnProperty('resource') && msg.body.resource !== '.') {\n isURLResource = isURL(msg.body.resource);\n isUserResource = isUserURL(msg.body.resource);\n isHypertyResource = utils_isHypertyURL(msg.body.resource);\n }\n\n var isDelete = msg.type === 'delete';\n var hasName;\n var hasUser;\n\n if (msg.body.hasOwnProperty('value')) {\n hasName = msg.body.value.hasOwnProperty('name');\n hasUser = msg.body.value.hasOwnProperty('user');\n }\n\n if (msg.type === 'response') {\n Registry_log.error('[Register listener] skipping ', msg);\n return;\n } // msg sent by identity manager library\n\n\n var userUrl = _this._getIdentityAssociated(msg.body.resource, msg.body.criteria);\n\n var reply = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: {\n resource: userUrl\n }\n };\n reply.body.code = userUrl ? 200 : 404;\n\n _this._messageBus.postMessage(reply);\n }); // Install AddressAllocation\n\n\n var addressAllocation = allocation_AddressAllocation.instance;\n _this.addressAllocation = addressAllocation;\n _this._domainRegistration = new registry_DomainRegistration(_this.runtimeURL, _this.registryURL, _this._domain, messageBus); // log.log('[Registry - AddressAllocation] - ', addressAllocation);\n }\n }]);\n\n return Registry;\n}();\n\n/* harmony default export */ var registry_Registry = (Registry_Registry);\n// CONCATENATED MODULE: ./src/runtime/runtimeConfiguration.js\nvar runtimeConfiguration_runtimeConfiguration = {\n // TODO this should be changed with the definition used for indexeddb\n // look at: https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore\n // Now we are using the definition for Dexie; (http://dexie.org/docs/Version/Version.stores())\n storageSchemas: {\n capabilities: {\n capabilities: 'key,version,value'\n },\n subscriptions: {\n subscriptions: 'key,version,value'\n },\n runtime: {\n 'runtime:URL': 'key,version,value',\n 'p2pHandler:URL': 'key,version,value'\n },\n registry: {\n 'registry:DataObjectURLs': 'key,version,value',\n 'registry:HypertyURLs': 'key,version,value'\n },\n cryptoManager: {\n userAsymmetricKey: 'key,version,value',\n dataObjectSessionKeys: 'key,version,value'\n },\n identity: {\n accessTokens: 'key,version,value',\n identities: 'userURL, userProfile.email, userProfile.userURL, userProfile.name'\n },\n runtimeCatalogue: {\n runtimeCatalogue: '&cguid, accessControlPolicy, constraints, dataObjects, hypertyType, objectName, sourcePackage, version'\n },\n policy: {\n 'rethink:activePolicy': 'key,version,value',\n 'rethink:groups': 'key,version,value',\n 'rethink:userPolicies': 'key,version,value',\n 'rethink:spPolicies': 'key,version,value'\n },\n syncherManager: {\n 'syncherManager:ObjectURLs': 'key,version,value',\n 'remotes': 'key,version,value'\n },\n hypertyResources: {\n hypertyResources: '&resourceURL, name, contentUrl, content, created, reporter, resourceType'\n }\n },\n runtimeURLS: {\n registry: {\n prefix: 'hyperty-runtime://',\n suffix: 'registry'\n },\n identityModule: {\n prefix: 'hyperty-runtime://',\n suffix: '/idm'\n },\n runtimeUA: {\n prefix: 'hyperty-runtime://',\n suffix: '/ua'\n },\n catalogue: {\n prefix: 'hyperty-runtime://',\n suffix: '/catalogue'\n },\n graphConnector: {\n prefix: 'hyperty-runtime://',\n suffix: '/graph'\n },\n syncManager: {\n prefix: 'hyperty-runtime://',\n suffix: '/sm'\n }\n },\n catalogueURLs: {\n protocolstub: {\n prefix: 'hyperty-catalogue://catalogue.',\n suffix: '/.well-known/protocolstub/',\n fallback: 'hyperty-catalogue://catalogue.%domain%/.well-known/protocolstub/'\n },\n idpProxy: {\n prefix: 'hyperty-catalogue://catalogue.',\n suffix: '/.well-known/idp-proxy/',\n fallback: 'hyperty-catalogue://catalogue.%domain%/.well-known/idp-proxy/'\n }\n },\n msgNodeURL: {\n prefix: 'domain://msg-node.',\n suffix: '',\n hypertyAddressAllocation: '/hyperty-address-allocation',\n objectAddressAllocation: '/object-address-allocation',\n subscriptionManagement: '/sm'\n },\n domainRegistryURL: {\n prefix: 'domain://registry.',\n suffix: ''\n },\n globalRegistryURL: 'global://registry.',\n remoteStorage: 'https://hysmart.rethink.ptinovacao.pt/backup/'\n};\n// CONCATENATED MODULE: ./src/identity/Identities.js\nfunction Identities_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Identities_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Identities_createClass(Constructor, protoProps, staticProps) { if (protoProps) Identities_defineProperties(Constructor.prototype, protoProps); if (staticProps) Identities_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar Identities_log = loglevel[\"getLogger\"]('IdentityModule');\n\n\n/**\r\n* The Identity Data Model is used to model the reTHINK User entity. The Identity data model is handled by Identity Management functionality.\r\n*\r\n*/\n\nvar Identities_Identities =\n/*#__PURE__*/\nfunction () {\n function Identities(type, storageManager) {\n Identities_classCallCheck(this, Identities);\n\n var _this = this;\n\n _this._watchingYou = new utils_WatchingYou();\n _this._storageManager = storageManager;\n _this._guid;\n _this._type = type;\n _this._identities = {};\n _this._accessTokens = _this.watchingYou.watch('accessTokens', {}, true);\n }\n\n Identities_createClass(Identities, [{\n key: \"reset\",\n value: function reset() {\n this._identities = {};\n console.log(this);\n this.currentIdentity = undefined;\n this.defaultIdentity = undefined;\n }\n }, {\n key: \"getIdentity\",\n value: function getIdentity(identifier) {\n return Object.assign({}, this._identities[identifier]);\n }\n }, {\n key: \"loadIdentities\",\n value: function loadIdentities() {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this._storageManager.get(null, null, 'identities').then(function (identities) {\n Identities_log.info('[Identities.Load Identities] identities: ', identities);\n\n if (identities) {\n _this._identities = identities; // let's set as default identity the one that expires later\n\n _this.identifiers.forEach(function (id) {\n var timeNow = secondsSinceEpoch();\n var identity = _this._identities[id];\n var expires = identity.expires; // if (!identity.hasOwnProperty('interworking')\n // || !identity.interworking) {\n\n _this.defaultIdentity = id;\n\n if (parseInt(expires) > timeNow) {\n _this.defaultIdentity.expires = parseInt(expires);\n _this.currentIdentity = id;\n }\n });\n }\n\n resolve();\n });\n });\n }\n }, {\n key: \"loadAccessTokens\",\n value: function loadAccessTokens() {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this._storageManager.get('accessTokens').then(function (accessTokens) {\n if (accessTokens) _this._accessTokens = accessTokens;\n resolve();\n });\n });\n } // to confirm if this function is required when the App constraints the identity selection\n\n }, {\n key: \"addIdentity\",\n value: function addIdentity(identity) {\n var _this2 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this._isValid(identity)) {\n var id = identity.identifiers[0];\n Object.assign(_this2._identities[id], identity);\n\n _this2._storeIdentity(identity).then(function () {\n _this2._identities[id].status = 'created';\n resolve();\n });\n } else {\n reject('[Identities.addIdentity] invalid IdAssertion');\n }\n });\n }\n }, {\n key: \"addAssertion\",\n value: function addAssertion(assertion) {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this._isValid(assertion)) {\n assertion.userProfile.guid = _this._guid;\n var userUrl = assertion.userProfile.userURL;\n if (!_this.identities[userUrl]) _this._identities[userUrl] = assertion;else _this.identities[userUrl] = assertion;\n\n _this._store().then(function () {\n _this3._identities[userUrl].status = 'created';\n\n if (_this.defaultIdentity == false) {\n _this.defaultIdentity = userUrl;\n }\n\n resolve(assertion);\n });\n } else {\n reject('[Identities.addAssertion] invalid IdAssertion: ', assertion);\n }\n });\n }\n }, {\n key: \"removeIdentity\",\n value: function removeIdentity(userUrl) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n delete _this.identities[userUrl];\n\n _this._store().then(function () {\n resolve();\n });\n });\n }\n }, {\n key: \"addAccessToken\",\n value: function addAccessToken(accessToken) {\n var _this = this;\n\n Identities_log.info('[Identities.addAccessToken] ', accessToken);\n return new Promise(function (resolve, reject) {\n if (_this._isValidAccessToken(accessToken)) {\n // let newAccessToken = deepClone(accessToken);\n _this._accessTokens[accessToken.domain] = accessToken;\n\n _this._storeAccessTokens().then(function () {\n _this._accessTokens[accessToken.domain].status = 'created';\n resolve(accessToken);\n });\n } else {\n reject('[Identities.addIdentity] invalid AccessToken: ', accessToken);\n }\n });\n }\n }, {\n key: \"setAccessTokenInProgress\",\n value: function setAccessTokenInProgress(domain) {\n if (this._accessTokens[domain]) this._accessTokens[domain].status = 'in-progress';else this._accessTokens[domain] = {\n status: 'in-progress'\n };\n }\n }, {\n key: \"getAccessToken\",\n value: function getAccessToken(domain, resources) {\n var accessToken = this._accessTokens[domain];\n\n if (!accessToken) {\n return undefined;\n } else if (resources.every(function (i) {\n return accessToken.resources.indexOf(i) != -1;\n })) {\n return this._accessTokens[domain];\n } else {\n return new Error('[Identities.getAccessToken] Not found for ', domain);\n }\n }\n }, {\n key: \"removeAccessToken\",\n value: function removeAccessToken(domain, resources) {\n var _this4 = this;\n\n var _this = this;\n\n return new Promise(function (resolve) {\n var accessToken = _this4._accessTokens[domain];\n\n if (!accessToken) {\n resolve();\n } else if (resources.every(function (i) {\n return accessToken.resources.indexOf(i) != -1;\n })) {\n delete _this4._accessTokens[domain];\n\n _this._storeAccessTokens().then(function () {\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n }, {\n key: \"updateAssertion\",\n value: function updateAssertion(assertion) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var userUrl = assertion.userProfile.userURL;\n\n if (!_this.identities[userUrl]) {\n return reject('[Identities.updateAssertion] Identity not found for ', userUrl);\n } else {\n _this.identities[userUrl] = assertion;\n\n _this._store().then(function () {\n resolve();\n });\n }\n });\n }\n }, {\n key: \"updateAccessToken\",\n value: function updateAccessToken(accessToken) {\n var _this = this;\n\n Identities_log.info('[Identities.updateAccessToken] ', accessToken);\n return new Promise(function (resolve, reject) {\n if (_this._isValidAccessToken(accessToken)) {\n _this._accessTokens[accessToken.domain].expires = accessToken.expires;\n _this._accessTokens[accessToken.domain].accessToken = accessToken.accessToken;\n\n _this._storeAccessTokens().then(function () {\n _this._accessTokens[accessToken.domain].status = 'created';\n resolve(accessToken);\n });\n } else {\n reject('[Identities.updateAccessToken] invalid AccessToken: ', accessToken);\n }\n });\n }\n }, {\n key: \"addIdAssertion\",\n value: function addIdAssertion(identifier, assertion, idp, scope) {\n var _this = this;\n\n var newIdAssertion = new IdAssertion(assertion, idp, scope);\n\n _this.idAssertionList.push(newIdAssertion);\n } //TODO: complete with more verifications. To be moved to Identity?\n\n }, {\n key: \"_isValid\",\n value: function _isValid(identity) {\n if (!identity.hasOwnProperty('assertion')) {\n return false;\n }\n\n var splitedAssertion = identity.assertion.split('.');\n var assertionParsed; //verify if the token contains the 3 components, or just the assertion\n\n try {\n if (splitedAssertion[1]) {\n assertionParsed = decode(splitedAssertion[1]);\n } else {\n assertionParsed = decode(identity.assertion);\n }\n } catch (err) {\n return false;\n }\n\n return true;\n }\n }, {\n key: \"_isValidAccessToken\",\n value: function _isValidAccessToken(accessToken) {\n if (!accessToken.hasOwnProperty('accessToken')) {\n return false;\n }\n\n if (!accessToken.hasOwnProperty('domain')) {\n return false;\n }\n\n if (!(accessToken.hasOwnProperty('resources') && Array.isArray(accessToken.resources))) {\n return false;\n }\n\n if (!(accessToken.hasOwnProperty('expires') && Number.isInteger(accessToken.expires))) {\n return false;\n }\n\n if (!accessToken.hasOwnProperty('input')) {\n return false;\n }\n\n return true;\n } //TODO: add function to only set one new identity using the new indexed storage manager\n\n }, {\n key: \"_store\",\n value: function _store() {\n var _this5 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var store = Object.keys(_this5._identities).map(function (userURL) {\n return _this._storageManager.set(userURL, 0, _this5._identities[userURL], 'identities');\n });\n Promise.all(store).then(function () {\n resolve();\n }).catch(function (err) {\n reject('On _sendReporterSessionKey from method storeIdentity error: ' + err);\n });\n });\n }\n }, {\n key: \"_storeAccessTokens\",\n value: function _storeAccessTokens() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var accessTokens = deepClone(_this._accessTokens);\n\n _this._storageManager.set('accessTokens', 0, accessTokens).then(function () {\n resolve();\n }).catch(function (err) {\n reject('On _sendReporterSessionKey from method storeIdentity error: ' + err);\n });\n });\n }\n }, {\n key: \"identities\",\n get: function get() {\n return this._identities;\n }\n }, {\n key: \"accessTokens\",\n get: function get() {\n return this._accessTokens;\n }\n }, {\n key: \"watchingYou\",\n get: function get() {\n return this._watchingYou;\n }\n }, {\n key: \"guid\",\n set: function set(guid) {\n this._guid = guid;\n },\n get: function get() {\n return this._guid;\n }\n }, {\n key: \"defaultIdentity\",\n set: function set(identifier) {\n if (this.identities[identifier]) this._defaultIdentity = identifier;else throw new Error('[Identities.set defaultIdentity ] Error: identity does not exist here: ', identifier);\n },\n get: function get() {\n if (this._defaultIdentity) return Object.assign({}, this.identities[this._defaultIdentity]);else return false;\n }\n }, {\n key: \"currentIdentity\",\n set: function set(identifier) {\n if (this.identities[identifier]) this._currentIdentity = identifier;else throw '[Identities.set currentIdentity ] Error: identity does not exist here: ', identifier;\n },\n get: function get() {\n return Object.assign({}, this.identities[this._currentIdentity]);\n }\n }, {\n key: \"identifiers\",\n get: function get() {\n return Object.keys(this._identities);\n }\n }]);\n\n return Identities;\n}(); // move to Identity service framework?\n\n\nvar IdAssertion =\n/*#__PURE__*/\nfunction () {\n function IdAssertion(assertion, idp, userProfile) {\n Identities_classCallCheck(this, IdAssertion);\n\n var _this = this;\n\n _this._assertion = assertion;\n _this._idp = idp;\n _this._userProfile = userProfile;\n }\n\n Identities_createClass(IdAssertion, [{\n key: \"assertion\",\n get: function get() {\n return this._assertion;\n }\n }, {\n key: \"idp\",\n get: function get() {\n return this._idp;\n }\n }, {\n key: \"userProfile\",\n get: function get() {\n return this._userProfile;\n }\n }]);\n\n return IdAssertion;\n}();\n\nvar IdValidation =\n/*#__PURE__*/\nfunction () {\n function IdValidation(identity, contents) {\n Identities_classCallCheck(this, IdValidation);\n\n var _this = this;\n\n _this.identity = identity;\n _this.contents = contents;\n }\n\n Identities_createClass(IdValidation, [{\n key: \"validates\",\n value: function validates(identity, contents) {//TODO implement the logic\n }\n }]);\n\n return IdValidation;\n}();\n\n/* harmony default export */ var identity_Identities = (Identities_Identities);\n// CONCATENATED MODULE: ./src/identity/GuiFake.js\nfunction GuiFake_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Log System\n\nvar GuiFake_log = loglevel[\"getLogger\"]('IdentityModule');\n/**\r\n* fake class for the gui to select the identity,\r\n* TODO replace with the proper identity GUI\r\n*\r\n*/\n\nvar GuiFake = function GuiFake(url, messageBus) {\n GuiFake_classCallCheck(this, GuiFake);\n\n GuiFake_log.log('FakeGUI_deployed');\n\n var _this = this;\n\n _this._url = url;\n _this._waitTime = 10000;\n _this._messageBus = messageBus;\n\n _this._messageBus.addListener(_this._url, function (msg) {\n if (msg.hasOwnProperty('type') && msg.type === 'create' && msg.body.hasOwnProperty('value') && msg.body.value.hasOwnProperty('identities') && msg.body.value.hasOwnProperty('idps')) {\n var identities = msg.body.value.identities;\n var idps = msg.body.value.idps;\n var value;\n\n if (identities[0] !== undefined) {\n value = {\n type: 'identity',\n value: identities[0],\n code: 200\n };\n } else {\n value = {\n type: 'idp',\n value: idps[2].domain,\n code: 200\n };\n }\n\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n }; // to test on the identity side the listener without the timeout\n // can represent the time the user takes to choose and identity\n\n if (msg.body.value === 'wait') {\n setTimeout(function () {\n _this._messageBus.postMessage(replyMsg);\n }, _this._waitTime);\n } else {\n _this._messageBus.postMessage(replyMsg);\n }\n } else {\n GuiFake_log.log('Ignoring messages not intended to FakeGUI.', msg);\n }\n });\n};\n\n/* harmony default export */ var identity_GuiFake = (GuiFake);\n// CONCATENATED MODULE: ./src/identity/IdentityModule.js\nfunction IdentityModule_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction IdentityModule_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction IdentityModule_createClass(Constructor, protoProps, staticProps) { if (protoProps) IdentityModule_defineProperties(Constructor.prototype, protoProps); if (staticProps) IdentityModule_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar IdentityModule_log = loglevel[\"getLogger\"]('IdentityModule');\n\n\n\n\n/**\r\n*\r\n* The Identity Module (Id Module) is the component responsible for handling the\r\n* user identity and the association of this identity with the Hyperty instances,\r\n* in order to make Hyperty instances identifiable. The identity in the reTHINK project\r\n* is not fixed to a unique Identity Service Provider, but obtained through several\r\n* different Identity sources. With this approach, the Id Module provides to the user the\r\n* option to choose the preferred method for authentication.\r\n* This module will thus able to support multiple Identity acquisition methods,\r\n* such as OpenID connect 1.0, Kerberos System, or authentication through smart cards.\r\n* For example, a user with a Google account can use the Google as an Identity Provider to provide Identity Tokens,\r\n* which can be used by the Identity Module to associate it with a Hyperty instance.\r\n*\r\n* The Identity Module uses a node package, the HelloJS, which is a client-side JavaScript API for authentication\r\n* that facilitates the requests for the OpenID connect protocol. This method allows for some abstraction\r\n* when making requests for different Identity Providers, such as OpenID connect used by Google, Facebook, Microsoft, for example.\r\n*\r\n* When a request for a user identity is made using the method loginWithRP(identifier, scope),\r\n* this method will analyse the Identity Provider chosen to obtain an identity and will use the HelloJS node package\r\n* with the selected Identity Provider and identity scope. After the HelloJS request for an Access Token\r\n* to the Identity Providers, the user will be prompted to authenticate towards the Identity Provider.\r\n* Upon receiving the Access Token, this token is validated with a RESTful web service request to an endpoint\r\n* on the Identity Provider Authorization Server, and after the validation is done,\r\n* an ID token is obtained with the information according to the scope required.\r\n* This ID token is then preserved in this module that can obtained through the getIdentities()\r\n* and is passed as return value of the loginWithRP function. The methods generateAssertion and validateAssertion have not yet been developed.\r\n*\r\n*/\n\nvar IdentityModule_IdentityModule =\n/*#__PURE__*/\nfunction () {\n /**\r\n * This is the constructor to initialise the Identity Module it does not require any input.\r\n */\n function IdentityModule(runtimeURL, runtimeCapabilities, storageManager, dataObjectsStorage, cryptoManager, runtimeCatalogue) {\n IdentityModule_classCallCheck(this, IdentityModule);\n\n var _this = this;\n\n if (!runtimeURL) throw new Error('runtimeURL is missing.');\n if (!storageManager) throw new Error('storageManager is missing');\n if (!cryptoManager) throw new Error('cryptoManager is missing');\n if (!runtimeCatalogue) throw new Error('runtimeCatalogue is missing');\n _this._runtimeURL = runtimeURL;\n _this._runtimeCatalogue = runtimeCatalogue;\n _this.dataObjectsStorage = dataObjectsStorage;\n _this._idmURL = _this._runtimeURL + '/idm';\n _this._guiURL = _this._runtimeURL + '/identity-gui';\n _this.runtimeCapabilities = runtimeCapabilities;\n _this._domain = divideURL(_this._runtimeURL).domain; //to store items with this format: {identity: identityURL, token: tokenID}\n\n _this._identities = new identity_Identities('human', storageManager); // to be reviewed: watchingYou identitiesList or identities?\n // _this.identitiesList = _this.watchingYou.watch('identitiesList', {}, true);\n\n _this._crypto = cryptoManager;\n /* _this.emailsList = [];\r\n let newIdentity = new Identity('guid', 'HUMAN');\r\n _this.identity = newIdentity;\r\n _this.currentIdentity;\r\n _this.identities.defaultIdentity;*/\n //stores the association of the dataObject and the Hyperty registered within\n\n _this.dataObjectsIdentity = {}; // is this needed?\n\n _this._listOfIdps = []; // variable to know if the GUI is deployed to choose the identity. if the real GUI is not deployed, a fake gui is deployed instead.\n\n _this.guiDeployed = false;\n } //******************* GET AND SET METHODS *******************\n\n /**\r\n * return the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n\n\n IdentityModule_createClass(IdentityModule, [{\n key: \"getIdentity\",\n //******************* IDENTITY RELEATED METHODS *******************\n\n /**\r\n * gets all the information from a given userURL\r\n * @param {String} userURL user url\r\n * @return {JSON} identity identity bundle from the userURL\r\n */\n value: function getIdentity(userURL) {\n return this.identities.getIdentity(userURL);\n }\n /**\r\n * Function to set the current Identity with a given Identity\r\n * @param {Identity} identity identity\r\n */\n\n /* setCurrentIdentity(identity) {\r\n let _this = this;\r\n _this.currentIdentity = identity;\r\n }*/\n\n /**\r\n * Function to return all the identities registered within a session by a user.\r\n * These identities are returned in an array containing a JSON package for each user identity.\r\n * @return {Array} Identities\r\n */\n\n }, {\n key: \"getIdentitiesToChoose\",\n value: function getIdentitiesToChoose() {\n var _this2 = this;\n\n // let identities = _this.identities.identifiers;\n // let idps = [\n // { domain: 'google.com', type: 'idToken'},\n // { domain: 'microsoft.com', type: 'idToken'},\n // { domain: 'orange.fr', type: 'idToken'},\n // { domain: 'slack.com', type: 'Legacy'}\n // ];\n // todo: retrieve available idps from runtime catalogue\n // todo: enable oauth idps\n // let idps = [\n // { domain: 'google.com', type: 'idToken' },\n // { domain: 'microsoft.com', type: 'idToken' },\n // { domain: 'facebook.com', type: 'idToken' },\n // { domain: 'slack.com', type: 'idToken' }\n // ];\n return new Promise(function (resolve) {\n var url = runtimeConfiguration_runtimeConfiguration.catalogueURLs.idpProxy.prefix + _this2._domain + runtimeConfiguration_runtimeConfiguration.catalogueURLs.idpProxy.suffix;\n Promise.all([_this2.runtimeCapabilities.isAvailable('browser'), _this2.runtimeCapabilities.isAvailable('node')]).then(function (result) {\n var isBrowser = result[0];\n var isNode = result[1];\n var constraints = {\n constraints: {}\n };\n constraints.constraints.node = isNode;\n constraints.constraints.browser = isBrowser;\n\n _this2._runtimeCatalogue.getTypeList(url, constraints).then(function (idps) {\n var listOfIdps = idps.map(function (key) {\n return {\n domain: key,\n type: 'idToken'\n };\n });\n IdentityModule_log.info('[IdentityModule.getIdentityAssertion:getIdentitiesToChoose]', idps, listOfIdps);\n _this2._listOfIdps = listOfIdps;\n return resolve({\n defaultIdentity: _this2.identities.defaultIdentity,\n identities: _this2.identities.identities,\n idps: listOfIdps\n });\n });\n });\n });\n }\n /**\r\n * Function to return the selected Identity within a session\r\n * @return {Identity} identity identity\r\n */\n\n /* getCurrentIdentity() {\r\n let _this = this;\r\n return _this.currentIdentity;\r\n }*/\n\n }, {\n key: \"init\",\n value: function init(guid) {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this._identities.loadIdentities().then(function () {\n if (!guid) {\n _this._crypto.getMyPublicKey().then(function (key) {\n var hash = _this._crypto.crypto._sha256(stringify(key)).then(function (hash) {\n guid = 'user-guid://' + hash;\n _this.identities.guid = guid;\n\n _this._identities.loadAccessTokens().then(function () {\n resolve();\n });\n }).catch(function (error) {\n console.log('[IdentityModule] error', error);\n });\n });\n } else {\n _this.identities.guid = guid;\n\n _this._identities.loadAccessTokens().then(function () {\n resolve();\n });\n }\n });\n });\n }\n /**\r\n * Function that fetch an identityAssertion from a user.\r\n *\r\n * @return {IdAssertion} IdAssertion\r\n */\n\n }, {\n key: \"getIdentityAssertion\",\n value: function getIdentityAssertion(identityBundle) {\n IdentityModule_log.log('[IdentityModule.getIdentityAssertion:identityBundle]', identityBundle);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //CHECK whether is browser environment or nodejs\n //if it is browser, then create a fake identity\n _this.runtimeCapabilities.isAvailable('browser').then(function (result) {\n IdentityModule_log.log('runtime browser identity acquisition', result);\n if (!result) return; //todo: only idp should be mandatory when identityBundle exists\n\n if (identityBundle && identityBundle.hasOwnProperty('idp')) {\n var idp = identityBundle.idp;\n var origin = identityBundle.hasOwnProperty('origin') ? identityBundle.origin : 'origin';\n var idHint = identityBundle.hasOwnProperty('idHint') ? identityBundle.idHint : '';\n\n if (_this.identities.defaultIdentity) {\n var assertion = _this.identities.defaultIdentity;\n\n if (assertion.expires > secondsSinceEpoch()) {\n return resolve(assertion);\n } else if (assertion.hasOwnProperty('refresh')) {\n IdentityModule_log.log('[Identity.IdentityModule.getIdentityAssertion] refreshing assertion: ', assertion);\n\n _this._refreshIdAssertion().then(function (newAssertion) {\n IdentityModule_log.log('[IdentityModule.getIdentityAssertion] refreshed assertion.', newAssertion);\n return resolve(newAssertion);\n }, function (error) {\n IdentityModule_log.error('[IdentityModule.getIdentityAssertion] error on refresIdAssertion: ', error, ' Asking for a new IdAssertion.');\n\n _this._getIdAssertionForDomain(origin, idp, idHint).then(function (assertion) {\n resolve(assertion);\n }, function (error) {\n reject(error);\n });\n });\n } else {\n _this._getIdAssertionForDomain(origin, idp, idHint).then(function (assertion) {\n resolve(assertion);\n }, function (error) {\n reject(error);\n });\n }\n } else {\n _this._getIdAssertionForDomain(origin, idp, idHint).then(function (assertion) {\n resolve(assertion);\n }, function (error) {\n reject(error);\n });\n }\n } else if (_this.identities.defaultIdentity) {\n var _assertion = _this.identities.defaultIdentity;\n\n if (_assertion.expires > secondsSinceEpoch()) {\n return resolve(_assertion);\n } else if (_assertion.hasOwnProperty('refresh')) {\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] refreshing assertion: ', _assertion);\n\n _this._refreshIdAssertion(_assertion).then(function (newAssertion) {\n IdentityModule_log.log('[IdentityModule.getIdentityAssertion] refreshed assertion.', newAssertion);\n return resolve(newAssertion);\n }, function (error) {\n IdentityModule_log.error('[IdentityModule.getIdentityAssertion] error on refresIdAssertion: ', error, ' Asking for a new IdAssertion.');\n\n _this.selectIdentityFromGUI().then(function (assertion) {\n IdentityModule_log.log('[IdentityModule] Identity selected from GUI.');\n _this.identities.defaultIdentity = assertion.userProfile.userURL;\n return resolve(assertion);\n }, function (err) {\n return reject(err);\n });\n });\n } else {\n _this.selectIdentityFromGUI().then(function (assertion) {\n IdentityModule_log.log('[IdentityModule] Identity selected from GUI.');\n _this.identities.defaultIdentity = assertion.userProfile.userURL;\n return resolve(assertion);\n }, function (err) {\n return reject(err);\n });\n }\n } else {\n _this.selectIdentityFromGUI().then(function (assertion) {\n IdentityModule_log.log('[IdentityModule] Identity selected from GUI.');\n _this.identities.defaultIdentity = assertion.userProfile.userURL;\n return resolve(assertion);\n }, function (err) {\n return reject(err);\n });\n }\n }).catch(function (error) {\n IdentityModule_log.error('Error on identity acquisition ', error);\n return reject(error);\n });\n\n _this.runtimeCapabilities.isAvailable('node').then(function (result) {\n IdentityModule_log.log('node identity acquisition', result);\n if (!result) return;\n\n if (_this.identities.currentIdentity) {\n //TODO verify whether the token is still valid or not.\n // should be needed to make further requests, to obtain a valid token\n return resolve(_this.identities.currentIdentity);\n } else {\n IdentityModule_log.log('getIdentityAssertion for nodejs');\n var idp = {\n type: 'idp',\n value: 'nodejs-idp',\n code: 200,\n auth: false\n };\n\n _this.callNodeJsGenerateMethods(idp.value, 'origin').then(function (value) {\n resolve(value);\n }, function (err) {\n reject(err);\n });\n }\n }).catch(function (error) {\n IdentityModule_log.error('Error on identity acquisition ', error);\n reject(error);\n });\n });\n }\n }, {\n key: \"_getIdAssertionForDomain\",\n value: function _getIdAssertionForDomain(origin, idp, idHint) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.selectIdentityForHyperty(origin, idp, idHint).then(function (assertion) {\n IdentityModule_log.log('[IdentityModule._getIdAssertionForDomain] Identity selected by hyperty.');\n return resolve(assertion);\n }, function (err) {\n // if it got an error then just select identity from GUI\n // log.error('[IdentityModule] Could not select identity from hyperty.');\n _this.selectIdentityFromGUI().then(function (newAssertion) {\n IdentityModule_log.log('[IdentityModule._getIdAssertionForDomain] Identity selected by hyperty.');\n return resolve(newAssertion);\n }, function (err) {\n return reject(err);\n });\n });\n });\n }\n }, {\n key: \"_refreshIdAssertion\",\n value: function _refreshIdAssertion(assertion) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.sendRefreshMessage(assertion).then(function (newAssertion) {\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] refreshed assertion: ', newAssertion);\n\n _this.identities.updateAssertion(newAssertion).then(function () {\n resolve(newAssertion);\n }, function (err) {\n IdentityModule_log.error('[IdentityModule.getValidToken] error updating the assertion ', err);\n reject(err);\n });\n }, function (err) {\n IdentityModule_log.error('[IdentityModule.getValidToken] error refreshing the assertion ', err);\n reject(err);\n });\n });\n }\n /**\r\n * Function to return all the users URLs registered within a session\r\n * These users URLs are returned in an array of strings.\r\n * @return {Array} users\r\n */\n\n }, {\n key: \"getUsersIDs\",\n value: function getUsersIDs() {\n /* log.log('[getUsersIDs:emailFormat]', emailFormat);\r\n log.log('getUsersIDs:emailFormat', emailFormat);\r\n let _this = this;\r\n let users = [];*/\n //if request comes with the emailFormat option, then convert url to email format\n\n /* let converter = (emailFormat) ? getUserEmailFromURL : (value) => { return value; };\r\n for (let index in _this.identities) {\r\n let identity = _this.identities[index];\r\n users.push(converter(identity.identity));\r\n }*/\n return this.identities.identifiers;\n }\n /**\r\n * Function to remove an identity\r\n * @param {String} userURL userURL\r\n * @return {Promise}\r\n */\n\n }, {\n key: \"deleteIdentity\",\n value: function deleteIdentity(userURL) {\n return this.identities.removeIdentity(userURL);\n }\n /**\r\n * Function to unregister an identity from the emailsList array and not show in to the GUI\r\n * @param {String} email email\r\n */\n\n /* unregisterIdentity(email) {\r\n let _this = this;\r\n for (let e in _this.emailsList) {\r\n if (_this.emailsList[e] === email) {\r\n _this.emailsList.splice(e, 1);\r\n }\r\n }\r\n }*/\n // to be used when runtime is not executed in a sandbox\n\n }, {\n key: \"listenShowAdmin\",\n value: function listenShowAdmin(callback) {\n this._showAdmin = callback;\n }\n /**\r\n * Function that sends a request to the GUI using messages. Sends all identities registered and\r\n * the Idps supported, and return the identity/idp received by the GUI\r\n * @param {Array} identities list of identitiies\r\n * @param {Array} idps list of idps to authenticate\r\n * @return {Promise} returns a chosen identity or idp\r\n */\n\n }, {\n key: \"requestIdentityToGUI\",\n value: function requestIdentityToGUI(identities, idps) {\n IdentityModule_log.log('[IdentityModule.requestIdentityToGUI:identities]', identities);\n IdentityModule_log.log('[IdentityModule.requestIdentityToGUI:idps]', idps);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //condition to check if the real GUI is deployed. If not, deploys a fake gui\n if (_this.guiDeployed === false) {\n var guiFakeURL = _this._guiURL;\n var guiFake = new identity_GuiFake(guiFakeURL, _this._messageBus);\n _this.guiFake = guiFake;\n _this.guiDeployed = true;\n }\n\n var message = {\n type: 'create',\n to: _this._guiURL,\n from: _this._idmURL,\n body: {\n value: {\n identities: identities,\n idps: idps\n }\n }\n };\n\n var callback = function callback(msg) {\n _this._messageBus.removeResponseListener(_this._idmURL, msg.id); // todo: to return the user URL and not the email or identifier\n\n\n if (msg.body.code === 200) {\n var selectedIdentity = msg.body;\n IdentityModule_log.log('selectedIdentity: ', selectedIdentity.value);\n resolve(selectedIdentity);\n } else {\n reject('error on requesting an identity to the GUI');\n }\n }; //postMessage with callback but without timeout\n\n\n try {\n _this._messageBus.postMessage(message, callback, false);\n } catch (err) {\n reject('In method callIdentityModuleFunc error: ' + err);\n }\n });\n }\n }, {\n key: \"callNodeJsGenerateMethods\",\n value: function callNodeJsGenerateMethods(idp, origin) {\n IdentityModule_log.log('[callNodeJsGenerateMethods:idp]', idp);\n IdentityModule_log.log('[callNodeJsGenerateMethods:origin]', origin);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //debugger;\n var publicKey; //let keyPair = nodeJSKeyPairPopulate;\n //generates the RSA key pair\n\n _this._crypto.getMyPublicKey().then(function (key) {\n IdentityModule_log.log('[callNodeJsGenerateMethods:key]', key);\n publicKey = stringify(key);\n IdentityModule_log.log('[callNodeJsGenerateMethods] NO_URL');\n return _this.generateAssertion(publicKey, origin, 'url', idp);\n }).then(function (value) {\n if (value) {\n resolve(value);\n } else {\n reject('Error on obtaining Identity');\n }\n }).catch(function (err) {\n IdentityModule_log.log(err);\n reject(err);\n });\n });\n }\n }, {\n key: \"callGenerateMethods\",\n value: function callGenerateMethods(idp, origin) {\n IdentityModule_log.log('[callGenerateMethods:idp]', idp);\n IdentityModule_log.log('[callGenerateMethods:origin]', origin);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var publicKey; //generates the RSA key pair\n\n _this._crypto.getMyPublicKey().then(function (key) {\n IdentityModule_log.log('[callGenerateMethods:key]', key);\n publicKey = stringify(key); // userkeyPair = keyPair;\n\n IdentityModule_log.log('generateAssertion:no_hint');\n return _this.generateAssertion(publicKey, origin, '', idp);\n }).then(function (url) {\n _this.myHint = url;\n IdentityModule_log.log('generateAssertion:hint');\n return _this.generateAssertion(publicKey, origin, url, idp);\n }).then(function (value) {\n if (value) {\n resolve(value);\n } else {\n reject('Error on obtaining Identity');\n }\n }).catch(function (err) {\n IdentityModule_log.error(err);\n reject(err);\n });\n });\n }\n }, {\n key: \"loginSelectedIdentity\",\n value: function loginSelectedIdentity(publicKey, origin, idp, loginUrl) {\n IdentityModule_log.log('[loginSelectedIdentity:publicKey]', publicKey);\n IdentityModule_log.log('[loginSelectedIdentity:origin]', origin);\n IdentityModule_log.log('[loginSelectedIdentity:idp]', idp); // log.log('[loginSelectedIdentity:keyPair]', keyPair);\n\n IdentityModule_log.log('[loginSelectedIdentity:loginUrl]', loginUrl);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n IdentityModule_log.log('[IdentityModule] openPopup');\n\n _this.callIdentityModuleFunc('openPopup', {\n urlreceived: loginUrl\n }).then(function (idCode) {\n return idCode;\n }, function (err) {\n IdentityModule_log.error('Error while logging in for the selected identity.');\n return reject(err);\n }).then(function (idCode) {\n _this.sendGenerateMessage(publicKey, origin, idCode, idp).then(function (newResponse) {\n if (newResponse.hasOwnProperty('assertion')) {\n _this.identities.addAssertion(newResponse).then(function (result) {\n resolve('Login was successfull');\n }).catch(function (err) {\n reject('Login has failed:' + err);\n });\n } else {\n IdentityModule_log.error('Error while logging in for the selected identity.');\n return reject('Could not generate a valid assertion for selected identity.');\n }\n }).catch(function (err) {\n reject('On loginSelectedIdentity from method sendGenerateMessage error: ' + err);\n });\n });\n });\n }\n }, {\n key: \"selectIdentityForHyperty\",\n value: function selectIdentityForHyperty(origin, idp, idHint) {\n IdentityModule_log.log('[selectIdentityForHyperty:origin]', origin);\n IdentityModule_log.log('[selectIdentityForHyperty:idp]', idp);\n IdentityModule_log.log('[selectIdentityForHyperty:idHint]', idHint);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //generates the RSA key pair\n _this._crypto.getMyPublicKey().then(function (key) {\n var publicKey = stringify(key);\n\n _this.sendGenerateMessage(publicKey, origin, idHint, idp).then(function (response) {\n if (response.hasOwnProperty('assertion')) {\n // identity was logged in, just save it\n _this.identities.addAssertion(response).then(function (value) {\n return resolve(response);\n }, function (err) {\n return reject(err);\n });\n } else if (response.hasOwnProperty('loginUrl')) {\n // identity was not logged in\n _this.loginSelectedIdentity(publicKey, origin, idp, response.loginUrl).then(function (value) {\n return resolve(value);\n }, function (err) {\n return reject(err);\n });\n } else {\n // you should never get here, if you do then the IdP Proxy is not well implemented\n // log.error('GenerateAssertion returned invalid response.');\n IdentityModule_log.log('Proceeding by logging in.');\n\n _this.callGenerateMethods(idp, origin).then(function (value) {\n return resolve(value);\n }, function (err) {\n return reject(err);\n });\n }\n }).catch(function (err) {\n reject('On selectIdentityForHyperty from method sendGenerateMessage error: ' + err);\n });\n }).catch(function (err) {\n reject('On selectIdentityForHyperty from method generateRSAKeyPair error: ' + err);\n });\n });\n }\n }, {\n key: \"selectIdentityFromGUI\",\n value: function selectIdentityFromGUI(origin) {\n var _this3 = this;\n\n IdentityModule_log.log('[IdentityModule.selectIdentityFromGUI:origin]', origin);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this3.getIdentitiesToChoose().then(function (identitiesInfo) {\n return _this.requestIdentityToGUI(identitiesInfo.identities, identitiesInfo.idps);\n }).then(function (value) {\n if (value.type === 'identity') {\n // let chosenID = getUserURLFromEmail(value.value);\n // hack while the user url is not returned from requestIdentityToGUI;\n\n /* let chosenID = 'user://' + _this.identities.currentIdentity.idp.domain + '/' + value.value;\r\n _this.identities.defaultIdentity = _this.identities.currentIdentity;*/\n // returns the identity info from the chosen id\n // if (_this.identities.currentIdentity) resolve(_this.identities.currentIdentity.assertion);\n if (_this.identities.identities[value.value]) resolve(_this.identities.identities[value.value]);else reject('[IdentityModule.selectIdentityFromGUI] identity not found: ', value.value);\n } else if (value.type === 'idp') {\n _this.callGenerateMethods(value.value, origin).then(function (value) {\n return resolve(value);\n }, function (err) {\n return reject(err);\n });\n } else {\n return reject('error on GUI received message.');\n }\n }).catch(function (err) {\n reject('On selectIdentityFromGUI from method requestIdentityToGUI error: ' + err);\n });\n });\n }\n }, {\n key: \"callIdentityModuleFunc\",\n value: function callIdentityModuleFunc(methodName, parameters, domain, resource) {\n IdentityModule_log.log('[callIdentityModuleFunc:methodName]', methodName);\n IdentityModule_log.log('[callIdentityModuleFunc:parameters]', parameters);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this._showAdmin) {\n if (methodName === 'getAccessToken') {\n _this._showAdmin(methodName, parameters.urlreceived, domain, resource).then(function (result) {\n resolve(result);\n });\n } else _this._showAdmin(methodName);\n } else {\n var message = {\n type: 'execute',\n to: _this._guiURL,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: methodName,\n params: parameters\n }\n }; //post msg with callback but without timout\n\n var callback = function callback(msg) {\n _this._messageBus.removeResponseListener(_this._idmURL, msg.id);\n\n var result = msg.body.value;\n resolve(result);\n };\n\n try {\n _this._messageBus.postMessage(message, callback, false);\n } catch (err) {\n reject('In method callIdentityModuleFunc error: ' + err);\n }\n }\n });\n } //******************* TOKEN METHODS *******************\n\n /**\r\n * get a Token to be added to a message\r\n * @param {String} fromURL origin of the message\r\n * @param {String} toURL target of the messageok\r\n * @return {JSON} token token to be added to the message\r\n */\n\n }, {\n key: \"getToken\",\n value: function getToken(msg) {\n var _this = this;\n\n var fromURL = msg.from;\n var toUrl = msg.to;\n\n if (msg.hasOwnProperty('body') && msg.body.hasOwnProperty('source')) {\n fromURL = msg.body.source;\n }\n\n if (msg.type === 'forward') {\n fromURL = msg.body.from;\n }\n\n if (msg.hasOwnProperty('body') && msg.body.hasOwnProperty('subscriber')) {\n fromURL = msg.body.subscriber;\n }\n\n return new Promise(function (resolve, reject) {\n IdentityModule_log.log('[IdentityModule.getToken] for msg ', msg); //log.log('toUrl', toUrl);\n\n _this.registry.isLegacy(toUrl).then(function (result) {\n // log.log('[Identity.IdentityModule.getToken] isLEGACY: ', result);\n if (result) {\n _this._getAccessToken(msg).then(function (token) {\n IdentityModule_log.log('[IdentityModule.getToken] access token ', token);\n resolve(deepClone(token));\n }).catch(function (err) {\n reject('[IdentityModule.getToken] Access Token error ' + err);\n });\n } else {\n _this._getValidToken(fromURL).then(function (token) {\n resolve(token);\n }).catch(function (err) {\n reject('On getToken from method _getValidToken error: ' + err);\n });\n }\n }).catch(function (err) {\n reject('On getToken from method isLegacy error: ' + err);\n });\n });\n }\n /**\r\n * get an Id Token for a HypertyURL\r\n * @param {String} hypertyURL the Hyperty address\r\n * @return {JSON} token Id token to be added to the message\r\n */\n\n }, {\n key: \"getIdToken\",\n value: function getIdToken(hypertyURL) {\n IdentityModule_log.info('getIdToken:hypertyURL ', hypertyURL);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var splitURL = hypertyURL.split('://');\n var userURL;\n\n if (splitURL[0] !== 'hyperty') {\n // it is a Data Object URL\n _this._getHypertyFromDataObject(hypertyURL).then(function (returnedHypertyURL) {\n userURL = _this.registry.getHypertyOwner(returnedHypertyURL);\n\n if (userURL) {\n var _identity = _this.identities.getIdentity(userURL);\n\n if (_identity) return resolve(_identity);else return reject('[IdentityModule.getIdToken] Identity not found for: ', userURL);\n } else {\n return reject('[IdentityModule.getIdToken] User not found for hyperty: ', returnedHypertyURL);\n }\n }).catch(function (reason) {\n IdentityModule_log.error('[IdentityModule.getIdToken] Error: ', reason);\n reject(reason);\n });\n } else {\n userURL = _this.registry.getHypertyOwner(hypertyURL);\n\n if (userURL) {\n var _identity2 = _this.identities.getIdentity(userURL);\n\n if (_identity2) return resolve(_identity2);else return reject('[IdentityModule.getIdToken] Identity not found for: ', userURL);\n } else {\n return reject('[IdentityModule.getIdToken] User not found for hyperty: ', userURL);\n }\n }\n });\n }\n /**\r\n * get an Access Token for an external API\r\n * @param {String} url the external url\r\n * @return {JSON} token Access token to be added to the message\r\n */\n\n }, {\n key: \"_getAccessToken\",\n value: function _getAccessToken(msg) {\n var url = msg.to;\n\n var _this = this;\n\n return new Promise(function (resolve) {\n if (!msg.hasOwnProperty('body')) {\n return reject('[IdentityModule._getAccessToken] missing mandatory msg body: ', msg);\n }\n\n if (!msg.body.hasOwnProperty('value')) {\n return reject('[IdentityModule._getAccessToken] missing mandatory msg body value: ', msg);\n }\n\n if (!msg.body.value.hasOwnProperty('resources')) {\n return reject('[IdentityModule._getAccessToken] missing mandatory msg body value resources: ', msg);\n }\n\n var domainToCheck = divideURL(url).domain;\n\n if (url.includes('protostub')) {\n domainToCheck = domainToCheck.replace(domainToCheck.split('.')[0] + '.', '');\n }\n\n var resources = msg.body.value.resources;\n\n _this._getAccessTokenForDomain(domainToCheck, resources).then(function (token) {\n resolve(token);\n });\n });\n }\n }, {\n key: \"_getAccessTokenForDomain\",\n value: function _getAccessTokenForDomain(domainToCheck, resources) {\n var _this = this;\n\n var token;\n return new Promise(function (resolve, reject) {\n try {\n token = _this.identities.getAccessToken(domainToCheck, resources);\n } catch (e) {\n return reject('[IdentityModule._getAccessTokenForDomain] Access Token error ' + err);\n }\n\n if (!token) {\n _this._getNewAccessToken(domainToCheck, resources).then(function (token) {\n IdentityModule_log.log('[Identity.IdentityModule._getAccessTokenForDomain] new Access Token ', token);\n return resolve(token);\n }).catch(function (err) {\n reject('[IdentityModule._getAccessTokenForDomain] on getNewAccessToken ' + err);\n });\n } else if (token.status === 'in-progress') {\n return resolve(_this._inProgressAccessToken(domainToCheck, resources));\n } else {\n var timeNow = secondsSinceEpoch();\n IdentityModule_log.log('[Identity.IdentityModule._getAccessTokenForDomain] found Access Token ', token);\n\n if (timeNow >= token.expires) {\n // if (true) {\n if (token.hasOwnProperty(\"refresh\")) {\n _this._refreshAccessToken(deepClone(token)).then(function (newToken) {\n return resolve(_this.identities.updateAccessToken(newToken));\n });\n } else {\n _this._revokeAccessToken(token, domainToCheck, resources).then(function () {\n setTimeout(function () {\n return _this._getNewAccessToken(domainToCheck, resources);\n }, 1000);\n });\n }\n } else return resolve(deepClone(token));\n }\n });\n }\n }, {\n key: \"_revokeAccessToken\",\n value: function _revokeAccessToken(token, domain, resources) {\n var _this = this; // let domain = _this._resolveDomain(oldIdentity.idp);\n // let message;\n // let assertion = _this.getIdentity(oldIdentity.userProfile.userURL);\n\n\n IdentityModule_log.log('[IdentityModule._revokeAccessToken] to be revoked ', token);\n return new Promise(function (resolve, reject) {\n // let domain = _this._resolveDomain(token.domain);\n var message;\n message = {\n type: 'execute',\n to: _this._resolveDomain(token.domain),\n from: _this._idmURL,\n body: {\n method: 'revokeAccessToken',\n params: {\n token: token\n }\n }\n };\n IdentityModule_log.log('[IdentityModule._revokeAccessToken] revoke msg ', message);\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n var result = res.body.value;\n if (result) _this._identities.removeAccessToken(domain, resources).then(function () {\n resolve(result);\n });\n resolve();\n });\n } catch (err) {\n reject('In IdentityModule._revokeAccessToken on postMessage error: ' + err);\n }\n });\n }\n }, {\n key: \"_inProgressAccessToken\",\n value: function _inProgressAccessToken(domain, resources) {\n var _this4 = this;\n\n this.identities.watchingYou.observe('accessTokens', function (change) {\n IdentityModule_log.log('[IdentityModule._inProgressAccessToken] accessTokens changed ' + _this4.identities.accessTokens);\n var keypath = change.keypath;\n\n if (keypath.includes('status')) {\n keypath = keypath.replace('.status', '');\n }\n\n if (keypath === domain && change.name === 'status' && change.newValue === 'created') {\n // log.log('[Identity.IdentityModule.getToken] token is created ' + _this.identitiesList[domain]);\n return _this4.identities.getAccessToken(domain, resources);\n }\n });\n }\n }, {\n key: \"_getNewAccessToken\",\n value: function _getNewAccessToken(domain, resources) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.identities.setAccessTokenInProgress(domain);\n\n var message = {\n type: 'execute',\n to: _this._resolveDomain(domain),\n from: _this._idmURL,\n body: {\n method: 'getAccessTokenAuthorisationEndpoint',\n params: resources\n }\n }; //let's first get the authorisation URL from the Idp Proxy\n\n _this._messageBus.postMessage(message, function (res) {\n if (res.body.code > 299) {\n return reject('[IdentityModule._getNewAccessToken] Error on getAccessTokenAuthorisationEndpoint from IdP Proxy: ', res.body.desc);\n } // let's ask the user for authorisation\n\n\n _this.callIdentityModuleFunc('getAccessToken', {\n urlreceived: res.body.value\n }, domain, resources[0]).then(function (authorisation) {\n IdentityModule_log.log('[IdentityModule:callIdentityModuleFunc:openPopup] auhtorisation result: ', authorisation);\n message.body.method = 'getAccessToken';\n message.body.params = {\n resources: resources,\n login: authorisation\n }; //wihtout callback to avoid timeout errors?\n // let's ask Access Token from the Idp Proxy\n\n _this._messageBus.postMessage(message, function (res) {\n if (res.body.code > 299) return reject('[IdentityModule._getNewAccessToken] Error on getAccessToken from IdP Proxy: ', res.body.desc);\n\n _this.identities.addAccessToken(res.body.value).then(function (token) {\n IdentityModule_log.info('[IdentityModule._getNewAccessToken] resolving token: ', token);\n return resolve(res.body.value);\n }, function (err) {\n reject(err);\n });\n });\n }, function (err) {\n reject(err);\n });\n });\n });\n }\n }, {\n key: \"_refreshAccessToken\",\n value: function _refreshAccessToken(outdatedToken) {\n var _this = this; // let domain = _this._resolveDomain(oldIdentity.idp);\n // let message;\n // let assertion = _this.getIdentity(oldIdentity.userProfile.userURL);\n\n\n IdentityModule_log.log('IdentityModule._refreshAccessToken:outdatedToken', outdatedToken);\n return new Promise(function (resolve, reject) {\n var domain = _this._resolveDomain(outdatedToken.domain);\n\n var message;\n message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n method: 'refreshAccessToken',\n params: {\n token: outdatedToken\n }\n }\n };\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n var result = res.body.value;\n resolve(result);\n });\n } catch (err) {\n reject('In IdentityModule._refreshAccessToken on postMessage error: ' + err);\n }\n });\n }\n }, {\n key: \"sendRefreshMessage\",\n value: function sendRefreshMessage(oldIdentity) {\n var _this = this; // let domain = _this._resolveDomain(oldIdentity.idp);\n // let message;\n // let assertion = _this.getIdentity(oldIdentity.userProfile.userURL);\n\n\n IdentityModule_log.log('sendRefreshMessage:oldIdentity', oldIdentity);\n return new Promise(function (resolve, reject) {\n var domain = _this._resolveDomain(oldIdentity.idp.domain);\n\n var message;\n\n var assertion = _this.getIdentity(oldIdentity.userProfile.userURL);\n\n IdentityModule_log.info('sendRefreshMessage:oldIdentity', oldIdentity);\n message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: 'refreshAssertion',\n params: {\n identity: assertion\n }\n }\n };\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n if (res.body.code < 300) {\n var result = res.body.value;\n resolve(result);\n } else resolve(res.body.value.body.params, identity);\n });\n } catch (err) {\n reject('In sendRefreshMessage on postMessage error: ' + err);\n }\n });\n }\n }, {\n key: \"getAccessToken\",\n value: function getAccessToken(idpDomain, resources, login) {\n IdentityModule_log.log('[getAccessToken:idpDomain]', idpDomain);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var domain = _this._resolveDomain(idpDomain);\n\n var message;\n message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: 'getAccessToken',\n params: {\n resources: resources,\n login: login\n }\n }\n };\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n if (res.body.code < 299) {\n var result = res.body.value;\n resolve(result);\n } else resolve(res.body);\n });\n } catch (err) {\n reject('IdentityModule.In getAccessToken: ' + err);\n }\n });\n }\n }, {\n key: \"getAccessTokenAuthorisationEndpoint\",\n value: function getAccessTokenAuthorisationEndpoint(scope, idpDomain) {\n IdentityModule_log.log('[getAccessTokenAuthorisationEndpoint:idpDomain]', idpDomain);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var domain = _this._resolveDomain(idpDomain);\n\n var message;\n message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: 'getAccessTokenAuthorisationEndpoint',\n params: {\n resources: scope\n }\n }\n };\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n var result = res.body.value;\n resolve(result);\n });\n } catch (err) {\n reject('In getAccessTokenAuthorisationEndpoint: ' + err);\n }\n });\n }\n }, {\n key: \"sendGenerateMessage\",\n value: function sendGenerateMessage(contents, origin, usernameHint, idpDomain) {\n IdentityModule_log.log('[sendGenerateMessage:contents]', contents);\n IdentityModule_log.log('[sendGenerateMessage:origin]', origin);\n IdentityModule_log.log('[sendGenerateMessage:usernameHint]', usernameHint);\n IdentityModule_log.log('[sendGenerateMessage:idpDomain]', idpDomain);\n IdentityModule_log.log('sendGenerateMessage_hint');\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var domain = _this._resolveDomain(idpDomain);\n\n var message;\n message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: 'generateAssertion',\n params: {\n contents: contents,\n origin: origin,\n usernameHint: usernameHint\n }\n }\n };\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n if (res.body.code < 300) resolve(res.body.value);else reject(res.body);\n });\n } catch (err) {\n reject('In sendGenerateMessage: ' + err);\n }\n });\n }\n /**\r\n * Requests the IdpProxy from a given Domain for an identityAssertion\r\n *\r\n * @param {DOMString} contents contents\r\n * @param {DOMString} origin origin\r\n * @param {DOMString} usernameHint usernameHint\r\n * @param {JSON} keyPair user keyPair\r\n * @return {IdAssertion} IdAssertion\r\n */\n\n }, {\n key: \"generateAssertion\",\n value: function generateAssertion(contents, origin, usernameHint, idpDomain) {\n IdentityModule_log.log('[generateAssertion:contents]', contents);\n IdentityModule_log.log('[generateAssertion:origin]', origin);\n IdentityModule_log.log('[generateAssertion:usernameHint]', usernameHint); // log.log('[generateAssertion:keyPair]', keyPair);\n\n IdentityModule_log.log('[generateAssertion:idpDomain]', idpDomain);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n IdentityModule_log.log('[IdentityModule:sendGenerateMessage:sendGenerateMessage]', usernameHint);\n\n _this.sendGenerateMessage(contents, origin, usernameHint, idpDomain).then(function (result) {\n if (result) {\n _this.identities.addAssertion(result).then(function (value) {\n resolve(result);\n }, function (err) {\n reject(err);\n });\n } else {\n reject('error on obtaining identity information');\n }\n }, function (error) {\n if (error.hasOwnProperty('description') && error.description.hasOwnProperty('loginUrl')) {\n _this.callIdentityModuleFunc('openPopup', {\n urlreceived: error.description.loginUrl\n }).then(function (value) {\n IdentityModule_log.log('[IdentityModule:callIdentityModuleFunc:openPopup]', usernameHint);\n resolve(value);\n }, function (err) {\n reject(err);\n });\n } else {\n IdentityModule_log.error('[IdentityModule:sendGenerateMessage] generate assertion with hint error ', error);\n reject(error);\n }\n }).catch(function (err) {\n reject('On generateAssertion from method sendGenerateMessage error: ' + err);\n });\n });\n }\n /**\r\n * Requests the IdpProxy from a given Domain to validate an IdentityAssertion\r\n * Returns a promise with the result from the validation.\r\n * @param {DOMString} assertion\r\n * @param {DOMString} origin origin\r\n * @return {Promise} Promise promise with the result from the validation\r\n */\n\n }, {\n key: \"validateAssertion\",\n value: function validateAssertion(assertion, origin, idpDomain) {\n IdentityModule_log.log('[validateAssertion:assertion]', assertion);\n IdentityModule_log.log('[validateAssertion:origin]', origin);\n IdentityModule_log.log('[validateAssertion:idpDomain]', idpDomain);\n\n var _this = this;\n\n var domain = _this._resolveDomain(idpDomain);\n\n var message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: 'validateAssertion',\n params: {\n assertion: assertion,\n origin: origin\n }\n }\n };\n return new Promise(function (resolve, reject) {\n try {\n _this._messageBus.postMessage(message, function (result) {\n if (result.body.code === 200) {\n resolve(result.body.value);\n } else {\n reject('error', result.body.code);\n }\n });\n } catch (err) {\n reject('On validateAssertion from method postMessage error: ' + err);\n }\n });\n }\n }, {\n key: \"addGUIListeners\",\n value: function addGUIListeners() {\n var _this = this;\n\n _this._messageBus.addListener(_this._idmURL, function (msg) {\n var funcName = msg.body.method;\n IdentityModule_log.log('[IdentityModule:addGUIListeners]', msg, msg.body, funcName);\n var returnedValue;\n\n if (funcName === 'deployGUI') {\n returnedValue = _this.deployGUI();\n } else if (funcName === 'getIdentitiesToChoose') {\n _this.getIdentitiesToChoose().then(function (result) {\n // if the function requested is not a promise\n var value = {\n type: 'execute',\n value: result,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if storeIdentity method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'unregisterIdentity') {\n var email = msg.body.params.email;\n returnedValue = _this.unregisterIdentity(email);\n } else if (funcName === 'getMyPublicKey') {\n // because generateRSAKeyPair is a promise\n // we have to send the message only after getting the key pair\n _this._crypto.getMyPublicKey().then(function (pubKey) {\n pubKey = stringify(pubKey);\n var value = {\n type: 'execute',\n value: pubKey,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if generateRSAKeyPair method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'sendGenerateMessage') {\n var contents = msg.body.params.contents;\n var origin = msg.body.params.origin;\n var usernameHint = msg.body.params.usernameHint;\n var idpDomain = msg.body.params.idpDomain;\n var _replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to\n };\n\n _this.sendGenerateMessage(contents, origin, usernameHint, idpDomain).then(function (returnedValue) {\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n _replyMsg.body = value;\n\n try {\n _this._messageBus.postMessage(_replyMsg);\n } catch (err) {\n IdentityModule_log.error('IdentityModule.addGUIListeners sendGenerateMessage error: ' + err);\n }\n }, function (err) {\n IdentityModule_log.info('IDPProxy generateAssertion reply error ' + err);\n _replyMsg.body = err;\n\n _this._messageBus.postMessage(_replyMsg);\n });\n\n return;\n } else if (funcName === 'getAccessTokenAuthorisationEndpoint') {\n var scope = msg.body.params.scope;\n var _idpDomain = msg.body.params.idpDomain;\n\n _this.getAccessTokenAuthorisationEndpoint(scope, _idpDomain).then(function (returnedValue) {\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if sendGenerateMessage method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'addAccessToken') {\n var accessToken = msg.body.params;\n\n _this.identities.addAccessToken(accessToken).then(function (returnedValue) {\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if storeIdentity method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'getAccessToken') {\n var domain = msg.body.params.idpDomain;\n var resources = msg.body.params.resources;\n var login = msg.body.params.login;\n var _replyMsg2 = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to\n };\n\n _this.getAccessToken(domain, resources, login).then(function (returnedValue) {\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n _replyMsg2.body = value;\n\n try {\n _this._messageBus.postMessage(_replyMsg2);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if sendGenerateMessage method postMessage error: ' + err);\n }\n }, function (error) {\n try {\n _replyMsg2.body = error;\n\n _this._messageBus.postMessage(_replyMsg2);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if sendGenerateMessage method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'addAssertion') {\n var result = msg.body.params; // let keyPair = msg.body.params.keyPair;\n\n _this.identities.addAssertion(result).then(function (returnedValue) {\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if storeIdentity method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'refreshAccessToken') {\n var _domain = msg.body.params.domain;\n var _resources = msg.body.params.resources;\n\n _this._getAccessTokenForDomain(_domain, _resources).then(function (token) {\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: {\n value: token.accessToken,\n code: 200\n }\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners for refreshAccessToken request: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'unauthorise') {\n var _domain2 = msg.body.params.domain;\n var _resources2 = msg.body.params.resources;\n\n try {\n _this._revokeAccessToken(_this.identities.getAccessToken(_domain2, _resources2), _domain2, _resources2);\n } catch (e) {\n return reject('[IdentityModule.addGUIListeners] unauthorise error ' + err);\n }\n\n var _replyMsg3 = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: {\n value: true,\n code: 200\n }\n };\n\n try {\n _this._messageBus.postMessage(_replyMsg3);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners for refreshAccessToken request: ' + err);\n }\n\n return;\n }\n /*else if (funcName === 'selectIdentityForHyperty') {\r\n let origin = msg.body.params.origin;\r\n let idp = msg.body.params.idp;\r\n let idHint = msg.body.params.idHint;\r\n _this.selectIdentityForHyperty(origin, idp, idHint);\r\n return;\r\n }*/\n // if the function requested is not a promise\n\n\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if storeIdentity method postMessage error: ' + err);\n }\n });\n }\n }, {\n key: \"deployGUI\",\n value: function deployGUI() {\n var _this = this;\n\n _this.guiDeployed = true;\n } //******************* PRIVATE METHODS *******************\n\n /**\r\n * GetValidToken is for non legacy hyperties and verifies if the Token is still valid\r\n * if the token is invalid it requests a new token\r\n * @param {String} hypertyURL hypertyURL\r\n * @return {Promise}\r\n */\n\n }, {\n key: \"_getValidToken\",\n value: function _getValidToken(hypertyURL) {\n IdentityModule_log.log('[IdentityModule._getValidToken]:hypertyURL', hypertyURL);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.getIdToken(hypertyURL).then(function (assertion) {\n IdentityModule_log.log('[IdentityModule._getValidToken] retrieved IdAssertion', assertion);\n var timeNow = secondsSinceEpoch();\n if (!assertion.hasOwnProperty('expires')) return resolve(assertion);\n var expirationDate = assertion.expires;\n /* if (completeId.hasOwnProperty('info')) {\r\n if (completeId.info.hasOwnProperty('expires')) {\r\n expirationDate = completeId.info.expires;\r\n } else if (completeId.info.hasOwnProperty('tokenIDJSON')) {\r\n expirationDate = completeId.info.tokenIDJSON.exp;\r\n } else {\r\n // throw 'The ID Token does not have an expiration time';\r\n log.info('The ID Token does not have an expiration time');\r\n resolve(assertion);\r\n }\r\n } else if (completeId.hasOwnProperty('infoToken') && completeId.infoToken.hasOwnProperty('exp')) {\r\n expirationDate = completeId.infoToken.exp;\r\n } else {\r\n // throw 'The ID Token does not have an expiration time';\r\n log.info('The ID Token does not have an expiration time');\r\n resolve(assertion);\r\n }*/\n\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] Token expires in', expirationDate);\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] time now:', timeNow);\n\n if (timeNow >= expirationDate) {\n // if (timeNow >= 0) {\n if (assertion.hasOwnProperty('refresh')) {\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] refreshing assertion: ', assertion);\n\n _this.sendRefreshMessage(assertion).then(function (newAssertion) {\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] refreshed assertion: ', newAssertion);\n\n _this.identities.updateAssertion(newAssertion).then(function () {\n resolve(newAssertion);\n }, function (err) {\n IdentityModule_log.error('[IdentityModule.getValidToken] error updating the assertion ', err);\n reject(err);\n });\n }, function (err) {\n IdentityModule_log.error('[IdentityModule.getValidToken] error refreshing the assertion ', err);\n reject(err);\n });\n } else {\n // no refresh token available, user has to authenticate again to get a new assertion\n // generate new idToken\n _this.callGenerateMethods(assertion.idp.domain).then(function (value) {\n resolve(value);\n }).catch(function (err) {\n reject('[IdentityModule.getValidToken] error when generating a new assertion ' + err);\n });\n }\n } else {\n resolve(assertion);\n }\n }).catch(function (error) {\n IdentityModule_log.error('[IdentityModule.getValidToken] error on getIdToken', error);\n reject(error);\n });\n });\n }\n /**\r\n * returns the reporter associated to the dataObject URL\r\n * @param {String} dataObjectURL dataObject url\r\n * @return {String} reporter dataObject url reporter\r\n */\n\n }, {\n key: \"_getHypertyFromDataObject\",\n value: function _getHypertyFromDataObject(dataObjectURL) {\n IdentityModule_log.info('_getHypertyFromDataObject:dataObjectURL', dataObjectURL);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var splitedURL = divideURL(dataObjectURL);\n var domain = splitedURL.domain;\n var finalURL = parseMessageURL(dataObjectURL); // check if is the creator of the hyperty\n\n var reporterURL = _this.registry.getReporterURLSynchonous(finalURL);\n\n IdentityModule_log.info('_getHypertyFromDataObject:reporterURL', reporterURL);\n\n if (reporterURL) {\n resolve(reporterURL);\n } else {\n // check if there is already an association from an hypertyURL to the dataObject\n var storedReporterURL = _this.dataObjectsIdentity[finalURL];\n IdentityModule_log.info('_getHypertyFromDataObject:storedReporterURL', storedReporterURL);\n\n if (storedReporterURL) {\n resolve(storedReporterURL);\n } else {\n // check if there is any hyperty that subscribed the dataObjectURL\n var subscriberHyperty = _this.registry.getDataObjectSubscriberHyperty(dataObjectURL);\n\n IdentityModule_log.info('_getHypertyFromDataObject:subscriberHyperty', subscriberHyperty);\n\n if (subscriberHyperty) {\n resolve(subscriberHyperty);\n } else {\n // search in domain registry for the hyperty associated to the dataObject\n // search in case is a subscriber who wants to know the reporter\n // To be reviewed in order to avoid the discovery transaction\n _this._coreDiscovery.discoverDataObjectPerURL(finalURL, domain).then(function (dataObject) {\n IdentityModule_log.info('_getHypertyFromDataObject:dataObject', dataObject);\n _this.dataObjectsIdentity[finalURL] = dataObject.reporter;\n IdentityModule_log.info('_getHypertyFromDataObject:dataObject.reporter', dataObject.reporter);\n resolve(dataObject.reporter);\n }, function (err) {\n reject(err);\n });\n }\n }\n }\n });\n }\n /**\r\n * Function that resolve and create the domainURL in case it is provided one. If not, resolve the default domainURL\r\n * @param {String} idpDomain idpDomain (Optional)\r\n */\n\n }, {\n key: \"_resolveDomain\",\n value: function _resolveDomain(idpDomain) {\n if (!idpDomain) {\n return 'domain-idp://google.com';\n } else {\n return 'domain-idp://' + idpDomain;\n }\n }\n /*\r\n _secondsSinceEpoch() {\r\n return Math.floor(Date.now() / 1000);\r\n }*/\n\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this._messageBus;\n }\n /**\r\n * Set the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this._messageBus = messageBus;\n\n _this.addGUIListeners();\n }\n /**\r\n * return the coreDiscovery component\r\n * do we need this??\r\n */\n\n }, {\n key: \"coreDiscovery\",\n get: function get() {\n var _this = this;\n\n return _this._coreDiscovery;\n }\n /**\r\n * Set the coreDiscovery component\r\n * @param {coreDiscovery} coreDiscovery\r\n */\n ,\n set: function set(coreDiscovery) {\n var _this = this;\n\n _this._coreDiscovery = coreDiscovery;\n }\n /**\r\n * return the registry in this idModule\r\n * @param {registry} registry\r\n */\n\n }, {\n key: \"registry\",\n get: function get() {\n var _this = this;\n\n return _this._registry;\n }\n /**\r\n * Set the registry in this idModule\r\n * @param {registry} reg\r\n */\n ,\n set: function set(registry) {\n var _this = this;\n\n _this._registry = registry;\n }\n }, {\n key: \"identities\",\n get: function get() {\n var _this = this;\n\n return _this._identities;\n },\n set: function set(identities) {\n var _this = this;\n\n _this._identities = identities;\n }\n }, {\n key: \"idps\",\n get: function get() {\n return this._listOfIdps;\n }\n }]);\n\n return IdentityModule;\n}();\n\n/* harmony default export */ var identity_IdentityModule = (IdentityModule_IdentityModule);\n// CONCATENATED MODULE: ./src/identity/IdentityHandler.js\nfunction IdentityHandler_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction IdentityHandler_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction IdentityHandler_createClass(Constructor, protoProps, staticProps) { if (protoProps) IdentityHandler_defineProperties(Constructor.prototype, protoProps); if (staticProps) IdentityHandler_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Provides an API to manage identities from msg bus pipeline\r\n* TODO: rename to something like IdentityPipelineHandler in order not to conflict with framework related IdentityHandler\r\n*/\n\n\nvar IdentityHandler_log = loglevel[\"getLogger\"]('IdentityHandler');\n\nvar IdentityHandler_IdentityHandler =\n/*#__PURE__*/\nfunction () {\n function IdentityHandler(idm) {\n IdentityHandler_classCallCheck(this, IdentityHandler);\n\n var _this = this;\n\n _this._idm = idm;\n }\n\n IdentityHandler_createClass(IdentityHandler, [{\n key: \"reset\",\n value: function reset() {\n console.log('IM reset'); // this._idm.identities.reset();\n\n this._idm.identities = new identity_Identities(this._idm.identities._type, this._idm.identities._storageManager);\n console.log(this._idm.identities);\n }\n }, {\n key: \"_isToSetID\",\n value: function _isToSetID(message) {\n var schemasToIgnore = ['domain-idp', 'runtime', 'domain'];\n var _from = message.from;\n\n if (message.body && message.body.hasOwnProperty('source')) {\n _from = message.body.source;\n }\n\n if (message.body && message.body.hasOwnProperty('subscriber')) {\n _from = message.body.subscriber;\n }\n\n if (message.type === 'forward') {\n return false;\n } // Signalling Messages between P2P Stubs don't have Identities. FFS\n\n\n if (_from.includes('/p2prequester/') || _from.includes('/p2phandler/')) {\n return false;\n }\n\n var splitFrom = _from.split('://');\n\n var fromSchema = splitFrom[0];\n var isToIgnore = schemasToIgnore.indexOf(fromSchema) === -1;\n return isToIgnore;\n }\n }, {\n key: \"processMessage\",\n value: function processMessage(message) {\n var _this2 = this;\n\n IdentityHandler_log.log('[IdentityHandler.processMessage] ', message);\n return new Promise(function (resolve, reject) {\n // skip messages that don't need identity tokens in the body\n if (!_this2._isToSetID(message)) return resolve(message);\n /* let from = message.from;\r\n let sourceURL = undefined;\r\n if ( message.hasOwnProperty('body') && message.body.hasOwnProperty('source')) {\r\n from = message.body.source;\r\n }\r\n if (message.type === 'forward') {\r\n from = message.body.from;\r\n }\r\n if (message.hasOwnProperty('body') && message.body.hasOwnProperty('subscriber')) {\r\n from = message.body.subscriber;\r\n }*/\n\n _this2._idm.getToken(message).then(function (identity) {\n if (!message.hasOwnProperty('body')) message.body = {};\n message.body.identity = identity;\n resolve(message);\n }).catch(function (reason) {\n IdentityHandler_log.error(reason);\n reject(reason);\n });\n });\n }\n }]);\n\n return IdentityHandler;\n}();\n\n/* harmony default export */ var identity_IdentityHandler = (IdentityHandler_IdentityHandler);\n// CONCATENATED MODULE: ./src/policy/ActionsService.js\nfunction ActionsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ActionsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ActionsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) ActionsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) ActionsService_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar ActionsService =\n/*#__PURE__*/\nfunction () {\n function ActionsService(context) {\n ActionsService_classCallCheck(this, ActionsService);\n\n this.context = context;\n }\n\n ActionsService_createClass(ActionsService, [{\n key: \"enforcePolicies\",\n value: function enforcePolicies(message, isIncomingMessage) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var policies = _this.context.getPolicies(message, isIncomingMessage);\n\n if (policies !== undefined) {\n if (policies.serviceProviderPolicy !== undefined) {\n policies.serviceProviderPolicy.enforceActions(_this.context, message).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n if (policies.userPolicy !== undefined) {\n policies.userPolicy.enforceActions(_this.context, message).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve([message]);\n }\n }\n } else {\n resolve([message]);\n }\n });\n }\n }, {\n key: \"forwardToID\",\n value: function forwardToID(message, email) {\n var _this = this;\n\n if (!_this.context.runtimeRegistry) throw new Error('forward message to given ID is unsupported in this environment');\n return new Promise(function (resolve, reject) {\n if (_this.context.runtimeRegistry.hypertiesList[0].hypertyURL === message.to) {\n var splitTo = message.to.split('://');\n\n if (splitTo[0] !== 'runtime') {\n _this.context.runtimeRegistry.discoverHypertyPerUser(email).then(function (result) {\n message.to = result.hypertyURL;\n message.body.via = undefined;\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(message);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve(message);\n }\n } else {\n resolve(message);\n }\n });\n }\n }, {\n key: \"forwardToHyperty\",\n value: function forwardToHyperty(message, hypertyURL) {\n var _this = this;\n\n if (!_this.context.runtimeRegistry) throw new Error('forward message to given ID is unsupported in this environment');\n return new Promise(function (resolve) {\n if (_this.context.runtimeRegistry.hypertiesList[0].hypertyURL === message.to) {\n var splitTo = message.to.split('://');\n\n if (splitTo[0] !== 'runtime') {\n message.to = hypertyURL;\n message.body.via = undefined;\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(message);\n } else {\n resolve(message);\n }\n } else {\n resolve(message);\n }\n });\n }\n }, {\n key: \"sendAutomaticMessage\",\n value: function sendAutomaticMessage(message, text) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var automaticMessage = {\n from: message.to,\n to: message.from,\n body: {\n value: text\n },\n type: message.type\n };\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(automaticMessage);\n });\n }\n }]);\n\n return ActionsService;\n}();\n\n/* harmony default export */ var policy_ActionsService = (ActionsService);\n// CONCATENATED MODULE: ./src/policy/Operators.js\nfunction Operators_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Operators_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Operators_createClass(Constructor, protoProps, staticProps) { if (protoProps) Operators_defineProperties(Constructor.prototype, protoProps); if (staticProps) Operators_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar Operators =\n/*#__PURE__*/\nfunction () {\n function Operators() {\n Operators_classCallCheck(this, Operators);\n }\n\n Operators_createClass(Operators, [{\n key: \"and\",\n value: function and(params) {\n return params[0] && params[1];\n }\n }, {\n key: \"between\",\n value: function between(params) {\n var start = parseInt(params[0][0]);\n var end = parseInt(params[0][1]);\n var now = params[1];\n\n if (end < start) {\n now = now < start ? now += 2400 : now;\n end += 2400;\n }\n\n return now > start && now < end;\n }\n }, {\n key: \"equals\",\n value: function equals(params) {\n return String(params[0]) === '*' || String(params[0]) === String(params[1]);\n }\n }, {\n key: \"greaterThan\",\n value: function greaterThan(params) {\n return params[1] > params[0];\n }\n }, {\n key: \"in\",\n value: function _in(params) {\n return params[0].indexOf(params[1]) > -1;\n }\n }, {\n key: \"lessThan\",\n value: function lessThan(params) {\n return params[1] < params[0];\n }\n }, {\n key: \"not\",\n value: function not(params) {\n return !params[0];\n }\n }, {\n key: \"or\",\n value: function or(params) {\n return params[0] || params[1];\n }\n }]);\n\n return Operators;\n}();\n\n/* harmony default export */ var policy_Operators = (Operators);\n// CONCATENATED MODULE: ./src/policy/PDP.js\nfunction PDP_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction PDP_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction PDP_createClass(Constructor, protoProps, staticProps) { if (protoProps) PDP_defineProperties(Constructor.prototype, protoProps); if (staticProps) PDP_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/**\r\n* The Policy Decision Point (PDP) decides if a message is to be authorised by checking a set of\r\n* policies. The resource to be verified is specified in the first word of the 'condition' field of\r\n* a Policy object. The implementation that verifies if the message is compliant with a policy is\r\n* specified in a hashtable to allow dynamic definition of the implementation, providing\r\n* extensibility to the Policy Engine functionalities.\r\n*/\n\nvar PDP_PDP =\n/*#__PURE__*/\nfunction () {\n function PDP(context) {\n PDP_classCallCheck(this, PDP);\n\n this.context = context;\n this.operators = new policy_Operators();\n }\n\n PDP_createClass(PDP, [{\n key: \"evaluatePolicies\",\n value: function evaluatePolicies(message, isIncomingMessage) {\n var policies = this.context.getPolicies(message, isIncomingMessage);\n var result = 'Not Applicable';\n\n if (policies !== undefined) {\n result = this.evaluatePolicy(message, policies.serviceProviderPolicy, isIncomingMessage);\n\n if (result || result === 'Not Applicable') {\n var userResult = this.evaluatePolicy(message, policies.userPolicy, isIncomingMessage);\n\n if (userResult !== 'Not Applicable') {\n result = userResult;\n }\n }\n }\n\n return result;\n }\n }, {\n key: \"evaluatePolicy\",\n value: function evaluatePolicy(message, policy, isIncoming) {\n var result = 'Not Applicable';\n\n if (policy) {\n result = policy.evaluateRules(this.context, message, isIncoming);\n }\n\n return result;\n }\n }]);\n\n return PDP;\n}();\n\n/* harmony default export */ var policy_PDP = (PDP_PDP);\n// CONCATENATED MODULE: ./src/policy/combiningAlgorithms/AllowOverrides.js\nfunction AllowOverrides_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction AllowOverrides_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction AllowOverrides_createClass(Constructor, protoProps, staticProps) { if (protoProps) AllowOverrides_defineProperties(Constructor.prototype, protoProps); if (staticProps) AllowOverrides_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\r\n*/\nvar AllowOverrides =\n/*#__PURE__*/\nfunction () {\n function AllowOverrides() {\n AllowOverrides_classCallCheck(this, AllowOverrides);\n }\n\n AllowOverrides_createClass(AllowOverrides, [{\n key: \"combine\",\n\n /**\r\n * Given an array of individual authorization decisions, prioritizes a positive one.\r\n * @param {boolean[]} decisions\r\n * @returns {boolean}\r\n */\n value: function combine(decisions) {\n if (decisions.indexOf(true) !== -1) {\n return true;\n } else {\n if (decisions.indexOf(false) !== -1) {\n return false;\n } else {\n return 'Not Applicable';\n }\n }\n }\n }]);\n\n return AllowOverrides;\n}();\n\n/* harmony default export */ var combiningAlgorithms_AllowOverrides = (AllowOverrides);\n// CONCATENATED MODULE: ./src/policy/combiningAlgorithms/BlockOverrides.js\nfunction BlockOverrides_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction BlockOverrides_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction BlockOverrides_createClass(Constructor, protoProps, staticProps) { if (protoProps) BlockOverrides_defineProperties(Constructor.prototype, protoProps); if (staticProps) BlockOverrides_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\r\n*/\nvar BlockOverrides =\n/*#__PURE__*/\nfunction () {\n function BlockOverrides() {\n BlockOverrides_classCallCheck(this, BlockOverrides);\n }\n\n BlockOverrides_createClass(BlockOverrides, [{\n key: \"combine\",\n\n /**\r\n * Given an array of individual authorisation decisions, prioritises a negative one.\r\n * @param {boolean[]} decisions\r\n * @returns {boolean}\r\n */\n value: function combine(decisions) {\n if (decisions.indexOf(false) !== -1) {\n return false;\n } else {\n if (decisions.indexOf(true) !== -1) {\n return true;\n } else {\n return 'Not Applicable';\n }\n }\n }\n }]);\n\n return BlockOverrides;\n}();\n\n/* harmony default export */ var combiningAlgorithms_BlockOverrides = (BlockOverrides);\n// CONCATENATED MODULE: ./src/policy/combiningAlgorithms/FirstApplicable.js\nfunction FirstApplicable_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction FirstApplicable_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction FirstApplicable_createClass(Constructor, protoProps, staticProps) { if (protoProps) FirstApplicable_defineProperties(Constructor.prototype, protoProps); if (staticProps) FirstApplicable_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\r\n*/\nvar FirstApplicable =\n/*#__PURE__*/\nfunction () {\n function FirstApplicable() {\n FirstApplicable_classCallCheck(this, FirstApplicable);\n }\n\n FirstApplicable_createClass(FirstApplicable, [{\n key: \"combine\",\n\n /**\r\n * Given an array of individual authorisation decisions, returns the first one different from 'Not Applicable', either positive or negative.\r\n * @param {boolean[]} decisions\r\n * @returns {boolean}\r\n */\n value: function combine(decisions) {\n for (var i in decisions) {\n if (decisions[i] !== 'Not Applicable') {\n return decisions[i];\n }\n }\n\n return 'Not Applicable';\n }\n }]);\n\n return FirstApplicable;\n}();\n\n/* harmony default export */ var combiningAlgorithms_FirstApplicable = (FirstApplicable);\n// CONCATENATED MODULE: ./src/policy/conditions/Condition.js\nfunction Condition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Condition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Condition_createClass(Constructor, protoProps, staticProps) { if (protoProps) Condition_defineProperties(Constructor.prototype, protoProps); if (staticProps) Condition_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to represent a condition and evaluate its applicability.\r\n*/\n\nvar Condition_Condition =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates a new Condition.\r\n * @class\r\n * @param {string} attribute\r\n * @param {string} operator\r\n * @param {*} params\r\n */\n function Condition(attribute, operator, params) {\n Condition_classCallCheck(this, Condition);\n\n this.attribute = attribute;\n this.operator = operator;\n this.params = params;\n this.operators = new policy_Operators();\n }\n /**\r\n * Verifies if the condition is applicable to the message. First, the system value that corresponds to the attribute is retrieved; then, that value is compared with the parameter specified in the condition by executing the operator implementation. If the operator is 'in' and the name of a group is given, then the array holding the members of the group is retrieved before the comparison.\r\n * @param {Object} context environment where the Policy Engine is being used\r\n * @param {Object} message\r\n */\n\n\n Condition_createClass(Condition, [{\n key: \"isApplicable\",\n value: function isApplicable(context, message) {\n context[this.attribute] = {\n message: message\n };\n var value = context[this.attribute];\n var tempParam;\n\n if (this.operator === 'in') {\n if (!Array.isArray(this.params)) {\n tempParam = context.getGroup(this.params, message.to);\n return this.operators[this.operator]([tempParam, value]);\n }\n }\n\n return this.operators[this.operator]([this.params, value]);\n }\n }]);\n\n return Condition;\n}();\n\n/* harmony default export */ var conditions_Condition = (Condition_Condition);\n// CONCATENATED MODULE: ./src/policy/conditions/SubscriptionCondition.js\nfunction SubscriptionCondition_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { SubscriptionCondition_typeof = function _typeof(obj) { return typeof obj; }; } else { SubscriptionCondition_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return SubscriptionCondition_typeof(obj); }\n\nfunction SubscriptionCondition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SubscriptionCondition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SubscriptionCondition_createClass(Constructor, protoProps, staticProps) { if (protoProps) SubscriptionCondition_defineProperties(Constructor.prototype, protoProps); if (staticProps) SubscriptionCondition_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction SubscriptionCondition_possibleConstructorReturn(self, call) { if (call && (SubscriptionCondition_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return SubscriptionCondition_assertThisInitialized(self); }\n\nfunction SubscriptionCondition_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction SubscriptionCondition_get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { SubscriptionCondition_get = Reflect.get; } else { SubscriptionCondition_get = function _get(target, property, receiver) { var base = SubscriptionCondition_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return SubscriptionCondition_get(target, property, receiver || target); }\n\nfunction SubscriptionCondition_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SubscriptionCondition_getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction SubscriptionCondition_getPrototypeOf(o) { SubscriptionCondition_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SubscriptionCondition_getPrototypeOf(o); }\n\nfunction SubscriptionCondition_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) SubscriptionCondition_setPrototypeOf(subClass, superClass); }\n\nfunction SubscriptionCondition_setPrototypeOf(o, p) { SubscriptionCondition_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SubscriptionCondition_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to represent a subscription condition and evaluate its applicability.\r\n*/\n\nvar SubscriptionCondition =\n/*#__PURE__*/\nfunction (_Condition) {\n SubscriptionCondition_inherits(SubscriptionCondition, _Condition);\n\n /**\r\n * Creates a new SubscriptionCondition.\r\n * @class\r\n * @param {string} attribute\r\n * @param {string} operator\r\n * @param {*} params\r\n */\n function SubscriptionCondition(attribute, operator, params) {\n SubscriptionCondition_classCallCheck(this, SubscriptionCondition);\n\n return SubscriptionCondition_possibleConstructorReturn(this, SubscriptionCondition_getPrototypeOf(SubscriptionCondition).call(this, attribute, operator, params));\n }\n /**\r\n * Verifies if the subscription condition is applicable to the message. First, verifies if the message is of the subscription type; second, verifies if the message is from a remote runtime to guarantee that the subscription is being validated in the destination runtime; third, verifies if the subscription preference is met.\r\n * @param {Object} context environment where the Policy Engine is being used\r\n * @param {Object} message\r\n */\n\n\n SubscriptionCondition_createClass(SubscriptionCondition, [{\n key: \"isApplicable\",\n value: function isApplicable(context, message) {\n var isSubscription = message.type === 'subscribe';\n var isFromRemoteSM = context.isFromRemoteSM(message.from);\n\n if (isSubscription & isFromRemoteSM) {\n return SubscriptionCondition_get(SubscriptionCondition_getPrototypeOf(SubscriptionCondition.prototype), \"isApplicable\", this).call(this, context, message);\n } else {\n return false;\n }\n }\n }]);\n\n return SubscriptionCondition;\n}(conditions_Condition);\n\n/* harmony default export */ var conditions_SubscriptionCondition = (SubscriptionCondition);\n// CONCATENATED MODULE: ./src/policy/conditions/AdvancedCondition.js\nfunction AdvancedCondition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction AdvancedCondition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction AdvancedCondition_createClass(Constructor, protoProps, staticProps) { if (protoProps) AdvancedCondition_defineProperties(Constructor.prototype, protoProps); if (staticProps) AdvancedCondition_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar AdvancedCondition_AdvancedCondition =\n/*#__PURE__*/\nfunction () {\n function AdvancedCondition(condition) {\n AdvancedCondition_classCallCheck(this, AdvancedCondition);\n\n this.operators = new policy_Operators();\n\n if (condition.operators !== undefined) {\n condition = condition.condition;\n }\n\n condition = this.buildCondition(condition);\n this.condition = condition;\n }\n\n AdvancedCondition_createClass(AdvancedCondition, [{\n key: \"buildCondition\",\n value: function buildCondition(condition) {\n if (Array.isArray(condition[1])) {\n condition[1] = this.buildCondition(condition[1]);\n } else {\n if (condition[1].attribute === 'subscription') {\n condition[1] = new conditions_SubscriptionCondition(condition[1].attribute, condition[1].operator, condition[1].params);\n } else {\n condition[1] = new conditions_Condition(condition[1].attribute, condition[1].operator, condition[1].params);\n }\n }\n\n if (condition[2] !== undefined) {\n if (Array.isArray(condition[2])) {\n condition[2] = this.buildCondition(condition[2]);\n } else {\n if (condition[2].attribute === 'subscription') {\n condition[2] = new conditions_SubscriptionCondition(condition[2].attribute, condition[2].operator, condition[2].params);\n } else {\n condition[2] = new conditions_Condition(condition[2].attribute, condition[2].operator, condition[2].params);\n }\n }\n }\n\n return condition;\n }\n }, {\n key: \"isApplicable\",\n value: function isApplicable(context, message, scope, target, operator, left, right) {\n if (!operator) {\n operator = this.condition[0];\n left = this.condition[1];\n right = this.condition[2];\n }\n\n while (!(left instanceof conditions_Condition) & !(left instanceof conditions_SubscriptionCondition) & typeof left !== 'boolean') {\n left = this.isApplicable(context, message, scope, target, left[0], left[1], left[2]);\n }\n\n if (right !== undefined) {\n while (!(right instanceof conditions_Condition) & !(right instanceof conditions_SubscriptionCondition) & typeof right !== 'boolean') {\n right = this.isApplicable(context, message, scope, target, right[0], right[1], right[2]);\n }\n }\n\n var resultLeft = typeof left === 'boolean' ? left : left.isApplicable(context, message, scope, target);\n var resultRight;\n\n if (right !== undefined) {\n resultRight = typeof right === 'boolean' ? right : right.isApplicable(context, message, scope, target);\n }\n\n return this.operators[operator]([resultLeft, resultRight]);\n }\n }]);\n\n return AdvancedCondition;\n}();\n\n/* harmony default export */ var conditions_AdvancedCondition = (AdvancedCondition_AdvancedCondition);\n// CONCATENATED MODULE: ./src/policy/Rule.js\nfunction Rule_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Rule_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Rule_createClass(Constructor, protoProps, staticProps) { if (protoProps) Rule_defineProperties(Constructor.prototype, protoProps); if (staticProps) Rule_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\nvar Rule_Rule =\n/*#__PURE__*/\nfunction () {\n function Rule(decision, condition, scope, target, priority) {\n Rule_classCallCheck(this, Rule);\n\n this.decision = decision;\n this.setCondition(condition);\n this.priority = priority;\n this.scope = scope;\n this.target = target;\n }\n\n Rule_createClass(Rule, [{\n key: \"setCondition\",\n value: function setCondition(condition) {\n if (!(condition instanceof conditions_Condition || condition instanceof conditions_AdvancedCondition || condition instanceof conditions_AdvancedCondition)) {\n var attribute = condition.attribute;\n\n switch (attribute) {\n case 'subscription':\n this.condition = new conditions_AdvancedCondition(condition.attribute, condition.operator, condition.params);\n break;\n\n case undefined:\n this.condition = new conditions_AdvancedCondition(condition);\n break;\n\n default:\n this.condition = new conditions_Condition(condition.attribute, condition.operator, condition.params);\n }\n } else {\n this.condition = condition;\n }\n }\n }, {\n key: \"evaluate\",\n value: function evaluate(context, message, isIncoming) {\n var field = isIncoming ? message.to : message.from;\n var hypertyName;\n\n switch (this.scope) {\n case 'global':\n break;\n\n case 'hyperty':\n if (isDataObjectURL(field)) {\n var reporter = context.runtimeRegistry.getReporterURLSynchonous(removePathFromURL(field));\n\n if (reporter !== undefined) {\n hypertyName = context.runtimeRegistry.getHypertyName(reporter);\n }\n } else {\n if (field.split('://')[0] === 'hyperty') {\n hypertyName = context.runtimeRegistry.getHypertyName(removePathFromURL(field));\n }\n }\n\n if (hypertyName === this.target) {\n break;\n }\n\n return 'Not Applicable';\n\n case 'identity':\n var owner;\n\n if (isDataObjectURL(field)) {\n var _reporter = context.runtimeRegistry.getReporterURLSynchonous(removePathFromURL(field));\n\n owner = context.runtimeRegistry.getHypertyOwner(_reporter);\n } else {\n if (field.split('://')[0] === 'hyperty') {\n owner = context.runtimeRegistry.getHypertyOwner(removePathFromURL(field));\n }\n }\n\n if (owner !== undefined) {\n owner = getUserEmailFromURL(owner);\n }\n\n if (owner === this.target) {\n break;\n }\n\n return 'Not Applicable';\n }\n\n if (this.condition.isApplicable(context, message, this.scope, this.target)) {\n return this.decision;\n } else {\n return 'Not Applicable';\n }\n }\n }]);\n\n return Rule;\n}();\n\n/* harmony default export */ var policy_Rule = (Rule_Rule);\n// CONCATENATED MODULE: ./src/policy/Policy.js\nfunction Policy_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Policy_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Policy_createClass(Constructor, protoProps, staticProps) { if (protoProps) Policy_defineProperties(Constructor.prototype, protoProps); if (staticProps) Policy_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\nvar Policy_Policy =\n/*#__PURE__*/\nfunction () {\n function Policy(key, rules, actions, combiningAlgorithm) {\n Policy_classCallCheck(this, Policy);\n\n if (!key) throw new Error('key is not defined');\n if (!actions) throw new Error('actions are not defined');\n this.actions = actions;\n this.key = key;\n\n this._setRules(rules);\n\n this._setCombiningAlgorithm(combiningAlgorithm);\n }\n\n Policy_createClass(Policy, [{\n key: \"addAction\",\n value: function addAction(method, param) {\n this.actions.push({\n method: method,\n param: param\n });\n }\n }, {\n key: \"createRule\",\n value: function createRule(decision, condition, scope, target, priority) {\n if (priority === undefined) {\n priority = this.getLastPriority() + 1;\n }\n\n var rule = new policy_Rule(decision, condition, scope, target, priority);\n this.rules.push(rule);\n }\n }, {\n key: \"deleteRule\",\n value: function deleteRule(rule) {\n var indexToRemove = this.rules.indexOf(rule);\n this.rules.splice(indexToRemove, 1);\n }\n }, {\n key: \"enforceActions\",\n value: function enforceActions(context, message) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var results = [];\n\n if (_this.actions.length !== 0) {\n for (var i in _this.actions) {\n var result = context.pep.actionsService[_this.actions[i].method](message, _this.actions[i].param);\n\n results.push(result);\n }\n\n Promise.all(results).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve([message]);\n }\n });\n }\n }, {\n key: \"evaluateRules\",\n value: function evaluateRules(context, message, isIncoming) {\n var results = [];\n\n for (var i in this.rules) {\n results.push(this.rules[i].evaluate(context, message, isIncoming));\n }\n\n return this.combiningAlgorithm.combine(results);\n }\n }, {\n key: \"getLastPriority\",\n value: function getLastPriority() {\n var priorities = [];\n\n if (this.rules.length !== 0) {\n for (var i in this.rules) {\n priorities.push(this.rules[i].priority);\n }\n\n return Math.max.apply(Math, priorities);\n } else {\n return -1;\n }\n }\n }, {\n key: \"getRuleByPriority\",\n value: function getRuleByPriority(priority) {\n for (var i in this.rules) {\n if (String(this.rules[i].priority) === String(priority)) {\n return this.rules[i];\n }\n }\n\n throw Error('Rule with priority ' + priority + ' does not exist!');\n }\n }, {\n key: \"_setCombiningAlgorithm\",\n value: function _setCombiningAlgorithm(combiningAlgorithm) {\n if (!combiningAlgorithm) {\n combiningAlgorithm = 'blockOverrides';\n }\n\n switch (combiningAlgorithm) {\n case 'blockOverrides':\n this.combiningAlgorithm = new combiningAlgorithms_BlockOverrides();\n break;\n\n case 'allowOverrides':\n this.combiningAlgorithm = new combiningAlgorithms_AllowOverrides();\n break;\n\n case 'firstApplicable':\n this.combiningAlgorithm = new combiningAlgorithms_FirstApplicable();\n break;\n\n default:\n throw Error('Unknown algorithm: ' + combiningAlgorithm);\n }\n }\n }, {\n key: \"_setRules\",\n value: function _setRules(rules) {\n this.rules = [];\n\n for (var i in rules) {\n var rule = rules[i];\n\n if (rule.priority === undefined) {\n rule.priority = this.getLastPriority() + 1;\n }\n\n if (!(rule instanceof policy_Rule)) {\n rule = new policy_Rule(rule.decision, rule.condition, rule.scope, rule.target, rule.priority);\n }\n\n this.rules.push(rule);\n }\n }\n }, {\n key: \"sortRules\",\n value: function sortRules() {\n return this.rules.sort(function (a, b) {\n var x = a.priority;\n var y = b.priority;\n return x < y ? -1 : x > y ? 1 : 0;\n });\n }\n }]);\n\n return Policy;\n}();\n\n/* harmony default export */ var policy_Policy = (Policy_Policy);\n// CONCATENATED MODULE: ./src/policy/PEP.js\nfunction PEP_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction PEP_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction PEP_createClass(Constructor, protoProps, staticProps) { if (protoProps) PEP_defineProperties(Constructor.prototype, protoProps); if (staticProps) PEP_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar PEP_log = loglevel[\"getLogger\"]('PEP');\n\n\n\n\n\nvar PEP_PEP =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates a Policy Enforcement Point (PEP) instance\r\n * @param {Object} context\r\n */\n function PEP(context) {\n PEP_classCallCheck(this, PEP);\n\n var _this = this;\n\n _this.pdp = new policy_PDP(context);\n _this.actionsService = new policy_ActionsService(context);\n _this.context = context;\n context.pep = _this; //TODO should be added a trigger to verify when the loadConfigurations is successfully completed\n\n context.loadConfigurations();\n }\n /**\r\n * return the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n\n\n PEP_createClass(PEP, [{\n key: \"addGUIListeners\",\n value: function addGUIListeners() {\n var _this = this;\n\n _this.context.messageBus.addListener(_this.context.pepURL, function (msg) {\n var funcName = msg.body.method;\n var returnedValue;\n\n if (funcName === 'addToGroup') {\n var groupName = msg.body.params.groupName;\n var userEmail = msg.body.params.userEmail;\n returnedValue = _this.context.addToGroup(groupName, userEmail);\n } else if (funcName === 'createGroup') {\n var _groupName = msg.body.params.groupName;\n returnedValue = _this.context.createGroup(_groupName);\n } else if (funcName === 'addPolicy') {\n var source = msg.body.params.source;\n var key = msg.body.params.key;\n var policy = msg.body.params.policy;\n var combiningAlgorithm = msg.body.params.combiningAlgorithm;\n returnedValue = _this.addPolicy(source, key, policy, combiningAlgorithm);\n } else if (funcName === 'deleteGroup') {\n var _groupName2 = msg.body.params.groupName;\n returnedValue = _this.context.deleteGroup(_groupName2);\n } else if (funcName === 'removePolicy') {\n var _source = msg.body.params.source;\n var _key = msg.body.params.key;\n returnedValue = _this.removePolicy(_source, _key);\n } else if (funcName === 'savePolicies') {\n var _source2 = msg.body.params.source;\n returnedValue = _this.context.savePolicies(_source2);\n } else if (funcName === 'userPolicies') {\n returnedValue = _this.context.userPolicies;\n } else if (funcName === 'activeUserPolicy') {\n var userPolicy = msg.body.params.userPolicy;\n\n if (userPolicy) {\n _this.context.activeUserPolicy = userPolicy;\n }\n\n returnedValue = _this.context.activeUserPolicy;\n } else if (funcName === 'userPolicy') {\n var _key2 = msg.body.params.key;\n returnedValue = _this.context.userPolicies[_key2];\n } else if (funcName === 'saveActivePolicy') {\n returnedValue = _this.context.saveActivePolicy();\n } else if (funcName === 'getMyEmails') {\n returnedValue = _this.context.getMyEmails();\n } else if (funcName === 'getMyHyperties') {\n returnedValue = _this.context.getMyHyperties();\n } else if (funcName === 'groups') {\n returnedValue = _this.context.groups;\n } else if (funcName === 'getGroupsNames') {\n returnedValue = _this.context.getGroupsNames();\n }\n\n if (funcName === 'removeFromGroup') {\n var _groupName3 = msg.body.params.groupName;\n var _userEmail = msg.body.params.userEmail;\n returnedValue = _this.context.removeFromGroup(_groupName3, _userEmail);\n }\n\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n _this.context.messageBus.postMessage(replyMsg);\n });\n }\n /**\r\n * Adds a policy to the Policy Enforcement Point (PEP). The policy can be created by the service\r\n * provider or by the user.\r\n * @param {String} source\r\n * @param {String} key\r\n * @param {Object} policy\r\n */\n\n }, {\n key: \"addPolicy\",\n value: function addPolicy(source, key, policy, combiningAlgorithm) {\n if (!source) throw new Error('source is not defined');\n if (!key) throw new Error('key is not defined');\n\n if (policy === undefined) {\n policy = new policy_Policy(key, [], [], combiningAlgorithm);\n } else {\n if (!(policy instanceof policy_Policy)) {\n policy = new policy_Policy(policy.key, policy.rules, policy.actions, policy.combiningAlgorithm);\n }\n }\n\n switch (source) {\n case 'SERVICE_PROVIDER':\n this.context.savePolicies(source, policy, key);\n break;\n\n case 'USER':\n this.context.userPolicies[key] = policy;\n this.context.savePolicies(source);\n break;\n\n default:\n throw Error('Unknown policy source: ' + source);\n }\n }\n }, {\n key: \"authorise\",\n value: function authorise(message, isIncoming) {\n var _this2 = this;\n\n // log.log('[Policy.PEP Authorise] ', message);\n // log.log(message);\n if (!message) throw new Error('message is not defined');\n if (!message.from) throw new Error('message.from is not defined');\n if (!message.to) throw new Error('message.to is not defined');\n if (!message.type) throw new Error('message.type is not defined');\n message.body = message.body || {};\n return new Promise(function (resolve, reject) {\n message.body = message.body || {};\n var _this = _this2;\n\n var result = _this.pdp.evaluatePolicies(message, isIncoming);\n\n if (result === 'Not Applicable') {\n result = _this.context.defaultBehaviour;\n message.body.auth = false;\n }\n\n _this.actionsService.enforcePolicies(message, isIncoming).then(function (messages) {\n for (var i in messages) {\n message = messages[i];\n\n if (result) {\n message.body.auth = message.body.auth === undefined ? true : message.body.auth;\n resolve(message);\n } else {\n var errorMessage = {\n body: {\n code: 403,\n description: 'Blocked by policy'\n },\n from: message.to,\n to: message.from,\n type: 'response'\n };\n reject(errorMessage);\n }\n }\n }, function (error) {\n reject(error);\n });\n });\n }\n }, {\n key: \"authoriseSync\",\n value: function authoriseSync(message) {\n var result;\n message.body = message.body || {};\n result = this.pdp.evaluatePolicies(message, true);\n\n if (result === 'Not Applicable') {\n result = this.context.defaultBehaviour;\n }\n\n return result;\n }\n }, {\n key: \"removePolicy\",\n value: function removePolicy(source, key) {\n if (!source) throw new Error('source is not defined');\n if (source !== '*' && !key) throw new Error('key is not defined');\n\n switch (source) {\n case '*':\n this.context.serviceProviderPolicy = {};\n this.context.userPolicies = {};\n this.context.activeUserPolicy = undefined;\n this.context.savePolicies('USER');\n this.context.savePolicies('SERVICE_PROVIDER');\n this.context.saveActivePolicy();\n break;\n\n case 'SERVICE_PROVIDER':\n delete this.context.serviceProviderPolicy[key];\n this.context.savePolicies();\n break;\n\n case 'USER':\n delete this.context.userPolicies[key];\n\n if (key === this.context.activeUserPolicy) {\n this.context.activeUserPolicy = undefined;\n this.context.saveActivePolicy();\n }\n\n this.context.savePolicies('USER');\n break;\n\n default:\n throw Error('Unknown policy source: ' + source);\n }\n }\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this.context.messageBus;\n }\n /**\r\n * Set the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this.context.messageBus = messageBus;\n\n _this.addGUIListeners();\n }\n }]);\n\n return PEP;\n}();\n\n/* harmony default export */ var policy_PEP = (PEP_PEP);\n// CONCATENATED MODULE: ./src/bus/Pipeline.js\nfunction Pipeline_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Pipeline_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Pipeline_createClass(Constructor, protoProps, staticProps) { if (protoProps) Pipeline_defineProperties(Constructor.prototype, protoProps); if (staticProps) Pipeline_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\nvar Pipeline_log = loglevel[\"getLogger\"]('Pipeline');\n/**\r\n* @author micaelpedrosa@gmail.com\r\n* Sequencial processor of methods. Similar to how Sequential Promise's work, but better fit for message processing.\r\n* Normal use for this, is to intercept all messages with configured handlers, and act accordingly.\r\n*/\n\n\n\nvar Pipeline =\n/*#__PURE__*/\nfunction () {\n /* public\r\n handlers: ((PipeContext) => void)[]\r\n onFail: (error) => void\r\n */\n function Pipeline(_onFail) {\n Pipeline_classCallCheck(this, Pipeline);\n\n var _this = this;\n\n _this.handlers = [];\n _this.onFail = _onFail;\n }\n /**\r\n * Insert a message in the pipeline queue. All messages are wrapped with a PipeContext.\r\n * @param {Message} msg Message for the queue\r\n * @param {Callback} onDeliver When message is finished processing from all handlers, it will be delivered in this callback.\r\n */\n\n\n Pipeline_createClass(Pipeline, [{\n key: \"process\",\n value: function process(msg, onDeliver) {\n var _this = this;\n\n if (_this.handlers.length > 0) {\n var iter = new Iterator(_this.handlers);\n iter.next(new PipeContext(_this, iter, msg, onDeliver));\n } else {\n onDeliver(msg);\n }\n }\n }]);\n\n return Pipeline;\n}();\n/**\r\n* @author micaelpedrosa@gmail.com\r\n* Wrapper around a message that adds actions that can be fired by any interceptor handler.\r\n* The Pipeline is asynchronous, so an handler should always call an action, the default one is \"next()\"\r\n*/\n\n\nvar PipeContext =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _inStop: boolean\r\n _pipeline: Pipeline\r\n _iter: Iterator\r\n _msg: Message\r\n */\n function PipeContext(pipeline, iter, msg, onDeliver) {\n Pipeline_classCallCheck(this, PipeContext);\n\n var _this = this;\n\n _this._inStop = false;\n _this._pipeline = pipeline;\n _this._iter = iter;\n _this._msg = msg;\n _this._onDeliver = onDeliver;\n }\n\n Pipeline_createClass(PipeContext, [{\n key: \"next\",\n\n /**\r\n * Proceed to the next interceptor handler, unless there was an error. If it's the last one, proceed to onDeliver handler.\r\n */\n value: function next() {\n var _this = this;\n\n if (!_this._inStop) {\n if (_this._iter.hasNext) {\n _this._iter.next(_this);\n } else {\n _this._onDeliver(_this._msg);\n }\n }\n }\n /**\r\n * Proceed directly to the onDeliver handler, unless there was an error.\r\n */\n\n }, {\n key: \"deliver\",\n value: function deliver() {\n var _this = this;\n\n if (!_this._inStop) {\n _this._inStop = true;\n\n _this._onDeliver(_this._msg);\n }\n }\n /**\r\n * Mark the context with an error and proceed to the onFail handler.\r\n * @param {[type]} error [description]\r\n */\n\n }, {\n key: \"fail\",\n value: function fail(error) {\n var _this = this;\n\n if (!_this._inStop) {\n _this._inStop = true;\n\n if (_this._pipeline.onFail) {\n _this._pipeline.onFail(error);\n }\n }\n }\n }, {\n key: \"pipeline\",\n get: function get() {\n return this._pipeline;\n }\n }, {\n key: \"msg\",\n get: function get() {\n return this._msg;\n },\n set: function set(inMsg) {\n this._msg = inMsg;\n }\n }]);\n\n return PipeContext;\n}();\n\nvar Iterator =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _index: number\r\n _array: []\r\n */\n function Iterator(array) {\n Pipeline_classCallCheck(this, Iterator);\n\n this._index = -1;\n this._array = array;\n }\n\n Pipeline_createClass(Iterator, [{\n key: \"hasNext\",\n get: function get() {\n return this._index < this._array.length - 1;\n }\n }, {\n key: \"next\",\n get: function get() {\n this._index++;\n return this._array[this._index];\n }\n }]);\n\n return Iterator;\n}();\n\n/* harmony default export */ var bus_Pipeline = (Pipeline);\n// CONCATENATED MODULE: ./src/bus/MessageBus.js\nfunction MessageBus_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { MessageBus_typeof = function _typeof(obj) { return typeof obj; }; } else { MessageBus_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return MessageBus_typeof(obj); }\n\nfunction MessageBus_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction MessageBus_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction MessageBus_createClass(Constructor, protoProps, staticProps) { if (protoProps) MessageBus_defineProperties(Constructor.prototype, protoProps); if (staticProps) MessageBus_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction MessageBus_possibleConstructorReturn(self, call) { if (call && (MessageBus_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return MessageBus_assertThisInitialized(self); }\n\nfunction MessageBus_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction MessageBus_getPrototypeOf(o) { MessageBus_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MessageBus_getPrototypeOf(o); }\n\nfunction MessageBus_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) MessageBus_setPrototypeOf(subClass, superClass); }\n\nfunction MessageBus_setPrototypeOf(o, p) { MessageBus_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MessageBus_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log system\n\nvar MessageBus_log = loglevel[\"getLogger\"]('MessageBus');\n\n\n/**\r\n* @author micaelpedrosa@gmail.com\r\n* Message BUS Interface is an extension of the Bus\r\n* It doesn't support the default '*' listener, instead it uses the registry.resolve(..)\r\n*/\n\nvar MessageBus_MessageBus =\n/*#__PURE__*/\nfunction (_Bus) {\n MessageBus_inherits(MessageBus, _Bus);\n\n /* private\r\n _registry: Registry\r\n _forwards: { : { fl: MsgListener, sandboxToUrls: Map(Sandbox, [to-url]), urlToSandbox: { to-url: Sandbox } } }\r\n _pipeline: Pipeline\r\n */\n //TODO: future optimization\n //1. message batch processing with setInterval\n //2. resolve default gateway/protostub with register.resolve\n function MessageBus(registry) {\n var _this2;\n\n MessageBus_classCallCheck(this, MessageBus);\n\n _this2 = MessageBus_possibleConstructorReturn(this, MessageBus_getPrototypeOf(MessageBus).call(this));\n _this2._registry = registry;\n _this2._forwards = {};\n _this2._pipelineIn = new bus_Pipeline(function (error) {\n MessageBus_log.error('PIPELINE-ERROR: ', JSON.stringify(error));\n });\n _this2._pipelineOut = new bus_Pipeline(function (error) {\n MessageBus_log.error('PIPELINE-ERROR: ', JSON.stringify(error));\n });\n return _this2;\n }\n\n MessageBus_createClass(MessageBus, [{\n key: \"postMessage\",\n\n /**\r\n * Post a message for routing. It will first search for a listener, if there is no one, it sends to a external routing using the _onPostMessage.\r\n * External routing use the registry.resolve(..) method to decide the destination sandbox.\r\n * @param {Message} inMsg JSON with mandatory Message structure {id, type, from, to}\r\n * @param {Callback} responseCallback Optional callback if a response is expected from the request. A response will be always sent, even if it is a \"Timeout\".\r\n * @return {number} the Message id\r\n */\n value: function postMessage(inMsg, responseCallback, timeout) {\n MessageBus_log.info('onPOSTMessage: ', inMsg);\n\n var _this = this;\n\n var deliver = function deliver(msg) {\n _this._responseCallback(inMsg, responseCallback, timeout);\n\n if (!_this._onResponse(msg)) {\n var itemList = _this._subscriptions[msg.to];\n\n if (itemList) {\n //do not publish on default address, because of loopback cycle\n _this._publishOn(itemList, msg);\n } else {\n //if there is no listener, send to external interface\n _this._onPostMessage(msg);\n }\n }\n };\n\n _this._genId(inMsg);\n\n if (_this._isToProcess(inMsg)) {\n var isIncoming = _this._isIncomingMessage(inMsg);\n\n if (isIncoming) _this._pipelineIn.process(inMsg, deliver);else _this._pipelineOut.process(inMsg, deliver);\n } else deliver(inMsg);\n\n return inMsg.id;\n }\n }, {\n key: \"_isToProcess\",\n value: function _isToProcess(message) {\n var schemasToIgnore = ['domain', 'domain-idp', 'global', 'hyperty-runtime', 'runtime'];\n var splitFrom = message.from.split('://');\n var fromSchema = splitFrom[0];\n var splitTo = message.to.split('://');\n var toSchema = splitTo[0];\n var from = message.from;\n var to = message.to; // Signalling messages between P2P Stubs don't have to be verified. FFS\n\n if (message.body && message.body.source) {\n from = message.body.source;\n }\n\n if (message.body && message.body.subscriber) {\n from = message.body.subscriber;\n }\n\n if (from.indexOf('/p2phandler/') !== -1 || from.indexOf('/p2prequester/') !== -1 || to.indexOf('/p2phandler/') !== -1 || to.indexOf('/p2prequester/') !== -1) {\n return false;\n }\n\n if (this._registry.isLocal(from) && this._registry.isLocal(message.to)) return false;\n\n if (message.from === fromSchema || message.to === toSchema || message.type === 'read' || message.type === 'response' || message.from.includes('hyperty://') && message.type === 'delete') {\n return false;\n } else {\n return schemasToIgnore.indexOf(fromSchema) === -1 || schemasToIgnore.indexOf(toSchema) === -1;\n }\n }\n }, {\n key: \"_isIncomingMessage\",\n value: function _isIncomingMessage(message) {\n var from;\n\n if (message.type === 'forward') {\n MessageBus_log.info('[MessageBus - isIncomingMessage] - message.type: ', message.type);\n from = message.body.from;\n } else if (message.hasOwnProperty('body') && message.body.hasOwnProperty('source') && message.body.source) {\n MessageBus_log.info('[MessageBus - isIncomingMessage] - message.body.source: ', message.body.source);\n from = message.body.source;\n } else if (message.hasOwnProperty('body') && message.body.hasOwnProperty('subscriber') && message.body.subscriber) {\n //TODO: this subscriber validation should not exist, because is outdated\n //TODO: the syncher and syncher manager not following the correct spec;\n MessageBus_log.info('[MessageBus - isIncomingMessage] - message.body.subscriber: ', message.body.subscriber);\n from = message.body.subscriber;\n } else if (message.hasOwnProperty('body') && message.body.hasOwnProperty('reporter') && message.body.reporter) {\n //TODO: this subscriber validation should not exist, because is outdated\n //TODO: the syncher and syncher manager not following the correct spec;\n MessageBus_log.info('[MessageBus - isIncomingMessage] - message.body.reporter: ', message.body.reporter);\n from = message.body.reporter;\n } else {\n MessageBus_log.info('[MessageBus - isIncomingMessage] - message.from ', message.from);\n from = message.from;\n }\n\n MessageBus_log.info('[MessageBus - isIncomingMessage] - check if isLocal: ', from);\n return !this._registry.isLocal(from);\n }\n /**\r\n * Adds an external publish address listener. Every message for the address will be forwarded to the external routing by _onPostMessage.\r\n * This means, even if there is a listener for the address, it will also send the message to the external routing.\r\n * @param {URL} from Publish address.\r\n */\n\n }, {\n key: \"addPublish\",\n value: function addPublish(from) {\n var _this3 = this;\n\n var _this = this; //verify if forward exist\n\n\n var refCount = _this._forwards[from];\n\n if (!refCount) {\n var forwardListener = _this.addListener(from, function (msg) {\n MessageBus_log.info('MB-PUBLISH: ( ' + from + ' )');\n\n _this._onPostMessage(msg);\n });\n\n refCount = {\n counter: 0,\n fl: forwardListener,\n remove: function remove() {\n _this3.counter--;\n\n if (_this3.counter === 0) {\n _this3.fl.remove();\n\n delete _this._forwards[from];\n }\n }\n };\n _this._forwards[from] = refCount;\n }\n\n refCount.counter++;\n return refCount;\n }\n /**\r\n * Adds a forward listener for a message destination. Every message reaching an address will be also sent to the forward address.\r\n * @param {URL} from Message destination, it's actually the field \"to\" of the message.\r\n * @param {URL} to Forward address.\r\n */\n\n }, {\n key: \"addForward\",\n value: function addForward(from, to) {\n var _this = this;\n\n return _this.addListener(from, function (msg) {\n MessageBus_log.info('MB-FORWARD: ( ' + from + ' to ' + to + ' )');\n\n _this.forward(to, msg);\n });\n }\n /**\r\n * Just forward's a message to the forward address. Listeners should be available for the forward address.\r\n * @param {URL} url Forward address.\r\n * @param {Message} msg Message to forward\r\n */\n\n }, {\n key: \"forward\",\n value: function forward(url, msg) {\n var _this = this;\n\n var itemList = _this._subscriptions[url];\n\n if (itemList) {\n _this._publishOn(itemList, msg);\n }\n } //default route, if there are no listeners available for a message destination.\n\n }, {\n key: \"_onPostMessage\",\n value: function _onPostMessage(msg) {\n var _this = this; //resolve external protostub...\n\n\n _this._registry.resolve(msg).then(function (route, msg2route) {\n if (msg2route) _this.forward(route, msg2route);else _this.forward(route, msg);\n }).catch(function (e) {\n MessageBus_log.error('RESOLVE-ERROR: ', e);\n });\n }\n }, {\n key: \"pipelineIn\",\n get: function get() {\n return this._pipelineIn;\n }\n }, {\n key: \"pipelineOut\",\n get: function get() {\n return this._pipelineOut;\n }\n }]);\n\n return MessageBus;\n}(bus_Bus);\n\n/* harmony default export */ var bus_MessageBus = (MessageBus_MessageBus);\n// CONCATENATED MODULE: ./src/cryptoManager/utf8.js\n// Marshals a string to Uint8Array.\nfunction encodeUTF8(s) {\n var i = 0;\n var bytes = new Uint8Array(s.length * 4);\n\n for (var ci = 0; ci != s.length; ci++) {\n try {\n var xxx = s.charCodeAt(ci);\n } catch (err) {\n console.log(err.message);\n return;\n }\n\n var c = s.charCodeAt(ci);\n\n if (c < 128) {\n bytes[i++] = c;\n continue;\n }\n\n if (c < 2048) {\n bytes[i++] = c >> 6 | 192;\n } else {\n if (c > 0xd7ff && c < 0xdc00) {\n if (++ci == s.length) throw 'UTF-8 encode: incomplete surrogate pair';\n var c2 = s.charCodeAt(ci);\n if (c2 < 0xdc00 || c2 > 0xdfff) throw 'UTF-8 encode: second char code 0x' + c2.toString(16) + ' at index ' + ci + ' in surrogate pair out of range';\n c = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff);\n bytes[i++] = c >> 18 | 240;\n bytes[i++] = c >> 12 & 63 | 128;\n } else {\n // c <= 0xffff\n bytes[i++] = c >> 12 | 224;\n }\n\n bytes[i++] = c >> 6 & 63 | 128;\n }\n\n bytes[i++] = c & 63 | 128;\n }\n\n return bytes.subarray(0, i);\n} // Unmarshals an Uint8Array to string.\n\nfunction decodeUTF8(bytes) {\n var s = '';\n var i = 0;\n\n while (i < bytes.length) {\n var c = bytes[i++];\n\n if (c > 127) {\n if (c > 191 && c < 224) {\n if (i >= bytes.length) throw 'UTF-8 decode: incomplete 2-byte sequence';\n c = (c & 31) << 6 | bytes[i] & 63;\n } else if (c > 223 && c < 240) {\n if (i + 1 >= bytes.length) throw 'UTF-8 decode: incomplete 3-byte sequence';\n c = (c & 15) << 12 | (bytes[i] & 63) << 6 | bytes[++i] & 63;\n } else if (c > 239 && c < 248) {\n if (i + 2 >= bytes.length) throw 'UTF-8 decode: incomplete 4-byte sequence';\n c = (c & 7) << 18 | (bytes[i] & 63) << 12 | (bytes[++i] & 63) << 6 | bytes[++i] & 63;\n } else throw 'UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1);\n\n ++i;\n }\n\n if (c <= 0xffff) s += String.fromCharCode(c);else if (c <= 0x10ffff) {\n c -= 0x10000;\n s += String.fromCharCode(c >> 10 | 0xd800);\n s += String.fromCharCode(c & 0x3FF | 0xdc00);\n } else throw 'UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach';\n }\n\n return s;\n}\n// CONCATENATED MODULE: ./src/cryptoManager/Crypto.js\nfunction Crypto_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Crypto_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Crypto_createClass(Constructor, protoProps, staticProps) { if (protoProps) Crypto_defineProperties(Constructor.prototype, protoProps); if (staticProps) Crypto_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar Crypto_log = loglevel[\"getLogger\"]('CryptoManager');\n/**\r\n* Class with the cryptographic functions for the authentication protocol\r\n*\r\n*/\n\nvar Crypto_Crypto =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Runtimefactory is passed in the costructor, because the nodeJS has a different crypto module\r\n * from the browser. RuntimeFactory provides a wrapper for the fuctions of nodeJS, so they can be\r\n * invoked browser like.\r\n */\n function Crypto(runtimeFactory) {\n Crypto_classCallCheck(this, Crypto);\n\n var _this = this;\n\n typeof runtimeFactory.createWebcrypto === 'function' ? _this._crypto = runtimeFactory.createWebcrypto() : _this._crypto = crypto;\n }\n /**\r\n * Performs a RSA encryption\r\n * @param {ArrayBuffer} value the public key\r\n * @param {BufferSource} value data to be encryped\r\n * @return {Uint8Array} encrypted data\r\n */\n\n\n Crypto_createClass(Crypto, [{\n key: \"encryptRSA\",\n value: function encryptRSA(pubKey, data) {\n Crypto_log.log('encryptRSA:pubKey', pubKey);\n Crypto_log.log('encryptRSA:data', data);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importRSAencryptKey(new Uint8Array(pubKey)).then(function (publicKey) {\n _this._crypto.subtle.encrypt({\n name: 'RSA-OAEP'\n }, publicKey, //from generateKey or importKey above\n data //ArrayBuffer of data you want to encrypt\n ).then(function (encrypted) {\n //returns an ArrayBuffer containing the encrypted data\n // log.log('crypto-encryptRSA', new Uint8Array(encrypted));\n resolve(new Uint8Array(encrypted));\n }).catch(function (err) {\n // log.log('crypto-encryptRSA', err);\n reject(err);\n });\n });\n });\n }\n /**\r\n * Performs a RSA decryption\r\n * @param {ArrayBuffer} value the private key\r\n * @param {BufferSource} value data to be decrypted\r\n * @return {Uint8Array} decrypted data\r\n */\n\n }, {\n key: \"decryptRSA\",\n value: function decryptRSA(privKey, data) {\n Crypto_log.log('decryptRSA:privKey', privKey);\n Crypto_log.log('decryptRSA:data', data);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importRSAdecryptKey(privKey).then(function (privateKey) {\n _this._crypto.subtle.decrypt({\n name: 'RSA-OAEP'\n }, privateKey, //from generateKey or importKey above\n data //ArrayBuffer of the data\n ).then(function (decrypted) {\n var decryptedData = new Uint8Array(decrypted); // log.log('crypto-decryptRSA', decryptedData);\n\n resolve(decryptedData);\n }).catch(function (err) {\n // log.log('crypto-decryptRSA', err);\n reject(err);\n });\n });\n });\n }\n /**\r\n * Performs a RSA sign\r\n * @param {ArrayBuffer} value the private key\r\n * @param {BufferSource} value data to be signed\r\n * @return {Uint8Array} data signature\r\n */\n\n }, {\n key: \"signRSA\",\n value: function signRSA(privKey, data) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importRSAsignKey(privKey).then(function (privateKey) {\n _this._crypto.subtle.sign({\n name: 'RSASSA-PKCS1-v1_5'\n }, privateKey, //from generateKey or importKey above\n encodeUTF8(data) //ArrayBuffer of data you want to sign\n ).then(function (signature) {\n //returns an ArrayBuffer containing the signature\n // log.log('crypto-signRSA', new Uint8Array(signature));\n resolve(new Uint8Array(signature));\n }).catch(function (err) {\n // log.log('crypto-signRSA', err);\n reject(err);\n });\n });\n });\n }\n /**\r\n * Performs a RSA signature verification\r\n * @param {ArrayBuffer} value the public key\r\n * @param {BufferSource} value data to be verified\r\n * @return {Boolean} result of the signature verification\r\n */\n\n }, {\n key: \"verifyRSA\",\n value: function verifyRSA(pubKey, data, signature) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importRSAverifyKey(pubKey).then(function (publicKey) {\n _this._crypto.subtle.verify({\n name: 'RSASSA-PKCS1-v1_5'\n }, publicKey, //from generateKey or importKey above\n signature, //ArrayBuffer of the signature\n encodeUTF8(data) //ArrayBuffer of the data\n ).then(function (isvalid) {\n //returns a boolean on whether the signature is true or not\n // log.log('crypto-verifyRSA', isvalid);\n resolve(isvalid);\n }).catch(function (err) {\n // log.log('crypto-verifyRSA', err);\n reject(err);\n });\n });\n });\n }\n /**\r\n * Performs a RSA signature verification\r\n * @param {ArrayBuffer} value the public key\r\n * @param {BufferSource} value data to be verified\r\n * @return {Boolean} result of the signature verification\r\n */\n\n }, {\n key: \"encryptAES\",\n value: function encryptAES(key, data, iv) {\n Crypto_log.log('encryptAES:key', key);\n Crypto_log.log('encryptAES:data', data);\n Crypto_log.log('encryptAES:iv', iv);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importAESkey(key).then(function (aesKey) {\n _this._crypto.subtle.encrypt({\n name: 'AES-CBC',\n //Don't re-use initialization vectors!\n //Always generate a new iv every time your encrypt!\n iv: iv\n }, aesKey, //from generateKey or importKey above\n encodeUTF8(data) //ArrayBuffer of data you want to encrypt\n ).then(function (encrypted) {\n //returns an ArrayBuffer containing the encrypted data\n // log.log('crypto-encryptAES', new Uint8Array(encrypted));\n resolve(new Uint8Array(encrypted));\n }).catch(function (err) {\n // log.log('crypto-encryptAES', err);\n reject(err);\n });\n });\n });\n }\n }, {\n key: \"decryptAES\",\n value: function decryptAES(key, data, iv) {\n Crypto_log.log('decryptAES:key', key);\n Crypto_log.log('decryptAES:data', data);\n Crypto_log.log('decryptAES:iv', iv);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importAESkey(key).then(function (aesKey) {\n _this._crypto.subtle.decrypt({\n name: 'AES-CBC',\n iv: iv\n }, aesKey, //from generateKey or importKey above\n data //ArrayBuffer of the data\n ).then(function (decrypted) {\n var decodedData = decodeUTF8(new Uint8Array(decrypted));\n Crypto_log.log('crypto-decryptAES', decodedData);\n resolve(decodedData);\n }).catch(function (err) {\n // log.log('crypto-decryptAES', err);\n reject(err);\n });\n });\n });\n }\n /**\r\n * creates a hash using the HMAC algorithm\r\n * @param {byteArray} key key to be used in the hmac\r\n * @param {string} data information to be hashed\r\n * @return {byteArray} signature resulting hash\r\n */\n\n }, {\n key: \"hashHMAC\",\n value: function hashHMAC(key, data) {\n Crypto_log.log('hashHMAC:key', key);\n Crypto_log.log('hashHMAC:data', data);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (typeof data != 'string') {\n data = JSON.stringify(data);\n Crypto_log.log('Converting hashHMAC inpured DATA');\n Crypto_log.log('HHashHMAC:', data);\n }\n\n _this._importHMACkey(key).then(function (hmacKey) {\n _this._crypto.subtle.sign({\n name: 'HMAC'\n }, hmacKey, //from generateKey or importKey above\n encodeUTF8(data) //ArrayBuffer of data you want to sign\n ).then(function (signature) {\n Crypto_log.log('HashHMAC signature:', new Uint8Array(signature)); // log.log('crypto-hashHMAC', signature);\n //returns an ArrayBuffer containing the signature\n\n resolve(new Uint8Array(signature));\n }).catch(function (err) {\n // log.log('crypto-hashHMAC', err);\n reject(err);\n });\n });\n });\n }\n /**\r\n * verifies an hash using the HMAC algorithm\r\n * @param {byteArray} key key to be used in the hmac\r\n * @param {string} data information to be hashed to compare\r\n * @param {byteArray} signature hash to compare with the received data\r\n * @return {boolean} isvalid boolean saying if the data corresponds to the hash received\r\n */\n\n }, {\n key: \"verifyHMAC\",\n value: function verifyHMAC(key, data, signature) {\n Crypto_log.log('verifyHMAC:key', key);\n Crypto_log.log('verifyHMAC:data', data);\n Crypto_log.log('verifyHMAC:signature', signature);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importHMACkey(key).then(function (hmacKey) {\n if (typeof data != 'string') {\n data = JSON.stringify(data);\n Crypto_log.log('Converting verifyHMAC inputed DATA:', data);\n }\n\n _this._crypto.subtle.verify({\n name: 'HMAC'\n }, hmacKey, //from generateKey or importKey above\n signature, //ArrayBuffer of the signature\n encodeUTF8(data) //ArrayBuffer of the data\n ).then(function (isvalid) {\n //returns a boolean on whether the signature is true or not\n // log.log('crypto-verifyHMAC', isvalid);\n Crypto_log.log('verifyHMAC result', isvalid);\n isvalid ? resolve(isvalid) : reject(isvalid);\n }).catch(function (err) {\n Crypto_log.error('crypto-verifyHMAC', err);\n reject(err);\n });\n });\n });\n }\n /**\r\n * generates a RSA public/private key pair with a modulus length of 2048 bits\r\n * @return {JSON} keyPair json containing the public and private keys\r\n */\n\n }, {\n key: \"generateRSAKeyPair\",\n value: function generateRSAKeyPair() {\n var _this = this;\n\n var keyPair = {};\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.generateKey({\n name: 'RSA-PSS',\n modulusLength: 2048,\n //can be 1024, 2048, or 4096\n publicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n hash: {\n name: 'SHA-256' //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n\n }\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['sign', 'verify'] //can be any combination of 'sign' and 'verify'\n ).then(function (key) {\n //returns a keypair object\n // log.log(key);\n _this._crypto.subtle.exportKey('spki', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n key.publicKey //can be a publicKey or privateKey, as long as extractable was true\n ).then(function (publicKey) {\n //returns the exported key data\n keyPair.public = new Uint8Array(publicKey);\n return _this._crypto.subtle.exportKey('pkcs8', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n key.privateKey //can be a publicKey or privateKey, as long as extractable was true\n );\n }).then(function (privateKey) {\n keyPair.private = new Uint8Array(privateKey); // log.log('crypto-generateRSAKeyPair', keyPair);\n\n resolve(keyPair);\n }).catch(function (err) {\n Crypto_log.error(err);\n reject(err);\n });\n }).catch(function (err) {\n Crypto_log.error(err);\n reject(err);\n });\n });\n }\n /**\r\n * Generates a 128 bit random value.\r\n * @return {byteArray} array random value\r\n */\n\n }, {\n key: \"generateIV\",\n value: function generateIV() {\n var _this = this;\n\n var array = new Uint8Array(16);\n\n _this._crypto.getRandomValues(array);\n\n return array;\n }\n /**\r\n * Generates a 256 bit random value. 32 bits are extrated from the machine time,\r\n * the remaining are generated randomly\r\n * @return {byteArray} array random value\r\n */\n\n }, {\n key: \"generateRandom\",\n value: function generateRandom() {\n var _this = this;\n\n var array = new Uint8Array(32);\n\n _this._crypto.getRandomValues(array);\n\n var date = Date.now();\n var dateEncoded = encodeUTF8(date.toString()); //extract the least significant 4 bytes in the date\n\n var finalDate = dateEncoded.slice(dateEncoded.length - 4, dateEncoded.length); // add in the first 4 bytes of the array the bytes extracted previously;\n\n for (var i = 0; i < 4; i++) {\n array[i] = finalDate[i];\n }\n\n return array;\n }\n /**\r\n * generates a premaster secret (PMS) of 48 bytes (384 bits) randomly\r\n * @return {byteArray} array premaster secret key\r\n */\n\n }, {\n key: \"generatePMS\",\n value: function generatePMS() {\n var _this = this;\n\n var array = new Uint8Array(48);\n\n _this._crypto.getRandomValues(array);\n\n return array;\n }\n /**\r\n * generates a masterKey secret (PMS) of 48 bytes (384 bits) using the premaster secret and\r\n * two randoms\r\n * @return {byteArray} array master secret key with 48 bytes\r\n */\n\n }, {\n key: \"generateMasterSecret\",\n value: function generateMasterSecret(hmacKey, data) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var key = new Uint8Array(48);\n var seed = data;\n\n _this._digest(hmacKey).then(function (digestedKey) {\n _this.hashHMAC(digestedKey, seed).then(function (keypart0) {\n //copy the first 32 bytes into the key\n for (var i = 0; i < 32; i++) {\n key[i] = keypart0[i];\n }\n\n return _this.hashHMAC(digestedKey, seed + keypart0);\n }).then(function (keypart1) {\n //copy the first 16 bytes to the key remaining 16 bytes\n for (var i = 0; i < 16; i++) {\n key[i + 32] = keypart1[i];\n } // log.log('crypto-generateMasterSecret', key);\n\n\n resolve(key);\n }).catch(function (err) {\n // log.log('crypto-generateMasterSecret', err);\n reject(err);\n });\n });\n });\n }\n /**\r\n * generates both users MAC and encryption keys. generate as output an array\r\n * with 4 byteArray each with 32 bytes\r\n * @param {byteArray} secret secret to be used in the HMAC function\r\n * @param {String} data information to be used as seed\r\n * @return {Array} key array with the information to generate keys\r\n */\n\n }, {\n key: \"generateKeys\",\n value: function generateKeys(hmacKey, data) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var key = [];\n var seed = data; // iterate 4 times to obtain a 1024 key size\n\n _this.hashHMAC(hmacKey, seed).then(function (keypart0) {\n key.push(keypart0);\n return _this.hashHMAC(hmacKey, seed + keypart0);\n }).then(function (keypart1) {\n key.push(keypart1);\n return _this.hashHMAC(hmacKey, seed + keypart1);\n }).then(function (keypart2) {\n key.push(keypart2);\n return _this.hashHMAC(hmacKey, seed + keypart2);\n }).then(function (keypart3) {\n key.push(keypart3); // log.log('crypto-generateKeys', key);\n\n resolve(key);\n }).catch(function (err) {\n // log.log('crypto-generateKeys', err);\n reject(err);\n }); // log.log(hmacKey, data);\n\n });\n }\n }, {\n key: \"_importRSAsignKey\",\n value: function _importRSAsignKey(privKey) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.importKey('pkcs8', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n privKey, {\n //these are the algorithm options\n name: 'RSASSA-PKCS1-v1_5',\n hash: {\n name: 'SHA-256' //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n\n }\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['sign'] //'verify' for public key import, 'sign' for private key imports\n ).then(function (privateKey) {\n //returns a publicKey (or privateKey if you are importing a private key)\n // log.log('crypto-_importRSAsignKey', privateKey);\n resolve(privateKey);\n }).catch(function (err) {\n Crypto_log.error('crypto-_importRSAsignKey', err);\n reject(err);\n });\n });\n }\n }, {\n key: \"_importRSAverifyKey\",\n value: function _importRSAverifyKey(pubKey) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.importKey('spki', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n pubKey, {\n //these are the algorithm options\n name: 'RSASSA-PKCS1-v1_5',\n hash: {\n name: 'SHA-256' //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n\n }\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['verify'] //'verify' for public key import, 'sign' for private key imports\n ).then(function (publicKey) {\n //returns a publicKey (or privateKey if you are importing a private key)\n // log.log('crypto-_importRSAverifyKey', publicKey);\n resolve(publicKey);\n }).catch(function (err) {\n Crypto_log.error('crypto-_importRSAverifyKey', err);\n reject(err);\n });\n });\n }\n }, {\n key: \"_importRSAencryptKey\",\n value: function _importRSAencryptKey(pubKey) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.importKey('spki', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n pubKey, {\n //these are the algorithm options\n name: 'RSA-OAEP',\n hash: {\n name: 'SHA-256' //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n\n }\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['encrypt'] //'encrypt' or 'wrapKey' for public key import or\n //'decrypt' or 'unwrapKey' for private key imports\n ).then(function (publicKey) {\n //returns a publicKey (or privateKey if you are importing a private key)\n // log.log('crypto-_importRSAencryptKey', publicKey);\n resolve(publicKey);\n }).catch(function (err) {\n Crypto_log.error('crypto-_importRSAencryptKey', err.name);\n reject(err);\n });\n });\n }\n }, {\n key: \"_importRSAdecryptKey\",\n value: function _importRSAdecryptKey(privKey) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.importKey('pkcs8', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n privKey, {\n //these are the algorithm options\n name: 'RSA-OAEP',\n hash: {\n name: 'SHA-256' //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n\n }\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['decrypt'] //'encrypt' or 'wrapKey' for public key import or\n //'decrypt' or 'unwrapKey' for private key imports\n ).then(function (privateKey) {\n //returns a publicKey (or privateKey if you are importing a private key)\n // log.log('crypto-_importRSAdecryptKey', privateKey);\n resolve(privateKey);\n }).catch(function (err) {\n Crypto_log.error('crypto-_importRSAdecryptKey', err);\n reject(err);\n });\n });\n }\n }, {\n key: \"concatPMSwithRandoms\",\n value: function concatPMSwithRandoms(pms, toRandom, fromRandom) {\n var finalKey = new Uint8Array(pms.length + toRandom.length + fromRandom.length); // add PremasterKey\n\n for (var i = 0; i < pms.length; i++) {\n finalKey[i] = pms[i];\n } //add to random\n\n\n for (var _i = 0; _i < toRandom.length; _i++) {\n finalKey[_i + pms.length] = pms[_i];\n } //add from random\n\n\n for (var _i2 = 0; _i2 < fromRandom.length; _i2++) {\n finalKey[_i2 + pms.length + toRandom.length] = pms[_i2];\n }\n\n return finalKey;\n }\n }, {\n key: \"_generate256bitKey\",\n value: function _generate256bitKey() {\n var _this = this;\n\n var array = new Uint8Array(32);\n\n _this._crypto.getRandomValues(array);\n\n return array;\n }\n /**\r\n * imports the secret to the HMAC function\r\n * @param {byteArray} arrayBuffer bytes to import as key\r\n * @return {JSON} key key ready to be used in the HMAC cryptographic function\r\n */\n\n }, {\n key: \"_importHMACkey\",\n value: function _importHMACkey(arrayBuffer) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._digest(arrayBuffer).then(function (key) {\n _this._crypto.subtle.importKey('raw', //can be 'jwk' or 'raw'\n key, {\n //this is the algorithm options\n name: 'HMAC',\n hash: {\n name: 'SHA-256'\n },\n //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n length: 256 //optional, if you want your key length to differ from the hash function's block length\n\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['sign', 'verify'] //can be any combination of 'sign' and 'verify'\n ).then(function (key) {\n //returns the symmetric key\n // log.log('crypto-_importHMACkey', key);\n resolve(key);\n }).catch(function (err) {\n reject(err);\n });\n });\n });\n }\n }, {\n key: \"_digest\",\n value: function _digest(value) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.digest({\n name: 'SHA-256'\n }, value //The data you want to hash as an ArrayBuffer\n ).then(function (hash) {\n //returns the hash as an ArrayBuffer\n // log.log('crypto-digest', new Uint8Array(hash));\n resolve(new Uint8Array(hash));\n }).catch(function (err) {\n Crypto_log.error(err);\n reject(err);\n });\n });\n }\n }, {\n key: \"_importAESkey\",\n value: function _importAESkey(arrayBuffer) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.importKey('raw', //can be 'jwk' or 'raw'\n arrayBuffer, {\n //this is the algorithm options\n name: 'AES-CBC'\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['encrypt', 'decrypt'] //can be 'encrypt', 'decrypt', 'wrapKey', or 'unwrapKey'\n ).then(function (key) {\n //returns the symmetric key\n // log.log('crypto-importAESkey', key);\n resolve(key);\n }).catch(function (err) {\n Crypto_log.error('crypto-importAESkey', err);\n reject(err);\n });\n });\n }\n }, {\n key: \"_sha256\",\n value: function _sha256(str) {\n var _this = this;\n\n var buffer = new TextEncoder('utf-8').encode(str);\n return _this._crypto.subtle.digest('SHA-256', buffer).then(function (hash) {\n return _this._hex(hash);\n });\n }\n }, {\n key: \"_hex\",\n value: function _hex(buffer) {\n var hexCodes = [];\n var view = new DataView(buffer);\n\n for (var i = 0; i < view.byteLength; i += 4) {\n // Using getUint32 reduces the number of iterations needed (we process 4 bytes each time)\n var value = view.getUint32(i);\n var stringValue = value.toString(16);\n var padding = '00000000';\n var paddedValue = (padding + stringValue).slice(-padding.length);\n hexCodes.push(paddedValue);\n } // Join all the hex strings into one\n\n\n return hexCodes.join('');\n }\n }]);\n\n return Crypto;\n}();\n\n/* harmony default export */ var cryptoManager_Crypto = (Crypto_Crypto);\n// CONCATENATED MODULE: ./src/cryptoManager/CryptoManager.js\nfunction CryptoManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction CryptoManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CryptoManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) CryptoManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) CryptoManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar CryptoManager_log = loglevel[\"getLogger\"]('CryptoManager');\n\n\n/**\r\n* The Crypto Manager provides manages cryptographic features for the runtime including:\r\n* - Mutual Authentication between peers\r\n* - Crypto Keys\r\n* - e2e encryption and decription of communication between Hyperties and dta objects\r\n*\r\n*/\n\nvar CryptoManager_CryptoManager =\n/*#__PURE__*/\nfunction () {\n /**\r\n * This is the constructor to initialise the CryptoManager, it does not require any input.\r\n * The init() must called in order to set mandatories attributes\r\n */\n function CryptoManager(storageManager) {\n CryptoManager_classCallCheck(this, CryptoManager);\n\n this.storageManager = storageManager;\n this.userDefaultKeyRef = 'userAsymmetricKey';\n }\n\n CryptoManager_createClass(CryptoManager, [{\n key: \"init\",\n value: function init(runtimeURL, runtimeCapabilities, storageManager, dataObjectsStorage, registry, coreDiscovery, idm, runtimeFactory) {\n var _this = this;\n\n if (!runtimeURL) throw new Error('[] runtimeURL is missing.');\n if (!storageManager) throw new Error('storageManager is missing');\n if (!runtimeFactory) throw new Error('runtimeFactory is missing');\n _this._runtimeURL = runtimeURL;\n _this._cryptoManagerURL = _this._runtimeURL + '/cryptoManager'; //_this._myURL = _this._runtimeURL + '/crypto';\n\n _this.storageManager = storageManager;\n _this.dataObjectsStorage = dataObjectsStorage;\n _this.runtimeCapabilities = runtimeCapabilities;\n _this._runtimeFactory = runtimeFactory;\n _this._domain = divideURL(_this._runtimeURL).domain;\n _this.crypto = new cryptoManager_Crypto(_this._runtimeFactory); // hashTable to store all the crypto information between two hyperties\n\n _this.chatKeys = {}; // hashTable to store the symmetric keys to be used in the chat group\n\n _this.dataObjectSessionKeys = {}; //failsafe to enable/disable all the criptographic functions\n\n _this.isToUseEncryption = true;\n _this._registry = registry;\n _this._coreDiscovery = coreDiscovery;\n _this._idm = idm;\n } //******************* GET AND SET METHODS *******************\n\n /**\r\n * return the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n\n }, {\n key: \"loadSessionKeys\",\n // to be used to initialise IDM with SessionKeys used in previous session\n value: function loadSessionKeys() {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this.storageManager.get('dataObjectSessionKeys').then(function (sessionKeys) {\n if (sessionKeys) _this.dataObjectSessionKeys = sessionKeys;else _this.dataObjectSessionKeys = {};\n resolve();\n });\n });\n }\n }, {\n key: \"_isFromRemoteSM\",\n value: function _isFromRemoteSM(from) {\n var splitFrom = from.split('://');\n return splitFrom[0] === 'runtime' && from !== this._runtimeURL + '/sm';\n }\n }, {\n key: \"addCryptoGUIListeners\",\n value: function addCryptoGUIListeners() {\n //TODO: Change the GUI invocation of this method\n var _this = this;\n\n _this._messageBus.addListener(_this._cryptoManagerURL, function (msg) {\n var funcName = msg.body.method; //let returnedValue;\n\n if (funcName === 'generateRSAKeyPair') {\n _this._crypto.getMyPublicKey().then(function (key) {\n var value = {\n type: 'execute',\n value: key,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n CryptoManager_log.error('On addGUIListeners from if generateRSAKeyPair method postMessage error: ' + err);\n }\n });\n\n return;\n }\n });\n } //******************* ENCRYPTION METHODS *******************\n\n /**\r\n * Identifies the messages to be encrypted\r\n * @param {Message} message\r\n * @returns {boolean} returns true if the message requires encryption\r\n */\n\n }, {\n key: \"_isToEncrypt\",\n value: function _isToEncrypt(message) {\n var _this = this;\n\n CryptoManager_log.log('[CryptoManager._isToEncrypt]', message);\n var isCreate = message.type === 'create';\n var isFromHyperty = message.from.includes('hyperty://');\n var isToHyperty = message.to.includes('hyperty://');\n var isToDataObject = isDataObjectURL(message.to);\n\n var reporter = _this.registry.getDataObjectReporter(message.to);\n\n var doMutualAuthentication = message.hasOwnProperty('body') && message.body.hasOwnProperty('mutual') ? message.body.mutual : message.hasOwnProperty('body') && message.body.hasOwnProperty('value') && message.body.value.hasOwnProperty('mutual') ? message.body.value.mutual : true;\n if (!doMutualAuthentication) return false;\n\n if (reporter !== null && utils_isLegacy(reporter)) {\n return false;\n } //if is not to apply encryption, then returns resolve\n\n\n if (!this.isToUseEncryption && !(message.type === 'handshake')) {\n CryptoManager_log.info('not handshake: encryption disabled');\n return false;\n }\n\n if (message.type === 'update') {\n CryptoManager_log.info('update:encryption disabled');\n return false;\n }\n\n if (message.type === 'forward') {\n CryptoManager_log.info('forward:encryption disabled');\n return false;\n }\n\n if (utils_isLegacy(message.to)) return false;\n return isCreate && isFromHyperty && isToHyperty || isCreate && isFromHyperty && isToDataObject && doMutualAuthentication || message.type === 'handshake' || message.type === 'update' && doMutualAuthentication;\n }\n }, {\n key: \"_isToDecrypt\",\n value: function _isToDecrypt(message) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n // For sybscribe message let's start the mutualAuthentication\n var isSubscription = message.type === 'subscribe';\n\n var isFromRemoteSM = _this._isFromRemoteSM(message.from);\n\n var mutual = message.body.hasOwnProperty('value') && message.body.value.hasOwnProperty('mutual') ? message.body.value.mutual : message.body.hasOwnProperty('mutual') ? message.body.mutual : true; // let mutual = message.body.hasOwnProperty('mutual') ? message.body.mutual : false;\n\n if (isSubscription && isFromRemoteSM && mutual) {\n // if (isSubscription && isFromRemoteSM ) {\n CryptoManager_log.log('[CryptoManager._isToDecrypt] _doMutualAuthenticationPhase1');\n console.log('[CryptoManager._isToDecrypt] ', message);\n\n var reporter = _this.registry.getDataObjectReporter(message.to);\n\n if (reporter !== null && utils_isLegacy(reporter)) {\n return resolve(false);\n }\n\n _this._doMutualAuthenticationPhase1(message).then(function () {\n resolve(false);\n }, function (error) {\n reject(error);\n }); // } else if (message.hasOwnProperty('body') && message.body.hasOwnProperty('value') && typeof message.body.value === 'string') {\n\n } else if (message.hasOwnProperty('body') && message.body.hasOwnProperty('value') && typeof message.body.value === 'string' && mutual) {\n CryptoManager_log.log('[CryptoManager._isToDecrypt] true');\n resolve(true);\n } else {\n CryptoManager_log.log('[CryptoManager._isToDecrypt] false');\n resolve(false);\n }\n }).catch(function (error) {\n CryptoManager_log.error('[CryptoManager._isToDecrypt]', error);\n });\n }\n }, {\n key: \"encryptMessage\",\n value: function encryptMessage(message) {\n //log.info('encryptMessage:message', message);\n var _this = this;\n\n CryptoManager_log.log('encrypt message ');\n return new Promise(function (resolve, reject) {\n var isHandShakeType = message.type === 'handshake'; //if is not to apply encryption, then returns resolve\n\n if (!_this._isToEncrypt(message)) {\n // log.log('decryption disabled');\n return resolve(message);\n }\n\n var dataObjectURL = parseMessageURL(message.to);\n var isToDataObject = isDataObjectURL(dataObjectURL);\n var isToLegacyIdentity = utils_isLegacy(message.to);\n var isFromHyperty = divideURL(message.from).type === 'hyperty';\n var isToHyperty = divideURL(message.to).type === 'hyperty';\n\n if (message.type === 'update') {\n CryptoManager_log.log('encrypt message: message type update');\n return resolve(message);\n }\n\n if (isToLegacyIdentity) {\n resolve(message);\n } else if (isFromHyperty && isToHyperty) {\n var userURL = _this._registry.getHypertyOwner(message.from);\n\n if (userURL) {\n // check if exists any keys between two users\n var chatKeys = _this.chatKeys[message.from + '<->' + message.to];\n\n if (!chatKeys) {\n chatKeys = _this._newChatCrypto(message, userURL); //log.log('createChatKey encrypt', message.from + message.to);\n\n _this.chatKeys[message.from + '<->' + message.to] = chatKeys;\n message.body.handshakePhase = 'startHandShake';\n }\n\n if (chatKeys.authenticated && !isHandShakeType) {\n var iv = _this.crypto.generateIV();\n\n _this.crypto.encryptAES(chatKeys.keys.hypertyFromSessionKey, stringify(message.body.value), iv).then(function (encryptedValue) {\n var filteredMessage = _this._filterMessageToHash(message, stringify(message.body.value) + stringify(iv), chatKeys.hypertyFrom.messageInfo);\n\n _this.crypto.hashHMAC(chatKeys.keys.hypertyFromHashKey, filteredMessage).then(function (hash) {\n //log.log('result of hash ', hash);\n var value = {\n iv: encode(iv),\n value: encode(encryptedValue),\n hash: encode(hash)\n };\n message.body.value = encode(value);\n resolve(message);\n });\n }); // if is a handshake message, just resolve it\n\n } else if (isHandShakeType) {\n resolve(message); // else, starts a new handshake protocol\n } else {\n _this._doHandShakePhase(message, chatKeys).then(function (value) {\n _this.chatKeys[message.from + '<->' + message.to] = value.chatKeys;\n\n _this._messageBus.postMessage(value.message);\n\n reject('encrypt handshake protocol phase ');\n });\n }\n } else {\n reject('In encryptMessage: Hyperty owner URL was not found');\n } //if from hyperty to a dataObjectURL\n\n } else if (isFromHyperty && isToDataObject) {\n //log.log('dataObject value to encrypt: ', message.body.value);\n //log.log('IdentityModule - encrypt from hyperty to dataobject ', message);\n _this.storageManager.get('dataObjectSessionKeys').then(function (sessionKeys) {\n sessionKeys = chatkeysToArrayCloner(sessionKeys || {});\n var dataObjectKey = sessionKeys ? sessionKeys[dataObjectURL] : null;\n\n _this.dataObjectsStorage.getDataObject(dataObjectURL).then(function (isHypertyReporter) {\n //if no key exists, create a new one if is the reporter of dataObject\n if (!dataObjectKey) {\n // if the hyperty is the reporter of the dataObject then generates a session key\n if (isHypertyReporter.reporter && isHypertyReporter.reporter === message.from) {\n var sessionKey = _this.crypto.generateRandom();\n\n _this.dataObjectSessionKeys[dataObjectURL] = {\n sessionKey: sessionKey,\n isToEncrypt: true\n };\n var dataObjectSessionKeysClone = chatkeysToStringCloner(_this.dataObjectSessionKeys); //TODO: check if this does not need to be stored\n\n _this.storageManager.set('dataObjectSessionKeys', 0, dataObjectSessionKeysClone).catch(function (err) {\n reject('On encryptMessage from method storageManager.set error: ' + err);\n });\n\n dataObjectKey = _this.dataObjectSessionKeys[dataObjectURL];\n }\n } //check if there is already a session key for the chat room\n\n\n if (dataObjectKey) {\n // and if is to apply encryption, encrypt the messages\n if (dataObjectKey.isToEncrypt) {\n var _iv = _this.crypto.generateIV();\n\n var stringifiedIV = stringify(_iv);\n var stringifiedMessageBody = stringify(message.body.value);\n\n _this.crypto.encryptAES(dataObjectKey.sessionKey, stringifiedMessageBody, _iv).then(function (encryptedValue) {\n delete message.body.identity.assertion; //TODO: Check why assertion is comming on the message!\n\n delete message.body.identity.expires; //TODO: Check why expires is comming on the message!\n\n var filteredMessage = _this._filterMessageToHash(message, stringifiedMessageBody + stringifiedIV);\n\n _this.crypto.hashHMAC(dataObjectKey.sessionKey, filteredMessage).then(function (hash) {\n // log.log('hash ', hash);\n var newValue = {\n value: encode(encryptedValue),\n iv: encode(_iv),\n hash: encode(hash)\n };\n message.body.value = stringify(newValue);\n resolve(message);\n });\n }); // if not, just send the message\n\n } else {\n resolve(message);\n } // start the generation of a new session Key\n\n } else {\n reject('Data object key could not be defined: Failed to decrypt message ');\n }\n }).catch(function (err) {\n reject('On encryptMessage from method dataObjectsStorage.getDataObject error: ' + err);\n });\n }).catch(function (err) {\n reject('On encryptMessage from method storageManager.get error: ' + err);\n });\n }\n });\n }\n }, {\n key: \"encryptDataObject\",\n value: function encryptDataObject(dataObject, sender) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n CryptoManager_log.info('dataObject value to encrypt: ', dataObject);\n var dataObjectURL = parseMessageURL(sender);\n\n _this.storageManager.get('dataObjectSessionKeys').then(function (sessionKeys) {\n sessionKeys = chatkeysToArrayCloner(sessionKeys || {});\n var dataObjectKey = sessionKeys ? sessionKeys[dataObjectURL] : null; //check if there is already a session key for the chat room\n\n if (dataObjectKey) {\n // and if is to apply encryption, encrypt the messages\n if (dataObjectKey.isToEncrypt) {\n var iv = _this.crypto.generateIV();\n\n _this.crypto.encryptAES(dataObjectKey.sessionKey, stringify(dataObject), iv).then(function (encryptedValue) {\n var newValue = {\n value: encode(encryptedValue),\n iv: encode(iv)\n }; //log.log('encrypted dataObject', newValue);\n\n return resolve(newValue);\n }).catch(function (err) {\n reject('On encryptDataObject from method encryptAES error: ' + err);\n }); // if not, just send the message\n\n } else {\n CryptoManager_log.info('The dataObject is not encrypted');\n return resolve(dataObject);\n } // start the generation of a new session Key\n\n } else {\n return reject('No dataObjectKey for this dataObjectURL:', dataObjectURL);\n }\n }).catch(function (err) {\n reject('On encryptDataObject from method storageManager.get error: ' + err);\n });\n });\n }\n }, {\n key: \"decryptMessage\",\n value: function decryptMessage(message) {\n var _this = this; // log.log('decryptMessage:message', message);\n\n\n return new Promise(function (resolve, reject) {\n var isHandShakeType = message.type === 'handshake';\n\n _this._isToDecrypt(message).then(function (isToDecrypt) {\n //if is not to apply encryption, then returns resolve\n if (!isToDecrypt) return resolve(message);\n var dataObjectURL = parseMessageURL(message.to);\n var isToDataObject = isDataObjectURL(dataObjectURL);\n var isFromHyperty = divideURL(message.from).type === 'hyperty';\n var isToHyperty = divideURL(message.to).type === 'hyperty';\n\n if (message.type === 'update') {\n return resolve(message);\n } //is is hyperty to hyperty communication\n\n\n if (isFromHyperty && isToHyperty) {\n // log.log('decrypt hyperty to hyperty');\n var userURL = _this._registry.getHypertyOwner(message.to);\n\n if (userURL) {\n var chatKeys = _this.chatKeys[message.to + '<->' + message.from];\n\n if (!chatKeys) {\n chatKeys = _this._newChatCrypto(message, userURL, 'decrypt');\n _this.chatKeys[message.to + '<->' + message.from] = chatKeys;\n }\n\n if (chatKeys.authenticated && !isHandShakeType) {\n var value = decode(message.body.value);\n var iv = decodeToUint8Array(value.iv);\n var data = decodeToUint8Array(value.value);\n var hash = decodeToUint8Array(value.hash);\n\n _this.crypto.decryptAES(chatKeys.keys.hypertyToSessionKey, data, iv).then(function (decryptedData) {\n // log.log('decrypted value ', decryptedData);\n message.body.value = decryptedData;\n\n var filteredMessage = _this._filterMessageToHash(message, decryptedData + iv);\n\n _this.crypto.verifyHMAC(chatKeys.keys.hypertyToHashKey, filteredMessage, hash).then(function (result) {\n //log.log('result of hash verification! ', result);\n message.body.assertedIdentity = true;\n resolve(message);\n });\n });\n } else if (isHandShakeType) {\n _this._doHandShakePhase(message, chatKeys).then(function (value) {\n //if it was started by doMutualAuthentication then ends the protocol\n if (value === 'handShakeEnd') {//reject('decrypt handshake protocol phase');\n // if was started by a message, then resend that message\n } else {\n _this.chatKeys[message.to + '<->' + message.from] = value.chatKeys;\n\n _this._messageBus.postMessage(value.message); //reject('decrypt handshake protocol phase ');\n\n }\n });\n } else {\n reject('wrong message do decrypt');\n }\n } else {\n reject('error on decrypt message');\n } //if from hyperty to a dataObjectURL\n\n } else if (isFromHyperty && isToDataObject) {\n // log.log('dataObject value to decrypt: ', message.body);\n _this.storageManager.get('dataObjectSessionKeys').then(function (sessionKeys) {\n sessionKeys = chatkeysToArrayCloner(sessionKeys || {});\n var dataObjectKey = sessionKeys ? sessionKeys[dataObjectURL] : null;\n\n if (dataObjectKey) {\n //check if is to apply encryption\n if (dataObjectKey.isToEncrypt) {\n var parsedValue = parse(message.body.value);\n\n var _iv2 = decodeToUint8Array(parsedValue.iv);\n\n var encryptedValue = decodeToUint8Array(parsedValue.value);\n\n var _hash = decodeToUint8Array(parsedValue.hash);\n\n _this.crypto.decryptAES(dataObjectKey.sessionKey, encryptedValue, _iv2).then(function (decryptedValue) {\n var parsedValue = parse(decryptedValue); // log.log('decrypted Value,', parsedValue);\n\n message.body.value = parsedValue;\n\n var filteredMessage = _this._filterMessageToHash(message, stringify(parsedValue) + stringify(_iv2));\n\n _this.crypto.verifyHMAC(dataObjectKey.sessionKey, filteredMessage, _hash).then(function (result) {\n CryptoManager_log.log('Received message HMAC result', result);\n message.body.assertedIdentity = true;\n resolve(message);\n }).catch(function (err) {\n reject('Message HMAC is invalid: ' + err);\n });\n }); //if not, just return the message\n\n } else {\n message.body.assertedIdentity = true;\n resolve(message);\n }\n } else {\n message.body.assertedIdentity = true;\n resolve(message); //reject('no sessionKey for chat room found');\n }\n });\n } else {\n reject('wrong message to decrypt');\n }\n });\n });\n }\n }, {\n key: \"decryptDataObject\",\n value: function decryptDataObject(dataObject, sender) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //if is not to apply encryption, then returns resolve\n if (!_this.isToUseEncryption) {\n // log.log('decryption disabled');\n return resolve(dataObject);\n }\n\n var dataObjectURL = parseMessageURL(sender); // log.log('dataObject value to decrypt: ', dataObject);\n\n _this.storageManager.get('dataObjectSessionKeys').then(function (sessionKeys) {\n sessionKeys = chatkeysToArrayCloner(sessionKeys);\n var dataObjectKey = sessionKeys ? sessionKeys[dataObjectURL] : null;\n\n if (dataObjectKey) {\n //check if is to apply encryption\n if (dataObjectKey.isToEncrypt) {\n var iv = decodeToUint8Array(dataObject.iv);\n var encryptedValue = decodeToUint8Array(dataObject.value);\n\n _this.crypto.decryptAES(dataObjectKey.sessionKey, encryptedValue, iv).then(function (decryptedValue) {\n var parsedValue = parse(decryptedValue);\n var newValue = {\n value: parsedValue,\n iv: encode(iv)\n }; // log.log('decrypted dataObject,', newValue);\n\n return resolve(newValue);\n }).catch(function (err) {\n reject('On decryptDataObject from method encryptAES error: ' + err);\n }); //if not, just return the dataObject\n\n } else {\n // log.log('The dataObject is not encrypted');\n return resolve(dataObject);\n }\n } else {\n return reject('No dataObjectKey for this dataObjectURL:', dataObjectURL);\n }\n });\n });\n }\n }, {\n key: \"_doMutualAuthenticationPhase1\",\n value: function _doMutualAuthenticationPhase1(message) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var to = message.to.split('/'); //let subsIndex = to.indexOf('subscription');\n //let isDataObjectSubscription = subsIndex !== -1;\n\n to.pop();\n var dataObjectURL = to[0] + '//' + to[2] + '/' + to[3];\n\n _this._doMutualAuthenticationPhase2(dataObjectURL, message.body.subscriber).then(function () {\n _this._registry.registerSubscriber(dataObjectURL, message.body.subscriber);\n\n resolve();\n }, function (error) {\n reject(error);\n });\n });\n }\n }, {\n key: \"_doMutualAuthenticationPhase2\",\n value: function _doMutualAuthenticationPhase2(sender, receiver) {\n CryptoManager_log.info('doMutualAuthentication:sender ', sender);\n CryptoManager_log.info('doMutualAuthentication:receiver ', receiver);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var dataObjectURL; // check if the sender is a dataObject and if so stores that value\n\n var reporterURL = _this._registry.getReporterURLSynchonous(sender);\n\n if (reporterURL) {\n dataObjectURL = sender;\n sender = reporterURL;\n }\n\n var msg = {\n to: receiver,\n from: sender,\n callback: undefined,\n body: {\n handshakePhase: 'startHandShake',\n ignore: 'ignoreMessage'\n }\n };\n\n if (!sender || !receiver) {\n return reject('sender or receiver missing on doMutualAuthentication');\n }\n\n var chatKeys = _this.chatKeys[sender + '<->' + receiver];\n\n var userURL = _this._registry.getHypertyOwner(sender);\n\n if (userURL) {\n if (!chatKeys) {\n // callback to resolve when finish the mutual authentication\n var resolved = function resolved(value) {\n // log.log('callback value:', value);\n resolve(value);\n };\n\n msg.callback = resolved;\n msg.dataObjectURL = dataObjectURL;\n chatKeys = _this._newChatCrypto(msg, userURL);\n _this.chatKeys[sender + '<->' + receiver] = chatKeys;\n }\n\n if (chatKeys.authenticated) {\n var startSessionKeyExchange = {\n to: sender,\n from: receiver\n };\n chatKeys.dataObjectURL = dataObjectURL;\n\n _this._sendReporterSessionKey(startSessionKeyExchange, chatKeys).then(function (value) {\n _this._messageBus.postMessage(value.message);\n\n resolve('exchange of chat sessionKey initiated');\n }).catch(function (err) {\n reject('On doMutualAuthentication from method _sendReporterSessionKey error: ' + err);\n });\n } else {\n _this._doHandShakePhase(msg, chatKeys);\n }\n } else {\n reject('Mutual authentication error: Hyperty owner could not be resolved');\n }\n });\n }\n /**\r\n * returns the reporter associated to the dataObject URL\r\n * @param {String} dataObjectURL dataObject url\r\n * @return {String} reporter dataObject url reporter\r\n */\n\n /* _getHypertyFromDataObject(dataObjectURL) {\r\n log.info('_getHypertyFromDataObject:dataObjectURL', dataObjectURL);\r\n let _this = this;\r\n return new Promise(function(resolve, reject) {\r\n let splitedURL = divideURL(dataObjectURL);\r\n let domain = splitedURL.domain;\r\n let finalURL = _this._parseMessageURL(dataObjectURL);\r\n // check if is the creator of the hyperty\r\n let reporterURL = _this.registry.getReporterURLSynchonous(finalURL);\r\n log.info('_getHypertyFromDataObject:reporterURL', reporterURL);\r\n if (reporterURL) {\r\n resolve(reporterURL);\r\n } else {\r\n // check if there is already an association from an hypertyURL to the dataObject\r\n let storedReporterURL = _this.dataObjectsIdentity[finalURL];\r\n log.info('_getHypertyFromDataObject:storedReporterURL', storedReporterURL);\r\n if (storedReporterURL) {\r\n resolve(storedReporterURL);\r\n } else {\r\n // check if there is any hyperty that subscribed the dataObjectURL\r\n let subscriberHyperty = _this.registry.getDataObjectSubscriberHyperty(dataObjectURL);\r\n log.info('_getHypertyFromDataObject:subscriberHyperty', subscriberHyperty);\r\n if (subscriberHyperty) {\r\n resolve(subscriberHyperty);\r\n } else {\r\n // search in domain registry for the hyperty associated to the dataObject\r\n // search in case is a subscriber who wants to know the reporter\r\n _this._coreDiscovery.discoverDataObjectPerURL(finalURL, domain).then(dataObject => {\r\n log.info('_getHypertyFromDataObject:dataObject', dataObject);\r\n _this.dataObjectsIdentity[finalURL] = dataObject.reporter;\r\n log.info('_getHypertyFromDataObject:dataObject.reporter', dataObject.reporter);\r\n resolve(dataObject.reporter);\r\n }, err => {\r\n reject(err);\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }*/\n\n }, {\n key: \"_sendReporterSessionKey\",\n value: function _sendReporterSessionKey(message, chatKeys) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var sessionKeyBundle = _this.dataObjectSessionKeys[chatKeys.dataObjectURL];\n var reporterSessionKeyMsg;\n var valueToEncrypt;\n var sessionKey;\n var iv;\n var value = {}; //if there is not yet a session Key, generates a new one\n\n if (!sessionKeyBundle) {\n sessionKey = _this.crypto.generateRandom();\n _this.dataObjectSessionKeys[chatKeys.dataObjectURL] = {\n sessionKey: sessionKey,\n isToEncrypt: true\n };\n var dataObjectSessionKeysClone = chatkeysToStringCloner(_this.dataObjectSessionKeys);\n\n _this.storageManager.set('dataObjectSessionKeys', 0, dataObjectSessionKeysClone).catch(function (err) {\n reject('On _sendReporterSessionKey from method storageManager.set(dataObjectSessionKeys...) error: ' + err);\n });\n } else {\n sessionKey = sessionKeyBundle.sessionKey;\n }\n\n try {\n valueToEncrypt = encode({\n value: encode(sessionKey),\n dataObjectURL: chatKeys.dataObjectURL\n });\n } catch (err) {\n return reject('On _sendReporterSessionKey from method storageManager.set error valueToEncrypt: ' + err);\n }\n\n iv = _this.crypto.generateIV();\n value.iv = encode(iv);\n\n _this.crypto.encryptAES(chatKeys.keys.hypertyFromSessionKey, valueToEncrypt, iv).then(function (encryptedValue) {\n reporterSessionKeyMsg = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'reporterSessionKey',\n value: encode(encryptedValue)\n }\n };\n\n var filteredMessage = _this._filterMessageToHash(reporterSessionKeyMsg, valueToEncrypt + iv, chatKeys.hypertyFrom.messageInfo);\n\n return _this.crypto.hashHMAC(chatKeys.keys.hypertyFromHashKey, filteredMessage);\n }).then(function (hashedMessage) {\n var valueWithHash = encode({\n value: reporterSessionKeyMsg.body.value,\n hash: encode(hashedMessage),\n iv: value.iv\n });\n reporterSessionKeyMsg.body.value = valueWithHash;\n resolve({\n message: reporterSessionKeyMsg,\n chatKeys: chatKeys\n });\n }).catch(function (err) {\n reject('On _sendReporterSessionKey from chained promises encryptAES error: ' + err);\n });\n });\n }\n /**\r\n * Function that resolve and create the domainURL in case it is provided one. If not, resolve the default domainURL\r\n * @param {String} idpDomain idpDomain (Optional)\r\n */\n\n }, {\n key: \"_resolveDomain\",\n value: function _resolveDomain(idpDomain) {\n if (!idpDomain) {\n return 'domain-idp://google.com';\n } else {\n return 'domain-idp://' + idpDomain;\n }\n }\n }, {\n key: \"_doHandShakePhase\",\n value: function _doHandShakePhase(message, chatKeys) {\n // log('_doHandShakePhase:dataObject', message);\n //\tlog('_doHandShakePhase:chatKeys', chatKeys);\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var handshakeType = message.body.handshakePhase;\n var iv;\n var hash;\n var value = {};\n var filteredMessage;\n var privateKeyHolder;\n CryptoManager_log.info('handshake phase: ', handshakeType);\n\n switch (handshakeType) {\n case 'startHandShake':\n {\n chatKeys.keys.fromRandom = _this.crypto.generateRandom();\n var startHandShakeMsg = {\n type: 'handshake',\n to: message.to,\n from: message.from,\n body: {\n handshakePhase: 'senderHello',\n value: encode(chatKeys.keys.fromRandom)\n }\n };\n chatKeys.handshakeHistory.senderHello = _this._filterMessageToHash(startHandShakeMsg, undefined, chatKeys.hypertyFrom.messageInfo); // check if was the encrypt function or the mutual authentication that request the\n // start of the handShakePhase.\n\n if (chatKeys.initialMessage) {\n resolve({\n message: startHandShakeMsg,\n chatKeys: chatKeys\n });\n } else {\n _this.chatKeys[message.from + '<->' + message.to] = chatKeys;\n\n _this._messageBus.postMessage(startHandShakeMsg);\n }\n\n break;\n }\n\n case 'senderHello':\n {\n CryptoManager_log.log('senderHello');\n chatKeys.handshakeHistory.senderHello = _this._filterMessageToHash(message);\n chatKeys.keys.fromRandom = decodeToUint8Array(message.body.value);\n chatKeys.keys.toRandom = _this.crypto.generateRandom();\n var senderHelloMsg = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'receiverHello',\n value: encode(chatKeys.keys.toRandom)\n }\n };\n chatKeys.handshakeHistory.receiverHello = _this._filterMessageToHash(senderHelloMsg, undefined, chatKeys.hypertyFrom.messageInfo);\n resolve({\n message: senderHelloMsg,\n chatKeys: chatKeys\n });\n break;\n }\n\n case 'receiverHello':\n {\n CryptoManager_log.log('receiverHello');\n\n _this.getMyPrivateKey().then(function (privateKey) {\n privateKeyHolder = privateKey;\n chatKeys.handshakeHistory.receiverHello = _this._filterMessageToHash(message);\n return _this._idm.validateAssertion(message.body.identity.assertion, undefined, message.body.identity.idp.domain);\n }).then(function (value) {\n //TODO remove later this verification as soon as all the IdP proxy are updated in the example\n var encodedpublicKey = typeof value.contents === 'string' ? value.contents : value.contents.nonce;\n var receiverPublicKey = parseToUint8Array(encodedpublicKey);\n\n var premasterSecret = _this.crypto.generatePMS();\n\n var toRandom = message.body.value;\n chatKeys.hypertyTo.assertion = message.body.identity.assertion;\n chatKeys.hypertyTo.publicKey = receiverPublicKey;\n chatKeys.hypertyTo.userID = message.body.identity.userProfile.userURL;\n chatKeys.keys.toRandom = decodeToUint8Array(toRandom);\n chatKeys.keys.premasterKey = premasterSecret;\n\n var concatKey = _this.crypto.concatPMSwithRandoms(premasterSecret, chatKeys.keys.toRandom, chatKeys.keys.fromRandom);\n\n return _this.crypto.generateMasterSecret(concatKey, 'messageHistoric' + chatKeys.keys.toRandom + chatKeys.keys.fromRandom); //generate the master key\n }).then(function (masterKey) {\n chatKeys.keys.masterKey = masterKey;\n return _this.crypto.generateKeys(masterKey, 'key expansion' + chatKeys.keys.toRandom + chatKeys.keys.fromRandom); //generate the symmetric and hash keys\n }).then(function (keys) {\n chatKeys.keys.hypertyToSessionKey = new Uint8Array(keys[0]);\n chatKeys.keys.hypertyFromSessionKey = new Uint8Array(keys[1]);\n chatKeys.keys.hypertyToHashKey = new Uint8Array(keys[2]);\n chatKeys.keys.hypertyFromHashKey = new Uint8Array(keys[3]);\n iv = _this.crypto.generateIV();\n value.iv = encode(iv);\n var messageStructure = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'senderCertificate'\n }\n }; // hash the value and the iv\n\n filteredMessage = _this._filterMessageToHash(messageStructure, 'ok' + iv, chatKeys.hypertyFrom.messageInfo);\n return _this.crypto.hashHMAC(chatKeys.keys.hypertyFromHashKey, filteredMessage);\n }).then(function (hash) {\n value.hash = encode(hash); //encrypt the data\n\n return _this.crypto.encryptAES(chatKeys.keys.hypertyFromSessionKey, 'ok', iv);\n }).then(function (encryptedData) {\n value.symetricEncryption = encode(encryptedData);\n return _this.crypto.encryptRSA(chatKeys.hypertyTo.publicKey, chatKeys.keys.premasterKey);\n }).then(function (encryptedValue) {\n value.assymetricEncryption = encode(encryptedValue);\n var messageStructure = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'senderCertificate'\n }\n };\n\n var messageToHash = _this._filterMessageToHash(messageStructure, chatKeys.keys.premasterKey, chatKeys.hypertyFrom.messageInfo);\n\n return _this.crypto.signRSA(privateKeyHolder, encode(chatKeys.handshakeHistory) + encode(messageToHash));\n }).then(function (signature) {\n value.signature = encode(signature);\n var receiverHelloMsg = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'senderCertificate',\n value: encode(value)\n }\n };\n chatKeys.handshakeHistory.senderCertificate = _this._filterMessageToHash(receiverHelloMsg, 'ok' + iv, chatKeys.hypertyFrom.messageInfo);\n resolve({\n message: receiverHelloMsg,\n chatKeys: chatKeys\n });\n }, function (error) {\n return reject(error);\n });\n\n break;\n }\n\n case 'senderCertificate':\n {\n CryptoManager_log.log('senderCertificate');\n var receivedValue = decode(message.body.value);\n\n _this.getMyPrivateKey().then(function (privateKey) {\n privateKeyHolder = privateKey;\n return _this._idm.validateAssertion(message.body.identity.assertion, undefined, message.body.identity.idp.domain);\n }).then(function (value) {\n var encryptedPMS = decodeToUint8Array(receivedValue.assymetricEncryption); //TODO remove later this verification as soon as all the IdP proxy are updated in the example\n\n var encodedpublicKey = typeof value.contents === 'string' ? value.contents : value.contents.nonce;\n var senderPublicKey = parseToUint8Array(encodedpublicKey);\n chatKeys.hypertyTo.assertion = message.body.identity.assertion;\n chatKeys.hypertyTo.publicKey = senderPublicKey;\n chatKeys.hypertyTo.userID = message.body.identity.userProfile.userURL;\n return _this.crypto.decryptRSA(privateKeyHolder, encryptedPMS);\n }, function (error) {\n // log.log(error);\n reject('Error during authentication of identity: ', error.message); //obtain the PremasterKey using the private key\n }).then(function (pms) {\n chatKeys.keys.premasterKey = new Uint8Array(pms);\n var signature = decodeToUint8Array(receivedValue.signature);\n\n var receivedmsgToHash = _this._filterMessageToHash(message, chatKeys.keys.premasterKey);\n\n return _this.crypto.verifyRSA(chatKeys.hypertyTo.publicKey, encode(chatKeys.handshakeHistory) + encode(receivedmsgToHash), signature); // validates the signature received\n }).then(function (signValidationResult) {\n //log.log('SenderCertificate - signature validation result ', signValidationResult);\n var concatKey = _this.crypto.concatPMSwithRandoms(chatKeys.keys.premasterKey, chatKeys.keys.toRandom, chatKeys.keys.fromRandom);\n\n return _this.crypto.generateMasterSecret(concatKey, 'messageHistoric' + chatKeys.keys.toRandom + chatKeys.keys.fromRandom); // generates the master keys from the Premaster key and the randoms\n }).then(function (masterKey) {\n chatKeys.keys.masterKey = masterKey;\n return _this.crypto.generateKeys(masterKey, 'key expansion' + chatKeys.keys.toRandom + chatKeys.keys.fromRandom); // generates the symmetric keys to be used in the symmetric encryption\n }).then(function (keys) {\n chatKeys.keys.hypertyFromSessionKey = new Uint8Array(keys[0]);\n chatKeys.keys.hypertyToSessionKey = new Uint8Array(keys[1]);\n chatKeys.keys.hypertyFromHashKey = new Uint8Array(keys[2]);\n chatKeys.keys.hypertyToHashKey = new Uint8Array(keys[3]);\n iv = decodeToUint8Array(receivedValue.iv);\n var data = decodeToUint8Array(receivedValue.symetricEncryption);\n return _this.crypto.decryptAES(chatKeys.keys.hypertyToSessionKey, data, iv);\n }).then(function (decryptedData) {\n // log.log('decryptedData', decryptedData);\n chatKeys.handshakeHistory.senderCertificate = _this._filterMessageToHash(message, decryptedData + iv);\n var hashReceived = decodeToUint8Array(receivedValue.hash);\n filteredMessage = _this._filterMessageToHash(message, decryptedData + iv);\n return _this.crypto.verifyHMAC(chatKeys.keys.hypertyToHashKey, filteredMessage, hashReceived);\n }).then(function (verifiedHash) {\n // log.log('result of hash verification ', verifiedHash);\n var receiverFinishedMessage = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'receiverFinishedMessage'\n }\n };\n iv = _this.crypto.generateIV();\n value.iv = encode(iv);\n filteredMessage = _this._filterMessageToHash(receiverFinishedMessage, 'ok!' + iv, chatKeys.hypertyFrom.messageInfo); //log.log('TIAGO: doHandShakePhase verifiedHash');\n\n return _this.crypto.hashHMAC(chatKeys.keys.hypertyFromHashKey, filteredMessage);\n }).then(function (hash) {\n value.hash = encode(hash);\n return _this.crypto.encryptAES(chatKeys.keys.hypertyFromSessionKey, 'ok!', iv);\n }).then(function (encryptedValue) {\n value.value = encode(encryptedValue);\n var receiverFinishedMessage = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'receiverFinishedMessage',\n value: encode(value)\n }\n };\n chatKeys.handshakeHistory.receiverFinishedMessage = _this._filterMessageToHash(receiverFinishedMessage, 'ok!' + iv, chatKeys.hypertyFrom.messageInfo);\n chatKeys.authenticated = true;\n resolve({\n message: receiverFinishedMessage,\n chatKeys: chatKeys\n });\n }).catch(function (err) {\n reject('On _doHandShakePhase from senderCertificate error: ' + err);\n });\n\n break;\n }\n\n case 'receiverFinishedMessage':\n {\n chatKeys.authenticated = true;\n value = decode(message.body.value);\n iv = decodeToUint8Array(value.iv);\n var data = decodeToUint8Array(value.value);\n hash = decodeToUint8Array(value.hash);\n\n _this.crypto.decryptAES(chatKeys.keys.hypertyToSessionKey, data, iv).then(function (decryptedData) {\n // log.log('decryptedData', decryptedData);\n chatKeys.handshakeHistory.receiverFinishedMessage = _this._filterMessageToHash(message, decryptedData + iv);\n\n var filteredMessage = _this._filterMessageToHash(message, decryptedData + iv);\n\n _this.crypto.verifyHMAC(chatKeys.keys.hypertyToHashKey, filteredMessage, hash).then(function (result) {\n // check if there was an initial message that was blocked and send it\n if (chatKeys.initialMessage) {\n var initialMessage = {\n type: 'create',\n to: message.from,\n from: message.to,\n body: {\n value: chatKeys.initialMessage.body.value\n }\n };\n resolve({\n message: initialMessage,\n chatKeys: chatKeys\n }); //sends the sessionKey to the subscriber hyperty\n } else {\n _this._sendReporterSessionKey(message, chatKeys).then(function (value) {\n resolve(value);\n }).catch(function (err) {\n reject('On _doHandShakePhase from receiverFinishedMessage error: ' + err);\n });\n }\n });\n });\n\n break;\n }\n\n case 'reporterSessionKey':\n {\n CryptoManager_log.log('reporterSessionKey');\n var valueIVandHash = decode(message.body.value);\n hash = decodeToUint8Array(valueIVandHash.hash);\n iv = decodeToUint8Array(valueIVandHash.iv);\n var encryptedValue = decodeToUint8Array(valueIVandHash.value);\n var parsedValue;\n var sessionKey;\n var dataObjectURL;\n var receiverAcknowledgeMsg; //log.log('[IdentityModule reporterSessionKey] - decryptAES: ', chatKeys.keys.hypertyToSessionKey, encryptedValue, iv);\n\n _this.crypto.decryptAES(chatKeys.keys.hypertyToSessionKey, encryptedValue, iv).then(function (decryptedValue) {\n parsedValue = decode(decryptedValue);\n sessionKey = decodeToUint8Array(parsedValue.value);\n dataObjectURL = parsedValue.dataObjectURL;\n\n var messageToHash = _this._filterMessageToHash(message, decryptedValue + iv);\n\n return _this.crypto.verifyHMAC(chatKeys.keys.hypertyToHashKey, messageToHash, hash);\n }).then(function (hashResult) {\n // log.log('hash successfully validated ', hashResult);\n _this.dataObjectSessionKeys[dataObjectURL] = {\n sessionKey: sessionKey,\n isToEncrypt: true\n };\n var dataObjectSessionKeysClone = chatkeysToStringCloner(_this.dataObjectSessionKeys);\n\n _this.storageManager.set('dataObjectSessionKeys', 0, dataObjectSessionKeysClone).catch(function (err) {\n reject('On _sendReporterSessionKey from method reporterSessionKey error: ' + err);\n });\n\n iv = _this.crypto.generateIV();\n value.iv = encode(iv);\n return _this.crypto.encryptAES(chatKeys.keys.hypertyFromSessionKey, 'ok!!', iv);\n }).then(function (encryptedValue) {\n receiverAcknowledgeMsg = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'receiverAcknowledge'\n }\n };\n value.value = encode(encryptedValue);\n\n var messageToHash = _this._filterMessageToHash(receiverAcknowledgeMsg, 'ok!!' + iv, chatKeys.hypertyFrom.messageInfo);\n\n return _this.crypto.hashHMAC(chatKeys.keys.hypertyFromHashKey, messageToHash);\n }).then(function (hashedMessage) {\n var finalValue = encode({\n value: value.value,\n hash: encode(hashedMessage),\n iv: value.iv\n });\n receiverAcknowledgeMsg.body.value = finalValue;\n resolve({\n message: receiverAcknowledgeMsg,\n chatKeys: chatKeys\n });\n }).catch(function (err) {\n reject('On _doHandShakePhase from reporterSessionKey error: ' + err);\n });\n\n break;\n }\n\n case 'receiverAcknowledge':\n {\n CryptoManager_log.log('receiverAcknowledge');\n var receivedvalueIVandHash = decode(message.body.value);\n var receivedHash = decodeToUint8Array(receivedvalueIVandHash.hash);\n iv = decodeToUint8Array(receivedvalueIVandHash.iv);\n var receivedEncryptedValue = decodeToUint8Array(receivedvalueIVandHash.value);\n\n _this.crypto.decryptAES(chatKeys.keys.hypertyToSessionKey, receivedEncryptedValue, iv).then(function (decryptedValue) {\n var filteredMessage = _this._filterMessageToHash(message, decryptedValue + iv);\n\n return _this.crypto.verifyHMAC(chatKeys.keys.hypertyToHashKey, filteredMessage, receivedHash);\n }).then(function (hashResult) {\n // log.log('hashResult ', hashResult);\n var callback = chatKeys.callback;\n\n if (callback) {\n callback('handShakeEnd');\n }\n\n resolve('handShakeEnd');\n }).catch(function (err) {\n reject('On _doHandShakePhase from receiverAcknowledge error: ' + err);\n });\n\n break;\n }\n\n default:\n reject(message);\n }\n });\n }\n /**\r\n * filter the messages to hash, by removing some fields not generated by the runtime core\r\n * @param {Message} message message\r\n * @param {String} decryptedValue (Optional) value from body.value in case it originally comes encrypted\r\n * @param {JSON} identity(Optional) add the hyperty identity associated in case is not added to the initial message\r\n * @return {Message} new message filtered\r\n */\n\n }, {\n key: \"_filterMessageToHash\",\n value: function _filterMessageToHash(message, decryptedValue, identity) {\n return {\n type: message.type,\n from: message.from,\n to: message.to,\n body: {\n identity: identity || message.body.identity,\n value: decryptedValue || message.body.value,\n handshakePhase: message.body.handshakePhase\n }\n };\n }\n /**\r\n * generates the initial structure for the keys between two users\r\n * @param {JSON} message initial message that triggers the mutual authentication\r\n * @param {String} userURL userURL\r\n * @param {boolean} receiver(Optional) indicates if is the sender or the receiver that creates a new chat crypto\r\n * @return {JSON} newChatCrypto new JSON structure for the chat crypto\r\n */\n\n }, {\n key: \"_newChatCrypto\",\n value: function _newChatCrypto(message, userURL, receiver) {\n var _this = this; //check whether is the sender or the receiver to create a new chatCrypto\n //to mantain consistency on the keys if the receiver create a new chatCrypto,\n //then invert the fields\n\n\n var from = receiver ? message.to : message.from;\n var to = receiver ? message.from : message.to;\n\n var userInfo = _this._idm.getIdentity(userURL);\n\n var newChatCrypto = {\n hypertyFrom: {\n hyperty: from,\n userID: userInfo.userProfile.userURL,\n //privateKey: \"getMyPublicKey\",\n //publicKey: \"getMyPrivateKey\",\n assertion: userInfo.assertion,\n messageInfo: userInfo\n },\n hypertyTo: {\n hyperty: to,\n userID: undefined,\n publicKey: undefined,\n assertion: undefined\n },\n keys: {\n hypertyToSessionKey: undefined,\n hypertyFromSessionKey: undefined,\n hypertyToHashKey: undefined,\n hypertyFromHashKey: undefined,\n toRandom: undefined,\n fromRandom: undefined,\n premasterKey: undefined,\n masterKey: undefined\n },\n handshakeHistory: {\n senderHello: undefined,\n receiverHello: undefined,\n senderCertificate: undefined,\n receiverFinishedMessage: undefined\n },\n initialMessage: message.body.ignore ? undefined : message,\n callback: message.callback,\n authenticated: false,\n dataObjectURL: message.dataObjectURL\n };\n return newChatCrypto;\n }\n /**\r\n * Retrieves a public keys given a user refrence. If no key is found,\r\n generates a new key asymmetric key and retrieves the public keys.\r\n * @param {userRef} String user reference for the key pair\r\n * @return {Array} public key\r\n */\n\n }, {\n key: \"getMyPublicKey\",\n value: function getMyPublicKey() {\n var userRef = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.userDefaultKeyRef;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.storageManager.get(userRef).then(function (storedKeyPair) {\n if (storedKeyPair) {\n return resolve(storedKeyPair.public);\n }\n\n _this._generateAndStoreNewAsymetricKey(userRef).then(function (generatedKeyPair) {\n resolve(generatedKeyPair.public);\n }).catch(function (err) {\n CryptoManager_log.error('[getMyPublicKey:_generateAndStoreNewAsymetricKey:err]: ' + err.message);\n reject(err);\n });\n }).catch(function (err) {\n CryptoManager_log.error('[getMyPublicKey:storageManager:err]: ' + err.message);\n reject(err);\n });\n });\n }\n /**\r\n * Retrieves a private keys given a user refrence. If no key is found,\r\n generates a new key asymmetric key and retrieves the private key.\r\n * @param {userRef} String user reference for the key pair\r\n * @return {Array} private key\r\n **/\n\n }, {\n key: \"getMyPrivateKey\",\n value: function getMyPrivateKey() {\n var userRef = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.userDefaultKeyRef;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.storageManager.get(userRef).then(function (storedKeyPair) {\n if (storedKeyPair) {\n return resolve(storedKeyPair.private);\n }\n\n _this._generateAndStoreNewAsymetricKey(userRef).then(function (generatedKeyPair) {\n resolve(generatedKeyPair.private);\n }).catch(function (err) {\n CryptoManager_log.error('[getMyPrivateKey:_generateAndStoreNewAsymetricKey:err]: ' + err.message);\n reject(err);\n });\n }).catch(function (err) {\n CryptoManager_log.error('[getMyPrivateKey:storageManager:err]: ' + err.message);\n reject(err);\n });\n });\n }\n /**\r\n * Generates a new key pair, stores and retrives the key pair.\r\n * @param {userRef} String user reference for the key pair\r\n * @return {Array} private key\r\n **/\n\n }, {\n key: \"_generateAndStoreNewAsymetricKey\",\n value: function _generateAndStoreNewAsymetricKey(userRef) {\n var _this = this;\n\n var keyPair = undefined;\n return new Promise(function (resolve, reject) {\n // _this.crypto.generateRSAKeyPair().then(generatedKeyPair => {\n var generatedKeyPair = {};\n generatedKeyPair.private = generateGUID();\n generatedKeyPair.public = generateGUID();\n CryptoManager_log.log('_generateAndStoreNewAsymetricKey:userAsymmetricKeyGenerated', generatedKeyPair);\n keyPair = generatedKeyPair;\n\n _this.storageManager.set(userRef, 0, generatedKeyPair); // }).then(storedReference => {\n // log.log('_generateAndStoreNewAsymetricKey:userAsymmetricKeySuccess', storedReference);\n\n\n resolve(keyPair);\n }).catch(function (err) {\n CryptoManager_log.error('[_generateAndStoreNewAsymetricKey:err]: ' + err.message);\n reject(err);\n }); // });\n }\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this._messageBus;\n }\n /**\r\n * Set the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this._messageBus = messageBus;\n\n _this.addCryptoGUIListeners();\n }\n /**\r\n * return the coreDiscovery component\r\n */\n\n }, {\n key: \"coreDiscovery\",\n get: function get() {\n var _this = this;\n\n return _this._coreDiscovery;\n }\n /**\r\n * return user's public key\r\n */\n\n /* getMyPublicKey() {\r\n // to be implemented\r\n return new Promise((resolve)=> {\r\n resolve('mypublickey');\r\n });\r\n }\r\n */\n\n /**\r\n * Set the coreDiscovery component\r\n * @param {coreDiscovery} coreDiscovery\r\n */\n ,\n set: function set(coreDiscovery) {\n var _this = this;\n\n _this._coreDiscovery = coreDiscovery;\n }\n /**\r\n * return the registry in this idModule\r\n * @param {registry} registry\r\n */\n\n }, {\n key: \"registry\",\n get: function get() {\n var _this = this;\n\n return _this._registry;\n }\n /**\r\n * Set the registry in this idModule\r\n * @param {registry} reg\r\n */\n ,\n set: function set(registry) {\n var _this = this;\n\n _this._registry = registry;\n }\n }]);\n\n return CryptoManager;\n}();\n/*\r\nconst nodeJSKeyPairPopulate = { public: [48, 130, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0, 228, 43, 101, 12, 121, 7, 157, 71, 81, 58, 219, 32, 10, 108, 193, 179, 212, 116, 255, 59, 217, 32, 161, 201, 53, 171, 226, 199, 137, 202, 171, 60, 82, 53, 125, 62, 177, 126, 165, 24, 141, 30, 15, 226, 59, 107, 34, 7, 13, 149, 112, 125, 10, 230, 191, 156, 164, 177, 10, 185, 13, 66, 3, 217, 166, 244, 90, 119, 111, 27, 145, 104, 71, 189, 166, 226, 255, 133, 83, 151, 231, 101, 151, 89, 22, 19, 65, 154, 10, 53, 208, 218, 252, 219, 37, 50, 212, 86, 145, 107, 132, 90, 233, 202, 227, 108, 114, 141, 29, 73, 187, 31, 13, 234, 0, 232, 24, 191, 35, 149, 179, 138, 214, 159, 245, 162, 148, 221, 118, 17, 105, 89, 151, 146, 209, 55, 236, 61, 143, 233, 228, 10, 115, 8, 81, 197, 45, 123, 187, 223, 176, 254, 165, 69, 143, 29, 100, 114, 17, 130, 226, 223, 33, 11, 240, 81, 61, 172, 191, 157, 246, 202, 87, 131, 221, 88, 48, 127, 159, 119, 160, 152, 117, 61, 253, 174, 65, 214, 203, 218, 63, 50, 78, 160, 181, 221, 211, 128, 70, 178, 191, 170, 0, 13, 122, 173, 12, 203, 252, 4, 184, 225, 252, 7, 62, 96, 116, 15, 216, 158, 55, 85, 48, 16, 9, 206, 119, 74, 112, 243, 136, 84, 184, 223, 254, 101, 91, 61, 10, 91, 85, 192, 147, 144, 57, 29, 66, 238, 199, 244, 193, 194, 150, 232, 200, 107, 2, 3, 1, 0, 1],\r\n private: [48, 130, 4, 191, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 4, 169, 48, 130, 4, 165, 2, 1, 0, 2, 130, 1, 1, 0, 228, 43, 101, 12, 121, 7, 157, 71, 81, 58, 219, 32, 10, 108, 193, 179, 212, 116, 255, 59, 217, 32, 161, 201, 53, 171, 226, 199, 137, 202, 171, 60, 82, 53, 125, 62, 177, 126, 165, 24, 141, 30, 15, 226, 59, 107, 34, 7, 13, 149, 112, 125, 10, 230, 191, 156, 164, 177, 10, 185, 13, 66, 3, 217, 166, 244, 90, 119, 111, 27, 145, 104, 71, 189, 166, 226, 255, 133, 83, 151, 231, 101, 151, 89, 22, 19, 65, 154, 10, 53, 208, 218, 252, 219, 37, 50, 212, 86, 145, 107, 132, 90, 233, 202, 227, 108, 114, 141, 29, 73, 187, 31, 13, 234, 0, 232, 24, 191, 35, 149, 179, 138, 214, 159, 245, 162, 148, 221, 118, 17, 105, 89, 151, 146, 209, 55, 236, 61, 143, 233, 228, 10, 115, 8, 81, 197, 45, 123, 187, 223, 176, 254, 165, 69, 143, 29, 100, 114, 17, 130, 226, 223, 33, 11, 240, 81, 61, 172, 191, 157, 246, 202, 87, 131, 221, 88, 48, 127, 159, 119, 160, 152, 117, 61, 253, 174, 65, 214, 203, 218, 63, 50, 78, 160, 181, 221, 211, 128, 70, 178, 191, 170, 0, 13, 122, 173, 12, 203, 252, 4, 184, 225, 252, 7, 62, 96, 116, 15, 216, 158, 55, 85, 48, 16, 9, 206, 119, 74, 112, 243, 136, 84, 184, 223, 254, 101, 91, 61, 10, 91, 85, 192, 147, 144, 57, 29, 66, 238, 199, 244, 193, 194, 150, 232, 200, 107, 2, 3, 1, 0, 1, 2, 130, 1, 0, 103, 244, 137, 118, 116, 82, 14, 203, 102, 107, 253, 88, 12, 199, 222, 60, 243, 136, 86, 157, 74, 224, 190, 53, 113, 57, 157, 250, 49, 130, 96, 31, 252, 136, 152, 70, 143, 17, 215, 96, 103, 51, 18, 35, 141, 212, 210, 205, 9, 216, 83, 70, 245, 71, 138, 119, 112, 229, 164, 176, 9, 37, 81, 161, 193, 154, 68, 249, 115, 106, 201, 6, 12, 225, 144, 126, 141, 210, 141, 242, 128, 159, 221, 163, 222, 21, 233, 230, 167, 206, 59, 24, 250, 233, 81, 122, 102, 26, 6, 233, 72, 133, 47, 77, 155, 238, 86, 6, 139, 24, 131, 163, 179, 112, 48, 247, 142, 6, 207, 204, 173, 223, 140, 199, 150, 95, 123, 152, 202, 155, 131, 238, 62, 96, 133, 4, 217, 51, 121, 30, 38, 178, 189, 216, 44, 35, 241, 93, 7, 62, 90, 111, 216, 66, 209, 243, 128, 234, 141, 84, 135, 181, 13, 38, 220, 114, 245, 240, 178, 95, 220, 206, 11, 186, 234, 213, 66, 121, 83, 68, 89, 75, 46, 183, 145, 183, 147, 160, 215, 118, 198, 125, 181, 146, 30, 251, 58, 87, 47, 209, 237, 97, 24, 47, 179, 6, 110, 242, 99, 150, 226, 148, 198, 174, 146, 101, 213, 87, 178, 10, 223, 105, 18, 56, 53, 22, 212, 158, 170, 176, 51, 86, 145, 125, 124, 44, 9, 85, 19, 144, 246, 170, 78, 124, 30, 32, 12, 166, 174, 139, 77, 63, 173, 82, 10, 153, 2, 129, 129, 0, 248, 18, 143, 246, 137, 136, 145, 219, 178, 39, 27, 94, 64, 90, 47, 163, 114, 60, 63, 187, 131, 143, 244, 16, 42, 128, 231, 117, 92, 98, 219, 155, 62, 107, 252, 17, 245, 45, 160, 225, 103, 142, 72, 36, 193, 150, 235, 214, 175, 62, 212, 56, 45, 9, 0, 60, 114, 107, 134, 228, 204, 131, 131, 214, 94, 201, 148, 159, 99, 139, 181, 13, 119, 38, 30, 107, 166, 165, 203, 43, 34, 20, 207, 171, 32, 58, 167, 62, 196, 153, 103, 204, 213, 247, 48, 111, 227, 59, 95, 97, 194, 187, 53, 10, 247, 108, 58, 86, 28, 29, 113, 8, 110, 171, 220, 245, 11, 82, 233, 223, 91, 68, 166, 117, 174, 187, 62, 77, 2, 129, 129, 0, 235, 118, 2, 105, 239, 212, 30, 104, 157, 41, 109, 11, 248, 152, 22, 236, 97, 40, 153, 131, 228, 5, 86, 187, 113, 126, 144, 76, 141, 79, 110, 250, 146, 152, 49, 58, 156, 201, 176, 92, 189, 209, 30, 112, 108, 175, 204, 204, 247, 164, 46, 129, 239, 98, 127, 49, 145, 218, 63, 193, 124, 174, 18, 98, 201, 99, 154, 162, 138, 78, 159, 253, 3, 248, 3, 209, 36, 239, 193, 155, 193, 5, 19, 236, 37, 78, 118, 135, 250, 199, 7, 141, 248, 120, 36, 136, 93, 98, 174, 60, 18, 215, 93, 174, 107, 141, 116, 145, 167, 221, 210, 169, 247, 67, 254, 222, 161, 134, 63, 221, 90, 87, 42, 99, 227, 81, 173, 151, 2, 129, 129, 0, 133, 23, 168, 103, 83, 232, 146, 160, 181, 23, 40, 38, 204, 13, 214, 203, 49, 41, 195, 227, 189, 181, 8, 243, 119, 106, 75, 67, 250, 250, 10, 234, 98, 118, 26, 250, 35, 121, 132, 124, 10, 76, 26, 198, 165, 154, 108, 19, 117, 88, 23, 17, 192, 143, 184, 177, 181, 141, 157, 4, 185, 248, 193, 77, 204, 243, 7, 170, 240, 4, 111, 113, 183, 0, 27, 136, 20, 19, 149, 74, 33, 241, 218, 108, 236, 80, 171, 148, 16, 116, 97, 109, 83, 74, 88, 145, 94, 239, 102, 192, 19, 114, 207, 5, 128, 51, 111, 164, 237, 86, 154, 99, 52, 197, 62, 57, 182, 6, 152, 245, 61, 137, 58, 105, 159, 2, 84, 109, 2, 129, 129, 0, 226, 67, 111, 132, 95, 91, 101, 177, 63, 189, 44, 53, 193, 184, 92, 230, 223, 98, 133, 74, 209, 86, 52, 7, 65, 195, 206, 100, 81, 178, 144, 65, 167, 151, 42, 79, 89, 149, 18, 173, 188, 21, 244, 251, 49, 230, 41, 150, 153, 46, 35, 38, 231, 99, 174, 56, 115, 32, 215, 253, 85, 147, 108, 197, 147, 34, 236, 216, 222, 177, 57, 90, 136, 114, 207, 48, 46, 31, 90, 220, 18, 58, 143, 239, 111, 214, 27, 95, 6, 36, 53, 229, 62, 108, 45, 39, 1, 30, 47, 178, 56, 164, 206, 56, 42, 208, 46, 193, 61, 31, 147, 45, 147, 23, 187, 22, 50, 255, 111, 229, 132, 199, 152, 75, 142, 136, 209, 151, 2, 129, 129, 0, 165, 56, 232, 76, 55, 57, 240, 159, 92, 207, 220, 143, 130, 30, 57, 234, 251, 172, 171, 180, 54, 159, 229, 96, 246, 73, 112, 146, 75, 157, 242, 201, 161, 218, 37, 176, 35, 170, 50, 90, 148, 102, 191, 199, 239, 174, 78, 72, 67, 85, 199, 45, 149, 145, 132, 161, 212, 33, 157, 75, 216, 79, 39, 233, 18, 210, 255, 26, 72, 229, 239, 44, 12, 147, 158, 176, 192, 95, 126, 32, 175, 23, 226, 131, 139, 197, 175, 193, 62, 8, 151, 252, 68, 154, 94, 89, 189, 125, 90, 30, 36, 175, 73, 230, 194, 13, 233, 247, 123, 60, 241, 47, 171, 51, 189, 112, 111, 213, 141, 89, 70, 249, 236, 63, 236, 110, 115, 208]};\r\n*/\n\n\n/* harmony default export */ var cryptoManager_CryptoManager = (new CryptoManager_CryptoManager());\n// EXTERNAL MODULE: ./node_modules/path-browserify/index.js\nvar path_browserify = __webpack_require__(281);\n\n// CONCATENATED MODULE: ./src/runtime/Loader.js\nfunction Loader_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Loader_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Loader_createClass(Constructor, protoProps, staticProps) { if (protoProps) Loader_defineProperties(Constructor.prototype, protoProps); if (staticProps) Loader_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar Loader_log = loglevel[\"getLogger\"]('Loader');\n\n\n\n\nvar Loader_Loader =\n/*#__PURE__*/\nfunction () {\n function Loader(runtimeURL, runtimeConfiguration, runtimeDescriptorsInstance) {\n Loader_classCallCheck(this, Loader);\n\n if (!runtimeConfiguration) throw Error('[Runtime.Loader] The descriptor need to know the runtime configuration');\n if (!runtimeDescriptorsInstance) throw Error('[Runtime.Loader] The descriptor need to know the runtime Descriptor instance');\n this.log = Loader_log;\n this.runtimeConfiguration = runtimeConfiguration;\n this.descriptors = runtimeDescriptorsInstance;\n }\n /**\r\n * Set runtime url\r\n * @param {string} value runtimeURL\r\n */\n\n\n Loader_createClass(Loader, [{\n key: \"loadHyperty\",\n\n /**\r\n * Deploy Hyperty from Catalogue URL\r\n *\r\n * @see https://github.com/reTHINK-project/specs/tree/master/datamodel/core/address\r\n *\r\n * @param {URL.HypertyCatalogueURL} hypertyCatalogueURL - The Catalogue URL used to identify descriptors in the Catalogue.\r\n * @param {boolean|URL.HypertyURL} [reuseURL=false] reuseURL - reuseURL is used to reuse the hypertyURL previously registred, by default the reuse is disabled;\r\n * @param {URL} appURL - the app url origin address;\r\n * @param {object} IdpConstraint - constraints to be used when selecting the identity to be associated with the Hyperty including origin, idp, and idHint.\r\n * @returns {Promise} this is Promise and returns true if all components are loaded with success or an error if someone fails.\r\n *\r\n * @memberOf Loader\r\n */\n value: function loadHyperty(hypertyClass) {\n var _this = this;\n\n var reuseURL = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var IdpConstraint = arguments.length > 2 ? arguments[2] : undefined;\n var appURL = arguments.length > 3 ? arguments[3] : undefined;\n if (!this._readyToUse()) return false;\n if (!hypertyClass) throw new Error('[Runtime.Loader] hypertyClass parameter is needed');\n\n var _hypertyURL;\n\n var _hypertySandbox;\n\n var _hypertySourcePackage;\n\n var haveError = false;\n var instance = new hypertyClass();\n var hyperty = instance.name;\n return new Promise(function (resolve, reject) {\n var errorReason = function errorReason(reason) {\n Loader_log.info('[Runtime.Loader] Something failed on the deploy hyperty: ', reason);\n reject(reason);\n };\n\n var handleError = function handleError(reason) {\n haveError = true;\n reject(reason);\n };\n\n Loader_log.info('[Runtime.Loader.loadHyperty] ', hyperty);\n var _hypertyDescriptor = instance.descriptor;\n _hypertyDescriptor.dataObjects[0] = _hypertyDescriptor.dataObjects[0].replace('%domain%', _this._registry._domain); // at this point, we have completed \"step 2 and 3\" as shown in https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md\n\n Loader_log.info('[Runtime.Loader] 1: return hyperty descriptor: ', _hypertyDescriptor);\n _hypertySandbox = _this.registry.getAppSandbox();\n var numberOfAddresses = 1; //debugger;\n\n _this._addressAllocation.create(_this._registry._domain, numberOfAddresses, _hypertyDescriptor, 'hyperty', reuseURL).then(function (addresses) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 6: return the addresses for the hyperty', addresses); // Register hyperty\n\n return _this.registry.registerHyperty(_hypertySandbox, hyperty, _hypertyDescriptor, addresses, IdpConstraint);\n }, handleError).then(function (registrationResult) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 7: registration result', registrationResult); // we have completed step 16 of https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md right now.\n\n _hypertyURL = registrationResult.url; // Extend original hyperty configuration;\n\n var configuration = {};\n\n if (!emptyObject(_hypertyDescriptor.configuration)) {\n try {\n configuration = Object.assign({}, JSON.parse(_hypertyDescriptor.configuration));\n } catch (e) {\n configuration = _hypertyDescriptor.configuration;\n }\n }\n\n configuration.runtimeURL = _this._runtimeURL;\n\n if (registrationResult.p2pHandler) {\n configuration.p2pHandler = registrationResult.p2pHandler;\n configuration.p2pRequester = registrationResult.p2pRequester;\n } // We will deploy the component - step 17 of https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md right now.\n\n\n try {\n // return _hypertySandbox.deployComponent(_hypertySourcePackage.sourceCode, _hypertyURL, configuration);\n return _hypertySandbox.deployComponent(instance, _hypertyURL, configuration);\n } catch (e) {\n Loader_log.info('[Runtime.Loader] Error on deploy component:', e);\n reject(e);\n }\n }, handleError).then(function (deployComponentStatus) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 8: Deploy component status for hyperty: ', deployComponentStatus); // we have completed step 19 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md right now.\n // Add the message bus listener to the appSandbox or hypertSandbox;\n\n _this.messageBus.addListener(_hypertyURL, function (msg) {\n _hypertySandbox.postMessage(msg);\n }); // Add the message bus listener to the appSandbox or hypertSandbox;\n\n\n _this.messageBus.addListener(_this.runtimeURL + '/status', function (msg) {\n _hypertySandbox.postMessage(msg);\n }); // we have completed step 20 of https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md right now.\n\n\n var deployed = {\n runtimeHypertyURL: _hypertyURL,\n status: deployComponentStatus,\n name: hyperty,\n instance: instance\n };\n Loader_log.info('[Runtime.Loader] Hyperty deployed: ', deployed);\n resolve(instance); // we have completed step 21 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md right now.\n\n Loader_log.info('[Runtime.Loader] ------------------ END ------------------------');\n }, handleError).catch(errorReason);\n });\n }\n /**\r\n * Deploy Stub from Catalogue URL or domain url\r\n * @param {URL.URL} protostubURL Catalogue URL for the ProtoStub to be loaded or the domain to be target by the protostub\r\n * @param {Object} p2pConfig configuration of p2p\r\n */\n\n }, {\n key: \"loadStub\",\n value: function loadStub(protostubURL, p2pConfig) {\n var _this2 = this;\n\n if (!this._readyToUse()) return false;\n if (!protostubURL) throw new Error('[Runtime.Loader.loadStub]ProtoStub descriptor url parameter is needed');\n return new Promise(function (resolve, reject) {\n // to analyse if domain for p2pHandlers should be something else and not the default domain itself\n var domain = divideURL(protostubURL).domain;\n\n if (!domain) {\n domain = protostubURL;\n }\n\n var _stubSandbox;\n\n var _stubDescriptor;\n\n var _runtimeProtoStubURL;\n\n var _stubSourcePackage;\n\n var haveError = false;\n var stubId;\n\n var errorReason = function errorReason(reason) {\n Loader_log.info('[Runtime.Loader.loadStub]Something failed on the deploy of protocolstub: ', reason);\n reject(reason);\n };\n\n var handleError = function handleError(reason) {\n haveError = true;\n reject(reason);\n }; // Discover Protocol Stub\n\n\n var discoverStub;\n var isP2PHandler = false;\n var isP2PRequester = false;\n var stubCapabilities = {};\n Loader_log.info('[Runtime.Loader.loadStub] starting loading for ', protostubURL, ' with p2pconfig ', p2pConfig);\n Loader_log.info('[Runtime.Loader.loadStub]Discover or Create a new ProtoStub for domain: ', domain); // step 2 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n try {\n if (p2pConfig) {\n if (p2pConfig.hasOwnProperty('isHandlerStub') && p2pConfig.isHandlerStub) {\n // step 6 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n isP2PHandler = true;\n stubId = _this2.runtimeURL;\n discoverStub = _this2.registry.discoverP2PStub();\n } else {\n isP2PRequester = true;\n var p2pHandlerRuntimeURL = p2pConfig.remoteRuntimeURL;\n stubId = p2pHandlerRuntimeURL; // step 4 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n // step 5 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n discoverStub = _this2.registry.discoverP2PStub(p2pHandlerRuntimeURL);\n }\n } else {\n // step 3 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n stubId = domain;\n discoverStub = _this2.registry.discoverProtostub(domain);\n } // Is registed?\n\n\n Loader_log.info('[Runtime.Loader.loadStub]1. Proto Stub Discovered for ', protostubURL, ': ', discoverStub); // step 23 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n resolve(discoverStub);\n Loader_log.info(' [Runtime.Loader]------------------- END ---------------------------\\n');\n } catch (reason) {\n // is not registed?\n Loader_log.info('[Runtime.Loader.loadStub]1. Proto Stub not found ' + reason); // step 8 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _this2.descriptors.getStubDescriptor(protostubURL).then(function (stubDescriptor) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader.loadStub]2. return the ProtoStub descriptor'); // step 9 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _stubDescriptor = stubDescriptor;\n var sourcePackageURL = stubDescriptor.sourcePackageURL;\n\n if (sourcePackageURL === '/sourcePackage') {\n return stubDescriptor.sourcePackage;\n } // step 10 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n\n return _this2.runtimeCatalogue.getSourcePackageFromURL(sourcePackageURL);\n }, handleError).catch(errorReason).then(function (stubSourcePackage) {\n if (haveError) return false; // According to debug, it seems RuntimeCatalogue does not support yet constraints. It appears empty!!!!\n\n if (_stubDescriptor && _stubDescriptor.constraints) {\n stubCapabilities = _stubDescriptor.constraints;\n } // step 11 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n\n Loader_log.info('[Runtime.Loader.loadStub]3. return the ProtoStub Source Code');\n _stubSourcePackage = stubSourcePackage; // this will return the sandbox or one promise to getSandbox;\n // step 12 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n return _this2.registry.getSandbox(domain, stubCapabilities);\n }).then(function (stubSandbox) {\n if (haveError) return false; // step 15 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n Loader_log.info('[Runtime.Loader.loadStub]4. if the sandbox is registered then return the sandbox ', stubSandbox);\n _stubSandbox = stubSandbox;\n return stubSandbox;\n }).catch(function (reason) {\n if (haveError) return false; // step 13 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n Loader_log.info('[Runtime.Loader.loadStub]5. Sandbox was not found, creating a new one ', reason); // check if the sandbox is registed for this stub descriptor url;\n // step 14 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n return _this2._runtimeFactory.createSandbox(stubCapabilities).then(function (sandbox) {\n sandbox.addListener('*', function (msg) {\n _this2.messageBus.postMessage(msg);\n });\n return sandbox;\n });\n }).then(function (sandbox) {\n if (haveError) return false; // step 16 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n Loader_log.info('[Runtime.Loader.loadStub]6. return the sandbox instance and register', sandbox, 'to domain ', domain);\n _stubSandbox = sandbox; // we need register stub on registry - step xxx https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n return _this2.registry.registerStub(_stubSandbox, stubId, p2pConfig, protostubURL, _stubDescriptor);\n }, handleError).then(function (runtimeProtoStub) {\n if (haveError) return false; // step 23 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n Loader_log.info('[Runtime.Loader.loadStub] 7. return the runtime protostub url: ', runtimeProtoStub);\n _runtimeProtoStubURL = runtimeProtoStub.url; // Extend original hyperty configuration;\n\n var configuration = {};\n\n if (!emptyObject(_stubDescriptor.configuration)) {\n try {\n configuration = Object.assign({}, JSON.parse(_stubDescriptor.configuration));\n } catch (e) {\n configuration = _stubDescriptor.configuration;\n }\n }\n\n if (p2pConfig) {\n try {\n configuration = Object.assign(configuration, JSON.parse(p2pConfig));\n } catch (e) {\n configuration = Object.assign(configuration, p2pConfig);\n }\n } // required for protostub session\n\n\n configuration.runtimeURL = _this2._runtimeURL; // step 24 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n try {\n // step 26 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n Loader_log.info('[Runtime.Loader.loadStub] 8: adding sandbox listener to protostubURL : ', _runtimeProtoStubURL); // step 27 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n // Add the message bus listener\n\n _this2.messageBus.addListener(_runtimeProtoStubURL, function (msg) {\n _stubSandbox.postMessage(msg);\n });\n\n return _stubSandbox.deployComponent(_stubSourcePackage.sourceCode, _runtimeProtoStubURL, configuration);\n } catch (e) {\n Loader_log.error('[Runtime.Loader.loadStub] Error on deploy component:', e);\n reject(e);\n }\n }, handleError).then(function () {\n if (haveError) return false; // step 28 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n var stub;\n\n if (p2pConfig) {\n Loader_log.log('[Runtime.Loader.loadStub] p2pConfig: ', p2pConfig);\n if (p2pConfig.hasOwnProperty('isHandlerStub')) stub = _this2.registry.p2pHandlerStub[_this2._runtimeURL];\n if (p2pConfig.hasOwnProperty('p2pRequesterStub')) stub = _this2.registry.p2pRequesterStub[p2pConfig.remoteRuntimeURL];\n } else {\n stub = _this2.registry.protostubsList[domain];\n }\n\n Loader_log.log('[Runtime.Loader.loadStub] Stub: ', stub);\n resolve(stub);\n Loader_log.info('[Runtime.Loader.loadStub]------------------- END ---------------------------\\n');\n }, handleError).catch(errorReason);\n }\n });\n }\n /**\r\n * Deploy idpProxy from Catalogue URL or domain url\r\n * @param {URL.URL} domain domain\r\n */\n\n }, {\n key: \"loadIdpProxy\",\n value: function loadIdpProxy(idpProxyURL) {\n var _this3 = this;\n\n if (!this._readyToUse()) return false;\n if (!idpProxyURL) throw new Error('[Runtime.Loader] IdpProxy descriptor url parameter is needed');\n return new Promise(function (resolve, reject) {\n var domain = divideURL(idpProxyURL).domain;\n\n if (!domain) {\n domain = idpProxyURL;\n }\n\n var _proxySandbox;\n\n var _proxyDescriptor;\n\n var _runtimeIdpProxyURL;\n\n var _proxySourcePackage;\n\n var haveError = false;\n\n var errorReason = function errorReason(reason) {\n Loader_log.info('[Runtime.Loader] Something failed on the deploy of IdpProxy: ', reason);\n reject(reason);\n };\n\n var handleError = function handleError(reason) {\n haveError = true;\n reject(reason);\n }; // Discover IDPProxy\n\n\n Loader_log.info('[Runtime.Loader] ------------------- IDP Proxy Deploy ---------------------------\\n');\n Loader_log.info('[Runtime.Loader] Discover or Create a new IdpProxy for domain/URL: ', domain);\n\n try {\n var runtimeIdpProxyURL = _this3.registry.discoverIdpProxy(domain); // Is registed?\n\n\n Loader_log.info('[Runtime.Loader] 1. IDPProxy Discovered: ', runtimeIdpProxyURL); // we have completed step 2 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n var idpProxy = _this3.registry.idpProxyList[domain];\n Loader_log.log('Deployed: ', idpProxy);\n resolve(idpProxy);\n Loader_log.info('[Runtime.Loader] ------------------- END ---------------------------\\n');\n } catch (reason) {\n // is not registed?\n Loader_log.info('[Runtime.Loader] 1. IdpProxy not found:', reason); // we have completed step 3 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n // we need to get ProtoStub descriptor step 4 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _this3.descriptors.getIdpProxyDescriptor(idpProxyURL).then(function (proxyDescriptor) {\n Loader_log.info('[Runtime.Loader] 2. Return the IDPProxy descriptor'); // we have completed step 5 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _proxyDescriptor = proxyDescriptor;\n var sourcePackageURL = proxyDescriptor.sourcePackageURL;\n\n if (sourcePackageURL === '/sourcePackage') {\n return proxyDescriptor.sourcePackage;\n } // we need to get ProtoStub Source code from descriptor - step 6 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n\n return _this3.runtimeCatalogue.getSourcePackageFromURL(sourcePackageURL);\n }, handleError).then(function (sourcePackage) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 3. return the IDPProxy source package'); // we have completed step 7 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _proxySourcePackage = sourcePackage; // TODO: Check on PEP (policy Engine) if we need the sandbox and check if the Sandbox Factory have the context sandbox;\n\n var policy = true;\n return policy;\n }, handleError).then(function (policy) {\n if (haveError) return false; // this will return the sandbox or one promise to getSandbox;\n\n return _this3.registry.getSandbox(domain);\n }).then(function (proxySandbox) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 4. if the sandbox is registered then return the sandbox', proxySandbox);\n _proxySandbox = proxySandbox;\n return proxySandbox;\n }).catch(function (reason) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 5. Sandbox was not found, creating a new one', reason);\n var proxyCapabilities = {};\n\n if (_proxyDescriptor && _proxyDescriptor.hasOwnProperty('capabilities')) {\n _proxyDescriptor = _proxyDescriptor.stubCapabilities;\n }\n\n return _this3._runtimeFactory.createSandbox(proxyCapabilities).then(function (sandbox) {\n sandbox.addListener('*', function (msg) {\n _this3.messageBus.postMessage(msg);\n });\n return sandbox;\n });\n }).then(function (sandbox) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 6. return the sandbox instance and register', sandbox, 'to domain ', domain);\n _proxySandbox = sandbox; // we need register stub on registry - step xxx https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n return _this3.registry.registerIdpProxy(sandbox, domain);\n }, handleError).then(function (runtimeIdpProxyURL) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 7. Return the runtime Idp Proxy URL: ', runtimeIdpProxyURL); // we have completed step xxx https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _runtimeIdpProxyURL = runtimeIdpProxyURL; // Extend original hyperty configuration;\n\n var configuration = {};\n\n if (!emptyObject(_proxyDescriptor.configuration)) {\n try {\n configuration = Object.assign({}, JSON.parse(_proxyDescriptor.configuration));\n } catch (e) {\n configuration = _proxyDescriptor.configuration;\n }\n }\n\n configuration.runtimeURL = _this3._runtimeURL; // Deploy Component step xxx\n\n try {\n // we have completed step xxx https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n // Add the message bus listener\n _this3.messageBus.addListener(_runtimeIdpProxyURL, function (msg) {\n _proxySandbox.postMessage(msg);\n });\n\n return _proxySandbox.deployComponent(_proxySourcePackage.sourceCode, runtimeIdpProxyURL, configuration);\n } catch (e) {\n Loader_log.info('[Runtime.Loader] Error on deploy component:', e);\n reject(e);\n }\n }, handleError).then(function () {\n if (haveError) return false; // we have completed step xxx https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n // Load Stub function resolved with success;\n // let idpProxy = {\n // runtimeIdpProxyURL: _runtimeIdpProxyURL,\n // status: deployComponentStatus\n // };\n //this.registry.idpProxyList[domain].status = 'deployed';\n\n var idpProxy = _this3.registry.idpProxyList[domain];\n Loader_log.log('[Runtime.Loader.loadIdpProxy] 8: loaded: ', idpProxy);\n resolve(idpProxy);\n Loader_log.info('[Runtime.Loader.loadIdpProxy] ------------------- END ---------------------------\\n');\n }, handleError).catch(errorReason);\n }\n });\n } // Check if the loader is ready to load all components\n\n }, {\n key: \"_readyToUse\",\n value: function _readyToUse() {\n var status = false;\n if (!this._runtimeURL) throw new Error('[Runtime.Loader] The loader need the runtime url address');\n if (!this._messagesBus) throw new Error('[Runtime.Loader] The loader need the messageBus component');\n if (!this._registry) throw new Error('[Runtime.Loader] The loader need the registry component');\n if (!this._runtimeFactory) throw new Error('[Runtime.Loader] The loader need the runtime factory component');\n status = true;\n return status;\n }\n }, {\n key: \"runtimeURL\",\n set: function set(value) {\n this._runtimeURL = value;\n }\n /**\r\n * Get runtime url\r\n * @return {string} value runtimeURL\r\n */\n ,\n get: function get() {\n return this._runtimeURL;\n }\n /**\r\n * Set Registry component\r\n * @param {Registry} value Registry Component\r\n */\n\n }, {\n key: \"registry\",\n set: function set(value) {\n this._registry = value; // Install AddressAllocation\n\n var addressAllocation = allocation_AddressAllocation.instance;\n this._addressAllocation = addressAllocation;\n Loader_log.log('[Loader - AddressAllocation] - ', addressAllocation);\n }\n /**\r\n * Get Registry component\r\n * @return {Registry} Registry component\r\n */\n ,\n get: function get() {\n return this._registry;\n }\n /**\r\n * Set Message Bus component\r\n * @param {MessageBus} value Message bus component\r\n */\n\n }, {\n key: \"messageBus\",\n set: function set(value) {\n this._messagesBus = value;\n }\n /**\r\n * Get Message Bus component\r\n * @return {MessageBus} Message Bus component\r\n */\n ,\n get: function get() {\n return this._messagesBus;\n }\n /**\r\n * Set Runtime Factory component\r\n * @param {runtimeFactory} value Factory includes the specific implementations for each environment\r\n */\n\n }, {\n key: \"runtimeFactory\",\n set: function set(value) {\n this._runtimeFactory = value;\n }\n /**\r\n * Get Runtime Factory component\r\n * @return {runtimeFactory} Runtime Factory component\r\n */\n ,\n get: function get() {\n return this._runtimeFactory;\n }\n }]);\n\n return Loader;\n}();\n\n/* harmony default export */ var runtime_Loader = (Loader_Loader);\n// CONCATENATED MODULE: ./src/runtime/Storage.js\n\nvar storages = {};\nfunction Storage_storage(runtimeFactory, runtimeStatusUpdate) {\n if (!runtimeFactory) throw new Error('The runtime factory is a needed parameter');\n Object.keys(runtimeConfiguration_runtimeConfiguration.storageSchemas).forEach(function (key) {\n if (!storages.hasOwnProperty(key)) {\n storages[key] = runtimeFactory.storageManager(key, runtimeConfiguration_runtimeConfiguration.storageSchemas[key], runtimeStatusUpdate);\n }\n });\n return storages;\n}\nfunction createSyncDB(key, runtimeFactory, schema, runtimeStatusUpdate) {\n var url = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n if (!runtimeFactory) throw new Error('The runtime factory is a needed parameter');\n var remote = url ? url : runtimeConfiguration_runtimeConfiguration.remoteStorage;\n return runtimeFactory.storageManager(key, schema, runtimeStatusUpdate, remote);\n}\n// CONCATENATED MODULE: ./src/runtime/Descriptors.js\nfunction Descriptors_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Descriptors_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Descriptors_createClass(Constructor, protoProps, staticProps) { if (protoProps) Descriptors_defineProperties(Constructor.prototype, protoProps); if (staticProps) Descriptors_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar Descriptors_log = loglevel[\"getLogger\"]('Descriptors');\n\nvar Descriptors_Descriptors =\n/*#__PURE__*/\nfunction () {\n function Descriptors(runtimeURL, catalogue, runtimeConfiguration) {\n Descriptors_classCallCheck(this, Descriptors);\n\n if (!runtimeURL) throw Error('The descriptor need to know the runtime url to be used');\n if (!catalogue) throw Error('The descriptor needs the catalogue instance');\n if (!runtimeConfiguration) throw Error('The descriptor needs the runtime configuration');\n this.log = Descriptors_log;\n this.runtimeConfiguration = runtimeConfiguration;\n this.runtimeURL = runtimeURL;\n this.catalogue = catalogue;\n this.constraints = runtimeUtils.runtimeCapabilities;\n }\n\n Descriptors_createClass(Descriptors, [{\n key: \"getHypertyDescriptor\",\n value: function getHypertyDescriptor(hypertyURL) {\n return this.catalogue.getHypertyDescriptor(hypertyURL, true, this.constraints);\n }\n }, {\n key: \"getStubDescriptor\",\n value: function getStubDescriptor(stubURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var domain;\n var protostub;\n var protoStubURL;\n var originDividedURL = divideURL(_this.runtimeURL);\n var originDomain = originDividedURL.domain;\n\n if (stubURL.includes('://')) {\n var dividedURL = divideURL(stubURL);\n domain = dividedURL.domain;\n var path = dividedURL.identity;\n\n if (path) {\n protostub = path.substring(path.lastIndexOf('/') + 1);\n } else {\n protostub = 'default';\n }\n } else {\n protostub = 'default';\n domain = stubURL;\n }\n\n protoStubURL = buildURL(_this.runtimeConfiguration, 'catalogueURLs', 'protocolstub', protostub);\n\n if (domain !== _this.runtimeConfiguration.domain) {\n if (!stubURL.indexOf('https') || !stubURL.indexOf('hyperty-catalogue')) {\n protoStubURL = stubURL;\n } else {\n // TODO: check how to load form different configuration domain\n var resource = getConfigurationResources(_this.runtimeConfiguration, 'catalogueURLs', 'protocolstub');\n protoStubURL = resource.prefix + domain + resource.suffix + protostub;\n }\n }\n\n Descriptors_log.log('Load ProtocolStub for domain, ' + domain + ' : ', protoStubURL);\n return _this.catalogue.getStubDescriptor(protoStubURL, true, _this.constraints).then(function (result) {\n resolve(result);\n }).catch(function (error) {\n // log.log('Error: ', error);\n protostub = domain;\n domain = originDomain;\n var resource = getConfigurationResources(_this.runtimeConfiguration, 'catalogueURLs', 'protocolstub');\n protoStubURL = resource.prefix + domain + resource.suffix + protostub; // log.log('Fallback -> Load Protocolstub for domain, ' + domain + ' : ', protostub);\n\n return _this.catalogue.getStubDescriptor(protoStubURL, true, _this.constraints);\n }).then(function (result) {\n resolve(result);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"getIdpProxyDescriptor\",\n value: function getIdpProxyDescriptor(idpProxyURL) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n var domain;\n var idpproxy;\n var originDividedURL = divideURL(_this2.runtimeURL);\n var originDomain = originDividedURL.domain;\n var constraints = _this2.constraints;\n constraints.constraints.onlyAccessToken = true;\n constraints.constraints.onlyIdAssertionValidation = true;\n console.log('LOG HERE', constraints);\n\n if (idpProxyURL.includes('://')) {\n var dividedURL = divideURL(idpProxyURL);\n domain = dividedURL.domain;\n var path = dividedURL.identity;\n\n if (path) {\n idpproxy = path.substring(path.lastIndexOf('/') + 1);\n } else {\n idpproxy = 'default';\n }\n } else {\n idpproxy = 'default';\n domain = idpProxyURL;\n }\n\n var resource = getConfigurationResources(_this2.runtimeConfiguration, 'catalogueURLs', 'idpProxy');\n idpProxyURL = resource.prefix + domain + resource.suffix + idpproxy; // log.log('Load Idp Proxy for domain, ' + domain + ' : ', idpProxyURL);\n\n return _this2.catalogue.getIdpProxyDescriptor(idpProxyURL, true, constraints).then(function (result) {\n resolve(result);\n }).catch(function () {\n idpproxy = domain;\n domain = originDomain;\n idpProxyURL = buildURL(_this2.runtimeConfiguration, 'catalogueURLs', 'idpProxy', idpproxy); // log.log('Load Idp Proxy for domain, ' + domain + ' : ', idpProxyURL);\n\n return _this2.catalogue.getIdpProxyDescriptor(idpProxyURL, true, constraints);\n }).then(function (result) {\n resolve(result);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }]);\n\n return Descriptors;\n}();\n\n/* harmony default export */ var runtime_Descriptors = (Descriptors_Descriptors);\n// CONCATENATED MODULE: ./src/runtime/MsgBusHandlers.js\nfunction MsgBusHandlers_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction MsgBusHandlers_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction MsgBusHandlers_createClass(Constructor, protoProps, staticProps) { if (protoProps) MsgBusHandlers_defineProperties(Constructor.prototype, protoProps); if (staticProps) MsgBusHandlers_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n * Class where message bus handlers are built. To be used by the RuntimeUA to initialise the runtime UA.\r\n */\n//import { log as logLevels } from '../logLevels';\n// Log System\n\nvar MsgBusHandlers_log = loglevel[\"getLogger\"]('RuntimeUA');\n\nvar MsgBusHandlers =\n/*#__PURE__*/\nfunction () {\n function MsgBusHandlers(pep, idm, crypto) {\n MsgBusHandlers_classCallCheck(this, MsgBusHandlers);\n\n if (!pep) throw Error('[MsgBusHandlers] pep input paramenter is mandatory');\n if (!idm) throw Error('[MsgBusHandlers] idm input paramente is mandatory');\n if (!crypto) throw Error('[MsgBusHandlers] crypto input paramente is mandatory');\n this.policyEngine = pep;\n this.identityManager = idm;\n this.cryptoManager = crypto;\n } // Policy based access control for incoming messages\n\n\n MsgBusHandlers_createClass(MsgBusHandlers, [{\n key: \"pepInHandler\",\n get: function get() {\n var _this = this;\n\n return function (ctx) {\n _this.policyEngine.authorise(ctx.msg, true).then(function (changedMgs) {\n ctx.msg = changedMgs;\n ctx.next();\n }).catch(function (reason) {\n MsgBusHandlers_log.error(reason);\n ctx.fail(reason);\n });\n };\n } // Policy based access control for outgoing messages\n\n }, {\n key: \"pepOutHandler\",\n get: function get() {\n var _this = this;\n\n return function (ctx) {\n _this.policyEngine.authorise(ctx.msg, false).then(function (changedMgs) {\n ctx.msg = changedMgs;\n ctx.next();\n }).catch(function (reason) {\n MsgBusHandlers_log.error(reason);\n ctx.fail(reason);\n });\n };\n } // Add Identity info to messages\n\n }, {\n key: \"idmHandler\",\n get: function get() {\n var _this = this;\n\n return function (ctx) {\n _this.identityManager.processMessage(ctx.msg).then(function (changedMgs) {\n ctx.msg = changedMgs;\n ctx.next();\n }).catch(function (reason) {\n MsgBusHandlers_log.error(reason);\n ctx.fail(reason);\n });\n };\n } // encrypt messages\n\n }, {\n key: \"encryptHandler\",\n get: function get() {\n var _this = this;\n\n return function (ctx) {\n _this.cryptoManager.encryptMessage(ctx.msg).then(function (changedMgs) {\n ctx.msg = changedMgs;\n ctx.next();\n }).catch(function (reason) {\n MsgBusHandlers_log.error(reason);\n ctx.fail(reason);\n });\n };\n } // decrypt messages\n\n }, {\n key: \"decryptHandler\",\n get: function get() {\n var _this = this;\n\n return function (ctx) {\n _this.cryptoManager.decryptMessage(ctx.msg).then(function (changedMgs) {\n ctx.msg = changedMgs;\n ctx.next();\n }).catch(function (reason) {\n MsgBusHandlers_log.warn(reason);\n ctx.fail(reason);\n });\n };\n }\n }]);\n\n return MsgBusHandlers;\n}();\n\n/* harmony default export */ var runtime_MsgBusHandlers = (MsgBusHandlers);\n// CONCATENATED MODULE: ./src/discovery/CoreDiscovery.js\nfunction CoreDiscovery_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction CoreDiscovery_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CoreDiscovery_createClass(Constructor, protoProps, staticProps) { if (protoProps) CoreDiscovery_defineProperties(Constructor.prototype, protoProps); if (staticProps) CoreDiscovery_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar CoreDiscovery_log = loglevel[\"getLogger\"]('CoreDiscovery');\n\n/**\r\n* Core Discovery interface\r\n* Class to allow applications to search for hyperties and DataObjects using the message bus\r\n*/\n\nvar CoreDiscovery_CoreDiscovery =\n/*#__PURE__*/\nfunction () {\n /**\r\n * To initialise the Discovery, which will provide the support for hyperties to\r\n * query users registered in outside the internal core.\r\n * @param {MessageBus} msgbus msgbus\r\n * @param {RuntimeURL} runtimeURL runtimeURL\r\n * @param {graphConnector} graphConnector\r\n */\n function CoreDiscovery(runtimeURL, msgBus, graphConnector, runtimeFactory, registry) {\n CoreDiscovery_classCallCheck(this, CoreDiscovery);\n\n if (!runtimeFactory) throw Error('The catalogue needs the runtimeFactory');\n\n var _this = this;\n\n this._messageBus = msgBus;\n _this.graphConnector = graphConnector;\n _this.httpRequest = runtimeFactory.createHttpRequest();\n _this.domain = divideURL(runtimeURL).domain;\n _this.discoveryURL = runtimeURL + '/discovery/';\n _this.registry = registry;\n\n _this.messageBus.addListener(_this.discoveryURL, function (msg) {\n _this.discoveryManager(msg).then(function (result) {\n //FLOW-OUT: message response\n _this.messageBus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n value: result\n }\n });\n }).catch(function (err) {\n var description;\n var code;\n\n if (err === 'GraphConnector') {\n description = 'This search is not available at the moment. Try later.';\n code = 500;\n } else {\n description = 'Not Found';\n code = 404;\n } //FLOW-OUT: error message response\n\n\n _this.messageBus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: code,\n description: description\n }\n });\n });\n });\n }\n /**\r\n * Returns the MessageBus.\r\n */\n\n\n CoreDiscovery_createClass(CoreDiscovery, [{\n key: \"discoveryManager\",\n\n /* function to decide what discovery method to call and later return the response msg */\n value: function discoveryManager(msg) {\n var _this = this;\n\n var domain = divideURL(msg.from).domain;\n var atributes = msg.body.resource.split('/').filter(Boolean);\n var resources = [];\n var dataSchemes = [];\n CoreDiscovery_log.log('[CoreDiscovery.discoveryManager] received: ', msg);\n\n if (msg.body.criteria) {\n if (msg.body.criteria.resources) {\n resources = msg.body.criteria.resources;\n }\n\n if (msg.body.criteria.dataSchemes) {\n dataSchemes = msg.body.criteria.dataSchemes;\n }\n }\n\n switch (atributes[1]) {\n case 'user':\n if (atributes[0] == 'hyperty') {\n return _this.discoverHyperties(msg.body.resource.split('user/')[1], dataSchemes, resources, msg.body.criteria.domain);\n } else {\n return _this.discoverDataObjects(msg.body.resource.split('user/')[1], dataSchemes, resources, msg.body.criteria.domain);\n }\n\n break;\n\n case 'url':\n if (atributes[0] == 'hyperty') {\n return _this.discoverHypertyPerURL(msg.body.resource.split('url/')[1], msg.body.criteria.domain);\n } else {\n return _this.discoverDataObjectPerURL(msg.body.resource.split('url/')[1], msg.body.criteria.domain);\n }\n\n break;\n\n case 'name':\n return _this.discoverDataObjectsPerName(msg.body.resource.split('name/')[1], dataSchemes, resources, msg.body.criteria.domain);\n break;\n\n case 'reporter':\n return _this.discoverDataObjectsPerReporter(msg.body.resource.split('reporter/')[1], dataSchemes, resources, msg.body.criteria.domain);\n break;\n\n case 'guid':\n if (typeof _this.graphConnector !== 'undefined' && _this.graphConnector !== null) {\n if (atributes[0] == 'hyperty') {\n return _this.discoverHypertiesPerGUID(msg.body.resource.split('user-guid://')[1], dataSchemes, resources);\n } else {\n return _this.discoverDataObjectsPerGUID(msg.body.resource.split('user-guid://')[1], dataSchemes, resources);\n }\n\n break;\n } else {\n return Promise.reject('GraphConnector');\n break;\n }\n\n case 'userprofile':\n if (typeof _this.graphConnector !== 'undefined' && _this.graphConnector !== null) {\n if (atributes[0] == 'hyperty') {\n return _this.discoverHypertiesPerUserProfileData(msg.body.resource.split('userprofile/')[1], dataSchemes, resources);\n } else {\n return _this.discoverDataObjectsPerUserProfileData(msg.body.resource.split('userprofile/')[1], dataSchemes, resources);\n }\n\n break;\n } else {\n return Promise.reject('GraphConnector');\n break;\n }\n\n }\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\r\n * @param {String} userIdentifier\r\n * @param {Array} dataSchemes (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverHypertiesPerUserProfileData\",\n value: function discoverHypertiesPerUserProfileData(userIdentifier, dataSchemes, resources) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //translate user identifier (e.g. email, name...) into the associated GUIDs\n _this.discoverGUIDPerUserIdentifier(userIdentifier).then(function (guids) {\n var hypertiesPromises = guids.map(function (guid) {\n return new Promise(function (resolve, reject) {\n _this.discoverHypertiesPerGUID(guid, dataSchemes, resources).then(function (hyperties) {\n resolve(hyperties);\n }).catch(function (err) {\n resolve([]);\n });\n });\n });\n Promise.all(hypertiesPromises).then(function (hypertiesResult) {\n var hyperties = [].concat.apply([], hypertiesResult);\n\n if (hyperties.length === 0) {\n return reject('No hyperties were found');\n }\n\n resolve(hyperties);\n });\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /**\r\n * Advanced Search for DataObjects registered in domain registry associated with some user identifier (eg email, name ...)\r\n * @param {String} userIdentifier\r\n * @param {Array} dataSchemes (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverDataObjectsPerUserProfileData\",\n value: function discoverDataObjectsPerUserProfileData(userIdentifier, dataSchemes, resources) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //translate user identifier (e.g. email, name...) into the associated GUIDs\n _this.discoverGUIDPerUserIdentifier(userIdentifier).then(function (guids) {\n var dataObjectsPromises = guids.map(function (guid) {\n return new Promise(function (resolve, reject) {\n _this.discoverDataObjectsPerGUID(guid, dataSchemes, resources).then(function (dataObjects) {\n resolve(dataObjects);\n }).catch(function (err) {\n resolve([]);\n });\n });\n });\n Promise.all(dataObjectsPromises).then(function (dataObjectsResult) {\n var dataObjects = [].concat.apply([], dataObjectsResult);\n\n if (dataObjects.length === 0) {\n return reject('No dataObjects were found');\n }\n\n resolve(dataObjects);\n });\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some GUID\r\n * @param {String} guid\r\n * @param {Array} dataSchemes (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverHypertiesPerGUID\",\n value: function discoverHypertiesPerGUID(guid, dataSchemes, resources) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //translate GUID into the user IDs to query the domain registry\n _this.discoverUserIdsPerGUID(guid).then(function (uids) {\n //translate user IDs into the associated hyperties registered in some domain\n var hypertiesPromises = uids.map(function (uid) {\n return new Promise(function (resolve, reject) {\n _this.discoverHyperties(uid.uID, dataSchemes, resources, uid.domain).then(function (hyperties) {\n resolve(hyperties);\n }).catch(function (err) {\n resolve([]);\n });\n });\n });\n Promise.all(hypertiesPromises).then(function (hypertiesResult) {\n var hyperties = [].concat.apply([], hypertiesResult);\n\n if (hyperties.length === 0) {\n return reject('No hyperties were found');\n } // log.log('Hyperties : ', hyperties);\n\n\n resolve(hyperties);\n });\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /**\r\n * Advanced Search for DataObjects registered in domain registry associated with some GUID\r\n * @param {String} guid\r\n * @param {Array} dataSchemes (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverDataObjectsPerGUID\",\n value: function discoverDataObjectsPerGUID(guid, dataSchemes, resources) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //translate GUID into the user IDs to query the domain registry\n _this.discoverUserIdsPerGUID(guid).then(function (uids) {\n //translate user IDs into the associated dataObjects registered in some domain\n var dataObjectPromises = uids.map(function (uid) {\n return new Promise(function (resolve, reject) {\n _this.discoverDataObjects(uid.uID, dataSchemes, resources, uid.domain).then(function (dataObjects) {\n resolve(dataObjects);\n }).catch(function (err) {\n resolve([]);\n });\n });\n });\n Promise.all(dataObjectPromises).then(function (dataObjectsResult) {\n var dataObjects = [].concat.apply([], dataObjectsResult);\n\n if (dataObjects.length === 0) {\n return reject('No dataObjects were found');\n } // log.log('DataObjects : ', dataObjects);\n\n\n resolve(dataObjects);\n });\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /** Advanced Search for Hyperties registered in domain registry and associated with some user ID\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} dataSchemes (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverHyperties\",\n value: function discoverHyperties(user, dataSchemes, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {}\n };\n\n if (user.indexOf('user://') > -1) {\n msg.body.resource = user;\n } else {\n msg.body.resource = '/hyperty/idp-identifier/' + user;\n }\n\n if (dataSchemes.length > 0) {\n if (!msg.body.criteria) {\n msg.body.criteria = {};\n }\n\n msg.body.criteria.dataSchemes = dataSchemes;\n }\n\n if (resources.length > 0) {\n if (!msg.body.criteria) {\n msg.body.criteria = {};\n }\n\n msg.body.criteria.resources = resources;\n }\n\n return new Promise(function (resolve, reject) {\n // log.log(\"[CoreDiscovery.discoverHyperties] sending msg \", msg);\n _this.messageBus.postMessage(msg, function (reply) {\n // log.log(\"[CoreDiscovery.discoverHyperties] rcved reply \", reply);\n if (reply.body.code === 200 || reply.body.code === 500) {\n var hyperties = reply.body.value;\n var finalHyperties = [];\n\n for (var key in hyperties) {\n finalHyperties.push(hyperties[key]);\n }\n\n if (finalHyperties.length > 0) {\n // log.log(\"[CoreDiscovery.discoverHyperties] Hyperties Found: \", finalHyperties);\n resolve(finalHyperties);\n } else {\n return reject('No Hyperty was found');\n }\n } else {\n return reject('No Hyperty was found');\n }\n /*_this.registry.isLegacy(user).then((legacy) => {\r\n if (legacy) resolve([{hypertyID: user }])\r\n else return reject('No Hyperty was found');\r\n });*/\n\n });\n });\n }\n /** Advanced Search for DataObjects registered in domain registry and associated with some user ID\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} dataSchemes (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjects\",\n value: function discoverDataObjects(user, dataSchemes, resources, domain) {\n var _this = this;\n\n var activeDomain;\n var dataObjectsArray = [];\n activeDomain = !domain ? _this.domain : domain;\n return new Promise(function (resolve, reject) {\n //translate user identifier (e.g. email, name...) into the associated hyperties\n _this.discoverHyperties(user, [], [], activeDomain).then(function (hyperties) {\n var finalHyperties = [];\n\n for (var key in hyperties) {\n finalHyperties.push(hyperties[key]);\n } //translate hyperties URLs into the associated dataObjects registered in some domain\n\n\n var dataObjectsPromises = finalHyperties.map(function (hyperty) {\n return new Promise(function (resolve, reject) {\n _this.discoverDataObjectsPerReporter(hyperty.hypertyID, dataSchemes, resources, activeDomain).then(function (dataObject) {\n resolve(dataObject);\n }).catch(function (err) {\n resolve([]);\n });\n });\n });\n Promise.all(dataObjectsPromises).then(function (dataObjectsResult) {\n var dataObjects = [].concat.apply([], dataObjectsResult);\n dataObjects.forEach(function (dataObject) {\n dataObjectsArray.push(dataObject);\n });\n var finalDataObjects = [];\n\n for (var key in dataObjectsArray) {\n finalDataObjects.push(dataObjectsArray[key]);\n }\n\n if (finalDataObjects.length === 0) {\n return reject('No dataObjects were found');\n } // log.log('DataObjects Found: ', finalDataObjects);\n\n\n resolve(finalDataObjects);\n });\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /**\r\n * function to request about hyperties registered in domain registry, and\r\n * return the hyperty information, if found.\r\n * @param {String} url dataObject URL\r\n * @param {String} domain (Optional)\r\n * @return {Promise} Promise\r\n */\n\n }, {\n key: \"discoverHypertyPerURL\",\n value: function discoverHypertyPerURL(url, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: url\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code !== 200 && reply.body.code !== 500) {\n return reject('No Hyperty was found');\n }\n\n var hyperty = reply.body.value;\n\n if (hyperty) {\n // log.log('Hyperty found: ', hyperty);\n resolve(hyperty);\n } else {\n return reject('No Hyperty was found');\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * return the dataObject information, if found.\r\n * @param {String} url dataObject URL\r\n * @param {String} domain (Optional)\r\n * @return {Promise} Promise\r\n */\n\n }, {\n key: \"discoverDataObjectPerURL\",\n value: function discoverDataObjectPerURL(url, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: url\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n var dataObject = reply.body.value;\n\n if (dataObject) {\n // log.log('DataObject found: ', dataObject);\n resolve(dataObject);\n } else {\n return reject('DataObject not found');\n }\n });\n });\n }\n /** Advanced Search for dataObjects registered in domain registry\r\n * @param {String} name name of the dataObject\r\n * @param {Array} dataSchemes (Optional) types of dataObject schemas\r\n * @param {Array} resources (Optional) types of dataObject resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjectsPerName\",\n value: function discoverDataObjectsPerName(name, dataSchemes, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: name\n }\n };\n\n if (dataSchemes.length > 0) {\n if (!msg.body.criteria) {\n msg.body.criteria = {};\n }\n\n msg.body.criteria.dataSchemes = dataSchemes;\n }\n\n if (resources.length > 0) {\n if (!msg.body.criteria) {\n msg.body.criteria = {};\n }\n\n msg.body.criteria.resources = resources;\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n var dataObjects = reply.body.value;\n var finalDataObjects = [];\n\n for (var key in dataObjects) {\n finalDataObjects.push(dataObjects[key]);\n }\n\n if (finalDataObjects.length > 0) {\n // log.log(\"DataObjects Found: \", finalDataObjects);\n resolve(finalDataObjects);\n } else {\n return reject('No DataObject was found');\n }\n });\n });\n }\n /**\r\n * function to request about specific reporter dataObject registered in domain registry, and\r\n * return the dataObjects from that reporter.\r\n * @param {String} reporter dataObject reporter\r\n * @param {Array} scdataSchemeshema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectsPerReporter\",\n value: function discoverDataObjectsPerReporter(reporter, dataSchemes, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: '/comm',\n criteria: {\n reporter: reporter\n }\n }\n };\n\n if (dataSchemes.length > 0) {\n msg.body.criteria.dataSchemes = dataSchemes;\n }\n\n if (resources.length > 0) {\n msg.body.criteria.resources = resources;\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n var dataObjects = reply.body.value;\n var finalDataObjects = [];\n\n for (var key in dataObjects) {\n finalDataObjects.push(dataObjects[key]);\n }\n\n if (finalDataObjects.length > 0) {\n // log.log(\"DataObjects Found: \", finalDataObjects);\n resolve(finalDataObjects);\n } else {\n return reject('No DataObject was found');\n }\n });\n });\n }\n /**\r\n * function to request global registry about the user IDs associated with some GUID\r\n * @param {String} guid\r\n * @return {Promise} Promise\r\n */\n\n }, {\n key: \"discoverUserIdsPerGUID\",\n value: function discoverUserIdsPerGUID(guid) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n // log.log(\"GO graphConnector:\", guid);\n _this.graphConnector.queryGlobalRegistry(guid).then(function (graphConnectorContactData) {\n // log.log('Information returned from Global Registry: ', graphConnectorContactData);\n if (typeof graphConnectorContactData === 'string' || !graphConnectorContactData) {\n return reject('Unsuccessful discover userIDs by GUID');\n } else {\n var userids = graphConnectorContactData.userIDs;\n\n if (userids.length === 0) {\n return reject('UserIDs not available');\n }\n\n resolve(userids);\n }\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /**\r\n * function to request discovery service about the GUID associated with some user identifier (eg email, name ...)\r\n * @param {String} userIdentifier\r\n * @return {Promise} Promise\r\n */\n\n }, {\n key: \"discoverGUIDPerUserIdentifier\",\n value: function discoverGUIDPerUserIdentifier(userIdentifier) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var lookupURLDiscoveryService = 'https://rethink.tlabscloud.com/discovery/rest/discover/lookup?searchquery=';\n\n _this.httpRequest.get(lookupURLDiscoveryService + userIdentifier).then(function (json) {\n // log.log('discover GUID by user identifier', json);\n var response = JSON.parse(json);\n var filteredGuid = response.results.filter(function (x) {\n return x.rethinkID != undefined;\n });\n\n if (filteredGuid.length === 0) {\n return reject('Unsuccessful discover GUID by user identifier');\n }\n\n var guids = filteredGuid.map(function (x) {\n return x.rethinkID;\n });\n return resolve(guids);\n }).catch(function (err) {\n // log.log(\"HTTP Request error: \", err);\n return reject(err);\n });\n });\n }\n }, {\n key: \"messageBus\",\n get: function get() {\n return this._messageBus;\n }\n /**\r\n * Sets the MessageBus.\r\n * @param {MessageBus} messageBus The Message Bus.\r\n */\n ,\n set: function set(messageBus) {\n this._messageBus = messageBus;\n }\n }]);\n\n return CoreDiscovery;\n}();\n\n/* harmony default export */ var discovery_CoreDiscovery = (CoreDiscovery_CoreDiscovery);\n// CONCATENATED MODULE: ./src/store-objects/DataObjectsStorage.js\nfunction DataObjectsStorage_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObjectsStorage_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectsStorage_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObjectsStorage_typeof(obj); }\n\nfunction DataObjectsStorage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectsStorage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectsStorage_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectsStorage_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectsStorage_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar DataObjectsStorage_log = loglevel[\"getLogger\"]('DataObjectsStorage');\n\n\n\nvar DataObjectsStorage_DataObjectsStorage =\n/*#__PURE__*/\nfunction () {\n function DataObjectsStorage(storageManager) {\n var storedDataObjects = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var factory = arguments.length > 2 ? arguments[2] : undefined;\n var runtimeStatusUpdate = arguments.length > 3 ? arguments[3] : undefined;\n\n DataObjectsStorage_classCallCheck(this, DataObjectsStorage);\n\n if (!storageManager) throw new Error('[Store Data Objects] - Needs the storageManager component');\n this._storageManager = storageManager;\n this._storeDataObject = storedDataObjects;\n this._cache = {};\n this._createSyncDB = createSyncDB; // to create Data Objects to be synched with remote storages\n\n this._remotes = {}; // List of DO synched with remote storages\n\n this._factory = factory;\n this._table = 'syncherManager:ObjectURLs';\n this._remoteStorageTable = 'dataObjectStorage';\n this._remoteSchema = 'url';\n this._runtimeStatusUpdate = runtimeStatusUpdate;\n } // load Data Objects synched with remote Storages\n\n\n DataObjectsStorage_createClass(DataObjectsStorage, [{\n key: \"loadRemote\",\n value: function loadRemote() {\n var _this2 = this;\n\n var resume = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var loading = [];\n var loadingDBs = [];\n\n _this._storageManager.get(null, null, 'remotes').then(function (remotes) {\n // in case we don't have any remotes locally stored\n DataObjectsStorage_log.info('[StoreDataObjects.loadRemote] remotes: ', remotes);\n if (!remotes) resolve();\n if (!resume) _this._remotes = remotes;\n DataObjectsStorage_log.info('[StoreDataObjects.loadRemote] loading: ', _this._remotes);\n var remoteObjects = Object.keys(remotes); // in case we don't have any remotes locally stored\n\n if (remoteObjects.length === 0) resolve();\n remoteObjects.forEach(function (db) {\n var schema = {};\n var table = db.split('/')[3];\n schema[table] = _this2._remoteSchema;\n _this._remotes[db] = createSyncDB(db, _this2._factory, schema, _this2._runtimeStatusUpdate); // _this._remotes[remote] = createSyncDB(remote, _this._factory, 'remoteDataObjectStorage' );\n\n loading.push(_this._remotes[db].get(null, null, table));\n });\n Promise.all(loading).then(function () {\n DataObjectsStorage_log.log('[StoreDataObjects.loadRemote] loaded. Starting init'); //TODO: init this._storeDataObject with loaded data objects\n\n Object.keys(_this._remotes).forEach(function (remote) {\n var table = remote.split('/')[3];\n loadingDBs.push(_this._remotes[remote].get(null, null, table));\n });\n Promise.all(loadingDBs).then(function (dataObjs) {\n if (dataObjs.length === 0) resolve();\n dataObjs.forEach(function (dO) {\n Object.keys(dO).forEach(function (url) {\n DataObjectsStorage_log.log('[StoreDataObjects.loadRemote] loaded remote ', dO[url]); // if (dO[remote].isReporter) {\n\n var type = _this2._getTypeOfObject(dO[url].isReporter);\n\n if (!_this._storeDataObject) _this._storeDataObject = {};\n if (!_this._storeDataObject.hasOwnProperty(type)) _this._storeDataObject[type] = {};\n _this._storeDataObject[type][url] = dO[url];\n });\n });\n resolve(_this._storeDataObject);\n }, function (error) {\n reject(error);\n });\n });\n }, function (error) {\n reject(error);\n });\n\n resolve();\n });\n } // delete Data Objects synched with remote Storages\n\n }, {\n key: \"deleteRemotes\",\n value: function deleteRemotes() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var deleting = [];\n var disconnecting = [];\n\n _this._storageManager.get(null, null, 'remotes').then(function (remotes) {\n // in case we don't have any remotes locally stored\n DataObjectsStorage_log.info('[StoreDataObjects.deleteRemotes] remotes: ', remotes);\n if (!remotes) resolve();\n var remoteObjects = Object.keys(_this._remotes); // in case we don't have any remotes locally stored\n\n if (remoteObjects.length === 0) resolve();\n remoteObjects.forEach(function (db) {\n deleting.push(_this._remotes[db].disconnect());\n deleting.push(_this._remotes[db].delete());\n });\n Promise.all(deleting).then(function () {\n DataObjectsStorage_log.log('[StoreDataObjects.deleteRemotes] deleted.');\n resolve();\n }, function (error) {\n resolve();\n });\n });\n\n resolve();\n });\n }\n /**\r\n * @description should set the initial state of the dataObjectURL to be resumed if necessary;\r\n *\r\n * @param {DataObjectURL} url - dataObjectURL to be saved;\r\n * @param {Boolean} isReporter - the object to be saved is a reporter\r\n * @param {SchemaURL} schema - the schema url\r\n * @param {String} status - the status of current dataObject\r\n * @param {HypertyURL} reporter - the Reporter hypertyURL\r\n * @param {Array} subscription - list of subscriptions\r\n * @param {Array} children - list of childs of dataObjectURL\r\n * @param {Array} childrens - list of childrens, like, 'chatmessage';\r\n * @param {Array {\r\n \r\n console.log('[DataObjectStorage.initialObserverSync] connected ');\r\n \r\n setTimeout(function() {\r\n _this._remotes[resource].disconnect().then(()=>{\r\n console.log('[DataObjectStorage.initialObserverSync] disconnected ');\r\n },(error)=> {\r\n log.error('[DataObjectStorage.initialObserverSync] Error disconnecting with remote storage');\r\n reject(error);\r\n });\r\n }, 15000)\r\n \r\n }, (error) => {\r\n log.error('[DataObjectStorage.initialObserverSync] Error connecting to remote storage');\r\n reject(error)\r\n });\r\n \r\n }*/\n\n /**\r\n * @description should save and update the current dataObject data information\r\n *\r\n * @param {Boolean} isReporter - the object to be saved is a reporter\r\n * @param {DataObjectURL} resource - dataObjectURL to be saved or updated;\r\n * @param {String} attribute - attribute inside the data which will be saved\r\n * @param {any} data - value will be saved inside the attribute;\r\n */\n\n }, {\n key: \"saveData\",\n value: function saveData(isReporter, resource, attribute, value, updateRuntimeStatus) {\n var storeDataObject = this._storeDataObject;\n\n var type = this._getTypeOfObject(isReporter);\n\n if (!storeDataObject || !storeDataObject[type] || !storeDataObject[type][resource]) {\n DataObjectsStorage_log.log('[StoreDataObjects - save data] - not saved');\n return;\n }\n\n DataObjectsStorage_log.log('[StoreDataObjects - saveData] - ', isReporter, type, resource, attribute, value);\n\n if (!storeDataObject[type][resource].hasOwnProperty('data')) {\n storeDataObject[type][resource].data = {};\n }\n\n if (attribute) {\n var _data;\n\n if (DataObjectsStorage_typeof(value) === 'object') _data = deepClone(value);else _data = value;\n utils_assign(storeDataObject[type][resource].data, attribute, _data);\n } else {\n storeDataObject[type][resource].data = deepClone(value) || {};\n }\n\n this._storeDataObject = storeDataObject;\n var db = storeDataObject[type][resource].backup ? storeDataObject[type][resource].url : 'syncherManager:ObjectURLs';\n var storage = storeDataObject[type][resource].backup ? this._remotes[db] : this._storageManager;\n var table = storeDataObject[type][resource].backup ? db.split('/')[3] : this._table;\n var data = storeDataObject[type][resource].backup ? storeDataObject[type][resource] : this._filterRemotes(storeDataObject);\n storage.set(db, 1, data, table, updateRuntimeStatus).then(function () {\n return storeDataObject[type][resource];\n }, function (error) {\n console.error(error);\n return storeDataObject[type][resource];\n });\n }\n }, {\n key: \"saveChildrens\",\n value: function saveChildrens(isReporter, resource, attribute, value) {\n var storeDataObject = this._storeDataObject;\n\n var type = this._getTypeOfObject(isReporter);\n\n if (!storeDataObject || !storeDataObject[type] || !storeDataObject[type][resource]) {\n DataObjectsStorage_log.log('[StoreDataObjects - save childrens] - not saved');\n return;\n }\n\n if (!storeDataObject[type][resource].hasOwnProperty('childrens')) {\n storeDataObject[type][resource].childrenObjects = {};\n }\n /* if (!storeDataObject[type][resource].childrenObjects.hasOwnProperty('resources')) {\r\n storeDataObject[type][resource].childrenObjects.resources = {};\r\n }*/\n\n\n if (attribute) {\n utils_assign(storeDataObject[type][resource].childrenObjects, attribute, deepClone(value));\n } else {\n storeDataObject[type][resource].childrenObjects = deepClone(value) || {};\n }\n\n this._storeDataObject = storeDataObject;\n var db = storeDataObject[type][resource].backup ? storeDataObject[type][resource].url : 'syncherManager:ObjectURLs';\n var storage = storeDataObject[type][resource].backup ? this._remotes[db] : this._storageManager;\n var table = storeDataObject[type][resource].backup ? db.split('/')[3] : this._table;\n var data = storeDataObject[type][resource].backup ? storeDataObject[type][resource] : this._filterRemotes(storeDataObject);\n storage.set(db, 1, data, table).then(function () {\n return storeDataObject[type][resource];\n });\n }\n /**\r\n * @description should save and update the current dataObject information\r\n *\r\n * @param {Boolean} isReporter - the object to be saved is a reporter\r\n * @param {DataObjectURL} resource - dataObjectURL to be saved or updated;\r\n * @param {String} attribute - attribute inside the data which will be saved\r\n * @param {any} data - value will be saved inside the attribute;\r\n */\n\n }, {\n key: \"update\",\n value: function update(isReporter, resource, attribute, value, updateRuntimeStatus) {\n var storeDataObject = this._storeDataObject;\n\n var type = this._getTypeOfObject(isReporter);\n\n if (!storeDataObject || !storeDataObject[type] || !storeDataObject[type][resource]) {\n DataObjectsStorage_log.log('[StoreDataObjects - update] - not saved');\n return;\n }\n\n DataObjectsStorage_log.log('[StoreDataObjects - update] - ', isReporter, type, resource, attribute, value);\n\n if (storeDataObject[type] && storeDataObject[type][resource] && resource && attribute && value) {\n if (attribute === 'subscriptions' || attribute === 'subscriberUsers') {\n var update = true;\n\n if (attribute === 'subscriptions') {\n update = !this._isOwner(storeDataObject[type][resource], value);\n }\n\n if (update) this._updateToArray(storeDataObject[type], resource, attribute, value);\n } else {\n storeDataObject[type][resource][attribute] = value;\n }\n\n this._storeDataObject = storeDataObject;\n var db = storeDataObject[type][resource].backup ? storeDataObject[type][resource].url : 'syncherManager:ObjectURLs';\n var storage = storeDataObject[type][resource].backup ? this._remotes[db] : this._storageManager;\n var table = storeDataObject[type][resource].backup ? db.split('/')[3] : this._table;\n var data = storeDataObject[type][resource].backup ? storeDataObject[type][resource] : this._filterRemotes(storeDataObject);\n storage.set(db, 1, data, table, updateRuntimeStatus).then(function () {\n return storeDataObject[type][resource];\n });\n }\n }\n /**\r\n * @description should delete stored information from the dataObject\r\n *\r\n * @param {Boolean} isReporter - the object to be saved is a reporter\r\n * @param {DataObjectURL} resource - dataObjectURL to be saved or updated;\r\n * @param {String} attribute - attribute inside the data which will be saved\r\n * @param {any} data - value will be saved inside the attribute;\r\n */\n\n }, {\n key: \"delete\",\n value: function _delete(isReporter, resource, attribute, value) {\n var storeDataObject = this._storeDataObject;\n\n var type = this._getTypeOfObject(isReporter);\n\n if (!storeDataObject || !storeDataObject[type] || !storeDataObject[type][resource]) {\n DataObjectsStorage_log.log('[StoreDataObjects - delete] - not saved');\n return;\n }\n\n if (storeDataObject[type] && storeDataObject[type][resource] && resource && attribute && value) {\n if (attribute === 'subscriptions' || attribute === 'subscriberUsers') {\n this._removeFromArray(storeDataObject[type], resource, attribute, value);\n } else {\n delete storeDataObject[type][resource][attribute];\n }\n\n this._storeDataObject = storeDataObject;\n var db = storeDataObject[type][resource].backup ? storeDataObject[type][resource].url : 'syncherManager:ObjectURLs';\n var storage = storeDataObject[type][resource].backup ? this._remotes[db] : this._storageManager;\n var table = storeDataObject[type][resource].backup ? db.split('/')[3] : this._table;\n var data = storeDataObject[type][resource].backup ? storeDataObject[type][resource] : this._filterRemotes(storeDataObject);\n storage.set(db, 1, data, table);\n return storeDataObject[type][resource];\n }\n }\n /**\r\n * Delete Data Object from the storage\r\n */\n\n }, {\n key: \"deleteResource\",\n value: function deleteResource(resource) {\n var _this4 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (resource) {\n // return this.getAll().then((storedDataObjects) => {\n DataObjectsStorage_log.info('[DataObjectStorage.deleteResource] deleting: ', resource); // let this._storeDataObject = Object.assign(this._storeDataObject || {});\n\n var backup;\n var db;\n var storage;\n\n if (_this._storeDataObject.hasOwnProperty('observers') && _this._storeDataObject.observers.hasOwnProperty(resource)) {\n backup = _this._storeDataObject.observers[resource].backup ? true : false;\n db = backup ? _this._storeDataObject.observers[resource].url : 'syncherManager:ObjectURLs';\n storage = backup ? _this._remotes[db] : _this._storageManager;\n delete _this._storeDataObject.observers[resource];\n }\n\n if (_this._storeDataObject.hasOwnProperty('reporters') && _this._storeDataObject.reporters.hasOwnProperty(resource)) {\n backup = _this._storeDataObject.reporters[resource].backup ? true : false;\n db = backup ? _this._storeDataObject.reporters[resource].url : 'syncherManager:ObjectURLs';\n storage = backup ? _this._remotes[db] : _this._storageManager;\n delete _this._storeDataObject.reporters[resource];\n } // this._storeDataObject = this._storeDataObject;\n\n\n if (backup && storage) {\n storage.delete().then(function () {\n delete _this._remotes[db];\n\n _this._storageManager.delete(resource, null, 'remotes');\n });\n } else {\n storage.set(db, 1, _this4._filterRemotes(_this._storeDataObject));\n }\n\n return resolve(); // });\n } else {\n reject(new Error('[StoreDataObjects] - Can\\'t delete this ' + resource));\n }\n });\n }\n }, {\n key: \"getAll\",\n value: function getAll() {\n var _this5 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._storeDataObject = _this5._storageManager.get('syncherManager:ObjectURLs').then(function (objects) {\n _this._storeDataObject = objects;\n\n _this.loadRemote(true).then(function (storedObjects) {\n resolve(_this._storeDataObject);\n });\n });\n }); // return this._storageManager.get('syncherManager:ObjectURLs');\n } // To sync local storage with remote storage server\n\n }, {\n key: \"sync\",\n value: function sync(resource, backupRevision) {\n var once = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var _this = this;\n\n if (_this._remotes[resource]) {\n var table = resource.split('/')[3];\n if (backupRevision) return _this._sync(resource, backupRevision, once, table);else _this._remotes[resource].getBackupRevision(resource).then(function (backupRevision) {\n return _this._sync(resource, backupRevision, once, table);\n });\n } else {\n var info = '[DataObjectStorage.sync] Info: ' + resource + ' is not synched with remote storage.';\n DataObjectsStorage_log.info(info); // reject(info);\n }\n }\n }, {\n key: \"_sync\",\n value: function _sync(resource, backupRevision, once, table) {\n var _this = this;\n\n console.log('[DataObjectStorage._sync] backupRevision: ', backupRevision);\n return new Promise(function (resolve, reject) {\n var options = {\n table: table,\n observer: false,\n syncedRevision: backupRevision + 3\n };\n\n _this._remotes[resource].connect(options).then(function () {\n DataObjectsStorage_log.info('[DataObjectStorage.sync] connected with remote ');\n\n _this._remotes[resource].get(null, null, table).then(function (dataObject) {\n // this._remotes[resource].get().then((dataObject)=>{\n DataObjectsStorage_log.info('[DataObjectStorage.sync] returning synched DO: ', dataObject);\n\n if (once) {\n setTimeout(function () {\n _this._remotes[resource].disconnect().then(function () {\n DataObjectsStorage_log.info('[DataObjectStorage.sync] disconnected '); // resolve(dataObject[resource]);\n }, function (error) {\n DataObjectsStorage_log.error('[DataObjectStorage.sync] Error synching with remote storage');\n reject(error);\n });\n }, 2000);\n }\n\n resolve(dataObject[resource]);\n }, function (error) {\n DataObjectsStorage_log.error('[DataObjectStorage.sync] Error retrieving stored data object');\n reject(error);\n });\n }, function (error) {\n DataObjectsStorage_log.error('[DataObjectStorage.sync] Error connecting to remote storage ', error);\n\n _this._remotes[resource].get(null, null, table).then(function (dataObject) {\n DataObjectsStorage_log.info('[DataObjectStorage.sync] returning synched DO: ', dataObject);\n resolve(dataObject[resource]);\n });\n });\n });\n }\n }, {\n key: \"stopSync\",\n value: function stopSync(resource) {\n if (this._remotes[resource]) this._remotes[resource].disconnect();\n }\n /**\r\n * @description should look for a specific dataObjectURL\r\n *\r\n * @param {DataObjectURL} resource - the dataObjectURL will be searched\r\n *\r\n * @returns Promise object with the dataObject information;\r\n */\n\n }, {\n key: \"getDataObject\",\n value: function getDataObject(resource) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n /* this._remotes[resource].get().then((dataObject)=> {\r\n return resolve(dataObject);\r\n } , () => {\r\n this._storageManager.get('syncherManager:ObjectURLs').then((storedDataObject) => {*/\n var storedDataObject = _this6._storeDataObject;\n var observers = storedDataObject.hasOwnProperty('observers') ? storedDataObject.observers : {};\n var reporters = storedDataObject.hasOwnProperty('reporters') ? storedDataObject.reporters : {};\n var currentReporter = Object.keys(reporters).find(function (value) {\n return value === resource;\n });\n var currentObserver = Object.keys(observers).find(function (value) {\n return value === resource;\n });\n var dataObject;\n\n if (currentObserver) {\n dataObject = storedDataObject.observers[currentObserver];\n }\n\n if (currentReporter) {\n dataObject = storedDataObject.reporters[currentReporter];\n }\n\n DataObjectsStorage_log.info('[StoreDataObjects - getDataObject] - for observer: ', currentObserver);\n DataObjectsStorage_log.info('[StoreDataObjects - getDataObject] - for reporters: ', currentReporter);\n DataObjectsStorage_log.info('[StoreDataObjects - getDataObject] - resolve: ', dataObject);\n return dataObject ? resolve(dataObject) : reject('No dataObject was found'); // });\n // });\n });\n }\n /**\r\n * @description should get the dataObject information by the message\r\n *\r\n * @param {Object} msg - message would be analised to get the current dataObject information\r\n * @param {Boolean} isReporter - the object to be saved is a reporter\r\n *\r\n * @returns Promise should retun an object with the dataObject or null\r\n */\n\n }, {\n key: \"getResourcesByCriteria\",\n value: function getResourcesByCriteria(msg, isReporter) {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n var type = _this7._getTypeOfObject(isReporter); // this.getAll(isReporter).then((storedDataObjects) => {\n\n\n var storedDataObjects = _this7._storeDataObject;\n\n if (!storedDataObjects) {\n DataObjectsStorage_log.log('[DataObjectsStorage.getResourcesByCriteria] don\\'t have stored data objects');\n return resolve(null);\n }\n\n if (msg.body && msg.body.hasOwnProperty('resume') && !msg.body.resume) {\n return resolve(null);\n } // check if the message have other criteria\n // if not search for on the 'from' of the message.\n\n\n var result = [];\n\n var hasSubscription = _this7._hasSubscription(storedDataObjects[type], msg.from);\n\n var isOwner = _this7._searchOwner(storedDataObjects[type], msg.from);\n\n var isToProtoStubResume = _this7._checkProtostubResume(storedDataObjects, msg);\n\n DataObjectsStorage_log.log('[StoredDataObjects - getResourcesByCriteria]:', storedDataObjects, msg, hasSubscription, isOwner);\n\n if (msg.hasOwnProperty('from') && hasSubscription || isOwner || isToProtoStubResume) {\n var resource;\n\n if (isOwner) {\n resource = _this7._getResourcesByOwner(storedDataObjects[type], msg.from);\n } else {\n resource = _this7._getResourcesBySubscription(storedDataObjects[type], msg.from);\n }\n\n var identityFoundData = [];\n if (msg.body && msg.body.identity) identityFoundData = _this7._getResourcesByIdentity(storedDataObjects[type], msg.body.identity); //TODO: remove schema since metadata already includes the schema?\n\n var schemaFoundData = [];\n if (msg.body && msg.body.schema) schemaFoundData = _this7._getResourcesBySchema(storedDataObjects[type], msg.body.schema);\n var metadataFound = [];\n\n if (msg.body && msg.body.value) {\n var metadata = msg.body.value;\n delete metadata.data;\n metadataFound = _this7._getResourcesByMetadata(storedDataObjects[type], metadata);\n }\n\n var dataFound = [];\n if (msg.body && msg.body.value && msg.body.value.data) dataFound = _this7._getResourcesByData(storedDataObjects[type], msg.body.value.data); // you can pass as arrays as you want.. it will be merged in on place\n // removed duplicates;\n\n result = _this7._intersection(resource, identityFoundData, schemaFoundData, dataFound, metadataFound);\n\n if (result.length == 0 && isToProtoStubResume && type == 'observers' && msg.from.split('protostub').length > 0) {\n var storedObservers = storedDataObjects[type];\n var fromDomain = divideURL(msg.from).domain;\n Object.keys(storedObservers).filter(function (objectURL) {\n var subscriptions = storedObservers[objectURL].subscriptions;\n var hasSubscription = false;\n subscriptions.forEach(function (subscription) {\n var subscriptionDomain = divideURL(subscription).domain;\n\n if (subscriptionDomain == fromDomain) {\n result.push(objectURL);\n }\n });\n });\n }\n } else {\n return resolve(null);\n }\n\n var init = {};\n result.forEach(function (key) {\n var currentIsReporter = storedDataObjects[type][key];\n init[key] = currentIsReporter;\n return init;\n });\n DataObjectsStorage_log.log('[Store Data Objects] - ', init);\n resolve(init);\n }); // });\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_getResourcesByIdentity\",\n value: function _getResourcesByIdentity(storedData, userURL) {\n if (!storedData) return [];\n return Object.keys(storedData).filter(function (objectURL) {\n return storedData[objectURL].subscriberUsers.filter(function (current) {\n return current === userURL;\n }).length;\n });\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_getResourcesByOwner\",\n value: function _getResourcesByOwner(storedData, owner) {\n if (!storedData) return [];\n return Object.keys(storedData).filter(function (objectURL) {\n return storedData[objectURL].reporter === owner;\n });\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_getResourcesBySubscription\",\n value: function _getResourcesBySubscription(storedData, subscription) {\n if (!storedData) return [];\n return Object.keys(storedData).filter(function (objectURL) {\n return storedData[objectURL].subscriptions.filter(function (current) {\n return current === subscription;\n }).length;\n });\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_getResourcesBySchema\",\n value: function _getResourcesBySchema(storedData, schema) {\n return Object.keys(storedData).filter(function (objectURL) {\n var currentObject = storedData[objectURL];\n return Object.keys(currentObject).filter(function (key) {\n return key === 'schema' && currentObject[key] === schema;\n }).length;\n });\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_getResourcesByMetadata\",\n value: function _getResourcesByMetadata(storedData, metadata) {\n if (!metadata) return [];\n return Object.keys(storedData).filter(function (objectURL) {\n var currentObject = storedData[objectURL];\n return Object.keys(currentObject).filter(function (key) {\n // search on storeDataObjects for specific key provided from data;\n return Object.keys(metadata).filter(function (searchFor) {\n return key === searchFor && currentObject[key] === metadata[searchFor];\n }).length;\n }).length;\n });\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_getResourcesByData\",\n value: function _getResourcesByData(storedData, data) {\n if (!data) return [];\n return Object.keys(storedData).filter(function (objectURL) {\n var currentObject = storedData[objectURL].hasOwnProperty('data') ? storedData[objectURL].data : {};\n return Object.keys(currentObject).filter(function (key) {\n // search on storeDataObjects for specific key provided from data;\n return Object.keys(data).filter(function (searchFor) {\n return key === searchFor && currentObject[key] === data[searchFor];\n }).length;\n }).length;\n });\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_hasSubscription\",\n value: function _hasSubscription(storedData, subscription) {\n if (!storedData) return false;\n return Object.keys(storedData).filter(function (objectURL) {\n return storedData[objectURL].subscriptions.filter(function (current) {\n return current === subscription;\n }).length;\n }).length > 0 ? true : false;\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_searchOwner\",\n value: function _searchOwner(storedData, from) {\n if (!storedData) return false;\n return Object.keys(storedData).filter(function (objectURL) {\n return storedData[objectURL].reporter === from;\n }).length > 0 ? true : false;\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_checkProtostubResume\",\n value: function _checkProtostubResume(storedDataObjects, msg) {\n if (!storedDataObjects) return false;\n\n if (msg.hasOwnProperty('body') && msg.body.hasOwnProperty('value') && msg.body.value.hasOwnProperty('reporter')) {\n var reporter = msg.body.value.reporter;\n\n if (storedDataObjects.hasOwnProperty('reporters')) {\n var reportersStored = storedDataObjects.reporters;\n return Object.keys(reportersStored).filter(function (objectURL) {\n return reportersStored[objectURL].reporter === reporter;\n }).length > 0 ? true : false;\n } else {\n return false;\n }\n } else if (storedDataObjects.hasOwnProperty('observers')) {\n var storedObservers = storedDataObjects.observers;\n var fromDomain = divideURL(msg.from).domain;\n return Object.keys(storedObservers).filter(function (objectURL) {\n var subscriptions = storedObservers[objectURL].subscriptions;\n var hasSubscription = false;\n subscriptions.forEach(function (subscription) {\n var subscriptionDomain = divideURL(subscription).domain;\n\n if (subscriptionDomain == fromDomain) {\n hasSubscription = true;\n }\n });\n\n if (hasSubscription) {\n return true;\n }\n }).length > 0 ? true : false;\n }\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_isOwner\",\n value: function _isOwner(value, url) {\n if (!value) return false;\n return value.reporter === url ? true : false;\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_intersection\",\n value: function _intersection() {\n var args = Array.from(arguments);\n var result = args.reduce(function (first, second) {\n return first.concat(second);\n }).filter(function (value, index, self) {\n return self.indexOf(value) === index;\n });\n DataObjectsStorage_log.log('DataObjectsStorage._intersection] Result an unique array of strings: ', result);\n return result;\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_updateToArray\",\n value: function _updateToArray(storeDataObject, resource, key, value) {\n DataObjectsStorage_log.log('[DataObjectsStorage] - _updateToArray: ', storeDataObject, resource, key, value);\n if (storeDataObject[resource][key].indexOf(value) === -1) storeDataObject[resource][key].push(value);\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_removeFromArray\",\n value: function _removeFromArray(storeDataObject, resource, key, value) {\n var indexOfValue = storeDataObject[resource][key].indexOf(value);\n if (indexOfValue === -1) storeDataObject[resource][key].splice(indexOfValue, 1);\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_hasValue\",\n value: function _hasValue(obj, key, value) {\n return obj.hasOwnProperty(key) && obj[key] === value;\n }\n /**\r\n * @private\r\n * @todo documentation\r\n */\n\n }, {\n key: \"_getTypeOfObject\",\n value: function _getTypeOfObject(isReporter) {\n return isReporter ? 'reporters' : 'observers';\n }\n }]);\n\n return DataObjectsStorage;\n}();\n\n/* harmony default export */ var store_objects_DataObjectsStorage = (DataObjectsStorage_DataObjectsStorage);\n// CONCATENATED MODULE: ./src/utils/PromiseQueue.js\nfunction PromiseQueue_toConsumableArray(arr) { return PromiseQueue_arrayWithoutHoles(arr) || PromiseQueue_iterableToArray(arr) || PromiseQueue_nonIterableSpread(); }\n\nfunction PromiseQueue_nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction PromiseQueue_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction PromiseQueue_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction PromiseQueue_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction PromiseQueue_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction PromiseQueue_createClass(Constructor, protoProps, staticProps) { if (protoProps) PromiseQueue_defineProperties(Constructor.prototype, protoProps); if (staticProps) PromiseQueue_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar PromiseQueue =\n/*#__PURE__*/\nfunction () {\n // TODO: Improve this Queuing\n function PromiseQueue(concurrency) {\n PromiseQueue_classCallCheck(this, PromiseQueue);\n\n this.flushing = false;\n this.Promise = Promise;\n this.concurrency = typeof concurrency !== 'number' ? 1 : concurrency;\n this.promises = [];\n this.queue = [];\n this.isProcessing = false;\n }\n\n PromiseQueue_createClass(PromiseQueue, [{\n key: \"done\",\n value: function done(cb) {\n this.callback = cb;\n }\n }, {\n key: \"add\",\n value: function add(promise) {\n var _this = this;\n\n this.queue.push(promise);\n\n if (!this.isProcessing) {\n return this.queue.reduce(function (promiseChain, currentTask) {\n return promiseChain.then(function (chainResults) {\n return currentTask.then(function (currentResult) {\n return PromiseQueue_toConsumableArray(chainResults).concat([currentResult]);\n });\n });\n }, Promise.resolve([])).then(function (arrayOfResults) {\n // Do something with all results\n _this.isProcessing = false;\n });\n }\n }\n }]);\n\n return PromiseQueue;\n}();\n\n/* harmony default export */ var utils_PromiseQueue = (PromiseQueue);\n// CONCATENATED MODULE: ./src/hyperty-resource/HypertyResourcesStorage.js\nfunction HypertyResourcesStorage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyResourcesStorage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyResourcesStorage_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyResourcesStorage_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyResourcesStorage_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar HypertyResourcesStorage_log = loglevel[\"getLogger\"]('HypertyResourcesStorage');\n\n\n\nvar HypertyResourcesStorage_HypertyResourcesStorage =\n/*#__PURE__*/\nfunction () {\n function HypertyResourcesStorage(runtimeURL, bus, storageManager, hypertyResources) {\n HypertyResourcesStorage_classCallCheck(this, HypertyResourcesStorage);\n\n if (!storageManager) throw new Error('[HypertyResourcesStorage constructor] mandatory storageManager parameter missing');\n if (!runtimeURL) throw new Error('[HypertyResourcesStorage constructor] mandatory runtimeURL parameter missing');\n if (!bus) throw new Error('[HypertyResourcesStorage constructor] mandatory bus parameter missing');\n\n var _this = this;\n\n _this._bus = bus;\n _this._storageLimit = 0.9; // the save storageLimit;\n\n _this._url = runtimeURL + '/storage';\n _this._storageManager = storageManager;\n _this.promiseQueue = new utils_PromiseQueue();\n _this._hypertyResources = hypertyResources;\n bus.addListener(_this._url, function (msg) {\n HypertyResourcesStorage_log.info('[HypertyResourcesStorage] Message RCV: ', msg);\n\n switch (msg.type) {\n case 'create':\n _this._onCreate(msg);\n\n break;\n\n case 'read':\n _this._onRead(msg);\n\n break;\n\n case 'delete':\n _this._onDelete(msg);\n\n break;\n }\n });\n }\n /**\r\n * check the available storage quota\r\n *\r\n * @memberof HypertyResourcesStorage\r\n */\n\n\n HypertyResourcesStorage_createClass(HypertyResourcesStorage, [{\n key: \"checkStorageQuota\",\n value: function checkStorageQuota() {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n if (_this2._availableQuota && _this2._usage) {\n return resolve(availableSpace(_this2._usage, _this2._availableQuota));\n }\n\n if (navigator) {\n navigator.storage.estimate().then(function (estimate) {\n _this2._availableQuota = estimate.quota;\n _this2._usage = estimate.usage;\n resolve(availableSpace(_this2._usage, _this2._availableQuota));\n }).catch(function (reason) {\n HypertyResourcesStorage_log.error('[HypertyResourcesStorage] CheckStorageQuota error: ', reason);\n reject(reason);\n });\n }\n });\n }\n /**\r\n * @description should save an HypertyResource contained in the body of a create message request;\r\n *\r\n * @param {string} message - message containing the hyperty resource to be stored\r\n */\n\n }, {\n key: \"_onCreate\",\n value: function _onCreate(message) {\n var _this = this;\n\n if (!message.body || !message.body.value) throw new Error('[HypertyResourcesStorage._onCreate] mandatory message body value missing: ', message);\n var content = message.body.value;\n var contentURL = content.contentURL;\n var resourceURL = '';\n\n if (!contentURL) {\n contentURL = [];\n resourceURL = _this._url + '/' + generateGUID();\n } else {\n var currentURL = contentURL[0];\n var resource = currentURL.substr(currentURL.lastIndexOf('/') + 1);\n resourceURL = _this._url + '/' + resource;\n }\n\n if (!_this._hypertyResources.hasOwnProperty(resourceURL)) {\n contentURL.push(resourceURL);\n content.contentURL = contentURL;\n }\n\n this._hypertyResources[resourceURL] = content;\n this.promiseQueue.add(this._toSave(resourceURL, message, content));\n }\n }, {\n key: \"_toSave\",\n value: function _toSave(resourceURL, message, content) {\n var _this3 = this;\n\n return new Promise(function (resolve, reject) {\n var error = function error(reason) {\n var response = {\n from: message.to,\n to: message.from,\n id: message.id,\n type: 'response',\n body: {\n value: resourceURL,\n code: 500,\n description: reason\n }\n };\n\n _this3._bus.postMessage(response);\n\n return reject(reason);\n };\n\n _this3.checkStorageQuota().then(function (result) {\n if (content.size > result.quota) {\n var msg = 'The storage do not have space to store that resource';\n error(msg);\n throw Error(msg);\n }\n\n var spaceAvailable = result.quota;\n var allocated = result.usage + content.size;\n\n if (result.percent >= _this3._storageLimit || allocated > spaceAvailable) {\n return _this3._getOlderResources(content.size);\n } else {\n return true;\n }\n }).then(function () {\n return _this3._storageManager.set(resourceURL, 1, content);\n }).then(function () {\n var response = {\n from: message.to,\n to: message.from,\n id: message.id,\n type: 'response',\n body: {\n value: resourceURL,\n code: 200\n }\n };\n\n _this3._bus.postMessage(response);\n\n HypertyResourcesStorage_log.log('Success');\n return resolve();\n }).catch(error);\n });\n }\n }, {\n key: \"_getOlderResources\",\n value: function _getOlderResources(size) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4._storageManager.get().then(function (result) {\n var resources = Object.keys(result);\n var total = 0;\n var reduced = resources.sort(function (a, b) {\n return result[a].created < result[b].created;\n }).reduce(function (previousResource, currentResource) {\n var current = _this4._hypertyResources[currentResource];\n HypertyResourcesStorage_log.log('[HypertyResourcesStorage] _getOlderResources: ', total, size, currentResource, _this4._availableQuota);\n\n if (total <= size) {\n total += current.size;\n previousResource.push(currentResource);\n }\n\n return previousResource;\n }, []);\n var deleting = reduced.map(function (key) {\n return _this4._storageManager.delete(key);\n });\n Promise.all(deleting).then(function () {\n resolve(true);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n });\n }\n /**\r\n * @description should return an HypertyResource stored in the Storage Manager identified by the content url contained in the body of a read message request;\r\n *\r\n * @param {string} message - message containing the hyperty resource to be stored\r\n */\n\n }, {\n key: \"_onRead\",\n value: function _onRead(message) {\n var _this = this;\n\n if (!message.body || !message.body.resource) throw new Error('[HypertyResourcesStorage._onRead] mandatory message body resource missing: ', message);\n var contentUrl = message.body.resource;\n var response = {\n from: message.to,\n to: message.from,\n id: message.id,\n type: 'response',\n body: {}\n }; // let content = _this._hypertyResources[contentUrl];\n\n HypertyResourcesStorage_log.info('[HypertyResourcesStorage._onRead] get resourceURL:', contentUrl);\n\n this._storageManager.get('resourceURL', contentUrl).then(function (content) {\n HypertyResourcesStorage_log.info('[HypertyResourcesStorage._onRead] found content:', content);\n\n if (content) {\n if (content.resourceType === 'file') {\n _this._onReadFile(response, content);\n } else {\n response.body.code = 200;\n response.body.p2p = true;\n response.body.value = content;\n\n _this._bus.postMessage(response);\n }\n } else {\n response.body.code = 404;\n response.body.desc = 'Content Not Found for ' + contentUrl;\n\n _this._bus.postMessage(response);\n }\n }); //response.body.code = 404;\n //_this._hypertyResources[contentUrl] = message.body.value;\n\n }\n }, {\n key: \"_onReadFile\",\n value: function _onReadFile(response, resource) {\n var _this = this;\n\n var reader = new FileReader();\n\n reader.onload = function (theFile) {\n HypertyResourcesStorage_log.info('[FileHypertyResource.init] file loaded ', theFile);\n response.body.code = 200;\n response.body.p2p = true;\n response.body.value = deepClone(resource);\n response.body.value.content = theFile.target.result;\n\n _this._bus.postMessage(response);\n };\n\n if (resource.mimetype.includes('text/')) {\n reader.readAsText(resource.content);\n } else {\n var current = resource.content;\n var blob;\n\n if (Array.isArray(current)) {\n blob = new Blob(current, {\n type: resource.mimetype\n });\n } else {\n blob = new Blob([current], {\n type: resource.mimetype\n });\n }\n\n reader.readAsArrayBuffer(blob);\n }\n }\n /**\r\n * @description should delete an HypertyResource from the storage;\r\n *\r\n * @param {string} message - message containing the content URL of the hyperty resource to be deleted\r\n */\n\n }, {\n key: \"_onDelete\",\n value: function _onDelete(message) {\n var _this = this;\n\n if (!message.body) throw new Error('[HypertyResourcesStorage._onDelete] mandatory message body missing: ', message);\n\n if (message.body.resource) {\n delete _this._hypertyResources[message.body.resource];\n } else if (message.body.resources) {\n message.body.resources.forEach(function (resource) {\n delete _this._hypertyResources[resource];\n });\n } else {\n throw new Error('[HypertyResourcesStorage._onDelete] mandatory resource missing: ', message);\n }\n\n _this._storageManager.delete('resourceURL', message.body.resource).then(function () {\n var response = {\n from: message.to,\n to: message.from,\n id: message.id,\n type: 'response',\n body: {\n code: 200\n }\n };\n\n _this._bus.postMessage(response);\n }).catch(function (reason) {\n var response = {\n from: message.to,\n to: message.from,\n id: message.id,\n type: 'response',\n body: {\n code: 400,\n description: reason\n }\n };\n\n _this._bus.postMessage(response);\n });\n }\n }]);\n\n return HypertyResourcesStorage;\n}();\n\n/* harmony default export */ var hyperty_resource_HypertyResourcesStorage = (HypertyResourcesStorage_HypertyResourcesStorage);\n// CONCATENATED MODULE: ./src/syncher/Subscription.js\nfunction Subscription_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Subscription_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Subscription_createClass(Constructor, protoProps, staticProps) { if (protoProps) Subscription_defineProperties(Constructor.prototype, protoProps); if (staticProps) Subscription_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar Subscription_log = loglevel[\"getLogger\"]('SynSubscription');\n\nvar Subscription =\n/*#__PURE__*/\nfunction () {\n function Subscription(bus, owner, url, isReporter) {\n Subscription_classCallCheck(this, Subscription);\n\n var _this = this;\n\n var childBaseURL = url + '/children/';\n var changeURL = url + '/changes'; //process delete message\n\n _this._deleteListener = bus.addListener(changeURL, function (msg) {\n if (msg.type === 'delete') {\n Subscription_log.log('Subscription-DELETE: ', msg); //FLOW-OUT: message sent to all subscribers\n\n var deleteMessageToHyperty = {\n type: 'delete',\n from: msg.from,\n to: owner,\n body: {\n identity: msg.body.identity,\n resource: url\n }\n }; //send delete to hyperty\n\n bus.postMessage(deleteMessageToHyperty, function (reply) {\n Subscription_log.log('Subscription-DELETE-REPLY: ', reply);\n\n if (reply.body.code === 200) {\n _this._releaseListeners();\n }\n });\n }\n }); //add change publish address or forward\n\n if (isReporter) {\n _this._changeListener = bus.addPublish(changeURL);\n } else {\n _this._changeListener = bus.addForward(changeURL, owner);\n }\n\n _this._childrenListeners = []; // log.log('[Subscription] - childID', childrens);\n // childrens.forEach((child) => {\n // let childId = childBaseURL + child;\n // log.log('[Subscription] - childID', childBaseURL);\n //add children publish address\n\n var childrenForward = bus.addPublish(childBaseURL);\n\n _this._childrenListeners.push(childrenForward); //add self forward if an observer\n\n\n if (!isReporter) {\n var selfForward = bus.addForward(childBaseURL, owner);\n\n _this._childrenListeners.push(selfForward);\n } // });\n\n }\n\n Subscription_createClass(Subscription, [{\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n _this._deleteListener.remove();\n\n _this._changeListener.remove();\n\n _this._childrenListeners.forEach(function (forward) {\n forward.remove();\n });\n }\n }]);\n\n return Subscription;\n}();\n\n/* harmony default export */ var syncher_Subscription = (Subscription);\n// CONCATENATED MODULE: ./src/syncher/ReporterObject.js\nfunction ReporterObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ReporterObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ReporterObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) ReporterObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) ReporterObject_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar ReporterObject_log = loglevel[\"getLogger\"]('ReporterObject');\n\n\n\n\nvar ReporterObject_ReporterObject =\n/*#__PURE__*/\nfunction () {\n function ReporterObject(parent, owner, url, childrens, offline) {\n ReporterObject_classCallCheck(this, ReporterObject);\n\n var _this = this;\n\n _this._parent = parent;\n _this._owner = owner;\n _this._url = url;\n _this._bus = parent._bus;\n _this._domain = divideURL(url).domain;\n _this._objSubscriptorURL = _this._url + '/subscription';\n _this._subscriptions = {};\n _this._childrens = childrens;\n _this._childrenListeners = [];\n _this._forwards = {};\n _this._isToSaveData = false;\n\n _this._allocateListeners();\n\n _this._offline = offline ? offline : false;\n }\n\n ReporterObject_createClass(ReporterObject, [{\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this2 = this;\n\n var _this = this; //add subscription listener...\n\n\n _this._subscriptionListener = _this._bus.addListener(_this._objSubscriptorURL, function (msg) {\n ReporterObject_log.info('[SyncherManager.ReporterObject received ]', msg);\n\n switch (msg.type) {\n case 'subscribe':\n _this._onRemoteSubscribe(msg);\n\n break;\n\n case 'unsubscribe':\n _this._onRemoteUnSubscribe(msg);\n\n break;\n\n case 'response':\n _this._onRemoteResponse(msg);\n\n break;\n\n case 'forward':\n _this._onForwardedRemoteSubscribe(msg);\n\n break;\n }\n });\n var changeURL = _this._url + '/changes';\n _this._changeListener = _this._bus.addListener(changeURL, function (msg) {\n ReporterObject_log.info('[SyncherManager.ReporterObject ] SyncherManager-' + changeURL + '-RCV: ', msg); //do not save changes to backupRevision to avoid infinite loops\n\n if (_this2._isToSaveData && msg.body.attribute) {\n var updateRuntimeStatus = msg.body.attribute !== 'backupRevision' ? true : false;\n ReporterObject_log.log('[SyncherManager.ReporterObject ] SyncherManager - save data: ', msg);\n\n _this._parent._dataObjectsStorage.update(true, _this._url, 'version', msg.body.version, updateRuntimeStatus);\n\n _this._parent._dataObjectsStorage.update(true, _this._url, 'lastModified', msg.body.lastModified, updateRuntimeStatus);\n\n _this._parent._dataObjectsStorage.saveData(true, _this._url, msg.body.attribute, msg.body.value, updateRuntimeStatus);\n }\n });\n }\n }, {\n key: \"_onForwardedRemoteSubscribe\",\n // To handle subscriptions sent while the reporter was offline ie forwarded by a Offline Subscription Manager service\n value: function _onForwardedRemoteSubscribe(msg) {\n this._onRemoteSubscribe(msg.body);\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n _this._subscriptionListener.remove();\n\n _this._changeListener.remove();\n\n _this._childrenListeners.forEach(function (cl) {\n cl.remove();\n });\n\n Object.keys(_this._forwards).forEach(function (key) {\n _this.forwardUnSubscribe(key);\n }); //remove all subscriptions\n\n Object.keys(_this._subscriptions).forEach(function (key) {\n _this._subscriptions[key]._releaseListeners();\n });\n }\n }, {\n key: \"resumeSubscriptions\",\n value: function resumeSubscriptions(subscriptions) {\n var _this = this;\n\n if (!subscriptions) return;\n Object.keys(subscriptions).forEach(function (key) {\n var hypertyURL = subscriptions[key];\n ReporterObject_log.log('[SyncherManager.ReporterObject] - resume subscriptions', _this, hypertyURL, _this._childrens);\n\n if (!_this._subscriptions[hypertyURL]) {\n _this._subscriptions[hypertyURL] = new syncher_Subscription(_this._bus, _this._owner, _this._url, true);\n }\n });\n }\n /**\r\n * Register a listener in the msg-node and in the local MessageBus, so that messages on this address are forwarded to the reporter object\r\n * @param {string} address - URL to register the listeners\r\n * @return {Promise} Return Promise OK or error\r\n */\n\n }, {\n key: \"forwardSubscribe\",\n value: function forwardSubscribe(addresses) {\n var _this = this; //FLOW-OUT: message sent to the msg-node SubscriptionManager component\n\n\n var nodeSubscribeMsg = {\n type: 'subscribe',\n from: _this._parent._url,\n to: 'domain://msg-node.' + _this._domain + '/sm',\n body: {\n resources: addresses,\n source: _this._owner\n }\n };\n return new Promise(function (resolve, reject) {\n _this._bus.postMessage(nodeSubscribeMsg, function (reply) {\n ReporterObject_log.log('[SyncherManager.ReporterObject ]forward-subscribe-response(reporter): ', reply);\n\n if (reply.body.code === 200) {\n var newForward = _this._bus.addForward(_this._url, _this._owner);\n\n _this._forwards[addresses[0]] = newForward;\n resolve();\n } else {\n reject('Error on msg-node subscription: ' + reply.body.desc);\n }\n });\n });\n }\n /**\r\n * UnRegister a listener in the msg-node and in the local MessageBus, so that messages on this address are removed from forward\r\n * @param {string} address - URL to un-register the listeners\r\n */\n\n }, {\n key: \"forwardUnSubscribe\",\n value: function forwardUnSubscribe(address) {\n var _this = this;\n\n _this._forwards[address].remove();\n\n delete _this._forwards[address]; //FLOW-OUT: message sent to the msg-node SubscriptionManager component\n\n var nodeUnSubscribeMsg = {\n type: 'unsubscribe',\n from: _this._parent._url,\n to: 'domain://msg-node.' + _this._domain + '/sm',\n body: {\n resources: [address],\n source: _this._owner\n }\n };\n\n _this._bus.postMessage(nodeUnSubscribeMsg);\n }\n /**\r\n * Register listeners for a list of childrens. Public channels used to transmit messages.\r\n * @param {string[]} childrens - channels to register\r\n * @return {Promise} Return Promise OK or error\r\n */\n\n }, {\n key: \"addChildrens\",\n value: function addChildrens() {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this._childrens.length === 0) {\n resolve();\n return;\n }\n\n var childBaseURL = _this._url + '/children/';\n ReporterObject_log.log('[SyncherManager.ReporterObject - addChildrens] - childrens: ', childBaseURL);\n /* childrens.forEach((child) => {\r\n _this._childrens.push(child);\r\n });*/\n\n /*\r\n _this._childrens.forEach((child) => {\r\n let childId = childBaseURL + child;\r\n let selfForward = _this._bus.addForward(childId, owner);\r\n _this._childrenListeners.push(selfForward);\r\n });*/\n\n var subscriptions = []; // childrens.forEach((child) => subscriptions.push(childBaseURL + child));\n\n subscriptions.push(childBaseURL); //_this._storageSubscriptions[_this._objSubscriptorURL] = {url: _this._url, owner: _this._owner, childrens: _this._childrens};\n //FLOW-OUT: message sent to the msg-node SubscriptionManager component\n\n var nodeSubscribeMsg = {\n type: 'subscribe',\n from: _this._parent._url,\n to: 'domain://msg-node.' + _this._domain + '/sm',\n body: {\n resources: subscriptions,\n source: _this._owner\n }\n };\n\n _this._bus.postMessage(nodeSubscribeMsg, function (reply) {\n ReporterObject_log.log('[SyncherManager.ReporterObject ]node-subscribe-response(reporter):', reply);\n\n if (reply.body.code === 200) {\n //add children listeners on local ...\n subscriptions.forEach(function (childURL) {\n var childListener = _this._bus.addListener(childURL, function (msg) {\n //TODO: what todo here? Save childrens?\n ReporterObject_log.log('[SyncherManager.ReporterObject received]', msg);\n\n if (msg.type === 'create' && msg.to.includes('children') && _this3._isToSaveData) {\n // if the value is not encrypted lets encrypt it\n // todo: should be subject to some policy\n var splitedReporterURL = splitObjectURL(msg.to);\n var url = splitedReporterURL.url;\n if (!msg.body.hasOwnProperty('mutual')) msg.body.mutual = true; //remove false when mutualAuthentication is enabled\n\n if (!(typeof msg.body.value === 'string') && msg.body.mutual) {\n ReporterObject_log.log('[SyncherManager.ReporterObject] encrypting received data ', msg.body.value);\n cryptoManager_CryptoManager.encryptDataObject(msg.body.value, url).then(function (encryptedValue) {\n ReporterObject_log.log('[SyncherManager.ReporterObject] encrypted data ', encryptedValue);\n\n _this._storeChildObject(msg, JSON.stringify(encryptedValue));\n }).catch(function (reason) {\n ReporterObject_log.warn('[SyncherManager._decryptChildrens] failed : ', reason, ' Storing unencrypted');\n\n _this._storeChildObject(msg, msg.body.value);\n });\n } else {\n _this._storeChildObject(msg, msg.body.value);\n }\n }\n });\n\n _this._childrenListeners.push(childListener);\n\n var selfForward = _this._bus.addForward(childURL, _this._owner);\n\n _this._childrenListeners.push(selfForward);\n });\n resolve();\n } else {\n reject('Error on msg-node subscription: ' + reply.body.desc);\n }\n });\n });\n } // store childObject\n\n }, {\n key: \"_storeChildObject\",\n value: function _storeChildObject(msg, data) {\n var _this = this;\n\n var splitedReporterURL = splitObjectURL(msg.to);\n var url = splitedReporterURL.url;\n var resource = splitedReporterURL.resource;\n var value;\n /* if (msg.body.identity) {\r\n value.identity = msg.body.identity;\r\n delete value.identity.assertion;\r\n delete value.identity.expires;\r\n }*/\n\n var objectURLResource = msg.body.resource;\n var attribute = resource;\n if (objectURLResource === 'heartbeat') value = data;else value = {\n identity: msg.body.identity,\n value: data\n }; // if (objectURLResource) attribute += '.' + objectURLResource;\n\n if (objectURLResource) attribute = objectURLResource; // this identity data is not needed to be stored\n\n console.log('[SyncherManager.ReporterObject._storeChildObject] : ', url, attribute, value);\n\n _this._parent._dataObjectsStorage.saveChildrens(true, url, attribute, value);\n }\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n var domain = divideURL(_this._owner).domain; //FLOW-OUT: message sent directly to all subscribers of the reporter\n\n _this._bus.postMessage({\n type: 'delete',\n from: _this._objSubscriptorURL,\n to: _this._url + '/changes'\n }); //FLOW-OUT: message sent to the msg-node ObjectAllocationManager component\n\n\n _this._bus.postMessage({\n type: 'delete',\n from: _this._parent._url,\n to: 'domain://msg-node.' + domain + '/object-address-allocation',\n body: {\n resource: _this._url,\n childrenResources: _this._childrens\n }\n });\n\n _this._releaseListeners();\n\n delete _this._parent._reporters[_this._url];\n }\n }, {\n key: \"_onRemoteResponse\",\n value: function _onRemoteResponse(msg) {\n var _this = this;\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: _this._url,\n body: {\n code: msg.body.code,\n identity: msg.body.identity,\n source: msg.from\n }\n });\n } //FLOW-IN: message received from Syncher -> subscribe\n\n }, {\n key: \"_onRemoteSubscribe\",\n value: function _onRemoteSubscribe(msg) {\n var _this = this;\n\n var hypertyURL = msg.body.subscriber; //validate if subscription already exists?\n\n if (_this._subscriptions[hypertyURL]) {\n // let errorMsg = {\n // id: msg.id, type: 'response', from: msg.to, to: hypertyURL,\n // body: { code: 500, desc: 'Subscription for (' + _this._url + ' : ' + hypertyURL + ') already exists!' }\n // };\n //\n // _this._bus.postMessage(errorMsg);\n // return;\n // new version because of reusage\n _this._subscriptions[hypertyURL]._releaseListeners();\n } //ask to subscribe to Syncher? (depends on the operation mode)\n //TODO: get mode from object!\n\n\n var mode = 'sub/pub';\n\n if (mode === 'sub/pub') {\n //FLOW-OUT: message sent to local hyperty address Syncher -> _onForward\n var forwardMsg = {\n type: 'forward',\n from: _this._url,\n to: _this._owner,\n body: {\n type: msg.type,\n from: hypertyURL,\n to: _this._url,\n identity: msg.body.identity\n }\n }; //TODO: For Further Study\n\n if (msg.body.hasOwnProperty('mutual')) forwardMsg.body.mutual = msg.body.mutual;\n\n _this._bus.postMessage(forwardMsg, function (reply) {\n ReporterObject_log.log('[SyncherManager.ReporterObject ]forward-reply: ', reply);\n\n if (reply.body.code === 200) {\n if (!_this._subscriptions[hypertyURL]) {\n ReporterObject_log.log('[SyncherManager.ReporterObject] - _onRemoteSubscribe:', _this._childrens);\n _this._subscriptions[hypertyURL] = new syncher_Subscription(_this._bus, _this._owner, _this._url, true);\n }\n } // Store for each reporter hyperty the dataObject\n\n\n var userURL;\n\n if (msg.body.identity && msg.body.identity.userProfile.userURL) {\n userURL = msg.body.identity.userProfile.userURL;\n\n _this._parent._dataObjectsStorage.update(true, _this._url, 'subscriberUsers', userURL);\n } //TODO: mutual and sessionkeys updates were removed. FFS\n\n /* if (msg.body.hasOwnProperty('mutual')) {\r\n // _this._parent._identityModule.updateIsToEncryptForDataObjectSessionKey(_this._url, msg.body.mutual).then(()=>{\r\n _this._parent._dataObjectsStorage.update(true, _this._url, 'mutual', msg.body.mutual);\r\n // });\r\n }*/\n\n\n _this._parent._dataObjectsStorage.update(true, _this._url, 'subscriptions', hypertyURL);\n\n reply.body.owner = _this._owner; //FLOW-OUT: subscription response sent (forward from internal Hyperty)\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: reply.body\n });\n });\n }\n } //FLOW-IN: message received from remote ObserverObject -> removeSubscription\n\n }, {\n key: \"_onRemoteUnSubscribe\",\n value: function _onRemoteUnSubscribe(msg) {\n var _this = this;\n\n var unsubscriber = msg.body.source;\n var subscription = _this._subscriptions[unsubscriber];\n\n if (subscription) {\n subscription._releaseListeners();\n\n delete _this._subscriptions[unsubscriber];\n var forwardMsg = {\n type: 'forward',\n from: _this._url,\n to: _this._owner,\n body: {\n type: msg.type,\n from: unsubscriber,\n to: _this._url,\n identity: msg.body.identity\n }\n };\n\n _this._bus.postMessage(forwardMsg);\n }\n }\n }, {\n key: \"offline\",\n get: function get() {\n return this._offline;\n }\n }, {\n key: \"isToSaveData\",\n set: function set(value) {\n this._isToSaveData = value;\n }\n }]);\n\n return ReporterObject;\n}();\n\n/* harmony default export */ var syncher_ReporterObject = (ReporterObject_ReporterObject);\n// CONCATENATED MODULE: ./src/syncher/ObserverObject.js\nfunction ObserverObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ObserverObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ObserverObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) ObserverObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) ObserverObject_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar ObserverObject_log = loglevel[\"getLogger\"]('ObserverObject');\n\n\n\n\nvar ObserverObject_ObserverObject =\n/*#__PURE__*/\nfunction () {\n function ObserverObject(parent, url, childrens) {\n var _this2 = this;\n\n ObserverObject_classCallCheck(this, ObserverObject);\n\n var _this = this;\n\n _this._parent = parent;\n _this._url = url;\n _this._childrens = childrens;\n _this._bus = parent._bus;\n _this._subscriptions = {};\n _this._storageSubscriptions = {};\n _this._childrenListeners = [];\n this._isToSaveData = false;\n var changeURL = _this._url + '/changes';\n _this._changeListener = _this._bus.addListener(changeURL, function (msg) {\n ObserverObject_log.log('[SyncherManager.ObserverObject ] SyncherManager-' + changeURL + '-RCV: ', msg); //TODO: what todo here? Save changes?\n\n if (_this2._isToSaveData && msg.body.attribute) {\n ObserverObject_log.log('[SyncherManager.ObserverObject ] SyncherManager - save data: ', msg);\n\n _this._parent._dataObjectsStorage.update(false, _this._url, 'version', msg.body.version);\n\n _this._parent._dataObjectsStorage.update(false, _this._url, 'lastModified', msg.body.lastModified);\n\n _this._parent._dataObjectsStorage.saveData(false, _this._url, msg.body.attribute, msg.body.value);\n }\n });\n }\n\n ObserverObject_createClass(ObserverObject, [{\n key: \"_newSubscription\",\n value: function _newSubscription(hyperty) {\n var _this = this;\n\n var subscription = _this._subscriptions[hyperty];\n ObserverObject_log.log('[Observer Object - new subscription] - ', _this._subscriptions, hyperty, _this._subscriptions.hasOwnProperty(hyperty));\n\n if (!subscription) {\n _this._subscriptions[hyperty] = new syncher_Subscription(_this._bus, hyperty, _this._url, false);\n }\n }\n }, {\n key: \"addSubscription\",\n value: function addSubscription(hyperty) {\n var _this = this;\n\n _this._newSubscription(hyperty);\n }\n }, {\n key: \"addChildrens\",\n value: function addChildrens() {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve) {\n if (_this._childrens.length === 0) {\n resolve();\n return;\n }\n\n var childBaseURL = _this._url + '/children/';\n ObserverObject_log.log('[SyncherManager.ObserverObject - addChildrens] - childrens: ', childBaseURL); // childrens.forEach((child) => {\n\n var childListener = _this._bus.addListener(childBaseURL, function (msg) {\n //TODO: what todo here? Save childrens?\n ObserverObject_log.log('[SyncherManager.ObserverObject received]', msg);\n\n if (msg.type === 'create' && msg.to.includes('children') && _this3._isToSaveData) {\n var splitedReporterURL = splitObjectURL(msg.to);\n var url = splitedReporterURL.url;\n if (!msg.body.hasOwnProperty('mutual')) msg.body.mutual = true; //remove false when mutualAuthentication is enabled\n\n if (!(typeof msg.body.value === 'string') && msg.body.mutual) {\n ObserverObject_log.log('[SyncherManager.ObserverObject] encrypting received data ', msg.body.value);\n cryptoManager_CryptoManager.encryptDataObject(msg.body.value, url).then(function (encryptedValue) {\n ObserverObject_log.log('[SyncherManager.ObserverObject] encrypted data ', encryptedValue);\n\n _this._storeChildObject(msg, JSON.stringify(encryptedValue));\n }).catch(function (reason) {\n ObserverObject_log.warn('[SyncherManager.ObserverObject._encryptChild] failed, storing unencrypted ', reason);\n\n _this._storeChildObject(msg, msg.body.value);\n });\n } else {\n _this._storeChildObject(msg, msg.body.value);\n }\n }\n\n ObserverObject_log.log('[SyncherManager.ObserverObject children Listeners]', _this._childrenListeners, childListener);\n\n if (_this._childrenListeners.indexOf(childListener) === -1) {\n _this._childrenListeners.push(childListener);\n }\n });\n }); // });\n } // store childObject\n\n }, {\n key: \"_storeChildObject\",\n value: function _storeChildObject(msg, data) {\n var _this = this;\n\n var splitedReporterURL = splitObjectURL(msg.to);\n var url = splitedReporterURL.url;\n var resource = splitedReporterURL.resource;\n var value = {};\n /* let value = {\r\n identity: msg.body.identity,\r\n value: data\r\n };*/\n // this identity data is not needed to be stored\n\n /* delete value.identity.assertion;\r\n delete value.identity.expires;*/\n\n var objectURLResource = msg.body.resource;\n var attribute = resource;\n\n if (objectURLResource === 'heartbeat') {\n value = data;\n } else {\n value.identity = msg.body.identity;\n value.value = data;\n } // if (objectURLResource) attribute += '.' + objectURLResource;\n\n\n if (objectURLResource) attribute = objectURLResource;\n ObserverObject_log.log('[SyncherManager.ObserverObject._storeChildObject] : ', url, attribute, value);\n\n _this._parent._dataObjectsStorage.saveChildrens(false, url, attribute, value);\n }\n }, {\n key: \"removeSubscription\",\n value: function removeSubscription(msg) {\n var _this = this;\n\n var hyperty = msg.from;\n var domain = divideURL(hyperty).domain;\n var objURLSubscription = _this._url + '/subscription';\n var subscription = _this._subscriptions[hyperty];\n\n if (subscription) {\n //FLOW-OUT: message sent to remote ReporterObject -> _onRemoteUnSubscribe\n _this._bus.postMessage({\n type: 'unsubscribe',\n from: _this._parent._url,\n to: objURLSubscription,\n body: {\n source: hyperty,\n identity: msg.body.identity\n }\n }); //TODO: should I wait for response before unsubscribe on msg-node\n //FLOW-OUT: message sent to msg-node SubscriptionManager component\n\n\n _this._bus.postMessage({\n type: 'unsubscribe',\n from: _this._parent._url,\n to: 'domain://msg-node.' + domain + '/sm',\n body: {\n resource: _this._url,\n resources: [_this._url + '/children/']\n }\n });\n\n subscription._releaseListeners();\n\n delete _this._subscriptions[hyperty];\n }\n }\n }, {\n key: \"isToSaveData\",\n set: function set(value) {\n this._isToSaveData = value;\n }\n }]);\n\n return ObserverObject;\n}();\n\n/* harmony default export */ var syncher_ObserverObject = (ObserverObject_ObserverObject);\n// CONCATENATED MODULE: ./src/syncher/SyncherManager.js\nfunction SyncherManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SyncherManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SyncherManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) SyncherManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) SyncherManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar SyncherManager_log = loglevel[\"getLogger\"]('SyncherManager');\n //import { schemaValidation } from '../utils/schemaValidation';\n\n\n\n\n\n/**\r\n * @author micaelpedrosa@gmail.com\r\n * Core Syncronization system.\r\n */\n\nvar SyncherManager_SyncherManager =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _url: URL\r\n _bus: MiniBus\r\n _registry: Registry\r\n _allocator: AddressAllocation\r\n _reporters: { ObjectURL: ReporterObject }\r\n _observers: { ObjectURL: ObserverObject }\r\n */\n function SyncherManager(runtimeURL, bus, registry, catalog, storageManager, allocator, storeDataObjects, identityModule) {\n SyncherManager_classCallCheck(this, SyncherManager);\n\n if (!runtimeURL) throw new Error('[Syncher Manager] - needs the runtimeURL parameter');\n if (!bus) throw new Error('[Syncher Manager] - needs the MessageBus instance');\n if (!registry) throw new Error('[Syncher Manager] - needs the Registry instance');\n if (!catalog) throw new Error('[Syncher Manager] - needs the RuntimeCatalogue instance');\n if (!storageManager) throw new Error('[Syncher Manager] - need the storageManager instance');\n\n var _this = this;\n\n _this._bus = bus;\n _this._registry = registry;\n _this._catalog = catalog;\n _this._storageManager = storageManager;\n _this._identityModule = identityModule; //TODO: these should be saved in persistence engine?\n\n _this.runtimeURL = runtimeURL;\n _this._url = runtimeURL + '/sm';\n _this._objectURL = runtimeURL + '/object-allocation';\n _this._reporters = {};\n _this._observers = {};\n _this._dataObjectsStorage = storeDataObjects;\n console.log('[NOTSAVING] storeDataObjects', storeDataObjects); //TODO: this should not be hardcoded!\n\n _this._domain = divideURL(runtimeURL).domain;\n\n if (allocator) {\n _this._allocator = allocator;\n } else {\n _this._allocator = allocation_AddressAllocation.instance;\n }\n\n SyncherManager_log.log('[SyncherManager - AddressAllocation] - ', _this._allocator);\n bus.addListener(_this._url, function (msg) {\n SyncherManager_log.info('[SyncherManager] RCV: ', msg);\n\n switch (msg.type) {\n case 'create':\n _this._onCreate(msg);\n\n break;\n\n case 'delete':\n _this._onDelete(msg);\n\n break;\n\n case 'subscribe':\n _this._onLocalSubscribe(msg);\n\n break;\n\n case 'unsubscribe':\n _this._onLocalUnSubscribe(msg);\n\n break;\n\n case 'read':\n _this._onRead(msg);\n\n break;\n\n case 'execute':\n _this._onExecute(msg);\n\n break;\n }\n });\n }\n\n SyncherManager_createClass(SyncherManager, [{\n key: \"_onExecute\",\n //FLOW-IN: message received from Syncher -> read\n value: function _onExecute(msg) {\n var _this = this;\n\n var reply = {\n type: 'response',\n from: msg.to,\n to: msg.from,\n id: msg.id\n };\n SyncherManager_log.info('[SyncherManager.onExecute] new message', msg);\n\n if (msg.hasOwnProperty('body') && msg.body.hasOwnProperty('method') && msg.body.hasOwnProperty('params')) {\n switch (msg.body.method) {\n case 'sync':\n _this._dataObjectsStorage.sync(msg.body.params[0], msg.body.params[1], false);\n\n break;\n\n case 'stopSync':\n _this._dataObjectsStorage.stopSync(msg.body.params[0]);\n\n break;\n }\n\n reply.body = {\n code: 200\n };\n\n _this._bus.postMessage(reply);\n } else {\n reply.body = {\n code: 400,\n desc: 'missing body or body method / params mandatory fields'\n };\n SyncherManager_log.error('[SyncherManager.onExecute] error. Missing body or body method / params mandatory fields', msg);\n\n _this._bus.postMessage(reply);\n }\n } //FLOW-IN: message received from Syncher -> read\n\n }, {\n key: \"_onRead\",\n value: function _onRead(msg) {\n var _this = this;\n\n var reply = {\n type: 'response',\n from: msg.to,\n to: msg.from,\n id: msg.id\n };\n SyncherManager_log.info('[SyncherManager.onRead] new message', msg);\n\n if (msg.hasOwnProperty('body') && msg.body.hasOwnProperty('resource')) {\n _this._dataObjectsStorage.sync(msg.body.resource, criteria.backupRevision, true).then(function (dataObject) {\n reply.body = {\n code: 200,\n value: dataObject\n };\n SyncherManager_log.info('[SyncherManager.onRead] found object: ', dataObject);\n\n _this._bus.postMessage(reply);\n }, function (error) {\n reply.body = {\n code: 400,\n desc: error\n };\n SyncherManager_log.error('[SyncherManager.onRead] error: ', error);\n\n _this._bus.postMessage(reply);\n });\n } else {\n reply.body = {\n code: 400,\n desc: 'missing body or body resource mandatory fields'\n };\n SyncherManager_log.error('[SyncherManager.onRead] error. Missing body or body resource mandatory fields', msg);\n\n _this._bus.postMessage(reply);\n }\n } //FLOW-IN: message received from Syncher -> create\n\n }, {\n key: \"_onCreate\",\n value: function _onCreate(msg) {\n var _this2 = this;\n\n var from = msg.from;\n var to = msg.to;\n\n var _this = this; // check if message is to save new childrenObjects in the local storage\n // TODO: check if message is to store new child in the local storage and call storeChild. How to distinguish from others?\n //debugger;\n\n\n if (msg.body.attribute) {\n this._storeChildrens(msg);\n } else {\n if (!msg.body.hasOwnProperty('resume') || msg.body.hasOwnProperty('resume') && !msg.body.resume) {\n // check if this is an invitation message\n if (msg.body.authorise) {\n this._authorise(msg);\n\n SyncherManager_log.info('[SyncherManager.onCreate - invite observers]', msg);\n } else {\n // this is to create a new data object\n SyncherManager_log.info('[SyncherManager.onCreate - Create New Object]', msg);\n\n this._newCreate(msg);\n }\n } else {\n // If from the hyperty side, call the resumeReporter we will have resume = true'\n // so we will create an resumed object and will try to resume the object previously saved;\n this._dataObjectsStorage.getResourcesByCriteria(msg, true).then(function (result) {\n SyncherManager_log.info('[SyncherManager - Create Resumed] - ResourcesByCriteria | Message: ', msg, ' result: ', result);\n\n if (result && Object.keys(result).length > 0) {\n var listOfReporters = [];\n Object.keys(result).forEach(function (objURL) {\n listOfReporters.push(_this._resumeCreate(msg, result[objURL]));\n });\n Promise.all(listOfReporters).then(function (resumedReporters) {\n SyncherManager_log.log('[SyncherManager - Create Resumed]', resumedReporters); // TODO: shoud send the information if some object was failing;\n\n var successfullyResumed = Object.values(resumedReporters).filter(function (reporter) {\n return reporter !== false;\n });\n SyncherManager_log.info('[SyncherManager.onCreate] returning resumed objects : ', successfullyResumed); //FLOW-OUT: message response to Syncher -> create resume\n\n _this2._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: to,\n to: from,\n body: {\n code: 200,\n value: deepClone(successfullyResumed)\n }\n });\n /*successfullyResumed.forEach((reporter) => {\r\n if (reporter.backup) {\r\n this._dataObjectsStorage.sync(reporter.url);\r\n }\r\n });*/\n\n });\n } else {\n //forward to hyperty:\n var reply = {};\n reply.id = msg.id;\n reply.from = msg.to;\n reply.to = msg.from;\n reply.type = 'response';\n reply.body = {\n code: 404,\n desc: 'No data objects reporters to be resumed'\n };\n\n _this2._bus.postMessage(reply);\n }\n });\n }\n }\n }\n }, {\n key: \"_storeChildrens\",\n value: function _storeChildrens(msg) {\n var _this = this;\n\n var resource = msg.body.resource;\n var attribute = msg.body.attribute;\n\n if (attribute === 'childrenObjects') {\n _this._dataObjectsStorage.saveChildrens(false, resource, undefined, msg.body.value);\n } else {\n _this._dataObjectsStorage.saveChildrens(true, resource, attribute, msg.body.value);\n }\n }\n }, {\n key: \"_newCreate\",\n value: function _newCreate(msg) {\n var _this3 = this;\n\n var _this = this;\n\n var owner = msg.from;\n var domain = divideURL(msg.from).domain; // if reporter is in a Interworking Protostub the runtime domain backend services will be used\n\n if (_this._registry.isInterworkingProtoStub(msg.from)) {\n domain = divideURL(_this.runtimeURL).domain;\n } // let domainRegistration = msg.body.value.hasOwnProperty('domain_registration') ? msg.body.value.domain_registration : true;\n\n\n var domainRouting = msg.body.value.hasOwnProperty('domain_routing') ? msg.body.value.domain_routing : true; // Process invitation message to observers\n\n /*if (msg.body.authorise) {\r\n _this._authorise(msg);\r\n return;\r\n }*/\n //get schema from catalogue and parse -> (scheme, children)\n\n _this._catalog.getDataSchemaDescriptor(msg.body.schema).then(function (descriptor) {\n var properties = descriptor.sourcePackage.sourceCode.properties;\n var scheme = properties.scheme ? properties.scheme : 'resource';\n var childrens = properties.children ? properties.children : []; // Do schema validation\n // TODO: check if is need to handle with the result of validation\n // schemaValidation(scheme, descriptor, msg.body.value);\n\n var objectInfo = {\n name: msg.body.value.name,\n schema: msg.body.value.schema,\n reporter: msg.body.value.reporter,\n resources: msg.body.value.resources\n }; // should resuse data object url if it passed\n\n var reuseDataObject = msg.body.value.resource;\n var numOfAddress = 1; //debugger;\n //request address allocation of a new object from the msg-node\n //_this._allocator.create(domain, numOfAddress, objectInfo, scheme, reuseDataObject).then((allocated) => {\n\n _this._allocator.create(domain, numOfAddress, objectInfo, scheme, reuseDataObject).then(function (allocated) {\n var objectRegistration = deepClone(msg.body.value);\n objectRegistration.url = allocated.address[0];\n objectRegistration.authorise = msg.body.authorise;\n objectRegistration.childrens = childrens; //objectRegistration.expires = 30;//TODO: get it from data object configuration description when present\n\n delete objectRegistration.data;\n SyncherManager_log.log('[SyncherManager._newCreate] ALLOCATOR CREATE:', allocated);\n var subscriptionURL = objectRegistration.url + '/subscription';\n SyncherManager_log.log('[SyncherManager._newCreate] Subscription URL', subscriptionURL); //To register the dataObject in the runtimeRegistry\n\n SyncherManager_log.info('[SyncherManager._newCreate] Register Object: ', objectRegistration); //_this._registry.registerDataObject(msg.body.value.name, msg.body.value.schema, objURL, msg.body.value.reporter, msg.body.value.resources, allocated, msg.body.authorise).then((resolve) => {\n\n _this._registry.registerDataObject(objectRegistration).then(function (registeredObject) {\n SyncherManager_log.log('[SyncherManager._newCreate] DataObject successfully registered', registeredObject); //all OK -> create reporter and register listeners\n\n var reporter;\n\n if (!_this3._reporters[objectRegistration.url]) {\n var offline = objectRegistration.offline ? objectRegistration.offline : false;\n reporter = new syncher_ReporterObject(_this, owner, objectRegistration.url, childrens, offline);\n } else {\n reporter = _this3._reporters[objectRegistration.url];\n }\n\n SyncherManager_log.log('[SyncherManager - new Create] - ', msg); // Store for each reporter hyperty the dataObject\n\n var userURL; // let interworking = false;\n\n if (msg.body.hasOwnProperty('identity') && msg.body.identity.userProfile && msg.body.identity.userProfile.userURL) {\n userURL = msg.body.identity.userProfile.userURL; // if (!userURL.includes('user://')) {\n // interworking = true;\n // }\n } else {\n userURL = _this._registry.getHypertyOwner(msg.from); // if (!userURL) {\n // interworking = true;\n // }\n } // should we use the msg.body.value instead?\n\n\n var metadata = deepClone(objectRegistration);\n metadata.subscriberUser = userURL;\n metadata.isReporter = true; // Store the dataObject information\n //if (!interworking) {\n\n if (msg.body.hasOwnProperty('store') && msg.body.store) {\n reporter.isToSaveData = true;\n metadata.isToSaveData = true;\n\n if (msg.body.value.data) {\n metadata.data = deepClone(msg.body.value.data); // _this._dataObjectsStorage.saveData(true, objectRegistration.url, null, msg.body.value.data); }\n // _this._dataObjectsStorage.update(true, objectRegistration.url, 'isToSaveData', true);\n // if (msg.body.value.data) { _this._dataObjectsStorage.saveData(true, objectRegistration.url, null, msg.body.value.data); }\n }\n }\n\n _this._dataObjectsStorage.set(metadata).then(function (storeObject) {\n if (metadata.offline) {\n //register new DataObject at Offline Subscription Manager\n msg.body.identity.guid = _this._identityModule._identities.guid;\n var forward = {\n from: msg.to,\n to: metadata.offline + '/register',\n type: 'forward',\n body: msg\n };\n forward.body.body.resource = objectRegistration.url;\n forward.body.body.value = metadata;\n SyncherManager_log.log('[SyncherManager.newCreate] registering new object at offline manager ', forward);\n\n _this._bus.postMessage(forward);\n } //}\n\n\n var responseMsg = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: owner,\n body: {\n code: 200,\n resource: objectRegistration.url,\n childrenResources: childrens\n }\n }; // adding listeners to forward to reporter\n\n if (domainRouting) {\n reporter.forwardSubscribe([objectRegistration.url, subscriptionURL]).then(function () {\n reporter.addChildrens().then(function () {\n _this._reporters[objectRegistration.url] = reporter; //FLOW-OUT: message response to Syncher -> create\n\n _this._bus.postMessage(responseMsg);\n });\n });\n } else {\n reporter.addChildrens().then(function () {\n _this._reporters[objectRegistration.url] = reporter; //FLOW-OUT: message response to Syncher -> create\n\n _this._bus.postMessage(responseMsg);\n });\n }\n }, function (error) {\n SyncherManager_log.error(error);\n });\n }, function (error) {\n SyncherManager_log.error(error);\n });\n });\n }).catch(function (reason) {\n //FLOW-OUT: error message response to Syncher -> create\n var responseMsg = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: owner,\n body: {\n code: 500,\n desc: reason\n }\n };\n\n _this._bus.postMessage(responseMsg);\n });\n }\n }, {\n key: \"_resumeCreate\",\n value: function _resumeCreate(msg, storedObject) {\n var _this4 = this;\n\n var _this = this;\n\n return new Promise(function (resolve) {\n var owner = msg.from;\n var schema = storedObject.schema;\n var resource = storedObject.url;\n var domainRegistration = storedObject.hasOwnProperty('domain_registration') ? storedObject.domain_registration : true;\n var initialData = storedObject.data;\n SyncherManager_log.log('[SyncherManager] - resume create', msg, storedObject); //get schema from catalogue and parse -> (scheme, children)\n\n _this._catalog.getDataSchemaDescriptor(schema).then(function (descriptor) {\n var properties = descriptor.sourcePackage.sourceCode.properties;\n var scheme = properties.scheme ? properties.scheme.constant : 'resource';\n var childrens = properties.children ? properties.children.constant : [];\n SyncherManager_log.log('[SyncherManager] - getDataSchemaDescriptor: ', descriptor, childrens); // Do schema validation\n // TODO: check if is need to handle with the result of validation\n // schemaValidation(scheme, descriptor, initialData);\n //all OK -> create reporter and register listeners\n\n var reporter;\n var offline;\n\n if (!_this4._reporters[resource]) {\n offline = storedObject.offline ? storedObject.offline : false;\n reporter = new syncher_ReporterObject(_this, owner, resource, childrens, offline);\n } else {\n reporter = _this4._reporters[resource];\n }\n\n reporter.isToSaveData = storedObject.isToSaveData;\n\n if (offline) {\n //update new DataObject at Offline Subscription Manager\n var _msg = {\n from: _this._url,\n to: offline + '/register',\n type: 'update',\n body: {}\n };\n SyncherManager_log.log('[SyncherManager._resumeCreate] update object at offline manager ', _msg);\n\n _this._bus.postMessage(_msg);\n }\n\n if (domainRegistration) {\n reporter.forwardSubscribe([storedObject.url]).then(function () {\n SyncherManager_log.log('[SyncherManager._resumeCreate] resumingReporterSubscription ', storedObject);\n\n _this._resumeReporterSubscriptions(msg, storedObject, reporter, childrens, domainRegistration).then(function (resumeObject) {\n SyncherManager_log.log('[SyncherManager._resumeCreate] resolved resumed object ', resumeObject);\n resolve(resumeObject);\n });\n });\n } else resolve(_this._resumeReporterSubscriptions(msg, storedObject, reporter, childrens, domainRegistration)); // resolve();\n\n }).catch(function (reason) {\n SyncherManager_log.error('[SyncherManager - resume create] - fail on getDataSchemaDescriptor: ', reason);\n resolve(false);\n });\n });\n }\n }, {\n key: \"_resumeReporterSubscriptions\",\n value: function _resumeReporterSubscriptions(msg, storedObject, reporter, childrens, domainRegistration) {\n var _this = this;\n\n var resource = storedObject.url;\n var objectRegistration = deepClone(msg.body.value);\n objectRegistration.url = storedObject.url;\n objectRegistration.expires = storedObject.expires;\n objectRegistration.domain_registration = domainRegistration;\n delete objectRegistration.data;\n return new Promise(function (resolve) {\n reporter.addChildrens().then(function () {\n reporter.resumeSubscriptions(storedObject.subscriptions);\n _this._reporters[resource] = reporter;\n SyncherManager_log.info('[SyncherManager - resume create] - resolved resumed: ', storedObject);\n return _this._decryptChildrens(storedObject, childrens);\n }).then(function (decryptedObject) {\n SyncherManager_log.info('[SyncherManager._resumeReporterSubscriptions] Register Object: ', objectRegistration);\n\n _this._registry.registerDataObject(objectRegistration).then(function (registered) {\n SyncherManager_log.log('[SyncherManager._resumeReporterSubscriptions] DataObject registration successfully updated', registered);\n SyncherManager_log.log('[SyncherManager._resumeReporterSubscriptions] resolving object', decryptedObject);\n resolve(decryptedObject);\n }); // log.log('result of previous promise');\n\n }).catch(function (reason) {\n SyncherManager_log.error('[SyncherManager - resume create] - fail on addChildrens: ', reason);\n resolve(false);\n });\n });\n } // to decrypt DataChildObjects if they are encrypted\n\n }, {\n key: \"_decryptChildrens\",\n value: function _decryptChildrens(encryptedObject, childrens) {\n var _this = this;\n\n var storedObject = deepClone(encryptedObject);\n return new Promise(function (resolve) {\n if (!childrens) {\n resolve(storedObject);\n } else {\n var childrensObj = Object.keys(storedObject.childrenObjects);\n\n if (childrensObj.length === 0) {\n resolve(storedObject);\n }\n\n childrens.forEach(function (children) {\n // let childObjects = storedObject.childrenObjects[children];\n var childObjects = storedObject.childrenObjects;\n SyncherManager_log.log('[SyncherManager._decryptChildrens] dataObjectChilds to decrypt ', childObjects);\n var listOfDecryptedObjects = [];\n Object.keys(childObjects).forEach(function (childId) {\n var child = childObjects[childId];\n var owner = childId.split('#')[0];\n\n if (typeof child.value === 'string') {\n SyncherManager_log.log('[SyncherManager._decryptChildrens] createdBy ', owner, ' object: ', child.value);\n var decrypted = cryptoManager_CryptoManager.decryptDataObject(JSON.parse(child.value), storedObject.url);\n listOfDecryptedObjects.push(decrypted);\n }\n });\n Promise.all(listOfDecryptedObjects).then(function (decryptedObjects) {\n SyncherManager_log.log('[SyncherManager._decryptChildrens] returning decrypted ', decryptedObjects);\n decryptedObjects.forEach(function (decryptedObject) {\n var childId = decryptedObject.value.url;\n storedObject.childrenObjects[childId].value = decryptedObject.value;\n });\n SyncherManager_log.log('[SyncherManager._decryptChildrens] storedObject ', storedObject);\n resolve(storedObject);\n }).catch(function (reason) {\n SyncherManager_log.warn('[SyncherManager._decryptChildrens] failed : ', reason);\n });\n });\n }\n });\n } // Process invitations to observers\n\n }, {\n key: \"_authorise\",\n value: function _authorise(msg) {\n var _this = this;\n\n if (!msg.body.resource) {\n throw new Error('[SyncherManager._authorise] invitation request without data object url:', msg);\n }\n\n var objSubscriptorURL = msg.body.resource + '/subscription';\n var p2p = msg.body.p2p ? msg.body.p2p : false;\n SyncherManager_log.log('[SyncherManager - authorise] - ', msg);\n\n if (msg.body.authorise) {\n msg.body.authorise.forEach(function (hypertyURL) {\n //FLOW-OUT: send invites to list of remote Syncher -> _onRemoteCreate -> onNotification\n _this._bus.postMessage({\n type: 'create',\n from: objSubscriptorURL,\n to: hypertyURL,\n body: {\n p2p: p2p,\n identity: msg.body.identity,\n source: msg.from,\n value: msg.body.value,\n schema: msg.body.schema\n }\n }, function (reply) {\n // lets forward the invitation response\n var response = {\n from: msg.to,\n to: msg.from,\n id: msg.id,\n type: reply.type,\n body: reply.body\n };\n\n _this._bus.postMessage(response);\n });\n });\n }\n } //FLOW-IN: message received from DataObjectReporter -> delete\n\n }, {\n key: \"_onDelete\",\n value: function _onDelete(msg) {\n var _this = this;\n\n var objURL = msg.body.resource;\n var object = _this._reporters[objURL];\n\n if (object) {\n //TODO: is there any policy verification before delete?\n if (object.offline) {\n //register new DataObject at Offline Subscription Manager\n var forward = {\n from: msg.to,\n to: object.offline + '/register',\n type: 'forward',\n body: msg\n };\n SyncherManager_log.log('[SyncherManager._onDelete] unregistering object from offline manager ', forward);\n\n _this._bus.postMessage(forward);\n }\n\n object.delete();\n\n this._dataObjectsStorage.deleteResource(objURL).then(function (result) {\n SyncherManager_log.log('[SyncherManager - onDelete] - deleteResource: ', result);\n\n _this._registry.unregisterDataObject(objURL); //TODO: unregister object?\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n });\n });\n }\n } //FLOW-IN: message received from local Syncher -> subscribe\n\n }, {\n key: \"_onLocalSubscribe\",\n value: function _onLocalSubscribe(msg) {\n var _this5 = this;\n\n //debugger;\n if (msg.body.hasOwnProperty('resume') && msg.body.resume) {\n this._dataObjectsStorage.getResourcesByCriteria(msg, false).then(function (result) {\n SyncherManager_log.info('[SyncherManager.onLocalSubscribe. resume]: ', msg, ' result: ', result);\n\n if (result && Object.keys(result).length > 0) {\n var listOfObservers = []; // TODO: should reuse the stored information\n\n Object.keys(result).forEach(function (objURL) {\n SyncherManager_log.log('[SyncherManager - resume Subscribe] - reuse current object url: ', result[objURL]);\n listOfObservers.push(_this5._resumeSubscription(msg, result[objURL]));\n });\n Promise.all(listOfObservers).then(function (resumedObservers) {\n SyncherManager_log.log('[SyncherManager - Observers Resumed]', resumedObservers); // TODO: shoud send the information if some object is failing;\n\n var successfullyResumed = Object.values(resumedObservers).filter(function (observer) {\n return observer !== false;\n });\n var response = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n value: successfullyResumed\n }\n };\n SyncherManager_log.log('[SyncherManager - Observers Resumed] replying ', response); //FLOW-OUT: message response to Syncher -> create\n\n _this5._bus.postMessage(response);\n });\n } else {\n //forward to hyperty:\n var reply = {};\n reply.id = msg.id;\n reply.from = msg.to;\n reply.to = msg.from;\n reply.type = 'response';\n reply.body = {\n code: 404,\n desc: 'No data objects observers to be resumed'\n };\n\n _this5._bus.postMessage(reply);\n }\n });\n } else {\n SyncherManager_log.log('[SyncherManager.onLocalSubscribe - new Subscribe] - ', msg.body.schema, msg.body.resource);\n\n this._newSubscription(msg);\n }\n }\n }, {\n key: \"_newSubscription\",\n value: function _newSubscription(msg) {\n var _this = this;\n\n var objURL = msg.body.resource;\n var hypertyURL = msg.from;\n var domain = divideURL(objURL).domain;\n var domainSubscription = msg.body.hasOwnProperty('domain_subscription') ? msg.body.domain_subscription : true;\n var childBaseURL = objURL + '/children/'; //get schema from catalogue and parse -> (children)\n\n _this._catalog.getDataSchemaDescriptor(msg.body.schema).then(function (descriptor) {\n var properties = descriptor.sourcePackage.sourceCode.properties;\n var childrens = properties.children ? properties.children.constant : [];\n var subscriptions = [];\n subscriptions.push(objURL + '/changes'); // childrens.forEach((child) => subscriptions.push(childBaseURL + child));\n\n subscriptions.push(childBaseURL); //children addresses\n\n if (domainSubscription) {\n //FLOW-OUT: subscribe message to the msg-node, registering listeners on the broker\n var nodeSubscribeMsg = {\n type: 'subscribe',\n from: _this._url,\n to: 'domain://msg-node.' + domain + '/sm',\n body: {\n identity: msg.body.identity,\n resources: subscriptions,\n source: hypertyURL\n }\n }; //subscribe in msg-node\n\n _this._bus.postMessage(nodeSubscribeMsg, function (reply) {\n SyncherManager_log.log('node-subscribe-response(observer): ', reply);\n console.log('REUSETEST SyncherManager - node-subscribe-response(observer): ', reply);\n\n if (reply.body.code === 200) {\n _this._newReporterSubscribe(msg, hypertyURL, objURL, childrens);\n } else {\n //listener rejected\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: hypertyURL,\n body: reply.body\n });\n }\n });\n } else _this._newReporterSubscribe(msg, hypertyURL, objURL, childrens);\n });\n }\n }, {\n key: \"_newReporterSubscribe\",\n value: function _newReporterSubscribe(msg, hypertyURL, objURL, childrens) {\n var _this = this;\n\n var objURLSubscription = objURL + '/subscription'; //FLOW-OUT: reply with provisional response\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: hypertyURL,\n body: {\n code: 100,\n childrenResources: childrens,\n schema: msg.body.schema,\n resource: msg.body.resource\n }\n }); //FLOW-OUT: subscribe message to remote ReporterObject -> _onRemoteSubscribe\n\n\n var objSubscribeMsg = {\n type: 'subscribe',\n from: _this._url,\n to: objURLSubscription,\n body: {\n identity: msg.body.identity,\n subscriber: hypertyURL\n }\n }; //TODO: For Further Study\n\n if (msg.body.hasOwnProperty('mutual')) objSubscribeMsg.body.mutual = msg.body.mutual;\n SyncherManager_log.log('[SyncherManager._newSubscription]', objSubscribeMsg, msg);\n console.log('REUSETEST SyncherManager - [SyncherManager._newSubscription]', objSubscribeMsg, msg); //subscribe to reporter SM\n\n _this._bus.postMessage(objSubscribeMsg, function (reply) {\n SyncherManager_log.log('reporter-subscribe-response-new: ', reply);\n console.log('REUSETEST SyncherManager - reporter-subscribe-response-new: ', reply);\n if (reply.body.code === 200) _this._processSuccessfullSubscription(reply, hypertyURL, objURL, childrens, msg);else if (msg.body.offline) _this._processOfflineSubscription(objSubscribeMsg, msg.body.offline, hypertyURL, objURL, childrens, msg);else {//TODO: send response back to Hyperty with error message received in the reply\n }\n });\n }\n }, {\n key: \"_processOfflineSubscription\",\n value: function _processOfflineSubscription(subscription, redirectTo, hypertyURL, objURL, childrens, msg) {\n var _this = this;\n\n var forward = {\n from: subscription.from,\n type: 'forward',\n to: redirectTo,\n body: subscription\n };\n console.log('[SyncherManager._processOfflineSubscription] forwading ', forward);\n\n _this._bus.postMessage(forward, function (reply) {\n SyncherManager_log.log('[SyncherManager._processOfflineSubscription] reply ', reply);\n if (reply.body.code === 200) _this._processSuccessfullSubscription(reply, hypertyURL, objURL, childrens, msg);else {//TODO: send response back to Hyperty with error message received in the reply\n }\n });\n }\n }, {\n key: \"_processSuccessfullSubscription\",\n value: function _processSuccessfullSubscription(reply, hypertyURL, objURL, childrens, msg) {\n var _this = this;\n\n SyncherManager_log.log('[SyncherManager._newSubscription] - observers: ', _this._observers, objURL, _this._observers[objURL]);\n console.log('REUSETEST SyncherManager - 200 code[SyncherManager._newSubscription] - observers: ', _this._observers, objURL, _this._observers[objURL]);\n var observer = _this._observers[objURL];\n\n if (!observer) {\n observer = new syncher_ObserverObject(_this, objURL, childrens);\n SyncherManager_log.log('[SyncherManager._newSubscription] - observers: create new ObserverObject: ', observer);\n _this._observers[objURL] = observer; // register new hyperty subscription\n\n observer.addSubscription(hypertyURL); // add childrens and listeners to save data if necessary\n\n observer.addChildrens();\n }\n\n var interworking = false; //debugger;\n // Store for each reporter hyperty the dataObject\n\n var userURL;\n\n if (msg.body.hasOwnProperty('identity') && msg.body.identity.userProfile && msg.body.identity.userProfile.userURL) {\n userURL = msg.body.identity.userProfile.userURL;\n\n if (!userURL.includes('user://')) {\n interworking = true;\n }\n } else {\n userURL = _this._registry.getHypertyOwner(msg.from);\n if (!userURL) interworking = true;\n }\n\n var metadata = deepClone(reply.body.value); // let childrenObjects = metadata.childrenObjects || {};\n\n delete metadata.data;\n delete metadata.childrenObjects;\n metadata.childrens = childrens;\n metadata.subscriberUser = userURL;\n metadata.isReporter = false;\n metadata.subscriberHyperty = hypertyURL;\n\n if (!interworking) {\n //_this._dataObjectsStorage.set(objURL, false, msg.body.schema, 'on', reply.body.owner, hypertyURL, childrens, userURL);\n _this._dataObjectsStorage.set(metadata);\n\n if (metadata.hasOwnProperty('store') && metadata.store || metadata.hasOwnProperty('isToSaveData') && metadata.isToSaveData) {\n observer.isToSaveData = true;\n\n _this._dataObjectsStorage.update(false, objURL, 'isToSaveData', true);\n\n _this._dataObjectsStorage.saveData(false, objURL, null, reply.body.value.data); // if (childrens) _this._dataObjectsStorage.initialObserverSync(objURL, reply.body.value.data.backupRevision);\n\n }\n } //forward to hyperty:\n\n\n reply.id = msg.id;\n reply.from = _this._url;\n reply.to = hypertyURL;\n reply.body.schema = msg.body.schema;\n reply.body.resource = msg.body.resource; //TODO: For Further Study\n\n if (msg.body.hasOwnProperty('mutual')) reply.body.mutual = msg.body.mutual;\n SyncherManager_log.log('[subscribe] - new subscription: ', msg, reply, observer);\n\n this._bus.postMessage(reply);\n }\n }, {\n key: \"_resumeSubscription\",\n value: function _resumeSubscription(msg, storedObject) {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n var objURL = storedObject.url;\n var schema = storedObject.schema;\n var hypertyURL = msg.from; // let objURLSubscription = objURL + '/subscription';\n\n var childBaseURL = objURL + '/children/';\n SyncherManager_log.log('[SyncherManager - ReuseSubscription] - objURL: ', objURL, ' - schema:', schema); //get schema from catalogue and parse -> (children)\n // TODO: remove this since children resources should be available in the DataObjectsStorage\n\n _this6._catalog.getDataSchemaDescriptor(schema).then(function (descriptor) {\n var properties = descriptor.sourcePackage.sourceCode.properties;\n var childrens = properties.children ? properties.children.constant : []; //children addresses\n\n var subscriptions = [];\n subscriptions.push(objURL + '/changes'); // childrens.forEach((child) => subscriptions.push(childBaseURL + child));\n\n subscriptions.push(childBaseURL); //FLOW-OUT: reply with provisional response\n\n _this6._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: hypertyURL,\n body: {\n code: 100,\n childrenResources: childrens,\n schema: schema,\n resource: objURL\n }\n }); //FLOW-OUT: subscribe message to remote ReporterObject -> _onRemoteSubscribe\n\n /*let objSubscribeMsg = {\r\n type: 'subscribe', from: this._url, to: objURLSubscription,\r\n body: { subscriber: hypertyURL, identity: msg.body.identity }\r\n };\r\n //subscribe to reporter SM\r\n this._bus.postMessage(objSubscribeMsg, (reply) => {*/\n\n\n var observer = _this6._observers[objURL];\n\n if (!observer) {\n observer = new syncher_ObserverObject(_this6, objURL, childrens);\n observer.isToSaveData = storedObject.isToSaveData;\n _this6._observers[objURL] = observer;\n } //register new hyperty subscription\n\n\n observer.addSubscription(hypertyURL);\n observer.addChildrens(); // Object.assign(storedObject.data, reply.body.value.data);\n // Object.assign(storedObject.childrens, reply.body.value.childrens);\n //log.log('[subscribe] - resume subscription: ', msg, reply, storedObject, observer);\n\n return _this6._decryptChildrens(storedObject, childrens);\n }).then(function (decryptedObject) {\n // log.log('result of previous promise');\n resolve(decryptedObject);\n }).catch(function (reason) {\n SyncherManager_log.error('[SyncherManager - resume subscription] - fail on getDataSchemaDescriptor: ', reason);\n resolve(false);\n });\n });\n } //FLOW-IN: message received from local DataObjectObserver -> unsubscribe\n\n }, {\n key: \"_onLocalUnSubscribe\",\n value: function _onLocalUnSubscribe(msg) {\n var _this = this;\n\n var hypertyURL = msg.from;\n var objURL = msg.body.resource;\n var observer = _this._observers[objURL];\n\n if (observer) {\n //TODO: is there any policy verification before delete?\n observer.removeSubscription(msg); //TODO: destroy object in the registry?\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n });\n\n this._dataObjectsStorage.deleteResource(objURL); //TODO: remove Object if no more subscription?\n\n\n delete _this._observers[objURL];\n }\n }\n }, {\n key: \"url\",\n get: function get() {\n return this._url;\n }\n }]);\n\n return SyncherManager;\n}();\n\n/* harmony default export */ var syncher_SyncherManager = (SyncherManager_SyncherManager);\n// CONCATENATED MODULE: ./src/subscriptionManager/Subscription.js\nfunction subscriptionManager_Subscription_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction subscriptionManager_Subscription_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction subscriptionManager_Subscription_createClass(Constructor, protoProps, staticProps) { if (protoProps) subscriptionManager_Subscription_defineProperties(Constructor.prototype, protoProps); if (staticProps) subscriptionManager_Subscription_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar subscriptionManager_Subscription_log = loglevel[\"getLogger\"]('Subscription');\n\nvar Subscription_Subscription =\n/*#__PURE__*/\nfunction () {\n function Subscription(bus, subscriber, resource) {\n subscriptionManager_Subscription_classCallCheck(this, Subscription);\n\n var _this = this;\n\n _this._subscriber = subscriber;\n _this.resource = resource;\n subscriptionManager_Subscription_log.log('[SubscriptionManager.Subscription] new: ', subscriber, resource); //add forward\n\n _this._listener = bus.addForward(resource, subscriber);\n }\n\n subscriptionManager_Subscription_createClass(Subscription, [{\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n _this._listener.remove();\n }\n }]);\n\n return Subscription;\n}();\n\n/* harmony default export */ var subscriptionManager_Subscription = (Subscription_Subscription);\n// CONCATENATED MODULE: ./src/subscriptionManager/SubscriptionManager.js\nfunction SubscriptionManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SubscriptionManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SubscriptionManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) SubscriptionManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) SubscriptionManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar SubscriptionManager_log = loglevel[\"getLogger\"]('SubscriptionManager');\n\n\n/**\r\n * @author paulo-g-chainho@alticelabs.com\r\n * Subscription Manager used to manage routing paths at the runtime.\r\n */\n\nvar SubscriptionManager_SubscriptionManager =\n/*#__PURE__*/\nfunction () {\n function SubscriptionManager(runtimeURL, bus, storage) {\n SubscriptionManager_classCallCheck(this, SubscriptionManager);\n\n if (!runtimeURL) throw new Error('[SubscriptionManager] - needs the runtimeURL parameter');\n if (!bus) throw new Error('[SubscriptionManager] - needs the MessageBus instance');\n\n var _this = this;\n\n _this._bus = bus;\n _this._storage = storage;\n _this._subscriptions = {};\n _this._subscriptionsStorage = {}; //TODO: these should be saved in persistence engine?\n\n _this.runtimeURL = runtimeURL;\n _this._url = runtimeURL + '/subscriptions'; //TODO: this should not be hardcoded!\n\n _this._domain = divideURL(runtimeURL).domain;\n bus.addListener(_this._url, function (msg) {\n SubscriptionManager_log.info('[SubscriptionManager] RCV: ', msg);\n\n switch (msg.type) {\n case 'subscribe':\n _this._onSubscribe(msg);\n\n break;\n\n case 'unsubscribe':\n _this._onUnSubscribe(msg);\n\n break;\n\n case 'read':\n _this._onRead(msg);\n\n break;\n }\n });\n }\n\n SubscriptionManager_createClass(SubscriptionManager, [{\n key: \"init\",\n value: function init() {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this._storage.get('subscriptions').then(function (subscriptions) {\n SubscriptionManager_log.log('[SubscriptionManager.init] resume subscriptions: ', subscriptions);\n\n if (subscriptions) {\n _this._subscriptionsStorage = subscriptions;\n Object.values(subscriptions).forEach(function (subscription) {\n _this.createSubscription(subscription.domain, subscription.resources, subscription.subscriber, subscription.identity);\n });\n }\n\n resolve();\n });\n });\n }\n }, {\n key: \"_onSubscribe\",\n //message received to set a routing path\n value: function _onSubscribe(msg) {\n var _this = this;\n\n var resources = msg.body.resources;\n var subscriber = msg.from;\n var domain = divideURL(resources[0]).domain; //we are assuming resources are all from the same domain\n\n var identity = msg.body.identity;\n\n _this.createSubscription(domain, resources, subscriber, identity).then(function (reply) {\n //forward to hyperty:\n reply.id = msg.id;\n reply.from = _this._url;\n reply.to = subscriber;\n reply.body = msg.body;\n reply.body.code = 200;\n SubscriptionManager_log.log('[SubscriptionManager] - craeteSubscription: ', msg, reply, subscriber);\n\n _this._bus.postMessage(reply);\n\n if (!_this._subscriptionsStorage[subscriber]) {\n _this._subscriptionsStorage[subscriber] = {\n domain: domain,\n resources: resources,\n subscriber: subscriber,\n identity: identity\n };\n } else {\n resources.forEach(function (resource) {\n if (!_this._subscriptionsStorage[subscriber].resources.includes(resource)) {\n _this._subscriptionsStorage[subscriber].resources.push(resource);\n }\n });\n }\n\n _this._storage.set('subscriptions', 1, _this._subscriptionsStorage);\n });\n }\n }, {\n key: \"createSubscription\",\n value: function createSubscription(domain, resources, subscriber, identity) {\n var _this = this; //debugger;\n\n\n return new Promise(function (resolve) {\n //FLOW-OUT: subscribe message to the msg-node, registering listeners on the broker\n var nodeSubscribeMsg = {\n type: 'subscribe',\n from: _this._url,\n to: 'domain://msg-node.' + domain + '/sm',\n body: {\n identity: identity,\n resources: resources,\n source: subscriber\n }\n }; //subscribe in msg-node\n\n _this._bus.postMessage(nodeSubscribeMsg, function (reply) {\n SubscriptionManager_log.log('[SubscriptionManager] node-subscribe-response: ', reply); //if (reply.body.code === 200) {//TODO: uncomment when MN replies with correct response body code\n //TODO: support multiple routes for multiple resources\n\n var subscription = _this._subscriptions[subscriber];\n SubscriptionManager_log.log('[SubscriptionManager] - ', _this._subscriptions, resources, _this._subscriptions.hasOwnProperty(subscriber));\n\n if (!subscription) {\n _this._subscriptions[subscriber] = {};\n }\n\n resources.forEach(function (resource) {\n _this._subscriptions[subscriber][resource] = new subscriptionManager_Subscription(_this._bus, subscriber, resource);\n });\n resolve(reply);\n });\n });\n } // message received to remove routing path\n\n }, {\n key: \"_onUnSubscribe\",\n value: function _onUnSubscribe(msg) {\n var _this = this;\n\n var unsubscriber = msg.from;\n var resource = msg.body.resource;\n\n if (_this._subscriptions[unsubscriber] && _this._subscriptions[unsubscriber][resource]) {\n var domain = divideURL(resource).domain;\n var subscription = _this._subscriptions[unsubscriber][resource]; //FLOW-OUT: message sent to msg-node SubscriptionManager component\n\n _this._bus.postMessage({\n type: 'unsubscribe',\n from: _this._url,\n to: 'domain://msg-node.' + domain + '/sm',\n body: {\n resources: [resource],\n source: unsubscriber\n }\n });\n\n subscription._releaseListeners();\n\n delete _this._subscriptions[unsubscriber][resource];\n\n if (_this._subscriptionsStorage[unsubscriber]) {\n var i = _this._subscriptionsStorage[unsubscriber].resources.indexOf(resource);\n\n if (i != -1) {\n _this._subscriptionsStorage[unsubscriber].resources.splice(i, 1);\n }\n\n _this._storage.set('subscriptions', 1, _this._subscriptionsStorage);\n }\n }\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n });\n } //message received to read existing routing paths. At this point limited to read all existing routing paths set for one listener\n\n }, {\n key: \"_onRead\",\n value: function _onRead(msg) {\n var _this = this;\n\n var listenerAddress = msg.body.resource;\n var reply;\n SubscriptionManager_log.log('[SubscriptionManager] - request to read Subscriptions: ', msg);\n\n _this._storage.get('subscriptions').then(function (subscriptions) {\n if (subscriptions && subscriptions[listenerAddress]) {\n var resources = subscriptions[listenerAddress].resources;\n reply = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n value: resources\n }\n };\n } else {\n reply = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 404,\n description: 'Not Found'\n }\n };\n }\n\n _this._bus.postMessage(reply);\n });\n }\n }, {\n key: \"url\",\n get: function get() {\n return this._url;\n }\n }]);\n\n return SubscriptionManager;\n}();\n\n/* harmony default export */ var subscriptionManager_SubscriptionManager = (SubscriptionManager_SubscriptionManager);\n// CONCATENATED MODULE: ./src/policy/ReThinkCtx.js\nfunction ReThinkCtx_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ReThinkCtx_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ReThinkCtx_createClass(Constructor, protoProps, staticProps) { if (protoProps) ReThinkCtx_defineProperties(Constructor.prototype, protoProps); if (staticProps) ReThinkCtx_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar ReThinkCtx_ReThinkCtx =\n/*#__PURE__*/\nfunction () {\n function ReThinkCtx() {\n ReThinkCtx_classCallCheck(this, ReThinkCtx);\n\n this.defaultBehaviour = true;\n this.groups = {};\n }\n\n ReThinkCtx_createClass(ReThinkCtx, [{\n key: \"scheme\",\n get: function get() {\n return this._scheme;\n },\n set: function set(params) {\n var from = params.message.from;\n\n if (isDataObjectURL(from)) {\n this._scheme = divideURL(from).type;\n } else {\n this._scheme = undefined;\n }\n }\n }, {\n key: \"date\",\n get: function get() {\n return this._date;\n },\n set: function set(now) {\n var date = new Date();\n var day = String(date.getDate());\n\n if (day.length === 1) {\n day = '0' + day;\n }\n\n var month = String(date.getMonth() + 1);\n\n if (month.length === 1) {\n month = '0' + month;\n }\n\n this._date = day + '/' + month + '/' + date.getFullYear();\n }\n }, {\n key: \"domain\",\n get: function get() {\n return this._domain;\n },\n set: function set(params) {\n if (params.message.body.identity !== undefined) {\n this._domain = divideEmail(params.message.body.identity.userProfile.username).domain;\n }\n }\n }, {\n key: \"type\",\n get: function get() {\n return this._type;\n },\n set: function set(params) {\n var message = params.message;\n\n if (message.body.value !== undefined) {\n this._type = message.body.value.resourceType;\n }\n }\n }, {\n key: \"source\",\n get: function get() {\n return this._source;\n },\n set: function set(params) {\n if (params.message.body.identity !== undefined) {\n this._source = params.message.body.identity.userProfile.username;\n }\n }\n }, {\n key: \"time\",\n get: function get() {\n return this._time;\n },\n set: function set(now) {\n now = new Date();\n var minutes = String(now.getMinutes());\n\n if (minutes.length === 1) {\n minutes = '0' + minutes;\n }\n\n this._time = parseInt(String(now.getHours()) + minutes);\n }\n }, {\n key: \"weekday\",\n get: function get() {\n return this._weekday;\n },\n set: function set(now) {\n this._weekday = String(new Date().getDay());\n }\n }]);\n\n return ReThinkCtx;\n}();\n\n/* harmony default export */ var policy_ReThinkCtx = (ReThinkCtx_ReThinkCtx);\n// CONCATENATED MODULE: ./src/policy/context/RuntimeCoreCtx.js\nfunction RuntimeCoreCtx_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { RuntimeCoreCtx_typeof = function _typeof(obj) { return typeof obj; }; } else { RuntimeCoreCtx_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return RuntimeCoreCtx_typeof(obj); }\n\nfunction RuntimeCoreCtx_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RuntimeCoreCtx_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RuntimeCoreCtx_createClass(Constructor, protoProps, staticProps) { if (protoProps) RuntimeCoreCtx_defineProperties(Constructor.prototype, protoProps); if (staticProps) RuntimeCoreCtx_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction RuntimeCoreCtx_possibleConstructorReturn(self, call) { if (call && (RuntimeCoreCtx_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return RuntimeCoreCtx_assertThisInitialized(self); }\n\nfunction RuntimeCoreCtx_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction RuntimeCoreCtx_getPrototypeOf(o) { RuntimeCoreCtx_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return RuntimeCoreCtx_getPrototypeOf(o); }\n\nfunction RuntimeCoreCtx_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) RuntimeCoreCtx_setPrototypeOf(subClass, superClass); }\n\nfunction RuntimeCoreCtx_setPrototypeOf(o, p) { RuntimeCoreCtx_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return RuntimeCoreCtx_setPrototypeOf(o, p); }\n\n\nvar RuntimeCoreCtx_log = loglevel[\"getLogger\"]('PEP');\n\n\n\n\n\n\nvar RuntimeCoreCtx_RuntimeCoreCtx =\n/*#__PURE__*/\nfunction (_ReThinkCtx) {\n RuntimeCoreCtx_inherits(RuntimeCoreCtx, _ReThinkCtx);\n\n function RuntimeCoreCtx(runtimeURL, idModule, runtimeRegistry, storageManager, runtimeCapabilities) {\n var _this2;\n\n RuntimeCoreCtx_classCallCheck(this, RuntimeCoreCtx);\n\n _this2 = RuntimeCoreCtx_possibleConstructorReturn(this, RuntimeCoreCtx_getPrototypeOf(RuntimeCoreCtx).call(this));\n _this2._runtimeURL = runtimeURL;\n _this2._pepURL = _this2._runtimeURL + '/pep';\n _this2._guiURL = _this2._runtimeURL + '/policy-gui';\n _this2.idModule = idModule;\n _this2.runtimeRegistry = runtimeRegistry;\n _this2.activeUserPolicy = undefined;\n _this2.serviceProviderPolicy = {};\n _this2.userPolicies = {};\n _this2.storageManager = storageManager;\n _this2.runtimeCapabilities = runtimeCapabilities;\n return _this2;\n }\n\n RuntimeCoreCtx_createClass(RuntimeCoreCtx, [{\n key: \"loadConfigurations\",\n value: function loadConfigurations() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.log(_this.storageManager);\n\n _this.storageManager.get('rethink:activePolicy').then(function (value) {\n _this.activeUserPolicy = value;\n return _this.storageManager.get('rethink:groups');\n }).then(function (groupInfo) {\n var groups = groupInfo;\n _this.groups = groups === undefined ? {} : groups;\n return _this.storageManager.get('rethink:spPolicies');\n }).then(function (policiesInfo) {\n var spPolicies = policiesInfo;\n _this.serviceProviderPolicy = spPolicies === undefined ? {} : spPolicies;\n\n _this._loadUserPolicies().then(function () {\n resolve();\n });\n });\n });\n }\n }, {\n key: \"getPolicies\",\n value: function getPolicies(message, isIncomingMessage) {\n var policies = {};\n\n if (this.activeUserPolicy !== undefined) {\n policies.userPolicy = this.userPolicies[this.activeUserPolicy];\n }\n\n policies.serviceProviderPolicy = this.getServiceProviderPolicy(message, isIncomingMessage);\n return policies;\n }\n }, {\n key: \"_isValidUpdate\",\n value: function _isValidUpdate(message) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (message.from.split('://').length > 1) {\n _this.idModule._getHypertyFromDataObject(message.from).then(function (hypertyURL) {\n if (hypertyURL === message.body.source) {\n resolve(message);\n } else {\n reject('The source of the message is not valid.');\n }\n }, function (error) {\n reject(error);\n });\n } else {\n resolve(message);\n }\n });\n }\n }, {\n key: \"getMyEmails\",\n value: function getMyEmails() {\n var identities = this.idModule.getIdentities();\n var emails = [];\n\n for (var i in identities) {\n emails.push(getUserEmailFromURL(identities[i].identity));\n }\n\n return emails;\n }\n }, {\n key: \"getMyHyperties\",\n value: function getMyHyperties() {\n var hyperties = this.runtimeRegistry.hypertiesList;\n var hypertiesNames = [];\n\n for (var i in hyperties) {\n var hypertyName = hyperties[i].objectName;\n\n if (hypertiesNames.indexOf(hypertyName) === -1) {\n hypertiesNames.push(hypertyName);\n }\n }\n\n return hypertiesNames;\n }\n }, {\n key: \"getServiceProviderPolicy\",\n value: function getServiceProviderPolicy(message, isIncoming) {\n var policy;\n\n if (isIncoming) {\n var toHyperty = this.runtimeRegistry.getHypertyName(message.to);\n policy = this.serviceProviderPolicy[toHyperty];\n } else {\n var fromHyperty = this.runtimeRegistry.getHypertyName(message.from);\n policy = this.serviceProviderPolicy[fromHyperty];\n }\n\n return policy;\n }\n }, {\n key: \"getURL\",\n value: function getURL(url) {\n var splitURL = url.split('/');\n return splitURL[0] + '//' + splitURL[2] + '/' + splitURL[3];\n }\n /**\r\n * Creates a group with the given name.\r\n * @param {String} groupName\r\n */\n\n }, {\n key: \"_loadUserPolicies\",\n value: function _loadUserPolicies() {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.storageManager.get('rethink:userPolicies').then(function (value) {\n var policies = value;\n\n if (policies !== undefined) {\n for (var i in policies) {\n _this3.pep.addPolicy('USER', i, policies[i]);\n }\n }\n\n resolve();\n });\n });\n }\n }, {\n key: \"_getLastComponentOfURL\",\n value: function _getLastComponentOfURL(url) {\n var split = url.split('/');\n return split[split.length - 1];\n }\n }, {\n key: \"_getPoliciesJSON\",\n value: function _getPoliciesJSON(policies) {\n for (var i in policies) {\n var combiningAlgorithm = policies[i].combiningAlgorithm;\n\n if (combiningAlgorithm instanceof combiningAlgorithms_BlockOverrides) {\n policies[i].combiningAlgorithm = 'blockOverrides';\n } else {\n if (combiningAlgorithm instanceof combiningAlgorithms_AllowOverrides) {\n policies[i].combiningAlgorithm = 'allowOverrides';\n } else {\n if (combiningAlgorithm instanceof combiningAlgorithms_FirstApplicable) {\n policies[i].combiningAlgorithm = 'firstApplicable';\n } else {\n policies[i].combiningAlgorithm = undefined;\n }\n }\n }\n }\n\n return policies;\n }\n }, {\n key: \"saveActivePolicy\",\n value: function saveActivePolicy() {\n var _this4 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.storageManager.set('rethink:activePolicy', 0, _this4.activeUserPolicy).then(function () {\n resolve();\n });\n });\n }\n }, {\n key: \"saveGroups\",\n value: function saveGroups() {\n var _this5 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.storageManager.set('rethink:groups', 0, _this5.groups).then(function () {\n resolve();\n });\n });\n }\n }, {\n key: \"savePolicies\",\n value: function savePolicies(source, policy, key) {\n var policiesJson;\n\n switch (source) {\n case 'USER':\n policiesJson = JSON.stringify(this.userPolicies);\n policiesJson = this._getPoliciesJSON(JSON.parse(policiesJson));\n this.storageManager.set('rethink:userPolicies', 0, policiesJson);\n break;\n\n case 'SERVICE_PROVIDER':\n if (policy !== undefined & key !== undefined) {\n this.serviceProviderPolicy[key] = policy;\n }\n\n policiesJson = JSON.stringify(this.serviceProviderPolicy);\n policiesJson = this._getPoliciesJSON(JSON.parse(policiesJson));\n this.storageManager.set('rethink:spPolicies', 0, policiesJson);\n break;\n\n default:\n throw Error('Unknown policy source: ' + source);\n }\n }\n }, {\n key: \"getGroupsNames\",\n value: function getGroupsNames() {\n var myGroups = this.groups;\n var groupsNames = [];\n\n if (myGroups !== undefined) {\n for (var groupName in myGroups) {\n groupsNames.push(groupName);\n }\n }\n\n return groupsNames;\n }\n }, {\n key: \"getGroup\",\n value: function getGroup(groupName, destination) {\n var members = [];\n\n if (groupName === 'preauthorised') {\n var dataObjectURL = destination.split('/');\n dataObjectURL.pop();\n dataObjectURL = dataObjectURL[0] + '//' + dataObjectURL[2];\n members = this.runtimeRegistry.getPreAuthSubscribers(dataObjectURL);\n } else {\n if (this.groups[groupName] !== undefined) {\n members = this.groups[groupName];\n }\n }\n\n return members;\n }\n /**\r\n * Creates a group with the given name.\r\n * @param {String} groupName\r\n */\n\n }, {\n key: \"createGroup\",\n value: function createGroup(groupName) {\n this.groups[groupName] = [];\n this.saveGroups();\n }\n }, {\n key: \"deleteGroup\",\n value: function deleteGroup(groupName) {\n delete this.groups[groupName];\n this.saveGroups();\n }\n /**\r\n * Adds the given user email to the group with the given name.\r\n * @param {String} userEmail\r\n * @param {String} groupName\r\n */\n\n }, {\n key: \"addToGroup\",\n value: function addToGroup(groupName, userEmail) {\n var myGroups = this.groups;\n\n if (myGroups[groupName] !== undefined) {\n if (myGroups[groupName].indexOf(userEmail) === -1) {\n myGroups[groupName].push(userEmail);\n this.saveGroups();\n }\n } else {\n throw Error('Group \"' + groupName + '\" does not exist!');\n }\n }\n }, {\n key: \"removeFromGroup\",\n value: function removeFromGroup(groupName, userEmail) {\n var group = this.groups[groupName];\n group.splice(group.indexOf(userEmail), 1);\n this.saveGroups();\n }\n }, {\n key: \"pepURL\",\n get: function get() {\n var _this = this;\n\n return _this._pepURL;\n }\n }, {\n key: \"guiURL\",\n get: function get() {\n var _this = this;\n\n return _this._guiURL;\n }\n }, {\n key: \"runtimeURL\",\n get: function get() {\n var _this = this;\n\n return _this._runtimeURL;\n }\n /**\r\n * return the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this._messageBus;\n }\n /**\r\n * Set the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this._messageBus = messageBus;\n }\n }, {\n key: \"subscription\",\n get: function get() {\n return this._subscription;\n },\n set: function set(params) {\n this._subscription = params.message.body.subscriber;\n }\n }]);\n\n return RuntimeCoreCtx;\n}(policy_ReThinkCtx);\n\n/* harmony default export */ var context_RuntimeCoreCtx = (RuntimeCoreCtx_RuntimeCoreCtx);\n// EXTERNAL MODULE: ./node_modules/tv4/tv4.js\nvar tv4 = __webpack_require__(83);\nvar tv4_default = /*#__PURE__*/__webpack_require__.n(tv4);\n\n// CONCATENATED MODULE: ./src/runtime-catalogue/RethinkObject.js\nfunction RethinkObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RethinkObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RethinkObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) RethinkObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) RethinkObject_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\nvar RethinkObject_RethinkObject =\n/*#__PURE__*/\nfunction () {\n function RethinkObject() {\n RethinkObject_classCallCheck(this, RethinkObject);\n }\n\n RethinkObject_createClass(RethinkObject, [{\n key: \"validate\",\n\n /**\r\n * Validates this RethinkObject against the provided schema.\r\n *\r\n * LIMITATIONS: The provided schema cannot contain references to other schemas, since they can't be resolved.\r\n * @param schema - schema to validate against\r\n * @returns {boolean} true if valid, false otherwise\r\n */\n value: function validate(schema) {\n // add schema itself so local references work\n tv4_default.a.addSchema(schema.id, schema); // JSON stringify -> parse needed to have proper validation\n\n var result = tv4_default.a.validateMultiple(JSON.parse(JSON.stringify(this)), schema); // delete error stacks to improve logging\n\n result.errors.forEach(function (error) {\n delete error.stack;\n }); // print more details about validation if it fails or schema contains $refs\n\n if (!result.valid || result.missing.length > 0) {\n console.warn(\"Object validation \" + (result.valid ? \"succeeded, but schema contained references:\" : \"failed:\"), JSON.stringify(result, null, 2));\n console.log(\"Object:\", JSON.stringify(this, null, 2));\n }\n\n return result.valid;\n }\n }]);\n\n return RethinkObject;\n}();\n/* harmony default export */ var runtime_catalogue_RethinkObject = (RethinkObject_RethinkObject);\n// CONCATENATED MODULE: ./src/runtime-catalogue/CatalogueDataObject.js\nfunction CatalogueDataObject_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { CatalogueDataObject_typeof = function _typeof(obj) { return typeof obj; }; } else { CatalogueDataObject_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return CatalogueDataObject_typeof(obj); }\n\nfunction CatalogueDataObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction CatalogueDataObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CatalogueDataObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) CatalogueDataObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) CatalogueDataObject_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction CatalogueDataObject_possibleConstructorReturn(self, call) { if (call && (CatalogueDataObject_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return CatalogueDataObject_assertThisInitialized(self); }\n\nfunction CatalogueDataObject_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction CatalogueDataObject_getPrototypeOf(o) { CatalogueDataObject_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return CatalogueDataObject_getPrototypeOf(o); }\n\nfunction CatalogueDataObject_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) CatalogueDataObject_setPrototypeOf(subClass, superClass); }\n\nfunction CatalogueDataObject_setPrototypeOf(o, p) { CatalogueDataObject_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return CatalogueDataObject_setPrototypeOf(o, p); }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n/**\r\n * @author alice.cheambe[at]fokus.fraunhofer.de\r\n * The CatalogueDataObject class is the representation of the reTHINK Catalogue Data Model\r\n */\n\nvar CatalogueDataObject =\n/*#__PURE__*/\nfunction (_RethinkObject) {\n CatalogueDataObject_inherits(CatalogueDataObject, _RethinkObject);\n\n /**\r\n * Creates the Catalogue Data Object\r\n * @param guid - Global Unique identifier of the Catalogue Object (e.g. Hyperty descriptor, ProtocolStub descriptor,\r\n * etc) enabling the same object to be stored and discovered in different Catalogues. That means, guid corresponds to\r\n * [resource-type-id] per BNF of Resource Path. Couldn't we have problems with too long URL paths?\r\n * @param type - indicates the type of Catalogue Data Object e.g. Hyperty, ProtocolStub, etc\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param objectName - human-understandable name of the catalogue object e.g. \"My Awesome Hyperty\"\r\n * @param description - description of the source package\r\n * @param language - the programming language used in the SourcePackage.SourceCode\r\n * @param sourcePackageURL - A string containing the URL from where the source code package of the corresponding\r\n * catalogue object, e.g. deployable packages containing executable code for Hyperties or ProtoStubs, can be downloaded\r\n */\n function CatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL) {\n var _this;\n\n CatalogueDataObject_classCallCheck(this, CatalogueDataObject);\n\n _this = CatalogueDataObject_possibleConstructorReturn(this, CatalogueDataObject_getPrototypeOf(CatalogueDataObject).call(this));\n _this._guid = guid;\n _this._type = type;\n _this._version = version;\n _this._objectName = objectName;\n _this._description = description;\n _this._language = language;\n _this._sourcePackageURL = sourcePackageURL;\n _this._signature = null;\n _this._sourcePackage = null;\n return _this;\n } // Getters\n\n\n CatalogueDataObject_createClass(CatalogueDataObject, [{\n key: \"guid\",\n get: function get() {\n return this._guid;\n },\n set: function set(guid) {\n if (guid) this._guid = guid;\n }\n }, {\n key: \"type\",\n get: function get() {\n return this._type;\n },\n set: function set(type) {\n if (type) this._type = type;\n }\n }, {\n key: \"version\",\n get: function get() {\n return this._version;\n },\n set: function set(version) {\n if (version) {\n this._version = version;\n }\n }\n }, {\n key: \"objectName\",\n get: function get() {\n return this._objectName;\n },\n set: function set(objectName) {\n if (objectName) this._objectName = objectName;\n }\n }, {\n key: \"description\",\n get: function get() {\n return this._description;\n },\n set: function set(description) {\n if (description) this._description = description;\n }\n }, {\n key: \"language\",\n get: function get() {\n return this._language;\n },\n set: function set(language) {\n if (language) this._language = language;\n }\n }, {\n key: \"signature\",\n get: function get() {\n return this._signature;\n },\n // Setters\n\n /**\r\n * Set the signature to enables integrity and authenticity verification\r\n * @param signature\r\n */\n set: function set(signature) {\n if (signature) this._signature = signature;\n }\n }, {\n key: \"sourcePackage\",\n get: function get() {\n return this._sourcePackage;\n },\n set: function set(sourcePackage) {\n if (sourcePackage) this._sourcePackage = sourcePackage;\n }\n }, {\n key: \"sourcePackageURL\",\n get: function get() {\n return this._sourcePackageURL;\n },\n set: function set(sourcePackageURL) {\n if (sourcePackageURL) this._sourcePackageURL = sourcePackageURL;\n }\n }]);\n\n return CatalogueDataObject;\n}(runtime_catalogue_RethinkObject); //Alice: removed POLICY_ENFORCER: 'policy_enforcer', DATA_SCHEMA: 'data_schema' from the list\n//wrt: https://github.com/reTHINK-project/dev-service-framework/blob/develop/docs/datamodel/core/hyperty-catalogue/readme.md#data-object-schema\n\n\nvar CatalogueObjectType = {\n HYPERTY: 'hyperty',\n PROTOSTUB: 'protostub',\n HYPERTY_RUNTIME: 'hyperty_runtime',\n HYPERTY_INTERCEPTOR: 'hyperty_inspector',\n HYPERTY_DATA_OBJECT: 'hyperty_data_object'\n};\nvar DataObjectSourceLanguage = {\n JAVASCRIPT_ECMA6: 'javascript_ecma6',\n JAVASCRIPT_ECMA5: 'javascript_ecma5',\n JSON_SCHEMA_V4: 'json_schema_v4',\n PYTHON: 'python',\n TYPESCRIPT: 'typescript'\n};\n/* harmony default export */ var runtime_catalogue_CatalogueDataObject = (CatalogueDataObject);\n// CONCATENATED MODULE: ./src/runtime-catalogue/SourcePackage.js\nfunction SourcePackage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SourcePackage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SourcePackage_createClass(Constructor, protoProps, staticProps) { if (protoProps) SourcePackage_defineProperties(Constructor.prototype, protoProps); if (staticProps) SourcePackage_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\nvar SourcePackage =\n/*#__PURE__*/\nfunction () {\n function SourcePackage(sourceCodeClassname, sourceCode) {\n SourcePackage_classCallCheck(this, SourcePackage);\n\n this._sourceCode = sourceCode;\n this._sourceCodeClassname = sourceCodeClassname;\n this._encoding = null;\n this._signature = null;\n }\n\n SourcePackage_createClass(SourcePackage, [{\n key: \"sourceCode\",\n get: function get() {\n return this._sourceCode;\n },\n set: function set(sourceCode) {\n if (sourceCode) this._sourceCode = sourceCode;\n }\n }, {\n key: \"sourceCodeClassname\",\n get: function get() {\n return this._sourceCodeClassname;\n },\n set: function set(sourceCodeClassname) {\n if (sourceCodeClassname) this._sourceCodeClassname = sourceCodeClassname;\n }\n }, {\n key: \"encoding\",\n get: function get() {\n return this._encoding;\n },\n set: function set(encoding) {\n if (encoding) this._encoding = encoding;\n }\n }, {\n key: \"signature\",\n get: function get() {\n return this._signature;\n },\n set: function set(sign) {\n if (sign) this._signature = sign;\n }\n }]);\n\n return SourcePackage;\n}();\n\n/* harmony default export */ var runtime_catalogue_SourcePackage = (SourcePackage);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyDescriptor.js\nfunction HypertyDescriptor_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { HypertyDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return HypertyDescriptor_typeof(obj); }\n\nfunction HypertyDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyDescriptor_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return HypertyDescriptor_assertThisInitialized(self); }\n\nfunction HypertyDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction HypertyDescriptor_getPrototypeOf(o) { HypertyDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyDescriptor_getPrototypeOf(o); }\n\nfunction HypertyDescriptor_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyDescriptor_setPrototypeOf(o, p) { HypertyDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\n\n\nvar HypertyDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyDescriptor_inherits(HypertyDescriptor, _CatalogueDataObject);\n\n /**\r\n *\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object enabling the same object to be\r\n * stored and discovered in different Catalogues. Guid corresponds to per BNF of Resource Path.\r\n * @param {CatalogueObjectType} catalogueType - \tIndicates the type of Catalogue Data Object\r\n * @param {string} version\r\n * @param {string} objectName\r\n * @param {string} description\r\n * @param {string} language\r\n * @param {string} sourcePackageURL\r\n * @param {HypertyResourceType[]} hypertyType A tag that identifies what type of hyperty is described in the object.\r\n * @param {URL.HypertyCatalogueURLList} dataObjectUrls - It defines the Data Object Schemas supported by the Hyperty\r\n * through a list of Catalogue URLs from where these schemas can be reached\r\n */\n function HypertyDescriptor(guid, catalogueType, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjectUrls) {\n var _this;\n\n HypertyDescriptor_classCallCheck(this, HypertyDescriptor);\n\n _this = HypertyDescriptor_possibleConstructorReturn(this, HypertyDescriptor_getPrototypeOf(HypertyDescriptor).call(this, guid, catalogueType, version, objectName, description, language, sourcePackageURL));\n _this._configuration = {};\n _this._constraints = {};\n _this._policies = {};\n _this._messageSchema = null;\n _this._hypertyType = hypertyType;\n _this._dataObjects = dataObjectUrls;\n return _this;\n }\n\n HypertyDescriptor_createClass(HypertyDescriptor, [{\n key: \"hypertyType\",\n get: function get() {\n return this._hypertyType;\n },\n set: function set(hType) {\n if (hType) this._hypertyType = hType;\n }\n }, {\n key: \"dataObjects\",\n get: function get() {\n return this._dataObjects;\n },\n set: function set(dataObjects) {\n if (dataObjects) this._dataObjects = dataObjects;\n }\n }, {\n key: \"configuration\",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n if (configuration) this._configuration = configuration;\n }\n }, {\n key: \"constraints\",\n get: function get() {\n return this._constraints;\n },\n set: function set(constraints) {\n if (constraints) this._constraints = constraints;\n }\n }, {\n key: \"messageSchema\",\n get: function get() {\n return this._messageSchema;\n },\n set: function set(messageSchema) {\n if (messageSchema) this._messageSchema = messageSchema;\n }\n }, {\n key: \"policies\",\n get: function get() {\n return this._policies;\n },\n set: function set(policies) {\n if (policies) this._policies = policies;\n }\n }]);\n\n return HypertyDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\nvar RuntimeHypertyCapabilityType = {};\nvar HypertyType = {\n COMMUNICATOR: 'communicator',\n IDENTITY: 'identity',\n CONTEXT: 'context'\n};\nvar HypertyResourceType = {\n chat: 'CHAT',\n audio: 'Audio',\n video: 'Video',\n av: 'AV',\n screen: 'SCREEN',\n file: 'FILe',\n midi: 'MIDI'\n};\n/* harmony default export */ var runtime_catalogue_HypertyDescriptor = (HypertyDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/ProtocolStubDescriptor.js\nfunction ProtocolStubDescriptor_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { ProtocolStubDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { ProtocolStubDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return ProtocolStubDescriptor_typeof(obj); }\n\nfunction ProtocolStubDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ProtocolStubDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ProtocolStubDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) ProtocolStubDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) ProtocolStubDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction ProtocolStubDescriptor_possibleConstructorReturn(self, call) { if (call && (ProtocolStubDescriptor_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return ProtocolStubDescriptor_assertThisInitialized(self); }\n\nfunction ProtocolStubDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction ProtocolStubDescriptor_getPrototypeOf(o) { ProtocolStubDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ProtocolStubDescriptor_getPrototypeOf(o); }\n\nfunction ProtocolStubDescriptor_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ProtocolStubDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction ProtocolStubDescriptor_setPrototypeOf(o, p) { ProtocolStubDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ProtocolStubDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\n\n\nvar ProtocolStubDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n ProtocolStubDescriptor_inherits(ProtocolStubDescriptor, _CatalogueDataObject);\n\n function ProtocolStubDescriptor(guid, type, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication) {\n var _this;\n\n ProtocolStubDescriptor_classCallCheck(this, ProtocolStubDescriptor);\n\n _this = ProtocolStubDescriptor_possibleConstructorReturn(this, ProtocolStubDescriptor_getPrototypeOf(ProtocolStubDescriptor).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._messageSchemas = messageSchemas;\n if (configuration) _this._configuration = configuration;else _this._configuration = {};\n if (constraints) _this._constraints = constraints;else _this._constraints = {};\n _this._hypertyType = hypertyType;\n if (dataObjects) _this._dataObjects = dataObjects;else _this._dataObjects = [];\n _this._interworking = interworking;\n _this._idpProxy = idpProxy;\n _this._mutualAuthentication = mutualAuthentication;\n return _this;\n }\n\n ProtocolStubDescriptor_createClass(ProtocolStubDescriptor, [{\n key: \"messageSchemas\",\n get: function get() {\n return this._messageSchemas;\n },\n set: function set(messageSchemas) {\n if (messageSchemas) this._messageSchemas = messageSchemas;\n }\n }, {\n key: \"constraints\",\n get: function get() {\n return this._constraints;\n },\n set: function set(constraints) {\n if (constraints) this._constraints = constraints;\n }\n }, {\n key: \"configuration\",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n if (configuration) this._configuration = configuration;\n }\n }, {\n key: \"hypertyType\",\n get: function get() {\n return this._hypertyType;\n },\n set: function set(value) {\n this._hypertyType = value;\n }\n }, {\n key: \"dataObjects\",\n get: function get() {\n return this._dataObjects;\n },\n set: function set(value) {\n this._dataObjects = value;\n }\n }, {\n key: \"interworking\",\n get: function get() {\n return this._interworking;\n },\n set: function set(value) {\n this._interworking = value;\n }\n }, {\n key: \"idpProxy\",\n get: function get() {\n return this._idpProxy;\n },\n set: function set(value) {\n this._idpProxy = value;\n }\n }, {\n key: \"mutualAuthentication\",\n get: function get() {\n return this._mutualAuthentication;\n },\n set: function set(value) {\n this._mutualAuthentication = value;\n }\n }]);\n\n return ProtocolStubDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\n/* harmony default export */ var runtime_catalogue_ProtocolStubDescriptor = (ProtocolStubDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyRuntimeDescriptor.js\nfunction HypertyRuntimeDescriptor_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { HypertyRuntimeDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyRuntimeDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return HypertyRuntimeDescriptor_typeof(obj); }\n\nfunction HypertyRuntimeDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyRuntimeDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyRuntimeDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyRuntimeDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyRuntimeDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyRuntimeDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyRuntimeDescriptor_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return HypertyRuntimeDescriptor_assertThisInitialized(self); }\n\nfunction HypertyRuntimeDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction HypertyRuntimeDescriptor_getPrototypeOf(o) { HypertyRuntimeDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyRuntimeDescriptor_getPrototypeOf(o); }\n\nfunction HypertyRuntimeDescriptor_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyRuntimeDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyRuntimeDescriptor_setPrototypeOf(o, p) { HypertyRuntimeDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyRuntimeDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\n\n\nvar HypertyRuntimeDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyRuntimeDescriptor_inherits(HypertyRuntimeDescriptor, _CatalogueDataObject);\n\n function HypertyRuntimeDescriptor(guid, catalogueType, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub) {\n var _this;\n\n HypertyRuntimeDescriptor_classCallCheck(this, HypertyRuntimeDescriptor);\n\n _this = HypertyRuntimeDescriptor_possibleConstructorReturn(this, HypertyRuntimeDescriptor_getPrototypeOf(HypertyRuntimeDescriptor).call(this, guid, catalogueType, version, objectName, description, language, sourcePackageURL));\n _this._runtimeType = runtimeType;\n if (hypertyCapabilities) _this._hypertyCapabilities = hypertyCapabilities;else _this._hypertyCapabilities = new RuntimeHypertyCapability(true, false, false, false, false);\n if (protocolCapabilities) _this._protocolCapabilities = protocolCapabilities;else _this._protocolCapabilities = new RuntimeProtocolCapability(true, false, true, false, false, false);\n _this._p2pHandlerStub = p2pHandlerStub;\n _this._p2pRequesterStub = p2pRequesterStub;\n return _this;\n }\n\n HypertyRuntimeDescriptor_createClass(HypertyRuntimeDescriptor, [{\n key: \"runtimeType\",\n get: function get() {\n return this._runtimeType;\n },\n set: function set(runtimeType) {\n if (runtimeType) this._runtimeType = runtimeType;\n }\n }, {\n key: \"hypertyCapabilities\",\n get: function get() {\n return this._hypertyCapabilities;\n },\n set: function set(hypertyCapabilities) {\n if (hypertyCapabilities) this._hypertyCapabilities = hypertyCapabilities;\n }\n }, {\n key: \"protocolCapabilities\",\n get: function get() {\n return this._hypertyCapabilities;\n },\n set: function set(protocolCapabilities) {\n if (protocolCapabilities) this._protocolCapabilities = protocolCapabilities;\n }\n }, {\n key: \"p2pHandlerStub\",\n get: function get() {\n return this._p2pHandlerStub;\n },\n set: function set(value) {\n this._p2pHandlerStub = value;\n }\n }, {\n key: \"p2pRequesterStub\",\n get: function get() {\n return this._p2pRequesterStub;\n },\n set: function set(value) {\n this._p2pRequesterStub = value;\n }\n }]);\n\n return HypertyRuntimeDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n/**\r\n * A class representation of the capability set of the Runtime Hyperty\r\n */\n\n\nvar RuntimeHypertyCapability =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates an object of the Runtime Hyperty capability set\r\n * @param {boolean} isWebRTCSupported\r\n * @param {boolean} isMicSupported\r\n * @param {boolean} isCameraSupported\r\n * @param {boolean} isSensorSupported\r\n * @param {boolean} isORTCSupported\r\n */\n function RuntimeHypertyCapability(isWebRTCSupported, isMicSupported, isCameraSupported, isSensorSupported, isORTCSupported) {\n HypertyRuntimeDescriptor_classCallCheck(this, RuntimeHypertyCapability);\n\n this._isWebRTC = isWebRTCSupported;\n this._isMic = isMicSupported;\n this._isCamera = isCameraSupported;\n this._isSensor = isSensorSupported;\n this._isORTC = isORTCSupported;\n }\n\n HypertyRuntimeDescriptor_createClass(RuntimeHypertyCapability, [{\n key: \"getCapabilitySet\",\n value: function getCapabilitySet() {\n return JSON.stringify(this);\n }\n }, {\n key: \"isMic\",\n get: function get() {\n return this._isMic;\n }\n }, {\n key: \"isCamera\",\n get: function get() {\n return this._isCamera;\n }\n }, {\n key: \"isSensor\",\n get: function get() {\n return this._isSensor;\n }\n }, {\n key: \"isWebRTC\",\n get: function get() {\n return this._isWebRTC;\n }\n }, {\n key: \"isORTCS\",\n get: function get() {\n return this._isORTC;\n }\n }]);\n\n return RuntimeHypertyCapability;\n}();\n/**\r\n * A class representation of the protocol capability set of the Runtime Hyperty\r\n */\n\nvar RuntimeProtocolCapability =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates an object of the runtime protocol capability\r\n * @param {boolean} isHttp\r\n * @param {boolean} isHttps\r\n * @param {boolean} isWS\r\n * @param {boolean} isWSS\r\n * @param {boolean} isCoap\r\n * @param {boolean} isDataChannel\r\n */\n function RuntimeProtocolCapability(isHttp, isHttps, isWS, isWSS, isCoap, isDataChannel) {\n HypertyRuntimeDescriptor_classCallCheck(this, RuntimeProtocolCapability);\n\n this._isHttp = isHttp;\n this._isHttps = isHttps;\n this._isWS = isWS;\n this._isWSS = isWSS;\n this._isCoap = isCoap;\n this._isDataChannel = isDataChannel;\n }\n\n HypertyRuntimeDescriptor_createClass(RuntimeProtocolCapability, [{\n key: \"isHttp\",\n value: function isHttp() {\n return this._isHttp;\n }\n }, {\n key: \"isHttps\",\n value: function isHttps() {\n return this._isHttps;\n }\n }, {\n key: \"isWS\",\n value: function isWS() {\n return this._isWS;\n }\n }, {\n key: \"isSensorSupported\",\n value: function isSensorSupported() {\n return this._isSensor;\n }\n }, {\n key: \"isWSS\",\n value: function isWSS() {\n return this._isWSS;\n }\n }, {\n key: \"isCoap\",\n value: function isCoap() {\n return this._isCoap;\n }\n }, {\n key: \"isDataChannel\",\n value: function isDataChannel() {\n return this._isDataChannel;\n }\n }, {\n key: \"getCapabilitySet\",\n value: function getCapabilitySet() {\n return JSON.stringify(this);\n }\n }]);\n\n return RuntimeProtocolCapability;\n}();\nvar RuntimeType = {\n BROWSER: 'browser',\n STANDALONE: 'standalone',\n SERVER: 'server',\n GATEWAY: 'gateway'\n};\n/* harmony default export */ var runtime_catalogue_HypertyRuntimeDescriptor = (HypertyRuntimeDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyInterceptorDescriptor.js\nfunction HypertyInterceptorDescriptor_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { HypertyInterceptorDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyInterceptorDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return HypertyInterceptorDescriptor_typeof(obj); }\n\nfunction HypertyInterceptorDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyInterceptorDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyInterceptorDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyInterceptorDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyInterceptorDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyInterceptorDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyInterceptorDescriptor_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return HypertyInterceptorDescriptor_assertThisInitialized(self); }\n\nfunction HypertyInterceptorDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction HypertyInterceptorDescriptor_getPrototypeOf(o) { HypertyInterceptorDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyInterceptorDescriptor_getPrototypeOf(o); }\n\nfunction HypertyInterceptorDescriptor_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyInterceptorDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyInterceptorDescriptor_setPrototypeOf(o, p) { HypertyInterceptorDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyInterceptorDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by pzu on 19.11.15.\r\n */\n\n\nvar PolicyEnforcerDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyInterceptorDescriptor_inherits(PolicyEnforcerDescriptor, _CatalogueDataObject);\n\n function PolicyEnforcerDescriptor(guid, type, version, objectName, description, language, sourcePackageURL, configuration, policies) {\n var _this;\n\n HypertyInterceptorDescriptor_classCallCheck(this, PolicyEnforcerDescriptor);\n\n _this = HypertyInterceptorDescriptor_possibleConstructorReturn(this, HypertyInterceptorDescriptor_getPrototypeOf(PolicyEnforcerDescriptor).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._configuration = configuration;\n _this._policies = policies;\n return _this;\n }\n\n HypertyInterceptorDescriptor_createClass(PolicyEnforcerDescriptor, [{\n key: \"configuration\",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n this._configuration = configuration;\n }\n }, {\n key: \"policies\",\n get: function get() {\n return this._policies;\n },\n set: function set(policies) {\n this._policies = policies;\n }\n }]);\n\n return PolicyEnforcerDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\n/* harmony default export */ var HypertyInterceptorDescriptor = (PolicyEnforcerDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/DataObjectSchema.js\nfunction DataObjectSchema_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObjectSchema_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectSchema_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObjectSchema_typeof(obj); }\n\nfunction DataObjectSchema_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectSchema_possibleConstructorReturn(self, call) { if (call && (DataObjectSchema_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return DataObjectSchema_assertThisInitialized(self); }\n\nfunction DataObjectSchema_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction DataObjectSchema_getPrototypeOf(o) { DataObjectSchema_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataObjectSchema_getPrototypeOf(o); }\n\nfunction DataObjectSchema_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DataObjectSchema_setPrototypeOf(subClass, superClass); }\n\nfunction DataObjectSchema_setPrototypeOf(o, p) { DataObjectSchema_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataObjectSchema_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by pzu on 19.11.15.\r\n */\n\nvar DataObjectSchema =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n DataObjectSchema_inherits(DataObjectSchema, _CatalogueDataObject);\n\n function DataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL) {\n DataObjectSchema_classCallCheck(this, DataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(DataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n }\n\n return DataObjectSchema;\n}(runtime_catalogue_CatalogueDataObject); //Children\n\nvar MessageDataObjectSchema =\n/*#__PURE__*/\nfunction (_DataObjectSchema) {\n DataObjectSchema_inherits(MessageDataObjectSchema, _DataObjectSchema);\n\n function MessageDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL) {\n DataObjectSchema_classCallCheck(this, MessageDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(MessageDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n }\n\n return MessageDataObjectSchema;\n}(DataObjectSchema);\nvar HypertyDataObjectSchema =\n/*#__PURE__*/\nfunction (_DataObjectSchema2) {\n DataObjectSchema_inherits(HypertyDataObjectSchema, _DataObjectSchema2);\n\n function HypertyDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy, dataUrlScheme) {\n var _this;\n\n DataObjectSchema_classCallCheck(this, HypertyDataObjectSchema);\n\n _this = DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(HypertyDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._accessControlPolicy = accessControlPolicy;\n _this._scheme = dataUrlScheme;\n return _this;\n }\n\n return HypertyDataObjectSchema;\n}(DataObjectSchema); //Children\n\nvar CommunicationDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch) {\n DataObjectSchema_inherits(CommunicationDataObjectSchema, _HypertyDataObjectSch);\n\n function CommunicationDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, CommunicationDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(CommunicationDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return CommunicationDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar ConnectionDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch2) {\n DataObjectSchema_inherits(ConnectionDataObjectSchema, _HypertyDataObjectSch2);\n\n function ConnectionDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, ConnectionDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(ConnectionDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return ConnectionDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar IdentityDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch3) {\n DataObjectSchema_inherits(IdentityDataObjectSchema, _HypertyDataObjectSch3);\n\n function IdentityDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, IdentityDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(IdentityDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return IdentityDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar ContextDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch4) {\n DataObjectSchema_inherits(ContextDataObjectSchema, _HypertyDataObjectSch4);\n\n function ContextDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, ContextDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(ContextDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return ContextDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar DataUrlScheme = {\n COMM: 'COMM',\n CONNECTION: 'CONNECTION',\n CTXT: 'CTXT',\n IDENTITY: 'IDENTITY'\n};\n/* harmony default export */ var runtime_catalogue_DataObjectSchema = (DataObjectSchema);\n// CONCATENATED MODULE: ./src/runtime-catalogue/CatalogueDataObjectFactory.js\nfunction CatalogueDataObjectFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction CatalogueDataObjectFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CatalogueDataObjectFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) CatalogueDataObjectFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) CatalogueDataObjectFactory_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n\n\n\n\n\n\n\nvar CatalogueDataObjectFactory_CatalogueDataObjectFactory =\n/*#__PURE__*/\nfunction () {\n function CatalogueDataObjectFactory() {\n CatalogueDataObjectFactory_classCallCheck(this, CatalogueDataObjectFactory);\n }\n\n CatalogueDataObjectFactory_createClass(CatalogueDataObjectFactory, [{\n key: \"createCatalogueDataObject\",\n\n /**\r\n * Create CatalogueDataObject\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {CatalogueObjectType} type - Indicates the type of Catalogue Data Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @returns {CatalogueDataObject}\r\n */\n value: function createCatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === \"undefined\" || typeof type === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new runtime_catalogue_CatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL);\n }\n /**\r\n * Create HypertyDescriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object\r\n * can be downloaded.\r\n * @param {HypertyResourceType[]} hypertyType - An array of HypertyResourceType that identifies what type of hyperty\r\n * resources are handled by the object.\r\n * @param {URL.URLList} dataObjects - Defines the Data Object Schemas supported by the Hyperty through a list of Catalogue URLs from where these schemas can be reached.\r\n * @returns {HypertyDescriptor}\r\n */\n\n }, {\n key: \"createHypertyDescriptorObject\",\n value: function createHypertyDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjects) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\" || typeof hypertyType === \"undefined\" || typeof dataObjects === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new runtime_catalogue_HypertyDescriptor(guid, CatalogueObjectType.HYPERTY, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjects);\n }\n /**\r\n * Create ProtocolStubDescriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param {URL.URL} messageSchemas - Defines the Schema describing the Message Data Model used by the Hyperty through the Catalogue URL from where the Message schema can be reached. If not defined, by default it is assumed the standard Message Model is used.\r\n * @param configuration - Data required to configure the ProtocolStub\r\n * @param constraints - Describes capabilities required from the Hyperty Runtime in order to be able to execute the ProtocolStub\r\n * @param hypertyType\r\n * @param dataObjects\r\n * @param interworking\r\n * @param idpProxy\r\n * @param mutualAuthentication\r\n * @returns {ProtocolStubDescriptor}\r\n */\n\n }, {\n key: \"createProtoStubDescriptorObject\",\n value: function createProtoStubDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\" || typeof messageSchemas === \"undefined\" || typeof configuration === \"undefined\" || typeof constraints === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new runtime_catalogue_ProtocolStubDescriptor(guid, CatalogueObjectType.PROTOSTUB, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication);\n }\n /**\r\n * Create HypertyRuntimeDescriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param {RuntimeType}runtimeType\r\n * @param {RuntimeHypertyCapabilities} hypertyCapabilities - Supported capabilities to execute Hyperties\r\n * @param {RuntimeProtocolCapabilities} protocolCapabilities - Supported capabilities to execute Protocol Stubs\r\n * @param p2pHandlerStub\r\n * @param p2pRequesterStub\r\n * @returns {HypertyRuntimeDescriptor} the data object of the Hyperty Runtime Descriptor\r\n */\n\n }, {\n key: \"createHypertyRuntimeDescriptorObject\",\n value: function createHypertyRuntimeDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\" || typeof runtimeType === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new runtime_catalogue_HypertyRuntimeDescriptor(guid, CatalogueObjectType.HYPERTY_RUNTIME, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub);\n }\n /**\r\n * Create Hyperty Interceptor Descriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param configuration\r\n * @param policies\r\n * @returns {PolicyEnforcerDescriptor}\r\n */\n\n }, {\n key: \"createHypertyInterceptorDescriptorObject\",\n value: function createHypertyInterceptorDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, configuration, policies) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new HypertyInterceptorDescriptor(guid, CatalogueObjectType.HYPERTY_INTERCEPTOR, version, objectName, description, language, sourcePackageURL, configuration, policies);\n }\n /**\r\n * Create DataObjectSchema which in effect is the MessageDataObjectSchema\r\n * @deprecated Use either createMessageDataObjectSchema or createHypertyDataObjectSchema instead\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: \"createDataObjectSchema\",\n value: function createDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new DataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL);\n }\n /**\r\n * Create DataObjectSchema which in effect is the MessageDataObjectSchema\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: \"createMessageDataObjectSchema\",\n value: function createMessageDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new DataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL);\n }\n /**\r\n * Create HypertyDataObjectSchema\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param {string} accessControlPolicy - policy rule to access object (see Reporter-Observer Comm pattern)\r\n * @param {DataUrlScheme} scheme - identifies the data scheme (COMM, CONNECTION, CTXT or IDENTITY)\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: \"createHypertyDataObjectSchema\",\n value: function createHypertyDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL, accessControlPolicy, scheme) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\" || typeof scheme === \"undefined\" || typeof accessControlPolicy === \"undefined\") throw new Error(\"Invalid parameters!\");\n if (scheme === DataUrlScheme.COMM) return new CommunicationDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.CONNECTION) return new ConnectionDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.CTXT) return new ContextDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.IDENTITY) return new IdentityDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);\n }\n /**\r\n * Create SourcePackage\r\n * @param sourceCodeClassname - The Class-name of the SourceCode\r\n * @param sourceCode - The source code of the catalogue object\r\n * @returns {SourcePackage}\r\n */\n\n }, {\n key: \"createSourcePackage\",\n value: function createSourcePackage(sourceCodeClassname, sourceCode) {\n if (typeof sourceCode === \"undefined\" || typeof sourceCodeClassname === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new runtime_catalogue_SourcePackage(sourceCodeClassname, sourceCode);\n }\n }]);\n\n return CatalogueDataObjectFactory;\n}();\n\n/* harmony default export */ var runtime_catalogue_CatalogueDataObjectFactory = (CatalogueDataObjectFactory_CatalogueDataObjectFactory);\n// CONCATENATED MODULE: ./src/runtime-catalogue/RuntimeCatalogue.js\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction RuntimeCatalogue_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RuntimeCatalogue_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RuntimeCatalogue_createClass(Constructor, protoProps, staticProps) { if (protoProps) RuntimeCatalogue_defineProperties(Constructor.prototype, protoProps); if (staticProps) RuntimeCatalogue_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar RuntimeCatalogue_log = loglevel[\"getLogger\"]('RuntimeCatalogue');\n\n\nvar RuntimeCatalogue_RuntimeCatalogue =\n/*#__PURE__*/\nfunction () {\n function RuntimeCatalogue(runtimeFactory, name, schema) {\n RuntimeCatalogue_classCallCheck(this, RuntimeCatalogue);\n\n if (!runtimeFactory) throw Error('The catalogue needs the runtimeFactory');\n this._factory = new runtime_catalogue_CatalogueDataObjectFactory();\n this.httpRequest = runtimeFactory.createHttpRequest();\n this.atob = runtimeFactory.atob ? runtimeFactory.atob : atob;\n var storageName = name ? name : 'runtimeCatalogue';\n var storageSchema = schema ? schema : '&cguid, accessControlPolicy, constraints, dataObjects, hypertyType, objectName, sourcePackage, version';\n var schemas = {};\n schemas[storageName] = storageSchema;\n this.storageManager = runtimeFactory.storageManager(storageName, schemas);\n }\n /**\r\n * Get a Catalogue Data Object (Descriptor) from a URL, and construct it using the provided function\r\n * @param {String} descriptorURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty\r\n * @param {function} createFunc - e.g. createHyperty\r\n * @param {boolean} [getFull] - whether or not to get descriptor with sourcePackage, or only the descriptor part\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise} - Promise that fulfills with the requested descriptor in the appropriate type.\r\n * If constraints were provided, a descriptor is only returned if it meets the constraints, otherwise the promise will be rejected.\r\n */\n\n\n RuntimeCatalogue_createClass(RuntimeCatalogue, [{\n key: \"getDescriptor\",\n value: function getDescriptor(descriptorURL, createFunc) {\n var _this = this;\n\n var getFull = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n var constraints = arguments.length > 3 ? arguments[3] : undefined;\n RuntimeCatalogue_log.info('[RuntimeCatalogue] - getting descriptor from: ', descriptorURL, ' with constraints: ', constraints); // some flags for optimization\n // (later the descriptor will not be saved in case both of these booleans are true)\n\n var isSavedDescriptor = false;\n var isCompleteDescriptor = false; // get raw descriptor\n // first checks if descriptor is already in localStorage (based on cguid and version)\n\n var descriptorPromise;\n\n if (constraints != undefined) {\n descriptorPromise = Promise.all([this.httpRequest.post(descriptorURL + '/version', {\n body: JSON.stringify(constraints)\n }), this.httpRequest.post(descriptorURL + '/cguid', {\n body: JSON.stringify(constraints)\n })]);\n } else {\n descriptorPromise = Promise.all([this.httpRequest.get(descriptorURL + '/version'), this.httpRequest.get(descriptorURL + '/cguid')]);\n }\n\n descriptorPromise = descriptorPromise.then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n version = _ref2[0],\n cguid = _ref2[1];\n\n RuntimeCatalogue_log.log('[RuntimeCatalogue.getDescriptor] - got version (' + version + ') and cguid (' + cguid + ') for descriptor ' + descriptorURL); // check if same version is contained in localStorage\n\n return _this.storageManager.getVersion('cguid', cguid).then(function (dbVersion) {\n if (dbVersion >= version) {\n RuntimeCatalogue_log.log('[RuntimeCatalogue.getDescriptor] local version is updated for ', descriptorURL);\n isSavedDescriptor = true;\n return _this.storageManager.get('cguid', cguid);\n } else {\n RuntimeCatalogue_log.log('[RuntimeCatalogue.getDescriptor] local version not updated for ', descriptorURL, ' retrieving from remote catalogue ...'); // no saved copy, proceed with retrieving descriptor\n\n var retrievePromise = constraints != undefined ? _this.httpRequest.post(descriptorURL, {\n body: JSON.stringify(constraints)\n }) : _this.httpRequest.get(descriptorURL);\n return retrievePromise.then(function (descriptor) {\n descriptor = JSON.parse(descriptor); //log.log(\"got descriptor:\", JSON.stringify(descriptor, null, 2));\n\n if (descriptor['ERROR']) {\n // TODO handle error properly\n throw new Error(descriptor);\n } else {\n return descriptor;\n }\n });\n }\n });\n }).catch(function (error) {\n var errorString = 'Unable to get descriptor for ' + descriptorURL + (constraints != undefined ? ' with constraints ' + constraints : '') + ': ' + error;\n RuntimeCatalogue_log.error(errorString);\n throw new Error(errorString);\n });\n var returnPromise = descriptorPromise; // if getFull, attach sourcePackage\n\n if (getFull) {\n RuntimeCatalogue_log.log('adding promise to attach sourcePackage');\n returnPromise = descriptorPromise.then(function (descriptor) {\n if (descriptor.sourcePackage) {\n isCompleteDescriptor = true;\n return descriptor;\n } else {\n isCompleteDescriptor = false;\n return _this.attachRawSourcePackage(descriptor);\n }\n });\n } // finally create object\n\n\n returnPromise = returnPromise.then(function (descriptor) {\n // store if not saved before, or if full descriptor was requested and only partial descriptor was stored.\n if (!isSavedDescriptor || isSavedDescriptor && !isCompleteDescriptor && getFull) {\n _this.storageManager.set(descriptor.cguid, descriptor.version, descriptor);\n }\n\n return createFunc.apply(_this, [descriptor, constraints]);\n });\n return returnPromise;\n }\n /**\r\n * Uses the sourcePackageURL from the descriptor, requests the sourcePackage and attaches it to the descriptor.\r\n * @param {CatalogueDataObject} descriptor\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise} - fulfills with complete descriptor\r\n */\n\n }, {\n key: \"attachRawSourcePackage\",\n value: function attachRawSourcePackage(descriptor, constraints) {\n var _this2 = this;\n\n RuntimeCatalogue_log.log('attaching raw sourcePackage from:', descriptor.sourcePackageURL);\n return new Promise(function (resolve, reject) {\n var retrievePromise = constraints != undefined ? _this2.httpRequest.post(descriptor.sourcePackageURL, {\n body: JSON.stringify(constraints)\n }) : _this2.httpRequest.get(descriptor.sourcePackageURL);\n retrievePromise.then(function (sourcePackage) {\n sourcePackage = JSON.parse(sourcePackage); //delete descriptor.sourcePackageURL;\n //log.log(\"attaching sourcePackage:\", sourcePackage);\n\n descriptor.sourcePackage = sourcePackage;\n resolve(descriptor);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n /**\r\n * Get HypertyDescriptor\r\n * @param hypertyURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: \"getHypertyDescriptor\",\n value: function getHypertyDescriptor(hypertyURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(hypertyURL, this.createHyperty, getFull, constraints);\n }\n /**\r\n * Get StubDescriptor\r\n * @param stubURL - e.g. mydomain.com/.well-known/protostub/MyProtostub\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: \"getStubDescriptor\",\n value: function getStubDescriptor(stubURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(stubURL, this.createStub, getFull, constraints);\n }\n /**\r\n * Get RuntimeDescriptor\r\n * @param runtimeURL - e.g. mydomain.com/.well-known/runtime/MyRuntime\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: \"getRuntimeDescriptor\",\n value: function getRuntimeDescriptor(runtimeURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(runtimeURL, this.createRuntimeDescriptor, getFull, constraints);\n }\n /**\r\n * Get DataSchemaDescriptor\r\n * @param dataSchemaURL - e.g. mydomain.com/.well-known/dataschema/MyDataSchema\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: \"getDataSchemaDescriptor\",\n value: function getDataSchemaDescriptor(dataSchemaURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n // return this.getDescriptor(dataSchemaURL, this.createDataSchema, getFull, constraints)\n return new Promise(function (resolve) {\n var schema = dataSchemaURL.split('/dataschema/')[1];\n RuntimeCatalogue_log.log('[RuntimeCatalogue.getDataSchemaDescriptor] schema ', schema);\n var descriptor = {\n sourcePackage: {\n sourceCode: {\n properties: {}\n }\n }\n }; // let scheme = properties.scheme ? properties.scheme.co : [];\n\n switch (schema) {\n case 'Context':\n case 'ContextReporter':\n case 'ContextObserver':\n descriptor.sourcePackage.sourceCode.properties.scheme = 'context';\n break;\n\n case 'Connection':\n descriptor.sourcePackage.sourceCode.properties.scheme = 'connection';\n break;\n\n case 'WalletData':\n descriptor.sourcePackage.sourceCode.properties.scheme = 'walletData';\n break;\n\n case 'Communication':\n descriptor.sourcePackage.sourceCode.properties.scheme = 'comm';\n descriptor.sourcePackage.sourceCode.properties.childrens = ['resources'];\n break;\n\n case 'HelloWorldDataSchema':\n descriptor.sourcePackage.sourceCode.properties.scheme = 'hello';\n break;\n\n default:\n descriptor.sourcePackage.sourceCode.properties.scheme = 'resource';\n descriptor.sourcePackage.sourceCode.properties.childrens = [];\n break;\n }\n\n resolve(descriptor);\n });\n }\n /**\r\n * Get IDPProxyDescriptor\r\n * @param idpProxyURL - e.g. mydomain.com/.well-known/idp-proxy/MyProxy\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: \"getIdpProxyDescriptor\",\n value: function getIdpProxyDescriptor(idpProxyURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(idpProxyURL, this.createIdpProxy, getFull, constraints);\n }\n /**\r\n * Create HypertyDescriptor based on raw object that contains its attributes\r\n * @param {JSON} rawHyperty\r\n * @returns {HypertyDescriptor}\r\n */\n\n }, {\n key: \"createHyperty\",\n value: function createHyperty(rawHyperty) {\n //log.log(\"createHyperty:\", rawHyperty);\n // create the descriptor\n var hyperty = this._factory.createHypertyDescriptorObject(rawHyperty['cguid'], rawHyperty['version'], rawHyperty['objectName'], rawHyperty['description'], rawHyperty['language'], rawHyperty['sourcePackageURL'], rawHyperty['type'] || rawHyperty['hypertyType'], rawHyperty['dataObjects']); //log.log(\"factory returned:\", hyperty);\n // optional fields\n\n\n hyperty.configuration = rawHyperty['configuration'];\n hyperty.constraints = rawHyperty['constraints'];\n hyperty.messageSchema = rawHyperty['messageSchema'];\n hyperty.policies = rawHyperty['policies'];\n hyperty.signature = rawHyperty['signature']; // parse and attach sourcePackage\n\n var sourcePackage = rawHyperty['sourcePackage'];\n\n if (sourcePackage) {\n hyperty.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return hyperty;\n }\n /**\r\n * Create ProtocolStubDescriptor based on raw object that contains its attributes\r\n * @param rawStub\r\n * @returns {ProtocolStubDescriptor}\r\n */\n\n }, {\n key: \"createStub\",\n value: function createStub(rawStub) {\n // log.log(\"creating stub descriptor based on: \", rawStub);\n // create the descriptor\n var stub = this._factory.createProtoStubDescriptorObject(rawStub['cguid'], rawStub['version'], rawStub['objectName'], rawStub['description'], rawStub['language'], rawStub['sourcePackageURL'], rawStub['messageSchemas'], rawStub['configuration'], rawStub['constraints'], rawStub['hypertyType'], rawStub['dataObjects'], rawStub['interworking'], rawStub['idpProxy'], rawStub['mutualAuthentication']); // optional fields\n\n\n stub.signature = rawStub['signature']; // parse and attach the sourcePackage\n\n var sourcePackage = rawStub['sourcePackage'];\n\n if (sourcePackage) {\n stub.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return stub;\n }\n /**\r\n * Create HypertyRuntimeDescriptor based on raw object that contains its attributes\r\n * @param rawRuntime\r\n * @returns {HypertyRuntimeDescriptor}\r\n */\n\n }, {\n key: \"createRuntimeDescriptor\",\n value: function createRuntimeDescriptor(rawRuntime) {\n // parse capabilities first\n try {\n rawRuntime['hypertyCapabilities'] = JSON.parse(rawRuntime['hypertyCapabilities']);\n rawRuntime['protocolCapabilities'] = JSON.parse(rawRuntime['protocolCapabilities']);\n } catch (e) {} // already json object\n //log.log(\"creating runtime descriptor based on: \", rawRuntime);\n // create the descriptor\n\n\n var runtime = this._factory.createHypertyRuntimeDescriptorObject(rawRuntime['cguid'], rawRuntime['version'], rawRuntime['objectName'], rawRuntime['description'], rawRuntime['language'], rawRuntime['sourcePackageURL'], rawRuntime['type'] || rawRuntime['runtimeType'], rawRuntime['hypertyCapabilities'], rawRuntime['protocolCapabilities'], rawRuntime['p2pHandlerStub'], rawRuntime['p2pRequesterStub']); // optional fields\n\n\n runtime.signature = rawRuntime['signature']; // parse and attach sourcePackage\n\n var sourcePackage = rawRuntime['sourcePackage'];\n\n if (sourcePackage) {\n // log.log(\"runtime has sourcePackage:\", sourcePackage);\n runtime.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return runtime;\n }\n /**\r\n * Create DataObjectSchema based on raw object that contains its attributes\r\n * @param rawSchema\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: \"createDataSchema\",\n value: function createDataSchema(rawSchema) {\n //log.log(\"creating dataSchema based on: \", rawSchema);\n var dataSchema; //log.log('1. createMessageDataObjectSchema: ', rawSchema[\"accessControlPolicy\"]);\n //log.log('2. createMessageDataObjectSchema: ', rawSchema[\"scheme\"]);\n\n if (rawSchema['accessControlPolicy'] && rawSchema['scheme']) {\n dataSchema = this._factory.createHypertyDataObjectSchema(rawSchema['cguid'], rawSchema['version'], rawSchema['objectName'], rawSchema['description'], rawSchema['language'], rawSchema['sourcePackageURL'], rawSchema['accessControlPolicy'], rawSchema['scheme']);\n } else {\n //log.log('3. createMessageDataObjectSchema: ', rawSchema);\n dataSchema = this._factory.createMessageDataObjectSchema(rawSchema['cguid'], rawSchema['version'], rawSchema['objectName'], rawSchema['description'], rawSchema['language'], rawSchema['sourcePackageURL']);\n } // optional fields\n\n\n dataSchema.signature = rawSchema['signature']; // parse and attach sourcePackage\n\n var sourcePackage = rawSchema['sourcePackage'];\n\n if (sourcePackage) {\n //log.log(\"dataSchema has sourcePackage:\", sourcePackage);\n dataSchema.sourcePackage = this.createSourcePackage(sourcePackage);\n\n try {\n dataSchema.sourcePackage.sourceCode = JSON.parse(dataSchema.sourcePackage.sourceCode);\n } catch (e) {\n RuntimeCatalogue_log.log('DataSchema Source code is already parsed');\n }\n\n return dataSchema;\n } //log.log(\"created dataSchema descriptor object:\", dataSchema);\n\n\n return dataSchema;\n }\n /**\r\n * Create ProtocolStubDescriptor based on raw object that contains its attributes\r\n * @param rawProxy\r\n * @returns {ProtocolStubDescriptor}\r\n */\n\n }, {\n key: \"createIdpProxy\",\n value: function createIdpProxy(rawProxy) {\n // log.log(\"creating idpproxy descriptor based on: \", rawProxy);\n // create the descriptor\n var idpproxy = this._factory.createProtoStubDescriptorObject(rawProxy['cguid'], rawProxy['version'], rawProxy['objectName'], rawProxy['description'], rawProxy['language'], rawProxy['sourcePackageURL'], rawProxy['messageSchemas'], rawProxy['configuration'], rawProxy['constraints'], rawProxy['hypertyType'], rawProxy['dataObjects'], rawProxy['interworking'], rawProxy['idpProxy'], rawProxy['mutualAuthentication']); // optional fields\n\n\n idpproxy.signature = rawProxy['signature']; // parse and attach the sourcePackage\n\n var sourcePackage = rawProxy['sourcePackage'];\n\n if (sourcePackage) {\n sourcePackage = this.createSourcePackage(sourcePackage);\n idpproxy.sourcePackage = sourcePackage;\n }\n\n return idpproxy;\n }\n }, {\n key: \"createSourcePackage\",\n value: function createSourcePackage(sp) {\n //log.log(\"createSourcePackage:\", sp);\n // check encoding\n if (sp['encoding'] === 'base64') {\n sp['sourceCode'] = this.atob(sp['sourceCode']);\n sp['encoding'] = 'utf-8';\n }\n\n var sourcePackage = this._factory.createSourcePackage(sp['sourceCodeClassname'], sp['sourceCode']);\n\n if (sp['encoding']) sourcePackage.encoding = sp['encoding'];\n if (sp['signature']) sourcePackage.signature = sp['signature'];\n return sourcePackage;\n }\n /**\r\n * Get source Package from a URL\r\n * @param sourcePackageURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty/sourcePackage\r\n * @returns {Promise}\r\n */\n\n }, {\n key: \"getSourcePackageFromURL\",\n value: function getSourcePackageFromURL(sourcePackageURL) {\n var _this3 = this;\n\n RuntimeCatalogue_log.log('getting sourcePackage from:', sourcePackageURL);\n return new Promise(function (resolve, reject) {\n _this3.httpRequest.get(sourcePackageURL).then(function (result) {\n //log.log(\"got raw sourcePackage:\", result);\n if (result['ERROR']) {\n // TODO handle error properly\n reject(result);\n } else {\n result = JSON.parse(result);\n\n var sourcePackage = _this3.createSourcePackage(result);\n\n resolve(sourcePackage);\n }\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n /**\r\n * Returns the sourceCode of a given descriptor\r\n * @param {CatalogueDataObject} descriptor - Catalogue Object that was retrieved using e.g. getHypertyDescriptor()\r\n * @returns {Promise}\r\n */\n\n }, {\n key: \"getSourceCodeFromDescriptor\",\n value: function getSourceCodeFromDescriptor(descriptor) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n if (descriptor.sourcePackage) {\n //log.log(\"descriptor has sourcePackage\");\n //log.log(\"returning sourceCode:\", descriptor.sourcePackage.sourceCode);\n resolve(descriptor.sourcePackage.sourceCode);\n } else {\n _this4.storageManager.getVersion(descriptor.sourcePackageURL + '/sourceCode').then(function (dbVersion) {\n if (dbVersion >= descriptor.version) {\n RuntimeCatalogue_log.log('returning cached version from storageManager');\n\n _this4.storageManager.get(descriptor.sourcePackageURL + '/sourceCode').then(function (sourceCode) {\n resolve(sourceCode);\n }).catch(function (reason) {\n reject(reason);\n });\n } else {\n _this4.httpRequest.get(descriptor.sourcePackageURL + '/sourceCode').then(function (sourceCode) {\n if (sourceCode['ERROR']) {\n // TODO handle error properly\n reject(sourceCode);\n } else {\n _this4.storageManager.set(descriptor.sourcePackageURL + '/sourceCode', descriptor.version, sourceCode);\n\n resolve(sourceCode);\n }\n }).catch(function (reason) {\n reject(reason);\n });\n }\n }).catch(function (reason) {\n reject(reason);\n });\n }\n });\n }\n /**\r\n * Returns the list of available catalogue objects for the given \"type URL\",\r\n * i.e. a catalogue URL that specifies a type, but no catalogue object name.\r\n * @param typeURL - URL pointing to the catalogue object type you want a list of available objects for,\r\n * e.g. hyperty-catalogue://catalogue.fokus.fraunhofer.de/.well-known/idp-proxy\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise} typeListPromise - Promise that fulfills with the list of available catalogue object names for the requested type,\r\n * rejects on HTTP error or if the HTTP response is not in JSON.\r\n * If constraints were provided, then the list only contains those objects that meet the constraints\r\n */\n\n }, {\n key: \"getTypeList\",\n value: function getTypeList(typeURL, constraints) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n var requestPromise = constraints != undefined ? _this5.httpRequest.post(typeURL, {\n body: JSON.stringify(constraints)\n }) : _this5.httpRequest.get(typeURL);\n requestPromise.then(function (typeList) {\n typeList = JSON.parse(typeList);\n resolve(typeList);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"deleteFromPM\",\n value: function deleteFromPM(url) {\n return this.storageManager.delete(url);\n }\n }, {\n key: \"runtimeURL\",\n set: function set(runtimeURL) {\n this._runtimeURL = runtimeURL;\n },\n get: function get() {\n return this._runtimeURL;\n }\n }]);\n\n return RuntimeCatalogue;\n}();\n\n/* harmony default export */ var runtime_catalogue_RuntimeCatalogue = (RuntimeCatalogue_RuntimeCatalogue);\n// CONCATENATED MODULE: ./src/runtime/RuntimeUA.js\nfunction RuntimeUA_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RuntimeUA_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RuntimeUA_createClass(Constructor, protoProps, staticProps) { if (protoProps) RuntimeUA_defineProperties(Constructor.prototype, protoProps); if (staticProps) RuntimeUA_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n // Log System\n\n\nvar RuntimeUA_log = loglevel[\"getLogger\"]('RuntimeUA'); //Main dependecies\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n //import GraphConnector from '../graphconnector/GraphConnector';\n\n\n\n\n\n\n\n\n/**\r\n * Runtime User Agent Interface will process all the dependecies of the core runtime;\r\n * @author Vitor Silva [vitor-t-silva@telecom.pt]\r\n * @version 0.4.0\r\n *\r\n * @property {runtimeFactory} runtimeFactory - Specific implementation for all environments;\r\n * @property {RuntimeCatalogue} runtimeCatalogue - Catalogue of components can be installed;\r\n * @property {runtimeURL} runtimeURL - This identify the core runtime, should be unique;\r\n * @property {IdentityModule} identityModule - Identity Module;\r\n * @property {PEP} policyEngine - Policy Engine Module;\r\n * @property {Registry} registry - Registry Module;\r\n * @property {MessageBus} messageBus - Message Bus is used like a router to redirect the messages from one component to other(s)\r\n * @property {GraphConnector} graphConnector - Graph Connector handling GUID and contacts\r\n * @property {CoreDiscovery} coreDiscovery - Discovery for discovery hyperties/dataObjects\r\n */\n\nvar RuntimeUA_RuntimeUA =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Create a new instance of Runtime User Agent\r\n * @param {descriptor} runtimeDescriptor - pass all the hyperty runtime descriptor\r\n * @param {runtimeFactory} runtimeFactory - Specific implementation for the environment where the core runtime will run;\r\n * @param {domain} domainURL - specify the domain base for the runtime;\r\n */\n function RuntimeUA(runtimeDescriptor, runtimeFactory, domain) {\n RuntimeUA_classCallCheck(this, RuntimeUA);\n\n if (!runtimeDescriptor) throw new Error('The runtime descriptor is a needed parameter');\n if (!runtimeFactory) throw new Error('The sandbox factory is a needed parameter');\n if (!domain) throw new Error('You need the domain of runtime'); // Configuration object with information related with servers\n\n this.runtimeConfiguration = Object.assign({\n domain: domain\n }, runtimeConfiguration_runtimeConfiguration);\n this.runtimeFactory = runtimeFactory;\n this.log = RuntimeUA_log;\n this.logLevels = loglevel_default.a;\n\n if (runtimeDescriptor.p2pHandlerStub && typeof runtimeDescriptor.p2pHandlerStub === 'string' && runtimeDescriptor.p2pHandlerStub.includes('://')) {\n this.p2p = true;\n } else {\n this.p2p = false;\n }\n\n runtimeUtils.runtimeDescriptor = runtimeDescriptor;\n this.runtimeUtils = runtimeUtils;\n this.storages = {};\n /* if (typeof runtimeFactory.createRuntimeCatalogue === 'function') {\r\n this.runtimeCatalogue = runtimeFactory.createRuntimeCatalogue();\r\n } else {\r\n throw new Error('Check your Runtime Factory because it needs the Runtime Catalogue implementation');\r\n }*/\n\n this.runtimeCatalogue = new runtime_catalogue_RuntimeCatalogue(runtimeFactory);\n /* if (typeof runtimeFactory.persistenceManager === 'function') {\r\n this.persistenceManager = runtimeFactory.persistenceManager();\r\n } else {\r\n throw new Error('Check your Runtime Factory because it needs the Persistence Manager implementation');\r\n }*/\n\n if (typeof runtimeFactory.storageManager === 'function') {\n this.storages = Storage_storage(runtimeFactory, this);\n } else {\n throw new Error('Check your Runtime Factory because it needs the Storage Manager implementation');\n }\n\n if (typeof runtimeFactory.runtimeCapabilities === 'function') {\n this.runtimeCapabilities = runtimeFactory.runtimeCapabilities(this.storages.capabilities);\n } else {\n RuntimeUA_log.info('Check your RuntimeFactory because it needs the Runtime Capabilities implementation');\n }\n }\n /**\r\n * Intialize the installation of runtime\r\n *\r\n * @access public\r\n * @return {Promise} this is Promise and if the installation process happened without any problems returns true otherwise the error.\r\n *\r\n * @memberOf RuntimeUA\r\n */\n\n\n RuntimeUA_createClass(RuntimeUA, [{\n key: \"init\",\n value: function init(guid) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n _this2.domain = _this2.runtimeConfiguration.domain;\n RuntimeUA_log.info('[RuntimeUA - init] Starting ');\n\n try {\n var getCapabilities = _this2.runtimeCapabilities.getRuntimeCapabilities();\n\n var getRuntimeURL = _this2.storages.runtime.get('runtime:URL');\n\n var getStoredDataObjects = _this2.storages.syncherManager.get('syncherManager:ObjectURLs');\n\n var getHypertyStorageObjects = _this2.storages.hypertyResources.get();\n\n var getP2PHandlerURL = _this2.storages.runtime.get('p2pHandler:URL'); // let getRemotes = this.storages.syncherManager.get('remotes');\n\n\n Promise.all([getRuntimeURL, getCapabilities, getStoredDataObjects, getHypertyStorageObjects, getP2PHandlerURL]).then(function (results) {\n _this2.runtimeURL = results[0] ? results[0].runtimeURL : results[0];\n\n if (!_this2.runtimeURL) {\n _this2.runtimeURL = 'runtime://' + _this2.domain + '/' + generateGUID();\n\n _this2.storages.runtime.set('runtime:URL', 1, {\n runtimeURL: _this2.runtimeURL\n });\n }\n\n _this2.capabilities = results[1];\n Object.assign(runtimeUtils.runtimeCapabilities.constraints, results[1]);\n _this2._dataObjectsStorage = new store_objects_DataObjectsStorage(_this2.storages.syncherManager, results[2] || {}, _this2.runtimeFactory, _this2);\n _this2._hypertyResources = results[3] || {};\n _this2.p2pHandlerURL = results[4] ? results[4].p2pHandlerURL : results[4];\n\n if (!_this2.p2pHandlerURL) {\n _this2.p2pHandlerURL = _this2.runtimeURL + '/p2phandler/' + generateGUID();\n RuntimeUA_log.info('[RuntimeUA - init] P2PHandlerURL: ', _this2.p2pHandlerURL);\n\n _this2.storages.runtime.set('p2pHandler:URL', 1, {\n p2pHandlerURL: _this2.p2pHandlerURL\n });\n }\n /* log.info('[RuntimeUA - init] dataObjectsStorage remote load starting');\r\n this._dataObjectsStorage.loadRemote().then(()=> {\r\n log.info('[RuntimeUA - init] dataObjectsStorage remote load concluded');*/\n\n\n return _this2._loadComponents(guid); // });\n }).then(function (status) {\n _this2._hypertyResourcesStorage = new hyperty_resource_HypertyResourcesStorage(_this2.runtimeURL, _this2.messageBus, _this2.storages.hypertyResources, _this2._hypertyResources);\n\n if (_this2.p2p) {\n RuntimeUA_log.info('[RuntimeUA - init] load p2pHandler: ', status);\n return _this2._loadP2PHandler();\n } else {\n RuntimeUA_log.info('[RuntimeUA - init] P2P not supported');\n return 'P2P Not Supported';\n }\n }).then(function (result) {\n RuntimeUA_log.info('[runtime ua - init] - status: ', result);\n resolve(true);\n }, function (reason) {\n RuntimeUA_log.error('ERROR: ', reason);\n resolve(true);\n });\n } catch (e) {\n reject(e);\n }\n });\n }\n }, {\n key: \"_updateRuntimeStatus\",\n value: function _updateRuntimeStatus(event) {\n var _this = this;\n\n _this.messageBus.postMessage({\n from: this.runtimeURL,\n to: this.runtimeURL + '/status',\n type: 'update',\n body: event\n });\n }\n }, {\n key: \"_loadP2PHandler\",\n value: function _loadP2PHandler() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n var runtimeDescriptor = runtimeUtils.runtimeDescriptor;\n var p2pStubHandler = runtimeDescriptor.p2pHandlerStub;\n var p2pConfig = {\n isHandlerStub: true,\n runtimeURL: _this3.runtimeURL\n };\n RuntimeUA_log.log('[RuntimeUA loadP2PHandler] P2PStubHandler: ', p2pStubHandler);\n\n _this3.loader.loadStub(p2pStubHandler, p2pConfig).then(function (result) {\n var runtimeUAURL = _this3.runtimeURL + '/ua';\n var msg = {\n type: 'subscribe',\n from: runtimeUAURL,\n to: 'domain://msg-node.' + _this3.domain + '/sm',\n body: {\n subscribe: [result.url],\n source: _this3.runtimeURL\n }\n };\n\n _this3.messageBus.addListener(runtimeUAURL, function (msg) {\n RuntimeUA_log.log('[runtime ua - listener] - receive msg: ', msg);\n });\n\n _this3.messageBus.postMessage(msg, function (reply) {\n RuntimeUA_log.log('[runtime ua - postMessage] - reply: ', reply);\n });\n\n RuntimeUA_log.info('[runtime ua - p2p installation] - success: ', result);\n resolve(true);\n }).catch(function (reason) {\n RuntimeUA_log.info('[runtime ua - p2p installation] - fail: ', reason);\n resolve(false);\n });\n });\n }\n /**\r\n *\r\n * @access private\r\n * @return {Promise} this is Promise and returns true if all components are loaded with success or an error if someone fails.\r\n *\r\n * @memberOf RuntimeUA\r\n */\n\n }, {\n key: \"_loadComponents\",\n value: function _loadComponents(guid) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n try {\n // Prepare the on instance to handle with the fallbacks and runtimeCatalogue;\n _this4.descriptorInstance = new runtime_Descriptors(_this4.runtimeURL, _this4.runtimeCatalogue, _this4.runtimeConfiguration); // Prepare the loader to load the hyperties, protostubs and idpproxy;\n\n _this4.loader = new runtime_Loader(_this4.runtimeURL, _this4.runtimeConfiguration, _this4.descriptorInstance); // Instantiate the identity Module\n\n _this4.identityModule = new identity_IdentityModule(_this4.runtimeURL, _this4.runtimeCapabilities, _this4.storages.identity, _this4._dataObjectsStorage, cryptoManager_CryptoManager, _this4.runtimeCatalogue); // Use the sandbox factory to create an AppSandbox;\n // In the future can be decided by policyEngine if we need\n // create a AppSandbox or not;\n\n var appSandbox = _this4.runtimeFactory.createAppSandbox(); // Instantiate the Registry Module\n\n\n _this4.registry = new registry_Registry(_this4.runtimeURL, appSandbox, _this4.identityModule, _this4.runtimeCatalogue, _this4.runtimeCapabilities, _this4.storages.registry, _this4.p2pHandlerURL); // Set the loader to load Hyperties, Stubs and IdpProxies\n\n _this4.registry.loader = _this4.loader; // Instantiate the Message Bus\n\n _this4.messageBus = new bus_MessageBus(_this4.registry); // Instanciate the SubscriptionManager;\n\n _this4.subscriptionManager = new subscriptionManager_SubscriptionManager(_this4.runtimeURL, _this4.messageBus, _this4.storages.subscriptions); // Prepare the address allocation instance;\n\n _this4.addressAllocation = new allocation_AddressAllocation(_this4.runtimeURL, _this4.messageBus, _this4.registry, _this4.subscriptionManager); // Instantiate the Policy Engine\n\n _this4.policyEngine = new policy_PEP(new context_RuntimeCoreCtx(_this4.runtimeURL, _this4.identityModule, _this4.registry, _this4.storages.policy, _this4.runtimeCapabilities)); // Instantiate Discovery\n\n _this4.coreDiscovery = new discovery_CoreDiscovery(_this4.runtimeURL, _this4.messageBus, _this4.graphConnector, _this4.runtimeFactory, _this4.registry); // Instantiate the identityHandler\n\n _this4.identityHandler = new identity_IdentityHandler(_this4.identityModule); // initialise the CryptoManager\n\n cryptoManager_CryptoManager.init(_this4.runtimeURL, _this4.runtimeCapabilities, _this4.storages.cryptoManager, _this4._dataObjectsStorage, _this4.registry, _this4.coreDiscovery, _this4.identityModule, _this4.runtimeFactory); // Instantiate the Graph Connector\n // this.graphConnector = process.env.MODE !== 'light' ? new GraphConnector(this.runtimeURL, this.messageBus, this.storageManager) : null;\n\n _this4.handlers = new runtime_MsgBusHandlers(_this4.policyEngine, _this4.identityHandler, cryptoManager_CryptoManager); // (un)comment bellow to not encrypt messages\n\n _this4.messageBus.pipelineOut.handlers = [_this4.handlers.idmHandler, _this4.handlers.pepOutHandler];\n _this4.messageBus.pipelineIn.handlers = [_this4.handlers.pepInHandler]; // (un)comment bellow to encrypt messages\n // this.messageBus.pipelineOut.handlers = [this.handlers.idmHandler, this.handlers.pepOutHandler, this.handlers.encryptHandler];\n // this.messageBus.pipelineIn.handlers = [this.handlers.decryptHandler, this.handlers.pepInHandler];\n // Add to App Sandbox the listener;\n\n appSandbox.addListener('*', function (msg) {\n _this4.messageBus.postMessage(msg);\n });\n cryptoManager_CryptoManager.messageBus = _this4.messageBus; // Register messageBus on Registry\n\n _this4.registry.messageBus = _this4.messageBus; // Policy Engine\n\n _this4.policyEngine.messageBus = _this4.messageBus; // Register messageBus on IDM\n\n _this4.identityModule.messageBus = _this4.messageBus; // Register registry on IdentityModule\n\n _this4.identityModule.registry = _this4.registry; // Register coreDiscovery on IdentityModule\n\n _this4.identityModule.coreDiscovery = _this4.coreDiscovery; // Use sandbox factory to use specific methods\n // and set the message bus to the factory\n\n _this4.runtimeFactory.messageBus = _this4.messageBus; // Instanciate the SyncherManager;\n\n _this4.syncherManager = new syncher_SyncherManager(_this4.runtimeURL, _this4.messageBus, _this4.registry, _this4.runtimeCatalogue, _this4.storages.syncherManager, null, _this4._dataObjectsStorage, _this4.identityModule); // Set into loader the needed components;\n\n _this4.loader.runtimeURL = _this4.runtimeURL;\n _this4.loader.messageBus = _this4.messageBus;\n _this4.loader.registry = _this4.registry;\n _this4.loader.runtimeCatalogue = _this4.runtimeCatalogue;\n _this4.loader.runtimeFactory = _this4.runtimeFactory; //Instantiate Discovery Lib for notification testing\n // this.discovery = new Discovery(\"hyperty://localhost/test\", this.runtimeURL, this.messageBus);\n // this.loadStub(\"localhost\");\n // setTimeout(() => {\n // this.discovery.discoverHypertiesDO(\"user://google.com/openidtest20@gmail.com\")\n // .then(hyperties => {\n // hyperties.forEach(hyperty =>{\n // hyperty.onLive(() => log.log(`Notification from ${hyperty.data.hypertyID} changed to live`));\n // hyperty.onDisconnected(() => log.log(`Notification from ${hyperty.data.hypertyID} changed to disconnected`));\n // });\n // });\n // }, 2000);\n // this.subscriptionManager.init().then(()=>{\n // resolve(true);\n // });\n\n var prepareComponents = [];\n prepareComponents.push(_this4.subscriptionManager.init());\n prepareComponents.push(_this4.identityModule.init(guid));\n prepareComponents.push(cryptoManager_CryptoManager.loadSessionKeys());\n prepareComponents.push(_this4.registry.loadRegistry());\n prepareComponents.push(_this4._dataObjectsStorage.loadRemote());\n Promise.all(prepareComponents).then(function (result) {\n if (result.length === 5) {\n resolve(true);\n } else {\n reject('[RuntimeUA._loadComponents] Error ] ', result);\n }\n }).catch(function (reason) {\n throw Error(reason);\n });\n } catch (e) {\n reject(e);\n }\n });\n }\n /**\r\n * Deploy Hyperty from Catalogue URL\r\n *\r\n * @see https://github.com/reTHINK-project/specs/tree/master/datamodel/core/address\r\n *\r\n * @param {URL.HypertyCatalogueURL} hypertyCatalogueURL - The Catalogue URL used to identify descriptors in the Catalogue.\r\n * @param {boolean|URL.HypertyURL} [reuseURL=false] reuseURL - reuseURL is used to reuse the hypertyURL previously registred, by default the reuse is disabled;\r\n * @param {URL} appURL - the app url address; // TODO: improve this description;\r\n * @returns {Promise} this is Promise and returns true if all components are loaded with success or an error if someone fails.\r\n *\r\n * @memberOf RuntimeUA\r\n */\n\n }, {\n key: \"loadHyperty\",\n value: function loadHyperty(hypertyCatalogueURL) {\n var reuseURL = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var appURL = arguments.length > 2 ? arguments[2] : undefined;\n if (!hypertyCatalogueURL) throw new Error('Hyperty descriptor url parameter is needed');\n return this.loader.loadHyperty(hypertyCatalogueURL, reuseURL, appURL);\n }\n /**\r\n * Deploy Stub from Catalogue URL or domain url\r\n * @param {URL.URL} domain domain\r\n */\n\n }, {\n key: \"loadStub\",\n value: function loadStub(protocolstubCatalogueURL) {\n if (!protocolstubCatalogueURL) throw new Error('ProtoStub descriptor url parameter is needed');\n return this.loader.loadStub(protocolstubCatalogueURL);\n }\n /**\r\n * Deploy idpProxy from Catalogue URL or domain url\r\n * @param {URL.URL} domain domain\r\n */\n\n }, {\n key: \"loadIdpProxy\",\n value: function loadIdpProxy(ipdProxyCatalogueURL) {\n RuntimeUA_log.log('ipdProxyCatalogueURL', ipdProxyCatalogueURL);\n if (!ipdProxyCatalogueURL) throw new Error('The IDP Proxy URL is a needed parameter, could be a DOMAIN or a URL');\n return this.loader.loadIdpProxy(ipdProxyCatalogueURL);\n }\n /**\r\n * Used to close all the runtime; Unregister all hyperties;\r\n * @return {Promise} result of the close method, with true or false to the operation success;\r\n */\n\n }, {\n key: \"close\",\n value: function close(logOut) {\n console.log('Runtime core logout: ', logOut);\n\n var _this = this;\n\n if (logOut === true) {\n this.identityHandler.reset();\n }\n\n RuntimeUA_log.info('Unregister all hyperties');\n return new Promise(function (resolve, reject) {\n _this.registry.unregisterAllHyperties().then(function (result) {\n RuntimeUA_log.info('All the hyperties are unregisted with Success:', result);\n resolve(true);\n }).catch(function (reason) {\n RuntimeUA_log.error('Failed to unregister the hyperties', reason);\n reject(false);\n });\n });\n }\n /**\r\n * Used to reset the runtime by deleting all data from the storage manager;\r\n * @return {Promise} result of the reset method, with true or false to the operation success;\r\n */\n\n }, {\n key: \"reset\",\n value: function reset() {\n var _this5 = this;\n\n console.log('RuntimeUA.Runtime core reset: ');\n var reseting = [];\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //TODO: delegate db reset operation to each component\n // this.identityManager.reset();\n _this5._dataObjectsStorage.deleteRemotes().then(function () {\n return resolve();\n }).then(function () {\n _this5.storages.identity.get(false, false, 'identities').then(function (identities) {\n var identitiesKeys = Object.keys(identities);\n identitiesKeys.forEach(function (key) {\n reseting.push(_this5.storages.identity.delete(key, false, 'identities'));\n });\n reseting.push(_this5.storages.capabilities.delete('capabilities'));\n reseting.push(_this5.storages.cryptoManager.delete('userAsymmetricKey'));\n reseting.push(_this5.storages.hypertyResources.delete('hypertyResources'));\n reseting.push(_this5.storages.identity.delete('accessTokens'));\n reseting.push(_this5.storages.registry.delete('registry:DataObjectURLs'));\n reseting.push(_this5.storages.registry.delete('registry:HypertyURLs'));\n reseting.push(_this5.storages.runtime.delete('p2pHandler:URL'));\n reseting.push(_this5.storages.runtime.delete('runtime:URL')); // reseting.push(this.storages.runtimeCatalogue.delete('runtimeCatalogue'));\n\n reseting.push(_this5.storages.subscriptions.delete('subscriptions'));\n reseting.push(_this5.storages.syncherManager.delete('syncherManager:ObjectURLs'));\n reseting.push(_this5.storages.syncherManager.delete('remotes'));\n Promise.all(reseting).then(function (result) {\n RuntimeUA_log.info('[RuntimeUA.reset] reset with Success:', result);\n return resolve(true);\n }).catch(function (reason) {\n RuntimeUA_log.error('Failed to reset all DBs', reason);\n resolve(false);\n });\n });\n });\n });\n }\n }]);\n\n return RuntimeUA;\n}();\n\n/* harmony default export */ var runtime_RuntimeUA = __webpack_exports__[\"default\"] = (RuntimeUA_RuntimeUA);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2xvZ0xldmVscy5qcz83ZDM0Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lL3J1bnRpbWVVdGlscy5qcz83YTFhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy91dGlscy91dGlscy5qcz9mYTdkIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9zeW5jaGVyL1Byb3h5T2JqZWN0LmpzPzRlZWIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvRGF0YU9iamVjdENoaWxkLmpzPzIxZTEiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvSGVhcnRCZWF0LmpzP2IxNjciLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2h5cGVydHktcmVzb3VyY2UvSHlwZXJ0eVJlc291cmNlLmpzP2NjNmMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3V0aWxzL0ltYWdlVG9vbHMuanM/MWUwNyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvaHlwZXJ0eS1yZXNvdXJjZS9GaWxlSHlwZXJ0eVJlc291cmNlLmpzPzUzNmYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2h5cGVydHktcmVzb3VyY2UvSHlwZXJ0eVJlc291cmNlRmFjdG9yeS5qcz9mMDgzIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9zeW5jaGVyL0RhdGFPYmplY3QuanM/OWQwMiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9EYXRhT2JqZWN0UmVwb3J0ZXIuanM/MjNmZiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9EYXRhT2JqZWN0T2JzZXJ2ZXIuanM/YzVjMyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9EYXRhUHJvdmlzaW9uYWwuanM/NDA0NyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9TeW5jaGVyLmpzPzE2ZDgiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvTm90aWZpY2F0aW9uSGFuZGxlci5qcz8yOGIyIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9JZGVudGl0eU1hbmFnZXIuanM/MTYzOCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cy5qcz83Yzg1Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9kaXNjb3ZlcnkvRGlzY292ZXJlZE9iamVjdC5qcz8wMjM5Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9kaXNjb3ZlcnkvRGlzY292ZXJ5LmpzPzRhNDYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3V0aWxzL1NlYXJjaC5qcz9mYzlhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy91dGlscy9FdmVudEVtaXR0ZXIuanM/OGE4YSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY29udGV4dE1hbmFnZXIvQ29udGV4dE9ic2VydmVyLmpzP2NjZjAiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NvbnRleHRNYW5hZ2VyL0NvbnRleHRSZXBvcnRlci5qcz8yZGY4Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9Vc2VyUHJvZmlsZS5qcz81ODU4Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9NZXNzYWdlQm9keUlkZW50aXR5LmpzPzc1NDkiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL2NvbW11bmljYXRpb24uanM/Mzc5YiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY2hhdE1hbmFnZXIvSW52aXRhdGlvbnNIYW5kbGVyLmpzPzI3ZDAiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL0NoYXRDb250cm9sbGVyLmpzPzFkOWIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL1VzZXJJbmZvLmpzPzU3ZDQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL0NoYXRNYW5hZ2VyLmpzPzhkYWYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL0NoYXQuanM/MDBiZCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY2hhdE1hbmFnZXIvU2ltcGxlQ2hhdE1hbmFnZXIuanM/YTk1NSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc2FuZGJveC9TYW5kYm94RmFjdG9yeS5qcz8wYTZhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9zYW5kYm94L1NhbmRib3hSZWdpc3RyeS5qcz84YmU0Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9idXMvQnVzLmpzPzJlZjIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2J1cy9NaW5pQnVzLmpzP2Q5YWQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3NhbmRib3gvU2FuZGJveC5qcz83NTYzIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9hbGxvY2F0aW9uL0FkZHJlc3NBbGxvY2F0aW9uLmpzPzU2OGQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3JlZ2lzdHJ5L1JlZ2lzdHJ5RGF0YU1vZGVsLmpzP2M2OWYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3JlZ2lzdHJ5L0h5cGVydHlJbnN0YW5jZS5qcz9hYjZhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9yZWdpc3RyeS9Eb21haW5SZWdpc3RyYXRpb24uanM/ZWRlMSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcmVnaXN0cnkvUDJQQ29ubmVjdGlvblJlc29sdmUuanM/NjJiZiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvdXRpbHMvV2F0Y2hpbmdZb3UuanM/MTExZiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvVXRpbHMuanM/OWM4ZSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcmVnaXN0cnkvUmVnaXN0cnkuanM/ZDdiZCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS9ydW50aW1lQ29uZmlndXJhdGlvbi5qcz8wODNkIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9JZGVudGl0aWVzLmpzP2M0MjAiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2lkZW50aXR5L0d1aUZha2UuanM/OTA3ZSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvaWRlbnRpdHkvSWRlbnRpdHlNb2R1bGUuanM/NGVjNCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvaWRlbnRpdHkvSWRlbnRpdHlIYW5kbGVyLmpzPzMyZjUiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9BY3Rpb25zU2VydmljZS5qcz85ZTcyIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9wb2xpY3kvT3BlcmF0b3JzLmpzPzNiMmYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9QRFAuanM/MjJlZCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvQWxsb3dPdmVycmlkZXMuanM/MGQxNyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvQmxvY2tPdmVycmlkZXMuanM/N2Q2NyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvRmlyc3RBcHBsaWNhYmxlLmpzP2ExMzIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9jb25kaXRpb25zL0NvbmRpdGlvbi5qcz8zMzE1Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9wb2xpY3kvY29uZGl0aW9ucy9TdWJzY3JpcHRpb25Db25kaXRpb24uanM/N2UxYiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbmRpdGlvbnMvQWR2YW5jZWRDb25kaXRpb24uanM/OWMzMiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L1J1bGUuanM/NWRkOCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L1BvbGljeS5qcz9kMWFkIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9wb2xpY3kvUEVQLmpzPzlhMWYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2J1cy9QaXBlbGluZS5qcz84ZjhiIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9idXMvTWVzc2FnZUJ1cy5qcz85OTViIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9jcnlwdG9NYW5hZ2VyL3V0ZjguanM/OWRhZSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY3J5cHRvTWFuYWdlci9DcnlwdG8uanM/OTMzMiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY3J5cHRvTWFuYWdlci9DcnlwdG9NYW5hZ2VyLmpzP2JiNGMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUvTG9hZGVyLmpzP2U4YmQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUvU3RvcmFnZS5qcz83MzM4Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lL0Rlc2NyaXB0b3JzLmpzP2M2MmYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUvTXNnQnVzSGFuZGxlcnMuanM/NzYzNyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvZGlzY292ZXJ5L0NvcmVEaXNjb3ZlcnkuanM/YmY3NyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3RvcmUtb2JqZWN0cy9EYXRhT2JqZWN0c1N0b3JhZ2UuanM/ODlkNyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvdXRpbHMvUHJvbWlzZVF1ZXVlLmpzP2Q4NjIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2h5cGVydHktcmVzb3VyY2UvSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2UuanM/ZjllOSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9TdWJzY3JpcHRpb24uanM/Mjg5OSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9SZXBvcnRlck9iamVjdC5qcz81ZjllIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9zeW5jaGVyL09ic2VydmVyT2JqZWN0LmpzP2FhMzgiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvU3luY2hlck1hbmFnZXIuanM/NjU5OCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3Vic2NyaXB0aW9uTWFuYWdlci9TdWJzY3JpcHRpb24uanM/Nzk2MCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3Vic2NyaXB0aW9uTWFuYWdlci9TdWJzY3JpcHRpb25NYW5hZ2VyLmpzP2QwMjMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9SZVRoaW5rQ3R4LmpzP2NjMzEiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9jb250ZXh0L1J1bnRpbWVDb3JlQ3R4LmpzPzE2NGQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL1JldGhpbmtPYmplY3QuanM/YjkwYSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvQ2F0YWxvZ3VlRGF0YU9iamVjdC5qcz9mZTMxIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9Tb3VyY2VQYWNrYWdlLmpzP2FlMjkiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL0h5cGVydHlEZXNjcmlwdG9yLmpzP2VhOWMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL1Byb3RvY29sU3R1YkRlc2NyaXB0b3IuanM/YjBjYiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvSHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yLmpzP2VlMjgiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL0h5cGVydHlJbnRlcmNlcHRvckRlc2NyaXB0b3IuanM/YzY0YiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvRGF0YU9iamVjdFNjaGVtYS5qcz9mMTIzIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9DYXRhbG9ndWVEYXRhT2JqZWN0RmFjdG9yeS5qcz82ZTM0Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9SdW50aW1lQ2F0YWxvZ3VlLmpzPzQwYTYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUvUnVudGltZVVBLmpzPzgwYjAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICdsb2dsZXZlbCc7XHJcblxyXG5jb25zdCBhID0gbG9nLmdldExvZ2dlcignYWRkcmVzcy1hbGxvY2F0aW9uJyk7XHJcbmNvbnN0IGIgPSBsb2cuZ2V0TG9nZ2VyKCdCdXMnKTtcclxuY29uc3QgYyA9IGxvZy5nZXRMb2dnZXIoJ01lc3NhZ2VCdXMnKTtcclxuY29uc3QgZCA9IGxvZy5nZXRMb2dnZXIoJ0NvcmVEaXNjb3ZlcnknKTtcclxuY29uc3QgZSA9IGxvZy5nZXRMb2dnZXIoJ1N0b3JhZ2VNYW5hZ2VyJyk7XHJcbmNvbnN0IGYgPSBsb2cuZ2V0TG9nZ2VyKCdIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZScpO1xyXG5jb25zdCBnID0gbG9nLmdldExvZ2dlcignSWRlbnRpdHlNb2R1bGUnKTtcclxuY29uc3QgaCA9IGxvZy5nZXRMb2dnZXIoJ1BFUCcpO1xyXG5jb25zdCBpID0gbG9nLmdldExvZ2dlcignUDJQQ29ubmVjdGlvblJlc29sdmUnKTtcclxuY29uc3QgaiA9IGxvZy5nZXRMb2dnZXIoJ1JlZ2lzdHJ5Jyk7XHJcbmNvbnN0IGsgPSBsb2cuZ2V0TG9nZ2VyKCdSdW50aW1lVUEnKTtcclxuY29uc3QgbCA9IGxvZy5nZXRMb2dnZXIoJ0xvYWRlcicpO1xyXG5jb25zdCBtID0gbG9nLmdldExvZ2dlcignRGVzY3JpcHRvcnMnKTtcclxuY29uc3QgbiA9IGxvZy5nZXRMb2dnZXIoJ0RhdGFPYmplY3RzU3RvcmFnZScpO1xyXG5jb25zdCBvID0gbG9nLmdldExvZ2dlcignU3Vic2NyaXB0aW9uJyk7XHJcbmNvbnN0IHAgPSBsb2cuZ2V0TG9nZ2VyKCdTdWJzY3JpcHRpb25NYW5hZ2VyJyk7XHJcbmNvbnN0IHEgPSBsb2cuZ2V0TG9nZ2VyKCdPYnNlcnZlck9iamVjdCcpO1xyXG5jb25zdCByID0gbG9nLmdldExvZ2dlcignUmVwb3J0ZXJPYmplY3QnKTtcclxuY29uc3QgcyA9IGxvZy5nZXRMb2dnZXIoJ1N5blN1YnNjcmlwdGlvbicpO1xyXG5jb25zdCB0ID0gbG9nLmdldExvZ2dlcignU3luY2hlck1hbmFnZXInKTtcclxuY29uc3QgdSA9IGxvZy5nZXRMb2dnZXIoJ0lkZW50aXR5SGFuZGxlcicpO1xyXG5jb25zdCB2ID0gbG9nLmdldExvZ2dlcignQ3J5cHRvTWFuYWdlcicpO1xyXG5jb25zdCB4ID0gbG9nLmdldExvZ2dlcignUGlwZWxpbmUnKTtcclxuY29uc3QgZjEgPSBsb2cuZ2V0TG9nZ2VyKCdTeW5jaGVyJyk7XHJcbmNvbnN0IGYyID0gbG9nLmdldExvZ2dlcignUnVudGltZUNhdGFsb2d1ZScpO1xyXG5cclxuXHJcbmV4cG9ydCB7IGxvZyB9O1xyXG5cclxuLyoqXHJcbiAgMCBhY3R1YWwgbG9nZ2luZyBtZXRob2RzLCBvcmRlcmVkIGFuZCBhdmFpbGFibGUgYXM6XHJcblxyXG4gICAgICAwIC0gbG9nLnRyYWNlKG1zZylcclxuICAgICAgMSAtIGxvZy5kZWJ1Zyhtc2cpXHJcbiAgICAgIDIgLSBsb2cuaW5mbyhtc2cpXHJcbiAgICAgIDMgLSBsb2cud2Fybihtc2cpXHJcbiAgICAgIDQgLSBsb2cuZXJyb3IobXNnKVxyXG5cclxuICBsb2cubG9nKG1zZykgaXMgYWxzbyBhdmFpbGFibGUsIGFzIGFuIGFsaWFzIGZvciBsb2cuZGVidWcobXNnKSwgdG8gaW1wcm92ZSBjb21wYXRpYmlsaXR5IHdpdGggY29uc29sZSwgYW5kIG1ha2UgbWlncmF0aW9uIGVhc2llci5cclxuXHJcbiAgRXhhY3Qgb3V0cHV0IGZvcm1hdHRpbmcgb2YgdGhlc2Ugd2lsbCBkZXBlbmQgb24gdGhlIGNvbnNvbGUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgeW91ciBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIG1hbnkgZW52aXJvbm1lbnRzIHdpbGwgaW5jbHVkZSBhIGZ1bGwgc3RhY2sgdHJhY2Ugd2l0aCBhbGwgdHJhY2UoKSBjYWxscywgYW5kIGljb25zIG9yIHNpbWlsYXIgdG8gaGlnaGxpZ2h0IG90aGVyIGNhbGxzLlxyXG5cclxuICBUaGVzZSBtZXRob2RzIHNob3VsZCBuZXZlciBmYWlsIGluIGFueSBlbnZpcm9ubWVudCwgZXZlbiBpZiBubyBjb25zb2xlIG9iamVjdCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlLCBhbmQgc2hvdWxkIGFsd2F5cyBmYWxsIGJhY2sgdG8gYW4gYXZhaWxhYmxlIGxvZyBtZXRob2QgZXZlbiBpZiB0aGUgc3BlY2lmaWMgbWV0aG9kIGNhbGxlZCAoZS5nLiB3YXJuKSBpc24ndCBhdmFpbGFibGUuXHJcblxyXG4gIEJlIGF3YXJlIHRoYXQgYWxsIHRoaXMgbWVhbnMgdGhhdCB0aGVzZSBtZXRob2Qgd29uJ3QgbmVjZXNzYXJpbHkgYWx3YXlzIHByb2R1Y2UgZXhhY3RseSB0aGUgb3V0cHV0IHlvdSBleHBlY3QgaW4gZXZlcnkgZW52aXJvbm1lbnQ7IGxvZ2xldmVsIG9ubHkgZ3VhcmFudGVlcyB0aGF0IHRoZXNlIG1ldGhvZHMgd2lsbCBuZXZlciBleHBsb2RlIG9uIHlvdSwgYW5kIHRoYXQgaXQgd2lsbCBjYWxsIHRoZSBtb3N0IHJlbGV2YW50IG1ldGhvZCBpdCBjYW4gZmluZCwgd2l0aCB5b3VyIGFyZ3VtZW50LiBGaXJlZm94IGlzIGEgbm90YWJsZSBleGFtcGxlIGhlcmU6IGR1ZSB0byBhIGN1cnJlbnQgRmlyZWZveCBidWcgbG9nLnRyYWNlKG1zZykgY2FsbHMgaW4gRmlyZWZveCB3aWxsIHByaW50IG9ubHkgdGhlIHN0YWNrdHJhY2UsIGFuZCB3b24ndCBpbmNsdWRlIGFueSBwYXNzZWQgbWVzc2FnZSBhcmd1bWVudHMuXHJcblxyXG4qL1xyXG5cclxuXHJcbi8vIGFkZHJlc3MtYWxsb2NhdGlvblxyXG5hLnNldExldmVsKDApO1xyXG5cclxuLy8gQnVzXHJcbmIuc2V0TGV2ZWwoMyk7XHJcblxyXG4vLyBNZXNzYWdlQnVzXHJcbmMuc2V0TGV2ZWwoMyk7XHJcblxyXG4vLyBDb3JlRGlzY292ZXJ5XHJcbmQuc2V0TGV2ZWwoNSk7XHJcblxyXG4vLyBTdG9yYWdlTWFuYWdlclxyXG5lLnNldExldmVsKDApO1xyXG5cclxuLy8gSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2VcclxuZi5zZXRMZXZlbCgzKTtcclxuXHJcbi8vIElkZW50aXR5TW9kdWxlXHJcbmcuc2V0TGV2ZWwoMCk7XHJcblxyXG4vLyBQRVBcclxuaC5zZXRMZXZlbCgzKTtcclxuXHJcbi8vIFAyUENvbm5lY3Rpb25SZXNvbHZlXHJcbmkuc2V0TGV2ZWwoMyk7XHJcblxyXG4vLyBSZWdpc3RyeVxyXG5qLnNldExldmVsKDApO1xyXG5cclxuLy8gUnVudGltZVVBXHJcbmsuc2V0TGV2ZWwoMCk7XHJcblxyXG4vLyBMb2FkZXJcclxubC5zZXRMZXZlbCgwKTtcclxuXHJcbi8vIERlc2NyaXB0b3JzXHJcbm0uc2V0TGV2ZWwoMyk7XHJcblxyXG4vLyBEYXRhT2JqZWN0c1N0b3JhZ2Vcclxubi5zZXRMZXZlbCgwKTtcclxuXHJcbi8vIFN1YnNjcmlwdGlvblxyXG5vLnNldExldmVsKDMpO1xyXG5cclxuLy8gU3Vic2NyaXB0aW9uTWFuYWdlclxyXG5wLnNldExldmVsKDMpO1xyXG5cclxuLy8gT2JzZXJ2ZXJPYmplY3RcclxucS5zZXRMZXZlbCgwKTtcclxuXHJcbi8vIFJlcG9ydGVyT2JqZWN0XHJcbnIuc2V0TGV2ZWwoMCk7XHJcblxyXG4vLyBTeW5TdWJzY3JpcHRpb25cclxucy5zZXRMZXZlbCgzKTtcclxuXHJcbi8vIFN5bmNoZXJNYW5hZ2VyXHJcbnQuc2V0TGV2ZWwoMCk7XHJcblxyXG4vLyBJZGVudGl0eUhhbmRsZXJcclxudS5zZXRMZXZlbCgzKTtcclxuXHJcbi8vIENyeXB0b01hbmFnZXJcclxudi5zZXRMZXZlbCgwKTtcclxuXHJcbi8vIFBpcGVsaW5lXHJcbnguc2V0TGV2ZWwoMCk7XHJcblxyXG4vLyBTeW5jaGVyXHJcbmYxLnNldExldmVsKDApO1xyXG5cclxuLy8gU3luY2hlciBEYXRhT2JqZWN0T2JzZXJ2ZXJcclxuZjEuc2V0TGV2ZWwoMCk7XHJcblxyXG4vLyBSdW50aW1lQ2F0YWxvZ3VlXHJcbmYyLnNldExldmVsKDApO1xyXG4iLCJleHBvcnQgbGV0IHJ1bnRpbWVVdGlscyA9IHtcclxuICBydW50aW1lRGVzY3JpcHRvcjoge30sXHJcbiAgcnVudGltZUNhcGFiaWxpdGllczoge1xyXG4gICAgY29uc3RyYWludHM6IHt9XHJcbiAgfVxyXG59O1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcbi8qKlxyXG4gKiBTdXBwb3J0IG1vZHVsZSB3aXRoIHNvbWUgZnVuY3Rpb25zIHdpbGwgYmUgdXNlZnVsXHJcbiAqIEBtb2R1bGUgdXRpbHNcclxuICovXHJcblxyXG4vKipcclxuICogQHR5cGVkZWYgZGl2aWRlVVJMXHJcbiAqIEB0eXBlIE9iamVjdFxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHlwZSBUaGUgdHlwZSBvZiBVUkxcclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG9mIFVSTFxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRlbnRpdHkgVGhlIGlkZW50aXR5IG9mIFVSTFxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBEaXZpZGUgYW4gdXJsIGluIHR5cGUsIGRvbWFpbiBhbmQgaWRlbnRpdHlcclxuICogQHBhcmFtICB7VVJMLlVSTH0gdXJsIC0gdXJsIGFkZHJlc3NcclxuICogQHJldHVybiB7ZGl2aWRlVVJMfSB0aGUgcmVzdWx0IG9mIGRpdmlkZVVSTFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZVVSTCh1cmwpIHtcclxuXHJcbiAgZnVuY3Rpb24gcmVjdXJzZSh2YWx1ZSkge1xyXG4gICAgY29uc3QgcmVnZXggPSAvKFthLXpBLVotXSopKDpcXC9cXC8oPzpcXC4pP3w6KShbLWEtekEtWjAtOUA6JS5fK34jPV17MiwyNTZ9KShbLWEtekEtWjAtOUA6JS5fK34jPS9dKikvZ2k7XHJcbiAgICBjb25zdCBzdWJzdCA9ICckMSwkMywkNCc7XHJcbiAgICBsZXQgcGFydHMgPSB2YWx1ZS5yZXBsYWNlKHJlZ2V4LCBzdWJzdCkuc3BsaXQoJywnKTtcclxuICAgIHJldHVybiBwYXJ0cztcclxuICB9XHJcblxyXG4gIGxldCBwYXJ0cyA9IHJlY3Vyc2UodXJsKTtcclxuXHJcbiAgLy8gSWYgdGhlIHVybCBoYXMgbm8gc2NoZW1lXHJcbiAgaWYgKHBhcnRzWzBdID09PSB1cmwgJiYgIXBhcnRzWzBdLmluY2x1ZGVzKCdAJykpIHtcclxuXHJcbiAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICB0eXBlOiAnJyxcclxuICAgICAgZG9tYWluOiB1cmwsXHJcbiAgICAgIGlkZW50aXR5OiAnJ1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ1tEaXZpZGVVUkxdIERpdmlkZVVSTCBkb25cXCd0IHN1cHBvcnQgdXJsIHdpdGhvdXQgc2NoZW1lLiBQbGVhc2UgcmV2aWV3IHlvdXIgdXJsIGFkZHJlc3MnLCB1cmwpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvLyBjaGVjayBpZiB0aGUgdXJsIGhhcyB0aGUgc2NoZW1lIGFuZCBpbmNsdWRlcyBhbiBAXHJcbiAgaWYgKHBhcnRzWzBdID09PSB1cmwgJiYgcGFydHNbMF0uaW5jbHVkZXMoJ0AnKSkge1xyXG4gICAgbGV0IHNjaGVtZSA9IHBhcnRzWzBdID09PSB1cmwgPyAnc210cCcgOiBwYXJ0c1swXTtcclxuICAgIHBhcnRzID0gcmVjdXJzZShzY2hlbWUgKyAnOi8vJyArIHBhcnRzWzBdKTtcclxuICB9XHJcblxyXG4gIC8vIGlmIHRoZSBkb21haW4gaW5jbHVkZXMgYW4gQCwgZGl2aWRlIGl0IHRvIGRvbWFpbiBhbmQgaWRlbnRpdHkgcmVzcGVjdGl2ZWx5XHJcbiAgaWYgKHBhcnRzWzFdLmluY2x1ZGVzKCdAJykpIHtcclxuICAgIHBhcnRzWzJdID0gcGFydHNbMF0gKyAnOi8vJyArIHBhcnRzWzFdO1xyXG4gICAgcGFydHNbMV0gPSBwYXJ0c1sxXS5zdWJzdHIocGFydHNbMV0uaW5kZXhPZignQCcpICsgMSk7XHJcbiAgfSBcdC8qZWxzZSBpZiAocGFydHNbMl0uaW5jbHVkZXMoJy8nKSkge1xyXG4gICAgcGFydHNbMl0gPSBwYXJ0c1syXS5zdWJzdHIocGFydHNbMl0ubGFzdEluZGV4T2YoJy8nKSsxKTtcclxuICB9Ki9cclxuXHJcbiAgbGV0IHJlc3VsdCA9IHtcclxuICAgIHR5cGU6IHBhcnRzWzBdLFxyXG4gICAgZG9tYWluOiBwYXJ0c1sxXSxcclxuICAgIGlkZW50aXR5OiBwYXJ0c1syXVxyXG4gIH07XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcblxyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgYW4gT2JqZWN0IGlzIGVtcHR5XHJcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqZWN0IE9iamVjdCB0byBiZSBjaGVja2VkXHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59ICAgICAgIHN0YXR1cyBvZiBPYmplY3QsIGVtcHR5IG9yIG5vdCAodHJ1ZXxmYWxzZSk7XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlPYmplY3Qob2JqZWN0KSB7XHJcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoID4gMCA/IGZhbHNlIDogdHJ1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHNlY29uZHNTaW5jZUVwb2NoKCkge1xyXG4gIHJldHVybiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBNYWtlIGEgQ09QWSBvZiB0aGUgb3JpZ2luYWwgZGF0YVxyXG4gKiBAcGFyYW0gIHtPYmplY3R9ICBvYmogLSBvYmplY3QgdG8gYmUgY2xvbmVkXHJcbiAqIEByZXR1cm4ge09iamVjdH1cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUob2JqKSB7XHJcbiAgLy9UT0RPOiBzaW1wbGUgYnV0IGluZWZmaWNpZW50IEpTT04gZGVlcCBjbG9uZS4uLlxyXG4gIGlmIChvYmopIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlUGF0aEZyb21VUkwodXJsKSB7XHJcbiAgbGV0IHNwbGl0VVJMID0gdXJsLnNwbGl0KCcvJyk7XHJcbiAgcmV0dXJuIHNwbGl0VVJMWzBdICsgJy8vJyArIHNwbGl0VVJMWzJdICsgJy8nICsgc3BsaXRVUkxbM107XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPYnRhaW5zIHRoZSB1c2VyIFVSTCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gZW1haWxcclxuICogQHBhcmFtICB7c3RyaW5nfSB1c2VyRW1haWwgVGhlIHVzZXIgZW1haWxcclxuICogQHJldHVybiB7VVJMLlVSTH0gdXNlclVSTCBUaGUgdXNlciBVUkxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VyVVJMRnJvbUVtYWlsKHVzZXJFbWFpbCkge1xyXG4gIGxldCBpbmRleE9mQXQgPSB1c2VyRW1haWwuaW5kZXhPZignQCcpO1xyXG4gIHJldHVybiAndXNlcjovLycgKyB1c2VyRW1haWwuc3Vic3RyaW5nKGluZGV4T2ZBdCArIDEsIHVzZXJFbWFpbC5sZW5ndGgpICsgJy8nICsgdXNlckVtYWlsLnN1YnN0cmluZygwLCBpbmRleE9mQXQpO1xyXG59XHJcblxyXG4vKipcclxuICogT2J0YWlucyB0aGUgdXNlciBlbWFpbCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gVVJMXHJcbiAqIEBwYXJhbSAge1VSTC5VUkx9IHVzZXJVUkwgVGhlIHVzZXIgVVJMXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gdXNlckVtYWlsIFRoZSB1c2VyIGVtYWlsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlckVtYWlsRnJvbVVSTCh1c2VyVVJMKSB7XHJcbiAgbGV0IHVybCA9IGRpdmlkZVVSTCh1c2VyVVJMKTtcclxuICByZXR1cm4gdXJsLmlkZW50aXR5LnJlcGxhY2UoJy8nLCAnJykgKyAnQCcgKyB1cmwuZG9tYWluOyAvLyBpZGVudGl0eSBmaWVsZCBoYXMgJy9leGFtcGxlSUQnIGluc3RlYWQgb2YgJ2V4YW1wbGVJRCdcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoZSB1c2VyIGlkZW50aWZpZXIgaXMgYWxyZWFkeSBpbiB0aGUgVVJMIGZvcm1hdCwgaWYgbm90LCBjb252ZXJ0IHRvIFVSTCBmb3JtYXRcclxuICogQHBhcmFtICB7c3RyaW5nfSAgIGlkZW50aWZpZXIgIHVzZXIgaWRlbnRpZmllclxyXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgdXNlclVSTCAgICB0aGUgdXNlciBVUkxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9Vc2VyVVJMKGlkZW50aWZpZXIpIHtcclxuXHJcbiAgLy8gY2hlY2sgaWYgdGhlIGlkZW50aWZpZXIgaXMgYWxyZWFkeSBpbiB0aGUgdXJsIGZvcm1hdFxyXG4gIGlmIChpZGVudGlmaWVyLnN1YnN0cmluZygwLCA3KSA9PT0gJ3VzZXI6Ly8nKSB7XHJcbiAgICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTChpZGVudGlmaWVyKTtcclxuXHJcbiAgICAvL2NoZWNrIGlmIHRoZSB1cmwgaXMgd2VsbCBmb3JtYXRlZFxyXG4gICAgaWYgKGRpdmlkZWRVUkwuZG9tYWluICYmIGRpdmlkZWRVUkwuaWRlbnRpdHkpIHtcclxuICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyAndXNlclVSTCB3aXRoIHdyb25nIGZvcm1hdCc7XHJcbiAgICB9XHJcblxyXG4gIC8vaWYgbm90LCBjb252ZXJ0IHRoZSB1c2VyIGVtYWlsIHRvIFVSTCBmb3JtYXRcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGdldFVzZXJVUkxGcm9tRW1haWwoaWRlbnRpZmllcik7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhT2JqZWN0VVJMKHVybCkge1xyXG4gIGxldCBzY2hlbWFzVG9JZ25vcmUgPSBbJ2RvbWFpbi1pZHAnLCAncnVudGltZScsICdkb21haW4nLCAnaHlwZXJ0eSddO1xyXG4gIGxldCBzcGxpdFVSTCA9ICh1cmwpLnNwbGl0KCc6Ly8nKTtcclxuICBsZXQgdXJsU2NoZW1hID0gc3BsaXRVUkxbMF07XHJcblxyXG4gIHJldHVybiBzY2hlbWFzVG9JZ25vcmUuaW5kZXhPZih1cmxTY2hlbWEpID09PSAtMTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTGVnYWN5KHVybCkge1xyXG4gIGlmICh1cmwuc3BsaXQoJ0AnKS5sZW5ndGggPiAxKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzVVJMKHVybCkge1xyXG4gIHJldHVybiAodXJsKS5zcGxpdCgnLycpLmxlbmd0aCA+PSAzO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNVc2VyVVJMKHVybCkge1xyXG4gIHJldHVybiBkaXZpZGVVUkwodXJsKS50eXBlID09PSAndXNlcic7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0h5cGVydHlVUkwodXJsKSB7XHJcbiAgcmV0dXJuIGRpdmlkZVVSTCh1cmwpLnR5cGUgPT09ICdoeXBlcnR5JztcclxufVxyXG5cclxuLyoqXHJcbiAqIGdldCBpbmZvcm1hdGlvbiByZWxhdGl2ZSBlYWNoIGNvbXBvbmVudCBjb25maWd1cmVkIG9uIHJ1bnRpbWUgY29uZmlndXJhdGlvbjtcclxuICogQHBhcmFtICB7b2JqZWN0fSBjb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIGFsbCBjb25maWd1cmF0aW9uXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gY29tcG9uZW50ICAgICBzdHJpbmcgd2l0aCB0aGUgY29tcG9uZW50IHRvIGdldCB0aGUgY29uZmlndXJhdGlvbiwgbGlrZSwgcnVudGltZVVSTFMsIGNhdGFsb2d1ZVVSTHMsIG1zZ05vZGVVUkwsIGRvbWFpblJlZ2lzdHJ5VVJMO1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHJlc291cmNlICAgICAgdHlwZSBvZiByZXNvdXJjZSB0byBnZXQsIGxpa2UsIGNhdGFsb2d1ZSwgcnVudGltZVVBLCBwcm90b2NvbHN0dWIsIGlkcFByb3h5XHJcbiAqIEByZXR1cm4ge29iamVjdH0gICAgICAgICAgICAgICByZXR1cm4gYW4gb2JqZWN0IHdpdGggYWxsIGNvbmZpZ3VyYXRpb25zO1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbmZpZ3VyYXRpb25SZXNvdXJjZXMoY29uZmlndXJhdGlvbiwgY29tcG9uZW50LCByZXNvdXJjZSkge1xyXG4gIGxldCBvYmplY3RSZXNvdXJjZSA9IGNvbmZpZ3VyYXRpb25bY29tcG9uZW50XTtcclxuICBsZXQgcmVzb3VyY2VUeXBlID0gb2JqZWN0UmVzb3VyY2VbcmVzb3VyY2VdO1xyXG5cclxuICByZXR1cm4gcmVzb3VyY2VUeXBlO1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGQgYSBmdWxsIHVybCB3aXRoIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb247XHJcbiAqIEBwYXJhbSAge29iamVjdH0gY29uZmlndXJhdGlvbiBvYmplY3Qgd2l0aCBhbGwgY29uZmlndXJhdGlvblxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IGNvbXBvbmVudCAgICAgc3RyaW5nIHdpdGggdGhlIGNvbXBvbmVudCB0byBnZXQgdGhlIGNvbmZpZ3VyYXRpb24sIGxpa2UsIHJ1bnRpbWVVUkxTLCBjYXRhbG9ndWVVUkxzLCBtc2dOb2RlVVJMLCBkb21haW5SZWdpc3RyeVVSTDtcclxuICogQHBhcmFtICB7c3RyaW5nfSByZXNvdXJjZSAgICAgIHR5cGUgb2YgcmVzb3VyY2UgdG8gZ2V0LCBsaWtlLCBjYXRhbG9ndWUsIHJ1bnRpbWVVQSwgcHJvdG9jb2xzdHViLCBpZHBQcm94eVxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHR5cGUgICAgICAgICAgcmVzb3VyY2UgdG8gZ2V0LCBsaWtlIGEgaHlwZXJ0eSBuYW1lIG9yIHByb3RvY29sc3R1YiBuYW1lO1xyXG4gKiBAcGFyYW0gIHtib29sZWFufSB1c2VGYWxsYmFjayAgaWYgdHJ1ZSB0aGUgZnVuY3Rpb24gd2lsbCBjaGVjayBpZiBoYXZlIGEgZmFsbGJhY2sgdXJsO1xyXG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgcGFydGlhbCB1cmwgdG8gY29udGFjdCB0aGUgcmVzb3VyY2U7XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRVUkwoY29uZmlndXJhdGlvbiwgY29tcG9uZW50LCByZXNvdXJjZSwgdHlwZSwgdXNlRmFsbGJhY2sgPSBmYWxzZSkge1xyXG4gIGxldCBvYmplY3RSZXNvdXJjZSA9IGNvbmZpZ3VyYXRpb25bY29tcG9uZW50XTtcclxuICBsZXQgdXJsO1xyXG5cclxuICBpZiAoIW9iamVjdFJlc291cmNlLmhhc093blByb3BlcnR5KHJlc291cmNlKSkge1xyXG4gICAgdGhyb3cgRXJyb3IoJ1RoZSBjb25maWd1cmF0aW9uICcgKyBKU09OLnN0cmluZ2lmeShvYmplY3RSZXNvdXJjZSwgJycsIDIpICsgJyBkb25cXCd0IGhhdmUgdGhlICcgKyByZXNvdXJjZSArICcgcmVzb3VyY2UgeW91IGFyZSBsb29raW5nIGZvcicpO1xyXG4gIH1cclxuXHJcbiAgbGV0IHJlc291cmNlVHlwZSA9IG9iamVjdFJlc291cmNlW3Jlc291cmNlXTtcclxuXHJcbiAgaWYgKHR5cGUpIHtcclxuICAgIHVybCA9IHJlc291cmNlVHlwZS5wcmVmaXggKyBjb25maWd1cmF0aW9uLmRvbWFpbiArIHJlc291cmNlVHlwZS5zdWZmaXggKyB0eXBlO1xyXG4gICAgaWYgKHJlc291cmNlVHlwZS5oYXNPd25Qcm9wZXJ0eSgnZmFsbGJhY2snKSAmJiB1c2VGYWxsYmFjaykge1xyXG4gICAgICBpZiAocmVzb3VyY2VUeXBlLmZhbGxiYWNrLmluZGV4T2YoJyVkb21haW4lJykpIHtcclxuICAgICAgICB1cmwgPSByZXNvdXJjZVR5cGUuZmFsbGJhY2sucmVwbGFjZSgvKCVkb21haW4lKS9nLCBjb25maWd1cmF0aW9uLmRvbWFpbikgKyB0eXBlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHVybCA9IHJlc291cmNlVHlwZS5mYWxsYmFjayArIHR5cGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgdXJsID0gcmVzb3VyY2VUeXBlLnByZWZpeCArIGNvbmZpZ3VyYXRpb24uZG9tYWluICsgcmVzb3VyY2VUeXBlLnN1ZmZpeDtcclxuICB9XHJcblxyXG4gIC8vIGNvbnNvbGUubG9nKHVybCk7XHJcblxyXG4gIHJldHVybiB1cmw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZW5lcmF0ZSBhIEdsb2JhbCBVbmlxdWUgSURcclxuICpcclxuICogQHJldHVybnMgU3RyaW5nO1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlR1VJRCgpIHtcclxuXHJcbiAgZnVuY3Rpb24gczQoKSB7XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMClcclxuICAgICAgLnRvU3RyaW5nKDE2KVxyXG4gICAgICAuc3Vic3RyaW5nKDEpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHM0KCkgKyBzNCgpICsgJy0nICsgczQoKSArICctJyArIHM0KCkgKyAnLScgKyBzNCgpICsgJy0nICsgczQoKSArIHM0KCkgKyBzNCgpO1xyXG5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJJZGVudGl0eURvbWFpbih1cmwpIHtcclxuICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTCh1cmwpO1xyXG4gIGxldCBzcGxpdGVkRG9tYWluID0gZGl2aWRlZFVSTC5kb21haW4uc3BsaXQoJy4nKTtcclxuICBsZXQgc3BsaXRlZExlbmd0aCA9IHNwbGl0ZWREb21haW4ubGVuZ3RoO1xyXG4gIGlmIChzcGxpdGVkTGVuZ3RoID09IDEpIHtcclxuICAgIHJldHVybiBzcGxpdGVkRG9tYWluW3NwbGl0ZWRMZW5ndGggLSAxXTtcclxuICB9XHJcbiAgbGV0IGRvbWFpbiA9IHNwbGl0ZWREb21haW5bc3BsaXRlZExlbmd0aCAtIDJdICsgJy4nICsgc3BsaXRlZERvbWFpbltzcGxpdGVkTGVuZ3RoIC0gMV07XHJcbiAgcmV0dXJuIGRvbWFpbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIFVSTCBpcyBmcm9tIGEgYmFja2VuZCBzZXJ2aWNlXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gdXJsICAgICBVUkwgdG8gYmUgcHJvY2Vzc2VkXHJcbiAqIEByZXR1cm4ge2Jvb2xlYW59XHJcbiAqL1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzQmFja2VuZFNlcnZpY2VVUkwodXJsKSB7XHJcbiAgbGV0IGRpdmlkZWRVUkwgPSBkaXZpZGVVUkwodXJsKTtcclxuICBsZXQgc3BsaXRlZERvbWFpbiA9IGRpdmlkZWRVUkwuZG9tYWluLnNwbGl0KCcuJyk7XHJcbiAgbGV0IGJhY2tlbmRTY2hlbWVzID0gWydkb21haW4nLCAnZ2xvYmFsJywgJ2RvbWFpbi1pZHAnXTsgLy8gc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIHJ1bnRpbWUgY29uZmlndXJhdGlvblxyXG4gIGxldCBiYWNrZW5kU3ViRG9tYWlucyA9IFsncmVnaXN0cnknLCAnbXNnLW5vZGUnXTsgLy8gc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIHJ1bnRpbWUgY29uZmlndXJhdGlvblxyXG4gIGxldCBzdWJEb21haW47XHJcblxyXG4gIGlmIChzcGxpdGVkRG9tYWluLmxlbmd0aCA+IDEpIHtcclxuICAgIHN1YkRvbWFpbiA9IHNwbGl0ZWREb21haW4uZmlsdGVyKGl0ZW0gPT4gYmFja2VuZFN1YkRvbWFpbnMuaW5kZXhPZihpdGVtKSAhPT0gLTEpWzBdO1xyXG4gIH1cclxuXHJcbiAgaWYgKHN1YkRvbWFpbiAmJiBiYWNrZW5kU3ViRG9tYWlucy5pbmRleE9mKHN1YkRvbWFpbikgIT09IC0xKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGlmIChkaXZpZGVkVVJMLnR5cGUpIHtcclxuICAgIHJldHVybiAoYmFja2VuZFNjaGVtZXMuaW5kZXhPZihkaXZpZGVkVVJMLnR5cGUpICE9PSAtMSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkaXZpZGVFbWFpbChlbWFpbCkge1xyXG4gIGxldCBpbmRleE9mQXQgPSBlbWFpbC5pbmRleE9mKCdAJyk7XHJcblxyXG4gIGxldCByZXN1bHQgPSB7XHJcbiAgICB1c2VybmFtZTogZW1haWwuc3Vic3RyaW5nKDAsIGluZGV4T2ZBdCksXHJcbiAgICBkb21haW46IGVtYWlsLnN1YnN0cmluZyhpbmRleE9mQXQgKyAxLCBlbWFpbC5sZW5ndGgpXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhc3NpZ24ob2JqLCBrZXlQYXRoLCB2YWx1ZSkge1xyXG5cclxuICBpZiAoIW9iaikgb2JqID0ge307XHJcbiAgaWYgKHR5cGVvZihrZXlQYXRoKSA9PT0gJ3N0cmluZycpIGtleVBhdGggPSBwYXJzZUF0dHJpYnV0ZXMoa2V5UGF0aCk7XHJcblxyXG4gIGxldCBsYXN0S2V5SW5kZXggPSBrZXlQYXRoLmxlbmd0aCAtIDE7XHJcblxyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdEtleUluZGV4OyArK2kpIHtcclxuICAgIGxldCBrZXkgPSBrZXlQYXRoW2ldO1xyXG4gICAgaWYgKCEoa2V5IGluIG9iaikpIHtcclxuICAgICAgb2JqW2tleV0gPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBvYmogPSBvYmpba2V5XTtcclxuXHJcbiAgfVxyXG5cclxuICBvYmpba2V5UGF0aFtsYXN0S2V5SW5kZXhdXSA9IHZhbHVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRPYmplY3RVUkwoZGF0YU9iamVjdFVSTCkge1xyXG4gIGNvbnNvbGUuaW5mbygnW3V0aWxzIC0gc3BsaXRPYmplY3RVUkxdOiAnLCBkYXRhT2JqZWN0VVJMKTtcclxuXHJcbiAgbGV0IHNwbGl0ZWRVUkwgPSBkYXRhT2JqZWN0VVJMLnNwbGl0KCcvJyk7XHJcbiAgbGV0IHVybCA9IHNwbGl0ZWRVUkxbMF0gKyAnLy8nICsgc3BsaXRlZFVSTFsyXSArICcvJyArIHNwbGl0ZWRVUkxbM107XHJcbiAgbGV0IHJlc291cmNlID0gc3BsaXRlZFVSTFs1XTtcclxuXHJcbiAgbGV0IHJlc3VsdCA9IHtcclxuICAgIHVybDogdXJsLFxyXG4gICAgcmVzb3VyY2U6IHJlc291cmNlXHJcbiAgfTtcclxuXHJcbiAgY29uc29sZS5pbmZvKCdbdXRpbHMgLSBzcGxpdE9iamVjdFVSTF06ICcsIHJlc3VsdCk7XHJcblxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0F0dHJpYnV0ZShwYXRoKSB7XHJcblxyXG4gIGxldCByZWdleCA9IC8oKChbYS16QS1aXSspOlxcL1xcLyhbMC05YS16QS1aXVstXFx3XSpbMC05YS16QS1aXVxcLikrW2EtekEtWl17Miw5fSlcXC9bYS16QS1aMC05Ll0rQFthLXpBLVowLTldKygtKT9bYS16QS1aMC05XSsoXFwuKT9bYS16QS1aMC05XXsyLDEwfT9cXC5bYS16QS1aXXsyLDEwfSkoLisoPz0uaWRlbnRpdHkpKT8vZ207XHJcblxyXG4gIGxldCBsaXN0ID0gW107XHJcbiAgbGV0IGZpbmFsID0gW107XHJcbiAgbGV0IHRlc3QgPSBwYXRoLm1hdGNoKHJlZ2V4KTtcclxuXHJcbiAgaWYgKHRlc3QgPT0gbnVsbCkge1xyXG4gICAgZmluYWwgPSBwYXRoLnNwbGl0KCcuJyk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCBtO1xyXG4gICAgd2hpbGUgKChtID0gcmVnZXguZXhlYyhwYXRoKSkgIT09IG51bGwpIHtcclxuICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHMgd2l0aCB6ZXJvLXdpZHRoIG1hdGNoZXNcclxuICAgICAgaWYgKG0uaW5kZXggPT09IHJlZ2V4Lmxhc3RJbmRleCkge1xyXG4gICAgICAgIHJlZ2V4Lmxhc3RJbmRleCsrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBUaGUgcmVzdWx0IGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBgbWAtdmFyaWFibGUuXHJcbiAgICAgIG0uZm9yRWFjaCgobWF0Y2gsIGdyb3VwSW5kZXgpID0+IHtcclxuICAgICAgICBpZiAoZ3JvdXBJbmRleCA9PT0gMCkge1xyXG4gICAgICAgICAgbGlzdC5wdXNoKG1hdGNoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIGxpc3QuZm9yRWFjaCgodXJsKSA9PiB7XHJcblxyXG4gICAgICByZXN1bHQgPSBwYXRoLnJlcGxhY2UodXJsLCAnKi0qJyk7XHJcbiAgICAgIGZpbmFsID0gcmVzdWx0LnNwbGl0KCcuJykubWFwKChpdGVtKSA9PiB7XHJcblxyXG4gICAgICAgIGlmIChpdGVtID09PSAnKi0qJykgeyByZXR1cm4gdXJsOyB9XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY29uc29sZS5sb2coJ1tSdW50aW1lQ29yZS5VdGlscy5jaGVja0F0dHJpYnV0ZV0nLCBmaW5hbCk7XHJcbiAgcmV0dXJuIGZpbmFsO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBdHRyaWJ1dGVzKHBhdGgpIHtcclxuICBsZXQgcmVnZXggPSAvKFswLTlhLXpBLVpdWy1cXHddKik6XFwvXFwvL2c7XHJcblxyXG4gIGxldCBzdHJpbmczID0gJ2lkZW50aXR5JztcclxuXHJcbiAgaWYgKCFwYXRoLmluY2x1ZGVzKCc6Ly8nKSkge1xyXG4gICAgcmV0dXJuIChwYXRoLnNwbGl0KCcuJykpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgc3RyaW5nMSA9IHBhdGguc3BsaXQocmVnZXgpWzBdO1xyXG5cclxuICAgIGxldCBhcnJheTEgPSBzdHJpbmcxLnNwbGl0KCcuJyk7XHJcblxyXG4gICAgbGV0IHN0cmluZzIgPSBwYXRoLnJlcGxhY2Uoc3RyaW5nMSwgJycpO1xyXG5cclxuICAgIGlmIChwYXRoLmluY2x1ZGVzKHN0cmluZzMpKSB7XHJcblxyXG4gICAgICBsZXQgYXJyYXkyID0gc3RyaW5nMi5zcGxpdChzdHJpbmczICsgJy4nKTtcclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKCdhcnJheTIgJyArIGFycmF5Mik7XHJcblxyXG4gICAgICBzdHJpbmcyID0gYXJyYXkyWzBdLnNsaWNlKCcuJywgLTEpO1xyXG5cclxuICAgICAgYXJyYXkyID0gYXJyYXkyWzFdLnNwbGl0KCcuJyk7XHJcblxyXG4gICAgICBhcnJheTEucHVzaChzdHJpbmcyLCBzdHJpbmczKTtcclxuXHJcbiAgICAgIGFycmF5MSA9IGFycmF5MS5jb25jYXQoYXJyYXkyKTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhcnJheTEucHVzaChzdHJpbmcyKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIChhcnJheTEuZmlsdGVyKEJvb2xlYW4pKTtcclxuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkob2JqKSB7XHJcbiAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHtcclxuXHJcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKSA9PT0gSlNPTi5zdHJpbmdpZnkoe30pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hhdGtleXNUb1N0cmluZ0Nsb25lcihzZXNzaW9uS2V5cykge1xyXG4gIGxldCBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZSA9IHt9O1xyXG4gIGxldCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzZXNzaW9uS2V5cyk7XHJcbiAgaWYgKGZpZWxkcykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAgZmllbGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW2ldO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXSA9IHt9O1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXS5zZXNzaW9uS2V5ID0gc2Vzc2lvbktleXNbZmllbGRdLnNlc3Npb25LZXkudG9TdHJpbmcoKTtcclxuICAgICAgICBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZVtmaWVsZF0uaXNUb0VuY3J5cHQgPSBzZXNzaW9uS2V5c1tmaWVsZF0uaXNUb0VuY3J5cHQ7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdfY2hhdGtleXNUb1N0cmluZ0Nsb25lcjplcnInLCBlcnIpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGF0a2V5c1RvQXJyYXlDbG9uZXIoc2Vzc2lvbktleXMpIHtcclxuICBsZXQgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmUgPSB7fTtcclxuICBsZXQgZmllbGRzID0gT2JqZWN0LmtleXMoc2Vzc2lvbktleXMpO1xyXG4gIGlmIChmaWVsZHMpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgIGZpZWxkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBmaWVsZCA9IGZpZWxkc1tpXTtcclxuICAgICAgICBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZVtmaWVsZF0gPSB7fTtcclxuICAgICAgICBsZXQgYXJyYXlWYWx1ZXMgPSBKU09OLnBhcnNlKCdbJyArIHNlc3Npb25LZXlzW2ZpZWxkXS5zZXNzaW9uS2V5ICsgJ10nKTtcclxuICAgICAgICBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZVtmaWVsZF0uc2Vzc2lvbktleSA9IG5ldyBVaW50OEFycmF5KGFycmF5VmFsdWVzKTtcclxuICAgICAgICBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZVtmaWVsZF0uaXNUb0VuY3J5cHQgPSBzZXNzaW9uS2V5c1tmaWVsZF0uaXNUb0VuY3J5cHQ7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdfY2hhdGtleXNUb0FycmF5Q2xvbmVyOmVycicsIGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWVzc2FnZVVSTChVUkwpIHtcclxuICBsZXQgc3BsaXRlZFRvVVJMID0gVVJMLnNwbGl0KCcvJyk7XHJcbiAgaWYgKHNwbGl0ZWRUb1VSTC5sZW5ndGggPD0gNikge1xyXG4gICAgcmV0dXJuIHNwbGl0ZWRUb1VSTFswXSArICcvLycgKyBzcGxpdGVkVG9VUkxbMl0gKyAnLycgKyBzcGxpdGVkVG9VUkxbM107XHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBzcGxpdGVkVG9VUkxbMF0gKyAnLy8nICsgc3BsaXRlZFRvVVJMWzJdICsgJy8nICsgc3BsaXRlZFRvVVJMWzNdICsgJy8nICsgc3BsaXRlZFRvVVJMWzRdO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGF2YWlsYWJsZVNwYWNlKHVzYWdlLCBxdW90YSkge1xyXG4gIGNvbnN0IGF2YWlsYWJsZSA9ICh1c2FnZSAvIHF1b3RhKS50b0ZpeGVkKDIpO1xyXG4gIHJldHVybiB7XHJcbiAgICBxdW90YTogcXVvdGEsXHJcbiAgICB1c2FnZTogdXNhZ2UsXHJcbiAgICBwZXJjZW50OiBOdW1iZXIoYXZhaWxhYmxlKVxyXG4gIH07XHJcbn1cclxuXHJcbi8qKlxyXG4qIEVuY29kZXMgYSBKUyBvYmplY3QgdG8gYmFzZSA2NCBlbmNvZGVcclxuKiBAcGFyYW0gICB7T2JqZWN0fSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcclxuKiBAcmV0dXJuICB7c3RyaW5nfSAgIGVuY29kZWQgdmFsdWVcclxuKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZSh2YWx1ZSkge1xyXG4gIHRyeSB7XHJcbiAgICBsZXQgc3RyaW5nVmFsdWUgPSBzdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgcmV0dXJuIGJ0b2Eoc3RyaW5nVmFsdWUpO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY29uc29sZS5lcnJvcignW1V0aWxzLmVuY29kZTplcnJdICcgKyBlcnIpO1xyXG4gICAgdGhyb3cgZXJyO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAgKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIHRvIG9iamVjdFxyXG4gICogQHBhcmFtICAge3N0cmluZ19iNjR9ICAgIHZhbHVlICAgIHZhbHVlIGVuY29kZWQgaW4gYmFzZSA2NFxyXG4gICogQHJldHVybiAge09iamVjdH0gZGVjb2RlZFZhbHVlXHJcbiAgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZSh2YWx1ZSkge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShhdG9iKHZhbHVlKSk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmxvZygnW1V0aWxzLmRlY29kZTplcnJdICcgKyBlcnIpO1xyXG4gICAgdGhyb3cgZXJyO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiogRGVjb2RlIGEgYmFzZTY0IHN0cmluZyB0byBVaW50OEFycmF5XHJcbiogQHBhcmFtICAge3N0cmluZ19iNjR9ICAgIHZhbHVlICAgIGJ5dGVBcnJheSB2YWx1ZVxyXG4qIEByZXR1cm4gIHtVaW50OEFycmF5fSAgIGVuY29kZWQgdmFsdWVcclxuKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVRvVWludDhBcnJheSh2YWx1ZSkge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjb2RlKHZhbHVlKSk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMuZGVjb2RlVG9VaW50OEFycmF5OmVycl0gJyArIGVycik7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuKiBDb252ZXJ0cyBhIEpTIG9iamVjdCB0byBzdHJpbmdcclxuKiBOT1RFOiBTcGVjaWFsIGNvbnZlcnNpb24gZm9yIFVpbnQ4QXJyYXlzXHJcbiogQHBhcmFtICAge09iamVjdH0gICAgdmFsdWUgICAgYnl0ZUFycmF5IHZhbHVlXHJcbiogQHJldHVybiAge1VpbnQ4QXJyYXl9ICAgZW5jb2RlZCB2YWx1ZVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5KHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIGxldCBzdHJpbmdWYWx1ZTtcclxuICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gVWludDhBcnJheSkge1xyXG4gICAgICBzdHJpbmdWYWx1ZSA9ICdbJyArIHZhbHVlLnRvU3RyaW5nKCkgKyAnXSc7IC8vIHRoZSBbXSBpcyBmb3IgSlNPTi5wYXJzZSBjb21wYXRpYmlsaXR5XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdHJpbmdWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBzdHJpbmdWYWx1ZTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ1tVdGlscy5zdHJpbmdpZnk6ZXJyXSAnICsgZXJyKTtcclxuICAgIHRocm93IGVycjtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4qIENvbnZlcnRzIGEgc3RyaW5naWZpZWQgb2JqZWN0IHRvIG9iamVjdFxyXG4qIEBwYXJhbSAgIHtTdHJpbmd9ICAgIHZhbHVlICAgIGJ5dGVBcnJheSB2YWx1ZVxyXG4qIEByZXR1cm4gIHtPYmplY3R9ICAgZW5jb2RlZCB2YWx1ZVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UodmFsdWUpIHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY29uc29sZS5lcnJvcignW1V0aWxzLnBhcnNlOmVycl0nICsgZXJyKTtcclxuICAgIGNvbnNvbGUudHJhY2UoKTtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ1RoYXQgdGhhdCBjYXVzZSB0aGUgZXJyb3I6JywgdmFsdWUpO1xyXG4gICAgdGhyb3cgZXJyO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiogQ29udmVydHMgYSBzdHJpbmdpZmllZCBvYmplY3QgdG8gb2JqZWN0XHJcbiogQHBhcmFtICAge1N0cmluZ30gICAgdmFsdWUgICAgYnl0ZUFycmF5IHZhbHVlXHJcbiogQHJldHVybiAge1VpbnQ4QXJyYXl9ICAgZW5jb2RlZCB2YWx1ZVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb1VpbnQ4QXJyYXkodmFsdWUpIHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHBhcnNlKHZhbHVlKSk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMucGFyc2VUb1VpbnQ4QXJyYXk6ZXJyXScgKyBlcnIpO1xyXG4gICAgdGhyb3cgZXJyO1xyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgJ3Byb3h5LW9ic2VydmUnO1xyXG5pbXBvcnQge3BhcnNlQXR0cmlidXRlc30gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuY29uc3Qgb2JqZWN0VHlwZSA9IHtBUlJBWTogJ1tvYmplY3QgQXJyYXldJywgT0JKRUNUOiAnW29iamVjdCBPYmplY3RdJyB9O1xyXG5cclxuLyoqXHJcbiAqIEBhY2Nlc3MgcHJpdmF0ZVxyXG4gKiBNYWluIGNsYXNzIHRoYXQgbWFpbnRhaW5zIGEgSlNPTiBvYmplY3QsIGFuZCBvYnNlcnZlcyBjaGFuZ2VzIGluIHRoaXMgb2JqZWN0LCByZWN1cnNpdmVseS5cclxuICogSW50ZXJuYWwgb2JqZWN0cyBhbmQgYXJyYXlzIGFyZSBhbHNvIG9ic2VydmVkLlxyXG4gKi9cclxuY2xhc3MgU3luY09iamVjdCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxEYXRhKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9vYnNlcnZlcnMgPSBbXTtcclxuICAgIF90aGlzLl9maWx0ZXJzID0ge307XHJcblxyXG4gICAgdGhpcy5fZGF0YSA9IGluaXRpYWxEYXRhIHx8IHt9O1xyXG5cclxuICAgIHRoaXMuX2ludGVybmFsT2JzZXJ2ZSh0aGlzLl9kYXRhKTtcclxuICB9XHJcblxyXG4gIGdldCBkYXRhKCkgeyByZXR1cm4gdGhpcy5fZGF0YTsgfVxyXG5cclxuICBvYnNlcnZlKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9vYnNlcnZlcnMucHVzaChjYWxsYmFjayk7XHJcbiAgfVxyXG5cclxuICBmaW5kKHBhdGgpIHtcclxuICAgIGxldCBsaXN0ID0gcGFyc2VBdHRyaWJ1dGVzKHBhdGgpO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9maW5kV2l0aFNwbGl0KGxpc3QpO1xyXG4gIH1cclxuXHJcbiAgZmluZEJlZm9yZShwYXRoKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0ge307XHJcbiAgICBsZXQgbGlzdCA9IHBhcnNlQXR0cmlidXRlcyhwYXRoKTtcclxuICAgIHJlc3VsdC5sYXN0ID0gbGlzdC5wb3AoKTtcclxuICAgIHJlc3VsdC5vYmogPSB0aGlzLl9maW5kV2l0aFNwbGl0KGxpc3QpO1xyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBfZmluZFdpdGhTcGxpdChsaXN0KSB7XHJcbiAgICBsZXQgb2JqID0gdGhpcy5fZGF0YTtcclxuICAgIGxpc3QuZm9yRWFjaCgodmFsdWUpID0+IHtcclxuICAgICAgb2JqID0gb2JqW3ZhbHVlXTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBfaW50ZXJuYWxPYnNlcnZlKG9iamVjdCkge1xyXG5cclxuICAgIGxldCBoYW5kbGVyID0gKGNoYW5nZXNldCkgPT4ge1xyXG5cclxuICAgICAgY2hhbmdlc2V0LmV2ZXJ5KChjaGFuZ2UpID0+IHtcclxuICAgICAgICB0aGlzLl9vbkNoYW5nZXMoY2hhbmdlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLl9kYXRhID0gT2JqZWN0LmRlZXBPYnNlcnZlKG9iamVjdCwgaGFuZGxlcik7XHJcblxyXG4gIH1cclxuXHJcbiAgX2ZpcmVFdmVudChldmVudCkge1xyXG4gICAgdGhpcy5fb2JzZXJ2ZXJzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XHJcbiAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX29uQ2hhbmdlcyhjaGFuZ2UpIHtcclxuXHJcbiAgICBsZXQgb2JqID0gY2hhbmdlLm9iamVjdDtcclxuICAgIGxldCBvYmpUeXBlO1xyXG5cclxuICAgIGlmIChvYmouY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xyXG4gICAgICBvYmpUeXBlID0gT2JqZWN0VHlwZS5PQkpFQ1Q7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHtcclxuICAgICAgb2JqVHlwZSA9IE9iamVjdFR5cGUuQVJSQVk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpZWxkU3RyaW5nID0gY2hhbmdlLmtleXBhdGg7XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2coJ0ZpZWxkOicsIGZpZWxkU3RyaW5nKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKCd0eXBlOicsIGNoYW5nZS50eXBlKTtcclxuXHJcbiAgICAvL2xldCBvbGRWYWx1ZSA9IGNoYW5nZS5vbGRWYWx1ZTtcclxuICAgIGxldCBuZXdWYWx1ZSA9IG9ialtjaGFuZ2UubmFtZV07XHJcblxyXG4gICAgLy8gY29uc29sZS5pbmZvKGNoYW5nZS50eXBlICsgJyB8IEZpZWxkOiAnICsgZmllbGRTdHJpbmcgKyAnIHwgTmV3IFZhbHVlOicsIEpTT04uc3RyaW5naWZ5KG5ld1ZhbHVlKSwgZmllbGRTdHJpbmcuaW5jbHVkZXMoJ2xlbmd0aCcpKTtcclxuXHJcbiAgICBpZiAoY2hhbmdlLnR5cGUgPT09ICd1cGRhdGUnICYmICFmaWVsZFN0cmluZy5pbmNsdWRlcygnLmxlbmd0aCcpKSB7XHJcbiAgICAgIHRoaXMuX2ZpcmVFdmVudCh7XHJcbiAgICAgICAgY1R5cGU6IENoYW5nZVR5cGUuVVBEQVRFLFxyXG4gICAgICAgIG9UeXBlOiBvYmpUeXBlLFxyXG4gICAgICAgIGZpZWxkOiBmaWVsZFN0cmluZyxcclxuICAgICAgICBkYXRhOiBuZXdWYWx1ZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlLnR5cGUgPT09ICdhZGQnKSB7XHJcbiAgICAgIHRoaXMuX2ZpcmVFdmVudCh7XHJcbiAgICAgICAgY1R5cGU6IENoYW5nZVR5cGUuQURELFxyXG4gICAgICAgIG9UeXBlOiBvYmpUeXBlLFxyXG4gICAgICAgIGZpZWxkOiBmaWVsZFN0cmluZyxcclxuICAgICAgICBkYXRhOiBuZXdWYWx1ZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlLnR5cGUgPT09ICdkZWxldGUnKSB7XHJcbiAgICAgIHRoaXMuX2ZpcmVFdmVudCh7XHJcbiAgICAgICAgY1R5cGU6IENoYW5nZVR5cGUuUkVNT1ZFLFxyXG4gICAgICAgIG9UeXBlOiBvYmpUeXBlLFxyXG4gICAgICAgIGZpZWxkOiBmaWVsZFN0cmluZ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgbGV0IENoYW5nZVR5cGUgPSB7VVBEQVRFOiAndXBkYXRlJywgQUREOiAnYWRkJywgUkVNT1ZFOiAncmVtb3ZlJ307XHJcbmV4cG9ydCBsZXQgT2JqZWN0VHlwZSA9IHtPQkpFQ1Q6ICdvYmplY3QnLCBBUlJBWTogJ2FycmF5J307XHJcbmV4cG9ydCBkZWZhdWx0IFN5bmNPYmplY3Q7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignRGF0YU9iamVjdENoaWxkJyk7XHJcblxyXG5pbXBvcnQgU3luY09iamVjdCBmcm9tICcuL1Byb3h5T2JqZWN0JztcclxuXHJcbmltcG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgY2xhc3MgcmV0dXJuZWQgZnJvbSB0aGUgRGF0YU9iamVjdCBhZGRDaGlsZHJlbiBjYWxsIG9yIGZyb20gb25BZGRDaGlsZHJlbiBpZiByZW1vdGVseSBjcmVhdGVkLlxyXG4gKi9cclxuY2xhc3MgRGF0YU9iamVjdENoaWxkIC8qIGltcGxlbWVudHMgU3luY1N0YXR1cyAqLyB7XHJcbiAgLyogcHJpdmF0ZVxyXG5cclxuICAtLS0tZXZlbnQgaGFuZGxlcnMtLS0tXHJcbiAgX29uUmVzcG9uc2VIYW5kbGVyOiAoZXZlbnQpID0+IHZvaWRcclxuICAqL1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICogU2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IEh5cGVydGllcy4gSXQncyBjYWxsZWQgYnkgdGhlIERhdGFPYmplY3QuYWRkQ2hpbGRcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihpbnB1dCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBmdW5jdGlvbiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IocGFyKSB7XHJcbiAgICAgIHRocm93ICdbRGF0YU9iamVjdENoaWxkXSAnICsgcGFyICsgJyBtYW5kYXRvcnkgcGFyYW1ldGVyIGlzIG1pc3NpbmcnO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0LnBhcmVudCA/ICBfdGhpcy5fcGFyZW50ID0gaW5wdXQucGFyZW50IDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdwYXJlbnQnKTtcclxuICAgIGlucHV0LnVybCA/ICBfdGhpcy5fdXJsID0gaW5wdXQudXJsIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCd1cmwnKTtcclxuICAgIGlucHV0LmNyZWF0ZWQgPyBfdGhpcy5fY3JlYXRlZCA9IGlucHV0LmNyZWF0ZWQgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ2NyZWF0ZWQnKTtcclxuICAgIGlucHV0LnJlcG9ydGVyID8gX3RoaXMuX3JlcG9ydGVyID0gaW5wdXQucmVwb3J0ZXIgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3JlcG9ydGVyJyk7XHJcbiAgICBpbnB1dC5ydW50aW1lID8gX3RoaXMuX3J1bnRpbWUgPSBpbnB1dC5ydW50aW1lIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdydW50aW1lJyk7XHJcbiAgICBpbnB1dC5zY2hlbWEgPyBfdGhpcy5fc2NoZW1hID0gaW5wdXQuc2NoZW1hIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdzY2hlbWEnKTtcclxuICAgIGlucHV0LnBhcmVudE9iamVjdCA/IF90aGlzLl9wYXJlbnRPYmplY3QgPSBpbnB1dC5wYXJlbnRPYmplY3QgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3BhcmVudE9iamVjdCcpO1xyXG5cclxuICAgIGlmIChpbnB1dC5uYW1lKSBfdGhpcy5fbmFtZSA9IGlucHV0Lm5hbWU7XHJcbiAgICBpZiAoaW5wdXQuZGVzY3JpcHRpb24pIF90aGlzLl9kZXNjcmlwdGlvbiA9IGlucHV0LmRlc2NyaXB0aW9uO1xyXG4gICAgaWYgKGlucHV0LnRhZ3MpIF90aGlzLl90YWdzID0gaW5wdXQudGFncztcclxuICAgIGlmIChpbnB1dC5yZXNvdXJjZXMpIF90aGlzLl9yZXNvdXJjZXMgPSBpbnB1dC5yZXNvdXJjZXM7XHJcbiAgICBpZiAoaW5wdXQub2JzZXJ2ZXJTdG9yYWdlKSBfdGhpcy5fb2JzZXJ2ZXJTdG9yYWdlID0gaW5wdXQub2JzZXJ2ZXJTdG9yYWdlO1xyXG4gICAgaWYgKGlucHV0LnB1YmxpY09ic2VydmF0aW9uKSBfdGhpcy5fcHVibGljT2JzZXJ2YXRpb24gPSBpbnB1dC5wdWJsaWNPYnNlcnZhdGlvbjtcclxuXHJcbiAgICBfdGhpcy5fY2hpbGRJZCA9IGlucHV0LnVybDtcclxuXHJcbiAgICBpZiAoaW5wdXQuZGF0YSkge1xyXG4gICAgICBfdGhpcy5fc3luY09iaiA9IG5ldyBTeW5jT2JqZWN0KGlucHV0LmRhdGEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgX3RoaXMuX3N5bmNPYmogPSBuZXcgU3luY09iamVjdCh7fSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9nLmxvZygnW0RhdGFPYmplY3RDaGlsZCAtICBDb25zdHJ1Y3Rvcl0gLSAnLCBfdGhpcy5fc3luY09iaik7XHJcblxyXG4gICAgX3RoaXMuX2J1cyA9IF90aGlzLl9wYXJlbnRPYmplY3QuX2J1cztcclxuICAgIF90aGlzLl9vd25lciA9IF90aGlzLl9wYXJlbnRPYmplY3QuX293bmVyO1xyXG5cclxuICAgIF90aGlzLl9hbGxvY2F0ZUxpc3RlbmVycygpO1xyXG5cclxuICAgIF90aGlzLl9tZXRhZGF0YSA9IGlucHV0O1xyXG5cclxuICAgIC8vIGRlbGV0ZSBfdGhpcy5fbWV0YWRhdGEuZGF0YTtcclxuICAgIGRlbGV0ZSBfdGhpcy5fbWV0YWRhdGEucGFyZW50T2JqZWN0O1xyXG5cclxuICAgIF90aGlzLl9zaGFyaW5nU3RhdHVzID0gZmFsc2U7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHNoYXJlYWJsZSgpIHtcclxuICAgIGxldCBzaGFyZWFibGUgPSB0aGlzLm1ldGFkYXRhO1xyXG4gICAgc2hhcmVhYmxlLmRhdGEgPSB0aGlzLmRhdGE7XHJcblxyXG4gICAgcmV0dXJuIHNoYXJlYWJsZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzaGFyZSB0aGUgY2hpbGQgT2JqZWN0IGFtb25nIGF1dGhvcmlzZWQgSHlwZXJ0aWVzXHJcbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgIHJlcG9ydGVyICBJZiB0cnVlIHRoZSBjaGlsZCBvYmplY3QgaXMgb25seSBzaGFyZWQgdG8gUGFyZW50IHJlcG9ydGVyXHJcbiAgICogQHJldHVybiB7UHJvbWlzZTxKU09OPn0gICAgICAgIEl0IHJldHVybnMgYSBwcm9taXNlIHdpdGggdGhlIHNoYXJpbmcgcmVzdWx0cy5cclxuICAgKi9cclxuXHJcbiAgc2hhcmUodG9SZXBvcnRlcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fc2hhcmluZ1N0YXR1cyA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGxldCB0bztcclxuICAgICAgbGV0IHJlcG9ydGVyID0gdG9SZXBvcnRlcjtcclxuXHJcbiAgICAgIGlmIChyZXBvcnRlcikge1xyXG4gICAgICAgIHRvID0gX3RoaXMubWV0YWRhdGEucGFyZW50O1xyXG4gICAgICB9IGVsc2UgdG8gPSBfdGhpcy5tZXRhZGF0YS5wYXJlbnQgKyAnL2NoaWxkcmVuLyc7XHJcblxyXG4gICAgICBsZXQgY2hpbGRWYWx1ZSA9IF90aGlzLm1ldGFkYXRhO1xyXG4gICAgICBjaGlsZFZhbHVlLmRhdGEgPSBfdGhpcy5kYXRhO1xyXG5cclxuICAgICAgLy9GTE9XLU9VVDogdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byBhIHJlc291cmNlIGNoaWxkIGFkZHJlc3M6IE1lc3NhZ2VCdXNcclxuICAgICAgbGV0IHJlcXVlc3RNc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsIGZyb206IF90aGlzLm1ldGFkYXRhLnJlcG9ydGVyLCB0bzogdG8sXHJcbiAgICAgICAgYm9keTogeyByZXNvdXJjZTogY2hpbGRWYWx1ZS51cmwsIHZhbHVlOiBjaGlsZFZhbHVlIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5pZGVudGl0eSkgICAgICB7XHJcbiAgICAgICAgcmVxdWVzdE1zZy5ib2R5LmlkZW50aXR5ID0gX3RoaXMuaWRlbnRpdHk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vdG8gYmUgdXNlZCB0byBkaXNhYmxlIG11dHVhbCBhdXRoZW50aWNhdGlvbiBmb3IgbGVnYWN5IHVzZXJzXHJcblxyXG4gICAgICBpZiAoX3RoaXMuX3BhcmVudE9iamVjdC5kYXRhLmhhc093blByb3BlcnR5KCdtdXR1YWwnKSkgcmVxdWVzdE1zZy5ib2R5Lm11dHVhbCA9IF90aGlzLl9wYXJlbnRPYmplY3QuZGF0YS5tdXR1YWw7XHJcblxyXG4gICAgICBpZiAoX3RoaXMuX3BhcmVudE9iamVjdC5tZXRhZGF0YS5yZXBvcnRlciA9PT0gX3RoaXMubWV0YWRhdGEucmVwb3J0ZXIpIHtcclxuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKGRlZXBDbG9uZShyZXF1ZXN0TXNnKSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgbGV0IGNhbGxiYWNrID0gKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgICAgaWYgKHJlcGx5LnRvID09PSBfdGhpcy5fcmVwb3J0ZXIpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2J1cy5yZW1vdmVSZXNwb25zZUxpc3RlbmVyKHJlcXVlc3RNc2cuZnJvbSwgcmVwbHkuaWQpO1xyXG5cclxuICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXIuRGF0YU9iamVjdENoaWxkLnNoYXJlXSBQYXJlbnQgcmVwb3J0ZXIgcmVwbHkgJywgcmVwbHkpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICBjb2RlOiByZXBseS5ib2R5ICYmIHJlcGx5LmJvZHkuY29kZSA/IHJlcGx5LmJvZHkuY29kZSA6IDUwMCxcclxuICAgICAgICAgICAgICBkZXNjOiByZXBseS5ib2R5ICYmIHJlcGx5LmJvZHkuZGVzYyA/IHJlcGx5LmJvZHkuZGVzYyA6ICdVbmtub3duJ1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA8IDMwMCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gcmVqZWN0KHJlc3VsdCk7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBpZCA9IF90aGlzLl9idXMucG9zdE1lc3NhZ2UoZGVlcENsb25lKHJlcXVlc3RNc2cpLCBjYWxsYmFjaywgZmFsc2UpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG5cclxuICAgICAgICAgIC8vIElmIFJlcG9ydGVyIGRvZXMgIG5vdCByZXBseSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZFxyXG4gICAgICAgICAgX3RoaXMuX2J1cy5yZW1vdmVSZXNwb25zZUxpc3RlbmVyKHJlcXVlc3RNc2cuZnJvbSwgaWQpO1xyXG5cclxuICAgICAgICAgIGxldCByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgIGNvZGU6IDQwOCxcclxuICAgICAgICAgICAgZGVzYzogJ3RpbW91dCdcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KHJlc3VsdCk7XHJcblxyXG4gICAgICAgIH0sIDMwMDApO1xyXG5cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2hhcmUgdGhlIGNoaWxkIE9iamVjdCBhbW9uZyBhdXRob3Jpc2VkIEh5cGVydGllc1xyXG4gICAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgIHJlcG9ydGVyICBJZiB0cnVlIHRoZSBjaGlsZCBvYmplY3QgaXMgb25seSBzaGFyZWQgdG8gUGFyZW50IHJlcG9ydGVyXHJcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEpTT04+fSAgICAgICAgSXQgcmV0dXJucyBhIHByb21pc2Ugd2l0aCB0aGUgc2hhcmluZyByZXN1bHRzLlxyXG4gICAgICovXHJcblxyXG4gIHN0b3JlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgY2hpbGQgPSB7fTtcclxuICAgIGxldCBrZXkgPSBfdGhpcy5tZXRhZGF0YS5jaGlsZHJlbiArICcuJyArIF90aGlzLm1ldGFkYXRhLnVybDtcclxuXHJcbiAgICBjaGlsZC52YWx1ZSA9IF90aGlzLm1ldGFkYXRhO1xyXG4gICAgY2hpbGQuaWRlbnRpdHkgPSBfdGhpcy5pZGVudGl0eTtcclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG5cclxuICAgICAgZnJvbTogX3RoaXMubWV0YWRhdGEucmVwb3J0ZXIsXHJcbiAgICAgIHRvOiBfdGhpcy5fcGFyZW50T2JqZWN0Ll9zeW5jaGVyLl9zdWJVUkwsXHJcbiAgICAgIHR5cGU6ICdjcmVhdGUnLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6IF90aGlzLm1ldGFkYXRhLnBhcmVudCxcclxuICAgICAgICBhdHRyaWJ1dGU6IGtleSxcclxuICAgICAgICB2YWx1ZTogY2hpbGRcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBsb2cubG9nKCdbRGF0YU9iamVjdENoaWxkLnN0b3JlXTonLCBtc2cpO1xyXG5cclxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnKTtcclxuICB9XHJcblxyXG4gIF9hbGxvY2F0ZUxpc3RlbmVycygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy90aGlzIGlzIG9ubHkgbmVlZGVkIGZvciBjaGlsZHJlbiByZXBvcnRlcnNcclxuICAgIGlmIChfdGhpcy5fcmVwb3J0ZXIgPT09IF90aGlzLl9vd25lcikge1xyXG4gICAgICBfdGhpcy5fbGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKF90aGlzLl9yZXBvcnRlciwgKG1zZykgPT4ge1xyXG4gICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ3Jlc3BvbnNlJyAmJiBtc2cuaWQgPT09IF90aGlzLl9tc2dJZCkge1xyXG4gICAgICAgICAgbG9nLmxvZygnRGF0YU9iamVjdENoaWxkLm9uUmVzcG9uc2U6JywgbXNnKTtcclxuICAgICAgICAgIF90aGlzLl9vblJlc3BvbnNlKG1zZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9yZWxlYXNlTGlzdGVuZXJzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoX3RoaXMuX2xpc3RlbmVyKSB7XHJcbiAgICAgIF90aGlzLl9saXN0ZW5lci5yZW1vdmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbGVhc2UgYW5kIGRlbGV0ZSBvYmplY3QgZGF0YVxyXG4gICAqL1xyXG4gIGRlbGV0ZSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cclxuICAgIF90aGlzLl9yZWxlYXNlTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgLy9UT0RPOiBzZW5kIGRlbGV0ZSBtZXNzYWdlID9cclxuXHJcbiAgICAvLyBub3RoaW5nIHRvIGJlIGRvbmVcclxuICAgIC8vIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgLy8gICBsb2cubG9nKCdbRGF0YU9iamVjdENoaWxkLmRlbGV0ZV0nKTtcclxuICAgIC8vICAgcmVzb2x2ZSgpO1xyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBbGwgTWV0YWRhdGEgYWJvdXQgdGhlIENoaWxkIERhdGEgT2JqZWN0XHJcbiAgICogQHR5cGUge09iamVjdH0gLVxyXG4gICAqL1xyXG4gIGdldCBtZXRhZGF0YSgpIHsgcmV0dXJuIHRoaXMuX21ldGFkYXRhOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoaWxkcmVuIElEIGdlbmVyYXRlZCBvbiBhZGRDaGlsZHJlbi4gVW5pcXVlIGlkZW50aWZpZXJcclxuICAgKiBAdHlwZSB7VVJMfSAtIFVSTCBvZiB0aGUgZm9ybWF0IDxIeXBlcnR5VVJMPiM8bnVtZXJpYy1zZXF1ZW5jZT5cclxuICAgKi9cclxuICBnZXQgY2hpbGRJZCgpIHsgcmV0dXJuIHRoaXMuX2NoaWxkSWQ7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0YSBTdHJ1Y3R1cmUgdG8gYmUgc3luY2hyb25pemVkLlxyXG4gICAqIEB0eXBlIHtKU09OfSAtIEpTT04gc3RydWN0dXJlIHRoYXQgc2hvdWxkIGZvbGxvdyB0aGUgZGVmaW5lZCBzY2hlbWEsIGlmIGFueS5cclxuICAgKi9cclxuXHJcbiAgZ2V0IHNoYXJpbmdTdGF0dXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2hhcmluZ1N0YXR1cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgKiBEYXRhIFN0cnVjdHVyZSB0byBiZSBzeW5jaHJvbml6ZWQuXHJcbiAgICAqIEB0eXBlIHtKU09OfSAtIEpTT04gc3RydWN0dXJlIHRoYXQgc2hvdWxkIGZvbGxvdyB0aGUgZGVmaW5lZCBzY2hlbWEsIGlmIGFueS5cclxuICAgICovXHJcblxyXG4gIGdldCBkYXRhKCkgeyByZXR1cm4gdGhpcy5fc3luY09iai5kYXRhOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBmb3IgdGhpcyBkYXRhT2JqZWN0Q2hpbGQgYW4gaWRlbnRpdHlcclxuICAgKiBAbWV0aG9kIGlkZW50aXR5XHJcbiAgICogQHBhcmFtICB7SWRlbnRpdHl9IGlkZW50aXR5IGlkZW50aXR5IGZyb20gd2hvIGNyZWF0ZWQgdGhlIG1lc3NhZ2VcclxuICAgKi9cclxuICBzZXQgaWRlbnRpdHkoaWRlbnRpdHkpIHsgdGhpcy5faWRlbnRpdHkgPSBpZGVudGl0eTsgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgZm9yIHRoaXMgZGF0YU9iamVjdENoaWxkIGFuIGlkZW50aXR5XHJcbiAgICogQG1ldGhvZCBpZGVudGl0eVxyXG4gICAqIEByZXR1cm4ge0lkZW50aXR5fSBpZGVudGl0eSBmcm9tIHdobyBjcmVhdGVkIHRoZSBtZXNzYWdlXHJcbiAgICovXHJcbiAgZ2V0IGlkZW50aXR5KCkgeyByZXR1cm4gdGhpcy5faWRlbnRpdHk7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgdGhlIGNoYW5nZSBsaXN0ZW5lcnMgc2VudCBieSB0aGUgcmVwb3J0ZXIgY2hpbGRcclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrXHJcbiAgICovXHJcbiAgb25DaGFuZ2UoY2FsbGJhY2spIHtcclxuICAgIHRoaXMuX3N5bmNPYmoub2JzZXJ2ZSgoZXZlbnQpID0+IHtcclxuICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3RDaGlsZCAtIG9ic2VydmVyXSAtICcsIGV2ZW50KTtcclxuICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCB0aGUgY2FsbGJhY2sgdG8gcHJvY2VzcyByZXNwb25zZSBub3RpZmljYXRpb25zIG9mIHRoZSBjcmVhdGVzXHJcbiAgICogQHBhcmFtIHtmdW5jdGlvbihldmVudDogTXNnRXZlbnQpfSBjYWxsYmFja1xyXG4gICAqL1xyXG4gIG9uUmVzcG9uc2UoY2FsbGJhY2spIHtcclxuICAgIHRoaXMuX29uUmVzcG9uc2VIYW5kbGVyID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIHJlbW90ZSBEYXRhT2JqZWN0IC0+IF9vbkNoaWxkQ3JlYXRlXHJcbiAgX29uUmVzcG9uc2UobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBldmVudCA9IHtcclxuICAgICAgdHlwZTogbXNnLnR5cGUsXHJcbiAgICAgIHVybDogbXNnLmJvZHkuc291cmNlLFxyXG4gICAgICBjb2RlOiBtc2cuYm9keS5jb2RlXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChfdGhpcy5fb25SZXNwb25zZUhhbmRsZXIpIHtcclxuICAgICAgX3RoaXMuX29uUmVzcG9uc2VIYW5kbGVyKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEYXRhT2JqZWN0Q2hpbGQ7XHJcbiIsIlxyXG5cclxuaW1wb3J0IHsgc2Vjb25kc1NpbmNlRXBvY2ggfSBmcm9tICcuLi91dGlscy91dGlscy5qcyc7XHJcblxyXG4vKipcclxuICogQ2xhc3MgdG8gaGFuZGxlIENoaWxkcmVuIERhdGEgT2JqZWN0IEhlYXJ0IGJlYXRzIFxyXG4gKiByZXF1aXJlZCB0byBtYW5hZ2Ugc3luY2hyb25pc2F0aW9uIHdpdGggcmVtb3RlIHN0b3JhZ2Ugc2VydmVycy5cclxuICovXHJcbmNsYXNzIEhlYXJ0QmVhdCB7XHJcbiAgLyogcHJpdmF0ZVxyXG5cclxuICAqL1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICogU2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IEh5cGVydGllcy4gSXQncyBjYWxsZWQgYnkgdGhlIERhdGFPYmplY3QgY29uc3RydWN0b3JcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihidXMsIGh5cGVydHlVcmwsIHJ1bnRpbWVVcmwsIGRhdGFPYmplY3QsIGhlYXJ0QmVhdFJhdGUgPSA2MCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBmdW5jdGlvbiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IocGFyKSB7XHJcbiAgICAgIHRocm93ICdbSGVhcnRCZWF0XSAnICsgcGFyICsgJyBtYW5kYXRvcnkgcGFyYW1ldGVyIGlzIG1pc3NpbmcnO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1cyA/IF90aGlzLl9idXMgPSBidXMgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ2J1cycpO1xyXG4gICAgZGF0YU9iamVjdCA/IF90aGlzLl9kYXRhT2JqZWN0ID0gZGF0YU9iamVjdCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcignZGF0YU9iamVjdCcpO1xyXG4gICAgaGVhcnRCZWF0UmF0ZSA/IF90aGlzLl9oZWFydEJlYXRSYXRlID0gaGVhcnRCZWF0UmF0ZSA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcignaGVhcnRCZWF0UmF0ZScpO1xyXG4gICAgcnVudGltZVVybCA/IF90aGlzLl9ydW50aW1lVXJsID0gcnVudGltZVVybCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcigncnVudGltZVVybCcpO1xyXG4gICAgaHlwZXJ0eVVybCA/IF90aGlzLl9oeXBlcnR5VXJsID0gaHlwZXJ0eVVybCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcignaHlwZXJ0eVVybCcpO1xyXG4gICAgdGhpcy5oZWFydGJlYXQgPSAwO1xyXG5cclxuICAgIF90aGlzLl9zdG9wID0ge1xyXG4gICAgICBoZWFydEJlYXQ6IGZhbHNlLFxyXG4gICAgICBzeW5jOiBmdW5jdGlvbiAoYnVzKSB7XHJcbiAgICAgICAgbGV0IHN0b3BTeW5jTXNnID0ge1xyXG4gICAgICAgICAgZnJvbTogaHlwZXJ0eVVybCxcclxuICAgICAgICAgIHRvOiBydW50aW1lVXJsICsgJy9zbScsXHJcbiAgICAgICAgICB0eXBlOiAnZXhlY3V0ZScsXHJcbiAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgIG1ldGhvZDogJ3N0b3BTeW5jJyxcclxuICAgICAgICAgICAgcGFyYW1zOiBbZGF0YU9iamVjdC51cmxdXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tIZWFydGJlYXQuc3RvcC5zeW5jKCldIHNlbmRpbmcgbXNnOicsIHN0b3BTeW5jTXNnKTtcclxuXHJcbiAgICAgICAgYnVzLnBvc3RNZXNzYWdlKHN0b3BTeW5jTXNnKTtcclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICB9XHJcblxyXG4gIHN0YXJ0KHJlc3VtZSwgaXNSZXBvcnRlciA9IGZhbHNlKSB7XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXRdIHN0YXJ0aW5nLiBpc1JlcG9ydGVyOiAnLCBpc1JlcG9ydGVyKTtcclxuXHJcbiAgICBpZiAocmVzdW1lIHx8ICFpc1JlcG9ydGVyKSB7XHJcbiAgICAgIHRoaXMuX2dldExhc3RIZWFyQmVhdCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGxldCBpc0hlYXJ0QmVhdEFjdGl2ZSA9IHRoaXMuX2lzSGVhcnRCZWF0QWN0aXZlKHRoaXMuaGVhcnRCZWF0LCB0aGlzLl9oZWFydEJlYXRSYXRlICogMik7XHJcblxyXG4gICAgICAgIGlmICghaXNIZWFydEJlYXRBY3RpdmUpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0XSBoZWFydCBiZWF0cyBhcmUgZGlzYWJsZWQgZm9yICcsIHRoaXMuX2RhdGFPYmplY3QpO1xyXG5cclxuICAgICAgICAgIC8vIElzIGRpc2FibGVkOiBsZXRzIHN0YXJ0IG9ic2VydmVyIGhlYXJ0IGJlYXQgYW5kIHN0YXJ0IHN5bmNoaW5nIHdpdGggcmVtb3RlIHN0b3JhZ2Ugc2VydmVyXHJcbiAgICAgICAgICB0aGlzLl9zdG9wLmhlYXJ0QmVhdCA9IHRoaXMuX3N0YXJ0SGVhcnRCZWF0KHRoaXMuX2hlYXJ0QmVhdFJhdGUpO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXRdICAnLCB0aGlzLl9oeXBlcnR5VXJsLCAnIHN0YXJ0ZWQgc3luY2hpbmcgd2l0aCByZW1vdGUgc3RvcmFnZSBzZXJ2ZXInKTtcclxuICAgICAgICAgIHRoaXMuX3N0YXJ0U3luYygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyAgaGVhcnQgYmVhdCBpcyBhY3RpdmUsIFxyXG4gICAgICAgICAgLy8gaXQgbWVhbnMgdGhlIGRhdGEgb2JqZWN0IGlzIGFscmVhZHkgYmVpbmcgc3luY2hyb25pc2VkIHdpdGggcmVtb3RlIHN0b3JhZ2Ugc2VydmVyXHJcbiAgICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gd2F0Y2ggdGhlIGhlYXJ0IGJlYXQgYW5kIHRyeSB0byByZXBsYWNlIGl0IGluIGNhc2UgaXQgZmFpbHMuXHJcbiAgICAgICAgICB0aGlzLl93YXRjaEhlYXJ0QmVhdCh0aGlzLl9oZWFydEJlYXRSYXRlLCB0cnVlLCB0aGlzLl9vbkhlcnRiZWF0U3RvcHBlZCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc3RhcnRIZWFydEJlYXQodGhpcy5faGVhcnRCZWF0UmF0ZSk7XHJcbiAgICAgIHRoaXMuX3N0YXJ0U3luYygpO1xyXG4gICAgfSBcclxuXHJcbiAgfVxyXG5cclxuICBfZ2V0TGFzdEhlYXJCZWF0KCkge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gIFxyXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdC5fZ2V0TGFzdEhlYXJCZWF0XSBzdG9wIHdhaXRpbmcgJyk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG5cclxuICAgICAgfSwgdGhpcy5faGVhcnRCZWF0UmF0ZSAqIDEwMDAgKiAxLjUpO1xyXG4gIFxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgc3RvcCgpIHtcclxuICAgIGlmICh0aGlzLl9zdG9wLmhlYXJ0QmVhdClcclxuICAgICAgdGhpcy5fc3RvcC5oZWFydEJlYXQoKTtcclxuXHJcbiAgICB0aGlzLl9zdG9wLnN5bmModGhpcy5fYnVzKTtcclxuICB9XHJcblxyXG4gIGdldCBoZWFydEJlYXQoKSB7XHJcbiAgICBpZiAodGhpcy5oZWFydGJlYXQpXHJcbiAgICAgIHJldHVybiB0aGlzLmhlYXJ0YmVhdDtcclxuICAgIGVsc2UgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICBvbk5ld0hlYXJ0YmVhdChoZWFydGJlYXQpIHtcclxuICAgIHRoaXMuaGVhcnRiZWF0ID0gaGVhcnRiZWF0O1xyXG4gIH1cclxuXHJcbiAgX2lzSGVhcnRCZWF0QWN0aXZlKGxhc3RIZWFydGJlYXQsIG1heEhlYXJ0QmVhdEludGVydmFsKSB7XHJcbiAgICBsZXQgbGFzdEhlYXJ0UGVyaW9kSW50ZXJ2YWwgPSBzZWNvbmRzU2luY2VFcG9jaCgpIC0gbGFzdEhlYXJ0YmVhdDtcclxuICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll9pc0hlYXJ0QmVhdEFjdGl2ZV0gbm93IC0gbGFzdEhlYXJ0QmVhdCcsIGxhc3RIZWFydFBlcmlvZEludGVydmFsKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdC5faXNIZWFydEJlYXRBY3RpdmVdICcsICEobGFzdEhlYXJ0UGVyaW9kSW50ZXJ2YWwgPiBtYXhIZWFydEJlYXRJbnRlcnZhbCAqIDIpKTtcclxuICAgIHJldHVybiAoIShsYXN0SGVhcnRQZXJpb2RJbnRlcnZhbCA+IG1heEhlYXJ0QmVhdEludGVydmFsICogMikpO1xyXG4gIH1cclxuXHJcblxyXG4gIF9zdGFydEhlYXJ0QmVhdChyYXRlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIGZyb206IF90aGlzLl9oeXBlcnR5VXJsLFxyXG4gICAgICB0bzogX3RoaXMuX2RhdGFPYmplY3QudXJsICsgJy9jaGlsZHJlbi8nLFxyXG4gICAgICB0eXBlOiAnY3JlYXRlJyxcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlOiAnaGVhcnRiZWF0JyxcclxuICAgICAgICBtdXR1YWw6IGZhbHNlLFxyXG4gICAgICAgIHZhbHVlOiBzZWNvbmRzU2luY2VFcG9jaCgpLFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdC5fc3RhcnRIZWFydEJlYXRdIHN0YXJ0aW5nIC4uLiAnLCBtc2cuYm9keS52YWx1ZSk7XHJcblxyXG4gICAgdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1zZyk7XHJcblxyXG4gICAgdGhpcy5oZWFydGJlYXQgPSBzZWNvbmRzU2luY2VFcG9jaCgpO1xyXG5cclxuICAgIGxldCBpZCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgIGxldCBtc2cgPSB7XHJcbiAgICAgICAgZnJvbTogX3RoaXMuX2h5cGVydHlVcmwsXHJcbiAgICAgICAgdG86IF90aGlzLl9kYXRhT2JqZWN0LnVybCArICcvY2hpbGRyZW4vJyxcclxuICAgICAgICB0eXBlOiAnY3JlYXRlJyxcclxuICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICByZXNvdXJjZTogJ2hlYXJ0YmVhdCcsXHJcbiAgICAgICAgICBtdXR1YWw6IGZhbHNlLFxyXG4gICAgICAgICAgdmFsdWU6IHNlY29uZHNTaW5jZUVwb2NoKCksXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0XSAnLCBtc2cpO1xyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1zZyk7XHJcbiAgICAgIHRoaXMuaGVhcnRiZWF0ID0gc2Vjb25kc1NpbmNlRXBvY2goKTtcclxuXHJcbiAgICB9LCByYXRlICogMTAwMCk7XHJcblxyXG4gICAgLy8gcmV0dXJucyBmdW5jdGlvbiB0byBzdG9wIHRoZSBoZWFydCBiZWF0XHJcblxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgY2xlYXJJbnRlcnZhbChpZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfc3RhcnRTeW5jKCkge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll9zdGFydFN5bmNdIHN0YXJ0aW5nIG9ic2VydmVyIHN5bmMgJywgdGhpcy5fZGF0YU9iamVjdC5kYXRhKTtcclxuICAgIGxldCBiYWNrdXBSZXZpc2lvbiA9IHRoaXMuX2RhdGFPYmplY3QuZGF0YS5iYWNrdXBSZXZpc2lvbjtcclxuICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll9zdGFydFN5bmNdIGJhY2t1cFJldmlzaW9uICcsIGJhY2t1cFJldmlzaW9uKTtcclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIGZyb206IHRoaXMuX2h5cGVydHlVcmwsXHJcbiAgICAgIHRvOiB0aGlzLl9ydW50aW1lVXJsICsgJy9zbScsXHJcbiAgICAgIHR5cGU6ICdleGVjdXRlJyxcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIG1ldGhvZDogJ3N5bmMnLFxyXG4gICAgICAgIHBhcmFtczogW3RoaXMuX2RhdGFPYmplY3QudXJsLCBiYWNrdXBSZXZpc2lvbl1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll9zdGFydFN5bmNdIHNlbmRpbmcgbXNnICcsIG1zZyk7XHJcblxyXG4gICAgdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1zZyk7XHJcblxyXG4gIH1cclxuXHJcbiAgX3dhdGNoSGVhcnRCZWF0KHJhdGUsIG9uV2F0Y2hpbmdJc0VuYWJsZWQsIGNhbGxiYWNrKSB7XHJcbiAgICAvLyAgcWRvIG8gaGVhcnRCZWF0IHRlcm1pbmFyIGNoYW1hIGNhbGxiYWNrIFxyXG4gICAgLy8gdXNhIGhlYXJ0QmVhdCBSYXRpbmcgcGFyYSBpbmljaWFyIHRpbWVyIG5vIHJlc3BlY3Rpdm8gXHJcbiAgICAvLyBjYW1wbyBkbyBETyBjaGFtYW5kbyBpc0hlYXJ0QmVhdEFjdGl2ZSgpXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBzeW5jRnVuID0gY2FsbGJhY2s7XHJcbiAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdC5fd2F0Y2hIZWFydEJlYXRdIHN0YXJ0ZWQgd2F0Y2hpbmcgJywgX3RoaXMuaGVhcnRCZWF0KTtcclxuXHJcbiAgICAvL2xldCBoZWFydEJlYXQgPSB0eXBlICsgJ0hlYXJ0QmVhdCc7XHJcblxyXG4gICAgbGV0IHdhdGNoZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICBpZiAob25XYXRjaGluZ0lzRW5hYmxlZCAmJiAhX3RoaXMuX2lzSGVhcnRCZWF0QWN0aXZlKF90aGlzLmhlYXJ0QmVhdCwgX3RoaXMuX2hlYXJ0QmVhdFJhdGUpKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXQuX3dhdGNoSGVhcnRCZWF0XSBoYXMgc3RvcHBlZCAnLCBfdGhpcy5fZGF0YU9iamVjdC5kYXRhKTtcclxuXHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh3YXRjaGVyKTtcclxuICAgICAgICBzeW5jRnVuKF90aGlzKTtcclxuICAgICAgfSBlbHNlIGlmICghb25XYXRjaGluZ0lzRW5hYmxlZCAmJiB0aGlzLl9pc0hlYXJ0QmVhdEFjdGl2ZShfdGhpcy5oZWFydEJlYXQsIF90aGlzLl9oZWFydEJlYXRSYXRlKSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll93YXRjaEhlYXJ0QmVhdF0gaGFzIGNoYW5nZWQgdG8gZGlzYWJsZWQgJywgX3RoaXMuX2RhdGFPYmplY3QuZGF0YSk7XHJcblxyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwod2F0Y2hlcik7XHJcbiAgICAgICAgc3luY0Z1bigpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSwgcmF0ZSAqIDEwMDAgKiAyKTtcclxuXHJcbiAgfVxyXG5cclxuICBfb25IZXJ0YmVhdFN0b3BwZWQoX3RoaXMpIHtcclxuXHJcbiAgICBfdGhpcy5fc3RhcnRIZWFydEJlYXQoX3RoaXMuX2hlYXJ0QmVhdFJhdGUpO1xyXG4gICAgX3RoaXMuX3N0YXJ0U3luYygpO1xyXG4gIH1cclxuXHJcblxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSGVhcnRCZWF0O1xyXG4iLCIvKipcclxuKiBUaGUgSHlwZXJ0eSBSZXNvdXJjZSBEYXRhIE1vZGVsIGlzIHVzZWQgdG8gbW9kZWwgcmVzb3VjZXMgaGFuZGxlZCBieSBIeXBlcnRpZXMgYW5kIERhdGEgT2JqZWN0cyBpbmNsdWRpbmcgY2hhdCBtZXNzYWdlcywgZmlsZXMsIHJlYWwgdGltZSBodW1hbiBhdWRpbyBhbmQgdmlkZW8uLlxyXG4qXHJcbiovXHJcblxyXG4vLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdIeXBlcnR5UmVzb3VyY2UnKTtcclxuXHJcbmltcG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcclxuaW1wb3J0IERhdGFPYmplY3RDaGlsZCBmcm9tICcuLi9zeW5jaGVyL0RhdGFPYmplY3RDaGlsZC5qcyc7XHJcblxyXG5jbGFzcyBIeXBlcnR5UmVzb3VyY2UgZXh0ZW5kcyBEYXRhT2JqZWN0Q2hpbGQge1xyXG5cclxuICAvKipcclxuICAqIEh5cGVydHlSZXNvdXJjZSBjb25zdHJ1Y3RvclxyXG4gICpcclxuICAqIEBwYXJhbSAge1VSTH0gbG9jYWxSdW50aW1lVVJMIFJ1bnRpbWVVUkwgb2YgbG9jYWwgcnVudGltZVxyXG4gICogQHBhcmFtICB7VVJMfSBpbnB1dC5vd25lciBIeXBlcnR5VVJMIG9mIHRoZSBIeXBlcnR5IGhhbmRsaW5nIHRoaXMgcmVzb3VyY2VcclxuICAqIEBwYXJhbSAge1VSTH0gaW5wdXQucnVudGltZSBSdW50aW1lIFVSTCB3aGVyZSB0aGlzIHJlc291cmNlIGlzIGhvc3RlZFxyXG4gICogQHBhcmFtICB7QnVzfSBpbnB1dC5idXMgc2FuZGJveCBtZXNzYWdlIGJ1c1xyXG4gICogQHBhcmFtICB7RGF0YU9iamVjdH0gaW5wdXQucGFyZW50IFBhcmVudCBEYXRhIE9iamVjdCB3aGVyZSB0aGUgSHlwZXJ0eVJlc291cmNlIGlzIGhhbmRsZWQgYXMgYSBjaGlsZFxyXG4gICogQHBhcmFtICB7Qm9vbGVhbn0gaXNTZW5kZXIgaW5kaWNhdGVzIGlmIHBhcmVudCBpcyBSZXBvcnRlciBvciBhbiBPYnNlcnZlclxyXG4gICogQHBhcmFtICB7QXJyYXl9IGlucHV0IG9wdGlvbmFsIGlucHV0IHBhcmFtZXRlcnNcclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3Rvcihpc1NlbmRlciwgaW5wdXQpIHtcclxuICAgIHN1cGVyKGlucHV0KTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuYXJyYXlidWZmZXJTaXplTGltaXQgPSA1MjQyODgwOyAvL2Fib3ZlIHRoaXMgbGltaXQgY29udGVudCBpcyBub3Qgc2F2ZWQgYXMgQXJyYXlCdWZmZXJcclxuXHJcbiAgICBfdGhpcy5faXNTZW5kZXIgPSBpc1NlbmRlcjtcclxuXHJcbiAgICBfdGhpcy5fbG9jYWxTdG9yYWdlVVJMID0gX3RoaXMuX3BhcmVudE9iamVjdC5fc3luY2hlci5fcnVudGltZVVybCArICcvc3RvcmFnZSc7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHJlc291cmNlVHlwZSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMubWV0YWRhdGEucmVzb3VyY2VUeXBlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1pbWV0eXBlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fbWV0YWRhdGEudHlwZTtcclxuICB9XHJcblxyXG4gIGdldCBjb250ZW50KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fY29udGVudDtcclxuICB9XHJcblxyXG4gIGdldCBjb250ZW50VVJMKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fbWV0YWRhdGEuY29udGVudFVSTDtcclxuICB9XHJcblxyXG4gIGdldCBzaGFyZWFibGUoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IHNoYXJlYWJsZSA9IHN1cGVyLm1ldGFkYXRhO1xyXG4gICAgc2hhcmVhYmxlLnJlc291cmNlVHlwZSA9IF90aGlzLnJlc291cmNlVHlwZTtcclxuICAgIHJldHVybiBzaGFyZWFibGU7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gIHNldCBwYXJlbnQocGFyZW50KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX3BhcmVudCA9IHBhcmVudDtcclxuICB9Ki9cclxuXHJcbiAgc2F2ZSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IG1zZyA9IHtcclxuICAgICAgICBmcm9tOiBfdGhpcy5fb3duZXIsXHJcbiAgICAgICAgdG86IF90aGlzLl9sb2NhbFN0b3JhZ2VVUkwsXHJcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsXHJcbiAgICAgICAgYm9keTogeyB2YWx1ZTogZGVlcENsb25lKF90aGlzLl9tZXRhZGF0YSkgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgbGV0IGNhbGxiYWNrID0gKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tIeXBlcnR5UmVzb3VyY2Uuc2F2ZV0gcmVwbHk6ICcsIHJlcGx5KTtcclxuICAgICAgICBfdGhpcy5fYnVzLnJlbW92ZVJlc3BvbnNlTGlzdGVuZXIoX3RoaXMuX293bmVyLCByZXBseS5pZCk7XHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICBpZiAocmVwbHkuYm9keS52YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAoIV90aGlzLl9tZXRhZGF0YS5jb250ZW50VVJMKSBfdGhpcy5fbWV0YWRhdGEuY29udGVudFVSTCA9IFtdO1xyXG4gICAgICAgICAgICBfdGhpcy5fbWV0YWRhdGEuY29udGVudFVSTC5wdXNoKHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gZWxzZSByZWplY3QocmVwbHkuYm9keS5jb2RlICsgJyAnICsgcmVwbHkuYm9keS5kZXNjKTtcclxuXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBtc2cuYm9keS52YWx1ZS5jb250ZW50ID0gX3RoaXMuX2NvbnRlbnQ7XHJcblxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1zZywgY2FsbGJhY2ssIGZhbHNlKTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEZ1bmN0aW9uIHRvIFJlYWQgSHlwZXJ0eVJlc291cmNlXHJcbiAgKlxyXG4gICogQHBhcmFtICB7fSBjYWxsYmFjayBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2l0aCBwcm9ncmVzcyBpbmZvcm1hdGlvbiBpbiB0ZXJtcyBvZiBwZXJjZW50YWdlXHJcbiAgKiBAcmV0dXJuICB7UHJvbWlzZX0gIGlucHV0IG9wdGlvbmFsIGlucHV0IHBhcmFtZXRlcnNcclxuICAqL1xyXG5cclxuXHJcbiAgcmVhZChjYWxsYmFjaykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxvZy5pbmZvKCdbSHlwZXJ0eVJlc291cmNlLnJlYWRdICcsIHRoaXMpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5jb250ZW50KSB7XHJcbiAgICAgICAgcmVzb2x2ZShfdGhpcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgIC8vVE9ETzogdXNlIGFuIGl0ZXJhdGlvbiB0byBnZXQgb25saW5lIHJ1bnRpbWUgc3RvcmFnZXMgd2hlbiBzb21lIGFyZSBvZmZsaW5lXHJcbiAgICAgICAgbGV0IHN0b3JhZ2UgPSBfdGhpcy5fZ2V0QmVzdENvbnRlbnRVUkwoX3RoaXMuX21ldGFkYXRhLmNvbnRlbnRVUkwpO1xyXG5cclxuICAgICAgICBsb2cubG9nKCdTdG9yYWdlOicsIHN0b3JhZ2UpO1xyXG5cclxuICAgICAgICBsZXQgbXNnID0ge1xyXG4gICAgICAgICAgZnJvbTogX3RoaXMuX293bmVyLFxyXG4gICAgICAgICAgdG86IHN0b3JhZ2UudXJsLFxyXG4gICAgICAgICAgdHlwZTogJ3JlYWQnLFxyXG4gICAgICAgICAgYm9keTogeyByZXNvdXJjZTogc3RvcmFnZS51cmwgKyAnLycgKyBzdG9yYWdlLnJlc291cmNlLCBwMnA6IHRydWUgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChfdGhpcy5tZXRhZGF0YS5wMnBSZXF1ZXN0ZXIgJiYgX3RoaXMubWV0YWRhdGEucDJwSGFuZGxlcikge1xyXG4gICAgICAgICAgbXNnLmJvZHkucDJwUmVxdWVzdGVyID0gX3RoaXMubWV0YWRhdGEucDJwUmVxdWVzdGVyO1xyXG4gICAgICAgICAgbXNnLmJvZHkucDJwSGFuZGxlciA9IF90aGlzLm1ldGFkYXRhLnAycEhhbmRsZXI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlIGZpcnN0IG9uIHRoZSBMb2NhbCBIeXBlcnR5IFJlc291cmNlIFN0b3JhZ2U7XHJcbiAgICAgICAgX3RoaXMuX2dldEJlc3RSZXNvdXJjZShtc2csIGNhbGxiYWNrKS50aGVuKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgbG9nLmluZm8oJ1tIeXBlcnR5UmVzb3VyY2VdIC0gZ2V0IGxvY2FsbHkgdGhlIHJlc291cmNlOicsIHJlcGx5KTtcclxuICAgICAgICAgIHJlc29sdmUoX3RoaXMpO1xyXG4gICAgICAgIH0pLmNhdGNoKChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICAgIGxvZy53YXJuKCdbSHlwZXJ0eVJlc291cmNlXSAtIGdldCBsb2NhbGx5IHRoZSByZXNvdXJjZSBmYWlsJywgcmVwbHkpO1xyXG5cclxuICAgICAgICAgIC8vIEdlbmVyYXRlIG5ldyBtZXNzYWdlIHRvIG5vdCB1c2UgdGhlIHNhbWUgaWQgb2YgdGhlIGxhc3Qgb25lO1xyXG4gICAgICAgICAgbGV0IG1zZyA9IHtcclxuICAgICAgICAgICAgZnJvbTogX3RoaXMuX293bmVyLFxyXG4gICAgICAgICAgICB0bzogc3RvcmFnZS5yZW1vdGVVUkwsXHJcbiAgICAgICAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgICAgICAgYm9keTogeyByZXNvdXJjZTogc3RvcmFnZS5yZW1vdGVVUkwgKyAnLycgKyBzdG9yYWdlLnJlc291cmNlLCBwMnA6IHRydWUgfVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAoX3RoaXMubWV0YWRhdGEucDJwUmVxdWVzdGVyICYmIF90aGlzLm1ldGFkYXRhLnAycEhhbmRsZXIpIHtcclxuICAgICAgICAgICAgbXNnLmJvZHkucDJwUmVxdWVzdGVyID0gX3RoaXMubWV0YWRhdGEucDJwUmVxdWVzdGVyO1xyXG4gICAgICAgICAgICBtc2cuYm9keS5wMnBIYW5kbGVyID0gX3RoaXMubWV0YWRhdGEucDJwSGFuZGxlcjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlIG9uIHRoZSBSZW1vdGUgSHlwZXJ0eSBSZXNvdXJjZSBTdG9yYWdlO1xyXG4gICAgICAgICAgX3RoaXMuX2dldEJlc3RSZXNvdXJjZShtc2csIGNhbGxiYWNrKS50aGVuKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgICBsb2cud2FybignW0h5cGVydHlSZXNvdXJjZV0gLSBnZXQgcmVtb3RlbHkgdGhlIHJlc291cmNlJywgcmVwbHkpO1xyXG4gICAgICAgICAgICByZXNvbHZlKF90aGlzKTtcclxuICAgICAgICAgIH0pLmNhdGNoKChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgICBsb2cud2FybignW0h5cGVydHlSZXNvdXJjZV0gLSBnZXQgcmVtb3RlbHkgdGhlIHJlc291cmNlIGZhaWwnLCByZXBseSk7XHJcbiAgICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmNvZGUgKyAnICcgKyByZXBseS5ib2R5LmRlc2MpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfZ2V0QmVzdFJlc291cmNlKG1zZywgaW5Qcm9ncmVzc0NhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgd2FpdEZvclJlc3BvbnNlID0gc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICAgIC8vIElmIFJlcG9ydGVyIGRvZXMgIG5vdCByZXBseSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZFxyXG4gICAgICAgIF90aGlzLl9idXMucmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcihfdGhpcy5fb3duZXIsIGlkKTtcclxuXHJcbiAgICAgICAgbXNnLmJvZHkuY29kZSA9IDQwODtcclxuICAgICAgICBtc2cuYm9keS5kZXNjID0gJ1Jlc3BvbnNlIHRpbWVvdXQnXHJcblxyXG4gICAgICAgIHJldHVybiByZWplY3QobXNnKTtcclxuXHJcbiAgICAgIH0sIDMwMDApO1xyXG5cclxuICAgICAgbGV0IGNhbGxiYWNrID0gKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZygnW0h5cGVydHlSZXNvdXJjZS5yZWFkXSByZXBseTogJywgcmVwbHkpO1xyXG4gICAgICAgIGxldCBpZCA9IHJlcGx5LmlkO1xyXG5cclxuICAgICAgICBjbGVhclRpbWVvdXQod2FpdEZvclJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChyZXBseS5ib2R5LmNvZGUpIHtcclxuICAgICAgICAgIGNhc2UgMjAwOlxyXG4gICAgICAgICAgICBfdGhpcy5fY29udGVudCA9IHJlcGx5LmJvZHkudmFsdWUuY29udGVudDtcclxuXHJcbiAgICAgICAgICAgIC8vIHNhdmUgbG9jYWxseSBpZiBub3QgdG9vIGJpZ1xyXG4gICAgICAgICAgICBpZiAocmVwbHkuYm9keS52YWx1ZS5zaXplIDwgX3RoaXMuYXJyYXlidWZmZXJTaXplTGltaXQpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5zYXZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIF90aGlzLl9idXMucmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcihfdGhpcy5fb3duZXIsIGlkKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShyZXBseSk7XHJcblxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIDE4MzpcclxuICAgICAgICAgICAgaW5Qcm9ncmVzc0NhbGxiYWNrKHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBfdGhpcy5fYnVzLnJlbW92ZVJlc3BvbnNlTGlzdGVuZXIoX3RoaXMuX293bmVyLCBpZCk7XHJcbiAgICAgICAgICAgIHJlamVjdChyZXBseSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsZXQgaWQgPSBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1zZywgY2FsbGJhY2ssIGZhbHNlKTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvLyBSZW1vdmUgSHlwZXJ0eSBmcm9tIHRoZSBsb2NhbCBzdG9yYWdlXHJcblxyXG4gIGRlbGV0ZSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbG9nLmluZm8oJ1tIeXBlcnR5UmVzb3VyY2UuZGVsZXRlXScsIF90aGlzLm1ldGFkYXRhKTtcclxuXHJcblxyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgZnJvbTogX3RoaXMuX293bmVyLFxyXG4gICAgICB0bzogX3RoaXMuX2xvY2FsU3RvcmFnZVVSTCxcclxuICAgICAgdHlwZTogJ2RlbGV0ZScsXHJcbiAgICAgIGJvZHk6IHsgcmVzb3VyY2VzOiBfdGhpcy5tZXRhZGF0YS5jb250ZW50VVJMIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlIDwgMzAwKSByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIGVsc2UgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfZ2V0QmVzdENvbnRlbnRVUkwoY29udGVudFVSTExpc3QpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGNvbnN0IGNvbnRlbnRVUkwgPSBjb250ZW50VVJMTGlzdFswXTtcclxuICAgIGNvbnN0IHNwbGl0ZWRSZXNvdXJjZSA9IGNvbnRlbnRVUkwuc3Vic3RyKGNvbnRlbnRVUkwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xyXG4gICAgY29uc3QgdXJsID0gX3RoaXMuX2xvY2FsU3RvcmFnZVVSTDsgLy8gY29udGVudFVSTC5zdWJzdHIoMCwgY29udGVudFVSTC5sYXN0SW5kZXhPZignLycpKTtcclxuICAgIGNvbnN0IHJlbW90ZVJlc291cmNlID0gY29udGVudFVSTC5zdWJzdHIoMCwgY29udGVudFVSTC5sYXN0SW5kZXhPZignLycpKTtcclxuXHJcbiAgICByZXR1cm4ge3VybDogdXJsLCByZXNvdXJjZTogc3BsaXRlZFJlc291cmNlLCByZW1vdGVVUkw6IHJlbW90ZVJlc291cmNlIH07XHJcblxyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5UmVzb3VyY2U7XHJcbiIsImxldCBoYXNCbG9iQ29uc3RydWN0b3IgPSB0eXBlb2YoQmxvYikgIT09ICd1bmRlZmluZWQnICYmIChmdW5jdGlvbiAoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHVybiBCb29sZWFuKG5ldyBCbG9iKCkpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufSgpKTtcclxuXHJcbmxldCBoYXNBcnJheUJ1ZmZlclZpZXdTdXBwb3J0ID0gaGFzQmxvYkNvbnN0cnVjdG9yICYmIHR5cGVvZihVaW50OEFycmF5KSAhPT0gJ3VuZGVmaW5lZCcgJiYgKGZ1bmN0aW9uICgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtuZXcgVWludDhBcnJheSgxMDApXSkuc2l6ZSA9PT0gMTAwO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxufSgpKTtcclxuXHJcbmxldCBoYXNUb0Jsb2JTdXBwb3J0ID0gKHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IEhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZS50b0Jsb2IgOiBmYWxzZSk7XHJcblxyXG5sZXQgaGFzQmxvYlN1cHBvcnQgPSAoaGFzVG9CbG9iU3VwcG9ydCB8fCAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGF0b2IgIT09ICd1bmRlZmluZWQnKSk7XHJcblxyXG5sZXQgaGFzUmVhZGVyU3VwcG9ydCA9ICh0eXBlb2YgRmlsZVJlYWRlciAhPT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIFVSTCAhPT0gJ3VuZGVmaW5lZCcpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hZ2VUb29scyB7XHJcbiAgICBzdGF0aWMgcmVzaXplKGZpbGUsIG1heERpbWVuc2lvbnMsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBtYXhEaW1lbnNpb25zID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrID0gbWF4RGltZW5zaW9ucztcclxuICAgICAgICAgICAgbWF4RGltZW5zaW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIHdpZHRoOiA2NDAsXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDQ4MFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1heFdpZHRoICA9IG1heERpbWVuc2lvbnMud2lkdGg7XHJcbiAgICAgICAgbGV0IG1heEhlaWdodCA9IG1heERpbWVuc2lvbnMuaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAoIUltYWdlVG9vbHMuaXNTdXBwb3J0ZWQoKSB8fCAhZmlsZS50eXBlLm1hdGNoKC9pbWFnZS4qLykpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2soZmlsZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmlsZS50eXBlLm1hdGNoKC9pbWFnZVxcL2dpZi8pKSB7XHJcbiAgICAgICAgICAgIC8vIE5vdCBhdHRlbXB0aW5nLCBjb3VsZCBiZSBhbiBhbmltYXRlZCBnaWZcclxuICAgICAgICAgICAgY2FsbGJhY2soZmlsZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAvLyBUT0RPOiB1c2UgaHR0cHM6Ly9naXRodWIuY29tL2FudGltYXR0ZXIxNS93aGFtbXkgdG8gY29udmVydCBnaWYgdG8gd2VibVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgaW1hZ2Uub25sb2FkID0gKGltZ0V2dCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgd2lkdGggID0gaW1hZ2Uud2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBoZWlnaHQgPSBpbWFnZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgIGxldCBpc1Rvb0xhcmdlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBpZiAod2lkdGggPj0gaGVpZ2h0ICYmIHdpZHRoID4gbWF4RGltZW5zaW9ucy53aWR0aCkge1xyXG4gICAgICAgICAgICAgICAgLy8gd2lkdGggaXMgdGhlIGxhcmdlc3QgZGltZW5zaW9uLCBhbmQgaXQncyB0b28gYmlnLlxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ICo9IG1heERpbWVuc2lvbnMud2lkdGggLyB3aWR0aDtcclxuICAgICAgICAgICAgICAgIHdpZHRoID0gbWF4RGltZW5zaW9ucy53aWR0aDtcclxuICAgICAgICAgICAgICAgIGlzVG9vTGFyZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhlaWdodCA+IG1heERpbWVuc2lvbnMuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBlaXRoZXIgd2lkdGggd2Fzbid0IG92ZXItc2l6ZSBvciBoZWlnaHQgaXMgdGhlIGxhcmdlc3QgZGltZW5zaW9uXHJcbiAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGhlaWdodCBpcyBvdmVyLXNpemVcclxuICAgICAgICAgICAgICAgIHdpZHRoICo9IG1heERpbWVuc2lvbnMuaGVpZ2h0IC8gaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gbWF4RGltZW5zaW9ucy5oZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBpc1Rvb0xhcmdlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCFpc1Rvb0xhcmdlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBlYXJseSBleGl0OyBubyBuZWVkIHRvIHJlc2l6ZVxyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZmlsZSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xyXG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgICAgICAgbGV0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgICAgICAgICBjdHguZHJhd0ltYWdlKGltYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChoYXNUb0Jsb2JTdXBwb3J0KSB7XHJcbiAgICAgICAgICAgICAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soYmxvYiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9LCBmaWxlLnR5cGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgbGV0IGJsb2IgPSBJbWFnZVRvb2xzLl90b0Jsb2IoY2FudmFzLCBmaWxlLnR5cGUpO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soYmxvYiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIEltYWdlVG9vbHMuX2xvYWRJbWFnZShpbWFnZSwgZmlsZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBfdG9CbG9iKGNhbnZhcywgdHlwZSkge1xyXG4gICAgICAgIGxldCBkYXRhVVJJID0gY2FudmFzLnRvRGF0YVVSTCh0eXBlKTtcclxuICAgICAgICBsZXQgZGF0YVVSSVBhcnRzID0gZGF0YVVSSS5zcGxpdCgnLCcpO1xyXG4gICAgICAgIGxldCBieXRlU3RyaW5nO1xyXG4gICAgICAgIGlmIChkYXRhVVJJUGFydHNbMF0uaW5kZXhPZignYmFzZTY0JykgPj0gMCkge1xyXG4gICAgICAgICAgICAvLyBDb252ZXJ0IGJhc2U2NCB0byByYXcgYmluYXJ5IGRhdGEgaGVsZCBpbiBhIHN0cmluZzpcclxuICAgICAgICAgICAgYnl0ZVN0cmluZyA9IGF0b2IoZGF0YVVSSVBhcnRzWzFdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBDb252ZXJ0IGJhc2U2NC9VUkxFbmNvZGVkIGRhdGEgY29tcG9uZW50IHRvIHJhdyBiaW5hcnkgZGF0YTpcclxuICAgICAgICAgICAgYnl0ZVN0cmluZyA9IGRlY29kZVVSSUNvbXBvbmVudChkYXRhVVJJUGFydHNbMV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xyXG4gICAgICAgIGxldCBpbnRBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlU3RyaW5nLmxlbmd0aDsgaSArPSAxKSB7XHJcbiAgICAgICAgICAgIGludEFycmF5W2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1pbWVTdHJpbmcgPSBkYXRhVVJJUGFydHNbMF0uc3BsaXQoJzonKVsxXS5zcGxpdCgnOycpWzBdO1xyXG4gICAgICAgIGxldCBibG9iID0gbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGhhc0Jsb2JDb25zdHJ1Y3Rvcikge1xyXG4gICAgICAgICAgICBibG9iID0gbmV3IEJsb2IoXHJcbiAgICAgICAgICAgICAgICBbaGFzQXJyYXlCdWZmZXJWaWV3U3VwcG9ydCA/IGludEFycmF5IDogYXJyYXlCdWZmZXJdLFxyXG4gICAgICAgICAgICAgICAge3R5cGU6IG1pbWVTdHJpbmd9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGJiID0gbmV3IEJsb2JCdWlsZGVyKCk7XHJcbiAgICAgICAgICAgIGJiLmFwcGVuZChhcnJheUJ1ZmZlcik7XHJcbiAgICAgICAgICAgIGJsb2IgPSBiYi5nZXRCbG9iKG1pbWVTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGJsb2I7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIF9sb2FkSW1hZ2UoaW1hZ2UsIGZpbGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihVUkwpID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGV2dCkge1xyXG4gICAgICAgICAgICAgICAgaW1hZ2Uuc3JjID0gZXZ0LnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2soKTsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjaygpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBzdGF0aWMgaXNTdXBwb3J0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgKHR5cGVvZihIVE1MQ2FudmFzRWxlbWVudCkgIT09ICd1bmRlZmluZWQnKSBcclxuICAgICAgICAgICAgJiYgaGFzQmxvYlN1cHBvcnRcclxuICAgICAgICAgICAgJiYgaGFzUmVhZGVyU3VwcG9ydFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiLyoqXHJcbiogVGhlIEh5cGVydHkgUmVzb3VyY2UgRGF0YSBNb2RlbCBpcyB1c2VkIHRvIG1vZGVsIHJlc291Y2VzIGhhbmRsZWQgYnkgSHlwZXJ0aWVzIGFuZCBEYXRhIE9iamVjdHMgaW5jbHVkaW5nIGNoYXQgbWVzc2FnZXMsIGZpbGVzLCByZWFsIHRpbWUgaHVtYW4gYXVkaW8gYW5kIHZpZGVvLi5cclxuKlxyXG4qL1xyXG5cclxuLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignRmlsZUh5cGVydHlSZXNvdXJjZScpO1xyXG5cclxuaW1wb3J0IEh5cGVydHlSZXNvdXJjZSBmcm9tICcuL0h5cGVydHlSZXNvdXJjZSc7XHJcbmltcG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcclxuaW1wb3J0IEltYWdlVG9vbHMgZnJvbSAnLi4vdXRpbHMvSW1hZ2VUb29scy5qcyc7XHJcblxyXG5cclxuY2xhc3MgRmlsZUh5cGVydHlSZXNvdXJjZSBleHRlbmRzIEh5cGVydHlSZXNvdXJjZSB7XHJcblxyXG4gIC8qKlxyXG4gICogRmlsZUh5cGVydHlSZXNvdXJjZSBjb25zdHJ1Y3RvclxyXG4gICpcclxuICAqIEBwYXJhbSAge1VSTH0gb3duZXIgSHlwZXJ0eVVSTCBvZiB0aGUgSHlwZXJ0eSBoYW5kbGluZyB0aGlzIHJlc291cmNlXHJcbiAgKiBAcGFyYW0gIHtVUkx9IHJ1bnRpbWUgUnVudGltZSBVUkwgd2hlcmUgdGhpcyByZXNvdXJjZSBpcyBob3N0ZWRcclxuICAqIEBwYXJhbSAge0J1c30gYnVzIHNhbmRib3ggbWVzc2FnZSBidXNcclxuICAqIEBwYXJhbSAge0RhdGFPYmplY3R9IHBhcmVudCBQYXJlbnQgRGF0YSBPYmplY3Qgd2hlcmUgdGhlIEh5cGVydHlSZXNvdXJjZSBpcyBoYW5kbGVkIGFzIGEgY2hpbGRcclxuICAqIEBwYXJhbSAge0ZpbGV9IGZpbGUgZmlsZSB0byBiZSBlbmNvZGVkIGFzIEh5cGVydHlSZXNvdXJjZVxyXG4gICogQHBhcmFtICB7Qm9vbGVhbn0gaXNSZXBvcnRlciBpbmRpY2F0ZXMgaWYgcGFyZW50IGlzIFJlcG9ydGVyIG9yIGFuIE9ic2VydmVyXHJcbiAgKiBAcGFyYW0gIHtBcnJheX0gaW5wdXQgb3B0aW9uYWwgaW5wdXQgcGFyYW1ldGVyc1xyXG4gICovXHJcblxyXG4gIGNvbnN0cnVjdG9yKGlzU2VuZGVyLCBpbnB1dCkge1xyXG5cclxuICAgIHN1cGVyKGlzU2VuZGVyLCBpbnB1dCk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5tZXRhZGF0YS5yZXNvdXJjZVR5cGUgPSAnZmlsZSc7XHJcblxyXG4gIH1cclxuXHJcbiAgaW5pdChmaWxlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmICghZmlsZSkgdGhyb3cgbmV3IEVycm9yKCdbRmlsZUh5cGVydHlSZXNvdXJjZS5jb25zdHJ1Y3Rvcl0gbWlzc2luZyBtYW5kYXRvcnkgKmZpbGUqIGlucHV0ICcpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIF90aGlzLl9tZXRhZGF0YS5uYW1lID0gZmlsZS5uYW1lO1xyXG4gICAgICBfdGhpcy5fbWV0YWRhdGEubGFzdE1vZGlmaWVkID0gZmlsZS5sYXN0TW9kaWZpZWQ7XHJcbiAgICAgIF90aGlzLl9tZXRhZGF0YS5zaXplID0gZmlsZS5zaXplO1xyXG4gICAgICBfdGhpcy5fbWV0YWRhdGEubWltZXR5cGUgPSBmaWxlLnR5cGU7XHJcblxyXG4gICAgICBsb2cubG9nKCdbRmlsZUh5cGVydHlSZXNvdXJjZS5pbml0XSBmaWxlOiAnLCBmaWxlKTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5faXNTZW5kZXIpIHtcclxuXHJcbiAgICAgICAgbGV0IG1pbWV0eXBlID0gZmlsZS50eXBlLnNwbGl0KCcvJylbMF07XHJcblxyXG4gICAgICAgIHN3aXRjaCAobWltZXR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ2ltYWdlJyA6XHJcbiAgICAgICAgICAgIF90aGlzLl9nZXRJbWFnZVByZXZpZXcoZmlsZSkudGhlbigocHJldmlldyk9PntcclxuICAgICAgICAgICAgICBfdGhpcy5fbWV0YWRhdGEucHJldmlldyA9IHByZXZpZXc7XHJcbiAgICAgICAgICAgICAgX3RoaXMuX2NvbnRlbnQgPSBmaWxlO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdCA6XHJcbiAgICAgICAgICAgIF90aGlzLl9jb250ZW50ID0gZmlsZTtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIHRvbyBiaWcgbGV0cyBzdG9yZSBhcyBGaWxlIGFuZCBhc0FycmF5IEJ1ZmZlclxyXG5cclxuICAgICAgLy8gIGlmIChmaWxlLnNpemUgPiBfdGhpcy5hcnJheWJ1ZmZlclNpemVMaW1pdCkge1xyXG4gICAgICAvKiAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcbiAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24odGhlRmlsZSkge1xyXG5cclxuICAgICAgICAgICAgbG9nLmxvZygnW0ZpbGVIeXBlcnR5UmVzb3VyY2UuaW5pdF0gZmlsZSBsb2FkZWQgJywgdGhlRmlsZSk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5fY29udGVudCA9IHRoZUZpbGUudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XHJcblxyXG4gICAgICAgIH0qL1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICBfdGhpcy5fY29udGVudCA9IGZpbGUuY29udGVudDtcclxuICAgICAgaWYgKGZpbGUucHJldmlldykgX3RoaXMuX21ldGFkYXRhLnByZXZpZXcgPSBmaWxlLnByZXZpZXc7XHJcbiAgICAgIHJlc29sdmUoKTtcclxuICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuIF9nZXRJbWFnZVByZXZpZXcoaW1hZ2Upe1xyXG4gICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntcclxuXHJcbiAgIEltYWdlVG9vbHMucmVzaXplKGltYWdlLCB7XHJcbiAgICAgICAgd2lkdGg6IDEwMCwgLy8gbWF4aW11bSB3aWR0aFxyXG4gICAgICAgIGhlaWdodDogMTAwIC8vIG1heGltdW0gaGVpZ2h0XHJcbiAgICB9LCBmdW5jdGlvbihibG9iLCBkaWRJdFJlc2l6ZSkge1xyXG4gICAgICAgIC8vIGRpZEl0UmVzaXplIHdpbGwgYmUgdHJ1ZSBpZiBpdCBtYW5hZ2VkIHRvIHJlc2l6ZSBpdCwgb3RoZXJ3aXNlIGZhbHNlIChhbmQgd2lsbCByZXR1cm4gdGhlIG9yaWdpbmFsIGZpbGUgYXMgJ2Jsb2InKVxyXG4gICAgICAgIGlmIChkaWRJdFJlc2l6ZSkge1xyXG4gICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XHJcblxyXG4gICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKHRoZUltYWdlKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUodGhlSW1hZ2UudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsb2cud2FybignW0ZpbGVIeXBlcnR5UmVzb3VyY2UuX2dldEltYWdlUHJldmlld10gdW5hYmxlIHRvIGNyZWF0ZSBpbWFnZSBwcmV2aWV3IGZyb20gb3JpZ2luYWwgaW1hZ2UgJyk7XHJcbiAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9KTtcclxuIH1cclxuXHJcblxyXG5cclxuICBnZXQgbmFtZSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX21ldGFkYXRhLm5hbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgcHJldmlldygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX21ldGFkYXRhLnByZXZpZXc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNoYXJlIGZpbGUgYXMgYSBkYXRhIG9iamVjdCBjaGlsZCBvZiBhIGRhdGEgb2JqZWN0IHBhcmVudFxyXG4gICpcclxuICAqIEBwYXJhbSAge3N0cmluZ30gY2hpbGRyZW4gRGF0YSBPYmplY3QgUGFyZW50IGNoaWxkcmVuIG5hbWUgd2hlcmUgdGhlIGZpbGUgaXMgc2hhcmVkXHJcbiAgKi9cclxuXHJcbi8qICBzaGFyZShjaGlsZHJlbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIC8vdG8gYmUgaW1wcm92ZWQgYW5kIGFkYXB0ZWRcclxuXHJcbiAgICAgIGlmICghX3RoaXMuX2lzU2VuZGVyKSByZXR1cm4gcmVqZWN0KCdbRmlsZUh5cGVydHlSZXNvdXJjZS5zaGFyZV0gT2JzZXJ2ZXJzIGNhbiBub3Qgc2hhcmUgZmlsZXMnKTtcclxuXHJcbiAgICAgIGxldCBmaWxlMnNoYXJlID0gX3RoaXMuX21ldGFkYXRhO1xyXG4gICAgICBmaWxlMnNoYXJlLnR5cGUgPSBfdGhpcy5fdHlwZTtcclxuXHJcbiAgICAgIF90aGlzLl9wYXJlbnQuYWRkQ2hpbGQoY2hpbGRyZW4sIGZpbGUyc2hhcmUpLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdENoaWxkKSB7XHJcbiAgICAgICAgbG9nLmxvZygnW0ZpbGVIeXBlcnR5UmVzb3VyY2Uuc2hhcmVdIG9iamVjdCBjaGlsZDogJywgZGF0YU9iamVjdENoaWxkKTtcclxuXHJcbiAgICAgICAgbGV0IHNoYXJlZEZpbGUgPSBkYXRhT2JqZWN0Q2hpbGQuZGF0YTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZShzaGFyZWRGaWxlKTtcclxuXHJcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xyXG4gICAgICAgIGxvZy5lcnJvcignUmVhc29uOicsIHJlYXNvbik7XHJcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9Ki9cclxuXHJcbiAgLyoqXHJcbiAgKiBSZXR1cm5zIGZpbGUgY29udGVudCBvcHRpbWlzZWQgdG8gYmUgZGlzcGxheWVkIGluIGEgbWVzc2FnZSBsaW5lXHJcbiAgKlxyXG4gICogQHBhcmFtICB7c3RyaW5nfSBjaGlsZHJlbiBEYXRhIE9iamVjdCBQYXJlbnQgY2hpbGRyZW4gbmFtZSB3aGVyZSB0aGUgZmlsZSBpcyBzaGFyZWRcclxuICAqL1xyXG5cclxuICB0b01lc3NhZ2UoKSB7XHJcbiAgICAvL1RPRE86IHRvIGJlIGltcGxlbWVudGVkLiBJdCBzaG91bGQgcmV0dXJuIEhUTUwgd2l0aCBpbWcgYXR0cmlidXRlIGFzIGEgdGh1bWJuYWlsIHBsdXMgdGhlIG5hbWUuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZpbGVIeXBlcnR5UmVzb3VyY2U7XHJcbiIsIi8qKlxyXG4qIFRoZSBIeXBlcnR5IFJlc291cmNlIERhdGEgTW9kZWwgaXMgdXNlZCB0byBtb2RlbCByZXNvdWNlcyBoYW5kbGVkIGJ5IEh5cGVydGllcyBhbmQgRGF0YSBPYmplY3RzIGluY2x1ZGluZyBjaGF0IG1lc3NhZ2VzLCBmaWxlcywgcmVhbCB0aW1lIGh1bWFuIGF1ZGlvIGFuZCB2aWRlby4uXHJcbipcclxuKi9cclxuXHJcbmltcG9ydCBGaWxlSHlwZXJ0eVJlc291cmNlIGZyb20gJy4vRmlsZUh5cGVydHlSZXNvdXJjZSc7XHJcblxyXG5jbGFzcyBIeXBlcnR5UmVzb3VyY2VGYWN0b3J5IHtcclxuXHJcbiAgLyoqXHJcbiAgKiBIeXBlcnR5UmVzb3VyY2VGYWN0b3J5IGNvbnN0cnVjdG9yXHJcbiAgKlxyXG4gICovXHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG5cclxuICB9XHJcblxyXG4gIGNyZWF0ZUh5cGVydHlSZXNvdXJjZShpc1NlbmRlciwgdHlwZSwgbWV0YWRhdGEpIHtcclxuICAgIGxldCBuZXdIeXBlcnR5UmVzb3VyY2U7XHJcblxyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2ZpbGUnOlxyXG4gICAgICAgIG5ld0h5cGVydHlSZXNvdXJjZSA9IG5ldyBGaWxlSHlwZXJ0eVJlc291cmNlKGlzU2VuZGVyLCBtZXRhZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSHlwZXJ0eVJlc291cmNlRmFjdG9yeS5jcmVhdGVIeXBlcnR5UmVzb3VyY2VdIG5vdCBzdXBwb3J0ZWQgdHlwZTogJywgdHlwZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybihuZXdIeXBlcnR5UmVzb3VyY2UpO1xyXG5cclxuICB9XHJcblxyXG4gIGNyZWF0ZUh5cGVydHlSZXNvdXJjZVdpdGhDb250ZW50KGlzU2VuZGVyLCB0eXBlLCBjb250ZW50LCBtZXRhZGF0YSkge1xyXG4gICAgbGV0IG5ld0h5cGVydHlSZXNvdXJjZTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSAnZmlsZSc6XHJcbiAgICAgICAgbmV3SHlwZXJ0eVJlc291cmNlID0gbmV3IEZpbGVIeXBlcnR5UmVzb3VyY2UoaXNTZW5kZXIsIG1ldGFkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZWplY3QoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgbmV3SHlwZXJ0eVJlc291cmNlLmluaXQoY29udGVudCkudGhlbigoKT0+e1xyXG4gICAgICAgIHJldHVybiBuZXdIeXBlcnR5UmVzb3VyY2Uuc2F2ZSgpOy8vIHNraXAgc2F2ZT9cclxuICAgICAgfSkudGhlbigoKT0+e1xyXG4gICAgICAgIHJlc29sdmUobmV3SHlwZXJ0eVJlc291cmNlKTtcclxuICAgICAgfSk7XHJcblxyXG4gIH0pO1xyXG5cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEh5cGVydHlSZXNvdXJjZUZhY3Rvcnk7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0RhdGFPYmplY3QnKTtcclxuXHJcbmltcG9ydCBTeW5jT2JqZWN0LCB7IENoYW5nZVR5cGUsIE9iamVjdFR5cGUgfSBmcm9tICcuL1Byb3h5T2JqZWN0JztcclxuaW1wb3J0IERhdGFPYmplY3RDaGlsZCBmcm9tICcuL0RhdGFPYmplY3RDaGlsZCc7XHJcbmltcG9ydCBIZWFydEJlYXQgZnJvbSAnLi9IZWFydEJlYXQnO1xyXG5pbXBvcnQgeyBkZWVwQ2xvbmUsIGRpdmlkZVVSTCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcclxuaW1wb3J0IEh5cGVydHlSZXNvdXJjZUZhY3RvcnkgZnJvbSAnLi4vaHlwZXJ0eS1yZXNvdXJjZS9IeXBlcnR5UmVzb3VyY2VGYWN0b3J5LmpzJztcclxuXHJcbi8qKlxyXG4gKiBNYWluIGV4dGVuc2lvbiBjbGFzcyBmb3Igb2JzZXJ2ZXJzIGFuZCByZXBvcnRlcnMsIHdpdGggY29tbW9uIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMuXHJcbiAqIENoaWxkcmVuIG1hbmFnZW1lbnQgaXMgY29tbW9uIGZvciBvYnNlcnZlcnMgYW5kIHJlcG9ydGVycy5cclxuICovXHJcbmNsYXNzIERhdGFPYmplY3Qge1xyXG4gIC8qIHByaXZhdGVcclxuICBfdmVyc2lvbjogbnVtYmVyXHJcblxyXG4gIF9vd25lcjogSHlwZXJ0eVVSTFxyXG4gIF91cmw6IE9iamVjdFVSTFxyXG4gIF9zY2hlbWE6IFNjaGVtYVxyXG4gIF9idXM6IE1pbmlCdXNcclxuICBfc3RhdHVzOiBvbiB8IHBhdXNlZFxyXG4gIF9zeW5jT2JqOiBTeW5jRGF0YVxyXG5cclxuICBfY2hpbGRyZW46IHsgaWQ6IERhdGFPYmplY3RDaGlsZCB9XHJcbiAgX2NoaWxkcmVuTGlzdGVuZXI6IFtNc2dMaXN0ZW5lcl1cclxuXHJcbiAgLS0tLWV2ZW50IGhhbmRsZXJzLS0tLVxyXG4gIF9vbkFkZENoaWxkSGFuZGxlcjogKGV2ZW50KSA9PiB2b2lkXHJcbiAgKi9cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqIFNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSBieSBIeXBlcnRpZXMuIEl0J3MgY2FsbGVkIGJ5IHRoZSBTeW5jaGVyIGNyZWF0ZSBvciBzdWJzY3JpYmUgbWV0aG9kJ3NcclxuICAgKi9cclxuXHJcbiAgY29uc3RydWN0b3IoaW5wdXQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgZnVuY3Rpb24gdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKHBhcikge1xyXG4gICAgICB0aHJvdyAnW0RhdGFPYmplY3RdICcgKyBwYXIgKyAnIG1hbmRhdG9yeSBwYXJhbWV0ZXIgaXMgbWlzc2luZyc7XHJcbiAgICB9XHJcblxyXG4gICAgaW5wdXQuc3luY2hlciA/IF90aGlzLl9zeW5jaGVyID0gaW5wdXQuc3luY2hlciA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcignc3luY2hlcicpO1xyXG4gICAgaW5wdXQudXJsID8gX3RoaXMuX3VybCA9IGlucHV0LnVybCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcigndXJsJyk7XHJcbiAgICBpbnB1dC5jcmVhdGVkID8gX3RoaXMuX2NyZWF0ZWQgPSBpbnB1dC5jcmVhdGVkIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdjcmVhdGVkJyk7XHJcbiAgICBpbnB1dC5yZXBvcnRlciA/IF90aGlzLl9yZXBvcnRlciA9IGlucHV0LnJlcG9ydGVyIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdyZXBvcnRlcicpO1xyXG4gICAgaW5wdXQucnVudGltZSA/IF90aGlzLl9ydW50aW1lID0gaW5wdXQucnVudGltZSA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcigncnVudGltZScpO1xyXG4gICAgaW5wdXQuc2NoZW1hID8gX3RoaXMuX3NjaGVtYSA9IGlucHV0LnNjaGVtYSA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcignc2NoZW1hJyk7XHJcbiAgICBpbnB1dC5uYW1lID8gX3RoaXMuX25hbWUgPSBpbnB1dC5uYW1lIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCduYW1lJyk7XHJcblxyXG5cclxuICAgIF90aGlzLl9zdGF0dXMgPSBpbnB1dC5zdGF0dXM7XHJcblxyXG4gICAgaWYgKGlucHV0LmRhdGEpIHtcclxuICAgICAgX3RoaXMuX3N5bmNPYmogPSBuZXcgU3luY09iamVjdChpbnB1dC5kYXRhKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIF90aGlzLl9zeW5jT2JqID0gbmV3IFN5bmNPYmplY3Qoe30pO1xyXG4gICAgfVxyXG4gICAgX3RoaXMuX2NoaWxkcmVucyA9IGlucHV0LmNoaWxkcmVucztcclxuXHJcbiAgICAvL1RPRE86IEZvciBGdXJ0aGVyIFN0dWR5XHJcbiAgICBfdGhpcy5fbXV0dWFsID0gaW5wdXQubXV0dWFsO1xyXG5cclxuICAgIF90aGlzLl92ZXJzaW9uID0gMDtcclxuICAgIF90aGlzLl9jaGlsZElkID0gMTtcclxuICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVyOyAvL2J1cyBsaXN0ZW5lciBmb3IgY2hpbGRyZW5cclxuICAgIF90aGlzLl9vbkFkZENoaWxkcmVuSGFuZGxlcjsgLy9IeXBlcnR5IHNpZGUgaGFuZGxlcnMgdG8gcHJvY2VzcyBjaGlsZCBvYmplY3RzIGNyZWF0ZWQgYnkgcmVtb3RlIEh5cGVydGllc1xyXG5cclxuICAgIF90aGlzLl9yZXN1bWVkID0gaW5wdXQucmVzdW1lO1xyXG5cclxuICAgIGlmIChpbnB1dC5yZXN1bWUpIHsgX3RoaXMuX3ZlcnNpb24gPSBpbnB1dC52ZXJzaW9uOyB9XHJcblxyXG4gICAgX3RoaXMuX293bmVyID0gaW5wdXQuc3luY2hlci5fb3duZXI7XHJcbiAgICBfdGhpcy5fYnVzID0gaW5wdXQuc3luY2hlci5fYnVzO1xyXG5cclxuICAgIGlmIChpbnB1dC5kZXNjcmlwdGlvbikgX3RoaXMuX2Rlc2NyaXB0aW9uID0gaW5wdXQuZGVzY3JpcHRpb247XHJcbiAgICBpZiAoaW5wdXQudGFncykgX3RoaXMuX3RhZ3MgPSBpbnB1dC50YWdzO1xyXG4gICAgaWYgKGlucHV0LnJlc291cmNlcykgX3RoaXMuX3Jlc291cmNlcyA9IGlucHV0LnJlc291cmNlcztcclxuICAgIGlmIChpbnB1dC5vYnNlcnZlclN0b3JhZ2UpIF90aGlzLl9vYnNlcnZlclN0b3JhZ2UgPSBpbnB1dC5vYnNlcnZlclN0b3JhZ2U7XHJcbiAgICBpZiAoaW5wdXQucHVibGljT2JzZXJ2YXRpb24pIF90aGlzLl9wdWJsaWNPYnNlcnZhdGlvbiA9IGlucHV0LnB1YmxpY09ic2VydmF0aW9uO1xyXG5cclxuICAgIF90aGlzLl9tZXRhZGF0YSA9IE9iamVjdC5hc3NpZ24oaW5wdXQpO1xyXG5cclxuICAgIC8vICAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdF0gbXV0dWFsICcsIF90aGlzLl9tZXRhZGF0YS5tdXR1YWwpO1xyXG5cclxuICAgIGlmICghaW5wdXQuaGFzT3duUHJvcGVydHkoJ3Jlc3VtZScpIHx8IChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgncmVzdW1lJykgJiYgIWlucHV0LnJlc3VtZSkpIHtcclxuICAgICAgX3RoaXMuX21ldGFkYXRhLmxhc3RNb2RpZmllZCA9IF90aGlzLl9tZXRhZGF0YS5jcmVhdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZSBfdGhpcy5fbWV0YWRhdGEuZGF0YTtcclxuICAgIGRlbGV0ZSBfdGhpcy5fbWV0YWRhdGEuc3luY2hlcjtcclxuICAgIGRlbGV0ZSBfdGhpcy5fbWV0YWRhdGEuYXV0aG9yaXNlO1xyXG5cclxuICAgIF90aGlzLl9oeXBlcnR5UmVzb3VyY2VGYWN0b3J5ID0gbmV3IEh5cGVydHlSZXNvdXJjZUZhY3RvcnkoKTtcclxuICAgIF90aGlzLl9jaGlsZHJlbk9iamVjdHMgPSB7fTtcclxuICAgIF90aGlzLl9zaGFyZWRDaGlsZHMgPSBbXTsgLy9jaGlsZE9iamVjdHMgdGhhdCB3ZXJlIG5vdCBzZW50IHlldCB0byBSZXBvcnRlcnNcclxuXHJcbiAgICBpZiAoaW5wdXQuYmFja3VwICYmIF90aGlzLl9jaGlsZHJlbnMpIHtcclxuICAgICAgbGV0IGxhc3RIZWFydGJlYXQgPSAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ2NoaWxkcmVuT2JqZWN0cycpICYmIGlucHV0LmNoaWxkcmVuT2JqZWN0cy5oYXNPd25Qcm9wZXJ0eSgnaGVhcnRiZWF0JykpXHJcbiAgICAgICAgPyBpbnB1dC5jaGlsZHJlbk9iamVjdHMuaGVhcnRiZWF0IDogMDtcclxuICAgICAgX3RoaXMuX2hlYXJ0QmVhdCA9IG5ldyBIZWFydEJlYXQoX3RoaXMuX2J1cywgX3RoaXMuX293bmVyLCBfdGhpcy5fc3luY2hlci5fcnVudGltZVVybCwgdGhpcywgMTUsIGxhc3RIZWFydGJlYXQpO1xyXG4gICAgICBpZiAoX3RoaXMuX3Jlc3VtZWQpIF90aGlzLl9oZWFydEJlYXQuc3RhcnQodHJ1ZSwgX3RoaXMubWV0YWRhdGEuaXNSZXBvcnRlcik7XHJcbiAgICAgIGVsc2UgX3RoaXMuX2hlYXJ0QmVhdC5zdGFydChmYWxzZSwgX3RoaXMubWV0YWRhdGEuaXNSZXBvcnRlcik7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX2dldExhc3RDaGlsZElkKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgY2hpbGRJZEludCA9IDA7XHJcbiAgICBsZXQgY2hpbGRJZFN0cmluZyA9IF90aGlzLl9vd25lciArICcjJyArIGNoaWxkSWRJbnQ7XHJcblxyXG5cclxuICAgIE9iamVjdC5rZXlzKF90aGlzLl9jaGlsZHJlbnMpLmZpbHRlcigoa2V5KSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5fY2hpbGRyZW5zW2tleV0uY2hpbGRJZCA+IGNoaWxkSWRTdHJpbmcpIHtcclxuICAgICAgICBjaGlsZElkU3RyaW5nID0gX3RoaXMuX2NoaWxkcmVuc1trZXldLmNoaWxkSWQ7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiBjaGlsZElkSW50ID0gTnVtYmVyKGNoaWxkSWRTdHJpbmcuc3BsaXQoJyMnKVsxXSk7XHJcbiAgfVxyXG5cclxuICBfYWxsb2NhdGVMaXN0ZW5lcnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBjaGlsZEJhc2VVUkwgPSBfdGhpcy5fdXJsICsgJy9jaGlsZHJlbi8nO1xyXG4gICAgbG9nLmxvZygnW0RhdGEgT2JqZWN0IC0gQWxsb2NhdGVMaXN0ZW5lcnNdIC0gJywgX3RoaXMuX2NoaWxkcmVucyk7XHJcbiAgICBpZiAoX3RoaXMuX2NoaWxkcmVucykge1xyXG4gICAgICAvLyAgICAgIF90aGlzLl9jaGlsZHJlbnMuZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgbGV0IGNoaWxkVVJMID0gY2hpbGRCYXNlVVJMO1xyXG4gICAgICBsZXQgbGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKGNoaWxkVVJMLCAobXNnKSA9PiB7XHJcbiAgICAgICAgLy9pZ25vcmUgbXNnIHNlbnQgYnkgaGltc2VsZlxyXG4gICAgICAgIGlmIChtc2cuZnJvbSAhPT0gdGhpcy5fb3duZXIpIHtcclxuICAgICAgICAgIGxvZy5sb2coJ0RhdGFPYmplY3QtQ2hpbGRyZW4tUkNWOiAnLCBtc2cpO1xyXG4gICAgICAgICAgc3dpdGNoIChtc2cudHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlICdjcmVhdGUnOiBfdGhpcy5fb25DaGlsZENyZWF0ZShtc2cpOyBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnZGVsZXRlJzogbG9nLmxvZyhtc2cpOyBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDogX3RoaXMuX2NoYW5nZUNoaWxkcmVuKG1zZyk7IGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVyID0gbGlzdGVuZXI7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX3JlbGVhc2VMaXN0ZW5lcnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmIChfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcikge1xyXG4gICAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lci5yZW1vdmUoKTtcclxuXHJcbiAgICAgIE9iamVjdC5rZXlzKF90aGlzLl9jaGlsZHJlbk9iamVjdHMpLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgLyogICAgICBpZiAoY2hpbGRyZW4gPT09ICdyZXNvdXJjZXMnKSB7XHJcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuXSkuZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlbl1bY2hpbGRdLl9yZWxlYXNlTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9IGVsc2UgeyovXHJcbiAgICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZF0uX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuICAgICAgICAvLyAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN5bmMgRGF0YSBPYmplY3QgT2JzZXJ2ZXIgd2l0aCBsYXN0IHZlcnNpb24gb2YgRGF0YSBPYmplY3QgUmVwb3J0ZXIuIFVzZWZ1bCBmb3IgUmVzdW1lc1xyXG4gICAqL1xyXG4gIHN5bmMoKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdC5zeW5jXSBzeW5jaHJvbmlzaW5nICcpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgY3JpdGVyaWEgPSB7fTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm1ldGFkYXRhLmJhY2t1cFJldmlzaW9uKSBjcml0ZXJpYS5iYWNrdXBSZXZpc2lvbiA9IHRoaXMubWV0YWRhdGEuYmFja3VwUmV2aXNpb247XHJcblxyXG4gICAgICBfdGhpcy5fc3luY2hlci5yZWFkKF90aGlzLl9tZXRhZGF0YS51cmwsIGNyaXRlcmlhKS50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdC5zeW5jXSB2YWx1ZSB0byBzeW5jOiAnLCB2YWx1ZSk7XHJcblxyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oX3RoaXMuZGF0YSwgZGVlcENsb25lKHZhbHVlLmRhdGEpKTtcclxuXHJcbiAgICAgICAgX3RoaXMuX3ZlcnNpb24gPSB2YWx1ZS52ZXJzaW9uO1xyXG5cclxuICAgICAgICBfdGhpcy5fbWV0YWRhdGEubGFzdE1vZGlmaWVkID0gdmFsdWUubGFzdE1vZGlmaWVkO1xyXG5cclxuICAgICAgICAvL1RPRE86IGNoZWNrIGZpcnN0IGlmIHRoZXJlIGFyZSBuZXcgY2hpbGRyZW5PYmplY3RzIHRvIGF2b2lkIG92ZXJoZWFkXHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5jaGlsZHJlbk9iamVjdHMpIHtcclxuICAgICAgICAgIF90aGlzLnJlc3VtZUNoaWxkcmVucyh2YWx1ZS5jaGlsZHJlbk9iamVjdHMpO1xyXG4gICAgICAgICAgX3RoaXMuX3N0b3JlQ2hpbGRyZW5zKCk7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSByZXNvbHZlKHRydWUpO1xyXG5cclxuXHJcbiAgICAgICAgLyppZiAodmFsdWUudmVyc2lvbiAhPSBfdGhpcy5fdmVyc2lvbikge1xyXG4gICAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0LnN5bmNdIHVwZGF0aW5nIGV4aXN0aW5nIGRhdGE6ICcsIF90aGlzLmRhdGEpO1xyXG5cclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oX3RoaXMuZGF0YSB8fCB7fSwgZGVlcENsb25lKHZhbHVlLmRhdGEpKTtcclxuXHJcbiAgICAgICAgICBfdGhpcy5fbWV0YWRhdGEgPSBkZWVwQ2xvbmUodmFsdWUpO1xyXG5cclxuICAgICAgICAgIGRlbGV0ZSBfdGhpcy5fbWV0YWRhdGEuZGF0YTtcclxuXHJcbiAgICAgICAgICBfdGhpcy5fdmVyc2lvbiA9IHZhbHVlLnZlcnNpb247XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3Quc3luY10gZXhpc3RpbmcgZGF0YSBpcyB1cGRhdGVkOiAnLCB2YWx1ZSk7XHJcbiAgICAgICAgfSovXHJcblxyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0LnN5bmNdIHN5bmMgZmFpbGVkOiAnLCByZWFzb24pO1xyXG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcblxyXG4gIH1cclxuICAvKipcclxuICAgKlxyXG4gICAqL1xyXG4gIHJlc3VtZUNoaWxkcmVucyhjaGlsZHJlbnMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGNoaWxkSWRTdHJpbmcgPSB0aGlzLl9vd25lci5zcGxpdCgnLycpWzNdICsgJyMnICsgdGhpcy5fY2hpbGRJZDtcclxuXHJcbiAgICAvL3NldHVwIGNoaWxkcmVucyBkYXRhIGZyb20gc3Vic2NyaXB0aW9uXHJcbiAgICAvLyAgICBPYmplY3Qua2V5cyhjaGlsZHJlbnMpLmZvckVhY2goKGNoaWxkcmVuUmVzb3VyY2UpID0+IHtcclxuICAgIC8vICAgICAgbGV0IGNoaWxkcmVuID0gY2hpbGRyZW5zW2NoaWxkcmVuUmVzb3VyY2VdO1xyXG4gICAgbGV0IGNoaWxkcmVuID0gY2hpbGRyZW5zO1xyXG5cclxuICAgIC8vX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlblJlc291cmNlXSA9IHt9O1xyXG4gICAgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmZvckVhY2goKGNoaWxkSWQpID0+IHtcclxuICAgICAgbGV0IG5ld0NoaWxkID0gZmFsc2U7XHJcblxyXG4vKiAgICAgICAgaWYgKCFfdGhpcy5fY2hpbGRyZW5PYmplY3RzLmhhc093blByb3BlcnR5KGNoaWxkcmVuUmVzb3VyY2UpKVxyXG4gICAgICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlblJlc291cmNlXSA9IHt9OyovXHJcblxyXG4gICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIHRoZSBsYXN0IGhlYXJ0YmVhdFxyXG5cclxuICAgICAgICBpZiAoY2hpbGRJZCA9PT0gJ2hlYXJ0YmVhdCcpIHtcclxuLy8gICAgICAgICAgX3RoaXMuX2hlYXJ0QmVhdC5vbk5ld0hlYXJ0YmVhdChjaGlsZHJlbltjaGlsZElkXS52YWx1ZSk7XHJcbi8vICAgICAgICAgIF90aGlzLl9oZWFydEJlYXQuc3RhcnQodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNoaWxkcmVuW2NoaWxkSWRdLmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmIGNoaWxkcmVuW2NoaWxkSWRdLnZhbHVlLnJlc291cmNlVHlwZSAmJiAhX3RoaXMuX2NoaWxkcmVuT2JqZWN0cy5oYXNPd25Qcm9wZXJ0eShjaGlsZElkKSkge1xyXG4gICAgICAgIF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRJZF0gPSBfdGhpcy5fcmVzdW1lSHlwZXJ0eVJlc291cmNlKGNoaWxkcmVuW2NoaWxkSWRdKTtcclxuICAgICAgICBuZXdDaGlsZCA9IHRydWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoIV90aGlzLl9jaGlsZHJlbk9iamVjdHMuaGFzT3duUHJvcGVydHkoY2hpbGRJZCkpIHtcclxuXHJcbiAgICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZElkXSA9IF90aGlzLl9yZXN1bWVDaGlsZChjaGlsZHJlbltjaGlsZElkXSk7XHJcbiAgICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3QucmVzdW1lQ2hpbGRyZW5zXSBuZXcgRGF0YU9iamVjdENoaWxkOiAnLCBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkSWRdKTtcclxuICAgICAgICBuZXdDaGlsZCA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuZXdDaGlsZCAmJiBjaGlsZElkID4gY2hpbGRJZFN0cmluZykge1xyXG4gICAgICAgIGNoaWxkSWRTdHJpbmcgPSBjaGlsZElkO1xyXG4gICAgICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0UmVwb3J0ZXIucmVzdW1lQ2hpbGRyZW5zXSAtIHJlc3VtaW5nOiAnLCB0aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRJZF0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgICAvLyAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9jaGlsZElkID0gTnVtYmVyKGNoaWxkSWRTdHJpbmcuc3BsaXQoJyMnKVsxXSk7XHJcblxyXG4gIH1cclxuXHJcbiAgX3Jlc3VtZUNoaWxkKGlucHV0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGNoaWxkSW5wdXQgPSBpbnB1dC52YWx1ZTtcclxuICAgIGNoaWxkSW5wdXQucGFyZW50T2JqZWN0ID0gX3RoaXM7XHJcbiAgICBjaGlsZElucHV0LnBhcmVudCA9IF90aGlzLl91cmw7XHJcblxyXG4gICAgbGV0IGNoaWxkID0gbmV3IERhdGFPYmplY3RDaGlsZChjaGlsZElucHV0KTtcclxuXHJcbiAgICBjaGlsZC5pZGVudGl0eSA9IGlucHV0LmlkZW50aXR5O1xyXG5cclxuICAgIGxldCBldmVudCA9IHtcclxuICAgICAgdHlwZTogJ2NyZWF0ZScsXHJcbiAgICAgIGZyb206IGNoaWxkLnJlcG9ydGVyLFxyXG4gICAgICB1cmw6IGNoaWxkLnBhcmVudCxcclxuICAgICAgdmFsdWU6IGNoaWxkLmRhdGEsXHJcbiAgICAgIGNoaWxkSWQ6IGNoaWxkLnVybCxcclxuICAgICAgaWRlbnRpdHk6IGNoaWxkLmlkZW50aXR5LFxyXG4gICAgICBjaGlsZDogY2hpbGRcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGNoaWxkLnJlc291cmNlVHlwZSkge1xyXG4gICAgICBldmVudC5yZXNvdXJjZSA9IGNoaWxkO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBpZiAoX3RoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyKSBfdGhpcy5fb25BZGRDaGlsZHJlbkhhbmRsZXIoZXZlbnQpO1xyXG5cclxuICAgIHJldHVybiBjaGlsZDtcclxuXHJcbiAgfVxyXG5cclxuICBfcmVzdW1lSHlwZXJ0eVJlc291cmNlKGlucHV0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGNoaWxkSW5wdXQgPSBpbnB1dC52YWx1ZTtcclxuICAgIGNoaWxkSW5wdXQucGFyZW50T2JqZWN0ID0gX3RoaXM7XHJcbiAgICBjaGlsZElucHV0LnBhcmVudCA9IF90aGlzLl91cmw7XHJcblxyXG4gICAgbGV0IGh5cGVydHlSZXNvdXJjZSA9IF90aGlzLl9oeXBlcnR5UmVzb3VyY2VGYWN0b3J5LmNyZWF0ZUh5cGVydHlSZXNvdXJjZShmYWxzZSwgY2hpbGRJbnB1dC5yZXNvdXJjZVR5cGUsIGNoaWxkSW5wdXQpXHJcblxyXG4gICAgaHlwZXJ0eVJlc291cmNlLmlkZW50aXR5ID0gaW5wdXQuaWRlbnRpdHk7XHJcblxyXG4gICAgbGV0IGV2ZW50ID0ge1xyXG4gICAgICB0eXBlOiAnY3JlYXRlJyxcclxuICAgICAgZnJvbTogaHlwZXJ0eVJlc291cmNlLnJlcG9ydGVyLFxyXG4gICAgICB1cmw6IGh5cGVydHlSZXNvdXJjZS5wYXJlbnQsXHJcbiAgICAgIHZhbHVlOiBoeXBlcnR5UmVzb3VyY2UuZGF0YSxcclxuICAgICAgY2hpbGRJZDogaHlwZXJ0eVJlc291cmNlLnVybCxcclxuICAgICAgaWRlbnRpdHk6IGh5cGVydHlSZXNvdXJjZS5pZGVudGl0eSxcclxuICAgICAgY2hpbGQ6IGh5cGVydHlSZXNvdXJjZVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoaHlwZXJ0eVJlc291cmNlLnJlc291cmNlVHlwZSkge1xyXG4gICAgICBldmVudC5yZXNvdXJjZSA9IGh5cGVydHlSZXNvdXJjZTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKF90aGlzLl9vbkFkZENoaWxkcmVuSGFuZGxlcikgX3RoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyKGV2ZW50KTtcclxuXHJcbiAgICByZXR1cm4gaHlwZXJ0eVJlc291cmNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxsIE1ldGFkYXRhIGFib3V0IHRoZSBEYXRhIE9iamVjdFxyXG4gICAqIEB0eXBlIHtPYmplY3R9IC1cclxuICAgKi9cclxuXHJcbiAgZ2V0IG1ldGFkYXRhKCkgeyByZXR1cm4gdGhpcy5fbWV0YWRhdGE7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2JqZWN0IFVSTCBvZiByZXBvcnRlciBvciBvYnNlcnZlclxyXG4gICAqIEB0eXBlIHtPYmplY3RVUkx9XHJcbiAgICovXHJcbiAgZ2V0IHVybCgpIHsgcmV0dXJuIHRoaXMuX3VybDsgfVxyXG5cclxuICAvKipcclxuICAgKiBPYmplY3Qgc2NoZW1hIFVSTCAodGhpcyBmaWVsZCBpcyBub3QgeWV0IHN0YWJsZSwgYW5kIGlzIHN1YnNqZWN0IHRvIGNoYW5nZSlcclxuICAgKiBAdHlwZSB7U2NoZW1hVVJMfVxyXG4gICAqL1xyXG4gIGdldCBzY2hlbWEoKSB7IHJldHVybiB0aGlzLl9zY2hlbWE7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RhdHVzIG9mIHRoZSByZXBvcnRlciBvciBvYnNlcnZlciBjb25uZWN0aW9uICh0aGlzIGZpZWxkIGlzIG5vdCB5ZXQgc3RhYmxlLCBhbmQgaXMgc3Vic2plY3QgdG8gY2hhbmdlKVxyXG4gICAqIEB0eXBlIHtTdGF0dXN9IC0gRW51bSBvZjogb24gfCBwYXVzZWRcclxuICAgKi9cclxuICBnZXQgc3RhdHVzKCkgeyByZXR1cm4gdGhpcy5fc3RhdHVzOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGEgc3RydWN0dXJlIHRvIGJlIHN5bmNocm9uaXplZC5cclxuICAgKiBAdHlwZSB7SlNPTn0gLSBKU09OIHN0cnVjdHVyZSB0aGF0IHNob3VsZCBmb2xsb3cgdGhlIGRlZmluZWQgc2NoZW1hLCBpZiBhbnkuXHJcbiAgICovXHJcbiAgZ2V0IGRhdGEoKSB7IHJldHVybiB0aGlzLl9zeW5jT2JqLmRhdGE7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWxsIGNyZWF0ZWQgY2hpbGRyZW4ncyBzaW5jZSB0aGUgc3Vic2NyaXB0aW9uLCBkb2Vzbid0IGNvbnRhaW4gYWxsIGNoaWxkcmVuJ3Mgc2luY2UgcmVwb3J0ZXIgY3JlYXRpb24uXHJcbiAgICogQHR5cGUge09iamVjdDxDaGlsZElkLCBEYXRhT2JqZWN0Q2hpbGQ+fVxyXG4gICAqL1xyXG4gIGdldCBjaGlsZHJlbnMoKSB7IHJldHVybiB0aGlzLl9jaGlsZHJlbk9iamVjdHM7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHBhdXNlKCkge1xyXG4gICAgLy9UT0RPOiB0aGlzIGZlYXR1cmUgbmVlZHMgbW9yZSBhbmFsaXNlXHJcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICByZXN1bWUoKSB7XHJcbiAgICAvL1RPRE86IHRoaXMgZmVhdHVyZSBuZWVkcyBtb3JlIGFuYWxpc2VcclxuICAgIHRocm93ICdOb3QgaW1wbGVtZW50ZWQnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHN0b3AoKSB7XHJcbiAgICAvL1RPRE86IHNob3VsZCByZW1vdmUgdGhlIHN1YnNjcmlwdGlvbiBhbmQgc2VuZCBtZXNzYWdlIHVuc3Vic2NyaWJlP1xyXG4gICAgdGhyb3cgJ05vdCBpbXBsZW1lbnRlZCc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYW5kIGFkZCBhIERhdGFPYmplY3RDaGlsZCB0byBhIGNoaWxkcmVuIGNvbGxlY3Rpb24uXHJcbiAgICogQHBhcmFtIHtKU09OfSBpbml0aWFsRGF0YSAtIEluaXRpYWwgZGF0YSBvZiB0aGUgY2hpbGRcclxuICAgKiBAcGFyYW0gIHtNZXNzYWdlQm9keUlkZW50aXR5fSBpZGVudGl0eSAtIChvcHRpb25hbCkgaWRlbnRpdHkgZGF0YSB0byBiZSBhZGRlZCB0byBpZGVudGl0eSB0aGUgdXNlciByZXBvcnRlci4gVG8gYmUgdXNlZCBmb3IgbGVnYWN5IGlkZW50aXRpZXMuXHJcbiAgICogQHBhcmFtICB7U3luY0NoaWxkTWV0YWRhdGF9IGlucHV0IC0gKG9wdGlvbmFsKSBBbGwgYWRkaXRpb25hbCBtZXRhZGF0YSBhYm91dCB0aGUgRGF0YU9iamVjdENoaWxkLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8RGF0YU9iamVjdENoaWxkPn0gLSBSZXR1cm4gUHJvbWlzZSB0byBhIG5ldyBEYXRhT2JqZWN0Q2hpbGQuXHJcbiAgICovXHJcblxyXG4gIGFkZENoaWxkKGluaXRpYWxEYXRhLCBpZGVudGl0eSwgaW5wdXQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgbmV3Q2hpbGQ7XHJcblxyXG4gICAgLy9yZXR1cm5zIHByb21pc2UsIGluIHRoZSBmdXR1cmUsIHRoZSBBUEkgbWF5IGNoYW5nZSB0byBhc3luY2hyb25vdXMgY2FsbFxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcblxyXG4gICAgICBsZXQgbXNnQ2hpbGRQYXRoID0gX3RoaXMuX3VybCArICcvY2hpbGRyZW4vJztcclxuXHJcblxyXG4gICAgICBsZXQgY2hpbGRJbnB1dCA9IF90aGlzLl9nZXRDaGlsZElucHV0KGlucHV0KTtcclxuICAgICAgY2hpbGRJbnB1dC5kYXRhID0gaW5pdGlhbERhdGE7XHJcbiAgICAgIC8vICAgICAgY2hpbGRJbnB1dC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xyXG4gICAgICBuZXdDaGlsZCA9IG5ldyBEYXRhT2JqZWN0Q2hpbGQoY2hpbGRJbnB1dCk7XHJcblxyXG4gICAgICBpZiAoaWRlbnRpdHkpIG5ld0NoaWxkLmlkZW50aXR5ID0gaWRlbnRpdHk7XHJcblxyXG4gICAgICBuZXdDaGlsZC5zaGFyZSgpO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0LmFkZENoaWxkXSBhZGRlZCAnLCBuZXdDaGlsZCk7XHJcblxyXG4gICAgICBuZXdDaGlsZC5vbkNoYW5nZSgoZXZlbnQpID0+IHtcclxuICAgICAgICBfdGhpcy5fb25DaGFuZ2UoZXZlbnQsIHsgcGF0aDogbXNnQ2hpbGRQYXRoLCBjaGlsZElkOiBjaGlsZElucHV0LnVybCB9KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyAgICAgaWYgKCFfdGhpcy5fY2hpbGRyZW5PYmplY3RzLmhhc093blByb3BlcnR5KGNoaWxkcmVuKSkgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlbl0gPSB7fTtcclxuXHJcbiAgICAgIF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRJbnB1dC51cmxdID0gbmV3Q2hpbGQ7XHJcblxyXG4gICAgICByZXNvbHZlKG5ld0NoaWxkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2RlbGV0ZUNoaWxkcmVucygpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGRlbGV0ZVByb21pc2VzID0gW107XHJcblxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBpZiAoX3RoaXMuY2hpbGRyZW5zKSB7XHJcbiAgICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3QuZGVsZXRlQ2hpbGRyZW5zXScsIF90aGlzLmNoaWxkcmVucyk7XHJcbiAgICAgICAgbGV0IGNoaWxkO1xyXG5cclxuICAgICAgICBmb3IgKGNoaWxkIGluIF90aGlzLmNoaWxkcmVucykge1xyXG4gICAgICAgICAgLy8gICAgICAgICAgbGV0IGNoaWxkO1xyXG5cclxuICAgICAgICAgIC8qICAgICAgICAgIGlmIChjaGlsZHJlbiA9PT0gJ3Jlc291cmNlcycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2hpbGQgaW4gX3RoaXMuY2hpbGRyZW5zW2NoaWxkcmVuXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRPYmogPSBfdGhpcy5jaGlsZHJlbnNbY2hpbGRyZW5dW2NoaWxkXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3QuX2RlbGV0ZUNoaWxkcmVuc10gY2hpbGQnLGNoaWxkT2JqKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkT2JqLm1ldGFkYXRhLmhhc093blByb3BlcnR5KCdyZXNvdXJjZVR5cGUnKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVQcm9taXNlcy5wdXNoKF90aGlzLmNoaWxkcmVuc1tjaGlsZHJlbl1bY2hpbGRdLmRlbGV0ZSgpKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsqL1xyXG4gICAgICAgICAgbGV0IGNoaWxkT2JqID0gX3RoaXMuY2hpbGRyZW5zW2NoaWxkXTtcclxuICAgICAgICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0Ll9kZWxldGVDaGlsZHJlbnNdIGNoaWxkJywgY2hpbGRPYmopO1xyXG4gICAgICAgICAgaWYgKGNoaWxkT2JqLm1ldGFkYXRhLmhhc093blByb3BlcnR5KCdyZXNvdXJjZVR5cGUnKSlcclxuICAgICAgICAgICAgZGVsZXRlUHJvbWlzZXMucHVzaChfdGhpcy5jaGlsZHJlbnNbY2hpbGRdLmRlbGV0ZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3QuX2RlbGV0ZUNoaWxkcmVuc10gcHJvbWlzZXMgJywgZGVsZXRlUHJvbWlzZXMpO1xyXG5cclxuICAgICAgICBpZiAoZGVsZXRlUHJvbWlzZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgUHJvbWlzZS5hbGwoZGVsZXRlUHJvbWlzZXMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKCdbRGF0YU9iamVjdC5fZGVsZXRlQ2hpbGRyZW5zXSBkb25lJyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgcmVzb2x2ZSgnW0RhdGFPYmplY3QuX2RlbGV0ZUNoaWxkcmVuc10gbm90aGluZyB0byBkZWxldGUnKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIF9nZXRDaGlsZElucHV0KGlucHV0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGNoaWxkSW5wdXQgPSBPYmplY3QuYXNzaWduKHt9LCBpbnB1dCk7XHJcblxyXG4gICAgX3RoaXMuX2NoaWxkSWQrKztcclxuXHJcbiAgICAvL3JlbW92aW5nIGRvbWFpbiBmcm9tIGNoaWxkSWQgdG8gYXZvaWQgYmFja3VwIGlzc3VlcyB3aXRoICcuJ1xyXG5cclxuICAgIGNoaWxkSW5wdXQudXJsID0gX3RoaXMuX293bmVyLnNwbGl0KCcvJylbM10gKyAnIycgKyBfdGhpcy5fY2hpbGRJZDtcclxuXHJcbiAgICBjaGlsZElucHV0LnBhcmVudE9iamVjdCA9IF90aGlzO1xyXG4gICAgY2hpbGRJbnB1dC5yZXBvcnRlciA9IF90aGlzLl9vd25lcjtcclxuICAgIGNoaWxkSW5wdXQuY3JlYXRlZCA9IChuZXcgRGF0ZSkudG9JU09TdHJpbmcoKTtcclxuICAgIGNoaWxkSW5wdXQucnVudGltZSA9IF90aGlzLl9zeW5jaGVyLl9ydW50aW1lVXJsO1xyXG4gICAgY2hpbGRJbnB1dC5wMnBIYW5kbGVyID0gX3RoaXMuX3N5bmNoZXIuX3AycEhhbmRsZXI7XHJcbiAgICBjaGlsZElucHV0LnAycFJlcXVlc3RlciA9IF90aGlzLl9zeW5jaGVyLl9wMnBSZXF1ZXN0ZXI7XHJcbiAgICBjaGlsZElucHV0LnNjaGVtYSA9IF90aGlzLl9zY2hlbWE7XHJcbiAgICBjaGlsZElucHV0LnBhcmVudCA9IF90aGlzLnVybDtcclxuICAgIGNoaWxkSW5wdXQubXV0dWFsID0gX3RoaXMubWV0YWRhdGEubXV0dWFsO1xyXG4gICAgLy8gICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0Ll9nZXRDaGlsZElucHV0XSBtdXR1YWwgJywgY2hpbGRJbnB1dC5tdXR1YWwpO1xyXG5cclxuICAgIHJldHVybiBjaGlsZElucHV0O1xyXG4gIH1cclxuXHJcbiAgYWRkSHlwZXJ0eVJlc291cmNlKHR5cGUsIHJlc291cmNlLCBpZGVudGl0eSwgaW5wdXQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy9yZXR1cm5zIHByb21pc2UsIGluIHRoZSBmdXR1cmUsIHRoZSBBUEkgbWF5IGNoYW5nZSB0byBhc3luY2hyb25vdXMgY2FsbFxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcblxyXG4gICAgICBsZXQgaHlwZXJ0eVJlc291cmNlO1xyXG4gICAgICBsZXQgbXNnQ2hpbGRQYXRoID0gX3RoaXMuX3VybCArICcvY2hpbGRyZW4vJztcclxuXHJcbiAgICAgIGxldCBjaGlsZElucHV0ID0gX3RoaXMuX2dldENoaWxkSW5wdXQoaW5wdXQpO1xyXG4gICAgICAvLyAgICAgIGNoaWxkSW5wdXQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcclxuXHJcbiAgICAgIF90aGlzLl9oeXBlcnR5UmVzb3VyY2VGYWN0b3J5LmNyZWF0ZUh5cGVydHlSZXNvdXJjZVdpdGhDb250ZW50KHRydWUsIHR5cGUsIHJlc291cmNlLCBjaGlsZElucHV0KS50aGVuKChyZXNvdXJjZSkgPT4ge1xyXG4gICAgICAgIGh5cGVydHlSZXNvdXJjZSA9IHJlc291cmNlO1xyXG5cclxuICAgICAgICBpZiAoaWRlbnRpdHkpIGh5cGVydHlSZXNvdXJjZS5pZGVudGl0eSA9IGlkZW50aXR5O1xyXG5cclxuICAgICAgICBoeXBlcnR5UmVzb3VyY2Uuc2hhcmUoKTtcclxuXHJcbiAgICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3QuYWRkSHlwZXJ0eVJlc291cmNlXSBhZGRlZCAnLCBoeXBlcnR5UmVzb3VyY2UpO1xyXG5cclxuICAgICAgICBoeXBlcnR5UmVzb3VyY2Uub25DaGFuZ2UoKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBfdGhpcy5fb25DaGFuZ2UoZXZlbnQsIHsgcGF0aDogbXNnQ2hpbGRQYXRoLCBjaGlsZElkOiBoeXBlcnR5UmVzb3VyY2UuY2hpbGRJZCB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gICAgICAgIGlmICghX3RoaXMuX2NoaWxkcmVuT2JqZWN0cy5oYXNPd25Qcm9wZXJ0eShjaGlsZHJlbikpIF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRyZW5dID0ge307XHJcblxyXG4gICAgICAgIF90aGlzLl9jaGlsZHJlbk9iamVjdHNbaHlwZXJ0eVJlc291cmNlLmNoaWxkSWRdID0gaHlwZXJ0eVJlc291cmNlO1xyXG5cclxuICAgICAgICByZXNvbHZlKGh5cGVydHlSZXNvdXJjZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIGNyZWF0ZSBhbmQgZGVsZXRlIG9mIGNoaWxkcmVucy5cclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrXHJcbiAgICogVE9ETzogYWRkIGNoaWxkcmVuSWQgdG8gc3VwcG9ydCBkaWZmZXJlbnQgaGFuZGxlcnMgcGVyIGNoaWxkcmVuXHJcbiAgICovXHJcbiAgb25BZGRDaGlsZChjYWxsYmFjaykge1xyXG5cclxuICAgIHRoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIHJlbW90ZSBEYXRhT2JqZWN0IC0+IGFkZENoaWxkXHJcbiAgX29uQ2hpbGRDcmVhdGUobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIC8vICAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdC5fb25DaGlsZENyZWF0ZV0gcmVjZWl2ZWRCeSAnICsgX3RoaXMuX293bmVyICsgJyA6ICcsIG1zZyk7XHJcblxyXG4gICAgLy8gaWYgdGhpcyBpcyBhbiBoZWFydGJlYXQgbXNnIGZvd2FyZCBpdCB0byBoZWF0YmVhdCBoYW5kbGVyXHJcblxyXG4gICAgaWYgKG1zZy5ib2R5LnJlc291cmNlID09PSAnaGVhcnRiZWF0Jykge1xyXG4gICAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3QuX29uQ2hpbGRDcmVhdGVdIG5ldyBoZWFydGJlYXQgcmVjZWl2ZWQgJyArIG1zZy5ib2R5LnZhbHVlKTtcclxuICAgICAgdGhpcy5faGVhcnRCZWF0Lm9uTmV3SGVhcnRiZWF0KG1zZy5ib2R5LnZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdC5fb25DaGlsZENyZWF0ZV0gbmV3IGNoaWxkIHJlY2VpdmVkQnkgJyArIF90aGlzLl9vd25lciArICcgOiAnLCBtc2cpO1xyXG4gICAgICBsZXQgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgZnJvbTogbXNnLnRvLFxyXG4gICAgICAgIHRvOiBtc2cuZnJvbSxcclxuICAgICAgICB0eXBlOiAncmVzcG9uc2UnLFxyXG4gICAgICAgIGlkOiBtc2cuaWQsXHJcbiAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgY29kZTogMTAwXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgIGlmIChtc2cuYm9keS52YWx1ZS5yZXNvdXJjZVR5cGUpIHtcclxuICAgICAgICBfdGhpcy5fb25IeXBlcnR5UmVzb3VyY2VBZGRlZChtc2cpO1xyXG4gICAgICB9IGVsc2UgX3RoaXMuX29uQ2hpbGRBZGRlZChtc2cpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBfb25DaGlsZEFkZGVkKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBjaGlsZElucHV0ID0gZGVlcENsb25lKG1zZy5ib2R5LnZhbHVlKTtcclxuICAgIGNoaWxkSW5wdXQucGFyZW50T2JqZWN0ID0gX3RoaXM7XHJcblxyXG4gICAgLy8gICAgbGV0IGNoaWxkcmVuID0gY2hpbGRJbnB1dC5jaGlsZHJlbjtcclxuXHJcbiAgICBsZXQgbmV3Q2hpbGQgPSBuZXcgRGF0YU9iamVjdENoaWxkKGNoaWxkSW5wdXQpO1xyXG4gICAgbmV3Q2hpbGQuaWRlbnRpdHkgPSBtc2cuYm9keS5pZGVudGl0eTtcclxuXHJcblxyXG4gICAgLy8gICAgaWYgKCFfdGhpcy5fY2hpbGRyZW5PYmplY3RzLmhhc093blByb3BlcnR5KGNoaWxkcmVuKSkgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlbl0gPSB7fTtcclxuXHJcbiAgICBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkSW5wdXQudXJsXSA9IG5ld0NoaWxkO1xyXG5cclxuICAgIGlmIChtc2cudG8gPT09IF90aGlzLm1ldGFkYXRhLnVybCkgbmV3Q2hpbGQuc3RvcmUoKTtcclxuXHJcbiAgICBfdGhpcy5faHlwZXJ0eUV2dChtc2csIG5ld0NoaWxkKTtcclxuICB9XHJcblxyXG4gIF9vbkh5cGVydHlSZXNvdXJjZUFkZGVkKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBpbnB1dCA9IG1zZy5ib2R5LnZhbHVlO1xyXG4gICAgbGV0IGh5cGVydHlSZXNvdXJjZTtcclxuXHJcbiAgICAvLyAgICBsZXQgY2hpbGRyZW4gPSBpbnB1dC5jaGlsZHJlbjtcclxuXHJcbiAgICBpbnB1dC5wYXJlbnRPYmplY3QgPSBfdGhpcztcclxuXHJcbiAgICBoeXBlcnR5UmVzb3VyY2UgPSBfdGhpcy5faHlwZXJ0eVJlc291cmNlRmFjdG9yeS5jcmVhdGVIeXBlcnR5UmVzb3VyY2UoZmFsc2UsIGlucHV0LnJlc291cmNlVHlwZSwgaW5wdXQpO1xyXG4gICAgaHlwZXJ0eVJlc291cmNlLmlkZW50aXR5ID0gbXNnLmJvZHkuaWRlbnRpdHk7XHJcblxyXG4gICAgLy8gICAgaWYgKCFfdGhpcy5fY2hpbGRyZW5PYmplY3RzLmhhc093blByb3BlcnR5KGNoaWxkcmVuKSkgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlbl0gPSB7fTtcclxuXHJcbiAgICBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2h5cGVydHlSZXNvdXJjZS5jaGlsZElkXSA9IGh5cGVydHlSZXNvdXJjZTtcclxuXHJcbiAgICBfdGhpcy5faHlwZXJ0eUV2dChtc2csIGh5cGVydHlSZXNvdXJjZSk7XHJcblxyXG4gICAgLy8gbG9jYWxseSBzdG9yZSBtZXNzYWdlcyB0aGF0IGFyZSBkaXJlY3RseSBzZW50IHRvIHRoZSBoeXBlcnR5XHJcbiAgICAvLyBpZSB0byBzeW5jIHdpdGggbWVzc2FnZXMgc2VudCB3aGVuIG9mZmxpbmVcclxuXHJcbiAgICBpZiAobXNnLnRvID09PSBfdGhpcy5tZXRhZGF0YS51cmwpIGh5cGVydHlSZXNvdXJjZS5zdG9yZSgpO1xyXG4gIH1cclxuXHJcbiAgX2h5cGVydHlFdnQobXNnLCBjaGlsZCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgZXZlbnQgPSB7XHJcbiAgICAgIHR5cGU6IG1zZy50eXBlLFxyXG4gICAgICBmcm9tOiBtc2cuZnJvbSxcclxuICAgICAgdXJsOiBtc2cudG8sXHJcbiAgICAgIHZhbHVlOiBjaGlsZC5kYXRhLFxyXG4gICAgICBjaGlsZElkOiBjaGlsZC51cmwsXHJcbiAgICAgIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSxcclxuICAgICAgY2hpbGQ6IGNoaWxkXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChjaGlsZC5yZXNvdXJjZVR5cGUpIHtcclxuICAgICAgZXZlbnQucmVzb3VyY2UgPSBjaGlsZDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKF90aGlzLl9vbkFkZENoaWxkcmVuSGFuZGxlcikgX3RoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8vc2VuZCBkZWx0YSBtZXNzYWdlcyB0byBzdWJzY3JpcHRpb25zXHJcbiAgX29uQ2hhbmdlKGV2ZW50LCBjaGlsZEluZm8pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX21ldGFkYXRhLmxhc3RNb2RpZmllZCA9IChuZXcgRGF0ZSkudG9JU09TdHJpbmcoKTtcclxuXHJcbiAgICBfdGhpcy5fdmVyc2lvbisrO1xyXG5cclxuICAgIGlmIChfdGhpcy5fc3RhdHVzID09PSAnbGl2ZScpIHtcclxuICAgICAgLy9GTE9XLU9VVDogdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byBhIHJlc291cmNlIGNoYW5nZXMgYWRkcmVzczogTWVzc2FnZUJ1c1xyXG4gICAgICBsZXQgY2hhbmdlTXNnID0ge1xyXG4gICAgICAgIHR5cGU6ICd1cGRhdGUnLCBmcm9tOiBfdGhpcy5fdXJsLCB0bzogX3RoaXMuX3VybCArICcvY2hhbmdlcycsXHJcbiAgICAgICAgYm9keTogeyB2ZXJzaW9uOiBfdGhpcy5fdmVyc2lvbiwgc291cmNlOiBfdGhpcy5fb3duZXIsIGF0dHJpYnV0ZTogZXZlbnQuZmllbGQsIGxhc3RNb2RpZmllZDogX3RoaXMuX21ldGFkYXRhLmxhc3RNb2RpZmllZCB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsb2cubG9nKCdbRGF0YU9iamVjdCAtIF9vbkNoYW5nZV0gLSAnLCBldmVudCwgY2hpbGRJbmZvLCBjaGFuZ2VNc2cpO1xyXG5cclxuICAgICAgaWYgKGV2ZW50Lm9UeXBlID09PSBPYmplY3RUeXBlLk9CSkVDVCkge1xyXG4gICAgICAgIGlmIChldmVudC5jVHlwZSAhPT0gQ2hhbmdlVHlwZS5SRU1PVkUpIHtcclxuICAgICAgICAgIGNoYW5nZU1zZy5ib2R5LnZhbHVlID0gZGVlcENsb25lKGV2ZW50LmRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjaGFuZ2VNc2cuYm9keS5hdHRyaWJ1dGVUeXBlID0gZXZlbnQub1R5cGU7XHJcbiAgICAgICAgY2hhbmdlTXNnLmJvZHkudmFsdWUgPSBldmVudC5kYXRhO1xyXG4gICAgICAgIGlmIChldmVudC5jVHlwZSAhPT0gQ2hhbmdlVHlwZS5VUERBVEUpIHtcclxuICAgICAgICAgIGNoYW5nZU1zZy5ib2R5Lm9wZXJhdGlvbiA9IGV2ZW50LmNUeXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy9jaGlsZEluZm8gbXVzdCBoYXZlIChwYXRoLCBjaGlsZElkKVxyXG4gICAgICBpZiAoY2hpbGRJbmZvKSB7XHJcbiAgICAgICAgY2hhbmdlTXNnLnRvID0gY2hpbGRJbmZvLnBhdGg7XHJcbiAgICAgICAgY2hhbmdlTXNnLmJvZHkucmVzb3VyY2UgPSBjaGlsZEluZm8uY2hpbGRJZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9UT0RPOiBGb3IgRnVydGhlciBTdHVkeVxyXG4gICAgICBpZiAoIV90aGlzLmRhdGEuX211dHVhbCkgY2hhbmdlTXNnLmJvZHkubXV0dWFsID0gX3RoaXMuX211dHVhbDtcclxuXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UoY2hhbmdlTXNnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogZGVsdGEgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgcmVtb3RlIERhdGFPYmplY3RSZXBvcnRlciBvciBEYXRhT2JqZWN0Q2hpbGQgd2hlbiBjaGFuZ2luZyBkYXRhXHJcbiAgX2NoYW5nZU9iamVjdChzeW5jT2JqLCBtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy9UT0RPOiB1cGRhdGUgdmVyc2lvbiA/XHJcbiAgICAvL2hvdyB0byBoYW5kbGUgYW4gaW5jb3JyZWN0IHZlcnNpb24gPyBFeGFtcGxlOiByZWNlaXZlIGEgdmVyc2lvbiAzIHdoZW4gdGhlIG9ic2VydmVyIGlzIGluIHZlcnNpb24gMSwgd2hlcmUgaXMgdGhlIHZlcnNpb24gMiA/XHJcbiAgICAvL3dpbGwgd2UgbmVlZCB0byBjb25maXJtIHRoZSByZWNlcHRpb24gP1xyXG4gICAgaWYgKF90aGlzLl92ZXJzaW9uICsgMSA8PSBtc2cuYm9keS52ZXJzaW9uKSB7XHJcbiAgICAgIF90aGlzLl92ZXJzaW9uID0gbXNnLmJvZHkudmVyc2lvbjtcclxuICAgICAgbGV0IHBhdGggPSBtc2cuYm9keS5hdHRyaWJ1dGU7XHJcbiAgICAgIGxldCB2YWx1ZTtcclxuICAgICAgaWYgKHR5cGVvZiBtc2cuYm9keS52YWx1ZSA9PT0gJ29iamVjdCcpIHZhbHVlID0gZGVlcENsb25lKG1zZy5ib2R5LnZhbHVlKTtcclxuICAgICAgZWxzZSB2YWx1ZSA9IG1zZy5ib2R5LnZhbHVlO1xyXG5cclxuICAgICAgbGV0IGZpbmRSZXN1bHQgPSBzeW5jT2JqLmZpbmRCZWZvcmUocGF0aCk7XHJcblxyXG4gICAgICBpZiAobXNnLmJvZHkubGFzdE1vZGlmaWVkKSB7XHJcbiAgICAgICAgX3RoaXMuX21ldGFkYXRhLmxhc3RNb2RpZmllZCA9IG1zZy5ib2R5Lmxhc3RNb2RpZmllZDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBfdGhpcy5fbWV0YWRhdGEubGFzdE1vZGlmaWVkID0gKG5ldyBEYXRlKS50b0lTT1N0cmluZygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobXNnLmJvZHkuYXR0cmlidXRlVHlwZSA9PT0gT2JqZWN0VHlwZS5BUlJBWSkge1xyXG4gICAgICAgIGlmIChtc2cuYm9keS5vcGVyYXRpb24gPT09IENoYW5nZVR5cGUuQUREKSB7XHJcbiAgICAgICAgICBsZXQgYXJyID0gZmluZFJlc3VsdC5vYmo7XHJcbiAgICAgICAgICBsZXQgaW5kZXggPSBmaW5kUmVzdWx0Lmxhc3Q7XHJcbiAgICAgICAgICBBcnJheS5wcm90b3R5cGUuc3BsaWNlLmFwcGx5KGFyciwgW2luZGV4LCAwXS5jb25jYXQodmFsdWUpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG1zZy5ib2R5Lm9wZXJhdGlvbiA9PT0gQ2hhbmdlVHlwZS5SRU1PVkUpIHtcclxuICAgICAgICAgIGxldCBhcnIgPSBmaW5kUmVzdWx0Lm9iajtcclxuICAgICAgICAgIGxldCBpbmRleCA9IGZpbmRSZXN1bHQubGFzdDtcclxuICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZmluZFJlc3VsdC5vYmpbZmluZFJlc3VsdC5sYXN0XSA9IHZhbHVlOyAvLyBVUERBVEVcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XHJcbiAgICAgICAgICBmaW5kUmVzdWx0Lm9ialtmaW5kUmVzdWx0Lmxhc3RdID0gdmFsdWU7IC8vIFVQREFURSBvciBBRERcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZGVsZXRlIGZpbmRSZXN1bHQub2JqW2ZpbmRSZXN1bHQubGFzdF07IC8vIFJFTU9WRVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy9UT0RPOiBob3cgdG8gaGFuZGxlIHVuc3luY2hyb25pemVkIHZlcnNpb25zP1xyXG4gICAgICBsb2cubG9nKCdVTlNZTkNIUk9OSVpFRCBWRVJTSU9OOiAoZGF0YSA9PiAnICsgX3RoaXMuX3ZlcnNpb24gKyAnLCBtc2cgPT4gJyArIG1zZy5ib2R5LnZlcnNpb24gKyAnKScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9GTE9XLUlOOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYSByZW1vdGUgRGF0YU9iamVjdENoaWxkIHdoZW4gY2hhbmdpbmcgZGF0YVxyXG4gIF9jaGFuZ2VDaGlsZHJlbihtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBjb25zdCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKG1zZy50byk7XHJcbiAgICBjb25zdCBpZGVudGl0eSA9IGRpdmlkZWRVUkwuaWRlbnRpdHk7XHJcbiAgICAvLyAgICBjb25zdCByZXNvdXJjZSA9IGlkZW50aXR5ID8gaWRlbnRpdHkuc3Vic3RyaW5nKGlkZW50aXR5Lmxhc3RJbmRleE9mKCcvJykgKyAxKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICBsZXQgY2hpbGRJZCA9IG1zZy5ib2R5LnJlc291cmNlO1xyXG4gICAgbGV0IGNoaWxkcmVuID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZElkXTtcclxuXHJcbiAgICBsb2cubG9nKCdDaGFuZ2UgY2hpbGRyZW46ICcsIF90aGlzLl9vd25lciwgbXNnLCByZXNvdXJjZSk7XHJcblxyXG4gICAgaWYgKGNoaWxkcmVuKSB7XHJcbiAgICAgIF90aGlzLl9jaGFuZ2VPYmplY3QoY2hpbGRyZW4uX3N5bmNPYmosIG1zZyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2cud2FybignTm8gY2hpbGRyZW4gZm91bmQgZm9yOiAnLCBjaGlsZElkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEYXRhT2JqZWN0O1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdEYXRhT2JqZWN0UmVwb3J0ZXInKTtcclxuXHJcbmltcG9ydCBEYXRhT2JqZWN0IGZyb20gJy4vRGF0YU9iamVjdCc7XHJcblxyXG5pbXBvcnQgeyBkZWVwQ2xvbmUsIGRpdmlkZVVSTCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBUaGUgY2xhc3MgcmV0dXJuZWQgZnJvbSB0aGUgU3luY2hlciBjcmVhdGUgY2FsbC5cclxuICogVG8gYmUgdXNlZCBhcyBhIHJlcG9ydGVyIHBvaW50LCBjaGFuZ2VzIHdpbGwgYmUgc3VibWl0ZWQgdG8gRGF0YU9iamVjdE9ic2VydmVyIGluc3RhbmNlcy5cclxuICovXHJcbmNsYXNzIERhdGFPYmplY3RSZXBvcnRlciBleHRlbmRzIERhdGFPYmplY3QgLyogaW1wbGVtZW50cyBTeW5jU3RhdHVzICovIHtcclxuICAvKiBwcml2YXRlXHJcbiAgX3N1YnNjcmlwdGlvbnM6IDxoeXBlcnR5VXJsOiB7IHN0YXR1czogc3RyaW5nIH0gfT5cclxuXHJcbiAgLS0tLWV2ZW50IGhhbmRsZXJzLS0tLVxyXG4gIF9vblN1YnNjcmlwdGlvbkhhbmRsZXI6IChldmVudCkgPT4gdm9pZFxyXG4gIF9vblJlc3BvbnNlSGFuZGxlcjogKGV2ZW50KSA9PiB2b2lkXHJcbiAgX29uUmVhZEhhbmRsZXI6IChldmVudCkgPT4gdm9pZFxyXG4gICovXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKiBTaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgSHlwZXJ0aWVzLiBJdCdzIGNhbGxlZCBieSB0aGUgU3luY2hlci5jcmVhdGUgbWV0aG9kXHJcbiAgICovXHJcblxyXG4gIC8vY29uc3RydWN0b3Ioc3luY2hlciwgdXJsLCBjcmVhdGVkLCByZXBvcnRlciwgcnVudGltZSwgc2NoZW1hLCBuYW1lLCBpbml0aWFsU3RhdHVzLCBpbml0aWFsRGF0YSwgY2hpbGRyZW5zLCBtdXR1YWwgPSB0cnVlLCByZXN1bWVkID0gZmFsc2UsIGRlc2NyaXB0aW9uLCB0YWdzLCByZXNvdXJjZXMsIG9ic2VydmVyU3RvcmFnZSwgcHVibGljT2JzZXJ2YXRpb24pIHtcclxuICBjb25zdHJ1Y3RvcihpbnB1dCkge1xyXG5cclxuICAgIHN1cGVyKGlucHV0KTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX3N1YnNjcmlwdGlvbnMgPSB7fTtcclxuXHJcbiAgICBfdGhpcy5fc3luY09iai5vYnNlcnZlKChldmVudCkgPT4ge1xyXG4gICAgICBsb2cubG9nKCdbU3luY2hlci5EYXRhT2JqZWN0UmVwb3J0ZXJdICcgKyBfdGhpcy51cmwgKyAnIHB1Ymxpc2ggY2hhbmdlOiAnLCBldmVudCk7XHJcbiAgICAgIF90aGlzLl9vbkNoYW5nZShldmVudCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBfdGhpcy5fYWxsb2NhdGVMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICBfdGhpcy5pbnZpdGF0aW9ucyA9IFtdOyAvLyBhcnJheSBvZiBwcm9taXNlcyB3aXRoIHBlbmRpbmcgaW52aXRhdGlvbnNcclxuICAgIF90aGlzLl9jaGlsZHJlblNpemVUaHJlc2hvbGQgPSA1MDAwMDsvLyB0byBiZSB1c2VkIHdoZW4gcmVwbHlpbmcgdG8gc3luYyByZXF1ZXN0cyB0byBlbnN1cmUgZWFjaCByZXNwb25zZSBtc2cgaXMgbm90IHRvbyBsYXJnZVxyXG5cclxuICB9XHJcblxyXG4gIF9hbGxvY2F0ZUxpc3RlbmVycygpIHtcclxuICAgIHN1cGVyLl9hbGxvY2F0ZUxpc3RlbmVycygpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fb2JqZWN0TGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKF90aGlzLl91cmwsIChtc2cpID0+IHtcclxuICAgICAgbG9nLmxvZygnW1N5bmNoZXIuRGF0YU9iamVjdFJlcG9ydGVyXSBsaXN0ZW5lciAnICsgX3RoaXMuX3VybCArICcgUmVjZWl2ZWQ6ICcsIG1zZyk7XHJcbiAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcclxuICAgICAgICBjYXNlICdyZXNwb25zZSc6IF90aGlzLl9vblJlc3BvbnNlKG1zZyk7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3JlYWQnOiBfdGhpcy5fb25SZWFkKG1zZyk7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2V4ZWN1dGUnOiBfdGhpcy5fb25FeGVjdXRlKG1zZyk7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2NyZWF0ZSc6IF90aGlzLl9vbkNoaWxkQ3JlYXRlKG1zZyk7IGJyZWFrOy8vIHRvIGNyZWF0ZSBjaGlsZCBvYmplY3RzIHRoYXQgd2VyZSBzZW50IHdoZW5uIG9mZmxpbmVcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgX3RoaXMuX3J1bnRpbWVTdGF0dXNMaXN0ZW5lciA9IF90aGlzLl9idXMuYWRkTGlzdGVuZXIoX3RoaXMuX3N5bmNoZXIuX3J1bnRpbWVVcmwrJy9zdGF0dXMnICwgKGV2dCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnW1N5bmNoZXIuRGF0YU9iamVjdFJlcG9ydGVyXSBydW50aW1lIHN0YXR1cyBldmVudCByZWNlaXZlZCAnICsgZXZ0KTtcclxuXHJcbiAgICAgIGlmIChldnQuYm9keSAmJiBldnQuYm9keS5yZXNvdXJjZSAmJiBldnQuYm9keS5yZXNvdXJjZSA9PT0gX3RoaXMuX3VybCAmJiBcclxuICAgICAgICBldnQuYm9keS52YWx1ZSAmJiBldnQuYm9keS52YWx1ZS5iYWNrdXBSZXZpc2lvbiApIHtcclxuICAgICAgICAgIC8vIGJyb2FkY2FzdCBiYWNrdXBSZXZpc2lvbiB1cGRhdGVcclxuXHJcbiAgICAgICAgICBfdGhpcy5kYXRhLmJhY2t1cFJldmlzaW9uID0gZXZ0LmJvZHkudmFsdWUuYmFja3VwUmV2aXNpb247XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnW1N5bmNoZXIuRGF0YU9iamVjdFJlcG9ydGVyXSBETyB1cGRhdGVkIHdpdGggYmFja3VwIHJldmlzaW9uICcgKyBfdGhpcy5kYXRhLmJhY2t1cFJldmlzaW9uKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBfcmVsZWFzZUxpc3RlbmVycygpIHtcclxuICAgIHN1cGVyLl9yZWxlYXNlTGlzdGVuZXJzKCk7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9vYmplY3RMaXN0ZW5lci5yZW1vdmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbmQgaW52aXRhdGlvbnMgKGNyZWF0ZSBtZXNzYWdlcykgdG8gaHlwZXJ0aWVzLCBvYnNlcnZlcnMgbGlzdC5cclxuICAgKiBAcGFyYW0gIHtIeXBlcnR5VVJMW119IG9ic2VydmVycyBMaXN0IG9mIEh5cGVydHkgVVJMJ3NcclxuICAgKi9cclxuICBpbnZpdGVPYnNlcnZlcnMob2JzZXJ2ZXJzLCBwMnApIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cclxuICAgIC8vRkxPVy1PVVQ6IHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgaW5zdGFuY2Ugb2YgU3luY2hlck1hbmFnZXIgLT4gX29uQ3JlYXRlXHJcbiAgICAvLyBUT0RPOiByZW1vdmUgdmFsdWUgYW5kIGFkZCByZXNvdXJjZXM/IHNob3VsZCBzaW1pbGFyIHRvIDFzdCBjcmVhdGVcclxuXHJcbiAgICBsZXQgdG9JbnZpdGUgPSBvYnNlcnZlcnM7XHJcblxyXG4gICAgLy8gbGV0IGludml0ZVByb21pc2VzID0gW107XHJcblxyXG4gICAgLyogIG9ic2VydmVycy5mb3JFYWNoKChvYnNlcnZlcik9PiB7XHJcbiAgICAgIGlmICghX3RoaXMuaW52aXRhdGlvbnNbb2JzZXJ2ZXJdKSB7XHJcbiAgICAgICAgdG9JbnZpdGUucHVzaChvYnNlcnZlcik7XHJcbiAgICAgICAgX3RoaXMuaW52aXRhdGlvbnNbb2JzZXJ2ZXJdID0gb2JzZXJ2ZXI7XHJcbiAgICAgIH1cclxuICAgIH0pOyovXHJcblxyXG5cclxuICAgIGlmICh0b0ludml0ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGxvZy5sb2coJ1tTeW5jaGVyLkRhdGFPYmplY3RSZXBvcnRlcl0gSW52aXRlT2JzZXJ2ZXJzICcsIHRvSW52aXRlLCBfdGhpcy5fbWV0YWRhdGEpO1xyXG5cclxuICAgICAgdG9JbnZpdGUuZm9yRWFjaCgob2JzZXJ2ZXIpPT57XHJcblxyXG4gICAgICAgIGxldCBpbnZpdGF0aW9uID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgICAgIGxldCBpbnZpdGVNc2cgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGUnLCBmcm9tOiBfdGhpcy5fc3luY2hlci5fb3duZXIsIHRvOiBfdGhpcy5fc3luY2hlci5fc3ViVVJMLFxyXG4gICAgICAgICAgICBib2R5OiB7IHJlc3VtZTogZmFsc2UsIHJlc291cmNlOiBfdGhpcy5fdXJsLCBzY2hlbWE6IF90aGlzLl9zY2hlbWEsIHZhbHVlOiBfdGhpcy5fbWV0YWRhdGEsIGF1dGhvcmlzZTogW29ic2VydmVyXSB9XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmIChwMnApIGludml0ZU1zZy5ib2R5LnAycCA9IHAycDtcclxuXHJcbiAgICAgICAgICBpZiAoIV90aGlzLmRhdGEubXV0dWFsKSBpbnZpdGVNc2cuYm9keS5tdXR1YWwgPSBfdGhpcy5kYXRhLm11dHVhbDtcclxuXHJcbiAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKGludml0ZU1zZywgKHJlcGx5KT0+e1xyXG4gICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlci5EYXRhT2JqZWN0UmVwb3J0ZXJdIEludml0YXRpb24gcmVwbHkgJywgcmVwbHkpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICBpbnZpdGVkOiBvYnNlcnZlcixcclxuICAgICAgICAgICAgICBjb2RlOiByZXBseS5ib2R5ICYmIHJlcGx5LmJvZHkuY29kZSA/IHJlcGx5LmJvZHkuY29kZSA6IDUwMCxcclxuICAgICAgICAgICAgICBkZXNjOiByZXBseS5ib2R5ICYmIHJlcGx5LmJvZHkuZGVzYyA/IHJlcGx5LmJvZHkuZGVzYyA6ICdVbmtub3duJ1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc3VsdC5jb2RlIDwgMzAwKSByZXNvbHZlKHJlc3VsdCk7XHJcbi8qICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmNvZGUgPj0gMzAwKSB7XHJcbiAgICAgICAgICAgICAgaWYgKF90aGlzLm1ldGFkYXRhLm9mZmxpbmUpIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoX3RoaXMuX3Byb2Nlc3NPZmZsaW5lSW52aXRhdGlvbihpbnZpdGVNc2cpKTtcclxuICAgICAgICAgICAgICB9Ki8gZWxzZSByZWplY3QocmVzdWx0KTtcclxuLy8gICAgICAgICAgICB9IFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIF90aGlzLmludml0YXRpb25zLnB1c2goaW52aXRhdGlvbik7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vICAgICAgcmV0dXJuKGludml0ZVByb21pc2VzKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUmVsZWFzZSBhbmQgZGVsZXRlIG9iamVjdCBkYXRhXHJcbiAgICovXHJcbiAgZGVsZXRlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgIGlmKF90aGlzLl9oZWFydEJlYXQpIF90aGlzLl9oZWFydEJlYXQuc3RvcCgpO1xyXG5cclxuICAgIF90aGlzLl9kZWxldGVDaGlsZHJlbnMoKS50aGVuKChyZXN1bHQpPT57XHJcbiAgICAgIGxvZy5sb2cocmVzdWx0KTtcclxuICAgICAgLy9GTE9XLU9VVDogdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcnVudGltZSBpbnN0YW5jZSBvZiBTeW5jaGVyTWFuYWdlciAtPiBfb25EZWxldGVcclxuICAgICAgbGV0IGRlbGV0ZU1zZyA9IHtcclxuICAgICAgICB0eXBlOiAnZGVsZXRlJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N5bmNoZXIuX3N1YlVSTCxcclxuICAgICAgICBib2R5OiB7IHJlc291cmNlOiBfdGhpcy5fdXJsIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UoZGVsZXRlTXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdEYXRhT2JqZWN0UmVwb3J0ZXItREVMRVRFOiAnLCByZXBseSk7XHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICBfdGhpcy5fcmVsZWFzZUxpc3RlbmVycygpO1xyXG4gICAgICAgICAgZGVsZXRlIF90aGlzLl9zeW5jaGVyLl9yZXBvcnRlcnNbX3RoaXMuX3VybF07XHJcblxyXG4gICAgICAgICAgLy9fdGhpcy5fc3luY09iai51bm9ic2VydmUoKTtcclxuICAgICAgICAgIF90aGlzLl9zeW5jT2JqID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YnNjcmlwdGlvbnMgcmVxdWVzdGVkIGFuZCBhY2NlcHRlZCB0byB0aGlzIHJlcG9ydGVyXHJcbiAgICogQHR5cGUge09iamVjdDxIeXBlcnR5VVJMLCBTeW5jU3Vic2NyaXB0aW9uPn1cclxuICAgKi9cclxuICBnZXQgc3Vic2NyaXB0aW9ucygpIHsgcmV0dXJuIHRoaXMuX3N1YnNjcmlwdGlvbnM7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgdGhlIGNhbGxiYWNrIHRvIHByb2Nlc3Mgc3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSBub3RpZmljYXRpb25zXHJcbiAgICogQHBhcmFtIHtmdW5jdGlvbihldmVudDogTXNnRXZlbnQpfSBjYWxsYmFjayBmdW5jdGlvbiB0byByZWNlaXZlIGV2ZW50c1xyXG4gICAqL1xyXG4gIG9uU3Vic2NyaXB0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9vblN1YnNjcmlwdGlvbkhhbmRsZXIgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIHJlc3BvbnNlIG5vdGlmaWNhdGlvbnMgb2YgdGhlIGNyZWF0ZSdzXHJcbiAgICogQHBhcmFtIHtmdW5jdGlvbihldmVudDogTXNnRXZlbnQpfSBjYWxsYmFjayBmdW5jdGlvbiB0byByZWNlaXZlIGV2ZW50c1xyXG4gICAqL1xyXG4gIG9uUmVzcG9uc2UoY2FsbGJhY2spIHtcclxuICAgIHRoaXMuX29uUmVzcG9uc2VIYW5kbGVyID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCB0aGUgY2FsbGJhY2sgdG8gcHJvY2VzcyByZWFkIG5vdGlmaWNhdGlvbnNcclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrXHJcbiAgICovXHJcblxyXG4gIG9uUmVhZChjYWxsYmFjaykge1xyXG4gICAgdGhpcy5fb25SZWFkSGFuZGxlciA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgdGhlIGNhbGxiYWNrIHRvIHByb2Nlc3MgZXhlY3V0ZSBub3RpZmljYXRpb25zXHJcbiAgICogQHBhcmFtIHtmdW5jdGlvbihldmVudDogTXNnRXZlbnQpfSBjYWxsYmFja1xyXG4gICAqL1xyXG5cclxuICBvbkV4ZWN1dGUoY2FsbGJhY2spIHtcclxuICAgIHRoaXMuX29uRXhlY3V0ZUhhbmRsZXIgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIHBhcmVudCBTeW5jaGVyIC0+IF9vbkZvcndhcmRcclxuICBfb25Gb3J3YXJkKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsb2cubG9nKCdEYXRhT2JqZWN0UmVwb3J0ZXItUkNWOiAnLCBtc2cpO1xyXG4gICAgc3dpdGNoIChtc2cuYm9keS50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3N1YnNjcmliZSc6IF90aGlzLl9vblN1YnNjcmliZShtc2cpOyBicmVhaztcclxuICAgICAgY2FzZSAndW5zdWJzY3JpYmUnOiBfdGhpcy5fb25VblN1YnNjcmliZShtc2cpOyBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoaXMgLT4gX29uRm9yd2FyZDogZW1pdHRlZCBieSBhIHJlbW90ZSBTeW5jaGVyIC0+IHN1YnNjcmliZVxyXG4gIF9vblN1YnNjcmliZShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgaHlwZXJ0eVVybCA9IG1zZy5ib2R5LmZyb207XHJcbiAgICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTChoeXBlcnR5VXJsKTtcclxuICAgIGxldCBkb21haW4gPSBkaXZpZGVkVVJMLmRvbWFpbjtcclxuICAgIGxldCBtdXR1YWwgPSB0cnVlO1xyXG5cclxuICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykgJiYgIW1zZy5ib2R5Lm11dHVhbCkgbXV0dWFsID0gZmFsc2U7XHJcblxyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdFJlcG9ydGVyLl9vblN1YnNjcmliZV0nLCBtc2csIGRvbWFpbiwgZGl2aWRlZFVSTCk7XHJcblxyXG4gICAgbGV0IGV2ZW50ID0ge1xyXG4gICAgICB0eXBlOiBtc2cuYm9keS50eXBlLFxyXG4gICAgICB1cmw6IGh5cGVydHlVcmwsXHJcblxyXG4gICAgICBkb21haW46IGRvbWFpbixcclxuXHJcbiAgICAgIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSxcclxuXHJcbiAgICAgIG51dHVhbDogbXV0dWFsLFxyXG5cclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgLy9jcmVhdGUgbmV3IHN1YnNjcmlwdGlvblxyXG4gICAgICAgIGxldCBzdWIgPSB7IHVybDogaHlwZXJ0eVVybCwgc3RhdHVzOiAnbGl2ZScgfTtcclxuICAgICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uc1toeXBlcnR5VXJsXSA9IHN1YjtcclxuICAgICAgICBpZiAoX3RoaXMubWV0YWRhdGEuc3Vic2NyaXB0aW9ucykgeyBfdGhpcy5tZXRhZGF0YS5zdWJzY3JpcHRpb25zLnB1c2goc3ViLnVybCk7IH1cclxuXHJcbiAgICAgICAgbGV0IG1zZ1ZhbHVlID0gZGVlcENsb25lKF90aGlzLl9tZXRhZGF0YSk7XHJcbiAgICAgICAgbXNnVmFsdWUuZGF0YSA9IGRlZXBDbG9uZShfdGhpcy5kYXRhKTtcclxuICAgICAgICBtc2dWYWx1ZS52ZXJzaW9uID0gX3RoaXMuX3ZlcnNpb247XHJcblxyXG4gICAgICAgIC8vcHJvY2VzcyBhbmQgc2VuZCBjaGlsZHJlbnMgZGF0YVxyXG4gICAgICAgIC8vIGxldCBjaGlsZHJlblZhbHVlcyA9IHt9O1xyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gaWYgKF90aGlzLl9jaGlsZHJlbk9iamVjdHMpIHtcclxuICAgICAgICAvLyAgIE9iamVjdC5rZXlzKF90aGlzLl9jaGlsZHJlbk9iamVjdHMpLmZvckVhY2goKGNoaWxkcmVuSWQpID0+IHtcclxuICAgICAgICAvLyAgICAgbGV0IGNoaWxkcmVuRGF0YSA9IF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRyZW5JZF07XHJcbiAgICAgICAgLy8gICAgIGNoaWxkcmVuVmFsdWVzW2NoaWxkcmVuSWRdID0gZGVlcENsb25lKGNoaWxkcmVuRGF0YSk7XHJcbiAgICAgICAgLy8gICB9KTtcclxuICAgICAgICAvLyAgIG1zZ1ZhbHVlLmNoaWxkcmVuT2JqZWN0cyA9IGNoaWxkcmVuVmFsdWVzO1xyXG4gICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgbGV0IHNlbmRNc2cgPSB7XHJcbiAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcclxuICAgICAgICAgIGJvZHk6IHsgY29kZTogMjAwLCBzY2hlbWE6IF90aGlzLl9zY2hlbWEsIHZhbHVlOiBtc2dWYWx1ZSB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy9UT0RPOiBGb3IgRnVydGhlciBTdHVkeVxyXG4gICAgICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykgJiYgIW1zZy5ib2R5Lm11dHVhbCkge1xyXG4gICAgICAgICAgc2VuZE1zZy5ib2R5Lm11dHVhbCA9IG1zZy5ib2R5Lm11dHVhbDsvLyBUT0RPOiByZW1vdmU/XHJcbiAgICAgICAgICBfdGhpcy5kYXRhLm11dHVhbCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF90aGlzLl9oZWFydEJlYXQpIHtcclxuICAgICAgICAgIHNlbmRNc2cuYm9keS52YWx1ZS5jaGlsZHJlbk9iamVjdHMgPSB7fTtcclxuICAgICAgICAgIHNlbmRNc2cuYm9keS52YWx1ZS5jaGlsZHJlbk9iamVjdHMuaGVhcnRiZWF0ID0gX3RoaXMuX2hlYXJ0QmVhdC5oZWFydGJlYXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3RSZXBvcnRlci5fb25TdWJzY3JpYmUuYWNjZXB0XSBzZW5kaW5nIHJlc3BvbnNlOiAnLCBzZW5kTXNnKVxyXG5cclxuICAgICAgICAvL3NlbmQgb2sgcmVzcG9uc2UgbWVzc2FnZVxyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoc2VuZE1zZyk7XHJcblxyXG4gICAgICAgIHJldHVybiBzdWI7XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICByZWplY3Q6IChyZWFzb24pID0+IHtcclxuICAgICAgICAvL3NlbmQgcmVqZWN0IHJlc3BvbnNlIG1lc3NhZ2VcclxuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgYm9keTogeyBjb2RlOiA0MDMsIGRlc2M6IHJlYXNvbiB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKF90aGlzLl9vblN1YnNjcmlwdGlvbkhhbmRsZXIpIHtcclxuICAgICAgbG9nLmxvZygnU1VCU0NSSVBUSU9OLUVWRU5UOiAnLCBldmVudCk7XHJcbiAgICAgIF90aGlzLl9vblN1YnNjcmlwdGlvbkhhbmRsZXIoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9GTE9XLUlOOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhpcyAtPiBfb25Gb3J3YXJkOiBlbWl0dGVkIGJ5IGEgcmVtb3RlIERhdGFPYmplY3RPYnNlcnZlciAtPiB1bnN1YnNjcmliZVxyXG4gIF9vblVuU3Vic2NyaWJlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBoeXBlcnR5VXJsID0gbXNnLmJvZHkuZnJvbTtcclxuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKGh5cGVydHlVcmwpO1xyXG4gICAgbGV0IGRvbWFpbiA9IGRpdmlkZWRVUkwuZG9tYWluO1xyXG5cclxuICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0UmVwb3J0ZXIuX29uVW5TdWJzY3JpYmVdJywgbXNnLCBkb21haW4sIGRpdmlkZWRVUkwpO1xyXG5cclxuICAgIC8vbGV0IHN1YiA9IF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHlVcmxdO1xyXG4gICAgZGVsZXRlIF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHlVcmxdO1xyXG4gICAgZGVsZXRlIF90aGlzLmludml0YXRpb25zW2h5cGVydHlVcmxdO1xyXG5cclxuICAgIGxldCBldmVudCA9IHtcclxuICAgICAgdHlwZTogbXNnLmJvZHkudHlwZSxcclxuICAgICAgdXJsOiBoeXBlcnR5VXJsLFxyXG4gICAgICBkb21haW46IGRvbWFpbixcclxuICAgICAgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIFRPRE86IGNoZWNrIGlmIHRoZSBfb25TdWJzY3JpcHRpb25IYW5kbGVyIGl0IGlzIHRoZSBzYW1lIG9mIHRoZSBzdWJzY3JpcHRpb25zPz8/XHJcbiAgICBpZiAoX3RoaXMuX29uU3Vic2NyaXB0aW9uSGFuZGxlcikge1xyXG4gICAgICBsb2cubG9nKCdVTi1TVUJTQ1JJUFRJT04tRVZFTlQ6ICcsIGV2ZW50KTtcclxuICAgICAgX3RoaXMuX29uU3Vic2NyaXB0aW9uSGFuZGxlcihldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBSZXBvcnRlclVSTCBhZGRyZXNzOiBlbWl0ZWQgYnkgYSByZW1vdGUgU3luY2hlciAtPiBfb25SZW1vdGVDcmVhdGUgLT4gZXZlbnQuYWNrXHJcbiAgX29uUmVzcG9uc2UobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBldmVudCA9IHtcclxuICAgICAgdHlwZTogbXNnLnR5cGUsXHJcbiAgICAgIHVybDogbXNnLmZyb20sXHJcbiAgICAgIGNvZGU6IG1zZy5ib2R5LmNvZGVcclxuICAgIH07XHJcblxyXG4gICAgaWYgKF90aGlzLl9vblJlc3BvbnNlSGFuZGxlcikge1xyXG4gICAgICBsb2cubG9nKCdSRVNQT05TRS1FVkVOVDogJywgZXZlbnQpO1xyXG4gICAgICBfdGhpcy5fb25SZXNwb25zZUhhbmRsZXIoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9GTE9XLUlOOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gUmVwb3J0ZXJVUkwgYWRkcmVzczogZW1pdGVkIGJ5IGEgcmVtb3RlIFN5bmNoZXIgLT4gcmVhZFxyXG4gIF9vblJlYWQobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGNoaWxkcmVuc1NpemUgPSBKU09OLnN0cmluZ2lmeShfdGhpcy5jaGlsZHJlbnNKU09OKS5sZW5ndGg7XHJcblxyXG4gICAgbGV0IGxhcmdlT2JqZWN0ID0gKGNoaWxkcmVuc1NpemUgPiBfdGhpcy5fY2hpbGRyZW5TaXplVGhyZXNob2xkKSA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICBsZXQgZXZlbnQgPSB7XHJcbiAgICAgIHR5cGU6IG1zZy50eXBlLFxyXG4gICAgICB1cmw6IG1zZy5mcm9tLFxyXG5cclxuICAgICAgYWNjZXB0OiAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGxhcmdlT2JqZWN0KSBfdGhpcy5fc3luY1JlcGx5Rm9yTGFyZ2VEYXRhKG1zZyk7XHJcbiAgICAgICAgZWxzZSBfdGhpcy5fc3luY1JlcGx5KG1zZyk7XHJcbiAgICAgIH0sXHJcblxyXG4gICAgICByZWplY3Q6IChyZWFzb24pID0+IHtcclxuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgYm9keTogeyBjb2RlOiA0MDEsIGRlc2M6IHJlYXNvbiB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLy8gaWYgdGhlIHJlcXVlc3RlciBpcyBhbiBhdXRob3Jpc2VkIG9ic2VydmVyLCB0aGUgZGF0YSBvYmplY3QgaXMgcmVzcG9uZGVkIG90aGVyd2lzZSBhbiBldmVudCBpcyB0cmlnZ2VyZWRcclxuICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XHJcblxyXG4gICAgaWYgKF90aGlzLm1ldGFkYXRhLnN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgc3Vic2NyaXB0aW9ucyA9IF90aGlzLm1ldGFkYXRhLnN1YnNjcmlwdGlvbnM7XHJcbiAgICB9IGVsc2UgaWYgKF90aGlzLl9zdWJzY3JpcHRpb25zKSB7XHJcbiAgICAgIHN1YnNjcmlwdGlvbnMgPSBPYmplY3Qua2V5cyhfdGhpcy5fc3Vic2NyaXB0aW9ucykubWFwKGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gX3RoaXMuX3N1YnNjcmlwdGlvbnNba2V5XS51cmw7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzdWJzY3JpcHRpb25zLmluZGV4T2YobXNnLmZyb20pICE9IC0xKSB7XHJcbiAgICAgIGlmIChsYXJnZU9iamVjdCkgX3RoaXMuX3N5bmNSZXBseUZvckxhcmdlRGF0YShtc2cpO1xyXG4gICAgICBlbHNlIF90aGlzLl9zeW5jUmVwbHkobXNnKTtcclxuICAgIH0gZWxzZSBpZiAoX3RoaXMuX29uUmVhZEhhbmRsZXIpIHtcclxuICAgICAgbG9nLmxvZygnUkVBRC1FVkVOVDogJywgZXZlbnQpO1xyXG4gICAgICBfdGhpcy5fb25SZWFkSGFuZGxlcihldmVudCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGNoaWxkcmVuc0pTT04oKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGNoaWxkcmVucyA9IHt9O1xyXG5cclxuLy8gICAgbGV0IGNoaWxkcmVuO1xyXG5cclxuLy8gICAgZm9yIChjaGlsZHJlbiBpbiBfdGhpcy5fY2hpbGRyZW5PYmplY3RzKSB7XHJcbiAgICAgIGxldCBjaGlsZDtcclxuLy8gICAgICBjaGlsZHJlbnNbY2hpbGRyZW5dID0ge307XHJcbiAgICAgIGZvciAoY2hpbGQgaW4gX3RoaXMuX2NoaWxkcmVuT2JqZWN0cykge1xyXG4gICAgICAgIGNoaWxkcmVuc1tjaGlsZF0gPSB7fTtcclxuICAgICAgICBjaGlsZHJlbnNbY2hpbGRdLnZhbHVlID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZF0ubWV0YWRhdGE7XHJcbiAgICAgICAgY2hpbGRyZW5zW2NoaWxkXS5pZGVudGl0eSA9IF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRdLmlkZW50aXR5O1xyXG4gICAgICB9XHJcbi8vICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2hpbGRyZW5zO1xyXG4gIH1cclxuXHJcbiAgX3N5bmNSZXBseShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IG9iamVjdFZhbHVlID0gZGVlcENsb25lKF90aGlzLm1ldGFkYXRhKTtcclxuXHJcbiAgICBvYmplY3RWYWx1ZS5kYXRhID0gZGVlcENsb25lKF90aGlzLmRhdGEpO1xyXG4gICAgb2JqZWN0VmFsdWUuY2hpbGRyZW5PYmplY3RzID0gZGVlcENsb25lKF90aGlzLmNoaWxkcmVuc0pTT04pO1xyXG5cclxuICAgIG9iamVjdFZhbHVlLnZlcnNpb24gPSBfdGhpcy5fdmVyc2lvbjtcclxuXHJcbiAgICBsZXQgcmVzcG9uc2UgPSB7XHJcbiAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICBib2R5OiB7IGNvZGU6IDIwMCwgdmFsdWU6IG9iamVjdFZhbHVlIH1cclxuICAgIH07XHJcblxyXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXNwb25zZSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgaWYgdGhlIGRhdGEgb2JqZWN0IHRvIGJlIHN5bmNoZWQgaGFzIGNoaWxkcmVuT2plY3RzIHRvbyBsYXJnZVxyXG5cclxuICBfc3luY1JlcGx5Rm9yTGFyZ2VEYXRhKG1zZykge1xyXG4gIC8vc2V0IGF0dHJpYnV0ZSB3aXRoIG51bWJlciBvZiBzcGxsaXRlZCBtZXNzYWdlc1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvLyBsZXRzIHNldCB0aGUgaW5pdGlhbCBtZXNzYWdlIHdpdGggbm8gY2hpbGRPYmplY3RzXHJcblxyXG4gICAgbGV0IG9iamVjdFZhbHVlID0gZGVlcENsb25lKF90aGlzLm1ldGFkYXRhKTtcclxuXHJcbiAgICBvYmplY3RWYWx1ZS5kYXRhID0gZGVlcENsb25lKF90aGlzLmRhdGEpO1xyXG5cclxuICAgIG9iamVjdFZhbHVlLnZlcnNpb24gPSBfdGhpcy5fdmVyc2lvbjtcclxuXHJcbiAgICBkZWxldGUgb2JqZWN0VmFsdWUuY2hpbGRyZW5PYmplY3RzO1xyXG5cclxuICAgIGxldCBjaGlsZHJlbjtcclxuICAgIGxldCB2YWx1ZXMgPSBbXTsgLy8gYXJyYXkgb2YgdmFsdWVzIHRvIGJlIHNlbnQgaW4gc2VwYXJhdGVkIHJlc3BvbnNlc1xyXG4gICAgbGV0IGNoaWxkcmVuVmFsdWUgPSB7fTsgLy8gdmFsdWUgdG8gYmUgdXNlZCBpbiBlYWNoIHJlc3BvbnNlXHJcblxyXG4gICAgZm9yIChjaGlsZCBpbiBfdGhpcy5fY2hpbGRyZW5PYmplY3RzKSB7XHJcbi8vICAgICAgbGV0IGNoaWxkO1xyXG4gICAgICBjaGlsZHJlblZhbHVlW2NoaWxkXSA9IHt9O1xyXG4vLyAgICAgIGZvciAoY2hpbGQgaW4gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlbl0pIHtcclxuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoY2hpbGRyZW5WYWx1ZSkubGVuZ3RoID4gX3RoaXMuX2NoaWxkcmVuU2l6ZVRocmVzaG9sZCkge1xyXG4gICAgICAgICAgLy9jaGlsZHJlblZhbHVlIGJpZyBlbm91Z2ggdG8gYmUgc2VudCBpbiBhIHJlc3BvbnNlIG1lc3NhZ2VcclxuICAgICAgICAgIHZhbHVlcy5wdXNoKGNoaWxkcmVuVmFsdWUpO1xyXG4vLyAgICAgICAgICBjaGlsZHJlblZhbHVlID0ge307XHJcbi8vICAgICAgICAgIGNoaWxkcmVuVmFsdWVbY2hpbGRdID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNoaWxkcmVuVmFsdWVbY2hpbGRdID0ge307XHJcbiAgICAgICAgY2hpbGRyZW5WYWx1ZVtjaGlsZF0udmFsdWUgPSBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkXS5tZXRhZGF0YTtcclxuICAgICAgICBjaGlsZHJlblZhbHVlW2NoaWxkXS5pZGVudGl0eSA9IF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRdLmlkZW50aXR5O1xyXG4vLyAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YWx1ZXMucHVzaChjaGlsZHJlblZhbHVlKTtcclxuXHJcbiAgICBvYmplY3RWYWx1ZS5yZXNwb25zZXMgPSB2YWx1ZXMubGVuZ3RoICsgMTsgLy9udW1iZXIgb2YgcmVzcG9uc2VzIHRvIGJlIHNlbnRcclxuXHJcbiAgICBsZXQgaW5pdGlhbFJlc3BvbnNlID0ge1xyXG4gICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcclxuICAgICAgYm9keTogeyBjb2RlOiAxMDAsIHZhbHVlOiBvYmplY3RWYWx1ZSB9XHJcbiAgICB9O1xyXG5cclxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UoaW5pdGlhbFJlc3BvbnNlKTtcclxuXHJcbiAgICB2YWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcclxuXHJcbiAgICAgIGxldCByZXNwb25zZSA9IGRlZXBDbG9uZShpbml0aWFsUmVzcG9uc2UpO1xyXG5cclxuICAgICAgcmVzcG9uc2UuYm9keS52YWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgICAgcmVzcG9uc2UuYm9keS52YWx1ZS5yZXNwb25zZXMgPSBvYmplY3RWYWx1ZS5yZXNwb25zZXM7XHJcblxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXNwb25zZSk7IH0sIDUwKTtcclxuXHJcbiAgICAgIC8vIHNob3VsZCBwdXQgYSB0aW1lb3V0P1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8vIEV4ZWN1dGUgcmVxdWVzdCByZWNlaXZlZFxyXG4gIF9vbkV4ZWN1dGUobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmICghbXNnLmJvZHkubWV0aG9kKSB0aHJvdyAnW0RhdGFPYmplY3RSZXBvcnRlci5fb25FeGVjdXRlXSBtZXRob2QgbWlzc2luZyAnLCBtc2c7XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlID0ge1xyXG4gICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcclxuICAgICAgYm9keTogeyBjb2RlOiAyMDAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgZXZlbnQgPSB7XHJcbiAgICAgIHR5cGU6IG1zZy50eXBlLFxyXG4gICAgICB1cmw6IG1zZy5mcm9tLFxyXG4gICAgICBtZXRob2Q6IG1zZy5ib2R5Lm1ldGhvZCxcclxuICAgICAgcGFyYW1zOiBtc2cuYm9keS5wYXJhbXMsXHJcblxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIHJlamVjdDogKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgICBib2R5OiB7IGNvZGU6IDQwMSwgZGVzYzogcmVhc29uIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoX3RoaXMuX29uRXhlY3V0ZUhhbmRsZXIpIHtcclxuICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3RSZXBvcnRlcl0gRVhFQ1VURS1FVkVOVDogJywgZXZlbnQpO1xyXG4gICAgICBfdGhpcy5fb25FeGVjdXRlSGFuZGxlcihldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGF0YU9iamVjdFJlcG9ydGVyO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdEYXRhT2JqZWN0T2JzZXJ2ZXInKTtcclxuXHJcbmltcG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IERhdGFPYmplY3QgZnJvbSAnLi9EYXRhT2JqZWN0JztcclxuXHJcbmxldCBGaWx0ZXJUeXBlID0ge0FOWTogJ2FueScsIFNUQVJUOiAnc3RhcnQnLCBFWEFDVDogJ2V4YWN0J307XHJcblxyXG4vKipcclxuICogVGhlIGNsYXNzIHJldHVybmVkIGZyb20gdGhlIFN5bmNoZXIgc3Vic2NyaWJlIGNhbGwuXHJcbiAqIFRvIGJlIHVzZWQgYXMgYW4gb2JzZXJ2YXRpb24gcG9pbnQgZnJvbSBhIERhdGFPYmplY3RSZXBvcnRlciBjaGFuZ2UuXHJcbiAqL1xyXG5jbGFzcyBEYXRhT2JqZWN0T2JzZXJ2ZXIgZXh0ZW5kcyBEYXRhT2JqZWN0IC8qIGltcGxlbWVudHMgU3luY1N0YXR1cyAqLyB7XHJcbiAgLyogcHJpdmF0ZVxyXG4gIF9jaGFuZ2VMaXN0ZW5lcjogTXNnTGlzdGVuZXJcclxuXHJcbiAgLS0tLWV2ZW50IGhhbmRsZXJzLS0tLVxyXG4gIF9maWx0ZXJzOiB7PGZpbHRlcj46IHt0eXBlOiA8c3RhcnQsIGV4YWN0PiwgY2FsbGJhY2s6IDxmdW5jdGlvbj59IH1cclxuICAqL1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICogU2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IEh5cGVydGllcy4gSXQncyBjYWxsZWQgYnkgdGhlIFN5bmNoZXIuc3Vic2NyaWJlIG1ldGhvZFxyXG4gICAqL1xyXG5cclxuICAvL1RPRE86IEZvciBGdXJ0aGVyIFN0dWR5XHJcbiAgY29uc3RydWN0b3IoaW5wdXQpIHtcclxuICAgIC8vdG9kbzogY2hlY2sgd2h5XHJcbiAgICAvL2lucHV0LmluaXRpYWxEYXRhID0gaW5wdXQuaW5pdGlhbERhdGEuZGF0YTtcclxuXHJcbiAgICBzdXBlcihpbnB1dCk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fdmVyc2lvbiA9IGlucHV0LnZlcnNpb247XHJcbiAgICBfdGhpcy5fZmlsdGVycyA9IHt9O1xyXG5cclxuICAgIF90aGlzLl9zeW5jT2JqLm9ic2VydmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIF90aGlzLl9vbkZpbHRlcihldmVudCk7XHJcbiAgICB9KTtcclxuXHJcblxyXG4gICAgX3RoaXMuX2FsbG9jYXRlTGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTeW5jIERhdGEgT2JqZWN0IE9ic2VydmVyIHdpdGggbGFzdCB2ZXJzaW9uIG9mIERhdGEgT2JqZWN0IFJlcG9ydGVyLiBVc2VmdWwgZm9yIFJlc3VtZXNcclxuICAgKi9cclxuICBzeW5jKCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsb2cuaW5mbygnW0RhdGFPYmplY3RPYnNlcnZlcl9zeW5jXSBzeW5jaHJvbmlzaW5nICcpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgY3JpdGVyaWEgPSB7fTtcclxuXHJcbi8vICAgICAgaWYgKHRoaXMubWV0YWRhdGEuYmFja3VwUmV2aXNpb24pIGNyaXRlcmlhLmJhY2t1cFJldmlzaW9uID0gdGhpcy5tZXRhZGF0YS5iYWNrdXBSZXZpc2lvbjtcclxuXHJcbiAgICAgIF90aGlzLl9zeW5jaGVyLnJlYWQoX3RoaXMuX21ldGFkYXRhLnVybCwgY3JpdGVyaWEpLnRoZW4oKHZhbHVlKT0+e1xyXG4gICAgICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdE9ic2VydmVyX3N5bmNdIHZhbHVlIHRvIHN5bmM6ICcsIHZhbHVlKTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihfdGhpcy5kYXRhLCBkZWVwQ2xvbmUodmFsdWUuZGF0YSkpO1xyXG5cclxuICAgICAgICBfdGhpcy5fdmVyc2lvbiA9IHZhbHVlLnZlcnNpb247XHJcblxyXG4gICAgICAgIF90aGlzLl9tZXRhZGF0YS5sYXN0TW9kaWZpZWQgPSB2YWx1ZS5sYXN0TW9kaWZpZWQ7XHJcblxyXG4gICAgICAgIC8vVE9ETzogY2hlY2sgZmlyc3QgaWYgdGhlcmUgYXJlIG5ldyBjaGlsZHJlbk9iamVjdHMgdG8gYXZvaWQgb3ZlcmhlYWRcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlLmNoaWxkcmVuT2JqZWN0cykge1xyXG4gICAgICAgICAgX3RoaXMucmVzdW1lQ2hpbGRyZW5zKHZhbHVlLmNoaWxkcmVuT2JqZWN0cyk7XHJcbiAgICAgICAgICBfdGhpcy5fc3RvcmVDaGlsZHJlbnMoKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHJlc29sdmUodHJ1ZSk7XHJcblxyXG5cclxuICAgICAgICAvKmlmICh2YWx1ZS52ZXJzaW9uICE9IF90aGlzLl92ZXJzaW9uKSB7XHJcbiAgICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3RPYnNlcnZlcl9zeW5jXSB1cGRhdGluZyBleGlzdGluZyBkYXRhOiAnLCBfdGhpcy5kYXRhKTtcclxuXHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKF90aGlzLmRhdGEgfHwge30sIGRlZXBDbG9uZSh2YWx1ZS5kYXRhKSk7XHJcblxyXG4gICAgICAgICAgX3RoaXMuX21ldGFkYXRhID0gZGVlcENsb25lKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICBkZWxldGUgX3RoaXMuX21ldGFkYXRhLmRhdGE7XHJcblxyXG4gICAgICAgICAgX3RoaXMuX3ZlcnNpb24gPSB2YWx1ZS52ZXJzaW9uO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0T2JzZXJ2ZXJfc3luY10gZXhpc3RpbmcgZGF0YSBpcyB1cGRhdGVkOiAnLCB2YWx1ZSk7XHJcbiAgICAgICAgfSovXHJcblxyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0T2JzZXJ2ZXJfc3luY10gc3luYyBmYWlsZWQ6ICcsIHJlYXNvbik7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICBfc3RvcmVDaGlsZHJlbnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBjaGlsZHJlbnMgPSB7fTtcclxuXHJcbiAgICAvL1RPRE86IHRvIGJlIHNlbnQgdG8gSHlwZXJ0eVJlc291cmNlU3RvcmFnZSB3aGVuIHJlYWR5IHRvIGhhbmRsZSBDaGF0IE1lc3NhZ2VzXHJcblxyXG4gICAgT2JqZWN0LmtleXMoX3RoaXMuX2NoaWxkcmVuT2JqZWN0cykuZm9yRWFjaCgoY2hpbGRJZCkgPT4ge1xyXG4gICAgICBsZXQgY2hpbGRyZW4gPSBfdGhpcy5fY2hpbGRyZW5PYmplY3RzO1xyXG4vLyAgICAgIGNoaWxkcmVuc1tjaGlsZHJlblJlc291cmNlXSA9IHt9O1xyXG5cclxuLy8gICAgICBPYmplY3Qua2V5cyhjaGlsZHJlbikuZm9yRWFjaCgoY2hpbGRJZCkgPT4ge1xyXG4gICAgICAgIGNoaWxkcmVuc1tjaGlsZElkXSA9IHt9O1xyXG4gICAgICAgIGNoaWxkcmVuc1tjaGlsZElkXS52YWx1ZSA9IGNoaWxkcmVuW2NoaWxkSWRdLm1ldGFkYXRhO1xyXG4gICAgICAgIGNoaWxkcmVuc1tjaGlsZElkXS5pZGVudGl0eSA9IGNoaWxkcmVuW2NoaWxkSWRdLmlkZW50aXR5O1xyXG4vLyAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgICBsZXQgbXNnID0ge1xyXG5cclxuICAgICAgICBmcm9tOiBfdGhpcy5fb3duZXIsXHJcbiAgICAgICAgdG86IF90aGlzLl9zeW5jaGVyLl9zdWJVUkwsXHJcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsXHJcbiAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgcmVzb3VyY2U6IF90aGlzLl91cmwsXHJcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdjaGlsZHJlbk9iamVjdHMnLFxyXG4gICAgICAgICAgdmFsdWU6IGNoaWxkcmVuc1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnKTtcclxuXHJcbiAgfVxyXG5cclxuICBfYWxsb2NhdGVMaXN0ZW5lcnMoKSB7XHJcbiAgICBzdXBlci5fYWxsb2NhdGVMaXN0ZW5lcnMoKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX2NoYW5nZUxpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihfdGhpcy5fdXJsICsgJy9jaGFuZ2VzJywgKG1zZykgPT4ge1xyXG4gICAgICBpZiAobXNnLnR5cGUgPT09ICd1cGRhdGUnKSB7XHJcbiAgICAgICAgbG9nLmxvZygnRGF0YU9iamVjdE9ic2VydmVyLScgKyBfdGhpcy5fdXJsICsgJy1SQ1Y6ICcsIG1zZyk7XHJcbiAgICAgICAgX3RoaXMuX2NoYW5nZU9iamVjdChfdGhpcy5fc3luY09iaiwgbXNnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfcmVsZWFzZUxpc3RlbmVycygpIHtcclxuICAgIHN1cGVyLl9yZWxlYXNlTGlzdGVuZXJzKCk7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9jaGFuZ2VMaXN0ZW5lci5yZW1vdmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbGVhc2UgYW5kIGRlbGV0ZSBvYmplY3QgZGF0YVxyXG4gICAqL1xyXG4gIGRlbGV0ZSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgaWYgKF90aGlzLl9oZWFydEJlYXQpIF90aGlzLl9oZWFydEJlYXQuc3RvcCgpO1xyXG5cclxuICAgIF90aGlzLl9kZWxldGVDaGlsZHJlbnMoKS50aGVuKCgpPT57XHJcbiAgICAgIF90aGlzLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgIF90aGlzLl9yZWxlYXNlTGlzdGVuZXJzKCk7XHJcbiAgICAgIGRlbGV0ZSBfdGhpcy5fc3luY2hlci5fb2JzZXJ2ZXJzW190aGlzLl91cmxdO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVsZWFzZSBhbmQgZGVsZXRlIG9iamVjdCBkYXRhXHJcbiAgICovXHJcbiAgdW5zdWJzY3JpYmUoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIC8vRkxPVy1PVVQ6IHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgaW5zdGFuY2Ugb2YgU3luY2hlck1hbmFnZXIgLT4gX29uTG9jYWxVblN1YnNjcmliZVxyXG4gICAgbGV0IHVuU3Vic2NyaWJlTXNnID0ge1xyXG4gICAgICB0eXBlOiAndW5zdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fb3duZXIsIHRvOiBfdGhpcy5fc3luY2hlci5fc3ViVVJMLFxyXG4gICAgICBib2R5OiB7IHJlc291cmNlOiBfdGhpcy5fdXJsIH1cclxuICAgIH07XHJcblxyXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh1blN1YnNjcmliZU1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgIGxvZy5sb2coJ0RhdGFPYmplY3RPYnNlcnZlci1VTlNVQlNDUklCRTogJywgcmVwbHkpO1xyXG4gICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICBfdGhpcy5fcmVsZWFzZUxpc3RlbmVycygpO1xyXG4gICAgICAgIGRlbGV0ZSBfdGhpcy5fc3luY2hlci5fb2JzZXJ2ZXJzW190aGlzLl91cmxdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIHRoZSBjaGFuZ2UgbGlzdGVuZXJzIHNlbnQgYnkgdGhlIHJlcG9ydGVyXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbHRlciAtIEZpbHRlciB0aGF0IGlkZW50aWZpZXMgdGhlIGZpZWxkIChzZXBhcmF0ZWQgZG90IHBhdGgpLiBBY2NlcHRzICogYXQgdGhlIGVuZCBmb3IgYSBtb3JlIHVucmVzdHJpY3RlZCBmaWx0ZXJpbmcuXHJcbiAgICogQHBhcmFtIHtmdW5jdGlvbihldmVudDogTXNnRXZlbnQpfSBjYWxsYmFja1xyXG4gICAqL1xyXG4gIG9uQ2hhbmdlKGZpbHRlciwgY2FsbGJhY2spIHtcclxuICAgIGxldCBrZXkgPSBmaWx0ZXI7XHJcbiAgICBsZXQgZmlsdGVyT2JqID0ge1xyXG4gICAgICB0eXBlOiBGaWx0ZXJUeXBlLkVYQUNULFxyXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2tcclxuICAgIH07XHJcblxyXG4gICAgbGV0IGlkeCA9IGZpbHRlci5pbmRleE9mKCcqJyk7XHJcbiAgICBpZiAoaWR4ID09PSBmaWx0ZXIubGVuZ3RoIC0gMSkge1xyXG4gICAgICBpZiAoaWR4ID09PSAwKSB7XHJcbiAgICAgICAgZmlsdGVyT2JqLnR5cGUgPSBGaWx0ZXJUeXBlLkFOWTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBmaWx0ZXJPYmoudHlwZSA9IEZpbHRlclR5cGUuU1RBUlQ7XHJcbiAgICAgICAga2V5ID0gZmlsdGVyLnN1YnN0cigwLCBmaWx0ZXIubGVuZ3RoIC0gMSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9maWx0ZXJzW2tleV0gPSBmaWx0ZXJPYmo7XHJcbiAgfVxyXG5cclxuICBfb25GaWx0ZXIoZXZlbnQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgT2JqZWN0LmtleXMoX3RoaXMuX2ZpbHRlcnMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBsZXQgZmlsdGVyID0gX3RoaXMuX2ZpbHRlcnNba2V5XTtcclxuICAgICAgaWYgKGZpbHRlci50eXBlID09PSBGaWx0ZXJUeXBlLkFOWSkge1xyXG4gICAgICAgIC8vbWF0Y2ggYW55dGhpbmdcclxuICAgICAgICBmaWx0ZXIuY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09PSBGaWx0ZXJUeXBlLlNUQVJUKSB7XHJcbiAgICAgICAgLy9pZiBzdGFydHMgd2l0aCBmaWx0ZXIuLi5cclxuICAgICAgICBpZiAoZXZlbnQuZmllbGQuaW5kZXhPZihrZXkpID09PSAwKSB7XHJcbiAgICAgICAgICBmaWx0ZXIuY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChmaWx0ZXIudHlwZSA9PT0gRmlsdGVyVHlwZS5FWEFDVCkge1xyXG4gICAgICAgIC8vZXhhY3QgbWF0Y2hcclxuICAgICAgICBpZiAoZXZlbnQuZmllbGQgPT09IGtleSkge1xyXG4gICAgICAgICAgZmlsdGVyLmNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25EaXNjb25uZWN0ZWQoY2FsbGJhY2spIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5fc3Vic2NyaWJlUmVnaXN0cmF0aW9uKClcclxuICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX29uRGlzY29ubmVjdGVkID0gY2FsbGJhY2s7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycikgPT4gcmVqZWN0KGVycikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfc3Vic2NyaWJlUmVnaXN0cmF0aW9uKCkge1xyXG5cclxuICAgIGNvbnN0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3N1YnNjcmliZScsXHJcbiAgICAgIGZyb206IHRoaXMuX293bmVyLFxyXG4gICAgICB0bzogdGhpcy5fc3luY2hlci5fcnVudGltZVVybCArICcvc3Vic2NyaXB0aW9ucycsXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLl91cmwgKyAnL3JlZ2lzdHJhdGlvbiddXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIHRoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgIGxvZy5sb2coYFtEYXRhT2JqZWN0T2JzZXJ2ZXIuX3N1YnNjcmliZVJlZ2lzdHJhdGlvbl0gJHt0aGlzLl91cmx9IHJjdmVkIHJlcGx5IGAsIHJlcGx5KTtcclxuXHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICB0aGlzLl9nZW5lcmF0ZUxpc3RlbmVyKHRoaXMuX3VybCArICcvcmVnaXN0cmF0aW9uJyk7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxvZy5lcnJvcignRXJyb3Igc3Vic2NyaWJpbmcgcmVnaXN0cmF0aW9uIHN0YXR1cyBmb3IgJywgdGhpcy5fdXJsKTtcclxuICAgICAgICAgIHJlamVjdCgnRXJyb3Igc3Vic2NyaWJpbmcgcmVnaXN0cmF0aW9uIHN0YXR1cyBmb3IgJyArIHRoaXMuX3VybCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2dlbmVyYXRlTGlzdGVuZXIobm90aWZpY2F0aW9uVVJMKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9idXMuYWRkTGlzdGVuZXIobm90aWZpY2F0aW9uVVJMLCAobXNnKSA9PiB7XHJcbiAgICAgIGxvZy5sb2coYFtEYXRhT2JqZWN0T2JzZXJ2ZXIucmVnaXN0cmF0aW9uTm90aWZpY2F0aW9uXSAke190aGlzLl91cmx9OiBgLCBtc2cpO1xyXG4gICAgICBpZiAobXNnLmJvZHkudmFsdWUgJiYgbXNnLmJvZHkudmFsdWUgPT09ICdkaXNjb25uZWN0ZWQnICYmIF90aGlzLl9vbkRpc2Nvbm5lY3RlZCkge1xyXG4gICAgICAgIGxvZy5sb2coYFtEYXRhT2JqZWN0T2JzZXJ2ZXJdICR7X3RoaXMuX3VybH06IHdhcyBkaXNjb25uZWN0ZWQgYCwgbXNnKTtcclxuICAgICAgICBfdGhpcy5fb25EaXNjb25uZWN0ZWQoKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVxdWVzdHMgdGhlIHJlcG9ydGVyIHRvIGV4ZWN1dGUgYSBtZXRob2Qgb24gdGhlIGRhdGEgb2JqZWN0XHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCAtIE5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkLlxyXG4gICAqIEBwYXJhbSB7YXJyYXl9IHBhcmFtcyAtIGFycmF5IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb25cclxuICAgKiBAcmV0dXJuIHtwcm9taXNlfVxyXG4gICAqL1xyXG5cclxuICBleGVjdXRlKG1ldGhvZCwgcGFyYW1zKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBjb25zdCBtc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ2V4ZWN1dGUnLFxyXG4gICAgICAgIGZyb206IHRoaXMuX293bmVyLFxyXG4gICAgICAgIHRvOiBfdGhpcy5fdXJsLFxyXG4gICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxyXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXNcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZyhgW0RhdGFPYmplY3RPYnNlcnZlci5leGVjdXRlXSAke190aGlzLl91cmx9IHJjdmVkIHJlcGx5IGAsIHJlcGx5KTtcclxuXHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxvZy53YXJuKGBbRGF0YU9iamVjdE9ic2VydmVyLmV4ZWN1dGVdIGV4ZWN1dGlvbiBvZiBtZXRob2QgJHttZXRob2R9IHdhcyByZWplY3QgYnkgcmVwb3J0ZXJgKTtcclxuICAgICAgICAgIHJlamVjdChgW0RhdGFPYmplY3RPYnNlcnZlci5leGVjdXRlXSBleGVjdXRpb24gb2YgbWV0aG9kICR7bWV0aG9kfSB3YXMgcmVqZWN0IGJ5IHJlcG9ydGVyYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGF0YU9iamVjdE9ic2VydmVyO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuICogQGFjY2VzcyBwcml2YXRlXHJcbiAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGNvbGxlY3RpbmcgZGVsdGEgY2hhbmdlcyBpbiByZW1vdGUgb2JqZWN0cywgYmVmb3JlIHRoZSByZXNwb25zZSBvZiBzdWJzY3JpcHRpb24gcmVhY2ggdGhlIG9ic2VydmVyLlxyXG4gKiBJdCdzIHVzZWQgaW4gU3luY2hlciAtPiBzdWJzY3JpYmUuIFRoZSBmbG93IGlzIGRlZmluZWQgYXM6XHJcbiAqIDEuIChvYnNlcnZlcikgLS1zdWJzY3JpYmUtLT4gKHJlcG9ydGVyKVxyXG4gKiAyLiAob2JzZXJ2ZXIpIDwtLWRlbHRhIHVwZGF0ZXMtLSAocmVwb3J0ZXIpXHJcbiAqIDMuIChvYnNlcnZlcikgPC0tc3Vic2NyaWJlIHJlc3BvbnNlLS0gKHJlcG9ydGVyKVxyXG4gKiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgY291bGQgYmUgZGVsdGEgdXBkYXRlcyB0cmFuc2ZlcnJlZCBiZWZvcmUgdGhlIHN1YnNjcmlwdGlvbiBjb25maXJtYXRpb24uXHJcbiAqIFNpbmNlIHRoZXJlIGlzIG5vIERhdGFPYmplY3RPYnNlcnZlciBiZWZvcmUgdGhlIHVic2NyaXB0aW9uIGNvbmZpcm1hdGlvbiwgdGhlcmUgc2hvdWxkIGJlIHNvbWUgb3RoZXIgb2JqZWN0IGNvbGxlY3RpbmcgdGhlIHVwZGF0ZXMuXHJcbiAqIFByb3Zpc2lvbmFsIGRhdGEgaXMgYXBwbGllZCB0byB0aGUgRGF0YU9iamVjdE9ic2VydmVyIGFmdGVyIGNvbmZpcm1hdGlvbi4gT3IgZGlzY2FyZGVkIGlmIHRoZXJlIGlzIG5vIGNvbmZpcm1hdGlvbi5cclxuICovXHJcblxyXG4vLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdEYXRhUHJvdmlzaW9uYWwnKTtcclxuXHJcbmNsYXNzIERhdGFQcm92aXNpb25hbCB7XHJcbiAgLyogcHJpdmF0ZVxyXG4gIF9jaGlsZHJlbkxpc3RlbmVyczogW01zZ0xpc3RlbmVyXVxyXG4gIF9saXN0ZW5lcjogTXNnTGlzdGVuZXJcclxuXHJcbiAgX2NoYW5nZXM6IFtdXHJcbiAgKi9cclxuXHJcbiAgY29uc3RydWN0b3Iob3duZXIsIHVybCwgYnVzLCBjaGlsZHJlbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fb3duZXIgPSBvd25lcjtcclxuICAgIF90aGlzLl91cmwgPSB1cmw7XHJcbiAgICBfdGhpcy5fYnVzID0gYnVzO1xyXG4gICAgX3RoaXMuX2NoaWxkcmVuID0gY2hpbGRyZW47XHJcblxyXG4gICAgX3RoaXMuX2NoYW5nZXMgPSBbXTtcclxuICAgIF90aGlzLl9hbGxvY2F0ZUxpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgX2FsbG9jYXRlTGlzdGVuZXJzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fbGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKF90aGlzLl91cmwsIChtc2cpID0+IHtcclxuICAgICAgbG9nLmxvZygnRGF0YVByb3Zpc2lvbmFsLScgKyBfdGhpcy5fdXJsICsgJy1SQ1Y6ICcsIG1zZyk7XHJcbiAgICAgIF90aGlzLl9jaGFuZ2VzLnB1c2gobXNnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8qXHJcbiAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMgPSBbXTtcclxuICAgIGlmIChfdGhpcy5fY2hpbGRyZW4pIHtcclxuICAgICAgbGV0IGNoaWxkQmFzZVVSTCA9IHVybCArICcvY2hpbGRyZW4vJztcclxuICAgICAgX3RoaXMuX2NoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgbGV0IGNoaWxkVVJMID0gY2hpbGRCYXNlVVJMICsgY2hpbGQ7XHJcbiAgICAgICAgbGV0IGxpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihjaGlsZFVSTCwgKG1zZykgPT4ge1xyXG4gICAgICAgICAgLy9pZ25vcmUgbXNnIHNlbnQgYnkgaGltc2VsZlxyXG4gICAgICAgICAgaWYgKG1zZy5mcm9tICE9PSBvd25lcikge1xyXG4gICAgICAgICAgICBsb2cubG9nKG1zZyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcclxuICAgICAgfSk7XHJcbiAgICB9Ki9cclxuICB9XHJcblxyXG4gIF9yZWxlYXNlTGlzdGVuZXJzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fbGlzdGVuZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgLypfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcclxuICAgICAgbGlzdGVuZXIucmVtb3ZlKCk7XHJcbiAgICB9KTsqL1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoaWxkcmVuKCkgeyByZXR1cm4gdGhpcy5fY2hpbGRyZW47IH1cclxuXHJcbiAgYXBwbHkob2JzZXJ2ZXIpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fY2hhbmdlcy5mb3JFYWNoKChjaGFuZ2UpID0+IHtcclxuICAgICAgb2JzZXJ2ZXIuX2NoYW5nZU9iamVjdChvYnNlcnZlci5fc3luY09iaiwgY2hhbmdlKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGF0YVByb3Zpc2lvbmFsO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdTeW5jaGVyJyk7XHJcblxyXG5pbXBvcnQgeyBkZWVwQ2xvbmUsIGRpdmlkZVVSTCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbmltcG9ydCBEYXRhT2JqZWN0UmVwb3J0ZXIgZnJvbSAnLi9EYXRhT2JqZWN0UmVwb3J0ZXInO1xyXG5pbXBvcnQgRGF0YU9iamVjdE9ic2VydmVyIGZyb20gJy4vRGF0YU9iamVjdE9ic2VydmVyJztcclxuaW1wb3J0IERhdGFQcm92aXNpb25hbCBmcm9tICcuL0RhdGFQcm92aXNpb25hbCc7XHJcblxyXG4vKipcclxuKiBUaGUgbWFpbiBjbGFzcyBmb3IgdGhlIHN5bmNoZXIgcGFja2FnZS5cclxuKiBUaGUgU3luY2hlciBpcyBhIHNpbmdsZXRvbiBjbGFzcyBwZXIgSHlwZXJ0eS9VUkwgYW5kIGl0IGlzIHRoZSBvd25lciBvZiBhbGwgY3JlYXRlZCBEYXRhIFN5bmMgT2JqZWN0cyBhY2NvcmRpbmcgdG8gdGhlIFJlcG9ydGVyIC0gT2JzZXJ2ZXIgcGF0dGVybi5cclxuKiBNYWluIGZ1bmN0aW9uYWxpdHkgaXMgdG8gY3JlYXRlIHJlcG9ydGVycyBhbmQgdG8gc3Vic2NyaWJlIHRvIGV4aXN0aW5nIG9uZXMuXHJcbiovXHJcbmNsYXNzIFN5bmNoZXIge1xyXG4gIC8qIHByaXZhdGVcclxuICBfb3duZXI6IFVSTFxyXG4gIF9idXM6IE1pbmlCdXNcclxuXHJcbiAgX3N1YlVSTDogVVJMXHJcblxyXG4gIF9yZXBvcnRlcnM6IDx1cmw6IERhdGFPYmplY3RSZXBvcnRlcj5cclxuICBfb2JzZXJ2ZXJzOiA8dXJsOiBEYXRhT2JqZWN0T2JzZXJ2ZXI+XHJcbiAgX3Byb3Zpc2lvbmFsczogPHVybDogRGF0YVByb3Zpc2lvbmFsPlxyXG5cclxuICAtLS0tZXZlbnQgaGFuZGxlcnMtLS0tXHJcbiAgX29uTm90aWZpY2F0aW9uSGFuZGxlcjogKGV2ZW50KSA9PiB2b2lkXHJcbiAgX29uUmVzdW1lOiAoZXZlbnQpID0+IHZvaWRcclxuICAqL1xyXG5cclxuICAvKipcclxuICAqIENvbnN0cnVjdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIEh5cGVydHkgb3duZXJcclxuICAqIEBwYXJhbSB7SHlwZXJ0eVVSTH0gb3duZXIgLSBIeXBlcnR5IFVSTCBvd25lci4gQW4gVVJMIGFsbG9jYXRlZCBieSB0aGUgcnVudGltZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEh5cGVydHkuXHJcbiAgKiBAcGFyYW0ge01pbmlCdXN9IGJ1cyAtIEFuIGluc3RhbmNlIG9mIHRoZSBNaW5pQnVzIHByb3ZpZGVkIGluIHRoZSBzYW5kYm94LiBXaGVuIGFuIG9iamVjdCAoUmVwb3J0ZXIgb3IgT2JzZXJ2ZWQpIGlzIGNyZWF0ZWQsIHRoZSBTeW5jaGVyTWFuYWdlciB3aWxsIGFkZCBhIGxpc3RlbmVyIGluIHRoZSBNaW5pQnVzIHRvIHJlY2VpdmUvc2VuZCBNZXNzYWdlcyBvZiB0aGF0IG9iamVjdC5cclxuICAqIEBwYXJhbSB7SlNPTn0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBkYXRhLiBUaGUgb25seSByZXF1aXJlZCBmaWVsZCBmb3Igbm93IGlzIHRoZSBydW50aW1lVVJMLlxyXG4gICovXHJcbiAgY29uc3RydWN0b3Iob3duZXIsIGJ1cywgY29uZmlnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9vd25lciA9IG93bmVyO1xyXG4gICAgX3RoaXMuX2J1cyA9IGJ1cztcclxuXHJcbiAgICBfdGhpcy5fc3ViVVJMID0gY29uZmlnLnJ1bnRpbWVVUkwgKyAnL3NtJztcclxuICAgIF90aGlzLl9ydW50aW1lVXJsID0gY29uZmlnLnJ1bnRpbWVVUkw7XHJcblxyXG4gICAgX3RoaXMuX3AycEhhbmRsZXIgPSBjb25maWcucDJwSGFuZGxlcjtcclxuICAgIF90aGlzLl9wMnBSZXF1ZXN0ZXIgPSBjb25maWcucDJwUmVxdWVzdGVyO1xyXG5cclxuICAgIF90aGlzLl9yZXBvcnRlcnMgPSB7fTtcclxuICAgIF90aGlzLl9vYnNlcnZlcnMgPSB7fTtcclxuICAgIF90aGlzLl9wcm92aXNpb25hbHMgPSB7fTtcclxuXHJcbiAgICBidXMuYWRkTGlzdGVuZXIob3duZXIsIChtc2cpID0+IHtcclxuICAgICAgLy9pZ25vcmUgbXNnIHNlbnQgYnkgaGltc2VsZlxyXG4gICAgICBpZiAobXNnLmZyb20gIT09IG93bmVyKSB7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyXSBTeW5jaGVyLVJDVjogJywgbXNnLCBfdGhpcyk7XHJcbiAgICAgICAgc3dpdGNoIChtc2cudHlwZSkge1xyXG4gICAgICAgICAgY2FzZSAnZm9yd2FyZCc6IF90aGlzLl9vbkZvcndhcmQobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdjcmVhdGUnOiBfdGhpcy5fb25SZW1vdGVDcmVhdGUobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdkZWxldGUnOiBfdGhpcy5fb25SZW1vdGVEZWxldGUobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdleGVjdXRlJzogX3RoaXMuX29uRXhlY3V0ZShtc2cpOyBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBUaGUgb3duZXIgb2YgdGhlIFN5bmNoZXIgYW5kIGFsbCBjcmVhdGVkIHJlcG9ydGVycy5cclxuICAqIEB0eXBlIHtIeXBlcnR5VVJMfVxyXG4gICovXHJcbiAgZ2V0IG93bmVyKCkgeyByZXR1cm4gdGhpcy5fb3duZXI7IH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBbGwgb3duZWQgcmVwb3J0ZXJzLCB0aGUgb25lcyB0aGF0IHdlcmUgY3JlYXRlZCBieSBhIGNyZWF0ZVxyXG4gICogQHR5cGUge09iamVjdDxVUkwsIERhdGFPYmplY3RSZXBvcnRlcj59XHJcbiAgKi9cclxuICBnZXQgcmVwb3J0ZXJzKCkgeyByZXR1cm4gdGhpcy5fcmVwb3J0ZXJzOyB9XHJcblxyXG4gIC8qKlxyXG4gICogQWxsIG93bmVkIG9ic2VydmVycywgdGhlIG9uZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgYSBsb2NhbCBzdWJzY3JpcHRpb25cclxuICAqIEB0eXBlIHtPYmplY3Q8VVJMLCBEYXRhT2JqZWN0T2JzZXJ2ZXI+fVxyXG4gICovXHJcbiAgZ2V0IG9ic2VydmVycygpIHsgcmV0dXJuIHRoaXMuX29ic2VydmVyczsgfVxyXG5cclxuICAvKipcclxuICAqIFJlcXVlc3QgYSBEYXRhT2JqZWN0UmVwb3J0ZXIgY3JlYXRpb24uIFRoZSBVUkwgd2lsbCBiZSBiZSByZXF1ZXN0ZWQgYnkgdGhlIGFsbG9jYXRpb24gbWVjaGFuaXNtLlxyXG4gICogQHBhcmFtICB7U2NoZW1hVVJMfSBzY2hlbWEgLSBIeXBlcnR5IENhdGFsb2d1ZSBVUkwgYWRkcmVzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBKU09OLVNjaGVtYSBkZXNjcmliaW5nIHRoZSBEYXRhIE9iamVjdCBzY2hlbWFcclxuICAqIEBwYXJhbSAge0h5cGVydHlVUkxbXX0gb2JzZXJ2ZXJzIC0gTGlzdCBvZiBoeXBlcnRpZXMgdGhhdCBhcmUgcHJlLWF1dGhvcml6ZWQgZm9yIHN1YnNjcmlwdGlvblxyXG4gICogQHBhcmFtICB7SlNPTn0gaW5pdGlhbERhdGEgLSBJbml0aWFsIGRhdGEgb2YgdGhlIHJlcG9ydGVyXHJcbiAgKiBAcGFyYW0gIHtib29sZWFufSBzdG9yZSAtIChPcHRpb25hbCkgaWYgdHJ1ZSwgb2JqZWN0IHdpbGwgYmUgc3RvcmVkIGJ5IHRoZSBydW50aW1lXHJcbiAgKiBAcGFyYW0gIHtib29sZWFufSBwMnAgLSAoT3B0aW9uYWwpIGlmIHRydWUsIGRhdGEgc3luY2hyb25pc2F0aW9uIHN0cmVhbSB3aWxsIHVzZSBwMnAgY29ubmVjdGlvbiBhcyBtdWNoIGFzIHBvc3NpYmxlXHJcbiAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgLSAoT3B0aW9uYWwpIHRoZSBuYW1lIG9mIHRoZSBkYXRhb2JqZWN0XHJcbiAgKiBAcGFyYW0gIHtNZXNzYWdlQm9keUlkZW50aXR5fSBpZGVudGl0eSAtIChvcHRpb25hbCkgaWRlbnRpdHkgZGF0YSB0byBiZSBhZGRlZCB0byBpZGVudGl0eSB0aGUgdXNlciByZXBvcnRlci4gVG8gYmUgdXNlZCBmb3IgbGVnYWN5IGlkZW50aXRpZXMuXHJcbiAgKiBAcGFyYW0gIHtTeW5jTWV0YWRhdGF9IGlucHV0IC0gKG9wdGlvbmFsKSBhbGwgbWV0YWRhdGEgcmVxdWlyZWQgdG8gc3VuYyB0aGUgRGF0YSBPYmplY3QuXHJcbiAgKiBAcmV0dXJuIHtQcm9taXNlPERhdGFPYmplY3RSZXBvcnRlcj59IFJldHVybiBQcm9taXNlIHRvIGEgbmV3IFJlcG9ydGVyLiBUaGUgcmVwb3J0ZXIgY2FuIGJlIGFjY2VwdGVkIG9yIHJlamVjdGVkIGJ5IHRoZSBQRVBcclxuICAqL1xyXG4gIGNyZWF0ZShzY2hlbWEsIG9ic2VydmVycywgaW5pdGlhbERhdGEsIHN0b3JlID0gZmFsc2UsIHAycCA9IGZhbHNlLCBuYW1lID0gJ25vIG5hbWUnLCBpZGVudGl0eSwgaW5wdXQpIHtcclxuXHJcbiAgICBpZiAoIXNjaGVtYSkgdGhyb3cgRXJyb3IoJ1tTeW5jaGVyIC0gQ3JlYXRlXSAtIFlvdSBuZWVkIHNwZWNpZnkgdGhlIGRhdGEgb2JqZWN0IHNjaGVtYScpO1xyXG4gICAgaWYgKCFvYnNlcnZlcnMpIHRocm93IEVycm9yKCdbU3luY2hlciAtIENyZWF0ZV0gLVRoZSBvYnNlcnZlcnMgc2hvdWxkIGJlIGRlZmluZWQnKTtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgaW5wdXQgPSBpbnB1dCB8fCB7fTtcclxuICAgIGxldCBjcmVhdGVJbnB1dCAgPSBPYmplY3QuYXNzaWduKHt9LCBpbnB1dCk7XHJcblxyXG4gICAgY3JlYXRlSW5wdXQucDJwID0gcDJwO1xyXG4gICAgY3JlYXRlSW5wdXQuc3RvcmUgPSBzdG9yZTtcclxuICAgIGNyZWF0ZUlucHV0LnNjaGVtYSA9IHNjaGVtYTtcclxuICAgIGNyZWF0ZUlucHV0LmF1dGhvcmlzZSA9IG9ic2VydmVycztcclxuICAgIGNyZWF0ZUlucHV0LnAycEhhbmRsZXIgPSBfdGhpcy5fcDJwSGFuZGxlcjtcclxuICAgIGNyZWF0ZUlucHV0LnAycFJlcXVlc3RlciA9IF90aGlzLl9wMnBSZXF1ZXN0ZXI7XHJcbiAgICAoaW5pdGlhbERhdGEpID8gY3JlYXRlSW5wdXQuZGF0YSA9IGRlZXBDbG9uZShpbml0aWFsRGF0YSkgOiBjcmVhdGVJbnB1dC5kYXRhID0ge307XHJcbiAgICBjcmVhdGVJbnB1dC5uYW1lID0gbmFtZS5sZW5ndGggPT09IDAgPyAnbm8gbmFtZScgOiBuYW1lO1xyXG4gICAgY3JlYXRlSW5wdXQucmVwb3J0ZXIgPSAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ3JlcG9ydGVyJykgJiYgKCh0eXBlb2YgaW5wdXQucmVwb3J0ZXIpICE9PSAnYm9vbGVhbicpKSA/IGlucHV0LnJlcG9ydGVyIDogX3RoaXMuX293bmVyO1xyXG4gICAgY3JlYXRlSW5wdXQucmVzdW1lID0gZmFsc2U7XHJcbiAgICBpZiAoaW5wdXQpIHtcclxuICAgICAgY3JlYXRlSW5wdXQubXV0dWFsID0gaW5wdXQuaGFzT3duUHJvcGVydHkoJ211dHVhbCcpID8gaW5wdXQubXV0dWFsIDogZmFsc2U7XHJcbiAgICAgIGNyZWF0ZUlucHV0Lm5hbWUgPSBpbnB1dC5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpID8gaW5wdXQubmFtZSA6IGNyZWF0ZUlucHV0Lm5hbWU7XHJcbiAgICB9IGVsc2UgeyBjcmVhdGVJbnB1dC5tdXR1YWwgPSBmYWxzZTsgfVxyXG5cclxuICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgncmV1c2VVUkwnKSkge1xyXG4gICAgICBjcmVhdGVJbnB1dC5yZXNvdXJjZSA9IGlucHV0LnJldXNlVVJMO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpZGVudGl0eSkgICAgICB7IGNyZWF0ZUlucHV0LmlkZW50aXR5ID0gaWRlbnRpdHk7IH1cclxuXHJcbiAgICAvL09iamVjdC5hc3NpZ24oY3JlYXRlSW5wdXQsIHtyZXN1bWU6IGZhbHNlfSk7XHJcbiAgICAvL2RlYnVnZ2VyO1xyXG4vLyAgICBjb25zb2xlLmxvZygnW3N5bmNoZXIgLSBjcmVhdGVdIC0gY3JlYXRlIFJlcG9ydGVyIC0gY3JlYXRlSW5wdXQ6ICcsIGNyZWF0ZUlucHV0KTtcclxuXHJcbiAgICByZXR1cm4gX3RoaXMuX2NyZWF0ZShjcmVhdGVJbnB1dCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFJlcXVlc3QgYSBEYXRhT2JqZWN0UmVwb3J0ZXIgY3JlYXRpb24uIFRoZSBVUkwgd2lsbCBiZSBiZSByZXF1ZXN0ZWQgYnkgdGhlIGFsbG9jYXRpb24gbWVjaGFuaXNtLlxyXG4gICogQHBhcmFtICB7T2JqZWN0fSBjcml0ZXJpYSAtIChvcHRpb25hbCkgaWRlbnRpdHkgZGF0YSB0byBiZSBhZGRlZCB0byBpZGVudGl0eSB0aGUgdXNlciByZXBvcnRlci4gVG8gYmUgdXNlZCBmb3IgbGVnYWN5IGlkZW50aXRpZXMuXHJcbiAgKiBAcmV0dXJuIHtQcm9taXNlPERhdGFPYmplY3RSZXBvcnRlcj5bXX0gUmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEgbGlzdCBvZiBEYXRhT2JqZWN0UmVwb3J0ZXIgdG8gYmUgcmVzdW1lZDtcclxuICAqL1xyXG4gIHJlc3VtZVJlcG9ydGVycyhjcml0ZXJpYSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxvZy5sb2coJ1tzeW5jaGVyIC0gY3JlYXRlXSAtIHJlc3VtZSBSZXBvcnRlciAtIGNyaXRlcmlhOiAnLCBjcml0ZXJpYSk7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihjcml0ZXJpYSwge3Jlc3VtZTogdHJ1ZX0pO1xyXG5cclxuICAgIHJldHVybiBfdGhpcy5fcmVzdW1lQ3JlYXRlKGNyaXRlcmlhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUmVxdWVzdCBhIHN1YnNjcmlwdGlvbiB0byBhbiBleGlzdGVudCByZXBvcnRlciBvYmplY3QuXHJcbiAgKiBAcGFyYW0ge1NjaGVtYVVSTH0gc2NoZW1hIC0gSHlwZXJ0eSBDYXRhbG9ndWUgVVJMIGFkZHJlc3MgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgSlNPTi1TY2hlbWEgZGVzY3JpYmluZyB0aGUgRGF0YSBPYmplY3Qgc2NoZW1hXHJcbiAgKiBAcGFyYW0ge09iamVjdFVSTH0gb2JqVVJMIC0gQWRkcmVzcyBvZiB0aGUgZXhpc3RlbnQgcmVwb3J0ZXIgb2JqZWN0IHRvIGJlIG9ic2VydmVkXHJcbiAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdG9yZT1mYWxzZV0gLSBTYXZlIHRoZSBzdWJzY3JpcHRpb24gb24gdGhlIFN5bmNoZXIgTWFuYWdlciBmb3IgZnVydGhlciByZXN1bWUgKERlZmF1bHQgaXMgZmFsc2UpXHJcbiAgKiBAcGFyYW0ge0Jvb2xlYW59IFtwMnA9ZmFsc2VdIC0gSW5mbyBhYm91dCBpZiBzaG91bGQgdXNlIHAycCBjb25uZWN0aW9uIChEZWZhdWx0IGlzIGZhbHNlKVxyXG4gICogQHBhcmFtIHtCb29sZWFufSBbbXV0dWFsPXRydWVdIC0gSW5mbyBhYm91dCBpZiBtZXNzYWdlcyBvZiB0aGlzIG9iamVjdCBzaG91bGQgYmUgZW5jcnlwdGVkIChEZWZhdWx0IGlzIHRydWUpXHJcbiAgKiBAcGFyYW0gIHtNZXNzYWdlQm9keUlkZW50aXR5fSBpZGVudGl0eSAtIChvcHRpb25hbCkgaWRlbnRpdHkgZGF0YSB0byBiZSBhZGRlZCB0byBpZGVudGl0eSB0aGUgdXNlciByZXBvcnRlci4gVG8gYmUgdXNlZCBmb3IgbGVnYWN5IGlkZW50aXRpZXMuXHJcbiAgKiBAcmV0dXJuIHtQcm9taXNlPERhdGFPYmplY3RPYnNlcnZlcj59IFJldHVybiBQcm9taXNlIHRvIGEgbmV3IG9ic2VydmVyLiBJdCdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwb3J0ZXIuXHJcbiAgKi9cclxuXHJcbiAgc3Vic2NyaWJlKGlucHV0KSB7XHJcbiAgLyogIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgY3JpdGVyaWEgPSB7fTtcclxuXHJcbiAgICBjcml0ZXJpYS5wMnAgPSBwMnA7XHJcbiAgICBjcml0ZXJpYS5zdG9yZSA9IHN0b3JlO1xyXG4gICAgY3JpdGVyaWEuc2NoZW1hID0gc2NoZW1hO1xyXG4gICAgY3JpdGVyaWEuZG9tYWluX3N1YnNjcmlwdGlvbiA9IGRvbWFpbl9zdWJzY3JpcHRpb247XHJcblxyXG4gICAgY3JpdGVyaWEucmVzb3VyY2UgPSBvYmpVUkw7XHJcbiAgICBpZiAoaWRlbnRpdHkpICAgICAgeyBjcml0ZXJpYS5pZGVudGl0eSA9IGlkZW50aXR5OyB9XHJcblxyXG4gICAgLy9UT0RPOiBGb3IgRnVydGhlciBTdHVkeVxyXG4gICAgY3JpdGVyaWEubXV0dWFsID0gbXV0dWFsO1xyXG5cclxuICAgIGxvZy5sb2coJ1tzeW5jaGVyIC0gc3Vic2NyaWJlXSAtIHN1YnNjcmliZSBjcml0ZXJpYTogJywgY3JpdGVyaWEpO1xyXG5cclxuICAgIE9iamVjdC5hc3NpZ24oY3JpdGVyaWEsIHtyZXN1bWU6IGZhbHNlfSk7Ki9cclxuXHJcbiAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlKGlucHV0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUmVxdWVzdCBhIHN1YnNjcmlwdGlvbiB0byBhbiBleGlzdGVudCByZXBvcnRlciBvYmplY3QuXHJcbiAgKiBAcGFyYW0ge2NyaXRlcmlhfSBjcml0ZXJpYSAtIEluZm9ybWF0aW9uIHRvIGRpc2NvdmVyeSB0aGUgb2JzZXJ2ZXIgb2JqZWN0XHJcbiAgKiBAcmV0dXJuIHtQcm9taXNlPERhdGFPYmplY3RPYnNlcnZlcj59IFJldHVybiBQcm9taXNlIHRvIGEgbmV3IG9ic2VydmVyLiBJdCdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwb3J0ZXIuXHJcbiAgKi9cclxuICByZXN1bWVPYnNlcnZlcnMoY3JpdGVyaWEpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgX2NyaXRlcmlhID0gY3JpdGVyaWEgfHwge307XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihfY3JpdGVyaWEsIHtyZXN1bWU6IHRydWV9KTtcclxuXHJcbiAgICByZXR1cm4gX3RoaXMuX3Jlc3VtZVN1YnNjcmliZShfY3JpdGVyaWEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBSZXF1ZXN0IGEgcmVhZCBhY3Rpb24gb24gdGhlIHJlcG9ydGVyIG9iamVjdFxyXG4gICogQHBhcmFtIHtPYmplY3RVUkx9IG9ialVSTCAtIFVSTCBvZiB0aGUgcmVwb3J0ZXIgb2JqZWN0IHRvIGJlIHJlYWRcclxuICAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0Pn0gUmV0dXJuIFByb21pc2UgdG8gbGFzdCBhdmFpbGFibGUgZGF0YSBvZiB0aGUgcmVwb3J0ZXJcclxuICAqL1xyXG4gIHJlYWQob2JqVVJMLCBjcml0ZXJpYSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGNvbnNvbGUubG9nKCdbU3luY2hlci5yZWFkXSAnLCBvYmpVUkwpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgLy8gaW4gY2FzZSB0aGUgb2JqZWN0IGlzIHN5bmNoZWQgaW4gYSByZW1vdGUgc3RvcmFnZSwgbGV0cyBzeW5jIHdpdGggaXRcclxuLyogICAgICBpZiAoX3RoaXMuX29ic2VydmVyc1tvYmpVUkxdICYmIF90aGlzLl9vYnNlcnZlcnNbb2JqVVJMXS5tZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eSgnYmFja3VwJykgJiYgX3RoaXMuX29ic2VydmVyc1tvYmpVUkxdLm1ldGFkYXRhLmJhY2t1cCkge1xyXG5cclxuICAgICAgICBsZXQgcmVhZE1zZyA9IHtcclxuICAgICAgICAgIHR5cGU6ICdyZWFkJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N1YlVSTCwgXHJcbiAgICAgICAgICBib2R5OiB7IHJlc291cmNlOiBvYmpVUkx9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGNyaXRlcmlhKSByZWFkTXNnLmJvZHkuY3JpdGVyaWEgPSBjcml0ZXJpYTtcclxuXHJcbiAgICAgICAgICBsZXQgY2FsbGJhY2sgPSAocmVwbHkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9yZWFkQ2FsbEJhY2socmVwbHksIHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgICAgICB9O1xyXG4gICAgXHJcbiAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlYWRNc2csIGNhbGxiYWNrLCBmYWxzZSk7XHJcbiAgICBcclxuICAgICAgfSBlbHNlIHsqL1xyXG4gICAgICAgIF90aGlzLl9yZWFkUmVwb3J0ZXIob2JqVVJMKS50aGVuKChyZXN1bHQpPT4ge1xyXG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgfSk7XHJcbi8vICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBfcmVhZENhbGxCYWNrKHJlcGx5LCByZXNvbHZlLHJlamVjdCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKCdbU3luY2hlci5yZWFkXSByZXBseTogJywgcmVwbHkpO1xyXG5cclxuICAgICAgbGV0IGNoaWxkcmVucyA9IHt9O1xyXG4gICAgICBsZXQgdmFsdWUgPSB7fTtcclxuICAgICAgbGV0IG4gPSAwO1xyXG5cclxuICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA8IDMwMCkge1xyXG4gICAgICAgIGlmICghcmVwbHkuYm9keS52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgncmVzcG9uc2VzJykpIHtcclxuICAgICAgICAgIF90aGlzLl9idXMucmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcihyZXBseS5mcm9tLCByZXBseS5pZCk7XHJcbiAgICAgICAgICByZXNvbHZlKHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7IC8vZGF0YSBvYmplY3QgaXMgc2VudCBpbiBzZXBhcmF0ZWQgbWVzc2FnZXNcclxuICAgICAgICAgIGlmIChuID09PSAwKSB7IC8vaW5pdGlhbCByZXNwb25zZSB3aXRob3V0IGNoaWxkcmVuc1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHJlcGx5LmJvZHkudmFsdWU7XHJcbiAgICAgICAgICAgICsrbjtcclxuICAgICAgICAgIH0gZWxzZSB7IC8vIHJlY2VpdmVkIHJlc3BvbnNlIGNvbnRhaW5zIGNoaWxkcmVuc1xyXG4gICAgICAgICAgICBkZWxldGUgcmVwbHkuYm9keS52YWx1ZS5yZXNwb25zZXM7XHJcbiAgICAgICAgICAgIGxldCBjaGlsZHJlbjtcclxuICAgICAgICAgICAgZm9yIChjaGlsZHJlbiBpbiByZXBseS5ib2R5LnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbnMuaGFzT3duUHJvcGVydHkoY2hpbGRyZW4pKSBjaGlsZHJlbnNbY2hpbGRyZW5dID0ge307XHJcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjaGlsZHJlbnNbY2hpbGRyZW5dLCByZXBseS5ib2R5LnZhbHVlW2NoaWxkcmVuXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKytuO1xyXG4gICAgICAgICAgICBpZiAobiA9PT0gdmFsdWUucmVzcG9uc2VzKSB7XHJcbiAgICAgICAgICAgICAgdmFsdWUuY2hpbGRyZW5PYmplY3RzID0gY2hpbGRyZW5zO1xyXG4gICAgICAgICAgICAgIGRlbGV0ZSB2YWx1ZS5yZXNwb25zZXM7XHJcbiAgICAgICAgICAgICAgX3RoaXMuX2J1cy5yZW1vdmVSZXNwb25zZUxpc3RlbmVyKHJlcGx5LmZyb20sIHJlcGx5LmlkKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIHJlamVjdChyZXBseS5ib2R5LmRlc2MpO1xyXG4gICAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgX3JlYWRSZXBvcnRlcihvYmpVUkwpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy9GTE9XLU9VVDogdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byByZXBvcnRlciBvYmplY3QgKG1heWJlIHRoZXJlIGlzIG5vIGxpc3RlbmVyIGF2YWlsYWJsZSwgc28gaXQgd2lsbCBiZSByZXNvbHZlZCB3aXRoIE1lc3NhZ2VCdXMgLT4gcmVzb2x2ZSlcclxuICAgIC8vd2lsbCByZWFjaCB0aGUgcmVtb3RlIG9iamVjdCBpbiBEYXRhT2JqZWN0UmVwb3J0ZXIgLT4gX29uUmVhZFxyXG4gICAgbGV0IHJlYWRNc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogb2JqVVJMXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlYWRNc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBfdGhpcy5fcmVhZENhbGxCYWNrKHJlcGx5LCByZXNvbHZlLCByZWplY3QpO1xyXG4gICAgICB9LCBmYWxzZSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIGNyZWF0ZSBhbmQgZGVsZXRlIGV2ZW50cyBvZiByZW1vdmUgUmVwb3J0ZXIgb2JqZWN0cy5cclxuICAqIFRoaXMgaXMgcmVsZWF0ZWQgdG8gdGhlIG1lc3NhZ2VucyBzZW50IGJ5IGNyZWF0ZSB0byB0aGUgb2JzZXJ2ZXJzIEh5cGVydHkgYXJyYXkuXHJcbiAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrXHJcbiAgKi9cclxuICBvbk5vdGlmaWNhdGlvbihjYWxsYmFjaykge1xyXG4gICAgdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIGNsb3NlIGV2ZW50cyBmcm9tIHRoZSBydW50aW1lLlxyXG4gICogQHBhcmFtIHtmdW5jdGlvbihldmVudDogTXNnRXZlbnQpfSBjYWxsYmFja1xyXG4gICovXHJcbiAgb25DbG9zZShjYWxsYmFjaykge1xyXG4gICAgdGhpcy5fb25DbG9zZSA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgX2NyZWF0ZShpbnB1dCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgbGV0IHJlcG9ydGVySW5wdXQgID0gT2JqZWN0LmFzc2lnbih7fSwgaW5wdXQpO1xyXG5cclxuICAgICAgbGV0IHJlc3VtZSA9IGlucHV0LnJlc3VtZTtcclxuXHJcbiAgICAgIHJlcG9ydGVySW5wdXQuY3JlYXRlZCA9IChuZXcgRGF0ZSkudG9JU09TdHJpbmcoKTtcclxuICAgICAgcmVwb3J0ZXJJbnB1dC5ydW50aW1lID0gX3RoaXMuX3J1bnRpbWVVcmw7XHJcblxyXG4gICAgICBsZXQgcmVxdWVzdFZhbHVlID0gZGVlcENsb25lKHJlcG9ydGVySW5wdXQpO1xyXG5cclxuICAgICAgZGVsZXRlIHJlcXVlc3RWYWx1ZS5wMnA7XHJcbiAgICAgIGRlbGV0ZSByZXF1ZXN0VmFsdWUuc3RvcmU7XHJcbiAgICAgIGRlbGV0ZSByZXF1ZXN0VmFsdWUub2JzZXJ2ZXJzO1xyXG4gICAgICBkZWxldGUgcmVxdWVzdFZhbHVlLmlkZW50aXR5O1xyXG5cclxuICAgICAgLy9GTE9XLU9VVDogdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcnVudGltZSBpbnN0YW5jZSBvZiBTeW5jaGVyTWFuYWdlciAtPiBfb25DcmVhdGVcclxuICAgICAgLy9kZWJ1Z2dlcjtcclxuICAgICAgbGV0IHJlcXVlc3RNc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsIGZyb206IF90aGlzLl9vd25lciwgdG86IF90aGlzLl9zdWJVUkwsXHJcbiAgICAgICAgYm9keTogeyByZXN1bWU6IHJlc3VtZSwgdmFsdWU6IHJlcXVlc3RWYWx1ZSAgfVxyXG4gICAgICB9O1xyXG5cclxuXHJcbiAgICAgIHJlcXVlc3RNc2cuYm9keS5zY2hlbWEgPSByZXBvcnRlcklucHV0LnNjaGVtYTtcclxuXHJcbiAgICAgIGlmIChyZXBvcnRlcklucHV0LnAycCkgcmVxdWVzdE1zZy5ib2R5LnAycCA9IHJlcG9ydGVySW5wdXQucDJwO1xyXG4gICAgICBpZiAocmVwb3J0ZXJJbnB1dC5zdG9yZSkgcmVxdWVzdE1zZy5ib2R5LnN0b3JlID0gcmVwb3J0ZXJJbnB1dC5zdG9yZTtcclxuICAgICAgaWYgKHJlcG9ydGVySW5wdXQuaWRlbnRpdHkpIHJlcXVlc3RNc2cuYm9keS5pZGVudGl0eSA9IHJlcG9ydGVySW5wdXQuaWRlbnRpdHk7XHJcblxyXG4gICAgICBjb25zb2xlLmxvZygnW3N5bmNoZXIuX2NyZWF0ZV06ICcsIHJlcG9ydGVySW5wdXQsIHJlcXVlc3RNc2cpO1xyXG5cclxuICAgICAgLy9yZXF1ZXN0IGNyZWF0ZSB0byB0aGUgYWxsb2NhdGlvbiBzeXN0ZW0uIENhbiBiZSByZWplY3RlZCBieSB0aGUgUG9saWN5RW5naW5lLlxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlcXVlc3RNc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgIGxvZy5sb2coJ1tzeW5jaGVyIC0gY3JlYXRlXSAtIGNyZWF0ZS1yZXNwb25zZTogJywgcmVwbHkpO1xyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgLy9yZXBvcnRlciBjcmVhdGlvbiBhY2NlcHRlZFxyXG4gICAgICAgICAgcmVwb3J0ZXJJbnB1dC51cmwgPSByZXBseS5ib2R5LnJlc291cmNlO1xyXG5cclxuLyogICAgICAgICAgaWYgKHJlcGx5LmJvZHkucDJwSGFuZGxlcikgcmVwb3J0ZXJJbnB1dC5wMnBIYW5kbGVyID0gcmVwbHkuYm9keS5wMnBIYW5kbGVyO1xyXG4gICAgICAgICAgaWYgKHJlcGx5LmJvZHkucDJwUmVxdWVzdGVyKSByZXBvcnRlcklucHV0LnAycFJlcXVlc3RlciA9IHJlcGx5LmJvZHkucDJwUmVxdWVzdGVyOyovXHJcblxyXG4gICAgICAgICAgcmVwb3J0ZXJJbnB1dC5zdGF0dXMgPSAnbGl2ZSc7Ly8gcGNoOiBkbyB3ZSBuZWQgdGhpcz9cclxuICAgICAgICAgIHJlcG9ydGVySW5wdXQuc3luY2hlciA9IF90aGlzO1xyXG4gICAgICAgICAgcmVwb3J0ZXJJbnB1dC5jaGlsZHJlbnMgPSByZXBseS5ib2R5LmNoaWxkcmVuUmVzb3VyY2VzO1xyXG5cclxuICAgICAgICAgIGxldCBuZXdPYmogPSBfdGhpcy5fcmVwb3J0ZXJzW3JlcG9ydGVySW5wdXQudXJsXTtcclxuXHJcbiAgICAgICAgICBpZiAoIW5ld09iaikge1xyXG4gICAgICAgICAgICBuZXdPYmogPSBuZXcgRGF0YU9iamVjdFJlcG9ydGVyKHJlcG9ydGVySW5wdXQpO1xyXG4gICAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXJzW3JlcG9ydGVySW5wdXQudXJsXSA9IG5ld09iajtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBuZXdPYmouaW52aXRlT2JzZXJ2ZXJzKGlucHV0LmF1dGhvcmlzZSwgaW5wdXQucDJwKTtcclxuXHJcbiAgICAgICAgICByZXNvbHZlKG5ld09iaik7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL3JlcG9ydGVyIGNyZWF0aW9uIHJlamVjdGVkXHJcbiAgICAgICAgICByZWplY3QocmVwbHkuYm9keS5kZXNjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgX3Jlc3VtZUNyZWF0ZShjcml0ZXJpYSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZXQgcmVzdW1lID0gY3JpdGVyaWEucmVzdW1lO1xyXG5cclxuICAgICAgLy9GTE9XLU9VVDogdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcnVudGltZSBpbnN0YW5jZSBvZiBTeW5jaGVyTWFuYWdlciAtPiBfb25DcmVhdGVcclxuICAgICAgbGV0IHJlcXVlc3RNc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsIGZyb206IF90aGlzLl9vd25lciwgdG86IF90aGlzLl9zdWJVUkwsXHJcbiAgICAgICAgYm9keTogeyByZXN1bWU6IHJlc3VtZSB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsb2cubG9nKCdbc3luY2hlciAtIGNyZWF0ZV06ICcsIGNyaXRlcmlhLCByZXF1ZXN0TXNnKTtcclxuICAgICAgaWYgKGNyaXRlcmlhKSB7XHJcbiAgICAgICAgcmVxdWVzdE1zZy5ib2R5LnZhbHVlID0gY3JpdGVyaWE7XHJcbiAgICAgICAgaWYgKGNyaXRlcmlhLmhhc093blByb3BlcnR5KCdyZXBvcnRlcicpKSB7XHJcbiAgICAgICAgICByZXF1ZXN0TXNnLmJvZHkudmFsdWUucmVwb3J0ZXIgPSBjcml0ZXJpYS5yZXBvcnRlcjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVxdWVzdE1zZy5ib2R5LnZhbHVlLnJlcG9ydGVyID0gX3RoaXMuX293bmVyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNyaXRlcmlhLnAycCkgcmVxdWVzdE1zZy5ib2R5LnAycCA9IGNyaXRlcmlhLnAycDtcclxuICAgICAgaWYgKGNyaXRlcmlhLnN0b3JlKSByZXF1ZXN0TXNnLmJvZHkuc3RvcmUgPSBjcml0ZXJpYS5zdG9yZTtcclxuICAgICAgaWYgKGNyaXRlcmlhLm9ic2VydmVycykgcmVxdWVzdE1zZy5ib2R5LmF1dGhvcmlzZSA9IGNyaXRlcmlhLm9ic2VydmVycztcclxuICAgICAgaWYgKGNyaXRlcmlhLmlkZW50aXR5KSByZXF1ZXN0TXNnLmJvZHkuaWRlbnRpdHkgPSBjcml0ZXJpYS5pZGVudGl0eTtcclxuXHJcbiAgICAgIGxvZy5sb2coJ1tzeW5jaGVyLl9yZXN1bWVDcmVhdGVdIC0gcmVzdW1lIG1lc3NhZ2U6ICcsIHJlcXVlc3RNc2cpO1xyXG5cclxuICAgICAgLy9kZWJ1Z2dlcjtcclxuXHJcbiAgICAgIC8vcmVxdWVzdCBjcmVhdGUgdG8gdGhlIGFsbG9jYXRpb24gc3lzdGVtLiBDYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIFBvbGljeUVuZ2luZS5cclxuXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVxdWVzdE1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZygnW3N5bmNoZXIuX3Jlc3VtZUNyZWF0ZV0gLSBjcmVhdGUtcmVzdW1lZC1yZXNwb25zZTogJywgcmVwbHkpO1xyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgLy9kZWJ1Z2dlcjtcclxuICAgICAgICAgIGxldCBsaXN0T2ZSZXBvcnRlcnMgPSByZXBseS5ib2R5LnZhbHVlO1xyXG5cclxuICAgICAgICAgIGZvciAobGV0IGluZGV4IGluIGxpc3RPZlJlcG9ydGVycykge1xyXG5cclxuICAgICAgICAgICAgbGV0IGRhdGFPYmplY3QgPSBsaXN0T2ZSZXBvcnRlcnNbaW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgLy9yZXBvcnRlciBjcmVhdGlvbiBhY2NlcHRlZFxyXG5cclxuICAgICAgICAgICAgZGF0YU9iamVjdC5kYXRhID0gZGVlcENsb25lKGRhdGFPYmplY3QuZGF0YSkgfHwge307XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpIHsgZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMgPSBkZWVwQ2xvbmUoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpOyB9XHJcblxyXG4gICAgICAgICAgICBkYXRhT2JqZWN0Lm11dHVhbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBkYXRhT2JqZWN0LnJlc3VtZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGRhdGFPYmplY3Quc3RhdHVzID0gJ2xpdmUnOy8vIHBjaDogZG8gd2UgbmVkIHRoaXM/XHJcbiAgICAgICAgICAgIGRhdGFPYmplY3Quc3luY2hlciA9IF90aGlzO1xyXG5cclxuICAgICAgICAgICAgbG9nLmxvZygnW3N5bmNoZXIuX3Jlc3VtZUNyZWF0ZV0gLSBjcmVhdGUtcmVzdW1lZC1kYXRhT2JqZWN0UmVwb3J0ZXInLCBkYXRhT2JqZWN0KTtcclxuXHJcbiAgICAgICAgICAgIGxldCBuZXdPYmogPSBuZXcgRGF0YU9iamVjdFJlcG9ydGVyKGRhdGFPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuY2hpbGRyZW5PYmplY3RzKSB7XHJcbiAgICAgICAgICAgICAgbmV3T2JqLnJlc3VtZUNoaWxkcmVucyhkYXRhT2JqZWN0LmNoaWxkcmVuT2JqZWN0cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMuX3JlcG9ydGVyc1tkYXRhT2JqZWN0LnVybF0gPSBuZXdPYmo7XHJcblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlc29sdmUoX3RoaXMuX3JlcG9ydGVycyk7XHJcbiAgICAgICAgICBpZiAodGhpcy5fb25SZXBvcnRlcnNSZXN1bWUpIHRoaXMuX29uUmVwb3J0ZXJzUmVzdW1lKHRoaXMuX3JlcG9ydGVycyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAocmVwbHkuYm9keS5jb2RlID09PSA0MDQpIHtcclxuICAgICAgICAgIHJlc29sdmUoe30pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL3JlcG9ydGVyIGNyZWF0aW9uIHJlamVjdGVkXHJcbiAgICAgICAgICByZWplY3QocmVwbHkuYm9keS5kZXNjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfc3Vic2NyaWJlKGlucHV0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBydW50aW1lIGluc3RhbmNlIG9mIFN5bmNoZXJNYW5hZ2VyIC0+IF9vbkxvY2FsU3Vic2NyaWJlXHJcbiAgICAgIGxldCBzdWJzY3JpYmVNc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ3N1YnNjcmliZScsIGZyb206IF90aGlzLl9vd25lciwgdG86IF90aGlzLl9zdWJVUkwsXHJcbiAgICAgICAgYm9keTogaW5wdXRcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIEh5cGVydHkgcmVxdWVzdCB0byBiZSBhbiBPYnNlcnZlclxyXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L3NwZWNzL2Jsb2IvbWFzdGVyL21lc3NhZ2VzL2RhdGEtc3luYy1tZXNzYWdlcy5tZCNoeXBlcnR5LXJlcXVlc3QtdG8tYmUtYW4tb2JzZXJ2ZXJcclxuXHJcbiAgICAgIC8vIFJlc3VtZSBTdWJzY3JpcHRpb25zIGZvciB0aGUgc2FtZSBIeXBlcnR5IFVSTFxyXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L3NwZWNzL2Jsb2IvbWFzdGVyL21lc3NhZ2VzL2RhdGEtc3luYy1tZXNzYWdlcy5tZCNyZXN1bWUtc3Vic2NyaXB0aW9ucy1mb3ItdGhlLXNhbWUtaHlwZXJ0eS11cmxcclxuXHJcbiAgICAgIC8vIFJlc3VtZSBTdWJzY3JpcHRpb25zIGZvciBhIGNlcnRhaW4gdXNlciBhbmQgZGF0YSBzY2hlbWEgaW5kZXBlbmRlbnRseSBvZiB0aGUgSHlwZXJ0eSBVUkwuXHJcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3Qvc3BlY3MvYmxvYi9tYXN0ZXIvbWVzc2FnZXMvZGF0YS1zeW5jLW1lc3NhZ2VzLm1kI3Jlc3VtZS1zdWJzY3JpcHRpb25zLWZvci1hLWNlcnRhaW4tdXNlci1hbmQtZGF0YS1zY2hlbWEtaW5kZXBlbmRlbnRseS1vZi10aGUtaHlwZXJ0eS11cmxcclxuLyogICAgICBpZiAoaW5wdXQpIHtcclxuICAgICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ3AycCcpKSBzdWJzY3JpYmVNc2cuYm9keS5wMnAgPSBpbnB1dC5wMnA7XHJcbiAgICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCdzdG9yZScpKSBzdWJzY3JpYmVNc2cuYm9keS5zdG9yZSA9IGlucHV0LnN0b3JlO1xyXG4gICAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgnc2NoZW1hJykpIHN1YnNjcmliZU1zZy5ib2R5LnNjaGVtYSA9IGlucHV0LnNjaGVtYTtcclxuICAgICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ2lkZW50aXR5JykpIHN1YnNjcmliZU1zZy5ib2R5LmlkZW50aXR5ID0gaW5wdXQuaWRlbnRpdHk7XHJcbiAgICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCdyZXNvdXJjZScpKSBzdWJzY3JpYmVNc2cuYm9keS5yZXNvdXJjZSA9IGlucHV0LnJlc291cmNlO1xyXG4gICAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgnZG9tYWluX3N1YnNjcmlwdGlvbicpKSBzdWJzY3JpYmVNc2cuYm9keS5kb21haW5fc3Vic2NyaXB0aW9uID0gaW5wdXQuZG9tYWluX3N1YnNjcmlwdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBcclxuXHJcbiAgICAgIHN1YnNjcmliZU1zZy5ib2R5LnJlc3VtZSA9IGlucHV0LnJlc3VtZTtcclxuXHJcbiAgICAgIC8vVE9ETzogRm9yIEZ1cnRoZXIgU3R1ZHlcclxuICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSkgc3Vic2NyaWJlTXNnLmJvZHkubXV0dWFsID0gaW5wdXQubXV0dWFsOyovXHJcblxyXG4gICAgICBsb2cubG9nKCdbc3luY2hlcl9zdWJzY3JpYmVdIC0gc3Vic2NyaWJlIG1lc3NhZ2U6ICcsIGlucHV0LCBzdWJzY3JpYmVNc2cpO1xyXG5cclxuICAgICAgLy9yZXF1ZXN0IHN1YnNjcmlwdGlvblxyXG4gICAgICAvL1Byb3Zpc2lvbmFsIGRhdGEgaXMgYXBwbGllZCB0byB0aGUgRGF0YU9iamVjdE9ic2VydmVyIGFmdGVyIGNvbmZpcm1hdGlvbi4gT3IgZGlzY2FyZGVkIGlmIHRoZXJlIGlzIG5vIGNvbmZpcm1hdGlvbi5cclxuICAgICAgLy9mb3IgbW9yZSBpbmZvIHNlZSB0aGUgRGF0YVByb3Zpc2lvbmFsIGNsYXNzIGRvY3VtZW50YXRpb24uXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoc3Vic2NyaWJlTXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdbc3luY2hlcl0gLSBzdWJzY3JpYmUtcmVzcG9uc2U6ICcsIHJlcGx5KTtcclxuXHJcbiAgICAgICAgbGV0IG9ialVSTCA9IHJlcGx5LmJvZHkucmVzb3VyY2U7XHJcblxyXG4gICAgICAgIGxldCBuZXdQcm92aXNpb25hbCA9IF90aGlzLl9wcm92aXNpb25hbHNbb2JqVVJMXTtcclxuICAgICAgICBkZWxldGUgX3RoaXMuX3Byb3Zpc2lvbmFsc1tvYmpVUkxdO1xyXG4gICAgICAgIGlmIChuZXdQcm92aXNpb25hbCkgbmV3UHJvdmlzaW9uYWwuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA8IDIwMCkge1xyXG4gICAgICAgICAgbG9nLmxvZygnW3N5bmNoZXJdIC0gbmV3IERhdGFQcm92aXNpb25hbDogJywgcmVwbHkuYm9keS5jaGlsZHJlblJlc291cmNlcywgb2JqVVJMKTtcclxuICAgICAgICAgIG5ld1Byb3Zpc2lvbmFsID0gbmV3IERhdGFQcm92aXNpb25hbChfdGhpcy5fb3duZXIsIG9ialVSTCwgX3RoaXMuX2J1cywgcmVwbHkuYm9keS5jaGlsZHJlblJlc291cmNlcyk7XHJcbiAgICAgICAgICBfdGhpcy5fcHJvdmlzaW9uYWxzW29ialVSTF0gPSBuZXdQcm92aXNpb25hbDtcclxuICAgICAgICB9IGVsc2UgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICBsb2cubG9nKCdbc3luY2hlcl0gLSBuZXcgRGF0YSBPYmplY3QgT2JzZXJ2ZXI6ICcsIHJlcGx5LCBfdGhpcy5fcHJvdmlzaW9uYWxzKTtcclxuXHJcbiAgICAgICAgICBsZXQgb2JzZXJ2ZXJJbnB1dCA9IHJlcGx5LmJvZHkudmFsdWU7XHJcblxyXG4gICAgICAgICAgb2JzZXJ2ZXJJbnB1dC5zeW5jaGVyID0gX3RoaXM7XHJcbiAgICAgICAgICBvYnNlcnZlcklucHV0LnAycCA9IGlucHV0LnAycDtcclxuICAgICAgICAgIG9ic2VydmVySW5wdXQuc3RvcmUgPSBpbnB1dC5zdG9yZTtcclxuICAgICAgICAgIG9ic2VydmVySW5wdXQuaWRlbnRpdHkgPSBpbnB1dC5pZGVudGl0eTtcclxuICAgICAgICAgIG9ic2VydmVySW5wdXQucmVzdW1lID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy8gdG9kbzogRm9yIEZ1cnRoZXIgU3R1ZHlcclxuICAgICAgICAgIG9ic2VydmVySW5wdXQubXV0dWFsID0gaW5wdXQubXV0dWFsO1xyXG5cclxuICAgICAgICAgIC8vb2JzZXJ2ZXJJbnB1dC5jaGlsZHJlbiA9IG5ld1Byb3Zpc2lvbmFsLmNoaWxkcmVuO1xyXG5cclxuICAgICAgICAgIC8vVE9ETzogbXV0dWFsIEZvciBGdXJ0aGVyIFN0dWR5XHJcbiAgICAgICAgICBsZXQgbmV3T2JqID0gX3RoaXMuX29ic2VydmVyc1tvYmpVUkxdO1xyXG4gICAgICAgICAgaWYgKCFuZXdPYmopIHtcclxuICAgICAgICAgICAgbmV3T2JqID0gbmV3IERhdGFPYmplY3RPYnNlcnZlcihvYnNlcnZlcklucHV0KTtcclxuICAgICAgICAgICAgX3RoaXMuX29ic2VydmVyc1tvYmpVUkxdID0gbmV3T2JqO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbmV3T2JqLnN5bmMoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsb2cubG9nKCdbc3luY2hlcl0gLSBuZXcgRGF0YSBPYmplY3QgT2JzZXJ2ZXIgYWxyZWFkeSBleGlzdDogJywgbmV3T2JqKTtcclxuXHJcbiAgICAgICAgICByZXNvbHZlKG5ld09iaik7XHJcblxyXG4gICAgICAgICAgaWYgKG5ld1Byb3Zpc2lvbmFsKSB7IG5ld1Byb3Zpc2lvbmFsLmFwcGx5KG5ld09iaik7IH1cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmRlc2MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbi8qXHJcbiAgX3Byb2Nlc3NPZmZsaW5lU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgcmVkaXJlY3RUbykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgZm9yd2FyZCA9IHtcclxuICAgICAgZnJvbTogc3Vic2NyaXB0aW9uLmZyb20sXHJcbiAgICAgIHR5cGU6ICdmb3J3YXJkJyxcclxuICAgICAgdG86IHJlZGlyZWN0VG8sXHJcbiAgICAgIGJvZHk6IHN1YnNjcmlwdGlvblxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW1N5bmNoZXIuX3Byb2Nlc3NPZmZsaW5lU3Vic2NyaXB0aW9uXSBmb3J3YWRpbmcgJywgZm9yd2FyZCk7XHJcblxyXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShmb3J3YXJkKTtcclxuXHJcbiAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICBjb2RlOiAzMDIsXHJcbiAgICAgIGRlc2M6IFwiRm91bmQgXCIgKyByZWRpcmVjdFRvXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybihyZXN1bHQpO1xyXG5cclxuICB9Ki9cclxuXHJcblxyXG4gIF9yZXN1bWVTdWJzY3JpYmUoY3JpdGVyaWEpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIC8vRkxPVy1PVVQ6IHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgaW5zdGFuY2Ugb2YgU3luY2hlck1hbmFnZXIgLT4gX29uTG9jYWxTdWJzY3JpYmVcclxuICAgICAgbGV0IHN1YnNjcmliZU1zZyA9IHtcclxuICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N1YlVSTCxcclxuICAgICAgICBib2R5OiB7fVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gSHlwZXJ0eSByZXF1ZXN0IHRvIGJlIGFuIE9ic2VydmVyXHJcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3Qvc3BlY3MvYmxvYi9tYXN0ZXIvbWVzc2FnZXMvZGF0YS1zeW5jLW1lc3NhZ2VzLm1kI2h5cGVydHktcmVxdWVzdC10by1iZS1hbi1vYnNlcnZlclxyXG5cclxuICAgICAgLy8gUmVzdW1lIFN1YnNjcmlwdGlvbnMgZm9yIHRoZSBzYW1lIEh5cGVydHkgVVJMXHJcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3Qvc3BlY3MvYmxvYi9tYXN0ZXIvbWVzc2FnZXMvZGF0YS1zeW5jLW1lc3NhZ2VzLm1kI3Jlc3VtZS1zdWJzY3JpcHRpb25zLWZvci10aGUtc2FtZS1oeXBlcnR5LXVybFxyXG5cclxuICAgICAgLy8gUmVzdW1lIFN1YnNjcmlwdGlvbnMgZm9yIGEgY2VydGFpbiB1c2VyIGFuZCBkYXRhIHNjaGVtYSBpbmRlcGVuZGVudGx5IG9mIHRoZSBIeXBlcnR5IFVSTC5cclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9zcGVjcy9ibG9iL21hc3Rlci9tZXNzYWdlcy9kYXRhLXN5bmMtbWVzc2FnZXMubWQjcmVzdW1lLXN1YnNjcmlwdGlvbnMtZm9yLWEtY2VydGFpbi11c2VyLWFuZC1kYXRhLXNjaGVtYS1pbmRlcGVuZGVudGx5LW9mLXRoZS1oeXBlcnR5LXVybFxyXG4gICAgICBpZiAoY3JpdGVyaWEpIHtcclxuICAgICAgICBpZiAoY3JpdGVyaWEuaGFzT3duUHJvcGVydHkoJ3AycCcpKSBzdWJzY3JpYmVNc2cuYm9keS5wMnAgPSBjcml0ZXJpYS5wMnA7XHJcbiAgICAgICAgaWYgKGNyaXRlcmlhLmhhc093blByb3BlcnR5KCdzdG9yZScpKSBzdWJzY3JpYmVNc2cuYm9keS5zdG9yZSA9IGNyaXRlcmlhLnN0b3JlO1xyXG4gICAgICAgIGlmIChjcml0ZXJpYS5oYXNPd25Qcm9wZXJ0eSgnc2NoZW1hJykpIHN1YnNjcmliZU1zZy5ib2R5LnNjaGVtYSA9IGNyaXRlcmlhLnNjaGVtYTtcclxuICAgICAgICBpZiAoY3JpdGVyaWEuaGFzT3duUHJvcGVydHkoJ2lkZW50aXR5JykpIHN1YnNjcmliZU1zZy5ib2R5LmlkZW50aXR5ID0gY3JpdGVyaWEuaWRlbnRpdHk7XHJcbiAgICAgICAgaWYgKGNyaXRlcmlhLmhhc093blByb3BlcnR5KCdyZXNvdXJjZScpKSBzdWJzY3JpYmVNc2cuYm9keS5yZXNvdXJjZSA9IGNyaXRlcmlhLnJlc291cmNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdWJzY3JpYmVNc2cuYm9keS5yZXN1bWUgPSBjcml0ZXJpYS5yZXN1bWU7XHJcblxyXG4gICAgICAvL1RPRE86IEZvciBGdXJ0aGVyIFN0dWR5XHJcbiAgICAgIGxldCBtdXR1YWwgPSBjcml0ZXJpYS5tdXR1YWw7XHJcbiAgICAgIGlmIChjcml0ZXJpYS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykpIHN1YnNjcmliZU1zZy5ib2R5Lm11dHVhbCA9IG11dHVhbDtcclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKCdbc3luY2hlcl0gLSBzdWJzY3JpYmUgbWVzc2FnZTogJywgY3JpdGVyaWEsIHN1YnNjcmliZU1zZyk7XHJcblxyXG4gICAgICAvL3JlcXVlc3Qgc3Vic2NyaXB0aW9uXHJcbiAgICAgIC8vUHJvdmlzaW9uYWwgZGF0YSBpcyBhcHBsaWVkIHRvIHRoZSBEYXRhT2JqZWN0T2JzZXJ2ZXIgYWZ0ZXIgY29uZmlybWF0aW9uLiBPciBkaXNjYXJkZWQgaWYgdGhlcmUgaXMgbm8gY29uZmlybWF0aW9uLlxyXG4gICAgICAvL2ZvciBtb3JlIGluZm8gc2VlIHRoZSBEYXRhUHJvdmlzaW9uYWwgY2xhc3MgZG9jdW1lbnRhdGlvbi5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShzdWJzY3JpYmVNc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbc3luY2hlcl0gLSBzdWJzY3JpYmUtcmVzdW1lZC1yZXNwb25zZTogJywgcmVwbHkpO1xyXG5cclxuICAgICAgICBsZXQgb2JqVVJMID0gcmVwbHkuYm9keS5yZXNvdXJjZTtcclxuXHJcbiAgICAgICAgbGV0IG5ld1Byb3Zpc2lvbmFsID0gX3RoaXMuX3Byb3Zpc2lvbmFsc1tvYmpVUkxdO1xyXG4gICAgICAgIGRlbGV0ZSBfdGhpcy5fcHJvdmlzaW9uYWxzW29ialVSTF07XHJcbiAgICAgICAgaWYgKG5ld1Byb3Zpc2lvbmFsKSBuZXdQcm92aXNpb25hbC5fcmVsZWFzZUxpc3RlbmVycygpO1xyXG5cclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlIDwgMjAwKSB7IC8vIHRvZG86IGNoZWNrIGlmIHRoaXMgaXMgbmVlZGVkIGZvciB0aGUgcmVzdW1lXHJcblxyXG4gICAgICAgICAgbG9nLmxvZygnW3N5bmNoZXJdIC0gcmVzdW1lIG5ldyBEYXRhUHJvdmlzaW9uYWw6ICcsIHJlcGx5LCBvYmpVUkwpO1xyXG4gICAgICAgICAgbmV3UHJvdmlzaW9uYWwgPSBuZXcgRGF0YVByb3Zpc2lvbmFsKF90aGlzLl9vd25lciwgb2JqVVJMLCBfdGhpcy5fYnVzLCByZXBseS5ib2R5LmNoaWxkcmVuUmVzb3VyY2VzKTtcclxuICAgICAgICAgIF90aGlzLl9wcm92aXNpb25hbHNbb2JqVVJMXSA9IG5ld1Byb3Zpc2lvbmFsO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcblxyXG4gICAgICAgICAgbGV0IGxpc3RPZk9ic2VydmVycyA9IHJlcGx5LmJvZHkudmFsdWU7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggaW4gbGlzdE9mT2JzZXJ2ZXJzKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGF0YU9iamVjdCA9IGxpc3RPZk9ic2VydmVyc1tpbmRleF07XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbc3luY2hlcl0gLSBSZXN1bWUgT2JqZWN0IE9ic2VydmVyOiAnLCByZXBseSwgZGF0YU9iamVjdCwgX3RoaXMuX3Byb3Zpc2lvbmFscyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpIHsgZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMgPSBkZWVwQ2xvbmUoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpOyB9XHJcblxyXG4gICAgICAgICAgICBkYXRhT2JqZWN0LmRhdGEgPSBkZWVwQ2xvbmUoZGF0YU9iamVjdC5kYXRhKSB8fCB7fTtcclxuICAgICAgICAgICAgZGF0YU9iamVjdC5yZXN1bWUgPSB0cnVlO1xyXG4gICAgICAgICAgICBkYXRhT2JqZWN0LnN5bmNoZXIgPSBfdGhpcztcclxuXHJcbiAgICAgICAgICAgIC8vVE9ETzogbXV0dWFsIEZvciBGdXJ0aGVyIFN0dWR5XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbc3luY2hlci5fcmVzdW1lU3Vic2NyaWJlXSAtIGNyZWF0ZSBuZXcgZGF0YU9iamVjdDogJywgZGF0YU9iamVjdCk7XHJcbiAgICAgICAgICAgIGxldCBuZXdPYmogPSBuZXcgRGF0YU9iamVjdE9ic2VydmVyKGRhdGFPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuY2hpbGRyZW5PYmplY3RzKSB7IG5ld09iai5yZXN1bWVDaGlsZHJlbnMoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpOyB9XHJcbiAgICAgICAgICAgIGxvZy5sb2coJ1tzeW5jaGVyLl9yZXN1bWVTdWJzY3JpYmVdIC0gbmV3IGRhdGFPYmplY3QnLCBuZXdPYmopO1xyXG4gICAgICAgICAgICBfdGhpcy5fb2JzZXJ2ZXJzW25ld09iai51cmxdID0gbmV3T2JqO1xyXG5cclxuICAgICAgICAgICAgaWYgKF90aGlzLl9wcm92aXNpb25hbHNbbmV3T2JqLnVybF0pIHtcclxuICAgICAgICAgICAgICBfdGhpcy5fcHJvdmlzaW9uYWxzW25ld09iai51cmxdLmFwcGx5KG5ld09iaik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vbGV0cyBzeW5jIHdpdGggUmVwb3J0ZXJcclxuICAgICAgICAgICAgLy8gaXQgd2FzIGNvbW1lbnRlZCB0byBsZXQgaHlwZXJ0aWVzIGRlY2lkZSB3aGVuIHRvIHN5bmNcclxuICAgICAgICAgICAgLy9uZXdPYmouc3luYygpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlc29sdmUoX3RoaXMuX29ic2VydmVycyk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX29uT2JzZXJ2ZXJzUmVzdW1lKSB0aGlzLl9vbk9ic2VydmVyc1Jlc3VtZShfdGhpcy5fb2JzZXJ2ZXJzKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDQwNCkge1xyXG4gICAgICAgICAgcmVzb2x2ZSh7fSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmRlc2MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIGxvY2FsIHJ1bnRpbWUgUmVwb3J0ZXJPYmplY3QgLT4gX29uUmVtb3RlU3Vic2NyaWJlXHJcbiAgX29uRm9yd2FyZChtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IHJlcG9ydGVyID0gX3RoaXMuX3JlcG9ydGVyc1ttc2cuYm9keS50b107XHJcbiAgICByZXBvcnRlci5fb25Gb3J3YXJkKG1zZyk7XHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIHJlbW90ZSBTeW5jaGVyIC0+IGNyZWF0ZSAodGhpcyBpcyBhY3R1YWxseSBhbiBpbnZpdGF0aW9uIHRvIHN1YnNjcmliZSlcclxuICBfb25SZW1vdGVDcmVhdGUobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IHJlc291cmNlID0gbXNnLmZyb20uc2xpY2UoMCwgLTEzKTsgLy9yZW1vdmUgXCIvc3Vic2NyaXB0aW9uXCIgZnJvbSB0aGUgVVJMXHJcbiAgICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTChyZXNvdXJjZSk7XHJcbiAgICBsZXQgZG9tYWluID0gZGl2aWRlZFVSTC5kb21haW47XHJcblxyXG4gICAgbGV0IGV2ZW50ID0ge1xyXG4gICAgICB0eXBlOiBtc2cudHlwZSxcclxuICAgICAgZnJvbTogbXNnLmJvZHkuc291cmNlLFxyXG4gICAgICB1cmw6IHJlc291cmNlLFxyXG4gICAgICBkb21haW46IGRvbWFpbixcclxuICAgICAgc2NoZW1hOiBtc2cuYm9keS5zY2hlbWEsXHJcbiAgICAgIHZhbHVlOiBtc2cuYm9keS52YWx1ZSxcclxuICAgICAgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LFxyXG5cclxuICAgICAgYWNrOiAodHlwZSkgPT4ge1xyXG4gICAgICAgIGxldCBsVHlwZSA9IDIwMDtcclxuICAgICAgICBpZiAodHlwZSkge1xyXG4gICAgICAgICAgbFR5cGUgPSB0eXBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAvL3NlbmQgYWNrIHJlc3BvbnNlIG1lc3NhZ2VcclxuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgYm9keTogeyBjb2RlOiBsVHlwZSB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKF90aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcclxuICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyXSBOT1RJRklDQVRJT04tRVZFTlQ6ICcsIGV2ZW50KTtcclxuICAgICAgX3RoaXMuX29uTm90aWZpY2F0aW9uSGFuZGxlcihldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIHJlbW90ZSBEYXRhT2JqZWN0UmVwb3J0ZXIgLT4gZGVsZXRlXHJcbiAgX29uUmVtb3RlRGVsZXRlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgIC8vcmVtb3ZlIFwiL3N1YnNjcmlwdGlvblwiIGZyb20gdGhlIFVSTFxyXG4gICAgbGV0IHJlc291cmNlID0gbXNnLmJvZHkucmVzb3VyY2U7XHJcblxyXG4gICAgbGV0IG9iamVjdCA9IF90aGlzLl9vYnNlcnZlcnNbcmVzb3VyY2VdO1xyXG5cclxuICAgIGxldCB1bnN1YnNjcmliZSA9IHtcclxuICAgICAgZnJvbTogX3RoaXMub3duZXIsXHJcbiAgICAgIHRvOiBfdGhpcy5fc3ViVVJMLFxyXG4gICAgICBpZDogbXNnLmlkLFxyXG4gICAgICB0eXBlOiAndW5zdWJzY3JpYmUnLFxyXG4gICAgICBib2R5OiB7IHJlc291cmNlOiBtc2cuYm9keS5yZXNvdXJjZSB9XHJcbiAgICB9O1xyXG5cclxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UodW5zdWJzY3JpYmUpO1xyXG5cclxuICAgIGRlbGV0ZSBfdGhpcy5fb2JzZXJ2ZXJzW3Jlc291cmNlXTtcclxuXHJcbiAgICBpZiAob2JqZWN0KSB7XHJcbiAgICAgIGxldCBldmVudCA9IHtcclxuICAgICAgICB0eXBlOiBtc2cudHlwZSxcclxuICAgICAgICB1cmw6IHJlc291cmNlLFxyXG4gICAgICAgIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSxcclxuXHJcbiAgICAgICAgYWNrOiAodHlwZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGxUeXBlID0gMjAwO1xyXG4gICAgICAgICAgaWYgKHR5cGUpIHtcclxuICAgICAgICAgICAgbFR5cGUgPSB0eXBlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgLy9UT0RPOiBhbnkgb3RoZXIgZGlmZmVyZW50IG9wdGlvbnMgZm9yIHRoZSByZWxlYXNlIHByb2Nlc3MsIGxpa2UgYWNjZXB0IGJ1dCBub3IgcmVsZWFzZSBsb2NhbD9cclxuICAgICAgICAgIGlmIChsVHlwZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC5kZWxldGUoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL3NlbmQgYWNrIHJlc3BvbnNlIG1lc3NhZ2VcclxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcclxuICAgICAgICAgICAgYm9keTogeyBjb2RlOiBsVHlwZSwgc291cmNlOiBfdGhpcy5fb3duZXIgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKF90aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcclxuICAgICAgICBsb2cubG9nKCdOT1RJRklDQVRJT04tRVZFTlQ6ICcsIGV2ZW50KTtcclxuICAgICAgICBfdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyKGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgYm9keTogeyBjb2RlOiA0MDQsIHNvdXJjZTogX3RoaXMuX293bmVyIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBjbG9zZSBldmVudCByZWNlaXZlZCBmcm9tIHJ1bnRpbWUgcmVnaXN0cnlcclxuICBfb25FeGVjdXRlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgcmVwbHkgPSB7XHJcbiAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICBib2R5OiB7IGNvZGU6IDIwMCB9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmICgobXNnLmZyb20gPT09IF90aGlzLl9ydW50aW1lVXJsICsgJy9yZWdpc3RyeS8nIHx8IG1zZy5mcm9tID09PSBfdGhpcy5fcnVudGltZVVybCArICcvcmVnaXN0cnknKSAmJiBtc2cuYm9keSAmJiBtc2cuYm9keS5tZXRob2QgJiYgbXNnLmJvZHkubWV0aG9kID09PSAnY2xvc2UnICYmIF90aGlzLl9vbkNsb3NlKSB7XHJcbiAgICAgIGxldCBldmVudCA9IHtcclxuICAgICAgICB0eXBlOiAnY2xvc2UnLFxyXG5cclxuICAgICAgICBhY2s6ICh0eXBlKSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZSkge1xyXG4gICAgICAgICAgICByZXBseS5ib2R5LmNvZGUgPSB0eXBlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgLy9zZW5kIGFjayByZXNwb25zZSBtZXNzYWdlXHJcbiAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlcGx5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsb2cuaW5mbygnW1N5bmNoZXJdIENsb3NlLUVWRU5UOiAnLCBldmVudCk7XHJcbiAgICAgIF90aGlzLl9vbkNsb3NlKGV2ZW50KTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlcGx5KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIENhbGxiYWNrIHN5c3RlbSB0byB0cmlnZ2VyIHRoZSByZXN1bWVkIHJlcG9ydGVyc1xyXG4gICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIC0gZnVuY3Rpb24gY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBpbnZva2VkXHJcbiAgKiBAcmV0dXJuIHtPYmplY3Q8VVJMLCBEYXRhT2JqZWN0UmVwb3J0ZXI+fSBSZXR1cm4gb25lIG9iamVjdCB3aXRoIGFsbCByZXN1bWVkIHJlcG9ydGVycztcclxuICAqL1xyXG4gIG9uUmVwb3J0ZXJzUmVzdW1lKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9vblJlcG9ydGVyc1Jlc3VtZSA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBDYWxsYmFjayBzeXN0ZW0gdG8gdHJpZ2dlciB0aGUgcmVzdW1lZCBvYnNlcnZlcnNcclxuICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayAtIGZ1bmN0aW9uIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgaW52b2tlZFxyXG4gICogQHJldHVybiB7T2JqZWN0PFVSTCwgRGF0YU9iamVjdE9ic2VydmVyPn0gUmV0dXJuIG9uZSBvYmplY3Qgd2l0aCBhbGwgcmVzdW1lZCBvYnNlcnZlcnM7XHJcbiAgKi9cclxuICBvbk9ic2VydmVyc1Jlc3VtZShjYWxsYmFjaykge1xyXG4gICAgdGhpcy5fb25PYnNlcnZlcnNSZXN1bWUgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTeW5jaGVyO1xyXG4iLCIvKipcclxuKiBUaGUgTm90aXRpZmljYXRpb24gSGFuZGxlciBpcyB1c2VkIHRvIGhhbmRsZSBub3RpZmljYXRpb25zIG5vdCBwcm9jZXNzZWQgYnkgdGhlIHN5bmNoZXIgd2hlbiBydW5uaW5nIGluIGEgc2FuZGJveC5cclxuKi9cclxuXHJcbmltcG9ydCB7IGRpdmlkZVVSTCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbmNsYXNzIE5vdGlmaWNhdGlvbkhhbmRsZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihidXMpIHtcclxuXHJcbiAgICBpZiAoIWJ1cykgdGhyb3cgRXJyb3IoJ1tOb3RpZmljYXRpb25IYW5kbGVyIENvbnN0cnVjdG9yXSBidXMgaW5wdXQgaXMgbWFuZGF0b3J5Jyk7XHJcbiAgICB0aGlzLl9idXMgPSBidXM7XHJcbiAgICB0aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIgPSB7fTtcclxuICB9XHJcblxyXG4gIG9uTm90aWZpY2F0aW9uKHNjaGVtZSwgY2FsbGJhY2spIHtcclxuICAgIHRoaXMuX29uTm90aWZpY2F0aW9uSGFuZGxlcltzY2hlbWVdID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBvbkNyZWF0ZShtc2cpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gIC8vICBsZXQgcmVzb3VyY2UgPSBtc2cuZnJvbS5zbGljZSgwLCAtMTMpOyAvL3JlbW92ZSBcIi9zdWJzY3JpcHRpb25cIiBmcm9tIHRoZSBVUkxcclxuXHJcbiAgICBsZXQgcmVzb3VyY2UgPSBtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgncmVzb3VyY2UnKSA/IG1zZy5ib2R5LnJlc291cmNlIDogbXNnLmZyb20uc2xpY2UoMCwgLTEzKTtcclxuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKHJlc291cmNlKTtcclxuICAgIGxldCBkb21haW4gPSBkaXZpZGVkVVJMLmRvbWFpbjtcclxuICAgIGxldCBzY2hlbWUgPSByZXNvdXJjZS5zcGxpdCgnOi8vJylbMF07XHJcblxyXG4gICAgbGV0IGVycm9yID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcclxuICAgICAgICBib2R5OiB7IGNvZGU6IDQwMCwgZGVzYzogJ0JhZCBSZXF1ZXN0OiAnICsgcmVhc29uIH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGlmICghbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3NvdXJjZScpKSB7IGVycm9yKCdNaXNzaW5nIHNvdXJjZScpOyB9XHJcbiAgICBpZiAoIW1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdzY2hlbWEnKSkgeyBlcnJvcignTWlzc2luZyBzY2hlbWEnKTsgfVxyXG4gICAgaWYgKCFtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkgeyBlcnJvcignTWlzc2luZyB2YWx1ZScpOyB9XHJcbiAgICBpZiAoIW1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdpZGVudGl0eScpKSB7IGVycm9yKCdNaXNzaW5nIGlkZW50aXR5Jyk7IH1cclxuXHJcbiAgICBsZXQgZXZlbnQgPSB7XHJcbiAgICAgIHR5cGU6IG1zZy50eXBlLFxyXG4gICAgICBmcm9tOiBtc2cuYm9keS5zb3VyY2UsXHJcbiAgICAgIHVybDogcmVzb3VyY2UsXHJcbiAgICAgIGRvbWFpbjogZG9tYWluLFxyXG4gICAgICBzY2hlbWE6IG1zZy5ib2R5LnNjaGVtYSxcclxuICAgICAgdmFsdWU6IG1zZy5ib2R5LnZhbHVlLFxyXG4gICAgICBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHksXHJcbiAgICAgIHRvOiBtc2cudG8sXHJcbiAgICAgIHZpYTogbXNnLmJvZHkudmlhLFxyXG5cclxuICAgICAgYWNrOiAodHlwZSkgPT4ge1xyXG4gICAgICAgIGxldCBsVHlwZSA9IDIwMDtcclxuICAgICAgICBpZiAodHlwZSkge1xyXG4gICAgICAgICAgbFR5cGUgPSB0eXBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAvL3NlbmQgYWNrIHJlc3BvbnNlIG1lc3NhZ2VcclxuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgYm9keTogeyBjb2RlOiBsVHlwZSB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgZXJyb3IocmVhc29uKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGlmIChfdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyW3NjaGVtZV0pIHtcclxuICAgICAgY29uc29sZS5pbmZvKCdbTm90aWZpY2F0aW9uSGFuZGxlcl0gTk9USUZJQ0FUSU9OLUVWRU5UOiAnLCBldmVudCk7XHJcbiAgICAgIF90aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXJbc2NoZW1lXShldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRlbGV0ZShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAvL3JlbW92ZSBcIi9zdWJzY3JpcHRpb25cIiBmcm9tIHRoZSBVUkxcclxuICAgIGxldCByZXNvdXJjZSA9IG1zZy5ib2R5LnJlc291cmNlO1xyXG5cclxuICAgIGxldCBvYmplY3QgPSBfdGhpcy5fb2JzZXJ2ZXJzW3Jlc291cmNlXTtcclxuXHJcbiAgICBsZXQgdW5zdWJzY3JpYmUgPSB7XHJcbiAgICAgIGZyb206IF90aGlzLm93bmVyLFxyXG4gICAgICB0bzogX3RoaXMuX3N1YlVSTCxcclxuICAgICAgaWQ6IG1zZy5pZCxcclxuICAgICAgdHlwZTogJ3Vuc3Vic2NyaWJlJyxcclxuICAgICAgYm9keTogeyByZXNvdXJjZTogbXNnLmJvZHkucmVzb3VyY2UgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHVuc3Vic2NyaWJlKTtcclxuXHJcbiAgICBkZWxldGUgX3RoaXMuX29ic2VydmVyc1tyZXNvdXJjZV07XHJcblxyXG4gICAgaWYgKG9iamVjdCkge1xyXG4gICAgICBsZXQgZXZlbnQgPSB7XHJcbiAgICAgICAgdHlwZTogbXNnLnR5cGUsXHJcbiAgICAgICAgdXJsOiByZXNvdXJjZSxcclxuICAgICAgICBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHksXHJcblxyXG4gICAgICAgIGFjazogKHR5cGUpID0+IHtcclxuICAgICAgICAgIGxldCBsVHlwZSA9IDIwMDtcclxuICAgICAgICAgIGlmICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGxUeXBlID0gdHlwZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgIC8vVE9ETzogYW55IG90aGVyIGRpZmZlcmVudCBvcHRpb25zIGZvciB0aGUgcmVsZWFzZSBwcm9jZXNzLCBsaWtlIGFjY2VwdCBidXQgbm9yIHJlbGVhc2UgbG9jYWw/XHJcbiAgICAgICAgICBpZiAobFR5cGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICBvYmplY3QuZGVsZXRlKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy9zZW5kIGFjayByZXNwb25zZSBtZXNzYWdlXHJcbiAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgICAgIGJvZHk6IHsgY29kZTogbFR5cGUsIHNvdXJjZTogX3RoaXMuX293bmVyIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyKSB7XHJcbiAgICAgICAgbG9nLmxvZygnTk9USUZJQ0FUSU9OLUVWRU5UOiAnLCBldmVudCk7XHJcbiAgICAgICAgX3RoaXMuX29uTm90aWZpY2F0aW9uSGFuZGxlcihldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgIGJvZHk6IHsgY29kZTogNDA0LCBzb3VyY2U6IF90aGlzLl9vd25lciB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTm90aWZpY2F0aW9uSGFuZGxlcjtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5pbXBvcnQge2RpdmlkZVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqXHJcbiogQ29yZSBJZGVudGl0eU1hbmFnZXIgaW50ZXJmYWNlXHJcbiogQ2xhc3MgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIHNlYXJjaCBmb3IgSWRlbnRpdGllcyByZWdpc3RlcmVkIGluIHJ1bnRpbWUtY29yZVxyXG4qL1xyXG5jbGFzcyBJZGVudGl0eU1hbmFnZXIge1xyXG5cclxuICAvKipcclxuICAqIFRvIGluaXRpYWxpc2UgdGhlIElkZW50aXR5TWFuYWdlciwgd2hpY2ggd2lsbCBwcm92aWRlIHRoZSBzdXBwb3J0IGZvciBoeXBlcnRpZXMgdG9cclxuICAqIHF1ZXJ5IGFib3V0IGlkZW50aXRpZXMgcmVnaXN0ZXJlZFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICBvd25lciAgICAgICAgICAgIG93bmVyXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgIHJ1bnRpbWVVUkwgICAgICAgICAgICBydW50aW1lVVJMXHJcbiAgKiBAcGFyYW0gIHtNZXNzYWdlQnVzfSAgICAgICAgICBtc2didXMgICAgICAgICAgICAgICAgbXNnYnVzXHJcbiAgKi9cclxuICBjb25zdHJ1Y3Rvcihvd25lciwgcnVudGltZVVSTCwgbXNnQnVzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMubWVzc2FnZUJ1cyA9IG1zZ0J1cztcclxuXHJcbiAgICBfdGhpcy5kb21haW4gPSBkaXZpZGVVUkwob3duZXIpLmRvbWFpbjtcclxuICAgIF90aGlzLm93bmVyID0gb3duZXI7XHJcbiAgICBfdGhpcy5ydW50aW1lVVJMID0gcnVudGltZVVSTDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRnVuY3Rpb24gdG8gcXVlcnkgdGhlIHJ1bnRpbWUgcmVnaXN0cnkgYWJvdXQgdGhlIGlkZW50aXR5IHRvIHdoaWNoIHRoZSBoeXBlcnR5IHdhcyBhc3NvY2lhdGVkXHJcbiAgKiBAcGFyYW0ge1N0cmluZ30gICAgICAgdHlwZSAoT3B0aW9uYWwpICAgICAgICAgdHlwZSBvZiB1c2VyIGluZm8gcmVxdWlyZWRcclxuICAqIEBwYXJhbSB7U3RyaW5nfSAgICAgICBvd25lciAoT3B0aW9uYWwpICAgb3duZXIgdG8gc2VhcmNoIGZvclxyXG4gICogQHJldHVybiB7UHJvbWlzZX0gICAgIHVzZXJVUkwgICAgICAgdXNlclVSTCBhc3NvY2lhdGVkIHRvIHRoZSBoeXBlcnR5XHJcbiAgKi9cclxuICBkaXNjb3ZlclVzZXJSZWdpc3RlcmVkKHR5cGUsIGh5cGVydHkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IGFjdGl2ZUh5cGVydHlVUkw7XHJcblxyXG4gICAgICAvLyBpZiBhbnkgdHlwZSBvZiBzZWFyY2ggaXMgc2VsZWN0ZWQgcXVlcnkgZm9yIHRoYXQgdHlwZSwgb3RoZXJ3aXNlIHF1ZXJ5IGZvciBkZWZhdWx0IHVzZXIgaW5mb1xyXG4gICAgICBsZXQgc2VhcmNoVHlwZSA9ICh0eXBlKSA/IHR5cGUgOiAnLic7XHJcblxyXG4gICAgICBpZiAoIWh5cGVydHkpIHtcclxuICAgICAgICBhY3RpdmVIeXBlcnR5VVJMID0gX3RoaXMub3duZXI7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYWN0aXZlSHlwZXJ0eVVSTCA9IGh5cGVydHk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBhY3RpdmVIeXBlcnR5VVJMLCB0bzogX3RoaXMucnVudGltZVVSTCArICcvcmVnaXN0cnkvJywgYm9keTogeyByZXNvdXJjZTogc2VhcmNoVHlwZSwgY3JpdGVyaWE6IGFjdGl2ZUh5cGVydHlVUkx9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgIGxldCB1c2VyVVJMID0gcmVwbHkuYm9keS5yZXNvdXJjZTtcclxuXHJcbiAgICAgICAgaWYgKHVzZXJVUkwgJiYgcmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHJlc29sdmUodXNlclVSTCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdCgnY29kZTogJyArIHJlcGx5LmJvZHkuY29kZSArICcgTm8gdXNlciB3YXMgZm91bmQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEZ1bmN0aW9uIHRvIHF1ZXJ5IHRoZSBJZGVudGl0eSBNb2R1bGUgYWJvdXQgYXV0aGVudGljYXRlZCBpZGVudGl0aWVzIGZyb20gYSBjZXJ0YWluIGRvbWFpblxyXG4gICogQHBhcmFtIHtTdHJpbmd9ICAgICAgIGlkcCBpZHAgZG9tYWluIG9mIHRoZSBpZGVudGl0eSB0byBiZSBkaXNjb3ZlcmVkXHJcbiAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgaWRlbnRpdHlcclxuICAqL1xyXG5cclxuICBkaXNjb3ZlcklkZW50aXR5UGVySWRQKGlkcCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsZXQgbXNnID0ge1xyXG4gICAgICAgIHR5cGU6ICdyZWFkJywgZnJvbTogdGhpcy5vd25lciwgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2lkbScsIGJvZHk6IHsgcmVzb3VyY2U6IGlkcCwgY3JpdGVyaWE6ICdpZHAnfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHJlc29sdmUocmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmNvZGUgKyAnICcgKyByZXBseS5ib2R5LmRlc2MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IElkZW50aXR5TWFuYWdlcjtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignUmVnaXN0cmF0aW9uU3RhdHVzJyk7XHJcblxyXG5pbXBvcnQgeyBkaXZpZGVVUkwgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKipcclxuKiBUaGUgUmVnaXN0cmF0aW9uU3RhdHVzIGxpYiBhbGxvd3MgdG8gbW9uaXRvciByZWdpc3RyYXRpb24gc3RhdHVzIG9mIGFuIEh5cGVydHkgb3IgRGF0YSBPYmplY3RcclxuKlxyXG4qL1xyXG5jbGFzcyBSZWdpc3RyYXRpb25TdGF0dXMge1xyXG5cclxuICAvKipcclxuICAqIEBwYXJhbSB7VVJMfSB1cmwgVVJMIGFkZHJlc3Mgb2YgdGhlIGVudGl0eSB0byBiZSBtb25pdG9yZWRcclxuICAqIEBwYXJhbSB7VVJMfSBydW50aW1lVVJMIHRoZSBjdXJyZW50IFVSTCBvZiB0aGUgUnVudGltZSBJbnN0YW5jZSB1c2VkXHJcbiAgKiBAcGFyYW0ge0h5cGVydHlVUkx9IG93bmVyIHRoZSBVUkwgb2YgdGhlIEh5cGVydHkgaW5zdGFuY2UgdGhhdCBpcyB1c2luZyB0aGlzIGxpYlxyXG4gICogQHBhcmFtIHtNaW5pQnVzfSBvd25lciB0aGUgVVJMIG9mIHRoZSBIeXBlcnR5IGluc3RhbmNlIHRoYXQgaXMgdXNpbmcgdGhpcyBsaWJcclxuICAqXHJcbiAgKi9cclxuXHJcbiAgY29uc3RydWN0b3IodXJsLCBydW50aW1lVVJMLCBvd25lciwgbXNnQnVzKSB7XHJcbiAgICB0aGlzLl9yZWdpc3RyeU9iamVjdFVSTCA9IHVybDtcclxuICAgIHRoaXMuX3J1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xyXG4gICAgdGhpcy5fZG9tYWluID0gZGl2aWRlVVJMKHJ1bnRpbWVVUkwpLmRvbWFpbjtcclxuICAgIHRoaXMuX2Rpc2NvdmVyZWRPYmplY3RVUkwgPSBvd25lcjtcclxuICAgIHRoaXMuX21lc3NhZ2VCdXMgPSBtc2dCdXM7XHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25TZXQgPSBmYWxzZTtcclxuICAgIHRoaXMuX3N1YnNjcmliZXJzID0ge1xyXG4gICAgICBsaXZlOiB7fSxcclxuICAgICAgZGlzY29ubmVjdGVkOiB7fVxyXG4gICAgfTtcclxuICB9XHJcblxyXG5cclxuICBvbkxpdmUoc3Vic2NyaWJlciwgY2FsbGJhY2spIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgaWYgKCF0aGlzLl9zdWJzY3JpcHRpb25TZXQpIHtcclxuICAgICAgICB0aGlzLl9zdWJzY3JpYmUoKVxyXG4gICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX3N1YnNjcmliZXJzLmxpdmVbc3Vic2NyaWJlcl0gPSBjYWxsYmFjaztcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiByZWplY3QoZXJyKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlcnMubGl2ZVtzdWJzY3JpYmVyXSA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkRpc2Nvbm5lY3RlZChzdWJzY3JpYmVyLCBjYWxsYmFjaykge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuX3N1YnNjcmlwdGlvblNldCkge1xyXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZSgpXHJcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fc3Vic2NyaWJlcnMuZGlzY29ubmVjdGVkW3N1YnNjcmliZXJdID0gY2FsbGJhY2s7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGVycikgPT4gcmVqZWN0KGVycikpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZXJzLmRpc2Nvbm5lY3RlZFtzdWJzY3JpYmVyXSA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfc3Vic2NyaWJlKCkge1xyXG5cclxuICAgIGNvbnN0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3N1YnNjcmliZScsXHJcbiAgICAgIGZyb206IHRoaXMuX2Rpc2NvdmVyZWRPYmplY3RVUkwsXHJcbiAgICAgIHRvOiB0aGlzLl9ydW50aW1lVVJMICsgJy9zdWJzY3JpcHRpb25zJyxcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlczogW3RoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMICsgJy9yZWdpc3RyYXRpb24nXVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZyhgW0Rpc2NvdmVyZWRPYmplY3Quc3Vic2NyaWJlXSAke3RoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMfSByY3ZlZCByZXBseSBgLCByZXBseSk7XHJcblxyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5fZ2VuZXJhdGVMaXN0ZW5lcih0aGlzLl9yZWdpc3RyeU9iamVjdFVSTCArICcvcmVnaXN0cmF0aW9uJyk7XHJcbiAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25TZXQgPSB0cnVlO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1YnNjcmliaW5nICcsIHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMKTtcclxuICAgICAgICAgIHJlamVjdCgnRXJyb3Igc3Vic2NyaWJpbmcgJyArIHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfZ2VuZXJhdGVMaXN0ZW5lcihub3RpZmljYXRpb25VUkwpIHtcclxuXHJcbiAgICB0aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKG5vdGlmaWNhdGlvblVSTCwgKG1zZykgPT4ge1xyXG4gICAgICBsb2cubG9nKGBbRGlzY292ZXJlZE9iamVjdC5ub3RpZmljYXRpb25dICR7dGhpcy5fcmVnaXN0cnlPYmplY3RVUkx9OiBgLCBtc2cpO1xyXG4gICAgICB0aGlzLl9wcm9jZXNzTm90aWZpY2F0aW9uKG1zZyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9wcm9jZXNzTm90aWZpY2F0aW9uKG1zZykge1xyXG4gICAgY29uc3Qgc3RhdHVzID0gbXNnLmJvZHkudmFsdWU7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICAvLyBIYWNrIHRvIGdpdmUgdGltZSBmb3Igb25MaXZlIEh5cGVydGllcyB0byBnZXQgcmVhZHkuIFRvIGJlIHJlbW92ZWQgd2hlbiBIeXBlcnR5IFN0YXRlIG1hY2hhaW5lIGlzIGltcGxlbWVudGVkXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3N1YnNjcmliZXJzW3N0YXR1c10pLmZvckVhY2goXHJcbiAgICAgICAgc3Vic2NyaWJlciA9PiB0aGlzLl9zdWJzY3JpYmVyc1tzdGF0dXNdW3N1YnNjcmliZXJdKClcclxuICAgICAgKTtcclxuXHJcbiAgICB9LCA1MDAwKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgX3Vuc3Vic2NyaWJlKCkge1xyXG5cclxuICAgIGNvbnN0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3Vuc3Vic2NyaWJlJyxcclxuICAgICAgZnJvbTogdGhpcy5fZGlzY292ZXJlZE9iamVjdFVSTCxcclxuICAgICAgdG86IHRoaXMuX3J1bnRpbWVVUkwgKyAnL3N1YnNjcmlwdGlvbnMnLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6IHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMICsgJy9yZWdpc3RyYXRpb24nXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKGBbRGlzY292ZXJlZE9iamVjdC51bnN1YnNjcmliZV0gJHt0aGlzLl9yZWdpc3RyeU9iamVjdFVSTH0gcmN2ZWQgcmVwbHkgYCwgcmVwbHkpO1xyXG5cclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB1bnN1YnNjcmliaW5nICcsIHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMKTtcclxuICAgICAgICAgIHJlamVjdCgnRXJyb3IgdW5zdWJzY3JpYmluZyAnICsgdGhpcy5fcmVnaXN0cnlPYmplY3RVUkwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlTGl2ZShzdWJzY3JpYmVyKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgaWYgKHN1YnNjcmliZXIgaW4gdGhpcy5fc3Vic2NyaWJlcnMubGl2ZSkge1xyXG5cclxuICAgICAgICAgIC8vVE9ETzogdW5zdWJzY3JpYmUgb3V0c2lkZSB0aGlzIGNvbmRpdGlvblxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpYmVycy5saXZlW3N1YnNjcmliZXJdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5fYXJlU3Vic2NyaXB0aW9uc0VtcHR5KCkpIHtcclxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpXHJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHJlc29sdmUoKSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHJlamVjdChlcnIpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KGAke3N1YnNjcmliZXJ9IGRvZXNuJ3Qgc3Vic2NyaWJlIG9uTGl2ZSBmb3IgJHt0aGlzLl9yZWdpc3RyeU9iamVjdFVSTH1gKTtcclxuICAgICAgICB9Ki9cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdW5zdWJzY3JpYmVEaXNjb25uZWN0ZWQoc3Vic2NyaWJlcikge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGlmIChzdWJzY3JpYmVyIGluIHRoaXMuX3N1YnNjcmliZXJzLmRpc2Nvbm5lY3RlZCkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpYmVycy5kaXNjb25uZWN0ZWRbc3Vic2NyaWJlcl07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9hcmVTdWJzY3JpcHRpb25zRW1wdHkoKSkge1xyXG4gICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoKVxyXG4gICAgICAgICAgLnRoZW4oKCkgPT4gcmVzb2x2ZSgpKVxyXG4gICAgICAgICAgLmNhdGNoKChlcnIpID0+IHJlamVjdChlcnIpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWplY3QoYCR7c3Vic2NyaWJlcn0gZG9lc24ndCBzdWJzY3JpYmUgb25EaXNjb25uZWN0ZWQgZm9yICR7dGhpcy5fcmVnaXN0cnlPYmplY3RVUkx9YCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2FyZVN1YnNjcmlwdGlvbnNFbXB0eSgpIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9zdWJzY3JpYmVycy5saXZlKS5sZW5ndGggPT09IDBcclxuICAgICAgJiYgT2JqZWN0LmtleXModGhpcy5fc3Vic2NyaWJlcnMuZGlzY29ubmVjdGVkKS5sZW5ndGggPT09IDA7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVnaXN0cmF0aW9uU3RhdHVzO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vL2ltcG9ydCB7ZGl2aWRlVVJMLCBjb252ZXJ0VG9Vc2VyVVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCBSZWdpc3RyYXRpb25TdGF0dXMgZnJvbSAnLi9SZWdpc3RyYXRpb25TdGF0dXMnO1xyXG5cclxuLyoqXHJcbiogRGlzY292ZXJlZCBPYmplY3QgaW50ZXJmYWNlXHJcbiovXHJcbmNsYXNzIERpc2NvdmVyZWRPYmplY3QgZXh0ZW5kcyBSZWdpc3RyYXRpb25TdGF0dXMge1xyXG5cclxuICBnZXQgZGF0YSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoZGF0YSwgcnVudGltZVVSTCwgZGlzY292ZXJ5VVJMLCBtc2dCdXMsIGRpc2NvdmVyeSkge1xyXG4gICAgc3VwZXIoZGF0YS5oeXBlcnR5SUQgfHwgZGF0YS51cmwsIHJ1bnRpbWVVUkwsIGRpc2NvdmVyeVVSTCwgbXNnQnVzKTtcclxuXHJcbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgIHRoaXMuX2Rpc2NvdmVyeSA9IGRpc2NvdmVyeTtcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgRGlzY292ZXJlZE9iamVjdC5cclxuICAqIERlcGVuZGluZyBvbiBleGlzdGluZyBzdWJzY3JpYmVycyBpdCBtYXkgdHJpZ2dlciBvbkxpdmUgb3Igb25EaXNjb25uZWN0ZWQgZXZlbnRzLlxyXG4gICpcclxuICAqL1xyXG5cclxuICBjaGVjaygpIHtcclxuICAgIC8vIHF1ZXJ5IERSIGZvciB0aGUgc3RhdHVzIGFuZCBjYWxsIHByb2Nlc3NOb3RpZmljYXRpb24gd2l0aCBtc2cgcmVjZWl2ZWRcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IG1lc3NhZ2UgPSB7XHJcbiAgICAgIGJvZHk6IHt9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChfdGhpcy5fZGlzY292ZXJlZE9iamVjdFVSTC5zdGFydHNXaXRoKCdoeXBlcnR5Oi8vJykgKSB7XHJcbiAgICAgIF90aGlzLl9kaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnR5UGVyVVJMKF90aGlzLl9kaXNjb3ZlcmVkT2JqZWN0VVJMKS50aGVuKChyZWdpc3RyYXRpb24pPT57XHJcbiAgICAgICAgbWVzc2FnZS5ib2R5LnN0YXR1cyA9IHJlZ2lzdHJhdGlvbi5zdGF0dXM7XHJcbiAgICAgICAgX3RoaXMuX3Byb2Nlc3NOb3RpZmljYXRpb24obWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgX3RoaXMuX2Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyVVJMKF90aGlzLl9kaXNjb3ZlcmVkT2JqZWN0VVJMKS50aGVuKChyZWdpc3RyYXRpb24pPT57XHJcbiAgICAgICAgbWVzc2FnZS5ib2R5LnN0YXR1cyA9IHJlZ2lzdHJhdGlvbi5zdGF0dXM7XHJcbiAgICAgICAgX3RoaXMuX3Byb2Nlc3NOb3RpZmljYXRpb24obWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGlzY292ZXJlZE9iamVjdDtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignRGlzY292ZXJ5Jyk7XHJcblxyXG5pbXBvcnQge2RpdmlkZVVSTCwgY29udmVydFRvVXNlclVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgRGlzY292ZXJlZE9iamVjdCBmcm9tICcuL0Rpc2NvdmVyZWRPYmplY3QnO1xyXG5cclxuLyoqXHJcbiogQ29yZSBEaXNjb3ZlcnkgaW50ZXJmYWNlXHJcbiogQ2xhc3MgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIHNlYXJjaCBmb3IgaHlwZXJ0aWVzIGFuZCBEYXRhT2JqZWN0cyB1c2luZyB0aGUgbWVzc2FnZSBidXNcclxuKi9cclxuY2xhc3MgRGlzY292ZXJ5IHtcclxuXHJcbiAgLyoqXHJcbiAgKiBUbyBpbml0aWFsaXNlIHRoZSBIeXBlcnR5RGlzY292ZXIsIHdoaWNoIHdpbGwgcHJvdmlkZSB0aGUgc3VwcG9ydCBmb3IgaHlwZXJ0aWVzIHRvXHJcbiAgKiBxdWVyeSB1c2VycyByZWdpc3RlcmVkIGluIG91dHNpZGUgdGhlIGludGVybmFsIGNvcmUuXHJcbiAgKiBAcGFyYW0gIHtNZXNzYWdlQnVzfSAgICAgICAgICBtc2didXMgICAgICAgICAgICAgICAgbXNnYnVzXHJcbiAgKiBAcGFyYW0gIHtSdW50aW1lVVJMfSAgICAgICAgICBydW50aW1lVVJMICAgICAgICAgICAgcnVudGltZVVSTFxyXG4gICovXHJcbiAgY29uc3RydWN0b3IoaHlwZXJ0eVVSTCwgcnVudGltZVVSTCwgbXNnQnVzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMubWVzc2FnZUJ1cyA9IG1zZ0J1cztcclxuICAgIF90aGlzLnJ1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xyXG5cclxuICAgIF90aGlzLmRvbWFpbiA9IGRpdmlkZVVSTChoeXBlcnR5VVJMKS5kb21haW47XHJcbiAgICBfdGhpcy5kaXNjb3ZlcnlVUkwgPSBoeXBlcnR5VVJMO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBZHZhbmNlZCBTZWFyY2ggZm9yIEh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggc29tZSB1c2VyIGlkZW50aWZpZXIgKGVnIGVtYWlsLCBuYW1lIC4uLilcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXJJZGVudGlmaWVyXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXHJcbiAgKi9cclxuICBfaXNMZWdhY3lVc2VyKHVzZXJJZGVudGlmaWVyKSB7XHJcbiAgICBpZiAodXNlcklkZW50aWZpZXIuaW5jbHVkZXMoJzonKSAmJiAhdXNlcklkZW50aWZpZXIuaW5jbHVkZXMoJ3VzZXI6Ly8nKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgdXNlciBpZGVudGlmaWVyIChlZyBlbWFpbCwgbmFtZSAuLi4pXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICB1c2VySWRlbnRpZmllclxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xyXG4gICovXHJcbiAgZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGEodXNlcklkZW50aWZpZXIsIHNjaGVtYSwgcmVzb3VyY2VzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGZpbHRlcmVkSHlwZXJ0aWVzID0gW107XHJcblxyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3JlYWQnLFxyXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXHJcbiAgICAgIHRvOiBfdGhpcy5ydW50aW1lVVJMICsgJy9kaXNjb3ZlcnkvJyxcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlOiAnL2h5cGVydHkvdXNlcnByb2ZpbGUvJyArIHVzZXJJZGVudGlmaWVyLFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChzY2hlbWEgfHwgcmVzb3VyY2VzKSB7XHJcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xyXG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLFxyXG4gICAgICAgIGRhdGFTY2hlbWVzOiBzY2hlbWFcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBpZiAoIV90aGlzLl9pc0xlZ2FjeVVzZXIodXNlcklkZW50aWZpZXIpKSB7Ly8gdG9kbzogdG8gcmVvbXZlIHdoZW4gZGlzY292ZXJ5IG9mIGxlZ2NheSB1c2VycyBhcmUgc3VwcG9ydGVkXHJcblxyXG4gICAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCl7XHJcbiAgICAgICAgICAgIHJlcGx5LmJvZHkudmFsdWUubWFwKGZ1bmN0aW9uKGh5cGVydHkpIHtcclxuICAgICAgICAgICAgICAgaWYoaHlwZXJ0eS5oeXBlcnR5SUQgIT0gX3RoaXMuZGlzY292ZXJ5VVJMKVxyXG4gICAgICAgICAgICAgICAgICAgZmlsdGVyZWRIeXBlcnRpZXMucHVzaChoeXBlcnR5KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmKGZpbHRlcmVkSHlwZXJ0aWVzLmxlbmd0aCA9PT0gMClcclxuICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgbG9nLmxvZyhcIltEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGFdIFJlcGx5IGxvZzogXCIsZmlsdGVyZWRIeXBlcnRpZXMpO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUoZmlsdGVyZWRIeXBlcnRpZXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbG9nLndhcm4oXCJbRGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0aWVzUGVyVXNlclByb2ZpbGVEYXRhXSBFcnJvciBSZXBseSBmb3IgXCIgKyB1c2VySWRlbnRpZmllciArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xyXG4gICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKFt7aHlwZXJ0eUlEOiB1c2VySWRlbnRpZmllciwgc3RhdHVzOiAnbGl2ZSd9XSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBZHZhbmNlZCBTZWFyY2ggZm9yIEh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggc29tZSB1c2VyIGlkZW50aWZpZXIgKGVnIGVtYWlsLCBuYW1lIC4uLilcclxuICAqIHJldHVybnMgRGlzY292ZXJlZE9iamVjdFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlcklkZW50aWZpZXJcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqL1xyXG4gIGRpc2NvdmVySHlwZXJ0aWVzUGVyVXNlclByb2ZpbGVEYXRhRE8odXNlcklkZW50aWZpZXIsIHNjaGVtYSwgcmVzb3VyY2VzKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kaXNjb3Zlckh5cGVydGllc1BlclVzZXJQcm9maWxlRGF0YSguLi5hcmd1bWVudHMpXHJcbiAgICAgIC50aGVuKGh5cGVydGllcyA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZSh0aGlzLl9jb252ZXJ0VG9EaXNjb3ZlcmVkT2JqZWN0KGh5cGVydGllcykpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQWR2YW5jZWQgU2VhcmNoIGZvciBEYXRhT2JqZWN0cyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggc29tZSB1c2VyIGlkZW50aWZpZXIgKGVnIGVtYWlsLCBuYW1lIC4uLilcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXJJZGVudGlmaWVyXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyVXNlclByb2ZpbGVEYXRhKHVzZXJJZGVudGlmaWVyLCBzY2hlbWEsIHJlc291cmNlcykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG4gICAgICB0eXBlOiAncmVhZCcsXHJcbiAgICAgIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCxcclxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6ICcvZGF0YU9iamVjdC91c2VycHJvZmlsZS8nICsgdXNlcklkZW50aWZpZXIsXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYoc2NoZW1hIHx8IHJlc291cmNlcykge1xyXG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcclxuICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcclxuICAgICAgICBkYXRhU2NoZW1lczogc2NoZW1hXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgaWYgKCFfdGhpcy5faXNMZWdhY3lVc2VyKHVzZXJJZGVudGlmaWVyKSkgey8vIHRvZG86IHRvIHJlb212ZSB3aGVuIGRpc2NvdmVyeSBvZiBsZWdjYXkgdXNlcnMgYXJlIHN1cHBvcnRlZFxyXG5cclxuICAgICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgICAgaWYocmVwbHkuYm9keS5jb2RlID09PSAyMDApe1xyXG4gICAgICAgICAgICBsb2cubG9nKFwiUmVwbHkgbG9nOiBcIixyZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0c1BlclVzZXJQcm9maWxlRGF0YV0gRXJyb3IgUmVwbHkgZm9yIFwiICsgdXNlcklkZW50aWZpZXIgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKFt7aHlwZXJ0eUlEOiB1c2VySWRlbnRpZmllciwgc3RhdHVzOiAnbGl2ZSd9XSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXHJcbiAgKiByZXR1cm5zIGRpc2NvdmVyZWRPYmplY3QuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBndWlkVVJMICAgICAgICAgICAgICAgIGd1aWQgVVJMIGUuZyB1c2VyLWd1aWQ6Ly88dW5pcXVlLXVzZXItaWRlbnRpZmllcj5cclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxyXG4gICovXHJcbiAgZGlzY292ZXJEYXRhT2JqZWN0c1BlclVzZXJQcm9maWxlRGF0YURPKGd1aWRVUkwsIHNjaGVtYSwgcmVzb3VyY2VzKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RzUGVyVXNlclByb2ZpbGVEYXRhKC4uLmFyZ3VtZW50cylcclxuICAgICAgICAudGhlbihyZWdpc3RyeU9iamVjdHMgPT4gcmVzb2x2ZSh0aGlzLl9jb252ZXJ0VG9EaXNjb3ZlcmVkT2JqZWN0KHJlZ2lzdHJ5T2JqZWN0cykpKVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBZHZhbmNlZCBTZWFyY2ggZm9yIEh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggc29tZSBHVUlEXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBndWlkVVJMICAgICAgICAgICAgICAgIGd1aWQgVVJMIGUuZyB1c2VyLWd1aWQ6Ly88dW5pcXVlLXVzZXItaWRlbnRpZmllcj5cclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqL1xyXG4gIGRpc2NvdmVySHlwZXJ0aWVzUGVyR1VJRChndWlkVVJMLCBzY2hlbWEsIHJlc291cmNlcykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBmaWx0ZXJlZEh5cGVydGllcyA9IFtdO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxyXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogJy9oeXBlcnR5L2d1aWQvJyArIGd1aWRVUkwsXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYoc2NoZW1hIHx8IHJlc291cmNlcykge1xyXG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcclxuICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcclxuICAgICAgICBkYXRhU2NoZW1lczogc2NoZW1hXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCl7XHJcbiAgICAgICAgICByZXBseS5ib2R5LnZhbHVlLm1hcChmdW5jdGlvbihoeXBlcnR5KSB7XHJcbiAgICAgICAgICAgICBpZihoeXBlcnR5Lmh5cGVydHlJRCAhPSBfdGhpcy5kaXNjb3ZlcnlVUkwpXHJcbiAgICAgICAgICAgICAgICAgZmlsdGVyZWRIeXBlcnRpZXMucHVzaChoeXBlcnR5KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYoZmlsdGVyZWRIeXBlcnRpZXMubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICByZWplY3QoJ05vIEh5cGVydHkgd2FzIGZvdW5kJyk7XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbG9nLmxvZyhcIlJlcGx5IGxvZzogXCIsZmlsdGVyZWRIeXBlcnRpZXMpO1xyXG4gICAgICAgICAgICByZXNvbHZlKGZpbHRlcmVkSHlwZXJ0aWVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNQZXJHVUlEXSBFcnJvciBSZXBseSBmb3IgXCIgKyBndWlkVVJMICsgXCIgUmVhc29uOiBcIiwgcmVwbHkuYm9keS5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIEdVSURcclxuICAqIHJldHVybnMgRGlzY292ZXJlZE9iamVjdFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZ3VpZFVSTCAgICAgICAgICAgICAgICBndWlkIFVSTCBlLmcgdXNlci1ndWlkOi8vPHVuaXF1ZS11c2VyLWlkZW50aWZpZXI+XHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXHJcbiAgKi9cclxuICBkaXNjb3Zlckh5cGVydGllc1BlckdVSURETyhndWlkVVJMLCBzY2hlbWEsIHJlc291cmNlcykge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzY292ZXJIeXBlcnRpZXNQZXJHVUlEKC4uLmFyZ3VtZW50cylcclxuICAgICAgLnRoZW4oaHlwZXJ0aWVzID0+IHtcclxuICAgICAgICByZXNvbHZlKHRoaXMuX2NvbnZlcnRUb0Rpc2NvdmVyZWRPYmplY3QoaHlwZXJ0aWVzKSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBZHZhbmNlZCBTZWFyY2ggZm9yIERhdGFPYmplY3RzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIEdVSURcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGd1aWRVUkwgICAgICAgICAgICAgICAgZ3VpZCBVUkwgZS5nIHVzZXItZ3VpZDovLzx1bmlxdWUtdXNlci1pZGVudGlmaWVyPlxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyR1VJRChndWlkVVJMLCBzY2hlbWEsIHJlc291cmNlcykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG4gICAgICB0eXBlOiAncmVhZCcsXHJcbiAgICAgIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCxcclxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6ICcvZGF0YU9iamVjdC9ndWlkLycgKyBndWlkVVJMLFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmKHNjaGVtYSB8fCByZXNvdXJjZXMpIHtcclxuICAgICAgbXNnLmJvZHlbJ2NyaXRlcmlhJ10gPSB7XHJcbiAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsXHJcbiAgICAgICAgZGF0YVNjaGVtZXM6IHNjaGVtYVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgaWYocmVwbHkuYm9keS5jb2RlID09PSAyMDApe1xyXG4gICAgICAgICAgbG9nLmxvZyhcIlJlcGx5IGxvZzogXCIscmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgICByZXNvbHZlKHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyR1VJRF0gRXJyb3IgUmVwbHkgZm9yIFwiICsgZ3VpZFVSTCArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xyXG4gICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IGRhdGFPYmplY3QgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxyXG4gICogcmV0dXJucyBkaXNjb3ZlcmVkT2JqZWN0LlxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZ3VpZFVSTCAgICAgICAgICAgICAgICBndWlkIFVSTCBlLmcgdXNlci1ndWlkOi8vPHVuaXF1ZS11c2VyLWlkZW50aWZpZXI+XHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKSAgICAgZG9tYWluIG9mIHRoZSByZWdpc3RyeSB0byBzZWFyY2hcclxuICAqL1xyXG4gIGRpc2NvdmVyRGF0YU9iamVjdHNQZXJHVUlERE8oZ3VpZFVSTCwgc2NoZW1hLCByZXNvdXJjZXMpIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRpc2NvdmVyRGF0YU9iamVjdHNQZXJHVUlEKC4uLmFyZ3VtZW50cylcclxuICAgICAgICAudGhlbihyZWdpc3RyeU9iamVjdHMgPT4gcmVzb2x2ZSh0aGlzLl9jb252ZXJ0VG9EaXNjb3ZlcmVkT2JqZWN0KHJlZ2lzdHJ5T2JqZWN0cykpKVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5XHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICB1c2VyICAgICAgICAgICAgICAgICAgdXNlciBpZGVudGlmaWVyLCBlaXRoZXIgaW4gdXJsIG9yIGVtYWlsIGZvcm1hdFxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXHJcbiAgKi9cclxuICBkaXNjb3Zlckh5cGVydGllcyh1c2VyLCBzY2hlbWEsIHJlc291cmNlcywgZG9tYWluKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcclxuICAgIGxldCBmaWx0ZXJlZEh5cGVydGllcyA9IFtdO1xyXG5cclxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG4gICAgICB0eXBlOiAncmVhZCcsXHJcbiAgICAgIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCxcclxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6ICcvaHlwZXJ0eS91c2VyLycgKyB1c2VyLFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmKHNjaGVtYSB8fCByZXNvdXJjZXMpIHtcclxuICAgICAgbXNnLmJvZHlbJ2NyaXRlcmlhJ10gPSB7XHJcbiAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsXHJcbiAgICAgICAgZGF0YVNjaGVtZXM6IHNjaGVtYSxcclxuICAgICAgICBkb21haW46IGFjdGl2ZURvbWFpblxyXG4gICAgICB9O1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcclxuICAgICAgICBkb21haW46IGFjdGl2ZURvbWFpblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgaWYgKCFfdGhpcy5faXNMZWdhY3lVc2VyKHVzZXIpKSB7Ly8gdG9kbzogdG8gcmVvbXZlIHdoZW4gZGlzY292ZXJ5IG9mIGxlZ2NheSB1c2VycyBhcmUgc3VwcG9ydGVkXHJcblxyXG4gICAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCB8fCByZXBseS5ib2R5LmNvZGUgPT09IDUwMCl7XHJcbiAgICAgICAgICAgIHJlcGx5LmJvZHkudmFsdWUubWFwKGZ1bmN0aW9uKGh5cGVydHkpIHtcclxuICAgICAgICAgICAgICAgaWYoaHlwZXJ0eS5oeXBlcnR5SUQgIT0gX3RoaXMuZGlzY292ZXJ5VVJMKVxyXG4gICAgICAgICAgICAgICAgICAgZmlsdGVyZWRIeXBlcnRpZXMucHVzaChoeXBlcnR5KTtcclxuICAgICAgICAgICAgfSk7XHJcbi8qICAgICAgICAgICAgaWYoZmlsdGVyZWRIeXBlcnRpZXMubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICAgIHJlamVjdCgnTm8gSHlwZXJ0eSB3YXMgZm91bmQnKTtcclxuICAgICAgICAgICAgZWxzZSB7Ki9cclxuICAgICAgICAgICAgICBsb2cubG9nKFwiW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllc10gUmVwbHkgOiBcIixmaWx0ZXJlZEh5cGVydGllcyk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShmaWx0ZXJlZEh5cGVydGllcyk7XHJcbi8vICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllc10gRXJyb3IgUmVwbHkgZm9yIFwiICsgdXNlciArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xyXG4gICAgICAgICAgICByZXNvbHZlKGZpbHRlcmVkSHlwZXJ0aWVzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKFt7aHlwZXJ0eUlEOiB1c2VyLCBzdGF0dXM6ICdsaXZlJ31dKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksXHJcbiAgKnJldHVybnMgRGlzY292ZXJlZE9iamVjdFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlciAgICAgICAgICAgICAgICAgIHVzZXIgaWRlbnRpZmllciwgZWl0aGVyIGluIHVybCBvciBlbWFpbCBmb3JtYXRcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxyXG4gICovXHJcbiAgZGlzY292ZXJIeXBlcnRpZXNETyh1c2VyLCBzY2hlbWEsIHJlc291cmNlcywgZG9tYWluKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kaXNjb3Zlckh5cGVydGllcyguLi5hcmd1bWVudHMpXHJcbiAgICAgIC50aGVuKGh5cGVydGllcyA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZSh0aGlzLl9jb252ZXJ0VG9EaXNjb3ZlcmVkT2JqZWN0KGh5cGVydGllcykpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBBZHZhbmNlZCBTZWFyY2ggZm9yIERhdGFPYmplY3RzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5XHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICB1c2VyICAgICAgICAgICAgICAgICAgdXNlciBpZGVudGlmaWVyLCBlaXRoZXIgaW4gdXJsIG9yIGVtYWlsIGZvcm1hdFxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBkYXRhT2JqZWN0cyByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxyXG4gICovXHJcbiAgZGlzY292ZXJEYXRhT2JqZWN0cyh1c2VyLCBzY2hlbWEsIHJlc291cmNlcywgZG9tYWluKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcclxuXHJcbiAgICBhY3RpdmVEb21haW4gPSAoIWRvbWFpbikgPyBfdGhpcy5kb21haW4gOiBkb21haW47XHJcblxyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3JlYWQnLFxyXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXHJcbiAgICAgIHRvOiBfdGhpcy5ydW50aW1lVVJMICsgJy9kaXNjb3ZlcnkvJyxcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlOiAnL2RhdGFPYmplY3QvdXNlci8nICsgdXNlcixcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZihzY2hlbWEgfHwgcmVzb3VyY2VzKSB7XHJcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xyXG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLFxyXG4gICAgICAgIGRhdGFTY2hlbWVzOiBzY2hlbWEsXHJcbiAgICAgICAgZG9tYWluOiBhY3RpdmVEb21haW5cclxuICAgICAgfTtcclxuICAgIH1lbHNlIHtcclxuICAgICAgbXNnLmJvZHlbJ2NyaXRlcmlhJ10gPSB7XHJcbiAgICAgICAgZG9tYWluOiBhY3RpdmVEb21haW5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgaWYocmVwbHkuYm9keS5jb2RlID09PSAyMDApe1xyXG4gICAgICAgICAgbG9nLmxvZyhcIlJlcGx5IFZhbHVlIExvZzogXCIscmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgICByZXNvbHZlKHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzXSBFcnJvciBSZXBseSBmb3IgXCIgKyB1c2VyICsgXCIgUmVhc29uOiBcIiwgcmVwbHkuYm9keS5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXHJcbiAgKiByZXR1cm5zIGRpc2NvdmVyZWRPYmplY3QuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICB1c2VyICAgICAgICAgICAgICAgICAgdXNlciBpZGVudGlmaWVyLCBlaXRoZXIgaW4gdXJsIG9yIGVtYWlsIGZvcm1hdFxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBkYXRhT2JqZWN0cyByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxyXG4gICovXHJcbiAgZGlzY292ZXJEYXRhT2JqZWN0c0RPKHVzZXIsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRpc2NvdmVyRGF0YU9iamVjdHMoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIC50aGVuKHJlZ2lzdHJ5T2JqZWN0cyA9PiByZXNvbHZlKHRoaXMuX2NvbnZlcnRUb0Rpc2NvdmVyZWRPYmplY3QocmVnaXN0cnlPYmplY3RzKSkpXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgaHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcclxuICAqIHJldHVybiB0aGUgaHlwZXJ0eSBpbmZvcm1hdGlvbiwgaWYgZm91bmQuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICB1cmwgIGh5cGVydHkgVVJMXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcclxuICAqL1xyXG4gIGRpc2NvdmVySHlwZXJ0eVBlclVSTCh1cmwsIGRvbWFpbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhY3RpdmVEb21haW47XHJcblxyXG4gICAgYWN0aXZlRG9tYWluID0gKCFkb21haW4pID8gX3RoaXMuZG9tYWluIDogZG9tYWluO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxyXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogJy9oeXBlcnR5L3VybC8nICsgdXJsLFxyXG4gICAgICAgIGNyaXRlcmlhOiB7XHJcbiAgICAgICAgICBkb21haW46IGFjdGl2ZURvbWFpblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKXtcclxuICAgICAgICAgIGxvZy5sb2coXCJSZXBseSBWYWx1ZSBMb2c6IFwiLHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnR5UGVyVVJMXSBFcnJvciBSZXBseSBmb3IgXCIgKyB1cmwgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBoeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxyXG4gICogcmV0dXJucyBkaXNjb3ZlcmVkT2JqZWN0LlxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgdXJsICBoeXBlcnR5IFVSTFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXHJcbiAgKi9cclxuICBkaXNjb3Zlckh5cGVydHlQZXJVUkxETyh1cmwsIGRvbWFpbikge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzY292ZXJIeXBlcnR5UGVyVVJMKC4uLmFyZ3VtZW50cylcclxuICAgICAgICAudGhlbihoeXBlcnR5ID0+IHJlc29sdmUobmV3IERpc2NvdmVyZWRPYmplY3QoaHlwZXJ0eSwgdGhpcy5ydW50aW1lVVJMLCB0aGlzLmRpc2NvdmVyeVVSTCwgdGhpcy5tZXNzYWdlQnVzLCB0aGlzKSkpXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXHJcbiAgKiByZXR1cm4gdGhlIGRhdGFPYmplY3QgaW5mb3JtYXRpb24sIGlmIGZvdW5kLlxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgdXJsICBkYXRhT2JqZWN0IFVSTFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RQZXJVUkwodXJsLCBkb21haW4pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xyXG5cclxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG4gICAgICB0eXBlOiAncmVhZCcsXHJcbiAgICAgIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCxcclxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6ICcvZGF0YU9iamVjdC91cmwvJyArIHVybCxcclxuICAgICAgICBjcml0ZXJpYToge1xyXG4gICAgICAgICAgZG9tYWluOiBhY3RpdmVEb21haW5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCl7XHJcbiAgICAgICAgICBsb2cubG9nKFwiUmVwbHkgVmFsdWUgTG9nOiBcIixyZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgIHJlc29sdmUocmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbG9nLndhcm4oXCJbRGlzY292ZXJ5LmRpc2NvdmVyRGF0YU9iamVjdFBlclVSTF0gRXJyb3IgUmVwbHkgZm9yIFwiICsgdXJsICsgXCIgUmVhc29uOiBcIiwgcmVwbHkuYm9keS5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXHJcbiAgKiByZXR1cm5zIGRpc2NvdmVyZWRPYmplY3QuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICB1cmwgIGRhdGFPYmplY3QgVVJMXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcclxuICAqL1xyXG4gIGRpc2NvdmVyRGF0YU9iamVjdFBlclVSTERPKHVybCwgZG9tYWluKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RQZXJVUkwoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIC50aGVuKHJlZ2lzdHJ5T2JqZWN0ID0+IHJlc29sdmUobmV3IERpc2NvdmVyZWRPYmplY3QocmVnaXN0cnlPYmplY3QsIHRoaXMucnVudGltZVVSTCwgdGhpcy5kaXNjb3ZlcnlVUkwsIHRoaXMubWVzc2FnZUJ1cywgdGhpcykpKVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IGFuIGRhdGFPYmplY3RzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IHdpdGggYSBnaXZlbiBuYW1lLCBhbmRcclxuICAqIHJldHVybiB0aGUgZGF0YU9iamVjdHMgaW5mb3JtYXRpb24sIGlmIGZvdW5kLlxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgbmFtZSAgZGF0YU9iamVjdCBVUkxcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBkYXRhT2JqZWN0cyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgZGF0YU9iamVjdHMgcmVzb3VyY2VzXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcclxuICAqL1xyXG4gIGRpc2NvdmVyRGF0YU9iamVjdHNQZXJOYW1lKG5hbWUsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xyXG5cclxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG4gICAgICB0eXBlOiAncmVhZCcsXHJcbiAgICAgIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCxcclxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6ICcvZGF0YU9iamVjdC9uYW1lLycgKyBuYW1lXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYoc2NoZW1hIHx8IHJlc291cmNlcykge1xyXG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcclxuICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcclxuICAgICAgICBkYXRhU2NoZW1lczogc2NoZW1hLFxyXG4gICAgICAgIGRvbWFpbjogYWN0aXZlRG9tYWluXHJcbiAgICAgIH07XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xyXG4gICAgICAgIGRvbWFpbjogYWN0aXZlRG9tYWluXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKXtcclxuICAgICAgICAgIGxvZy5sb2coXCJSZXBseSBWYWx1ZSBMb2c6IFwiLHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0c1Blck5hbWVdIEVycm9yIFJlcGx5IGZvciBcIiArIG5hbWUgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBkYXRhT2JqZWN0IHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcclxuICAqIHJldHVybnMgZGlzY292ZXJlZE9iamVjdC5cclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgIG5hbWUgIGRhdGFPYmplY3QgVVJMXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdHMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyTmFtZURPKG5hbWUsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRpc2NvdmVyRGF0YU9iamVjdHNQZXJOYW1lKC4uLmFyZ3VtZW50cylcclxuICAgICAgICAudGhlbihyZWdpc3RyeU9iamVjdHMgPT4gcmVzb2x2ZSh0aGlzLl9jb252ZXJ0VG9EaXNjb3ZlcmVkT2JqZWN0KHJlZ2lzdHJ5T2JqZWN0cykpKVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IHNwZWNpZmljIHJlcG9ydGVyIGRhdGFPYmplY3QgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxyXG4gICogcmV0dXJuIHRoZSBkYXRhT2JqZWN0cyBmcm9tIHRoYXQgcmVwb3J0ZXIuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICByZXBvcnRlciAgICAgZGF0YU9iamVjdCByZXBvcnRlclxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBkYXRhT2JqZWN0cyByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAgICAgICAoT3B0aW9uYWwpXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyUmVwb3J0ZXIocmVwb3J0ZXIsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xyXG5cclxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcclxuXHJcblxyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3JlYWQnLFxyXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXHJcbiAgICAgIHRvOiBfdGhpcy5ydW50aW1lVVJMICsgJy9kaXNjb3ZlcnkvJyxcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlOiAnL2RhdGFPYmplY3QvcmVwb3J0ZXIvJyArIHJlcG9ydGVyXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYoc2NoZW1hIHx8IHJlc291cmNlcykge1xyXG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcclxuICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcclxuICAgICAgICBkYXRhU2NoZW1lczogc2NoZW1hLFxyXG4gICAgICAgIGRvbWFpbjogYWN0aXZlRG9tYWluXHJcbiAgICAgIH07XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xyXG4gICAgICAgIGRvbWFpbjogYWN0aXZlRG9tYWluXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKXtcclxuICAgICAgICAgIGxvZy5sb2coXCJSZXBseSBWYWx1ZSBMb2c6IFwiLHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0c1Blck5hbWVdIEVycm9yIFJlcGx5IGZvciBcIiArIHJlcG9ydGVyICsgXCIgUmVhc29uOiBcIiwgcmVwbHkuYm9keS5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXHJcbiAgKiByZXR1cm5zIGRpc2NvdmVyZWRPYmplY3QuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICBuYW1lICBkYXRhT2JqZWN0IFVSTFxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBkYXRhT2JqZWN0cyByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKVxyXG4gICovXHJcbiAgZGlzY292ZXJEYXRhT2JqZWN0c1BlclJlcG9ydGVyRE8ocmVwb3J0ZXIsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRpc2NvdmVyRGF0YU9iamVjdHNQZXJSZXBvcnRlciguLi5hcmd1bWVudHMpXHJcbiAgICAgICAgLnRoZW4ocmVnaXN0cnlPYmplY3RzID0+IHJlc29sdmUodGhpcy5fY29udmVydFRvRGlzY292ZXJlZE9iamVjdChyZWdpc3RyeU9iamVjdHMpKSlcclxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9jb252ZXJ0VG9EaXNjb3ZlcmVkT2JqZWN0KHJlZ2lzdHJ5T2JqZWN0cykge1xyXG4gICAgcmV0dXJuIHJlZ2lzdHJ5T2JqZWN0cy5tYXAoKHJlZ2lzdHJ5T2JqZWN0KSA9PiB7XHJcbiAgICAgIHJldHVybiBuZXcgRGlzY292ZXJlZE9iamVjdChyZWdpc3RyeU9iamVjdCwgdGhpcy5ydW50aW1lVVJMLCB0aGlzLmRpc2NvdmVyeVVSTCwgdGhpcy5tZXNzYWdlQnVzLCB0aGlzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFkdmFuY2VkIFNlYXJjaCBmb3IgZGF0YU9iamVjdHMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnlcclxuICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQuIFVzZSBkaXNjb3ZlckRhdGFPYmplY3RzUGVyTmFtZSBpbnN0ZWFkXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBuYW1lICAgICAgICAgICAgICAgICAgbmFtZSBvZiB0aGUgZGF0YU9iamVjdFxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3Qgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3QgcmVzb3VyY2VzXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKSAgICAgZG9tYWluIG9mIHRoZSByZWdpc3RyeSB0byBzZWFyY2hcclxuICAqL1xyXG4gIGRpc2NvdmVyRGF0YU9iamVjdChuYW1lLCBzY2hlbWEsIHJlc291cmNlcywgZG9tYWluKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcclxuICAgIC8vbGV0IHVzZXJJZGVudGlmaWVyID0gY29udmVydFRvVXNlclVSTCh1c2VyKTtcclxuXHJcbiAgICBhY3RpdmVEb21haW4gPSAoIWRvbWFpbikgPyBfdGhpcy5kb21haW4gOiBkb21haW47XHJcblxyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIGFjdGl2ZURvbWFpbiwgYm9keTogeyByZXNvdXJjZTogbmFtZSxcclxuICAgICAgY3JpdGVyaWE6IHtyZXNvdXJjZXM6IHJlc291cmNlcywgZGF0YVNjaGVtZXM6IHNjaGVtYX1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZygnW0Rpc2NvdmVyeV0nLCByZXBseSlcclxuXHJcbiAgICAgICAgaWYocmVwbHkuYm9keS5jb2RlPjI5OSkge1xyXG4gICAgICAgICAgbG9nLndhcm4oXCJbRGlzY292ZXJ5LmRpc2NvdmVyRGF0YU9iamVjdF0gRXJyb3IgUmVwbHkgZm9yIFwiICsgbmFtZSArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoW10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGh5cGVydGllcyA9IHJlcGx5LmJvZHkudmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChoeXBlcnRpZXMpIHtcclxuICAgICAgICAgIHJlc29sdmUoaHlwZXJ0aWVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5XHJcbiAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkLiBVc2UgZGlzY292ZXJIeXBlcnRpZXMgaW5zdGVhZFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlciAgICAgICAgICAgICAgICAgIHVzZXIgaWRlbnRpZmllciwgZWl0aGVyIGluIHVybCBvciBlbWFpbCBmb3JtYXRcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxyXG4gICovXHJcbiAgZGlzY292ZXJIeXBlcnR5KHVzZXIsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xyXG4gICAgbGV0IHVzZXJJZGVudGlmaWVyID0gY29udmVydFRvVXNlclVSTCh1c2VyKTtcclxuXHJcbiAgICBpZiAoIWRvbWFpbikge1xyXG4gICAgICBhY3RpdmVEb21haW4gPSBfdGhpcy5kb21haW47XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBhY3RpdmVEb21haW4gPSBkb21haW47XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbG9nLmxvZygnW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydHldIEFDVElWRSBET01BSU4gLT4gJywgYWN0aXZlRG9tYWluLCAndXNlci0+JywgdXNlciwgJ3NjaGVtYS0+Jywgc2NoZW1hLCAncmVzb3VyY2VzLT4nLCByZXNvdXJjZXMsICdkb21haW4tPicsIGRvbWFpbik7XHJcbiAgICAgIGlmICh1c2VyLmluY2x1ZGVzKCc6JykgJiYgIXVzZXIuaW5jbHVkZXMoJ3VzZXI6Ly8nKSkge1xyXG4gICAgICAgIGxvZy5sb2coJ1tEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnR5XSAnICsgdXNlciArICcgaXMgbGVnYWN5IGRvbWFpbicpO1xyXG4gICAgICAgIGxldCBsZWdhY3lVc2VyID0geyB1c2VySUQ6IHVzZXIsIGh5cGVydHlJRDogdXNlciwgc2NoZW1hOiBzY2hlbWEsIHJlc291cmNlczogcmVzb3VyY2VzIH07XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUobGVnYWN5VXNlcik7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IG1zZyA9IHtcclxuICAgICAgICB0eXBlOiAncmVhZCcsIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCwgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgYWN0aXZlRG9tYWluLCBib2R5OiB7IHJlc291cmNlOiB1c2VySWRlbnRpZmllcixcclxuICAgICAgICBjcml0ZXJpYToge3Jlc291cmNlczogcmVzb3VyY2VzLCBkYXRhU2NoZW1lczogc2NoZW1hfVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGxvZy5pbmZvKCdbRGlzY292ZXJ5XSBtc2cgdG8gc2VuZC0+JywgbXNnKTtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgbG9nLmluZm8oJ1tEaXNjb3ZlcnldIE9OIGRpc2NvdmVySHlwZXJ0eS0+JywgcmVwbHkpO1xyXG4gICAgICAgIGxldCBoeXBlcnRpZXMgPSByZXBseS5ib2R5LnZhbHVlO1xyXG5cclxuICAgICAgICBpZiAoaHlwZXJ0aWVzKSB7XHJcbiAgICAgICAgICByZXNvbHZlKGh5cGVydGllcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdCgnTm8gSHlwZXJ0eSB3YXMgZm91bmQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgdXNlcnMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxyXG4gICogcmV0dXJuIHRoZSBsYXN0IGh5cGVydHkgaW5zdGFuY2UgcmVnaXN0ZXJlZCBieSB0aGUgdXNlci5cclxuICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQuIFVzZSBkaXNjb3Zlckh5cGVydHkgaW5zdGVhZFxyXG4gICogQHBhcmFtICB7ZW1haWx9ICAgICAgICAgICAgICBlbWFpbFxyXG4gICogQHBhcmFtICB7ZG9tYWlufSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXHJcbiAgKi9cclxuICBkaXNjb3Zlckh5cGVydHlQZXJVc2VyKGVtYWlsLCBkb21haW4pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIC8vIEhhY2sgZm9yIGxlZ2FjeSB1c2Vyc1xyXG4gICAgICBpZiAoZW1haWwuaW5jbHVkZXMoJzonKSAmJiAhZW1haWwuaW5jbHVkZXMoJ3VzZXI6Ly8nKSkge1xyXG4gICAgICAgIGxvZy5sb2coJ1tEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnR5XSAnICsgZW1haWwgKydpcyBsZWdhY3kgZG9tYWluJyk7XHJcbiAgICAgICAgbGV0IGxlZ2FjeVVzZXIgPSB7IGlkOiBlbWFpbCwgaHlwZXJ0eVVSTDogZW1haWwsIGRlc2NyaXB0b3I6ICd1bmtub3duJyB9O1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGxlZ2FjeVVzZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWRvbWFpbikge1xyXG4gICAgICAgIGFjdGl2ZURvbWFpbiA9IF90aGlzLmRvbWFpbjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhY3RpdmVEb21haW4gPSBkb21haW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBpZGVudGl0eVVSTCA9ICd1c2VyOi8vJyArIGVtYWlsLnN1YnN0cmluZyhlbWFpbC5pbmRleE9mKCdAJykgKyAxLCBlbWFpbC5sZW5ndGgpICsgJy8nICsgZW1haWwuc3Vic3RyaW5nKDAsIGVtYWlsLmluZGV4T2YoJ0AnKSk7XHJcblxyXG5cclxuICAgICAgLy8gbWVzc2FnZSB0byBxdWVyeSBkb21haW4gcmVnaXN0cnksIGFza2luZyBmb3IgYSB1c2VyIGh5cGVydHkuXHJcbiAgICAgIGxldCBtZXNzYWdlID0ge1xyXG4gICAgICAgIHR5cGU6ICdyZWFkJywgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLCB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBhY3RpdmVEb21haW4sIGJvZHk6IHsgcmVzb3VyY2U6IGlkZW50aXR5VVJMfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgbG9nLmluZm8oJ1tEaXNjb3ZlcnldIE1lc3NhZ2U6ICcsIG1lc3NhZ2UsIGFjdGl2ZURvbWFpbiwgaWRlbnRpdHlVUkwpO1xyXG5cclxuICAgICAgLy9sb2cuaW5mbygnW0Rpc2NvdmVyeV0gbWVzc2FnZSBSRUFEJywgbWVzc2FnZSk7XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xyXG4gICAgICAgIGxvZy5pbmZvKCdbRGlzY292ZXJ5XSBtZXNzYWdlIHJlcGx5JywgcmVwbHkpO1xyXG5cclxuICAgICAgICBsZXQgaHlwZXJ0eTtcclxuICAgICAgICBsZXQgbW9zdFJlY2VudDtcclxuICAgICAgICBsZXQgbGFzdEh5cGVydHk7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gcmVwbHkuYm9keS52YWx1ZTtcclxuXHJcbiAgICAgICAgZm9yIChoeXBlcnR5IGluIHZhbHVlKSB7XHJcbiAgICAgICAgICBpZiAodmFsdWVbaHlwZXJ0eV0ubGFzdE1vZGlmaWVkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKG1vc3RSZWNlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIG1vc3RSZWNlbnQgPSBuZXcgRGF0ZSh2YWx1ZVtoeXBlcnR5XS5sYXN0TW9kaWZpZWQpO1xyXG4gICAgICAgICAgICAgIGxhc3RIeXBlcnR5ID0gaHlwZXJ0eTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgaHlwZXJ0eURhdGUgPSBuZXcgRGF0ZSh2YWx1ZVtoeXBlcnR5XS5sYXN0TW9kaWZpZWQpO1xyXG4gICAgICAgICAgICAgIGlmIChtb3N0UmVjZW50LmdldFRpbWUoKSA8IGh5cGVydHlEYXRlLmdldFRpbWUoKSkge1xyXG4gICAgICAgICAgICAgICAgbW9zdFJlY2VudCA9IGh5cGVydHlEYXRlO1xyXG4gICAgICAgICAgICAgICAgbGFzdEh5cGVydHkgPSBoeXBlcnR5O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9nLmluZm8oJ1tEaXNjb3ZlcnldIExhc3QgSHlwZXJ0eTogJywgbGFzdEh5cGVydHksIG1vc3RSZWNlbnQpO1xyXG5cclxuICAgICAgICBsZXQgaHlwZXJ0eVVSTCA9IGxhc3RIeXBlcnR5O1xyXG5cclxuICAgICAgICBpZiAoaHlwZXJ0eVVSTCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KCdVc2VyIEh5cGVydHkgbm90IGZvdW5kJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaWRQYWNrYWdlID0ge1xyXG4gICAgICAgICAgaWQ6IGVtYWlsLFxyXG4gICAgICAgICAgZGVzY3JpcHRvcjogdmFsdWVbaHlwZXJ0eVVSTF0uZGVzY3JpcHRvcixcclxuICAgICAgICAgIGh5cGVydHlVUkw6IGh5cGVydHlVUkxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsb2cuaW5mbygnW0Rpc2NvdmVyeV0gPT09PiBoeXBlcnR5RGlzY292ZXJ5IG1lc3NhZ2VCdW5kbGU6ICcsIGlkUGFja2FnZSk7XHJcbiAgICAgICAgcmVzb2x2ZShpZFBhY2thZ2UpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IHVzZXJzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcclxuICAqIHJldHVybiB0aGUgYWxsIHRoZSBoeXBlcnRpZXMgcmVnaXN0ZXJlZCBieSB0aGUgdXNlclxyXG4gICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZC4gVXNlIGRpc2NvdmVySHlwZXJ0eSBpbnN0ZWFkXHJcbiAgKiBAcGFyYW0gIHtlbWFpbH0gICAgICAgICAgICAgIGVtYWlsXHJcbiAgKiBAcGFyYW0gIHtkb21haW59ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcclxuICAqL1xyXG4gIGRpc2NvdmVySHlwZXJ0aWVzUGVyVXNlcihlbWFpbCwgZG9tYWluKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcclxuICAgIGxvZy5sb2coJ29uIEZ1bmN0aW9uLT4nLCBlbWFpbCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBpZiAoZW1haWwuaW5jbHVkZXMoJzonKSAmJiAhZW1haWwuaW5jbHVkZXMoJ3VzZXI6Ly8nKSkge1xyXG4gICAgICAgIGxvZy5sb2coJ1tEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnR5XSBpcyBsZWdhY3kgZG9tYWluJyk7XHJcbiAgICAgICAgbGV0IGxlZ2FjeVVzZXIgPSB7IHVzZXJJRDogZW1haWwsIGh5cGVydHlJRDogZW1haWwsIHNjaGVtYTogc2NoZW1hLCByZXNvdXJjZXM6IHJlc291cmNlcyB9O1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGxlZ2FjeVVzZXIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWRvbWFpbikge1xyXG4gICAgICAgIGFjdGl2ZURvbWFpbiA9IF90aGlzLmRvbWFpbjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhY3RpdmVEb21haW4gPSBkb21haW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBpZGVudGl0eVVSTCA9ICd1c2VyOi8vJyArIGVtYWlsLnN1YnN0cmluZyhlbWFpbC5pbmRleE9mKCdAJykgKyAxLCBlbWFpbC5sZW5ndGgpICsgJy8nICsgZW1haWwuc3Vic3RyaW5nKDAsIGVtYWlsLmluZGV4T2YoJ0AnKSk7XHJcblxyXG4gICAgICAvLyBtZXNzYWdlIHRvIHF1ZXJ5IGRvbWFpbiByZWdpc3RyeSwgYXNraW5nIGZvciBhIHVzZXIgaHlwZXJ0eS5cclxuICAgICAgbGV0IG1lc3NhZ2UgPSB7XHJcbiAgICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIGFjdGl2ZURvbWFpbiwgYm9keTogeyByZXNvdXJjZTogaWRlbnRpdHlVUkx9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsb2cubG9nKCdbRGlzY292ZXJ5XSBNZXNzYWdlIGRpc2NvdmVySHlwZXJ0aWVzUGVyVXNlcjogJywgbWVzc2FnZSwgYWN0aXZlRG9tYWluLCBpZGVudGl0eVVSTCk7XHJcblxyXG4gICAgICAvL2xvZy5pbmZvKCdbRGlzY292ZXJ5XSBtZXNzYWdlIFJFQUQnLCBtZXNzYWdlKTtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tEaXNjb3ZlcnldIGRpc2NvdmVySHlwZXJ0aWVzUGVyVXNlciByZXBseScsIHJlcGx5KTtcclxuXHJcbiAgICAgICAgbGV0IHZhbHVlID0gcmVwbHkuYm9keS52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnVXNlciBIeXBlcnR5IG5vdCBmb3VuZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgdXNlcnMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxyXG4gICogcmV0dXJuIHRoZSBhbGwgdGhlIGh5cGVydGllcyByZWdpc3RlcmVkIGJ5IHRoZSB1c2VyXHJcbiAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkLiBVc2UgZGlzY292ZXJIeXBlcnR5IGluc3RlYWRcclxuICAqIEBwYXJhbSAge2VtYWlsfSAgICAgICAgICAgICAgZW1haWxcclxuICAqIEBwYXJhbSAge2RvbWFpbn0gICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKVxyXG4gICovXHJcbiAgcmVzdW1lRGlzY292ZXJpZXMoKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsb2cubG9nKCdbRGlzY292ZXJ5XSByZXN1bWVEaXNjb3ZlcmllcycpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGxldCBtc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsIHRvOiBfdGhpcy5ydW50aW1lVVJMICsgJy9zdWJzY3JpcHRpb25zJywgYm9keTogeyByZXNvdXJjZTogX3RoaXMuZGlzY292ZXJ5VVJMfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSk9PntcclxuICAgICAgICBsb2cubG9nKCdbRGlzY292ZXJ5LnJlc3VtZURpc2NvdmVyaWVzXSByZXBseTogJywgcmVwbHkpO1xyXG5cclxuICAgICAgICBsZXQgbm90aWZpY2F0aW9ucyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGxldCB1cmxzID0gcmVwbHkuYm9keS52YWx1ZTsvLyBVUkxzIHRvIGFkZCBsaXN0ZW5lcnMgdG9cclxuXHJcbiAgICAgICAgICAvL2xldHMgY3JlYXRlIG9uZSBEaXNjb3ZlcnlPYmplY3QgcGVyIG5vdGlmaWNhdGlvblxyXG4gICAgICAgICAgdXJscy5mb3JFYWNoKCh1cmwpID0+IHtcclxuICAgICAgICAgICAgbGV0IG9iamVjdFVybCA9IHVybC5zcGxpdCgnL3JlZ2lzdHJhdGlvbicpWzBdO1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHt9O1xyXG4gICAgICAgICAgICBkYXRhLnVybCA9IG9iamVjdFVybDtcclxuICAgICAgICAgICAgbG9nLmxvZygnW0Rpc2NvdmVyeS5yZXN1bWVEaXNjb3Zlcmllc10gYWRkaW5nIGxpc3RlbmVyIHRvOiAnLCBvYmplY3RVcmwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG9iamVjdFVybC5pbmNsdWRlcygnaHlwZXJ0eTovLycpKSB7XHJcbiAgICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5wdXNoKF90aGlzLmRpc2NvdmVySHlwZXJ0eVBlclVSTERPKG9iamVjdFVybCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMucHVzaChfdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RQZXJVUkxETyhvYmplY3RVcmwpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBQcm9taXNlLmFsbChub3RpZmljYXRpb25zKS50aGVuKHZhbHVlcz0+eyByZXNvbHZlKHZhbHVlcyk7IH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERpc2NvdmVyeTtcclxuIiwiY2xhc3MgU2VhcmNoIHtcclxuXHJcbiAgY29uc3RydWN0b3IoZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpIHtcclxuXHJcbiAgICBpZiAoIWRpc2NvdmVyeSkgdGhyb3cgbmV3IEVycm9yKCdUaGUgZGlzY292ZXJ5IGNvbXBvbmVudCBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghaWRlbnRpdHlNYW5hZ2VyKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBpZGVudGl0eU1hbmFnZXIgY29tcG9uZW50IGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuZGlzY292ZXJ5ID0gZGlzY292ZXJ5O1xyXG4gICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyID0gaWRlbnRpdHlNYW5hZ2VyO1xyXG5cclxuICB9XHJcblxyXG4gIG15SWRlbnRpdHkoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIF90aGlzLmlkZW50aXR5TWFuYWdlci5kaXNjb3ZlclVzZXJSZWdpc3RlcmVkKCkudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGh5cGVydGllcyh1c2Vycywgc2NoZW1lcywgcmVzb3VyY2VzLCBnbG9iYWxGbGFnID0gZmFsc2UpIHtcclxuICAgIC8vVE9ETzogcmV1c2UgdXNlcnMgb3IgdGhlIG90aGVyIHdheSBhcm91bmRcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0IG9mIHVzZXJzVVJMIHRvIHNlYXJjaFxyXG4gICAqIEBwYXJhbSAge2FycmF5PFVSTC51c2VyVVJMPn0gIHVzZXJzIExpc3Qgb2YgVXNlclVSLCBsaWtlIHRoaXMgZm9ybWF0IHVzZXI6Ly88aXBkZG9tYWluPi88dXNlci1pZGVudGlmaWVyPlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XHJcbiAgICovXHJcbiAgdXNlcnModXNlcnNVUkxzLCBwcm92aWRlZERvbWFpbnMsIHNjaGVtZXMsIHJlc291cmNlcywgZ2xvYmFsRmxhZyA9IGZhbHNlKSB7XHJcblxyXG4gICAgaWYgKCF1c2Vyc1VSTHMpIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgdXNlcnMnKTtcclxuICAgIGlmICghcHJvdmlkZWREb21haW5zKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIGRvbWFpbnMnKTtcclxuICAgIGlmICghcmVzb3VyY2VzKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIHJlc291cmNlcycpO1xyXG4gICAgaWYgKCFzY2hlbWVzKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIHNjaGVtZXMnKTtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGNvbnNvbGUuaW5mbygnW1NlYXJjaF0gVXNlcnM6ICcsIHVzZXJzVVJMcywgdXNlcnNVUkxzLmxlbmd0aCk7XHJcbiAgICAgIGNvbnNvbGUuaW5mbygnW1NlYXJjaF0gRG9tYWluczogJywgcHJvdmlkZWREb21haW5zLCBwcm92aWRlZERvbWFpbnMubGVuZ3RoKTtcclxuICAgICAgaWYgKHVzZXJzVVJMcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICBjb25zb2xlLmluZm8oJ0RvblxcJ3QgaGF2ZSB1c2VycyB0byBkaXNjb3ZlcnknKTtcclxuICAgICAgICByZXNvbHZlKHVzZXJzVVJMcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGV0IGdldFVzZXJzID0gW107XHJcblxyXG4gICAgICAgIHVzZXJzVVJMcy5mb3JFYWNoKCh1c2VyVVJMLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnREb21haW4gPSBwcm92aWRlZERvbWFpbnNbaW5kZXhdO1xyXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbU2VhcmNoXSBTZWFyY2ggdXNlciAnICsgdXNlclVSTCArICcgZm9yIHByb3ZpZGVkIGRvbWFpbjonLCBjdXJyZW50RG9tYWluKTtcclxuICAgICAgICAgIGlmICghZ2xvYmFsRmxhZykge1xyXG4gICAgICAgICAgICBnZXRVc2Vycy5wdXNoKF90aGlzLmRpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllcyh1c2VyVVJMLCBzY2hlbWVzLCByZXNvdXJjZXMsIGN1cnJlbnREb21haW4pKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdldFVzZXJzLnB1c2goX3RoaXMuZGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0aWVzUGVyVXNlclByb2ZpbGVEYXRhKHVzZXJVUkwsIHNjaGVtZXMsIHJlc291cmNlcykpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdSZXF1ZXN0cyBwcm9taXNlczogJywgZ2V0VXNlcnMpO1xyXG5cclxuICAgICAgICBQcm9taXNlLmFsbChnZXRVc2Vycy5tYXAoKHByb21pc2UpID0+IHtcclxuICAgICAgICAgIHJldHVybiBwcm9taXNlLnRoZW4oKGh5cGVydHkpID0+IHsgcmV0dXJuIGh5cGVydHk7IH0sIChlcnJvcikgPT4geyByZXR1cm4gZXJyb3I7IH0pO1xyXG4gICAgICAgIH0pKS50aGVuKChoeXBlcnRpZXMpID0+IHtcclxuXHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tTZWFyY2hdIEh5cGVydGllcyBmcm9tIG5ldyBEaXNjb3ZlcnknLCBoeXBlcnRpZXMpO1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IGh5cGVydGllcy5tYXAoZnVuY3Rpb24oaHlwZXJ0eSkge1xyXG5cclxuICAgICAgICAgICAgaWYgKGh5cGVydHkuaGFzT3duUHJvcGVydHkoJ2h5cGVydHlJRCcpKVxyXG4gICAgICAgICAgICAgIHJldHVybiBoeXBlcnR5O1xyXG4gICAgICAgICAgICBsZXQgcmVjZW50ID0gT2JqZWN0LmtleXMoaHlwZXJ0eSkucmVkdWNlUmlnaHQoZnVuY3Rpb24oYSwgYikge1xyXG4gICAgICAgICAgICAgIGxldCBoeXBlcnR5RGF0ZSA9IG5ldyBEYXRlKGh5cGVydHlbYl0ubGFzdE1vZGlmaWVkKTtcclxuICAgICAgICAgICAgICBsZXQgaHlwZXJ0eURhdGVQID0gbmV3IERhdGUoaHlwZXJ0eVthXS5sYXN0TW9kaWZpZWQpO1xyXG4gICAgICAgICAgICAgIGlmIChoeXBlcnR5RGF0ZVAuZ2V0VGltZSgpIDwgaHlwZXJ0eURhdGUuZ2V0VGltZSgpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGE7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGh5cGVydHlbcmVjZW50XTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGxldCBjbGVhbiA9IHJlc3VsdC5maWx0ZXIoKGh5cGVydHkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGh5cGVydHkuaGFzT3duUHJvcGVydHkoJ2h5cGVydHlJRCcpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgY29uc29sZS5sb2coJ1JlcXVlc3RzIHJlc3VsdDogJywgY2xlYW4pO1xyXG5cclxuICAgICAgICAgIGh5cGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XHJcbiAgICAgICAgICAgIGlmIChlbnRyeSAhPT0gJ05vIEh5cGVydHkgd2FzIGZvdW5kJykge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGNsZWFuKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgcmVqZWN0KCdObyBIeXBlcnR5IHdhcyBmb3VuZCcpO1xyXG5cclxuICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHJlYXNvbik7XHJcbiAgICAgICAgICByZXNvbHZlKHVzZXJzVVJMcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU2VhcmNoO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcbi8qKlxyXG4gKiBFdmVudEVtaXR0ZXJcclxuICogQWxsIGNsYXNzZXMgd2hpY2ggZXh0ZW5kcyB0aGlzLCBjYW4gaGF2ZSBhZGRFdmVudExpc3RlbmVyIGFuZCB0cmlnZ2VyIGV2ZW50cztcclxuICovXHJcbmNsYXNzIEV2ZW50RW1pdHRlciB7XHJcblxyXG4gIC8qKlxyXG4gICAqIGFkZEV2ZW50TGlzdGVuZXIgbGlzdGVuIGZvciBhbiBldmVudFR5cGVcclxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgZXZlbnRUeXBlIC0gbGlzdGVuaW5nIGZvciB0aGlzIHR5cGUgb2YgZXZlbnRcclxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gICAgICAgY2IgICAgICAgIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBldmVudCBpdCBpcyBpbnZva2VkXHJcbiAgICovXHJcbiAgYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNiKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXNbZXZlbnRUeXBlXSA9IGNiO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW52b2tlIHRoZSBldmVudFR5cGVcclxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGV2ZW50VHlwZSAtIGV2ZW50IHdpbGwgYmUgaW52b2tlZFxyXG4gICAqIEBwYXJhbSAge29iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgYWRkRXZlbnRMaXN0ZW5lclxyXG4gICAqL1xyXG4gIHRyaWdnZXIoZXZlbnRUeXBlLCBwYXJhbXMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgaWYgKF90aGlzW2V2ZW50VHlwZV0pIHtcclxuICAgICAgX3RoaXNbZXZlbnRUeXBlXShwYXJhbXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEV2ZW50RW1pdHRlcjtcclxuIiwiLy9pbXBvcnQgSWRlbnRpdHlNYW5hZ2VyIGZyb20gJy4uL2lkZW50aXR5TWFuYWdlci9JZGVudGl0eU1hbmFnZXInO1xyXG4vL2ltcG9ydCBTeW5jaGVyIGZyb20gJy4uL3N5bmNoZXIvU3luY2hlci5qcyc7XHJcbi8vaW1wb3J0IERpc2NvdmVyeSBmcm9tICcuLi9kaXNjb3ZlcnkvRGlzY292ZXJ5LmpzJztcclxuLy9pbXBvcnQge2RpdmlkZVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLy9pbXBvcnQgU2VhcmNoIGZyb20gJy4uL3V0aWxzL1NlYXJjaCc7XHJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnLi4vdXRpbHMvRXZlbnRFbWl0dGVyJztcclxuXHJcbi8qKlxyXG4qIENvbnRleHQgT2JzZXJ2ZXI7XHJcbiogQGF1dGhvciBQYXVsbyBDaGFpbmhvIFtwYXVsby1nLWNoYWluaG9AYWx0aWNlbGFicy5jb21dXHJcbiovXHJcblxyXG5jbGFzcyBDb250ZXh0T2JzZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24sIGNvbnRleHRSZXNvdXJjZVR5cGVzLCBmYWN0b3J5LCBzeW5jaGVyKSB7XHJcbiAgICBpZiAoIWh5cGVydHlVUkwpIHRocm93IG5ldyBFcnJvcignVGhlIGh5cGVydHlVUkwgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XHJcbiAgICBpZiAoIWJ1cykgdGhyb3cgbmV3IEVycm9yKCdUaGUgTWluaUJ1cyBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29uZmlndXJhdGlvbiBpcyBhIG5lZWRlZCBwYXJhbWV0ZXIgJyk7XHJcbiAgICBpZiAoIWZhY3RvcnkpIHRocm93IG5ldyBFcnJvcignVGhlIGZhY3RvcnkgaXMgYSBuZWVkZWQgcGFyYW1ldGVyICcpO1xyXG5cclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fY29udGV4dFJlc291cmNlVHlwZXMgPSBjb250ZXh0UmVzb3VyY2VUeXBlcztcclxuICAgIF90aGlzLl91cmwgPSBoeXBlcnR5VVJMO1xyXG4gICAgX3RoaXMuX2Rpc2NvdmVyVXNlcnNQcm9taXNlcyA9IHt9OyAvLyBvYmplY3Qgd2l0aCBwcm9taXNlcyBleGVjdXRlZCBhdCBkaXNjb3ZlclVzZXJzIGZ1bmN0aW9uXHJcbiAgICBfdGhpcy5fb2JzZXJ2ZVByb21pc2VzID0ge307IC8vIG9iamVjdCB3aXRoIHByb21pc2VzIGV4ZWN1dGVkIGF0IG9ic2VydmUgZnVuY3Rpb25cclxuXHJcblxyXG4gICAgLy9sZXQgaWRlbnRpdHlNYW5hZ2VyID0gbmV3IElkZW50aXR5TWFuYWdlcihoeXBlcnR5VVJMLCBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwsIGJ1cyk7XHJcbiAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlcl0gc3RhcnRlZCB3aXRoIGh5cGVydHlVUkwtPicsIGh5cGVydHlVUkwpO1xyXG4gICAgX3RoaXMuX2RvbWFpbiA9IGZhY3RvcnkuZGl2aWRlVVJMKGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTCkuZG9tYWluO1xyXG4gICAgX3RoaXMuX29iamVjdERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIF90aGlzLl9kb21haW4gKyAnLy53ZWxsLWtub3duL2RhdGFzY2hlbWEvQ29udGV4dCc7XHJcblxyXG4gICAgX3RoaXMuX3VzZXJzMm9ic2VydmUgPSBbXTtcclxuICAgIF90aGlzLl9vYnNlcnZlcnMgPSB7fTtcclxuXHJcbiAgICB0aGlzLl9zeW5jaGVyID0gc3luY2hlciA/IHN5bmNoZXIgOiBmYWN0b3J5LmNyZWF0ZVN5bmNoZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICBsZXQgZGlzY292ZXJ5ID0gZmFjdG9yeS5jcmVhdGVEaXNjb3ZlcnkoaHlwZXJ0eVVSTCwgY29uZmlndXJhdGlvbi5ydW50aW1lVVJMLCBidXMpO1xyXG4gICAgX3RoaXMuX2Rpc2NvdmVyeSA9IGRpc2NvdmVyeTtcclxuXHJcbiAgICBfdGhpcy5fZGlzY292ZXJpZXMgPSB7fTsgLy9saXN0IG9mIGRpc2NvdmVyZWQgb2JqZWN0c1xyXG4gICAgLy9fdGhpcy5pZGVudGl0eU1hbmFnZXIgPSBpZGVudGl0eU1hbmFnZXI7XHJcbiAgICAvL190aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2goZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpO1xyXG4gICAgd2luZG93LmRpc2NvdmVyeSA9IF90aGlzLl9kaXNjb3Zlcnk7XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhcnQocmVzdW1lZENvbnRleHQsIGRpc2Nvbm5lY3RlZENhbGxCYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIuc3RhcnRdICcpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIF90aGlzLl9zeW5jaGVyLnJlc3VtZU9ic2VydmVycyh7c3RvcmU6IHRydWV9KS50aGVuKChvYnNlcnZlcnMpID0+IHtcclxuXHJcbiAgICAgICAgbGV0IG9ic2VydmVyc0xpc3QgPSBPYmplY3Qua2V5cyhvYnNlcnZlcnMpO1xyXG5cclxuICAgICAgICBpZiAob2JzZXJ2ZXJzTGlzdC5sZW5ndGggID4gMCkge1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLnN0YXJ0XSByZXN1bWluZzogJywgb2JzZXJ2ZXJzKTtcclxuXHJcbiAgICAgICAgICAvKm9ic2VydmVyc0xpc3QuZm9yRWFjaCgoaSk9PntcclxuICAgICAgICAgIF90aGlzLl91c2VyczJvYnNlcnZlLnB1c2gobmV3IFVzZXJBdmFpbGFiaWxpdHlDb250cm9sbGVyKG9ic2VydmVyc1tpXSkpO1xyXG4gICAgICAgIH0pOyovXHJcbiAgICAgICAgICBfdGhpcy5fb2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzO1xyXG5cclxuICAgICAgICAgIHJlc29sdmUob2JzZXJ2ZXJzKTtcclxuXHJcbiAgICAgICAgICBvYnNlcnZlcnNMaXN0LmZvckVhY2goKG9ic2VydmVyKSA9PntcclxuICAgICAgICAgICAgbGV0IENvbnRleHQgPSBvYnNlcnZlcnNbb2JzZXJ2ZXJdO1xyXG5cclxuICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCByZXN1bWVkIGNvbnRleHQgaXMgc2V0IHdpdGggcmVzdW1lZENvbnRleHQuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bWVkQ29udGV4dCkgY29udGV4dC5kYXRhLnZhbHVlcyA9IHJlc3VtZWRDb250ZXh0O1xyXG5cclxuICAgICAgICAgICAgLy8gQ29udGV4dCB3aWxsIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHZhbHVlIHN5bmNocm9uaXplZCB3aXRoIHJlcG9ydGVyIGlmIGNvbm5lY3RlZFxyXG4gICAgICAgICAgICBDb250ZXh0LnN5bmMoKTtcclxuXHJcbiAgICAgICAgICAgIC8vQWRkIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gcmVwb3J0ZXIgaXMgYWJydXB0bHkgZGlzY29ubmVjdGVkXHJcbiAgICAgICAgICAgIGlmIChkaXNjb25uZWN0ZWRDYWxsQmFjaykgQ29udGV4dC5vbkRpc2Nvbm5lY3RlZChkaXNjb25uZWN0ZWRDYWxsQmFjayk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ29udGV4dE9ic2VydmVyXSBSZXN1bWUgT2JzZXJ2ZXIgZmFpbGVkIHwgJywgcmVhc29uKTtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgIHJlamVjdCgnW0NvbnRleHRPYnNlcnZlcl0gU3RhcnQgZmFpbGVkIHwgJywgcmVhc29uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVzdW1lRGlzY292ZXJpZXMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIF90aGlzLl9kaXNjb3ZlcnkucmVzdW1lRGlzY292ZXJpZXMoKS50aGVuKChkaXNjb3ZlcmllcykgPT4ge1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5fcmVzdW1lRGlzY292ZXJpZXNdIGZvdW5kOiAnLCBkaXNjb3Zlcmllcyk7XHJcblxyXG4gICAgICAgIGRpc2NvdmVyaWVzLmZvckVhY2goKGRpc2NvdmVyeSkgPT57XHJcblxyXG4gICAgICAgICAgaWYgKGRpc2NvdmVyeS5kYXRhLnJlc291cmNlcyAmJiBkaXNjb3ZlcnkuZGF0YS5yZXNvdXJjZXNbMF0gPT09IF90aGlzLl9jb250ZXh0UmVzb3VyY2VUeXBlc1swXSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5fcmVzdW1lRGlzY292ZXJpZXNdIHJlc3VtaW5nOiAnLCBkaXNjb3ZlcnkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRpc2NvdmVyeS5kYXRhLnN0YXR1cyA9PT0gJ2xpdmUnKSB7IC8vIHByZXZpb3VzbHkgZGlzY292ZXJlZCBvYmplY3QgaXMgbm93IGxpdmVcclxuICAgICAgICAgICAgICByZXNvbHZlKFtkaXNjb3ZlcnkuZGF0YV0pO1xyXG4gICAgICAgICAgICAgIGRpc2NvdmVyeS51bnN1YnNjcmliZUxpdmUoX3RoaXMuX3VybCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIHByZXZpb3VzbHkgZGlzY292ZXJlZCBvYmplY3QgaXMgc3RpbGwgZGlzY29ubmVjdGVkXHJcbiAgICAgICAgICAgICAgZGlzY292ZXJ5Lm9uTGl2ZShfdGhpcy5fdXJsLCAoKT0+e1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIuX3Jlc3VtZURpc2NvdmVyaWVzXSBkaXNjb25uZWN0ZWQgSHlwZXJ0eSBpcyBiYWNrIHRvIGxpdmUnLCBkaXNjb3ZlcnkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShbZGlzY292ZXJ5LmRhdGFdKTtcclxuICAgICAgICAgICAgICAgIGRpc2NvdmVyeS51bnN1YnNjcmliZUxpdmUoX3RoaXMuX3VybCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgIHJlamVjdCgnW0NvbnRleHRPYnNlcnZlcl0gcmVzdW1lRGlzY292ZXJpZXMgZmFpbGVkIHwgJywgcmVhc29uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25SZXN1bWVPYnNlcnZlcihjYWxsYmFjaykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9vblJlc3VtZU9ic2VydmVyID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuXHJcbiAgZGlzY292ZXJVc2VycyhlbWFpbCwgZG9tYWluKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuXHJcbiAgICBsZXQgdXNlciA9IGVtYWlsICsgJ0AnICsgZG9tYWluO1xyXG5cclxuICAgIGlmICghX3RoaXMuX2Rpc2NvdmVyVXNlcnNQcm9taXNlc1t1c2VyXSkge1xyXG4gICAgICBfdGhpcy5fZGlzY292ZXJVc2Vyc1Byb21pc2VzW3VzZXJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICAgIF90aGlzLl9kaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNETyhlbWFpbCwgWydjb250ZXh0J10sIF90aGlzLl9jb250ZXh0UmVzb3VyY2VUeXBlcywgZG9tYWluKS50aGVuKGh5cGVydGllcyA9PntcclxuICAgICAgICAgIC8vX3RoaXMuc2VhcmNoLnVzZXJzKFtlbWFpbF0sIFtkb21haW5dLCBbJ2NvbnRleHQnXSwgWydDb250ZXh0X2NvbnRleHQnXSkudGhlbihmdW5jdGlvbihhKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5kaXNjb3ZlclVzZXJzXSBkaXNjb3ZlcnkgcmVzdWx0LT4nLCBoeXBlcnRpZXMpO1xyXG4gICAgICAgICAgbGV0IGRpc2NvdmVyZWQgPSBbXTtcclxuICAgICAgICAgIGxldCBkaXNjb25uZWN0ZWQgPSBbXTtcclxuICAgICAgICAgIGh5cGVydGllcy5mb3JFYWNoKGh5cGVydHkgPT57XHJcbiAgICAgICAgICAgIF90aGlzLl9kaXNjb3Zlcmllc1toeXBlcnR5LmRhdGEuaHlwZXJ0eUlEXSA9IGh5cGVydHk7XHJcbiAgICAgICAgICAgIGlmIChoeXBlcnR5LmRhdGEuc3RhdHVzID09PSAnbGl2ZScpIHtcclxuICAgICAgICAgICAgICBkaXNjb3ZlcmVkLnB1c2goaHlwZXJ0eS5kYXRhKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQucHVzaChoeXBlcnR5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgIGlmIChkaXNjb3ZlcmVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIuZGlzY292ZXJVc2Vyc10gcmV0dXJuaW5nIGRpc2NvdmVyZWQgaHlwZXJ0aWVzIGRhdGEtPicsIGRpc2NvdmVyZWQpO1xyXG4gICAgICAgICAgICByZXNvbHZlKGRpc2NvdmVyZWQpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChkaXNjb25uZWN0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5kaXNjb3ZlclVzZXJzXSBkaXNjb25uZWN0ZWQgSHlwZXJ0aWVzICcsIGRpc2Nvbm5lY3RlZCk7XHJcblxyXG4gICAgICAgICAgICAvL3Jlc29sdmUoW10pO1xyXG5cclxuICAgICAgICAgICAgZGlzY29ubmVjdGVkWzBdLm9uTGl2ZShfdGhpcy5fdXJsLCAoKT0+e1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLmRpc2NvdmVyVXNlcnNdIGRpc2Nvbm5lY3RlZCBIeXBlcnR5IGlzIGJhY2sgdG8gbGl2ZScsIGRpc2Nvbm5lY3RlZFswXSk7XHJcblxyXG4gICAgICAgICAgICAgIGRpc2NvdmVyZWQucHVzaChkaXNjb25uZWN0ZWRbMF0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShkaXNjb3ZlcmVkKTtcclxuICAgICAgICAgICAgICBkaXNjb25uZWN0ZWRbMF0udW5zdWJzY3JpYmVMaXZlKF90aGlzLl91cmwpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX3RoaXMuX2Rpc2NvdmVyVXNlcnNQcm9taXNlc1t1c2VyXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCB0aGUgdXNlciBDb250ZXh0IG9ic2VydmF0aW9uIGZvciBhIGNlcnRhaW4gdXNlciBDb250ZXh0IHJlcG9ydGVyXHJcbiAgICogQHBhcmFtICB7RGlzY292ZXJlZE9iamVjdH0gaHlwZXJ0eSAgICAgICBIeXBlcnR5IHRvIGJlIG9ic2VydmVkLlxyXG4gICAqIEByZXR1cm4gezxQcm9taXNlPiBEYXRhT2JqZWN0T2JzZXJ2ZXJ9ICAgICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdGhlIFVzZXJBdmFpbGFiaWxpdHkgRGF0YSBPYmplY3QgT2JzZXJ2ZXIuXHJcbiAgICovXHJcblxyXG4gIG9ic2VydmUoaHlwZXJ0eSwgZG9tYWluU3Vic2NyaXB0aW9uID0gdHJ1ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGlmICghX3RoaXMuX29ic2VydmVQcm9taXNlc1toeXBlcnR5Lmh5cGVydHlJRF0pIHtcclxuICAgICAgX3RoaXMuX29ic2VydmVQcm9taXNlc1toeXBlcnR5Lmh5cGVydHlJRF0gPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgLy9jaGVjayBpZiB3ZSBhcmUgYWxyZWFkeSBvYnNlcnZpbmcgaXRcclxuICAgICAgICBfdGhpcy5fdXNlcnMyb2JzZXJ2ZS5mb3JFYWNoKChDb250ZXh0KSA9PiB7XHJcbiAgICAgICAgICBpZiAoQ29udGV4dC5fcmVwb3J0ZXIgPT09IGh5cGVydHkuaHlwZXJ0eUlEKSByZXR1cm4gcmVzb2x2ZShDb250ZXh0KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgX3RoaXMuX2Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyUmVwb3J0ZXIoaHlwZXJ0eS5oeXBlcnR5SUQsIFsnY29udGV4dCddLCBfdGhpcy5fY29udGV4dFJlc291cmNlVHlwZXMsICBfdGhpcy5fZG9tYWluKS50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RzKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5kaXNjb3ZlckF2YWlsYWJpbGl0eV0gZGlzY292ZXJlZCBjb250ZXh0IG9iamVjdHMgJywgZGF0YU9iamVjdHMpO1xyXG4gICAgICAgICAgbGV0IGxhc3QgPSAwO1xyXG4gICAgICAgICAgbGV0IHVybDtcclxuXHJcbiAgICAgICAgICBkYXRhT2JqZWN0cy5mb3JFYWNoKChkYXRhT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KCdsYXN0TW9kaWZpZWQnKSAmJiBkYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KCd1cmwnKSAmJiBEYXRlLnBhcnNlKGRhdGFPYmplY3QubGFzdE1vZGlmaWVkKSA+IGxhc3QpIHtcclxuICAgICAgICAgICAgICBsYXN0ID0gZGF0YU9iamVjdC5sYXN0TW9kaWZpZWQ7XHJcbiAgICAgICAgICAgICAgdXJsID0gZGF0YU9iamVjdC51cmw7XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdVUkwgREFUQSBPYmplY3QnLCB1cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmIChsYXN0ICE9IDAgJiYgdXJsKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoX3RoaXMuX3N1YnNjcmliZUNvbnRleHQoaHlwZXJ0eSwgdXJsLCBkb21haW5TdWJzY3JpcHRpb24pKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlamVjdCgnW0NvbnRleHRPYnNlcnZlci5vYnNlcnZlXSBkaXNjb3ZlcmVkIERhdGFPYmplY3MgYXJlIGludmFsaWQnLCBkYXRhT2JqZWN0cyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF90aGlzLl9vYnNlcnZlUHJvbWlzZXNbaHlwZXJ0eS5oeXBlcnR5SURdO1xyXG4gIH1cclxuXHJcbiAgX3N1YnNjcmliZUNvbnRleHQoaHlwZXJ0eSwgdXJsLCBkb21haW5TdWJzY3JpcHRpb24gPSB0cnVlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIC8vIGF2b2lkIGR1cGxpY2F0ZWQgc3Vic2NyaXB0aW9uc1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgX3RoaXMuX3VzZXJzMm9ic2VydmUuZm9yRWFjaCgoQ29udGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChDb250ZXh0LnVybCA9PT0gdXJsKSByZXR1cm4gcmVzb2x2ZShDb250ZXh0KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsZXQgaW5wdXQgPSB7XHJcbiAgICAgICAgc2NoZW1hOiBfdGhpcy5fb2JqZWN0RGVzY1VSTCxcclxuICAgICAgICByZXNvdXJjZTogdXJsLFxyXG4gICAgICAgIHN0b3JlOiBudWxsLFxyXG4gICAgICAgIHAycDogbnVsbCxcclxuICAgICAgICBtdXR1YWw6IG51bGwsXHJcbiAgICAgICAgZG9tYWluX3N1YnNjcmlwdGlvbjogZG9tYWluU3Vic2NyaXB0aW9uXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBfdGhpcy5fc3luY2hlci5zdWJzY3JpYmUoaW5wdXQpLnRoZW4oKENvbnRleHQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5fc3Vic2NyaWJlQ29udGV4dF0gb2JzZXJ2ZXIgb2JqZWN0JywgQ29udGV4dCk7XHJcblxyXG4gICAgICAgIC8vbGV0IG5ld1VzZXJBdmFpbGFiaWxpdHkgPSBuZXcgVXNlckF2YWlsYWJpbGl0eUNvbnRyb2xsZXIoQ29udGV4dCwgdXNlcklEKTtcclxuXHJcbiAgICAgICAgX3RoaXMuX3VzZXJzMm9ic2VydmUucHVzaChDb250ZXh0KTtcclxuXHJcbiAgICAgICAgLy8gV2hlbiBPYmplY3QgaXMgZGlzY29ubmVjdGVkIHNldCB1c2VyIENvbnRleHQgc3RhdHVzIGFzIHVuYXZhaWxhYmxlXHJcbiAgICAgICAgQ29udGV4dC5vbkRpc2Nvbm5lY3RlZCgoKT0+e1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIub25EaXNjb25uZWN0ZWRdOiAnLCBDb250ZXh0KTtcclxuXHJcbiAgICAgICAgICBDb250ZXh0LmRhdGEudmFsdWVzWzBdLnZhbHVlID0gJ3VuYXZhaWxhYmxlJztcclxuICAgICAgICAgIENvbnRleHQuc3luYygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXNvbHZlKENvbnRleHQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2Rpc2NvdmVyQW5kU3Vic2NyaWJlTGVnYWN5VXNlcnMobmFtZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgX3RoaXMuX2Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyTmFtZShuYW1lKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLl9kaXNjb3ZlckFuZFN1YnNjcmliZUxlZ2FjeVVzZXJzXSBBbGwgRGF0YU9iamVjdHMgUmVzdWx0JywgcmVzdWx0KTtcclxuICAgICAgICByZXN1bHQuZm9yRWFjaChmdW5jdGlvbihvYmopIHtcclxuICAgICAgICAgIGlmIChvYmouc3RhdHVzID09PSAnbGl2ZScpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0xpdmUgb2JqJywgb2JqKTtcclxuICAgICAgICAgICAgaWYgKCFvYmouaHlwZXJ0eUlEKSB7XHJcbiAgICAgICAgICAgICAgb2JqLmh5cGVydHlJRCA9IG9iai5yZXBvcnRlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fc3Vic2NyaWJlQ29udGV4dChvYmouc2NoZW1hLCBvYmoudXJsKS50aGVuKGZ1bmN0aW9uKHJlc3VsdFN1YnNjcmliZSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLl9kaXNjb3ZlckFuZFN1YnNjcmliZUxlZ2FjeVVzZXJzXSBfc3Vic2NyaWJlQ29udGV4dCcsIHJlc3VsdFN1YnNjcmliZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0U3Vic2NyaWJlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciAnLCBlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdG9wIHRoZSB1c2VyIENvbnRleHQgb2JzZXJ2YXRpb24gZm9yIGEgY2VydGFpbiB1c2VyXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gQ29udGV4dCAgICAgICB0aGUgVXNlckF2YWlsYWJpbGl0eSBEYXRhIE9iamVjdCBPYnNlcnZlciBVUkwgdG8gYmUgdW5vYnNlcnZlZC5cclxuICovXHJcblxyXG4gIHVub2JzZXJ2ZShDb250ZXh0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl91c2VyczJvYnNlcnZlLmZvckVhY2goKHVzZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmICh1c2VyLnVybCA9PT0gQ29udGV4dCkge1xyXG4gICAgICAgIHVzZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICBfdGhpcy5fdXNlcnMyb2JzZXJ2ZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29udGV4dE9ic2VydmVyO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vLyBTZXJ2aWNlIEZyYW1ld29ya1xyXG4vL2ltcG9ydCBTeW5jaGVyIGZyb20gJy4uL3N5bmNoZXIvU3luY2hlcic7XHJcblxyXG4vLyBVdGlsc1xyXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJy4uL3V0aWxzL0V2ZW50RW1pdHRlci5qcyc7XHJcbi8vaW1wb3J0IHtkaXZpZGVVUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcclxuXHJcbi8vIGltcG9ydCBhdmFpbGFiaWxpdHkgZnJvbSAnLi9hdmFpbGFiaWxpdHkuanMnO1xyXG5cclxuLyoqXHJcbiogQ29udGV4dCBSZXBvcnRlcjtcclxuKiBAYXV0aG9yIFBhdWxvIENoYWluaG8gW3BhdWxvLWctY2hhaW5ob0BhbHRpY2VsYWJzLmNvbV1cclxuKi9cclxuY2xhc3MgQ29udGV4dFJlcG9ydGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuXHJcbiAgY29uc3RydWN0b3IoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWd1cmF0aW9uLCBmYWN0b3J5LCBzeW5jaGVyKSB7XHJcbiAgICBpZiAoIWh5cGVydHlVUkwpIHRocm93IG5ldyBFcnJvcignVGhlIGh5cGVydHlVUkwgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XHJcbiAgICBpZiAoIWJ1cykgdGhyb3cgbmV3IEVycm9yKCdUaGUgTWluaUJ1cyBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29uZmlndXJhdGlvbiBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcclxuXHJcbiAgICBzdXBlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24pO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgY29uc29sZS5pbmZvKCdbQ29udGV4dFJlcG9ydGVyXSBzdGFydGVkIHdpdGggdXJsOiAnLCBoeXBlcnR5VVJMKTtcclxuXHJcbiAgICB0aGlzLnN5bmNoZXIgPSBzeW5jaGVyID8gc3luY2hlciA6IGZhY3RvcnkuY3JlYXRlU3luY2hlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24pO1xyXG5cclxuXHJcbiAgICAvLyAgICB0aGlzLmRpc2NvdmVyeSA9IG5ldyBEaXNjb3ZlcnkoaHlwZXJ0eVVSTCwgYnVzKTtcclxuICAgIHRoaXMuZG9tYWluID0gZmFjdG9yeS5kaXZpZGVVUkwoY29uZmlndXJhdGlvbi5ydW50aW1lVVJMKS5kb21haW47XHJcbiAgICB0aGlzLmNvbnRleHRzID0ge307XHJcblxyXG4gICAgdGhpcy5jb250ZXh0RGVzY1VSTCA9ICdoeXBlcnR5LWNhdGFsb2d1ZTovL2NhdGFsb2d1ZS4nICsgdGhpcy5kb21haW4gKyAnLy53ZWxsLWtub3duL2RhdGFzY2hlbWEvQ29udGV4dCc7XHJcblxyXG5cclxuICAgIC8vICAgIHRoaXMuaGVhcnRiZWF0ID0gW107XHJcblxyXG4gICAgdGhpcy5zeW5jaGVyLm9uTm90aWZpY2F0aW9uKChldmVudCkgPT4ge1xyXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICBfdGhpcy5vbk5vdGlmaWNhdGlvbihldmVudCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvL1RPRE86IHVuY29tbWVudCB3aGVuIHVzZWQgd2l0aCBzZXJ2aWNlIGZyYW1ld29yayBkZXZlbG9wIGJyYW5jaFxyXG5cclxuICAgIHRoaXMuc3luY2hlci5vbkNsb3NlKChldmVudCkgPT4ge1xyXG5cclxuICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0UmVwb3J0ZXIub25DbG9zZV0nKTtcclxuICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgX3RoaXMuc2V0U3RhdHVzKGV2ZW50LmlkLCAndW5hdmFpbGFibGUnKTtcclxuICAgICAgZXZlbnQuYWNrKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvL1RPRE86IG1vdmUgdG8gVXNlciBhdmFpbGFiaWxpdHkgUmVwb3J0ZXIgb3IgdG8gYWJzdHJhY3QgSHlwZXJ0eUNvbnRleHRSZXBvcnRlclxyXG5cclxuICBzdGFydCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIHRoaXMuc3luY2hlci5yZXN1bWVSZXBvcnRlcnMoe3N0b3JlOiB0cnVlfSkudGhlbigocmVwb3J0ZXJzKSA9PiB7XHJcblxyXG4gICAgICAgIGxldCByZXBvcnRlcnNMaXN0ID0gT2JqZWN0LmtleXMocmVwb3J0ZXJzKTtcclxuXHJcbiAgICAgICAgaWYgKHJlcG9ydGVyc0xpc3QubGVuZ3RoICA+IDApIHtcclxuXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRSZXBvcnRlci5zdGFydF0gcmVzdW1pbmcgJywgcmVwb3J0ZXJzW3JlcG9ydGVyc0xpc3RbMF1dKTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgYXZhaWxhYmlsaXR5IHRvIGF2YWlsYWJsZVxyXG5cclxuICAgICAgICAgIF90aGlzLmNvbnRleHRzID0gcmVwb3J0ZXJzO1xyXG5cclxuICAgICAgICAgIC8vVE9ETzpcclxuICAgICAgICAgIHJlcG9ydGVyc0xpc3QuZm9yRWFjaCgoY29udGV4dCkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5fb25TdWJzY3JpcHRpb24oX3RoaXMuY29udGV4dHNbY29udGV4dF0pO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgcmVzb2x2ZShfdGhpcy5jb250ZXh0cyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dFJlcG9ydGVyLnN0YXJ0XSBub3RoaW5nIHRvIHJlc3VtZSAnLCByZXBvcnRlcnMpO1xyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDb250ZXh0UmVwb3J0ZXJdIFJlc3VtZSBmYWlsZWQgfCAnLCByZWFzb24pO1xyXG4gICAgICB9KTtcclxuICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgcmVqZWN0KCdbQ29udGV4dFJlcG9ydGVyXSBTdGFydCBmYWlsZWQgfCAnLCByZWFzb24pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJvY2Vzc05vdGlmaWNhdGlvbihldmVudCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dFJlcG9ydGVyLnByb2Nlc3NOb3RpZmljYXRpb246ICcsIGV2ZW50KTtcclxuXHJcbiAgICBldmVudC5hY2soKTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IHN0YXR1cyBvYmplY3Qgc3luY2hlclxyXG4gICAqIEBwYXJhbSAge1VSTC5Vc2VyVVJMfSBjb250YWN0cyBMaXN0IG9mIFVzZXJzXHJcbiAgICogQHJldHVybiB7UHJvbWlzZX1cclxuICAgKi9cclxuICBjcmVhdGUoaWQsIGluaXQsIHJlc291cmNlcywgbmFtZSA9ICdteUNvbnRleHQnLCByZXBvcnRlciA9IG51bGwsIHJldXNlVVJMID0gbnVsbCkge1xyXG4gICAgLy9kZWJ1Z2dlcjtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgaW5wdXQ7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAoIXJlcG9ydGVyICYmICFyZXVzZVVSTCkge1xyXG4gICAgICAgIGlucHV0ID0ge3Jlc291cmNlczogcmVzb3VyY2VzLCBleHBpcmVzOiAzMH07XHJcbiAgICAgIH0gZWxzZSBpZiAocmVwb3J0ZXIgJiYgIXJldXNlVVJMKSB7XHJcbiAgICAgICAgaW5wdXQgPSB7cmVzb3VyY2VzOiByZXNvdXJjZXMsIGV4cGlyZXM6IDMwLCByZXBvcnRlcjogcmVwb3J0ZXJ9O1xyXG4gICAgICB9IGVsc2UgaWYgKCFyZXBvcnRlciAmJiByZXVzZVVSTCkge1xyXG4gICAgICAgIGlucHV0ID0ge3Jlc291cmNlczogcmVzb3VyY2VzLCBleHBpcmVzOiAzMCwgcmV1c2VVUkw6IHJldXNlVVJMfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpbnB1dCA9IHtyZXNvdXJjZXM6IHJlc291cmNlcywgZXhwaXJlczogMzAsIHJldXNlVVJMOiByZXVzZVVSTCwgcmVwb3J0ZXI6IHJlcG9ydGVyfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc29sZS5pbmZvKCdbQ29udGV4dFJlcG9ydGVyLmNyZWF0ZV0gbGV0cyBjcmVhdGUgYSBuZXcgVXNlciBhdmFpbGFiaWxpdHkgQ29udGV4dCBPYmplY3QgJywgaW5wdXQpO1xyXG4gICAgICBfdGhpcy5zeW5jaGVyLmNyZWF0ZShfdGhpcy5jb250ZXh0RGVzY1VSTCwgW10sIGluaXQsIHRydWUsIGZhbHNlLCBuYW1lLCBudWxsLCBpbnB1dClcclxuICAgICAgICAudGhlbigoY29udGV4dCkgPT4ge1xyXG4gICAgICAgICAgX3RoaXMuY29udGV4dHNbaWRdID0gY29udGV4dDtcclxuXHJcbiAgICAgICAgICBfdGhpcy5fb25TdWJzY3JpcHRpb24oY29udGV4dCk7XHJcbiAgICAgICAgICByZXNvbHZlKGNvbnRleHQpO1xyXG5cclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIF9vblN1YnNjcmlwdGlvbihjb250ZXh0KSB7XHJcbiAgICBjb250ZXh0Lm9uU3Vic2NyaXB0aW9uKChldmVudCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDb250ZXh0UmVwb3J0ZXIuX29uU3Vic2NyaXB0aW9uXSBhY2NlcHRpbmc6ICcsIGV2ZW50KTtcclxuICAgICAgZXZlbnQuYWNjZXB0KCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldENvbnRleHQoaWQsIG5ld0NvbnRleHQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBjb25zb2xlLmxvZygnVEhJUyBbQ29udGV4dFJlcG9ydGVyLnNldENvbnRleHRdIGJlZm9yZSBjaGFuZ2UgOicsIF90aGlzLmNvbnRleHRzW2lkXSk7XHJcbiAgICBjb25zb2xlLmxvZygnW0NvbnRleHRSZXBvcnRlci5zZXRDb250ZXh0XSBiZWZvcmUgY2hhbmdlIDonLCBfdGhpcy5jb250ZXh0c1tpZF0uZGF0YSk7XHJcblxyXG4gICAgLy8gICAgX3RoaXMuY29udGV4dHNbaWRdLmRhdGEudmFsdWVzWzBdLnZhbHVlID0gbmV3Q29udGV4dDtcclxuXHJcbiAgICBfdGhpcy5jb250ZXh0c1tpZF0uZGF0YS52YWx1ZXMgPSBuZXdDb250ZXh0O1xyXG4gICAgY29uc29sZS5kZWJ1ZygnW0NvbnRleHRSZXBvcnRlci5zZXRDb250ZXh0XSBhZnRlciBjaGFuZ2UgOicsIF90aGlzLmNvbnRleHRzW2lkXS5kYXRhKTtcclxuICAgIF90aGlzLnRyaWdnZXIoaWQgKyAnLWNvbnRleHQtdXBkYXRlJywgbmV3Q29udGV4dCk7XHJcblxyXG4gIH1cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb250ZXh0UmVwb3J0ZXI7XHJcbiIsIi8qKlxyXG4qIFRoZSBVc2VyUHJvZmlsZSBhY2NvcmRpbmcgdG8gVXNlciBJZGVudGl0eSBEYXRhIE1vZGVsXHJcbiovXHJcblxyXG5cclxuY2xhc3MgVXNlclByb2ZpbGUge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih1c2VybmFtZSwgdXNlclVSTCwgcGljdHVyZSwgbmFtZSwgbG9jYWxlLCBwcm9maWxlKSB7XHJcblxyXG4gICAgaWYgKHVzZXJuYW1lKSB7IHRoaXMucHJlZmVycmVkX3VzZXJuYW1lID0gdXNlcm5hbWU7IH1cclxuICAgIGlmIChwaWN0dXJlKSB7IHRoaXMucGljdHVyZSA9IHBpY3R1cmU7IH1cclxuICAgIGlmIChuYW1lKSB7IHRoaXMubmFtZSA9IG5hbWU7IH1cclxuICAgIGlmIChsb2NhbGUpIHsgdGhpcy5sb2NhbGUgPSBsb2NhbGU7IH1cclxuICAgIGlmICh1c2VyVVJMKSB7IHRoaXMudXNlclVSTCA9IHVzZXJVUkw7IH1cclxuICAgIGlmIChwcm9maWxlKSBPYmplY3QuYXNzaWduKHRoaXMsIHByb2ZpbGUpO1xyXG5cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFVzZXJQcm9maWxlO1xyXG4iLCIvKipcclxuKiBUaGUgSWRlbnRpdHkgaW5mbyB0byBiZSBhZGRlZCB0byBNZXNzYWdlLkJvZHkuSWRlbnRpdHlcclxuKi9cclxuXHJcbmltcG9ydCBVc2VyUHJvZmlsZSBmcm9tICcuL1VzZXJQcm9maWxlJztcclxuXHJcbmNsYXNzIE1lc3NhZ2VCb2R5SWRlbnRpdHkge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih1c2VybmFtZSwgdXNlclVSTCwgcGljdHVyZSwgbmFtZSwgbG9jYWxlLCBpZHAsIGFzc2VydGlvbiwgcHJvZmlsZSkge1xyXG5cclxuICAgIGlmICghaWRwKSB0aHJvdyBuZXcgRXJyb3IoJ0lEUCBzaG91bGQgYmUgYSBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghdXNlcm5hbWUpIHRocm93IG5ldyBFcnJvcigndXNlcm5hbWUgc2hvdWxkIGJlIGEgcGFyYW1ldGVyJyk7XHJcblxyXG4gICAgdGhpcy5pZHAgPSBpZHA7XHJcblxyXG4gICAgaWYgKGFzc2VydGlvbikgICAgICB7IHRoaXMuYXNzZXJ0aW9uID0gYXNzZXJ0aW9uOyB9XHJcbiAgICB0aGlzLnVzZXJQcm9maWxlID0gbmV3IFVzZXJQcm9maWxlKHVzZXJuYW1lLCB1c2VyVVJMLCBwaWN0dXJlLCBuYW1lLCBsb2NhbGUsIHByb2ZpbGUpO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzc2FnZUJvZHlJZGVudGl0eTtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuZXhwb3J0IGNvbnN0IENvbW11bmljYXRpb25TdGF0dXMgPSB7XHJcbiAgT1BFTjogJ29wZW4nLFxyXG4gIFBFTkRJTkc6ICdwZW5kaW5nJyxcclxuICBDTE9TRUQ6ICdjbG9zZWQnLFxyXG4gIFBBVVNFRDogJ3BhdXNlZCcsXHJcbiAgRkFJTEVEOiAnZmFpbGVkJ1xyXG59O1xyXG5cclxuZXhwb3J0IGxldCBjb21tdW5pY2F0aW9uT2JqZWN0ID0ge1xyXG4gIHN0YXJ0aW5nVGltZTogJycsXHJcbiAgc3RhdHVzOiAnJyxcclxuICBwYXJ0aWNpcGFudHM6IHt9XHJcbn07XHJcblxyXG5leHBvcnQgbGV0IGNvbW11bmljYXRpb25DaGlsZHJlbiA9IHtcclxuICBcInBhcmVudFwiIDogXCJjb21tdW5pY2F0aW9uXCIsXHJcbiAgXCJsaXN0ZW5lclwiIDogXCJyZXNvdXJjZXNcIixcclxuICBcInR5cGVcIiA6IFwiSHlwZXJ0eVJlc291cmNlXCJcclxufTtcclxuXHJcbi8qXHJcbmV4cG9ydCBsZXQgY29tbXVuaWNhdGlvbk9iamVjdCA9IHtcclxuICBpZDogJycsXHJcbiAgbmFtZTogJycsXHJcbiAgb3duZXI6ICcnLFxyXG4gIHNjaGVtZTogJ2NvbW0nLFxyXG4gIHN0YXJ0aW5nVGltZTogJycsXHJcbiAgbGFzdE1vZGlmaWVkOiAnJyxcclxuICBkdXJhdGlvbjogJycsXHJcbiAgc3RhdHVzOiAnJyxcclxuICBwYXJ0aWNpcGFudHM6IFtdXHJcbn07XHJcbiovXHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4qIFRvIG1hbmFnZSBHcm91cCBDaGF0IEludml0YXRpb25zXHJcbiogQGF1dGhvciBQYXVsbyBDaGFpbmhvIFtwYXVsby1nLWNoYWluaG9AYWx0aWNlbGFicy5jb21dXHJcbiogQHZlcnNpb24gMC4xLjBcclxuKi9cclxuXHJcbi8vIFRPRE86IGhhdmUgYW4gaW5zdGFuY2UgcGVyIENoYXRDb250cm9sbGVyXHJcblxyXG5jbGFzcyBJbnZpdGF0aW9uc0hhbmRsZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihoeXBlcnR5VVJMKSB7XHJcblxyXG4gICAgaWYgKCFoeXBlcnR5VVJMKSB0aHJvdyBFcnJvcignaHlwZXJ0eVVSTCBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlY3knKTtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX2h5cGVydHlVUkwgPSBoeXBlcnR5VVJMO1xyXG5cclxuICAgIF90aGlzLl9wZW5kaW5nID0ge307IC8vIEFsbCBwZW5kaW5nIGludml0YXRpb25zXHJcbiAgfVxyXG5cclxuICBzZXQgaW52aXRhdGlvblJlc3BvbnNlKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9pbnZpdGF0aW9uc1Jlc3BvbnNlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaGFuZGxlIG5vdGlmaWNhdGlvbnMgZm9yIGRpc2Nvbm5lY3RlZCBIeStlcnRpZXMuXHJcbiAgICogQHBhcmFtICB7RGlzY292ZXJlZE9iamVjdFtdfSAgICBkaXNjb25uZWN0ZWQgIGFycmF5IG9mIGRpc2NvdmVyZWQgaHlwZXJ0aWVzIHRoYXQgYXJlIGRpc2Nvbm5lY3RlZFxyXG4gICAqIEBwYXJhbSAge0RhdGFPYmplY3RSZXBvcnRlcn0gICAgRGF0YU9iamVjdFJlcG9ydGVyICAgRGF0YSBPYmplY3QgUmVwb3J0ZXIgYWRkcmVzc2VkIGJ5IGludml0YXRpb25zXHJcbiAgICovXHJcblxyXG4gIGludml0ZURpc2Nvbm5lY3RlZEh5cGVydGllcyhkaXNjb25uZWN0ZWQsIGRhdGFPYmplY3RSZXBvcnRlcikge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBjb25zb2xlLmxvZygnW0dyb3VwQ2hhdE1hbmFnZXIuSW52aXRhdGlvbnNIYW5kbGVyLmludml0ZURpc2Nvbm5lY3RlZEh5cGVydGllc10gbGV0cyBpbnZpdGUgJywgZGlzY29ubmVjdGVkKTtcclxuXHJcbiAgICBkaXNjb25uZWN0ZWQuZm9yRWFjaCgoZGlzY29ubmVjdGVkSHlwZXJ0eSk9PntcclxuXHJcbiAgICAgIGlmICghX3RoaXMuX3BlbmRpbmdbZGF0YU9iamVjdFJlcG9ydGVyXSkge1xyXG4gICAgICAgIF90aGlzLl9wZW5kaW5nW2RhdGFPYmplY3RSZXBvcnRlcl0gPSB7fTtcclxuICAgICAgfVxyXG5cclxuICAgICAgX3RoaXMuX3BlbmRpbmdbZGF0YU9iamVjdFJlcG9ydGVyXVtkaXNjb25uZWN0ZWRIeXBlcnR5LmRhdGEuaHlwZXJ0eUlEXSA9IGRpc2Nvbm5lY3RlZEh5cGVydHk7XHJcblxyXG4gICAgICBkaXNjb25uZWN0ZWRIeXBlcnR5Lm9uTGl2ZShfdGhpcy5faHlwZXJ0eVVSTCwoKT0+e1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbR3JvdXBDaGF0TWFuYWdlci5jcmVhdGVdIGRpc2Nvbm5lY3RlZCBIeXBlcnR5IGlzIGJhY2sgdG8gbGl2ZScsIGRpc2Nvbm5lY3RlZEh5cGVydHkpO1xyXG5cclxuICAgICAgICBkYXRhT2JqZWN0UmVwb3J0ZXIuaW52aXRlT2JzZXJ2ZXJzKFtkaXNjb25uZWN0ZWRIeXBlcnR5LmRhdGEuaHlwZXJ0eUlEXSk7XHJcblxyXG4gICAgICAgIGRpc2Nvbm5lY3RlZEh5cGVydHkudW5zdWJzY3JpYmVMaXZlKF90aGlzLl9oeXBlcnR5VVJMKTtcclxuXHJcbiAgICAgICAgZGVsZXRlIF90aGlzLl9wZW5kaW5nW2RhdGFPYmplY3RSZXBvcnRlcl1bZGlzY29ubmVjdGVkSHlwZXJ0eS5kYXRhLmh5cGVydHlJRF07XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJvY2VzcyBzZW50IGludml0YXRpb25zLiBJbiBjYXNlIGludml0YXRpb25zIGFyZSBub3QgYWNrbm93bGVkZ2UgYnkgcmVjaXBpZW50IGl0IHdpbGwgYmUgaGFuZGxlZCBhcyBhIGRpc2Nvbm5lY3RlZCBoeXBlcnR5XHJcbiAgICogQHBhcmFtICB7RGlzY292ZXJlZE9iamVjdFtdfSAgICBsaXZlICBhcnJheSBvZiBkaXNjb3ZlcmVkIGh5cGVydGllcyB0aGF0IGFyZSBvciB3ZXJlIGxpdmVcclxuICAgKiBAcGFyYW0gIHtEYXRhT2JqZWN0UmVwb3J0ZXJ9ICAgIERhdGFPYmplY3RSZXBvcnRlciAgIERhdGEgT2JqZWN0IFJlcG9ydGVyIGFkZHJlc3NlZCBieSBpbnZpdGF0aW9uc1xyXG4gICAqL1xyXG5cclxuICBwcm9jZXNzSW52aXRhdGlvbnMobGl2ZSwgZGF0YU9iamVjdFJlcG9ydGVyKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBpbnZpdGF0aW9ucyA9IGRhdGFPYmplY3RSZXBvcnRlci5pbnZpdGF0aW9ucyB8fCBbXTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW0dyb3VwQ2hhdE1hbmFnZXIuSW52aXRhdGlvbnNIYW5kbGVyLnByb2Nlc3NJbnZpdGF0aW9uc10gd2FpdGluZyBmb3IgcmVwbGllcyAnLCBpbnZpdGF0aW9ucywgdGhpcy5faW52aXRhdGlvbnNSZXNwb25zZSk7XHJcblxyXG4gICAgaW52aXRhdGlvbnMuZm9yRWFjaCgoaW52aXRhdGlvbikgPT4ge1xyXG4gICAgICBpbnZpdGF0aW9uLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbR3JvdXBDaGF0TWFuYWdlci5JbnZpdGF0aW9uc0hhbmRsZXIucHJvY2Vzc0ludml0YXRpb25zXSAtIE9LOiAnLCByZXN1bHQsIHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLl9pbnZpdGF0aW9uc1Jlc3BvbnNlKSB7IHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UocmVzdWx0KTsgfVxyXG4gICAgICB9KS5jYXRjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5wcm9jZXNzSW52aXRhdGlvbnNdIC0gTk9UIE9LOiAnLCByZXN1bHQsIHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLl9pbnZpdGF0aW9uc1Jlc3BvbnNlKSB7IHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UocmVzdWx0KTsgfVxyXG4gICAgICAgIF90aGlzLmludml0ZURpc2Nvbm5lY3RlZEh5cGVydGllcyhbbGl2ZVtyZXN1bHQuaW52aXRlZF1dLCBkYXRhT2JqZWN0UmVwb3J0ZXIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHJlc3VtZURpc2NvdmVyaWVzKGRpc2NvdmVyeUVuZ2luZSwgZ3JvdXBDaGF0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgbGl2ZSA9IHt9O1xyXG4gICAgICBsZXQgbGl2ZUh5cGVydGllcyA9IFtdO1xyXG4gICAgICBsZXQgZGlzY29ubmVjdGVkID0gW107XHJcbiAgICAgIGxldCB1bnN1YnNjcmlwdG9uUHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgIGRpc2NvdmVyeUVuZ2luZS5yZXN1bWVEaXNjb3ZlcmllcygpLnRoZW4oKGRpc2NvdmVyaWVzKSA9PiB7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbR3JvdXBDaGF0TWFuYWdlci5JbnZpdGF0aW9uc0hhbmRsZXIucmVzdW1lRGlzY292ZXJpZXNdIGZvdW5kOiAnLCBkaXNjb3Zlcmllcyk7XHJcblxyXG4gICAgICAgIGRpc2NvdmVyaWVzLmZvckVhY2goKGRpc2NvdmVyeSkgPT57XHJcblxyXG4gICAgICAgICAgaWYgKGRpc2NvdmVyeS5kYXRhLnJlc291cmNlcyAmJiBkaXNjb3ZlcnkuZGF0YS5yZXNvdXJjZXNbMF0gPT09ICdjaGF0Jykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0dyb3VwQ2hhdE1hbmFnZXIuSW52aXRhdGlvbnNIYW5kbGVyLnJlc3VtZURpc2NvdmVyaWVzXSByZXN1bWluZzogJywgZGlzY292ZXJ5KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkaXNjb3ZlcnkuZGF0YS5zdGF0dXMgPT09ICdsaXZlJyApIHsvLyBwcmV2aW91c2x5IGRpc2NvdmVyZWQgb2JqZWN0IGlzIG5vdyBsaXZlXHJcbiAgICAgICAgICAgICAgbGl2ZVtkaXNjb3ZlcnkuZGF0YS5oeXBlcnR5SURdID0gZGlzY292ZXJ5O1xyXG4gICAgICAgICAgICAgIGxpdmVIeXBlcnRpZXMucHVzaChkaXNjb3ZlcnkuZGF0YS5oeXBlcnR5SUQpO1xyXG4gICAgICAgICAgICAgIHVuc3Vic2NyaXB0b25Qcm9taXNlcy5wdXNoKCBkaXNjb3ZlcnkudW5zdWJzY3JpYmVMaXZlKF90aGlzLl9oeXBlcnR5VVJMKSApO1xyXG4gICAgICAgICAgICB9IGVsc2Ugey8vIHByZXZpb3VzbHkgZGlzY292ZXJlZCBvYmplY3QgaXMgc3RpbGwgZGlzY29ubmVjdGVkXHJcbiAgICAgICAgICAgICAgZGlzY29ubmVjdGVkLnB1c2goZGlzY292ZXJ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChkaXNjb25uZWN0ZWQubGVuZ3RoID4gMCkgX3RoaXMuaW52aXRlRGlzY29ubmVjdGVkSHlwZXJ0aWVzKGRpc2Nvbm5lY3RlZCwgZ3JvdXBDaGF0KTtcclxuXHJcbiAgICAgICAgaWYgKCBPYmplY3Qua2V5cyhsaXZlKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBncm91cENoYXQuaW52aXRlT2JzZXJ2ZXJzKGxpdmVIeXBlcnRpZXMpO1xyXG5cclxuICAgICAgICAgIGlmIChncm91cENoYXQuaW52aXRhdGlvbnMubGVuZ3RoID4gMCkgX3RoaXMucHJvY2Vzc0ludml0YXRpb25zKGxpdmUsIGdyb3VwQ2hhdCk7XHJcblxyXG4gICAgICAgICAgUHJvbWlzZS5hbGwodW5zdWJzY3JpcHRvblByb21pc2VzKS50aGVuKCgpPT57IHJlc29sdmUoKX0pO1xyXG5cclxuICAgICAgICB9IGVsc2UgcmVzb2x2ZSgpO1xyXG5cclxuICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICByZWplY3QoJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5yZXN1bWVEaXNjb3Zlcmllc10gZmFpbGVkIHwgJywgcmVhc29uKTtcclxuICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgYW5kIGNsZWFuIGFsbCBwZW5kaW5nIGludml0YXRpb25zLlxyXG4gICAqIEBwYXJhbSAge0RhdGFPYmplY3RSZXBvcnRlcn0gICAgRGF0YU9iamVjdFJlcG9ydGVyICAgRGF0YSBPYmplY3QgUmVwb3J0ZXIgYWRkcmVzc2VkIGJ5IGludml0YXRpb25zXHJcbiAgICogQHJldHVybiB7UHJvbWlzZX0gcmV0dXJuIGEgcHJvbWlzZSB3aGVuIGFsbCB1bnN1YnNjcmlwdG9ucyBmb3IgcGVuZGluZyBpbnZpdGF0aW9ucyBhcmUgZmluaXNoZWRcclxuICAgKi9cclxuXHJcbiAgY2xlYW5JbnZpdGF0aW9ucyhkYXRhT2JqZWN0UmVwb3J0ZXIpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGNoYXRJbnZpdGF0aW9ucyA9IF90aGlzLl9wZW5kaW5nW2RhdGFPYmplY3RSZXBvcnRlcl07XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5jbGVhbkludml0YXRpb25zXSAnLCBjaGF0SW52aXRhdGlvbnMpO1xyXG5cclxuICAgIGlmIChjaGF0SW52aXRhdGlvbnMpIHtcclxuXHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgbGV0IHBlbmRpbmdJbnZpdGF0aW9ucyA9IE9iamVjdC5rZXlzKGNoYXRJbnZpdGF0aW9ucyk7XHJcblxyXG4gICAgICAgIGxldCB1bnN1YnNjcmlwdG9uUHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgcGVuZGluZ0ludml0YXRpb25zLmZvckVhY2goKGludml0YXRpb24pPT57XHJcbiAgICAgICAgICB1bnN1YnNjcmlwdG9uUHJvbWlzZXMucHVzaCggY2hhdEludml0YXRpb25zW2ludml0YXRpb25dLnVuc3Vic2NyaWJlTGl2ZShfdGhpcy5faHlwZXJ0eVVSTCkgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgUHJvbWlzZS5hbGwocGVuZGluZ0ludml0YXRpb25zKS50aGVuKCgpPT57IHJlc29sdmUoKTsgfSk7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2UgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG5cclxuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSW52aXRhdGlvbnNIYW5kbGVyO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuKiBUaGUgR3JvdXAgQ2hhdCBBUEkgaXMgdXNlZCB0byBjb250cm9sIGEgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cclxuKiBAYXV0aG9yIFZpdG9yIFNpbHZhIFt2aXRvci10LXNpbHZhQHRlbGVjb20ucHRdXHJcbiogQHZlcnNpb24gMC4xLjBcclxuKi9cclxuXHJcbi8vaW1wb3J0IHsgVXNlckluZm8gfSBmcm9tICcuL1VzZXJJbmZvJztcclxuaW1wb3J0IFJlZ2lzdHJhdGlvblN0YXR1cyBmcm9tICcuLi9kaXNjb3ZlcnkvUmVnaXN0cmF0aW9uU3RhdHVzJztcclxuaW1wb3J0IEludml0YXRpb25zSGFuZGxlciBmcm9tICcuL0ludml0YXRpb25zSGFuZGxlcic7XHJcblxyXG5jbGFzcyBDaGF0Q29udHJvbGxlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHN5bmNoZXIsIGRpc2NvdmVyeSwgZG9tYWluLCBzZWFyY2gsIGlkZW50aXR5LCBtYW5hZ2VyKSB7XHJcblxyXG4gICAgaWYgKCFzeW5jaGVyKSB0aHJvdyBFcnJvcignU3luY2hlciBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlY3knKTtcclxuICAgIGlmICghZGlzY292ZXJ5KSB0aHJvdyBFcnJvcignRGlzY292ZXIgaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XHJcbiAgICBpZiAoIWRvbWFpbikgdGhyb3cgRXJyb3IoJ0RvbWFpbiBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlY3knKTtcclxuICAgIGlmICghc2VhcmNoKSB0aHJvdyBFcnJvcignU2VhcmNoIGlzIGEgbmVjZXNzYXJ5IGRlcGVuZGVjeScpO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fc3luY2hlciA9IHN5bmNoZXI7XHJcbiAgICBfdGhpcy5kaXNjb3ZlcnkgPSBkaXNjb3Zlcnk7XHJcbiAgICBfdGhpcy5zZWFyY2ggPSBzZWFyY2g7XHJcbiAgICBfdGhpcy5teUlkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdyZXBvcnRlcic7XHJcbiAgICBfdGhpcy5jaGlsZF9jc2VxID0gMDtcclxuICAgIF90aGlzLmRvbWFpbiA9IGRvbWFpbjtcclxuXHJcbiAgICBfdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XHJcblxyXG4gICAgY29uc3QgaHlwZXJ0eVVSTCA9IHN5bmNoZXIub3duZXI7XHJcblxyXG4gICAgX3RoaXMuX29iamVjdERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIGRvbWFpbiArICcvLndlbGwta25vd24vZGF0YXNjaGVtYS9Db21tdW5pY2F0aW9uJztcclxuXHJcbiAgICBfdGhpcy5faW52aXRhdGlvbnNIYW5kbGVyID0gbmV3IEludml0YXRpb25zSGFuZGxlcihoeXBlcnR5VVJMKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXQgaW52aXRhdGlvbnNIYW5kbGVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ludml0YXRpb25zSGFuZGxlcjtcclxuICB9XHJcblxyXG4gIGdldCB1cmwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuZGF0YU9iamVjdFJlcG9ydGVyLnVybCA6IHRoaXMuZGF0YU9iamVjdE9ic2VydmVyLnVybDtcclxuICB9XHJcblxyXG4gIHNldCBkYXRhT2JqZWN0UmVwb3J0ZXIoZGF0YU9iamVjdFJlcG9ydGVyKSB7XHJcblxyXG4gICAgaWYgKCFkYXRhT2JqZWN0UmVwb3J0ZXIpIHRocm93IG5ldyBFcnJvcignW0NoYXRDb250cm9sbGVyXSBUaGUgZGF0YSBvYmplY3QgcmVwb3J0ZXIgaXMgbmVjZXNzYXJ5IHBhcmFtZXRlciAnKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuY29udHJvbGxlck1vZGUgPSAncmVwb3J0ZXInO1xyXG5cclxuICAgIC8vIEhhbmRsZXIgdG8gcHJvY2VzcyByZWNlaXZlZCBmaWxlc1xyXG5cclxuICAgIC8vIGRhdGFPYmplY3RSZXBvcnRlci5vblJlc3BvbnNlKGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdFJlcG9ydGVyIC0gb25SZXNwb25zZV0nLCBldmVudCk7XHJcbiAgICAvLyAgIGlmIChfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UpIHtcclxuICAgIC8vICAgICBfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UoZXZlbnQpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvL1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgZGF0YU9iamVjdFJlcG9ydGVyLm9uU3Vic2NyaXB0aW9uKGZ1bmN0aW9uKGV2ZW50KSB7XHJcblxyXG4gICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlICdzdWJzY3JpYmUnOiBfdGhpcy5fb25TdWJzY3JpYmUoZXZlbnQpOyBicmVhaztcclxuICAgICAgICBjYXNlICd1bnN1YnNjcmliZSc6IF90aGlzLl9vblVuc3Vic2NyaWJlKGV2ZW50KTsgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIF90aGlzLl9zZXRPbkFkZENoaWxkTGlzdGVuZXIoZGF0YU9iamVjdFJlcG9ydGVyKTtcclxuXHJcbiAgICBkYXRhT2JqZWN0UmVwb3J0ZXIub25SZWFkKChldmVudCkgPT4ge1xyXG4gICAgICBldmVudC5hY2NlcHQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRhdGFPYmplY3RSZXBvcnRlci5vbkV4ZWN1dGUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZXZlbnQubWV0aG9kKSB7XHJcbiAgICAgICAgY2FzZSAnYWRkVXNlcic6XHJcbiAgICAgICAgICBfdGhpcy5hZGRVc2VyKGV2ZW50LnBhcmFtc1swXSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LmFjY2VwdCgpO1xyXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xyXG4gICAgICAgICAgICBldmVudC5yZWplY3QocmVhc29uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdyZW1vdmVVc2VyJzpcclxuICAgICAgICAgICAgX3RoaXMucmVtb3ZlVXNlcihldmVudC5wYXJhbXMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGV2ZW50LmFjY2VwdCgpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWFzb246JywgcmVhc29uKTtcclxuICAgICAgICAgICAgICBldmVudC5yZWplY3QocmVhc29uKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6IGV2ZW50LnJlamVjdCgnW0NoYXRDb250cm9sbGVyLm9uRXhlY3V0ZV0gQ2hhdCBtZXRob2QgZXhlY3V0aW9uIG5vdCBhY2NlcHRlZCBieSBSZXBvcnRlcicpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIF90aGlzLl9kYXRhT2JqZWN0UmVwb3J0ZXIgPSBkYXRhT2JqZWN0UmVwb3J0ZXI7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFPYmplY3RSZXBvcnRlcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuICB9XHJcblxyXG4gIGdldCBtZXNzYWdlcygpIHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlci5fY2hpbGRyZW5PYmplY3RzIDogdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyLl9jaGlsZHJlbk9iamVjdHM7XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0YU9iamVjdE9ic2VydmVyKGRhdGFPYmplY3RPYnNlcnZlcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdvYnNlcnZlcic7XHJcblxyXG4gICAgX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlciA9IGRhdGFPYmplY3RPYnNlcnZlcjtcclxuXHJcbiAgICBkYXRhT2JqZWN0T2JzZXJ2ZXIub25DaGFuZ2UoJyonLCBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1PYnNlcnZlciAtIG9uQ2hhbmdlJywgZXZlbnQpO1xyXG5cclxuICAgICAgaWYgKGV2ZW50LmZpZWxkLmluY2x1ZGVzKCdwYXJ0aWNpcGFudHMnKSkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY1R5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ2FkZCc6XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fb25Vc2VyQWRkZWQpIF90aGlzLl9vblVzZXJBZGRlZChldmVudCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgJ3JlbW92ZSc6XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fb25Vc2VyUmVtb3ZlZCkgX3RoaXMuX29uVXNlclJlbW92ZWQoZXZlbnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25DaGFuZ2UpIF90aGlzLl9vbkNoYW5nZShldmVudCk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgX3RoaXMuX3NldE9uQWRkQ2hpbGRMaXN0ZW5lcihkYXRhT2JqZWN0T2JzZXJ2ZXIpO1xyXG5cclxuICAgIC8vIGxldCBjaGlsZHJlbnMgPSBkYXRhT2JqZWN0T2JzZXJ2ZXIuY2hpbGRyZW5zO1xyXG4gICAgLy8gT2JqZWN0LmtleXMoY2hpbGRyZW5zKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgLy8gICBpZiAoX3RoaXMuX29uTWVzc2FnZSkgX3RoaXMuX29uTWVzc2FnZSh7XHJcbiAgICAvLyAgICAgY2hpbGRJZDogY2hpbGQsXHJcbiAgICAvLyAgICAgaWRlbnRpdHk6IGNoaWxkcmVuc1tjaGlsZF0uaWRlbnRpdHksXHJcbiAgICAvLyAgICAgdmFsdWU6IGNoaWxkcmVuc1tjaGlsZF0uZGF0YVxyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFPYmplY3RPYnNlcnZlcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlcjtcclxuICB9XHJcblxyXG4gIF9zZXRPbkFkZENoaWxkTGlzdGVuZXIoZGF0YU9iamVjdCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgZGF0YU9iamVjdC5vbkFkZENoaWxkKGZ1bmN0aW9uKGNoaWxkKSB7XHJcbiAgICAgIF90aGlzLmNoaWxkX2NzZXEgKz0xO1xyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5fc2V0T25BZGRDaGlsZExpc3RlbmVyXSBuZXcgQ2hpbGQgcmVjZWl2ZWQ6ICcsIGNoaWxkKTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25NZXNzYWdlKSBfdGhpcy5fb25NZXNzYWdlKGNoaWxkKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBnZXQgZGF0YU9iamVjdCgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInID8gdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIgOiB0aGlzLmRhdGFPYmplY3RPYnNlcnZlcjtcclxuICB9XHJcblxyXG4gIHNldCBjbG9zZUV2ZW50KGV2ZW50KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX2Nsb3NlRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICBpZiAoX3RoaXMuX29uQ2xvc2UpIF90aGlzLl9vbkNsb3NlKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGdldCBjbG9zZUV2ZW50KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fY2xvc2VFdmVudDtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgX29uU3Vic2NyaWJlKGV2ZW50KSB7XHJcblxyXG4gICAgbGV0IGRhdGFPYmplY3RSZXBvcnRlciA9IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuXHJcbiAgICBldmVudC5hY2NlcHQoKTtcclxuXHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZV0gZXZlbnQnLCBldmVudCwgZGF0YU9iamVjdFJlcG9ydGVyLnVybCk7XHJcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uU3Vic2NyaWJlXSBOZXcgdXNlciBoYXMgc3Vic2NyaWJlIHRoaXMgb2JqZWN0OiAnLCBkYXRhT2JqZWN0UmVwb3J0ZXIuZGF0YSwgZXZlbnQuaWRlbnRpdHkpO1xyXG5cclxuICAgIGxldCBpZGVudGl0eSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQuaWRlbnRpdHkpKTtcclxuXHJcbiAgICBpZiAoaWRlbnRpdHkuaGFzT3duUHJvcGVydHkoJ2Fzc2VydGlvbicpKSB7XHJcbiAgICAgIGRlbGV0ZSBpZGVudGl0eS5hc3NlcnRpb25cclxuICAgIH1cclxuXHJcbiAgICBsZXQgdXNlckluZm8gPSB7XHJcbiAgICAgIGh5cGVydHlVUkw6IGV2ZW50LnVybCxcclxuICAgICAgZG9tYWluOiBldmVudC5kb21haW4sXHJcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eVxyXG4gICAgfVxyXG4gICAgbGV0IHVzZXJVUkwgPSBldmVudC5pZGVudGl0eS51c2VyUHJvZmlsZS5ndWlkO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdICBuZXcgcGFydGljaXBhbnQnLCB1c2VySW5mbyk7XHJcbiAgICBpZiAoZXZlbnQuaWRlbnRpdHkubGVnYWN5KSB7XHJcbiAgICAgdXNlckluZm8ubGVnYWN5ID0gZXZlbnQuaWRlbnRpdHkubGVnYWN5O1xyXG4gICAgfVxyXG5cclxuICAgIGRhdGFPYmplY3RSZXBvcnRlci5kYXRhLnBhcnRpY2lwYW50c1t1c2VyVVJMXSA9IHVzZXJJbmZvO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdIGNvbW11bmljYXRpb25PYmplY3QgT0JKIGNoYXRjb250cm9sbGVyJywgZGF0YU9iamVjdFJlcG9ydGVyLmRhdGEucGFydGljaXBhbnRzKTtcclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmUgLSBvblN1YnNjcmlwdGlvbl0gJywgdXNlckluZm8pO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZSAtIHRoaXMuX29uVXNlckFkZGVkXSAnLCB0aGlzLl9vblVzZXJBZGRlZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX29uVXNlckFkZGVkKSB0aGlzLl9vblVzZXJBZGRlZCh1c2VySW5mbyk7XHJcbiAgfVxyXG5cclxuICBfb25VbnN1YnNjcmliZShldmVudCkge1xyXG4gICAgbGV0IGRhdGFPYmplY3RSZXBvcnRlciA9IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uVW5zdWJzY3JpYmVdIGV2ZW50JywgZXZlbnQsIGRhdGFPYmplY3RSZXBvcnRlci51cmwpO1xyXG5cclxuICAgIGxldCBwYXJ0aWNpcGFudCA9IGV2ZW50LmlkZW50aXR5LnVzZXJQcm9maWxlO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZV0gIHBhcnRpY2lwYW50IGxlZnQnLCBwYXJ0aWNpcGFudCk7XHJcbiAgICBpZiAoZXZlbnQuaWRlbnRpdHkubGVnYWN5KSB7XHJcbiAgICAgIHBhcnRpY2lwYW50LmxlZ2FjeSA9IGV2ZW50LmlkZW50aXR5LmxlZ2FjeTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGUgZGF0YU9iamVjdFJlcG9ydGVyLmRhdGEucGFydGljaXBhbnRzW3BhcnRpY2lwYW50LnVzZXJVUkxdO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZSAtIHRoaXMuX29uVXNlclJlbW92ZWRdICcsIHRoaXMub25Vc2VyUmVtb3ZlZCk7XHJcbiAgICBpZiAodGhpcy5fb25Vc2VyUmVtb3ZlZCkgdGhpcy5fb25Vc2VyUmVtb3ZlZChwYXJ0aWNpcGFudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGZpbGUuXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgIElzIHRoZSBmaWxlIHRvIGJlIHNlbnQuXHJcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb21tdW5pY2F0aW9uLkNoYXRNZXNzYWdlPn0gICAgICAgIEl0IHJldHVybnMgdGhlIENoYXRNZXNzYWdlIGNoaWxkIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBTeW5jaGVyIGFzIGEgUHJvbWlzZS5cclxuICAgKi9cclxuICBzZW5kRmlsZShmaWxlKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBtb2RlID0gX3RoaXMuY29udHJvbGxlck1vZGU7XHJcbiAgICBsZXQgZGF0YU9iamVjdCA9IG1vZGUgPT09ICdyZXBvcnRlcicgPyBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIgOiBfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXI7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IGlkZW50aXR5ID0ge1xyXG4gICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBkYXRhT2JqZWN0LmFkZEh5cGVydHlSZXNvdXJjZSgncmVzb3VyY2VzJywgJ2ZpbGUnLCAgZmlsZSwgaWRlbnRpdHkpLnRoZW4oZnVuY3Rpb24ocmVzb3VyY2VGaWxlKSB7XHJcblxyXG4gICAgICAgICAgbGV0IGlkZW50aXR5ID0ge1xyXG4gICAgICAgICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgbGV0IGZpbGVTZW50RXZ0ID0geyB2YWx1ZSA6IHJlc291cmNlRmlsZSwgaWRlbnRpdHk6IGlkZW50aXR5LCByZXNvdXJjZTogcmVzb3VyY2VGaWxlfTtcclxuXHJcbiAgICAgICAgICBsZXQgcmVwb3J0ZXJTdGF0dXMgPSBuZXcgUmVnaXN0cmF0aW9uU3RhdHVzKGRhdGFPYmplY3QudXJsLCBfdGhpcy5fbWFuYWdlci5fcnVudGltZVVSTCwgX3RoaXMuX21hbmFnZXIuX2h5cGVydHlVUkwsIF90aGlzLl9tYW5hZ2VyLl9idXMgKTtcclxuXHJcbiAgICAgICAgICAvLyByZWN1cnNpdmUgZnVuY3Rpb24gdG8gc3luYyB3aXRoIGNoYXQgcmVwb3J0ZXJcclxuXHJcbiAgICAgICAgICAgIGxldCBzaGFyZTJSZXBvcnRlciA9IGZ1bmN0aW9uKGZpbGUsIHN1YnNjcmliZXIsIGV2dCwgc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN0YXR1c09mUmVwb3J0ZXIgPSBzdGF0dXM7XHJcbiAgICAgICAgICAgICAgZmlsZS5zaGFyaW5nU3RhdHVzLnRoZW4ocmVzb2x2ZShldnQpKS5jYXRjaCgocmVzdWx0KT0+e1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5zZW5kRmlsZV0gc2hhcmUgZmFpbGVkOiAnLCByZXN1bHQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHN0YXR1c09mUmVwb3J0ZXIub25MaXZlKCBzdWJzY3JpYmVyLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXNPZlJlcG9ydGVyLnVuc3Vic2NyaWJlTGl2ZShzdWJzY3JpYmVyKTtcclxuICAgICAgICAgICAgICAgIGZpbGUuc2hhcmUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzaGFyZTJSZXBvcnRlcihmaWxlLCBzdWJzY3JpYmVyLCBldnQsIHN0YXR1c09mUmVwb3J0ZXIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIC8vVE9ETzogc3Vic2NyaWJlIHRvIHN5bmMgd2hlbiByZXBvcnRlciBpcyBsaXZlLiBOZXcgc3luY2hlZCBtZXNzYWdlcyBzaG91bGQgdHJpZ2dlciBvbk1lc3NhZ2UgaWUgb25DaGlsZFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzaGFyZTJSZXBvcnRlcihyZXNvdXJjZUZpbGUsIF90aGlzLl9tYW5hZ2VyLl9oeXBlcnR5VVJMLCBmaWxlU2VudEV2dCwgcmVwb3J0ZXJTdGF0dXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xyXG4gICAgICByZWplY3QocmVhc29uKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGEgY2hhdCBtZXNzYWdlLlxyXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICAgIG1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICBJcyB0aGUgQ2hhdE1lc3NhZ2UgdG8gYmUgc2VudC5cclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbW11bmljYXRpb24uQ2hhdE1lc3NhZ2U+fSAgICAgICAgSXQgcmV0dXJucyB0aGUgQ2hhdE1lc3NhZ2UgY2hpbGQgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIFN5bmNoZXIgYXMgYSBQcm9taXNlLlxyXG4gICAqL1xyXG4gIHNlbmQobWVzc2FnZSwgaWRlbnRpdHkpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IG1vZGUgPSBfdGhpcy5jb250cm9sbGVyTW9kZTtcclxuICAgIGxldCBkYXRhT2JqZWN0ID0gbW9kZSA9PT0gJ3JlcG9ydGVyJyA/IF90aGlzLmRhdGFPYmplY3RSZXBvcnRlciA6IF90aGlzLmRhdGFPYmplY3RPYnNlcnZlcjtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4vLyAgICAgIGxldCBfZGF0YU9iamVjdENoaWxkO1xyXG4gICAgICBfdGhpcy5jaGlsZF9jc2VxICs9IDE7XHJcbiAgICAgIGxldCBtc2cgPSB7XHJcblxyXG4vKiAgICAgICAgdXJsOiBkYXRhT2JqZWN0LmRhdGEudXJsLFxyXG4gICAgICAgIGNzZXE6IF90aGlzLmNoaWxkX2NzZXEsXHJcbiAgICAgICAgcmVwb3J0ZXI6IGRhdGFPYmplY3QuZGF0YS5yZXBvcnRlcixcclxuICAgICAgICBzY2hlbWE6IGRhdGFPYmplY3QuZGF0YS5zY2hlbWEsXHJcbiAgICAgICAgbmFtZTogZGF0YU9iamVjdC5kYXRhLm5hbWUsXHJcbiAgICAgICAgY3JlYXRlZCA6IG5ldyBEYXRlKCkudG9KU09OKCksKi9cclxuXHJcbiAgICAgICAgdHlwZTogJ2NoYXQnLFxyXG4gICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2VcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHNlbmRlciA9IGlkZW50aXR5ID8gaWRlbnRpdHkgOiB7XHJcbiAgICAgICAgdXNlclByb2ZpbGU6IF90aGlzLm15SWRlbnRpdHlcclxuICAgICAgfTtcclxuXHJcblxyXG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgY2hhdG1lc3NhZ2VzIHRvIHJlc291cmNlIC0gY2hhdCwgZmlsZVxyXG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgbWVzc2FnZSB0byBoeXBlcnR5UmVzb3VyY2UgLSBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2Rldi1zZXJ2aWNlLWZyYW1ld29yay90cmVlL2RldmVsb3AvZG9jcy9kYXRhbW9kZWwvZGF0YS1vYmplY3RzL2h5cGVydHktcmVzb3VyY2VcclxuICAgICAgLy8gVE9ETzogaGFuZGxlIHdpdGggbXVsdGlwbGUgcmVzb3VyY2VzIC0gaWYgdGhlIFwibWVzc2FnZVwiIHdpbGwgYmUgZGlmZmVyZW50IGZvciBlYWNoIHR5cGUgb2YgcmVzb3VyY2VzXHJcbiAgICAgIGRhdGFPYmplY3QuYWRkQ2hpbGQobXNnLCBzZW5kZXIpLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdENoaWxkKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1bYWRkQ2hpbGQgLSBDaGF0IE1lc3NhZ2VdOiAnLCBkYXRhT2JqZWN0Q2hpbGQpO1xyXG4gICAgICAgIC8vcmVzb2x2ZShkYXRhT2JqZWN0Q2hpbGQpO1xyXG5cclxuICAgICAgICAvL1RPRE86IG1vdmUgdG8gc2VwYXJhdGUgZnVuY3Rpb25cclxuXHJcblxyXG4gICAgICAgIGxldCBtc2cgPSB7XHJcbiAgICAgICAgICBjaGlsZElkOiBkYXRhT2JqZWN0Q2hpbGQuX2NoaWxkSWQsXHJcbiAgICAgICAgICBmcm9tOiBkYXRhT2JqZWN0Q2hpbGQuX293bmVyLFxyXG4gICAgICAgICAgdmFsdWU6IGRhdGFPYmplY3RDaGlsZC5kYXRhLFxyXG4gICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXHJcbiAgICAgICAgICBpZGVudGl0eTogc2VuZGVyXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IHJlcG9ydGVyU3RhdHVzID0gbmV3IFJlZ2lzdHJhdGlvblN0YXR1cyhkYXRhT2JqZWN0LnVybCwgX3RoaXMuX21hbmFnZXIuX3J1bnRpbWVVUkwsIF90aGlzLl9tYW5hZ2VyLl9oeXBlcnR5VVJMLCBfdGhpcy5fbWFuYWdlci5fYnVzICk7XHJcblxyXG4gICAgICAgIC8vIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0byBzeW5jIHdpdGggY2hhdCByZXBvcnRlclxyXG5cclxuICAgICAgICAgIGxldCBzaGFyZTJSZXBvcnRlciA9IGZ1bmN0aW9uKGNoaWxkLCBzdWJzY3JpYmVyLCBtc2csIHN0YXR1cykge1xyXG4gICAgICAgICAgICBsZXQgc3RhdHVzT2ZSZXBvcnRlciA9IHN0YXR1cztcclxuICAgICAgICAgICAgY2hpbGQuc2hhcmluZ1N0YXR1cy50aGVuKHJlc29sdmUobXNnKSkuY2F0Y2goKHJlc3VsdCk9PntcclxuXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNPZlJlcG9ydGVyLm9uTGl2ZSggc3Vic2NyaWJlciwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBzdGF0dXNPZlJlcG9ydGVyLnVuc3Vic2NyaWJlTGl2ZShzdWJzY3JpYmVyKTtcclxuICAgICAgICAgICAgICAgICAgY2hpbGQuc2hhcmUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIHNoYXJlMlJlcG9ydGVyKGNoaWxkLCBzdWJzY3JpYmVyLCBtc2csIHN0YXR1c09mUmVwb3J0ZXIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAvL1RPRE86IHN1YnNjcmliZSB0byBzeW5jIHdoZW4gcmVwb3J0ZXIgaXMgbGl2ZS4gTmV3IHN5bmNoZWQgbWVzc2FnZXMgc2hvdWxkIHRyaWdnZXIgb25NZXNzYWdlIGllIG9uQ2hpbGRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc2hhcmUyUmVwb3J0ZXIoZGF0YU9iamVjdENoaWxkLCBfdGhpcy5fbWFuYWdlci5faHlwZXJ0eVVSTCwgbXNnLCByZXBvcnRlclN0YXR1cyk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBbb25DaGFuZ2UgZGVzY3JpcHRpb25dXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIFtkZXNjcmlwdGlvbl1cclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uQ2hhbmdlKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uQ2hhbmdlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSBuZXcgbWVzc2FnZXMuXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGhhbmRsZSB3aXRoIG5ldyBtZXNzYWdlc1xyXG4gICAqIEByZXR1cm4ge0NvbW11bmljYXRpb24uQ2hhdE1lc3NhZ2V9IG1cclxuICAgKi9cclxuICBvbk1lc3NhZ2UoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25NZXNzYWdlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBbb25Vc2VyQWRkZWQgZGVzY3JpcHRpb25dXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIFtkZXNjcmlwdGlvbl1cclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uVXNlckFkZGVkKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uVXNlckFkZGVkID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIHRoZSBhbiB1c2VyIHdhcyByZW1vdmVkXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIGhhbmRsZSB3aXRoIHRoZSByZW1vdmVkIHVzZXJcclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uVXNlclJlbW92ZWQoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25Vc2VyUmVtb3ZlZCA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlY2VpdmUgcmVxdWVzdHMgdG8gY2xvc2UgdGhlIEdyb3VwIENoYXQgaW5zdGFuY2UuXHJcbiAgICogQHJldHVybiB7RGVsZXRlRXZlbnR9IFRoZSBEZWxldGVFdmVudCBmaXJlZCBieSB0aGUgU3luY2hlciB3aGVuIHRoZSBDaGF0IGlzIGNsb3NlZC5cclxuICAgKi9cclxuICBvbkNsb3NlKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uQ2xvc2UgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIG9uUmVzcG9uc2UoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25SZXNwb25zZSA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCAvIGludml0ZSBuZXcgdXNlciBvbiBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxyXG4gICAqIE9ubHkgdGhlIFJlcG9ydGVyLCBpLmUuIHRoZSBIeXBlcnR5IHRoYXQgaGFzIGNyZWF0ZWQgdGhlIEdyb3VwIENoYXQsIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIHtVUkwuVXNlclVSTH0gIHVzZXJzICBVc2VyIHRvIGJlIGludml0ZWQgdG8gam9pbiB0aGUgR3JvdXAgQ2hhdCB0aGF0IGlzIGlkZW50aWZpZWQgd2l0aCByZVRISU5LIFVzZXIgVVJMLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59ICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW52aXRlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYWRkVXNlcih1c2Vycykge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGhhdmVFbXB0eUVsZW1lbnRzID0gKGVsZW1lbnQpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ0VsZW1lbnQ6JywgZWxlbWVudC5sZW5ndGgpO1xyXG4gICAgICByZXR1cm4gZWxlbWVudC5sZW5ndGggIT09IDA7XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBub3RGb3VuZEVsZW1lbnRzID0gKGVsZW1lbnQpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ3VzZXIgbm90IGZvdW5kOiAnLCBlbGVtZW50KTtcclxuICAgICAgcmV0dXJuICEoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZyk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGlmICh1c2Vycy5maWx0ZXIoaGF2ZUVtcHR5RWxlbWVudHMpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiByZWplY3QoJ0RvblxcJ3QgaGF2ZSB1c2VycyB0byBpbnZpdGUnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlcnMgXTogJywgdXNlcnMpO1xyXG5cclxuICAgICAgLypfdGhpcy5zZWFyY2gudXNlcnModXNlcnMsIGRvbWFpbnMsIFsnY29tbSddLCBbJ2NoYXQnXSlcclxuXHJcbiAgICAudGhlbigoaHlwZXJ0aWVzSURzKSA9PiB7XHJcblxyXG4gICAgICBpZiAoaHlwZXJ0aWVzSURzLmZpbHRlcihub3RGb3VuZEVsZW1lbnRzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aHJvdyAnVXNlcihzKSBub3QgZm91bmQnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc2VsZWN0ZWRIeXBlcnRpZXMgPSBoeXBlcnRpZXNJRHMubWFwKChoeXBlcnR5KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGh5cGVydHkuaHlwZXJ0eUlEO1xyXG4gICAgICB9KTsqL1xyXG5cclxuICAgICAgbGV0IHVzZXJzRGlzY292ZXJ5ID0gW107XHJcbiAgICAgIGxldCBkaXNjb25uZWN0ZWQgPSBbXTtcclxuICAgICAgbGV0IGxpdmUgPSB7fTtcclxuXHJcbiAgICAgIHVzZXJzLmZvckVhY2goKHVzZXIpID0+IHtcclxuICAgICAgICBsZXQgdXNlckRpc2NvdmVyeVByb21pc2UgPSBfdGhpcy5kaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNETyh1c2VyLnVzZXIsIFsnY29tbSddLCBbJ2NoYXQnXSwgdXNlci5kb21haW4pO1xyXG4gICAgICAgICAgdXNlcnNEaXNjb3ZlcnkucHVzaCh1c2VyRGlzY292ZXJ5UHJvbWlzZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBQcm9taXNlLmFsbCh1c2Vyc0Rpc2NvdmVyeSkudGhlbigodXNlckRpc2NvdmVyeVJlc3VsdHMpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJzXSBVc2VycyBEaXNjb3ZlcnkgUmVzdWx0cy0+JywgdXNlckRpc2NvdmVyeVJlc3VsdHMpO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRIeXBlcnRpZXMgPSBbXTtcclxuXHJcbiAgICAgICAgIHVzZXJEaXNjb3ZlcnlSZXN1bHRzLmZvckVhY2goKHVzZXJEaXNjb3ZlcnlSZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgICAgdXNlckRpc2NvdmVyeVJlc3VsdC5mb3JFYWNoKChkaXNjb3ZlcmVkKT0+e1xyXG4gICAgICAgICAgICAgaWYgKGRpc2NvdmVyZWQuZGF0YS5zdGF0dXMgPT09ICdsaXZlJyl7XHJcbiAgICAgICAgICAgICAgIHNlbGVjdGVkSHlwZXJ0aWVzLnB1c2goZGlzY292ZXJlZC5kYXRhLmh5cGVydHlJRCk7XHJcbiAgICAgICAgICAgICAgIGxpdmVbZGlzY292ZXJlZC5kYXRhLmh5cGVydHlJRF0gPSBkaXNjb3ZlcmVkO1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgZWxzZSBpZiAoZGlzY29ubmVjdGVkLmxlbmd0aCA8IDUpIGRpc2Nvbm5lY3RlZC5wdXNoKGRpc2NvdmVyZWQpO1xyXG4gICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXJdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5bmNoZXIgQ3JlYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXFxuJyk7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXJdU2VsZWN0ZWQgSHlwZXJ0aWVzOiAhISEgJywgc2VsZWN0ZWRIeXBlcnRpZXMpO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgSGF2ZSAke3NlbGVjdGVkSHlwZXJ0aWVzLmxlbmd0aH0gdXNlcnM7YCk7XHJcbi8vICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlcl0gSHlwZXJ0aWVzSURzICcsIGh5cGVydGllc0lEcyk7XHJcblxyXG4gICAgICAgIGxldCBkYXRhT2JqZWN0ID0gX3RoaXMuY29udHJvbGxlck1vZGUgPT09ICdyZXBvcnRlcicgPyBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIgOiBfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXI7XHJcblxyXG4gICAgICAgIGlmIChkaXNjb25uZWN0ZWQubGVuZ3RoID4gMCkgX3RoaXMuX2ludml0YXRpb25zSGFuZGxlci5pbnZpdGVEaXNjb25uZWN0ZWRIeXBlcnRpZXMoZGlzY29ubmVjdGVkLCBkYXRhT2JqZWN0KTtcclxuXHJcbiAgICAgICAgZGF0YU9iamVjdC5pbnZpdGVPYnNlcnZlcnMoc2VsZWN0ZWRIeXBlcnRpZXMpO1xyXG5cclxuICAgICAgICBpZiAoZGF0YU9iamVjdC5pbnZpdGF0aW9ucy5sZW5ndGggPiAwKSBfdGhpcy5faW52aXRhdGlvbnNIYW5kbGVyLnByb2Nlc3NJbnZpdGF0aW9ucyhsaXZlLCBkYXRhT2JqZWN0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB9KVxyXG4gICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXUFyZSBpbnZpdGVkIHdpdGggc3VjY2VzcyAnICsgdXNlcnMubGVuZ3RoICsgJyB1c2VyczsnKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB0cnlpbmcgdG8gaW52aXRlIHVzZXJzO1xcbicsIHJlYXNvbik7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVxdWVzdCB0aGUgUmVwb3J0ZXIgdG8gYWRkIC8gaW52aXRlIG5ldyB1c2VyIG9uIGFuIGV4aXN0aW5nIEdyb3VwIENoYXQgaW5zdGFuY2UuXHJcbiAgICogT25seSBPYnNlcnZlcnMgYXJlIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIHtVUkwuVXNlclVSTH0gIHVzZXJzICBVc2VyIHRvIGJlIGludml0ZWQgdG8gam9pbiB0aGUgR3JvdXAgQ2hhdCB0aGF0IGlzIGlkZW50aWZpZWQgd2l0aCByZVRISU5LIFVzZXIgVVJMLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59ICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW52aXRlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYWRkVXNlclJlcSh1c2Vycykge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy9jaGVjayBpcyBPYnNlcnZlciBhbmQgaW52b2tlIG9ic2VydmVyLmV4ZWN1dGUoKSB3aXRoIG5ldyBwcm9taXNlXHJcbiAgICBsZXQgaGF2ZUVtcHR5RWxlbWVudHMgPSAoZWxlbWVudCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnRWxlbWVudDonLCBlbGVtZW50Lmxlbmd0aCk7XHJcbiAgICAgIHJldHVybiBlbGVtZW50Lmxlbmd0aCAhPT0gMDtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgaWYgKHVzZXJzLmZpbHRlcihoYXZlRW1wdHlFbGVtZW50cykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIERvblxcJ3QgaGF2ZSB1c2VycyB0byBhZGQnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIV90aGlzLmNvbnRyb2xsZXJNb2RlID09PSAnb2JzZXJ2ZXInKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIG9ubHkgYWxsb3dlZCB0byBDaGF0IE9ic2VydmVyJyk7XHJcblxyXG4gICAgICBsZXQgYWRkVXNlciA9IF90aGlzLmFkZFVzZXIodXNlcnMpO1xyXG5cclxuICAgICAgaWYgKF90aGlzLl9kYXRhT2JqZWN0T2JzZXJ2ZXIpIHtcclxuICAgICAgICBhZGRVc2VyID0gX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlci5leGVjdXRlKCdhZGRVc2VyJywgdXNlcnMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhZGRVc2VyLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIFJlcXVlc3QgYWNjZXB0ZWQgYnkgUmVwb3J0ZXIgJyk7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5hZGRVc2VyUmVxXSBSZXF1ZXN0IHJlamVjdGVkIGJ5IFJlcG9ydGVyO1xcbicsIHJlYXNvbik7XHJcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9KTtcclxuXHJcbn1cclxuXHJcbiAgb25JbnZpdGF0aW9uUmVzcG9uc2UoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UgPSBjYWxsYmFjaztcclxuICAgIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIuaW52aXRhdGlvblJlc3BvbnNlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSBhIHVzZXIgZnJvbSBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxyXG4gICAqIE9ubHkgdGhlIFJlcG9ydGVyLCBpLmUuIHRoZSBIeXBlcnR5IHRoYXQgaGFzIGNyZWF0ZWQgdGhlIEdyb3VwIENoYXQsIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHJldHVybiB7PFByb21pc2U+IGJvb2xlYW59IFByb21pc2Ugd2l0aCB0aGUgc3RhdHVzXHJcbiAgICovXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgYSB1c2VyIGZyb20gYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cclxuICAgKiBPbmx5IHRoZSBSZXBvcnRlciwgaS5lLiB0aGUgSHlwZXJ0eSB0aGF0IGhhcyBjcmVhdGVkIHRoZSBHcm91cCBDaGF0LCBpcyBhbGxvd2VkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLlxyXG4gICAqIEBwYXJhbSAge1VSTC5Vc2VyVVJMfSB1c2VyICAgICAgIFVzZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBHcm91cCBDaGF0IHRoYXQgaXMgaWRlbnRpZmllZCB3aXRoIHJlVEhJTksgVXNlciBVUkwuXHJcbiAgICogQHJldHVybiB7PFByb21pc2U+IGJvb2xlYW59ICAgICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcmVtb3ZlVXNlcih1c2VyKSB7XHJcblxyXG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoZSByZW1vdmVVc2VyO1xyXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1Ob3QgeWV0IGltcGxlbWVudGVkOiAnLCB1c2VyKTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xvc2UgYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cclxuICAgKiBPbmx5IGF2YWlsYWJsZSB0byBDaGF0IEdyb3VwIFJlcG9ydGVycyBpLmUuIHRoZSBIeXBlcnR5IGluc3RhbmNlIHRoYXQgY3JlYXRlZCB0aGUgR3JvdXAgQ2hhdC5cclxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5Cb29sZWFufSBJdCByZXR1cm5zIGFzIGEgUHJvbWlzZSB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBjbG9zZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGNsb3NlKGRlbCA9IHRydWUpIHtcclxuICAgIC8vIFRPRE86IHRoZSBkYXRhT2JqZWN0UmVwb3J0ZXIuZGVsZXRlIHNob3VsZCBiZSBhIFByb21pc2U7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIFxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBcclxuICAgICAgaWYgKF90aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInKSB7XHJcbiAgICAgICAgLy8gcmVwb3J0ZXJcclxuICAgICAgICBfdGhpcy5faW52aXRhdGlvbnNIYW5kbGVyLmNsZWFuSW52aXRhdGlvbnMoX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIGlmICghZGVsKSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9tYW5hZ2VyLmNvbW11bmljYXRpb25PYmplY3Quc3RhdHVzID0gJ2Nsb3NlZCc7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG5cclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBkZWxldGUgX3RoaXMuX21hbmFnZXIuX3JlcG9ydGVyc0NvbnRyb2xsZXJzW190aGlzLmRhdGFPYmplY3RSZXBvcnRlci51cmxdO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyLmRlbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fb25DbG9zZSkgX3RoaXMuX29uQ2xvc2Uoe1xyXG4gICAgICAgICAgICAgICAgICBjb2RlOiAyMDAsXHJcbiAgICAgICAgICAgICAgICAgIGRlc2M6ICdkZWxldGVkJyxcclxuICAgICAgICAgICAgICAgICAgdXJsOiBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIudXJsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBvYnNlcnZlclxyXG4gICAgICAgIGlmKGRlbCl7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBkZWxldGUgX3RoaXMuX21hbmFnZXIuX29ic2VydmVyc0NvbnRyb2xsZXJzW190aGlzLmRhdGFPYmplY3RPYnNlcnZlci51cmxdO1xyXG4gICAgICAgICAgICBfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgcmVqZWN0KGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgIC8vIFRPRE86IHNlbmQgbWVzc2FnZSBcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfSBcclxuICAgICAgICBcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENoYXRDb250cm9sbGVyO1xyXG4iLCJpbXBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlckluZm8ge1xyXG5cclxuICBjb25zdHJ1Y3RvcihoeXBlcnR5VVJMLCBkb21haW4sIGlkZW50aXR5KSB7XHJcblxyXG4gICAgbGV0IGNvbXBsZXRlSWRlbnRpdHkgPSBkZWVwQ2xvbmUoaWRlbnRpdHkpO1xyXG4gICAgaWYgKCFpZGVudGl0eS5oYXNPd25Qcm9wZXJ0eSgndXNlclByb2ZpbGUnKSkge1xyXG4gICAgICBjb21wbGV0ZUlkZW50aXR5Wyd1c2VyUHJvZmlsZSddID0gaWRlbnRpdHk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaHlwZXJ0eVVSTDogaHlwZXJ0eVVSTCxcclxuICAgICAgZG9tYWluLCBkb21haW4sXHJcbiAgICAgIGlkZW50aXR5OiBjb21wbGV0ZUlkZW50aXR5XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbn1cclxuIiwiXHJcbi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vIFNlcnZpY2UgRnJhbWV3b3JrXHJcbi8vaW1wb3J0IElkZW50aXR5TWFuYWdlciBmcm9tICcuLi9pZGVudGl0eU1hbmFnZXIvSWRlbnRpdHlNYW5hZ2VyJztcclxuLy9pbXBvcnQgUmVnaXN0cmF0aW9uU3RhdHVzIGZyb20gJy4uL2Rpc2NvdmVyeS9SZWdpc3RyYXRpb25TdGF0dXMnO1xyXG4vL2ltcG9ydCBEaXNjb3ZlcnkgZnJvbSAnLi4vZGlzY292ZXJ5L0Rpc2NvdmVyeSc7XHJcbi8vaW1wb3J0IFN5bmNoZXIgZnJvbSAnLi4vc3luY2hlci9TeW5jaGVyJztcclxuXHJcbi8vIFV0aWxzXHJcbi8vaW1wb3J0IHtkaXZpZGVVUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuLy9pbXBvcnQgU2VhcmNoIGZyb20gJy4uL3V0aWxzL1NlYXJjaCc7XHJcblxyXG4vLyBJbnRlcm5hbHNcclxuaW1wb3J0IHsgY29tbXVuaWNhdGlvbk9iamVjdCwgQ29tbXVuaWNhdGlvblN0YXR1cywgY29tbXVuaWNhdGlvbkNoaWxkcmVuIH0gZnJvbSAnLi9jb21tdW5pY2F0aW9uJztcclxuaW1wb3J0IENoYXRDb250cm9sbGVyIGZyb20gJy4vQ2hhdENvbnRyb2xsZXInO1xyXG5pbXBvcnQgeyBVc2VySW5mbyB9IGZyb20gJy4vVXNlckluZm8nO1xyXG5cclxuLyoqXHJcbiogSHlwZXJ0eSBHcm91cCBDaGF0IE1hbmFnZXIgQVBJIChIeXBlcnR5Q2hhdClcclxuKiBAYXV0aG9yIFZpdG9yIFNpbHZhIFt2aXRvci10LXNpbHZhQHRlbGVjb20ucHRdXHJcbiogQHZlcnNpb24gMC4xLjBcclxuKi9cclxuY2xhc3MgQ2hhdE1hbmFnZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihteVVybCwgYnVzLCBjb25maWd1cmF0aW9uLCBzeW5jaGVyLCBmYWN0b3J5KSB7XHJcbiAgICBpZiAoIW15VXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1tDaGF0TWFuYWdlci5jb25zdHJ1Y3Rvcl0gVGhlIG15VXJsIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG4gICAgaWYgKCFidXMpIHRocm93IG5ldyBFcnJvcignW0NoYXRNYW5hZ2VyLmNvbnN0cnVjdG9yXSBUaGUgTWluaUJ1cyBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKCdbQ2hhdE1hbmFnZXIuY29uc3RydWN0b3JdIFRoZSBjb25maWd1cmF0aW9uIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBpZiAoIXN5bmNoZXIpIHtcclxuICAgICAgc3luY2hlciA9IGZhY3RvcnkuY3JlYXRlU3luY2hlcihteVVybCwgYnVzLCBjb25maWd1cmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGhpcy5fcnVudGltZVVSTCA9IGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTDtcclxuXHJcbiAgICBsZXQgZG9tYWluID0gZmFjdG9yeS5kaXZpZGVVUkwoX3RoaXMuX3J1bnRpbWVVUkwpLmRvbWFpbjtcclxuICAgIGxldCBkaXNjb3ZlcnkgPSBmYWN0b3J5LmNyZWF0ZURpc2NvdmVyeShteVVybCwgY29uZmlndXJhdGlvbi5ydW50aW1lVVJMLCBidXMpO1xyXG4gICAgbGV0IGlkZW50aXR5TWFuYWdlciA9IGZhY3RvcnkuY3JlYXRlSWRlbnRpdHlNYW5hZ2VyKG15VXJsLCBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwsIGJ1cyk7XHJcblxyXG4gICAgX3RoaXMuX29iamVjdERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIGRvbWFpbiArICcvLndlbGwta25vd24vZGF0YXNjaGVtYS9Db21tdW5pY2F0aW9uJztcclxuXHJcbiAgICBfdGhpcy5fcmVwb3J0ZXJzQ29udHJvbGxlcnMgPSB7fTtcclxuICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVycyA9IHt9O1xyXG5cclxuICAgIF90aGlzLl9teVVybCA9IG15VXJsO1xyXG4gICAgX3RoaXMuX2J1cyA9IGJ1cztcclxuICAgIF90aGlzLl9zeW5jaGVyID0gc3luY2hlcjtcclxuICAgIF90aGlzLl9kb21haW4gPSBkb21haW47XHJcblxyXG4gICAgX3RoaXMuZGlzY292ZXJ5ID0gZGlzY292ZXJ5O1xyXG4gICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyID0gaWRlbnRpdHlNYW5hZ2VyO1xyXG4gICAgX3RoaXMuY3VycmVudElkZW50aXR5O1xyXG5cclxuICAgIF90aGlzLnNlYXJjaCA9IGZhY3RvcnkuY3JlYXRlU2VhcmNoKGRpc2NvdmVyeSwgaWRlbnRpdHlNYW5hZ2VyKTtcclxuXHJcbiAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcclxuXHJcbiAgICBfdGhpcy5jb21tdW5pY2F0aW9uQ2hpbGRyZW4gPSBjb21tdW5pY2F0aW9uQ2hpbGRyZW47XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlcl0gRGlzY292ZXIgJywgZGlzY292ZXJ5KTtcclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXJdIElkZW50aXR5IE1hbmFnZXIgJywgaWRlbnRpdHlNYW5hZ2VyKTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgc2V0IG9mZmxpbmUob2ZmbGluZSkge1xyXG4gICAgdGhpcy5fb2ZmbGluZSA9IG9mZmxpbmU7XHJcbiAgfVxyXG5cclxuICBnZXQgb2ZmbGluZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9vZmZsaW5lID8gdGhpcy5fb2ZmbGluZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIHByb2Nlc3NOb3RpZmljYXRpb24oZXZlbnQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLnByb2Nlc3NOb3RpZmljYXRpb246ICcsIGV2ZW50KTtcclxuXHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NyZWF0ZScpIHtcclxuXHJcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlIDEwMCBmb3IgTWVzc2FnZS5SZXNwb25zZVxyXG4gICAgICAvLyBldmVudC5hY2soMjAwKTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25JbnZpdGF0aW9uKSB7IF90aGlzLl9vbkludml0YXRpb24oZXZlbnQpOyB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkZWxldGUnKSB7XHJcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlIDIwMCBmb3IgTWVzc2FnZS5SZXNwb25zZVxyXG4gICAgICBldmVudC5hY2soMjAwKTtcclxuXHJcbiAgICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVyc1tldmVudC51cmxdLmNsb3NlRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgIGRlbGV0ZSBfdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbZXZlbnQudXJsXTtcclxuXHJcbiAgICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVycy5jbG9zZUV2ZW50ID0gZXZlbnQ7XHJcblxyXG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcclxuXHJcblxyXG4gICAgICBmb3IgKGxldCB1cmwgaW4gdGhpcy5fcmVwb3J0ZXJzQ29udHJvbGxlcnMpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlcnNDb250cm9sbGVyc1t1cmxdLmNsb3NlKGV2ZW50KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgdXJsIGluIHRoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzKSB7XHJcbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbdXJsXS5jbG9zZShldmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBteUlkZW50aXR5KGlkZW50aXR5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLm15SWRlbnRpdHldJyk7XHJcbiAgICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIHJlc29sdmUoaWRlbnRpdHkpO1xyXG5cclxuICAgICAgaWYgKF90aGlzLl9teVVybC5pbmNsdWRlcygnaHlwZXJ0eTovLycpKSB7XHJcbiAgICAgICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyLmRpc2NvdmVyVXNlclJlZ2lzdGVyZWQoKS50aGVuKChpZGVudGl0eSkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZShpZGVudGl0eSk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBfdGhpcy5pZGVudGl0eU1hbmFnZXIuZGlzY292ZXJJZGVudGl0eVBlcklkUCgpLnRoZW4oKGlkZW50aXR5KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKGlkZW50aXR5KTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgR3JvdXAgQ2hhdCBwcm92aWRpbmcgdGhlIG5hbWUgYW5kIHRoZSBpZGVudGlmaWVycyBvZiB1c2VycyB0byBiZSBpbnZpdGVkLlxyXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBuYW1lICBJcyBhIHN0cmluZyB0byBpZGVudGlmeSB0aGUgR3JvdXAgQ2hhdFxyXG4gICAqIEBwYXJhbSAge2FycmF5PFVSTC51c2VyVVJMPn0gICAgICAgICB1c2VycyBBcnJheSBvZiB1c2VycyB0byBiZSBpbnZpdGVkIHRvIGpvaW4gdGhlIEdyb3VwIENoYXQuIFVzZXJzIGFyZSBpZGVudGlmaWVkIHdpdGggcmVUSElOSyBVc2VyIFVSTCwgbGlrZSB0aGlzIGZvcm1hdCB1c2VyOi8vPGlwZGRvbWFpbj4vPHVzZXItaWRlbnRpZmllcj5cclxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5DaGF0Q29udHJvbGxlcn0gICAgQSBDaGF0Q29udHJvbGxlciBvYmplY3QgYXMgYSBQcm9taXNlLlxyXG4gICAqL1xyXG4gIGNyZWF0ZShuYW1lLCB1c2VycywgZXh0cmEgPSB7fSkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgc3luY2hlciA9IF90aGlzLl9zeW5jaGVyO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcclxuICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5jc2VxID0gMTtcclxuICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5zdGFydGluZ1RpbWUgPSBuZXcgRGF0ZSgpLnRvSlNPTigpO1xyXG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0LnN0YXR1cyA9ICBDb21tdW5pY2F0aW9uU3RhdHVzLk9QRU47XHJcblxyXG4gICAgICBsZXQgbXlJZGVudGl0eTtcclxuXHJcbiAgICAgIF90aGlzLm15SWRlbnRpdHkoKS50aGVuKChpZGVudGl0eSkgPT4ge1xyXG4gICAgICAgIG15SWRlbnRpdHkgPSBpZGVudGl0eTtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLmNyZWF0ZSBdIE15IElkZW50aXR5JywgaWRlbnRpdHkpO1xyXG5cclxuICAgICAgICAvLyBsZXQgdXJsID0gX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5yZXBvcnRlcjtcclxuXHJcbiAgICAgICAgbGV0IHVzZXJJbmZvID0gbmV3IFVzZXJJbmZvKF90aGlzLl9teVVybCwgX3RoaXMuX2RvbWFpbiwgaWRlbnRpdHkpO1xyXG5cclxuICAgICAgICAvLyBBZGQgbXkgaWRlbnRpdHlcclxuICAgICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0LnBhcnRpY2lwYW50c1tpZGVudGl0eS5ndWlkXSA9IHVzZXJJbmZvO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLmNyZWF0ZSBdIHBhcnRpY2lwYW50czogJywgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5wYXJ0aWNpcGFudHMpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuY3JlYXRlIF0gY29tbXVuaWNhdGlvbk9iamVjdCcsIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QpO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLmNyZWF0ZV0gc2VhcmNoaW5nICcgKyB1c2Vycyk7XHJcblxyXG4gICAgICAgIC8vbGV0IHVzZXJzU2VhcmNoID0gX3RoaXMuc2VhcmNoLnVzZXJzKHVzZXJzLCBkb21haW5zLCBbJ2NvbW0nXSwgWydjaGF0J10pO1xyXG5cclxuICAgICAgICBsZXQgdXNlcnNEaXNjb3ZlcnkgPSBbXTtcclxuXHJcbiAgICAgICAgbGV0IGRpc2Nvbm5lY3RlZCA9IFtdO1xyXG4gICAgICAgIGxldCBsaXZlID0ge307XHJcblxyXG4gICAgICAgIHVzZXJzLmZvckVhY2goKHVzZXIpID0+IHtcclxuICAgICAgICAgIGxldCB1c2VyRGlzY292ZXJ5UHJvbWlzZSA9IF90aGlzLmRpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllc0RPKHVzZXIudXNlciwgWydjb21tJ10sIFsnY2hhdCddLCB1c2VyLmRvbWFpbik7XHJcbiAgICAgICAgICB1c2Vyc0Rpc2NvdmVyeS5wdXNoKHVzZXJEaXNjb3ZlcnlQcm9taXNlKTtcclxuXHJcbiAgICAgICAgICAvL2lmICh1c2VyLnVzZXIuaW5jbHVkZXMoJzovLycpKSBtdXR1YWwgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgUHJvbWlzZS5hbGwodXNlcnNEaXNjb3ZlcnkpLnRoZW4oKHVzZXJEaXNjb3ZlcnlSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLmNyZWF0ZV0gVXNlcnMgRGlzY292ZXJ5IFJlc3VsdHMtPicsIHVzZXJEaXNjb3ZlcnlSZXN1bHRzKTtcclxuXHJcbiAgICAgICAgICBsZXQgc2VsZWN0ZWRIeXBlcnRpZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICB1c2VyRGlzY292ZXJ5UmVzdWx0cy5mb3JFYWNoKCh1c2VyRGlzY292ZXJ5UmVzdWx0KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB1c2VyRGlzY292ZXJ5UmVzdWx0LmZvckVhY2goKGRpc2NvdmVyZWQpPT57XHJcbiAgICAgICAgICAgICAgaWYgKGRpc2NvdmVyZWQuZGF0YS5zdGF0dXMgPT09ICdsaXZlJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRIeXBlcnRpZXMucHVzaChkaXNjb3ZlcmVkLmRhdGEuaHlwZXJ0eUlEKTtcclxuICAgICAgICAgICAgICAgIGxpdmVbZGlzY292ZXJlZC5kYXRhLmh5cGVydHlJRF0gPSBkaXNjb3ZlcmVkO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUbyBjb250cm9sIHRoZSBudW1iZXIgb2Ygc3Vic2NyaXB0aW9ucyB0byBkaXNjb25uZWN0ZWQgZGV2aWNlc1xyXG4gICAgICAgICAgICAgICAgIGlmIChkaXNjb25uZWN0ZWQubGVuZ3RoIDwgNSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZC5wdXNoKGRpc2NvdmVyZWQpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgLyogICAgICAgIHJldHVybiB1c2Vyc1NlYXJjaDtcclxuICAgICAgfSkudGhlbigoaHlwZXJ0aWVzSURzKSA9PiB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkSHlwZXJ0aWVzID0gaHlwZXJ0aWVzSURzLm1hcCgoaHlwZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGh5cGVydHkuaHlwZXJ0eUlEO1xyXG4gICAgICAgIH0pOyAqL1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5bmNoZXIgQ3JlYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXFxuJyk7XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlcl0gU2VsZWN0ZWQgSHlwZXJ0aWVzOiAhISEgJywgc2VsZWN0ZWRIeXBlcnRpZXMpO1xyXG4gICAgICAgICAgY29uc29sZS5pbmZvKGBIYXZlICR7c2VsZWN0ZWRIeXBlcnRpZXMubGVuZ3RofSB1c2VycztgKTtcclxuICAgICAgICAgIGxldCBtdXR1YWwgPSBleHRyYS5tdXR1YWwgPyBleHRyYS5tdXR1YWwgOiB0cnVlO1xyXG5cclxuICAgICAgICAgIGxldCBpbnB1dCA9IE9iamVjdC5hc3NpZ24oe3Jlc291cmNlczogWydjaGF0J10sIG11dHVhbDogbXV0dWFsfSwgZXh0cmEpO1xyXG4gICAgICAgICAgZGVsZXRlIGlucHV0Lm5hbWU7XHJcblxyXG4gICAgICAgICAgaWYgKF90aGlzLm9mZmxpbmUpIGlucHV0Lm9mZmxpbmUgPSBfdGhpcy5vZmZsaW5lO1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyXSBpbnB1dCBkYXRhOicsIGlucHV0KTtcclxuICAgICAgICAgIHJldHVybiBzeW5jaGVyLmNyZWF0ZShfdGhpcy5fb2JqZWN0RGVzY1VSTCwgc2VsZWN0ZWRIeXBlcnRpZXMsIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QsIHRydWUsIGZhbHNlLCBuYW1lLCB7fSwgaW5wdXQpO1xyXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdFJlcG9ydGVyKSB7XHJcblxyXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXJdIDMuIFJldHVybiBDcmVhdGUgRGF0YSBPYmplY3QgUmVwb3J0ZXInLCBkYXRhT2JqZWN0UmVwb3J0ZXIpO1xyXG5cclxuICAgICAgICAgIGxldCBjaGF0Q29udHJvbGxlciA9IG5ldyBDaGF0Q29udHJvbGxlcihzeW5jaGVyLCBfdGhpcy5kaXNjb3ZlcnksIF90aGlzLl9kb21haW4sIF90aGlzLnNlYXJjaCwgbXlJZGVudGl0eSwgX3RoaXMpO1xyXG4gICAgICAgICAgY2hhdENvbnRyb2xsZXIuZGF0YU9iamVjdFJlcG9ydGVyID0gZGF0YU9iamVjdFJlcG9ydGVyO1xyXG5cclxuICAgICAgICAgIF90aGlzLl9yZXBvcnRlcnNDb250cm9sbGVyc1tkYXRhT2JqZWN0UmVwb3J0ZXIudXJsXSA9IGNoYXRDb250cm9sbGVyO1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXJdIGNoYXRDb250cm9sbGVyIGludml0YXRpb25zSGFuZGxlcjogJywgICBjaGF0Q29udHJvbGxlci5pbnZpdGF0aW9uc0hhbmRsZXIpO1xyXG5cclxuICAgICAgICAgIC8vIHByb2Nlc3MgaW52aXRhdGlvbnMgdG8gaGFuZGxlIG5vdCByZWNlaXZlZCBpbnZpdGF0aW9uc1xyXG4gICAgICAgICAgaWYgKGRhdGFPYmplY3RSZXBvcnRlci5pbnZpdGF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNoYXRDb250cm9sbGVyLmludml0YXRpb25zSGFuZGxlci5wcm9jZXNzSW52aXRhdGlvbnMobGl2ZSwgZGF0YU9iamVjdFJlcG9ydGVyKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBJZiBhbnkgaW52aXRlZCBVc2VyIGlzIGRpc2Nvbm5lY3RlZCBsZXQncyB3YWl0IHVudGlsIGl0IGlzIGNvbm5lY3RlZCBhZ2FpblxyXG4gICAgICAgICAgaWYgKGRpc2Nvbm5lY3RlZC5sZW5ndGggPiAwKSBjaGF0Q29udHJvbGxlci5pbnZpdGF0aW9uc0hhbmRsZXIuaW52aXRlRGlzY29ubmVjdGVkSHlwZXJ0aWVzKGRpc2Nvbm5lY3RlZCwgZGF0YU9iamVjdFJlcG9ydGVyKTtcclxuXHJcbiAgICAgICAgICByZXNvbHZlKGNoYXRDb250cm9sbGVyKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLmNyZWF0ZV0gTXlJZGVudGl0eSBFcnJvcjonLCByZWFzb24pO1xyXG4gICAgICAgIHJldHVybiByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGhhbmRsZSBub3RpZmljYXRpb25zIGFib3V0IGluY29taW5nIGludml0YXRpb25zIHRvIGpvaW4gYSBHcm91cCBDaGF0LlxyXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBDcmVhdGVFdmVudCBUaGUgQ3JlYXRlRXZlbnQgZmlyZWQgYnkgdGhlIFN5bmNoZXIgd2hlbiBhbiBpbnZpdGFpb24gaXMgcmVjZWl2ZWRcclxuICAgKi9cclxuICBvbkludml0YXRpb24oY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25JbnZpdGF0aW9uID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gam9pbiBhIEdyb3VwIENoYXQuXHJcbiAgICogQHBhcmFtICB7VVJMLkNvbW11bmljYXRpb25VUkx9IGludml0YXRpb25VUkwgIFRoZSBDb21tdW5pY2F0aW9uIFVSTCBvZiB0aGUgR3JvdXAgQ2hhdCB0byBqb2luIHRoYXQgaXMgcHJvdmlkZWQgaW4gdGhlIGludml0YXRpb24gZXZlbnRcclxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5DaGF0Q29udHJvbGxlcn0gICAgICAgICAgICAgSXQgcmV0dXJucyB0aGUgQ2hhdENvbnRyb2xsZXIgb2JqZWN0IGFzIGEgUHJvbWlzZVxyXG4gICAqL1xyXG4gIGpvaW4oaW52aXRhdGlvblVSTCwgbXV0dWFsID0gdHJ1ZSwgaWRlbnRpdHkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBsZXQgc3luY2hlciA9IF90aGlzLl9zeW5jaGVyO1xyXG4gICAgICBsZXQgbXlJZGVudGl0eTtcclxuXHJcbiAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3luY2hlciBzdWJzY3JpYmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBcXG4nKTtcclxuICAgICAgY29uc29sZS5pbmZvKCdpbnZpdGF0aW9uVVJMJywgaW52aXRhdGlvblVSTCk7XHJcbiAgICAgIF90aGlzLm15SWRlbnRpdHkoaWRlbnRpdHkpLnRoZW4oKGlkZW50aXR5KSA9PiB7XHJcbiAgICAgICAgbXlJZGVudGl0eSA9IGlkZW50aXR5O1xyXG4gICAgICAgIGxldCBpbnB1dCA9IHtcclxuICAgICAgICAgIHNjaGVtYTogX3RoaXMuX29iamVjdERlc2NVUkwsXHJcbiAgICAgICAgICByZXNvdXJjZTogaW52aXRhdGlvblVSTCxcclxuICAgICAgICAgIHN0b3JlOiB0cnVlLFxyXG4gICAgICAgICAgcDJwOiBmYWxzZSxcclxuICAgICAgICAgIG11dHVhbDogbXV0dWFsLFxyXG4gICAgICAgICAgZG9tYWluX3N1YnNjcmlwdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGlkZW50aXR5OiBpZGVudGl0eVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChfdGhpcy5vZmZsaW5lKSBpbnB1dC5vZmZsaW5lID0gX3RoaXMub2ZmbGluZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN5bmNoZXIuc3Vic2NyaWJlKGlucHV0KTtcclxuXHJcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdE9ic2VydmVyKSB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhIE9iamVjdCBPYnNlcnZlcjogJywgZGF0YU9iamVjdE9ic2VydmVyKTtcclxuXHJcbiAgICAgICAgbGV0IGNoYXRDb250cm9sbGVyID0gbmV3IENoYXRDb250cm9sbGVyKHN5bmNoZXIsIF90aGlzLmRpc2NvdmVyeSwgX3RoaXMuX2RvbWFpbiwgX3RoaXMuc2VhcmNoLCBteUlkZW50aXR5LCBfdGhpcyk7XHJcbiAgICAgICAgcmVzb2x2ZShjaGF0Q29udHJvbGxlcik7XHJcblxyXG4gICAgICAgIGNoYXRDb250cm9sbGVyLmRhdGFPYmplY3RPYnNlcnZlciA9IGRhdGFPYmplY3RPYnNlcnZlcjtcclxuXHJcbiAgICAgICAgX3RoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzW2RhdGFPYmplY3RPYnNlcnZlci51cmxdID0gY2hhdENvbnRyb2xsZXI7XHJcblxyXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ2hhdE1hbmFnZXI7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4qIFRoZSBHcm91cCBDaGF0IEFQSSBpcyB1c2VkIHRvIGNvbnRyb2wgYSBHcm91cCBDaGF0IGluc3RhbmNlLlxyXG4qIEBhdXRob3IgVml0b3IgU2lsdmEgW3ZpdG9yLXQtc2lsdmFAdGVsZWNvbS5wdF1cclxuKiBAdmVyc2lvbiAwLjEuMFxyXG4qL1xyXG5cclxuLy9pbXBvcnQgeyBVc2VySW5mbyB9IGZyb20gJy4vVXNlckluZm8nO1xyXG4vL2ltcG9ydCBSZWdpc3RyYXRpb25TdGF0dXMgZnJvbSAnLi4vZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cyc7XHJcbi8vaW1wb3J0IEludml0YXRpb25zSGFuZGxlciBmcm9tICcuL0ludml0YXRpb25zSGFuZGxlcic7XHJcblxyXG5jbGFzcyBDaGF0IHtcclxuXHJcbiAgY29uc3RydWN0b3Ioc3luY2hlciwgZG9tYWluLCBpZGVudGl0eSwgbWFuYWdlcikge1xyXG5cclxuICAgIGlmICghc3luY2hlcikgdGhyb3cgRXJyb3IoJ1N5bmNoZXIgaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XHJcbi8vICAgIGlmICghZGlzY292ZXJ5KSB0aHJvdyBFcnJvcignRGlzY292ZXIgaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XHJcbiAgICBpZiAoIWRvbWFpbikgdGhyb3cgRXJyb3IoJ0RvbWFpbiBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlY3knKTtcclxuLy8gICAgaWYgKCFzZWFyY2gpIHRocm93IEVycm9yKCdTZWFyY2ggaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9zeW5jaGVyID0gc3luY2hlcjtcclxuLy8gICAgX3RoaXMuZGlzY292ZXJ5ID0gZGlzY292ZXJ5O1xyXG4vLyAgICBfdGhpcy5zZWFyY2ggPSBzZWFyY2g7XHJcbiAgICBfdGhpcy5teUlkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdyZXBvcnRlcic7XHJcbiAgICBfdGhpcy5jaGlsZF9jc2VxID0gMDtcclxuICAgIF90aGlzLmRvbWFpbiA9IGRvbWFpbjtcclxuXHJcbiAgICBfdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XHJcblxyXG4gICAgY29uc3QgaHlwZXJ0eVVSTCA9IHN5bmNoZXIub3duZXI7XHJcblxyXG4gICAgX3RoaXMuX29iamVjdERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIGRvbWFpbiArICcvLndlbGwta25vd24vZGF0YXNjaGVtYS9Db21tdW5pY2F0aW9uJztcclxuXHJcbi8vICAgIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIgPSBuZXcgSW52aXRhdGlvbnNIYW5kbGVyKGh5cGVydHlVUkwpO1xyXG5cclxuICB9XHJcblxyXG4vKiAgZ2V0IGludml0YXRpb25zSGFuZGxlcigpIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXI7XHJcbiAgfSovXHJcblxyXG4gIGdldCB1cmwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuZGF0YU9iamVjdFJlcG9ydGVyLnVybCA6IHRoaXMuZGF0YU9iamVjdE9ic2VydmVyLnVybDtcclxuICB9XHJcblxyXG4gIHNldCBkYXRhT2JqZWN0UmVwb3J0ZXIoZGF0YU9iamVjdFJlcG9ydGVyKSB7XHJcblxyXG4gICAgaWYgKCFkYXRhT2JqZWN0UmVwb3J0ZXIpIHRocm93IG5ldyBFcnJvcignW0NoYXRDb250cm9sbGVyXSBUaGUgZGF0YSBvYmplY3QgcmVwb3J0ZXIgaXMgbmVjZXNzYXJ5IHBhcmFtZXRlciAnKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuY29udHJvbGxlck1vZGUgPSAncmVwb3J0ZXInO1xyXG5cclxuICAgIC8vIEhhbmRsZXIgdG8gcHJvY2VzcyByZWNlaXZlZCBmaWxlc1xyXG5cclxuICAgIC8vIGRhdGFPYmplY3RSZXBvcnRlci5vblJlc3BvbnNlKGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdFJlcG9ydGVyIC0gb25SZXNwb25zZV0nLCBldmVudCk7XHJcbiAgICAvLyAgIGlmIChfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UpIHtcclxuICAgIC8vICAgICBfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UoZXZlbnQpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvL1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgZGF0YU9iamVjdFJlcG9ydGVyLm9uU3Vic2NyaXB0aW9uKGZ1bmN0aW9uKGV2ZW50KSB7XHJcblxyXG4gICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlICdzdWJzY3JpYmUnOiBfdGhpcy5fb25TdWJzY3JpYmUoZXZlbnQpOyBicmVhaztcclxuICAgICAgICBjYXNlICd1bnN1YnNjcmliZSc6IF90aGlzLl9vblVuc3Vic2NyaWJlKGV2ZW50KTsgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIF90aGlzLl9zZXRPbkFkZENoaWxkTGlzdGVuZXIoZGF0YU9iamVjdFJlcG9ydGVyKTtcclxuXHJcbiAgICBkYXRhT2JqZWN0UmVwb3J0ZXIub25SZWFkKChldmVudCkgPT4ge1xyXG4gICAgICBldmVudC5hY2NlcHQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRhdGFPYmplY3RSZXBvcnRlci5vbkV4ZWN1dGUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZXZlbnQubWV0aG9kKSB7XHJcbiAgICAgICAgY2FzZSAnYWRkVXNlcic6XHJcbiAgICAgICAgICBfdGhpcy5hZGRVc2VyKGV2ZW50LnBhcmFtc1swXSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LmFjY2VwdCgpO1xyXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xyXG4gICAgICAgICAgICBldmVudC5yZWplY3QocmVhc29uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdyZW1vdmVVc2VyJzpcclxuICAgICAgICAgICAgX3RoaXMucmVtb3ZlVXNlcihldmVudC5wYXJhbXMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGV2ZW50LmFjY2VwdCgpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWFzb246JywgcmVhc29uKTtcclxuICAgICAgICAgICAgICBldmVudC5yZWplY3QocmVhc29uKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6IGV2ZW50LnJlamVjdCgnW0NoYXRDb250cm9sbGVyLm9uRXhlY3V0ZV0gQ2hhdCBtZXRob2QgZXhlY3V0aW9uIG5vdCBhY2NlcHRlZCBieSBSZXBvcnRlcicpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIF90aGlzLl9kYXRhT2JqZWN0UmVwb3J0ZXIgPSBkYXRhT2JqZWN0UmVwb3J0ZXI7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFPYmplY3RSZXBvcnRlcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuICB9XHJcblxyXG4gIGdldCBtZXNzYWdlcygpIHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlci5fY2hpbGRyZW5PYmplY3RzIDogdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyLl9jaGlsZHJlbk9iamVjdHM7XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0YU9iamVjdE9ic2VydmVyKGRhdGFPYmplY3RPYnNlcnZlcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdvYnNlcnZlcic7XHJcblxyXG4gICAgX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlciA9IGRhdGFPYmplY3RPYnNlcnZlcjtcclxuXHJcbiAgICBkYXRhT2JqZWN0T2JzZXJ2ZXIub25DaGFuZ2UoJyonLCBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1PYnNlcnZlciAtIG9uQ2hhbmdlJywgZXZlbnQpO1xyXG5cclxuICAgICAgaWYgKGV2ZW50LmZpZWxkLmluY2x1ZGVzKCdwYXJ0aWNpcGFudHMnKSkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY1R5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ2FkZCc6XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fb25Vc2VyQWRkZWQpIF90aGlzLl9vblVzZXJBZGRlZChldmVudCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgJ3JlbW92ZSc6XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fb25Vc2VyUmVtb3ZlZCkgX3RoaXMuX29uVXNlclJlbW92ZWQoZXZlbnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25DaGFuZ2UpIF90aGlzLl9vbkNoYW5nZShldmVudCk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgX3RoaXMuX3NldE9uQWRkQ2hpbGRMaXN0ZW5lcihkYXRhT2JqZWN0T2JzZXJ2ZXIpO1xyXG5cclxuICAgIC8vIGxldCBjaGlsZHJlbnMgPSBkYXRhT2JqZWN0T2JzZXJ2ZXIuY2hpbGRyZW5zO1xyXG4gICAgLy8gT2JqZWN0LmtleXMoY2hpbGRyZW5zKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgLy8gICBpZiAoX3RoaXMuX29uTWVzc2FnZSkgX3RoaXMuX29uTWVzc2FnZSh7XHJcbiAgICAvLyAgICAgY2hpbGRJZDogY2hpbGQsXHJcbiAgICAvLyAgICAgaWRlbnRpdHk6IGNoaWxkcmVuc1tjaGlsZF0uaWRlbnRpdHksXHJcbiAgICAvLyAgICAgdmFsdWU6IGNoaWxkcmVuc1tjaGlsZF0uZGF0YVxyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFPYmplY3RPYnNlcnZlcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlcjtcclxuICB9XHJcblxyXG4gIF9zZXRPbkFkZENoaWxkTGlzdGVuZXIoZGF0YU9iamVjdCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgZGF0YU9iamVjdC5vbkFkZENoaWxkKGZ1bmN0aW9uKGNoaWxkKSB7XHJcbiAgICAgIF90aGlzLmNoaWxkX2NzZXEgKz0xO1xyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5fc2V0T25BZGRDaGlsZExpc3RlbmVyXSBuZXcgQ2hpbGQgcmVjZWl2ZWQ6ICcsIGNoaWxkKTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25NZXNzYWdlKSBfdGhpcy5fb25NZXNzYWdlKGNoaWxkKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBnZXQgZGF0YU9iamVjdCgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInID8gdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIgOiB0aGlzLmRhdGFPYmplY3RPYnNlcnZlcjtcclxuICB9XHJcblxyXG4gIHNldCBjbG9zZUV2ZW50KGV2ZW50KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX2Nsb3NlRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICBpZiAoX3RoaXMuX29uQ2xvc2UpIF90aGlzLl9vbkNsb3NlKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGdldCBjbG9zZUV2ZW50KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fY2xvc2VFdmVudDtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgX29uU3Vic2NyaWJlKGV2ZW50KSB7XHJcblxyXG4gICAgbGV0IGRhdGFPYmplY3RSZXBvcnRlciA9IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuXHJcbiAgICBldmVudC5hY2NlcHQoKTtcclxuXHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZV0gZXZlbnQnLCBldmVudCwgZGF0YU9iamVjdFJlcG9ydGVyLnVybCk7XHJcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uU3Vic2NyaWJlXSBOZXcgdXNlciBoYXMgc3Vic2NyaWJlIHRoaXMgb2JqZWN0OiAnLCBkYXRhT2JqZWN0UmVwb3J0ZXIuZGF0YSwgZXZlbnQuaWRlbnRpdHkpO1xyXG5cclxuICAgIGxldCBpZGVudGl0eSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQuaWRlbnRpdHkpKTtcclxuXHJcbiAgICBpZiAoaWRlbnRpdHkuaGFzT3duUHJvcGVydHkoJ2Fzc2VydGlvbicpKSB7XHJcbiAgICAgIGRlbGV0ZSBpZGVudGl0eS5hc3NlcnRpb25cclxuICAgIH1cclxuXHJcbiAgICBsZXQgdXNlckluZm8gPSB7XHJcbiAgICAgIGh5cGVydHlVUkw6IGV2ZW50LnVybCxcclxuICAgICAgZG9tYWluOiBldmVudC5kb21haW4sXHJcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eVxyXG4gICAgfVxyXG4gICAgbGV0IHVzZXJVUkwgPSBldmVudC5pZGVudGl0eS51c2VyUHJvZmlsZS5ndWlkO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdICBuZXcgcGFydGljaXBhbnQnLCB1c2VySW5mbyk7XHJcbiAgICBpZiAoZXZlbnQuaWRlbnRpdHkubGVnYWN5KSB7XHJcbiAgICAgdXNlckluZm8ubGVnYWN5ID0gZXZlbnQuaWRlbnRpdHkubGVnYWN5O1xyXG4gICAgfVxyXG5cclxuICAgIGRhdGFPYmplY3RSZXBvcnRlci5kYXRhLnBhcnRpY2lwYW50c1t1c2VyVVJMXSA9IHVzZXJJbmZvO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdIGNvbW11bmljYXRpb25PYmplY3QgT0JKIGNoYXRjb250cm9sbGVyJywgZGF0YU9iamVjdFJlcG9ydGVyLmRhdGEucGFydGljaXBhbnRzKTtcclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmUgLSBvblN1YnNjcmlwdGlvbl0gJywgdXNlckluZm8pO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZSAtIHRoaXMuX29uVXNlckFkZGVkXSAnLCB0aGlzLl9vblVzZXJBZGRlZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX29uVXNlckFkZGVkKSB0aGlzLl9vblVzZXJBZGRlZCh1c2VySW5mbyk7XHJcbiAgfVxyXG5cclxuICBfb25VbnN1YnNjcmliZShldmVudCkge1xyXG4gICAgbGV0IGRhdGFPYmplY3RSZXBvcnRlciA9IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uVW5zdWJzY3JpYmVdIGV2ZW50JywgZXZlbnQsIGRhdGFPYmplY3RSZXBvcnRlci51cmwpO1xyXG5cclxuICAgIGxldCBwYXJ0aWNpcGFudCA9IGV2ZW50LmlkZW50aXR5LnVzZXJQcm9maWxlO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZV0gIHBhcnRpY2lwYW50IGxlZnQnLCBwYXJ0aWNpcGFudCk7XHJcbiAgICBpZiAoZXZlbnQuaWRlbnRpdHkubGVnYWN5KSB7XHJcbiAgICAgIHBhcnRpY2lwYW50LmxlZ2FjeSA9IGV2ZW50LmlkZW50aXR5LmxlZ2FjeTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGUgZGF0YU9iamVjdFJlcG9ydGVyLmRhdGEucGFydGljaXBhbnRzW3BhcnRpY2lwYW50LnVzZXJVUkxdO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZSAtIHRoaXMuX29uVXNlclJlbW92ZWRdICcsIHRoaXMub25Vc2VyUmVtb3ZlZCk7XHJcbiAgICBpZiAodGhpcy5fb25Vc2VyUmVtb3ZlZCkgdGhpcy5fb25Vc2VyUmVtb3ZlZChwYXJ0aWNpcGFudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGZpbGUuXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgIElzIHRoZSBmaWxlIHRvIGJlIHNlbnQuXHJcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb21tdW5pY2F0aW9uLkNoYXRNZXNzYWdlPn0gICAgICAgIEl0IHJldHVybnMgdGhlIENoYXRNZXNzYWdlIGNoaWxkIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBTeW5jaGVyIGFzIGEgUHJvbWlzZS5cclxuICAgKi9cclxuICBzZW5kRmlsZShmaWxlKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBtb2RlID0gX3RoaXMuY29udHJvbGxlck1vZGU7XHJcbiAgICBsZXQgZGF0YU9iamVjdCA9IG1vZGUgPT09ICdyZXBvcnRlcicgPyBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIgOiBfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXI7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IGlkZW50aXR5ID0ge1xyXG4gICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBkYXRhT2JqZWN0LmFkZEh5cGVydHlSZXNvdXJjZSgncmVzb3VyY2VzJywgJ2ZpbGUnLCAgZmlsZSwgaWRlbnRpdHkpLnRoZW4oZnVuY3Rpb24ocmVzb3VyY2VGaWxlKSB7XHJcblxyXG4gICAgICAgICAgbGV0IGlkZW50aXR5ID0ge1xyXG4gICAgICAgICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgbGV0IGZpbGVTZW50RXZ0ID0geyB2YWx1ZSA6IHJlc291cmNlRmlsZSwgaWRlbnRpdHk6IGlkZW50aXR5LCByZXNvdXJjZTogcmVzb3VyY2VGaWxlfTtcclxuXHJcbi8qICAgICAgICAgIGxldCByZXBvcnRlclN0YXR1cyA9IG5ldyBSZWdpc3RyYXRpb25TdGF0dXMoZGF0YU9iamVjdC51cmwsIF90aGlzLl9tYW5hZ2VyLl9ydW50aW1lVVJMLCBfdGhpcy5fbWFuYWdlci5faHlwZXJ0eVVSTCwgX3RoaXMuX21hbmFnZXIuX2J1cyApO1xyXG5cclxuICAgICAgICAgIC8vIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0byBzeW5jIHdpdGggY2hhdCByZXBvcnRlclxyXG5cclxuICAgICAgICAgICAgbGV0IHNoYXJlMlJlcG9ydGVyID0gZnVuY3Rpb24oZmlsZSwgc3Vic2NyaWJlciwgZXZ0LCBzdGF0dXMpIHtcclxuICAgICAgICAgICAgICBsZXQgc3RhdHVzT2ZSZXBvcnRlciA9IHN0YXR1cztcclxuICAgICAgICAgICAgICBmaWxlLnNoYXJpbmdTdGF0dXMudGhlbihyZXNvbHZlKGV2dCkpLmNhdGNoKChyZXN1bHQpPT57XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLnNlbmRGaWxlXSBzaGFyZSBmYWlsZWQ6ICcsIHJlc3VsdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhdHVzT2ZSZXBvcnRlci5vbkxpdmUoIHN1YnNjcmliZXIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1c09mUmVwb3J0ZXIudW5zdWJzY3JpYmVMaXZlKHN1YnNjcmliZXIpO1xyXG4gICAgICAgICAgICAgICAgZmlsZS5zaGFyZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHNoYXJlMlJlcG9ydGVyKGZpbGUsIHN1YnNjcmliZXIsIGV2dCwgc3RhdHVzT2ZSZXBvcnRlcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgLy9UT0RPOiBzdWJzY3JpYmUgdG8gc3luYyB3aGVuIHJlcG9ydGVyIGlzIGxpdmUuIE5ldyBzeW5jaGVkIG1lc3NhZ2VzIHNob3VsZCB0cmlnZ2VyIG9uTWVzc2FnZSBpZSBvbkNoaWxkXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0qL1xyXG5cclxuLy8gICAgICAgICAgICByZXNvdXJjZUZpbGUuc2hhcmUodHJ1ZSkudGhlbigoKT0+e1xyXG4gICAgICAgICAgICAgIHJlc29sdmUoZmlsZVNlbnRFdnQpO1xyXG4vLyAgICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgIHNoYXJlMlJlcG9ydGVyKHJlc291cmNlRmlsZSwgX3RoaXMuX21hbmFnZXIuX2h5cGVydHlVUkwsIGZpbGVTZW50RXZ0LCByZXBvcnRlclN0YXR1cyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgY29uc29sZS5lcnJvcignUmVhc29uOicsIHJlYXNvbik7XHJcbiAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYSBjaGF0IG1lc3NhZ2UuXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgIElzIHRoZSBDaGF0TWVzc2FnZSB0byBiZSBzZW50LlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q29tbXVuaWNhdGlvbi5DaGF0TWVzc2FnZT59ICAgICAgICBJdCByZXR1cm5zIHRoZSBDaGF0TWVzc2FnZSBjaGlsZCBvYmplY3QgY3JlYXRlZCBieSB0aGUgU3luY2hlciBhcyBhIFByb21pc2UuXHJcbiAgICovXHJcbiAgc2VuZChtZXNzYWdlLCBpZGVudGl0eSkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgbW9kZSA9IF90aGlzLmNvbnRyb2xsZXJNb2RlO1xyXG4gICAgbGV0IGRhdGFPYmplY3QgPSBtb2RlID09PSAncmVwb3J0ZXInID8gX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyIDogX3RoaXMuZGF0YU9iamVjdE9ic2VydmVyO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbi8vICAgICAgbGV0IF9kYXRhT2JqZWN0Q2hpbGQ7XHJcbiAgICAgIF90aGlzLmNoaWxkX2NzZXEgKz0gMTtcclxuICAgICAgbGV0IG1zZyA9IHtcclxuXHJcbi8qICAgICAgICB1cmw6IGRhdGFPYmplY3QuZGF0YS51cmwsXHJcbiAgICAgICAgY3NlcTogX3RoaXMuY2hpbGRfY3NlcSxcclxuICAgICAgICByZXBvcnRlcjogZGF0YU9iamVjdC5kYXRhLnJlcG9ydGVyLFxyXG4gICAgICAgIHNjaGVtYTogZGF0YU9iamVjdC5kYXRhLnNjaGVtYSxcclxuICAgICAgICBuYW1lOiBkYXRhT2JqZWN0LmRhdGEubmFtZSxcclxuICAgICAgICBjcmVhdGVkIDogbmV3IERhdGUoKS50b0pTT04oKSwqL1xyXG5cclxuICAgICAgICB0eXBlOiAnY2hhdCcsXHJcbiAgICAgICAgY29udGVudDogbWVzc2FnZVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc2VuZGVyID0gaWRlbnRpdHkgPyBpZGVudGl0eSA6IHtcclxuICAgICAgICB1c2VyUHJvZmlsZTogX3RoaXMubXlJZGVudGl0eVxyXG4gICAgICB9O1xyXG5cclxuXHJcbiAgICAgIC8vIFRPRE86IGNoYW5nZSBjaGF0bWVzc2FnZXMgdG8gcmVzb3VyY2UgLSBjaGF0LCBmaWxlXHJcbiAgICAgIC8vIFRPRE86IGNoYW5nZSBtZXNzYWdlIHRvIGh5cGVydHlSZXNvdXJjZSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvZGV2LXNlcnZpY2UtZnJhbWV3b3JrL3RyZWUvZGV2ZWxvcC9kb2NzL2RhdGFtb2RlbC9kYXRhLW9iamVjdHMvaHlwZXJ0eS1yZXNvdXJjZVxyXG4gICAgICAvLyBUT0RPOiBoYW5kbGUgd2l0aCBtdWx0aXBsZSByZXNvdXJjZXMgLSBpZiB0aGUgXCJtZXNzYWdlXCIgd2lsbCBiZSBkaWZmZXJlbnQgZm9yIGVhY2ggdHlwZSBvZiByZXNvdXJjZXNcclxuICAgICAgZGF0YU9iamVjdC5hZGRDaGlsZChtc2csIHNlbmRlcikudGhlbihmdW5jdGlvbihkYXRhT2JqZWN0Q2hpbGQpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXVthZGRDaGlsZCAtIENoYXQgTWVzc2FnZV06ICcsIGRhdGFPYmplY3RDaGlsZCk7XHJcbiAgICAgICAgLy9yZXNvbHZlKGRhdGFPYmplY3RDaGlsZCk7XHJcblxyXG4gICAgICAgIC8vVE9ETzogbW92ZSB0byBzZXBhcmF0ZSBmdW5jdGlvblxyXG5cclxuXHJcbiAgICAgICAgbGV0IG1zZyA9IHtcclxuICAgICAgICAgIGNoaWxkSWQ6IGRhdGFPYmplY3RDaGlsZC5fY2hpbGRJZCxcclxuICAgICAgICAgIGZyb206IGRhdGFPYmplY3RDaGlsZC5fb3duZXIsXHJcbiAgICAgICAgICB2YWx1ZTogZGF0YU9iamVjdENoaWxkLmRhdGEsXHJcbiAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcclxuICAgICAgICAgIGlkZW50aXR5OiBzZW5kZXJcclxuICAgICAgICB9O1xyXG5cclxuLyogICAgICAgIGxldCByZXBvcnRlclN0YXR1cyA9IG5ldyBSZWdpc3RyYXRpb25TdGF0dXMoZGF0YU9iamVjdC51cmwsIF90aGlzLl9tYW5hZ2VyLl9ydW50aW1lVVJMLCBfdGhpcy5fbWFuYWdlci5faHlwZXJ0eVVSTCwgX3RoaXMuX21hbmFnZXIuX2J1cyApO1xyXG5cclxuICAgICAgICAvLyByZWN1cnNpdmUgZnVuY3Rpb24gdG8gc3luYyB3aXRoIGNoYXQgcmVwb3J0ZXJcclxuXHJcbiAgICAgICAgICBsZXQgc2hhcmUyUmVwb3J0ZXIgPSBmdW5jdGlvbihjaGlsZCwgc3Vic2NyaWJlciwgbXNnLCBzdGF0dXMpIHtcclxuICAgICAgICAgICAgbGV0IHN0YXR1c09mUmVwb3J0ZXIgPSBzdGF0dXM7XHJcbiAgICAgICAgICAgIGNoaWxkLnNoYXJpbmdTdGF0dXMudGhlbihyZXNvbHZlKG1zZykpLmNhdGNoKChyZXN1bHQpPT57XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhdHVzT2ZSZXBvcnRlci5vbkxpdmUoIHN1YnNjcmliZXIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgc3RhdHVzT2ZSZXBvcnRlci51bnN1YnNjcmliZUxpdmUoc3Vic2NyaWJlcik7XHJcbiAgICAgICAgICAgICAgICAgIGNoaWxkLnNoYXJlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBzaGFyZTJSZXBvcnRlcihjaGlsZCwgc3Vic2NyaWJlciwgbXNnLCBzdGF0dXNPZlJlcG9ydGVyKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBzdWJzY3JpYmUgdG8gc3luYyB3aGVuIHJlcG9ydGVyIGlzIGxpdmUuIE5ldyBzeW5jaGVkIG1lc3NhZ2VzIHNob3VsZCB0cmlnZ2VyIG9uTWVzc2FnZSBpZSBvbkNoaWxkXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSovXHJcblxyXG4vLyAgICAgICAgICBzaGFyZTJSZXBvcnRlcihkYXRhT2JqZWN0Q2hpbGQsIF90aGlzLl9tYW5hZ2VyLl9oeXBlcnR5VVJMLCBtc2csIHJlcG9ydGVyU3RhdHVzKTtcclxuLy8gICAgICAgIGRhdGFPYmplY3RDaGlsZC5zaGFyZSh0cnVlKTtcclxuICAgICAgICAgIHJlc29sdmUobXNnKTtcclxuXHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBbb25DaGFuZ2UgZGVzY3JpcHRpb25dXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIFtkZXNjcmlwdGlvbl1cclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uQ2hhbmdlKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uQ2hhbmdlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSBuZXcgbWVzc2FnZXMuXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGhhbmRsZSB3aXRoIG5ldyBtZXNzYWdlc1xyXG4gICAqIEByZXR1cm4ge0NvbW11bmljYXRpb24uQ2hhdE1lc3NhZ2V9IG1cclxuICAgKi9cclxuICBvbk1lc3NhZ2UoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25NZXNzYWdlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBbb25Vc2VyQWRkZWQgZGVzY3JpcHRpb25dXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIFtkZXNjcmlwdGlvbl1cclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uVXNlckFkZGVkKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uVXNlckFkZGVkID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIHRoZSBhbiB1c2VyIHdhcyByZW1vdmVkXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIGhhbmRsZSB3aXRoIHRoZSByZW1vdmVkIHVzZXJcclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uVXNlclJlbW92ZWQoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25Vc2VyUmVtb3ZlZCA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlY2VpdmUgcmVxdWVzdHMgdG8gY2xvc2UgdGhlIEdyb3VwIENoYXQgaW5zdGFuY2UuXHJcbiAgICogQHJldHVybiB7RGVsZXRlRXZlbnR9IFRoZSBEZWxldGVFdmVudCBmaXJlZCBieSB0aGUgU3luY2hlciB3aGVuIHRoZSBDaGF0IGlzIGNsb3NlZC5cclxuICAgKi9cclxuICBvbkNsb3NlKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uQ2xvc2UgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIG9uUmVzcG9uc2UoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25SZXNwb25zZSA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCAvIGludml0ZSBuZXcgdXNlciBvbiBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxyXG4gICAqIE9ubHkgdGhlIFJlcG9ydGVyLCBpLmUuIHRoZSBIeXBlcnR5IHRoYXQgaGFzIGNyZWF0ZWQgdGhlIEdyb3VwIENoYXQsIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIHtVUkwuVXNlclVSTH0gIHVzZXJzICBVc2VyIHRvIGJlIGludml0ZWQgdG8gam9pbiB0aGUgR3JvdXAgQ2hhdCB0aGF0IGlzIGlkZW50aWZpZWQgd2l0aCByZVRISU5LIFVzZXIgVVJMLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59ICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW52aXRlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbi8qICBhZGRVc2VyKHVzZXJzKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgaGF2ZUVtcHR5RWxlbWVudHMgPSAoZWxlbWVudCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnRWxlbWVudDonLCBlbGVtZW50Lmxlbmd0aCk7XHJcbiAgICAgIHJldHVybiBlbGVtZW50Lmxlbmd0aCAhPT0gMDtcclxuICAgIH07XHJcblxyXG4gICAgbGV0IG5vdEZvdW5kRWxlbWVudHMgPSAoZWxlbWVudCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygndXNlciBub3QgZm91bmQ6ICcsIGVsZW1lbnQpO1xyXG4gICAgICByZXR1cm4gIShlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgaWYgKHVzZXJzLmZpbHRlcihoYXZlRW1wdHlFbGVtZW50cykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnRG9uXFwndCBoYXZlIHVzZXJzIHRvIGludml0ZScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5hZGRVc2VycyBdOiAnLCB1c2Vycyk7XHJcblxyXG4gICAgICAvKl90aGlzLnNlYXJjaC51c2Vycyh1c2VycywgZG9tYWlucywgWydjb21tJ10sIFsnY2hhdCddKVxyXG5cclxuICAgIC50aGVuKChoeXBlcnRpZXNJRHMpID0+IHtcclxuXHJcbiAgICAgIGlmIChoeXBlcnRpZXNJRHMuZmlsdGVyKG5vdEZvdW5kRWxlbWVudHMpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHRocm93ICdVc2VyKHMpIG5vdCBmb3VuZCc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzZWxlY3RlZEh5cGVydGllcyA9IGh5cGVydGllc0lEcy5tYXAoKGh5cGVydHkpID0+IHtcclxuICAgICAgICByZXR1cm4gaHlwZXJ0eS5oeXBlcnR5SUQ7XHJcbiAgICAgIH0pOyovXHJcblxyXG4vKiAgICAgIGxldCB1c2Vyc0Rpc2NvdmVyeSA9IFtdO1xyXG4gICAgICBsZXQgZGlzY29ubmVjdGVkID0gW107XHJcbiAgICAgIGxldCBsaXZlID0ge307XHJcblxyXG4gICAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XHJcbiAgICAgICAgbGV0IHVzZXJEaXNjb3ZlcnlQcm9taXNlID0gX3RoaXMuZGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0aWVzRE8odXNlci51c2VyLCBbJ2NvbW0nXSwgWydjaGF0J10sIHVzZXIuZG9tYWluKTtcclxuICAgICAgICAgIHVzZXJzRGlzY292ZXJ5LnB1c2godXNlckRpc2NvdmVyeVByb21pc2UpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgUHJvbWlzZS5hbGwodXNlcnNEaXNjb3ZlcnkpLnRoZW4oKHVzZXJEaXNjb3ZlcnlSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5hZGRVc2Vyc10gVXNlcnMgRGlzY292ZXJ5IFJlc3VsdHMtPicsIHVzZXJEaXNjb3ZlcnlSZXN1bHRzKTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkSHlwZXJ0aWVzID0gW107XHJcblxyXG4gICAgICAgICB1c2VyRGlzY292ZXJ5UmVzdWx0cy5mb3JFYWNoKCh1c2VyRGlzY292ZXJ5UmVzdWx0KSA9PiB7XHJcblxyXG4gICAgICAgICAgIHVzZXJEaXNjb3ZlcnlSZXN1bHQuZm9yRWFjaCgoZGlzY292ZXJlZCk9PntcclxuICAgICAgICAgICAgIGlmIChkaXNjb3ZlcmVkLmRhdGEuc3RhdHVzID09PSAnbGl2ZScpe1xyXG4gICAgICAgICAgICAgICBzZWxlY3RlZEh5cGVydGllcy5wdXNoKGRpc2NvdmVyZWQuZGF0YS5oeXBlcnR5SUQpO1xyXG4gICAgICAgICAgICAgICBsaXZlW2Rpc2NvdmVyZWQuZGF0YS5oeXBlcnR5SURdID0gZGlzY292ZXJlZDtcclxuICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIGVsc2UgaWYgKGRpc2Nvbm5lY3RlZC5sZW5ndGggPCA1KSBkaXNjb25uZWN0ZWQucHVzaChkaXNjb3ZlcmVkKTtcclxuICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTeW5jaGVyIENyZWF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFxcbicpO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXVNlbGVjdGVkIEh5cGVydGllczogISEhICcsIHNlbGVjdGVkSHlwZXJ0aWVzKTtcclxuICAgICAgICBjb25zb2xlLmluZm8oYEhhdmUgJHtzZWxlY3RlZEh5cGVydGllcy5sZW5ndGh9IHVzZXJzO2ApO1xyXG4vLyAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXJdIEh5cGVydGllc0lEcyAnLCBoeXBlcnRpZXNJRHMpO1xyXG5cclxuICAgICAgICBsZXQgZGF0YU9iamVjdCA9IF90aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInID8gX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyIDogX3RoaXMuZGF0YU9iamVjdE9ic2VydmVyO1xyXG5cclxuICAgICAgICBpZiAoZGlzY29ubmVjdGVkLmxlbmd0aCA+IDApIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIuaW52aXRlRGlzY29ubmVjdGVkSHlwZXJ0aWVzKGRpc2Nvbm5lY3RlZCwgZGF0YU9iamVjdCk7XHJcblxyXG4gICAgICAgIGRhdGFPYmplY3QuaW52aXRlT2JzZXJ2ZXJzKHNlbGVjdGVkSHlwZXJ0aWVzKTtcclxuXHJcbiAgICAgICAgaWYgKGRhdGFPYmplY3QuaW52aXRhdGlvbnMubGVuZ3RoID4gMCkgX3RoaXMuX2ludml0YXRpb25zSGFuZGxlci5wcm9jZXNzSW52aXRhdGlvbnMobGl2ZSwgZGF0YU9iamVjdCk7XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1BcmUgaW52aXRlZCB3aXRoIHN1Y2Nlc3MgJyArIHVzZXJzLmxlbmd0aCArICcgdXNlcnM7Jyk7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG5cclxuXHJcblxyXG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIGludml0ZSB1c2VycztcXG4nLCByZWFzb24pO1xyXG4gICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH0qL1xyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVxdWVzdCB0aGUgUmVwb3J0ZXIgdG8gYWRkIC8gaW52aXRlIG5ldyB1c2VyIG9uIGFuIGV4aXN0aW5nIEdyb3VwIENoYXQgaW5zdGFuY2UuXHJcbiAgICogT25seSBPYnNlcnZlcnMgYXJlIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIHtVUkwuVXNlclVSTH0gIHVzZXJzICBVc2VyIHRvIGJlIGludml0ZWQgdG8gam9pbiB0aGUgR3JvdXAgQ2hhdCB0aGF0IGlzIGlkZW50aWZpZWQgd2l0aCByZVRISU5LIFVzZXIgVVJMLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59ICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW52aXRlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbi8qICBhZGRVc2VyUmVxKHVzZXJzKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL2NoZWNrIGlzIE9ic2VydmVyIGFuZCBpbnZva2Ugb2JzZXJ2ZXIuZXhlY3V0ZSgpIHdpdGggbmV3IHByb21pc2VcclxuICAgIGxldCBoYXZlRW1wdHlFbGVtZW50cyA9IChlbGVtZW50KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdFbGVtZW50OicsIGVsZW1lbnQubGVuZ3RoKTtcclxuICAgICAgcmV0dXJuIGVsZW1lbnQubGVuZ3RoICE9PSAwO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBpZiAodXNlcnMuZmlsdGVyKGhhdmVFbXB0eUVsZW1lbnRzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4gcmVqZWN0KCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlclJlcV0gRG9uXFwndCBoYXZlIHVzZXJzIHRvIGFkZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghX3RoaXMuY29udHJvbGxlck1vZGUgPT09ICdvYnNlcnZlcicpIHtcclxuICAgICAgICByZXR1cm4gcmVqZWN0KCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlclJlcV0gb25seSBhbGxvd2VkIHRvIENoYXQgT2JzZXJ2ZXInKTtcclxuXHJcbiAgICAgIGxldCBhZGRVc2VyID0gX3RoaXMuYWRkVXNlcih1c2Vycyk7XHJcblxyXG4gICAgICBpZiAoX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlcikge1xyXG4gICAgICAgIGFkZFVzZXIgPSBfdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyLmV4ZWN1dGUoJ2FkZFVzZXInLCB1c2Vycyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGFkZFVzZXIudGhlbigoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlclJlcV0gUmVxdWVzdCBhY2NlcHRlZCBieSBSZXBvcnRlciAnKTtcclxuICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIFJlcXVlc3QgcmVqZWN0ZWQgYnkgUmVwb3J0ZXI7XFxuJywgcmVhc29uKTtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gIH0pO1xyXG5cclxufSovXHJcblxyXG4gIG9uSW52aXRhdGlvblJlc3BvbnNlKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uSW52aXRhdGlvblJlc3BvbnNlID0gY2FsbGJhY2s7XHJcbi8vICAgIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIuaW52aXRhdGlvblJlc3BvbnNlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSBhIHVzZXIgZnJvbSBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxyXG4gICAqIE9ubHkgdGhlIFJlcG9ydGVyLCBpLmUuIHRoZSBIeXBlcnR5IHRoYXQgaGFzIGNyZWF0ZWQgdGhlIEdyb3VwIENoYXQsIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHJldHVybiB7PFByb21pc2U+IGJvb2xlYW59IFByb21pc2Ugd2l0aCB0aGUgc3RhdHVzXHJcbiAgICovXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgYSB1c2VyIGZyb20gYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cclxuICAgKiBPbmx5IHRoZSBSZXBvcnRlciwgaS5lLiB0aGUgSHlwZXJ0eSB0aGF0IGhhcyBjcmVhdGVkIHRoZSBHcm91cCBDaGF0LCBpcyBhbGxvd2VkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLlxyXG4gICAqIEBwYXJhbSAge1VSTC5Vc2VyVVJMfSB1c2VyICAgICAgIFVzZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBHcm91cCBDaGF0IHRoYXQgaXMgaWRlbnRpZmllZCB3aXRoIHJlVEhJTksgVXNlciBVUkwuXHJcbiAgICogQHJldHVybiB7PFByb21pc2U+IGJvb2xlYW59ICAgICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcmVtb3ZlVXNlcih1c2VyKSB7XHJcblxyXG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoZSByZW1vdmVVc2VyO1xyXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1Ob3QgeWV0IGltcGxlbWVudGVkOiAnLCB1c2VyKTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xvc2UgYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cclxuICAgKiBPbmx5IGF2YWlsYWJsZSB0byBDaGF0IEdyb3VwIFJlcG9ydGVycyBpLmUuIHRoZSBIeXBlcnR5IGluc3RhbmNlIHRoYXQgY3JlYXRlZCB0aGUgR3JvdXAgQ2hhdC5cclxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5Cb29sZWFufSBJdCByZXR1cm5zIGFzIGEgUHJvbWlzZSB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBjbG9zZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGNsb3NlKGRlbCA9IHRydWUpIHtcclxuICAgIC8vIFRPRE86IHRoZSBkYXRhT2JqZWN0UmVwb3J0ZXIuZGVsZXRlIHNob3VsZCBiZSBhIFByb21pc2U7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIFxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBcclxuICAgICAgaWYgKF90aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInKSB7XHJcbiAgICAgICAgLy8gcmVwb3J0ZXJcclxuLy8gICAgICAgIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIuY2xlYW5JbnZpdGF0aW9ucyhfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFkZWwpIHtcclxuICAgICAgICAgICAgX3RoaXMuX21hbmFnZXIuY29tbXVuaWNhdGlvbk9iamVjdC5zdGF0dXMgPSAnY2xvc2VkJztcclxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcblxyXG4gICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5fbWFuYWdlci5fcmVwb3J0ZXJzQ29udHJvbGxlcnNbX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyLnVybF07XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIuZGVsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLl9vbkNsb3NlKSBfdGhpcy5fb25DbG9zZSh7XHJcbiAgICAgICAgICAgICAgICAgIGNvZGU6IDIwMCxcclxuICAgICAgICAgICAgICAgICAgZGVzYzogJ2RlbGV0ZWQnLFxyXG4gICAgICAgICAgICAgICAgICB1cmw6IF90aGlzLmRhdGFPYmplY3RSZXBvcnRlci51cmxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gb2JzZXJ2ZXJcclxuICAgICAgICBpZihkZWwpe1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGVsZXRlIF90aGlzLl9tYW5hZ2VyLl9vYnNlcnZlcnNDb250cm9sbGVyc1tfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXIudXJsXTtcclxuICAgICAgICAgICAgX3RoaXMuZGF0YU9iamVjdE9ic2VydmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAvLyBUT0RPOiBzZW5kIG1lc3NhZ2UgXHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDaGF0O1xyXG4iLCJcclxuLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gU2VydmljZSBGcmFtZXdvcmtcclxuLy9pbXBvcnQgSWRlbnRpdHlNYW5hZ2VyIGZyb20gJy4uL2lkZW50aXR5TWFuYWdlci9JZGVudGl0eU1hbmFnZXInO1xyXG4vL2ltcG9ydCBSZWdpc3RyYXRpb25TdGF0dXMgZnJvbSAnLi4vZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cyc7XHJcbi8vaW1wb3J0IERpc2NvdmVyeSBmcm9tICcuLi9kaXNjb3ZlcnkvRGlzY292ZXJ5JztcclxuLy9pbXBvcnQgU3luY2hlciBmcm9tICcuLi9zeW5jaGVyL1N5bmNoZXInO1xyXG5cclxuLy8gVXRpbHNcclxuLy9pbXBvcnQge2RpdmlkZVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG4vL2ltcG9ydCBTZWFyY2ggZnJvbSAnLi4vdXRpbHMvU2VhcmNoJztcclxuXHJcbi8vIEludGVybmFsc1xyXG5pbXBvcnQgeyBjb21tdW5pY2F0aW9uT2JqZWN0LCBDb21tdW5pY2F0aW9uU3RhdHVzLCBjb21tdW5pY2F0aW9uQ2hpbGRyZW4gfSBmcm9tICcuL2NvbW11bmljYXRpb24nO1xyXG5pbXBvcnQgQ2hhdCBmcm9tICcuL0NoYXQnO1xyXG5pbXBvcnQgeyBVc2VySW5mbyB9IGZyb20gJy4vVXNlckluZm8nO1xyXG5cclxuLyoqXHJcbiogSHlwZXJ0eSBTaW1wbGUgR3JvdXAgQ2hhdCBNYW5hZ2VyIEFQSSBcclxuKiBAYXV0aG9yIFZpdG9yIFNpbHZhIFt2aXRvci10LXNpbHZhQHRlbGVjb20ucHRdXHJcbiogQHZlcnNpb24gMC4xLjBcclxuKi9cclxuY2xhc3MgU2ltcGxlU2ltcGxlQ2hhdE1hbmFnZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihteVVybCwgYnVzLCBjb25maWd1cmF0aW9uLCBzeW5jaGVyLCBmYWN0b3J5KSB7XHJcbiAgICBpZiAoIW15VXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1tTaW1wbGVDaGF0TWFuYWdlci5jb25zdHJ1Y3Rvcl0gVGhlIG15VXJsIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG4gICAgaWYgKCFidXMpIHRocm93IG5ldyBFcnJvcignW1NpbXBsZUNoYXRNYW5hZ2VyLmNvbnN0cnVjdG9yXSBUaGUgTWluaUJ1cyBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKCdbU2ltcGxlQ2hhdE1hbmFnZXIuY29uc3RydWN0b3JdIFRoZSBjb25maWd1cmF0aW9uIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBpZiAoIXN5bmNoZXIpIHtcclxuICAgICAgc3luY2hlciA9IGZhY3RvcnkuY3JlYXRlU3luY2hlcihteVVybCwgYnVzLCBjb25maWd1cmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGhpcy5fcnVudGltZVVSTCA9IGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTDtcclxuXHJcbiAgICBsZXQgZG9tYWluID0gZmFjdG9yeS5kaXZpZGVVUkwoX3RoaXMuX3J1bnRpbWVVUkwpLmRvbWFpbjtcclxuLy8gICAgbGV0IGRpc2NvdmVyeSA9IGZhY3RvcnkuY3JlYXRlRGlzY292ZXJ5KG15VXJsLCBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwsIGJ1cyk7XHJcbiAgICBsZXQgaWRlbnRpdHlNYW5hZ2VyID0gZmFjdG9yeS5jcmVhdGVJZGVudGl0eU1hbmFnZXIobXlVcmwsIGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTCwgYnVzKTtcclxuXHJcbiAgICBfdGhpcy5fb2JqZWN0RGVzY1VSTCA9ICdoeXBlcnR5LWNhdGFsb2d1ZTovL2NhdGFsb2d1ZS4nICsgZG9tYWluICsgJy8ud2VsbC1rbm93bi9kYXRhc2NoZW1hL0NvbW11bmljYXRpb24nO1xyXG5cclxuICAgIF90aGlzLl9yZXBvcnRlcnNDb250cm9sbGVycyA9IHt9O1xyXG4gICAgX3RoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzID0ge307XHJcblxyXG4gICAgX3RoaXMuX215VXJsID0gbXlVcmw7XHJcbiAgICBfdGhpcy5fYnVzID0gYnVzO1xyXG4gICAgX3RoaXMuX3N5bmNoZXIgPSBzeW5jaGVyO1xyXG4gICAgX3RoaXMuX2RvbWFpbiA9IGRvbWFpbjtcclxuXHJcbi8vICAgIF90aGlzLmRpc2NvdmVyeSA9IGRpc2NvdmVyeTtcclxuICAgIF90aGlzLmlkZW50aXR5TWFuYWdlciA9IGlkZW50aXR5TWFuYWdlcjtcclxuICAgIF90aGlzLmN1cnJlbnRJZGVudGl0eTtcclxuXHJcbi8vICAgIF90aGlzLnNlYXJjaCA9IGZhY3RvcnkuY3JlYXRlU2VhcmNoKGRpc2NvdmVyeSwgaWRlbnRpdHlNYW5hZ2VyKTtcclxuXHJcbiAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcclxuXHJcbiAgICBfdGhpcy5jb21tdW5pY2F0aW9uQ2hpbGRyZW4gPSBjb21tdW5pY2F0aW9uQ2hpbGRyZW47XHJcblxyXG4vLyAgICBjb25zb2xlLmxvZygnW1NpbXBsZUNoYXRNYW5hZ2VyXSBEaXNjb3ZlciAnLCBkaXNjb3ZlcnkpO1xyXG4gICAgY29uc29sZS5sb2coJ1tTaW1wbGVDaGF0TWFuYWdlcl0gSWRlbnRpdHkgTWFuYWdlciAnLCBpZGVudGl0eU1hbmFnZXIpO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICBzZXQgb2ZmbGluZShvZmZsaW5lKSB7XHJcbiAgICB0aGlzLl9vZmZsaW5lID0gb2ZmbGluZTtcclxuICB9XHJcblxyXG4gIGdldCBvZmZsaW5lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX29mZmxpbmUgPyB0aGlzLl9vZmZsaW5lIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZXQgYmFja3VwKGJhY2t1cCkge1xyXG4gICAgdGhpcy5fYmFja3VwID0gYmFja3VwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhY2t1cCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9iYWNrdXAgPyB0aGlzLl9iYWNrdXAgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NOb3RpZmljYXRpb24oZXZlbnQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBjb25zb2xlLmxvZygnW1NpbXBsZUNoYXRNYW5hZ2VyLnByb2Nlc3NOb3RpZmljYXRpb246ICcsIGV2ZW50KTtcclxuXHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NyZWF0ZScpIHtcclxuXHJcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlIDEwMCBmb3IgTWVzc2FnZS5SZXNwb25zZVxyXG4gICAgICAvLyBldmVudC5hY2soMjAwKTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25JbnZpdGF0aW9uKSB7IF90aGlzLl9vbkludml0YXRpb24oZXZlbnQpOyB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkZWxldGUnKSB7XHJcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlIDIwMCBmb3IgTWVzc2FnZS5SZXNwb25zZVxyXG4gICAgICBldmVudC5hY2soMjAwKTtcclxuXHJcbiAgICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVyc1tldmVudC51cmxdLmNsb3NlRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgIGRlbGV0ZSBfdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbZXZlbnQudXJsXTtcclxuXHJcbiAgICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVycy5jbG9zZUV2ZW50ID0gZXZlbnQ7XHJcblxyXG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcclxuXHJcblxyXG4gICAgICBmb3IgKGxldCB1cmwgaW4gdGhpcy5fcmVwb3J0ZXJzQ29udHJvbGxlcnMpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlcnNDb250cm9sbGVyc1t1cmxdLmNsb3NlKGV2ZW50KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgdXJsIGluIHRoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzKSB7XHJcbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbdXJsXS5jbG9zZShldmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBteUlkZW50aXR5KGlkZW50aXR5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbygnW1NpbXBsZUNoYXRNYW5hZ2VyLm15SWRlbnRpdHldJyk7XHJcbiAgICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIHJlc29sdmUoaWRlbnRpdHkpO1xyXG5cclxuICAgICAgaWYgKF90aGlzLl9teVVybC5pbmNsdWRlcygnaHlwZXJ0eTovLycpKSB7XHJcbiAgICAgICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyLmRpc2NvdmVyVXNlclJlZ2lzdGVyZWQoKS50aGVuKChpZGVudGl0eSkgPT4ge1xyXG4gICAgICAgICAgX3RoaXMuY3VycmVudElkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICAgICAgICByZXNvbHZlKGlkZW50aXR5KTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aGlzLmlkZW50aXR5TWFuYWdlci5kaXNjb3ZlcklkZW50aXR5UGVySWRQKCkudGhlbigoaWRlbnRpdHkpID0+IHtcclxuICAgICAgICAgIF90aGlzLmN1cnJlbnRJZGVudGl0eSA9IGlkZW50aXR5O1xyXG4gICAgICAgICAgcmVzb2x2ZShpZGVudGl0eSk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IEdyb3VwIENoYXQgcHJvdmlkaW5nIHRoZSBuYW1lIGFuZCB0aGUgaWRlbnRpZmllcnMgb2YgdXNlcnMgdG8gYmUgaW52aXRlZC5cclxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgbmFtZSAgSXMgYSBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIEdyb3VwIENoYXRcclxuICAgKiBAcGFyYW0gIHthcnJheTxVUkwuSHlwZXJ0eVVSTD59ICAgICAgICAgaHlwZXJ0aWVzIEFycmF5IG9mIGh5cGVydGllcyB0byBiZSBpbnZpdGVkIHRvIGpvaW4gdGhlIEdyb3VwIENoYXQuIFVzZXJzIGFyZSBpZGVudGlmaWVkIHdpdGggcmVUSElOSyBVc2VyIFVSTCwgbGlrZSB0aGlzIGZvcm1hdCB1c2VyOi8vPGlwZGRvbWFpbj4vPHVzZXItaWRlbnRpZmllcj5cclxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5DaGF0Q29udHJvbGxlcn0gICAgQSBDaGF0Q29udHJvbGxlciBvYmplY3QgYXMgYSBQcm9taXNlLlxyXG4gICAqL1xyXG4gIGNyZWF0ZShuYW1lLCBoeXBlcnRpZXMsIGV4dHJhID0ge30pIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IHN5bmNoZXIgPSBfdGhpcy5fc3luY2hlcjtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdCA9IGNvbW11bmljYXRpb25PYmplY3Q7XHJcbiAgICAgIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QuY3NlcSA9IDE7XHJcbiAgICAgIF90aGlzLmNvbW11bmljYXRpb25PYmplY3Quc3RhcnRpbmdUaW1lID0gbmV3IERhdGUoKS50b0pTT04oKTtcclxuICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5zdGF0dXMgPSAgQ29tbXVuaWNhdGlvblN0YXR1cy5PUEVOO1xyXG5cclxuICAgICAgbGV0IG15SWRlbnRpdHk7XHJcblxyXG4gICAgICBfdGhpcy5teUlkZW50aXR5KCkudGhlbigoaWRlbnRpdHkpID0+IHtcclxuICAgICAgICBteUlkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW1wbGVDaGF0TWFuYWdlci5jcmVhdGUgXSBNeSBJZGVudGl0eScsIGlkZW50aXR5KTtcclxuXHJcbiAgICAgICAgLy8gbGV0IHVybCA9IF90aGlzLmNvbW11bmljYXRpb25PYmplY3QucmVwb3J0ZXI7XHJcblxyXG4gICAgICAgIGxldCB1c2VySW5mbyA9IG5ldyBVc2VySW5mbyhfdGhpcy5fbXlVcmwsIF90aGlzLl9kb21haW4sIGlkZW50aXR5KTtcclxuXHJcbiAgICAgICAgLy8gQWRkIG15IGlkZW50aXR5XHJcbiAgICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5wYXJ0aWNpcGFudHNbaWRlbnRpdHkuZ3VpZF0gPSB1c2VySW5mbztcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW1wbGVDaGF0TWFuYWdlci5jcmVhdGUgXSBwYXJ0aWNpcGFudHM6ICcsIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QucGFydGljaXBhbnRzKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXBsZUNoYXRNYW5hZ2VyLmNyZWF0ZSBdIGNvbW11bmljYXRpb25PYmplY3QnLCBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0KTtcclxuXHJcblxyXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3luY2hlciBDcmVhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBcXG4nKTtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW1NpbXBsZUNoYXRNYW5hZ2VyXSBTZWxlY3RlZCBIeXBlcnRpZXM6ICEhISAnLCBoeXBlcnRpZXMpO1xyXG4vLyAgICAgICAgICBjb25zb2xlLmluZm8oYEhhdmUgJHtoeXBlcnRpZXMubGVuZ3RofSB1c2VycztgKTtcclxuICAgICAgICAgIGxldCBtdXR1YWwgPSBleHRyYS5tdXR1YWwgPyBleHRyYS5tdXR1YWwgOiB0cnVlO1xyXG5cclxuICAgICAgICAgIGxldCBpbnB1dCA9IE9iamVjdC5hc3NpZ24oe3Jlc291cmNlczogWydjaGF0J10sIG11dHVhbDogbXV0dWFsfSwgZXh0cmEpO1xyXG4gICAgICAgICAgZGVsZXRlIGlucHV0Lm5hbWU7XHJcblxyXG4gICAgICAgICAgaWYgKF90aGlzLm9mZmxpbmUpIGlucHV0Lm9mZmxpbmUgPSBfdGhpcy5vZmZsaW5lO1xyXG4gICAgICAgICAgaWYgKF90aGlzLmJhY2t1cCkgaW5wdXQuYmFja3VwID0gX3RoaXMuYmFja3VwO1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIGlucHV0IGRhdGE6JywgaW5wdXQpO1xyXG4gICAgICAgICAgcmV0dXJuIHN5bmNoZXIuY3JlYXRlKF90aGlzLl9vYmplY3REZXNjVVJMLCBoeXBlcnRpZXMsIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QsIHRydWUsIGZhbHNlLCBuYW1lLCB7fSwgaW5wdXQpO1xyXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdFJlcG9ydGVyKSB7XHJcblxyXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIDMuIFJldHVybiBDcmVhdGUgRGF0YSBPYmplY3QgUmVwb3J0ZXInLCBkYXRhT2JqZWN0UmVwb3J0ZXIpO1xyXG5cclxuICAgICAgICAgIGxldCBjaGF0ID0gbmV3IENoYXQoc3luY2hlciwgX3RoaXMuX2RvbWFpbiwgbXlJZGVudGl0eSwgX3RoaXMpO1xyXG4gICAgICAgICAgY2hhdC5kYXRhT2JqZWN0UmVwb3J0ZXIgPSBkYXRhT2JqZWN0UmVwb3J0ZXI7XHJcblxyXG4gICAgICAgICAgX3RoaXMuX3JlcG9ydGVyc0NvbnRyb2xsZXJzW2RhdGFPYmplY3RSZXBvcnRlci51cmxdID0gY2hhdDtcclxuXHJcbi8vICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIGNoYXQgaW52aXRhdGlvbnNIYW5kbGVyOiAnLCAgIGNoYXQuaW52aXRhdGlvbnNIYW5kbGVyKTtcclxuXHJcbiAgICAgICAgICAvLyBwcm9jZXNzIGludml0YXRpb25zIHRvIGhhbmRsZSBub3QgcmVjZWl2ZWQgaW52aXRhdGlvbnNcclxuLyogICAgICAgICAgaWYgKGRhdGFPYmplY3RSZXBvcnRlci5pbnZpdGF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNoYXQuaW52aXRhdGlvbnNIYW5kbGVyLnByb2Nlc3NJbnZpdGF0aW9ucyhsaXZlLCBkYXRhT2JqZWN0UmVwb3J0ZXIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIElmIGFueSBpbnZpdGVkIFVzZXIgaXMgZGlzY29ubmVjdGVkIGxldCdzIHdhaXQgdW50aWwgaXQgaXMgY29ubmVjdGVkIGFnYWluXHJcbiAgICAgICAgICBpZiAoZGlzY29ubmVjdGVkLmxlbmd0aCA+IDApIGNoYXQuaW52aXRhdGlvbnNIYW5kbGVyLmludml0ZURpc2Nvbm5lY3RlZEh5cGVydGllcyhkaXNjb25uZWN0ZWQsIGRhdGFPYmplY3RSZXBvcnRlcik7XHJcbiovXHJcbiAgICAgICAgICByZXNvbHZlKGNoYXQpO1xyXG5cclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltcGxlQ2hhdE1hbmFnZXIuY3JlYXRlXSBNeUlkZW50aXR5IEVycm9yOicsIHJlYXNvbik7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuLy8gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBoYW5kbGUgbm90aWZpY2F0aW9ucyBhYm91dCBpbmNvbWluZyBpbnZpdGF0aW9ucyB0byBqb2luIGEgR3JvdXAgQ2hhdC5cclxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gQ3JlYXRlRXZlbnQgVGhlIENyZWF0ZUV2ZW50IGZpcmVkIGJ5IHRoZSBTeW5jaGVyIHdoZW4gYW4gaW52aXRhaW9uIGlzIHJlY2VpdmVkXHJcbiAgICovXHJcbiAgb25JbnZpdGF0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uSW52aXRhdGlvbiA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGpvaW4gYSBHcm91cCBDaGF0LlxyXG4gICAqIEBwYXJhbSAge1VSTC5Db21tdW5pY2F0aW9uVVJMfSBpbnZpdGF0aW9uVVJMICBUaGUgQ29tbXVuaWNhdGlvbiBVUkwgb2YgdGhlIEdyb3VwIENoYXQgdG8gam9pbiB0aGF0IGlzIHByb3ZpZGVkIGluIHRoZSBpbnZpdGF0aW9uIGV2ZW50XHJcbiAgICogQHJldHVybiB7PFByb21pc2U+Q2hhdENvbnRyb2xsZXJ9ICAgICAgICAgICAgIEl0IHJldHVybnMgdGhlIENoYXRDb250cm9sbGVyIG9iamVjdCBhcyBhIFByb21pc2VcclxuICAgKi9cclxuICBqb2luKGludml0YXRpb25VUkwsIG11dHVhbCA9IGZhbHNlLCBpZGVudGl0eSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIGxldCBzeW5jaGVyID0gX3RoaXMuX3N5bmNoZXI7XHJcbiAgICAgIGxldCBteUlkZW50aXR5O1xyXG5cclxuICAgICAgY29uc29sZS5pbmZvKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTeW5jaGVyIHN1YnNjcmliZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFxcbicpO1xyXG4gICAgICBjb25zb2xlLmluZm8oJ2ludml0YXRpb25VUkwnLCBpbnZpdGF0aW9uVVJMKTtcclxuICAgICAgX3RoaXMubXlJZGVudGl0eShpZGVudGl0eSkudGhlbigoaWRlbnRpdHkpID0+IHtcclxuICAgICAgICBteUlkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICAgICAgbGV0IGlucHV0ID0ge1xyXG4gICAgICAgICAgc2NoZW1hOiBfdGhpcy5fb2JqZWN0RGVzY1VSTCxcclxuICAgICAgICAgIHJlc291cmNlOiBpbnZpdGF0aW9uVVJMLFxyXG4gICAgICAgICAgc3RvcmU6IHRydWUsXHJcbiAgICAgICAgICBwMnA6IGZhbHNlLFxyXG4gICAgICAgICAgbXV0dWFsOiBtdXR1YWwsXHJcbiAgICAgICAgICBkb21haW5fc3Vic2NyaXB0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgaWRlbnRpdHk6IGlkZW50aXR5XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKF90aGlzLm9mZmxpbmUpIGlucHV0Lm9mZmxpbmUgPSBfdGhpcy5vZmZsaW5lO1xyXG5cclxuICAgICAgICByZXR1cm4gc3luY2hlci5zdWJzY3JpYmUoaW5wdXQpO1xyXG5cclxuICAgICAgfSkudGhlbihmdW5jdGlvbihkYXRhT2JqZWN0T2JzZXJ2ZXIpIHtcclxuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGEgT2JqZWN0IE9ic2VydmVyOiAnLCBkYXRhT2JqZWN0T2JzZXJ2ZXIpO1xyXG5cclxuICAgICAgICBsZXQgY2hhdCA9IG5ldyBDaGF0KHN5bmNoZXIsIF90aGlzLl9kb21haW4sIG15SWRlbnRpdHksIF90aGlzKTtcclxuICAgICAgICByZXNvbHZlKGNoYXQpO1xyXG5cclxuICAgICAgICBjaGF0LmRhdGFPYmplY3RPYnNlcnZlciA9IGRhdGFPYmplY3RPYnNlcnZlcjtcclxuXHJcbiAgICAgICAgX3RoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzW2RhdGFPYmplY3RPYnNlcnZlci51cmxdID0gY2hhdDtcclxuXHJcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaW1wbGVTaW1wbGVDaGF0TWFuYWdlcjtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5pbXBvcnQgU3luY2hlciBmcm9tICcuLi9zeW5jaGVyL1N5bmNoZXInO1xyXG5pbXBvcnQgTm90aWZpY2F0aW9uSGFuZGxlciBmcm9tICcuLi9zeW5jaGVyL05vdGlmaWNhdGlvbkhhbmRsZXInO1xyXG5pbXBvcnQge2RpdmlkZVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgSWRlbnRpdHlNYW5hZ2VyIGZyb20gJy4uL2lkZW50aXR5L0lkZW50aXR5TWFuYWdlcic7XHJcbmltcG9ydCBEaXNjb3ZlcnkgZnJvbSAnLi4vZGlzY292ZXJ5L0Rpc2NvdmVyeSc7XHJcbmltcG9ydCBSZWdpc3RyYXRpb25TdGF0dXMgZnJvbSAnLi4vZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cyc7XHJcbmltcG9ydCBTZWFyY2ggZnJvbSAnLi4vdXRpbHMvU2VhcmNoJztcclxuaW1wb3J0IENvbnRleHRPYnNlcnZlciBmcm9tICcuLi9jb250ZXh0TWFuYWdlci9Db250ZXh0T2JzZXJ2ZXInO1xyXG5pbXBvcnQgQ29udGV4dFJlcG9ydGVyIGZyb20gJy4uL2NvbnRleHRNYW5hZ2VyL0NvbnRleHRSZXBvcnRlcic7XHJcbmltcG9ydCBNZXNzYWdlQm9keUlkZW50aXR5IGZyb20gJy4uL2lkZW50aXR5L01lc3NhZ2VCb2R5SWRlbnRpdHknO1xyXG5pbXBvcnQgQ2hhdE1hbmFnZXIgZnJvbSAnLi4vY2hhdE1hbmFnZXIvQ2hhdE1hbmFnZXInO1xyXG5pbXBvcnQgQ2hhdENvbnRyb2xsZXIgZnJvbSAnLi4vY2hhdE1hbmFnZXIvQ2hhdENvbnRyb2xsZXInO1xyXG5pbXBvcnQgU2ltcGxlQ2hhdE1hbmFnZXIgZnJvbSAnLi4vY2hhdE1hbmFnZXIvU2ltcGxlQ2hhdE1hbmFnZXInO1xyXG5pbXBvcnQgQ2hhdCBmcm9tICcuLi9jaGF0TWFuYWdlci9DaGF0JztcclxuXHJcbi8qKlxyXG4gKiBJbnRlcm5hbCBjb21wb25lbnQgdG8gaW5zdGFudGlhdGUgZnJhbWV3b3JrIGZ1bmN0aW9uYWxpdGllcy5cclxuICovXHJcbmNsYXNzIFNhbmRib3hGYWN0b3J5IHtcclxuICAvKiBwcml2YXRlXHJcbiAgX2NvbXBvbmVudHM6IDx1cmw6IGluc3RhbmNlPlxyXG4gICovXHJcblxyXG4gIGNvbnN0cnVjdG9yKGJ1cykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9idXMgPSBidXM7XHJcbiAgICBfdGhpcy5fZGl2aWRlVVJMID0gZGl2aWRlVVJMO1xyXG5cclxuICB9XHJcblxyXG4gIGNyZWF0ZVN5bmNoZXIob3duZXIsIGJ1cywgY29uZmlnKSB7IFxyXG4gICAgcmV0dXJuIG5ldyBTeW5jaGVyKG93bmVyLCBidXMsIGNvbmZpZyk7XHJcbiAgIH1cclxuXHJcbiAgIGNyZWF0ZUlkZW50aXR5TWFuYWdlcihoeXBlcnR5VVJMLCBydW50aW1lVVJMLCBidXMpIHsgXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eU1hbmFnZXIoaHlwZXJ0eVVSTCwgcnVudGltZVVSTCwgYnVzKTtcclxuICAgfVxyXG5cclxuICAgY3JlYXRlRGlzY292ZXJ5KGh5cGVydHlVUkwsIHJ1bnRpbWVVUkwsIGJ1cykgeyBcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IERpc2NvdmVyeShoeXBlcnR5VVJMLCBydW50aW1lVVJMLCBidXMpO1xyXG4gICB9XHJcblxyXG4gICBjcmVhdGVTZWFyY2goZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpIHsgXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBTZWFyY2goZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpO1xyXG4gICB9XHJcblxyXG4gICBjcmVhdGVDb250ZXh0T2JzZXJ2ZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWcsIHNjaGVtZXMpIHsgXHJcbiAgICByZXR1cm4gbmV3IENvbnRleHRPYnNlcnZlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZywgc2NoZW1lcywgdGhpcyk7XHJcbiAgIH1cclxuXHJcbiAgIGNyZWF0ZUNvbnRleHRSZXBvcnRlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZykgeyBcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IENvbnRleHRSZXBvcnRlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZywgdGhpcyk7XHJcbiAgIH1cclxuXHJcbiAgIGNyZWF0ZU5vdGlmaWNhdGlvbkhhbmRsZXIoYnVzKSB7IFxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgTm90aWZpY2F0aW9uSGFuZGxlcihidXMpO1xyXG4gICB9XHJcblxyXG4gICBjcmVhdGVNZXNzYWdlQm9keUlkZW50aXR5KHVzZXJuYW1lLCB1c2VyVVJMLCBwaWN0dXJlLCBuYW1lLCBsb2NhbGUsIGlkcCwgYXNzZXJ0aW9uLCBwcm9maWxlKSB7IFxyXG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlQm9keUlkZW50aXR5KHVzZXJuYW1lLCB1c2VyVVJMLCBwaWN0dXJlLCBuYW1lLCBsb2NhbGUsIGlkcCwgYXNzZXJ0aW9uLCBwcm9maWxlKTtcclxuICAgfVxyXG5cclxuICAgY3JlYXRlQ2hhdE1hbmFnZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWd1cmF0aW9uLCBzeW5jaGVyKSB7IFxyXG4gICAgcmV0dXJuIG5ldyBDaGF0TWFuYWdlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24sIHN5bmNoZXIsIHRoaXMpO1xyXG4gICB9XHJcblxyXG4gICBjcmVhdGVDaGF0Q29udHJvbGxlcihzeW5jaGVyLCBkaXNjb3ZlcnksIGRvbWFpbiwgc2VhcmNoLCBpZGVudGl0eSwgbWFuYWdlcikgeyBcclxuICAgIHJldHVybiBuZXcgQ2hhdENvbnRyb2xsZXIoc3luY2hlciwgZGlzY292ZXJ5LCBkb21haW4sIHNlYXJjaCwgaWRlbnRpdHksIG1hbmFnZXIpO1xyXG4gICB9XHJcblxyXG4gICBjcmVhdGVTaW1wbGVDaGF0TWFuYWdlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24sIHN5bmNoZXIpIHsgXHJcbiAgICByZXR1cm4gbmV3IFNpbXBsZUNoYXRNYW5hZ2VyKGh5cGVydHlVUkwsIGJ1cywgY29uZmlndXJhdGlvbiwgc3luY2hlciwgdGhpcyk7XHJcbiAgIH1cclxuXHJcbiAgIGNyZWF0ZUNoYXQoc3luY2hlciwgZG9tYWluLCBpZGVudGl0eSwgbWFuYWdlcikgeyBcclxuICAgIHJldHVybiBuZXcgQ2hhdChzeW5jaGVyLCBkb21haW4sIGlkZW50aXR5LCBtYW5hZ2VyKTtcclxuICAgfVxyXG4gICBnZXQgZGl2aWRlVVJMKCl7XHJcbiAgICAgcmV0dXJuIHRoaXMuX2RpdmlkZVVSTDtcclxuICAgfVxyXG5cclxuICAgY3JlYXRlUmVnaXN0cmF0aW9uU3RhdHVzKG9ic2VydmVyLCBydW50aW1lVVJMLCBjaGF0VXJsLCBidXMpIHtcclxuICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uU3RhdHVzKG9ic2VydmVyLCBydW50aW1lVVJMLCBjaGF0VXJsLCBidXMpO1xyXG5cclxuICB9XHJcblxyXG5cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBTYW5kYm94RmFjdG9yeTtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG4vKipcclxuICogQGF1dGhvciBtaWNhZWxwZWRyb3NhQGdtYWlsLmNvbVxyXG4gKiBCYXNlIGNsYXNzIHRvIGltcGxlbWVudCBpbnRlcm5hbCBkZXBsb3kgbWFuYWdlciBvZiBjb21wb25lbnRzLlxyXG4gKi9cclxuaW1wb3J0IFNhbmRib3hGYWN0b3J5IGZyb20gJy4vU2FuZGJveEZhY3RvcnknO1xyXG5cclxuLyoqXHJcbiAqIEBhdXRob3IgbWljYWVscGVkcm9zYUBnbWFpbC5jb21cclxuICogSW50ZXJuYWwgY29tcG9uZW50IHJlZ2lzdHJ5IG9mIGFsbCBzYW5kYm94ZXMuXHJcbiAqIFByb2Nlc3MgaW50ZXJuYWwgcmVxdWVzdCdzIGZvciBjb21wb25lbnQgZGVwbG95LlxyXG4gKi9cclxuY2xhc3MgU2FuZGJveFJlZ2lzdHJ5IHtcclxuICAvKiBwcml2YXRlXHJcbiAgX2NvbXBvbmVudHM6IDx1cmw6IGluc3RhbmNlPlxyXG4gICovXHJcblxyXG4gIGNvbnN0cnVjdG9yKGJ1cykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fYnVzID0gYnVzO1xyXG4gICAgX3RoaXMuX2ZhY3RvcnkgPSBuZXcgU2FuZGJveEZhY3RvcnkoYnVzKTtcclxuICAgIF90aGlzLl9jb21wb25lbnRzID0ge307XHJcblxyXG4gICAgYnVzLmFkZExpc3RlbmVyKFNhbmRib3hSZWdpc3RyeS5JbnRlcm5hbERlcGxveUFkZHJlc3MsIChtc2cpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ1NhbmRib3hSZWdpc3RyeS1SQ1Y6ICcsIG1zZyk7XHJcbiAgICAgIC8vIGxldCByZXNwb25zZU1zZyA9IHtcclxuICAgICAgLy8gICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBTYW5kYm94UmVnaXN0cnkuSW50ZXJuYWxEZXBsb3lBZGRyZXNzLCB0bzogU2FuZGJveFJlZ2lzdHJ5LkV4dGVybmFsRGVwbG95QWRkcmVzc1xyXG4gICAgICAvLyB9O1xyXG5cclxuICAgICAgc3dpdGNoIChtc2cudHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ2NyZWF0ZSc6IF90aGlzLl9vbkRlcGxveShtc2cpOyBicmVhaztcclxuICAgICAgICBjYXNlICdkZWxldGUnOiBfdGhpcy5fb25SZW1vdmUobXNnKTsgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbXBvbmVudHMoKSB7IHJldHVybiB0aGlzLl9jb21wb25lbnRzOyB9XHJcblxyXG4gIF9yZXNwb25zZU1zZyhtc2csIGNvZGUsIHZhbHVlKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvLyBsZXQgbWVzc2FnZUZhY3RvcnkgPSBfdGhpcy5tZXNzYWdlRmFjdG9yeTtcclxuXHJcbiAgICAvL0ZMT1ctT1VUOiBnZW5lcmljIHJlc3BvbnNlIG1lc3NhZ2UgdG8gZXh0ZXJuYWwgU2FuZGJveCAoZGVwbG95IGFuZCB1bi1kZXBsb3kgcmVzcG9uc2VzKVxyXG4gICAgbGV0IHJlc3BvbnNlTXNnID0ge1xyXG4gICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBTYW5kYm94UmVnaXN0cnkuSW50ZXJuYWxEZXBsb3lBZGRyZXNzLCB0bzogU2FuZGJveFJlZ2lzdHJ5LkV4dGVybmFsRGVwbG95QWRkcmVzc1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBDaGFuZWdlIHRoZSBvcmlnaW4gbWVzc2FnZSwgYmVjYXVzZSB0aGUgcmVzcG9uc2U7XHJcbiAgICAvLyBtc2cuZnJvbSA9IFNhbmRib3hSZWdpc3RyeS5JbnRlcm5hbERlcGxveUFkZHJlc3M7XHJcbiAgICAvLyBtc2cudG8gPSBTYW5kYm94UmVnaXN0cnkuRXh0ZXJuYWxEZXBsb3lBZGRyZXNzO1xyXG5cclxuICAgIGxldCBib2R5ID0ge307XHJcbiAgICBpZiAoY29kZSkgYm9keS5jb2RlID0gY29kZTtcclxuICAgIGlmICh2YWx1ZSkgYm9keS5kZXNjID0gdmFsdWU7XHJcblxyXG4gICAgcmVzcG9uc2VNc2cuYm9keSA9IGJvZHk7XHJcblxyXG4gICAgLy8gcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmNyZWF0ZVJlc3BvbnNlKG1zZywgY29kZSwgdmFsdWUpO1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlTXNnO1xyXG4gIH1cclxuXHJcbiAgLy9GTE9XLUlOOiBtZXNzYWdlIGZyb20gdGhlIHJ1bnRpbWUgY29yZSBTYW5kYm94IC0+IGRlcGxveUNvbXBvbmVudFxyXG4gIF9vbkRlcGxveShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgY29uZmlnID0gbXNnLmJvZHkuY29uZmlnO1xyXG4gICAgbGV0IGNvbXBvbmVudFVSTCA9IG1zZy5ib2R5LnVybDtcclxuICAgIGxldCBzb3VyY2VDb2RlID0gbXNnLmJvZHkuc291cmNlQ29kZTtcclxuICAgIGxldCByZXNwb25zZUNvZGU7XHJcbiAgICBsZXQgcmVzcG9uc2VEZXNjO1xyXG5cclxuICAgIGlmICghX3RoaXMuX2NvbXBvbmVudHMuaGFzT3duUHJvcGVydHkoY29tcG9uZW50VVJMKSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICBjb25zb2xlLmxvZygnU2FuZGJveFJlZ2lzdHJ5LW9uRGVwbG95OiAnLCBtc2cpO1xyXG4gICAgICBfdGhpcy5fY29tcG9uZW50c1tjb21wb25lbnRVUkxdID0gX3RoaXMuX2NyZWF0ZShjb21wb25lbnRVUkwsIHNvdXJjZUNvZGUsIGNvbmZpZywgX3RoaXMuX2ZhY3RvcnkgKTtcclxuICAgICAgICByZXNwb25zZUNvZGUgPSAyMDA7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgcmVzcG9uc2VDb2RlID0gNTAwO1xyXG4gICAgICAgIHJlc3BvbnNlRGVzYyA9IGVycm9yO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXNwb25zZUNvZGUgPSA1MDA7XHJcbiAgICAgIHJlc3BvbnNlRGVzYyA9ICdJbnN0YW5jZSAnICsgY29tcG9uZW50VVJMICsgJyBhbHJlYWR5IGV4aXN0ISc7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlTXNnID0gX3RoaXMuX3Jlc3BvbnNlTXNnKG1zZywgcmVzcG9uc2VDb2RlLCByZXNwb25zZURlc2MpO1xyXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXNwb25zZU1zZyk7XHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgZnJvbSB0aGUgcnVudGltZSBjb3JlIFNhbmRib3ggLT4gcmVtb3ZlQ29tcG9uZW50XHJcbiAgX29uUmVtb3ZlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBjb21wb25lbnRVUkwgPSBtc2cuYm9keS51cmw7XHJcbiAgICBsZXQgcmVzcG9uc2VDb2RlO1xyXG4gICAgbGV0IHJlc3BvbnNlRGVzYztcclxuXHJcbiAgICBpZiAoX3RoaXMuX2NvbXBvbmVudHMuaGFzT3duUHJvcGVydHkoY29tcG9uZW50VVJMKSkge1xyXG4gICAgICAvL3JlbW92ZSBjb21wb25lbnQgZnJvbSB0aGUgcG9vbCBhbmQgYWxsIGxpc3RlbmVyc1xyXG4gICAgICBkZWxldGUgX3RoaXMuX2NvbXBvbmVudHNbY29tcG9uZW50VVJMXTtcclxuICAgICAgX3RoaXMuX2J1cy5yZW1vdmVBbGxMaXN0ZW5lcnNPZihjb21wb25lbnRVUkwpO1xyXG4gICAgICByZXNwb25zZUNvZGUgPSAyMDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXNwb25zZUNvZGUgPSA1MDA7XHJcbiAgICAgIHJlc3BvbnNlRGVzYyA9ICdJbnN0YW5jZSAnICsgY29tcG9uZW50VVJMICsgJyBkb2VzblxcJ3QgZXhpc3QhJztcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzcG9uc2VNc2cgPSBfdGhpcy5fcmVzcG9uc2VNc2cobXNnLCByZXNwb25zZUNvZGUsIHJlc3BvbnNlRGVzYyk7XHJcblxyXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXNwb25zZU1zZyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVybmFsIHNhbmRib3ggY29kZS5cclxuICAgKiBAcGFyYW0gIHtDb21wb25lbnRVUkx9IHVybCBVUkwgdXNlZCBmb3IgdGhlIGluc3RhbmNlXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSBzb3VyY2VDb2RlIENvZGUgb2YgdGhlIGNvbXBvbmVudFxyXG4gICAqIEBwYXJhbSAge0NvbmZpZ30gY29uZmlnIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVyc1xyXG4gICAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IG9yIHRocm93IGFuIGVycm9yIFwidGhyb3cgJ2Vycm9yIG1lc3NhZ2UnXCJcclxuICAgKi9cclxuICBfY3JlYXRlKHVybCwgc291cmNlQ29kZSwgY29uZmlnLCBmYWN0b3J5KSB7XHJcbiAgICAvL2ltcGxlbWVudGF0aW9uIHNwZWNpZmljXHJcbiAgICAvKiBleGFtcGxlIGNvZGU6XHJcbiAgICAgIGV2YWwoc291cmNlQ29kZSk7XHJcbiAgICAgIHJldHVybiBhY3RpdmF0ZSh1cmwsIF90aGlzLl9idXMsIGNvbmZpZyk7XHJcbiAgICAqL1xyXG4gIH1cclxufVxyXG5cclxuU2FuZGJveFJlZ2lzdHJ5LkV4dGVybmFsRGVwbG95QWRkcmVzcyA9ICdoeXBlcnR5LXJ1bnRpbWU6Ly9zYW5kYm94L2V4dGVybmFsJztcclxuU2FuZGJveFJlZ2lzdHJ5LkludGVybmFsRGVwbG95QWRkcmVzcyA9ICdoeXBlcnR5LXJ1bnRpbWU6Ly9zYW5kYm94L2ludGVybmFsJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNhbmRib3hSZWdpc3RyeTtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gTG9nIHN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQnVzJyk7XHJcblxyXG4vKipcclxuKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXHJcbiogTWluaW1hbCBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uIHRvIHNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMuIEl0IGNhbiBiZSByZXVzZWQgaW4gbWFueSB0eXBlIG9mIGNvbXBvbmVudHMuXHJcbiogQ29tcG9uZW50cyB0aGF0IG5lZWQgYSBtZXNzYWdlIHN5c3RlbSBzaG91bGQgcmVjZWl2ZSB0aGlzIGNsYXNzIGFzIGEgZGVwZW5kZW5jeSBvciBleHRlbmQgaXQuXHJcbiogRXh0ZW5zaW9ucyBzaG91bGQgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcHJpdmF0ZSBtZXRob2RzOiBfb25Qb3N0TWVzc2FnZSBhbmQgX3JlZ2lzdGVyRXh0ZXJuYWxMaXN0ZW5lclxyXG4qL1xyXG5jbGFzcyBCdXMge1xyXG4gIC8qIHByaXZhdGVcclxuICBfbXNnSWQ6IG51bWJlcjtcclxuICBfc3Vic2NyaXB0aW9uczogPHVybDogTXNnTGlzdGVuZXJbXT5cclxuXHJcbiAgX3Jlc3BvbnNlVGltZU91dDogbnVtYmVyXHJcbiAgX3Jlc3BvbnNlQ2FsbGJhY2tzOiA8dXJsK2lkOiAobXNnKSA9PiB2b2lkPlxyXG5cclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fbXNnSWQgPSAwO1xyXG4gICAgX3RoaXMuX3N1YnNjcmlwdGlvbnMgPSB7fTtcclxuXHJcbiAgICBfdGhpcy5fcmVzcG9uc2VUaW1lT3V0ID0gMTUwMDA7IC8vZGVmYXVsdCB0byAzc1xyXG4gICAgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzID0ge307XHJcblxyXG4gICAgX3RoaXMuX3JlZ2lzdGVyRXh0ZXJuYWxMaXN0ZW5lcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBSZWdpc3RlciBsaXN0ZW5lciB0byByZWNlaXZlIG1lc3NhZ2Ugd2hlbiBcIm1zZy50byA9PT0gdXJsXCIuXHJcbiAgKiBTcGVjaWFsIHVybCBcIipcIiBmb3IgZGVmYXVsdCBsaXN0ZW5lciBpcyBhY2NlcHRlZCB0byBpbnRlcmNlcHQgYWxsIG1lc3NhZ2VzLlxyXG4gICogQHBhcmFtIHtVUkx9IHVybCBBZGRyZXNzIHRvIGludGVyY2VwdCwgdGhhIGlzIGluIHRoZSBtZXNzYWdlIFwidG9cIlxyXG4gICogQHBhcmFtIHtMaXN0ZW5lcn0gbGlzdGVuZXIgbGlzdGVuZXJcclxuICAqIEByZXR1cm4ge01zZ0xpc3RlbmVyfSBpbnN0YW5jZSBvZiBNc2dMaXN0ZW5lclxyXG4gICovXHJcbiAgYWRkTGlzdGVuZXIodXJsLCBsaXN0ZW5lcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgaXRlbSA9IG5ldyBNc2dMaXN0ZW5lcihfdGhpcy5fc3Vic2NyaXB0aW9ucywgdXJsLCBsaXN0ZW5lcik7XHJcbiAgICBsZXQgaXRlbUxpc3QgPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1cmxdO1xyXG4gICAgaWYgKCFpdGVtTGlzdCkge1xyXG4gICAgICBpdGVtTGlzdCA9IFtdO1xyXG4gICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1cmxdID0gaXRlbUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaXRlbUxpc3QucHVzaChpdGVtKTtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFudWFsbHkgYWRkIGEgcmVzcG9uc2UgbGlzdGVuZXIuIE9ubHkgb25lIGxpc3RlbmVyIHBlciBtZXNzYWdlIElEIHNob3VsZCBleGlzdC5cclxuICAgKiBBVEVOVElPTiwgdGhlcmUgaXMgbm8gdGltZW91dCBmb3IgdGhpcyBsaXN0ZW5lci5cclxuICAgKiBUaGUgbGlzdGVuZXIgc2hvdWxkIGJlIHJlbW92ZWQgd2l0aCBhIHJlbW92ZVJlc3BvbnNlTGlzdGVuZXIsIGZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiBhIHVucmVsZWFzZWQgbWVtb3J5IHByb2JsZW0uXHJcbiAgICogQHBhcmFtIHtVUkx9IHVybCBPcmlnaW4gYWRkcmVzcyBvZiB0aGUgbWVzc2FnZSBzZW50LCBcIm1zZy5mcm9tXCIuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1zZ0lkIE1lc3NhZ2UgSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIHRoZSBwb3N0TWVzc2FnZS5cclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNwb25zZUxpc3RlbmVyIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgcmVzcG9uc2VcclxuICAgKi9cclxuICBhZGRSZXNwb25zZUxpc3RlbmVyKHVybCwgbXNnSWQsIHJlc3BvbnNlTGlzdGVuZXIpIHtcclxuICAgIHRoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3VybCArIG1zZ0lkXSA9IHJlc3BvbnNlTGlzdGVuZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdGhlIHJlc3BvbnNlIGxpc3RlbmVyLlxyXG4gICAqIEBwYXJhbSB7VVJMfSB1cmwgT3JpZ2luIGFkZHJlc3Mgb2YgdGhlIG1lc3NhZ2Ugc2VudCwgXCJtc2cuZnJvbVwiLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtc2dJZCAgTWVzc2FnZSBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gdGhlIHBvc3RNZXNzYWdlXHJcbiAgICovXHJcbiAgcmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcih1cmwsIG1zZ0lkKSB7XHJcbiAgICBkZWxldGUgdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbdXJsICsgbXNnSWRdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFsbCBleGlzdGVudCBsaXN0ZW5lcnMgZm9yIHRoZSBVUkxcclxuICAgKiBAcGFyYW0gIHtVUkx9IHVybCBBZGRyZXNzIHJlZ2lzdGVyZWRcclxuICAgKi9cclxuICByZW1vdmVBbGxMaXN0ZW5lcnNPZih1cmwpIHtcclxuICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpcHRpb25zW3VybF07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGJpbmQgbGlzdGVuZXJzIChpbiBib3RoIGRpcmVjdGlvbnMpIGludG8gb3RoZXIgTWluaUJ1cyB0YXJnZXQuXHJcbiAgICogQHBhcmFtICB7VVJMfSBvdXRVcmwgT3V0Ym91bmQgVVJMLCByZWdpc3RlciBsaXN0ZW5lciBmb3IgdXJsIGluIGRpcmVjdGlvbiBcInRoaXMgLT4gdGFyZ2V0XCJcclxuICAgKiBAcGFyYW0gIHtVUkx9IGluVXJsIEluYm91bmQgVVJMLCByZWdpc3RlciBsaXN0ZW5lciBmb3IgdXJsIGluIGRpcmVjdGlvbiBcInRhcmdldCAtPiB0aGlzXCJcclxuICAgKiBAcGFyYW0gIHtNaW5pQnVzfSB0YXJnZXQgVGhlIG90aGVyIHRhcmdldCBNaW5pQnVzXHJcbiAgICogQHJldHVybiB7Qm91bmR9IGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIFt0aGlzTGlzdGVuZXIsIHRhcmdldExpc3RlbmVyXSBhbmQgdGhlIHVuYmluZCBtZXRob2QuXHJcbiAgICovXHJcbiAgYmluZChvdXRVcmwsIGluVXJsLCB0YXJnZXQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IHRoaXNMaXN0biA9IF90aGlzLmFkZExpc3RlbmVyKG91dFVybCwgKG1zZykgPT4ge1xyXG4gICAgICB0YXJnZXQucG9zdE1lc3NhZ2UobXNnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCB0YXJnZXRMaXN0biA9IHRhcmdldC5hZGRMaXN0ZW5lcihpblVybCwgKG1zZykgPT4ge1xyXG4gICAgICBfdGhpcy5wb3N0TWVzc2FnZShtc2cpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGhpc0xpc3RlbmVyOiB0aGlzTGlzdG4sXHJcbiAgICAgIHRhcmdldExpc3RlbmVyOiB0YXJnZXRMaXN0bixcclxuICAgICAgdW5iaW5kOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50aGlzTGlzdGVuZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy50YXJnZXRMaXN0ZW5lci5yZW1vdmUoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vcHVibGlzaCBvbiBkZWZhdWx0IGxpc3RlbmVyc1xyXG4gIF9wdWJsaXNoT25EZWZhdWx0KG1zZykge1xyXG4gICAgLy9pcyB0aGVyZSBhbnkgXCIqXCIgKGRlZmF1bHQpIGxpc3RlbmVycz9cclxuICAgIGxldCBpdGVtTGlzdCA9IHRoaXMuX3N1YnNjcmlwdGlvbnNbJyonXTtcclxuICAgIGlmIChpdGVtTGlzdCkge1xyXG4gICAgICB0aGlzLl9wdWJsaXNoT24oaXRlbUxpc3QsIG1zZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL3B1Ymxpc2ggb24gYSBzdWJzY3JpcHRpb24gbGlzdC5cclxuICBfcHVibGlzaE9uKGl0ZW1MaXN0LCBtc2cpIHtcclxuICAgIGl0ZW1MaXN0LmZvckVhY2goKHN1YikgPT4ge1xyXG4gICAgICBzdWIuX2NhbGxiYWNrKG1zZyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9yZXNwb25zZUNhbGxiYWNrKGluTXNnLCByZXNwb25zZUNhbGxiYWNrLCB0aW1lb3V0ID0gdHJ1ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL2F1dG9tYXRpYyBtYW5hZ2VtZW50IG9mIHJlc3BvbnNlIGhhbmRsZXJzXHJcbiAgICBpZiAocmVzcG9uc2VDYWxsYmFjaykge1xyXG4gICAgICBsZXQgcmVzcG9uc2VJZCA9IGluTXNnLmZyb20gKyBpbk1zZy5pZDtcclxuICAgICAgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdID0gcmVzcG9uc2VDYWxsYmFjaztcclxuXHJcbiAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgcmVzcG9uc2VGdW4gPSBfdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbcmVzcG9uc2VJZF07XHJcbiAgICAgICAgICBkZWxldGUgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdO1xyXG5cclxuICAgICAgICAgIGlmIChyZXNwb25zZUZ1bikge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3JNc2cgPSB7XHJcbiAgICAgICAgICAgICAgaWQ6IGluTXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLFxyXG4gICAgICAgICAgICAgIGJvZHk6IHsgY29kZTogNDA4LCBkZXNjOiAnUmVzcG9uc2UgdGltZW91dCEnLCB2YWx1ZTogaW5Nc2cgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmVzcG9uc2VGdW4oZXJyb3JNc2cpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIF90aGlzLl9yZXNwb25zZVRpbWVPdXQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8vVE9ETzogcHJvdmlzaW9uYWwgcmVzcG9uc2VzIHNob3VsZCByZXNldCB0aW1lb3V0XHJcbiAgX29uUmVzcG9uc2UobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmIChtc2cudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xyXG4gICAgICBsZXQgcmVzcG9uc2VJZCA9IG1zZy50byArIG1zZy5pZDtcclxuICAgICAgbGV0IHJlc3BvbnNlRnVuID0gX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdO1xyXG5cclxuICAgICAgaWYgKG1zZy5ib2R5LmNvZGUgPj0gMjAwKSB7IC8vaWYgaXQncyBhIHByb3Zpc2lvbmFsIHJlc3BvbnNlLCBkb24ndCBkZWxldGUgcmVzcG9uc2UgbGlzdGVuZXJcclxuICAgICAgICBkZWxldGUgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVzcG9uc2VGdW4pIHtcclxuICAgICAgICByZXNwb25zZUZ1bihtc2cpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvL3JlY2VpdmUgbWVzc2FnZXMgZnJvbSBleHRlcm5hbCBpbnRlcmZhY2VcclxuICBfb25NZXNzYWdlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoIV90aGlzLl9vblJlc3BvbnNlKG1zZykpIHtcclxuICAgICAgbGV0IGl0ZW1MaXN0ID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbbXNnLnRvXTtcclxuICAgICAgaWYgKGl0ZW1MaXN0KSB7XHJcbiAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbihpdGVtTGlzdCwgbXNnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBfdGhpcy5fcHVibGlzaE9uRGVmYXVsdChtc2cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfZ2VuSWQoaW5Nc2cpIHtcclxuICAgIC8vVE9ETzogaG93IGRvIHdlIG1hbmFnZSBtZXNzYWdlIElEJ3M/IFNob3VsZCBpdCBiZSBhIGdsb2JhbCBydW50aW1lIGNvdW50ZXIsIG9yIHBlciBVUkwgYWRkcmVzcz9cclxuICAgIC8vR2xvYmFsIGNvdW50ZXIgd2lsbCBub3Qgd29yaywgYmVjYXVzZSB0aGVyZSB3aWxsIGJlIG11bHRpcGxlIE1pbmlCdXMgaW5zdGFuY2VzIVxyXG4gICAgLy9QZXIgVVJMLCBjYW4gYmUgYSBsb3Qgb2YgZGF0YSB0byBtYWludGFpbiFcclxuICAgIC8vTWF5YmUgYSBjb3VudGVyIHBlciBNaW5pQnVzIGluc3RhbmNlLiBUaGlzIGlzIHRoZSBhc3N1bWVkIHNvbHV0aW9uIGZvciBub3cuXHJcbiAgICBpZiAoIWluTXNnLmlkIHx8IGluTXNnLmlkID09PSAwKSB7XHJcbiAgICAgIHRoaXMuX21zZ0lkKys7XHJcbiAgICAgIGluTXNnLmlkID0gdGhpcy5fbXNnSWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNlbmQgbWVzc2FnZXMgdG8gbG9jYWwgbGlzdGVuZXJzLCBvciBpZiBub3QgZXhpc3RzIHRvIGV4dGVybmFsIGxpc3RlbmVycy5cclxuICAqIEl0J3MgaGFzIGFuIG9wdGlvbmFsIG1lY2hhbmlzbSBmb3IgYXV0b21hdGljIG1hbmFnZW1lbnQgb2YgcmVzcG9uc2UgaGFuZGxlcnMuXHJcbiAgKiBUaGUgcmVzcG9uc2UgaGFuZGxlciB3aWxsIGJlIHVucmVnaXN0ZXJlZCBhZnRlciByZWNlaXZpbmcgdGhlIHJlc3BvbnNlLCBvciBhZnRlciByZXNwb25zZSB0aW1lb3V0IChkZWZhdWx0IHRvIDNzKS5cclxuICAqIEBwYXJhbSAge01lc3NhZ2V9IG1zZyBNZXNzYWdlIHRvIHNlbmQuIE1lc3NhZ2UgSUQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgbWVzc2FnZS5cclxuICAqIEBwYXJhbSAge0Z1bmN0aW9ufSByZXNwb25zZUNhbGxiYWNrIE9wdGlvbmFsIHBhcmFtZXRlciwgaWYgdGhlIGRldmVsb3BlciB3aGF0J3MgYXV0b21hdGljIHJlc3BvbnNlIG1hbmFnZW1lbnQuXHJcbiAgKiBAcmV0dXJuIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lc3NhZ2UgSUQsIGluIGNhc2UgaXQgc2hvdWxkIGJlIG5lZWRlZCBmb3IgbWFudWFsIG1hbmFnZW1lbnQgb2YgdGhlIHJlc3BvbnNlIGhhbmRsZXIuXHJcbiAgKi9cclxuICBwb3N0TWVzc2FnZShpbk1zZywgcmVzcG9uc2VDYWxsYmFjaykgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIHBvc3QgbWVzc2FnZXMgd2l0aCBhIG51bWJlciBvZiByZXRyaWVzIGluIGNhc2UgdGltZW91dHMgb2NjdXIuXHJcbiAgICogQHBhcmFtICB7TWVzc2FnZX0gbXNnIE1lc3NhZ2UgdG8gc2VuZC4gTWVzc2FnZSBJRCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBtZXNzYWdlLlxyXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSByZXNwb25zZUNhbGxiYWNrIE9wdGlvbmFsIHBhcmFtZXRlciwgaWYgdGhlIGRldmVsb3BlciB3aGF0J3MgYXV0b21hdGljIHJlc3BvbnNlIG1hbmFnZW1lbnQuXHJcbiAgICogQHBhcmFtICB7aW50ZWdlcn0gcmV0cmllcyBudW1iZXIgb2YgcmV0cmllcyB3aGVuIHRpbWVvdXRzIG9jY3VyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gbWVzc2FnZSBkZWxpdmVyeSByZXN1bHQ7XHJcbiAgICovXHJcblxyXG5cclxuICBwb3N0TWVzc2FnZVdpdGhSZXRyaWVzKG1zZywgcmV0cmllcywgY2FsbGJhY2spIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCByZXRyeSA9IDA7XHJcbiAgICAvL2xldCB0aW1lb3V0ID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgc2VuZE1zZyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBfdGhpcy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gNDA4IHx8IHJlcGx5LmJvZHkuY29kZSA9PT0gNTAwKSByZWplY3QoKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsb2cuaW5mbygnW0J1cy5wb3N0TWVzc2FnZVdpdGhSZXRyaWVzXSBtc2cgZGVsaXZlcmVkOiAnLCBtc2cpO1xyXG4gICAgICAgICAgICBjYWxsYmFjayhyZXBseSk7XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCB0cnlBZ2FpbiA9ICgpID0+IHtcclxuICAgICAgc2VuZE1zZygpLnRoZW4oKCk9PntcclxuICAgICAgICAvL3RpbWVvdXQgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0sICgpPT57XHJcbiAgICAgICAgbG9nLndhcm4oYFtCdXMucG9zdE1lc3NhZ2VXaXRoUmV0cmllc10gTWVzc2FnZSBCb3VuY2VkIChyZXRyeSAke3JldHJ5fSk6ICdgLCBtc2cpO1xyXG4gICAgICAgIGlmIChyZXRyeSsrIDwgcmV0cmllcykge1xyXG4gICAgICAgICAgdHJ5QWdhaW4oKTtcclxuICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4geyB0cnlBZ2FpbigpOyB9LCAxMDAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBgW0Vycm9yXSBNZXNzYWdlIEJvdW5jZWQgKGRlbGl2ZXJ5IGF0dGVtcHRzICR7cmV0cmllc30pOiAnYDtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvciArIG1zZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICB0cnlBZ2FpbigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTm90IHB1YmxpYyBhdmFpbGFibGUsIHVzZWQgYnkgdGhlIGNsYXNzIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiwgdG8gcHJvY2VzcyBtZXNzYWdlcyBmcm9tIHRoZSBwdWJsaWMgXCJwb3N0TWVzc2FnZVwiIHdpdGhvdXQgYSByZWdpc3RlcmVkIGxpc3RlbmVyLlxyXG4gICAqIFVzZWQgdG8gc2VuZCB0aGUgbWVzc2FnZSB0byBhbiBleHRlcm5hbCBpbnRlcmZhY2UsIGxpa2UgYSBXZWJXb3JrZXIsIElGcmFtZSwgZXRjLlxyXG4gICAqIEBwYXJhbSAge01lc3NhZ2UuTWVzc2FnZX0gbXNnIE1lc3NhZ2VcclxuICAgKi9cclxuICBfb25Qb3N0TWVzc2FnZShtc2cpIHsgLyppbXBsZW1lbnRhdGlvbiB3aWxsIHNlbmQgbWVzc2FnZSB0byBleHRlcm5hbCBzeXN0ZW0qLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5vdCBwdWJsaWMgYXZhaWxhYmxlLCB1c2VkIGJ5IHRoZSBjbGFzcyBleHRlbnNpb24gaW1wbGVtZW50YXRpb24sIHRvIHByb2Nlc3MgYWxsIG1lc3NhZ2VzIHRoYXQgZW50ZXIgdGhlIE1pbmlCdXMgZnJvbSBhbiBleHRlcm5hbCBpbnRlcmZhY2UsIGxpa2UgYSBXZWJXb3JrZXIsIElGcmFtZSwgZXRjLlxyXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmUgdGltZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gcmVnaXN0ZXIgZXh0ZXJuYWwgbGlzdGVuZXJzLlxyXG4gICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIHByb2JhYmx5IGNhbGwgdGhlIFwiX29uTWVzc2FnZVwiIG1ldGhvZCB0byBwdWJsaXNoIGluIHRoZSBsb2NhbCBsaXN0ZW5lcnMuXHJcbiAgICogRE8gTk9UIGNhbGwgXCJwb3N0TWVzc2FnZVwiLCB0aGVyZSBpcyBhIGRhbmdlciB0aGF0IHRoZSBtZXNzYWdlIGVudGVycyBpbiBhIGN5Y2xlIVxyXG4gICAqL1xyXG4gIF9yZWdpc3RlckV4dGVybmFsTGlzdGVuZXIoKSB7IC8qaW1wbGVtZW50YXRpb24gd2lsbCByZWdpc3RlciBleHRlcm5hbCBsaXN0ZW5lciBhbmQgY2FsbCBcInRoaXMuX29uTWVzc2FnZShtc2cpXCIgKi8gfVxyXG5cclxufVxyXG5cclxuY2xhc3MgTXNnTGlzdGVuZXIge1xyXG4gIC8qIHByaXZhdGVcclxuICBfc3Vic2NyaXB0aW9uczogPHN0cmluZzogTXNnTGlzdGVuZXJbXT47XHJcbiAgX3VybDogc3RyaW5nO1xyXG4gIF9jYWxsYmFjazogKG1zZykgPT4gdm9pZDtcclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3RvcihzdWJzY3JpcHRpb25zLCB1cmwsIGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9zdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucztcclxuICAgIF90aGlzLl91cmwgPSB1cmw7XHJcbiAgICBfdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIGdldCB1cmwoKSB7IHJldHVybiB0aGlzLl91cmw7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHRoaXMgbGlzdGVuZXIgZnJvbSB0aGUgQnVzXHJcbiAgICovXHJcbiAgcmVtb3ZlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgc3VicyA9IF90aGlzLl9zdWJzY3JpcHRpb25zW190aGlzLl91cmxdO1xyXG4gICAgaWYgKHN1YnMpIHtcclxuICAgICAgbGV0IGluZGV4ID0gc3Vicy5pbmRleE9mKF90aGlzKTtcclxuICAgICAgc3Vicy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgLy9pZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLCByZW1vdmUgdGhlIHN1YnNjcmlwdGlvbiBlbnRpcmVseS5cclxuICAgICAgaWYgKHN1YnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgZGVsZXRlIF90aGlzLl9zdWJzY3JpcHRpb25zW190aGlzLl91cmxdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdXM7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuaW1wb3J0IEJ1cyBmcm9tICcuL0J1cyc7XHJcblxyXG4vKipcclxuKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXHJcbiogTWVzc2FnZSBCVVMgSW50ZXJmYWNlIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgQnVzXHJcbiogSXQgaXMgdXNlZCBtYWlubHkgaW4gdGhlIGludGVybmFsIHNhbmRib3ggcm91dGluZy5cclxuKi9cclxuY2xhc3MgTWluaUJ1cyBleHRlbmRzIEJ1cyB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBvc3QgYSBtZXNzYWdlIGZvciByb3V0aW5nLiBNZXNzYWdlIGlzIHJvdXRlZCBkaXJlY3RseSB0byB0aGUgZXh0ZXJuYWwgcm91dGluZyBfb25Qb3N0TWVzc2FnZS5cclxuICAgKiBAcGFyYW0gIHtNZXNzYWdlfSBpbk1zZyAgICAgICAgICAgIEpTT04gd2l0aCBtYW5kYXRvcnkgTWVzc2FnZSBzdHJ1Y3R1cmUge2lkLCB0eXBlLCBmcm9tLCB0b31cclxuICAgKiBAcGFyYW0gIHtDYWxsYmFja30gcmVzcG9uc2VDYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayBpZiBhIHJlc3BvbnNlIGlzIGV4cGVjdGVkIGZyb20gdGhlIHJlcXVlc3QuIEEgcmVzcG9uc2Ugd2lsbCBiZSBhbHdheXMgc2VudCwgZXZlbiBpZiBpdCBpcyBhIFwiVGltZW91dFwiLlxyXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgICAgICAgICAgICB0aGUgTWVzc2FnZSBpZFxyXG4gICAqL1xyXG4gIHBvc3RNZXNzYWdlKGluTXNnLCByZXNwb25zZUNhbGxiYWNrLCB0aW1lb3V0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9nZW5JZChpbk1zZyk7XHJcbiAgICBfdGhpcy5fcmVzcG9uc2VDYWxsYmFjayhpbk1zZywgcmVzcG9uc2VDYWxsYmFjaywgdGltZW91dCk7XHJcblxyXG4gICAgLy9hbHdheXMgc2VuZCB0byBleHRlcm5hbCAodG8gY29yZSBNZXNzYWdlQnVzKVxyXG4gICAgX3RoaXMuX29uUG9zdE1lc3NhZ2UoaW5Nc2cpO1xyXG5cclxuICAgIHJldHVybiBpbk1zZy5pZDtcclxuICB9XHJcblxyXG4gIC8vaW50ZXJuYWwgbWV0aG9kIHVzZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYnkgYW4gZXh0ZXJuYWwgcm91dGluZyBzeXN0ZW1cclxuICBfb25NZXNzYWdlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoIV90aGlzLl9vblJlc3BvbnNlKG1zZykpIHtcclxuICAgICAgbGV0IGl0ZW1MaXN0ID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbbXNnLnRvXTtcclxuICAgICAgaWYgKGl0ZW1MaXN0KSB7XHJcbiAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbihpdGVtTGlzdCwgbXNnKTtcclxuICAgICAgICBpZiAoIW1zZy50by5zdGFydHNXaXRoKCdoeXBlcnR5JykpIHtcclxuICAgICAgICAgIF90aGlzLl9wdWJsaXNoT25EZWZhdWx0KG1zZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aGlzLl9wdWJsaXNoT25EZWZhdWx0KG1zZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNaW5pQnVzO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcbmltcG9ydCBTYW5kYm94UmVnaXN0cnkgZnJvbSAnLi9TYW5kYm94UmVnaXN0cnknO1xyXG5pbXBvcnQgTWluaUJ1cyBmcm9tICcuLi9idXMvTWluaUJ1cyc7XHJcblxyXG5cclxuZXhwb3J0IGxldCBTYW5kYm94VHlwZSA9IHtBUFA6ICdhcHAnLCBOT1JNQUw6ICdub3JtYWwnLCBXSU5ET1c6ICd3aW5kb3cnfTtcclxuXHJcbi8qKlxyXG4gKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXHJcbiAqIEJhc2UgY2xhc3MgdG8gaW1wbGVtZW50IGV4dGVybmFsIHNhbmRib3ggY29tcG9uZW50XHJcbiAqL1xyXG5jbGFzcyBTYW5kYm94IGV4dGVuZHMgTWluaUJ1cyB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNhcGFiaWxpdGllcykge1xyXG5cclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoY2FwYWJpbGl0aWVzKSAgICAgIHsgX3RoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOyB9XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlcGxveSBhbiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGludG8gdGhlIHNhbmRib3guXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSBjb21wb25lbnRTb3VyY2VDb2RlIENvbXBvbmVudCBzb3VyY2UgY29kZSAoSHlwZXJ0eSwgUHJvdG9TdHViLCBldGMpXHJcbiAgICogQHBhcmFtICB7VVJMfSBjb21wb25lbnRVUkwgSHlwZXJ0eSwgUHJvdG9TdHViLCBvciBhbnkgb3RoZXIgY29tcG9uZW50IGFkZHJlc3MuXHJcbiAgICogQHBhcmFtICB7Q29uZmlnfSBjb25maWd1cmF0aW9uIENvbmZpZyBwYXJhbWV0ZXJzIG9mIHRoZSBjb21wb25lbnRcclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IHJldHVybiBkZXBsb3llZCBpZiBzdWNjZXNzZnVsLCBvciBhbnkgb3RoZXIgc3RyaW5nIHdpdGggYW4gZXJyb3JcclxuICAgKi9cclxuICBkZXBsb3lDb21wb25lbnQoY29tcG9uZW50U291cmNlQ29kZSwgY29tcG9uZW50VVJMLCBjb25maWd1cmF0aW9uKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvLyBsZXQgbWVzc2FnZUZhY3RvcnkgPSBfdGhpcy5tZXNzYWdlRmFjdG9yeTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAvL0ZMT1ctT1VUOiBkZXBsb3kgbWVzc2FnZSBmb3IgdGhlIGludGVybmFsIFNhbmRib3hSZWdpc3RyeSAtPiBfb25EZXBsb3lcclxuICAgICAgbGV0IGRlcGxveU1lc3NhZ2UgPSB7XHJcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsIGZyb206IFNhbmRib3hSZWdpc3RyeS5FeHRlcm5hbERlcGxveUFkZHJlc3MsIHRvOiBTYW5kYm94UmVnaXN0cnkuSW50ZXJuYWxEZXBsb3lBZGRyZXNzLFxyXG4gICAgICAgIGJvZHk6IHsgdXJsOiBjb21wb25lbnRVUkwsIHNvdXJjZUNvZGU6IGNvbXBvbmVudFNvdXJjZUNvZGUsIGNvbmZpZzogY29uZmlndXJhdGlvbiB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvL3NlbmQgbWVzc2FnZSBpbnRvIHRoZSBzYW5kYm94IGludGVybmFscyBhbmQgd2FpdCBmb3IgcmVwbHlcclxuICAgICAgX3RoaXMucG9zdE1lc3NhZ2UoZGVwbG95TWVzc2FnZSwgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAvL2lzIHRoaXMgcmVzcG9uc2UgY29tcGxhaW50IHdpdGggdGhlIHNwZWM/XHJcbiAgICAgICAgICByZXNvbHZlKCdkZXBsb3llZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QocmVwbHkuYm9keS5kZXNjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdGhlIGluc3RhbmNlIG9mIGEgcHJldmlvdXNseSBkZXBsb3llZCBjb21wb25lbnQuXHJcbiAgICogQHBhcmFtICB7VVJMfSBjb21wb25lbnRVUkwgSHlwZXJ0eSwgUHJvdG9TdHViLCBvciBhbnkgb3RoZXIgY29tcG9uZW50IGFkZHJlc3MuXHJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSByZXR1cm4gdW5kZXBsb3llZCBpZiBzdWNjZXNzZnVsLCBvciBhbnkgb3RoZXIgc3RyaW5nIHdpdGggYW4gZXJyb3JcclxuICAgKi9cclxuICByZW1vdmVDb21wb25lbnQoY29tcG9uZW50VVJMKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIC8vRkxPVy1PVVQ6IHVuLWRlcGxveSBtZXNzYWdlIGZvciB0aGUgaW50ZXJuYWwgU2FuZGJveFJlZ2lzdHJ5IC0+IF9vblJlbW92ZVxyXG4gICAgICBsZXQgcmVtb3ZlTWVzc2FnZSA9IHtcclxuICAgICAgICB0eXBlOiAnZGVsZXRlJywgZnJvbTogU2FuZGJveFJlZ2lzdHJ5LkV4dGVybmFsRGVwbG95QWRkcmVzcywgdG86IFNhbmRib3hSZWdpc3RyeS5JbnRlcm5hbERlcGxveUFkZHJlc3MsXHJcbiAgICAgICAgYm9keTogeyB1cmw6IGNvbXBvbmVudFVSTCB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvL3NlbmQgbWVzc2FnZSBpbnRvIHRoZSBzYW5kYm94IGludGVybmFscyBhbmQgd2FpdCBmb3IgcmVwbHlcclxuICAgICAgX3RoaXMucG9zdE1lc3NhZ2UocmVtb3ZlTWVzc2FnZSwgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAvL2lzIHRoaXMgcmVzcG9uc2UgY29tcGxhaW50IHdpdGggdGhlIHNwZWM/XHJcbiAgICAgICAgICByZXNvbHZlKCd1bmRlcGxveWVkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmRlc2MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWF0Y2hlcyBTYW5kYm94IGNhcGFiaWxpdGllcyBhZ2FpbnN0IHByb3ZpZGVkIGNhcGFiaWxpdGllcy4gVXNlZCB0byBjaGVjayBpZiBzYW5kYm94IHByb3ZpZGVzIGFsbCByZXF1aXJlZCBjYXBhYmlsaXRpZXNcclxuICAqIEBwYXJhbSAge1J1bnRpbWVDYXBhYmlsaXRpZXN9IGNvbnN0cmFpbnRzIHNldCBvZiBSdW50aW1lQ2FwYWJpbGl0aWVzIHRvIG1hdGNoIHdpdGguXHJcbiAgKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm4gdHJ1ZSBpZiBjb25zdHJhaW50cyBhcmUgbWF0Y2hlZCBmYWxzZSBvdGhlcndpc2VcclxuICAgKi9cclxuXHJcbiAgbWF0Y2hlcyhjb25zdHJhaW50cykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgZmlsdGVyZWQgPSBPYmplY3Qua2V5cyhjb25zdHJhaW50cykuZmlsdGVyKChrZXkpID0+IHtcclxuICAgICAgcmV0dXJuICEoX3RoaXMuY2FwYWJpbGl0aWVzW2tleV0gJiYgX3RoaXMuY2FwYWJpbGl0aWVzW2tleV0gPT09IGNvbnN0cmFpbnRzW2tleV0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkgICAgICB7IHJldHVybiB0cnVlOyB9ICAgIGVsc2UgICAgICB7IHJldHVybiAhKGNvbnN0cmFpbnRzW2ZpbHRlcmVkXSk7IH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTYW5kYm94O1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vLyBMb2cgc3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdhZGRyZXNzLWFsbG9jYXRpb24nKTtcclxuXHJcblxyXG5pbXBvcnQge2lzVVJMLCBnZW5lcmF0ZUdVSUR9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbi8vIFRPRE86IHRoaXMgY291bGQgbm90IGJlIHRoZSBiZXN0IHdheSB0byBkbyBhIFNpbmdsZXRvbiBidXQgYXQgdGhpcyBtb21lbnQgaXQgd29ya3M7XHJcblxyXG5sZXQgaW5zdGFuY2U7XHJcblxyXG4vKipcclxuICogQ2xhc3Mgd2lsbCBhc2sgdG8gdGhlIG1lc3NhZ2Ugbm9kZSBmb3IgYWRkcmVzc2VzXHJcbiAqL1xyXG5jbGFzcyBBZGRyZXNzQWxsb2NhdGlvbiB7XHJcbiAgLyogcHJpdmF0ZVxyXG4gIF91cmw6IFVSTFxyXG4gIF9idXM6IE1pbmlCdXNcclxuICAqL1xyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYW4gQWRkcmVzcyBBbGxvY2F0aW9uXHJcbiAgICogQHBhcmFtICB7VVJMLlVSTH0gICAgICB1cmwgLSB1cmwgZnJvbSB3aG8gaXMgc2VuZGluZyB0aGUgbWVzc2FnZVxyXG4gICAqIEBwYXJhbSAge01pbmlCdXN9ICAgICAgYnVzIC0gTWluaUJ1cyB1c2VkIGZvciBhZGRyZXNzIGFsbG9jYXRpb25cclxuICAgKi9cclxuICBjb25zdHJ1Y3Rvcih1cmwsIGJ1cywgcmVnaXN0cnksIHN1YnNjcmlwdGlvbk1hbmFnZXIpIHtcclxuXHJcbiAgICBpZiAoIWluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuX3VybCA9IHVybCArICcvYWRkcmVzcy1hbGxvY2F0aW9uJztcclxuICAgICAgdGhpcy5fYnVzID0gYnVzO1xyXG4gICAgICB0aGlzLl9yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xyXG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25NYW5hZ2VyID0gc3Vic2NyaXB0aW9uTWFuYWdlcjtcclxuICAgICAgaW5zdGFuY2UgPSB0aGlzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGdldCBpbnN0YW5jZSgpIHtcclxuICAgIGlmICghaW5zdGFuY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgYWRkcmVzcyBhbGxvY2F0aW9uIHdhcyBub3QgaW5zdGFudGlhdGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGluc3RhbmNlXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBnZXQgdGhlIFVSTCB2YWx1ZVxyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHVybCB2YWx1ZTtcclxuICAgKi9cclxuICBnZXQgdXJsKCkgeyByZXR1cm4gdGhpcy5fdXJsOyB9XHJcblxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEFzayBmb3IgY3JlYXRpb24gb2YgYSBudW1iZXIgb2YgSHlwZXJ0eSBhZGRyZXNzZXMsIHRvIHRoZSBkb21haW4gbWVzc2FnZSBub2RlLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtEb21haW59IGRvbWFpbiAtIGRvbWFpbiBvZiB0aGUgbWVzc2FnZSBub2RlXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IG51bWJlciAtIG51bWJlciBvZiBhZGRyZXNzIHRvIGJlIGFsbG9jYXRlZFxyXG4gICAqIEBwYXJhbSB7RGVzY3JpcHRvcn0gaW5mbyAtIGRlc2NyaXB0b3IgdG8gc2VhcmNoIGZvciB0aGUgaHlwZXJ0eSAoVE9ETzovLyB0aGlzIHNob3VsZCBiZSBjb25maXJtZWQpXHJcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L3NwZWNzL2Jsb2IvbWFzdGVyL2RhdGFtb2RlbC9jb3JlL2h5cGVydHktY2F0YWxvZ3VlL3JlYWRtZS5tZCNjYXRhbG9ndWUtZGF0YS1tb2RlbFxyXG4gICAqIEBwYXJhbSB7c2NoZW1lfSBzY2hlbWUgLSBzY2hlbWUgb2YgYWRkcmVzcyB0byBiZSBjcmVhdGVkIG9yIHJldXNlZCwgbGlrZTogaHlwZXJ0eSwgY29tbSwgY29udGV4dCwgZXRjO1xyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbnxVUkwuSHlwZXJ0eVVSTH0gcmV1c2VVUkwgLSByZXVzZVVSTCBpcyB1c2VkIHRvIHJldXNlIHRoZSBoeXBlcnR5VVJMIHByZXZpb3VzbHkgcmVnaXN0cmVkO1xyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdCwgRXJyb3I+fSB0aGlzIGlzIFByb21pc2UgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIGFkZHJlc3MgaW5mb3JtYXRpb25cclxuICAgKlxyXG4gICAqIEBtZW1iZXJPZiBBZGRyZXNzQWxsb2NhdGlvblxyXG4gICAqL1xyXG4gIGNyZWF0ZShkb21haW4sIG51bWJlciwgaW5mbywgc2NoZW1lLCByZXVzZVVSTCkge1xyXG5cclxuICAgIGxvZy5sb2coJ1tBZGRyZXNzQWxsb2NhdGlvbi5jcmVhdGVdIGluZm8gJywgaW5mbyk7XHJcbiAgICAvL2RlYnVnZ2VyO1xyXG4gICAgaWYgKHJldXNlVVJMKSB7XHJcblxyXG4gICAgICBpZiAodHlwZW9mKHJldXNlVVJMKSA9PT0gJ2Jvb2xlYW4nKSB7XHJcblxyXG4gICAgICAgIGlmIChyZXVzZVVSTCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3JldXNlQWxsb2NhdGVkQWRkcmVzcyhkb21haW4sIG51bWJlciwgaW5mbywgc2NoZW1lLCByZXVzZVVSTCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9hbGxvY2F0ZU5ld0FkZHJlc3MoZG9tYWluLCBzY2hlbWUsIG51bWJlciwgaW5mbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHR5cGVvZihyZXVzZVVSTCkgPT09ICdzdHJpbmcnICYmIGlzVVJMKHJldXNlVVJMKSkge1xyXG4gICAgICAgIC8vcmV0dXJuIHRoaXMuX3JldXNlQWxsb2NhdGVkQWRkcmVzcyhkb21haW4sIG51bWJlciwgaW5mbywgc2NoZW1lLCByZXVzZVVSTCk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IHsgbmV3QWRkcmVzczogZmFsc2UsIGFkZHJlc3M6IFtyZXVzZVVSTF0gfTtcclxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxvZy5sb2coJ1tBZGRyZXNzQWxsb2NhdGlvbl0gLSBuZXcgYWRkcmVzcyB3aWxsIGJlIGFsbG9jYXRlZCcpO1xyXG5cclxuICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gVVJMIHNhdmVkIHJlcXVlc3QgYSBuZXcgVVJMXHJcbiAgICAgIHJldHVybiB0aGlzLl9hbGxvY2F0ZU5ld0FkZHJlc3MoZG9tYWluLCBzY2hlbWUsIG51bWJlciwgaW5mbyk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgX3JldXNlQWxsb2NhdGVkQWRkcmVzcyhkb21haW4sIG51bWJlciwgaW5mbywgc2NoZW1lLCByZXVzZVVSTCkge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBjb25zb2xlLmxvZygnUkVVU0VURVNUIC0gIF9yZXVzZUFsbG9jYXRlZEFkZHJlc3MnLCBkb21haW4sIG51bWJlciwgaW5mbywgc2NoZW1lLCByZXVzZVVSTCk7XHJcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5LmNoZWNrUmVnaXN0ZXJlZFVSTHMoaW5mbywgcmV1c2VVUkwpLnRoZW4oKHVybHMpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnUkVVU0VURVNUIC0gIHJlZ2lzdGVyZWR1cmxzJywgdXJscyk7XHJcbiAgICAgICAgaWYgKHVybHMpIHtcclxuICAgICAgICAgIGxvZy5pbmZvKCdbQWRkcmVzc0FsbG9jYXRpb24gLSAnICsgc2NoZW1lICsgJ10gLSBSZXVzZSBVUkwnKTtcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IHtuZXdBZGRyZXNzOiBmYWxzZSwgYWRkcmVzczogdXJsc307XHJcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgIGlmICh0eXBlb2YocmV1c2VVUkwpID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBsb2cuaW5mbygnW0FkZHJlc3NBbGxvY2F0aW9uIC0gcmV1c2VVUkxdIC0gT2JqZWN0ICcgKyByZXVzZVVSTCArICcgbm90IGZvdW5kJyk7XHJcbiAgICAgICAgICAgIHJlamVjdCgnVVJMIE5vdCBGb3VuZCcpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YocmV1c2VVUkwpID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgdGhpcy5fYWxsb2NhdGVOZXdBZGRyZXNzKGRvbWFpbiwgc2NoZW1lLCBudW1iZXIsIGluZm8pLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlamVjdCgnVVJMIE5vdCBGb3VuZCcpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9hbGxvY2F0ZU5ld0FkZHJlc3MoZG9tYWluLCBzY2hlbWUsIG51bWJlciwgaW5mbykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgbGV0IGFkZHJlc3NlcyA9IFtdO1xyXG4gICAgICB2YXIgaTtcclxuXHJcbiAgICAgIGZvciAoaT0wOyBpPCBudW1iZXI7IGkrKykge1xyXG4gICAgICAgIGFkZHJlc3Nlcy5wdXNoKHNjaGVtZSsnOi8vJyArIGRvbWFpbiArICcvJyArIGdlbmVyYXRlR1VJRCgpKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgcmVzdWx0ID0ge25ld0FkZHJlc3M6IHRydWUsIGFkZHJlc3M6IGFkZHJlc3Nlc307XHJcblxyXG4gICAgICBpZiAoc2NoZW1lID09PSAnaHlwZXJ0eScgKSB7XHJcbiAgICAgICAgaWYgKGluZm8uaGFzT3duUHJvcGVydHkoJ2NvbmZpZ3VyYXRpb24nKSAmJiBpbmZvLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoJ2RvbWFpbl9yb3V0aW5nJykgJiYgIWluZm8uY29uZmlndXJhdGlvbi5kb21haW5fcm91dGluZykgXHJcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uTWFuYWdlci5jcmVhdGVTdWJzY3JpcHRpb24oZG9tYWluLGFkZHJlc3NlcywgX3RoaXMuX3VybCkudGhlbigoKT0+e1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xyXG5cclxuXHJcbi8qICAgICAgbGV0IG1zZyA9IHtcclxuICAgICAgICB0eXBlOiAnY3JlYXRlJywgZnJvbTogdGhpcy5fdXJsLCB0bzogJ2RvbWFpbjovL21zZy1ub2RlLicgKyBkb21haW4gKyAnL2FkZHJlc3MtYWxsb2NhdGlvbicsXHJcbiAgICAgICAgYm9keToge3ZhbHVlOiB7IG51bWJlcjogbnVtYmVyIH0gfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKHNjaGVtZSAhPT0gJ2h5cGVydHknKSBtc2cuYm9keS5zY2hlbWUgPSBzY2hlbWU7XHJcblxyXG4gICAgICBsb2cuaW5mbygnW0FkZHJlc3NBbGxvY2F0aW9uIC0gJyArIHNjaGVtZSArICddIC0gUmVxdWVzdCBuZXcgVVJMJyk7XHJcblxyXG4gICAgICB0aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSB7bmV3QWRkcmVzczogdHJ1ZSwgYWRkcmVzczogcmVwbHkuYm9keS52YWx1ZS5hbGxvY2F0ZWR9O1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QocmVwbHkuYm9keS5kZXNjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pOyovXHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBkb21haW4gbWVzc2FnZSBub2RlLCB0byBkZWFsbG9jYXRlIG9uZSBvciBtb3JlIGFkZHJlc3Nlc1xyXG4gICogQHBhcmFtICB7RG9tYWlufSBkb21haW4gLSBEb21haW4gb2YgdGhlIG1lc3NhZ2Ugbm9kZS5cclxuICAqIEBwYXJhbSAge2FkZHJlc3Nlc30gYWRkcmVzc2VzIHRvIHJlcXVlc3QgdGhlIGRlYWxsb2NhdGlvblxyXG4gICogQHJldHVybnMge1Byb21pc2V9ICB0aGUgcmVzcG9uc2UgYnkgdGhlIG1lc3NhZ2Ugbm9kZVxyXG4gICovXHJcbiAgZGVsZXRlKGRvbWFpbiwgYWRkcmVzc2VzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICByZXNvbHZlKDIwMCk7XHJcblxyXG4vKiAgICAgIGxldCBtZXNzYWdlID0ge1xyXG4gICAgICAgIHR5cGU6ICdkZWxldGUnLCBmcm9tOiBfdGhpcy5fdXJsLCB0bzogJ2RvbWFpbjovL21zZy1ub2RlLicgKyBkb21haW4gKyAnL2FkZHJlc3MtYWxsb2NhdGlvbicsXHJcbiAgICAgICAgYm9keToge2NoaWxkcmVuUmVzb3VyY2VzOiBhZGRyZXNzZXN9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LmNvZGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QocmVwbHkuYm9keS5kZXNjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pOyovXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBZGRyZXNzQWxsb2NhdGlvbjtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG4vKipcclxuKiAgIEBhdXRob3I6IEdpbCBEaWFzIChnaWwuZGlhc0B0ZWNuaWNvLnVsaXNib2EucHQpXHJcbiogICBSZWdpc3RyeSBEYXRhIE1vZGVsIGluY2x1ZGVzIGFsbCBPYmplY3RzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIFJlZ2lzdHJ5IGZ1bmN0aW9uYWxpdHkgaW5jbHVkaW5nXHJcbiovXHJcbmNsYXNzIFJlZ2lzdHJ5RGF0YU1vZGVsIHtcclxuXHJcbiAgY29uc3RydWN0b3IoaWQsIHVybCwgZGVzY3JpcHRvclVSTCwgcDJwUmVxdWVzdGVyLCBzdGFydGluZ1RpbWUsIGxhc3RNb2RpZmllZCwgc3RhdHVzLCBzdHVicywgc3R1YnNDb25maWd1cmF0aW9uKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9pZCA9IGlkO1xyXG4gICAgX3RoaXMuX3VybCA9IHVybDtcclxuICAgIF90aGlzLl9kZXNjcmlwdG9yVVJMID0gZGVzY3JpcHRvclVSTDtcclxuICAgIF90aGlzLl9zdGFydGluZ1RpbWUgPSBzdGFydGluZ1RpbWU7XHJcbiAgICBfdGhpcy5fbGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkO1xyXG4gICAgX3RoaXMuX3N0YXR1cyA9IHN0YXR1cztcclxuICAgIF90aGlzLl9zdHVicyA9IHN0dWJzO1xyXG4gICAgX3RoaXMuX3N0dWJzQ29uZmlndXJhdGlvbiA9IHN0dWJzQ29uZmlndXJhdGlvbjtcclxuICAgIF90aGlzLl9wMnBSZXF1ZXN0ZXIgPSBwMnBSZXF1ZXN0ZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgaWQoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIGdldCB1cmwoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl91cmw7XHJcbiAgfVxyXG5cclxuICBnZXQgZGVzY3JpcHRvclVSTCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2Rlc2NyaXB0b3JVUkw7XHJcbiAgfVxyXG5cclxuICBnZXQgcDJwUmVxdWVzdGVyKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fcDJwUmVxdWVzdGVyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGxhc3RNb2RpZmllZCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2xhc3RNb2RpZmllZDtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeURhdGFNb2RlbDtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5pbXBvcnQgUmVnaXN0cnlEYXRhTW9kZWwgZnJvbSAnLi9SZWdpc3RyeURhdGFNb2RlbCc7XHJcblxyXG4vKipcclxuKiAgIEBhdXRob3I6IEdpbCBEaWFzIChnaWwuZGlhc0B0ZWNuaWNvLnVsaXNib2EucHQpXHJcbiogICBIeXBlcnR5SW5zdGFuY2UgRGF0YSBNb2RlbCB1c2VkIHRvIG1vZGVsIGluc3RhbmNlcyBvZiBIeXBlcnRpZXMgcnVubmluZyBpbiBkZXZpY2VzIGFuZCBzZXJ2ZXJzLlxyXG4qL1xyXG5jbGFzcyBIeXBlcnR5SW5zdGFuY2UgZXh0ZW5kcyBSZWdpc3RyeURhdGFNb2RlbCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGlkLCB1cmwsIGRlc2NyaXB0b3JVUkwsIGRlc2NyaXB0b3IsIGh5cGVydHlVUkwsIHVzZXIsIGd1aWQsIHJ1bnRpbWUsIGNvbnRleHQsIHAycEhhbmRsZXIsIHAycFJlcXVlc3RlciwgZGF0YVNjaGVtZXMsIHJlc291cmNlcywgc3RhcnRpbmdUaW1lLCBsYXN0TW9kaWZpZWQpIHtcclxuICAgIHN1cGVyKGlkLCB1cmwsIGRlc2NyaXB0b3JVUkwsIHAycFJlcXVlc3Rlciwgc3RhcnRpbmdUaW1lLCBsYXN0TW9kaWZpZWQpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjtcclxuICAgIF90aGlzLl9oeXBlcnR5VVJMID0gaHlwZXJ0eVVSTDtcclxuICAgIF90aGlzLl91c2VyID0gdXNlcjtcclxuICAgIF90aGlzLl9ndWlkID0gZ3VpZDtcclxuICAgIF90aGlzLl9ydW50aW1lID0gcnVudGltZTtcclxuICAgIF90aGlzLl9jb250ZXh0ID0gY29udGV4dDtcclxuICAgIF90aGlzLl9wMnBIYW5kbGVyID0gcDJwSGFuZGxlcjtcclxuICAgIF90aGlzLl9kYXRhU2NoZW1lcyA9IGRhdGFTY2hlbWVzO1xyXG4gICAgX3RoaXMuX3Jlc291cmNlcyA9IHJlc291cmNlcztcclxuICB9XHJcblxyXG4gIHNldCB1c2VyKGlkZW50aXR5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMudXNlciA9IGlkZW50aXR5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHVzZXIoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl91c2VyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGh5cGVydHlVUkwoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9oeXBlcnR5VVJMO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRlc2NyaXB0b3IoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9kZXNjcmlwdG9yO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9iamVjdE5hbWUoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9kZXNjcmlwdG9yLl9vYmplY3ROYW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHAycEhhbmRsZXIoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9wMnBIYW5kbGVyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFTY2hlbWVzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fZGF0YVNjaGVtZXM7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVzb3VyY2VzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fcmVzb3VyY2VzO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJ1bnRpbWVVUkwoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9ydW50aW1lO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSHlwZXJ0eUluc3RhbmNlO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdSZWdpc3RyeScpO1xyXG5cclxuaW1wb3J0IHsgcnVudGltZVV0aWxzICB9IGZyb20gJy4uL3J1bnRpbWUvcnVudGltZVV0aWxzJztcclxuXHJcbmltcG9ydCBIeXBlcnR5SW5zdGFuY2UgZnJvbSAnLi9IeXBlcnR5SW5zdGFuY2UnO1xyXG5cclxuXHJcbi8qKlxyXG4qIFJ1bnRpbWUgRG9tYWluUmVnaXN0cmF0aW9uIEludGVyZmFjZVxyXG4qL1xyXG5jbGFzcyBEb21haW5SZWdpc3RyYXRpb24ge1xyXG5cclxuICAvKipcclxuICAqIFRvIGluaXRpYWxpc2UgdGhlIFJ1bnRpbWUgUmVnaXN0cnkgd2l0aCB0aGUgUnVudGltZVVSTCB0aGF0IHdpbGwgYmUgdGhlIGJhc2lzIHRvIGRlcml2ZSB0aGUgaW50ZXJuYWwgcnVudGltZSBhZGRyZXNzZXMgd2hlbiBhbGxvY2F0aW5nIGFkZHJlc3NlcyB0byBpbnRlcm5hbCBydW50aW1lIGNvbXBvbmVudC4gSW4gYWRkaXRpb24sIHRoZSBSZWdpc3RyeSBkb21haW4gYmFjay1lbmQgdG8gYmUgdXNlZCB0byByZW1vdGVseSByZWdpc3RlciBSdW50aW1lIGNvbXBvbmVudHMsIGlzIGFsc28gcGFzc2VkIGFzIGlucHV0IHBhcmFtZXRlci5cclxuICAqIEBwYXJhbSAge01lc3NhZ2VCdXN9ICAgICAgICAgIG1lc3NhZ2VCdXMgICAgICAgICAgICAgICAgbXNnYnVzXHJcbiAgKiBAcGFyYW0gIHtIeXBlcnR5UnVudGltZVVSTH0gICBydW50aW1lVVJMICAgICAgICAgICAgcnVudGltZVVSTFxyXG4gICogQHBhcmFtICB7RG9tYWluVVJMfSAgICAgICAgICAgZG9tYWluICAgICAgICByZW1vdGVSZWdpc3RyeVxyXG4gICovXHJcbiAgY29uc3RydWN0b3IocnVudGltZVVSTCwgcmVnaXN0cnlVUkwsIGRvbWFpbiwgbWVzc2FnZUJ1cykge1xyXG5cclxuICAgIGlmICghcnVudGltZVVSTCkgdGhyb3cgbmV3IEVycm9yKCdydW50aW1lVVJMIGlzIG1pc3NpbmcuJyk7XHJcbiAgICBpZiAoIXJlZ2lzdHJ5VVJMKSB0aHJvdyBuZXcgRXJyb3IoJ3JlZ2lzdHJ5VVJMIGlzIG1pc3NpbmcuJyk7XHJcbiAgICBpZiAoIWRvbWFpbikgdGhyb3cgbmV3IEVycm9yKCdkb21haW4gaXMgbWlzc2luZy4nKTtcclxuICAgIGlmICghbWVzc2FnZUJ1cykgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlQnVzIGlzIG1pc3NpbmcuJyk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5yZWdpc3RyeVVSTCA9IHJlZ2lzdHJ5VVJMO1xyXG4gICAgX3RoaXMucnVudGltZVVSTCA9IHJ1bnRpbWVVUkw7XHJcbiAgICBfdGhpcy5fcmVnaXN0cmF0aW9uUmV0cmllcyA9IDU7Ly8gbnVtYmVyIG9mIGF0dGVtcHRzIHRvIHJlZ2lzdGVyIEh5cGVydGllcyBhbmQgRGF0YU9iamVjdHMgd2hlbiBlcnJvcnMgb2NjdXJzXHJcblxyXG4gICAgLy8gdGhlIGV4cGlyZXMgaW4gMzYwMCwgcmVwcmVzZW50cyAxIGhvdXJcclxuICAgIC8vdGhlIGV4cGlyZXMgaXMgaW4gc2Vjb25kcywgdW5pdCBvZiBtZWFzdXJlIHJlY2VpdmVkIGJ5IHRoZSBkb21haW4gcmVnaXN0cnlcclxuICAgIF90aGlzLmV4cGlyZXNUaW1lID0gMzYwMDtcclxuXHJcbiAgICBfdGhpcy5fZG9tYWluID0gZG9tYWluO1xyXG4gICAgX3RoaXMuX21lc3NhZ2VCdXMgPSBtZXNzYWdlQnVzO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICogIGZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIgYW4gaHlwZXJ0eUluc3RhbmNlIGluIHRoZSBEb21haW4gUmVnaXN0cnlcclxuICAqICBAcGFyYW0gICB7U3RyaW5nfSAgICAgIGh5cGVydHlJbnN0YW5jZSAgIEh5cGVydHlJbnNudGFuY2UgdXJsXHJcbiAgKlxyXG4gICovXHJcbiAgdW5yZWdpc3Rlckh5cGVydHkoaHlwZXJ0eUluc3RhbmNlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgbGV0IG1lc3NhZ2UgPSB7IHR5cGU6ICd1cGRhdGUnLCBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCxcclxuICAgICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fZG9tYWluLFxyXG4gICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6ICcvaHlwZXJ0eS8nICsgaHlwZXJ0eUluc3RhbmNlLCB2YWx1ZTogJ2Rpc2Nvbm5lY3RlZCcsIGF0dHJpYnV0ZTogJ3N0YXR1cycgfX07XHJcblxyXG4gICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdbRG9tYWluUmVnaXN0cmF0aW9uXSB1bnJlZ2lzdGVyIGh5cGVydHkgUmVwbHknLCByZXBseSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqICBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIGEgRGF0YSBPYmplY3QgaW4gdGhlIERvbWFpbiBSZWdpc3RyeVxyXG4gICogIEBwYXJhbSAgIHtTdHJpbmd9ICAgICAgaHlwZXJ0eUluc3RhbmNlICAgSHlwZXJ0eUluc250YW5jZSB1cmxcclxuICAqXHJcbiAgKi9cclxuICB1bnJlZ2lzdGVyRGF0YU9iamVjdCh1cmwpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IG1lc3NhZ2UgPSB7IHR5cGU6ICd1cGRhdGUnLCBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCxcclxuICAgICAgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgX3RoaXMuX2RvbWFpbixcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlOiB1cmwsXHJcbiAgICAgICAgdmFsdWU6IHtcclxuICAgICAgICAgIHN0YXR1czogJ2Rpc2Nvbm5lY3RlZCdcclxuICAgICAgICB9XHJcbiAgICAgIH19O1xyXG5cclxuICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xyXG4gICAgICBsb2cubG9nKCdbRG9tYWluUmVnaXN0cmF0aW9uXSB1bnJlZ2lzdGVyIGRhdGFPYmplY3QgUmVwbHknLCByZXBseSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogIGZ1bmN0aW9uIHRvIGRlbGV0ZSBhbiBkYXRhT2JqZWN0SW5zdGFuY2UgaW4gdGhlIERvbWFpbiBSZWdpc3RyeVxyXG4gICogIEBwYXJhbSAgIHtTdHJpbmd9ICAgIG5hbWUgICAgICBEYXRhT2JqZWN0TmFtZVxyXG4gICovXHJcbiAgZGVsZXRlRGF0YU9iamVjdEluc3RhbmNlKG5hbWUpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IG1lc3NhZ2UgPSB7IHR5cGU6ICdkZWxldGUnLCBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCxcclxuICAgICAgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgX3RoaXMuX2RvbWFpbixcclxuICAgICAgYm9keTogeyB2YWx1ZToge25hbWU6IG5hbWV9fX07XHJcblxyXG4gICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcGx5KSA9PiB7XHJcbiAgICAgIGxvZy5sb2coJ1tEb21haW5SZWdpc3RyYXRpb25dIHVucmVnaXN0ZXIgZGF0YU9iamVjdCBSZXBseScsIHJlcGx5KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBGdW5jdGlvbiB0byB1cGRhdGUgYW4gSHlwZXJ0eVxyXG4gICovXHJcbiAgdXBkYXRlSHlwZXJ0eUluc3RhbmNlKHJlc291cmNlLCB2YWx1ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgbWVzc2FnZSA9IHsgdHlwZTogJ1VQREFURScsIGZyb206IF90aGlzLnJlZ2lzdHJ5VVJMLFxyXG4gICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fZG9tYWluLFxyXG4gICAgICBib2R5OiB7IHJlc291cmNlOiByZXNvdXJjZSwgdmFsdWU6IHZhbHVlfX07XHJcblxyXG4gICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdC5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVwbHkpID0+IHtcclxuICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5XSBVcGRhdGVkIGh5cGVydHkgcmVwbHknLCByZXBseSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAqIFRvIHJlZ2lzdGVyIGEgbmV3IERhdGEgT2JqZWN0IGluIHRoZSBEb21haW4gUmVnaXN0cnkuXHJcbiAgKiBAcGFyYW0gIHtKU09OfSAgICAgcmVnaXN0cmF0aW9uICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbiBkYXRhIHRvIGJlIHVzZWRcclxuICAqIEBwYXJhbSAge2Jvb2xlYW59ICAgICByZXN1bWUgICAgICAgICAgICAgICAgICAgICBpZiB0aGlzIGlzIGp1c3QgdG8gdXBkYXRlIHRoZSByZWdpc3RyYXRpb24gd2l0aCB0aGUgcmVzdW1lIG9mIGEgZGF0YSBvYmplY3RcclxuICAqL1xyXG5cclxuICByZWdpc3RlckRhdGFPYmplY3QocmVnaXN0cmF0aW9uLCByZXN1bWUsIHAycEhhbmRsZXJTdHViKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgcDJwSGFuZGxlcjtcclxuICAgIGxldCBwMnBSZXF1ZXN0ZXI7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IGRhdGFTY2hlbWUgPSBbXTtcclxuICAgICAgbGV0IGZpbHRlcmVkRGF0YVNjaGVtZSA9IHJlZ2lzdHJhdGlvbi51cmwuc3BsaXQoJzonKTtcclxuICAgICAgZGF0YVNjaGVtZS5wdXNoKGZpbHRlcmVkRGF0YVNjaGVtZVswXSk7XHJcblxyXG4gICAgICBpZiAoT2JqZWN0LmtleXMocDJwSGFuZGxlclN0dWIpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICBwMnBIYW5kbGVyID0gcDJwSGFuZGxlclN0dWJbX3RoaXMucnVudGltZVVSTF0udXJsO1xyXG4gICAgICBwMnBSZXF1ZXN0ZXIgPSBydW50aW1lVXRpbHMucnVudGltZURlc2NyaXB0b3IucDJwUmVxdWVzdGVyU3R1YjtcclxuICAgIH1cclxuXHJcbiAgICByZWdpc3RyYXRpb24uc3RhcnRpbmdUaW1lID0gcmVnaXN0cmF0aW9uLmNyZWF0ZWQ7XHJcblxyXG4gICAgZGVsZXRlIHJlZ2lzdHJhdGlvbi5hdXRob3Jpc2U7XHJcbiAgICBkZWxldGUgcmVnaXN0cmF0aW9uLmNyZWF0ZWQ7XHJcbiAgICBkZWxldGUgcmVnaXN0cmF0aW9uLm11dHVhbDtcclxuICAgIGRlbGV0ZSByZWdpc3RyYXRpb24ucmVzdW1lO1xyXG5cclxuICAgIGlmICghcmVnaXN0cmF0aW9uLmV4cGlyZXMpIHJlZ2lzdHJhdGlvbi5leHBpcmVzID0gX3RoaXMuZXhwaXJlc1RpbWU7XHJcblxyXG4gICAgcmVnaXN0cmF0aW9uLmRhdGFTY2hlbWVzID0gZGF0YVNjaGVtZTtcclxuXHJcbiAgICBpZiAocDJwSGFuZGxlcikge1xyXG4gICAgICByZWdpc3RyYXRpb24ucDJwSGFuZGxlciA9IHAycEhhbmRsZXI7XHJcbiAgICAgIHJlZ2lzdHJhdGlvbi5wMnBSZXF1ZXN0ZXIgPSBwMnBSZXF1ZXN0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0cmF0aW9uLnN0YXR1cyA9ICdsaXZlJztcclxuXHJcbiAgICBsZXQgbWVzc2FnZTtcclxuXHJcbiAgICBpZiAoIXJlc3VtZSkge1xyXG5cclxuICAgICAgbG9nLmxvZygnW1JlZ2lzdHJ5LnJlZ2lzdGVyRGF0YU9iamVjdF0gcmVnaXN0ZXJpbmcgbmV3IGRhdGEgb2JqZWN0IFVSTCcsIHJlZ2lzdHJhdGlvbik7XHJcblxyXG4gICAgICBtZXNzYWdlID0geyB0eXBlOiAnY3JlYXRlJywgZnJvbTogX3RoaXMucmVnaXN0cnlVUkwsIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIF90aGlzLl9kb21haW4sIGJvZHk6IHsgdmFsdWU6IHJlZ2lzdHJhdGlvbiwgcG9saWN5OiAncG9saWN5JyB9IH07XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGxvZy5sb2coJ1tSZWdpc3RyeS5yZWdpc3RlckRhdGFPYmplY3RdIHJlZ2lzdGVyaW5nIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBkYXRhIG9iamVjdCBVUkwnLCByZWdpc3RyYXRpb24pO1xyXG5cclxuICAgICAgbWVzc2FnZSA9IHtcclxuICAgICAgICB0eXBlOiAndXBkYXRlJyxcclxuICAgICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fZG9tYWluLFxyXG4gICAgICAgIGZyb206IF90aGlzLnJlZ2lzdHJ5VVJMLFxyXG4gICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IHJlZ2lzdHJhdGlvbi51cmwsIHZhbHVlOiB7IHN0YXR1czogJ2xpdmUnIH0gfVxyXG4gICAgICB9O1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZVdpdGhSZXRyaWVzKG1lc3NhZ2UsIF90aGlzLl9yZWdpc3RyYXRpb25SZXRyaWVzLCAocmVwbHkpID0+IHtcclxuICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkucmVnaXN0ZXJEYXRhT2JqZWN0XSA9PT0+IHJlZ2lzdGVyRGF0YU9iamVjdCBSZXBseTogJywgcmVwbHkpO1xyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgcmVzb2x2ZShyZWdpc3RyYXRpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QoJ2Vycm9yIG9uIHJlZ2lzdGVyIERhdGFPYmplY3QnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBsb2cuZXJyb3IoZSk7XHJcbiAgICAgIHJlamVjdChlKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy90aW1lciB0byBrZWVwIHRoZSByZWdpc3RyYXRpb24gYWxpdmVcclxuICAgIC8vIHRoZSB0aW1lIGlzIGRlZmluZWQgYnkgYSBsaXR0bGUgbGVzcyB0aGFuIGhhbGYgb2YgdGhlIGV4cGlyZXMgdGltZSBkZWZpbmVkXHJcbiAgICBsZXQga2VlcEFsaXZlVGltZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICBsZXQgbWVzc2FnZSA9IHtcclxuICAgICAgICB0eXBlOiAndXBkYXRlJyxcclxuICAgICAgICBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCxcclxuICAgICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fZG9tYWluLFxyXG4gICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IHJlZ2lzdHJhdGlvbi51cmwsIHZhbHVlOiB7IHN0YXR1czogJ2xpdmUnIH0sIG1ldGhvZDogJ3JlZnJlc2gnIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xyXG4gICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeS5yZWdpc3RlckRhdGFPYmplY3RdIEtlZXBBbGl2ZSBSZXBseTogJywgcmVwbHkpO1xyXG4gICAgICB9KTtcclxuICAgIH0sICgoKHJlZ2lzdHJhdGlvbi5leHBpcmVzIC8gMS4xKSAvIDIpICogMTAwMCkpO1xyXG5cclxuICB9KTtcclxuXHJcblxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgKiBUbyByZWdpc3RlciBhIG5ldyBIeXBlcnR5IGluIHRoZSBEb21haW4gUmVnaXN0cnkuXHJcbiAgKiBAcGFyYW0gIHtIeXBlcnR5SW5zdGFuY2V9ICAgICBoeXBlcnR5ICAgICAgICAgICAgSHlwZXJ0eSB0byBiZSByZWdpc3RlcmVkXHJcbiAgKiBAcGFyYW0gIHtib29sZWFufSAgICAgcmVzdW1lICAgICAgICAgICAgICAgICAgICAgaWYgdGhpcyBpcyBqdXN0IHRvIHVwZGF0ZSB0aGUgcmVnaXN0cmF0aW9uIHdpdGggdGhlIHJlc3VtZSBvZiBhIGRhdGEgb2JqZWN0XHJcbiAgKi9cclxuXHJcblxyXG4gIHJlZ2lzdGVySHlwZXJ0eShoeXBlcnR5LCByZXN1bWUpe1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgIGxldCBydW50aW1lID0gX3RoaXMucnVudGltZVVSTDtcclxuICAgIGxldCBzdGF0dXMgPSAnbGl2ZSc7XHJcblxyXG4gICAgLy9tZXNzYWdlIHRvIHJlZ2lzdGVyIHRoZSBuZXcgaHlwZXJ0eSwgd2l0aGluIHRoZSBkb21haW4gcmVnaXN0cnlcclxuICAgIGxldCBtZXNzYWdlO1xyXG4gICAgbGV0IHJlZ2lzdHJhdGlvbkV4cGlyZXMgPSBfdGhpcy5leHBpcmVzVGltZTtcclxuXHJcbiAgICBsZXQgbWVzc2FnZVZhbHVlID0ge1xyXG4gICAgICB1c2VyOiBoeXBlcnR5LnVzZXIuZW1haWwsXHJcbiAgICAgIGRlc2NyaXB0b3I6IGh5cGVydHkuZGVzY3JpcHRvclVSTCxcclxuICAgICAgdXJsOiBoeXBlcnR5Lmh5cGVydHlVUkwsXHJcbiAgICAgIGV4cGlyZXM6IHJlZ2lzdHJhdGlvbkV4cGlyZXMsXHJcbiAgICAgIHJlc291cmNlczogaHlwZXJ0eS5yZXNvdXJjZXMsXHJcbiAgICAgIGRhdGFTY2hlbWVzOiBoeXBlcnR5LmRhdGFTY2hlbWVzLFxyXG4gICAgICBydW50aW1lOiBydW50aW1lLFxyXG4gICAgICBzdGF0dXM6IHN0YXR1c1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBzZXQgYSBkaWZmZXJlbnQgZXhwaXJlcyBpZiBkZWZpbmVkIGluIHRoZSBoeXBlcnR5IGNvbmZpZ3VyYXRpb25cclxuXHJcbiAgICBpZiAoaHlwZXJ0eS5wMnBIYW5kbGVyKSB7XHJcbiAgICAgIG1lc3NhZ2VWYWx1ZS5wMnBIYW5kbGVyID0gaHlwZXJ0eS5wMnBIYW5kbGVyO1xyXG4gICAgICBtZXNzYWdlVmFsdWUucDJwUmVxdWVzdGVyID0gaHlwZXJ0eS5wMnBSZXF1ZXN0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2V0IGEgZGlmZmVyZW50IGV4cGlyZXMgdmFsdWUgaWYgY29uZmlndXJlZCBpbiB0aGUgSHlwZXJ0eSBkZXNjcmlwdG9yXHJcblxyXG4gICAgaWYgKGh5cGVydHkuZGVzY3JpcHRvci5jb25maWd1cmF0aW9uICYmIGh5cGVydHkuZGVzY3JpcHRvci5jb25maWd1cmF0aW9uLmV4cGlyZXMpIHJlZ2lzdHJhdGlvbkV4cGlyZXMgPSBoeXBlcnR5LmRlc2NyaXB0b3IuY29uZmlndXJhdGlvbi5leHBpcmVzO1xyXG5cclxuICAgIGlmICghcmVzdW1lKSB7XHJcbiAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIHJlZ2lzdGVyaW5nIG5ldyBIeXBlcnR5IFVSTCcsIGFkZHJlc3NVUkwuYWRkcmVzc1swXSk7XHJcblxyXG5cclxuICAgICAgLy8gc2V0IGEgZGlmZmVyZW50IGV4cGlyZXMgaWYgZGVmaW5lZCBpbiB0aGUgaHlwZXJ0eSBjb25maWd1cmF0aW9uXHJcblxyXG5cclxuICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IHJlZ2lzdGVySHlwZXJ0eV0gcmVnaXN0ZXJpbmcgbmV3IEh5cGVydHkgYXQgZG9tYWluIHJlZ2lzdHJ5ICcsIG1lc3NhZ2VWYWx1ZSk7XHJcblxyXG4gICAgICBtZXNzYWdlID0ge3R5cGU6ICdjcmVhdGUnLCBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCwgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgX3RoaXMuX2RvbWFpbiwgYm9keToge3ZhbHVlOiBtZXNzYWdlVmFsdWUsIHBvbGljeTogJ3BvbGljeSd9fTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgcmVnaXN0ZXJIeXBlcnR5XSByZWdpc3RlcmluZyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgSHlwZXJ0eSBVUkwnLCBhZGRyZXNzVVJMLmFkZHJlc3NbMF0pO1xyXG5cclxuICAgICAgbWVzc2FnZSA9IHtcclxuICAgICAgICB0eXBlOiAndXBkYXRlJyxcclxuICAgICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fZG9tYWluLFxyXG4gICAgICAgIGZyb206IF90aGlzLnJlZ2lzdHJ5VVJMLFxyXG4gICAgICAgIGJvZHk6IHtyZXNvdXJjZTogaHlwZXJ0eS5oeXBlcnR5VVJMLCB2YWx1ZTogeyBzdGF0dXM6ICdsaXZlJywgdXNlcjogaHlwZXJ0eS51c2VyLmVtYWlsIH19XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoaHlwZXJ0eS5wMnBIYW5kbGVyKSB7XHJcbiAgICAgICAgbWVzc2FnZS5ib2R5LnZhbHVlLnAycEhhbmRsZXIgPSBoeXBlcnR5LnAycEhhbmRsZXI7XHJcbiAgICAgICAgbWVzc2FnZS5ib2R5LnZhbHVlLnAycFJlcXVlc3RlciA9IGh5cGVydHkucDJwUmVxdWVzdGVyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IHJlZ2lzdGVySHlwZXJ0eV0gSHlwZXJ0eSByZWdpc3RyYXRpb24gYXQgZG9tYWluIHJlZ2lzdHJ5ICAtICcsIG1lc3NhZ2UpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZVdpdGhSZXRyaWVzKG1lc3NhZ2UsIF90aGlzLl9yZWdpc3RyYXRpb25SZXRyaWVzLCAocmVwbHkpID0+IHtcclxuICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIEh5cGVydHkgcmVnaXN0cmF0aW9uIHJlc3BvbnNlOiAnLCByZXBseSk7XHJcblxyXG4gICAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB7IHVybDogaHlwZXJ0eS5oeXBlcnR5VVJMfTtcclxuICAgICAgICAgICAgaWYgKGh5cGVydHkucDJwSGFuZGxlcikge1xyXG4gICAgICAgICAgICAgIHJlc3VsdC5wMnBIYW5kbGVyID0gaHlwZXJ0eS5wMnBIYW5kbGVyO1xyXG4gICAgICAgICAgICAgIHJlc3VsdC5wMnBSZXF1ZXN0ZXIgPSBoeXBlcnR5LnAycFJlcXVlc3RlcjtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gNDA0KSB7XHJcbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIFRoZSB1cGRhdGUgd2FzIG5vdCBwb3NzaWJsZS4gUmVnaXN0ZXJpbmcgbmV3IEh5cGVydHkgYXQgZG9tYWluIHJlZ2lzdHJ5Jyk7XHJcblxyXG4gICAgICAgICAgICBtZXNzYWdlID0ge3R5cGU6ICdjcmVhdGUnLCBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCwgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgX3RoaXMuX2RvbWFpbiwgYm9keToge3ZhbHVlOiBtZXNzYWdlVmFsdWUsIHBvbGljeTogJ3BvbGljeSd9fTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2VXaXRoUmV0cmllcyhtZXNzYWdlLCBfdGhpcy5fcmVnaXN0cmF0aW9uUmV0cmllcywgKHJlcGx5KSA9PntcclxuICAgICAgICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIEh5cGVydHkgcmVnaXN0cmF0aW9uIHVwZGF0ZSByZXNwb25zZTogJywgcmVwbHkpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0geyB1cmw6IGh5cGVydHkuaHlwZXJ0eVVSTH07XHJcbiAgICAgICAgICAgICAgICAgIGlmIChoeXBlcnR5LnAycEhhbmRsZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucDJwSGFuZGxlciA9IGh5cGVydHkucDJwSGFuZGxlcjtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucDJwUmVxdWVzdGVyID0gaHlwZXJ0eS5wMnBSZXF1ZXN0ZXI7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlZ2lzdGVyIGFuIEh5cGVydHk6ICcgKyByZXBseSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgbG9nLmVycm9yKGUpO1xyXG4gICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVnaXN0ZXIgYW4gSHlwZXJ0eSB0byBkb21haW46ICcsIHJlcGx5KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbG9nLmVycm9yKGUpO1xyXG4gICAgICAgIHJlamVjdChlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy90aW1lciB0byBrZWVwIHRoZSByZWdpc3RyYXRpb24gYWxpdmVcclxuICAgICAgLy8gdGhlIHRpbWUgaXMgZGVmaW5lZCBieSBhIGxpdHRsZSBsZXNzIHRoYW4gaGFsZiBvZiB0aGUgZXhwaXJlcyB0aW1lIGRlZmluZWRcclxuICAgICAgbGV0IGtlZXBBbGl2ZVRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIGxldCBtZXNzYWdlID0ge1xyXG4gICAgICAgICAgdHlwZTogJ3VwZGF0ZScsXHJcbiAgICAgICAgICBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCxcclxuICAgICAgICAgIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIF90aGlzLl9kb21haW4sXHJcbiAgICAgICAgICBib2R5OiB7IHJlc291cmNlOiBoeXBlcnR5Lmh5cGVydHlVUkwsIHZhbHVlOiB7c3RhdHVzOiAnbGl2ZSd9LCBtZXRob2Q6ICdyZWZyZXNoJyB9fTtcclxuXHJcbiAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgcmVnaXN0ZXJIeXBlcnR5XSBLZWVwQWxpdmUgUmVwbHk6ICcsIHJlcGx5KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSwgKCgocmVnaXN0cmF0aW9uRXhwaXJlcyAvIDEuMSkgLyAyKSAqIDEwMDApKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEb21haW5SZWdpc3RyYXRpb247XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1AyUENvbm5lY3Rpb25SZXNvbHZlJyk7XHJcblxyXG4vKipcclxuKiAgIFRvIHByb2Nlc3MgYWRkcmVzcyByZXNvbHV0aW9uIGZvciBwMnAgY29ubmVjdGlvbnNcclxuKi9cclxuY2xhc3MgUDJQQ29ubmVjdGlvblJlc29sdmUgIHtcclxuXHJcbiAgY29uc3RydWN0b3IocmVnaXN0cnkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcclxuICAgIF90aGlzLl9yZW1vdGVQMlBFbnRpdGllcyA9IHt9OyAvLyBBbGwgcmVtb3RlIGVudGl0aWVzIGFuZCBhc3NvY2lhdGVkIHJ1bnRpbWUgdXJsIHRoYXQgYXJlIHJlYWNoYWJsZSB3aXRoIGV4aXN0aW5nIHAycCBjb25uZWN0aW9uc1xyXG5cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAqIFZlcmlmaWVzIGlmIHJlbW90ZSBFbnRpdHkgY2FuIGJlIHJlYWNoZWQgd2l0aCBhIFAyUCBDb25uZWN0aW9uLlxyXG4gICogQHBhcmFtICB7VVJMLlVSTH0gICAgICAgIGluZm8gICAgICAgICAgIG9iamVjdCBVUkxcclxuICAqIEByZXR1cm4ge0h5cGVydHlEYXRhT2JqZWN0SW5zdGFuY2V9ICBhZGRyZXNzVVJMICAgICByZXR1cm4gdGhlIERhdGEgT2JqZWN0IGluc3RhbmNlIHJlZ2lzdGVyZWQgVVJMLCByZXR1cm4gdW5kZWZpbmVkIG90aGVyd2lzZVxyXG4gICovXHJcblxyXG4gIGNoZWNrUDJQKG1zZykge1xyXG5cclxuICAgIGlmICghbXNnLmhhc093blByb3BlcnR5KCd0bycpKSB7XHJcbiAgICAgIC8vIHRocm93IEVycm9yKCdUaGUgcDJwIHZlcmlmaWNhdGlvbiB3YXMgZmFpbGVkJyk7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnVGhlIHAycCB2ZXJpZmljYXRpb24gd2FzIGZhaWxlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzY2hlbWUgPSBtc2cudG8uc3BsaXQoJzovLycpWzBdO1xyXG5cclxuICAgIGxldCBjb21wID0gbXNnLnRvLnNwbGl0KCc6Ly8nKVsxXS5zcGxpdCgnLycpWzJdO1xyXG5cclxuICAgIGxldCB1cmw7XHJcblxyXG4gICAgaWYgKGNvbXApIHVybCA9IG1zZy50by5zdWJzdHJpbmcoMCwgbXNnLnRvLmluZGV4T2YoJy8nICsgY29tcCkpO1xyXG4gICAgZWxzZSB1cmwgPSBtc2cudG87XHJcblxyXG4gICAgbGV0IHAycCA9IHt9O1xyXG5cclxuICAgIGlmIChtc2cuYm9keSAmJiBtc2cuYm9keS5wMnApIHAycC5wMnAgPSBtc2cuYm9keS5wMnA7XHJcblxyXG4gICAgaWYgKG1zZy5ib2R5ICYmIG1zZy5ib2R5LnAycEhhbmRsZXIgJiYgbXNnLmJvZHkucDJwUmVxdWVzdGVyKSB7XHJcbiAgICAgIHAycC5wMnBIYW5kbGVyID0gbXNnLmJvZHkucDJwSGFuZGxlcjtcclxuICAgICAgcDJwLnAycFJlcXVlc3RlciA9IG1zZy5ib2R5LnAycFJlcXVlc3RlcjtcclxuICAgICAgcDJwLnJ1bnRpbWUgPSBtc2cuYm9keS5wMnBIYW5kbGVyLnNwbGl0KCcvcDJwaGFuZGxlci8nKVswXTtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHNjaGVtZSkge1xyXG4gICAgICBjYXNlICdydW50aW1lJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1AyUFJ1bnRpbWUodXJsLCBwMnApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrUDJQRW50aXR5KHVybCwgcDJwKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFZlcmlmaWVzIGlmIHJlbW90ZSBFbnRpdHkgKEh5cGVydHkgb3IgRGF0YSBPYmplY3QpIGNhbiBiZSByZWFjaGVkIHdpdGggYSBQMlAgQ29ubmVjdGlvbi5cclxuICAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgIHVybCAgICAgICAgICAgUmVtb3RlIEVudGl0eSBVUkwgdG8gYmUgY2hlY2tlZFxyXG4gICogQHBhcmFtICB7b2JqZWN0fSAgICAgICAgcDJwICAgICAgICAgICBwMnAgaW5mb3JtYXRpb24gdG8gYmUgdXNlZCBpbmNsdWRpbmcgwrRydW50aW1lwrQgd2l0aCByZW1vdGUgUnVudGltZSBVUkwsICdwMnBIYW5kbGVyJyByZW1vdGUgUDJQIEhhbmRsZXIgU3R1YiBVUkwgYW5kIHAycFJlcXVlc3RlciB3aXRoIENhdGFsb2d1ZSBVUkwgb2YgUDJQIFJlcXVlc3RlciB0byBiZSB1c2VkXHJcbiAgKiBAcmV0dXJuIHtwcm9taXNlfSByZWdpc3RlcmVkRW50aXR5ICAgICBpZiBwMnAgY29ubmVjdGlvbiBpcyBwb3NzaWJsZSBpdCByZXR1cm5zIHAycCBpbmZvcm1hdGlvbiB0byBiZSB1c2VkIGluIHRoZSBjb25uZWN0aW9uLCBvdGhlcndpc2UgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWRcclxuICAqL1xyXG5cclxuICBjaGVja1AyUEVudGl0eSh1cmwsIHAycCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZXQgcmVtb3RlRW50aXR5ID0gX3RoaXMuX3JlbW90ZVAyUEVudGl0aWVzW3VybF07XHJcblxyXG4gICAgICBpZiAocmVtb3RlRW50aXR5KSByZXNvbHZlKHJlbW90ZUVudGl0eSk7XHJcbiAgICAgIGVsc2UgaWYgKHAycC5ydW50aW1lKSByZXNvbHZlKHAycCk7IC8vIHVzZSBwcm92aWRlZCBwMnAgaWYgYXZhaWxhYmxlIGluIHRoZSBtZXNzYWdlIGJvZHlcclxuICAgICAgZWxzZSBpZiAocDJwLnAycCkgeyAvLyBvdGhlcndpc2UgbG9vayBvbiBEb21haW4gUmVnaXN0cnlcclxuXHJcbiAgICAgICAgbG9nLmxvZygnW1JlZ2lzdHJ5IC0gY2hlY2tQMlBFbnRpdHldIC0gc2VhcmNoIGluIERvbWFpbiBSZWdpc3RyeTogJywgdXJsKTtcclxuXHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICB0eXBlOiAncmVhZCcsXHJcbiAgICAgICAgICBmcm9tOiBfdGhpcy5fcmVnaXN0cnkucmVnaXN0cnlVUkwsXHJcbiAgICAgICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fcmVnaXN0cnkuX2RvbWFpbixcclxuICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgcmVzb3VyY2U6IHVybFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIF90aGlzLl9yZWdpc3RyeS5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVwbHkpID0+IHtcclxuICAgICAgICAgIGxvZy5sb2coJ1tSZWdpc3RyeSAtIGNoZWNrUDJQRW50aXR5XSBEb21haW4gUmVnaXN0cnkgcmVwbHknLCByZXBseSk7XHJcbiAgICAgICAgICBpZiAoJ3ZhbHVlJyBpbiByZXBseS5ib2R5KSB7XHJcblxyXG4gICAgICAgICAgICAvL3RvZG86IHN0b3JlIHJldHJpZXZlZCBlbnRpdHlcclxuICAgICAgICAgICAgbGV0IHJlc29sdmVkRW50aXR5ID0gcmVwbHkuYm9keS52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZEVudGl0eS5oYXNPd25Qcm9wZXJ0eSgncDJwSGFuZGxlcicpKSB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZEVudGl0eSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KCdbUmVnaXN0cnkgY2hlY2tQMlBFbnRpdHldIEh5cGVydHkgZm91bmQgZG9lcyBub3Qgc3VwcG9ydCBQMlAnLCByZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlamVjdCgnW1JlZ2lzdHJ5IGNoZWNrUDJQRW50aXR5XSBIeXBlcnR5IHdpdGggUDJQSGFuZGxlciBub3QgZm91bmQnLCByZXBseS5ib2R5LmNvZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgcmVqZWN0KCdbUmVnaXN0cnkgY2hlY2tQMlBFbnRpdHldIE5vIFAyUCBDb25uZWN0aW9uIGF2YWlsYWJsZSBmb3IgJywgdXJsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBWZXJpZmllcyBpZiByZW1vdGUgUnVudGltZSBjYW4gYmUgcmVhY2hlZCB3aXRoIGEgUDJQIENvbm5lY3Rpb24uXHJcbiAgKiBAcGFyYW0gIHtVUkwuVVJMfSAgICAgICAgcnVudGltZVVSTCAgICAgICAgICAgUnVudGltZSBVUkxcclxuICAqIEByZXR1cm4ge09iamVjdH0gIHAycENvbm5lY3Rpb24gICAgcmV0dXJuIHRoZSBQMlBDb25uZWN0aW9uIGluc3RhbmNlIHJlZ2lzdGVyZWQgVVJMLCByZXR1cm4gdW5kZWZpbmVkIG90aGVyd2lzZVxyXG4gICovXHJcblxyXG4gIGNoZWNrUDJQUnVudGltZShydW50aW1lVVJMLCBwMnApIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IHJlZ2lzdGVyZWRSdW50aW1lID0ge307XHJcblxyXG4gICAgLy8gbG9vayBvbiBsb2NhbGx5IHN0b3JlZCBwMnAgY29ubmVjdGlvbnNcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5fcmVnaXN0cnkucDJwQ29ubmVjdGlvbkxpc3RbcnVudGltZVVSTF0pIHtcclxuICAgICAgICByZXNvbHZlKHtydW50aW1lOiBydW50aW1lVVJMfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoIHAycC5ydW50aW1lKSB7XHJcbiAgICAgICAgcmVnaXN0ZXJlZFJ1bnRpbWUgPSBwMnA7XHJcbiAgICAgICAgcmVzb2x2ZShyZWdpc3RlcmVkUnVudGltZSk7XHJcbiAgICAgIH0gZWxzZSByZWplY3QoJ1tSZWdpc3RyeS5QMlBDb25uZWN0aW9uUmVzb2x2ZS5jaGVja1AyUFJ1bnRpbWVdIE5vIFAyUCBDb25uZWN0aW9uIGZvdW5kIHRvICcsIHJ1bnRpbWVVUkwpO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVmVyaWZpZXMgaWYgcmVtb3RlIEh5cGVydHkgY2FuIGJlIHJlYWNoZWQgd2l0aCBhIFAyUCBDb25uZWN0aW9uLlxyXG4gICogQHBhcmFtICB7SlNPTn0gICAgICAgIGluZm8gICAgICAgICAgIG9iamVjdCBvciBlbnRpdHkgY2hhcmF0ZXJpc3RpY3MgaW5mb1xyXG4gICogQHJldHVybiB7YWRkcmVzc1VSTH0gIGFkZHJlc3NVUkwgICAgIHJldHVybiB0aGUgVVJMIGlmIHRoZXJlIGlzIGFueSBwcmV2aW91c3kgcmVnaXN0ZXJlZCBVUkwsIHJldHVybiB1bmRlZmluZWQgb3RoZXJ3aXNlXHJcbiAgKi9cclxuXHJcbiAgY2hlY2tQMlBIeXBlcnR5KGh5cGVydHlVUkwsIHAycCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZXQgaHlwZXJ0eTtcclxuXHJcblxyXG4gICAgICAvLyBsb29rIG9uIGxvY2FsbHkgc3RvcmVkIGh5cGVydGllc1xyXG5cclxuICAgICAgZm9yIChsZXQgaSBpbiBfdGhpcy5fcmVnaXN0cnkucmVtb3RlSHlwZXJ0eUxpc3QpIHtcclxuICAgICAgICBoeXBlcnR5ID0gX3RoaXMuX3JlZ2lzdHJ5LnJlbW90ZUh5cGVydHlMaXN0W2ldO1xyXG5cclxuICAgICAgICBsb2cubG9nKCdbUmVnaXN0cnkgLSBjaGVja1AyUEh5cGVydHldIC0gZm9yIGVhY2ggSHlwZXJ0eTogJywgaHlwZXJ0eSk7XHJcblxyXG4gICAgICAgIC8vIHRvZG86IGNoYW5nZSB0byBcImh5cGVydHkudXJsXCIgdG8gYmUgYWxpZ25lZCB3aXRoIGh5cGVydHkgaW5zdGFuY2UgZGF0YSBtb2RlbCBzcGVjXHJcblxyXG4gICAgICAgIGlmIChoeXBlcnR5Lmh5cGVydHlJRCA9PT0gaHlwZXJ0eVVSTCkge1xyXG5cclxuICAgICAgICAgIGlmIChoeXBlcnR5Lmhhc093blByb3BlcnR5KCdwMnBIYW5kbGVyJykpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShoeXBlcnR5KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlamVjdCgnW1JlZ2lzdHJ5IGNoZWNrUDJQSHlwZXJ0eV0gSHlwZXJ0eSBmb3VuZCBkb2VzIG5vdCBzdXBwb3J0IFAyUCcsIGh5cGVydHkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFoeXBlcnR5ICYmIHAycC5ydW50aW1lKSByZXNvbHZlKHAycCk7IC8vIHVzZSBwcm92aWRlZCBwMnAgaWYgYXZhaWxhYmxlIGluIHRoZSBtZXNzYWdlIGJvZHlcclxuICAgICAgZWxzZSBpZiAoIWh5cGVydHkgJiYgcDJwLnAycCkgeyAvLyBvdGhlcndpc2UgbG9vayBvbiBEb21haW4gUmVnaXN0cnlcclxuXHJcbiAgICAgICAgbG9nLmxvZygnW1JlZ2lzdHJ5IC0gY2hlY2tQMlBIeXBlcnR5XSAtIHNlYXJjaCBpbiBEb21haW4gUmVnaXN0cnk6ICcsIGh5cGVydHkpO1xyXG5cclxuICAgICAgICBsZXQgbWVzc2FnZSA9IHtcclxuICAgICAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgICAgIGZyb206IF90aGlzLl9yZWdpc3RyeS5yZWdpc3RyeVVSTCxcclxuICAgICAgICAgIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIF90aGlzLl9yZWdpc3RyeS5fZG9tYWluLFxyXG4gICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICByZXNvdXJjZTogaHlwZXJ0eVVSTFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIF90aGlzLl9yZWdpc3RyeS5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVwbHkpID0+IHtcclxuICAgICAgICAgIGxvZy5sb2coJ1tSZWdpc3RyeSAtIGNoZWNrUDJQSHlwZXJ0eV0gRG9tYWluIFJlZ2lzdHJ5IHJlcGx5JywgcmVwbHkpO1xyXG4gICAgICAgICAgaWYgKCd2YWx1ZScgaW4gcmVwbHkuYm9keSkge1xyXG5cclxuICAgICAgICAgICAgLy90b2RvOiBzdG9yZSByZXRyaWV2ZWQgaHlwZXJ0eVxyXG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWRIeXBlcnR5ID0gcmVwbHkuYm9keS52YWx1ZTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLl9yZWdpc3RyeS5yZW1vdGVIeXBlcnR5TGlzdC5wdXNoKHJlc29sdmVkSHlwZXJ0eSk7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzb2x2ZWRIeXBlcnR5Lmhhc093blByb3BlcnR5KCdwMnBIYW5kbGVyJykpIHtcclxuICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkSHlwZXJ0eSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KCdbUmVnaXN0cnkgY2hlY2tQMlBIeXBlcnR5XSBIeXBlcnR5IGZvdW5kIGRvZXMgbm90IHN1cHBvcnQgUDJQJywgcmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZWplY3QoJ1tSZWdpc3RyeSBjaGVja1AyUEh5cGVydHldIEh5cGVydHkgd2l0aCBQMlBIYW5kbGVyIG5vdCBmb3VuZCcsIHJlcGx5LmJvZHkuY29kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSByZWplY3QoJ1tSZWdpc3RyeSBjaGVja1AyUEh5cGVydHldIE5vIFAyUCBDb25uZWN0aW9uIGF2YWlsYWJsZSBmb3IgJywgaHlwZXJ0eVVSTCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVmVyaWZpZXMgaWYgcmVtb3RlIERhdGEgT2JqZWN0IGNhbiBiZSByZWFjaGVkIHdpdGggYSBQMlAgQ29ubmVjdGlvbi5cclxuICAqIEBwYXJhbSAge1VSTC5VUkx9ICAgICAgICBEYXRhT2JqZWN0VVJMICAgICAgICAgICBvYmplY3QgVVJMXHJcbiAgKiBAcmV0dXJuIHtIeXBlcnR5RGF0YU9iamVjdEluc3RhbmNlfSAgYWRkcmVzc1VSTCAgICAgcmV0dXJuIHRoZSBEYXRhIE9iamVjdCBpbnN0YW5jZSByZWdpc3RlcmVkIFVSTCwgcmV0dXJuIHVuZGVmaW5lZCBvdGhlcndpc2VcclxuICAqL1xyXG5cclxuICBjaGVja1AyUERhdGFPYmplY3QodXJsLCBwMnApIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIC8vIGxvb2sgb24gbG9jYWxseSBzdG9yZWQgUmVtb3RlIERhdGEgT2JqZWN0c1xyXG5cclxuICAgICAgbGV0IGRhdGFvYmplY3QgPSBfdGhpcy5fcmVnaXN0cnkucmVtb3RlRGF0YU9iamVjdExpc3QuZmlsdGVyKChpKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChfdGhpcy5fcmVnaXN0cnkucmVtb3RlRGF0YU9iamVjdExpc3RbaV0udXJsID09PSB1cmwpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChkYXRhb2JqZWN0Lmxlbmd0aCAhPT0gMCAmJiBkYXRhb2JqZWN0WzBdLnAycFJlcXVlc3Rlcikge1xyXG4gICAgICAgIHJlc29sdmUoZGF0YW9iamVjdFswXSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YW9iamVjdC5sZW5ndGggIT09IDApIHtcclxuICAgICAgICByZWplY3QoJ1tSZWdpc3RyeSBjaGVja1AyUERhdGFPYmplY3RdIERhdGEgT2JqZWN0IGZvdW5kIGRvZXMgbm90IHN1cHBvcnQgUDJQJywgZGF0YW9iamVjdFswXSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YW9iamVjdC5sZW5ndGggPT09IDAgJiYgcDJwLnJ1bnRpbWUpIHJlc29sdmUocDJwKTsgLy8gdXNlIHByb3ZpZGVkIHAycCBpbmZvIGlmIGF2YWlsYWJsZSBpbiB0aGUgbWVzc2FnZSBib2R5XHJcbiAgICAgIGVsc2UgaWYgKGRhdGFvYmplY3QubGVuZ3RoICYmIHAycC5wMnApIHsgLy8gb3RoZXJ3aXNlIGxvb2sgb24gRG9tYWluIFJlZ2lzdHJ5XHJcblxyXG4gICAgICAvLyBsb29rIG9uIERvbWFpbiBSZWdpc3RyeVxyXG5cclxuICAgICAgICBsZXQgbWVzc2FnZSA9IHtcclxuICAgICAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgICAgIGZyb206IF90aGlzLl9yZWdpc3RyeS5yZWdpc3RyeVVSTCxcclxuICAgICAgICAgIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIF90aGlzLl9yZWdpc3RyeS5fZG9tYWluLFxyXG4gICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICByZXNvdXJjZTogdXJsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgX3RoaXMuX3JlZ2lzdHJ5Ll9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgbG9nLmxvZygnZGlzY292ZXIgZGF0YSBvYmplY3QgcGVyIHVybCByZXBseScsIHJlcGx5KTtcclxuICAgICAgICAgIGlmICgndmFsdWUnIGluIHJlcGx5LmJvZHkpIHtcclxuXHJcbiAgICAgICAgICAgIC8vdG9kbzogc3RvcmUgcmV0cmlldmVkIGh5cGVydHlcclxuICAgICAgICAgICAgbGV0IHJlc29sdmVkRGF0YU9iamVjdCA9IHJlcGx5LmJvZHkudmFsdWU7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5fcmVnaXN0cnkucmVtb3RlRGF0YU9iamVjdExpc3QucHVzaChyZXNvbHZlZERhdGFPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHJlc29sdmVkRGF0YU9iamVjdC5wMnBSZXF1ZXN0ZXIpIHtcclxuICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkRGF0YU9iamVjdCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KCdbUmVnaXN0cnkgY2hlY2tQMlBEYXRhT2JqZWN0XSBEYXRhIE9iamVjdCBmb3VuZCBkb2VzIG5vdCBzdXBwb3J0IFAyUCcsIHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVqZWN0KCdbUmVnaXN0cnkgY2hlY2tQMlBEYXRhT2JqZWN0XSBub3QgZm91bmQnLCByZXBseS5ib2R5LmNvZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgcmVqZWN0KCdbUmVnaXN0cnkgY2hlY2tQMlBEYXRhT2JqZWN0XSBubyBQMlAgQ29ubmVjdGlvbiBmb3VuZCcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRSZW1vdGVQMlBFbnRpdHkodXJsLCBydW50aW1lKSB7XHJcbiAgICB0aGlzLl9yZW1vdGVQMlBFbnRpdGllc1t1cmxdID0gcnVudGltZTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVJlbW90ZVAyUEVudGl0eSh1cmwpIHtcclxuICAgIGRlbGV0ZSB0aGlzLl9yZW1vdGVQMlBFbnRpdGllc1t1cmxdO1xyXG4gIH1cclxuXHJcbiAgcmVjb25uZWN0UDJQUmVxdWVzdGVyKHAycFJlcXVlc3Rlcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsb2cubG9nKCdbUDJQQ29uZW5jdGlvblJlc29sdmUucmVjb25uZWN0UDJQUmVxdWVzdGVyXSBsZXRzIHRyeSB0byByZWNvbm5lY3QgUDJQIFJlcXVlc3RlciBTdHViOiAnLCBwMnBSZXF1ZXN0ZXIpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgcmVtb3RlUnVudGltZSA9IHAycFJlcXVlc3Rlci5ydW50aW1lO1xyXG5cclxuICAgICAgbGV0IG1lc3NhZ2UgPSB7XHJcbiAgICAgICAgdHlwZTogJ2V4ZWN1dGUnLFxyXG4gICAgICAgIGZyb206IF90aGlzLl9yZWdpc3RyeS5yZWdpc3RyeVVSTCxcclxuICAgICAgICB0bzogcDJwUmVxdWVzdGVyLnVybCxcclxuICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICBtZXRob2Q6ICdjb25uZWN0JyxcclxuICAgICAgICAgIHBhcmFtczogW3AycFJlcXVlc3Rlci5wMnBIYW5kbGVyXVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGxldHMgcHJlcGFyZSB0aGUgcDJwUmVxdWVzdGVyU1R1YiByZWNvbm5lY3QgYnkgc2V0dGluZyBhbiBvYnNlcnZlciB0byBpdHMgc3RhdHVzIGNoYW5nZXNcclxuXHJcbiAgICAgIF90aGlzLl9yZWdpc3RyeS53YXRjaGluZ1lvdS5vYnNlcnZlKCdwMnBSZXF1ZXN0ZXJTdHViJywgKGNoYW5nZSkgPT4ge1xyXG5cclxuICAgICAgICBsb2cubG9nKCdbUDJQQ29uZW5jdGlvblJlc29sdmUucmVjb25uZWN0UDJQUmVxdWVzdGVyXSBwMnBSZXF1ZXN0ZXJTdHVicyBjaGFuZ2VkICcgKyBfdGhpcy5fcmVnaXN0cnkucDJwUmVxdWVzdGVyU3R1Yik7XHJcblxyXG4gICAgICAgIGlmIChjaGFuZ2Uua2V5cGF0aC5zcGxpdCgnLicpWzBdID09PSByZW1vdGVSdW50aW1lICYmIGNoYW5nZS5uYW1lID09PSAnc3RhdHVzJykge1xyXG4gICAgICAgICAgc3dpdGNoIChjaGFuZ2UubmV3VmFsdWUpIHtcclxuICAgICAgICAgICAgY2FzZSAnbGl2ZSc6XHJcbiAgICAgICAgICAgICAgbG9nLmxvZygnW1AyUENvbmVuY3Rpb25SZXNvbHZlLnJlY29ubmVjdFAyUFJlcXVlc3Rlcl0gcDJwUmVxdWVzdGVyIGlzIGxpdmUgJyArIF90aGlzLl9yZWdpc3RyeS5wMnBSZXF1ZXN0ZXJTdHViW3JlbW90ZVJ1bnRpbWVdKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKF90aGlzLl9yZWdpc3RyeS5wMnBSZXF1ZXN0ZXJTdHViW3JlbW90ZVJ1bnRpbWVdLnVybCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ2ZhaWxlZCc6XHJcbiAgICAgICAgICAgICAgbG9nLmxvZygnW1AyUENvbmVuY3Rpb25SZXNvbHZlLnJlY29ubmVjdFAyUFJlcXVlc3Rlcl0gcDJwUmVxdWVzdGVyIHJlY29ubmVjdCBmYWlsZWQgJyArIF90aGlzLl9yZWdpc3RyeS5wMnBSZXF1ZXN0ZXJTdHViW3JlbW90ZVJ1bnRpbWVdKTtcclxuICAgICAgICAgICAgICByZWplY3QoJ1AyUCBSZXF1ZXN0ZXIgcmVjb25uZWN0IGZhaWxlZCcpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyAgc3R1YiBsb2FkXHJcbiAgICAgIF90aGlzLl9yZWdpc3RyeS5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdbUDJQQ29uZW5jdGlvblJlc29sdmUucmVjb25uZWN0UDJQUmVxdWVzdGVyXSByZWNvbm5lY3QgcmVxdWVzdCByZXBseScsIHJlcGx5KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQMlBDb25uZWN0aW9uUmVzb2x2ZTtcclxuIiwiaW1wb3J0ICdwcm94eS1vYnNlcnZlJztcclxuXHJcbmNsYXNzIFdhdGNoaW5nWW91IHtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLl93YXRjaGluZyA9IHt9O1xyXG4gICAgdGhpcy5fb2JzZXJ2ZXJzID0gW107XHJcbiAgfVxyXG5cclxuICB3YXRjaChrZXksIG9iamVjdCwgZGVlcCA9IGZhbHNlKSB7XHJcbiAgICBpZiAoZGVlcCkge1xyXG4gICAgICB0aGlzLl93YXRjaGluZ1trZXldID0gT2JqZWN0LmRlZXBPYnNlcnZlKG9iamVjdCwgKGNoYW5nZXMpID0+IHtcclxuICAgICAgICBjaGFuZ2VzLmV2ZXJ5KChjaGFuZ2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudChrZXksIGNoYW5nZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fd2F0Y2hpbmdba2V5XSA9IE9iamVjdC5vYnNlcnZlKG9iamVjdCwgKGNoYW5nZXMpID0+IHtcclxuICAgICAgICBjaGFuZ2VzLmV2ZXJ5KChjaGFuZ2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudChrZXksIGNoYW5nZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX3dhdGNoaW5nW2tleV07XHJcbiAgfVxyXG5cclxuICBvYnNlcnZlKGtleSwgY2FsbGJhY2spIHtcclxuICAgIHRoaXMuX29ic2VydmVycy5wdXNoKHtrZXk6IGtleSwgY2FsbGJhY2s6IGNhbGxiYWNrfSk7XHJcbiAgfVxyXG5cclxuICBfZmlyZUV2ZW50KGtleSwgY2hhbmdlKSB7XHJcblxyXG4gICAgdGhpcy5fb2JzZXJ2ZXJzLmZpbHRlcigob2JzZXJ2ZSkgPT4ge1xyXG4gICAgICByZXR1cm4gb2JzZXJ2ZS5rZXkgPT09IGtleTtcclxuICAgIH0pLmZvckVhY2goKG9ic2VydmUpID0+IHtcclxuICAgICAgb2JzZXJ2ZS5jYWxsYmFjayhjaGFuZ2UpO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFdhdGNoaW5nWW91O1xyXG5cclxuLypsZXQgd2F0Y2hDaGFuZ2VzID0gbmV3IFdhdGNoQ2hhbmdlcygpO1xyXG5sZXQgcDJwUmVxdWVzdGVyU3R1YiA9IHdhdGNoQ2hhbmdlcy53YXRjaCgncDJwJywge30sIHRydWUpO1xyXG5sZXQgc3R1YiA9IHdhdGNoQ2hhbmdlcy53YXRjaCgnc3R1YicsIHt9KTtcclxuXHJcbndhdGNoQ2hhbmdlcy5vYnNlcnZlKCdwMnAnLCAoY2hhbmdlKSA9PiB7XHJcbiAgY29uc29sZS5sb2coJ3AycFJlcXVlc3RlclN0dWI6ICcgKyBjaGFuZ2UubmFtZSArICcgLSAnICsgSlNPTi5zdHJpbmdpZnkoY2hhbmdlLm5ld1ZhbHVlKSk7XHJcbn0pO1xyXG5cclxud2F0Y2hDaGFuZ2VzLm9ic2VydmUoJ3AycCcsIChjaGFuZ2UpID0+IHtcclxuICBjb25zb2xlLmxvZygncDJwUmVxdWVzdGVyU3R1YjogJyArIGNoYW5nZS5uYW1lICsgJyAtICcgKyBKU09OLnN0cmluZ2lmeShjaGFuZ2UubmV3VmFsdWUpKTtcclxufSk7XHJcblxyXG53YXRjaENoYW5nZXMub2JzZXJ2ZSgnc3R1YicsIChjaGFuZ2UpID0+IHtcclxuICBjb25zb2xlLmxvZygnc3R1YiAnICsgY2hhbmdlLm5hbWUpO1xyXG59KTtcclxuXHJcbnAycFJlcXVlc3RlclN0dWIuYSA9IHt9O1xyXG5zdHViLmIgPSB7bmFtZTogJ3ZpdG9yJ307XHJcbnAycFJlcXVlc3RlclN0dWIuYS5uYW1lID0gJ0hlbGxvJztcclxuc3R1Yi5iID0ge25hbWU6ICd2aXRvcid9O1xyXG5wMnBSZXF1ZXN0ZXJTdHViLmEuYWdlID0gJzMyJztcclxucDJwUmVxdWVzdGVyU3R1Yi5hLm5hbWUgPSAnV29ybGQnOyovXHJcbiIsImltcG9ydCBXYXRjaGluZ1lvdSBmcm9tICcuL3V0aWxzL1dhdGNoaW5nWW91JztcclxuXHJcbmV4cG9ydCB7IFdhdGNoaW5nWW91IH07XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1JlZ2lzdHJ5Jyk7XHJcblxyXG5pbXBvcnQgeyBydW50aW1lVXRpbHMgfSBmcm9tICcuLi9ydW50aW1lL3J1bnRpbWVVdGlscyc7XHJcbmltcG9ydCB7IFNhbmRib3hUeXBlfSBmcm9tICcuLi9zYW5kYm94L1NhbmRib3gnO1xyXG5cclxuaW1wb3J0IEFkZHJlc3NBbGxvY2F0aW9uIGZyb20gJy4uL2FsbG9jYXRpb24vQWRkcmVzc0FsbG9jYXRpb24nO1xyXG5pbXBvcnQgSHlwZXJ0eUluc3RhbmNlIGZyb20gJy4vSHlwZXJ0eUluc3RhbmNlJztcclxuaW1wb3J0IERvbWFpblJlZ2lzdHJhdGlvbiBmcm9tICcuL0RvbWFpblJlZ2lzdHJhdGlvbic7XHJcbmltcG9ydCBQMlBDb25uZWN0aW9uUmVzb2x2ZSBmcm9tICcuL1AyUENvbm5lY3Rpb25SZXNvbHZlJztcclxuXHJcbmltcG9ydCB7IGRpdmlkZVVSTCwgaXNIeXBlcnR5VVJMLCBpc1VSTCwgaXNVc2VyVVJMLCBnZW5lcmF0ZUdVSUQsIGdldFVzZXJJZGVudGl0eURvbWFpbiwgaXNCYWNrZW5kU2VydmljZVVSTCwgZGVlcENsb25lLCByZW1vdmVQYXRoRnJvbVVSTCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcclxuXHJcbmltcG9ydCAncHJveHktb2JzZXJ2ZSc7XHJcbmltcG9ydCB7IFdhdGNoaW5nWW91IH0gZnJvbSAnLi4vVXRpbHMnO1xyXG5cclxuLy8gaW1wb3J0IERpc2NvdmVyeVNlcnZpY2VGcmFtZXdvcmsgZnJvbSAnLi9EaXNjb3ZlcnlTZXJ2aWNlRnJhbWV3b3JrJztcclxuXHJcbmNvbnN0IFNUQVRVUyA9IHsgQ1JFQVRFRDogJ2NyZWF0ZWQnLCBMSVZFOiAnbGl2ZScsIERFUExPWUlORzogJ2RlcGxveWluZycsIERFUExPWUVEOiAnZGVwbG95ZWQnLCBQUk9HUkVTUzogJ2luLXByb2dyZXNzJywgRElTQ09OTkVDVEVEOiAnZGlzY29ubmVjdGVkJywgRkFJTEVEOiAnZGVwbG95bWVudC1mYWlsZWQnLCBERUFEOiAnZGVhZCcgfTtcclxuXHJcbi8qaW1wb3J0IElkZW50aXR5TWFuYWdlciBmcm9tICcuL0lkZW50aXR5TWFuYWdlcic7XHJcbmltcG9ydCBEaXNjb3ZlcnkgZnJvbSAnLi9EaXNjb3ZlcnknOyovXHJcblxyXG4vKipcclxuKiBSdW50aW1lIFJlZ2lzdHJ5IEludGVyZmFjZVxyXG4qL1xyXG5jbGFzcyBSZWdpc3RyeSB7XHJcblxyXG4gIC8qKlxyXG4gICogVG8gaW5pdGlhbGlzZSB0aGUgUnVudGltZSBSZWdpc3RyeSB3aXRoIHRoZSBSdW50aW1lVVJMIHRoYXQgd2lsbCBiZSB0aGUgYmFzaXMgdG8gZGVyaXZlIHRoZSBpbnRlcm5hbCBydW50aW1lIGFkZHJlc3NlcyB3aGVuIGFsbG9jYXRpbmcgYWRkcmVzc2VzIHRvIGludGVybmFsIHJ1bnRpbWUgY29tcG9uZW50LiBJbiBhZGRpdGlvbiwgdGhlIFJlZ2lzdHJ5IGRvbWFpbiBiYWNrLWVuZCB0byBiZSB1c2VkIHRvIHJlbW90ZWx5IHJlZ2lzdGVyIFJ1bnRpbWUgY29tcG9uZW50cywgaXMgYWxzbyBwYXNzZWQgYXMgaW5wdXQgcGFyYW1ldGVyLlxyXG4gICogQHBhcmFtICB7TWVzc2FnZUJ1c30gICAgICAgICAgbXNnYnVzICAgICAgICAgICAgICAgIG1zZ2J1c1xyXG4gICogQHBhcmFtICB7SHlwZXJ0eVJ1bnRpbWVVUkx9ICAgcnVudGltZVVSTCAgICAgICAgICAgIHJ1bnRpbWVVUkxcclxuICAqIEBwYXJhbSAge0FwcFNhbmRib3h9ICAgICAgICAgIGFwcFNhbmRib3ggICAgICAgICAgICBhcHBTYW5kYm94XHJcbiAgKiBAcGFyYW0gIHtydW50aW1lQ2F0YWxvZ3VlfSAgICBydW50aW1lQ2F0YWxvZ3VlICAgICAgcnVudGltZUNhdGFsb2d1ZVxyXG4gICogQHBhcmFtICB7RG9tYWluVVJMfSAgICAgICAgICAgcmVtb3RlUmVnaXN0cnkgICAgICAgIHJlbW90ZVJlZ2lzdHJ5XHJcbiAgKiBAcGFyYW0gIHtzdG9yYWdlTWFuYWdlcn0gICAgICBzdG9yYWdlTWFuYWdlclxyXG4gICovXHJcbiAgY29uc3RydWN0b3IocnVudGltZVVSTCwgYXBwU2FuZGJveCwgaWRlbnRpdHlNb2R1bGUsIHJ1bnRpbWVDYXRhbG9ndWUsIHJ1bnRpbWVDYXBhYmlsaXRpZXMsIHN0b3JhZ2VNYW5hZ2VyLCBwMnBIYW5kbGVyVVJMLCByZW1vdGVSZWdpc3RyeSkge1xyXG5cclxuICAgIC8vIGhvdyBzb21lIGZ1bmN0aW9ucyByZWNlaXZlIHRoZSBwYXJhbWV0ZXJzIGZvciBleGFtcGxlOlxyXG4gICAgLy8gbmV3IFJlZ2lzdHJ5KCdoeXBlcnR5LXJ1bnRpbWU6Ly9zcDEvMTIzJywgYXBwU2FuZGJveCwgaWRNb2R1bGUsIHJlbW90ZVJlZ2lzdHJ5KTtcclxuICAgIC8vIHJlZ2lzdHJ5LnJlZ2lzdGVyU3R1YihzYW5kYm94LCAnc3AxJyk7XHJcbiAgICAvLyByZWdpc3RyeS5yZWdpc3Rlckh5cGVydHkoc2FuZEJveCwgJ2h5cGVydHktcnVudGltZTovL3NwMS8xMjMnKTtcclxuICAgIC8vIHJlZ2lzdHJ5LnJlc29sdmUoJ2h5cGVydHktcnVudGltZTovL3NwMS8xMjMnKTtcclxuXHJcbiAgICBpZiAoIXJ1bnRpbWVVUkwpIHRocm93IG5ldyBFcnJvcigncnVudGltZVVSTCBpcyBtaXNzaW5nLicpO1xyXG4gICAgaWYgKCFzdG9yYWdlTWFuYWdlcikgdGhyb3cgbmV3IEVycm9yKCdzdG9yYWdlTWFuYWdlciBpcyBtaXNzaW5nLicpO1xyXG5cclxuICAgIC8qaWYgKCFyZW1vdGVSZWdpc3RyeSkgdGhyb3cgbmV3IEVycm9yKCdyZW1vdGVSZWdpc3RyeSBpcyBtaXNzaW5nJyk7Ki9cclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLnJlZ2lzdHJ5VVJMID0gcnVudGltZVVSTCArICcvcmVnaXN0cnkvJztcclxuICAgIF90aGlzLmFwcFNhbmRib3ggPSBhcHBTYW5kYm94O1xyXG4gICAgX3RoaXMucnVudGltZVVSTCA9IHJ1bnRpbWVVUkw7XHJcbiAgICBfdGhpcy5wMnBIYW5kbGVyVVJMID0gcDJwSGFuZGxlclVSTDtcclxuICAgIF90aGlzLnJ1bnRpbWVDYXRhbG9ndWUgPSBydW50aW1lQ2F0YWxvZ3VlO1xyXG4gICAgX3RoaXMucmVtb3RlUmVnaXN0cnkgPSByZW1vdGVSZWdpc3RyeTtcclxuICAgIF90aGlzLmlkTW9kdWxlID0gaWRlbnRpdHlNb2R1bGU7XHJcbiAgICBfdGhpcy5zdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VyO1xyXG4gICAgX3RoaXMucnVudGltZUNhcGFiaWxpdGllcyA9IHJ1bnRpbWVDYXBhYmlsaXRpZXM7XHJcbiAgICBfdGhpcy5pZGVudGlmaWVyID0gZ2VuZXJhdGVHVUlEKCk7XHJcblxyXG4gICAgX3RoaXMuaHlwZXJ0aWVzTGlzdFRvUmVtb3ZlID0ge307XHJcbiAgICBfdGhpcy5oeXBlcnRpZXNMaXN0ID0gW107XHJcbiAgICBfdGhpcy5yZW1vdGVIeXBlcnR5TGlzdCA9IFtdO1xyXG4gICAgX3RoaXMucmVtb3RlRGF0YU9iamVjdExpc3QgPSBbXTtcclxuICAgIF90aGlzLmlkcExlZ2FjeVByb3h5TGlzdCA9IHt9O1xyXG5cclxuICAgIF90aGlzLndhdGNoaW5nWW91ID0gbmV3IFdhdGNoaW5nWW91KCk7XHJcbiAgICBfdGhpcy5wMnBIYW5kbGVyU3R1YiA9IHt9O1xyXG4gICAgX3RoaXMucDJwUmVxdWVzdGVyU3R1YiA9IF90aGlzLndhdGNoaW5nWW91LndhdGNoKCdwMnBSZXF1ZXN0ZXJTdHViJywge30sIHRydWUpO1xyXG4gICAgX3RoaXMucDJwQ29ubmVjdGlvbkxpc3QgPSBfdGhpcy53YXRjaGluZ1lvdS53YXRjaCgncDJwQ29ubmVjdGlvbkxpc3QnLCB7fSwgdHJ1ZSk7XHJcbiAgICBfdGhpcy5wMnBIYW5kbGVyQXNzb2NpYXRpb24gPSB7fTtcclxuXHJcbiAgICBfdGhpcy5wcm90b3N0dWJzTGlzdCA9IF90aGlzLndhdGNoaW5nWW91LndhdGNoKCdwcm90b3N0dWJzTGlzdCcsIHt9LCB0cnVlKTtcclxuICAgIF90aGlzLmlkcFByb3h5TGlzdCA9IF90aGlzLndhdGNoaW5nWW91LndhdGNoKCdpZHBQcm94eUxpc3QnLCB7fSwgdHJ1ZSk7XHJcbiAgICBfdGhpcy5kYXRhT2JqZWN0TGlzdCA9IHt9O1xyXG4gICAgX3RoaXMuc3Vic2NyaWJlZERhdGFPYmplY3RMaXN0ID0ge307XHJcbiAgICBfdGhpcy5zYW5kYm94ZXNMaXN0ID0ge3NhbmRib3g6IHt9LCBhcHBTYW5kYm94OiB7fSB9O1xyXG4gICAgX3RoaXMucGVwTGlzdCA9IHt9O1xyXG4gICAgX3RoaXMucmVnaXN0cmllcyA9IHt9O1xyXG5cclxuICAgIF90aGlzLl9kb21haW4gPSBkaXZpZGVVUkwoX3RoaXMucmVnaXN0cnlVUkwpLmRvbWFpbjtcclxuICAgIF90aGlzLnNhbmRib3hlc0xpc3QuYXBwU2FuZGJveFtydW50aW1lVVJMXSA9IGFwcFNhbmRib3g7XHJcbiAgICBsZXQgcDJwQ29ubmVjdGlvblJlc29sdmUgPSBuZXcgUDJQQ29ubmVjdGlvblJlc29sdmUoX3RoaXMpO1xyXG5cclxuICAgIF90aGlzLl9wMnBDb25uZWN0aW9uUmVzb2x2ZSA9IHAycENvbm5lY3Rpb25SZXNvbHZlO1xyXG5cclxuICAgIF90aGlzLl9oeXBlcnR5VXJscyA9IHt9O1xyXG4gICAgX3RoaXMuX2RhdGFPYmplY3RVcmxzID0ge307XHJcbiAgfVxyXG5cclxuICBsb2FkUmVnaXN0cnkoKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdyZWdpc3RyeTpIeXBlcnR5VVJMcycpLnRoZW4oKHVybHNMaXN0KSA9PiB7XHJcbiAgICAgICAgaWYgKHVybHNMaXN0KSBfdGhpcy5faHlwZXJ0eVVybHMgPSB1cmxzTGlzdDtcclxuICAgICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5nZXQoJ3JlZ2lzdHJ5OkRhdGFPYmplY3RVUkxzJykudGhlbigodXJsc0xpc3QpID0+IHtcclxuICAgICAgICAgIGlmICh1cmxzTGlzdCkgX3RoaXMuX2RhdGFPYmplY3RVcmxzID0gdXJsc0xpc3Q7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXQgbG9hZGVyKGxvYWRlcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9sb2FkZXIgPSBsb2FkZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgbG9hZGVyKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fbG9hZGVyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiByZXR1cm4gdGhlIG1lc3NhZ2VCdXMgaW4gdGhpcyBSZWdpc3RyeVxyXG4gICogQHBhcmFtIHtNZXNzYWdlQnVzfSAgICAgICAgICAgbWVzc2FnZUJ1c1xyXG4gICovXHJcbiAgZ2V0IG1lc3NhZ2VCdXMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9tZXNzYWdlQnVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBTZXQgdGhlIG1lc3NhZ2VCdXMgaW4gdGhpcyBSZWdpc3RyeVxyXG4gICogQHBhcmFtIHtNZXNzYWdlQnVzfSAgICAgICAgICAgbWVzc2FnZUJ1c1xyXG4gICovXHJcbiAgc2V0IG1lc3NhZ2VCdXMobWVzc2FnZUJ1cykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcclxuXHJcbiAgICBfdGhpcy5fbWVzc2FnZUJ1cy5hZGRMaXN0ZW5lcihfdGhpcy5yZWdpc3RyeVVSTCwgZnVuY3Rpb24obXNnKSB7XHJcblxyXG4gICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgbGlzdGVuZXJdICcsIG1zZyk7XHJcblxyXG4gICAgICBsZXQgaXNIeXBlcnR5ID0gaXNIeXBlcnR5VVJMKG1zZy5mcm9tKTtcclxuICAgICAgbGV0IGhhc0NyaXRlcmlhID0gbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ2NyaXRlcmlhJyk7XHJcbiAgICAgIGxldCBpc1VSTFJlc291cmNlO1xyXG4gICAgICBsZXQgaXNVc2VyUmVzb3VyY2U7XHJcbiAgICAgIGxldCBpc0h5cGVydHlSZXNvdXJjZTtcclxuXHJcbiAgICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgncmVzb3VyY2UnKSAmJiBtc2cuYm9keS5yZXNvdXJjZSAhPT0gJy4nKSB7XHJcbiAgICAgICAgaXNVUkxSZXNvdXJjZSA9IGlzVVJMKG1zZy5ib2R5LnJlc291cmNlKTtcclxuICAgICAgICBpc1VzZXJSZXNvdXJjZSA9IGlzVXNlclVSTChtc2cuYm9keS5yZXNvdXJjZSk7XHJcbiAgICAgICAgaXNIeXBlcnR5UmVzb3VyY2UgPSBpc0h5cGVydHlVUkwobXNnLmJvZHkucmVzb3VyY2UpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBpc0RlbGV0ZSA9IG1zZy50eXBlID09PSAnZGVsZXRlJztcclxuICAgICAgbGV0IGhhc05hbWU7XHJcbiAgICAgIGxldCBoYXNVc2VyO1xyXG5cclxuICAgICAgaWYgKG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XHJcbiAgICAgICAgaGFzTmFtZSA9IG1zZy5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCduYW1lJyk7XHJcbiAgICAgICAgaGFzVXNlciA9IG1zZy5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCd1c2VyJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtc2cudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xyXG4gICAgICAgIGxvZy5lcnJvcignW1JlZ2lzdGVyIGxpc3RlbmVyXSBza2lwcGluZyAnLCBtc2cpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gbXNnIHNlbnQgYnkgaWRlbnRpdHkgbWFuYWdlciBsaWJyYXJ5XHJcbiAgICAgIGxldCB1c2VyVXJsID0gX3RoaXMuX2dldElkZW50aXR5QXNzb2NpYXRlZChtc2cuYm9keS5yZXNvdXJjZSwgbXNnLmJvZHkuY3JpdGVyaWEpO1xyXG5cclxuICAgICAgbGV0IHJlcGx5ID0ge2lkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIHRvOiBtc2cuZnJvbSwgZnJvbTogbXNnLnRvLCBib2R5OiB7cmVzb3VyY2U6IHVzZXJVcmx9fTtcclxuICAgICAgcmVwbHkuYm9keS5jb2RlID0gKHVzZXJVcmwpID8gMjAwIDogNDA0O1xyXG5cclxuICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHkpO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEluc3RhbGwgQWRkcmVzc0FsbG9jYXRpb25cclxuICAgIGxldCBhZGRyZXNzQWxsb2NhdGlvbiA9IEFkZHJlc3NBbGxvY2F0aW9uLmluc3RhbmNlO1xyXG4gICAgX3RoaXMuYWRkcmVzc0FsbG9jYXRpb24gPSBhZGRyZXNzQWxsb2NhdGlvbjtcclxuXHJcbiAgICBfdGhpcy5fZG9tYWluUmVnaXN0cmF0aW9uID0gbmV3IERvbWFpblJlZ2lzdHJhdGlvbihfdGhpcy5ydW50aW1lVVJMLF90aGlzLnJlZ2lzdHJ5VVJMLCBfdGhpcy5fZG9tYWluLCBtZXNzYWdlQnVzKTtcclxuXHJcbiAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgLSBBZGRyZXNzQWxsb2NhdGlvbl0gLSAnLCBhZGRyZXNzQWxsb2NhdGlvbik7XHJcbiAgfVxyXG5cclxuXHJcbiAgX2dldElkZW50aXR5QXNzb2NpYXRlZCh0eXBlLCBoeXBlcnR5VVJMKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGZvciAobGV0IGh5cGVydHkgaW4gX3RoaXMuaHlwZXJ0aWVzTGlzdCkge1xyXG4gICAgICBsZXQgdmFsdWUgPSBfdGhpcy5oeXBlcnRpZXNMaXN0W2h5cGVydHldO1xyXG5cclxuICAgICAgaWYgKHZhbHVlLl9oeXBlcnR5VVJMID09PSBoeXBlcnR5VVJMKSB7XHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICBjYXNlICd1c2VybmFtZSc6XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5fdXNlci51c2VybmFtZTtcclxuICAgICAgICAgIGNhc2UgJ2NuJzpcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLl91c2VyLmNuO1xyXG4gICAgICAgICAgY2FzZSAnbG9jYWxlJzpcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLl91c2VyLmxvY2FsZTtcclxuICAgICAgICAgIGNhc2UgJ2F2YXRhcic6XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5fdXNlci5hdmF0YXI7XHJcbiAgICAgICAgICBjYXNlICd1c2VyVVJMJzpcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLl91c2VyLnVzZXJVUkw7XHJcbiAgICAgICAgICBjYXNlICcuJzpcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLl91c2VyO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBzYW5kYm94IGluc3RhbmNlIHdoZXJlIHRoZSBBcHBsaWNhdGlvbiBpcyBleGVjdXRpbmcuIEl0IGlzIGFzc3VtZWQgdGhlcmUgaXMganVzdCBvbmUgQXBwIHBlciBSdW50aW1lIGluc3RhbmNlLlxyXG4gICovXHJcbiAgZ2V0QXBwU2FuZGJveCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuYXBwU2FuZGJveDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB1c2VyIGFzc29jaWF0ZWQgdG8gdGhlIGh5cGVydHkgVVJMXHJcbiAgKiBAcGFyYW0gICAge1N0cmluZ30gICAgaHlwZXJ0eVVSTCAgICAgIGh5cGVydHkgVVJMXHJcbiAgKiBAcmV0dXJuICAge1N0cmluZ30gICAgdXNlclVSTCAgICAgICAgIHVzZXIgVVJMXHJcbiAgKi9cclxuICBnZXRIeXBlcnR5T3duZXIoaHlwZXJ0eVVSTCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgdXNlclVSTDtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCBpbiBfdGhpcy5oeXBlcnRpZXNMaXN0KSB7XHJcbiAgICAgIGxldCBoeXBlcnR5ID0gX3RoaXMuaHlwZXJ0aWVzTGlzdFtpbmRleF07XHJcblxyXG4gICAgICBpZiAoaHlwZXJ0eS5oeXBlcnR5VVJMID09PSBoeXBlcnR5VVJMKSB7XHJcbiAgICAgICAgcmV0dXJuIGh5cGVydHkudXNlci51c2VyVVJMO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlclVSTDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB1c2VyIGFzc29jaWF0ZWQgdG8gdGhlIGh5cGVydHkgVVJMXHJcbiAgKiBAcGFyYW0gICAge1N0cmluZ30gICAgZGF0YU9iamVjdFVSTCAgICAgIGRhdGFPYmplY3RVUkwgVVJMXHJcbiAgKiBAcmV0dXJuICAge1N0cmluZ30gICAgdXNlclVSTCAgICAgICAgIHVzZXIgVVJMXHJcbiAgKi9cclxuICBnZXREYXRhT2JqZWN0UmVwb3J0ZXIoZGF0YU9iamVjdFVSTCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgRE91cmwgPSByZW1vdmVQYXRoRnJvbVVSTChkYXRhT2JqZWN0VVJMKTtcclxuICAgIGZvciAobGV0IGluZGV4IGluIF90aGlzLmRhdGFPYmplY3RMaXN0KSB7XHJcbiAgICAgIGxldCBkYXRhT2JqZWN0ID0gX3RoaXMuZGF0YU9iamVjdExpc3RbaW5kZXhdO1xyXG5cclxuICAgICAgaWYgKGRhdGFPYmplY3QudXJsID09PSBET3VybCkge1xyXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0LnJlcG9ydGVyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogcmV0dXJucyB0aGUgaHlwZXJ0eSBOYW1lIGZyb20gYSBnaXZlbiB1cmwuIFRoaXMgdXJsIGNvdWxkIGJlIGZyb20gYSBkYXRhT2JqZWN0IG9yIGh5cGVydHlcclxuICAqIEBwYXJhbSAgICB7U3RyaW5nfSAgICB1cmwgICAgICBoeXBlcnR5IG9yIGRhdGFPYmplY3QgVVJMXHJcbiAgKiBAcmV0dXJuICAge1N0cmluZ30gICAgaHlwZXJ0eU5hbWUgICAgIGh5cGVydHkgTmFtZVxyXG4gICovXHJcbiAgZ2V0SHlwZXJ0eU5hbWUodXJsKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBpc0h5cGVydHlVUkwgPSBkaXZpZGVVUkwodXJsKS50eXBlID09PSAnaHlwZXJ0eSc7XHJcblxyXG4gICAgLy92YWx1ZSB0byBiZSByZXR1cm5lZCBpbiB0aGUgZW5kXHJcbiAgICBsZXQgaHlwZXJ0eU5hbWU7XHJcblxyXG4gICAgLy9pZiBpcyBub3QgYW4gaHlwZXJ0eSwgY2hlY2sgaWYgaXMgYSBkYXRhT2JqZWN0IGFuZCBvYnRhaW4gaGlzIHJlcG9ydGVyXHJcbiAgICBsZXQgaHlwZXJ0eVVSTCA9IGlzSHlwZXJ0eVVSTCA/IHVybCA6IF90aGlzLmdldFJlcG9ydGVyVVJMU3luY2hvbm91cyh1cmwpO1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4IGluIF90aGlzLmh5cGVydGllc0xpc3QpIHtcclxuICAgICAgbGV0IGh5cGVydHkgPSBfdGhpcy5oeXBlcnRpZXNMaXN0W2luZGV4XTtcclxuICAgICAgaWYgKGh5cGVydHkuaHlwZXJ0eVVSTCA9PT0gaHlwZXJ0eVVSTCkge1xyXG4gICAgICAgIGh5cGVydHlOYW1lID0gaHlwZXJ0eS5vYmplY3ROYW1lO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaHlwZXJ0eU5hbWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgcmVwb3J0ZXJVUkwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhb2JqZWN0IFVSTFxyXG4gICogQHBhcmFtICAgIHtTdHJpbmd9ICAgICBkYXRhT2JqZWN0VVJMICAgIGRhdGFPYmplY3RVUkxcclxuICAqIEByZXR1cm4gICB7U3RyaW5nfSAgICAgcmVwb3J0ZXJVUkwgICAgICByZXBvcnRlclVSTFxyXG4gICovXHJcbiAgZ2V0UmVwb3J0ZXJVUkwoZGF0YU9iamVjdFVSTCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsZXQgZGF0YU9iamVjdCA9IF90aGlzLmRhdGFPYmplY3RMaXN0W2RhdGFPYmplY3RVUkxdO1xyXG5cclxuICAgICAgaWYgKGRhdGFPYmplY3QpIHtcclxuICAgICAgICByZXNvbHZlKGRhdGFPYmplY3QucmVwb3J0ZXIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlamVjdCgnTm8gcmVwb3J0ZXIgd2FzIGZvdW5kJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byByZXR1cm4gdGhlIHJlcG9ydGVyVVJMIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YW9iamVjdCBVUkwuIG5vIHByb21pc2UgcmV0dXJuZWRcclxuICAqIEBwYXJhbSAgICB7U3RyaW5nfSAgICAgZGF0YU9iamVjdFVSTCAgICBkYXRhT2JqZWN0VVJMXHJcbiAgKiBAcmV0dXJuICAge1N0cmluZ30gICAgIHJlcG9ydGVyVVJMICAgICAgcmVwb3J0ZXJVUkxcclxuICAqL1xyXG4gIGdldFJlcG9ydGVyVVJMU3luY2hvbm91cyhkYXRhT2JqZWN0VVJMKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBkYXRhT2JqZWN0ID0gX3RoaXMuZGF0YU9iamVjdExpc3RbZGF0YU9iamVjdFVSTF07XHJcblxyXG4gICAgcmV0dXJuIChkYXRhT2JqZWN0KSA/IGRhdGFPYmplY3QucmVwb3J0ZXIgOiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIHJldHVybnMgdGhlIGh5cGVydHkgVVJMIHRoYXQgc3Vic2NyaWJlZCB0aGUgZGF0YU9iamVjdFxyXG4gICogQHBhcmFtICAgIHtTdHJpbmd9ICAgICB1cmwgICAgICAgICAgICB1cmwgZm9ybWF0XHJcbiAgKiBAcmV0dXJuICAge1N0cmluZ30gICAgSHlwZXJ0eSBVUkwgc3Vic2NyaWJlZCB0byB0aGUgVVJMXHJcbiAgKi9cclxuICBnZXREYXRhT2JqZWN0U3Vic2NyaWJlckh5cGVydHkodXJsKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBfdGhpcy5zdWJzY3JpYmVkRGF0YU9iamVjdExpc3RbdXJsXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogcmVnaXN0ZXIgYSBkZXNpcmVkIGRhdGFPYmplY3QgdG8gc3Vic2NyaWJlXHJcbiAgKiBAcGFyYW0gICAge1N0cmluZ30gICAgZGF0YU9iamVjdFVSTCAgICAgIGRhdGFPYmplY3QgVVJMXHJcbiAgKi9cclxuICByZWdpc3RlclN1YnNjcmliZWREYXRhT2JqZWN0KGRhdGFPYmplY3RVUkwsIGh5cGVydHlVUkwpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBpZiAoX3RoaXMuc3Vic2NyaWJlZERhdGFPYmplY3RMaXN0W2RhdGFPYmplY3RVUkxdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgX3RoaXMuc3Vic2NyaWJlZERhdGFPYmplY3RMaXN0W2RhdGFPYmplY3RVUkxdID0gaHlwZXJ0eVVSTDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBsaXN0IG9mIHByZSBhdXRob3Jpc2VkIHVzZXJzIHJlY2VpdmVkIGluIHRoZSBjcmVhdGlvbiBvZiBhIGRhdGEgb2JqZWN0XHJcbiAgKiBAcGFyYW0gICAge1N0cmluZ30gICAgICAgICAgICBkYXRhT2JqZWN0VVJMICAgIGRhdGFPYmplY3RVUkxcclxuICAqIEByZXR1cm4gICB7QXJyYXk8U3RyaW5nPn0gICAgIHByZUF1dGggICAgICAgICBMaXN0IG9mIHByZSBhdXRob3Jpc2VkIHVzZXJzXHJcbiAgKi9cclxuICBnZXRQcmVBdXRoU3Vic2NyaWJlcnMoZGF0YU9iamVjdFVSTCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBkYXRhT2JqZWN0ID0gX3RoaXMuZGF0YU9iamVjdExpc3RbZGF0YU9iamVjdFVSTF07XHJcbiAgICBsZXQgcHJlQXV0aCA9IFtdO1xyXG5cclxuICAgIGlmIChkYXRhT2JqZWN0KSB7XHJcbiAgICAgIHByZUF1dGggPSBkYXRhT2JqZWN0LmF1dGhvcmlzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcmVBdXRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBzZW5kIHJlcXVlc3RzIHRvIHVucmVnaXN0ZXIgYWxsIGh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeVxyXG4gICogQHJldHVybiAgIHtQcm9taXNlfSAgICAgcmV0dXJuIGEgcHJvbWlzZSBpZiB0aGUgcmVzdWx0IG9mIHVucmVnaXN0cmF0aW9uIGFsbCBoeXBlcnRpZXNcclxuICAqL1xyXG4gIHVucmVnaXN0ZXJBbGxIeXBlcnRpZXMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCB1bnJlZ2lzdGVyUmVzdWx0cyA9IFtdO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGZvciAobGV0IGluZGV4IGluIF90aGlzLmh5cGVydGllc0xpc3QpIHtcclxuICAgICAgICBsZXQgaHlwZXJ0eSA9IF90aGlzLmh5cGVydGllc0xpc3RbaW5kZXhdO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBfdGhpcy51bnJlZ2lzdGVySHlwZXJ0eUluc3RhbmNlKGh5cGVydHkuaHlwZXJ0eVVSTCk7XHJcbiAgICAgICAgdW5yZWdpc3RlclJlc3VsdHMucHVzaChyZXN1bHQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBQcm9taXNlLmFsbCh1bnJlZ2lzdGVyUmVzdWx0cykudGhlbigoKSA9PiB7XHJcblxyXG4gICAgICAgIHJlc29sdmUoJ3N1Y2Nlc3NmdWxseSB1bnJlZ2lzdGVyZWQgYWxsIGh5cGVydGllcycpO1xyXG4gICAgICB9LCBlcnJvciA9PiB7IHJlamVjdChlcnJvcik7IH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqICBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIGFuIGh5cGVydHlJbnN0YW5jZSBpbiB0aGUgRG9tYWluIFJlZ2lzdHJ5XHJcbiAgKiAgQHBhcmFtICAge1N0cmluZ30gICAgICBoeXBlcnR5SW5zdGFuY2UgICBIeXBlcnR5SW5zbnRhbmNlIHVybFxyXG4gICpcclxuICAqL1xyXG4gIHVucmVnaXN0ZXJIeXBlcnR5SW5zdGFuY2UoaHlwZXJ0eUluc3RhbmNlKSB7XHJcbiAgICAvL1RPRE8gd29ya2luZyBidXQgdGhlIHVzZXJcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGNsb3NlTXNnID0geyB0eXBlOiAnZXhlY3V0ZScsIGZyb206IF90aGlzLnJlZ2lzdHJ5VVJMLFxyXG4gICAgICB0bzogaHlwZXJ0eUluc3RhbmNlLFxyXG4gICAgICBib2R5OiB7IG1ldGhvZDogJ2Nsb3NlJyB9fTtcclxuXHJcbiAgICAvLyBTZW5kIG1lc3NhZ2UgdG8gaHlwZXJ0eSB0byBjbG9zZVxyXG4gICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UoY2xvc2VNc2csIChyZXBseSkgPT4ge1xyXG4gICAgICBsb2cubG9nKCdbUmVnaXN0cnkudW5yZWdpc3Rlckh5cGVydHlJbnN0YW5jZV0gQ2xvc2UgUmVwbHknLCByZXBseSk7XHJcblxyXG4gICAgICBfdGhpcy5fZG9tYWluUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXJIeXBlcnR5KGh5cGVydHlJbnN0YW5jZSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqICBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIGEgRGF0YSBPYmplY3QgaW4gdGhlIERvbWFpbiBSZWdpc3RyeVxyXG4gICogIEBwYXJhbSAgIHtTdHJpbmd9ICAgICAgaHlwZXJ0eUluc3RhbmNlICAgSHlwZXJ0eUluc250YW5jZSB1cmxcclxuICAqXHJcbiAgKi9cclxuICB1bnJlZ2lzdGVyRGF0YU9iamVjdCh1cmwpIHtcclxuICAgIHRoaXMuX2RvbWFpblJlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyRGF0YU9iamVjdCh1cmwpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICogcmVnaXN0ZXIgYSBuZXcgc3Vic2NyaWJlciBpbiB0aGUgZGF0YU9iamVjdCByZWdpc3RlcmVkXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgZGF0YU9iamVjdFVSTCAgICBkYXRhT2JqZWN0IFVSTFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgIHN1YnNjcmliZXJVUkwgICAgc3Vic2NyaWJlciBVUkxcclxuICAqL1xyXG4gIHJlZ2lzdGVyU3Vic2NyaWJlcihkYXRhT2JqZWN0VVJMLCBzdWJzY3JpYmVyVVJMKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGRhdGFPYmplY3QgPSBfdGhpcy5kYXRhT2JqZWN0TGlzdFtkYXRhT2JqZWN0VVJMXTtcclxuXHJcbiAgICBpZiAoZGF0YU9iamVjdCkge1xyXG5cclxuICAgICAgaWYgKCFkYXRhT2JqZWN0LnN1YnNjcmliZXJzKSBkYXRhT2JqZWN0LnN1YnNjcmliZXJzID0gW107XHJcblxyXG4gICAgICBkYXRhT2JqZWN0LnN1YnNjcmliZXJzLnB1c2goc3Vic2NyaWJlclVSTCk7XHJcbiAgICAgIF90aGlzLmRhdGFPYmplY3RMaXN0W2RhdGFPYmplY3RVUkxdID0gZGF0YU9iamVjdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZ2V0IHRoZSBzdWJzY3JpYmVycyByZWdpc3RlcmVkIHdpdGhpbiBhIGRhdGFPYmplY3RcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgZGF0YU9iamVjdFVSTCAgICBkYXRhT2JqZWN0IFVSTFxyXG4gICogQHBhcmFtICB7QXJyYXk8U3RyaW5nPn0gICBTdWJzdHJpYmVycyBMaXN0XHJcbiAgKi9cclxuICBnZXREYXRhT2JqZWN0U3Vic2NyaWJlcnMoZGF0YU9iamVjdFVSTCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBkYXRhT2JqZWN0ID0gX3RoaXMuZGF0YU9iamVjdExpc3RbZGF0YU9iamVjdFVSTF07XHJcblxyXG4gICAgaWYgKGRhdGFPYmplY3QpIHtcclxuICAgICAgcmV0dXJuIGRhdGFPYmplY3Quc3Vic2NyaWJlcnM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyAnTm8gZGF0YU9iamVjdCB3YXMgZm91bmQnO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVG8gcmVnaXN0ZXIgYSBuZXcgRGF0YSBPYmplY3QgaW4gdGhlIHJ1bnRpbWUgd2hpY2ggcmV0dXJucyB0aGUgZGF0YU9iamVjdFVSTCBhbGxvY2F0ZWQgdG8gdGhlIG5ldyBEYXRhIE9iamVjdC5cclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgaWRlbnRpZmllclxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgIGRhdGFPYmplY3RzY2hlbWEgICAgICAgICAgICBkYXRhT2JqZWN0c2NoZW1hXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgZGF0YU9iamVjdFVybCAgICAgICAgICAgICAgIGRhdGFPYmplY3RVcmxcclxuICAqIEBwYXJhbSB7U3RyaW5nfSAgICAgIGRhdGFPYmplY3RSZXBvcnRlciAgICAgICAgICAgZGF0YU9iamVjdFJlcG9ydGVyXHJcbiAgKiBAcGFyYW0gIHtBcnJheX0gICAgIHJlc291cmNlcyAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QgcmVzb3VyY2VzXHJcbiAgKiBAcGFyYW0gIHtBcnJheX0gICAgIGF1dGhvcmlzZSAgICAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgcHJlIGF1dGhvcmlzZWQgYXV0aG9yaXNlZCBJRHNcclxuICAqL1xyXG4gIC8vcmVnaXN0ZXJEYXRhT2JqZWN0KGlkZW50aWZpZXIsIGRhdGFPYmplY3RzY2hlbWEsIGRhdGFPYmplY3RVcmwsIGRhdGFPYmplY3RSZXBvcnRlciwgcmVzb3VyY2VzLCBhZGRyZXNzVVJMLCBhdXRob3Jpc2UpIHtcclxuICByZWdpc3RlckRhdGFPYmplY3Qob2JqZWN0UmVnaXN0cmF0aW9uKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCByZWdpc3RyYXRpb24gPSBkZWVwQ2xvbmUob2JqZWN0UmVnaXN0cmF0aW9uKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG5cclxuICAgICAgX3RoaXMuZGF0YU9iamVjdExpc3Rbb2JqZWN0UmVnaXN0cmF0aW9uLnVybF0gPSBvYmplY3RSZWdpc3RyYXRpb247XHJcblxyXG4vLyAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCgncmVnaXN0cnk6RGF0YU9iamVjdFVSTHMnKS50aGVuKCh1cmxzTGlzdCkgPT4ge1xyXG5cclxuLyogICAgICAgIGlmICghdXJsc0xpc3QpIHtcclxuICAgICAgICAgIHVybHNMaXN0ID0ge307XHJcbiAgICAgICAgfSovXHJcblxyXG4gICAgICAgIC8vdXBkYXRlIHRoZSBsaXN0IHdpdGggdGhlIG5ldyBlbGVtZW50c1xyXG4gICAgICAgIF90aGlzLl9kYXRhT2JqZWN0VXJsc1tvYmplY3RSZWdpc3RyYXRpb24ubmFtZSArIG9iamVjdFJlZ2lzdHJhdGlvbi5zY2hlbWEgKyBvYmplY3RSZWdpc3RyYXRpb24ucmVzb3VyY2VzICsgb2JqZWN0UmVnaXN0cmF0aW9uLnJlcG9ydGVyXSA9IG9iamVjdFJlZ2lzdHJhdGlvbi51cmw7XHJcblxyXG4gICAgICAgIC8vIHN0ZXAgdG8gb2J0YWluIHRoZSBsaXN0IG9mIGFsbCBVUkwgcmVnaXN0ZXJlZCB0byB1cGRhdGVkIHdpdGggdGhlIG5ldyBvbmUuXHJcbiAgICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuc2V0KCdyZWdpc3RyeTpEYXRhT2JqZWN0VVJMcycsIDAsIF90aGlzLl9kYXRhT2JqZWN0VXJscykudGhlbigoKSA9PiB7XHJcblxyXG4gICAgICAgICAgaWYgKF90aGlzLmlzSW50ZXJ3b3JraW5nUHJvdG9TdHViKHJlZ2lzdHJhdGlvbi5yZXBvcnRlcikpIHtcclxuICAgICAgICAgICAgcmVnaXN0cmF0aW9uLmludGVyd29ya2luZyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IGRvbWFpblJlZ2lzdHJhdGlvbiA9IHRydWU7XHJcblxyXG4gICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbi5oYXNPd25Qcm9wZXJ0eShcImRvbWFpbl9yZWdpc3RyYXRpb25cIikpXHJcbiAgICAgICAgICBkb21haW5SZWdpc3RyYXRpb24gPSByZWdpc3RyYXRpb24uZG9tYWluX3JlZ2lzdHJhdGlvbjtcclxuXHJcbiAgICAgICAgICBpZiAoZG9tYWluUmVnaXN0cmF0aW9uKVxyXG4gICAgICAgICAgICBfdGhpcy5fZG9tYWluUmVnaXN0cmF0aW9uLnJlZ2lzdGVyRGF0YU9iamVjdChyZWdpc3RyYXRpb24sb2JqZWN0UmVnaXN0cmF0aW9uLnJlc3VtZSwgX3RoaXMucDJwSGFuZGxlclN0dWIpLnRoZW4oKCByZWdpc3RlcmVkICkgPT57IHJlc29sdmUocmVnaXN0ZXJlZCkgfSk7XHJcbiAgICAgICAgICBlbHNlIHJlc29sdmUocmVnaXN0cmF0aW9uKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICBsb2cuZXJyb3IoJ1tSZWdpc3RyeSByZWdpc3RlckRhdGFPYmplY3RdIEVycm9yOiAnLCByZWFzb24pO1xyXG4gICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4vLyAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBfZ2V0UmVzb3VyY2VzQW5kU2NoZW1lcyhkZXNjcmlwdG9yKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PiB7XHJcblxyXG4gICAgICBsZXQgcmVzb3VyY2VzO1xyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgdGhlIGh5cGVydHkgcmVzb3VyY2VzIGlzIGEgdmVjdG9yIG9yIGEgc3RyaW5nXHJcbiAgICAgIC8vIFRPRE8gZGVsZXRlIGxhdGVyIHdoZW4gY2F0YWxvZ3VlIGlzIGZpeGVkXHJcbiAgICAgIGlmICh0eXBlb2YgKGRlc2NyaXB0b3IuaHlwZXJ0eVR5cGUpID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJlc291cmNlcyA9IFtdO1xyXG4gICAgICAgIHJlc291cmNlcy5wdXNoKGRlc2NyaXB0b3IuaHlwZXJ0eVR5cGUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc291cmNlcyA9IGRlc2NyaXB0b3IuaHlwZXJ0eVR5cGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBvYmpOYW1lID0gZGVzY3JpcHRvci5vYmplY3ROYW1lO1xyXG5cclxuICAgICAgbGV0IGRlc2NyaXB0b3JEYXRhU2NoZW1hID0gZGVzY3JpcHRvci5kYXRhT2JqZWN0cztcclxuICAgICAgbGV0IGRhdGFTY2hlbWFzQXJyYXkgPSBbXTtcclxuXHJcbiAgICAgIC8vdGhpcyB3aWxsIGNyZWF0ZSBhIGFycmF5IHdpdGggYSBQcm9taXNlIGluIGVhY2ggcG9zaXRpb25cclxuICAgICAgZm9yIChsZXQgaW5kZXggaW4gZGVzY3JpcHRvckRhdGFTY2hlbWEpIHtcclxuICAgICAgICBkYXRhU2NoZW1hc0FycmF5LnB1c2goX3RoaXMucnVudGltZUNhdGFsb2d1ZS5nZXREYXRhU2NoZW1hRGVzY3JpcHRvcihkZXNjcmlwdG9yRGF0YVNjaGVtYVtpbmRleF0pKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gYXMgc29vbiBhcyB0aGUgcHJldmlvdXMgYXJyYXkgaXMgY29tcGxldGVkLCB0aGlzIHdpbGwgd2FpdCBmb3IgdGhlIHJlc29sdmUgb2YgYWxsIHByb21pc2VzIGluIHRoZSBhcnJheVxyXG4gICAgICBQcm9taXNlLmFsbChkYXRhU2NoZW1hc0FycmF5KS50aGVuKGZ1bmN0aW9uKGRhdGFTY2hlbWFzKSB7XHJcblxyXG4gICAgICAgIGxldCBmaWx0ZXJlZERhdGFTY2hlbWFzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaW5kZXggaW4gZGF0YVNjaGVtYXMpIHtcclxuICAgICAgICAgIGxldCBkYXRhU2NoZW1hID0gZGF0YVNjaGVtYXNbaW5kZXhdO1xyXG4gICAgICAgICAgZmlsdGVyZWREYXRhU2NoZW1hcy5wdXNoKGRhdGFTY2hlbWEuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlLnByb3BlcnRpZXMuc2NoZW1lKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeV0gSHlwZXJ0eSBTY2hlbWFzJywgZmlsdGVyZWREYXRhU2NoZW1hcyk7XHJcbiAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5XSBIeXBlcnR5IHJlc291cmNlcycsIHJlc291cmNlcyk7XHJcblxyXG4gICAgICAgIHJlc29sdmUoe3Jlc291cmNlczogcmVzb3VyY2VzLCBkYXRhU2NoZW1hOiBmaWx0ZXJlZERhdGFTY2hlbWFzLCBuYW1lOiBvYmpOYW1lfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIG1ldGhvZCB0aGF0IHJldHVybnMgcHJldmlvdXNseSByZWdpc3RlcmVkIEh5cGVydHkgb3IgRGF0YU9iamVjdHMgVVJMUywgZm9yIGdpdmVuIGNoYXJhY3RlcmlzdGljc1xyXG4gICogQHBhcmFtICB7SlNPTn0gICAgICAgIGluZm8gICAgICAgICAgIG9iamVjdCBvciBoeXBlcnR5IGNoYXJhdGVyaXN0aWNzIGluZm9cclxuICAqIEByZXR1cm4ge2FkZHJlc3NVUkx9ICBhZGRyZXNzVVJMICAgICByZXR1cm4gdGhlIFVSTCBpZiB0aGVyZSBpcyBhbnkgcHJldmlvdXN5IHJlZ2lzdGVyZWQgVVJMLCByZXR1cm4gdW5kZWZpbmVkIG90aGVyd2lzZVxyXG4gICovXHJcbiAgY2hlY2tSZWdpc3RlcmVkVVJMcyhpbmZvLCByZXVzZVVSTCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHJcbiAgICAgIGxldCBvYmplY3RUeXBlID0gKGluZm8ucmVwb3J0ZXIpID8gJ3JlZ2lzdHJ5OkRhdGFPYmplY3RVUkxzJyA6ICdyZWdpc3RyeTpIeXBlcnR5VVJMcyc7XHJcblxyXG4gICAgICBpZiAodHlwZW9mKHJldXNlVVJMKSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICBvYmplY3RUeXBlID0gcmV1c2VVUkwgJiYgZGl2aWRlVVJMKHJldXNlVVJMKS50eXBlICE9PSAnaHlwZXJ0eScgPyAncmVnaXN0cnk6RGF0YU9iamVjdFVSTHMnIDogJ3JlZ2lzdHJ5Okh5cGVydHlVUkxzJztcclxuICAgICAgfVxyXG4gICAgICAvL2RlYnVnZ2VyO1xyXG4gICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5nZXQob2JqZWN0VHlwZSkudGhlbigodXJsc0xpc3QpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKCF1cmxzTGlzdCkge1xyXG4gICAgICAgICAgdXJsc0xpc3QgPSB7fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YocmV1c2VVUkwpID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIGNoZWNrUmVnaXN0ZXJlZFVSTHNdIC0gbG9vayBmb3IgJyArIHJldXNlVVJMICsgJyBvbiAnLCB1cmxzTGlzdCk7XHJcblxyXG4gICAgICAgICAgbGV0IHNlYXJjaFJlc3VsdCA9IE9iamVjdC5rZXlzKHVybHNMaXN0KS5tYXAoKGtleSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaW5kZXhPZiA9IHVybHNMaXN0W2tleV0uaW5kZXhPZihyZXVzZVVSTCk7XHJcbiAgICAgICAgICAgIHJldHVybiB1cmxzTGlzdFtrZXldW2luZGV4T2ZdO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIGNoZWNrUmVnaXN0ZXJlZFVSTHNdIC0gZm91bmQgJyArIHNlYXJjaFJlc3VsdC5sZW5ndGggKyAnIHJlc3VsdHMgb24gJywgc2VhcmNoUmVzdWx0KTtcclxuICAgICAgICAgIGlmIChzZWFyY2hSZXN1bHQubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHNlYXJjaFJlc3VsdCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG9iamVjdFR5cGUgPT09ICdyZWdpc3RyeTpIeXBlcnR5VVJMcycpIHtcclxuICAgICAgICAgIF90aGlzLl9nZXRSZXNvdXJjZXNBbmRTY2hlbWVzKGluZm8pLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh1cmxzTGlzdFt2YWx1ZS5yZXNvdXJjZXMgKyB2YWx1ZS5kYXRhU2NoZW1hICsgdmFsdWUubmFtZV0pIHtcclxuICAgICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnldIHJldXNhZ2Ugb2YgaHlwZXJ0eSBVUkwnKTtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh1cmxzTGlzdFt2YWx1ZS5yZXNvdXJjZXMgKyB2YWx1ZS5kYXRhU2NoZW1hICsgdmFsdWUubmFtZV0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeV0gbm8gaHlwZXJ0eSBVUkwgd2FzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCAnKTtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgIGxldCBjaGFyYWN0ZXJpc3RpY3MgPSBpbmZvLm5hbWUgKyBpbmZvLnNjaGVtYSArIGluZm8ucmVzb3VyY2VzICsgaW5mby5yZXBvcnRlcjtcclxuXHJcbiAgICAgICAgICBpZiAodXJsc0xpc3RbY2hhcmFjdGVyaXN0aWNzXSkge1xyXG4gICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnldIHJldXNhZ2Ugb2YgZGF0YU9iamVjdCBVUkwnKTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZih1cmxzTGlzdFtjaGFyYWN0ZXJpc3RpY3NdKSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICBsZXQgYXJyYXlUb1Jlc29sdmUgPSBbXTtcclxuICAgICAgICAgICAgICBhcnJheVRvUmVzb2x2ZS5wdXNoKHVybHNMaXN0W2NoYXJhY3RlcmlzdGljc10pO1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGFycmF5VG9SZXNvbHZlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh1cmxzTGlzdFtjaGFyYWN0ZXJpc3RpY3NdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5XSBubyBkYXRhT2JqZWN0IFVSTCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkJyk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgKiBUbyByZWdpc3RlciBhIG5ldyBIeXBlcnR5IGluIHRoZSBydW50aW1lIHdoaWNoIHJldHVybnMgdGhlIEh5cGVydHlVUkwgYWxsb2NhdGVkIHRvIHRoZSBuZXcgSHlwZXJ0eS5cclxuICAqIEBwYXJhbSAge1NhbmRib3h9ICAgICAgICAgICAgIHNhbmRib3ggICAgICAgICAgICAgICBzYW5kYm94XHJcbiAgKiBAcGFyYW0gIHtIeXBlcnR5Q2F0YWxvZ3VlVVJMfSBIeXBlcnR5Q2F0YWxvZ3VlVVJMICAgZGVzY3JpcHRvclxyXG4gICogQHBhcmFtIHtvYmplY3R9IElkcENvbnN0cmFpbnQgLSBjb25zdHJhaW50cyB0byBiZSB1c2VkIHdoZW4gc2VsZWN0aW5nIHRoZSBpZGVudGl0eSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIEh5cGVydHkgaW5jbHVkaW5nIG9yaWdpbiwgaWRwLCBhbmQgaWRIaW50LlxyXG4gICogQHJldHVybiB7SHlwZXJ0eVVSTH0gICAgICAgICAgSHlwZXJ0eVVSTFxyXG4gICovXHJcbiAgcmVnaXN0ZXJIeXBlcnR5KHNhbmRib3gsIGltcG9ydFBhdGgsIGRlc2NyaXB0b3IsIGFkZHJlc3NVUkwsIElkcENvbnN0cmFpbnQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGh5cGVydHlDYXBhYmlsaXRpZXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuXHJcbiAgICAgIF90aGlzLmlkTW9kdWxlLmdldElkZW50aXR5QXNzZXJ0aW9uKElkcENvbnN0cmFpbnQpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XHJcblxyXG4gICAgICAgIGxldCB1c2VyUHJvZmlsZSA9IHJlc3VsdC51c2VyUHJvZmlsZTtcclxuXHJcbiAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IHJlZ2lzdGVySHlwZXJ0eV0gdXNlclByb2ZpbGUnLCB1c2VyUHJvZmlsZSk7XHJcblxyXG4gICAgICAgIGlmIChfdGhpcy5fbWVzc2FnZUJ1cyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICByZWplY3QoJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIE1lc3NhZ2VCdXMgaXMgdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vY2FsbCBjaGVjayBpZiB0aGUgcHJvdG9zdHViIGV4aXN0OiB0byBiZSByZW1vdmVkXHJcbiAgICAgICAgICAvKiAgX3RoaXMucmVzb2x2ZShkb21haW5VcmwpLnRoZW4oZnVuY3Rpb24oYSkge1xyXG4gICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgcmVnaXN0ZXJIeXBlcnR5XSBzdHViIHRvIGRvbWFpbiByZWdpc3RyeS0gJywgYSk7Ki9cclxuXHJcbi8vICAgICAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCgncmVnaXN0cnk6SHlwZXJ0eVVSTHMnKS50aGVuKCh1cmxzTGlzdCkgPT4ge1xyXG5cclxuICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIHN0b3JhZ2VNYW5hZ2VyXSAtICcsIHVybHNMaXN0KTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLl9nZXRSZXNvdXJjZXNBbmRTY2hlbWVzKGRlc2NyaXB0b3IpLnRoZW4oKHZhbHVlKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgIGh5cGVydHlDYXBhYmlsaXRpZXMgPSB2YWx1ZTtcclxuXHJcbi8qICAgICAgICAgICAgICBpZiAoIXVybHNMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICB1cmxzTGlzdCA9IHt9O1xyXG4gICAgICAgICAgICAgIH0qL1xyXG5cclxuICAgICAgICAgICAgICBfdGhpcy5faHlwZXJ0eVVybHNbaHlwZXJ0eUNhcGFiaWxpdGllcy5yZXNvdXJjZXMgKyBoeXBlcnR5Q2FwYWJpbGl0aWVzLmRhdGFTY2hlbWEgKyBoeXBlcnR5Q2FwYWJpbGl0aWVzLm5hbWVdID0gYWRkcmVzc1VSTC5hZGRyZXNzO1xyXG4gICAgICAgICAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldCgncmVnaXN0cnk6SHlwZXJ0eVVSTHMnLCAwLCBfdGhpcy5faHlwZXJ0eVVybHMpLnRoZW4oKCkgPT4ge1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAvL2NoZWNrIHdoZXRoZXIgdGhlIHJlY2VpdmVkIHNhbmJveCBlIEFwcGxpY2F0aW9uU2FuZGJveCBvciBhIG5vcm1hbCBzYW5kYm94XHJcbiAgICAgICAgICAgICAgICBpZiAoc2FuZGJveC50eXBlID09PSAnYXBwJykge1xyXG4gICAgICAgICAgICAgICAgICBfdGhpcy5zYW5kYm94ZXNMaXN0LmFwcFNhbmRib3hbYWRkcmVzc1VSTC5hZGRyZXNzWzBdXSA9IHNhbmRib3g7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNhbmRib3gudHlwZSA9PT0gJ25vcm1hbCcpIHtcclxuICAgICAgICAgICAgICAgICAgX3RoaXMuc2FuZGJveGVzTGlzdC5zYW5kYm94W2FkZHJlc3NVUkwuYWRkcmVzc1swXV0gPSBzYW5kYm94O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmVqZWN0KCdXcm9uZyBTYW5kYm94VHlwZScpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwMnBIYW5kbGVyO1xyXG4gICAgICAgICAgICAgICAgbGV0IHAycFJlcXVlc3RlcjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoX3RoaXMucDJwSGFuZGxlclN0dWIpLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICBwMnBIYW5kbGVyID0gX3RoaXMucDJwSGFuZGxlclN0dWJbX3RoaXMucnVudGltZVVSTF0udXJsO1xyXG4gICAgICAgICAgICAgICAgICBwMnBSZXF1ZXN0ZXIgPSBydW50aW1lVXRpbHMucnVudGltZURlc2NyaXB0b3IucDJwUmVxdWVzdGVyU3R1YjtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgaHlwZXJ0eSA9IG5ldyBIeXBlcnR5SW5zdGFuY2UoX3RoaXMuaWRlbnRpZmllciwgX3RoaXMucmVnaXN0cnlVUkwsIGltcG9ydFBhdGgsIGRlc2NyaXB0b3IsXHJcbiAgICAgICAgICAgICAgICAgIGFkZHJlc3NVUkwuYWRkcmVzc1swXSwgdXNlclByb2ZpbGUsICdndWlkJywgX3RoaXMucnVudGltZVVSTCwgJ2N0eCcsIHAycEhhbmRsZXIsXHJcbiAgICAgICAgICAgICAgICAgcDJwUmVxdWVzdGVyLCBoeXBlcnR5Q2FwYWJpbGl0aWVzLmRhdGFTY2hlbWEsIGh5cGVydHlDYXBhYmlsaXRpZXMucmVzb3VyY2VzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5oeXBlcnRpZXNMaXN0LnB1c2goaHlwZXJ0eSk7XHJcblxyXG4gICAgICAgICAgICAgICAgLyotLS0gc3RhcnQgaGVyZSBtb3ZlIHAycCBhbmQgZG9tYWluIHJlZ2lzdHJ5IHJlbGF0ZWQgZmVhdHVyZXMgdG8gYSBzZXBhcmF0ZWQgZnVuY3Rpb24uLS0tLS0tLS4uKi9cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgcmVnaXN0cmF0aW9uQXRkb21haW4gPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICggZGVzY3JpcHRvci5oYXNPd25Qcm9wZXJ0eShcIl9jb25maWd1cmF0aW9uXCIpICYmIGRlc2NyaXB0b3IuY29uZmlndXJhdGlvbi5oYXNPd25Qcm9wZXJ0eShcImRvbWFpbl9yZWdpc3RyYXRpb25cIikpIHtcclxuICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uQXRkb21haW4gPSBkZXNjcmlwdG9yLmNvbmZpZ3VyYXRpb24uZG9tYWluX3JlZ2lzdHJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbkF0ZG9tYWluKSBfdGhpcy5fZG9tYWluUmVnaXN0cmF0aW9uLnJlZ2lzdGVySHlwZXJ0eShoeXBlcnR5LCBhZGRyZXNzVVJMLm5ld0FkZHJlc3MpLnRoZW4oKHJlZ2lzdGVyZWQpPT4ge3Jlc29sdmUocmVnaXN0ZXJlZCl9KTtcclxuICAgICAgICAgICAgICAgICAgZWxzZSByZXNvbHZlKHsgdXJsOiBoeXBlcnR5Lmh5cGVydHlVUkx9KTtcclxuXHJcbiAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIEhFUkUgTU9WRSBET01BSU4gUkVHSVNUUlkgLS0tLS0tLS0tLS0tLS0tLS0tKi9cclxuICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIEVycm9yOiAnLCByZWFzb24pO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgIHJlamVjdCgnW1JlZ2lzdHJ5IHJlZ2lzdGVySHlwZXJ0eV0gJywgZXJyKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgKiBUbyB1bnJlZ2lzdGVyIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIEh5cGVydHlcclxuICAqIEBwYXJhbSAge0h5cGVydHlVUkx9ICAgICAgICAgIEh5cGVydHlVUkwgdXJsICAgICAgICB1cmxcclxuICAqL1xyXG4gIHVucmVnaXN0ZXJIeXBlcnR5KHVybCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcclxuICAgICAgbGV0IGluZGV4ID0gMDtcclxuXHJcbiAgICAgIGZvclx0KGluZGV4ID0gMDsgaW5kZXggPCBfdGhpcy5oeXBlcnRpZXNMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGxldCBoeXBlcnR5ID0gX3RoaXMuaHlwZXJ0aWVzTGlzdFtpbmRleF07XHJcbiAgICAgICAgaWYgKGh5cGVydHkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgaWYgKGh5cGVydHkuaHlwZXJ0eVVSTCA9PT0gdXJsKSB7XHJcbiAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZm91bmQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgcmVqZWN0KCdIeXBlcnR5IG5vdCBmb3VuZCcpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRlbGV0ZSBfdGhpcy5oeXBlcnRpZXNMaXN0W2luZGV4XTtcclxuICAgICAgICByZXNvbHZlKCdIeXBlcnR5IHN1Y2Nlc3NmdWxseSBkZWxldGVkJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVG8gZGlzY292ZXIgcHJvdG9jb2wgc3R1YnMgYXZhaWxhYmxlIGluIHRoZSBydW50aW1lIGZvciBhIGNlcnRhaW4gZG9tYWluLiBJZiBhdmFpbGFibGUsIGl0IHJldHVybnMgdGhlIHJ1bnRpbWUgdXJsIGZvciB0aGUgcHJvdG9jb2wgc3R1YiB0aGF0IGNvbm5lY3RzIHRvIHRoZSByZXF1ZXN0ZWQgZG9tYWluLiBSZXF1aXJlZCBieSB0aGUgcnVudGltZSBCVVMgdG8gcm91dGUgbWVzc2FnZXMgdG8gcmVtb3RlIHNlcnZlcnMgb3IgcGVlcnMgKGRvIHdlIG5lZWQgc29tZXRoaW5nIHNpbWlsYXIgZm9yIEh5cGVydGllcz8pLlxyXG4gICogQHBhcmFtICB7RG9tYWluVVJMfSAgICAgICAgICAgRG9tYWluVVJMICAgICAgICAgICAgdXJsXHJcbiAgKiBAcmV0dXJuIHtSdW50aW1lVVJMfSAgICAgICAgICAgUnVudGltZVVSTFxyXG4gICovXHJcbiAgZGlzY292ZXJQcm90b3N0dWIodXJsKSB7XHJcbiAgICBpZiAoIXVybCkgdGhyb3cgbmV3IEVycm9yKCdQYXJhbWV0ZXIgdXJsIG5lZWRlZCcpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTCh1cmwpO1xyXG4gICAgbGV0IGRvbWFpblVSTCA9IGRpdmlkZWRVUkwuZG9tYWluO1xyXG5cclxuICAgIGlmIChfdGhpcy5wcm90b3N0dWJzTGlzdC5oYXNPd25Qcm9wZXJ0eShkb21haW5VUkwpICYmIF90aGlzLnByb3Rvc3R1YnNMaXN0W2RvbWFpblVSTF0uc3RhdHVzID09PSBTVEFUVVMuTElWRSkge1xyXG4gICAgICByZXR1cm4gKF90aGlzLnByb3Rvc3R1YnNMaXN0W2RvbWFpblVSTF0pO1xyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIF90aGlzLnByb3Rvc3R1YnNMaXN0W2RvbWFpblVSTF0gPSB7XHJcbiAgICAgICAgc3RhdHVzOiBTVEFUVVMuREVQTE9ZSU5HXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWdpc3RyeSAtIGRpc2NvdmVyUHJvdG9TdHViIF0gTWVzc2FnZSBOb2RlIFByb3Rvc3R1YiBOb3QgRm91bmQuIENyZWF0aW5nIG9uZScpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFRvIGRpc2NvdmVyIHByb3RvY29sIHN0dWJzIGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZSBmb3IgYSBjZXJ0YWluIHJlbW90ZSBydW50aW1lIFVSTC4gSWYgYXZhaWxhYmxlLCBpdCByZXR1cm5zIHRoZSBydW50aW1lIHVybCBmb3IgdGhlIHByb3RvY29sIHN0dWIgdGhhdCBjb25uZWN0cyB0byB0aGUgcmVxdWVzdGVkIGRvbWFpbi5cclxuICAqIFJlcXVpcmVkIGJ5IHRoZSBydW50aW1lIEJVUyB0byByb3V0ZSBtZXNzYWdlcyB0byByZW1vdGUgc2VydmVycyBvciBwZWVycyAoZG8gd2UgbmVlZCBzb21ldGhpbmcgc2ltaWxhciBmb3IgSHlwZXJ0aWVzPykuXHJcbiAgKiBAcGFyYW0gIHtSdW50aW1lVVJMfSAgICAgICAgICAgUnVudGltZVVSTCAgICAgICAgICAgIHVybFxyXG4gICogQHJldHVybiB7cDJwUmVxdWVzdGVyfSAgICAgICAgICAgUnVudGltZVVSTFxyXG4gICovXHJcbiAgZGlzY292ZXJQMlBTdHViKHJ1bnRpbWVVUkwpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgaWYgKHJ1bnRpbWVVUkwpIHtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5wMnBSZXF1ZXN0ZXJTdHViLmhhc093blByb3BlcnR5KHJ1bnRpbWVVUkwpICYmIF90aGlzLnAycFJlcXVlc3RlclN0dWJbcnVudGltZVVSTF0uc3RhdHVzID09PSBTVEFUVVMuTElWRSkge1xyXG4gICAgICAgIHJldHVybiAoX3RoaXMucDJwUmVxdWVzdGVyU3R1YltydW50aW1lVVJMXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgX3RoaXMucDJwUmVxdWVzdGVyU3R1YltydW50aW1lVVJMXSA9IHtcclxuICAgICAgICAgIHN0YXR1czogU1RBVFVTLkNSRUFURURcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWdpc3RyeSAtIGRpc2NvdmVyUDJQU3R1YiBdIFAyUCBSZXF1ZXN0ZXIgU3R1YiBOb3QgRm91bmQuIENyZWF0aW5nIG9uZScpO1xyXG5cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5wMnBIYW5kbGVyU3R1Yi5oYXNPd25Qcm9wZXJ0eShfdGhpcy5ydW50aW1lVVJMKSkge1xyXG4gICAgICAgIHJldHVybiAoX3RoaXMucDJwSGFuZGxlclN0dWJbX3RoaXMucnVudGltZVVSTF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aGlzLnAycEhhbmRsZXJTdHViW190aGlzLnJ1bnRpbWVVUkxdID0ge1xyXG4gICAgICAgICAgc3RhdHVzOiBTVEFUVVMuQ1JFQVRFRFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignW1JlZ2lzdHJ5IC0gZGlzY292ZXJQMlBTdHViIF0gUDJQIEhhbmRsZXIgU3R1YiBOb3QgRm91bmQuJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG8gcmVnaXN0ZXIgYSBuZXcgUHJvdG9jb2wgU3R1YiBpbiB0aGUgcnVudGltZSBpbmNsdWRpbmcgYXMgaW5wdXQgcGFyYW1ldGVycyB0aGUgZnVuY3Rpb24gdG8gcG9zdE1lc3NhZ2UsIHRoZSBEb21haW5VUkwgdGhhdCBpcyBjb25uZWN0ZWQgd2l0aCB0aGUgc3R1Yiwgd2hpY2ggcmV0dXJucyB0aGUgUnVudGltZVVSTCBhbGxvY2F0ZWQgdG8gdGhlIG5ldyBQcm90b2NvbFN0dWIuXHJcbiAgICogQHBhcmFtICB7U2FuZGJveH0gICAgICAgU2FuZGJveFxyXG4gICAqIEBwYXJhbSAge3N0dWJJRH0gICAgICAgIERvbWFpbiBvciBoeXBlcnR5IHJ1bnRpbWUgdG8gcmVnaXN0ZXIgdGhlIHN0dWJcclxuICAgKiBAcGFyYW0gIHtkZXNjcmlwdG9yVVJMfSAgICAgQ2F0YWxvZ3VlIFVSTCBvZiB0aGUgUHJvdG9zdHViIGRlc2NyaXB0b3JcclxuICAgKiBAcGFyYW0gIHtkZXNjcmlwdG9yfSAgICAgUHJvdG9zdHViIGRlc2NyaXB0b3JcclxuICAgKiBAcmV0dXJuIHtSdW50aW1lUHJvdG9TdHViVVJMfVxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyU3R1YihzYW5kYm94LCBzdHViSUQsIHAycENvbmZpZywgZGVzY3JpcHRvclVSTCwgZGVzY3JpcHRvcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgX3N0dWJEZXNjcmlwdG9yID0gZGVzY3JpcHRvcjtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsZXQgcnVudGltZVByb3RvU3R1YlVSTDtcclxuXHJcbiAgICAgIC8vY2hlY2sgaWYgbWVzc2FnZUJ1cyBpcyByZWdpc3RlcmVkIGluIHJlZ2lzdHJ5IG9yIG5vdFxyXG4gICAgICBpZiAoX3RoaXMuX21lc3NhZ2VCdXMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJlamVjdCgnTWVzc2FnZUJ1cyBub3QgZm91bmQgb24gcmVnaXN0ZXJTdHViJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkgLSByZWdpc3RlclN0dWJdIC0gc3R1YklEICcsIHN0dWJJRCk7XHJcblxyXG4gICAgICAvKiBpZiAoIXN0dWJJRC5pbmRleE9mKCdtc2ctbm9kZS4nKSkge1xyXG4gICAgICAgIHN0dWJJRCA9IHN0dWJJRC5zdWJzdHJpbmcoc3R1YklELmluZGV4T2YoJy4nKSArIDEpO1xyXG4gICAgICB9Ki9cclxuXHJcbiAgICAgIGxldCBQMlBSZXF1ZXN0ZXJTdHViO1xyXG5cclxuICAgICAgaWYgKHAycENvbmZpZykge1xyXG5cclxuICAgICAgICBpZiAocDJwQ29uZmlnLmhhc093blByb3BlcnR5KCdpc0hhbmRsZXJTdHViJykgJiYgcDJwQ29uZmlnLmlzSGFuZGxlclN0dWIpIHtcclxuICAgICAgICAgIHJ1bnRpbWVQcm90b1N0dWJVUkwgPSBfdGhpcy5wMnBIYW5kbGVyVVJMO1xyXG5cclxuICAgICAgICAgIF90aGlzLnAycEhhbmRsZXJTdHViW3N0dWJJRF0gPSB7XHJcbiAgICAgICAgICAgIHVybDogcnVudGltZVByb3RvU3R1YlVSTCxcclxuICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVMuQ1JFQVRFRFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBfdGhpcy5wMnBIYW5kbGVyQXNzb2NpYXRpb25bX3RoaXMucnVudGltZVVSTF0gPSBbXTtcclxuXHJcbiAgICAgICAgICBfdGhpcy5zYW5kYm94ZXNMaXN0LnNhbmRib3hbcnVudGltZVByb3RvU3R1YlVSTF0gPSBzYW5kYm94O1xyXG4gICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIHJlZ2lzdGVyU3R1YiAtIFAyUEhhbmRsZXJTdHViXSAtICcsIHN0dWJJRCwgJyAtICcsIHJ1bnRpbWVQcm90b1N0dWJVUkwpO1xyXG4gICAgICAgICAgcmVzb2x2ZShfdGhpcy5wMnBIYW5kbGVyU3R1YltzdHViSURdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgUDJQUmVxdWVzdGVyU3R1YiA9IHAycENvbmZpZy5wMnBSZXF1ZXN0ZXJTdHViO1xyXG4gICAgICAgICAgcnVudGltZVByb3RvU3R1YlVSTCA9ICdydW50aW1lOi8vJyArIGRpdmlkZVVSTChwMnBDb25maWcucmVtb3RlUnVudGltZVVSTCkuZG9tYWluICsgJy9wMnByZXF1ZXN0ZXIvJyArIGdlbmVyYXRlR1VJRCgpO1xyXG4gICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIHJlZ2lzdGVyU3R1YiAtIFAyUFJlcXVlc3RlclN0dWJdIC0gJywgUDJQUmVxdWVzdGVyU3R1YiwgJyAtICcsIHJ1bnRpbWVQcm90b1N0dWJVUkwpO1xyXG5cclxuICAgICAgICAgIC8vIHRvIGJlIGNsYXJpZmllZCB3aGF0IGlzIHRoaXMgcDJwSGFuZGxlckFzc29jaWF0aW9uXHJcbiAgICAgICAgICBfdGhpcy5wMnBIYW5kbGVyQXNzb2NpYXRpb25bX3RoaXMucnVudGltZVVSTF0ucHVzaChydW50aW1lUHJvdG9TdHViVVJMKTtcclxuICAgICAgICAgIF90aGlzLnAycFJlcXVlc3RlclN0dWJbc3R1YklEXSA9IHtcclxuICAgICAgICAgICAgdXJsOiBydW50aW1lUHJvdG9TdHViVVJMLFxyXG4gICAgICAgICAgICBzdGF0dXM6IFNUQVRVUy5DUkVBVEVEXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIF90aGlzLnNhbmRib3hlc0xpc3Quc2FuZGJveFtydW50aW1lUHJvdG9TdHViVVJMXSA9IHNhbmRib3g7XHJcblxyXG4gICAgICAgICAgLy9TZXR1cCBQMlAgUmVxdWVzdGVyIHBhdGggaW50byBNTlxyXG5cclxuICAgICAgICAgIGxldCBtc2cgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdzdWJzY3JpYmUnLFxyXG4gICAgICAgICAgICBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCxcclxuICAgICAgICAgICAgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgX3RoaXMuX2RvbWFpbiArICcvc20nLFxyXG4gICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgc3Vic2NyaWJlOiBbcnVudGltZVByb3RvU3R1YlVSTF0sXHJcbiAgICAgICAgICAgICAgc291cmNlOiBfdGhpcy5yZWdpc3RyeVVSTFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSAtIHJlZ2lzdGVyIFN0dWJdIHAycFJlcXVlc3RlciBwYXRoIHNldHVwOiAnLCByZXBseSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICByZXNvbHZlKF90aGlzLnAycFJlcXVlc3RlclN0dWJbc3R1YklEXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbUmVnaXN0cnkgLSByZWdpc3RlclN0dWIgLSBOb3JtYWwgU3R1Yl0gZGVzY3JpcHRvcicsIGRlc2NyaXB0b3IpO1xyXG5cclxuICAgICAgICBpZiAoICF0eXBlb2YoZGVzY3JpcHRvcikgPT09ICdzdHJpbmcnICYmIGRlc2NyaXB0b3IuaGFzT3duUHJvcGVydHkoJ19pbnRlcndvcmtpbmcnKSAmJiBkZXNjcmlwdG9yLl9pbnRlcndvcmtpbmcpIHtcclxuICAgICAgICAgIHJ1bnRpbWVQcm90b1N0dWJVUkwgPSAncnVudGltZTovLycgKyBzdHViSUQgKyAnL3Byb3Rvc3R1Yi8nICsgJ3NjaGVtZTEnO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBydW50aW1lUHJvdG9TdHViVVJMID0gJ3J1bnRpbWU6Ly8nICsgc3R1YklEICsgJy9wcm90b3N0dWIvJyArIGdlbmVyYXRlR1VJRCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIHJlZ2lzdGVyU3R1YiAtIE5vcm1hbCBTdHViXSAtICcsIHN0dWJJRCk7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IE9wdGltaXplIHRoaXNcclxuICAgICAgICBfdGhpcy5wcm90b3N0dWJzTGlzdFtzdHViSURdID0ge1xyXG4gICAgICAgICAgdXJsOiBydW50aW1lUHJvdG9TdHViVVJMLFxyXG4gICAgICAgICAgc3RhdHVzOiBTVEFUVVMuREVQTE9ZSU5HXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGRlc2NyaXB0b3JVUkwpIHtcclxuICAgICAgICAgIF90aGlzLnByb3Rvc3R1YnNMaXN0W3N0dWJJRF0uZGVzY3JpcHRvclVSTCA9IGRlc2NyaXB0b3JVUkw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoX3N0dWJEZXNjcmlwdG9yICYmIChfc3R1YkRlc2NyaXB0b3IuaW50ZXJ3b3JraW5nKSkge1xyXG4gICAgICAgICAgX3RoaXMucHJvdG9zdHVic0xpc3Rbc3R1YklEXS5pbnRlcndvcmtpbmcgPSBfc3R1YkRlc2NyaXB0b3IuaW50ZXJ3b3JraW5nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX3RoaXMuc2FuZGJveGVzTGlzdC5zYW5kYm94W3J1bnRpbWVQcm90b1N0dWJVUkxdID0gc2FuZGJveDtcclxuXHJcbiAgICAgICAgcmVzb2x2ZShfdGhpcy5wcm90b3N0dWJzTGlzdFtzdHViSURdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gcmVzb2x2ZShydW50aW1lUHJvdG9TdHViVVJMKTtcclxuXHJcbiAgICAgIF90aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKHJ1bnRpbWVQcm90b1N0dWJVUkwgKyAnL3N0YXR1cycsIChtc2cpID0+IHtcclxuICAgICAgICBfdGhpcy5fb25Qcm90b3N0dWJTdGF0dXNFdmVudChtc2cpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFRvIFByb2Nlc3Mgc3RhdHVzIGV2ZW50cyBmaXJlZCBieSBwcm90b3N0dWJzXHJcbiAgKiBAcGFyYW0gIHtNZXNzYWdlfSAgIG1lc3NhZ2UgICAgIEV2ZW50IE1lc3NhZ2VcclxuICAqL1xyXG5cclxuICBfb25Qcm90b3N0dWJTdGF0dXNFdmVudChtc2cpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSBvblByb3Rvc3R1YlN0YXR1c0V2ZW50XTogJywgbXNnKTtcclxuXHJcbiAgICBsZXQgcnVudGltZVByb3RvU3R1YlVSTCA9IG1zZy5mcm9tO1xyXG5cclxuICAgIGlmICghbXNnLnRvLmluY2x1ZGVzKCcvc3RhdHVzJykpIHtcclxuICAgICAgbG9nLmVycm9yKCdbUmVnaXN0cnkgb25Qcm90b3N0dWJTdGF0dXNFdmVudF0gTm90IFN0YXR1cyBFdmVudDogJywgbXNnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHsvLyBicm9hZGNhc3QgUHJvdG9zdHViIHN0YXR1cyBldmVudCB0byBhbGwgSHlwZXJ0aWVzXHJcbiAgICAgIGxldCBmcm9tID0gIG1zZy5mcm9tO1xyXG4gICAgICBtc2cuZnJvbSA9IF90aGlzLnJ1bnRpbWVVUkw7XHJcbiAgICAgIG1zZy50byA9IF90aGlzLnJ1bnRpbWVVUkwrJy9zdGF0dXMnO1xyXG4gICAgICBtc2cuYm9keS5yZXNvdXJjZSA9IGZyb207XHJcbiAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcHJvY2VzcyBzdGF0dXMgZXZlbnRzIGZyb20gbWVzc2FnZSBub2RlIHByb3Rvc3R1YnNcclxuXHJcbiAgICBpZiAocnVudGltZVByb3RvU3R1YlVSTC5pbmNsdWRlcygnL3Byb3Rvc3R1Yi8nKSkge1xyXG5cclxuICAgIC8vIFRPRE86IHVuY29tbWVudCBiZWxvdyB3aGVuIHByb3Rvc3R1YnMgYXJlIHVwZGF0ZWQgd2l0aCBuZXcgc3RhdHVzIHZhbHVlIFwibGl2ZVwiXHJcbiAgICAgIE9iamVjdC5rZXlzKF90aGlzLnByb3Rvc3R1YnNMaXN0KS5maWx0ZXIoKGtleSkgPT4ge1xyXG4gICAgICAgIHJldHVybiBfdGhpcy5wcm90b3N0dWJzTGlzdFtrZXldLnVybCA9PT0gcnVudGltZVByb3RvU3R1YlVSTDtcclxuICAgICAgfSkubWFwKChrZXkpID0+IHtcclxuICAgICAgICBfdGhpcy5wcm90b3N0dWJzTGlzdFtrZXldLnN0YXR1cyA9IG1zZy5ib2R5LnZhbHVlO1xyXG5cclxuICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgLSBvblByb3Rvc3R1YlN0YXR1c0V2ZW50XSAtIFByb3Rvc3R1YiBzdGF0dXM6ICcsIF90aGlzLnByb3Rvc3R1YnNMaXN0W2tleV0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7IC8vIHByb2Nlc3Mgc3RhdHVzIGV2ZW50cyBmcm9tIHAycCBjb25uZWN0aW9uc1xyXG5cclxuICAgICAgaWYgKG1zZy5ib2R5LnJlc291cmNlKSB7XHJcbiAgICAgICAgbGV0IHJlbW90ZVJ1bnRpbWVVUkwgPSBtc2cuYm9keS5yZXNvdXJjZTtcclxuXHJcbiAgICAgICAgaWYgKF90aGlzLnAycENvbm5lY3Rpb25MaXN0W3JlbW90ZVJ1bnRpbWVVUkxdKSB7XHJcbiAgICAgICAgICBfdGhpcy5wMnBDb25uZWN0aW9uTGlzdFtyZW1vdGVSdW50aW1lVVJMXS5zdGF0dXMgPSAgbXNnLmJvZHkudmFsdWU7XHJcbiAgICAgICAgICBfdGhpcy5wMnBDb25uZWN0aW9uTGlzdFtyZW1vdGVSdW50aW1lVVJMXS51cmwgPSAgcnVudGltZVByb3RvU3R1YlVSTDtcclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgIGxldCAgcDJwQ29ubmVjdGlvbiA9IHtcclxuICAgICAgICAgICAgc3RhdHVzOiBtc2cuYm9keS52YWx1ZSxcclxuICAgICAgICAgICAgdXJsOiBydW50aW1lUHJvdG9TdHViVVJMXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIF90aGlzLnAycENvbm5lY3Rpb25MaXN0W3JlbW90ZVJ1bnRpbWVVUkxdID0gIHAycENvbm5lY3Rpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgLSBvblByb3Rvc3R1YlN0YXR1c0V2ZW50XSAtIFAyUENvbm5lY3Rpb24gc3RhdHVzOiAnLCBfdGhpcy5wMnBDb25uZWN0aW9uTGlzdFtyZW1vdGVSdW50aW1lVVJMXSk7XHJcblxyXG4gICAgICAgIC8vIFVwZGF0ZSBQMlAgUmVxdWVzdGVyIHByb3Rvc3R1YiBpZiBpdCBpcyBjb21pbmcgZnJvbSB0aGVyZVxyXG4gICAgICAgIGlmIChydW50aW1lUHJvdG9TdHViVVJMLmluY2x1ZGVzKCcvcDJwcmVxdWVzdGVyLycpKSB7XHJcbiAgICAgICAgICBfdGhpcy5wMnBSZXF1ZXN0ZXJTdHViW3JlbW90ZVJ1bnRpbWVVUkxdLnN0YXR1cyA9IG1zZy5ib2R5LnZhbHVlO1xyXG5cclxuICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSAtIG9uUHJvdG9zdHViU3RhdHVzRXZlbnRdIC0gUDJQIFJlcXVlc3RlciBzdGF0dXM6ICcsIF90aGlzLnAycFJlcXVlc3RlclN0dWJbcmVtb3RlUnVudGltZVVSTF0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBpZiBmcm9tIFAyUEhhbmRsZXIgd2l0aCBzdGF0dXMgZGlzY29uZW5jdGVkLCBsZXRzIHJlbW92ZSBmcm9tIHAycENvbm5lY3Rpb25MaXN0XHJcbiAgICAgICAgICBpZiAobXNnLmJvZHkudmFsdWUgPT09ICdkaXNjb25uZWN0ZWQnKSBkZWxldGUgX3RoaXMucDJwQ29ubmVjdGlvbkxpc3RbcmVtb3RlUnVudGltZVVSTF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAocnVudGltZVByb3RvU3R1YlVSTC5pbmNsdWRlcygnL3AycHJlcXVlc3Rlci8nKSkge1xyXG4gICAgICAgICAgLy8gSXQgaXMgYW4gZXZlbnQgZnJvbSBQMlAgUmVxdWVzdGVyIHdpdGhvdXQgbWFuZGF0b3J5IFwicmVzb3VyY2VcIiBmaWVsZFxyXG4gICAgICAgICAgbG9nLmVycm9yKCdbUmVnaXN0cnkgb25Qcm90b3N0dWJTdGF0dXNFdmVudF0gcmVzb3VyY2UgbWlzc2luZzogJywgbXNnKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gSXQgaXMgYW4gZXZlbnQgZnJvbSBQMlAgSGFuZGxlclxyXG4gICAgICAgICAgX3RoaXMucDJwSGFuZGxlclN0dWJbX3RoaXMucnVudGltZVVSTF0uc3RhdHVzID0gbXNnLmJvZHkudmFsdWU7XHJcblxyXG4gICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gb25Qcm90b3N0dWJTdGF0dXNFdmVudF0gLSBQMlBIYW5kbGVyIFN0dWIgc3RhdHVzOiAnLCBfdGhpcy5wMnBIYW5kbGVyU3R1YltfdGhpcy5ydW50aW1lVVJMXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVG8gdW5yZWdpc3RlciBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBwcm90b2NvbCBzdHViXHJcbiAgKiBAcGFyYW0gIHtIeXBlcnR5UnVudGltZVVSTH0gICBIeXBlcnR5UnVudGltZVVSTCAgICAgaHlwZXJ0eVJ1bnRpbWVVUkxcclxuICAqL1xyXG4gIHVucmVnaXN0ZXJTdHViKGh5cGVydHlSdW50aW1lVVJMKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5wcm90b3N0dWJzTGlzdC5oYXNPd25Qcm9wZXJ0eShoeXBlcnR5UnVudGltZVVSTCkpIHtcclxuICAgICAgICBkZWxldGUgX3RoaXMucHJvdG9zdHVic0xpc3RbaHlwZXJ0eVJ1bnRpbWVVUkxdO1xyXG4gICAgICAgIHJlc29sdmUoJ1Byb3Rvc3R1YlVSTCByZW1vdmVkJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVqZWN0KCdFcnJvciBvbiB1bnJlZ2lzdGVyU3R1YjogSHlwZXJ0eSBub3QgZm91bmQnKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUbyByZWdpc3RlciBhIG5ldyBJZGVudGl0eSBQcm92aWRlciBwcm94eSBpbiB0aGUgcnVudGltZSBpbmNsdWRpbmcgYXMgaW5wdXQgcGFyYW1ldGVycyB0aGUgZnVuY3Rpb24gdG8gcG9zdE1lc3NhZ2UsIHRoZSBEb21haW5VUkwgdGhhdCBpcyBjb25uZWN0ZWQgd2l0aCB0aGUgc3R1Yiwgd2hpY2ggcmV0dXJucyB0aGUgUnVudGltZVVSTCBhbGxvY2F0ZWQgdG8gdGhlIG5ldyBQcm90b2NvbFN0dWIuXHJcbiAgICogQHBhcmFtIHtTYW5kYm94fSAgICAgICAgU2FuZGJveFxyXG4gICAqIEBwYXJhbSAge0RvbWFpblVSTH0gICAgIERvbWFpblVSTCBzZXJ2aWNlIHByb3ZpZGVyIGRvbWFpblxyXG4gICAqIEByZXR1cm4ge1J1bnRpbWVJZHBQcm94eVVSTH1cclxuICAgKi9cclxuICByZWdpc3RlcklkcFByb3h5KHNhbmRib3gsIGRvbWFpblVSTCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsZXQgaWRwUHJveHlTdHViVVJMO1xyXG5cclxuICAgICAgLy9jaGVjayBpZiBtZXNzYWdlQnVzIGlzIHJlZ2lzdGVyZWQgaW4gcmVnaXN0cnkgb3Igbm90XHJcbiAgICAgIGlmIChfdGhpcy5fbWVzc2FnZUJ1cyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmVqZWN0KCdNZXNzYWdlQnVzIG5vdCBmb3VuZCBvbiByZWdpc3RlclN0dWInKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWRwUHJveHlTdHViVVJMID0gJ2RvbWFpbi1pZHA6Ly8nICsgZG9tYWluVVJMICsgJy9zdHViLycgKyBnZW5lcmF0ZUdVSUQoKTtcclxuXHJcbiAgICAgIC8vIFRPRE86IE9wdGltaXplIHRoaXNcclxuICAgICAgX3RoaXMuaWRwUHJveHlMaXN0W2RvbWFpblVSTF0gPSB7XHJcbiAgICAgICAgdXJsOiBpZHBQcm94eVN0dWJVUkwsXHJcbiAgICAgICAgc3RhdHVzOiBTVEFUVVMuREVQTE9ZSU5HXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBfdGhpcy5zYW5kYm94ZXNMaXN0LnNhbmRib3hbaWRwUHJveHlTdHViVVJMXSA9IHNhbmRib3g7XHJcblxyXG4gICAgICAvLyBzYW5kYm94LmFkZExpc3RlbmVyKCcqJywgZnVuY3Rpb24obXNnKSB7XHJcbiAgICAgIC8vICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnKTtcclxuICAgICAgLy8gfSk7XHJcblxyXG4gICAgICByZXNvbHZlKGlkcFByb3h5U3R1YlVSTCk7XHJcblxyXG4gICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5hZGRMaXN0ZW5lcihpZHBQcm94eVN0dWJVUkwgKyAnL3N0YXR1cycsIChtc2cpID0+IHtcclxuICAgICAgICBfdGhpcy5fb25JZHBQcm94eVN0YXR1c0V2ZW50KG1zZyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFRvIFByb2Nlc3Mgc3RhdHVzIGV2ZW50cyBmaXJlZCBieSBJZHAgUHJveGllc1xyXG4gICogQHBhcmFtICB7TWVzc2FnZX0gICBtZXNzYWdlICAgICBFdmVudCBNZXNzYWdlXHJcbiAgKi9cclxuXHJcbiAgX29uSWRwUHJveHlTdGF0dXNFdmVudChtc2cpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSBvbklkcFByb3h5U3RhdHVzRXZlbnRdOiAnLCBtc2cpO1xyXG5cclxuICAgIGxldCBpZHBQcm94eVVSTCA9IG1zZy5mcm9tO1xyXG5cclxuICAgIGlmICghbXNnLnRvLmluY2x1ZGVzKCcvc3RhdHVzJykpIHtcclxuICAgICAgbG9nLmVycm9yKCdbUmVnaXN0cnkgb25JZHBQcm94eVN0YXR1c0V2ZW50XSBOb3QgU3RhdHVzIEV2ZW50OiAnLCBtc2cpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmtleXMoX3RoaXMuaWRwUHJveHlMaXN0KS5maWx0ZXIoKGtleSkgPT4ge1xyXG4gICAgICByZXR1cm4gX3RoaXMuaWRwUHJveHlMaXN0W2tleV0udXJsID09PSBpZHBQcm94eVVSTDtcclxuICAgIH0pLm1hcCgoa2V5KSA9PiB7XHJcbiAgICAgIF90aGlzLmlkcFByb3h5TGlzdFtrZXldLnN0YXR1cyA9IG1zZy5ib2R5LnZhbHVlO1xyXG5cclxuICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gb25JZHBQcm94eVN0YXR1c0V2ZW50XSAtIElkcCBQcm94eSBzdGF0dXM6ICcsIF90aGlzLmlkcFByb3h5TGlzdFtrZXldKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVG8gZGlzY292ZXIgaWRwUHJveHkgc3R1YnMgYXZhaWxhYmxlIGluIHRoZSBydW50aW1lIGZvciBhIGNlcnRhaW4gZG9tYWluLiBJZiBhdmFpbGFibGUsIGl0IHJldHVybnMgdGhlIHJ1bnRpbWUgdXJsIGZvciB0aGUgaWRwUHJveHkgc3R1YiB0aGF0IGNvbm5lY3RzIHRvIHRoZSByZXF1ZXN0ZWQgZG9tYWluLiBSZXF1aXJlZCBieSB0aGUgcnVudGltZSBCVVMgdG8gcm91dGUgbWVzc2FnZXMgdG8gcmVtb3RlIHNlcnZlcnMgb3IgcGVlcnNcclxuICAqIEBwYXJhbSAge0RvbWFpblVSTH0gICAgICAgICAgIERvbWFpblVSTCAgICAgICAgICAgIHVybFxyXG4gICogQHJldHVybiB7UnVudGltZVVSTH0gICAgICAgICAgIFJ1bnRpbWVVUkwgICAgICAgICBpZHBQcm94eVVybFxyXG4gICovXHJcbiAgZGlzY292ZXJJZHBQcm94eSh1cmwpIHtcclxuICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciB1cmwgbmVlZGVkJyk7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKHVybCk7XHJcbiAgICBsZXQgZG9tYWluVVJMID0gZGl2aWRlZFVSTC5kb21haW47XHJcblxyXG4gICAgaWYgKF90aGlzLmlkcFByb3h5TGlzdC5oYXNPd25Qcm9wZXJ0eShkb21haW5VUkwpICYmIF90aGlzLmlkcFByb3h5TGlzdFtkb21haW5VUkxdLnN0YXR1cyA9PT0gU1RBVFVTLkxJVkUpIHtcclxuICAgICAgcmV0dXJuIChfdGhpcy5pZHBQcm94eUxpc3RbZG9tYWluVVJMXSk7XHJcbiAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgX3RoaXMuaWRwUHJveHlMaXN0W2RvbWFpblVSTF0gPSB7XHJcbiAgICAgICAgc3RhdHVzOiBTVEFUVVMuUFJPR1JFU1NcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JlZ2lzdHJ5IC0gZGlzY292ZXJJZHBQcm94eSBdIElkcCBQcm94eSBOb3QgRm91bmQuIENyZWF0aW5nIG9uZScpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFRvIHJlZ2lzdGVyIGEgbmV3IFBvbGljeSBFbmZvcmNlciBpbiB0aGUgcnVudGltZSBpbmNsdWRpbmcgYXMgaW5wdXQgcGFyYW1ldGVycyB0aGUgZnVuY3Rpb24gdG8gcG9zdE1lc3NhZ2UsIHRoZSBIeXBlcnR5VVJMIGFzc29jaWF0ZWQgd2l0aCB0aGUgUEVQLCB3aGljaCByZXR1cm5zIHRoZSBSdW50aW1lVVJMIGFsbG9jYXRlZCB0byB0aGUgbmV3IFBvbGljeSBFbmZvcmNlciBjb21wb25lbnQuXHJcbiAgKiBAcGFyYW0gIHtNZXNzYWdlLk1lc3NhZ2V9IHBvc3RNZXNzYWdlIHBvc3RNZXNzYWdlXHJcbiAgKiBAcGFyYW0gIHtIeXBlcnR5VVJMfSAgICAgICAgICBIeXBlcnR5VVJMICAgICAgICAgICAgaHlwZXJ0eVxyXG4gICogQHJldHVybiB7SHlwZXJ0eVJ1bnRpbWVVUkx9ICAgSHlwZXJ0eVJ1bnRpbWVVUkxcclxuICAqL1xyXG4gIHJlZ2lzdGVyUEVQKHBvc3RNZXNzYWdlLCBoeXBlcnR5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlKSB7XHJcbiAgICAgIC8vVE9ETyBjaGVjayB3aGF0IHBhcmFtZXRlciBpbiB0aGUgcG9zdE1lc3NhZ2UgdGhlIHBlcCBpcy5cclxuICAgICAgX3RoaXMucGVwTGlzdFtoeXBlcnR5XSA9IHBvc3RNZXNzYWdlO1xyXG4gICAgICByZXNvbHZlKCdQRVAgcmVnaXN0ZXJlZCB3aXRoIHN1Y2Nlc3MnKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVG8gdW5yZWdpc3RlciBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBwcm90b2NvbCBzdHViXHJcbiAgKiBAcGFyYW0gIHtIeXBlcnR5UnVudGltZVVSTH0gICBIeXBlcnR5UnVudGltZVVSTCAgICAgSHlwZXJ0eVJ1bnRpbWVVUkxcclxuICAqL1xyXG4gIHVucmVnaXN0ZXJQRVAoSHlwZXJ0eVJ1bnRpbWVVUkwpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IHJlc3VsdCA9IF90aGlzLnBlcExpc3RbSHlwZXJ0eVJ1bnRpbWVVUkxdO1xyXG5cclxuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmVqZWN0KCdQZXAgTm90IGZvdW5kLicpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoJ1BFUCBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4nKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBUbyBkaXNjb3ZlciBzYW5kYm94ZXMgYXZhaWxhYmxlIGluIHRoZSBydW50aW1lIGZvciBhIGNlcnRhaW4gZG9tYWluIGFuZCBhIGNlcnRhaW4gc2V0IG9mIGNhcGFiaWxpdGllcy4gUmVxdWlyZWQgYnkgdGhlIHJ1bnRpbWUgVUEgdG8gYXZvaWQgbW9yZSB0aGFuIG9uZSBzYW5kYm94IGZvciB0aGUgc2FtZSBkb21haW4uXHJcbiAgKiBAcGFyYW0gIHtEb21haW5VUkx9IERvbWFpblVSTCB1cmxcclxuICAqIEByZXR1cm4ge1J1bnRpbWVTYW5kYm94fSAgICAgICAgICAgUnVudGltZVNhbmRib3hcclxuICAqL1xyXG4gIGdldFNhbmRib3godXJsLCBjb25zdHJhaW50cykge1xyXG4gICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyIHVybCBuZWVkZWQnKTtcclxuXHJcbiAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgZ2V0U2FuZGJveF0gZ2V0U2FuZGJveCBmb3I6ICcsIHVybCwgJyBhbmQgY2FwYWJpbGl0aWVzOiAnLCBjb25zdHJhaW50cyk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGxldCByZXF1ZXN0O1xyXG5cclxuICAgICAgLy9maXJzdCB0cnkgdG8gZmluZCB0aGUgdXJsIGluIHRoZSBhcHBTYW5kYm94IGxpc3RcclxuICAgICAgcmVxdWVzdCA9IF90aGlzLnNhbmRib3hlc0xpc3QuYXBwU2FuZGJveFt1cmxdO1xyXG5cclxuICAgICAgLy9pZiBubyBhcHBTYW5kYm94IHdhcyBmb3VuZCwgdHJ5IHRvIHNlYXJjaCBpbiB0aGUgbm9ybWFsIHNhbmRib3hlcyBsaXN0XHJcbiAgICAgIGlmICghcmVxdWVzdCkge1xyXG4gICAgICAgIHJlcXVlc3QgPSBfdGhpcy5zYW5kYm94ZXNMaXN0LnNhbmRib3hbdXJsXTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XHJcblxyXG4gICAgICAgICAgbGV0IGRvbWFpbjtcclxuXHJcbiAgICAgICAgICBpZiAodXJsLmluY2x1ZGVzKCc6Ly8nKSkge1xyXG4gICAgICAgICAgICBkb21haW4gPSBkaXZpZGVVUkwodXJsKS5kb21haW47XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkb21haW4gPSB1cmw7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gc2VhcmNoIGluIHRoZSBzYW5kYm94ZXMgbGlzdCBmb3IgYSBlbnRyeSBjb250YWluaW5nIHRoZSBkb21haW4gZ2l2ZW5cclxuICAgICAgICAgIGZvciAobGV0IHNhbmRib3ggaW4gX3RoaXMuc2FuZGJveGVzTGlzdC5zYW5kYm94KSB7XHJcbiAgICAgICAgICAgIC8vdG9kbzogdW5jb21tZW50IHNhbmRib3ggY29uc3RyYWludHMgbWF0Y2ggY29uZGl0aW9uIHdpdGggcnVudGltZSBzaGFyaW5nXHJcbiAgICAgICAgICAgIGlmIChzYW5kYm94LmluY2x1ZGVzKGRvbWFpbikgJiYgX3RoaXMuc2FuZGJveGVzTGlzdC5zYW5kYm94W3NhbmRib3hdLm1hdGNoZXMoY29uc3RyYWludHMpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IF90aGlzLnNhbmRib3hlc0xpc3Quc2FuZGJveFtzYW5kYm94XTtcclxuICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IE9iamVjdC5rZXlzKGNvbnN0cmFpbnRzKS5maWx0ZXIoY29uc3RyYWludCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKGNvbnN0cmFpbnQgPT09ICdicm93c2VyJyAmJiBjdXJyZW50LnR5cGUgPT09IFNhbmRib3hUeXBlLk5PUk1BTCkgfHxcclxuICAgICAgICAgICAgICAgICAgICAgIChjb25zdHJhaW50ID09PSAnd2luZG93U2FuYm94JyAmJiBjdXJyZW50LnR5cGUgPT09IFNhbmRib3hUeXBlLldJTkRPVyk7XHJcblxyXG4gICAgICAgICAgICAgIH0pLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChtYXRjaCkgeyByZXF1ZXN0ID0gY3VycmVudDsgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIXJlcXVlc3QpIHtcclxuICAgICAgICByZWplY3QoJ25vIHNhbmRib3ggZm91bmQgZm9yOiAnICsgdXJsKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKHJlcXVlc3QpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXNvbHZlTm9ybWFsU3R1Yih1cmwpIHtcclxuICAgIC8vIGxvZy5sb2coJ3Jlc29sdmVOb3JtYWxTdHViICcgKyB1cmwpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgLy9zcGxpdCB0aGUgdXJsIHRvIGZpbmQgdGhlIGRvbWFpblVSTC4gZGVhbHMgd2l0aCB0aGUgdXJsIGZvciBleGFtcGxlIGFzOlxyXG4gICAgICAvL1wiaHlwZXJ0eS1ydW50aW1lOi8vc3AxL3Byb3Rvc3R1Yi8xMjNcIixcclxuICAgICAgbGV0IGRpdmlkZWRVUkwgPSBkaXZpZGVVUkwodXJsKTtcclxuICAgICAgbGV0IGRvbWFpblVybCA9IGRpdmlkZWRVUkwuZG9tYWluO1xyXG4gICAgICBsZXQgdHlwZSA9IGRpdmlkZWRVUkwudHlwZTtcclxuXHJcbiAgICAgIGlmICh1cmwuaW5jbHVkZXMoX3RoaXMucnVudGltZVVSTCkgfHwgdXJsLmluY2x1ZGVzKCc6Ly9zYW5kYm94LycpKSB7XHJcbiAgICAgICAgbG9nLmVycm9yKCdbUmVnaXN0cnkgLSByZXNvbHZlXSBVUkwgdG8gYmUgcmVzb2x2ZWQgc2hvdWxkIGhhdmUgbGlzdGVuZXJzICcsIHVybCk7XHJcbiAgICAgICAgcmVqZWN0KCdbUmVnaXN0cnkgLSByZXNvbHZlXSBVUkwgdG8gYmUgcmVzb2x2ZWQgc2hvdWxkIGhhdmUgbGlzdGVuZXJzICcsIHVybCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHJlc29sdmUgdGhlIGRvbWFpbiBwcm90b3N0dWIgaW4gY2FzZSBvZiBhIG1lc3NhZ2UgdG8gZ2xvYmFsIHJlZ2lzdHJ5XHJcbiAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ2dsb2JhbDovL3JlZ2lzdHJ5JykpIHtcclxuICAgICAgICBkb21haW5VcmwgPSBfdGhpcy5fZG9tYWluO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghZG9tYWluVXJsLmluZGV4T2YoJ21zZy1ub2RlLicpIHx8ICFkb21haW5VcmwuaW5kZXhPZigncmVnaXN0cnkuJykpIHtcclxuICAgICAgICAgIGRvbWFpblVybCA9IGRvbWFpblVybC5zdWJzdHJpbmcoZG9tYWluVXJsLmluZGV4T2YoJy4nKSArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgX3RoaXMuaXNMZWdhY3kodXJsKS50aGVuKChpc0xlZ2FjeSkgPT4ge1xyXG5cclxuICAgICAgICAvLyBpZiBsZWdhY3kgaXQgc2hvdWxkIHJlc29sdmUgZm9yIDxwcm90b2NvbD4uPGRvbWFpbj5cclxuICAgICAgICBpZiAoaXNMZWdhY3kgJiYgdHlwZSAhPT0gJ2RvbWFpbi1pZHAnKSB7XHJcbiAgICAgICAgICBkb21haW5VcmwgPSB0eXBlICsgJy4nICsgZ2V0VXNlcklkZW50aXR5RG9tYWluKHVybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2cuaW5mbygnW1JlZ2lzdHJ5LnJlc29sdmVdIGRvbWFpblVybDonLCBkb21haW5VcmwpO1xyXG5cclxuICAgICAgICBsZXQgcmVnaXN0cmVkQ29tcG9uZW50O1xyXG5cclxuICAgICAgICBpZiAodHlwZSA9PT0gJ2RvbWFpbi1pZHAnKSB7XHJcbiAgICAgICAgICByZWdpc3RyZWRDb21wb25lbnQgID0gX3RoaXMuaWRwUHJveHlMaXN0Lmhhc093blByb3BlcnR5KGRvbWFpblVybCkgPyBfdGhpcy5pZHBQcm94eUxpc3RbZG9tYWluVXJsXSA6IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWdpc3RyZWRDb21wb25lbnQgID0gX3RoaXMucHJvdG9zdHVic0xpc3QuaGFzT3duUHJvcGVydHkoZG9tYWluVXJsKSA/IF90aGlzLnByb3Rvc3R1YnNMaXN0W2RvbWFpblVybF0gOiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkucmVzb2x2ZV0gcmVnaXN0cmVkOicsIHJlZ2lzdHJlZENvbXBvbmVudCk7XHJcblxyXG4gICAgICAgIC8vIFRPRE8gc2luY2UgdGhlIHByb3Rvc3R1YnMgaGF2ZSBvdGhlciBzdGF0ZXMgdGhpcyBzaG91bGQgYmUgcmV2aXNlZCwgYmVjYXVzZSB0aGUgc3RhdHVzIGNvdWxkIGNoYW5nZSBmcm9tIERFUExPWUVEIHRvIExJVkVcclxuICAgICAgICAvLyBUT0RPIGFuZCB0aGlzIHZhbGlkYXRpb24gd2lsbCB0cmlnZ2VyIGEgbmV3IGxvYWQgb2YgSURQUHJveHkgb3IgUHJvdG9zdHViO1xyXG4gICAgICAgIGlmIChyZWdpc3RyZWRDb21wb25lbnQgJiYgcmVnaXN0cmVkQ29tcG9uZW50Lmhhc093blByb3BlcnR5KCdzdGF0dXMnKSAmJlxyXG4gICAgICAgICAocmVnaXN0cmVkQ29tcG9uZW50LnN0YXR1cyA9PT0gU1RBVFVTLkRFUExPWUVEIHx8IHJlZ2lzdHJlZENvbXBvbmVudC5zdGF0dXMgPT09IFNUQVRVUy5DUkVBVEVEIHx8XHJcbiAgICAgICAgICByZWdpc3RyZWRDb21wb25lbnQuc3RhdHVzID09PSBTVEFUVVMuTElWRSB8fCByZWdpc3RyZWRDb21wb25lbnQuc3RhdHVzID09PSBTVEFUVVMuRElTQ09OTkVDVEVEKSkge1xyXG4gICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeS5yZXNvbHZlXSBSZXNvbHZlZDogJywgcmVnaXN0cmVkQ29tcG9uZW50LnVybCwgcmVnaXN0cmVkQ29tcG9uZW50LnN0YXR1cyk7XHJcbiAgICAgICAgICByZXNvbHZlKHJlZ2lzdHJlZENvbXBvbmVudC51cmwpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL3RvZG86IHVzZSBzd2l0Y2gtY2FzZSB0byBzdXBwb3J0IG90aGVyIHR5cGVzIG9mIHN0dWJzXHJcbiAgICAgICAgICBpZiAodHlwZSA9PT0gJ2RvbWFpbi1pZHAnKSB7XHJcblxyXG4gICAgICAgICAgICAvLyBUaGUgSWRQIFByb3h5IGRvZXMgbm90IGV4aXN0LCBsZXQncyBwcmVwYXJlIGl0cyBkZXBsb3ltZW50IGJ5IHdhdGNoaW5nIGl0cyBzdGF0dXNcclxuXHJcbiAgICAgICAgICAgIF90aGlzLndhdGNoaW5nWW91Lm9ic2VydmUoJ2lkcFByb3h5TGlzdCcsIChjaGFuZ2UpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gcmVzb2x2ZU5vcm1hbFN0dWJdIGlkcFByb3h5TGlzdCBjaGFuZ2VkICcgKyBfdGhpcy5pZHBQcm94eUxpc3QpO1xyXG5cclxuICAgICAgICAgICAgICBsZXQga2V5cGF0aCA9IGNoYW5nZS5rZXlwYXRoO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoa2V5cGF0aC5pbmNsdWRlcygnc3RhdHVzJykpXHJcbiAgICAgICAgICAgICAgICBrZXlwYXRoID0ga2V5cGF0aC5yZXBsYWNlKCcuc3RhdHVzJywgJycpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoa2V5cGF0aCA9PT0gZG9tYWluVXJsICYmIGNoYW5nZS5uYW1lID09PSAnc3RhdHVzJyAmJiBjaGFuZ2UubmV3VmFsdWUgPT09IFNUQVRVUy5DUkVBVEVEKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgLSByZXNvbHZlTm9ybWFsU3R1Yl0gaWRwUHJveHlMaXN0IGlzIGxpdmUgJyArIF90aGlzLmlkcFByb3h5TGlzdFtkb21haW5VcmxdKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoX3RoaXMuaWRwUHJveHlMaXN0W2RvbWFpblVybF0udXJsKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFyZWdpc3RyZWRDb21wb25lbnQgfHwgcmVnaXN0cmVkQ29tcG9uZW50LnN0YXR1cyA9PT0gU1RBVFVTLkZBSUxFRCApIHtcclxuICAgICAgICAgICAgICAvLyB0aGlzIHByb2Nlc3Mgd2lsbCBsb2FkIHRoZSBpZHAgcHJveHksIGJlY2F1c2UgaXMgbm90IHlldCByZWdpc3RlcmVkO1xyXG4gICAgICAgICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkucmVzb2x2ZU5vcm1hbFN0dWJdIGRlcGxveSBuZXcgSURQUHJveHk6ICcsIGRvbWFpblVybCk7XHJcbiAgICAgICAgICAgICAgX3RoaXMubG9hZGVyLmxvYWRJZHBQcm94eShkb21haW5VcmwpLnRoZW4oKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkucmVzb2x2ZU5vcm1hbFN0dWJdIElkUCBQcm94eSBkZXBsb3llZDogJywgX3RoaXMuaWRwUHJveHlMaXN0W2RvbWFpblVybF0pO1xyXG5cclxuICAgICAgICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoJ1tSZWdpc3RyeS5yZXNvbHZlXSBFcnJvciByZXNvbHZpbmcgTG9hZCBJRFBQcm94eTogJywgcmVhc29uKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLmlkcFByb3h5TGlzdFtkb21haW5VcmxdLnN0YXR1cyA9ICdkZXBsb3ltZW50LWZhaWxlZCc7XHJcbiAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgLy8gVGhlIHByb3RvU3R1YiBkb2VzIG5vdCBleGlzdCwgbGV0J3MgcHJlcGFyZSBpdHMgZGVwbG95bWVudCBieSB3YXRjaGluZyBpdHMgc3RhdHVzXHJcblxyXG4gICAgICAgICAgICBfdGhpcy53YXRjaGluZ1lvdS5vYnNlcnZlKCdwcm90b3N0dWJzTGlzdCcsIChjaGFuZ2UpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gcmVzb2x2ZU5vcm1hbFN0dWJdIHByb3Rvc3R1YnNMaXN0IGNoYW5nZWQgJyArIF90aGlzLnByb3Rvc3R1YnNMaXN0KTtcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGtleXBhdGggPSBjaGFuZ2Uua2V5cGF0aDtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGtleXBhdGguaW5jbHVkZXMoJ3N0YXR1cycpKVxyXG4gICAgICAgICAgICAgICAga2V5cGF0aCA9IGtleXBhdGgucmVwbGFjZSgnLnN0YXR1cycsICcnKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGtleXBhdGggPT09IGRvbWFpblVybCAmJiBjaGFuZ2UubmFtZSA9PT0gJ3N0YXR1cycgJiYgY2hhbmdlLm5ld1ZhbHVlID09PSBTVEFUVVMuQ1JFQVRFRCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gcmVzb2x2ZV0gcHJvdG9zdHViIGlzIGxpdmUgJyArIF90aGlzLnByb3Rvc3R1YnNMaXN0W2RvbWFpblVybF0pO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShfdGhpcy5wcm90b3N0dWJzTGlzdFtkb21haW5VcmxdLnVybCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICghcmVnaXN0cmVkQ29tcG9uZW50IHx8IHJlZ2lzdHJlZENvbXBvbmVudC5zdGF0dXMgPT09IFNUQVRVUy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAvLyBsZXRzIGRlcGxveSB0aGUgcHJvdG9zdHViXHJcbiAgICAgICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeS5yZXNvbHZlXSB0cmlnZ2VyIG5ldyBQcm90b2NvbFN0dWI6ICcsIGRvbWFpblVybCk7XHJcbiAgICAgICAgICAgICAgX3RoaXMubG9hZGVyLmxvYWRTdHViKGRvbWFpblVybCkudGhlbigoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gcmVzb2x2ZU5vcm1hbFN0dWJdIFN0dWIgZGVwbG95ZWQ6ICcsIF90aGlzLnByb3Rvc3R1YnNMaXN0W2RvbWFpblVybF0pO1xyXG4gICAgICAgICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignW1JlZ2lzdHJ5LnJlc29sdmVOb3JtYWxTdHViXSBFcnJvciByZXNvbHZpbmcgTG9hZCBQcm90b2NvbFN0dWI6ICcsIHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIGxvZy5lcnJvcignW1JlZ2lzdHJ5LnJlc29sdmVdIEVycm9yIHJlc29sdmluZyBpc2xlZ2FjeTogJywgcmVhc29uKTtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBUbyB2ZXJpZnkgaWYgc291cmNlIGlzIHZhbGlkIGFuZCB0byByZXNvbHZlIHRhcmdldCBydW50aW1lIHVybCBhZGRyZXNzIGlmIG5lZWRlZCAoZWcgcHJvdG9zdHViIHJ1bnRpbWUgdXJsIGluIGNhc2UgdGhlIG1lc3NhZ2UgaXMgdG8gYmUgZGlzcGF0Y2hlZCB0byBhIHJlbW90ZSBlbmRwb2ludCkuXHJcbiAgKiBAcGFyYW0gIHtVUkwuVVJMfSAgdXJsICAgICAgIHVybFxyXG4gICogQHJldHVybiB7UHJvbWlzZTxVUkwuVVJMPn0gICAgICAgICAgICAgICAgIFByb21pc2UgPFVSTC5VUkw+XHJcbiAgKi9cclxuICByZXNvbHZlKG1zZykge1xyXG4gICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIFJlc29sdmVdIC0gICcsIG1zZyk7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgdXJsID0gbXNnLnRvID8gbXNnLnRvIDogbXNnO1xyXG5cclxuICAgICAgbGV0IHAycCA9IChtc2cuYm9keSAmJiBtc2cuYm9keS5wMnApID8gbXNnLmJvZHkucDJwIDogZmFsc2U7XHJcblxyXG4gICAgICAvLyBsb2cubG9nKCdQMlA6ICcsIHAycCwgdXJsKTtcclxuICAgICAgLy8gbG9nLmxvZygnUDJQIC0gcDJwSGFuZGxlclN0dWI6ICcsICFfdGhpcy5wMnBIYW5kbGVyU3R1YltfdGhpcy5ydW50aW1lVVJMXSwgX3RoaXMucDJwSGFuZGxlclN0dWIsIF90aGlzLnJ1bnRpbWVVUkwpO1xyXG4gICAgICAvLyBsb2cubG9nKCdQMlAgLSBpc0JhY2tlbmRTZXJ2aWNlVVJMOiAnLCBpc0JhY2tlbmRTZXJ2aWNlVVJMKHVybCksIGlzQmFja2VuZFNlcnZpY2VVUkwsIHVybCk7XHJcbiAgICAgIC8vIGxvZy5sb2coJ1AyUCAtIGluY2x1ZGVzIHJ1bnRpbWVVUkw6ICcsIHVybC5pbmNsdWRlcyhfdGhpcy5ydW50aW1lVVJMKSk7XHJcbiAgICAgIC8vIGxvZy5sb2coJ1AyUCAtIGluY2x1ZGVzIHAycGhhbmRsZXI6ICcsIHVybC5pbmNsdWRlcygnL3AycGhhbmRsZXIvJykpO1xyXG4gICAgICAvLyBsb2cubG9nKCdQMlAgLSBpbmNsdWRlcyBwMnByZXF1ZXN0ZXI6ICcsIHVybC5pbmNsdWRlcygnL3AycHJlcXVlc3Rlci8nKSk7XHJcblxyXG4gICAgICAvLyBTa2lwIHAycCBwcm9jZWR1cmUgd2hlbiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBSdW50aW1lIG9yIGZvciBiYWNrZW5kIHNlcnZpY2VzXHJcblxyXG4gICAgICBpZiAoIV90aGlzLnAycEhhbmRsZXJTdHViW190aGlzLnJ1bnRpbWVVUkxdIHx8IGlzQmFja2VuZFNlcnZpY2VVUkwodXJsKSB8fCB1cmwuaW5jbHVkZXMoX3RoaXMucnVudGltZVVSTCkgfHwgdXJsLmluY2x1ZGVzKCcvcDJwaGFuZGxlci8nKSB8fCB1cmwuaW5jbHVkZXMoJy9wMnByZXF1ZXN0ZXIvJykpIHtcclxuXHJcbiAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIHJlc29sdmVdIC0gUmVzb2x2ZSBub3JtYWwgc3R1YjogJywgX3RoaXMucDJwSGFuZGxlclN0dWIsIF90aGlzLnJ1bnRpbWVVUkwsIGlzQmFja2VuZFNlcnZpY2VVUkwodXJsKSwgcDJwLCB1cmwpO1xyXG4gICAgICAgIF90aGlzLnJlc29sdmVOb3JtYWxTdHViKHVybCkudGhlbigocmV0dXJuVVJMKSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKHJldHVyblVSTCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICBsb2cuaW5mbygnW1JlZ2lzdHJ5IC0gcmVzb2x2ZV0gLSBjaGVja1AyUDogJywgcDJwLCB1cmwsIF90aGlzLl9wMnBDb25uZWN0aW9uUmVzb2x2ZSk7XHJcbiAgICAgICAgX3RoaXMuX3AycENvbm5lY3Rpb25SZXNvbHZlLmNoZWNrUDJQKG1zZykudGhlbigocmVnaXN0ZXJlZFAyUCkgPT4ge1xyXG5cclxuICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSAtIHJlc29sdmVdIGZvdW5kIHJlZ2lzdGVyZWQgUDJQOiAnLCByZWdpc3RlcmVkUDJQKTtcclxuXHJcbiAgICAgICAgICBsZXQgcDJwQ29ubmVjdGlvbiA9IF90aGlzLnAycENvbm5lY3Rpb25MaXN0W3JlZ2lzdGVyZWRQMlAucnVudGltZV07XHJcblxyXG4gICAgICAgICAgaWYgKCFwMnBDb25uZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHAycENvbm5lY3Rpb24gPSByZWdpc3RlcmVkUDJQO1xyXG4gICAgICAgICAgICBfdGhpcy5wMnBDb25uZWN0aW9uTGlzdFtyZWdpc3RlcmVkUDJQLnJ1bnRpbWVdID0gcDJwQ29ubmVjdGlvbjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBzd2l0Y2ggKHAycENvbm5lY3Rpb24uc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNhc2UgU1RBVFVTLkxJVkU6XHJcbiAgICAgICAgICAgICAgbXNnLmJvZHkucGVlciA9IHJlZ2lzdGVyZWRQMlAucnVudGltZTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHAycENvbm5lY3Rpb24udXJsLCBtc2cpO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFNUQVRVUy5DUkVBVEVEOiAvLyBwMnAgY29ubmVjdGlvbiBzZXR1cCBpcyBvbmdvaW5nLCB1c2UgTU4gU3R1YlxyXG4gICAgICAgICAgICBjYXNlIFNUQVRVUy5QUk9HUkVTUzpcclxuICAgICAgICAgICAgICBfdGhpcy5yZXNvbHZlTm9ybWFsU3R1Yih1cmwpLnRoZW4oKHJldHVyblVSTCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5VUkwpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFNUQVRVUy5ESVNDT05ORUNURUQ6IC8vIHAycCBjb25uZWN0aW9uIHN0dWIgd2FzIGRpc2Nvbm5lY3RlZCwgbGV0J3MgYXNrIHRvIGNvbm5lY3QgYWdhaW5cclxuICAgICAgICAgICAgICBsb2cuaW5mbygnW1JlZ2lzdHJ5IC0gUmVzb2x2ZV0gLSBwMnBDb25uZWN0aW9uIGlzIGRpc2Nvbm5lY3RlZCBsZXRzIHRyeSB0byByZWNvbm5lY3QnKTtcclxuICAgICAgICAgICAgICBfdGhpcy5fcDJwQ29ubmVjdGlvblJlc29sdmUucmVjb25uZWN0UDJQUmVxdWVzdGVyKHAycENvbm5lY3Rpb24pLnRoZW4oKHJldHVyblVSTCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gUmVzb2x2ZV0gLSB3YXMgcmVjb25uZWN0ZWQgd2l0aCBwMnBSZXF1ZXN0ZXJTdHVidDogJywgcmV0dXJuVVJMKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVVJMKTtcclxuICAgICAgICAgICAgICB9LCAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsb2cuaW5mbygnW1JlZ2lzdHJ5IC0gUmVzb2x2ZV0gLSBSZWFzb246ICcsIHJlYXNvbik7XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMucmVzb2x2ZU5vcm1hbFN0dWIodXJsKS50aGVuKChyZXR1cm5VUkwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5VUkwpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcblxyXG4gICAgICAgICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkgLSByZXNvbHZlXSAtIFAyUDogJywgcDJwKTtcclxuICAgICAgICAgICAgICBpZiAoIXAycCkgeyAvLyBubyBwMnAgY29ubmVjdGlvbiBleGlzdHMgYW5kIHRoZSBtZXNzYWdlIHNlbmRlciBkb2VzIG5vdCBhc2sgb25lLiBMZXRzIHVzZSB0aGUgTU4gU3R1YlxyXG4gICAgICAgICAgICAgICAgX3RoaXMucmVzb2x2ZU5vcm1hbFN0dWIodXJsKS50aGVuKChyZXR1cm5VUkwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5VUkwpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fc2V0dXBQMlBSZXF1ZXN0ZXIocmVnaXN0ZXJlZFAyUCkudGhlbigocmV0dXJuVVJMKSA9PiB7IC8vIG5vIHAycCBjb25uZWN0aW9uIGV4aXN0cyBidXQgdGhlIG1lc3NhZ2Ugc2VuZGVyIGlzIGFza2luZyBvbmUuIExldHMgdHJ5IHRvIHNldHVwIG9uZVxyXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblVSTCk7XHJcbiAgICAgICAgICAgICAgICB9LCAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkgLSBSZXNvbHZlXSAtIFJlYXNvbjogJywgcmVhc29uKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLnJlc29sdmVOb3JtYWxTdHViKHVybCkudGhlbigocmV0dXJuVVJMKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5VUkwpO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICBsb2cuaW5mbygnW1JlZ2lzdHJ5IC0gUmVzb2x2ZV0gLSBSZWFzb246ICcsIHJlYXNvbik7XHJcblxyXG4gICAgICAgICAgX3RoaXMucmVzb2x2ZU5vcm1hbFN0dWIodXJsKS50aGVuKChyZXR1cm5VUkwpID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5VUkwpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9zZXR1cFAyUFJlcXVlc3RlcihpbnB1dCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsb2cubG9nKCdbUmVnaXN0cnkuX3NldHVwUDJQQ29ubmVjdGlvbl0gbG9hZFN0dWIgd2l0aCBwMnBSZXF1ZXN0ZXI6ICcsIGlucHV0KTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgbGV0IHJlbW90ZVJ1bnRpbWUgPSBpbnB1dC5ydW50aW1lO1xyXG5cclxuICAgICAgbGV0IHAycENvbmZpZyA9IHsgcmVtb3RlUnVudGltZVVSTDogcmVtb3RlUnVudGltZSwgcDJwSGFuZGxlcjogaW5wdXQucDJwSGFuZGxlciwgcDJwUmVxdWVzdGVyU3R1YjogdHJ1ZSB9O1xyXG5cclxuICAgICAgLy8gbGV0cyBwcmVwYXJlIHRoZSBwMnBSZXF1ZXN0ZXJTVHViIGRlcGxveW1lbnQgYnkgc2V0dGluZyBhbiBvYnNlcnZlciB0byBpdHMgc3RhdHVzIGNoYW5nZXNcclxuXHJcbiAgICAgIF90aGlzLndhdGNoaW5nWW91Lm9ic2VydmUoJ3AycFJlcXVlc3RlclN0dWInLCAoY2hhbmdlKSA9PiB7XHJcblxyXG4gICAgICAgIGxvZy5sb2coJ1tSZWdpc3RyeS5fc2V0dXBQMlBDb25uZWN0aW9uXSBwMnBSZXF1ZXN0ZXJTdHVicyBjaGFuZ2VkICcgKyBfdGhpcy5wMnBSZXF1ZXN0ZXJTdHViKTtcclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZS5rZXlwYXRoLnNwbGl0KCcuJylbMF0gPT09IHJlbW90ZVJ1bnRpbWUgJiYgY2hhbmdlLm5hbWUgPT09ICdzdGF0dXMnICYmIGNoYW5nZS5uZXdWYWx1ZSA9PT0gU1RBVFVTLkxJVkUpIHtcclxuICAgICAgICAgIGxvZy5sb2coJ1tSZWdpc3RyeS5fc2V0dXBQMlBDb25uZWN0aW9uXSBwMnBSZXF1ZXN0ZXIgaXMgbGl2ZSAnICsgX3RoaXMucDJwUmVxdWVzdGVyU3R1YltyZW1vdGVSdW50aW1lXSk7XHJcbiAgICAgICAgICByZXNvbHZlKF90aGlzLnAycFJlcXVlc3RlclN0dWJbcmVtb3RlUnVudGltZV0udXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gIHN0dWIgbG9hZFxyXG4gICAgICBfdGhpcy5sb2FkZXIubG9hZFN0dWIoaW5wdXQucDJwUmVxdWVzdGVyLCBwMnBDb25maWcpLnRoZW4oKCkgPT4ge1xyXG5cclxuICAgICAgICBsb2cubG9nKCdbUmVnaXN0cnkuX3NldHVwUDJQQ29ubmVjdGlvbl0gcDJwUmVxdWVzdGVyIGRlcGxveWVkOiAnLCBfdGhpcy5wMnBSZXF1ZXN0ZXJTdHViW3JlbW90ZVJ1bnRpbWVdKTtcclxuXHJcblxyXG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBUbyB2ZXJpZnkgaWYgdXJsIGlzIGZvciBhIGxlZ2FjeSBzZXJ2aWNlLlxyXG4gICogQHBhcmFtICB7VVJMLlVSTH0gIHVybCAgICAgIHVybFxyXG4gICogQHJldHVybiB7Ym9vbGVhbn1cclxuICAqL1xyXG4gIGlzTGVnYWN5KHVybCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGlmICh1cmwgPT09IF90aGlzLl9kb21haW4pIHtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxvZy5sb2coJ1tSZWdpc3RyeV0gW1JlZ2lzdHJ5LlJlZ2lzdHJ5LmlzTGVnYWN5XSAnLCB1cmwpO1xyXG5cclxuICAgICAgLy8gVE9ETzogdG8gYmUgZGVmaW5lZCBpbiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uXHJcbiAgICAgIGxldCBub25MZWdhY3kgPSBbJ2h5cGVydHktcnVudGltZScsICdkb21haW4nLCAnZ2xvYmFsJywgJ2h5cGVydHknXTtcclxuXHJcbiAgICAgIGxldCB1cmxEaXZpZGVkID0gZGl2aWRlVVJMKHVybCk7XHJcblxyXG4gICAgICBpZiAobm9uTGVnYWN5LmluZGV4T2YodXJsRGl2aWRlZC50eXBlKSAhPT0gLTEgfHwgdXJsRGl2aWRlZC5kb21haW4gPT09IF90aGlzLl9kb21haW4pIHtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHByb2Nlc3MgVXNlciBVUkxzXHJcbiAgICAgIGlmICh1cmwuc3BsaXQoJ0AnKS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgbGV0IGRvbWFpbiA9IHVybERpdmlkZWQuZG9tYWluO1xyXG5cclxuICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnldIFtSZWdpc3RyeS5SZWdpc3RyeS5pc0xlZ2FjeV0gZG9tYWluOiAnLCBkb21haW4pO1xyXG4gICAgICAgIGlmIChfdGhpcy5pZHBMZWdhY3lQcm94eUxpc3QuaGFzT3duUHJvcGVydHkoZG9tYWluKSkge1xyXG5cclxuICAgICAgICAgIGxldCByZXN1bHQgPSBfdGhpcy5pZHBMZWdhY3lQcm94eUxpc3RbZG9tYWluXTtcclxuXHJcbiAgICAgICAgICBpZiAocmVzdWx0LmludGVyd29ya2luZykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHQuaW50ZXJ3b3JraW5nKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF90aGlzLl9sb2FkZXIuZGVzY3JpcHRvcnMuZ2V0SWRwUHJveHlEZXNjcmlwdG9yKGRvbWFpbikudGhlbigocmVzdWx0KSA9PiB7XHJcblxyXG4gICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5XSBbUmVnaXN0cnkuUmVnaXN0cnkuaXNMZWdhY3ldIExlZ2FjeSBzdHViIGRlc2NyaXB0b3I6ICcsIHJlc3VsdCk7XHJcblxyXG4gICAgICAgICAgaWYgKHJlc3VsdC5pbnRlcndvcmtpbmcpIHtcclxuICAgICAgICAgICAgX3RoaXMuaWRwTGVnYWN5UHJveHlMaXN0W2RvbWFpbl0gPSByZXN1bHQ7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0LmludGVyd29ya2luZyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgbG9nLndhcm4oJ3Byb2JsZW0gbG9hZGluZyBpZHAgcHJveHkgZGVzY3JpcHRvciBmb3IgZG9tYWluOicsIGRvbWFpbiwgJyBiZWNhdXNlICcsIHJlYXNvbik7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHsgLy8gcHJvY2VzcyBwcm90b3N0dWIgVVJMc1xyXG4gICAgICAgIHJlc29sdmUoX3RoaXMuaXNJbnRlcndvcmtpbmdQcm90b1N0dWIodXJsKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBUbyB2ZXJpZnkgaWYgVVJMIGlzIGxvY2FsbHkgcmVnaXN0ZXJlZCBvciBub3QuXHJcbiAgKiBAcGFyYW0gIHtVUkwuVVJMfSAgdXJsICAgICAgdXJsXHJcbiAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICovXHJcblxyXG4gIGlzTG9jYWwodXJsKSB7XHJcblxyXG4gICAgbGV0IHJ1bnRpbWVTY2hlbWUgPSBbJ2h5cGVydHktcnVudGltZScsICdydW50aW1lJ107XHJcbiAgICBsZXQgaHlwZXJ0eVNjaGVtZSA9IFsnaHlwZXJ0eSddO1xyXG4gICAgbGV0IHVybFNjaGVtZSA9IHVybC5zcGxpdCgnOi8vJylbMF07XHJcblxyXG4gICAgLy8gUHJvY2VzcyBSdW50aW1lIENvcmUgVVJMcy5cclxuICAgIC8vIE1lc3NhZ2VzIG9yaWdpbmF0ZWQgZnJvbSBwcm90b3N0dWJzIHNob3VsZCBhbHNvIG5vdCBpbmNsdWRlIHRoZSBydW50aW1lVVJMIGluIGl0cyBVUkwuXHJcblxyXG4gICAgaWYgKHJ1bnRpbWVTY2hlbWUuaW5kZXhPZih1cmxTY2hlbWUpICE9PSAtMSkge1xyXG4gICAgICByZXR1cm4gdXJsLmluY2x1ZGVzKHRoaXMucnVudGltZVVSTCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvY2VzcyBIeXBlcnR5IFVSTHNcclxuICAgIC8vIFRvZG86IGh5cGVydGllc0xpc3Qgc2hvdWxkIGJlIGFuIG9iamVjdCBub3QgYW4gYXJyYXlcclxuXHJcbiAgICBpZiAoaHlwZXJ0eVNjaGVtZS5pbmRleE9mKHVybFNjaGVtZSkgIT09IC0xKSB7XHJcblxyXG4gICAgICBmb3IgKGxldCBpbmRleCBpbiB0aGlzLmh5cGVydGllc0xpc3QpIHtcclxuICAgICAgICBsZXQgaHlwZXJ0eSA9IHRoaXMuaHlwZXJ0aWVzTGlzdFtpbmRleF07XHJcbiAgICAgICAgaWYgKGh5cGVydHkuaHlwZXJ0eVVSTCA9PT0gdXJsKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQcm9jZXNzIERhdGEgT2JqZWN0IFVSTHNcclxuXHJcbiAgICBpZiAodXJsLmluY2x1ZGVzKCcvc3Vic2NyaXB0aW9uJykpIHtcclxuICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygwLCB1cmwuaW5kZXhPZignL3N1YnNjcmlwdGlvbicpKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZGF0YU9iamVjdCA9IHRoaXMuZGF0YU9iamVjdExpc3RbdXJsXTtcclxuXHJcbiAgICBpZiAoZGF0YU9iamVjdCkge1xyXG4gICAgICBpZiAoZGF0YU9iamVjdC5pbnRlcndvcmtpbmcpIHtcclxuICAgICAgICByZXR1cm4gIWRhdGFPYmplY3QuaW50ZXJ3b3JraW5nO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVG8gdmVyaWZ5IGlmIHByb3Rvc3R1YiBpcyB0byBpbnRlcndvcmsgd2l0aCBhIGxlZ2FjeSBkb21haW4uXHJcbiAgKiBAcGFyYW0gIHtVUkwuVVJMfSAgcnVudGltZVByb3Rvc3R1YlVSTCAgICAgIFRoZSBydW50aW1lIFVSTCBvZiB0aGUgUHJvdG9zdHViXHJcbiAgKiBAcmV0dXJuIHtib29sZWFufVxyXG4gICovXHJcblxyXG4gIGlzSW50ZXJ3b3JraW5nUHJvdG9TdHViKHJ1bnRpbWVQcm90b3N0dWJVUkwpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmICh0eXBlb2YgcnVudGltZVByb3Rvc3R1YlVSTCA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIShydW50aW1lUHJvdG9zdHViVVJMLmluY2x1ZGVzKCcvcHJvdG9zdHViLycpKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpbHRlcmVkID0gT2JqZWN0LmtleXMoX3RoaXMucHJvdG9zdHVic0xpc3QpLmZpbHRlcigoa2V5KSA9PiB7XHJcbiAgICAgIHJldHVybiBfdGhpcy5wcm90b3N0dWJzTGlzdFtrZXldLnVybCA9PT0gcnVudGltZVByb3Rvc3R1YlVSTDtcclxuICAgIH0pLm1hcCgoa2V5KSA9PiB7XHJcblxyXG4gICAgICBpZiAoX3RoaXMucHJvdG9zdHVic0xpc3Rba2V5XS5oYXNPd25Qcm9wZXJ0eSgnaW50ZXJ3b3JraW5nJykpIHtcclxuICAgICAgICByZXR1cm4gX3RoaXMucHJvdG9zdHVic0xpc3Rba2V5XS5pbnRlcndvcmtpbmc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KVswXTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyZWQ7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZWdpc3RyeTtcclxuIiwiZXhwb3J0IGNvbnN0IHJ1bnRpbWVDb25maWd1cmF0aW9uID0ge1xyXG5cclxuICAvLyBUT0RPIHRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiB1c2VkIGZvciBpbmRleGVkZGJcclxuICAvLyBsb29rIGF0OiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSURCT2JqZWN0U3RvcmVcclxuICAvLyBOb3cgd2UgYXJlIHVzaW5nIHRoZSBkZWZpbml0aW9uIGZvciBEZXhpZTsgKGh0dHA6Ly9kZXhpZS5vcmcvZG9jcy9WZXJzaW9uL1ZlcnNpb24uc3RvcmVzKCkpXHJcbiAgc3RvcmFnZVNjaGVtYXM6IHtcclxuICAgIGNhcGFiaWxpdGllczoge1xyXG4gICAgICBjYXBhYmlsaXRpZXM6ICdrZXksdmVyc2lvbix2YWx1ZSdcclxuICAgIH0sXHJcbiAgICBzdWJzY3JpcHRpb25zOiB7XHJcbiAgICAgIHN1YnNjcmlwdGlvbnM6ICdrZXksdmVyc2lvbix2YWx1ZSdcclxuICAgIH0sXHJcbiAgICBydW50aW1lOiB7XHJcbiAgICAgICdydW50aW1lOlVSTCc6ICdrZXksdmVyc2lvbix2YWx1ZScsXHJcbiAgICAgICdwMnBIYW5kbGVyOlVSTCc6ICdrZXksdmVyc2lvbix2YWx1ZSdcclxuICAgIH0sXHJcbiAgICByZWdpc3RyeToge1xyXG4gICAgICAncmVnaXN0cnk6RGF0YU9iamVjdFVSTHMnOiAna2V5LHZlcnNpb24sdmFsdWUnLFxyXG4gICAgICAncmVnaXN0cnk6SHlwZXJ0eVVSTHMnOiAna2V5LHZlcnNpb24sdmFsdWUnXHJcbiAgICB9LFxyXG4gICAgY3J5cHRvTWFuYWdlcjoge1xyXG4gICAgICB1c2VyQXN5bW1ldHJpY0tleTogJ2tleSx2ZXJzaW9uLHZhbHVlJyxcclxuICAgICAgZGF0YU9iamVjdFNlc3Npb25LZXlzOiAna2V5LHZlcnNpb24sdmFsdWUnXHJcbiAgICB9LFxyXG4gICAgaWRlbnRpdHk6IHtcclxuICAgICAgYWNjZXNzVG9rZW5zOiAna2V5LHZlcnNpb24sdmFsdWUnLFxyXG4gICAgICBpZGVudGl0aWVzOiAndXNlclVSTCwgdXNlclByb2ZpbGUuZW1haWwsIHVzZXJQcm9maWxlLnVzZXJVUkwsIHVzZXJQcm9maWxlLm5hbWUnXHJcbiAgICB9LFxyXG4gICAgcnVudGltZUNhdGFsb2d1ZToge1xyXG4gICAgICBydW50aW1lQ2F0YWxvZ3VlOiAnJmNndWlkLCBhY2Nlc3NDb250cm9sUG9saWN5LCBjb25zdHJhaW50cywgZGF0YU9iamVjdHMsIGh5cGVydHlUeXBlLCBvYmplY3ROYW1lLCBzb3VyY2VQYWNrYWdlLCB2ZXJzaW9uJ1xyXG4gICAgfSxcclxuICAgIHBvbGljeToge1xyXG4gICAgICAncmV0aGluazphY3RpdmVQb2xpY3knOiAna2V5LHZlcnNpb24sdmFsdWUnLFxyXG4gICAgICAncmV0aGluazpncm91cHMnOiAna2V5LHZlcnNpb24sdmFsdWUnLFxyXG4gICAgICAncmV0aGluazp1c2VyUG9saWNpZXMnOiAna2V5LHZlcnNpb24sdmFsdWUnLFxyXG4gICAgICAncmV0aGluazpzcFBvbGljaWVzJzogJ2tleSx2ZXJzaW9uLHZhbHVlJ1xyXG4gICAgfSxcclxuICAgIHN5bmNoZXJNYW5hZ2VyOiB7XHJcbiAgICAgICdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJzogJ2tleSx2ZXJzaW9uLHZhbHVlJyxcclxuICAgICAgJ3JlbW90ZXMnOiAna2V5LHZlcnNpb24sdmFsdWUnXHJcbiAgICB9LFxyXG4gICAgaHlwZXJ0eVJlc291cmNlczoge1xyXG4gICAgICBoeXBlcnR5UmVzb3VyY2VzOiAnJnJlc291cmNlVVJMLCBuYW1lLCBjb250ZW50VXJsLCBjb250ZW50LCBjcmVhdGVkLCByZXBvcnRlciwgcmVzb3VyY2VUeXBlJ1xyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIHJ1bnRpbWVVUkxTOiB7XHJcbiAgICByZWdpc3RyeToge1xyXG4gICAgICBwcmVmaXg6ICdoeXBlcnR5LXJ1bnRpbWU6Ly8nLFxyXG4gICAgICBzdWZmaXg6ICdyZWdpc3RyeSdcclxuICAgIH0sXHJcbiAgICBpZGVudGl0eU1vZHVsZToge1xyXG4gICAgICBwcmVmaXg6ICdoeXBlcnR5LXJ1bnRpbWU6Ly8nLFxyXG4gICAgICBzdWZmaXg6ICcvaWRtJ1xyXG4gICAgfSxcclxuICAgIHJ1bnRpbWVVQToge1xyXG4gICAgICBwcmVmaXg6ICdoeXBlcnR5LXJ1bnRpbWU6Ly8nLFxyXG4gICAgICBzdWZmaXg6ICcvdWEnXHJcbiAgICB9LFxyXG4gICAgY2F0YWxvZ3VlOiB7XHJcbiAgICAgIHByZWZpeDogJ2h5cGVydHktcnVudGltZTovLycsXHJcbiAgICAgIHN1ZmZpeDogJy9jYXRhbG9ndWUnXHJcbiAgICB9LFxyXG4gICAgZ3JhcGhDb25uZWN0b3I6IHtcclxuICAgICAgcHJlZml4OiAnaHlwZXJ0eS1ydW50aW1lOi8vJyxcclxuICAgICAgc3VmZml4OiAnL2dyYXBoJ1xyXG4gICAgfSxcclxuICAgIHN5bmNNYW5hZ2VyOiB7XHJcbiAgICAgIHByZWZpeDogJ2h5cGVydHktcnVudGltZTovLycsXHJcbiAgICAgIHN1ZmZpeDogJy9zbSdcclxuICAgIH1cclxuICB9LFxyXG4gIGNhdGFsb2d1ZVVSTHM6IHtcclxuICAgIHByb3RvY29sc3R1Yjoge1xyXG4gICAgICBwcmVmaXg6ICdoeXBlcnR5LWNhdGFsb2d1ZTovL2NhdGFsb2d1ZS4nLFxyXG4gICAgICBzdWZmaXg6ICcvLndlbGwta25vd24vcHJvdG9jb2xzdHViLycsXHJcbiAgICAgIGZhbGxiYWNrOiAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJWRvbWFpbiUvLndlbGwta25vd24vcHJvdG9jb2xzdHViLydcclxuICAgIH0sXHJcbiAgICBpZHBQcm94eToge1xyXG4gICAgICBwcmVmaXg6ICdoeXBlcnR5LWNhdGFsb2d1ZTovL2NhdGFsb2d1ZS4nLFxyXG4gICAgICBzdWZmaXg6ICcvLndlbGwta25vd24vaWRwLXByb3h5LycsXHJcbiAgICAgIGZhbGxiYWNrOiAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJWRvbWFpbiUvLndlbGwta25vd24vaWRwLXByb3h5LydcclxuICAgIH1cclxuICB9LFxyXG4gIG1zZ05vZGVVUkw6IHtcclxuICAgIHByZWZpeDogJ2RvbWFpbjovL21zZy1ub2RlLicsXHJcbiAgICBzdWZmaXg6ICcnLFxyXG4gICAgaHlwZXJ0eUFkZHJlc3NBbGxvY2F0aW9uOiAnL2h5cGVydHktYWRkcmVzcy1hbGxvY2F0aW9uJyxcclxuICAgIG9iamVjdEFkZHJlc3NBbGxvY2F0aW9uOiAnL29iamVjdC1hZGRyZXNzLWFsbG9jYXRpb24nLFxyXG4gICAgc3Vic2NyaXB0aW9uTWFuYWdlbWVudDogJy9zbSdcclxuICB9LFxyXG4gIGRvbWFpblJlZ2lzdHJ5VVJMOiB7XHJcbiAgICBwcmVmaXg6ICdkb21haW46Ly9yZWdpc3RyeS4nLFxyXG4gICAgc3VmZml4OiAnJ1xyXG4gIH0sXHJcbiAgZ2xvYmFsUmVnaXN0cnlVUkw6ICdnbG9iYWw6Ly9yZWdpc3RyeS4nLFxyXG4gIHJlbW90ZVN0b3JhZ2U6ICdodHRwczovL2h5c21hcnQucmV0aGluay5wdGlub3ZhY2FvLnB0L2JhY2t1cC8nXHJcbn07XHJcbiIsIi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0lkZW50aXR5TW9kdWxlJyk7XHJcblxyXG5pbXBvcnQgeyBkZWNvZGUsIHNlY29uZHNTaW5jZUVwb2NoLCBkZWVwQ2xvbmUgfSBmcm9tICcuLi91dGlscy91dGlscy5qcyc7XHJcbmltcG9ydCB7IFdhdGNoaW5nWW91IH0gZnJvbSAnLi4vVXRpbHMnO1xyXG5cclxuXHJcbi8qKlxyXG4qIFRoZSBJZGVudGl0eSBEYXRhIE1vZGVsIGlzIHVzZWQgdG8gbW9kZWwgdGhlIHJlVEhJTksgVXNlciBlbnRpdHkuIFRoZSBJZGVudGl0eSBkYXRhIG1vZGVsIGlzIGhhbmRsZWQgYnkgSWRlbnRpdHkgTWFuYWdlbWVudCBmdW5jdGlvbmFsaXR5LlxyXG4qXHJcbiovXHJcbmNsYXNzIElkZW50aXRpZXMge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih0eXBlLCBzdG9yYWdlTWFuYWdlcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fd2F0Y2hpbmdZb3UgPSBuZXcgV2F0Y2hpbmdZb3UoKTtcclxuXHJcbiAgICBfdGhpcy5fc3RvcmFnZU1hbmFnZXIgPSBzdG9yYWdlTWFuYWdlcjtcclxuICAgIF90aGlzLl9ndWlkO1xyXG4gICAgX3RoaXMuX3R5cGUgPSB0eXBlO1xyXG4gICAgX3RoaXMuX2lkZW50aXRpZXMgPSB7fTtcclxuICAgIF90aGlzLl9hY2Nlc3NUb2tlbnMgPSBfdGhpcy53YXRjaGluZ1lvdS53YXRjaCgnYWNjZXNzVG9rZW5zJywge30sIHRydWUpO1xyXG5cclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgdGhpcy5faWRlbnRpdGllcyA9IHt9O1xyXG4gICAgY29uc29sZS5sb2codGhpcyk7XHJcbiAgICB0aGlzLmN1cnJlbnRJZGVudGl0eSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuZGVmYXVsdElkZW50aXR5ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlkZW50aXRpZXMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faWRlbnRpdGllcztcclxuICB9XHJcblxyXG4gIGdldCBhY2Nlc3NUb2tlbnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWNjZXNzVG9rZW5zO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHdhdGNoaW5nWW91KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3dhdGNoaW5nWW91O1xyXG4gIH1cclxuXHJcbiAgc2V0IGd1aWQoZ3VpZCkge1xyXG4gICAgdGhpcy5fZ3VpZCA9IGd1aWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3VpZCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ndWlkO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRlZmF1bHRJZGVudGl0eShpZGVudGlmaWVyKSB7XHJcbiAgICBpZiAodGhpcy5pZGVudGl0aWVzW2lkZW50aWZpZXJdKSB0aGlzLl9kZWZhdWx0SWRlbnRpdHkgPSBpZGVudGlmaWVyO1xyXG4gICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ1tJZGVudGl0aWVzLnNldCBkZWZhdWx0SWRlbnRpdHkgXSBFcnJvcjogaWRlbnRpdHkgZG9lcyBub3QgZXhpc3QgaGVyZTogJywgaWRlbnRpZmllcik7XHJcbiAgfVxyXG5cclxuICBzZXQgY3VycmVudElkZW50aXR5KGlkZW50aWZpZXIpIHtcclxuICAgIGlmICh0aGlzLmlkZW50aXRpZXNbaWRlbnRpZmllcl0pIHRoaXMuX2N1cnJlbnRJZGVudGl0eSA9IGlkZW50aWZpZXI7XHJcbiAgICBlbHNlIHRocm93ICdbSWRlbnRpdGllcy5zZXQgY3VycmVudElkZW50aXR5IF0gRXJyb3I6IGlkZW50aXR5IGRvZXMgbm90IGV4aXN0IGhlcmU6ICcsIGlkZW50aWZpZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgZGVmYXVsdElkZW50aXR5KCkge1xyXG4gICAgaWYgKHRoaXMuX2RlZmF1bHRJZGVudGl0eSkgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuaWRlbnRpdGllc1t0aGlzLl9kZWZhdWx0SWRlbnRpdHldKTtcclxuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGN1cnJlbnRJZGVudGl0eSgpIHtcclxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmlkZW50aXRpZXNbdGhpcy5fY3VycmVudElkZW50aXR5XSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaWRlbnRpZmllcnMoKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5faWRlbnRpdGllcyk7XHJcbiAgfVxyXG5cclxuICBnZXRJZGVudGl0eShpZGVudGlmaWVyKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5faWRlbnRpdGllc1tpZGVudGlmaWVyXSk7XHJcbiAgfVxyXG5cclxuICBsb2FkSWRlbnRpdGllcygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHJcbiAgICAgIF90aGlzLl9zdG9yYWdlTWFuYWdlci5nZXQobnVsbCwgbnVsbCwgJ2lkZW50aXRpZXMnKS50aGVuKChpZGVudGl0aWVzKSA9PiB7XHJcblxyXG4gICAgICAgIGxvZy5pbmZvKCdbSWRlbnRpdGllcy5Mb2FkIElkZW50aXRpZXNdIGlkZW50aXRpZXM6ICcsIGlkZW50aXRpZXMpO1xyXG5cclxuICAgICAgICBpZiAoaWRlbnRpdGllcykge1xyXG4gICAgICAgICAgX3RoaXMuX2lkZW50aXRpZXMgPSBpZGVudGl0aWVzO1xyXG5cclxuICAgICAgICAgIC8vIGxldCdzIHNldCBhcyBkZWZhdWx0IGlkZW50aXR5IHRoZSBvbmUgdGhhdCBleHBpcmVzIGxhdGVyXHJcblxyXG4gICAgICAgICAgX3RoaXMuaWRlbnRpZmllcnMuZm9yRWFjaCgoaWQpID0+IHtcclxuICAgICAgICAgICAgbGV0IHRpbWVOb3cgPSBzZWNvbmRzU2luY2VFcG9jaCgpO1xyXG4gICAgICAgICAgICBsZXQgaWRlbnRpdHkgPSBfdGhpcy5faWRlbnRpdGllc1tpZF07XHJcbiAgICAgICAgICAgIGxldCBleHBpcmVzID0gaWRlbnRpdHkuZXhwaXJlcztcclxuXHJcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKCFpZGVudGl0eS5oYXNPd25Qcm9wZXJ0eSgnaW50ZXJ3b3JraW5nJylcclxuICAgICAgICAgICAgLy8gICAgICAgICAgICB8fCAhaWRlbnRpdHkuaW50ZXJ3b3JraW5nKSB7XHJcbiAgICAgICAgICAgIF90aGlzLmRlZmF1bHRJZGVudGl0eSA9IGlkO1xyXG5cclxuICAgICAgICAgICAgaWYgKHBhcnNlSW50KGV4cGlyZXMpID4gdGltZU5vdykge1xyXG4gICAgICAgICAgICAgIF90aGlzLmRlZmF1bHRJZGVudGl0eS5leHBpcmVzID0gcGFyc2VJbnQoZXhwaXJlcyk7XHJcbiAgICAgICAgICAgICAgX3RoaXMuY3VycmVudElkZW50aXR5ID0gaWQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGxvYWRBY2Nlc3NUb2tlbnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcblxyXG4gICAgICBfdGhpcy5fc3RvcmFnZU1hbmFnZXIuZ2V0KCdhY2Nlc3NUb2tlbnMnKS50aGVuKChhY2Nlc3NUb2tlbnMpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKGFjY2Vzc1Rva2VucykgX3RoaXMuX2FjY2Vzc1Rva2VucyA9IGFjY2Vzc1Rva2VucztcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyB0byBjb25maXJtIGlmIHRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgd2hlbiB0aGUgQXBwIGNvbnN0cmFpbnRzIHRoZSBpZGVudGl0eSBzZWxlY3Rpb25cclxuXHJcbiAgYWRkSWRlbnRpdHkoaWRlbnRpdHkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKF90aGlzLl9pc1ZhbGlkKGlkZW50aXR5KSkge1xyXG4gICAgICAgIGxldCBpZCA9IGlkZW50aXR5LmlkZW50aWZpZXJzWzBdO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5faWRlbnRpdGllc1tpZF0sIGlkZW50aXR5KTtcclxuICAgICAgICB0aGlzLl9zdG9yZUlkZW50aXR5KGlkZW50aXR5KS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2lkZW50aXRpZXNbaWRdLnN0YXR1cyA9ICdjcmVhdGVkJztcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHsgcmVqZWN0KCdbSWRlbnRpdGllcy5hZGRJZGVudGl0eV0gaW52YWxpZCBJZEFzc2VydGlvbicpOyB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBhZGRBc3NlcnRpb24oYXNzZXJ0aW9uKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5faXNWYWxpZChhc3NlcnRpb24pKSB7XHJcbiAgICAgICAgYXNzZXJ0aW9uLnVzZXJQcm9maWxlLmd1aWQgPSBfdGhpcy5fZ3VpZDtcclxuICAgICAgICBsZXQgdXNlclVybCA9IGFzc2VydGlvbi51c2VyUHJvZmlsZS51c2VyVVJMO1xyXG4gICAgICAgIGlmICghX3RoaXMuaWRlbnRpdGllc1t1c2VyVXJsXSkgX3RoaXMuX2lkZW50aXRpZXNbdXNlclVybF0gPSBhc3NlcnRpb247XHJcbiAgICAgICAgZWxzZSBfdGhpcy5pZGVudGl0aWVzW3VzZXJVcmxdID0gYXNzZXJ0aW9uO1xyXG5cclxuICAgICAgICBfdGhpcy5fc3RvcmUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2lkZW50aXRpZXNbdXNlclVybF0uc3RhdHVzID0gJ2NyZWF0ZWQnO1xyXG4gICAgICAgICAgaWYgKF90aGlzLmRlZmF1bHRJZGVudGl0eSA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBfdGhpcy5kZWZhdWx0SWRlbnRpdHkgPSB1c2VyVXJsO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzb2x2ZShhc3NlcnRpb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgeyByZWplY3QoJ1tJZGVudGl0aWVzLmFkZEFzc2VydGlvbl0gaW52YWxpZCBJZEFzc2VydGlvbjogJywgYXNzZXJ0aW9uKTsgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlSWRlbnRpdHkodXNlclVybCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgZGVsZXRlIF90aGlzLmlkZW50aXRpZXNbdXNlclVybF07XHJcblxyXG4gICAgICBfdGhpcy5fc3RvcmUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGFkZEFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbG9nLmluZm8oJ1tJZGVudGl0aWVzLmFkZEFjY2Vzc1Rva2VuXSAnLCBhY2Nlc3NUb2tlbik7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5faXNWYWxpZEFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuKSkge1xyXG5cclxuICAgICAgICAvLyAgICAgICAgbGV0IG5ld0FjY2Vzc1Rva2VuID0gZGVlcENsb25lKGFjY2Vzc1Rva2VuKTtcclxuXHJcbiAgICAgICAgX3RoaXMuX2FjY2Vzc1Rva2Vuc1thY2Nlc3NUb2tlbi5kb21haW5dID0gYWNjZXNzVG9rZW47XHJcblxyXG4gICAgICAgIF90aGlzLl9zdG9yZUFjY2Vzc1Rva2VucygpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgX3RoaXMuX2FjY2Vzc1Rva2Vuc1thY2Nlc3NUb2tlbi5kb21haW5dLnN0YXR1cyA9ICdjcmVhdGVkJztcclxuICAgICAgICAgIHJlc29sdmUoYWNjZXNzVG9rZW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgeyByZWplY3QoJ1tJZGVudGl0aWVzLmFkZElkZW50aXR5XSBpbnZhbGlkIEFjY2Vzc1Rva2VuOiAnLCBhY2Nlc3NUb2tlbik7IH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHNldEFjY2Vzc1Rva2VuSW5Qcm9ncmVzcyhkb21haW4pIHtcclxuXHJcbiAgICBpZiAodGhpcy5fYWNjZXNzVG9rZW5zW2RvbWFpbl0pIHRoaXMuX2FjY2Vzc1Rva2Vuc1tkb21haW5dLnN0YXR1cyA9ICdpbi1wcm9ncmVzcyc7XHJcbiAgICBlbHNlIHRoaXMuX2FjY2Vzc1Rva2Vuc1tkb21haW5dID0geyBzdGF0dXM6ICdpbi1wcm9ncmVzcycgfTtcclxuICB9XHJcblxyXG4gIGdldEFjY2Vzc1Rva2VuKGRvbWFpbiwgcmVzb3VyY2VzKSB7XHJcbiAgICBsZXQgYWNjZXNzVG9rZW4gPSB0aGlzLl9hY2Nlc3NUb2tlbnNbZG9tYWluXTtcclxuXHJcbiAgICBpZiAoIWFjY2Vzc1Rva2VuKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSBpZiAoXHJcbiAgICAgIHJlc291cmNlcy5ldmVyeSgoaSkgPT4geyByZXR1cm4gYWNjZXNzVG9rZW4ucmVzb3VyY2VzLmluZGV4T2YoaSkgIT0gLTE7IH0pKSB7IHJldHVybiB0aGlzLl9hY2Nlc3NUb2tlbnNbZG9tYWluXTsgfSBlbHNlIHsgcmV0dXJuIG5ldyBFcnJvcignW0lkZW50aXRpZXMuZ2V0QWNjZXNzVG9rZW5dIE5vdCBmb3VuZCBmb3IgJywgZG9tYWluKTsgfVxyXG5cclxuICB9XHJcblxyXG4gIHJlbW92ZUFjY2Vzc1Rva2VuKGRvbWFpbiwgcmVzb3VyY2VzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0aGlzLl9hY2Nlc3NUb2tlbnNbZG9tYWluXTtcclxuXHJcbiAgICAgIGlmICghYWNjZXNzVG9rZW4pIHsgcmVzb2x2ZSgpOyB9IGVsc2UgaWYgKFxyXG4gICAgICAgIHJlc291cmNlcy5ldmVyeSgoaSkgPT4geyBcclxuICAgICAgICAgIHJldHVybiBhY2Nlc3NUb2tlbi5yZXNvdXJjZXMuaW5kZXhPZihpKSAhPSAtMTsgXHJcbiAgICAgICAgfSkpIHtcclxuICAgICAgICAgICBkZWxldGUgdGhpcy5fYWNjZXNzVG9rZW5zW2RvbWFpbl07IFxyXG4gICAgICAgICAgIF90aGlzLl9zdG9yZUFjY2Vzc1Rva2VucygpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7IFxyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgXHJcbiAgICB9KTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQXNzZXJ0aW9uKGFzc2VydGlvbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgbGV0IHVzZXJVcmwgPSBhc3NlcnRpb24udXNlclByb2ZpbGUudXNlclVSTDtcclxuXHJcbiAgICAgIGlmICghX3RoaXMuaWRlbnRpdGllc1t1c2VyVXJsXSkgeyByZXR1cm4gcmVqZWN0KCdbSWRlbnRpdGllcy51cGRhdGVBc3NlcnRpb25dIElkZW50aXR5IG5vdCBmb3VuZCBmb3IgJywgdXNlclVybCk7IH0gZWxzZSB7XHJcbiAgICAgICAgX3RoaXMuaWRlbnRpdGllc1t1c2VyVXJsXSA9IGFzc2VydGlvbjtcclxuICAgICAgICBfdGhpcy5fc3RvcmUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHVwZGF0ZUFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbG9nLmluZm8oJ1tJZGVudGl0aWVzLnVwZGF0ZUFjY2Vzc1Rva2VuXSAnLCBhY2Nlc3NUb2tlbik7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5faXNWYWxpZEFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuKSkge1xyXG5cclxuICAgICAgICBfdGhpcy5fYWNjZXNzVG9rZW5zW2FjY2Vzc1Rva2VuLmRvbWFpbl0uZXhwaXJlcyA9IGFjY2Vzc1Rva2VuLmV4cGlyZXM7XHJcbiAgICAgICAgX3RoaXMuX2FjY2Vzc1Rva2Vuc1thY2Nlc3NUb2tlbi5kb21haW5dLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW4uYWNjZXNzVG9rZW47XHJcblxyXG4gICAgICAgIF90aGlzLl9zdG9yZUFjY2Vzc1Rva2VucygpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgX3RoaXMuX2FjY2Vzc1Rva2Vuc1thY2Nlc3NUb2tlbi5kb21haW5dLnN0YXR1cyA9ICdjcmVhdGVkJztcclxuICAgICAgICAgIHJlc29sdmUoYWNjZXNzVG9rZW4pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgeyByZWplY3QoJ1tJZGVudGl0aWVzLnVwZGF0ZUFjY2Vzc1Rva2VuXSBpbnZhbGlkIEFjY2Vzc1Rva2VuOiAnLCBhY2Nlc3NUb2tlbik7IH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGFkZElkQXNzZXJ0aW9uKGlkZW50aWZpZXIsIGFzc2VydGlvbiwgaWRwLCBzY29wZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgbmV3SWRBc3NlcnRpb24gPSBuZXcgSWRBc3NlcnRpb24oYXNzZXJ0aW9uLCBpZHAsIHNjb3BlKTtcclxuXHJcbiAgICBfdGhpcy5pZEFzc2VydGlvbkxpc3QucHVzaChuZXdJZEFzc2VydGlvbik7XHJcbiAgfVxyXG5cclxuICAvL1RPRE86IGNvbXBsZXRlIHdpdGggbW9yZSB2ZXJpZmljYXRpb25zLiBUbyBiZSBtb3ZlZCB0byBJZGVudGl0eT9cclxuXHJcbiAgX2lzVmFsaWQoaWRlbnRpdHkpIHtcclxuICAgIGlmICghaWRlbnRpdHkuaGFzT3duUHJvcGVydHkoJ2Fzc2VydGlvbicpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc3BsaXRlZEFzc2VydGlvbiA9IGlkZW50aXR5LmFzc2VydGlvbi5zcGxpdCgnLicpO1xyXG4gICAgbGV0IGFzc2VydGlvblBhcnNlZDtcclxuXHJcbiAgICAvL3ZlcmlmeSBpZiB0aGUgdG9rZW4gY29udGFpbnMgdGhlIDMgY29tcG9uZW50cywgb3IganVzdCB0aGUgYXNzZXJ0aW9uXHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoc3BsaXRlZEFzc2VydGlvblsxXSkge1xyXG4gICAgICAgIGFzc2VydGlvblBhcnNlZCA9IGRlY29kZShzcGxpdGVkQXNzZXJ0aW9uWzFdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhc3NlcnRpb25QYXJzZWQgPSBkZWNvZGUoaWRlbnRpdHkuYXNzZXJ0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcblxyXG4gIH1cclxuXHJcbiAgX2lzVmFsaWRBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xyXG5cclxuICAgIGlmICghYWNjZXNzVG9rZW4uaGFzT3duUHJvcGVydHkoJ2FjY2Vzc1Rva2VuJykpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghYWNjZXNzVG9rZW4uaGFzT3duUHJvcGVydHkoJ2RvbWFpbicpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIShhY2Nlc3NUb2tlbi5oYXNPd25Qcm9wZXJ0eSgncmVzb3VyY2VzJykgJiYgQXJyYXkuaXNBcnJheShhY2Nlc3NUb2tlbi5yZXNvdXJjZXMpKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlmICghKGFjY2Vzc1Rva2VuLmhhc093blByb3BlcnR5KCdleHBpcmVzJykgJiYgTnVtYmVyLmlzSW50ZWdlcihhY2Nlc3NUb2tlbi5leHBpcmVzKSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghYWNjZXNzVG9rZW4uaGFzT3duUHJvcGVydHkoJ2lucHV0JykpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG5cclxuICB9XHJcblxyXG4gIC8vVE9ETzogYWRkIGZ1bmN0aW9uIHRvIG9ubHkgc2V0IG9uZSBuZXcgaWRlbnRpdHkgdXNpbmcgdGhlIG5ldyBpbmRleGVkIHN0b3JhZ2UgbWFuYWdlclxyXG5cclxuICBfc3RvcmUoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBjb25zdCBzdG9yZSA9IE9iamVjdC5rZXlzKHRoaXMuX2lkZW50aXRpZXMpLm1hcCgodXNlclVSTCkgPT4ge1xyXG4gICAgICAgIHJldHVybiBfdGhpcy5fc3RvcmFnZU1hbmFnZXIuc2V0KHVzZXJVUkwsIDAsIHRoaXMuX2lkZW50aXRpZXNbdXNlclVSTF0sICdpZGVudGl0aWVzJyk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgUHJvbWlzZS5hbGwoc3RvcmUpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICByZWplY3QoJ09uIF9zZW5kUmVwb3J0ZXJTZXNzaW9uS2V5IGZyb20gbWV0aG9kIHN0b3JlSWRlbnRpdHkgZXJyb3I6ICcgKyBlcnIpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcbiAgX3N0b3JlQWNjZXNzVG9rZW5zKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgbGV0IGFjY2Vzc1Rva2VucyA9IGRlZXBDbG9uZShfdGhpcy5fYWNjZXNzVG9rZW5zKTtcclxuXHJcbiAgICAgIF90aGlzLl9zdG9yYWdlTWFuYWdlci5zZXQoJ2FjY2Vzc1Rva2VucycsIDAsIGFjY2Vzc1Rva2VucykudGhlbigoKSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIHJlamVjdCgnT24gX3NlbmRSZXBvcnRlclNlc3Npb25LZXkgZnJvbSBtZXRob2Qgc3RvcmVJZGVudGl0eSBlcnJvcjogJyArIGVycik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbi8vIG1vdmUgdG8gSWRlbnRpdHkgc2VydmljZSBmcmFtZXdvcms/XHJcblxyXG5jbGFzcyBJZEFzc2VydGlvbiB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGFzc2VydGlvbiwgaWRwLCB1c2VyUHJvZmlsZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fYXNzZXJ0aW9uID0gYXNzZXJ0aW9uO1xyXG4gICAgX3RoaXMuX2lkcCA9IGlkcDtcclxuICAgIF90aGlzLl91c2VyUHJvZmlsZSA9IHVzZXJQcm9maWxlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFzc2VydGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9hc3NlcnRpb247XHJcbiAgfVxyXG5cclxuICBnZXQgaWRwKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkcDtcclxuICB9XHJcblxyXG4gIGdldCB1c2VyUHJvZmlsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl91c2VyUHJvZmlsZTtcclxuICB9XHJcblxyXG59XHJcblxyXG5jbGFzcyBJZFZhbGlkYXRpb24ge1xyXG5cclxuICBjb25zdHJ1Y3RvcihpZGVudGl0eSwgY29udGVudHMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5pZGVudGl0eSA9IGlkZW50aXR5O1xyXG4gICAgX3RoaXMuY29udGVudHMgPSBjb250ZW50cztcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlcyhpZGVudGl0eSwgY29udGVudHMpIHtcclxuICAgIC8vVE9ETyBpbXBsZW1lbnQgdGhlIGxvZ2ljXHJcblxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSWRlbnRpdGllcztcclxuIiwiLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignSWRlbnRpdHlNb2R1bGUnKTtcclxuXHJcbi8qKlxyXG4qIGZha2UgY2xhc3MgZm9yIHRoZSBndWkgdG8gc2VsZWN0IHRoZSBpZGVudGl0eSxcclxuKiBUT0RPIHJlcGxhY2Ugd2l0aCB0aGUgcHJvcGVyIGlkZW50aXR5IEdVSVxyXG4qXHJcbiovXHJcbmNsYXNzIEd1aUZha2Uge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih1cmwsIG1lc3NhZ2VCdXMpIHtcclxuICAgIGxvZy5sb2coJ0Zha2VHVUlfZGVwbG95ZWQnKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX3VybCA9IHVybDtcclxuICAgIF90aGlzLl93YWl0VGltZSA9IDEwMDAwO1xyXG4gICAgX3RoaXMuX21lc3NhZ2VCdXMgPSBtZXNzYWdlQnVzO1xyXG5cclxuICAgIF90aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF90aGlzLl91cmwsIG1zZyA9PiB7XHJcblxyXG4gICAgICBpZiAobXNnLmhhc093blByb3BlcnR5KCd0eXBlJykgJiZcclxuICAgICAgICAgIG1zZy50eXBlID09PSAnY3JlYXRlJyAmJlxyXG4gICAgICAgICAgbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykgJiZcclxuICAgICAgICAgIG1zZy5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdpZGVudGl0aWVzJykgJiZcclxuICAgICAgICAgIG1zZy5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdpZHBzJykpIHtcclxuXHJcbiAgICAgICAgbGV0IGlkZW50aXRpZXMgPSBtc2cuYm9keS52YWx1ZS5pZGVudGl0aWVzO1xyXG4gICAgICAgIGxldCBpZHBzID0gbXNnLmJvZHkudmFsdWUuaWRwcztcclxuXHJcbiAgICAgICAgbGV0IHZhbHVlO1xyXG5cclxuICAgICAgICBpZiAoaWRlbnRpdGllc1swXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IHt0eXBlOiAnaWRlbnRpdHknLCB2YWx1ZTogaWRlbnRpdGllc1swXSwgY29kZTogMjAwfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFsdWUgPSB7dHlwZTogJ2lkcCcsIHZhbHVlOiBpZHBzWzJdLmRvbWFpbiwgY29kZTogMjAwfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCByZXBseU1zZyA9IHtpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCB0bzogbXNnLmZyb20sIGZyb206IG1zZy50bywgYm9keTogdmFsdWV9O1xyXG5cclxuICAgICAgICAvLyB0byB0ZXN0IG9uIHRoZSBpZGVudGl0eSBzaWRlIHRoZSBsaXN0ZW5lciB3aXRob3V0IHRoZSB0aW1lb3V0XHJcbiAgICAgICAgLy8gY2FuIHJlcHJlc2VudCB0aGUgdGltZSB0aGUgdXNlciB0YWtlcyB0byBjaG9vc2UgYW5kIGlkZW50aXR5XHJcbiAgICAgICAgaWYgKG1zZy5ib2R5LnZhbHVlID09PSAnd2FpdCcpIHtcclxuXHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xyXG4gICAgICAgICAgfSwgX3RoaXMuX3dhaXRUaW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsb2cubG9nKCdJZ25vcmluZyBtZXNzYWdlcyBub3QgaW50ZW5kZWQgdG8gRmFrZUdVSS4nLCBtc2cpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBHdWlGYWtlO1xyXG4iLCIvLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdJZGVudGl0eU1vZHVsZScpO1xyXG5cclxuaW1wb3J0IHsgc2Vjb25kc1NpbmNlRXBvY2gsIGRpdmlkZVVSTCwgcGFyc2VNZXNzYWdlVVJMLCBzdHJpbmdpZnksIGRlZXBDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcclxuaW1wb3J0IHsgcnVudGltZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9ydW50aW1lL3J1bnRpbWVDb25maWd1cmF0aW9uJztcclxuXHJcbmltcG9ydCBJZGVudGl0aWVzIGZyb20gJy4vSWRlbnRpdGllcyc7XHJcbmltcG9ydCBHdWlGYWtlIGZyb20gJy4vR3VpRmFrZSc7XHJcblxyXG4vKipcclxuKlxyXG4qIFRoZSBJZGVudGl0eSBNb2R1bGUgKElkIE1vZHVsZSkgaXMgdGhlIGNvbXBvbmVudCByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlXHJcbiogdXNlciBpZGVudGl0eSBhbmQgdGhlIGFzc29jaWF0aW9uIG9mIHRoaXMgaWRlbnRpdHkgd2l0aCB0aGUgSHlwZXJ0eSBpbnN0YW5jZXMsXHJcbiogaW4gb3JkZXIgdG8gbWFrZSBIeXBlcnR5IGluc3RhbmNlcyBpZGVudGlmaWFibGUuIFRoZSBpZGVudGl0eSBpbiB0aGUgcmVUSElOSyBwcm9qZWN0XHJcbiogaXMgbm90IGZpeGVkIHRvIGEgdW5pcXVlIElkZW50aXR5IFNlcnZpY2UgUHJvdmlkZXIsIGJ1dCBvYnRhaW5lZCB0aHJvdWdoIHNldmVyYWxcclxuKiBkaWZmZXJlbnQgSWRlbnRpdHkgc291cmNlcy4gV2l0aCB0aGlzIGFwcHJvYWNoLCB0aGUgSWQgTW9kdWxlIHByb3ZpZGVzIHRvIHRoZSB1c2VyIHRoZVxyXG4qIG9wdGlvbiB0byBjaG9vc2UgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIGF1dGhlbnRpY2F0aW9uLlxyXG4qIFRoaXMgbW9kdWxlIHdpbGwgdGh1cyBhYmxlIHRvIHN1cHBvcnQgbXVsdGlwbGUgSWRlbnRpdHkgYWNxdWlzaXRpb24gbWV0aG9kcyxcclxuKiBzdWNoIGFzIE9wZW5JRCBjb25uZWN0IDEuMCwgS2VyYmVyb3MgU3lzdGVtLCBvciBhdXRoZW50aWNhdGlvbiB0aHJvdWdoIHNtYXJ0IGNhcmRzLlxyXG4qIEZvciBleGFtcGxlLCBhIHVzZXIgd2l0aCBhIEdvb2dsZSBhY2NvdW50IGNhbiB1c2UgdGhlIEdvb2dsZSBhcyBhbiBJZGVudGl0eSBQcm92aWRlciB0byBwcm92aWRlIElkZW50aXR5IFRva2VucyxcclxuKiAgd2hpY2ggY2FuIGJlIHVzZWQgYnkgdGhlIElkZW50aXR5IE1vZHVsZSB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIEh5cGVydHkgaW5zdGFuY2UuXHJcbipcclxuKiBUaGUgSWRlbnRpdHkgTW9kdWxlIHVzZXMgYSBub2RlIHBhY2thZ2UsIHRoZSBIZWxsb0pTLCB3aGljaCBpcyBhIGNsaWVudC1zaWRlIEphdmFTY3JpcHQgQVBJIGZvciBhdXRoZW50aWNhdGlvblxyXG4qIHRoYXQgZmFjaWxpdGF0ZXMgdGhlIHJlcXVlc3RzIGZvciB0aGUgT3BlbklEIGNvbm5lY3QgcHJvdG9jb2wuIFRoaXMgbWV0aG9kIGFsbG93cyBmb3Igc29tZSBhYnN0cmFjdGlvblxyXG4qIHdoZW4gbWFraW5nIHJlcXVlc3RzIGZvciBkaWZmZXJlbnQgSWRlbnRpdHkgUHJvdmlkZXJzLCBzdWNoIGFzIE9wZW5JRCBjb25uZWN0IHVzZWQgYnkgR29vZ2xlLCBGYWNlYm9vaywgTWljcm9zb2Z0LCBmb3IgZXhhbXBsZS5cclxuKlxyXG4qIFdoZW4gYSByZXF1ZXN0IGZvciBhIHVzZXIgaWRlbnRpdHkgaXMgbWFkZSB1c2luZyB0aGUgbWV0aG9kIGxvZ2luV2l0aFJQKGlkZW50aWZpZXIsIHNjb3BlKSxcclxuKiB0aGlzIG1ldGhvZCB3aWxsIGFuYWx5c2UgdGhlIElkZW50aXR5IFByb3ZpZGVyIGNob3NlbiB0byBvYnRhaW4gYW4gaWRlbnRpdHkgYW5kIHdpbGwgdXNlIHRoZSBIZWxsb0pTIG5vZGUgcGFja2FnZVxyXG4qIHdpdGggdGhlIHNlbGVjdGVkIElkZW50aXR5IFByb3ZpZGVyIGFuZCBpZGVudGl0eSBzY29wZS4gQWZ0ZXIgdGhlIEhlbGxvSlMgcmVxdWVzdCBmb3IgYW4gQWNjZXNzIFRva2VuXHJcbiogdG8gdGhlIElkZW50aXR5IFByb3ZpZGVycywgdGhlIHVzZXIgd2lsbCBiZSBwcm9tcHRlZCB0byBhdXRoZW50aWNhdGUgdG93YXJkcyB0aGUgSWRlbnRpdHkgUHJvdmlkZXIuXHJcbiogVXBvbiByZWNlaXZpbmcgdGhlIEFjY2VzcyBUb2tlbiwgdGhpcyB0b2tlbiBpcyB2YWxpZGF0ZWQgd2l0aCBhIFJFU1RmdWwgd2ViIHNlcnZpY2UgcmVxdWVzdCB0byBhbiBlbmRwb2ludFxyXG4qIG9uIHRoZSBJZGVudGl0eSBQcm92aWRlciBBdXRob3JpemF0aW9uIFNlcnZlciwgYW5kIGFmdGVyIHRoZSB2YWxpZGF0aW9uIGlzIGRvbmUsXHJcbiogYW4gSUQgdG9rZW4gaXMgb2J0YWluZWQgd2l0aCB0aGUgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBzY29wZSByZXF1aXJlZC5cclxuKiBUaGlzIElEIHRva2VuIGlzIHRoZW4gcHJlc2VydmVkIGluIHRoaXMgbW9kdWxlIHRoYXQgY2FuIG9idGFpbmVkIHRocm91Z2ggdGhlIGdldElkZW50aXRpZXMoKVxyXG4qIGFuZCBpcyBwYXNzZWQgYXMgcmV0dXJuIHZhbHVlIG9mIHRoZSBsb2dpbldpdGhSUCBmdW5jdGlvbi4gVGhlIG1ldGhvZHMgZ2VuZXJhdGVBc3NlcnRpb24gYW5kIHZhbGlkYXRlQXNzZXJ0aW9uIGhhdmUgbm90IHlldCBiZWVuIGRldmVsb3BlZC5cclxuKlxyXG4qL1xyXG5jbGFzcyBJZGVudGl0eU1vZHVsZSB7XHJcblxyXG4gIC8qKlxyXG4gICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgdG8gaW5pdGlhbGlzZSB0aGUgSWRlbnRpdHkgTW9kdWxlIGl0IGRvZXMgbm90IHJlcXVpcmUgYW55IGlucHV0LlxyXG4gICovXHJcbiAgY29uc3RydWN0b3IocnVudGltZVVSTCwgcnVudGltZUNhcGFiaWxpdGllcywgc3RvcmFnZU1hbmFnZXIsIGRhdGFPYmplY3RzU3RvcmFnZSwgY3J5cHRvTWFuYWdlciwgcnVudGltZUNhdGFsb2d1ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoIXJ1bnRpbWVVUkwpIHRocm93IG5ldyBFcnJvcigncnVudGltZVVSTCBpcyBtaXNzaW5nLicpO1xyXG4gICAgaWYgKCFzdG9yYWdlTWFuYWdlcikgdGhyb3cgbmV3IEVycm9yKCdzdG9yYWdlTWFuYWdlciBpcyBtaXNzaW5nJyk7XHJcbiAgICBpZiAoIWNyeXB0b01hbmFnZXIpIHRocm93IG5ldyBFcnJvcignY3J5cHRvTWFuYWdlciBpcyBtaXNzaW5nJyk7XHJcbiAgICBpZiAoIXJ1bnRpbWVDYXRhbG9ndWUpIHRocm93IG5ldyBFcnJvcigncnVudGltZUNhdGFsb2d1ZSBpcyBtaXNzaW5nJyk7XHJcblxyXG4gICAgX3RoaXMuX3J1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xyXG5cclxuICAgIF90aGlzLl9ydW50aW1lQ2F0YWxvZ3VlID0gcnVudGltZUNhdGFsb2d1ZTtcclxuXHJcbiAgICBfdGhpcy5kYXRhT2JqZWN0c1N0b3JhZ2UgPSBkYXRhT2JqZWN0c1N0b3JhZ2U7XHJcbiAgICBfdGhpcy5faWRtVVJMID0gX3RoaXMuX3J1bnRpbWVVUkwgKyAnL2lkbSc7XHJcbiAgICBfdGhpcy5fZ3VpVVJMID0gX3RoaXMuX3J1bnRpbWVVUkwgKyAnL2lkZW50aXR5LWd1aSc7XHJcbiAgICBfdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzID0gcnVudGltZUNhcGFiaWxpdGllcztcclxuXHJcbiAgICBfdGhpcy5fZG9tYWluID0gZGl2aWRlVVJMKF90aGlzLl9ydW50aW1lVVJMKS5kb21haW47XHJcblxyXG5cclxuICAgIC8vdG8gc3RvcmUgaXRlbXMgd2l0aCB0aGlzIGZvcm1hdDoge2lkZW50aXR5OiBpZGVudGl0eVVSTCwgdG9rZW46IHRva2VuSUR9XHJcbiAgICBfdGhpcy5faWRlbnRpdGllcyA9IG5ldyBJZGVudGl0aWVzKCdodW1hbicsIHN0b3JhZ2VNYW5hZ2VyKTtcclxuXHJcbiAgICAvLyB0byBiZSByZXZpZXdlZDogd2F0Y2hpbmdZb3UgaWRlbnRpdGllc0xpc3Qgb3IgaWRlbnRpdGllcz9cclxuICAgIC8vICAgIF90aGlzLmlkZW50aXRpZXNMaXN0ID0gX3RoaXMud2F0Y2hpbmdZb3Uud2F0Y2goJ2lkZW50aXRpZXNMaXN0Jywge30sIHRydWUpO1xyXG4gICAgX3RoaXMuX2NyeXB0byA9IGNyeXB0b01hbmFnZXI7XHJcblxyXG4gICAgLyogICAgX3RoaXMuZW1haWxzTGlzdCA9IFtdO1xyXG4gICAgbGV0IG5ld0lkZW50aXR5ID0gbmV3IElkZW50aXR5KCdndWlkJywgJ0hVTUFOJyk7XHJcbiAgICBfdGhpcy5pZGVudGl0eSA9IG5ld0lkZW50aXR5O1xyXG4gICAgX3RoaXMuY3VycmVudElkZW50aXR5O1xyXG4gICAgX3RoaXMuaWRlbnRpdGllcy5kZWZhdWx0SWRlbnRpdHk7Ki9cclxuXHJcbiAgICAvL3N0b3JlcyB0aGUgYXNzb2NpYXRpb24gb2YgdGhlIGRhdGFPYmplY3QgYW5kIHRoZSBIeXBlcnR5IHJlZ2lzdGVyZWQgd2l0aGluXHJcbiAgICBfdGhpcy5kYXRhT2JqZWN0c0lkZW50aXR5ID0ge307IC8vIGlzIHRoaXMgbmVlZGVkP1xyXG5cclxuICAgIF90aGlzLl9saXN0T2ZJZHBzID0gW107XHJcblxyXG4gICAgLy8gdmFyaWFibGUgdG8ga25vdyBpZiB0aGUgR1VJIGlzIGRlcGxveWVkIHRvIGNob29zZSB0aGUgaWRlbnRpdHkuIGlmIHRoZSByZWFsIEdVSSBpcyBub3QgZGVwbG95ZWQsIGEgZmFrZSBndWkgaXMgZGVwbG95ZWQgaW5zdGVhZC5cclxuICAgIF90aGlzLmd1aURlcGxveWVkID0gZmFsc2U7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8qKioqKioqKioqKioqKioqKioqIEdFVCBBTkQgU0VUIE1FVEhPRFMgKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAvKipcclxuICAqIHJldHVybiB0aGUgbWVzc2FnZUJ1cyBpbiB0aGlzIFJlZ2lzdHJ5XHJcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXHJcbiAgKi9cclxuICBnZXQgbWVzc2FnZUJ1cygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX21lc3NhZ2VCdXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNldCB0aGUgbWVzc2FnZUJ1cyBpbiB0aGlzIFJlZ2lzdHJ5XHJcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXHJcbiAgKi9cclxuICBzZXQgbWVzc2FnZUJ1cyhtZXNzYWdlQnVzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX21lc3NhZ2VCdXMgPSBtZXNzYWdlQnVzO1xyXG4gICAgX3RoaXMuYWRkR1VJTGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIHJldHVybiB0aGUgY29yZURpc2NvdmVyeSBjb21wb25lbnRcclxuICAqIGRvIHdlIG5lZWQgdGhpcz8/XHJcbiAgKi9cclxuICBnZXQgY29yZURpc2NvdmVyeSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2NvcmVEaXNjb3Zlcnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNldCB0aGUgY29yZURpc2NvdmVyeSBjb21wb25lbnRcclxuICAqIEBwYXJhbSB7Y29yZURpc2NvdmVyeX0gY29yZURpc2NvdmVyeVxyXG4gICovXHJcbiAgc2V0IGNvcmVEaXNjb3ZlcnkoY29yZURpc2NvdmVyeSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9jb3JlRGlzY292ZXJ5ID0gY29yZURpc2NvdmVyeTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogcmV0dXJuIHRoZSByZWdpc3RyeSBpbiB0aGlzIGlkTW9kdWxlXHJcbiAgKiBAcGFyYW0ge3JlZ2lzdHJ5fSAgICAgICAgICAgcmVnaXN0cnlcclxuICAqL1xyXG4gIGdldCByZWdpc3RyeSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX3JlZ2lzdHJ5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBTZXQgdGhlIHJlZ2lzdHJ5IGluIHRoaXMgaWRNb2R1bGVcclxuICAqIEBwYXJhbSB7cmVnaXN0cnl9ICAgICByZWdcclxuICAqL1xyXG4gIHNldCByZWdpc3RyeShyZWdpc3RyeSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vKioqKioqKioqKioqKioqKioqKiBJREVOVElUWSBSRUxFQVRFRCBNRVRIT0RTICoqKioqKioqKioqKioqKioqKipcclxuICAvKipcclxuICAqIGdldHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBmcm9tIGEgZ2l2ZW4gdXNlclVSTFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgdXNlclVSTCAgICAgdXNlciB1cmxcclxuICAqIEByZXR1cm4ge0pTT059ICAgIGlkZW50aXR5ICAgIGlkZW50aXR5IGJ1bmRsZSBmcm9tIHRoZSB1c2VyVVJMXHJcbiAgKi9cclxuICBnZXRJZGVudGl0eSh1c2VyVVJMKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0aWVzLmdldElkZW50aXR5KHVzZXJVUkwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBGdW5jdGlvbiB0byBzZXQgdGhlIGN1cnJlbnQgSWRlbnRpdHkgd2l0aCBhIGdpdmVuIElkZW50aXR5XHJcbiAgKiBAcGFyYW0ge0lkZW50aXR5fSAgICAgICAgaWRlbnRpdHkgICAgICAgICBpZGVudGl0eVxyXG4gICovXHJcblxyXG4gIC8qICBzZXRDdXJyZW50SWRlbnRpdHkoaWRlbnRpdHkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5jdXJyZW50SWRlbnRpdHkgPSBpZGVudGl0eTtcclxuICB9Ki9cclxuXHJcbiAgLyoqXHJcbiAgKiBGdW5jdGlvbiB0byByZXR1cm4gYWxsIHRoZSBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgd2l0aGluIGEgc2Vzc2lvbiBieSBhIHVzZXIuXHJcbiAgKiBUaGVzZSBpZGVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhbiBhcnJheSBjb250YWluaW5nIGEgSlNPTiBwYWNrYWdlIGZvciBlYWNoIHVzZXIgaWRlbnRpdHkuXHJcbiAgKiBAcmV0dXJuIHtBcnJheTxJZGVudGl0aWVzPn0gICAgICAgICBJZGVudGl0aWVzXHJcbiAgKi9cclxuICBnZXQgaWRlbnRpdGllcygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2lkZW50aXRpZXM7XHJcbiAgfVxyXG5cclxuICBzZXQgaWRlbnRpdGllcyhpZGVudGl0aWVzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX2lkZW50aXRpZXMgPSBpZGVudGl0aWVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlkcHMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGlzdE9mSWRwcztcclxuICB9XHJcblxyXG4gIGdldElkZW50aXRpZXNUb0Nob29zZSgpIHtcclxuICAgIC8vICAgIGxldCBpZGVudGl0aWVzID0gX3RoaXMuaWRlbnRpdGllcy5pZGVudGlmaWVycztcclxuXHJcbiAgICAvLyBsZXQgaWRwcyA9IFtcclxuICAgIC8vICAgeyBkb21haW46ICdnb29nbGUuY29tJywgdHlwZTogJ2lkVG9rZW4nfSxcclxuICAgIC8vICAgeyBkb21haW46ICdtaWNyb3NvZnQuY29tJywgdHlwZTogJ2lkVG9rZW4nfSxcclxuICAgIC8vICAgeyBkb21haW46ICdvcmFuZ2UuZnInLCB0eXBlOiAnaWRUb2tlbid9LFxyXG4gICAgLy8gICB7IGRvbWFpbjogJ3NsYWNrLmNvbScsIHR5cGU6ICdMZWdhY3knfVxyXG4gICAgLy8gXTtcclxuXHJcbiAgICAvLyB0b2RvOiByZXRyaWV2ZSBhdmFpbGFibGUgaWRwcyBmcm9tIHJ1bnRpbWUgY2F0YWxvZ3VlXHJcbiAgICAvLyB0b2RvOiBlbmFibGUgb2F1dGggaWRwc1xyXG4gICAgLy8gbGV0IGlkcHMgPSBbXHJcbiAgICAvLyAgIHsgZG9tYWluOiAnZ29vZ2xlLmNvbScsIHR5cGU6ICdpZFRva2VuJyB9LFxyXG4gICAgLy8gICB7IGRvbWFpbjogJ21pY3Jvc29mdC5jb20nLCB0eXBlOiAnaWRUb2tlbicgfSxcclxuICAgIC8vICAgeyBkb21haW46ICdmYWNlYm9vay5jb20nLCB0eXBlOiAnaWRUb2tlbicgfSxcclxuICAgIC8vICAgeyBkb21haW46ICdzbGFjay5jb20nLCB0eXBlOiAnaWRUb2tlbicgfVxyXG4gICAgLy8gXTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IHVybCA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmNhdGFsb2d1ZVVSTHMuaWRwUHJveHkucHJlZml4ICsgdGhpcy5fZG9tYWluICsgcnVudGltZUNvbmZpZ3VyYXRpb24uY2F0YWxvZ3VlVVJMcy5pZHBQcm94eS5zdWZmaXg7XHJcblxyXG4gICAgICBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzLmlzQXZhaWxhYmxlKCdicm93c2VyJyksXHJcbiAgICAgICAgdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzLmlzQXZhaWxhYmxlKCdub2RlJyldKVxyXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgICBjb25zdCBpc0Jyb3dzZXIgPSByZXN1bHRbMF07XHJcbiAgICAgICAgICBjb25zdCBpc05vZGUgPSByZXN1bHRbMV07XHJcblxyXG4gICAgICAgICAgY29uc3QgY29uc3RyYWludHMgPSB7IGNvbnN0cmFpbnRzOiB7fSB9O1xyXG4gICAgICAgICAgY29uc3RyYWludHMuY29uc3RyYWludHMubm9kZSA9IGlzTm9kZTtcclxuICAgICAgICAgIGNvbnN0cmFpbnRzLmNvbnN0cmFpbnRzLmJyb3dzZXIgPSBpc0Jyb3dzZXI7XHJcblxyXG4gICAgICAgICAgdGhpcy5fcnVudGltZUNhdGFsb2d1ZS5nZXRUeXBlTGlzdCh1cmwsIGNvbnN0cmFpbnRzKS50aGVuKChpZHBzKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpc3RPZklkcHMgPSBpZHBzLm1hcChrZXkgPT4geyByZXR1cm4geyBkb21haW46IGtleSwgdHlwZTogJ2lkVG9rZW4nIH07IH0pO1xyXG4gICAgICAgICAgICBsb2cuaW5mbygnW0lkZW50aXR5TW9kdWxlLmdldElkZW50aXR5QXNzZXJ0aW9uOmdldElkZW50aXRpZXNUb0Nob29zZV0nLCBpZHBzLCBsaXN0T2ZJZHBzKTtcclxuICAgICAgICAgICAgdGhpcy5fbGlzdE9mSWRwcyA9IGxpc3RPZklkcHM7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHsgZGVmYXVsdElkZW50aXR5OiB0aGlzLmlkZW50aXRpZXMuZGVmYXVsdElkZW50aXR5LCBpZGVudGl0aWVzOiB0aGlzLmlkZW50aXRpZXMuaWRlbnRpdGllcywgaWRwczogbGlzdE9mSWRwcyB9KTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEZ1bmN0aW9uIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgSWRlbnRpdHkgd2l0aGluIGEgc2Vzc2lvblxyXG4gICogQHJldHVybiB7SWRlbnRpdHl9ICAgICAgICBpZGVudGl0eSAgICAgICAgIGlkZW50aXR5XHJcbiAgKi9cclxuICAvKiAgZ2V0Q3VycmVudElkZW50aXR5KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5jdXJyZW50SWRlbnRpdHk7XHJcbiAgfSovXHJcblxyXG4gIGluaXQoZ3VpZCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBfdGhpcy5faWRlbnRpdGllcy5sb2FkSWRlbnRpdGllcygpLnRoZW4oKCkgPT4ge1xyXG5cclxuICAgICAgICBpZiAoIWd1aWQpIHtcclxuICAgICAgICAgIF90aGlzLl9jcnlwdG8uZ2V0TXlQdWJsaWNLZXkoKS50aGVuKChrZXkpID0+IHtcclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBfdGhpcy5fY3J5cHRvLmNyeXB0by5fc2hhMjU2KHN0cmluZ2lmeShrZXkpKS50aGVuKChoYXNoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgIGd1aWQgPSAndXNlci1ndWlkOi8vJyArIGhhc2g7XHJcbiAgICAgICAgICAgICAgX3RoaXMuaWRlbnRpdGllcy5ndWlkID0gZ3VpZDtcclxuICAgICAgICAgICAgICBfdGhpcy5faWRlbnRpdGllcy5sb2FkQWNjZXNzVG9rZW5zKCkudGhlbigoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0lkZW50aXR5TW9kdWxlXSBlcnJvcicsIGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIF90aGlzLmlkZW50aXRpZXMuZ3VpZCA9IGd1aWQ7XHJcbiAgICAgICAgICBfdGhpcy5faWRlbnRpdGllcy5sb2FkQWNjZXNzVG9rZW5zKCkudGhlbigoKSA9PiB7XHJcblxyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEZ1bmN0aW9uIHRoYXQgZmV0Y2ggYW4gaWRlbnRpdHlBc3NlcnRpb24gZnJvbSBhIHVzZXIuXHJcbiAgKlxyXG4gICogQHJldHVybiB7SWRBc3NlcnRpb259ICAgICAgICAgICAgICBJZEFzc2VydGlvblxyXG4gICovXHJcbiAgZ2V0SWRlbnRpdHlBc3NlcnRpb24oaWRlbnRpdHlCdW5kbGUpIHtcclxuICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5nZXRJZGVudGl0eUFzc2VydGlvbjppZGVudGl0eUJ1bmRsZV0nLCBpZGVudGl0eUJ1bmRsZSk7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICAvL0NIRUNLIHdoZXRoZXIgaXMgYnJvd3NlciBlbnZpcm9ubWVudCBvciBub2RlanNcclxuICAgICAgLy9pZiBpdCBpcyBicm93c2VyLCB0aGVuIGNyZWF0ZSBhIGZha2UgaWRlbnRpdHlcclxuXHJcbiAgICAgIF90aGlzLnJ1bnRpbWVDYXBhYmlsaXRpZXMuaXNBdmFpbGFibGUoJ2Jyb3dzZXInKS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdydW50aW1lIGJyb3dzZXIgaWRlbnRpdHkgYWNxdWlzaXRpb24nLCByZXN1bHQpO1xyXG5cclxuICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvL3RvZG86IG9ubHkgaWRwIHNob3VsZCBiZSBtYW5kYXRvcnkgd2hlbiBpZGVudGl0eUJ1bmRsZSBleGlzdHNcclxuXHJcbiAgICAgICAgaWYgKGlkZW50aXR5QnVuZGxlICYmXHJcbiAgICAgICAgICBpZGVudGl0eUJ1bmRsZS5oYXNPd25Qcm9wZXJ0eSgnaWRwJykpIHtcclxuXHJcbiAgICAgICAgICBsZXQgaWRwID0gaWRlbnRpdHlCdW5kbGUuaWRwO1xyXG4gICAgICAgICAgbGV0IG9yaWdpbiA9IGlkZW50aXR5QnVuZGxlLmhhc093blByb3BlcnR5KCdvcmlnaW4nKSA/IGlkZW50aXR5QnVuZGxlLm9yaWdpbiA6ICdvcmlnaW4nO1xyXG4gICAgICAgICAgbGV0IGlkSGludCA9IGlkZW50aXR5QnVuZGxlLmhhc093blByb3BlcnR5KCdpZEhpbnQnKSA/IGlkZW50aXR5QnVuZGxlLmlkSGludCA6ICcnO1xyXG5cclxuICAgICAgICAgIGlmIChfdGhpcy5pZGVudGl0aWVzLmRlZmF1bHRJZGVudGl0eSkge1xyXG4gICAgICAgICAgICBsZXQgYXNzZXJ0aW9uID0gX3RoaXMuaWRlbnRpdGllcy5kZWZhdWx0SWRlbnRpdHk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXNzZXJ0aW9uLmV4cGlyZXMgPiBzZWNvbmRzU2luY2VFcG9jaCgpKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXNzZXJ0aW9uKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChhc3NlcnRpb24uaGFzT3duUHJvcGVydHkoJ3JlZnJlc2gnKSkge1xyXG4gICAgICAgICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eS5JZGVudGl0eU1vZHVsZS5nZXRJZGVudGl0eUFzc2VydGlvbl0gcmVmcmVzaGluZyBhc3NlcnRpb246ICcsIGFzc2VydGlvbik7XHJcblxyXG4gICAgICAgICAgICAgIF90aGlzLl9yZWZyZXNoSWRBc3NlcnRpb24oKS50aGVuKChuZXdBc3NlcnRpb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5nZXRJZGVudGl0eUFzc2VydGlvbl0gcmVmcmVzaGVkIGFzc2VydGlvbi4nLCBuZXdBc3NlcnRpb24pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobmV3QXNzZXJ0aW9uKTtcclxuICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignW0lkZW50aXR5TW9kdWxlLmdldElkZW50aXR5QXNzZXJ0aW9uXSBlcnJvciBvbiByZWZyZXNJZEFzc2VydGlvbjogJywgZXJyb3IsICcgQXNraW5nIGZvciBhIG5ldyBJZEFzc2VydGlvbi4nKVxyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2dldElkQXNzZXJ0aW9uRm9yRG9tYWluKG9yaWdpbiwgaWRwLCBpZEhpbnQpLnRoZW4oKGFzc2VydGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKGFzc2VydGlvbik7XHJcbiAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBfdGhpcy5fZ2V0SWRBc3NlcnRpb25Gb3JEb21haW4ob3JpZ2luLCBpZHAsIGlkSGludCkudGhlbigoYXNzZXJ0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGFzc2VydGlvbik7XHJcbiAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfdGhpcy5fZ2V0SWRBc3NlcnRpb25Gb3JEb21haW4ob3JpZ2luLCBpZHAsIGlkSGludCkudGhlbigoYXNzZXJ0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShhc3NlcnRpb24pO1xyXG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIGlmIChfdGhpcy5pZGVudGl0aWVzLmRlZmF1bHRJZGVudGl0eSkge1xyXG4gICAgICAgICAgbGV0IGFzc2VydGlvbiA9IF90aGlzLmlkZW50aXRpZXMuZGVmYXVsdElkZW50aXR5O1xyXG5cclxuICAgICAgICAgIGlmIChhc3NlcnRpb24uZXhwaXJlcyA+IHNlY29uZHNTaW5jZUVwb2NoKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXNzZXJ0aW9uKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoYXNzZXJ0aW9uLmhhc093blByb3BlcnR5KCdyZWZyZXNoJykpIHtcclxuICAgICAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5LklkZW50aXR5TW9kdWxlLmdldFZhbGlkVG9rZW5dIHJlZnJlc2hpbmcgYXNzZXJ0aW9uOiAnLCBhc3NlcnRpb24pO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuX3JlZnJlc2hJZEFzc2VydGlvbihhc3NlcnRpb24pLnRoZW4oKG5ld0Fzc2VydGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5nZXRJZGVudGl0eUFzc2VydGlvbl0gcmVmcmVzaGVkIGFzc2VydGlvbi4nLCBuZXdBc3NlcnRpb24pO1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKG5ld0Fzc2VydGlvbik7XHJcblxyXG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ1tJZGVudGl0eU1vZHVsZS5nZXRJZGVudGl0eUFzc2VydGlvbl0gZXJyb3Igb24gcmVmcmVzSWRBc3NlcnRpb246ICcsIGVycm9yLCAnIEFza2luZyBmb3IgYSBuZXcgSWRBc3NlcnRpb24uJylcclxuXHJcbiAgICAgICAgICAgICAgX3RoaXMuc2VsZWN0SWRlbnRpdHlGcm9tR1VJKCkudGhlbigoYXNzZXJ0aW9uKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlXSBJZGVudGl0eSBzZWxlY3RlZCBmcm9tIEdVSS4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5pZGVudGl0aWVzLmRlZmF1bHRJZGVudGl0eSA9IGFzc2VydGlvbi51c2VyUHJvZmlsZS51c2VyVVJMO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXNzZXJ0aW9uKTtcclxuXHJcbiAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgX3RoaXMuc2VsZWN0SWRlbnRpdHlGcm9tR1VJKCkudGhlbigoYXNzZXJ0aW9uKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZV0gSWRlbnRpdHkgc2VsZWN0ZWQgZnJvbSBHVUkuJyk7XHJcblxyXG4gICAgICAgICAgICAgIF90aGlzLmlkZW50aXRpZXMuZGVmYXVsdElkZW50aXR5ID0gYXNzZXJ0aW9uLnVzZXJQcm9maWxlLnVzZXJVUkw7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXNzZXJ0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIH0sIChlcnIpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBfdGhpcy5zZWxlY3RJZGVudGl0eUZyb21HVUkoKS50aGVuKChhc3NlcnRpb24pID0+IHtcclxuXHJcbiAgICAgICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZV0gSWRlbnRpdHkgc2VsZWN0ZWQgZnJvbSBHVUkuJyk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5pZGVudGl0aWVzLmRlZmF1bHRJZGVudGl0eSA9IGFzc2VydGlvbi51c2VyUHJvZmlsZS51c2VyVVJMO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhc3NlcnRpb24pO1xyXG5cclxuICAgICAgICAgIH0sIChlcnIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIGxvZy5lcnJvcignRXJyb3Igb24gaWRlbnRpdHkgYWNxdWlzaXRpb24gJywgZXJyb3IpO1xyXG4gICAgICAgIHJldHVybiByZWplY3QoZXJyb3IpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIF90aGlzLnJ1bnRpbWVDYXBhYmlsaXRpZXMuaXNBdmFpbGFibGUoJ25vZGUnKS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdub2RlIGlkZW50aXR5IGFjcXVpc2l0aW9uJywgcmVzdWx0KTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybjtcclxuXHJcbiAgICAgICAgaWYgKF90aGlzLmlkZW50aXRpZXMuY3VycmVudElkZW50aXR5KSB7XHJcbiAgICAgICAgICAvL1RPRE8gdmVyaWZ5IHdoZXRoZXIgdGhlIHRva2VuIGlzIHN0aWxsIHZhbGlkIG9yIG5vdC5cclxuICAgICAgICAgIC8vIHNob3VsZCBiZSBuZWVkZWQgdG8gbWFrZSBmdXJ0aGVyIHJlcXVlc3RzLCB0byBvYnRhaW4gYSB2YWxpZCB0b2tlblxyXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoX3RoaXMuaWRlbnRpdGllcy5jdXJyZW50SWRlbnRpdHkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsb2cubG9nKCdnZXRJZGVudGl0eUFzc2VydGlvbiBmb3Igbm9kZWpzJyk7XHJcblxyXG4gICAgICAgICAgbGV0IGlkcCA9IHsgdHlwZTogJ2lkcCcsIHZhbHVlOiAnbm9kZWpzLWlkcCcsIGNvZGU6IDIwMCwgYXV0aDogZmFsc2UgfTtcclxuICAgICAgICAgIF90aGlzLmNhbGxOb2RlSnNHZW5lcmF0ZU1ldGhvZHMoaWRwLnZhbHVlLCAnb3JpZ2luJykudGhlbigodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgIGxvZy5lcnJvcignRXJyb3Igb24gaWRlbnRpdHkgYWNxdWlzaXRpb24gJywgZXJyb3IpO1xyXG4gICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfZ2V0SWRBc3NlcnRpb25Gb3JEb21haW4ob3JpZ2luLCBpZHAsIGlkSGludCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgX3RoaXMuc2VsZWN0SWRlbnRpdHlGb3JIeXBlcnR5KG9yaWdpbiwgaWRwLCBpZEhpbnQpLnRoZW4oKGFzc2VydGlvbikgPT4ge1xyXG4gICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5fZ2V0SWRBc3NlcnRpb25Gb3JEb21haW5dIElkZW50aXR5IHNlbGVjdGVkIGJ5IGh5cGVydHkuJyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoYXNzZXJ0aW9uKTtcclxuICAgICAgfSwgKGVycikgPT4geyAvLyBpZiBpdCBnb3QgYW4gZXJyb3IgdGhlbiBqdXN0IHNlbGVjdCBpZGVudGl0eSBmcm9tIEdVSVxyXG4gICAgICAgIC8vIGxvZy5lcnJvcignW0lkZW50aXR5TW9kdWxlXSBDb3VsZCBub3Qgc2VsZWN0IGlkZW50aXR5IGZyb20gaHlwZXJ0eS4nKTtcclxuXHJcbiAgICAgICAgX3RoaXMuc2VsZWN0SWRlbnRpdHlGcm9tR1VJKCkudGhlbigobmV3QXNzZXJ0aW9uKSA9PiB7XHJcbiAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGUuX2dldElkQXNzZXJ0aW9uRm9yRG9tYWluXSBJZGVudGl0eSBzZWxlY3RlZCBieSBoeXBlcnR5LicpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUobmV3QXNzZXJ0aW9uKTtcclxuICAgICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIF9yZWZyZXNoSWRBc3NlcnRpb24oYXNzZXJ0aW9uKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIF90aGlzLnNlbmRSZWZyZXNoTWVzc2FnZShhc3NlcnRpb24pLnRoZW4oKG5ld0Fzc2VydGlvbikgPT4ge1xyXG4gICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eS5JZGVudGl0eU1vZHVsZS5nZXRWYWxpZFRva2VuXSByZWZyZXNoZWQgYXNzZXJ0aW9uOiAnLCBuZXdBc3NlcnRpb24pO1xyXG4gICAgICAgIF90aGlzLmlkZW50aXRpZXMudXBkYXRlQXNzZXJ0aW9uKG5ld0Fzc2VydGlvbikudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKG5ld0Fzc2VydGlvbik7XHJcbiAgICAgICAgfSwgKGVycikgPT4ge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdbSWRlbnRpdHlNb2R1bGUuZ2V0VmFsaWRUb2tlbl0gZXJyb3IgdXBkYXRpbmcgdGhlIGFzc2VydGlvbiAnLCBlcnIpO1xyXG4gICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sIChlcnIpID0+IHtcclxuICAgICAgICBsb2cuZXJyb3IoJ1tJZGVudGl0eU1vZHVsZS5nZXRWYWxpZFRva2VuXSBlcnJvciByZWZyZXNoaW5nIHRoZSBhc3NlcnRpb24gJywgZXJyKTtcclxuICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgKiBGdW5jdGlvbiB0byByZXR1cm4gYWxsIHRoZSB1c2VycyBVUkxzIHJlZ2lzdGVyZWQgd2l0aGluIGEgc2Vzc2lvblxyXG4gICogVGhlc2UgdXNlcnMgVVJMcyBhcmUgcmV0dXJuZWQgaW4gYW4gYXJyYXkgb2Ygc3RyaW5ncy5cclxuICAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59ICAgICAgICAgdXNlcnNcclxuICAqL1xyXG4gIGdldFVzZXJzSURzKCkge1xyXG4gICAgLyogIGxvZy5sb2coJ1tnZXRVc2Vyc0lEczplbWFpbEZvcm1hdF0nLCBlbWFpbEZvcm1hdCk7XHJcbiAgICAgIGxvZy5sb2coJ2dldFVzZXJzSURzOmVtYWlsRm9ybWF0JywgZW1haWxGb3JtYXQpO1xyXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgICBsZXQgdXNlcnMgPSBbXTsqL1xyXG5cclxuICAgIC8vaWYgcmVxdWVzdCBjb21lcyB3aXRoIHRoZSBlbWFpbEZvcm1hdCBvcHRpb24sIHRoZW4gY29udmVydCB1cmwgdG8gZW1haWwgZm9ybWF0XHJcbiAgICAvKiAgICBsZXQgY29udmVydGVyID0gKGVtYWlsRm9ybWF0KSA/IGdldFVzZXJFbWFpbEZyb21VUkwgOiAodmFsdWUpID0+IHsgcmV0dXJuIHZhbHVlOyB9O1xyXG5cclxuICAgIGZvciAobGV0IGluZGV4IGluIF90aGlzLmlkZW50aXRpZXMpIHtcclxuICAgICAgbGV0IGlkZW50aXR5ID0gX3RoaXMuaWRlbnRpdGllc1tpbmRleF07XHJcbiAgICAgIHVzZXJzLnB1c2goY29udmVydGVyKGlkZW50aXR5LmlkZW50aXR5KSk7XHJcbiAgICB9Ki9cclxuXHJcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0aWVzLmlkZW50aWZpZXJzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBGdW5jdGlvbiB0byByZW1vdmUgYW4gaWRlbnRpdHlcclxuICAqIEBwYXJhbSB7U3RyaW5nfSAgICB1c2VyVVJMICAgICAgdXNlclVSTFxyXG4gICogQHJldHVybiB7UHJvbWlzZX1cclxuICAqL1xyXG5cclxuICBkZWxldGVJZGVudGl0eSh1c2VyVVJMKSB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdGllcy5yZW1vdmVJZGVudGl0eSh1c2VyVVJMKTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIgYW4gaWRlbnRpdHkgZnJvbSB0aGUgZW1haWxzTGlzdCBhcnJheSBhbmQgbm90IHNob3cgaW4gdG8gdGhlIEdVSVxyXG4gICogQHBhcmFtIHtTdHJpbmd9ICAgIGVtYWlsICAgICAgZW1haWxcclxuICAqL1xyXG4gIC8qICB1bnJlZ2lzdGVySWRlbnRpdHkoZW1haWwpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgZm9yIChsZXQgZSBpbiBfdGhpcy5lbWFpbHNMaXN0KSB7XHJcbiAgICAgIGlmIChfdGhpcy5lbWFpbHNMaXN0W2VdID09PSBlbWFpbCkge1xyXG4gICAgICAgIF90aGlzLmVtYWlsc0xpc3Quc3BsaWNlKGUsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSovXHJcblxyXG4gIC8vIHRvIGJlIHVzZWQgd2hlbiBydW50aW1lIGlzIG5vdCBleGVjdXRlZCBpbiBhIHNhbmRib3hcclxuXHJcbiAgbGlzdGVuU2hvd0FkbWluKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9zaG93QWRtaW4gPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRnVuY3Rpb24gdGhhdCBzZW5kcyBhIHJlcXVlc3QgdG8gdGhlIEdVSSB1c2luZyBtZXNzYWdlcy4gU2VuZHMgYWxsIGlkZW50aXRpZXMgcmVnaXN0ZXJlZCBhbmRcclxuICAqIHRoZSBJZHBzIHN1cHBvcnRlZCwgYW5kIHJldHVybiB0aGUgaWRlbnRpdHkvaWRwIHJlY2VpdmVkIGJ5IHRoZSBHVUlcclxuICAqIEBwYXJhbSB7QXJyYXk8aWRlbnRpdHk+fSAgaWRlbnRpdGllcyAgICAgIGxpc3Qgb2YgaWRlbnRpdGlpZXNcclxuICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gICAgaWRwcyAgICAgICAgICAgIGxpc3Qgb2YgaWRwcyB0byBhdXRoZW50aWNhdGVcclxuICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICAgICAgcmV0dXJucyBhIGNob3NlbiBpZGVudGl0eSBvciBpZHBcclxuICAqL1xyXG4gIHJlcXVlc3RJZGVudGl0eVRvR1VJKGlkZW50aXRpZXMsIGlkcHMpIHtcclxuICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5yZXF1ZXN0SWRlbnRpdHlUb0dVSTppZGVudGl0aWVzXScsIGlkZW50aXRpZXMpO1xyXG4gICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlLnJlcXVlc3RJZGVudGl0eVRvR1VJOmlkcHNdJywgaWRwcyk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICAvL2NvbmRpdGlvbiB0byBjaGVjayBpZiB0aGUgcmVhbCBHVUkgaXMgZGVwbG95ZWQuIElmIG5vdCwgZGVwbG95cyBhIGZha2UgZ3VpXHJcbiAgICAgIGlmIChfdGhpcy5ndWlEZXBsb3llZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgZ3VpRmFrZVVSTCA9IF90aGlzLl9ndWlVUkw7XHJcbiAgICAgICAgbGV0IGd1aUZha2UgPSBuZXcgR3VpRmFrZShndWlGYWtlVVJMLCBfdGhpcy5fbWVzc2FnZUJ1cyk7XHJcbiAgICAgICAgX3RoaXMuZ3VpRmFrZSA9IGd1aUZha2U7XHJcbiAgICAgICAgX3RoaXMuZ3VpRGVwbG95ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgbWVzc2FnZSA9IHtcclxuICAgICAgICB0eXBlOiAnY3JlYXRlJywgdG86IF90aGlzLl9ndWlVUkwsIGZyb206IF90aGlzLl9pZG1VUkwsXHJcbiAgICAgICAgYm9keTogeyB2YWx1ZTogeyBpZGVudGl0aWVzOiBpZGVudGl0aWVzLCBpZHBzOiBpZHBzIH0gfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgbGV0IGNhbGxiYWNrID0gbXNnID0+IHtcclxuICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5yZW1vdmVSZXNwb25zZUxpc3RlbmVyKF90aGlzLl9pZG1VUkwsIG1zZy5pZCk7XHJcblxyXG5cclxuICAgICAgICAvLyB0b2RvOiB0byByZXR1cm4gdGhlIHVzZXIgVVJMIGFuZCBub3QgdGhlIGVtYWlsIG9yIGlkZW50aWZpZXJcclxuXHJcbiAgICAgICAgaWYgKG1zZy5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgbGV0IHNlbGVjdGVkSWRlbnRpdHkgPSBtc2cuYm9keTtcclxuXHJcbiAgICAgICAgICBsb2cubG9nKCdzZWxlY3RlZElkZW50aXR5OiAnLCBzZWxlY3RlZElkZW50aXR5LnZhbHVlKTtcclxuICAgICAgICAgIHJlc29sdmUoc2VsZWN0ZWRJZGVudGl0eSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdCgnZXJyb3Igb24gcmVxdWVzdGluZyBhbiBpZGVudGl0eSB0byB0aGUgR1VJJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy9wb3N0TWVzc2FnZSB3aXRoIGNhbGxiYWNrIGJ1dCB3aXRob3V0IHRpbWVvdXRcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCBjYWxsYmFjaywgZmFsc2UpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICByZWplY3QoJ0luIG1ldGhvZCBjYWxsSWRlbnRpdHlNb2R1bGVGdW5jIGVycm9yOiAnICsgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjYWxsTm9kZUpzR2VuZXJhdGVNZXRob2RzKGlkcCwgb3JpZ2luKSB7XHJcbiAgICBsb2cubG9nKCdbY2FsbE5vZGVKc0dlbmVyYXRlTWV0aG9kczppZHBdJywgaWRwKTtcclxuICAgIGxvZy5sb2coJ1tjYWxsTm9kZUpzR2VuZXJhdGVNZXRob2RzOm9yaWdpbl0nLCBvcmlnaW4pO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAvL2RlYnVnZ2VyO1xyXG4gICAgICBsZXQgcHVibGljS2V5O1xyXG5cclxuICAgICAgLy9sZXQga2V5UGFpciA9IG5vZGVKU0tleVBhaXJQb3B1bGF0ZTtcclxuXHJcbiAgICAgIC8vZ2VuZXJhdGVzIHRoZSBSU0Ega2V5IHBhaXJcclxuICAgICAgX3RoaXMuX2NyeXB0by5nZXRNeVB1YmxpY0tleSgpLnRoZW4oZnVuY3Rpb24gKGtleSkge1xyXG5cclxuICAgICAgICBsb2cubG9nKCdbY2FsbE5vZGVKc0dlbmVyYXRlTWV0aG9kczprZXldJywga2V5KTtcclxuXHJcbiAgICAgICAgcHVibGljS2V5ID0gc3RyaW5naWZ5KGtleSk7XHJcblxyXG4gICAgICAgIGxvZy5sb2coJ1tjYWxsTm9kZUpzR2VuZXJhdGVNZXRob2RzXSBOT19VUkwnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIF90aGlzLmdlbmVyYXRlQXNzZXJ0aW9uKHB1YmxpY0tleSwgb3JpZ2luLCAndXJsJywgaWRwKTtcclxuXHJcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KCdFcnJvciBvbiBvYnRhaW5pbmcgSWRlbnRpdHknKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICBsb2cubG9nKGVycik7XHJcbiAgICAgICAgcmVqZWN0KGVycik7XHJcblxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2FsbEdlbmVyYXRlTWV0aG9kcyhpZHAsIG9yaWdpbikge1xyXG4gICAgbG9nLmxvZygnW2NhbGxHZW5lcmF0ZU1ldGhvZHM6aWRwXScsIGlkcCk7XHJcbiAgICBsb2cubG9nKCdbY2FsbEdlbmVyYXRlTWV0aG9kczpvcmlnaW5dJywgb3JpZ2luKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGxldCBwdWJsaWNLZXk7XHJcblxyXG4gICAgICAvL2dlbmVyYXRlcyB0aGUgUlNBIGtleSBwYWlyXHJcbiAgICAgIF90aGlzLl9jcnlwdG8uZ2V0TXlQdWJsaWNLZXkoKS50aGVuKGZ1bmN0aW9uIChrZXkpIHtcclxuXHJcbiAgICAgICAgbG9nLmxvZygnW2NhbGxHZW5lcmF0ZU1ldGhvZHM6a2V5XScsIGtleSk7XHJcblxyXG4gICAgICAgIHB1YmxpY0tleSA9IHN0cmluZ2lmeShrZXkpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgdXNlcmtleVBhaXIgPSBrZXlQYWlyO1xyXG4gICAgICAgIGxvZy5sb2coJ2dlbmVyYXRlQXNzZXJ0aW9uOm5vX2hpbnQnKTtcclxuICAgICAgICByZXR1cm4gX3RoaXMuZ2VuZXJhdGVBc3NlcnRpb24ocHVibGljS2V5LCBvcmlnaW4sICcnLCBpZHApO1xyXG5cclxuICAgICAgfSkudGhlbihmdW5jdGlvbiAodXJsKSB7XHJcbiAgICAgICAgX3RoaXMubXlIaW50ID0gdXJsO1xyXG4gICAgICAgIGxvZy5sb2coJ2dlbmVyYXRlQXNzZXJ0aW9uOmhpbnQnKTtcclxuICAgICAgICByZXR1cm4gX3RoaXMuZ2VuZXJhdGVBc3NlcnRpb24ocHVibGljS2V5LCBvcmlnaW4sIHVybCwgaWRwKTtcclxuXHJcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KCdFcnJvciBvbiBvYnRhaW5pbmcgSWRlbnRpdHknKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcclxuICAgICAgICBsb2cuZXJyb3IoZXJyKTtcclxuICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBsb2dpblNlbGVjdGVkSWRlbnRpdHkocHVibGljS2V5LCBvcmlnaW4sIGlkcCwgbG9naW5VcmwpIHtcclxuICAgIGxvZy5sb2coJ1tsb2dpblNlbGVjdGVkSWRlbnRpdHk6cHVibGljS2V5XScsIHB1YmxpY0tleSk7XHJcbiAgICBsb2cubG9nKCdbbG9naW5TZWxlY3RlZElkZW50aXR5Om9yaWdpbl0nLCBvcmlnaW4pO1xyXG4gICAgbG9nLmxvZygnW2xvZ2luU2VsZWN0ZWRJZGVudGl0eTppZHBdJywgaWRwKTtcclxuXHJcbiAgICAvLyAgICBsb2cubG9nKCdbbG9naW5TZWxlY3RlZElkZW50aXR5OmtleVBhaXJdJywga2V5UGFpcik7XHJcbiAgICBsb2cubG9nKCdbbG9naW5TZWxlY3RlZElkZW50aXR5OmxvZ2luVXJsXScsIGxvZ2luVXJsKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlXSBvcGVuUG9wdXAnKTtcclxuICAgICAgX3RoaXMuY2FsbElkZW50aXR5TW9kdWxlRnVuYygnb3BlblBvcHVwJywgeyB1cmxyZWNlaXZlZDogbG9naW5VcmwgfSkudGhlbigoaWRDb2RlKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGlkQ29kZTtcclxuICAgICAgfSwgKGVycikgPT4ge1xyXG4gICAgICAgIGxvZy5lcnJvcignRXJyb3Igd2hpbGUgbG9nZ2luZyBpbiBmb3IgdGhlIHNlbGVjdGVkIGlkZW50aXR5LicpO1xyXG4gICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcclxuICAgICAgfSkudGhlbigoaWRDb2RlKSA9PiB7XHJcbiAgICAgICAgX3RoaXMuc2VuZEdlbmVyYXRlTWVzc2FnZShwdWJsaWNLZXksIG9yaWdpbiwgaWRDb2RlLCBpZHApLnRoZW4oKG5ld1Jlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAobmV3UmVzcG9uc2UuaGFzT3duUHJvcGVydHkoJ2Fzc2VydGlvbicpKSB7XHJcbiAgICAgICAgICAgIF90aGlzLmlkZW50aXRpZXMuYWRkQXNzZXJ0aW9uKG5ld1Jlc3BvbnNlKS50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSgnTG9naW4gd2FzIHN1Y2Nlc3NmdWxsJyk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7IHJlamVjdCgnTG9naW4gaGFzIGZhaWxlZDonICsgZXJyKTsgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0Vycm9yIHdoaWxlIGxvZ2dpbmcgaW4gZm9yIHRoZSBzZWxlY3RlZCBpZGVudGl0eS4nKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlamVjdCgnQ291bGQgbm90IGdlbmVyYXRlIGEgdmFsaWQgYXNzZXJ0aW9uIGZvciBzZWxlY3RlZCBpZGVudGl0eS4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIGxvZ2luU2VsZWN0ZWRJZGVudGl0eSBmcm9tIG1ldGhvZCBzZW5kR2VuZXJhdGVNZXNzYWdlIGVycm9yOiAgJyArIGVycik7IH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHNlbGVjdElkZW50aXR5Rm9ySHlwZXJ0eShvcmlnaW4sIGlkcCwgaWRIaW50KSB7XHJcbiAgICBsb2cubG9nKCdbc2VsZWN0SWRlbnRpdHlGb3JIeXBlcnR5Om9yaWdpbl0nLCBvcmlnaW4pO1xyXG4gICAgbG9nLmxvZygnW3NlbGVjdElkZW50aXR5Rm9ySHlwZXJ0eTppZHBdJywgaWRwKTtcclxuICAgIGxvZy5sb2coJ1tzZWxlY3RJZGVudGl0eUZvckh5cGVydHk6aWRIaW50XScsIGlkSGludCk7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICAvL2dlbmVyYXRlcyB0aGUgUlNBIGtleSBwYWlyXHJcbiAgICAgIF90aGlzLl9jcnlwdG8uZ2V0TXlQdWJsaWNLZXkoKS50aGVuKGZ1bmN0aW9uIChrZXkpIHtcclxuICAgICAgICBsZXQgcHVibGljS2V5ID0gc3RyaW5naWZ5KGtleSk7XHJcblxyXG4gICAgICAgIF90aGlzLnNlbmRHZW5lcmF0ZU1lc3NhZ2UocHVibGljS2V5LCBvcmlnaW4sIGlkSGludCwgaWRwKS50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmhhc093blByb3BlcnR5KCdhc3NlcnRpb24nKSkgeyAvLyBpZGVudGl0eSB3YXMgbG9nZ2VkIGluLCBqdXN0IHNhdmUgaXRcclxuICAgICAgICAgICAgX3RoaXMuaWRlbnRpdGllcy5hZGRBc3NlcnRpb24ocmVzcG9uc2UpLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuaGFzT3duUHJvcGVydHkoJ2xvZ2luVXJsJykpIHsgLy8gaWRlbnRpdHkgd2FzIG5vdCBsb2dnZWQgaW5cclxuICAgICAgICAgICAgX3RoaXMubG9naW5TZWxlY3RlZElkZW50aXR5KHB1YmxpY0tleSwgb3JpZ2luLCBpZHAsIHJlc3BvbnNlLmxvZ2luVXJsKS50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2UgeyAvLyB5b3Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLCBpZiB5b3UgZG8gdGhlbiB0aGUgSWRQIFByb3h5IGlzIG5vdCB3ZWxsIGltcGxlbWVudGVkXHJcbiAgICAgICAgICAgIC8vIGxvZy5lcnJvcignR2VuZXJhdGVBc3NlcnRpb24gcmV0dXJuZWQgaW52YWxpZCByZXNwb25zZS4nKTtcclxuICAgICAgICAgICAgbG9nLmxvZygnUHJvY2VlZGluZyBieSBsb2dnaW5nIGluLicpO1xyXG4gICAgICAgICAgICBfdGhpcy5jYWxsR2VuZXJhdGVNZXRob2RzKGlkcCwgb3JpZ2luKS50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KCdPbiBzZWxlY3RJZGVudGl0eUZvckh5cGVydHkgZnJvbSBtZXRob2Qgc2VuZEdlbmVyYXRlTWVzc2FnZSBlcnJvcjogICcgKyBlcnIpOyB9KTtcclxuICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KCdPbiBzZWxlY3RJZGVudGl0eUZvckh5cGVydHkgZnJvbSBtZXRob2QgZ2VuZXJhdGVSU0FLZXlQYWlyIGVycm9yOiAgJyArIGVycik7IH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RJZGVudGl0eUZyb21HVUkob3JpZ2luKSB7XHJcbiAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGUuc2VsZWN0SWRlbnRpdHlGcm9tR1VJOm9yaWdpbl0nLCBvcmlnaW4pO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5nZXRJZGVudGl0aWVzVG9DaG9vc2UoKS50aGVuKChpZGVudGl0aWVzSW5mbykgPT4ge1xyXG4gICAgICAgIHJldHVybiBfdGhpcy5yZXF1ZXN0SWRlbnRpdHlUb0dVSShpZGVudGl0aWVzSW5mby5pZGVudGl0aWVzLCBpZGVudGl0aWVzSW5mby5pZHBzKTtcclxuICAgICAgfSkudGhlbih2YWx1ZSA9PiB7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS50eXBlID09PSAnaWRlbnRpdHknKSB7XHJcblxyXG4gICAgICAgICAgLy8gIGxldCBjaG9zZW5JRCA9IGdldFVzZXJVUkxGcm9tRW1haWwodmFsdWUudmFsdWUpO1xyXG4gICAgICAgICAgLy8gaGFjayB3aGlsZSB0aGUgdXNlciB1cmwgaXMgbm90IHJldHVybmVkIGZyb20gcmVxdWVzdElkZW50aXR5VG9HVUk7XHJcblxyXG4gICAgICAgICAgLyogICAgICAgICAgbGV0IGNob3NlbklEID0gJ3VzZXI6Ly8nICsgX3RoaXMuaWRlbnRpdGllcy5jdXJyZW50SWRlbnRpdHkuaWRwLmRvbWFpbiArICcvJyArIHZhbHVlLnZhbHVlO1xyXG5cclxuICAgICAgICAgIF90aGlzLmlkZW50aXRpZXMuZGVmYXVsdElkZW50aXR5ID0gX3RoaXMuaWRlbnRpdGllcy5jdXJyZW50SWRlbnRpdHk7Ki9cclxuXHJcbiAgICAgICAgICAvLyByZXR1cm5zIHRoZSBpZGVudGl0eSBpbmZvIGZyb20gdGhlIGNob3NlbiBpZFxyXG4gICAgICAgICAgLy8gICAgICAgICAgaWYgKF90aGlzLmlkZW50aXRpZXMuY3VycmVudElkZW50aXR5KSByZXNvbHZlKF90aGlzLmlkZW50aXRpZXMuY3VycmVudElkZW50aXR5LmFzc2VydGlvbik7XHJcbiAgICAgICAgICBpZiAoX3RoaXMuaWRlbnRpdGllcy5pZGVudGl0aWVzW3ZhbHVlLnZhbHVlXSkgcmVzb2x2ZShfdGhpcy5pZGVudGl0aWVzLmlkZW50aXRpZXNbdmFsdWUudmFsdWVdKTtcclxuICAgICAgICAgIGVsc2UgcmVqZWN0KCdbSWRlbnRpdHlNb2R1bGUuc2VsZWN0SWRlbnRpdHlGcm9tR1VJXSBpZGVudGl0eSBub3QgZm91bmQ6ICcsIHZhbHVlLnZhbHVlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT09ICdpZHAnKSB7XHJcblxyXG4gICAgICAgICAgX3RoaXMuY2FsbEdlbmVyYXRlTWV0aG9kcyh2YWx1ZS52YWx1ZSwgb3JpZ2luKS50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnZXJyb3Igb24gR1VJIHJlY2VpdmVkIG1lc3NhZ2UuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIHNlbGVjdElkZW50aXR5RnJvbUdVSSBmcm9tIG1ldGhvZCByZXF1ZXN0SWRlbnRpdHlUb0dVSSBlcnJvcjogICcgKyBlcnIpOyB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGNhbGxJZGVudGl0eU1vZHVsZUZ1bmMobWV0aG9kTmFtZSwgcGFyYW1ldGVycywgZG9tYWluLCByZXNvdXJjZSkge1xyXG4gICAgbG9nLmxvZygnW2NhbGxJZGVudGl0eU1vZHVsZUZ1bmM6bWV0aG9kTmFtZV0nLCBtZXRob2ROYW1lKTtcclxuICAgIGxvZy5sb2coJ1tjYWxsSWRlbnRpdHlNb2R1bGVGdW5jOnBhcmFtZXRlcnNdJywgcGFyYW1ldGVycyk7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBpZiAoX3RoaXMuX3Nob3dBZG1pbikge1xyXG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZ2V0QWNjZXNzVG9rZW4nKSB7XHJcbiAgICAgICAgICBfdGhpcy5fc2hvd0FkbWluKG1ldGhvZE5hbWUsIHBhcmFtZXRlcnMudXJscmVjZWl2ZWQsIGRvbWFpbiwgcmVzb3VyY2UpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgX3RoaXMuX3Nob3dBZG1pbihtZXRob2ROYW1lKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBsZXQgbWVzc2FnZSA9IHtcclxuICAgICAgICAgIHR5cGU6ICdleGVjdXRlJywgdG86IF90aGlzLl9ndWlVUkwsIGZyb206IF90aGlzLl9pZG1VUkwsXHJcbiAgICAgICAgICBib2R5OiB7IHJlc291cmNlOiAnaWRlbnRpdHknLCBtZXRob2Q6IG1ldGhvZE5hbWUsIHBhcmFtczogcGFyYW1ldGVycyB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy9wb3N0IG1zZyB3aXRoIGNhbGxiYWNrIGJ1dCB3aXRob3V0IHRpbW91dFxyXG4gICAgICAgIGxldCBjYWxsYmFjayA9IG1zZyA9PiB7XHJcbiAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5yZW1vdmVSZXNwb25zZUxpc3RlbmVyKF90aGlzLl9pZG1VUkwsIG1zZy5pZCk7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gbXNnLmJvZHkudmFsdWU7XHJcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0cnkge1xyXG5cclxuICAgICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIGNhbGxiYWNrLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgcmVqZWN0KCdJbiBtZXRob2QgY2FsbElkZW50aXR5TW9kdWxlRnVuYyBlcnJvcjogJyArIGVycik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyoqKioqKioqKioqKioqKioqKiogVE9LRU4gTUVUSE9EUyAqKioqKioqKioqKioqKioqKioqXHJcbiAgLyoqXHJcbiAgKiBnZXQgYSBUb2tlbiB0byBiZSBhZGRlZCB0byBhIG1lc3NhZ2VcclxuICAqIEBwYXJhbSAge1N0cmluZ30gIGZyb21VUkwgICAgIG9yaWdpbiBvZiB0aGUgbWVzc2FnZVxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgdG9VUkwgICAgIHRhcmdldCBvZiB0aGUgbWVzc2FnZW9rXHJcbiAgKiBAcmV0dXJuIHtKU09OfSAgICB0b2tlbiAgICB0b2tlbiB0byBiZSBhZGRlZCB0byB0aGUgbWVzc2FnZVxyXG4gICovXHJcbiAgZ2V0VG9rZW4obXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGZyb21VUkwgPSBtc2cuZnJvbTtcclxuICAgIGxldCB0b1VybCA9IG1zZy50bztcclxuICAgIGlmIChtc2cuaGFzT3duUHJvcGVydHkoJ2JvZHknKSAmJiBtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnc291cmNlJykpIHtcclxuICAgICAgZnJvbVVSTCA9IG1zZy5ib2R5LnNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobXNnLnR5cGUgPT09ICdmb3J3YXJkJykge1xyXG4gICAgICBmcm9tVVJMID0gbXNnLmJvZHkuZnJvbTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobXNnLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3N1YnNjcmliZXInKSkge1xyXG4gICAgICBmcm9tVVJMID0gbXNnLmJvZHkuc3Vic2NyaWJlcjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGUuZ2V0VG9rZW5dIGZvciBtc2cgJywgbXNnKTtcclxuXHJcbiAgICAgIC8vbG9nLmxvZygndG9VcmwnLCB0b1VybCk7XHJcbiAgICAgIF90aGlzLnJlZ2lzdHJ5LmlzTGVnYWN5KHRvVXJsKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcclxuICAgICAgICAvLyBsb2cubG9nKCdbSWRlbnRpdHkuSWRlbnRpdHlNb2R1bGUuZ2V0VG9rZW5dIGlzTEVHQUNZOiAnLCByZXN1bHQpO1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuXHJcbiAgICAgICAgICBfdGhpcy5fZ2V0QWNjZXNzVG9rZW4obXNnKS50aGVuKCh0b2tlbikgPT4ge1xyXG4gICAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGUuZ2V0VG9rZW5dIGFjY2VzcyB0b2tlbiAnLCB0b2tlbik7XHJcbiAgICAgICAgICAgIHJlc29sdmUoZGVlcENsb25lKHRva2VuKSk7XHJcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5nZXRUb2tlbl0gQWNjZXNzIFRva2VuIGVycm9yICcgKyBlcnIpOyB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgX3RoaXMuX2dldFZhbGlkVG9rZW4oZnJvbVVSTCkudGhlbigodG9rZW4pID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0b2tlbik7XHJcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIGdldFRva2VuIGZyb20gbWV0aG9kIF9nZXRWYWxpZFRva2VuIGVycm9yOiAnICsgZXJyKTsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIGdldFRva2VuIGZyb20gbWV0aG9kIGlzTGVnYWN5IGVycm9yOiAnICsgZXJyKTsgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAqIGdldCBhbiBJZCBUb2tlbiBmb3IgYSBIeXBlcnR5VVJMXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICBoeXBlcnR5VVJMICAgICB0aGUgSHlwZXJ0eSBhZGRyZXNzXHJcbiAgKiBAcmV0dXJuIHtKU09OfSAgICB0b2tlbiAgICBJZCB0b2tlbiB0byBiZSBhZGRlZCB0byB0aGUgbWVzc2FnZVxyXG4gICovXHJcbiAgZ2V0SWRUb2tlbihoeXBlcnR5VVJMKSB7XHJcbiAgICBsb2cuaW5mbygnZ2V0SWRUb2tlbjpoeXBlcnR5VVJMICcsIGh5cGVydHlVUkwpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIGxldCBzcGxpdFVSTCA9IGh5cGVydHlVUkwuc3BsaXQoJzovLycpO1xyXG4gICAgICBsZXQgdXNlclVSTDtcclxuICAgICAgaWYgKHNwbGl0VVJMWzBdICE9PSAnaHlwZXJ0eScpIHsgLy8gaXQgaXMgYSBEYXRhIE9iamVjdCBVUkxcclxuXHJcbiAgICAgICAgX3RoaXMuX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdChoeXBlcnR5VVJMKS50aGVuKChyZXR1cm5lZEh5cGVydHlVUkwpID0+IHtcclxuXHJcbiAgICAgICAgICB1c2VyVVJMID0gX3RoaXMucmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKHJldHVybmVkSHlwZXJ0eVVSTCk7XHJcblxyXG4gICAgICAgICAgaWYgKHVzZXJVUkwpIHtcclxuICAgICAgICAgICAgbGV0IGlkZW50aXR5ID0gX3RoaXMuaWRlbnRpdGllcy5nZXRJZGVudGl0eSh1c2VyVVJMKTtcclxuICAgICAgICAgICAgaWYgKGlkZW50aXR5KSByZXR1cm4gcmVzb2x2ZShpZGVudGl0eSk7XHJcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLmdldElkVG9rZW5dIElkZW50aXR5IG5vdCBmb3VuZCBmb3I6ICcsIHVzZXJVUkwpO1xyXG4gICAgICAgICAgfSBlbHNlIHsgcmV0dXJuIHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLmdldElkVG9rZW5dIFVzZXIgbm90IGZvdW5kIGZvciBoeXBlcnR5OiAnLCByZXR1cm5lZEh5cGVydHlVUkwpOyB9XHJcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdbSWRlbnRpdHlNb2R1bGUuZ2V0SWRUb2tlbl0gRXJyb3I6ICcsIHJlYXNvbik7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1c2VyVVJMID0gX3RoaXMucmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKGh5cGVydHlVUkwpO1xyXG4gICAgICAgIGlmICh1c2VyVVJMKSB7XHJcblxyXG4gICAgICAgICAgbGV0IGlkZW50aXR5ID0gX3RoaXMuaWRlbnRpdGllcy5nZXRJZGVudGl0eSh1c2VyVVJMKTtcclxuICAgICAgICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIHJlc29sdmUoaWRlbnRpdHkpO1xyXG4gICAgICAgICAgZWxzZSByZXR1cm4gcmVqZWN0KCdbSWRlbnRpdHlNb2R1bGUuZ2V0SWRUb2tlbl0gSWRlbnRpdHkgbm90IGZvdW5kIGZvcjogJywgdXNlclVSTCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7IHJldHVybiByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5nZXRJZFRva2VuXSBVc2VyIG5vdCBmb3VuZCBmb3IgaHlwZXJ0eTogJywgdXNlclVSTCk7IH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGdldCBhbiBBY2Nlc3MgVG9rZW4gZm9yIGFuIGV4dGVybmFsIEFQSVxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgdXJsICAgICB0aGUgZXh0ZXJuYWwgdXJsXHJcbiAgKiBAcmV0dXJuIHtKU09OfSAgICB0b2tlbiAgICBBY2Nlc3MgdG9rZW4gdG8gYmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2VcclxuICAqL1xyXG4gIF9nZXRBY2Nlc3NUb2tlbihtc2cpIHtcclxuICAgIGxldCB1cmwgPSBtc2cudG87XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgaWYgKCFtc2cuaGFzT3duUHJvcGVydHkoJ2JvZHknKSkge1xyXG4gICAgICAgIHJldHVybiByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5fZ2V0QWNjZXNzVG9rZW5dIG1pc3NpbmcgbWFuZGF0b3J5IG1zZyBib2R5OiAnLCBtc2cpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcclxuICAgICAgICByZXR1cm4gcmVqZWN0KCdbSWRlbnRpdHlNb2R1bGUuX2dldEFjY2Vzc1Rva2VuXSBtaXNzaW5nIG1hbmRhdG9yeSBtc2cgYm9keSB2YWx1ZTogJywgbXNnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIW1zZy5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdyZXNvdXJjZXMnKSkge1xyXG4gICAgICAgIHJldHVybiByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5fZ2V0QWNjZXNzVG9rZW5dIG1pc3NpbmcgbWFuZGF0b3J5IG1zZyBib2R5IHZhbHVlIHJlc291cmNlczogJywgbXNnKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgZG9tYWluVG9DaGVjayA9IGRpdmlkZVVSTCh1cmwpLmRvbWFpbjtcclxuXHJcbiAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ3Byb3Rvc3R1YicpKSB7XHJcbiAgICAgICAgZG9tYWluVG9DaGVjayA9IGRvbWFpblRvQ2hlY2sucmVwbGFjZShkb21haW5Ub0NoZWNrLnNwbGl0KCcuJylbMF0gKyAnLicsICcnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHJlc291cmNlcyA9IG1zZy5ib2R5LnZhbHVlLnJlc291cmNlcztcclxuXHJcbiAgICAgIF90aGlzLl9nZXRBY2Nlc3NUb2tlbkZvckRvbWFpbihkb21haW5Ub0NoZWNrLCByZXNvdXJjZXMpLnRoZW4oKHRva2VuKSA9PiB7XHJcbiAgICAgICAgcmVzb2x2ZSh0b2tlbik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgX2dldEFjY2Vzc1Rva2VuRm9yRG9tYWluKGRvbWFpblRvQ2hlY2ssIHJlc291cmNlcykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCB0b2tlbjtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0b2tlbiA9IF90aGlzLmlkZW50aXRpZXMuZ2V0QWNjZXNzVG9rZW4oZG9tYWluVG9DaGVjaywgcmVzb3VyY2VzKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJldHVybiByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5fZ2V0QWNjZXNzVG9rZW5Gb3JEb21haW5dIEFjY2VzcyBUb2tlbiBlcnJvciAnICsgZXJyKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0b2tlbikge1xyXG4gICAgICAgIF90aGlzLl9nZXROZXdBY2Nlc3NUb2tlbihkb21haW5Ub0NoZWNrLCByZXNvdXJjZXMpLnRoZW4oKHRva2VuKSA9PiB7XHJcbiAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHkuSWRlbnRpdHlNb2R1bGUuX2dldEFjY2Vzc1Rva2VuRm9yRG9tYWluXSBuZXcgQWNjZXNzIFRva2VuICcsIHRva2VuKTtcclxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHRva2VuKTtcclxuICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5fZ2V0QWNjZXNzVG9rZW5Gb3JEb21haW5dIG9uIGdldE5ld0FjY2Vzc1Rva2VuICcgKyBlcnIpOyB9KTtcclxuICAgICAgfSBlbHNlIGlmICh0b2tlbi5zdGF0dXMgPT09ICdpbi1wcm9ncmVzcycpIHtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZShfdGhpcy5faW5Qcm9ncmVzc0FjY2Vzc1Rva2VuKGRvbWFpblRvQ2hlY2ssIHJlc291cmNlcykpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCB0aW1lTm93ID0gc2Vjb25kc1NpbmNlRXBvY2goKTtcclxuXHJcbiAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5LklkZW50aXR5TW9kdWxlLl9nZXRBY2Nlc3NUb2tlbkZvckRvbWFpbl0gZm91bmQgIEFjY2VzcyBUb2tlbiAnLCB0b2tlbik7XHJcblxyXG4gICAgICAgIGlmICh0aW1lTm93ID49IHRva2VuLmV4cGlyZXMpIHtcclxuICAgICAgICAgIC8vICAgICAgICBpZiAodHJ1ZSkge1xyXG4gICAgICAgICAgaWYgKHRva2VuLmhhc093blByb3BlcnR5KFwicmVmcmVzaFwiKSkge1xyXG4gICAgICAgICAgICBfdGhpcy5fcmVmcmVzaEFjY2Vzc1Rva2VuKGRlZXBDbG9uZSh0b2tlbikpLnRoZW4oKG5ld1Rva2VuKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoX3RoaXMuaWRlbnRpdGllcy51cGRhdGVBY2Nlc3NUb2tlbihuZXdUb2tlbikpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9yZXZva2VBY2Nlc3NUb2tlbih0b2tlbiwgZG9tYWluVG9DaGVjaywgcmVzb3VyY2VzKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZ2V0TmV3QWNjZXNzVG9rZW4oZG9tYWluVG9DaGVjaywgcmVzb3VyY2VzKTtcclxuXHJcbiAgICAgICAgICAgICAgfSwgMTAwMCk7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB9IFxyXG5cclxuICAgICAgICB9IGVsc2UgcmV0dXJuIHJlc29sdmUoZGVlcENsb25lKHRva2VuKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBfcmV2b2tlQWNjZXNzVG9rZW4odG9rZW4sIGRvbWFpbiwgcmVzb3VyY2VzKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvLyAgICBsZXQgZG9tYWluID0gX3RoaXMuX3Jlc29sdmVEb21haW4ob2xkSWRlbnRpdHkuaWRwKTtcclxuICAgIC8vICAgIGxldCBtZXNzYWdlO1xyXG4gICAgLy8gICAgbGV0IGFzc2VydGlvbiA9IF90aGlzLmdldElkZW50aXR5KG9sZElkZW50aXR5LnVzZXJQcm9maWxlLnVzZXJVUkwpO1xyXG5cclxuICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5fcmV2b2tlQWNjZXNzVG9rZW5dIHRvIGJlIHJldm9rZWQgJywgdG9rZW4pO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4vLyAgICAgIGxldCBkb21haW4gPSBfdGhpcy5fcmVzb2x2ZURvbWFpbih0b2tlbi5kb21haW4pO1xyXG4gICAgICBsZXQgbWVzc2FnZTtcclxuXHJcbiAgICAgIG1lc3NhZ2UgPSB7XHJcbiAgICAgICAgdHlwZTogJ2V4ZWN1dGUnLFxyXG4gICAgICAgIHRvOiBfdGhpcy5fcmVzb2x2ZURvbWFpbih0b2tlbi5kb21haW4pLFxyXG4gICAgICAgIGZyb206IF90aGlzLl9pZG1VUkwsXHJcbiAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgbWV0aG9kOiAncmV2b2tlQWNjZXNzVG9rZW4nLFxyXG4gICAgICAgICAgcGFyYW1zOiB7IHRva2VuOiB0b2tlbiB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlLl9yZXZva2VBY2Nlc3NUb2tlbl0gcmV2b2tlIG1zZyAnLCBtZXNzYWdlKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcykgPT4ge1xyXG5cclxuICAgICAgICAgIGxldCByZXN1bHQgPSByZXMuYm9keS52YWx1ZTtcclxuICAgICAgICAgIGlmIChyZXN1bHQpIF90aGlzLl9pZGVudGl0aWVzLnJlbW92ZUFjY2Vzc1Rva2VuKGRvbWFpbiwgcmVzb3VyY2VzKS50aGVuKCgpPT57XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmVqZWN0KCdJbiBJZGVudGl0eU1vZHVsZS5fcmV2b2tlQWNjZXNzVG9rZW4gb24gcG9zdE1lc3NhZ2UgZXJyb3I6ICcgKyBlcnIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG5cclxuXHJcblxyXG4gIH1cclxuXHJcblxyXG4gIF9pblByb2dyZXNzQWNjZXNzVG9rZW4oZG9tYWluLCByZXNvdXJjZXMpIHtcclxuICAgIHRoaXMuaWRlbnRpdGllcy53YXRjaGluZ1lvdS5vYnNlcnZlKCdhY2Nlc3NUb2tlbnMnLCAoY2hhbmdlKSA9PiB7XHJcblxyXG4gICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGUuX2luUHJvZ3Jlc3NBY2Nlc3NUb2tlbl0gYWNjZXNzVG9rZW5zIGNoYW5nZWQgJyArIHRoaXMuaWRlbnRpdGllcy5hY2Nlc3NUb2tlbnMpO1xyXG5cclxuICAgICAgbGV0IGtleXBhdGggPSBjaGFuZ2Uua2V5cGF0aDtcclxuXHJcbiAgICAgIGlmIChrZXlwYXRoLmluY2x1ZGVzKCdzdGF0dXMnKSkge1xyXG4gICAgICAgIGtleXBhdGggPSBrZXlwYXRoLnJlcGxhY2UoJy5zdGF0dXMnLCAnJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChrZXlwYXRoID09PSBkb21haW4gJiYgY2hhbmdlLm5hbWUgPT09ICdzdGF0dXMnICYmIGNoYW5nZS5uZXdWYWx1ZSA9PT0gJ2NyZWF0ZWQnKSB7XHJcbiAgICAgICAgLy8gbG9nLmxvZygnW0lkZW50aXR5LklkZW50aXR5TW9kdWxlLmdldFRva2VuXSB0b2tlbiBpcyBjcmVhdGVkICcgKyBfdGhpcy5pZGVudGl0aWVzTGlzdFtkb21haW5dKTtcclxuICAgICAgICByZXR1cm4gKHRoaXMuaWRlbnRpdGllcy5nZXRBY2Nlc3NUb2tlbihkb21haW4sIHJlc291cmNlcykpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgX2dldE5ld0FjY2Vzc1Rva2VuKGRvbWFpbiwgcmVzb3VyY2VzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBfdGhpcy5pZGVudGl0aWVzLnNldEFjY2Vzc1Rva2VuSW5Qcm9ncmVzcyhkb21haW4pO1xyXG5cclxuICAgICAgbGV0IG1lc3NhZ2UgPSB7XHJcbiAgICAgICAgdHlwZTogJ2V4ZWN1dGUnLFxyXG4gICAgICAgIHRvOiBfdGhpcy5fcmVzb2x2ZURvbWFpbihkb21haW4pLFxyXG4gICAgICAgIGZyb206IF90aGlzLl9pZG1VUkwsXHJcbiAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgbWV0aG9kOiAnZ2V0QWNjZXNzVG9rZW5BdXRob3Jpc2F0aW9uRW5kcG9pbnQnLFxyXG4gICAgICAgICAgcGFyYW1zOiByZXNvdXJjZXNcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvL2xldCdzIGZpcnN0IGdldCB0aGUgYXV0aG9yaXNhdGlvbiBVUkwgZnJvbSB0aGUgSWRwIFByb3h5XHJcbiAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXMpID0+IHtcclxuICAgICAgICBpZiAocmVzLmJvZHkuY29kZSA+IDI5OSkge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLl9nZXROZXdBY2Nlc3NUb2tlbl0gRXJyb3Igb24gZ2V0QWNjZXNzVG9rZW5BdXRob3Jpc2F0aW9uRW5kcG9pbnQgZnJvbSBJZFAgUHJveHk6ICcsIHJlcy5ib2R5LmRlc2MpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbGV0J3MgYXNrIHRoZSB1c2VyIGZvciBhdXRob3Jpc2F0aW9uXHJcbiAgICAgICAgX3RoaXMuY2FsbElkZW50aXR5TW9kdWxlRnVuYygnZ2V0QWNjZXNzVG9rZW4nLCB7IHVybHJlY2VpdmVkOiByZXMuYm9keS52YWx1ZSB9LCBkb21haW4sIHJlc291cmNlc1swXSkudGhlbigoYXV0aG9yaXNhdGlvbikgPT4ge1xyXG4gICAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlOmNhbGxJZGVudGl0eU1vZHVsZUZ1bmM6b3BlblBvcHVwXSBhdWh0b3Jpc2F0aW9uIHJlc3VsdDogJywgYXV0aG9yaXNhdGlvbik7XHJcblxyXG4gICAgICAgICAgbWVzc2FnZS5ib2R5Lm1ldGhvZCA9ICdnZXRBY2Nlc3NUb2tlbic7XHJcbiAgICAgICAgICBtZXNzYWdlLmJvZHkucGFyYW1zID0ge1xyXG4gICAgICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcclxuICAgICAgICAgICAgbG9naW46IGF1dGhvcmlzYXRpb25cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgLy93aWh0b3V0IGNhbGxiYWNrIHRvIGF2b2lkIHRpbWVvdXQgZXJyb3JzP1xyXG5cclxuICAgICAgICAgIC8vIGxldCdzIGFzayBBY2Nlc3MgVG9rZW4gZnJvbSB0aGUgSWRwIFByb3h5XHJcbiAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVzKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXMuYm9keS5jb2RlID4gMjk5KSByZXR1cm4gcmVqZWN0KCdbSWRlbnRpdHlNb2R1bGUuX2dldE5ld0FjY2Vzc1Rva2VuXSBFcnJvciBvbiBnZXRBY2Nlc3NUb2tlbiBmcm9tIElkUCBQcm94eTogJywgcmVzLmJvZHkuZGVzYyk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5pZGVudGl0aWVzLmFkZEFjY2Vzc1Rva2VuKHJlcy5ib2R5LnZhbHVlKS50aGVuKCh0b2tlbikgPT4ge1xyXG4gICAgICAgICAgICAgIGxvZy5pbmZvKCdbSWRlbnRpdHlNb2R1bGUuX2dldE5ld0FjY2Vzc1Rva2VuXSByZXNvbHZpbmcgdG9rZW46ICcsIHRva2VuKTtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXMuYm9keS52YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgKGVycikgPT4ge1xyXG4gICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBfcmVmcmVzaEFjY2Vzc1Rva2VuKG91dGRhdGVkVG9rZW4pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy8gICAgbGV0IGRvbWFpbiA9IF90aGlzLl9yZXNvbHZlRG9tYWluKG9sZElkZW50aXR5LmlkcCk7XHJcbiAgICAvLyAgICBsZXQgbWVzc2FnZTtcclxuICAgIC8vICAgIGxldCBhc3NlcnRpb24gPSBfdGhpcy5nZXRJZGVudGl0eShvbGRJZGVudGl0eS51c2VyUHJvZmlsZS51c2VyVVJMKTtcclxuXHJcbiAgICBsb2cubG9nKCdJZGVudGl0eU1vZHVsZS5fcmVmcmVzaEFjY2Vzc1Rva2VuOm91dGRhdGVkVG9rZW4nLCBvdXRkYXRlZFRva2VuKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgbGV0IGRvbWFpbiA9IF90aGlzLl9yZXNvbHZlRG9tYWluKG91dGRhdGVkVG9rZW4uZG9tYWluKTtcclxuICAgICAgbGV0IG1lc3NhZ2U7XHJcblxyXG4gICAgICBtZXNzYWdlID0geyB0eXBlOiAnZXhlY3V0ZScsIHRvOiBkb21haW4sIGZyb206IF90aGlzLl9pZG1VUkwsIGJvZHk6IHsgbWV0aG9kOiAncmVmcmVzaEFjY2Vzc1Rva2VuJywgcGFyYW1zOiB7IHRva2VuOiBvdXRkYXRlZFRva2VuIH0gfSB9O1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXMpID0+IHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSByZXMuYm9keS52YWx1ZTtcclxuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmVqZWN0KCdJbiBJZGVudGl0eU1vZHVsZS5fcmVmcmVzaEFjY2Vzc1Rva2VuIG9uIHBvc3RNZXNzYWdlIGVycm9yOiAnICsgZXJyKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHNlbmRSZWZyZXNoTWVzc2FnZShvbGRJZGVudGl0eSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvLyAgICBsZXQgZG9tYWluID0gX3RoaXMuX3Jlc29sdmVEb21haW4ob2xkSWRlbnRpdHkuaWRwKTtcclxuICAgIC8vICAgIGxldCBtZXNzYWdlO1xyXG4gICAgLy8gICAgbGV0IGFzc2VydGlvbiA9IF90aGlzLmdldElkZW50aXR5KG9sZElkZW50aXR5LnVzZXJQcm9maWxlLnVzZXJVUkwpO1xyXG5cclxuICAgIGxvZy5sb2coJ3NlbmRSZWZyZXNoTWVzc2FnZTpvbGRJZGVudGl0eScsIG9sZElkZW50aXR5KTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZXQgZG9tYWluID0gX3RoaXMuX3Jlc29sdmVEb21haW4ob2xkSWRlbnRpdHkuaWRwLmRvbWFpbik7XHJcbiAgICAgIGxldCBtZXNzYWdlO1xyXG4gICAgICBsZXQgYXNzZXJ0aW9uID0gX3RoaXMuZ2V0SWRlbnRpdHkob2xkSWRlbnRpdHkudXNlclByb2ZpbGUudXNlclVSTCk7XHJcblxyXG4gICAgICBsb2cuaW5mbygnc2VuZFJlZnJlc2hNZXNzYWdlOm9sZElkZW50aXR5Jywgb2xkSWRlbnRpdHkpO1xyXG5cclxuICAgICAgbWVzc2FnZSA9IHsgdHlwZTogJ2V4ZWN1dGUnLCB0bzogZG9tYWluLCBmcm9tOiBfdGhpcy5faWRtVVJMLCBib2R5OiB7IHJlc291cmNlOiAnaWRlbnRpdHknLCBtZXRob2Q6ICdyZWZyZXNoQXNzZXJ0aW9uJywgcGFyYW1zOiB7IGlkZW50aXR5OiBhc3NlcnRpb24gfSB9IH07XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcykgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5ib2R5LmNvZGUgPCAzMDApIHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcy5ib2R5LnZhbHVlO1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXMuYm9keS52YWx1ZS5ib2R5LnBhcmFtcywgaWRlbnRpdHkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICByZWplY3QoJ0luIHNlbmRSZWZyZXNoTWVzc2FnZSBvbiBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRBY2Nlc3NUb2tlbihpZHBEb21haW4sIHJlc291cmNlcywgbG9naW4pIHtcclxuICAgIGxvZy5sb2coJ1tnZXRBY2Nlc3NUb2tlbjppZHBEb21haW5dJywgaWRwRG9tYWluKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGxldCBkb21haW4gPSBfdGhpcy5fcmVzb2x2ZURvbWFpbihpZHBEb21haW4pO1xyXG4gICAgICBsZXQgbWVzc2FnZTtcclxuXHJcbiAgICAgIG1lc3NhZ2UgPSB7XHJcbiAgICAgICAgdHlwZTogJ2V4ZWN1dGUnLCB0bzogZG9tYWluLCBmcm9tOiBfdGhpcy5faWRtVVJMLCBib2R5OiB7IHJlc291cmNlOiAnaWRlbnRpdHknLCBtZXRob2Q6ICdnZXRBY2Nlc3NUb2tlbicsIHBhcmFtczogeyByZXNvdXJjZXM6IHJlc291cmNlcywgbG9naW46IGxvZ2luIH0gfVxyXG4gICAgICB9O1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXMpID0+IHtcclxuXHJcbiAgICAgICAgICBpZiAocmVzLmJvZHkuY29kZSA8IDI5OSkge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzLmJvZHkudmFsdWU7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlcy5ib2R5KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmVqZWN0KCdJZGVudGl0eU1vZHVsZS5JbiBnZXRBY2Nlc3NUb2tlbjogJyArIGVycik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWNjZXNzVG9rZW5BdXRob3Jpc2F0aW9uRW5kcG9pbnQoc2NvcGUsIGlkcERvbWFpbikge1xyXG4gICAgbG9nLmxvZygnW2dldEFjY2Vzc1Rva2VuQXV0aG9yaXNhdGlvbkVuZHBvaW50OmlkcERvbWFpbl0nLCBpZHBEb21haW4pO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgbGV0IGRvbWFpbiA9IF90aGlzLl9yZXNvbHZlRG9tYWluKGlkcERvbWFpbik7XHJcbiAgICAgIGxldCBtZXNzYWdlO1xyXG5cclxuICAgICAgbWVzc2FnZSA9IHtcclxuICAgICAgICB0eXBlOiAnZXhlY3V0ZScsIHRvOiBkb21haW4sIGZyb206IF90aGlzLl9pZG1VUkwsIGJvZHk6IHsgcmVzb3VyY2U6ICdpZGVudGl0eScsIG1ldGhvZDogJ2dldEFjY2Vzc1Rva2VuQXV0aG9yaXNhdGlvbkVuZHBvaW50JywgcGFyYW1zOiB7IHJlc291cmNlczogc2NvcGUgfSB9XHJcbiAgICAgIH07XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcykgPT4ge1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcy5ib2R5LnZhbHVlO1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICByZWplY3QoJ0luIGdldEFjY2Vzc1Rva2VuQXV0aG9yaXNhdGlvbkVuZHBvaW50OiAnICsgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZW5kR2VuZXJhdGVNZXNzYWdlKGNvbnRlbnRzLCBvcmlnaW4sIHVzZXJuYW1lSGludCwgaWRwRG9tYWluKSB7XHJcbiAgICBsb2cubG9nKCdbc2VuZEdlbmVyYXRlTWVzc2FnZTpjb250ZW50c10nLCBjb250ZW50cyk7XHJcbiAgICBsb2cubG9nKCdbc2VuZEdlbmVyYXRlTWVzc2FnZTpvcmlnaW5dJywgb3JpZ2luKTtcclxuICAgIGxvZy5sb2coJ1tzZW5kR2VuZXJhdGVNZXNzYWdlOnVzZXJuYW1lSGludF0nLCB1c2VybmFtZUhpbnQpO1xyXG4gICAgbG9nLmxvZygnW3NlbmRHZW5lcmF0ZU1lc3NhZ2U6aWRwRG9tYWluXScsIGlkcERvbWFpbik7XHJcbiAgICBsb2cubG9nKCdzZW5kR2VuZXJhdGVNZXNzYWdlX2hpbnQnKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGxldCBkb21haW4gPSBfdGhpcy5fcmVzb2x2ZURvbWFpbihpZHBEb21haW4pO1xyXG4gICAgICBsZXQgbWVzc2FnZTtcclxuXHJcbiAgICAgIG1lc3NhZ2UgPSB7XHJcbiAgICAgICAgdHlwZTogJ2V4ZWN1dGUnLCB0bzogZG9tYWluLCBmcm9tOiBfdGhpcy5faWRtVVJMLCBib2R5OiB7IHJlc291cmNlOiAnaWRlbnRpdHknLCBtZXRob2Q6ICdnZW5lcmF0ZUFzc2VydGlvbicsIHBhcmFtczogeyBjb250ZW50czogY29udGVudHMsIG9yaWdpbjogb3JpZ2luLCB1c2VybmFtZUhpbnQ6IHVzZXJuYW1lSGludCB9IH1cclxuICAgICAgfTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVzKSA9PiB7XHJcblxyXG4gICAgICAgICAgaWYgKHJlcy5ib2R5LmNvZGUgPCAzMDApIHJlc29sdmUocmVzLmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgZWxzZSByZWplY3QocmVzLmJvZHkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICByZWplY3QoJ0luIHNlbmRHZW5lcmF0ZU1lc3NhZ2U6ICcgKyBlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUmVxdWVzdHMgdGhlIElkcFByb3h5IGZyb20gYSBnaXZlbiBEb21haW4gZm9yIGFuIGlkZW50aXR5QXNzZXJ0aW9uXHJcbiAgKlxyXG4gICogQHBhcmFtICB7RE9NU3RyaW5nfSBjb250ZW50cyAgICAgY29udGVudHNcclxuICAqIEBwYXJhbSAge0RPTVN0cmluZ30gb3JpZ2luICAgICAgIG9yaWdpblxyXG4gICogQHBhcmFtICB7RE9NU3RyaW5nfSB1c2VybmFtZUhpbnQgdXNlcm5hbWVIaW50XHJcbiAgKiBAcGFyYW0gIHtKU09OfSAgICAgIGtleVBhaXIgICAgICAgdXNlciBrZXlQYWlyXHJcbiAgKiBAcmV0dXJuIHtJZEFzc2VydGlvbn0gICAgICAgICAgICAgIElkQXNzZXJ0aW9uXHJcbiAgKi9cclxuICBnZW5lcmF0ZUFzc2VydGlvbihjb250ZW50cywgb3JpZ2luLCB1c2VybmFtZUhpbnQsIGlkcERvbWFpbikge1xyXG4gICAgbG9nLmxvZygnW2dlbmVyYXRlQXNzZXJ0aW9uOmNvbnRlbnRzXScsIGNvbnRlbnRzKTtcclxuICAgIGxvZy5sb2coJ1tnZW5lcmF0ZUFzc2VydGlvbjpvcmlnaW5dJywgb3JpZ2luKTtcclxuICAgIGxvZy5sb2coJ1tnZW5lcmF0ZUFzc2VydGlvbjp1c2VybmFtZUhpbnRdJywgdXNlcm5hbWVIaW50KTtcclxuXHJcbiAgICAvLyAgICBsb2cubG9nKCdbZ2VuZXJhdGVBc3NlcnRpb246a2V5UGFpcl0nLCBrZXlQYWlyKTtcclxuICAgIGxvZy5sb2coJ1tnZW5lcmF0ZUFzc2VydGlvbjppZHBEb21haW5dJywgaWRwRG9tYWluKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlOnNlbmRHZW5lcmF0ZU1lc3NhZ2U6c2VuZEdlbmVyYXRlTWVzc2FnZV0nLCB1c2VybmFtZUhpbnQpO1xyXG4gICAgICBfdGhpcy5zZW5kR2VuZXJhdGVNZXNzYWdlKGNvbnRlbnRzLCBvcmlnaW4sIHVzZXJuYW1lSGludCwgaWRwRG9tYWluKS50aGVuKChyZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCkge1xyXG5cclxuICAgICAgICAgIF90aGlzLmlkZW50aXRpZXMuYWRkQXNzZXJ0aW9uKHJlc3VsdCkudGhlbigodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICAgICAgfSwgKGVycikgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KCdlcnJvciBvbiBvYnRhaW5pbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IuaGFzT3duUHJvcGVydHkoJ2Rlc2NyaXB0aW9uJykgJiYgZXJyb3IuZGVzY3JpcHRpb24uaGFzT3duUHJvcGVydHkoJ2xvZ2luVXJsJykpIHtcclxuICAgICAgICAgIF90aGlzLmNhbGxJZGVudGl0eU1vZHVsZUZ1bmMoJ29wZW5Qb3B1cCcsIHsgdXJscmVjZWl2ZWQ6IGVycm9yLmRlc2NyaXB0aW9uLmxvZ2luVXJsIH0pLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZTpjYWxsSWRlbnRpdHlNb2R1bGVGdW5jOm9wZW5Qb3B1cF0nLCB1c2VybmFtZUhpbnQpO1xyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxvZy5lcnJvcignW0lkZW50aXR5TW9kdWxlOnNlbmRHZW5lcmF0ZU1lc3NhZ2VdIGdlbmVyYXRlIGFzc2VydGlvbiB3aXRoIGhpbnQgZXJyb3IgJywgZXJyb3IpO1xyXG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmNhdGNoKGVyciA9PiB7IHJlamVjdCgnT24gZ2VuZXJhdGVBc3NlcnRpb24gZnJvbSBtZXRob2Qgc2VuZEdlbmVyYXRlTWVzc2FnZSBlcnJvcjogJyArIGVycik7IH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFJlcXVlc3RzIHRoZSBJZHBQcm94eSBmcm9tIGEgZ2l2ZW4gRG9tYWluIHRvIHZhbGlkYXRlIGFuIElkZW50aXR5QXNzZXJ0aW9uXHJcbiAgKiBSZXR1cm5zIGEgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHQgZnJvbSB0aGUgdmFsaWRhdGlvbi5cclxuICAqIEBwYXJhbSAge0RPTVN0cmluZ30gYXNzZXJ0aW9uXHJcbiAgKiBAcGFyYW0gIHtET01TdHJpbmd9IG9yaWdpbiAgICAgICBvcmlnaW5cclxuICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICAgICAgUHJvbWlzZSAgICAgICAgIHByb21pc2Ugd2l0aCB0aGUgcmVzdWx0IGZyb20gdGhlIHZhbGlkYXRpb25cclxuICAqL1xyXG4gIHZhbGlkYXRlQXNzZXJ0aW9uKGFzc2VydGlvbiwgb3JpZ2luLCBpZHBEb21haW4pIHtcclxuICAgIGxvZy5sb2coJ1t2YWxpZGF0ZUFzc2VydGlvbjphc3NlcnRpb25dJywgYXNzZXJ0aW9uKTtcclxuICAgIGxvZy5sb2coJ1t2YWxpZGF0ZUFzc2VydGlvbjpvcmlnaW5dJywgb3JpZ2luKTtcclxuICAgIGxvZy5sb2coJ1t2YWxpZGF0ZUFzc2VydGlvbjppZHBEb21haW5dJywgaWRwRG9tYWluKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGRvbWFpbiA9IF90aGlzLl9yZXNvbHZlRG9tYWluKGlkcERvbWFpbik7XHJcblxyXG4gICAgbGV0IG1lc3NhZ2UgPSB7XHJcbiAgICAgIHR5cGU6ICdleGVjdXRlJywgdG86IGRvbWFpbiwgZnJvbTogX3RoaXMuX2lkbVVSTCwgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlOiAnaWRlbnRpdHknLCBtZXRob2Q6ICd2YWxpZGF0ZUFzc2VydGlvbicsXHJcbiAgICAgICAgcGFyYW1zOiB7IGFzc2VydGlvbjogYXNzZXJ0aW9uLCBvcmlnaW46IG9yaWdpbiB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0LmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVqZWN0KCdlcnJvcicsIHJlc3VsdC5ib2R5LmNvZGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICByZWplY3QoJ09uIHZhbGlkYXRlQXNzZXJ0aW9uIGZyb20gbWV0aG9kIHBvc3RNZXNzYWdlIGVycm9yOiAnICsgZXJyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRHVUlMaXN0ZW5lcnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF90aGlzLl9pZG1VUkwsIChtc2cpID0+IHtcclxuICAgICAgbGV0IGZ1bmNOYW1lID0gbXNnLmJvZHkubWV0aG9kO1xyXG5cclxuICAgICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlOmFkZEdVSUxpc3RlbmVyc10nLCBtc2csIG1zZy5ib2R5LCBmdW5jTmFtZSk7XHJcblxyXG4gICAgICBsZXQgcmV0dXJuZWRWYWx1ZTtcclxuXHJcbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gJ2RlcGxveUdVSScpIHtcclxuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuZGVwbG95R1VJKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdnZXRJZGVudGl0aWVzVG9DaG9vc2UnKSB7XHJcbiAgICAgICAgX3RoaXMuZ2V0SWRlbnRpdGllc1RvQ2hvb3NlKCkudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAvLyBpZiB0aGUgZnVuY3Rpb24gcmVxdWVzdGVkIGlzIG5vdCBhIHByb21pc2VcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IHsgdHlwZTogJ2V4ZWN1dGUnLCB2YWx1ZTogcmVzdWx0LCBjb2RlOiAyMDAgfTtcclxuICAgICAgICAgIGxldCByZXBseU1zZyA9IHsgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgdG86IG1zZy5mcm9tLCBmcm9tOiBtc2cudG8sIGJvZHk6IHZhbHVlIH07XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZnJvbSBpZiBzdG9yZUlkZW50aXR5IG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ3VucmVnaXN0ZXJJZGVudGl0eScpIHtcclxuICAgICAgICBsZXQgZW1haWwgPSBtc2cuYm9keS5wYXJhbXMuZW1haWw7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLnVucmVnaXN0ZXJJZGVudGl0eShlbWFpbCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdnZXRNeVB1YmxpY0tleScpIHtcclxuICAgICAgICAvLyBiZWNhdXNlIGdlbmVyYXRlUlNBS2V5UGFpciBpcyBhIHByb21pc2VcclxuICAgICAgICAvLyB3ZSBoYXZlIHRvIHNlbmQgdGhlIG1lc3NhZ2Ugb25seSBhZnRlciBnZXR0aW5nIHRoZSBrZXkgcGFpclxyXG4gICAgICAgIF90aGlzLl9jcnlwdG8uZ2V0TXlQdWJsaWNLZXkoKS50aGVuKChwdWJLZXkpID0+IHtcclxuICAgICAgICAgIHB1YktleSA9IHN0cmluZ2lmeShwdWJLZXkpO1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0geyB0eXBlOiAnZXhlY3V0ZScsIHZhbHVlOiBwdWJLZXksIGNvZGU6IDIwMCB9O1xyXG4gICAgICAgICAgbGV0IHJlcGx5TXNnID0geyBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCB0bzogbXNnLmZyb20sIGZyb206IG1zZy50bywgYm9keTogdmFsdWUgfTtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHJlcGx5TXNnKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ09uIGFkZEdVSUxpc3RlbmVycyBmcm9tIGlmIGdlbmVyYXRlUlNBS2V5UGFpciBtZXRob2QgcG9zdE1lc3NhZ2UgZXJyb3I6ICcgKyBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ3NlbmRHZW5lcmF0ZU1lc3NhZ2UnKSB7XHJcbiAgICAgICAgbGV0IGNvbnRlbnRzID0gbXNnLmJvZHkucGFyYW1zLmNvbnRlbnRzO1xyXG4gICAgICAgIGxldCBvcmlnaW4gPSBtc2cuYm9keS5wYXJhbXMub3JpZ2luO1xyXG4gICAgICAgIGxldCB1c2VybmFtZUhpbnQgPSBtc2cuYm9keS5wYXJhbXMudXNlcm5hbWVIaW50O1xyXG4gICAgICAgIGxldCBpZHBEb21haW4gPSBtc2cuYm9keS5wYXJhbXMuaWRwRG9tYWluO1xyXG4gICAgICAgIGxldCByZXBseU1zZyA9IHsgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgdG86IG1zZy5mcm9tLCBmcm9tOiBtc2cudG8gfTtcclxuICAgICAgICBfdGhpcy5zZW5kR2VuZXJhdGVNZXNzYWdlKGNvbnRlbnRzLCBvcmlnaW4sIHVzZXJuYW1lSGludCwgaWRwRG9tYWluKS50aGVuKChyZXR1cm5lZFZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSB7IHR5cGU6ICdleGVjdXRlJywgdmFsdWU6IHJldHVybmVkVmFsdWUsIGNvZGU6IDIwMCB9O1xyXG4gICAgICAgICAgcmVwbHlNc2cuYm9keSA9IHZhbHVlO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignSWRlbnRpdHlNb2R1bGUuYWRkR1VJTGlzdGVuZXJzIHNlbmRHZW5lcmF0ZU1lc3NhZ2UgZXJyb3I6ICcgKyBlcnIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBsb2cuaW5mbygnSURQUHJveHkgZ2VuZXJhdGVBc3NlcnRpb24gcmVwbHkgZXJyb3IgJyArIGVycik7XHJcbiAgICAgICAgICByZXBseU1zZy5ib2R5ID0gZXJyO1xyXG4gICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xyXG5cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdnZXRBY2Nlc3NUb2tlbkF1dGhvcmlzYXRpb25FbmRwb2ludCcpIHtcclxuICAgICAgICBsZXQgc2NvcGUgPSBtc2cuYm9keS5wYXJhbXMuc2NvcGU7XHJcbiAgICAgICAgbGV0IGlkcERvbWFpbiA9IG1zZy5ib2R5LnBhcmFtcy5pZHBEb21haW47XHJcbiAgICAgICAgX3RoaXMuZ2V0QWNjZXNzVG9rZW5BdXRob3Jpc2F0aW9uRW5kcG9pbnQoc2NvcGUsIGlkcERvbWFpbikudGhlbigocmV0dXJuZWRWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0geyB0eXBlOiAnZXhlY3V0ZScsIHZhbHVlOiByZXR1cm5lZFZhbHVlLCBjb2RlOiAyMDAgfTtcclxuICAgICAgICAgIGxldCByZXBseU1zZyA9IHsgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgdG86IG1zZy5mcm9tLCBmcm9tOiBtc2cudG8sIGJvZHk6IHZhbHVlIH07XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZnJvbSBpZiBzZW5kR2VuZXJhdGVNZXNzYWdlIG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2FkZEFjY2Vzc1Rva2VuJykge1xyXG4gICAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IG1zZy5ib2R5LnBhcmFtcztcclxuXHJcbiAgICAgICAgX3RoaXMuaWRlbnRpdGllcy5hZGRBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikudGhlbigocmV0dXJuZWRWYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IHZhbHVlID0geyB0eXBlOiAnZXhlY3V0ZScsIHZhbHVlOiByZXR1cm5lZFZhbHVlLCBjb2RlOiAyMDAgfTtcclxuICAgICAgICAgIGxldCByZXBseU1zZyA9IHsgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgdG86IG1zZy5mcm9tLCBmcm9tOiBtc2cudG8sIGJvZHk6IHZhbHVlIH07XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZnJvbSBpZiBzdG9yZUlkZW50aXR5IG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2dldEFjY2Vzc1Rva2VuJykge1xyXG5cclxuICAgICAgICBsZXQgZG9tYWluID0gbXNnLmJvZHkucGFyYW1zLmlkcERvbWFpbjtcclxuICAgICAgICBsZXQgcmVzb3VyY2VzID0gbXNnLmJvZHkucGFyYW1zLnJlc291cmNlcztcclxuICAgICAgICBsZXQgbG9naW4gPSBtc2cuYm9keS5wYXJhbXMubG9naW47XHJcbiAgICAgICAgbGV0IHJlcGx5TXNnID0geyBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCB0bzogbXNnLmZyb20sIGZyb206IG1zZy50byB9O1xyXG5cclxuICAgICAgICBfdGhpcy5nZXRBY2Nlc3NUb2tlbihkb21haW4sIHJlc291cmNlcywgbG9naW4pLnRoZW4oKHJldHVybmVkVmFsdWUpID0+IHtcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IHsgdHlwZTogJ2V4ZWN1dGUnLCB2YWx1ZTogcmV0dXJuZWRWYWx1ZSwgY29kZTogMjAwIH07XHJcbiAgICAgICAgICByZXBseU1zZy5ib2R5ID0gdmFsdWU7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZnJvbSBpZiBzZW5kR2VuZXJhdGVNZXNzYWdlIG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVwbHlNc2cuYm9keSA9IGVycm9yO1xyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZnJvbSBpZiBzZW5kR2VuZXJhdGVNZXNzYWdlIG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2FkZEFzc2VydGlvbicpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbXNnLmJvZHkucGFyYW1zO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgbGV0IGtleVBhaXIgPSBtc2cuYm9keS5wYXJhbXMua2V5UGFpcjtcclxuICAgICAgICBfdGhpcy5pZGVudGl0aWVzLmFkZEFzc2VydGlvbihyZXN1bHQpLnRoZW4oKHJldHVybmVkVmFsdWUpID0+IHtcclxuICAgICAgICAgIGxldCB2YWx1ZSA9IHsgdHlwZTogJ2V4ZWN1dGUnLCB2YWx1ZTogcmV0dXJuZWRWYWx1ZSwgY29kZTogMjAwIH07XHJcbiAgICAgICAgICBsZXQgcmVwbHlNc2cgPSB7IGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIHRvOiBtc2cuZnJvbSwgZnJvbTogbXNnLnRvLCBib2R5OiB2YWx1ZSB9O1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignT24gYWRkR1VJTGlzdGVuZXJzIGZyb20gaWYgc3RvcmVJZGVudGl0eSBtZXRob2QgcG9zdE1lc3NhZ2UgZXJyb3I6ICcgKyBlcnIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdyZWZyZXNoQWNjZXNzVG9rZW4nKSB7XHJcbiAgICAgICAgbGV0IGRvbWFpbiA9IG1zZy5ib2R5LnBhcmFtcy5kb21haW47XHJcbiAgICAgICAgbGV0IHJlc291cmNlcyA9IG1zZy5ib2R5LnBhcmFtcy5yZXNvdXJjZXM7XHJcblxyXG4gICAgICAgIF90aGlzLl9nZXRBY2Nlc3NUb2tlbkZvckRvbWFpbihkb21haW4sIHJlc291cmNlcykudGhlbigodG9rZW4pID0+IHtcclxuICAgICAgICAgIGxldCByZXBseU1zZyA9IHtcclxuICAgICAgICAgICAgaWQ6IG1zZy5pZCxcclxuICAgICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgICAgICAgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgICBmcm9tOiBtc2cudG8sXHJcbiAgICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgICB2YWx1ZTogdG9rZW4uYWNjZXNzVG9rZW4sXHJcbiAgICAgICAgICAgICAgY29kZTogMjAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZm9yIHJlZnJlc2hBY2Nlc3NUb2tlbiByZXF1ZXN0OiAnICsgZXJyKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAndW5hdXRob3Jpc2UnKSB7XHJcbiAgICAgICAgbGV0IGRvbWFpbiA9IG1zZy5ib2R5LnBhcmFtcy5kb21haW47XHJcbiAgICAgICAgbGV0IHJlc291cmNlcyA9IG1zZy5ib2R5LnBhcmFtcy5yZXNvdXJjZXM7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBfdGhpcy5fcmV2b2tlQWNjZXNzVG9rZW4oX3RoaXMuaWRlbnRpdGllcy5nZXRBY2Nlc3NUb2tlbihkb21haW4sIHJlc291cmNlcyksIGRvbWFpbiwgcmVzb3VyY2VzKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KCdbSWRlbnRpdHlNb2R1bGUuYWRkR1VJTGlzdGVuZXJzXSB1bmF1dGhvcmlzZSBlcnJvciAnICsgZXJyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHJlcGx5TXNnID0ge1xyXG4gICAgICAgICAgICBpZDogbXNnLmlkLFxyXG4gICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnLFxyXG4gICAgICAgICAgICB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgICAgIGZyb206IG1zZy50byxcclxuICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgIHZhbHVlOiB0cnVlLFxyXG4gICAgICAgICAgICAgIGNvZGU6IDIwMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignT24gYWRkR1VJTGlzdGVuZXJzIGZvciByZWZyZXNoQWNjZXNzVG9rZW4gcmVxdWVzdDogJyArIGVycik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfS8qZWxzZSBpZiAoZnVuY05hbWUgPT09ICdzZWxlY3RJZGVudGl0eUZvckh5cGVydHknKSB7XHJcbiAgICAgICAgbGV0IG9yaWdpbiA9IG1zZy5ib2R5LnBhcmFtcy5vcmlnaW47XHJcbiAgICAgICAgbGV0IGlkcCA9IG1zZy5ib2R5LnBhcmFtcy5pZHA7XHJcbiAgICAgICAgbGV0IGlkSGludCA9IG1zZy5ib2R5LnBhcmFtcy5pZEhpbnQ7XHJcbiAgICAgICAgX3RoaXMuc2VsZWN0SWRlbnRpdHlGb3JIeXBlcnR5KG9yaWdpbiwgaWRwLCBpZEhpbnQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfSovXHJcblxyXG4gICAgICAvLyBpZiB0aGUgZnVuY3Rpb24gcmVxdWVzdGVkIGlzIG5vdCBhIHByb21pc2VcclxuICAgICAgbGV0IHZhbHVlID0geyB0eXBlOiAnZXhlY3V0ZScsIHZhbHVlOiByZXR1cm5lZFZhbHVlLCBjb2RlOiAyMDAgfTtcclxuICAgICAgbGV0IHJlcGx5TXNnID0geyBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCB0bzogbXNnLmZyb20sIGZyb206IG1zZy50bywgYm9keTogdmFsdWUgfTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGxvZy5lcnJvcignT24gYWRkR1VJTGlzdGVuZXJzIGZyb20gaWYgc3RvcmVJZGVudGl0eSBtZXRob2QgcG9zdE1lc3NhZ2UgZXJyb3I6ICcgKyBlcnIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZXBsb3lHVUkoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuZ3VpRGVwbG95ZWQgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8qKioqKioqKioqKioqKioqKioqIFBSSVZBVEUgTUVUSE9EUyAqKioqKioqKioqKioqKioqKioqXHJcbiAgLyoqXHJcbiAgICogR2V0VmFsaWRUb2tlbiBpcyBmb3Igbm9uIGxlZ2FjeSBoeXBlcnRpZXMgYW5kIHZlcmlmaWVzIGlmIHRoZSBUb2tlbiBpcyBzdGlsbCB2YWxpZFxyXG4gICAqIGlmIHRoZSB0b2tlbiBpcyBpbnZhbGlkIGl0IHJlcXVlc3RzIGEgbmV3IHRva2VuXHJcbiAgICogQHBhcmFtICB7U3RyaW5nfSBoeXBlcnR5VVJMIGh5cGVydHlVUkxcclxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxyXG4gICAqL1xyXG4gIF9nZXRWYWxpZFRva2VuKGh5cGVydHlVUkwpIHtcclxuICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5fZ2V0VmFsaWRUb2tlbl06aHlwZXJ0eVVSTCcsIGh5cGVydHlVUkwpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIF90aGlzLmdldElkVG9rZW4oaHlwZXJ0eVVSTCkudGhlbihmdW5jdGlvbiAoYXNzZXJ0aW9uKSB7XHJcbiAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlLl9nZXRWYWxpZFRva2VuXSByZXRyaWV2ZWQgSWRBc3NlcnRpb24nLCBhc3NlcnRpb24pO1xyXG4gICAgICAgIGxldCB0aW1lTm93ID0gc2Vjb25kc1NpbmNlRXBvY2goKTtcclxuXHJcbiAgICAgICAgaWYgKCFhc3NlcnRpb24uaGFzT3duUHJvcGVydHkoJ2V4cGlyZXMnKSkgcmV0dXJuIHJlc29sdmUoYXNzZXJ0aW9uKTtcclxuXHJcbiAgICAgICAgbGV0IGV4cGlyYXRpb25EYXRlID0gYXNzZXJ0aW9uLmV4cGlyZXM7XHJcblxyXG4gICAgICAgIC8qIGlmIChjb21wbGV0ZUlkLmhhc093blByb3BlcnR5KCdpbmZvJykpIHtcclxuICAgICAgICAgIGlmIChjb21wbGV0ZUlkLmluZm8uaGFzT3duUHJvcGVydHkoJ2V4cGlyZXMnKSkge1xyXG4gICAgICAgICAgICBleHBpcmF0aW9uRGF0ZSA9IGNvbXBsZXRlSWQuaW5mby5leHBpcmVzO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjb21wbGV0ZUlkLmluZm8uaGFzT3duUHJvcGVydHkoJ3Rva2VuSURKU09OJykpIHtcclxuICAgICAgICAgICAgZXhwaXJhdGlvbkRhdGUgPSBjb21wbGV0ZUlkLmluZm8udG9rZW5JREpTT04uZXhwO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdGhyb3cgJ1RoZSBJRCBUb2tlbiBkb2VzIG5vdCBoYXZlIGFuIGV4cGlyYXRpb24gdGltZSc7XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKCdUaGUgSUQgVG9rZW4gZG9lcyBub3QgaGF2ZSBhbiBleHBpcmF0aW9uIHRpbWUnKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShhc3NlcnRpb24pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY29tcGxldGVJZC5oYXNPd25Qcm9wZXJ0eSgnaW5mb1Rva2VuJykgJiYgY29tcGxldGVJZC5pbmZvVG9rZW4uaGFzT3duUHJvcGVydHkoJ2V4cCcpKSB7XHJcbiAgICAgICAgICBleHBpcmF0aW9uRGF0ZSA9IGNvbXBsZXRlSWQuaW5mb1Rva2VuLmV4cDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gdGhyb3cgJ1RoZSBJRCBUb2tlbiBkb2VzIG5vdCBoYXZlIGFuIGV4cGlyYXRpb24gdGltZSc7XHJcbiAgICAgICAgICBsb2cuaW5mbygnVGhlIElEIFRva2VuIGRvZXMgbm90IGhhdmUgYW4gZXhwaXJhdGlvbiB0aW1lJyk7XHJcbiAgICAgICAgICByZXNvbHZlKGFzc2VydGlvbik7XHJcbiAgICAgICAgfSovXHJcblxyXG4gICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eS5JZGVudGl0eU1vZHVsZS5nZXRWYWxpZFRva2VuXSBUb2tlbiBleHBpcmVzIGluJywgZXhwaXJhdGlvbkRhdGUpO1xyXG4gICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eS5JZGVudGl0eU1vZHVsZS5nZXRWYWxpZFRva2VuXSB0aW1lIG5vdzonLCB0aW1lTm93KTtcclxuXHJcbiAgICAgICAgaWYgKHRpbWVOb3cgPj0gZXhwaXJhdGlvbkRhdGUpIHtcclxuICAgICAgICAgIC8vICAgICAgICBpZiAodGltZU5vdyA+PSAwKSB7XHJcbiAgICAgICAgICBpZiAoYXNzZXJ0aW9uLmhhc093blByb3BlcnR5KCdyZWZyZXNoJykpIHtcclxuICAgICAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5LklkZW50aXR5TW9kdWxlLmdldFZhbGlkVG9rZW5dIHJlZnJlc2hpbmcgYXNzZXJ0aW9uOiAnLCBhc3NlcnRpb24pO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuc2VuZFJlZnJlc2hNZXNzYWdlKGFzc2VydGlvbikudGhlbigobmV3QXNzZXJ0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5LklkZW50aXR5TW9kdWxlLmdldFZhbGlkVG9rZW5dIHJlZnJlc2hlZCBhc3NlcnRpb246ICcsIG5ld0Fzc2VydGlvbik7XHJcbiAgICAgICAgICAgICAgX3RoaXMuaWRlbnRpdGllcy51cGRhdGVBc3NlcnRpb24obmV3QXNzZXJ0aW9uKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUobmV3QXNzZXJ0aW9uKTtcclxuICAgICAgICAgICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoJ1tJZGVudGl0eU1vZHVsZS5nZXRWYWxpZFRva2VuXSBlcnJvciB1cGRhdGluZyB0aGUgYXNzZXJ0aW9uICcsIGVycik7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgIGxvZy5lcnJvcignW0lkZW50aXR5TW9kdWxlLmdldFZhbGlkVG9rZW5dIGVycm9yIHJlZnJlc2hpbmcgdGhlIGFzc2VydGlvbiAnLCBlcnIpO1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7IC8vIG5vIHJlZnJlc2ggdG9rZW4gYXZhaWxhYmxlLCB1c2VyIGhhcyB0byBhdXRoZW50aWNhdGUgYWdhaW4gdG8gZ2V0IGEgbmV3IGFzc2VydGlvblxyXG4gICAgICAgICAgICAvLyBnZW5lcmF0ZSBuZXcgaWRUb2tlblxyXG4gICAgICAgICAgICBfdGhpcy5jYWxsR2VuZXJhdGVNZXRob2RzKGFzc2VydGlvbi5pZHAuZG9tYWluKS50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5nZXRWYWxpZFRva2VuXSBlcnJvciB3aGVuIGdlbmVyYXRpbmcgYSBuZXcgYXNzZXJ0aW9uICcgKyBlcnIpOyB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZShhc3NlcnRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmVycm9yKCdbSWRlbnRpdHlNb2R1bGUuZ2V0VmFsaWRUb2tlbl0gZXJyb3Igb24gZ2V0SWRUb2tlbicsIGVycm9yKTtcclxuICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiByZXR1cm5zIHRoZSByZXBvcnRlciBhc3NvY2lhdGVkIHRvIHRoZSBkYXRhT2JqZWN0IFVSTFxyXG4gICogQHBhcmFtICAge1N0cmluZ30gICBkYXRhT2JqZWN0VVJMICAgICAgICAgZGF0YU9iamVjdCB1cmxcclxuICAqIEByZXR1cm4gICB7U3RyaW5nfSAgcmVwb3J0ZXIgICAgICAgICAgICAgIGRhdGFPYmplY3QgdXJsIHJlcG9ydGVyXHJcbiAgKi9cclxuICBfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0KGRhdGFPYmplY3RVUkwpIHtcclxuICAgIGxvZy5pbmZvKCdfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0OmRhdGFPYmplY3RVUkwnLCBkYXRhT2JqZWN0VVJMKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGxldCBzcGxpdGVkVVJMID0gZGl2aWRlVVJMKGRhdGFPYmplY3RVUkwpO1xyXG4gICAgICBsZXQgZG9tYWluID0gc3BsaXRlZFVSTC5kb21haW47XHJcbiAgICAgIGxldCBmaW5hbFVSTCA9IHBhcnNlTWVzc2FnZVVSTChkYXRhT2JqZWN0VVJMKTtcclxuXHJcbiAgICAgIC8vIGNoZWNrIGlmIGlzIHRoZSBjcmVhdG9yIG9mIHRoZSBoeXBlcnR5XHJcbiAgICAgIGxldCByZXBvcnRlclVSTCA9IF90aGlzLnJlZ2lzdHJ5LmdldFJlcG9ydGVyVVJMU3luY2hvbm91cyhmaW5hbFVSTCk7XHJcbiAgICAgIGxvZy5pbmZvKCdfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0OnJlcG9ydGVyVVJMJywgcmVwb3J0ZXJVUkwpO1xyXG5cclxuICAgICAgaWYgKHJlcG9ydGVyVVJMKSB7XHJcbiAgICAgICAgcmVzb2x2ZShyZXBvcnRlclVSTCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBhc3NvY2lhdGlvbiBmcm9tIGFuIGh5cGVydHlVUkwgdG8gdGhlIGRhdGFPYmplY3RcclxuICAgICAgICBsZXQgc3RvcmVkUmVwb3J0ZXJVUkwgPSBfdGhpcy5kYXRhT2JqZWN0c0lkZW50aXR5W2ZpbmFsVVJMXTtcclxuICAgICAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpzdG9yZWRSZXBvcnRlclVSTCcsIHN0b3JlZFJlcG9ydGVyVVJMKTtcclxuXHJcbiAgICAgICAgaWYgKHN0b3JlZFJlcG9ydGVyVVJMKSB7XHJcbiAgICAgICAgICByZXNvbHZlKHN0b3JlZFJlcG9ydGVyVVJMKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55IGh5cGVydHkgdGhhdCBzdWJzY3JpYmVkIHRoZSBkYXRhT2JqZWN0VVJMXHJcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlckh5cGVydHkgPSBfdGhpcy5yZWdpc3RyeS5nZXREYXRhT2JqZWN0U3Vic2NyaWJlckh5cGVydHkoZGF0YU9iamVjdFVSTCk7XHJcbiAgICAgICAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpzdWJzY3JpYmVySHlwZXJ0eScsIHN1YnNjcmliZXJIeXBlcnR5KTtcclxuXHJcbiAgICAgICAgICBpZiAoc3Vic2NyaWJlckh5cGVydHkpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShzdWJzY3JpYmVySHlwZXJ0eSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBzZWFyY2ggaW4gZG9tYWluIHJlZ2lzdHJ5IGZvciB0aGUgaHlwZXJ0eSBhc3NvY2lhdGVkIHRvIHRoZSBkYXRhT2JqZWN0XHJcbiAgICAgICAgICAgIC8vIHNlYXJjaCBpbiBjYXNlIGlzIGEgc3Vic2NyaWJlciB3aG8gd2FudHMgdG8ga25vdyB0aGUgcmVwb3J0ZXJcclxuICAgICAgICAgICAgLy8gVG8gYmUgcmV2aWV3ZWQgaW4gb3JkZXIgdG8gYXZvaWQgdGhlIGRpc2NvdmVyeSB0cmFuc2FjdGlvblxyXG4gICAgICAgICAgICBfdGhpcy5fY29yZURpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RQZXJVUkwoZmluYWxVUkwsIGRvbWFpbikudGhlbihkYXRhT2JqZWN0ID0+IHtcclxuICAgICAgICAgICAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpkYXRhT2JqZWN0JywgZGF0YU9iamVjdCk7XHJcbiAgICAgICAgICAgICAgX3RoaXMuZGF0YU9iamVjdHNJZGVudGl0eVtmaW5hbFVSTF0gPSBkYXRhT2JqZWN0LnJlcG9ydGVyO1xyXG4gICAgICAgICAgICAgIGxvZy5pbmZvKCdfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0OmRhdGFPYmplY3QucmVwb3J0ZXInLCBkYXRhT2JqZWN0LnJlcG9ydGVyKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKGRhdGFPYmplY3QucmVwb3J0ZXIpO1xyXG4gICAgICAgICAgICB9LCBlcnIgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBGdW5jdGlvbiB0aGF0IHJlc29sdmUgYW5kIGNyZWF0ZSB0aGUgZG9tYWluVVJMIGluIGNhc2UgaXQgaXMgcHJvdmlkZWQgb25lLiBJZiBub3QsIHJlc29sdmUgdGhlIGRlZmF1bHQgZG9tYWluVVJMXHJcbiAgKiBAcGFyYW0ge1N0cmluZ30gICAgIGlkcERvbWFpbiAgICAgaWRwRG9tYWluIChPcHRpb25hbClcclxuICAqL1xyXG4gIF9yZXNvbHZlRG9tYWluKGlkcERvbWFpbikge1xyXG4gICAgaWYgKCFpZHBEb21haW4pIHtcclxuICAgICAgcmV0dXJuICdkb21haW4taWRwOi8vZ29vZ2xlLmNvbSc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJ2RvbWFpbi1pZHA6Ly8nICsgaWRwRG9tYWluO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLypcclxuICAgIF9zZWNvbmRzU2luY2VFcG9jaCgpIHtcclxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG4gICAgfSovXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBJZGVudGl0eU1vZHVsZTtcclxuIiwiLyoqXHJcbiogUHJvdmlkZXMgYW4gQVBJIHRvIG1hbmFnZSBpZGVudGl0aWVzIGZyb20gbXNnIGJ1cyBwaXBlbGluZVxyXG4qIFRPRE86IHJlbmFtZSB0byBzb21ldGhpbmcgbGlrZSBJZGVudGl0eVBpcGVsaW5lSGFuZGxlciBpbiBvcmRlciBub3QgdG8gY29uZmxpY3Qgd2l0aCBmcmFtZXdvcmsgcmVsYXRlZCBJZGVudGl0eUhhbmRsZXJcclxuKi9cclxuXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmltcG9ydCBJZGVudGl0aWVzIGZyb20gJy4vSWRlbnRpdGllcyc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdJZGVudGl0eUhhbmRsZXInKTtcclxuXHJcbmNsYXNzIElkZW50aXR5SGFuZGxlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGlkbSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5faWRtID0gaWRtO1xyXG5cclxuICB9XHJcblxyXG4gIHJlc2V0KCkge1xyXG4gICAgY29uc29sZS5sb2coJ0lNIHJlc2V0Jyk7XHJcblxyXG4gICAgLy8gdGhpcy5faWRtLmlkZW50aXRpZXMucmVzZXQoKTtcclxuICAgIHRoaXMuX2lkbS5pZGVudGl0aWVzID0gbmV3IElkZW50aXRpZXModGhpcy5faWRtLmlkZW50aXRpZXMuX3R5cGUsIHRoaXMuX2lkbS5pZGVudGl0aWVzLl9zdG9yYWdlTWFuYWdlcik7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLl9pZG0uaWRlbnRpdGllcyk7XHJcbiAgfVxyXG5cclxuICBfaXNUb1NldElEKG1lc3NhZ2UpIHtcclxuICAgIGxldCBzY2hlbWFzVG9JZ25vcmUgPSBbJ2RvbWFpbi1pZHAnLCAncnVudGltZScsICdkb21haW4nXTtcclxuXHJcbiAgICBsZXQgX2Zyb20gPSBtZXNzYWdlLmZyb207XHJcblxyXG4gICAgaWYgKG1lc3NhZ2UuYm9keSAmJiBtZXNzYWdlLmJvZHkuaGFzT3duUHJvcGVydHkoJ3NvdXJjZScpKSB7XHJcbiAgICAgIF9mcm9tID0gbWVzc2FnZS5ib2R5LnNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWVzc2FnZS5ib2R5ICYmIG1lc3NhZ2UuYm9keS5oYXNPd25Qcm9wZXJ0eSgnc3Vic2NyaWJlcicpKSB7XHJcbiAgICAgIF9mcm9tID0gbWVzc2FnZS5ib2R5LnN1YnNjcmliZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2ZvcndhcmQnKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTaWduYWxsaW5nIE1lc3NhZ2VzIGJldHdlZW4gUDJQIFN0dWJzIGRvbid0IGhhdmUgSWRlbnRpdGllcy4gRkZTXHJcbiAgICBpZiAoX2Zyb20uaW5jbHVkZXMoJy9wMnByZXF1ZXN0ZXIvJykgfHwgX2Zyb20uaW5jbHVkZXMoJy9wMnBoYW5kbGVyLycpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc3BsaXRGcm9tID0gKF9mcm9tKS5zcGxpdCgnOi8vJyk7XHJcbiAgICBsZXQgZnJvbVNjaGVtYSA9IHNwbGl0RnJvbVswXTtcclxuICAgIGxldCBpc1RvSWdub3JlID0gc2NoZW1hc1RvSWdub3JlLmluZGV4T2YoZnJvbVNjaGVtYSkgPT09IC0xO1xyXG5cclxuICAgIHJldHVybiBpc1RvSWdub3JlO1xyXG4gIH1cclxuXHJcbiAgcHJvY2Vzc01lc3NhZ2UobWVzc2FnZSkge1xyXG4gICAgbG9nLmxvZygnW0lkZW50aXR5SGFuZGxlci5wcm9jZXNzTWVzc2FnZV0gJywgbWVzc2FnZSk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIC8vIHNraXAgbWVzc2FnZXMgdGhhdCBkb24ndCBuZWVkIGlkZW50aXR5IHRva2VucyBpbiB0aGUgYm9keVxyXG5cclxuICAgICAgaWYgKCF0aGlzLl9pc1RvU2V0SUQobWVzc2FnZSkpIHJldHVybiByZXNvbHZlKG1lc3NhZ2UpO1xyXG5cclxuICAgICAgLyogICAgICBsZXQgZnJvbSA9IG1lc3NhZ2UuZnJvbTtcclxuICAgICAgbGV0IHNvdXJjZVVSTCA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKCBtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdzb3VyY2UnKSkge1xyXG4gICAgICAgIGZyb20gPSBtZXNzYWdlLmJvZHkuc291cmNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobWVzc2FnZS50eXBlID09PSAnZm9yd2FyZCcpIHtcclxuICAgICAgICBmcm9tID0gbWVzc2FnZS5ib2R5LmZyb207XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdzdWJzY3JpYmVyJykpIHtcclxuICAgICAgICBmcm9tID0gbWVzc2FnZS5ib2R5LnN1YnNjcmliZXI7XHJcbiAgICAgIH0qL1xyXG5cclxuICAgICAgdGhpcy5faWRtLmdldFRva2VuKG1lc3NhZ2UpLnRoZW4oKGlkZW50aXR5KSA9PiB7XHJcblxyXG4gICAgICAgIGlmICghbWVzc2FnZS5oYXNPd25Qcm9wZXJ0eSgnYm9keScpKSBtZXNzYWdlLmJvZHkgPSB7fTtcclxuXHJcbiAgICAgICAgbWVzc2FnZS5ib2R5LmlkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIGxvZy5lcnJvcihyZWFzb24pO1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcblxyXG4gIH1cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBJZGVudGl0eUhhbmRsZXI7XHJcbiIsImNsYXNzIEFjdGlvbnNTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICB9XHJcblxyXG4gIGVuZm9yY2VQb2xpY2llcyhtZXNzYWdlLCBpc0luY29taW5nTWVzc2FnZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgcG9saWNpZXMgPSBfdGhpcy5jb250ZXh0LmdldFBvbGljaWVzKG1lc3NhZ2UsIGlzSW5jb21pbmdNZXNzYWdlKTtcclxuXHJcbiAgICAgIGlmIChwb2xpY2llcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHBvbGljaWVzLnNlcnZpY2VQcm92aWRlclBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBwb2xpY2llcy5zZXJ2aWNlUHJvdmlkZXJQb2xpY3kuZW5mb3JjZUFjdGlvbnMoX3RoaXMuY29udGV4dCwgbWVzc2FnZSkudGhlbihtZXNzYWdlcyA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZXMpO1xyXG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHBvbGljaWVzLnVzZXJQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwb2xpY2llcy51c2VyUG9saWN5LmVuZm9yY2VBY3Rpb25zKF90aGlzLmNvbnRleHQsIG1lc3NhZ2UpLnRoZW4obWVzc2FnZXMgPT4ge1xyXG4gICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZXMpO1xyXG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoW21lc3NhZ2VdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShbbWVzc2FnZV0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZvcndhcmRUb0lEKG1lc3NhZ2UsIGVtYWlsKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgaWYgKCFfdGhpcy5jb250ZXh0LnJ1bnRpbWVSZWdpc3RyeSkgdGhyb3cgbmV3IEVycm9yKCdmb3J3YXJkIG1lc3NhZ2UgdG8gZ2l2ZW4gSUQgaXMgdW5zdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5jb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5oeXBlcnRpZXNMaXN0WzBdLmh5cGVydHlVUkwgPT09IG1lc3NhZ2UudG8pIHtcclxuICAgICAgICBsZXQgc3BsaXRUbyA9IChtZXNzYWdlLnRvKS5zcGxpdCgnOi8vJyk7XHJcbiAgICAgICAgaWYgKHNwbGl0VG9bMF0gIT09ICdydW50aW1lJykge1xyXG4gICAgICAgICAgX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZGlzY292ZXJIeXBlcnR5UGVyVXNlcihlbWFpbCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBtZXNzYWdlLnRvID0gcmVzdWx0Lmh5cGVydHlVUkw7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UuYm9keS52aWEgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5Ll9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmb3J3YXJkVG9IeXBlcnR5KG1lc3NhZ2UsIGh5cGVydHlVUkwpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBpZiAoIV90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5KSB0aHJvdyBuZXcgRXJyb3IoJ2ZvcndhcmQgbWVzc2FnZSB0byBnaXZlbiBJRCBpcyB1bnN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50Jyk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5jb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5oeXBlcnRpZXNMaXN0WzBdLmh5cGVydHlVUkwgPT09IG1lc3NhZ2UudG8pIHtcclxuICAgICAgICBsZXQgc3BsaXRUbyA9IChtZXNzYWdlLnRvKS5zcGxpdCgnOi8vJyk7XHJcbiAgICAgICAgaWYgKHNwbGl0VG9bMF0gIT09ICdydW50aW1lJykge1xyXG4gICAgICAgICAgbWVzc2FnZS50byA9IGh5cGVydHlVUkw7XHJcbiAgICAgICAgICBtZXNzYWdlLmJvZHkudmlhID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgICAgIF90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5Ll9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbmRBdXRvbWF0aWNNZXNzYWdlKG1lc3NhZ2UsIHRleHQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgbGV0IGF1dG9tYXRpY01lc3NhZ2UgPSB7XHJcbiAgICAgICAgZnJvbTogbWVzc2FnZS50byxcclxuICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxyXG4gICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgIHZhbHVlOiB0ZXh0XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0eXBlOiBtZXNzYWdlLnR5cGVcclxuICAgICAgfTtcclxuICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UoYXV0b21hdGljTWVzc2FnZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBY3Rpb25zU2VydmljZTtcclxuIiwiY2xhc3MgT3BlcmF0b3JzIHtcclxuXHJcbiAgYW5kKHBhcmFtcykge1xyXG4gICAgcmV0dXJuIHBhcmFtc1swXSAmJiBwYXJhbXNbMV07XHJcbiAgfVxyXG5cclxuICBiZXR3ZWVuKHBhcmFtcykge1xyXG4gICAgbGV0IHN0YXJ0ID0gcGFyc2VJbnQocGFyYW1zWzBdWzBdKTtcclxuICAgIGxldCBlbmQgPSBwYXJzZUludChwYXJhbXNbMF1bMV0pO1xyXG4gICAgbGV0IG5vdyA9IHBhcmFtc1sxXTtcclxuXHJcbiAgICBpZiAoZW5kIDwgc3RhcnQpIHtcclxuICAgICAgbm93ID0gKG5vdyA8IHN0YXJ0KSA/IG5vdyArPSAyNDAwIDogbm93O1xyXG4gICAgICBlbmQgKz0gMjQwMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKG5vdyA+IHN0YXJ0ICYmIG5vdyA8IGVuZCk7XHJcbiAgfVxyXG5cclxuICBlcXVhbHMocGFyYW1zKSB7XHJcbiAgICByZXR1cm4gU3RyaW5nKHBhcmFtc1swXSkgPT09ICcqJyB8fCBTdHJpbmcocGFyYW1zWzBdKSA9PT0gU3RyaW5nKHBhcmFtc1sxXSk7XHJcbiAgfVxyXG5cclxuICBncmVhdGVyVGhhbihwYXJhbXMpIHtcclxuICAgIHJldHVybiBwYXJhbXNbMV0gPiBwYXJhbXNbMF07XHJcbiAgfVxyXG5cclxuICBpbihwYXJhbXMpIHtcclxuICAgIHJldHVybiBwYXJhbXNbMF0uaW5kZXhPZihwYXJhbXNbMV0pID4gLTE7XHJcbiAgfVxyXG5cclxuICBsZXNzVGhhbihwYXJhbXMpIHtcclxuICAgIHJldHVybiBwYXJhbXNbMV0gPCBwYXJhbXNbMF07XHJcbiAgfVxyXG5cclxuICBub3QocGFyYW1zKSB7XHJcbiAgICByZXR1cm4gIXBhcmFtc1swXTtcclxuICB9XHJcblxyXG4gIG9yKHBhcmFtcykge1xyXG4gICAgcmV0dXJuIHBhcmFtc1swXSB8fCBwYXJhbXNbMV07XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgT3BlcmF0b3JzO1xyXG4iLCJpbXBvcnQgT3BlcmF0b3JzIGZyb20gJy4vT3BlcmF0b3JzJztcclxuXHJcbi8qKlxyXG4qIFRoZSBQb2xpY3kgRGVjaXNpb24gUG9pbnQgKFBEUCkgZGVjaWRlcyBpZiBhIG1lc3NhZ2UgaXMgdG8gYmUgYXV0aG9yaXNlZCBieSBjaGVja2luZyBhIHNldCBvZlxyXG4qIHBvbGljaWVzLiBUaGUgcmVzb3VyY2UgdG8gYmUgdmVyaWZpZWQgaXMgc3BlY2lmaWVkIGluIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSAnY29uZGl0aW9uJyBmaWVsZCBvZlxyXG4qIGEgUG9saWN5IG9iamVjdC4gVGhlIGltcGxlbWVudGF0aW9uIHRoYXQgdmVyaWZpZXMgaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxpYW50IHdpdGggYSBwb2xpY3kgaXNcclxuKiBzcGVjaWZpZWQgaW4gYSBoYXNodGFibGUgdG8gYWxsb3cgZHluYW1pYyBkZWZpbml0aW9uIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgcHJvdmlkaW5nXHJcbiogZXh0ZW5zaWJpbGl0eSB0byB0aGUgUG9saWN5IEVuZ2luZSBmdW5jdGlvbmFsaXRpZXMuXHJcbiovXHJcbmNsYXNzIFBEUCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLm9wZXJhdG9ycyA9IG5ldyBPcGVyYXRvcnMoKTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlUG9saWNpZXMobWVzc2FnZSwgaXNJbmNvbWluZ01lc3NhZ2UpIHtcclxuICAgIGxldCBwb2xpY2llcyA9IHRoaXMuY29udGV4dC5nZXRQb2xpY2llcyhtZXNzYWdlLCBpc0luY29taW5nTWVzc2FnZSk7XHJcbiAgICBsZXQgcmVzdWx0ID0gJ05vdCBBcHBsaWNhYmxlJztcclxuICAgIGlmIChwb2xpY2llcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZXZhbHVhdGVQb2xpY3kobWVzc2FnZSwgcG9saWNpZXMuc2VydmljZVByb3ZpZGVyUG9saWN5LCBpc0luY29taW5nTWVzc2FnZSk7XHJcbiAgICAgIGlmIChyZXN1bHQgfHwgcmVzdWx0ID09PSAnTm90IEFwcGxpY2FibGUnKSB7XHJcbiAgICAgICAgbGV0IHVzZXJSZXN1bHQgPSB0aGlzLmV2YWx1YXRlUG9saWN5KG1lc3NhZ2UsIHBvbGljaWVzLnVzZXJQb2xpY3ksIGlzSW5jb21pbmdNZXNzYWdlKTtcclxuICAgICAgICBpZiAodXNlclJlc3VsdCAhPT0gJ05vdCBBcHBsaWNhYmxlJykge1xyXG4gICAgICAgICAgcmVzdWx0ID0gdXNlclJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVQb2xpY3kobWVzc2FnZSwgcG9saWN5LCBpc0luY29taW5nKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gJ05vdCBBcHBsaWNhYmxlJztcclxuICAgIGlmIChwb2xpY3kpIHtcclxuICAgICAgcmVzdWx0ID0gcG9saWN5LmV2YWx1YXRlUnVsZXModGhpcy5jb250ZXh0LCBtZXNzYWdlLCBpc0luY29taW5nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBEUDtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLyoqXHJcbiogQGF1dGhvciBBbmEgQ2FsZGVpcmEgPGFuYS5jYWxkZWlyYUB0ZWNuaWNvLnVsaXNib2EucHQ+XHJcbiogQGNsYXNzZGVzYyBDbGFzcyB0byBjb21iaW5lIHRoZSBhdXRob3JpemF0aW9uIGRlY2lzaW9ucyB0aGF0IHJlc3VsdCBmcm9tIHJ1bGVzIGV2YWx1YXRpb24uXHJcbiovXHJcbmNsYXNzIEFsbG93T3ZlcnJpZGVzIHtcclxuXHJcbiAgLyoqXHJcbiAgKiBHaXZlbiBhbiBhcnJheSBvZiBpbmRpdmlkdWFsIGF1dGhvcml6YXRpb24gZGVjaXNpb25zLCBwcmlvcml0aXplcyBhIHBvc2l0aXZlIG9uZS5cclxuICAqIEBwYXJhbSAgICB7Ym9vbGVhbltdfSAgIGRlY2lzaW9uc1xyXG4gICogQHJldHVybnMgIHtib29sZWFufVxyXG4gICovXHJcbiAgY29tYmluZShkZWNpc2lvbnMpIHtcclxuICAgIGlmIChkZWNpc2lvbnMuaW5kZXhPZih0cnVlKSAhPT0gLTEpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZGVjaXNpb25zLmluZGV4T2YoZmFsc2UpICE9PSAtMSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJ05vdCBBcHBsaWNhYmxlJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEFsbG93T3ZlcnJpZGVzO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuKiBAYXV0aG9yIEFuYSBDYWxkZWlyYSA8YW5hLmNhbGRlaXJhQHRlY25pY28udWxpc2JvYS5wdD5cclxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIGNvbWJpbmUgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb25zIHRoYXQgcmVzdWx0IGZyb20gcnVsZXMgZXZhbHVhdGlvbi5cclxuKi9cclxuY2xhc3MgQmxvY2tPdmVycmlkZXMge1xyXG5cclxuICAvKipcclxuICAqIEdpdmVuIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgYXV0aG9yaXNhdGlvbiBkZWNpc2lvbnMsIHByaW9yaXRpc2VzIGEgbmVnYXRpdmUgb25lLlxyXG4gICogQHBhcmFtICAgIHtib29sZWFuW119ICAgZGVjaXNpb25zXHJcbiAgKiBAcmV0dXJucyAge2Jvb2xlYW59XHJcbiAgKi9cclxuICBjb21iaW5lKGRlY2lzaW9ucykge1xyXG4gICAgaWYgKGRlY2lzaW9ucy5pbmRleE9mKGZhbHNlKSAhPT0gLTEpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGRlY2lzaW9ucy5pbmRleE9mKHRydWUpICE9PSAtMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnTm90IEFwcGxpY2FibGUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmxvY2tPdmVycmlkZXM7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4qIEBhdXRob3IgQW5hIENhbGRlaXJhIDxhbmEuY2FsZGVpcmFAdGVjbmljby51bGlzYm9hLnB0PlxyXG4qIEBjbGFzc2Rlc2MgQ2xhc3MgdG8gY29tYmluZSB0aGUgYXV0aG9yaXphdGlvbiBkZWNpc2lvbnMgdGhhdCByZXN1bHQgZnJvbSBydWxlcyBldmFsdWF0aW9uLlxyXG4qL1xyXG5jbGFzcyBGaXJzdEFwcGxpY2FibGUge1xyXG5cclxuICAvKipcclxuICAqIEdpdmVuIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgYXV0aG9yaXNhdGlvbiBkZWNpc2lvbnMsIHJldHVybnMgdGhlIGZpcnN0IG9uZSBkaWZmZXJlbnQgZnJvbSAnTm90IEFwcGxpY2FibGUnLCBlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUuXHJcbiAgKiBAcGFyYW0gICAge2Jvb2xlYW5bXX0gICAgIGRlY2lzaW9uc1xyXG4gICogQHJldHVybnMgIHtib29sZWFufVxyXG4gICovXHJcbiAgY29tYmluZShkZWNpc2lvbnMpIHtcclxuICAgIGZvciAobGV0IGkgaW4gZGVjaXNpb25zKSB7XHJcbiAgICAgIGlmIChkZWNpc2lvbnNbaV0gIT09ICdOb3QgQXBwbGljYWJsZScpIHtcclxuICAgICAgICByZXR1cm4gZGVjaXNpb25zW2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJ05vdCBBcHBsaWNhYmxlJztcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBGaXJzdEFwcGxpY2FibGU7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbmltcG9ydCBPcGVyYXRvcnMgZnJvbSAnLi4vT3BlcmF0b3JzJztcclxuXHJcbi8qKlxyXG4qIEBhdXRob3IgQW5hIENhbGRlaXJhIDxhbmEuY2FsZGVpcmFAdGVjbmljby51bGlzYm9hLnB0PlxyXG4qIEBjbGFzc2Rlc2MgQ2xhc3MgdG8gcmVwcmVzZW50IGEgY29uZGl0aW9uIGFuZCBldmFsdWF0ZSBpdHMgYXBwbGljYWJpbGl0eS5cclxuKi9cclxuY2xhc3MgQ29uZGl0aW9uIHtcclxuXHJcbiAgLyoqXHJcbiAgKiBDcmVhdGVzIGEgbmV3IENvbmRpdGlvbi5cclxuICAqIEBjbGFzc1xyXG4gICogQHBhcmFtICB7c3RyaW5nfSAgYXR0cmlidXRlXHJcbiAgKiBAcGFyYW0gIHtzdHJpbmd9ICBvcGVyYXRvclxyXG4gICogQHBhcmFtICB7Kn0gICAgICAgcGFyYW1zXHJcbiAgKi9cclxuICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGUsIG9wZXJhdG9yLCBwYXJhbXMpIHtcclxuICAgIHRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlO1xyXG4gICAgdGhpcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xyXG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICB0aGlzLm9wZXJhdG9ycyA9IG5ldyBPcGVyYXRvcnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVmVyaWZpZXMgaWYgdGhlIGNvbmRpdGlvbiBpcyBhcHBsaWNhYmxlIHRvIHRoZSBtZXNzYWdlLiBGaXJzdCwgdGhlIHN5c3RlbSB2YWx1ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBhdHRyaWJ1dGUgaXMgcmV0cmlldmVkOyB0aGVuLCB0aGF0IHZhbHVlIGlzIGNvbXBhcmVkIHdpdGggdGhlIHBhcmFtZXRlciBzcGVjaWZpZWQgaW4gdGhlIGNvbmRpdGlvbiBieSBleGVjdXRpbmcgdGhlIG9wZXJhdG9yIGltcGxlbWVudGF0aW9uLiBJZiB0aGUgb3BlcmF0b3IgaXMgJ2luJyBhbmQgdGhlIG5hbWUgb2YgYSBncm91cCBpcyBnaXZlbiwgdGhlbiB0aGUgYXJyYXkgaG9sZGluZyB0aGUgbWVtYmVycyBvZiB0aGUgZ3JvdXAgaXMgcmV0cmlldmVkIGJlZm9yZSB0aGUgY29tcGFyaXNvbi5cclxuICAqIEBwYXJhbSAge09iamVjdH0gICAgY29udGV4dCAgIGVudmlyb25tZW50IHdoZXJlIHRoZSBQb2xpY3kgRW5naW5lIGlzIGJlaW5nIHVzZWRcclxuICAqIEBwYXJhbSAge09iamVjdH0gICAgbWVzc2FnZVxyXG4gICovXHJcbiAgaXNBcHBsaWNhYmxlKGNvbnRleHQsIG1lc3NhZ2UpIHtcclxuICAgIGNvbnRleHRbdGhpcy5hdHRyaWJ1dGVdID0geyBtZXNzYWdlOiBtZXNzYWdlIH07XHJcbiAgICBsZXQgdmFsdWUgPSBjb250ZXh0W3RoaXMuYXR0cmlidXRlXTtcclxuICAgIGxldCB0ZW1wUGFyYW07XHJcblxyXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICdpbicpIHtcclxuICAgICAgaWYgKCEoQXJyYXkuaXNBcnJheSh0aGlzLnBhcmFtcykpKSB7XHJcbiAgICAgICAgdGVtcFBhcmFtID0gY29udGV4dC5nZXRHcm91cCh0aGlzLnBhcmFtcywgbWVzc2FnZS50byk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0b3JzW3RoaXMub3BlcmF0b3JdKFt0ZW1wUGFyYW0sIHZhbHVlXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0oW3RoaXMucGFyYW1zLCB2YWx1ZV0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENvbmRpdGlvbjtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuaW1wb3J0IENvbmRpdGlvbiBmcm9tICcuL0NvbmRpdGlvbic7XHJcblxyXG4vKipcclxuKiBAYXV0aG9yIEFuYSBDYWxkZWlyYSA8YW5hLmNhbGRlaXJhQHRlY25pY28udWxpc2JvYS5wdD5cclxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIHJlcHJlc2VudCBhIHN1YnNjcmlwdGlvbiBjb25kaXRpb24gYW5kIGV2YWx1YXRlIGl0cyBhcHBsaWNhYmlsaXR5LlxyXG4qL1xyXG5jbGFzcyBTdWJzY3JpcHRpb25Db25kaXRpb24gZXh0ZW5kcyBDb25kaXRpb24ge1xyXG5cclxuICAvKipcclxuICAqIENyZWF0ZXMgYSBuZXcgU3Vic2NyaXB0aW9uQ29uZGl0aW9uLlxyXG4gICogQGNsYXNzXHJcbiAgKiBAcGFyYW0gIHtzdHJpbmd9ICBhdHRyaWJ1dGVcclxuICAqIEBwYXJhbSAge3N0cmluZ30gIG9wZXJhdG9yXHJcbiAgKiBAcGFyYW0gIHsqfSAgICAgICBwYXJhbXNcclxuICAqL1xyXG4gIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZSwgb3BlcmF0b3IsIHBhcmFtcykge1xyXG4gICAgc3VwZXIoYXR0cmlidXRlLCBvcGVyYXRvciwgcGFyYW1zKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogVmVyaWZpZXMgaWYgdGhlIHN1YnNjcmlwdGlvbiBjb25kaXRpb24gaXMgYXBwbGljYWJsZSB0byB0aGUgbWVzc2FnZS4gRmlyc3QsIHZlcmlmaWVzIGlmIHRoZSBtZXNzYWdlIGlzIG9mIHRoZSBzdWJzY3JpcHRpb24gdHlwZTsgc2Vjb25kLCB2ZXJpZmllcyBpZiB0aGUgbWVzc2FnZSBpcyBmcm9tIGEgcmVtb3RlIHJ1bnRpbWUgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIHN1YnNjcmlwdGlvbiBpcyBiZWluZyB2YWxpZGF0ZWQgaW4gdGhlIGRlc3RpbmF0aW9uIHJ1bnRpbWU7IHRoaXJkLCB2ZXJpZmllcyBpZiB0aGUgc3Vic2NyaXB0aW9uIHByZWZlcmVuY2UgaXMgbWV0LlxyXG4gICogQHBhcmFtICB7T2JqZWN0fSAgICBjb250ZXh0ICAgZW52aXJvbm1lbnQgd2hlcmUgdGhlIFBvbGljeSBFbmdpbmUgaXMgYmVpbmcgdXNlZFxyXG4gICogQHBhcmFtICB7T2JqZWN0fSAgICBtZXNzYWdlXHJcbiAgKi9cclxuICBpc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSkge1xyXG4gICAgbGV0IGlzU3Vic2NyaXB0aW9uID0gbWVzc2FnZS50eXBlID09PSAnc3Vic2NyaWJlJztcclxuICAgIGxldCBpc0Zyb21SZW1vdGVTTSA9IGNvbnRleHQuaXNGcm9tUmVtb3RlU00obWVzc2FnZS5mcm9tKTtcclxuICAgIGlmIChpc1N1YnNjcmlwdGlvbiAmIGlzRnJvbVJlbW90ZVNNKSB7XHJcbiAgICAgIHJldHVybiBzdXBlci5pc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3Vic2NyaXB0aW9uQ29uZGl0aW9uO1xyXG4iLCJpbXBvcnQgQ29uZGl0aW9uIGZyb20gJy4vQ29uZGl0aW9uJztcclxuaW1wb3J0IE9wZXJhdG9ycyBmcm9tICcuLi9PcGVyYXRvcnMnO1xyXG5pbXBvcnQgU3Vic2NyaXB0aW9uQ29uZGl0aW9uIGZyb20gJy4vU3Vic2NyaXB0aW9uQ29uZGl0aW9uJztcclxuXHJcbmNsYXNzIEFkdmFuY2VkQ29uZGl0aW9uIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZGl0aW9uKSB7XHJcbiAgICB0aGlzLm9wZXJhdG9ycyA9IG5ldyBPcGVyYXRvcnMoKTtcclxuICAgIGlmIChjb25kaXRpb24ub3BlcmF0b3JzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmNvbmRpdGlvbjtcclxuICAgIH1cclxuICAgIGNvbmRpdGlvbiA9IHRoaXMuYnVpbGRDb25kaXRpb24oY29uZGl0aW9uKTtcclxuICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xyXG4gIH1cclxuXHJcbiAgYnVpbGRDb25kaXRpb24oY29uZGl0aW9uKSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25kaXRpb25bMV0pKSB7XHJcbiAgICAgIGNvbmRpdGlvblsxXSA9IHRoaXMuYnVpbGRDb25kaXRpb24oY29uZGl0aW9uWzFdKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChjb25kaXRpb25bMV0uYXR0cmlidXRlID09PSAnc3Vic2NyaXB0aW9uJykge1xyXG4gICAgICAgIGNvbmRpdGlvblsxXSA9IG5ldyBTdWJzY3JpcHRpb25Db25kaXRpb24oY29uZGl0aW9uWzFdLmF0dHJpYnV0ZSwgY29uZGl0aW9uWzFdLm9wZXJhdG9yLCBjb25kaXRpb25bMV0ucGFyYW1zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25kaXRpb25bMV0gPSBuZXcgQ29uZGl0aW9uKGNvbmRpdGlvblsxXS5hdHRyaWJ1dGUsIGNvbmRpdGlvblsxXS5vcGVyYXRvciwgY29uZGl0aW9uWzFdLnBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29uZGl0aW9uWzJdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uWzJdKSkge1xyXG4gICAgICAgIGNvbmRpdGlvblsyXSA9IHRoaXMuYnVpbGRDb25kaXRpb24oY29uZGl0aW9uWzJdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoY29uZGl0aW9uWzJdLmF0dHJpYnV0ZSA9PT0gJ3N1YnNjcmlwdGlvbicpIHtcclxuICAgICAgICAgIGNvbmRpdGlvblsyXSA9IG5ldyBTdWJzY3JpcHRpb25Db25kaXRpb24oY29uZGl0aW9uWzJdLmF0dHJpYnV0ZSwgY29uZGl0aW9uWzJdLm9wZXJhdG9yLCBjb25kaXRpb25bMl0ucGFyYW1zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uZGl0aW9uWzJdID0gbmV3IENvbmRpdGlvbihjb25kaXRpb25bMl0uYXR0cmlidXRlLCBjb25kaXRpb25bMl0ub3BlcmF0b3IsIGNvbmRpdGlvblsyXS5wYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbmRpdGlvbjtcclxuICB9XHJcblxyXG4gIGlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlLCBzY29wZSwgdGFyZ2V0LCBvcGVyYXRvciwgbGVmdCwgcmlnaHQpIHtcclxuICAgIGlmICghb3BlcmF0b3IpIHtcclxuICAgICAgb3BlcmF0b3IgPSB0aGlzLmNvbmRpdGlvblswXTtcclxuICAgICAgbGVmdCA9IHRoaXMuY29uZGl0aW9uWzFdO1xyXG4gICAgICByaWdodCA9IHRoaXMuY29uZGl0aW9uWzJdO1xyXG4gICAgfVxyXG5cclxuICAgIHdoaWxlICghKGxlZnQgaW5zdGFuY2VvZiBDb25kaXRpb24pICYgIShsZWZ0IGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uQ29uZGl0aW9uKSAmICh0eXBlb2YgbGVmdCAhPT0gJ2Jvb2xlYW4nKSkge1xyXG4gICAgICBsZWZ0ID0gdGhpcy5pc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSwgc2NvcGUsIHRhcmdldCwgbGVmdFswXSwgbGVmdFsxXSwgbGVmdFsyXSk7XHJcbiAgICB9XHJcbiAgICBpZiAocmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB3aGlsZSAoIShyaWdodCBpbnN0YW5jZW9mIENvbmRpdGlvbikgJiAhKHJpZ2h0IGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uQ29uZGl0aW9uKSAmICh0eXBlb2YgcmlnaHQgIT09ICdib29sZWFuJykpIHtcclxuICAgICAgICByaWdodCA9IHRoaXMuaXNBcHBsaWNhYmxlKGNvbnRleHQsIG1lc3NhZ2UsIHNjb3BlLCB0YXJnZXQsIHJpZ2h0WzBdLCByaWdodFsxXSwgcmlnaHRbMl0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3VsdExlZnQgPSAodHlwZW9mIGxlZnQgPT09ICdib29sZWFuJykgPyBsZWZ0IDogbGVmdC5pc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSwgc2NvcGUsIHRhcmdldCk7XHJcbiAgICBsZXQgcmVzdWx0UmlnaHQ7XHJcbiAgICBpZiAocmlnaHQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXN1bHRSaWdodCA9ICh0eXBlb2YgcmlnaHQgPT09ICdib29sZWFuJykgPyByaWdodCA6IHJpZ2h0LmlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlLCBzY29wZSwgdGFyZ2V0KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yc1tvcGVyYXRvcl0oW3Jlc3VsdExlZnQsIHJlc3VsdFJpZ2h0XSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQWR2YW5jZWRDb25kaXRpb247XHJcbiIsImltcG9ydCBBZHZhbmNlZENvbmRpdGlvbiBmcm9tICcuL2NvbmRpdGlvbnMvQWR2YW5jZWRDb25kaXRpb24nO1xyXG5pbXBvcnQgQ29uZGl0aW9uIGZyb20gJy4vY29uZGl0aW9ucy9Db25kaXRpb24nO1xyXG5pbXBvcnQge2dldFVzZXJFbWFpbEZyb21VUkwsIGlzRGF0YU9iamVjdFVSTCwgcmVtb3ZlUGF0aEZyb21VUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IFN1YnNjcmlwdGlvbkNvbmRpdGlvbiBmcm9tICcuL2NvbmRpdGlvbnMvQWR2YW5jZWRDb25kaXRpb24nO1xyXG5cclxuY2xhc3MgUnVsZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRlY2lzaW9uLCBjb25kaXRpb24sIHNjb3BlLCB0YXJnZXQsIHByaW9yaXR5KSB7XHJcbiAgICB0aGlzLmRlY2lzaW9uID0gZGVjaXNpb247XHJcbiAgICB0aGlzLnNldENvbmRpdGlvbihjb25kaXRpb24pO1xyXG4gICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5O1xyXG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xyXG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XHJcbiAgfVxyXG5cclxuICBzZXRDb25kaXRpb24oY29uZGl0aW9uKSB7XHJcbiAgICBpZiAoIShjb25kaXRpb24gaW5zdGFuY2VvZiBDb25kaXRpb24gfHwgY29uZGl0aW9uIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uQ29uZGl0aW9uIHx8IGNvbmRpdGlvbiBpbnN0YW5jZW9mIEFkdmFuY2VkQ29uZGl0aW9uKSkge1xyXG4gICAgICBsZXQgYXR0cmlidXRlID0gY29uZGl0aW9uLmF0dHJpYnV0ZTtcclxuICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHtcclxuICAgICAgICBjYXNlICdzdWJzY3JpcHRpb24nOlxyXG4gICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBuZXcgU3Vic2NyaXB0aW9uQ29uZGl0aW9uKGNvbmRpdGlvbi5hdHRyaWJ1dGUsIGNvbmRpdGlvbi5vcGVyYXRvciwgY29uZGl0aW9uLnBhcmFtcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIHVuZGVmaW5lZDpcclxuICAgICAgICAgIHRoaXMuY29uZGl0aW9uID0gbmV3IEFkdmFuY2VkQ29uZGl0aW9uKGNvbmRpdGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKGNvbmRpdGlvbi5hdHRyaWJ1dGUsIGNvbmRpdGlvbi5vcGVyYXRvciwgY29uZGl0aW9uLnBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGUoY29udGV4dCwgbWVzc2FnZSwgaXNJbmNvbWluZykge1xyXG4gICAgbGV0IGZpZWxkID0gKGlzSW5jb21pbmcpID8gbWVzc2FnZS50byA6IG1lc3NhZ2UuZnJvbTtcclxuICAgIGxldCBoeXBlcnR5TmFtZTtcclxuICAgIHN3aXRjaCAodGhpcy5zY29wZSkge1xyXG4gICAgICBjYXNlICdnbG9iYWwnOlxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnaHlwZXJ0eSc6XHJcbiAgICAgICAgaWYgKGlzRGF0YU9iamVjdFVSTChmaWVsZCkpIHtcclxuICAgICAgICAgIGxldCByZXBvcnRlciA9IGNvbnRleHQucnVudGltZVJlZ2lzdHJ5LmdldFJlcG9ydGVyVVJMU3luY2hvbm91cyhyZW1vdmVQYXRoRnJvbVVSTChmaWVsZCkpO1xyXG4gICAgICAgICAgaWYgKHJlcG9ydGVyICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaHlwZXJ0eU5hbWUgPSBjb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5nZXRIeXBlcnR5TmFtZShyZXBvcnRlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChmaWVsZC5zcGxpdCgnOi8vJylbMF0gPT09ICdoeXBlcnR5Jykge1xyXG4gICAgICAgICAgICBoeXBlcnR5TmFtZSA9IGNvbnRleHQucnVudGltZVJlZ2lzdHJ5LmdldEh5cGVydHlOYW1lKHJlbW92ZVBhdGhGcm9tVVJMKGZpZWxkKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChoeXBlcnR5TmFtZSA9PT0gdGhpcy50YXJnZXQpIHtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICdOb3QgQXBwbGljYWJsZSc7XHJcblxyXG4gICAgICBjYXNlICdpZGVudGl0eSc6XHJcbiAgICAgICAgbGV0IG93bmVyO1xyXG5cclxuICAgICAgICBpZiAoaXNEYXRhT2JqZWN0VVJMKGZpZWxkKSkge1xyXG4gICAgICAgICAgbGV0IHJlcG9ydGVyID0gY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZ2V0UmVwb3J0ZXJVUkxTeW5jaG9ub3VzKHJlbW92ZVBhdGhGcm9tVVJMKGZpZWxkKSk7XHJcbiAgICAgICAgICBvd25lciA9IGNvbnRleHQucnVudGltZVJlZ2lzdHJ5LmdldEh5cGVydHlPd25lcihyZXBvcnRlcik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChmaWVsZC5zcGxpdCgnOi8vJylbMF0gPT09ICdoeXBlcnR5Jykge1xyXG4gICAgICAgICAgICBvd25lciA9IGNvbnRleHQucnVudGltZVJlZ2lzdHJ5LmdldEh5cGVydHlPd25lcihyZW1vdmVQYXRoRnJvbVVSTChmaWVsZCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3duZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgb3duZXIgPSBnZXRVc2VyRW1haWxGcm9tVVJMKG93bmVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG93bmVyID09PSB0aGlzLnRhcmdldCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gJ05vdCBBcHBsaWNhYmxlJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jb25kaXRpb24uaXNBcHBsaWNhYmxlKGNvbnRleHQsIG1lc3NhZ2UsIHRoaXMuc2NvcGUsIHRoaXMudGFyZ2V0KSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWNpc2lvbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnTm90IEFwcGxpY2FibGUnO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUnVsZTtcclxuIiwiaW1wb3J0IEFsbG93T3ZlcnJpZGVzIGZyb20gJy4vY29tYmluaW5nQWxnb3JpdGhtcy9BbGxvd092ZXJyaWRlcyc7XHJcbmltcG9ydCBCbG9ja092ZXJyaWRlcyBmcm9tICcuL2NvbWJpbmluZ0FsZ29yaXRobXMvQmxvY2tPdmVycmlkZXMnO1xyXG5pbXBvcnQgRmlyc3RBcHBsaWNhYmxlIGZyb20gJy4vY29tYmluaW5nQWxnb3JpdGhtcy9GaXJzdEFwcGxpY2FibGUnO1xyXG5pbXBvcnQgUnVsZSBmcm9tICcuL1J1bGUnO1xyXG5cclxuY2xhc3MgUG9saWN5IHtcclxuXHJcbiAgY29uc3RydWN0b3Ioa2V5LCBydWxlcywgYWN0aW9ucywgY29tYmluaW5nQWxnb3JpdGhtKSB7XHJcbiAgICBpZiAoIWtleSkgdGhyb3cgbmV3IEVycm9yKCdrZXkgaXMgbm90IGRlZmluZWQnKTtcclxuICAgIGlmICghYWN0aW9ucykgdGhyb3cgbmV3IEVycm9yKCdhY3Rpb25zIGFyZSBub3QgZGVmaW5lZCcpO1xyXG5cclxuICAgIHRoaXMuYWN0aW9ucyA9IGFjdGlvbnM7XHJcbiAgICB0aGlzLmtleSA9IGtleTtcclxuICAgIHRoaXMuX3NldFJ1bGVzKHJ1bGVzKTtcclxuICAgIHRoaXMuX3NldENvbWJpbmluZ0FsZ29yaXRobShjb21iaW5pbmdBbGdvcml0aG0pO1xyXG4gIH1cclxuXHJcbiAgYWRkQWN0aW9uKG1ldGhvZCwgcGFyYW0pIHtcclxuICAgIHRoaXMuYWN0aW9ucy5wdXNoKHsgbWV0aG9kOiBtZXRob2QsIHBhcmFtOiBwYXJhbSB9KTtcclxuICB9XHJcblxyXG4gIGNyZWF0ZVJ1bGUoZGVjaXNpb24sIGNvbmRpdGlvbiwgc2NvcGUsIHRhcmdldCwgcHJpb3JpdHkpIHtcclxuICAgIGlmIChwcmlvcml0eSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHByaW9yaXR5ID0gdGhpcy5nZXRMYXN0UHJpb3JpdHkoKSArIDE7XHJcbiAgICB9XHJcbiAgICBsZXQgcnVsZSA9IG5ldyBSdWxlKGRlY2lzaW9uLCBjb25kaXRpb24sIHNjb3BlLCB0YXJnZXQsIHByaW9yaXR5KTtcclxuICAgIHRoaXMucnVsZXMucHVzaChydWxlKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZVJ1bGUocnVsZSkge1xyXG4gICAgbGV0IGluZGV4VG9SZW1vdmUgPSB0aGlzLnJ1bGVzLmluZGV4T2YocnVsZSk7XHJcbiAgICB0aGlzLnJ1bGVzLnNwbGljZShpbmRleFRvUmVtb3ZlLCAxKTtcclxuICB9XHJcblxyXG4gIGVuZm9yY2VBY3Rpb25zKGNvbnRleHQsIG1lc3NhZ2UpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGxldCByZXN1bHRzID0gW107XHJcbiAgICAgIGlmICh0aGlzLmFjdGlvbnMubGVuZ3RoICE9PSAwKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmFjdGlvbnMpIHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSBjb250ZXh0LnBlcC5hY3Rpb25zU2VydmljZVt0aGlzLmFjdGlvbnNbaV0ubWV0aG9kXShtZXNzYWdlLCB0aGlzLmFjdGlvbnNbaV0ucGFyYW0pO1xyXG4gICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFByb21pc2UuYWxsKHJlc3VsdHMpLnRoZW4oKG1lc3NhZ2VzKSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKG1lc3NhZ2VzKTtcclxuICAgICAgICB9LCBlcnJvciA9PiB7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoW21lc3NhZ2VdKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZVJ1bGVzKGNvbnRleHQsIG1lc3NhZ2UsIGlzSW5jb21pbmcpIHtcclxuICAgIGxldCByZXN1bHRzID0gW107XHJcbiAgICBmb3IgKGxldCBpIGluIHRoaXMucnVsZXMpIHtcclxuICAgICAgcmVzdWx0cy5wdXNoKHRoaXMucnVsZXNbaV0uZXZhbHVhdGUoY29udGV4dCwgbWVzc2FnZSwgaXNJbmNvbWluZykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmNvbWJpbmluZ0FsZ29yaXRobS5jb21iaW5lKHJlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFzdFByaW9yaXR5KCkge1xyXG4gICAgbGV0IHByaW9yaXRpZXMgPSBbXTtcclxuXHJcbiAgICBpZiAodGhpcy5ydWxlcy5sZW5ndGggIT09IDApIHtcclxuICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLnJ1bGVzKSB7XHJcbiAgICAgICAgcHJpb3JpdGllcy5wdXNoKHRoaXMucnVsZXNbaV0ucHJpb3JpdHkpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBwcmlvcml0aWVzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAtMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJ1bGVCeVByaW9yaXR5KHByaW9yaXR5KSB7XHJcbiAgICBmb3IgKGxldCBpIGluIHRoaXMucnVsZXMpIHtcclxuICAgICAgaWYgKFN0cmluZyh0aGlzLnJ1bGVzW2ldLnByaW9yaXR5KSA9PT0gU3RyaW5nKHByaW9yaXR5KSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJ1bGVzW2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aHJvdyBFcnJvcignUnVsZSB3aXRoIHByaW9yaXR5ICcgKyBwcmlvcml0eSArICcgZG9lcyBub3QgZXhpc3QhJyk7XHJcbiAgfVxyXG5cclxuICBfc2V0Q29tYmluaW5nQWxnb3JpdGhtKGNvbWJpbmluZ0FsZ29yaXRobSkge1xyXG4gICAgaWYgKCFjb21iaW5pbmdBbGdvcml0aG0pIHtcclxuICAgICAgY29tYmluaW5nQWxnb3JpdGhtID0gJ2Jsb2NrT3ZlcnJpZGVzJztcclxuICAgIH1cclxuICAgIHN3aXRjaCAoY29tYmluaW5nQWxnb3JpdGhtKSB7XHJcbiAgICAgIGNhc2UgJ2Jsb2NrT3ZlcnJpZGVzJzpcclxuICAgICAgICB0aGlzLmNvbWJpbmluZ0FsZ29yaXRobSA9IG5ldyBCbG9ja092ZXJyaWRlcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdhbGxvd092ZXJyaWRlcyc6XHJcbiAgICAgICAgdGhpcy5jb21iaW5pbmdBbGdvcml0aG0gPSBuZXcgQWxsb3dPdmVycmlkZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZmlyc3RBcHBsaWNhYmxlJzpcclxuICAgICAgICB0aGlzLmNvbWJpbmluZ0FsZ29yaXRobSA9IG5ldyBGaXJzdEFwcGxpY2FibGUoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBhbGdvcml0aG06ICcgKyBjb21iaW5pbmdBbGdvcml0aG0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX3NldFJ1bGVzKHJ1bGVzKSB7XHJcbiAgICB0aGlzLnJ1bGVzID0gW107XHJcblxyXG4gICAgZm9yIChsZXQgaSBpbiBydWxlcykge1xyXG4gICAgICBsZXQgcnVsZSA9IHJ1bGVzW2ldO1xyXG4gICAgICBpZiAocnVsZS5wcmlvcml0eSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcnVsZS5wcmlvcml0eSA9IHRoaXMuZ2V0TGFzdFByaW9yaXR5KCkgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghKHJ1bGUgaW5zdGFuY2VvZiBSdWxlKSkge1xyXG4gICAgICAgIHJ1bGUgPSBuZXcgUnVsZShydWxlLmRlY2lzaW9uLCBydWxlLmNvbmRpdGlvbiwgcnVsZS5zY29wZSwgcnVsZS50YXJnZXQsIHJ1bGUucHJpb3JpdHkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucnVsZXMucHVzaChydWxlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNvcnRSdWxlcygpIHtcclxuICAgIHJldHVybiB0aGlzLnJ1bGVzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xyXG4gICAgICBsZXQgeCA9IGEucHJpb3JpdHk7IGxldCB5ID0gYi5wcmlvcml0eTtcclxuICAgICAgcmV0dXJuICgoeCA8IHkpID8gLTEgOiAoKHggPiB5KSA/IDEgOiAwKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQb2xpY3k7XHJcbiIsIi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1BFUCcpO1xyXG5cclxuaW1wb3J0IEFjdGlvbnNTZXJ2aWNlIGZyb20gJy4vQWN0aW9uc1NlcnZpY2UnO1xyXG5pbXBvcnQgUERQIGZyb20gJy4vUERQJztcclxuaW1wb3J0IFBvbGljeSBmcm9tICcuL1BvbGljeSc7XHJcbmltcG9ydCB7aXNIeXBlcnR5VVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG5jbGFzcyBQRVAge1xyXG5cclxuICAvKipcclxuICAqIENyZWF0ZXMgYSBQb2xpY3kgRW5mb3JjZW1lbnQgUG9pbnQgKFBFUCkgaW5zdGFuY2VcclxuICAqIEBwYXJhbSAgICB7T2JqZWN0fSAgICBjb250ZXh0XHJcbiAgKi9cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLnBkcCA9IG5ldyBQRFAoY29udGV4dCk7XHJcbiAgICBfdGhpcy5hY3Rpb25zU2VydmljZSA9IG5ldyBBY3Rpb25zU2VydmljZShjb250ZXh0KTtcclxuICAgIF90aGlzLmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgY29udGV4dC5wZXAgPSBfdGhpcztcclxuXHJcbiAgICAvL1RPRE8gc2hvdWxkIGJlIGFkZGVkIGEgdHJpZ2dlciB0byB2ZXJpZnkgd2hlbiB0aGUgbG9hZENvbmZpZ3VyYXRpb25zIGlzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWRcclxuICAgIGNvbnRleHQubG9hZENvbmZpZ3VyYXRpb25zKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIHJldHVybiB0aGUgbWVzc2FnZUJ1cyBpbiB0aGlzIFJlZ2lzdHJ5XHJcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXHJcbiAgKi9cclxuICBnZXQgbWVzc2FnZUJ1cygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuY29udGV4dC5tZXNzYWdlQnVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBTZXQgdGhlIG1lc3NhZ2VCdXMgaW4gdGhpcyBSZWdpc3RyeVxyXG4gICogQHBhcmFtIHtNZXNzYWdlQnVzfSAgICAgICAgICAgbWVzc2FnZUJ1c1xyXG4gICovXHJcbiAgc2V0IG1lc3NhZ2VCdXMobWVzc2FnZUJ1cykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLmNvbnRleHQubWVzc2FnZUJ1cyA9IG1lc3NhZ2VCdXM7XHJcbiAgICBfdGhpcy5hZGRHVUlMaXN0ZW5lcnMoKTtcclxuICB9XHJcblxyXG4gIGFkZEdVSUxpc3RlbmVycygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuY29udGV4dC5tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF90aGlzLmNvbnRleHQucGVwVVJMLCAobXNnKSA9PiB7XHJcbiAgICAgIGxldCBmdW5jTmFtZSA9IG1zZy5ib2R5Lm1ldGhvZDtcclxuXHJcbiAgICAgIGxldCByZXR1cm5lZFZhbHVlO1xyXG4gICAgICBpZiAoZnVuY05hbWUgPT09ICdhZGRUb0dyb3VwJykge1xyXG4gICAgICAgIGxldCBncm91cE5hbWUgPSBtc2cuYm9keS5wYXJhbXMuZ3JvdXBOYW1lO1xyXG4gICAgICAgIGxldCB1c2VyRW1haWwgPSBtc2cuYm9keS5wYXJhbXMudXNlckVtYWlsO1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LmFkZFRvR3JvdXAoZ3JvdXBOYW1lLCB1c2VyRW1haWwpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnY3JlYXRlR3JvdXAnKSB7XHJcbiAgICAgICAgbGV0IGdyb3VwTmFtZSA9IG1zZy5ib2R5LnBhcmFtcy5ncm91cE5hbWU7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuY3JlYXRlR3JvdXAoZ3JvdXBOYW1lKTtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2FkZFBvbGljeScpIHtcclxuICAgICAgICBsZXQgc291cmNlID0gbXNnLmJvZHkucGFyYW1zLnNvdXJjZTtcclxuICAgICAgICBsZXQga2V5ID0gbXNnLmJvZHkucGFyYW1zLmtleTtcclxuICAgICAgICBsZXQgcG9saWN5ID0gbXNnLmJvZHkucGFyYW1zLnBvbGljeTtcclxuICAgICAgICBsZXQgY29tYmluaW5nQWxnb3JpdGhtID0gbXNnLmJvZHkucGFyYW1zLmNvbWJpbmluZ0FsZ29yaXRobTtcclxuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuYWRkUG9saWN5KHNvdXJjZSwga2V5LCBwb2xpY3ksIGNvbWJpbmluZ0FsZ29yaXRobSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdkZWxldGVHcm91cCcpIHtcclxuICAgICAgICBsZXQgZ3JvdXBOYW1lID0gbXNnLmJvZHkucGFyYW1zLmdyb3VwTmFtZTtcclxuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC5kZWxldGVHcm91cChncm91cE5hbWUpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAncmVtb3ZlUG9saWN5Jykge1xyXG4gICAgICAgIGxldCBzb3VyY2UgPSBtc2cuYm9keS5wYXJhbXMuc291cmNlO1xyXG4gICAgICAgIGxldCBrZXkgPSBtc2cuYm9keS5wYXJhbXMua2V5O1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5yZW1vdmVQb2xpY3koc291cmNlLCBrZXkpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnc2F2ZVBvbGljaWVzJykge1xyXG4gICAgICAgIGxldCBzb3VyY2UgPSBtc2cuYm9keS5wYXJhbXMuc291cmNlO1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcyhzb3VyY2UpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAndXNlclBvbGljaWVzJykge1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LnVzZXJQb2xpY2llcztcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2FjdGl2ZVVzZXJQb2xpY3knKSB7XHJcbiAgICAgICAgbGV0IHVzZXJQb2xpY3kgPSBtc2cuYm9keS5wYXJhbXMudXNlclBvbGljeTtcclxuICAgICAgICBpZiAodXNlclBvbGljeSkgeyBfdGhpcy5jb250ZXh0LmFjdGl2ZVVzZXJQb2xpY3kgPSB1c2VyUG9saWN5OyB9XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeTtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ3VzZXJQb2xpY3knKSB7XHJcbiAgICAgICAgbGV0IGtleSA9IG1zZy5ib2R5LnBhcmFtcy5rZXk7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQudXNlclBvbGljaWVzW2tleV07XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdzYXZlQWN0aXZlUG9saWN5Jykge1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LnNhdmVBY3RpdmVQb2xpY3koKTtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2dldE15RW1haWxzJykge1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LmdldE15RW1haWxzKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdnZXRNeUh5cGVydGllcycpIHtcclxuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC5nZXRNeUh5cGVydGllcygpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnZ3JvdXBzJykge1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0Lmdyb3VwcztcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2dldEdyb3Vwc05hbWVzJykge1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LmdldEdyb3Vwc05hbWVzKCk7XHJcbiAgICAgIH0gaWYgKGZ1bmNOYW1lID09PSAncmVtb3ZlRnJvbUdyb3VwJykge1xyXG4gICAgICAgIGxldCBncm91cE5hbWUgPSBtc2cuYm9keS5wYXJhbXMuZ3JvdXBOYW1lO1xyXG4gICAgICAgIGxldCB1c2VyRW1haWwgPSBtc2cuYm9keS5wYXJhbXMudXNlckVtYWlsO1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LnJlbW92ZUZyb21Hcm91cChncm91cE5hbWUsIHVzZXJFbWFpbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCB2YWx1ZSA9IHt0eXBlOiAnZXhlY3V0ZScsIHZhbHVlOiByZXR1cm5lZFZhbHVlLCBjb2RlOiAyMDB9O1xyXG4gICAgICBsZXQgcmVwbHlNc2cgPSB7aWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgdG86IG1zZy5mcm9tLCBmcm9tOiBtc2cudG8sIGJvZHk6IHZhbHVlfTtcclxuICAgICAgX3RoaXMuY29udGV4dC5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHJlcGx5TXNnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBZGRzIGEgcG9saWN5IHRvIHRoZSBQb2xpY3kgRW5mb3JjZW1lbnQgUG9pbnQgKFBFUCkuIFRoZSBwb2xpY3kgY2FuIGJlIGNyZWF0ZWQgYnkgdGhlIHNlcnZpY2VcclxuICAqIHByb3ZpZGVyIG9yIGJ5IHRoZSB1c2VyLlxyXG4gICogQHBhcmFtICAgIHtTdHJpbmd9ICAgIHNvdXJjZVxyXG4gICogQHBhcmFtICAgIHtTdHJpbmd9ICAgIGtleVxyXG4gICogQHBhcmFtICAgIHtPYmplY3R9ICAgIHBvbGljeVxyXG4gICovXHJcbiAgYWRkUG9saWN5KHNvdXJjZSwga2V5LCBwb2xpY3ksIGNvbWJpbmluZ0FsZ29yaXRobSkge1xyXG4gICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBFcnJvcignc291cmNlIGlzIG5vdCBkZWZpbmVkJyk7XHJcbiAgICBpZiAoIWtleSkgdGhyb3cgbmV3IEVycm9yKCdrZXkgaXMgbm90IGRlZmluZWQnKTtcclxuXHJcbiAgICBpZiAocG9saWN5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcG9saWN5ID0gbmV3IFBvbGljeShrZXksIFtdLCBbXSwgY29tYmluaW5nQWxnb3JpdGhtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghKHBvbGljeSBpbnN0YW5jZW9mIFBvbGljeSkpIHtcclxuICAgICAgICBwb2xpY3kgPSBuZXcgUG9saWN5KHBvbGljeS5rZXksIHBvbGljeS5ydWxlcywgcG9saWN5LmFjdGlvbnMsIHBvbGljeS5jb21iaW5pbmdBbGdvcml0aG0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChzb3VyY2UpIHtcclxuICAgICAgY2FzZSAnU0VSVklDRV9QUk9WSURFUic6XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcyhzb3VyY2UsIHBvbGljeSwga2V5KTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnVVNFUic6XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnVzZXJQb2xpY2llc1trZXldID0gcG9saWN5O1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlUG9saWNpZXMoc291cmNlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBwb2xpY3kgc291cmNlOiAnICsgc291cmNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGF1dGhvcmlzZShtZXNzYWdlLCBpc0luY29taW5nKSB7XHJcbiAgICAvLyBsb2cubG9nKCdbUG9saWN5LlBFUCBBdXRob3Jpc2VdICcsIG1lc3NhZ2UpO1xyXG4gICAgLy8gbG9nLmxvZyhtZXNzYWdlKTtcclxuICAgIGlmICghbWVzc2FnZSkgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlIGlzIG5vdCBkZWZpbmVkJyk7XHJcbiAgICBpZiAoIW1lc3NhZ2UuZnJvbSkgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlLmZyb20gaXMgbm90IGRlZmluZWQnKTtcclxuICAgIGlmICghbWVzc2FnZS50bykgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlLnRvIGlzIG5vdCBkZWZpbmVkJyk7XHJcbiAgICBpZiAoIW1lc3NhZ2UudHlwZSkgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlLnR5cGUgaXMgbm90IGRlZmluZWQnKTtcclxuICAgIG1lc3NhZ2UuYm9keSA9IG1lc3NhZ2UuYm9keSB8fCB7fTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgbWVzc2FnZS5ib2R5ID0gbWVzc2FnZS5ib2R5IHx8IHt9O1xyXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgbGV0IHJlc3VsdCA9IF90aGlzLnBkcC5ldmFsdWF0ZVBvbGljaWVzKG1lc3NhZ2UsIGlzSW5jb21pbmcpO1xyXG4gICAgICBpZiAocmVzdWx0ID09PSAnTm90IEFwcGxpY2FibGUnKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gX3RoaXMuY29udGV4dC5kZWZhdWx0QmVoYXZpb3VyO1xyXG4gICAgICAgIG1lc3NhZ2UuYm9keS5hdXRoID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgX3RoaXMuYWN0aW9uc1NlcnZpY2UuZW5mb3JjZVBvbGljaWVzKG1lc3NhZ2UsIGlzSW5jb21pbmcpLnRoZW4obWVzc2FnZXMgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgaW4gbWVzc2FnZXMpIHtcclxuICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTtcclxuICAgICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgICAgbWVzc2FnZS5ib2R5LmF1dGggPSAobWVzc2FnZS5ib2R5LmF1dGggPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogbWVzc2FnZS5ib2R5LmF1dGg7XHJcbiAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0geyBib2R5OiB7IGNvZGU6IDQwMywgZGVzY3JpcHRpb246ICdCbG9ja2VkIGJ5IHBvbGljeScgfSwgZnJvbTogbWVzc2FnZS50bywgdG86IG1lc3NhZ2UuZnJvbSwgdHlwZTogJ3Jlc3BvbnNlJyB9O1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuICBhdXRob3Jpc2VTeW5jKG1lc3NhZ2UpIHtcclxuICAgIGxldCByZXN1bHQ7XHJcbiAgICBtZXNzYWdlLmJvZHkgPSBtZXNzYWdlLmJvZHkgfHwge307XHJcbiAgICByZXN1bHQgPSB0aGlzLnBkcC5ldmFsdWF0ZVBvbGljaWVzKG1lc3NhZ2UsIHRydWUpO1xyXG4gICAgaWYgKHJlc3VsdCA9PT0gJ05vdCBBcHBsaWNhYmxlJykge1xyXG4gICAgICByZXN1bHQgPSB0aGlzLmNvbnRleHQuZGVmYXVsdEJlaGF2aW91cjtcclxuICAgIH1cclxuICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlUG9saWN5KHNvdXJjZSwga2V5KSB7XHJcbiAgICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IEVycm9yKCdzb3VyY2UgaXMgbm90IGRlZmluZWQnKTtcclxuICAgIGlmIChzb3VyY2UgIT09ICcqJyAmJiAha2V5KSB0aHJvdyBuZXcgRXJyb3IoJ2tleSBpcyBub3QgZGVmaW5lZCcpO1xyXG5cclxuICAgIHN3aXRjaCAoc291cmNlKSB7XHJcbiAgICAgIGNhc2UgJyonOlxyXG4gICAgICAgIHRoaXMuY29udGV4dC5zZXJ2aWNlUHJvdmlkZXJQb2xpY3kgPSB7fTtcclxuICAgICAgICB0aGlzLmNvbnRleHQudXNlclBvbGljaWVzID0ge307XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LmFjdGl2ZVVzZXJQb2xpY3kgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcygnVVNFUicpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlUG9saWNpZXMoJ1NFUlZJQ0VfUFJPVklERVInKTtcclxuICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZUFjdGl2ZVBvbGljeSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdTRVJWSUNFX1BST1ZJREVSJzpcclxuICAgICAgICBkZWxldGUgdGhpcy5jb250ZXh0LnNlcnZpY2VQcm92aWRlclBvbGljeVtrZXldO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlUG9saWNpZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnVVNFUic6XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuY29udGV4dC51c2VyUG9saWNpZXNba2V5XTtcclxuICAgICAgICBpZiAoa2V5ID09PSB0aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeSkge1xyXG4gICAgICAgICAgdGhpcy5jb250ZXh0LmFjdGl2ZVVzZXJQb2xpY3kgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZUFjdGl2ZVBvbGljeSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZVBvbGljaWVzKCdVU0VSJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gcG9saWN5IHNvdXJjZTogJyArIHNvdXJjZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUEVQO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdQaXBlbGluZScpO1xyXG5cclxuLyoqXHJcbiogQGF1dGhvciBtaWNhZWxwZWRyb3NhQGdtYWlsLmNvbVxyXG4qIFNlcXVlbmNpYWwgcHJvY2Vzc29yIG9mIG1ldGhvZHMuIFNpbWlsYXIgdG8gaG93IFNlcXVlbnRpYWwgUHJvbWlzZSdzIHdvcmssIGJ1dCBiZXR0ZXIgZml0IGZvciBtZXNzYWdlIHByb2Nlc3NpbmcuXHJcbiogTm9ybWFsIHVzZSBmb3IgdGhpcywgaXMgdG8gaW50ZXJjZXB0IGFsbCBtZXNzYWdlcyB3aXRoIGNvbmZpZ3VyZWQgaGFuZGxlcnMsIGFuZCBhY3QgYWNjb3JkaW5nbHkuXHJcbiovXHJcblxyXG5pbXBvcnQge2lzRGF0YU9iamVjdFVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuY2xhc3MgUGlwZWxpbmUge1xyXG4gIC8qIHB1YmxpY1xyXG4gICAgaGFuZGxlcnM6ICgoUGlwZUNvbnRleHQpID0+IHZvaWQpW11cclxuICAgIG9uRmFpbDogKGVycm9yKSA9PiB2b2lkXHJcbiAgKi9cclxuXHJcbiAgY29uc3RydWN0b3IoX29uRmFpbCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5oYW5kbGVycyA9IFtdO1xyXG4gICAgX3RoaXMub25GYWlsID0gX29uRmFpbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluc2VydCBhIG1lc3NhZ2UgaW4gdGhlIHBpcGVsaW5lIHF1ZXVlLiBBbGwgbWVzc2FnZXMgYXJlIHdyYXBwZWQgd2l0aCBhIFBpcGVDb250ZXh0LlxyXG4gICAqIEBwYXJhbSAge01lc3NhZ2V9IG1zZyAgICAgICBNZXNzYWdlIGZvciB0aGUgcXVldWVcclxuICAgKiBAcGFyYW0gIHtDYWxsYmFja30gb25EZWxpdmVyIFdoZW4gbWVzc2FnZSBpcyBmaW5pc2hlZCBwcm9jZXNzaW5nIGZyb20gYWxsIGhhbmRsZXJzLCBpdCB3aWxsIGJlIGRlbGl2ZXJlZCBpbiB0aGlzIGNhbGxiYWNrLlxyXG4gICAqL1xyXG4gIHByb2Nlc3MobXNnLCBvbkRlbGl2ZXIpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgaWYgKF90aGlzLmhhbmRsZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGV0IGl0ZXIgPSBuZXcgSXRlcmF0b3IoX3RoaXMuaGFuZGxlcnMpO1xyXG4gICAgICBpdGVyLm5leHQobmV3IFBpcGVDb250ZXh0KF90aGlzLCBpdGVyLCBtc2csIG9uRGVsaXZlcikpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb25EZWxpdmVyKG1zZyk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXHJcbiogV3JhcHBlciBhcm91bmQgYSBtZXNzYWdlIHRoYXQgYWRkcyBhY3Rpb25zIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IGFueSBpbnRlcmNlcHRvciBoYW5kbGVyLlxyXG4qIFRoZSBQaXBlbGluZSBpcyBhc3luY2hyb25vdXMsIHNvIGFuIGhhbmRsZXIgc2hvdWxkIGFsd2F5cyBjYWxsIGFuIGFjdGlvbiwgdGhlIGRlZmF1bHQgb25lIGlzIFwibmV4dCgpXCJcclxuKi9cclxuY2xhc3MgUGlwZUNvbnRleHQge1xyXG4gIC8qIHByaXZhdGVcclxuICAgIF9pblN0b3A6IGJvb2xlYW5cclxuXHJcbiAgICBfcGlwZWxpbmU6IFBpcGVsaW5lXHJcbiAgICBfaXRlcjogSXRlcmF0b3JcclxuICAgIF9tc2c6IE1lc3NhZ2VcclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3RvcihwaXBlbGluZSwgaXRlciwgbXNnLCBvbkRlbGl2ZXIpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX2luU3RvcCA9IGZhbHNlO1xyXG5cclxuICAgIF90aGlzLl9waXBlbGluZSA9IHBpcGVsaW5lO1xyXG4gICAgX3RoaXMuX2l0ZXIgPSBpdGVyO1xyXG4gICAgX3RoaXMuX21zZyA9IG1zZztcclxuICAgIF90aGlzLl9vbkRlbGl2ZXIgPSBvbkRlbGl2ZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgcGlwZWxpbmUoKSB7IHJldHVybiB0aGlzLl9waXBlbGluZTsgfVxyXG5cclxuICBnZXQgbXNnKCkgeyByZXR1cm4gdGhpcy5fbXNnOyB9XHJcbiAgc2V0IG1zZyhpbk1zZykgeyB0aGlzLl9tc2cgPSBpbk1zZzsgfVxyXG5cclxuICAvKipcclxuICAgKiBQcm9jZWVkIHRvIHRoZSBuZXh0IGludGVyY2VwdG9yIGhhbmRsZXIsIHVubGVzcyB0aGVyZSB3YXMgYW4gZXJyb3IuIElmIGl0J3MgdGhlIGxhc3Qgb25lLCBwcm9jZWVkIHRvIG9uRGVsaXZlciBoYW5kbGVyLlxyXG4gICAqL1xyXG4gIG5leHQoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmICghX3RoaXMuX2luU3RvcCkge1xyXG4gICAgICBpZiAoX3RoaXMuX2l0ZXIuaGFzTmV4dCkge1xyXG4gICAgICAgIF90aGlzLl9pdGVyLm5leHQoX3RoaXMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aGlzLl9vbkRlbGl2ZXIoX3RoaXMuX21zZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb2NlZWQgZGlyZWN0bHkgdG8gdGhlIG9uRGVsaXZlciBoYW5kbGVyLCB1bmxlc3MgdGhlcmUgd2FzIGFuIGVycm9yLlxyXG4gICAqL1xyXG4gIGRlbGl2ZXIoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgaWYgKCFfdGhpcy5faW5TdG9wKSB7XHJcbiAgICAgIF90aGlzLl9pblN0b3AgPSB0cnVlO1xyXG4gICAgICBfdGhpcy5fb25EZWxpdmVyKF90aGlzLl9tc2cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFyayB0aGUgY29udGV4dCB3aXRoIGFuIGVycm9yIGFuZCBwcm9jZWVkIHRvIHRoZSBvbkZhaWwgaGFuZGxlci5cclxuICAgKiBAcGFyYW0gIHtbdHlwZV19IGVycm9yIFtkZXNjcmlwdGlvbl1cclxuICAgKi9cclxuICBmYWlsKGVycm9yKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmICghX3RoaXMuX2luU3RvcCkge1xyXG4gICAgICBfdGhpcy5faW5TdG9wID0gdHJ1ZTtcclxuICAgICAgaWYgKF90aGlzLl9waXBlbGluZS5vbkZhaWwpIHtcclxuICAgICAgICBfdGhpcy5fcGlwZWxpbmUub25GYWlsKGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbn1cclxuXHJcbmNsYXNzIEl0ZXJhdG9yIHtcclxuICAvKiBwcml2YXRlXHJcbiAgICBfaW5kZXg6IG51bWJlclxyXG4gICAgX2FycmF5OiBbXVxyXG4gICovXHJcblxyXG4gIGNvbnN0cnVjdG9yKGFycmF5KSB7XHJcbiAgICB0aGlzLl9pbmRleCA9IC0xO1xyXG4gICAgdGhpcy5fYXJyYXkgPSBhcnJheTtcclxuICB9XHJcblxyXG4gIGdldCBoYXNOZXh0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGV4IDwgdGhpcy5fYXJyYXkubGVuZ3RoIC0gMTtcclxuICB9XHJcblxyXG4gIGdldCBuZXh0KCkge1xyXG4gICAgdGhpcy5faW5kZXgrKztcclxuICAgIHJldHVybiB0aGlzLl9hcnJheVt0aGlzLl9pbmRleF07XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQaXBlbGluZTtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gTG9nIHN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignTWVzc2FnZUJ1cycpO1xyXG5cclxuaW1wb3J0IEJ1cyBmcm9tICcuL0J1cyc7XHJcbmltcG9ydCBQaXBlbGluZSBmcm9tICcuL1BpcGVsaW5lJztcclxuXHJcbi8qKlxyXG4qIEBhdXRob3IgbWljYWVscGVkcm9zYUBnbWFpbC5jb21cclxuKiBNZXNzYWdlIEJVUyBJbnRlcmZhY2UgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBCdXNcclxuKiBJdCBkb2Vzbid0IHN1cHBvcnQgdGhlIGRlZmF1bHQgJyonIGxpc3RlbmVyLCBpbnN0ZWFkIGl0IHVzZXMgdGhlIHJlZ2lzdHJ5LnJlc29sdmUoLi4pXHJcbiovXHJcbmNsYXNzIE1lc3NhZ2VCdXMgZXh0ZW5kcyBCdXMge1xyXG4gIC8qIHByaXZhdGVcclxuICBfcmVnaXN0cnk6IFJlZ2lzdHJ5XHJcbiAgX2ZvcndhcmRzOiB7IDxmcm9tLXVybD46IHsgZmw6IE1zZ0xpc3RlbmVyLCBzYW5kYm94VG9VcmxzOiBNYXAoU2FuZGJveCwgW3RvLXVybF0pLCB1cmxUb1NhbmRib3g6IHsgdG8tdXJsOiBTYW5kYm94IH0gfSB9XHJcblxyXG4gIF9waXBlbGluZTogUGlwZWxpbmVcclxuICAqL1xyXG5cclxuICAvL1RPRE86IGZ1dHVyZSBvcHRpbWl6YXRpb25cclxuICAvLzEuIG1lc3NhZ2UgYmF0Y2ggcHJvY2Vzc2luZyB3aXRoIHNldEludGVydmFsXHJcbiAgLy8yLiByZXNvbHZlIGRlZmF1bHQgZ2F0ZXdheS9wcm90b3N0dWIgd2l0aCByZWdpc3Rlci5yZXNvbHZlXHJcblxyXG4gIGNvbnN0cnVjdG9yKHJlZ2lzdHJ5KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcclxuICAgIHRoaXMuX2ZvcndhcmRzID0ge307XHJcblxyXG4gICAgdGhpcy5fcGlwZWxpbmVJbiA9IG5ldyBQaXBlbGluZSgoZXJyb3IpID0+IHtcclxuICAgICAgbG9nLmVycm9yKCdQSVBFTElORS1FUlJPUjogJywgSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3BpcGVsaW5lT3V0ID0gbmV3IFBpcGVsaW5lKChlcnJvcikgPT4ge1xyXG4gICAgICBsb2cuZXJyb3IoJ1BJUEVMSU5FLUVSUk9SOiAnLCBKU09OLnN0cmluZ2lmeShlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGlwZWxpbmVJbigpIHsgcmV0dXJuIHRoaXMuX3BpcGVsaW5lSW47IH1cclxuXHJcbiAgZ2V0IHBpcGVsaW5lT3V0KCkgeyByZXR1cm4gdGhpcy5fcGlwZWxpbmVPdXQ7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUG9zdCBhIG1lc3NhZ2UgZm9yIHJvdXRpbmcuIEl0IHdpbGwgZmlyc3Qgc2VhcmNoIGZvciBhIGxpc3RlbmVyLCBpZiB0aGVyZSBpcyBubyBvbmUsIGl0IHNlbmRzIHRvIGEgZXh0ZXJuYWwgcm91dGluZyB1c2luZyB0aGUgX29uUG9zdE1lc3NhZ2UuXHJcbiAgICogRXh0ZXJuYWwgcm91dGluZyB1c2UgdGhlIHJlZ2lzdHJ5LnJlc29sdmUoLi4pIG1ldGhvZCB0byBkZWNpZGUgdGhlIGRlc3RpbmF0aW9uIHNhbmRib3guXHJcbiAgICogQHBhcmFtICB7TWVzc2FnZX0gaW5Nc2cgICAgICAgICAgICBKU09OIHdpdGggbWFuZGF0b3J5IE1lc3NhZ2Ugc3RydWN0dXJlIHtpZCwgdHlwZSwgZnJvbSwgdG99XHJcbiAgICogQHBhcmFtICB7Q2FsbGJhY2t9IHJlc3BvbnNlQ2FsbGJhY2sgT3B0aW9uYWwgY2FsbGJhY2sgaWYgYSByZXNwb25zZSBpcyBleHBlY3RlZCBmcm9tIHRoZSByZXF1ZXN0LiBBIHJlc3BvbnNlIHdpbGwgYmUgYWx3YXlzIHNlbnQsIGV2ZW4gaWYgaXQgaXMgYSBcIlRpbWVvdXRcIi5cclxuICAgKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICAgICAgICAgICAgdGhlIE1lc3NhZ2UgaWRcclxuICAgKi9cclxuICBwb3N0TWVzc2FnZShpbk1zZywgcmVzcG9uc2VDYWxsYmFjaywgdGltZW91dCkge1xyXG4gICAgbG9nLmluZm8oJ29uUE9TVE1lc3NhZ2U6ICcsIGluTXNnKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGRlbGl2ZXIgPSAobXNnKSA9PiB7XHJcblxyXG4gICAgICAgICAgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2soaW5Nc2csIHJlc3BvbnNlQ2FsbGJhY2ssIHRpbWVvdXQpO1xyXG5cclxuICAgICAgICAgIGlmICghX3RoaXMuX29uUmVzcG9uc2UobXNnKSkge1xyXG4gICAgICAgICAgICBsZXQgaXRlbUxpc3QgPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1ttc2cudG9dO1xyXG4gICAgICAgICAgICBpZiAoaXRlbUxpc3QpIHtcclxuICAgICAgICAgICAgICAvL2RvIG5vdCBwdWJsaXNoIG9uIGRlZmF1bHQgYWRkcmVzcywgYmVjYXVzZSBvZiBsb29wYmFjayBjeWNsZVxyXG4gICAgICAgICAgICAgIF90aGlzLl9wdWJsaXNoT24oaXRlbUxpc3QsIG1zZyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy9pZiB0aGVyZSBpcyBubyBsaXN0ZW5lciwgc2VuZCB0byBleHRlcm5hbCBpbnRlcmZhY2VcclxuICAgICAgICAgICAgICBfdGhpcy5fb25Qb3N0TWVzc2FnZShtc2cpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3RoaXMuX2dlbklkKGluTXNnKTtcclxuXHJcbiAgICBpZiAoX3RoaXMuX2lzVG9Qcm9jZXNzKGluTXNnKSkge1xyXG4gICAgICBsZXQgaXNJbmNvbWluZyA9IF90aGlzLl9pc0luY29taW5nTWVzc2FnZShpbk1zZyk7XHJcblxyXG4gICAgICBpZiAoaXNJbmNvbWluZykgX3RoaXMuX3BpcGVsaW5lSW4ucHJvY2Vzcyhpbk1zZywgZGVsaXZlcik7XHJcbiAgICAgIGVsc2UgX3RoaXMuX3BpcGVsaW5lT3V0LnByb2Nlc3MoaW5Nc2csIGRlbGl2ZXIpO1xyXG4gICAgfSBlbHNlIGRlbGl2ZXIoaW5Nc2cpO1xyXG5cclxuICAgIHJldHVybiBpbk1zZy5pZDtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgX2lzVG9Qcm9jZXNzKG1lc3NhZ2UpIHtcclxuICAgIGxldCBzY2hlbWFzVG9JZ25vcmUgPSBbJ2RvbWFpbicsICdkb21haW4taWRwJywgJ2dsb2JhbCcsICdoeXBlcnR5LXJ1bnRpbWUnLCAncnVudGltZSddO1xyXG4gICAgbGV0IHNwbGl0RnJvbSA9IChtZXNzYWdlLmZyb20pLnNwbGl0KCc6Ly8nKTtcclxuICAgIGxldCBmcm9tU2NoZW1hID0gc3BsaXRGcm9tWzBdO1xyXG4gICAgbGV0IHNwbGl0VG8gPSAobWVzc2FnZS50bykuc3BsaXQoJzovLycpO1xyXG4gICAgbGV0IHRvU2NoZW1hID0gIHNwbGl0VG9bMF07XHJcbiAgICBsZXQgZnJvbSA9IG1lc3NhZ2UuZnJvbTtcclxuICAgIGxldCB0byA9IG1lc3NhZ2UudG87XHJcblxyXG4gICAgLy8gU2lnbmFsbGluZyBtZXNzYWdlcyBiZXR3ZWVuIFAyUCBTdHVicyBkb24ndCBoYXZlIHRvIGJlIHZlcmlmaWVkLiBGRlNcclxuXHJcbiAgICBpZiAobWVzc2FnZS5ib2R5ICYmIG1lc3NhZ2UuYm9keS5zb3VyY2UpIHtcclxuICAgICAgZnJvbSA9IG1lc3NhZ2UuYm9keS5zb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1lc3NhZ2UuYm9keSAmJiBtZXNzYWdlLmJvZHkuc3Vic2NyaWJlcikge1xyXG4gICAgICBmcm9tID0gbWVzc2FnZS5ib2R5LnN1YnNjcmliZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZyb20uaW5kZXhPZignL3AycGhhbmRsZXIvJykgIT09IC0xIHx8IGZyb20uaW5kZXhPZignL3AycHJlcXVlc3Rlci8nKSAhPT0gLTEgfHwgdG8uaW5kZXhPZignL3AycGhhbmRsZXIvJykgIT09IC0xIHx8IHRvLmluZGV4T2YoJy9wMnByZXF1ZXN0ZXIvJykgIT09IC0xKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fcmVnaXN0cnkuaXNMb2NhbChmcm9tKSAmJiB0aGlzLl9yZWdpc3RyeS5pc0xvY2FsKG1lc3NhZ2UudG8pKVxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgaWYgKG1lc3NhZ2UuZnJvbSA9PT0gZnJvbVNjaGVtYSB8fCBtZXNzYWdlLnRvID09PSB0b1NjaGVtYSB8fCBtZXNzYWdlLnR5cGUgPT09ICdyZWFkJyB8fCBtZXNzYWdlLnR5cGUgPT09ICdyZXNwb25zZScgfHwgKG1lc3NhZ2UuZnJvbS5pbmNsdWRlcygnaHlwZXJ0eTovLycpICYmIG1lc3NhZ2UudHlwZSA9PT0gJ2RlbGV0ZScpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBzY2hlbWFzVG9JZ25vcmUuaW5kZXhPZihmcm9tU2NoZW1hKSA9PT0gLTEgfHwgc2NoZW1hc1RvSWdub3JlLmluZGV4T2YodG9TY2hlbWEpID09PSAtMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9pc0luY29taW5nTWVzc2FnZShtZXNzYWdlKSB7XHJcbiAgICBsZXQgZnJvbTtcclxuXHJcbiAgICBpZiAobWVzc2FnZS50eXBlID09PSAnZm9yd2FyZCcpIHtcclxuICAgICAgbG9nLmluZm8oJ1tNZXNzYWdlQnVzIC0gaXNJbmNvbWluZ01lc3NhZ2VdIC0gbWVzc2FnZS50eXBlOiAnLCBtZXNzYWdlLnR5cGUpO1xyXG4gICAgICBmcm9tID0gbWVzc2FnZS5ib2R5LmZyb207XHJcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoJ2JvZHknKSAmJiBtZXNzYWdlLmJvZHkuaGFzT3duUHJvcGVydHkoJ3NvdXJjZScpICYmIG1lc3NhZ2UuYm9keS5zb3VyY2UpIHtcclxuICAgICAgbG9nLmluZm8oJ1tNZXNzYWdlQnVzIC0gaXNJbmNvbWluZ01lc3NhZ2VdIC0gbWVzc2FnZS5ib2R5LnNvdXJjZTogJywgbWVzc2FnZS5ib2R5LnNvdXJjZSk7XHJcbiAgICAgIGZyb20gPSBtZXNzYWdlLmJvZHkuc291cmNlO1xyXG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdzdWJzY3JpYmVyJykgJiYgbWVzc2FnZS5ib2R5LnN1YnNjcmliZXIpIHtcclxuICAgICAgLy9UT0RPOiB0aGlzIHN1YnNjcmliZXIgdmFsaWRhdGlvbiBzaG91bGQgbm90IGV4aXN0LCBiZWNhdXNlIGlzIG91dGRhdGVkXHJcbiAgICAgIC8vVE9ETzogdGhlIHN5bmNoZXIgYW5kIHN5bmNoZXIgbWFuYWdlciBub3QgZm9sbG93aW5nIHRoZSBjb3JyZWN0IHNwZWM7XHJcbiAgICAgIGxvZy5pbmZvKCdbTWVzc2FnZUJ1cyAtIGlzSW5jb21pbmdNZXNzYWdlXSAtIG1lc3NhZ2UuYm9keS5zdWJzY3JpYmVyOiAnLCBtZXNzYWdlLmJvZHkuc3Vic2NyaWJlcik7XHJcbiAgICAgIGZyb20gPSBtZXNzYWdlLmJvZHkuc3Vic2NyaWJlcjtcclxuICAgIH0gIGVsc2UgaWYgKG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoJ2JvZHknKSAmJiBtZXNzYWdlLmJvZHkuaGFzT3duUHJvcGVydHkoJ3JlcG9ydGVyJykgJiYgbWVzc2FnZS5ib2R5LnJlcG9ydGVyKSB7XHJcbiAgICAgIC8vVE9ETzogdGhpcyBzdWJzY3JpYmVyIHZhbGlkYXRpb24gc2hvdWxkIG5vdCBleGlzdCwgYmVjYXVzZSBpcyBvdXRkYXRlZFxyXG4gICAgICAvL1RPRE86IHRoZSBzeW5jaGVyIGFuZCBzeW5jaGVyIG1hbmFnZXIgbm90IGZvbGxvd2luZyB0aGUgY29ycmVjdCBzcGVjO1xyXG4gICAgICBsb2cuaW5mbygnW01lc3NhZ2VCdXMgLSBpc0luY29taW5nTWVzc2FnZV0gLSBtZXNzYWdlLmJvZHkucmVwb3J0ZXI6ICcsIG1lc3NhZ2UuYm9keS5yZXBvcnRlcik7XHJcbiAgICAgIGZyb20gPSBtZXNzYWdlLmJvZHkucmVwb3J0ZXI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsb2cuaW5mbygnW01lc3NhZ2VCdXMgLSBpc0luY29taW5nTWVzc2FnZV0gLSBtZXNzYWdlLmZyb20gJywgbWVzc2FnZS5mcm9tKTtcclxuICAgICAgZnJvbSA9IG1lc3NhZ2UuZnJvbTtcclxuICAgIH1cclxuXHJcbiAgICBsb2cuaW5mbygnW01lc3NhZ2VCdXMgLSBpc0luY29taW5nTWVzc2FnZV0gLSBjaGVjayBpZiBpc0xvY2FsOiAnLCBmcm9tKTtcclxuICAgIHJldHVybiAhdGhpcy5fcmVnaXN0cnkuaXNMb2NhbChmcm9tKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGFuIGV4dGVybmFsIHB1Ymxpc2ggYWRkcmVzcyBsaXN0ZW5lci4gRXZlcnkgbWVzc2FnZSBmb3IgdGhlIGFkZHJlc3Mgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIGV4dGVybmFsIHJvdXRpbmcgYnkgX29uUG9zdE1lc3NhZ2UuXHJcbiAgICogVGhpcyBtZWFucywgZXZlbiBpZiB0aGVyZSBpcyBhIGxpc3RlbmVyIGZvciB0aGUgYWRkcmVzcywgaXQgd2lsbCBhbHNvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlIGV4dGVybmFsIHJvdXRpbmcuXHJcbiAgICogQHBhcmFtIHtVUkx9IGZyb20gUHVibGlzaCBhZGRyZXNzLlxyXG4gICAqL1xyXG4gIGFkZFB1Ymxpc2goZnJvbSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL3ZlcmlmeSBpZiBmb3J3YXJkIGV4aXN0XHJcbiAgICBsZXQgcmVmQ291bnQgPSBfdGhpcy5fZm9yd2FyZHNbZnJvbV07XHJcbiAgICBpZiAoIXJlZkNvdW50KSB7XHJcbiAgICAgIGxldCBmb3J3YXJkTGlzdGVuZXIgPSBfdGhpcy5hZGRMaXN0ZW5lcihmcm9tLCAobXNnKSA9PiB7XHJcbiAgICAgICAgbG9nLmluZm8oJ01CLVBVQkxJU0g6ICggJyArIGZyb20gKyAnICknKTtcclxuICAgICAgICBfdGhpcy5fb25Qb3N0TWVzc2FnZShtc2cpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHJlZkNvdW50ID0ge1xyXG4gICAgICAgIGNvdW50ZXI6IDAsXHJcbiAgICAgICAgZmw6IGZvcndhcmRMaXN0ZW5lcixcclxuICAgICAgICByZW1vdmU6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY291bnRlci0tO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY291bnRlciA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmZsLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICBkZWxldGUgX3RoaXMuX2ZvcndhcmRzW2Zyb21dO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgX3RoaXMuX2ZvcndhcmRzW2Zyb21dID0gcmVmQ291bnQ7XHJcbiAgIH1cclxuXHJcbiAgIHJlZkNvdW50LmNvdW50ZXIrKztcclxuICAgcmV0dXJuIHJlZkNvdW50O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIGZvcndhcmQgbGlzdGVuZXIgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi4gRXZlcnkgbWVzc2FnZSByZWFjaGluZyBhbiBhZGRyZXNzIHdpbGwgYmUgYWxzbyBzZW50IHRvIHRoZSBmb3J3YXJkIGFkZHJlc3MuXHJcbiAgICogQHBhcmFtIHtVUkx9IGZyb20gTWVzc2FnZSBkZXN0aW5hdGlvbiwgaXQncyBhY3R1YWxseSB0aGUgZmllbGQgXCJ0b1wiIG9mIHRoZSBtZXNzYWdlLlxyXG4gICAqIEBwYXJhbSB7VVJMfSB0byAgIEZvcndhcmQgYWRkcmVzcy5cclxuICAgKi9cclxuICAgYWRkRm9yd2FyZChmcm9tLCB0bykge1xyXG4gICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgIHJldHVybiBfdGhpcy5hZGRMaXN0ZW5lcihmcm9tLCAobXNnKSA9PiB7XHJcbiAgICAgICBsb2cuaW5mbygnTUItRk9SV0FSRDogKCAnICsgZnJvbSArICcgdG8gJyArIHRvICsgJyApJyk7XHJcbiAgICAgICBfdGhpcy5mb3J3YXJkKHRvLCBtc2cpO1xyXG4gICAgIH0pO1xyXG4gICB9XHJcblxyXG4gICAvKipcclxuICAgICogSnVzdCBmb3J3YXJkJ3MgYSBtZXNzYWdlIHRvIHRoZSBmb3J3YXJkIGFkZHJlc3MuIExpc3RlbmVycyBzaG91bGQgYmUgYXZhaWxhYmxlIGZvciB0aGUgZm9yd2FyZCBhZGRyZXNzLlxyXG4gICAgKiBAcGFyYW0gIHtVUkx9IHVybCBGb3J3YXJkIGFkZHJlc3MuXHJcbiAgICAqIEBwYXJhbSAge01lc3NhZ2V9IG1zZyBNZXNzYWdlIHRvIGZvcndhcmRcclxuICAgICovXHJcbiAgIGZvcndhcmQodXJsLCBtc2cpIHtcclxuICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICBsZXQgaXRlbUxpc3QgPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1cmxdO1xyXG4gICAgIGlmIChpdGVtTGlzdCkge1xyXG4gICAgICAgX3RoaXMuX3B1Ymxpc2hPbihpdGVtTGlzdCwgbXNnKTtcclxuICAgICB9XHJcbiAgIH1cclxuXHJcbiAgIC8vZGVmYXVsdCByb3V0ZSwgaWYgdGhlcmUgYXJlIG5vIGxpc3RlbmVycyBhdmFpbGFibGUgZm9yIGEgbWVzc2FnZSBkZXN0aW5hdGlvbi5cclxuICAgX29uUG9zdE1lc3NhZ2UobXNnKSB7XHJcbiAgICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAgLy9yZXNvbHZlIGV4dGVybmFsIHByb3Rvc3R1Yi4uLlxyXG4gICAgIF90aGlzLl9yZWdpc3RyeS5yZXNvbHZlKG1zZykudGhlbigocm91dGUsIG1zZzJyb3V0ZSkgPT4ge1xyXG4gICAgICAgaWYgKG1zZzJyb3V0ZSkgX3RoaXMuZm9yd2FyZChyb3V0ZSwgbXNnMnJvdXRlKTtcclxuICAgICAgIGVsc2UgX3RoaXMuZm9yd2FyZChyb3V0ZSwgbXNnKTtcclxuICAgICB9KS5jYXRjaChmdW5jdGlvbihlKSB7XHJcbiAgICAgICBsb2cuZXJyb3IoJ1JFU09MVkUtRVJST1I6ICcsIGUpO1xyXG4gICAgIH0pO1xyXG4gICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IE1lc3NhZ2VCdXM7XHJcbiIsIi8vIE1hcnNoYWxzIGEgc3RyaW5nIHRvIFVpbnQ4QXJyYXkuXHJcbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVVVEY4KHMpIHtcclxuXHR2YXIgaSA9IDA7XHJcblx0dmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkocy5sZW5ndGggKiA0KTtcclxuXHRmb3IgKHZhciBjaSA9IDA7IGNpICE9IHMubGVuZ3RoOyBjaSsrKSB7XHJcbiAgICB0cnl7XHJcbiAgICAgIHZhciB4eHggPSBzLmNoYXJDb2RlQXQoY2kpO1xyXG4gICAgfSBjYXRjaCAoZXJyKXtcclxuICAgICAgY29uc29sZS5sb2coZXJyLm1lc3NhZ2UpO1xyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgfVxyXG5cdFx0dmFyIGMgPSBzLmNoYXJDb2RlQXQoY2kpO1xyXG5cdFx0aWYgKGMgPCAxMjgpIHtcclxuXHRcdFx0Ynl0ZXNbaSsrXSA9IGM7XHJcblx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGMgPCAyMDQ4KSB7XHJcblx0XHRcdGJ5dGVzW2krK10gPSBjID4+IDYgfCAxOTI7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAoYyA+IDB4ZDdmZiAmJiBjIDwgMHhkYzAwKSB7XHJcblx0XHRcdFx0aWYgKCsrY2kgPT0gcy5sZW5ndGgpIHRocm93ICdVVEYtOCBlbmNvZGU6IGluY29tcGxldGUgc3Vycm9nYXRlIHBhaXInO1xyXG5cdFx0XHRcdHZhciBjMiA9IHMuY2hhckNvZGVBdChjaSk7XHJcblx0XHRcdFx0aWYgKGMyIDwgMHhkYzAwIHx8IGMyID4gMHhkZmZmKSB0aHJvdyAnVVRGLTggZW5jb2RlOiBzZWNvbmQgY2hhciBjb2RlIDB4JyArIGMyLnRvU3RyaW5nKDE2KSArICcgYXQgaW5kZXggJyArIGNpICsgJyBpbiBzdXJyb2dhdGUgcGFpciBvdXQgb2YgcmFuZ2UnO1xyXG5cdFx0XHRcdGMgPSAweDEwMDAwICsgKChjICYgMHgwM2ZmKSA8PCAxMCkgKyAoYzIgJiAweDAzZmYpO1xyXG5cdFx0XHRcdGJ5dGVzW2krK10gPSBjID4+IDE4IHwgMjQwO1xyXG5cdFx0XHRcdGJ5dGVzW2krK10gPSBjPj4gMTIgJiA2MyB8IDEyODtcclxuXHRcdFx0fSBlbHNlIHsgLy8gYyA8PSAweGZmZmZcclxuXHRcdFx0XHRieXRlc1tpKytdID0gYyA+PiAxMiB8IDIyNDtcclxuXHRcdFx0fVxyXG5cdFx0XHRieXRlc1tpKytdID0gYyA+PiA2ICYgNjMgfCAxMjg7XHJcblx0XHR9XHJcblx0XHRieXRlc1tpKytdID0gYyAmIDYzIHwgMTI4O1xyXG5cdH1cclxuXHRyZXR1cm4gYnl0ZXMuc3ViYXJyYXkoMCwgaSk7XHJcbn1cclxuXHJcbi8vIFVubWFyc2hhbHMgYW4gVWludDhBcnJheSB0byBzdHJpbmcuXHJcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVVVEY4KGJ5dGVzKSB7XHJcblx0dmFyIHMgPSAnJztcclxuXHR2YXIgaSA9IDA7XHJcblx0d2hpbGUgKGkgPCBieXRlcy5sZW5ndGgpIHtcclxuXHRcdHZhciBjID0gYnl0ZXNbaSsrXTtcclxuXHRcdGlmIChjID4gMTI3KSB7XHJcblx0XHRcdGlmIChjID4gMTkxICYmIGMgPCAyMjQpIHtcclxuXHRcdFx0XHRpZiAoaSA+PSBieXRlcy5sZW5ndGgpIHRocm93ICdVVEYtOCBkZWNvZGU6IGluY29tcGxldGUgMi1ieXRlIHNlcXVlbmNlJztcclxuXHRcdFx0XHRjID0gKGMgJiAzMSkgPDwgNiB8IGJ5dGVzW2ldICYgNjM7XHJcblx0XHRcdH0gZWxzZSBpZiAoYyA+IDIyMyAmJiBjIDwgMjQwKSB7XHJcblx0XHRcdFx0aWYgKGkgKyAxID49IGJ5dGVzLmxlbmd0aCkgdGhyb3cgJ1VURi04IGRlY29kZTogaW5jb21wbGV0ZSAzLWJ5dGUgc2VxdWVuY2UnO1xyXG5cdFx0XHRcdGMgPSAoYyAmIDE1KSA8PCAxMiB8IChieXRlc1tpXSAmIDYzKSA8PCA2IHwgYnl0ZXNbKytpXSAmIDYzO1xyXG5cdFx0XHR9IGVsc2UgaWYgKGMgPiAyMzkgJiYgYyA8IDI0OCkge1xyXG5cdFx0XHRcdGlmIChpKzIgPj0gYnl0ZXMubGVuZ3RoKSB0aHJvdyAnVVRGLTggZGVjb2RlOiBpbmNvbXBsZXRlIDQtYnl0ZSBzZXF1ZW5jZSc7XHJcblx0XHRcdFx0YyA9IChjICYgNykgPDwgMTggfCAoYnl0ZXNbaV0gJiA2MykgPDwgMTIgfCAoYnl0ZXNbKytpXSAmIDYzKSA8PCA2IHwgYnl0ZXNbKytpXSAmIDYzO1xyXG5cdFx0XHR9IGVsc2UgdGhyb3cgJ1VURi04IGRlY29kZTogdW5rbm93biBtdWx0aWJ5dGUgc3RhcnQgMHgnICsgYy50b1N0cmluZygxNikgKyAnIGF0IGluZGV4ICcgKyAoaSAtIDEpO1xyXG5cdFx0XHQrK2k7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKGMgPD0gMHhmZmZmKSBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XHJcblx0XHRlbHNlIGlmIChjIDw9IDB4MTBmZmZmKSB7XHJcblx0XHRcdGMgLT0gMHgxMDAwMDtcclxuXHRcdFx0cyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMgPj4gMTAgfCAweGQ4MDApXHJcblx0XHRcdHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjICYgMHgzRkYgfCAweGRjMDApXHJcblx0XHR9IGVsc2UgdGhyb3cgJ1VURi04IGRlY29kZTogY29kZSBwb2ludCAweCcgKyBjLnRvU3RyaW5nKDE2KSArICcgZXhjZWVkcyBVVEYtMTYgcmVhY2gnO1xyXG5cdH1cclxuXHRyZXR1cm4gcztcclxufVxyXG4iLCJpbXBvcnQge2VuY29kZVVURjgsIGRlY29kZVVURjh9IGZyb20gJy4vdXRmOC5qcyc7XHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdDcnlwdG9NYW5hZ2VyJyk7XHJcblxyXG4vKipcclxuKiBDbGFzcyB3aXRoIHRoZSBjcnlwdG9ncmFwaGljIGZ1bmN0aW9ucyBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIHByb3RvY29sXHJcbipcclxuKi9cclxuY2xhc3MgQ3J5cHRvIHtcclxuXHJcbi8qKlxyXG4qIFJ1bnRpbWVmYWN0b3J5IGlzIHBhc3NlZCBpbiB0aGUgY29zdHJ1Y3RvciwgYmVjYXVzZSB0aGUgbm9kZUpTIGhhcyBhIGRpZmZlcmVudCBjcnlwdG8gbW9kdWxlXHJcbiogZnJvbSB0aGUgYnJvd3Nlci4gUnVudGltZUZhY3RvcnkgcHJvdmlkZXMgYSB3cmFwcGVyIGZvciB0aGUgZnVjdGlvbnMgb2Ygbm9kZUpTLCBzbyB0aGV5IGNhbiBiZVxyXG4qIGludm9rZWQgYnJvd3NlciBsaWtlLlxyXG4qL1xyXG4gIGNvbnN0cnVjdG9yKHJ1bnRpbWVGYWN0b3J5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgdHlwZW9mIHJ1bnRpbWVGYWN0b3J5LmNyZWF0ZVdlYmNyeXB0byA9PT0gJ2Z1bmN0aW9uJyA/IF90aGlzLl9jcnlwdG8gPSBydW50aW1lRmFjdG9yeS5jcmVhdGVXZWJjcnlwdG8oKSA6IF90aGlzLl9jcnlwdG8gPSBjcnlwdG87XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFBlcmZvcm1zIGEgUlNBIGVuY3J5cHRpb25cclxuICAqIEBwYXJhbSAgIHtBcnJheUJ1ZmZlcn0gICAgdmFsdWUgICAgdGhlIHB1YmxpYyBrZXlcclxuICAqIEBwYXJhbSAgIHtCdWZmZXJTb3VyY2V9ICAgIHZhbHVlICAgIGRhdGEgdG8gYmUgZW5jcnlwZWRcclxuICAqIEByZXR1cm4gIHtVaW50OEFycmF5fSAgIGVuY3J5cHRlZCBkYXRhXHJcbiAgKi9cclxuICBlbmNyeXB0UlNBKHB1YktleSwgZGF0YSkge1xyXG4gICAgbG9nLmxvZygnZW5jcnlwdFJTQTpwdWJLZXknLCBwdWJLZXkpO1xyXG4gICAgbG9nLmxvZygnZW5jcnlwdFJTQTpkYXRhJywgZGF0YSk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIF90aGlzLl9pbXBvcnRSU0FlbmNyeXB0S2V5KG5ldyBVaW50OEFycmF5KHB1YktleSkpLnRoZW4oZnVuY3Rpb24ocHVibGljS2V5KSB7XHJcblxyXG4gICAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLmVuY3J5cHQoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwdWJsaWNLZXksIC8vZnJvbSBnZW5lcmF0ZUtleSBvciBpbXBvcnRLZXkgYWJvdmVcclxuICAgICAgICAgIGRhdGEgLy9BcnJheUJ1ZmZlciBvZiBkYXRhIHlvdSB3YW50IHRvIGVuY3J5cHRcclxuICAgICAgICApXHJcbiAgICAgICAgICAudGhlbihmdW5jdGlvbihlbmNyeXB0ZWQpIHtcclxuICAgICAgICAgIC8vcmV0dXJucyBhbiBBcnJheUJ1ZmZlciBjb250YWluaW5nIHRoZSBlbmNyeXB0ZWQgZGF0YVxyXG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWVuY3J5cHRSU0EnLCBuZXcgVWludDhBcnJheShlbmNyeXB0ZWQpKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShuZXcgVWludDhBcnJheShlbmNyeXB0ZWQpKTtcclxuXHJcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1lbmNyeXB0UlNBJywgZXJyKTtcclxuICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUGVyZm9ybXMgYSBSU0EgZGVjcnlwdGlvblxyXG4gICogQHBhcmFtICAge0FycmF5QnVmZmVyfSAgICB2YWx1ZSAgICB0aGUgcHJpdmF0ZSBrZXlcclxuICAqIEBwYXJhbSAgIHtCdWZmZXJTb3VyY2V9ICAgIHZhbHVlICAgIGRhdGEgdG8gYmUgZGVjcnlwdGVkXHJcbiAgKiBAcmV0dXJuICB7VWludDhBcnJheX0gICBkZWNyeXB0ZWQgZGF0YVxyXG4gICovXHJcbiAgZGVjcnlwdFJTQShwcml2S2V5LCBkYXRhKSB7XHJcbiAgICBsb2cubG9nKCdkZWNyeXB0UlNBOnByaXZLZXknLCBwcml2S2V5KTtcclxuICAgIGxvZy5sb2coJ2RlY3J5cHRSU0E6ZGF0YScsIGRhdGEpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIF90aGlzLl9pbXBvcnRSU0FkZWNyeXB0S2V5KHByaXZLZXkpLnRoZW4oZnVuY3Rpb24ocHJpdmF0ZUtleSkge1xyXG5cclxuICAgICAgICBfdGhpcy5fY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnUlNBLU9BRVAnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcHJpdmF0ZUtleSwgLy9mcm9tIGdlbmVyYXRlS2V5IG9yIGltcG9ydEtleSBhYm92ZVxyXG4gICAgICAgICAgZGF0YSAvL0FycmF5QnVmZmVyIG9mIHRoZSBkYXRhXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGVjcnlwdGVkKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGVjcnlwdGVkRGF0YSA9IG5ldyBVaW50OEFycmF5KGRlY3J5cHRlZCk7XHJcblxyXG4gICAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tZGVjcnlwdFJTQScsIGRlY3J5cHRlZERhdGEpO1xyXG4gICAgICAgICAgICByZXNvbHZlKGRlY3J5cHRlZERhdGEpO1xyXG5cclxuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWRlY3J5cHRSU0EnLCBlcnIpO1xyXG4gICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUGVyZm9ybXMgYSBSU0Egc2lnblxyXG4gICogQHBhcmFtICAge0FycmF5QnVmZmVyfSAgICB2YWx1ZSAgICB0aGUgcHJpdmF0ZSBrZXlcclxuICAqIEBwYXJhbSAgIHtCdWZmZXJTb3VyY2V9ICAgIHZhbHVlICAgIGRhdGEgdG8gYmUgc2lnbmVkXHJcbiAgKiBAcmV0dXJuICB7VWludDhBcnJheX0gICBkYXRhIHNpZ25hdHVyZVxyXG4gICovXHJcbiAgc2lnblJTQShwcml2S2V5LCBkYXRhKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgX3RoaXMuX2ltcG9ydFJTQXNpZ25LZXkocHJpdktleSkudGhlbihmdW5jdGlvbihwcml2YXRlS2V5KSB7XHJcblxyXG4gICAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLnNpZ24oXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6ICdSU0FTU0EtUEtDUzEtdjFfNSdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwcml2YXRlS2V5LCAvL2Zyb20gZ2VuZXJhdGVLZXkgb3IgaW1wb3J0S2V5IGFib3ZlXHJcbiAgICAgICAgICBlbmNvZGVVVEY4KGRhdGEpIC8vQXJyYXlCdWZmZXIgb2YgZGF0YSB5b3Ugd2FudCB0byBzaWduXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24oc2lnbmF0dXJlKSB7XHJcbiAgICAgICAgICAvL3JldHVybnMgYW4gQXJyYXlCdWZmZXIgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlXHJcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tc2lnblJTQScsIG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSkpO1xyXG4gICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSkpO1xyXG5cclxuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLXNpZ25SU0EnLCBlcnIpO1xyXG4gICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFBlcmZvcm1zIGEgUlNBIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cclxuICAqIEBwYXJhbSAgIHtBcnJheUJ1ZmZlcn0gICAgdmFsdWUgICAgdGhlIHB1YmxpYyBrZXlcclxuICAqIEBwYXJhbSAgIHtCdWZmZXJTb3VyY2V9ICAgIHZhbHVlICAgIGRhdGEgdG8gYmUgdmVyaWZpZWRcclxuICAqIEByZXR1cm4gIHtCb29sZWFufSAgIHJlc3VsdCBvZiB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvblxyXG4gICovXHJcbiAgdmVyaWZ5UlNBKHB1YktleSwgZGF0YSwgc2lnbmF0dXJlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgX3RoaXMuX2ltcG9ydFJTQXZlcmlmeUtleShwdWJLZXkpLnRoZW4oZnVuY3Rpb24ocHVibGljS2V5KSB7XHJcblxyXG4gICAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLnZlcmlmeShcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ1JTQVNTQS1QS0NTMS12MV81J1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHB1YmxpY0tleSwgLy9mcm9tIGdlbmVyYXRlS2V5IG9yIGltcG9ydEtleSBhYm92ZVxyXG4gICAgICAgICAgc2lnbmF0dXJlLCAvL0FycmF5QnVmZmVyIG9mIHRoZSBzaWduYXR1cmVcclxuICAgICAgICAgIGVuY29kZVVURjgoZGF0YSkgLy9BcnJheUJ1ZmZlciBvZiB0aGUgZGF0YVxyXG4gICAgICAgIClcclxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGlzdmFsaWQpIHtcclxuICAgICAgICAgIC8vcmV0dXJucyBhIGJvb2xlYW4gb24gd2hldGhlciB0aGUgc2lnbmF0dXJlIGlzIHRydWUgb3Igbm90XHJcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tdmVyaWZ5UlNBJywgaXN2YWxpZCk7XHJcbiAgICAgICAgICAgIHJlc29sdmUoaXN2YWxpZCk7XHJcblxyXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tdmVyaWZ5UlNBJywgZXJyKTtcclxuICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBQZXJmb3JtcyBhIFJTQSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uXHJcbiAgKiBAcGFyYW0gICB7QXJyYXlCdWZmZXJ9ICAgIHZhbHVlICAgIHRoZSBwdWJsaWMga2V5XHJcbiAgKiBAcGFyYW0gICB7QnVmZmVyU291cmNlfSAgICB2YWx1ZSAgICBkYXRhIHRvIGJlIHZlcmlmaWVkXHJcbiAgKiBAcmV0dXJuICB7Qm9vbGVhbn0gICByZXN1bHQgb2YgdGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cclxuICAqL1xyXG4gIGVuY3J5cHRBRVMoa2V5LCBkYXRhLCBpdikge1xyXG4gICAgbG9nLmxvZygnZW5jcnlwdEFFUzprZXknLCBrZXkpO1xyXG4gICAgbG9nLmxvZygnZW5jcnlwdEFFUzpkYXRhJywgZGF0YSk7XHJcbiAgICBsb2cubG9nKCdlbmNyeXB0QUVTOml2JywgaXYpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIF90aGlzLl9pbXBvcnRBRVNrZXkoa2V5KS50aGVuKGZ1bmN0aW9uKGFlc0tleSkge1xyXG5cclxuICAgICAgICBfdGhpcy5fY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXHJcblxyXG4gICAgICAgICAgICAvL0Rvbid0IHJlLXVzZSBpbml0aWFsaXphdGlvbiB2ZWN0b3JzIVxyXG4gICAgICAgICAgICAvL0Fsd2F5cyBnZW5lcmF0ZSBhIG5ldyBpdiBldmVyeSB0aW1lIHlvdXIgZW5jcnlwdCFcclxuICAgICAgICAgICAgaXY6IGl2XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgYWVzS2V5LCAvL2Zyb20gZ2VuZXJhdGVLZXkgb3IgaW1wb3J0S2V5IGFib3ZlXHJcbiAgICAgICAgICBlbmNvZGVVVEY4KGRhdGEpIC8vQXJyYXlCdWZmZXIgb2YgZGF0YSB5b3Ugd2FudCB0byBlbmNyeXB0XHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZW5jcnlwdGVkKSB7XHJcbiAgICAgICAgICAvL3JldHVybnMgYW4gQXJyYXlCdWZmZXIgY29udGFpbmluZyB0aGUgZW5jcnlwdGVkIGRhdGFcclxuICAgICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1lbmNyeXB0QUVTJywgbmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XHJcbiAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XHJcblxyXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tZW5jcnlwdEFFUycsIGVycik7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGRlY3J5cHRBRVMoa2V5LCBkYXRhLCBpdikge1xyXG4gICAgbG9nLmxvZygnZGVjcnlwdEFFUzprZXknLCBrZXkpO1xyXG4gICAgbG9nLmxvZygnZGVjcnlwdEFFUzpkYXRhJywgZGF0YSk7XHJcbiAgICBsb2cubG9nKCdkZWNyeXB0QUVTOml2JywgaXYpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIF90aGlzLl9pbXBvcnRBRVNrZXkoa2V5KS50aGVuKGZ1bmN0aW9uKGFlc0tleSkge1xyXG5cclxuICAgICAgICBfdGhpcy5fY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXHJcbiAgICAgICAgICAgIGl2OiBpdlxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGFlc0tleSwgLy9mcm9tIGdlbmVyYXRlS2V5IG9yIGltcG9ydEtleSBhYm92ZVxyXG4gICAgICAgICAgZGF0YSAvL0FycmF5QnVmZmVyIG9mIHRoZSBkYXRhXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGVjcnlwdGVkKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGVjb2RlZERhdGEgPSBkZWNvZGVVVEY4KG5ldyBVaW50OEFycmF5KGRlY3J5cHRlZCkpO1xyXG4gICAgICAgICAgICBsb2cubG9nKCdjcnlwdG8tZGVjcnlwdEFFUycsIGRlY29kZWREYXRhKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShkZWNvZGVkRGF0YSk7XHJcblxyXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tZGVjcnlwdEFFUycsIGVycik7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogY3JlYXRlcyBhIGhhc2ggdXNpbmcgdGhlIEhNQUMgYWxnb3JpdGhtXHJcbiAgKiBAcGFyYW0gIHtieXRlQXJyYXl9ICAgIGtleSAgICAgICBrZXkgdG8gYmUgdXNlZCBpbiB0aGUgaG1hY1xyXG4gICogQHBhcmFtICB7c3RyaW5nfSAgICAgIGRhdGEgICAgICAgaW5mb3JtYXRpb24gdG8gYmUgaGFzaGVkXHJcbiAgKiBAcmV0dXJuICB7Ynl0ZUFycmF5fSAgIHNpZ25hdHVyZSAgcmVzdWx0aW5nIGhhc2hcclxuICAqL1xyXG4gIGhhc2hITUFDKGtleSwgZGF0YSkge1xyXG4gICAgbG9nLmxvZygnaGFzaEhNQUM6a2V5Jywga2V5KTtcclxuICAgIGxvZy5sb2coJ2hhc2hITUFDOmRhdGEnLCBkYXRhKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgaWYgKHR5cGVvZiBkYXRhICE9ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xyXG4gICAgICAgIGxvZy5sb2coJ0NvbnZlcnRpbmcgaGFzaEhNQUMgaW5wdXJlZCBEQVRBJyk7XHJcbiAgICAgICAgbG9nLmxvZygnSEhhc2hITUFDOicsIGRhdGEpO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgX3RoaXMuX2ltcG9ydEhNQUNrZXkoa2V5KS50aGVuKGZ1bmN0aW9uKGhtYWNLZXkpIHtcclxuXHJcbiAgICAgICAgX3RoaXMuX2NyeXB0by5zdWJ0bGUuc2lnbihcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ0hNQUMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgaG1hY0tleSwgLy9mcm9tIGdlbmVyYXRlS2V5IG9yIGltcG9ydEtleSBhYm92ZVxyXG4gICAgICAgICAgZW5jb2RlVVRGOChkYXRhKSAvL0FycmF5QnVmZmVyIG9mIGRhdGEgeW91IHdhbnQgdG8gc2lnblxyXG4gICAgICAgIClcclxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHNpZ25hdHVyZSkge1xyXG4gICAgICAgICAgICBsb2cubG9nKCdIYXNoSE1BQyBzaWduYXR1cmU6JywgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8taGFzaEhNQUMnLCBzaWduYXR1cmUpO1xyXG4gICAgICAgICAgICAvL3JldHVybnMgYW4gQXJyYXlCdWZmZXIgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlXHJcbiAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSk7XHJcblxyXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1oYXNoSE1BQycsIGVycik7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIHZlcmlmaWVzIGFuIGhhc2ggdXNpbmcgdGhlIEhNQUMgYWxnb3JpdGhtXHJcbiAgKiBAcGFyYW0gIHtieXRlQXJyYXl9ICAgIGtleSAgICAgICBrZXkgdG8gYmUgdXNlZCBpbiB0aGUgaG1hY1xyXG4gICogQHBhcmFtICB7c3RyaW5nfSAgICAgIGRhdGEgICAgICAgaW5mb3JtYXRpb24gdG8gYmUgaGFzaGVkIHRvIGNvbXBhcmVcclxuICAqIEBwYXJhbSAge2J5dGVBcnJheX0gIHNpZ25hdHVyZSAgIGhhc2ggdG8gY29tcGFyZSB3aXRoIHRoZSByZWNlaXZlZCBkYXRhXHJcbiAgKiBAcmV0dXJuICB7Ym9vbGVhbn0gICBpc3ZhbGlkICAgICBib29sZWFuIHNheWluZyBpZiB0aGUgZGF0YSBjb3JyZXNwb25kcyB0byB0aGUgaGFzaCByZWNlaXZlZFxyXG4gICovXHJcbiAgdmVyaWZ5SE1BQyhrZXksIGRhdGEsIHNpZ25hdHVyZSkge1xyXG4gICAgbG9nLmxvZygndmVyaWZ5SE1BQzprZXknLCBrZXkpO1xyXG4gICAgbG9nLmxvZygndmVyaWZ5SE1BQzpkYXRhJywgZGF0YSk7XHJcbiAgICBsb2cubG9nKCd2ZXJpZnlITUFDOnNpZ25hdHVyZScsIHNpZ25hdHVyZSk7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIF90aGlzLl9pbXBvcnRITUFDa2V5KGtleSkudGhlbihmdW5jdGlvbihobWFjS2V5KSB7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgZGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xyXG4gICAgICAgICAgbG9nLmxvZygnQ29udmVydGluZyB2ZXJpZnlITUFDIGlucHV0ZWQgREFUQTonLCBkYXRhKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLnZlcmlmeShcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogJ0hNQUMnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgaG1hY0tleSwgLy9mcm9tIGdlbmVyYXRlS2V5IG9yIGltcG9ydEtleSBhYm92ZVxyXG4gICAgICAgICAgc2lnbmF0dXJlLCAvL0FycmF5QnVmZmVyIG9mIHRoZSBzaWduYXR1cmVcclxuICAgICAgICAgIGVuY29kZVVURjgoZGF0YSkgLy9BcnJheUJ1ZmZlciBvZiB0aGUgZGF0YVxyXG4gICAgICAgIClcclxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGlzdmFsaWQpIHtcclxuICAgICAgICAgIC8vcmV0dXJucyBhIGJvb2xlYW4gb24gd2hldGhlciB0aGUgc2lnbmF0dXJlIGlzIHRydWUgb3Igbm90XHJcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tdmVyaWZ5SE1BQycsIGlzdmFsaWQpO1xyXG4gICAgICAgICAgICBsb2cubG9nKCd2ZXJpZnlITUFDIHJlc3VsdCcsIGlzdmFsaWQpO1xyXG4gICAgICAgICAgICAoaXN2YWxpZCkgPyByZXNvbHZlKGlzdmFsaWQpIDogcmVqZWN0KGlzdmFsaWQpO1xyXG5cclxuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ2NyeXB0by12ZXJpZnlITUFDJywgZXJyKTtcclxuICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZ2VuZXJhdGVzIGEgUlNBIHB1YmxpYy9wcml2YXRlIGtleSBwYWlyIHdpdGggYSBtb2R1bHVzIGxlbmd0aCBvZiAyMDQ4IGJpdHNcclxuICAqIEByZXR1cm4gIHtKU09OfSAgIGtleVBhaXIgICAganNvbiBjb250YWluaW5nIHRoZSBwdWJsaWMgYW5kIHByaXZhdGUga2V5c1xyXG4gICovXHJcbiAgZ2VuZXJhdGVSU0FLZXlQYWlyKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBrZXlQYWlyID0ge307XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBfdGhpcy5fY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleShcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnUlNBLVBTUycsXHJcbiAgICAgICAgICBtb2R1bHVzTGVuZ3RoOiAyMDQ4LCAvL2NhbiBiZSAxMDI0LCAyMDQ4LCBvciA0MDk2XHJcbiAgICAgICAgICBwdWJsaWNFeHBvbmVudDogbmV3IFVpbnQ4QXJyYXkoWzB4MDEsIDB4MDAsIDB4MDFdKSxcclxuICAgICAgICAgIGhhc2g6IHtuYW1lOiAnU0hBLTI1Nid9IC8vY2FuIGJlICdTSEEtMScsICdTSEEtMjU2JywgJ1NIQS0zODQnLCBvciAnU0hBLTUxMidcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRydWUsIC8vd2hldGhlciB0aGUga2V5IGlzIGV4dHJhY3RhYmxlIChpLmUuIGNhbiBiZSB1c2VkIGluIGV4cG9ydEtleSlcclxuICAgICAgICBbJ3NpZ24nLCAndmVyaWZ5J10gLy9jYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mICdzaWduJyBhbmQgJ3ZlcmlmeSdcclxuXHJcbiAgICAgICkudGhlbihmdW5jdGlvbihrZXkpIHtcclxuICAgICAgICAvL3JldHVybnMgYSBrZXlwYWlyIG9iamVjdFxyXG4gICAgICAgIC8vIGxvZy5sb2coa2V5KTtcclxuXHJcbiAgICAgICAgX3RoaXMuX2NyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KFxyXG4gICAgICAgICAgJ3Nwa2knLCAvL2NhbiBiZSAnandrJyAocHVibGljIG9yIHByaXZhdGUpLCAnc3BraScgKHB1YmxpYyBvbmx5KSwgb3IgJ3BrY3M4JyAocHJpdmF0ZSBvbmx5KVxyXG4gICAgICAgICAga2V5LnB1YmxpY0tleSAvL2NhbiBiZSBhIHB1YmxpY0tleSBvciBwcml2YXRlS2V5LCBhcyBsb25nIGFzIGV4dHJhY3RhYmxlIHdhcyB0cnVlXHJcbiAgICAgICAgKS50aGVuKGZ1bmN0aW9uKHB1YmxpY0tleSkge1xyXG4gICAgICAgICAgLy9yZXR1cm5zIHRoZSBleHBvcnRlZCBrZXkgZGF0YVxyXG4gICAgICAgICAga2V5UGFpci5wdWJsaWMgID0gbmV3IFVpbnQ4QXJyYXkocHVibGljS2V5KTtcclxuICAgICAgICAgIHJldHVybiBfdGhpcy5fY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoXHJcbiAgICAgICAgICAgICdwa2NzOCcsIC8vY2FuIGJlICdqd2snIChwdWJsaWMgb3IgcHJpdmF0ZSksICdzcGtpJyAocHVibGljIG9ubHkpLCBvciAncGtjczgnIChwcml2YXRlIG9ubHkpXHJcbiAgICAgICAgICAgIGtleS5wcml2YXRlS2V5IC8vY2FuIGJlIGEgcHVibGljS2V5IG9yIHByaXZhdGVLZXksIGFzIGxvbmcgYXMgZXh0cmFjdGFibGUgd2FzIHRydWVcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbihwcml2YXRlS2V5KSB7XHJcbiAgICAgICAgICBrZXlQYWlyLnByaXZhdGUgID0gbmV3IFVpbnQ4QXJyYXkocHJpdmF0ZUtleSk7XHJcblxyXG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWdlbmVyYXRlUlNBS2V5UGFpcicsIGtleVBhaXIpO1xyXG4gICAgICAgICAgcmVzb2x2ZShrZXlQYWlyKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICBsb2cuZXJyb3IoZXJyKTtcclxuICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgbG9nLmVycm9yKGVycik7XHJcbiAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEdlbmVyYXRlcyBhIDEyOCBiaXQgcmFuZG9tIHZhbHVlLlxyXG4gICogQHJldHVybiB7Ynl0ZUFycmF5fSAgYXJyYXkgICAgcmFuZG9tIHZhbHVlXHJcbiAgKi9cclxuICBnZW5lcmF0ZUlWKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgYXJyYXkgPSBuZXcgIFVpbnQ4QXJyYXkoMTYpO1xyXG4gICAgX3RoaXMuX2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xyXG5cclxuICAgIHJldHVybiBhcnJheTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogR2VuZXJhdGVzIGEgMjU2IGJpdCByYW5kb20gdmFsdWUuIDMyIGJpdHMgYXJlIGV4dHJhdGVkIGZyb20gdGhlIG1hY2hpbmUgdGltZSxcclxuICAqIHRoZSByZW1haW5pbmcgYXJlIGdlbmVyYXRlZCByYW5kb21seVxyXG4gICogQHJldHVybiB7Ynl0ZUFycmF5fSAgYXJyYXkgICAgcmFuZG9tIHZhbHVlXHJcbiAgKi9cclxuICBnZW5lcmF0ZVJhbmRvbSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGFycmF5ID0gbmV3ICBVaW50OEFycmF5KDMyKTtcclxuICAgIF90aGlzLl9jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcclxuXHJcbiAgICBsZXQgZGF0ZSA9IERhdGUubm93KCk7XHJcblxyXG4gICAgbGV0IGRhdGVFbmNvZGVkID0gZW5jb2RlVVRGOChkYXRlLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgIC8vZXh0cmFjdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNCBieXRlcyBpbiB0aGUgZGF0ZVxyXG4gICAgbGV0IGZpbmFsRGF0ZSA9IGRhdGVFbmNvZGVkLnNsaWNlKGRhdGVFbmNvZGVkLmxlbmd0aCAtIDQsIGRhdGVFbmNvZGVkLmxlbmd0aCk7XHJcblxyXG4gICAgLy8gYWRkIGluIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBhcnJheSB0aGUgYnl0ZXMgZXh0cmFjdGVkIHByZXZpb3VzbHk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykgeyBhcnJheVtpXSA9IGZpbmFsRGF0ZVtpXTsgfVxyXG4gICAgcmV0dXJuIGFycmF5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBnZW5lcmF0ZXMgYSBwcmVtYXN0ZXIgc2VjcmV0IChQTVMpIG9mIDQ4IGJ5dGVzICgzODQgYml0cykgcmFuZG9tbHlcclxuICAqIEByZXR1cm4ge2J5dGVBcnJheX0gIGFycmF5ICAgIHByZW1hc3RlciBzZWNyZXQga2V5XHJcbiAgKi9cclxuICBnZW5lcmF0ZVBNUygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoNDgpO1xyXG4gICAgX3RoaXMuX2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xyXG4gICAgcmV0dXJuIGFycmF5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBnZW5lcmF0ZXMgYSBtYXN0ZXJLZXkgc2VjcmV0IChQTVMpIG9mIDQ4IGJ5dGVzICgzODQgYml0cykgdXNpbmcgdGhlIHByZW1hc3RlciBzZWNyZXQgYW5kXHJcbiAgKiB0d28gcmFuZG9tc1xyXG4gICogQHJldHVybiB7Ynl0ZUFycmF5fSAgYXJyYXkgICAgbWFzdGVyIHNlY3JldCBrZXkgd2l0aCA0OCBieXRlc1xyXG4gICovXHJcbiAgZ2VuZXJhdGVNYXN0ZXJTZWNyZXQoaG1hY0tleSwgZGF0YSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIGxldCBrZXkgPSBuZXcgVWludDhBcnJheSg0OCk7XHJcbiAgICAgIGxldCBzZWVkID0gZGF0YTtcclxuXHJcbiAgICAgIF90aGlzLl9kaWdlc3QoaG1hY0tleSkudGhlbigoZGlnZXN0ZWRLZXkpID0+IHtcclxuXHJcbiAgICAgICAgX3RoaXMuaGFzaEhNQUMoZGlnZXN0ZWRLZXksIHNlZWQpLnRoZW4oZnVuY3Rpb24oa2V5cGFydDApIHtcclxuXHJcbiAgICAgICAgICAvL2NvcHkgdGhlIGZpcnN0IDMyIGJ5dGVzIGludG8gdGhlIGtleVxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7IGtleVtpXSA9IGtleXBhcnQwW2ldOyB9XHJcbiAgICAgICAgICByZXR1cm4gX3RoaXMuaGFzaEhNQUMoZGlnZXN0ZWRLZXksIHNlZWQgKyBrZXlwYXJ0MCk7XHJcblxyXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oa2V5cGFydDEpIHtcclxuXHJcbiAgICAgICAgICAvL2NvcHkgdGhlIGZpcnN0IDE2IGJ5dGVzIHRvIHRoZSBrZXkgcmVtYWluaW5nIDE2IGJ5dGVzXHJcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHsga2V5W2kgKyAzMl0gPSBrZXlwYXJ0MVtpXTsgfVxyXG5cclxuICAgICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1nZW5lcmF0ZU1hc3RlclNlY3JldCcsIGtleSk7XHJcbiAgICAgICAgICByZXNvbHZlKGtleSk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWdlbmVyYXRlTWFzdGVyU2VjcmV0JywgZXJyKTtcclxuICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZ2VuZXJhdGVzIGJvdGggdXNlcnMgTUFDIGFuZCBlbmNyeXB0aW9uIGtleXMuIGdlbmVyYXRlIGFzIG91dHB1dCBhbiBhcnJheVxyXG4gICogd2l0aCA0IGJ5dGVBcnJheSBlYWNoIHdpdGggMzIgYnl0ZXNcclxuICAqIEBwYXJhbSAge2J5dGVBcnJheX0gICAgICAgIHNlY3JldCAgICAgICBzZWNyZXQgdG8gYmUgdXNlZCBpbiB0aGUgSE1BQyBmdW5jdGlvblxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZGF0YSAgICAgICAgIGluZm9ybWF0aW9uIHRvIGJlIHVzZWQgYXMgc2VlZFxyXG4gICogQHJldHVybiB7QXJyYXk8Ynl0ZUFycmF5Pn0ga2V5ICAgICAgICAgIGFycmF5IHdpdGggdGhlIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGtleXNcclxuICAqL1xyXG4gIGdlbmVyYXRlS2V5cyhobWFjS2V5LCBkYXRhKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGxldCBrZXkgPSBbXTtcclxuICAgICAgbGV0IHNlZWQgPSBkYXRhO1xyXG5cclxuICAgICAgLy8gaXRlcmF0ZSA0IHRpbWVzIHRvIG9idGFpbiBhIDEwMjQga2V5IHNpemVcclxuICAgICAgX3RoaXMuaGFzaEhNQUMoaG1hY0tleSwgc2VlZCkudGhlbihmdW5jdGlvbihrZXlwYXJ0MCkge1xyXG4gICAgICAgIGtleS5wdXNoKGtleXBhcnQwKTtcclxuICAgICAgICByZXR1cm4gX3RoaXMuaGFzaEhNQUMoaG1hY0tleSwgc2VlZCArIGtleXBhcnQwKTtcclxuXHJcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24oa2V5cGFydDEpIHtcclxuICAgICAgICBrZXkucHVzaChrZXlwYXJ0MSk7XHJcbiAgICAgICAgcmV0dXJuIF90aGlzLmhhc2hITUFDKGhtYWNLZXksIHNlZWQgKyBrZXlwYXJ0MSk7XHJcblxyXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uKGtleXBhcnQyKSB7XHJcbiAgICAgICAga2V5LnB1c2goa2V5cGFydDIpO1xyXG4gICAgICAgIHJldHVybiBfdGhpcy5oYXNoSE1BQyhobWFjS2V5LCBzZWVkICsga2V5cGFydDIpO1xyXG5cclxuICAgICAgfSkudGhlbihmdW5jdGlvbihrZXlwYXJ0Mykge1xyXG4gICAgICAgIGtleS5wdXNoKGtleXBhcnQzKTtcclxuXHJcbiAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWdlbmVyYXRlS2V5cycsIGtleSk7XHJcbiAgICAgICAgcmVzb2x2ZShrZXkpO1xyXG5cclxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWdlbmVyYXRlS2V5cycsIGVycik7XHJcbiAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gbG9nLmxvZyhobWFjS2V5LCBkYXRhKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2ltcG9ydFJTQXNpZ25LZXkocHJpdktleSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLmltcG9ydEtleShcclxuICAgICAgICAncGtjczgnLCAvL2NhbiBiZSAnandrJyAocHVibGljIG9yIHByaXZhdGUpLCAnc3BraScgKHB1YmxpYyBvbmx5KSwgb3IgJ3BrY3M4JyAocHJpdmF0ZSBvbmx5KVxyXG4gICAgICAgIHByaXZLZXksXHJcbiAgICAgICAgeyAgIC8vdGhlc2UgYXJlIHRoZSBhbGdvcml0aG0gb3B0aW9uc1xyXG4gICAgICAgICAgbmFtZTogJ1JTQVNTQS1QS0NTMS12MV81JyxcclxuICAgICAgICAgIGhhc2g6IHtuYW1lOiAnU0hBLTI1Nid9IC8vY2FuIGJlICdTSEEtMScsICdTSEEtMjU2JywgJ1NIQS0zODQnLCBvciAnU0hBLTUxMidcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRydWUsIC8vd2hldGhlciB0aGUga2V5IGlzIGV4dHJhY3RhYmxlIChpLmUuIGNhbiBiZSB1c2VkIGluIGV4cG9ydEtleSlcclxuICAgICAgICBbJ3NpZ24nXSAvLyd2ZXJpZnknIGZvciBwdWJsaWMga2V5IGltcG9ydCwgJ3NpZ24nIGZvciBwcml2YXRlIGtleSBpbXBvcnRzXHJcbiAgICAgIClcclxuICAgICAgICAudGhlbihmdW5jdGlvbihwcml2YXRlS2V5KSB7XHJcbiAgICAgICAgLy9yZXR1cm5zIGEgcHVibGljS2V5IChvciBwcml2YXRlS2V5IGlmIHlvdSBhcmUgaW1wb3J0aW5nIGEgcHJpdmF0ZSBrZXkpXHJcbiAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLV9pbXBvcnRSU0FzaWduS2V5JywgcHJpdmF0ZUtleSk7XHJcbiAgICAgICAgICByZXNvbHZlKHByaXZhdGVLZXkpO1xyXG5cclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgIGxvZy5lcnJvcignY3J5cHRvLV9pbXBvcnRSU0FzaWduS2V5JywgZXJyKTtcclxuICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfaW1wb3J0UlNBdmVyaWZ5S2V5KHB1YktleSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLmltcG9ydEtleShcclxuICAgICAgICAnc3BraScsIC8vY2FuIGJlICdqd2snIChwdWJsaWMgb3IgcHJpdmF0ZSksICdzcGtpJyAocHVibGljIG9ubHkpLCBvciAncGtjczgnIChwcml2YXRlIG9ubHkpXHJcbiAgICAgICAgcHViS2V5LFxyXG4gICAgICAgIHsgICAvL3RoZXNlIGFyZSB0aGUgYWxnb3JpdGhtIG9wdGlvbnNcclxuICAgICAgICAgIG5hbWU6ICdSU0FTU0EtUEtDUzEtdjFfNScsXHJcbiAgICAgICAgICBoYXNoOiB7bmFtZTogJ1NIQS0yNTYnfSAvL2NhbiBiZSAnU0hBLTEnLCAnU0hBLTI1NicsICdTSEEtMzg0Jywgb3IgJ1NIQS01MTInXHJcbiAgICAgICAgfSxcclxuICAgICAgICB0cnVlLCAvL3doZXRoZXIgdGhlIGtleSBpcyBleHRyYWN0YWJsZSAoaS5lLiBjYW4gYmUgdXNlZCBpbiBleHBvcnRLZXkpXHJcbiAgICAgICAgWyd2ZXJpZnknXSAvLyd2ZXJpZnknIGZvciBwdWJsaWMga2V5IGltcG9ydCwgJ3NpZ24nIGZvciBwcml2YXRlIGtleSBpbXBvcnRzXHJcbiAgICAgIClcclxuICAgICAgICAudGhlbihmdW5jdGlvbihwdWJsaWNLZXkpIHtcclxuICAgICAgICAvL3JldHVybnMgYSBwdWJsaWNLZXkgKG9yIHByaXZhdGVLZXkgaWYgeW91IGFyZSBpbXBvcnRpbmcgYSBwcml2YXRlIGtleSlcclxuICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tX2ltcG9ydFJTQXZlcmlmeUtleScsIHB1YmxpY0tleSk7XHJcbiAgICAgICAgICByZXNvbHZlKHB1YmxpY0tleSk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdjcnlwdG8tX2ltcG9ydFJTQXZlcmlmeUtleScsIGVycik7XHJcbiAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2ltcG9ydFJTQWVuY3J5cHRLZXkocHViS2V5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgX3RoaXMuX2NyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxyXG4gICAgICAgICdzcGtpJywgLy9jYW4gYmUgJ2p3aycgKHB1YmxpYyBvciBwcml2YXRlKSwgJ3Nwa2knIChwdWJsaWMgb25seSksIG9yICdwa2NzOCcgKHByaXZhdGUgb25seSlcclxuICAgICAgICBwdWJLZXksXHJcbiAgICAgICAgeyAgIC8vdGhlc2UgYXJlIHRoZSBhbGdvcml0aG0gb3B0aW9uc1xyXG4gICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcclxuICAgICAgICAgIGhhc2g6IHtuYW1lOiAnU0hBLTI1Nid9IC8vY2FuIGJlICdTSEEtMScsICdTSEEtMjU2JywgJ1NIQS0zODQnLCBvciAnU0hBLTUxMidcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRydWUsIC8vd2hldGhlciB0aGUga2V5IGlzIGV4dHJhY3RhYmxlIChpLmUuIGNhbiBiZSB1c2VkIGluIGV4cG9ydEtleSlcclxuICAgICAgICBbJ2VuY3J5cHQnXSAvLydlbmNyeXB0JyBvciAnd3JhcEtleScgZm9yIHB1YmxpYyBrZXkgaW1wb3J0IG9yXHJcbiAgICAgICAgLy8nZGVjcnlwdCcgb3IgJ3Vud3JhcEtleScgZm9yIHByaXZhdGUga2V5IGltcG9ydHNcclxuICAgICAgKVxyXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKHB1YmxpY0tleSkge1xyXG4gICAgICAgIC8vcmV0dXJucyBhIHB1YmxpY0tleSAob3IgcHJpdmF0ZUtleSBpZiB5b3UgYXJlIGltcG9ydGluZyBhIHByaXZhdGUga2V5KVxyXG4gICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1faW1wb3J0UlNBZW5jcnlwdEtleScsIHB1YmxpY0tleSk7XHJcbiAgICAgICAgICByZXNvbHZlKHB1YmxpY0tleSk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdjcnlwdG8tX2ltcG9ydFJTQWVuY3J5cHRLZXknLCBlcnIubmFtZSk7XHJcbiAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2ltcG9ydFJTQWRlY3J5cHRLZXkocHJpdktleSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLmltcG9ydEtleShcclxuICAgICAgICAncGtjczgnLCAvL2NhbiBiZSAnandrJyAocHVibGljIG9yIHByaXZhdGUpLCAnc3BraScgKHB1YmxpYyBvbmx5KSwgb3IgJ3BrY3M4JyAocHJpdmF0ZSBvbmx5KVxyXG4gICAgICAgIHByaXZLZXksXHJcbiAgICAgICAgeyAgIC8vdGhlc2UgYXJlIHRoZSBhbGdvcml0aG0gb3B0aW9uc1xyXG4gICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcclxuICAgICAgICAgIGhhc2g6IHtuYW1lOiAnU0hBLTI1Nid9IC8vY2FuIGJlICdTSEEtMScsICdTSEEtMjU2JywgJ1NIQS0zODQnLCBvciAnU0hBLTUxMidcclxuICAgICAgICB9LFxyXG4gICAgICAgIHRydWUsIC8vd2hldGhlciB0aGUga2V5IGlzIGV4dHJhY3RhYmxlIChpLmUuIGNhbiBiZSB1c2VkIGluIGV4cG9ydEtleSlcclxuICAgICAgICBbJ2RlY3J5cHQnXSAvLydlbmNyeXB0JyBvciAnd3JhcEtleScgZm9yIHB1YmxpYyBrZXkgaW1wb3J0IG9yXHJcbiAgICAgICAgLy8nZGVjcnlwdCcgb3IgJ3Vud3JhcEtleScgZm9yIHByaXZhdGUga2V5IGltcG9ydHNcclxuICAgICAgKVxyXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKHByaXZhdGVLZXkpIHtcclxuICAgICAgICAvL3JldHVybnMgYSBwdWJsaWNLZXkgKG9yIHByaXZhdGVLZXkgaWYgeW91IGFyZSBpbXBvcnRpbmcgYSBwcml2YXRlIGtleSlcclxuICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tX2ltcG9ydFJTQWRlY3J5cHRLZXknLCBwcml2YXRlS2V5KTtcclxuICAgICAgICAgIHJlc29sdmUocHJpdmF0ZUtleSk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdjcnlwdG8tX2ltcG9ydFJTQWRlY3J5cHRLZXknLCBlcnIpO1xyXG4gICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNvbmNhdFBNU3dpdGhSYW5kb21zKHBtcywgdG9SYW5kb20sIGZyb21SYW5kb20pIHtcclxuXHJcbiAgICBsZXQgZmluYWxLZXkgPSBuZXcgVWludDhBcnJheShwbXMubGVuZ3RoICsgdG9SYW5kb20ubGVuZ3RoICsgZnJvbVJhbmRvbS5sZW5ndGgpO1xyXG5cclxuICAgIC8vIGFkZCBQcmVtYXN0ZXJLZXlcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGZpbmFsS2V5W2ldID0gcG1zW2ldO1xyXG4gICAgfVxyXG5cclxuICAgIC8vYWRkIHRvIHJhbmRvbVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b1JhbmRvbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmaW5hbEtleVtpICsgcG1zLmxlbmd0aF0gPSBwbXNbaV07XHJcbiAgICB9XHJcblxyXG4gICAgLy9hZGQgZnJvbSByYW5kb21cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnJvbVJhbmRvbS5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmaW5hbEtleVtpICsgcG1zLmxlbmd0aCArIHRvUmFuZG9tLmxlbmd0aF0gPSBwbXNbaV07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZpbmFsS2V5O1xyXG4gIH1cclxuXHJcbiAgX2dlbmVyYXRlMjU2Yml0S2V5KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhcnJheSA9IG5ldyAgVWludDhBcnJheSgzMik7XHJcbiAgICBfdGhpcy5fY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhhcnJheSk7XHJcblxyXG4gICAgcmV0dXJuIGFycmF5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBpbXBvcnRzIHRoZSBzZWNyZXQgdG8gdGhlIEhNQUMgZnVuY3Rpb25cclxuICAqIEBwYXJhbSAge2J5dGVBcnJheX0gICBhcnJheUJ1ZmZlciAgICAgYnl0ZXMgdG8gaW1wb3J0IGFzIGtleVxyXG4gICogQHJldHVybiB7SlNPTn0gICAgICAga2V5ICAgICAgICAgICAgICBrZXkgcmVhZHkgdG8gYmUgdXNlZCBpbiB0aGUgSE1BQyBjcnlwdG9ncmFwaGljIGZ1bmN0aW9uXHJcbiAgKi9cclxuICBfaW1wb3J0SE1BQ2tleShhcnJheUJ1ZmZlcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBfdGhpcy5fZGlnZXN0KGFycmF5QnVmZmVyKS50aGVuKChrZXkpID0+IHtcclxuXHJcbiAgICAgICAgX3RoaXMuX2NyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxyXG4gICAgICAgICAgJ3JhdycsIC8vY2FuIGJlICdqd2snIG9yICdyYXcnXHJcbiAgICAgICAgICBrZXksXHJcbiAgICAgICAgICB7ICAgLy90aGlzIGlzIHRoZSBhbGdvcml0aG0gb3B0aW9uc1xyXG4gICAgICAgICAgICBuYW1lOiAnSE1BQycsXHJcbiAgICAgICAgICAgIGhhc2g6IHtuYW1lOiAnU0hBLTI1Nid9LCAvL2NhbiBiZSAnU0hBLTEnLCAnU0hBLTI1NicsICdTSEEtMzg0Jywgb3IgJ1NIQS01MTInXHJcbiAgICAgICAgICAgIGxlbmd0aDogMjU2IC8vb3B0aW9uYWwsIGlmIHlvdSB3YW50IHlvdXIga2V5IGxlbmd0aCB0byBkaWZmZXIgZnJvbSB0aGUgaGFzaCBmdW5jdGlvbidzIGJsb2NrIGxlbmd0aFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRydWUsIC8vd2hldGhlciB0aGUga2V5IGlzIGV4dHJhY3RhYmxlIChpLmUuIGNhbiBiZSB1c2VkIGluIGV4cG9ydEtleSlcclxuICAgICAgICAgIFsnc2lnbicsICd2ZXJpZnknXSAvL2NhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgJ3NpZ24nIGFuZCAndmVyaWZ5J1xyXG4gICAgICAgICkudGhlbihmdW5jdGlvbihrZXkpIHtcclxuICAgICAgICAgIC8vcmV0dXJucyB0aGUgc3ltbWV0cmljIGtleVxyXG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLV9pbXBvcnRITUFDa2V5Jywga2V5KTtcclxuICAgICAgICAgIHJlc29sdmUoa2V5KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2RpZ2VzdCh2YWx1ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLmRpZ2VzdChcclxuICAgICAgICB7XHJcbiAgICAgICAgICBuYW1lOiAnU0hBLTI1NidcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZhbHVlIC8vVGhlIGRhdGEgeW91IHdhbnQgdG8gaGFzaCBhcyBhbiBBcnJheUJ1ZmZlclxyXG4gICAgICApXHJcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oaGFzaCkge1xyXG4gICAgICAgIC8vcmV0dXJucyB0aGUgaGFzaCBhcyBhbiBBcnJheUJ1ZmZlclxyXG4gICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1kaWdlc3QnLCBuZXcgVWludDhBcnJheShoYXNoKSk7XHJcbiAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KGhhc2gpKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgIGxvZy5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfaW1wb3J0QUVTa2V5KGFycmF5QnVmZmVyKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBfdGhpcy5fY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXHJcbiAgICAgICAgJ3JhdycsIC8vY2FuIGJlICdqd2snIG9yICdyYXcnXHJcbiAgICAgICAgYXJyYXlCdWZmZXIsXHJcbiAgICAgICAgeyAgIC8vdGhpcyBpcyB0aGUgYWxnb3JpdGhtIG9wdGlvbnNcclxuICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdHJ1ZSwgLy93aGV0aGVyIHRoZSBrZXkgaXMgZXh0cmFjdGFibGUgKGkuZS4gY2FuIGJlIHVzZWQgaW4gZXhwb3J0S2V5KVxyXG4gICAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10gLy9jYW4gYmUgJ2VuY3J5cHQnLCAnZGVjcnlwdCcsICd3cmFwS2V5Jywgb3IgJ3Vud3JhcEtleSdcclxuICAgICAgKVxyXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGtleSkge1xyXG4gICAgICAgIC8vcmV0dXJucyB0aGUgc3ltbWV0cmljIGtleVxyXG4gICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1pbXBvcnRBRVNrZXknLCBrZXkpO1xyXG4gICAgICAgICAgcmVzb2x2ZShrZXkpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdjcnlwdG8taW1wb3J0QUVTa2V5JywgZXJyKTtcclxuICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfc2hhMjU2KHN0cikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBidWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoJ3V0Zi04JykuZW5jb2RlKHN0cik7XHJcbiAgICByZXR1cm4gX3RoaXMuX2NyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgYnVmZmVyKS50aGVuKGZ1bmN0aW9uKGhhc2gpIHtcclxuICAgICAgcmV0dXJuIF90aGlzLl9oZXgoaGFzaCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9oZXgoYnVmZmVyKSB7XHJcbiAgICBsZXQgaGV4Q29kZXMgPSBbXTtcclxuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcik7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZXcuYnl0ZUxlbmd0aDsgaSArPSA0KSB7XHJcbiAgICAgIC8vIFVzaW5nIGdldFVpbnQzMiByZWR1Y2VzIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBuZWVkZWQgKHdlIHByb2Nlc3MgNCBieXRlcyBlYWNoIHRpbWUpXHJcbiAgICAgIGxldCB2YWx1ZSA9IHZpZXcuZ2V0VWludDMyKGkpXHJcblxyXG4gICAgICBsZXQgc3RyaW5nVmFsdWUgPSB2YWx1ZS50b1N0cmluZygxNilcclxuXHJcbiAgICAgIGxldCBwYWRkaW5nID0gJzAwMDAwMDAwJ1xyXG4gICAgICBsZXQgcGFkZGVkVmFsdWUgPSAocGFkZGluZyArIHN0cmluZ1ZhbHVlKS5zbGljZSgtcGFkZGluZy5sZW5ndGgpXHJcbiAgICAgIGhleENvZGVzLnB1c2gocGFkZGVkVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEpvaW4gYWxsIHRoZSBoZXggc3RyaW5ncyBpbnRvIG9uZVxyXG4gICAgcmV0dXJuIGhleENvZGVzLmpvaW4oJycpO1xyXG4gIH1cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDcnlwdG87XHJcbiIsIi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0NyeXB0b01hbmFnZXInKTtcclxuXHJcbmltcG9ydCB7ZGl2aWRlVVJMLCBpc0RhdGFPYmplY3RVUkwsIGlzTGVnYWN5LCBjaGF0a2V5c1RvU3RyaW5nQ2xvbmVyLCBjaGF0a2V5c1RvQXJyYXlDbG9uZXIsIHBhcnNlTWVzc2FnZVVSTCxcclxuICBwYXJzZSwgc3RyaW5naWZ5LCBlbmNvZGUsIGRlY29kZSwgZGVjb2RlVG9VaW50OEFycmF5LCBwYXJzZVRvVWludDhBcnJheSwgZ2VuZXJhdGVHVUlEfSBmcm9tICcuLi91dGlscy91dGlscy5qcyc7XHJcbmltcG9ydCBDcnlwdG8gZnJvbSAnLi9DcnlwdG8nO1xyXG5cclxuLyoqXHJcbiogIFRoZSBDcnlwdG8gTWFuYWdlciBwcm92aWRlcyBtYW5hZ2VzIGNyeXB0b2dyYXBoaWMgZmVhdHVyZXMgZm9yIHRoZSBydW50aW1lIGluY2x1ZGluZzpcclxuKiAgLSBNdXR1YWwgQXV0aGVudGljYXRpb24gYmV0d2VlbiBwZWVyc1xyXG4qICAtIENyeXB0byBLZXlzXHJcbiogIC0gZTJlIGVuY3J5cHRpb24gYW5kIGRlY3JpcHRpb24gb2YgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIEh5cGVydGllcyBhbmQgZHRhIG9iamVjdHNcclxuKlxyXG4qL1xyXG5jbGFzcyBDcnlwdG9NYW5hZ2VyIHtcclxuXHJcbiAgLyoqXHJcbiAgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciB0byBpbml0aWFsaXNlIHRoZSBDcnlwdG9NYW5hZ2VyLCBpdCBkb2VzIG5vdCByZXF1aXJlIGFueSBpbnB1dC5cclxuICAqIFRoZSBpbml0KCkgbXVzdCBjYWxsZWQgaW4gb3JkZXIgdG8gc2V0IG1hbmRhdG9yaWVzIGF0dHJpYnV0ZXNcclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3RvcihzdG9yYWdlTWFuYWdlcikge1xyXG4gICAgdGhpcy5zdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VyO1xyXG4gICAgdGhpcy51c2VyRGVmYXVsdEtleVJlZiA9ICd1c2VyQXN5bW1ldHJpY0tleSc7XHJcbiAgfVxyXG5cclxuICBpbml0KHJ1bnRpbWVVUkwsIHJ1bnRpbWVDYXBhYmlsaXRpZXMsIHN0b3JhZ2VNYW5hZ2VyLCBkYXRhT2JqZWN0c1N0b3JhZ2UsIHJlZ2lzdHJ5LCBjb3JlRGlzY292ZXJ5LCBpZG0sIHJ1bnRpbWVGYWN0b3J5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmICghcnVudGltZVVSTCkgdGhyb3cgbmV3IEVycm9yKCdbXSBydW50aW1lVVJMIGlzIG1pc3NpbmcuJyk7XHJcbiAgICBpZiAoIXN0b3JhZ2VNYW5hZ2VyKSB0aHJvdyBuZXcgRXJyb3IoJ3N0b3JhZ2VNYW5hZ2VyIGlzIG1pc3NpbmcnKTtcclxuICAgIGlmICghcnVudGltZUZhY3RvcnkpIHRocm93IG5ldyBFcnJvcigncnVudGltZUZhY3RvcnkgaXMgbWlzc2luZycpO1xyXG5cclxuICAgIF90aGlzLl9ydW50aW1lVVJMID0gcnVudGltZVVSTDtcclxuICAgIF90aGlzLl9jcnlwdG9NYW5hZ2VyVVJMID0gX3RoaXMuX3J1bnRpbWVVUkwgKyAnL2NyeXB0b01hbmFnZXInO1xyXG5cclxuICAgIC8vX3RoaXMuX215VVJMID0gX3RoaXMuX3J1bnRpbWVVUkwgKyAnL2NyeXB0byc7XHJcbiAgICBfdGhpcy5zdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VyO1xyXG4gICAgX3RoaXMuZGF0YU9iamVjdHNTdG9yYWdlID0gZGF0YU9iamVjdHNTdG9yYWdlO1xyXG4gICAgX3RoaXMucnVudGltZUNhcGFiaWxpdGllcyA9IHJ1bnRpbWVDYXBhYmlsaXRpZXM7XHJcblxyXG4gICAgX3RoaXMuX3J1bnRpbWVGYWN0b3J5ID0gcnVudGltZUZhY3Rvcnk7XHJcbiAgICBfdGhpcy5fZG9tYWluID0gZGl2aWRlVVJMKF90aGlzLl9ydW50aW1lVVJMKS5kb21haW47XHJcblxyXG4gICAgX3RoaXMuY3J5cHRvID0gbmV3IENyeXB0byhfdGhpcy5fcnVudGltZUZhY3RvcnkpO1xyXG5cclxuICAgIC8vIGhhc2hUYWJsZSB0byBzdG9yZSBhbGwgdGhlIGNyeXB0byBpbmZvcm1hdGlvbiBiZXR3ZWVuIHR3byBoeXBlcnRpZXNcclxuICAgIF90aGlzLmNoYXRLZXlzID0ge307XHJcblxyXG4gICAgLy8gaGFzaFRhYmxlIHRvIHN0b3JlIHRoZSBzeW1tZXRyaWMga2V5cyB0byBiZSB1c2VkIGluIHRoZSBjaGF0IGdyb3VwXHJcbiAgICBfdGhpcy5kYXRhT2JqZWN0U2Vzc2lvbktleXMgPSB7fTtcclxuXHJcbiAgICAvL2ZhaWxzYWZlIHRvIGVuYWJsZS9kaXNhYmxlIGFsbCB0aGUgY3JpcHRvZ3JhcGhpYyBmdW5jdGlvbnNcclxuICAgIF90aGlzLmlzVG9Vc2VFbmNyeXB0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICBfdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcclxuICAgIF90aGlzLl9jb3JlRGlzY292ZXJ5ID0gY29yZURpc2NvdmVyeTtcclxuXHJcbiAgICBfdGhpcy5faWRtID0gaWRtO1xyXG5cclxuICB9XHJcblxyXG4gIC8vKioqKioqKioqKioqKioqKioqKiBHRVQgQU5EIFNFVCBNRVRIT0RTICoqKioqKioqKioqKioqKioqKipcclxuXHJcbiAgLyoqXHJcbiAgKiByZXR1cm4gdGhlIG1lc3NhZ2VCdXMgaW4gdGhpcyBSZWdpc3RyeVxyXG4gICogQHBhcmFtIHtNZXNzYWdlQnVzfSAgICAgICAgICAgbWVzc2FnZUJ1c1xyXG4gICovXHJcbiAgZ2V0IG1lc3NhZ2VCdXMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9tZXNzYWdlQnVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBTZXQgdGhlIG1lc3NhZ2VCdXMgaW4gdGhpcyBSZWdpc3RyeVxyXG4gICogQHBhcmFtIHtNZXNzYWdlQnVzfSAgICAgICAgICAgbWVzc2FnZUJ1c1xyXG4gICovXHJcbiAgc2V0IG1lc3NhZ2VCdXMobWVzc2FnZUJ1cykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcclxuXHJcbiAgICBfdGhpcy5hZGRDcnlwdG9HVUlMaXN0ZW5lcnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogcmV0dXJuIHRoZSBjb3JlRGlzY292ZXJ5IGNvbXBvbmVudFxyXG4gICovXHJcbiAgZ2V0IGNvcmVEaXNjb3ZlcnkoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9jb3JlRGlzY292ZXJ5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiByZXR1cm4gdXNlcidzIHB1YmxpYyBrZXlcclxuICAqL1xyXG5cclxuICAvKiAgZ2V0TXlQdWJsaWNLZXkoKSB7XHJcbiAgICAvLyB0byBiZSBpbXBsZW1lbnRlZFxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PiB7XHJcbiAgICAgIHJlc29sdmUoJ215cHVibGlja2V5Jyk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG4qL1xyXG4gIC8qKlxyXG4gICogU2V0IHRoZSBjb3JlRGlzY292ZXJ5IGNvbXBvbmVudFxyXG4gICogQHBhcmFtIHtjb3JlRGlzY292ZXJ5fSBjb3JlRGlzY292ZXJ5XHJcbiAgKi9cclxuICBzZXQgY29yZURpc2NvdmVyeShjb3JlRGlzY292ZXJ5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX2NvcmVEaXNjb3ZlcnkgPSBjb3JlRGlzY292ZXJ5O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiByZXR1cm4gdGhlIHJlZ2lzdHJ5IGluIHRoaXMgaWRNb2R1bGVcclxuICAqIEBwYXJhbSB7cmVnaXN0cnl9ICAgICAgICAgICByZWdpc3RyeVxyXG4gICovXHJcbiAgZ2V0IHJlZ2lzdHJ5KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fcmVnaXN0cnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNldCB0aGUgcmVnaXN0cnkgaW4gdGhpcyBpZE1vZHVsZVxyXG4gICogQHBhcmFtIHtyZWdpc3RyeX0gICAgIHJlZ1xyXG4gICovXHJcbiAgc2V0IHJlZ2lzdHJ5KHJlZ2lzdHJ5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX3JlZ2lzdHJ5ID0gcmVnaXN0cnk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gdG8gYmUgdXNlZCB0byBpbml0aWFsaXNlIElETSB3aXRoIFNlc3Npb25LZXlzIHVzZWQgaW4gcHJldmlvdXMgc2Vzc2lvblxyXG5cclxuICBsb2FkU2Vzc2lvbktleXMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcblxyXG4gICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5nZXQoJ2RhdGFPYmplY3RTZXNzaW9uS2V5cycpLnRoZW4oKHNlc3Npb25LZXlzKSA9PiB7XHJcbiAgICAgICAgaWYgKHNlc3Npb25LZXlzKSBfdGhpcy5kYXRhT2JqZWN0U2Vzc2lvbktleXMgPSBzZXNzaW9uS2V5cztcclxuICAgICAgICBlbHNlIF90aGlzLmRhdGFPYmplY3RTZXNzaW9uS2V5cyA9IHt9O1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9pc0Zyb21SZW1vdGVTTShmcm9tKSB7XHJcbiAgICBsZXQgc3BsaXRGcm9tID0gZnJvbS5zcGxpdCgnOi8vJyk7XHJcbiAgICByZXR1cm4gc3BsaXRGcm9tWzBdID09PSAncnVudGltZScgJiYgZnJvbSAhPT0gdGhpcy5fcnVudGltZVVSTCArICcvc20nO1xyXG4gIH1cclxuXHJcbiAgYWRkQ3J5cHRvR1VJTGlzdGVuZXJzKCkge1xyXG4gICAgLy9UT0RPOiBDaGFuZ2UgdGhlIEdVSSBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF90aGlzLl9jcnlwdG9NYW5hZ2VyVVJMLCAobXNnKSA9PiB7XHJcbiAgICAgIGxldCBmdW5jTmFtZSA9IG1zZy5ib2R5Lm1ldGhvZDtcclxuXHJcbiAgICAgIC8vbGV0IHJldHVybmVkVmFsdWU7XHJcbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gJ2dlbmVyYXRlUlNBS2V5UGFpcicpIHtcclxuICAgICAgICBfdGhpcy5fY3J5cHRvLmdldE15UHVibGljS2V5KCkudGhlbigoa2V5KSA9PiB7XHJcbiAgICAgICAgICBsZXQgdmFsdWUgPSB7dHlwZTogJ2V4ZWN1dGUnLCB2YWx1ZToga2V5LCBjb2RlOiAyMDB9O1xyXG4gICAgICAgICAgbGV0IHJlcGx5TXNnID0ge2lkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIHRvOiBtc2cuZnJvbSwgZnJvbTogbXNnLnRvLCBib2R5OiB2YWx1ZX07XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZnJvbSBpZiBnZW5lcmF0ZVJTQUtleVBhaXIgbWV0aG9kIHBvc3RNZXNzYWdlIGVycm9yOiAnICsgZXJyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvLyoqKioqKioqKioqKioqKioqKiogRU5DUllQVElPTiBNRVRIT0RTICoqKioqKioqKioqKioqKioqKipcclxuICAvKipcclxuKiBJZGVudGlmaWVzIHRoZSBtZXNzYWdlcyB0byBiZSBlbmNyeXB0ZWRcclxuKiBAcGFyYW0ge01lc3NhZ2V9ICAgIG1lc3NhZ2VcclxuKiBAcmV0dXJucyB7Ym9vbGVhbn0gIHJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2FnZSByZXF1aXJlcyBlbmNyeXB0aW9uXHJcbiovXHJcblxyXG4gIF9pc1RvRW5jcnlwdChtZXNzYWdlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbG9nLmxvZygnW0NyeXB0b01hbmFnZXIuX2lzVG9FbmNyeXB0XScsIG1lc3NhZ2UpO1xyXG4gICAgbGV0IGlzQ3JlYXRlID0gbWVzc2FnZS50eXBlID09PSAnY3JlYXRlJztcclxuICAgIGxldCBpc0Zyb21IeXBlcnR5ID0gbWVzc2FnZS5mcm9tLmluY2x1ZGVzKCdoeXBlcnR5Oi8vJyk7XHJcbiAgICBsZXQgaXNUb0h5cGVydHkgPSBtZXNzYWdlLnRvLmluY2x1ZGVzKCdoeXBlcnR5Oi8vJyk7XHJcbiAgICBsZXQgaXNUb0RhdGFPYmplY3QgPSBpc0RhdGFPYmplY3RVUkwobWVzc2FnZS50byk7XHJcbiAgICBsZXQgcmVwb3J0ZXIgPSBfdGhpcy5yZWdpc3RyeS5nZXREYXRhT2JqZWN0UmVwb3J0ZXIobWVzc2FnZS50byk7XHJcblxyXG4gICAgbGV0IGRvTXV0dWFsQXV0aGVudGljYXRpb24gPSBtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSA/IG1lc3NhZ2UuYm9keS5tdXR1YWxcclxuICAgIDogIG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoJ2JvZHknKSAmJiBtZXNzYWdlLmJvZHkuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykgJiYgbWVzc2FnZS5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdtdXR1YWwnKSA/IG1lc3NhZ2UuYm9keS52YWx1ZS5tdXR1YWwgIDogdHJ1ZTtcclxuXHJcbiAgICBpZiAoIWRvTXV0dWFsQXV0aGVudGljYXRpb24pIHJldHVybiBmYWxzZTtcclxuICAgIGlmIChyZXBvcnRlciAhPT0gbnVsbCAmJiBpc0xlZ2FjeShyZXBvcnRlcikpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vaWYgaXMgbm90IHRvIGFwcGx5IGVuY3J5cHRpb24sIHRoZW4gcmV0dXJucyByZXNvbHZlXHJcbiAgICBpZiAoIXRoaXMuaXNUb1VzZUVuY3J5cHRpb24gJiYgIShtZXNzYWdlLnR5cGUgPT09ICdoYW5kc2hha2UnKSkge1xyXG4gICAgICBsb2cuaW5mbygnbm90IGhhbmRzaGFrZTogZW5jcnlwdGlvbiBkaXNhYmxlZCcpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ3VwZGF0ZScpIHtcclxuICAgICAgbG9nLmluZm8oJ3VwZGF0ZTplbmNyeXB0aW9uIGRpc2FibGVkJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobWVzc2FnZS50eXBlID09PSAnZm9yd2FyZCcpIHtcclxuICAgICAgbG9nLmluZm8oJ2ZvcndhcmQ6ZW5jcnlwdGlvbiBkaXNhYmxlZCcpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlzTGVnYWN5KG1lc3NhZ2UudG8pKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuICgoaXNDcmVhdGUgJiYgaXNGcm9tSHlwZXJ0eSAmJiBpc1RvSHlwZXJ0eSkgfHwgKGlzQ3JlYXRlICYmIGlzRnJvbUh5cGVydHkgJiYgaXNUb0RhdGFPYmplY3QgJiYgZG9NdXR1YWxBdXRoZW50aWNhdGlvbikgfHwgbWVzc2FnZS50eXBlID09PSAnaGFuZHNoYWtlJyB8fCAobWVzc2FnZS50eXBlID09PSAndXBkYXRlJyAmJiBkb011dHVhbEF1dGhlbnRpY2F0aW9uKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgX2lzVG9EZWNyeXB0KG1lc3NhZ2UpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIC8vIEZvciBzeWJzY3JpYmUgbWVzc2FnZSBsZXQncyBzdGFydCB0aGUgbXV0dWFsQXV0aGVudGljYXRpb25cclxuICAgICAgbGV0IGlzU3Vic2NyaXB0aW9uID0gbWVzc2FnZS50eXBlID09PSAnc3Vic2NyaWJlJztcclxuICAgICAgbGV0IGlzRnJvbVJlbW90ZVNNID0gX3RoaXMuX2lzRnJvbVJlbW90ZVNNKG1lc3NhZ2UuZnJvbSk7XHJcbiAgICAgIGxldCBtdXR1YWwgPSBtZXNzYWdlLmJvZHkuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykgJiYgbWVzc2FnZS5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdtdXR1YWwnKSA/IG1lc3NhZ2UuYm9keS52YWx1ZS5tdXR1YWwgOiBcclxuICAgICAgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSA/IG1lc3NhZ2UuYm9keS5tdXR1YWwgOiB0cnVlO1xyXG4gICAgICAvLyAgICAgIGxldCBtdXR1YWwgPSBtZXNzYWdlLmJvZHkuaGFzT3duUHJvcGVydHkoJ211dHVhbCcpID8gbWVzc2FnZS5ib2R5Lm11dHVhbCA6IGZhbHNlO1xyXG5cclxuaWYgKGlzU3Vic2NyaXB0aW9uICYmIGlzRnJvbVJlbW90ZVNNICYmIG11dHVhbCkge1xyXG4vLyAgaWYgKGlzU3Vic2NyaXB0aW9uICYmIGlzRnJvbVJlbW90ZVNNICkge1xyXG4gICAgbG9nLmxvZygnW0NyeXB0b01hbmFnZXIuX2lzVG9EZWNyeXB0XSBfZG9NdXR1YWxBdXRoZW50aWNhdGlvblBoYXNlMScpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ3J5cHRvTWFuYWdlci5faXNUb0RlY3J5cHRdICcsIG1lc3NhZ2UpO1xyXG4gICAgICAgIGxldCByZXBvcnRlciA9IF90aGlzLnJlZ2lzdHJ5LmdldERhdGFPYmplY3RSZXBvcnRlcihtZXNzYWdlLnRvKTtcclxuICAgICAgICBpZiAocmVwb3J0ZXIgIT09IG51bGwgJiYgaXNMZWdhY3kocmVwb3J0ZXIpKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfdGhpcy5fZG9NdXR1YWxBdXRoZW50aWNhdGlvblBoYXNlMShtZXNzYWdlKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICB9KTtcclxuXHJcbi8vICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmIHR5cGVvZiBtZXNzYWdlLmJvZHkudmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5oYXNPd25Qcm9wZXJ0eSgnYm9keScpICYmIG1lc3NhZ2UuYm9keS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSAmJiB0eXBlb2YgbWVzc2FnZS5ib2R5LnZhbHVlID09PSAnc3RyaW5nJyAmJiBtdXR1YWwpIHtcclxuICAgICAgICBsb2cubG9nKCdbQ3J5cHRvTWFuYWdlci5faXNUb0RlY3J5cHRdIHRydWUnKTtcclxuICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxvZy5sb2coJ1tDcnlwdG9NYW5hZ2VyLl9pc1RvRGVjcnlwdF0gZmFsc2UnKTtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICBsb2cuZXJyb3IoJ1tDcnlwdG9NYW5hZ2VyLl9pc1RvRGVjcnlwdF0nLCBlcnJvcik7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBlbmNyeXB0TWVzc2FnZShtZXNzYWdlKSB7XHJcbiAgICAvL2xvZy5pbmZvKCdlbmNyeXB0TWVzc2FnZTptZXNzYWdlJywgbWVzc2FnZSk7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxvZy5sb2coJ2VuY3J5cHQgbWVzc2FnZSAnKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsZXQgaXNIYW5kU2hha2VUeXBlID0gbWVzc2FnZS50eXBlID09PSAnaGFuZHNoYWtlJztcclxuXHJcbiAgICAgIC8vaWYgaXMgbm90IHRvIGFwcGx5IGVuY3J5cHRpb24sIHRoZW4gcmV0dXJucyByZXNvbHZlXHJcbiAgICAgIGlmICghX3RoaXMuX2lzVG9FbmNyeXB0KG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgLy8gbG9nLmxvZygnZGVjcnlwdGlvbiBkaXNhYmxlZCcpO1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZGF0YU9iamVjdFVSTCA9IHBhcnNlTWVzc2FnZVVSTChtZXNzYWdlLnRvKTtcclxuXHJcbiAgICAgIGxldCBpc1RvRGF0YU9iamVjdCA9IGlzRGF0YU9iamVjdFVSTChkYXRhT2JqZWN0VVJMKTtcclxuICAgICAgbGV0IGlzVG9MZWdhY3lJZGVudGl0eSA9IGlzTGVnYWN5KG1lc3NhZ2UudG8pO1xyXG4gICAgICBsZXQgaXNGcm9tSHlwZXJ0eSA9IGRpdmlkZVVSTChtZXNzYWdlLmZyb20pLnR5cGUgPT09ICdoeXBlcnR5JztcclxuICAgICAgbGV0IGlzVG9IeXBlcnR5ID0gZGl2aWRlVVJMKG1lc3NhZ2UudG8pLnR5cGUgPT09ICdoeXBlcnR5JztcclxuXHJcbiAgICAgIGlmIChtZXNzYWdlLnR5cGUgPT09ICd1cGRhdGUnKSB7XHJcbiAgICAgICAgbG9nLmxvZygnZW5jcnlwdCBtZXNzYWdlOiBtZXNzYWdlIHR5cGUgdXBkYXRlJyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUobWVzc2FnZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpc1RvTGVnYWN5SWRlbnRpdHkpIHtcclxuICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICB9IGVsc2UgaWYgKGlzRnJvbUh5cGVydHkgJiYgaXNUb0h5cGVydHkpIHtcclxuICAgICAgICBsZXQgdXNlclVSTCA9IF90aGlzLl9yZWdpc3RyeS5nZXRIeXBlcnR5T3duZXIobWVzc2FnZS5mcm9tKTtcclxuICAgICAgICBpZiAodXNlclVSTCkge1xyXG5cclxuICAgICAgICAgIC8vIGNoZWNrIGlmIGV4aXN0cyBhbnkga2V5cyBiZXR3ZWVuIHR3byB1c2Vyc1xyXG4gICAgICAgICAgbGV0IGNoYXRLZXlzID0gX3RoaXMuY2hhdEtleXNbbWVzc2FnZS5mcm9tICsgJzwtPicgKyBtZXNzYWdlLnRvXTtcclxuICAgICAgICAgIGlmICghY2hhdEtleXMpIHtcclxuICAgICAgICAgICAgY2hhdEtleXMgPSBfdGhpcy5fbmV3Q2hhdENyeXB0byhtZXNzYWdlLCB1c2VyVVJMKTtcclxuXHJcbiAgICAgICAgICAgIC8vbG9nLmxvZygnY3JlYXRlQ2hhdEtleSBlbmNyeXB0JywgbWVzc2FnZS5mcm9tICsgbWVzc2FnZS50byk7XHJcbiAgICAgICAgICAgIF90aGlzLmNoYXRLZXlzW21lc3NhZ2UuZnJvbSArICc8LT4nICsgbWVzc2FnZS50b10gPSBjaGF0S2V5cztcclxuICAgICAgICAgICAgbWVzc2FnZS5ib2R5LmhhbmRzaGFrZVBoYXNlID0gJ3N0YXJ0SGFuZFNoYWtlJztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoY2hhdEtleXMuYXV0aGVudGljYXRlZCAmJiAhaXNIYW5kU2hha2VUeXBlKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgaXYgPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVJVigpO1xyXG4gICAgICAgICAgICBfdGhpcy5jcnlwdG8uZW5jcnlwdEFFUyhjaGF0S2V5cy5rZXlzLmh5cGVydHlGcm9tU2Vzc2lvbktleSwgc3RyaW5naWZ5KG1lc3NhZ2UuYm9keS52YWx1ZSksIGl2KS50aGVuKGVuY3J5cHRlZFZhbHVlID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkTWVzc2FnZSA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIHN0cmluZ2lmeShtZXNzYWdlLmJvZHkudmFsdWUpICtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5naWZ5KGl2KSwgY2hhdEtleXMuaHlwZXJ0eUZyb20ubWVzc2FnZUluZm8pO1xyXG5cclxuICAgICAgICAgICAgICBfdGhpcy5jcnlwdG8uaGFzaEhNQUMoY2hhdEtleXMua2V5cy5oeXBlcnR5RnJvbUhhc2hLZXksIGZpbHRlcmVkTWVzc2FnZSkudGhlbihoYXNoID0+IHtcclxuICAgICAgICAgICAgICAgIC8vbG9nLmxvZygncmVzdWx0IG9mIGhhc2ggJywgaGFzaCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB7aXY6IGVuY29kZShpdiksIHZhbHVlOiBlbmNvZGUoZW5jcnlwdGVkVmFsdWUpLCBoYXNoOiBlbmNvZGUoaGFzaCl9O1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZS5ib2R5LnZhbHVlID0gZW5jb2RlKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmIGlzIGEgaGFuZHNoYWtlIG1lc3NhZ2UsIGp1c3QgcmVzb2x2ZSBpdFxyXG4gICAgICAgICAgfSBlbHNlIGlmIChpc0hhbmRTaGFrZVR5cGUpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGVsc2UsIHN0YXJ0cyBhIG5ldyBoYW5kc2hha2UgcHJvdG9jb2xcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9kb0hhbmRTaGFrZVBoYXNlKG1lc3NhZ2UsIGNoYXRLZXlzKS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMuY2hhdEtleXNbbWVzc2FnZS5mcm9tICsgJzwtPicgKyBtZXNzYWdlLnRvXSA9IHZhbHVlLmNoYXRLZXlzO1xyXG5cclxuICAgICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZSh2YWx1ZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICByZWplY3QoJ2VuY3J5cHQgaGFuZHNoYWtlIHByb3RvY29sIHBoYXNlICcpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KCdJbiBlbmNyeXB0TWVzc2FnZTogSHlwZXJ0eSBvd25lciBVUkwgd2FzIG5vdCBmb3VuZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIC8vaWYgZnJvbSBoeXBlcnR5IHRvIGEgZGF0YU9iamVjdFVSTFxyXG4gICAgICB9IGVsc2UgaWYgKGlzRnJvbUh5cGVydHkgJiYgaXNUb0RhdGFPYmplY3QpIHtcclxuXHJcbiAgICAgICAgLy9sb2cubG9nKCdkYXRhT2JqZWN0IHZhbHVlIHRvIGVuY3J5cHQ6ICcsIG1lc3NhZ2UuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgLy9sb2cubG9nKCdJZGVudGl0eU1vZHVsZSAtIGVuY3J5cHQgZnJvbSBoeXBlcnR5IHRvIGRhdGFvYmplY3QgJywgbWVzc2FnZSk7XHJcblxyXG4gICAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCgnZGF0YU9iamVjdFNlc3Npb25LZXlzJykudGhlbigoc2Vzc2lvbktleXMpID0+IHtcclxuICAgICAgICAgIHNlc3Npb25LZXlzID0gY2hhdGtleXNUb0FycmF5Q2xvbmVyKHNlc3Npb25LZXlzIHx8IHt9KTtcclxuICAgICAgICAgIGxldCBkYXRhT2JqZWN0S2V5ID0gc2Vzc2lvbktleXMgPyBzZXNzaW9uS2V5c1tkYXRhT2JqZWN0VVJMXSA6IG51bGw7XHJcblxyXG4gICAgICAgICAgX3RoaXMuZGF0YU9iamVjdHNTdG9yYWdlLmdldERhdGFPYmplY3QoZGF0YU9iamVjdFVSTCkudGhlbigoaXNIeXBlcnR5UmVwb3J0ZXIpID0+IHtcclxuICAgICAgICAgICAgLy9pZiBubyBrZXkgZXhpc3RzLCBjcmVhdGUgYSBuZXcgb25lIGlmIGlzIHRoZSByZXBvcnRlciBvZiBkYXRhT2JqZWN0XHJcbiAgICAgICAgICAgIGlmICghZGF0YU9iamVjdEtleSkge1xyXG4gICAgICAgICAgICAgIC8vIGlmIHRoZSBoeXBlcnR5IGlzIHRoZSByZXBvcnRlciBvZiB0aGUgZGF0YU9iamVjdCB0aGVuIGdlbmVyYXRlcyBhIHNlc3Npb24ga2V5XHJcbiAgICAgICAgICAgICAgaWYgKGlzSHlwZXJ0eVJlcG9ydGVyLnJlcG9ydGVyICYmIGlzSHlwZXJ0eVJlcG9ydGVyLnJlcG9ydGVyID09PSBtZXNzYWdlLmZyb20pIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgc2Vzc2lvbktleSA9IF90aGlzLmNyeXB0by5nZW5lcmF0ZVJhbmRvbSgpO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZGF0YU9iamVjdFNlc3Npb25LZXlzW2RhdGFPYmplY3RVUkxdID0ge3Nlc3Npb25LZXk6IHNlc3Npb25LZXksIGlzVG9FbmNyeXB0OiB0cnVlfTtcclxuICAgICAgICAgICAgICAgIGxldCBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZSA9IGNoYXRrZXlzVG9TdHJpbmdDbG9uZXIoX3RoaXMuZGF0YU9iamVjdFNlc3Npb25LZXlzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL1RPRE86IGNoZWNrIGlmIHRoaXMgZG9lcyBub3QgbmVlZCB0byBiZSBzdG9yZWRcclxuICAgICAgICAgICAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldCgnZGF0YU9iamVjdFNlc3Npb25LZXlzJywgMCwgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmUpLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJlamVjdCgnT24gZW5jcnlwdE1lc3NhZ2UgZnJvbSBtZXRob2Qgc3RvcmFnZU1hbmFnZXIuc2V0IGVycm9yOiAnICsgZXJyKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdEtleSA9IF90aGlzLmRhdGFPYmplY3RTZXNzaW9uS2V5c1tkYXRhT2JqZWN0VVJMXTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHNlc3Npb24ga2V5IGZvciB0aGUgY2hhdCByb29tXHJcbiAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0S2V5KSB7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGFuZCBpZiBpcyB0byBhcHBseSBlbmNyeXB0aW9uLCBlbmNyeXB0IHRoZSBtZXNzYWdlc1xyXG4gICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0S2V5LmlzVG9FbmNyeXB0KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXYgPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVJVigpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0cmluZ2lmaWVkSVYgPSBzdHJpbmdpZnkoaXYpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0cmluZ2lmaWVkTWVzc2FnZUJvZHkgPSBzdHJpbmdpZnkobWVzc2FnZS5ib2R5LnZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5jcnlwdG8uZW5jcnlwdEFFUyhkYXRhT2JqZWN0S2V5LnNlc3Npb25LZXksIHN0cmluZ2lmaWVkTWVzc2FnZUJvZHksIGl2KS50aGVuKGVuY3J5cHRlZFZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2UuYm9keS5pZGVudGl0eS5hc3NlcnRpb247IC8vVE9ETzogQ2hlY2sgd2h5IGFzc2VydGlvbiBpcyBjb21taW5nIG9uIHRoZSBtZXNzYWdlIVxyXG4gICAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZS5ib2R5LmlkZW50aXR5LmV4cGlyZXM7IC8vVE9ETzogQ2hlY2sgd2h5IGV4cGlyZXMgaXMgY29tbWluZyBvbiB0aGUgbWVzc2FnZSFcclxuICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkTWVzc2FnZSA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIHN0cmluZ2lmaWVkTWVzc2FnZUJvZHkgKyBzdHJpbmdpZmllZElWKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLmNyeXB0by5oYXNoSE1BQyhkYXRhT2JqZWN0S2V5LnNlc3Npb25LZXksIGZpbHRlcmVkTWVzc2FnZSkudGhlbihoYXNoID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBsb2cubG9nKCdoYXNoICcsIGhhc2gpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VmFsdWUgPSB7dmFsdWU6IGVuY29kZShlbmNyeXB0ZWRWYWx1ZSksIGl2OiBlbmNvZGUoaXYpLCBoYXNoOiBlbmNvZGUoaGFzaCl9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmJvZHkudmFsdWUgPSBzdHJpbmdpZnkobmV3VmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGlmIG5vdCwganVzdCBzZW5kIHRoZSBtZXNzYWdlXHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgZ2VuZXJhdGlvbiBvZiBhIG5ldyBzZXNzaW9uIEtleVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJlamVjdCgnRGF0YSBvYmplY3Qga2V5IGNvdWxkIG5vdCBiZSBkZWZpbmVkOiBGYWlsZWQgdG8gZGVjcnlwdCBtZXNzYWdlICcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIGVuY3J5cHRNZXNzYWdlIGZyb20gbWV0aG9kIGRhdGFPYmplY3RzU3RvcmFnZS5nZXREYXRhT2JqZWN0IGVycm9yOiAnICsgZXJyKTsgfSk7XHJcbiAgICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KCdPbiBlbmNyeXB0TWVzc2FnZSBmcm9tIG1ldGhvZCBzdG9yYWdlTWFuYWdlci5nZXQgZXJyb3I6ICcgKyBlcnIpOyB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBlbmNyeXB0RGF0YU9iamVjdChkYXRhT2JqZWN0LCBzZW5kZXIpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBsb2cuaW5mbygnZGF0YU9iamVjdCB2YWx1ZSB0byBlbmNyeXB0OiAnLCBkYXRhT2JqZWN0KTtcclxuXHJcbiAgICAgIGxldCBkYXRhT2JqZWN0VVJMID0gcGFyc2VNZXNzYWdlVVJMKHNlbmRlcik7XHJcblxyXG4gICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5nZXQoJ2RhdGFPYmplY3RTZXNzaW9uS2V5cycpLnRoZW4oKHNlc3Npb25LZXlzKSA9PiB7XHJcbiAgICAgICAgc2Vzc2lvbktleXMgPSBjaGF0a2V5c1RvQXJyYXlDbG9uZXIoc2Vzc2lvbktleXMgfHwge30pO1xyXG4gICAgICAgIGxldCBkYXRhT2JqZWN0S2V5ID0gc2Vzc2lvbktleXMgPyBzZXNzaW9uS2V5c1tkYXRhT2JqZWN0VVJMXSA6IG51bGw7XHJcblxyXG4gICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHNlc3Npb24ga2V5IGZvciB0aGUgY2hhdCByb29tXHJcbiAgICAgICAgaWYgKGRhdGFPYmplY3RLZXkpIHtcclxuXHJcbiAgICAgICAgICAvLyBhbmQgaWYgaXMgdG8gYXBwbHkgZW5jcnlwdGlvbiwgZW5jcnlwdCB0aGUgbWVzc2FnZXNcclxuICAgICAgICAgIGlmIChkYXRhT2JqZWN0S2V5LmlzVG9FbmNyeXB0KSB7XHJcbiAgICAgICAgICAgIGxldCBpdiA9IF90aGlzLmNyeXB0by5nZW5lcmF0ZUlWKCk7XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5jcnlwdG8uZW5jcnlwdEFFUyhkYXRhT2JqZWN0S2V5LnNlc3Npb25LZXksIHN0cmluZ2lmeShkYXRhT2JqZWN0KSwgaXYpLnRoZW4oZW5jcnlwdGVkVmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBuZXdWYWx1ZSA9IHsgdmFsdWU6IGVuY29kZShlbmNyeXB0ZWRWYWx1ZSksIGl2OiBlbmNvZGUoaXYpIH07XHJcblxyXG4gICAgICAgICAgICAgIC8vbG9nLmxvZygnZW5jcnlwdGVkIGRhdGFPYmplY3QnLCBuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobmV3VmFsdWUpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIGVuY3J5cHREYXRhT2JqZWN0IGZyb20gbWV0aG9kIGVuY3J5cHRBRVMgZXJyb3I6ICcgKyBlcnIpOyB9KTtcclxuXHJcbiAgICAgICAgICAvLyBpZiBub3QsIGp1c3Qgc2VuZCB0aGUgbWVzc2FnZVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbG9nLmluZm8oJ1RoZSBkYXRhT2JqZWN0IGlzIG5vdCBlbmNyeXB0ZWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YU9iamVjdCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gc3RhcnQgdGhlIGdlbmVyYXRpb24gb2YgYSBuZXcgc2Vzc2lvbiBLZXlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnTm8gZGF0YU9iamVjdEtleSBmb3IgdGhpcyBkYXRhT2JqZWN0VVJMOicsIGRhdGFPYmplY3RVUkwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KCdPbiBlbmNyeXB0RGF0YU9iamVjdCBmcm9tIG1ldGhvZCBzdG9yYWdlTWFuYWdlci5nZXQgZXJyb3I6ICcgKyBlcnIpOyB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVjcnlwdE1lc3NhZ2UobWVzc2FnZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvLyAgbG9nLmxvZygnZGVjcnlwdE1lc3NhZ2U6bWVzc2FnZScsIG1lc3NhZ2UpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgbGV0IGlzSGFuZFNoYWtlVHlwZSA9IG1lc3NhZ2UudHlwZSA9PT0gJ2hhbmRzaGFrZSc7XHJcblxyXG4gICAgICBfdGhpcy5faXNUb0RlY3J5cHQobWVzc2FnZSkudGhlbigoaXNUb0RlY3J5cHQpID0+IHtcclxuXHJcbiAgICAgICAgLy9pZiBpcyBub3QgdG8gYXBwbHkgZW5jcnlwdGlvbiwgdGhlbiByZXR1cm5zIHJlc29sdmVcclxuICAgICAgICBpZiAoIWlzVG9EZWNyeXB0KSByZXR1cm4gcmVzb2x2ZShtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGFPYmplY3RVUkwgPSBwYXJzZU1lc3NhZ2VVUkwobWVzc2FnZS50byk7XHJcblxyXG4gICAgICAgIGxldCBpc1RvRGF0YU9iamVjdCA9IGlzRGF0YU9iamVjdFVSTChkYXRhT2JqZWN0VVJMKTtcclxuICAgICAgICBsZXQgaXNGcm9tSHlwZXJ0eSA9IGRpdmlkZVVSTChtZXNzYWdlLmZyb20pLnR5cGUgPT09ICdoeXBlcnR5JztcclxuICAgICAgICBsZXQgaXNUb0h5cGVydHkgPSBkaXZpZGVVUkwobWVzc2FnZS50bykudHlwZSA9PT0gJ2h5cGVydHknO1xyXG5cclxuICAgICAgICBpZiAobWVzc2FnZS50eXBlID09PSAndXBkYXRlJykge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL2lzIGlzIGh5cGVydHkgdG8gaHlwZXJ0eSBjb21tdW5pY2F0aW9uXHJcbiAgICAgICAgaWYgKGlzRnJvbUh5cGVydHkgJiYgaXNUb0h5cGVydHkpIHtcclxuICAgICAgICAgIC8vIGxvZy5sb2coJ2RlY3J5cHQgaHlwZXJ0eSB0byBoeXBlcnR5Jyk7XHJcbiAgICAgICAgICBsZXQgdXNlclVSTCA9IF90aGlzLl9yZWdpc3RyeS5nZXRIeXBlcnR5T3duZXIobWVzc2FnZS50byk7XHJcbiAgICAgICAgICBpZiAodXNlclVSTCkge1xyXG5cclxuICAgICAgICAgICAgbGV0IGNoYXRLZXlzID0gX3RoaXMuY2hhdEtleXNbbWVzc2FnZS50byArICc8LT4nICsgbWVzc2FnZS5mcm9tXTtcclxuICAgICAgICAgICAgaWYgKCFjaGF0S2V5cykge1xyXG4gICAgICAgICAgICAgIGNoYXRLZXlzID0gX3RoaXMuX25ld0NoYXRDcnlwdG8obWVzc2FnZSwgdXNlclVSTCwgJ2RlY3J5cHQnKTtcclxuICAgICAgICAgICAgICBfdGhpcy5jaGF0S2V5c1ttZXNzYWdlLnRvICsgJzwtPicgKyBtZXNzYWdlLmZyb21dID0gY2hhdEtleXM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjaGF0S2V5cy5hdXRoZW50aWNhdGVkICYmICFpc0hhbmRTaGFrZVR5cGUpIHtcclxuICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBkZWNvZGUobWVzc2FnZS5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgICAgICBsZXQgaXYgPSBkZWNvZGVUb1VpbnQ4QXJyYXkodmFsdWUuaXYpO1xyXG4gICAgICAgICAgICAgIGxldCBkYXRhID0gZGVjb2RlVG9VaW50OEFycmF5KHZhbHVlLnZhbHVlKTtcclxuICAgICAgICAgICAgICBsZXQgaGFzaCA9IGRlY29kZVRvVWludDhBcnJheSh2YWx1ZS5oYXNoKTtcclxuICAgICAgICAgICAgICBfdGhpcy5jcnlwdG8uZGVjcnlwdEFFUyhjaGF0S2V5cy5rZXlzLmh5cGVydHlUb1Nlc3Npb25LZXksIGRhdGEsIGl2KS50aGVuKGRlY3J5cHRlZERhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gbG9nLmxvZygnZGVjcnlwdGVkIHZhbHVlICcsIGRlY3J5cHRlZERhdGEpO1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZS5ib2R5LnZhbHVlID0gZGVjcnlwdGVkRGF0YTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyZWRNZXNzYWdlID0gX3RoaXMuX2ZpbHRlck1lc3NhZ2VUb0hhc2gobWVzc2FnZSwgZGVjcnlwdGVkRGF0YSArIGl2KTtcclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5jcnlwdG8udmVyaWZ5SE1BQyhjaGF0S2V5cy5rZXlzLmh5cGVydHlUb0hhc2hLZXksIGZpbHRlcmVkTWVzc2FnZSwgaGFzaCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAvL2xvZy5sb2coJ3Jlc3VsdCBvZiBoYXNoIHZlcmlmaWNhdGlvbiEgJywgcmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ib2R5LmFzc2VydGVkSWRlbnRpdHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzSGFuZFNoYWtlVHlwZSkge1xyXG4gICAgICAgICAgICAgIF90aGlzLl9kb0hhbmRTaGFrZVBoYXNlKG1lc3NhZ2UsIGNoYXRLZXlzKS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgLy9pZiBpdCB3YXMgc3RhcnRlZCBieSBkb011dHVhbEF1dGhlbnRpY2F0aW9uIHRoZW4gZW5kcyB0aGUgcHJvdG9jb2xcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ2hhbmRTaGFrZUVuZCcpIHtcclxuICAgICAgICAgICAgICAgICAgLy9yZWplY3QoJ2RlY3J5cHQgaGFuZHNoYWtlIHByb3RvY29sIHBoYXNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBpZiB3YXMgc3RhcnRlZCBieSBhIG1lc3NhZ2UsIHRoZW4gcmVzZW5kIHRoYXQgbWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgX3RoaXMuY2hhdEtleXNbbWVzc2FnZS50byArICc8LT4nICsgbWVzc2FnZS5mcm9tXSA9IHZhbHVlLmNoYXRLZXlzO1xyXG4gICAgICAgICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZSh2YWx1ZS5tZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIC8vcmVqZWN0KCdkZWNyeXB0IGhhbmRzaGFrZSBwcm90b2NvbCBwaGFzZSAnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZWplY3QoJ3dyb25nIG1lc3NhZ2UgZG8gZGVjcnlwdCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZWplY3QoJ2Vycm9yIG9uIGRlY3J5cHQgbWVzc2FnZScpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vaWYgZnJvbSBoeXBlcnR5IHRvIGEgZGF0YU9iamVjdFVSTFxyXG4gICAgICAgIH0gZWxzZSBpZiAoaXNGcm9tSHlwZXJ0eSAmJiBpc1RvRGF0YU9iamVjdCkge1xyXG4gICAgICAgICAgLy8gbG9nLmxvZygnZGF0YU9iamVjdCB2YWx1ZSB0byBkZWNyeXB0OiAnLCBtZXNzYWdlLmJvZHkpO1xyXG5cclxuICAgICAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCgnZGF0YU9iamVjdFNlc3Npb25LZXlzJykudGhlbigoc2Vzc2lvbktleXMpID0+IHtcclxuICAgICAgICAgICAgc2Vzc2lvbktleXMgPSBjaGF0a2V5c1RvQXJyYXlDbG9uZXIoc2Vzc2lvbktleXMgfHwge30pO1xyXG4gICAgICAgICAgICBsZXQgZGF0YU9iamVjdEtleSA9IHNlc3Npb25LZXlzID8gc2Vzc2lvbktleXNbZGF0YU9iamVjdFVSTF0gOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFPYmplY3RLZXkpIHtcclxuXHJcbiAgICAgICAgICAgICAgLy9jaGVjayBpZiBpcyB0byBhcHBseSBlbmNyeXB0aW9uXHJcbiAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3RLZXkuaXNUb0VuY3J5cHQpIHtcclxuICAgICAgICAgICAgICAgIGxldCBwYXJzZWRWYWx1ZSA9IHBhcnNlKG1lc3NhZ2UuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXYgPSBkZWNvZGVUb1VpbnQ4QXJyYXkocGFyc2VkVmFsdWUuaXYpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGVuY3J5cHRlZFZhbHVlID0gZGVjb2RlVG9VaW50OEFycmF5KHBhcnNlZFZhbHVlLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgIGxldCBoYXNoID0gZGVjb2RlVG9VaW50OEFycmF5KHBhcnNlZFZhbHVlLmhhc2gpO1xyXG5cclxuICAgICAgICAgICAgICAgIF90aGlzLmNyeXB0by5kZWNyeXB0QUVTKGRhdGFPYmplY3RLZXkuc2Vzc2lvbktleSwgZW5jcnlwdGVkVmFsdWUsIGl2KS50aGVuKGRlY3J5cHRlZFZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgbGV0IHBhcnNlZFZhbHVlID0gcGFyc2UoZGVjcnlwdGVkVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgLy8gbG9nLmxvZygnZGVjcnlwdGVkIFZhbHVlLCcsIHBhcnNlZFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ib2R5LnZhbHVlID0gcGFyc2VkVmFsdWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICBsZXQgZmlsdGVyZWRNZXNzYWdlID0gX3RoaXMuX2ZpbHRlck1lc3NhZ2VUb0hhc2gobWVzc2FnZSwgc3RyaW5naWZ5KHBhcnNlZFZhbHVlKSArIHN0cmluZ2lmeShpdikpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgX3RoaXMuY3J5cHRvLnZlcmlmeUhNQUMoZGF0YU9iamVjdEtleS5zZXNzaW9uS2V5LCBmaWx0ZXJlZE1lc3NhZ2UsIGhhc2gpLnRoZW4ocmVzdWx0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cubG9nKCdSZWNlaXZlZCBtZXNzYWdlIEhNQUMgcmVzdWx0JywgcmVzdWx0KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ib2R5LmFzc2VydGVkSWRlbnRpdHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7IHJlamVjdCgnTWVzc2FnZSBITUFDIGlzIGludmFsaWQ6ICcgKyBlcnIpOyB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vaWYgbm90LCBqdXN0IHJldHVybiB0aGUgbWVzc2FnZVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmJvZHkuYXNzZXJ0ZWRJZGVudGl0eSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbWVzc2FnZS5ib2R5LmFzc2VydGVkSWRlbnRpdHkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XHJcblxyXG4gICAgICAgICAgICAgIC8vcmVqZWN0KCdubyBzZXNzaW9uS2V5IGZvciBjaGF0IHJvb20gZm91bmQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QoJ3dyb25nIG1lc3NhZ2UgdG8gZGVjcnlwdCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWNyeXB0RGF0YU9iamVjdChkYXRhT2JqZWN0LCBzZW5kZXIpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAvL2lmIGlzIG5vdCB0byBhcHBseSBlbmNyeXB0aW9uLCB0aGVuIHJldHVybnMgcmVzb2x2ZVxyXG4gICAgICBpZiAoIV90aGlzLmlzVG9Vc2VFbmNyeXB0aW9uKSB7XHJcbiAgICAgICAgLy8gbG9nLmxvZygnZGVjcnlwdGlvbiBkaXNhYmxlZCcpO1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGRhdGFPYmplY3QpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZGF0YU9iamVjdFVSTCA9IHBhcnNlTWVzc2FnZVVSTChzZW5kZXIpO1xyXG5cclxuICAgICAgLy8gbG9nLmxvZygnZGF0YU9iamVjdCB2YWx1ZSB0byBkZWNyeXB0OiAnLCBkYXRhT2JqZWN0KTtcclxuXHJcbiAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCgnZGF0YU9iamVjdFNlc3Npb25LZXlzJykudGhlbigoc2Vzc2lvbktleXMpID0+IHtcclxuICAgICAgICBzZXNzaW9uS2V5cyA9IGNoYXRrZXlzVG9BcnJheUNsb25lcihzZXNzaW9uS2V5cyk7XHJcbiAgICAgICAgbGV0IGRhdGFPYmplY3RLZXkgPSBzZXNzaW9uS2V5cyA/IHNlc3Npb25LZXlzW2RhdGFPYmplY3RVUkxdIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKGRhdGFPYmplY3RLZXkpIHtcclxuXHJcbiAgICAgICAgICAvL2NoZWNrIGlmIGlzIHRvIGFwcGx5IGVuY3J5cHRpb25cclxuICAgICAgICAgIGlmIChkYXRhT2JqZWN0S2V5LmlzVG9FbmNyeXB0KSB7XHJcbiAgICAgICAgICAgIGxldCBpdiA9IGRlY29kZVRvVWludDhBcnJheShkYXRhT2JqZWN0Lml2KTtcclxuICAgICAgICAgICAgbGV0IGVuY3J5cHRlZFZhbHVlID0gZGVjb2RlVG9VaW50OEFycmF5KGRhdGFPYmplY3QudmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuY3J5cHRvLmRlY3J5cHRBRVMoZGF0YU9iamVjdEtleS5zZXNzaW9uS2V5LCBlbmNyeXB0ZWRWYWx1ZSwgaXYpLnRoZW4oZGVjcnlwdGVkVmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBwYXJzZWRWYWx1ZSA9IHBhcnNlKGRlY3J5cHRlZFZhbHVlKTtcclxuICAgICAgICAgICAgICBsZXQgbmV3VmFsdWUgPSB7IHZhbHVlOiBwYXJzZWRWYWx1ZSwgaXY6IGVuY29kZShpdikgfTtcclxuXHJcbiAgICAgICAgICAgICAgLy8gbG9nLmxvZygnZGVjcnlwdGVkIGRhdGFPYmplY3QsJywgbmV3VmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXdWYWx1ZSk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7IHJlamVjdCgnT24gZGVjcnlwdERhdGFPYmplY3QgZnJvbSBtZXRob2QgZW5jcnlwdEFFUyBlcnJvcjogJyArIGVycik7IH0pO1xyXG5cclxuICAgICAgICAgIC8vaWYgbm90LCBqdXN0IHJldHVybiB0aGUgZGF0YU9iamVjdFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gbG9nLmxvZygnVGhlIGRhdGFPYmplY3QgaXMgbm90IGVuY3J5cHRlZCcpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhT2JqZWN0KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiByZWplY3QoJ05vIGRhdGFPYmplY3RLZXkgZm9yIHRoaXMgZGF0YU9iamVjdFVSTDonLCBkYXRhT2JqZWN0VVJMKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfZG9NdXR1YWxBdXRoZW50aWNhdGlvblBoYXNlMShtZXNzYWdlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBsZXQgdG8gPSBtZXNzYWdlLnRvLnNwbGl0KCcvJyk7XHJcblxyXG4gICAgICAvL2xldCBzdWJzSW5kZXggPSB0by5pbmRleE9mKCdzdWJzY3JpcHRpb24nKTtcclxuICAgICAgLy9sZXQgaXNEYXRhT2JqZWN0U3Vic2NyaXB0aW9uID0gc3Vic0luZGV4ICE9PSAtMTtcclxuICAgICAgdG8ucG9wKCk7XHJcbiAgICAgIGxldCBkYXRhT2JqZWN0VVJMID0gdG9bMF0gKyAnLy8nICsgdG9bMl0gKyAnLycgKyB0b1szXTtcclxuICAgICAgX3RoaXMuX2RvTXV0dWFsQXV0aGVudGljYXRpb25QaGFzZTIoZGF0YU9iamVjdFVSTCwgbWVzc2FnZS5ib2R5LnN1YnNjcmliZXIpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIF90aGlzLl9yZWdpc3RyeS5yZWdpc3RlclN1YnNjcmliZXIoZGF0YU9iamVjdFVSTCwgbWVzc2FnZS5ib2R5LnN1YnNjcmliZXIpO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9kb011dHVhbEF1dGhlbnRpY2F0aW9uUGhhc2UyKHNlbmRlciwgcmVjZWl2ZXIpIHtcclxuICAgIGxvZy5pbmZvKCdkb011dHVhbEF1dGhlbnRpY2F0aW9uOnNlbmRlciAnLCBzZW5kZXIpO1xyXG4gICAgbG9nLmluZm8oJ2RvTXV0dWFsQXV0aGVudGljYXRpb246cmVjZWl2ZXIgJywgcmVjZWl2ZXIpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsZXQgZGF0YU9iamVjdFVSTDtcclxuXHJcbiAgICAgIC8vIGNoZWNrIGlmIHRoZSBzZW5kZXIgaXMgYSBkYXRhT2JqZWN0IGFuZCBpZiBzbyBzdG9yZXMgdGhhdCB2YWx1ZVxyXG4gICAgICBsZXQgcmVwb3J0ZXJVUkwgPSBfdGhpcy5fcmVnaXN0cnkuZ2V0UmVwb3J0ZXJVUkxTeW5jaG9ub3VzKHNlbmRlcik7XHJcbiAgICAgIGlmIChyZXBvcnRlclVSTCkge1xyXG4gICAgICAgIGRhdGFPYmplY3RVUkwgPSBzZW5kZXI7XHJcbiAgICAgICAgc2VuZGVyID0gcmVwb3J0ZXJVUkw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBtc2cgPSB7XHJcbiAgICAgICAgdG86IHJlY2VpdmVyLFxyXG4gICAgICAgIGZyb206IHNlbmRlcixcclxuICAgICAgICBjYWxsYmFjazogdW5kZWZpbmVkLFxyXG4gICAgICAgIGJvZHk6IHtoYW5kc2hha2VQaGFzZTogJ3N0YXJ0SGFuZFNoYWtlJywgaWdub3JlOiAnaWdub3JlTWVzc2FnZSd9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoIXNlbmRlciB8fCAhcmVjZWl2ZXIpIHtcclxuICAgICAgICByZXR1cm4gcmVqZWN0KCdzZW5kZXIgb3IgcmVjZWl2ZXIgbWlzc2luZyBvbiBkb011dHVhbEF1dGhlbnRpY2F0aW9uJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBjaGF0S2V5cyA9IF90aGlzLmNoYXRLZXlzW3NlbmRlciArICc8LT4nICsgcmVjZWl2ZXJdO1xyXG4gICAgICBsZXQgdXNlclVSTCA9IF90aGlzLl9yZWdpc3RyeS5nZXRIeXBlcnR5T3duZXIoc2VuZGVyKTtcclxuXHJcbiAgICAgIGlmICh1c2VyVVJMKSB7XHJcblxyXG4gICAgICAgIGlmICghY2hhdEtleXMpIHtcclxuICAgICAgICAgIC8vIGNhbGxiYWNrIHRvIHJlc29sdmUgd2hlbiBmaW5pc2ggdGhlIG11dHVhbCBhdXRoZW50aWNhdGlvblxyXG4gICAgICAgICAgbGV0IHJlc29sdmVkID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgICAgICAgICAgLy8gbG9nLmxvZygnY2FsbGJhY2sgdmFsdWU6JywgdmFsdWUpO1xyXG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBtc2cuY2FsbGJhY2sgPSByZXNvbHZlZDtcclxuICAgICAgICAgIG1zZy5kYXRhT2JqZWN0VVJMID0gZGF0YU9iamVjdFVSTDtcclxuXHJcbiAgICAgICAgICBjaGF0S2V5cyA9IF90aGlzLl9uZXdDaGF0Q3J5cHRvKG1zZywgdXNlclVSTCk7XHJcbiAgICAgICAgICBfdGhpcy5jaGF0S2V5c1tzZW5kZXIgKyAnPC0+JyArIHJlY2VpdmVyXSA9IGNoYXRLZXlzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNoYXRLZXlzLmF1dGhlbnRpY2F0ZWQpIHtcclxuXHJcbiAgICAgICAgICBsZXQgc3RhcnRTZXNzaW9uS2V5RXhjaGFuZ2UgPSB7XHJcbiAgICAgICAgICAgIHRvOiBzZW5kZXIsXHJcbiAgICAgICAgICAgIGZyb206IHJlY2VpdmVyXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgY2hhdEtleXMuZGF0YU9iamVjdFVSTCA9IGRhdGFPYmplY3RVUkw7XHJcbiAgICAgICAgICBfdGhpcy5fc2VuZFJlcG9ydGVyU2Vzc2lvbktleShzdGFydFNlc3Npb25LZXlFeGNoYW5nZSwgY2hhdEtleXMpLnRoZW4odmFsdWUgPT4ge1xyXG5cclxuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UodmFsdWUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIHJlc29sdmUoJ2V4Y2hhbmdlIG9mIGNoYXQgc2Vzc2lvbktleSBpbml0aWF0ZWQnKTtcclxuICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7IHJlamVjdCgnT24gZG9NdXR1YWxBdXRoZW50aWNhdGlvbiBmcm9tIG1ldGhvZCBfc2VuZFJlcG9ydGVyU2Vzc2lvbktleSBlcnJvcjogJyArIGVycik7IH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBfdGhpcy5fZG9IYW5kU2hha2VQaGFzZShtc2csIGNoYXRLZXlzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVqZWN0KCdNdXR1YWwgYXV0aGVudGljYXRpb24gZXJyb3I6IEh5cGVydHkgb3duZXIgY291bGQgbm90IGJlIHJlc29sdmVkJyk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAqIHJldHVybnMgdGhlIHJlcG9ydGVyIGFzc29jaWF0ZWQgdG8gdGhlIGRhdGFPYmplY3QgVVJMXHJcbiAgKiBAcGFyYW0gICB7U3RyaW5nfSAgIGRhdGFPYmplY3RVUkwgICAgICAgICBkYXRhT2JqZWN0IHVybFxyXG4gICogQHJldHVybiAgIHtTdHJpbmd9ICByZXBvcnRlciAgICAgICAgICAgICAgZGF0YU9iamVjdCB1cmwgcmVwb3J0ZXJcclxuICAqL1xyXG4gIC8qICBfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0KGRhdGFPYmplY3RVUkwpIHtcclxuICAgIGxvZy5pbmZvKCdfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0OmRhdGFPYmplY3RVUkwnLCBkYXRhT2JqZWN0VVJMKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IHNwbGl0ZWRVUkwgPSBkaXZpZGVVUkwoZGF0YU9iamVjdFVSTCk7XHJcbiAgICAgIGxldCBkb21haW4gPSBzcGxpdGVkVVJMLmRvbWFpbjtcclxuICAgICAgbGV0IGZpbmFsVVJMID0gX3RoaXMuX3BhcnNlTWVzc2FnZVVSTChkYXRhT2JqZWN0VVJMKTtcclxuXHJcbiAgICAgIC8vIGNoZWNrIGlmIGlzIHRoZSBjcmVhdG9yIG9mIHRoZSBoeXBlcnR5XHJcbiAgICAgIGxldCByZXBvcnRlclVSTCA9IF90aGlzLnJlZ2lzdHJ5LmdldFJlcG9ydGVyVVJMU3luY2hvbm91cyhmaW5hbFVSTCk7XHJcbiAgICAgIGxvZy5pbmZvKCdfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0OnJlcG9ydGVyVVJMJywgcmVwb3J0ZXJVUkwpO1xyXG5cclxuICAgICAgaWYgKHJlcG9ydGVyVVJMKSB7XHJcbiAgICAgICAgcmVzb2x2ZShyZXBvcnRlclVSTCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBhc3NvY2lhdGlvbiBmcm9tIGFuIGh5cGVydHlVUkwgdG8gdGhlIGRhdGFPYmplY3RcclxuICAgICAgICBsZXQgc3RvcmVkUmVwb3J0ZXJVUkwgPSBfdGhpcy5kYXRhT2JqZWN0c0lkZW50aXR5W2ZpbmFsVVJMXTtcclxuICAgICAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpzdG9yZWRSZXBvcnRlclVSTCcsIHN0b3JlZFJlcG9ydGVyVVJMKTtcclxuXHJcbiAgICAgICAgaWYgKHN0b3JlZFJlcG9ydGVyVVJMKSB7XHJcbiAgICAgICAgICByZXNvbHZlKHN0b3JlZFJlcG9ydGVyVVJMKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55IGh5cGVydHkgdGhhdCBzdWJzY3JpYmVkIHRoZSBkYXRhT2JqZWN0VVJMXHJcbiAgICAgICAgICBsZXQgc3Vic2NyaWJlckh5cGVydHkgPSBfdGhpcy5yZWdpc3RyeS5nZXREYXRhT2JqZWN0U3Vic2NyaWJlckh5cGVydHkoZGF0YU9iamVjdFVSTCk7XHJcbiAgICAgICAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpzdWJzY3JpYmVySHlwZXJ0eScsIHN1YnNjcmliZXJIeXBlcnR5KTtcclxuXHJcbiAgICAgICAgICBpZiAoc3Vic2NyaWJlckh5cGVydHkpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZShzdWJzY3JpYmVySHlwZXJ0eSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBzZWFyY2ggaW4gZG9tYWluIHJlZ2lzdHJ5IGZvciB0aGUgaHlwZXJ0eSBhc3NvY2lhdGVkIHRvIHRoZSBkYXRhT2JqZWN0XHJcbiAgICAgICAgICAgIC8vIHNlYXJjaCBpbiBjYXNlIGlzIGEgc3Vic2NyaWJlciB3aG8gd2FudHMgdG8ga25vdyB0aGUgcmVwb3J0ZXJcclxuICAgICAgICAgICAgX3RoaXMuX2NvcmVEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0UGVyVVJMKGZpbmFsVVJMLCBkb21haW4pLnRoZW4oZGF0YU9iamVjdCA9PiB7XHJcbiAgICAgICAgICAgICAgbG9nLmluZm8oJ19nZXRIeXBlcnR5RnJvbURhdGFPYmplY3Q6ZGF0YU9iamVjdCcsIGRhdGFPYmplY3QpO1xyXG4gICAgICAgICAgICAgIF90aGlzLmRhdGFPYmplY3RzSWRlbnRpdHlbZmluYWxVUkxdID0gZGF0YU9iamVjdC5yZXBvcnRlcjtcclxuICAgICAgICAgICAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpkYXRhT2JqZWN0LnJlcG9ydGVyJywgZGF0YU9iamVjdC5yZXBvcnRlcik7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhT2JqZWN0LnJlcG9ydGVyKTtcclxuICAgICAgICAgICAgfSwgZXJyID0+IHtcclxuICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9Ki9cclxuXHJcbiAgX3NlbmRSZXBvcnRlclNlc3Npb25LZXkobWVzc2FnZSwgY2hhdEtleXMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IHNlc3Npb25LZXlCdW5kbGUgPSBfdGhpcy5kYXRhT2JqZWN0U2Vzc2lvbktleXNbY2hhdEtleXMuZGF0YU9iamVjdFVSTF07XHJcbiAgICAgIGxldCByZXBvcnRlclNlc3Npb25LZXlNc2c7XHJcbiAgICAgIGxldCB2YWx1ZVRvRW5jcnlwdDtcclxuICAgICAgbGV0IHNlc3Npb25LZXk7XHJcbiAgICAgIGxldCBpdjtcclxuICAgICAgbGV0IHZhbHVlID0ge307XHJcblxyXG4gICAgICAvL2lmIHRoZXJlIGlzIG5vdCB5ZXQgYSBzZXNzaW9uIEtleSwgZ2VuZXJhdGVzIGEgbmV3IG9uZVxyXG4gICAgICBpZiAoIXNlc3Npb25LZXlCdW5kbGUpIHtcclxuICAgICAgICBzZXNzaW9uS2V5ID0gX3RoaXMuY3J5cHRvLmdlbmVyYXRlUmFuZG9tKCk7XHJcbiAgICAgICAgX3RoaXMuZGF0YU9iamVjdFNlc3Npb25LZXlzW2NoYXRLZXlzLmRhdGFPYmplY3RVUkxdID0ge3Nlc3Npb25LZXk6IHNlc3Npb25LZXksIGlzVG9FbmNyeXB0OiB0cnVlfTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lID0gY2hhdGtleXNUb1N0cmluZ0Nsb25lcihfdGhpcy5kYXRhT2JqZWN0U2Vzc2lvbktleXMpO1xyXG5cclxuICAgICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQoJ2RhdGFPYmplY3RTZXNzaW9uS2V5cycsIDAsIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgcmVqZWN0KCdPbiBfc2VuZFJlcG9ydGVyU2Vzc2lvbktleSBmcm9tIG1ldGhvZCBzdG9yYWdlTWFuYWdlci5zZXQoZGF0YU9iamVjdFNlc3Npb25LZXlzLi4uKSBlcnJvcjogJyArIGVycik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlc3Npb25LZXkgPSBzZXNzaW9uS2V5QnVuZGxlLnNlc3Npb25LZXk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdmFsdWVUb0VuY3J5cHQgPSBlbmNvZGUoe3ZhbHVlOiBlbmNvZGUoc2Vzc2lvbktleSksIGRhdGFPYmplY3RVUkw6IGNoYXRLZXlzLmRhdGFPYmplY3RVUkx9KTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnT24gX3NlbmRSZXBvcnRlclNlc3Npb25LZXkgZnJvbSBtZXRob2Qgc3RvcmFnZU1hbmFnZXIuc2V0IGVycm9yIHZhbHVlVG9FbmNyeXB0OiAnICsgZXJyKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaXYgPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVJVigpO1xyXG4gICAgICB2YWx1ZS5pdiA9IGVuY29kZShpdik7XHJcbiAgICAgIF90aGlzLmNyeXB0by5lbmNyeXB0QUVTKGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21TZXNzaW9uS2V5LCB2YWx1ZVRvRW5jcnlwdCwgaXYpLnRoZW4oZW5jcnlwdGVkVmFsdWUgPT4ge1xyXG5cclxuICAgICAgICByZXBvcnRlclNlc3Npb25LZXlNc2cgPSB7XHJcbiAgICAgICAgICB0eXBlOiAnaGFuZHNoYWtlJyxcclxuICAgICAgICAgIHRvOiBtZXNzYWdlLmZyb20sXHJcbiAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxyXG4gICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICBoYW5kc2hha2VQaGFzZTogJ3JlcG9ydGVyU2Vzc2lvbktleScsXHJcbiAgICAgICAgICAgIHZhbHVlOiBlbmNvZGUoZW5jcnlwdGVkVmFsdWUpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IGZpbHRlcmVkTWVzc2FnZSA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKHJlcG9ydGVyU2Vzc2lvbktleU1zZywgdmFsdWVUb0VuY3J5cHQgKyBpdiwgY2hhdEtleXMuaHlwZXJ0eUZyb20ubWVzc2FnZUluZm8pO1xyXG5cclxuICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmhhc2hITUFDKGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21IYXNoS2V5LCBmaWx0ZXJlZE1lc3NhZ2UpO1xyXG4gICAgICB9KS50aGVuKGhhc2hlZE1lc3NhZ2UgPT4ge1xyXG4gICAgICAgIGxldCB2YWx1ZVdpdGhIYXNoID0gZW5jb2RlKHt2YWx1ZTogcmVwb3J0ZXJTZXNzaW9uS2V5TXNnLmJvZHkudmFsdWUsIGhhc2g6IGVuY29kZShoYXNoZWRNZXNzYWdlKSwgaXY6IHZhbHVlLml2fSk7XHJcblxyXG4gICAgICAgIHJlcG9ydGVyU2Vzc2lvbktleU1zZy5ib2R5LnZhbHVlID0gdmFsdWVXaXRoSGFzaDtcclxuXHJcbiAgICAgICAgcmVzb2x2ZSh7bWVzc2FnZTogcmVwb3J0ZXJTZXNzaW9uS2V5TXNnLCBjaGF0S2V5czogY2hhdEtleXN9KTtcclxuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICByZWplY3QoJ09uIF9zZW5kUmVwb3J0ZXJTZXNzaW9uS2V5IGZyb20gY2hhaW5lZCBwcm9taXNlcyBlbmNyeXB0QUVTIGVycm9yOiAnICsgZXJyKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRnVuY3Rpb24gdGhhdCByZXNvbHZlIGFuZCBjcmVhdGUgdGhlIGRvbWFpblVSTCBpbiBjYXNlIGl0IGlzIHByb3ZpZGVkIG9uZS4gSWYgbm90LCByZXNvbHZlIHRoZSBkZWZhdWx0IGRvbWFpblVSTFxyXG4gICogQHBhcmFtIHtTdHJpbmd9ICAgICBpZHBEb21haW4gICAgIGlkcERvbWFpbiAoT3B0aW9uYWwpXHJcbiAgKi9cclxuICBfcmVzb2x2ZURvbWFpbihpZHBEb21haW4pIHtcclxuICAgIGlmICghaWRwRG9tYWluKSB7XHJcbiAgICAgIHJldHVybiAnZG9tYWluLWlkcDovL2dvb2dsZS5jb20nO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdkb21haW4taWRwOi8vJyArIGlkcERvbWFpbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9kb0hhbmRTaGFrZVBoYXNlKG1lc3NhZ2UsIGNoYXRLZXlzKSB7XHJcbiAgLy8gbG9nKCdfZG9IYW5kU2hha2VQaGFzZTpkYXRhT2JqZWN0JywgbWVzc2FnZSk7XHJcbiAgLy9cdGxvZygnX2RvSGFuZFNoYWtlUGhhc2U6Y2hhdEtleXMnLCBjaGF0S2V5cyk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsZXQgaGFuZHNoYWtlVHlwZSA9IG1lc3NhZ2UuYm9keS5oYW5kc2hha2VQaGFzZTtcclxuICAgICAgbGV0IGl2O1xyXG4gICAgICBsZXQgaGFzaDtcclxuICAgICAgbGV0IHZhbHVlID0ge307XHJcbiAgICAgIGxldCBmaWx0ZXJlZE1lc3NhZ2U7XHJcbiAgICAgIGxldCBwcml2YXRlS2V5SG9sZGVyO1xyXG5cclxuICAgICAgbG9nLmluZm8oJ2hhbmRzaGFrZSBwaGFzZTogJywgaGFuZHNoYWtlVHlwZSk7XHJcblxyXG4gICAgICBzd2l0Y2ggKGhhbmRzaGFrZVR5cGUpIHtcclxuXHJcbiAgICAgICAgY2FzZSAnc3RhcnRIYW5kU2hha2UnOiB7XHJcbiAgICAgICAgICBjaGF0S2V5cy5rZXlzLmZyb21SYW5kb20gPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVSYW5kb20oKTtcclxuICAgICAgICAgIGxldCBzdGFydEhhbmRTaGFrZU1zZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2hhbmRzaGFrZScsXHJcbiAgICAgICAgICAgIHRvOiBtZXNzYWdlLnRvLFxyXG4gICAgICAgICAgICBmcm9tOiBtZXNzYWdlLmZyb20sXHJcbiAgICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgICBoYW5kc2hha2VQaGFzZTogJ3NlbmRlckhlbGxvJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogZW5jb2RlKGNoYXRLZXlzLmtleXMuZnJvbVJhbmRvbSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIGNoYXRLZXlzLmhhbmRzaGFrZUhpc3Rvcnkuc2VuZGVySGVsbG8gPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChzdGFydEhhbmRTaGFrZU1zZywgdW5kZWZpbmVkLCBjaGF0S2V5cy5oeXBlcnR5RnJvbS5tZXNzYWdlSW5mbyk7XHJcblxyXG4gICAgICAgICAgLy8gY2hlY2sgaWYgd2FzIHRoZSBlbmNyeXB0IGZ1bmN0aW9uIG9yIHRoZSBtdXR1YWwgYXV0aGVudGljYXRpb24gdGhhdCByZXF1ZXN0IHRoZVxyXG4gICAgICAgICAgLy8gc3RhcnQgb2YgdGhlIGhhbmRTaGFrZVBoYXNlLlxyXG5cclxuICAgICAgICAgIGlmIChjaGF0S2V5cy5pbml0aWFsTWVzc2FnZSkge1xyXG4gICAgICAgICAgICByZXNvbHZlKHttZXNzYWdlOiBzdGFydEhhbmRTaGFrZU1zZywgY2hhdEtleXM6IGNoYXRLZXlzfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfdGhpcy5jaGF0S2V5c1ttZXNzYWdlLmZyb20gKyAnPC0+JyArIG1lc3NhZ2UudG9dID0gY2hhdEtleXM7XHJcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHN0YXJ0SGFuZFNoYWtlTXNnKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgJ3NlbmRlckhlbGxvJzoge1xyXG5cclxuICAgICAgICAgIGxvZy5sb2coJ3NlbmRlckhlbGxvJyk7XHJcbiAgICAgICAgICBjaGF0S2V5cy5oYW5kc2hha2VIaXN0b3J5LnNlbmRlckhlbGxvID0gX3RoaXMuX2ZpbHRlck1lc3NhZ2VUb0hhc2gobWVzc2FnZSk7XHJcbiAgICAgICAgICBjaGF0S2V5cy5rZXlzLmZyb21SYW5kb20gPSBkZWNvZGVUb1VpbnQ4QXJyYXkobWVzc2FnZS5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgIGNoYXRLZXlzLmtleXMudG9SYW5kb20gPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVSYW5kb20oKTtcclxuXHJcbiAgICAgICAgICBsZXQgc2VuZGVySGVsbG9Nc2cgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdoYW5kc2hha2UnLFxyXG4gICAgICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxyXG4gICAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxyXG4gICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgaGFuZHNoYWtlUGhhc2U6ICdyZWNlaXZlckhlbGxvJyxcclxuICAgICAgICAgICAgICB2YWx1ZTogZW5jb2RlKGNoYXRLZXlzLmtleXMudG9SYW5kb20pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICBjaGF0S2V5cy5oYW5kc2hha2VIaXN0b3J5LnJlY2VpdmVySGVsbG8gPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChzZW5kZXJIZWxsb01zZywgdW5kZWZpbmVkLCBjaGF0S2V5cy5oeXBlcnR5RnJvbS5tZXNzYWdlSW5mbyk7XHJcbiAgICAgICAgICByZXNvbHZlKHttZXNzYWdlOiBzZW5kZXJIZWxsb01zZywgY2hhdEtleXM6IGNoYXRLZXlzfSk7XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgJ3JlY2VpdmVySGVsbG8nOiB7XHJcblxyXG4gICAgICAgICAgbG9nLmxvZygncmVjZWl2ZXJIZWxsbycpO1xyXG4gICAgICAgICAgX3RoaXMuZ2V0TXlQcml2YXRlS2V5KCkudGhlbihwcml2YXRlS2V5ID0+e1xyXG4gICAgICAgICAgICBwcml2YXRlS2V5SG9sZGVyID0gcHJpdmF0ZUtleTtcclxuXHJcbiAgICAgICAgICAgIGNoYXRLZXlzLmhhbmRzaGFrZUhpc3RvcnkucmVjZWl2ZXJIZWxsbyA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9pZG0udmFsaWRhdGVBc3NlcnRpb24obWVzc2FnZS5ib2R5LmlkZW50aXR5LmFzc2VydGlvbiwgdW5kZWZpbmVkLCBtZXNzYWdlLmJvZHkuaWRlbnRpdHkuaWRwLmRvbWFpbik7XHJcbiAgICAgICAgICB9KS50aGVuKCh2YWx1ZSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgLy9UT0RPIHJlbW92ZSBsYXRlciB0aGlzIHZlcmlmaWNhdGlvbiBhcyBzb29uIGFzIGFsbCB0aGUgSWRQIHByb3h5IGFyZSB1cGRhdGVkIGluIHRoZSBleGFtcGxlXHJcbiAgICAgICAgICAgIGxldCBlbmNvZGVkcHVibGljS2V5ID0gKHR5cGVvZiB2YWx1ZS5jb250ZW50cyA9PT0gJ3N0cmluZycpID8gdmFsdWUuY29udGVudHMgOiB2YWx1ZS5jb250ZW50cy5ub25jZTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZWNlaXZlclB1YmxpY0tleSA9IHBhcnNlVG9VaW50OEFycmF5KGVuY29kZWRwdWJsaWNLZXkpO1xyXG4gICAgICAgICAgICBsZXQgcHJlbWFzdGVyU2VjcmV0ID0gX3RoaXMuY3J5cHRvLmdlbmVyYXRlUE1TKCk7XHJcbiAgICAgICAgICAgIGxldCB0b1JhbmRvbSA9IG1lc3NhZ2UuYm9keS52YWx1ZTtcclxuICAgICAgICAgICAgY2hhdEtleXMuaHlwZXJ0eVRvLmFzc2VydGlvbiA9IG1lc3NhZ2UuYm9keS5pZGVudGl0eS5hc3NlcnRpb247XHJcbiAgICAgICAgICAgIGNoYXRLZXlzLmh5cGVydHlUby5wdWJsaWNLZXkgPSByZWNlaXZlclB1YmxpY0tleTtcclxuICAgICAgICAgICAgY2hhdEtleXMuaHlwZXJ0eVRvLnVzZXJJRCAgICA9IG1lc3NhZ2UuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZS51c2VyVVJMO1xyXG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLnRvUmFuZG9tICA9IGRlY29kZVRvVWludDhBcnJheSh0b1JhbmRvbSk7XHJcbiAgICAgICAgICAgIGNoYXRLZXlzLmtleXMucHJlbWFzdGVyS2V5ID0gcHJlbWFzdGVyU2VjcmV0O1xyXG5cclxuICAgICAgICAgICAgbGV0IGNvbmNhdEtleSA9IF90aGlzLmNyeXB0by5jb25jYXRQTVN3aXRoUmFuZG9tcyhwcmVtYXN0ZXJTZWNyZXQsIGNoYXRLZXlzLmtleXMudG9SYW5kb20sIGNoYXRLZXlzLmtleXMuZnJvbVJhbmRvbSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmdlbmVyYXRlTWFzdGVyU2VjcmV0KGNvbmNhdEtleSwgJ21lc3NhZ2VIaXN0b3JpYycgKyBjaGF0S2V5cy5rZXlzLnRvUmFuZG9tICsgY2hhdEtleXMua2V5cy5mcm9tUmFuZG9tKTtcclxuXHJcbiAgICAgICAgICAgIC8vZ2VuZXJhdGUgdGhlIG1hc3RlciBrZXlcclxuICAgICAgICAgIH0pLnRoZW4oKG1hc3RlcktleSkgPT4ge1xyXG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLm1hc3RlcktleSA9IG1hc3RlcktleTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVLZXlzKG1hc3RlcktleSwgJ2tleSBleHBhbnNpb24nICsgY2hhdEtleXMua2V5cy50b1JhbmRvbSArIGNoYXRLZXlzLmtleXMuZnJvbVJhbmRvbSk7XHJcblxyXG4gICAgICAgICAgICAvL2dlbmVyYXRlIHRoZSBzeW1tZXRyaWMgYW5kIGhhc2gga2V5c1xyXG4gICAgICAgICAgfSkudGhlbigoa2V5cykgPT4ge1xyXG5cclxuICAgICAgICAgICAgY2hhdEtleXMua2V5cy5oeXBlcnR5VG9TZXNzaW9uS2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5c1swXSk7XHJcbiAgICAgICAgICAgIGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21TZXNzaW9uS2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5c1sxXSk7XHJcbiAgICAgICAgICAgIGNoYXRLZXlzLmtleXMuaHlwZXJ0eVRvSGFzaEtleSA9IG5ldyBVaW50OEFycmF5KGtleXNbMl0pO1xyXG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLmh5cGVydHlGcm9tSGFzaEtleSA9IG5ldyBVaW50OEFycmF5KGtleXNbM10pO1xyXG4gICAgICAgICAgICBpdiA9IF90aGlzLmNyeXB0by5nZW5lcmF0ZUlWKCk7XHJcbiAgICAgICAgICAgIHZhbHVlLml2ID0gZW5jb2RlKGl2KTtcclxuXHJcbiAgICAgICAgICAgIGxldCBtZXNzYWdlU3RydWN0dXJlID0ge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdoYW5kc2hha2UnLFxyXG4gICAgICAgICAgICAgIHRvOiBtZXNzYWdlLmZyb20sXHJcbiAgICAgICAgICAgICAgZnJvbTogbWVzc2FnZS50byxcclxuICAgICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgICBoYW5kc2hha2VQaGFzZTogJ3NlbmRlckNlcnRpZmljYXRlJ1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIC8vIGhhc2ggdGhlIHZhbHVlIGFuZCB0aGUgaXZcclxuICAgICAgICAgICAgZmlsdGVyZWRNZXNzYWdlID0gX3RoaXMuX2ZpbHRlck1lc3NhZ2VUb0hhc2gobWVzc2FnZVN0cnVjdHVyZSwgJ29rJyArIGl2LCBjaGF0S2V5cy5oeXBlcnR5RnJvbS5tZXNzYWdlSW5mbyk7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8uaGFzaEhNQUMoY2hhdEtleXMua2V5cy5oeXBlcnR5RnJvbUhhc2hLZXksIGZpbHRlcmVkTWVzc2FnZSk7XHJcbiAgICAgICAgICB9KS50aGVuKChoYXNoKSA9PiB7XHJcbiAgICAgICAgICAgIHZhbHVlLmhhc2ggPSBlbmNvZGUoaGFzaCk7XHJcblxyXG4gICAgICAgICAgICAvL2VuY3J5cHQgdGhlIGRhdGFcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by5lbmNyeXB0QUVTKGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21TZXNzaW9uS2V5LCAnb2snLCBpdik7XHJcbiAgICAgICAgICB9KS50aGVuKChlbmNyeXB0ZWREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHZhbHVlLnN5bWV0cmljRW5jcnlwdGlvbiA9IGVuY29kZShlbmNyeXB0ZWREYXRhKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8uZW5jcnlwdFJTQShjaGF0S2V5cy5oeXBlcnR5VG8ucHVibGljS2V5LCBjaGF0S2V5cy5rZXlzLnByZW1hc3RlcktleSk7XHJcblxyXG4gICAgICAgICAgfSkudGhlbigoZW5jcnlwdGVkVmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdmFsdWUuYXNzeW1ldHJpY0VuY3J5cHRpb24gPSBlbmNvZGUoZW5jcnlwdGVkVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgbGV0IG1lc3NhZ2VTdHJ1Y3R1cmUgPSB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ2hhbmRzaGFrZScsXHJcbiAgICAgICAgICAgICAgdG86IG1lc3NhZ2UuZnJvbSxcclxuICAgICAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxyXG4gICAgICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgICAgIGhhbmRzaGFrZVBoYXNlOiAnc2VuZGVyQ2VydGlmaWNhdGUnXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbGV0IG1lc3NhZ2VUb0hhc2ggPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChtZXNzYWdlU3RydWN0dXJlLCBjaGF0S2V5cy5rZXlzLnByZW1hc3RlcktleSwgY2hhdEtleXMuaHlwZXJ0eUZyb20ubWVzc2FnZUluZm8pO1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLnNpZ25SU0EocHJpdmF0ZUtleUhvbGRlciwgZW5jb2RlKGNoYXRLZXlzLmhhbmRzaGFrZUhpc3RvcnkpICsgZW5jb2RlKG1lc3NhZ2VUb0hhc2gpKTtcclxuICAgICAgICAgIH0pLnRoZW4oc2lnbmF0dXJlID0+IHtcclxuXHJcbiAgICAgICAgICAgIHZhbHVlLnNpZ25hdHVyZSA9IGVuY29kZShzaWduYXR1cmUpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHJlY2VpdmVySGVsbG9Nc2cgPSB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ2hhbmRzaGFrZScsXHJcbiAgICAgICAgICAgICAgdG86IG1lc3NhZ2UuZnJvbSxcclxuICAgICAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxyXG4gICAgICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgICAgIGhhbmRzaGFrZVBoYXNlOiAnc2VuZGVyQ2VydGlmaWNhdGUnLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGVuY29kZSh2YWx1ZSlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNoYXRLZXlzLmhhbmRzaGFrZUhpc3Rvcnkuc2VuZGVyQ2VydGlmaWNhdGUgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChyZWNlaXZlckhlbGxvTXNnLCAnb2snICsgaXYsIGNoYXRLZXlzLmh5cGVydHlGcm9tLm1lc3NhZ2VJbmZvKTtcclxuXHJcbiAgICAgICAgICAgIHJlc29sdmUoe21lc3NhZ2U6IHJlY2VpdmVySGVsbG9Nc2csIGNoYXRLZXlzOiBjaGF0S2V5c30pO1xyXG5cclxuICAgICAgICAgIH0sIGVycm9yID0+IHJlamVjdChlcnJvcikpO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlICdzZW5kZXJDZXJ0aWZpY2F0ZSc6IHtcclxuXHJcbiAgICAgICAgICBsb2cubG9nKCdzZW5kZXJDZXJ0aWZpY2F0ZScpO1xyXG5cclxuICAgICAgICAgIGxldCByZWNlaXZlZFZhbHVlID0gZGVjb2RlKG1lc3NhZ2UuYm9keS52YWx1ZSk7XHJcblxyXG4gICAgICAgICAgX3RoaXMuZ2V0TXlQcml2YXRlS2V5KCkudGhlbihwcml2YXRlS2V5ID0+e1xyXG4gICAgICAgICAgICBwcml2YXRlS2V5SG9sZGVyID0gcHJpdmF0ZUtleTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5faWRtLnZhbGlkYXRlQXNzZXJ0aW9uKG1lc3NhZ2UuYm9keS5pZGVudGl0eS5hc3NlcnRpb24sIHVuZGVmaW5lZCwgbWVzc2FnZS5ib2R5LmlkZW50aXR5LmlkcC5kb21haW4pO1xyXG4gICAgICAgICAgfSkudGhlbigodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgbGV0IGVuY3J5cHRlZFBNUyA9IGRlY29kZVRvVWludDhBcnJheShyZWNlaXZlZFZhbHVlLmFzc3ltZXRyaWNFbmNyeXB0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIC8vVE9ETyByZW1vdmUgbGF0ZXIgdGhpcyB2ZXJpZmljYXRpb24gYXMgc29vbiBhcyBhbGwgdGhlIElkUCBwcm94eSBhcmUgdXBkYXRlZCBpbiB0aGUgZXhhbXBsZVxyXG4gICAgICAgICAgICBsZXQgZW5jb2RlZHB1YmxpY0tleSA9ICh0eXBlb2YgdmFsdWUuY29udGVudHMgPT09ICdzdHJpbmcnKSA/IHZhbHVlLmNvbnRlbnRzIDogdmFsdWUuY29udGVudHMubm9uY2U7XHJcblxyXG4gICAgICAgICAgICBsZXQgc2VuZGVyUHVibGljS2V5ID0gcGFyc2VUb1VpbnQ4QXJyYXkoZW5jb2RlZHB1YmxpY0tleSk7XHJcbiAgICAgICAgICAgIGNoYXRLZXlzLmh5cGVydHlUby5hc3NlcnRpb24gPSBtZXNzYWdlLmJvZHkuaWRlbnRpdHkuYXNzZXJ0aW9uO1xyXG4gICAgICAgICAgICBjaGF0S2V5cy5oeXBlcnR5VG8ucHVibGljS2V5ID0gc2VuZGVyUHVibGljS2V5O1xyXG4gICAgICAgICAgICBjaGF0S2V5cy5oeXBlcnR5VG8udXNlcklEICAgID0gbWVzc2FnZS5ib2R5LmlkZW50aXR5LnVzZXJQcm9maWxlLnVzZXJVUkw7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmRlY3J5cHRSU0EocHJpdmF0ZUtleUhvbGRlciwgZW5jcnlwdGVkUE1TKTtcclxuXHJcbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgLy8gbG9nLmxvZyhlcnJvcik7XHJcbiAgICAgICAgICAgIHJlamVjdCgnRXJyb3IgZHVyaW5nIGF1dGhlbnRpY2F0aW9uIG9mIGlkZW50aXR5OiAnLCBlcnJvci5tZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICAgIC8vb2J0YWluIHRoZSBQcmVtYXN0ZXJLZXkgdXNpbmcgdGhlIHByaXZhdGUga2V5XHJcbiAgICAgICAgICB9KS50aGVuKHBtcyA9PiB7XHJcblxyXG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLnByZW1hc3RlcktleSA9IG5ldyBVaW50OEFycmF5KHBtcyk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc2lnbmF0dXJlID0gZGVjb2RlVG9VaW50OEFycmF5KHJlY2VpdmVkVmFsdWUuc2lnbmF0dXJlKTtcclxuXHJcbiAgICAgICAgICAgIGxldCByZWNlaXZlZG1zZ1RvSGFzaCA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIGNoYXRLZXlzLmtleXMucHJlbWFzdGVyS2V5KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8udmVyaWZ5UlNBKGNoYXRLZXlzLmh5cGVydHlUby5wdWJsaWNLZXksIGVuY29kZShjaGF0S2V5cy5oYW5kc2hha2VIaXN0b3J5KSArIGVuY29kZShyZWNlaXZlZG1zZ1RvSGFzaCksIHNpZ25hdHVyZSk7XHJcblxyXG4gICAgICAgICAgICAvLyB2YWxpZGF0ZXMgdGhlIHNpZ25hdHVyZSByZWNlaXZlZFxyXG4gICAgICAgICAgfSkudGhlbihzaWduVmFsaWRhdGlvblJlc3VsdCA9PiB7XHJcblxyXG4gICAgICAgICAgICAvL2xvZy5sb2coJ1NlbmRlckNlcnRpZmljYXRlIC0gc2lnbmF0dXJlIHZhbGlkYXRpb24gcmVzdWx0ICcsIHNpZ25WYWxpZGF0aW9uUmVzdWx0KTtcclxuICAgICAgICAgICAgbGV0IGNvbmNhdEtleSA9IF90aGlzLmNyeXB0by5jb25jYXRQTVN3aXRoUmFuZG9tcyhjaGF0S2V5cy5rZXlzLnByZW1hc3RlcktleSwgY2hhdEtleXMua2V5cy50b1JhbmRvbSwgY2hhdEtleXMua2V5cy5mcm9tUmFuZG9tKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVNYXN0ZXJTZWNyZXQoY29uY2F0S2V5LCAnbWVzc2FnZUhpc3RvcmljJyArIGNoYXRLZXlzLmtleXMudG9SYW5kb20gKyBjaGF0S2V5cy5rZXlzLmZyb21SYW5kb20pO1xyXG5cclxuICAgICAgICAgICAgLy8gZ2VuZXJhdGVzIHRoZSBtYXN0ZXIga2V5cyBmcm9tIHRoZSBQcmVtYXN0ZXIga2V5IGFuZCB0aGUgcmFuZG9tc1xyXG4gICAgICAgICAgfSkudGhlbihtYXN0ZXJLZXkgPT4ge1xyXG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLm1hc3RlcktleSA9IG1hc3RlcktleTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVLZXlzKG1hc3RlcktleSwgJ2tleSBleHBhbnNpb24nICsgY2hhdEtleXMua2V5cy50b1JhbmRvbSArIGNoYXRLZXlzLmtleXMuZnJvbVJhbmRvbSk7XHJcblxyXG4gICAgICAgICAgICAvLyBnZW5lcmF0ZXMgdGhlIHN5bW1ldHJpYyBrZXlzIHRvIGJlIHVzZWQgaW4gdGhlIHN5bW1ldHJpYyBlbmNyeXB0aW9uXHJcbiAgICAgICAgICB9KS50aGVuKGtleXMgPT4ge1xyXG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLmh5cGVydHlGcm9tU2Vzc2lvbktleSA9IG5ldyBVaW50OEFycmF5KGtleXNbMF0pO1xyXG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLmh5cGVydHlUb1Nlc3Npb25LZXkgPSBuZXcgVWludDhBcnJheShrZXlzWzFdKTtcclxuICAgICAgICAgICAgY2hhdEtleXMua2V5cy5oeXBlcnR5RnJvbUhhc2hLZXkgPSBuZXcgVWludDhBcnJheShrZXlzWzJdKTtcclxuICAgICAgICAgICAgY2hhdEtleXMua2V5cy5oeXBlcnR5VG9IYXNoS2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5c1szXSk7XHJcbiAgICAgICAgICAgIGl2ID0gZGVjb2RlVG9VaW50OEFycmF5KHJlY2VpdmVkVmFsdWUuaXYpO1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGRlY29kZVRvVWludDhBcnJheShyZWNlaXZlZFZhbHVlLnN5bWV0cmljRW5jcnlwdGlvbik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmRlY3J5cHRBRVMoY2hhdEtleXMua2V5cy5oeXBlcnR5VG9TZXNzaW9uS2V5LCBkYXRhLCBpdik7XHJcblxyXG4gICAgICAgICAgfSkudGhlbihkZWNyeXB0ZWREYXRhID0+IHtcclxuICAgICAgICAgICAgLy8gbG9nLmxvZygnZGVjcnlwdGVkRGF0YScsIGRlY3J5cHRlZERhdGEpO1xyXG5cclxuICAgICAgICAgICAgY2hhdEtleXMuaGFuZHNoYWtlSGlzdG9yeS5zZW5kZXJDZXJ0aWZpY2F0ZSA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIGRlY3J5cHRlZERhdGEgKyBpdik7XHJcblxyXG4gICAgICAgICAgICBsZXQgaGFzaFJlY2VpdmVkID0gZGVjb2RlVG9VaW50OEFycmF5KHJlY2VpdmVkVmFsdWUuaGFzaCk7XHJcblxyXG4gICAgICAgICAgICBmaWx0ZXJlZE1lc3NhZ2UgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChtZXNzYWdlLCBkZWNyeXB0ZWREYXRhICsgaXYpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by52ZXJpZnlITUFDKGNoYXRLZXlzLmtleXMuaHlwZXJ0eVRvSGFzaEtleSwgZmlsdGVyZWRNZXNzYWdlLCBoYXNoUmVjZWl2ZWQpO1xyXG5cclxuICAgICAgICAgIH0pLnRoZW4odmVyaWZpZWRIYXNoICA9PiB7XHJcblxyXG4gICAgICAgICAgICAvLyBsb2cubG9nKCdyZXN1bHQgb2YgaGFzaCB2ZXJpZmljYXRpb24gJywgdmVyaWZpZWRIYXNoKTtcclxuICAgICAgICAgICAgbGV0IHJlY2VpdmVyRmluaXNoZWRNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdoYW5kc2hha2UnLFxyXG4gICAgICAgICAgICAgIHRvOiBtZXNzYWdlLmZyb20sXHJcbiAgICAgICAgICAgICAgZnJvbTogbWVzc2FnZS50byxcclxuICAgICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgICBoYW5kc2hha2VQaGFzZTogJ3JlY2VpdmVyRmluaXNoZWRNZXNzYWdlJ1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaXYgPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVJVigpO1xyXG4gICAgICAgICAgICB2YWx1ZS5pdiA9IGVuY29kZShpdik7XHJcblxyXG4gICAgICAgICAgICBmaWx0ZXJlZE1lc3NhZ2UgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChyZWNlaXZlckZpbmlzaGVkTWVzc2FnZSwgJ29rIScgKyBpdiwgY2hhdEtleXMuaHlwZXJ0eUZyb20ubWVzc2FnZUluZm8pO1xyXG5cclxuICAgICAgICAgICAgLy9sb2cubG9nKCdUSUFHTzogZG9IYW5kU2hha2VQaGFzZSB2ZXJpZmllZEhhc2gnKTtcclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by5oYXNoSE1BQyhjaGF0S2V5cy5rZXlzLmh5cGVydHlGcm9tSGFzaEtleSwgZmlsdGVyZWRNZXNzYWdlKTtcclxuICAgICAgICAgIH0pLnRoZW4oaGFzaCA9PiB7XHJcblxyXG4gICAgICAgICAgICB2YWx1ZS5oYXNoID0gZW5jb2RlKGhhc2gpO1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmVuY3J5cHRBRVMoY2hhdEtleXMua2V5cy5oeXBlcnR5RnJvbVNlc3Npb25LZXksICdvayEnLCBpdik7XHJcblxyXG4gICAgICAgICAgfSkudGhlbihlbmNyeXB0ZWRWYWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIHZhbHVlLnZhbHVlID0gZW5jb2RlKGVuY3J5cHRlZFZhbHVlKTtcclxuICAgICAgICAgICAgbGV0IHJlY2VpdmVyRmluaXNoZWRNZXNzYWdlID0ge1xyXG4gICAgICAgICAgICAgIHR5cGU6ICdoYW5kc2hha2UnLFxyXG4gICAgICAgICAgICAgIHRvOiBtZXNzYWdlLmZyb20sXHJcbiAgICAgICAgICAgICAgZnJvbTogbWVzc2FnZS50byxcclxuICAgICAgICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICAgICAgICBoYW5kc2hha2VQaGFzZTogJ3JlY2VpdmVyRmluaXNoZWRNZXNzYWdlJyxcclxuICAgICAgICAgICAgICAgIHZhbHVlOiBlbmNvZGUodmFsdWUpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY2hhdEtleXMuaGFuZHNoYWtlSGlzdG9yeS5yZWNlaXZlckZpbmlzaGVkTWVzc2FnZSA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKHJlY2VpdmVyRmluaXNoZWRNZXNzYWdlLCAnb2shJyArIGl2LCBjaGF0S2V5cy5oeXBlcnR5RnJvbS5tZXNzYWdlSW5mbyk7XHJcbiAgICAgICAgICAgIGNoYXRLZXlzLmF1dGhlbnRpY2F0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXNvbHZlKHttZXNzYWdlOiByZWNlaXZlckZpbmlzaGVkTWVzc2FnZSwgY2hhdEtleXM6IGNoYXRLZXlzfSk7XHJcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoJ09uIF9kb0hhbmRTaGFrZVBoYXNlIGZyb20gc2VuZGVyQ2VydGlmaWNhdGUgZXJyb3I6ICcgKyBlcnIpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgJ3JlY2VpdmVyRmluaXNoZWRNZXNzYWdlJzoge1xyXG5cclxuICAgICAgICAgIGNoYXRLZXlzLmF1dGhlbnRpY2F0ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIHZhbHVlID0gZGVjb2RlKG1lc3NhZ2UuYm9keS52YWx1ZSk7XHJcblxyXG4gICAgICAgICAgaXYgPSBkZWNvZGVUb1VpbnQ4QXJyYXkodmFsdWUuaXYpO1xyXG4gICAgICAgICAgbGV0IGRhdGEgPSBkZWNvZGVUb1VpbnQ4QXJyYXkodmFsdWUudmFsdWUpO1xyXG4gICAgICAgICAgaGFzaCA9IGRlY29kZVRvVWludDhBcnJheSh2YWx1ZS5oYXNoKTtcclxuXHJcbiAgICAgICAgICBfdGhpcy5jcnlwdG8uZGVjcnlwdEFFUyhjaGF0S2V5cy5rZXlzLmh5cGVydHlUb1Nlc3Npb25LZXksIGRhdGEsIGl2KS50aGVuKGRlY3J5cHRlZERhdGEgPT4ge1xyXG4gICAgICAgICAgICAvLyBsb2cubG9nKCdkZWNyeXB0ZWREYXRhJywgZGVjcnlwdGVkRGF0YSk7XHJcbiAgICAgICAgICAgIGNoYXRLZXlzLmhhbmRzaGFrZUhpc3RvcnkucmVjZWl2ZXJGaW5pc2hlZE1lc3NhZ2UgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChtZXNzYWdlLCBkZWNyeXB0ZWREYXRhICsgaXYpO1xyXG5cclxuICAgICAgICAgICAgbGV0IGZpbHRlcmVkTWVzc2FnZSA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIGRlY3J5cHRlZERhdGEgKyBpdik7XHJcbiAgICAgICAgICAgIF90aGlzLmNyeXB0by52ZXJpZnlITUFDKGNoYXRLZXlzLmtleXMuaHlwZXJ0eVRvSGFzaEtleSwgZmlsdGVyZWRNZXNzYWdlLCBoYXNoKS50aGVuKHJlc3VsdCA9PiB7XHJcblxyXG4gICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIHdhcyBhbiBpbml0aWFsIG1lc3NhZ2UgdGhhdCB3YXMgYmxvY2tlZCBhbmQgc2VuZCBpdFxyXG4gICAgICAgICAgICAgIGlmIChjaGF0S2V5cy5pbml0aWFsTWVzc2FnZSkge1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsTWVzc2FnZSA9IHtcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXHJcbiAgICAgICAgICAgICAgICAgIHRvOiBtZXNzYWdlLmZyb20sXHJcbiAgICAgICAgICAgICAgICAgIGZyb206IG1lc3NhZ2UudG8sXHJcbiAgICAgICAgICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2hhdEtleXMuaW5pdGlhbE1lc3NhZ2UuYm9keS52YWx1ZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIHJlc29sdmUoe21lc3NhZ2U6IGluaXRpYWxNZXNzYWdlLCBjaGF0S2V5czogY2hhdEtleXN9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvL3NlbmRzIHRoZSBzZXNzaW9uS2V5IHRvIHRoZSBzdWJzY3JpYmVyIGh5cGVydHlcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3NlbmRSZXBvcnRlclNlc3Npb25LZXkobWVzc2FnZSwgY2hhdEtleXMpLnRoZW4odmFsdWUgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZWplY3QoJ09uIF9kb0hhbmRTaGFrZVBoYXNlIGZyb20gcmVjZWl2ZXJGaW5pc2hlZE1lc3NhZ2UgZXJyb3I6ICcgKyBlcnIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FzZSAncmVwb3J0ZXJTZXNzaW9uS2V5Jzoge1xyXG5cclxuICAgICAgICAgIGxvZy5sb2coJ3JlcG9ydGVyU2Vzc2lvbktleScpO1xyXG5cclxuICAgICAgICAgIGxldCB2YWx1ZUlWYW5kSGFzaCA9IGRlY29kZShtZXNzYWdlLmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgaGFzaCA9IGRlY29kZVRvVWludDhBcnJheSh2YWx1ZUlWYW5kSGFzaC5oYXNoKTtcclxuICAgICAgICAgIGl2ID0gZGVjb2RlVG9VaW50OEFycmF5KHZhbHVlSVZhbmRIYXNoLml2KTtcclxuICAgICAgICAgIGxldCBlbmNyeXB0ZWRWYWx1ZSA9IGRlY29kZVRvVWludDhBcnJheSh2YWx1ZUlWYW5kSGFzaC52YWx1ZSk7XHJcbiAgICAgICAgICBsZXQgcGFyc2VkVmFsdWU7XHJcbiAgICAgICAgICBsZXQgc2Vzc2lvbktleTtcclxuICAgICAgICAgIGxldCBkYXRhT2JqZWN0VVJMO1xyXG4gICAgICAgICAgbGV0IHJlY2VpdmVyQWNrbm93bGVkZ2VNc2c7XHJcblxyXG4gICAgICAgICAgLy9sb2cubG9nKCdbSWRlbnRpdHlNb2R1bGUgcmVwb3J0ZXJTZXNzaW9uS2V5XSAtIGRlY3J5cHRBRVM6ICcsIGNoYXRLZXlzLmtleXMuaHlwZXJ0eVRvU2Vzc2lvbktleSwgZW5jcnlwdGVkVmFsdWUsIGl2KTtcclxuXHJcbiAgICAgICAgICBfdGhpcy5jcnlwdG8uZGVjcnlwdEFFUyhjaGF0S2V5cy5rZXlzLmh5cGVydHlUb1Nlc3Npb25LZXksIGVuY3J5cHRlZFZhbHVlLCBpdikudGhlbihkZWNyeXB0ZWRWYWx1ZSA9PiB7XHJcblxyXG4gICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IGRlY29kZShkZWNyeXB0ZWRWYWx1ZSk7XHJcbiAgICAgICAgICAgIHNlc3Npb25LZXkgPSBkZWNvZGVUb1VpbnQ4QXJyYXkocGFyc2VkVmFsdWUudmFsdWUpO1xyXG4gICAgICAgICAgICBkYXRhT2JqZWN0VVJMID0gcGFyc2VkVmFsdWUuZGF0YU9iamVjdFVSTDtcclxuXHJcbiAgICAgICAgICAgIGxldCBtZXNzYWdlVG9IYXNoID0gX3RoaXMuX2ZpbHRlck1lc3NhZ2VUb0hhc2gobWVzc2FnZSwgZGVjcnlwdGVkVmFsdWUgKyBpdik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLnZlcmlmeUhNQUMoY2hhdEtleXMua2V5cy5oeXBlcnR5VG9IYXNoS2V5LCBtZXNzYWdlVG9IYXNoLCBoYXNoKTtcclxuXHJcbiAgICAgICAgICB9KS50aGVuKGhhc2hSZXN1bHQgPT4ge1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ2hhc2ggc3VjY2Vzc2Z1bGx5IHZhbGlkYXRlZCAnLCBoYXNoUmVzdWx0KTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLmRhdGFPYmplY3RTZXNzaW9uS2V5c1tkYXRhT2JqZWN0VVJMXSA9ICB7c2Vzc2lvbktleTogc2Vzc2lvbktleSwgaXNUb0VuY3J5cHQ6IHRydWV9O1xyXG4gICAgICAgICAgICBsZXQgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmUgPSBjaGF0a2V5c1RvU3RyaW5nQ2xvbmVyKF90aGlzLmRhdGFPYmplY3RTZXNzaW9uS2V5cyk7XHJcbiAgICAgICAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldCgnZGF0YU9iamVjdFNlc3Npb25LZXlzJywgMCwgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmUpLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KCdPbiBfc2VuZFJlcG9ydGVyU2Vzc2lvbktleSBmcm9tIG1ldGhvZCByZXBvcnRlclNlc3Npb25LZXkgZXJyb3I6ICcgKyBlcnIpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGl2ID0gX3RoaXMuY3J5cHRvLmdlbmVyYXRlSVYoKTtcclxuICAgICAgICAgICAgdmFsdWUuaXYgPSBlbmNvZGUoaXYpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by5lbmNyeXB0QUVTKGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21TZXNzaW9uS2V5LCAnb2shIScsIGl2KTtcclxuICAgICAgICAgIH0pLnRoZW4oZW5jcnlwdGVkVmFsdWUgPT4ge1xyXG5cclxuICAgICAgICAgICAgcmVjZWl2ZXJBY2tub3dsZWRnZU1zZyA9IHtcclxuICAgICAgICAgICAgICB0eXBlOiAnaGFuZHNoYWtlJyxcclxuICAgICAgICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxyXG4gICAgICAgICAgICAgIGZyb206IG1lc3NhZ2UudG8sXHJcbiAgICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgICAgaGFuZHNoYWtlUGhhc2U6ICdyZWNlaXZlckFja25vd2xlZGdlJ1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHZhbHVlLnZhbHVlID0gZW5jb2RlKGVuY3J5cHRlZFZhbHVlKTtcclxuICAgICAgICAgICAgbGV0IG1lc3NhZ2VUb0hhc2ggPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChyZWNlaXZlckFja25vd2xlZGdlTXNnLCAnb2shIScgKyBpdiwgY2hhdEtleXMuaHlwZXJ0eUZyb20ubWVzc2FnZUluZm8pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by5oYXNoSE1BQyhjaGF0S2V5cy5rZXlzLmh5cGVydHlGcm9tSGFzaEtleSwgbWVzc2FnZVRvSGFzaCk7XHJcbiAgICAgICAgICB9KS50aGVuKGhhc2hlZE1lc3NhZ2UgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZmluYWxWYWx1ZSA9IGVuY29kZSh7dmFsdWU6IHZhbHVlLnZhbHVlLCBoYXNoOiBlbmNvZGUoaGFzaGVkTWVzc2FnZSksIGl2OiB2YWx1ZS5pdn0pO1xyXG5cclxuICAgICAgICAgICAgcmVjZWl2ZXJBY2tub3dsZWRnZU1zZy5ib2R5LnZhbHVlID0gZmluYWxWYWx1ZTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh7bWVzc2FnZTogcmVjZWl2ZXJBY2tub3dsZWRnZU1zZywgY2hhdEtleXM6IGNoYXRLZXlzfSk7XHJcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoJ09uIF9kb0hhbmRTaGFrZVBoYXNlIGZyb20gcmVwb3J0ZXJTZXNzaW9uS2V5IGVycm9yOiAnICsgZXJyKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FzZSAncmVjZWl2ZXJBY2tub3dsZWRnZSc6IHtcclxuXHJcbiAgICAgICAgICBsb2cubG9nKCdyZWNlaXZlckFja25vd2xlZGdlJyk7XHJcblxyXG4gICAgICAgICAgbGV0IHJlY2VpdmVkdmFsdWVJVmFuZEhhc2ggPSBkZWNvZGUobWVzc2FnZS5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgIGxldCByZWNlaXZlZEhhc2ggPSBkZWNvZGVUb1VpbnQ4QXJyYXkocmVjZWl2ZWR2YWx1ZUlWYW5kSGFzaC5oYXNoKTtcclxuICAgICAgICAgIGl2ID0gZGVjb2RlVG9VaW50OEFycmF5KHJlY2VpdmVkdmFsdWVJVmFuZEhhc2guaXYpO1xyXG4gICAgICAgICAgbGV0IHJlY2VpdmVkRW5jcnlwdGVkVmFsdWUgPSBkZWNvZGVUb1VpbnQ4QXJyYXkocmVjZWl2ZWR2YWx1ZUlWYW5kSGFzaC52YWx1ZSk7XHJcblxyXG4gICAgICAgICAgX3RoaXMuY3J5cHRvLmRlY3J5cHRBRVMoY2hhdEtleXMua2V5cy5oeXBlcnR5VG9TZXNzaW9uS2V5LCByZWNlaXZlZEVuY3J5cHRlZFZhbHVlLCBpdikudGhlbihkZWNyeXB0ZWRWYWx1ZSA9PiB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZmlsdGVyZWRNZXNzYWdlID0gX3RoaXMuX2ZpbHRlck1lc3NhZ2VUb0hhc2gobWVzc2FnZSwgZGVjcnlwdGVkVmFsdWUgKyBpdik7XHJcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8udmVyaWZ5SE1BQyhjaGF0S2V5cy5rZXlzLmh5cGVydHlUb0hhc2hLZXksIGZpbHRlcmVkTWVzc2FnZSwgcmVjZWl2ZWRIYXNoKTtcclxuICAgICAgICAgIH0pLnRoZW4oaGFzaFJlc3VsdCA9PiB7XHJcbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ2hhc2hSZXN1bHQgJywgaGFzaFJlc3VsdCk7XHJcblxyXG4gICAgICAgICAgICBsZXQgY2FsbGJhY2sgPSBjaGF0S2V5cy5jYWxsYmFjaztcclxuXHJcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgIGNhbGxiYWNrKCdoYW5kU2hha2VFbmQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNvbHZlKCdoYW5kU2hha2VFbmQnKTtcclxuICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdCgnT24gX2RvSGFuZFNoYWtlUGhhc2UgZnJvbSByZWNlaXZlckFja25vd2xlZGdlIGVycm9yOiAnICsgZXJyKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHJlamVjdChtZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZpbHRlciB0aGUgbWVzc2FnZXMgdG8gaGFzaCwgYnkgcmVtb3Zpbmcgc29tZSBmaWVsZHMgbm90IGdlbmVyYXRlZCBieSB0aGUgcnVudGltZSBjb3JlXHJcbiAgKiBAcGFyYW0ge01lc3NhZ2V9ICBtZXNzYWdlICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVxyXG4gICogQHBhcmFtIHtTdHJpbmd9ICBkZWNyeXB0ZWRWYWx1ZSAoT3B0aW9uYWwpICAgIHZhbHVlIGZyb20gYm9keS52YWx1ZSBpbiBjYXNlIGl0IG9yaWdpbmFsbHkgY29tZXMgZW5jcnlwdGVkXHJcbiAgKiBAcGFyYW0ge0pTT059ICBpZGVudGl0eShPcHRpb25hbCkgICAgYWRkIHRoZSBoeXBlcnR5IGlkZW50aXR5IGFzc29jaWF0ZWQgaW4gY2FzZSBpcyBub3QgYWRkZWQgdG8gdGhlIGluaXRpYWwgbWVzc2FnZVxyXG4gICogQHJldHVybiB7TWVzc2FnZX0gIG5ldyBtZXNzYWdlIGZpbHRlcmVkXHJcbiAgKi9cclxuICBfZmlsdGVyTWVzc2FnZVRvSGFzaChtZXNzYWdlLCBkZWNyeXB0ZWRWYWx1ZSwgaWRlbnRpdHkpIHtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0eXBlOiBtZXNzYWdlLnR5cGUsXHJcbiAgICAgIGZyb206IG1lc3NhZ2UuZnJvbSxcclxuICAgICAgdG86IG1lc3NhZ2UudG8sXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICBpZGVudGl0eTogaWRlbnRpdHkgfHwgbWVzc2FnZS5ib2R5LmlkZW50aXR5LFxyXG4gICAgICAgIHZhbHVlOiBkZWNyeXB0ZWRWYWx1ZSB8fCBtZXNzYWdlLmJvZHkudmFsdWUsXHJcbiAgICAgICAgaGFuZHNoYWtlUGhhc2U6IG1lc3NhZ2UuYm9keS5oYW5kc2hha2VQaGFzZVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBnZW5lcmF0ZXMgdGhlIGluaXRpYWwgc3RydWN0dXJlIGZvciB0aGUga2V5cyBiZXR3ZWVuIHR3byB1c2Vyc1xyXG4gICogQHBhcmFtIHtKU09OfSAgICBtZXNzYWdlICAgICAgICAgICAgICBpbml0aWFsIG1lc3NhZ2UgdGhhdCB0cmlnZ2VycyB0aGUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uXHJcbiAgKiBAcGFyYW0ge1N0cmluZ30gIHVzZXJVUkwgICAgICAgICAgICAgIHVzZXJVUkxcclxuICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVjZWl2ZXIoT3B0aW9uYWwpICBpbmRpY2F0ZXMgaWYgaXMgdGhlIHNlbmRlciBvciB0aGUgcmVjZWl2ZXIgdGhhdCBjcmVhdGVzIGEgbmV3IGNoYXQgY3J5cHRvXHJcbiAgKiBAcmV0dXJuIHtKU09OfSBuZXdDaGF0Q3J5cHRvICBuZXcgSlNPTiBzdHJ1Y3R1cmUgZm9yIHRoZSBjaGF0IGNyeXB0b1xyXG4gICovXHJcbiAgX25ld0NoYXRDcnlwdG8obWVzc2FnZSwgdXNlclVSTCwgcmVjZWl2ZXIpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy9jaGVjayB3aGV0aGVyIGlzIHRoZSBzZW5kZXIgb3IgdGhlIHJlY2VpdmVyIHRvIGNyZWF0ZSBhIG5ldyBjaGF0Q3J5cHRvXHJcbiAgICAvL3RvIG1hbnRhaW4gY29uc2lzdGVuY3kgb24gdGhlIGtleXMgaWYgdGhlIHJlY2VpdmVyIGNyZWF0ZSBhIG5ldyBjaGF0Q3J5cHRvLFxyXG4gICAgLy90aGVuIGludmVydCB0aGUgZmllbGRzXHJcbiAgICBsZXQgZnJvbSA9IChyZWNlaXZlcikgPyBtZXNzYWdlLnRvIDogbWVzc2FnZS5mcm9tO1xyXG4gICAgbGV0IHRvID0gKHJlY2VpdmVyKSA/IG1lc3NhZ2UuZnJvbSA6IG1lc3NhZ2UudG87XHJcblxyXG4gICAgbGV0IHVzZXJJbmZvID0gX3RoaXMuX2lkbS5nZXRJZGVudGl0eSh1c2VyVVJMKTtcclxuXHJcbiAgICBsZXQgbmV3Q2hhdENyeXB0byA9XHJcbiAgICAgIHtcclxuICAgICAgICBoeXBlcnR5RnJvbTpcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoeXBlcnR5OiBmcm9tLFxyXG4gICAgICAgICAgdXNlcklEOiB1c2VySW5mby51c2VyUHJvZmlsZS51c2VyVVJMLFxyXG5cclxuICAgICAgICAgIC8vcHJpdmF0ZUtleTogXCJnZXRNeVB1YmxpY0tleVwiLFxyXG4gICAgICAgICAgLy9wdWJsaWNLZXk6IFwiZ2V0TXlQcml2YXRlS2V5XCIsXHJcbiAgICAgICAgICBhc3NlcnRpb246IHVzZXJJbmZvLmFzc2VydGlvbixcclxuICAgICAgICAgIG1lc3NhZ2VJbmZvOiB1c2VySW5mb1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaHlwZXJ0eVRvOlxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGh5cGVydHk6IHRvLFxyXG4gICAgICAgICAgdXNlcklEOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICBwdWJsaWNLZXk6IHVuZGVmaW5lZCxcclxuICAgICAgICAgIGFzc2VydGlvbjogdW5kZWZpbmVkXHJcbiAgICAgICAgfSxcclxuICAgICAgICBrZXlzOlxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGh5cGVydHlUb1Nlc3Npb25LZXk6IHVuZGVmaW5lZCxcclxuICAgICAgICAgIGh5cGVydHlGcm9tU2Vzc2lvbktleTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgaHlwZXJ0eVRvSGFzaEtleTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgaHlwZXJ0eUZyb21IYXNoS2V5OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICB0b1JhbmRvbTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgZnJvbVJhbmRvbTogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgcHJlbWFzdGVyS2V5OiB1bmRlZmluZWQsXHJcbiAgICAgICAgICBtYXN0ZXJLZXk6IHVuZGVmaW5lZFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaGFuZHNoYWtlSGlzdG9yeToge1xyXG4gICAgICAgICAgc2VuZGVySGVsbG86IHVuZGVmaW5lZCxcclxuICAgICAgICAgIHJlY2VpdmVySGVsbG86IHVuZGVmaW5lZCxcclxuICAgICAgICAgIHNlbmRlckNlcnRpZmljYXRlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICByZWNlaXZlckZpbmlzaGVkTWVzc2FnZTogdW5kZWZpbmVkXHJcbiAgICAgICAgfSxcclxuICAgICAgICBpbml0aWFsTWVzc2FnZTogKG1lc3NhZ2UuYm9keS5pZ25vcmUpID8gdW5kZWZpbmVkIDogbWVzc2FnZSxcclxuICAgICAgICBjYWxsYmFjazogbWVzc2FnZS5jYWxsYmFjayxcclxuICAgICAgICBhdXRoZW50aWNhdGVkOiBmYWxzZSxcclxuICAgICAgICBkYXRhT2JqZWN0VVJMOiBtZXNzYWdlLmRhdGFPYmplY3RVUkxcclxuICAgICAgfTtcclxuXHJcbiAgICByZXR1cm4gbmV3Q2hhdENyeXB0bztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUmV0cmlldmVzIGEgcHVibGljIGtleXMgZ2l2ZW4gYSB1c2VyIHJlZnJlbmNlLiBJZiBubyBrZXkgaXMgZm91bmQsXHJcbiAgZ2VuZXJhdGVzIGEgbmV3IGtleSBhc3ltbWV0cmljIGtleSBhbmQgcmV0cmlldmVzIHRoZSBwdWJsaWMga2V5cy5cclxuICAqIEBwYXJhbSAgIHt1c2VyUmVmfSAgICBTdHJpbmcgICAgdXNlciByZWZlcmVuY2UgZm9yIHRoZSBrZXkgcGFpclxyXG4gICogQHJldHVybiAge0FycmF5fSAgIHB1YmxpYyBrZXlcclxuICAqL1xyXG4gIGdldE15UHVibGljS2V5KHVzZXJSZWYgPSB0aGlzLnVzZXJEZWZhdWx0S2V5UmVmKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KHVzZXJSZWYpLnRoZW4oc3RvcmVkS2V5UGFpciA9PiB7XHJcbiAgICAgICAgaWYgKHN0b3JlZEtleVBhaXIpIHtcclxuICAgICAgICAgIHJldHVybiByZXNvbHZlKHN0b3JlZEtleVBhaXIucHVibGljKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgX3RoaXMuX2dlbmVyYXRlQW5kU3RvcmVOZXdBc3ltZXRyaWNLZXkodXNlclJlZikudGhlbihnZW5lcmF0ZWRLZXlQYWlyID0+IHtcclxuICAgICAgICAgIHJlc29sdmUoZ2VuZXJhdGVkS2V5UGFpci5wdWJsaWMpO1xyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICBsb2cuZXJyb3IoJ1tnZXRNeVB1YmxpY0tleTpfZ2VuZXJhdGVBbmRTdG9yZU5ld0FzeW1ldHJpY0tleTplcnJdOiAnICsgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgbG9nLmVycm9yKCdbZ2V0TXlQdWJsaWNLZXk6c3RvcmFnZU1hbmFnZXI6ZXJyXTogJyArIGVyci5tZXNzYWdlKTtcclxuICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUmV0cmlldmVzIGEgcHJpdmF0ZSBrZXlzIGdpdmVuIGEgdXNlciByZWZyZW5jZS4gSWYgbm8ga2V5IGlzIGZvdW5kLFxyXG4gIGdlbmVyYXRlcyBhIG5ldyBrZXkgYXN5bW1ldHJpYyBrZXkgYW5kIHJldHJpZXZlcyB0aGUgcHJpdmF0ZSBrZXkuXHJcbiAgKiBAcGFyYW0gICB7dXNlclJlZn0gICAgU3RyaW5nICAgIHVzZXIgcmVmZXJlbmNlIGZvciB0aGUga2V5IHBhaXJcclxuICAqIEByZXR1cm4gIHtBcnJheX0gICBwcml2YXRlIGtleVxyXG4gICoqL1xyXG4gIGdldE15UHJpdmF0ZUtleSh1c2VyUmVmID0gdGhpcy51c2VyRGVmYXVsdEtleVJlZikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCh1c2VyUmVmKS50aGVuKHN0b3JlZEtleVBhaXIgPT4ge1xyXG4gICAgICAgIGlmIChzdG9yZWRLZXlQYWlyKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShzdG9yZWRLZXlQYWlyLnByaXZhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBfdGhpcy5fZ2VuZXJhdGVBbmRTdG9yZU5ld0FzeW1ldHJpY0tleSh1c2VyUmVmKS50aGVuKGdlbmVyYXRlZEtleVBhaXIgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZShnZW5lcmF0ZWRLZXlQYWlyLnByaXZhdGUpO1xyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICBsb2cuZXJyb3IoJ1tnZXRNeVByaXZhdGVLZXk6X2dlbmVyYXRlQW5kU3RvcmVOZXdBc3ltZXRyaWNLZXk6ZXJyXTogJyArIGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGxvZy5lcnJvcignW2dldE15UHJpdmF0ZUtleTpzdG9yYWdlTWFuYWdlcjplcnJdOiAnICsgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICogR2VuZXJhdGVzIGEgbmV3IGtleSBwYWlyLCBzdG9yZXMgYW5kIHJldHJpdmVzIHRoZSBrZXkgcGFpci5cclxuICAqIEBwYXJhbSAgIHt1c2VyUmVmfSAgICBTdHJpbmcgICAgdXNlciByZWZlcmVuY2UgZm9yIHRoZSBrZXkgcGFpclxyXG4gICogQHJldHVybiAge0FycmF5fSAgIHByaXZhdGUga2V5XHJcbiAgKiovXHJcbiAgX2dlbmVyYXRlQW5kU3RvcmVOZXdBc3ltZXRyaWNLZXkodXNlclJlZikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBrZXlQYWlyID0gdW5kZWZpbmVkO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuLy8gICAgICBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVSU0FLZXlQYWlyKCkudGhlbihnZW5lcmF0ZWRLZXlQYWlyID0+IHtcclxuICAgICAgICBsZXQgZ2VuZXJhdGVkS2V5UGFpciA9IHt9O1xyXG4gICAgICAgIGdlbmVyYXRlZEtleVBhaXIucHJpdmF0ZSA9IGdlbmVyYXRlR1VJRCgpO1xyXG4gICAgICAgIGdlbmVyYXRlZEtleVBhaXIucHVibGljID0gZ2VuZXJhdGVHVUlEKCk7XHJcbiAgICAgICAgbG9nLmxvZygnX2dlbmVyYXRlQW5kU3RvcmVOZXdBc3ltZXRyaWNLZXk6dXNlckFzeW1tZXRyaWNLZXlHZW5lcmF0ZWQnLCBnZW5lcmF0ZWRLZXlQYWlyKTtcclxuICAgICAgICBrZXlQYWlyID0gZ2VuZXJhdGVkS2V5UGFpcjtcclxuICAgICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQodXNlclJlZiwgMCwgZ2VuZXJhdGVkS2V5UGFpcik7XHJcbi8vICAgICAgfSkudGhlbihzdG9yZWRSZWZlcmVuY2UgPT4ge1xyXG4vLyAgICAgICAgbG9nLmxvZygnX2dlbmVyYXRlQW5kU3RvcmVOZXdBc3ltZXRyaWNLZXk6dXNlckFzeW1tZXRyaWNLZXlTdWNjZXNzJywgc3RvcmVkUmVmZXJlbmNlKTtcclxuICAgICAgICByZXNvbHZlKGtleVBhaXIpO1xyXG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGxvZy5lcnJvcignW19nZW5lcmF0ZUFuZFN0b3JlTmV3QXN5bWV0cmljS2V5OmVycl06ICcgKyBlcnIubWVzc2FnZSk7XHJcbiAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgIH0pO1xyXG4vLyAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG4vKlxyXG5jb25zdCBub2RlSlNLZXlQYWlyUG9wdWxhdGUgPSB7IHB1YmxpYzogWzQ4LCAxMzAsIDEsIDM0LCA0OCwgMTMsIDYsIDksIDQyLCAxMzQsIDcyLCAxMzQsIDI0NywgMTMsIDEsIDEsIDEsIDUsIDAsIDMsIDEzMCwgMSwgMTUsIDAsIDQ4LCAxMzAsIDEsIDEwLCAyLCAxMzAsIDEsIDEsIDAsIDIyOCwgNDMsIDEwMSwgMTIsIDEyMSwgNywgMTU3LCA3MSwgODEsIDU4LCAyMTksIDMyLCAxMCwgMTA4LCAxOTMsIDE3OSwgMjEyLCAxMTYsIDI1NSwgNTksIDIxNywgMzIsIDE2MSwgMjAxLCA1MywgMTcxLCAyMjYsIDE5OSwgMTM3LCAyMDIsIDE3MSwgNjAsIDgyLCA1MywgMTI1LCA2MiwgMTc3LCAxMjYsIDE2NSwgMjQsIDE0MSwgMzAsIDE1LCAyMjYsIDU5LCAxMDcsIDM0LCA3LCAxMywgMTQ5LCAxMTIsIDEyNSwgMTAsIDIzMCwgMTkxLCAxNTYsIDE2NCwgMTc3LCAxMCwgMTg1LCAxMywgNjYsIDMsIDIxNywgMTY2LCAyNDQsIDkwLCAxMTksIDExMSwgMjcsIDE0NSwgMTA0LCA3MSwgMTg5LCAxNjYsIDIyNiwgMjU1LCAxMzMsIDgzLCAxNTEsIDIzMSwgMTAxLCAxNTEsIDg5LCAyMiwgMTksIDY1LCAxNTQsIDEwLCA1MywgMjA4LCAyMTgsIDI1MiwgMjE5LCAzNywgNTAsIDIxMiwgODYsIDE0NSwgMTA3LCAxMzIsIDkwLCAyMzMsIDIwMiwgMjI3LCAxMDgsIDExNCwgMTQxLCAyOSwgNzMsIDE4NywgMzEsIDEzLCAyMzQsIDAsIDIzMiwgMjQsIDE5MSwgMzUsIDE0OSwgMTc5LCAxMzgsIDIxNCwgMTU5LCAyNDUsIDE2MiwgMTQ4LCAyMjEsIDExOCwgMTcsIDEwNSwgODksIDE1MSwgMTQ2LCAyMDksIDU1LCAyMzYsIDYxLCAxNDMsIDIzMywgMjI4LCAxMCwgMTE1LCA4LCA4MSwgMTk3LCA0NSwgMTIzLCAxODcsIDIyMywgMTc2LCAyNTQsIDE2NSwgNjksIDE0MywgMjksIDEwMCwgMTE0LCAxNywgMTMwLCAyMjYsIDIyMywgMzMsIDExLCAyNDAsIDgxLCA2MSwgMTcyLCAxOTEsIDE1NywgMjQ2LCAyMDIsIDg3LCAxMzEsIDIyMSwgODgsIDQ4LCAxMjcsIDE1OSwgMTE5LCAxNjAsIDE1MiwgMTE3LCA2MSwgMjUzLCAxNzQsIDY1LCAyMTQsIDIwMywgMjE4LCA2MywgNTAsIDc4LCAxNjAsIDE4MSwgMjIxLCAyMTEsIDEyOCwgNzAsIDE3OCwgMTkxLCAxNzAsIDAsIDEzLCAxMjIsIDE3MywgMTIsIDIwMywgMjUyLCA0LCAxODQsIDIyNSwgMjUyLCA3LCA2MiwgOTYsIDExNiwgMTUsIDIxNiwgMTU4LCA1NSwgODUsIDQ4LCAxNiwgOSwgMjA2LCAxMTksIDc0LCAxMTIsIDI0MywgMTM2LCA4NCwgMTg0LCAyMjMsIDI1NCwgMTAxLCA5MSwgNjEsIDEwLCA5MSwgODUsIDE5MiwgMTQ3LCAxNDQsIDU3LCAyOSwgNjYsIDIzOCwgMTk5LCAyNDQsIDE5MywgMTk0LCAxNTAsIDIzMiwgMjAwLCAxMDcsIDIsIDMsIDEsIDAsIDFdLFxyXG4gIHByaXZhdGU6IFs0OCwgMTMwLCA0LCAxOTEsIDIsIDEsIDAsIDQ4LCAxMywgNiwgOSwgNDIsIDEzNCwgNzIsIDEzNCwgMjQ3LCAxMywgMSwgMSwgMSwgNSwgMCwgNCwgMTMwLCA0LCAxNjksIDQ4LCAxMzAsIDQsIDE2NSwgMiwgMSwgMCwgMiwgMTMwLCAxLCAxLCAwLCAyMjgsIDQzLCAxMDEsIDEyLCAxMjEsIDcsIDE1NywgNzEsIDgxLCA1OCwgMjE5LCAzMiwgMTAsIDEwOCwgMTkzLCAxNzksIDIxMiwgMTE2LCAyNTUsIDU5LCAyMTcsIDMyLCAxNjEsIDIwMSwgNTMsIDE3MSwgMjI2LCAxOTksIDEzNywgMjAyLCAxNzEsIDYwLCA4MiwgNTMsIDEyNSwgNjIsIDE3NywgMTI2LCAxNjUsIDI0LCAxNDEsIDMwLCAxNSwgMjI2LCA1OSwgMTA3LCAzNCwgNywgMTMsIDE0OSwgMTEyLCAxMjUsIDEwLCAyMzAsIDE5MSwgMTU2LCAxNjQsIDE3NywgMTAsIDE4NSwgMTMsIDY2LCAzLCAyMTcsIDE2NiwgMjQ0LCA5MCwgMTE5LCAxMTEsIDI3LCAxNDUsIDEwNCwgNzEsIDE4OSwgMTY2LCAyMjYsIDI1NSwgMTMzLCA4MywgMTUxLCAyMzEsIDEwMSwgMTUxLCA4OSwgMjIsIDE5LCA2NSwgMTU0LCAxMCwgNTMsIDIwOCwgMjE4LCAyNTIsIDIxOSwgMzcsIDUwLCAyMTIsIDg2LCAxNDUsIDEwNywgMTMyLCA5MCwgMjMzLCAyMDIsIDIyNywgMTA4LCAxMTQsIDE0MSwgMjksIDczLCAxODcsIDMxLCAxMywgMjM0LCAwLCAyMzIsIDI0LCAxOTEsIDM1LCAxNDksIDE3OSwgMTM4LCAyMTQsIDE1OSwgMjQ1LCAxNjIsIDE0OCwgMjIxLCAxMTgsIDE3LCAxMDUsIDg5LCAxNTEsIDE0NiwgMjA5LCA1NSwgMjM2LCA2MSwgMTQzLCAyMzMsIDIyOCwgMTAsIDExNSwgOCwgODEsIDE5NywgNDUsIDEyMywgMTg3LCAyMjMsIDE3NiwgMjU0LCAxNjUsIDY5LCAxNDMsIDI5LCAxMDAsIDExNCwgMTcsIDEzMCwgMjI2LCAyMjMsIDMzLCAxMSwgMjQwLCA4MSwgNjEsIDE3MiwgMTkxLCAxNTcsIDI0NiwgMjAyLCA4NywgMTMxLCAyMjEsIDg4LCA0OCwgMTI3LCAxNTksIDExOSwgMTYwLCAxNTIsIDExNywgNjEsIDI1MywgMTc0LCA2NSwgMjE0LCAyMDMsIDIxOCwgNjMsIDUwLCA3OCwgMTYwLCAxODEsIDIyMSwgMjExLCAxMjgsIDcwLCAxNzgsIDE5MSwgMTcwLCAwLCAxMywgMTIyLCAxNzMsIDEyLCAyMDMsIDI1MiwgNCwgMTg0LCAyMjUsIDI1MiwgNywgNjIsIDk2LCAxMTYsIDE1LCAyMTYsIDE1OCwgNTUsIDg1LCA0OCwgMTYsIDksIDIwNiwgMTE5LCA3NCwgMTEyLCAyNDMsIDEzNiwgODQsIDE4NCwgMjIzLCAyNTQsIDEwMSwgOTEsIDYxLCAxMCwgOTEsIDg1LCAxOTIsIDE0NywgMTQ0LCA1NywgMjksIDY2LCAyMzgsIDE5OSwgMjQ0LCAxOTMsIDE5NCwgMTUwLCAyMzIsIDIwMCwgMTA3LCAyLCAzLCAxLCAwLCAxLCAyLCAxMzAsIDEsIDAsIDEwMywgMjQ0LCAxMzcsIDExOCwgMTE2LCA4MiwgMTQsIDIwMywgMTAyLCAxMDcsIDI1MywgODgsIDEyLCAxOTksIDIyMiwgNjAsIDI0MywgMTM2LCA4NiwgMTU3LCA3NCwgMjI0LCAxOTAsIDUzLCAxMTMsIDU3LCAxNTcsIDI1MCwgNDksIDEzMCwgOTYsIDMxLCAyNTIsIDEzNiwgMTUyLCA3MCwgMTQzLCAxNywgMjE1LCA5NiwgMTAzLCA1MSwgMTgsIDM1LCAxNDEsIDIxMiwgMjEwLCAyMDUsIDksIDIxNiwgODMsIDcwLCAyNDUsIDcxLCAxMzgsIDExOSwgMTEyLCAyMjksIDE2NCwgMTc2LCA5LCAzNywgODEsIDE2MSwgMTkzLCAxNTQsIDY4LCAyNDksIDExNSwgMTA2LCAyMDEsIDYsIDEyLCAyMjUsIDE0NCwgMTI2LCAxNDEsIDIxMCwgMTQxLCAyNDIsIDEyOCwgMTU5LCAyMjEsIDE2MywgMjIyLCAyMSwgMjMzLCAyMzAsIDE2NywgMjA2LCA1OSwgMjQsIDI1MCwgMjMzLCA4MSwgMTIyLCAxMDIsIDI2LCA2LCAyMzMsIDcyLCAxMzMsIDQ3LCA3NywgMTU1LCAyMzgsIDg2LCA2LCAxMzksIDI0LCAxMzEsIDE2MywgMTc5LCAxMTIsIDQ4LCAyNDcsIDE0MiwgNiwgMjA3LCAyMDQsIDE3MywgMjIzLCAxNDAsIDE5OSwgMTUwLCA5NSwgMTIzLCAxNTIsIDIwMiwgMTU1LCAxMzEsIDIzOCwgNjIsIDk2LCAxMzMsIDQsIDIxNywgNTEsIDEyMSwgMzAsIDM4LCAxNzgsIDE4OSwgMjE2LCA0NCwgMzUsIDI0MSwgOTMsIDcsIDYyLCA5MCwgMTExLCAyMTYsIDY2LCAyMDksIDI0MywgMTI4LCAyMzQsIDE0MSwgODQsIDEzNSwgMTgxLCAxMywgMzgsIDIyMCwgMTE0LCAyNDUsIDI0MCwgMTc4LCA5NSwgMjIwLCAyMDYsIDExLCAxODYsIDIzNCwgMjEzLCA2NiwgMTIxLCA4MywgNjgsIDg5LCA3NSwgNDYsIDE4MywgMTQ1LCAxODMsIDE0NywgMTYwLCAyMTUsIDExOCwgMTk4LCAxMjUsIDE4MSwgMTQ2LCAzMCwgMjUxLCA1OCwgODcsIDQ3LCAyMDksIDIzNywgOTcsIDI0LCA0NywgMTc5LCA2LCAxMTAsIDI0MiwgOTksIDE1MCwgMjI2LCAxNDgsIDE5OCwgMTc0LCAxNDYsIDEwMSwgMjEzLCA4NywgMTc4LCAxMCwgMjIzLCAxMDUsIDE4LCA1NiwgNTMsIDIyLCAyMTIsIDE1OCwgMTcwLCAxNzYsIDUxLCA4NiwgMTQ1LCAxMjUsIDEyNCwgNDQsIDksIDg1LCAxOSwgMTQ0LCAyNDYsIDE3MCwgNzgsIDEyNCwgMzAsIDMyLCAxMiwgMTY2LCAxNzQsIDEzOSwgNzcsIDYzLCAxNzMsIDgyLCAxMCwgMTUzLCAyLCAxMjksIDEyOSwgMCwgMjQ4LCAxOCwgMTQzLCAyNDYsIDEzNywgMTM2LCAxNDUsIDIxOSwgMTc4LCAzOSwgMjcsIDk0LCA2NCwgOTAsIDQ3LCAxNjMsIDExNCwgNjAsIDYzLCAxODcsIDEzMSwgMTQzLCAyNDQsIDE2LCA0MiwgMTI4LCAyMzEsIDExNywgOTIsIDk4LCAyMTksIDE1NSwgNjIsIDEwNywgMjUyLCAxNywgMjQ1LCA0NSwgMTYwLCAyMjUsIDEwMywgMTQyLCA3MiwgMzYsIDE5MywgMTUwLCAyMzUsIDIxNCwgMTc1LCA2MiwgMjEyLCA1NiwgNDUsIDksIDAsIDYwLCAxMTQsIDEwNywgMTM0LCAyMjgsIDIwNCwgMTMxLCAxMzEsIDIxNCwgOTQsIDIwMSwgMTQ4LCAxNTksIDk5LCAxMzksIDE4MSwgMTMsIDExOSwgMzgsIDMwLCAxMDcsIDE2NiwgMTY1LCAyMDMsIDQzLCAzNCwgMjAsIDIwNywgMTcxLCAzMiwgNTgsIDE2NywgNjIsIDE5NiwgMTUzLCAxMDMsIDIwNCwgMjEzLCAyNDcsIDQ4LCAxMTEsIDIyNywgNTksIDk1LCA5NywgMTk0LCAxODcsIDUzLCAxMCwgMjQ3LCAxMDgsIDU4LCA4NiwgMjgsIDI5LCAxMTMsIDgsIDExMCwgMTcxLCAyMjAsIDI0NSwgMTEsIDgyLCAyMzMsIDIyMywgOTEsIDY4LCAxNjYsIDExNywgMTc0LCAxODcsIDYyLCA3NywgMiwgMTI5LCAxMjksIDAsIDIzNSwgMTE4LCAyLCAxMDUsIDIzOSwgMjEyLCAzMCwgMTA0LCAxNTcsIDQxLCAxMDksIDExLCAyNDgsIDE1MiwgMjIsIDIzNiwgOTcsIDQwLCAxNTMsIDEzMSwgMjI4LCA1LCA4NiwgMTg3LCAxMTMsIDEyNiwgMTQ0LCA3NiwgMTQxLCA3OSwgMTEwLCAyNTAsIDE0NiwgMTUyLCA0OSwgNTgsIDE1NiwgMjAxLCAxNzYsIDkyLCAxODksIDIwOSwgMzAsIDExMiwgMTA4LCAxNzUsIDIwNCwgMjA0LCAyNDcsIDE2NCwgNDYsIDEyOSwgMjM5LCA5OCwgMTI3LCA0OSwgMTQ1LCAyMTgsIDYzLCAxOTMsIDEyNCwgMTc0LCAxOCwgOTgsIDIwMSwgOTksIDE1NCwgMTYyLCAxMzgsIDc4LCAxNTksIDI1MywgMywgMjQ4LCAzLCAyMDksIDM2LCAyMzksIDE5MywgMTU1LCAxOTMsIDUsIDE5LCAyMzYsIDM3LCA3OCwgMTE4LCAxMzUsIDI1MCwgMTk5LCA3LCAxNDEsIDI0OCwgMTIwLCAzNiwgMTM2LCA5MywgOTgsIDE3NCwgNjAsIDE4LCAyMTUsIDkzLCAxNzQsIDEwNywgMTQxLCAxMTYsIDE0NSwgMTY3LCAyMjEsIDIxMCwgMTY5LCAyNDcsIDY3LCAyNTQsIDIyMiwgMTYxLCAxMzQsIDYzLCAyMjEsIDkwLCA4NywgNDIsIDk5LCAyMjcsIDgxLCAxNzMsIDE1MSwgMiwgMTI5LCAxMjksIDAsIDEzMywgMjMsIDE2OCwgMTAzLCA4MywgMjMyLCAxNDYsIDE2MCwgMTgxLCAyMywgNDAsIDM4LCAyMDQsIDEzLCAyMTQsIDIwMywgNDksIDQxLCAxOTUsIDIyNywgMTg5LCAxODEsIDgsIDI0MywgMTE5LCAxMDYsIDc1LCA2NywgMjUwLCAyNTAsIDEwLCAyMzQsIDk4LCAxMTgsIDI2LCAyNTAsIDM1LCAxMjEsIDEzMiwgMTI0LCAxMCwgNzYsIDI2LCAxOTgsIDE2NSwgMTU0LCAxMDgsIDE5LCAxMTcsIDg4LCAyMywgMTcsIDE5MiwgMTQzLCAxODQsIDE3NywgMTgxLCAxNDEsIDE1NywgNCwgMTg1LCAyNDgsIDE5MywgNzcsIDIwNCwgMjQzLCA3LCAxNzAsIDI0MCwgNCwgMTExLCAxMTMsIDE4MywgMCwgMjcsIDEzNiwgMjAsIDE5LCAxNDksIDc0LCAzMywgMjQxLCAyMTgsIDEwOCwgMjM2LCA4MCwgMTcxLCAxNDgsIDE2LCAxMTYsIDk3LCAxMDksIDgzLCA3NCwgODgsIDE0NSwgOTQsIDIzOSwgMTAyLCAxOTIsIDE5LCAxMTQsIDIwNywgNSwgMTI4LCA1MSwgMTExLCAxNjQsIDIzNywgODYsIDE1NCwgOTksIDUyLCAxOTcsIDYyLCA1NywgMTgyLCA2LCAxNTIsIDI0NSwgNjEsIDEzNywgNTgsIDEwNSwgMTU5LCAyLCA4NCwgMTA5LCAyLCAxMjksIDEyOSwgMCwgMjI2LCA2NywgMTExLCAxMzIsIDk1LCA5MSwgMTAxLCAxNzcsIDYzLCAxODksIDQ0LCA1MywgMTkzLCAxODQsIDkyLCAyMzAsIDIyMywgOTgsIDEzMywgNzQsIDIwOSwgODYsIDUyLCA3LCA2NSwgMTk1LCAyMDYsIDEwMCwgODEsIDE3OCwgMTQ0LCA2NSwgMTY3LCAxNTEsIDQyLCA3OSwgODksIDE0OSwgMTgsIDE3MywgMTg4LCAyMSwgMjQ0LCAyNTEsIDQ5LCAyMzAsIDQxLCAxNTAsIDE1MywgNDYsIDM1LCAzOCwgMjMxLCA5OSwgMTc0LCA1NiwgMTE1LCAzMiwgMjE1LCAyNTMsIDg1LCAxNDcsIDEwOCwgMTk3LCAxNDcsIDM0LCAyMzYsIDIxNiwgMjIyLCAxNzcsIDU3LCA5MCwgMTM2LCAxMTQsIDIwNywgNDgsIDQ2LCAzMSwgOTAsIDIyMCwgMTgsIDU4LCAxNDMsIDIzOSwgMTExLCAyMTQsIDI3LCA5NSwgNiwgMzYsIDUzLCAyMjksIDYyLCAxMDgsIDQ1LCAzOSwgMSwgMzAsIDQ3LCAxNzgsIDU2LCAxNjQsIDIwNiwgNTYsIDQyLCAyMDgsIDQ2LCAxOTMsIDYxLCAzMSwgMTQ3LCA0NSwgMTQ3LCAyMywgMTg3LCAyMiwgNTAsIDI1NSwgMTExLCAyMjksIDEzMiwgMTk5LCAxNTIsIDc1LCAxNDIsIDEzNiwgMjA5LCAxNTEsIDIsIDEyOSwgMTI5LCAwLCAxNjUsIDU2LCAyMzIsIDc2LCA1NSwgNTcsIDI0MCwgMTU5LCA5MiwgMjA3LCAyMjAsIDE0MywgMTMwLCAzMCwgNTcsIDIzNCwgMjUxLCAxNzIsIDE3MSwgMTgwLCA1NCwgMTU5LCAyMjksIDk2LCAyNDYsIDczLCAxMTIsIDE0NiwgNzUsIDE1NywgMjQyLCAyMDEsIDE2MSwgMjE4LCAzNywgMTc2LCAzNSwgMTcwLCA1MCwgOTAsIDE0OCwgMTAyLCAxOTEsIDE5OSwgMjM5LCAxNzQsIDc4LCA3MiwgNjcsIDg1LCAxOTksIDQ1LCAxNDksIDE0NSwgMTMyLCAxNjEsIDIxMiwgMzMsIDE1NywgNzUsIDIxNiwgNzksIDM5LCAyMzMsIDE4LCAyMTAsIDI1NSwgMjYsIDcyLCAyMjksIDIzOSwgNDQsIDEyLCAxNDcsIDE1OCwgMTc2LCAxOTIsIDk1LCAxMjYsIDMyLCAxNzUsIDIzLCAyMjYsIDEzMSwgMTM5LCAxOTcsIDE3NSwgMTkzLCA2MiwgOCwgMTUxLCAyNTIsIDY4LCAxNTQsIDk0LCA4OSwgMTg5LCAxMjUsIDkwLCAzMCwgMzYsIDE3NSwgNzMsIDIzMCwgMTk0LCAxMywgMjMzLCAyNDcsIDEyMywgNjAsIDI0MSwgNDcsIDE3MSwgNTEsIDE4OSwgMTEyLCAxMTEsIDIxMywgMTQxLCA4OSwgNzAsIDI0OSwgMjM2LCA2MywgMjM2LCAxMTAsIDExNSwgMjA4XX07XHJcbiovXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgQ3J5cHRvTWFuYWdlcigpO1xyXG4iLCIvLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdMb2FkZXInKTtcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcblxyXG5pbXBvcnQgeyBkaXZpZGVVUkwsIGVtcHR5T2JqZWN0IH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgQWRkcmVzc0FsbG9jYXRpb24gZnJvbSAnLi4vYWxsb2NhdGlvbi9BZGRyZXNzQWxsb2NhdGlvbic7XHJcblxyXG5jbGFzcyBMb2FkZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihydW50aW1lVVJMLCBydW50aW1lQ29uZmlndXJhdGlvbiwgcnVudGltZURlc2NyaXB0b3JzSW5zdGFuY2UpIHtcclxuICAgIGlmICghcnVudGltZUNvbmZpZ3VyYXRpb24pIHRocm93IEVycm9yKCdbUnVudGltZS5Mb2FkZXJdIFRoZSBkZXNjcmlwdG9yIG5lZWQgdG8ga25vdyB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uJyk7XHJcbiAgICBpZiAoIXJ1bnRpbWVEZXNjcmlwdG9yc0luc3RhbmNlKSB0aHJvdyBFcnJvcignW1J1bnRpbWUuTG9hZGVyXSBUaGUgZGVzY3JpcHRvciBuZWVkIHRvIGtub3cgdGhlIHJ1bnRpbWUgRGVzY3JpcHRvciBpbnN0YW5jZScpO1xyXG5cclxuICAgIHRoaXMubG9nID0gbG9nO1xyXG5cclxuICAgIHRoaXMucnVudGltZUNvbmZpZ3VyYXRpb24gPSBydW50aW1lQ29uZmlndXJhdGlvbjtcclxuICAgIHRoaXMuZGVzY3JpcHRvcnMgPSBydW50aW1lRGVzY3JpcHRvcnNJbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBydW50aW1lIHVybFxyXG4gICAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgcnVudGltZVVSTFxyXG4gICAqL1xyXG4gIHNldCBydW50aW1lVVJMKHZhbHVlKSB7XHJcbiAgICB0aGlzLl9ydW50aW1lVVJMID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgcnVudGltZSB1cmxcclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHZhbHVlIHJ1bnRpbWVVUkxcclxuICAgKi9cclxuICBnZXQgcnVudGltZVVSTCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ydW50aW1lVVJMO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IFJlZ2lzdHJ5IGNvbXBvbmVudFxyXG4gICAqIEBwYXJhbSAge1JlZ2lzdHJ5fSB2YWx1ZSBSZWdpc3RyeSBDb21wb25lbnRcclxuICAgKi9cclxuICBzZXQgcmVnaXN0cnkodmFsdWUpIHtcclxuICAgIHRoaXMuX3JlZ2lzdHJ5ID0gdmFsdWU7XHJcblxyXG4gICAgLy8gSW5zdGFsbCBBZGRyZXNzQWxsb2NhdGlvblxyXG4gICAgbGV0IGFkZHJlc3NBbGxvY2F0aW9uID0gQWRkcmVzc0FsbG9jYXRpb24uaW5zdGFuY2U7XHJcbiAgICB0aGlzLl9hZGRyZXNzQWxsb2NhdGlvbiA9IGFkZHJlc3NBbGxvY2F0aW9uO1xyXG5cclxuICAgIGxvZy5sb2coJ1tMb2FkZXIgLSBBZGRyZXNzQWxsb2NhdGlvbl0gLSAnLCBhZGRyZXNzQWxsb2NhdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgUmVnaXN0cnkgY29tcG9uZW50XHJcbiAgICogQHJldHVybiB7UmVnaXN0cnl9IFJlZ2lzdHJ5IGNvbXBvbmVudFxyXG4gICAqL1xyXG4gIGdldCByZWdpc3RyeSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWdpc3RyeTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBNZXNzYWdlIEJ1cyBjb21wb25lbnRcclxuICAgKiBAcGFyYW0gIHtNZXNzYWdlQnVzfSB2YWx1ZSBNZXNzYWdlIGJ1cyBjb21wb25lbnRcclxuICAgKi9cclxuICBzZXQgbWVzc2FnZUJ1cyh2YWx1ZSkge1xyXG4gICAgdGhpcy5fbWVzc2FnZXNCdXMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBNZXNzYWdlIEJ1cyBjb21wb25lbnRcclxuICAgKiBAcmV0dXJuIHtNZXNzYWdlQnVzfSBNZXNzYWdlIEJ1cyBjb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgbWVzc2FnZUJ1cygpIHtcclxuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlc0J1cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBSdW50aW1lIEZhY3RvcnkgY29tcG9uZW50XHJcbiAgICogQHBhcmFtICB7cnVudGltZUZhY3Rvcnl9IHZhbHVlIEZhY3RvcnkgaW5jbHVkZXMgdGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBmb3IgZWFjaCBlbnZpcm9ubWVudFxyXG4gICAqL1xyXG4gIHNldCBydW50aW1lRmFjdG9yeSh2YWx1ZSkge1xyXG4gICAgdGhpcy5fcnVudGltZUZhY3RvcnkgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBSdW50aW1lIEZhY3RvcnkgY29tcG9uZW50XHJcbiAgICogQHJldHVybiB7cnVudGltZUZhY3Rvcnl9IFJ1bnRpbWUgRmFjdG9yeSBjb21wb25lbnRcclxuICAgKi9cclxuICBnZXQgcnVudGltZUZhY3RvcnkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcnVudGltZUZhY3Rvcnk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogRGVwbG95IEh5cGVydHkgZnJvbSBDYXRhbG9ndWUgVVJMXHJcbiAgICpcclxuICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3Qvc3BlY3MvdHJlZS9tYXN0ZXIvZGF0YW1vZGVsL2NvcmUvYWRkcmVzc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIHtVUkwuSHlwZXJ0eUNhdGFsb2d1ZVVSTH0gaHlwZXJ0eUNhdGFsb2d1ZVVSTCAtIFRoZSBDYXRhbG9ndWUgVVJMIHVzZWQgdG8gaWRlbnRpZnkgZGVzY3JpcHRvcnMgaW4gdGhlIENhdGFsb2d1ZS5cclxuICAgKiBAcGFyYW0ge2Jvb2xlYW58VVJMLkh5cGVydHlVUkx9IFtyZXVzZVVSTD1mYWxzZV0gcmV1c2VVUkwgLSByZXVzZVVSTCBpcyB1c2VkIHRvIHJldXNlIHRoZSBoeXBlcnR5VVJMIHByZXZpb3VzbHkgcmVnaXN0cmVkLCBieSBkZWZhdWx0IHRoZSByZXVzZSBpcyBkaXNhYmxlZDtcclxuICAgKiBAcGFyYW0ge1VSTH0gYXBwVVJMIC0gdGhlIGFwcCB1cmwgb3JpZ2luIGFkZHJlc3M7XHJcbiAgICogQHBhcmFtIHtvYmplY3R9IElkcENvbnN0cmFpbnQgLSBjb25zdHJhaW50cyB0byBiZSB1c2VkIHdoZW4gc2VsZWN0aW5nIHRoZSBpZGVudGl0eSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIEh5cGVydHkgaW5jbHVkaW5nIG9yaWdpbiwgaWRwLCBhbmQgaWRIaW50LlxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4sIEVycm9yPn0gdGhpcyBpcyBQcm9taXNlIGFuZCByZXR1cm5zIHRydWUgaWYgYWxsIGNvbXBvbmVudHMgYXJlIGxvYWRlZCB3aXRoIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IgaWYgc29tZW9uZSBmYWlscy5cclxuICAgKlxyXG4gICAqIEBtZW1iZXJPZiBMb2FkZXJcclxuICAgKi9cclxuICBsb2FkSHlwZXJ0eShoeXBlcnR5Q2xhc3MsIHJldXNlVVJMID0gZmFsc2UsIElkcENvbnN0cmFpbnQsIGFwcFVSTCkge1xyXG5cclxuICAgIGlmICghdGhpcy5fcmVhZHlUb1VzZSgpKSByZXR1cm4gZmFsc2U7XHJcbiAgICBpZiAoIWh5cGVydHlDbGFzcykgdGhyb3cgbmV3IEVycm9yKCdbUnVudGltZS5Mb2FkZXJdIGh5cGVydHlDbGFzcyBwYXJhbWV0ZXIgaXMgbmVlZGVkJyk7XHJcblxyXG5cclxuICAgIGxldCBfaHlwZXJ0eVVSTDtcclxuICAgIGxldCBfaHlwZXJ0eVNhbmRib3g7XHJcbiAgICBsZXQgX2h5cGVydHlTb3VyY2VQYWNrYWdlO1xyXG4gICAgbGV0IGhhdmVFcnJvciA9IGZhbHNlO1xyXG4gICAgbGV0IGluc3RhbmNlID0gbmV3IGh5cGVydHlDbGFzcygpO1xyXG4gICAgbGV0IGh5cGVydHkgPSBpbnN0YW5jZS5uYW1lO1xyXG5cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgbGV0IGVycm9yUmVhc29uID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIFNvbWV0aGluZyBmYWlsZWQgb24gdGhlIGRlcGxveSBoeXBlcnR5OiAnLCByZWFzb24pO1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9O1xyXG4gIFxyXG4gICAgICBsZXQgaGFuZGxlRXJyb3IgPSAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgaGF2ZUVycm9yID0gdHJ1ZTtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfTtcclxuICBcclxuICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkSHlwZXJ0eV0gJywgaHlwZXJ0eSk7XHJcbiAgICAgIGxldCBfaHlwZXJ0eURlc2NyaXB0b3IgPSBpbnN0YW5jZS5kZXNjcmlwdG9yO1xyXG5cclxuICAgICAgX2h5cGVydHlEZXNjcmlwdG9yLmRhdGFPYmplY3RzWzBdID0gX2h5cGVydHlEZXNjcmlwdG9yLmRhdGFPYmplY3RzWzBdLnJlcGxhY2UoJyVkb21haW4lJywgdGhpcy5fcmVnaXN0cnkuX2RvbWFpbik7XHJcblxyXG4gICAgICAvLyBhdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGNvbXBsZXRlZCBcInN0ZXAgMiBhbmQgM1wiIGFzIHNob3duIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LWh5cGVydHkubWRcclxuICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gMTogcmV0dXJuIGh5cGVydHkgZGVzY3JpcHRvcjogJywgX2h5cGVydHlEZXNjcmlwdG9yKTtcclxuXHJcblxyXG4gICAgICBfaHlwZXJ0eVNhbmRib3ggPSB0aGlzLnJlZ2lzdHJ5LmdldEFwcFNhbmRib3goKTtcclxuXHJcblxyXG5cclxuICAgICAgbGV0IG51bWJlck9mQWRkcmVzc2VzID0gMTtcclxuICAgICAgLy9kZWJ1Z2dlcjtcclxuICAgICAgdGhpcy5fYWRkcmVzc0FsbG9jYXRpb24uY3JlYXRlKHRoaXMuX3JlZ2lzdHJ5Ll9kb21haW4sIG51bWJlck9mQWRkcmVzc2VzLCBfaHlwZXJ0eURlc2NyaXB0b3IsICdoeXBlcnR5JywgcmV1c2VVUkwpXHJcbiAgICAgIC50aGVuKChhZGRyZXNzZXMpID0+IHtcclxuICAgICAgICBpZiAoaGF2ZUVycm9yKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gNjogcmV0dXJuIHRoZSBhZGRyZXNzZXMgZm9yIHRoZSBoeXBlcnR5JywgYWRkcmVzc2VzKTtcclxuXHJcbiAgICAgICAgLy8gUmVnaXN0ZXIgaHlwZXJ0eVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVySHlwZXJ0eShfaHlwZXJ0eVNhbmRib3gsIGh5cGVydHksIF9oeXBlcnR5RGVzY3JpcHRvciwgYWRkcmVzc2VzLCBJZHBDb25zdHJhaW50KTtcclxuICAgICAgfSwgaGFuZGxlRXJyb3IpXHJcbiAgICAgIC50aGVuKChyZWdpc3RyYXRpb25SZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAoaGF2ZUVycm9yKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gNzogcmVnaXN0cmF0aW9uIHJlc3VsdCcsIHJlZ2lzdHJhdGlvblJlc3VsdCk7XHJcblxyXG4gICAgICAgIC8vIHdlIGhhdmUgY29tcGxldGVkIHN0ZXAgMTYgb2YgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktaHlwZXJ0eS5tZCByaWdodCBub3cuXHJcbiAgICAgICAgX2h5cGVydHlVUkwgPSByZWdpc3RyYXRpb25SZXN1bHQudXJsO1xyXG5cclxuICAgICAgICAvLyBFeHRlbmQgb3JpZ2luYWwgaHlwZXJ0eSBjb25maWd1cmF0aW9uO1xyXG4gICAgICAgIGxldCBjb25maWd1cmF0aW9uID0ge307XHJcbiAgICAgICAgaWYgKCFlbXB0eU9iamVjdChfaHlwZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhdGlvbikpIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBPYmplY3QuYXNzaWduKHt9LCBKU09OLnBhcnNlKF9oeXBlcnR5RGVzY3JpcHRvci5jb25maWd1cmF0aW9uKSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBfaHlwZXJ0eURlc2NyaXB0b3IuY29uZmlndXJhdGlvbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uZmlndXJhdGlvbi5ydW50aW1lVVJMID0gdGhpcy5fcnVudGltZVVSTDtcclxuXHJcbiAgICAgICAgaWYgKHJlZ2lzdHJhdGlvblJlc3VsdC5wMnBIYW5kbGVyKSB7XHJcbiAgICAgICAgICBjb25maWd1cmF0aW9uLnAycEhhbmRsZXIgPSByZWdpc3RyYXRpb25SZXN1bHQucDJwSGFuZGxlcjtcclxuICAgICAgICAgIGNvbmZpZ3VyYXRpb24ucDJwUmVxdWVzdGVyID0gcmVnaXN0cmF0aW9uUmVzdWx0LnAycFJlcXVlc3RlcjtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAvLyBXZSB3aWxsIGRlcGxveSB0aGUgY29tcG9uZW50IC0gc3RlcCAxNyBvZiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1oeXBlcnR5Lm1kIHJpZ2h0IG5vdy5cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIF9oeXBlcnR5U2FuZGJveC5kZXBsb3lDb21wb25lbnQoX2h5cGVydHlTb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUsIF9oeXBlcnR5VVJMLCBjb25maWd1cmF0aW9uKTtcclxuICAgICAgICAgIHJldHVybiBfaHlwZXJ0eVNhbmRib3guZGVwbG95Q29tcG9uZW50KGluc3RhbmNlLCBfaHlwZXJ0eVVSTCwgY29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gRXJyb3Igb24gZGVwbG95IGNvbXBvbmVudDonLCBlKTtcclxuICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGhhbmRsZUVycm9yKVxyXG4gICAgICAudGhlbigoZGVwbG95Q29tcG9uZW50U3RhdHVzKSA9PiB7XHJcbiAgICAgICAgaWYgKGhhdmVFcnJvcikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIDg6IERlcGxveSBjb21wb25lbnQgc3RhdHVzIGZvciBoeXBlcnR5OiAnLCBkZXBsb3lDb21wb25lbnRTdGF0dXMpO1xyXG5cclxuICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIDE5IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LWh5cGVydHkubWQgcmlnaHQgbm93LlxyXG5cclxuICAgICAgICAvLyBBZGQgdGhlIG1lc3NhZ2UgYnVzIGxpc3RlbmVyIHRvIHRoZSBhcHBTYW5kYm94IG9yIGh5cGVydFNhbmRib3g7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF9oeXBlcnR5VVJMLCAobXNnKSA9PiB7XHJcbiAgICAgICAgICBfaHlwZXJ0eVNhbmRib3gucG9zdE1lc3NhZ2UobXNnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gQWRkIHRoZSBtZXNzYWdlIGJ1cyBsaXN0ZW5lciB0byB0aGUgYXBwU2FuZGJveCBvciBoeXBlcnRTYW5kYm94O1xyXG4gICAgICAgIHRoaXMubWVzc2FnZUJ1cy5hZGRMaXN0ZW5lcih0aGlzLnJ1bnRpbWVVUkwgKyAnL3N0YXR1cycsIChtc2cpID0+IHtcclxuICAgICAgICAgIF9oeXBlcnR5U2FuZGJveC5wb3N0TWVzc2FnZShtc2cpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIDIwIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LWh5cGVydHkubWQgcmlnaHQgbm93LlxyXG4gICAgICAgIGxldCBkZXBsb3llZCA9IHtcclxuICAgICAgICAgIHJ1bnRpbWVIeXBlcnR5VVJMOiBfaHlwZXJ0eVVSTCxcclxuICAgICAgICAgIHN0YXR1czogZGVwbG95Q29tcG9uZW50U3RhdHVzLFxyXG4gICAgICAgICAgbmFtZTogaHlwZXJ0eSxcclxuICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIEh5cGVydHkgZGVwbG95ZWQ6ICcsIGRlcGxveWVkKTtcclxuICAgICAgICByZXNvbHZlKGluc3RhbmNlKTtcclxuXHJcbiAgICAgICAgLy8gd2UgaGF2ZSBjb21wbGV0ZWQgc3RlcCAyMSBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1oeXBlcnR5Lm1kIHJpZ2h0IG5vdy5cclxuICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSAtLS0tLS0tLS0tLS0tLS0tLS0gRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xyXG4gICAgICB9LCBoYW5kbGVFcnJvcilcclxuICAgICAgLmNhdGNoKGVycm9yUmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIERlcGxveSBTdHViIGZyb20gQ2F0YWxvZ3VlIFVSTCBvciBkb21haW4gdXJsXHJcbiAgKiBAcGFyYW0gIHtVUkwuVVJMfSAgICAgcHJvdG9zdHViVVJMICAgIENhdGFsb2d1ZSBVUkwgZm9yIHRoZSBQcm90b1N0dWIgdG8gYmUgbG9hZGVkIG9yIHRoZSBkb21haW4gdG8gYmUgdGFyZ2V0IGJ5IHRoZSBwcm90b3N0dWJcclxuICAqIEBwYXJhbSAge09iamVjdH0gICAgICBwMnBDb25maWcgICAgICAgY29uZmlndXJhdGlvbiBvZiBwMnBcclxuICAqL1xyXG4gIGxvYWRTdHViKHByb3Rvc3R1YlVSTCwgcDJwQ29uZmlnKSB7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9yZWFkeVRvVXNlKCkpIHJldHVybiBmYWxzZTtcclxuICAgIGlmICghcHJvdG9zdHViVVJMKSB0aHJvdyBuZXcgRXJyb3IoJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl1Qcm90b1N0dWIgZGVzY3JpcHRvciB1cmwgcGFyYW1ldGVyIGlzIG5lZWRlZCcpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICAvLyB0byBhbmFseXNlIGlmIGRvbWFpbiBmb3IgcDJwSGFuZGxlcnMgc2hvdWxkIGJlIHNvbWV0aGluZyBlbHNlIGFuZCBub3QgdGhlIGRlZmF1bHQgZG9tYWluIGl0c2VsZlxyXG5cclxuICAgICAgbGV0IGRvbWFpbiA9IGRpdmlkZVVSTChwcm90b3N0dWJVUkwpLmRvbWFpbjtcclxuXHJcbiAgICAgIGlmICghZG9tYWluKSB7XHJcbiAgICAgICAgZG9tYWluID0gcHJvdG9zdHViVVJMO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgX3N0dWJTYW5kYm94O1xyXG4gICAgICBsZXQgX3N0dWJEZXNjcmlwdG9yO1xyXG4gICAgICBsZXQgX3J1bnRpbWVQcm90b1N0dWJVUkw7XHJcbiAgICAgIGxldCBfc3R1YlNvdXJjZVBhY2thZ2U7XHJcbiAgICAgIGxldCBoYXZlRXJyb3IgPSBmYWxzZTtcclxuICAgICAgbGV0IHN0dWJJZDtcclxuXHJcbiAgICAgIGxldCBlcnJvclJlYXNvbiA9IChyZWFzb24pID0+IHtcclxuICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXVNvbWV0aGluZyBmYWlsZWQgb24gdGhlIGRlcGxveSBvZiBwcm90b2NvbHN0dWI6ICcsIHJlYXNvbik7XHJcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsZXQgaGFuZGxlRXJyb3IgPSAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgaGF2ZUVycm9yID0gdHJ1ZTtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIERpc2NvdmVyIFByb3RvY29sIFN0dWJcclxuICAgICAgbGV0IGRpc2NvdmVyU3R1YjtcclxuICAgICAgbGV0IGlzUDJQSGFuZGxlciA9IGZhbHNlO1xyXG4gICAgICBsZXQgaXNQMlBSZXF1ZXN0ZXIgPSBmYWxzZTtcclxuICAgICAgbGV0IHN0dWJDYXBhYmlsaXRpZXMgPSB7fTtcclxuXHJcbiAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXIubG9hZFN0dWJdIHN0YXJ0aW5nIGxvYWRpbmcgZm9yICcsIHByb3Rvc3R1YlVSTCwgJyB3aXRoIHAycGNvbmZpZyAnLCBwMnBDb25maWcpO1xyXG4gICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXURpc2NvdmVyIG9yIENyZWF0ZSBhIG5ldyBQcm90b1N0dWIgZm9yIGRvbWFpbjogJywgZG9tYWluKTtcclxuXHJcbiAgICAgIC8vIHN0ZXAgMiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAocDJwQ29uZmlnKSB7XHJcblxyXG4gICAgICAgICAgaWYgKHAycENvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnaXNIYW5kbGVyU3R1YicpICYmIHAycENvbmZpZy5pc0hhbmRsZXJTdHViKSB7XHJcbiAgICAgICAgICAgIC8vIHN0ZXAgNiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuICAgICAgICAgICAgaXNQMlBIYW5kbGVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgc3R1YklkID0gdGhpcy5ydW50aW1lVVJMO1xyXG4gICAgICAgICAgICBkaXNjb3ZlclN0dWIgPSB0aGlzLnJlZ2lzdHJ5LmRpc2NvdmVyUDJQU3R1YigpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaXNQMlBSZXF1ZXN0ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgcDJwSGFuZGxlclJ1bnRpbWVVUkwgPSBwMnBDb25maWcucmVtb3RlUnVudGltZVVSTDtcclxuICAgICAgICAgICAgc3R1YklkID0gcDJwSGFuZGxlclJ1bnRpbWVVUkw7XHJcblxyXG4gICAgICAgICAgICAvLyBzdGVwIDQgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcblxyXG4gICAgICAgICAgICAvLyBzdGVwIDUgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcbiAgICAgICAgICAgIGRpc2NvdmVyU3R1YiA9IHRoaXMucmVnaXN0cnkuZGlzY292ZXJQMlBTdHViKHAycEhhbmRsZXJSdW50aW1lVVJMKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIHN0ZXAgMyBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuICAgICAgICAgIHN0dWJJZCA9IGRvbWFpbjtcclxuICAgICAgICAgIGRpc2NvdmVyU3R1YiA9IHRoaXMucmVnaXN0cnkuZGlzY292ZXJQcm90b3N0dWIoZG9tYWluKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElzIHJlZ2lzdGVkP1xyXG4gICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXIubG9hZFN0dWJdMS4gUHJvdG8gU3R1YiBEaXNjb3ZlcmVkIGZvciAnLCBwcm90b3N0dWJVUkwsICc6ICcsIGRpc2NvdmVyU3R1Yik7XHJcblxyXG4gICAgICAgIC8vIHN0ZXAgMjMgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcbiAgICAgICAgcmVzb2x2ZShkaXNjb3ZlclN0dWIpO1xyXG4gICAgICAgIGxvZy5pbmZvKCcgW1J1bnRpbWUuTG9hZGVyXS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicpO1xyXG5cclxuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XHJcblxyXG4gICAgICAgIC8vIGlzIG5vdCByZWdpc3RlZD9cclxuICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXTEuIFByb3RvIFN0dWIgbm90IGZvdW5kICcgKyByZWFzb24pO1xyXG5cclxuICAgICAgICAvLyBzdGVwIDggaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcbiAgICAgICAgdGhpcy5kZXNjcmlwdG9ycy5nZXRTdHViRGVzY3JpcHRvcihwcm90b3N0dWJVUkwpXHJcbiAgICAgICAgICAudGhlbigoc3R1YkRlc2NyaXB0b3IpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl0yLiByZXR1cm4gdGhlIFByb3RvU3R1YiBkZXNjcmlwdG9yJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBzdGVwIDkgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcbiAgICAgICAgICAgIF9zdHViRGVzY3JpcHRvciA9IHN0dWJEZXNjcmlwdG9yO1xyXG5cclxuICAgICAgICAgICAgbGV0IHNvdXJjZVBhY2thZ2VVUkwgPSBzdHViRGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNvdXJjZVBhY2thZ2VVUkwgPT09ICcvc291cmNlUGFja2FnZScpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gc3R1YkRlc2NyaXB0b3Iuc291cmNlUGFja2FnZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc3RlcCAxMCBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVudGltZUNhdGFsb2d1ZS5nZXRTb3VyY2VQYWNrYWdlRnJvbVVSTChzb3VyY2VQYWNrYWdlVVJMKTtcclxuICAgICAgICAgIH0sIGhhbmRsZUVycm9yKVxyXG4gICAgICAgICAgLmNhdGNoKGVycm9yUmVhc29uKVxyXG4gICAgICAgICAgLnRoZW4oKHN0dWJTb3VyY2VQYWNrYWdlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byBkZWJ1ZywgaXQgc2VlbXMgUnVudGltZUNhdGFsb2d1ZSBkb2VzIG5vdCBzdXBwb3J0IHlldCBjb25zdHJhaW50cy4gSXQgYXBwZWFycyBlbXB0eSEhISFcclxuXHJcbiAgICAgICAgICAgIGlmIChfc3R1YkRlc2NyaXB0b3IgJiYgX3N0dWJEZXNjcmlwdG9yLmNvbnN0cmFpbnRzKSB7XHJcbiAgICAgICAgICAgICAgc3R1YkNhcGFiaWxpdGllcyA9IF9zdHViRGVzY3JpcHRvci5jb25zdHJhaW50cztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gc3RlcCAxMSBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl0zLiByZXR1cm4gdGhlIFByb3RvU3R1YiBTb3VyY2UgQ29kZScpO1xyXG4gICAgICAgICAgICBfc3R1YlNvdXJjZVBhY2thZ2UgPSBzdHViU291cmNlUGFja2FnZTtcclxuXHJcbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCByZXR1cm4gdGhlIHNhbmRib3ggb3Igb25lIHByb21pc2UgdG8gZ2V0U2FuZGJveDtcclxuICAgICAgICAgICAgLy8gc3RlcCAxMiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0U2FuZGJveChkb21haW4sIHN0dWJDYXBhYmlsaXRpZXMpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC50aGVuKChzdHViU2FuZGJveCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaGF2ZUVycm9yKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBzdGVwIDE1IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxyXG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXTQuIGlmIHRoZSBzYW5kYm94IGlzIHJlZ2lzdGVyZWQgdGhlbiByZXR1cm4gdGhlIHNhbmRib3ggJywgc3R1YlNhbmRib3gpO1xyXG5cclxuICAgICAgICAgICAgX3N0dWJTYW5kYm94ID0gc3R1YlNhbmRib3g7XHJcbiAgICAgICAgICAgIHJldHVybiBzdHViU2FuZGJveDtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaGF2ZUVycm9yKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBzdGVwIDEzIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxyXG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXTUuIFNhbmRib3ggd2FzIG5vdCBmb3VuZCwgY3JlYXRpbmcgYSBuZXcgb25lICcsIHJlYXNvbik7XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgc2FuZGJveCBpcyByZWdpc3RlZCBmb3IgdGhpcyBzdHViIGRlc2NyaXB0b3IgdXJsO1xyXG5cclxuXHJcbiAgICAgICAgICAgIC8vIHN0ZXAgMTQgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ydW50aW1lRmFjdG9yeS5jcmVhdGVTYW5kYm94KHN0dWJDYXBhYmlsaXRpZXMpLnRoZW4oKHNhbmRib3gpID0+IHtcclxuICAgICAgICAgICAgICBzYW5kYm94LmFkZExpc3RlbmVyKCcqJywgKG1zZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZyk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBzYW5kYm94O1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLnRoZW4oKHNhbmRib3gpID0+IHtcclxuICAgICAgICAgICAgaWYgKGhhdmVFcnJvcikgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgLy8gc3RlcCAxNiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl02LiByZXR1cm4gdGhlIHNhbmRib3ggaW5zdGFuY2UgYW5kIHJlZ2lzdGVyJywgc2FuZGJveCwgJ3RvIGRvbWFpbiAnLCBkb21haW4pO1xyXG5cclxuICAgICAgICAgICAgX3N0dWJTYW5kYm94ID0gc2FuZGJveDtcclxuXHJcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgcmVnaXN0ZXIgc3R1YiBvbiByZWdpc3RyeSAtIHN0ZXAgeHh4IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5yZWdpc3RlclN0dWIoX3N0dWJTYW5kYm94LCBzdHViSWQsIHAycENvbmZpZywgcHJvdG9zdHViVVJMLCBfc3R1YkRlc2NyaXB0b3IpO1xyXG4gICAgICAgICAgfSwgaGFuZGxlRXJyb3IpXHJcbiAgICAgICAgICAudGhlbigocnVudGltZVByb3RvU3R1YikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaGF2ZUVycm9yKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBzdGVwIDIzIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxyXG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXSA3LiByZXR1cm4gdGhlIHJ1bnRpbWUgcHJvdG9zdHViIHVybDogJywgcnVudGltZVByb3RvU3R1Yik7XHJcblxyXG4gICAgICAgICAgICBfcnVudGltZVByb3RvU3R1YlVSTCA9IHJ1bnRpbWVQcm90b1N0dWIudXJsO1xyXG5cclxuICAgICAgICAgICAgLy8gRXh0ZW5kIG9yaWdpbmFsIGh5cGVydHkgY29uZmlndXJhdGlvbjtcclxuICAgICAgICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSB7fTtcclxuICAgICAgICAgICAgaWYgKCFlbXB0eU9iamVjdChfc3R1YkRlc2NyaXB0b3IuY29uZmlndXJhdGlvbikpIHtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IE9iamVjdC5hc3NpZ24oe30sIEpTT04ucGFyc2UoX3N0dWJEZXNjcmlwdG9yLmNvbmZpZ3VyYXRpb24pKTtcclxuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gX3N0dWJEZXNjcmlwdG9yLmNvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocDJwQ29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBPYmplY3QuYXNzaWduKGNvbmZpZ3VyYXRpb24sIEpTT04ucGFyc2UocDJwQ29uZmlnKSk7XHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IE9iamVjdC5hc3NpZ24oY29uZmlndXJhdGlvbiwgcDJwQ29uZmlnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHJlcXVpcmVkIGZvciBwcm90b3N0dWIgc2Vzc2lvblxyXG5cclxuICAgICAgICAgICAgY29uZmlndXJhdGlvbi5ydW50aW1lVVJMID0gdGhpcy5fcnVudGltZVVSTDtcclxuXHJcbiAgICAgICAgICAgIC8vIHN0ZXAgMjQgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgLy8gc3RlcCAyNiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuICAgICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXSA4OiBhZGRpbmcgc2FuZGJveCBsaXN0ZW5lciB0byBwcm90b3N0dWJVUkwgOiAnLCBfcnVudGltZVByb3RvU3R1YlVSTCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIHN0ZXAgMjcgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcbiAgICAgICAgICAgICAgLy8gQWRkIHRoZSBtZXNzYWdlIGJ1cyBsaXN0ZW5lclxyXG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZUJ1cy5hZGRMaXN0ZW5lcihfcnVudGltZVByb3RvU3R1YlVSTCwgKG1zZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgX3N0dWJTYW5kYm94LnBvc3RNZXNzYWdlKG1zZyk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBfc3R1YlNhbmRib3guZGVwbG95Q29tcG9uZW50KF9zdHViU291cmNlUGFja2FnZS5zb3VyY2VDb2RlLCBfcnVudGltZVByb3RvU3R1YlVSTCwgY29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl0gRXJyb3Igb24gZGVwbG95IGNvbXBvbmVudDonLCBlKTtcclxuICAgICAgICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sIGhhbmRsZUVycm9yKVxyXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaGF2ZUVycm9yKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cclxuICAgICAgICAgICAgLy8gc3RlcCAyOCBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuICAgICAgICAgICAgbGV0IHN0dWI7XHJcbiAgICAgICAgICAgIGlmIChwMnBDb25maWcpIHtcclxuICAgICAgICAgICAgICBsb2cubG9nKCdbUnVudGltZS5Mb2FkZXIubG9hZFN0dWJdIHAycENvbmZpZzogJywgcDJwQ29uZmlnKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHAycENvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnaXNIYW5kbGVyU3R1YicpKSBzdHViID0gdGhpcy5yZWdpc3RyeS5wMnBIYW5kbGVyU3R1Ylt0aGlzLl9ydW50aW1lVVJMXTtcclxuICAgICAgICAgICAgICBpZiAocDJwQ29uZmlnLmhhc093blByb3BlcnR5KCdwMnBSZXF1ZXN0ZXJTdHViJykpIHN0dWIgPSB0aGlzLnJlZ2lzdHJ5LnAycFJlcXVlc3RlclN0dWJbcDJwQ29uZmlnLnJlbW90ZVJ1bnRpbWVVUkxdO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHN0dWIgPSB0aGlzLnJlZ2lzdHJ5LnByb3Rvc3R1YnNMaXN0W2RvbWFpbl07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxvZy5sb2coJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl0gU3R1YjogJywgc3R1Yik7XHJcbiAgICAgICAgICAgIHJlc29sdmUoc3R1Yik7XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXIubG9hZFN0dWJdLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyk7XHJcbiAgICAgICAgICB9LCBoYW5kbGVFcnJvcilcclxuICAgICAgICAgIC5jYXRjaChlcnJvclJlYXNvbik7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBEZXBsb3kgaWRwUHJveHkgZnJvbSBDYXRhbG9ndWUgVVJMIG9yIGRvbWFpbiB1cmxcclxuICAqIEBwYXJhbSAge1VSTC5VUkx9ICAgICBkb21haW4gICAgICAgICAgZG9tYWluXHJcbiAgKi9cclxuXHJcbiAgbG9hZElkcFByb3h5KGlkcFByb3h5VVJMKSB7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9yZWFkeVRvVXNlKCkpIHJldHVybiBmYWxzZTtcclxuICAgIGlmICghaWRwUHJveHlVUkwpIHRocm93IG5ldyBFcnJvcignW1J1bnRpbWUuTG9hZGVyXSBJZHBQcm94eSBkZXNjcmlwdG9yIHVybCBwYXJhbWV0ZXIgaXMgbmVlZGVkJyk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGxldCBkb21haW4gPSBkaXZpZGVVUkwoaWRwUHJveHlVUkwpLmRvbWFpbjtcclxuXHJcbiAgICAgIGlmICghZG9tYWluKSB7XHJcbiAgICAgICAgZG9tYWluID0gaWRwUHJveHlVUkw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBfcHJveHlTYW5kYm94O1xyXG4gICAgICBsZXQgX3Byb3h5RGVzY3JpcHRvcjtcclxuICAgICAgbGV0IF9ydW50aW1lSWRwUHJveHlVUkw7XHJcbiAgICAgIGxldCBfcHJveHlTb3VyY2VQYWNrYWdlO1xyXG4gICAgICBsZXQgaGF2ZUVycm9yID0gZmFsc2U7XHJcblxyXG4gICAgICBsZXQgZXJyb3JSZWFzb24gPSAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gU29tZXRoaW5nIGZhaWxlZCBvbiB0aGUgZGVwbG95IG9mIElkcFByb3h5OiAnLCByZWFzb24pO1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgbGV0IGhhbmRsZUVycm9yID0gKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIGhhdmVFcnJvciA9IHRydWU7XHJcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvLyBEaXNjb3ZlciBJRFBQcm94eVxyXG4gICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSAtLS0tLS0tLS0tLS0tLS0tLS0tIElEUCBQcm94eSBEZXBsb3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyk7XHJcbiAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIERpc2NvdmVyIG9yIENyZWF0ZSBhIG5ldyBJZHBQcm94eSBmb3IgZG9tYWluL1VSTDogJywgZG9tYWluKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHJ1bnRpbWVJZHBQcm94eVVSTCA9IHRoaXMucmVnaXN0cnkuZGlzY292ZXJJZHBQcm94eShkb21haW4pO1xyXG5cclxuICAgICAgICAvLyBJcyByZWdpc3RlZD9cclxuICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSAxLiBJRFBQcm94eSBEaXNjb3ZlcmVkOiAnLCBydW50aW1lSWRwUHJveHlVUkwpO1xyXG5cclxuICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIDIgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcblxyXG4gICAgICAgIGxldCBpZHBQcm94eSA9IHRoaXMucmVnaXN0cnkuaWRwUHJveHlMaXN0W2RvbWFpbl07XHJcbiAgICAgICAgbG9nLmxvZygnRGVwbG95ZWQ6ICcsIGlkcFByb3h5KTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZShpZHBQcm94eSk7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyk7XHJcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xyXG5cclxuICAgICAgICAvLyBpcyBub3QgcmVnaXN0ZWQ/XHJcbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gMS4gSWRwUHJveHkgbm90IGZvdW5kOicsIHJlYXNvbik7XHJcblxyXG4gICAgICAgIC8vIHdlIGhhdmUgY29tcGxldGVkIHN0ZXAgMyBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuXHJcbiAgICAgICAgLy8gd2UgbmVlZCB0byBnZXQgUHJvdG9TdHViIGRlc2NyaXB0b3Igc3RlcCA0IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxyXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcnMuZ2V0SWRwUHJveHlEZXNjcmlwdG9yKGlkcFByb3h5VVJMKVxyXG4gICAgICAgICAgLnRoZW4oKHByb3h5RGVzY3JpcHRvcikgPT4ge1xyXG5cclxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gMi4gUmV0dXJuIHRoZSBJRFBQcm94eSBkZXNjcmlwdG9yJyk7XHJcblxyXG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIDUgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcbiAgICAgICAgICAgIF9wcm94eURlc2NyaXB0b3IgPSBwcm94eURlc2NyaXB0b3I7XHJcblxyXG4gICAgICAgICAgICBsZXQgc291cmNlUGFja2FnZVVSTCA9IHByb3h5RGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNvdXJjZVBhY2thZ2VVUkwgPT09ICcvc291cmNlUGFja2FnZScpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gcHJveHlEZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IFByb3RvU3R1YiBTb3VyY2UgY29kZSBmcm9tIGRlc2NyaXB0b3IgLSBzdGVwIDYgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJ1bnRpbWVDYXRhbG9ndWUuZ2V0U291cmNlUGFja2FnZUZyb21VUkwoc291cmNlUGFja2FnZVVSTCk7XHJcbiAgICAgICAgICB9LCBoYW5kbGVFcnJvcilcclxuICAgICAgICAgIC50aGVuKChzb3VyY2VQYWNrYWdlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gMy4gcmV0dXJuIHRoZSBJRFBQcm94eSBzb3VyY2UgcGFja2FnZScpO1xyXG5cclxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBjb21wbGV0ZWQgc3RlcCA3IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxyXG5cclxuICAgICAgICAgICAgX3Byb3h5U291cmNlUGFja2FnZSA9IHNvdXJjZVBhY2thZ2U7XHJcblxyXG4gICAgICAgICAgICAvLyBUT0RPOiBDaGVjayBvbiBQRVAgKHBvbGljeSBFbmdpbmUpIGlmIHdlIG5lZWQgdGhlIHNhbmRib3ggYW5kIGNoZWNrIGlmIHRoZSBTYW5kYm94IEZhY3RvcnkgaGF2ZSB0aGUgY29udGV4dCBzYW5kYm94O1xyXG4gICAgICAgICAgICBsZXQgcG9saWN5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuIHBvbGljeTtcclxuICAgICAgICAgIH0sIGhhbmRsZUVycm9yKVxyXG4gICAgICAgICAgLnRoZW4oKHBvbGljeSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaGF2ZUVycm9yKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyB0aGlzIHdpbGwgcmV0dXJuIHRoZSBzYW5kYm94IG9yIG9uZSBwcm9taXNlIHRvIGdldFNhbmRib3g7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdldFNhbmRib3goZG9tYWluKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAudGhlbigocHJveHlTYW5kYm94KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gNC4gaWYgdGhlIHNhbmRib3ggaXMgcmVnaXN0ZXJlZCB0aGVuIHJldHVybiB0aGUgc2FuZGJveCcsIHByb3h5U2FuZGJveCk7XHJcblxyXG4gICAgICAgICAgICBfcHJveHlTYW5kYm94ID0gcHJveHlTYW5kYm94O1xyXG4gICAgICAgICAgICByZXR1cm4gcHJveHlTYW5kYm94O1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gNS4gU2FuZGJveCB3YXMgbm90IGZvdW5kLCBjcmVhdGluZyBhIG5ldyBvbmUnLCByZWFzb24pO1xyXG5cclxuICAgICAgICAgICAgbGV0IHByb3h5Q2FwYWJpbGl0aWVzID0ge307XHJcbiAgICAgICAgICAgIGlmIChfcHJveHlEZXNjcmlwdG9yICYmIF9wcm94eURlc2NyaXB0b3IuaGFzT3duUHJvcGVydHkoJ2NhcGFiaWxpdGllcycpKSB7XHJcbiAgICAgICAgICAgICAgX3Byb3h5RGVzY3JpcHRvciA9IF9wcm94eURlc2NyaXB0b3Iuc3R1YkNhcGFiaWxpdGllcztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3J1bnRpbWVGYWN0b3J5LmNyZWF0ZVNhbmRib3gocHJveHlDYXBhYmlsaXRpZXMpLnRoZW4oKHNhbmRib3gpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgc2FuZGJveC5hZGRMaXN0ZW5lcignKicsIChtc2cpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2cpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gc2FuZGJveDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLnRoZW4oKHNhbmRib3gpID0+IHtcclxuICAgICAgICAgICAgaWYgKGhhdmVFcnJvcikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSA2LiByZXR1cm4gdGhlIHNhbmRib3ggaW5zdGFuY2UgYW5kIHJlZ2lzdGVyJywgc2FuZGJveCwgJ3RvIGRvbWFpbiAnLCBkb21haW4pO1xyXG5cclxuICAgICAgICAgICAgX3Byb3h5U2FuZGJveCA9IHNhbmRib3g7XHJcblxyXG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHJlZ2lzdGVyIHN0dWIgb24gcmVnaXN0cnkgLSBzdGVwIHh4eCBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnkucmVnaXN0ZXJJZHBQcm94eShzYW5kYm94LCBkb21haW4pO1xyXG4gICAgICAgICAgfSwgaGFuZGxlRXJyb3IpXHJcbiAgICAgICAgICAudGhlbigocnVudGltZUlkcFByb3h5VVJMKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gNy4gUmV0dXJuIHRoZSBydW50aW1lIElkcCBQcm94eSBVUkw6ICcsIHJ1bnRpbWVJZHBQcm94eVVSTCk7XHJcblxyXG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIHh4eCBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuXHJcbiAgICAgICAgICAgIF9ydW50aW1lSWRwUHJveHlVUkwgPSBydW50aW1lSWRwUHJveHlVUkw7XHJcblxyXG4gICAgICAgICAgICAvLyBFeHRlbmQgb3JpZ2luYWwgaHlwZXJ0eSBjb25maWd1cmF0aW9uO1xyXG4gICAgICAgICAgICBsZXQgY29uZmlndXJhdGlvbiA9IHt9O1xyXG4gICAgICAgICAgICBpZiAoIWVtcHR5T2JqZWN0KF9wcm94eURlc2NyaXB0b3IuY29uZmlndXJhdGlvbikpIHtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IE9iamVjdC5hc3NpZ24oe30sIEpTT04ucGFyc2UoX3Byb3h5RGVzY3JpcHRvci5jb25maWd1cmF0aW9uKSk7XHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IF9wcm94eURlc2NyaXB0b3IuY29uZmlndXJhdGlvbjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uZmlndXJhdGlvbi5ydW50aW1lVVJMID0gdGhpcy5fcnVudGltZVVSTDtcclxuXHJcbiAgICAgICAgICAgIC8vIERlcGxveSBDb21wb25lbnQgc3RlcCB4eHhcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIHh4eCBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuXHJcbiAgICAgICAgICAgICAgLy8gQWRkIHRoZSBtZXNzYWdlIGJ1cyBsaXN0ZW5lclxyXG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZUJ1cy5hZGRMaXN0ZW5lcihfcnVudGltZUlkcFByb3h5VVJMLCAobXNnKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBfcHJveHlTYW5kYm94LnBvc3RNZXNzYWdlKG1zZyk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIHJldHVybiBfcHJveHlTYW5kYm94LmRlcGxveUNvbXBvbmVudChfcHJveHlTb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUsIHJ1bnRpbWVJZHBQcm94eVVSTCwgY29uZmlndXJhdGlvbik7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSBFcnJvciBvbiBkZXBsb3kgY29tcG9uZW50OicsIGUpO1xyXG4gICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgaGFuZGxlRXJyb3IpXHJcbiAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcclxuXHJcblxyXG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIHh4eCBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcclxuXHJcbiAgICAgICAgICAgIC8vIExvYWQgU3R1YiBmdW5jdGlvbiByZXNvbHZlZCB3aXRoIHN1Y2Nlc3M7XHJcbiAgICAgICAgICAgIC8vIGxldCBpZHBQcm94eSA9IHtcclxuICAgICAgICAgICAgLy8gICBydW50aW1lSWRwUHJveHlVUkw6IF9ydW50aW1lSWRwUHJveHlVUkwsXHJcbiAgICAgICAgICAgIC8vICAgc3RhdHVzOiBkZXBsb3lDb21wb25lbnRTdGF0dXNcclxuICAgICAgICAgICAgLy8gfTtcclxuXHJcbiAgICAgICAgICAgIC8vdGhpcy5yZWdpc3RyeS5pZHBQcm94eUxpc3RbZG9tYWluXS5zdGF0dXMgPSAnZGVwbG95ZWQnO1xyXG4gICAgICAgICAgICBsZXQgaWRwUHJveHkgPSB0aGlzLnJlZ2lzdHJ5LmlkcFByb3h5TGlzdFtkb21haW5dO1xyXG5cclxuICAgICAgICAgICAgbG9nLmxvZygnW1J1bnRpbWUuTG9hZGVyLmxvYWRJZHBQcm94eV0gODogbG9hZGVkOiAnLCBpZHBQcm94eSk7XHJcblxyXG4gICAgICAgICAgICByZXNvbHZlKGlkcFByb3h5KTtcclxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkSWRwUHJveHldIC0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicpO1xyXG5cclxuICAgICAgICAgIH0sIGhhbmRsZUVycm9yKVxyXG4gICAgICAgICAgLmNhdGNoKGVycm9yUmVhc29uKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2hlY2sgaWYgdGhlIGxvYWRlciBpcyByZWFkeSB0byBsb2FkIGFsbCBjb21wb25lbnRzXHJcbiAgX3JlYWR5VG9Vc2UoKSB7XHJcblxyXG4gICAgbGV0IHN0YXR1cyA9IGZhbHNlO1xyXG5cclxuICAgIGlmICghdGhpcy5fcnVudGltZVVSTCkgdGhyb3cgbmV3IEVycm9yKCdbUnVudGltZS5Mb2FkZXJdIFRoZSBsb2FkZXIgbmVlZCB0aGUgcnVudGltZSB1cmwgYWRkcmVzcycpO1xyXG4gICAgaWYgKCF0aGlzLl9tZXNzYWdlc0J1cykgdGhyb3cgbmV3IEVycm9yKCdbUnVudGltZS5Mb2FkZXJdIFRoZSBsb2FkZXIgbmVlZCB0aGUgbWVzc2FnZUJ1cyBjb21wb25lbnQnKTtcclxuICAgIGlmICghdGhpcy5fcmVnaXN0cnkpIHRocm93IG5ldyBFcnJvcignW1J1bnRpbWUuTG9hZGVyXSBUaGUgbG9hZGVyIG5lZWQgdGhlIHJlZ2lzdHJ5IGNvbXBvbmVudCcpO1xyXG4gICAgaWYgKCF0aGlzLl9ydW50aW1lRmFjdG9yeSkgdGhyb3cgbmV3IEVycm9yKCdbUnVudGltZS5Mb2FkZXJdIFRoZSBsb2FkZXIgbmVlZCB0aGUgcnVudGltZSBmYWN0b3J5IGNvbXBvbmVudCcpO1xyXG5cclxuICAgIHN0YXR1cyA9IHRydWU7XHJcbiAgICByZXR1cm4gc3RhdHVzO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExvYWRlcjtcclxuIiwiaW1wb3J0IHsgcnVudGltZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3J1bnRpbWVDb25maWd1cmF0aW9uJztcclxuXHJcbmxldCBzdG9yYWdlcyA9IHt9O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0b3JhZ2UocnVudGltZUZhY3RvcnksIHJ1bnRpbWVTdGF0dXNVcGRhdGUpIHtcclxuICBpZiAoIXJ1bnRpbWVGYWN0b3J5KSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBydW50aW1lIGZhY3RvcnkgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XHJcblxyXG4gIE9iamVjdC5rZXlzKHJ1bnRpbWVDb25maWd1cmF0aW9uLnN0b3JhZ2VTY2hlbWFzKS5mb3JFYWNoKChrZXkpID0+IHtcclxuXHJcbiAgICBpZiAoIXN0b3JhZ2VzLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgc3RvcmFnZXNba2V5XSA9IHJ1bnRpbWVGYWN0b3J5LnN0b3JhZ2VNYW5hZ2VyKGtleSwgcnVudGltZUNvbmZpZ3VyYXRpb24uc3RvcmFnZVNjaGVtYXNba2V5XSwgcnVudGltZVN0YXR1c1VwZGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gIH0pO1xyXG5cclxuICByZXR1cm4gc3RvcmFnZXM7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTeW5jREIoa2V5LCBydW50aW1lRmFjdG9yeSwgc2NoZW1hLCBydW50aW1lU3RhdHVzVXBkYXRlLCB1cmwgPSBmYWxzZSkge1xyXG4gIGlmICghcnVudGltZUZhY3RvcnkpIHRocm93IG5ldyBFcnJvcignVGhlIHJ1bnRpbWUgZmFjdG9yeSBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcclxuXHJcbiAgbGV0IHJlbW90ZSA9IHVybCA/IHVybCA6IHJ1bnRpbWVDb25maWd1cmF0aW9uLnJlbW90ZVN0b3JhZ2U7XHJcblxyXG4gIHJldHVybiBydW50aW1lRmFjdG9yeS5zdG9yYWdlTWFuYWdlcihrZXksIHNjaGVtYSwgcnVudGltZVN0YXR1c1VwZGF0ZSwgcmVtb3RlKTtcclxuXHJcbn1cclxuIiwiaW1wb3J0IHtkaXZpZGVVUkwsIGdldENvbmZpZ3VyYXRpb25SZXNvdXJjZXMsIGJ1aWxkVVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCB7IHJ1bnRpbWVVdGlscyB9IGZyb20gJy4vcnVudGltZVV0aWxzJztcclxuXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdEZXNjcmlwdG9ycycpO1xyXG5cclxuY2xhc3MgRGVzY3JpcHRvcnMge1xyXG5cclxuICBjb25zdHJ1Y3RvcihydW50aW1lVVJMLCBjYXRhbG9ndWUsIHJ1bnRpbWVDb25maWd1cmF0aW9uKSB7XHJcbiAgICBpZiAoIXJ1bnRpbWVVUkwpIHRocm93IEVycm9yKCdUaGUgZGVzY3JpcHRvciBuZWVkIHRvIGtub3cgdGhlIHJ1bnRpbWUgdXJsIHRvIGJlIHVzZWQnKTtcclxuICAgIGlmICghY2F0YWxvZ3VlKSB0aHJvdyBFcnJvcignVGhlIGRlc2NyaXB0b3IgbmVlZHMgdGhlIGNhdGFsb2d1ZSBpbnN0YW5jZScpO1xyXG4gICAgaWYgKCFydW50aW1lQ29uZmlndXJhdGlvbikgdGhyb3cgRXJyb3IoJ1RoZSBkZXNjcmlwdG9yIG5lZWRzIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb24nKTtcclxuXHJcbiAgICB0aGlzLmxvZyA9IGxvZztcclxuXHJcbiAgICB0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uID0gcnVudGltZUNvbmZpZ3VyYXRpb247XHJcbiAgICB0aGlzLnJ1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xyXG4gICAgdGhpcy5jYXRhbG9ndWUgPSBjYXRhbG9ndWU7XHJcblxyXG4gICAgdGhpcy5jb25zdHJhaW50cyA9IHJ1bnRpbWVVdGlscy5ydW50aW1lQ2FwYWJpbGl0aWVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0SHlwZXJ0eURlc2NyaXB0b3IoaHlwZXJ0eVVSTCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY2F0YWxvZ3VlLmdldEh5cGVydHlEZXNjcmlwdG9yKGh5cGVydHlVUkwsIHRydWUsIHRoaXMuY29uc3RyYWludHMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3R1YkRlc2NyaXB0b3Ioc3R1YlVSTCkge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgZG9tYWluO1xyXG4gICAgICBsZXQgcHJvdG9zdHViO1xyXG4gICAgICBsZXQgcHJvdG9TdHViVVJMO1xyXG5cclxuICAgICAgbGV0IG9yaWdpbkRpdmlkZWRVUkwgPSBkaXZpZGVVUkwodGhpcy5ydW50aW1lVVJMKTtcclxuICAgICAgbGV0IG9yaWdpbkRvbWFpbiA9IG9yaWdpbkRpdmlkZWRVUkwuZG9tYWluO1xyXG5cclxuICAgICAgaWYgKHN0dWJVUkwuaW5jbHVkZXMoJzovLycpKSB7XHJcbiAgICAgICAgbGV0IGRpdmlkZWRVUkwgPSBkaXZpZGVVUkwoc3R1YlVSTCk7XHJcbiAgICAgICAgZG9tYWluID0gZGl2aWRlZFVSTC5kb21haW47XHJcbiAgICAgICAgbGV0IHBhdGggPSBkaXZpZGVkVVJMLmlkZW50aXR5O1xyXG5cclxuICAgICAgICBpZiAocGF0aCkge1xyXG4gICAgICAgICAgcHJvdG9zdHViID0gcGF0aC5zdWJzdHJpbmcocGF0aC5sYXN0SW5kZXhPZignLycpICsgMSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHByb3Rvc3R1YiA9ICdkZWZhdWx0JztcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHByb3Rvc3R1YiA9ICdkZWZhdWx0JztcclxuICAgICAgICBkb21haW4gPSBzdHViVVJMO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwcm90b1N0dWJVUkwgPSBidWlsZFVSTCh0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uLCAnY2F0YWxvZ3VlVVJMcycsICdwcm90b2NvbHN0dWInLCBwcm90b3N0dWIpO1xyXG4gICAgICBpZiAoZG9tYWluICE9PSB0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uLmRvbWFpbikge1xyXG4gICAgICAgIGlmICghc3R1YlVSTC5pbmRleE9mKCdodHRwcycpIHx8ICFzdHViVVJMLmluZGV4T2YoJ2h5cGVydHktY2F0YWxvZ3VlJykpIHtcclxuICAgICAgICAgIHByb3RvU3R1YlVSTCA9IHN0dWJVUkw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAvLyBUT0RPOiBjaGVjayBob3cgdG8gbG9hZCBmb3JtIGRpZmZlcmVudCBjb25maWd1cmF0aW9uIGRvbWFpblxyXG4gICAgICAgICAgbGV0IHJlc291cmNlID0gZ2V0Q29uZmlndXJhdGlvblJlc291cmNlcyh0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uLCAnY2F0YWxvZ3VlVVJMcycsICdwcm90b2NvbHN0dWInKTtcclxuICAgICAgICAgIHByb3RvU3R1YlVSTCA9IHJlc291cmNlLnByZWZpeCArIGRvbWFpbiArIHJlc291cmNlLnN1ZmZpeCArIHByb3Rvc3R1YjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxvZy5sb2coJ0xvYWQgUHJvdG9jb2xTdHViIGZvciBkb21haW4sICcgKyBkb21haW4gKyAnIDogJywgcHJvdG9TdHViVVJMKTtcclxuICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ3VlLmdldFN0dWJEZXNjcmlwdG9yKHByb3RvU3R1YlVSTCwgdHJ1ZSwgdGhpcy5jb25zdHJhaW50cykudGhlbigocmVzdWx0KSA9PiB7XHJcblxyXG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuXHJcbiAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xyXG5cclxuICAgICAgICAvLyBsb2cubG9nKCdFcnJvcjogJywgZXJyb3IpO1xyXG5cclxuICAgICAgICBwcm90b3N0dWIgPSBkb21haW47XHJcbiAgICAgICAgZG9tYWluID0gb3JpZ2luRG9tYWluO1xyXG5cclxuICAgICAgICBsZXQgcmVzb3VyY2UgPSBnZXRDb25maWd1cmF0aW9uUmVzb3VyY2VzKHRoaXMucnVudGltZUNvbmZpZ3VyYXRpb24sICdjYXRhbG9ndWVVUkxzJywgJ3Byb3RvY29sc3R1YicpO1xyXG4gICAgICAgIHByb3RvU3R1YlVSTCA9IHJlc291cmNlLnByZWZpeCArIGRvbWFpbiArIHJlc291cmNlLnN1ZmZpeCArIHByb3Rvc3R1YjtcclxuXHJcbiAgICAgICAgLy8gbG9nLmxvZygnRmFsbGJhY2sgLT4gTG9hZCBQcm90b2NvbHN0dWIgZm9yIGRvbWFpbiwgJyArIGRvbWFpbiArICcgOiAnLCBwcm90b3N0dWIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhdGFsb2d1ZS5nZXRTdHViRGVzY3JpcHRvcihwcm90b1N0dWJVUkwsIHRydWUsIHRoaXMuY29uc3RyYWludHMpO1xyXG4gICAgICB9KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRJZHBQcm94eURlc2NyaXB0b3IoaWRwUHJveHlVUkwpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgZG9tYWluO1xyXG4gICAgICBsZXQgaWRwcHJveHk7XHJcblxyXG4gICAgICBsZXQgb3JpZ2luRGl2aWRlZFVSTCA9IGRpdmlkZVVSTCh0aGlzLnJ1bnRpbWVVUkwpO1xyXG4gICAgICBsZXQgb3JpZ2luRG9tYWluID0gb3JpZ2luRGl2aWRlZFVSTC5kb21haW47XHJcbiAgICAgIGxldCBjb25zdHJhaW50cyA9IHRoaXMuY29uc3RyYWludHM7XHJcblxyXG4gICAgICBjb25zdHJhaW50cy5jb25zdHJhaW50cy5vbmx5QWNjZXNzVG9rZW4gPSB0cnVlO1xyXG4gICAgICBjb25zdHJhaW50cy5jb25zdHJhaW50cy5vbmx5SWRBc3NlcnRpb25WYWxpZGF0aW9uID0gdHJ1ZTtcclxuICAgICAgY29uc29sZS5sb2coJ0xPRyBIRVJFJywgY29uc3RyYWludHMpO1xyXG4gICAgICBpZiAoaWRwUHJveHlVUkwuaW5jbHVkZXMoJzovLycpKSB7XHJcbiAgICAgICAgbGV0IGRpdmlkZWRVUkwgPSBkaXZpZGVVUkwoaWRwUHJveHlVUkwpO1xyXG4gICAgICAgIGRvbWFpbiA9IGRpdmlkZWRVUkwuZG9tYWluO1xyXG4gICAgICAgIGxldCBwYXRoID0gZGl2aWRlZFVSTC5pZGVudGl0eTtcclxuICAgICAgICBpZiAocGF0aCkge1xyXG4gICAgICAgICAgaWRwcHJveHkgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWRwcHJveHkgPSAnZGVmYXVsdCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZHBwcm94eSA9ICdkZWZhdWx0JztcclxuICAgICAgICBkb21haW4gPSBpZHBQcm94eVVSTDtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIGxldCByZXNvdXJjZSA9IGdldENvbmZpZ3VyYXRpb25SZXNvdXJjZXModGhpcy5ydW50aW1lQ29uZmlndXJhdGlvbiwgJ2NhdGFsb2d1ZVVSTHMnLCAnaWRwUHJveHknKTtcclxuXHJcbiAgICAgIGlkcFByb3h5VVJMID0gcmVzb3VyY2UucHJlZml4ICsgZG9tYWluICsgcmVzb3VyY2Uuc3VmZml4ICsgaWRwcHJveHk7XHJcbiAgICAgIC8vIGxvZy5sb2coJ0xvYWQgSWRwIFByb3h5IGZvciBkb21haW4sICcgKyBkb21haW4gKyAnIDogJywgaWRwUHJveHlVUkwpO1xyXG4gICAgICByZXR1cm4gdGhpcy5jYXRhbG9ndWUuZ2V0SWRwUHJveHlEZXNjcmlwdG9yKGlkcFByb3h5VVJMLCB0cnVlLCBjb25zdHJhaW50cykudGhlbigocmVzdWx0KSA9PiB7XHJcblxyXG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuXHJcbiAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuXHJcbiAgICAgICAgaWRwcHJveHkgPSBkb21haW47XHJcbiAgICAgICAgZG9tYWluID0gb3JpZ2luRG9tYWluO1xyXG5cclxuICAgICAgICBpZHBQcm94eVVSTCA9IGJ1aWxkVVJMKHRoaXMucnVudGltZUNvbmZpZ3VyYXRpb24sICdjYXRhbG9ndWVVUkxzJywgJ2lkcFByb3h5JywgaWRwcHJveHkpO1xyXG5cclxuICAgICAgICAvLyBsb2cubG9nKCdMb2FkIElkcCBQcm94eSBmb3IgZG9tYWluLCAnICsgZG9tYWluICsgJyA6ICcsIGlkcFByb3h5VVJMKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXRhbG9ndWUuZ2V0SWRwUHJveHlEZXNjcmlwdG9yKGlkcFByb3h5VVJMLCB0cnVlLCBjb25zdHJhaW50cyk7XHJcbiAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERlc2NyaXB0b3JzO1xyXG4iLCIvKipcclxuICogIENsYXNzIHdoZXJlIG1lc3NhZ2UgYnVzIGhhbmRsZXJzIGFyZSBidWlsdC4gVG8gYmUgdXNlZCBieSB0aGUgUnVudGltZVVBIHRvIGluaXRpYWxpc2UgdGhlIHJ1bnRpbWUgVUEuXHJcbiAqL1xyXG5cclxuLy9pbXBvcnQgeyBsb2cgYXMgbG9nTGV2ZWxzIH0gZnJvbSAnLi4vbG9nTGV2ZWxzJztcclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1J1bnRpbWVVQScpO1xyXG5cclxuY2xhc3MgTXNnQnVzSGFuZGxlcnMge1xyXG5cclxuICBjb25zdHJ1Y3RvcihwZXAsIGlkbSwgY3J5cHRvKSB7XHJcbiAgICBpZiAoIXBlcCkgdGhyb3cgRXJyb3IoJ1tNc2dCdXNIYW5kbGVyc10gcGVwIGlucHV0IHBhcmFtZW50ZXIgaXMgbWFuZGF0b3J5Jyk7XHJcbiAgICBpZiAoIWlkbSkgdGhyb3cgRXJyb3IoJ1tNc2dCdXNIYW5kbGVyc10gaWRtIGlucHV0IHBhcmFtZW50ZSBpcyBtYW5kYXRvcnknKTtcclxuICAgIGlmICghY3J5cHRvKSB0aHJvdyBFcnJvcignW01zZ0J1c0hhbmRsZXJzXSBjcnlwdG8gaW5wdXQgcGFyYW1lbnRlIGlzIG1hbmRhdG9yeScpO1xyXG5cclxuICAgIHRoaXMucG9saWN5RW5naW5lID0gcGVwO1xyXG4gICAgdGhpcy5pZGVudGl0eU1hbmFnZXIgPSBpZG07XHJcbiAgICB0aGlzLmNyeXB0b01hbmFnZXIgPSBjcnlwdG87XHJcbiAgfVxyXG5cclxuICAvLyBQb2xpY3kgYmFzZWQgYWNjZXNzIGNvbnRyb2wgZm9yIGluY29taW5nIG1lc3NhZ2VzXHJcblxyXG4gIGdldCBwZXBJbkhhbmRsZXIoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiAoY3R4KSA9PiB7XHJcbiAgICAgIF90aGlzLnBvbGljeUVuZ2luZS5hdXRob3Jpc2UoY3R4Lm1zZywgdHJ1ZSkudGhlbigoY2hhbmdlZE1ncykgPT4ge1xyXG4gICAgICAgIGN0eC5tc2cgPSBjaGFuZ2VkTWdzO1xyXG4gICAgICAgIGN0eC5uZXh0KCk7XHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICBsb2cuZXJyb3IocmVhc29uKTtcclxuICAgICAgICBjdHguZmFpbChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gIH1cclxuXHJcbiAgLy8gUG9saWN5IGJhc2VkIGFjY2VzcyBjb250cm9sIGZvciBvdXRnb2luZyBtZXNzYWdlc1xyXG4gIGdldCBwZXBPdXRIYW5kbGVyKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiAoY3R4KSA9PiB7XHJcbiAgICAgIF90aGlzLnBvbGljeUVuZ2luZS5hdXRob3Jpc2UoY3R4Lm1zZywgZmFsc2UpLnRoZW4oKGNoYW5nZWRNZ3MpID0+IHtcclxuICAgICAgICBjdHgubXNnID0gY2hhbmdlZE1ncztcclxuICAgICAgICBjdHgubmV4dCgpO1xyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgbG9nLmVycm9yKHJlYXNvbik7XHJcbiAgICAgICAgY3R4LmZhaWwocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gQWRkIElkZW50aXR5IGluZm8gdG8gbWVzc2FnZXNcclxuICBnZXQgaWRtSGFuZGxlcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gKGN0eCkgPT4ge1xyXG4gICAgICBfdGhpcy5pZGVudGl0eU1hbmFnZXIucHJvY2Vzc01lc3NhZ2UoY3R4Lm1zZykudGhlbigoY2hhbmdlZE1ncykgPT4ge1xyXG4gICAgICAgIGN0eC5tc2cgPSBjaGFuZ2VkTWdzO1xyXG4gICAgICAgIGN0eC5uZXh0KCk7XHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICBsb2cuZXJyb3IocmVhc29uKTtcclxuICAgICAgICBjdHguZmFpbChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyBlbmNyeXB0IG1lc3NhZ2VzXHJcblxyXG4gIGdldCBlbmNyeXB0SGFuZGxlcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gKGN0eCkgPT4ge1xyXG4gICAgICBfdGhpcy5jcnlwdG9NYW5hZ2VyLmVuY3J5cHRNZXNzYWdlKGN0eC5tc2cpLnRoZW4oKGNoYW5nZWRNZ3MpID0+IHtcclxuICAgICAgICBjdHgubXNnID0gY2hhbmdlZE1ncztcclxuICAgICAgICBjdHgubmV4dCgpO1xyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgbG9nLmVycm9yKHJlYXNvbik7XHJcbiAgICAgICAgY3R4LmZhaWwocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICB9XHJcblxyXG4gIC8vIGRlY3J5cHQgbWVzc2FnZXNcclxuXHJcbiAgZ2V0IGRlY3J5cHRIYW5kbGVyKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiAoY3R4KSA9PiB7XHJcbiAgICAgIF90aGlzLmNyeXB0b01hbmFnZXIuZGVjcnlwdE1lc3NhZ2UoY3R4Lm1zZykudGhlbigoY2hhbmdlZE1ncykgPT4ge1xyXG4gICAgICAgIGN0eC5tc2cgPSBjaGFuZ2VkTWdzO1xyXG4gICAgICAgIGN0eC5uZXh0KCk7XHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICBsb2cud2FybihyZWFzb24pO1xyXG4gICAgICAgIGN0eC5mYWlsKHJlYXNvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTXNnQnVzSGFuZGxlcnM7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0NvcmVEaXNjb3ZlcnknKTtcclxuXHJcblxyXG5pbXBvcnQge2RpdmlkZVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLyoqXHJcbiogQ29yZSBEaXNjb3ZlcnkgaW50ZXJmYWNlXHJcbiogQ2xhc3MgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIHNlYXJjaCBmb3IgaHlwZXJ0aWVzIGFuZCBEYXRhT2JqZWN0cyB1c2luZyB0aGUgbWVzc2FnZSBidXNcclxuKi9cclxuY2xhc3MgQ29yZURpc2NvdmVyeSB7XHJcblxyXG4gIC8qKlxyXG4gICogVG8gaW5pdGlhbGlzZSB0aGUgRGlzY292ZXJ5LCB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIHN1cHBvcnQgZm9yIGh5cGVydGllcyB0b1xyXG4gICogcXVlcnkgdXNlcnMgcmVnaXN0ZXJlZCBpbiBvdXRzaWRlIHRoZSBpbnRlcm5hbCBjb3JlLlxyXG4gICogQHBhcmFtICB7TWVzc2FnZUJ1c30gICAgICAgICAgbXNnYnVzICAgICAgICAgICAgICAgIG1zZ2J1c1xyXG4gICogQHBhcmFtICB7UnVudGltZVVSTH0gICAgICAgICAgcnVudGltZVVSTCAgICAgICAgICAgIHJ1bnRpbWVVUkxcclxuICAqIEBwYXJhbSAge2dyYXBoQ29ubmVjdG9yfSAgICBncmFwaENvbm5lY3RvclxyXG4gICovXHJcbiAgY29uc3RydWN0b3IocnVudGltZVVSTCwgbXNnQnVzLCBncmFwaENvbm5lY3RvciwgcnVudGltZUZhY3RvcnksIHJlZ2lzdHJ5KSB7XHJcbiAgICBpZiAoIXJ1bnRpbWVGYWN0b3J5KSB0aHJvdyBFcnJvcignVGhlIGNhdGFsb2d1ZSBuZWVkcyB0aGUgcnVudGltZUZhY3RvcnknKTtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgdGhpcy5fbWVzc2FnZUJ1cyA9IG1zZ0J1cztcclxuICAgIF90aGlzLmdyYXBoQ29ubmVjdG9yID0gZ3JhcGhDb25uZWN0b3I7XHJcbiAgICBfdGhpcy5odHRwUmVxdWVzdCA9IHJ1bnRpbWVGYWN0b3J5LmNyZWF0ZUh0dHBSZXF1ZXN0KCk7XHJcbiAgICBfdGhpcy5kb21haW4gPSBkaXZpZGVVUkwocnVudGltZVVSTCkuZG9tYWluO1xyXG4gICAgX3RoaXMuZGlzY292ZXJ5VVJMID0gcnVudGltZVVSTCArICcvZGlzY292ZXJ5Lyc7XHJcbiAgICBfdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xyXG5cclxuICAgIF90aGlzLm1lc3NhZ2VCdXMuYWRkTGlzdGVuZXIoX3RoaXMuZGlzY292ZXJ5VVJMLCAobXNnKSA9PiB7XHJcblxyXG4gICAgICBfdGhpcy5kaXNjb3ZlcnlNYW5hZ2VyKG1zZykudGhlbihyZXN1bHQgPT57XHJcblxyXG4gICAgICAgIC8vRkxPVy1PVVQ6IG1lc3NhZ2UgcmVzcG9uc2VcclxuICAgICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgIGlkOiBtc2cuaWQsXHJcbiAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnLFxyXG4gICAgICAgICAgZnJvbTogbXNnLnRvLFxyXG4gICAgICAgICAgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICBjb2RlOiAyMDAsXHJcbiAgICAgICAgICAgIHZhbHVlOiByZXN1bHRcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICBsZXQgZGVzY3JpcHRpb247XHJcbiAgICAgICAgICBsZXQgY29kZTtcclxuXHJcbiAgICAgICAgICBpZiAoZXJyID09PSAnR3JhcGhDb25uZWN0b3InKSB7XHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gJ1RoaXMgc2VhcmNoIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIG1vbWVudC4gVHJ5IGxhdGVyLic7XHJcbiAgICAgICAgICAgIGNvZGUgPSA1MDA7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICdOb3QgRm91bmQnO1xyXG4gICAgICAgICAgICBjb2RlID0gNDA0O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vRkxPVy1PVVQ6IGVycm9yIG1lc3NhZ2UgcmVzcG9uc2VcclxuICAgICAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICBpZDogbXNnLmlkLFxyXG4gICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnLFxyXG4gICAgICAgICAgICBmcm9tOiBtc2cudG8sXHJcbiAgICAgICAgICAgIHRvOiBtc2cuZnJvbSxcclxuICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBNZXNzYWdlQnVzLlxyXG4gICAqL1xyXG4gIGdldCBtZXNzYWdlQnVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VCdXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBNZXNzYWdlQnVzLlxyXG4gICAqIEBwYXJhbSB7TWVzc2FnZUJ1c30gICAgICAgICAgIG1lc3NhZ2VCdXMgICAgVGhlIE1lc3NhZ2UgQnVzLlxyXG4gICAqL1xyXG4gIHNldCBtZXNzYWdlQnVzKG1lc3NhZ2VCdXMpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VCdXMgPSBtZXNzYWdlQnVzO1xyXG4gIH1cclxuXHJcbiAgLyogZnVuY3Rpb24gdG8gZGVjaWRlIHdoYXQgZGlzY292ZXJ5IG1ldGhvZCB0byBjYWxsIGFuZCBsYXRlciByZXR1cm4gdGhlIHJlc3BvbnNlIG1zZyAgKi9cclxuICBkaXNjb3ZlcnlNYW5hZ2VyKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBkb21haW4gPSBkaXZpZGVVUkwobXNnLmZyb20pLmRvbWFpbjtcclxuICAgIGxldCBhdHJpYnV0ZXMgPSBtc2cuYm9keS5yZXNvdXJjZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcclxuICAgIGxldCByZXNvdXJjZXMgPSBbXTtcclxuICAgIGxldCBkYXRhU2NoZW1lcyA9IFtdO1xyXG5cclxuICAgIGxvZy5sb2coJ1tDb3JlRGlzY292ZXJ5LmRpc2NvdmVyeU1hbmFnZXJdIHJlY2VpdmVkOiAnLCBtc2cpO1xyXG5cclxuICAgIGlmIChtc2cuYm9keS5jcml0ZXJpYSkge1xyXG4gICAgICBpZiAobXNnLmJvZHkuY3JpdGVyaWEucmVzb3VyY2VzKSB7IHJlc291cmNlcyA9IG1zZy5ib2R5LmNyaXRlcmlhLnJlc291cmNlczsgfVxyXG4gICAgICBpZiAobXNnLmJvZHkuY3JpdGVyaWEuZGF0YVNjaGVtZXMpIHsgZGF0YVNjaGVtZXMgPSBtc2cuYm9keS5jcml0ZXJpYS5kYXRhU2NoZW1lczsgfVxyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAoYXRyaWJ1dGVzWzFdKSB7XHJcbiAgICAgIGNhc2UgJ3VzZXInOlxyXG4gICAgICAgIGlmIChhdHJpYnV0ZXNbMF0gPT0gJ2h5cGVydHknKSB7IHJldHVybiBfdGhpcy5kaXNjb3Zlckh5cGVydGllcyhtc2cuYm9keS5yZXNvdXJjZS5zcGxpdCgndXNlci8nKVsxXSwgZGF0YVNjaGVtZXMsIHJlc291cmNlcywgbXNnLmJvZHkuY3JpdGVyaWEuZG9tYWluKTsgfSBlbHNlIHsgcmV0dXJuIF90aGlzLmRpc2NvdmVyRGF0YU9iamVjdHMobXNnLmJvZHkucmVzb3VyY2Uuc3BsaXQoJ3VzZXIvJylbMV0sIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIG1zZy5ib2R5LmNyaXRlcmlhLmRvbWFpbik7IH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ3VybCc6XHJcbiAgICAgICAgaWYgKGF0cmlidXRlc1swXSA9PSAnaHlwZXJ0eScpIHsgcmV0dXJuIF90aGlzLmRpc2NvdmVySHlwZXJ0eVBlclVSTChtc2cuYm9keS5yZXNvdXJjZS5zcGxpdCgndXJsLycpWzFdLCBtc2cuYm9keS5jcml0ZXJpYS5kb21haW4pOyB9IGVsc2UgeyByZXR1cm4gX3RoaXMuZGlzY292ZXJEYXRhT2JqZWN0UGVyVVJMKG1zZy5ib2R5LnJlc291cmNlLnNwbGl0KCd1cmwvJylbMV0sIG1zZy5ib2R5LmNyaXRlcmlhLmRvbWFpbik7IH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbmFtZSc6XHJcbiAgICAgICAgcmV0dXJuIF90aGlzLmRpc2NvdmVyRGF0YU9iamVjdHNQZXJOYW1lKG1zZy5ib2R5LnJlc291cmNlLnNwbGl0KCduYW1lLycpWzFdLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzLCBtc2cuYm9keS5jcml0ZXJpYS5kb21haW4pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdyZXBvcnRlcic6XHJcbiAgICAgICAgcmV0dXJuIF90aGlzLmRpc2NvdmVyRGF0YU9iamVjdHNQZXJSZXBvcnRlcihtc2cuYm9keS5yZXNvdXJjZS5zcGxpdCgncmVwb3J0ZXIvJylbMV0sIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIG1zZy5ib2R5LmNyaXRlcmlhLmRvbWFpbik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2d1aWQnOlxyXG4gICAgICAgIGlmICh0eXBlb2YgX3RoaXMuZ3JhcGhDb25uZWN0b3IgIT09ICd1bmRlZmluZWQnICYmICBfdGhpcy5ncmFwaENvbm5lY3RvciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGF0cmlidXRlc1swXSA9PSAnaHlwZXJ0eScpIHsgcmV0dXJuIF90aGlzLmRpc2NvdmVySHlwZXJ0aWVzUGVyR1VJRChtc2cuYm9keS5yZXNvdXJjZS5zcGxpdCgndXNlci1ndWlkOi8vJylbMV0sIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMpOyB9IGVsc2UgeyByZXR1cm4gX3RoaXMuZGlzY292ZXJEYXRhT2JqZWN0c1BlckdVSUQobXNnLmJvZHkucmVzb3VyY2Uuc3BsaXQoJ3VzZXItZ3VpZDovLycpWzFdLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKTsgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnR3JhcGhDb25uZWN0b3InKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSAndXNlcnByb2ZpbGUnOlxyXG4gICAgICAgIGlmICh0eXBlb2YgX3RoaXMuZ3JhcGhDb25uZWN0b3IgIT09ICd1bmRlZmluZWQnICYmICBfdGhpcy5ncmFwaENvbm5lY3RvciAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGF0cmlidXRlc1swXSA9PSAnaHlwZXJ0eScpIHsgcmV0dXJuIF90aGlzLmRpc2NvdmVySHlwZXJ0aWVzUGVyVXNlclByb2ZpbGVEYXRhKG1zZy5ib2R5LnJlc291cmNlLnNwbGl0KCd1c2VycHJvZmlsZS8nKVsxXSwgZGF0YVNjaGVtZXMsIHJlc291cmNlcyk7IH0gZWxzZSB7IHJldHVybiBfdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RzUGVyVXNlclByb2ZpbGVEYXRhKG1zZy5ib2R5LnJlc291cmNlLnNwbGl0KCd1c2VycHJvZmlsZS8nKVsxXSwgZGF0YVNjaGVtZXMsIHJlc291cmNlcyk7IH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ0dyYXBoQ29ubmVjdG9yJyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIHVzZXIgaWRlbnRpZmllciAoZWcgZW1haWwsIG5hbWUgLi4uKVxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlcklkZW50aWZpZXJcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIGRhdGFTY2hlbWVzIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xyXG4gICovXHJcbiAgZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGEodXNlcklkZW50aWZpZXIsIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgLy90cmFuc2xhdGUgdXNlciBpZGVudGlmaWVyIChlLmcuIGVtYWlsLCBuYW1lLi4uKSBpbnRvIHRoZSBhc3NvY2lhdGVkIEdVSURzXHJcbiAgICAgIF90aGlzLmRpc2NvdmVyR1VJRFBlclVzZXJJZGVudGlmaWVyKHVzZXJJZGVudGlmaWVyKVxyXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGd1aWRzKSB7XHJcblxyXG4gICAgICAgICAgbGV0IGh5cGVydGllc1Byb21pc2VzID0gZ3VpZHMubWFwKGZ1bmN0aW9uKGd1aWQpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5kaXNjb3Zlckh5cGVydGllc1BlckdVSUQoZ3VpZCwgZGF0YVNjaGVtZXMsIHJlc291cmNlcylcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGh5cGVydGllcykge1xyXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKGh5cGVydGllcyk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIFByb21pc2UuYWxsKGh5cGVydGllc1Byb21pc2VzKVxyXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbihoeXBlcnRpZXNSZXN1bHQpIHtcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGh5cGVydGllcyA9IFtdLmNvbmNhdC5hcHBseShbXSwgaHlwZXJ0aWVzUmVzdWx0KTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGh5cGVydGllcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoJ05vIGh5cGVydGllcyB3ZXJlIGZvdW5kJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXNvbHZlKGh5cGVydGllcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgRGF0YU9iamVjdHMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgdXNlciBpZGVudGlmaWVyIChlZyBlbWFpbCwgbmFtZSAuLi4pXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICB1c2VySWRlbnRpZmllclxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgZGF0YVNjaGVtZXMgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyVXNlclByb2ZpbGVEYXRhKHVzZXJJZGVudGlmaWVyLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIC8vdHJhbnNsYXRlIHVzZXIgaWRlbnRpZmllciAoZS5nLiBlbWFpbCwgbmFtZS4uLikgaW50byB0aGUgYXNzb2NpYXRlZCBHVUlEc1xyXG4gICAgICBfdGhpcy5kaXNjb3ZlckdVSURQZXJVc2VySWRlbnRpZmllcih1c2VySWRlbnRpZmllcilcclxuICAgICAgICAudGhlbihmdW5jdGlvbihndWlkcykge1xyXG5cclxuICAgICAgICAgIGxldCBkYXRhT2JqZWN0c1Byb21pc2VzID0gZ3VpZHMubWFwKGZ1bmN0aW9uKGd1aWQpIHtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RzUGVyR1VJRChndWlkLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdHMpIHtcclxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhT2JqZWN0cyk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIFByb21pc2UuYWxsKGRhdGFPYmplY3RzUHJvbWlzZXMpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RzUmVzdWx0KSB7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBkYXRhT2JqZWN0cyA9IFtdLmNvbmNhdC5hcHBseShbXSwgZGF0YU9iamVjdHNSZXN1bHQpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KCdObyBkYXRhT2JqZWN0cyB3ZXJlIGZvdW5kJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICByZXNvbHZlKGRhdGFPYmplY3RzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgR1VJRFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICBndWlkXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBkYXRhU2NoZW1lcyAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqL1xyXG4gIGRpc2NvdmVySHlwZXJ0aWVzUGVyR1VJRChndWlkLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIC8vdHJhbnNsYXRlIEdVSUQgaW50byB0aGUgdXNlciBJRHMgdG8gcXVlcnkgdGhlIGRvbWFpbiByZWdpc3RyeVxyXG4gICAgICBfdGhpcy5kaXNjb3ZlclVzZXJJZHNQZXJHVUlEKGd1aWQpXHJcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24odWlkcykge1xyXG5cclxuICAgICAgICAvL3RyYW5zbGF0ZSB1c2VyIElEcyBpbnRvIHRoZSBhc3NvY2lhdGVkIGh5cGVydGllcyByZWdpc3RlcmVkIGluIHNvbWUgZG9tYWluXHJcbiAgICAgICAgICBsZXQgaHlwZXJ0aWVzUHJvbWlzZXMgPSB1aWRzLm1hcChmdW5jdGlvbih1aWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICAgIF90aGlzLmRpc2NvdmVySHlwZXJ0aWVzKHVpZC51SUQsIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIHVpZC5kb21haW4pXHJcbiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihoeXBlcnRpZXMpIHtcclxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShoeXBlcnRpZXMpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBQcm9taXNlLmFsbChoeXBlcnRpZXNQcm9taXNlcylcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oaHlwZXJ0aWVzUmVzdWx0KSB7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBoeXBlcnRpZXMgPSBbXS5jb25jYXQuYXBwbHkoW10sIGh5cGVydGllc1Jlc3VsdCk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChoeXBlcnRpZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KCdObyBoeXBlcnRpZXMgd2VyZSBmb3VuZCcpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gbG9nLmxvZygnSHlwZXJ0aWVzIDogJywgaHlwZXJ0aWVzKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKGh5cGVydGllcyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBZHZhbmNlZCBTZWFyY2ggZm9yIERhdGFPYmplY3RzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIEdVSURcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgZ3VpZFxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgZGF0YVNjaGVtZXMgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyR1VJRChndWlkLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIC8vdHJhbnNsYXRlIEdVSUQgaW50byB0aGUgdXNlciBJRHMgdG8gcXVlcnkgdGhlIGRvbWFpbiByZWdpc3RyeVxyXG4gICAgICBfdGhpcy5kaXNjb3ZlclVzZXJJZHNQZXJHVUlEKGd1aWQpXHJcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24odWlkcykge1xyXG5cclxuICAgICAgICAvL3RyYW5zbGF0ZSB1c2VyIElEcyBpbnRvIHRoZSBhc3NvY2lhdGVkIGRhdGFPYmplY3RzIHJlZ2lzdGVyZWQgaW4gc29tZSBkb21haW5cclxuICAgICAgICAgIGxldCBkYXRhT2JqZWN0UHJvbWlzZXMgPSB1aWRzLm1hcChmdW5jdGlvbih1aWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgICAgICAgIF90aGlzLmRpc2NvdmVyRGF0YU9iamVjdHModWlkLnVJRCwgZGF0YVNjaGVtZXMsIHJlc291cmNlcywgdWlkLmRvbWFpbilcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YU9iamVjdHMpO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBQcm9taXNlLmFsbChkYXRhT2JqZWN0UHJvbWlzZXMpXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RzUmVzdWx0KSB7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBkYXRhT2JqZWN0cyA9IFtdLmNvbmNhdC5hcHBseShbXSwgZGF0YU9iamVjdHNSZXN1bHQpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KCdObyBkYXRhT2JqZWN0cyB3ZXJlIGZvdW5kJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBsb2cubG9nKCdEYXRhT2JqZWN0cyA6ICcsIGRhdGFPYmplY3RzKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKGRhdGFPYmplY3RzKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYW5kIGFzc29jaWF0ZWQgd2l0aCBzb21lIHVzZXIgSURcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXIgICAgICAgICAgICAgICAgICB1c2VyIGlkZW50aWZpZXIsIGVpdGhlciBpbiB1cmwgb3IgZW1haWwgZm9ybWF0XHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBkYXRhU2NoZW1lcyAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxyXG4gICovXHJcbiAgZGlzY292ZXJIeXBlcnRpZXModXNlciwgZGF0YVNjaGVtZXMsIHJlc291cmNlcywgZG9tYWluKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcclxuXHJcbiAgICBhY3RpdmVEb21haW4gPSAoIWRvbWFpbikgPyBfdGhpcy5kb21haW4gOiBkb21haW47XHJcblxyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3JlYWQnLFxyXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXHJcbiAgICAgIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIGFjdGl2ZURvbWFpbixcclxuICAgICAgYm9keToge1xyXG5cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodXNlci5pbmRleE9mKCd1c2VyOi8vJykgPiAtMSkgeyBtc2cuYm9keS5yZXNvdXJjZSA9IHVzZXI7IH0gZWxzZSB7IG1zZy5ib2R5LnJlc291cmNlID0gJy9oeXBlcnR5L2lkcC1pZGVudGlmaWVyLycgKyB1c2VyOyB9XHJcblxyXG4gICAgaWYgKGRhdGFTY2hlbWVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgaWYgKCFtc2cuYm9keS5jcml0ZXJpYSkgeyBtc2cuYm9keS5jcml0ZXJpYSA9IHt9OyB9XHJcbiAgICAgIG1zZy5ib2R5LmNyaXRlcmlhLmRhdGFTY2hlbWVzID0gZGF0YVNjaGVtZXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHJlc291cmNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmICghbXNnLmJvZHkuY3JpdGVyaWEpIHsgbXNnLmJvZHkuY3JpdGVyaWEgPSB7fTsgfVxyXG4gICAgICBtc2cuYm9keS5jcml0ZXJpYS5yZXNvdXJjZXMgPSByZXNvdXJjZXM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAvLyBsb2cubG9nKFwiW0NvcmVEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNdIHNlbmRpbmcgbXNnIFwiLCBtc2cpO1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICAvLyBsb2cubG9nKFwiW0NvcmVEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNdIHJjdmVkIHJlcGx5IFwiLCByZXBseSk7XHJcblxyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCB8fCByZXBseS5ib2R5LmNvZGUgPT09IDUwMCkge1xyXG4gICAgICAgICAgbGV0IGh5cGVydGllcyA9IHJlcGx5LmJvZHkudmFsdWU7XHJcblxyXG4gICAgICAgICAgbGV0IGZpbmFsSHlwZXJ0aWVzID0gW107XHJcbiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gaHlwZXJ0aWVzKSBmaW5hbEh5cGVydGllcy5wdXNoKGh5cGVydGllc1trZXldKTtcclxuXHJcbiAgICAgICAgICBpZiAoZmluYWxIeXBlcnRpZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBsb2cubG9nKFwiW0NvcmVEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNdIEh5cGVydGllcyBGb3VuZDogXCIsIGZpbmFsSHlwZXJ0aWVzKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShmaW5hbEh5cGVydGllcyk7XHJcbiAgICAgICAgICB9IGVsc2UgeyByZXR1cm4gcmVqZWN0KCdObyBIeXBlcnR5IHdhcyBmb3VuZCcpOyB9XHJcbiAgICAgICAgfSBlbHNlIHsgcmV0dXJuIHJlamVjdCgnTm8gSHlwZXJ0eSB3YXMgZm91bmQnKTsgfVxyXG5cclxuICAgICAgICAvKl90aGlzLnJlZ2lzdHJ5LmlzTGVnYWN5KHVzZXIpLnRoZW4oKGxlZ2FjeSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChsZWdhY3kpIHJlc29sdmUoW3toeXBlcnR5SUQ6IHVzZXIgfV0pXHJcbiAgICAgICAgICAgICAgZWxzZSByZXR1cm4gcmVqZWN0KCdObyBIeXBlcnR5IHdhcyBmb3VuZCcpO1xyXG4gICAgICAgICAgfSk7Ki9cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBBZHZhbmNlZCBTZWFyY2ggZm9yIERhdGFPYmplY3RzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFuZCBhc3NvY2lhdGVkIHdpdGggc29tZSB1c2VyIElEXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICB1c2VyICAgICAgICAgICAgICAgICAgdXNlciBpZGVudGlmaWVyLCBlaXRoZXIgaW4gdXJsIG9yIGVtYWlsIGZvcm1hdFxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgZGF0YVNjaGVtZXMgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdHMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzKHVzZXIsIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIGRvbWFpbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhY3RpdmVEb21haW47XHJcbiAgICBsZXQgZGF0YU9iamVjdHNBcnJheSA9IFtdO1xyXG5cclxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICAvL3RyYW5zbGF0ZSB1c2VyIGlkZW50aWZpZXIgKGUuZy4gZW1haWwsIG5hbWUuLi4pIGludG8gdGhlIGFzc29jaWF0ZWQgaHlwZXJ0aWVzXHJcbiAgICAgIF90aGlzLmRpc2NvdmVySHlwZXJ0aWVzKHVzZXIsIFtdLCBbXSwgYWN0aXZlRG9tYWluKVxyXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGh5cGVydGllcykge1xyXG5cclxuICAgICAgICAgIGxldCBmaW5hbEh5cGVydGllcyA9IFtdO1xyXG4gICAgICAgICAgZm9yICh2YXIga2V5IGluIGh5cGVydGllcykgZmluYWxIeXBlcnRpZXMucHVzaChoeXBlcnRpZXNba2V5XSk7XHJcblxyXG4gICAgICAgICAgLy90cmFuc2xhdGUgaHlwZXJ0aWVzIFVSTHMgaW50byB0aGUgYXNzb2NpYXRlZCBkYXRhT2JqZWN0cyByZWdpc3RlcmVkIGluIHNvbWUgZG9tYWluXHJcbiAgICAgICAgICBsZXQgZGF0YU9iamVjdHNQcm9taXNlcyA9IGZpbmFsSHlwZXJ0aWVzLm1hcChmdW5jdGlvbihoeXBlcnR5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RzUGVyUmVwb3J0ZXIoaHlwZXJ0eS5oeXBlcnR5SUQsIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIGFjdGl2ZURvbWFpbilcclxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhT2JqZWN0KTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgUHJvbWlzZS5hbGwoZGF0YU9iamVjdHNQcm9taXNlcylcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdHNSZXN1bHQpIHtcclxuXHJcbiAgICAgICAgICAgICAgbGV0IGRhdGFPYmplY3RzID0gW10uY29uY2F0LmFwcGx5KFtdLCBkYXRhT2JqZWN0c1Jlc3VsdCk7XHJcblxyXG4gICAgICAgICAgICAgIGRhdGFPYmplY3RzLmZvckVhY2goZnVuY3Rpb24oZGF0YU9iamVjdCkge1xyXG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdHNBcnJheS5wdXNoKGRhdGFPYmplY3QpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICBsZXQgZmluYWxEYXRhT2JqZWN0cyA9IFtdO1xyXG4gICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhT2JqZWN0c0FycmF5KSBmaW5hbERhdGFPYmplY3RzLnB1c2goZGF0YU9iamVjdHNBcnJheVtrZXldKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGZpbmFsRGF0YU9iamVjdHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KCdObyBkYXRhT2JqZWN0cyB3ZXJlIGZvdW5kJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAvLyBsb2cubG9nKCdEYXRhT2JqZWN0cyBGb3VuZDogJywgZmluYWxEYXRhT2JqZWN0cyk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShmaW5hbERhdGFPYmplY3RzKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgaHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcclxuICAqIHJldHVybiB0aGUgaHlwZXJ0eSBpbmZvcm1hdGlvbiwgaWYgZm91bmQuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICB1cmwgIGRhdGFPYmplY3QgVVJMXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcclxuICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICAgICAgIFByb21pc2VcclxuICAqL1xyXG4gIGRpc2NvdmVySHlwZXJ0eVBlclVSTCh1cmwsIGRvbWFpbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhY3RpdmVEb21haW47XHJcblxyXG4gICAgYWN0aXZlRG9tYWluID0gKCFkb21haW4pID8gX3RoaXMuZG9tYWluIDogZG9tYWluO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxyXG4gICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBhY3RpdmVEb21haW4sXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogdXJsXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlICE9PSAyMDAgJiYgcmVwbHkuYm9keS5jb2RlICE9PSA1MDApIHsgcmV0dXJuIHJlamVjdCgnTm8gSHlwZXJ0eSB3YXMgZm91bmQnKTsgfVxyXG5cclxuICAgICAgICBsZXQgaHlwZXJ0eSA9IHJlcGx5LmJvZHkudmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChoeXBlcnR5KSB7XHJcbiAgICAgICAgICAvLyBsb2cubG9nKCdIeXBlcnR5IGZvdW5kOiAnLCBoeXBlcnR5KTtcclxuICAgICAgICAgIHJlc29sdmUoaHlwZXJ0eSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiByZWplY3QoJ05vIEh5cGVydHkgd2FzIGZvdW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IGRhdGFPYmplY3QgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxyXG4gICogcmV0dXJuIHRoZSBkYXRhT2JqZWN0IGluZm9ybWF0aW9uLCBpZiBmb3VuZC5cclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgIHVybCAgZGF0YU9iamVjdCBVUkxcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKVxyXG4gICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgICAgUHJvbWlzZVxyXG4gICovXHJcbiAgZGlzY292ZXJEYXRhT2JqZWN0UGVyVVJMKHVybCwgZG9tYWluKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcclxuXHJcbiAgICBhY3RpdmVEb21haW4gPSAoIWRvbWFpbikgPyBfdGhpcy5kb21haW4gOiBkb21haW47XHJcblxyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3JlYWQnLFxyXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXHJcbiAgICAgIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIGFjdGl2ZURvbWFpbixcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlOiB1cmxcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgIGxldCBkYXRhT2JqZWN0ID0gcmVwbHkuYm9keS52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKGRhdGFPYmplY3QpIHtcclxuICAgICAgICAgIC8vIGxvZy5sb2coJ0RhdGFPYmplY3QgZm91bmQ6ICcsIGRhdGFPYmplY3QpO1xyXG4gICAgICAgICAgcmVzb2x2ZShkYXRhT2JqZWN0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnRGF0YU9iamVjdCBub3QgZm91bmQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQWR2YW5jZWQgU2VhcmNoIGZvciBkYXRhT2JqZWN0cyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeVxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgIG5hbWUgb2YgdGhlIGRhdGFPYmplY3RcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIGRhdGFTY2hlbWVzIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3Qgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3QgcmVzb3VyY2VzXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKSAgICAgZG9tYWluIG9mIHRoZSByZWdpc3RyeSB0byBzZWFyY2hcclxuICAqL1xyXG4gIGRpc2NvdmVyRGF0YU9iamVjdHNQZXJOYW1lKG5hbWUsIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIGRvbWFpbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhY3RpdmVEb21haW47XHJcblxyXG4gICAgYWN0aXZlRG9tYWluID0gKCFkb21haW4pID8gX3RoaXMuZG9tYWluIDogZG9tYWluO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxyXG4gICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBhY3RpdmVEb21haW4sXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogbmFtZVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChkYXRhU2NoZW1lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGlmICghbXNnLmJvZHkuY3JpdGVyaWEpIHsgbXNnLmJvZHkuY3JpdGVyaWEgPSB7fTsgfVxyXG4gICAgICBtc2cuYm9keS5jcml0ZXJpYS5kYXRhU2NoZW1lcyA9IGRhdGFTY2hlbWVzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChyZXNvdXJjZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoIW1zZy5ib2R5LmNyaXRlcmlhKSB7IG1zZy5ib2R5LmNyaXRlcmlhID0ge307IH1cclxuICAgICAgbXNnLmJvZHkuY3JpdGVyaWEucmVzb3VyY2VzID0gcmVzb3VyY2VzO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgbGV0IGRhdGFPYmplY3RzID0gcmVwbHkuYm9keS52YWx1ZTtcclxuXHJcbiAgICAgICAgbGV0IGZpbmFsRGF0YU9iamVjdHMgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YU9iamVjdHMpIGZpbmFsRGF0YU9iamVjdHMucHVzaChkYXRhT2JqZWN0c1trZXldKTtcclxuXHJcbiAgICAgICAgaWYgKGZpbmFsRGF0YU9iamVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgLy8gbG9nLmxvZyhcIkRhdGFPYmplY3RzIEZvdW5kOiBcIiwgZmluYWxEYXRhT2JqZWN0cyk7XHJcbiAgICAgICAgICByZXNvbHZlKGZpbmFsRGF0YU9iamVjdHMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KCdObyBEYXRhT2JqZWN0IHdhcyBmb3VuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBzcGVjaWZpYyByZXBvcnRlciBkYXRhT2JqZWN0IHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcclxuICAqIHJldHVybiB0aGUgZGF0YU9iamVjdHMgZnJvbSB0aGF0IHJlcG9ydGVyLlxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgcmVwb3J0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdCByZXBvcnRlclxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NkYXRhU2NoZW1lc2hlbWEgICAgICAgICAgICAgICAgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdHMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgICAgKE9wdGlvbmFsKSAgdHlwZXMgb2YgZGF0YU9iamVjdHMgcmVzb3VyY2VzXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBkb21haW4gICAgICAgICAgICAgICAgICAgICAgICAgICAoT3B0aW9uYWwpXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyUmVwb3J0ZXIocmVwb3J0ZXIsIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIGRvbWFpbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhY3RpdmVEb21haW47XHJcblxyXG4gICAgYWN0aXZlRG9tYWluID0gKCFkb21haW4pID8gX3RoaXMuZG9tYWluIDogZG9tYWluO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxyXG4gICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBhY3RpdmVEb21haW4sXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogJy9jb21tJyxcclxuICAgICAgICBjcml0ZXJpYToge1xyXG4gICAgICAgICAgcmVwb3J0ZXI6IHJlcG9ydGVyXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChkYXRhU2NoZW1lcy5sZW5ndGggPiAwKSB7IG1zZy5ib2R5LmNyaXRlcmlhLmRhdGFTY2hlbWVzID0gZGF0YVNjaGVtZXM7IH1cclxuXHJcbiAgICBpZiAocmVzb3VyY2VzLmxlbmd0aCA+IDApIHsgbXNnLmJvZHkuY3JpdGVyaWEucmVzb3VyY2VzID0gcmVzb3VyY2VzOyB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICBsZXQgZGF0YU9iamVjdHMgPSByZXBseS5ib2R5LnZhbHVlO1xyXG5cclxuICAgICAgICBsZXQgZmluYWxEYXRhT2JqZWN0cyA9IFtdO1xyXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhT2JqZWN0cykgZmluYWxEYXRhT2JqZWN0cy5wdXNoKGRhdGFPYmplY3RzW2tleV0pO1xyXG5cclxuICAgICAgICBpZiAoZmluYWxEYXRhT2JqZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAvLyBsb2cubG9nKFwiRGF0YU9iamVjdHMgRm91bmQ6IFwiLCBmaW5hbERhdGFPYmplY3RzKTtcclxuICAgICAgICAgIHJlc29sdmUoZmluYWxEYXRhT2JqZWN0cyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiByZWplY3QoJ05vIERhdGFPYmplY3Qgd2FzIGZvdW5kJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGdsb2JhbCByZWdpc3RyeSBhYm91dCB0aGUgdXNlciBJRHMgYXNzb2NpYXRlZCB3aXRoIHNvbWUgR1VJRFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgZ3VpZFxyXG4gICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgICAgUHJvbWlzZVxyXG4gICovXHJcbiAgZGlzY292ZXJVc2VySWRzUGVyR1VJRChndWlkKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIC8vIGxvZy5sb2coXCJHTyBncmFwaENvbm5lY3RvcjpcIiwgZ3VpZCk7XHJcblxyXG4gICAgICBfdGhpcy5ncmFwaENvbm5lY3Rvci5xdWVyeUdsb2JhbFJlZ2lzdHJ5KGd1aWQpXHJcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oZ3JhcGhDb25uZWN0b3JDb250YWN0RGF0YSkge1xyXG5cclxuICAgICAgICAvLyBsb2cubG9nKCdJbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIEdsb2JhbCBSZWdpc3RyeTogJywgZ3JhcGhDb25uZWN0b3JDb250YWN0RGF0YSk7XHJcblxyXG4gICAgICAgICAgaWYgKHR5cGVvZiBncmFwaENvbm5lY3RvckNvbnRhY3REYXRhID09PSAnc3RyaW5nJyB8fCAhZ3JhcGhDb25uZWN0b3JDb250YWN0RGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KCdVbnN1Y2Nlc3NmdWwgZGlzY292ZXIgdXNlcklEcyBieSBHVUlEJyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgbGV0IHVzZXJpZHMgPSBncmFwaENvbm5lY3RvckNvbnRhY3REYXRhLnVzZXJJRHM7XHJcblxyXG4gICAgICAgICAgICBpZiAodXNlcmlkcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIHJlamVjdCgnVXNlcklEcyBub3QgYXZhaWxhYmxlJyk7IH1cclxuXHJcbiAgICAgICAgICAgIHJlc29sdmUodXNlcmlkcyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGRpc2NvdmVyeSBzZXJ2aWNlIGFib3V0IHRoZSBHVUlEIGFzc29jaWF0ZWQgd2l0aCBzb21lIHVzZXIgaWRlbnRpZmllciAoZWcgZW1haWwsIG5hbWUgLi4uKVxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIHVzZXJJZGVudGlmaWVyXHJcbiAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICAgICAgUHJvbWlzZVxyXG4gICovXHJcbiAgZGlzY292ZXJHVUlEUGVyVXNlcklkZW50aWZpZXIodXNlcklkZW50aWZpZXIpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IGxvb2t1cFVSTERpc2NvdmVyeVNlcnZpY2UgPSAnaHR0cHM6Ly9yZXRoaW5rLnRsYWJzY2xvdWQuY29tL2Rpc2NvdmVyeS9yZXN0L2Rpc2NvdmVyL2xvb2t1cD9zZWFyY2hxdWVyeT0nO1xyXG4gICAgICBfdGhpcy5odHRwUmVxdWVzdC5nZXQobG9va3VwVVJMRGlzY292ZXJ5U2VydmljZSArIHVzZXJJZGVudGlmaWVyKVxyXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGpzb24pIHtcclxuICAgICAgICAvLyBsb2cubG9nKCdkaXNjb3ZlciBHVUlEIGJ5IHVzZXIgaWRlbnRpZmllcicsIGpzb24pO1xyXG5cclxuICAgICAgICAgIGxldCByZXNwb25zZSA9IEpTT04ucGFyc2UoanNvbik7XHJcbiAgICAgICAgICBsZXQgZmlsdGVyZWRHdWlkID0gcmVzcG9uc2UucmVzdWx0cy5maWx0ZXIoZnVuY3Rpb24oeCkge1xyXG4gICAgICAgICAgICByZXR1cm4geC5yZXRoaW5rSUQgIT0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgaWYgKGZpbHRlcmVkR3VpZC5sZW5ndGggPT09IDApIHsgcmV0dXJuIHJlamVjdCgnVW5zdWNjZXNzZnVsIGRpc2NvdmVyIEdVSUQgYnkgdXNlciBpZGVudGlmaWVyJyk7IH1cclxuXHJcbiAgICAgICAgICBsZXQgZ3VpZHMgPSBmaWx0ZXJlZEd1aWQubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHgucmV0aGlua0lEOyB9KTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShndWlkcyk7XHJcblxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgIC8vIGxvZy5sb2coXCJIVFRQIFJlcXVlc3QgZXJyb3I6IFwiLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDb3JlRGlzY292ZXJ5O1xyXG4iLCIvLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdEYXRhT2JqZWN0c1N0b3JhZ2UnKTtcclxuXHJcbmltcG9ydCB7IGFzc2lnbiwgZGVlcENsb25lLCBkaXZpZGVVUkwgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBjcmVhdGVTeW5jREIgfSBmcm9tICcuLi9ydW50aW1lL1N0b3JhZ2UnO1xyXG5cclxuY2xhc3MgRGF0YU9iamVjdHNTdG9yYWdlIHtcclxuXHJcbiAgY29uc3RydWN0b3Ioc3RvcmFnZU1hbmFnZXIsIHN0b3JlZERhdGFPYmplY3RzID0ge30sIGZhY3RvcnksIHJ1bnRpbWVTdGF0dXNVcGRhdGUpIHtcclxuICAgIGlmICghc3RvcmFnZU1hbmFnZXIpIHRocm93IG5ldyBFcnJvcignW1N0b3JlIERhdGEgT2JqZWN0c10gLSBOZWVkcyB0aGUgc3RvcmFnZU1hbmFnZXIgY29tcG9uZW50Jyk7XHJcblxyXG4gICAgdGhpcy5fc3RvcmFnZU1hbmFnZXIgPSBzdG9yYWdlTWFuYWdlcjtcclxuXHJcbiAgICB0aGlzLl9zdG9yZURhdGFPYmplY3QgPSBzdG9yZWREYXRhT2JqZWN0cztcclxuXHJcbiAgICB0aGlzLl9jYWNoZSA9IHt9O1xyXG5cclxuICAgIHRoaXMuX2NyZWF0ZVN5bmNEQiA9IGNyZWF0ZVN5bmNEQjsgLy8gdG8gY3JlYXRlIERhdGEgT2JqZWN0cyB0byBiZSBzeW5jaGVkIHdpdGggcmVtb3RlIHN0b3JhZ2VzXHJcbiAgICB0aGlzLl9yZW1vdGVzID0ge307IC8vIExpc3Qgb2YgRE8gc3luY2hlZCB3aXRoIHJlbW90ZSBzdG9yYWdlc1xyXG4gICAgdGhpcy5fZmFjdG9yeSA9IGZhY3Rvcnk7XHJcbiAgICB0aGlzLl90YWJsZSA9ICdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJztcclxuICAgIHRoaXMuX3JlbW90ZVN0b3JhZ2VUYWJsZSA9ICdkYXRhT2JqZWN0U3RvcmFnZSc7XHJcbiAgICB0aGlzLl9yZW1vdGVTY2hlbWEgPSAndXJsJztcclxuICAgIHRoaXMuX3J1bnRpbWVTdGF0dXNVcGRhdGUgPSBydW50aW1lU3RhdHVzVXBkYXRlO1xyXG4gIH1cclxuXHJcbiAgLy8gbG9hZCBEYXRhIE9iamVjdHMgc3luY2hlZCB3aXRoIHJlbW90ZSBTdG9yYWdlc1xyXG5cclxuICBsb2FkUmVtb3RlKHJlc3VtZSA9IGZhbHNlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbGV0IGxvYWRpbmcgPSBbXTtcclxuICAgICAgbGV0IGxvYWRpbmdEQnMgPSBbXTtcclxuXHJcbiAgICAgIF90aGlzLl9zdG9yYWdlTWFuYWdlci5nZXQobnVsbCwgbnVsbCwgJ3JlbW90ZXMnKS50aGVuKChyZW1vdGVzKSA9PiB7XHJcblxyXG4gICAgICAgIC8vIGluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgcmVtb3RlcyBsb2NhbGx5IHN0b3JlZFxyXG4gICAgICAgIGxvZy5pbmZvKCdbU3RvcmVEYXRhT2JqZWN0cy5sb2FkUmVtb3RlXSByZW1vdGVzOiAnLCByZW1vdGVzKTtcclxuICAgICAgICBpZiAoIXJlbW90ZXMpIHJlc29sdmUoKTtcclxuXHJcbiAgICAgICAgaWYgKCFyZXN1bWUpIF90aGlzLl9yZW1vdGVzID0gcmVtb3RlcztcclxuXHJcbiAgICAgICAgbG9nLmluZm8oJ1tTdG9yZURhdGFPYmplY3RzLmxvYWRSZW1vdGVdIGxvYWRpbmc6ICcsIF90aGlzLl9yZW1vdGVzKTtcclxuXHJcbiAgICAgICAgbGV0IHJlbW90ZU9iamVjdHMgPSBPYmplY3Qua2V5cyhyZW1vdGVzKTtcclxuXHJcbiAgICAgICAgLy8gaW4gY2FzZSB3ZSBkb24ndCBoYXZlIGFueSByZW1vdGVzIGxvY2FsbHkgc3RvcmVkXHJcblxyXG4gICAgICAgIGlmIChyZW1vdGVPYmplY3RzLmxlbmd0aCA9PT0gMCkgcmVzb2x2ZSgpO1xyXG5cclxuICAgICAgICByZW1vdGVPYmplY3RzLmZvckVhY2goKGRiKSA9PiB7XHJcbiAgICAgICAgICBsZXQgc2NoZW1hID0ge307XHJcbiAgICAgICAgICBsZXQgdGFibGUgPSBkYi5zcGxpdCgnLycpWzNdO1xyXG4gICAgICAgICAgc2NoZW1hW3RhYmxlXSA9IHRoaXMuX3JlbW90ZVNjaGVtYTtcclxuICAgICAgICAgIF90aGlzLl9yZW1vdGVzW2RiXSA9IGNyZWF0ZVN5bmNEQihkYiwgdGhpcy5fZmFjdG9yeSwgc2NoZW1hLCB0aGlzLl9ydW50aW1lU3RhdHVzVXBkYXRlKTtcclxuICAgICAgICAgIC8vICAgICAgICAgICAgX3RoaXMuX3JlbW90ZXNbcmVtb3RlXSA9IGNyZWF0ZVN5bmNEQihyZW1vdGUsIF90aGlzLl9mYWN0b3J5LCAncmVtb3RlRGF0YU9iamVjdFN0b3JhZ2UnICk7XHJcbiAgICAgICAgICBsb2FkaW5nLnB1c2goX3RoaXMuX3JlbW90ZXNbZGJdLmdldChudWxsLCBudWxsLCB0YWJsZSkpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBQcm9taXNlLmFsbChsb2FkaW5nKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIGxvZy5sb2coJ1tTdG9yZURhdGFPYmplY3RzLmxvYWRSZW1vdGVdIGxvYWRlZC4gU3RhcnRpbmcgaW5pdCcpO1xyXG4gICAgICAgICAgLy9UT0RPOiBpbml0IHRoaXMuX3N0b3JlRGF0YU9iamVjdCB3aXRoIGxvYWRlZCBkYXRhIG9iamVjdHNcclxuICAgICAgICAgIE9iamVjdC5rZXlzKF90aGlzLl9yZW1vdGVzKS5mb3JFYWNoKChyZW1vdGUpID0+IHtcclxuICAgICAgICAgICAgbGV0IHRhYmxlID0gcmVtb3RlLnNwbGl0KCcvJylbM107XHJcbiAgICAgICAgICAgIGxvYWRpbmdEQnMucHVzaChfdGhpcy5fcmVtb3Rlc1tyZW1vdGVdLmdldChudWxsLCBudWxsLCB0YWJsZSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBQcm9taXNlLmFsbChsb2FkaW5nREJzKS50aGVuKChkYXRhT2JqcykgPT4ge1xyXG5cclxuICAgICAgICAgICAgaWYgKGRhdGFPYmpzLmxlbmd0aCA9PT0gMCkgcmVzb2x2ZSgpO1xyXG5cclxuICAgICAgICAgICAgZGF0YU9ianMuZm9yRWFjaCgoZE8pID0+IHtcclxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhkTykuZm9yRWFjaCgodXJsKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nLmxvZygnW1N0b3JlRGF0YU9iamVjdHMubG9hZFJlbW90ZV0gbG9hZGVkIHJlbW90ZSAnLCBkT1t1cmxdKTtcclxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICBpZiAoZE9bcmVtb3RlXS5pc1JlcG9ydGVyKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHRoaXMuX2dldFR5cGVPZk9iamVjdChkT1t1cmxdLmlzUmVwb3J0ZXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuX3N0b3JlRGF0YU9iamVjdCkgX3RoaXMuX3N0b3JlRGF0YU9iamVjdCA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgX3RoaXMuX3N0b3JlRGF0YU9iamVjdFt0eXBlXSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIF90aGlzLl9zdG9yZURhdGFPYmplY3RbdHlwZV1bdXJsXSA9IGRPW3VybF07XHJcblxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmVzb2x2ZShfdGhpcy5fc3RvcmVEYXRhT2JqZWN0KTtcclxuXHJcbiAgICAgICAgICB9LCAoZXJyb3IpID0+IHsgcmVqZWN0KGVycm9yKSB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gLy8gZGVsZXRlIERhdGEgT2JqZWN0cyBzeW5jaGVkIHdpdGggcmVtb3RlIFN0b3JhZ2VzXHJcblxyXG4gZGVsZXRlUmVtb3RlcygpIHtcclxuICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBsZXQgZGVsZXRpbmcgPSBbXTtcclxuICAgIGxldCBkaXNjb25uZWN0aW5nID0gW107XHJcblxyXG4gICAgX3RoaXMuX3N0b3JhZ2VNYW5hZ2VyLmdldChudWxsLCBudWxsLCAncmVtb3RlcycpLnRoZW4oKHJlbW90ZXMpID0+IHtcclxuXHJcbiAgICAgIC8vIGluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgcmVtb3RlcyBsb2NhbGx5IHN0b3JlZFxyXG4gICAgICBsb2cuaW5mbygnW1N0b3JlRGF0YU9iamVjdHMuZGVsZXRlUmVtb3Rlc10gcmVtb3RlczogJywgcmVtb3Rlcyk7XHJcbiAgICAgIGlmICghcmVtb3RlcykgcmVzb2x2ZSgpO1xyXG5cclxuICAgICAgbGV0IHJlbW90ZU9iamVjdHMgPSBPYmplY3Qua2V5cyhfdGhpcy5fcmVtb3Rlcyk7XHJcblxyXG4gICAgICAvLyBpbiBjYXNlIHdlIGRvbid0IGhhdmUgYW55IHJlbW90ZXMgbG9jYWxseSBzdG9yZWRcclxuXHJcbiAgICAgIGlmIChyZW1vdGVPYmplY3RzLmxlbmd0aCA9PT0gMCkgcmVzb2x2ZSgpO1xyXG5cclxuICAgICAgcmVtb3RlT2JqZWN0cy5mb3JFYWNoKChkYikgPT4ge1xyXG4gICAgICAgIGRlbGV0aW5nLnB1c2goXHJcbiAgICAgICAgICBfdGhpcy5fcmVtb3Rlc1tkYl0uZGlzY29ubmVjdCgpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBkZWxldGluZy5wdXNoKFxyXG4gICAgICAgICAgX3RoaXMuX3JlbW90ZXNbZGJdLmRlbGV0ZSgpXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBQcm9taXNlLmFsbChkZWxldGluZykudGhlbigoKSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZygnW1N0b3JlRGF0YU9iamVjdHMuZGVsZXRlUmVtb3Rlc10gZGVsZXRlZC4nKTtcclxuXHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcblxyXG4gICAgICAgIH0sIChlcnJvcikgPT4geyByZXNvbHZlKCk7IH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuXHJcbiAgfSk7XHJcbn1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIHNob3VsZCBzZXQgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGRhdGFPYmplY3RVUkwgdG8gYmUgcmVzdW1lZCBpZiBuZWNlc3Nhcnk7XHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0RhdGFPYmplY3RVUkx9IHVybCAtIGRhdGFPYmplY3RVUkwgdG8gYmUgc2F2ZWQ7XHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlcG9ydGVyIC0gdGhlIG9iamVjdCB0byBiZSBzYXZlZCBpcyBhIHJlcG9ydGVyXHJcbiAgICogQHBhcmFtIHtTY2hlbWFVUkx9IHNjaGVtYSAtIHRoZSBzY2hlbWEgdXJsXHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0YXR1cyAtIHRoZSBzdGF0dXMgb2YgY3VycmVudCBkYXRhT2JqZWN0XHJcbiAgICogQHBhcmFtIHtIeXBlcnR5VVJMfSByZXBvcnRlciAtIHRoZSBSZXBvcnRlciBoeXBlcnR5VVJMXHJcbiAgICogQHBhcmFtIHtBcnJheTxIeXBlcnR5VVJMPn0gc3Vic2NyaXB0aW9uIC0gbGlzdCBvZiBzdWJzY3JpcHRpb25zXHJcbiAgICogQHBhcmFtIHtBcnJheTxEYXRhT2JqZWN0Q2hpbGQ+fSBjaGlsZHJlbiAtIGxpc3Qgb2YgY2hpbGRzIG9mIGRhdGFPYmplY3RVUkxcclxuICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZz59IGNoaWxkcmVucyAtIGxpc3Qgb2YgY2hpbGRyZW5zLCBsaWtlLCAnY2hhdG1lc3NhZ2UnO1xyXG4gICAqIEBwYXJhbSB7QXJyYXk8VXNlclVSTH0gc3Vic2NyaWJlclVzZXIgLSBsaXN0IG9mIHN1YnNjcmliZWQgdXNlcnM7XHJcbiAgICovXHJcblxyXG4gIHNldChtZXRhZGF0YSkge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGxldCBzdG9yZURhdGFPYmplY3QgPSB0aGlzLl9zdG9yZURhdGFPYmplY3QgPyB0aGlzLl9zdG9yZURhdGFPYmplY3QgOiB7fTtcclxuICAgICAgbGV0IHR5cGUgPSB0aGlzLl9nZXRUeXBlT2ZPYmplY3QobWV0YWRhdGEuaXNSZXBvcnRlcik7XHJcblxyXG5cclxuICAgICAgaWYgKCFzdG9yZURhdGFPYmplY3QuaGFzT3duUHJvcGVydHkodHlwZSkpIHN0b3JlRGF0YU9iamVjdFt0eXBlXSA9IHt9O1xyXG5cclxuICAgICAgaWYgKCFzdG9yZURhdGFPYmplY3RbdHlwZV0uaGFzT3duUHJvcGVydHkobWV0YWRhdGEudXJsKSkge1xyXG4gICAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdID0ge307XHJcbiAgICAgICAgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0uc3Vic2NyaXB0aW9ucyA9IFtdOy8vIFRPRE86ZG8gd2UgbmVlZCB0aGlzP1xyXG4gICAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLnN1YnNjcmliZXJVc2VycyA9IFtdOy8vIFRPRE86ZG8gd2UgbmVlZCB0aGlzP1xyXG4gICAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLmNoaWxkcmVuT2JqZWN0cyA9IHt9O1xyXG4gICAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLmRhdGEgPSB7fTtcclxuICAgICAgfVxyXG5cclxuICAgICAgT2JqZWN0LmFzc2lnbihzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXSwgbWV0YWRhdGEpO1xyXG4gICAgICBkZWxldGUgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0uc3Vic2NyaWJlclVzZXI7XHJcbiAgICAgIGRlbGV0ZSBzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXS5zdWJzY3JpYmVySHlwZXJ0eTtcclxuXHJcbiAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLmJhY2t1cCA9IG1ldGFkYXRhLmhhc093blByb3BlcnR5KCdiYWNrdXAnKSA/IG1ldGFkYXRhLmJhY2t1cCA6IGZhbHNlO1xyXG5cclxuICAgICAgLyppZiAoc2NoZW1hKSBzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXS5zY2hlbWEgPSBzY2hlbWE7XHJcbiAgICAgIGlmIChzdGF0dXMpIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLnN0YXR1cyA9IHN0YXR1cztcclxuICAgICAgaWYgKGNoaWxkcmVuUmVzb3VyY2VzKSBzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXS5jaGlsZHJlblJlc291cmNlcyA9IGNoaWxkcmVuUmVzb3VyY2VzOyovXHJcblxyXG4gICAgICBpZiAobWV0YWRhdGEuc3Vic2NyaWJlckh5cGVydHkgJiYgIW1ldGFkYXRhLmlzUmVwb3J0ZXIpIHsgLy8gVE9ETzogZG8gd2UgbmVlZCB0aGlzP1xyXG4gICAgICAgIHRoaXMuX3VwZGF0ZVRvQXJyYXkoc3RvcmVEYXRhT2JqZWN0W3R5cGVdLCBtZXRhZGF0YS51cmwsICdzdWJzY3JpcHRpb25zJywgbWV0YWRhdGEuc3Vic2NyaWJlckh5cGVydHkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL3N0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLm93bmVyID0gb3duZXI7XHJcblxyXG4gICAgICBpZiAobWV0YWRhdGEuc3Vic2NyaWJlclVzZXIpIHsgLy8gVE9ETzogZG8gd2UgbmVlZCB0aGlzP1xyXG4gICAgICAgIGlmIChzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXS5zdWJzY3JpYmVyVXNlcnMuaW5kZXhPZihtZXRhZGF0YS5zdWJzY3JpYmVyVXNlcikpIHtcclxuICAgICAgICAgIHRoaXMuX3VwZGF0ZVRvQXJyYXkoc3RvcmVEYXRhT2JqZWN0W3R5cGVdLCBtZXRhZGF0YS51cmwsICdzdWJzY3JpYmVyVXNlcnMnLCBtZXRhZGF0YS5zdWJzY3JpYmVyVXNlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9zdG9yZURhdGFPYmplY3QgPSBzdG9yZURhdGFPYmplY3Q7XHJcblxyXG4gICAgICBsZXQgYmFja3VwID0gbWV0YWRhdGEuaGFzT3duUHJvcGVydHkoJ2JhY2t1cCcpID8gbWV0YWRhdGEuYmFja3VwIDogZmFsc2U7XHJcbiAgICAgIGxldCBkYiA9IGJhY2t1cCA/IG1ldGFkYXRhLnVybCA6IHRoaXMuX3RhYmxlO1xyXG4gICAgICBsZXQgdGFibGUgPSBiYWNrdXAgPyBkYi5zcGxpdCgnLycpWzNdIDogdGhpcy5fdGFibGU7XHJcbiAgICAgIGlmIChiYWNrdXAgJiYgIXRoaXMuX3JlbW90ZXNbZGJdKSB7XHJcbiAgICAgICAgbGV0IHNjaGVtYSA9IHt9O1xyXG4gICAgICAgIHNjaGVtYVt0YWJsZV0gPSB0aGlzLl9yZW1vdGVTY2hlbWE7XHJcbiAgICAgICAgdGhpcy5fcmVtb3Rlc1tkYl0gPSBjcmVhdGVTeW5jREIoZGIsIHRoaXMuX2ZhY3RvcnksIHNjaGVtYSwgdGhpcy5fcnVudGltZVN0YXR1c1VwZGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFNhdmUgRGF0YSBPYmplY3QgVVJMIGF0IHJlbW90ZXMgdGFibGUgdG8gc3VwcG9ydCByZXN1bWVzXHJcblxyXG4gICAgICBpZiAoYmFja3VwKSB0aGlzLl9zdG9yYWdlTWFuYWdlci5zZXQobWV0YWRhdGEudXJsLCAwLCBtZXRhZGF0YS51cmwsICdyZW1vdGVzJyk7XHJcblxyXG4gICAgICBsZXQgc3RvcmFnZSA9IGJhY2t1cCA/IHRoaXMuX3JlbW90ZXNbZGJdIDogdGhpcy5fc3RvcmFnZU1hbmFnZXI7XHJcblxyXG4gICAgICBpZiAobWV0YWRhdGEuaXNSZXBvcnRlciAmJiBiYWNrdXApIHsvLyBsZXRzIGNvbm5lY3QgdG8gcmVtb3RlIHN0b3JhZ2UgdG8gZW5hYmxlIHN5bmNcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHsgdGFibGU6IHRhYmxlIH07XHJcbiAgICAgICAgc3RvcmFnZS5jb25uZWN0KG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgc3RvcmFnZS5zZXQoZGIsIDAsIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLCB0YWJsZSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0pO1xyXG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignW0RhdGFPYmplY3RTdG9yYWdlLnNldF0gZmFpbGVkIHRvIHNhdmUgaW50byByZW1vdGUgc3RvcmFnZTogJywgZXJyb3IpO1xyXG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0VG9SZW1vdGVUaHJlYWQoc3RvcmFnZSwgb3B0aW9ucywgZGIsIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLCB0YWJsZSk7XHJcbiAgICAgICAgICAgIHJlc29sdmUoc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBsb2cuZXJyb3IoJ1tEYXRhT2JqZWN0U3RvcmFnZS5zZXRdIGZhaWxlZCB0byBjb25uZWN0IHdpdGggcmVtb3RlIHN0b3JhZ2U6ICcsIGVycm9yLCAnIHRyeWluZyBhZ2Fpbi4uLicpO1xyXG4gICAgICAgICAgdGhpcy5fY29ubmVjdFRvUmVtb3RlVGhyZWFkKHN0b3JhZ2UsIG9wdGlvbnMsIGRiLCBzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXSwgdGFibGUpO1xyXG4gICAgICAgICAgcmVzb2x2ZShzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gICAgICAgICAgcmV0dXJuIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHN0b3JhZ2Uuc2V0KGRiLCAxLCB0aGlzLl9maWx0ZXJSZW1vdGVzKHN0b3JlRGF0YU9iamVjdCksIHRhYmxlKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUoc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9jb25uZWN0VG9SZW1vdGVUaHJlYWQoc3RvcmFnZSwgb3B0aW9ucywgZGIsIGRhdGFPYmplY3QsIHRhYmxlKSB7XHJcblxyXG4gICAgbGV0IGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgbGV0IGlkO1xyXG5cclxuICAgIGxldCBjb25uZWN0ID0gZnVuY3Rpb24gKGRPKSB7XHJcbiAgICAgIGxvZy5lcnJvcignW0RhdGFPYmplY3RTdG9yYWdlLl9jb25uZWN0VG9SZW1vdGVdIHRyeWluZyB0byBjb25uZWN0IHRvIHJlbW90ZSBzdG9yYWdlIC4uLiAnKTtcclxuICAgICAgc3RvcmFnZS5jb25uZWN0KG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHN0b3JhZ2Uuc2V0KGRiLCAwLCBkTywgdGFibGUpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaWQpO1xyXG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdbRGF0YU9iamVjdFN0b3JhZ2UuX2Nvbm5lY3RUb1JlbW90ZV0gZmFpbGVkIHRvIHNhdmUgaW50byByZW1vdGUgc3RvcmFnZTogJywgZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICBsb2cuZXJyb3IoJ1tEYXRhT2JqZWN0U3RvcmFnZS5fY29ubmVjdFRvUmVtb3RlXSBmYWlsZWQgdG8gY29ubmVjdCB0byByZW1vdGUgc3RvcmFnZTogJywgZXJyb3IpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XHJcblxyXG4gICAgICBpZiAoIWNvbm5lY3RlZCkgY29ubmVjdChkYXRhT2JqZWN0KTtcclxuICAgIH0sIDUwMDApO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICAvLyB0byBmaWx0ZXIgRGF0YSBPYmplY3RzIHRoYXQgYXJlIHN0b3JlZCBvdXRzaWRlIHRoZSBPYmplY3RVUkxzIHRhYmxlXHJcblxyXG4gIF9maWx0ZXJSZW1vdGVzKHN0b3JlRGF0YU9iamVjdCkge1xyXG4gICAgbGV0IHJlbW90ZXMgPSBPYmplY3Qua2V5cyh0aGlzLl9yZW1vdGVzKTtcclxuXHJcbiAgICBsZXQgZmlsdGVyZWQgPSBkZWVwQ2xvbmUoc3RvcmVEYXRhT2JqZWN0KTtcclxuXHJcbiAgICByZW1vdGVzLmZvckVhY2goKHJlbW90ZSkgPT4ge1xyXG4gICAgICBpZiAoZmlsdGVyZWRbJ3JlcG9ydGVycyddW3JlbW90ZV0pIGRlbGV0ZSBmaWx0ZXJlZFsncmVwb3J0ZXJzJ11bcmVtb3RlXTtcclxuICAgICAgZWxzZSBkZWxldGUgZmlsdGVyZWRbJ29ic2VydmVycyddW3JlbW90ZV07XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3RTdG9yYWdlLl9maWx0ZXJSZW1vdGVzXSAnLCBmaWx0ZXJlZCk7XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xyXG4gIH1cclxuXHJcbiAgLy8gSW5pdGlhbCBTeW5jIG9mIE9ic2VydmVyIHRvIGF2b2lkIGxhdGVyIG1pc21hdGNoZXMgd2l0aCBzeW5jIHJldmlzaW9uc1xyXG4gIC8vIE9VdGRhdGVkOiBub3QgdXNlZCBhbnltb3JlXHJcbiAgLypcclxuICAgIGluaXRpYWxPYnNlcnZlclN5bmMocmVzb3VyY2UsIGJhY2t1cFJldmlzaW9uKSB7XHJcbiAgICAgIC8vIHRvIGJlIGNvbXBsZXRlZFxyXG4gICAgICBsZXQgdGFibGUgPSByZXNvdXJjZS5zcGxpdCgnLycpWzNdO1xyXG4gIFxyXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gIFxyXG4gICAgICBsZXQgb3B0aW9ucyA9IHt0YWJsZTogdGFibGUsIG9ic2VydmVyOiB0cnVlLCBiYXNlUmV2aXNpb246IGJhY2t1cFJldmlzaW9uLCBzeW5jZWRSZXZpc2lvbjogYmFja3VwUmV2aXNpb259O1xyXG4gIFxyXG4gICAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3RTdG9yYWdlLmluaXRpYWxPYnNlcnZlclN5bmNdIG9iamVjdDogJywgcmVzb3VyY2UsICcgcmV2aXNpb24gJywgYmFja3VwUmV2aXNpb24pXHJcbiAgXHJcbiAgICAgIF90aGlzLl9yZW1vdGVzW3Jlc291cmNlXS5jb25uZWN0KG9wdGlvbnMpLnRoZW4oKCk9PiB7XHJcbiAgXHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0U3RvcmFnZS5pbml0aWFsT2JzZXJ2ZXJTeW5jXSBjb25uZWN0ZWQgJyk7XHJcbiAgXHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZW1vdGVzW3Jlc291cmNlXS5kaXNjb25uZWN0KCkudGhlbigoKT0+e1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3RTdG9yYWdlLmluaXRpYWxPYnNlcnZlclN5bmNdIGRpc2Nvbm5lY3RlZCAnKTtcclxuICAgICAgICAgICAgICB9LChlcnJvcik9PiB7XHJcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoJ1tEYXRhT2JqZWN0U3RvcmFnZS5pbml0aWFsT2JzZXJ2ZXJTeW5jXSBFcnJvciBkaXNjb25uZWN0aW5nIHdpdGggcmVtb3RlIHN0b3JhZ2UnKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSwgMTUwMDApXHJcbiAgXHJcbiAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGxvZy5lcnJvcignW0RhdGFPYmplY3RTdG9yYWdlLmluaXRpYWxPYnNlcnZlclN5bmNdIEVycm9yIGNvbm5lY3RpbmcgdG8gcmVtb3RlIHN0b3JhZ2UnKTtcclxuICAgICAgICByZWplY3QoZXJyb3IpXHJcbiAgICAgIH0pO1xyXG4gIFxyXG4gICAgfSovXHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBzaG91bGQgc2F2ZSBhbmQgdXBkYXRlIHRoZSBjdXJyZW50IGRhdGFPYmplY3QgZGF0YSBpbmZvcm1hdGlvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlcG9ydGVyIC0gdGhlIG9iamVjdCB0byBiZSBzYXZlZCBpcyBhIHJlcG9ydGVyXHJcbiAgICogQHBhcmFtIHtEYXRhT2JqZWN0VVJMfSByZXNvdXJjZSAtIGRhdGFPYmplY3RVUkwgdG8gYmUgc2F2ZWQgb3IgdXBkYXRlZDtcclxuICAgKiBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlIC0gYXR0cmlidXRlIGluc2lkZSB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIHNhdmVkXHJcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgLSB2YWx1ZSB3aWxsIGJlIHNhdmVkIGluc2lkZSB0aGUgYXR0cmlidXRlO1xyXG4gICAqL1xyXG4gIHNhdmVEYXRhKGlzUmVwb3J0ZXIsIHJlc291cmNlLCBhdHRyaWJ1dGUsIHZhbHVlLCB1cGRhdGVSdW50aW1lU3RhdHVzKSB7XHJcblxyXG4gICAgbGV0IHN0b3JlRGF0YU9iamVjdCA9IHRoaXMuX3N0b3JlRGF0YU9iamVjdDtcclxuICAgIGxldCB0eXBlID0gdGhpcy5fZ2V0VHlwZU9mT2JqZWN0KGlzUmVwb3J0ZXIpO1xyXG5cclxuICAgIGlmICghc3RvcmVEYXRhT2JqZWN0IHx8ICFzdG9yZURhdGFPYmplY3RbdHlwZV0gfHwgIXN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0pIHtcclxuICAgICAgbG9nLmxvZygnW1N0b3JlRGF0YU9iamVjdHMgLSBzYXZlIGRhdGFdIC0gbm90IHNhdmVkJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsb2cubG9nKCdbU3RvcmVEYXRhT2JqZWN0cyAtIHNhdmVEYXRhXSAtICcsIGlzUmVwb3J0ZXIsIHR5cGUsIHJlc291cmNlLCBhdHRyaWJ1dGUsIHZhbHVlKTtcclxuXHJcbiAgICBpZiAoIXN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uaGFzT3duUHJvcGVydHkoJ2RhdGEnKSkge1xyXG4gICAgICBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmRhdGEgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYXR0cmlidXRlKSB7XHJcbiAgICAgIGxldCBkYXRhO1xyXG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgZGF0YSA9IGRlZXBDbG9uZSh2YWx1ZSk7XHJcbiAgICAgIGVsc2UgZGF0YSA9IHZhbHVlO1xyXG5cclxuICAgICAgYXNzaWduKHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uZGF0YSwgYXR0cmlidXRlLCBkYXRhKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uZGF0YSA9IGRlZXBDbG9uZSh2YWx1ZSkgfHwge307XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc3RvcmVEYXRhT2JqZWN0ID0gc3RvcmVEYXRhT2JqZWN0O1xyXG4gICAgbGV0IGRiID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLnVybCA6ICdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJztcclxuICAgIGxldCBzdG9yYWdlID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyB0aGlzLl9yZW1vdGVzW2RiXSA6IHRoaXMuX3N0b3JhZ2VNYW5hZ2VyO1xyXG4gICAgbGV0IHRhYmxlID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBkYi5zcGxpdCgnLycpWzNdIDogdGhpcy5fdGFibGU7XHJcbiAgICBsZXQgZGF0YSA9IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uYmFja3VwID8gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXSA6IHRoaXMuX2ZpbHRlclJlbW90ZXMoc3RvcmVEYXRhT2JqZWN0KTtcclxuICAgIHN0b3JhZ2Uuc2V0KGRiLCAxLCBkYXRhLCB0YWJsZSwgdXBkYXRlUnVudGltZVN0YXR1cykudGhlbigoKSA9PiB7XHJcbiAgICAgIHJldHVybiBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdO1xyXG4gICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICByZXR1cm4gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2F2ZUNoaWxkcmVucyhpc1JlcG9ydGVyLCByZXNvdXJjZSwgYXR0cmlidXRlLCB2YWx1ZSkge1xyXG4gICAgbGV0IHN0b3JlRGF0YU9iamVjdCA9IHRoaXMuX3N0b3JlRGF0YU9iamVjdDtcclxuICAgIGxldCB0eXBlID0gdGhpcy5fZ2V0VHlwZU9mT2JqZWN0KGlzUmVwb3J0ZXIpO1xyXG5cclxuICAgIGlmICghc3RvcmVEYXRhT2JqZWN0IHx8ICFzdG9yZURhdGFPYmplY3RbdHlwZV0gfHwgIXN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0pIHtcclxuICAgICAgbG9nLmxvZygnW1N0b3JlRGF0YU9iamVjdHMgLSBzYXZlIGNoaWxkcmVuc10gLSBub3Qgc2F2ZWQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5oYXNPd25Qcm9wZXJ0eSgnY2hpbGRyZW5zJykpIHtcclxuICAgICAgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5jaGlsZHJlbk9iamVjdHMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvKiAgICBpZiAoIXN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uY2hpbGRyZW5PYmplY3RzLmhhc093blByb3BlcnR5KCdyZXNvdXJjZXMnKSkge1xyXG4gICAgICAgICAgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5jaGlsZHJlbk9iamVjdHMucmVzb3VyY2VzID0ge307XHJcbiAgICAgICAgfSovXHJcblxyXG4gICAgaWYgKGF0dHJpYnV0ZSkge1xyXG4gICAgICBhc3NpZ24oc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5jaGlsZHJlbk9iamVjdHMsIGF0dHJpYnV0ZSwgZGVlcENsb25lKHZhbHVlKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmNoaWxkcmVuT2JqZWN0cyA9IGRlZXBDbG9uZSh2YWx1ZSkgfHwge307XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fc3RvcmVEYXRhT2JqZWN0ID0gc3RvcmVEYXRhT2JqZWN0O1xyXG4gICAgbGV0IGRiID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLnVybCA6ICdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJztcclxuICAgIGxldCBzdG9yYWdlID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyB0aGlzLl9yZW1vdGVzW2RiXSA6IHRoaXMuX3N0b3JhZ2VNYW5hZ2VyO1xyXG4gICAgbGV0IHRhYmxlID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBkYi5zcGxpdCgnLycpWzNdIDogdGhpcy5fdGFibGU7XHJcbiAgICBsZXQgZGF0YSA9IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uYmFja3VwID8gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXSA6IHRoaXMuX2ZpbHRlclJlbW90ZXMoc3RvcmVEYXRhT2JqZWN0KTtcclxuICAgIHN0b3JhZ2Uuc2V0KGRiLCAxLCBkYXRhLCB0YWJsZSkudGhlbigoKSA9PiB7XHJcbiAgICAgIHJldHVybiBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIHNob3VsZCBzYXZlIGFuZCB1cGRhdGUgdGhlIGN1cnJlbnQgZGF0YU9iamVjdCBpbmZvcm1hdGlvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlcG9ydGVyIC0gdGhlIG9iamVjdCB0byBiZSBzYXZlZCBpcyBhIHJlcG9ydGVyXHJcbiAgICogQHBhcmFtIHtEYXRhT2JqZWN0VVJMfSByZXNvdXJjZSAtIGRhdGFPYmplY3RVUkwgdG8gYmUgc2F2ZWQgb3IgdXBkYXRlZDtcclxuICAgKiBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlIC0gYXR0cmlidXRlIGluc2lkZSB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIHNhdmVkXHJcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgLSB2YWx1ZSB3aWxsIGJlIHNhdmVkIGluc2lkZSB0aGUgYXR0cmlidXRlO1xyXG4gICAqL1xyXG4gIHVwZGF0ZShpc1JlcG9ydGVyLCByZXNvdXJjZSwgYXR0cmlidXRlLCB2YWx1ZSwgdXBkYXRlUnVudGltZVN0YXR1cykge1xyXG5cclxuICAgIGxldCBzdG9yZURhdGFPYmplY3QgPSB0aGlzLl9zdG9yZURhdGFPYmplY3Q7XHJcbiAgICBsZXQgdHlwZSA9IHRoaXMuX2dldFR5cGVPZk9iamVjdChpc1JlcG9ydGVyKTtcclxuXHJcbiAgICBpZiAoIXN0b3JlRGF0YU9iamVjdCB8fCAhc3RvcmVEYXRhT2JqZWN0W3R5cGVdIHx8ICFzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdKSB7XHJcbiAgICAgIGxvZy5sb2coJ1tTdG9yZURhdGFPYmplY3RzIC0gdXBkYXRlXSAtIG5vdCBzYXZlZCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbG9nLmxvZygnW1N0b3JlRGF0YU9iamVjdHMgLSB1cGRhdGVdIC0gJywgaXNSZXBvcnRlciwgdHlwZSwgcmVzb3VyY2UsIGF0dHJpYnV0ZSwgdmFsdWUpO1xyXG5cclxuICAgIGlmIChzdG9yZURhdGFPYmplY3RbdHlwZV0gJiYgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXSAmJiByZXNvdXJjZSAmJiBhdHRyaWJ1dGUgJiYgdmFsdWUpIHtcclxuXHJcbiAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICdzdWJzY3JpcHRpb25zJyB8fCBhdHRyaWJ1dGUgPT09ICdzdWJzY3JpYmVyVXNlcnMnKSB7XHJcbiAgICAgICAgbGV0IHVwZGF0ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICdzdWJzY3JpcHRpb25zJykge1xyXG4gICAgICAgICAgdXBkYXRlID0gIXRoaXMuX2lzT3duZXIoc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXSwgdmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVwZGF0ZSkgdGhpcy5fdXBkYXRlVG9BcnJheShzdG9yZURhdGFPYmplY3RbdHlwZV0sIHJlc291cmNlLCBhdHRyaWJ1dGUsIHZhbHVlKTtcclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXVthdHRyaWJ1dGVdID0gdmFsdWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX3N0b3JlRGF0YU9iamVjdCA9IHN0b3JlRGF0YU9iamVjdDtcclxuICAgICAgbGV0IGRiID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLnVybCA6ICdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJztcclxuICAgICAgbGV0IHN0b3JhZ2UgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IHRoaXMuX3JlbW90ZXNbZGJdIDogdGhpcy5fc3RvcmFnZU1hbmFnZXI7XHJcbiAgICAgIGxldCB0YWJsZSA9IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uYmFja3VwID8gZGIuc3BsaXQoJy8nKVszXSA6IHRoaXMuX3RhYmxlO1xyXG4gICAgICBsZXQgZGF0YSA9IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uYmFja3VwID8gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXSA6IHRoaXMuX2ZpbHRlclJlbW90ZXMoc3RvcmVEYXRhT2JqZWN0KTtcclxuICAgICAgc3RvcmFnZS5zZXQoZGIsIDEsIGRhdGEsIHRhYmxlLCB1cGRhdGVSdW50aW1lU3RhdHVzKS50aGVuKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gc2hvdWxkIGRlbGV0ZSBzdG9yZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGF0YU9iamVjdFxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlcG9ydGVyIC0gdGhlIG9iamVjdCB0byBiZSBzYXZlZCBpcyBhIHJlcG9ydGVyXHJcbiAgICogQHBhcmFtIHtEYXRhT2JqZWN0VVJMfSByZXNvdXJjZSAtIGRhdGFPYmplY3RVUkwgdG8gYmUgc2F2ZWQgb3IgdXBkYXRlZDtcclxuICAgKiBAcGFyYW0ge1N0cmluZ30gYXR0cmlidXRlIC0gYXR0cmlidXRlIGluc2lkZSB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIHNhdmVkXHJcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgLSB2YWx1ZSB3aWxsIGJlIHNhdmVkIGluc2lkZSB0aGUgYXR0cmlidXRlO1xyXG4gICAqL1xyXG4gIGRlbGV0ZShpc1JlcG9ydGVyLCByZXNvdXJjZSwgYXR0cmlidXRlLCB2YWx1ZSkge1xyXG5cclxuICAgIGxldCBzdG9yZURhdGFPYmplY3QgPSB0aGlzLl9zdG9yZURhdGFPYmplY3Q7XHJcbiAgICBsZXQgdHlwZSA9IHRoaXMuX2dldFR5cGVPZk9iamVjdChpc1JlcG9ydGVyKTtcclxuXHJcbiAgICBpZiAoIXN0b3JlRGF0YU9iamVjdCB8fCAhc3RvcmVEYXRhT2JqZWN0W3R5cGVdIHx8ICFzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdKSB7XHJcbiAgICAgIGxvZy5sb2coJ1tTdG9yZURhdGFPYmplY3RzIC0gZGVsZXRlXSAtIG5vdCBzYXZlZCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN0b3JlRGF0YU9iamVjdFt0eXBlXSAmJiBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdICYmIHJlc291cmNlICYmIGF0dHJpYnV0ZSAmJiB2YWx1ZSkge1xyXG5cclxuICAgICAgaWYgKGF0dHJpYnV0ZSA9PT0gJ3N1YnNjcmlwdGlvbnMnIHx8IGF0dHJpYnV0ZSA9PT0gJ3N1YnNjcmliZXJVc2VycycpIHtcclxuICAgICAgICB0aGlzLl9yZW1vdmVGcm9tQXJyYXkoc3RvcmVEYXRhT2JqZWN0W3R5cGVdLCByZXNvdXJjZSwgYXR0cmlidXRlLCB2YWx1ZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGVsZXRlIHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV1bYXR0cmlidXRlXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5fc3RvcmVEYXRhT2JqZWN0ID0gc3RvcmVEYXRhT2JqZWN0O1xyXG4gICAgICBsZXQgZGIgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0udXJsIDogJ3N5bmNoZXJNYW5hZ2VyOk9iamVjdFVSTHMnO1xyXG4gICAgICBsZXQgc3RvcmFnZSA9IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uYmFja3VwID8gdGhpcy5fcmVtb3Rlc1tkYl0gOiB0aGlzLl9zdG9yYWdlTWFuYWdlcjtcclxuICAgICAgbGV0IHRhYmxlID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBkYi5zcGxpdCgnLycpWzNdIDogdGhpcy5fdGFibGU7XHJcbiAgICAgIGxldCBkYXRhID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdIDogdGhpcy5fZmlsdGVyUmVtb3RlcyhzdG9yZURhdGFPYmplY3QpO1xyXG4gICAgICBzdG9yYWdlLnNldChkYiwgMSwgZGF0YSwgdGFibGUpO1xyXG5cclxuICAgICAgcmV0dXJuIHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgRGF0YSBPYmplY3QgZnJvbSB0aGUgc3RvcmFnZVxyXG4gICAqL1xyXG5cclxuICBkZWxldGVSZXNvdXJjZShyZXNvdXJjZSkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGlmIChyZXNvdXJjZSkge1xyXG4gICAgICAgIC8vICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGwoKS50aGVuKChzdG9yZWREYXRhT2JqZWN0cykgPT4ge1xyXG4gICAgICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdFN0b3JhZ2UuZGVsZXRlUmVzb3VyY2VdIGRlbGV0aW5nOiAnLCByZXNvdXJjZSk7XHJcblxyXG4gICAgICAgIC8vICAgICAgICAgIGxldCB0aGlzLl9zdG9yZURhdGFPYmplY3QgPSBPYmplY3QuYXNzaWduKHRoaXMuX3N0b3JlRGF0YU9iamVjdCB8fCB7fSk7XHJcblxyXG4gICAgICAgIGxldCBiYWNrdXA7XHJcbiAgICAgICAgbGV0IGRiO1xyXG4gICAgICAgIGxldCBzdG9yYWdlO1xyXG5cclxuICAgICAgICBpZiAoX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnb2JzZXJ2ZXJzJykgJiYgX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5vYnNlcnZlcnMuaGFzT3duUHJvcGVydHkocmVzb3VyY2UpKSB7XHJcbiAgICAgICAgICBiYWNrdXAgPSAoX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5vYnNlcnZlcnNbcmVzb3VyY2VdLmJhY2t1cCkgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICAgICAgZGIgPSBiYWNrdXAgPyBfdGhpcy5fc3RvcmVEYXRhT2JqZWN0Lm9ic2VydmVyc1tyZXNvdXJjZV0udXJsIDogJ3N5bmNoZXJNYW5hZ2VyOk9iamVjdFVSTHMnO1xyXG4gICAgICAgICAgc3RvcmFnZSA9IGJhY2t1cCA/IF90aGlzLl9yZW1vdGVzW2RiXSA6IF90aGlzLl9zdG9yYWdlTWFuYWdlcjtcclxuICAgICAgICAgIGRlbGV0ZSBfdGhpcy5fc3RvcmVEYXRhT2JqZWN0Lm9ic2VydmVyc1tyZXNvdXJjZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eSgncmVwb3J0ZXJzJykgJiYgX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5yZXBvcnRlcnMuaGFzT3duUHJvcGVydHkocmVzb3VyY2UpKSB7XHJcbiAgICAgICAgICBiYWNrdXAgPSAoX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5yZXBvcnRlcnNbcmVzb3VyY2VdLmJhY2t1cCkgPyB0cnVlIDogZmFsc2U7XHJcblxyXG4gICAgICAgICAgZGIgPSBiYWNrdXAgPyBfdGhpcy5fc3RvcmVEYXRhT2JqZWN0LnJlcG9ydGVyc1tyZXNvdXJjZV0udXJsIDogJ3N5bmNoZXJNYW5hZ2VyOk9iamVjdFVSTHMnO1xyXG4gICAgICAgICAgc3RvcmFnZSA9IGJhY2t1cCA/IF90aGlzLl9yZW1vdGVzW2RiXSA6IF90aGlzLl9zdG9yYWdlTWFuYWdlcjtcclxuICAgICAgICAgIGRlbGV0ZSBfdGhpcy5fc3RvcmVEYXRhT2JqZWN0LnJlcG9ydGVyc1tyZXNvdXJjZV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyAgICAgICAgICB0aGlzLl9zdG9yZURhdGFPYmplY3QgPSB0aGlzLl9zdG9yZURhdGFPYmplY3Q7XHJcblxyXG4gICAgICAgIGlmIChiYWNrdXAgJiYgc3RvcmFnZSkge1xyXG4gICAgICAgICAgc3RvcmFnZS5kZWxldGUoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIF90aGlzLl9yZW1vdGVzW2RiXTtcclxuICAgICAgICAgICAgX3RoaXMuX3N0b3JhZ2VNYW5hZ2VyLmRlbGV0ZShyZXNvdXJjZSwgbnVsbCwgJ3JlbW90ZXMnKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzdG9yYWdlLnNldChkYiwgMSwgdGhpcy5fZmlsdGVyUmVtb3RlcyhfdGhpcy5fc3RvcmVEYXRhT2JqZWN0KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgfSk7XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1tTdG9yZURhdGFPYmplY3RzXSAtIENhblxcJ3QgZGVsZXRlIHRoaXMgJyArIHJlc291cmNlKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRBbGwoKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBfdGhpcy5fc3RvcmVEYXRhT2JqZWN0ID0gdGhpcy5fc3RvcmFnZU1hbmFnZXIuZ2V0KCdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJykudGhlbigob2JqZWN0cykgPT4ge1xyXG4gICAgICAgIF90aGlzLl9zdG9yZURhdGFPYmplY3QgPSBvYmplY3RzO1xyXG4gICAgICAgIF90aGlzLmxvYWRSZW1vdGUodHJ1ZSkudGhlbigoc3RvcmVkT2JqZWN0cykgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZShfdGhpcy5fc3RvcmVEYXRhT2JqZWN0KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG4gICAgLy8gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2VNYW5hZ2VyLmdldCgnc3luY2hlck1hbmFnZXI6T2JqZWN0VVJMcycpO1xyXG4gIH1cclxuXHJcbiAgLy8gVG8gc3luYyBsb2NhbCBzdG9yYWdlIHdpdGggcmVtb3RlIHN0b3JhZ2Ugc2VydmVyXHJcblxyXG4gIHN5bmMocmVzb3VyY2UsIGJhY2t1cFJldmlzaW9uLCBvbmNlID0gdHJ1ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoX3RoaXMuX3JlbW90ZXNbcmVzb3VyY2VdKSB7XHJcblxyXG4gICAgICBsZXQgdGFibGUgPSByZXNvdXJjZS5zcGxpdCgnLycpWzNdO1xyXG5cclxuICAgICAgaWYgKGJhY2t1cFJldmlzaW9uKSByZXR1cm4gX3RoaXMuX3N5bmMocmVzb3VyY2UsIGJhY2t1cFJldmlzaW9uLCBvbmNlLCB0YWJsZSk7XHJcbiAgICAgIGVsc2UgX3RoaXMuX3JlbW90ZXNbcmVzb3VyY2VdLmdldEJhY2t1cFJldmlzaW9uKHJlc291cmNlKS50aGVuKChiYWNrdXBSZXZpc2lvbikgPT4ge1xyXG4gICAgICAgIHJldHVybiBfdGhpcy5fc3luYyhyZXNvdXJjZSwgYmFja3VwUmV2aXNpb24sIG9uY2UsIHRhYmxlKTtcclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGluZm8gPSAnW0RhdGFPYmplY3RTdG9yYWdlLnN5bmNdIEluZm86ICcgKyByZXNvdXJjZSArICcgaXMgbm90IHN5bmNoZWQgd2l0aCByZW1vdGUgc3RvcmFnZS4nXHJcbiAgICAgIGxvZy5pbmZvKGluZm8pO1xyXG4gICAgICAvLyAgICAgICAgICByZWplY3QoaW5mbyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfc3luYyhyZXNvdXJjZSwgYmFja3VwUmV2aXNpb24sIG9uY2UsIHRhYmxlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdFN0b3JhZ2UuX3N5bmNdIGJhY2t1cFJldmlzaW9uOiAnLCBiYWNrdXBSZXZpc2lvbik7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGxldCBvcHRpb25zID0geyB0YWJsZTogdGFibGUsIG9ic2VydmVyOiBmYWxzZSwgc3luY2VkUmV2aXNpb246IGJhY2t1cFJldmlzaW9uICsgMyB9O1xyXG5cclxuICAgICAgX3RoaXMuX3JlbW90ZXNbcmVzb3VyY2VdLmNvbm5lY3Qob3B0aW9ucykudGhlbigoKSA9PiB7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0U3RvcmFnZS5zeW5jXSBjb25uZWN0ZWQgd2l0aCByZW1vdGUgJyk7XHJcblxyXG4gICAgICAgIF90aGlzLl9yZW1vdGVzW3Jlc291cmNlXS5nZXQobnVsbCwgbnVsbCwgdGFibGUpLnRoZW4oKGRhdGFPYmplY3QpID0+IHtcclxuICAgICAgICAgIC8vICAgICAgICAgIHRoaXMuX3JlbW90ZXNbcmVzb3VyY2VdLmdldCgpLnRoZW4oKGRhdGFPYmplY3QpPT57XHJcbiAgICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3RTdG9yYWdlLnN5bmNdIHJldHVybmluZyBzeW5jaGVkIERPOiAnLCBkYXRhT2JqZWN0KTtcclxuXHJcbiAgICAgICAgICBpZiAob25jZSkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5fcmVtb3Rlc1tyZXNvdXJjZV0uZGlzY29ubmVjdCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0U3RvcmFnZS5zeW5jXSBkaXNjb25uZWN0ZWQgJyk7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGFPYmplY3RbcmVzb3VyY2VdKTtcclxuICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignW0RhdGFPYmplY3RTdG9yYWdlLnN5bmNdIEVycm9yIHN5bmNoaW5nIHdpdGggcmVtb3RlIHN0b3JhZ2UnKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0sIDIwMDApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNvbHZlKGRhdGFPYmplY3RbcmVzb3VyY2VdKTtcclxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGxvZy5lcnJvcignW0RhdGFPYmplY3RTdG9yYWdlLnN5bmNdIEVycm9yIHJldHJpZXZpbmcgc3RvcmVkIGRhdGEgb2JqZWN0Jyk7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgIGxvZy5lcnJvcignW0RhdGFPYmplY3RTdG9yYWdlLnN5bmNdIEVycm9yIGNvbm5lY3RpbmcgdG8gcmVtb3RlIHN0b3JhZ2UgJywgZXJyb3IpO1xyXG4gICAgICAgIF90aGlzLl9yZW1vdGVzW3Jlc291cmNlXS5nZXQobnVsbCwgbnVsbCwgdGFibGUpLnRoZW4oKGRhdGFPYmplY3QpID0+IHtcclxuICAgICAgICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdFN0b3JhZ2Uuc3luY10gcmV0dXJuaW5nIHN5bmNoZWQgRE86ICcsIGRhdGFPYmplY3QpO1xyXG4gICAgICAgICAgcmVzb2x2ZShkYXRhT2JqZWN0W3Jlc291cmNlXSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzdG9wU3luYyhyZXNvdXJjZSkge1xyXG5cclxuICAgIGlmICh0aGlzLl9yZW1vdGVzW3Jlc291cmNlXSkgdGhpcy5fcmVtb3Rlc1tyZXNvdXJjZV0uZGlzY29ubmVjdCgpO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4qIEBkZXNjcmlwdGlvbiBzaG91bGQgbG9vayBmb3IgYSBzcGVjaWZpYyBkYXRhT2JqZWN0VVJMXHJcbipcclxuKiBAcGFyYW0ge0RhdGFPYmplY3RVUkx9IHJlc291cmNlIC0gdGhlIGRhdGFPYmplY3RVUkwgd2lsbCBiZSBzZWFyY2hlZFxyXG4qXHJcbiogQHJldHVybnMgUHJvbWlzZTxPYmplY3Q+IG9iamVjdCB3aXRoIHRoZSBkYXRhT2JqZWN0IGluZm9ybWF0aW9uO1xyXG4qL1xyXG4gIGdldERhdGFPYmplY3QocmVzb3VyY2UpIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgLyogICAgICB0aGlzLl9yZW1vdGVzW3Jlc291cmNlXS5nZXQoKS50aGVuKChkYXRhT2JqZWN0KT0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhT2JqZWN0KTtcclxuICAgICAgICAgICAgfSAsICgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLl9zdG9yYWdlTWFuYWdlci5nZXQoJ3N5bmNoZXJNYW5hZ2VyOk9iamVjdFVSTHMnKS50aGVuKChzdG9yZWREYXRhT2JqZWN0KSA9PiB7Ki9cclxuXHJcbiAgICAgIGxldCBzdG9yZWREYXRhT2JqZWN0ID0gdGhpcy5fc3RvcmVEYXRhT2JqZWN0O1xyXG5cclxuICAgICAgbGV0IG9ic2VydmVycyA9IHN0b3JlZERhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoJ29ic2VydmVycycpID8gc3RvcmVkRGF0YU9iamVjdC5vYnNlcnZlcnMgOiB7fTtcclxuICAgICAgbGV0IHJlcG9ydGVycyA9IHN0b3JlZERhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoJ3JlcG9ydGVycycpID8gc3RvcmVkRGF0YU9iamVjdC5yZXBvcnRlcnMgOiB7fTtcclxuXHJcbiAgICAgIGxldCBjdXJyZW50UmVwb3J0ZXIgPSBPYmplY3Qua2V5cyhyZXBvcnRlcnMpLmZpbmQoKHZhbHVlKSA9PiB7IHJldHVybiB2YWx1ZSA9PT0gcmVzb3VyY2U7IH0pO1xyXG4gICAgICBsZXQgY3VycmVudE9ic2VydmVyID0gT2JqZWN0LmtleXMob2JzZXJ2ZXJzKS5maW5kKCh2YWx1ZSkgPT4geyByZXR1cm4gdmFsdWUgPT09IHJlc291cmNlOyB9KTtcclxuICAgICAgbGV0IGRhdGFPYmplY3Q7XHJcblxyXG4gICAgICBpZiAoY3VycmVudE9ic2VydmVyKSB7IGRhdGFPYmplY3QgPSBzdG9yZWREYXRhT2JqZWN0Lm9ic2VydmVyc1tjdXJyZW50T2JzZXJ2ZXJdOyB9XHJcbiAgICAgIGlmIChjdXJyZW50UmVwb3J0ZXIpIHsgZGF0YU9iamVjdCA9IHN0b3JlZERhdGFPYmplY3QucmVwb3J0ZXJzW2N1cnJlbnRSZXBvcnRlcl07IH1cclxuXHJcbiAgICAgIGxvZy5pbmZvKCdbU3RvcmVEYXRhT2JqZWN0cyAtIGdldERhdGFPYmplY3RdIC0gZm9yIG9ic2VydmVyOiAnLCBjdXJyZW50T2JzZXJ2ZXIpO1xyXG4gICAgICBsb2cuaW5mbygnW1N0b3JlRGF0YU9iamVjdHMgLSBnZXREYXRhT2JqZWN0XSAtIGZvciByZXBvcnRlcnM6ICcsIGN1cnJlbnRSZXBvcnRlcik7XHJcblxyXG4gICAgICBsb2cuaW5mbygnW1N0b3JlRGF0YU9iamVjdHMgLSBnZXREYXRhT2JqZWN0XSAtIHJlc29sdmU6ICcsIGRhdGFPYmplY3QpO1xyXG4gICAgICByZXR1cm4gZGF0YU9iamVjdCA/IHJlc29sdmUoZGF0YU9iamVjdCkgOiByZWplY3QoJ05vIGRhdGFPYmplY3Qgd2FzIGZvdW5kJyk7XHJcblxyXG4gICAgICAvLyAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIHNob3VsZCBnZXQgdGhlIGRhdGFPYmplY3QgaW5mb3JtYXRpb24gYnkgdGhlIG1lc3NhZ2VcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtc2cgLSBtZXNzYWdlIHdvdWxkIGJlIGFuYWxpc2VkIHRvIGdldCB0aGUgY3VycmVudCBkYXRhT2JqZWN0IGluZm9ybWF0aW9uXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlcG9ydGVyIC0gdGhlIG9iamVjdCB0byBiZSBzYXZlZCBpcyBhIHJlcG9ydGVyXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBQcm9taXNlPG9iamVjdD4gc2hvdWxkIHJldHVuIGFuIG9iamVjdCB3aXRoIHRoZSBkYXRhT2JqZWN0IG9yIG51bGxcclxuICAgKi9cclxuICBnZXRSZXNvdXJjZXNCeUNyaXRlcmlhKG1zZywgaXNSZXBvcnRlcikge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG5cclxuICAgICAgbGV0IHR5cGUgPSB0aGlzLl9nZXRUeXBlT2ZPYmplY3QoaXNSZXBvcnRlcik7XHJcblxyXG4gICAgICAvLyAgICAgIHRoaXMuZ2V0QWxsKGlzUmVwb3J0ZXIpLnRoZW4oKHN0b3JlZERhdGFPYmplY3RzKSA9PiB7XHJcbiAgICAgIGxldCBzdG9yZWREYXRhT2JqZWN0cyA9IHRoaXMuX3N0b3JlRGF0YU9iamVjdDtcclxuXHJcbiAgICAgIGlmICghc3RvcmVkRGF0YU9iamVjdHMpIHtcclxuICAgICAgICBsb2cubG9nKCdbRGF0YU9iamVjdHNTdG9yYWdlLmdldFJlc291cmNlc0J5Q3JpdGVyaWFdIGRvblxcJ3QgaGF2ZSBzdG9yZWQgZGF0YSBvYmplY3RzJyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtc2cuYm9keSAmJiBtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgncmVzdW1lJykgJiYgIW1zZy5ib2R5LnJlc3VtZSkge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjaGVjayBpZiB0aGUgbWVzc2FnZSBoYXZlIG90aGVyIGNyaXRlcmlhXHJcbiAgICAgIC8vIGlmIG5vdCBzZWFyY2ggZm9yIG9uIHRoZSAnZnJvbScgb2YgdGhlIG1lc3NhZ2UuXHJcbiAgICAgIGxldCByZXN1bHQgPSBbXTtcclxuICAgICAgbGV0IGhhc1N1YnNjcmlwdGlvbiA9IHRoaXMuX2hhc1N1YnNjcmlwdGlvbihzdG9yZWREYXRhT2JqZWN0c1t0eXBlXSwgbXNnLmZyb20pO1xyXG4gICAgICBsZXQgaXNPd25lciA9IHRoaXMuX3NlYXJjaE93bmVyKHN0b3JlZERhdGFPYmplY3RzW3R5cGVdLCBtc2cuZnJvbSk7XHJcbiAgICAgIGxldCBpc1RvUHJvdG9TdHViUmVzdW1lID0gdGhpcy5fY2hlY2tQcm90b3N0dWJSZXN1bWUoc3RvcmVkRGF0YU9iamVjdHMsIG1zZyk7XHJcbiAgICAgIGxvZy5sb2coJ1tTdG9yZWREYXRhT2JqZWN0cyAtIGdldFJlc291cmNlc0J5Q3JpdGVyaWFdOicsIHN0b3JlZERhdGFPYmplY3RzLCBtc2csIGhhc1N1YnNjcmlwdGlvbiwgaXNPd25lcik7XHJcbiAgICAgIGlmIChtc2cuaGFzT3duUHJvcGVydHkoJ2Zyb20nKSAmJiBoYXNTdWJzY3JpcHRpb24gfHwgaXNPd25lciB8fCBpc1RvUHJvdG9TdHViUmVzdW1lKSB7XHJcbiAgICAgICAgbGV0IHJlc291cmNlO1xyXG5cclxuICAgICAgICBpZiAoaXNPd25lcikge1xyXG4gICAgICAgICAgcmVzb3VyY2UgPSB0aGlzLl9nZXRSZXNvdXJjZXNCeU93bmVyKHN0b3JlZERhdGFPYmplY3RzW3R5cGVdLCBtc2cuZnJvbSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc291cmNlID0gdGhpcy5fZ2V0UmVzb3VyY2VzQnlTdWJzY3JpcHRpb24oc3RvcmVkRGF0YU9iamVjdHNbdHlwZV0sIG1zZy5mcm9tKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpZGVudGl0eUZvdW5kRGF0YSA9IFtdO1xyXG4gICAgICAgIGlmIChtc2cuYm9keSAmJiBtc2cuYm9keS5pZGVudGl0eSkgaWRlbnRpdHlGb3VuZERhdGEgPSB0aGlzLl9nZXRSZXNvdXJjZXNCeUlkZW50aXR5KHN0b3JlZERhdGFPYmplY3RzW3R5cGVdLCBtc2cuYm9keS5pZGVudGl0eSk7XHJcblxyXG4gICAgICAgIC8vVE9ETzogcmVtb3ZlIHNjaGVtYSBzaW5jZSBtZXRhZGF0YSBhbHJlYWR5IGluY2x1ZGVzIHRoZSBzY2hlbWE/XHJcblxyXG4gICAgICAgIGxldCBzY2hlbWFGb3VuZERhdGEgPSBbXTtcclxuICAgICAgICBpZiAobXNnLmJvZHkgJiYgbXNnLmJvZHkuc2NoZW1hKSBzY2hlbWFGb3VuZERhdGEgPSB0aGlzLl9nZXRSZXNvdXJjZXNCeVNjaGVtYShzdG9yZWREYXRhT2JqZWN0c1t0eXBlXSwgbXNnLmJvZHkuc2NoZW1hKTtcclxuXHJcbiAgICAgICAgbGV0IG1ldGFkYXRhRm91bmQgPSBbXTtcclxuICAgICAgICBpZiAobXNnLmJvZHkgJiYgbXNnLmJvZHkudmFsdWUpIHtcclxuICAgICAgICAgIGxldCBtZXRhZGF0YSA9IG1zZy5ib2R5LnZhbHVlO1xyXG4gICAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmRhdGE7XHJcbiAgICAgICAgICBtZXRhZGF0YUZvdW5kID0gdGhpcy5fZ2V0UmVzb3VyY2VzQnlNZXRhZGF0YShzdG9yZWREYXRhT2JqZWN0c1t0eXBlXSwgbWV0YWRhdGEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGRhdGFGb3VuZCA9IFtdO1xyXG4gICAgICAgIGlmIChtc2cuYm9keSAmJiBtc2cuYm9keS52YWx1ZSAmJiBtc2cuYm9keS52YWx1ZS5kYXRhKSBkYXRhRm91bmQgPSB0aGlzLl9nZXRSZXNvdXJjZXNCeURhdGEoc3RvcmVkRGF0YU9iamVjdHNbdHlwZV0sIG1zZy5ib2R5LnZhbHVlLmRhdGEpO1xyXG5cclxuICAgICAgICAvLyB5b3UgY2FuIHBhc3MgYXMgYXJyYXlzIGFzIHlvdSB3YW50Li4gaXQgd2lsbCBiZSBtZXJnZWQgaW4gb24gcGxhY2VcclxuICAgICAgICAvLyByZW1vdmVkIGR1cGxpY2F0ZXM7XHJcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5faW50ZXJzZWN0aW9uKHJlc291cmNlLCBpZGVudGl0eUZvdW5kRGF0YSwgc2NoZW1hRm91bmREYXRhLCBkYXRhRm91bmQsIG1ldGFkYXRhRm91bmQpO1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PSAwICYmIGlzVG9Qcm90b1N0dWJSZXN1bWUgJiYgdHlwZSA9PSAnb2JzZXJ2ZXJzJyAmJiBtc2cuZnJvbS5zcGxpdCgncHJvdG9zdHViJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IHN0b3JlZE9ic2VydmVycyA9IHN0b3JlZERhdGFPYmplY3RzW3R5cGVdO1xyXG4gICAgICAgICAgbGV0IGZyb21Eb21haW4gPSBkaXZpZGVVUkwobXNnLmZyb20pLmRvbWFpbjtcclxuICAgICAgICAgIE9iamVjdC5rZXlzKHN0b3JlZE9ic2VydmVycykuZmlsdGVyKChvYmplY3RVUkwpID0+IHtcclxuICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbnMgPSBzdG9yZWRPYnNlcnZlcnNbb2JqZWN0VVJMXS5zdWJzY3JpcHRpb25zO1xyXG4gICAgICAgICAgICBsZXQgaGFzU3Vic2NyaXB0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbkRvbWFpbiA9IGRpdmlkZVVSTChzdWJzY3JpcHRpb24pLmRvbWFpbjtcclxuICAgICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uRG9tYWluID09IGZyb21Eb21haW4pIHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9iamVjdFVSTCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgaW5pdCA9IHt9O1xyXG4gICAgICByZXN1bHQuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRJc1JlcG9ydGVyID0gc3RvcmVkRGF0YU9iamVjdHNbdHlwZV1ba2V5XTtcclxuICAgICAgICBpbml0W2tleV0gPSBjdXJyZW50SXNSZXBvcnRlcjtcclxuICAgICAgICByZXR1cm4gaW5pdDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsb2cubG9nKCdbU3RvcmUgRGF0YSBPYmplY3RzXSAtICcsIGluaXQpO1xyXG5cclxuICAgICAgcmVzb2x2ZShpbml0KTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHRvZG8gZG9jdW1lbnRhdGlvblxyXG4gICAqL1xyXG4gIF9nZXRSZXNvdXJjZXNCeUlkZW50aXR5KHN0b3JlZERhdGEsIHVzZXJVUkwpIHtcclxuICAgIGlmICghc3RvcmVkRGF0YSkgcmV0dXJuIFtdO1xyXG5cclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzdG9yZWREYXRhKS5maWx0ZXIoKG9iamVjdFVSTCkgPT4ge1xyXG4gICAgICByZXR1cm4gc3RvcmVkRGF0YVtvYmplY3RVUkxdLnN1YnNjcmliZXJVc2Vycy5maWx0ZXIoKGN1cnJlbnQpID0+IHtcclxuICAgICAgICByZXR1cm4gY3VycmVudCA9PT0gdXNlclVSTDtcclxuICAgICAgfSkubGVuZ3RoO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEB0b2RvIGRvY3VtZW50YXRpb25cclxuICAgKi9cclxuICBfZ2V0UmVzb3VyY2VzQnlPd25lcihzdG9yZWREYXRhLCBvd25lcikge1xyXG4gICAgaWYgKCFzdG9yZWREYXRhKSByZXR1cm4gW107XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc3RvcmVkRGF0YSkuZmlsdGVyKChvYmplY3RVUkwpID0+IHtcclxuICAgICAgcmV0dXJuIHN0b3JlZERhdGFbb2JqZWN0VVJMXS5yZXBvcnRlciA9PT0gb3duZXI7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHRvZG8gZG9jdW1lbnRhdGlvblxyXG4gICAqL1xyXG4gIF9nZXRSZXNvdXJjZXNCeVN1YnNjcmlwdGlvbihzdG9yZWREYXRhLCBzdWJzY3JpcHRpb24pIHtcclxuICAgIGlmICghc3RvcmVkRGF0YSkgcmV0dXJuIFtdO1xyXG5cclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzdG9yZWREYXRhKS5maWx0ZXIoKG9iamVjdFVSTCkgPT4ge1xyXG4gICAgICByZXR1cm4gc3RvcmVkRGF0YVtvYmplY3RVUkxdLnN1YnNjcmlwdGlvbnMuZmlsdGVyKChjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgPT09IHN1YnNjcmlwdGlvbjtcclxuICAgICAgfSkubGVuZ3RoO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXHJcbiAgICovXHJcbiAgX2dldFJlc291cmNlc0J5U2NoZW1hKHN0b3JlZERhdGEsIHNjaGVtYSkge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0b3JlZERhdGEpLmZpbHRlcigob2JqZWN0VVJMKSA9PiB7XHJcbiAgICAgIGxldCBjdXJyZW50T2JqZWN0ID0gc3RvcmVkRGF0YVtvYmplY3RVUkxdO1xyXG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoY3VycmVudE9iamVjdCkuZmlsdGVyKChrZXkpID0+IHtcclxuICAgICAgICByZXR1cm4ga2V5ID09PSAnc2NoZW1hJyAmJiBjdXJyZW50T2JqZWN0W2tleV0gPT09IHNjaGVtYTtcclxuICAgICAgfSkubGVuZ3RoO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEB0b2RvIGRvY3VtZW50YXRpb25cclxuICAgKi9cclxuICBfZ2V0UmVzb3VyY2VzQnlNZXRhZGF0YShzdG9yZWREYXRhLCBtZXRhZGF0YSkge1xyXG4gICAgaWYgKCFtZXRhZGF0YSkgcmV0dXJuIFtdO1xyXG5cclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzdG9yZWREYXRhKS5maWx0ZXIoKG9iamVjdFVSTCkgPT4ge1xyXG4gICAgICBsZXQgY3VycmVudE9iamVjdCA9IHN0b3JlZERhdGFbb2JqZWN0VVJMXTtcclxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGN1cnJlbnRPYmplY3QpLmZpbHRlcigoa2V5KSA9PiB7XHJcbiAgICAgICAgLy8gc2VhcmNoIG9uIHN0b3JlRGF0YU9iamVjdHMgZm9yIHNwZWNpZmljIGtleSBwcm92aWRlZCBmcm9tIGRhdGE7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGFkYXRhKS5maWx0ZXIoc2VhcmNoRm9yID0+IHtcclxuICAgICAgICAgIHJldHVybiBrZXkgPT09IHNlYXJjaEZvciAmJiBjdXJyZW50T2JqZWN0W2tleV0gPT09IG1ldGFkYXRhW3NlYXJjaEZvcl07XHJcbiAgICAgICAgfSkubGVuZ3RoO1xyXG5cclxuICAgICAgfSkubGVuZ3RoO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEB0b2RvIGRvY3VtZW50YXRpb25cclxuICAgKi9cclxuICBfZ2V0UmVzb3VyY2VzQnlEYXRhKHN0b3JlZERhdGEsIGRhdGEpIHtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIFtdO1xyXG5cclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzdG9yZWREYXRhKS5maWx0ZXIoKG9iamVjdFVSTCkgPT4ge1xyXG4gICAgICBsZXQgY3VycmVudE9iamVjdCA9IHN0b3JlZERhdGFbb2JqZWN0VVJMXS5oYXNPd25Qcm9wZXJ0eSgnZGF0YScpID8gc3RvcmVkRGF0YVtvYmplY3RVUkxdLmRhdGEgOiB7fTtcclxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGN1cnJlbnRPYmplY3QpLmZpbHRlcigoa2V5KSA9PiB7XHJcbiAgICAgICAgLy8gc2VhcmNoIG9uIHN0b3JlRGF0YU9iamVjdHMgZm9yIHNwZWNpZmljIGtleSBwcm92aWRlZCBmcm9tIGRhdGE7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGRhdGEpLmZpbHRlcihzZWFyY2hGb3IgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGtleSA9PT0gc2VhcmNoRm9yICYmIGN1cnJlbnRPYmplY3Rba2V5XSA9PT0gZGF0YVtzZWFyY2hGb3JdO1xyXG4gICAgICAgIH0pLmxlbmd0aDtcclxuXHJcbiAgICAgIH0pLmxlbmd0aDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXHJcbiAgICovXHJcbiAgX2hhc1N1YnNjcmlwdGlvbihzdG9yZWREYXRhLCBzdWJzY3JpcHRpb24pIHtcclxuICAgIGlmICghc3RvcmVkRGF0YSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzdG9yZWREYXRhKS5maWx0ZXIoKG9iamVjdFVSTCkgPT4ge1xyXG4gICAgICByZXR1cm4gc3RvcmVkRGF0YVtvYmplY3RVUkxdLnN1YnNjcmlwdGlvbnMuZmlsdGVyKChjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgPT09IHN1YnNjcmlwdGlvbjtcclxuICAgICAgfSkubGVuZ3RoO1xyXG4gICAgfSkubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHRvZG8gZG9jdW1lbnRhdGlvblxyXG4gICAqL1xyXG4gIF9zZWFyY2hPd25lcihzdG9yZWREYXRhLCBmcm9tKSB7XHJcbiAgICBpZiAoIXN0b3JlZERhdGEpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc3RvcmVkRGF0YSkuZmlsdGVyKChvYmplY3RVUkwpID0+IHtcclxuICAgICAgcmV0dXJuIHN0b3JlZERhdGFbb2JqZWN0VVJMXS5yZXBvcnRlciA9PT0gZnJvbTtcclxuICAgIH0pLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEB0b2RvIGRvY3VtZW50YXRpb25cclxuICAgKi9cclxuICBfY2hlY2tQcm90b3N0dWJSZXN1bWUoc3RvcmVkRGF0YU9iamVjdHMsIG1zZykge1xyXG5cclxuICAgIGlmICghc3RvcmVkRGF0YU9iamVjdHMpIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICBpZiAobXNnLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykgJiYgbXNnLmJvZHkudmFsdWUuaGFzT3duUHJvcGVydHkoJ3JlcG9ydGVyJykpIHtcclxuICAgICAgbGV0IHJlcG9ydGVyID0gbXNnLmJvZHkudmFsdWUucmVwb3J0ZXI7XHJcbiAgICAgIGlmIChzdG9yZWREYXRhT2JqZWN0cy5oYXNPd25Qcm9wZXJ0eSgncmVwb3J0ZXJzJykpIHtcclxuICAgICAgICBsZXQgcmVwb3J0ZXJzU3RvcmVkID0gc3RvcmVkRGF0YU9iamVjdHMucmVwb3J0ZXJzO1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXBvcnRlcnNTdG9yZWQpLmZpbHRlcigob2JqZWN0VVJMKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVwb3J0ZXJzU3RvcmVkW29iamVjdFVSTF0ucmVwb3J0ZXIgPT09IHJlcG9ydGVyO1xyXG4gICAgICAgIH0pLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHN0b3JlZERhdGFPYmplY3RzLmhhc093blByb3BlcnR5KCdvYnNlcnZlcnMnKSkge1xyXG4gICAgICBsZXQgc3RvcmVkT2JzZXJ2ZXJzID0gc3RvcmVkRGF0YU9iamVjdHMub2JzZXJ2ZXJzO1xyXG4gICAgICBsZXQgZnJvbURvbWFpbiA9IGRpdmlkZVVSTChtc2cuZnJvbSkuZG9tYWluO1xyXG5cclxuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0b3JlZE9ic2VydmVycykuZmlsdGVyKChvYmplY3RVUkwpID0+IHtcclxuICAgICAgICBsZXQgc3Vic2NyaXB0aW9ucyA9IHN0b3JlZE9ic2VydmVyc1tvYmplY3RVUkxdLnN1YnNjcmlwdGlvbnM7XHJcbiAgICAgICAgbGV0IGhhc1N1YnNjcmlwdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIHN1YnNjcmlwdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICBsZXQgc3Vic2NyaXB0aW9uRG9tYWluID0gZGl2aWRlVVJMKHN1YnNjcmlwdGlvbikuZG9tYWluO1xyXG4gICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbkRvbWFpbiA9PSBmcm9tRG9tYWluKSB7XHJcbiAgICAgICAgICAgIGhhc1N1YnNjcmlwdGlvbiA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGhhc1N1YnNjcmlwdGlvbikge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXHJcbiAgICovXHJcbiAgX2lzT3duZXIodmFsdWUsIHVybCkge1xyXG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIHZhbHVlLnJlcG9ydGVyID09PSB1cmwgPyB0cnVlIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEB0b2RvIGRvY3VtZW50YXRpb25cclxuICAgKi9cclxuICBfaW50ZXJzZWN0aW9uKCkge1xyXG4gICAgbGV0IGFyZ3MgPSBBcnJheS5mcm9tKGFyZ3VtZW50cyk7XHJcblxyXG4gICAgbGV0IHJlc3VsdCA9IGFyZ3MucmVkdWNlKChmaXJzdCwgc2Vjb25kKSA9PiB7XHJcbiAgICAgIHJldHVybiBmaXJzdC5jb25jYXQoc2Vjb25kKTtcclxuICAgIH0pLmZpbHRlcigodmFsdWUsIGluZGV4LCBzZWxmKSA9PiB7XHJcbiAgICAgIHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDtcclxuICAgIH0pO1xyXG4gICAgbG9nLmxvZygnRGF0YU9iamVjdHNTdG9yYWdlLl9pbnRlcnNlY3Rpb25dIFJlc3VsdCBhbiB1bmlxdWUgYXJyYXkgb2Ygc3RyaW5nczogJywgcmVzdWx0KTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEB0b2RvIGRvY3VtZW50YXRpb25cclxuICAgKi9cclxuICBfdXBkYXRlVG9BcnJheShzdG9yZURhdGFPYmplY3QsIHJlc291cmNlLCBrZXksIHZhbHVlKSB7XHJcbiAgICBsb2cubG9nKCdbRGF0YU9iamVjdHNTdG9yYWdlXSAtIF91cGRhdGVUb0FycmF5OiAnLCBzdG9yZURhdGFPYmplY3QsIHJlc291cmNlLCBrZXksIHZhbHVlKTtcclxuICAgIGlmIChzdG9yZURhdGFPYmplY3RbcmVzb3VyY2VdW2tleV0uaW5kZXhPZih2YWx1ZSkgPT09IC0xKSBzdG9yZURhdGFPYmplY3RbcmVzb3VyY2VdW2tleV0ucHVzaCh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEB0b2RvIGRvY3VtZW50YXRpb25cclxuICAgKi9cclxuICBfcmVtb3ZlRnJvbUFycmF5KHN0b3JlRGF0YU9iamVjdCwgcmVzb3VyY2UsIGtleSwgdmFsdWUpIHtcclxuICAgIGxldCBpbmRleE9mVmFsdWUgPSBzdG9yZURhdGFPYmplY3RbcmVzb3VyY2VdW2tleV0uaW5kZXhPZih2YWx1ZSk7XHJcbiAgICBpZiAoaW5kZXhPZlZhbHVlID09PSAtMSkgc3RvcmVEYXRhT2JqZWN0W3Jlc291cmNlXVtrZXldLnNwbGljZShpbmRleE9mVmFsdWUsIDEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXHJcbiAgICovXHJcbiAgX2hhc1ZhbHVlKG9iaiwga2V5LCB2YWx1ZSkge1xyXG4gICAgcmV0dXJuIG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG9ialtrZXldID09PSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHRvZG8gZG9jdW1lbnRhdGlvblxyXG4gICAqL1xyXG4gIF9nZXRUeXBlT2ZPYmplY3QoaXNSZXBvcnRlcikge1xyXG4gICAgcmV0dXJuIGlzUmVwb3J0ZXIgPyAncmVwb3J0ZXJzJyA6ICdvYnNlcnZlcnMnO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERhdGFPYmplY3RzU3RvcmFnZTtcclxuIiwiY2xhc3MgUHJvbWlzZVF1ZXVlIHtcclxuXHJcbiAgLy8gVE9ETzogSW1wcm92ZSB0aGlzIFF1ZXVpbmdcclxuICBjb25zdHJ1Y3Rvcihjb25jdXJyZW5jeSkge1xyXG4gICAgdGhpcy5mbHVzaGluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5Qcm9taXNlID0gUHJvbWlzZTtcclxuICAgIHRoaXMuY29uY3VycmVuY3kgPSAodHlwZW9mIGNvbmN1cnJlbmN5ICE9PSAnbnVtYmVyJykgPyAxIDogY29uY3VycmVuY3k7XHJcbiAgICB0aGlzLnByb21pc2VzID0gW107XHJcbiAgICB0aGlzLnF1ZXVlID0gW107XHJcbiAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZG9uZShjYikge1xyXG4gICAgdGhpcy5jYWxsYmFjayA9IGNiO1xyXG4gIH1cclxuXHJcbiAgYWRkKHByb21pc2UpIHtcclxuICAgIHRoaXMucXVldWUucHVzaChwcm9taXNlKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNQcm9jZXNzaW5nKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnF1ZXVlLnJlZHVjZSgocHJvbWlzZUNoYWluLCBjdXJyZW50VGFzaykgPT4ge1xyXG4gICAgICAgIHJldHVybiBwcm9taXNlQ2hhaW4udGhlbihjaGFpblJlc3VsdHMgPT4gY3VycmVudFRhc2sudGhlbihjdXJyZW50UmVzdWx0ID0+IFsuLi5jaGFpblJlc3VsdHMsIGN1cnJlbnRSZXN1bHRdKSk7XHJcbiAgICAgIH0sIFByb21pc2UucmVzb2x2ZShbXSkpLnRoZW4oYXJyYXlPZlJlc3VsdHMgPT4ge1xyXG4gICAgICAgIC8vIERvIHNvbWV0aGluZyB3aXRoIGFsbCByZXN1bHRzXHJcbiAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFByb21pc2VRdWV1ZTtcclxuXHJcbiIsIi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlJyk7XHJcblxyXG5pbXBvcnQgeyBnZW5lcmF0ZUdVSUQsIGRlZXBDbG9uZSwgYXZhaWxhYmxlU3BhY2UgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG5pbXBvcnQgUHJvbWlzZVF1ZXVlIGZyb20gJy4uL3V0aWxzL1Byb21pc2VRdWV1ZSc7XHJcblxyXG5jbGFzcyBIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZSB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHJ1bnRpbWVVUkwsIGJ1cywgc3RvcmFnZU1hbmFnZXIsIGh5cGVydHlSZXNvdXJjZXMpIHtcclxuXHJcbiAgICBpZiAoIXN0b3JhZ2VNYW5hZ2VyKSB0aHJvdyBuZXcgRXJyb3IoJ1tIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZSBjb25zdHJ1Y3Rvcl0gbWFuZGF0b3J5IHN0b3JhZ2VNYW5hZ2VyIHBhcmFtZXRlciBtaXNzaW5nJyk7XHJcbiAgICBpZiAoIXJ1bnRpbWVVUkwpIHRocm93IG5ldyBFcnJvcignW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlIGNvbnN0cnVjdG9yXSBtYW5kYXRvcnkgcnVudGltZVVSTCBwYXJhbWV0ZXIgbWlzc2luZycpO1xyXG4gICAgaWYgKCFidXMpIHRocm93IG5ldyBFcnJvcignW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlIGNvbnN0cnVjdG9yXSBtYW5kYXRvcnkgYnVzIHBhcmFtZXRlciBtaXNzaW5nJyk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fYnVzID0gYnVzO1xyXG5cclxuICAgIF90aGlzLl9zdG9yYWdlTGltaXQgPSAwLjk7IC8vIHRoZSBzYXZlIHN0b3JhZ2VMaW1pdDtcclxuXHJcbiAgICBfdGhpcy5fdXJsID0gcnVudGltZVVSTCArICcvc3RvcmFnZSc7XHJcblxyXG4gICAgX3RoaXMuX3N0b3JhZ2VNYW5hZ2VyID0gc3RvcmFnZU1hbmFnZXI7XHJcblxyXG4gICAgX3RoaXMucHJvbWlzZVF1ZXVlID0gbmV3IFByb21pc2VRdWV1ZSgpO1xyXG5cclxuICAgIF90aGlzLl9oeXBlcnR5UmVzb3VyY2VzID0gaHlwZXJ0eVJlc291cmNlcztcclxuXHJcbiAgICBidXMuYWRkTGlzdGVuZXIoX3RoaXMuX3VybCwgKG1zZykgPT4ge1xyXG4gICAgICBsb2cuaW5mbygnW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlXSBNZXNzYWdlIFJDVjogJywgbXNnKTtcclxuICAgICAgc3dpdGNoIChtc2cudHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ2NyZWF0ZSc6IF90aGlzLl9vbkNyZWF0ZShtc2cpOyBicmVhaztcclxuICAgICAgICBjYXNlICdyZWFkJzogX3RoaXMuX29uUmVhZChtc2cpOyBicmVhaztcclxuICAgICAgICBjYXNlICdkZWxldGUnOiBfdGhpcy5fb25EZWxldGUobXNnKTsgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNoZWNrIHRoZSBhdmFpbGFibGUgc3RvcmFnZSBxdW90YVxyXG4gICAqXHJcbiAgICogQG1lbWJlcm9mIEh5cGVydHlSZXNvdXJjZXNTdG9yYWdlXHJcbiAgICovXHJcbiAgY2hlY2tTdG9yYWdlUXVvdGEoKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9hdmFpbGFibGVRdW90YSAmJiB0aGlzLl91c2FnZSkge1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKGF2YWlsYWJsZVNwYWNlKHRoaXMuX3VzYWdlLCB0aGlzLl9hdmFpbGFibGVRdW90YSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobmF2aWdhdG9yKSB7XHJcblxyXG4gICAgICAgIG5hdmlnYXRvci5zdG9yYWdlLmVzdGltYXRlKCkudGhlbigoZXN0aW1hdGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2F2YWlsYWJsZVF1b3RhID0gZXN0aW1hdGUucXVvdGE7XHJcbiAgICAgICAgICB0aGlzLl91c2FnZSA9IGVzdGltYXRlLnVzYWdlO1xyXG4gICAgICAgICAgcmVzb2x2ZShhdmFpbGFibGVTcGFjZSh0aGlzLl91c2FnZSwgdGhpcy5fYXZhaWxhYmxlUXVvdGEpKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdbSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2VdIENoZWNrU3RvcmFnZVF1b3RhIGVycm9yOiAnLCByZWFzb24pO1xyXG4gICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIHNob3VsZCBzYXZlIGFuIEh5cGVydHlSZXNvdXJjZSBjb250YWluZWQgaW4gdGhlIGJvZHkgb2YgYSBjcmVhdGUgbWVzc2FnZSByZXF1ZXN0O1xyXG4gICAqXHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIGh5cGVydHkgcmVzb3VyY2UgdG8gYmUgc3RvcmVkXHJcbiAgICovXHJcblxyXG4gIF9vbkNyZWF0ZShtZXNzYWdlKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoIW1lc3NhZ2UuYm9keSB8fCAhbWVzc2FnZS5ib2R5LnZhbHVlKSB0aHJvdyBuZXcgRXJyb3IoJ1tIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZS5fb25DcmVhdGVdIG1hbmRhdG9yeSBtZXNzYWdlIGJvZHkgdmFsdWUgbWlzc2luZzogJywgbWVzc2FnZSk7XHJcblxyXG4gICAgbGV0IGNvbnRlbnQgPSBtZXNzYWdlLmJvZHkudmFsdWU7XHJcbiAgICBsZXQgY29udGVudFVSTCA9IGNvbnRlbnQuY29udGVudFVSTDtcclxuICAgIGxldCByZXNvdXJjZVVSTCA9ICcnO1xyXG5cclxuICAgIGlmICghY29udGVudFVSTCkge1xyXG5cclxuICAgICAgY29udGVudFVSTCA9IFtdO1xyXG4gICAgICByZXNvdXJjZVVSTCA9IF90aGlzLl91cmwgKyAnLycgKyBnZW5lcmF0ZUdVSUQoKTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gY29udGVudFVSTFswXTtcclxuICAgICAgY29uc3QgcmVzb3VyY2UgPSBjdXJyZW50VVJMLnN1YnN0cihjdXJyZW50VVJMLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcclxuICAgICAgcmVzb3VyY2VVUkwgPSBfdGhpcy5fdXJsICsgJy8nICsgcmVzb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFfdGhpcy5faHlwZXJ0eVJlc291cmNlcy5oYXNPd25Qcm9wZXJ0eShyZXNvdXJjZVVSTCkpIHtcclxuXHJcbiAgICAgIGNvbnRlbnRVUkwucHVzaChyZXNvdXJjZVVSTCk7XHJcbiAgICAgIGNvbnRlbnQuY29udGVudFVSTCA9IGNvbnRlbnRVUkw7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2h5cGVydHlSZXNvdXJjZXNbcmVzb3VyY2VVUkxdID0gY29udGVudDtcclxuXHJcbiAgICB0aGlzLnByb21pc2VRdWV1ZS5hZGQodGhpcy5fdG9TYXZlKHJlc291cmNlVVJMLCBtZXNzYWdlLCBjb250ZW50KSk7XHJcblxyXG4gIH1cclxuXHJcbiAgX3RvU2F2ZShyZXNvdXJjZVVSTCwgbWVzc2FnZSwgY29udGVudCkge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBjb25zdCBlcnJvciA9IChyZWFzb24pID0+IHtcclxuICAgICAgICBsZXQgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxyXG4gICAgICAgICAgdG86IG1lc3NhZ2UuZnJvbSxcclxuICAgICAgICAgIGlkOiBtZXNzYWdlLmlkLFxyXG4gICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgICAgIGJvZHk6IHsgdmFsdWU6IHJlc291cmNlVVJMLCBjb2RlOiA1MDAsIGRlc2NyaXB0aW9uOiByZWFzb24gfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXNwb25zZSk7XHJcblxyXG4gICAgICAgIHJldHVybiByZWplY3QocmVhc29uKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuY2hlY2tTdG9yYWdlUXVvdGEoKS50aGVuKChyZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRlbnQuc2l6ZSA+IHJlc3VsdC5xdW90YSkge1xyXG4gICAgICAgICAgY29uc3QgbXNnID0gJ1RoZSBzdG9yYWdlIGRvIG5vdCBoYXZlIHNwYWNlIHRvIHN0b3JlIHRoYXQgcmVzb3VyY2UnO1xyXG4gICAgICAgICAgZXJyb3IobXNnKTtcclxuICAgICAgICAgIHRocm93IEVycm9yKG1zZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzcGFjZUF2YWlsYWJsZSA9IHJlc3VsdC5xdW90YTtcclxuICAgICAgICBjb25zdCBhbGxvY2F0ZWQgPSByZXN1bHQudXNhZ2UgKyBjb250ZW50LnNpemU7XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQucGVyY2VudCA+PSB0aGlzLl9zdG9yYWdlTGltaXQgfHwgYWxsb2NhdGVkID4gc3BhY2VBdmFpbGFibGUpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRPbGRlclJlc291cmNlcyhjb250ZW50LnNpemUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KS50aGVuKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmFnZU1hbmFnZXIuc2V0KHJlc291cmNlVVJMLCAxLCBjb250ZW50KTtcclxuICAgICAgfSkudGhlbigoKSA9PiB7XHJcblxyXG4gICAgICAgIGxldCByZXNwb25zZSA9IHtcclxuICAgICAgICAgIGZyb206IG1lc3NhZ2UudG8sXHJcbiAgICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxyXG4gICAgICAgICAgaWQ6IG1lc3NhZ2UuaWQsXHJcbiAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnLFxyXG4gICAgICAgICAgYm9keTogeyB2YWx1ZTogcmVzb3VyY2VVUkwsIGNvZGU6IDIwMCB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgbG9nLmxvZygnU3VjY2VzcycpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xyXG5cclxuICAgICAgfSkuY2F0Y2goZXJyb3IpO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIF9nZXRPbGRlclJlc291cmNlcyhzaXplKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIHRoaXMuX3N0b3JhZ2VNYW5hZ2VyLmdldCgpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG5cclxuICAgICAgICBjb25zdCByZXNvdXJjZXMgPSBPYmplY3Qua2V5cyhyZXN1bHQpO1xyXG5cclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIGNvbnN0IHJlZHVjZWQgPSByZXNvdXJjZXMuc29ydCgoYSwgYikgPT4gcmVzdWx0W2FdLmNyZWF0ZWQgPCByZXN1bHRbYl0uY3JlYXRlZClcclxuICAgICAgICAgIC5yZWR1Y2UoKHByZXZpb3VzUmVzb3VyY2UsIGN1cnJlbnRSZXNvdXJjZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5faHlwZXJ0eVJlc291cmNlc1tjdXJyZW50UmVzb3VyY2VdO1xyXG5cclxuICAgICAgICAgICAgbG9nLmxvZygnW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlXSBfZ2V0T2xkZXJSZXNvdXJjZXM6ICcsIHRvdGFsLCBzaXplLCBjdXJyZW50UmVzb3VyY2UsIHRoaXMuX2F2YWlsYWJsZVF1b3RhKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0b3RhbCA8PSBzaXplKSB7XHJcbiAgICAgICAgICAgICAgdG90YWwgKz0gY3VycmVudC5zaXplO1xyXG4gICAgICAgICAgICAgIHByZXZpb3VzUmVzb3VyY2UucHVzaChjdXJyZW50UmVzb3VyY2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXNSZXNvdXJjZTtcclxuXHJcbiAgICAgICAgICB9LCBbXSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRlbGV0aW5nID0gcmVkdWNlZC5tYXAoa2V5ID0+IHRoaXMuX3N0b3JhZ2VNYW5hZ2VyLmRlbGV0ZShrZXkpKTtcclxuXHJcbiAgICAgICAgUHJvbWlzZS5hbGwoZGVsZXRpbmcpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiBzaG91bGQgcmV0dXJuIGFuIEh5cGVydHlSZXNvdXJjZSBzdG9yZWQgaW4gdGhlIFN0b3JhZ2UgTWFuYWdlciBpZGVudGlmaWVkIGJ5IHRoZSBjb250ZW50IHVybCBjb250YWluZWQgaW4gdGhlIGJvZHkgb2YgYSByZWFkIG1lc3NhZ2UgcmVxdWVzdDtcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gbWVzc2FnZSBjb250YWluaW5nIHRoZSBoeXBlcnR5IHJlc291cmNlIHRvIGJlIHN0b3JlZFxyXG4gICAqL1xyXG5cclxuICBfb25SZWFkKG1lc3NhZ2UpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmICghbWVzc2FnZS5ib2R5IHx8ICFtZXNzYWdlLmJvZHkucmVzb3VyY2UpIHRocm93IG5ldyBFcnJvcignW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlLl9vblJlYWRdIG1hbmRhdG9yeSBtZXNzYWdlIGJvZHkgcmVzb3VyY2UgbWlzc2luZzogJywgbWVzc2FnZSk7XHJcblxyXG4gICAgbGV0IGNvbnRlbnRVcmwgPSBtZXNzYWdlLmJvZHkucmVzb3VyY2U7XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlID0ge1xyXG4gICAgICBmcm9tOiBtZXNzYWdlLnRvLFxyXG4gICAgICB0bzogbWVzc2FnZS5mcm9tLFxyXG4gICAgICBpZDogbWVzc2FnZS5pZCxcclxuICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgYm9keToge31cclxuICAgIH07XHJcblxyXG4gICAgLy8gbGV0IGNvbnRlbnQgPSBfdGhpcy5faHlwZXJ0eVJlc291cmNlc1tjb250ZW50VXJsXTtcclxuXHJcbiAgICBsb2cuaW5mbygnW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlLl9vblJlYWRdIGdldCByZXNvdXJjZVVSTDonLCBjb250ZW50VXJsKTtcclxuXHJcbiAgICB0aGlzLl9zdG9yYWdlTWFuYWdlci5nZXQoJ3Jlc291cmNlVVJMJywgY29udGVudFVybCkudGhlbigoY29udGVudCkgPT4ge1xyXG5cclxuICAgICAgbG9nLmluZm8oJ1tIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZS5fb25SZWFkXSBmb3VuZCBjb250ZW50OicsIGNvbnRlbnQpO1xyXG5cclxuICAgICAgaWYgKGNvbnRlbnQpIHtcclxuXHJcbiAgICAgICAgaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlID09PSAnZmlsZScpIHtcclxuICAgICAgICAgIF90aGlzLl9vblJlYWRGaWxlKHJlc3BvbnNlLCBjb250ZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzcG9uc2UuYm9keS5jb2RlID0gMjAwO1xyXG4gICAgICAgICAgcmVzcG9uc2UuYm9keS5wMnAgPSB0cnVlO1xyXG4gICAgICAgICAgcmVzcG9uc2UuYm9keS52YWx1ZSA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3BvbnNlLmJvZHkuY29kZSA9IDQwNDtcclxuICAgICAgICByZXNwb25zZS5ib2R5LmRlc2MgPSAnQ29udGVudCBOb3QgRm91bmQgZm9yICcgKyBjb250ZW50VXJsO1xyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIC8vcmVzcG9uc2UuYm9keS5jb2RlID0gNDA0O1xyXG5cclxuICAgIC8vX3RoaXMuX2h5cGVydHlSZXNvdXJjZXNbY29udGVudFVybF0gPSBtZXNzYWdlLmJvZHkudmFsdWU7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIF9vblJlYWRGaWxlKHJlc3BvbnNlLCByZXNvdXJjZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuXHJcbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24odGhlRmlsZSkge1xyXG5cclxuICAgICAgbG9nLmluZm8oJ1tGaWxlSHlwZXJ0eVJlc291cmNlLmluaXRdIGZpbGUgbG9hZGVkICcsIHRoZUZpbGUpO1xyXG5cclxuICAgICAgcmVzcG9uc2UuYm9keS5jb2RlID0gMjAwO1xyXG4gICAgICByZXNwb25zZS5ib2R5LnAycCA9IHRydWU7XHJcbiAgICAgIHJlc3BvbnNlLmJvZHkudmFsdWUgPSBkZWVwQ2xvbmUocmVzb3VyY2UpO1xyXG4gICAgICByZXNwb25zZS5ib2R5LnZhbHVlLmNvbnRlbnQgPSB0aGVGaWxlLnRhcmdldC5yZXN1bHQ7XHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAocmVzb3VyY2UubWltZXR5cGUuaW5jbHVkZXMoJ3RleHQvJykpIHtcclxuICAgICAgcmVhZGVyLnJlYWRBc1RleHQocmVzb3VyY2UuY29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBjdXJyZW50ID0gcmVzb3VyY2UuY29udGVudDtcclxuXHJcbiAgICAgIGxldCBibG9iO1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xyXG4gICAgICAgIGJsb2IgPSBuZXcgQmxvYihjdXJyZW50LCB7IHR5cGU6IHJlc291cmNlLm1pbWV0eXBlfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYmxvYiA9IG5ldyBCbG9iKFtjdXJyZW50XSwgeyB0eXBlOiByZXNvdXJjZS5taW1ldHlwZX0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gc2hvdWxkIGRlbGV0ZSBhbiBIeXBlcnR5UmVzb3VyY2UgZnJvbSB0aGUgc3RvcmFnZTtcclxuICAgKlxyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gbWVzc2FnZSBjb250YWluaW5nIHRoZSBjb250ZW50IFVSTCBvZiB0aGUgaHlwZXJ0eSByZXNvdXJjZSB0byBiZSBkZWxldGVkXHJcbiAgICovXHJcblxyXG4gIF9vbkRlbGV0ZShtZXNzYWdlKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoIW1lc3NhZ2UuYm9keSkgdGhyb3cgbmV3IEVycm9yKCdbSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2UuX29uRGVsZXRlXSBtYW5kYXRvcnkgbWVzc2FnZSBib2R5IG1pc3Npbmc6ICcsIG1lc3NhZ2UpO1xyXG5cclxuICAgIGlmIChtZXNzYWdlLmJvZHkucmVzb3VyY2UpIHtcclxuICAgICAgZGVsZXRlIF90aGlzLl9oeXBlcnR5UmVzb3VyY2VzW21lc3NhZ2UuYm9keS5yZXNvdXJjZV07XHJcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2UuYm9keS5yZXNvdXJjZXMpIHtcclxuICAgICAgbWVzc2FnZS5ib2R5LnJlc291cmNlcy5mb3JFYWNoKChyZXNvdXJjZSkgPT4ge1xyXG4gICAgICAgIGRlbGV0ZSBfdGhpcy5faHlwZXJ0eVJlc291cmNlc1tyZXNvdXJjZV07XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2UuX29uRGVsZXRlXSBtYW5kYXRvcnkgcmVzb3VyY2UgbWlzc2luZzogJywgbWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3RoaXMuX3N0b3JhZ2VNYW5hZ2VyLmRlbGV0ZSgncmVzb3VyY2VVUkwnLCBtZXNzYWdlLmJvZHkucmVzb3VyY2UpLnRoZW4oKCkgPT4ge1xyXG4gICAgICBsZXQgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgZnJvbTogbWVzc2FnZS50byxcclxuICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxyXG4gICAgICAgIGlkOiBtZXNzYWdlLmlkLFxyXG4gICAgICAgIHR5cGU6ICdyZXNwb25zZScsXHJcbiAgICAgICAgYm9keTogeyBjb2RlOiAyMDAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXNwb25zZSk7XHJcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgIGxldCByZXNwb25zZSA9IHtcclxuICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxyXG4gICAgICAgIHRvOiBtZXNzYWdlLmZyb20sXHJcbiAgICAgICAgaWQ6IG1lc3NhZ2UuaWQsXHJcbiAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgICBib2R5OiB7IGNvZGU6IDQwMCwgZGVzY3JpcHRpb246IHJlYXNvbiB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZTtcclxuIiwiLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignU3luU3Vic2NyaXB0aW9uJyk7XHJcblxyXG5jbGFzcyBTdWJzY3JpcHRpb24ge1xyXG5cclxuICBjb25zdHJ1Y3RvcihidXMsIG93bmVyLCB1cmwsIGlzUmVwb3J0ZXIpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgY2hpbGRCYXNlVVJMID0gdXJsICsgJy9jaGlsZHJlbi8nO1xyXG4gICAgbGV0IGNoYW5nZVVSTCA9IHVybCArICcvY2hhbmdlcyc7XHJcblxyXG4gICAgLy9wcm9jZXNzIGRlbGV0ZSBtZXNzYWdlXHJcbiAgICBfdGhpcy5fZGVsZXRlTGlzdGVuZXIgPSBidXMuYWRkTGlzdGVuZXIoY2hhbmdlVVJMLCAobXNnKSA9PiB7XHJcbiAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2RlbGV0ZScpIHtcclxuICAgICAgICBsb2cubG9nKCdTdWJzY3JpcHRpb24tREVMRVRFOiAnLCBtc2cpO1xyXG5cclxuICAgICAgICAvL0ZMT1ctT1VUOiBtZXNzYWdlIHNlbnQgdG8gYWxsIHN1YnNjcmliZXJzXHJcbiAgICAgICAgbGV0IGRlbGV0ZU1lc3NhZ2VUb0h5cGVydHkgPSB7XHJcbiAgICAgICAgICB0eXBlOiAnZGVsZXRlJywgZnJvbTogbXNnLmZyb20sIHRvOiBvd25lcixcclxuICAgICAgICAgIGJvZHk6IHsgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LCByZXNvdXJjZTogdXJsIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL3NlbmQgZGVsZXRlIHRvIGh5cGVydHlcclxuICAgICAgICBidXMucG9zdE1lc3NhZ2UoZGVsZXRlTWVzc2FnZVRvSHlwZXJ0eSwgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICBsb2cubG9nKCdTdWJzY3JpcHRpb24tREVMRVRFLVJFUExZOiAnLCByZXBseSk7XHJcbiAgICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgX3RoaXMuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy9hZGQgY2hhbmdlIHB1Ymxpc2ggYWRkcmVzcyBvciBmb3J3YXJkXHJcbiAgICBpZiAoaXNSZXBvcnRlcikge1xyXG4gICAgICBfdGhpcy5fY2hhbmdlTGlzdGVuZXIgPSBidXMuYWRkUHVibGlzaChjaGFuZ2VVUkwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgX3RoaXMuX2NoYW5nZUxpc3RlbmVyID0gYnVzLmFkZEZvcndhcmQoY2hhbmdlVVJMLCBvd25lcik7XHJcbiAgICB9XHJcblxyXG4gICAgX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXJzID0gW107XHJcbi8vICAgIGxvZy5sb2coJ1tTdWJzY3JpcHRpb25dIC0gY2hpbGRJRCcsIGNoaWxkcmVucyk7XHJcbi8vICAgIGNoaWxkcmVucy5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4vLyAgICBsZXQgY2hpbGRJZCA9IGNoaWxkQmFzZVVSTCArIGNoaWxkO1xyXG5cclxuLy8gICAgICBsb2cubG9nKCdbU3Vic2NyaXB0aW9uXSAtIGNoaWxkSUQnLCBjaGlsZEJhc2VVUkwpO1xyXG5cclxuICAgICAgLy9hZGQgY2hpbGRyZW4gcHVibGlzaCBhZGRyZXNzXHJcbiAgICAgIGxldCBjaGlsZHJlbkZvcndhcmQgPSBidXMuYWRkUHVibGlzaChjaGlsZEJhc2VVUkwpO1xyXG4gICAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMucHVzaChjaGlsZHJlbkZvcndhcmQpO1xyXG5cclxuICAgICAgLy9hZGQgc2VsZiBmb3J3YXJkIGlmIGFuIG9ic2VydmVyXHJcbiAgICAgIGlmICghaXNSZXBvcnRlcikge1xyXG4gICAgICAgIGxldCBzZWxmRm9yd2FyZCA9IGJ1cy5hZGRGb3J3YXJkKGNoaWxkQmFzZVVSTCwgb3duZXIpO1xyXG4gICAgICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5wdXNoKHNlbGZGb3J3YXJkKTtcclxuICAgICAgfVxyXG4vLyAgICB9KTtcclxuICB9XHJcblxyXG4gIF9yZWxlYXNlTGlzdGVuZXJzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fZGVsZXRlTGlzdGVuZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgX3RoaXMuX2NoYW5nZUxpc3RlbmVyLnJlbW92ZSgpO1xyXG5cclxuICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5mb3JFYWNoKChmb3J3YXJkKSA9PiB7XHJcbiAgICAgIGZvcndhcmQucmVtb3ZlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdWJzY3JpcHRpb247XHJcbiIsIi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1JlcG9ydGVyT2JqZWN0Jyk7XHJcblxyXG5pbXBvcnQgeyBkaXZpZGVVUkwsIHNwbGl0T2JqZWN0VVJMIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgU3Vic2NyaXB0aW9uIGZyb20gJy4vU3Vic2NyaXB0aW9uJztcclxuaW1wb3J0ICogYXMgY3J5cHRvTWFuYWdlciBmcm9tICcuLi9jcnlwdG9NYW5hZ2VyL0NyeXB0b01hbmFnZXInO1xyXG5cclxuY2xhc3MgUmVwb3J0ZXJPYmplY3Qge1xyXG5cclxuICBjb25zdHJ1Y3RvcihwYXJlbnQsIG93bmVyLCB1cmwsIGNoaWxkcmVucywgb2ZmbGluZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fcGFyZW50ID0gcGFyZW50O1xyXG4gICAgX3RoaXMuX293bmVyID0gb3duZXI7XHJcbiAgICBfdGhpcy5fdXJsID0gdXJsO1xyXG5cclxuICAgIF90aGlzLl9idXMgPSBwYXJlbnQuX2J1cztcclxuXHJcbiAgICBfdGhpcy5fZG9tYWluID0gZGl2aWRlVVJMKHVybCkuZG9tYWluO1xyXG4gICAgX3RoaXMuX29ialN1YnNjcmlwdG9yVVJMID0gX3RoaXMuX3VybCArICcvc3Vic2NyaXB0aW9uJztcclxuXHJcbiAgICBfdGhpcy5fc3Vic2NyaXB0aW9ucyA9IHt9O1xyXG4gICAgX3RoaXMuX2NoaWxkcmVucyA9IGNoaWxkcmVucztcclxuICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycyA9IFtdO1xyXG5cclxuICAgIF90aGlzLl9mb3J3YXJkcyA9IHt9O1xyXG5cclxuICAgIF90aGlzLl9pc1RvU2F2ZURhdGEgPSBmYWxzZTtcclxuXHJcbiAgICBfdGhpcy5fYWxsb2NhdGVMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICBfdGhpcy5fb2ZmbGluZSA9IG9mZmxpbmUgPyBvZmZsaW5lIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgb2ZmbGluZSgpe1xyXG4gICAgcmV0dXJuIHRoaXMuX29mZmxpbmU7XHJcbiAgfVxyXG5cclxuICBfYWxsb2NhdGVMaXN0ZW5lcnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIC8vYWRkIHN1YnNjcmlwdGlvbiBsaXN0ZW5lci4uLlxyXG4gICAgX3RoaXMuX3N1YnNjcmlwdGlvbkxpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihfdGhpcy5fb2JqU3Vic2NyaXB0b3JVUkwsIChtc2cpID0+IHtcclxuICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyTWFuYWdlci5SZXBvcnRlck9iamVjdCByZWNlaXZlZCBdJywgbXNnKTtcclxuICAgICAgc3dpdGNoIChtc2cudHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ3N1YnNjcmliZSc6IF90aGlzLl9vblJlbW90ZVN1YnNjcmliZShtc2cpOyBicmVhaztcclxuICAgICAgICBjYXNlICd1bnN1YnNjcmliZSc6IF90aGlzLl9vblJlbW90ZVVuU3Vic2NyaWJlKG1zZyk7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3Jlc3BvbnNlJzogX3RoaXMuX29uUmVtb3RlUmVzcG9uc2UobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZm9yd2FyZCc6IF90aGlzLl9vbkZvcndhcmRlZFJlbW90ZVN1YnNjcmliZShtc2cpOyBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbGV0IGNoYW5nZVVSTCA9IF90aGlzLl91cmwgKyAnL2NoYW5nZXMnO1xyXG4gICAgX3RoaXMuX2NoYW5nZUxpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihjaGFuZ2VVUkwsIChtc2cpID0+IHtcclxuXHJcbiAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIuUmVwb3J0ZXJPYmplY3QgXSBTeW5jaGVyTWFuYWdlci0nICsgY2hhbmdlVVJMICsgJy1SQ1Y6ICcsIG1zZyk7XHJcblxyXG4gICAgICAvL2RvIG5vdCBzYXZlIGNoYW5nZXMgdG8gYmFja3VwUmV2aXNpb24gdG8gYXZvaWQgaW5maW5pdGUgbG9vcHNcclxuICAgICAgaWYgKHRoaXMuX2lzVG9TYXZlRGF0YSAmJiBtc2cuYm9keS5hdHRyaWJ1dGUgKSB7XHJcbiAgICAgICAgbGV0IHVwZGF0ZVJ1bnRpbWVTdGF0dXMgPSBtc2cuYm9keS5hdHRyaWJ1dGUgIT09ICdiYWNrdXBSZXZpc2lvbicgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0IF0gU3luY2hlck1hbmFnZXIgLSBzYXZlIGRhdGE6ICcsIG1zZyk7XHJcbiAgICAgICAgX3RoaXMuX3BhcmVudC5fZGF0YU9iamVjdHNTdG9yYWdlLnVwZGF0ZSh0cnVlLCBfdGhpcy5fdXJsLCAndmVyc2lvbicsIG1zZy5ib2R5LnZlcnNpb24sIHVwZGF0ZVJ1bnRpbWVTdGF0dXMpO1xyXG4gICAgICAgIF90aGlzLl9wYXJlbnQuX2RhdGFPYmplY3RzU3RvcmFnZS51cGRhdGUodHJ1ZSwgX3RoaXMuX3VybCwgJ2xhc3RNb2RpZmllZCcsIG1zZy5ib2R5Lmxhc3RNb2RpZmllZCwgdXBkYXRlUnVudGltZVN0YXR1cyk7XHJcbiAgICAgICAgX3RoaXMuX3BhcmVudC5fZGF0YU9iamVjdHNTdG9yYWdlLnNhdmVEYXRhKHRydWUsIF90aGlzLl91cmwsIG1zZy5ib2R5LmF0dHJpYnV0ZSwgbXNnLmJvZHkudmFsdWUsIHVwZGF0ZVJ1bnRpbWVTdGF0dXMpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldCBpc1RvU2F2ZURhdGEodmFsdWUpIHtcclxuICAgIHRoaXMuX2lzVG9TYXZlRGF0YSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLy8gVG8gaGFuZGxlIHN1YnNjcmlwdGlvbnMgc2VudCB3aGlsZSB0aGUgcmVwb3J0ZXIgd2FzIG9mZmxpbmUgaWUgZm9yd2FyZGVkIGJ5IGEgT2ZmbGluZSBTdWJzY3JpcHRpb24gTWFuYWdlciBzZXJ2aWNlXHJcblxyXG4gIF9vbkZvcndhcmRlZFJlbW90ZVN1YnNjcmliZShtc2cpIHtcclxuICAgIHRoaXMuX29uUmVtb3RlU3Vic2NyaWJlKG1zZy5ib2R5KTtcclxuICB9XHJcblxyXG4gIF9yZWxlYXNlTGlzdGVuZXJzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fc3Vic2NyaXB0aW9uTGlzdGVuZXIucmVtb3ZlKCk7XHJcblxyXG4gICAgX3RoaXMuX2NoYW5nZUxpc3RlbmVyLnJlbW92ZSgpO1xyXG5cclxuICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5mb3JFYWNoKChjbCkgPT4ge1xyXG4gICAgICBjbC5yZW1vdmUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIE9iamVjdC5rZXlzKF90aGlzLl9mb3J3YXJkcykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIF90aGlzLmZvcndhcmRVblN1YnNjcmliZShrZXkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9yZW1vdmUgYWxsIHN1YnNjcmlwdGlvbnNcclxuICAgIE9iamVjdC5rZXlzKF90aGlzLl9zdWJzY3JpcHRpb25zKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgX3RoaXMuX3N1YnNjcmlwdGlvbnNba2V5XS5fcmVsZWFzZUxpc3RlbmVycygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXN1bWVTdWJzY3JpcHRpb25zKHN1YnNjcmlwdGlvbnMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgaWYgKCFzdWJzY3JpcHRpb25zKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGxldCBoeXBlcnR5VVJMID0gc3Vic2NyaXB0aW9uc1trZXldO1xyXG5cclxuICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0XSAtIHJlc3VtZSBzdWJzY3JpcHRpb25zJywgX3RoaXMsIGh5cGVydHlVUkwsIF90aGlzLl9jaGlsZHJlbnMpO1xyXG5cclxuICAgICAgaWYgKCFfdGhpcy5fc3Vic2NyaXB0aW9uc1toeXBlcnR5VVJMXSkge1xyXG4gICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHlVUkxdID0gbmV3IFN1YnNjcmlwdGlvbihfdGhpcy5fYnVzLCBfdGhpcy5fb3duZXIsIF90aGlzLl91cmwsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIGluIHRoZSBtc2ctbm9kZSBhbmQgaW4gdGhlIGxvY2FsIE1lc3NhZ2VCdXMsIHNvIHRoYXQgbWVzc2FnZXMgb24gdGhpcyBhZGRyZXNzIGFyZSBmb3J3YXJkZWQgdG8gdGhlIHJlcG9ydGVyIG9iamVjdFxyXG4gICAqIEBwYXJhbSAge3N0cmluZ30gYWRkcmVzcyAtIFVSTCB0byByZWdpc3RlciB0aGUgbGlzdGVuZXJzXHJcbiAgICogQHJldHVybiB7UHJvbWlzZX0gUmV0dXJuIFByb21pc2UgT0sgb3IgZXJyb3JcclxuICAgKi9cclxuICBmb3J3YXJkU3Vic2NyaWJlKGFkZHJlc3Nlcykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL0ZMT1ctT1VUOiBtZXNzYWdlIHNlbnQgdG8gdGhlIG1zZy1ub2RlIFN1YnNjcmlwdGlvbk1hbmFnZXIgY29tcG9uZW50XHJcbiAgICBsZXQgbm9kZVN1YnNjcmliZU1zZyA9IHtcclxuICAgICAgdHlwZTogJ3N1YnNjcmliZScsIGZyb206IF90aGlzLl9wYXJlbnQuX3VybCwgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgX3RoaXMuX2RvbWFpbiArICcvc20nLFxyXG4gICAgICBib2R5OiB7IHJlc291cmNlczogYWRkcmVzc2VzLCBzb3VyY2U6IF90aGlzLl9vd25lciB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uobm9kZVN1YnNjcmliZU1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0IF1mb3J3YXJkLXN1YnNjcmliZS1yZXNwb25zZShyZXBvcnRlcik6ICcsIHJlcGx5KTtcclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGxldCBuZXdGb3J3YXJkID0gX3RoaXMuX2J1cy5hZGRGb3J3YXJkKF90aGlzLl91cmwsIF90aGlzLl9vd25lcik7XHJcbiAgICAgICAgICBfdGhpcy5fZm9yd2FyZHNbYWRkcmVzc2VzWzBdXSA9IG5ld0ZvcndhcmQ7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdCgnRXJyb3Igb24gbXNnLW5vZGUgc3Vic2NyaXB0aW9uOiAnICsgcmVwbHkuYm9keS5kZXNjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVblJlZ2lzdGVyIGEgbGlzdGVuZXIgaW4gdGhlIG1zZy1ub2RlIGFuZCBpbiB0aGUgbG9jYWwgTWVzc2FnZUJ1cywgc28gdGhhdCBtZXNzYWdlcyBvbiB0aGlzIGFkZHJlc3MgYXJlIHJlbW92ZWQgZnJvbSBmb3J3YXJkXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSBhZGRyZXNzIC0gVVJMIHRvIHVuLXJlZ2lzdGVyIHRoZSBsaXN0ZW5lcnNcclxuICAgKi9cclxuICBmb3J3YXJkVW5TdWJzY3JpYmUoYWRkcmVzcykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fZm9yd2FyZHNbYWRkcmVzc10ucmVtb3ZlKCk7XHJcbiAgICBkZWxldGUgX3RoaXMuX2ZvcndhcmRzW2FkZHJlc3NdO1xyXG5cclxuICAgIC8vRkxPVy1PVVQ6IG1lc3NhZ2Ugc2VudCB0byB0aGUgbXNnLW5vZGUgU3Vic2NyaXB0aW9uTWFuYWdlciBjb21wb25lbnRcclxuICAgIGxldCBub2RlVW5TdWJzY3JpYmVNc2cgPSB7XHJcbiAgICAgIHR5cGU6ICd1bnN1YnNjcmliZScsIGZyb206IF90aGlzLl9wYXJlbnQuX3VybCwgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgX3RoaXMuX2RvbWFpbiArICcvc20nLFxyXG4gICAgICBib2R5OiB7IHJlc291cmNlczogW2FkZHJlc3NdLCBzb3VyY2U6IF90aGlzLl9vd25lciB9XHJcbiAgICB9O1xyXG5cclxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uobm9kZVVuU3Vic2NyaWJlTXNnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIGxpc3RlbmVycyBmb3IgYSBsaXN0IG9mIGNoaWxkcmVucy4gUHVibGljIGNoYW5uZWxzIHVzZWQgdG8gdHJhbnNtaXQgbWVzc2FnZXMuXHJcbiAgICogQHBhcmFtICB7c3RyaW5nW119IGNoaWxkcmVucyAtIGNoYW5uZWxzIHRvIHJlZ2lzdGVyXHJcbiAgICogQHJldHVybiB7UHJvbWlzZX0gUmV0dXJuIFByb21pc2UgT0sgb3IgZXJyb3JcclxuICAgKi9cclxuICBhZGRDaGlsZHJlbnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5fY2hpbGRyZW5zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgICBsZXQgY2hpbGRCYXNlVVJMID0gX3RoaXMuX3VybCArICcvY2hpbGRyZW4vJztcclxuICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0IC0gYWRkQ2hpbGRyZW5zXSAtIGNoaWxkcmVuczogJywgY2hpbGRCYXNlVVJMKTtcclxuXHJcbiAgLyogICAgY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgX3RoaXMuX2NoaWxkcmVucy5wdXNoKGNoaWxkKTtcclxuICAgICAgfSk7Ki9cclxuXHJcbiAgICAgIC8qXHJcbiAgICAgIF90aGlzLl9jaGlsZHJlbnMuZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICBsZXQgY2hpbGRJZCA9IGNoaWxkQmFzZVVSTCArIGNoaWxkO1xyXG5cclxuICAgICAgICBsZXQgc2VsZkZvcndhcmQgPSBfdGhpcy5fYnVzLmFkZEZvcndhcmQoY2hpbGRJZCwgb3duZXIpO1xyXG4gICAgICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5wdXNoKHNlbGZGb3J3YXJkKTtcclxuICAgICAgfSk7Ki9cclxuXHJcbiAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XHJcbi8vICAgICAgY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkKSA9PiBzdWJzY3JpcHRpb25zLnB1c2goY2hpbGRCYXNlVVJMICsgY2hpbGQpKTtcclxuICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGNoaWxkQmFzZVVSTCApO1xyXG5cclxuICAgICAgLy9fdGhpcy5fc3RvcmFnZVN1YnNjcmlwdGlvbnNbX3RoaXMuX29ialN1YnNjcmlwdG9yVVJMXSA9IHt1cmw6IF90aGlzLl91cmwsIG93bmVyOiBfdGhpcy5fb3duZXIsIGNoaWxkcmVuczogX3RoaXMuX2NoaWxkcmVuc307XHJcblxyXG4gICAgICAvL0ZMT1ctT1VUOiBtZXNzYWdlIHNlbnQgdG8gdGhlIG1zZy1ub2RlIFN1YnNjcmlwdGlvbk1hbmFnZXIgY29tcG9uZW50XHJcbiAgICAgIGxldCBub2RlU3Vic2NyaWJlTXNnID0ge1xyXG4gICAgICAgIHR5cGU6ICdzdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fcGFyZW50Ll91cmwsIHRvOiAnZG9tYWluOi8vbXNnLW5vZGUuJyArIF90aGlzLl9kb21haW4gKyAnL3NtJyxcclxuICAgICAgICBib2R5OiB7IHJlc291cmNlczogc3Vic2NyaXB0aW9ucywgc291cmNlOiBfdGhpcy5fb3duZXIgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShub2RlU3Vic2NyaWJlTXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuUmVwb3J0ZXJPYmplY3QgXW5vZGUtc3Vic2NyaWJlLXJlc3BvbnNlKHJlcG9ydGVyKTonLCByZXBseSk7XHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcblxyXG4gICAgICAgICAgLy9hZGQgY2hpbGRyZW4gbGlzdGVuZXJzIG9uIGxvY2FsIC4uLlxyXG4gICAgICAgICAgc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChjaGlsZFVSTCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgY2hpbGRMaXN0ZW5lciA9IF90aGlzLl9idXMuYWRkTGlzdGVuZXIoY2hpbGRVUkwsIChtc2cpID0+IHtcclxuICAgICAgICAgICAgICAvL1RPRE86IHdoYXQgdG9kbyBoZXJlPyBTYXZlIGNoaWxkcmVucz9cclxuICAgICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuUmVwb3J0ZXJPYmplY3QgcmVjZWl2ZWRdJywgbXNnKTtcclxuXHJcblxyXG4gICAgICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2NyZWF0ZScgJiYgbXNnLnRvLmluY2x1ZGVzKCdjaGlsZHJlbicpICYmIHRoaXMuX2lzVG9TYXZlRGF0YSkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBub3QgZW5jcnlwdGVkIGxldHMgZW5jcnlwdCBpdFxyXG4gICAgICAgICAgICAgICAgLy8gdG9kbzogc2hvdWxkIGJlIHN1YmplY3QgdG8gc29tZSBwb2xpY3lcclxuICAgICAgICAgICAgICAgIGxldCBzcGxpdGVkUmVwb3J0ZXJVUkwgPSBzcGxpdE9iamVjdFVSTChtc2cudG8pO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBzcGxpdGVkUmVwb3J0ZXJVUkwudXJsO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICghbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ211dHVhbCcpKSBtc2cuYm9keS5tdXR1YWwgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vcmVtb3ZlIGZhbHNlIHdoZW4gbXV0dWFsQXV0aGVudGljYXRpb24gaXMgZW5hYmxlZFxyXG4gICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIG1zZy5ib2R5LnZhbHVlID09PSAnc3RyaW5nJykgJiYgbXNnLmJvZHkubXV0dWFsKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuUmVwb3J0ZXJPYmplY3RdIGVuY3J5cHRpbmcgcmVjZWl2ZWQgZGF0YSAnLCBtc2cuYm9keS52YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICBjcnlwdG9NYW5hZ2VyLmRlZmF1bHQuZW5jcnlwdERhdGFPYmplY3QobXNnLmJvZHkudmFsdWUsIHVybCkudGhlbigoZW5jcnlwdGVkVmFsdWUpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0XSBlbmNyeXB0ZWQgZGF0YSAnLCAgZW5jcnlwdGVkVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fc3RvcmVDaGlsZE9iamVjdChtc2csIEpTT04uc3RyaW5naWZ5KGVuY3J5cHRlZFZhbHVlKSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cud2FybignW1N5bmNoZXJNYW5hZ2VyLl9kZWNyeXB0Q2hpbGRyZW5zXSBmYWlsZWQgOiAnLCByZWFzb24sICcgU3RvcmluZyB1bmVuY3J5cHRlZCcpO1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9zdG9yZUNoaWxkT2JqZWN0KG1zZywgbXNnLmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLl9zdG9yZUNoaWxkT2JqZWN0KG1zZywgbXNnLmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMucHVzaChjaGlsZExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgICAgIGxldCBzZWxmRm9yd2FyZCA9IF90aGlzLl9idXMuYWRkRm9yd2FyZChjaGlsZFVSTCwgX3RoaXMuX293bmVyKTtcclxuICAgICAgICAgICAgX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXJzLnB1c2goc2VsZkZvcndhcmQpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QoJ0Vycm9yIG9uIG1zZy1ub2RlIHN1YnNjcmlwdGlvbjogJyArIHJlcGx5LmJvZHkuZGVzYyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gc3RvcmUgY2hpbGRPYmplY3RcclxuXHJcbiAgX3N0b3JlQ2hpbGRPYmplY3QobXNnLCBkYXRhKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBzcGxpdGVkUmVwb3J0ZXJVUkwgPSBzcGxpdE9iamVjdFVSTChtc2cudG8pO1xyXG5cclxuICAgIGxldCB1cmwgPSBzcGxpdGVkUmVwb3J0ZXJVUkwudXJsO1xyXG5cclxuICAgIGxldCByZXNvdXJjZSA9IHNwbGl0ZWRSZXBvcnRlclVSTC5yZXNvdXJjZTtcclxuICAgIGxldCB2YWx1ZTtcclxuICAgIFxyXG5cclxuLyogICAgaWYgKG1zZy5ib2R5LmlkZW50aXR5KSB7XHJcbiAgICAgIHZhbHVlLmlkZW50aXR5ID0gbXNnLmJvZHkuaWRlbnRpdHk7XHJcbiAgICAgIGRlbGV0ZSB2YWx1ZS5pZGVudGl0eS5hc3NlcnRpb247XHJcbiAgICAgIGRlbGV0ZSB2YWx1ZS5pZGVudGl0eS5leHBpcmVzO1xyXG4gICAgfSovXHJcblxyXG4gICAgbGV0IG9iamVjdFVSTFJlc291cmNlID0gbXNnLmJvZHkucmVzb3VyY2U7XHJcbiAgICBsZXQgYXR0cmlidXRlID0gcmVzb3VyY2U7XHJcblxyXG4gICAgaWYgKG9iamVjdFVSTFJlc291cmNlID09PSAnaGVhcnRiZWF0JyApIHZhbHVlID0gZGF0YTtcclxuICAgIGVsc2UgdmFsdWUgPSB7XHJcbiAgICAgIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSxcclxuICAgICAgdmFsdWU6IGRhdGFcclxuICAgIH07XHJcblxyXG4vLyAgICBpZiAob2JqZWN0VVJMUmVzb3VyY2UpIGF0dHJpYnV0ZSArPSAnLicgKyBvYmplY3RVUkxSZXNvdXJjZTtcclxuICAgIGlmIChvYmplY3RVUkxSZXNvdXJjZSkgYXR0cmlidXRlID0gb2JqZWN0VVJMUmVzb3VyY2U7XHJcblxyXG4gICAgLy8gdGhpcyBpZGVudGl0eSBkYXRhIGlzIG5vdCBuZWVkZWQgdG8gYmUgc3RvcmVkXHJcblxyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbU3luY2hlck1hbmFnZXIuUmVwb3J0ZXJPYmplY3QuX3N0b3JlQ2hpbGRPYmplY3RdIDogJywgdXJsLCBhdHRyaWJ1dGUsIHZhbHVlKTtcclxuXHJcbiAgICBfdGhpcy5fcGFyZW50Ll9kYXRhT2JqZWN0c1N0b3JhZ2Uuc2F2ZUNoaWxkcmVucyh0cnVlLCB1cmwsIGF0dHJpYnV0ZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBkb21haW4gPSBkaXZpZGVVUkwoX3RoaXMuX293bmVyKS5kb21haW47XHJcblxyXG4gICAgLy9GTE9XLU9VVDogbWVzc2FnZSBzZW50IGRpcmVjdGx5IHRvIGFsbCBzdWJzY3JpYmVycyBvZiB0aGUgcmVwb3J0ZXJcclxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICB0eXBlOiAnZGVsZXRlJywgZnJvbTogX3RoaXMuX29ialN1YnNjcmlwdG9yVVJMLCB0bzogX3RoaXMuX3VybCArICcvY2hhbmdlcydcclxuICAgIH0pO1xyXG5cclxuICAgIC8vRkxPVy1PVVQ6IG1lc3NhZ2Ugc2VudCB0byB0aGUgbXNnLW5vZGUgT2JqZWN0QWxsb2NhdGlvbk1hbmFnZXIgY29tcG9uZW50XHJcbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgdHlwZTogJ2RlbGV0ZScsIGZyb206IF90aGlzLl9wYXJlbnQuX3VybCwgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgZG9tYWluICsgJy9vYmplY3QtYWRkcmVzcy1hbGxvY2F0aW9uJyxcclxuICAgICAgYm9keTogeyByZXNvdXJjZTogX3RoaXMuX3VybCwgY2hpbGRyZW5SZXNvdXJjZXM6IF90aGlzLl9jaGlsZHJlbnMgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgX3RoaXMuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuICAgIGRlbGV0ZSBfdGhpcy5fcGFyZW50Ll9yZXBvcnRlcnNbX3RoaXMuX3VybF07XHJcbiAgfVxyXG5cclxuICBfb25SZW1vdGVSZXNwb25zZShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IF90aGlzLl91cmwsXHJcbiAgICAgIGJvZHk6IHsgY29kZTogbXNnLmJvZHkuY29kZSwgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LCBzb3VyY2U6IG1zZy5mcm9tIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy9GTE9XLUlOOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gU3luY2hlciAtPiBzdWJzY3JpYmVcclxuICBfb25SZW1vdGVTdWJzY3JpYmUobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGh5cGVydHlVUkwgPSBtc2cuYm9keS5zdWJzY3JpYmVyO1xyXG5cclxuICAgIC8vdmFsaWRhdGUgaWYgc3Vic2NyaXB0aW9uIGFscmVhZHkgZXhpc3RzP1xyXG4gICAgaWYgKF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHlVUkxdKSB7XHJcbiAgICAgIC8vIGxldCBlcnJvck1zZyA9IHtcclxuICAgICAgLy8gICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBoeXBlcnR5VVJMLFxyXG4gICAgICAvLyAgIGJvZHk6IHsgY29kZTogNTAwLCBkZXNjOiAnU3Vic2NyaXB0aW9uIGZvciAoJyArIF90aGlzLl91cmwgKyAnIDogJyArICBoeXBlcnR5VVJMICsgJykgYWxyZWFkeSBleGlzdHMhJyB9XHJcbiAgICAgIC8vIH07XHJcbiAgICAgIC8vXHJcbiAgICAgIC8vIF90aGlzLl9idXMucG9zdE1lc3NhZ2UoZXJyb3JNc2cpO1xyXG4gICAgICAvLyByZXR1cm47XHJcblxyXG4gICAgICAvLyBuZXcgdmVyc2lvbiBiZWNhdXNlIG9mIHJldXNhZ2VcclxuICAgICAgX3RoaXMuX3N1YnNjcmlwdGlvbnNbaHlwZXJ0eVVSTF0uX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvL2FzayB0byBzdWJzY3JpYmUgdG8gU3luY2hlcj8gKGRlcGVuZHMgb24gdGhlIG9wZXJhdGlvbiBtb2RlKVxyXG4gICAgLy9UT0RPOiBnZXQgbW9kZSBmcm9tIG9iamVjdCFcclxuICAgIGxldCBtb2RlID0gJ3N1Yi9wdWInO1xyXG5cclxuICAgIGlmIChtb2RlID09PSAnc3ViL3B1YicpIHtcclxuICAgICAgLy9GTE9XLU9VVDogbWVzc2FnZSBzZW50IHRvIGxvY2FsIGh5cGVydHkgYWRkcmVzcyBTeW5jaGVyIC0+IF9vbkZvcndhcmRcclxuICAgICAgbGV0IGZvcndhcmRNc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ2ZvcndhcmQnLCBmcm9tOiBfdGhpcy5fdXJsLCB0bzogX3RoaXMuX293bmVyLFxyXG4gICAgICAgIGJvZHk6IHsgdHlwZTogbXNnLnR5cGUsIGZyb206IGh5cGVydHlVUkwsIHRvOiBfdGhpcy5fdXJsLCBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHkgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy9UT0RPOiBGb3IgRnVydGhlciBTdHVkeVxyXG4gICAgICBpZiAobXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ211dHVhbCcpKSBmb3J3YXJkTXNnLmJvZHkubXV0dWFsID0gbXNnLmJvZHkubXV0dWFsO1xyXG5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShmb3J3YXJkTXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuUmVwb3J0ZXJPYmplY3QgXWZvcndhcmQtcmVwbHk6ICcsIHJlcGx5KTtcclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGlmICghX3RoaXMuX3N1YnNjcmlwdGlvbnNbaHlwZXJ0eVVSTF0pIHtcclxuICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0XSAtIF9vblJlbW90ZVN1YnNjcmliZTonLCBfdGhpcy5fY2hpbGRyZW5zKTtcclxuICAgICAgICAgICAgX3RoaXMuX3N1YnNjcmlwdGlvbnNbaHlwZXJ0eVVSTF0gPSBuZXcgU3Vic2NyaXB0aW9uKF90aGlzLl9idXMsIF90aGlzLl9vd25lciwgX3RoaXMuX3VybCwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgLy8gU3RvcmUgZm9yIGVhY2ggcmVwb3J0ZXIgaHlwZXJ0eSB0aGUgZGF0YU9iamVjdFxyXG4gICAgICAgIGxldCB1c2VyVVJMO1xyXG4gICAgICAgIGlmIChtc2cuYm9keS5pZGVudGl0eSAmJiBtc2cuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZS51c2VyVVJMKSB7XHJcbiAgICAgICAgICB1c2VyVVJMID0gbXNnLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUudXNlclVSTDtcclxuICAgICAgICAgIF90aGlzLl9wYXJlbnQuX2RhdGFPYmplY3RzU3RvcmFnZS51cGRhdGUodHJ1ZSwgX3RoaXMuX3VybCwgJ3N1YnNjcmliZXJVc2VycycsIHVzZXJVUkwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy9UT0RPOiBtdXR1YWwgYW5kIHNlc3Npb25rZXlzIHVwZGF0ZXMgd2VyZSByZW1vdmVkLiBGRlNcclxuXHJcbiAgICAgICAgLyogICAgICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykpIHtcclxuLy8gICAgICAgICAgX3RoaXMuX3BhcmVudC5faWRlbnRpdHlNb2R1bGUudXBkYXRlSXNUb0VuY3J5cHRGb3JEYXRhT2JqZWN0U2Vzc2lvbktleShfdGhpcy5fdXJsLCBtc2cuYm9keS5tdXR1YWwpLnRoZW4oKCk9PntcclxuICAgICAgICAgICAgX3RoaXMuX3BhcmVudC5fZGF0YU9iamVjdHNTdG9yYWdlLnVwZGF0ZSh0cnVlLCBfdGhpcy5fdXJsLCAnbXV0dWFsJywgbXNnLmJvZHkubXV0dWFsKTtcclxuLy8gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSovXHJcblxyXG4gICAgICAgIF90aGlzLl9wYXJlbnQuX2RhdGFPYmplY3RzU3RvcmFnZS51cGRhdGUodHJ1ZSwgX3RoaXMuX3VybCwgJ3N1YnNjcmlwdGlvbnMnLCBoeXBlcnR5VVJMKTtcclxuXHJcbiAgICAgICAgcmVwbHkuYm9keS5vd25lciA9IF90aGlzLl9vd25lcjtcclxuXHJcbiAgICAgICAgLy9GTE9XLU9VVDogc3Vic2NyaXB0aW9uIHJlc3BvbnNlIHNlbnQgKGZvcndhcmQgZnJvbSBpbnRlcm5hbCBIeXBlcnR5KVxyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgICBib2R5OiByZXBseS5ib2R5XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSByZW1vdGUgT2JzZXJ2ZXJPYmplY3QgLT4gcmVtb3ZlU3Vic2NyaXB0aW9uXHJcbiAgX29uUmVtb3RlVW5TdWJzY3JpYmUobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IHVuc3Vic2NyaWJlciA9IG1zZy5ib2R5LnNvdXJjZTtcclxuXHJcbiAgICBsZXQgc3Vic2NyaXB0aW9uID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbdW5zdWJzY3JpYmVyXTtcclxuICAgIGlmIChzdWJzY3JpcHRpb24pIHtcclxuICAgICAgc3Vic2NyaXB0aW9uLl9yZWxlYXNlTGlzdGVuZXJzKCk7XHJcbiAgICAgIGRlbGV0ZSBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1bnN1YnNjcmliZXJdO1xyXG5cclxuICAgICAgbGV0IGZvcndhcmRNc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ2ZvcndhcmQnLCBmcm9tOiBfdGhpcy5fdXJsLCB0bzogX3RoaXMuX293bmVyLFxyXG4gICAgICAgIGJvZHk6IHsgdHlwZTogbXNnLnR5cGUsIGZyb206IHVuc3Vic2NyaWJlciwgdG86IF90aGlzLl91cmwsIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSB9XHJcbiAgICAgIH07XHJcblxyXG5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShmb3J3YXJkTXNnKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVwb3J0ZXJPYmplY3Q7XHJcbiIsIi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ09ic2VydmVyT2JqZWN0Jyk7XHJcblxyXG5pbXBvcnQgeyBkaXZpZGVVUkwsIHNwbGl0T2JqZWN0VVJMLCBkZWVwQ2xvbmUgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCBTdWJzY3JpcHRpb24gZnJvbSAnLi9TdWJzY3JpcHRpb24nO1xyXG5pbXBvcnQgKiBhcyBjcnlwdG9NYW5hZ2VyIGZyb20gJy4uL2NyeXB0b01hbmFnZXIvQ3J5cHRvTWFuYWdlcic7XHJcblxyXG5jbGFzcyBPYnNlcnZlck9iamVjdCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHBhcmVudCwgdXJsLCBjaGlsZHJlbnMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX3BhcmVudCA9IHBhcmVudDtcclxuICAgIF90aGlzLl91cmwgPSB1cmw7XHJcbiAgICBfdGhpcy5fY2hpbGRyZW5zID0gY2hpbGRyZW5zO1xyXG5cclxuICAgIF90aGlzLl9idXMgPSBwYXJlbnQuX2J1cztcclxuXHJcbiAgICBfdGhpcy5fc3Vic2NyaXB0aW9ucyA9IHt9O1xyXG4gICAgX3RoaXMuX3N0b3JhZ2VTdWJzY3JpcHRpb25zID0ge307XHJcbiAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMgPSBbXTtcclxuXHJcbiAgICB0aGlzLl9pc1RvU2F2ZURhdGEgPSBmYWxzZTtcclxuXHJcbiAgICBsZXQgY2hhbmdlVVJMID0gX3RoaXMuX3VybCArICcvY2hhbmdlcyc7XHJcbiAgICBfdGhpcy5fY2hhbmdlTGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKGNoYW5nZVVSTCwgKG1zZykgPT4ge1xyXG5cclxuICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLk9ic2VydmVyT2JqZWN0IF0gU3luY2hlck1hbmFnZXItJyArIGNoYW5nZVVSTCArICctUkNWOiAnLCBtc2cpO1xyXG5cclxuICAgICAgLy9UT0RPOiB3aGF0IHRvZG8gaGVyZT8gU2F2ZSBjaGFuZ2VzP1xyXG4gICAgICBpZiAodGhpcy5faXNUb1NhdmVEYXRhICYmIG1zZy5ib2R5LmF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5PYnNlcnZlck9iamVjdCBdIFN5bmNoZXJNYW5hZ2VyIC0gc2F2ZSBkYXRhOiAnLCBtc2cpO1xyXG4gICAgICAgIF90aGlzLl9wYXJlbnQuX2RhdGFPYmplY3RzU3RvcmFnZS51cGRhdGUoZmFsc2UsIF90aGlzLl91cmwsICd2ZXJzaW9uJywgbXNnLmJvZHkudmVyc2lvbik7XHJcbiAgICAgICAgX3RoaXMuX3BhcmVudC5fZGF0YU9iamVjdHNTdG9yYWdlLnVwZGF0ZShmYWxzZSwgX3RoaXMuX3VybCwgJ2xhc3RNb2RpZmllZCcsIG1zZy5ib2R5Lmxhc3RNb2RpZmllZCk7XHJcbiAgICAgICAgX3RoaXMuX3BhcmVudC5fZGF0YU9iamVjdHNTdG9yYWdlLnNhdmVEYXRhKGZhbHNlLCBfdGhpcy5fdXJsLCBtc2cuYm9keS5hdHRyaWJ1dGUsIG1zZy5ib2R5LnZhbHVlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0IGlzVG9TYXZlRGF0YSh2YWx1ZSkge1xyXG4gICAgdGhpcy5faXNUb1NhdmVEYXRhID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBfbmV3U3Vic2NyaXB0aW9uKGh5cGVydHkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IHN1YnNjcmlwdGlvbiA9IF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHldO1xyXG4gICAgbG9nLmxvZygnW09ic2VydmVyIE9iamVjdCAtIG5ldyBzdWJzY3JpcHRpb25dIC0gJywgIF90aGlzLl9zdWJzY3JpcHRpb25zLCBoeXBlcnR5LCBfdGhpcy5fc3Vic2NyaXB0aW9ucy5oYXNPd25Qcm9wZXJ0eShoeXBlcnR5KSk7XHJcbiAgICBpZiAoIXN1YnNjcmlwdGlvbikge1xyXG4gICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uc1toeXBlcnR5XSA9IG5ldyBTdWJzY3JpcHRpb24oX3RoaXMuX2J1cywgaHlwZXJ0eSwgX3RoaXMuX3VybCwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkU3Vic2NyaXB0aW9uKGh5cGVydHkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX25ld1N1YnNjcmlwdGlvbihoeXBlcnR5KTtcclxuICB9XHJcblxyXG4gIGFkZENoaWxkcmVucygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5fY2hpbGRyZW5zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgICBsZXQgY2hpbGRCYXNlVVJMID0gX3RoaXMuX3VybCArICcvY2hpbGRyZW4vJztcclxuICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLk9ic2VydmVyT2JqZWN0IC0gYWRkQ2hpbGRyZW5zXSAtIGNoaWxkcmVuczogJywgY2hpbGRCYXNlVVJMKTtcclxuXHJcbi8vICAgICAgY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcblxyXG4gICAgICAgIGxldCBjaGlsZExpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihjaGlsZEJhc2VVUkwsIChtc2cpID0+IHtcclxuICAgICAgICAgIC8vVE9ETzogd2hhdCB0b2RvIGhlcmU/IFNhdmUgY2hpbGRyZW5zP1xyXG4gICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLk9ic2VydmVyT2JqZWN0IHJlY2VpdmVkXScsIG1zZyk7XHJcblxyXG4gICAgICAgICAgaWYgKG1zZy50eXBlID09PSAnY3JlYXRlJyAmJiBtc2cudG8uaW5jbHVkZXMoJ2NoaWxkcmVuJykgJiYgdGhpcy5faXNUb1NhdmVEYXRhKSB7XHJcbiAgICAgICAgICAgIGxldCBzcGxpdGVkUmVwb3J0ZXJVUkwgPSBzcGxpdE9iamVjdFVSTChtc2cudG8pO1xyXG5cclxuICAgICAgICAgICAgbGV0IHVybCA9IHNwbGl0ZWRSZXBvcnRlclVSTC51cmw7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSkgbXNnLmJvZHkubXV0dWFsID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIC8vcmVtb3ZlIGZhbHNlIHdoZW4gbXV0dWFsQXV0aGVudGljYXRpb24gaXMgZW5hYmxlZFxyXG4gICAgICAgICAgICBpZiAoISh0eXBlb2YgbXNnLmJvZHkudmFsdWUgPT09ICdzdHJpbmcnKSAmJiBtc2cuYm9keS5tdXR1YWwpIHtcclxuXHJcbiAgICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLk9ic2VydmVyT2JqZWN0XSBlbmNyeXB0aW5nIHJlY2VpdmVkIGRhdGEgJywgbXNnLmJvZHkudmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICBjcnlwdG9NYW5hZ2VyLmRlZmF1bHQuZW5jcnlwdERhdGFPYmplY3QobXNnLmJvZHkudmFsdWUsIHVybCkudGhlbigoZW5jcnlwdGVkVmFsdWUpPT57XHJcbiAgICAgICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuT2JzZXJ2ZXJPYmplY3RdIGVuY3J5cHRlZCBkYXRhICcsICBlbmNyeXB0ZWRWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3N0b3JlQ2hpbGRPYmplY3QobXNnLCBKU09OLnN0cmluZ2lmeShlbmNyeXB0ZWRWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGxvZy53YXJuKCdbU3luY2hlck1hbmFnZXIuT2JzZXJ2ZXJPYmplY3QuX2VuY3J5cHRDaGlsZF0gZmFpbGVkLCBzdG9yaW5nIHVuZW5jcnlwdGVkICcsIHJlYXNvbik7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fc3RvcmVDaGlsZE9iamVjdChtc2csIG1zZy5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBfdGhpcy5fc3RvcmVDaGlsZE9iamVjdChtc2csIG1zZy5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5PYnNlcnZlck9iamVjdCBjaGlsZHJlbiBMaXN0ZW5lcnNdJywgX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXJzLCBjaGlsZExpc3RlbmVyKTtcclxuICAgICAgICAgIGlmIChfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMuaW5kZXhPZihjaGlsZExpc3RlbmVyKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXJzLnB1c2goY2hpbGRMaXN0ZW5lcik7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgfSk7XHJcblxyXG4vLyAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIHN0b3JlIGNoaWxkT2JqZWN0XHJcblxyXG4gIF9zdG9yZUNoaWxkT2JqZWN0KG1zZywgZGF0YSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgc3BsaXRlZFJlcG9ydGVyVVJMID0gc3BsaXRPYmplY3RVUkwobXNnLnRvKTtcclxuXHJcbiAgICBsZXQgdXJsID0gc3BsaXRlZFJlcG9ydGVyVVJMLnVybDtcclxuXHJcbiAgICBsZXQgcmVzb3VyY2UgPSBzcGxpdGVkUmVwb3J0ZXJVUkwucmVzb3VyY2U7XHJcbiAgICBsZXQgdmFsdWUgPSB7fTtcclxuXHJcbi8qICAgIGxldCB2YWx1ZSA9IHtcclxuICAgICAgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LFxyXG4gICAgICB2YWx1ZTogZGF0YVxyXG4gICAgfTsqL1xyXG5cclxuICAgIC8vIHRoaXMgaWRlbnRpdHkgZGF0YSBpcyBub3QgbmVlZGVkIHRvIGJlIHN0b3JlZFxyXG4vKiAgICBkZWxldGUgdmFsdWUuaWRlbnRpdHkuYXNzZXJ0aW9uO1xyXG4gICAgZGVsZXRlIHZhbHVlLmlkZW50aXR5LmV4cGlyZXM7Ki9cclxuXHJcbiAgICBsZXQgb2JqZWN0VVJMUmVzb3VyY2UgPSBtc2cuYm9keS5yZXNvdXJjZTtcclxuICAgIGxldCBhdHRyaWJ1dGUgPSByZXNvdXJjZTtcclxuXHJcbiAgICBpZiAob2JqZWN0VVJMUmVzb3VyY2UgPT09ICdoZWFydGJlYXQnKSB7XHJcbiAgICAgIHZhbHVlID0gZGF0YTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHZhbHVlLmlkZW50aXR5PSBtc2cuYm9keS5pZGVudGl0eTtcclxuICAgICAgdmFsdWUudmFsdWUgPSBkYXRhO1xyXG4gICAgfSBcclxuXHJcbi8vICAgIGlmIChvYmplY3RVUkxSZXNvdXJjZSkgYXR0cmlidXRlICs9ICcuJyArIG9iamVjdFVSTFJlc291cmNlO1xyXG4gICAgaWYgKG9iamVjdFVSTFJlc291cmNlKSBhdHRyaWJ1dGUgPSBvYmplY3RVUkxSZXNvdXJjZTtcclxuXHJcbiAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuT2JzZXJ2ZXJPYmplY3QuX3N0b3JlQ2hpbGRPYmplY3RdIDogJywgdXJsLCBhdHRyaWJ1dGUsIHZhbHVlKTtcclxuXHJcbiAgICBfdGhpcy5fcGFyZW50Ll9kYXRhT2JqZWN0c1N0b3JhZ2Uuc2F2ZUNoaWxkcmVucyhmYWxzZSwgdXJsLCBhdHRyaWJ1dGUsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVN1YnNjcmlwdGlvbihtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGh5cGVydHkgPSBtc2cuZnJvbTtcclxuXHJcbiAgICBsZXQgZG9tYWluID0gZGl2aWRlVVJMKGh5cGVydHkpLmRvbWFpbjtcclxuICAgIGxldCBvYmpVUkxTdWJzY3JpcHRpb24gPSBfdGhpcy5fdXJsICsgJy9zdWJzY3JpcHRpb24nO1xyXG5cclxuICAgIGxldCBzdWJzY3JpcHRpb24gPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1toeXBlcnR5XTtcclxuICAgIGlmIChzdWJzY3JpcHRpb24pIHtcclxuICAgICAgLy9GTE9XLU9VVDogbWVzc2FnZSBzZW50IHRvIHJlbW90ZSBSZXBvcnRlck9iamVjdCAtPiBfb25SZW1vdGVVblN1YnNjcmliZVxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICB0eXBlOiAndW5zdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fcGFyZW50Ll91cmwsIHRvOiBvYmpVUkxTdWJzY3JpcHRpb24sXHJcbiAgICAgICAgYm9keTogeyBzb3VyY2U6IGh5cGVydHksIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy9UT0RPOiBzaG91bGQgSSB3YWl0IGZvciByZXNwb25zZSBiZWZvcmUgdW5zdWJzY3JpYmUgb24gbXNnLW5vZGVcclxuICAgICAgLy9GTE9XLU9VVDogbWVzc2FnZSBzZW50IHRvIG1zZy1ub2RlIFN1YnNjcmlwdGlvbk1hbmFnZXIgY29tcG9uZW50XHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgIHR5cGU6ICd1bnN1YnNjcmliZScsIGZyb206IF90aGlzLl9wYXJlbnQuX3VybCwgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgZG9tYWluICsgJy9zbScsXHJcbiAgICAgICAgYm9keTogeyByZXNvdXJjZTogX3RoaXMuX3VybCwgcmVzb3VyY2VzOiBbX3RoaXMuX3VybCArICcvY2hpbGRyZW4vJ10gfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHN1YnNjcmlwdGlvbi5fcmVsZWFzZUxpc3RlbmVycygpO1xyXG4gICAgICBkZWxldGUgX3RoaXMuX3N1YnNjcmlwdGlvbnNbaHlwZXJ0eV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgT2JzZXJ2ZXJPYmplY3Q7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1N5bmNoZXJNYW5hZ2VyJyk7XHJcblxyXG5pbXBvcnQgeyBkaXZpZGVVUkwsIGRlZXBDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuLy9pbXBvcnQgeyBzY2hlbWFWYWxpZGF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvc2NoZW1hVmFsaWRhdGlvbic7XHJcblxyXG5pbXBvcnQgQWRkcmVzc0FsbG9jYXRpb24gZnJvbSAnLi4vYWxsb2NhdGlvbi9BZGRyZXNzQWxsb2NhdGlvbic7XHJcbmltcG9ydCBSZXBvcnRlck9iamVjdCBmcm9tICcuL1JlcG9ydGVyT2JqZWN0JztcclxuaW1wb3J0IE9ic2VydmVyT2JqZWN0IGZyb20gJy4vT2JzZXJ2ZXJPYmplY3QnO1xyXG5pbXBvcnQgKiBhcyBjcnlwdG9NYW5hZ2VyIGZyb20gJy4uL2NyeXB0b01hbmFnZXIvQ3J5cHRvTWFuYWdlcic7XHJcblxyXG4vKipcclxuICogQGF1dGhvciBtaWNhZWxwZWRyb3NhQGdtYWlsLmNvbVxyXG4gKiBDb3JlIFN5bmNyb25pemF0aW9uIHN5c3RlbS5cclxuICovXHJcbmNsYXNzIFN5bmNoZXJNYW5hZ2VyIHtcclxuICAvKiBwcml2YXRlXHJcbiAgX3VybDogVVJMXHJcbiAgX2J1czogTWluaUJ1c1xyXG4gIF9yZWdpc3RyeTogUmVnaXN0cnlcclxuICBfYWxsb2NhdG9yOiBBZGRyZXNzQWxsb2NhdGlvblxyXG5cclxuICBfcmVwb3J0ZXJzOiB7IE9iamVjdFVSTDogUmVwb3J0ZXJPYmplY3QgfVxyXG4gIF9vYnNlcnZlcnM6IHsgT2JqZWN0VVJMOiBPYnNlcnZlck9iamVjdCB9XHJcbiAgKi9cclxuXHJcbiAgY29uc3RydWN0b3IocnVudGltZVVSTCwgYnVzLCByZWdpc3RyeSwgY2F0YWxvZywgc3RvcmFnZU1hbmFnZXIsIGFsbG9jYXRvciwgc3RvcmVEYXRhT2JqZWN0cywgaWRlbnRpdHlNb2R1bGUpIHtcclxuICAgIGlmICghcnVudGltZVVSTCkgdGhyb3cgbmV3IEVycm9yKCdbU3luY2hlciBNYW5hZ2VyXSAtIG5lZWRzIHRoZSBydW50aW1lVVJMIHBhcmFtZXRlcicpO1xyXG4gICAgaWYgKCFidXMpIHRocm93IG5ldyBFcnJvcignW1N5bmNoZXIgTWFuYWdlcl0gLSBuZWVkcyB0aGUgTWVzc2FnZUJ1cyBpbnN0YW5jZScpO1xyXG4gICAgaWYgKCFyZWdpc3RyeSkgdGhyb3cgbmV3IEVycm9yKCdbU3luY2hlciBNYW5hZ2VyXSAtIG5lZWRzIHRoZSBSZWdpc3RyeSBpbnN0YW5jZScpO1xyXG4gICAgaWYgKCFjYXRhbG9nKSB0aHJvdyBuZXcgRXJyb3IoJ1tTeW5jaGVyIE1hbmFnZXJdIC0gbmVlZHMgdGhlIFJ1bnRpbWVDYXRhbG9ndWUgaW5zdGFuY2UnKTtcclxuICAgIGlmICghc3RvcmFnZU1hbmFnZXIpIHRocm93IG5ldyBFcnJvcignW1N5bmNoZXIgTWFuYWdlcl0gLSBuZWVkIHRoZSBzdG9yYWdlTWFuYWdlciBpbnN0YW5jZScpO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX2J1cyA9IGJ1cztcclxuICAgIF90aGlzLl9yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xyXG4gICAgX3RoaXMuX2NhdGFsb2cgPSBjYXRhbG9nO1xyXG4gICAgX3RoaXMuX3N0b3JhZ2VNYW5hZ2VyID0gc3RvcmFnZU1hbmFnZXI7XHJcbiAgICBfdGhpcy5faWRlbnRpdHlNb2R1bGUgPSBpZGVudGl0eU1vZHVsZTtcclxuXHJcbiAgICAvL1RPRE86IHRoZXNlIHNob3VsZCBiZSBzYXZlZCBpbiBwZXJzaXN0ZW5jZSBlbmdpbmU/XHJcbiAgICBfdGhpcy5ydW50aW1lVVJMID0gcnVudGltZVVSTDtcclxuICAgIF90aGlzLl91cmwgPSBydW50aW1lVVJMICsgJy9zbSc7XHJcbiAgICBfdGhpcy5fb2JqZWN0VVJMID0gcnVudGltZVVSTCArICcvb2JqZWN0LWFsbG9jYXRpb24nO1xyXG5cclxuICAgIF90aGlzLl9yZXBvcnRlcnMgPSB7fTtcclxuICAgIF90aGlzLl9vYnNlcnZlcnMgPSB7fTtcclxuXHJcbiAgICBfdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlID0gc3RvcmVEYXRhT2JqZWN0cztcclxuICAgIGNvbnNvbGUubG9nKCdbTk9UU0FWSU5HXSBzdG9yZURhdGFPYmplY3RzJywgc3RvcmVEYXRhT2JqZWN0cyk7XHJcbiAgICAvL1RPRE86IHRoaXMgc2hvdWxkIG5vdCBiZSBoYXJkY29kZWQhXHJcbiAgICBfdGhpcy5fZG9tYWluID0gZGl2aWRlVVJMKHJ1bnRpbWVVUkwpLmRvbWFpbjtcclxuXHJcbiAgICBpZiAoYWxsb2NhdG9yKSB7XHJcbiAgICAgIF90aGlzLl9hbGxvY2F0b3IgPSBhbGxvY2F0b3I7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfdGhpcy5fYWxsb2NhdG9yID0gQWRkcmVzc0FsbG9jYXRpb24uaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyIC0gQWRkcmVzc0FsbG9jYXRpb25dIC0gJywgX3RoaXMuX2FsbG9jYXRvcik7XHJcblxyXG4gICAgYnVzLmFkZExpc3RlbmVyKF90aGlzLl91cmwsIChtc2cpID0+IHtcclxuICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyTWFuYWdlcl0gUkNWOiAnLCBtc2cpO1xyXG4gICAgICBzd2l0Y2ggKG1zZy50eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnY3JlYXRlJzogX3RoaXMuX29uQ3JlYXRlKG1zZyk7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ2RlbGV0ZSc6IF90aGlzLl9vbkRlbGV0ZShtc2cpOyBicmVhaztcclxuICAgICAgICBjYXNlICdzdWJzY3JpYmUnOiBfdGhpcy5fb25Mb2NhbFN1YnNjcmliZShtc2cpOyBicmVhaztcclxuICAgICAgICBjYXNlICd1bnN1YnNjcmliZSc6IF90aGlzLl9vbkxvY2FsVW5TdWJzY3JpYmUobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAncmVhZCc6IF90aGlzLl9vblJlYWQobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZXhlY3V0ZSc6IF90aGlzLl9vbkV4ZWN1dGUobXNnKTsgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGdldCB1cmwoKSB7IHJldHVybiB0aGlzLl91cmw7IH1cclxuXHJcbiAgICAgIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIFN5bmNoZXIgLT4gcmVhZFxyXG4gICAgICBfb25FeGVjdXRlKG1zZykge1xyXG5cclxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgICBsZXQgcmVwbHkgPSB7XHJcbiAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnLFxyXG4gICAgICAgICAgZnJvbTogbXNnLnRvLFxyXG4gICAgICAgICAgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgaWQ6IG1zZy5pZFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyTWFuYWdlci5vbkV4ZWN1dGVdIG5ldyBtZXNzYWdlJywgbXNnKTtcclxuXHJcbiAgICAgICAgaWYgKG1zZy5oYXNPd25Qcm9wZXJ0eSgnYm9keScpICYmIG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdtZXRob2QnKSAmJiBtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgncGFyYW1zJykpIHtcclxuXHJcbiAgICAgICAgc3dpdGNoIChtc2cuYm9keS5tZXRob2QpIHtcclxuICAgICAgICAgIGNhc2UgJ3N5bmMnOiBfdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLnN5bmMobXNnLmJvZHkucGFyYW1zWzBdLCBtc2cuYm9keS5wYXJhbXNbMV0sIGZhbHNlKTtcclxuICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ3N0b3BTeW5jJzogX3RoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5zdG9wU3luYyhtc2cuYm9keS5wYXJhbXNbMF0pO1xyXG4gICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlcGx5LmJvZHkgPSB7XHJcbiAgICAgICAgICAgICAgY29kZTogMjAwXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlcGx5KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXBseS5ib2R5ID0ge1xyXG4gICAgICAgICAgICBjb2RlOiA0MDAsXHJcbiAgICAgICAgICAgIGRlc2M6ICdtaXNzaW5nIGJvZHkgb3IgYm9keSBtZXRob2QgLyBwYXJhbXMgbWFuZGF0b3J5IGZpZWxkcydcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgbG9nLmVycm9yKCdbU3luY2hlck1hbmFnZXIub25FeGVjdXRlXSBlcnJvci4gTWlzc2luZyBib2R5IG9yIGJvZHkgbWV0aG9kIC8gcGFyYW1zIG1hbmRhdG9yeSBmaWVsZHMnLCBtc2cpO1xyXG5cclxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVwbHkpO1xyXG5cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG5cclxuICAgIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIFN5bmNoZXIgLT4gcmVhZFxyXG4gICAgX29uUmVhZChtc2cpIHtcclxuXHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICBsZXQgcmVwbHkgPSB7XHJcbiAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgICBmcm9tOiBtc2cudG8sXHJcbiAgICAgICAgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgIGlkOiBtc2cuaWRcclxuICAgICAgfVxyXG4gICAgICBsb2cuaW5mbygnW1N5bmNoZXJNYW5hZ2VyLm9uUmVhZF0gbmV3IG1lc3NhZ2UnLCBtc2cpO1xyXG5cclxuICAgICAgaWYgKG1zZy5oYXNPd25Qcm9wZXJ0eSgnYm9keScpICYmIG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdyZXNvdXJjZScpKSB7XHJcbiAgICAgICAgX3RoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5zeW5jKG1zZy5ib2R5LnJlc291cmNlLCBjcml0ZXJpYS5iYWNrdXBSZXZpc2lvbiwgdHJ1ZSkudGhlbigoZGF0YU9iamVjdCk9PntcclxuICAgICAgICAgIHJlcGx5LmJvZHkgPSB7XHJcbiAgICAgICAgICAgIGNvZGU6IDIwMCxcclxuICAgICAgICAgICAgdmFsdWU6IGRhdGFPYmplY3RcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyTWFuYWdlci5vblJlYWRdIGZvdW5kIG9iamVjdDogJywgZGF0YU9iamVjdCk7XHJcblxyXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXBseSk7XHJcbiAgICAgICAgfSwgKGVycm9yKT0+e1xyXG4gICAgICAgICAgcmVwbHkuYm9keSA9IHtcclxuICAgICAgICAgICAgY29kZTogNDAwLFxyXG4gICAgICAgICAgICBkZXNjOiBlcnJvclxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBsb2cuZXJyb3IoJ1tTeW5jaGVyTWFuYWdlci5vblJlYWRdIGVycm9yOiAnLCBlcnJvcik7XHJcblxyXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXBseSk7XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXBseS5ib2R5ID0ge1xyXG4gICAgICAgICAgY29kZTogNDAwLFxyXG4gICAgICAgICAgZGVzYzogJ21pc3NpbmcgYm9keSBvciBib2R5IHJlc291cmNlIG1hbmRhdG9yeSBmaWVsZHMnXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbG9nLmVycm9yKCdbU3luY2hlck1hbmFnZXIub25SZWFkXSBlcnJvci4gTWlzc2luZyBib2R5IG9yIGJvZHkgcmVzb3VyY2UgbWFuZGF0b3J5IGZpZWxkcycsIG1zZyk7XHJcblxyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVwbHkpO1xyXG5cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIFN5bmNoZXIgLT4gY3JlYXRlXHJcbiAgX29uQ3JlYXRlKG1zZykge1xyXG5cclxuICAgIGxldCBmcm9tID0gbXNnLmZyb207XHJcbiAgICBsZXQgdG8gPSBtc2cudG87XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIC8vIGNoZWNrIGlmIG1lc3NhZ2UgaXMgdG8gc2F2ZSBuZXcgY2hpbGRyZW5PYmplY3RzIGluIHRoZSBsb2NhbCBzdG9yYWdlXHJcbiAgICAvLyBUT0RPOiBjaGVjayBpZiBtZXNzYWdlIGlzIHRvIHN0b3JlIG5ldyBjaGlsZCBpbiB0aGUgbG9jYWwgc3RvcmFnZSBhbmQgY2FsbCBzdG9yZUNoaWxkLiBIb3cgdG8gZGlzdGluZ3Vpc2ggZnJvbSBvdGhlcnM/XHJcblxyXG4gICAgLy9kZWJ1Z2dlcjtcclxuICAgIGlmIChtc2cuYm9keS5hdHRyaWJ1dGUpIHsgdGhpcy5fc3RvcmVDaGlsZHJlbnMobXNnKTsgfSBlbHNlIHtcclxuXHJcbiAgICAgIGlmICghbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3Jlc3VtZScpIHx8IChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgncmVzdW1lJykgJiYgIW1zZy5ib2R5LnJlc3VtZSkpIHtcclxuXHJcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBhbiBpbnZpdGF0aW9uIG1lc3NhZ2VcclxuICAgICAgICBpZiAobXNnLmJvZHkuYXV0aG9yaXNlKSB7XHJcbiAgICAgICAgICB0aGlzLl9hdXRob3Jpc2UobXNnKTtcclxuICAgICAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIub25DcmVhdGUgLSBpbnZpdGUgb2JzZXJ2ZXJzXScsIG1zZyk7XHJcbiAgICAgICAgfSBlbHNlIHsgLy8gdGhpcyBpcyB0byBjcmVhdGUgYSBuZXcgZGF0YSBvYmplY3RcclxuICAgICAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIub25DcmVhdGUgLSBDcmVhdGUgTmV3IE9iamVjdF0nLCBtc2cpO1xyXG4gICAgICAgICAgdGhpcy5fbmV3Q3JlYXRlKG1zZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgLy8gSWYgZnJvbSB0aGUgaHlwZXJ0eSBzaWRlLCBjYWxsIHRoZSByZXN1bWVSZXBvcnRlciB3ZSB3aWxsIGhhdmUgcmVzdW1lID0gdHJ1ZSdcclxuICAgICAgICAvLyBzbyB3ZSB3aWxsIGNyZWF0ZSBhbiByZXN1bWVkIG9iamVjdCBhbmQgd2lsbCB0cnkgdG8gcmVzdW1lIHRoZSBvYmplY3QgcHJldmlvdXNseSBzYXZlZDtcclxuICAgICAgICB0aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2UuZ2V0UmVzb3VyY2VzQnlDcml0ZXJpYShtc2csIHRydWUpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG5cclxuICAgICAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIgLSBDcmVhdGUgUmVzdW1lZF0gLSBSZXNvdXJjZXNCeUNyaXRlcmlhIHwgTWVzc2FnZTogJywgbXNnLCAnIHJlc3VsdDogJywgcmVzdWx0KTtcclxuXHJcbiAgICAgICAgICBpZiAocmVzdWx0ICYmIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgbGV0IGxpc3RPZlJlcG9ydGVycyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKChvYmpVUkwpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgbGlzdE9mUmVwb3J0ZXJzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXN1bWVDcmVhdGUobXNnLCByZXN1bHRbb2JqVVJMXSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgUHJvbWlzZS5hbGwobGlzdE9mUmVwb3J0ZXJzKS50aGVuKChyZXN1bWVkUmVwb3J0ZXJzKSA9PiB7XHJcbiAgICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyIC0gQ3JlYXRlIFJlc3VtZWRdJywgcmVzdW1lZFJlcG9ydGVycyk7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFRPRE86IHNob3VkIHNlbmQgdGhlIGluZm9ybWF0aW9uIGlmIHNvbWUgb2JqZWN0IHdhcyBmYWlsaW5nO1xyXG4gICAgICAgICAgICAgIGxldCBzdWNjZXNzZnVsbHlSZXN1bWVkID0gT2JqZWN0LnZhbHVlcyhyZXN1bWVkUmVwb3J0ZXJzKS5maWx0ZXIoKHJlcG9ydGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0ZXIgIT09IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICBsb2cuaW5mbygnW1N5bmNoZXJNYW5hZ2VyLm9uQ3JlYXRlXSByZXR1cm5pbmcgcmVzdW1lZCBvYmplY3RzIDogJywgc3VjY2Vzc2Z1bGx5UmVzdW1lZCk7XHJcblxyXG4gICAgICAgICAgICAgIC8vRkxPVy1PVVQ6IG1lc3NhZ2UgcmVzcG9uc2UgdG8gU3luY2hlciAtPiBjcmVhdGUgcmVzdW1lXHJcbiAgICAgICAgICAgICAgdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IHRvLCB0bzogZnJvbSxcclxuICAgICAgICAgICAgICAgIGJvZHk6IHsgY29kZTogMjAwLCB2YWx1ZTogZGVlcENsb25lKHN1Y2Nlc3NmdWxseVJlc3VtZWQpIH1cclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgLypzdWNjZXNzZnVsbHlSZXN1bWVkLmZvckVhY2goKHJlcG9ydGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZXIuYmFja3VwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5zeW5jKHJlcG9ydGVyLnVybCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7Ki9cclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vZm9yd2FyZCB0byBoeXBlcnR5OlxyXG4gICAgICAgICAgICBsZXQgcmVwbHkgPSB7fTtcclxuICAgICAgICAgICAgcmVwbHkuaWQgPSBtc2cuaWQ7XHJcbiAgICAgICAgICAgIHJlcGx5LmZyb20gPSBtc2cudG87XHJcbiAgICAgICAgICAgIHJlcGx5LnRvID0gbXNnLmZyb207XHJcbiAgICAgICAgICAgIHJlcGx5LnR5cGUgPSAncmVzcG9uc2UnO1xyXG4gICAgICAgICAgICByZXBseS5ib2R5ID0ge1xyXG4gICAgICAgICAgICAgIGNvZGU6IDQwNCxcclxuICAgICAgICAgICAgICBkZXNjOiAnTm8gZGF0YSBvYmplY3RzIHJlcG9ydGVycyB0byBiZSByZXN1bWVkJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0aGlzLl9idXMucG9zdE1lc3NhZ2UocmVwbHkpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIF9zdG9yZUNoaWxkcmVucyhtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IHJlc291cmNlID0gbXNnLmJvZHkucmVzb3VyY2U7XHJcbiAgICBsZXQgYXR0cmlidXRlID0gbXNnLmJvZHkuYXR0cmlidXRlO1xyXG5cclxuICAgIGlmIChhdHRyaWJ1dGUgPT09ICdjaGlsZHJlbk9iamVjdHMnKSB7XHJcbiAgICAgIF90aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2Uuc2F2ZUNoaWxkcmVucyhmYWxzZSwgcmVzb3VyY2UsIHVuZGVmaW5lZCwgbXNnLmJvZHkudmFsdWUpO1xyXG4gICAgfSBlbHNlIHsgX3RoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5zYXZlQ2hpbGRyZW5zKHRydWUsIHJlc291cmNlLCBhdHRyaWJ1dGUsIG1zZy5ib2R5LnZhbHVlKTtcclxuICAgICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBfbmV3Q3JlYXRlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgb3duZXIgPSBtc2cuZnJvbTtcclxuICAgIGxldCBkb21haW4gPSBkaXZpZGVVUkwobXNnLmZyb20pLmRvbWFpbjtcclxuXHJcbiAgICAvLyBpZiByZXBvcnRlciBpcyBpbiBhIEludGVyd29ya2luZyBQcm90b3N0dWIgdGhlIHJ1bnRpbWUgZG9tYWluIGJhY2tlbmQgc2VydmljZXMgd2lsbCBiZSB1c2VkXHJcbiAgICBpZiAoX3RoaXMuX3JlZ2lzdHJ5LmlzSW50ZXJ3b3JraW5nUHJvdG9TdHViKG1zZy5mcm9tKSkge1xyXG4gICAgICBkb21haW4gPSBkaXZpZGVVUkwoX3RoaXMucnVudGltZVVSTCkuZG9tYWluO1xyXG4gICAgfVxyXG5cclxuLy8gICAgbGV0IGRvbWFpblJlZ2lzdHJhdGlvbiA9IG1zZy5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdkb21haW5fcmVnaXN0cmF0aW9uJykgPyBtc2cuYm9keS52YWx1ZS5kb21haW5fcmVnaXN0cmF0aW9uIDogdHJ1ZTtcclxuICAgIGxldCBkb21haW5Sb3V0aW5nID0gbXNnLmJvZHkudmFsdWUuaGFzT3duUHJvcGVydHkoJ2RvbWFpbl9yb3V0aW5nJykgPyBtc2cuYm9keS52YWx1ZS5kb21haW5fcm91dGluZyA6IHRydWU7XHJcblxyXG4gICAgLy8gUHJvY2VzcyBpbnZpdGF0aW9uIG1lc3NhZ2UgdG8gb2JzZXJ2ZXJzXHJcblxyXG4gICAgLyppZiAobXNnLmJvZHkuYXV0aG9yaXNlKSB7XHJcbiAgICAgIF90aGlzLl9hdXRob3Jpc2UobXNnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSovXHJcblxyXG4gICAgLy9nZXQgc2NoZW1hIGZyb20gY2F0YWxvZ3VlIGFuZCBwYXJzZSAtPiAoc2NoZW1lLCBjaGlsZHJlbilcclxuICAgIF90aGlzLl9jYXRhbG9nLmdldERhdGFTY2hlbWFEZXNjcmlwdG9yKG1zZy5ib2R5LnNjaGVtYSkudGhlbigoZGVzY3JpcHRvcikgPT4ge1xyXG5cclxuXHJcblxyXG5cclxuICAgICAgbGV0IHByb3BlcnRpZXMgPSBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzO1xyXG4gICAgICBsZXQgc2NoZW1lID0gcHJvcGVydGllcy5zY2hlbWUgPyBwcm9wZXJ0aWVzLnNjaGVtZSA6ICdyZXNvdXJjZSc7XHJcbiAgICAgIGxldCBjaGlsZHJlbnMgPSBwcm9wZXJ0aWVzLmNoaWxkcmVuID8gcHJvcGVydGllcy5jaGlsZHJlbiA6IFtdO1xyXG5cclxuICAgICAgLy8gRG8gc2NoZW1hIHZhbGlkYXRpb25cclxuICAgICAgLy8gVE9ETzogY2hlY2sgaWYgaXMgbmVlZCB0byBoYW5kbGUgd2l0aCB0aGUgcmVzdWx0IG9mIHZhbGlkYXRpb25cclxuICAgICAgLy8gICAgICBzY2hlbWFWYWxpZGF0aW9uKHNjaGVtZSwgZGVzY3JpcHRvciwgbXNnLmJvZHkudmFsdWUpO1xyXG5cclxuICAgICAgbGV0IG9iamVjdEluZm8gPSB7XHJcbiAgICAgICAgbmFtZTogbXNnLmJvZHkudmFsdWUubmFtZSxcclxuICAgICAgICBzY2hlbWE6IG1zZy5ib2R5LnZhbHVlLnNjaGVtYSxcclxuICAgICAgICByZXBvcnRlcjogbXNnLmJvZHkudmFsdWUucmVwb3J0ZXIsXHJcbiAgICAgICAgcmVzb3VyY2VzOiBtc2cuYm9keS52YWx1ZS5yZXNvdXJjZXNcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIHNob3VsZCByZXN1c2UgZGF0YSBvYmplY3QgdXJsIGlmIGl0IHBhc3NlZFxyXG4gICAgICBsZXQgcmV1c2VEYXRhT2JqZWN0ID0gbXNnLmJvZHkudmFsdWUucmVzb3VyY2U7XHJcbiAgICAgIGxldCBudW1PZkFkZHJlc3MgPSAxO1xyXG5cclxuICAgICAgLy9kZWJ1Z2dlcjtcclxuICAgICAgLy9yZXF1ZXN0IGFkZHJlc3MgYWxsb2NhdGlvbiBvZiBhIG5ldyBvYmplY3QgZnJvbSB0aGUgbXNnLW5vZGVcclxuICAgICAgLy9fdGhpcy5fYWxsb2NhdG9yLmNyZWF0ZShkb21haW4sIG51bU9mQWRkcmVzcywgb2JqZWN0SW5mbywgc2NoZW1lLCByZXVzZURhdGFPYmplY3QpLnRoZW4oKGFsbG9jYXRlZCkgPT4ge1xyXG4gICAgICBfdGhpcy5fYWxsb2NhdG9yLmNyZWF0ZShkb21haW4sIG51bU9mQWRkcmVzcywgb2JqZWN0SW5mbywgc2NoZW1lLCByZXVzZURhdGFPYmplY3QpLnRoZW4oKGFsbG9jYXRlZCkgPT4ge1xyXG5cclxuICAgICAgICBsZXQgb2JqZWN0UmVnaXN0cmF0aW9uID0gZGVlcENsb25lKG1zZy5ib2R5LnZhbHVlKTtcclxuICAgICAgICBvYmplY3RSZWdpc3RyYXRpb24udXJsID0gYWxsb2NhdGVkLmFkZHJlc3NbMF07XHJcbiAgICAgICAgb2JqZWN0UmVnaXN0cmF0aW9uLmF1dGhvcmlzZSA9IG1zZy5ib2R5LmF1dGhvcmlzZTtcclxuICAgICAgICBvYmplY3RSZWdpc3RyYXRpb24uY2hpbGRyZW5zID0gY2hpbGRyZW5zO1xyXG5cclxuICAgICAgICAvL29iamVjdFJlZ2lzdHJhdGlvbi5leHBpcmVzID0gMzA7Ly9UT0RPOiBnZXQgaXQgZnJvbSBkYXRhIG9iamVjdCBjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uIHdoZW4gcHJlc2VudFxyXG5cclxuICAgICAgICBkZWxldGUgb2JqZWN0UmVnaXN0cmF0aW9uLmRhdGE7XHJcblxyXG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fbmV3Q3JlYXRlXSBBTExPQ0FUT1IgQ1JFQVRFOicsIGFsbG9jYXRlZCk7XHJcblxyXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25VUkwgPSBvYmplY3RSZWdpc3RyYXRpb24udXJsICsgJy9zdWJzY3JpcHRpb24nO1xyXG5cclxuICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuX25ld0NyZWF0ZV0gU3Vic2NyaXB0aW9uIFVSTCcsIHN1YnNjcmlwdGlvblVSTCk7XHJcblxyXG4gICAgICAgIC8vVG8gcmVnaXN0ZXIgdGhlIGRhdGFPYmplY3QgaW4gdGhlIHJ1bnRpbWVSZWdpc3RyeVxyXG4gICAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIuX25ld0NyZWF0ZV0gUmVnaXN0ZXIgT2JqZWN0OiAnLCBvYmplY3RSZWdpc3RyYXRpb24pO1xyXG5cclxuICAgICAgICAvL190aGlzLl9yZWdpc3RyeS5yZWdpc3RlckRhdGFPYmplY3QobXNnLmJvZHkudmFsdWUubmFtZSwgbXNnLmJvZHkudmFsdWUuc2NoZW1hLCBvYmpVUkwsIG1zZy5ib2R5LnZhbHVlLnJlcG9ydGVyLCBtc2cuYm9keS52YWx1ZS5yZXNvdXJjZXMsIGFsbG9jYXRlZCwgbXNnLmJvZHkuYXV0aG9yaXNlKS50aGVuKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgX3RoaXMuX3JlZ2lzdHJ5LnJlZ2lzdGVyRGF0YU9iamVjdChvYmplY3RSZWdpc3RyYXRpb24pLnRoZW4oKHJlZ2lzdGVyZWRPYmplY3QpID0+IHtcclxuICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fbmV3Q3JlYXRlXSBEYXRhT2JqZWN0IHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkJywgcmVnaXN0ZXJlZE9iamVjdCk7XHJcblxyXG4gICAgICAgICAgLy9hbGwgT0sgLT4gY3JlYXRlIHJlcG9ydGVyIGFuZCByZWdpc3RlciBsaXN0ZW5lcnNcclxuICAgICAgICAgIGxldCByZXBvcnRlcjtcclxuXHJcblxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9yZXBvcnRlcnNbb2JqZWN0UmVnaXN0cmF0aW9uLnVybF0pIHtcclxuICAgICAgICAgICAgbGV0IG9mZmxpbmUgPSBvYmplY3RSZWdpc3RyYXRpb24ub2ZmbGluZSA/IG9iamVjdFJlZ2lzdHJhdGlvbi5vZmZsaW5lIDogZmFsc2U7XHJcbiAgICAgICAgICAgIHJlcG9ydGVyID0gbmV3IFJlcG9ydGVyT2JqZWN0KF90aGlzLCBvd25lciwgb2JqZWN0UmVnaXN0cmF0aW9uLnVybCwgY2hpbGRyZW5zLCBvZmZsaW5lKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlcG9ydGVyID0gdGhpcy5fcmVwb3J0ZXJzW29iamVjdFJlZ2lzdHJhdGlvbi51cmxdO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlciAtIG5ldyBDcmVhdGVdIC0gJywgbXNnKTtcclxuXHJcbiAgICAgICAgICAvLyBTdG9yZSBmb3IgZWFjaCByZXBvcnRlciBoeXBlcnR5IHRoZSBkYXRhT2JqZWN0XHJcbiAgICAgICAgICBsZXQgdXNlclVSTDtcclxuICAgICAgICAgIC8vIGxldCBpbnRlcndvcmtpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAobXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ2lkZW50aXR5JykgJiYgbXNnLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUgJiYgbXNnLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUudXNlclVSTCkge1xyXG4gICAgICAgICAgICB1c2VyVVJMID0gbXNnLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUudXNlclVSTDtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmICghdXNlclVSTC5pbmNsdWRlcygndXNlcjovLycpKSB7XHJcbiAgICAgICAgICAgIC8vICAgaW50ZXJ3b3JraW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdXNlclVSTCA9IF90aGlzLl9yZWdpc3RyeS5nZXRIeXBlcnR5T3duZXIobXNnLmZyb20pO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgKCF1c2VyVVJMKSB7XHJcbiAgICAgICAgICAgIC8vICAgaW50ZXJ3b3JraW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHNob3VsZCB3ZSB1c2UgdGhlIG1zZy5ib2R5LnZhbHVlIGluc3RlYWQ/XHJcblxyXG4gICAgICAgICAgbGV0IG1ldGFkYXRhID0gZGVlcENsb25lKG9iamVjdFJlZ2lzdHJhdGlvbik7XHJcbiAgICAgICAgICBtZXRhZGF0YS5zdWJzY3JpYmVyVXNlciA9IHVzZXJVUkw7XHJcbiAgICAgICAgICBtZXRhZGF0YS5pc1JlcG9ydGVyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAvLyBTdG9yZSB0aGUgZGF0YU9iamVjdCBpbmZvcm1hdGlvblxyXG5cclxuICAgICAgICAgIC8vaWYgKCFpbnRlcndvcmtpbmcpIHtcclxuXHJcbiAgICAgICAgICBpZiAobXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3N0b3JlJykgJiYgbXNnLmJvZHkuc3RvcmUpIHtcclxuICAgICAgICAgICAgcmVwb3J0ZXIuaXNUb1NhdmVEYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgbWV0YWRhdGEuaXNUb1NhdmVEYXRhID0gdHJ1ZTtcclxuICAgICAgICAgICAgaWYgKG1zZy5ib2R5LnZhbHVlLmRhdGEpIHtcclxuICAgICAgICAgICAgICBtZXRhZGF0YS5kYXRhID0gZGVlcENsb25lKG1zZy5ib2R5LnZhbHVlLmRhdGEpO1xyXG4vLyAgICAgICAgICAgICAgX3RoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5zYXZlRGF0YSh0cnVlLCBvYmplY3RSZWdpc3RyYXRpb24udXJsLCBudWxsLCBtc2cuYm9keS52YWx1ZS5kYXRhKTsgfVxyXG4vLyAgICAgICAgICAgIF90aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2UudXBkYXRlKHRydWUsIG9iamVjdFJlZ2lzdHJhdGlvbi51cmwsICdpc1RvU2F2ZURhdGEnLCB0cnVlKTtcclxuXHJcbi8vICAgICAgICAgICAgaWYgKG1zZy5ib2R5LnZhbHVlLmRhdGEpIHsgX3RoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5zYXZlRGF0YSh0cnVlLCBvYmplY3RSZWdpc3RyYXRpb24udXJsLCBudWxsLCBtc2cuYm9keS52YWx1ZS5kYXRhKTsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBfdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLnNldChtZXRhZGF0YSkudGhlbigoc3RvcmVPYmplY3QpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5vZmZsaW5lKSB7IC8vcmVnaXN0ZXIgbmV3IERhdGFPYmplY3QgYXQgT2ZmbGluZSBTdWJzY3JpcHRpb24gTWFuYWdlclxyXG4gICAgICAgICAgICAgIG1zZy5ib2R5LmlkZW50aXR5Lmd1aWQgPSBfdGhpcy5faWRlbnRpdHlNb2R1bGUuX2lkZW50aXRpZXMuZ3VpZDtcclxuICAgICAgICAgICAgICBsZXQgZm9yd2FyZCA9IHtcclxuICAgICAgICAgICAgICAgIGZyb206IG1zZy50byxcclxuICAgICAgICAgICAgICAgIHRvOiBtZXRhZGF0YS5vZmZsaW5lICsgJy9yZWdpc3RlcicsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZm9yd2FyZCcsXHJcbiAgICAgICAgICAgICAgICBib2R5OiBtc2dcclxuICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICBmb3J3YXJkLmJvZHkuYm9keS5yZXNvdXJjZSA9IG9iamVjdFJlZ2lzdHJhdGlvbi51cmw7XHJcblxyXG4gICAgICAgICAgICAgIGZvcndhcmQuYm9keS5ib2R5LnZhbHVlID0gbWV0YWRhdGE7XHJcblxyXG4gICAgICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5uZXdDcmVhdGVdIHJlZ2lzdGVyaW5nIG5ldyBvYmplY3QgYXQgb2ZmbGluZSBtYW5hZ2VyICcsIGZvcndhcmQpO1xyXG5cclxuICAgICAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKGZvcndhcmQpO1xyXG5cclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgbGV0IHJlc3BvbnNlTXNnID0ge1xyXG4gICAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBvd25lcixcclxuICAgICAgICAgICAgYm9keTogeyBjb2RlOiAyMDAsIHJlc291cmNlOiBvYmplY3RSZWdpc3RyYXRpb24udXJsLCBjaGlsZHJlblJlc291cmNlczogY2hpbGRyZW5zIH1cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgLy8gYWRkaW5nIGxpc3RlbmVycyB0byBmb3J3YXJkIHRvIHJlcG9ydGVyXHJcblxyXG4gICAgICAgICAgaWYgKGRvbWFpblJvdXRpbmcpIHtcclxuXHJcbiAgICAgICAgICAgIHJlcG9ydGVyLmZvcndhcmRTdWJzY3JpYmUoW29iamVjdFJlZ2lzdHJhdGlvbi51cmwsIHN1YnNjcmlwdGlvblVSTF0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHJlcG9ydGVyLmFkZENoaWxkcmVucygpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydGVyc1tvYmplY3RSZWdpc3RyYXRpb24udXJsXSA9IHJlcG9ydGVyO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAvL0ZMT1ctT1VUOiBtZXNzYWdlIHJlc3BvbnNlIHRvIFN5bmNoZXIgLT4gY3JlYXRlXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlTXNnKTtcclxuXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVwb3J0ZXIuYWRkQ2hpbGRyZW5zKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydGVyc1tvYmplY3RSZWdpc3RyYXRpb24udXJsXSA9IHJlcG9ydGVyO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgLy9GTE9XLU9VVDogbWVzc2FnZSByZXNwb25zZSB0byBTeW5jaGVyIC0+IGNyZWF0ZVxyXG4gICAgICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2VNc2cpO1xyXG5cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgKGVycm9yKT0+IHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XHJcbiAgICAgICAgICBsb2cuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgIC8vRkxPVy1PVVQ6IGVycm9yIG1lc3NhZ2UgcmVzcG9uc2UgdG8gU3luY2hlciAtPiBjcmVhdGVcclxuICAgICAgbGV0IHJlc3BvbnNlTXNnID0ge1xyXG4gICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG93bmVyLFxyXG4gICAgICAgIGJvZHk6IHsgY29kZTogNTAwLCBkZXNjOiByZWFzb24gfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXNwb25zZU1zZyk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBfcmVzdW1lQ3JlYXRlKG1zZywgc3RvcmVkT2JqZWN0KSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHJcbiAgICAgIGxldCBvd25lciA9IG1zZy5mcm9tO1xyXG4gICAgICBsZXQgc2NoZW1hID0gc3RvcmVkT2JqZWN0LnNjaGVtYTtcclxuICAgICAgbGV0IHJlc291cmNlID0gc3RvcmVkT2JqZWN0LnVybDtcclxuICAgICAgbGV0IGRvbWFpblJlZ2lzdHJhdGlvbiA9IHN0b3JlZE9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnZG9tYWluX3JlZ2lzdHJhdGlvbicpID8gc3RvcmVkT2JqZWN0LmRvbWFpbl9yZWdpc3RyYXRpb24gOiB0cnVlO1xyXG4gICAgICBsZXQgaW5pdGlhbERhdGEgPSBzdG9yZWRPYmplY3QuZGF0YTtcclxuXHJcbiAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlcl0gLSByZXN1bWUgY3JlYXRlJywgbXNnLCBzdG9yZWRPYmplY3QpO1xyXG5cclxuICAgICAgLy9nZXQgc2NoZW1hIGZyb20gY2F0YWxvZ3VlIGFuZCBwYXJzZSAtPiAoc2NoZW1lLCBjaGlsZHJlbilcclxuICAgICAgX3RoaXMuX2NhdGFsb2cuZ2V0RGF0YVNjaGVtYURlc2NyaXB0b3Ioc2NoZW1hKS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XHJcblxyXG4gICAgICAgIGxldCBwcm9wZXJ0aWVzID0gZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcztcclxuICAgICAgICBsZXQgc2NoZW1lID0gcHJvcGVydGllcy5zY2hlbWUgPyBwcm9wZXJ0aWVzLnNjaGVtZS5jb25zdGFudCA6ICdyZXNvdXJjZSc7XHJcbiAgICAgICAgbGV0IGNoaWxkcmVucyA9IHByb3BlcnRpZXMuY2hpbGRyZW4gPyBwcm9wZXJ0aWVzLmNoaWxkcmVuLmNvbnN0YW50IDogW107XHJcblxyXG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlcl0gLSBnZXREYXRhU2NoZW1hRGVzY3JpcHRvcjogJywgZGVzY3JpcHRvciwgY2hpbGRyZW5zKTtcclxuXHJcbiAgICAgICAgLy8gRG8gc2NoZW1hIHZhbGlkYXRpb25cclxuICAgICAgICAvLyBUT0RPOiBjaGVjayBpZiBpcyBuZWVkIHRvIGhhbmRsZSB3aXRoIHRoZSByZXN1bHQgb2YgdmFsaWRhdGlvblxyXG4gICAgICAgIC8vICAgICAgICBzY2hlbWFWYWxpZGF0aW9uKHNjaGVtZSwgZGVzY3JpcHRvciwgaW5pdGlhbERhdGEpO1xyXG5cclxuXHJcbiAgICAgICAgLy9hbGwgT0sgLT4gY3JlYXRlIHJlcG9ydGVyIGFuZCByZWdpc3RlciBsaXN0ZW5lcnNcclxuICAgICAgICBsZXQgcmVwb3J0ZXI7XHJcbiAgICAgICAgbGV0IG9mZmxpbmU7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fcmVwb3J0ZXJzW3Jlc291cmNlXSkge1xyXG4gICAgICAgICAgb2ZmbGluZSA9IHN0b3JlZE9iamVjdC5vZmZsaW5lID8gc3RvcmVkT2JqZWN0Lm9mZmxpbmUgOiBmYWxzZTtcclxuICAgICAgICAgIHJlcG9ydGVyID0gbmV3IFJlcG9ydGVyT2JqZWN0KF90aGlzLCBvd25lciwgcmVzb3VyY2UsIGNoaWxkcmVucywgb2ZmbGluZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlcG9ydGVyID0gdGhpcy5fcmVwb3J0ZXJzW3Jlc291cmNlXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlcG9ydGVyLmlzVG9TYXZlRGF0YSA9IHN0b3JlZE9iamVjdC5pc1RvU2F2ZURhdGE7XHJcblxyXG4gICAgICAgIGlmIChvZmZsaW5lKSB7IC8vdXBkYXRlIG5ldyBEYXRhT2JqZWN0IGF0IE9mZmxpbmUgU3Vic2NyaXB0aW9uIE1hbmFnZXJcclxuICAgICAgICAgIGxldCBtc2cgPSB7XHJcbiAgICAgICAgICAgIGZyb206IF90aGlzLl91cmwsXHJcbiAgICAgICAgICAgIHRvOiBvZmZsaW5lICsgJy9yZWdpc3RlcicsXHJcbiAgICAgICAgICAgIHR5cGU6ICd1cGRhdGUnLFxyXG4gICAgICAgICAgICBib2R5OiB7fVxyXG4gICAgICAgICAgfTtcclxuICBcclxuICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fcmVzdW1lQ3JlYXRlXSB1cGRhdGUgb2JqZWN0IGF0IG9mZmxpbmUgbWFuYWdlciAnLCBtc2cpO1xyXG4gIFxyXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2cpO1xyXG4gIFxyXG4gIFxyXG4gICAgICAgIH1cclxuICBcclxuXHJcbiAgICAgICAgaWYgKGRvbWFpblJlZ2lzdHJhdGlvbikge1xyXG4gICAgICAgICAgcmVwb3J0ZXIuZm9yd2FyZFN1YnNjcmliZShbc3RvcmVkT2JqZWN0LnVybF0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuX3Jlc3VtZUNyZWF0ZV0gcmVzdW1pbmdSZXBvcnRlclN1YnNjcmlwdGlvbiAnLCBzdG9yZWRPYmplY3QpO1xyXG4gICAgICAgICAgICBfdGhpcy5fcmVzdW1lUmVwb3J0ZXJTdWJzY3JpcHRpb25zKG1zZywgc3RvcmVkT2JqZWN0LCByZXBvcnRlciwgY2hpbGRyZW5zLCBkb21haW5SZWdpc3RyYXRpb24pLnRoZW4oKHJlc3VtZU9iamVjdCk9PntcclxuICAgICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuX3Jlc3VtZUNyZWF0ZV0gcmVzb2x2ZWQgcmVzdW1lZCBvYmplY3QgJywgcmVzdW1lT2JqZWN0KTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHJlc3VtZU9iamVjdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgcmVzb2x2ZShfdGhpcy5fcmVzdW1lUmVwb3J0ZXJTdWJzY3JpcHRpb25zKG1zZywgc3RvcmVkT2JqZWN0LCByZXBvcnRlciwgY2hpbGRyZW5zLCBkb21haW5SZWdpc3RyYXRpb24pKTtcclxuXHJcbiAgICAgICAgLy8gIHJlc29sdmUoKTtcclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIGxvZy5lcnJvcignW1N5bmNoZXJNYW5hZ2VyIC0gcmVzdW1lIGNyZWF0ZV0gLSBmYWlsIG9uIGdldERhdGFTY2hlbWFEZXNjcmlwdG9yOiAnLCByZWFzb24pO1xyXG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX3Jlc3VtZVJlcG9ydGVyU3Vic2NyaXB0aW9ucyhtc2csIHN0b3JlZE9iamVjdCwgcmVwb3J0ZXIsIGNoaWxkcmVucywgZG9tYWluUmVnaXN0cmF0aW9uKXtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgcmVzb3VyY2UgPSBzdG9yZWRPYmplY3QudXJsO1xyXG4gICAgbGV0IG9iamVjdFJlZ2lzdHJhdGlvbiA9IGRlZXBDbG9uZShtc2cuYm9keS52YWx1ZSk7XHJcbiAgICBvYmplY3RSZWdpc3RyYXRpb24udXJsID0gc3RvcmVkT2JqZWN0LnVybDtcclxuICAgIG9iamVjdFJlZ2lzdHJhdGlvbi5leHBpcmVzID0gc3RvcmVkT2JqZWN0LmV4cGlyZXM7XHJcbiAgICBvYmplY3RSZWdpc3RyYXRpb24uZG9tYWluX3JlZ2lzdHJhdGlvbiA9IGRvbWFpblJlZ2lzdHJhdGlvbjtcclxuXHJcbiAgICBkZWxldGUgb2JqZWN0UmVnaXN0cmF0aW9uLmRhdGE7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcblxyXG5cclxuICAgIHJlcG9ydGVyLmFkZENoaWxkcmVucygpLnRoZW4oKCkgPT4ge1xyXG5cclxuICAgICAgcmVwb3J0ZXIucmVzdW1lU3Vic2NyaXB0aW9ucyhzdG9yZWRPYmplY3Quc3Vic2NyaXB0aW9ucyk7XHJcblxyXG4gICAgICBfdGhpcy5fcmVwb3J0ZXJzW3Jlc291cmNlXSA9IHJlcG9ydGVyO1xyXG5cclxuICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyTWFuYWdlciAtIHJlc3VtZSBjcmVhdGVdIC0gcmVzb2x2ZWQgcmVzdW1lZDogJywgc3RvcmVkT2JqZWN0KTtcclxuXHJcbiAgICAgIHJldHVybiBfdGhpcy5fZGVjcnlwdENoaWxkcmVucyhzdG9yZWRPYmplY3QsIGNoaWxkcmVucyk7XHJcbiAgICB9KS50aGVuKChkZWNyeXB0ZWRPYmplY3QpID0+IHtcclxuXHJcbiAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIuX3Jlc3VtZVJlcG9ydGVyU3Vic2NyaXB0aW9uc10gUmVnaXN0ZXIgT2JqZWN0OiAnLCBvYmplY3RSZWdpc3RyYXRpb24pO1xyXG4gICAgICBfdGhpcy5fcmVnaXN0cnkucmVnaXN0ZXJEYXRhT2JqZWN0KG9iamVjdFJlZ2lzdHJhdGlvbikudGhlbigocmVnaXN0ZXJlZCkgPT4ge1xyXG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fcmVzdW1lUmVwb3J0ZXJTdWJzY3JpcHRpb25zXSBEYXRhT2JqZWN0IHJlZ2lzdHJhdGlvbiBzdWNjZXNzZnVsbHkgdXBkYXRlZCcsIHJlZ2lzdGVyZWQpO1xyXG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fcmVzdW1lUmVwb3J0ZXJTdWJzY3JpcHRpb25zXSByZXNvbHZpbmcgb2JqZWN0JywgZGVjcnlwdGVkT2JqZWN0KTtcclxuICAgICAgICByZXNvbHZlKGRlY3J5cHRlZE9iamVjdCk7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGxvZy5sb2coJ3Jlc3VsdCBvZiBwcmV2aW91cyBwcm9taXNlJyk7XHJcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgIGxvZy5lcnJvcignW1N5bmNoZXJNYW5hZ2VyIC0gcmVzdW1lIGNyZWF0ZV0gLSBmYWlsIG9uIGFkZENoaWxkcmVuczogJywgcmVhc29uKTtcclxuICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9KTtcclxuICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvLyB0byBkZWNyeXB0IERhdGFDaGlsZE9iamVjdHMgaWYgdGhleSBhcmUgZW5jcnlwdGVkXHJcblxyXG4gIF9kZWNyeXB0Q2hpbGRyZW5zKGVuY3J5cHRlZE9iamVjdCwgY2hpbGRyZW5zKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBzdG9yZWRPYmplY3QgPSBkZWVwQ2xvbmUoZW5jcnlwdGVkT2JqZWN0KTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG5cclxuICAgICAgaWYgKCFjaGlsZHJlbnMpIHsgcmVzb2x2ZShzdG9yZWRPYmplY3QpOyB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBjaGlsZHJlbnNPYmogPSBPYmplY3Qua2V5cyhzdG9yZWRPYmplY3QuY2hpbGRyZW5PYmplY3RzKTtcclxuXHJcbiAgICAgICAgaWYgKGNoaWxkcmVuc09iai5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIHJlc29sdmUoc3RvcmVkT2JqZWN0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNoaWxkcmVucy5mb3JFYWNoKChjaGlsZHJlbikgPT4ge1xyXG5cclxuLy8gICAgICAgICAgbGV0IGNoaWxkT2JqZWN0cyA9IHN0b3JlZE9iamVjdC5jaGlsZHJlbk9iamVjdHNbY2hpbGRyZW5dO1xyXG4gICAgICAgICAgbGV0IGNoaWxkT2JqZWN0cyA9IHN0b3JlZE9iamVjdC5jaGlsZHJlbk9iamVjdHM7XHJcblxyXG4gICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLl9kZWNyeXB0Q2hpbGRyZW5zXSBkYXRhT2JqZWN0Q2hpbGRzIHRvIGRlY3J5cHQgJywgY2hpbGRPYmplY3RzKTtcclxuXHJcbiAgICAgICAgICBsZXQgbGlzdE9mRGVjcnlwdGVkT2JqZWN0cyA9IFtdO1xyXG5cclxuICAgICAgICAgIE9iamVjdC5rZXlzKGNoaWxkT2JqZWN0cykuZm9yRWFjaCgoY2hpbGRJZCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBjaGlsZE9iamVjdHNbY2hpbGRJZF07XHJcbiAgICAgICAgICAgIGxldCBvd25lciA9IGNoaWxkSWQuc3BsaXQoJyMnKVswXTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQudmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcblxyXG4gICAgICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fZGVjcnlwdENoaWxkcmVuc10gY3JlYXRlZEJ5ICcsIG93bmVyLCAnIG9iamVjdDogJywgY2hpbGQudmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICBsZXQgZGVjcnlwdGVkID0gY3J5cHRvTWFuYWdlci5kZWZhdWx0LmRlY3J5cHREYXRhT2JqZWN0KEpTT04ucGFyc2UoY2hpbGQudmFsdWUpLCBzdG9yZWRPYmplY3QudXJsKTtcclxuXHJcbiAgICAgICAgICAgICAgbGlzdE9mRGVjcnlwdGVkT2JqZWN0cy5wdXNoKGRlY3J5cHRlZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIFByb21pc2UuYWxsKGxpc3RPZkRlY3J5cHRlZE9iamVjdHMpLnRoZW4oKGRlY3J5cHRlZE9iamVjdHMpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fZGVjcnlwdENoaWxkcmVuc10gcmV0dXJuaW5nIGRlY3J5cHRlZCAnLCBkZWNyeXB0ZWRPYmplY3RzKTtcclxuXHJcbiAgICAgICAgICAgIGRlY3J5cHRlZE9iamVjdHMuZm9yRWFjaCgoZGVjcnlwdGVkT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRJZCA9IGRlY3J5cHRlZE9iamVjdC52YWx1ZS51cmw7XHJcbiAgICAgICAgICAgICAgc3RvcmVkT2JqZWN0LmNoaWxkcmVuT2JqZWN0c1tjaGlsZElkXS52YWx1ZSA9IGRlY3J5cHRlZE9iamVjdC52YWx1ZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuX2RlY3J5cHRDaGlsZHJlbnNdIHN0b3JlZE9iamVjdCAnLCBzdG9yZWRPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgcmVzb2x2ZShzdG9yZWRPYmplY3QpO1xyXG5cclxuICAgICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgICAgbG9nLndhcm4oJ1tTeW5jaGVyTWFuYWdlci5fZGVjcnlwdENoaWxkcmVuc10gZmFpbGVkIDogJywgcmVhc29uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFByb2Nlc3MgaW52aXRhdGlvbnMgdG8gb2JzZXJ2ZXJzXHJcblxyXG4gIF9hdXRob3Jpc2UobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmICghbXNnLmJvZHkucmVzb3VyY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbU3luY2hlck1hbmFnZXIuX2F1dGhvcmlzZV0gaW52aXRhdGlvbiByZXF1ZXN0IHdpdGhvdXQgZGF0YSBvYmplY3QgdXJsOicsIG1zZyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG9ialN1YnNjcmlwdG9yVVJMID0gbXNnLmJvZHkucmVzb3VyY2UgKyAnL3N1YnNjcmlwdGlvbic7XHJcbiAgICBsZXQgcDJwID0gbXNnLmJvZHkucDJwID8gbXNnLmJvZHkucDJwIDogZmFsc2U7XHJcblxyXG4gICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyIC0gIGF1dGhvcmlzZV0gLSAnLCBtc2cpO1xyXG5cclxuICAgIGlmIChtc2cuYm9keS5hdXRob3Jpc2UpIHtcclxuICAgICAgbXNnLmJvZHkuYXV0aG9yaXNlLmZvckVhY2goKGh5cGVydHlVUkwpID0+IHtcclxuICAgICAgICAvL0ZMT1ctT1VUOiBzZW5kIGludml0ZXMgdG8gbGlzdCBvZiByZW1vdGUgU3luY2hlciAtPiBfb25SZW1vdGVDcmVhdGUgLT4gb25Ob3RpZmljYXRpb25cclxuXHJcbiAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICB0eXBlOiAnY3JlYXRlJywgZnJvbTogb2JqU3Vic2NyaXB0b3JVUkwsIHRvOiBoeXBlcnR5VVJMLFxyXG4gICAgICAgICAgYm9keTogeyBwMnA6IHAycCwgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LCBzb3VyY2U6IG1zZy5mcm9tLCB2YWx1ZTogbXNnLmJvZHkudmFsdWUsIHNjaGVtYTogbXNnLmJvZHkuc2NoZW1hIH1cclxuICAgICAgICB9LCAocmVwbHkpID0+IHsgLy8gbGV0cyBmb3J3YXJkIHRoZSBpbnZpdGF0aW9uIHJlc3BvbnNlXHJcbiAgICAgICAgICBsZXQgcmVzcG9uc2UgPSB7XHJcbiAgICAgICAgICAgIGZyb206IG1zZy50byxcclxuICAgICAgICAgICAgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgICBpZDogbXNnLmlkLFxyXG4gICAgICAgICAgICB0eXBlOiByZXBseS50eXBlLFxyXG4gICAgICAgICAgICBib2R5OiByZXBseS5ib2R5XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIERhdGFPYmplY3RSZXBvcnRlciAtPiBkZWxldGVcclxuICBfb25EZWxldGUobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBvYmpVUkwgPSBtc2cuYm9keS5yZXNvdXJjZTtcclxuXHJcbiAgICBsZXQgb2JqZWN0ID0gX3RoaXMuX3JlcG9ydGVyc1tvYmpVUkxdO1xyXG4gICAgaWYgKG9iamVjdCkge1xyXG4gICAgICAvL1RPRE86IGlzIHRoZXJlIGFueSBwb2xpY3kgdmVyaWZpY2F0aW9uIGJlZm9yZSBkZWxldGU/XHJcblxyXG4gICAgICBpZiAob2JqZWN0Lm9mZmxpbmUpIHsgLy9yZWdpc3RlciBuZXcgRGF0YU9iamVjdCBhdCBPZmZsaW5lIFN1YnNjcmlwdGlvbiBNYW5hZ2VyXHJcbiAgICAgICAgbGV0IGZvcndhcmQgPSB7XHJcbiAgICAgICAgICBmcm9tOiBtc2cudG8sXHJcbiAgICAgICAgICB0bzogb2JqZWN0Lm9mZmxpbmUgKyAnL3JlZ2lzdGVyJyxcclxuICAgICAgICAgIHR5cGU6ICdmb3J3YXJkJyxcclxuICAgICAgICAgIGJvZHk6IG1zZ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fb25EZWxldGVdIHVucmVnaXN0ZXJpbmcgb2JqZWN0IGZyb20gb2ZmbGluZSBtYW5hZ2VyICcsIGZvcndhcmQpO1xyXG5cclxuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKGZvcndhcmQpO1xyXG5cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG9iamVjdC5kZWxldGUoKTtcclxuXHJcbiAgICAgIHRoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5kZWxldGVSZXNvdXJjZShvYmpVUkwpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG5cclxuXHJcbiAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyIC0gb25EZWxldGVdIC0gZGVsZXRlUmVzb3VyY2U6ICcsIHJlc3VsdCk7XHJcblxyXG4gICAgICAgIF90aGlzLl9yZWdpc3RyeS51bnJlZ2lzdGVyRGF0YU9iamVjdChvYmpVUkwpO1xyXG5cclxuXHJcbiAgICAgICAgLy9UT0RPOiB1bnJlZ2lzdGVyIG9iamVjdD9cclxuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgYm9keTogeyBjb2RlOiAyMDAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIGxvY2FsIFN5bmNoZXIgLT4gc3Vic2NyaWJlXHJcbiAgX29uTG9jYWxTdWJzY3JpYmUobXNnKSB7XHJcbiAgICAvL2RlYnVnZ2VyO1xyXG5cclxuICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgncmVzdW1lJykgJiYgKG1zZy5ib2R5LnJlc3VtZSApKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5nZXRSZXNvdXJjZXNCeUNyaXRlcmlhKG1zZywgZmFsc2UpLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG5cclxuICAgICAgICBsb2cuaW5mbygnW1N5bmNoZXJNYW5hZ2VyLm9uTG9jYWxTdWJzY3JpYmUuIHJlc3VtZV06ICcsIG1zZywgJyByZXN1bHQ6ICcsIHJlc3VsdCk7XHJcbiAgXHJcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDApIHtcclxuICBcclxuICAgICAgICAgIGxldCBsaXN0T2ZPYnNlcnZlcnMgPSBbXTtcclxuICBcclxuICAgICAgICAgIC8vIFRPRE86IHNob3VsZCByZXVzZSB0aGUgc3RvcmVkIGluZm9ybWF0aW9uXHJcbiAgICAgICAgICBPYmplY3Qua2V5cyhyZXN1bHQpLmZvckVhY2goKG9ialVSTCkgPT4ge1xyXG4gICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIgLSByZXN1bWUgU3Vic2NyaWJlXSAtIHJldXNlIGN1cnJlbnQgb2JqZWN0IHVybDogJywgcmVzdWx0W29ialVSTF0pO1xyXG4gICAgICAgICAgICBsaXN0T2ZPYnNlcnZlcnMucHVzaCh0aGlzLl9yZXN1bWVTdWJzY3JpcHRpb24obXNnLCByZXN1bHRbb2JqVVJMXSkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgXHJcbiAgICAgICAgICBQcm9taXNlLmFsbChsaXN0T2ZPYnNlcnZlcnMpLnRoZW4oKHJlc3VtZWRPYnNlcnZlcnMpID0+IHtcclxuICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyIC0gT2JzZXJ2ZXJzIFJlc3VtZWRdJywgcmVzdW1lZE9ic2VydmVycyk7XHJcbiAgXHJcbiAgICAgICAgICAgIC8vIFRPRE86IHNob3VkIHNlbmQgdGhlIGluZm9ybWF0aW9uIGlmIHNvbWUgb2JqZWN0IGlzIGZhaWxpbmc7XHJcbiAgICAgICAgICAgIGxldCBzdWNjZXNzZnVsbHlSZXN1bWVkID0gT2JqZWN0LnZhbHVlcyhyZXN1bWVkT2JzZXJ2ZXJzKS5maWx0ZXIoKG9ic2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyICE9PSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgXHJcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IHtcclxuICAgICAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcclxuICAgICAgICAgICAgICBib2R5OiB7IGNvZGU6IDIwMCwgdmFsdWU6IHN1Y2Nlc3NmdWxseVJlc3VtZWQgfVxyXG4gICAgICAgICAgICB9O1xyXG4gIFxyXG4gICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIgLSBPYnNlcnZlcnMgUmVzdW1lZF0gcmVwbHlpbmcgJywgcmVzcG9uc2UpO1xyXG4gIFxyXG4gICAgICAgICAgICAvL0ZMT1ctT1VUOiBtZXNzYWdlIHJlc3BvbnNlIHRvIFN5bmNoZXIgLT4gY3JlYXRlXHJcbiAgICAgICAgICAgIHRoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXNwb25zZSk7XHJcbiAgXHJcbiAgICAgICAgICB9KTtcclxuICBcclxuICAgICAgIFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL2ZvcndhcmQgdG8gaHlwZXJ0eTpcclxuICAgICAgICAgIGxldCByZXBseSA9IHt9O1xyXG4gICAgICAgICAgcmVwbHkuaWQgPSBtc2cuaWQ7XHJcbiAgICAgICAgICByZXBseS5mcm9tID0gbXNnLnRvO1xyXG4gICAgICAgICAgcmVwbHkudG8gPSBtc2cuZnJvbTtcclxuICAgICAgICAgIHJlcGx5LnR5cGUgPSAncmVzcG9uc2UnO1xyXG4gICAgICAgICAgcmVwbHkuYm9keSA9IHtcclxuICAgICAgICAgICAgY29kZTogNDA0LFxyXG4gICAgICAgICAgICBkZXNjOiAnTm8gZGF0YSBvYmplY3RzIG9ic2VydmVycyB0byBiZSByZXN1bWVkJ1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXBseSk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5vbkxvY2FsU3Vic2NyaWJlIC0gbmV3IFN1YnNjcmliZV0gLSAnLCBtc2cuYm9keS5zY2hlbWEsIG1zZy5ib2R5LnJlc291cmNlKTtcclxuICAgICAgdGhpcy5fbmV3U3Vic2NyaXB0aW9uKG1zZyk7XHJcbiAgICB9XHJcbiBcclxuXHJcbiAgfVxyXG5cclxuICBfbmV3U3Vic2NyaXB0aW9uKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgb2JqVVJMID0gbXNnLmJvZHkucmVzb3VyY2U7XHJcblxyXG4gICAgbGV0IGh5cGVydHlVUkwgPSBtc2cuZnJvbTtcclxuICAgIGxldCBkb21haW4gPSBkaXZpZGVVUkwob2JqVVJMKS5kb21haW47XHJcbiAgICBsZXQgZG9tYWluU3Vic2NyaXB0aW9uID0gbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ2RvbWFpbl9zdWJzY3JpcHRpb24nKSA/IG1zZy5ib2R5LmRvbWFpbl9zdWJzY3JpcHRpb24gOiB0cnVlO1xyXG5cclxuICAgIGxldCBjaGlsZEJhc2VVUkwgPSBvYmpVUkwgKyAnL2NoaWxkcmVuLyc7XHJcblxyXG4gICAgLy9nZXQgc2NoZW1hIGZyb20gY2F0YWxvZ3VlIGFuZCBwYXJzZSAtPiAoY2hpbGRyZW4pXHJcbiAgICBfdGhpcy5fY2F0YWxvZy5nZXREYXRhU2NoZW1hRGVzY3JpcHRvcihtc2cuYm9keS5zY2hlbWEpLnRoZW4oKGRlc2NyaXB0b3IpID0+IHtcclxuICAgICAgbGV0IHByb3BlcnRpZXMgPSBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzO1xyXG4gICAgICBsZXQgY2hpbGRyZW5zID0gcHJvcGVydGllcy5jaGlsZHJlbiA/IHByb3BlcnRpZXMuY2hpbGRyZW4uY29uc3RhbnQgOiBbXTtcclxuXHJcbiAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XHJcbiAgICAgIHN1YnNjcmlwdGlvbnMucHVzaChvYmpVUkwgKyAnL2NoYW5nZXMnKTtcclxuXHJcbi8vICAgICAgY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkKSA9PiBzdWJzY3JpcHRpb25zLnB1c2goY2hpbGRCYXNlVVJMICsgY2hpbGQpKTtcclxuICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGNoaWxkQmFzZVVSTCk7XHJcblxyXG4gICAgICAvL2NoaWxkcmVuIGFkZHJlc3Nlc1xyXG5cclxuICAgICAgaWYgKGRvbWFpblN1YnNjcmlwdGlvbikgeyAgLy9GTE9XLU9VVDogc3Vic2NyaWJlIG1lc3NhZ2UgdG8gdGhlIG1zZy1ub2RlLCByZWdpc3RlcmluZyBsaXN0ZW5lcnMgb24gdGhlIGJyb2tlclxyXG4gICAgICBsZXQgbm9kZVN1YnNjcmliZU1zZyA9IHtcclxuICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJywgZnJvbTogX3RoaXMuX3VybCwgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgZG9tYWluICsgJy9zbScsXHJcbiAgICAgICAgYm9keTogeyBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHksIHJlc291cmNlczogc3Vic2NyaXB0aW9ucywgc291cmNlOiBoeXBlcnR5VVJMIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vc3Vic2NyaWJlIGluIG1zZy1ub2RlXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uobm9kZVN1YnNjcmliZU1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZygnbm9kZS1zdWJzY3JpYmUtcmVzcG9uc2Uob2JzZXJ2ZXIpOiAnLCByZXBseSk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1JFVVNFVEVTVCBTeW5jaGVyTWFuYWdlciAtIG5vZGUtc3Vic2NyaWJlLXJlc3BvbnNlKG9ic2VydmVyKTogJywgcmVwbHkpO1xyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgX3RoaXMuX25ld1JlcG9ydGVyU3Vic2NyaWJlKG1zZywgaHlwZXJ0eVVSTCwgb2JqVVJMLCBjaGlsZHJlbnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvL2xpc3RlbmVyIHJlamVjdGVkXHJcbiAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogaHlwZXJ0eVVSTCxcclxuICAgICAgICAgICAgYm9keTogcmVwbHkuYm9keVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSBfdGhpcy5fbmV3UmVwb3J0ZXJTdWJzY3JpYmUobXNnLCBoeXBlcnR5VVJMLCBvYmpVUkwsIGNoaWxkcmVucyk7XHJcblxyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIF9uZXdSZXBvcnRlclN1YnNjcmliZShtc2csIGh5cGVydHlVUkwsIG9ialVSTCwgY2hpbGRyZW5zKXtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBvYmpVUkxTdWJzY3JpcHRpb24gPSBvYmpVUkwgKyAnL3N1YnNjcmlwdGlvbic7XHJcblxyXG4gICAgICAgICAgLy9GTE9XLU9VVDogcmVwbHkgd2l0aCBwcm92aXNpb25hbCByZXNwb25zZVxyXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IGh5cGVydHlVUkwsXHJcbiAgICAgICAgICAgIGJvZHk6IHsgY29kZTogMTAwLCBjaGlsZHJlblJlc291cmNlczogY2hpbGRyZW5zLCBzY2hlbWE6IG1zZy5ib2R5LnNjaGVtYSwgcmVzb3VyY2U6IG1zZy5ib2R5LnJlc291cmNlIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vRkxPVy1PVVQ6IHN1YnNjcmliZSBtZXNzYWdlIHRvIHJlbW90ZSBSZXBvcnRlck9iamVjdCAtPiBfb25SZW1vdGVTdWJzY3JpYmVcclxuICAgICAgICAgIGxldCBvYmpTdWJzY3JpYmVNc2cgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdzdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fdXJsLCB0bzogb2JqVVJMU3Vic2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBib2R5OiB7IGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSwgc3Vic2NyaWJlcjogaHlwZXJ0eVVSTCB9XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIC8vVE9ETzogRm9yIEZ1cnRoZXIgU3R1ZHlcclxuICAgICAgICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykpIG9ialN1YnNjcmliZU1zZy5ib2R5Lm11dHVhbCA9IG1zZy5ib2R5Lm11dHVhbDtcclxuICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fbmV3U3Vic2NyaXB0aW9uXScsIG9ialN1YnNjcmliZU1zZywgbXNnKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdSRVVTRVRFU1QgU3luY2hlck1hbmFnZXIgLSBbU3luY2hlck1hbmFnZXIuX25ld1N1YnNjcmlwdGlvbl0nLCBvYmpTdWJzY3JpYmVNc2csIG1zZyk7XHJcbiAgICAgICAgICAvL3N1YnNjcmliZSB0byByZXBvcnRlciBTTVxyXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShvYmpTdWJzY3JpYmVNc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgICBsb2cubG9nKCdyZXBvcnRlci1zdWJzY3JpYmUtcmVzcG9uc2UtbmV3OiAnLCByZXBseSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSRVVTRVRFU1QgU3luY2hlck1hbmFnZXIgLSByZXBvcnRlci1zdWJzY3JpYmUtcmVzcG9uc2UtbmV3OiAnLCByZXBseSk7XHJcbiAgICAgICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkgX3RoaXMuX3Byb2Nlc3NTdWNjZXNzZnVsbFN1YnNjcmlwdGlvbihyZXBseSwgaHlwZXJ0eVVSTCwgb2JqVVJMLCBjaGlsZHJlbnMsIG1zZyk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1zZy5ib2R5Lm9mZmxpbmUpIF90aGlzLl9wcm9jZXNzT2ZmbGluZVN1YnNjcmlwdGlvbihvYmpTdWJzY3JpYmVNc2csIG1zZy5ib2R5Lm9mZmxpbmUsIGh5cGVydHlVUkwsIG9ialVSTCwgY2hpbGRyZW5zLCBtc2cpO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAvL1RPRE86IHNlbmQgcmVzcG9uc2UgYmFjayB0byBIeXBlcnR5IHdpdGggZXJyb3IgbWVzc2FnZSByZWNlaXZlZCBpbiB0aGUgcmVwbHlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBfcHJvY2Vzc09mZmxpbmVTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCByZWRpcmVjdFRvLCBoeXBlcnR5VVJMLCBvYmpVUkwsIGNoaWxkcmVucywgbXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBmb3J3YXJkID0ge1xyXG4gICAgICBmcm9tOiBzdWJzY3JpcHRpb24uZnJvbSxcclxuICAgICAgdHlwZTogJ2ZvcndhcmQnLFxyXG4gICAgICB0bzogcmVkaXJlY3RUbyxcclxuICAgICAgYm9keTogc3Vic2NyaXB0aW9uXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbU3luY2hlck1hbmFnZXIuX3Byb2Nlc3NPZmZsaW5lU3Vic2NyaXB0aW9uXSBmb3J3YWRpbmcgJywgZm9yd2FyZCk7XHJcblxyXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShmb3J3YXJkLCAocmVwbHkpID0+IHtcclxuICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLl9wcm9jZXNzT2ZmbGluZVN1YnNjcmlwdGlvbl0gcmVwbHkgJywgcmVwbHkpO1xyXG4gICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIF90aGlzLl9wcm9jZXNzU3VjY2Vzc2Z1bGxTdWJzY3JpcHRpb24ocmVwbHksIGh5cGVydHlVUkwsIG9ialVSTCwgY2hpbGRyZW5zLCBtc2cpO1xyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvL1RPRE86IHNlbmQgcmVzcG9uc2UgYmFjayB0byBIeXBlcnR5IHdpdGggZXJyb3IgbWVzc2FnZSByZWNlaXZlZCBpbiB0aGUgcmVwbHlcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIF9wcm9jZXNzU3VjY2Vzc2Z1bGxTdWJzY3JpcHRpb24ocmVwbHksIGh5cGVydHlVUkwsIG9ialVSTCwgY2hpbGRyZW5zLCBtc2cpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fbmV3U3Vic2NyaXB0aW9uXSAtIG9ic2VydmVyczogJywgX3RoaXMuX29ic2VydmVycywgb2JqVVJMLCBfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF0pO1xyXG4gICAgY29uc29sZS5sb2coJ1JFVVNFVEVTVCBTeW5jaGVyTWFuYWdlciAtIDIwMCBjb2RlW1N5bmNoZXJNYW5hZ2VyLl9uZXdTdWJzY3JpcHRpb25dIC0gb2JzZXJ2ZXJzOiAnLCBfdGhpcy5fb2JzZXJ2ZXJzLCBvYmpVUkwsIF90aGlzLl9vYnNlcnZlcnNbb2JqVVJMXSk7XHJcbiAgICBsZXQgb2JzZXJ2ZXIgPSBfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF07XHJcbiAgICBpZiAoIW9ic2VydmVyKSB7XHJcbiAgICAgIG9ic2VydmVyID0gbmV3IE9ic2VydmVyT2JqZWN0KF90aGlzLCBvYmpVUkwsIGNoaWxkcmVucyk7XHJcbiAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fbmV3U3Vic2NyaXB0aW9uXSAtIG9ic2VydmVyczogY3JlYXRlIG5ldyBPYnNlcnZlck9iamVjdDogJywgb2JzZXJ2ZXIpO1xyXG4gICAgICBfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF0gPSBvYnNlcnZlcjtcclxuXHJcbiAgICAgIC8vIHJlZ2lzdGVyIG5ldyBoeXBlcnR5IHN1YnNjcmlwdGlvblxyXG4gICAgICBvYnNlcnZlci5hZGRTdWJzY3JpcHRpb24oaHlwZXJ0eVVSTCk7XHJcblxyXG4gICAgICAvLyBhZGQgY2hpbGRyZW5zIGFuZCBsaXN0ZW5lcnMgdG8gc2F2ZSBkYXRhIGlmIG5lY2Vzc2FyeVxyXG4gICAgICBvYnNlcnZlci5hZGRDaGlsZHJlbnMoKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaW50ZXJ3b3JraW5nID0gZmFsc2U7XHJcblxyXG4gICAgLy9kZWJ1Z2dlcjtcclxuXHJcbiAgICAvLyBTdG9yZSBmb3IgZWFjaCByZXBvcnRlciBoeXBlcnR5IHRoZSBkYXRhT2JqZWN0XHJcbiAgICBsZXQgdXNlclVSTDtcclxuICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnaWRlbnRpdHknKSAmJiBtc2cuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZSAmJiBtc2cuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZS51c2VyVVJMKSB7XHJcbiAgICAgIHVzZXJVUkwgPSBtc2cuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZS51c2VyVVJMO1xyXG4gICAgICBpZiAoIXVzZXJVUkwuaW5jbHVkZXMoJ3VzZXI6Ly8nKSkge1xyXG4gICAgICAgIGludGVyd29ya2luZyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVzZXJVUkwgPSBfdGhpcy5fcmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKG1zZy5mcm9tKTtcclxuICAgICAgaWYgKCF1c2VyVVJMKSBpbnRlcndvcmtpbmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBtZXRhZGF0YSA9IGRlZXBDbG9uZShyZXBseS5ib2R5LnZhbHVlKTtcclxuXHJcbiAgICAvLyBsZXQgY2hpbGRyZW5PYmplY3RzID0gbWV0YWRhdGEuY2hpbGRyZW5PYmplY3RzIHx8IHt9O1xyXG5cclxuICAgIGRlbGV0ZSBtZXRhZGF0YS5kYXRhO1xyXG4gICAgZGVsZXRlIG1ldGFkYXRhLmNoaWxkcmVuT2JqZWN0cztcclxuXHJcbiAgICBtZXRhZGF0YS5jaGlsZHJlbnMgPSBjaGlsZHJlbnM7XHJcbiAgICBtZXRhZGF0YS5zdWJzY3JpYmVyVXNlciA9IHVzZXJVUkw7XHJcbiAgICBtZXRhZGF0YS5pc1JlcG9ydGVyID0gZmFsc2U7XHJcbiAgICBtZXRhZGF0YS5zdWJzY3JpYmVySHlwZXJ0eSA9IGh5cGVydHlVUkw7XHJcblxyXG4gICAgaWYgKCFpbnRlcndvcmtpbmcpIHtcclxuICAgICAgLy9fdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLnNldChvYmpVUkwsIGZhbHNlLCBtc2cuYm9keS5zY2hlbWEsICdvbicsIHJlcGx5LmJvZHkub3duZXIsIGh5cGVydHlVUkwsIGNoaWxkcmVucywgdXNlclVSTCk7XHJcbiAgICAgIF90aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2Uuc2V0KG1ldGFkYXRhKTtcclxuICAgICAgaWYgKChtZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eSgnc3RvcmUnKSAmJiBtZXRhZGF0YS5zdG9yZSkgfHwgKG1ldGFkYXRhLmhhc093blByb3BlcnR5KCdpc1RvU2F2ZURhdGEnKSAmJiBtZXRhZGF0YS5pc1RvU2F2ZURhdGEpKSB7XHJcbiAgICAgICAgb2JzZXJ2ZXIuaXNUb1NhdmVEYXRhID0gdHJ1ZTtcclxuICAgICAgICBfdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLnVwZGF0ZShmYWxzZSwgb2JqVVJMLCAnaXNUb1NhdmVEYXRhJywgdHJ1ZSk7XHJcbiAgICAgICAgX3RoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5zYXZlRGF0YShmYWxzZSwgb2JqVVJMLCBudWxsLCByZXBseS5ib2R5LnZhbHVlLmRhdGEpO1xyXG4vLyAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbnMpIF90aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2UuaW5pdGlhbE9ic2VydmVyU3luYyhvYmpVUkwsIHJlcGx5LmJvZHkudmFsdWUuZGF0YS5iYWNrdXBSZXZpc2lvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL2ZvcndhcmQgdG8gaHlwZXJ0eTpcclxuICAgIHJlcGx5LmlkID0gbXNnLmlkO1xyXG4gICAgcmVwbHkuZnJvbSA9IF90aGlzLl91cmw7XHJcbiAgICByZXBseS50byA9IGh5cGVydHlVUkw7XHJcbiAgICByZXBseS5ib2R5LnNjaGVtYSA9IG1zZy5ib2R5LnNjaGVtYTtcclxuICAgIHJlcGx5LmJvZHkucmVzb3VyY2UgPSBtc2cuYm9keS5yZXNvdXJjZTtcclxuXHJcbiAgICAvL1RPRE86IEZvciBGdXJ0aGVyIFN0dWR5XHJcbiAgICBpZiAobXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ211dHVhbCcpKSByZXBseS5ib2R5Lm11dHVhbCA9IG1zZy5ib2R5Lm11dHVhbDtcclxuICAgIGxvZy5sb2coJ1tzdWJzY3JpYmVdIC0gbmV3IHN1YnNjcmlwdGlvbjogJywgbXNnLCByZXBseSwgb2JzZXJ2ZXIpO1xyXG5cclxuICAgIHRoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXBseSk7XHJcblxyXG4gIH1cclxuXHJcbiAgX3Jlc3VtZVN1YnNjcmlwdGlvbihtc2csIHN0b3JlZE9iamVjdCkge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG5cclxuICAgICAgbGV0IG9ialVSTCA9IHN0b3JlZE9iamVjdC51cmw7XHJcbiAgICAgIGxldCBzY2hlbWEgPSBzdG9yZWRPYmplY3Quc2NoZW1hO1xyXG5cclxuICAgICAgbGV0IGh5cGVydHlVUkwgPSBtc2cuZnJvbTtcclxuXHJcbiAgICAgIC8vIGxldCBvYmpVUkxTdWJzY3JpcHRpb24gPSBvYmpVUkwgKyAnL3N1YnNjcmlwdGlvbic7XHJcblxyXG4gICAgICBsZXQgY2hpbGRCYXNlVVJMID0gb2JqVVJMICsgJy9jaGlsZHJlbi8nO1xyXG5cclxuICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyIC0gUmV1c2VTdWJzY3JpcHRpb25dIC0gb2JqVVJMOiAnLCBvYmpVUkwsICcgLSBzY2hlbWE6Jywgc2NoZW1hKTtcclxuXHJcbiAgICAgIC8vZ2V0IHNjaGVtYSBmcm9tIGNhdGFsb2d1ZSBhbmQgcGFyc2UgLT4gKGNoaWxkcmVuKVxyXG4gICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBzaW5jZSBjaGlsZHJlbiByZXNvdXJjZXMgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiB0aGUgRGF0YU9iamVjdHNTdG9yYWdlXHJcbiAgICAgIHRoaXMuX2NhdGFsb2cuZ2V0RGF0YVNjaGVtYURlc2NyaXB0b3Ioc2NoZW1hKS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzO1xyXG4gICAgICAgIGxldCBjaGlsZHJlbnMgPSBwcm9wZXJ0aWVzLmNoaWxkcmVuID8gcHJvcGVydGllcy5jaGlsZHJlbi5jb25zdGFudCA6IFtdO1xyXG5cclxuICAgICAgICAvL2NoaWxkcmVuIGFkZHJlc3Nlc1xyXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XHJcbiAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKG9ialVSTCArICcvY2hhbmdlcycpO1xyXG4vLyAgICAgICAgY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkKSA9PiBzdWJzY3JpcHRpb25zLnB1c2goY2hpbGRCYXNlVVJMICsgY2hpbGQpKTtcclxuICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goY2hpbGRCYXNlVVJMKTtcclxuXHJcbiAgICAgICAgLy9GTE9XLU9VVDogcmVwbHkgd2l0aCBwcm92aXNpb25hbCByZXNwb25zZVxyXG4gICAgICAgIHRoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBoeXBlcnR5VVJMLFxyXG4gICAgICAgICAgYm9keTogeyBjb2RlOiAxMDAsIGNoaWxkcmVuUmVzb3VyY2VzOiBjaGlsZHJlbnMsIHNjaGVtYTogc2NoZW1hLCByZXNvdXJjZTogb2JqVVJMIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy9GTE9XLU9VVDogc3Vic2NyaWJlIG1lc3NhZ2UgdG8gcmVtb3RlIFJlcG9ydGVyT2JqZWN0IC0+IF9vblJlbW90ZVN1YnNjcmliZVxyXG4gICAgICAgIC8qbGV0IG9ialN1YnNjcmliZU1zZyA9IHtcclxuICAgICAgICAgIHR5cGU6ICdzdWJzY3JpYmUnLCBmcm9tOiB0aGlzLl91cmwsIHRvOiBvYmpVUkxTdWJzY3JpcHRpb24sXHJcbiAgICAgICAgICBib2R5OiB7IHN1YnNjcmliZXI6IGh5cGVydHlVUkwsIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgLy9zdWJzY3JpYmUgdG8gcmVwb3J0ZXIgU01cclxuICAgICAgICB0aGlzLl9idXMucG9zdE1lc3NhZ2Uob2JqU3Vic2NyaWJlTXNnLCAocmVwbHkpID0+IHsqL1xyXG5cclxuICAgICAgICBsZXQgb2JzZXJ2ZXIgPSB0aGlzLl9vYnNlcnZlcnNbb2JqVVJMXTtcclxuICAgICAgICBpZiAoIW9ic2VydmVyKSB7XHJcbiAgICAgICAgICBvYnNlcnZlciA9IG5ldyBPYnNlcnZlck9iamVjdCh0aGlzLCBvYmpVUkwsIGNoaWxkcmVucyk7XHJcbiAgICAgICAgICBvYnNlcnZlci5pc1RvU2F2ZURhdGEgPSBzdG9yZWRPYmplY3QuaXNUb1NhdmVEYXRhO1xyXG4gICAgICAgICAgdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF0gPSBvYnNlcnZlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vcmVnaXN0ZXIgbmV3IGh5cGVydHkgc3Vic2NyaXB0aW9uXHJcbiAgICAgICAgb2JzZXJ2ZXIuYWRkU3Vic2NyaXB0aW9uKGh5cGVydHlVUkwpO1xyXG4gICAgICAgIG9ic2VydmVyLmFkZENoaWxkcmVucygpO1xyXG5cclxuICAgICAgICAvLyBPYmplY3QuYXNzaWduKHN0b3JlZE9iamVjdC5kYXRhLCByZXBseS5ib2R5LnZhbHVlLmRhdGEpO1xyXG4gICAgICAgIC8vIE9iamVjdC5hc3NpZ24oc3RvcmVkT2JqZWN0LmNoaWxkcmVucywgcmVwbHkuYm9keS52YWx1ZS5jaGlsZHJlbnMpO1xyXG5cclxuICAgICAgICAvL2xvZy5sb2coJ1tzdWJzY3JpYmVdIC0gcmVzdW1lIHN1YnNjcmlwdGlvbjogJywgbXNnLCByZXBseSwgc3RvcmVkT2JqZWN0LCBvYnNlcnZlcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNyeXB0Q2hpbGRyZW5zKHN0b3JlZE9iamVjdCwgY2hpbGRyZW5zKTtcclxuICAgICAgfSkudGhlbigoZGVjcnlwdGVkT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgLy8gbG9nLmxvZygncmVzdWx0IG9mIHByZXZpb3VzIHByb21pc2UnKTtcclxuICAgICAgICByZXNvbHZlKGRlY3J5cHRlZE9iamVjdCk7XHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICBsb2cuZXJyb3IoJ1tTeW5jaGVyTWFuYWdlciAtIHJlc3VtZSBzdWJzY3JpcHRpb25dIC0gZmFpbCBvbiBnZXREYXRhU2NoZW1hRGVzY3JpcHRvcjogJywgcmVhc29uKTtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIGxvY2FsIERhdGFPYmplY3RPYnNlcnZlciAtPiB1bnN1YnNjcmliZVxyXG4gIF9vbkxvY2FsVW5TdWJzY3JpYmUobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBoeXBlcnR5VVJMID0gbXNnLmZyb207XHJcbiAgICBsZXQgb2JqVVJMID0gbXNnLmJvZHkucmVzb3VyY2U7XHJcblxyXG4gICAgbGV0IG9ic2VydmVyID0gX3RoaXMuX29ic2VydmVyc1tvYmpVUkxdO1xyXG4gICAgaWYgKG9ic2VydmVyKSB7XHJcbiAgICAgIC8vVE9ETzogaXMgdGhlcmUgYW55IHBvbGljeSB2ZXJpZmljYXRpb24gYmVmb3JlIGRlbGV0ZT9cclxuICAgICAgb2JzZXJ2ZXIucmVtb3ZlU3Vic2NyaXB0aW9uKG1zZyk7XHJcblxyXG4gICAgICAvL1RPRE86IGRlc3Ryb3kgb2JqZWN0IGluIHRoZSByZWdpc3RyeT9cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgYm9keTogeyBjb2RlOiAyMDAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5kZWxldGVSZXNvdXJjZShvYmpVUkwpO1xyXG5cclxuICAgICAgLy9UT0RPOiByZW1vdmUgT2JqZWN0IGlmIG5vIG1vcmUgc3Vic2NyaXB0aW9uP1xyXG4gICAgICBkZWxldGUgX3RoaXMuX29ic2VydmVyc1tvYmpVUkxdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN5bmNoZXJNYW5hZ2VyO1xyXG4iLCIvLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdTdWJzY3JpcHRpb24nKTtcclxuXHJcbmNsYXNzIFN1YnNjcmlwdGlvbiB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGJ1cywgc3Vic2NyaWJlciwgcmVzb3VyY2UpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XHJcbiAgICBfdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlO1xyXG5cclxuICAgIGxvZy5sb2coJ1tTdWJzY3JpcHRpb25NYW5hZ2VyLlN1YnNjcmlwdGlvbl0gbmV3OiAnLCBzdWJzY3JpYmVyLCByZXNvdXJjZSlcclxuXHJcbiAgICAvL2FkZCBmb3J3YXJkXHJcbiAgICBfdGhpcy5fbGlzdGVuZXIgPSBidXMuYWRkRm9yd2FyZChyZXNvdXJjZSwgc3Vic2NyaWJlcik7XHJcblxyXG4gIH1cclxuXHJcbiAgX3JlbGVhc2VMaXN0ZW5lcnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9saXN0ZW5lci5yZW1vdmUoKTtcclxuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3Vic2NyaXB0aW9uO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdTdWJzY3JpcHRpb25NYW5hZ2VyJyk7XHJcblxyXG5pbXBvcnQgeyBkaXZpZGVVUkwgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCBTdWJzY3JpcHRpb24gZnJvbSAnLi9TdWJzY3JpcHRpb24nO1xyXG5cclxuXHJcbi8qKlxyXG4gKiBAYXV0aG9yIHBhdWxvLWctY2hhaW5ob0BhbHRpY2VsYWJzLmNvbVxyXG4gKiBTdWJzY3JpcHRpb24gTWFuYWdlciB1c2VkIHRvIG1hbmFnZSByb3V0aW5nIHBhdGhzIGF0IHRoZSBydW50aW1lLlxyXG4gKi9cclxuXHJcbmNsYXNzIFN1YnNjcmlwdGlvbk1hbmFnZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihydW50aW1lVVJMLCBidXMsIHN0b3JhZ2UpIHtcclxuICAgIGlmICghcnVudGltZVVSTCkgdGhyb3cgbmV3IEVycm9yKCdbU3Vic2NyaXB0aW9uTWFuYWdlcl0gLSBuZWVkcyB0aGUgcnVudGltZVVSTCBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghYnVzKSB0aHJvdyBuZXcgRXJyb3IoJ1tTdWJzY3JpcHRpb25NYW5hZ2VyXSAtIG5lZWRzIHRoZSBNZXNzYWdlQnVzIGluc3RhbmNlJyk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fYnVzID0gYnVzO1xyXG4gICAgX3RoaXMuX3N0b3JhZ2UgPSBzdG9yYWdlO1xyXG5cclxuICAgIF90aGlzLl9zdWJzY3JpcHRpb25zID0ge307XHJcblxyXG4gICAgX3RoaXMuX3N1YnNjcmlwdGlvbnNTdG9yYWdlID0ge307XHJcblxyXG4gICAgLy9UT0RPOiB0aGVzZSBzaG91bGQgYmUgc2F2ZWQgaW4gcGVyc2lzdGVuY2UgZW5naW5lP1xyXG4gICAgX3RoaXMucnVudGltZVVSTCA9IHJ1bnRpbWVVUkw7XHJcbiAgICBfdGhpcy5fdXJsID0gcnVudGltZVVSTCArICcvc3Vic2NyaXB0aW9ucyc7XHJcblxyXG4gICAgLy9UT0RPOiB0aGlzIHNob3VsZCBub3QgYmUgaGFyZGNvZGVkIVxyXG4gICAgX3RoaXMuX2RvbWFpbiA9IGRpdmlkZVVSTChydW50aW1lVVJMKS5kb21haW47XHJcblxyXG4gICAgYnVzLmFkZExpc3RlbmVyKF90aGlzLl91cmwsIChtc2cpID0+IHtcclxuICAgICAgbG9nLmluZm8oJ1tTdWJzY3JpcHRpb25NYW5hZ2VyXSBSQ1Y6ICcsIG1zZyk7XHJcbiAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcclxuICAgICAgICBjYXNlICdzdWJzY3JpYmUnOiBfdGhpcy5fb25TdWJzY3JpYmUobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAndW5zdWJzY3JpYmUnOiBfdGhpcy5fb25VblN1YnNjcmliZShtc2cpOyBicmVhaztcclxuICAgICAgICBjYXNlICdyZWFkJzogX3RoaXMuX29uUmVhZChtc2cpOyBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgaW5pdCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcblxyXG4gICAgICBfdGhpcy5fc3RvcmFnZS5nZXQoJ3N1YnNjcmlwdGlvbnMnKS50aGVuKChzdWJzY3JpcHRpb25zKSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZygnW1N1YnNjcmlwdGlvbk1hbmFnZXIuaW5pdF0gcmVzdW1lIHN1YnNjcmlwdGlvbnM6ICcsIHN1YnNjcmlwdGlvbnMpO1xyXG4gICAgICAgIGlmIChzdWJzY3JpcHRpb25zKSB7XHJcblxyXG4gICAgICAgICAgX3RoaXMuX3N1YnNjcmlwdGlvbnNTdG9yYWdlID0gc3Vic2NyaXB0aW9ucztcclxuXHJcbiAgICAgICAgICBPYmplY3QudmFsdWVzKHN1YnNjcmlwdGlvbnMpLmZvckVhY2goKHN1YnNjcmlwdGlvbik9PntcclxuICAgICAgICAgICAgX3RoaXMuY3JlYXRlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbi5kb21haW4sIHN1YnNjcmlwdGlvbi5yZXNvdXJjZXMsIHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVyLCBzdWJzY3JpcHRpb24uaWRlbnRpdHkpO1xyXG5cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHVybCgpIHsgcmV0dXJuIHRoaXMuX3VybDsgfVxyXG5cclxuXHJcbiAgLy9tZXNzYWdlIHJlY2VpdmVkIHRvIHNldCBhIHJvdXRpbmcgcGF0aFxyXG4gIF9vblN1YnNjcmliZShtc2cpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCByZXNvdXJjZXMgPSBtc2cuYm9keS5yZXNvdXJjZXM7XHJcblxyXG4gICAgbGV0IHN1YnNjcmliZXIgPSBtc2cuZnJvbTtcclxuICAgIGxldCBkb21haW4gPSBkaXZpZGVVUkwocmVzb3VyY2VzWzBdKS5kb21haW47IC8vd2UgYXJlIGFzc3VtaW5nIHJlc291cmNlcyBhcmUgYWxsIGZyb20gdGhlIHNhbWUgZG9tYWluXHJcblxyXG4gICAgbGV0IGlkZW50aXR5ID0gbXNnLmJvZHkuaWRlbnRpdHk7XHJcblxyXG4gICAgX3RoaXMuY3JlYXRlU3Vic2NyaXB0aW9uKGRvbWFpbiwgcmVzb3VyY2VzLCBzdWJzY3JpYmVyLCBpZGVudGl0eSkudGhlbigocmVwbHkpPT57XHJcbiAgICAgIC8vZm9yd2FyZCB0byBoeXBlcnR5OlxyXG4gICAgICByZXBseS5pZCA9IG1zZy5pZDtcclxuICAgICAgcmVwbHkuZnJvbSA9IF90aGlzLl91cmw7XHJcbiAgICAgIHJlcGx5LnRvID0gc3Vic2NyaWJlcjtcclxuICAgICAgcmVwbHkuYm9keSA9IG1zZy5ib2R5O1xyXG4gICAgICByZXBseS5ib2R5LmNvZGUgPSAyMDA7XHJcblxyXG4gICAgICBsb2cubG9nKCdbU3Vic2NyaXB0aW9uTWFuYWdlcl0gLSBjcmFldGVTdWJzY3JpcHRpb246ICcsIG1zZywgcmVwbHksIHN1YnNjcmliZXIpO1xyXG5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXBseSk7XHJcblxyXG5cclxuICAgICAgaWYgKCFfdGhpcy5fc3Vic2NyaXB0aW9uc1N0b3JhZ2Vbc3Vic2NyaWJlcl0pIHtcclxuXHJcblxyXG4gICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zU3RvcmFnZVtzdWJzY3JpYmVyXSA9IHtcclxuICAgICAgICAgIGRvbWFpbjogZG9tYWluLFxyXG4gICAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsXHJcbiAgICAgICAgICBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyLFxyXG4gICAgICAgICAgaWRlbnRpdHk6IGlkZW50aXR5XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb3VyY2VzLmZvckVhY2goKHJlc291cmNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIShfdGhpcy5fc3Vic2NyaXB0aW9uc1N0b3JhZ2Vbc3Vic2NyaWJlcl0ucmVzb3VyY2VzLmluY2x1ZGVzKHJlc291cmNlKSkpIHtcclxuICAgICAgICAgICAgX3RoaXMuX3N1YnNjcmlwdGlvbnNTdG9yYWdlW3N1YnNjcmliZXJdLnJlc291cmNlcy5wdXNoKHJlc291cmNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgX3RoaXMuX3N0b3JhZ2Uuc2V0KCdzdWJzY3JpcHRpb25zJywgMSwgX3RoaXMuX3N1YnNjcmlwdGlvbnNTdG9yYWdlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlU3Vic2NyaXB0aW9uKGRvbWFpbiwgcmVzb3VyY2VzLCBzdWJzY3JpYmVyLCBpZGVudGl0eSkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAvL2RlYnVnZ2VyO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIC8vRkxPVy1PVVQ6IHN1YnNjcmliZSBtZXNzYWdlIHRvIHRoZSBtc2ctbm9kZSwgcmVnaXN0ZXJpbmcgbGlzdGVuZXJzIG9uIHRoZSBicm9rZXJcclxuXHJcbiAgICAgIGxldCBub2RlU3Vic2NyaWJlTXNnID0ge1xyXG4gICAgICAgIHR5cGU6ICdzdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fdXJsLCB0bzogJ2RvbWFpbjovL21zZy1ub2RlLicgKyBkb21haW4gKyAnL3NtJyxcclxuICAgICAgICBib2R5OiB7IGlkZW50aXR5OiBpZGVudGl0eSwgcmVzb3VyY2VzOiByZXNvdXJjZXMsIHNvdXJjZTogc3Vic2NyaWJlciB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvL3N1YnNjcmliZSBpbiBtc2ctbm9kZVxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG5vZGVTdWJzY3JpYmVNc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgIGxvZy5sb2coJ1tTdWJzY3JpcHRpb25NYW5hZ2VyXSBub2RlLXN1YnNjcmliZS1yZXNwb25zZTogJywgcmVwbHkpO1xyXG5cclxuICAgICAgICAvL2lmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkgey8vVE9ETzogdW5jb21tZW50IHdoZW4gIE1OIHJlcGxpZXMgd2l0aCBjb3JyZWN0IHJlc3BvbnNlIGJvZHkgY29kZVxyXG5cclxuICAgICAgICAvL1RPRE86IHN1cHBvcnQgbXVsdGlwbGUgcm91dGVzIGZvciBtdWx0aXBsZSByZXNvdXJjZXNcclxuXHJcbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IF90aGlzLl9zdWJzY3JpcHRpb25zW3N1YnNjcmliZXJdO1xyXG4gICAgICAgIGxvZy5sb2coJ1tTdWJzY3JpcHRpb25NYW5hZ2VyXSAtICcsICBfdGhpcy5fc3Vic2NyaXB0aW9ucywgcmVzb3VyY2VzLCBfdGhpcy5fc3Vic2NyaXB0aW9ucy5oYXNPd25Qcm9wZXJ0eShzdWJzY3JpYmVyKSk7XHJcbiAgICAgICAgaWYgKCFzdWJzY3JpcHRpb24pIHtcclxuICAgICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zW3N1YnNjcmliZXJdID0ge307XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXNvdXJjZXMuZm9yRWFjaCgocmVzb3VyY2UpPT57XHJcbiAgICAgICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uc1tzdWJzY3JpYmVyXVtyZXNvdXJjZV0gPSBuZXcgU3Vic2NyaXB0aW9uKF90aGlzLl9idXMsIHN1YnNjcmliZXIsIHJlc291cmNlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZShyZXBseSk7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICAvLyBtZXNzYWdlIHJlY2VpdmVkIHRvIHJlbW92ZSByb3V0aW5nIHBhdGhcclxuICBfb25VblN1YnNjcmliZShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IHVuc3Vic2NyaWJlciA9IG1zZy5mcm9tO1xyXG4gICAgbGV0IHJlc291cmNlID0gbXNnLmJvZHkucmVzb3VyY2U7XHJcblxyXG4gICAgaWYgKF90aGlzLl9zdWJzY3JpcHRpb25zW3Vuc3Vic2NyaWJlcl0gJiYgX3RoaXMuX3N1YnNjcmlwdGlvbnNbdW5zdWJzY3JpYmVyXVtyZXNvdXJjZV0pIHtcclxuICAgICAgbGV0IGRvbWFpbiA9IGRpdmlkZVVSTChyZXNvdXJjZSkuZG9tYWluO1xyXG4gICAgICBsZXQgc3Vic2NyaXB0aW9uID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbdW5zdWJzY3JpYmVyXVtyZXNvdXJjZV07XHJcblxyXG4gICAgICAvL0ZMT1ctT1VUOiBtZXNzYWdlIHNlbnQgdG8gbXNnLW5vZGUgU3Vic2NyaXB0aW9uTWFuYWdlciBjb21wb25lbnRcclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgdHlwZTogJ3Vuc3Vic2NyaWJlJywgZnJvbTogX3RoaXMuX3VybCwgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgZG9tYWluICsgJy9zbScsXHJcbiAgICAgICAgYm9keTogeyByZXNvdXJjZXM6IFtyZXNvdXJjZV0sIHNvdXJjZTogdW5zdWJzY3JpYmVyIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBzdWJzY3JpcHRpb24uX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuICAgICAgZGVsZXRlIF90aGlzLl9zdWJzY3JpcHRpb25zW3Vuc3Vic2NyaWJlcl1bcmVzb3VyY2VdO1xyXG5cclxuICAgICAgaWYgKF90aGlzLl9zdWJzY3JpcHRpb25zU3RvcmFnZVt1bnN1YnNjcmliZXJdKSB7XHJcbiAgICAgICAgbGV0IGkgPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1N0b3JhZ2VbdW5zdWJzY3JpYmVyXS5yZXNvdXJjZXMuaW5kZXhPZihyZXNvdXJjZSk7XHJcbiAgICAgICAgaWYgKGkgIT0gLTEpIHtcclxuICAgICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zU3RvcmFnZVt1bnN1YnNjcmliZXJdLnJlc291cmNlcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIF90aGlzLl9zdG9yYWdlLnNldCgnc3Vic2NyaXB0aW9ucycsIDEsIF90aGlzLl9zdWJzY3JpcHRpb25zU3RvcmFnZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgIGJvZHk6IHsgY29kZTogMjAwIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8vbWVzc2FnZSByZWNlaXZlZCB0byByZWFkIGV4aXN0aW5nIHJvdXRpbmcgcGF0aHMuIEF0IHRoaXMgcG9pbnQgbGltaXRlZCB0byByZWFkIGFsbCBleGlzdGluZyByb3V0aW5nIHBhdGhzIHNldCBmb3Igb25lIGxpc3RlbmVyXHJcbiAgX29uUmVhZChtc2cpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBsaXN0ZW5lckFkZHJlc3MgPSBtc2cuYm9keS5yZXNvdXJjZTtcclxuICAgIGxldCByZXBseTtcclxuXHJcbiAgICBsb2cubG9nKCdbU3Vic2NyaXB0aW9uTWFuYWdlcl0gLSByZXF1ZXN0IHRvIHJlYWQgU3Vic2NyaXB0aW9uczogJywgbXNnKTtcclxuXHJcbiAgICBfdGhpcy5fc3RvcmFnZS5nZXQoJ3N1YnNjcmlwdGlvbnMnKS50aGVuKChzdWJzY3JpcHRpb25zKT0+e1xyXG4gICAgICBpZiAoc3Vic2NyaXB0aW9ucyAmJiBzdWJzY3JpcHRpb25zW2xpc3RlbmVyQWRkcmVzc10pIHtcclxuICAgICAgICBsZXQgcmVzb3VyY2VzID0gc3Vic2NyaXB0aW9uc1tsaXN0ZW5lckFkZHJlc3NdLnJlc291cmNlcztcclxuXHJcbiAgICAgICAgcmVwbHkgPSB7XHJcbiAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcclxuICAgICAgICAgIGJvZHk6IHsgY29kZTogMjAwLCB2YWx1ZTogcmVzb3VyY2VzIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXBseSA9IHtcclxuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgYm9keTogeyBjb2RlOiA0MDQsIGRlc2NyaXB0aW9uOiAnTm90IEZvdW5kJyB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlcGx5KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgU3Vic2NyaXB0aW9uTWFuYWdlcjtcclxuIiwiaW1wb3J0IHtkaXZpZGVFbWFpbCwgZGl2aWRlVVJMLCBpc0RhdGFPYmplY3RVUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbmNsYXNzIFJlVGhpbmtDdHgge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuZGVmYXVsdEJlaGF2aW91ciA9IHRydWU7XHJcbiAgICB0aGlzLmdyb3VwcyA9IHt9O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNjaGVtZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zY2hlbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRvbWFpbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9kb21haW47XHJcbiAgfVxyXG5cclxuICBnZXQgdHlwZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl90eXBlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNvdXJjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XHJcbiAgfVxyXG5cclxuICBnZXQgdGltZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl90aW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHdlZWtkYXkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fd2Vla2RheTtcclxuICB9XHJcblxyXG4gIHNldCBzY2hlbWUocGFyYW1zKSB7XHJcbiAgICBsZXQgZnJvbSA9IHBhcmFtcy5tZXNzYWdlLmZyb207XHJcbiAgICBpZiAoaXNEYXRhT2JqZWN0VVJMKGZyb20pKSB7XHJcbiAgICAgIHRoaXMuX3NjaGVtZSA9IGRpdmlkZVVSTChmcm9tKS50eXBlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2NoZW1lID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IGRhdGUobm93KSB7XHJcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICBsZXQgZGF5ID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKTtcclxuICAgIGlmIChkYXkubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIGRheSA9ICcwJyArIGRheTtcclxuICAgIH1cclxuICAgIGxldCBtb250aCA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKTtcclxuICAgIGlmIChtb250aC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgbW9udGggPSAnMCcgKyBtb250aDtcclxuICAgIH1cclxuICAgIHRoaXMuX2RhdGUgPSBkYXkgKyAnLycgKyBtb250aCArICcvJyArIGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICB9XHJcblxyXG4gIHNldCBkb21haW4ocGFyYW1zKSB7XHJcbiAgICBpZiAocGFyYW1zLm1lc3NhZ2UuYm9keS5pZGVudGl0eSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuX2RvbWFpbiA9IGRpdmlkZUVtYWlsKHBhcmFtcy5tZXNzYWdlLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUudXNlcm5hbWUpLmRvbWFpbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCB0eXBlKHBhcmFtcykge1xyXG4gICAgbGV0IG1lc3NhZ2UgPSBwYXJhbXMubWVzc2FnZTtcclxuICAgIGlmIChtZXNzYWdlLmJvZHkudmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl90eXBlID0gbWVzc2FnZS5ib2R5LnZhbHVlLnJlc291cmNlVHlwZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCBzb3VyY2UocGFyYW1zKSB7XHJcbiAgICBpZiAocGFyYW1zLm1lc3NhZ2UuYm9keS5pZGVudGl0eSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuX3NvdXJjZSA9IHBhcmFtcy5tZXNzYWdlLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUudXNlcm5hbWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXQgdGltZShub3cpIHtcclxuICAgIG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICBsZXQgbWludXRlcyA9IFN0cmluZyhub3cuZ2V0TWludXRlcygpKTtcclxuICAgIGlmIChtaW51dGVzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICBtaW51dGVzID0gJzAnICsgbWludXRlcztcclxuICAgIH1cclxuICAgIHRoaXMuX3RpbWUgPSBwYXJzZUludChTdHJpbmcobm93LmdldEhvdXJzKCkpICsgbWludXRlcyk7XHJcbiAgfVxyXG5cclxuICBzZXQgd2Vla2RheShub3cpIHtcclxuICAgIHRoaXMuX3dlZWtkYXkgPSBTdHJpbmcobmV3IERhdGUoKS5nZXREYXkoKSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVUaGlua0N0eDtcclxuIiwiaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1BFUCcpO1xyXG5cclxuaW1wb3J0IEFsbG93T3ZlcnJpZGVzIGZyb20gJy4uL2NvbWJpbmluZ0FsZ29yaXRobXMvQWxsb3dPdmVycmlkZXMnO1xyXG5pbXBvcnQgQmxvY2tPdmVycmlkZXMgZnJvbSAnLi4vY29tYmluaW5nQWxnb3JpdGhtcy9CbG9ja092ZXJyaWRlcyc7XHJcbmltcG9ydCB7ZGl2aWRlVVJMLCBnZXRVc2VyRW1haWxGcm9tVVJMLCBpc0RhdGFPYmplY3RVUkx9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IEZpcnN0QXBwbGljYWJsZSBmcm9tICcuLi9jb21iaW5pbmdBbGdvcml0aG1zL0ZpcnN0QXBwbGljYWJsZSc7XHJcbmltcG9ydCBSZVRoaW5rQ3R4IGZyb20gJy4uL1JlVGhpbmtDdHgnO1xyXG5cclxuY2xhc3MgUnVudGltZUNvcmVDdHggZXh0ZW5kcyBSZVRoaW5rQ3R4IHtcclxuXHJcbiAgY29uc3RydWN0b3IocnVudGltZVVSTCwgaWRNb2R1bGUsIHJ1bnRpbWVSZWdpc3RyeSwgc3RvcmFnZU1hbmFnZXIsIHJ1bnRpbWVDYXBhYmlsaXRpZXMpIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLl9ydW50aW1lVVJMID0gcnVudGltZVVSTDtcclxuICAgIHRoaXMuX3BlcFVSTCA9IHRoaXMuX3J1bnRpbWVVUkwgKyAnL3BlcCc7XHJcbiAgICB0aGlzLl9ndWlVUkwgPSB0aGlzLl9ydW50aW1lVVJMICsgJy9wb2xpY3ktZ3VpJztcclxuICAgIHRoaXMuaWRNb2R1bGUgPSBpZE1vZHVsZTtcclxuICAgIHRoaXMucnVudGltZVJlZ2lzdHJ5ID0gcnVudGltZVJlZ2lzdHJ5O1xyXG4gICAgdGhpcy5hY3RpdmVVc2VyUG9saWN5ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZXJ2aWNlUHJvdmlkZXJQb2xpY3kgPSB7fTtcclxuICAgIHRoaXMudXNlclBvbGljaWVzID0ge307XHJcbiAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyID0gc3RvcmFnZU1hbmFnZXI7XHJcbiAgICB0aGlzLnJ1bnRpbWVDYXBhYmlsaXRpZXMgPSBydW50aW1lQ2FwYWJpbGl0aWVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBlcFVSTCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX3BlcFVSTDtcclxuICB9XHJcblxyXG4gIGdldCBndWlVUkwoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9ndWlVUkw7XHJcbiAgfVxyXG5cclxuICBnZXQgcnVudGltZVVSTCgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX3J1bnRpbWVVUkw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIHJldHVybiB0aGUgbWVzc2FnZUJ1cyBpbiB0aGlzIFJlZ2lzdHJ5XHJcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXHJcbiAgKi9cclxuICBnZXQgbWVzc2FnZUJ1cygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX21lc3NhZ2VCdXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNldCB0aGUgbWVzc2FnZUJ1cyBpbiB0aGlzIFJlZ2lzdHJ5XHJcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXHJcbiAgKi9cclxuICBzZXQgbWVzc2FnZUJ1cyhtZXNzYWdlQnVzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX21lc3NhZ2VCdXMgPSBtZXNzYWdlQnVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN1YnNjcmlwdGlvbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdWJzY3JpcHRpb247XHJcbiAgfVxyXG5cclxuICBzZXQgc3Vic2NyaXB0aW9uKHBhcmFtcykge1xyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gcGFyYW1zLm1lc3NhZ2UuYm9keS5zdWJzY3JpYmVyO1xyXG4gIH1cclxuXHJcbiAgbG9hZENvbmZpZ3VyYXRpb25zKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgY29uc29sZS5sb2coX3RoaXMuc3RvcmFnZU1hbmFnZXIpO1xyXG5cclxuICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdyZXRoaW5rOmFjdGl2ZVBvbGljeScpLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgX3RoaXMuYWN0aXZlVXNlclBvbGljeSA9IHZhbHVlO1xyXG5cclxuICAgICAgICByZXR1cm4gX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdyZXRoaW5rOmdyb3VwcycpO1xyXG4gICAgICB9KS50aGVuKChncm91cEluZm8pID0+IHtcclxuICAgICAgICBsZXQgZ3JvdXBzID0gZ3JvdXBJbmZvO1xyXG4gICAgICAgIF90aGlzLmdyb3VwcyA9IChncm91cHMgPT09IHVuZGVmaW5lZCkgPyB7fSA6IGdyb3VwcztcclxuXHJcbiAgICAgICAgcmV0dXJuIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCgncmV0aGluazpzcFBvbGljaWVzJyk7XHJcbiAgICAgIH0pLnRoZW4oKHBvbGljaWVzSW5mbykgPT4ge1xyXG4gICAgICAgIGxldCBzcFBvbGljaWVzID0gcG9saWNpZXNJbmZvO1xyXG4gICAgICAgIF90aGlzLnNlcnZpY2VQcm92aWRlclBvbGljeSA9IChzcFBvbGljaWVzID09PSB1bmRlZmluZWQpID8ge30gOiBzcFBvbGljaWVzO1xyXG5cclxuICAgICAgICBfdGhpcy5fbG9hZFVzZXJQb2xpY2llcygpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldFBvbGljaWVzKG1lc3NhZ2UsIGlzSW5jb21pbmdNZXNzYWdlKSB7XHJcbiAgICBsZXQgcG9saWNpZXMgPSB7fTtcclxuXHJcbiAgICBpZiAodGhpcy5hY3RpdmVVc2VyUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcG9saWNpZXMudXNlclBvbGljeSA9IHRoaXMudXNlclBvbGljaWVzW3RoaXMuYWN0aXZlVXNlclBvbGljeV07XHJcbiAgICB9XHJcblxyXG4gICAgcG9saWNpZXMuc2VydmljZVByb3ZpZGVyUG9saWN5ID0gdGhpcy5nZXRTZXJ2aWNlUHJvdmlkZXJQb2xpY3kobWVzc2FnZSwgaXNJbmNvbWluZ01lc3NhZ2UpO1xyXG5cclxuICAgIHJldHVybiBwb2xpY2llcztcclxuICB9XHJcblxyXG4gIF9pc1ZhbGlkVXBkYXRlKG1lc3NhZ2UpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBpZiAobWVzc2FnZS5mcm9tLnNwbGl0KCc6Ly8nKS5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgX3RoaXMuaWRNb2R1bGUuX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdChtZXNzYWdlLmZyb20pLnRoZW4oaHlwZXJ0eVVSTCA9PiB7XHJcbiAgICAgICAgICBpZiAoaHlwZXJ0eVVSTCA9PT0gbWVzc2FnZS5ib2R5LnNvdXJjZSkge1xyXG4gICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVqZWN0KCdUaGUgc291cmNlIG9mIHRoZSBtZXNzYWdlIGlzIG5vdCB2YWxpZC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGdldE15RW1haWxzKCkge1xyXG4gICAgbGV0IGlkZW50aXRpZXMgPSB0aGlzLmlkTW9kdWxlLmdldElkZW50aXRpZXMoKTtcclxuICAgIGxldCBlbWFpbHMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpIGluIGlkZW50aXRpZXMpIHtcclxuICAgICAgZW1haWxzLnB1c2goZ2V0VXNlckVtYWlsRnJvbVVSTChpZGVudGl0aWVzW2ldLmlkZW50aXR5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGVtYWlscztcclxuICB9XHJcblxyXG4gIGdldE15SHlwZXJ0aWVzKCkge1xyXG4gICAgbGV0IGh5cGVydGllcyA9IHRoaXMucnVudGltZVJlZ2lzdHJ5Lmh5cGVydGllc0xpc3Q7XHJcbiAgICBsZXQgaHlwZXJ0aWVzTmFtZXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpIGluIGh5cGVydGllcykge1xyXG4gICAgICBsZXQgaHlwZXJ0eU5hbWUgPSBoeXBlcnRpZXNbaV0ub2JqZWN0TmFtZTtcclxuICAgICAgaWYgKGh5cGVydGllc05hbWVzLmluZGV4T2YoaHlwZXJ0eU5hbWUpID09PSAtMSkge1xyXG4gICAgICAgIGh5cGVydGllc05hbWVzLnB1c2goaHlwZXJ0eU5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGh5cGVydGllc05hbWVzO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VydmljZVByb3ZpZGVyUG9saWN5KG1lc3NhZ2UsIGlzSW5jb21pbmcpIHtcclxuICAgIGxldCBwb2xpY3k7XHJcblxyXG4gICAgaWYgKGlzSW5jb21pbmcpIHtcclxuICAgICAgbGV0IHRvSHlwZXJ0eSA9IHRoaXMucnVudGltZVJlZ2lzdHJ5LmdldEh5cGVydHlOYW1lKG1lc3NhZ2UudG8pO1xyXG4gICAgICBwb2xpY3kgPSB0aGlzLnNlcnZpY2VQcm92aWRlclBvbGljeVt0b0h5cGVydHldO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbGV0IGZyb21IeXBlcnR5ID0gdGhpcy5ydW50aW1lUmVnaXN0cnkuZ2V0SHlwZXJ0eU5hbWUobWVzc2FnZS5mcm9tKTtcclxuICAgICAgcG9saWN5ID0gdGhpcy5zZXJ2aWNlUHJvdmlkZXJQb2xpY3lbZnJvbUh5cGVydHldO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBvbGljeTtcclxuICB9XHJcblxyXG5cclxuICBnZXRVUkwodXJsKSB7XHJcbiAgICBsZXQgc3BsaXRVUkwgPSB1cmwuc3BsaXQoJy8nKTtcclxuICAgIHJldHVybiBzcGxpdFVSTFswXSArICcvLycgKyBzcGxpdFVSTFsyXSArICcvJyArIHNwbGl0VVJMWzNdO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICogQ3JlYXRlcyBhIGdyb3VwIHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICBncm91cE5hbWVcclxuICAqL1xyXG4gIF9sb2FkVXNlclBvbGljaWVzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdyZXRoaW5rOnVzZXJQb2xpY2llcycpLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgbGV0IHBvbGljaWVzID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHBvbGljaWVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGZvciAobGV0IGkgaW4gcG9saWNpZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5wZXAuYWRkUG9saWN5KCdVU0VSJywgaSwgcG9saWNpZXNbaV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgX2dldExhc3RDb21wb25lbnRPZlVSTCh1cmwpIHtcclxuICAgIGxldCBzcGxpdCA9IHVybC5zcGxpdCgnLycpO1xyXG4gICAgcmV0dXJuIHNwbGl0W3NwbGl0Lmxlbmd0aCAtIDFdO1xyXG4gIH1cclxuXHJcbiAgX2dldFBvbGljaWVzSlNPTihwb2xpY2llcykge1xyXG4gICAgZm9yIChsZXQgaSBpbiBwb2xpY2llcykge1xyXG4gICAgICBsZXQgY29tYmluaW5nQWxnb3JpdGhtID0gcG9saWNpZXNbaV0uY29tYmluaW5nQWxnb3JpdGhtO1xyXG4gICAgICBpZiAoY29tYmluaW5nQWxnb3JpdGhtIGluc3RhbmNlb2YgQmxvY2tPdmVycmlkZXMpIHtcclxuICAgICAgICBwb2xpY2llc1tpXS5jb21iaW5pbmdBbGdvcml0aG0gPSAnYmxvY2tPdmVycmlkZXMnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChjb21iaW5pbmdBbGdvcml0aG0gaW5zdGFuY2VvZiBBbGxvd092ZXJyaWRlcykge1xyXG4gICAgICAgICAgcG9saWNpZXNbaV0uY29tYmluaW5nQWxnb3JpdGhtID0gJ2FsbG93T3ZlcnJpZGVzJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGNvbWJpbmluZ0FsZ29yaXRobSBpbnN0YW5jZW9mIEZpcnN0QXBwbGljYWJsZSkge1xyXG4gICAgICAgICAgICBwb2xpY2llc1tpXS5jb21iaW5pbmdBbGdvcml0aG0gPSAnZmlyc3RBcHBsaWNhYmxlJztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBvbGljaWVzW2ldLmNvbWJpbmluZ0FsZ29yaXRobSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcG9saWNpZXM7XHJcbiAgfVxyXG5cclxuICBzYXZlQWN0aXZlUG9saWN5KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQoJ3JldGhpbms6YWN0aXZlUG9saWN5JywgMCwgdGhpcy5hY3RpdmVVc2VyUG9saWN5KS50aGVuKCgpID0+IHtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzYXZlR3JvdXBzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQoJ3JldGhpbms6Z3JvdXBzJywgMCwgdGhpcy5ncm91cHMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVQb2xpY2llcyhzb3VyY2UsIHBvbGljeSwga2V5KSB7XHJcbiAgICBsZXQgcG9saWNpZXNKc29uO1xyXG5cclxuICAgIHN3aXRjaCAoc291cmNlKSB7XHJcbiAgICAgIGNhc2UgJ1VTRVInOlxyXG4gICAgICAgIHBvbGljaWVzSnNvbiA9IEpTT04uc3RyaW5naWZ5KHRoaXMudXNlclBvbGljaWVzKTtcclxuICAgICAgICBwb2xpY2llc0pzb24gPSB0aGlzLl9nZXRQb2xpY2llc0pTT04oSlNPTi5wYXJzZShwb2xpY2llc0pzb24pKTtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldCgncmV0aGluazp1c2VyUG9saWNpZXMnLCAwLCBwb2xpY2llc0pzb24pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdTRVJWSUNFX1BST1ZJREVSJzpcclxuICAgICAgICBpZiAocG9saWN5ICE9PSB1bmRlZmluZWQgJiBrZXkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5zZXJ2aWNlUHJvdmlkZXJQb2xpY3lba2V5XSA9IHBvbGljeTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcG9saWNpZXNKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJ2aWNlUHJvdmlkZXJQb2xpY3kpO1xyXG4gICAgICAgIHBvbGljaWVzSnNvbiA9IHRoaXMuX2dldFBvbGljaWVzSlNPTihKU09OLnBhcnNlKHBvbGljaWVzSnNvbikpO1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZU1hbmFnZXIuc2V0KCdyZXRoaW5rOnNwUG9saWNpZXMnLCAwLCBwb2xpY2llc0pzb24pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIHBvbGljeSBzb3VyY2U6ICcgKyBzb3VyY2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0R3JvdXBzTmFtZXMoKSB7XHJcbiAgICBsZXQgbXlHcm91cHMgPSB0aGlzLmdyb3VwcztcclxuICAgIGxldCBncm91cHNOYW1lcyA9IFtdO1xyXG4gICAgaWYgKG15R3JvdXBzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChsZXQgZ3JvdXBOYW1lIGluIG15R3JvdXBzKSB7XHJcbiAgICAgICAgZ3JvdXBzTmFtZXMucHVzaChncm91cE5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZ3JvdXBzTmFtZXM7XHJcbiAgfVxyXG5cclxuICBnZXRHcm91cChncm91cE5hbWUsIGRlc3RpbmF0aW9uKSB7XHJcbiAgICBsZXQgbWVtYmVycyA9IFtdO1xyXG5cclxuICAgIGlmIChncm91cE5hbWUgPT09ICdwcmVhdXRob3Jpc2VkJykge1xyXG4gICAgICBsZXQgZGF0YU9iamVjdFVSTCA9IGRlc3RpbmF0aW9uLnNwbGl0KCcvJyk7XHJcbiAgICAgIGRhdGFPYmplY3RVUkwucG9wKCk7XHJcbiAgICAgIGRhdGFPYmplY3RVUkwgPSBkYXRhT2JqZWN0VVJMWzBdICsgJy8vJyArIGRhdGFPYmplY3RVUkxbMl07XHJcbiAgICAgIG1lbWJlcnMgPSB0aGlzLnJ1bnRpbWVSZWdpc3RyeS5nZXRQcmVBdXRoU3Vic2NyaWJlcnMoZGF0YU9iamVjdFVSTCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5ncm91cHNbZ3JvdXBOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgbWVtYmVycyA9IHRoaXMuZ3JvdXBzW2dyb3VwTmFtZV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbWVtYmVycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQ3JlYXRlcyBhIGdyb3VwIHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICBncm91cE5hbWVcclxuICAqL1xyXG4gIGNyZWF0ZUdyb3VwKGdyb3VwTmFtZSkge1xyXG4gICAgdGhpcy5ncm91cHNbZ3JvdXBOYW1lXSA9IFtdO1xyXG4gICAgdGhpcy5zYXZlR3JvdXBzKCk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVHcm91cChncm91cE5hbWUpIHtcclxuICAgIGRlbGV0ZSB0aGlzLmdyb3Vwc1tncm91cE5hbWVdO1xyXG4gICAgdGhpcy5zYXZlR3JvdXBzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFkZHMgdGhlIGdpdmVuIHVzZXIgZW1haWwgdG8gdGhlIGdyb3VwIHdpdGggdGhlIGdpdmVuIG5hbWUuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICB1c2VyRW1haWxcclxuICAqIEBwYXJhbSAge1N0cmluZ30gIGdyb3VwTmFtZVxyXG4gICovXHJcbiAgYWRkVG9Hcm91cChncm91cE5hbWUsIHVzZXJFbWFpbCkge1xyXG4gICAgbGV0IG15R3JvdXBzID0gdGhpcy5ncm91cHM7XHJcbiAgICBpZiAobXlHcm91cHNbZ3JvdXBOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmIChteUdyb3Vwc1tncm91cE5hbWVdLmluZGV4T2YodXNlckVtYWlsKSA9PT0gLTEpIHtcclxuICAgICAgICBteUdyb3Vwc1tncm91cE5hbWVdLnB1c2godXNlckVtYWlsKTtcclxuICAgICAgICB0aGlzLnNhdmVHcm91cHMoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ0dyb3VwIFwiJyArIGdyb3VwTmFtZSArICdcIiBkb2VzIG5vdCBleGlzdCEnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZUZyb21Hcm91cChncm91cE5hbWUsIHVzZXJFbWFpbCkge1xyXG4gICAgbGV0IGdyb3VwID0gdGhpcy5ncm91cHNbZ3JvdXBOYW1lXTtcclxuXHJcbiAgICBncm91cC5zcGxpY2UoZ3JvdXAuaW5kZXhPZih1c2VyRW1haWwpLCAxKTtcclxuICAgIHRoaXMuc2F2ZUdyb3VwcygpO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJ1bnRpbWVDb3JlQ3R4O1xyXG4iLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcbmltcG9ydCB0djQgZnJvbSBcInR2NFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJldGhpbmtPYmplY3Qge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGVzIHRoaXMgUmV0aGlua09iamVjdCBhZ2FpbnN0IHRoZSBwcm92aWRlZCBzY2hlbWEuXHJcbiAgICAgKlxyXG4gICAgICogTElNSVRBVElPTlM6IFRoZSBwcm92aWRlZCBzY2hlbWEgY2Fubm90IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBzY2hlbWFzLCBzaW5jZSB0aGV5IGNhbid0IGJlIHJlc29sdmVkLlxyXG4gICAgICogQHBhcmFtIHNjaGVtYSAtIHNjaGVtYSB0byB2YWxpZGF0ZSBhZ2FpbnN0XHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXRlKHNjaGVtYSkge1xyXG4gICAgICAgIC8vIGFkZCBzY2hlbWEgaXRzZWxmIHNvIGxvY2FsIHJlZmVyZW5jZXMgd29ya1xyXG4gICAgICAgIHR2NC5hZGRTY2hlbWEoc2NoZW1hLmlkLCBzY2hlbWEpO1xyXG5cclxuICAgICAgICAvLyBKU09OIHN0cmluZ2lmeSAtPiBwYXJzZSBuZWVkZWQgdG8gaGF2ZSBwcm9wZXIgdmFsaWRhdGlvblxyXG4gICAgICAgIGxldCByZXN1bHQgPSB0djQudmFsaWRhdGVNdWx0aXBsZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKSwgc2NoZW1hKTtcclxuXHJcbiAgICAgICAgLy8gZGVsZXRlIGVycm9yIHN0YWNrcyB0byBpbXByb3ZlIGxvZ2dpbmdcclxuICAgICAgICByZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBlcnJvci5zdGFjaztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gcHJpbnQgbW9yZSBkZXRhaWxzIGFib3V0IHZhbGlkYXRpb24gaWYgaXQgZmFpbHMgb3Igc2NoZW1hIGNvbnRhaW5zICRyZWZzXHJcbiAgICAgICAgaWYgKCFyZXN1bHQudmFsaWQgfHwgKHJlc3VsdC5taXNzaW5nLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk9iamVjdCB2YWxpZGF0aW9uIFwiICsgKHJlc3VsdC52YWxpZCA/IFwic3VjY2VlZGVkLCBidXQgc2NoZW1hIGNvbnRhaW5lZCByZWZlcmVuY2VzOlwiIDogXCJmYWlsZWQ6XCIpLCBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJPYmplY3Q6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsIDIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWxpZDtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJldGhpbmtPYmplY3Q7XHJcblxyXG4iLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcbmltcG9ydCBSZXRoaW5rT2JqZWN0IGZyb20gXCIuL1JldGhpbmtPYmplY3RcIjtcclxuXHJcbi8qKlxyXG4gKiBAYXV0aG9yIGFsaWNlLmNoZWFtYmVbYXRdZm9rdXMuZnJhdW5ob2Zlci5kZVxyXG4gKiBUaGUgQ2F0YWxvZ3VlRGF0YU9iamVjdCBjbGFzcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlVEhJTksgQ2F0YWxvZ3VlIERhdGEgTW9kZWxcclxuICovXHJcbmNsYXNzIENhdGFsb2d1ZURhdGFPYmplY3QgZXh0ZW5kcyBSZXRoaW5rT2JqZWN0IHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gZ3VpZCAtIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdCAoZS5nLiBIeXBlcnR5IGRlc2NyaXB0b3IsIFByb3RvY29sU3R1YiBkZXNjcmlwdG9yLFxyXG4gICAgICogZXRjKSBlbmFibGluZyB0aGUgc2FtZSBvYmplY3QgdG8gYmUgc3RvcmVkIGFuZCBkaXNjb3ZlcmVkIGluIGRpZmZlcmVudCBDYXRhbG9ndWVzLiBUaGF0IG1lYW5zLCBndWlkIGNvcnJlc3BvbmRzIHRvXHJcbiAgICAgKiBbcmVzb3VyY2UtdHlwZS1pZF0gcGVyIEJORiBvZiBSZXNvdXJjZSBQYXRoLiBDb3VsZG4ndCB3ZSBoYXZlIHByb2JsZW1zIHdpdGggdG9vIGxvbmcgVVJMIHBhdGhzP1xyXG4gICAgICogQHBhcmFtIHR5cGUgLSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0IGUuZy4gSHlwZXJ0eSwgUHJvdG9jb2xTdHViLCBldGNcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXHJcbiAgICAgKiBAcGFyYW0gb2JqZWN0TmFtZSAtIGh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3QgZS5nLiBcIk15IEF3ZXNvbWUgSHlwZXJ0eVwiXHJcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBkZXNjcmlwdGlvbiBvZiB0aGUgc291cmNlIHBhY2thZ2VcclxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSAtIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlLlNvdXJjZUNvZGVcclxuICAgICAqIEBwYXJhbSBzb3VyY2VQYWNrYWdlVVJMIC0gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmdcclxuICAgICAqIGNhdGFsb2d1ZSBvYmplY3QsIGUuZy4gZGVwbG95YWJsZSBwYWNrYWdlcyBjb250YWluaW5nIGV4ZWN1dGFibGUgY29kZSBmb3IgSHlwZXJ0aWVzIG9yIFByb3RvU3R1YnMsIGNhbiBiZSBkb3dubG9hZGVkXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fZ3VpZCA9IGd1aWQ7XHJcbiAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XHJcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XHJcbiAgICAgICAgdGhpcy5fb2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7XHJcbiAgICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLl9sYW5ndWFnZSA9IGxhbmd1YWdlO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZVBhY2thZ2VVUkwgPSBzb3VyY2VQYWNrYWdlVVJMO1xyXG5cclxuICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZVBhY2thZ2UgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldHRlcnNcclxuICAgIGdldCBndWlkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ndWlkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0eXBlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB2ZXJzaW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvYmplY3ROYW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vYmplY3ROYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhbmd1YWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lnbmF0dXJlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvdXJjZVBhY2thZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBhY2thZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvdXJjZVBhY2thZ2VVUkwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBhY2thZ2VVUkw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIFNldHRlcnNcclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzaWduYXR1cmUgdG8gZW5hYmxlcyBpbnRlZ3JpdHkgYW5kIGF1dGhlbnRpY2l0eSB2ZXJpZmljYXRpb25cclxuICAgICAqIEBwYXJhbSBzaWduYXR1cmVcclxuICAgICAqL1xyXG4gICAgc2V0IHNpZ25hdHVyZShzaWduYXR1cmUpIHtcclxuICAgICAgICBpZiAoc2lnbmF0dXJlKVxyXG4gICAgICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBzaWduYXR1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNvdXJjZVBhY2thZ2Uoc291cmNlUGFja2FnZSkge1xyXG4gICAgICAgIGlmIChzb3VyY2VQYWNrYWdlKVxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VQYWNrYWdlID0gc291cmNlUGFja2FnZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZ3VpZChndWlkKSB7XHJcbiAgICAgICAgaWYgKGd1aWQpXHJcbiAgICAgICAgICAgIHRoaXMuX2d1aWQgPSBndWlkO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCB0eXBlKHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZSlcclxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHZlcnNpb24odmVyc2lvbikge1xyXG4gICAgICAgIGlmICh2ZXJzaW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXQgb2JqZWN0TmFtZShvYmplY3ROYW1lKSB7XHJcbiAgICAgICAgaWYgKG9iamVjdE5hbWUpXHJcbiAgICAgICAgICAgIHRoaXMuX29iamVjdE5hbWUgPSBvYmplY3ROYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBkZXNjcmlwdGlvbihkZXNjcmlwdGlvbikge1xyXG4gICAgICAgIGlmIChkZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcclxuICAgICAgICBpZiAobGFuZ3VhZ2UpXHJcbiAgICAgICAgICAgIHRoaXMuX2xhbmd1YWdlID0gbGFuZ3VhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNvdXJjZVBhY2thZ2VVUkwoc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgICAgIGlmIChzb3VyY2VQYWNrYWdlVVJMKVxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VQYWNrYWdlVVJMID0gc291cmNlUGFja2FnZVVSTDtcclxuICAgIH1cclxufVxyXG4vL0FsaWNlOiByZW1vdmVkIFBPTElDWV9FTkZPUkNFUjogJ3BvbGljeV9lbmZvcmNlcicsIERBVEFfU0NIRU1BOiAnZGF0YV9zY2hlbWEnIGZyb20gdGhlIGxpc3RcclxuLy93cnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvZGV2LXNlcnZpY2UtZnJhbWV3b3JrL2Jsb2IvZGV2ZWxvcC9kb2NzL2RhdGFtb2RlbC9jb3JlL2h5cGVydHktY2F0YWxvZ3VlL3JlYWRtZS5tZCNkYXRhLW9iamVjdC1zY2hlbWFcclxuZXhwb3J0IGNvbnN0IENhdGFsb2d1ZU9iamVjdFR5cGUgPSB7XHJcbiAgICBIWVBFUlRZOiAnaHlwZXJ0eScsIFBST1RPU1RVQjogJ3Byb3Rvc3R1YicsIEhZUEVSVFlfUlVOVElNRTogJ2h5cGVydHlfcnVudGltZScsXHJcbiAgICBIWVBFUlRZX0lOVEVSQ0VQVE9SOiAnaHlwZXJ0eV9pbnNwZWN0b3InLCBIWVBFUlRZX0RBVEFfT0JKRUNUOiAnaHlwZXJ0eV9kYXRhX29iamVjdCdcclxufTtcclxuZXhwb3J0IGNvbnN0IERhdGFPYmplY3RTb3VyY2VMYW5ndWFnZSA9IHtcclxuICAgIEpBVkFTQ1JJUFRfRUNNQTY6ICdqYXZhc2NyaXB0X2VjbWE2JywgSkFWQVNDUklQVF9FQ01BNTogJ2phdmFzY3JpcHRfZWNtYTUnLFxyXG4gICAgSlNPTl9TQ0hFTUFfVjQ6ICdqc29uX3NjaGVtYV92NCcsIFBZVEhPTjogJ3B5dGhvbicsIFRZUEVTQ1JJUFQ6ICd0eXBlc2NyaXB0J1xyXG59O1xyXG5leHBvcnQgZGVmYXVsdCBDYXRhbG9ndWVEYXRhT2JqZWN0OyIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGFtbyBvbiAxNC8xMS8yMDE1LlxyXG4gKi9cclxuY2xhc3MgU291cmNlUGFja2FnZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2VDb2RlQ2xhc3NuYW1lLCBzb3VyY2VDb2RlKSB7XHJcbiAgICAgICAgdGhpcy5fc291cmNlQ29kZSA9IHNvdXJjZUNvZGU7XHJcbiAgICAgICAgdGhpcy5fc291cmNlQ29kZUNsYXNzbmFtZSA9IHNvdXJjZUNvZGVDbGFzc25hbWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2VuY29kaW5nID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3VyY2VDb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VDb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3VyY2VDb2RlQ2xhc3NuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VDb2RlQ2xhc3NuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbmNvZGluZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpZ25hdHVyZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmF0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBlbmNvZGluZyhlbmNvZGluZykge1xyXG4gICAgICAgIGlmIChlbmNvZGluZylcclxuICAgICAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgc2lnbmF0dXJlKHNpZ24pIHtcclxuICAgICAgICBpZiAoc2lnbilcclxuICAgICAgICAgICAgdGhpcy5fc2lnbmF0dXJlID0gc2lnbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgc291cmNlQ29kZShzb3VyY2VDb2RlKSB7XHJcbiAgICAgICAgaWYgKHNvdXJjZUNvZGUpXHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZUNvZGUgPSBzb3VyY2VDb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBzb3VyY2VDb2RlQ2xhc3NuYW1lKHNvdXJjZUNvZGVDbGFzc25hbWUpIHtcclxuICAgICAgICBpZiAoc291cmNlQ29kZUNsYXNzbmFtZSlcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlQ29kZUNsYXNzbmFtZSA9IHNvdXJjZUNvZGVDbGFzc25hbWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNvdXJjZVBhY2thZ2U7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGFtbyBvbiAxNC8xMS8yMDE1LlxyXG4gKi9cclxuaW1wb3J0IENhdGFsb2d1ZURhdGFPYmplY3QgZnJvbSAnLi9DYXRhbG9ndWVEYXRhT2JqZWN0JztcclxuXHJcbmNsYXNzIEh5cGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgQ2F0YWxvZ3VlRGF0YU9iamVjdCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0IGVuYWJsaW5nIHRoZSBzYW1lIG9iamVjdCB0byBiZVxyXG4gICAgICogc3RvcmVkIGFuZCBkaXNjb3ZlcmVkIGluIGRpZmZlcmVudCBDYXRhbG9ndWVzLiBHdWlkIGNvcnJlc3BvbmRzIHRvIDxyZXNvdXJjZS10eXBlLWlkPiBwZXIgQk5GIG9mIFJlc291cmNlIFBhdGguXHJcbiAgICAgKiBAcGFyYW0ge0NhdGFsb2d1ZU9iamVjdFR5cGV9IGNhdGFsb2d1ZVR5cGUgLSBcdEluZGljYXRlcyB0aGUgdHlwZSBvZiBDYXRhbG9ndWUgRGF0YSBPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMXHJcbiAgICAgKiBAcGFyYW0ge0h5cGVydHlSZXNvdXJjZVR5cGVbXX0gaHlwZXJ0eVR5cGUgQSB0YWcgdGhhdCBpZGVudGlmaWVzIHdoYXQgdHlwZSBvZiBoeXBlcnR5IGlzIGRlc2NyaWJlZCBpbiB0aGUgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtVUkwuSHlwZXJ0eUNhdGFsb2d1ZVVSTExpc3R9IGRhdGFPYmplY3RVcmxzIC0gSXQgZGVmaW5lcyB0aGUgRGF0YSBPYmplY3QgU2NoZW1hcyBzdXBwb3J0ZWQgYnkgdGhlIEh5cGVydHlcclxuICAgICAqIHRocm91Z2ggYSBsaXN0IG9mIENhdGFsb2d1ZSBVUkxzIGZyb20gd2hlcmUgdGhlc2Ugc2NoZW1hcyBjYW4gYmUgcmVhY2hlZFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCBjYXRhbG9ndWVUeXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0VXJscykge1xyXG4gICAgICAgIHN1cGVyKGd1aWQsIGNhdGFsb2d1ZVR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSB7fTtcclxuICAgICAgICB0aGlzLl9jb25zdHJhaW50cyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3BvbGljaWVzID0ge307XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNjaGVtYSA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuX2h5cGVydHlUeXBlID0gaHlwZXJ0eVR5cGU7XHJcbiAgICAgICAgdGhpcy5fZGF0YU9iamVjdHMgPSBkYXRhT2JqZWN0VXJscztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaHlwZXJ0eVR5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkYXRhT2JqZWN0cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YU9iamVjdHM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnN0cmFpbnRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdHJhaW50cztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWVzc2FnZVNjaGVtYSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZVNjaGVtYTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcG9saWNpZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvbGljaWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBoeXBlcnR5VHlwZShoVHlwZSkge1xyXG4gICAgICAgIGlmIChoVHlwZSlcclxuICAgICAgICAgICAgdGhpcy5faHlwZXJ0eVR5cGUgPSBoVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZGF0YU9iamVjdHMoZGF0YU9iamVjdHMpIHtcclxuICAgICAgICBpZiAoZGF0YU9iamVjdHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzID0gZGF0YU9iamVjdHM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY29uc3RyYWludHMoY29uc3RyYWludHMpIHtcclxuICAgICAgICBpZiAoY29uc3RyYWludHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG1lc3NhZ2VTY2hlbWEobWVzc2FnZVNjaGVtYSkge1xyXG4gICAgICAgIGlmIChtZXNzYWdlU2NoZW1hKVxyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2NoZW1hID0gbWVzc2FnZVNjaGVtYTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgcG9saWNpZXMocG9saWNpZXMpIHtcclxuICAgICAgICBpZiAocG9saWNpZXMpXHJcbiAgICAgICAgICAgIHRoaXMuX3BvbGljaWVzID0gcG9saWNpZXM7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IFJ1bnRpbWVIeXBlcnR5Q2FwYWJpbGl0eVR5cGUgPSB7fTtcclxuZXhwb3J0IGNvbnN0IEh5cGVydHlUeXBlID0ge0NPTU1VTklDQVRPUjogJ2NvbW11bmljYXRvcicsIElERU5USVRZOiAnaWRlbnRpdHknLCBDT05URVhUOiAnY29udGV4dCd9O1xyXG5leHBvcnQgY29uc3QgSHlwZXJ0eVJlc291cmNlVHlwZSA9IHtjaGF0OiAnQ0hBVCcsIGF1ZGlvOiAnQXVkaW8nLCB2aWRlbzogJ1ZpZGVvJywgYXY6ICdBVicsIHNjcmVlbjonU0NSRUVOJyxcclxuICAgIGZpbGU6ICdGSUxlJywgbWlkaTonTUlESSd9O1xyXG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5RGVzY3JpcHRvcjsiLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogQ3JlYXRlZCBieSBhbW8gb24gMTQvMTEvMjAxNS5cclxuICovXHJcblxyXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCBmcm9tIFwiLi9DYXRhbG9ndWVEYXRhT2JqZWN0XCI7XHJcblxyXG5jbGFzcyBQcm90b2NvbFN0dWJEZXNjcmlwdG9yIGV4dGVuZHMgQ2F0YWxvZ3VlRGF0YU9iamVjdCB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIG1lc3NhZ2VTY2hlbWFzLCBjb25maWd1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgY29uc3RyYWludHMsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0cywgaW50ZXJ3b3JraW5nLCBpZHBQcm94eSwgbXV0dWFsQXV0aGVudGljYXRpb24pIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG5cclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2NoZW1hcyA9IG1lc3NhZ2VTY2hlbWFzO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbilcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0ge307XHJcblxyXG4gICAgICAgIGlmIChjb25zdHJhaW50cylcclxuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWludHMgPSBjb25zdHJhaW50cztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbnRzID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuX2h5cGVydHlUeXBlID0gaHlwZXJ0eVR5cGU7XHJcblxyXG4gICAgICAgIGlmIChkYXRhT2JqZWN0cylcclxuICAgICAgICAgICAgdGhpcy5fZGF0YU9iamVjdHMgPSBkYXRhT2JqZWN0cztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzID0gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5faW50ZXJ3b3JraW5nID0gaW50ZXJ3b3JraW5nO1xyXG4gICAgICAgIHRoaXMuX2lkcFByb3h5ID0gaWRwUHJveHk7XHJcbiAgICAgICAgdGhpcy5fbXV0dWFsQXV0aGVudGljYXRpb24gPSBtdXR1YWxBdXRoZW50aWNhdGlvbjtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1lc3NhZ2VTY2hlbWFzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlU2NoZW1hcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29uc3RyYWludHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0cmFpbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWd1cmF0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBtZXNzYWdlU2NoZW1hcyhtZXNzYWdlU2NoZW1hcykge1xyXG4gICAgICAgIGlmIChtZXNzYWdlU2NoZW1hcylcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNjaGVtYXMgPSBtZXNzYWdlU2NoZW1hcztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY29uc3RyYWludHMoY29uc3RyYWludHMpIHtcclxuICAgICAgICBpZiAoY29uc3RyYWludHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaHlwZXJ0eVR5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBoeXBlcnR5VHlwZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2h5cGVydHlUeXBlID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRhdGFPYmplY3RzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhT2JqZWN0cztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZGF0YU9iamVjdHModmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9kYXRhT2JqZWN0cyA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbnRlcndvcmtpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVyd29ya2luZztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaW50ZXJ3b3JraW5nKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5faW50ZXJ3b3JraW5nID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlkcFByb3h5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pZHBQcm94eTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaWRwUHJveHkodmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9pZHBQcm94eSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtdXR1YWxBdXRoZW50aWNhdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbXV0dWFsQXV0aGVudGljYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG11dHVhbEF1dGhlbnRpY2F0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fbXV0dWFsQXV0aGVudGljYXRpb24gPSB2YWx1ZTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJvdG9jb2xTdHViRGVzY3JpcHRvcjsiLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogQ3JlYXRlZCBieSBhbW8gb24gMTQvMTEvMjAxNS5cclxuICovXHJcblxyXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCBmcm9tIFwiLi9DYXRhbG9ndWVEYXRhT2JqZWN0XCI7XHJcblxyXG5jbGFzcyBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IgZXh0ZW5kcyBDYXRhbG9ndWVEYXRhT2JqZWN0IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCBjYXRhbG9ndWVUeXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIHJ1bnRpbWVUeXBlLFxyXG4gICAgICAgICAgICAgICAgaHlwZXJ0eUNhcGFiaWxpdGllcywgcHJvdG9jb2xDYXBhYmlsaXRpZXMsIHAycEhhbmRsZXJTdHViLCBwMnBSZXF1ZXN0ZXJTdHViKSB7XHJcbiAgICAgICAgc3VwZXIoZ3VpZCwgY2F0YWxvZ3VlVHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcnVudGltZVR5cGUgPSBydW50aW1lVHlwZTtcclxuXHJcbiAgICAgICAgaWYgKGh5cGVydHlDYXBhYmlsaXRpZXMpXHJcbiAgICAgICAgICAgIHRoaXMuX2h5cGVydHlDYXBhYmlsaXRpZXMgPSBoeXBlcnR5Q2FwYWJpbGl0aWVzO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5faHlwZXJ0eUNhcGFiaWxpdGllcyA9IG5ldyBSdW50aW1lSHlwZXJ0eUNhcGFiaWxpdHkodHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChwcm90b2NvbENhcGFiaWxpdGllcylcclxuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xDYXBhYmlsaXRpZXMgPSBwcm90b2NvbENhcGFiaWxpdGllcztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sQ2FwYWJpbGl0aWVzID0gbmV3IFJ1bnRpbWVQcm90b2NvbENhcGFiaWxpdHkodHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLl9wMnBIYW5kbGVyU3R1YiA9IHAycEhhbmRsZXJTdHViO1xyXG4gICAgICAgIHRoaXMuX3AycFJlcXVlc3RlclN0dWIgPSBwMnBSZXF1ZXN0ZXJTdHViO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBydW50aW1lVHlwZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcnVudGltZVR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGh5cGVydHlDYXBhYmlsaXRpZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlDYXBhYmlsaXRpZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb3RvY29sQ2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9oeXBlcnR5Q2FwYWJpbGl0aWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBydW50aW1lVHlwZShydW50aW1lVHlwZSkge1xyXG4gICAgICAgIGlmIChydW50aW1lVHlwZSlcclxuICAgICAgICAgICAgdGhpcy5fcnVudGltZVR5cGUgPSBydW50aW1lVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaHlwZXJ0eUNhcGFiaWxpdGllcyhoeXBlcnR5Q2FwYWJpbGl0aWVzKSB7XHJcbiAgICAgICAgaWYgKGh5cGVydHlDYXBhYmlsaXRpZXMpXHJcbiAgICAgICAgICAgIHRoaXMuX2h5cGVydHlDYXBhYmlsaXRpZXMgPSBoeXBlcnR5Q2FwYWJpbGl0aWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBwcm90b2NvbENhcGFiaWxpdGllcyhwcm90b2NvbENhcGFiaWxpdGllcykge1xyXG4gICAgICAgIGlmIChwcm90b2NvbENhcGFiaWxpdGllcylcclxuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xDYXBhYmlsaXRpZXMgPSBwcm90b2NvbENhcGFiaWxpdGllcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcDJwSGFuZGxlclN0dWIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3AycEhhbmRsZXJTdHViO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBwMnBIYW5kbGVyU3R1Yih2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3AycEhhbmRsZXJTdHViID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHAycFJlcXVlc3RlclN0dWIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3AycFJlcXVlc3RlclN0dWI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHAycFJlcXVlc3RlclN0dWIodmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9wMnBSZXF1ZXN0ZXJTdHViID0gdmFsdWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjYXBhYmlsaXR5IHNldCBvZiB0aGUgUnVudGltZSBIeXBlcnR5XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUnVudGltZUh5cGVydHlDYXBhYmlsaXR5IHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgb2YgdGhlIFJ1bnRpbWUgSHlwZXJ0eSBjYXBhYmlsaXR5IHNldFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc1dlYlJUQ1N1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc01pY1N1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0NhbWVyYVN1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc1NlbnNvclN1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc09SVENTdXBwb3J0ZWRcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaXNXZWJSVENTdXBwb3J0ZWQsIGlzTWljU3VwcG9ydGVkLCBpc0NhbWVyYVN1cHBvcnRlZCwgaXNTZW5zb3JTdXBwb3J0ZWQsIGlzT1JUQ1N1cHBvcnRlZCkge1xyXG4gICAgICAgIHRoaXMuX2lzV2ViUlRDID0gaXNXZWJSVENTdXBwb3J0ZWQ7XHJcbiAgICAgICAgdGhpcy5faXNNaWMgPSBpc01pY1N1cHBvcnRlZDtcclxuICAgICAgICB0aGlzLl9pc0NhbWVyYSA9IGlzQ2FtZXJhU3VwcG9ydGVkO1xyXG4gICAgICAgIHRoaXMuX2lzU2Vuc29yID0gaXNTZW5zb3JTdXBwb3J0ZWQ7XHJcbiAgICAgICAgdGhpcy5faXNPUlRDID0gaXNPUlRDU3VwcG9ydGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc01pYygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNNaWM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzQ2FtZXJhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbWVyYTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNTZW5zb3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2Vuc29yO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc1dlYlJUQygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNXZWJSVEM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzT1JUQ1MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzT1JUQztcclxuICAgIH1cclxuXHJcbiAgICBnZXRDYXBhYmlsaXR5U2V0KCkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm90b2NvbCBjYXBhYmlsaXR5IHNldCBvZiB0aGUgUnVudGltZSBIeXBlcnR5XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUnVudGltZVByb3RvY29sQ2FwYWJpbGl0eSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBvZiB0aGUgcnVudGltZSBwcm90b2NvbCBjYXBhYmlsaXR5XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzSHR0cFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0h0dHBzXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzV1NcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNXU1NcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNDb2FwXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRGF0YUNoYW5uZWxcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaXNIdHRwLCBpc0h0dHBzLCBpc1dTLCBpc1dTUywgaXNDb2FwLCBpc0RhdGFDaGFubmVsKSB7XHJcbiAgICAgICAgdGhpcy5faXNIdHRwID0gaXNIdHRwO1xyXG4gICAgICAgIHRoaXMuX2lzSHR0cHMgPSBpc0h0dHBzO1xyXG4gICAgICAgIHRoaXMuX2lzV1MgPSBpc1dTO1xyXG4gICAgICAgIHRoaXMuX2lzV1NTID0gaXNXU1M7XHJcbiAgICAgICAgdGhpcy5faXNDb2FwID0gaXNDb2FwO1xyXG4gICAgICAgIHRoaXMuX2lzRGF0YUNoYW5uZWwgPSBpc0RhdGFDaGFubmVsO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSHR0cCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNIdHRwO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSHR0cHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzSHR0cHM7XHJcbiAgICB9XHJcblxyXG4gICAgaXNXUygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNXUztcclxuICAgIH1cclxuXHJcbiAgICBpc1NlbnNvclN1cHBvcnRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNTZW5zb3I7XHJcbiAgICB9XHJcblxyXG4gICAgaXNXU1MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzV1NTO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQ29hcCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNDb2FwO1xyXG4gICAgfVxyXG5cclxuICAgIGlzRGF0YUNoYW5uZWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGF0YUNoYW5uZWw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldENhcGFiaWxpdHlTZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUnVudGltZVR5cGUgPSB7QlJPV1NFUjogJ2Jyb3dzZXInLCBTVEFOREFMT05FOiAnc3RhbmRhbG9uZScsIFNFUlZFUjogJ3NlcnZlcicsIEdBVEVXQVk6ICdnYXRld2F5J307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5UnVudGltZURlc2NyaXB0b3I7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IHB6dSBvbiAxOS4xMS4xNS5cclxuICovXHJcbmltcG9ydCBDYXRhbG9ndWVEYXRhT2JqZWN0IGZyb20gJy4vQ2F0YWxvZ3VlRGF0YU9iamVjdCc7XHJcblxyXG5jbGFzcyBQb2xpY3lFbmZvcmNlckRlc2NyaXB0b3IgZXh0ZW5kcyBDYXRhbG9ndWVEYXRhT2JqZWN0IHtcclxuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgY29uZmlndXJhdGlvbiwgcG9saWNpZXMpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG5cclxuICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgICAgICB0aGlzLl9wb2xpY2llcyA9IHBvbGljaWVzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWd1cmF0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwb2xpY2llcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9saWNpZXM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHBvbGljaWVzKHBvbGljaWVzKSB7XHJcbiAgICAgICAgdGhpcy5fcG9saWNpZXMgPSBwb2xpY2llcztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvbGljeUVuZm9yY2VyRGVzY3JpcHRvcjsiLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuICogQ3JlYXRlZCBieSBwenUgb24gMTkuMTEuMTUuXHJcbiAqL1xyXG5cclxuaW1wb3J0IENhdGFsb2d1ZURhdGFPYmplY3QgZnJvbSAnLi9DYXRhbG9ndWVEYXRhT2JqZWN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgQ2F0YWxvZ3VlRGF0YU9iamVjdCB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuXHJcbi8vQ2hpbGRyZW5cclxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgRGF0YU9iamVjdFNjaGVtYSB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEgZXh0ZW5kcyBEYXRhT2JqZWN0U2NoZW1hIHtcclxuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgYWNjZXNzQ29udHJvbFBvbGljeSwgZGF0YVVybFNjaGVtZSkge1xyXG4gICAgICAgIHN1cGVyKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzQ29udHJvbFBvbGljeSA9IGFjY2Vzc0NvbnRyb2xQb2xpY3k7XHJcbiAgICAgICAgdGhpcy5fc2NoZW1lID0gZGF0YVVybFNjaGVtZTtcclxuICAgIH1cclxufVxyXG5cclxuLy9DaGlsZHJlblxyXG5leHBvcnQgY2xhc3MgQ29tbXVuaWNhdGlvbkRhdGFPYmplY3RTY2hlbWEgZXh0ZW5kcyBIeXBlcnR5RGF0YU9iamVjdFNjaGVtYSB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkRhdGFPYmplY3RTY2hlbWEgZXh0ZW5kcyBIeXBlcnR5RGF0YU9iamVjdFNjaGVtYSB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEge1xyXG4gICAgY29uc3RydWN0b3IoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KSB7XHJcbiAgICAgICAgc3VwZXIoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRleHREYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEge1xyXG4gICAgY29uc3RydWN0b3IoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KSB7XHJcbiAgICAgICAgc3VwZXIoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERhdGFVcmxTY2hlbWUgPSB7XHJcbiAgICBDT01NOiAnQ09NTScsIENPTk5FQ1RJT046ICdDT05ORUNUSU9OJywgQ1RYVDogJ0NUWFQnLCBJREVOVElUWTogJ0lERU5USVRZJ1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGF0YU9iamVjdFNjaGVtYTsiLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcblxyXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCwge0NhdGFsb2d1ZU9iamVjdFR5cGUsIERhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gZnJvbSBcIi4vQ2F0YWxvZ3VlRGF0YU9iamVjdFwiO1xyXG5pbXBvcnQgU291cmNlUGFja2FnZSBmcm9tIFwiLi9Tb3VyY2VQYWNrYWdlXCI7XHJcbmltcG9ydCBIeXBlcnR5RGVzY3JpcHRvciBmcm9tIFwiLi9IeXBlcnR5RGVzY3JpcHRvclwiO1xyXG5pbXBvcnQgUHJvdG9jb2xTdHViRGVzY3JpcHRvciBmcm9tIFwiLi9Qcm90b2NvbFN0dWJEZXNjcmlwdG9yXCI7XHJcbmltcG9ydCBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IsIHtSdW50aW1lVHlwZX0gZnJvbSBcIi4vSHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yXCI7XHJcbmltcG9ydCBIeXBlcnR5SW50ZXJjZXB0b3JEZXNjcmlwdG9yIGZyb20gXCIuL0h5cGVydHlJbnRlcmNlcHRvckRlc2NyaXB0b3JcIjtcclxuaW1wb3J0IHtcclxuICAgIERhdGFPYmplY3RTY2hlbWEsXHJcbiAgICBEYXRhVXJsU2NoZW1lLFxyXG4gICAgQ29tbXVuaWNhdGlvbkRhdGFPYmplY3RTY2hlbWEsXHJcbiAgICBDb25uZWN0aW9uRGF0YU9iamVjdFNjaGVtYSxcclxuICAgIENvbnRleHREYXRhT2JqZWN0U2NoZW1hLFxyXG4gICAgSWRlbnRpdHlEYXRhT2JqZWN0U2NoZW1hXHJcbn0gZnJvbSBcIi4vRGF0YU9iamVjdFNjaGVtYVwiO1xyXG5cclxuY2xhc3MgQ2F0YWxvZ3VlRGF0YU9iamVjdEZhY3Rvcnkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIENhdGFsb2d1ZURhdGFPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtDYXRhbG9ndWVPYmplY3RUeXBlfSB0eXBlIC0gSW5kaWNhdGVzIHRoZSB0eXBlIG9mIENhdGFsb2d1ZSBEYXRhIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBQcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3QgY2FuIGJlIGRvd25sb2FkZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7Q2F0YWxvZ3VlRGF0YU9iamVjdH1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlQ2F0YWxvZ3VlRGF0YU9iamVjdChndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiBndWlkID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB0eXBlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBvYmplY3ROYW1lID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBkZXNjcmlwdGlvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHNvdXJjZVBhY2thZ2VVUkwgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICApXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVycyFcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDYXRhbG9ndWVEYXRhT2JqZWN0KGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgSHlwZXJ0eURlc2NyaXB0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBQcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3RcclxuICAgICAqIGNhbiBiZSBkb3dubG9hZGVkLlxyXG4gICAgICogQHBhcmFtIHtIeXBlcnR5UmVzb3VyY2VUeXBlW119IGh5cGVydHlUeXBlIC0gQW4gYXJyYXkgb2YgSHlwZXJ0eVJlc291cmNlVHlwZSB0aGF0IGlkZW50aWZpZXMgd2hhdCB0eXBlIG9mIGh5cGVydHlcclxuICAgICAqIHJlc291cmNlcyBhcmUgaGFuZGxlZCBieSB0aGUgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtVUkwuVVJMTGlzdH0gZGF0YU9iamVjdHMgLSBEZWZpbmVzIHRoZSBEYXRhIE9iamVjdCBTY2hlbWFzIHN1cHBvcnRlZCBieSB0aGUgSHlwZXJ0eSB0aHJvdWdoIGEgbGlzdCBvZiBDYXRhbG9ndWUgVVJMcyBmcm9tIHdoZXJlIHRoZXNlIHNjaGVtYXMgY2FuIGJlIHJlYWNoZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eURlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUh5cGVydHlEZXNjcmlwdG9yT2JqZWN0KGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgaHlwZXJ0eVR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0cykge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHZlcnNpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIG9iamVjdE5hbWUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlUGFja2FnZVVSTCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgaHlwZXJ0eVR5cGUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRhdGFPYmplY3RzID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgSHlwZXJ0eURlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgUHJvdG9jb2xTdHViRGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cclxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cclxuICAgICAqIEBwYXJhbSB7VVJMLlVSTH0gbWVzc2FnZVNjaGVtYXMgLSBEZWZpbmVzIHRoZSBTY2hlbWEgZGVzY3JpYmluZyB0aGUgTWVzc2FnZSBEYXRhIE1vZGVsIHVzZWQgYnkgdGhlIEh5cGVydHkgdGhyb3VnaCB0aGUgQ2F0YWxvZ3VlIFVSTCBmcm9tIHdoZXJlIHRoZSBNZXNzYWdlIHNjaGVtYSBjYW4gYmUgcmVhY2hlZC4gSWYgbm90IGRlZmluZWQsIGJ5IGRlZmF1bHQgaXQgaXMgYXNzdW1lZCB0aGUgc3RhbmRhcmQgTWVzc2FnZSBNb2RlbCBpcyB1c2VkLlxyXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gLSBEYXRhIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUgUHJvdG9jb2xTdHViXHJcbiAgICAgKiBAcGFyYW0gY29uc3RyYWludHMgLSBEZXNjcmliZXMgY2FwYWJpbGl0aWVzIHJlcXVpcmVkIGZyb20gdGhlIEh5cGVydHkgUnVudGltZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGV4ZWN1dGUgdGhlIFByb3RvY29sU3R1YlxyXG4gICAgICogQHBhcmFtIGh5cGVydHlUeXBlXHJcbiAgICAgKiBAcGFyYW0gZGF0YU9iamVjdHNcclxuICAgICAqIEBwYXJhbSBpbnRlcndvcmtpbmdcclxuICAgICAqIEBwYXJhbSBpZHBQcm94eVxyXG4gICAgICogQHBhcmFtIG11dHVhbEF1dGhlbnRpY2F0aW9uXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvdG9jb2xTdHViRGVzY3JpcHRvcn1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlUHJvdG9TdHViRGVzY3JpcHRvck9iamVjdChndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIG1lc3NhZ2VTY2hlbWFzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLCBjb25zdHJhaW50cywgaHlwZXJ0eVR5cGUsIGRhdGFPYmplY3RzLCBpbnRlcndvcmtpbmcsIGlkcFByb3h5LCBtdXR1YWxBdXRoZW50aWNhdGlvbikge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHZlcnNpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIG9iamVjdE5hbWUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlUGFja2FnZVVSTCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgbWVzc2FnZVNjaGVtYXMgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGNvbmZpZ3VyYXRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGNvbnN0cmFpbnRzID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xTdHViRGVzY3JpcHRvcihndWlkLCBDYXRhbG9ndWVPYmplY3RUeXBlLlBST1RPU1RVQiwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBtZXNzYWdlU2NoZW1hcywgY29uZmlndXJhdGlvbiwgY29uc3RyYWludHMsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0cywgaW50ZXJ3b3JraW5nLCBpZHBQcm94eSwgbXV0dWFsQXV0aGVudGljYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlSdW50aW1lRGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cclxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cclxuICAgICAqIEBwYXJhbSB7UnVudGltZVR5cGV9cnVudGltZVR5cGVcclxuICAgICAqIEBwYXJhbSB7UnVudGltZUh5cGVydHlDYXBhYmlsaXRpZXN9IGh5cGVydHlDYXBhYmlsaXRpZXMgLSBTdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIHRvIGV4ZWN1dGUgSHlwZXJ0aWVzXHJcbiAgICAgKiBAcGFyYW0ge1J1bnRpbWVQcm90b2NvbENhcGFiaWxpdGllc30gcHJvdG9jb2xDYXBhYmlsaXRpZXMgLSBTdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIHRvIGV4ZWN1dGUgUHJvdG9jb2wgU3R1YnNcclxuICAgICAqIEBwYXJhbSBwMnBIYW5kbGVyU3R1YlxyXG4gICAgICogQHBhcmFtIHAycFJlcXVlc3RlclN0dWJcclxuICAgICAqIEByZXR1cm5zIHtIeXBlcnR5UnVudGltZURlc2NyaXB0b3J9IHRoZSBkYXRhIG9iamVjdCBvZiB0aGUgSHlwZXJ0eSBSdW50aW1lIERlc2NyaXB0b3JcclxuICAgICAqL1xyXG4gICAgY3JlYXRlSHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yT2JqZWN0KGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lVHlwZSwgaHlwZXJ0eUNhcGFiaWxpdGllcywgcHJvdG9jb2xDYXBhYmlsaXRpZXMsIHAycEhhbmRsZXJTdHViLCBwMnBSZXF1ZXN0ZXJTdHViKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgdmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGxhbmd1YWdlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBydW50aW1lVHlwZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX1JVTlRJTUUsIHZlcnNpb24sIG9iamVjdE5hbWUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgcnVudGltZVR5cGUsIGh5cGVydHlDYXBhYmlsaXRpZXMsIHByb3RvY29sQ2FwYWJpbGl0aWVzLCBwMnBIYW5kbGVyU3R1YiwgcDJwUmVxdWVzdGVyU3R1Yik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgSHlwZXJ0eSBJbnRlcmNlcHRvciBEZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCAtIENhdGFsb2d1ZSBHbG9iYWwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIENhdGFsb2d1ZSBPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSAtIEh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxyXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhY2thZ2VVUkwgLSBVUkwgZnJvbSB3aGVyZSB0aGUgc291cmNlIGNvZGUgcGFja2FnZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRhbG9ndWUgb2JqZWN0IGNhbiBiZSBkb3dubG9hZGVkLlxyXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25cclxuICAgICAqIEBwYXJhbSBwb2xpY2llc1xyXG4gICAgICogQHJldHVybnMge1BvbGljeUVuZm9yY2VyRGVzY3JpcHRvcn1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlSHlwZXJ0eUludGVyY2VwdG9yRGVzY3JpcHRvck9iamVjdChndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGNvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljaWVzKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgdmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGxhbmd1YWdlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IEh5cGVydHlJbnRlcmNlcHRvckRlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0lOVEVSQ0VQVE9SLCB2ZXJzaW9uLCBvYmplY3ROYW1lLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGNvbmZpZ3VyYXRpb24sIHBvbGljaWVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBEYXRhT2JqZWN0U2NoZW1hIHdoaWNoIGluIGVmZmVjdCBpcyB0aGUgTWVzc2FnZURhdGFPYmplY3RTY2hlbWFcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBlaXRoZXIgY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWEgb3IgY3JlYXRlSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEgaW5zdGVhZFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cclxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cclxuICAgICAqIEByZXR1cm5zIHtEYXRhT2JqZWN0U2NoZW1hfVxyXG4gICAgICovXHJcbiAgICBjcmVhdGVEYXRhT2JqZWN0U2NoZW1hKGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHZlcnNpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIG9iamVjdE5hbWUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlUGFja2FnZVVSTCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhT2JqZWN0U2NoZW1hKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWV9EQVRBX09CSkVDVCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLFxyXG4gICAgICAgICAgICBzb3VyY2VQYWNrYWdlVVJMKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBEYXRhT2JqZWN0U2NoZW1hIHdoaWNoIGluIGVmZmVjdCBpcyB0aGUgTWVzc2FnZURhdGFPYmplY3RTY2hlbWFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBQcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3QgY2FuIGJlIGRvd25sb2FkZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7RGF0YU9iamVjdFNjaGVtYX1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWEoZ3VpZCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgdmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGxhbmd1YWdlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IERhdGFPYmplY3RTY2hlbWEoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0RBVEFfT0JKRUNULCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsXHJcbiAgICAgICAgICAgIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlEYXRhT2JqZWN0U2NoZW1hXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCAtIENhdGFsb2d1ZSBHbG9iYWwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIENhdGFsb2d1ZSBPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSAtIEh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxyXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhY2thZ2VVUkwgLSBVUkwgZnJvbSB3aGVyZSB0aGUgc291cmNlIGNvZGUgcGFja2FnZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRhbG9ndWUgb2JqZWN0IGNhbiBiZSBkb3dubG9hZGVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFjY2Vzc0NvbnRyb2xQb2xpY3kgLSBwb2xpY3kgcnVsZSB0byBhY2Nlc3Mgb2JqZWN0IChzZWUgUmVwb3J0ZXItT2JzZXJ2ZXIgQ29tbSBwYXR0ZXJuKVxyXG4gICAgICogQHBhcmFtIHtEYXRhVXJsU2NoZW1lfSBzY2hlbWUgLSBpZGVudGlmaWVzIHRoZSBkYXRhIHNjaGVtZSAoQ09NTSwgQ09OTkVDVElPTiwgQ1RYVCBvciBJREVOVElUWSlcclxuICAgICAqIEByZXR1cm5zIHtEYXRhT2JqZWN0U2NoZW1hfVxyXG4gICAgICovXHJcbiAgICBjcmVhdGVIeXBlcnR5RGF0YU9iamVjdFNjaGVtYShndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NDb250cm9sUG9saWN5LCBzY2hlbWUpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiBndWlkID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBvYmplY3ROYW1lID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBkZXNjcmlwdGlvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHNvdXJjZVBhY2thZ2VVUkwgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHNjaGVtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgYWNjZXNzQ29udHJvbFBvbGljeSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtZSA9PT0gRGF0YVVybFNjaGVtZS5DT01NKVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbW11bmljYXRpb25EYXRhT2JqZWN0U2NoZW1hKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWV9EQVRBX09CSkVDVCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgc2NoZW1lLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcclxuICAgICAgICBlbHNlIGlmIChzY2hlbWUgPT09IERhdGFVcmxTY2hlbWUuQ09OTkVDVElPTilcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRGF0YU9iamVjdFNjaGVtYShndWlkLCBDYXRhbG9ndWVPYmplY3RUeXBlLkhZUEVSVFlfREFUQV9PQkpFQ1QsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIHNjaGVtZSwgYWNjZXNzQ29udHJvbFBvbGljeSk7XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1lID09PSBEYXRhVXJsU2NoZW1lLkNUWFQpXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGV4dERhdGFPYmplY3RTY2hlbWEoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0RBVEFfT0JKRUNULCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBzY2hlbWUsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtZSA9PT0gRGF0YVVybFNjaGVtZS5JREVOVElUWSlcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZGVudGl0eURhdGFPYmplY3RTY2hlbWEoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0RBVEFfT0JKRUNULCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBzY2hlbWUsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSBzb3VyY2VDb2RlQ2xhc3NuYW1lIC0gVGhlIENsYXNzLW5hbWUgb2YgdGhlIFNvdXJjZUNvZGVcclxuICAgICAqIEBwYXJhbSBzb3VyY2VDb2RlIC0gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7U291cmNlUGFja2FnZX1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VDb2RlQ2xhc3NuYW1lLCBzb3VyY2VDb2RlKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2Ygc291cmNlQ29kZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlQ29kZUNsYXNzbmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VQYWNrYWdlKHNvdXJjZUNvZGVDbGFzc25hbWUsIHNvdXJjZUNvZGUpO1xyXG5cclxuICAgIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBDYXRhbG9ndWVEYXRhT2JqZWN0RmFjdG9yeTtcclxuIiwiLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignUnVudGltZUNhdGFsb2d1ZScpO1xyXG5cclxuaW1wb3J0IENhdGFsb2d1ZUZhY3RvcnkgZnJvbSAnLi9DYXRhbG9ndWVEYXRhT2JqZWN0RmFjdG9yeSc7XHJcblxyXG5jbGFzcyBSdW50aW1lQ2F0YWxvZ3VlIHtcclxuXHJcbiAgY29uc3RydWN0b3IocnVudGltZUZhY3RvcnksIG5hbWUsIHNjaGVtYSkge1xyXG4gICAgaWYgKCFydW50aW1lRmFjdG9yeSkgdGhyb3cgRXJyb3IoJ1RoZSBjYXRhbG9ndWUgbmVlZHMgdGhlIHJ1bnRpbWVGYWN0b3J5Jyk7XHJcblxyXG4gICAgdGhpcy5fZmFjdG9yeSA9IG5ldyBDYXRhbG9ndWVGYWN0b3J5KCk7XHJcbiAgICB0aGlzLmh0dHBSZXF1ZXN0ID0gcnVudGltZUZhY3RvcnkuY3JlYXRlSHR0cFJlcXVlc3QoKTtcclxuICAgIHRoaXMuYXRvYiA9IHJ1bnRpbWVGYWN0b3J5LmF0b2IgPyBydW50aW1lRmFjdG9yeS5hdG9iIDogYXRvYjtcclxuXHJcbiAgICBjb25zdCBzdG9yYWdlTmFtZSA9IG5hbWUgPyBuYW1lIDogJ3J1bnRpbWVDYXRhbG9ndWUnO1xyXG4gICAgY29uc3Qgc3RvcmFnZVNjaGVtYSA9IHNjaGVtYSA/IHNjaGVtYSA6ICcmY2d1aWQsIGFjY2Vzc0NvbnRyb2xQb2xpY3ksIGNvbnN0cmFpbnRzLCBkYXRhT2JqZWN0cywgaHlwZXJ0eVR5cGUsIG9iamVjdE5hbWUsIHNvdXJjZVBhY2thZ2UsIHZlcnNpb24nO1xyXG5cclxuICAgIGNvbnN0IHNjaGVtYXMgPSB7fTtcclxuICAgIHNjaGVtYXNbc3RvcmFnZU5hbWVdID0gc3RvcmFnZVNjaGVtYTtcclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyID0gcnVudGltZUZhY3Rvcnkuc3RvcmFnZU1hbmFnZXIoc3RvcmFnZU5hbWUsIHNjaGVtYXMpO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IGEgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0IChEZXNjcmlwdG9yKSBmcm9tIGEgVVJMLCBhbmQgY29uc3RydWN0IGl0IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRlc2NyaXB0b3JVUkwgLSBlLmcuIG15ZG9tYWluLmNvbS8ud2VsbC1rbm93bi9oeXBlcnR5L015SHlwZXJ0eVxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY3JlYXRlRnVuYyAtIGUuZy4gY3JlYXRlSHlwZXJ0eVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZ2V0RnVsbF0gLSB3aGV0aGVyIG9yIG5vdCB0byBnZXQgZGVzY3JpcHRvciB3aXRoIHNvdXJjZVBhY2thZ2UsIG9yIG9ubHkgdGhlIGRlc2NyaXB0b3IgcGFydFxyXG4gICAgICogQHBhcmFtIHtKU09OfSBjb25zdHJhaW50cyAtIGNvbnN0cmFpbnRzIG9iamVjdFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IC0gUHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpdGggdGhlIHJlcXVlc3RlZCBkZXNjcmlwdG9yIGluIHRoZSBhcHByb3ByaWF0ZSB0eXBlLlxyXG4gICAgICogSWYgY29uc3RyYWludHMgd2VyZSBwcm92aWRlZCwgYSBkZXNjcmlwdG9yIGlzIG9ubHkgcmV0dXJuZWQgaWYgaXQgbWVldHMgdGhlIGNvbnN0cmFpbnRzLCBvdGhlcndpc2UgdGhlIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cclxuICAgICAqL1xyXG4gIGdldERlc2NyaXB0b3IoZGVzY3JpcHRvclVSTCwgY3JlYXRlRnVuYywgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICBsb2cuaW5mbygnW1J1bnRpbWVDYXRhbG9ndWVdIC0gZ2V0dGluZyBkZXNjcmlwdG9yIGZyb206ICcsIGRlc2NyaXB0b3JVUkwsICcgd2l0aCBjb25zdHJhaW50czogJywgY29uc3RyYWludHMpO1xyXG5cclxuICAgIC8vIHNvbWUgZmxhZ3MgZm9yIG9wdGltaXphdGlvblxyXG4gICAgLy8gKGxhdGVyIHRoZSBkZXNjcmlwdG9yIHdpbGwgbm90IGJlIHNhdmVkIGluIGNhc2UgYm90aCBvZiB0aGVzZSBib29sZWFucyBhcmUgdHJ1ZSlcclxuICAgIGxldCBpc1NhdmVkRGVzY3JpcHRvciA9IGZhbHNlO1xyXG4gICAgbGV0IGlzQ29tcGxldGVEZXNjcmlwdG9yID0gZmFsc2U7XHJcblxyXG4gICAgLy8gZ2V0IHJhdyBkZXNjcmlwdG9yXHJcbiAgICAvLyBmaXJzdCBjaGVja3MgaWYgZGVzY3JpcHRvciBpcyBhbHJlYWR5IGluIGxvY2FsU3RvcmFnZSAoYmFzZWQgb24gY2d1aWQgYW5kIHZlcnNpb24pXHJcbiAgICBsZXQgZGVzY3JpcHRvclByb21pc2U7XHJcbiAgICBpZiAoY29uc3RyYWludHMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGRlc2NyaXB0b3JQcm9taXNlID0gUHJvbWlzZS5hbGwoW3RoaXMuaHR0cFJlcXVlc3QucG9zdChkZXNjcmlwdG9yVVJMICsgJy92ZXJzaW9uJywge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pLCB0aGlzLmh0dHBSZXF1ZXN0LnBvc3QoZGVzY3JpcHRvclVSTCArICcvY2d1aWQnLCB7Ym9keTogSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpfSldKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGVzY3JpcHRvclByb21pc2UgPSBQcm9taXNlLmFsbChbdGhpcy5odHRwUmVxdWVzdC5nZXQoZGVzY3JpcHRvclVSTCArICcvdmVyc2lvbicpLCB0aGlzLmh0dHBSZXF1ZXN0LmdldChkZXNjcmlwdG9yVVJMICsgJy9jZ3VpZCcpXSlcclxuICAgIH1cclxuICAgIGRlc2NyaXB0b3JQcm9taXNlID0gZGVzY3JpcHRvclByb21pc2UudGhlbigoW3ZlcnNpb24sIGNndWlkXSkgPT4ge1xyXG4gICAgICBsb2cubG9nKCdbUnVudGltZUNhdGFsb2d1ZS5nZXREZXNjcmlwdG9yXSAtIGdvdCB2ZXJzaW9uICgnICsgdmVyc2lvbiArICcpIGFuZCBjZ3VpZCAoJyArIGNndWlkICsgJykgZm9yIGRlc2NyaXB0b3IgJyArIGRlc2NyaXB0b3JVUkwpO1xyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgc2FtZSB2ZXJzaW9uIGlzIGNvbnRhaW5lZCBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0VmVyc2lvbignY2d1aWQnLCBjZ3VpZCkudGhlbigoZGJWZXJzaW9uKSA9PiB7XHJcbiAgICAgICAgaWYgKGRiVmVyc2lvbiA+PSB2ZXJzaW9uKSB7XHJcbiAgICAgICAgICBsb2cubG9nKCdbUnVudGltZUNhdGFsb2d1ZS5nZXREZXNjcmlwdG9yXSBsb2NhbCB2ZXJzaW9uIGlzIHVwZGF0ZWQgZm9yICcsIGRlc2NyaXB0b3JVUkwpO1xyXG4gICAgICAgICAgaXNTYXZlZERlc2NyaXB0b3IgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdjZ3VpZCcsIGNndWlkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9nLmxvZygnW1J1bnRpbWVDYXRhbG9ndWUuZ2V0RGVzY3JpcHRvcl0gbG9jYWwgdmVyc2lvbiBub3QgdXBkYXRlZCBmb3IgJywgZGVzY3JpcHRvclVSTCwgJyByZXRyaWV2aW5nIGZyb20gcmVtb3RlIGNhdGFsb2d1ZSAuLi4nKTtcclxuXHJcbiAgICAgICAgICAvLyBubyBzYXZlZCBjb3B5LCBwcm9jZWVkIHdpdGggcmV0cmlldmluZyBkZXNjcmlwdG9yXHJcbiAgICAgICAgICBsZXQgcmV0cmlldmVQcm9taXNlID0gY29uc3RyYWludHMgIT0gdW5kZWZpbmVkID8gdGhpcy5odHRwUmVxdWVzdC5wb3N0KGRlc2NyaXB0b3JVUkwsIHtib2R5OiBKU09OLnN0cmluZ2lmeShjb25zdHJhaW50cyl9KSA6IHRoaXMuaHR0cFJlcXVlc3QuZ2V0KGRlc2NyaXB0b3JVUkwpO1xyXG4gICAgICAgICAgcmV0dXJuIHJldHJpZXZlUHJvbWlzZS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBKU09OLnBhcnNlKGRlc2NyaXB0b3IpO1xyXG5cclxuICAgICAgICAgICAgLy9sb2cubG9nKFwiZ290IGRlc2NyaXB0b3I6XCIsIEpTT04uc3RyaW5naWZ5KGRlc2NyaXB0b3IsIG51bGwsIDIpKTtcclxuICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JbJ0VSUk9SJ10pIHtcclxuICAgICAgICAgICAgICAvLyBUT0RPIGhhbmRsZSBlcnJvciBwcm9wZXJseVxyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkZXNjcmlwdG9yKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgIGxldCBlcnJvclN0cmluZyA9ICdVbmFibGUgdG8gZ2V0IGRlc2NyaXB0b3IgZm9yICcgKyBkZXNjcmlwdG9yVVJMICsgKGNvbnN0cmFpbnRzICE9IHVuZGVmaW5lZCA/ICcgd2l0aCBjb25zdHJhaW50cyAnICsgY29uc3RyYWludHMgOiAnJykgKyAnOiAnICsgZXJyb3I7XHJcbiAgICAgIGxvZy5lcnJvcihlcnJvclN0cmluZyk7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclN0cmluZyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgcmV0dXJuUHJvbWlzZSA9IGRlc2NyaXB0b3JQcm9taXNlO1xyXG5cclxuICAgIC8vIGlmIGdldEZ1bGwsIGF0dGFjaCBzb3VyY2VQYWNrYWdlXHJcbiAgICBpZiAoZ2V0RnVsbCkge1xyXG4gICAgICBsb2cubG9nKCdhZGRpbmcgcHJvbWlzZSB0byBhdHRhY2ggc291cmNlUGFja2FnZScpO1xyXG4gICAgICByZXR1cm5Qcm9taXNlID0gZGVzY3JpcHRvclByb21pc2UudGhlbigoZGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgIGlmIChkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2UpIHtcclxuICAgICAgICAgIGlzQ29tcGxldGVEZXNjcmlwdG9yID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpc0NvbXBsZXRlRGVzY3JpcHRvciA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoUmF3U291cmNlUGFja2FnZShkZXNjcmlwdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmluYWxseSBjcmVhdGUgb2JqZWN0XHJcbiAgICByZXR1cm5Qcm9taXNlID0gcmV0dXJuUHJvbWlzZS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgIC8vIHN0b3JlIGlmIG5vdCBzYXZlZCBiZWZvcmUsIG9yIGlmIGZ1bGwgZGVzY3JpcHRvciB3YXMgcmVxdWVzdGVkIGFuZCBvbmx5IHBhcnRpYWwgZGVzY3JpcHRvciB3YXMgc3RvcmVkLlxyXG4gICAgICBpZiAoIWlzU2F2ZWREZXNjcmlwdG9yIHx8IChpc1NhdmVkRGVzY3JpcHRvciAmJiAhaXNDb21wbGV0ZURlc2NyaXB0b3IgJiYgZ2V0RnVsbCkpIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldChkZXNjcmlwdG9yLmNndWlkLCBkZXNjcmlwdG9yLnZlcnNpb24sIGRlc2NyaXB0b3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjcmVhdGVGdW5jLmFwcGx5KHRoaXMsIFtkZXNjcmlwdG9yLCBjb25zdHJhaW50c10pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJldHVyblByb21pc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICAqIFVzZXMgdGhlIHNvdXJjZVBhY2thZ2VVUkwgZnJvbSB0aGUgZGVzY3JpcHRvciwgcmVxdWVzdHMgdGhlIHNvdXJjZVBhY2thZ2UgYW5kIGF0dGFjaGVzIGl0IHRvIHRoZSBkZXNjcmlwdG9yLlxyXG4gICAgICogQHBhcmFtIHtDYXRhbG9ndWVEYXRhT2JqZWN0fSBkZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gLSBmdWxmaWxscyB3aXRoIGNvbXBsZXRlIGRlc2NyaXB0b3JcclxuICAgICAqL1xyXG4gIGF0dGFjaFJhd1NvdXJjZVBhY2thZ2UoZGVzY3JpcHRvciwgY29uc3RyYWludHMpIHtcclxuICAgIGxvZy5sb2coJ2F0dGFjaGluZyByYXcgc291cmNlUGFja2FnZSBmcm9tOicsIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZXQgcmV0cmlldmVQcm9taXNlID0gY29uc3RyYWludHMgIT0gdW5kZWZpbmVkID8gdGhpcy5odHRwUmVxdWVzdC5wb3N0KGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCwge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pIDogdGhpcy5odHRwUmVxdWVzdC5nZXQoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMKTtcclxuICAgICAgcmV0cmlldmVQcm9taXNlLnRoZW4oKHNvdXJjZVBhY2thZ2UpID0+IHtcclxuICAgICAgICBzb3VyY2VQYWNrYWdlID0gSlNPTi5wYXJzZShzb3VyY2VQYWNrYWdlKTtcclxuXHJcbiAgICAgICAgLy9kZWxldGUgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMO1xyXG4gICAgICAgIC8vbG9nLmxvZyhcImF0dGFjaGluZyBzb3VyY2VQYWNrYWdlOlwiLCBzb3VyY2VQYWNrYWdlKTtcclxuICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2UgPSBzb3VyY2VQYWNrYWdlO1xyXG4gICAgICAgIHJlc29sdmUoZGVzY3JpcHRvcik7XHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IEh5cGVydHlEZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0gaHlwZXJ0eVVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL2h5cGVydHkvTXlIeXBlcnR5XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZXRGdWxsXSAtIGJvb2xlYW4gdG8gZGVjaWRlIHRvIGdldCB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZSBzb3VyY2VQYWNrYWdlIG9yIChwb3RlbnRpYWxseSkgd2l0aG91dFxyXG4gICAgICogQHBhcmFtIHtKU09OfSBjb25zdHJhaW50cyAtIGNvbnN0cmFpbnRzIG9iamVjdFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XHJcbiAgICAgKi9cclxuICBnZXRIeXBlcnR5RGVzY3JpcHRvcihoeXBlcnR5VVJMLCBnZXRGdWxsID0gdHJ1ZSwgY29uc3RyYWludHMpIHtcclxuICAgIHJldHVybiB0aGlzLmdldERlc2NyaXB0b3IoaHlwZXJ0eVVSTCwgdGhpcy5jcmVhdGVIeXBlcnR5LCBnZXRGdWxsLCBjb25zdHJhaW50cylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IFN0dWJEZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0gc3R1YlVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL3Byb3Rvc3R1Yi9NeVByb3Rvc3R1YlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZ2V0RnVsbF0gLSBib29sZWFuIHRvIGRlY2lkZSB0byBnZXQgdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGUgc291cmNlUGFja2FnZSBvciAocG90ZW50aWFsbHkpIHdpdGhvdXRcclxuICAgICAqIEBwYXJhbSB7SlNPTn0gY29uc3RyYWludHMgLSBjb25zdHJhaW50cyBvYmplY3RcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG4gICAgICovXHJcbiAgZ2V0U3R1YkRlc2NyaXB0b3Ioc3R1YlVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKHN0dWJVUkwsIHRoaXMuY3JlYXRlU3R1YiwgZ2V0RnVsbCwgY29uc3RyYWludHMpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICAqIEdldCBSdW50aW1lRGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIHJ1bnRpbWVVUkwgLSBlLmcuIG15ZG9tYWluLmNvbS8ud2VsbC1rbm93bi9ydW50aW1lL015UnVudGltZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZ2V0RnVsbF0gLSBib29sZWFuIHRvIGRlY2lkZSB0byBnZXQgdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGUgc291cmNlUGFja2FnZSBvciAocG90ZW50aWFsbHkpIHdpdGhvdXRcclxuICAgICAqIEBwYXJhbSB7SlNPTn0gY29uc3RyYWludHMgLSBjb25zdHJhaW50cyBvYmplY3RcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG4gICAgICovXHJcbiAgZ2V0UnVudGltZURlc2NyaXB0b3IocnVudGltZVVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKHJ1bnRpbWVVUkwsIHRoaXMuY3JlYXRlUnVudGltZURlc2NyaXB0b3IsIGdldEZ1bGwsIGNvbnN0cmFpbnRzKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAgKiBHZXQgRGF0YVNjaGVtYURlc2NyaXB0b3JcclxuICAgICAqIEBwYXJhbSBkYXRhU2NoZW1hVVJMIC0gZS5nLiBteWRvbWFpbi5jb20vLndlbGwta25vd24vZGF0YXNjaGVtYS9NeURhdGFTY2hlbWFcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dldEZ1bGxdIC0gYm9vbGVhbiB0byBkZWNpZGUgdG8gZ2V0IHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIHNvdXJjZVBhY2thZ2Ugb3IgKHBvdGVudGlhbGx5KSB3aXRob3V0XHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cclxuICAgICAqL1xyXG4gIGdldERhdGFTY2hlbWFEZXNjcmlwdG9yKGRhdGFTY2hlbWFVUkwsIGdldEZ1bGwgPSB0cnVlLCBjb25zdHJhaW50cykge1xyXG5cclxuICAgIC8vICAgIHJldHVybiB0aGlzLmdldERlc2NyaXB0b3IoZGF0YVNjaGVtYVVSTCwgdGhpcy5jcmVhdGVEYXRhU2NoZW1hLCBnZXRGdWxsLCBjb25zdHJhaW50cylcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PiB7XHJcbiAgICAgIGxldCBzY2hlbWEgPSBkYXRhU2NoZW1hVVJMLnNwbGl0KCcvZGF0YXNjaGVtYS8nKVsxXTtcclxuICAgICAgbG9nLmxvZygnW1J1bnRpbWVDYXRhbG9ndWUuZ2V0RGF0YVNjaGVtYURlc2NyaXB0b3JdIHNjaGVtYSAnLCBzY2hlbWEpO1xyXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IHtcclxuICAgICAgICBzb3VyY2VQYWNrYWdlOiB7XHJcbiAgICAgICAgICBzb3VyY2VDb2RlOiB7XHJcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAvLyAgICAgIGxldCBzY2hlbWUgPSBwcm9wZXJ0aWVzLnNjaGVtZSA/IHByb3BlcnRpZXMuc2NoZW1lLmNvIDogW107XHJcbiAgXHJcbiAgICAgIHN3aXRjaCAoc2NoZW1hKSB7XHJcbiAgICAgICAgY2FzZSAnQ29udGV4dCc6XHJcbiAgICAgICAgY2FzZSAnQ29udGV4dFJlcG9ydGVyJzpcclxuICAgICAgICBjYXNlICdDb250ZXh0T2JzZXJ2ZXInOlxyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5zY2hlbWUgPSAnY29udGV4dCc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdDb25uZWN0aW9uJzpcclxuICAgICAgICAgIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlLnByb3BlcnRpZXMuc2NoZW1lID0gJ2Nvbm5lY3Rpb24nO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnV2FsbGV0RGF0YSc6XHJcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLnNjaGVtZSA9ICd3YWxsZXREYXRhJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0NvbW11bmljYXRpb24nOlxyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5zY2hlbWUgPSAnY29tbSc7XHJcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLmNoaWxkcmVucyA9IFsncmVzb3VyY2VzJ107XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdIZWxsb1dvcmxkRGF0YVNjaGVtYSc6XHJcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLnNjaGVtZSA9ICdoZWxsbyc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5zY2hlbWUgPSAncmVzb3VyY2UnO1xyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5jaGlsZHJlbnMgPSBbXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc29sdmUoZGVzY3JpcHRvcik7XHJcblxyXG4gICAgfSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IElEUFByb3h5RGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIGlkcFByb3h5VVJMIC0gZS5nLiBteWRvbWFpbi5jb20vLndlbGwta25vd24vaWRwLXByb3h5L015UHJveHlcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dldEZ1bGxdIC0gYm9vbGVhbiB0byBkZWNpZGUgdG8gZ2V0IHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIHNvdXJjZVBhY2thZ2Ugb3IgKHBvdGVudGlhbGx5KSB3aXRob3V0XHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cclxuICAgICAqL1xyXG4gIGdldElkcFByb3h5RGVzY3JpcHRvcihpZHBQcm94eVVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKGlkcFByb3h5VVJMLCB0aGlzLmNyZWF0ZUlkcFByb3h5LCBnZXRGdWxsLCBjb25zdHJhaW50cylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlEZXNjcmlwdG9yIGJhc2VkIG9uIHJhdyBvYmplY3QgdGhhdCBjb250YWlucyBpdHMgYXR0cmlidXRlc1xyXG4gICAgICogQHBhcmFtIHtKU09OfSByYXdIeXBlcnR5XHJcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eURlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICBjcmVhdGVIeXBlcnR5KHJhd0h5cGVydHkpIHtcclxuICAgIC8vbG9nLmxvZyhcImNyZWF0ZUh5cGVydHk6XCIsIHJhd0h5cGVydHkpO1xyXG4gICAgLy8gY3JlYXRlIHRoZSBkZXNjcmlwdG9yXHJcbiAgICBsZXQgaHlwZXJ0eSA9IHRoaXMuX2ZhY3RvcnkuY3JlYXRlSHlwZXJ0eURlc2NyaXB0b3JPYmplY3QoXHJcbiAgICAgIHJhd0h5cGVydHlbJ2NndWlkJ10sXHJcbiAgICAgIHJhd0h5cGVydHlbJ3ZlcnNpb24nXSxcclxuICAgICAgcmF3SHlwZXJ0eVsnb2JqZWN0TmFtZSddLFxyXG4gICAgICByYXdIeXBlcnR5WydkZXNjcmlwdGlvbiddLFxyXG4gICAgICByYXdIeXBlcnR5WydsYW5ndWFnZSddLFxyXG4gICAgICByYXdIeXBlcnR5Wydzb3VyY2VQYWNrYWdlVVJMJ10sXHJcbiAgICAgIHJhd0h5cGVydHlbJ3R5cGUnXSB8fCByYXdIeXBlcnR5WydoeXBlcnR5VHlwZSddLFxyXG4gICAgICByYXdIeXBlcnR5WydkYXRhT2JqZWN0cyddXHJcbiAgICApO1xyXG5cclxuICAgIC8vbG9nLmxvZyhcImZhY3RvcnkgcmV0dXJuZWQ6XCIsIGh5cGVydHkpO1xyXG5cclxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xyXG4gICAgaHlwZXJ0eS5jb25maWd1cmF0aW9uID0gcmF3SHlwZXJ0eVsnY29uZmlndXJhdGlvbiddO1xyXG4gICAgaHlwZXJ0eS5jb25zdHJhaW50cyA9IHJhd0h5cGVydHlbJ2NvbnN0cmFpbnRzJ107XHJcbiAgICBoeXBlcnR5Lm1lc3NhZ2VTY2hlbWEgPSByYXdIeXBlcnR5WydtZXNzYWdlU2NoZW1hJ107XHJcbiAgICBoeXBlcnR5LnBvbGljaWVzID0gcmF3SHlwZXJ0eVsncG9saWNpZXMnXTtcclxuICAgIGh5cGVydHkuc2lnbmF0dXJlID0gcmF3SHlwZXJ0eVsnc2lnbmF0dXJlJ107XHJcblxyXG4gICAgLy8gcGFyc2UgYW5kIGF0dGFjaCBzb3VyY2VQYWNrYWdlXHJcbiAgICBsZXQgc291cmNlUGFja2FnZSA9IHJhd0h5cGVydHlbJ3NvdXJjZVBhY2thZ2UnXTtcclxuICAgIGlmIChzb3VyY2VQYWNrYWdlKSB7XHJcbiAgICAgIGh5cGVydHkuc291cmNlUGFja2FnZSA9IHRoaXMuY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VQYWNrYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaHlwZXJ0eTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIFByb3RvY29sU3R1YkRlc2NyaXB0b3IgYmFzZWQgb24gcmF3IG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0cyBhdHRyaWJ1dGVzXHJcbiAgICAgKiBAcGFyYW0gcmF3U3R1YlxyXG4gICAgICogQHJldHVybnMge1Byb3RvY29sU3R1YkRlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICBjcmVhdGVTdHViKHJhd1N0dWIpIHtcclxuICAgIC8vIGxvZy5sb2coXCJjcmVhdGluZyBzdHViIGRlc2NyaXB0b3IgYmFzZWQgb246IFwiLCByYXdTdHViKTtcclxuXHJcbiAgICAvLyBjcmVhdGUgdGhlIGRlc2NyaXB0b3JcclxuICAgIGxldCBzdHViID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVQcm90b1N0dWJEZXNjcmlwdG9yT2JqZWN0KFxyXG4gICAgICByYXdTdHViWydjZ3VpZCddLFxyXG4gICAgICByYXdTdHViWyd2ZXJzaW9uJ10sXHJcbiAgICAgIHJhd1N0dWJbJ29iamVjdE5hbWUnXSxcclxuICAgICAgcmF3U3R1YlsnZGVzY3JpcHRpb24nXSxcclxuICAgICAgcmF3U3R1YlsnbGFuZ3VhZ2UnXSxcclxuICAgICAgcmF3U3R1Ylsnc291cmNlUGFja2FnZVVSTCddLFxyXG4gICAgICByYXdTdHViWydtZXNzYWdlU2NoZW1hcyddLFxyXG4gICAgICByYXdTdHViWydjb25maWd1cmF0aW9uJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2NvbnN0cmFpbnRzJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2h5cGVydHlUeXBlJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2RhdGFPYmplY3RzJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2ludGVyd29ya2luZyddLFxyXG4gICAgICByYXdTdHViWydpZHBQcm94eSddLFxyXG4gICAgICByYXdTdHViWydtdXR1YWxBdXRoZW50aWNhdGlvbiddXHJcbiAgICApO1xyXG5cclxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xyXG4gICAgc3R1Yi5zaWduYXR1cmUgPSByYXdTdHViWydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHRoZSBzb3VyY2VQYWNrYWdlXHJcbiAgICBsZXQgc291cmNlUGFja2FnZSA9IHJhd1N0dWJbJ3NvdXJjZVBhY2thZ2UnXTtcclxuICAgIGlmIChzb3VyY2VQYWNrYWdlKSB7XHJcbiAgICAgIHN0dWIuc291cmNlUGFja2FnZSA9IHRoaXMuY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VQYWNrYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3R1YjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlSdW50aW1lRGVzY3JpcHRvciBiYXNlZCBvbiByYXcgb2JqZWN0IHRoYXQgY29udGFpbnMgaXRzIGF0dHJpYnV0ZXNcclxuICAgICAqIEBwYXJhbSByYXdSdW50aW1lXHJcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yfVxyXG4gICAgICovXHJcbiAgY3JlYXRlUnVudGltZURlc2NyaXB0b3IocmF3UnVudGltZSkge1xyXG4gICAgLy8gcGFyc2UgY2FwYWJpbGl0aWVzIGZpcnN0XHJcbiAgICB0cnkge1xyXG4gICAgICByYXdSdW50aW1lWydoeXBlcnR5Q2FwYWJpbGl0aWVzJ10gPSBKU09OLnBhcnNlKHJhd1J1bnRpbWVbJ2h5cGVydHlDYXBhYmlsaXRpZXMnXSk7XHJcbiAgICAgIHJhd1J1bnRpbWVbJ3Byb3RvY29sQ2FwYWJpbGl0aWVzJ10gPSBKU09OLnBhcnNlKHJhd1J1bnRpbWVbJ3Byb3RvY29sQ2FwYWJpbGl0aWVzJ10pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyBhbHJlYWR5IGpzb24gb2JqZWN0XHJcbiAgICB9XHJcblxyXG4gICAgLy9sb2cubG9nKFwiY3JlYXRpbmcgcnVudGltZSBkZXNjcmlwdG9yIGJhc2VkIG9uOiBcIiwgcmF3UnVudGltZSk7XHJcblxyXG5cclxuICAgIC8vIGNyZWF0ZSB0aGUgZGVzY3JpcHRvclxyXG4gICAgbGV0IHJ1bnRpbWUgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZUh5cGVydHlSdW50aW1lRGVzY3JpcHRvck9iamVjdChcclxuICAgICAgcmF3UnVudGltZVsnY2d1aWQnXSxcclxuICAgICAgcmF3UnVudGltZVsndmVyc2lvbiddLFxyXG4gICAgICByYXdSdW50aW1lWydvYmplY3ROYW1lJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ2Rlc2NyaXB0aW9uJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ2xhbmd1YWdlJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ3NvdXJjZVBhY2thZ2VVUkwnXSxcclxuICAgICAgcmF3UnVudGltZVsndHlwZSddIHx8IHJhd1J1bnRpbWVbJ3J1bnRpbWVUeXBlJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ2h5cGVydHlDYXBhYmlsaXRpZXMnXSxcclxuICAgICAgcmF3UnVudGltZVsncHJvdG9jb2xDYXBhYmlsaXRpZXMnXSxcclxuICAgICAgcmF3UnVudGltZVsncDJwSGFuZGxlclN0dWInXSxcclxuICAgICAgcmF3UnVudGltZVsncDJwUmVxdWVzdGVyU3R1YiddXHJcbiAgICApO1xyXG5cclxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xyXG4gICAgcnVudGltZS5zaWduYXR1cmUgPSByYXdSdW50aW1lWydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHNvdXJjZVBhY2thZ2VcclxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gcmF3UnVudGltZVsnc291cmNlUGFja2FnZSddO1xyXG4gICAgaWYgKHNvdXJjZVBhY2thZ2UpIHtcclxuICAgICAgLy8gbG9nLmxvZyhcInJ1bnRpbWUgaGFzIHNvdXJjZVBhY2thZ2U6XCIsIHNvdXJjZVBhY2thZ2UpO1xyXG4gICAgICBydW50aW1lLnNvdXJjZVBhY2thZ2UgPSB0aGlzLmNyZWF0ZVNvdXJjZVBhY2thZ2Uoc291cmNlUGFja2FnZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnVudGltZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIERhdGFPYmplY3RTY2hlbWEgYmFzZWQgb24gcmF3IG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0cyBhdHRyaWJ1dGVzXHJcbiAgICAgKiBAcGFyYW0gcmF3U2NoZW1hXHJcbiAgICAgKiBAcmV0dXJucyB7RGF0YU9iamVjdFNjaGVtYX1cclxuICAgICAqL1xyXG4gIGNyZWF0ZURhdGFTY2hlbWEocmF3U2NoZW1hKSB7XHJcbiAgICAvL2xvZy5sb2coXCJjcmVhdGluZyBkYXRhU2NoZW1hIGJhc2VkIG9uOiBcIiwgcmF3U2NoZW1hKTtcclxuXHJcbiAgICBsZXQgZGF0YVNjaGVtYTtcclxuXHJcbiAgICAvL2xvZy5sb2coJzEuIGNyZWF0ZU1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hOiAnLCByYXdTY2hlbWFbXCJhY2Nlc3NDb250cm9sUG9saWN5XCJdKTtcclxuICAgIC8vbG9nLmxvZygnMi4gY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWE6ICcsIHJhd1NjaGVtYVtcInNjaGVtZVwiXSk7XHJcbiAgICBpZiAocmF3U2NoZW1hWydhY2Nlc3NDb250cm9sUG9saWN5J10gJiYgcmF3U2NoZW1hWydzY2hlbWUnXSkge1xyXG4gICAgICBkYXRhU2NoZW1hID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVIeXBlcnR5RGF0YU9iamVjdFNjaGVtYShcclxuICAgICAgICByYXdTY2hlbWFbJ2NndWlkJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWyd2ZXJzaW9uJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWydvYmplY3ROYW1lJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWydkZXNjcmlwdGlvbiddLFxyXG4gICAgICAgIHJhd1NjaGVtYVsnbGFuZ3VhZ2UnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ3NvdXJjZVBhY2thZ2VVUkwnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ2FjY2Vzc0NvbnRyb2xQb2xpY3knXSxcclxuICAgICAgICByYXdTY2hlbWFbJ3NjaGVtZSddXHJcbiAgICAgIClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vbG9nLmxvZygnMy4gY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWE6ICcsIHJhd1NjaGVtYSk7XHJcbiAgICAgIGRhdGFTY2hlbWEgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZU1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hKFxyXG4gICAgICAgIHJhd1NjaGVtYVsnY2d1aWQnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ3ZlcnNpb24nXSxcclxuICAgICAgICByYXdTY2hlbWFbJ29iamVjdE5hbWUnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ2Rlc2NyaXB0aW9uJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWydsYW5ndWFnZSddLFxyXG4gICAgICAgIHJhd1NjaGVtYVsnc291cmNlUGFja2FnZVVSTCddXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvLyBvcHRpb25hbCBmaWVsZHNcclxuICAgIGRhdGFTY2hlbWEuc2lnbmF0dXJlID0gcmF3U2NoZW1hWydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHNvdXJjZVBhY2thZ2VcclxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gcmF3U2NoZW1hWydzb3VyY2VQYWNrYWdlJ107XHJcbiAgICBpZiAoc291cmNlUGFja2FnZSkge1xyXG4gICAgICAvL2xvZy5sb2coXCJkYXRhU2NoZW1hIGhhcyBzb3VyY2VQYWNrYWdlOlwiLCBzb3VyY2VQYWNrYWdlKTtcclxuICAgICAgZGF0YVNjaGVtYS5zb3VyY2VQYWNrYWdlID0gdGhpcy5jcmVhdGVTb3VyY2VQYWNrYWdlKHNvdXJjZVBhY2thZ2UpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBkYXRhU2NoZW1hLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZSA9IEpTT04ucGFyc2UoZGF0YVNjaGVtYS5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbG9nLmxvZygnRGF0YVNjaGVtYSBTb3VyY2UgY29kZSBpcyBhbHJlYWR5IHBhcnNlZCcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9sb2cubG9nKFwiY3JlYXRlZCBkYXRhU2NoZW1hIGRlc2NyaXB0b3Igb2JqZWN0OlwiLCBkYXRhU2NoZW1hKTtcclxuICAgIHJldHVybiBkYXRhU2NoZW1hO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAgKiBDcmVhdGUgUHJvdG9jb2xTdHViRGVzY3JpcHRvciBiYXNlZCBvbiByYXcgb2JqZWN0IHRoYXQgY29udGFpbnMgaXRzIGF0dHJpYnV0ZXNcclxuICAgICAqIEBwYXJhbSByYXdQcm94eVxyXG4gICAgICogQHJldHVybnMge1Byb3RvY29sU3R1YkRlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICBjcmVhdGVJZHBQcm94eShyYXdQcm94eSkge1xyXG4gICAgLy8gbG9nLmxvZyhcImNyZWF0aW5nIGlkcHByb3h5IGRlc2NyaXB0b3IgYmFzZWQgb246IFwiLCByYXdQcm94eSk7XHJcblxyXG4gICAgLy8gY3JlYXRlIHRoZSBkZXNjcmlwdG9yXHJcbiAgICBsZXQgaWRwcHJveHkgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZVByb3RvU3R1YkRlc2NyaXB0b3JPYmplY3QoXHJcbiAgICAgIHJhd1Byb3h5WydjZ3VpZCddLFxyXG4gICAgICByYXdQcm94eVsndmVyc2lvbiddLFxyXG4gICAgICByYXdQcm94eVsnb2JqZWN0TmFtZSddLFxyXG4gICAgICByYXdQcm94eVsnZGVzY3JpcHRpb24nXSxcclxuICAgICAgcmF3UHJveHlbJ2xhbmd1YWdlJ10sXHJcbiAgICAgIHJhd1Byb3h5Wydzb3VyY2VQYWNrYWdlVVJMJ10sXHJcbiAgICAgIHJhd1Byb3h5WydtZXNzYWdlU2NoZW1hcyddLFxyXG4gICAgICByYXdQcm94eVsnY29uZmlndXJhdGlvbiddLFxyXG4gICAgICByYXdQcm94eVsnY29uc3RyYWludHMnXSxcclxuICAgICAgcmF3UHJveHlbJ2h5cGVydHlUeXBlJ10sXHJcbiAgICAgIHJhd1Byb3h5WydkYXRhT2JqZWN0cyddLFxyXG4gICAgICByYXdQcm94eVsnaW50ZXJ3b3JraW5nJ10sXHJcbiAgICAgIHJhd1Byb3h5WydpZHBQcm94eSddLFxyXG4gICAgICByYXdQcm94eVsnbXV0dWFsQXV0aGVudGljYXRpb24nXVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBvcHRpb25hbCBmaWVsZHNcclxuICAgIGlkcHByb3h5LnNpZ25hdHVyZSA9IHJhd1Byb3h5WydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHRoZSBzb3VyY2VQYWNrYWdlXHJcbiAgICBsZXQgc291cmNlUGFja2FnZSA9IHJhd1Byb3h5Wydzb3VyY2VQYWNrYWdlJ107XHJcbiAgICBpZiAoc291cmNlUGFja2FnZSkge1xyXG4gICAgICBzb3VyY2VQYWNrYWdlID0gdGhpcy5jcmVhdGVTb3VyY2VQYWNrYWdlKHNvdXJjZVBhY2thZ2UpO1xyXG4gICAgICBpZHBwcm94eS5zb3VyY2VQYWNrYWdlID0gc291cmNlUGFja2FnZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaWRwcHJveHk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTb3VyY2VQYWNrYWdlKHNwKSB7XHJcbiAgICAvL2xvZy5sb2coXCJjcmVhdGVTb3VyY2VQYWNrYWdlOlwiLCBzcCk7XHJcblxyXG4gICAgLy8gY2hlY2sgZW5jb2RpbmdcclxuICAgIGlmIChzcFsnZW5jb2RpbmcnXSA9PT0gJ2Jhc2U2NCcpIHtcclxuICAgICAgc3BbJ3NvdXJjZUNvZGUnXSA9IHRoaXMuYXRvYihzcFsnc291cmNlQ29kZSddKTtcclxuICAgICAgc3BbJ2VuY29kaW5nJ10gPSAndXRmLTgnO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVTb3VyY2VQYWNrYWdlKHNwWydzb3VyY2VDb2RlQ2xhc3NuYW1lJ10sIHNwWydzb3VyY2VDb2RlJ10pO1xyXG4gICAgaWYgKHNwWydlbmNvZGluZyddKVxyXG4gICAgICBzb3VyY2VQYWNrYWdlLmVuY29kaW5nID0gc3BbJ2VuY29kaW5nJ107XHJcblxyXG4gICAgaWYgKHNwWydzaWduYXR1cmUnXSlcclxuICAgICAgc291cmNlUGFja2FnZS5zaWduYXR1cmUgPSBzcFsnc2lnbmF0dXJlJ107XHJcblxyXG4gICAgcmV0dXJuIHNvdXJjZVBhY2thZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICAqIEdldCBzb3VyY2UgUGFja2FnZSBmcm9tIGEgVVJMXHJcbiAgICAgKiBAcGFyYW0gc291cmNlUGFja2FnZVVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL2h5cGVydHkvTXlIeXBlcnR5L3NvdXJjZVBhY2thZ2VcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG4gICAgICovXHJcbiAgZ2V0U291cmNlUGFja2FnZUZyb21VUkwoc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgbG9nLmxvZygnZ2V0dGluZyBzb3VyY2VQYWNrYWdlIGZyb206Jywgc291cmNlUGFja2FnZVVSTCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5odHRwUmVxdWVzdC5nZXQoc291cmNlUGFja2FnZVVSTCkudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgLy9sb2cubG9nKFwiZ290IHJhdyBzb3VyY2VQYWNrYWdlOlwiLCByZXN1bHQpO1xyXG4gICAgICAgIGlmIChyZXN1bHRbJ0VSUk9SJ10pIHtcclxuICAgICAgICAgIC8vIFRPRE8gaGFuZGxlIGVycm9yIHByb3Blcmx5XHJcbiAgICAgICAgICByZWplY3QocmVzdWx0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xyXG4gICAgICAgICAgbGV0IHNvdXJjZVBhY2thZ2UgPSB0aGlzLmNyZWF0ZVNvdXJjZVBhY2thZ2UocmVzdWx0KTtcclxuICAgICAgICAgIHJlc29sdmUoc291cmNlUGFja2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlQ29kZSBvZiBhIGdpdmVuIGRlc2NyaXB0b3JcclxuICAgICAqIEBwYXJhbSB7Q2F0YWxvZ3VlRGF0YU9iamVjdH0gZGVzY3JpcHRvciAtIENhdGFsb2d1ZSBPYmplY3QgdGhhdCB3YXMgcmV0cmlldmVkIHVzaW5nIGUuZy4gZ2V0SHlwZXJ0eURlc2NyaXB0b3IoKVxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XHJcbiAgICAgKi9cclxuICBnZXRTb3VyY2VDb2RlRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZSkge1xyXG4gICAgICAgIC8vbG9nLmxvZyhcImRlc2NyaXB0b3IgaGFzIHNvdXJjZVBhY2thZ2VcIik7XHJcbiAgICAgICAgLy9sb2cubG9nKFwicmV0dXJuaW5nIHNvdXJjZUNvZGU6XCIsIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlKTtcclxuICAgICAgICByZXNvbHZlKGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldFZlcnNpb24oZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMICsgJy9zb3VyY2VDb2RlJykudGhlbigoZGJWZXJzaW9uKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGJWZXJzaW9uID49IGRlc2NyaXB0b3IudmVyc2lvbikge1xyXG4gICAgICAgICAgICBsb2cubG9nKCdyZXR1cm5pbmcgY2FjaGVkIHZlcnNpb24gZnJvbSBzdG9yYWdlTWFuYWdlcicpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldChkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2VVUkwgKyAnL3NvdXJjZUNvZGUnKS50aGVuKChzb3VyY2VDb2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShzb3VyY2VDb2RlKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHR0cFJlcXVlc3QuZ2V0KGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCArICcvc291cmNlQ29kZScpLnRoZW4oKHNvdXJjZUNvZGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoc291cmNlQ29kZVsnRVJST1InXSkge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBoYW5kbGUgZXJyb3IgcHJvcGVybHlcclxuICAgICAgICAgICAgICAgIHJlamVjdChzb3VyY2VDb2RlKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMICsgJy9zb3VyY2VDb2RlJywgZGVzY3JpcHRvci52ZXJzaW9uLCBzb3VyY2VDb2RlKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoc291cmNlQ29kZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY2F0YWxvZ3VlIG9iamVjdHMgZm9yIHRoZSBnaXZlbiBcInR5cGUgVVJMXCIsXHJcbiAgICAgKiBpLmUuIGEgY2F0YWxvZ3VlIFVSTCB0aGF0IHNwZWNpZmllcyBhIHR5cGUsIGJ1dCBubyBjYXRhbG9ndWUgb2JqZWN0IG5hbWUuXHJcbiAgICAgKiBAcGFyYW0gdHlwZVVSTCAtIFVSTCBwb2ludGluZyB0byB0aGUgY2F0YWxvZ3VlIG9iamVjdCB0eXBlIHlvdSB3YW50IGEgbGlzdCBvZiBhdmFpbGFibGUgb2JqZWN0cyBmb3IsXHJcbiAgICAgKiBlLmcuIGh5cGVydHktY2F0YWxvZ3VlOi8vY2F0YWxvZ3VlLmZva3VzLmZyYXVuaG9mZXIuZGUvLndlbGwta25vd24vaWRwLXByb3h5XHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gdHlwZUxpc3RQcm9taXNlIC0gUHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpdGggdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNhdGFsb2d1ZSBvYmplY3QgbmFtZXMgZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZSxcclxuICAgICAqIHJlamVjdHMgb24gSFRUUCBlcnJvciBvciBpZiB0aGUgSFRUUCByZXNwb25zZSBpcyBub3QgaW4gSlNPTi5cclxuICAgICAqIElmIGNvbnN0cmFpbnRzIHdlcmUgcHJvdmlkZWQsIHRoZW4gdGhlIGxpc3Qgb25seSBjb250YWlucyB0aG9zZSBvYmplY3RzIHRoYXQgbWVldCB0aGUgY29uc3RyYWludHNcclxuICAgICAqL1xyXG4gIGdldFR5cGVMaXN0KHR5cGVVUkwsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZXQgcmVxdWVzdFByb21pc2UgPSBjb25zdHJhaW50cyAhPSB1bmRlZmluZWQgPyB0aGlzLmh0dHBSZXF1ZXN0LnBvc3QodHlwZVVSTCwge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pIDogdGhpcy5odHRwUmVxdWVzdC5nZXQodHlwZVVSTCk7XHJcbiAgICAgIHJlcXVlc3RQcm9taXNlLnRoZW4oKHR5cGVMaXN0KSA9PiB7XHJcbiAgICAgICAgdHlwZUxpc3QgPSBKU09OLnBhcnNlKHR5cGVMaXN0KTtcclxuICAgICAgICByZXNvbHZlKHR5cGVMaXN0KTtcclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJ1bnRpbWVVUkwocnVudGltZVVSTCkge1xyXG4gICAgdGhpcy5fcnVudGltZVVSTCA9IHJ1bnRpbWVVUkw7XHJcbiAgfVxyXG5cclxuICBnZXQgcnVudGltZVVSTCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ydW50aW1lVVJMO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlRnJvbVBNKHVybCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZGVsZXRlKHVybCk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUnVudGltZUNhdGFsb2d1ZTtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuXHJcbmltcG9ydCB7IGxvZyBhcyBsb2dMZXZlbHMgfSBmcm9tICcuLi9sb2dMZXZlbHMnO1xyXG5cclxuLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignUnVudGltZVVBJyk7XHJcblxyXG4vL01haW4gZGVwZW5kZWNpZXNcclxuaW1wb3J0IFJlZ2lzdHJ5IGZyb20gJy4uL3JlZ2lzdHJ5L1JlZ2lzdHJ5JztcclxuaW1wb3J0IElkZW50aXR5TW9kdWxlIGZyb20gJy4uL2lkZW50aXR5L0lkZW50aXR5TW9kdWxlJztcclxuaW1wb3J0IElkZW50aXR5SGFuZGxlciBmcm9tICcuLi9pZGVudGl0eS9JZGVudGl0eUhhbmRsZXInO1xyXG5pbXBvcnQgUEVQIGZyb20gJy4uL3BvbGljeS9QRVAnO1xyXG5pbXBvcnQgTWVzc2FnZUJ1cyBmcm9tICcuLi9idXMvTWVzc2FnZUJ1cyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlR1VJRCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IEFkZHJlc3NBbGxvY2F0aW9uIGZyb20gJy4uL2FsbG9jYXRpb24vQWRkcmVzc0FsbG9jYXRpb24nO1xyXG5pbXBvcnQgY3J5cHRvTWFuYWdlciBmcm9tICcuLi9jcnlwdG9NYW5hZ2VyL0NyeXB0b01hbmFnZXInO1xyXG5cclxuaW1wb3J0IExvYWRlciBmcm9tICcuL0xvYWRlcic7XHJcbmltcG9ydCB7IHN0b3JhZ2UgfSBmcm9tICcuL1N0b3JhZ2UnO1xyXG5pbXBvcnQgRGVzY3JpcHRvcnMgZnJvbSAnLi9EZXNjcmlwdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBydW50aW1lQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vcnVudGltZUNvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgTXNnQnVzSGFuZGxlcnMgZnJvbSAnLi9Nc2dCdXNIYW5kbGVycyc7XHJcbmltcG9ydCB7IHJ1bnRpbWVVdGlscyB9IGZyb20gJy4vcnVudGltZVV0aWxzJztcclxuXHJcbi8vaW1wb3J0IEdyYXBoQ29ubmVjdG9yIGZyb20gJy4uL2dyYXBoY29ubmVjdG9yL0dyYXBoQ29ubmVjdG9yJztcclxuXHJcbmltcG9ydCBDb3JlRGlzY292ZXJ5IGZyb20gJy4uL2Rpc2NvdmVyeS9Db3JlRGlzY292ZXJ5JztcclxuXHJcbmltcG9ydCBEYXRhT2JqZWN0c1N0b3JhZ2UgZnJvbSAnLi4vc3RvcmUtb2JqZWN0cy9EYXRhT2JqZWN0c1N0b3JhZ2UnO1xyXG5pbXBvcnQgSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2UgZnJvbSAnLi4vaHlwZXJ0eS1yZXNvdXJjZS9IeXBlcnR5UmVzb3VyY2VzU3RvcmFnZSc7XHJcbmltcG9ydCBTeW5jaGVyTWFuYWdlciBmcm9tICcuLi9zeW5jaGVyL1N5bmNoZXJNYW5hZ2VyJztcclxuaW1wb3J0IFN1YnNjcmlwdGlvbk1hbmFnZXIgZnJvbSAnLi4vc3Vic2NyaXB0aW9uTWFuYWdlci9TdWJzY3JpcHRpb25NYW5hZ2VyJztcclxuaW1wb3J0IFJ1bnRpbWVDb3JlQ3R4IGZyb20gJy4uL3BvbGljeS9jb250ZXh0L1J1bnRpbWVDb3JlQ3R4JztcclxuaW1wb3J0IFJ1bnRpbWVDYXRhbG9ndWUgZnJvbSAnLi4vcnVudGltZS1jYXRhbG9ndWUvUnVudGltZUNhdGFsb2d1ZSc7XHJcblxyXG4vKipcclxuICogUnVudGltZSBVc2VyIEFnZW50IEludGVyZmFjZSB3aWxsIHByb2Nlc3MgYWxsIHRoZSBkZXBlbmRlY2llcyBvZiB0aGUgY29yZSBydW50aW1lO1xyXG4gKiBAYXV0aG9yIFZpdG9yIFNpbHZhIFt2aXRvci10LXNpbHZhQHRlbGVjb20ucHRdXHJcbiAqIEB2ZXJzaW9uIDAuNC4wXHJcbiAqXHJcbiAqIEBwcm9wZXJ0eSB7cnVudGltZUZhY3Rvcnl9IHJ1bnRpbWVGYWN0b3J5IC0gU3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBlbnZpcm9ubWVudHM7XHJcbiAqIEBwcm9wZXJ0eSB7UnVudGltZUNhdGFsb2d1ZX0gcnVudGltZUNhdGFsb2d1ZSAtIENhdGFsb2d1ZSBvZiBjb21wb25lbnRzIGNhbiBiZSBpbnN0YWxsZWQ7XHJcbiAqIEBwcm9wZXJ0eSB7cnVudGltZVVSTH0gcnVudGltZVVSTCAtIFRoaXMgaWRlbnRpZnkgdGhlIGNvcmUgcnVudGltZSwgc2hvdWxkIGJlIHVuaXF1ZTtcclxuICogQHByb3BlcnR5IHtJZGVudGl0eU1vZHVsZX0gaWRlbnRpdHlNb2R1bGUgLSBJZGVudGl0eSBNb2R1bGU7XHJcbiAqIEBwcm9wZXJ0eSB7UEVQfSBwb2xpY3lFbmdpbmUgLSBQb2xpY3kgRW5naW5lIE1vZHVsZTtcclxuICogQHByb3BlcnR5IHtSZWdpc3RyeX0gcmVnaXN0cnkgLSBSZWdpc3RyeSBNb2R1bGU7XHJcbiAqIEBwcm9wZXJ0eSB7TWVzc2FnZUJ1c30gbWVzc2FnZUJ1cyAtIE1lc3NhZ2UgQnVzIGlzIHVzZWQgbGlrZSBhIHJvdXRlciB0byByZWRpcmVjdCB0aGUgbWVzc2FnZXMgZnJvbSBvbmUgY29tcG9uZW50IHRvIG90aGVyKHMpXHJcbiAqIEBwcm9wZXJ0eSB7R3JhcGhDb25uZWN0b3J9IGdyYXBoQ29ubmVjdG9yIC0gR3JhcGggQ29ubmVjdG9yIGhhbmRsaW5nIEdVSUQgYW5kIGNvbnRhY3RzXHJcbiAqIEBwcm9wZXJ0eSB7Q29yZURpc2NvdmVyeX0gY29yZURpc2NvdmVyeSAtIERpc2NvdmVyeSBmb3IgZGlzY292ZXJ5IGh5cGVydGllcy9kYXRhT2JqZWN0c1xyXG4gKi9cclxuY2xhc3MgUnVudGltZVVBIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIFJ1bnRpbWUgVXNlciBBZ2VudFxyXG4gICAqIEBwYXJhbSB7ZGVzY3JpcHRvcn0gcnVudGltZURlc2NyaXB0b3IgLSBwYXNzIGFsbCB0aGUgaHlwZXJ0eSBydW50aW1lIGRlc2NyaXB0b3JcclxuICAgKiBAcGFyYW0ge3J1bnRpbWVGYWN0b3J5fSBydW50aW1lRmFjdG9yeSAtIFNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZW52aXJvbm1lbnQgd2hlcmUgdGhlIGNvcmUgcnVudGltZSB3aWxsIHJ1bjtcclxuICAgKiBAcGFyYW0ge2RvbWFpbn0gZG9tYWluVVJMIC0gc3BlY2lmeSB0aGUgZG9tYWluIGJhc2UgZm9yIHRoZSBydW50aW1lO1xyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKHJ1bnRpbWVEZXNjcmlwdG9yLCBydW50aW1lRmFjdG9yeSwgZG9tYWluKSB7XHJcbiAgICBpZiAoIXJ1bnRpbWVEZXNjcmlwdG9yKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBydW50aW1lIGRlc2NyaXB0b3IgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XHJcbiAgICBpZiAoIXJ1bnRpbWVGYWN0b3J5KSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzYW5kYm94IGZhY3RvcnkgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XHJcbiAgICBpZiAoIWRvbWFpbikgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0aGUgZG9tYWluIG9mIHJ1bnRpbWUnKTtcclxuXHJcbiAgICAvLyBDb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIHJlbGF0ZWQgd2l0aCBzZXJ2ZXJzXHJcbiAgICB0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7IGRvbWFpbjogZG9tYWluIH0sIHJ1bnRpbWVDb25maWd1cmF0aW9uKTtcclxuICAgIHRoaXMucnVudGltZUZhY3RvcnkgPSBydW50aW1lRmFjdG9yeTtcclxuXHJcbiAgICB0aGlzLmxvZyA9IGxvZztcclxuICAgIHRoaXMubG9nTGV2ZWxzID0gbG9nTGV2ZWxzO1xyXG5cclxuICAgIGlmIChydW50aW1lRGVzY3JpcHRvci5wMnBIYW5kbGVyU3R1YiAmJiB0eXBlb2YgcnVudGltZURlc2NyaXB0b3IucDJwSGFuZGxlclN0dWIgPT09ICdzdHJpbmcnICYmIHJ1bnRpbWVEZXNjcmlwdG9yLnAycEhhbmRsZXJTdHViLmluY2x1ZGVzKCc6Ly8nKSkge1xyXG4gICAgICB0aGlzLnAycCA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnAycCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJ1bnRpbWVVdGlscy5ydW50aW1lRGVzY3JpcHRvciA9IHJ1bnRpbWVEZXNjcmlwdG9yO1xyXG4gICAgdGhpcy5ydW50aW1lVXRpbHMgPSBydW50aW1lVXRpbHM7XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlcyA9IHt9O1xyXG5cclxuLyogICAgaWYgKHR5cGVvZiBydW50aW1lRmFjdG9yeS5jcmVhdGVSdW50aW1lQ2F0YWxvZ3VlID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRoaXMucnVudGltZUNhdGFsb2d1ZSA9IHJ1bnRpbWVGYWN0b3J5LmNyZWF0ZVJ1bnRpbWVDYXRhbG9ndWUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hlY2sgeW91ciBSdW50aW1lIEZhY3RvcnkgYmVjYXVzZSBpdCBuZWVkcyB0aGUgUnVudGltZSBDYXRhbG9ndWUgaW1wbGVtZW50YXRpb24nKTtcclxuICAgIH0qL1xyXG5cclxuICAgIHRoaXMucnVudGltZUNhdGFsb2d1ZSA9IG5ldyBSdW50aW1lQ2F0YWxvZ3VlKHJ1bnRpbWVGYWN0b3J5KTtcclxuXHJcblxyXG5cclxuLyogICAgaWYgKHR5cGVvZiBydW50aW1lRmFjdG9yeS5wZXJzaXN0ZW5jZU1hbmFnZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhpcy5wZXJzaXN0ZW5jZU1hbmFnZXIgPSBydW50aW1lRmFjdG9yeS5wZXJzaXN0ZW5jZU1hbmFnZXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hlY2sgeW91ciBSdW50aW1lIEZhY3RvcnkgYmVjYXVzZSBpdCBuZWVkcyB0aGUgUGVyc2lzdGVuY2UgTWFuYWdlciBpbXBsZW1lbnRhdGlvbicpO1xyXG4gICAgfSovXHJcblxyXG4gICAgaWYgKHR5cGVvZiBydW50aW1lRmFjdG9yeS5zdG9yYWdlTWFuYWdlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG5cclxuICAgICAgdGhpcy5zdG9yYWdlcyA9IHN0b3JhZ2UocnVudGltZUZhY3RvcnksIHRoaXMpO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hlY2sgeW91ciBSdW50aW1lIEZhY3RvcnkgYmVjYXVzZSBpdCBuZWVkcyB0aGUgU3RvcmFnZSBNYW5hZ2VyIGltcGxlbWVudGF0aW9uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBydW50aW1lRmFjdG9yeS5ydW50aW1lQ2FwYWJpbGl0aWVzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRoaXMucnVudGltZUNhcGFiaWxpdGllcyA9IHJ1bnRpbWVGYWN0b3J5LnJ1bnRpbWVDYXBhYmlsaXRpZXModGhpcy5zdG9yYWdlcy5jYXBhYmlsaXRpZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbG9nLmluZm8oJ0NoZWNrIHlvdXIgUnVudGltZUZhY3RvcnkgYmVjYXVzZSBpdCBuZWVkcyB0aGUgUnVudGltZSBDYXBhYmlsaXRpZXMgaW1wbGVtZW50YXRpb24nKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbnRpYWxpemUgdGhlIGluc3RhbGxhdGlvbiBvZiBydW50aW1lXHJcbiAgICpcclxuICAgKiBAYWNjZXNzIHB1YmxpY1xyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Qm9vbGVhbiwgRXJyb3I+fSB0aGlzIGlzIFByb21pc2UgYW5kIGlmIHRoZSBpbnN0YWxsYXRpb24gcHJvY2VzcyBoYXBwZW5lZCB3aXRob3V0IGFueSBwcm9ibGVtcyByZXR1cm5zIHRydWUgb3RoZXJ3aXNlIHRoZSBlcnJvci5cclxuICAgKlxyXG4gICAqIEBtZW1iZXJPZiBSdW50aW1lVUFcclxuICAgKi9cclxuICBpbml0KGd1aWQpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICB0aGlzLmRvbWFpbiA9IHRoaXMucnVudGltZUNvbmZpZ3VyYXRpb24uZG9tYWluO1xyXG5cclxuICAgICAgbG9nLmluZm8oJ1tSdW50aW1lVUEgLSBpbml0XSBTdGFydGluZyAnKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IGdldENhcGFiaWxpdGllcyA9IHRoaXMucnVudGltZUNhcGFiaWxpdGllcy5nZXRSdW50aW1lQ2FwYWJpbGl0aWVzKCk7XHJcbiAgICAgICAgbGV0IGdldFJ1bnRpbWVVUkwgPSB0aGlzLnN0b3JhZ2VzLnJ1bnRpbWUuZ2V0KCdydW50aW1lOlVSTCcpO1xyXG4gICAgICAgIGxldCBnZXRTdG9yZWREYXRhT2JqZWN0cyA9IHRoaXMuc3RvcmFnZXMuc3luY2hlck1hbmFnZXIuZ2V0KCdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJyk7XHJcbiAgICAgICAgbGV0IGdldEh5cGVydHlTdG9yYWdlT2JqZWN0cyA9IHRoaXMuc3RvcmFnZXMuaHlwZXJ0eVJlc291cmNlcy5nZXQoKTtcclxuICAgICAgICBsZXQgZ2V0UDJQSGFuZGxlclVSTCA9IHRoaXMuc3RvcmFnZXMucnVudGltZS5nZXQoJ3AycEhhbmRsZXI6VVJMJyk7XHJcbi8vICAgICAgICBsZXQgZ2V0UmVtb3RlcyA9IHRoaXMuc3RvcmFnZXMuc3luY2hlck1hbmFnZXIuZ2V0KCdyZW1vdGVzJyk7XHJcblxyXG4gICAgICAgIFByb21pc2UuYWxsKFtnZXRSdW50aW1lVVJMLCBnZXRDYXBhYmlsaXRpZXMsIGdldFN0b3JlZERhdGFPYmplY3RzLCBnZXRIeXBlcnR5U3RvcmFnZU9iamVjdHMsIGdldFAyUEhhbmRsZXJVUkxdKS50aGVuKChyZXN1bHRzKSA9PiB7XHJcblxyXG4gICAgICAgICAgdGhpcy5ydW50aW1lVVJMID0gcmVzdWx0c1swXSA/IHJlc3VsdHNbMF0ucnVudGltZVVSTCA6IHJlc3VsdHNbMF07XHJcbiAgICAgICAgICBpZiAoIXRoaXMucnVudGltZVVSTCkge1xyXG4gICAgICAgICAgICB0aGlzLnJ1bnRpbWVVUkwgPSAncnVudGltZTovLycgKyB0aGlzLmRvbWFpbiArICcvJyArIGdlbmVyYXRlR1VJRCgpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VzLnJ1bnRpbWUuc2V0KCdydW50aW1lOlVSTCcsIDEsIHsgcnVudGltZVVSTDogdGhpcy5ydW50aW1lVVJMIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHJlc3VsdHNbMV07XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHJ1bnRpbWVVdGlscy5ydW50aW1lQ2FwYWJpbGl0aWVzLmNvbnN0cmFpbnRzLCByZXN1bHRzWzFdKTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2UgPSBuZXcgRGF0YU9iamVjdHNTdG9yYWdlKHRoaXMuc3RvcmFnZXMuc3luY2hlck1hbmFnZXIsIHJlc3VsdHNbMl0gfHwge30sIHRoaXMucnVudGltZUZhY3RvcnksIHRoaXMgKTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9oeXBlcnR5UmVzb3VyY2VzID0gcmVzdWx0c1szXSB8fCB7fTtcclxuXHJcbiAgICAgICAgICB0aGlzLnAycEhhbmRsZXJVUkwgPSByZXN1bHRzWzRdID8gcmVzdWx0c1s0XS5wMnBIYW5kbGVyVVJMIDogcmVzdWx0c1s0XTtcclxuICAgICAgICAgIGlmICghdGhpcy5wMnBIYW5kbGVyVVJMKSB7XHJcbiAgICAgICAgICAgIHRoaXMucDJwSGFuZGxlclVSTCA9IHRoaXMucnVudGltZVVSTCArICcvcDJwaGFuZGxlci8nICsgZ2VuZXJhdGVHVUlEKCk7XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKCdbUnVudGltZVVBIC0gaW5pdF0gUDJQSGFuZGxlclVSTDogJywgdGhpcy5wMnBIYW5kbGVyVVJMKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZXMucnVudGltZS5zZXQoJ3AycEhhbmRsZXI6VVJMJywgMSwgeyBwMnBIYW5kbGVyVVJMOiB0aGlzLnAycEhhbmRsZXJVUkwgfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4vKiAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWVVQSAtIGluaXRdIGRhdGFPYmplY3RzU3RvcmFnZSByZW1vdGUgbG9hZCBzdGFydGluZycpO1xyXG4gICAgICAgICAgdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLmxvYWRSZW1vdGUoKS50aGVuKCgpPT4ge1xyXG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWVVQSAtIGluaXRdIGRhdGFPYmplY3RzU3RvcmFnZSByZW1vdGUgbG9hZCBjb25jbHVkZWQnKTsqL1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9hZENvbXBvbmVudHMoZ3VpZCk7XHJcblxyXG4vLyAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH0pLnRoZW4oKHN0YXR1cykgPT4ge1xyXG5cclxuICAgICAgICAgIHRoaXMuX2h5cGVydHlSZXNvdXJjZXNTdG9yYWdlID0gbmV3IEh5cGVydHlSZXNvdXJjZXNTdG9yYWdlKHRoaXMucnVudGltZVVSTCwgdGhpcy5tZXNzYWdlQnVzLCB0aGlzLnN0b3JhZ2VzLmh5cGVydHlSZXNvdXJjZXMsIHRoaXMuX2h5cGVydHlSZXNvdXJjZXMpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnAycCkge1xyXG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWVVQSAtIGluaXRdIGxvYWQgcDJwSGFuZGxlcjogJywgc3RhdHVzKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRQMlBIYW5kbGVyKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWVVQSAtIGluaXRdIFAyUCBub3Qgc3VwcG9ydGVkJyk7XHJcbiAgICAgICAgICAgIHJldHVybiAoJ1AyUCBOb3QgU3VwcG9ydGVkJyk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgbG9nLmluZm8oJ1tydW50aW1lIHVhIC0gaW5pdF0gLSBzdGF0dXM6ICcsIHJlc3VsdCk7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0sIChyZWFzb24pID0+IHtcclxuICAgICAgICAgIGxvZy5lcnJvcignRVJST1I6ICcsIHJlYXNvbik7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHJlamVjdChlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIF91cGRhdGVSdW50aW1lU3RhdHVzKGV2ZW50KSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgZnJvbTogdGhpcy5ydW50aW1lVVJMLFxyXG4gICAgICB0bzogdGhpcy5ydW50aW1lVVJMKycvc3RhdHVzJyxcclxuICAgICAgdHlwZTogJ3VwZGF0ZScsXHJcbiAgICAgIGJvZHk6IGV2ZW50XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9sb2FkUDJQSGFuZGxlcigpIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHJcbiAgICAgIGxldCBydW50aW1lRGVzY3JpcHRvciA9IHJ1bnRpbWVVdGlscy5ydW50aW1lRGVzY3JpcHRvcjtcclxuICAgICAgbGV0IHAycFN0dWJIYW5kbGVyID0gcnVudGltZURlc2NyaXB0b3IucDJwSGFuZGxlclN0dWI7XHJcblxyXG4gICAgICBsZXQgcDJwQ29uZmlnID0ge1xyXG4gICAgICAgIGlzSGFuZGxlclN0dWI6IHRydWUsXHJcbiAgICAgICAgcnVudGltZVVSTDogdGhpcy5ydW50aW1lVVJMXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsb2cubG9nKCdbUnVudGltZVVBIGxvYWRQMlBIYW5kbGVyXSBQMlBTdHViSGFuZGxlcjogJywgcDJwU3R1YkhhbmRsZXIpO1xyXG5cclxuICAgICAgdGhpcy5sb2FkZXIubG9hZFN0dWIocDJwU3R1YkhhbmRsZXIsIHAycENvbmZpZykudGhlbigocmVzdWx0KSA9PiB7XHJcblxyXG4gICAgICAgIGxldCBydW50aW1lVUFVUkwgPSB0aGlzLnJ1bnRpbWVVUkwgKyAnL3VhJztcclxuICAgICAgICBsZXQgbXNnID0ge1xyXG4gICAgICAgICAgdHlwZTogJ3N1YnNjcmliZScsXHJcbiAgICAgICAgICBmcm9tOiBydW50aW1lVUFVUkwsXHJcbiAgICAgICAgICB0bzogJ2RvbWFpbjovL21zZy1ub2RlLicgKyB0aGlzLmRvbWFpbiArICcvc20nLFxyXG4gICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICBzdWJzY3JpYmU6IFtyZXN1bHQudXJsXSxcclxuICAgICAgICAgICAgc291cmNlOiB0aGlzLnJ1bnRpbWVVUkxcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLm1lc3NhZ2VCdXMuYWRkTGlzdGVuZXIocnVudGltZVVBVVJMLCAobXNnKSA9PiB7XHJcbiAgICAgICAgICBsb2cubG9nKCdbcnVudGltZSB1YSAtIGxpc3RlbmVyXSAtIHJlY2VpdmUgbXNnOiAnLCBtc2cpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICAgIGxvZy5sb2coJ1tydW50aW1lIHVhIC0gcG9zdE1lc3NhZ2VdIC0gcmVwbHk6ICcsIHJlcGx5KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbG9nLmluZm8oJ1tydW50aW1lIHVhIC0gcDJwIGluc3RhbGxhdGlvbl0gLSBzdWNjZXNzOiAnLCByZXN1bHQpO1xyXG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICBsb2cuaW5mbygnW3J1bnRpbWUgdWEgLSBwMnAgaW5zdGFsbGF0aW9uXSAtIGZhaWw6ICcsIHJlYXNvbik7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQGFjY2VzcyBwcml2YXRlXHJcbiAgICogQHJldHVybiB7UHJvbWlzZTxCb29sZWFuLCBFcnJvcj59IHRoaXMgaXMgUHJvbWlzZSBhbmQgcmV0dXJucyB0cnVlIGlmIGFsbCBjb21wb25lbnRzIGFyZSBsb2FkZWQgd2l0aCBzdWNjZXNzIG9yIGFuIGVycm9yIGlmIHNvbWVvbmUgZmFpbHMuXHJcbiAgICpcclxuICAgKiBAbWVtYmVyT2YgUnVudGltZVVBXHJcbiAgICovXHJcbiAgX2xvYWRDb21wb25lbnRzKGd1aWQpIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgLy8gUHJlcGFyZSB0aGUgb24gaW5zdGFuY2UgdG8gaGFuZGxlIHdpdGggdGhlIGZhbGxiYWNrcyBhbmQgcnVudGltZUNhdGFsb2d1ZTtcclxuICAgICAgICB0aGlzLmRlc2NyaXB0b3JJbnN0YW5jZSA9IG5ldyBEZXNjcmlwdG9ycyh0aGlzLnJ1bnRpbWVVUkwsIHRoaXMucnVudGltZUNhdGFsb2d1ZSwgdGhpcy5ydW50aW1lQ29uZmlndXJhdGlvbik7XHJcblxyXG4gICAgICAgIC8vIFByZXBhcmUgdGhlIGxvYWRlciB0byBsb2FkIHRoZSBoeXBlcnRpZXMsIHByb3Rvc3R1YnMgYW5kIGlkcHByb3h5O1xyXG4gICAgICAgIHRoaXMubG9hZGVyID0gbmV3IExvYWRlcih0aGlzLnJ1bnRpbWVVUkwsIHRoaXMucnVudGltZUNvbmZpZ3VyYXRpb24sIHRoaXMuZGVzY3JpcHRvckluc3RhbmNlKTtcclxuXHJcbiAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIGlkZW50aXR5IE1vZHVsZVxyXG4gICAgICAgIHRoaXMuaWRlbnRpdHlNb2R1bGUgPSBuZXcgSWRlbnRpdHlNb2R1bGUodGhpcy5ydW50aW1lVVJMLCB0aGlzLnJ1bnRpbWVDYXBhYmlsaXRpZXMsIHRoaXMuc3RvcmFnZXMuaWRlbnRpdHksIHRoaXMuX2RhdGFPYmplY3RzU3RvcmFnZSwgY3J5cHRvTWFuYWdlciwgdGhpcy5ydW50aW1lQ2F0YWxvZ3VlKTtcclxuXHJcbiAgICAgICAgLy8gVXNlIHRoZSBzYW5kYm94IGZhY3RvcnkgdG8gY3JlYXRlIGFuIEFwcFNhbmRib3g7XHJcbiAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgZGVjaWRlZCBieSBwb2xpY3lFbmdpbmUgaWYgd2UgbmVlZFxyXG4gICAgICAgIC8vIGNyZWF0ZSBhIEFwcFNhbmRib3ggb3Igbm90O1xyXG4gICAgICAgIGxldCBhcHBTYW5kYm94ID0gdGhpcy5ydW50aW1lRmFjdG9yeS5jcmVhdGVBcHBTYW5kYm94KCk7XHJcblxyXG4gICAgICAgIC8vIEluc3RhbnRpYXRlIHRoZSBSZWdpc3RyeSBNb2R1bGVcclxuICAgICAgICB0aGlzLnJlZ2lzdHJ5ID0gbmV3IFJlZ2lzdHJ5KHRoaXMucnVudGltZVVSTCwgYXBwU2FuZGJveCwgdGhpcy5pZGVudGl0eU1vZHVsZSwgdGhpcy5ydW50aW1lQ2F0YWxvZ3VlLCB0aGlzLnJ1bnRpbWVDYXBhYmlsaXRpZXMsIHRoaXMuc3RvcmFnZXMucmVnaXN0cnksIHRoaXMucDJwSGFuZGxlclVSTCk7XHJcblxyXG4gICAgICAgIC8vIFNldCB0aGUgbG9hZGVyIHRvIGxvYWQgSHlwZXJ0aWVzLCBTdHVicyBhbmQgSWRwUHJveGllc1xyXG4gICAgICAgIHRoaXMucmVnaXN0cnkubG9hZGVyID0gdGhpcy5sb2FkZXI7XHJcblxyXG4gICAgICAgIC8vIEluc3RhbnRpYXRlIHRoZSBNZXNzYWdlIEJ1c1xyXG4gICAgICAgIHRoaXMubWVzc2FnZUJ1cyA9IG5ldyBNZXNzYWdlQnVzKHRoaXMucmVnaXN0cnkpO1xyXG5cclxuICAgICAgICAvLyBJbnN0YW5jaWF0ZSB0aGUgU3Vic2NyaXB0aW9uTWFuYWdlcjtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbk1hbmFnZXIgPSBuZXcgU3Vic2NyaXB0aW9uTWFuYWdlcih0aGlzLnJ1bnRpbWVVUkwsIHRoaXMubWVzc2FnZUJ1cywgdGhpcy5zdG9yYWdlcy5zdWJzY3JpcHRpb25zKTtcclxuXHJcbiAgICAgICAgLy8gUHJlcGFyZSB0aGUgYWRkcmVzcyBhbGxvY2F0aW9uIGluc3RhbmNlO1xyXG4gICAgICAgIHRoaXMuYWRkcmVzc0FsbG9jYXRpb24gPSBuZXcgQWRkcmVzc0FsbG9jYXRpb24odGhpcy5ydW50aW1lVVJMLCB0aGlzLm1lc3NhZ2VCdXMsIHRoaXMucmVnaXN0cnksIHRoaXMuc3Vic2NyaXB0aW9uTWFuYWdlcik7XHJcblxyXG4gICAgICAgIC8vIEluc3RhbnRpYXRlIHRoZSBQb2xpY3kgRW5naW5lXHJcbiAgICAgICAgdGhpcy5wb2xpY3lFbmdpbmUgPSBuZXcgUEVQKG5ldyBSdW50aW1lQ29yZUN0eCh0aGlzLnJ1bnRpbWVVUkwsIHRoaXMuaWRlbnRpdHlNb2R1bGUsIHRoaXMucmVnaXN0cnksIHRoaXMuc3RvcmFnZXMucG9saWN5LCB0aGlzLnJ1bnRpbWVDYXBhYmlsaXRpZXMpKTtcclxuXHJcbiAgICAgICAgLy8gSW5zdGFudGlhdGUgRGlzY292ZXJ5XHJcbiAgICAgICAgdGhpcy5jb3JlRGlzY292ZXJ5ID0gbmV3IENvcmVEaXNjb3ZlcnkodGhpcy5ydW50aW1lVVJMLCB0aGlzLm1lc3NhZ2VCdXMsIHRoaXMuZ3JhcGhDb25uZWN0b3IsIHRoaXMucnVudGltZUZhY3RvcnksIHRoaXMucmVnaXN0cnkpO1xyXG5cclxuICAgICAgICAvLyBJbnN0YW50aWF0ZSB0aGUgaWRlbnRpdHlIYW5kbGVyXHJcbiAgICAgICAgdGhpcy5pZGVudGl0eUhhbmRsZXIgPSBuZXcgSWRlbnRpdHlIYW5kbGVyKHRoaXMuaWRlbnRpdHlNb2R1bGUpO1xyXG5cclxuICAgICAgICAvLyBpbml0aWFsaXNlIHRoZSBDcnlwdG9NYW5hZ2VyXHJcbiAgICAgICAgY3J5cHRvTWFuYWdlci5pbml0KHRoaXMucnVudGltZVVSTCwgdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzLCB0aGlzLnN0b3JhZ2VzLmNyeXB0b01hbmFnZXIsIHRoaXMuX2RhdGFPYmplY3RzU3RvcmFnZSwgdGhpcy5yZWdpc3RyeSwgdGhpcy5jb3JlRGlzY292ZXJ5LCB0aGlzLmlkZW50aXR5TW9kdWxlLCB0aGlzLnJ1bnRpbWVGYWN0b3J5KTtcclxuXHJcbiAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIEdyYXBoIENvbm5lY3RvclxyXG4vLyAgICAgICAgdGhpcy5ncmFwaENvbm5lY3RvciA9IHByb2Nlc3MuZW52Lk1PREUgIT09ICdsaWdodCcgPyBuZXcgR3JhcGhDb25uZWN0b3IodGhpcy5ydW50aW1lVVJMLCB0aGlzLm1lc3NhZ2VCdXMsIHRoaXMuc3RvcmFnZU1hbmFnZXIpIDogbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IG5ldyBNc2dCdXNIYW5kbGVycyh0aGlzLnBvbGljeUVuZ2luZSwgdGhpcy5pZGVudGl0eUhhbmRsZXIsIGNyeXB0b01hbmFnZXIpO1xyXG5cclxuICAgICAgICAvLyAodW4pY29tbWVudCBiZWxsb3cgdG8gbm90IGVuY3J5cHQgbWVzc2FnZXNcclxuXHJcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzLnBpcGVsaW5lT3V0LmhhbmRsZXJzID0gW3RoaXMuaGFuZGxlcnMuaWRtSGFuZGxlciwgdGhpcy5oYW5kbGVycy5wZXBPdXRIYW5kbGVyXTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VCdXMucGlwZWxpbmVJbi5oYW5kbGVycyA9IFsgdGhpcy5oYW5kbGVycy5wZXBJbkhhbmRsZXJdO1xyXG5cclxuICAgICAgICAvLyAodW4pY29tbWVudCBiZWxsb3cgdG8gZW5jcnlwdCBtZXNzYWdlc1xyXG5cclxuLy8gICAgICB0aGlzLm1lc3NhZ2VCdXMucGlwZWxpbmVPdXQuaGFuZGxlcnMgPSBbdGhpcy5oYW5kbGVycy5pZG1IYW5kbGVyLCB0aGlzLmhhbmRsZXJzLnBlcE91dEhhbmRsZXIsIHRoaXMuaGFuZGxlcnMuZW5jcnlwdEhhbmRsZXJdO1xyXG4vLyAgICAgIHRoaXMubWVzc2FnZUJ1cy5waXBlbGluZUluLmhhbmRsZXJzID0gW3RoaXMuaGFuZGxlcnMuZGVjcnlwdEhhbmRsZXIsIHRoaXMuaGFuZGxlcnMucGVwSW5IYW5kbGVyXTtcclxuXHJcbiAgICAgICAgLy8gQWRkIHRvIEFwcCBTYW5kYm94IHRoZSBsaXN0ZW5lcjtcclxuICAgICAgICBhcHBTYW5kYm94LmFkZExpc3RlbmVyKCcqJywgKG1zZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNyeXB0b01hbmFnZXIubWVzc2FnZUJ1cyA9IHRoaXMubWVzc2FnZUJ1cztcclxuXHJcbiAgICAgICAgLy8gUmVnaXN0ZXIgbWVzc2FnZUJ1cyBvbiBSZWdpc3RyeVxyXG4gICAgICAgIHRoaXMucmVnaXN0cnkubWVzc2FnZUJ1cyA9IHRoaXMubWVzc2FnZUJ1cztcclxuXHJcbiAgICAgICAgLy8gUG9saWN5IEVuZ2luZVxyXG4gICAgICAgIHRoaXMucG9saWN5RW5naW5lLm1lc3NhZ2VCdXMgPSB0aGlzLm1lc3NhZ2VCdXM7XHJcblxyXG4gICAgICAgIC8vIFJlZ2lzdGVyIG1lc3NhZ2VCdXMgb24gSURNXHJcbiAgICAgICAgdGhpcy5pZGVudGl0eU1vZHVsZS5tZXNzYWdlQnVzID0gdGhpcy5tZXNzYWdlQnVzO1xyXG5cclxuICAgICAgICAvLyBSZWdpc3RlciByZWdpc3RyeSBvbiBJZGVudGl0eU1vZHVsZVxyXG4gICAgICAgIHRoaXMuaWRlbnRpdHlNb2R1bGUucmVnaXN0cnkgPSB0aGlzLnJlZ2lzdHJ5O1xyXG5cclxuICAgICAgICAvLyBSZWdpc3RlciBjb3JlRGlzY292ZXJ5IG9uIElkZW50aXR5TW9kdWxlXHJcbiAgICAgICAgdGhpcy5pZGVudGl0eU1vZHVsZS5jb3JlRGlzY292ZXJ5ID0gdGhpcy5jb3JlRGlzY292ZXJ5O1xyXG5cclxuICAgICAgICAvLyBVc2Ugc2FuZGJveCBmYWN0b3J5IHRvIHVzZSBzcGVjaWZpYyBtZXRob2RzXHJcbiAgICAgICAgLy8gYW5kIHNldCB0aGUgbWVzc2FnZSBidXMgdG8gdGhlIGZhY3RvcnlcclxuICAgICAgICB0aGlzLnJ1bnRpbWVGYWN0b3J5Lm1lc3NhZ2VCdXMgPSB0aGlzLm1lc3NhZ2VCdXM7XHJcblxyXG4gICAgICAgIC8vIEluc3RhbmNpYXRlIHRoZSBTeW5jaGVyTWFuYWdlcjtcclxuICAgICAgICB0aGlzLnN5bmNoZXJNYW5hZ2VyID0gbmV3IFN5bmNoZXJNYW5hZ2VyKHRoaXMucnVudGltZVVSTCwgdGhpcy5tZXNzYWdlQnVzLCB0aGlzLnJlZ2lzdHJ5LCB0aGlzLnJ1bnRpbWVDYXRhbG9ndWUsIHRoaXMuc3RvcmFnZXMuc3luY2hlck1hbmFnZXIsIG51bGwsIHRoaXMuX2RhdGFPYmplY3RzU3RvcmFnZSwgdGhpcy5pZGVudGl0eU1vZHVsZSk7XHJcblxyXG5cclxuICAgICAgICAvLyBTZXQgaW50byBsb2FkZXIgdGhlIG5lZWRlZCBjb21wb25lbnRzO1xyXG4gICAgICAgIHRoaXMubG9hZGVyLnJ1bnRpbWVVUkwgPSB0aGlzLnJ1bnRpbWVVUkw7XHJcbiAgICAgICAgdGhpcy5sb2FkZXIubWVzc2FnZUJ1cyA9IHRoaXMubWVzc2FnZUJ1cztcclxuICAgICAgICB0aGlzLmxvYWRlci5yZWdpc3RyeSA9IHRoaXMucmVnaXN0cnk7XHJcbiAgICAgICAgdGhpcy5sb2FkZXIucnVudGltZUNhdGFsb2d1ZSA9IHRoaXMucnVudGltZUNhdGFsb2d1ZTtcclxuICAgICAgICB0aGlzLmxvYWRlci5ydW50aW1lRmFjdG9yeSA9IHRoaXMucnVudGltZUZhY3Rvcnk7XHJcblxyXG4gICAgICAgIC8vSW5zdGFudGlhdGUgRGlzY292ZXJ5IExpYiBmb3Igbm90aWZpY2F0aW9uIHRlc3RpbmdcclxuICAgICAgICAvLyB0aGlzLmRpc2NvdmVyeSA9IG5ldyBEaXNjb3ZlcnkoXCJoeXBlcnR5Oi8vbG9jYWxob3N0L3Rlc3RcIiwgdGhpcy5ydW50aW1lVVJMLCB0aGlzLm1lc3NhZ2VCdXMpO1xyXG4gICAgICAgIC8vIHRoaXMubG9hZFN0dWIoXCJsb2NhbGhvc3RcIik7XHJcbiAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgLy8gICB0aGlzLmRpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllc0RPKFwidXNlcjovL2dvb2dsZS5jb20vb3BlbmlkdGVzdDIwQGdtYWlsLmNvbVwiKVxyXG4gICAgICAgIC8vICAgLnRoZW4oaHlwZXJ0aWVzID0+IHtcclxuICAgICAgICAvLyAgICAgaHlwZXJ0aWVzLmZvckVhY2goaHlwZXJ0eSA9PntcclxuICAgICAgICAvLyAgICAgICBoeXBlcnR5Lm9uTGl2ZSgoKSA9PiBsb2cubG9nKGBOb3RpZmljYXRpb24gZnJvbSAke2h5cGVydHkuZGF0YS5oeXBlcnR5SUR9IGNoYW5nZWQgdG8gbGl2ZWApKTtcclxuICAgICAgICAvLyAgICAgICBoeXBlcnR5Lm9uRGlzY29ubmVjdGVkKCgpID0+IGxvZy5sb2coYE5vdGlmaWNhdGlvbiBmcm9tICR7aHlwZXJ0eS5kYXRhLmh5cGVydHlJRH0gY2hhbmdlZCB0byBkaXNjb25uZWN0ZWRgKSk7XHJcbiAgICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAgIC8vICAgfSk7XHJcbiAgICAgICAgLy8gfSwgMjAwMCk7XHJcblxyXG5cclxuICAgICAgICAvLyB0aGlzLnN1YnNjcmlwdGlvbk1hbmFnZXIuaW5pdCgpLnRoZW4oKCk9PntcclxuICAgICAgICAvLyAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgLy8gfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHByZXBhcmVDb21wb25lbnRzID0gW107XHJcbiAgICAgICAgcHJlcGFyZUNvbXBvbmVudHMucHVzaCh0aGlzLnN1YnNjcmlwdGlvbk1hbmFnZXIuaW5pdCgpKTtcclxuICAgICAgICBwcmVwYXJlQ29tcG9uZW50cy5wdXNoKHRoaXMuaWRlbnRpdHlNb2R1bGUuaW5pdChndWlkKSk7XHJcbiAgICAgICAgcHJlcGFyZUNvbXBvbmVudHMucHVzaChjcnlwdG9NYW5hZ2VyLmxvYWRTZXNzaW9uS2V5cygpKTtcclxuICAgICAgICBwcmVwYXJlQ29tcG9uZW50cy5wdXNoKHRoaXMucmVnaXN0cnkubG9hZFJlZ2lzdHJ5KCkpO1xyXG4gICAgICAgIHByZXBhcmVDb21wb25lbnRzLnB1c2godGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLmxvYWRSZW1vdGUoKSk7XHJcblxyXG4gICAgICAgIFByb21pc2UuYWxsKHByZXBhcmVDb21wb25lbnRzKS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSA1KSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZWplY3QoJ1tSdW50aW1lVUEuX2xvYWRDb21wb25lbnRzXSBFcnJvciBdICcsIHJlc3VsdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgRXJyb3IocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZXBsb3kgSHlwZXJ0eSBmcm9tIENhdGFsb2d1ZSBVUkxcclxuICAgKlxyXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9zcGVjcy90cmVlL21hc3Rlci9kYXRhbW9kZWwvY29yZS9hZGRyZXNzXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1VSTC5IeXBlcnR5Q2F0YWxvZ3VlVVJMfSBoeXBlcnR5Q2F0YWxvZ3VlVVJMIC0gVGhlIENhdGFsb2d1ZSBVUkwgdXNlZCB0byBpZGVudGlmeSBkZXNjcmlwdG9ycyBpbiB0aGUgQ2F0YWxvZ3VlLlxyXG4gICAqIEBwYXJhbSB7Ym9vbGVhbnxVUkwuSHlwZXJ0eVVSTH0gW3JldXNlVVJMPWZhbHNlXSByZXVzZVVSTCAtIHJldXNlVVJMIGlzIHVzZWQgdG8gcmV1c2UgdGhlIGh5cGVydHlVUkwgcHJldmlvdXNseSByZWdpc3RyZWQsIGJ5IGRlZmF1bHQgdGhlIHJldXNlIGlzIGRpc2FibGVkO1xyXG4gICAqIEBwYXJhbSB7VVJMfSBhcHBVUkwgLSB0aGUgYXBwIHVybCBhZGRyZXNzOyAvLyBUT0RPOiBpbXByb3ZlIHRoaXMgZGVzY3JpcHRpb247XHJcbiAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbiwgRXJyb3I+fSB0aGlzIGlzIFByb21pc2UgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgY29tcG9uZW50cyBhcmUgbG9hZGVkIHdpdGggc3VjY2VzcyBvciBhbiBlcnJvciBpZiBzb21lb25lIGZhaWxzLlxyXG4gICAqXHJcbiAgICogQG1lbWJlck9mIFJ1bnRpbWVVQVxyXG4gICAqL1xyXG4gIGxvYWRIeXBlcnR5KGh5cGVydHlDYXRhbG9ndWVVUkwsIHJldXNlVVJMID0gZmFsc2UsIGFwcFVSTCkge1xyXG5cclxuICAgIGlmICghaHlwZXJ0eUNhdGFsb2d1ZVVSTCkgdGhyb3cgbmV3IEVycm9yKCdIeXBlcnR5IGRlc2NyaXB0b3IgdXJsIHBhcmFtZXRlciBpcyBuZWVkZWQnKTtcclxuICAgIHJldHVybiB0aGlzLmxvYWRlci5sb2FkSHlwZXJ0eShoeXBlcnR5Q2F0YWxvZ3VlVVJMLCByZXVzZVVSTCwgYXBwVVJMKTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIERlcGxveSBTdHViIGZyb20gQ2F0YWxvZ3VlIFVSTCBvciBkb21haW4gdXJsXHJcbiAgKiBAcGFyYW0gIHtVUkwuVVJMfSAgICAgZG9tYWluICAgICAgICAgIGRvbWFpblxyXG4gICovXHJcbiAgbG9hZFN0dWIocHJvdG9jb2xzdHViQ2F0YWxvZ3VlVVJMKSB7XHJcblxyXG4gICAgaWYgKCFwcm90b2NvbHN0dWJDYXRhbG9ndWVVUkwpIHRocm93IG5ldyBFcnJvcignUHJvdG9TdHViIGRlc2NyaXB0b3IgdXJsIHBhcmFtZXRlciBpcyBuZWVkZWQnKTtcclxuICAgIHJldHVybiB0aGlzLmxvYWRlci5sb2FkU3R1Yihwcm90b2NvbHN0dWJDYXRhbG9ndWVVUkwpO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRGVwbG95IGlkcFByb3h5IGZyb20gQ2F0YWxvZ3VlIFVSTCBvciBkb21haW4gdXJsXHJcbiAgKiBAcGFyYW0gIHtVUkwuVVJMfSAgICAgZG9tYWluICAgICAgICAgIGRvbWFpblxyXG4gICovXHJcbiAgbG9hZElkcFByb3h5KGlwZFByb3h5Q2F0YWxvZ3VlVVJMKSB7XHJcbiAgICBsb2cubG9nKCdpcGRQcm94eUNhdGFsb2d1ZVVSTCcsIGlwZFByb3h5Q2F0YWxvZ3VlVVJMKTtcclxuXHJcbiAgICBpZiAoIWlwZFByb3h5Q2F0YWxvZ3VlVVJMKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBJRFAgUHJveHkgVVJMIGlzIGEgbmVlZGVkIHBhcmFtZXRlciwgY291bGQgYmUgYSBET01BSU4gb3IgYSBVUkwnKTtcclxuICAgIHJldHVybiB0aGlzLmxvYWRlci5sb2FkSWRwUHJveHkoaXBkUHJveHlDYXRhbG9ndWVVUkwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCB0byBjbG9zZSBhbGwgdGhlIHJ1bnRpbWU7IFVucmVnaXN0ZXIgYWxsIGh5cGVydGllcztcclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEJvb2xlYW4+fSByZXN1bHQgb2YgdGhlIGNsb3NlIG1ldGhvZCwgd2l0aCB0cnVlIG9yIGZhbHNlIHRvIHRoZSBvcGVyYXRpb24gc3VjY2VzcztcclxuICAgKi9cclxuICBjbG9zZShsb2dPdXQpIHtcclxuICAgIGNvbnNvbGUubG9nKCdSdW50aW1lIGNvcmUgbG9nb3V0OiAnLCBsb2dPdXQpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGlmIChsb2dPdXQgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5pZGVudGl0eUhhbmRsZXIucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2cuaW5mbygnVW5yZWdpc3RlciBhbGwgaHlwZXJ0aWVzJyk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgX3RoaXMucmVnaXN0cnkudW5yZWdpc3RlckFsbEh5cGVydGllcygpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xyXG4gICAgICAgIGxvZy5pbmZvKCdBbGwgdGhlIGh5cGVydGllcyBhcmUgdW5yZWdpc3RlZCB3aXRoIFN1Y2Nlc3M6JywgcmVzdWx0KTtcclxuICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XHJcbiAgICAgICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gdW5yZWdpc3RlciB0aGUgaHlwZXJ0aWVzJywgcmVhc29uKTtcclxuICAgICAgICByZWplY3QoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVc2VkIHRvIHJlc2V0IHRoZSBydW50aW1lIGJ5IGRlbGV0aW5nIGFsbCBkYXRhIGZyb20gdGhlIHN0b3JhZ2UgbWFuYWdlcjtcclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEJvb2xlYW4+fSByZXN1bHQgb2YgdGhlIHJlc2V0IG1ldGhvZCwgd2l0aCB0cnVlIG9yIGZhbHNlIHRvIHRoZSBvcGVyYXRpb24gc3VjY2VzcztcclxuICAgKi9cclxuICByZXNldCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdSdW50aW1lVUEuUnVudGltZSBjb3JlIHJlc2V0OiAnKTtcclxuXHJcbiAgICBsZXQgcmVzZXRpbmcgPSBbXTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgLy9UT0RPOiBkZWxlZ2F0ZSBkYiByZXNldCBvcGVyYXRpb24gdG8gZWFjaCBjb21wb25lbnRcclxuICAgICAgLy8gICAgdGhpcy5pZGVudGl0eU1hbmFnZXIucmVzZXQoKTtcclxuXHJcbiAgICAgIHRoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5kZWxldGVSZW1vdGVzKCkudGhlbigoKT0+e1xyXG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XHJcbiAgICAgIH0pLlxyXG4gICAgICB0aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VzLmlkZW50aXR5LmdldChmYWxzZSwgZmFsc2UsICdpZGVudGl0aWVzJykudGhlbigoaWRlbnRpdGllcykgPT4ge1xyXG4gICAgICAgICAgbGV0IGlkZW50aXRpZXNLZXlzID0gT2JqZWN0LmtleXMoaWRlbnRpdGllcyk7XHJcbiAgXHJcbiAgICAgICAgICBpZGVudGl0aWVzS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgcmVzZXRpbmcucHVzaCh0aGlzLnN0b3JhZ2VzLmlkZW50aXR5LmRlbGV0ZShrZXksIGZhbHNlLCAnaWRlbnRpdGllcycpKTtcclxuICBcclxuICAgICAgICAgIH0pO1xyXG4gIFxyXG4gICAgICAgICAgcmVzZXRpbmcucHVzaCh0aGlzLnN0b3JhZ2VzLmNhcGFiaWxpdGllcy5kZWxldGUoJ2NhcGFiaWxpdGllcycpKTtcclxuICAgICAgICAgIHJlc2V0aW5nLnB1c2godGhpcy5zdG9yYWdlcy5jcnlwdG9NYW5hZ2VyLmRlbGV0ZSgndXNlckFzeW1tZXRyaWNLZXknKSk7XHJcbiAgICAgICAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMuaHlwZXJ0eVJlc291cmNlcy5kZWxldGUoJ2h5cGVydHlSZXNvdXJjZXMnKSk7XHJcbiAgICAgICAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMuaWRlbnRpdHkuZGVsZXRlKCdhY2Nlc3NUb2tlbnMnKSk7XHJcbiAgICAgICAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMucmVnaXN0cnkuZGVsZXRlKCdyZWdpc3RyeTpEYXRhT2JqZWN0VVJMcycpKTtcclxuICAgICAgICAgIHJlc2V0aW5nLnB1c2godGhpcy5zdG9yYWdlcy5yZWdpc3RyeS5kZWxldGUoJ3JlZ2lzdHJ5Okh5cGVydHlVUkxzJykpO1xyXG4gICAgICAgICAgcmVzZXRpbmcucHVzaCh0aGlzLnN0b3JhZ2VzLnJ1bnRpbWUuZGVsZXRlKCdwMnBIYW5kbGVyOlVSTCcpKTtcclxuICAgICAgICAgIHJlc2V0aW5nLnB1c2godGhpcy5zdG9yYWdlcy5ydW50aW1lLmRlbGV0ZSgncnVudGltZTpVUkwnKSk7XHJcbiAgICAgICAgICAvLyAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMucnVudGltZUNhdGFsb2d1ZS5kZWxldGUoJ3J1bnRpbWVDYXRhbG9ndWUnKSk7XHJcbiAgICAgICAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoJ3N1YnNjcmlwdGlvbnMnKSk7XHJcbiAgICAgICAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMuc3luY2hlck1hbmFnZXIuZGVsZXRlKCdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJykpO1xyXG4gICAgICAgICAgcmVzZXRpbmcucHVzaCh0aGlzLnN0b3JhZ2VzLnN5bmNoZXJNYW5hZ2VyLmRlbGV0ZSgncmVtb3RlcycpKTtcclxuICBcclxuICAgICAgICAgIFByb21pc2UuYWxsKHJlc2V0aW5nKS50aGVuKChyZXN1bHQpID0+IHtcclxuICBcclxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lVUEucmVzZXRdIHJlc2V0IHdpdGggU3VjY2VzczonLCByZXN1bHQpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gcmVzZXQgYWxsIERCcycsIHJlYXNvbik7XHJcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUnVudGltZVVBO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7O0FDL0hBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFGQTs7QUNBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7Ozs7O0FBS0E7Ozs7Ozs7O0FBUUE7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFFQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQVNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDMWtCQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7Ozs7O0FBS0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBOzs7QUFsR0E7QUFBQTtBQUFBOzs7Ozs7QUFzR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Ozs7Ozs7O0FDL0hBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7OztBQUdBO0FBQUE7Ozs7QUFDQTs7Ozs7QUFNQTs7OztBQUlBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTs7OztBQVFBOzs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFMQTtBQVlBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7Ozs7Ozs7O0FBMENBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7OztBQXhPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUE2SkE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFJQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUFBO0FBRUE7Ozs7OztBQUtBO0FBQUE7QUFBQTs7Ozs7O0FBc0NBOzs7Ozs7OztBQ3BVQTtBQUVBOzs7OztBQUlBOzs7QUFDQTs7O0FBSUE7Ozs7QUFJQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUpBO0FBVUE7QUFFQTtBQUVBO0FBakJBO0FBcUJBO0FBQ0E7OztBQUNBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQVFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFKQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUpBO0FBVUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSkE7QUFVQTtBQUNBO0FBQ0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBOzs7QUFySEE7QUFDQTtBQUdBOzs7Ozs7QUF1SEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JPQTs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUVBOzs7Ozs7Ozs7OztBQVlBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBUkE7QUFVQTtBQUNBOzs7O0FBNEJBOzs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFKQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFKQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXJCQTtBQXdCQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7O0FBbE9BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFuREE7QUFDQTtBQWdRQTs7Ozs7Ozs7QUM3UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFLQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNySkE7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUVBOzs7Ozs7Ozs7OztBQVlBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBZ0JBO0FBQ0E7QUFBQTs7Ozs7Ozs7OztBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUhBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQWNBOzs7Ozs7QUFNQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkJBOzs7OztBQU1BO0FBRUE7OztBQW5EQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7O0FBdEhBO0FBQ0E7QUFxS0E7Ozs7Ozs7O0FDcExBOzs7O0FBS0E7QUFDQTtBQUNBOzs7QUFFQTs7OztBQUtBO0FBQUE7QUFFQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTkE7QUFDQTtBQVFBO0FBRUE7OztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7OztBQUdBOzs7Ozs7Ozs7O0FDM0RBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFJQTs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBaUJBOzs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBQ0E7QUFTQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFDQTtBQVNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBcUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBTEE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQUNBO0FBU0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQTdaQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFJQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUFBOzs7Ozs7QUFtWUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzV3QkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7OztBQUlBOzs7OztBQUNBOzs7Ozs7OztBQVNBOzs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBaEJBO0FBaUJBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFKQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBOzs7Ozs7O0FBUUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7Ozs7QUFEQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBR0E7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQU1BOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUZBO0FBSUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUE3REE7QUFDQTtBQStEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQWRBO0FBQ0E7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7QUFxQkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUlBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBZkE7QUFDQTtBQWlCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQTlWQTtBQUFBO0FBQUE7OztBQXdOQTtBQUNBO0FBQ0E7QUFBQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBcFpBO0FBQUE7OztBQTZnQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hqQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7Ozs7QUFJQTs7Ozs7QUFDQTs7Ozs7O0FBT0E7Ozs7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFqQkE7QUFpQkE7QUFFQTs7Ozs7OztBQUdBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFMQTtBQUNBO0FBV0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUpBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUF6VEE7QUFBQTs7O0FBNFRBOzs7Ozs7OztBQ2hXQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7Ozs7Ozs7O0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQVBBO0FBQUE7QUFBQTs7Ozs7O0FBVUE7Ozs7Ozs7O0FDekdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBOzs7QUFDQTs7Ozs7Ozs7Ozs7O0FBZUE7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQWtCQTs7Ozs7Ozs7Ozs7O0FBWUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQURBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUtBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUZBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFGQTtBQU1BO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBcEJBO0FBQ0E7QUFzQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFMQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBckJBO0FBQ0E7QUF1QkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBYUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7OztBQXp1QkE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFJQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFBQTs7Ozs7O0FBaXVCQTs7Ozs7Ozs7QUMzMEJBOzs7QUFJQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBekJBO0FBQ0E7QUEwQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBTEE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQXJCQTtBQUNBO0FBdUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7O0FDcElBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBRUE7Ozs7O0FBSUE7OztBQUVBOzs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFHQTs7Ozs7Ozs7QUNoSEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7QUFJQTs7O0FBRUE7Ozs7Ozs7QUFRQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFTQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUVBOzs7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNOQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBRUE7Ozs7QUFHQTs7Ozs7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUpBO0FBS0E7QUFLQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7QUF6Q0E7QUFDQTtBQThDQTs7Ozs7Ozs7Ozs7Ozs7OztBQzVFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7O0FBSUE7OztBQUVBOzs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7OztBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUZBO0FBSkE7QUFZQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFGQTtBQUpBO0FBWUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQURBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBREE7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBSUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFJQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7O0FBR0E7Ozs7Ozs7O0FDditCQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUFBO0FBR0E7QUFDQTtBQUNBOzs7Ozs7OztBQUtBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7OztBQ25IQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7Ozs7QUFJQTs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7OztBQUtBOzs7OztBQUVBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQWhDQTtBQWlDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7OztBQUdBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBOzs7O0FBNVJBO0FBQ0E7QUErUkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN1NBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBOzs7OztBQUlBOzs7OztBQUVBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQXJDQTtBQXNDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBOzs7O0FBL0lBO0FBQ0E7QUFtSkE7Ozs7QUN4TEE7OztBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTs7OztBQ25CQTs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFJQTs7QUN2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7O0FBTUE7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUtBOzs7OztBQU1BO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFHQTs7O0FBNUlBO0FBQ0E7QUFDQTs7Ozs7O0FBOElBOzs7Ozs7OztBQzNMQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTs7O0FBeUhBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBcUJBO0FBRUE7QUFFQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBREE7QUFJQTtBQUVBO0FBQ0E7QUFEQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBT0E7QUFDQTtBQVZBO0FBYUE7QUFDQTtBQURBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7Ozs7OztBQU1BOzs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBeG1CQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFsQkE7QUFvQkE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFnQkE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7QUF3ZEE7Ozs7OztBQ3pxQkE7QUFFQTtBQUVBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFNQTs7Ozs7Ozs7QUNoQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTs7O0FBVUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFVQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBclBBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7O0FBbVBBOzs7Ozs7OztBQ2pWQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBSUE7QUFFQTs7Ozs7OztBQXdIQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7OztBQXFCQTtBQUVBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQURBO0FBSUE7QUFFQTtBQUNBO0FBREE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFPQTtBQUNBO0FBVkE7QUFhQTtBQUNBO0FBREE7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBUUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7O0FBTUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5REE7Ozs7Ozs7QUFNQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9DQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBR0E7Ozs7OztBQU1BOzs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBMW1CQTtBQUNBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBbEJBO0FBb0JBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBZ0JBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7O0FBOGRBOzs7Ozs7OztBQzlxQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTs7O0FBaUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUFBOzs7Ozs7OztBQU9BO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUdBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFVQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBck5BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7Ozs7QUEyTUE7Ozs7Ozs7O0FDalRBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBOzs7QUFDQTs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUtBO0FBQ0E7QUFFQTs7O0FBUEE7QUFDQTtBQUNBOzs7Ozs7QUFZQTs7Ozs7Ozs7QUN0SEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBOzs7O0FBSUE7QUFFQTs7Ozs7O0FBS0E7OztBQUNBOzs7QUFJQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7OztBQUdBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBOzs7O0FBSUE7OztBQXpGQTtBQUFBO0FBQUE7Ozs7OztBQTRGQTtBQUNBO0FBRUE7Ozs7Ozs7O0FDekpBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBTUE7OztBQUNBOzs7Ozs7QUFTQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQU5BO0FBUUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBRUE7Ozs7Ozs7Ozs7QUFTQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQU1BO0FBQUE7QUFBQTs7Ozs7O0FBSUE7OztBQUNBOzs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBR0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQWxCQTtBQUFBO0FBQUE7Ozs7OztBQXFCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5VUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFFQTs7Ozs7O0FBS0E7Ozs7O0FBRUE7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUVBOzs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUF2Q0E7QUFDQTtBQTBDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4RUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFDQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7Ozs7QUFJQTs7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQVBBO0FBU0E7QUFFQTs7Ozs7Ozs7Ozs7QUFPQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTs7OztBQXRGQTtBQUNBO0FBeUZBOzs7Ozs7OztBQzFIQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFFQTs7OztBQUdBOzs7QUFDQTs7Ozs7QUFLQTs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBZ0JBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTtBQUVBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7O0FBWUE7QUFFQTs7OztBQTlKQTs7OztBQUlBO0FBQUE7QUFBQTs7O0FBWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQW1LQTs7Ozs7Ozs7QUN0T0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBOzs7O0FBSUE7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFFQTs7Ozs7QUFJQTs7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQVlBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7O0FBM0RBO0FBQ0E7QUE2REE7Ozs7Ozs7O0FDMUZBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTs7OztBQUdBOzs7QUFFQTs7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFGQTtBQUZBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBR0E7Ozs7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFKQTtBQUNBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUtBOzs7Ozs7OztBQU9BO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBQ0E7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFKQTtBQUNBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDOVhBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFHQTs7Ozs7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTkE7QUFTQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUpBO0FBQ0E7QUFXQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQVRBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFJQTs7Ozs7Ozs7QUNyVkE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFJQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzVDQTs7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7OztBQUdBOzs7O0FBR0E7OztBQUVBOzs7Ozs7Ozs7QUFTQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBOEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBZEE7QUFnQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7OztBQVNBO0FBQ0E7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBR0E7OztBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUdBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7QUFHQTtBQUlBO0FBRUE7QUFFQTtBQUVBOzs7O0FBSUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBREE7QUFJQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFJQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFKQTtBQUNBO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQURBO0FBSUE7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQVRBO0FBQ0E7QUFEQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQTNDQTtBQTZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFsL0NBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7Ozs7OztBQTQ2Q0E7O0FDem5EQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFEQTtBQXBDQTtBQXlDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQXJCQTtBQTBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTkE7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQWhHQTs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7Ozs7O0FBSUE7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQTZDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOzs7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBbFZBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUVBO0FBT0E7QUFDQTtBQUVBOzs7QUFSQTtBQUNBO0FBRUE7QUFPQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7OztBQTZTQTtBQUNBO0FBQ0E7QUFBQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBR0E7Ozs7OztBQUdBOzs7O0FDaGFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7O0FDMURBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJBOzs7QUFFQTs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUFBO0FBRUE7Ozs7O0FBTUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBR0E7Ozs7Ozs7O0FBd0RBO0FBQ0E7QUFBQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFLQTs7Ozs7QUFLQTs7Ozs7Ozs7QUFtQkE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBS0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBOzs7OztBQUlBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTs7Ozs7Ozs7QUFLQTtBQUNBOzs7O0FBS0E7QUFDQTtBQUFBOzs7OztBQU9BO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUVBO0FBRUE7QUFFQTs7Ozs7QUFJQTs7Ozs7Ozs7QUFVQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOzs7QUFHQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBSkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBS0E7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFKQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBT0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFEQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFMQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBTEE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFsaURBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUE0QkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7Ozs7O0FBZzlDQTs7Ozs7Ozs7QUNyb0RBOzs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7OztBQWNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBOzs7Ozs7QUFLQTs7Ozs7Ozs7QUNqR0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFOQTtBQVFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQ3BHQTs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQzdDQTtBQUVBOzs7Ozs7OztBQU9BOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQzNDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7QUFJQTs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQ2hEQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7QUFJQTs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQ2hEQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7QUFJQTs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDN0NBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBRUE7Ozs7O0FBSUE7OztBQUVBOzs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFLQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25FQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUVBOzs7OztBQUlBOzs7OztBQUVBOzs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUVBOzs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQTFCQTtBQUNBO0FBNkJBOzs7Ozs7OztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFSQTtBQVVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXZDQTtBQUNBO0FBeUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQVhBO0FBYUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFJQTs7Ozs7Ozs7QUMvSEE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTs7OztBQUlBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQW1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFUQTtBQVdBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXRCQTtBQXdCQTs7O0FBdkxBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTs7Ozs7O0FBOEtBOzs7Ozs7OztBQzFOQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTs7O0FBQ0E7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUdBOzs7Ozs7O0FBS0E7OztBQUNBOzs7Ozs7QUFRQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFNQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQTVDQTtBQUFBO0FBQUE7OztBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTs7Ozs7O0FBZ0RBOzs7QUFDQTs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoS0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFLQTs7Ozs7QUFDQTs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBWEE7QUFZQTtBQUNBOzs7O0FBS0E7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBVEE7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQXJMQTtBQUFBO0FBQUE7OztBQUVBO0FBQUE7QUFBQTs7OztBQTVCQTtBQUNBO0FBaU5BOztBQ3JQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7Ozs7O0FDakVBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUlBOzs7QUFFQTs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFEQTtBQUlBO0FBTEE7QUFRQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQURBO0FBSUE7QUFMQTtBQVNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBREE7QUFJQTtBQUxBO0FBUUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFEQTtBQUlBO0FBQ0E7QUFOQTtBQVNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBVEE7QUFZQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRkE7QUFLQTtBQU5BO0FBVUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFEQTtBQUlBO0FBTEE7QUFRQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQURBO0FBSUE7QUFDQTtBQU5BO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUpBO0FBT0E7QUFSQTtBQVdBO0FBQ0E7QUFFQTtBQUVBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBRkE7QUFLQTtBQVJBO0FBV0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFGQTtBQUtBO0FBUkE7QUFXQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUZBO0FBS0E7QUFDQTtBQVRBO0FBWUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFGQTtBQUtBO0FBQ0E7QUFUQTtBQVlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFUQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBREE7QUFEQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBSUE7QUFQQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUtBOzs7Ozs7OztBQzV1QkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7OztBQU9BOzs7QUFFQTs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBR0E7Ozs7Ozs7QUFxRUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFKQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBOzs7Ozs7QUFLQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSkE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUpBO0FBU0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFKQTtBQVNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSkE7QUFTQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBUUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSkE7QUFVQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFTQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBMVpBO0FBNFpBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBSkE7QUFVQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVJBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUF0Q0E7QUF5Q0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBcDFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7O0FBSUE7Ozs7Ozs7O0FBU0E7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7O0FBMHhDQTs7Ozs7O0FBS0E7Ozs7Ozs7Ozs7O0FDbDZDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBdUVBOzs7Ozs7Ozs7Ozs7O0FBYUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQXhuQkE7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7OztBQTRqQkE7O0FDcHBCQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7OztBQ3pCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7O0FDbkpBOzs7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUlBOzs7Ozs7OztBQ3JHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFHQTtBQUVBOzs7OztBQUlBOzs7QUFFQTs7Ozs7OztBQU9BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFMQTtBQVVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBTEE7QUFVQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE5QkE7QUErQkE7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFTQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFGQTtBQUpBO0FBQ0E7QUFXQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBdm1CQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7OztBQWdtQkE7Ozs7Ozs7Ozs7QUM5c0JBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFHQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7QUFJQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7OztBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCQTs7Ozs7Ozs7Ozs7QUFRQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFJQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBOzs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUtBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBSUE7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsOUJBOzs7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7Ozs7QUFJQTs7Ozs7Ozs7QUNoQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBSEE7QUFLQTtBQUVBO0FBRUE7Ozs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTEE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFMQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUlBO0FBQ0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFMQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7Ozs7OztBQUlBOzs7Ozs7OztBQzFWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQ3hFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUpBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFHQTs7Ozs7O0FBTUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQURBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBS0E7QUFDQTtBQUVBOzs7QUFoWUE7QUFDQTtBQUNBOzs7QUFnQ0E7QUFDQTtBQUNBOzs7Ozs7QUFnV0E7Ozs7Ozs7O0FDdmFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBOzs7O0FBS0E7QUFDQTtBQUFBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFNQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQTVJQTtBQUNBO0FBQ0E7Ozs7OztBQThJQTs7Ozs7Ozs7QUN6TEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBSUE7OztBQUNBOzs7Ozs7OztBQVVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBTkE7QUFRQTtBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFKQTtBQUNBO0FBTUE7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUtBOzs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7OztBQUtBO0FBQ0E7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUNBO0FBT0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUtBO0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUtBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFHQTtBQUVBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUE1OUJBO0FBQUE7QUFBQTs7Ozs7O0FBZytCQTs7Ozs7Ozs7QUNwa0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDM0JBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTs7Ozs7QUFLQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUhBO0FBS0E7QUFFQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBR0E7OztBQUtBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUtBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBS0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUF2SkE7QUFBQTtBQUFBOzs7Ozs7QUEwSkE7Ozs7Ozs7O0FDeFBBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQTBCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQS9CQTtBQUNBO0FBQ0E7QUErQkE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQXhDQTtBQUNBO0FBQ0E7QUF3Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBMUNBO0FBQ0E7QUFDQTtBQTBDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBN0NBO0FBQ0E7QUFDQTtBQTZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUEvQ0E7QUFDQTtBQUNBO0FBK0NBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFwREE7QUFDQTtBQUNBO0FBb0RBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDN0ZBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBWUE7QUFDQTs7O0FBMENBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBZkE7QUFpQkE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBN1NBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7QUF2REE7QUFDQTtBQWdVQTs7Ozs7Ozs7Ozs7O0FDMVVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7OztBQUZBO0FBVUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUEzQkE7QUFDQTtBQURBO0FBQUE7QUErQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkRBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBRUE7Ozs7O0FBSUE7Ozs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUFhQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFYQTtBQVlBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBa0RBO0FBQ0E7QUFFQTs7O0FBbkRBO0FBQ0E7QUFDQTtBQW1EQTtBQUNBO0FBRUE7OztBQXBEQTtBQUNBO0FBQ0E7QUFvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBdERBO0FBQ0E7QUFDQTtBQXNEQTtBQUNBO0FBRUE7OztBQXZEQTtBQUNBO0FBQ0E7QUF1REE7QUFDQTtBQUVBOzs7QUF4REE7QUFDQTtBQUNBO0FBd0RBO0FBQ0E7QUFFQTs7O0FBekRBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFBQTs7OztBQUlBO0FBQ0E7QUFFQTs7O0FBakJBO0FBQ0E7QUFDQTtBQWlCQTtBQUNBO0FBRUE7OztBQWxCQTtBQUNBO0FBQ0E7QUFpREE7QUFDQTtBQUVBOzs7O0FBbkhBO0FBc0hBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFJQTs7Ozs7Ozs7QUMzSkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7QUFHQTs7O0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUF3QkE7QUFDQTtBQUVBOzs7QUF6QkE7QUFDQTtBQUNBO0FBeUJBO0FBQ0E7QUFFQTs7O0FBMUJBO0FBQ0E7QUFDQTtBQU1BO0FBQ0E7QUFFQTs7O0FBUEE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUVBOzs7Ozs7QUFhQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4RUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7O0FBRUE7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBVEE7QUFVQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFzQkE7QUFDQTtBQUVBOzs7QUF2QkE7QUFDQTtBQUNBO0FBdUJBO0FBQ0E7QUFFQTs7O0FBeEJBO0FBQ0E7QUFDQTtBQXdCQTtBQUNBO0FBRUE7OztBQXpCQTtBQUNBO0FBQ0E7QUF5QkE7QUFDQTtBQUVBOzs7QUExQkE7QUFDQTtBQUNBO0FBMEJBO0FBQ0E7QUFFQTs7O0FBM0JBO0FBQ0E7QUFDQTtBQTJCQTtBQUNBO0FBRUE7Ozs7QUFoRkE7QUFDQTtBQW9GQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBREE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNySEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7QUFJQTtBQUNBO0FBQ0E7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUtBO0FBS0E7QUFFQTtBQUtBO0FBQ0E7QUFDQTtBQXhCQTtBQTBCQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFVQTtBQUNBO0FBRUE7OztBQVhBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFFQTs7O0FBWkE7QUFDQTtBQUNBO0FBWUE7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQS9GQTtBQUNBO0FBaUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQy9IQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7OztBQUlBO0FBQ0E7QUFDQTs7Ozs7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBSUE7QUFLQTtBQUNBO0FBZkE7QUFnQkE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBVUE7QUFDQTtBQUVBOzs7QUFYQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBRUE7OztBQVpBO0FBQ0E7QUFDQTtBQVlBO0FBQ0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7QUE5REE7QUFpRUE7Ozs7O0FBR0E7QUFBQTtBQUFBO0FBQ0E7Ozs7Ozs7O0FBUUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFoQkE7QUFBQTtBQUFBO0FBc0NBO0FBQ0E7QUF2Q0E7QUFBQTtBQUFBO0FBa0JBO0FBQ0E7QUFuQkE7QUFBQTtBQUFBO0FBc0JBO0FBQ0E7QUF2QkE7QUFBQTtBQUFBO0FBMEJBO0FBQ0E7QUEzQkE7QUFBQTtBQUFBO0FBOEJBO0FBQ0E7QUEvQkE7QUFBQTtBQUFBO0FBa0NBO0FBQ0E7QUFuQ0E7QUFDQTtBQURBO0FBQUE7QUEyQ0E7Ozs7QUFHQTtBQUFBO0FBQUE7QUFFQTs7Ozs7Ozs7O0FBU0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5CQTtBQUFBO0FBQUE7QUFxQkE7QUFDQTtBQXRCQTtBQUFBO0FBQUE7QUF5QkE7QUFDQTtBQTFCQTtBQUFBO0FBQUE7QUE2QkE7QUFDQTtBQTlCQTtBQUFBO0FBQUE7QUFpQ0E7QUFDQTtBQWxDQTtBQUFBO0FBQUE7QUFxQ0E7QUFDQTtBQXRDQTtBQUFBO0FBQUE7QUF5Q0E7QUFDQTtBQTFDQTtBQUFBO0FBQUE7QUE2Q0E7QUFDQTtBQTlDQTtBQUFBO0FBQUE7QUFrREE7QUFDQTtBQW5EQTtBQUNBO0FBREE7QUFBQTtBQXNEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2TUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7QUFHQTtBQUNBO0FBQ0E7Ozs7O0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUpBO0FBS0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBVUE7QUFDQTtBQUNBOzs7QUFWQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7QUFsQkE7QUFDQTtBQXdCQTs7Ozs7Ozs7Ozs7Ozs7OztBQ3JEQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7OztBQUlBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUpBO0FBQUE7QUFDQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFKQTtBQUFBO0FBTUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFIQTtBQUlBO0FBQ0E7QUFOQTtBQUFBO0FBQ0E7QUFRQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBSkE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFKQTtBQUFBO0FBTUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUpBO0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBSkE7QUFBQTtBQU1BO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUlBOzs7Ozs7OztBQ2pGQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUUE7Ozs7Ozs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBVUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztBQWNBO0FBRUE7QUFXQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCQTtBQUVBO0FBWUE7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUVBO0FBV0E7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUFZQTtBQUVBO0FBVUE7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFVQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7QUFVQTtBQUNBO0FBVUE7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUFZQTtBQUVBO0FBWUE7QUFZQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBTUE7QUFFQTs7Ozs7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1U0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FBU0E7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQURBO0FBREE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBdEJBO0FBQ0E7QUF1QkE7QUFFQTtBQUdBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFhQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBZ0JBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFhQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBZ0JBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUdBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7OztBQVVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBVUE7QUFDQTtBQUNBOzs7QUFWQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQVFBOzs7Ozs7OztBQzNqQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQTs7O0FBRUE7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7O0FBTUE7QUFJQTs7Ozs7O0FBTUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7OztBQVFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFHQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFKQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FBWUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7QUFJQTtBQUVBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7QUFHQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///283\n")}])}); \ No newline at end of file +// version: 0.16.0 +// date: Mon Mar 18 2019 14:19:41 GMT+0000 (Western European Standard Time) +// licence: +/** +* Copyright 2016 PT Inovação e Sistemas SA +* Copyright 2016 INESC-ID +* Copyright 2016 QUOBIS NETWORKS SL +* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V +* Copyright 2016 ORANGE SA +* Copyright 2016 Deutsche Telekom AG +* Copyright 2016 Apizee +* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +**/ + + +// version: 0.16.0 +// date: Mon Mar 18 2019 14:19:41 GMT+0000 (Western European Standard Time) +// licence: +/** +* Copyright 2016 PT Inovação e Sistemas SA +* Copyright 2016 INESC-ID +* Copyright 2016 QUOBIS NETWORKS SL +* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V +* Copyright 2016 ORANGE SA +* Copyright 2016 Deutsche Telekom AG +* Copyright 2016 Apizee +* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +**/ + + +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("Runtime",[],n):"object"==typeof exports?exports.Runtime=n():e.Runtime=n()}(window,function(){return function(e){var n={};function t(c){if(n[c])return n[c].exports;var g=n[c]={i:c,l:!1,exports:{}};return e[c].call(g.exports,g,g.exports,t),g.l=!0,g.exports}return t.m=e,t.c=n,t.d=function(e,n,c){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:c})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var c=Object.create(null);if(t.r(c),Object.defineProperty(c,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var g in e)t.d(c,g,function(n){return e[n]}.bind(null,g));return c},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=118)}([function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n "use strict";\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(this, function () {\n "use strict";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = "undefined";\n\n var logMethods = [\n "trace",\n "debug",\n "info",\n "warn",\n "error"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === \'function\') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === \'debug\') {\n methodName = \'log\';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, \'log\');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn\'t present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n var storageKey = "loglevel";\n if (name) {\n storageKey += ":" + name;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || \'silent\').toUpperCase();\n\n if (typeof window === undefinedType) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + "=" + levelName + ";";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + "=");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3,\n "ERROR": 4, "SILENT": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return "No console available for logging";\n }\n } else {\n throw "log.setLevel() called with invalid level: " + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel == null ? "WARN" : defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== "string" || name === "") {\n throw new TypeError("You must supply a name when creating a logger.");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n return defaultLogger;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanM/NWM3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGVbbWV0aG9kTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgJ2xvZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGVzZSBwcml2YXRlIGZ1bmN0aW9ucyBhbHdheXMgbmVlZCBgdGhpc2AgdG8gYmUgc2V0IHByb3Blcmx5XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlTG9nZ2luZ01ldGhvZHMobGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2dNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IGxvZ01ldGhvZHNbaV07XG4gICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdID0gKGkgPCBsZXZlbCkgP1xuICAgICAgICAgICAgICAgIG5vb3AgOlxuICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgbG9nLmxvZyBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcbiAgICB9XG5cbiAgICAvLyBJbiBvbGQgSUUgdmVyc2lvbnMsIHRoZSBjb25zb2xlIGlzbid0IHByZXNlbnQgdW50aWwgeW91IGZpcnN0IG9wZW4gaXQuXG4gICAgLy8gV2UgYnVpbGQgcmVhbE1ldGhvZCgpIHJlcGxhY2VtZW50cyBoZXJlIHRoYXQgcmVnZW5lcmF0ZSBsb2dnaW5nIG1ldGhvZHNcbiAgICBmdW5jdGlvbiBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzKG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbCh0aGlzLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHVzZSBjbG9zZWx5IGJvdW5kIHJlYWwgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZSwgYW5kXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIGEgY29uc29sZSB0byBhcHBlYXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICBmdW5jdGlvbiBkZWZhdWx0TWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICByZXR1cm4gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB8fFxuICAgICAgICAgICAgICAgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvZ2dlcihuYW1lLCBkZWZhdWx0TGV2ZWwsIGZhY3RvcnkpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBjdXJyZW50TGV2ZWw7XG4gICAgICB2YXIgc3RvcmFnZUtleSA9IFwibG9nbGV2ZWxcIjtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICpcbiAgICAgICAqIFB1YmxpYyBsb2dnZXIgQVBJIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbCBmb3IgZGV0YWlsc1xuICAgICAgICpcbiAgICAgICAqL1xuXG4gICAgICBzZWxmLm5hbWUgPSBuYW1lO1xuXG4gICAgICBzZWxmLmxldmVscyA9IHsgXCJUUkFDRVwiOiAwLCBcIkRFQlVHXCI6IDEsIFwiSU5GT1wiOiAyLCBcIldBUk5cIjogMyxcbiAgICAgICAgICBcIkVSUk9SXCI6IDQsIFwiU0lMRU5UXCI6IDV9O1xuXG4gICAgICBzZWxmLm1ldGhvZEZhY3RvcnkgPSBmYWN0b3J5IHx8IGRlZmF1bHRNZXRob2RGYWN0b3J5O1xuXG4gICAgICBzZWxmLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50TGV2ZWw7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsLCBwZXJzaXN0KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gXCJzdHJpbmdcIiAmJiBzZWxmLmxldmVsc1tsZXZlbC50b1VwcGVyQ2FzZSgpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGxldmVsID0gc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwibnVtYmVyXCIgJiYgbGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgY3VycmVudExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgICAgIGlmIChwZXJzaXN0ICE9PSBmYWxzZSkgeyAgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgcGVyc2lzdExldmVsSWZQb3NzaWJsZShsZXZlbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZiwgbGV2ZWwsIG5hbWUpO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUgJiYgbGV2ZWwgPCBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIk5vIGNvbnNvbGUgYXZhaWxhYmxlIGZvciBsb2dnaW5nXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgbGV2ZWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXREZWZhdWx0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgICBpZiAoIWdldFBlcnNpc3RlZExldmVsKCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZW5hYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuVFJBQ0UsIHBlcnNpc3QpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5kaXNhYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuU0lMRU5ULCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEluaXRpYWxpemUgd2l0aCB0aGUgcmlnaHQgbGV2ZWxcbiAgICAgIHZhciBpbml0aWFsTGV2ZWwgPSBnZXRQZXJzaXN0ZWRMZXZlbCgpO1xuICAgICAgaWYgKGluaXRpYWxMZXZlbCA9PSBudWxsKSB7XG4gICAgICAgICAgaW5pdGlhbExldmVsID0gZGVmYXVsdExldmVsID09IG51bGwgPyBcIldBUk5cIiA6IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhIG5hbWUgd2hlbiBjcmVhdGluZyBhIGxvZ2dlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV07XG4gICAgICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgICAgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV0gPSBuZXcgTG9nZ2VyKFxuICAgICAgICAgICAgbmFtZSwgZGVmYXVsdExvZ2dlci5nZXRMZXZlbCgpLCBkZWZhdWx0TG9nZ2VyLm1ldGhvZEZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dnZXI7XG4gICAgfTtcblxuICAgIC8vIEdyYWIgdGhlIGN1cnJlbnQgZ2xvYmFsIGxvZyB2YXJpYWJsZSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuICAgIHZhciBfbG9nID0gKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUpID8gd2luZG93LmxvZyA6IHVuZGVmaW5lZDtcbiAgICBkZWZhdWx0TG9nZ2VyLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUgJiZcbiAgICAgICAgICAgICAgIHdpbmRvdy5sb2cgPT09IGRlZmF1bHRMb2dnZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2cgPSBfbG9nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG4gICAgfTtcblxuICAgIGRlZmF1bHRMb2dnZXIuZ2V0TG9nZ2VycyA9IGZ1bmN0aW9uIGdldExvZ2dlcnMoKSB7XG4gICAgICAgIHJldHVybiBfbG9nZ2Vyc0J5TmFtZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxhQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///0\n')},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(2);\nvar core = __webpack_require__(10);\nvar hide = __webpack_require__(15);\nvar redefine = __webpack_require__(11);\nvar ctx = __webpack_require__(22);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcz81Y2ExIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KTtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYgKHRhcmdldCkgcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYgKGV4cG9ydHNba2V5XSAhPSBvdXQpIGhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmIChJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dCkgZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n")},function(module,exports){eval("// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2dsb2JhbC5qcz83NzI2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmICh0eXBlb2YgX19nID09ICdudW1iZXInKSBfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///2\n")},function(module,exports){eval("module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzPzc5ZTUiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///3\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(5);\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qcz9jYjdjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKCFpc09iamVjdChpdCkpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///4\n")},function(module,exports){eval("module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcz9kM2Y0Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///5\n")},function(module,exports,__webpack_require__){eval("var store = __webpack_require__(48)('wks');\nvar uid = __webpack_require__(30);\nvar Symbol = __webpack_require__(2).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcz8yYjRjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBzdG9yZSA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCd3a3MnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IHVpZCkoJ1N5bWJvbC4nICsgbmFtZSkpO1xufTtcblxuJGV4cG9ydHMuc3RvcmUgPSBzdG9yZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///6\n")},function(module,exports,__webpack_require__){eval("// 7.1.15 ToLength\nvar toInteger = __webpack_require__(18);\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcz85ZGVmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7\n")},function(module,exports,__webpack_require__){eval("var anObject = __webpack_require__(4);\nvar IE8_DOM_DEFINE = __webpack_require__(88);\nvar toPrimitive = __webpack_require__(27);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(9) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcz84NmNjIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8\n")},function(module,exports,__webpack_require__){eval("// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(3)(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzPzllMWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9\n")},function(module,exports){eval("var core = module.exports = { version: '2.6.5' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb3JlLmpzPzgzNzgiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNi41JyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///10\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(2);\nvar hide = __webpack_require__(15);\nvar has = __webpack_require__(14);\nvar SRC = __webpack_require__(30)('src');\nvar $toString = __webpack_require__(123);\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\n__webpack_require__(10).inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcz8yYWJhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciAkdG9TdHJpbmcgPSByZXF1aXJlKCcuL19mdW5jdGlvbi10by1zdHJpbmcnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyIFRQTCA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuICR0b1N0cmluZy5jYWxsKGl0KTtcbn07XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbCwgc2FmZSkge1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJztcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYgKE9ba2V5XSA9PT0gdmFsKSByZXR1cm47XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCBTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIGlmICghc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH0gZWxzZSBpZiAoT1trZXldKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///11\n")},function(module,exports,__webpack_require__){eval("// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(25);\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1vYmplY3QuanM/NGJmOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///12\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar fails = __webpack_require__(3);\nvar defined = __webpack_require__(25);\nvar quot = /\"/g;\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\nvar createHTML = function (string, tag, attribute, value) {\n var S = String(defined(string));\n var p1 = '<' + tag;\n if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '"') + '\"';\n return p1 + '>' + S + '';\n};\nmodule.exports = function (NAME, exec) {\n var O = {};\n O[NAME] = exec(createHTML);\n $export($export.P + $export.F * fails(function () {\n var test = ''[NAME]('\"');\n return test !== test.toLowerCase() || test.split('\"').length > 3;\n }), 'String', O);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctaHRtbC5qcz8zODZiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG52YXIgcXVvdCA9IC9cIi9nO1xuLy8gQi4yLjMuMi4xIENyZWF0ZUhUTUwoc3RyaW5nLCB0YWcsIGF0dHJpYnV0ZSwgdmFsdWUpXG52YXIgY3JlYXRlSFRNTCA9IGZ1bmN0aW9uIChzdHJpbmcsIHRhZywgYXR0cmlidXRlLCB2YWx1ZSkge1xuICB2YXIgUyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICB2YXIgcDEgPSAnPCcgKyB0YWc7XG4gIGlmIChhdHRyaWJ1dGUgIT09ICcnKSBwMSArPSAnICcgKyBhdHRyaWJ1dGUgKyAnPVwiJyArIFN0cmluZyh2YWx1ZSkucmVwbGFjZShxdW90LCAnJnF1b3Q7JykgKyAnXCInO1xuICByZXR1cm4gcDEgKyAnPicgKyBTICsgJzwvJyArIHRhZyArICc+Jztcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FLCBleGVjKSB7XG4gIHZhciBPID0ge307XG4gIE9bTkFNRV0gPSBleGVjKGNyZWF0ZUhUTUwpO1xuICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdGVzdCA9ICcnW05BTUVdKCdcIicpO1xuICAgIHJldHVybiB0ZXN0ICE9PSB0ZXN0LnRvTG93ZXJDYXNlKCkgfHwgdGVzdC5zcGxpdCgnXCInKS5sZW5ndGggPiAzO1xuICB9KSwgJ1N0cmluZycsIE8pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///13\n")},function(module,exports){eval("var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanM/NjlhOCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///14\n")},function(module,exports,__webpack_require__){eval("var dP = __webpack_require__(8);\nvar createDesc = __webpack_require__(29);\nmodule.exports = __webpack_require__(9) ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzPzMyZTkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///15\n")},function(module,exports,__webpack_require__){eval("// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(44);\nvar defined = __webpack_require__(25);\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzPzY4MjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///16\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar fails = __webpack_require__(3);\n\nmodule.exports = function (method, arg) {\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call\n arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpY3QtbWV0aG9kLmpzPzJmMjEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobWV0aG9kLCBhcmcpIHtcbiAgcmV0dXJuICEhbWV0aG9kICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1jYWxsXG4gICAgYXJnID8gbWV0aG9kLmNhbGwobnVsbCwgZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCAxKSA6IG1ldGhvZC5jYWxsKG51bGwpO1xuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17\n")},function(module,exports){eval("// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbnRlZ2VyLmpzPzQ1ODgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///18\n")},function(module,exports,__webpack_require__){eval("var pIE = __webpack_require__(45);\nvar createDesc = __webpack_require__(29);\nvar toIObject = __webpack_require__(16);\nvar toPrimitive = __webpack_require__(27);\nvar has = __webpack_require__(14);\nvar IE8_DOM_DEFINE = __webpack_require__(88);\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(9) ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wZC5qcz8xMWU5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJyk7XG52YXIgZ09QRCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BEIDogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApIHtcbiAgTyA9IHRvSU9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIGdPUEQoTywgUCk7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICBpZiAoaGFzKE8sIFApKSByZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///19\n")},function(module,exports,__webpack_require__){eval("// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(1);\nvar core = __webpack_require__(10);\nvar fails = __webpack_require__(3);\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qtc2FwLmpzPzVlZGEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gbW9zdCBPYmplY3QgbWV0aG9kcyBieSBFUzYgc2hvdWxkIGFjY2VwdCBwcmltaXRpdmVzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBleGVjKSB7XG4gIHZhciBmbiA9IChjb3JlLk9iamVjdCB8fCB7fSlbS0VZXSB8fCBPYmplY3RbS0VZXTtcbiAgdmFyIGV4cCA9IHt9O1xuICBleHBbS0VZXSA9IGV4ZWMoZm4pO1xuICAkZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIGZhaWxzKGZ1bmN0aW9uICgpIHsgZm4oMSk7IH0pLCAnT2JqZWN0JywgZXhwKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///20\n")},function(module,exports,__webpack_require__){eval("// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = __webpack_require__(22);\nvar IObject = __webpack_require__(44);\nvar toObject = __webpack_require__(12);\nvar toLength = __webpack_require__(7);\nvar asc = __webpack_require__(213);\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1tZXRob2RzLmpzPzBhNDkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFzYyA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUWVBFLCAkY3JlYXRlKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgdmFyIGNyZWF0ZSA9ICRjcmVhdGUgfHwgYXNjO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJT2JqZWN0KE8pO1xuICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsLCByZXM7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSByZXN1bHRbaW5kZXhdID0gcmVzOyAgIC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXMpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWw7ICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///21\n")},function(module,exports,__webpack_require__){eval("// optional / simple context binding\nvar aFunction = __webpack_require__(23);\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jdHguanM/OWI0MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBvcHRpb25hbCAvIHNpbXBsZSBjb250ZXh0IGJpbmRpbmdcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmICh0aGF0ID09PSB1bmRlZmluZWQpIHJldHVybiBmbjtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///22\n")},function(module,exports){eval("module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzP2Q4ZTgiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///23\n")},function(module,exports){eval("var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2YuanM/MmQ5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///24\n")},function(module,exports){eval('// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError("Can\'t call method on " + it);\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzP2JlMTMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIiArIGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///25\n')},function(module,exports,__webpack_require__){"use strict";eval("\nif (__webpack_require__(9)) {\n var LIBRARY = __webpack_require__(31);\n var global = __webpack_require__(2);\n var fails = __webpack_require__(3);\n var $export = __webpack_require__(1);\n var $typed = __webpack_require__(59);\n var $buffer = __webpack_require__(85);\n var ctx = __webpack_require__(22);\n var anInstance = __webpack_require__(42);\n var propertyDesc = __webpack_require__(29);\n var hide = __webpack_require__(15);\n var redefineAll = __webpack_require__(43);\n var toInteger = __webpack_require__(18);\n var toLength = __webpack_require__(7);\n var toIndex = __webpack_require__(114);\n var toAbsoluteIndex = __webpack_require__(33);\n var toPrimitive = __webpack_require__(27);\n var has = __webpack_require__(14);\n var classof = __webpack_require__(46);\n var isObject = __webpack_require__(5);\n var toObject = __webpack_require__(12);\n var isArrayIter = __webpack_require__(77);\n var create = __webpack_require__(34);\n var getPrototypeOf = __webpack_require__(36);\n var gOPN = __webpack_require__(35).f;\n var getIterFn = __webpack_require__(79);\n var uid = __webpack_require__(30);\n var wks = __webpack_require__(6);\n var createArrayMethod = __webpack_require__(21);\n var createArrayIncludes = __webpack_require__(49);\n var speciesConstructor = __webpack_require__(47);\n var ArrayIterators = __webpack_require__(81);\n var Iterators = __webpack_require__(39);\n var $iterDetect = __webpack_require__(52);\n var setSpecies = __webpack_require__(41);\n var arrayFill = __webpack_require__(80);\n var arrayCopyWithin = __webpack_require__(105);\n var $DP = __webpack_require__(8);\n var $GOPD = __webpack_require__(19);\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC1hcnJheS5qcz9lYzMwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbmlmIChyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpKSB7XG4gIHZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xuICB2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG4gIHZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG4gIHZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4gIHZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xuICB2YXIgJGJ1ZmZlciA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpO1xuICB2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG4gIHZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbiAgdmFyIHByb3BlcnR5RGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbiAgdmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG4gIHZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xuICB2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xuICB2YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbiAgdmFyIHRvSW5kZXggPSByZXF1aXJlKCcuL190by1pbmRleCcpO1xuICB2YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbiAgdmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG4gIHZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbiAgdmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG4gIHZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuICB2YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbiAgdmFyIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpO1xuICB2YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xuICB2YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG4gIHZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xuICB2YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcbiAgdmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xuICB2YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG4gIHZhciBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKTtcbiAgdmFyIGNyZWF0ZUFycmF5SW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpO1xuICB2YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuICB2YXIgQXJyYXlJdGVyYXRvcnMgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xuICB2YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG4gIHZhciAkaXRlckRldGVjdCA9IHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0Jyk7XG4gIHZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbiAgdmFyIGFycmF5RmlsbCA9IHJlcXVpcmUoJy4vX2FycmF5LWZpbGwnKTtcbiAgdmFyIGFycmF5Q29weVdpdGhpbiA9IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJyk7XG4gIHZhciAkRFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbiAgdmFyICRHT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbiAgdmFyIGRQID0gJERQLmY7XG4gIHZhciBnT1BEID0gJEdPUEQuZjtcbiAgdmFyIFJhbmdlRXJyb3IgPSBnbG9iYWwuUmFuZ2VFcnJvcjtcbiAgdmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG4gIHZhciBVaW50OEFycmF5ID0gZ2xvYmFsLlVpbnQ4QXJyYXk7XG4gIHZhciBBUlJBWV9CVUZGRVIgPSAnQXJyYXlCdWZmZXInO1xuICB2YXIgU0hBUkVEX0JVRkZFUiA9ICdTaGFyZWQnICsgQVJSQVlfQlVGRkVSO1xuICB2YXIgQllURVNfUEVSX0VMRU1FTlQgPSAnQllURVNfUEVSX0VMRU1FTlQnO1xuICB2YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG4gIHZhciBBcnJheVByb3RvID0gQXJyYXlbUFJPVE9UWVBFXTtcbiAgdmFyICRBcnJheUJ1ZmZlciA9ICRidWZmZXIuQXJyYXlCdWZmZXI7XG4gIHZhciAkRGF0YVZpZXcgPSAkYnVmZmVyLkRhdGFWaWV3O1xuICB2YXIgYXJyYXlGb3JFYWNoID0gY3JlYXRlQXJyYXlNZXRob2QoMCk7XG4gIHZhciBhcnJheUZpbHRlciA9IGNyZWF0ZUFycmF5TWV0aG9kKDIpO1xuICB2YXIgYXJyYXlTb21lID0gY3JlYXRlQXJyYXlNZXRob2QoMyk7XG4gIHZhciBhcnJheUV2ZXJ5ID0gY3JlYXRlQXJyYXlNZXRob2QoNCk7XG4gIHZhciBhcnJheUZpbmQgPSBjcmVhdGVBcnJheU1ldGhvZCg1KTtcbiAgdmFyIGFycmF5RmluZEluZGV4ID0gY3JlYXRlQXJyYXlNZXRob2QoNik7XG4gIHZhciBhcnJheUluY2x1ZGVzID0gY3JlYXRlQXJyYXlJbmNsdWRlcyh0cnVlKTtcbiAgdmFyIGFycmF5SW5kZXhPZiA9IGNyZWF0ZUFycmF5SW5jbHVkZXMoZmFsc2UpO1xuICB2YXIgYXJyYXlWYWx1ZXMgPSBBcnJheUl0ZXJhdG9ycy52YWx1ZXM7XG4gIHZhciBhcnJheUtleXMgPSBBcnJheUl0ZXJhdG9ycy5rZXlzO1xuICB2YXIgYXJyYXlFbnRyaWVzID0gQXJyYXlJdGVyYXRvcnMuZW50cmllcztcbiAgdmFyIGFycmF5TGFzdEluZGV4T2YgPSBBcnJheVByb3RvLmxhc3RJbmRleE9mO1xuICB2YXIgYXJyYXlSZWR1Y2UgPSBBcnJheVByb3RvLnJlZHVjZTtcbiAgdmFyIGFycmF5UmVkdWNlUmlnaHQgPSBBcnJheVByb3RvLnJlZHVjZVJpZ2h0O1xuICB2YXIgYXJyYXlKb2luID0gQXJyYXlQcm90by5qb2luO1xuICB2YXIgYXJyYXlTb3J0ID0gQXJyYXlQcm90by5zb3J0O1xuICB2YXIgYXJyYXlTbGljZSA9IEFycmF5UHJvdG8uc2xpY2U7XG4gIHZhciBhcnJheVRvU3RyaW5nID0gQXJyYXlQcm90by50b1N0cmluZztcbiAgdmFyIGFycmF5VG9Mb2NhbGVTdHJpbmcgPSBBcnJheVByb3RvLnRvTG9jYWxlU3RyaW5nO1xuICB2YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG4gIHZhciBUQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJyk7XG4gIHZhciBUWVBFRF9DT05TVFJVQ1RPUiA9IHVpZCgndHlwZWRfY29uc3RydWN0b3InKTtcbiAgdmFyIERFRl9DT05TVFJVQ1RPUiA9IHVpZCgnZGVmX2NvbnN0cnVjdG9yJyk7XG4gIHZhciBBTExfQ09OU1RSVUNUT1JTID0gJHR5cGVkLkNPTlNUUjtcbiAgdmFyIFRZUEVEX0FSUkFZID0gJHR5cGVkLlRZUEVEO1xuICB2YXIgVklFVyA9ICR0eXBlZC5WSUVXO1xuICB2YXIgV1JPTkdfTEVOR1RIID0gJ1dyb25nIGxlbmd0aCEnO1xuXG4gIHZhciAkbWFwID0gY3JlYXRlQXJyYXlNZXRob2QoMSwgZnVuY3Rpb24gKE8sIGxlbmd0aCkge1xuICAgIHJldHVybiBhbGxvY2F0ZShzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSwgbGVuZ3RoKTtcbiAgfSk7XG5cbiAgdmFyIExJVFRMRV9FTkRJQU4gPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5ldyBVaW50MTZBcnJheShbMV0pLmJ1ZmZlcilbMF0gPT09IDE7XG4gIH0pO1xuXG4gIHZhciBGT1JDRURfU0VUID0gISFVaW50OEFycmF5ICYmICEhVWludDhBcnJheVtQUk9UT1RZUEVdLnNldCAmJiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IFVpbnQ4QXJyYXkoMSkuc2V0KHt9KTtcbiAgfSk7XG5cbiAgdmFyIHRvT2Zmc2V0ID0gZnVuY3Rpb24gKGl0LCBCWVRFUykge1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXIoaXQpO1xuICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQhJyk7XG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfTtcblxuICB2YXIgdmFsaWRhdGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICBpZiAoaXNPYmplY3QoaXQpICYmIFRZUEVEX0FSUkFZIGluIGl0KSByZXR1cm4gaXQ7XG4gICAgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSB0eXBlZCBhcnJheSEnKTtcbiAgfTtcblxuICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbiAoQywgbGVuZ3RoKSB7XG4gICAgaWYgKCEoaXNPYmplY3QoQykgJiYgVFlQRURfQ09OU1RSVUNUT1IgaW4gQykpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignSXQgaXMgbm90IGEgdHlwZWQgYXJyYXkgY29uc3RydWN0b3IhJyk7XG4gICAgfSByZXR1cm4gbmV3IEMobGVuZ3RoKTtcbiAgfTtcblxuICB2YXIgc3BlY2llc0Zyb21MaXN0ID0gZnVuY3Rpb24gKE8sIGxpc3QpIHtcbiAgICByZXR1cm4gZnJvbUxpc3Qoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSksIGxpc3QpO1xuICB9O1xuXG4gIHZhciBmcm9tTGlzdCA9IGZ1bmN0aW9uIChDLCBsaXN0KSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gICAgdmFyIHJlc3VsdCA9IGFsbG9jYXRlKEMsIGxlbmd0aCk7XG4gICAgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSByZXN1bHRbaW5kZXhdID0gbGlzdFtpbmRleCsrXTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHZhciBhZGRHZXR0ZXIgPSBmdW5jdGlvbiAoaXQsIGtleSwgaW50ZXJuYWwpIHtcbiAgICBkUChpdCwga2V5LCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZFtpbnRlcm5hbF07IH0gfSk7XG4gIH07XG5cbiAgdmFyICRmcm9tID0gZnVuY3Rpb24gZnJvbShzb3VyY2UgLyogLCBtYXBmbiwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3Qoc291cmNlKTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpdGVyRm4gPSBnZXRJdGVyRm4oTyk7XG4gICAgdmFyIGksIGxlbmd0aCwgdmFsdWVzLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICFpc0FycmF5SXRlcihpdGVyRm4pKSB7XG4gICAgICBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHZhbHVlcyA9IFtdLCBpID0gMDsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyBpKyspIHtcbiAgICAgICAgdmFsdWVzLnB1c2goc3RlcC52YWx1ZSk7XG4gICAgICB9IE8gPSB2YWx1ZXM7XG4gICAgfVxuICAgIGlmIChtYXBwaW5nICYmIGFMZW4gPiAyKSBtYXBmbiA9IGN0eChtYXBmbiwgYXJndW1lbnRzWzJdLCAyKTtcbiAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCksIHJlc3VsdCA9IGFsbG9jYXRlKHRoaXMsIGxlbmd0aCk7IGxlbmd0aCA+IGk7IGkrKykge1xuICAgICAgcmVzdWx0W2ldID0gbWFwcGluZyA/IG1hcGZuKE9baV0sIGkpIDogT1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgJG9mID0gZnVuY3Rpb24gb2YoLyogLi4uaXRlbXMgKi8pIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBhbGxvY2F0ZSh0aGlzLCBsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleCsrXTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIGlPUyBTYWZhcmkgNi54IGZhaWxzIGhlcmVcbiAgdmFyIFRPX0xPQ0FMRV9CVUcgPSAhIVVpbnQ4QXJyYXkgJiYgZmFpbHMoZnVuY3Rpb24gKCkgeyBhcnJheVRvTG9jYWxlU3RyaW5nLmNhbGwobmV3IFVpbnQ4QXJyYXkoMSkpOyB9KTtcblxuICB2YXIgJHRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9Mb2NhbGVTdHJpbmcoKSB7XG4gICAgcmV0dXJuIGFycmF5VG9Mb2NhbGVTdHJpbmcuYXBwbHkoVE9fTE9DQUxFX0JVRyA/IGFycmF5U2xpY2UuY2FsbCh2YWxpZGF0ZSh0aGlzKSkgOiB2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgfTtcblxuICB2YXIgcHJvdG8gPSB7XG4gICAgY29weVdpdGhpbjogZnVuY3Rpb24gY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0IC8qICwgZW5kICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlDb3B5V2l0aGluLmNhbGwodmFsaWRhdGUodGhpcyksIHRhcmdldCwgc3RhcnQsIGFyZ3VtZW50cy5sZW5ndGggPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5RXZlcnkodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZpbGw6IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCwgZW5kICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUZpbGwuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIHNwZWNpZXNGcm9tTGlzdCh0aGlzLCBhcnJheUZpbHRlcih2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbixcbiAgICAgICAgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpKTtcbiAgICB9LFxuICAgIGZpbmQ6IGZ1bmN0aW9uIGZpbmQocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5RmluZCh2YWxpZGF0ZSh0aGlzKSwgcHJlZGljYXRlLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChwcmVkaWNhdGUgLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlGaW5kSW5kZXgodmFsaWRhdGUodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgYXJyYXlGb3JFYWNoKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUluZGV4T2YodmFsaWRhdGUodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlJbmNsdWRlcyh2YWxpZGF0ZSh0aGlzKSwgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5Sm9pbi5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIGxhc3RJbmRleE9mOiBmdW5jdGlvbiBsYXN0SW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUxhc3RJbmRleE9mLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgbWFwOiBmdW5jdGlvbiBtYXAobWFwZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gJG1hcCh2YWxpZGF0ZSh0aGlzKSwgbWFwZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4gLyogLCBpbml0aWFsVmFsdWUgKi8pIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgcmV0dXJuIGFycmF5UmVkdWNlUmlnaHQuYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICByZXZlcnNlOiBmdW5jdGlvbiByZXZlcnNlKCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgdmFyIGxlbmd0aCA9IHZhbGlkYXRlKHRoYXQpLmxlbmd0aDtcbiAgICAgIHZhciBtaWRkbGUgPSBNYXRoLmZsb29yKGxlbmd0aCAvIDIpO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIHdoaWxlIChpbmRleCA8IG1pZGRsZSkge1xuICAgICAgICB2YWx1ZSA9IHRoYXRbaW5kZXhdO1xuICAgICAgICB0aGF0W2luZGV4KytdID0gdGhhdFstLWxlbmd0aF07XG4gICAgICAgIHRoYXRbbGVuZ3RoXSA9IHZhbHVlO1xuICAgICAgfSByZXR1cm4gdGhhdDtcbiAgICB9LFxuICAgIHNvbWU6IGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheVNvbWUodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gICAgICByZXR1cm4gYXJyYXlTb3J0LmNhbGwodmFsaWRhdGUodGhpcyksIGNvbXBhcmVmbik7XG4gICAgfSxcbiAgICBzdWJhcnJheTogZnVuY3Rpb24gc3ViYXJyYXkoYmVnaW4sIGVuZCkge1xuICAgICAgdmFyIE8gPSB2YWxpZGF0ZSh0aGlzKTtcbiAgICAgIHZhciBsZW5ndGggPSBPLmxlbmd0aDtcbiAgICAgIHZhciAkYmVnaW4gPSB0b0Fic29sdXRlSW5kZXgoYmVnaW4sIGxlbmd0aCk7XG4gICAgICByZXR1cm4gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IoTywgT1tERUZfQ09OU1RSVUNUT1JdKSkoXG4gICAgICAgIE8uYnVmZmVyLFxuICAgICAgICBPLmJ5dGVPZmZzZXQgKyAkYmVnaW4gKiBPLkJZVEVTX1BFUl9FTEVNRU5ULFxuICAgICAgICB0b0xlbmd0aCgoZW5kID09PSB1bmRlZmluZWQgPyBsZW5ndGggOiB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW5ndGgpKSAtICRiZWdpbilcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIHZhciAkc2xpY2UgPSBmdW5jdGlvbiBzbGljZShzdGFydCwgZW5kKSB7XG4gICAgcmV0dXJuIHNwZWNpZXNGcm9tTGlzdCh0aGlzLCBhcnJheVNsaWNlLmNhbGwodmFsaWRhdGUodGhpcyksIHN0YXJ0LCBlbmQpKTtcbiAgfTtcblxuICB2YXIgJHNldCA9IGZ1bmN0aW9uIHNldChhcnJheUxpa2UgLyogLCBvZmZzZXQgKi8pIHtcbiAgICB2YWxpZGF0ZSh0aGlzKTtcbiAgICB2YXIgb2Zmc2V0ID0gdG9PZmZzZXQoYXJndW1lbnRzWzFdLCAxKTtcbiAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGg7XG4gICAgdmFyIHNyYyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHNyYy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgaWYgKGxlbiArIG9mZnNldCA+IGxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgIHdoaWxlIChpbmRleCA8IGxlbikgdGhpc1tvZmZzZXQgKyBpbmRleF0gPSBzcmNbaW5kZXgrK107XG4gIH07XG5cbiAgdmFyICRpdGVyYXRvcnMgPSB7XG4gICAgZW50cmllczogZnVuY3Rpb24gZW50cmllcygpIHtcbiAgICAgIHJldHVybiBhcnJheUVudHJpZXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfSxcbiAgICBrZXlzOiBmdW5jdGlvbiBrZXlzKCkge1xuICAgICAgcmV0dXJuIGFycmF5S2V5cy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9LFxuICAgIHZhbHVlczogZnVuY3Rpb24gdmFsdWVzKCkge1xuICAgICAgcmV0dXJuIGFycmF5VmFsdWVzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgaXNUQUluZGV4ID0gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHRhcmdldClcbiAgICAgICYmIHRhcmdldFtUWVBFRF9BUlJBWV1cbiAgICAgICYmIHR5cGVvZiBrZXkgIT0gJ3N5bWJvbCdcbiAgICAgICYmIGtleSBpbiB0YXJnZXRcbiAgICAgICYmIFN0cmluZygra2V5KSA9PSBTdHJpbmcoa2V5KTtcbiAgfTtcbiAgdmFyICRnZXREZXNjID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSB7XG4gICAgcmV0dXJuIGlzVEFJbmRleCh0YXJnZXQsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpXG4gICAgICA/IHByb3BlcnR5RGVzYygyLCB0YXJnZXRba2V5XSlcbiAgICAgIDogZ09QRCh0YXJnZXQsIGtleSk7XG4gIH07XG4gIHZhciAkc2V0RGVzYyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgaWYgKGlzVEFJbmRleCh0YXJnZXQsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpXG4gICAgICAmJiBpc09iamVjdChkZXNjKVxuICAgICAgJiYgaGFzKGRlc2MsICd2YWx1ZScpXG4gICAgICAmJiAhaGFzKGRlc2MsICdnZXQnKVxuICAgICAgJiYgIWhhcyhkZXNjLCAnc2V0JylcbiAgICAgIC8vIFRPRE86IGFkZCB2YWxpZGF0aW9uIGRlc2NyaXB0b3Igdy9vIGNhbGxpbmcgYWNjZXNzb3JzXG4gICAgICAmJiAhZGVzYy5jb25maWd1cmFibGVcbiAgICAgICYmICghaGFzKGRlc2MsICd3cml0YWJsZScpIHx8IGRlc2Mud3JpdGFibGUpXG4gICAgICAmJiAoIWhhcyhkZXNjLCAnZW51bWVyYWJsZScpIHx8IGRlc2MuZW51bWVyYWJsZSlcbiAgICApIHtcbiAgICAgIHRhcmdldFtrZXldID0gZGVzYy52YWx1ZTtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfSByZXR1cm4gZFAodGFyZ2V0LCBrZXksIGRlc2MpO1xuICB9O1xuXG4gIGlmICghQUxMX0NPTlNUUlVDVE9SUykge1xuICAgICRHT1BELmYgPSAkZ2V0RGVzYztcbiAgICAkRFAuZiA9ICRzZXREZXNjO1xuICB9XG5cbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhQUxMX0NPTlNUUlVDVE9SUywgJ09iamVjdCcsIHtcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXREZXNjLFxuICAgIGRlZmluZVByb3BlcnR5OiAkc2V0RGVzY1xuICB9KTtcblxuICBpZiAoZmFpbHMoZnVuY3Rpb24gKCkgeyBhcnJheVRvU3RyaW5nLmNhbGwoe30pOyB9KSkge1xuICAgIGFycmF5VG9TdHJpbmcgPSBhcnJheVRvTG9jYWxlU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICByZXR1cm4gYXJyYXlKb2luLmNhbGwodGhpcyk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciAkVHlwZWRBcnJheVByb3RvdHlwZSQgPSByZWRlZmluZUFsbCh7fSwgcHJvdG8pO1xuICByZWRlZmluZUFsbCgkVHlwZWRBcnJheVByb3RvdHlwZSQsICRpdGVyYXRvcnMpO1xuICBoaWRlKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgSVRFUkFUT1IsICRpdGVyYXRvcnMudmFsdWVzKTtcbiAgcmVkZWZpbmVBbGwoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCB7XG4gICAgc2xpY2U6ICRzbGljZSxcbiAgICBzZXQ6ICRzZXQsXG4gICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uICgpIHsgLyogbm9vcCAqLyB9LFxuICAgIHRvU3RyaW5nOiBhcnJheVRvU3RyaW5nLFxuICAgIHRvTG9jYWxlU3RyaW5nOiAkdG9Mb2NhbGVTdHJpbmdcbiAgfSk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdidWZmZXInLCAnYicpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnl0ZU9mZnNldCcsICdvJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdieXRlTGVuZ3RoJywgJ2wnKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2xlbmd0aCcsICdlJyk7XG4gIGRQKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgVEFHLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzW1RZUEVEX0FSUkFZXTsgfVxuICB9KTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZLCBCWVRFUywgd3JhcHBlciwgQ0xBTVBFRCkge1xuICAgIENMQU1QRUQgPSAhIUNMQU1QRUQ7XG4gICAgdmFyIE5BTUUgPSBLRVkgKyAoQ0xBTVBFRCA/ICdDbGFtcGVkJyA6ICcnKSArICdBcnJheSc7XG4gICAgdmFyIEdFVFRFUiA9ICdnZXQnICsgS0VZO1xuICAgIHZhciBTRVRURVIgPSAnc2V0JyArIEtFWTtcbiAgICB2YXIgVHlwZWRBcnJheSA9IGdsb2JhbFtOQU1FXTtcbiAgICB2YXIgQmFzZSA9IFR5cGVkQXJyYXkgfHwge307XG4gICAgdmFyIFRBQyA9IFR5cGVkQXJyYXkgJiYgZ2V0UHJvdG90eXBlT2YoVHlwZWRBcnJheSk7XG4gICAgdmFyIEZPUkNFRCA9ICFUeXBlZEFycmF5IHx8ICEkdHlwZWQuQUJWO1xuICAgIHZhciBPID0ge307XG4gICAgdmFyIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5ICYmIFR5cGVkQXJyYXlbUFJPVE9UWVBFXTtcbiAgICB2YXIgZ2V0dGVyID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICB2YXIgZGF0YSA9IHRoYXQuX2Q7XG4gICAgICByZXR1cm4gZGF0YS52W0dFVFRFUl0oaW5kZXggKiBCWVRFUyArIGRhdGEubywgTElUVExFX0VORElBTik7XG4gICAgfTtcbiAgICB2YXIgc2V0dGVyID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgdmFyIGRhdGEgPSB0aGF0Ll9kO1xuICAgICAgaWYgKENMQU1QRUQpIHZhbHVlID0gKHZhbHVlID0gTWF0aC5yb3VuZCh2YWx1ZSkpIDwgMCA/IDAgOiB2YWx1ZSA+IDB4ZmYgPyAweGZmIDogdmFsdWUgJiAweGZmO1xuICAgICAgZGF0YS52W1NFVFRFUl0oaW5kZXggKiBCWVRFUyArIGRhdGEubywgdmFsdWUsIExJVFRMRV9FTkRJQU4pO1xuICAgIH07XG4gICAgdmFyIGFkZEVsZW1lbnQgPSBmdW5jdGlvbiAodGhhdCwgaW5kZXgpIHtcbiAgICAgIGRQKHRoYXQsIGluZGV4LCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBnZXR0ZXIodGhpcywgaW5kZXgpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiBzZXR0ZXIodGhpcywgaW5kZXgsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBpZiAoRk9SQ0VEKSB7XG4gICAgICBUeXBlZEFycmF5ID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgZGF0YSwgJG9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXksIE5BTUUsICdfZCcpO1xuICAgICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gMDtcbiAgICAgICAgdmFyIGJ1ZmZlciwgYnl0ZUxlbmd0aCwgbGVuZ3RoLCBrbGFzcztcbiAgICAgICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgICAgIGxlbmd0aCA9IHRvSW5kZXgoZGF0YSk7XG4gICAgICAgICAgYnl0ZUxlbmd0aCA9IGxlbmd0aCAqIEJZVEVTO1xuICAgICAgICAgIGJ1ZmZlciA9IG5ldyAkQXJyYXlCdWZmZXIoYnl0ZUxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSBpbnN0YW5jZW9mICRBcnJheUJ1ZmZlciB8fCAoa2xhc3MgPSBjbGFzc29mKGRhdGEpKSA9PSBBUlJBWV9CVUZGRVIgfHwga2xhc3MgPT0gU0hBUkVEX0JVRkZFUikge1xuICAgICAgICAgIGJ1ZmZlciA9IGRhdGE7XG4gICAgICAgICAgb2Zmc2V0ID0gdG9PZmZzZXQoJG9mZnNldCwgQllURVMpO1xuICAgICAgICAgIHZhciAkbGVuID0gZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgIGlmICgkbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICgkbGVuICUgQllURVMpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSAkbGVuIC0gb2Zmc2V0O1xuICAgICAgICAgICAgaWYgKGJ5dGVMZW5ndGggPCAwKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJ5dGVMZW5ndGggPSB0b0xlbmd0aCgkbGVuZ3RoKSAqIEJZVEVTO1xuICAgICAgICAgICAgaWYgKGJ5dGVMZW5ndGggKyBvZmZzZXQgPiAkbGVuKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbmd0aCA9IGJ5dGVMZW5ndGggLyBCWVRFUztcbiAgICAgICAgfSBlbHNlIGlmIChUWVBFRF9BUlJBWSBpbiBkYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIGZyb21MaXN0KFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAkZnJvbS5jYWxsKFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGhpZGUodGhhdCwgJ19kJywge1xuICAgICAgICAgIGI6IGJ1ZmZlcixcbiAgICAgICAgICBvOiBvZmZzZXQsXG4gICAgICAgICAgbDogYnl0ZUxlbmd0aCxcbiAgICAgICAgICBlOiBsZW5ndGgsXG4gICAgICAgICAgdjogbmV3ICREYXRhVmlldyhidWZmZXIpXG4gICAgICAgIH0pO1xuICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIGFkZEVsZW1lbnQodGhhdCwgaW5kZXgrKyk7XG4gICAgICB9KTtcbiAgICAgIFR5cGVkQXJyYXlQcm90b3R5cGUgPSBUeXBlZEFycmF5W1BST1RPVFlQRV0gPSBjcmVhdGUoJFR5cGVkQXJyYXlQcm90b3R5cGUkKTtcbiAgICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgJ2NvbnN0cnVjdG9yJywgVHlwZWRBcnJheSk7XG4gICAgfSBlbHNlIGlmICghZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgVHlwZWRBcnJheSgxKTtcbiAgICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgbmV3IFR5cGVkQXJyYXkoLTEpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIH0pIHx8ICEkaXRlckRldGVjdChmdW5jdGlvbiAoaXRlcikge1xuICAgICAgbmV3IFR5cGVkQXJyYXkoKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KG51bGwpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgICAgbmV3IFR5cGVkQXJyYXkoMS41KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KGl0ZXIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIH0sIHRydWUpKSB7XG4gICAgICBUeXBlZEFycmF5ID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgZGF0YSwgJG9mZnNldCwgJGxlbmd0aCkge1xuICAgICAgICBhbkluc3RhbmNlKHRoYXQsIFR5cGVkQXJyYXksIE5BTUUpO1xuICAgICAgICB2YXIga2xhc3M7XG4gICAgICAgIC8vIGB3c2AgbW9kdWxlIGJ1ZywgdGVtcG9yYXJpbHkgcmVtb3ZlIHZhbGlkYXRpb24gbGVuZ3RoIGZvciBVaW50OEFycmF5XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJzb2NrZXRzL3dzL3B1bGwvNjQ1XG4gICAgICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHJldHVybiBuZXcgQmFzZSh0b0luZGV4KGRhdGEpKTtcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiAkQXJyYXlCdWZmZXIgfHwgKGtsYXNzID0gY2xhc3NvZihkYXRhKSkgPT0gQVJSQVlfQlVGRkVSIHx8IGtsYXNzID09IFNIQVJFRF9CVUZGRVIpIHtcbiAgICAgICAgICByZXR1cm4gJGxlbmd0aCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IG5ldyBCYXNlKGRhdGEsIHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKSwgJGxlbmd0aClcbiAgICAgICAgICAgIDogJG9mZnNldCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gbmV3IEJhc2UoZGF0YSwgdG9PZmZzZXQoJG9mZnNldCwgQllURVMpKVxuICAgICAgICAgICAgICA6IG5ldyBCYXNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChUWVBFRF9BUlJBWSBpbiBkYXRhKSByZXR1cm4gZnJvbUxpc3QoVHlwZWRBcnJheSwgZGF0YSk7XG4gICAgICAgIHJldHVybiAkZnJvbS5jYWxsKFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgfSk7XG4gICAgICBhcnJheUZvckVhY2goVEFDICE9PSBGdW5jdGlvbi5wcm90b3R5cGUgPyBnT1BOKEJhc2UpLmNvbmNhdChnT1BOKFRBQykpIDogZ09QTihCYXNlKSwgZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gVHlwZWRBcnJheSkpIGhpZGUoVHlwZWRBcnJheSwga2V5LCBCYXNlW2tleV0pO1xuICAgICAgfSk7XG4gICAgICBUeXBlZEFycmF5W1BST1RPVFlQRV0gPSBUeXBlZEFycmF5UHJvdG90eXBlO1xuICAgICAgaWYgKCFMSUJSQVJZKSBUeXBlZEFycmF5UHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHlwZWRBcnJheTtcbiAgICB9XG4gICAgdmFyICRuYXRpdmVJdGVyYXRvciA9IFR5cGVkQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdO1xuICAgIHZhciBDT1JSRUNUX0lURVJfTkFNRSA9ICEhJG5hdGl2ZUl0ZXJhdG9yXG4gICAgICAmJiAoJG5hdGl2ZUl0ZXJhdG9yLm5hbWUgPT0gJ3ZhbHVlcycgfHwgJG5hdGl2ZUl0ZXJhdG9yLm5hbWUgPT0gdW5kZWZpbmVkKTtcbiAgICB2YXIgJGl0ZXJhdG9yID0gJGl0ZXJhdG9ycy52YWx1ZXM7XG4gICAgaGlkZShUeXBlZEFycmF5LCBUWVBFRF9DT05TVFJVQ1RPUiwgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBUWVBFRF9BUlJBWSwgTkFNRSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBWSUVXLCB0cnVlKTtcbiAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIERFRl9DT05TVFJVQ1RPUiwgVHlwZWRBcnJheSk7XG5cbiAgICBpZiAoQ0xBTVBFRCA/IG5ldyBUeXBlZEFycmF5KDEpW1RBR10gIT0gTkFNRSA6ICEoVEFHIGluIFR5cGVkQXJyYXlQcm90b3R5cGUpKSB7XG4gICAgICBkUChUeXBlZEFycmF5UHJvdG90eXBlLCBUQUcsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBOQU1FOyB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBPW05BTUVdID0gVHlwZWRBcnJheTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogKFR5cGVkQXJyYXkgIT0gQmFzZSksIE8pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlMsIE5BTUUsIHtcbiAgICAgIEJZVEVTX1BFUl9FTEVNRU5UOiBCWVRFU1xuICAgIH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7IEJhc2Uub2YuY2FsbChUeXBlZEFycmF5LCAxKTsgfSksIE5BTUUsIHtcbiAgICAgIGZyb206ICRmcm9tLFxuICAgICAgb2Y6ICRvZlxuICAgIH0pO1xuXG4gICAgaWYgKCEoQllURVNfUEVSX0VMRU1FTlQgaW4gVHlwZWRBcnJheVByb3RvdHlwZSkpIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgQllURVNfUEVSX0VMRU1FTlQsIEJZVEVTKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QLCBOQU1FLCBwcm90byk7XG5cbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRURfU0VULCBOQU1FLCB7IHNldDogJHNldCB9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIUNPUlJFQ1RfSVRFUl9OQU1FLCBOQU1FLCAkaXRlcmF0b3JzKTtcblxuICAgIGlmICghTElCUkFSWSAmJiBUeXBlZEFycmF5UHJvdG90eXBlLnRvU3RyaW5nICE9IGFycmF5VG9TdHJpbmcpIFR5cGVkQXJyYXlQcm90b3R5cGUudG9TdHJpbmcgPSBhcnJheVRvU3RyaW5nO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBuZXcgVHlwZWRBcnJheSgxKS5zbGljZSgpO1xuICAgIH0pLCBOQU1FLCB7IHNsaWNlOiAkc2xpY2UgfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gWzEsIDJdLnRvTG9jYWxlU3RyaW5nKCkgIT0gbmV3IFR5cGVkQXJyYXkoWzEsIDJdKS50b0xvY2FsZVN0cmluZygpO1xuICAgIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nLmNhbGwoWzEsIDJdKTtcbiAgICB9KSksIE5BTUUsIHsgdG9Mb2NhbGVTdHJpbmc6ICR0b0xvY2FsZVN0cmluZyB9KTtcblxuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IENPUlJFQ1RfSVRFUl9OQU1FID8gJG5hdGl2ZUl0ZXJhdG9yIDogJGl0ZXJhdG9yO1xuICAgIGlmICghTElCUkFSWSAmJiAhQ09SUkVDVF9JVEVSX05BTUUpIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgSVRFUkFUT1IsICRpdGVyYXRvcik7XG4gIH07XG59IGVsc2UgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///26\n")},function(module,exports,__webpack_require__){eval("// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(5);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1wcmltaXRpdmUuanM/NmE5OSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///27\n")},function(module,exports,__webpack_require__){eval("var META = __webpack_require__(30)('meta');\nvar isObject = __webpack_require__(5);\nvar has = __webpack_require__(14);\nvar setDesc = __webpack_require__(8).f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !__webpack_require__(3)(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tZXRhLmpzPzY3YWIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIE1FVEEgPSByZXF1aXJlKCcuL191aWQnKSgnbWV0YScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgc2V0RGVzYyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaWQgPSAwO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgRlJFRVpFID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBzZXREZXNjKGl0LCBNRVRBLCB7IHZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBXS5pO1xufTtcbnZhciBnZXRXZWFrID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBXS53O1xufTtcbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWkUgJiYgbWV0YS5ORUVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQSkpIHNldE1ldGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgS0VZOiBNRVRBLFxuICBORUVEOiBmYWxzZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2VhazogZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///28\n")},function(module,exports){eval("module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzPzQ2MzAiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///29\n")},function(module,exports){eval("var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL191aWQuanM/Y2E1YSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///30\n")},function(module,exports){eval("module.exports = false;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzPzJkMDAiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///31\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(90);\nvar enumBugKeys = __webpack_require__(63);\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcz8wZDU4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///32\n")},function(module,exports,__webpack_require__){eval("var toInteger = __webpack_require__(18);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcz83N2YxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///33\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(4);\nvar dPs = __webpack_require__(91);\nvar enumBugKeys = __webpack_require__(63);\nvar IE_PROTO = __webpack_require__(62)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = __webpack_require__(60)('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n __webpack_require__(65).appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzPzJhZWIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBkUHMgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG52YXIgRW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKTtcbiAgdmFyIGkgPSBlbnVtQnVnS2V5cy5sZW5ndGg7XG4gIHZhciBsdCA9ICc8JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUgKGktLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpIHtcbiAgdmFyIHJlc3VsdDtcbiAgaWYgKE8gIT09IG51bGwpIHtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5KCk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///34\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(90);\nvar hiddenKeys = __webpack_require__(63).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi5qcz85MDkzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///35\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(14);\nvar toObject = __webpack_require__(12);\nvar IE_PROTO = __webpack_require__(62)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzPzM4ZmQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///36\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(5);\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL192YWxpZGF0ZS1jb2xsZWN0aW9uLmpzP2IzOWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVFlQRSkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSB8fCBpdC5fdCAhPT0gVFlQRSkgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///37\n")},function(module,exports,__webpack_require__){eval("var def = __webpack_require__(8).f;\nvar has = __webpack_require__(14);\nvar TAG = __webpack_require__(6)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcz83ZjIwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKSBkZWYoaXQsIFRBRywgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiB0YWcgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///38\n")},function(module,exports){eval("module.exports = {};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanM/ODRmMiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IHt9O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///39\n")},function(module,exports,__webpack_require__){eval("// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = __webpack_require__(6)('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(15)(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanM/OWM2YyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuaWYgKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///40\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar global = __webpack_require__(2);\nvar dP = __webpack_require__(8);\nvar DESCRIPTORS = __webpack_require__(9);\nvar SPECIES = __webpack_require__(6)('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtc3BlY2llcy5qcz83YTU2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkUC5mKEMsIFNQRUNJRVMsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///41\n")},function(module,exports){eval("module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1pbnN0YW5jZS5qcz9mNjA1Il0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpIHtcbiAgaWYgKCEoaXQgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikgfHwgKGZvcmJpZGRlbkZpZWxkICE9PSB1bmRlZmluZWQgJiYgZm9yYmlkZGVuRmllbGQgaW4gaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///42\n")},function(module,exports,__webpack_require__){eval("var redefine = __webpack_require__(11);\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanM/ZGNiYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIHNhZmUpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBzYWZlKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///43\n")},function(module,exports,__webpack_require__){eval("// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(24);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pb2JqZWN0LmpzPzYyNmEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBhbmQgbm9uLWVudW1lcmFibGUgb2xkIFY4IHN0cmluZ3NcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0KCd6JykucHJvcGVydHlJc0VudW1lcmFibGUoMCkgPyBPYmplY3QgOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///44\n")},function(module,exports){eval("exports.f = {}.propertyIsEnumerable;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtcGllLmpzPzUyYTciXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///45\n")},function(module,exports,__webpack_require__){eval("// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(24);\nvar TAG = __webpack_require__(6)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzPzIzYzYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///46\n")},function(module,exports,__webpack_require__){eval("// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(4);\nvar aFunction = __webpack_require__(23);\nvar SPECIES = __webpack_require__(6)('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzP2ViZDYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4zLjIwIFNwZWNpZXNDb25zdHJ1Y3RvcihPLCBkZWZhdWx0Q29uc3RydWN0b3IpXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBEKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IEQgOiBhRnVuY3Rpb24oUyk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///47\n")},function(module,exports,__webpack_require__){eval("var core = __webpack_require__(10);\nvar global = __webpack_require__(2);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: __webpack_require__(31) ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQuanM/NTUzNyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY29yZSA9IHJlcXVpcmUoJy4vX2NvcmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJztcbnZhciBzdG9yZSA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IGNvcmUudmVyc2lvbixcbiAgbW9kZTogcmVxdWlyZSgnLi9fbGlicmFyeScpID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///48\n")},function(module,exports,__webpack_require__){eval("// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = __webpack_require__(16);\nvar toLength = __webpack_require__(7);\nvar toAbsoluteIndex = __webpack_require__(33);\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcz9jMzY2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///49\n")},function(module,exports){eval("exports.f = Object.getOwnPropertySymbols;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wcy5qcz8yNjIxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///50\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar defined = __webpack_require__(25);\nvar fails = __webpack_require__(3);\nvar spaces = __webpack_require__(67);\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctdHJpbS5qcz9hYTc3Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc3BhY2VzID0gcmVxdWlyZSgnLi9fc3RyaW5nLXdzJyk7XG52YXIgc3BhY2UgPSAnWycgKyBzcGFjZXMgKyAnXSc7XG52YXIgbm9uID0gJ1xcdTIwMGJcXHUwMDg1JztcbnZhciBsdHJpbSA9IFJlZ0V4cCgnXicgKyBzcGFjZSArIHNwYWNlICsgJyonKTtcbnZhciBydHJpbSA9IFJlZ0V4cChzcGFjZSArIHNwYWNlICsgJyokJyk7XG5cbnZhciBleHBvcnRlciA9IGZ1bmN0aW9uIChLRVksIGV4ZWMsIEFMSUFTKSB7XG4gIHZhciBleHAgPSB7fTtcbiAgdmFyIEZPUkNFID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXNwYWNlc1tLRVldKCkgfHwgbm9uW0tFWV0oKSAhPSBub247XG4gIH0pO1xuICB2YXIgZm4gPSBleHBbS0VZXSA9IEZPUkNFID8gZXhlYyh0cmltKSA6IHNwYWNlc1tLRVldO1xuICBpZiAoQUxJQVMpIGV4cFtBTElBU10gPSBmbjtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBGT1JDRSwgJ1N0cmluZycsIGV4cCk7XG59O1xuXG4vLyAxIC0+IFN0cmluZyN0cmltTGVmdFxuLy8gMiAtPiBTdHJpbmcjdHJpbVJpZ2h0XG4vLyAzIC0+IFN0cmluZyN0cmltXG52YXIgdHJpbSA9IGV4cG9ydGVyLnRyaW0gPSBmdW5jdGlvbiAoc3RyaW5nLCBUWVBFKSB7XG4gIHN0cmluZyA9IFN0cmluZyhkZWZpbmVkKHN0cmluZykpO1xuICBpZiAoVFlQRSAmIDEpIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGx0cmltLCAnJyk7XG4gIGlmIChUWVBFICYgMikgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocnRyaW0sICcnKTtcbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0ZXI7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///51\n")},function(module,exports,__webpack_require__){eval("var ITERATOR = __webpack_require__(6)('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRldGVjdC5qcz81Y2M1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uICgpIHsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBza2lwQ2xvc2luZykge1xuICBpZiAoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gWzddO1xuICAgIHZhciBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHsgZG9uZTogc2FmZSA9IHRydWUgfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///52\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = __webpack_require__(4);\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mbGFncy5qcz8wYmZiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC51bmljb2RlKSByZXN1bHQgKz0gJ3UnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///53\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar classof = __webpack_require__(46);\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWdleHAtZXhlYy1hYnN0cmFjdC5qcz81ZjFiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgYnVpbHRpbkV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7XG5cbiAvLyBgUmVnRXhwRXhlY2AgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHBleGVjXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChSLCBTKSB7XG4gIHZhciBleGVjID0gUi5leGVjO1xuICBpZiAodHlwZW9mIGV4ZWMgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgcmVzdWx0ID0gZXhlYy5jYWxsKFIsIFMpO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVnRXhwIGV4ZWMgbWV0aG9kIHJldHVybmVkIHNvbWV0aGluZyBvdGhlciB0aGFuIGFuIE9iamVjdCBvciBudWxsJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgaWYgKGNsYXNzb2YoUikgIT09ICdSZWdFeHAnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUmVnRXhwI2V4ZWMgY2FsbGVkIG9uIGluY29tcGF0aWJsZSByZWNlaXZlcicpO1xuICB9XG4gIHJldHVybiBidWlsdGluRXhlYy5jYWxsKFIsIFMpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///54\n")},function(module,exports,__webpack_require__){"use strict";eval("\n__webpack_require__(107);\nvar redefine = __webpack_require__(11);\nvar hide = __webpack_require__(15);\nvar fails = __webpack_require__(3);\nvar defined = __webpack_require__(25);\nvar wks = __webpack_require__(6);\nvar regexpExec = __webpack_require__(82);\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19maXgtcmUtd2tzLmpzPzIxNGYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi9lczYucmVnZXhwLmV4ZWMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcblxudmFyIFNQRUNJRVMgPSB3a3MoJ3NwZWNpZXMnKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gI3JlcGxhY2UgbmVlZHMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgbmFtZWQgZ3JvdXBzLlxuICAvLyAjbWF0Y2ggd29ya3MgZmluZSBiZWNhdXNlIGl0IGp1c3QgcmV0dXJuIHRoZSBleGVjIHJlc3VsdHMsIGV2ZW4gaWYgaXQgaGFzXG4gIC8vIGEgXCJncm9wc1wiIHByb3BlcnR5LlxuICB2YXIgcmUgPSAvLi87XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHJlc3VsdC5ncm91cHMgPSB7IGE6ICc3JyB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiAnJy5yZXBsYWNlKHJlLCAnJDxhPicpICE9PSAnNyc7XG59KTtcblxudmFyIFNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIENocm9tZSA1MSBoYXMgYSBidWdneSBcInNwbGl0XCIgaW1wbGVtZW50YXRpb24gd2hlbiBSZWdFeHAjZXhlYyAhPT0gbmF0aXZlRXhlY1xuICB2YXIgcmUgPSAvKD86KS87XG4gIHZhciBvcmlnaW5hbEV4ZWMgPSByZS5leGVjO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gb3JpZ2luYWxFeGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gIHZhciByZXN1bHQgPSAnYWInLnNwbGl0KHJlKTtcbiAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IDIgJiYgcmVzdWx0WzBdID09PSAnYScgJiYgcmVzdWx0WzFdID09PSAnYic7XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGxlbmd0aCwgZXhlYykge1xuICB2YXIgU1lNQk9MID0gd2tzKEtFWSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19TWU1CT0wgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN0cmluZyBtZXRob2RzIGNhbGwgc3ltYm9sLW5hbWVkIFJlZ0VwIG1ldGhvZHNcbiAgICB2YXIgTyA9IHt9O1xuICAgIE9bU1lNQk9MXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19FWEVDID0gREVMRUdBVEVTX1RPX1NZTUJPTCA/ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3ltYm9sLW5hbWVkIFJlZ0V4cCBtZXRob2RzIGNhbGwgLmV4ZWNcbiAgICB2YXIgZXhlY0NhbGxlZCA9IGZhbHNlO1xuICAgIHZhciByZSA9IC9hLztcbiAgICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyBleGVjQ2FsbGVkID0gdHJ1ZTsgcmV0dXJuIG51bGw7IH07XG4gICAgaWYgKEtFWSA9PT0gJ3NwbGl0Jykge1xuICAgICAgLy8gUmVnRXhwW0BAc3BsaXRdIGRvZXNuJ3QgY2FsbCB0aGUgcmVnZXgncyBleGVjIG1ldGhvZCwgYnV0IGZpcnN0IGNyZWF0ZXNcbiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS5cbiAgICAgIHJlLmNvbnN0cnVjdG9yID0ge307XG4gICAgICByZS5jb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlOyB9O1xuICAgIH1cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pIDogdW5kZWZpbmVkO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIChLRVkgPT09ICdyZXBsYWNlJyAmJiAhUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMpIHx8XG4gICAgKEtFWSA9PT0gJ3NwbGl0JyAmJiAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDKVxuICApIHtcbiAgICB2YXIgbmF0aXZlUmVnRXhwTWV0aG9kID0gLy4vW1NZTUJPTF07XG4gICAgdmFyIGZucyA9IGV4ZWMoXG4gICAgICBkZWZpbmVkLFxuICAgICAgU1lNQk9MLFxuICAgICAgJydbS0VZXSxcbiAgICAgIGZ1bmN0aW9uIG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgICBpZiAocmVnZXhwLmV4ZWMgPT09IHJlZ2V4cEV4ZWMpIHtcbiAgICAgICAgICBpZiAoREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZm9yY2VTdHJpbmdNZXRob2QpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuYXRpdmUgU3RyaW5nIG1ldGhvZCBhbHJlYWR5IGRlbGVnYXRlcyB0byBAQG1ldGhvZCAodGhpc1xuICAgICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgICAgLy8gV2UgYXZvaWQgaXQgYnkgZGlyZWN0bHkgY2FsbGluZyB0aGUgbmF0aXZlIEBAbWV0aG9kIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVSZWdFeHBNZXRob2QuY2FsbChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZU1ldGhvZC5jYWxsKHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlIH07XG4gICAgICB9XG4gICAgKTtcbiAgICB2YXIgc3RyZm4gPSBmbnNbMF07XG4gICAgdmFyIHJ4Zm4gPSBmbnNbMV07XG5cbiAgICByZWRlZmluZShTdHJpbmcucHJvdG90eXBlLCBLRVksIHN0cmZuKTtcbiAgICBoaWRlKFJlZ0V4cC5wcm90b3R5cGUsIFNZTUJPTCwgbGVuZ3RoID09IDJcbiAgICAgIC8vIDIxLjIuNS44IFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXShzdHJpbmcsIHJlcGxhY2VWYWx1ZSlcbiAgICAgIC8vIDIxLjIuNS4xMSBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdKHN0cmluZywgbGltaXQpXG4gICAgICA/IGZ1bmN0aW9uIChzdHJpbmcsIGFyZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uIChzdHJpbmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///55\n")},function(module,exports,__webpack_require__){eval("var ctx = __webpack_require__(22);\nvar call = __webpack_require__(103);\nvar isArrayIter = __webpack_require__(77);\nvar anObject = __webpack_require__(4);\nvar toLength = __webpack_require__(7);\nvar getIterFn = __webpack_require__(79);\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanM/NGE1OSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpO1xudmFyIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBnZXRJdGVyRm4gPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIEJSRUFLID0ge307XG52YXIgUkVUVVJOID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1IpIHtcbiAgdmFyIGl0ZXJGbiA9IElURVJBVE9SID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpO1xuICB2YXIgZiA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZiAoaXNBcnJheUl0ZXIoaXRlckZuKSkgZm9yIChsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTspIHtcbiAgICByZXN1bHQgPSBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgPSBCUkVBSztcbmV4cG9ydHMuUkVUVVJOID0gUkVUVVJOO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///56\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(2);\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL191c2VyLWFnZW50LmpzP2EyNWYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG5hdmlnYXRvciA9IGdsb2JhbC5uYXZpZ2F0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///57\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar global = __webpack_require__(2);\nvar $export = __webpack_require__(1);\nvar redefine = __webpack_require__(11);\nvar redefineAll = __webpack_require__(43);\nvar meta = __webpack_require__(28);\nvar forOf = __webpack_require__(56);\nvar anInstance = __webpack_require__(42);\nvar isObject = __webpack_require__(5);\nvar fails = __webpack_require__(3);\nvar $iterDetect = __webpack_require__(52);\nvar setToStringTag = __webpack_require__(38);\nvar inheritIfRequired = __webpack_require__(68);\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLmpzP2UwYjgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJGl0ZXJEZXRlY3QgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBnbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgZm4gPSBwcm90b1tLRVldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBLRVksXG4gICAgICBLRVkgPT0gJ2RlbGV0ZScgPyBmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyB1bmRlZmluZWQgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKGEpIHsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpOyByZXR1cm4gdGhpczsgfVxuICAgICAgICA6IGZ1bmN0aW9uIHNldChhLCBiKSB7IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhLCBiKTsgcmV0dXJuIHRoaXM7IH1cbiAgICApO1xuICB9O1xuICBpZiAodHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgICBtZXRhLk5FRUQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiAgQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pO1xuICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICB2YXIgQUNDRVBUX0lURVJBQkxFUyA9ICRpdGVyRGV0ZWN0KGZ1bmN0aW9uIChpdGVyKSB7IG5ldyBDKGl0ZXIpOyB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgICB2YXIgaW5kZXggPSA1O1xuICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgfSk7XG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UoKSwgdGFyZ2V0LCBDKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQy5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQztcbiAgICB9XG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuICAgIGlmIChCVUdHWV9aRVJPIHx8IEhBU05UX0NIQUlOSU5HKSBmaXhNZXRob2QoQURERVIpO1xuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgcHJvdG8uY2xlYXIpIGRlbGV0ZSBwcm90by5jbGVhcjtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChDICE9IEJhc2UpLCBPKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///58\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(2);\nvar hide = __webpack_require__(15);\nvar uid = __webpack_require__(30);\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC5qcz8wZjg4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFRZUEVEID0gdWlkKCd0eXBlZF9hcnJheScpO1xudmFyIFZJRVcgPSB1aWQoJ3ZpZXcnKTtcbnZhciBBQlYgPSAhIShnbG9iYWwuQXJyYXlCdWZmZXIgJiYgZ2xvYmFsLkRhdGFWaWV3KTtcbnZhciBDT05TVFIgPSBBQlY7XG52YXIgaSA9IDA7XG52YXIgbCA9IDk7XG52YXIgVHlwZWQ7XG5cbnZhciBUeXBlZEFycmF5Q29uc3RydWN0b3JzID0gKFxuICAnSW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheSxVaW50MTZBcnJheSxJbnQzMkFycmF5LFVpbnQzMkFycmF5LEZsb2F0MzJBcnJheSxGbG9hdDY0QXJyYXknXG4pLnNwbGl0KCcsJyk7XG5cbndoaWxlIChpIDwgbCkge1xuICBpZiAoVHlwZWQgPSBnbG9iYWxbVHlwZWRBcnJheUNvbnN0cnVjdG9yc1tpKytdXSkge1xuICAgIGhpZGUoVHlwZWQucHJvdG90eXBlLCBUWVBFRCwgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZC5wcm90b3R5cGUsIFZJRVcsIHRydWUpO1xuICB9IGVsc2UgQ09OU1RSID0gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBBQlY6IEFCVixcbiAgQ09OU1RSOiBDT05TVFIsXG4gIFRZUEVEOiBUWVBFRCxcbiAgVklFVzogVklFV1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///59\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(5);\nvar document = __webpack_require__(2).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzPzIzMGUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///60\n")},function(module,exports,__webpack_require__){eval("exports.f = __webpack_require__(6);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MtZXh0LmpzPzM3YzgiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fd2tzJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///61\n")},function(module,exports,__webpack_require__){eval("var shared = __webpack_require__(48)('keys');\nvar uid = __webpack_require__(30);\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzPzYxM2IiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpKCdrZXlzJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHNoYXJlZFtrZXldIHx8IChzaGFyZWRba2V5XSA9IHVpZChrZXkpKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///62\n")},function(module,exports){eval("// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzP2UxMWUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSUUgOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSAoXG4gICdjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2YnXG4pLnNwbGl0KCcsJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///63\n")},function(module,exports,__webpack_require__){eval("// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(24);\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS5qcz8xMTY5Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgcmV0dXJuIGNvZihhcmcpID09ICdBcnJheSc7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///64\n")},function(module,exports,__webpack_require__){eval("var document = __webpack_require__(2).document;\nmodule.exports = document && document.documentElement;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19odG1sLmpzP2ZhYjIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRvY3VtZW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQ7XG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///65\n")},function(module,exports,__webpack_require__){eval("// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(5);\nvar anObject = __webpack_require__(4);\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = __webpack_require__(22)(Function.call, __webpack_require__(19).f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtcHJvdG8uanM/OGI5NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkgdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24gKHRlc3QsIGJ1Z2d5LCBzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vX2N0eCcpKEZ1bmN0aW9uLmNhbGwsIHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoIChlKSB7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYgKGJ1Z2d5KSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///66\n")},function(module,exports){eval("module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanM/ZmRlZiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9ICdcXHgwOVxceDBBXFx4MEJcXHgwQ1xceDBEXFx4MjBcXHhBMFxcdTE2ODBcXHUxODBFXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwMycgK1xuICAnXFx1MjAwNFxcdTIwMDVcXHUyMDA2XFx1MjAwN1xcdTIwMDhcXHUyMDA5XFx1MjAwQVxcdTIwMkZcXHUyMDVGXFx1MzAwMFxcdTIwMjhcXHUyMDI5XFx1RkVGRic7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///67\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(5);\nvar setPrototypeOf = __webpack_require__(66).set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pbmhlcml0LWlmLXJlcXVpcmVkLmpzPzVkYmMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKS5zZXQ7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCB0YXJnZXQsIEMpIHtcbiAgdmFyIFMgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gIHZhciBQO1xuICBpZiAoUyAhPT0gQyAmJiB0eXBlb2YgUyA9PSAnZnVuY3Rpb24nICYmIChQID0gUy5wcm90b3R5cGUpICE9PSBDLnByb3RvdHlwZSAmJiBpc09iamVjdChQKSAmJiBzZXRQcm90b3R5cGVPZikge1xuICAgIHNldFByb3RvdHlwZU9mKHRoYXQsIFApO1xuICB9IHJldHVybiB0aGF0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///68\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar toInteger = __webpack_require__(18);\nvar defined = __webpack_require__(25);\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctcmVwZWF0LmpzPzk3NDQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gU3RyaW5nKGRlZmluZWQodGhpcykpO1xuICB2YXIgcmVzID0gJyc7XG4gIHZhciBuID0gdG9JbnRlZ2VyKGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoXCJDb3VudCBjYW4ndCBiZSBuZWdhdGl2ZVwiKTtcbiAgZm9yICg7biA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKSBpZiAobiAmIDEpIHJlcyArPSBzdHI7XG4gIHJldHVybiByZXM7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///69\n")},function(module,exports){eval("// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLXNpZ24uanM/OTZmYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMjggTWF0aC5zaWduKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbiBzaWduKHgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4gKHggPSAreCkgPT0gMCB8fCB4ICE9IHggPyB4IDogeCA8IDAgPyAtMSA6IDE7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///70\n")},function(module,exports){eval("// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLWV4cG0xLmpzPzJkNWMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjE0IE1hdGguZXhwbTEoeClcbnZhciAkZXhwbTEgPSBNYXRoLmV4cG0xO1xubW9kdWxlLmV4cG9ydHMgPSAoISRleHBtMVxuICAvLyBPbGQgRkYgYnVnXG4gIHx8ICRleHBtMSgxMCkgPiAyMjAyNS40NjU3OTQ4MDY3MTkgfHwgJGV4cG0xKDEwKSA8IDIyMDI1LjQ2NTc5NDgwNjcxNjUxNjhcbiAgLy8gVG9yIEJyb3dzZXIgYnVnXG4gIHx8ICRleHBtMSgtMmUtMTcpICE9IC0yZS0xN1xuKSA/IGZ1bmN0aW9uIGV4cG0xKHgpIHtcbiAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogeCA+IC0xZS02ICYmIHggPCAxZS02ID8geCArIHggKiB4IC8gMiA6IE1hdGguZXhwKHgpIC0gMTtcbn0gOiAkZXhwbTE7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///71\n")},function(module,exports,__webpack_require__){eval("var toInteger = __webpack_require__(18);\nvar defined = __webpack_require__(25);\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanM/MDJmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVE9fU1RSSU5HKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhhdCwgcG9zKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcoZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSB0b0ludGVnZXIocG9zKTtcbiAgICB2YXIgbCA9IHMubGVuZ3RoO1xuICAgIHZhciBhLCBiO1xuICAgIGlmIChpIDwgMCB8fCBpID49IGwpIHJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///72\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar LIBRARY = __webpack_require__(31);\nvar $export = __webpack_require__(1);\nvar redefine = __webpack_require__(11);\nvar hide = __webpack_require__(15);\nvar Iterators = __webpack_require__(39);\nvar $iterCreate = __webpack_require__(102);\nvar setToStringTag = __webpack_require__(38);\nvar getPrototypeOf = __webpack_require__(36);\nvar ITERATOR = __webpack_require__(6)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qcz8wMWY5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbnZhciAkaXRlckNyZWF0ZSA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1kgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSk7IC8vIFNhZmFyaSBoYXMgYnVnZ3kgaXRlcmF0b3JzIHcvbyBgbmV4dGBcbnZhciBGRl9JVEVSQVRPUiA9ICdAQGl0ZXJhdG9yJztcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCkge1xuICAkaXRlckNyZWF0ZShDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG4gIHZhciBnZXRNZXRob2QgPSBmdW5jdGlvbiAoa2luZCkge1xuICAgIGlmICghQlVHR1kgJiYga2luZCBpbiBwcm90bykgcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSBLRVlTOiByZXR1cm4gZnVuY3Rpb24ga2V5cygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gIH07XG4gIHZhciBUQUcgPSBOQU1FICsgJyBJdGVyYXRvcic7XG4gIHZhciBERUZfVkFMVUVTID0gREVGQVVMVCA9PSBWQUxVRVM7XG4gIHZhciBWQUxVRVNfQlVHID0gZmFsc2U7XG4gIHZhciBwcm90byA9IEJhc2UucHJvdG90eXBlO1xuICB2YXIgJG5hdGl2ZSA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXTtcbiAgdmFyICRkZWZhdWx0ID0gJG5hdGl2ZSB8fCBnZXRNZXRob2QoREVGQVVMVCk7XG4gIHZhciAkZW50cmllcyA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWQ7XG4gIHZhciAkYW55TmF0aXZlID0gTkFNRSA9PSAnQXJyYXknID8gcHJvdG8uZW50cmllcyB8fCAkbmF0aXZlIDogJG5hdGl2ZTtcbiAgdmFyIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYgKCRhbnlOYXRpdmUpIHtcbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKCRhbnlOYXRpdmUuY2FsbChuZXcgQmFzZSgpKSk7XG4gICAgaWYgKEl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIEl0ZXJhdG9yUHJvdG90eXBlLm5leHQpIHtcbiAgICAgIC8vIFNldCBAQHRvU3RyaW5nVGFnIHRvIG5hdGl2ZSBpdGVyYXRvcnNcbiAgICAgIHNldFRvU3RyaW5nVGFnKEl0ZXJhdG9yUHJvdG90eXBlLCBUQUcsIHRydWUpO1xuICAgICAgLy8gZml4IGZvciBzb21lIG9sZCBlbmdpbmVzXG4gICAgICBpZiAoIUxJQlJBUlkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBoaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYgKERFRl9WQUxVRVMgJiYgJG5hdGl2ZSAmJiAkbmF0aXZlLm5hbWUgIT09IFZBTFVFUykge1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCkgeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZiAoKCFMSUJSQVJZIHx8IEZPUkNFRCkgJiYgKEJVR0dZIHx8IFZBTFVFU19CVUcgfHwgIXByb3RvW0lURVJBVE9SXSkpIHtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddID0gcmV0dXJuVGhpcztcbiAgaWYgKERFRkFVTFQpIHtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6IElTX1NFVCA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKEtFWVMpLFxuICAgICAgZW50cmllczogJGVudHJpZXNcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoa2V5IGluIG1ldGhvZHMpIHtcbiAgICAgIGlmICghKGtleSBpbiBwcm90bykpIHJlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///73\n")},function(module,exports,__webpack_require__){eval("// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = __webpack_require__(75);\nvar defined = __webpack_require__(25);\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctY29udGV4dC5qcz9kMmM4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGhlbHBlciBmb3IgU3RyaW5nI3tzdGFydHNXaXRoLCBlbmRzV2l0aCwgaW5jbHVkZXN9XG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBzZWFyY2hTdHJpbmcsIE5BTUUpIHtcbiAgaWYgKGlzUmVnRXhwKHNlYXJjaFN0cmluZykpIHRocm93IFR5cGVFcnJvcignU3RyaW5nIycgKyBOQU1FICsgXCIgZG9lc24ndCBhY2NlcHQgcmVnZXghXCIpO1xuICByZXR1cm4gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///74\n")},function(module,exports,__webpack_require__){eval("// 7.2.8 IsRegExp(argument)\nvar isObject = __webpack_require__(5);\nvar cof = __webpack_require__(24);\nvar MATCH = __webpack_require__(6)('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1yZWdleHAuanM/YWFlMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA3LjIuOCBJc1JlZ0V4cChhcmd1bWVudClcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIE1BVENIID0gcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjb2YoaXQpID09ICdSZWdFeHAnKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///75\n")},function(module,exports,__webpack_require__){eval("var MATCH = __webpack_require__(6)('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mYWlscy1pcy1yZWdleHAuanM/NTE0NyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgTUFUQ0ggPSByZXF1aXJlKCcuL193a3MnKSgnbWF0Y2gnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSkge1xuICB2YXIgcmUgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbS0VZXShyZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgcmVbTUFUQ0hdID0gZmFsc2U7XG4gICAgICByZXR1cm4gIScvLi8nW0tFWV0ocmUpO1xuICAgIH0gY2F0Y2ggKGYpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiB0cnVlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///76\n")},function(module,exports,__webpack_require__){eval("// check on default Array iterator\nvar Iterators = __webpack_require__(39);\nvar ITERATOR = __webpack_require__(6)('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzPzMzYTQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///77\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $defineProperty = __webpack_require__(8);\nvar createDesc = __webpack_require__(29);\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanM/ZjFhZSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBpbmRleCwgdmFsdWUpIHtcbiAgaWYgKGluZGV4IGluIG9iamVjdCkgJGRlZmluZVByb3BlcnR5LmYob2JqZWN0LCBpbmRleCwgY3JlYXRlRGVzYygwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtpbmRleF0gPSB2YWx1ZTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///78\n")},function(module,exports,__webpack_require__){eval("var classof = __webpack_require__(46);\nvar ITERATOR = __webpack_require__(6)('iterator');\nvar Iterators = __webpack_require__(39);\nmodule.exports = __webpack_require__(10).getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcz8yN2VlIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///79\n")},function(module,exports,__webpack_require__){"use strict";eval("// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n\nvar toObject = __webpack_require__(12);\nvar toAbsoluteIndex = __webpack_require__(33);\nvar toLength = __webpack_require__(7);\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1maWxsLmpzPzM2YmQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG4ndXNlIHN0cmljdCc7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGZpbGwodmFsdWUgLyogLCBzdGFydCA9IDAsIGVuZCA9IEBsZW5ndGggKi8pIHtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZDtcbiAgdmFyIGVuZFBvcyA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKTtcbiAgd2hpbGUgKGVuZFBvcyA+IGluZGV4KSBPW2luZGV4KytdID0gdmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///80\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar addToUnscopables = __webpack_require__(40);\nvar step = __webpack_require__(106);\nvar Iterators = __webpack_require__(39);\nvar toIObject = __webpack_require__(16);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(73)(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcz9jYWRmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgc3RlcCA9IHJlcXVpcmUoJy4vX2l0ZXItc3RlcCcpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcblxuLy8gMjIuMS4zLjQgQXJyYXkucHJvdG90eXBlLmVudHJpZXMoKVxuLy8gMjIuMS4zLjEzIEFycmF5LnByb3RvdHlwZS5rZXlzKClcbi8vIDIyLjEuMy4yOSBBcnJheS5wcm90b3R5cGUudmFsdWVzKClcbi8vIDIyLjEuMy4zMCBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKEFycmF5LCAnQXJyYXknLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGtpbmQgPSB0aGlzLl9rO1xuICB2YXIgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmICghTyB8fCBpbmRleCA+PSBPLmxlbmd0aCkge1xuICAgIHRoaXMuX3QgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHN0ZXAoMSk7XG4gIH1cbiAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///81\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar regexpFlags = __webpack_require__(53);\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWdleHAtZXhlYy5qcz81MjBhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIHJlZ2V4cEZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcblxudmFyIG5hdGl2ZUV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWM7XG4vLyBUaGlzIGFsd2F5cyByZWZlcnMgdG8gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgYmVjYXVzZSB0aGVcbi8vIFN0cmluZyNyZXBsYWNlIHBvbHlmaWxsIHVzZXMgLi9maXgtcmVnZXhwLXdlbGwta25vd24tc3ltYm9sLWxvZ2ljLmpzLFxuLy8gd2hpY2ggbG9hZHMgdGhpcyBmaWxlIGJlZm9yZSBwYXRjaGluZyB0aGUgbWV0aG9kLlxudmFyIG5hdGl2ZVJlcGxhY2UgPSBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2U7XG5cbnZhciBwYXRjaGVkRXhlYyA9IG5hdGl2ZUV4ZWM7XG5cbnZhciBMQVNUX0lOREVYID0gJ2xhc3RJbmRleCc7XG5cbnZhciBVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgcmUxID0gL2EvLFxuICAgICAgcmUyID0gL2IqL2c7XG4gIG5hdGl2ZUV4ZWMuY2FsbChyZTEsICdhJyk7XG4gIG5hdGl2ZUV4ZWMuY2FsbChyZTIsICdhJyk7XG4gIHJldHVybiByZTFbTEFTVF9JTkRFWF0gIT09IDAgfHwgcmUyW0xBU1RfSU5ERVhdICE9PSAwO1xufSkoKTtcblxuLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXAsIGNvcGllZCBmcm9tIGVzNS1zaGltJ3MgU3RyaW5nI3NwbGl0IHBhdGNoLlxudmFyIE5QQ0dfSU5DTFVERUQgPSAvKCk/Py8uZXhlYygnJylbMV0gIT09IHVuZGVmaW5lZDtcblxudmFyIFBBVENIID0gVVBEQVRFU19MQVNUX0lOREVYX1dST05HIHx8IE5QQ0dfSU5DTFVERUQ7XG5cbmlmIChQQVRDSCkge1xuICBwYXRjaGVkRXhlYyA9IGZ1bmN0aW9uIGV4ZWMoc3RyKSB7XG4gICAgdmFyIHJlID0gdGhpcztcbiAgICB2YXIgbGFzdEluZGV4LCByZUNvcHksIG1hdGNoLCBpO1xuXG4gICAgaWYgKE5QQ0dfSU5DTFVERUQpIHtcbiAgICAgIHJlQ29weSA9IG5ldyBSZWdFeHAoJ14nICsgcmUuc291cmNlICsgJyQoPyFcXFxccyknLCByZWdleHBGbGFncy5jYWxsKHJlKSk7XG4gICAgfVxuICAgIGlmIChVUERBVEVTX0xBU1RfSU5ERVhfV1JPTkcpIGxhc3RJbmRleCA9IHJlW0xBU1RfSU5ERVhdO1xuXG4gICAgbWF0Y2ggPSBuYXRpdmVFeGVjLmNhbGwocmUsIHN0cik7XG5cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HICYmIG1hdGNoKSB7XG4gICAgICByZVtMQVNUX0lOREVYXSA9IHJlLmdsb2JhbCA/IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIDogbGFzdEluZGV4O1xuICAgIH1cbiAgICBpZiAoTlBDR19JTkNMVURFRCAmJiBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBGaXggYnJvd3NlcnMgd2hvc2UgYGV4ZWNgIG1ldGhvZHMgZG9uJ3QgY29uc2lzdGVudGx5IHJldHVybiBgdW5kZWZpbmVkYFxuICAgICAgLy8gZm9yIE5QQ0csIGxpa2UgSUU4LiBOT1RFOiBUaGlzIGRvZXNuJyB3b3JrIGZvciAvKC4/KT8vXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gICAgICBuYXRpdmVSZXBsYWNlLmNhbGwobWF0Y2hbMF0sIHJlQ29weSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgIGlmIChhcmd1bWVudHNbaV0gPT09IHVuZGVmaW5lZCkgbWF0Y2hbaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBtYXRjaDtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwYXRjaGVkRXhlYztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///82\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar at = __webpack_require__(72)(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZHZhbmNlLXN0cmluZy1pbmRleC5qcz8wMzkwIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4gLy8gYEFkdmFuY2VTdHJpbmdJbmRleGAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hZHZhbmNlc3RyaW5naW5kZXhcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFMsIGluZGV4LCB1bmljb2RlKSB7XG4gIHJldHVybiBpbmRleCArICh1bmljb2RlID8gYXQoUywgaW5kZXgpLmxlbmd0aCA6IDEpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///83\n")},function(module,exports,__webpack_require__){eval("var ctx = __webpack_require__(22);\nvar invoke = __webpack_require__(96);\nvar html = __webpack_require__(65);\nvar cel = __webpack_require__(60);\nvar global = __webpack_require__(2);\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (__webpack_require__(24)(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190YXNrLmpzPzE5OTEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGludm9rZSA9IHJlcXVpcmUoJy4vX2ludm9rZScpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuL19odG1sJyk7XG52YXIgY2VsID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHByb2Nlc3MgPSBnbG9iYWwucHJvY2VzcztcbnZhciBzZXRUYXNrID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhclRhc2sgPSBnbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcbnZhciBydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpZCA9ICt0aGlzO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xudmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHJ1bi5jYWxsKGV2ZW50LmRhdGEpO1xufTtcbi8vIE5vZGUuanMgMC45KyAmIElFMTArIGhhcyBzZXRJbW1lZGlhdGUsIG90aGVyd2lzZTpcbmlmICghc2V0VGFzayB8fCAhY2xlYXJUYXNrKSB7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIHZhciBpID0gMTtcbiAgICB3aGlsZSAoYXJndW1lbnRzLmxlbmd0aCA+IGkpIGFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChyZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2VzcycpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3coY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBCcm93c2VycyB3aXRoIE1lc3NhZ2VDaGFubmVsLCBpbmNsdWRlcyBXZWJXb3JrZXJzXG4gIH0gZWxzZSBpZiAoTWVzc2FnZUNoYW5uZWwpIHtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgcG9ydCA9IGNoYW5uZWwucG9ydDI7XG4gICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBsaXN0ZW5lcjtcbiAgICBkZWZlciA9IGN0eChwb3J0LnBvc3RNZXNzYWdlLCBwb3J0LCAxKTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBwb3N0TWVzc2FnZSwgc2tpcCBXZWJXb3JrZXJzXG4gIC8vIElFOCBoYXMgcG9zdE1lc3NhZ2UsIGJ1dCBpdCdzIHN5bmMgJiB0eXBlb2YgaXRzIHBvc3RNZXNzYWdlIGlzICdvYmplY3QnXG4gIH0gZWxzZSBpZiAoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIGNlbCgnc2NyaXB0JykpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgaHRtbC5hcHBlbmRDaGlsZChjZWwoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHNldFRpbWVvdXQoY3R4KHJ1biwgaWQsIDEpLCAwKTtcbiAgICB9O1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///84\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar global = __webpack_require__(2);\nvar DESCRIPTORS = __webpack_require__(9);\nvar LIBRARY = __webpack_require__(31);\nvar $typed = __webpack_require__(59);\nvar hide = __webpack_require__(15);\nvar redefineAll = __webpack_require__(43);\nvar fails = __webpack_require__(3);\nvar anInstance = __webpack_require__(42);\nvar toInteger = __webpack_require__(18);\nvar toLength = __webpack_require__(7);\nvar toIndex = __webpack_require__(114);\nvar gOPN = __webpack_require__(35).f;\nvar dP = __webpack_require__(8).f;\nvar arrayFill = __webpack_require__(80);\nvar setToStringTag = __webpack_require__(38);\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190eXBlZC1idWZmZXIuanM/ZWQwYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgJHR5cGVkID0gcmVxdWlyZSgnLi9fdHlwZWQnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIHRvSW5kZXggPSByZXF1aXJlKCcuL190by1pbmRleCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGFycmF5RmlsbCA9IHJlcXVpcmUoJy4vX2FycmF5LWZpbGwnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcbnZhciBEQVRBX1ZJRVcgPSAnRGF0YVZpZXcnO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIFdST05HX0xFTkdUSCA9ICdXcm9uZyBsZW5ndGghJztcbnZhciBXUk9OR19JTkRFWCA9ICdXcm9uZyBpbmRleCEnO1xudmFyICRBcnJheUJ1ZmZlciA9IGdsb2JhbFtBUlJBWV9CVUZGRVJdO1xudmFyICREYXRhVmlldyA9IGdsb2JhbFtEQVRBX1ZJRVddO1xudmFyIE1hdGggPSBnbG9iYWwuTWF0aDtcbnZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93LXJlc3RyaWN0ZWQtbmFtZXNcbnZhciBJbmZpbml0eSA9IGdsb2JhbC5JbmZpbml0eTtcbnZhciBCYXNlQnVmZmVyID0gJEFycmF5QnVmZmVyO1xudmFyIGFicyA9IE1hdGguYWJzO1xudmFyIHBvdyA9IE1hdGgucG93O1xudmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbnZhciBsb2cgPSBNYXRoLmxvZztcbnZhciBMTjIgPSBNYXRoLkxOMjtcbnZhciBCVUZGRVIgPSAnYnVmZmVyJztcbnZhciBCWVRFX0xFTkdUSCA9ICdieXRlTGVuZ3RoJztcbnZhciBCWVRFX09GRlNFVCA9ICdieXRlT2Zmc2V0JztcbnZhciAkQlVGRkVSID0gREVTQ1JJUFRPUlMgPyAnX2InIDogQlVGRkVSO1xudmFyICRMRU5HVEggPSBERVNDUklQVE9SUyA/ICdfbCcgOiBCWVRFX0xFTkdUSDtcbnZhciAkT0ZGU0VUID0gREVTQ1JJUFRPUlMgPyAnX28nIDogQllURV9PRkZTRVQ7XG5cbi8vIElFRUU3NTQgY29udmVyc2lvbnMgYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9pZWVlNzU0XG5mdW5jdGlvbiBwYWNrSUVFRTc1NCh2YWx1ZSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobkJ5dGVzKTtcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDE7XG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxO1xuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDE7XG4gIHZhciBydCA9IG1MZW4gPT09IDIzID8gcG93KDIsIC0yNCkgLSBwb3coMiwgLTc3KSA6IDA7XG4gIHZhciBpID0gMDtcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/IDEgOiAwO1xuICB2YXIgZSwgbSwgYztcbiAgdmFsdWUgPSBhYnModmFsdWUpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIGlmICh2YWx1ZSAhPSB2YWx1ZSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgbSA9IHZhbHVlICE9IHZhbHVlID8gMSA6IDA7XG4gICAgZSA9IGVNYXg7XG4gIH0gZWxzZSB7XG4gICAgZSA9IGZsb29yKGxvZyh2YWx1ZSkgLyBMTjIpO1xuICAgIGlmICh2YWx1ZSAqIChjID0gcG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS07XG4gICAgICBjICo9IDI7XG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIHBvdygyLCAxIC0gZUJpYXMpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrKztcbiAgICAgIGMgLz0gMjtcbiAgICB9XG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMDtcbiAgICAgIGUgPSBlTWF4O1xuICAgIH0gZWxzZSBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIG0gPSAodmFsdWUgKiBjIC0gMSkgKiBwb3coMiwgbUxlbik7XG4gICAgICBlID0gZSArIGVCaWFzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBwb3coMiwgZUJpYXMgLSAxKSAqIHBvdygyLCBtTGVuKTtcbiAgICAgIGUgPSAwO1xuICAgIH1cbiAgfVxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbaSsrXSA9IG0gJiAyNTUsIG0gLz0gMjU2LCBtTGVuIC09IDgpO1xuICBlID0gZSA8PCBtTGVuIHwgbTtcbiAgZUxlbiArPSBtTGVuO1xuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltpKytdID0gZSAmIDI1NSwgZSAvPSAyNTYsIGVMZW4gLT0gOCk7XG4gIGJ1ZmZlclstLWldIHw9IHMgKiAxMjg7XG4gIHJldHVybiBidWZmZXI7XG59XG5mdW5jdGlvbiB1bnBhY2tJRUVFNzU0KGJ1ZmZlciwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTtcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICB2YXIgbkJpdHMgPSBlTGVuIC0gNztcbiAgdmFyIGkgPSBuQnl0ZXMgLSAxO1xuICB2YXIgcyA9IGJ1ZmZlcltpLS1dO1xuICB2YXIgZSA9IHMgJiAxMjc7XG4gIHZhciBtO1xuICBzID4+PSA3O1xuICBmb3IgKDsgbkJpdHMgPiAwOyBlID0gZSAqIDI1NiArIGJ1ZmZlcltpXSwgaS0tLCBuQml0cyAtPSA4KTtcbiAgbSA9IGUgJiAoMSA8PCAtbkJpdHMpIC0gMTtcbiAgZSA+Pj0gLW5CaXRzO1xuICBuQml0cyArPSBtTGVuO1xuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltpXSwgaS0tLCBuQml0cyAtPSA4KTtcbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzO1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6IHMgPyAtSW5maW5pdHkgOiBJbmZpbml0eTtcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIHBvdygyLCBtTGVuKTtcbiAgICBlID0gZSAtIGVCaWFzO1xuICB9IHJldHVybiAocyA/IC0xIDogMSkgKiBtICogcG93KDIsIGUgLSBtTGVuKTtcbn1cblxuZnVuY3Rpb24gdW5wYWNrSTMyKGJ5dGVzKSB7XG4gIHJldHVybiBieXRlc1szXSA8PCAyNCB8IGJ5dGVzWzJdIDw8IDE2IHwgYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdO1xufVxuZnVuY3Rpb24gcGFja0k4KGl0KSB7XG4gIHJldHVybiBbaXQgJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tJMTYoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmYsIGl0ID4+IDggJiAweGZmXTtcbn1cbmZ1bmN0aW9uIHBhY2tJMzIoaXQpIHtcbiAgcmV0dXJuIFtpdCAmIDB4ZmYsIGl0ID4+IDggJiAweGZmLCBpdCA+PiAxNiAmIDB4ZmYsIGl0ID4+IDI0ICYgMHhmZl07XG59XG5mdW5jdGlvbiBwYWNrRjY0KGl0KSB7XG4gIHJldHVybiBwYWNrSUVFRTc1NChpdCwgNTIsIDgpO1xufVxuZnVuY3Rpb24gcGFja0YzMihpdCkge1xuICByZXR1cm4gcGFja0lFRUU3NTQoaXQsIDIzLCA0KTtcbn1cblxuZnVuY3Rpb24gYWRkR2V0dGVyKEMsIGtleSwgaW50ZXJuYWwpIHtcbiAgZFAoQ1tQUk9UT1RZUEVdLCBrZXksIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzW2ludGVybmFsXTsgfSB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0KHZpZXcsIGJ5dGVzLCBpbmRleCwgaXNMaXR0bGVFbmRpYW4pIHtcbiAgdmFyIG51bUluZGV4ID0gK2luZGV4O1xuICB2YXIgaW50SW5kZXggPSB0b0luZGV4KG51bUluZGV4KTtcbiAgaWYgKGludEluZGV4ICsgYnl0ZXMgPiB2aWV3WyRMRU5HVEhdKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0lOREVYKTtcbiAgdmFyIHN0b3JlID0gdmlld1skQlVGRkVSXS5fYjtcbiAgdmFyIHN0YXJ0ID0gaW50SW5kZXggKyB2aWV3WyRPRkZTRVRdO1xuICB2YXIgcGFjayA9IHN0b3JlLnNsaWNlKHN0YXJ0LCBzdGFydCArIGJ5dGVzKTtcbiAgcmV0dXJuIGlzTGl0dGxlRW5kaWFuID8gcGFjayA6IHBhY2sucmV2ZXJzZSgpO1xufVxuZnVuY3Rpb24gc2V0KHZpZXcsIGJ5dGVzLCBpbmRleCwgY29udmVyc2lvbiwgdmFsdWUsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBudW1JbmRleCA9ICtpbmRleDtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChudW1JbmRleCk7XG4gIGlmIChpbnRJbmRleCArIGJ5dGVzID4gdmlld1skTEVOR1RIXSkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBzdG9yZSA9IHZpZXdbJEJVRkZFUl0uX2I7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgdmlld1skT0ZGU0VUXTtcbiAgdmFyIHBhY2sgPSBjb252ZXJzaW9uKCt2YWx1ZSk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXM7IGkrKykgc3RvcmVbc3RhcnQgKyBpXSA9IHBhY2tbaXNMaXR0bGVFbmRpYW4gPyBpIDogYnl0ZXMgLSBpIC0gMV07XG59XG5cbmlmICghJHR5cGVkLkFCVikge1xuICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbiAgICB2YXIgYnl0ZUxlbmd0aCA9IHRvSW5kZXgobGVuZ3RoKTtcbiAgICB0aGlzLl9iID0gYXJyYXlGaWxsLmNhbGwobmV3IEFycmF5KGJ5dGVMZW5ndGgpLCAwKTtcbiAgICB0aGlzWyRMRU5HVEhdID0gYnl0ZUxlbmd0aDtcbiAgfTtcblxuICAkRGF0YVZpZXcgPSBmdW5jdGlvbiBEYXRhVmlldyhidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICREYXRhVmlldywgREFUQV9WSUVXKTtcbiAgICBhbkluc3RhbmNlKGJ1ZmZlciwgJEFycmF5QnVmZmVyLCBEQVRBX1ZJRVcpO1xuICAgIHZhciBidWZmZXJMZW5ndGggPSBidWZmZXJbJExFTkdUSF07XG4gICAgdmFyIG9mZnNldCA9IHRvSW50ZWdlcihieXRlT2Zmc2V0KTtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoJ1dyb25nIG9mZnNldCEnKTtcbiAgICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA9PT0gdW5kZWZpbmVkID8gYnVmZmVyTGVuZ3RoIC0gb2Zmc2V0IDogdG9MZW5ndGgoYnl0ZUxlbmd0aCk7XG4gICAgaWYgKG9mZnNldCArIGJ5dGVMZW5ndGggPiBidWZmZXJMZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB0aGlzWyRCVUZGRVJdID0gYnVmZmVyO1xuICAgIHRoaXNbJE9GRlNFVF0gPSBvZmZzZXQ7XG4gICAgdGhpc1skTEVOR1RIXSA9IGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgaWYgKERFU0NSSVBUT1JTKSB7XG4gICAgYWRkR2V0dGVyKCRBcnJheUJ1ZmZlciwgQllURV9MRU5HVEgsICdfbCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJVRkZFUiwgJ19iJyk7XG4gICAgYWRkR2V0dGVyKCREYXRhVmlldywgQllURV9MRU5HVEgsICdfbCcpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJZVEVfT0ZGU0VULCAnX28nKTtcbiAgfVxuXG4gIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7XG4gICAgZ2V0SW50ODogZnVuY3Rpb24gZ2V0SW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdIDw8IDI0ID4+IDI0O1xuICAgIH0sXG4gICAgZ2V0VWludDg6IGZ1bmN0aW9uIGdldFVpbnQ4KGJ5dGVPZmZzZXQpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcywgMSwgYnl0ZU9mZnNldClbMF07XG4gICAgfSxcbiAgICBnZXRJbnQxNjogZnVuY3Rpb24gZ2V0SW50MTYoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgdmFyIGJ5dGVzID0gZ2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSk7XG4gICAgICByZXR1cm4gKGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXSkgPDwgMTYgPj4gMTY7XG4gICAgfSxcbiAgICBnZXRVaW50MTY6IGZ1bmN0aW9uIGdldFVpbnQxNihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICB2YXIgYnl0ZXMgPSBnZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKTtcbiAgICAgIHJldHVybiBieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF07XG4gICAgfSxcbiAgICBnZXRJbnQzMjogZnVuY3Rpb24gZ2V0SW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0kzMihnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSk7XG4gICAgfSxcbiAgICBnZXRVaW50MzI6IGZ1bmN0aW9uIGdldFVpbnQzMihieXRlT2Zmc2V0IC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICByZXR1cm4gdW5wYWNrSTMyKGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pKSA+Pj4gMDtcbiAgICB9LFxuICAgIGdldEZsb2F0MzI6IGZ1bmN0aW9uIGdldEZsb2F0MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSksIDIzLCA0KTtcbiAgICB9LFxuICAgIGdldEZsb2F0NjQ6IGZ1bmN0aW9uIGdldEZsb2F0NjQoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0lFRUU3NTQoZ2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSksIDUyLCA4KTtcbiAgICB9LFxuICAgIHNldEludDg6IGZ1bmN0aW9uIHNldEludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSTgsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgc2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQsIHBhY2tJOCwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0SW50MTY6IGZ1bmN0aW9uIHNldEludDE2KGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgMiwgYnl0ZU9mZnNldCwgcGFja0kxNiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRVaW50MTY6IGZ1bmN0aW9uIHNldFVpbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJMTYsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0SW50MzI6IGZ1bmN0aW9uIHNldEludDMyKGJ5dGVPZmZzZXQsIHZhbHVlIC8qICwgbGl0dGxlRW5kaWFuICovKSB7XG4gICAgICBzZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgcGFja0kzMiwgdmFsdWUsIGFyZ3VtZW50c1syXSk7XG4gICAgfSxcbiAgICBzZXRVaW50MzI6IGZ1bmN0aW9uIHNldFVpbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0RmxvYXQzMjogZnVuY3Rpb24gc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tGMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0RmxvYXQ2NDogZnVuY3Rpb24gc2V0RmxvYXQ2NChieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDgsIGJ5dGVPZmZzZXQsIHBhY2tGNjQsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH1cbiAgfSk7XG59IGVsc2Uge1xuICBpZiAoIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAkQXJyYXlCdWZmZXIoMSk7XG4gIH0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigtMSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gIH0pIHx8IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICBuZXcgJEFycmF5QnVmZmVyKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigxLjUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoTmFOKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICByZXR1cm4gJEFycmF5QnVmZmVyLm5hbWUgIT0gQVJSQVlfQlVGRkVSO1xuICB9KSkge1xuICAgICRBcnJheUJ1ZmZlciA9IGZ1bmN0aW9uIEFycmF5QnVmZmVyKGxlbmd0aCkge1xuICAgICAgYW5JbnN0YW5jZSh0aGlzLCAkQXJyYXlCdWZmZXIpO1xuICAgICAgcmV0dXJuIG5ldyBCYXNlQnVmZmVyKHRvSW5kZXgobGVuZ3RoKSk7XG4gICAgfTtcbiAgICB2YXIgQXJyYXlCdWZmZXJQcm90byA9ICRBcnJheUJ1ZmZlcltQUk9UT1RZUEVdID0gQmFzZUJ1ZmZlcltQUk9UT1RZUEVdO1xuICAgIGZvciAodmFyIGtleXMgPSBnT1BOKEJhc2VCdWZmZXIpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7KSB7XG4gICAgICBpZiAoISgoa2V5ID0ga2V5c1tqKytdKSBpbiAkQXJyYXlCdWZmZXIpKSBoaWRlKCRBcnJheUJ1ZmZlciwga2V5LCBCYXNlQnVmZmVyW2tleV0pO1xuICAgIH1cbiAgICBpZiAoIUxJQlJBUlkpIEFycmF5QnVmZmVyUHJvdG8uY29uc3RydWN0b3IgPSAkQXJyYXlCdWZmZXI7XG4gIH1cbiAgLy8gaU9TIFNhZmFyaSA3LnggYnVnXG4gIHZhciB2aWV3ID0gbmV3ICREYXRhVmlldyhuZXcgJEFycmF5QnVmZmVyKDIpKTtcbiAgdmFyICRzZXRJbnQ4ID0gJERhdGFWaWV3W1BST1RPVFlQRV0uc2V0SW50ODtcbiAgdmlldy5zZXRJbnQ4KDAsIDIxNDc0ODM2NDgpO1xuICB2aWV3LnNldEludDgoMSwgMjE0NzQ4MzY0OSk7XG4gIGlmICh2aWV3LmdldEludDgoMCkgfHwgIXZpZXcuZ2V0SW50OCgxKSkgcmVkZWZpbmVBbGwoJERhdGFWaWV3W1BST1RPVFlQRV0sIHtcbiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICAkc2V0SW50OC5jYWxsKHRoaXMsIGJ5dGVPZmZzZXQsIHZhbHVlIDw8IDI0ID4+IDI0KTtcbiAgICB9LFxuICAgIHNldFVpbnQ4OiBmdW5jdGlvbiBzZXRVaW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgJHNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfVxuICB9LCB0cnVlKTtcbn1cbnNldFRvU3RyaW5nVGFnKCRBcnJheUJ1ZmZlciwgQVJSQVlfQlVGRkVSKTtcbnNldFRvU3RyaW5nVGFnKCREYXRhVmlldywgREFUQV9WSUVXKTtcbmhpZGUoJERhdGFWaWV3W1BST1RPVFlQRV0sICR0eXBlZC5WSUVXLCB0cnVlKTtcbmV4cG9ydHNbQVJSQVlfQlVGRkVSXSA9ICRBcnJheUJ1ZmZlcjtcbmV4cG9ydHNbREFUQV9WSUVXXSA9ICREYXRhVmlldztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///85\n")},function(module,exports){eval('// proxy-observe v0.0.18\r\n// Copyright (c) 2015, 2016 Simon Y. Blackwell, AnyWhichWay\r\n// MIT License - http://opensource.org/licenses/mit-license.php\r\n(function() {\r\n\t"use strict";\r\n\t// Creates and returns a Proxy wrapping a target so that all changes can be trapped and forwarded to\r\n\t// a callback. The callback takes an array of changes just like the traditional original Chrome Object.observe\r\n\t// {object:,name:,type:add|update|delete|reconfigure|preventExtensions|setPrototype,oldValue:}\r\n\t// The acceptlist can be add|update|delete|reconfigure|preventExtensions|setPrototype.\r\n\t// v 0.0.10 to support pausing and restarting observation two additional constructor arguments are available to Object.observe:\r\n\t// pausable - create the Observer so it can be paused\r\n\t// pause - create observer in paused state\r\n\t// if pausable is true then an additional method deliver(ignorePrevious) is available to start delivery\r\n\t// to pause delivery set a property called pause on the function deliver to true\r\n\t// pausable is optional to reduce the chance of shadowing a property or method on any existing code called deliver\r\n\tif(!Object.observe && typeof(Proxy)==="function") {\r\n\t\tfunction Observer(target,callback,acceptlist,pausable,pause,delay) {\r\n\t \tvar me = this, proxy;\r\n\t \tfunction deliver(ignorePrevious,delay) {\r\n\t \t\tdeliver.delay = delay;\r\n\t \t\tif(!deliver.pause) {\r\n\t \t\tif(me.changeset.length>0) {\r\n\t \t\t\tif(!ignorePrevious) {\r\n\t\t \t \t\tvar changes = me.changeset.filter(function(change) { return !acceptlist || acceptlist.indexOf(change.type)>=0; });\r\n\t\t \t\t\tif(changes.length>0) {\r\n\t\t \t\t\t\tcallback(changes);\r\n\t\t \t\t\t}\r\n\t \t\t\t}\r\n\t \t\t\tme.changeset = [];\r\n\t \t\t}\r\n\t \t\t}\r\n\t \t}\r\n\t \tdeliver.pause = pause;\r\n\t \tdeliver.delay = delay;\r\n\t\t me.get = function(target, property) {\r\n\t\t \tif(property==="__observer__") {\r\n\t\t \t\treturn me;\r\n\t\t \t}\r\n\t\t \tif(property==="unobserve") {\r\n\t\t \t\treturn function() {\r\n\t\t \t\t\tObject.unobserve(target);\r\n\t\t \t\t\treturn target;\r\n\t\t \t\t};\r\n\t\t \t}\r\n\t\t \tif(property==="deliver") {\r\n\t\t \t\treturn deliver;\r\n\t\t \t}\r\n\t\t \treturn target[property];\r\n\t\t }\r\n\t \tme.target = target;\r\n\t \tme.changeset = [];\r\n\t \tif(!me.target.__observerCallbacks__) {\r\n\t \t\t// __observerCallbacks__ is used as an index to get at the proxy which is the observer, so we can unobserve\r\n\t \t\tObject.defineProperty(target,"__observerCallbacks__",{enumerable:false,configurable:true,writable:false,value:[]});\r\n\t \t\tObject.defineProperty(target,"__observers__",{enumerable:false,configurable:true,writable:false,value:[]});\r\n\t \t}\r\n\t \tme.target.__observerCallbacks__.push(callback);\r\n\t \tme.target.__observers__.push(this);\r\n\t \tproxy = new Proxy(target,me);\r\n\t \tdeliver(false,delay);\r\n\t \treturn proxy;\r\n\t }\r\n\t\tObserver.prototype.deliver = function() {\r\n\t\t\treturn this.get(null,"deliver");\r\n\t\t}\r\n\t Observer.prototype.set = function(target, property, value) { // , receiver\r\n\t \tvar oldvalue = target[property];\r\n\t \tvar type = (oldvalue===undefined ? "add" : "update");\r\n\t \ttarget[property] = value;\r\n\t \tif(target.__observers__.indexOf(this)>=0 && (!this.acceptlist || this.acceptlist.indexOf(type)>=0)) {\r\n\t \tvar change = {object:target,name:property,type:type},\r\n\t \t\tstart = this.changeset.length === 0,\r\n\t \t\tdeliver = this.deliver();\r\n\t \tif(type==="update") {\r\n\t \t\tchange.oldValue = oldvalue;\r\n\t \t}\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.deleteProperty = function(target, property) {\r\n\t \tvar oldvalue = target[property];\r\n\t \t//if(typeof(oldvalue)!=="undefined") {\r\n\t\t \tdelete target[property];\r\n\t\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("delete")>=0) {\r\n\t\t \tvar change = {object:target,name:property,type:"delete",oldValue:oldvalue},\r\n\t\t \t\tstart = this.changeset.length === 0,\r\n\t\t \t\tdeliver = this.deliver();\r\n\t\t \tthis.changeset.push(change);\r\n\t\t \tif(start) {\r\n\t\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t\t \t}\r\n\t\t \t}\r\n\t \t//}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.defineProperty = function(target, property, descriptor) {\r\n\t \tObject.defineProperty(target, property, descriptor);\r\n\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("reconfigure")>=0) {\r\n\t \tvar change = {object:target,name:property,type:"reconfigure"},\r\n \t\t\tstart = this.changeset.length === 0,\r\n \t\t\tdeliver = this.deliver();\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.setPrototypeOf = function(target, prototype) {\r\n\t \tvar oldvalue = Object.getPrototypeOf(target);\r\n\t \tObject.setPrototypeOf(target, prototype);\r\n\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("setPrototype")>=0) {\r\n\t \tvar change = {object:target,name:"__proto__",type:"setPrototype",oldValue:oldvalue},\r\n \t\t\t\tstart = this.changeset.length === 0,\r\n \t\t\t\tdeliver = this.deliver();\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.preventExtensions = function(target) {\r\n\t Object.preventExtensions(target);\r\n\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("preventExtensions")>=0) {\r\n\t \tvar change = {object:target,type:"preventExtensions"},\r\n\t\t\t\t\tstart = this.changeset.length === 0,\r\n\t\t\t\t\tdeliver = this.deliver();\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Object.observe = function(object,callback,acceptlist,pausable,pause,delay) {\r\n\t \treturn new Observer(object,callback,acceptlist,pausable,pause,delay);\r\n\t };\r\n\t Object.unobserve = function(object,callback) {\r\n\t \tif(object.__observerCallbacks__) {\r\n\t \t\tif(!callback) {\r\n\t \t\t\tobject.__observerCallbacks__.splice(0,object.__observerCallbacks__.length);\r\n\t \t\t\tobject.__observers__.splice(0,object.__observers__.length);\r\n\t \t\t\treturn;\r\n\t \t\t}\r\n\t \t\tobject.__observerCallbacks__.forEach(function(observercallback,i) {\r\n\t \t\t\tif(callback===observercallback) {\r\n\t \t\t\t\tobject.__observerCallbacks__.splice(i,1);\r\n\t \t\t\t\tdelete object.__observers__[i].callback;\r\n\t \t\t\t\tobject.__observers__.splice(i,1);\r\n\t \t\t\t}\r\n\t \t\t});\r\n\t \t}\r\n\t };\r\n\t Array.observe = function(object,callback,acceptlist,pausable,pause,delay) {\r\n\t \tif(!(object instanceof Array) && !Array.isArray(object)) {\r\n\t \t\tthrow new TypeError("First argument to Array.observer is not an Array");\r\n\t \t}\r\n \tacceptlist = acceptlist || ["add", "update", "delete", "splice"];\r\n\t \tvar arrayproxy = new Proxy(object,{get: function(target,property) {\r\n\t \t\tif(property==="unobserve") {\r\n\t\t \t\treturn function(callback) {\r\n\t\t \t\t\tif(callback) {\r\n\t\t \t\t\t\treturn Object.unobserve(target,callback);\r\n\t\t \t\t\t}\r\n\t\t \t\t\treturn target.unobserve();\r\n\t\t \t\t};\r\n\t\t \t}\r\n\t \t\tif(property==="splice") {\r\n\t \t\t\treturn function(start,end) {\r\n\t \t\t\t\tif(typeof(start)!=="number" || typeof(end)!=="number") {\r\n\t \t\t\t\t\tthrow new TypeError("First two arguments to Array splice are not number, number");\r\n\t \t\t\t\t}\r\n\t \t \t\tvar removed = this.slice(start,start+end),\r\n\t \t \t\t\taddedCount = (arguments.length > 1 ? arguments.length-2 : 0),\r\n\t \t \t\t\tchange = {object:object,type:"splice",index:start,removed:removed,addedCount:addedCount};\r\n\t \t \t\ttarget.splice.apply(target,arguments);\r\n\t \t \t\tif(acceptlist.indexOf("splice")>=0) {\r\n\t \t \t\t\tvar start = proxy.__observer__.changeset.length === 0,\r\n\t \t \t\t\tdeliver = proxy.__observer__.deliver();\r\n\t \t \t\t\tproxy.__observer__.changeset.push(change);\r\n\t \t \t\t\tif(start) {\r\n\t \t\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t\t \t}\r\n\t \t \t\t}\r\n\t \t \t}\r\n\t \t\t}\r\n\t \t\tif(property==="push") {\r\n\t \t\t\t return function(item) {\r\n\t \t\t \treturn this.splice(this.length,0,item);\r\n\t \t\t }\r\n\t \t\t}\r\n\t \t\tif(property==="pop") {\r\n\t \t\t\t return function() {\r\n\t \t\t \treturn this.splice(this.length-1,1);\r\n\t \t\t }\r\n\t \t\t}\r\n\t \t\tif(property==="unshift") {\r\n\t \t\t\t return function(item) {\r\n \t\t \t\treturn this.splice(0,0,item);\r\n \t\t \t}\r\n\t \t\t}\r\n\t \t\tif(property==="shift") {\r\n\t \t\t\treturn function() {\r\n\t \t \t\treturn this.splice(0,1);\r\n\t \t \t}\r\n\t \t\t}\r\n\t \t\treturn target[property];\r\n\t \t}});\r\n\t \tvar proxy = Object.observe(arrayproxy,function(changeset) { \r\n\t \t\tvar changes = changeset.filter(function(change) { return change.name!=="length" && change.name!=="add" && (!acceptlist || acceptlist.indexOf(change.type)>=0); });\r\n\t \t\tif(changes.length>0) {\r\n\t \t\t\tcallback(changes);\r\n\t \t\t}\r\n\t \t},acceptlist,pausable,pause,delay);\r\n\t \treturn proxy;\r\n\t };\r\n\t Array.unobserve = function(object,callback) {\r\n\t\t return object.unobserve(callback);\r\n\t }\r\n\t}\r\n\tObject.deepObserve = function(object,callback,parts) {\r\n\r\n\t\tparts = (parts ? parts : []);\r\n\r\n\t\tvar toTypeName = function(obj) {\r\n\t\t\treturn ({}).toString.call(obj).match(/\\s([a-zA-Z]+)/)[1].toLowerCase()\r\n\t\t}\r\n\r\n\t\tfunction reobserve(value, parts) {\r\n\t\t\tvar keys = Object.keys(value);\r\n\t\t\tkeys.forEach(function(key) {\r\n\t\t\t\tif((toTypeName(value[key]) === \'object\' || toTypeName(value[key]) === \'array\') && !value[key].hasOwnProperty(\'__observers__\')) {\r\n\t\t\t\t\tvar newparts = parts.slice(0);\r\n\t\t\t\t\tnewparts.push(key);\r\n\t\t\t\t\tvalue[key] = Object.deepObserve(value[key],callback,newparts);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treobserve(object, parts);\r\n\r\n\t\tvar observed = Object.observe(object,function(changeset) {\r\n\t\t\tvar changes = [];\r\n\t\t\tfunction recurse(name,rootObject,oldObject,newObject,path) {\r\n\t\t\t\tif(newObject instanceof Object) {\r\n\t\t\t\t\tvar newkeys = Object.keys(newObject);\r\n\t\t\t\t\tnewkeys.forEach(function(key) {\r\n\t\t\t\t\t\tif(!oldObject || (oldObject[key]!==newObject[key])) {\r\n\t\t\t\t\t\t\tvar oldvalue = (oldObject && oldObject[key]!==undefined ? oldObject[key] : undefined),\r\n\t\t\t\t\t\t\t\tchange = (oldvalue===undefined ? "add" : "update"),\r\n\t\t\t\t\t\t\t\tkeypath = path + "." + key;\r\n\r\n\t\t\t\t\t\t\tchanges.push({name:name,object:rootObject,type:change,oldValue:oldvalue,newValue:newObject[key],keypath:keypath});\r\n\t\t\t\t\t\t\trecurse(name,rootObject,oldvalue,newObject[key],keypath);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t} else if(oldObject instanceof Object) {\r\n\t\t\t\t\tvar oldkeys = Object.keys(oldObject);\r\n\t\t\t\t\toldkeys.forEach(function(key) {\r\n\t\t\t\t\t\tvar change = (newObject===null ? "update" : "delete"),\r\n\t\t\t\t\t\t\tkeypath = path + "." + key;\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\tchanges.push({name:name,object:rootObject,type:change,oldValue:oldObject[key],newValue:newObject,keypath:keypath});\r\n\t\t\t\t\t\trecurse(name,rootObject,oldObject[key],undefined,keypath);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tchangeset.forEach(function(change) {\r\n\t\t\t\tvar keypath = (parts.length>0 ? parts.join(".") + "." : "") + change.name;\r\n\r\n\t\t\t\tif (change.type === "update" || change.type === "add") { \r\n\t\t\t\t\treobserve(change.object, parts);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tchanges.push({name:change.name,object:change.object,type:change.type,oldValue:change.oldValue,newValue:change.object[change.name],keypath:keypath});\r\n\t\t\t\trecurse(change.name,change.object,change.oldValue,change.object[change.name],keypath);\r\n\t\t\t});\r\n\t\t\tcallback(changes);\r\n\t\t});\r\n\t\treturn observed;\r\n\t};\r\n})();\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvcHJveHktb2JzZXJ2ZS9pbmRleC5qcz85NWViIl0sInNvdXJjZXNDb250ZW50IjpbIi8vICAgICBwcm94eS1vYnNlcnZlIHYwLjAuMThcclxuLy8gICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNiBTaW1vbiBZLiBCbGFja3dlbGwsIEFueVdoaWNoV2F5XHJcbi8vICAgICBNSVQgTGljZW5zZSAtIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcclxuKGZ1bmN0aW9uKCkge1xyXG5cdFwidXNlIHN0cmljdFwiO1xyXG5cdC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm94eSB3cmFwcGluZyBhIHRhcmdldCBzbyB0aGF0IGFsbCBjaGFuZ2VzIGNhbiBiZSB0cmFwcGVkIGFuZCBmb3J3YXJkZWQgdG9cclxuXHQvLyBhIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgdGFrZXMgYW4gYXJyYXkgb2YgY2hhbmdlcyBqdXN0IGxpa2UgdGhlIHRyYWRpdGlvbmFsIG9yaWdpbmFsIENocm9tZSBPYmplY3Qub2JzZXJ2ZVxyXG5cdC8vIHtvYmplY3Q6PG9iamVjdCBjaGFuZ2VkPixuYW1lOjxmaWVsZCBjaGFuZ2VkPix0eXBlOmFkZHx1cGRhdGV8ZGVsZXRlfHJlY29uZmlndXJlfHByZXZlbnRFeHRlbnNpb25zfHNldFByb3RvdHlwZSxvbGRWYWx1ZTo8b2xkIHZhbHVlIGlmIHVwZGF0ZSB8IGRlbGV0ZT59XHJcblx0Ly8gVGhlIGFjY2VwdGxpc3QgY2FuIGJlIGFkZHx1cGRhdGV8ZGVsZXRlfHJlY29uZmlndXJlfHByZXZlbnRFeHRlbnNpb25zfHNldFByb3RvdHlwZS5cclxuXHQvLyB2IDAuMC4xMCB0byBzdXBwb3J0IHBhdXNpbmcgYW5kIHJlc3RhcnRpbmcgb2JzZXJ2YXRpb24gdHdvIGFkZGl0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIGFyZSBhdmFpbGFibGUgdG8gT2JqZWN0Lm9ic2VydmU6XHJcblx0Ly8gcGF1c2FibGUgLSBjcmVhdGUgdGhlIE9ic2VydmVyIHNvIGl0IGNhbiBiZSBwYXVzZWRcclxuXHQvLyBwYXVzZSAtIGNyZWF0ZSBvYnNlcnZlciBpbiBwYXVzZWQgc3RhdGVcclxuXHQvLyBpZiBwYXVzYWJsZSBpcyB0cnVlIHRoZW4gYW4gYWRkaXRpb25hbCBtZXRob2QgZGVsaXZlcihpZ25vcmVQcmV2aW91cykgaXMgYXZhaWxhYmxlIHRvIHN0YXJ0IGRlbGl2ZXJ5XHJcblx0Ly8gdG8gcGF1c2UgZGVsaXZlcnkgc2V0IGEgcHJvcGVydHkgY2FsbGVkIHBhdXNlIG9uIHRoZSBmdW5jdGlvbiBkZWxpdmVyIHRvIHRydWVcclxuXHQvLyBwYXVzYWJsZSBpcyBvcHRpb25hbCB0byByZWR1Y2UgdGhlIGNoYW5jZSBvZiBzaGFkb3dpbmcgYSBwcm9wZXJ0eSBvciBtZXRob2Qgb24gYW55IGV4aXN0aW5nIGNvZGUgY2FsbGVkIGRlbGl2ZXJcclxuXHRpZighT2JqZWN0Lm9ic2VydmUgJiYgdHlwZW9mKFByb3h5KT09PVwiZnVuY3Rpb25cIikge1xyXG5cdFx0ZnVuY3Rpb24gT2JzZXJ2ZXIodGFyZ2V0LGNhbGxiYWNrLGFjY2VwdGxpc3QscGF1c2FibGUscGF1c2UsZGVsYXkpIHtcclxuXHQgICAgXHR2YXIgbWUgPSB0aGlzLCBwcm94eTtcclxuXHQgICAgXHRmdW5jdGlvbiBkZWxpdmVyKGlnbm9yZVByZXZpb3VzLGRlbGF5KSB7XHJcblx0ICAgIFx0XHRkZWxpdmVyLmRlbGF5ID0gZGVsYXk7XHJcblx0ICAgIFx0XHRpZighZGVsaXZlci5wYXVzZSkge1xyXG5cdCAgICAgICAgXHRcdGlmKG1lLmNoYW5nZXNldC5sZW5ndGg+MCkge1xyXG5cdCAgICAgICAgXHRcdFx0aWYoIWlnbm9yZVByZXZpb3VzKSB7XHJcblx0XHQgICAgXHQgICAgXHRcdHZhciBjaGFuZ2VzID0gbWUuY2hhbmdlc2V0LmZpbHRlcihmdW5jdGlvbihjaGFuZ2UpIHsgcmV0dXJuICFhY2NlcHRsaXN0IHx8IGFjY2VwdGxpc3QuaW5kZXhPZihjaGFuZ2UudHlwZSk+PTA7IH0pO1xyXG5cdFx0ICAgICAgICBcdFx0XHRpZihjaGFuZ2VzLmxlbmd0aD4wKSB7XHJcblx0XHQgICAgICAgIFx0XHRcdFx0Y2FsbGJhY2soY2hhbmdlcyk7XHJcblx0XHQgICAgICAgIFx0XHRcdH1cclxuXHQgICAgICAgIFx0XHRcdH1cclxuXHQgICAgICAgIFx0XHRcdG1lLmNoYW5nZXNldCA9IFtdO1xyXG5cdCAgICAgICAgXHRcdH1cclxuXHQgICAgXHRcdH1cclxuXHQgICAgXHR9XHJcblx0ICAgIFx0ZGVsaXZlci5wYXVzZSA9IHBhdXNlO1xyXG5cdCAgICBcdGRlbGl2ZXIuZGVsYXkgPSBkZWxheTtcclxuXHRcdCAgICBtZS5nZXQgPSBmdW5jdGlvbih0YXJnZXQsIHByb3BlcnR5KSB7XHJcblx0XHQgICAgXHRpZihwcm9wZXJ0eT09PVwiX19vYnNlcnZlcl9fXCIpIHtcclxuXHRcdCAgICBcdFx0cmV0dXJuIG1lO1xyXG5cdFx0ICAgIFx0fVxyXG5cdFx0ICAgIFx0aWYocHJvcGVydHk9PT1cInVub2JzZXJ2ZVwiKSB7XHJcblx0XHQgICAgXHRcdHJldHVybiBmdW5jdGlvbigpIHtcclxuXHRcdCAgICBcdFx0XHRPYmplY3QudW5vYnNlcnZlKHRhcmdldCk7XHJcblx0XHQgICAgXHRcdFx0cmV0dXJuIHRhcmdldDtcclxuXHRcdCAgICBcdFx0fTtcclxuXHRcdCAgICBcdH1cclxuXHRcdCAgICBcdGlmKHByb3BlcnR5PT09XCJkZWxpdmVyXCIpIHtcclxuXHRcdCAgICBcdFx0cmV0dXJuIGRlbGl2ZXI7XHJcblx0XHQgICAgXHR9XHJcblx0XHQgICAgXHRyZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XTtcclxuXHRcdCAgICB9XHJcblx0ICAgIFx0bWUudGFyZ2V0ID0gdGFyZ2V0O1xyXG5cdCAgICBcdG1lLmNoYW5nZXNldCA9IFtdO1xyXG5cdCAgICBcdGlmKCFtZS50YXJnZXQuX19vYnNlcnZlckNhbGxiYWNrc19fKSB7XHJcblx0ICAgIFx0XHQvLyBfX29ic2VydmVyQ2FsbGJhY2tzX18gaXMgdXNlZCBhcyBhbiBpbmRleCB0byBnZXQgYXQgdGhlIHByb3h5IHdoaWNoIGlzIHRoZSBvYnNlcnZlciwgc28gd2UgY2FuIHVub2JzZXJ2ZVxyXG5cdCAgICBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxcIl9fb2JzZXJ2ZXJDYWxsYmFja3NfX1wiLHtlbnVtZXJhYmxlOmZhbHNlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOmZhbHNlLHZhbHVlOltdfSk7XHJcblx0ICAgIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LFwiX19vYnNlcnZlcnNfX1wiLHtlbnVtZXJhYmxlOmZhbHNlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOmZhbHNlLHZhbHVlOltdfSk7XHJcblx0ICAgIFx0fVxyXG5cdCAgICBcdG1lLnRhcmdldC5fX29ic2VydmVyQ2FsbGJhY2tzX18ucHVzaChjYWxsYmFjayk7XHJcblx0ICAgIFx0bWUudGFyZ2V0Ll9fb2JzZXJ2ZXJzX18ucHVzaCh0aGlzKTtcclxuXHQgICAgXHRwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsbWUpO1xyXG5cdCAgICBcdGRlbGl2ZXIoZmFsc2UsZGVsYXkpO1xyXG5cdCAgICBcdHJldHVybiBwcm94eTtcclxuXHQgICAgfVxyXG5cdFx0T2JzZXJ2ZXIucHJvdG90eXBlLmRlbGl2ZXIgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KG51bGwsXCJkZWxpdmVyXCIpO1xyXG5cdFx0fVxyXG5cdCAgICBPYnNlcnZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24odGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUpIHsgLy8gLCByZWNlaXZlclxyXG5cdCAgICBcdHZhciBvbGR2YWx1ZSA9IHRhcmdldFtwcm9wZXJ0eV07XHJcblx0ICAgIFx0dmFyIHR5cGUgPSAob2xkdmFsdWU9PT11bmRlZmluZWQgPyBcImFkZFwiIDogXCJ1cGRhdGVcIik7XHJcblx0ICAgIFx0dGFyZ2V0W3Byb3BlcnR5XSA9IHZhbHVlO1xyXG5cdCAgICBcdGlmKHRhcmdldC5fX29ic2VydmVyc19fLmluZGV4T2YodGhpcyk+PTAgJiYgKCF0aGlzLmFjY2VwdGxpc3QgfHwgdGhpcy5hY2NlcHRsaXN0LmluZGV4T2YodHlwZSk+PTApKSB7XHJcblx0ICAgICAgICBcdHZhciBjaGFuZ2UgPSB7b2JqZWN0OnRhcmdldCxuYW1lOnByb3BlcnR5LHR5cGU6dHlwZX0sXHJcblx0ICAgICAgICBcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcblx0ICAgICAgICBcdFx0ZGVsaXZlciA9IHRoaXMuZGVsaXZlcigpO1xyXG5cdCAgICAgICAgXHRpZih0eXBlPT09XCJ1cGRhdGVcIikge1xyXG5cdCAgICAgICAgXHRcdGNoYW5nZS5vbGRWYWx1ZSA9IG9sZHZhbHVlO1xyXG5cdCAgICAgICAgXHR9XHJcblx0ICAgICAgICBcdHRoaXMuY2hhbmdlc2V0LnB1c2goY2hhbmdlKTtcclxuXHQgICAgICAgIFx0aWYoc3RhcnQpIHtcclxuXHQgICAgICAgIFx0XHRkZWxpdmVyKGZhbHNlLCh0eXBlb2YoZGVsaXZlci5kZWxheSk9PT1cIm51bWJlclwiID8gZGVsaXZlci5kZWxheSA6IDEwKSk7XHJcblx0ICAgICAgICBcdH1cclxuXHQgICAgXHR9XHJcblx0ICAgIFx0cmV0dXJuIHRydWU7XHJcblx0ICAgIH07XHJcblx0ICAgIE9ic2VydmVyLnByb3RvdHlwZS5kZWxldGVQcm9wZXJ0eSA9IGZ1bmN0aW9uKHRhcmdldCwgcHJvcGVydHkpIHtcclxuXHQgICAgXHR2YXIgb2xkdmFsdWUgPSB0YXJnZXRbcHJvcGVydHldO1xyXG5cdCAgICBcdC8vaWYodHlwZW9mKG9sZHZhbHVlKSE9PVwidW5kZWZpbmVkXCIpIHtcclxuXHRcdCAgICBcdGRlbGV0ZSB0YXJnZXRbcHJvcGVydHldO1xyXG5cdFx0ICAgIFx0aWYodGFyZ2V0Ll9fb2JzZXJ2ZXJzX18uaW5kZXhPZih0aGlzKT49MCAmJiAhdGhpcy5hY2NlcHRsaXN0IHx8IHRoaXMuYWNjZXB0bGlzdC5pbmRleE9mKFwiZGVsZXRlXCIpPj0wKSB7XHJcblx0XHQgICAgICAgIFx0dmFyIGNoYW5nZSA9IHtvYmplY3Q6dGFyZ2V0LG5hbWU6cHJvcGVydHksdHlwZTpcImRlbGV0ZVwiLG9sZFZhbHVlOm9sZHZhbHVlfSxcclxuXHRcdCAgICAgICAgXHRcdHN0YXJ0ID0gdGhpcy5jaGFuZ2VzZXQubGVuZ3RoID09PSAwLFxyXG5cdFx0ICAgICAgICBcdFx0ZGVsaXZlciA9IHRoaXMuZGVsaXZlcigpO1xyXG5cdFx0ICAgICAgICBcdHRoaXMuY2hhbmdlc2V0LnB1c2goY2hhbmdlKTtcclxuXHRcdCAgICAgICAgXHRpZihzdGFydCkge1xyXG5cdFx0ICAgICAgICBcdFx0ZGVsaXZlcihmYWxzZSwodHlwZW9mKGRlbGl2ZXIuZGVsYXkpPT09XCJudW1iZXJcIiA/IGRlbGl2ZXIuZGVsYXkgOiAxMCkpO1xyXG5cdFx0ICAgICAgICBcdH1cclxuXHRcdCAgICBcdH1cclxuXHQgICAgXHQvL31cclxuXHQgICAgXHRyZXR1cm4gdHJ1ZTtcclxuXHQgICAgfTtcclxuXHQgICAgT2JzZXJ2ZXIucHJvdG90eXBlLmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24odGFyZ2V0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikge1xyXG5cdCAgICBcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjcmlwdG9yKTtcclxuXHQgICAgXHRpZih0YXJnZXQuX19vYnNlcnZlcnNfXy5pbmRleE9mKHRoaXMpPj0wICYmICF0aGlzLmFjY2VwdGxpc3QgfHwgdGhpcy5hY2NlcHRsaXN0LmluZGV4T2YoXCJyZWNvbmZpZ3VyZVwiKT49MCkge1xyXG5cdCAgICAgICAgXHR2YXIgY2hhbmdlID0ge29iamVjdDp0YXJnZXQsbmFtZTpwcm9wZXJ0eSx0eXBlOlwicmVjb25maWd1cmVcIn0sXHJcbiAgICAgICAgXHRcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcbiAgICAgICAgXHRcdFx0ZGVsaXZlciA9IHRoaXMuZGVsaXZlcigpO1xyXG5cdCAgICAgICAgXHR0aGlzLmNoYW5nZXNldC5wdXNoKGNoYW5nZSk7XHJcblx0ICAgICAgICBcdGlmKHN0YXJ0KSB7XHJcblx0ICAgICAgICBcdFx0ZGVsaXZlcihmYWxzZSwodHlwZW9mKGRlbGl2ZXIuZGVsYXkpPT09XCJudW1iZXJcIiA/IGRlbGl2ZXIuZGVsYXkgOiAxMCkpO1xyXG5cdCAgICAgICAgXHR9XHJcblx0ICAgIFx0fVxyXG5cdCAgICBcdHJldHVybiB0cnVlO1xyXG5cdCAgICB9O1xyXG5cdCAgICBPYnNlcnZlci5wcm90b3R5cGUuc2V0UHJvdG90eXBlT2YgPSBmdW5jdGlvbih0YXJnZXQsIHByb3RvdHlwZSkge1xyXG5cdCAgICBcdHZhciBvbGR2YWx1ZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpO1xyXG5cdCAgICBcdE9iamVjdC5zZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvdHlwZSk7XHJcblx0ICAgIFx0aWYodGFyZ2V0Ll9fb2JzZXJ2ZXJzX18uaW5kZXhPZih0aGlzKT49MCAmJiAhdGhpcy5hY2NlcHRsaXN0IHx8IHRoaXMuYWNjZXB0bGlzdC5pbmRleE9mKFwic2V0UHJvdG90eXBlXCIpPj0wKSB7XHJcblx0ICAgICAgICBcdHZhciBjaGFuZ2UgPSB7b2JqZWN0OnRhcmdldCxuYW1lOlwiX19wcm90b19fXCIsdHlwZTpcInNldFByb3RvdHlwZVwiLG9sZFZhbHVlOm9sZHZhbHVlfSxcclxuICAgIFx0XHRcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcbiAgICBcdFx0XHRcdGRlbGl2ZXIgPSB0aGlzLmRlbGl2ZXIoKTtcclxuXHQgICAgICAgIFx0dGhpcy5jaGFuZ2VzZXQucHVzaChjaGFuZ2UpO1xyXG5cdCAgICAgICAgXHRpZihzdGFydCkge1xyXG5cdCAgICAgICAgXHRcdGRlbGl2ZXIoZmFsc2UsKHR5cGVvZihkZWxpdmVyLmRlbGF5KT09PVwibnVtYmVyXCIgPyBkZWxpdmVyLmRlbGF5IDogMTApKTtcclxuXHQgICAgICAgIFx0fVxyXG5cdCAgICBcdH1cclxuXHQgICAgXHRyZXR1cm4gdHJ1ZTtcclxuXHQgICAgfTtcclxuXHQgICAgT2JzZXJ2ZXIucHJvdG90eXBlLnByZXZlbnRFeHRlbnNpb25zID0gZnVuY3Rpb24odGFyZ2V0KSB7XHJcblx0ICAgICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcclxuXHQgICAgXHRpZih0YXJnZXQuX19vYnNlcnZlcnNfXy5pbmRleE9mKHRoaXMpPj0wICYmICF0aGlzLmFjY2VwdGxpc3QgfHwgdGhpcy5hY2NlcHRsaXN0LmluZGV4T2YoXCJwcmV2ZW50RXh0ZW5zaW9uc1wiKT49MCkge1xyXG5cdCAgICAgICAgXHR2YXIgY2hhbmdlID0ge29iamVjdDp0YXJnZXQsdHlwZTpcInByZXZlbnRFeHRlbnNpb25zXCJ9LFxyXG5cdFx0XHRcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcblx0XHRcdFx0XHRkZWxpdmVyID0gdGhpcy5kZWxpdmVyKCk7XHJcblx0ICAgICAgICBcdHRoaXMuY2hhbmdlc2V0LnB1c2goY2hhbmdlKTtcclxuXHQgICAgICAgIFx0aWYoc3RhcnQpIHtcclxuXHQgICAgICAgIFx0XHRkZWxpdmVyKGZhbHNlLCh0eXBlb2YoZGVsaXZlci5kZWxheSk9PT1cIm51bWJlclwiID8gZGVsaXZlci5kZWxheSA6IDEwKSk7XHJcblx0ICAgICAgICBcdH1cclxuXHQgICAgXHR9XHJcblx0ICAgIFx0cmV0dXJuIHRydWU7XHJcblx0ICAgIH07XHJcblx0ICAgIE9iamVjdC5vYnNlcnZlID0gZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrLGFjY2VwdGxpc3QscGF1c2FibGUscGF1c2UsZGVsYXkpIHtcclxuXHQgICAgXHRyZXR1cm4gbmV3IE9ic2VydmVyKG9iamVjdCxjYWxsYmFjayxhY2NlcHRsaXN0LHBhdXNhYmxlLHBhdXNlLGRlbGF5KTtcclxuXHQgICAgfTtcclxuXHQgICAgT2JqZWN0LnVub2JzZXJ2ZSA9IGZ1bmN0aW9uKG9iamVjdCxjYWxsYmFjaykge1xyXG5cdCAgICBcdGlmKG9iamVjdC5fX29ic2VydmVyQ2FsbGJhY2tzX18pIHtcclxuXHQgICAgXHRcdGlmKCFjYWxsYmFjaykge1xyXG5cdCAgICBcdFx0XHRvYmplY3QuX19vYnNlcnZlckNhbGxiYWNrc19fLnNwbGljZSgwLG9iamVjdC5fX29ic2VydmVyQ2FsbGJhY2tzX18ubGVuZ3RoKTtcclxuXHQgICAgXHRcdFx0b2JqZWN0Ll9fb2JzZXJ2ZXJzX18uc3BsaWNlKDAsb2JqZWN0Ll9fb2JzZXJ2ZXJzX18ubGVuZ3RoKTtcclxuXHQgICAgXHRcdFx0cmV0dXJuO1xyXG5cdCAgICBcdFx0fVxyXG5cdCAgICBcdFx0b2JqZWN0Ll9fb2JzZXJ2ZXJDYWxsYmFja3NfXy5mb3JFYWNoKGZ1bmN0aW9uKG9ic2VydmVyY2FsbGJhY2ssaSkge1xyXG5cdCAgICBcdFx0XHRpZihjYWxsYmFjaz09PW9ic2VydmVyY2FsbGJhY2spIHtcclxuXHQgICAgXHRcdFx0XHRvYmplY3QuX19vYnNlcnZlckNhbGxiYWNrc19fLnNwbGljZShpLDEpO1xyXG5cdCAgICBcdFx0XHRcdGRlbGV0ZSBvYmplY3QuX19vYnNlcnZlcnNfX1tpXS5jYWxsYmFjaztcclxuXHQgICAgXHRcdFx0XHRvYmplY3QuX19vYnNlcnZlcnNfXy5zcGxpY2UoaSwxKTtcclxuXHQgICAgXHRcdFx0fVxyXG5cdCAgICBcdFx0fSk7XHJcblx0ICAgIFx0fVxyXG5cdCAgICB9O1xyXG5cdCAgICBBcnJheS5vYnNlcnZlID0gZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrLGFjY2VwdGxpc3QscGF1c2FibGUscGF1c2UsZGVsYXkpIHtcclxuXHQgICAgXHRpZighKG9iamVjdCBpbnN0YW5jZW9mIEFycmF5KSAmJiAhQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XHJcblx0ICAgIFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmlyc3QgYXJndW1lbnQgdG8gQXJyYXkub2JzZXJ2ZXIgaXMgbm90IGFuIEFycmF5XCIpO1xyXG5cdCAgICBcdH1cclxuICAgICAgICAgICAgXHRhY2NlcHRsaXN0ID0gYWNjZXB0bGlzdCB8fCBbXCJhZGRcIiwgXCJ1cGRhdGVcIiwgXCJkZWxldGVcIiwgXCJzcGxpY2VcIl07XHJcblx0ICAgIFx0dmFyIGFycmF5cHJveHkgPSBuZXcgUHJveHkob2JqZWN0LHtnZXQ6IGZ1bmN0aW9uKHRhcmdldCxwcm9wZXJ0eSkge1xyXG5cdCAgICBcdFx0aWYocHJvcGVydHk9PT1cInVub2JzZXJ2ZVwiKSB7XHJcblx0XHQgICAgXHRcdHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xyXG5cdFx0ICAgIFx0XHRcdGlmKGNhbGxiYWNrKSB7XHJcblx0XHQgICAgXHRcdFx0XHRyZXR1cm4gT2JqZWN0LnVub2JzZXJ2ZSh0YXJnZXQsY2FsbGJhY2spO1xyXG5cdFx0ICAgIFx0XHRcdH1cclxuXHRcdCAgICBcdFx0XHRyZXR1cm4gdGFyZ2V0LnVub2JzZXJ2ZSgpO1xyXG5cdFx0ICAgIFx0XHR9O1xyXG5cdFx0ICAgIFx0fVxyXG5cdCAgICBcdFx0aWYocHJvcGVydHk9PT1cInNwbGljZVwiKSB7XHJcblx0ICAgIFx0XHRcdHJldHVybiBmdW5jdGlvbihzdGFydCxlbmQpIHtcclxuXHQgICAgXHRcdFx0XHRpZih0eXBlb2Yoc3RhcnQpIT09XCJudW1iZXJcIiB8fCB0eXBlb2YoZW5kKSE9PVwibnVtYmVyXCIpIHtcclxuXHQgICAgXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCB0d28gYXJndW1lbnRzIHRvIEFycmF5IHNwbGljZSBhcmUgbm90IG51bWJlciwgbnVtYmVyXCIpO1xyXG5cdCAgICBcdFx0XHRcdH1cclxuXHQgICAgXHQgICAgXHRcdHZhciByZW1vdmVkID0gdGhpcy5zbGljZShzdGFydCxzdGFydCtlbmQpLFxyXG5cdCAgICBcdCAgICBcdFx0XHRhZGRlZENvdW50ID0gKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzLmxlbmd0aC0yIDogMCksXHJcblx0ICAgIFx0ICAgIFx0XHRcdGNoYW5nZSA9ICB7b2JqZWN0Om9iamVjdCx0eXBlOlwic3BsaWNlXCIsaW5kZXg6c3RhcnQscmVtb3ZlZDpyZW1vdmVkLGFkZGVkQ291bnQ6YWRkZWRDb3VudH07XHJcblx0ICAgIFx0ICAgIFx0XHR0YXJnZXQuc3BsaWNlLmFwcGx5KHRhcmdldCxhcmd1bWVudHMpO1xyXG5cdCAgICBcdCAgICBcdFx0aWYoYWNjZXB0bGlzdC5pbmRleE9mKFwic3BsaWNlXCIpPj0wKSB7XHJcblx0ICAgIFx0ICAgIFx0XHRcdHZhciBzdGFydCA9IHByb3h5Ll9fb2JzZXJ2ZXJfXy5jaGFuZ2VzZXQubGVuZ3RoID09PSAwLFxyXG5cdCAgICBcdCAgICAgICAgXHRcdFx0ZGVsaXZlciA9IHByb3h5Ll9fb2JzZXJ2ZXJfXy5kZWxpdmVyKCk7XHJcblx0ICAgIFx0ICAgIFx0XHRcdHByb3h5Ll9fb2JzZXJ2ZXJfXy5jaGFuZ2VzZXQucHVzaChjaGFuZ2UpO1xyXG5cdCAgICBcdCAgICBcdFx0XHRpZihzdGFydCkge1xyXG5cdCAgICBcdFx0ICAgICAgICBcdFx0ZGVsaXZlcihmYWxzZSwodHlwZW9mKGRlbGl2ZXIuZGVsYXkpPT09XCJudW1iZXJcIiA/IGRlbGl2ZXIuZGVsYXkgOiAxMCkpO1xyXG5cdCAgICBcdFx0ICAgICAgICBcdH1cclxuXHQgICAgXHQgICAgXHRcdH1cclxuXHQgICAgXHQgICAgXHR9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRpZihwcm9wZXJ0eT09PVwicHVzaFwiKSB7XHJcblx0ICAgIFx0XHRcdCByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xyXG5cdCAgICBcdFx0ICAgIFx0cmV0dXJuIHRoaXMuc3BsaWNlKHRoaXMubGVuZ3RoLDAsaXRlbSk7XHJcblx0ICAgIFx0XHQgICAgfVxyXG5cdCAgICBcdFx0fVxyXG5cdCAgICBcdFx0aWYocHJvcGVydHk9PT1cInBvcFwiKSB7XHJcblx0ICAgIFx0XHRcdCByZXR1cm4gZnVuY3Rpb24oKSB7XHJcblx0ICAgIFx0XHQgICAgXHRyZXR1cm4gdGhpcy5zcGxpY2UodGhpcy5sZW5ndGgtMSwxKTtcclxuXHQgICAgXHRcdCAgICB9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRpZihwcm9wZXJ0eT09PVwidW5zaGlmdFwiKSB7XHJcblx0ICAgIFx0XHRcdCByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgXHRcdCAgICBcdFx0cmV0dXJuIHRoaXMuc3BsaWNlKDAsMCxpdGVtKTtcclxuICAgIFx0XHQgICAgXHR9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRpZihwcm9wZXJ0eT09PVwic2hpZnRcIikge1xyXG5cdCAgICBcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XHJcblx0ICAgIFx0ICAgIFx0XHRyZXR1cm4gdGhpcy5zcGxpY2UoMCwxKTtcclxuXHQgICAgXHQgICAgXHR9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRyZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XTtcclxuXHQgICAgXHR9fSk7XHJcblx0ICAgIFx0dmFyIHByb3h5ID0gT2JqZWN0Lm9ic2VydmUoYXJyYXlwcm94eSxmdW5jdGlvbihjaGFuZ2VzZXQpIHsgXHJcblx0ICAgIFx0XHR2YXIgY2hhbmdlcyA9IGNoYW5nZXNldC5maWx0ZXIoZnVuY3Rpb24oY2hhbmdlKSB7IHJldHVybiBjaGFuZ2UubmFtZSE9PVwibGVuZ3RoXCIgJiYgY2hhbmdlLm5hbWUhPT1cImFkZFwiICYmICghYWNjZXB0bGlzdCB8fCBhY2NlcHRsaXN0LmluZGV4T2YoY2hhbmdlLnR5cGUpPj0wKTsgfSk7XHJcblx0ICAgIFx0XHRpZihjaGFuZ2VzLmxlbmd0aD4wKSB7XHJcblx0ICAgIFx0XHRcdGNhbGxiYWNrKGNoYW5nZXMpO1xyXG5cdCAgICBcdFx0fVxyXG5cdCAgICBcdH0sYWNjZXB0bGlzdCxwYXVzYWJsZSxwYXVzZSxkZWxheSk7XHJcblx0ICAgIFx0cmV0dXJuIHByb3h5O1xyXG5cdCAgICB9O1xyXG5cdCAgICBBcnJheS51bm9ic2VydmUgPSBmdW5jdGlvbihvYmplY3QsY2FsbGJhY2spIHtcclxuXHRcdCAgcmV0dXJuIG9iamVjdC51bm9ic2VydmUoY2FsbGJhY2spO1xyXG5cdCAgICB9XHJcblx0fVxyXG5cdE9iamVjdC5kZWVwT2JzZXJ2ZSA9IGZ1bmN0aW9uKG9iamVjdCxjYWxsYmFjayxwYXJ0cykge1xyXG5cclxuXHRcdHBhcnRzID0gKHBhcnRzID8gcGFydHMgOiBbXSk7XHJcblxyXG5cdFx0dmFyIHRvVHlwZU5hbWUgPSBmdW5jdGlvbihvYmopIHtcclxuXHRcdFx0cmV0dXJuICh7fSkudG9TdHJpbmcuY2FsbChvYmopLm1hdGNoKC9cXHMoW2EtekEtWl0rKS8pWzFdLnRvTG93ZXJDYXNlKClcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiByZW9ic2VydmUodmFsdWUsIHBhcnRzKSB7XHJcblx0XHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xyXG5cdFx0XHRrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XHJcblx0XHRcdFx0aWYoKHRvVHlwZU5hbWUodmFsdWVba2V5XSkgPT09ICdvYmplY3QnIHx8IHRvVHlwZU5hbWUodmFsdWVba2V5XSkgPT09ICdhcnJheScpICYmICF2YWx1ZVtrZXldLmhhc093blByb3BlcnR5KCdfX29ic2VydmVyc19fJykpIHtcclxuXHRcdFx0XHRcdHZhciBuZXdwYXJ0cyA9IHBhcnRzLnNsaWNlKDApO1xyXG5cdFx0XHRcdFx0bmV3cGFydHMucHVzaChrZXkpO1xyXG5cdFx0XHRcdFx0dmFsdWVba2V5XSA9IE9iamVjdC5kZWVwT2JzZXJ2ZSh2YWx1ZVtrZXldLGNhbGxiYWNrLG5ld3BhcnRzKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlb2JzZXJ2ZShvYmplY3QsIHBhcnRzKTtcclxuXHJcblx0XHR2YXIgb2JzZXJ2ZWQgPSBPYmplY3Qub2JzZXJ2ZShvYmplY3QsZnVuY3Rpb24oY2hhbmdlc2V0KSB7XHJcblx0XHRcdHZhciBjaGFuZ2VzID0gW107XHJcblx0XHRcdGZ1bmN0aW9uIHJlY3Vyc2UobmFtZSxyb290T2JqZWN0LG9sZE9iamVjdCxuZXdPYmplY3QscGF0aCkge1xyXG5cdFx0XHRcdGlmKG5ld09iamVjdCBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG5cdFx0XHRcdFx0dmFyIG5ld2tleXMgPSBPYmplY3Qua2V5cyhuZXdPYmplY3QpO1xyXG5cdFx0XHRcdFx0bmV3a2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xyXG5cdFx0XHRcdFx0XHRpZighb2xkT2JqZWN0IHx8IChvbGRPYmplY3Rba2V5XSE9PW5ld09iamVjdFtrZXldKSkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBvbGR2YWx1ZSA9IChvbGRPYmplY3QgJiYgb2xkT2JqZWN0W2tleV0hPT11bmRlZmluZWQgPyBvbGRPYmplY3Rba2V5XSA6IHVuZGVmaW5lZCksXHJcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2UgPSAob2xkdmFsdWU9PT11bmRlZmluZWQgPyBcImFkZFwiIDogXCJ1cGRhdGVcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRrZXlwYXRoID0gcGF0aCArIFwiLlwiICsga2V5O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe25hbWU6bmFtZSxvYmplY3Q6cm9vdE9iamVjdCx0eXBlOmNoYW5nZSxvbGRWYWx1ZTpvbGR2YWx1ZSxuZXdWYWx1ZTpuZXdPYmplY3Rba2V5XSxrZXlwYXRoOmtleXBhdGh9KTtcclxuXHRcdFx0XHRcdFx0XHRyZWN1cnNlKG5hbWUscm9vdE9iamVjdCxvbGR2YWx1ZSxuZXdPYmplY3Rba2V5XSxrZXlwYXRoKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmKG9sZE9iamVjdCBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG5cdFx0XHRcdFx0dmFyIG9sZGtleXMgPSBPYmplY3Qua2V5cyhvbGRPYmplY3QpO1xyXG5cdFx0XHRcdFx0b2xka2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xyXG5cdFx0XHRcdFx0XHR2YXIgY2hhbmdlID0gKG5ld09iamVjdD09PW51bGwgPyBcInVwZGF0ZVwiIDogXCJkZWxldGVcIiksXHJcblx0XHRcdFx0XHRcdFx0a2V5cGF0aCA9IHBhdGggKyBcIi5cIiArIGtleTtcclxuXHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtuYW1lOm5hbWUsb2JqZWN0OnJvb3RPYmplY3QsdHlwZTpjaGFuZ2Usb2xkVmFsdWU6b2xkT2JqZWN0W2tleV0sbmV3VmFsdWU6bmV3T2JqZWN0LGtleXBhdGg6a2V5cGF0aH0pO1xyXG5cdFx0XHRcdFx0XHRyZWN1cnNlKG5hbWUscm9vdE9iamVjdCxvbGRPYmplY3Rba2V5XSx1bmRlZmluZWQsa2V5cGF0aCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Y2hhbmdlc2V0LmZvckVhY2goZnVuY3Rpb24oY2hhbmdlKSB7XHJcblx0XHRcdFx0dmFyIGtleXBhdGggPSAocGFydHMubGVuZ3RoPjAgPyBwYXJ0cy5qb2luKFwiLlwiKSArIFwiLlwiIDogXCJcIikgKyBjaGFuZ2UubmFtZTtcclxuXHJcblx0XHRcdFx0aWYgKGNoYW5nZS50eXBlID09PSBcInVwZGF0ZVwiIHx8IGNoYW5nZS50eXBlID09PSBcImFkZFwiKSB7IFxyXG5cdFx0XHRcdFx0cmVvYnNlcnZlKGNoYW5nZS5vYmplY3QsIHBhcnRzKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNoYW5nZXMucHVzaCh7bmFtZTpjaGFuZ2UubmFtZSxvYmplY3Q6Y2hhbmdlLm9iamVjdCx0eXBlOmNoYW5nZS50eXBlLG9sZFZhbHVlOmNoYW5nZS5vbGRWYWx1ZSxuZXdWYWx1ZTpjaGFuZ2Uub2JqZWN0W2NoYW5nZS5uYW1lXSxrZXlwYXRoOmtleXBhdGh9KTtcclxuXHRcdFx0XHRyZWN1cnNlKGNoYW5nZS5uYW1lLGNoYW5nZS5vYmplY3QsY2hhbmdlLm9sZFZhbHVlLGNoYW5nZS5vYmplY3RbY2hhbmdlLm5hbWVdLGtleXBhdGgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Y2FsbGJhY2soY2hhbmdlcyk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiBvYnNlcnZlZDtcclxuXHR9O1xyXG59KSgpO1xyXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///86\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\r\nAuthor: Geraint Luff and others\r\nYear: 2013\r\n\r\nThis code is released into the "public domain" by its author(s). Anybody may use, alter and distribute the code without restriction. The author makes no guarantees, and takes no liability of any kind for use of this code.\r\n\r\nIf you find a bug or make an improvement, it would be courteous to let the author know, but it is not compulsory.\r\n*/\r\n(function (global, factory) {\r\n if (true) {\r\n // AMD. Register as an anonymous module.\r\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n } else {}\r\n}(this, function () {\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FObject%2Fkeys\r\nif (!Object.keys) {\r\n\tObject.keys = (function () {\r\n\t\tvar hasOwnProperty = Object.prototype.hasOwnProperty,\r\n\t\t\thasDontEnumBug = !({toString: null}).propertyIsEnumerable(\'toString\'),\r\n\t\t\tdontEnums = [\r\n\t\t\t\t\'toString\',\r\n\t\t\t\t\'toLocaleString\',\r\n\t\t\t\t\'valueOf\',\r\n\t\t\t\t\'hasOwnProperty\',\r\n\t\t\t\t\'isPrototypeOf\',\r\n\t\t\t\t\'propertyIsEnumerable\',\r\n\t\t\t\t\'constructor\'\r\n\t\t\t],\r\n\t\t\tdontEnumsLength = dontEnums.length;\r\n\r\n\t\treturn function (obj) {\r\n\t\t\tif (typeof obj !== \'object\' && typeof obj !== \'function\' || obj === null) {\r\n\t\t\t\tthrow new TypeError(\'Object.keys called on non-object\');\r\n\t\t\t}\r\n\r\n\t\t\tvar result = [];\r\n\r\n\t\t\tfor (var prop in obj) {\r\n\t\t\t\tif (hasOwnProperty.call(obj, prop)) {\r\n\t\t\t\t\tresult.push(prop);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (hasDontEnumBug) {\r\n\t\t\t\tfor (var i=0; i < dontEnumsLength; i++) {\r\n\t\t\t\t\tif (hasOwnProperty.call(obj, dontEnums[i])) {\r\n\t\t\t\t\t\tresult.push(dontEnums[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t};\r\n\t})();\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create\r\nif (!Object.create) {\r\n\tObject.create = (function(){\r\n\t\tfunction F(){}\r\n\r\n\t\treturn function(o){\r\n\t\t\tif (arguments.length !== 1) {\r\n\t\t\t\tthrow new Error(\'Object.create implementation only accepts one parameter.\');\r\n\t\t\t}\r\n\t\t\tF.prototype = o;\r\n\t\t\treturn new F();\r\n\t\t};\r\n\t})();\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FisArray\r\nif(!Array.isArray) {\r\n\tArray.isArray = function (vArg) {\r\n\t\treturn Object.prototype.toString.call(vArg) === "[object Array]";\r\n\t};\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FindexOf\r\nif (!Array.prototype.indexOf) {\r\n\tArray.prototype.indexOf = function (searchElement /*, fromIndex */ ) {\r\n\t\tif (this === null) {\r\n\t\t\tthrow new TypeError();\r\n\t\t}\r\n\t\tvar t = Object(this);\r\n\t\tvar len = t.length >>> 0;\r\n\r\n\t\tif (len === 0) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tvar n = 0;\r\n\t\tif (arguments.length > 1) {\r\n\t\t\tn = Number(arguments[1]);\r\n\t\t\tif (n !== n) { // shortcut for verifying if it\'s NaN\r\n\t\t\t\tn = 0;\r\n\t\t\t} else if (n !== 0 && n !== Infinity && n !== -Infinity) {\r\n\t\t\t\tn = (n > 0 || -1) * Math.floor(Math.abs(n));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (n >= len) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tvar k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\r\n\t\tfor (; k < len; k++) {\r\n\t\t\tif (k in t && t[k] === searchElement) {\r\n\t\t\t\treturn k;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t};\r\n}\r\n\r\n// Grungey Object.isFrozen hack\r\nif (!Object.isFrozen) {\r\n\tObject.isFrozen = function (obj) {\r\n\t\tvar key = "tv4_test_frozen_key";\r\n\t\twhile (obj.hasOwnProperty(key)) {\r\n\t\t\tkey += Math.random();\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tobj[key] = true;\r\n\t\t\tdelete obj[key];\r\n\t\t\treturn false;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t};\r\n}\r\n// Based on: https://github.com/geraintluff/uri-templates, but with all the de-substitution stuff removed\r\n\r\nvar uriTemplateGlobalModifiers = {\r\n\t"+": true,\r\n\t"#": true,\r\n\t".": true,\r\n\t"/": true,\r\n\t";": true,\r\n\t"?": true,\r\n\t"&": true\r\n};\r\nvar uriTemplateSuffices = {\r\n\t"*": true\r\n};\r\n\r\nfunction notReallyPercentEncode(string) {\r\n\treturn encodeURI(string).replace(/%25[0-9][0-9]/g, function (doubleEncoded) {\r\n\t\treturn "%" + doubleEncoded.substring(3);\r\n\t});\r\n}\r\n\r\nfunction uriTemplateSubstitution(spec) {\r\n\tvar modifier = "";\r\n\tif (uriTemplateGlobalModifiers[spec.charAt(0)]) {\r\n\t\tmodifier = spec.charAt(0);\r\n\t\tspec = spec.substring(1);\r\n\t}\r\n\tvar separator = "";\r\n\tvar prefix = "";\r\n\tvar shouldEscape = true;\r\n\tvar showVariables = false;\r\n\tvar trimEmptyString = false;\r\n\tif (modifier === \'+\') {\r\n\t\tshouldEscape = false;\r\n\t} else if (modifier === ".") {\r\n\t\tprefix = ".";\r\n\t\tseparator = ".";\r\n\t} else if (modifier === "/") {\r\n\t\tprefix = "/";\r\n\t\tseparator = "/";\r\n\t} else if (modifier === \'#\') {\r\n\t\tprefix = "#";\r\n\t\tshouldEscape = false;\r\n\t} else if (modifier === \';\') {\r\n\t\tprefix = ";";\r\n\t\tseparator = ";";\r\n\t\tshowVariables = true;\r\n\t\ttrimEmptyString = true;\r\n\t} else if (modifier === \'?\') {\r\n\t\tprefix = "?";\r\n\t\tseparator = "&";\r\n\t\tshowVariables = true;\r\n\t} else if (modifier === \'&\') {\r\n\t\tprefix = "&";\r\n\t\tseparator = "&";\r\n\t\tshowVariables = true;\r\n\t}\r\n\r\n\tvar varNames = [];\r\n\tvar varList = spec.split(",");\r\n\tvar varSpecs = [];\r\n\tvar varSpecMap = {};\r\n\tfor (var i = 0; i < varList.length; i++) {\r\n\t\tvar varName = varList[i];\r\n\t\tvar truncate = null;\r\n\t\tif (varName.indexOf(":") !== -1) {\r\n\t\t\tvar parts = varName.split(":");\r\n\t\t\tvarName = parts[0];\r\n\t\t\ttruncate = parseInt(parts[1], 10);\r\n\t\t}\r\n\t\tvar suffices = {};\r\n\t\twhile (uriTemplateSuffices[varName.charAt(varName.length - 1)]) {\r\n\t\t\tsuffices[varName.charAt(varName.length - 1)] = true;\r\n\t\t\tvarName = varName.substring(0, varName.length - 1);\r\n\t\t}\r\n\t\tvar varSpec = {\r\n\t\t\ttruncate: truncate,\r\n\t\t\tname: varName,\r\n\t\t\tsuffices: suffices\r\n\t\t};\r\n\t\tvarSpecs.push(varSpec);\r\n\t\tvarSpecMap[varName] = varSpec;\r\n\t\tvarNames.push(varName);\r\n\t}\r\n\tvar subFunction = function (valueFunction) {\r\n\t\tvar result = "";\r\n\t\tvar startIndex = 0;\r\n\t\tfor (var i = 0; i < varSpecs.length; i++) {\r\n\t\t\tvar varSpec = varSpecs[i];\r\n\t\t\tvar value = valueFunction(varSpec.name);\r\n\t\t\tif (value === null || value === undefined || (Array.isArray(value) && value.length === 0) || (typeof value === \'object\' && Object.keys(value).length === 0)) {\r\n\t\t\t\tstartIndex++;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (i === startIndex) {\r\n\t\t\t\tresult += prefix;\r\n\t\t\t} else {\r\n\t\t\t\tresult += (separator || ",");\r\n\t\t\t}\r\n\t\t\tif (Array.isArray(value)) {\r\n\t\t\t\tif (showVariables) {\r\n\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t}\r\n\t\t\t\tfor (var j = 0; j < value.length; j++) {\r\n\t\t\t\t\tif (j > 0) {\r\n\t\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? (separator || ",") : ",";\r\n\t\t\t\t\t\tif (varSpec.suffices[\'*\'] && showVariables) {\r\n\t\t\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(value[j]).replace(/!/g, "%21") : notReallyPercentEncode(value[j]);\r\n\t\t\t\t}\r\n\t\t\t} else if (typeof value === "object") {\r\n\t\t\t\tif (showVariables && !varSpec.suffices[\'*\']) {\r\n\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t}\r\n\t\t\t\tvar first = true;\r\n\t\t\t\tfor (var key in value) {\r\n\t\t\t\t\tif (!first) {\r\n\t\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? (separator || ",") : ",";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfirst = false;\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(key).replace(/!/g, "%21") : notReallyPercentEncode(key);\r\n\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? \'=\' : ",";\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(value[key]).replace(/!/g, "%21") : notReallyPercentEncode(value[key]);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (showVariables) {\r\n\t\t\t\t\tresult += varSpec.name;\r\n\t\t\t\t\tif (!trimEmptyString || value !== "") {\r\n\t\t\t\t\t\tresult += "=";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (varSpec.truncate != null) {\r\n\t\t\t\t\tvalue = value.substring(0, varSpec.truncate);\r\n\t\t\t\t}\r\n\t\t\t\tresult += shouldEscape ? encodeURIComponent(value).replace(/!/g, "%21"): notReallyPercentEncode(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t};\r\n\tsubFunction.varNames = varNames;\r\n\treturn {\r\n\t\tprefix: prefix,\r\n\t\tsubstitution: subFunction\r\n\t};\r\n}\r\n\r\nfunction UriTemplate(template) {\r\n\tif (!(this instanceof UriTemplate)) {\r\n\t\treturn new UriTemplate(template);\r\n\t}\r\n\tvar parts = template.split("{");\r\n\tvar textParts = [parts.shift()];\r\n\tvar prefixes = [];\r\n\tvar substitutions = [];\r\n\tvar varNames = [];\r\n\twhile (parts.length > 0) {\r\n\t\tvar part = parts.shift();\r\n\t\tvar spec = part.split("}")[0];\r\n\t\tvar remainder = part.substring(spec.length + 1);\r\n\t\tvar funcs = uriTemplateSubstitution(spec);\r\n\t\tsubstitutions.push(funcs.substitution);\r\n\t\tprefixes.push(funcs.prefix);\r\n\t\ttextParts.push(remainder);\r\n\t\tvarNames = varNames.concat(funcs.substitution.varNames);\r\n\t}\r\n\tthis.fill = function (valueFunction) {\r\n\t\tvar result = textParts[0];\r\n\t\tfor (var i = 0; i < substitutions.length; i++) {\r\n\t\t\tvar substitution = substitutions[i];\r\n\t\t\tresult += substitution(valueFunction);\r\n\t\t\tresult += textParts[i + 1];\r\n\t\t}\r\n\t\treturn result;\r\n\t};\r\n\tthis.varNames = varNames;\r\n\tthis.template = template;\r\n}\r\nUriTemplate.prototype = {\r\n\ttoString: function () {\r\n\t\treturn this.template;\r\n\t},\r\n\tfillFromObject: function (obj) {\r\n\t\treturn this.fill(function (varName) {\r\n\t\t\treturn obj[varName];\r\n\t\t});\r\n\t}\r\n};\r\nvar ValidatorContext = function ValidatorContext(parent, collectMultiple, errorReporter, checkRecursive, trackUnknownProperties) {\r\n\tthis.missing = [];\r\n\tthis.missingMap = {};\r\n\tthis.formatValidators = parent ? Object.create(parent.formatValidators) : {};\r\n\tthis.schemas = parent ? Object.create(parent.schemas) : {};\r\n\tthis.collectMultiple = collectMultiple;\r\n\tthis.errors = [];\r\n\tthis.handleError = collectMultiple ? this.collectError : this.returnError;\r\n\tif (checkRecursive) {\r\n\t\tthis.checkRecursive = true;\r\n\t\tthis.scanned = [];\r\n\t\tthis.scannedFrozen = [];\r\n\t\tthis.scannedFrozenSchemas = [];\r\n\t\tthis.scannedFrozenValidationErrors = [];\r\n\t\tthis.validatedSchemasKey = \'tv4_validation_id\';\r\n\t\tthis.validationErrorsKey = \'tv4_validation_errors_id\';\r\n\t}\r\n\tif (trackUnknownProperties) {\r\n\t\tthis.trackUnknownProperties = true;\r\n\t\tthis.knownPropertyPaths = {};\r\n\t\tthis.unknownPropertyPaths = {};\r\n\t}\r\n\tthis.errorReporter = errorReporter || defaultErrorReporter(\'en\');\r\n\tif (typeof this.errorReporter === \'string\') {\r\n\t\tthrow new Error(\'debug\');\r\n\t}\r\n\tthis.definedKeywords = {};\r\n\tif (parent) {\r\n\t\tfor (var key in parent.definedKeywords) {\r\n\t\t\tthis.definedKeywords[key] = parent.definedKeywords[key].slice(0);\r\n\t\t}\r\n\t}\r\n};\r\nValidatorContext.prototype.defineKeyword = function (keyword, keywordFunction) {\r\n\tthis.definedKeywords[keyword] = this.definedKeywords[keyword] || [];\r\n\tthis.definedKeywords[keyword].push(keywordFunction);\r\n};\r\nValidatorContext.prototype.createError = function (code, messageParams, dataPath, schemaPath, subErrors, data, schema) {\r\n\tvar error = new ValidationError(code, messageParams, dataPath, schemaPath, subErrors);\r\n\terror.message = this.errorReporter(error, data, schema);\r\n\treturn error;\r\n};\r\nValidatorContext.prototype.returnError = function (error) {\r\n\treturn error;\r\n};\r\nValidatorContext.prototype.collectError = function (error) {\r\n\tif (error) {\r\n\t\tthis.errors.push(error);\r\n\t}\r\n\treturn null;\r\n};\r\nValidatorContext.prototype.prefixErrors = function (startIndex, dataPath, schemaPath) {\r\n\tfor (var i = startIndex; i < this.errors.length; i++) {\r\n\t\tthis.errors[i] = this.errors[i].prefixWith(dataPath, schemaPath);\r\n\t}\r\n\treturn this;\r\n};\r\nValidatorContext.prototype.banUnknownProperties = function (data, schema) {\r\n\tfor (var unknownPath in this.unknownPropertyPaths) {\r\n\t\tvar error = this.createError(ErrorCodes.UNKNOWN_PROPERTY, {path: unknownPath}, unknownPath, "", null, data, schema);\r\n\t\tvar result = this.handleError(error);\r\n\t\tif (result) {\r\n\t\t\treturn result;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.addFormat = function (format, validator) {\r\n\tif (typeof format === \'object\') {\r\n\t\tfor (var key in format) {\r\n\t\t\tthis.addFormat(key, format[key]);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\tthis.formatValidators[format] = validator;\r\n};\r\nValidatorContext.prototype.resolveRefs = function (schema, urlHistory) {\r\n\tif (schema[\'$ref\'] !== undefined) {\r\n\t\turlHistory = urlHistory || {};\r\n\t\tif (urlHistory[schema[\'$ref\']]) {\r\n\t\t\treturn this.createError(ErrorCodes.CIRCULAR_REFERENCE, {urls: Object.keys(urlHistory).join(\', \')}, \'\', \'\', null, undefined, schema);\r\n\t\t}\r\n\t\turlHistory[schema[\'$ref\']] = true;\r\n\t\tschema = this.getSchema(schema[\'$ref\'], urlHistory);\r\n\t}\r\n\treturn schema;\r\n};\r\nValidatorContext.prototype.getSchema = function (url, urlHistory) {\r\n\tvar schema;\r\n\tif (this.schemas[url] !== undefined) {\r\n\t\tschema = this.schemas[url];\r\n\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t}\r\n\tvar baseUrl = url;\r\n\tvar fragment = "";\r\n\tif (url.indexOf(\'#\') !== -1) {\r\n\t\tfragment = url.substring(url.indexOf("#") + 1);\r\n\t\tbaseUrl = url.substring(0, url.indexOf("#"));\r\n\t}\r\n\tif (typeof this.schemas[baseUrl] === \'object\') {\r\n\t\tschema = this.schemas[baseUrl];\r\n\t\tvar pointerPath = decodeURIComponent(fragment);\r\n\t\tif (pointerPath === "") {\r\n\t\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t\t} else if (pointerPath.charAt(0) !== "/") {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tvar parts = pointerPath.split("/").slice(1);\r\n\t\tfor (var i = 0; i < parts.length; i++) {\r\n\t\t\tvar component = parts[i].replace(/~1/g, "/").replace(/~0/g, "~");\r\n\t\t\tif (schema[component] === undefined) {\r\n\t\t\t\tschema = undefined;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tschema = schema[component];\r\n\t\t}\r\n\t\tif (schema !== undefined) {\r\n\t\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t\t}\r\n\t}\r\n\tif (this.missing[baseUrl] === undefined) {\r\n\t\tthis.missing.push(baseUrl);\r\n\t\tthis.missing[baseUrl] = baseUrl;\r\n\t\tthis.missingMap[baseUrl] = baseUrl;\r\n\t}\r\n};\r\nValidatorContext.prototype.searchSchemas = function (schema, url) {\r\n\tif (Array.isArray(schema)) {\r\n\t\tfor (var i = 0; i < schema.length; i++) {\r\n\t\t\tthis.searchSchemas(schema[i], url);\r\n\t\t}\r\n\t} else if (schema && typeof schema === "object") {\r\n\t\tif (typeof schema.id === "string") {\r\n\t\t\tif (isTrustedUrl(url, schema.id)) {\r\n\t\t\t\tif (this.schemas[schema.id] === undefined) {\r\n\t\t\t\t\tthis.schemas[schema.id] = schema;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (var key in schema) {\r\n\t\t\tif (key !== "enum") {\r\n\t\t\t\tif (typeof schema[key] === "object") {\r\n\t\t\t\t\tthis.searchSchemas(schema[key], url);\r\n\t\t\t\t} else if (key === "$ref") {\r\n\t\t\t\t\tvar uri = getDocumentUri(schema[key]);\r\n\t\t\t\t\tif (uri && this.schemas[uri] === undefined && this.missingMap[uri] === undefined) {\r\n\t\t\t\t\t\tthis.missingMap[uri] = uri;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\nValidatorContext.prototype.addSchema = function (url, schema) {\r\n\t//overload\r\n\tif (typeof url !== \'string\' || typeof schema === \'undefined\') {\r\n\t\tif (typeof url === \'object\' && typeof url.id === \'string\') {\r\n\t\t\tschema = url;\r\n\t\t\turl = schema.id;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\tif (url === getDocumentUri(url) + "#") {\r\n\t\t// Remove empty fragment\r\n\t\turl = getDocumentUri(url);\r\n\t}\r\n\tthis.schemas[url] = schema;\r\n\tdelete this.missingMap[url];\r\n\tnormSchema(schema, url);\r\n\tthis.searchSchemas(schema, url);\r\n};\r\n\r\nValidatorContext.prototype.getSchemaMap = function () {\r\n\tvar map = {};\r\n\tfor (var key in this.schemas) {\r\n\t\tmap[key] = this.schemas[key];\r\n\t}\r\n\treturn map;\r\n};\r\n\r\nValidatorContext.prototype.getSchemaUris = function (filterRegExp) {\r\n\tvar list = [];\r\n\tfor (var key in this.schemas) {\r\n\t\tif (!filterRegExp || filterRegExp.test(key)) {\r\n\t\t\tlist.push(key);\r\n\t\t}\r\n\t}\r\n\treturn list;\r\n};\r\n\r\nValidatorContext.prototype.getMissingUris = function (filterRegExp) {\r\n\tvar list = [];\r\n\tfor (var key in this.missingMap) {\r\n\t\tif (!filterRegExp || filterRegExp.test(key)) {\r\n\t\t\tlist.push(key);\r\n\t\t}\r\n\t}\r\n\treturn list;\r\n};\r\n\r\nValidatorContext.prototype.dropSchemas = function () {\r\n\tthis.schemas = {};\r\n\tthis.reset();\r\n};\r\nValidatorContext.prototype.reset = function () {\r\n\tthis.missing = [];\r\n\tthis.missingMap = {};\r\n\tthis.errors = [];\r\n};\r\n\r\nValidatorContext.prototype.validateAll = function (data, schema, dataPathParts, schemaPathParts, dataPointerPath) {\r\n\tvar topLevel;\r\n\tschema = this.resolveRefs(schema);\r\n\tif (!schema) {\r\n\t\treturn null;\r\n\t} else if (schema instanceof ValidationError) {\r\n\t\tthis.errors.push(schema);\r\n\t\treturn schema;\r\n\t}\r\n\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar frozenIndex, scannedFrozenSchemaIndex = null, scannedSchemasIndex = null;\r\n\tif (this.checkRecursive && data && typeof data === \'object\') {\r\n\t\ttopLevel = !this.scanned.length;\r\n\t\tif (data[this.validatedSchemasKey]) {\r\n\t\t\tvar schemaIndex = data[this.validatedSchemasKey].indexOf(schema);\r\n\t\t\tif (schemaIndex !== -1) {\r\n\t\t\t\tthis.errors = this.errors.concat(data[this.validationErrorsKey][schemaIndex]);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (Object.isFrozen(data)) {\r\n\t\t\tfrozenIndex = this.scannedFrozen.indexOf(data);\r\n\t\t\tif (frozenIndex !== -1) {\r\n\t\t\t\tvar frozenSchemaIndex = this.scannedFrozenSchemas[frozenIndex].indexOf(schema);\r\n\t\t\t\tif (frozenSchemaIndex !== -1) {\r\n\t\t\t\t\tthis.errors = this.errors.concat(this.scannedFrozenValidationErrors[frozenIndex][frozenSchemaIndex]);\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.scanned.push(data);\r\n\t\tif (Object.isFrozen(data)) {\r\n\t\t\tif (frozenIndex === -1) {\r\n\t\t\t\tfrozenIndex = this.scannedFrozen.length;\r\n\t\t\t\tthis.scannedFrozen.push(data);\r\n\t\t\t\tthis.scannedFrozenSchemas.push([]);\r\n\t\t\t}\r\n\t\t\tscannedFrozenSchemaIndex = this.scannedFrozenSchemas[frozenIndex].length;\r\n\t\t\tthis.scannedFrozenSchemas[frozenIndex][scannedFrozenSchemaIndex] = schema;\r\n\t\t\tthis.scannedFrozenValidationErrors[frozenIndex][scannedFrozenSchemaIndex] = [];\r\n\t\t} else {\r\n\t\t\tif (!data[this.validatedSchemasKey]) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tObject.defineProperty(data, this.validatedSchemasKey, {\r\n\t\t\t\t\t\tvalue: [],\r\n\t\t\t\t\t\tconfigurable: true\r\n\t\t\t\t\t});\r\n\t\t\t\t\tObject.defineProperty(data, this.validationErrorsKey, {\r\n\t\t\t\t\t\tvalue: [],\r\n\t\t\t\t\t\tconfigurable: true\r\n\t\t\t\t\t});\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\t//IE 7/8 workaround\r\n\t\t\t\t\tdata[this.validatedSchemasKey] = [];\r\n\t\t\t\t\tdata[this.validationErrorsKey] = [];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tscannedSchemasIndex = data[this.validatedSchemasKey].length;\r\n\t\t\tdata[this.validatedSchemasKey][scannedSchemasIndex] = schema;\r\n\t\t\tdata[this.validationErrorsKey][scannedSchemasIndex] = [];\r\n\t\t}\r\n\t}\r\n\r\n\tvar errorCount = this.errors.length;\r\n\tvar error = this.validateBasic(data, schema, dataPointerPath)\r\n\t\t|| this.validateNumeric(data, schema, dataPointerPath)\r\n\t\t|| this.validateString(data, schema, dataPointerPath)\r\n\t\t|| this.validateArray(data, schema, dataPointerPath)\r\n\t\t|| this.validateObject(data, schema, dataPointerPath)\r\n\t\t|| this.validateCombinations(data, schema, dataPointerPath)\r\n\t\t|| this.validateHypermedia(data, schema, dataPointerPath)\r\n\t\t|| this.validateFormat(data, schema, dataPointerPath)\r\n\t\t|| this.validateDefinedKeywords(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n\r\n\tif (topLevel) {\r\n\t\twhile (this.scanned.length) {\r\n\t\t\tvar item = this.scanned.pop();\r\n\t\t\tdelete item[this.validatedSchemasKey];\r\n\t\t}\r\n\t\tthis.scannedFrozen = [];\r\n\t\tthis.scannedFrozenSchemas = [];\r\n\t}\r\n\r\n\tif (error || errorCount !== this.errors.length) {\r\n\t\twhile ((dataPathParts && dataPathParts.length) || (schemaPathParts && schemaPathParts.length)) {\r\n\t\t\tvar dataPart = (dataPathParts && dataPathParts.length) ? "" + dataPathParts.pop() : null;\r\n\t\t\tvar schemaPart = (schemaPathParts && schemaPathParts.length) ? "" + schemaPathParts.pop() : null;\r\n\t\t\tif (error) {\r\n\t\t\t\terror = error.prefixWith(dataPart, schemaPart);\r\n\t\t\t}\r\n\t\t\tthis.prefixErrors(errorCount, dataPart, schemaPart);\r\n\t\t}\r\n\t}\r\n\r\n\tif (scannedFrozenSchemaIndex !== null) {\r\n\t\tthis.scannedFrozenValidationErrors[frozenIndex][scannedFrozenSchemaIndex] = this.errors.slice(startErrorCount);\r\n\t} else if (scannedSchemasIndex !== null) {\r\n\t\tdata[this.validationErrorsKey][scannedSchemasIndex] = this.errors.slice(startErrorCount);\r\n\t}\r\n\r\n\treturn this.handleError(error);\r\n};\r\nValidatorContext.prototype.validateFormat = function (data, schema) {\r\n\tif (typeof schema.format !== \'string\' || !this.formatValidators[schema.format]) {\r\n\t\treturn null;\r\n\t}\r\n\tvar errorMessage = this.formatValidators[schema.format].call(null, data, schema);\r\n\tif (typeof errorMessage === \'string\' || typeof errorMessage === \'number\') {\r\n\t\treturn this.createError(ErrorCodes.FORMAT_CUSTOM, {message: errorMessage}, \'\', \'/format\', null, data, schema);\r\n\t} else if (errorMessage && typeof errorMessage === \'object\') {\r\n\t\treturn this.createError(ErrorCodes.FORMAT_CUSTOM, {message: errorMessage.message || "?"}, errorMessage.dataPath || \'\', errorMessage.schemaPath || "/format", null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\nValidatorContext.prototype.validateDefinedKeywords = function (data, schema, dataPointerPath) {\r\n\tfor (var key in this.definedKeywords) {\r\n\t\tif (typeof schema[key] === \'undefined\') {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tvar validationFunctions = this.definedKeywords[key];\r\n\t\tfor (var i = 0; i < validationFunctions.length; i++) {\r\n\t\t\tvar func = validationFunctions[i];\r\n\t\t\tvar result = func(data, schema[key], schema, dataPointerPath);\r\n\t\t\tif (typeof result === \'string\' || typeof result === \'number\') {\r\n\t\t\t\treturn this.createError(ErrorCodes.KEYWORD_CUSTOM, {key: key, message: result}, \'\', \'\', null, data, schema).prefixWith(null, key);\r\n\t\t\t} else if (result && typeof result === \'object\') {\r\n\t\t\t\tvar code = result.code;\r\n\t\t\t\tif (typeof code === \'string\') {\r\n\t\t\t\t\tif (!ErrorCodes[code]) {\r\n\t\t\t\t\t\tthrow new Error(\'Undefined error code (use defineError): \' + code);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcode = ErrorCodes[code];\r\n\t\t\t\t} else if (typeof code !== \'number\') {\r\n\t\t\t\t\tcode = ErrorCodes.KEYWORD_CUSTOM;\r\n\t\t\t\t}\r\n\t\t\t\tvar messageParams = (typeof result.message === \'object\') ? result.message : {key: key, message: result.message || "?"};\r\n\t\t\t\tvar schemaPath = result.schemaPath || ("/" + key.replace(/~/g, \'~0\').replace(/\\//g, \'~1\'));\r\n\t\t\t\treturn this.createError(code, messageParams, result.dataPath || null, schemaPath, null, data, schema);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nfunction recursiveCompare(A, B) {\r\n\tif (A === B) {\r\n\t\treturn true;\r\n\t}\r\n\tif (A && B && typeof A === "object" && typeof B === "object") {\r\n\t\tif (Array.isArray(A) !== Array.isArray(B)) {\r\n\t\t\treturn false;\r\n\t\t} else if (Array.isArray(A)) {\r\n\t\t\tif (A.length !== B.length) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor (var i = 0; i < A.length; i++) {\r\n\t\t\t\tif (!recursiveCompare(A[i], B[i])) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvar key;\r\n\t\t\tfor (key in A) {\r\n\t\t\t\tif (B[key] === undefined && A[key] !== undefined) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (key in B) {\r\n\t\t\t\tif (A[key] === undefined && B[key] !== undefined) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (key in A) {\r\n\t\t\t\tif (!recursiveCompare(A[key], B[key])) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nValidatorContext.prototype.validateBasic = function validateBasic(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tif (error = this.validateType(data, schema, dataPointerPath)) {\r\n\t\treturn error.prefixWith(null, "type");\r\n\t}\r\n\tif (error = this.validateEnum(data, schema, dataPointerPath)) {\r\n\t\treturn error.prefixWith(null, "type");\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateType = function validateType(data, schema) {\r\n\tif (schema.type === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar dataType = typeof data;\r\n\tif (data === null) {\r\n\t\tdataType = "null";\r\n\t} else if (Array.isArray(data)) {\r\n\t\tdataType = "array";\r\n\t}\r\n\tvar allowedTypes = schema.type;\r\n\tif (!Array.isArray(allowedTypes)) {\r\n\t\tallowedTypes = [allowedTypes];\r\n\t}\r\n\r\n\tfor (var i = 0; i < allowedTypes.length; i++) {\r\n\t\tvar type = allowedTypes[i];\r\n\t\tif (type === dataType || (type === "integer" && dataType === "number" && (data % 1 === 0))) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\treturn this.createError(ErrorCodes.INVALID_TYPE, {type: dataType, expected: allowedTypes.join("/")}, \'\', \'\', null, data, schema);\r\n};\r\n\r\nValidatorContext.prototype.validateEnum = function validateEnum(data, schema) {\r\n\tif (schema["enum"] === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tfor (var i = 0; i < schema["enum"].length; i++) {\r\n\t\tvar enumVal = schema["enum"][i];\r\n\t\tif (recursiveCompare(data, enumVal)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\treturn this.createError(ErrorCodes.ENUM_MISMATCH, {value: (typeof JSON !== \'undefined\') ? JSON.stringify(data) : data}, \'\', \'\', null, data, schema);\r\n};\r\n\r\nValidatorContext.prototype.validateNumeric = function validateNumeric(data, schema, dataPointerPath) {\r\n\treturn this.validateMultipleOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateMinMax(data, schema, dataPointerPath)\r\n\t\t|| this.validateNaN(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nvar CLOSE_ENOUGH_LOW = Math.pow(2, -51);\r\nvar CLOSE_ENOUGH_HIGH = 1 - CLOSE_ENOUGH_LOW;\r\nValidatorContext.prototype.validateMultipleOf = function validateMultipleOf(data, schema) {\r\n\tvar multipleOf = schema.multipleOf || schema.divisibleBy;\r\n\tif (multipleOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tif (typeof data === "number") {\r\n\t\tvar remainder = (data/multipleOf)%1;\r\n\t\tif (remainder >= CLOSE_ENOUGH_LOW && remainder < CLOSE_ENOUGH_HIGH) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MULTIPLE_OF, {value: data, multipleOf: multipleOf}, \'\', \'\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateMinMax = function validateMinMax(data, schema) {\r\n\tif (typeof data !== "number") {\r\n\t\treturn null;\r\n\t}\r\n\tif (schema.minimum !== undefined) {\r\n\t\tif (data < schema.minimum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MINIMUM, {value: data, minimum: schema.minimum}, \'\', \'/minimum\', null, data, schema);\r\n\t\t}\r\n\t\tif (schema.exclusiveMinimum && data === schema.minimum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MINIMUM_EXCLUSIVE, {value: data, minimum: schema.minimum}, \'\', \'/exclusiveMinimum\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\tif (schema.maximum !== undefined) {\r\n\t\tif (data > schema.maximum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MAXIMUM, {value: data, maximum: schema.maximum}, \'\', \'/maximum\', null, data, schema);\r\n\t\t}\r\n\t\tif (schema.exclusiveMaximum && data === schema.maximum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MAXIMUM_EXCLUSIVE, {value: data, maximum: schema.maximum}, \'\', \'/exclusiveMaximum\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateNaN = function validateNaN(data, schema) {\r\n\tif (typeof data !== "number") {\r\n\t\treturn null;\r\n\t}\r\n\tif (isNaN(data) === true || data === Infinity || data === -Infinity) {\r\n\t\treturn this.createError(ErrorCodes.NUMBER_NOT_A_NUMBER, {value: data}, \'\', \'/type\', null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateString = function validateString(data, schema, dataPointerPath) {\r\n\treturn this.validateStringLength(data, schema, dataPointerPath)\r\n\t\t|| this.validateStringPattern(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateStringLength = function validateStringLength(data, schema) {\r\n\tif (typeof data !== "string") {\r\n\t\treturn null;\r\n\t}\r\n\tif (schema.minLength !== undefined) {\r\n\t\tif (data.length < schema.minLength) {\r\n\t\t\treturn this.createError(ErrorCodes.STRING_LENGTH_SHORT, {length: data.length, minimum: schema.minLength}, \'\', \'/minLength\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\tif (schema.maxLength !== undefined) {\r\n\t\tif (data.length > schema.maxLength) {\r\n\t\t\treturn this.createError(ErrorCodes.STRING_LENGTH_LONG, {length: data.length, maximum: schema.maxLength}, \'\', \'/maxLength\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateStringPattern = function validateStringPattern(data, schema) {\r\n\tif (typeof data !== "string" || (typeof schema.pattern !== "string" && !(schema.pattern instanceof RegExp))) {\r\n\t\treturn null;\r\n\t}\r\n\tvar regexp;\r\n\tif (schema.pattern instanceof RegExp) {\r\n\t regexp = schema.pattern;\r\n\t}\r\n\telse {\r\n\t var body, flags = \'\';\r\n\t // Check for regular expression literals\r\n\t // @see http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.5\r\n\t var literal = schema.pattern.match(/^\\/(.+)\\/([img]*)$/);\r\n\t if (literal) {\r\n\t body = literal[1];\r\n\t flags = literal[2];\r\n\t }\r\n\t else {\r\n\t body = schema.pattern;\r\n\t }\r\n\t regexp = new RegExp(body, flags);\r\n\t}\r\n\tif (!regexp.test(data)) {\r\n\t\treturn this.createError(ErrorCodes.STRING_PATTERN, {pattern: schema.pattern}, \'\', \'/pattern\', null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArray = function validateArray(data, schema, dataPointerPath) {\r\n\tif (!Array.isArray(data)) {\r\n\t\treturn null;\r\n\t}\r\n\treturn this.validateArrayLength(data, schema, dataPointerPath)\r\n\t\t|| this.validateArrayUniqueItems(data, schema, dataPointerPath)\r\n\t\t|| this.validateArrayItems(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayLength = function validateArrayLength(data, schema) {\r\n\tvar error;\r\n\tif (schema.minItems !== undefined) {\r\n\t\tif (data.length < schema.minItems) {\r\n\t\t\terror = this.createError(ErrorCodes.ARRAY_LENGTH_SHORT, {length: data.length, minimum: schema.minItems}, \'\', \'/minItems\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (schema.maxItems !== undefined) {\r\n\t\tif (data.length > schema.maxItems) {\r\n\t\t\terror = this.createError(ErrorCodes.ARRAY_LENGTH_LONG, {length: data.length, maximum: schema.maxItems}, \'\', \'/maxItems\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayUniqueItems = function validateArrayUniqueItems(data, schema) {\r\n\tif (schema.uniqueItems) {\r\n\t\tfor (var i = 0; i < data.length; i++) {\r\n\t\t\tfor (var j = i + 1; j < data.length; j++) {\r\n\t\t\t\tif (recursiveCompare(data[i], data[j])) {\r\n\t\t\t\t\tvar error = this.createError(ErrorCodes.ARRAY_UNIQUE, {match1: i, match2: j}, \'\', \'/uniqueItems\', null, data, schema);\r\n\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayItems = function validateArrayItems(data, schema, dataPointerPath) {\r\n\tif (schema.items === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error, i;\r\n\tif (Array.isArray(schema.items)) {\r\n\t\tfor (i = 0; i < data.length; i++) {\r\n\t\t\tif (i < schema.items.length) {\r\n\t\t\t\tif (error = this.validateAll(data[i], schema.items[i], [i], ["items", i], dataPointerPath + "/" + i)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t} else if (schema.additionalItems !== undefined) {\r\n\t\t\t\tif (typeof schema.additionalItems === "boolean") {\r\n\t\t\t\t\tif (!schema.additionalItems) {\r\n\t\t\t\t\t\terror = (this.createError(ErrorCodes.ARRAY_ADDITIONAL_ITEMS, {}, \'/\' + i, \'/additionalItems\', null, data, schema));\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (error = this.validateAll(data[i], schema.additionalItems, [i], ["additionalItems"], dataPointerPath + "/" + i)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tfor (i = 0; i < data.length; i++) {\r\n\t\t\tif (error = this.validateAll(data[i], schema.items, [i], ["items"], dataPointerPath + "/" + i)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObject = function validateObject(data, schema, dataPointerPath) {\r\n\tif (typeof data !== "object" || data === null || Array.isArray(data)) {\r\n\t\treturn null;\r\n\t}\r\n\treturn this.validateObjectMinMaxProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectRequiredProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectDependencies(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectMinMaxProperties = function validateObjectMinMaxProperties(data, schema) {\r\n\tvar keys = Object.keys(data);\r\n\tvar error;\r\n\tif (schema.minProperties !== undefined) {\r\n\t\tif (keys.length < schema.minProperties) {\r\n\t\t\terror = this.createError(ErrorCodes.OBJECT_PROPERTIES_MINIMUM, {propertyCount: keys.length, minimum: schema.minProperties}, \'\', \'/minProperties\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (schema.maxProperties !== undefined) {\r\n\t\tif (keys.length > schema.maxProperties) {\r\n\t\t\terror = this.createError(ErrorCodes.OBJECT_PROPERTIES_MAXIMUM, {propertyCount: keys.length, maximum: schema.maxProperties}, \'\', \'/maxProperties\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectRequiredProperties = function validateObjectRequiredProperties(data, schema) {\r\n\tif (schema.required !== undefined) {\r\n\t\tfor (var i = 0; i < schema.required.length; i++) {\r\n\t\t\tvar key = schema.required[i];\r\n\t\t\tif (data[key] === undefined) {\r\n\t\t\t\tvar error = this.createError(ErrorCodes.OBJECT_REQUIRED, {key: key}, \'\', \'/required/\' + i, null, data, schema);\r\n\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectProperties = function validateObjectProperties(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tfor (var key in data) {\r\n\t\tvar keyPointerPath = dataPointerPath + "/" + key.replace(/~/g, \'~0\').replace(/\\//g, \'~1\');\r\n\t\tvar foundMatch = false;\r\n\t\tif (schema.properties !== undefined && schema.properties[key] !== undefined) {\r\n\t\t\tfoundMatch = true;\r\n\t\t\tif (error = this.validateAll(data[key], schema.properties[key], [key], ["properties", key], keyPointerPath)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (schema.patternProperties !== undefined) {\r\n\t\t\tfor (var patternKey in schema.patternProperties) {\r\n\t\t\t\tvar regexp = new RegExp(patternKey);\r\n\t\t\t\tif (regexp.test(key)) {\r\n\t\t\t\t\tfoundMatch = true;\r\n\t\t\t\t\tif (error = this.validateAll(data[key], schema.patternProperties[patternKey], [key], ["patternProperties", patternKey], keyPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!foundMatch) {\r\n\t\t\tif (schema.additionalProperties !== undefined) {\r\n\t\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\t\tthis.knownPropertyPaths[keyPointerPath] = true;\r\n\t\t\t\t\tdelete this.unknownPropertyPaths[keyPointerPath];\r\n\t\t\t\t}\r\n\t\t\t\tif (typeof schema.additionalProperties === "boolean") {\r\n\t\t\t\t\tif (!schema.additionalProperties) {\r\n\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_ADDITIONAL_PROPERTIES, {key: key}, \'\', \'/additionalProperties\', null, data, schema).prefixWith(key, null);\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (error = this.validateAll(data[key], schema.additionalProperties, [key], ["additionalProperties"], keyPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (this.trackUnknownProperties && !this.knownPropertyPaths[keyPointerPath]) {\r\n\t\t\t\tthis.unknownPropertyPaths[keyPointerPath] = true;\r\n\t\t\t}\r\n\t\t} else if (this.trackUnknownProperties) {\r\n\t\t\tthis.knownPropertyPaths[keyPointerPath] = true;\r\n\t\t\tdelete this.unknownPropertyPaths[keyPointerPath];\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectDependencies = function validateObjectDependencies(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tif (schema.dependencies !== undefined) {\r\n\t\tfor (var depKey in schema.dependencies) {\r\n\t\t\tif (data[depKey] !== undefined) {\r\n\t\t\t\tvar dep = schema.dependencies[depKey];\r\n\t\t\t\tif (typeof dep === "string") {\r\n\t\t\t\t\tif (data[dep] === undefined) {\r\n\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_DEPENDENCY_KEY, {key: depKey, missing: dep}, \'\', \'\', null, data, schema).prefixWith(null, depKey).prefixWith(null, "dependencies");\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (Array.isArray(dep)) {\r\n\t\t\t\t\tfor (var i = 0; i < dep.length; i++) {\r\n\t\t\t\t\t\tvar requiredKey = dep[i];\r\n\t\t\t\t\t\tif (data[requiredKey] === undefined) {\r\n\t\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_DEPENDENCY_KEY, {key: depKey, missing: requiredKey}, \'\', \'/\' + i, null, data, schema).prefixWith(null, depKey).prefixWith(null, "dependencies");\r\n\t\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (error = this.validateAll(data, dep, [], ["dependencies", depKey], dataPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateCombinations = function validateCombinations(data, schema, dataPointerPath) {\r\n\treturn this.validateAllOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateAnyOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateOneOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateNot(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateAllOf = function validateAllOf(data, schema, dataPointerPath) {\r\n\tif (schema.allOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error;\r\n\tfor (var i = 0; i < schema.allOf.length; i++) {\r\n\t\tvar subSchema = schema.allOf[i];\r\n\t\tif (error = this.validateAll(data, subSchema, [], ["allOf", i], dataPointerPath)) {\r\n\t\t\treturn error;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateAnyOf = function validateAnyOf(data, schema, dataPointerPath) {\r\n\tif (schema.anyOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar errors = [];\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t}\r\n\tvar errorAtEnd = true;\r\n\tfor (var i = 0; i < schema.anyOf.length; i++) {\r\n\t\tif (this.trackUnknownProperties) {\r\n\t\t\tthis.unknownPropertyPaths = {};\r\n\t\t\tthis.knownPropertyPaths = {};\r\n\t\t}\r\n\t\tvar subSchema = schema.anyOf[i];\r\n\r\n\t\tvar errorCount = this.errors.length;\r\n\t\tvar error = this.validateAll(data, subSchema, [], ["anyOf", i], dataPointerPath);\r\n\r\n\t\tif (error === null && errorCount === this.errors.length) {\r\n\t\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\r\n\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\tfor (var knownKey in this.knownPropertyPaths) {\r\n\t\t\t\t\toldKnownPropertyPaths[knownKey] = true;\r\n\t\t\t\t\tdelete oldUnknownPropertyPaths[knownKey];\r\n\t\t\t\t}\r\n\t\t\t\tfor (var unknownKey in this.unknownPropertyPaths) {\r\n\t\t\t\t\tif (!oldKnownPropertyPaths[unknownKey]) {\r\n\t\t\t\t\t\toldUnknownPropertyPaths[unknownKey] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// We need to continue looping so we catch all the property definitions, but we don\'t want to return an error\r\n\t\t\t\terrorAtEnd = false;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tif (error) {\r\n\t\t\terrors.push(error.prefixWith(null, "" + i).prefixWith(null, "anyOf"));\r\n\t\t}\r\n\t}\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (errorAtEnd) {\r\n\t\terrors = errors.concat(this.errors.slice(startErrorCount));\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\treturn this.createError(ErrorCodes.ANY_OF_MISSING, {}, "", "/anyOf", errors, data, schema);\r\n\t}\r\n};\r\n\r\nValidatorContext.prototype.validateOneOf = function validateOneOf(data, schema, dataPointerPath) {\r\n\tif (schema.oneOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar validIndex = null;\r\n\tvar errors = [];\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t}\r\n\tfor (var i = 0; i < schema.oneOf.length; i++) {\r\n\t\tif (this.trackUnknownProperties) {\r\n\t\t\tthis.unknownPropertyPaths = {};\r\n\t\t\tthis.knownPropertyPaths = {};\r\n\t\t}\r\n\t\tvar subSchema = schema.oneOf[i];\r\n\r\n\t\tvar errorCount = this.errors.length;\r\n\t\tvar error = this.validateAll(data, subSchema, [], ["oneOf", i], dataPointerPath);\r\n\r\n\t\tif (error === null && errorCount === this.errors.length) {\r\n\t\t\tif (validIndex === null) {\r\n\t\t\t\tvalidIndex = i;\r\n\t\t\t} else {\r\n\t\t\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\t\t\treturn this.createError(ErrorCodes.ONE_OF_MULTIPLE, {index1: validIndex, index2: i}, "", "/oneOf", null, data, schema);\r\n\t\t\t}\r\n\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\tfor (var knownKey in this.knownPropertyPaths) {\r\n\t\t\t\t\toldKnownPropertyPaths[knownKey] = true;\r\n\t\t\t\t\tdelete oldUnknownPropertyPaths[knownKey];\r\n\t\t\t\t}\r\n\t\t\t\tfor (var unknownKey in this.unknownPropertyPaths) {\r\n\t\t\t\t\tif (!oldKnownPropertyPaths[unknownKey]) {\r\n\t\t\t\t\t\toldUnknownPropertyPaths[unknownKey] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (error) {\r\n\t\t\terrors.push(error);\r\n\t\t}\r\n\t}\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (validIndex === null) {\r\n\t\terrors = errors.concat(this.errors.slice(startErrorCount));\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\treturn this.createError(ErrorCodes.ONE_OF_MISSING, {}, "", "/oneOf", errors, data, schema);\r\n\t} else {\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateNot = function validateNot(data, schema, dataPointerPath) {\r\n\tif (schema.not === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar oldErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t\tthis.unknownPropertyPaths = {};\r\n\t\tthis.knownPropertyPaths = {};\r\n\t}\r\n\tvar error = this.validateAll(data, schema.not, null, null, dataPointerPath);\r\n\tvar notErrors = this.errors.slice(oldErrorCount);\r\n\tthis.errors = this.errors.slice(0, oldErrorCount);\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (error === null && notErrors.length === 0) {\r\n\t\treturn this.createError(ErrorCodes.NOT_PASSED, {}, "", "/not", null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateHypermedia = function validateCombinations(data, schema, dataPointerPath) {\r\n\tif (!schema.links) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error;\r\n\tfor (var i = 0; i < schema.links.length; i++) {\r\n\t\tvar ldo = schema.links[i];\r\n\t\tif (ldo.rel === "describedby") {\r\n\t\t\tvar template = new UriTemplate(ldo.href);\r\n\t\t\tvar allPresent = true;\r\n\t\t\tfor (var j = 0; j < template.varNames.length; j++) {\r\n\t\t\t\tif (!(template.varNames[j] in data)) {\r\n\t\t\t\t\tallPresent = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (allPresent) {\r\n\t\t\t\tvar schemaUrl = template.fillFromObject(data);\r\n\t\t\t\tvar subSchema = {"$ref": schemaUrl};\r\n\t\t\t\tif (error = this.validateAll(data, subSchema, [], ["links", i], dataPointerPath)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// parseURI() and resolveUrl() are from https://gist.github.com/1088850\r\n// - released as public domain by author ("Yaffle") - see comments on gist\r\n\r\nfunction parseURI(url) {\r\n\tvar m = String(url).replace(/^\\s+|\\s+$/g, \'\').match(/^([^:\\/?#]+:)?(\\/\\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\\/?#]*)(?::(\\d*))?))?([^?#]*)(\\?[^#]*)?(#[\\s\\S]*)?/);\r\n\t// authority = \'//\' + user + \':\' + pass \'@\' + hostname + \':\' port\r\n\treturn (m ? {\r\n\t\thref : m[0] || \'\',\r\n\t\tprotocol : m[1] || \'\',\r\n\t\tauthority: m[2] || \'\',\r\n\t\thost : m[3] || \'\',\r\n\t\thostname : m[4] || \'\',\r\n\t\tport : m[5] || \'\',\r\n\t\tpathname : m[6] || \'\',\r\n\t\tsearch : m[7] || \'\',\r\n\t\thash : m[8] || \'\'\r\n\t} : null);\r\n}\r\n\r\nfunction resolveUrl(base, href) {// RFC 3986\r\n\r\n\tfunction removeDotSegments(input) {\r\n\t\tvar output = [];\r\n\t\tinput.replace(/^(\\.\\.?(\\/|$))+/, \'\')\r\n\t\t\t.replace(/\\/(\\.(\\/|$))+/g, \'/\')\r\n\t\t\t.replace(/\\/\\.\\.$/, \'/../\')\r\n\t\t\t.replace(/\\/?[^\\/]*/g, function (p) {\r\n\t\t\t\tif (p === \'/..\') {\r\n\t\t\t\t\toutput.pop();\r\n\t\t\t\t} else {\r\n\t\t\t\t\toutput.push(p);\r\n\t\t\t\t}\r\n\t\t});\r\n\t\treturn output.join(\'\').replace(/^\\//, input.charAt(0) === \'/\' ? \'/\' : \'\');\r\n\t}\r\n\r\n\thref = parseURI(href || \'\');\r\n\tbase = parseURI(base || \'\');\r\n\r\n\treturn !href || !base ? null : (href.protocol || base.protocol) +\r\n\t\t(href.protocol || href.authority ? href.authority : base.authority) +\r\n\t\tremoveDotSegments(href.protocol || href.authority || href.pathname.charAt(0) === \'/\' ? href.pathname : (href.pathname ? ((base.authority && !base.pathname ? \'/\' : \'\') + base.pathname.slice(0, base.pathname.lastIndexOf(\'/\') + 1) + href.pathname) : base.pathname)) +\r\n\t\t(href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) +\r\n\t\thref.hash;\r\n}\r\n\r\nfunction getDocumentUri(uri) {\r\n\treturn uri.split(\'#\')[0];\r\n}\r\nfunction normSchema(schema, baseUri) {\r\n\tif (schema && typeof schema === "object") {\r\n\t\tif (baseUri === undefined) {\r\n\t\t\tbaseUri = schema.id;\r\n\t\t} else if (typeof schema.id === "string") {\r\n\t\t\tbaseUri = resolveUrl(baseUri, schema.id);\r\n\t\t\tschema.id = baseUri;\r\n\t\t}\r\n\t\tif (Array.isArray(schema)) {\r\n\t\t\tfor (var i = 0; i < schema.length; i++) {\r\n\t\t\t\tnormSchema(schema[i], baseUri);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (typeof schema[\'$ref\'] === "string") {\r\n\t\t\t\tschema[\'$ref\'] = resolveUrl(baseUri, schema[\'$ref\']);\r\n\t\t\t}\r\n\t\t\tfor (var key in schema) {\r\n\t\t\t\tif (key !== "enum") {\r\n\t\t\t\t\tnormSchema(schema[key], baseUri);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction defaultErrorReporter(language) {\r\n\tlanguage = language || \'en\';\r\n\r\n\tvar errorMessages = languages[language];\r\n\r\n\treturn function (error) {\r\n\t\tvar messageTemplate = errorMessages[error.code] || ErrorMessagesDefault[error.code];\r\n\t\tif (typeof messageTemplate !== \'string\') {\r\n\t\t\treturn "Unknown error code " + error.code + ": " + JSON.stringify(error.messageParams);\r\n\t\t}\r\n\t\tvar messageParams = error.params;\r\n\t\t// Adapted from Crockford\'s supplant()\r\n\t\treturn messageTemplate.replace(/\\{([^{}]*)\\}/g, function (whole, varName) {\r\n\t\t\tvar subValue = messageParams[varName];\r\n\t\t\treturn typeof subValue === \'string\' || typeof subValue === \'number\' ? subValue : whole;\r\n\t\t});\r\n\t};\r\n}\r\n\r\nvar ErrorCodes = {\r\n\tINVALID_TYPE: 0,\r\n\tENUM_MISMATCH: 1,\r\n\tANY_OF_MISSING: 10,\r\n\tONE_OF_MISSING: 11,\r\n\tONE_OF_MULTIPLE: 12,\r\n\tNOT_PASSED: 13,\r\n\t// Numeric errors\r\n\tNUMBER_MULTIPLE_OF: 100,\r\n\tNUMBER_MINIMUM: 101,\r\n\tNUMBER_MINIMUM_EXCLUSIVE: 102,\r\n\tNUMBER_MAXIMUM: 103,\r\n\tNUMBER_MAXIMUM_EXCLUSIVE: 104,\r\n\tNUMBER_NOT_A_NUMBER: 105,\r\n\t// String errors\r\n\tSTRING_LENGTH_SHORT: 200,\r\n\tSTRING_LENGTH_LONG: 201,\r\n\tSTRING_PATTERN: 202,\r\n\t// Object errors\r\n\tOBJECT_PROPERTIES_MINIMUM: 300,\r\n\tOBJECT_PROPERTIES_MAXIMUM: 301,\r\n\tOBJECT_REQUIRED: 302,\r\n\tOBJECT_ADDITIONAL_PROPERTIES: 303,\r\n\tOBJECT_DEPENDENCY_KEY: 304,\r\n\t// Array errors\r\n\tARRAY_LENGTH_SHORT: 400,\r\n\tARRAY_LENGTH_LONG: 401,\r\n\tARRAY_UNIQUE: 402,\r\n\tARRAY_ADDITIONAL_ITEMS: 403,\r\n\t// Custom/user-defined errors\r\n\tFORMAT_CUSTOM: 500,\r\n\tKEYWORD_CUSTOM: 501,\r\n\t// Schema structure\r\n\tCIRCULAR_REFERENCE: 600,\r\n\t// Non-standard validation options\r\n\tUNKNOWN_PROPERTY: 1000\r\n};\r\nvar ErrorCodeLookup = {};\r\nfor (var key in ErrorCodes) {\r\n\tErrorCodeLookup[ErrorCodes[key]] = key;\r\n}\r\nvar ErrorMessagesDefault = {\r\n\tINVALID_TYPE: "Invalid type: {type} (expected {expected})",\r\n\tENUM_MISMATCH: "No enum match for: {value}",\r\n\tANY_OF_MISSING: "Data does not match any schemas from \\"anyOf\\"",\r\n\tONE_OF_MISSING: "Data does not match any schemas from \\"oneOf\\"",\r\n\tONE_OF_MULTIPLE: "Data is valid against more than one schema from \\"oneOf\\": indices {index1} and {index2}",\r\n\tNOT_PASSED: "Data matches schema from \\"not\\"",\r\n\t// Numeric errors\r\n\tNUMBER_MULTIPLE_OF: "Value {value} is not a multiple of {multipleOf}",\r\n\tNUMBER_MINIMUM: "Value {value} is less than minimum {minimum}",\r\n\tNUMBER_MINIMUM_EXCLUSIVE: "Value {value} is equal to exclusive minimum {minimum}",\r\n\tNUMBER_MAXIMUM: "Value {value} is greater than maximum {maximum}",\r\n\tNUMBER_MAXIMUM_EXCLUSIVE: "Value {value} is equal to exclusive maximum {maximum}",\r\n\tNUMBER_NOT_A_NUMBER: "Value {value} is not a valid number",\r\n\t// String errors\r\n\tSTRING_LENGTH_SHORT: "String is too short ({length} chars), minimum {minimum}",\r\n\tSTRING_LENGTH_LONG: "String is too long ({length} chars), maximum {maximum}",\r\n\tSTRING_PATTERN: "String does not match pattern: {pattern}",\r\n\t// Object errors\r\n\tOBJECT_PROPERTIES_MINIMUM: "Too few properties defined ({propertyCount}), minimum {minimum}",\r\n\tOBJECT_PROPERTIES_MAXIMUM: "Too many properties defined ({propertyCount}), maximum {maximum}",\r\n\tOBJECT_REQUIRED: "Missing required property: {key}",\r\n\tOBJECT_ADDITIONAL_PROPERTIES: "Additional properties not allowed",\r\n\tOBJECT_DEPENDENCY_KEY: "Dependency failed - key must exist: {missing} (due to key: {key})",\r\n\t// Array errors\r\n\tARRAY_LENGTH_SHORT: "Array is too short ({length}), minimum {minimum}",\r\n\tARRAY_LENGTH_LONG: "Array is too long ({length}), maximum {maximum}",\r\n\tARRAY_UNIQUE: "Array items are not unique (indices {match1} and {match2})",\r\n\tARRAY_ADDITIONAL_ITEMS: "Additional items not allowed",\r\n\t// Format errors\r\n\tFORMAT_CUSTOM: "Format validation failed ({message})",\r\n\tKEYWORD_CUSTOM: "Keyword failed: {key} ({message})",\r\n\t// Schema structure\r\n\tCIRCULAR_REFERENCE: "Circular $refs: {urls}",\r\n\t// Non-standard validation options\r\n\tUNKNOWN_PROPERTY: "Unknown property (not in schema)"\r\n};\r\n\r\nfunction ValidationError(code, params, dataPath, schemaPath, subErrors) {\r\n\tError.call(this);\r\n\tif (code === undefined) {\r\n\t\tthrow new Error ("No error code supplied: " + schemaPath);\r\n\t}\r\n\tthis.message = \'\';\r\n\tthis.params = params;\r\n\tthis.code = code;\r\n\tthis.dataPath = dataPath || "";\r\n\tthis.schemaPath = schemaPath || "";\r\n\tthis.subErrors = subErrors || null;\r\n\r\n\tvar err = new Error(this.message);\r\n\tthis.stack = err.stack || err.stacktrace;\r\n\tif (!this.stack) {\r\n\t\ttry {\r\n\t\t\tthrow err;\r\n\t\t}\r\n\t\tcatch(err) {\r\n\t\t\tthis.stack = err.stack || err.stacktrace;\r\n\t\t}\r\n\t}\r\n}\r\nValidationError.prototype = Object.create(Error.prototype);\r\nValidationError.prototype.constructor = ValidationError;\r\nValidationError.prototype.name = \'ValidationError\';\r\n\r\nValidationError.prototype.prefixWith = function (dataPrefix, schemaPrefix) {\r\n\tif (dataPrefix !== null) {\r\n\t\tdataPrefix = dataPrefix.replace(/~/g, "~0").replace(/\\//g, "~1");\r\n\t\tthis.dataPath = "/" + dataPrefix + this.dataPath;\r\n\t}\r\n\tif (schemaPrefix !== null) {\r\n\t\tschemaPrefix = schemaPrefix.replace(/~/g, "~0").replace(/\\//g, "~1");\r\n\t\tthis.schemaPath = "/" + schemaPrefix + this.schemaPath;\r\n\t}\r\n\tif (this.subErrors !== null) {\r\n\t\tfor (var i = 0; i < this.subErrors.length; i++) {\r\n\t\t\tthis.subErrors[i].prefixWith(dataPrefix, schemaPrefix);\r\n\t\t}\r\n\t}\r\n\treturn this;\r\n};\r\n\r\nfunction isTrustedUrl(baseUrl, testUrl) {\r\n\tif(testUrl.substring(0, baseUrl.length) === baseUrl){\r\n\t\tvar remainder = testUrl.substring(baseUrl.length);\r\n\t\tif ((testUrl.length > 0 && testUrl.charAt(baseUrl.length - 1) === "/")\r\n\t\t\t|| remainder.charAt(0) === "#"\r\n\t\t\t|| remainder.charAt(0) === "?") {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nvar languages = {};\r\nfunction createApi(language) {\r\n\tvar globalContext = new ValidatorContext();\r\n\tvar currentLanguage;\r\n\tvar customErrorReporter;\r\n\tvar api = {\r\n\t\tsetErrorReporter: function (reporter) {\r\n\t\t\tif (typeof reporter === \'string\') {\r\n\t\t\t\treturn this.language(reporter);\r\n\t\t\t}\r\n\t\t\tcustomErrorReporter = reporter;\r\n\t\t\treturn true;\r\n\t\t},\r\n\t\taddFormat: function () {\r\n\t\t\tglobalContext.addFormat.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tlanguage: function (code) {\r\n\t\t\tif (!code) {\r\n\t\t\t\treturn currentLanguage;\r\n\t\t\t}\r\n\t\t\tif (!languages[code]) {\r\n\t\t\t\tcode = code.split(\'-\')[0]; // fall back to base language\r\n\t\t\t}\r\n\t\t\tif (languages[code]) {\r\n\t\t\t\tcurrentLanguage = code;\r\n\t\t\t\treturn code; // so you can tell if fall-back has happened\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t},\r\n\t\taddLanguage: function (code, messageMap) {\r\n\t\t\tvar key;\r\n\t\t\tfor (key in ErrorCodes) {\r\n\t\t\t\tif (messageMap[key] && !messageMap[ErrorCodes[key]]) {\r\n\t\t\t\t\tmessageMap[ErrorCodes[key]] = messageMap[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar rootCode = code.split(\'-\')[0];\r\n\t\t\tif (!languages[rootCode]) { // use for base language if not yet defined\r\n\t\t\t\tlanguages[code] = messageMap;\r\n\t\t\t\tlanguages[rootCode] = messageMap;\r\n\t\t\t} else {\r\n\t\t\t\tlanguages[code] = Object.create(languages[rootCode]);\r\n\t\t\t\tfor (key in messageMap) {\r\n\t\t\t\t\tif (typeof languages[rootCode][key] === \'undefined\') {\r\n\t\t\t\t\t\tlanguages[rootCode][key] = messageMap[key];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlanguages[code][key] = messageMap[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t},\r\n\t\tfreshApi: function (language) {\r\n\t\t\tvar result = createApi();\r\n\t\t\tif (language) {\r\n\t\t\t\tresult.language(language);\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\tvalidate: function (data, schema, checkRecursive, banUnknownProperties) {\r\n\t\t\tvar def = defaultErrorReporter(currentLanguage);\r\n\t\t\tvar errorReporter = customErrorReporter ? function (error, data, schema) {\r\n\t\t\t\treturn customErrorReporter(error, data, schema) || def(error, data, schema);\r\n\t\t\t} : def;\r\n\t\t\tvar context = new ValidatorContext(globalContext, false, errorReporter, checkRecursive, banUnknownProperties);\r\n\t\t\tif (typeof schema === "string") {\r\n\t\t\t\tschema = {"$ref": schema};\r\n\t\t\t}\r\n\t\t\tcontext.addSchema("", schema);\r\n\t\t\tvar error = context.validateAll(data, schema, null, null, "");\r\n\t\t\tif (!error && banUnknownProperties) {\r\n\t\t\t\terror = context.banUnknownProperties(data, schema);\r\n\t\t\t}\r\n\t\t\tthis.error = error;\r\n\t\t\tthis.missing = context.missing;\r\n\t\t\tthis.valid = (error === null);\r\n\t\t\treturn this.valid;\r\n\t\t},\r\n\t\tvalidateResult: function () {\r\n\t\t\tvar result = {toString: function () {\r\n\t\t\t\treturn this.valid ? \'valid\' : this.error.message;\r\n\t\t\t}};\r\n\t\t\tthis.validate.apply(result, arguments);\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\tvalidateMultiple: function (data, schema, checkRecursive, banUnknownProperties) {\r\n\t\t\tvar def = defaultErrorReporter(currentLanguage);\r\n\t\t\tvar errorReporter = customErrorReporter ? function (error, data, schema) {\r\n\t\t\t\treturn customErrorReporter(error, data, schema) || def(error, data, schema);\r\n\t\t\t} : def;\r\n\t\t\tvar context = new ValidatorContext(globalContext, true, errorReporter, checkRecursive, banUnknownProperties);\r\n\t\t\tif (typeof schema === "string") {\r\n\t\t\t\tschema = {"$ref": schema};\r\n\t\t\t}\r\n\t\t\tcontext.addSchema("", schema);\r\n\t\t\tcontext.validateAll(data, schema, null, null, "");\r\n\t\t\tif (banUnknownProperties) {\r\n\t\t\t\tcontext.banUnknownProperties(data, schema);\r\n\t\t\t}\r\n\t\t\tvar result = {toString: function () {\r\n\t\t\t\treturn this.valid ? \'valid\' : this.error.message;\r\n\t\t\t}};\r\n\t\t\tresult.errors = context.errors;\r\n\t\t\tresult.missing = context.missing;\r\n\t\t\tresult.valid = (result.errors.length === 0);\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\taddSchema: function () {\r\n\t\t\treturn globalContext.addSchema.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchema: function () {\r\n\t\t\treturn globalContext.getSchema.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchemaMap: function () {\r\n\t\t\treturn globalContext.getSchemaMap.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchemaUris: function () {\r\n\t\t\treturn globalContext.getSchemaUris.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetMissingUris: function () {\r\n\t\t\treturn globalContext.getMissingUris.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdropSchemas: function () {\r\n\t\t\tglobalContext.dropSchemas.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdefineKeyword: function () {\r\n\t\t\tglobalContext.defineKeyword.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdefineError: function (codeName, codeNumber, defaultMessage) {\r\n\t\t\tif (typeof codeName !== \'string\' || !/^[A-Z]+(_[A-Z]+)*$/.test(codeName)) {\r\n\t\t\t\tthrow new Error(\'Code name must be a string in UPPER_CASE_WITH_UNDERSCORES\');\r\n\t\t\t}\r\n\t\t\tif (typeof codeNumber !== \'number\' || codeNumber%1 !== 0 || codeNumber < 10000) {\r\n\t\t\t\tthrow new Error(\'Code number must be an integer > 10000\');\r\n\t\t\t}\r\n\t\t\tif (typeof ErrorCodes[codeName] !== \'undefined\') {\r\n\t\t\t\tthrow new Error(\'Error already defined: \' + codeName + \' as \' + ErrorCodes[codeName]);\r\n\t\t\t}\r\n\t\t\tif (typeof ErrorCodeLookup[codeNumber] !== \'undefined\') {\r\n\t\t\t\tthrow new Error(\'Error code already used: \' + ErrorCodeLookup[codeNumber] + \' as \' + codeNumber);\r\n\t\t\t}\r\n\t\t\tErrorCodes[codeName] = codeNumber;\r\n\t\t\tErrorCodeLookup[codeNumber] = codeName;\r\n\t\t\tErrorMessagesDefault[codeName] = ErrorMessagesDefault[codeNumber] = defaultMessage;\r\n\t\t\tfor (var langCode in languages) {\r\n\t\t\t\tvar language = languages[langCode];\r\n\t\t\t\tif (language[codeName]) {\r\n\t\t\t\t\tlanguage[codeNumber] = language[codeNumber] || language[codeName];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\treset: function () {\r\n\t\t\tglobalContext.reset();\r\n\t\t\tthis.error = null;\r\n\t\t\tthis.missing = [];\r\n\t\t\tthis.valid = true;\r\n\t\t},\r\n\t\tmissing: [],\r\n\t\terror: null,\r\n\t\tvalid: true,\r\n\t\tnormSchema: normSchema,\r\n\t\tresolveUrl: resolveUrl,\r\n\t\tgetDocumentUri: getDocumentUri,\r\n\t\terrorCodes: ErrorCodes\r\n\t};\r\n\tapi.language(language || \'en\');\r\n\treturn api;\r\n}\r\n\r\nvar tv4 = createApi();\r\ntv4.addLanguage(\'en-gb\', ErrorMessagesDefault);\r\n\r\n//legacy property\r\ntv4.tv4 = tv4;\r\n\r\nreturn tv4; // used by _header.js to globalise.\r\n\r\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvdHY0L3R2NC5qcz84ZTUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbkF1dGhvcjogR2VyYWludCBMdWZmIGFuZCBvdGhlcnNcclxuWWVhcjogMjAxM1xyXG5cclxuVGhpcyBjb2RlIGlzIHJlbGVhc2VkIGludG8gdGhlIFwicHVibGljIGRvbWFpblwiIGJ5IGl0cyBhdXRob3IocykuICBBbnlib2R5IG1heSB1c2UsIGFsdGVyIGFuZCBkaXN0cmlidXRlIHRoZSBjb2RlIHdpdGhvdXQgcmVzdHJpY3Rpb24uICBUaGUgYXV0aG9yIG1ha2VzIG5vIGd1YXJhbnRlZXMsIGFuZCB0YWtlcyBubyBsaWFiaWxpdHkgb2YgYW55IGtpbmQgZm9yIHVzZSBvZiB0aGlzIGNvZGUuXHJcblxyXG5JZiB5b3UgZmluZCBhIGJ1ZyBvciBtYWtlIGFuIGltcHJvdmVtZW50LCBpdCB3b3VsZCBiZSBjb3VydGVvdXMgdG8gbGV0IHRoZSBhdXRob3Iga25vdywgYnV0IGl0IGlzIG5vdCBjb21wdWxzb3J5LlxyXG4qL1xyXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xyXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcclxuICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cclxuICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XHJcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cyl7XHJcbiAgICAvLyBDb21tb25KUy4gRGVmaW5lIGV4cG9ydC5cclxuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBCcm93c2VyIGdsb2JhbHNcclxuICAgIGdsb2JhbC50djQgPSBmYWN0b3J5KCk7XHJcbiAgfVxyXG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcclxuXHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9rZXlzP3JlZGlyZWN0bG9jYWxlPWVuLVVTJnJlZGlyZWN0c2x1Zz1KYXZhU2NyaXB0JTJGUmVmZXJlbmNlJTJGR2xvYmFsX09iamVjdHMlMkZPYmplY3QlMkZrZXlzXHJcbmlmICghT2JqZWN0LmtleXMpIHtcclxuXHRPYmplY3Qua2V5cyA9IChmdW5jdGlvbiAoKSB7XHJcblx0XHR2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxyXG5cdFx0XHRoYXNEb250RW51bUJ1ZyA9ICEoe3RvU3RyaW5nOiBudWxsfSkucHJvcGVydHlJc0VudW1lcmFibGUoJ3RvU3RyaW5nJyksXHJcblx0XHRcdGRvbnRFbnVtcyA9IFtcclxuXHRcdFx0XHQndG9TdHJpbmcnLFxyXG5cdFx0XHRcdCd0b0xvY2FsZVN0cmluZycsXHJcblx0XHRcdFx0J3ZhbHVlT2YnLFxyXG5cdFx0XHRcdCdoYXNPd25Qcm9wZXJ0eScsXHJcblx0XHRcdFx0J2lzUHJvdG90eXBlT2YnLFxyXG5cdFx0XHRcdCdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXHJcblx0XHRcdFx0J2NvbnN0cnVjdG9yJ1xyXG5cdFx0XHRdLFxyXG5cdFx0XHRkb250RW51bXNMZW5ndGggPSBkb250RW51bXMubGVuZ3RoO1xyXG5cclxuXHRcdHJldHVybiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nIHx8IG9iaiA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBub24tb2JqZWN0Jyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHJcblx0XHRcdGZvciAodmFyIHByb3AgaW4gb2JqKSB7XHJcblx0XHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkge1xyXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2gocHJvcCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoaGFzRG9udEVudW1CdWcpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpPTA7IGkgPCBkb250RW51bXNMZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBkb250RW51bXNbaV0pKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGRvbnRFbnVtc1tpXSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9O1xyXG5cdH0pKCk7XHJcbn1cclxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2NyZWF0ZVxyXG5pZiAoIU9iamVjdC5jcmVhdGUpIHtcclxuXHRPYmplY3QuY3JlYXRlID0gKGZ1bmN0aW9uKCl7XHJcblx0XHRmdW5jdGlvbiBGKCl7fVxyXG5cclxuXHRcdHJldHVybiBmdW5jdGlvbihvKXtcclxuXHRcdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDEpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ09iamVjdC5jcmVhdGUgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG9uZSBwYXJhbWV0ZXIuJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ri5wcm90b3R5cGUgPSBvO1xyXG5cdFx0XHRyZXR1cm4gbmV3IEYoKTtcclxuXHRcdH07XHJcblx0fSkoKTtcclxufVxyXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5P3JlZGlyZWN0bG9jYWxlPWVuLVVTJnJlZGlyZWN0c2x1Zz1KYXZhU2NyaXB0JTJGUmVmZXJlbmNlJTJGR2xvYmFsX09iamVjdHMlMkZBcnJheSUyRmlzQXJyYXlcclxuaWYoIUFycmF5LmlzQXJyYXkpIHtcclxuXHRBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gKHZBcmcpIHtcclxuXHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodkFyZykgPT09IFwiW29iamVjdCBBcnJheV1cIjtcclxuXHR9O1xyXG59XHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2luZGV4T2Y/cmVkaXJlY3Rsb2NhbGU9ZW4tVVMmcmVkaXJlY3RzbHVnPUphdmFTY3JpcHQlMkZSZWZlcmVuY2UlMkZHbG9iYWxfT2JqZWN0cyUyRkFycmF5JTJGaW5kZXhPZlxyXG5pZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XHJcblx0QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ICovICkge1xyXG5cdFx0aWYgKHRoaXMgPT09IG51bGwpIHtcclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcigpO1xyXG5cdFx0fVxyXG5cdFx0dmFyIHQgPSBPYmplY3QodGhpcyk7XHJcblx0XHR2YXIgbGVuID0gdC5sZW5ndGggPj4+IDA7XHJcblxyXG5cdFx0aWYgKGxlbiA9PT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gLTE7XHJcblx0XHR9XHJcblx0XHR2YXIgbiA9IDA7XHJcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcclxuXHRcdFx0biA9IE51bWJlcihhcmd1bWVudHNbMV0pO1xyXG5cdFx0XHRpZiAobiAhPT0gbikgeyAvLyBzaG9ydGN1dCBmb3IgdmVyaWZ5aW5nIGlmIGl0J3MgTmFOXHJcblx0XHRcdFx0biA9IDA7XHJcblx0XHRcdH0gZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSBJbmZpbml0eSAmJiBuICE9PSAtSW5maW5pdHkpIHtcclxuXHRcdFx0XHRuID0gKG4gPiAwIHx8IC0xKSAqIE1hdGguZmxvb3IoTWF0aC5hYnMobikpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAobiA+PSBsZW4pIHtcclxuXHRcdFx0cmV0dXJuIC0xO1xyXG5cdFx0fVxyXG5cdFx0dmFyIGsgPSBuID49IDAgPyBuIDogTWF0aC5tYXgobGVuIC0gTWF0aC5hYnMobiksIDApO1xyXG5cdFx0Zm9yICg7IGsgPCBsZW47IGsrKykge1xyXG5cdFx0XHRpZiAoayBpbiB0ICYmIHRba10gPT09IHNlYXJjaEVsZW1lbnQpIHtcclxuXHRcdFx0XHRyZXR1cm4gaztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIC0xO1xyXG5cdH07XHJcbn1cclxuXHJcbi8vIEdydW5nZXkgT2JqZWN0LmlzRnJvemVuIGhhY2tcclxuaWYgKCFPYmplY3QuaXNGcm96ZW4pIHtcclxuXHRPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHR2YXIga2V5ID0gXCJ0djRfdGVzdF9mcm96ZW5fa2V5XCI7XHJcblx0XHR3aGlsZSAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuXHRcdFx0a2V5ICs9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRvYmpba2V5XSA9IHRydWU7XHJcblx0XHRcdGRlbGV0ZSBvYmpba2V5XTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcbi8vIEJhc2VkIG9uOiBodHRwczovL2dpdGh1Yi5jb20vZ2VyYWludGx1ZmYvdXJpLXRlbXBsYXRlcywgYnV0IHdpdGggYWxsIHRoZSBkZS1zdWJzdGl0dXRpb24gc3R1ZmYgcmVtb3ZlZFxyXG5cclxudmFyIHVyaVRlbXBsYXRlR2xvYmFsTW9kaWZpZXJzID0ge1xyXG5cdFwiK1wiOiB0cnVlLFxyXG5cdFwiI1wiOiB0cnVlLFxyXG5cdFwiLlwiOiB0cnVlLFxyXG5cdFwiL1wiOiB0cnVlLFxyXG5cdFwiO1wiOiB0cnVlLFxyXG5cdFwiP1wiOiB0cnVlLFxyXG5cdFwiJlwiOiB0cnVlXHJcbn07XHJcbnZhciB1cmlUZW1wbGF0ZVN1ZmZpY2VzID0ge1xyXG5cdFwiKlwiOiB0cnVlXHJcbn07XHJcblxyXG5mdW5jdGlvbiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKHN0cmluZykge1xyXG5cdHJldHVybiBlbmNvZGVVUkkoc3RyaW5nKS5yZXBsYWNlKC8lMjVbMC05XVswLTldL2csIGZ1bmN0aW9uIChkb3VibGVFbmNvZGVkKSB7XHJcblx0XHRyZXR1cm4gXCIlXCIgKyBkb3VibGVFbmNvZGVkLnN1YnN0cmluZygzKTtcclxuXHR9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXJpVGVtcGxhdGVTdWJzdGl0dXRpb24oc3BlYykge1xyXG5cdHZhciBtb2RpZmllciA9IFwiXCI7XHJcblx0aWYgKHVyaVRlbXBsYXRlR2xvYmFsTW9kaWZpZXJzW3NwZWMuY2hhckF0KDApXSkge1xyXG5cdFx0bW9kaWZpZXIgPSBzcGVjLmNoYXJBdCgwKTtcclxuXHRcdHNwZWMgPSBzcGVjLnN1YnN0cmluZygxKTtcclxuXHR9XHJcblx0dmFyIHNlcGFyYXRvciA9IFwiXCI7XHJcblx0dmFyIHByZWZpeCA9IFwiXCI7XHJcblx0dmFyIHNob3VsZEVzY2FwZSA9IHRydWU7XHJcblx0dmFyIHNob3dWYXJpYWJsZXMgPSBmYWxzZTtcclxuXHR2YXIgdHJpbUVtcHR5U3RyaW5nID0gZmFsc2U7XHJcblx0aWYgKG1vZGlmaWVyID09PSAnKycpIHtcclxuXHRcdHNob3VsZEVzY2FwZSA9IGZhbHNlO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09IFwiLlwiKSB7XHJcblx0XHRwcmVmaXggPSBcIi5cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiLlwiO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09IFwiL1wiKSB7XHJcblx0XHRwcmVmaXggPSBcIi9cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiL1wiO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICcjJykge1xyXG5cdFx0cHJlZml4ID0gXCIjXCI7XHJcblx0XHRzaG91bGRFc2NhcGUgPSBmYWxzZTtcclxuXHR9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnOycpIHtcclxuXHRcdHByZWZpeCA9IFwiO1wiO1xyXG5cdFx0c2VwYXJhdG9yID0gXCI7XCI7XHJcblx0XHRzaG93VmFyaWFibGVzID0gdHJ1ZTtcclxuXHRcdHRyaW1FbXB0eVN0cmluZyA9IHRydWU7XHJcblx0fSBlbHNlIGlmIChtb2RpZmllciA9PT0gJz8nKSB7XHJcblx0XHRwcmVmaXggPSBcIj9cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiJlwiO1xyXG5cdFx0c2hvd1ZhcmlhYmxlcyA9IHRydWU7XHJcblx0fSBlbHNlIGlmIChtb2RpZmllciA9PT0gJyYnKSB7XHJcblx0XHRwcmVmaXggPSBcIiZcIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiJlwiO1xyXG5cdFx0c2hvd1ZhcmlhYmxlcyA9IHRydWU7XHJcblx0fVxyXG5cclxuXHR2YXIgdmFyTmFtZXMgPSBbXTtcclxuXHR2YXIgdmFyTGlzdCA9IHNwZWMuc3BsaXQoXCIsXCIpO1xyXG5cdHZhciB2YXJTcGVjcyA9IFtdO1xyXG5cdHZhciB2YXJTcGVjTWFwID0ge307XHJcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB2YXJMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgdmFyTmFtZSA9IHZhckxpc3RbaV07XHJcblx0XHR2YXIgdHJ1bmNhdGUgPSBudWxsO1xyXG5cdFx0aWYgKHZhck5hbWUuaW5kZXhPZihcIjpcIikgIT09IC0xKSB7XHJcblx0XHRcdHZhciBwYXJ0cyA9IHZhck5hbWUuc3BsaXQoXCI6XCIpO1xyXG5cdFx0XHR2YXJOYW1lID0gcGFydHNbMF07XHJcblx0XHRcdHRydW5jYXRlID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcclxuXHRcdH1cclxuXHRcdHZhciBzdWZmaWNlcyA9IHt9O1xyXG5cdFx0d2hpbGUgKHVyaVRlbXBsYXRlU3VmZmljZXNbdmFyTmFtZS5jaGFyQXQodmFyTmFtZS5sZW5ndGggLSAxKV0pIHtcclxuXHRcdFx0c3VmZmljZXNbdmFyTmFtZS5jaGFyQXQodmFyTmFtZS5sZW5ndGggLSAxKV0gPSB0cnVlO1xyXG5cdFx0XHR2YXJOYW1lID0gdmFyTmFtZS5zdWJzdHJpbmcoMCwgdmFyTmFtZS5sZW5ndGggLSAxKTtcclxuXHRcdH1cclxuXHRcdHZhciB2YXJTcGVjID0ge1xyXG5cdFx0XHR0cnVuY2F0ZTogdHJ1bmNhdGUsXHJcblx0XHRcdG5hbWU6IHZhck5hbWUsXHJcblx0XHRcdHN1ZmZpY2VzOiBzdWZmaWNlc1xyXG5cdFx0fTtcclxuXHRcdHZhclNwZWNzLnB1c2godmFyU3BlYyk7XHJcblx0XHR2YXJTcGVjTWFwW3Zhck5hbWVdID0gdmFyU3BlYztcclxuXHRcdHZhck5hbWVzLnB1c2godmFyTmFtZSk7XHJcblx0fVxyXG5cdHZhciBzdWJGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZUZ1bmN0aW9uKSB7XHJcblx0XHR2YXIgcmVzdWx0ID0gXCJcIjtcclxuXHRcdHZhciBzdGFydEluZGV4ID0gMDtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdmFyU3BlY3MubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIHZhclNwZWMgPSB2YXJTcGVjc1tpXTtcclxuXHRcdFx0dmFyIHZhbHVlID0gdmFsdWVGdW5jdGlvbih2YXJTcGVjLm5hbWUpO1xyXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB8fCAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKSkge1xyXG5cdFx0XHRcdHN0YXJ0SW5kZXgrKztcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoaSA9PT0gc3RhcnRJbmRleCkge1xyXG5cdFx0XHRcdHJlc3VsdCArPSBwcmVmaXg7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmVzdWx0ICs9IChzZXBhcmF0b3IgfHwgXCIsXCIpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG5cdFx0XHRcdGlmIChzaG93VmFyaWFibGVzKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5uYW1lICsgXCI9XCI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdGlmIChqID4gMCkge1xyXG5cdFx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5zdWZmaWNlc1snKiddID8gKHNlcGFyYXRvciB8fCBcIixcIikgOiBcIixcIjtcclxuXHRcdFx0XHRcdFx0aWYgKHZhclNwZWMuc3VmZmljZXNbJyonXSAmJiBzaG93VmFyaWFibGVzKSB7XHJcblx0XHRcdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMubmFtZSArIFwiPVwiO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gc2hvdWxkRXNjYXBlID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2pdKS5yZXBsYWNlKC8hL2csIFwiJTIxXCIpIDogbm90UmVhbGx5UGVyY2VudEVuY29kZSh2YWx1ZVtqXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG5cdFx0XHRcdGlmIChzaG93VmFyaWFibGVzICYmICF2YXJTcGVjLnN1ZmZpY2VzWycqJ10pIHtcclxuXHRcdFx0XHRcdHJlc3VsdCArPSB2YXJTcGVjLm5hbWUgKyBcIj1cIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dmFyIGZpcnN0ID0gdHJ1ZTtcclxuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcclxuXHRcdFx0XHRcdGlmICghZmlyc3QpIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMuc3VmZmljZXNbJyonXSA/IChzZXBhcmF0b3IgfHwgXCIsXCIpIDogXCIsXCI7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRmaXJzdCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0cmVzdWx0ICs9IHNob3VsZEVzY2FwZSA/IGVuY29kZVVSSUNvbXBvbmVudChrZXkpLnJlcGxhY2UoLyEvZywgXCIlMjFcIikgOiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKGtleSk7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5zdWZmaWNlc1snKiddID8gJz0nIDogXCIsXCI7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gc2hvdWxkRXNjYXBlID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2tleV0pLnJlcGxhY2UoLyEvZywgXCIlMjFcIikgOiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKHZhbHVlW2tleV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAoc2hvd1ZhcmlhYmxlcykge1xyXG5cdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMubmFtZTtcclxuXHRcdFx0XHRcdGlmICghdHJpbUVtcHR5U3RyaW5nIHx8IHZhbHVlICE9PSBcIlwiKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdCArPSBcIj1cIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKHZhclNwZWMudHJ1bmNhdGUgIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFyU3BlYy50cnVuY2F0ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJlc3VsdCArPSBzaG91bGRFc2NhcGUgPyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoLyEvZywgXCIlMjFcIik6IG5vdFJlYWxseVBlcmNlbnRFbmNvZGUodmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH07XHJcblx0c3ViRnVuY3Rpb24udmFyTmFtZXMgPSB2YXJOYW1lcztcclxuXHRyZXR1cm4ge1xyXG5cdFx0cHJlZml4OiBwcmVmaXgsXHJcblx0XHRzdWJzdGl0dXRpb246IHN1YkZ1bmN0aW9uXHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gVXJpVGVtcGxhdGUodGVtcGxhdGUpIHtcclxuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgVXJpVGVtcGxhdGUpKSB7XHJcblx0XHRyZXR1cm4gbmV3IFVyaVRlbXBsYXRlKHRlbXBsYXRlKTtcclxuXHR9XHJcblx0dmFyIHBhcnRzID0gdGVtcGxhdGUuc3BsaXQoXCJ7XCIpO1xyXG5cdHZhciB0ZXh0UGFydHMgPSBbcGFydHMuc2hpZnQoKV07XHJcblx0dmFyIHByZWZpeGVzID0gW107XHJcblx0dmFyIHN1YnN0aXR1dGlvbnMgPSBbXTtcclxuXHR2YXIgdmFyTmFtZXMgPSBbXTtcclxuXHR3aGlsZSAocGFydHMubGVuZ3RoID4gMCkge1xyXG5cdFx0dmFyIHBhcnQgPSBwYXJ0cy5zaGlmdCgpO1xyXG5cdFx0dmFyIHNwZWMgPSBwYXJ0LnNwbGl0KFwifVwiKVswXTtcclxuXHRcdHZhciByZW1haW5kZXIgPSBwYXJ0LnN1YnN0cmluZyhzcGVjLmxlbmd0aCArIDEpO1xyXG5cdFx0dmFyIGZ1bmNzID0gdXJpVGVtcGxhdGVTdWJzdGl0dXRpb24oc3BlYyk7XHJcblx0XHRzdWJzdGl0dXRpb25zLnB1c2goZnVuY3Muc3Vic3RpdHV0aW9uKTtcclxuXHRcdHByZWZpeGVzLnB1c2goZnVuY3MucHJlZml4KTtcclxuXHRcdHRleHRQYXJ0cy5wdXNoKHJlbWFpbmRlcik7XHJcblx0XHR2YXJOYW1lcyA9IHZhck5hbWVzLmNvbmNhdChmdW5jcy5zdWJzdGl0dXRpb24udmFyTmFtZXMpO1xyXG5cdH1cclxuXHR0aGlzLmZpbGwgPSBmdW5jdGlvbiAodmFsdWVGdW5jdGlvbikge1xyXG5cdFx0dmFyIHJlc3VsdCA9IHRleHRQYXJ0c1swXTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic3RpdHV0aW9ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uc1tpXTtcclxuXHRcdFx0cmVzdWx0ICs9IHN1YnN0aXR1dGlvbih2YWx1ZUZ1bmN0aW9uKTtcclxuXHRcdFx0cmVzdWx0ICs9IHRleHRQYXJ0c1tpICsgMV07XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH07XHJcblx0dGhpcy52YXJOYW1lcyA9IHZhck5hbWVzO1xyXG5cdHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxufVxyXG5VcmlUZW1wbGF0ZS5wcm90b3R5cGUgPSB7XHJcblx0dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiB0aGlzLnRlbXBsYXRlO1xyXG5cdH0sXHJcblx0ZmlsbEZyb21PYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdHJldHVybiB0aGlzLmZpbGwoZnVuY3Rpb24gKHZhck5hbWUpIHtcclxuXHRcdFx0cmV0dXJuIG9ialt2YXJOYW1lXTtcclxuXHRcdH0pO1xyXG5cdH1cclxufTtcclxudmFyIFZhbGlkYXRvckNvbnRleHQgPSBmdW5jdGlvbiBWYWxpZGF0b3JDb250ZXh0KHBhcmVudCwgY29sbGVjdE11bHRpcGxlLCBlcnJvclJlcG9ydGVyLCBjaGVja1JlY3Vyc2l2ZSwgdHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdHRoaXMubWlzc2luZ01hcCA9IHt9O1xyXG5cdHRoaXMuZm9ybWF0VmFsaWRhdG9ycyA9IHBhcmVudCA/IE9iamVjdC5jcmVhdGUocGFyZW50LmZvcm1hdFZhbGlkYXRvcnMpIDoge307XHJcblx0dGhpcy5zY2hlbWFzID0gcGFyZW50ID8gT2JqZWN0LmNyZWF0ZShwYXJlbnQuc2NoZW1hcykgOiB7fTtcclxuXHR0aGlzLmNvbGxlY3RNdWx0aXBsZSA9IGNvbGxlY3RNdWx0aXBsZTtcclxuXHR0aGlzLmVycm9ycyA9IFtdO1xyXG5cdHRoaXMuaGFuZGxlRXJyb3IgPSBjb2xsZWN0TXVsdGlwbGUgPyB0aGlzLmNvbGxlY3RFcnJvciA6IHRoaXMucmV0dXJuRXJyb3I7XHJcblx0aWYgKGNoZWNrUmVjdXJzaXZlKSB7XHJcblx0XHR0aGlzLmNoZWNrUmVjdXJzaXZlID0gdHJ1ZTtcclxuXHRcdHRoaXMuc2Nhbm5lZCA9IFtdO1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuID0gW107XHJcblx0XHR0aGlzLnNjYW5uZWRGcm96ZW5TY2hlbWFzID0gW107XHJcblx0XHR0aGlzLnNjYW5uZWRGcm96ZW5WYWxpZGF0aW9uRXJyb3JzID0gW107XHJcblx0XHR0aGlzLnZhbGlkYXRlZFNjaGVtYXNLZXkgPSAndHY0X3ZhbGlkYXRpb25faWQnO1xyXG5cdFx0dGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5ID0gJ3R2NF92YWxpZGF0aW9uX2Vycm9yc19pZCc7XHJcblx0fVxyXG5cdGlmICh0cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHR0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMgPSB0cnVlO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSB7fTtcclxuXHRcdHRoaXMudW5rbm93blByb3BlcnR5UGF0aHMgPSB7fTtcclxuXHR9XHJcblx0dGhpcy5lcnJvclJlcG9ydGVyID0gZXJyb3JSZXBvcnRlciB8fCBkZWZhdWx0RXJyb3JSZXBvcnRlcignZW4nKTtcclxuXHRpZiAodHlwZW9mIHRoaXMuZXJyb3JSZXBvcnRlciA9PT0gJ3N0cmluZycpIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcignZGVidWcnKTtcclxuXHR9XHJcblx0dGhpcy5kZWZpbmVkS2V5d29yZHMgPSB7fTtcclxuXHRpZiAocGFyZW50KSB7XHJcblx0XHRmb3IgKHZhciBrZXkgaW4gcGFyZW50LmRlZmluZWRLZXl3b3Jkcykge1xyXG5cdFx0XHR0aGlzLmRlZmluZWRLZXl3b3Jkc1trZXldID0gcGFyZW50LmRlZmluZWRLZXl3b3Jkc1trZXldLnNsaWNlKDApO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuZGVmaW5lS2V5d29yZCA9IGZ1bmN0aW9uIChrZXl3b3JkLCBrZXl3b3JkRnVuY3Rpb24pIHtcclxuXHR0aGlzLmRlZmluZWRLZXl3b3Jkc1trZXl3b3JkXSA9IHRoaXMuZGVmaW5lZEtleXdvcmRzW2tleXdvcmRdIHx8IFtdO1xyXG5cdHRoaXMuZGVmaW5lZEtleXdvcmRzW2tleXdvcmRdLnB1c2goa2V5d29yZEZ1bmN0aW9uKTtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRXJyb3IgPSBmdW5jdGlvbiAoY29kZSwgbWVzc2FnZVBhcmFtcywgZGF0YVBhdGgsIHNjaGVtYVBhdGgsIHN1YkVycm9ycywgZGF0YSwgc2NoZW1hKSB7XHJcblx0dmFyIGVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihjb2RlLCBtZXNzYWdlUGFyYW1zLCBkYXRhUGF0aCwgc2NoZW1hUGF0aCwgc3ViRXJyb3JzKTtcclxuXHRlcnJvci5tZXNzYWdlID0gdGhpcy5lcnJvclJlcG9ydGVyKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdHJldHVybiBlcnJvcjtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUucmV0dXJuRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcclxuXHRyZXR1cm4gZXJyb3I7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmNvbGxlY3RFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xyXG5cdGlmIChlcnJvcikge1xyXG5cdFx0dGhpcy5lcnJvcnMucHVzaChlcnJvcik7XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5wcmVmaXhFcnJvcnMgPSBmdW5jdGlvbiAoc3RhcnRJbmRleCwgZGF0YVBhdGgsIHNjaGVtYVBhdGgpIHtcclxuXHRmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRoaXMuZXJyb3JzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR0aGlzLmVycm9yc1tpXSA9IHRoaXMuZXJyb3JzW2ldLnByZWZpeFdpdGgoZGF0YVBhdGgsIHNjaGVtYVBhdGgpO1xyXG5cdH1cclxuXHRyZXR1cm4gdGhpcztcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuYmFuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hKSB7XHJcblx0Zm9yICh2YXIgdW5rbm93blBhdGggaW4gdGhpcy51bmtub3duUHJvcGVydHlQYXRocykge1xyXG5cdFx0dmFyIGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLlVOS05PV05fUFJPUEVSVFksIHtwYXRoOiB1bmtub3duUGF0aH0sIHVua25vd25QYXRoLCBcIlwiLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG5cdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmFkZEZvcm1hdCA9IGZ1bmN0aW9uIChmb3JtYXQsIHZhbGlkYXRvcikge1xyXG5cdGlmICh0eXBlb2YgZm9ybWF0ID09PSAnb2JqZWN0Jykge1xyXG5cdFx0Zm9yICh2YXIga2V5IGluIGZvcm1hdCkge1xyXG5cdFx0XHR0aGlzLmFkZEZvcm1hdChrZXksIGZvcm1hdFtrZXldKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHR0aGlzLmZvcm1hdFZhbGlkYXRvcnNbZm9ybWF0XSA9IHZhbGlkYXRvcjtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUucmVzb2x2ZVJlZnMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1cmxIaXN0b3J5KSB7XHJcblx0aWYgKHNjaGVtYVsnJHJlZiddICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdHVybEhpc3RvcnkgPSB1cmxIaXN0b3J5IHx8IHt9O1xyXG5cdFx0aWYgKHVybEhpc3Rvcnlbc2NoZW1hWyckcmVmJ11dKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuQ0lSQ1VMQVJfUkVGRVJFTkNFLCB7dXJsczogT2JqZWN0LmtleXModXJsSGlzdG9yeSkuam9pbignLCAnKX0sICcnLCAnJywgbnVsbCwgdW5kZWZpbmVkLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdFx0dXJsSGlzdG9yeVtzY2hlbWFbJyRyZWYnXV0gPSB0cnVlO1xyXG5cdFx0c2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoc2NoZW1hWyckcmVmJ10sIHVybEhpc3RvcnkpO1xyXG5cdH1cclxuXHRyZXR1cm4gc2NoZW1hO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5nZXRTY2hlbWEgPSBmdW5jdGlvbiAodXJsLCB1cmxIaXN0b3J5KSB7XHJcblx0dmFyIHNjaGVtYTtcclxuXHRpZiAodGhpcy5zY2hlbWFzW3VybF0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0c2NoZW1hID0gdGhpcy5zY2hlbWFzW3VybF07XHJcblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlUmVmcyhzY2hlbWEsIHVybEhpc3RvcnkpO1xyXG5cdH1cclxuXHR2YXIgYmFzZVVybCA9IHVybDtcclxuXHR2YXIgZnJhZ21lbnQgPSBcIlwiO1xyXG5cdGlmICh1cmwuaW5kZXhPZignIycpICE9PSAtMSkge1xyXG5cdFx0ZnJhZ21lbnQgPSB1cmwuc3Vic3RyaW5nKHVybC5pbmRleE9mKFwiI1wiKSArIDEpO1xyXG5cdFx0YmFzZVVybCA9IHVybC5zdWJzdHJpbmcoMCwgdXJsLmluZGV4T2YoXCIjXCIpKTtcclxuXHR9XHJcblx0aWYgKHR5cGVvZiB0aGlzLnNjaGVtYXNbYmFzZVVybF0gPT09ICdvYmplY3QnKSB7XHJcblx0XHRzY2hlbWEgPSB0aGlzLnNjaGVtYXNbYmFzZVVybF07XHJcblx0XHR2YXIgcG9pbnRlclBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoZnJhZ21lbnQpO1xyXG5cdFx0aWYgKHBvaW50ZXJQYXRoID09PSBcIlwiKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVSZWZzKHNjaGVtYSwgdXJsSGlzdG9yeSk7XHJcblx0XHR9IGVsc2UgaWYgKHBvaW50ZXJQYXRoLmNoYXJBdCgwKSAhPT0gXCIvXCIpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHRcdHZhciBwYXJ0cyA9IHBvaW50ZXJQYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgxKTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIGNvbXBvbmVudCA9IHBhcnRzW2ldLnJlcGxhY2UoL34xL2csIFwiL1wiKS5yZXBsYWNlKC9+MC9nLCBcIn5cIik7XHJcblx0XHRcdGlmIChzY2hlbWFbY29tcG9uZW50XSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0c2NoZW1hID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdHNjaGVtYSA9IHNjaGVtYVtjb21wb25lbnRdO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVSZWZzKHNjaGVtYSwgdXJsSGlzdG9yeSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICh0aGlzLm1pc3NpbmdbYmFzZVVybF0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0dGhpcy5taXNzaW5nLnB1c2goYmFzZVVybCk7XHJcblx0XHR0aGlzLm1pc3NpbmdbYmFzZVVybF0gPSBiYXNlVXJsO1xyXG5cdFx0dGhpcy5taXNzaW5nTWFwW2Jhc2VVcmxdID0gYmFzZVVybDtcclxuXHR9XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnNlYXJjaFNjaGVtYXMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1cmwpIHtcclxuXHRpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XHJcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR0aGlzLnNlYXJjaFNjaGVtYXMoc2NoZW1hW2ldLCB1cmwpO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAoc2NoZW1hICYmIHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdGlmICh0eXBlb2Ygc2NoZW1hLmlkID09PSBcInN0cmluZ1wiKSB7XHJcblx0XHRcdGlmIChpc1RydXN0ZWRVcmwodXJsLCBzY2hlbWEuaWQpKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuc2NoZW1hc1tzY2hlbWEuaWRdID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2NoZW1hc1tzY2hlbWEuaWRdID0gc2NoZW1hO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Zm9yICh2YXIga2V5IGluIHNjaGVtYSkge1xyXG5cdFx0XHRpZiAoa2V5ICE9PSBcImVudW1cIikge1xyXG5cdFx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hW2tleV0gPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2VhcmNoU2NoZW1hcyhzY2hlbWFba2V5XSwgdXJsKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGtleSA9PT0gXCIkcmVmXCIpIHtcclxuXHRcdFx0XHRcdHZhciB1cmkgPSBnZXREb2N1bWVudFVyaShzY2hlbWFba2V5XSk7XHJcblx0XHRcdFx0XHRpZiAodXJpICYmIHRoaXMuc2NoZW1hc1t1cmldID09PSB1bmRlZmluZWQgJiYgdGhpcy5taXNzaW5nTWFwW3VyaV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLm1pc3NpbmdNYXBbdXJpXSA9IHVyaTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmFkZFNjaGVtYSA9IGZ1bmN0aW9uICh1cmwsIHNjaGVtYSkge1xyXG5cdC8vb3ZlcmxvYWRcclxuXHRpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHNjaGVtYSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdGlmICh0eXBlb2YgdXJsID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdXJsLmlkID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRzY2hlbWEgPSB1cmw7XHJcblx0XHRcdHVybCA9IHNjaGVtYS5pZDtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICh1cmwgPT09IGdldERvY3VtZW50VXJpKHVybCkgKyBcIiNcIikge1xyXG5cdFx0Ly8gUmVtb3ZlIGVtcHR5IGZyYWdtZW50XHJcblx0XHR1cmwgPSBnZXREb2N1bWVudFVyaSh1cmwpO1xyXG5cdH1cclxuXHR0aGlzLnNjaGVtYXNbdXJsXSA9IHNjaGVtYTtcclxuXHRkZWxldGUgdGhpcy5taXNzaW5nTWFwW3VybF07XHJcblx0bm9ybVNjaGVtYShzY2hlbWEsIHVybCk7XHJcblx0dGhpcy5zZWFyY2hTY2hlbWFzKHNjaGVtYSwgdXJsKTtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldFNjaGVtYU1hcCA9IGZ1bmN0aW9uICgpIHtcclxuXHR2YXIgbWFwID0ge307XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMuc2NoZW1hcykge1xyXG5cdFx0bWFwW2tleV0gPSB0aGlzLnNjaGVtYXNba2V5XTtcclxuXHR9XHJcblx0cmV0dXJuIG1hcDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldFNjaGVtYVVyaXMgPSBmdW5jdGlvbiAoZmlsdGVyUmVnRXhwKSB7XHJcblx0dmFyIGxpc3QgPSBbXTtcclxuXHRmb3IgKHZhciBrZXkgaW4gdGhpcy5zY2hlbWFzKSB7XHJcblx0XHRpZiAoIWZpbHRlclJlZ0V4cCB8fCBmaWx0ZXJSZWdFeHAudGVzdChrZXkpKSB7XHJcblx0XHRcdGxpc3QucHVzaChrZXkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbGlzdDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldE1pc3NpbmdVcmlzID0gZnVuY3Rpb24gKGZpbHRlclJlZ0V4cCkge1xyXG5cdHZhciBsaXN0ID0gW107XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMubWlzc2luZ01hcCkge1xyXG5cdFx0aWYgKCFmaWx0ZXJSZWdFeHAgfHwgZmlsdGVyUmVnRXhwLnRlc3Qoa2V5KSkge1xyXG5cdFx0XHRsaXN0LnB1c2goa2V5KTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGxpc3Q7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5kcm9wU2NoZW1hcyA9IGZ1bmN0aW9uICgpIHtcclxuXHR0aGlzLnNjaGVtYXMgPSB7fTtcclxuXHR0aGlzLnJlc2V0KCk7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xyXG5cdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdHRoaXMubWlzc2luZ01hcCA9IHt9O1xyXG5cdHRoaXMuZXJyb3JzID0gW107XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFsbCA9IGZ1bmN0aW9uIChkYXRhLCBzY2hlbWEsIGRhdGFQYXRoUGFydHMsIHNjaGVtYVBhdGhQYXJ0cywgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0dmFyIHRvcExldmVsO1xyXG5cdHNjaGVtYSA9IHRoaXMucmVzb2x2ZVJlZnMoc2NoZW1hKTtcclxuXHRpZiAoIXNjaGVtYSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fSBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcclxuXHRcdHRoaXMuZXJyb3JzLnB1c2goc2NoZW1hKTtcclxuXHRcdHJldHVybiBzY2hlbWE7XHJcblx0fVxyXG5cclxuXHR2YXIgc3RhcnRFcnJvckNvdW50ID0gdGhpcy5lcnJvcnMubGVuZ3RoO1xyXG5cdHZhciBmcm96ZW5JbmRleCwgc2Nhbm5lZEZyb3plblNjaGVtYUluZGV4ID0gbnVsbCwgc2Nhbm5lZFNjaGVtYXNJbmRleCA9IG51bGw7XHJcblx0aWYgKHRoaXMuY2hlY2tSZWN1cnNpdmUgJiYgZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdHRvcExldmVsID0gIXRoaXMuc2Nhbm5lZC5sZW5ndGg7XHJcblx0XHRpZiAoZGF0YVt0aGlzLnZhbGlkYXRlZFNjaGVtYXNLZXldKSB7XHJcblx0XHRcdHZhciBzY2hlbWFJbmRleCA9IGRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XS5pbmRleE9mKHNjaGVtYSk7XHJcblx0XHRcdGlmIChzY2hlbWFJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHR0aGlzLmVycm9ycyA9IHRoaXMuZXJyb3JzLmNvbmNhdChkYXRhW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV1bc2NoZW1hSW5kZXhdKTtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKE9iamVjdC5pc0Zyb3plbihkYXRhKSkge1xyXG5cdFx0XHRmcm96ZW5JbmRleCA9IHRoaXMuc2Nhbm5lZEZyb3plbi5pbmRleE9mKGRhdGEpO1xyXG5cdFx0XHRpZiAoZnJvemVuSW5kZXggIT09IC0xKSB7XHJcblx0XHRcdFx0dmFyIGZyb3plblNjaGVtYUluZGV4ID0gdGhpcy5zY2FubmVkRnJvemVuU2NoZW1hc1tmcm96ZW5JbmRleF0uaW5kZXhPZihzY2hlbWEpO1xyXG5cdFx0XHRcdGlmIChmcm96ZW5TY2hlbWFJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuY29uY2F0KHRoaXMuc2Nhbm5lZEZyb3plblZhbGlkYXRpb25FcnJvcnNbZnJvemVuSW5kZXhdW2Zyb3plblNjaGVtYUluZGV4XSk7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHRoaXMuc2Nhbm5lZC5wdXNoKGRhdGEpO1xyXG5cdFx0aWYgKE9iamVjdC5pc0Zyb3plbihkYXRhKSkge1xyXG5cdFx0XHRpZiAoZnJvemVuSW5kZXggPT09IC0xKSB7XHJcblx0XHRcdFx0ZnJvemVuSW5kZXggPSB0aGlzLnNjYW5uZWRGcm96ZW4ubGVuZ3RoO1xyXG5cdFx0XHRcdHRoaXMuc2Nhbm5lZEZyb3plbi5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdHRoaXMuc2Nhbm5lZEZyb3plblNjaGVtYXMucHVzaChbXSk7XHJcblx0XHRcdH1cclxuXHRcdFx0c2Nhbm5lZEZyb3plblNjaGVtYUluZGV4ID0gdGhpcy5zY2FubmVkRnJvemVuU2NoZW1hc1tmcm96ZW5JbmRleF0ubGVuZ3RoO1xyXG5cdFx0XHR0aGlzLnNjYW5uZWRGcm96ZW5TY2hlbWFzW2Zyb3plbkluZGV4XVtzY2FubmVkRnJvemVuU2NoZW1hSW5kZXhdID0gc2NoZW1hO1xyXG5cdFx0XHR0aGlzLnNjYW5uZWRGcm96ZW5WYWxpZGF0aW9uRXJyb3JzW2Zyb3plbkluZGV4XVtzY2FubmVkRnJvemVuU2NoZW1hSW5kZXhdID0gW107XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAoIWRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XSkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0YSwgdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5LCB7XHJcblx0XHRcdFx0XHRcdHZhbHVlOiBbXSxcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRhLCB0aGlzLnZhbGlkYXRpb25FcnJvcnNLZXksIHtcclxuXHRcdFx0XHRcdFx0dmFsdWU6IFtdLFxyXG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRcdC8vSUUgNy84IHdvcmthcm91bmRcclxuXHRcdFx0XHRcdGRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XSA9IFtdO1xyXG5cdFx0XHRcdFx0ZGF0YVt0aGlzLnZhbGlkYXRpb25FcnJvcnNLZXldID0gW107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHNjYW5uZWRTY2hlbWFzSW5kZXggPSBkYXRhW3RoaXMudmFsaWRhdGVkU2NoZW1hc0tleV0ubGVuZ3RoO1xyXG5cdFx0XHRkYXRhW3RoaXMudmFsaWRhdGVkU2NoZW1hc0tleV1bc2Nhbm5lZFNjaGVtYXNJbmRleF0gPSBzY2hlbWE7XHJcblx0XHRcdGRhdGFbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XVtzY2FubmVkU2NoZW1hc0luZGV4XSA9IFtdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dmFyIGVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIGVycm9yID0gdGhpcy52YWxpZGF0ZUJhc2ljKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU51bWVyaWMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlU3RyaW5nKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZUFycmF5KGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9iamVjdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVDb21iaW5hdGlvbnMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlSHlwZXJtZWRpYShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVGb3JtYXQoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlRGVmaW5lZEtleXdvcmRzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxuXHJcblx0aWYgKHRvcExldmVsKSB7XHJcblx0XHR3aGlsZSAodGhpcy5zY2FubmVkLmxlbmd0aCkge1xyXG5cdFx0XHR2YXIgaXRlbSA9IHRoaXMuc2Nhbm5lZC5wb3AoKTtcclxuXHRcdFx0ZGVsZXRlIGl0ZW1bdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XTtcclxuXHRcdH1cclxuXHRcdHRoaXMuc2Nhbm5lZEZyb3plbiA9IFtdO1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuU2NoZW1hcyA9IFtdO1xyXG5cdH1cclxuXHJcblx0aWYgKGVycm9yIHx8IGVycm9yQ291bnQgIT09IHRoaXMuZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0d2hpbGUgKChkYXRhUGF0aFBhcnRzICYmIGRhdGFQYXRoUGFydHMubGVuZ3RoKSB8fCAoc2NoZW1hUGF0aFBhcnRzICYmIHNjaGVtYVBhdGhQYXJ0cy5sZW5ndGgpKSB7XHJcblx0XHRcdHZhciBkYXRhUGFydCA9IChkYXRhUGF0aFBhcnRzICYmIGRhdGFQYXRoUGFydHMubGVuZ3RoKSA/IFwiXCIgKyBkYXRhUGF0aFBhcnRzLnBvcCgpIDogbnVsbDtcclxuXHRcdFx0dmFyIHNjaGVtYVBhcnQgPSAoc2NoZW1hUGF0aFBhcnRzICYmIHNjaGVtYVBhdGhQYXJ0cy5sZW5ndGgpID8gXCJcIiArIHNjaGVtYVBhdGhQYXJ0cy5wb3AoKSA6IG51bGw7XHJcblx0XHRcdGlmIChlcnJvcikge1xyXG5cdFx0XHRcdGVycm9yID0gZXJyb3IucHJlZml4V2l0aChkYXRhUGFydCwgc2NoZW1hUGFydCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5wcmVmaXhFcnJvcnMoZXJyb3JDb3VudCwgZGF0YVBhcnQsIHNjaGVtYVBhcnQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKHNjYW5uZWRGcm96ZW5TY2hlbWFJbmRleCAhPT0gbnVsbCkge1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuVmFsaWRhdGlvbkVycm9yc1tmcm96ZW5JbmRleF1bc2Nhbm5lZEZyb3plblNjaGVtYUluZGV4XSA9IHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCk7XHJcblx0fSBlbHNlIGlmIChzY2FubmVkU2NoZW1hc0luZGV4ICE9PSBudWxsKSB7XHJcblx0XHRkYXRhW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV1bc2Nhbm5lZFNjaGVtYXNJbmRleF0gPSB0aGlzLmVycm9ycy5zbGljZShzdGFydEVycm9yQ291bnQpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIChkYXRhLCBzY2hlbWEpIHtcclxuXHRpZiAodHlwZW9mIHNjaGVtYS5mb3JtYXQgIT09ICdzdHJpbmcnIHx8ICF0aGlzLmZvcm1hdFZhbGlkYXRvcnNbc2NoZW1hLmZvcm1hdF0pIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHR2YXIgZXJyb3JNZXNzYWdlID0gdGhpcy5mb3JtYXRWYWxpZGF0b3JzW3NjaGVtYS5mb3JtYXRdLmNhbGwobnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRpZiAodHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ251bWJlcicpIHtcclxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRk9STUFUX0NVU1RPTSwge21lc3NhZ2U6IGVycm9yTWVzc2FnZX0sICcnLCAnL2Zvcm1hdCcsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0fSBlbHNlIGlmIChlcnJvck1lc3NhZ2UgJiYgdHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRk9STUFUX0NVU1RPTSwge21lc3NhZ2U6IGVycm9yTWVzc2FnZS5tZXNzYWdlIHx8IFwiP1wifSwgZXJyb3JNZXNzYWdlLmRhdGFQYXRoIHx8ICcnLCBlcnJvck1lc3NhZ2Uuc2NoZW1hUGF0aCB8fCBcIi9mb3JtYXRcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlRGVmaW5lZEtleXdvcmRzID0gZnVuY3Rpb24gKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMuZGVmaW5lZEtleXdvcmRzKSB7XHJcblx0XHRpZiAodHlwZW9mIHNjaGVtYVtrZXldID09PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRjb250aW51ZTtcclxuXHRcdH1cclxuXHRcdHZhciB2YWxpZGF0aW9uRnVuY3Rpb25zID0gdGhpcy5kZWZpbmVkS2V5d29yZHNba2V5XTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdmFsaWRhdGlvbkZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgZnVuYyA9IHZhbGlkYXRpb25GdW5jdGlvbnNbaV07XHJcblx0XHRcdHZhciByZXN1bHQgPSBmdW5jKGRhdGEsIHNjaGVtYVtrZXldLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCk7XHJcblx0XHRcdGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuS0VZV09SRF9DVVNUT00sIHtrZXk6IGtleSwgbWVzc2FnZTogcmVzdWx0fSwgJycsICcnLCBudWxsLCBkYXRhLCBzY2hlbWEpLnByZWZpeFdpdGgobnVsbCwga2V5KTtcclxuXHRcdFx0fSBlbHNlIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHR2YXIgY29kZSA9IHJlc3VsdC5jb2RlO1xyXG5cdFx0XHRcdGlmICh0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRcdGlmICghRXJyb3JDb2Rlc1tjb2RlXSkge1xyXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuZGVmaW5lZCBlcnJvciBjb2RlICh1c2UgZGVmaW5lRXJyb3IpOiAnICsgY29kZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb2RlID0gRXJyb3JDb2Rlc1tjb2RlXTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb2RlICE9PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdFx0Y29kZSA9IEVycm9yQ29kZXMuS0VZV09SRF9DVVNUT007XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBtZXNzYWdlUGFyYW1zID0gKHR5cGVvZiByZXN1bHQubWVzc2FnZSA9PT0gJ29iamVjdCcpID8gcmVzdWx0Lm1lc3NhZ2UgOiB7a2V5OiBrZXksIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIHx8IFwiP1wifTtcclxuXHRcdFx0XHR2YXIgc2NoZW1hUGF0aCA9IHJlc3VsdC5zY2hlbWFQYXRoIHx8IChcIi9cIiArIGtleS5yZXBsYWNlKC9+L2csICd+MCcpLnJlcGxhY2UoL1xcLy9nLCAnfjEnKSk7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoY29kZSwgbWVzc2FnZVBhcmFtcywgcmVzdWx0LmRhdGFQYXRoIHx8IG51bGwsIHNjaGVtYVBhdGgsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5mdW5jdGlvbiByZWN1cnNpdmVDb21wYXJlKEEsIEIpIHtcclxuXHRpZiAoQSA9PT0gQikge1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cdGlmIChBICYmIEIgJiYgdHlwZW9mIEEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIEIgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdGlmIChBcnJheS5pc0FycmF5KEEpICE9PSBBcnJheS5pc0FycmF5KEIpKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShBKSkge1xyXG5cdFx0XHRpZiAoQS5sZW5ndGggIT09IEIubGVuZ3RoKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgQS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmICghcmVjdXJzaXZlQ29tcGFyZShBW2ldLCBCW2ldKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dmFyIGtleTtcclxuXHRcdFx0Zm9yIChrZXkgaW4gQSkge1xyXG5cdFx0XHRcdGlmIChCW2tleV0gPT09IHVuZGVmaW5lZCAmJiBBW2tleV0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGtleSBpbiBCKSB7XHJcblx0XHRcdFx0aWYgKEFba2V5XSA9PT0gdW5kZWZpbmVkICYmIEJba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAoa2V5IGluIEEpIHtcclxuXHRcdFx0XHRpZiAoIXJlY3Vyc2l2ZUNvbXBhcmUoQVtrZXldLCBCW2tleV0pKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblx0cmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUJhc2ljID0gZnVuY3Rpb24gdmFsaWRhdGVCYXNpYyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlVHlwZShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdHJldHVybiBlcnJvci5wcmVmaXhXaXRoKG51bGwsIFwidHlwZVwiKTtcclxuXHR9XHJcblx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUVudW0oZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpKSB7XHJcblx0XHRyZXR1cm4gZXJyb3IucHJlZml4V2l0aChudWxsLCBcInR5cGVcIik7XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVUeXBlID0gZnVuY3Rpb24gdmFsaWRhdGVUeXBlKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmIChzY2hlbWEudHlwZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGRhdGFUeXBlID0gdHlwZW9mIGRhdGE7XHJcblx0aWYgKGRhdGEgPT09IG51bGwpIHtcclxuXHRcdGRhdGFUeXBlID0gXCJudWxsXCI7XHJcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcblx0XHRkYXRhVHlwZSA9IFwiYXJyYXlcIjtcclxuXHR9XHJcblx0dmFyIGFsbG93ZWRUeXBlcyA9IHNjaGVtYS50eXBlO1xyXG5cdGlmICghQXJyYXkuaXNBcnJheShhbGxvd2VkVHlwZXMpKSB7XHJcblx0XHRhbGxvd2VkVHlwZXMgPSBbYWxsb3dlZFR5cGVzXTtcclxuXHR9XHJcblxyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYWxsb3dlZFR5cGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgdHlwZSA9IGFsbG93ZWRUeXBlc1tpXTtcclxuXHRcdGlmICh0eXBlID09PSBkYXRhVHlwZSB8fCAodHlwZSA9PT0gXCJpbnRlZ2VyXCIgJiYgZGF0YVR5cGUgPT09IFwibnVtYmVyXCIgJiYgKGRhdGEgJSAxID09PSAwKSkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuSU5WQUxJRF9UWVBFLCB7dHlwZTogZGF0YVR5cGUsIGV4cGVjdGVkOiBhbGxvd2VkVHlwZXMuam9pbihcIi9cIil9LCAnJywgJycsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUVudW0gPSBmdW5jdGlvbiB2YWxpZGF0ZUVudW0oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHNjaGVtYVtcImVudW1cIl0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hW1wiZW51bVwiXS5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIGVudW1WYWwgPSBzY2hlbWFbXCJlbnVtXCJdW2ldO1xyXG5cdFx0aWYgKHJlY3Vyc2l2ZUNvbXBhcmUoZGF0YSwgZW51bVZhbCkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRU5VTV9NSVNNQVRDSCwge3ZhbHVlOiAodHlwZW9mIEpTT04gIT09ICd1bmRlZmluZWQnKSA/IEpTT04uc3RyaW5naWZ5KGRhdGEpIDogZGF0YX0sICcnLCAnJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTnVtZXJpYyA9IGZ1bmN0aW9uIHZhbGlkYXRlTnVtZXJpYyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHJldHVybiB0aGlzLnZhbGlkYXRlTXVsdGlwbGVPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVNaW5NYXgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlTmFOKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcbnZhciBDTE9TRV9FTk9VR0hfTE9XID0gTWF0aC5wb3coMiwgLTUxKTtcclxudmFyIENMT1NFX0VOT1VHSF9ISUdIID0gMSAtIENMT1NFX0VOT1VHSF9MT1c7XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTXVsdGlwbGVPZiA9IGZ1bmN0aW9uIHZhbGlkYXRlTXVsdGlwbGVPZihkYXRhLCBzY2hlbWEpIHtcclxuXHR2YXIgbXVsdGlwbGVPZiA9IHNjaGVtYS5tdWx0aXBsZU9mIHx8IHNjaGVtYS5kaXZpc2libGVCeTtcclxuXHRpZiAobXVsdGlwbGVPZiA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiKSB7XHJcblx0XHR2YXIgcmVtYWluZGVyID0gKGRhdGEvbXVsdGlwbGVPZiklMTtcclxuXHRcdGlmIChyZW1haW5kZXIgPj0gQ0xPU0VfRU5PVUdIX0xPVyAmJiByZW1haW5kZXIgPCBDTE9TRV9FTk9VR0hfSElHSCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5VTUJFUl9NVUxUSVBMRV9PRiwge3ZhbHVlOiBkYXRhLCBtdWx0aXBsZU9mOiBtdWx0aXBsZU9mfSwgJycsICcnLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTWluTWF4ID0gZnVuY3Rpb24gdmFsaWRhdGVNaW5NYXgoZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKHNjaGVtYS5taW5pbXVtICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhIDwgc2NoZW1hLm1pbmltdW0pIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5OVU1CRVJfTUlOSU1VTSwge3ZhbHVlOiBkYXRhLCBtaW5pbXVtOiBzY2hlbWEubWluaW11bX0sICcnLCAnL21pbmltdW0nLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICYmIGRhdGEgPT09IHNjaGVtYS5taW5pbXVtKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuTlVNQkVSX01JTklNVU1fRVhDTFVTSVZFLCB7dmFsdWU6IGRhdGEsIG1pbmltdW06IHNjaGVtYS5taW5pbXVtfSwgJycsICcvZXhjbHVzaXZlTWluaW11bScsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWF4aW11bSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRpZiAoZGF0YSA+IHNjaGVtYS5tYXhpbXVtKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuTlVNQkVSX01BWElNVU0sIHt2YWx1ZTogZGF0YSwgbWF4aW11bTogc2NoZW1hLm1heGltdW19LCAnJywgJy9tYXhpbXVtJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdH1cclxuXHRcdGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAmJiBkYXRhID09PSBzY2hlbWEubWF4aW11bSkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5VTUJFUl9NQVhJTVVNX0VYQ0xVU0lWRSwge3ZhbHVlOiBkYXRhLCBtYXhpbXVtOiBzY2hlbWEubWF4aW11bX0sICcnLCAnL2V4Y2x1c2l2ZU1heGltdW0nLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTmFOID0gZnVuY3Rpb24gdmFsaWRhdGVOYU4oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKGlzTmFOKGRhdGEpID09PSB0cnVlIHx8IGRhdGEgPT09IEluZmluaXR5IHx8IGRhdGEgPT09IC1JbmZpbml0eSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5OVU1CRVJfTk9UX0FfTlVNQkVSLCB7dmFsdWU6IGRhdGF9LCAnJywgJy90eXBlJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZyA9IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0cmV0dXJuIHRoaXMudmFsaWRhdGVTdHJpbmdMZW5ndGgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlU3RyaW5nUGF0dGVybihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZ0xlbmd0aCA9IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nTGVuZ3RoKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWluTGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA8IHNjaGVtYS5taW5MZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5TVFJJTkdfTEVOR1RIX1NIT1JULCB7bGVuZ3RoOiBkYXRhLmxlbmd0aCwgbWluaW11bTogc2NoZW1hLm1pbkxlbmd0aH0sICcnLCAnL21pbkxlbmd0aCcsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA+IHNjaGVtYS5tYXhMZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5TVFJJTkdfTEVOR1RIX0xPTkcsIHtsZW5ndGg6IGRhdGEubGVuZ3RoLCBtYXhpbXVtOiBzY2hlbWEubWF4TGVuZ3RofSwgJycsICcvbWF4TGVuZ3RoJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZ1BhdHRlcm4gPSBmdW5jdGlvbiB2YWxpZGF0ZVN0cmluZ1BhdHRlcm4oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8ICh0eXBlb2Ygc2NoZW1hLnBhdHRlcm4gIT09IFwic3RyaW5nXCIgJiYgIShzY2hlbWEucGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkpKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIHJlZ2V4cDtcclxuXHRpZiAoc2NoZW1hLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcclxuXHQgIHJlZ2V4cCA9IHNjaGVtYS5wYXR0ZXJuO1xyXG5cdH1cclxuXHRlbHNlIHtcclxuXHQgIHZhciBib2R5LCBmbGFncyA9ICcnO1xyXG5cdCAgLy8gQ2hlY2sgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsc1xyXG5cdCAgLy8gQHNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtNy44LjVcclxuXHQgIHZhciBsaXRlcmFsID0gc2NoZW1hLnBhdHRlcm4ubWF0Y2goL15cXC8oLispXFwvKFtpbWddKikkLyk7XHJcblx0ICBpZiAobGl0ZXJhbCkge1xyXG5cdCAgICBib2R5ID0gbGl0ZXJhbFsxXTtcclxuXHQgICAgZmxhZ3MgPSBsaXRlcmFsWzJdO1xyXG5cdCAgfVxyXG5cdCAgZWxzZSB7XHJcblx0ICAgIGJvZHkgPSBzY2hlbWEucGF0dGVybjtcclxuXHQgIH1cclxuXHQgIHJlZ2V4cCA9IG5ldyBSZWdFeHAoYm9keSwgZmxhZ3MpO1xyXG5cdH1cclxuXHRpZiAoIXJlZ2V4cC50ZXN0KGRhdGEpKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLlNUUklOR19QQVRURVJOLCB7cGF0dGVybjogc2NoZW1hLnBhdHRlcm59LCAnJywgJy9wYXR0ZXJuJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFycmF5ID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLnZhbGlkYXRlQXJyYXlMZW5ndGgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlQXJyYXlVbmlxdWVJdGVtcyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVBcnJheUl0ZW1zKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQXJyYXlMZW5ndGggPSBmdW5jdGlvbiB2YWxpZGF0ZUFycmF5TGVuZ3RoKGRhdGEsIHNjaGVtYSkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoc2NoZW1hLm1pbkl0ZW1zICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA8IHNjaGVtYS5taW5JdGVtcykge1xyXG5cdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9MRU5HVEhfU0hPUlQsIHtsZW5ndGg6IGRhdGEubGVuZ3RoLCBtaW5pbXVtOiBzY2hlbWEubWluSXRlbXN9LCAnJywgJy9taW5JdGVtcycsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRpZiAoc2NoZW1hLm1heEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA+IHNjaGVtYS5tYXhJdGVtcykge1xyXG5cdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9MRU5HVEhfTE9ORywge2xlbmd0aDogZGF0YS5sZW5ndGgsIG1heGltdW06IHNjaGVtYS5tYXhJdGVtc30sICcnLCAnL21heEl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVBcnJheVVuaXF1ZUl0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheVVuaXF1ZUl0ZW1zKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmIChzY2hlbWEudW5pcXVlSXRlbXMpIHtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRmb3IgKHZhciBqID0gaSArIDE7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0aWYgKHJlY3Vyc2l2ZUNvbXBhcmUoZGF0YVtpXSwgZGF0YVtqXSkpIHtcclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9VTklRVUUsIHttYXRjaDE6IGksIG1hdGNoMjogan0sICcnLCAnL3VuaXF1ZUl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVBcnJheUl0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheUl0ZW1zKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0aWYgKHNjaGVtYS5pdGVtcyA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9yLCBpO1xyXG5cdGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmIChpIDwgc2NoZW1hLml0ZW1zLmxlbmd0aCkge1xyXG5cdFx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YVtpXSwgc2NoZW1hLml0ZW1zW2ldLCBbaV0sIFtcIml0ZW1zXCIsIGldLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcclxuXHRcdFx0XHRcdGlmICghc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykge1xyXG5cdFx0XHRcdFx0XHRlcnJvciA9ICh0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuQVJSQVlfQURESVRJT05BTF9JVEVNUywge30sICcvJyArIGksICcvYWRkaXRpb25hbEl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKSk7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFbaV0sIHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMsIFtpXSwgW1wiYWRkaXRpb25hbEl0ZW1zXCJdLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YVtpXSwgc2NoZW1hLml0ZW1zLCBbaV0sIFtcIml0ZW1zXCJdLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVPYmplY3QgPSBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICh0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBkYXRhID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHRyZXR1cm4gdGhpcy52YWxpZGF0ZU9iamVjdE1pbk1heFByb3BlcnRpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlT2JqZWN0UmVxdWlyZWRQcm9wZXJ0aWVzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9iamVjdFByb3BlcnRpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlT2JqZWN0RGVwZW5kZW5jaWVzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0TWluTWF4UHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0TWluTWF4UHJvcGVydGllcyhkYXRhLCBzY2hlbWEpIHtcclxuXHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoc2NoZW1hLm1pblByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0aWYgKGtleXMubGVuZ3RoIDwgc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcclxuXHRcdFx0ZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuT0JKRUNUX1BST1BFUlRJRVNfTUlOSU1VTSwge3Byb3BlcnR5Q291bnQ6IGtleXMubGVuZ3RoLCBtaW5pbXVtOiBzY2hlbWEubWluUHJvcGVydGllc30sICcnLCAnL21pblByb3BlcnRpZXMnLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHRpZiAodGhpcy5oYW5kbGVFcnJvcihlcnJvcikpIHtcclxuXHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHNjaGVtYS5tYXhQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChrZXlzLmxlbmd0aCA+IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XHJcblx0XHRcdGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9CSkVDVF9QUk9QRVJUSUVTX01BWElNVU0sIHtwcm9wZXJ0eUNvdW50OiBrZXlzLmxlbmd0aCwgbWF4aW11bTogc2NoZW1hLm1heFByb3BlcnRpZXN9LCAnJywgJy9tYXhQcm9wZXJ0aWVzJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVPYmplY3RSZXF1aXJlZFByb3BlcnRpZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdFJlcXVpcmVkUHJvcGVydGllcyhkYXRhLCBzY2hlbWEpIHtcclxuXHRpZiAoc2NoZW1hLnJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHZhciBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XHJcblx0XHRcdGlmIChkYXRhW2tleV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdHZhciBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PQkpFQ1RfUkVRVUlSRUQsIHtrZXk6IGtleX0sICcnLCAnL3JlcXVpcmVkLycgKyBpLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0UHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0UHJvcGVydGllcyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xyXG5cdFx0dmFyIGtleVBvaW50ZXJQYXRoID0gZGF0YVBvaW50ZXJQYXRoICsgXCIvXCIgKyBrZXkucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XHJcblx0XHR2YXIgZm91bmRNYXRjaCA9IGZhbHNlO1xyXG5cdFx0aWYgKHNjaGVtYS5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLnByb3BlcnRpZXNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGZvdW5kTWF0Y2ggPSB0cnVlO1xyXG5cdFx0XHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFba2V5XSwgc2NoZW1hLnByb3BlcnRpZXNba2V5XSwgW2tleV0sIFtcInByb3BlcnRpZXNcIiwga2V5XSwga2V5UG9pbnRlclBhdGgpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0Zm9yICh2YXIgcGF0dGVybktleSBpbiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHR2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cChwYXR0ZXJuS2V5KTtcclxuXHRcdFx0XHRpZiAocmVnZXhwLnRlc3Qoa2V5KSkge1xyXG5cdFx0XHRcdFx0Zm91bmRNYXRjaCA9IHRydWU7XHJcblx0XHRcdFx0XHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFba2V5XSwgc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5LZXldLCBba2V5XSwgW1wicGF0dGVyblByb3BlcnRpZXNcIiwgcGF0dGVybktleV0sIGtleVBvaW50ZXJQYXRoKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoIWZvdW5kTWF0Y2gpIHtcclxuXHRcdFx0aWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0XHRcdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzW2tleVBvaW50ZXJQYXRoXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKHR5cGVvZiBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiKSB7XHJcblx0XHRcdFx0XHRpZiAoIXNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcykge1xyXG5cdFx0XHRcdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PQkpFQ1RfQURESVRJT05BTF9QUk9QRVJUSUVTLCB7a2V5OiBrZXl9LCAnJywgJy9hZGRpdGlvbmFsUHJvcGVydGllcycsIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChrZXksIG51bGwpO1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5oYW5kbGVFcnJvcihlcnJvcikpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhW2tleV0sIHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcywgW2tleV0sIFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdLCBrZXlQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMgJiYgIXRoaXMua25vd25Qcm9wZXJ0eVBhdGhzW2tleVBvaW50ZXJQYXRoXSkge1xyXG5cdFx0XHRcdHRoaXMudW5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0ZGVsZXRlIHRoaXMudW5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0RGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gdmFsaWRhdGVPYmplY3REZXBlbmRlbmNpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHR2YXIgZXJyb3I7XHJcblx0aWYgKHNjaGVtYS5kZXBlbmRlbmNpZXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0Zm9yICh2YXIgZGVwS2V5IGluIHNjaGVtYS5kZXBlbmRlbmNpZXMpIHtcclxuXHRcdFx0aWYgKGRhdGFbZGVwS2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0dmFyIGRlcCA9IHNjaGVtYS5kZXBlbmRlbmNpZXNbZGVwS2V5XTtcclxuXHRcdFx0XHRpZiAodHlwZW9mIGRlcCA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdFx0aWYgKGRhdGFbZGVwXSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9CSkVDVF9ERVBFTkRFTkNZX0tFWSwge2tleTogZGVwS2V5LCBtaXNzaW5nOiBkZXB9LCAnJywgJycsIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChudWxsLCBkZXBLZXkpLnByZWZpeFdpdGgobnVsbCwgXCJkZXBlbmRlbmNpZXNcIik7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkZXApKSB7XHJcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHR2YXIgcmVxdWlyZWRLZXkgPSBkZXBbaV07XHJcblx0XHRcdFx0XHRcdGlmIChkYXRhW3JlcXVpcmVkS2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0ZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuT0JKRUNUX0RFUEVOREVOQ1lfS0VZLCB7a2V5OiBkZXBLZXksIG1pc3Npbmc6IHJlcXVpcmVkS2V5fSwgJycsICcvJyArIGksIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChudWxsLCBkZXBLZXkpLnByZWZpeFdpdGgobnVsbCwgXCJkZXBlbmRlbmNpZXNcIik7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgZGVwLCBbXSwgW1wiZGVwZW5kZW5jaWVzXCIsIGRlcEtleV0sIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQ29tYmluYXRpb25zID0gZnVuY3Rpb24gdmFsaWRhdGVDb21iaW5hdGlvbnMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHRyZXR1cm4gdGhpcy52YWxpZGF0ZUFsbE9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZUFueU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9uZU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU5vdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFsbE9mID0gZnVuY3Rpb24gdmFsaWRhdGVBbGxPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmIChzY2hlbWEuYWxsT2YgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHZhciBlcnJvcjtcclxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5hbGxPZi5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5hbGxPZltpXTtcclxuXHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgc3ViU2NoZW1hLCBbXSwgW1wiYWxsT2ZcIiwgaV0sIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQW55T2YgPSBmdW5jdGlvbiB2YWxpZGF0ZUFueU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0aWYgKHNjaGVtYS5hbnlPZiA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciBzdGFydEVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzLCBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0b2xkVW5rbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzID0gdGhpcy5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdHZhciBlcnJvckF0RW5kID0gdHJ1ZTtcclxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5hbnlPZi5sZW5ndGg7IGkrKykge1xyXG5cdFx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0XHR0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHRcdHRoaXMua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHR9XHJcblx0XHR2YXIgc3ViU2NoZW1hID0gc2NoZW1hLmFueU9mW2ldO1xyXG5cclxuXHRcdHZhciBlcnJvckNvdW50ID0gdGhpcy5lcnJvcnMubGVuZ3RoO1xyXG5cdFx0dmFyIGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhLCBzdWJTY2hlbWEsIFtdLCBbXCJhbnlPZlwiLCBpXSwgZGF0YVBvaW50ZXJQYXRoKTtcclxuXHJcblx0XHRpZiAoZXJyb3IgPT09IG51bGwgJiYgZXJyb3JDb3VudCA9PT0gdGhpcy5lcnJvcnMubGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgc3RhcnRFcnJvckNvdW50KTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBrbm93bktleSBpbiB0aGlzLmtub3duUHJvcGVydHlQYXRocykge1xyXG5cdFx0XHRcdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzW2tub3duS2V5XSA9IHRydWU7XHJcblx0XHRcdFx0XHRkZWxldGUgb2xkVW5rbm93blByb3BlcnR5UGF0aHNba25vd25LZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmb3IgKHZhciB1bmtub3duS2V5IGluIHRoaXMudW5rbm93blByb3BlcnR5UGF0aHMpIHtcclxuXHRcdFx0XHRcdGlmICghb2xkS25vd25Qcm9wZXJ0eVBhdGhzW3Vua25vd25LZXldKSB7XHJcblx0XHRcdFx0XHRcdG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzW3Vua25vd25LZXldID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBjb250aW51ZSBsb29waW5nIHNvIHdlIGNhdGNoIGFsbCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHJldHVybiBhbiBlcnJvclxyXG5cdFx0XHRcdGVycm9yQXRFbmQgPSBmYWxzZTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRpZiAoZXJyb3IpIHtcclxuXHRcdFx0ZXJyb3JzLnB1c2goZXJyb3IucHJlZml4V2l0aChudWxsLCBcIlwiICsgaSkucHJlZml4V2l0aChudWxsLCBcImFueU9mXCIpKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmIChlcnJvckF0RW5kKSB7XHJcblx0XHRlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCkpO1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BTllfT0ZfTUlTU0lORywge30sIFwiXCIsIFwiL2FueU9mXCIsIGVycm9ycywgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZU9uZU9mID0gZnVuY3Rpb24gdmFsaWRhdGVPbmVPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmIChzY2hlbWEub25lT2YgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHZhciB2YWxpZEluZGV4ID0gbnVsbDtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHN0YXJ0RXJyb3JDb3VudCA9IHRoaXMuZXJyb3JzLmxlbmd0aDtcclxuXHR2YXIgb2xkVW5rbm93blByb3BlcnR5UGF0aHMsIG9sZEtub3duUHJvcGVydHlQYXRocztcclxuXHRpZiAodGhpcy50cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRvbGRVbmtub3duUHJvcGVydHlQYXRocyA9IHRoaXMudW5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0XHRvbGRLbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLmtub3duUHJvcGVydHlQYXRocztcclxuXHR9XHJcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlbWEub25lT2YubGVuZ3RoOyBpKyspIHtcclxuXHRcdGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdFx0XHR0aGlzLmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdFx0fVxyXG5cdFx0dmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5vbmVPZltpXTtcclxuXHJcblx0XHR2YXIgZXJyb3JDb3VudCA9IHRoaXMuZXJyb3JzLmxlbmd0aDtcclxuXHRcdHZhciBlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgc3ViU2NoZW1hLCBbXSwgW1wib25lT2ZcIiwgaV0sIGRhdGFQb2ludGVyUGF0aCk7XHJcblxyXG5cdFx0aWYgKGVycm9yID09PSBudWxsICYmIGVycm9yQ291bnQgPT09IHRoaXMuZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRpZiAodmFsaWRJbmRleCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdHZhbGlkSW5kZXggPSBpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgc3RhcnRFcnJvckNvdW50KTtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9ORV9PRl9NVUxUSVBMRSwge2luZGV4MTogdmFsaWRJbmRleCwgaW5kZXgyOiBpfSwgXCJcIiwgXCIvb25lT2ZcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy50cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRcdFx0Zm9yICh2YXIga25vd25LZXkgaW4gdGhpcy5rbm93blByb3BlcnR5UGF0aHMpIHtcclxuXHRcdFx0XHRcdG9sZEtub3duUHJvcGVydHlQYXRoc1trbm93bktleV0gPSB0cnVlO1xyXG5cdFx0XHRcdFx0ZGVsZXRlIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzW2tub3duS2V5XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Zm9yICh2YXIgdW5rbm93bktleSBpbiB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzKSB7XHJcblx0XHRcdFx0XHRpZiAoIW9sZEtub3duUHJvcGVydHlQYXRoc1t1bmtub3duS2V5XSkge1xyXG5cdFx0XHRcdFx0XHRvbGRVbmtub3duUHJvcGVydHlQYXRoc1t1bmtub3duS2V5XSA9IHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGVycm9yKSB7XHJcblx0XHRcdGVycm9ycy5wdXNoKGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmICh2YWxpZEluZGV4ID09PSBudWxsKSB7XHJcblx0XHRlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCkpO1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PTkVfT0ZfTUlTU0lORywge30sIFwiXCIsIFwiL29uZU9mXCIsIGVycm9ycywgZGF0YSwgc2NoZW1hKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTm90ID0gZnVuY3Rpb24gdmFsaWRhdGVOb3QoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHRpZiAoc2NoZW1hLm5vdCA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIG9sZEVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzLCBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0b2xkVW5rbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzID0gdGhpcy5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0XHR0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHR0aGlzLmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdH1cclxuXHR2YXIgZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGEsIHNjaGVtYS5ub3QsIG51bGwsIG51bGwsIGRhdGFQb2ludGVyUGF0aCk7XHJcblx0dmFyIG5vdEVycm9ycyA9IHRoaXMuZXJyb3JzLnNsaWNlKG9sZEVycm9yQ291bnQpO1xyXG5cdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgb2xkRXJyb3JDb3VudCk7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmIChlcnJvciA9PT0gbnVsbCAmJiBub3RFcnJvcnMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5PVF9QQVNTRUQsIHt9LCBcIlwiLCBcIi9ub3RcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUh5cGVybWVkaWEgPSBmdW5jdGlvbiB2YWxpZGF0ZUNvbWJpbmF0aW9ucyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICghc2NoZW1hLmxpbmtzKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9yO1xyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hLmxpbmtzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgbGRvID0gc2NoZW1hLmxpbmtzW2ldO1xyXG5cdFx0aWYgKGxkby5yZWwgPT09IFwiZGVzY3JpYmVkYnlcIikge1xyXG5cdFx0XHR2YXIgdGVtcGxhdGUgPSBuZXcgVXJpVGVtcGxhdGUobGRvLmhyZWYpO1xyXG5cdFx0XHR2YXIgYWxsUHJlc2VudCA9IHRydWU7XHJcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdGVtcGxhdGUudmFyTmFtZXMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRpZiAoISh0ZW1wbGF0ZS52YXJOYW1lc1tqXSBpbiBkYXRhKSkge1xyXG5cdFx0XHRcdFx0YWxsUHJlc2VudCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChhbGxQcmVzZW50KSB7XHJcblx0XHRcdFx0dmFyIHNjaGVtYVVybCA9IHRlbXBsYXRlLmZpbGxGcm9tT2JqZWN0KGRhdGEpO1xyXG5cdFx0XHRcdHZhciBzdWJTY2hlbWEgPSB7XCIkcmVmXCI6IHNjaGVtYVVybH07XHJcblx0XHRcdFx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhLCBzdWJTY2hlbWEsIFtdLCBbXCJsaW5rc1wiLCBpXSwgZGF0YVBvaW50ZXJQYXRoKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbi8vIHBhcnNlVVJJKCkgYW5kIHJlc29sdmVVcmwoKSBhcmUgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xMDg4ODUwXHJcbi8vICAgLSAgcmVsZWFzZWQgYXMgcHVibGljIGRvbWFpbiBieSBhdXRob3IgKFwiWWFmZmxlXCIpIC0gc2VlIGNvbW1lbnRzIG9uIGdpc3RcclxuXHJcbmZ1bmN0aW9uIHBhcnNlVVJJKHVybCkge1xyXG5cdHZhciBtID0gU3RyaW5nKHVybCkucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpLm1hdGNoKC9eKFteOlxcLz8jXSs6KT8oXFwvXFwvKD86W146QF0qKD86OlteOkBdKik/QCk/KChbXjpcXC8/I10qKSg/OjooXFxkKikpPykpPyhbXj8jXSopKFxcP1teI10qKT8oI1tcXHNcXFNdKik/Lyk7XHJcblx0Ly8gYXV0aG9yaXR5ID0gJy8vJyArIHVzZXIgKyAnOicgKyBwYXNzICdAJyArIGhvc3RuYW1lICsgJzonIHBvcnRcclxuXHRyZXR1cm4gKG0gPyB7XHJcblx0XHRocmVmICAgICA6IG1bMF0gfHwgJycsXHJcblx0XHRwcm90b2NvbCA6IG1bMV0gfHwgJycsXHJcblx0XHRhdXRob3JpdHk6IG1bMl0gfHwgJycsXHJcblx0XHRob3N0ICAgICA6IG1bM10gfHwgJycsXHJcblx0XHRob3N0bmFtZSA6IG1bNF0gfHwgJycsXHJcblx0XHRwb3J0ICAgICA6IG1bNV0gfHwgJycsXHJcblx0XHRwYXRobmFtZSA6IG1bNl0gfHwgJycsXHJcblx0XHRzZWFyY2ggICA6IG1bN10gfHwgJycsXHJcblx0XHRoYXNoICAgICA6IG1bOF0gfHwgJydcclxuXHR9IDogbnVsbCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVVcmwoYmFzZSwgaHJlZikgey8vIFJGQyAzOTg2XHJcblxyXG5cdGZ1bmN0aW9uIHJlbW92ZURvdFNlZ21lbnRzKGlucHV0KSB7XHJcblx0XHR2YXIgb3V0cHV0ID0gW107XHJcblx0XHRpbnB1dC5yZXBsYWNlKC9eKFxcLlxcLj8oXFwvfCQpKSsvLCAnJylcclxuXHRcdFx0LnJlcGxhY2UoL1xcLyhcXC4oXFwvfCQpKSsvZywgJy8nKVxyXG5cdFx0XHQucmVwbGFjZSgvXFwvXFwuXFwuJC8sICcvLi4vJylcclxuXHRcdFx0LnJlcGxhY2UoL1xcLz9bXlxcL10qL2csIGZ1bmN0aW9uIChwKSB7XHJcblx0XHRcdFx0aWYgKHAgPT09ICcvLi4nKSB7XHJcblx0XHRcdFx0XHRvdXRwdXQucG9wKCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHApO1xyXG5cdFx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKS5yZXBsYWNlKC9eXFwvLywgaW5wdXQuY2hhckF0KDApID09PSAnLycgPyAnLycgOiAnJyk7XHJcblx0fVxyXG5cclxuXHRocmVmID0gcGFyc2VVUkkoaHJlZiB8fCAnJyk7XHJcblx0YmFzZSA9IHBhcnNlVVJJKGJhc2UgfHwgJycpO1xyXG5cclxuXHRyZXR1cm4gIWhyZWYgfHwgIWJhc2UgPyBudWxsIDogKGhyZWYucHJvdG9jb2wgfHwgYmFzZS5wcm90b2NvbCkgK1xyXG5cdFx0KGhyZWYucHJvdG9jb2wgfHwgaHJlZi5hdXRob3JpdHkgPyBocmVmLmF1dGhvcml0eSA6IGJhc2UuYXV0aG9yaXR5KSArXHJcblx0XHRyZW1vdmVEb3RTZWdtZW50cyhocmVmLnByb3RvY29sIHx8IGhyZWYuYXV0aG9yaXR5IHx8IGhyZWYucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycgPyBocmVmLnBhdGhuYW1lIDogKGhyZWYucGF0aG5hbWUgPyAoKGJhc2UuYXV0aG9yaXR5ICYmICFiYXNlLnBhdGhuYW1lID8gJy8nIDogJycpICsgYmFzZS5wYXRobmFtZS5zbGljZSgwLCBiYXNlLnBhdGhuYW1lLmxhc3RJbmRleE9mKCcvJykgKyAxKSArIGhyZWYucGF0aG5hbWUpIDogYmFzZS5wYXRobmFtZSkpICtcclxuXHRcdChocmVmLnByb3RvY29sIHx8IGhyZWYuYXV0aG9yaXR5IHx8IGhyZWYucGF0aG5hbWUgPyBocmVmLnNlYXJjaCA6IChocmVmLnNlYXJjaCB8fCBiYXNlLnNlYXJjaCkpICtcclxuXHRcdGhyZWYuaGFzaDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRVcmkodXJpKSB7XHJcblx0cmV0dXJuIHVyaS5zcGxpdCgnIycpWzBdO1xyXG59XHJcbmZ1bmN0aW9uIG5vcm1TY2hlbWEoc2NoZW1hLCBiYXNlVXJpKSB7XHJcblx0aWYgKHNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiKSB7XHJcblx0XHRpZiAoYmFzZVVyaSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGJhc2VVcmkgPSBzY2hlbWEuaWQ7XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzY2hlbWEuaWQgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0YmFzZVVyaSA9IHJlc29sdmVVcmwoYmFzZVVyaSwgc2NoZW1hLmlkKTtcclxuXHRcdFx0c2NoZW1hLmlkID0gYmFzZVVyaTtcclxuXHRcdH1cclxuXHRcdGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcclxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRub3JtU2NoZW1hKHNjaGVtYVtpXSwgYmFzZVVyaSk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hWyckcmVmJ10gPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRzY2hlbWFbJyRyZWYnXSA9IHJlc29sdmVVcmwoYmFzZVVyaSwgc2NoZW1hWyckcmVmJ10pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAodmFyIGtleSBpbiBzY2hlbWEpIHtcclxuXHRcdFx0XHRpZiAoa2V5ICE9PSBcImVudW1cIikge1xyXG5cdFx0XHRcdFx0bm9ybVNjaGVtYShzY2hlbWFba2V5XSwgYmFzZVVyaSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JSZXBvcnRlcihsYW5ndWFnZSkge1xyXG5cdGxhbmd1YWdlID0gbGFuZ3VhZ2UgfHwgJ2VuJztcclxuXHJcblx0dmFyIGVycm9yTWVzc2FnZXMgPSBsYW5ndWFnZXNbbGFuZ3VhZ2VdO1xyXG5cclxuXHRyZXR1cm4gZnVuY3Rpb24gKGVycm9yKSB7XHJcblx0XHR2YXIgbWVzc2FnZVRlbXBsYXRlID0gZXJyb3JNZXNzYWdlc1tlcnJvci5jb2RlXSB8fCBFcnJvck1lc3NhZ2VzRGVmYXVsdFtlcnJvci5jb2RlXTtcclxuXHRcdGlmICh0eXBlb2YgbWVzc2FnZVRlbXBsYXRlICE9PSAnc3RyaW5nJykge1xyXG5cdFx0XHRyZXR1cm4gXCJVbmtub3duIGVycm9yIGNvZGUgXCIgKyBlcnJvci5jb2RlICsgXCI6IFwiICsgSlNPTi5zdHJpbmdpZnkoZXJyb3IubWVzc2FnZVBhcmFtcyk7XHJcblx0XHR9XHJcblx0XHR2YXIgbWVzc2FnZVBhcmFtcyA9IGVycm9yLnBhcmFtcztcclxuXHRcdC8vIEFkYXB0ZWQgZnJvbSBDcm9ja2ZvcmQncyBzdXBwbGFudCgpXHJcblx0XHRyZXR1cm4gbWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoL1xceyhbXnt9XSopXFx9L2csIGZ1bmN0aW9uICh3aG9sZSwgdmFyTmFtZSkge1xyXG5cdFx0XHR2YXIgc3ViVmFsdWUgPSBtZXNzYWdlUGFyYW1zW3Zhck5hbWVdO1xyXG5cdFx0XHRyZXR1cm4gdHlwZW9mIHN1YlZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygc3ViVmFsdWUgPT09ICdudW1iZXInID8gc3ViVmFsdWUgOiB3aG9sZTtcclxuXHRcdH0pO1xyXG5cdH07XHJcbn1cclxuXHJcbnZhciBFcnJvckNvZGVzID0ge1xyXG5cdElOVkFMSURfVFlQRTogMCxcclxuXHRFTlVNX01JU01BVENIOiAxLFxyXG5cdEFOWV9PRl9NSVNTSU5HOiAxMCxcclxuXHRPTkVfT0ZfTUlTU0lORzogMTEsXHJcblx0T05FX09GX01VTFRJUExFOiAxMixcclxuXHROT1RfUEFTU0VEOiAxMyxcclxuXHQvLyBOdW1lcmljIGVycm9yc1xyXG5cdE5VTUJFUl9NVUxUSVBMRV9PRjogMTAwLFxyXG5cdE5VTUJFUl9NSU5JTVVNOiAxMDEsXHJcblx0TlVNQkVSX01JTklNVU1fRVhDTFVTSVZFOiAxMDIsXHJcblx0TlVNQkVSX01BWElNVU06IDEwMyxcclxuXHROVU1CRVJfTUFYSU1VTV9FWENMVVNJVkU6IDEwNCxcclxuXHROVU1CRVJfTk9UX0FfTlVNQkVSOiAxMDUsXHJcblx0Ly8gU3RyaW5nIGVycm9yc1xyXG5cdFNUUklOR19MRU5HVEhfU0hPUlQ6IDIwMCxcclxuXHRTVFJJTkdfTEVOR1RIX0xPTkc6IDIwMSxcclxuXHRTVFJJTkdfUEFUVEVSTjogMjAyLFxyXG5cdC8vIE9iamVjdCBlcnJvcnNcclxuXHRPQkpFQ1RfUFJPUEVSVElFU19NSU5JTVVNOiAzMDAsXHJcblx0T0JKRUNUX1BST1BFUlRJRVNfTUFYSU1VTTogMzAxLFxyXG5cdE9CSkVDVF9SRVFVSVJFRDogMzAyLFxyXG5cdE9CSkVDVF9BRERJVElPTkFMX1BST1BFUlRJRVM6IDMwMyxcclxuXHRPQkpFQ1RfREVQRU5ERU5DWV9LRVk6IDMwNCxcclxuXHQvLyBBcnJheSBlcnJvcnNcclxuXHRBUlJBWV9MRU5HVEhfU0hPUlQ6IDQwMCxcclxuXHRBUlJBWV9MRU5HVEhfTE9ORzogNDAxLFxyXG5cdEFSUkFZX1VOSVFVRTogNDAyLFxyXG5cdEFSUkFZX0FERElUSU9OQUxfSVRFTVM6IDQwMyxcclxuXHQvLyBDdXN0b20vdXNlci1kZWZpbmVkIGVycm9yc1xyXG5cdEZPUk1BVF9DVVNUT006IDUwMCxcclxuXHRLRVlXT1JEX0NVU1RPTTogNTAxLFxyXG5cdC8vIFNjaGVtYSBzdHJ1Y3R1cmVcclxuXHRDSVJDVUxBUl9SRUZFUkVOQ0U6IDYwMCxcclxuXHQvLyBOb24tc3RhbmRhcmQgdmFsaWRhdGlvbiBvcHRpb25zXHJcblx0VU5LTk9XTl9QUk9QRVJUWTogMTAwMFxyXG59O1xyXG52YXIgRXJyb3JDb2RlTG9va3VwID0ge307XHJcbmZvciAodmFyIGtleSBpbiBFcnJvckNvZGVzKSB7XHJcblx0RXJyb3JDb2RlTG9va3VwW0Vycm9yQ29kZXNba2V5XV0gPSBrZXk7XHJcbn1cclxudmFyIEVycm9yTWVzc2FnZXNEZWZhdWx0ID0ge1xyXG5cdElOVkFMSURfVFlQRTogXCJJbnZhbGlkIHR5cGU6IHt0eXBlfSAoZXhwZWN0ZWQge2V4cGVjdGVkfSlcIixcclxuXHRFTlVNX01JU01BVENIOiBcIk5vIGVudW0gbWF0Y2ggZm9yOiB7dmFsdWV9XCIsXHJcblx0QU5ZX09GX01JU1NJTkc6IFwiRGF0YSBkb2VzIG5vdCBtYXRjaCBhbnkgc2NoZW1hcyBmcm9tIFxcXCJhbnlPZlxcXCJcIixcclxuXHRPTkVfT0ZfTUlTU0lORzogXCJEYXRhIGRvZXMgbm90IG1hdGNoIGFueSBzY2hlbWFzIGZyb20gXFxcIm9uZU9mXFxcIlwiLFxyXG5cdE9ORV9PRl9NVUxUSVBMRTogXCJEYXRhIGlzIHZhbGlkIGFnYWluc3QgbW9yZSB0aGFuIG9uZSBzY2hlbWEgZnJvbSBcXFwib25lT2ZcXFwiOiBpbmRpY2VzIHtpbmRleDF9IGFuZCB7aW5kZXgyfVwiLFxyXG5cdE5PVF9QQVNTRUQ6IFwiRGF0YSBtYXRjaGVzIHNjaGVtYSBmcm9tIFxcXCJub3RcXFwiXCIsXHJcblx0Ly8gTnVtZXJpYyBlcnJvcnNcclxuXHROVU1CRVJfTVVMVElQTEVfT0Y6IFwiVmFsdWUge3ZhbHVlfSBpcyBub3QgYSBtdWx0aXBsZSBvZiB7bXVsdGlwbGVPZn1cIixcclxuXHROVU1CRVJfTUlOSU1VTTogXCJWYWx1ZSB7dmFsdWV9IGlzIGxlc3MgdGhhbiBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE5VTUJFUl9NSU5JTVVNX0VYQ0xVU0lWRTogXCJWYWx1ZSB7dmFsdWV9IGlzIGVxdWFsIHRvIGV4Y2x1c2l2ZSBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE5VTUJFUl9NQVhJTVVNOiBcIlZhbHVlIHt2YWx1ZX0gaXMgZ3JlYXRlciB0aGFuIG1heGltdW0ge21heGltdW19XCIsXHJcblx0TlVNQkVSX01BWElNVU1fRVhDTFVTSVZFOiBcIlZhbHVlIHt2YWx1ZX0gaXMgZXF1YWwgdG8gZXhjbHVzaXZlIG1heGltdW0ge21heGltdW19XCIsXHJcblx0TlVNQkVSX05PVF9BX05VTUJFUjogXCJWYWx1ZSB7dmFsdWV9IGlzIG5vdCBhIHZhbGlkIG51bWJlclwiLFxyXG5cdC8vIFN0cmluZyBlcnJvcnNcclxuXHRTVFJJTkdfTEVOR1RIX1NIT1JUOiBcIlN0cmluZyBpcyB0b28gc2hvcnQgKHtsZW5ndGh9IGNoYXJzKSwgbWluaW11bSB7bWluaW11bX1cIixcclxuXHRTVFJJTkdfTEVOR1RIX0xPTkc6IFwiU3RyaW5nIGlzIHRvbyBsb25nICh7bGVuZ3RofSBjaGFycyksIG1heGltdW0ge21heGltdW19XCIsXHJcblx0U1RSSU5HX1BBVFRFUk46IFwiU3RyaW5nIGRvZXMgbm90IG1hdGNoIHBhdHRlcm46IHtwYXR0ZXJufVwiLFxyXG5cdC8vIE9iamVjdCBlcnJvcnNcclxuXHRPQkpFQ1RfUFJPUEVSVElFU19NSU5JTVVNOiBcIlRvbyBmZXcgcHJvcGVydGllcyBkZWZpbmVkICh7cHJvcGVydHlDb3VudH0pLCBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE9CSkVDVF9QUk9QRVJUSUVTX01BWElNVU06IFwiVG9vIG1hbnkgcHJvcGVydGllcyBkZWZpbmVkICh7cHJvcGVydHlDb3VudH0pLCBtYXhpbXVtIHttYXhpbXVtfVwiLFxyXG5cdE9CSkVDVF9SRVFVSVJFRDogXCJNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5OiB7a2V5fVwiLFxyXG5cdE9CSkVDVF9BRERJVElPTkFMX1BST1BFUlRJRVM6IFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG5vdCBhbGxvd2VkXCIsXHJcblx0T0JKRUNUX0RFUEVOREVOQ1lfS0VZOiBcIkRlcGVuZGVuY3kgZmFpbGVkIC0ga2V5IG11c3QgZXhpc3Q6IHttaXNzaW5nfSAoZHVlIHRvIGtleToge2tleX0pXCIsXHJcblx0Ly8gQXJyYXkgZXJyb3JzXHJcblx0QVJSQVlfTEVOR1RIX1NIT1JUOiBcIkFycmF5IGlzIHRvbyBzaG9ydCAoe2xlbmd0aH0pLCBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdEFSUkFZX0xFTkdUSF9MT05HOiBcIkFycmF5IGlzIHRvbyBsb25nICh7bGVuZ3RofSksIG1heGltdW0ge21heGltdW19XCIsXHJcblx0QVJSQVlfVU5JUVVFOiBcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlIChpbmRpY2VzIHttYXRjaDF9IGFuZCB7bWF0Y2gyfSlcIixcclxuXHRBUlJBWV9BRERJVElPTkFMX0lURU1TOiBcIkFkZGl0aW9uYWwgaXRlbXMgbm90IGFsbG93ZWRcIixcclxuXHQvLyBGb3JtYXQgZXJyb3JzXHJcblx0Rk9STUFUX0NVU1RPTTogXCJGb3JtYXQgdmFsaWRhdGlvbiBmYWlsZWQgKHttZXNzYWdlfSlcIixcclxuXHRLRVlXT1JEX0NVU1RPTTogXCJLZXl3b3JkIGZhaWxlZDoge2tleX0gKHttZXNzYWdlfSlcIixcclxuXHQvLyBTY2hlbWEgc3RydWN0dXJlXHJcblx0Q0lSQ1VMQVJfUkVGRVJFTkNFOiBcIkNpcmN1bGFyICRyZWZzOiB7dXJsc31cIixcclxuXHQvLyBOb24tc3RhbmRhcmQgdmFsaWRhdGlvbiBvcHRpb25zXHJcblx0VU5LTk9XTl9QUk9QRVJUWTogXCJVbmtub3duIHByb3BlcnR5IChub3QgaW4gc2NoZW1hKVwiXHJcbn07XHJcblxyXG5mdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3IoY29kZSwgcGFyYW1zLCBkYXRhUGF0aCwgc2NoZW1hUGF0aCwgc3ViRXJyb3JzKSB7XHJcblx0RXJyb3IuY2FsbCh0aGlzKTtcclxuXHRpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiTm8gZXJyb3IgY29kZSBzdXBwbGllZDogXCIgKyBzY2hlbWFQYXRoKTtcclxuXHR9XHJcblx0dGhpcy5tZXNzYWdlID0gJyc7XHJcblx0dGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcblx0dGhpcy5jb2RlID0gY29kZTtcclxuXHR0aGlzLmRhdGFQYXRoID0gZGF0YVBhdGggfHwgXCJcIjtcclxuXHR0aGlzLnNjaGVtYVBhdGggPSBzY2hlbWFQYXRoIHx8IFwiXCI7XHJcblx0dGhpcy5zdWJFcnJvcnMgPSBzdWJFcnJvcnMgfHwgbnVsbDtcclxuXHJcblx0dmFyIGVyciA9IG5ldyBFcnJvcih0aGlzLm1lc3NhZ2UpO1xyXG5cdHRoaXMuc3RhY2sgPSBlcnIuc3RhY2sgfHwgZXJyLnN0YWNrdHJhY2U7XHJcblx0aWYgKCF0aGlzLnN0YWNrKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR0aHJvdyBlcnI7XHJcblx0XHR9XHJcblx0XHRjYXRjaChlcnIpIHtcclxuXHRcdFx0dGhpcy5zdGFjayA9IGVyci5zdGFjayB8fCBlcnIuc3RhY2t0cmFjZTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZhbGlkYXRpb25FcnJvcjtcclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZS5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcic7XHJcblxyXG5WYWxpZGF0aW9uRXJyb3IucHJvdG90eXBlLnByZWZpeFdpdGggPSBmdW5jdGlvbiAoZGF0YVByZWZpeCwgc2NoZW1hUHJlZml4KSB7XHJcblx0aWYgKGRhdGFQcmVmaXggIT09IG51bGwpIHtcclxuXHRcdGRhdGFQcmVmaXggPSBkYXRhUHJlZml4LnJlcGxhY2UoL34vZywgXCJ+MFwiKS5yZXBsYWNlKC9cXC8vZywgXCJ+MVwiKTtcclxuXHRcdHRoaXMuZGF0YVBhdGggPSBcIi9cIiArIGRhdGFQcmVmaXggKyB0aGlzLmRhdGFQYXRoO1xyXG5cdH1cclxuXHRpZiAoc2NoZW1hUHJlZml4ICE9PSBudWxsKSB7XHJcblx0XHRzY2hlbWFQcmVmaXggPSBzY2hlbWFQcmVmaXgucmVwbGFjZSgvfi9nLCBcIn4wXCIpLnJlcGxhY2UoL1xcLy9nLCBcIn4xXCIpO1xyXG5cdFx0dGhpcy5zY2hlbWFQYXRoID0gXCIvXCIgKyBzY2hlbWFQcmVmaXggKyB0aGlzLnNjaGVtYVBhdGg7XHJcblx0fVxyXG5cdGlmICh0aGlzLnN1YkVycm9ycyAhPT0gbnVsbCkge1xyXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YkVycm9ycy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR0aGlzLnN1YkVycm9yc1tpXS5wcmVmaXhXaXRoKGRhdGFQcmVmaXgsIHNjaGVtYVByZWZpeCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gaXNUcnVzdGVkVXJsKGJhc2VVcmwsIHRlc3RVcmwpIHtcclxuXHRpZih0ZXN0VXJsLnN1YnN0cmluZygwLCBiYXNlVXJsLmxlbmd0aCkgPT09IGJhc2VVcmwpe1xyXG5cdFx0dmFyIHJlbWFpbmRlciA9IHRlc3RVcmwuc3Vic3RyaW5nKGJhc2VVcmwubGVuZ3RoKTtcclxuXHRcdGlmICgodGVzdFVybC5sZW5ndGggPiAwICYmIHRlc3RVcmwuY2hhckF0KGJhc2VVcmwubGVuZ3RoIC0gMSkgPT09IFwiL1wiKVxyXG5cdFx0XHR8fCByZW1haW5kZXIuY2hhckF0KDApID09PSBcIiNcIlxyXG5cdFx0XHR8fCByZW1haW5kZXIuY2hhckF0KDApID09PSBcIj9cIikge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG52YXIgbGFuZ3VhZ2VzID0ge307XHJcbmZ1bmN0aW9uIGNyZWF0ZUFwaShsYW5ndWFnZSkge1xyXG5cdHZhciBnbG9iYWxDb250ZXh0ID0gbmV3IFZhbGlkYXRvckNvbnRleHQoKTtcclxuXHR2YXIgY3VycmVudExhbmd1YWdlO1xyXG5cdHZhciBjdXN0b21FcnJvclJlcG9ydGVyO1xyXG5cdHZhciBhcGkgPSB7XHJcblx0XHRzZXRFcnJvclJlcG9ydGVyOiBmdW5jdGlvbiAocmVwb3J0ZXIpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiByZXBvcnRlciA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5sYW5ndWFnZShyZXBvcnRlcik7XHJcblx0XHRcdH1cclxuXHRcdFx0Y3VzdG9tRXJyb3JSZXBvcnRlciA9IHJlcG9ydGVyO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHRhZGRGb3JtYXQ6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5hZGRGb3JtYXQuYXBwbHkoZ2xvYmFsQ29udGV4dCwgYXJndW1lbnRzKTtcclxuXHRcdH0sXHJcblx0XHRsYW5ndWFnZTogZnVuY3Rpb24gKGNvZGUpIHtcclxuXHRcdFx0aWYgKCFjb2RlKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRMYW5ndWFnZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIWxhbmd1YWdlc1tjb2RlXSkge1xyXG5cdFx0XHRcdGNvZGUgPSBjb2RlLnNwbGl0KCctJylbMF07IC8vIGZhbGwgYmFjayB0byBiYXNlIGxhbmd1YWdlXHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGxhbmd1YWdlc1tjb2RlXSkge1xyXG5cdFx0XHRcdGN1cnJlbnRMYW5ndWFnZSA9IGNvZGU7XHJcblx0XHRcdFx0cmV0dXJuIGNvZGU7IC8vIHNvIHlvdSBjYW4gdGVsbCBpZiBmYWxsLWJhY2sgaGFzIGhhcHBlbmVkXHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fSxcclxuXHRcdGFkZExhbmd1YWdlOiBmdW5jdGlvbiAoY29kZSwgbWVzc2FnZU1hcCkge1xyXG5cdFx0XHR2YXIga2V5O1xyXG5cdFx0XHRmb3IgKGtleSBpbiBFcnJvckNvZGVzKSB7XHJcblx0XHRcdFx0aWYgKG1lc3NhZ2VNYXBba2V5XSAmJiAhbWVzc2FnZU1hcFtFcnJvckNvZGVzW2tleV1dKSB7XHJcblx0XHRcdFx0XHRtZXNzYWdlTWFwW0Vycm9yQ29kZXNba2V5XV0gPSBtZXNzYWdlTWFwW2tleV07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHZhciByb290Q29kZSA9IGNvZGUuc3BsaXQoJy0nKVswXTtcclxuXHRcdFx0aWYgKCFsYW5ndWFnZXNbcm9vdENvZGVdKSB7IC8vIHVzZSBmb3IgYmFzZSBsYW5ndWFnZSBpZiBub3QgeWV0IGRlZmluZWRcclxuXHRcdFx0XHRsYW5ndWFnZXNbY29kZV0gPSBtZXNzYWdlTWFwO1xyXG5cdFx0XHRcdGxhbmd1YWdlc1tyb290Q29kZV0gPSBtZXNzYWdlTWFwO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGxhbmd1YWdlc1tjb2RlXSA9IE9iamVjdC5jcmVhdGUobGFuZ3VhZ2VzW3Jvb3RDb2RlXSk7XHJcblx0XHRcdFx0Zm9yIChrZXkgaW4gbWVzc2FnZU1hcCkge1xyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBsYW5ndWFnZXNbcm9vdENvZGVdW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XHJcblx0XHRcdFx0XHRcdGxhbmd1YWdlc1tyb290Q29kZV1ba2V5XSA9IG1lc3NhZ2VNYXBba2V5XTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxhbmd1YWdlc1tjb2RlXVtrZXldID0gbWVzc2FnZU1hcFtrZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdH0sXHJcblx0XHRmcmVzaEFwaTogZnVuY3Rpb24gKGxhbmd1YWdlKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSBjcmVhdGVBcGkoKTtcclxuXHRcdFx0aWYgKGxhbmd1YWdlKSB7XHJcblx0XHRcdFx0cmVzdWx0Lmxhbmd1YWdlKGxhbmd1YWdlKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fSxcclxuXHRcdHZhbGlkYXRlOiBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dmFyIGRlZiA9IGRlZmF1bHRFcnJvclJlcG9ydGVyKGN1cnJlbnRMYW5ndWFnZSk7XHJcblx0XHRcdHZhciBlcnJvclJlcG9ydGVyID0gY3VzdG9tRXJyb3JSZXBvcnRlciA/IGZ1bmN0aW9uIChlcnJvciwgZGF0YSwgc2NoZW1hKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1c3RvbUVycm9yUmVwb3J0ZXIoZXJyb3IsIGRhdGEsIHNjaGVtYSkgfHwgZGVmKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9IDogZGVmO1xyXG5cdFx0XHR2YXIgY29udGV4dCA9IG5ldyBWYWxpZGF0b3JDb250ZXh0KGdsb2JhbENvbnRleHQsIGZhbHNlLCBlcnJvclJlcG9ydGVyLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpO1xyXG5cdFx0XHRpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdHNjaGVtYSA9IHtcIiRyZWZcIjogc2NoZW1hfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb250ZXh0LmFkZFNjaGVtYShcIlwiLCBzY2hlbWEpO1xyXG5cdFx0XHR2YXIgZXJyb3IgPSBjb250ZXh0LnZhbGlkYXRlQWxsKGRhdGEsIHNjaGVtYSwgbnVsbCwgbnVsbCwgXCJcIik7XHJcblx0XHRcdGlmICghZXJyb3IgJiYgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHRlcnJvciA9IGNvbnRleHQuYmFuVW5rbm93blByb3BlcnRpZXMoZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmVycm9yID0gZXJyb3I7XHJcblx0XHRcdHRoaXMubWlzc2luZyA9IGNvbnRleHQubWlzc2luZztcclxuXHRcdFx0dGhpcy52YWxpZCA9IChlcnJvciA9PT0gbnVsbCk7XHJcblx0XHRcdHJldHVybiB0aGlzLnZhbGlkO1xyXG5cdFx0fSxcclxuXHRcdHZhbGlkYXRlUmVzdWx0OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZCA/ICd2YWxpZCcgOiB0aGlzLmVycm9yLm1lc3NhZ2U7XHJcblx0XHRcdH19O1xyXG5cdFx0XHR0aGlzLnZhbGlkYXRlLmFwcGx5KHJlc3VsdCwgYXJndW1lbnRzKTtcclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdH0sXHJcblx0XHR2YWxpZGF0ZU11bHRpcGxlOiBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dmFyIGRlZiA9IGRlZmF1bHRFcnJvclJlcG9ydGVyKGN1cnJlbnRMYW5ndWFnZSk7XHJcblx0XHRcdHZhciBlcnJvclJlcG9ydGVyID0gY3VzdG9tRXJyb3JSZXBvcnRlciA/IGZ1bmN0aW9uIChlcnJvciwgZGF0YSwgc2NoZW1hKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1c3RvbUVycm9yUmVwb3J0ZXIoZXJyb3IsIGRhdGEsIHNjaGVtYSkgfHwgZGVmKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9IDogZGVmO1xyXG5cdFx0XHR2YXIgY29udGV4dCA9IG5ldyBWYWxpZGF0b3JDb250ZXh0KGdsb2JhbENvbnRleHQsIHRydWUsIGVycm9yUmVwb3J0ZXIsIGNoZWNrUmVjdXJzaXZlLCBiYW5Vbmtub3duUHJvcGVydGllcyk7XHJcblx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XHJcblx0XHRcdFx0c2NoZW1hID0ge1wiJHJlZlwiOiBzY2hlbWF9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnRleHQuYWRkU2NoZW1hKFwiXCIsIHNjaGVtYSk7XHJcblx0XHRcdGNvbnRleHQudmFsaWRhdGVBbGwoZGF0YSwgc2NoZW1hLCBudWxsLCBudWxsLCBcIlwiKTtcclxuXHRcdFx0aWYgKGJhblVua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRcdFx0Y29udGV4dC5iYW5Vbmtub3duUHJvcGVydGllcyhkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhciByZXN1bHQgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZCA/ICd2YWxpZCcgOiB0aGlzLmVycm9yLm1lc3NhZ2U7XHJcblx0XHRcdH19O1xyXG5cdFx0XHRyZXN1bHQuZXJyb3JzID0gY29udGV4dC5lcnJvcnM7XHJcblx0XHRcdHJlc3VsdC5taXNzaW5nID0gY29udGV4dC5taXNzaW5nO1xyXG5cdFx0XHRyZXN1bHQudmFsaWQgPSAocmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDApO1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fSxcclxuXHRcdGFkZFNjaGVtYTogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRyZXR1cm4gZ2xvYmFsQ29udGV4dC5hZGRTY2hlbWEuYXBwbHkoZ2xvYmFsQ29udGV4dCwgYXJndW1lbnRzKTtcclxuXHRcdH0sXHJcblx0XHRnZXRTY2hlbWE6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIGdsb2JhbENvbnRleHQuZ2V0U2NoZW1hLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0Z2V0U2NoZW1hTWFwOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJldHVybiBnbG9iYWxDb250ZXh0LmdldFNjaGVtYU1hcC5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGdldFNjaGVtYVVyaXM6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIGdsb2JhbENvbnRleHQuZ2V0U2NoZW1hVXJpcy5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGdldE1pc3NpbmdVcmlzOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJldHVybiBnbG9iYWxDb250ZXh0LmdldE1pc3NpbmdVcmlzLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0ZHJvcFNjaGVtYXM6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5kcm9wU2NoZW1hcy5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGRlZmluZUtleXdvcmQ6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5kZWZpbmVLZXl3b3JkLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0ZGVmaW5lRXJyb3I6IGZ1bmN0aW9uIChjb2RlTmFtZSwgY29kZU51bWJlciwgZGVmYXVsdE1lc3NhZ2UpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiBjb2RlTmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW0EtWl0rKF9bQS1aXSspKiQvLnRlc3QoY29kZU5hbWUpKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDb2RlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBpbiBVUFBFUl9DQVNFX1dJVEhfVU5ERVJTQ09SRVMnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodHlwZW9mIGNvZGVOdW1iZXIgIT09ICdudW1iZXInIHx8IGNvZGVOdW1iZXIlMSAhPT0gMCB8fCBjb2RlTnVtYmVyIDwgMTAwMDApIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvZGUgbnVtYmVyIG11c3QgYmUgYW4gaW50ZWdlciA+IDEwMDAwJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHR5cGVvZiBFcnJvckNvZGVzW2NvZGVOYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGFscmVhZHkgZGVmaW5lZDogJyArIGNvZGVOYW1lICsgJyBhcyAnICsgRXJyb3JDb2Rlc1tjb2RlTmFtZV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0eXBlb2YgRXJyb3JDb2RlTG9va3VwW2NvZGVOdW1iZXJdICE9PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignRXJyb3IgY29kZSBhbHJlYWR5IHVzZWQ6ICcgKyBFcnJvckNvZGVMb29rdXBbY29kZU51bWJlcl0gKyAnIGFzICcgKyBjb2RlTnVtYmVyKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRFcnJvckNvZGVzW2NvZGVOYW1lXSA9IGNvZGVOdW1iZXI7XHJcblx0XHRcdEVycm9yQ29kZUxvb2t1cFtjb2RlTnVtYmVyXSA9IGNvZGVOYW1lO1xyXG5cdFx0XHRFcnJvck1lc3NhZ2VzRGVmYXVsdFtjb2RlTmFtZV0gPSBFcnJvck1lc3NhZ2VzRGVmYXVsdFtjb2RlTnVtYmVyXSA9IGRlZmF1bHRNZXNzYWdlO1xyXG5cdFx0XHRmb3IgKHZhciBsYW5nQ29kZSBpbiBsYW5ndWFnZXMpIHtcclxuXHRcdFx0XHR2YXIgbGFuZ3VhZ2UgPSBsYW5ndWFnZXNbbGFuZ0NvZGVdO1xyXG5cdFx0XHRcdGlmIChsYW5ndWFnZVtjb2RlTmFtZV0pIHtcclxuXHRcdFx0XHRcdGxhbmd1YWdlW2NvZGVOdW1iZXJdID0gbGFuZ3VhZ2VbY29kZU51bWJlcl0gfHwgbGFuZ3VhZ2VbY29kZU5hbWVdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGdsb2JhbENvbnRleHQucmVzZXQoKTtcclxuXHRcdFx0dGhpcy5lcnJvciA9IG51bGw7XHJcblx0XHRcdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdFx0XHR0aGlzLnZhbGlkID0gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHRtaXNzaW5nOiBbXSxcclxuXHRcdGVycm9yOiBudWxsLFxyXG5cdFx0dmFsaWQ6IHRydWUsXHJcblx0XHRub3JtU2NoZW1hOiBub3JtU2NoZW1hLFxyXG5cdFx0cmVzb2x2ZVVybDogcmVzb2x2ZVVybCxcclxuXHRcdGdldERvY3VtZW50VXJpOiBnZXREb2N1bWVudFVyaSxcclxuXHRcdGVycm9yQ29kZXM6IEVycm9yQ29kZXNcclxuXHR9O1xyXG5cdGFwaS5sYW5ndWFnZShsYW5ndWFnZSB8fCAnZW4nKTtcclxuXHRyZXR1cm4gYXBpO1xyXG59XHJcblxyXG52YXIgdHY0ID0gY3JlYXRlQXBpKCk7XHJcbnR2NC5hZGRMYW5ndWFnZSgnZW4tZ2InLCBFcnJvck1lc3NhZ2VzRGVmYXVsdCk7XHJcblxyXG4vL2xlZ2FjeSBwcm9wZXJ0eVxyXG50djQudHY0ID0gdHY0O1xyXG5cclxucmV0dXJuIHR2NDsgLy8gdXNlZCBieSBfaGVhZGVyLmpzIHRvIGdsb2JhbGlzZS5cclxuXHJcbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///87\n')},function(module,exports,__webpack_require__){eval("module.exports = !__webpack_require__(9) && !__webpack_require__(3)(function () {\n return Object.defineProperty(__webpack_require__(60)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcz9jNjlhIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///88\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(2);\nvar core = __webpack_require__(10);\nvar LIBRARY = __webpack_require__(31);\nvar wksExt = __webpack_require__(61);\nvar defineProperty = __webpack_require__(8).f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MtZGVmaW5lLmpzPzNhNzIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZiAobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSkgZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwgeyB2YWx1ZTogd2tzRXh0LmYobmFtZSkgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///89\n")},function(module,exports,__webpack_require__){eval("var has = __webpack_require__(14);\nvar toIObject = __webpack_require__(16);\nvar arrayIndexOf = __webpack_require__(49)(false);\nvar IE_PROTO = __webpack_require__(62)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy1pbnRlcm5hbC5qcz9jZTEwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgSUVfUFJPVE8gPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIE8pIGlmIChrZXkgIT0gSUVfUFJPVE8pIGhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIGlmIChoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///90\n")},function(module,exports,__webpack_require__){eval("var dP = __webpack_require__(8);\nvar anObject = __webpack_require__(4);\nvar getKeys = __webpack_require__(32);\n\nmodule.exports = __webpack_require__(9) ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzPzE0OTUiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpIHtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKTtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICB2YXIgaSA9IDA7XG4gIHZhciBQO1xuICB3aGlsZSAobGVuZ3RoID4gaSkgZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///91\n")},function(module,exports,__webpack_require__){eval("// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = __webpack_require__(16);\nvar gOPN = __webpack_require__(35).f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanM/N2JiYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///92\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = __webpack_require__(32);\nvar gOPS = __webpack_require__(50);\nvar pIE = __webpack_require__(45);\nvar toObject = __webpack_require__(12);\nvar IObject = __webpack_require__(44);\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(3)(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzPzczMzMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBTID0gU3ltYm9sKCk7XG4gIHZhciBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICB2YXIgaXNFbnVtID0gcElFLmY7XG4gIHdoaWxlIChhTGVuID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSBpZiAoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSkgVFtrZXldID0gU1trZXldO1xuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///93\n")},function(module,exports){eval("// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zYW1lLXZhbHVlLmpzPzgzYTEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gNy4yLjkgU2FtZVZhbHVlKHgsIHkpXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5pcyB8fCBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgcmV0dXJuIHggPT09IHkgPyB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geSA6IHggIT0geCAmJiB5ICE9IHk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///94\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar aFunction = __webpack_require__(23);\nvar isObject = __webpack_require__(5);\nvar invoke = __webpack_require__(96);\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19iaW5kLmpzP2YwYzEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGludm9rZSA9IHJlcXVpcmUoJy4vX2ludm9rZScpO1xudmFyIGFycmF5U2xpY2UgPSBbXS5zbGljZTtcbnZhciBmYWN0b3JpZXMgPSB7fTtcblxudmFyIGNvbnN0cnVjdCA9IGZ1bmN0aW9uIChGLCBsZW4sIGFyZ3MpIHtcbiAgaWYgKCEobGVuIGluIGZhY3RvcmllcykpIHtcbiAgICBmb3IgKHZhciBuID0gW10sIGkgPSAwOyBpIDwgbGVuOyBpKyspIG5baV0gPSAnYVsnICsgaSArICddJztcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICBmYWN0b3JpZXNbbGVuXSA9IEZ1bmN0aW9uKCdGLGEnLCAncmV0dXJuIG5ldyBGKCcgKyBuLmpvaW4oJywnKSArICcpJyk7XG4gIH0gcmV0dXJuIGZhY3Rvcmllc1tsZW5dKEYsIGFyZ3MpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBGdW5jdGlvbi5iaW5kIHx8IGZ1bmN0aW9uIGJpbmQodGhhdCAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgdmFyIGZuID0gYUZ1bmN0aW9uKHRoaXMpO1xuICB2YXIgcGFydEFyZ3MgPSBhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGJvdW5kID0gZnVuY3Rpb24gKC8qIGFyZ3MuLi4gKi8pIHtcbiAgICB2YXIgYXJncyA9IHBhcnRBcmdzLmNvbmNhdChhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBib3VuZCA/IGNvbnN0cnVjdChmbiwgYXJncy5sZW5ndGgsIGFyZ3MpIDogaW52b2tlKGZuLCBhcmdzLCB0aGF0KTtcbiAgfTtcbiAgaWYgKGlzT2JqZWN0KGZuLnByb3RvdHlwZSkpIGJvdW5kLnByb3RvdHlwZSA9IGZuLnByb3RvdHlwZTtcbiAgcmV0dXJuIGJvdW5kO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///95\n")},function(module,exports){eval("// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pbnZva2UuanM/MzFmNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///96\n")},function(module,exports,__webpack_require__){eval("var $parseInt = __webpack_require__(2).parseInt;\nvar $trim = __webpack_require__(51).trim;\nvar ws = __webpack_require__(67);\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n var string = $trim(String(str), 3);\n return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wYXJzZS1pbnQuanM/M2NhNSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VJbnQ7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG52YXIgd3MgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKTtcbnZhciBoZXggPSAvXlstK10/MFt4WF0vO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICRwYXJzZUludCh3cyArICcwOCcpICE9PSA4IHx8ICRwYXJzZUludCh3cyArICcweDE2JykgIT09IDIyID8gZnVuY3Rpb24gcGFyc2VJbnQoc3RyLCByYWRpeCkge1xuICB2YXIgc3RyaW5nID0gJHRyaW0oU3RyaW5nKHN0ciksIDMpO1xuICByZXR1cm4gJHBhcnNlSW50KHN0cmluZywgKHJhZGl4ID4+PiAwKSB8fCAoaGV4LnRlc3Qoc3RyaW5nKSA/IDE2IDogMTApKTtcbn0gOiAkcGFyc2VJbnQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///97\n")},function(module,exports,__webpack_require__){eval("var $parseFloat = __webpack_require__(2).parseFloat;\nvar $trim = __webpack_require__(51).trim;\n\nmodule.exports = 1 / $parseFloat(__webpack_require__(67) + '-0') !== -Infinity ? function parseFloat(str) {\n var string = $trim(String(str), 3);\n var result = $parseFloat(string);\n return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : $parseFloat;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wYXJzZS1mbG9hdC5qcz9kNzUyIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLnBhcnNlRmxvYXQ7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG5cbm1vZHVsZS5leHBvcnRzID0gMSAvICRwYXJzZUZsb2F0KHJlcXVpcmUoJy4vX3N0cmluZy13cycpICsgJy0wJykgIT09IC1JbmZpbml0eSA/IGZ1bmN0aW9uIHBhcnNlRmxvYXQoc3RyKSB7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMyk7XG4gIHZhciByZXN1bHQgPSAkcGFyc2VGbG9hdChzdHJpbmcpO1xuICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHN0cmluZy5jaGFyQXQoMCkgPT0gJy0nID8gLTAgOiByZXN1bHQ7XG59IDogJHBhcnNlRmxvYXQ7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///98\n")},function(module,exports,__webpack_require__){eval("var cof = __webpack_require__(24);\nmodule.exports = function (it, msg) {\n if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);\n return +it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLW51bWJlci12YWx1ZS5qcz9iZWY5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBtc2cpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnbnVtYmVyJyAmJiBjb2YoaXQpICE9ICdOdW1iZXInKSB0aHJvdyBUeXBlRXJyb3IobXNnKTtcbiAgcmV0dXJuICtpdDtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///99\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.3 Number.isInteger(number)\nvar isObject = __webpack_require__(5);\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtaW50ZWdlci5qcz85YzEyIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///100\n")},function(module,exports){eval("// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1sb2cxcC5qcz9kNmM2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGgubG9nMXAgfHwgZnVuY3Rpb24gbG9nMXAoeCkge1xuICByZXR1cm4gKHggPSAreCkgPiAtMWUtOCAmJiB4IDwgMWUtOCA/IHggLSB4ICogeCAvIDIgOiBNYXRoLmxvZygxICsgeCk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///101\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar create = __webpack_require__(34);\nvar descriptor = __webpack_require__(29);\nvar setToStringTag = __webpack_require__(38);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(15)(IteratorPrototype, __webpack_require__(6)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanM/NDFhMCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGRlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19oaWRlJykoSXRlcmF0b3JQcm90b3R5cGUsIHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpIHtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCkgfSk7XG4gIHNldFRvU3RyaW5nVGFnKENvbnN0cnVjdG9yLCBOQU1FICsgJyBJdGVyYXRvcicpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///102\n")},function(module,exports,__webpack_require__){eval("// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(4);\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzPzFmYTgiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihhbk9iamVjdCh2YWx1ZSlbMF0sIHZhbHVlWzFdKSA6IGZuKHZhbHVlKTtcbiAgLy8gNy40LjYgSXRlcmF0b3JDbG9zZShpdGVyYXRvciwgY29tcGxldGlvbilcbiAgfSBjYXRjaCAoZSkge1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///103\n")},function(module,exports,__webpack_require__){eval("var aFunction = __webpack_require__(23);\nvar toObject = __webpack_require__(12);\nvar IObject = __webpack_require__(44);\nvar toLength = __webpack_require__(7);\n\nmodule.exports = function (that, callbackfn, aLen, memo, isRight) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IObject(O);\n var length = toLength(O.length);\n var index = isRight ? length - 1 : 0;\n var i = isRight ? -1 : 1;\n if (aLen < 2) for (;;) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (isRight ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;isRight ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktcmVkdWNlLmpzPzdiMjMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgY2FsbGJhY2tmbiwgYUxlbiwgbWVtbywgaXNSaWdodCkge1xuICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XG4gIHZhciBPID0gdG9PYmplY3QodGhhdCk7XG4gIHZhciBzZWxmID0gSU9iamVjdChPKTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgdmFyIGluZGV4ID0gaXNSaWdodCA/IGxlbmd0aCAtIDEgOiAwO1xuICB2YXIgaSA9IGlzUmlnaHQgPyAtMSA6IDE7XG4gIGlmIChhTGVuIDwgMikgZm9yICg7Oykge1xuICAgIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgICBtZW1vID0gc2VsZltpbmRleF07XG4gICAgICBpbmRleCArPSBpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGluZGV4ICs9IGk7XG4gICAgaWYgKGlzUmlnaHQgPyBpbmRleCA8IDAgOiBsZW5ndGggPD0gaW5kZXgpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgIH1cbiAgfVxuICBmb3IgKDtpc1JpZ2h0ID8gaW5kZXggPj0gMCA6IGxlbmd0aCA+IGluZGV4OyBpbmRleCArPSBpKSBpZiAoaW5kZXggaW4gc2VsZikge1xuICAgIG1lbW8gPSBjYWxsYmFja2ZuKG1lbW8sIHNlbGZbaW5kZXhdLCBpbmRleCwgTyk7XG4gIH1cbiAgcmV0dXJuIG1lbW87XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///104\n")},function(module,exports,__webpack_require__){"use strict";eval("// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n\nvar toObject = __webpack_require__(12);\nvar toAbsoluteIndex = __webpack_require__(33);\nvar toLength = __webpack_require__(7);\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktY29weS13aXRoaW4uanM/YmE5MiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0IC8qID0gMCAqLywgc3RhcnQgLyogPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciB0byA9IHRvQWJzb2x1dGVJbmRleCh0YXJnZXQsIGxlbik7XG4gIHZhciBmcm9tID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW4pO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBjb3VudCA9IE1hdGgubWluKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbikpIC0gZnJvbSwgbGVuIC0gdG8pO1xuICB2YXIgaW5jID0gMTtcbiAgaWYgKGZyb20gPCB0byAmJiB0byA8IGZyb20gKyBjb3VudCkge1xuICAgIGluYyA9IC0xO1xuICAgIGZyb20gKz0gY291bnQgLSAxO1xuICAgIHRvICs9IGNvdW50IC0gMTtcbiAgfVxuICB3aGlsZSAoY291bnQtLSA+IDApIHtcbiAgICBpZiAoZnJvbSBpbiBPKSBPW3RvXSA9IE9bZnJvbV07XG4gICAgZWxzZSBkZWxldGUgT1t0b107XG4gICAgdG8gKz0gaW5jO1xuICAgIGZyb20gKz0gaW5jO1xuICB9IHJldHVybiBPO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///105\n")},function(module,exports){eval("module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzP2Q1M2IiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///106\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar regexpExec = __webpack_require__(82);\n__webpack_require__(1)({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmV4ZWMuanM/YjBjNSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgcmVnZXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjJyk7XG5yZXF1aXJlKCcuL19leHBvcnQnKSh7XG4gIHRhcmdldDogJ1JlZ0V4cCcsXG4gIHByb3RvOiB0cnVlLFxuICBmb3JjZWQ6IHJlZ2V4cEV4ZWMgIT09IC8uLy5leGVjXG59LCB7XG4gIGV4ZWM6IHJlZ2V4cEV4ZWNcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///107\n")},function(module,exports,__webpack_require__){eval("// 21.2.5.3 get RegExp.prototype.flags()\nif (__webpack_require__(9) && /./g.flags != 'g') __webpack_require__(8).f(RegExp.prototype, 'flags', {\n configurable: true,\n get: __webpack_require__(53)\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzLmpzPzM4NDYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjEuMi41LjMgZ2V0IFJlZ0V4cC5wcm90b3R5cGUuZmxhZ3MoKVxuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgLy4vZy5mbGFncyAhPSAnZycpIHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYoUmVnRXhwLnByb3RvdHlwZSwgJ2ZsYWdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogcmVxdWlyZSgnLi9fZmxhZ3MnKVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///108\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar LIBRARY = __webpack_require__(31);\nvar global = __webpack_require__(2);\nvar ctx = __webpack_require__(22);\nvar classof = __webpack_require__(46);\nvar $export = __webpack_require__(1);\nvar isObject = __webpack_require__(5);\nvar aFunction = __webpack_require__(23);\nvar anInstance = __webpack_require__(42);\nvar forOf = __webpack_require__(56);\nvar speciesConstructor = __webpack_require__(47);\nvar task = __webpack_require__(84).set;\nvar microtask = __webpack_require__(234)();\nvar newPromiseCapabilityModule = __webpack_require__(110);\nvar perform = __webpack_require__(235);\nvar userAgent = __webpack_require__(57);\nvar promiseResolve = __webpack_require__(111);\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[__webpack_require__(6)('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = __webpack_require__(43)($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(38)($Promise, PROMISE);\n__webpack_require__(41)(PROMISE);\nWrapper = __webpack_require__(10)[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(52)(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qcz81NTFjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuL190YXNrJykuc2V0O1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuL19uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4vX3BlcmZvcm0nKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuL19wcm9taXNlLXJlc29sdmUnKTtcbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyAmJiBwcm9jZXNzLnZlcnNpb25zO1xudmFyIHY4ID0gdmVyc2lvbnMgJiYgdmVyc2lvbnMudjggfHwgJyc7XG52YXIgJFByb21pc2UgPSBnbG9iYWxbUFJPTUlTRV07XG52YXIgaXNOb2RlID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgZW1wdHkgPSBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH07XG52YXIgSW50ZXJuYWwsIG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSwgT3duUHJvbWlzZUNhcGFiaWxpdHksIFdyYXBwZXI7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIC8vIGNvcnJlY3Qgc3ViY2xhc3Npbmcgd2l0aCBAQHNwZWNpZXMgc3VwcG9ydFxuICAgIHZhciBwcm9taXNlID0gJFByb21pc2UucmVzb2x2ZSgxKTtcbiAgICB2YXIgRmFrZVByb21pc2UgPSAocHJvbWlzZS5jb25zdHJ1Y3RvciA9IHt9KVtyZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpXSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gICAgICBleGVjKGVtcHR5LCBlbXB0eSk7XG4gICAgfTtcbiAgICAvLyB1bmhhbmRsZWQgcmVqZWN0aW9ucyB0cmFja2luZyBzdXBwb3J0LCBOb2RlSlMgUHJvbWlzZSB3aXRob3V0IGl0IGZhaWxzIEBAc3BlY2llcyB0ZXN0XG4gICAgcmV0dXJuIChpc05vZGUgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICAgJiYgdXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZS82NicpID09PSAtMTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59KCk7XG5cbi8vIGhlbHBlcnNcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciB0aGVuO1xuICByZXR1cm4gaXNPYmplY3QoaXQpICYmIHR5cGVvZiAodGhlbiA9IGl0LnRoZW4pID09ICdmdW5jdGlvbicgPyB0aGVuIDogZmFsc2U7XG59O1xudmFyIG5vdGlmeSA9IGZ1bmN0aW9uIChwcm9taXNlLCBpc1JlamVjdCkge1xuICBpZiAocHJvbWlzZS5fbikgcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciBvayA9IHByb21pc2UuX3MgPT0gMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uIChyZWFjdGlvbikge1xuICAgICAgdmFyIGhhbmRsZXIgPSBvayA/IHJlYWN0aW9uLm9rIDogcmVhY3Rpb24uZmFpbDtcbiAgICAgIHZhciByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZTtcbiAgICAgIHZhciByZWplY3QgPSByZWFjdGlvbi5yZWplY3Q7XG4gICAgICB2YXIgZG9tYWluID0gcmVhY3Rpb24uZG9tYWluO1xuICAgICAgdmFyIHJlc3VsdCwgdGhlbiwgZXhpdGVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICBpZiAoIW9rKSB7XG4gICAgICAgICAgICBpZiAocHJvbWlzZS5faCA9PSAyKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChkb21haW4gJiYgIWV4aXRlZCkgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2hpbGUgKGNoYWluLmxlbmd0aCA+IGkpIHJ1bihjaGFpbltpKytdKTsgLy8gdmFyaWFibGUgbGVuZ3RoIC0gY2FuJ3QgdXNlIGZvckVhY2hcbiAgICBwcm9taXNlLl9jID0gW107XG4gICAgcHJvbWlzZS5fbiA9IGZhbHNlO1xuICAgIGlmIChpc1JlamVjdCAmJiAhcHJvbWlzZS5faCkgb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92O1xuICAgIHZhciB1bmhhbmRsZWQgPSBpc1VuaGFuZGxlZChwcm9taXNlKTtcbiAgICB2YXIgcmVzdWx0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmICh1bmhhbmRsZWQpIHtcbiAgICAgIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbikge1xuICAgICAgICAgIGhhbmRsZXIoeyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUgfHwgaXNVbmhhbmRsZWQocHJvbWlzZSkgPyAyIDogMTtcbiAgICB9IHByb21pc2UuX2EgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHVuaGFuZGxlZCAmJiByZXN1bHQuZSkgdGhyb3cgcmVzdWx0LnY7XG4gIH0pO1xufTtcbnZhciBpc1VuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHJldHVybiBwcm9taXNlLl9oICE9PSAxICYmIChwcm9taXNlLl9hIHx8IHByb21pc2UuX2MpLmxlbmd0aCA9PT0gMDtcbn07XG52YXIgb25IYW5kbGVVbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSkge1xuICAgICAgcHJvY2Vzcy5lbWl0KCdyZWplY3Rpb25IYW5kbGVkJywgcHJvbWlzZSk7XG4gICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9ucmVqZWN0aW9uaGFuZGxlZCkge1xuICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogcHJvbWlzZS5fdiB9KTtcbiAgICB9XG4gIH0pO1xufTtcbnZhciAkcmVqZWN0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHZhciBwcm9taXNlID0gdGhpcztcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZiAoIXByb21pc2UuX2EpIHByb21pc2UuX2EgPSBwcm9taXNlLl9jLnNsaWNlKCk7XG4gIG5vdGlmeShwcm9taXNlLCB0cnVlKTtcbn07XG52YXIgJHJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICB2YXIgdGhlbjtcbiAgaWYgKHByb21pc2UuX2QpIHJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICB0cnkge1xuICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHZhbHVlKSkge1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdyYXBwZXIgPSB7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgJHJlamVjdC5jYWxsKHRoaXMsIGVycik7XG4gICAgfVxuICB9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fYyA9IFtdOyAgICAgICAgICAgICAvLyA8LSBhd2FpdGluZyByZWFjdGlvbnNcbiAgICB0aGlzLl9hID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIGNoZWNrZWQgaW4gaXNVbmhhbmRsZWQgcmVhY3Rpb25zXG4gICAgdGhpcy5fcyA9IDA7ICAgICAgICAgICAgICAvLyA8LSBzdGF0ZVxuICAgIHRoaXMuX2QgPSBmYWxzZTsgICAgICAgICAgLy8gPC0gZG9uZVxuICAgIHRoaXMuX3YgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gdmFsdWVcbiAgICB0aGlzLl9oID0gMDsgICAgICAgICAgICAgIC8vIDwtIHJlamVjdGlvbiBzdGF0ZSwgMCAtIGRlZmF1bHQsIDEgLSBoYW5kbGVkLCAyIC0gdW5oYW5kbGVkXG4gICAgdGhpcy5fbiA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBub3RpZnlcbiAgfTtcbiAgSW50ZXJuYWwucHJvdG90eXBlID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJykoJFByb21pc2UucHJvdG90eXBlLCB7XG4gICAgLy8gMjUuNC41LjMgUHJvbWlzZS5wcm90b3R5cGUudGhlbihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZClcbiAgICB0aGVuOiBmdW5jdGlvbiB0aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gICAgICB2YXIgcmVhY3Rpb24gPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX2EpIHRoaXMuX2EucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fcykgbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbiAob25SZWplY3RlZCkge1xuICAgICAgcmV0dXJuIHRoaXMudGhlbih1bmRlZmluZWQsIG9uUmVqZWN0ZWQpO1xuICAgIH1cbiAgfSk7XG4gIE93blByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcm9taXNlID0gbmV3IEludGVybmFsKCk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBjdHgoJHJlc29sdmUsIHByb21pc2UsIDEpO1xuICAgIHRoaXMucmVqZWN0ID0gY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSAkUHJvbWlzZSB8fCBDID09PSBXcmFwcGVyXG4gICAgICA/IG5ldyBPd25Qcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgOiBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgUHJvbWlzZTogJFByb21pc2UgfSk7XG5yZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpKCRQcm9taXNlLCBQUk9NSVNFKTtcbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoUFJPTUlTRSk7XG5XcmFwcGVyID0gcmVxdWlyZSgnLi9fY29yZScpW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTElCUkFSWSB8fCAhVVNFX05BVElWRSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjYgUHJvbWlzZS5yZXNvbHZlKHgpXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShMSUJSQVJZICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIHJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgJFByb21pc2UuYWxsKGl0ZXIpWydjYXRjaCddKGVtcHR5KTtcbn0pKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuMSBQcm9taXNlLmFsbChpdGVyYWJsZSlcbiAgYWxsOiBmdW5jdGlvbiBhbGwoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvck9mKGl0ZXJhYmxlLCBmYWxzZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lKSByZWplY3QocmVzdWx0LnYpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///109\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(23);\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcz9hNWI4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xuXG5mdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBhRnVuY3Rpb24ocmVzb2x2ZSk7XG4gIHRoaXMucmVqZWN0ID0gYUZ1bmN0aW9uKHJlamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiAoQykge1xuICByZXR1cm4gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///110\n")},function(module,exports,__webpack_require__){eval("var anObject = __webpack_require__(4);\nvar isObject = __webpack_require__(5);\nvar newPromiseCapability = __webpack_require__(110);\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcHJvbWlzZS1yZXNvbHZlLmpzP2JjYWEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQywgeCkge1xuICBhbk9iamVjdChDKTtcbiAgaWYgKGlzT2JqZWN0KHgpICYmIHguY29uc3RydWN0b3IgPT09IEMpIHJldHVybiB4O1xuICB2YXIgcHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///111\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar dP = __webpack_require__(8).f;\nvar create = __webpack_require__(34);\nvar redefineAll = __webpack_require__(43);\nvar ctx = __webpack_require__(22);\nvar anInstance = __webpack_require__(42);\nvar forOf = __webpack_require__(56);\nvar $iterDefine = __webpack_require__(73);\nvar step = __webpack_require__(106);\nvar setSpecies = __webpack_require__(41);\nvar DESCRIPTORS = __webpack_require__(9);\nvar fastKey = __webpack_require__(28).fastKey;\nvar validate = __webpack_require__(37);\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi1zdHJvbmcuanM/YzI2YiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGFuSW5zdGFuY2UgPSByZXF1aXJlKCcuL19hbi1pbnN0YW5jZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgJGl0ZXJEZWZpbmUgPSByZXF1aXJlKCcuL19pdGVyLWRlZmluZScpO1xudmFyIHN0ZXAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgZmFzdEtleSA9IHJlcXVpcmUoJy4vX21ldGEnKS5mYXN0S2V5O1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFNJWkUgPSBERVNDUklQVE9SUyA/ICdfcycgOiAnc2l6ZSc7XG5cbnZhciBnZXRFbnRyeSA9IGZ1bmN0aW9uICh0aGF0LCBrZXkpIHtcbiAgLy8gZmFzdCBjYXNlXG4gIHZhciBpbmRleCA9IGZhc3RLZXkoa2V5KTtcbiAgdmFyIGVudHJ5O1xuICBpZiAoaW5kZXggIT09ICdGJykgcmV0dXJuIHRoYXQuX2lbaW5kZXhdO1xuICAvLyBmcm96ZW4gb2JqZWN0IGNhc2VcbiAgZm9yIChlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICBpZiAoZW50cnkuayA9PSBrZXkpIHJldHVybiBlbnRyeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBjcmVhdGUobnVsbCk7IC8vIGluZGV4XG4gICAgICB0aGF0Ll9mID0gdW5kZWZpbmVkOyAgICAvLyBmaXJzdCBlbnRyeVxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgICAgLy8gbGFzdCBlbnRyeVxuICAgICAgdGhhdFtTSVpFXSA9IDA7ICAgICAgICAgLy8gc2l6ZVxuICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgIH0pO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBmb3IgKHZhciB0aGF0ID0gdmFsaWRhdGUodGhpcywgTkFNRSksIGRhdGEgPSB0aGF0Ll9pLCBlbnRyeSA9IHRoYXQuX2Y7IGVudHJ5OyBlbnRyeSA9IGVudHJ5Lm4pIHtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZW50cnkucCkgZW50cnkucCA9IGVudHJ5LnAubiA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBkZWxldGUgZGF0YVtlbnRyeS5pXTtcbiAgICAgICAgfVxuICAgICAgICB0aGF0Ll9mID0gdGhhdC5fbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhhdFtTSVpFXSA9IDA7XG4gICAgICB9LFxuICAgICAgLy8gMjMuMS4zLjMgTWFwLnByb3RvdHlwZS5kZWxldGUoa2V5KVxuICAgICAgLy8gMjMuMi4zLjQgU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICB2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICB2YXIgbmV4dCA9IGVudHJ5Lm47XG4gICAgICAgICAgdmFyIHByZXYgPSBlbnRyeS5wO1xuICAgICAgICAgIGRlbGV0ZSB0aGF0Ll9pW2VudHJ5LmldO1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBuZXh0O1xuICAgICAgICAgIGlmIChuZXh0KSBuZXh0LnAgPSBwcmV2O1xuICAgICAgICAgIGlmICh0aGF0Ll9mID09IGVudHJ5KSB0aGF0Ll9mID0gbmV4dDtcbiAgICAgICAgICBpZiAodGhhdC5fbCA9PSBlbnRyeSkgdGhhdC5fbCA9IHByZXY7XG4gICAgICAgICAgdGhhdFtTSVpFXS0tO1xuICAgICAgICB9IHJldHVybiAhIWVudHJ5O1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjIuMy42IFNldC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgLy8gMjMuMS4zLjUgTWFwLnByb3RvdHlwZS5mb3JFYWNoKGNhbGxiYWNrZm4sIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gICAgICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGF0ID0gdW5kZWZpbmVkICovKSB7XG4gICAgICAgIHZhbGlkYXRlKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZiA9IGN0eChjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgMyk7XG4gICAgICAgIHZhciBlbnRyeTtcbiAgICAgICAgd2hpbGUgKGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhpcy5fZikge1xuICAgICAgICAgIGYoZW50cnkudiwgZW50cnkuaywgdGhpcyk7XG4gICAgICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICAgICAgd2hpbGUgKGVudHJ5ICYmIGVudHJ5LnIpIGVudHJ5ID0gZW50cnkucDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy43IE1hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjIuMy43IFNldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiAhIWdldEVudHJ5KHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChERVNDUklQVE9SUykgZFAoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZSh0aGlzLCBOQU1FKVtTSVpFXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGdldEVudHJ5KHRoYXQsIGtleSk7XG4gICAgdmFyIHByZXYsIGluZGV4O1xuICAgIC8vIGNoYW5nZSBleGlzdGluZyBlbnRyeVxuICAgIGlmIChlbnRyeSkge1xuICAgICAgZW50cnkudiA9IHZhbHVlO1xuICAgIC8vIGNyZWF0ZSBuZXcgZW50cnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhhdC5fbCA9IGVudHJ5ID0ge1xuICAgICAgICBpOiBpbmRleCA9IGZhc3RLZXkoa2V5LCB0cnVlKSwgLy8gPC0gaW5kZXhcbiAgICAgICAgazoga2V5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIGtleVxuICAgICAgICB2OiB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gdmFsdWVcbiAgICAgICAgcDogcHJldiA9IHRoYXQuX2wsICAgICAgICAgICAgIC8vIDwtIHByZXZpb3VzIGVudHJ5XG4gICAgICAgIG46IHVuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAvLyA8LSBuZXh0IGVudHJ5XG4gICAgICAgIHI6IGZhbHNlICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSByZW1vdmVkXG4gICAgICB9O1xuICAgICAgaWYgKCF0aGF0Ll9mKSB0aGF0Ll9mID0gZW50cnk7XG4gICAgICBpZiAocHJldikgcHJldi5uID0gZW50cnk7XG4gICAgICB0aGF0W1NJWkVdKys7XG4gICAgICAvLyBhZGQgdG8gaW5kZXhcbiAgICAgIGlmIChpbmRleCAhPT0gJ0YnKSB0aGF0Ll9pW2luZGV4XSA9IGVudHJ5O1xuICAgIH0gcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIGdldEVudHJ5OiBnZXRFbnRyeSxcbiAgc2V0U3Ryb25nOiBmdW5jdGlvbiAoQywgTkFNRSwgSVNfTUFQKSB7XG4gICAgLy8gYWRkIC5rZXlzLCAudmFsdWVzLCAuZW50cmllcywgW0BAaXRlcmF0b3JdXG4gICAgLy8gMjMuMS4zLjQsIDIzLjEuMy44LCAyMy4xLjMuMTEsIDIzLjEuMy4xMiwgMjMuMi4zLjUsIDIzLjIuMy44LCAyMy4yLjMuMTAsIDIzLjIuMy4xMVxuICAgICRpdGVyRGVmaW5lKEMsIE5BTUUsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICAgICAgdGhpcy5fdCA9IHZhbGlkYXRlKGl0ZXJhdGVkLCBOQU1FKTsgLy8gdGFyZ2V0XG4gICAgICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgICAgICAvLyBraW5kXG4gICAgICB0aGlzLl9sID0gdW5kZWZpbmVkOyAgICAgICAgICAgICAgICAvLyBwcmV2aW91c1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBraW5kID0gdGhhdC5faztcbiAgICAgIHZhciBlbnRyeSA9IHRoYXQuX2w7XG4gICAgICAvLyByZXZlcnQgdG8gdGhlIGxhc3QgZXhpc3RpbmcgZW50cnlcbiAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAvLyBnZXQgbmV4dCBlbnRyeVxuICAgICAgaWYgKCF0aGF0Ll90IHx8ICEodGhhdC5fbCA9IGVudHJ5ID0gZW50cnkgPyBlbnRyeS5uIDogdGhhdC5fdC5fZikpIHtcbiAgICAgICAgLy8gb3IgZmluaXNoIHRoZSBpdGVyYXRpb25cbiAgICAgICAgdGhhdC5fdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGVudHJ5LmspO1xuICAgICAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIGVudHJ5LnYpO1xuICAgICAgcmV0dXJuIHN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIHNldFNwZWNpZXMoTkFNRSk7XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///112\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar redefineAll = __webpack_require__(43);\nvar getWeak = __webpack_require__(28).getWeak;\nvar anObject = __webpack_require__(4);\nvar isObject = __webpack_require__(5);\nvar anInstance = __webpack_require__(42);\nvar forOf = __webpack_require__(56);\nvar createArrayMethod = __webpack_require__(21);\nvar $has = __webpack_require__(14);\nvar validate = __webpack_require__(37);\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi13ZWFrLmpzPzY0M2UiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHJlZGVmaW5lQWxsID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUtYWxsJyk7XG52YXIgZ2V0V2VhayA9IHJlcXVpcmUoJy4vX21ldGEnKS5nZXRXZWFrO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyIGNyZWF0ZUFycmF5TWV0aG9kID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpO1xudmFyICRoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBhcnJheUZpbmQgPSBjcmVhdGVBcnJheU1ldGhvZCg1KTtcbnZhciBhcnJheUZpbmRJbmRleCA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpO1xudmFyIGlkID0gMDtcblxuLy8gZmFsbGJhY2sgZm9yIHVuY2F1Z2h0IGZyb3plbiBrZXlzXG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IGZ1bmN0aW9uICh0aGF0KSB7XG4gIHJldHVybiB0aGF0Ll9sIHx8ICh0aGF0Ll9sID0gbmV3IFVuY2F1Z2h0RnJvemVuU3RvcmUoKSk7XG59O1xudmFyIFVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYSA9IFtdO1xufTtcbnZhciBmaW5kVW5jYXVnaHRGcm96ZW4gPSBmdW5jdGlvbiAoc3RvcmUsIGtleSkge1xuICByZXR1cm4gYXJyYXlGaW5kKHN0b3JlLmEsIGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICB9KTtcbn07XG5VbmNhdWdodEZyb3plblN0b3JlLnByb3RvdHlwZSA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSByZXR1cm4gZW50cnlbMV07XG4gIH0sXG4gIGhhczogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhIWZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZmluZFVuY2F1Z2h0RnJvemVuKHRoaXMsIGtleSk7XG4gICAgaWYgKGVudHJ5KSBlbnRyeVsxXSA9IHZhbHVlO1xuICAgIGVsc2UgdGhpcy5hLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSxcbiAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgaW5kZXggPSBhcnJheUZpbmRJbmRleCh0aGlzLmEsIGZ1bmN0aW9uIChpdCkge1xuICAgICAgcmV0dXJuIGl0WzBdID09PSBrZXk7XG4gICAgfSk7XG4gICAgaWYgKH5pbmRleCkgdGhpcy5hLnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuICEhfmluZGV4O1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgYW5JbnN0YW5jZSh0aGF0LCBDLCBOQU1FLCAnX2knKTtcbiAgICAgIHRoYXQuX3QgPSBOQU1FOyAgICAgIC8vIGNvbGxlY3Rpb24gdHlwZVxuICAgICAgdGhhdC5faSA9IGlkKys7ICAgICAgLy8gY29sbGVjdGlvbiBpZFxuICAgICAgdGhhdC5fbCA9IHVuZGVmaW5lZDsgLy8gbGVhayBzdG9yZSBmb3IgdW5jYXVnaHQgZnJvemVuIG9iamVjdHNcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMy4zLjIgV2Vha01hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjQuMy4zIFdlYWtTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIE5BTUUpKVsnZGVsZXRlJ10oa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKSAmJiBkZWxldGUgZGF0YVt0aGlzLl9pXTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4zLjMuNCBXZWFrTWFwLnByb3RvdHlwZS5oYXMoa2V5KVxuICAgICAgLy8gMjMuNC4zLjQgV2Vha1NldC5wcm90b3R5cGUuaGFzKHZhbHVlKVxuICAgICAgaGFzOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICAgIGlmICghaXNPYmplY3Qoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEgPT09IHRydWUpIHJldHVybiB1bmNhdWdodEZyb3plblN0b3JlKHZhbGlkYXRlKHRoaXMsIE5BTUUpKS5oYXMoa2V5KTtcbiAgICAgICAgcmV0dXJuIGRhdGEgJiYgJGhhcyhkYXRhLCB0aGlzLl9pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQztcbiAgfSxcbiAgZGVmOiBmdW5jdGlvbiAodGhhdCwga2V5LCB2YWx1ZSkge1xuICAgIHZhciBkYXRhID0gZ2V0V2Vhayhhbk9iamVjdChrZXkpLCB0cnVlKTtcbiAgICBpZiAoZGF0YSA9PT0gdHJ1ZSkgdW5jYXVnaHRGcm96ZW5TdG9yZSh0aGF0KS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgZWxzZSBkYXRhW3RoYXQuX2ldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoYXQ7XG4gIH0sXG4gIHVmc3RvcmU6IHVuY2F1Z2h0RnJvemVuU3RvcmVcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///113\n")},function(module,exports,__webpack_require__){eval("// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = __webpack_require__(18);\nvar toLength = __webpack_require__(7);\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanM/MDlmYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy10b2luZGV4XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gIHZhciBudW1iZXIgPSB0b0ludGVnZXIoaXQpO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgobnVtYmVyKTtcbiAgaWYgKG51bWJlciAhPT0gbGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBsZW5ndGghJyk7XG4gIHJldHVybiBsZW5ndGg7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///114\n")},function(module,exports,__webpack_require__){eval("// all object keys, includes non-enumerable and symbols\nvar gOPN = __webpack_require__(35);\nvar gOPS = __webpack_require__(50);\nvar anObject = __webpack_require__(4);\nvar Reflect = __webpack_require__(2).Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb3duLWtleXMuanM/OTkwYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJyk7XG52YXIgZ09QUyA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBSZWZsZWN0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdDtcbm1vZHVsZS5leHBvcnRzID0gUmVmbGVjdCAmJiBSZWZsZWN0Lm93bktleXMgfHwgZnVuY3Rpb24gb3duS2V5cyhpdCkge1xuICB2YXIga2V5cyA9IGdPUE4uZihhbk9iamVjdChpdCkpO1xuICB2YXIgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgcmV0dXJuIGdldFN5bWJvbHMgPyBrZXlzLmNvbmNhdChnZXRTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///115\n")},function(module,exports,__webpack_require__){eval("// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = __webpack_require__(7);\nvar repeat = __webpack_require__(69);\nvar defined = __webpack_require__(25);\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXBhZC5qcz8yZTA4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCcuL19zdHJpbmctcmVwZWF0Jyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgbWF4TGVuZ3RoLCBmaWxsU3RyaW5nLCBsZWZ0KSB7XG4gIHZhciBTID0gU3RyaW5nKGRlZmluZWQodGhhdCkpO1xuICB2YXIgc3RyaW5nTGVuZ3RoID0gUy5sZW5ndGg7XG4gIHZhciBmaWxsU3RyID0gZmlsbFN0cmluZyA9PT0gdW5kZWZpbmVkID8gJyAnIDogU3RyaW5nKGZpbGxTdHJpbmcpO1xuICB2YXIgaW50TWF4TGVuZ3RoID0gdG9MZW5ndGgobWF4TGVuZ3RoKTtcbiAgaWYgKGludE1heExlbmd0aCA8PSBzdHJpbmdMZW5ndGggfHwgZmlsbFN0ciA9PSAnJykgcmV0dXJuIFM7XG4gIHZhciBmaWxsTGVuID0gaW50TWF4TGVuZ3RoIC0gc3RyaW5nTGVuZ3RoO1xuICB2YXIgc3RyaW5nRmlsbGVyID0gcmVwZWF0LmNhbGwoZmlsbFN0ciwgTWF0aC5jZWlsKGZpbGxMZW4gLyBmaWxsU3RyLmxlbmd0aCkpO1xuICBpZiAoc3RyaW5nRmlsbGVyLmxlbmd0aCA+IGZpbGxMZW4pIHN0cmluZ0ZpbGxlciA9IHN0cmluZ0ZpbGxlci5zbGljZSgwLCBmaWxsTGVuKTtcbiAgcmV0dXJuIGxlZnQgPyBzdHJpbmdGaWxsZXIgKyBTIDogUyArIHN0cmluZ0ZpbGxlcjtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///116\n")},function(module,exports,__webpack_require__){eval("var getKeys = __webpack_require__(32);\nvar toIObject = __webpack_require__(16);\nvar isEnum = __webpack_require__(45).f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) if (isEnum.call(O, key = keys[i++])) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n } return result;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzPzUwNGMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBpc0VudW0gPSByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGlzRW50cmllcykge1xuICByZXR1cm4gZnVuY3Rpb24gKGl0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3QoaXQpO1xuICAgIHZhciBrZXlzID0gZ2V0S2V5cyhPKTtcbiAgICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBpKSBpZiAoaXNFbnVtLmNhbGwoTywga2V5ID0ga2V5c1tpKytdKSkge1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///117\n")},function(e,n,t){t(119),e.exports=t(288)},function(module,exports,__webpack_require__){"use strict";eval('/* WEBPACK VAR INJECTION */(function(global) {\n\n__webpack_require__(121);\n\n__webpack_require__(265);\n\n__webpack_require__(267);\n\n__webpack_require__(269);\n\n__webpack_require__(271);\n\n__webpack_require__(273);\n\n__webpack_require__(275);\n\n__webpack_require__(277);\n\n__webpack_require__(279);\n\n__webpack_require__(281);\n\n__webpack_require__(285);\n\nif (global._babelPolyfill && typeof console !== "undefined" && console.warn) {\n console.warn("@babel/polyfill is loaded more than once on this page. This is probably not desirable/intended " + "and may have consequences if different versions of the polyfills are applied sequentially. " + "If you do need to load the polyfill more than once, use @babel/polyfill/noConflict " + "instead to bypass the warning.");\n}\n\nglobal._babelPolyfill = true;\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(120)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9wb2x5ZmlsbC9saWIvaW5kZXguanM/ZTc5MiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxucmVxdWlyZShcImNvcmUtanMvZXM2XCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9mbi9hcnJheS9pbmNsdWRlc1wiKTtcblxucmVxdWlyZShcImNvcmUtanMvZm4vc3RyaW5nL3BhZC1zdGFydFwiKTtcblxucmVxdWlyZShcImNvcmUtanMvZm4vc3RyaW5nL3BhZC1lbmRcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL2ZuL3N5bWJvbC9hc3luYy1pdGVyYXRvclwiKTtcblxucmVxdWlyZShcImNvcmUtanMvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL2ZuL29iamVjdC92YWx1ZXNcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL2ZuL29iamVjdC9lbnRyaWVzXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9mbi9wcm9taXNlL2ZpbmFsbHlcIik7XG5cbnJlcXVpcmUoXCJjb3JlLWpzL3dlYlwiKTtcblxucmVxdWlyZShcInJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZVwiKTtcblxuaWYgKGdsb2JhbC5fYmFiZWxQb2x5ZmlsbCAmJiB0eXBlb2YgY29uc29sZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zb2xlLndhcm4pIHtcbiAgY29uc29sZS53YXJuKFwiQGJhYmVsL3BvbHlmaWxsIGlzIGxvYWRlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGlzIHBhZ2UuIFRoaXMgaXMgcHJvYmFibHkgbm90IGRlc2lyYWJsZS9pbnRlbmRlZCBcIiArIFwiYW5kIG1heSBoYXZlIGNvbnNlcXVlbmNlcyBpZiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHBvbHlmaWxscyBhcmUgYXBwbGllZCBzZXF1ZW50aWFsbHkuIFwiICsgXCJJZiB5b3UgZG8gbmVlZCB0byBsb2FkIHRoZSBwb2x5ZmlsbCBtb3JlIHRoYW4gb25jZSwgdXNlIEBiYWJlbC9wb2x5ZmlsbC9ub0NvbmZsaWN0IFwiICsgXCJpbnN0ZWFkIHRvIGJ5cGFzcyB0aGUgd2FybmluZy5cIik7XG59XG5cbmdsb2JhbC5fYmFiZWxQb2x5ZmlsbCA9IHRydWU7Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///119\n')},function(module,exports){eval('var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function("return this")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === "object") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it\'s\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcz9jZDAwIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBnO1xuXG4vLyBUaGlzIHdvcmtzIGluIG5vbi1zdHJpY3QgbW9kZVxuZyA9IChmdW5jdGlvbigpIHtcblx0cmV0dXJuIHRoaXM7XG59KSgpO1xuXG50cnkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIGV2YWwgaXMgYWxsb3dlZCAoc2VlIENTUClcblx0ZyA9IGcgfHwgbmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcbn0gY2F0Y2ggKGUpIHtcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcblx0aWYgKHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIpIGcgPSB3aW5kb3c7XG59XG5cbi8vIGcgY2FuIHN0aWxsIGJlIHVuZGVmaW5lZCwgYnV0IG5vdGhpbmcgdG8gZG8gYWJvdXQgaXQuLi5cbi8vIFdlIHJldHVybiB1bmRlZmluZWQsIGluc3RlYWQgb2Ygbm90aGluZyBoZXJlLCBzbyBpdCdzXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XG5cbm1vZHVsZS5leHBvcnRzID0gZztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///120\n')},function(module,exports,__webpack_require__){eval("__webpack_require__(122);\n__webpack_require__(125);\n__webpack_require__(126);\n__webpack_require__(127);\n__webpack_require__(128);\n__webpack_require__(129);\n__webpack_require__(130);\n__webpack_require__(131);\n__webpack_require__(132);\n__webpack_require__(133);\n__webpack_require__(134);\n__webpack_require__(135);\n__webpack_require__(136);\n__webpack_require__(137);\n__webpack_require__(138);\n__webpack_require__(139);\n__webpack_require__(140);\n__webpack_require__(141);\n__webpack_require__(142);\n__webpack_require__(143);\n__webpack_require__(144);\n__webpack_require__(145);\n__webpack_require__(146);\n__webpack_require__(147);\n__webpack_require__(148);\n__webpack_require__(149);\n__webpack_require__(150);\n__webpack_require__(151);\n__webpack_require__(152);\n__webpack_require__(153);\n__webpack_require__(154);\n__webpack_require__(155);\n__webpack_require__(156);\n__webpack_require__(157);\n__webpack_require__(158);\n__webpack_require__(159);\n__webpack_require__(160);\n__webpack_require__(161);\n__webpack_require__(162);\n__webpack_require__(163);\n__webpack_require__(164);\n__webpack_require__(165);\n__webpack_require__(166);\n__webpack_require__(168);\n__webpack_require__(169);\n__webpack_require__(170);\n__webpack_require__(171);\n__webpack_require__(172);\n__webpack_require__(173);\n__webpack_require__(174);\n__webpack_require__(175);\n__webpack_require__(176);\n__webpack_require__(177);\n__webpack_require__(178);\n__webpack_require__(179);\n__webpack_require__(180);\n__webpack_require__(181);\n__webpack_require__(182);\n__webpack_require__(183);\n__webpack_require__(184);\n__webpack_require__(185);\n__webpack_require__(186);\n__webpack_require__(187);\n__webpack_require__(188);\n__webpack_require__(189);\n__webpack_require__(190);\n__webpack_require__(191);\n__webpack_require__(192);\n__webpack_require__(193);\n__webpack_require__(194);\n__webpack_require__(195);\n__webpack_require__(196);\n__webpack_require__(197);\n__webpack_require__(198);\n__webpack_require__(199);\n__webpack_require__(200);\n__webpack_require__(201);\n__webpack_require__(203);\n__webpack_require__(204);\n__webpack_require__(206);\n__webpack_require__(207);\n__webpack_require__(208);\n__webpack_require__(209);\n__webpack_require__(210);\n__webpack_require__(211);\n__webpack_require__(212);\n__webpack_require__(215);\n__webpack_require__(216);\n__webpack_require__(217);\n__webpack_require__(218);\n__webpack_require__(219);\n__webpack_require__(220);\n__webpack_require__(221);\n__webpack_require__(222);\n__webpack_require__(223);\n__webpack_require__(224);\n__webpack_require__(225);\n__webpack_require__(226);\n__webpack_require__(227);\n__webpack_require__(81);\n__webpack_require__(228);\n__webpack_require__(107);\n__webpack_require__(229);\n__webpack_require__(108);\n__webpack_require__(230);\n__webpack_require__(231);\n__webpack_require__(232);\n__webpack_require__(233);\n__webpack_require__(109);\n__webpack_require__(236);\n__webpack_require__(237);\n__webpack_require__(238);\n__webpack_require__(239);\n__webpack_require__(240);\n__webpack_require__(241);\n__webpack_require__(242);\n__webpack_require__(243);\n__webpack_require__(244);\n__webpack_require__(245);\n__webpack_require__(246);\n__webpack_require__(247);\n__webpack_require__(248);\n__webpack_require__(249);\n__webpack_require__(250);\n__webpack_require__(251);\n__webpack_require__(252);\n__webpack_require__(253);\n__webpack_require__(254);\n__webpack_require__(255);\n__webpack_require__(256);\n__webpack_require__(257);\n__webpack_require__(258);\n__webpack_require__(259);\n__webpack_require__(260);\n__webpack_require__(261);\n__webpack_require__(262);\n__webpack_require__(263);\n__webpack_require__(264);\nmodule.exports = __webpack_require__(10);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZXM2L2luZGV4LmpzPzViZDciXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3ltYm9sJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC5mcmVlemUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZnJvemVuJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LmlzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5wYXJzZS1pbnQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5udW1iZXIuY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm51bWJlci50by1maXhlZCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtbmFuJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC5hY29zaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC5hc2luaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC5hdGFuaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC5jYnJ0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXRoLmNsejMyJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXRoLmNvc2gnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGguZXhwbTEnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGguZnJvdW5kJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXRoLmh5cG90Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXRoLmltdWwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGgubG9nMTAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGgubG9nMicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC5zaWduJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5tYXRoLnNpbmgnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hdGgudGFuaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYubWF0aC50cnVuYycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLnJhdycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5lbmRzLXdpdGgnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuYmlnJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5mb250Y29sb3InKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5saW5rJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5zdHJpa2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5zdWInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5zdXAnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmRhdGUubm93Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5kYXRlLnRvLWpzb24nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmRhdGUudG8tcHJpbWl0aXZlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuYXJyYXkuZnJvbScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuYXJyYXkub2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LmpvaW4nKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LnNsaWNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5zb3J0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuYXJyYXkubWFwJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5maWx0ZXInKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LnNvbWUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LmV2ZXJ5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5maWxsJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5zcGVjaWVzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWdleHAuZXhlYycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWdleHAubWF0Y2gnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWdleHAuc3BsaXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnByb21pc2UnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm1hcCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYuc2V0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi53ZWFrLW1hcCcpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYud2Vhay1zZXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnR5cGVkLmFycmF5LWJ1ZmZlcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYudHlwZWQuZGF0YS12aWV3Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi50eXBlZC51aW50OC1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYudHlwZWQudWludDgtY2xhbXBlZC1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQxNi1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYudHlwZWQuaW50MzItYXJyYXknKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQzMi1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYudHlwZWQuZmxvYXQzMi1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYudHlwZWQuZmxvYXQ2NC1hcnJheScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZmxlY3QuZ2V0Jyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmhhcycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0Lm93bi1rZXlzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5yZWZsZWN0LnByZXZlbnQtZXh0ZW5zaW9ucycpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LXByb3RvdHlwZS1vZicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///121\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// ECMAScript 6 symbols shim\nvar global = __webpack_require__(2);\nvar has = __webpack_require__(14);\nvar DESCRIPTORS = __webpack_require__(9);\nvar $export = __webpack_require__(1);\nvar redefine = __webpack_require__(11);\nvar META = __webpack_require__(28).KEY;\nvar $fails = __webpack_require__(3);\nvar shared = __webpack_require__(48);\nvar setToStringTag = __webpack_require__(38);\nvar uid = __webpack_require__(30);\nvar wks = __webpack_require__(6);\nvar wksExt = __webpack_require__(61);\nvar wksDefine = __webpack_require__(89);\nvar enumKeys = __webpack_require__(124);\nvar isArray = __webpack_require__(64);\nvar anObject = __webpack_require__(4);\nvar isObject = __webpack_require__(5);\nvar toIObject = __webpack_require__(16);\nvar toPrimitive = __webpack_require__(27);\nvar createDesc = __webpack_require__(29);\nvar _create = __webpack_require__(34);\nvar gOPNExt = __webpack_require__(92);\nvar $GOPD = __webpack_require__(19);\nvar $DP = __webpack_require__(8);\nvar $keys = __webpack_require__(32);\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n __webpack_require__(35).f = gOPNExt.f = $getOwnPropertyNames;\n __webpack_require__(45).f = $propertyIsEnumerable;\n __webpack_require__(50).f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !__webpack_require__(31)) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(15)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3ltYm9sLmpzPzhhODEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIE1FVEEgPSByZXF1aXJlKCcuL19tZXRhJykuS0VZO1xudmFyICRmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIHdrc0V4dCA9IHJlcXVpcmUoJy4vX3drcy1leHQnKTtcbnZhciB3a3NEZWZpbmUgPSByZXF1aXJlKCcuL193a3MtZGVmaW5lJyk7XG52YXIgZW51bUtleXMgPSByZXF1aXJlKCcuL19lbnVtLWtleXMnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBfY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGdPUE5FeHQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbi1leHQnKTtcbnZhciAkR09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgJERQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUEQgPSAkR09QRC5mO1xudmFyIGRQID0gJERQLmY7XG52YXIgZ09QTiA9IGdPUE5FeHQuZjtcbnZhciAkU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciAkSlNPTiA9IGdsb2JhbC5KU09OO1xudmFyIF9zdHJpbmdpZnkgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnk7XG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG52YXIgSElEREVOID0gd2tzKCdfaGlkZGVuJyk7XG52YXIgVE9fUFJJTUlUSVZFID0gd2tzKCd0b1ByaW1pdGl2ZScpO1xudmFyIGlzRW51bSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIFN5bWJvbFJlZ2lzdHJ5ID0gc2hhcmVkKCdzeW1ib2wtcmVnaXN0cnknKTtcbnZhciBBbGxTeW1ib2xzID0gc2hhcmVkKCdzeW1ib2xzJyk7XG52YXIgT1BTeW1ib2xzID0gc2hhcmVkKCdvcC1zeW1ib2xzJyk7XG52YXIgT2JqZWN0UHJvdG8gPSBPYmplY3RbUFJPVE9UWVBFXTtcbnZhciBVU0VfTkFUSVZFID0gdHlwZW9mICRTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcbnZhciBRT2JqZWN0ID0gZ2xvYmFsLlFPYmplY3Q7XG4vLyBEb24ndCB1c2Ugc2V0dGVycyBpbiBRdCBTY3JpcHQsIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8xNzNcbnZhciBzZXR0ZXIgPSAhUU9iamVjdCB8fCAhUU9iamVjdFtQUk9UT1RZUEVdIHx8ICFRT2JqZWN0W1BST1RPVFlQRV0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gREVTQ1JJUFRPUlMgJiYgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIF9jcmVhdGUoZFAoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZFAodGhpcywgJ2EnLCB7IHZhbHVlOiA3IH0pLmE7IH1cbiAgfSkpLmEgIT0gNztcbn0pID8gZnVuY3Rpb24gKGl0LCBrZXksIEQpIHtcbiAgdmFyIHByb3RvRGVzYyA9IGdPUEQoT2JqZWN0UHJvdG8sIGtleSk7XG4gIGlmIChwcm90b0Rlc2MpIGRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuICBkUChpdCwga2V5LCBEKTtcbiAgaWYgKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8pIGRQKE9iamVjdFByb3RvLCBrZXksIHByb3RvRGVzYyk7XG59IDogZFA7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24gKHRhZykge1xuICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuICBzeW0uX2sgPSB0YWc7XG4gIHJldHVybiBzeW07XG59O1xuXG52YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCBpbnN0YW5jZW9mICRTeW1ib2w7XG59O1xuXG52YXIgJGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgRCkge1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvKSAkZGVmaW5lUHJvcGVydHkoT1BTeW1ib2xzLCBrZXksIEQpO1xuICBhbk9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEQpO1xuICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSkpIHtcbiAgICBpZiAoIUQuZW51bWVyYWJsZSkge1xuICAgICAgaWYgKCFoYXMoaXQsIEhJRERFTikpIGRQKGl0LCBISURERU4sIGNyZWF0ZURlc2MoMSwge30pKTtcbiAgICAgIGl0W0hJRERFTl1ba2V5XSA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKSBpdFtISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEQgPSBfY3JlYXRlKEQsIHsgZW51bWVyYWJsZTogY3JlYXRlRGVzYygwLCBmYWxzZSkgfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzYyhpdCwga2V5LCBEKTtcbiAgfSByZXR1cm4gZFAoaXQsIGtleSwgRCk7XG59O1xudmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhpdCwgUCkge1xuICBhbk9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gZW51bUtleXMoUCA9IHRvSU9iamVjdChQKSk7XG4gIHZhciBpID0gMDtcbiAgdmFyIGwgPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGwgPiBpKSAkZGVmaW5lUHJvcGVydHkoaXQsIGtleSA9IGtleXNbaSsrXSwgUFtrZXldKTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGl0LCBQKSB7XG4gIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcbn07XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KSB7XG4gIHZhciBFID0gaXNFbnVtLmNhbGwodGhpcywga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKSk7XG4gIGlmICh0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICBpdCA9IHRvSU9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpIHJldHVybjtcbiAgdmFyIEQgPSBnT1BEKGl0LCBrZXkpO1xuICBpZiAoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKSBELmVudW1lcmFibGUgPSB0cnVlO1xuICByZXR1cm4gRDtcbn07XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHZhciBuYW1lcyA9IGdPUE4odG9JT2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmICghaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpIHJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCkge1xuICB2YXIgSVNfT1AgPSBpdCA9PT0gT2JqZWN0UHJvdG87XG4gIHZhciBuYW1lcyA9IGdPUE4oSVNfT1AgPyBPUFN5bWJvbHMgOiB0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKGhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiAoSVNfT1AgPyBoYXMoT2JqZWN0UHJvdG8sIGtleSkgOiB0cnVlKSkgcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gMTkuNC4xLjEgU3ltYm9sKFtkZXNjcmlwdGlvbl0pXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpIHRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuICAgIHZhciB0YWcgPSB1aWQoYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICAgIHZhciAkc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAodGhpcyA9PT0gT2JqZWN0UHJvdG8pICRzZXQuY2FsbChPUFN5bWJvbHMsIHZhbHVlKTtcbiAgICAgIGlmIChoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKSB0aGlzW0hJRERFTl1bdGFnXSA9IGZhbHNlO1xuICAgICAgc2V0U3ltYm9sRGVzYyh0aGlzLCB0YWcsIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbiAgICB9O1xuICAgIGlmIChERVNDUklQVE9SUyAmJiBzZXR0ZXIpIHNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8sIHRhZywgeyBjb25maWd1cmFibGU6IHRydWUsIHNldDogJHNldCB9KTtcbiAgICByZXR1cm4gd3JhcCh0YWcpO1xuICB9O1xuICByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9rO1xuICB9KTtcblxuICAkR09QRC5mID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgJERQLmYgPSAkZGVmaW5lUHJvcGVydHk7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZiA9IGdPUE5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZiA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgIXJlcXVpcmUoJy4vX2xpYnJhcnknKSkge1xuICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuICB9XG5cbiAgd2tzRXh0LmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgU3ltYm9sOiAkU3ltYm9sIH0pO1xuXG5mb3IgKHZhciBlczZTeW1ib2xzID0gKFxuICAvLyAxOS40LjIuMiwgMTkuNC4yLjMsIDE5LjQuMi40LCAxOS40LjIuNiwgMTkuNC4yLjgsIDE5LjQuMi45LCAxOS40LjIuMTAsIDE5LjQuMi4xMSwgMTkuNC4yLjEyLCAxOS40LjIuMTMsIDE5LjQuMi4xNFxuICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG4pLnNwbGl0KCcsJyksIGogPSAwOyBlczZTeW1ib2xzLmxlbmd0aCA+IGo7KXdrcyhlczZTeW1ib2xzW2orK10pO1xuXG5mb3IgKHZhciB3ZWxsS25vd25TeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgayA9IDA7IHdlbGxLbm93blN5bWJvbHMubGVuZ3RoID4gazspIHdrc0RlZmluZSh3ZWxsS25vd25TeW1ib2xzW2srK10pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnU3ltYm9sJywge1xuICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkge1xuICAgIGlmICghaXNTeW1ib2woc3ltKSkgdGhyb3cgVHlwZUVycm9yKHN5bSArICcgaXMgbm90IGEgc3ltYm9sIScpO1xuICAgIGZvciAodmFyIGtleSBpbiBTeW1ib2xSZWdpc3RyeSkgaWYgKFN5bWJvbFJlZ2lzdHJ5W2tleV0gPT09IHN5bSkgcmV0dXJuIGtleTtcbiAgfSxcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSBmYWxzZTsgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCFVU0VfTkFUSVZFIHx8ICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBTID0gJFN5bWJvbCgpO1xuICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHsgYTogUyB9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSkpLCAnSlNPTicsIHtcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpIHtcbiAgICB2YXIgYXJncyA9IFtpdF07XG4gICAgdmFyIGkgPSAxO1xuICAgIHZhciByZXBsYWNlciwgJHJlcGxhY2VyO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICAkcmVwbGFjZXIgPSByZXBsYWNlciA9IGFyZ3NbMV07XG4gICAgaWYgKCFpc09iamVjdChyZXBsYWNlcikgJiYgaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpIHJldHVybjsgLy8gSUU4IHJldHVybnMgc3RyaW5nIG9uIHVuZGVmaW5lZFxuICAgIGlmICghaXNBcnJheShyZXBsYWNlcikpIHJlcGxhY2VyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgIGlmICh0eXBlb2YgJHJlcGxhY2VyID09ICdmdW5jdGlvbicpIHZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZiAoIWlzU3ltYm9sKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgYXJnc1sxXSA9IHJlcGxhY2VyO1xuICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcbiAgfVxufSk7XG5cbi8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcbiRTeW1ib2xbUFJPVE9UWVBFXVtUT19QUklNSVRJVkVdIHx8IHJlcXVpcmUoJy4vX2hpZGUnKSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xuLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgJ1N5bWJvbCcpO1xuLy8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcbi8vIDI0LjMuMyBKU09OW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///122\n")},function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(48)('native-function-to-string', Function.toString);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZnVuY3Rpb24tdG8tc3RyaW5nLmpzP2ZhNWIiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnbmF0aXZlLWZ1bmN0aW9uLXRvLXN0cmluZycsIEZ1bmN0aW9uLnRvU3RyaW5nKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///123\n")},function(module,exports,__webpack_require__){eval("// all enumerable object keys, includes symbols\nvar getKeys = __webpack_require__(32);\nvar gOPS = __webpack_require__(50);\nvar pIE = __webpack_require__(45);\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZW51bS1rZXlzLmpzP2Q0YzAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgcmVzdWx0ID0gZ2V0S2V5cyhpdCk7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICBpZiAoZ2V0U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdCk7XG4gICAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChzeW1ib2xzLmxlbmd0aCA+IGkpIGlmIChpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///124\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: __webpack_require__(34) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZS5qcz84NDc4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBjcmVhdGU6IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///125\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !__webpack_require__(9), 'Object', { defineProperty: __webpack_require__(8).f });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcz8xYzAxIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSwgJ09iamVjdCcsIHsgZGVmaW5lUHJvcGVydHk6IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYgfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///126\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\n// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n$export($export.S + $export.F * !__webpack_require__(9), 'Object', { defineProperties: __webpack_require__(91) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzLmpzPzU4YjIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi4zIC8gMTUuMi4zLjcgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnRpZXM6IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///127\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = __webpack_require__(16);\nvar $getOwnPropertyDescriptor = __webpack_require__(19).f;\n\n__webpack_require__(20)('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcz85OTg2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3InLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSkge1xuICAgIHJldHVybiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRvSU9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///128\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(12);\nvar $getPrototypeOf = __webpack_require__(36);\n\n__webpack_require__(20)('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanM/ZTRmNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuOSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRQcm90b3R5cGVPZicsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFByb3RvdHlwZU9mKGl0KSB7XG4gICAgcmV0dXJuICRnZXRQcm90b3R5cGVPZih0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///129\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(12);\nvar $keys = __webpack_require__(32);\n\n__webpack_require__(20)('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanM/NDU2ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdrZXlzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24ga2V5cyhpdCkge1xuICAgIHJldHVybiAka2V5cyh0b09iamVjdChpdCkpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///130\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.7 Object.getOwnPropertyNames(O)\n__webpack_require__(20)('getOwnPropertyNames', function () {\n return __webpack_require__(92).f;\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMuanM/MjVkYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JykuZjtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///131\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.5 Object.freeze(O)\nvar isObject = __webpack_require__(5);\nvar meta = __webpack_require__(28).onFreeze;\n\n__webpack_require__(20)('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZS5qcz8wZDZkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi41IE9iamVjdC5mcmVlemUoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZnJlZXplJywgZnVuY3Rpb24gKCRmcmVlemUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZyZWV6ZShpdCkge1xuICAgIHJldHVybiAkZnJlZXplICYmIGlzT2JqZWN0KGl0KSA/ICRmcmVlemUobWV0YShpdCkpIDogaXQ7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///132\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.17 Object.seal(O)\nvar isObject = __webpack_require__(5);\nvar meta = __webpack_require__(28).onFreeze;\n\n__webpack_require__(20)('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNlYWwuanM/Y2Y2YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTcgT2JqZWN0LnNlYWwoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnc2VhbCcsIGZ1bmN0aW9uICgkc2VhbCkge1xuICByZXR1cm4gZnVuY3Rpb24gc2VhbChpdCkge1xuICAgIHJldHVybiAkc2VhbCAmJiBpc09iamVjdChpdCkgPyAkc2VhbChtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///133\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = __webpack_require__(5);\nvar meta = __webpack_require__(28).onFreeze;\n\n__webpack_require__(20)('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnByZXZlbnQtZXh0ZW5zaW9ucy5qcz85YWVhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi4xNSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgncHJldmVudEV4dGVuc2lvbnMnLCBmdW5jdGlvbiAoJHByZXZlbnRFeHRlbnNpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhpdCkge1xuICAgIHJldHVybiAkcHJldmVudEV4dGVuc2lvbnMgJiYgaXNPYmplY3QoaXQpID8gJHByZXZlbnRFeHRlbnNpb25zKG1ldGEoaXQpKSA6IGl0O1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///134\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.12 Object.isFrozen(O)\nvar isObject = __webpack_require__(5);\n\n__webpack_require__(20)('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qcz82NmM4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi4xMiBPYmplY3QuaXNGcm96ZW4oTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzRnJvemVuJywgZnVuY3Rpb24gKCRpc0Zyb3plbikge1xuICByZXR1cm4gZnVuY3Rpb24gaXNGcm96ZW4oaXQpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzRnJvemVuID8gJGlzRnJvemVuKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///135\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.13 Object.isSealed(O)\nvar isObject = __webpack_require__(5);\n\n__webpack_require__(20)('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZC5qcz81N2YwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMi4xMyBPYmplY3QuaXNTZWFsZWQoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzU2VhbGVkJywgZnVuY3Rpb24gKCRpc1NlYWxlZCkge1xuICByZXR1cm4gZnVuY3Rpb24gaXNTZWFsZWQoaXQpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzU2VhbGVkID8gJGlzU2VhbGVkKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///136\n")},function(module,exports,__webpack_require__){eval("// 19.1.2.11 Object.isExtensible(O)\nvar isObject = __webpack_require__(5);\n\n__webpack_require__(20)('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanM/MTY1YiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjIuMTEgT2JqZWN0LmlzRXh0ZW5zaWJsZShPKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnaXNFeHRlbnNpYmxlJywgZnVuY3Rpb24gKCRpc0V4dGVuc2libGUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRXh0ZW5zaWJsZShpdCkge1xuICAgIHJldHVybiBpc09iamVjdChpdCkgPyAkaXNFeHRlbnNpYmxlID8gJGlzRXh0ZW5zaWJsZShpdCkgOiB0cnVlIDogZmFsc2U7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///137\n")},function(module,exports,__webpack_require__){eval("// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(1);\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(93) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbi5qcz9mNzUxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjEuMy4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiwgJ09iamVjdCcsIHsgYXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJykgfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///138\n")},function(module,exports,__webpack_require__){eval("// 19.1.3.10 Object.is(value1, value2)\nvar $export = __webpack_require__(1);\n$export($export.S, 'Object', { is: __webpack_require__(94) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLmpzP2RiOTciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMTkuMS4zLjEwIE9iamVjdC5pcyh2YWx1ZTEsIHZhbHVlMilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgaXM6IHJlcXVpcmUoJy4vX3NhbWUtdmFsdWUnKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///139\n")},function(module,exports,__webpack_require__){eval("// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_require__(1);\n$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(66).set });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YuanM/ZmQyNCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAxOS4xLjMuMTkgT2JqZWN0LnNldFByb3RvdHlwZU9mKE8sIHByb3RvKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0JywgeyBzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///140\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 19.1.3.6 Object.prototype.toString()\nvar classof = __webpack_require__(46);\nvar test = {};\ntest[__webpack_require__(6)('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n __webpack_require__(11)(Object.prototype, 'toString', function toString() {\n return '[object ' + classof(this) + ']';\n }, true);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcz8wNmRiIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgdGVzdCA9IHt9O1xudGVzdFtyZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKV0gPSAneic7XG5pZiAodGVzdCArICcnICE9ICdbb2JqZWN0IHpdJykge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbiAgfSwgdHJ1ZSk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///141\n")},function(module,exports,__webpack_require__){eval("// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\nvar $export = __webpack_require__(1);\n\n$export($export.P, 'Function', { bind: __webpack_require__(95) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uYmluZC5qcz9kOTJhIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDE5LjIuMy4yIC8gMTUuMy40LjUgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQodGhpc0FyZywgYXJncy4uLilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnRnVuY3Rpb24nLCB7IGJpbmQ6IHJlcXVpcmUoJy4vX2JpbmQnKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///142\n")},function(module,exports,__webpack_require__){eval("var dP = __webpack_require__(8).f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || __webpack_require__(9) && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZS5qcz83ZjdmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgRlByb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlO1xudmFyIG5hbWVSRSA9IC9eXFxzKmZ1bmN0aW9uIChbXiAoXSopLztcbnZhciBOQU1FID0gJ25hbWUnO1xuXG4vLyAxOS4yLjQuMiBuYW1lXG5OQU1FIGluIEZQcm90byB8fCByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmIGRQKEZQcm90bywgTkFNRSwge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKCcnICsgdGhpcykubWF0Y2gobmFtZVJFKVsxXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///143\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar isObject = __webpack_require__(5);\nvar getPrototypeOf = __webpack_require__(36);\nvar HAS_INSTANCE = __webpack_require__(6)('hasInstance');\nvar FunctionProto = Function.prototype;\n// 19.2.3.6 Function.prototype[@@hasInstance](V)\nif (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(8).f(FunctionProto, HAS_INSTANCE, { value: function (O) {\n if (typeof this != 'function' || !isObject(O)) return false;\n if (!isObject(this.prototype)) return O instanceof this;\n // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n while (O = getPrototypeOf(O)) if (this.prototype === O) return true;\n return false;\n} });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZnVuY3Rpb24uaGFzLWluc3RhbmNlLmpzPzIxN2IiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgSEFTX0lOU1RBTkNFID0gcmVxdWlyZSgnLi9fd2tzJykoJ2hhc0luc3RhbmNlJyk7XG52YXIgRnVuY3Rpb25Qcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIDE5LjIuMy42IEZ1bmN0aW9uLnByb3RvdHlwZVtAQGhhc0luc3RhbmNlXShWKVxuaWYgKCEoSEFTX0lOU1RBTkNFIGluIEZ1bmN0aW9uUHJvdG8pKSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mKEZ1bmN0aW9uUHJvdG8sIEhBU19JTlNUQU5DRSwgeyB2YWx1ZTogZnVuY3Rpb24gKE8pIHtcbiAgaWYgKHR5cGVvZiB0aGlzICE9ICdmdW5jdGlvbicgfHwgIWlzT2JqZWN0KE8pKSByZXR1cm4gZmFsc2U7XG4gIGlmICghaXNPYmplY3QodGhpcy5wcm90b3R5cGUpKSByZXR1cm4gTyBpbnN0YW5jZW9mIHRoaXM7XG4gIC8vIGZvciBlbnZpcm9ubWVudCB3L28gbmF0aXZlIGBAQGhhc0luc3RhbmNlYCBsb2dpYyBlbm91Z2ggYGluc3RhbmNlb2ZgLCBidXQgYWRkIHRoaXM6XG4gIHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpIGlmICh0aGlzLnByb3RvdHlwZSA9PT0gTykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn0gfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///144\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar $parseInt = __webpack_require__(97);\n// 18.2.5 parseInt(string, radix)\n$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtaW50LmpzPzE4ZDAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19wYXJzZS1pbnQnKTtcbi8vIDE4LjIuNSBwYXJzZUludChzdHJpbmcsIHJhZGl4KVxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkYgKiAocGFyc2VJbnQgIT0gJHBhcnNlSW50KSwgeyBwYXJzZUludDogJHBhcnNlSW50IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///145\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar $parseFloat = __webpack_require__(98);\n// 18.2.4 parseFloat(string)\n$export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtZmxvYXQuanM/YjcyYyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fcGFyc2UtZmxvYXQnKTtcbi8vIDE4LjIuNCBwYXJzZUZsb2F0KHN0cmluZylcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5GICogKHBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCB7IHBhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///146\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar global = __webpack_require__(2);\nvar has = __webpack_require__(14);\nvar cof = __webpack_require__(24);\nvar inheritIfRequired = __webpack_require__(68);\nvar toPrimitive = __webpack_require__(27);\nvar fails = __webpack_require__(3);\nvar gOPN = __webpack_require__(35).f;\nvar gOPD = __webpack_require__(19).f;\nvar dP = __webpack_require__(8).f;\nvar $trim = __webpack_require__(51).trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(__webpack_require__(34)(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = __webpack_require__(9) ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n __webpack_require__(11)(global, NUMBER, $Number);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmNvbnN0cnVjdG9yLmpzP2M1ZjYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgJHRyaW0gPSByZXF1aXJlKCcuL19zdHJpbmctdHJpbScpLnRyaW07XG52YXIgTlVNQkVSID0gJ051bWJlcic7XG52YXIgJE51bWJlciA9IGdsb2JhbFtOVU1CRVJdO1xudmFyIEJhc2UgPSAkTnVtYmVyO1xudmFyIHByb3RvID0gJE51bWJlci5wcm90b3R5cGU7XG4vLyBPcGVyYSB+MTIgaGFzIGJyb2tlbiBPYmplY3QjdG9TdHJpbmdcbnZhciBCUk9LRU5fQ09GID0gY29mKHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKShwcm90bykpID09IE5VTUJFUjtcbnZhciBUUklNID0gJ3RyaW0nIGluIFN0cmluZy5wcm90b3R5cGU7XG5cbi8vIDcuMS4zIFRvTnVtYmVyKGFyZ3VtZW50KVxudmFyIHRvTnVtYmVyID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHZhciBpdCA9IHRvUHJpbWl0aXZlKGFyZ3VtZW50LCBmYWxzZSk7XG4gIGlmICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgJiYgaXQubGVuZ3RoID4gMikge1xuICAgIGl0ID0gVFJJTSA/IGl0LnRyaW0oKSA6ICR0cmltKGl0LCAzKTtcbiAgICB2YXIgZmlyc3QgPSBpdC5jaGFyQ29kZUF0KDApO1xuICAgIHZhciB0aGlyZCwgcmFkaXgsIG1heENvZGU7XG4gICAgaWYgKGZpcnN0ID09PSA0MyB8fCBmaXJzdCA9PT0gNDUpIHtcbiAgICAgIHRoaXJkID0gaXQuY2hhckNvZGVBdCgyKTtcbiAgICAgIGlmICh0aGlyZCA9PT0gODggfHwgdGhpcmQgPT09IDEyMCkgcmV0dXJuIE5hTjsgLy8gTnVtYmVyKCcrMHgxJykgc2hvdWxkIGJlIE5hTiwgb2xkIFY4IGZpeFxuICAgIH0gZWxzZSBpZiAoZmlyc3QgPT09IDQ4KSB7XG4gICAgICBzd2l0Y2ggKGl0LmNoYXJDb2RlQXQoMSkpIHtcbiAgICAgICAgY2FzZSA2NjogY2FzZSA5ODogcmFkaXggPSAyOyBtYXhDb2RlID0gNDk7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMGJbMDFdKyQvaVxuICAgICAgICBjYXNlIDc5OiBjYXNlIDExMTogcmFkaXggPSA4OyBtYXhDb2RlID0gNTU7IGJyZWFrOyAvLyBmYXN0IGVxdWFsIC9eMG9bMC03XSskL2lcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICtpdDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGRpZ2l0cyA9IGl0LnNsaWNlKDIpLCBpID0gMCwgbCA9IGRpZ2l0cy5sZW5ndGgsIGNvZGU7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgY29kZSA9IGRpZ2l0cy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAvLyBwYXJzZUludCBwYXJzZXMgYSBzdHJpbmcgdG8gYSBmaXJzdCB1bmF2YWlsYWJsZSBzeW1ib2xcbiAgICAgICAgLy8gYnV0IFRvTnVtYmVyIHNob3VsZCByZXR1cm4gTmFOIGlmIGEgc3RyaW5nIGNvbnRhaW5zIHVuYXZhaWxhYmxlIHN5bWJvbHNcbiAgICAgICAgaWYgKGNvZGUgPCA0OCB8fCBjb2RlID4gbWF4Q29kZSkgcmV0dXJuIE5hTjtcbiAgICAgIH0gcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgcmFkaXgpO1xuICAgIH1cbiAgfSByZXR1cm4gK2l0O1xufTtcblxuaWYgKCEkTnVtYmVyKCcgMG8xJykgfHwgISROdW1iZXIoJzBiMScpIHx8ICROdW1iZXIoJysweDEnKSkge1xuICAkTnVtYmVyID0gZnVuY3Rpb24gTnVtYmVyKHZhbHVlKSB7XG4gICAgdmFyIGl0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyAwIDogdmFsdWU7XG4gICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgIHJldHVybiB0aGF0IGluc3RhbmNlb2YgJE51bWJlclxuICAgICAgLy8gY2hlY2sgb24gMS4uY29uc3RydWN0b3IoZm9vKSBjYXNlXG4gICAgICAmJiAoQlJPS0VOX0NPRiA/IGZhaWxzKGZ1bmN0aW9uICgpIHsgcHJvdG8udmFsdWVPZi5jYWxsKHRoYXQpOyB9KSA6IGNvZih0aGF0KSAhPSBOVU1CRVIpXG4gICAgICAgID8gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UodG9OdW1iZXIoaXQpKSwgdGhhdCwgJE51bWJlcikgOiB0b051bWJlcihpdCk7XG4gIH07XG4gIGZvciAodmFyIGtleXMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QTihCYXNlKSA6IChcbiAgICAvLyBFUzM6XG4gICAgJ01BWF9WQUxVRSxNSU5fVkFMVUUsTmFOLE5FR0FUSVZFX0lORklOSVRZLFBPU0lUSVZFX0lORklOSVRZLCcgK1xuICAgIC8vIEVTNiAoaW4gY2FzZSwgaWYgbW9kdWxlcyB3aXRoIEVTNiBOdW1iZXIgc3RhdGljcyByZXF1aXJlZCBiZWZvcmUpOlxuICAgICdFUFNJTE9OLGlzRmluaXRlLGlzSW50ZWdlcixpc05hTixpc1NhZmVJbnRlZ2VyLE1BWF9TQUZFX0lOVEVHRVIsJyArXG4gICAgJ01JTl9TQUZFX0lOVEVHRVIscGFyc2VGbG9hdCxwYXJzZUludCxpc0ludGVnZXInXG4gICkuc3BsaXQoJywnKSwgaiA9IDAsIGtleTsga2V5cy5sZW5ndGggPiBqOyBqKyspIHtcbiAgICBpZiAoaGFzKEJhc2UsIGtleSA9IGtleXNbal0pICYmICFoYXMoJE51bWJlciwga2V5KSkge1xuICAgICAgZFAoJE51bWJlciwga2V5LCBnT1BEKEJhc2UsIGtleSkpO1xuICAgIH1cbiAgfVxuICAkTnVtYmVyLnByb3RvdHlwZSA9IHByb3RvO1xuICBwcm90by5jb25zdHJ1Y3RvciA9ICROdW1iZXI7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoZ2xvYmFsLCBOVU1CRVIsICROdW1iZXIpO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///147\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar toInteger = __webpack_require__(18);\nvar aNumberValue = __webpack_require__(99);\nvar repeat = __webpack_require__(69);\nvar $toFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\nvar ERROR = 'Number.toFixed: incorrect invocation!';\nvar ZERO = '0';\n\nvar multiply = function (n, c) {\n var i = -1;\n var c2 = c;\n while (++i < 6) {\n c2 += n * data[i];\n data[i] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n};\nvar divide = function (n) {\n var i = 6;\n var c = 0;\n while (--i >= 0) {\n c += data[i];\n data[i] = floor(c / n);\n c = (c % n) * 1e7;\n }\n};\nvar numToString = function () {\n var i = 6;\n var s = '';\n while (--i >= 0) {\n if (s !== '' || i === 0 || data[i] !== 0) {\n var t = String(data[i]);\n s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n }\n } return s;\n};\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\n$export($export.P + $export.F * (!!$toFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !__webpack_require__(3)(function () {\n // V8 ~ Android 4.3-\n $toFixed.call({});\n})), 'Number', {\n toFixed: function toFixed(fractionDigits) {\n var x = aNumberValue(this, ERROR);\n var f = toInteger(fractionDigits);\n var s = '';\n var m = ZERO;\n var e, z, j, k;\n if (f < 0 || f > 20) throw RangeError(ERROR);\n // eslint-disable-next-line no-self-compare\n if (x != x) return 'NaN';\n if (x <= -1e21 || x >= 1e21) return String(x);\n if (x < 0) {\n s = '-';\n x = -x;\n }\n if (x > 1e-21) {\n e = log(x * pow(2, 69, 1)) - 69;\n z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = f;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n m = numToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n m = numToString() + repeat.call(ZERO, f);\n }\n }\n if (f > 0) {\n k = m.length;\n m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n } else {\n m = s + m;\n } return m;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLWZpeGVkLmpzPzAzNmMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgYU51bWJlclZhbHVlID0gcmVxdWlyZSgnLi9fYS1udW1iZXItdmFsdWUnKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCcuL19zdHJpbmctcmVwZWF0Jyk7XG52YXIgJHRvRml4ZWQgPSAxLjAudG9GaXhlZDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgZGF0YSA9IFswLCAwLCAwLCAwLCAwLCAwXTtcbnZhciBFUlJPUiA9ICdOdW1iZXIudG9GaXhlZDogaW5jb3JyZWN0IGludm9jYXRpb24hJztcbnZhciBaRVJPID0gJzAnO1xuXG52YXIgbXVsdGlwbHkgPSBmdW5jdGlvbiAobiwgYykge1xuICB2YXIgaSA9IC0xO1xuICB2YXIgYzIgPSBjO1xuICB3aGlsZSAoKytpIDwgNikge1xuICAgIGMyICs9IG4gKiBkYXRhW2ldO1xuICAgIGRhdGFbaV0gPSBjMiAlIDFlNztcbiAgICBjMiA9IGZsb29yKGMyIC8gMWU3KTtcbiAgfVxufTtcbnZhciBkaXZpZGUgPSBmdW5jdGlvbiAobikge1xuICB2YXIgaSA9IDY7XG4gIHZhciBjID0gMDtcbiAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgYyArPSBkYXRhW2ldO1xuICAgIGRhdGFbaV0gPSBmbG9vcihjIC8gbik7XG4gICAgYyA9IChjICUgbikgKiAxZTc7XG4gIH1cbn07XG52YXIgbnVtVG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpID0gNjtcbiAgdmFyIHMgPSAnJztcbiAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgaWYgKHMgIT09ICcnIHx8IGkgPT09IDAgfHwgZGF0YVtpXSAhPT0gMCkge1xuICAgICAgdmFyIHQgPSBTdHJpbmcoZGF0YVtpXSk7XG4gICAgICBzID0gcyA9PT0gJycgPyB0IDogcyArIHJlcGVhdC5jYWxsKFpFUk8sIDcgLSB0Lmxlbmd0aCkgKyB0O1xuICAgIH1cbiAgfSByZXR1cm4gcztcbn07XG52YXIgcG93ID0gZnVuY3Rpb24gKHgsIG4sIGFjYykge1xuICByZXR1cm4gbiA9PT0gMCA/IGFjYyA6IG4gJSAyID09PSAxID8gcG93KHgsIG4gLSAxLCBhY2MgKiB4KSA6IHBvdyh4ICogeCwgbiAvIDIsIGFjYyk7XG59O1xudmFyIGxvZyA9IGZ1bmN0aW9uICh4KSB7XG4gIHZhciBuID0gMDtcbiAgdmFyIHgyID0geDtcbiAgd2hpbGUgKHgyID49IDQwOTYpIHtcbiAgICBuICs9IDEyO1xuICAgIHgyIC89IDQwOTY7XG4gIH1cbiAgd2hpbGUgKHgyID49IDIpIHtcbiAgICBuICs9IDE7XG4gICAgeDIgLz0gMjtcbiAgfSByZXR1cm4gbjtcbn07XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKCEhJHRvRml4ZWQgJiYgKFxuICAwLjAwMDA4LnRvRml4ZWQoMykgIT09ICcwLjAwMCcgfHxcbiAgMC45LnRvRml4ZWQoMCkgIT09ICcxJyB8fFxuICAxLjI1NS50b0ZpeGVkKDIpICE9PSAnMS4yNScgfHxcbiAgMTAwMDAwMDAwMDAwMDAwMDEyOC4wLnRvRml4ZWQoMCkgIT09ICcxMDAwMDAwMDAwMDAwMDAwMTI4J1xuKSB8fCAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXG4gICR0b0ZpeGVkLmNhbGwoe30pO1xufSkpLCAnTnVtYmVyJywge1xuICB0b0ZpeGVkOiBmdW5jdGlvbiB0b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKSB7XG4gICAgdmFyIHggPSBhTnVtYmVyVmFsdWUodGhpcywgRVJST1IpO1xuICAgIHZhciBmID0gdG9JbnRlZ2VyKGZyYWN0aW9uRGlnaXRzKTtcbiAgICB2YXIgcyA9ICcnO1xuICAgIHZhciBtID0gWkVSTztcbiAgICB2YXIgZSwgeiwgaiwgaztcbiAgICBpZiAoZiA8IDAgfHwgZiA+IDIwKSB0aHJvdyBSYW5nZUVycm9yKEVSUk9SKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKHggIT0geCkgcmV0dXJuICdOYU4nO1xuICAgIGlmICh4IDw9IC0xZTIxIHx8IHggPj0gMWUyMSkgcmV0dXJuIFN0cmluZyh4KTtcbiAgICBpZiAoeCA8IDApIHtcbiAgICAgIHMgPSAnLSc7XG4gICAgICB4ID0gLXg7XG4gICAgfVxuICAgIGlmICh4ID4gMWUtMjEpIHtcbiAgICAgIGUgPSBsb2coeCAqIHBvdygyLCA2OSwgMSkpIC0gNjk7XG4gICAgICB6ID0gZSA8IDAgPyB4ICogcG93KDIsIC1lLCAxKSA6IHggLyBwb3coMiwgZSwgMSk7XG4gICAgICB6ICo9IDB4MTAwMDAwMDAwMDAwMDA7XG4gICAgICBlID0gNTIgLSBlO1xuICAgICAgaWYgKGUgPiAwKSB7XG4gICAgICAgIG11bHRpcGx5KDAsIHopO1xuICAgICAgICBqID0gZjtcbiAgICAgICAgd2hpbGUgKGogPj0gNykge1xuICAgICAgICAgIG11bHRpcGx5KDFlNywgMCk7XG4gICAgICAgICAgaiAtPSA3O1xuICAgICAgICB9XG4gICAgICAgIG11bHRpcGx5KHBvdygxMCwgaiwgMSksIDApO1xuICAgICAgICBqID0gZSAtIDE7XG4gICAgICAgIHdoaWxlIChqID49IDIzKSB7XG4gICAgICAgICAgZGl2aWRlKDEgPDwgMjMpO1xuICAgICAgICAgIGogLT0gMjM7XG4gICAgICAgIH1cbiAgICAgICAgZGl2aWRlKDEgPDwgaik7XG4gICAgICAgIG11bHRpcGx5KDEsIDEpO1xuICAgICAgICBkaXZpZGUoMik7XG4gICAgICAgIG0gPSBudW1Ub1N0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXVsdGlwbHkoMCwgeik7XG4gICAgICAgIG11bHRpcGx5KDEgPDwgLWUsIDApO1xuICAgICAgICBtID0gbnVtVG9TdHJpbmcoKSArIHJlcGVhdC5jYWxsKFpFUk8sIGYpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZiA+IDApIHtcbiAgICAgIGsgPSBtLmxlbmd0aDtcbiAgICAgIG0gPSBzICsgKGsgPD0gZiA/ICcwLicgKyByZXBlYXQuY2FsbChaRVJPLCBmIC0gaykgKyBtIDogbS5zbGljZSgwLCBrIC0gZikgKyAnLicgKyBtLnNsaWNlKGsgLSBmKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBzICsgbTtcbiAgICB9IHJldHVybiBtO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///148\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $fails = __webpack_require__(3);\nvar aNumberValue = __webpack_require__(99);\nvar $toPrecision = 1.0.toPrecision;\n\n$export($export.P + $export.F * ($fails(function () {\n // IE7-\n return $toPrecision.call(1, undefined) !== '1';\n}) || !$fails(function () {\n // V8 ~ Android 4.3-\n $toPrecision.call({});\n})), 'Number', {\n toPrecision: function toPrecision(precision) {\n var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbi5qcz81NGE4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBhTnVtYmVyVmFsdWUgPSByZXF1aXJlKCcuL19hLW51bWJlci12YWx1ZScpO1xudmFyICR0b1ByZWNpc2lvbiA9IDEuMC50b1ByZWNpc2lvbjtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gSUU3LVxuICByZXR1cm4gJHRvUHJlY2lzaW9uLmNhbGwoMSwgdW5kZWZpbmVkKSAhPT0gJzEnO1xufSkgfHwgISRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXG4gICR0b1ByZWNpc2lvbi5jYWxsKHt9KTtcbn0pKSwgJ051bWJlcicsIHtcbiAgdG9QcmVjaXNpb246IGZ1bmN0aW9uIHRvUHJlY2lzaW9uKHByZWNpc2lvbikge1xuICAgIHZhciB0aGF0ID0gYU51bWJlclZhbHVlKHRoaXMsICdOdW1iZXIjdG9QcmVjaXNpb246IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICAgIHJldHVybiBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQpIDogJHRvUHJlY2lzaW9uLmNhbGwodGhhdCwgcHJlY2lzaW9uKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///149\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.1 Number.EPSILON\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmVwc2lsb24uanM/MmUzNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuMSBOdW1iZXIuRVBTSUxPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IEVQU0lMT046IE1hdGgucG93KDIsIC01MikgfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///150\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.2 Number.isFinite(number)\nvar $export = __webpack_require__(1);\nvar _isFinite = __webpack_require__(2).isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWZpbml0ZS5qcz9mY2EwIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi4yIE51bWJlci5pc0Zpbml0ZShudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIF9pc0Zpbml0ZSA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmlzRmluaXRlO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNGaW5pdGU6IGZ1bmN0aW9uIGlzRmluaXRlKGl0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnbnVtYmVyJyAmJiBfaXNGaW5pdGUoaXQpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///151\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.3 Number.isInteger(number)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Number', { isInteger: __webpack_require__(100) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXIuanM/N2NkZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBpc0ludGVnZXI6IHJlcXVpcmUoJy4vX2lzLWludGVnZXInKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///152\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.4 Number.isNaN(number)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qcz9lZTFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi40IE51bWJlci5pc05hTihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///153\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = __webpack_require__(1);\nvar isInteger = __webpack_require__(100);\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlci5qcz9iMWIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjEuMi41IE51bWJlci5pc1NhZmVJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaXNJbnRlZ2VyID0gcmVxdWlyZSgnLi9faXMtaW50ZWdlcicpO1xudmFyIGFicyA9IE1hdGguYWJzO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNTYWZlSW50ZWdlcjogZnVuY3Rpb24gaXNTYWZlSW50ZWdlcihudW1iZXIpIHtcbiAgICByZXR1cm4gaXNJbnRlZ2VyKG51bWJlcikgJiYgYWJzKG51bWJlcikgPD0gMHgxZmZmZmZmZmZmZmZmZjtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///154\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1heC1zYWZlLWludGVnZXIuanM/ODdmMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuNiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IE1BWF9TQUZFX0lOVEVHRVI6IDB4MWZmZmZmZmZmZmZmZmYgfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///155\n")},function(module,exports,__webpack_require__){eval("// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLm1pbi1zYWZlLWludGVnZXIuanM/OTI3OCJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4xLjIuMTAgTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBNSU5fU0FGRV9JTlRFR0VSOiAtMHgxZmZmZmZmZmZmZmZmZiB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///156\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar $parseFloat = __webpack_require__(98);\n// 20.1.2.12 Number.parseFloat(string)\n$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWZsb2F0LmpzPzVkZjIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VGbG9hdCA9IHJlcXVpcmUoJy4vX3BhcnNlLWZsb2F0Jyk7XG4vLyAyMC4xLjIuMTIgTnVtYmVyLnBhcnNlRmxvYXQoc3RyaW5nKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoTnVtYmVyLnBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCAnTnVtYmVyJywgeyBwYXJzZUZsb2F0OiAkcGFyc2VGbG9hdCB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///157\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar $parseInt = __webpack_require__(97);\n// 20.1.2.13 Number.parseInt(string, radix)\n$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludC5qcz8wNGZmIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhcnNlSW50ID0gcmVxdWlyZSgnLi9fcGFyc2UtaW50Jyk7XG4vLyAyMC4xLjIuMTMgTnVtYmVyLnBhcnNlSW50KHN0cmluZywgcmFkaXgpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChOdW1iZXIucGFyc2VJbnQgIT0gJHBhcnNlSW50KSwgJ051bWJlcicsIHsgcGFyc2VJbnQ6ICRwYXJzZUludCB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///158\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.3 Math.acosh(x)\nvar $export = __webpack_require__(1);\nvar log1p = __webpack_require__(101);\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hY29zaC5qcz83ZjI1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4zIE1hdGguYWNvc2goeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbG9nMXAgPSByZXF1aXJlKCcuL19tYXRoLWxvZzFwJyk7XG52YXIgc3FydCA9IE1hdGguc3FydDtcbnZhciAkYWNvc2ggPSBNYXRoLmFjb3NoO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGFjb3NoXG4gIC8vIFY4IGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTM1MDlcbiAgJiYgTWF0aC5mbG9vcigkYWNvc2goTnVtYmVyLk1BWF9WQUxVRSkpID09IDcxMFxuICAvLyBUb3IgQnJvd3NlciBidWc6IE1hdGguYWNvc2goSW5maW5pdHkpIC0+IE5hTlxuICAmJiAkYWNvc2goSW5maW5pdHkpID09IEluZmluaXR5XG4pLCAnTWF0aCcsIHtcbiAgYWNvc2g6IGZ1bmN0aW9uIGFjb3NoKHgpIHtcbiAgICByZXR1cm4gKHggPSAreCkgPCAxID8gTmFOIDogeCA+IDk0OTA2MjY1LjYyNDI1MTU2XG4gICAgICA/IE1hdGgubG9nKHgpICsgTWF0aC5MTjJcbiAgICAgIDogbG9nMXAoeCAtIDEgKyBzcXJ0KHggLSAxKSAqIHNxcnQoeCArIDEpKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///159\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.5 Math.asinh(x)\nvar $export = __webpack_require__(1);\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hc2luaC5qcz81MzZiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi41IE1hdGguYXNpbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGFzaW5oID0gTWF0aC5hc2luaDtcblxuZnVuY3Rpb24gYXNpbmgoeCkge1xuICByZXR1cm4gIWlzRmluaXRlKHggPSAreCkgfHwgeCA9PSAwID8geCA6IHggPCAwID8gLWFzaW5oKC14KSA6IE1hdGgubG9nKHggKyBNYXRoLnNxcnQoeCAqIHggKyAxKSk7XG59XG5cbi8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hc2luaCgwKSAtPiAtMFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKCRhc2luaCAmJiAxIC8gJGFzaW5oKDApID4gMCksICdNYXRoJywgeyBhc2luaDogYXNpbmggfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///160\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.7 Math.atanh(x)\nvar $export = __webpack_require__(1);\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qcz9kOWFiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi43IE1hdGguYXRhbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGF0YW5oID0gTWF0aC5hdGFuaDtcblxuLy8gVG9yIEJyb3dzZXIgYnVnOiBNYXRoLmF0YW5oKC0wKSAtPiAwXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoJGF0YW5oICYmIDEgLyAkYXRhbmgoLTApIDwgMCksICdNYXRoJywge1xuICBhdGFuaDogZnVuY3Rpb24gYXRhbmgoeCkge1xuICAgIHJldHVybiAoeCA9ICt4KSA9PSAwID8geCA6IE1hdGgubG9nKCgxICsgeCkgLyAoMSAtIHgpKSAvIDI7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///161\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.9 Math.cbrt(x)\nvar $export = __webpack_require__(1);\nvar sign = __webpack_require__(70);\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jYnJ0LmpzP2Y5YWIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjkgTWF0aC5jYnJ0KHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNpZ24gPSByZXF1aXJlKCcuL19tYXRoLXNpZ24nKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjYnJ0OiBmdW5jdGlvbiBjYnJ0KHgpIHtcbiAgICByZXR1cm4gc2lnbih4ID0gK3gpICogTWF0aC5wb3coTWF0aC5hYnMoeCksIDEgLyAzKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///162\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.11 Math.clz32(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jbHozMi5qcz8zMmQ3Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4xMSBNYXRoLmNsejMyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGNsejMyOiBmdW5jdGlvbiBjbHozMih4KSB7XG4gICAgcmV0dXJuICh4ID4+Pj0gMCkgPyAzMSAtIE1hdGguZmxvb3IoTWF0aC5sb2coeCArIDAuNSkgKiBNYXRoLkxPRzJFKSA6IDMyO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///163\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.12 Math.cosh(x)\nvar $export = __webpack_require__(1);\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jb3NoLmpzPzI1YzkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjEyIE1hdGguY29zaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjb3NoOiBmdW5jdGlvbiBjb3NoKHgpIHtcbiAgICByZXR1cm4gKGV4cCh4ID0gK3gpICsgZXhwKC14KSkgLyAyO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///164\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.14 Math.expm1(x)\nvar $export = __webpack_require__(1);\nvar $expm1 = __webpack_require__(71);\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5leHBtMS5qcz85ZjNjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4xNCBNYXRoLmV4cG0xKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoJGV4cG0xICE9IE1hdGguZXhwbTEpLCAnTWF0aCcsIHsgZXhwbTE6ICRleHBtMSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///165\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.16 Math.fround(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', { fround: __webpack_require__(167) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5mcm91bmQuanM/MDQyZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgZnJvdW5kOiByZXF1aXJlKCcuL19tYXRoLWZyb3VuZCcpIH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///166\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.16 Math.fround(x)\nvar sign = __webpack_require__(70);\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1mcm91bmQuanM/OTFjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciBzaWduID0gcmVxdWlyZSgnLi9fbWF0aC1zaWduJyk7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgRVBTSUxPTiA9IHBvdygyLCAtNTIpO1xudmFyIEVQU0lMT04zMiA9IHBvdygyLCAtMjMpO1xudmFyIE1BWDMyID0gcG93KDIsIDEyNykgKiAoMiAtIEVQU0lMT04zMik7XG52YXIgTUlOMzIgPSBwb3coMiwgLTEyNik7XG5cbnZhciByb3VuZFRpZXNUb0V2ZW4gPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gbiArIDEgLyBFUFNJTE9OIC0gMSAvIEVQU0lMT047XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguZnJvdW5kIHx8IGZ1bmN0aW9uIGZyb3VuZCh4KSB7XG4gIHZhciAkYWJzID0gTWF0aC5hYnMoeCk7XG4gIHZhciAkc2lnbiA9IHNpZ24oeCk7XG4gIHZhciBhLCByZXN1bHQ7XG4gIGlmICgkYWJzIDwgTUlOMzIpIHJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7XG4gIGEgPSAoMSArIEVQU0lMT04zMiAvIEVQU0lMT04pICogJGFicztcbiAgcmVzdWx0ID0gYSAtIChhIC0gJGFicyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgaWYgKHJlc3VsdCA+IE1BWDMyIHx8IHJlc3VsdCAhPSByZXN1bHQpIHJldHVybiAkc2lnbiAqIEluZmluaXR5O1xuICByZXR1cm4gJHNpZ24gKiByZXN1bHQ7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///167\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = __webpack_require__(1);\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5oeXBvdC5qcz9jN2M2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4xNyBNYXRoLmh5cG90KFt2YWx1ZTFbLCB2YWx1ZTJbLCDigKYgXV1dKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhYnMgPSBNYXRoLmFicztcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBoeXBvdDogZnVuY3Rpb24gaHlwb3QodmFsdWUxLCB2YWx1ZTIpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciBzdW0gPSAwO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGxhcmcgPSAwO1xuICAgIHZhciBhcmcsIGRpdjtcbiAgICB3aGlsZSAoaSA8IGFMZW4pIHtcbiAgICAgIGFyZyA9IGFicyhhcmd1bWVudHNbaSsrXSk7XG4gICAgICBpZiAobGFyZyA8IGFyZykge1xuICAgICAgICBkaXYgPSBsYXJnIC8gYXJnO1xuICAgICAgICBzdW0gPSBzdW0gKiBkaXYgKiBkaXYgKyAxO1xuICAgICAgICBsYXJnID0gYXJnO1xuICAgICAgfSBlbHNlIGlmIChhcmcgPiAwKSB7XG4gICAgICAgIGRpdiA9IGFyZyAvIGxhcmc7XG4gICAgICAgIHN1bSArPSBkaXYgKiBkaXY7XG4gICAgICB9IGVsc2Ugc3VtICs9IGFyZztcbiAgICB9XG4gICAgcmV0dXJuIGxhcmcgPT09IEluZmluaXR5ID8gSW5maW5pdHkgOiBsYXJnICogTWF0aC5zcXJ0KHN1bSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///168\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.18 Math.imul(x, y)\nvar $export = __webpack_require__(1);\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * __webpack_require__(3)(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5pbXVsLmpzP2Y0ZmYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjE4IE1hdGguaW11bCh4LCB5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkaW11bCA9IE1hdGguaW11bDtcblxuLy8gc29tZSBXZWJLaXQgdmVyc2lvbnMgZmFpbHMgd2l0aCBiaWcgbnVtYmVycywgc29tZSBoYXMgd3JvbmcgYXJpdHlcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkaW11bCgweGZmZmZmZmZmLCA1KSAhPSAtNSB8fCAkaW11bC5sZW5ndGggIT0gMjtcbn0pLCAnTWF0aCcsIHtcbiAgaW11bDogZnVuY3Rpb24gaW11bCh4LCB5KSB7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZjtcbiAgICB2YXIgeG4gPSAreDtcbiAgICB2YXIgeW4gPSAreTtcbiAgICB2YXIgeGwgPSBVSU5UMTYgJiB4bjtcbiAgICB2YXIgeWwgPSBVSU5UMTYgJiB5bjtcbiAgICByZXR1cm4gMCB8IHhsICogeWwgKyAoKFVJTlQxNiAmIHhuID4+PiAxNikgKiB5bCArIHhsICogKFVJTlQxNiAmIHluID4+PiAxNikgPDwgMTYgPj4+IDApO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///169\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.21 Math.log10(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxMC5qcz83ODcyIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4yMSBNYXRoLmxvZzEwKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGxvZzEwOiBmdW5jdGlvbiBsb2cxMCh4KSB7XG4gICAgcmV0dXJuIE1hdGgubG9nKHgpICogTWF0aC5MT0cxMEU7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///170\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.20 Math.log1p(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', { log1p: __webpack_require__(101) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cxcC5qcz8wNDlmIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IGxvZzFwOiByZXF1aXJlKCcuL19tYXRoLWxvZzFwJykgfSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///171\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.22 Math.log2(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cyLmpzP2E2OWYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjIyIE1hdGgubG9nMih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBsb2cyOiBmdW5jdGlvbiBsb2cyKHgpIHtcbiAgICByZXR1cm4gTWF0aC5sb2coeCkgLyBNYXRoLkxOMjtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///172\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.28 Math.sign(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', { sign: __webpack_require__(70) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTczLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaWduLmpzPzBiMjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjI4IE1hdGguc2lnbih4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBzaWduOiByZXF1aXJlKCcuL19tYXRoLXNpZ24nKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///173\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.30 Math.sinh(x)\nvar $export = __webpack_require__(1);\nvar expm1 = __webpack_require__(71);\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * __webpack_require__(3)(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5zaW5oLmpzPzZjMWEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjMwIE1hdGguc2luaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuLy8gVjggbmVhciBDaHJvbWl1bSAzOCBoYXMgYSBwcm9ibGVtIHdpdGggdmVyeSBzbWFsbCBudW1iZXJzXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIU1hdGguc2luaCgtMmUtMTcpICE9IC0yZS0xNztcbn0pLCAnTWF0aCcsIHtcbiAgc2luaDogZnVuY3Rpb24gc2luaCh4KSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKHggPSAreCkgPCAxXG4gICAgICA/IChleHBtMSh4KSAtIGV4cG0xKC14KSkgLyAyXG4gICAgICA6IChleHAoeCAtIDEpIC0gZXhwKC14IC0gMSkpICogKE1hdGguRSAvIDIpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///174\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.33 Math.tanh(x)\nvar $export = __webpack_require__(1);\nvar expm1 = __webpack_require__(71);\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50YW5oLmpzP2M3YzYiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMi4yLjMzIE1hdGgudGFuaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB0YW5oOiBmdW5jdGlvbiB0YW5oKHgpIHtcbiAgICB2YXIgYSA9IGV4cG0xKHggPSAreCk7XG4gICAgdmFyIGIgPSBleHBtMSgteCk7XG4gICAgcmV0dXJuIGEgPT0gSW5maW5pdHkgPyAxIDogYiA9PSBJbmZpbml0eSA/IC0xIDogKGEgLSBiKSAvIChleHAoeCkgKyBleHAoLXgpKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///175\n")},function(module,exports,__webpack_require__){eval("// 20.2.2.34 Math.trunc(x)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50cnVuYy5qcz84NGI0Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIwLjIuMi4zNCBNYXRoLnRydW5jKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHRydW5jOiBmdW5jdGlvbiB0cnVuYyhpdCkge1xuICAgIHJldHVybiAoaXQgPiAwID8gTWF0aC5mbG9vciA6IE1hdGguY2VpbCkoaXQpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///176\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar toAbsoluteIndex = __webpack_require__(33);\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcz81Njk1Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyICRmcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG5cbi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW1cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCEhJGZyb21Db2RlUG9pbnQgJiYgJGZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDEpLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuMiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5jb2RlUG9pbnRzKVxuICBmcm9tQ29kZVBvaW50OiBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBjb2RlO1xuICAgIHdoaWxlIChhTGVuID4gaSkge1xuICAgICAgY29kZSA9ICthcmd1bWVudHNbaSsrXTtcbiAgICAgIGlmICh0b0Fic29sdXRlSW5kZXgoY29kZSwgMHgxMGZmZmYpICE9PSBjb2RlKSB0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIHJlcy5wdXNoKGNvZGUgPCAweDEwMDAwXG4gICAgICAgID8gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweGQ4MDAsIGNvZGUgJSAweDQwMCArIDB4ZGMwMClcbiAgICAgICk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///177\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar toIObject = __webpack_require__(16);\nvar toLength = __webpack_require__(7);\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJhdy5qcz83ODhkIl0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuNCBTdHJpbmcucmF3KGNhbGxTaXRlLCAuLi5zdWJzdGl0dXRpb25zKVxuICByYXc6IGZ1bmN0aW9uIHJhdyhjYWxsU2l0ZSkge1xuICAgIHZhciB0cGwgPSB0b0lPYmplY3QoY2FsbFNpdGUucmF3KTtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodHBsLmxlbmd0aCk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgaSA9IDA7XG4gICAgd2hpbGUgKGxlbiA+IGkpIHtcbiAgICAgIHJlcy5wdXNoKFN0cmluZyh0cGxbaSsrXSkpO1xuICAgICAgaWYgKGkgPCBhTGVuKSByZXMucHVzaChTdHJpbmcoYXJndW1lbnRzW2ldKSk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///178\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 21.1.3.25 String.prototype.trim()\n__webpack_require__(51)('trim', function ($trim) {\n return function trim() {\n return $trim(this, 3);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnRyaW0uanM/NGYzNyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyAyMS4xLjMuMjUgU3RyaW5nLnByb3RvdHlwZS50cmltKClcbnJlcXVpcmUoJy4vX3N0cmluZy10cmltJykoJ3RyaW0nLCBmdW5jdGlvbiAoJHRyaW0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDMpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///179\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $at = __webpack_require__(72)(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\n__webpack_require__(73)(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzPzVkZjMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGluZGV4ID0gdGhpcy5faTtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gTy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///180\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $at = __webpack_require__(72)(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanM/YTAzMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKGZhbHNlKTtcbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMyBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KHBvcylcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcykge1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///181\n")},function(module,exports,__webpack_require__){"use strict";eval("// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n\nvar $export = __webpack_require__(1);\nvar toLength = __webpack_require__(7);\nvar context = __webpack_require__(74);\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(76)(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aC5qcz9hZWY2Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIxLjEuMy42IFN0cmluZy5wcm90b3R5cGUuZW5kc1dpdGgoc2VhcmNoU3RyaW5nIFssIGVuZFBvc2l0aW9uXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjb250ZXh0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKTtcbnZhciBFTkRTX1dJVEggPSAnZW5kc1dpdGgnO1xudmFyICRlbmRzV2l0aCA9ICcnW0VORFNfV0lUSF07XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMtaXMtcmVnZXhwJykoRU5EU19XSVRIKSwgJ1N0cmluZycsIHtcbiAgZW5kc1dpdGg6IGZ1bmN0aW9uIGVuZHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIGVuZFBvc2l0aW9uID0gQGxlbmd0aCAqLykge1xuICAgIHZhciB0aGF0ID0gY29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIEVORFNfV0lUSCk7XG4gICAgdmFyIGVuZFBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoYXQubGVuZ3RoKTtcbiAgICB2YXIgZW5kID0gZW5kUG9zaXRpb24gPT09IHVuZGVmaW5lZCA/IGxlbiA6IE1hdGgubWluKHRvTGVuZ3RoKGVuZFBvc2l0aW9uKSwgbGVuKTtcbiAgICB2YXIgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRlbmRzV2l0aFxuICAgICAgPyAkZW5kc1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGVuZClcbiAgICAgIDogdGhhdC5zbGljZShlbmQgLSBzZWFyY2gubGVuZ3RoLCBlbmQpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///182\n")},function(module,exports,__webpack_require__){"use strict";eval("// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n\nvar $export = __webpack_require__(1);\nvar context = __webpack_require__(74);\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * __webpack_require__(76)(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmluY2x1ZGVzLmpzPzJmZGIiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjEuMS4zLjcgU3RyaW5nLnByb3RvdHlwZS5pbmNsdWRlcyhzZWFyY2hTdHJpbmcsIHBvc2l0aW9uID0gMClcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgSU5DTFVERVMgPSAnaW5jbHVkZXMnO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKElOQ0xVREVTKSwgJ1N0cmluZycsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHJldHVybiAhIX5jb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgSU5DTFVERVMpXG4gICAgICAuaW5kZXhPZihzZWFyY2hTdHJpbmcsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///183\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: __webpack_require__(69)\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdC5qcz8xNGI5Il0sInNvdXJjZXNDb250ZW50IjpbInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMTMgU3RyaW5nLnByb3RvdHlwZS5yZXBlYXQoY291bnQpXG4gIHJlcGVhdDogcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///184\n")},function(module,exports,__webpack_require__){"use strict";eval("// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n\nvar $export = __webpack_require__(1);\nvar toLength = __webpack_require__(7);\nvar context = __webpack_require__(74);\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * __webpack_require__(76)(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoLmpzP2Y1NTkiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjEuMS4zLjE4IFN0cmluZy5wcm90b3R5cGUuc3RhcnRzV2l0aChzZWFyY2hTdHJpbmcgWywgcG9zaXRpb24gXSlcbid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjb250ZXh0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWNvbnRleHQnKTtcbnZhciBTVEFSVFNfV0lUSCA9ICdzdGFydHNXaXRoJztcbnZhciAkc3RhcnRzV2l0aCA9ICcnW1NUQVJUU19XSVRIXTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShTVEFSVFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgdmFyIHRoYXQgPSBjb250ZXh0KHRoaXMsIHNlYXJjaFN0cmluZywgU1RBUlRTX1dJVEgpO1xuICAgIHZhciBpbmRleCA9IHRvTGVuZ3RoKE1hdGgubWluKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0aGF0Lmxlbmd0aCkpO1xuICAgIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoU3RyaW5nKTtcbiAgICByZXR1cm4gJHN0YXJ0c1dpdGhcbiAgICAgID8gJHN0YXJ0c1dpdGguY2FsbCh0aGF0LCBzZWFyY2gsIGluZGV4KVxuICAgICAgOiB0aGF0LnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaC5sZW5ndGgpID09PSBzZWFyY2g7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///185\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.2 String.prototype.anchor(name)\n__webpack_require__(13)('anchor', function (createHTML) {\n return function anchor(name) {\n return createHTML(this, 'a', 'name', name);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmFuY2hvci5qcz84NDQ5Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjIgU3RyaW5nLnByb3RvdHlwZS5hbmNob3IobmFtZSlcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2FuY2hvcicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBhbmNob3IobmFtZSkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ25hbWUnLCBuYW1lKTtcbiAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///186\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.3 String.prototype.big()\n__webpack_require__(13)('big', function (createHTML) {\n return function big() {\n return createHTML(this, 'big', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJpZy5qcz85Yzg2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjMgU3RyaW5nLnByb3RvdHlwZS5iaWcoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYmlnJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJpZygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYmlnJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///187\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.4 String.prototype.blink()\n__webpack_require__(13)('blink', function (createHTML) {\n return function blink() {\n return createHTML(this, 'blink', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJsaW5rLmpzP2ZhODMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNCBTdHJpbmcucHJvdG90eXBlLmJsaW5rKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JsaW5rJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJsaW5rKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdibGluaycsICcnLCAnJyk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///188\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.5 String.prototype.bold()\n__webpack_require__(13)('bold', function (createHTML) {\n return function bold() {\n return createHTML(this, 'b', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTg5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJvbGQuanM/NDhjMCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy41IFN0cmluZy5wcm90b3R5cGUuYm9sZCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdib2xkJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJvbGQoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2InLCAnJywgJycpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///189\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.6 String.prototype.fixed()\n__webpack_require__(13)('fixed', function (createHTML) {\n return function fixed() {\n return createHTML(this, 'tt', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZpeGVkLmpzP2QyNjMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuNiBTdHJpbmcucHJvdG90eXBlLmZpeGVkKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZpeGVkJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZpeGVkKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICd0dCcsICcnLCAnJyk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///190\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.7 String.prototype.fontcolor(color)\n__webpack_require__(13)('fontcolor', function (createHTML) {\n return function fontcolor(color) {\n return createHTML(this, 'font', 'color', color);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvci5qcz82YzM3Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjcgU3RyaW5nLnByb3RvdHlwZS5mb250Y29sb3IoY29sb3IpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmb250Y29sb3InLCBmdW5jdGlvbiAoY3JlYXRlSFRNTCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9udGNvbG9yKGNvbG9yKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2ZvbnQnLCAnY29sb3InLCBjb2xvcik7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///191\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.8 String.prototype.fontsize(size)\n__webpack_require__(13)('fontsize', function (createHTML) {\n return function fontsize(size) {\n return createHTML(this, 'font', 'size', size);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRzaXplLmpzPzllYzgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuOCBTdHJpbmcucHJvdG90eXBlLmZvbnRzaXplKHNpemUpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmb250c2l6ZScsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmb250c2l6ZShzaXplKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2ZvbnQnLCAnc2l6ZScsIHNpemUpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///192\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.9 String.prototype.italics()\n__webpack_require__(13)('italics', function (createHTML) {\n return function italics() {\n return createHTML(this, 'i', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MuanM/ZDBiMCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy45IFN0cmluZy5wcm90b3R5cGUuaXRhbGljcygpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdpdGFsaWNzJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGl0YWxpY3MoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2knLCAnJywgJycpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///193\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.10 String.prototype.link(url)\n__webpack_require__(13)('link', function (createHTML) {\n return function link(url) {\n return createHTML(this, 'a', 'href', url);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmxpbmsuanM/YjU0YSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMCBTdHJpbmcucHJvdG90eXBlLmxpbmsodXJsKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnbGluaycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBsaW5rKHVybCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ2hyZWYnLCB1cmwpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///194\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.11 String.prototype.small()\n__webpack_require__(13)('small', function (createHTML) {\n return function small() {\n return createHTML(this, 'small', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnNtYWxsLmpzP2YzODYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMTEgU3RyaW5nLnByb3RvdHlwZS5zbWFsbCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdzbWFsbCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzbWFsbCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnc21hbGwnLCAnJywgJycpO1xuICB9O1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///195\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.12 String.prototype.strike()\n__webpack_require__(13)('strike', function (createHTML) {\n return function strike() {\n return createHTML(this, 'strike', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0cmlrZS5qcz8xNDQ4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEyIFN0cmluZy5wcm90b3R5cGUuc3RyaWtlKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N0cmlrZScsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdHJpa2UoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N0cmlrZScsICcnLCAnJyk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///196\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.13 String.prototype.sub()\n__webpack_require__(13)('sub', function (createHTML) {\n return function sub() {\n return createHTML(this, 'sub', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1Yi5qcz82NzNlIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEzIFN0cmluZy5wcm90b3R5cGUuc3ViKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1YicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdWIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1YicsICcnLCAnJyk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///197\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// B.2.3.14 String.prototype.sup()\n__webpack_require__(13)('sup', function (createHTML) {\n return function sup() {\n return createHTML(this, 'sup', '', '');\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1cC5qcz8yNDJhIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjE0IFN0cmluZy5wcm90b3R5cGUuc3VwKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1cCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdXAoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1cCcsICcnLCAnJyk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///198\n")},function(module,exports,__webpack_require__){eval("// 20.3.3.1 / 15.9.4.4 Date.now()\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Date', { now: function () { return new Date().getTime(); } });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTk5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS5ub3cuanM/NzhjZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMC4zLjMuMSAvIDE1LjkuNC40IERhdGUubm93KClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnRGF0ZScsIHsgbm93OiBmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgfSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///199\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar toObject = __webpack_require__(12);\nvar toPrimitive = __webpack_require__(27);\n\n$export($export.P + $export.F * __webpack_require__(3)(function () {\n return new Date(NaN).toJSON() !== null\n || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;\n}), 'Date', {\n // eslint-disable-next-line no-unused-vars\n toJSON: function toJSON(key) {\n var O = toObject(this);\n var pv = toPrimitive(O);\n return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1qc29uLmpzPzAyOTgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgRGF0ZShOYU4pLnRvSlNPTigpICE9PSBudWxsXG4gICAgfHwgRGF0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoeyB0b0lTT1N0cmluZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSB9KSAhPT0gMTtcbn0pLCAnRGF0ZScsIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHRvSlNPTjogZnVuY3Rpb24gdG9KU09OKGtleSkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHB2ID0gdG9QcmltaXRpdmUoTyk7XG4gICAgcmV0dXJuIHR5cGVvZiBwdiA9PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUocHYpID8gbnVsbCA6IE8udG9JU09TdHJpbmcoKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///200\n")},function(module,exports,__webpack_require__){eval("// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar $export = __webpack_require__(1);\nvar toISOString = __webpack_require__(202);\n\n// PhantomJS / old WebKit has a broken implementations\n$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {\n toISOString: toISOString\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1pc28tc3RyaW5nLmpzPzhlYTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JU09TdHJpbmcgPSByZXF1aXJlKCcuL19kYXRlLXRvLWlzby1zdHJpbmcnKTtcblxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyAhPT0gdG9JU09TdHJpbmcpLCAnRGF0ZScsIHtcbiAgdG9JU09TdHJpbmc6IHRvSVNPU3RyaW5nXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///201\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar fails = __webpack_require__(3);\nvar getTime = Date.prototype.getTime;\nvar $toISOString = Date.prototype.toISOString;\n\nvar lz = function (num) {\n return num > 9 ? num : '0' + num;\n};\n\n// PhantomJS / old WebKit has a broken implementations\nmodule.exports = (fails(function () {\n return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';\n}) || !fails(function () {\n $toISOString.call(new Date(NaN));\n})) ? function toISOString() {\n if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');\n var d = this;\n var y = d.getUTCFullYear();\n var m = d.getUTCMilliseconds();\n var s = y < 0 ? '-' : y > 9999 ? '+' : '';\n return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +\n '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +\n 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +\n ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n} : $toISOString;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1pc28tc3RyaW5nLmpzPzhlZDAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuLy8gMjAuMy40LjM2IC8gMTUuOS41LjQzIERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKClcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZ2V0VGltZSA9IERhdGUucHJvdG90eXBlLmdldFRpbWU7XG52YXIgJHRvSVNPU3RyaW5nID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5cbnZhciBseiA9IGZ1bmN0aW9uIChudW0pIHtcbiAgcmV0dXJuIG51bSA+IDkgPyBudW0gOiAnMCcgKyBudW07XG59O1xuXG4vLyBQaGFudG9tSlMgLyBvbGQgV2ViS2l0IGhhcyBhIGJyb2tlbiBpbXBsZW1lbnRhdGlvbnNcbm1vZHVsZS5leHBvcnRzID0gKGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuICR0b0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKC01ZTEzIC0gMSkpICE9ICcwMzg1LTA3LTI1VDA3OjA2OjM5Ljk5OVonO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgJHRvSVNPU3RyaW5nLmNhbGwobmV3IERhdGUoTmFOKSk7XG59KSkgPyBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHtcbiAgaWYgKCFpc0Zpbml0ZShnZXRUaW1lLmNhbGwodGhpcykpKSB0aHJvdyBSYW5nZUVycm9yKCdJbnZhbGlkIHRpbWUgdmFsdWUnKTtcbiAgdmFyIGQgPSB0aGlzO1xuICB2YXIgeSA9IGQuZ2V0VVRDRnVsbFllYXIoKTtcbiAgdmFyIG0gPSBkLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICB2YXIgcyA9IHkgPCAwID8gJy0nIDogeSA+IDk5OTkgPyAnKycgOiAnJztcbiAgcmV0dXJuIHMgKyAoJzAwMDAwJyArIE1hdGguYWJzKHkpKS5zbGljZShzID8gLTYgOiAtNCkgK1xuICAgICctJyArIGx6KGQuZ2V0VVRDTW9udGgoKSArIDEpICsgJy0nICsgbHooZC5nZXRVVENEYXRlKCkpICtcbiAgICAnVCcgKyBseihkLmdldFVUQ0hvdXJzKCkpICsgJzonICsgbHooZC5nZXRVVENNaW51dGVzKCkpICtcbiAgICAnOicgKyBseihkLmdldFVUQ1NlY29uZHMoKSkgKyAnLicgKyAobSA+IDk5ID8gbSA6ICcwJyArIGx6KG0pKSArICdaJztcbn0gOiAkdG9JU09TdHJpbmc7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///202\n")},function(module,exports,__webpack_require__){eval("var DateProto = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar $toString = DateProto[TO_STRING];\nvar getTime = DateProto.getTime;\nif (new Date(NaN) + '' != INVALID_DATE) {\n __webpack_require__(11)(DateProto, TO_STRING, function toString() {\n var value = getTime.call(this);\n // eslint-disable-next-line no-self-compare\n return value === value ? $toString.call(this) : INVALID_DATE;\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1zdHJpbmcuanM/ODdiMyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgRGF0ZVByb3RvID0gRGF0ZS5wcm90b3R5cGU7XG52YXIgSU5WQUxJRF9EQVRFID0gJ0ludmFsaWQgRGF0ZSc7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciAkdG9TdHJpbmcgPSBEYXRlUHJvdG9bVE9fU1RSSU5HXTtcbnZhciBnZXRUaW1lID0gRGF0ZVByb3RvLmdldFRpbWU7XG5pZiAobmV3IERhdGUoTmFOKSArICcnICE9IElOVkFMSURfREFURSkge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKERhdGVQcm90bywgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgdmFsdWUgPSBnZXRUaW1lLmNhbGwodGhpcyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyAkdG9TdHJpbmcuY2FsbCh0aGlzKSA6IElOVkFMSURfREFURTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///203\n")},function(module,exports,__webpack_require__){eval("var TO_PRIMITIVE = __webpack_require__(6)('toPrimitive');\nvar proto = Date.prototype;\n\nif (!(TO_PRIMITIVE in proto)) __webpack_require__(15)(proto, TO_PRIMITIVE, __webpack_require__(205));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1wcmltaXRpdmUuanM/YzhjZSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgVE9fUFJJTUlUSVZFID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvUHJpbWl0aXZlJyk7XG52YXIgcHJvdG8gPSBEYXRlLnByb3RvdHlwZTtcblxuaWYgKCEoVE9fUFJJTUlUSVZFIGluIHByb3RvKSkgcmVxdWlyZSgnLi9faGlkZScpKHByb3RvLCBUT19QUklNSVRJVkUsIHJlcXVpcmUoJy4vX2RhdGUtdG8tcHJpbWl0aXZlJykpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///204\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar anObject = __webpack_require__(4);\nvar toPrimitive = __webpack_require__(27);\nvar NUMBER = 'number';\n\nmodule.exports = function (hint) {\n if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');\n return toPrimitive(anObject(this), hint != NUMBER);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGF0ZS10by1wcmltaXRpdmUuanM/ODM4MSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIE5VTUJFUiA9ICdudW1iZXInO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChoaW50KSB7XG4gIGlmIChoaW50ICE9PSAnc3RyaW5nJyAmJiBoaW50ICE9PSBOVU1CRVIgJiYgaGludCAhPT0gJ2RlZmF1bHQnKSB0aHJvdyBUeXBlRXJyb3IoJ0luY29ycmVjdCBoaW50Jyk7XG4gIHJldHVybiB0b1ByaW1pdGl2ZShhbk9iamVjdCh0aGlzKSwgaGludCAhPSBOVU1CRVIpO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///205\n")},function(module,exports,__webpack_require__){eval("// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Array', { isArray: __webpack_require__(64) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXMtYXJyYXkuanM/MmNhZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjIuMiAvIDE1LjQuMy4yIEFycmF5LmlzQXJyYXkoYXJnKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdBcnJheScsIHsgaXNBcnJheTogcmVxdWlyZSgnLi9faXMtYXJyYXknKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///206\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar ctx = __webpack_require__(22);\nvar $export = __webpack_require__(1);\nvar toObject = __webpack_require__(12);\nvar call = __webpack_require__(103);\nvar isArrayIter = __webpack_require__(77);\nvar toLength = __webpack_require__(7);\nvar createProperty = __webpack_require__(78);\nvar getIterFn = __webpack_require__(79);\n\n$export($export.S + $export.F * !__webpack_require__(52)(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qcz8xYzRjIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciBjYWxsID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJyk7XG52YXIgaXNBcnJheUl0ZXIgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2l0ZXItZGV0ZWN0JykoZnVuY3Rpb24gKGl0ZXIpIHsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZSAvKiAsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkICovKSB7XG4gICAgdmFyIE8gPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIG1hcGZuID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gICAgdmFyIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGl0ZXJGbiA9IGdldEl0ZXJGbihPKTtcbiAgICB2YXIgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmIChtYXBwaW5nKSBtYXBmbiA9IGN0eChtYXBmbiwgYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmIChpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQygpOyAhKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmU7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IGNhbGwoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IgKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBtYXBmbihPW2luZGV4XSwgaW5kZXgpIDogT1tpbmRleF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQubGVuZ3RoID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///207\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar createProperty = __webpack_require__(78);\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * __webpack_require__(3)(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkub2YuanM/ZTgwNCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG5cbi8vIFdlYktpdCBBcnJheS5vZiBpc24ndCBnZW5lcmljXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiAhKEFycmF5Lm9mLmNhbGwoRikgaW5zdGFuY2VvZiBGKTtcbn0pLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMi4zIEFycmF5Lm9mKCAuLi5pdGVtcylcbiAgb2Y6IGZ1bmN0aW9uIG9mKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gbmV3ICh0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5KShhTGVuKTtcbiAgICB3aGlsZSAoYUxlbiA+IGluZGV4KSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHJlc3VsdC5sZW5ndGggPSBhTGVuO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///208\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 22.1.3.13 Array.prototype.join(separator)\nvar $export = __webpack_require__(1);\nvar toIObject = __webpack_require__(16);\nvar arrayJoin = [].join;\n\n// fallback for not array-like strings\n$export($export.P + $export.F * (__webpack_require__(44) != Object || !__webpack_require__(17)(arrayJoin)), 'Array', {\n join: function join(separator) {\n return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjA5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuam9pbi5qcz8zNzNmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUuam9pbihzZXBhcmF0b3IpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBhcnJheUpvaW4gPSBbXS5qb2luO1xuXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2Ugc3RyaW5nc1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAocmVxdWlyZSgnLi9faW9iamVjdCcpICE9IE9iamVjdCB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKGFycmF5Sm9pbikpLCAnQXJyYXknLCB7XG4gIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7XG4gICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRvSU9iamVjdCh0aGlzKSwgc2VwYXJhdG9yID09PSB1bmRlZmluZWQgPyAnLCcgOiBzZXBhcmF0b3IpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///209\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar html = __webpack_require__(65);\nvar cof = __webpack_require__(24);\nvar toAbsoluteIndex = __webpack_require__(33);\nvar toLength = __webpack_require__(7);\nvar arraySlice = [].slice;\n\n// fallback for not array-like ES3 strings and DOM objects\n$export($export.P + $export.F * __webpack_require__(3)(function () {\n if (html) arraySlice.call(html);\n}), 'Array', {\n slice: function slice(begin, end) {\n var len = toLength(this.length);\n var klass = cof(this);\n end = end === undefined ? len : end;\n if (klass == 'Array') return arraySlice.call(this, begin, end);\n var start = toAbsoluteIndex(begin, len);\n var upTo = toAbsoluteIndex(end, len);\n var size = toLength(upTo - start);\n var cloned = new Array(size);\n var i = 0;\n for (; i < size; i++) cloned[i] = klass == 'String'\n ? this.charAt(start + i)\n : this[start + i];\n return cloned;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UuanM/MjNiZiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuL19odG1sJyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFycmF5U2xpY2UgPSBbXS5zbGljZTtcblxuLy8gZmFsbGJhY2sgZm9yIG5vdCBhcnJheS1saWtlIEVTMyBzdHJpbmdzIGFuZCBET00gb2JqZWN0c1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgaWYgKGh0bWwpIGFycmF5U2xpY2UuY2FsbChodG1sKTtcbn0pLCAnQXJyYXknLCB7XG4gIHNsaWNlOiBmdW5jdGlvbiBzbGljZShiZWdpbiwgZW5kKSB7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRoaXMubGVuZ3RoKTtcbiAgICB2YXIga2xhc3MgPSBjb2YodGhpcyk7XG4gICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiBlbmQ7XG4gICAgaWYgKGtsYXNzID09ICdBcnJheScpIHJldHVybiBhcnJheVNsaWNlLmNhbGwodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgdmFyIHN0YXJ0ID0gdG9BYnNvbHV0ZUluZGV4KGJlZ2luLCBsZW4pO1xuICAgIHZhciB1cFRvID0gdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuKTtcbiAgICB2YXIgc2l6ZSA9IHRvTGVuZ3RoKHVwVG8gLSBzdGFydCk7XG4gICAgdmFyIGNsb25lZCA9IG5ldyBBcnJheShzaXplKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yICg7IGkgPCBzaXplOyBpKyspIGNsb25lZFtpXSA9IGtsYXNzID09ICdTdHJpbmcnXG4gICAgICA/IHRoaXMuY2hhckF0KHN0YXJ0ICsgaSlcbiAgICAgIDogdGhpc1tzdGFydCArIGldO1xuICAgIHJldHVybiBjbG9uZWQ7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///210\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar aFunction = __webpack_require__(23);\nvar toObject = __webpack_require__(12);\nvar fails = __webpack_require__(3);\nvar $sort = [].sort;\nvar test = [1, 2, 3];\n\n$export($export.P + $export.F * (fails(function () {\n // IE8-\n test.sort(undefined);\n}) || !fails(function () {\n // V8 bug\n test.sort(null);\n // Old WebKit\n}) || !__webpack_require__(17)($sort)), 'Array', {\n // 22.1.3.25 Array.prototype.sort(comparefn)\n sort: function sort(comparefn) {\n return comparefn === undefined\n ? $sort.call(toObject(this))\n : $sort.call(toObject(this), aFunction(comparefn));\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjExLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc29ydC5qcz81NWRkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyICRzb3J0ID0gW10uc29ydDtcbnZhciB0ZXN0ID0gWzEsIDIsIDNdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIElFOC1cbiAgdGVzdC5zb3J0KHVuZGVmaW5lZCk7XG59KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBWOCBidWdcbiAgdGVzdC5zb3J0KG51bGwpO1xuICAvLyBPbGQgV2ViS2l0XG59KSB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRzb3J0KSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjI1IEFycmF5LnByb3RvdHlwZS5zb3J0KGNvbXBhcmVmbilcbiAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlZm4pIHtcbiAgICByZXR1cm4gY29tcGFyZWZuID09PSB1bmRlZmluZWRcbiAgICAgID8gJHNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSlcbiAgICAgIDogJHNvcnQuY2FsbCh0b09iamVjdCh0aGlzKSwgYUZ1bmN0aW9uKGNvbXBhcmVmbikpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///211\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $forEach = __webpack_require__(21)(0);\nvar STRICT = __webpack_require__(17)([].forEach, true);\n\n$export($export.P + $export.F * !STRICT, 'Array', {\n // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n forEach: function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZm9yLWVhY2guanM/ZjNlMiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmb3JFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIFNUUklDVCA9IHJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5mb3JFYWNoLCB0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhU1RSSUNULCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xMCAvIDE1LjQuNC4xOCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmb3JFYWNoKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///212\n")},function(module,exports,__webpack_require__){eval("// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = __webpack_require__(214);\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanM/Y2QxYyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyA5LjQuMi4zIEFycmF5U3BlY2llc0NyZWF0ZShvcmlnaW5hbEFycmF5LCBsZW5ndGgpXG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCwgbGVuZ3RoKSB7XG4gIHJldHVybiBuZXcgKHNwZWNpZXNDb25zdHJ1Y3RvcihvcmlnaW5hbCkpKGxlbmd0aCk7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///213\n")},function(module,exports,__webpack_require__){eval("var isObject = __webpack_require__(5);\nvar isArray = __webpack_require__(64);\nvar SPECIES = __webpack_require__(6)('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcz9lODUzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIFNQRUNJRVMgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvcmlnaW5hbCkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWwpKSB7XG4gICAgQyA9IG9yaWdpbmFsLmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IGlzQXJyYXkoQy5wcm90b3R5cGUpKSkgQyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBDID09PSB1bmRlZmluZWQgPyBBcnJheSA6IEM7XG59O1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///214\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $map = __webpack_require__(21)(1);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].map, true), 'Array', {\n // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubWFwLmpzPzZkNjciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkbWFwID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDEpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ubWFwLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTUgLyAxNS40LjQuMTkgQXJyYXkucHJvdG90eXBlLm1hcChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkbWFwKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///215\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $filter = __webpack_require__(21)(2);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].filter, true), 'Array', {\n // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyLmpzP2QyNWYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmlsdGVyID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDIpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZmlsdGVyLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNyAvIDE1LjQuNC4yMCBBcnJheS5wcm90b3R5cGUuZmlsdGVyKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIGZpbHRlcjogZnVuY3Rpb24gZmlsdGVyKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmaWx0ZXIodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///216\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $some = __webpack_require__(21)(3);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].some, true), 'Array', {\n // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc29tZS5qcz83NTlmIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHNvbWUgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5zb21lLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMjMgLyAxNS40LjQuMTcgQXJyYXkucHJvdG90eXBlLnNvbWUoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgc29tZTogZnVuY3Rpb24gc29tZShjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkc29tZSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///217\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $every = __webpack_require__(21)(4);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].every, true), 'Array', {\n // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZXZlcnkuanM/NjA5NSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRldmVyeSA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg0KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKFtdLmV2ZXJ5LCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuNSAvIDE1LjQuNC4xNiBBcnJheS5wcm90b3R5cGUuZXZlcnkoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZXZlcnk6IGZ1bmN0aW9uIGV2ZXJ5KGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRldmVyeSh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///218\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $reduce = __webpack_require__(104);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].reduce, true), 'Array', {\n // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments[1], false);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjE5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLmpzPzBjZDgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXktcmVkdWNlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5yZWR1Y2UsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xOCAvIDE1LjQuNC4yMSBBcnJheS5wcm90b3R5cGUucmVkdWNlKGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgZmFsc2UpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///219\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $reduce = __webpack_require__(104);\n\n$export($export.P + $export.F * !__webpack_require__(17)([].reduceRight, true), 'Array', {\n // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n reduceRight: function reduceRight(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments[1], true);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlLXJpZ2h0LmpzPzQ4ZjgiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXktcmVkdWNlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5yZWR1Y2VSaWdodCwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjE5IC8gMTUuNC40LjIyIEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodChjYWxsYmFja2ZuIFssIGluaXRpYWxWYWx1ZV0pXG4gIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7XG4gICAgcmV0dXJuICRyZWR1Y2UodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCwgYXJndW1lbnRzWzFdLCB0cnVlKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///220\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $indexOf = __webpack_require__(49)(false);\nvar $native = [].indexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(17)($native)), 'Array', {\n // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? $native.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments[1]);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaW5kZXgtb2YuanM/NTdlNyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRpbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSk7XG52YXIgJG5hdGl2ZSA9IFtdLmluZGV4T2Y7XG52YXIgTkVHQVRJVkVfWkVSTyA9ICEhJG5hdGl2ZSAmJiAxIC8gWzFdLmluZGV4T2YoMSwgLTApIDwgMDtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoTkVHQVRJVkVfWkVSTyB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRuYXRpdmUpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTEgLyAxNS40LjQuMTQgQXJyYXkucHJvdG90eXBlLmluZGV4T2Yoc2VhcmNoRWxlbWVudCBbLCBmcm9tSW5kZXhdKVxuICBpbmRleE9mOiBmdW5jdGlvbiBpbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuIE5FR0FUSVZFX1pFUk9cbiAgICAgIC8vIGNvbnZlcnQgLTAgdG8gKzBcbiAgICAgID8gJG5hdGl2ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDBcbiAgICAgIDogJGluZGV4T2YodGhpcywgc2VhcmNoRWxlbWVudCwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///221\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar toIObject = __webpack_require__(16);\nvar toInteger = __webpack_require__(18);\nvar toLength = __webpack_require__(7);\nvar $native = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(17)($native)), 'Array', {\n // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;\n var O = toIObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0;\n return -1;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubGFzdC1pbmRleC1vZi5qcz85ODY1Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyICRuYXRpdmUgPSBbXS5sYXN0SW5kZXhPZjtcbnZhciBORUdBVElWRV9aRVJPID0gISEkbmF0aXZlICYmIDEgLyBbMV0ubGFzdEluZGV4T2YoMSwgLTApIDwgMDtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoTkVHQVRJVkVfWkVSTyB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRuYXRpdmUpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTQgLyAxNS40LjQuMTUgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcbiAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSBAWyotMV0gKi8pIHtcbiAgICAvLyBjb252ZXJ0IC0wIHRvICswXG4gICAgaWYgKE5FR0FUSVZFX1pFUk8pIHJldHVybiAkbmF0aXZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMDtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSBpbmRleCA9IE1hdGgubWluKGluZGV4LCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7XG4gICAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSBsZW5ndGggKyBpbmRleDtcbiAgICBmb3IgKDtpbmRleCA+PSAwOyBpbmRleC0tKSBpZiAoaW5kZXggaW4gTykgaWYgKE9baW5kZXhdID09PSBzZWFyY2hFbGVtZW50KSByZXR1cm4gaW5kZXggfHwgMDtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///222\n")},function(module,exports,__webpack_require__){eval("// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = __webpack_require__(1);\n\n$export($export.P, 'Array', { copyWithin: __webpack_require__(105) });\n\n__webpack_require__(40)('copyWithin');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuY29weS13aXRoaW4uanM/NzQ0ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnQXJyYXknLCB7IGNvcHlXaXRoaW46IHJlcXVpcmUoJy4vX2FycmF5LWNvcHktd2l0aGluJykgfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdjb3B5V2l0aGluJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///223\n")},function(module,exports,__webpack_require__){eval("// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = __webpack_require__(1);\n\n$export($export.P, 'Array', { fill: __webpack_require__(80) });\n\n__webpack_require__(40)('fill');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmlsbC5qcz82YzdiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHsgZmlsbDogcmVxdWlyZSgnLi9fYXJyYXktZmlsbCcpIH0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmlsbCcpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///224\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = __webpack_require__(1);\nvar $find = __webpack_require__(21)(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n__webpack_require__(40)(KEY);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC5qcz83NTE0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy44IEFycmF5LnByb3RvdHlwZS5maW5kKHByZWRpY2F0ZSwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoNSk7XG52YXIgS0VZID0gJ2ZpbmQnO1xudmFyIGZvcmNlZCA9IHRydWU7XG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYgKEtFWSBpbiBbXSkgQXJyYXkoMSlbS0VZXShmdW5jdGlvbiAoKSB7IGZvcmNlZCA9IGZhbHNlOyB9KTtcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZm9yY2VkLCAnQXJyYXknLCB7XG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKEtFWSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///225\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = __webpack_require__(1);\nvar $find = __webpack_require__(21)(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n__webpack_require__(40)(KEY);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZmluZC1pbmRleC5qcz8yMGQ2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy45IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgocHJlZGljYXRlLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmluZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg2KTtcbnZhciBLRVkgPSAnZmluZEluZGV4JztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoS0VZKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///226\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(41)('Array');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc3BlY2llcy5qcz9kMDRmIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ0FycmF5Jyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///227\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(2);\nvar inheritIfRequired = __webpack_require__(68);\nvar dP = __webpack_require__(8).f;\nvar gOPN = __webpack_require__(35).f;\nvar isRegExp = __webpack_require__(75);\nvar $flags = __webpack_require__(53);\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (__webpack_require__(9) && (!CORRECT_NEW || __webpack_require__(3)(function () {\n re2[__webpack_require__(6)('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n __webpack_require__(11)(global, 'RegExp', $RegExp);\n}\n\n__webpack_require__(41)('RegExp');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yLmpzPzNiMmIiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGluaGVyaXRJZlJlcXVpcmVkID0gcmVxdWlyZSgnLi9faW5oZXJpdC1pZi1yZXF1aXJlZCcpO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgJGZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcbnZhciAkUmVnRXhwID0gZ2xvYmFsLlJlZ0V4cDtcbnZhciBCYXNlID0gJFJlZ0V4cDtcbnZhciBwcm90byA9ICRSZWdFeHAucHJvdG90eXBlO1xudmFyIHJlMSA9IC9hL2c7XG52YXIgcmUyID0gL2EvZztcbi8vIFwibmV3XCIgY3JlYXRlcyBhIG5ldyBvYmplY3QsIG9sZCB3ZWJraXQgYnVnZ3kgaGVyZVxudmFyIENPUlJFQ1RfTkVXID0gbmV3ICRSZWdFeHAocmUxKSAhPT0gcmUxO1xuXG5pZiAocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAoIUNPUlJFQ1RfTkVXIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZTJbcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyldID0gZmFsc2U7XG4gIC8vIFJlZ0V4cCBjb25zdHJ1Y3RvciBjYW4gYWx0ZXIgZmxhZ3MgYW5kIElzUmVnRXhwIHdvcmtzIGNvcnJlY3Qgd2l0aCBAQG1hdGNoXG4gIHJldHVybiAkUmVnRXhwKHJlMSkgIT0gcmUxIHx8ICRSZWdFeHAocmUyKSA9PSByZTIgfHwgJFJlZ0V4cChyZTEsICdpJykgIT0gJy9hL2knO1xufSkpKSB7XG4gICRSZWdFeHAgPSBmdW5jdGlvbiBSZWdFeHAocCwgZikge1xuICAgIHZhciB0aVJFID0gdGhpcyBpbnN0YW5jZW9mICRSZWdFeHA7XG4gICAgdmFyIHBpUkUgPSBpc1JlZ0V4cChwKTtcbiAgICB2YXIgZmlVID0gZiA9PT0gdW5kZWZpbmVkO1xuICAgIHJldHVybiAhdGlSRSAmJiBwaVJFICYmIHAuY29uc3RydWN0b3IgPT09ICRSZWdFeHAgJiYgZmlVID8gcFxuICAgICAgOiBpbmhlcml0SWZSZXF1aXJlZChDT1JSRUNUX05FV1xuICAgICAgICA/IG5ldyBCYXNlKHBpUkUgJiYgIWZpVSA/IHAuc291cmNlIDogcCwgZilcbiAgICAgICAgOiBCYXNlKChwaVJFID0gcCBpbnN0YW5jZW9mICRSZWdFeHApID8gcC5zb3VyY2UgOiBwLCBwaVJFICYmIGZpVSA/ICRmbGFncy5jYWxsKHApIDogZilcbiAgICAgICwgdGlSRSA/IHRoaXMgOiBwcm90bywgJFJlZ0V4cCk7XG4gIH07XG4gIHZhciBwcm94eSA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBrZXkgaW4gJFJlZ0V4cCB8fCBkUCgkUmVnRXhwLCBrZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gQmFzZVtrZXldOyB9LFxuICAgICAgc2V0OiBmdW5jdGlvbiAoaXQpIHsgQmFzZVtrZXldID0gaXQ7IH1cbiAgICB9KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IGdPUE4oQmFzZSksIGkgPSAwOyBrZXlzLmxlbmd0aCA+IGk7KSBwcm94eShrZXlzW2krK10pO1xuICBwcm90by5jb25zdHJ1Y3RvciA9ICRSZWdFeHA7XG4gICRSZWdFeHAucHJvdG90eXBlID0gcHJvdG87XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoZ2xvYmFsLCAnUmVnRXhwJywgJFJlZ0V4cCk7XG59XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ1JlZ0V4cCcpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///228\n")},function(module,exports,__webpack_require__){"use strict";eval("\n__webpack_require__(108);\nvar anObject = __webpack_require__(4);\nvar $flags = __webpack_require__(53);\nvar DESCRIPTORS = __webpack_require__(9);\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n __webpack_require__(11)(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (__webpack_require__(3)(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjI5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnRvLXN0cmluZy5qcz82YjU0Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4vZXM2LnJlZ2V4cC5mbGFncycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJGZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciAkdG9TdHJpbmcgPSAvLi9bVE9fU1RSSU5HXTtcblxudmFyIGRlZmluZSA9IGZ1bmN0aW9uIChmbikge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKFJlZ0V4cC5wcm90b3R5cGUsIFRPX1NUUklORywgZm4sIHRydWUpO1xufTtcblxuLy8gMjEuMi41LjE0IFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcoKVxuaWYgKHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkgeyByZXR1cm4gJHRvU3RyaW5nLmNhbGwoeyBzb3VyY2U6ICdhJywgZmxhZ3M6ICdiJyB9KSAhPSAnL2EvYic7IH0pKSB7XG4gIGRlZmluZShmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgUiA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHJldHVybiAnLycuY29uY2F0KFIuc291cmNlLCAnLycsXG4gICAgICAnZmxhZ3MnIGluIFIgPyBSLmZsYWdzIDogIURFU0NSSVBUT1JTICYmIFIgaW5zdGFuY2VvZiBSZWdFeHAgPyAkZmxhZ3MuY2FsbChSKSA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuLy8gRkY0NC0gUmVnRXhwI3RvU3RyaW5nIGhhcyBhIHdyb25nIG5hbWVcbn0gZWxzZSBpZiAoJHRvU3RyaW5nLm5hbWUgIT0gVE9fU1RSSU5HKSB7XG4gIGRlZmluZShmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJHRvU3RyaW5nLmNhbGwodGhpcyk7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///229\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar anObject = __webpack_require__(4);\nvar toLength = __webpack_require__(7);\nvar advanceStringIndex = __webpack_require__(83);\nvar regExpExec = __webpack_require__(54);\n\n// @@match logic\n__webpack_require__(55)('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative($match, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n if (!rx.global) return regExpExec(rx, S);\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoLmpzPzQ5MTciXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFkdmFuY2VTdHJpbmdJbmRleCA9IHJlcXVpcmUoJy4vX2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjLWFic3RyYWN0Jyk7XG5cbi8vIEBAbWF0Y2ggbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnbWF0Y2gnLCAxLCBmdW5jdGlvbiAoZGVmaW5lZCwgTUFUQ0gsICRtYXRjaCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHJldHVybiBbXG4gICAgLy8gYFN0cmluZy5wcm90b3R5cGUubWF0Y2hgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUubWF0Y2hcbiAgICBmdW5jdGlvbiBtYXRjaChyZWdleHApIHtcbiAgICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICAgIHZhciBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbTUFUQ0hdO1xuICAgICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWQgPyBmbi5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbTUFUQ0hdKFN0cmluZyhPKSk7XG4gICAgfSxcbiAgICAvLyBgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQG1hdGNoXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZSgkbWF0Y2gsIHJlZ2V4cCwgdGhpcyk7XG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgICBpZiAoIXJ4Lmdsb2JhbCkgcmV0dXJuIHJlZ0V4cEV4ZWMocngsIFMpO1xuICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgdmFyIG4gPSAwO1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHdoaWxlICgocmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUykpICE9PSBudWxsKSB7XG4gICAgICAgIHZhciBtYXRjaFN0ciA9IFN0cmluZyhyZXN1bHRbMF0pO1xuICAgICAgICBBW25dID0gbWF0Y2hTdHI7XG4gICAgICAgIGlmIChtYXRjaFN0ciA9PT0gJycpIHJ4Lmxhc3RJbmRleCA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCB0b0xlbmd0aChyeC5sYXN0SW5kZXgpLCBmdWxsVW5pY29kZSk7XG4gICAgICAgIG4rKztcbiAgICAgIH1cbiAgICAgIHJldHVybiBuID09PSAwID8gbnVsbCA6IEE7XG4gICAgfVxuICBdO1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///230\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar anObject = __webpack_require__(4);\nvar toObject = __webpack_require__(12);\nvar toLength = __webpack_require__(7);\nvar toInteger = __webpack_require__(18);\nvar advanceStringIndex = __webpack_require__(83);\nvar regExpExec = __webpack_require__(54);\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\n__webpack_require__(55)('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnJlcGxhY2UuanM/YTQ4MSJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFMgPSAvXFwkKFskJmAnXXxcXGRcXGQ/fDxbXj5dKj4pL2c7XG52YXIgU1VCU1RJVFVUSU9OX1NZTUJPTFNfTk9fTkFNRUQgPSAvXFwkKFskJmAnXXxcXGRcXGQ/KS9nO1xuXG52YXIgbWF5YmVUb1N0cmluZyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/IGl0IDogU3RyaW5nKGl0KTtcbn07XG5cbi8vIEBAcmVwbGFjZSBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdyZXBsYWNlJywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFJFUExBQ0UsICRyZXBsYWNlLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnJlcGxhY2VcbiAgICBmdW5jdGlvbiByZXBsYWNlKHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICAgIHZhciBmbiA9IHNlYXJjaFZhbHVlID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlYXJjaFZhbHVlW1JFUExBQ0VdO1xuICAgICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBmbi5jYWxsKHNlYXJjaFZhbHVlLCBPLCByZXBsYWNlVmFsdWUpXG4gICAgICAgIDogJHJlcGxhY2UuY2FsbChTdHJpbmcoTyksIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHJlcGxhY2VcbiAgICBmdW5jdGlvbiAocmVnZXhwLCByZXBsYWNlVmFsdWUpIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoJHJlcGxhY2UsIHJlZ2V4cCwgdGhpcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIGZ1bmN0aW9uYWxSZXBsYWNlID0gdHlwZW9mIHJlcGxhY2VWYWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIGlmICghZnVuY3Rpb25hbFJlcGxhY2UpIHJlcGxhY2VWYWx1ZSA9IFN0cmluZyhyZXBsYWNlVmFsdWUpO1xuICAgICAgdmFyIGdsb2JhbCA9IHJ4Lmdsb2JhbDtcbiAgICAgIGlmIChnbG9iYWwpIHtcbiAgICAgICAgdmFyIGZ1bGxVbmljb2RlID0gcngudW5pY29kZTtcbiAgICAgICAgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIHZhciByZXN1bHRzID0gW107XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVnRXhwRXhlYyhyeCwgUyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIGJyZWFrO1xuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgaWYgKCFnbG9iYWwpIGJyZWFrO1xuICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgaWYgKG1hdGNoU3RyID09PSAnJykgcngubGFzdEluZGV4ID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHRvTGVuZ3RoKHJ4Lmxhc3RJbmRleCksIGZ1bGxVbmljb2RlKTtcbiAgICAgIH1cbiAgICAgIHZhciBhY2N1bXVsYXRlZFJlc3VsdCA9ICcnO1xuICAgICAgdmFyIG5leHRTb3VyY2VQb3NpdGlvbiA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0c1tpXTtcbiAgICAgICAgdmFyIG1hdGNoZWQgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gbWF4KG1pbih0b0ludGVnZXIocmVzdWx0LmluZGV4KSwgUy5sZW5ndGgpLCAwKTtcbiAgICAgICAgdmFyIGNhcHR1cmVzID0gW107XG4gICAgICAgIC8vIE5PVEU6IFRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICAgICAgICAvLyAgIGNhcHR1cmVzID0gcmVzdWx0LnNsaWNlKDEpLm1hcChtYXliZVRvU3RyaW5nKVxuICAgICAgICAvLyBidXQgZm9yIHNvbWUgcmVhc29uIGBuYXRpdmVTbGljZS5jYWxsKHJlc3VsdCwgMSwgcmVzdWx0Lmxlbmd0aClgIChjYWxsZWQgaW5cbiAgICAgICAgLy8gdGhlIHNsaWNlIHBvbHlmaWxsIHdoZW4gc2xpY2luZyBuYXRpdmUgYXJyYXlzKSBcImRvZXNuJ3Qgd29ya1wiIGluIHNhZmFyaSA5IGFuZFxuICAgICAgICAvLyBjYXVzZXMgYSBjcmFzaCAoaHR0cHM6Ly9wYXN0ZWJpbi5jb20vTjIxUXplUUEpIHdoZW4gdHJ5aW5nIHRvIGRlYnVnIGl0LlxuICAgICAgICBmb3IgKHZhciBqID0gMTsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgY2FwdHVyZXMucHVzaChtYXliZVRvU3RyaW5nKHJlc3VsdFtqXSkpO1xuICAgICAgICB2YXIgbmFtZWRDYXB0dXJlcyA9IHJlc3VsdC5ncm91cHM7XG4gICAgICAgIGlmIChmdW5jdGlvbmFsUmVwbGFjZSkge1xuICAgICAgICAgIHZhciByZXBsYWNlckFyZ3MgPSBbbWF0Y2hlZF0uY29uY2F0KGNhcHR1cmVzLCBwb3NpdGlvbiwgUyk7XG4gICAgICAgICAgaWYgKG5hbWVkQ2FwdHVyZXMgIT09IHVuZGVmaW5lZCkgcmVwbGFjZXJBcmdzLnB1c2gobmFtZWRDYXB0dXJlcyk7XG4gICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gU3RyaW5nKHJlcGxhY2VWYWx1ZS5hcHBseSh1bmRlZmluZWQsIHJlcGxhY2VyQXJncykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcGxhY2VtZW50ID0gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIFMsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZVZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zaXRpb24gPj0gbmV4dFNvdXJjZVBvc2l0aW9uKSB7XG4gICAgICAgICAgYWNjdW11bGF0ZWRSZXN1bHQgKz0gUy5zbGljZShuZXh0U291cmNlUG9zaXRpb24sIHBvc2l0aW9uKSArIHJlcGxhY2VtZW50O1xuICAgICAgICAgIG5leHRTb3VyY2VQb3NpdGlvbiA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bXVsYXRlZFJlc3VsdCArIFMuc2xpY2UobmV4dFNvdXJjZVBvc2l0aW9uKTtcbiAgICB9XG4gIF07XG5cbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRzdWJzdGl0dXRpb25cbiAgZnVuY3Rpb24gZ2V0U3Vic3RpdHV0aW9uKG1hdGNoZWQsIHN0ciwgcG9zaXRpb24sIGNhcHR1cmVzLCBuYW1lZENhcHR1cmVzLCByZXBsYWNlbWVudCkge1xuICAgIHZhciB0YWlsUG9zID0gcG9zaXRpb24gKyBtYXRjaGVkLmxlbmd0aDtcbiAgICB2YXIgbSA9IGNhcHR1cmVzLmxlbmd0aDtcbiAgICB2YXIgc3ltYm9scyA9IFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEO1xuICAgIGlmIChuYW1lZENhcHR1cmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5hbWVkQ2FwdHVyZXMgPSB0b09iamVjdChuYW1lZENhcHR1cmVzKTtcbiAgICAgIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MUztcbiAgICB9XG4gICAgcmV0dXJuICRyZXBsYWNlLmNhbGwocmVwbGFjZW1lbnQsIHN5bWJvbHMsIGZ1bmN0aW9uIChtYXRjaCwgY2gpIHtcbiAgICAgIHZhciBjYXB0dXJlO1xuICAgICAgc3dpdGNoIChjaC5jaGFyQXQoMCkpIHtcbiAgICAgICAgY2FzZSAnJCc6IHJldHVybiAnJCc7XG4gICAgICAgIGNhc2UgJyYnOiByZXR1cm4gbWF0Y2hlZDtcbiAgICAgICAgY2FzZSAnYCc6IHJldHVybiBzdHIuc2xpY2UoMCwgcG9zaXRpb24pO1xuICAgICAgICBjYXNlIFwiJ1wiOiByZXR1cm4gc3RyLnNsaWNlKHRhaWxQb3MpO1xuICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICBjYXB0dXJlID0gbmFtZWRDYXB0dXJlc1tjaC5zbGljZSgxLCAtMSldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBcXGRcXGQ/XG4gICAgICAgICAgdmFyIG4gPSArY2g7XG4gICAgICAgICAgaWYgKG4gPT09IDApIHJldHVybiBtYXRjaDtcbiAgICAgICAgICBpZiAobiA+IG0pIHtcbiAgICAgICAgICAgIHZhciBmID0gZmxvb3IobiAvIDEwKTtcbiAgICAgICAgICAgIGlmIChmID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgICBpZiAoZiA8PSBtKSByZXR1cm4gY2FwdHVyZXNbZiAtIDFdID09PSB1bmRlZmluZWQgPyBjaC5jaGFyQXQoMSkgOiBjYXB0dXJlc1tmIC0gMV0gKyBjaC5jaGFyQXQoMSk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhcHR1cmUgPSBjYXB0dXJlc1tuIC0gMV07XG4gICAgICB9XG4gICAgICByZXR1cm4gY2FwdHVyZSA9PT0gdW5kZWZpbmVkID8gJycgOiBjYXB0dXJlO1xuICAgIH0pO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///231\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar anObject = __webpack_require__(4);\nvar sameValue = __webpack_require__(94);\nvar regExpExec = __webpack_require__(54);\n\n// @@search logic\n__webpack_require__(55)('search', 1, function (defined, SEARCH, $search, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative($search, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNlYXJjaC5qcz8zODZkIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgc2FtZVZhbHVlID0gcmVxdWlyZSgnLi9fc2FtZS12YWx1ZScpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xuXG4vLyBAQHNlYXJjaCBsb2dpY1xucmVxdWlyZSgnLi9fZml4LXJlLXdrcycpKCdzZWFyY2gnLCAxLCBmdW5jdGlvbiAoZGVmaW5lZCwgU0VBUkNILCAkc2VhcmNoLCBtYXliZUNhbGxOYXRpdmUpIHtcbiAgcmV0dXJuIFtcbiAgICAvLyBgU3RyaW5nLnByb3RvdHlwZS5zZWFyY2hgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc2VhcmNoXG4gICAgZnVuY3Rpb24gc2VhcmNoKHJlZ2V4cCkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIGZuID0gcmVnZXhwID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHJlZ2V4cFtTRUFSQ0hdO1xuICAgICAgcmV0dXJuIGZuICE9PSB1bmRlZmluZWQgPyBmbi5jYWxsKHJlZ2V4cCwgTykgOiBuZXcgUmVnRXhwKHJlZ2V4cClbU0VBUkNIXShTdHJpbmcoTykpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEBzZWFyY2hdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAc2VhcmNoXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZSgkc2VhcmNoLCByZWdleHAsIHRoaXMpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIHByZXZpb3VzTGFzdEluZGV4ID0gcngubGFzdEluZGV4O1xuICAgICAgaWYgKCFzYW1lVmFsdWUocHJldmlvdXNMYXN0SW5kZXgsIDApKSByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpO1xuICAgICAgaWYgKCFzYW1lVmFsdWUocngubGFzdEluZGV4LCBwcmV2aW91c0xhc3RJbmRleCkpIHJ4Lmxhc3RJbmRleCA9IHByZXZpb3VzTGFzdEluZGV4O1xuICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gbnVsbCA/IC0xIDogcmVzdWx0LmluZGV4O1xuICAgIH1cbiAgXTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///232\n")},function(module,exports,__webpack_require__){"use strict";eval("\n\nvar isRegExp = __webpack_require__(75);\nvar anObject = __webpack_require__(4);\nvar speciesConstructor = __webpack_require__(47);\nvar advanceStringIndex = __webpack_require__(83);\nvar toLength = __webpack_require__(7);\nvar callRegExpExec = __webpack_require__(54);\nvar regexpExec = __webpack_require__(82);\nvar fails = __webpack_require__(3);\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\n__webpack_require__(55)('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n } else {\n internalSplit = $split;\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0LmpzPzI4YTUiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNSZWdFeHAgPSByZXF1aXJlKCcuL19pcy1yZWdleHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuL19hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY2FsbFJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xudmFyIHJlZ2V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciAkbWluID0gTWF0aC5taW47XG52YXIgJHB1c2ggPSBbXS5wdXNoO1xudmFyICRTUExJVCA9ICdzcGxpdCc7XG52YXIgTEVOR1RIID0gJ2xlbmd0aCc7XG52YXIgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xudmFyIE1BWF9VSU5UMzIgPSAweGZmZmZmZmZmO1xuXG4vLyBiYWJlbC1taW5pZnkgdHJhbnNwaWxlcyBSZWdFeHAoJ3gnLCAneScpIC0+IC94L3kgYW5kIGl0IGNhdXNlcyBTeW50YXhFcnJvclxudmFyIFNVUFBPUlRTX1kgPSAhZmFpbHMoZnVuY3Rpb24gKCkgeyBSZWdFeHAoTUFYX1VJTlQzMiwgJ3knKTsgfSk7XG5cbi8vIEBAc3BsaXQgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc3BsaXQnLCAyLCBmdW5jdGlvbiAoZGVmaW5lZCwgU1BMSVQsICRzcGxpdCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHZhciBpbnRlcm5hbFNwbGl0O1xuICBpZiAoXG4gICAgJ2FiYmMnWyRTUExJVF0oLyhiKSovKVsxXSA9PSAnYycgfHxcbiAgICAndGVzdCdbJFNQTElUXSgvKD86KS8sIC0xKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnYWInWyRTUExJVF0oLyg/OmFiKSovKVtMRU5HVEhdICE9IDIgfHxcbiAgICAnLidbJFNQTElUXSgvKC4/KSguPykvKVtMRU5HVEhdICE9IDQgfHxcbiAgICAnLidbJFNQTElUXSgvKCkoKS8pW0xFTkdUSF0gPiAxIHx8XG4gICAgJydbJFNQTElUXSgvLj8vKVtMRU5HVEhdXG4gICkge1xuICAgIC8vIGJhc2VkIG9uIGVzNS1zaGltIGltcGxlbWVudGF0aW9uLCBuZWVkIHRvIHJld29yayBpdFxuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCAmJiBsaW1pdCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgLy8gSWYgYHNlcGFyYXRvcmAgaXMgbm90IGEgcmVnZXgsIHVzZSBuYXRpdmUgc3BsaXRcbiAgICAgIGlmICghaXNSZWdFeHAoc2VwYXJhdG9yKSkgcmV0dXJuICRzcGxpdC5jYWxsKHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCk7XG4gICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci5tdWx0aWxpbmUgPyAnbScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHNlcGFyYXRvci51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3Iuc3RpY2t5ID8gJ3knIDogJycpO1xuICAgICAgdmFyIGxhc3RMYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIHNwbGl0TGltaXQgPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgLy8gTWFrZSBgZ2xvYmFsYCBhbmQgYXZvaWQgYGxhc3RJbmRleGAgaXNzdWVzIGJ5IHdvcmtpbmcgd2l0aCBhIGNvcHlcbiAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICB2YXIgbWF0Y2gsIGxhc3RJbmRleCwgbGFzdExlbmd0aDtcbiAgICAgIHdoaWxlIChtYXRjaCA9IHJlZ2V4cEV4ZWMuY2FsbChzZXBhcmF0b3JDb3B5LCBzdHJpbmcpKSB7XG4gICAgICAgIGxhc3RJbmRleCA9IHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF07XG4gICAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgICAgb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgsIG1hdGNoLmluZGV4KSk7XG4gICAgICAgICAgaWYgKG1hdGNoW0xFTkdUSF0gPiAxICYmIG1hdGNoLmluZGV4IDwgc3RyaW5nW0xFTkdUSF0pICRwdXNoLmFwcGx5KG91dHB1dCwgbWF0Y2guc2xpY2UoMSkpO1xuICAgICAgICAgIGxhc3RMZW5ndGggPSBtYXRjaFswXVtMRU5HVEhdO1xuICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgaWYgKG91dHB1dFtMRU5HVEhdID49IHNwbGl0TGltaXQpIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdID09PSBtYXRjaC5pbmRleCkgc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSsrOyAvLyBBdm9pZCBhbiBpbmZpbml0ZSBsb29wXG4gICAgICB9XG4gICAgICBpZiAobGFzdExhc3RJbmRleCA9PT0gc3RyaW5nW0xFTkdUSF0pIHtcbiAgICAgICAgaWYgKGxhc3RMZW5ndGggfHwgIXNlcGFyYXRvckNvcHkudGVzdCgnJykpIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgIH0gZWxzZSBvdXRwdXQucHVzaChzdHJpbmcuc2xpY2UobGFzdExhc3RJbmRleCkpO1xuICAgICAgcmV0dXJuIG91dHB1dFtMRU5HVEhdID4gc3BsaXRMaW1pdCA/IG91dHB1dC5zbGljZSgwLCBzcGxpdExpbWl0KSA6IG91dHB1dDtcbiAgICB9O1xuICAvLyBDaGFrcmEsIFY4XG4gIH0gZWxzZSBpZiAoJzAnWyRTUExJVF0odW5kZWZpbmVkLCAwKVtMRU5HVEhdKSB7XG4gICAgaW50ZXJuYWxTcGxpdCA9IGZ1bmN0aW9uIChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICByZXR1cm4gc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDAgPyBbXSA6ICRzcGxpdC5jYWxsKHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgaW50ZXJuYWxTcGxpdCA9ICRzcGxpdDtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgLy8gYFN0cmluZy5wcm90b3R5cGUuc3BsaXRgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuc3BsaXRcbiAgICBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgICB2YXIgc3BsaXR0ZXIgPSBzZXBhcmF0b3IgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc2VwYXJhdG9yW1NQTElUXTtcbiAgICAgIHJldHVybiBzcGxpdHRlciAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gc3BsaXR0ZXIuY2FsbChzZXBhcmF0b3IsIE8sIGxpbWl0KVxuICAgICAgICA6IGludGVybmFsU3BsaXQuY2FsbChTdHJpbmcoTyksIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEBzcGxpdF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBzcGxpdFxuICAgIC8vXG4gICAgLy8gTk9URTogVGhpcyBjYW5ub3QgYmUgcHJvcGVybHkgcG9seWZpbGxlZCBpbiBlbmdpbmVzIHRoYXQgZG9uJ3Qgc3VwcG9ydFxuICAgIC8vIHRoZSAneScgZmxhZy5cbiAgICBmdW5jdGlvbiAocmVnZXhwLCBsaW1pdCkge1xuICAgICAgdmFyIHJlcyA9IG1heWJlQ2FsbE5hdGl2ZShpbnRlcm5hbFNwbGl0LCByZWdleHAsIHRoaXMsIGxpbWl0LCBpbnRlcm5hbFNwbGl0ICE9PSAkc3BsaXQpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuXG4gICAgICB2YXIgcnggPSBhbk9iamVjdChyZWdleHApO1xuICAgICAgdmFyIFMgPSBTdHJpbmcodGhpcyk7XG4gICAgICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3RvcihyeCwgUmVnRXhwKTtcblxuICAgICAgdmFyIHVuaWNvZGVNYXRjaGluZyA9IHJ4LnVuaWNvZGU7XG4gICAgICB2YXIgZmxhZ3MgPSAocnguaWdub3JlQ2FzZSA/ICdpJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocngubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyeC51bmljb2RlID8gJ3UnIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChTVVBQT1JUU19ZID8gJ3knIDogJ2cnKTtcblxuICAgICAgLy8gXig/ICsgcnggKyApIGlzIG5lZWRlZCwgaW4gY29tYmluYXRpb24gd2l0aCBzb21lIFMgc2xpY2luZywgdG9cbiAgICAgIC8vIHNpbXVsYXRlIHRoZSAneScgZmxhZy5cbiAgICAgIHZhciBzcGxpdHRlciA9IG5ldyBDKFNVUFBPUlRTX1kgPyByeCA6ICdeKD86JyArIHJ4LnNvdXJjZSArICcpJywgZmxhZ3MpO1xuICAgICAgdmFyIGxpbSA9IGxpbWl0ID09PSB1bmRlZmluZWQgPyBNQVhfVUlOVDMyIDogbGltaXQgPj4+IDA7XG4gICAgICBpZiAobGltID09PSAwKSByZXR1cm4gW107XG4gICAgICBpZiAoUy5sZW5ndGggPT09IDApIHJldHVybiBjYWxsUmVnRXhwRXhlYyhzcGxpdHRlciwgUykgPT09IG51bGwgPyBbU10gOiBbXTtcbiAgICAgIHZhciBwID0gMDtcbiAgICAgIHZhciBxID0gMDtcbiAgICAgIHZhciBBID0gW107XG4gICAgICB3aGlsZSAocSA8IFMubGVuZ3RoKSB7XG4gICAgICAgIHNwbGl0dGVyLmxhc3RJbmRleCA9IFNVUFBPUlRTX1kgPyBxIDogMDtcbiAgICAgICAgdmFyIHogPSBjYWxsUmVnRXhwRXhlYyhzcGxpdHRlciwgU1VQUE9SVFNfWSA/IFMgOiBTLnNsaWNlKHEpKTtcbiAgICAgICAgdmFyIGU7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB6ID09PSBudWxsIHx8XG4gICAgICAgICAgKGUgPSAkbWluKHRvTGVuZ3RoKHNwbGl0dGVyLmxhc3RJbmRleCArIChTVVBQT1JUU19ZID8gMCA6IHEpKSwgUy5sZW5ndGgpKSA9PT0gcFxuICAgICAgICApIHtcbiAgICAgICAgICBxID0gYWR2YW5jZVN0cmluZ0luZGV4KFMsIHEsIHVuaWNvZGVNYXRjaGluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgQS5wdXNoKFMuc2xpY2UocCwgcSkpO1xuICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8PSB6Lmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgQS5wdXNoKHpbaV0pO1xuICAgICAgICAgICAgaWYgKEEubGVuZ3RoID09PSBsaW0pIHJldHVybiBBO1xuICAgICAgICAgIH1cbiAgICAgICAgICBxID0gcCA9IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIEEucHVzaChTLnNsaWNlKHApKTtcbiAgICAgIHJldHVybiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///233\n")},function(module,exports,__webpack_require__){eval("var global = __webpack_require__(2);\nvar macrotask = __webpack_require__(84).set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(24)(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzPzgwNzkiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChpc05vZGUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgU2FmYXJpIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE9ic2VydmVyICYmICEoZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpKSB7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZiAoIWhlYWQpIHtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///234\n")},function(module,exports){eval("module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcz85YzgwIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///235\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar strong = __webpack_require__(112);\nvar validate = __webpack_require__(37);\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = __webpack_require__(58)(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWFwLmpzP2Y0MDAiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTUFQID0gJ01hcCc7XG5cbi8vIDIzLjEgTWFwIE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKE1BUCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBzdHJvbmcuZ2V0RW50cnkodmFsaWRhdGUodGhpcywgTUFQKSwga2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkudjtcbiAgfSxcbiAgLy8gMjMuMS4zLjkgTWFwLnByb3RvdHlwZS5zZXQoa2V5LCB2YWx1ZSlcbiAgc2V0OiBmdW5jdGlvbiBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiBzdHJvbmcuZGVmKHZhbGlkYXRlKHRoaXMsIE1BUCksIGtleSA9PT0gMCA/IDAgOiBrZXksIHZhbHVlKTtcbiAgfVxufSwgc3Ryb25nLCB0cnVlKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///236\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar strong = __webpack_require__(112);\nvar validate = __webpack_require__(37);\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = __webpack_require__(58)(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc2V0LmpzPzRmN2YiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgU0VUID0gJ1NldCc7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFNFVCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodmFsaWRhdGUodGhpcywgU0VUKSwgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///237\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar global = __webpack_require__(2);\nvar each = __webpack_require__(21)(0);\nvar redefine = __webpack_require__(11);\nvar meta = __webpack_require__(28);\nvar assign = __webpack_require__(93);\nvar weak = __webpack_require__(113);\nvar isObject = __webpack_require__(5);\nvar validate = __webpack_require__(37);\nvar NATIVE_WEAK_MAP = __webpack_require__(37);\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = __webpack_require__(58)(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1tYXAuanM/MTBhZCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgZWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJyk7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIElTX0lFMTEgPSAhZ2xvYmFsLkFjdGl2ZVhPYmplY3QgJiYgJ0FjdGl2ZVhPYmplY3QnIGluIGdsb2JhbDtcbnZhciBXRUFLX01BUCA9ICdXZWFrTWFwJztcbnZhciBnZXRXZWFrID0gbWV0YS5nZXRXZWFrO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IHdlYWsudWZzdG9yZTtcbnZhciBJbnRlcm5hbE1hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICB9O1xufTtcblxudmFyIG1ldGhvZHMgPSB7XG4gIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBXRUFLX01BUCkpLmdldChrZXkpO1xuICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhW3RoaXMuX2ldIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSxcbiAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd2Vhay5kZWYodmFsaWRhdGUodGhpcywgV0VBS19NQVApLCBrZXksIHZhbHVlKTtcbiAgfVxufTtcblxuLy8gMjMuMyBXZWFrTWFwIE9iamVjdHNcbnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfTUFQLCB3cmFwcGVyLCBtZXRob2RzLCB3ZWFrLCB0cnVlLCB0cnVlKTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuaWYgKE5BVElWRV9XRUFLX01BUCAmJiBJU19JRTExKSB7XG4gIEludGVybmFsTWFwID0gd2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBXRUFLX01BUCk7XG4gIGFzc2lnbihJbnRlcm5hbE1hcC5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICBtZXRhLk5FRUQgPSB0cnVlO1xuICBlYWNoKFsnZGVsZXRlJywgJ2hhcycsICdnZXQnLCAnc2V0J10sIGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcHJvdG8gPSAkV2Vha01hcC5wcm90b3R5cGU7XG4gICAgdmFyIG1ldGhvZCA9IHByb3RvW2tleV07XG4gICAgcmVkZWZpbmUocHJvdG8sIGtleSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIC8vIHN0b3JlIGZyb3plbiBvYmplY3RzIG9uIGludGVybmFsIHdlYWttYXAgc2hpbVxuICAgICAgaWYgKGlzT2JqZWN0KGEpICYmICFpc0V4dGVuc2libGUoYSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mKSB0aGlzLl9mID0gbmV3IEludGVybmFsTWFwKCk7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9mW2tleV0oYSwgYik7XG4gICAgICAgIHJldHVybiBrZXkgPT0gJ3NldCcgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgLy8gc3RvcmUgYWxsIHRoZSByZXN0IG9uIG5hdGl2ZSB3ZWFrbWFwXG4gICAgICB9IHJldHVybiBtZXRob2QuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///238\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar weak = __webpack_require__(113);\nvar validate = __webpack_require__(37);\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\n__webpack_require__(58)(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjM5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYud2Vhay1zZXQuanM/YzAyYiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFdFQUtfU0VUID0gJ1dlYWtTZXQnO1xuXG4vLyAyMy40IFdlYWtTZXQgT2JqZWN0c1xucmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfU0VULCBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuNC4zLjEgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiB3ZWFrLmRlZih2YWxpZGF0ZSh0aGlzLCBXRUFLX1NFVCksIHZhbHVlLCB0cnVlKTtcbiAgfVxufSwgd2VhaywgZmFsc2UsIHRydWUpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///239\n")},function(module,exports,__webpack_require__){"use strict";eval("\nvar $export = __webpack_require__(1);\nvar $typed = __webpack_require__(59);\nvar buffer = __webpack_require__(85);\nvar anObject = __webpack_require__(4);\nvar toAbsoluteIndex = __webpack_require__(33);\nvar toLength = __webpack_require__(7);\nvar isObject = __webpack_require__(5);\nvar ArrayBuffer = __webpack_require__(2).ArrayBuffer;\nvar speciesConstructor = __webpack_require__(47);\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * __webpack_require__(3)(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var fin = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < fin) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\n__webpack_require__(41)(ARRAY_BUFFER);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuYXJyYXktYnVmZmVyLmpzP2M2NmYiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5BcnJheUJ1ZmZlcjtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgJEFycmF5QnVmZmVyID0gYnVmZmVyLkFycmF5QnVmZmVyO1xudmFyICREYXRhVmlldyA9IGJ1ZmZlci5EYXRhVmlldztcbnZhciAkaXNWaWV3ID0gJHR5cGVkLkFCViAmJiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG52YXIgJHNsaWNlID0gJEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZTtcbnZhciBWSUVXID0gJHR5cGVkLlZJRVc7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoQXJyYXlCdWZmZXIgIT09ICRBcnJheUJ1ZmZlciksIHsgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlciB9KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhJHR5cGVkLkNPTlNUUiwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuMy4xIEFycmF5QnVmZmVyLmlzVmlldyhhcmcpXG4gIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gICAgcmV0dXJuICRpc1ZpZXcgJiYgJGlzVmlldyhpdCkgfHwgaXNPYmplY3QoaXQpICYmIFZJRVcgaW4gaXQ7XG4gIH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuVSArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIW5ldyAkQXJyYXlCdWZmZXIoMikuc2xpY2UoMSwgdW5kZWZpbmVkKS5ieXRlTGVuZ3RoO1xufSksIEFSUkFZX0JVRkZFUiwge1xuICAvLyAyNC4xLjQuMyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2Uoc3RhcnQsIGVuZClcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoJHNsaWNlICE9PSB1bmRlZmluZWQgJiYgZW5kID09PSB1bmRlZmluZWQpIHJldHVybiAkc2xpY2UuY2FsbChhbk9iamVjdCh0aGlzKSwgc3RhcnQpOyAvLyBGRiBmaXhcbiAgICB2YXIgbGVuID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IGVuZCwgbGVuKTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJEFycmF5QnVmZmVyKSkodG9MZW5ndGgoZmluIC0gZmlyc3QpKTtcbiAgICB2YXIgdmlld1MgPSBuZXcgJERhdGFWaWV3KHRoaXMpO1xuICAgIHZhciB2aWV3VCA9IG5ldyAkRGF0YVZpZXcocmVzdWx0KTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChmaXJzdCA8IGZpbikge1xuICAgICAgdmlld1Quc2V0VWludDgoaW5kZXgrKywgdmlld1MuZ2V0VWludDgoZmlyc3QrKykpO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoQVJSQVlfQlVGRkVSKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///240\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\n$export($export.G + $export.W + $export.F * !__webpack_require__(59).ABV, {\n DataView: __webpack_require__(85).DataView\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZGF0YS12aWV3LmpzPzI2MmYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3R5cGVkJykuQUJWLCB7XG4gIERhdGFWaWV3OiByZXF1aXJlKCcuL190eXBlZC1idWZmZXInKS5EYXRhVmlld1xufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///241\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50OC1hcnJheS5qcz9iMDVjIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///242\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDgtYXJyYXkuanM/MzRlZiJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///243\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDgtY2xhbXBlZC1hcnJheS5qcz82YWEyIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQ4JywgMSwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59LCB0cnVlKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///244\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXkuanM/MTVhYyJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQxNicsIDIsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///245\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5LmpzP2FmNTYiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDE2JywgMiwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQxNkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///246\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuaW50MzItYXJyYXkuanM/YjZlNCJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///247\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDMyLWFycmF5LmpzPzljMjkiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDMyJywgNCwgZnVuY3Rpb24gKGluaXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIFVpbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///248\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQzMi1hcnJheS5qcz82M2Q5Il0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0Zsb2F0MzInLCA0LCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gRmxvYXQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///249\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(26)('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQ2NC1hcnJheS5qcz80ZGRhIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0Zsb2F0NjQnLCA4LCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gRmxvYXQ2NEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///250\n")},function(module,exports,__webpack_require__){eval("// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = __webpack_require__(1);\nvar aFunction = __webpack_require__(23);\nvar anObject = __webpack_require__(4);\nvar rApply = (__webpack_require__(2).Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !__webpack_require__(3)(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseS5qcz9kZjFiIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIDI2LjEuMSBSZWZsZWN0LmFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciByQXBwbHkgPSAocmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdCB8fCB7fSkuYXBwbHk7XG52YXIgZkFwcGx5ID0gRnVuY3Rpb24uYXBwbHk7XG4vLyBNUyBFZGdlIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByQXBwbHkoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgYXBwbHk6IGZ1bmN0aW9uIGFwcGx5KHRhcmdldCwgdGhpc0FyZ3VtZW50LCBhcmd1bWVudHNMaXN0KSB7XG4gICAgdmFyIFQgPSBhRnVuY3Rpb24odGFyZ2V0KTtcbiAgICB2YXIgTCA9IGFuT2JqZWN0KGFyZ3VtZW50c0xpc3QpO1xuICAgIHJldHVybiByQXBwbHkgPyByQXBwbHkoVCwgdGhpc0FyZ3VtZW50LCBMKSA6IGZBcHBseS5jYWxsKFQsIHRoaXNBcmd1bWVudCwgTCk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///251\n")},function(module,exports,__webpack_require__){eval("// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = __webpack_require__(1);\nvar create = __webpack_require__(34);\nvar aFunction = __webpack_require__(23);\nvar anObject = __webpack_require__(4);\nvar isObject = __webpack_require__(5);\nvar fails = __webpack_require__(3);\nvar bind = __webpack_require__(95);\nvar rConstruct = (__webpack_require__(2).Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5jb25zdHJ1Y3QuanM/MjM5NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjIgUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmd1bWVudHNMaXN0IFssIG5ld1RhcmdldF0pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi9fYmluZCcpO1xudmFyIHJDb25zdHJ1Y3QgPSAocmVxdWlyZSgnLi9fZ2xvYmFsJykuUmVmbGVjdCB8fCB7fSkuY29uc3RydWN0O1xuXG4vLyBNUyBFZGdlIHN1cHBvcnRzIG9ubHkgMiBhcmd1bWVudHMgYW5kIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbi8vIEZGIE5pZ2h0bHkgc2V0cyB0aGlyZCBhcmd1bWVudCBhcyBgbmV3LnRhcmdldGAsIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYHRoaXNgIGZyb20gaXRcbnZhciBORVdfVEFSR0VUX0JVRyA9IGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gIShyQ29uc3RydWN0KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSwgW10sIEYpIGluc3RhbmNlb2YgRik7XG59KTtcbnZhciBBUkdTX0JVRyA9ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9KTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChORVdfVEFSR0VUX0JVRyB8fCBBUkdTX0JVRyksICdSZWZsZWN0Jywge1xuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIGNvbnN0cnVjdChUYXJnZXQsIGFyZ3MgLyogLCBuZXdUYXJnZXQgKi8pIHtcbiAgICBhRnVuY3Rpb24oVGFyZ2V0KTtcbiAgICBhbk9iamVjdChhcmdzKTtcbiAgICB2YXIgbmV3VGFyZ2V0ID0gYXJndW1lbnRzLmxlbmd0aCA8IDMgPyBUYXJnZXQgOiBhRnVuY3Rpb24oYXJndW1lbnRzWzJdKTtcbiAgICBpZiAoQVJHU19CVUcgJiYgIU5FV19UQVJHRVRfQlVHKSByZXR1cm4gckNvbnN0cnVjdChUYXJnZXQsIGFyZ3MsIG5ld1RhcmdldCk7XG4gICAgaWYgKFRhcmdldCA9PSBuZXdUYXJnZXQpIHtcbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgb3B0aW1pemF0aW9uIGZvciAwLTQgYXJndW1lbnRzXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBUYXJnZXQoKTtcbiAgICAgICAgY2FzZSAxOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdKTtcbiAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgY2FzZSAzOiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgY2FzZSA0OiByZXR1cm4gbmV3IFRhcmdldChhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTtcbiAgICAgIH1cbiAgICAgIC8vIHcvbyBhbHRlcmVkIG5ld1RhcmdldCwgbG90IG9mIGFyZ3VtZW50cyBjYXNlXG4gICAgICB2YXIgJGFyZ3MgPSBbbnVsbF07XG4gICAgICAkYXJncy5wdXNoLmFwcGx5KCRhcmdzLCBhcmdzKTtcbiAgICAgIHJldHVybiBuZXcgKGJpbmQuYXBwbHkoVGFyZ2V0LCAkYXJncykpKCk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byA9IG5ld1RhcmdldC5wcm90b3R5cGU7XG4gICAgdmFyIGluc3RhbmNlID0gY3JlYXRlKGlzT2JqZWN0KHByb3RvKSA/IHByb3RvIDogT2JqZWN0LnByb3RvdHlwZSk7XG4gICAgdmFyIHJlc3VsdCA9IEZ1bmN0aW9uLmFwcGx5LmNhbGwoVGFyZ2V0LCBpbnN0YW5jZSwgYXJncyk7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTtcbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///252\n")},function(module,exports,__webpack_require__){eval("// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = __webpack_require__(8);\nvar $export = __webpack_require__(1);\nvar anObject = __webpack_require__(4);\nvar toPrimitive = __webpack_require__(27);\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * __webpack_require__(3)(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWZpbmUtcHJvcGVydHkuanM/ODhjYSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjMgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKVxudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcblxuLy8gTVMgRWRnZSBoYXMgYnJva2VuIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkgLSB0aHJvd2luZyBpbnN0ZWFkIG9mIHJldHVybmluZyBmYWxzZVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkoZFAuZih7fSwgMSwgeyB2YWx1ZTogMSB9KSwgMSwgeyB2YWx1ZTogMiB9KTtcbn0pLCAnUmVmbGVjdCcsIHtcbiAgZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpIHtcbiAgICBhbk9iamVjdCh0YXJnZXQpO1xuICAgIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUocHJvcGVydHlLZXksIHRydWUpO1xuICAgIGFuT2JqZWN0KGF0dHJpYnV0ZXMpO1xuICAgIHRyeSB7XG4gICAgICBkUC5mKHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///253\n")},function(module,exports,__webpack_require__){eval("// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = __webpack_require__(1);\nvar gOPD = __webpack_require__(19).f;\nvar anObject = __webpack_require__(4);\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5kZWxldGUtcHJvcGVydHkuanM/YmExNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjQgUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uIGRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpIHtcbiAgICB2YXIgZGVzYyA9IGdPUEQoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICAgIHJldHVybiBkZXNjICYmICFkZXNjLmNvbmZpZ3VyYWJsZSA/IGZhbHNlIDogZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///254\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// 26.1.5 Reflect.enumerate(target)\nvar $export = __webpack_require__(1);\nvar anObject = __webpack_require__(4);\nvar Enumerate = function (iterated) {\n this._t = anObject(iterated); // target\n this._i = 0; // next index\n var keys = this._k = []; // keys\n var key;\n for (key in iterated) keys.push(key);\n};\n__webpack_require__(102)(Enumerate, 'Object', function () {\n var that = this;\n var keys = that._k;\n var key;\n do {\n if (that._i >= keys.length) return { value: undefined, done: true };\n } while (!((key = keys[that._i++]) in that._t));\n return { value: key, done: false };\n});\n\n$export($export.S, 'Reflect', {\n enumerate: function enumerate(target) {\n return new Enumerate(target);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5lbnVtZXJhdGUuanM/N2ZmNiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyAyNi4xLjUgUmVmbGVjdC5lbnVtZXJhdGUodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIEVudW1lcmF0ZSA9IGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gYW5PYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB2YXIga2V5cyA9IHRoaXMuX2sgPSBbXTsgICAgICAvLyBrZXlzXG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIGl0ZXJhdGVkKSBrZXlzLnB1c2goa2V5KTtcbn07XG5yZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpKEVudW1lcmF0ZSwgJ09iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSB0aGlzO1xuICB2YXIga2V5cyA9IHRoYXQuX2s7XG4gIHZhciBrZXk7XG4gIGRvIHtcbiAgICBpZiAodGhhdC5faSA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9IHdoaWxlICghKChrZXkgPSBrZXlzW3RoYXQuX2krK10pIGluIHRoYXQuX3QpKTtcbiAgcmV0dXJuIHsgdmFsdWU6IGtleSwgZG9uZTogZmFsc2UgfTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGVudW1lcmF0ZTogZnVuY3Rpb24gZW51bWVyYXRlKHRhcmdldCkge1xuICAgIHJldHVybiBuZXcgRW51bWVyYXRlKHRhcmdldCk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///255\n")},function(module,exports,__webpack_require__){eval("// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = __webpack_require__(19);\nvar getPrototypeOf = __webpack_require__(36);\nvar has = __webpack_require__(14);\nvar $export = __webpack_require__(1);\nvar isObject = __webpack_require__(5);\nvar anObject = __webpack_require__(4);\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanM/ZDE4NSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjYgUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSBbLCByZWNlaXZlcl0pXG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTtcbiAgdmFyIGRlc2MsIHByb3RvO1xuICBpZiAoYW5PYmplY3QodGFyZ2V0KSA9PT0gcmVjZWl2ZXIpIHJldHVybiB0YXJnZXRbcHJvcGVydHlLZXldO1xuICBpZiAoZGVzYyA9IGdPUEQuZih0YXJnZXQsIHByb3BlcnR5S2V5KSkgcmV0dXJuIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgID8gZGVzYy52YWx1ZVxuICAgIDogZGVzYy5nZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChpc09iamVjdChwcm90byA9IGdldFByb3RvdHlwZU9mKHRhcmdldCkpKSByZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IGdldDogZ2V0IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///256\n")},function(module,exports,__webpack_require__){eval("// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = __webpack_require__(19);\nvar $export = __webpack_require__(1);\nvar anObject = __webpack_require__(4);\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanM/ZWJkZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjcgUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5S2V5KSB7XG4gICAgcmV0dXJuIGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///257\n")},function(module,exports,__webpack_require__){eval("// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = __webpack_require__(1);\nvar getProto = __webpack_require__(36);\nvar anObject = __webpack_require__(4);\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQtcHJvdG90eXBlLW9mLmpzPzJkMzQiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS44IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnZXRQcm90byA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGdldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZih0YXJnZXQpIHtcbiAgICByZXR1cm4gZ2V0UHJvdG8oYW5PYmplY3QodGFyZ2V0KSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///258\n")},function(module,exports,__webpack_require__){eval("// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjU5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5oYXMuanM/ZjZiMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjkgUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaGFzOiBmdW5jdGlvbiBoYXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgIHJldHVybiBwcm9wZXJ0eUtleSBpbiB0YXJnZXQ7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///259\n")},function(module,exports,__webpack_require__){eval("// 26.1.10 Reflect.isExtensible(target)\nvar $export = __webpack_require__(1);\nvar anObject = __webpack_require__(4);\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzPzIyNTEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS4xMCBSZWZsZWN0LmlzRXh0ZW5zaWJsZSh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaXNFeHRlbnNpYmxlOiBmdW5jdGlvbiBpc0V4dGVuc2libGUodGFyZ2V0KSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICByZXR1cm4gJGlzRXh0ZW5zaWJsZSA/ICRpc0V4dGVuc2libGUodGFyZ2V0KSA6IHRydWU7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///260\n")},function(module,exports,__webpack_require__){eval("// 26.1.11 Reflect.ownKeys(target)\nvar $export = __webpack_require__(1);\n\n$export($export.S, 'Reflect', { ownKeys: __webpack_require__(115) });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5vd24ta2V5cy5qcz9jNjk4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIDI2LjEuMTEgUmVmbGVjdC5vd25LZXlzKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHsgb3duS2V5czogcmVxdWlyZSgnLi9fb3duLWtleXMnKSB9KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///261\n")},function(module,exports,__webpack_require__){eval("// 26.1.12 Reflect.preventExtensions(target)\nvar $export = __webpack_require__(1);\nvar anObject = __webpack_require__(4);\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanM/YTE5ZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjEyIFJlZmxlY3QucHJldmVudEV4dGVuc2lvbnModGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyICRwcmV2ZW50RXh0ZW5zaW9ucyA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucztcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBwcmV2ZW50RXh0ZW5zaW9uczogZnVuY3Rpb24gcHJldmVudEV4dGVuc2lvbnModGFyZ2V0KSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICB0cnkge1xuICAgICAgaWYgKCRwcmV2ZW50RXh0ZW5zaW9ucykgJHByZXZlbnRFeHRlbnNpb25zKHRhcmdldCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///262\n")},function(module,exports,__webpack_require__){eval("// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = __webpack_require__(8);\nvar gOPD = __webpack_require__(19);\nvar getPrototypeOf = __webpack_require__(36);\nvar has = __webpack_require__(14);\nvar $export = __webpack_require__(1);\nvar createDesc = __webpack_require__(29);\nvar anObject = __webpack_require__(4);\nvar isObject = __webpack_require__(5);\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n if (existingDescriptor = gOPD.f(receiver, propertyKey)) {\n if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n } else dP.f(receiver, propertyKey, createDesc(0, V));\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQuanM/OTI1MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyAyNi4xLjEzIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcGVydHlLZXksIFYgWywgcmVjZWl2ZXJdKVxudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBzZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSwgViAvKiAsIHJlY2VpdmVyICovKSB7XG4gIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPCA0ID8gdGFyZ2V0IDogYXJndW1lbnRzWzNdO1xuICB2YXIgb3duRGVzYyA9IGdPUEQuZihhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gIHZhciBleGlzdGluZ0Rlc2NyaXB0b3IsIHByb3RvO1xuICBpZiAoIW93bkRlc2MpIHtcbiAgICBpZiAoaXNPYmplY3QocHJvdG8gPSBnZXRQcm90b3R5cGVPZih0YXJnZXQpKSkge1xuICAgICAgcmV0dXJuIHNldChwcm90bywgcHJvcGVydHlLZXksIFYsIHJlY2VpdmVyKTtcbiAgICB9XG4gICAgb3duRGVzYyA9IGNyZWF0ZURlc2MoMCk7XG4gIH1cbiAgaWYgKGhhcyhvd25EZXNjLCAndmFsdWUnKSkge1xuICAgIGlmIChvd25EZXNjLndyaXRhYmxlID09PSBmYWxzZSB8fCAhaXNPYmplY3QocmVjZWl2ZXIpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRvciA9IGdPUEQuZihyZWNlaXZlciwgcHJvcGVydHlLZXkpKSB7XG4gICAgICBpZiAoZXhpc3RpbmdEZXNjcmlwdG9yLmdldCB8fCBleGlzdGluZ0Rlc2NyaXB0b3Iuc2V0IHx8IGV4aXN0aW5nRGVzY3JpcHRvci53cml0YWJsZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGV4aXN0aW5nRGVzY3JpcHRvci52YWx1ZSA9IFY7XG4gICAgICBkUC5mKHJlY2VpdmVyLCBwcm9wZXJ0eUtleSwgZXhpc3RpbmdEZXNjcmlwdG9yKTtcbiAgICB9IGVsc2UgZFAuZihyZWNlaXZlciwgcHJvcGVydHlLZXksIGNyZWF0ZURlc2MoMCwgVikpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBvd25EZXNjLnNldCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiAob3duRGVzYy5zZXQuY2FsbChyZWNlaXZlciwgViksIHRydWUpO1xufVxuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7IHNldDogc2V0IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///263\n")},function(module,exports,__webpack_require__){eval("// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = __webpack_require__(1);\nvar setProto = __webpack_require__(66);\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzPzkyNzUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gMjYuMS4xNCBSZWZsZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNldFByb3RvID0gcmVxdWlyZSgnLi9fc2V0LXByb3RvJyk7XG5cbmlmIChzZXRQcm90bykgJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBzZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bykge1xuICAgIHNldFByb3RvLmNoZWNrKHRhcmdldCwgcHJvdG8pO1xuICAgIHRyeSB7XG4gICAgICBzZXRQcm90by5zZXQodGFyZ2V0LCBwcm90byk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///264\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(266);\nmodule.exports = __webpack_require__(10).Array.includes;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vYXJyYXkvaW5jbHVkZXMuanM/MTQzYSJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5hcnJheS5pbmNsdWRlcycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuQXJyYXkuaW5jbHVkZXM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///265\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// https://github.com/tc39/Array.prototype.includes\nvar $export = __webpack_require__(1);\nvar $includes = __webpack_require__(49)(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n__webpack_require__(40)('includes');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuYXJyYXkuaW5jbHVkZXMuanM/Njc2MiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9BcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgaW5jbHVkZXM6IGZ1bmN0aW9uIGluY2x1ZGVzKGVsIC8qICwgZnJvbUluZGV4ID0gMCAqLykge1xuICAgIHJldHVybiAkaW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdpbmNsdWRlcycpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///266\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(268);\nmodule.exports = __webpack_require__(10).String.padStart;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vc3RyaW5nL3BhZC1zdGFydC5qcz9jMThjIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtc3RhcnQnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlN0cmluZy5wYWRTdGFydDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///267\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(1);\nvar $pad = __webpack_require__(116);\nvar userAgent = __webpack_require__(57);\n\n// https://github.com/zloirock/core-js/issues/280\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydC5qcz9mNTc2Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYWQgPSByZXF1aXJlKCcuL19zdHJpbmctcGFkJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMjgwXG52YXIgV0VCS0lUX0JVRyA9IC9WZXJzaW9uXFwvMTBcXC5cXGQrKFxcLlxcZCspPyggTW9iaWxlXFwvXFx3Kyk/IFNhZmFyaVxcLy8udGVzdCh1c2VyQWdlbnQpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIFdFQktJVF9CVUcsICdTdHJpbmcnLCB7XG4gIHBhZFN0YXJ0OiBmdW5jdGlvbiBwYWRTdGFydChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuICRwYWQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///268\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(270);\nmodule.exports = __webpack_require__(10).String.padEnd;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjY5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vc3RyaW5nL3BhZC1lbmQuanM/NDBkYyJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zdHJpbmcucGFkLWVuZCcpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuU3RyaW5nLnBhZEVuZDtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///269\n")},function(module,exports,__webpack_require__){"use strict";eval("\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = __webpack_require__(1);\nvar $pad = __webpack_require__(116);\nvar userAgent = __webpack_require__(57);\n\n// https://github.com/zloirock/core-js/issues/280\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQuanM/ZWQ1MCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFkID0gcmVxdWlyZSgnLi9fc3RyaW5nLXBhZCcpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzI4MFxudmFyIFdFQktJVF9CVUcgPSAvVmVyc2lvblxcLzEwXFwuXFxkKyhcXC5cXGQrKT8oIE1vYmlsZVxcL1xcdyspPyBTYWZhcmlcXC8vLnRlc3QodXNlckFnZW50KTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBXRUJLSVRfQlVHLCAnU3RyaW5nJywge1xuICBwYWRFbmQ6IGZ1bmN0aW9uIHBhZEVuZChtYXhMZW5ndGggLyogLCBmaWxsU3RyaW5nID0gJyAnICovKSB7XG4gICAgcmV0dXJuICRwYWQodGhpcywgbWF4TGVuZ3RoLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgZmFsc2UpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///270\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(272);\nmodule.exports = __webpack_require__(61).f('asyncIterator');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vc3ltYm9sL2FzeW5jLWl0ZXJhdG9yLmpzP2MwM2MiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX3drcy1leHQnKS5mKCdhc3luY0l0ZXJhdG9yJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///271\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(89)('asyncIterator');\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjcyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzP2FjNGQiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///272\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(274);\nmodule.exports = __webpack_require__(10).Object.getOwnPropertyDescriptors;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjczLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanM/Zjk3OSJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///273\n")},function(module,exports,__webpack_require__){eval("// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = __webpack_require__(1);\nvar ownKeys = __webpack_require__(115);\nvar toIObject = __webpack_require__(16);\nvar gOPD = __webpack_require__(19);\nvar createProperty = __webpack_require__(78);\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanM/OGU2ZSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtZ2V0b3ducHJvcGVydHlkZXNjcmlwdG9yc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi9fb3duLWtleXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnM6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob2JqZWN0KSB7XG4gICAgdmFyIE8gPSB0b0lPYmplY3Qob2JqZWN0KTtcbiAgICB2YXIgZ2V0RGVzYyA9IGdPUEQuZjtcbiAgICB2YXIga2V5cyA9IG93bktleXMoTyk7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5LCBkZXNjO1xuICAgIHdoaWxlIChrZXlzLmxlbmd0aCA+IGkpIHtcbiAgICAgIGRlc2MgPSBnZXREZXNjKE8sIGtleSA9IGtleXNbaSsrXSk7XG4gICAgICBpZiAoZGVzYyAhPT0gdW5kZWZpbmVkKSBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGtleSwgZGVzYyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///274\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(276);\nmodule.exports = __webpack_require__(10).Object.values;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vb2JqZWN0L3ZhbHVlcy5qcz9jYzUxIl0sInNvdXJjZXNDb250ZW50IjpbInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3Lm9iamVjdC52YWx1ZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC52YWx1ZXM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///275\n")},function(module,exports,__webpack_require__){eval("// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(1);\nvar $values = __webpack_require__(117)(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcy5qcz84NjE1Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdmFsdWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpIHtcbiAgICByZXR1cm4gJHZhbHVlcyhpdCk7XG4gIH1cbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///276\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(278);\nmodule.exports = __webpack_require__(10).Object.entries;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vb2JqZWN0L2VudHJpZXMuanM/MjViNCJdLCJzb3VyY2VzQ29udGVudCI6WyJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmVudHJpZXM7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///277\n")},function(module,exports,__webpack_require__){eval("// https://github.com/tc39/proposal-object-values-entries\nvar $export = __webpack_require__(1);\nvar $entries = __webpack_require__(117)(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanM/ZmZjMSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGVudHJpZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoaXQpIHtcbiAgICByZXR1cm4gJGVudHJpZXMoaXQpO1xuICB9XG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///278\n")},function(module,exports,__webpack_require__){"use strict";eval("\n__webpack_require__(109);\n__webpack_require__(280);\nmodule.exports = __webpack_require__(10).Promise['finally'];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjc5LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vcHJvbWlzZS9maW5hbGx5LmpzPzRjOGEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYucHJvbWlzZScpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5Qcm9taXNlWydmaW5hbGx5J107XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///279\n")},function(module,exports,__webpack_require__){"use strict";eval("// https://github.com/tc39/proposal-promise-finally\n\nvar $export = __webpack_require__(1);\nvar core = __webpack_require__(10);\nvar global = __webpack_require__(2);\nvar speciesConstructor = __webpack_require__(47);\nvar promiseResolve = __webpack_require__(111);\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n var C = speciesConstructor(this, core.Promise || global.Promise);\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n} });\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgwLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucHJvbWlzZS5maW5hbGx5LmpzPzA5N2QiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1maW5hbGx5XG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgc3BlY2llc0NvbnN0cnVjdG9yID0gcmVxdWlyZSgnLi9fc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi9fcHJvbWlzZS1yZXNvbHZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnUHJvbWlzZScsIHsgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gIHZhciBDID0gc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIGNvcmUuUHJvbWlzZSB8fCBnbG9iYWwuUHJvbWlzZSk7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHg7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHksXG4gICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZVJlc29sdmUoQywgb25GaW5hbGx5KCkpLnRoZW4oZnVuY3Rpb24gKCkgeyB0aHJvdyBlOyB9KTtcbiAgICB9IDogb25GaW5hbGx5XG4gICk7XG59IH0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///280\n")},function(module,exports,__webpack_require__){eval("__webpack_require__(282);\n__webpack_require__(283);\n__webpack_require__(284);\nmodule.exports = __webpack_require__(10);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgxLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvd2ViL2luZGV4LmpzPzE3MTUiXSwic291cmNlc0NvbnRlbnQiOlsicmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIudGltZXJzJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL3dlYi5pbW1lZGlhdGUnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi9tb2R1bGVzL19jb3JlJyk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///281\n")},function(module,exports,__webpack_require__){eval("// ie9- setTimeout & setInterval additional parameters fix\nvar global = __webpack_require__(2);\nvar $export = __webpack_require__(1);\nvar userAgent = __webpack_require__(57);\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgyLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIudGltZXJzLmpzPzQ3OTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gaWU5LSBzZXRUaW1lb3V0ICYgc2V0SW50ZXJ2YWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZpeFxudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG52YXIgc2xpY2UgPSBbXS5zbGljZTtcbnZhciBNU0lFID0gL01TSUUgLlxcLi8udGVzdCh1c2VyQWdlbnQpOyAvLyA8LSBkaXJ0eSBpZTktIGNoZWNrXG52YXIgd3JhcCA9IGZ1bmN0aW9uIChzZXQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChmbiwgdGltZSAvKiAsIC4uLmFyZ3MgKi8pIHtcbiAgICB2YXIgYm91bmRBcmdzID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gICAgdmFyIGFyZ3MgPSBib3VuZEFyZ3MgPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMikgOiBmYWxzZTtcbiAgICByZXR1cm4gc2V0KGJvdW5kQXJncyA/IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgICAgKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbikpLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gOiBmbiwgdGltZSk7XG4gIH07XG59O1xuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkIgKyAkZXhwb3J0LkYgKiBNU0lFLCB7XG4gIHNldFRpbWVvdXQ6IHdyYXAoZ2xvYmFsLnNldFRpbWVvdXQpLFxuICBzZXRJbnRlcnZhbDogd3JhcChnbG9iYWwuc2V0SW50ZXJ2YWwpXG59KTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///282\n")},function(module,exports,__webpack_require__){eval("var $export = __webpack_require__(1);\nvar $task = __webpack_require__(84);\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjgzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuaW1tZWRpYXRlLmpzPzEzMGYiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CLCB7XG4gIHNldEltbWVkaWF0ZTogJHRhc2suc2V0LFxuICBjbGVhckltbWVkaWF0ZTogJHRhc2suY2xlYXJcbn0pO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///283\n")},function(module,exports,__webpack_require__){eval("var $iterators = __webpack_require__(81);\nvar getKeys = __webpack_require__(32);\nvar redefine = __webpack_require__(11);\nvar global = __webpack_require__(2);\nvar hide = __webpack_require__(15);\nvar Iterators = __webpack_require__(39);\nvar wks = __webpack_require__(6);\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg0LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzP2FjNmEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyICRpdGVyYXRvcnMgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xudmFyIElURVJBVE9SID0gd2tzKCdpdGVyYXRvcicpO1xudmFyIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJyk7XG52YXIgQXJyYXlWYWx1ZXMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbnZhciBET01JdGVyYWJsZXMgPSB7XG4gIENTU1J1bGVMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgQ1NTU3R5bGVEZWNsYXJhdGlvbjogZmFsc2UsXG4gIENTU1ZhbHVlTGlzdDogZmFsc2UsXG4gIENsaWVudFJlY3RMaXN0OiBmYWxzZSxcbiAgRE9NUmVjdExpc3Q6IGZhbHNlLFxuICBET01TdHJpbmdMaXN0OiBmYWxzZSxcbiAgRE9NVG9rZW5MaXN0OiB0cnVlLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogZmFsc2UsXG4gIEZpbGVMaXN0OiBmYWxzZSxcbiAgSFRNTEFsbENvbGxlY3Rpb246IGZhbHNlLFxuICBIVE1MQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxGb3JtRWxlbWVudDogZmFsc2UsXG4gIEhUTUxTZWxlY3RFbGVtZW50OiBmYWxzZSxcbiAgTWVkaWFMaXN0OiB0cnVlLCAvLyBUT0RPOiBOb3Qgc3BlYyBjb21wbGlhbnQsIHNob3VsZCBiZSBmYWxzZS5cbiAgTWltZVR5cGVBcnJheTogZmFsc2UsXG4gIE5hbWVkTm9kZU1hcDogZmFsc2UsXG4gIE5vZGVMaXN0OiB0cnVlLFxuICBQYWludFJlcXVlc3RMaXN0OiBmYWxzZSxcbiAgUGx1Z2luOiBmYWxzZSxcbiAgUGx1Z2luQXJyYXk6IGZhbHNlLFxuICBTVkdMZW5ndGhMaXN0OiBmYWxzZSxcbiAgU1ZHTnVtYmVyTGlzdDogZmFsc2UsXG4gIFNWR1BhdGhTZWdMaXN0OiBmYWxzZSxcbiAgU1ZHUG9pbnRMaXN0OiBmYWxzZSxcbiAgU1ZHU3RyaW5nTGlzdDogZmFsc2UsXG4gIFNWR1RyYW5zZm9ybUxpc3Q6IGZhbHNlLFxuICBTb3VyY2VCdWZmZXJMaXN0OiBmYWxzZSxcbiAgU3R5bGVTaGVldExpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBUZXh0VHJhY2tDdWVMaXN0OiBmYWxzZSxcbiAgVGV4dFRyYWNrTGlzdDogZmFsc2UsXG4gIFRvdWNoTGlzdDogZmFsc2Vcbn07XG5cbmZvciAodmFyIGNvbGxlY3Rpb25zID0gZ2V0S2V5cyhET01JdGVyYWJsZXMpLCBpID0gMDsgaSA8IGNvbGxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gIHZhciBOQU1FID0gY29sbGVjdGlvbnNbaV07XG4gIHZhciBleHBsaWNpdCA9IERPTUl0ZXJhYmxlc1tOQU1FXTtcbiAgdmFyIENvbGxlY3Rpb24gPSBnbG9iYWxbTkFNRV07XG4gIHZhciBwcm90byA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIHZhciBrZXk7XG4gIGlmIChwcm90bykge1xuICAgIGlmICghcHJvdG9bSVRFUkFUT1JdKSBoaWRlKHByb3RvLCBJVEVSQVRPUiwgQXJyYXlWYWx1ZXMpO1xuICAgIGlmICghcHJvdG9bVE9fU1RSSU5HX1RBR10pIGhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICAgIEl0ZXJhdG9yc1tOQU1FXSA9IEFycmF5VmFsdWVzO1xuICAgIGlmIChleHBsaWNpdCkgZm9yIChrZXkgaW4gJGl0ZXJhdG9ycykgaWYgKCFwcm90b1trZXldKSByZWRlZmluZShwcm90bywga2V5LCAkaXRlcmF0b3JzW2tleV0sIHRydWUpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///284\n")},function(module,exports){eval('/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n "use strict";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === "function" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || "@@iterator";\n var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";\n var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";\n\n var inModule = typeof module === "object";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we\'re in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don\'t bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we\'re in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there\'s no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don\'t have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: "normal", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: "throw", arg: err };\n }\n }\n\n var GenStateSuspendedStart = "suspendedStart";\n var GenStateSuspendedYield = "suspendedYield";\n var GenStateExecuting = "executing";\n var GenStateCompleted = "completed";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don\'t natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = "GeneratorFunction";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n ["next", "throw", "return"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === "function" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === "GeneratorFunction"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = "GeneratorFunction";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, "__await")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === "throw") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === "object" &&\n hasOwn.call(value, "__await")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke("next", value, resolve, reject);\n }, function(err) {\n invoke("throw", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke("throw", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error("Generator is already running");\n }\n\n if (state === GenStateCompleted) {\n if (method === "throw") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === "next") {\n // Setting context._sent for legacy support of Babel\'s\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === "throw") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === "return") {\n context.abrupt("return", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === "normal") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === "throw") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = "throw";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === "throw") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = "return";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === "throw") {\n // If maybeInvokeDelegate(context) changed context.method from\n // "return" to "throw", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = "throw";\n context.arg = new TypeError(\n "The iterator does not provide a \'throw\' method");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === "throw") {\n context.method = "throw";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = "throw";\n context.arg = new TypeError("iterator result is not an object");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was "throw" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was "next", forget context.arg since it has been\n // "consumed" by the delegate iterator. If context.method was\n // "return", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== "return") {\n context.method = "next";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = "Generator";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers\' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn\'t happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return "[object Generator]";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = "normal";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: "root" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === "function") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel\'s\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = "next";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === "t" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === "throw") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = "throw";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = "next";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === "root") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle("end");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, "catchLoc");\n var hasFinally = hasOwn.call(entry, "finallyLoc");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error("try statement without catch or finally");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, "finallyLoc") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === "break" ||\n type === "continue") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = "next";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === "throw") {\n throw record.arg;\n }\n\n if (record.type === "break" ||\n record.type === "continue") {\n this.next = record.arg;\n } else if (record.type === "return") {\n this.rval = this.arg = record.arg;\n this.method = "return";\n this.next = "end";\n } else if (record.type === "normal" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n "catch": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === "throw") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error("illegal catch attempt");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === "next") {\n // Deliberately forget the last sent value so that we don\'t\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we\'re in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() {\n return this || (typeof self === "object" && self);\n })() || Function("return this")()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg1LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcz85NmNmIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuIShmdW5jdGlvbihnbG9iYWwpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiO1xuICB2YXIgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWU7XG4gIGlmIChydW50aW1lKSB7XG4gICAgaWYgKGluTW9kdWxlKSB7XG4gICAgICAvLyBJZiByZWdlbmVyYXRvclJ1bnRpbWUgaXMgZGVmaW5lZCBnbG9iYWxseSBhbmQgd2UncmUgaW4gYSBtb2R1bGUsXG4gICAgICAvLyBtYWtlIHRoZSBleHBvcnRzIG9iamVjdCBpZGVudGljYWwgdG8gcmVnZW5lcmF0b3JSdW50aW1lLlxuICAgICAgbW9kdWxlLmV4cG9ydHMgPSBydW50aW1lO1xuICAgIH1cbiAgICAvLyBEb24ndCBib3RoZXIgZXZhbHVhdGluZyB0aGUgcmVzdCBvZiB0aGlzIGZpbGUgaWYgdGhlIHJ1bnRpbWUgd2FzXG4gICAgLy8gYWxyZWFkeSBkZWZpbmVkIGdsb2JhbGx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIERlZmluZSB0aGUgcnVudGltZSBnbG9iYWxseSAoYXMgZXhwZWN0ZWQgYnkgZ2VuZXJhdGVkIGNvZGUpIGFzIGVpdGhlclxuICAvLyBtb2R1bGUuZXhwb3J0cyAoaWYgd2UncmUgaW4gYSBtb2R1bGUpIG9yIGEgbmV3LCBlbXB0eSBvYmplY3QuXG4gIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lID0gaW5Nb2R1bGUgPyBtb2R1bGUuZXhwb3J0cyA6IHt9O1xuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIHJ1bnRpbWUud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlW3RvU3RyaW5nVGFnU3ltYm9sXSA9XG4gICAgR2VuZXJhdG9yRnVuY3Rpb24uZGlzcGxheU5hbWUgPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG5cbiAgLy8gSGVscGVyIGZvciBkZWZpbmluZyB0aGUgLm5leHQsIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcyBvZiB0aGVcbiAgLy8gSXRlcmF0b3IgaW50ZXJmYWNlIGluIHRlcm1zIG9mIGEgc2luZ2xlIC5faW52b2tlIG1ldGhvZC5cbiAgZnVuY3Rpb24gZGVmaW5lSXRlcmF0b3JNZXRob2RzKHByb3RvdHlwZSkge1xuICAgIFtcIm5leHRcIiwgXCJ0aHJvd1wiLCBcInJldHVyblwiXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgcHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludm9rZShtZXRob2QsIGFyZyk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgcnVudGltZS5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBpZiAoISh0b1N0cmluZ1RhZ1N5bWJvbCBpbiBnZW5GdW4pKSB7XG4gICAgICAgIGdlbkZ1blt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvckZ1bmN0aW9uXCI7XG4gICAgICB9XG4gICAgfVxuICAgIGdlbkZ1bi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEdwKTtcbiAgICByZXR1cm4gZ2VuRnVuO1xuICB9O1xuXG4gIC8vIFdpdGhpbiB0aGUgYm9keSBvZiBhbnkgYXN5bmMgZnVuY3Rpb24sIGBhd2FpdCB4YCBpcyB0cmFuc2Zvcm1lZCB0b1xuICAvLyBgeWllbGQgcmVnZW5lcmF0b3JSdW50aW1lLmF3cmFwKHgpYCwgc28gdGhhdCB0aGUgcnVudGltZSBjYW4gdGVzdFxuICAvLyBgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKWAgdG8gZGV0ZXJtaW5lIGlmIHRoZSB5aWVsZGVkIHZhbHVlIGlzXG4gIC8vIG1lYW50IHRvIGJlIGF3YWl0ZWQuXG4gIHJ1bnRpbWUuYXdyYXAgPSBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4geyBfX2F3YWl0OiBhcmcgfTtcbiAgfTtcblxuICBmdW5jdGlvbiBBc3luY0l0ZXJhdG9yKGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihmdW5jdGlvbih1bndyYXBwZWQpIHtcbiAgICAgICAgICAvLyBXaGVuIGEgeWllbGRlZCBQcm9taXNlIGlzIHJlc29sdmVkLCBpdHMgZmluYWwgdmFsdWUgYmVjb21lc1xuICAgICAgICAgIC8vIHRoZSAudmFsdWUgb2YgdGhlIFByb21pc2U8e3ZhbHVlLGRvbmV9PiByZXN1bHQgZm9yIHRoZVxuICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IHVud3JhcHBlZDtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgLy8gSWYgYSByZWplY3RlZCBQcm9taXNlIHdhcyB5aWVsZGVkLCB0aHJvdyB0aGUgcmVqZWN0aW9uIGJhY2tcbiAgICAgICAgICAvLyBpbnRvIHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gc28gaXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuXG4gICAgICAgICAgcmV0dXJuIGludm9rZShcInRocm93XCIsIGVycm9yLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzIHx8ICh0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiAmJiBzZWxmKTtcbiAgfSkoKSB8fCBGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKClcbik7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///285\n')},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(process) {// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(287)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcz9kZjdjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XSwgdW5peCB2ZXJzaW9uXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxudmFyIHNwbGl0UGF0aFJlID1cbiAgICAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbnZhciBzcGxpdFBhdGggPSBmdW5jdGlvbihmaWxlbmFtZSkge1xuICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7XG59O1xuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc29sdmVkUGF0aCA9ICcnLFxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgdmFyIHBhdGggPSAoaSA+PSAwKSA/IGFyZ3VtZW50c1tpXSA6IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpLFxuICAgICAgdHJhaWxpbmdTbGFzaCA9IHN1YnN0cihwYXRoLCAtMSkgPT09ICcvJztcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihwYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBwYXRoID0gJy4nO1xuICB9XG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcbiAgICBwYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHBhdGg7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5qb2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gIHJldHVybiBleHBvcnRzLm5vcm1hbGl6ZShmaWx0ZXIocGF0aHMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pLmpvaW4oJy8nKSk7XG59O1xuXG5cbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgZnJvbSA9IGV4cG9ydHMucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7XG4gIHRvID0gZXhwb3J0cy5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59O1xuXG5leHBvcnRzLnNlcCA9ICcvJztcbmV4cG9ydHMuZGVsaW1pdGVyID0gJzonO1xuXG5leHBvcnRzLmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciByZXN1bHQgPSBzcGxpdFBhdGgocGF0aCksXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xuXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgcmV0dXJuICcuJztcbiAgfVxuXG4gIGlmIChkaXIpIHtcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QgKyBkaXI7XG59O1xuXG5cbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcbiAgdmFyIGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZjtcbn07XG5cblxuZXhwb3J0cy5leHRuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gc3BsaXRQYXRoKHBhdGgpWzNdO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///286\n")},function(module,exports){eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg3LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vbm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcz9mMjhjIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///287\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/loglevel/lib/loglevel.js\nvar loglevel = __webpack_require__(0);\nvar loglevel_default = /*#__PURE__*/__webpack_require__.n(loglevel);\n\n// CONCATENATED MODULE: ./src/logLevels.js\n\nvar a = loglevel_default.a.getLogger('address-allocation');\nvar b = loglevel_default.a.getLogger('Bus');\nvar c = loglevel_default.a.getLogger('MessageBus');\nvar d = loglevel_default.a.getLogger('CoreDiscovery');\nvar e = loglevel_default.a.getLogger('StorageManager');\nvar f = loglevel_default.a.getLogger('HypertyResourcesStorage');\nvar g = loglevel_default.a.getLogger('IdentityModule');\nvar h = loglevel_default.a.getLogger('PEP');\nvar logLevels_i = loglevel_default.a.getLogger('P2PConnectionResolve');\nvar j = loglevel_default.a.getLogger('Registry');\nvar k = loglevel_default.a.getLogger('RuntimeUA');\nvar l = loglevel_default.a.getLogger('Loader');\nvar m = loglevel_default.a.getLogger('Descriptors');\nvar n = loglevel_default.a.getLogger('DataObjectsStorage');\nvar o = loglevel_default.a.getLogger('Subscription');\nvar p = loglevel_default.a.getLogger('SubscriptionManager');\nvar q = loglevel_default.a.getLogger('ObserverObject');\nvar r = loglevel_default.a.getLogger('ReporterObject');\nvar s = loglevel_default.a.getLogger('SynSubscription');\nvar t = loglevel_default.a.getLogger('SyncherManager');\nvar u = loglevel_default.a.getLogger('IdentityHandler');\nvar v = loglevel_default.a.getLogger('CryptoManager');\nvar x = loglevel_default.a.getLogger('Pipeline');\nvar f1 = loglevel_default.a.getLogger('Syncher');\nvar f2 = loglevel_default.a.getLogger('RuntimeCatalogue');\n\n/**\n 0 actual logging methods, ordered and available as:\n\n 0 - log.trace(msg)\n 1 - log.debug(msg)\n 2 - log.info(msg)\n 3 - log.warn(msg)\n 4 - log.error(msg)\n\n log.log(msg) is also available, as an alias for log.debug(msg), to improve compatibility with console, and make migration easier.\n\n Exact output formatting of these will depend on the console available in the current context of your application. For example, many environments will include a full stack trace with all trace() calls, and icons or similar to highlight other calls.\n\n These methods should never fail in any environment, even if no console object is currently available, and should always fall back to an available log method even if the specific method called (e.g. warn) isn't available.\n\n Be aware that all this means that these method won't necessarily always produce exactly the output you expect in every environment; loglevel only guarantees that these methods will never explode on you, and that it will call the most relevant method it can find, with your argument. Firefox is a notable example here: due to a current Firefox bug log.trace(msg) calls in Firefox will print only the stacktrace, and won't include any passed message arguments.\n\n*/\n// address-allocation\n\na.setLevel(0); // Bus\n\nb.setLevel(3); // MessageBus\n\nc.setLevel(3); // CoreDiscovery\n\nd.setLevel(5); // StorageManager\n\ne.setLevel(0); // HypertyResourcesStorage\n\nf.setLevel(3); // IdentityModule\n\ng.setLevel(0); // PEP\n\nh.setLevel(3); // P2PConnectionResolve\n\nlogLevels_i.setLevel(3); // Registry\n\nj.setLevel(0); // RuntimeUA\n\nk.setLevel(0); // Loader\n\nl.setLevel(0); // Descriptors\n\nm.setLevel(3); // DataObjectsStorage\n\nn.setLevel(0); // Subscription\n\no.setLevel(3); // SubscriptionManager\n\np.setLevel(3); // ObserverObject\n\nq.setLevel(0); // ReporterObject\n\nr.setLevel(0); // SynSubscription\n\ns.setLevel(3); // SyncherManager\n\nt.setLevel(0); // IdentityHandler\n\nu.setLevel(3); // CryptoManager\n\nv.setLevel(0); // Pipeline\n\nx.setLevel(0); // Syncher\n\nf1.setLevel(0); // Syncher DataObjectObserver\n\nf1.setLevel(0); // RuntimeCatalogue\n\nf2.setLevel(0);\n// CONCATENATED MODULE: ./src/runtime/runtimeUtils.js\nvar runtimeUtils = {\n runtimeDescriptor: {},\n runtimeCapabilities: {\n constraints: {}\n }\n};\n// CONCATENATED MODULE: ./src/utils/utils.js\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n * Support module with some functions will be useful\n * @module utils\n */\n\n/**\n * @typedef divideURL\n * @type Object\n * @property {string} type The type of URL\n * @property {string} domain The domain of URL\n * @property {string} identity The identity of URL\n */\n\n/**\n * Divide an url in type, domain and identity\n * @param {URL.URL} url - url address\n * @return {divideURL} the result of divideURL\n */\nfunction divideURL(url) {\n function recurse(value) {\n var regex = /([a-zA-Z-]*)(:\\/\\/(?:\\.)?|:)([-a-zA-Z0-9@:%._+~#=]{2,256})([-a-zA-Z0-9@:%._+~#=/]*)/gi;\n var subst = '$1,$3,$4';\n var parts = value.replace(regex, subst).split(',');\n return parts;\n }\n\n var parts = recurse(url); // If the url has no scheme\n\n if (parts[0] === url && !parts[0].includes('@')) {\n var _result = {\n type: '',\n domain: url,\n identity: ''\n };\n console.warn('[DivideURL] DivideURL don\\'t support url without scheme. Please review your url address', url);\n return _result;\n } // check if the url has the scheme and includes an @\n\n\n if (parts[0] === url && parts[0].includes('@')) {\n var scheme = parts[0] === url ? 'smtp' : parts[0];\n parts = recurse(scheme + '://' + parts[0]);\n } // if the domain includes an @, divide it to domain and identity respectively\n\n\n if (parts[1].includes('@')) {\n parts[2] = parts[0] + '://' + parts[1];\n parts[1] = parts[1].substr(parts[1].indexOf('@') + 1);\n }\n /*else if (parts[2].includes('/')) {\n parts[2] = parts[2].substr(parts[2].lastIndexOf('/')+1);\n }*/\n\n\n var result = {\n type: parts[0],\n domain: parts[1],\n identity: parts[2]\n };\n return result;\n}\n/**\n * Check if an Object is empty\n * @param {Object} object Object to be checked\n * @return {Boolean} status of Object, empty or not (true|false);\n */\n\nfunction emptyObject(object) {\n return Object.keys(object).length > 0 ? false : true;\n}\nfunction secondsSinceEpoch() {\n return Math.floor(Date.now() / 1000);\n}\n/**\n * Make a COPY of the original data\n * @param {Object} obj - object to be cloned\n * @return {Object}\n */\n\nfunction deepClone(obj) {\n //TODO: simple but inefficient JSON deep clone...\n if (obj) return JSON.parse(JSON.stringify(obj));\n}\nfunction removePathFromURL(url) {\n var splitURL = url.split('/');\n return splitURL[0] + '//' + splitURL[2] + '/' + splitURL[3];\n}\n/**\n * Obtains the user URL that corresponds to a given email\n * @param {string} userEmail The user email\n * @return {URL.URL} userURL The user URL\n */\n\nfunction getUserURLFromEmail(userEmail) {\n var indexOfAt = userEmail.indexOf('@');\n return 'user://' + userEmail.substring(indexOfAt + 1, userEmail.length) + '/' + userEmail.substring(0, indexOfAt);\n}\n/**\n * Obtains the user email that corresponds to a given URL\n * @param {URL.URL} userURL The user URL\n * @return {string} userEmail The user email\n */\n\nfunction getUserEmailFromURL(userURL) {\n var url = divideURL(userURL);\n return url.identity.replace('/', '') + '@' + url.domain; // identity field has '/exampleID' instead of 'exampleID'\n}\n/**\n * Check if the user identifier is already in the URL format, if not, convert to URL format\n * @param {string} identifier user identifier\n * @return {string} userURL the user URL\n */\n\nfunction convertToUserURL(identifier) {\n // check if the identifier is already in the url format\n if (identifier.substring(0, 7) === 'user://') {\n var dividedURL = divideURL(identifier); //check if the url is well formated\n\n if (dividedURL.domain && dividedURL.identity) {\n return identifier;\n } else {\n throw 'userURL with wrong format';\n } //if not, convert the user email to URL format\n\n } else {\n return getUserURLFromEmail(identifier);\n }\n}\nfunction isDataObjectURL(url) {\n var schemasToIgnore = ['domain-idp', 'runtime', 'domain', 'hyperty'];\n var splitURL = url.split('://');\n var urlSchema = splitURL[0];\n return schemasToIgnore.indexOf(urlSchema) === -1;\n}\nfunction utils_isLegacy(url) {\n if (url.split('@').length > 1) {\n return true;\n } else {\n return false;\n }\n}\nfunction isURL(url) {\n return url.split('/').length >= 3;\n}\nfunction isUserURL(url) {\n return divideURL(url).type === 'user';\n}\nfunction utils_isHypertyURL(url) {\n return divideURL(url).type === 'hyperty';\n}\n/**\n * get information relative each component configured on runtime configuration;\n * @param {object} configuration object with all configuration\n * @param {string} component string with the component to get the configuration, like, runtimeURLS, catalogueURLs, msgNodeURL, domainRegistryURL;\n * @param {string} resource type of resource to get, like, catalogue, runtimeUA, protocolstub, idpProxy\n * @return {object} return an object with all configurations;\n */\n\nfunction getConfigurationResources(configuration, component, resource) {\n var objectResource = configuration[component];\n var resourceType = objectResource[resource];\n return resourceType;\n}\n/**\n * Build a full url with the runtime configuration;\n * @param {object} configuration object with all configuration\n * @param {string} component string with the component to get the configuration, like, runtimeURLS, catalogueURLs, msgNodeURL, domainRegistryURL;\n * @param {string} resource type of resource to get, like, catalogue, runtimeUA, protocolstub, idpProxy\n * @param {string} type resource to get, like a hyperty name or protocolstub name;\n * @param {boolean} useFallback if true the function will check if have a fallback url;\n * @return {string} partial url to contact the resource;\n */\n\nfunction buildURL(configuration, component, resource, type) {\n var useFallback = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var objectResource = configuration[component];\n var url;\n\n if (!objectResource.hasOwnProperty(resource)) {\n throw Error('The configuration ' + JSON.stringify(objectResource, '', 2) + ' don\\'t have the ' + resource + ' resource you are looking for');\n }\n\n var resourceType = objectResource[resource];\n\n if (type) {\n url = resourceType.prefix + configuration.domain + resourceType.suffix + type;\n\n if (resourceType.hasOwnProperty('fallback') && useFallback) {\n if (resourceType.fallback.indexOf('%domain%')) {\n url = resourceType.fallback.replace(/(%domain%)/g, configuration.domain) + type;\n } else {\n url = resourceType.fallback + type;\n }\n }\n } else {\n url = resourceType.prefix + configuration.domain + resourceType.suffix;\n } // console.log(url);\n\n\n return url;\n}\n/**\n * Generate a Global Unique ID\n *\n * @returns String;\n */\n\nfunction generateGUID() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n}\nfunction getUserIdentityDomain(url) {\n var dividedURL = divideURL(url);\n var splitedDomain = dividedURL.domain.split('.');\n var splitedLength = splitedDomain.length;\n\n if (splitedLength == 1) {\n return splitedDomain[splitedLength - 1];\n }\n\n var domain = splitedDomain[splitedLength - 2] + '.' + splitedDomain[splitedLength - 1];\n return domain;\n}\n/**\n * Check if URL is from a backend service\n * @param {string} url URL to be processed\n * @return {boolean}\n */\n\nfunction isBackendServiceURL(url) {\n var dividedURL = divideURL(url);\n var splitedDomain = dividedURL.domain.split('.');\n var backendSchemes = ['domain', 'global', 'domain-idp']; // should be defined in the runtime configuration\n\n var backendSubDomains = ['registry', 'msg-node']; // should be defined in the runtime configuration\n\n var subDomain;\n\n if (splitedDomain.length > 1) {\n subDomain = splitedDomain.filter(function (item) {\n return backendSubDomains.indexOf(item) !== -1;\n })[0];\n }\n\n if (subDomain && backendSubDomains.indexOf(subDomain) !== -1) {\n return true;\n }\n\n if (dividedURL.type) {\n return backendSchemes.indexOf(dividedURL.type) !== -1;\n }\n\n return false;\n}\nfunction divideEmail(email) {\n var indexOfAt = email.indexOf('@');\n var result = {\n username: email.substring(0, indexOfAt),\n domain: email.substring(indexOfAt + 1, email.length)\n };\n return result;\n}\nfunction utils_assign(obj, keyPath, value) {\n if (!obj) obj = {};\n if (typeof keyPath === 'string') keyPath = parseAttributes(keyPath);\n var lastKeyIndex = keyPath.length - 1;\n\n for (var i = 0; i < lastKeyIndex; ++i) {\n var key = keyPath[i];\n\n if (!(key in obj)) {\n obj[key] = {};\n }\n\n obj = obj[key];\n }\n\n obj[keyPath[lastKeyIndex]] = value;\n}\nfunction splitObjectURL(dataObjectURL) {\n console.info('[utils - splitObjectURL]: ', dataObjectURL);\n var splitedURL = dataObjectURL.split('/');\n var url = splitedURL[0] + '//' + splitedURL[2] + '/' + splitedURL[3];\n var resource = splitedURL[5];\n var result = {\n url: url,\n resource: resource\n };\n console.info('[utils - splitObjectURL]: ', result);\n return result;\n}\nfunction checkAttribute(path) {\n var regex = /((([a-zA-Z]+):\\/\\/([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})\\/[a-zA-Z0-9.]+@[a-zA-Z0-9]+(-)?[a-zA-Z0-9]+(\\.)?[a-zA-Z0-9]{2,10}?\\.[a-zA-Z]{2,10})(.+(?=.identity))?/gm;\n var list = [];\n var final = [];\n var test = path.match(regex);\n\n if (test == null) {\n final = path.split('.');\n } else {\n var m;\n\n while ((m = regex.exec(path)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n } // The result can be accessed through the `m`-variable.\n\n\n m.forEach(function (match, groupIndex) {\n if (groupIndex === 0) {\n list.push(match);\n }\n });\n }\n\n var result;\n list.forEach(function (url) {\n result = path.replace(url, '*-*');\n final = result.split('.').map(function (item) {\n if (item === '*-*') {\n return url;\n }\n\n return item;\n });\n });\n }\n\n console.log('[RuntimeCore.Utils.checkAttribute]', final);\n return final;\n}\nfunction parseAttributes(path) {\n var regex = /([0-9a-zA-Z][-\\w]*):\\/\\//g;\n var string3 = 'identity';\n\n if (!path.includes('://')) {\n return path.split('.');\n } else {\n var string1 = path.split(regex)[0];\n var array1 = string1.split('.');\n var string2 = path.replace(string1, '');\n\n if (path.includes(string3)) {\n var array2 = string2.split(string3 + '.');\n console.log('array2 ' + array2);\n string2 = array2[0].slice('.', -1);\n array2 = array2[1].split('.');\n array1.push(string2, string3);\n array1 = array1.concat(array2);\n } else {\n array1.push(string2);\n }\n\n return array1.filter(Boolean);\n }\n}\nfunction isEmpty(obj) {\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n return false;\n }\n }\n\n return JSON.stringify(obj) === JSON.stringify({});\n}\nfunction chatkeysToStringCloner(sessionKeys) {\n var dataObjectSessionKeysClone = {};\n var fields = Object.keys(sessionKeys);\n\n if (fields) {\n try {\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n dataObjectSessionKeysClone[field] = {};\n dataObjectSessionKeysClone[field].sessionKey = sessionKeys[field].sessionKey.toString();\n dataObjectSessionKeysClone[field].isToEncrypt = sessionKeys[field].isToEncrypt;\n }\n } catch (err) {\n console.error('_chatkeysToStringCloner:err', err);\n }\n }\n\n return dataObjectSessionKeysClone;\n}\nfunction chatkeysToArrayCloner(sessionKeys) {\n var dataObjectSessionKeysClone = {};\n var fields = Object.keys(sessionKeys);\n\n if (fields) {\n try {\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n dataObjectSessionKeysClone[field] = {};\n var arrayValues = JSON.parse('[' + sessionKeys[field].sessionKey + ']');\n dataObjectSessionKeysClone[field].sessionKey = new Uint8Array(arrayValues);\n dataObjectSessionKeysClone[field].isToEncrypt = sessionKeys[field].isToEncrypt;\n }\n } catch (err) {\n console.error('_chatkeysToArrayCloner:err', err);\n }\n }\n\n return dataObjectSessionKeysClone;\n}\nfunction parseMessageURL(URL) {\n var splitedToURL = URL.split('/');\n\n if (splitedToURL.length <= 6) {\n return splitedToURL[0] + '//' + splitedToURL[2] + '/' + splitedToURL[3];\n } else {\n return splitedToURL[0] + '//' + splitedToURL[2] + '/' + splitedToURL[3] + '/' + splitedToURL[4];\n }\n}\nfunction availableSpace(usage, quota) {\n var available = (usage / quota).toFixed(2);\n return {\n quota: quota,\n usage: usage,\n percent: Number(available)\n };\n}\n/**\n* Encodes a JS object to base 64 encode\n* @param {Object} value byteArray value\n* @return {string} encoded value\n*/\n\nfunction encode(value) {\n try {\n var stringValue = stringify(value);\n return btoa(stringValue);\n } catch (err) {\n console.error('[Utils.encode:err] ' + err);\n throw err;\n }\n}\n/**\n * Decode a base64 string to object\n * @param {string_b64} value value encoded in base 64\n * @return {Object} decodedValue\n */\n\nfunction decode(value) {\n try {\n return JSON.parse(atob(value));\n } catch (err) {\n console.log('[Utils.decode:err] ' + err);\n throw err;\n }\n}\n/**\n* Decode a base64 string to Uint8Array\n* @param {string_b64} value byteArray value\n* @return {Uint8Array} encoded value\n*/\n\nfunction decodeToUint8Array(value) {\n try {\n return new Uint8Array(decode(value));\n } catch (err) {\n console.error('[Utils.decodeToUint8Array:err] ' + err);\n throw err;\n }\n}\n/**\n* Converts a JS object to string\n* NOTE: Special conversion for Uint8Arrays\n* @param {Object} value byteArray value\n* @return {Uint8Array} encoded value\n*/\n\nfunction stringify(value) {\n try {\n var stringValue;\n\n if (value.constructor === Uint8Array) {\n stringValue = '[' + value.toString() + ']'; // the [] is for JSON.parse compatibility\n } else {\n stringValue = JSON.stringify(value);\n }\n\n return stringValue;\n } catch (err) {\n console.error('[Utils.stringify:err] ' + err);\n throw err;\n }\n}\n/**\n* Converts a stringified object to object\n* @param {String} value byteArray value\n* @return {Object} encoded value\n*/\n\nfunction parse(value) {\n try {\n return JSON.parse(value);\n } catch (err) {\n console.error('[Utils.parse:err]' + err);\n console.trace();\n console.error('That that cause the error:', value);\n throw err;\n }\n}\n/**\n* Converts a stringified object to object\n* @param {String} value byteArray value\n* @return {Uint8Array} encoded value\n*/\n\nfunction parseToUint8Array(value) {\n try {\n return new Uint8Array(parse(value));\n } catch (err) {\n console.error('[Utils.parseToUint8Array:err]' + err);\n throw err;\n }\n}\n// EXTERNAL MODULE: ./node_modules/proxy-observe/index.js\nvar proxy_observe = __webpack_require__(86);\n\n// CONCATENATED MODULE: ./src/syncher/ProxyObject.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar ProxyObject_objectType = {\n ARRAY: '[object Array]',\n OBJECT: '[object Object]'\n};\n/**\n * @access private\n * Main class that maintains a JSON object, and observes changes in this object, recursively.\n * Internal objects and arrays are also observed.\n */\n\nvar ProxyObject_SyncObject =\n/*#__PURE__*/\nfunction () {\n function SyncObject(initialData) {\n _classCallCheck(this, SyncObject);\n\n var _this = this;\n\n _this._observers = [];\n _this._filters = {};\n this._data = initialData || {};\n\n this._internalObserve(this._data);\n }\n\n _createClass(SyncObject, [{\n key: \"observe\",\n value: function observe(callback) {\n this._observers.push(callback);\n }\n }, {\n key: \"find\",\n value: function find(path) {\n var list = parseAttributes(path);\n return this._findWithSplit(list);\n }\n }, {\n key: \"findBefore\",\n value: function findBefore(path) {\n var result = {};\n var list = parseAttributes(path);\n result.last = list.pop();\n result.obj = this._findWithSplit(list);\n return result;\n }\n }, {\n key: \"_findWithSplit\",\n value: function _findWithSplit(list) {\n var obj = this._data;\n list.forEach(function (value) {\n obj = obj[value];\n });\n return obj;\n }\n }, {\n key: \"_internalObserve\",\n value: function _internalObserve(object) {\n var _this2 = this;\n\n var handler = function handler(changeset) {\n changeset.every(function (change) {\n _this2._onChanges(change);\n });\n };\n\n this._data = Object.deepObserve(object, handler);\n }\n }, {\n key: \"_fireEvent\",\n value: function _fireEvent(event) {\n this._observers.forEach(function (callback) {\n callback(event);\n });\n }\n }, {\n key: \"_onChanges\",\n value: function _onChanges(change) {\n var obj = change.object;\n var objType;\n\n if (obj.constructor === Object) {\n objType = ObjectType.OBJECT;\n }\n\n if (obj.constructor === Array) {\n objType = ObjectType.ARRAY;\n }\n\n var fieldString = change.keypath; // console.log('Field:', fieldString);\n // console.log('type:', change.type);\n //let oldValue = change.oldValue;\n\n var newValue = obj[change.name]; // console.info(change.type + ' | Field: ' + fieldString + ' | New Value:', JSON.stringify(newValue), fieldString.includes('length'));\n\n if (change.type === 'update' && !fieldString.includes('.length')) {\n this._fireEvent({\n cType: ChangeType.UPDATE,\n oType: objType,\n field: fieldString,\n data: newValue\n });\n }\n\n if (change.type === 'add') {\n this._fireEvent({\n cType: ChangeType.ADD,\n oType: objType,\n field: fieldString,\n data: newValue\n });\n }\n\n if (change.type === 'delete') {\n this._fireEvent({\n cType: ChangeType.REMOVE,\n oType: objType,\n field: fieldString\n });\n }\n }\n }, {\n key: \"data\",\n get: function get() {\n return this._data;\n }\n }]);\n\n return SyncObject;\n}();\n\nvar ChangeType = {\n UPDATE: 'update',\n ADD: 'add',\n REMOVE: 'remove'\n};\nvar ObjectType = {\n OBJECT: 'object',\n ARRAY: 'array'\n};\n/* harmony default export */ var ProxyObject = (ProxyObject_SyncObject);\n// CONCATENATED MODULE: ./src/syncher/DataObjectChild.js\nfunction DataObjectChild_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectChild_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectChild_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectChild_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectChild_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar DataObjectChild_log = loglevel[\"getLogger\"]('DataObjectChild');\n\n\n/**\n * The class returned from the DataObject addChildren call or from onAddChildren if remotely created.\n */\n\nvar DataObjectChild_DataObjectChild\n/* implements SyncStatus */\n=\n/*#__PURE__*/\nfunction () {\n /* private\n ----event handlers----\n _onResponseHandler: (event) => void\n */\n\n /**\n * @ignore\n * Should not be used directly by Hyperties. It's called by the DataObject.addChild\n */\n function DataObjectChild(input) {\n DataObjectChild_classCallCheck(this, DataObjectChild);\n\n var _this = this;\n\n function throwMandatoryParmMissingError(par) {\n throw '[DataObjectChild] ' + par + ' mandatory parameter is missing';\n }\n\n input.parent ? _this._parent = input.parent : throwMandatoryParmMissingError('parent');\n input.url ? _this._url = input.url : throwMandatoryParmMissingError('url');\n input.created ? _this._created = input.created : throwMandatoryParmMissingError('created');\n input.reporter ? _this._reporter = input.reporter : throwMandatoryParmMissingError('reporter');\n input.runtime ? _this._runtime = input.runtime : throwMandatoryParmMissingError('runtime');\n input.schema ? _this._schema = input.schema : throwMandatoryParmMissingError('schema');\n input.parentObject ? _this._parentObject = input.parentObject : throwMandatoryParmMissingError('parentObject');\n if (input.name) _this._name = input.name;\n if (input.description) _this._description = input.description;\n if (input.tags) _this._tags = input.tags;\n if (input.resources) _this._resources = input.resources;\n if (input.observerStorage) _this._observerStorage = input.observerStorage;\n if (input.publicObservation) _this._publicObservation = input.publicObservation;\n _this._childId = input.url;\n\n if (input.data) {\n _this._syncObj = new ProxyObject(input.data);\n } else {\n _this._syncObj = new ProxyObject({});\n }\n\n DataObjectChild_log.log('[DataObjectChild - Constructor] - ', _this._syncObj);\n _this._bus = _this._parentObject._bus;\n _this._owner = _this._parentObject._owner;\n\n _this._allocateListeners();\n\n _this._metadata = input; // delete _this._metadata.data;\n\n delete _this._metadata.parentObject;\n _this._sharingStatus = false;\n }\n\n DataObjectChild_createClass(DataObjectChild, [{\n key: \"share\",\n\n /**\n * This function is used to share the child Object among authorised Hyperties\n * @param {boolean} reporter If true the child object is only shared to Parent reporter\n * @return {Promise} It returns a promise with the sharing results.\n */\n value: function share(toReporter) {\n var _this = this;\n\n _this._sharingStatus = new Promise(function (resolve, reject) {\n var to;\n var reporter = toReporter;\n\n if (reporter) {\n to = _this.metadata.parent;\n } else to = _this.metadata.parent + '/children/';\n\n var childValue = _this.metadata;\n childValue.data = _this.data; //FLOW-OUT: this message will be sent directly to a resource child address: MessageBus\n\n var requestMsg = {\n type: 'create',\n from: _this.metadata.reporter,\n to: to,\n body: {\n resource: childValue.url,\n value: childValue\n }\n };\n\n if (_this.identity) {\n requestMsg.body.identity = _this.identity;\n } //to be used to disable mutual authentication for legacy users\n\n\n if (_this._parentObject.data.hasOwnProperty('mutual')) requestMsg.body.mutual = _this._parentObject.data.mutual;\n\n if (_this._parentObject.metadata.reporter === _this.metadata.reporter) {\n _this._bus.postMessage(deepClone(requestMsg));\n\n return resolve();\n } else {\n var callback = function callback(reply) {\n if (reply.to === _this._reporter) {\n _this._bus.removeResponseListener(requestMsg.from, reply.id);\n\n DataObjectChild_log.log('[Syncher.DataObjectChild.share] Parent reporter reply ', reply);\n var result = {\n code: reply.body && reply.body.code ? reply.body.code : 500,\n desc: reply.body && reply.body.desc ? reply.body.desc : 'Unknown'\n };\n\n if (reply.body.code < 300) {\n return resolve(result);\n } else return reject(result);\n }\n };\n\n var id = _this._bus.postMessage(deepClone(requestMsg), callback, false);\n\n setTimeout(function () {\n // If Reporter does not reply the promise is rejected\n _this._bus.removeResponseListener(requestMsg.from, id);\n\n var result = {\n code: 408,\n desc: 'timout'\n };\n return reject(result);\n }, 3000);\n }\n });\n }\n /**\n * This function is used to share the child Object among authorised Hyperties\n * @param {boolean} reporter If true the child object is only shared to Parent reporter\n * @return {Promise} It returns a promise with the sharing results.\n */\n\n }, {\n key: \"store\",\n value: function store() {\n var _this = this;\n\n var child = {};\n var key = _this.metadata.children + '.' + _this.metadata.url;\n child.value = _this.metadata;\n child.identity = _this.identity;\n var msg = {\n from: _this.metadata.reporter,\n to: _this._parentObject._syncher._subURL,\n type: 'create',\n body: {\n resource: _this.metadata.parent,\n attribute: key,\n value: child\n }\n };\n DataObjectChild_log.log('[DataObjectChild.store]:', msg);\n\n _this._bus.postMessage(msg);\n }\n }, {\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this = this; //this is only needed for children reporters\n\n\n if (_this._reporter === _this._owner) {\n _this._listener = _this._bus.addListener(_this._reporter, function (msg) {\n if (msg.type === 'response' && msg.id === _this._msgId) {\n DataObjectChild_log.log('DataObjectChild.onResponse:', msg);\n\n _this._onResponse(msg);\n }\n });\n }\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n if (_this._listener) {\n _this._listener.remove();\n }\n }\n /**\n * Release and delete object data\n */\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n _this._releaseListeners(); //TODO: send delete message ?\n // nothing to be done\n // return new Promise((resolve) => {\n // log.log('[DataObjectChild.delete]');\n // resolve();\n // });\n\n }\n /**\n * All Metadata about the Child Data Object\n * @type {Object} -\n */\n\n }, {\n key: \"onChange\",\n\n /**\n * Register the change listeners sent by the reporter child\n * @param {function(event: MsgEvent)} callback\n */\n value: function onChange(callback) {\n this._syncObj.observe(function (event) {\n DataObjectChild_log.log('[DataObjectChild - observer] - ', event);\n callback(event);\n });\n }\n /**\n * Setup the callback to process response notifications of the creates\n * @param {function(event: MsgEvent)} callback\n */\n\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n this._onResponseHandler = callback;\n } //FLOW-IN: message received from a remote DataObject -> _onChildCreate\n\n }, {\n key: \"_onResponse\",\n value: function _onResponse(msg) {\n var _this = this;\n\n var event = {\n type: msg.type,\n url: msg.body.source,\n code: msg.body.code\n };\n\n if (_this._onResponseHandler) {\n _this._onResponseHandler(event);\n }\n }\n }, {\n key: \"shareable\",\n get: function get() {\n var shareable = this.metadata;\n shareable.data = this.data;\n return shareable;\n }\n }, {\n key: \"metadata\",\n get: function get() {\n return this._metadata;\n }\n /**\n * Children ID generated on addChildren. Unique identifier\n * @type {URL} - URL of the format #\n */\n\n }, {\n key: \"childId\",\n get: function get() {\n return this._childId;\n }\n /**\n * Data Structure to be synchronized.\n * @type {JSON} - JSON structure that should follow the defined schema, if any.\n */\n\n }, {\n key: \"sharingStatus\",\n get: function get() {\n return this._sharingStatus;\n }\n /**\n * Data Structure to be synchronized.\n * @type {JSON} - JSON structure that should follow the defined schema, if any.\n */\n\n }, {\n key: \"data\",\n get: function get() {\n return this._syncObj.data;\n }\n /**\n * Set for this dataObjectChild an identity\n * @method identity\n * @param {Identity} identity identity from who created the message\n */\n\n }, {\n key: \"identity\",\n set: function set(identity) {\n this._identity = identity;\n }\n /**\n * Get for this dataObjectChild an identity\n * @method identity\n * @return {Identity} identity from who created the message\n */\n ,\n get: function get() {\n return this._identity;\n }\n }]);\n\n return DataObjectChild;\n}();\n\n/* harmony default export */ var syncher_DataObjectChild = (DataObjectChild_DataObjectChild);\n// CONCATENATED MODULE: ./src/syncher/HeartBeat.js\nfunction HeartBeat_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HeartBeat_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HeartBeat_createClass(Constructor, protoProps, staticProps) { if (protoProps) HeartBeat_defineProperties(Constructor.prototype, protoProps); if (staticProps) HeartBeat_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/**\n * Class to handle Children Data Object Heart beats \n * required to manage synchronisation with remote storage servers.\n */\n\nvar HeartBeat_HeartBeat =\n/*#__PURE__*/\nfunction () {\n /* private\n */\n\n /**\n * @ignore\n * Should not be used directly by Hyperties. It's called by the DataObject constructor\n */\n function HeartBeat(bus, hypertyUrl, runtimeUrl, dataObject) {\n var heartBeatRate = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 60;\n\n HeartBeat_classCallCheck(this, HeartBeat);\n\n var _this = this;\n\n function throwMandatoryParmMissingError(par) {\n throw '[HeartBeat] ' + par + ' mandatory parameter is missing';\n }\n\n bus ? _this._bus = bus : throwMandatoryParmMissingError('bus');\n dataObject ? _this._dataObject = dataObject : throwMandatoryParmMissingError('dataObject');\n heartBeatRate ? _this._heartBeatRate = heartBeatRate : throwMandatoryParmMissingError('heartBeatRate');\n runtimeUrl ? _this._runtimeUrl = runtimeUrl : throwMandatoryParmMissingError('runtimeUrl');\n hypertyUrl ? _this._hypertyUrl = hypertyUrl : throwMandatoryParmMissingError('hypertyUrl');\n this.heartbeat = 0;\n _this._stop = {\n heartBeat: false,\n sync: function sync(bus) {\n var stopSyncMsg = {\n from: hypertyUrl,\n to: runtimeUrl + '/sm',\n type: 'execute',\n body: {\n method: 'stopSync',\n params: [dataObject.url]\n }\n };\n console.log('[Heartbeat.stop.sync()] sending msg:', stopSyncMsg);\n bus.postMessage(stopSyncMsg);\n }\n };\n }\n\n HeartBeat_createClass(HeartBeat, [{\n key: \"start\",\n value: function start(resume) {\n var _this2 = this;\n\n var isReporter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n console.log('[HeartBeat] starting. isReporter: ', isReporter);\n\n if (resume || !isReporter) {\n this._getLastHearBeat().then(function () {\n var isHeartBeatActive = _this2._isHeartBeatActive(_this2.heartBeat, _this2._heartBeatRate * 2);\n\n if (!isHeartBeatActive) {\n console.log('[HeartBeat] heart beats are disabled for ', _this2._dataObject); // Is disabled: lets start observer heart beat and start synching with remote storage server\n\n _this2._stop.heartBeat = _this2._startHeartBeat(_this2._heartBeatRate);\n console.log('[HeartBeat] ', _this2._hypertyUrl, ' started synching with remote storage server');\n\n _this2._startSync();\n } else {\n // heart beat is active, \n // it means the data object is already being synchronised with remote storage server\n // we only need to watch the heart beat and try to replace it in case it fails.\n _this2._watchHeartBeat(_this2._heartBeatRate, true, _this2._onHertbeatStopped);\n }\n });\n } else {\n this._startHeartBeat(this._heartBeatRate);\n\n this._startSync();\n }\n }\n }, {\n key: \"_getLastHearBeat\",\n value: function _getLastHearBeat() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n setTimeout(function () {\n console.log('[HeartBeat._getLastHearBeat] stop waiting ');\n resolve();\n }, _this3._heartBeatRate * 1000 * 1.5);\n });\n }\n }, {\n key: \"stop\",\n value: function stop() {\n if (this._stop.heartBeat) this._stop.heartBeat();\n\n this._stop.sync(this._bus);\n }\n }, {\n key: \"onNewHeartbeat\",\n value: function onNewHeartbeat(heartbeat) {\n this.heartbeat = heartbeat;\n }\n }, {\n key: \"_isHeartBeatActive\",\n value: function _isHeartBeatActive(lastHeartbeat, maxHeartBeatInterval) {\n var lastHeartPeriodInterval = secondsSinceEpoch() - lastHeartbeat;\n console.log('[HeartBeat._isHeartBeatActive] now - lastHeartBeat', lastHeartPeriodInterval);\n console.log('[HeartBeat._isHeartBeatActive] ', !(lastHeartPeriodInterval > maxHeartBeatInterval * 2));\n return !(lastHeartPeriodInterval > maxHeartBeatInterval * 2);\n }\n }, {\n key: \"_startHeartBeat\",\n value: function _startHeartBeat(rate) {\n var _this = this;\n\n var msg = {\n from: _this._hypertyUrl,\n to: _this._dataObject.url + '/children/',\n type: 'create',\n body: {\n resource: 'heartbeat',\n mutual: false,\n value: secondsSinceEpoch()\n }\n };\n console.log('[HeartBeat._startHeartBeat] starting ... ', msg.body.value);\n\n this._bus.postMessage(msg);\n\n this.heartbeat = secondsSinceEpoch();\n var id = setInterval(function () {\n var msg = {\n from: _this._hypertyUrl,\n to: _this._dataObject.url + '/children/',\n type: 'create',\n body: {\n resource: 'heartbeat',\n mutual: false,\n value: secondsSinceEpoch()\n }\n };\n console.log('[HeartBeat] ', msg);\n\n _this._bus.postMessage(msg);\n\n this.heartbeat = secondsSinceEpoch();\n }, rate * 1000); // returns function to stop the heart beat\n\n return function () {\n clearInterval(id);\n };\n }\n }, {\n key: \"_startSync\",\n value: function _startSync() {\n console.log('[HeartBeat._startSync] starting observer sync ', this._dataObject.data);\n var backupRevision = this._dataObject.data.backupRevision;\n console.log('[HeartBeat._startSync] backupRevision ', backupRevision);\n var msg = {\n from: this._hypertyUrl,\n to: this._runtimeUrl + '/sm',\n type: 'execute',\n body: {\n method: 'sync',\n params: [this._dataObject.url, backupRevision]\n }\n };\n console.log('[HeartBeat._startSync] sending msg ', msg);\n\n this._bus.postMessage(msg);\n }\n }, {\n key: \"_watchHeartBeat\",\n value: function _watchHeartBeat(rate, onWatchingIsEnabled, callback) {\n // qdo o heartBeat terminar chama callback \n // usa heartBeat Rating para iniciar timer no respectivo \n // campo do DO chamando isHeartBeatActive()\n var _this = this;\n\n var syncFun = callback;\n console.log('[HeartBeat._watchHeartBeat] started watching ', _this.heartBeat); //let heartBeat = type + 'HeartBeat';\n\n var watcher = setInterval(function () {\n if (onWatchingIsEnabled && !_this._isHeartBeatActive(_this.heartBeat, _this._heartBeatRate)) {\n console.log('[HeartBeat._watchHeartBeat] has stopped ', _this._dataObject.data);\n clearInterval(watcher);\n syncFun(_this);\n } else if (!onWatchingIsEnabled && this._isHeartBeatActive(_this.heartBeat, _this._heartBeatRate)) {\n console.log('[HeartBeat._watchHeartBeat] has changed to disabled ', _this._dataObject.data);\n clearInterval(watcher);\n syncFun();\n }\n }, rate * 1000 * 2);\n }\n }, {\n key: \"_onHertbeatStopped\",\n value: function _onHertbeatStopped(_this) {\n _this._startHeartBeat(_this._heartBeatRate);\n\n _this._startSync();\n }\n }, {\n key: \"heartBeat\",\n get: function get() {\n if (this.heartbeat) return this.heartbeat;else return 0;\n }\n }]);\n\n return HeartBeat;\n}();\n\n/* harmony default export */ var syncher_HeartBeat = (HeartBeat_HeartBeat);\n// CONCATENATED MODULE: ./src/hyperty-resource/HypertyResource.js\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction HypertyResource_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyResource_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyResource_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyResource_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyResource_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\n* The Hyperty Resource Data Model is used to model resouces handled by Hyperties and Data Objects including chat messages, files, real time human audio and video..\n*\n*/\n// Log System\n\nvar HypertyResource_log = loglevel[\"getLogger\"]('HypertyResource');\n\n\n\nvar HypertyResource_HypertyResource =\n/*#__PURE__*/\nfunction (_DataObjectChild) {\n _inherits(HypertyResource, _DataObjectChild);\n\n /**\n * HypertyResource constructor\n *\n * @param {URL} localRuntimeURL RuntimeURL of local runtime\n * @param {URL} input.owner HypertyURL of the Hyperty handling this resource\n * @param {URL} input.runtime Runtime URL where this resource is hosted\n * @param {Bus} input.bus sandbox message bus\n * @param {DataObject} input.parent Parent Data Object where the HypertyResource is handled as a child\n * @param {Boolean} isSender indicates if parent is Reporter or an Observer\n * @param {Array} input optional input parameters\n */\n function HypertyResource(isSender, input) {\n var _this2;\n\n HypertyResource_classCallCheck(this, HypertyResource);\n\n _this2 = _possibleConstructorReturn(this, _getPrototypeOf(HypertyResource).call(this, input));\n\n var _this = _assertThisInitialized(_this2);\n\n _this.arraybufferSizeLimit = 5242880; //above this limit content is not saved as ArrayBuffer\n\n _this._isSender = isSender;\n _this._localStorageURL = _this._parentObject._syncher._runtimeUrl + '/storage';\n return _this2;\n }\n\n HypertyResource_createClass(HypertyResource, [{\n key: \"save\",\n\n /*\n set parent(parent) {\n let _this = this;\n _this._parent = parent;\n }*/\n value: function save() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var msg = {\n from: _this._owner,\n to: _this._localStorageURL,\n type: 'create',\n body: {\n value: deepClone(_this._metadata)\n }\n };\n\n var callback = function callback(reply) {\n HypertyResource_log.info('[HypertyResource.save] reply: ', reply);\n\n _this._bus.removeResponseListener(_this._owner, reply.id);\n\n if (reply.body.code === 200) {\n if (reply.body.value) {\n if (!_this._metadata.contentURL) _this._metadata.contentURL = [];\n\n _this._metadata.contentURL.push(reply.body.value);\n }\n\n resolve();\n } else reject(reply.body.code + ' ' + reply.body.desc);\n };\n\n msg.body.value.content = _this._content;\n\n _this._bus.postMessage(msg, callback, false);\n });\n }\n /**\n * Function to Read HypertyResource\n *\n * @param {} callback callback to be called with progress information in terms of percentage\n * @return {Promise} input optional input parameters\n */\n\n }, {\n key: \"read\",\n value: function read(callback) {\n var _this = this;\n\n HypertyResource_log.info('[HypertyResource.read] ', this);\n return new Promise(function (resolve, reject) {\n if (_this.content) {\n resolve(_this);\n } else {\n //TODO: use an iteration to get online runtime storages when some are offline\n var storage = _this._getBestContentURL(_this._metadata.contentURL);\n\n HypertyResource_log.log('Storage:', storage);\n var msg = {\n from: _this._owner,\n to: storage.url,\n type: 'read',\n body: {\n resource: storage.url + '/' + storage.resource,\n p2p: true\n }\n };\n\n if (_this.metadata.p2pRequester && _this.metadata.p2pHandler) {\n msg.body.p2pRequester = _this.metadata.p2pRequester;\n msg.body.p2pHandler = _this.metadata.p2pHandler;\n } // get the resource first on the Local Hyperty Resource Storage;\n\n\n _this._getBestResource(msg, callback).then(function (reply) {\n HypertyResource_log.info('[HypertyResource] - get locally the resource:', reply);\n resolve(_this);\n }).catch(function (reply) {\n HypertyResource_log.warn('[HypertyResource] - get locally the resource fail', reply); // Generate new message to not use the same id of the last one;\n\n var msg = {\n from: _this._owner,\n to: storage.remoteURL,\n type: 'read',\n body: {\n resource: storage.remoteURL + '/' + storage.resource,\n p2p: true\n }\n };\n\n if (_this.metadata.p2pRequester && _this.metadata.p2pHandler) {\n msg.body.p2pRequester = _this.metadata.p2pRequester;\n msg.body.p2pHandler = _this.metadata.p2pHandler;\n } // get the resource on the Remote Hyperty Resource Storage;\n\n\n _this._getBestResource(msg, callback).then(function (reply) {\n HypertyResource_log.warn('[HypertyResource] - get remotely the resource', reply);\n resolve(_this);\n }).catch(function (reply) {\n HypertyResource_log.warn('[HypertyResource] - get remotely the resource fail', reply);\n reject(reply.body.code + ' ' + reply.body.desc);\n });\n });\n }\n });\n }\n }, {\n key: \"_getBestResource\",\n value: function _getBestResource(msg, inProgressCallback) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var waitForResponse = setTimeout(function () {\n // If Reporter does not reply the promise is rejected\n _this._bus.removeResponseListener(_this._owner, id);\n\n msg.body.code = 408;\n msg.body.desc = 'Response timeout';\n return reject(msg);\n }, 3000);\n\n var callback = function callback(reply) {\n HypertyResource_log.log('[HypertyResource.read] reply: ', reply);\n var id = reply.id;\n clearTimeout(waitForResponse);\n\n switch (reply.body.code) {\n case 200:\n _this._content = reply.body.value.content; // save locally if not too big\n\n if (reply.body.value.size < _this.arraybufferSizeLimit) {\n _this.save();\n }\n\n _this._bus.removeResponseListener(_this._owner, id);\n\n resolve(reply);\n break;\n\n case 183:\n inProgressCallback(reply.body.value);\n break;\n\n default:\n _this._bus.removeResponseListener(_this._owner, id);\n\n reject(reply);\n break;\n }\n };\n\n var id = _this._bus.postMessage(msg, callback, false);\n });\n } // Remove Hyperty from the local storage\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n HypertyResource_log.info('[HypertyResource.delete]', _this.metadata);\n var msg = {\n from: _this._owner,\n to: _this._localStorageURL,\n type: 'delete',\n body: {\n resources: _this.metadata.contentURL\n }\n };\n return new Promise(function (resolve) {\n _this._bus.postMessage(msg, function (reply) {\n if (reply.body.code < 300) resolve(true);else resolve(false);\n });\n });\n }\n }, {\n key: \"_getBestContentURL\",\n value: function _getBestContentURL(contentURLList) {\n var _this = this;\n\n var contentURL = contentURLList[0];\n var splitedResource = contentURL.substr(contentURL.lastIndexOf('/') + 1);\n var url = _this._localStorageURL; // contentURL.substr(0, contentURL.lastIndexOf('/'));\n\n var remoteResource = contentURL.substr(0, contentURL.lastIndexOf('/'));\n return {\n url: url,\n resource: splitedResource,\n remoteURL: remoteResource\n };\n }\n }, {\n key: \"resourceType\",\n get: function get() {\n var _this = this;\n\n return _this.metadata.resourceType;\n }\n }, {\n key: \"mimetype\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.type;\n }\n }, {\n key: \"content\",\n get: function get() {\n var _this = this;\n\n return _this._content;\n }\n }, {\n key: \"contentURL\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.contentURL;\n }\n }, {\n key: \"shareable\",\n get: function get() {\n var _this = this;\n\n var shareable = _get(_getPrototypeOf(HypertyResource.prototype), \"metadata\", this);\n\n shareable.resourceType = _this.resourceType;\n return shareable;\n }\n }]);\n\n return HypertyResource;\n}(syncher_DataObjectChild);\n\n/* harmony default export */ var hyperty_resource_HypertyResource = (HypertyResource_HypertyResource);\n// CONCATENATED MODULE: ./src/utils/ImageTools.js\nfunction ImageTools_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ImageTools_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ImageTools_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageTools_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageTools_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar hasBlobConstructor = typeof Blob !== 'undefined' && function () {\n try {\n return Boolean(new Blob());\n } catch (e) {\n return false;\n }\n}();\n\nvar hasArrayBufferViewSupport = hasBlobConstructor && typeof Uint8Array !== 'undefined' && function () {\n try {\n return new Blob([new Uint8Array(100)]).size === 100;\n } catch (e) {\n return false;\n }\n}();\n\nvar hasToBlobSupport = typeof HTMLCanvasElement !== \"undefined\" ? HTMLCanvasElement.prototype.toBlob : false;\nvar hasBlobSupport = hasToBlobSupport || typeof Uint8Array !== 'undefined' && typeof ArrayBuffer !== 'undefined' && typeof atob !== 'undefined';\nvar hasReaderSupport = typeof FileReader !== 'undefined' || typeof URL !== 'undefined';\n\nvar ImageTools =\n/*#__PURE__*/\nfunction () {\n function ImageTools() {\n ImageTools_classCallCheck(this, ImageTools);\n }\n\n ImageTools_createClass(ImageTools, null, [{\n key: \"resize\",\n value: function resize(file, maxDimensions, callback) {\n if (typeof maxDimensions === 'function') {\n callback = maxDimensions;\n maxDimensions = {\n width: 640,\n height: 480\n };\n }\n\n var maxWidth = maxDimensions.width;\n var maxHeight = maxDimensions.height;\n\n if (!ImageTools.isSupported() || !file.type.match(/image.*/)) {\n callback(file, false);\n return false;\n }\n\n if (file.type.match(/image\\/gif/)) {\n // Not attempting, could be an animated gif\n callback(file, false); // TODO: use https://github.com/antimatter15/whammy to convert gif to webm\n\n return false;\n }\n\n var image = document.createElement('img');\n\n image.onload = function (imgEvt) {\n var width = image.width;\n var height = image.height;\n var isTooLarge = false;\n\n if (width >= height && width > maxDimensions.width) {\n // width is the largest dimension, and it's too big.\n height *= maxDimensions.width / width;\n width = maxDimensions.width;\n isTooLarge = true;\n } else if (height > maxDimensions.height) {\n // either width wasn't over-size or height is the largest dimension\n // and the height is over-size\n width *= maxDimensions.height / height;\n height = maxDimensions.height;\n isTooLarge = true;\n }\n\n if (!isTooLarge) {\n // early exit; no need to resize\n callback(file, false);\n return;\n }\n\n var canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n var ctx = canvas.getContext('2d');\n ctx.drawImage(image, 0, 0, width, height);\n\n if (hasToBlobSupport) {\n canvas.toBlob(function (blob) {\n callback(blob, true);\n }, file.type);\n } else {\n var blob = ImageTools._toBlob(canvas, file.type);\n\n callback(blob, true);\n }\n };\n\n ImageTools._loadImage(image, file);\n\n return true;\n }\n }, {\n key: \"_toBlob\",\n value: function _toBlob(canvas, type) {\n var dataURI = canvas.toDataURL(type);\n var dataURIParts = dataURI.split(',');\n var byteString;\n\n if (dataURIParts[0].indexOf('base64') >= 0) {\n // Convert base64 to raw binary data held in a string:\n byteString = atob(dataURIParts[1]);\n } else {\n // Convert base64/URLEncoded data component to raw binary data:\n byteString = decodeURIComponent(dataURIParts[1]);\n }\n\n var arrayBuffer = new ArrayBuffer(byteString.length);\n var intArray = new Uint8Array(arrayBuffer);\n\n for (var i = 0; i < byteString.length; i += 1) {\n intArray[i] = byteString.charCodeAt(i);\n }\n\n var mimeString = dataURIParts[0].split(':')[1].split(';')[0];\n var blob = null;\n\n if (hasBlobConstructor) {\n blob = new Blob([hasArrayBufferViewSupport ? intArray : arrayBuffer], {\n type: mimeString\n });\n } else {\n var bb = new BlobBuilder();\n bb.append(arrayBuffer);\n blob = bb.getBlob(mimeString);\n }\n\n return blob;\n }\n }, {\n key: \"_loadImage\",\n value: function _loadImage(image, file, callback) {\n if (typeof URL === 'undefined') {\n var reader = new FileReader();\n\n reader.onload = function (evt) {\n image.src = evt.target.result;\n\n if (callback) {\n callback();\n }\n };\n\n reader.readAsDataURL(file);\n } else {\n image.src = URL.createObjectURL(file);\n\n if (callback) {\n callback();\n }\n }\n }\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n return typeof HTMLCanvasElement !== 'undefined' && hasBlobSupport && hasReaderSupport;\n }\n }]);\n\n return ImageTools;\n}();\n\n\n// CONCATENATED MODULE: ./src/hyperty-resource/FileHypertyResource.js\nfunction FileHypertyResource_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { FileHypertyResource_typeof = function _typeof(obj) { return typeof obj; }; } else { FileHypertyResource_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return FileHypertyResource_typeof(obj); }\n\nfunction FileHypertyResource_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction FileHypertyResource_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction FileHypertyResource_createClass(Constructor, protoProps, staticProps) { if (protoProps) FileHypertyResource_defineProperties(Constructor.prototype, protoProps); if (staticProps) FileHypertyResource_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction FileHypertyResource_possibleConstructorReturn(self, call) { if (call && (FileHypertyResource_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return FileHypertyResource_assertThisInitialized(self); }\n\nfunction FileHypertyResource_getPrototypeOf(o) { FileHypertyResource_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FileHypertyResource_getPrototypeOf(o); }\n\nfunction FileHypertyResource_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction FileHypertyResource_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) FileHypertyResource_setPrototypeOf(subClass, superClass); }\n\nfunction FileHypertyResource_setPrototypeOf(o, p) { FileHypertyResource_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FileHypertyResource_setPrototypeOf(o, p); }\n\n/**\n* The Hyperty Resource Data Model is used to model resouces handled by Hyperties and Data Objects including chat messages, files, real time human audio and video..\n*\n*/\n// Log System\n\nvar FileHypertyResource_log = loglevel[\"getLogger\"]('FileHypertyResource');\n\n\n\n\nvar FileHypertyResource_FileHypertyResource =\n/*#__PURE__*/\nfunction (_HypertyResource) {\n FileHypertyResource_inherits(FileHypertyResource, _HypertyResource);\n\n /**\n * FileHypertyResource constructor\n *\n * @param {URL} owner HypertyURL of the Hyperty handling this resource\n * @param {URL} runtime Runtime URL where this resource is hosted\n * @param {Bus} bus sandbox message bus\n * @param {DataObject} parent Parent Data Object where the HypertyResource is handled as a child\n * @param {File} file file to be encoded as HypertyResource\n * @param {Boolean} isReporter indicates if parent is Reporter or an Observer\n * @param {Array} input optional input parameters\n */\n function FileHypertyResource(isSender, input) {\n var _this2;\n\n FileHypertyResource_classCallCheck(this, FileHypertyResource);\n\n _this2 = FileHypertyResource_possibleConstructorReturn(this, FileHypertyResource_getPrototypeOf(FileHypertyResource).call(this, isSender, input));\n\n var _this = FileHypertyResource_assertThisInitialized(_this2);\n\n _this.metadata.resourceType = 'file';\n return _this2;\n }\n\n FileHypertyResource_createClass(FileHypertyResource, [{\n key: \"init\",\n value: function init(file) {\n var _this = this;\n\n if (!file) throw new Error('[FileHypertyResource.constructor] missing mandatory *file* input ');\n return new Promise(function (resolve, reject) {\n _this._metadata.name = file.name;\n _this._metadata.lastModified = file.lastModified;\n _this._metadata.size = file.size;\n _this._metadata.mimetype = file.type;\n FileHypertyResource_log.log('[FileHypertyResource.init] file: ', file);\n\n if (_this._isSender) {\n var mimetype = file.type.split('/')[0];\n\n switch (mimetype) {\n case 'image':\n _this._getImagePreview(file).then(function (preview) {\n _this._metadata.preview = preview;\n _this._content = file;\n resolve();\n });\n\n break;\n\n default:\n _this._content = file;\n resolve();\n break;\n } // if too big lets store as File and asArray Buffer\n // if (file.size > _this.arraybufferSizeLimit) {\n\n /* } else {\n let reader = new FileReader();\n reader.onload = function(theFile) {\n log.log('[FileHypertyResource.init] file loaded ', theFile);\n _this._content = theFile.target.result;\n resolve();\n }\n reader.readAsArrayBuffer(file);\n }*/\n\n } else {\n _this._content = file.content;\n if (file.preview) _this._metadata.preview = file.preview;\n resolve();\n }\n });\n }\n }, {\n key: \"_getImagePreview\",\n value: function _getImagePreview(image) {\n var reader = new FileReader();\n return new Promise(function (resolve, reject) {\n ImageTools.resize(image, {\n width: 100,\n // maximum width\n height: 100 // maximum height\n\n }, function (blob, didItResize) {\n // didItResize will be true if it managed to resize it, otherwise false (and will return the original file as 'blob')\n if (didItResize) {\n reader.readAsDataURL(blob);\n\n reader.onload = function (theImage) {\n resolve(theImage.target.result);\n };\n } else {\n FileHypertyResource_log.warn('[FileHypertyResource._getImagePreview] unable to create image preview from original image ');\n resolve(undefined);\n }\n });\n });\n }\n }, {\n key: \"toMessage\",\n\n /**\n * Share file as a data object child of a data object parent\n *\n * @param {string} children Data Object Parent children name where the file is shared\n */\n\n /* share(children) {\n let _this = this;\n \n return new Promise(function(resolve, reject) {\n //to be improved and adapted\n \n if (!_this._isSender) return reject('[FileHypertyResource.share] Observers can not share files');\n \n let file2share = _this._metadata;\n file2share.type = _this._type;\n \n _this._parent.addChild(children, file2share).then(function(dataObjectChild) {\n log.log('[FileHypertyResource.share] object child: ', dataObjectChild);\n \n let sharedFile = dataObjectChild.data;\n \n resolve(sharedFile);\n \n }).catch(function(reason) {\n log.error('Reason:', reason);\n reject(reason);\n });\n \n });\n \n }*/\n\n /**\n * Returns file content optimised to be displayed in a message line\n *\n * @param {string} children Data Object Parent children name where the file is shared\n */\n value: function toMessage() {//TODO: to be implemented. It should return HTML with img attribute as a thumbnail plus the name.\n }\n }, {\n key: \"name\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.name;\n }\n }, {\n key: \"preview\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.preview;\n }\n }]);\n\n return FileHypertyResource;\n}(hyperty_resource_HypertyResource);\n\n/* harmony default export */ var hyperty_resource_FileHypertyResource = (FileHypertyResource_FileHypertyResource);\n// CONCATENATED MODULE: ./src/hyperty-resource/HypertyResourceFactory.js\nfunction HypertyResourceFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyResourceFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyResourceFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyResourceFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyResourceFactory_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* The Hyperty Resource Data Model is used to model resouces handled by Hyperties and Data Objects including chat messages, files, real time human audio and video..\n*\n*/\n\n\nvar HypertyResourceFactory_HypertyResourceFactory =\n/*#__PURE__*/\nfunction () {\n /**\n * HypertyResourceFactory constructor\n *\n */\n function HypertyResourceFactory() {\n HypertyResourceFactory_classCallCheck(this, HypertyResourceFactory);\n }\n\n HypertyResourceFactory_createClass(HypertyResourceFactory, [{\n key: \"createHypertyResource\",\n value: function createHypertyResource(isSender, type, metadata) {\n var newHypertyResource;\n\n switch (type) {\n case 'file':\n newHypertyResource = new hyperty_resource_FileHypertyResource(isSender, metadata);\n break;\n\n default:\n throw new Error('[HypertyResourceFactory.createHypertyResource] not supported type: ', type);\n break;\n }\n\n return newHypertyResource;\n }\n }, {\n key: \"createHypertyResourceWithContent\",\n value: function createHypertyResourceWithContent(isSender, type, content, metadata) {\n var newHypertyResource;\n return new Promise(function (resolve) {\n switch (type) {\n case 'file':\n newHypertyResource = new hyperty_resource_FileHypertyResource(isSender, metadata);\n break;\n\n default:\n reject();\n break;\n }\n\n newHypertyResource.init(content).then(function () {\n return newHypertyResource.save(); // skip save?\n }).then(function () {\n resolve(newHypertyResource);\n });\n });\n }\n }]);\n\n return HypertyResourceFactory;\n}();\n\n/* harmony default export */ var hyperty_resource_HypertyResourceFactory = (HypertyResourceFactory_HypertyResourceFactory);\n// CONCATENATED MODULE: ./src/syncher/DataObject.js\nfunction DataObject_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObject_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObject_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObject_typeof(obj); }\n\nfunction DataObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObject_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar DataObject_log = loglevel[\"getLogger\"]('DataObject');\n\n\n\n\n\n/**\n * Main extension class for observers and reporters, with common properties and methods.\n * Children management is common for observers and reporters.\n */\n\nvar DataObject_DataObject =\n/*#__PURE__*/\nfunction () {\n /* private\n _version: number\n _owner: HypertyURL\n _url: ObjectURL\n _schema: Schema\n _bus: MiniBus\n _status: on | paused\n _syncObj: SyncData\n _children: { id: DataObjectChild }\n _childrenListener: [MsgListener]\n ----event handlers----\n _onAddChildHandler: (event) => void\n */\n\n /**\n * @ignore\n * Should not be used directly by Hyperties. It's called by the Syncher create or subscribe method's\n */\n function DataObject(input) {\n DataObject_classCallCheck(this, DataObject);\n\n var _this = this;\n\n function throwMandatoryParmMissingError(par) {\n throw '[DataObject] ' + par + ' mandatory parameter is missing';\n }\n\n input.syncher ? _this._syncher = input.syncher : throwMandatoryParmMissingError('syncher');\n input.url ? _this._url = input.url : throwMandatoryParmMissingError('url');\n input.created ? _this._created = input.created : throwMandatoryParmMissingError('created');\n input.reporter ? _this._reporter = input.reporter : throwMandatoryParmMissingError('reporter');\n input.runtime ? _this._runtime = input.runtime : throwMandatoryParmMissingError('runtime');\n input.schema ? _this._schema = input.schema : throwMandatoryParmMissingError('schema');\n input.name ? _this._name = input.name : throwMandatoryParmMissingError('name');\n _this._status = input.status;\n\n if (input.data) {\n _this._syncObj = new ProxyObject(input.data);\n } else {\n _this._syncObj = new ProxyObject({});\n }\n\n _this._childrens = input.childrens; //TODO: For Further Study\n\n _this._mutual = input.mutual;\n _this._version = 0;\n _this._childId = 1;\n _this._childrenListener; //bus listener for children\n\n _this._onAddChildrenHandler; //Hyperty side handlers to process child objects created by remote Hyperties\n\n _this._resumed = input.resume;\n\n if (input.resume) {\n _this._version = input.version;\n }\n\n _this._owner = input.syncher._owner;\n _this._bus = input.syncher._bus;\n if (input.description) _this._description = input.description;\n if (input.tags) _this._tags = input.tags;\n if (input.resources) _this._resources = input.resources;\n if (input.observerStorage) _this._observerStorage = input.observerStorage;\n if (input.publicObservation) _this._publicObservation = input.publicObservation;\n _this._metadata = Object.assign(input); // console.log('[DataObject] mutual ', _this._metadata.mutual);\n\n if (!input.hasOwnProperty('resume') || input.hasOwnProperty('resume') && !input.resume) {\n _this._metadata.lastModified = _this._metadata.created;\n }\n\n delete _this._metadata.data;\n delete _this._metadata.syncher;\n delete _this._metadata.authorise;\n _this._hypertyResourceFactory = new hyperty_resource_HypertyResourceFactory();\n _this._childrenObjects = {};\n _this._sharedChilds = []; //childObjects that were not sent yet to Reporters\n\n if (input.backup && _this._childrens) {\n var lastHeartbeat = input.hasOwnProperty('childrenObjects') && input.childrenObjects.hasOwnProperty('heartbeat') ? input.childrenObjects.heartbeat : 0;\n _this._heartBeat = new syncher_HeartBeat(_this._bus, _this._owner, _this._syncher._runtimeUrl, this, 15, lastHeartbeat);\n if (_this._resumed) _this._heartBeat.start(true, _this.metadata.isReporter);else _this._heartBeat.start(false, _this.metadata.isReporter);\n }\n }\n\n DataObject_createClass(DataObject, [{\n key: \"_getLastChildId\",\n value: function _getLastChildId() {\n var _this = this;\n\n var childIdInt = 0;\n var childIdString = _this._owner + '#' + childIdInt;\n Object.keys(_this._childrens).filter(function (key) {\n if (_this._childrens[key].childId > childIdString) {\n childIdString = _this._childrens[key].childId;\n }\n });\n return childIdInt = Number(childIdString.split('#')[1]);\n }\n }, {\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this2 = this;\n\n var _this = this;\n\n var childBaseURL = _this._url + '/children/';\n DataObject_log.log('[Data Object - AllocateListeners] - ', _this._childrens);\n\n if (_this._childrens) {\n // _this._childrens.forEach((child) => {\n var childURL = childBaseURL;\n\n var listener = _this._bus.addListener(childURL, function (msg) {\n //ignore msg sent by himself\n if (msg.from !== _this2._owner) {\n DataObject_log.log('DataObject-Children-RCV: ', msg);\n\n switch (msg.type) {\n case 'create':\n _this._onChildCreate(msg);\n\n break;\n\n case 'delete':\n DataObject_log.log(msg);\n break;\n\n default:\n _this._changeChildren(msg);\n\n break;\n }\n } // });\n\n\n _this._childrenListener = listener;\n });\n }\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n if (_this._childrenListener) {\n _this._childrenListener.remove();\n\n Object.keys(_this._childrenObjects).forEach(function (child) {\n /* if (children === 'resources') {\n Object.keys(_this._childrenObjects[children]).forEach((child) => {\n _this._childrenObjects[children][child]._releaseListeners();\n });\n } else {*/\n _this._childrenObjects[child]._releaseListeners(); // }\n\n });\n }\n }\n /**\n * Sync Data Object Observer with last version of Data Object Reporter. Useful for Resumes\n */\n\n }, {\n key: \"sync\",\n value: function sync() {\n var _this3 = this;\n\n var _this = this;\n\n DataObject_log.info('[DataObject.sync] synchronising ');\n return new Promise(function (resolve, reject) {\n var criteria = {};\n if (_this3.metadata.backupRevision) criteria.backupRevision = _this3.metadata.backupRevision;\n\n _this._syncher.read(_this._metadata.url, criteria).then(function (value) {\n DataObject_log.info('[DataObject.sync] value to sync: ', value);\n Object.assign(_this.data, deepClone(value.data));\n _this._version = value.version;\n _this._metadata.lastModified = value.lastModified; //TODO: check first if there are new childrenObjects to avoid overhead\n\n if (value.childrenObjects) {\n _this.resumeChildrens(value.childrenObjects);\n\n _this._storeChildrens();\n\n resolve(true);\n } else resolve(true);\n /*if (value.version != _this._version) {\n log.info('[DataObject.sync] updating existing data: ', _this.data);\n Object.assign(_this.data || {}, deepClone(value.data));\n _this._metadata = deepClone(value);\n delete _this._metadata.data;\n _this._version = value.version;\n } else {\n log.info('[DataObject.sync] existing data is updated: ', value);\n }*/\n\n }).catch(function (reason) {\n DataObject_log.info('[DataObject.sync] sync failed: ', reason);\n resolve(false);\n });\n });\n }\n /**\n *\n */\n\n }, {\n key: \"resumeChildrens\",\n value: function resumeChildrens(childrens) {\n var _this4 = this;\n\n var _this = this;\n\n var childIdString = this._owner.split('/')[3] + '#' + this._childId; //setup childrens data from subscription\n // Object.keys(childrens).forEach((childrenResource) => {\n // let children = childrens[childrenResource];\n\n\n var children = childrens; //_this._childrenObjects[childrenResource] = {};\n\n Object.keys(children).forEach(function (childId) {\n var newChild = false;\n /* if (!_this._childrenObjects.hasOwnProperty(childrenResource))\n _this._childrenObjects[childrenResource] = {};*/\n // check if it is the last heartbeat\n\n if (childId === 'heartbeat') {// _this._heartBeat.onNewHeartbeat(children[childId].value);\n // _this._heartBeat.start(true);\n } else if (children[childId].hasOwnProperty('value') && children[childId].value.resourceType && !_this._childrenObjects.hasOwnProperty(childId)) {\n _this._childrenObjects[childId] = _this._resumeHypertyResource(children[childId]);\n newChild = true;\n } else if (!_this._childrenObjects.hasOwnProperty(childId)) {\n _this._childrenObjects[childId] = _this._resumeChild(children[childId]);\n DataObject_log.log('[DataObject.resumeChildrens] new DataObjectChild: ', _this._childrenObjects[childId]);\n newChild = true;\n }\n\n if (newChild && childId > childIdString) {\n childIdString = childId;\n DataObject_log.log('[DataObjectReporter.resumeChildrens] - resuming: ', _this4._childrenObjects[childId]);\n }\n }); // });\n\n this._childId = Number(childIdString.split('#')[1]);\n }\n }, {\n key: \"_resumeChild\",\n value: function _resumeChild(input) {\n var _this = this;\n\n var childInput = input.value;\n childInput.parentObject = _this;\n childInput.parent = _this._url;\n var child = new syncher_DataObjectChild(childInput);\n child.identity = input.identity;\n var event = {\n type: 'create',\n from: child.reporter,\n url: child.parent,\n value: child.data,\n childId: child.url,\n identity: child.identity,\n child: child\n };\n\n if (child.resourceType) {\n event.resource = child;\n }\n\n if (_this._onAddChildrenHandler) _this._onAddChildrenHandler(event);\n return child;\n }\n }, {\n key: \"_resumeHypertyResource\",\n value: function _resumeHypertyResource(input) {\n var _this = this;\n\n var childInput = input.value;\n childInput.parentObject = _this;\n childInput.parent = _this._url;\n\n var hypertyResource = _this._hypertyResourceFactory.createHypertyResource(false, childInput.resourceType, childInput);\n\n hypertyResource.identity = input.identity;\n var event = {\n type: 'create',\n from: hypertyResource.reporter,\n url: hypertyResource.parent,\n value: hypertyResource.data,\n childId: hypertyResource.url,\n identity: hypertyResource.identity,\n child: hypertyResource\n };\n\n if (hypertyResource.resourceType) {\n event.resource = hypertyResource;\n }\n\n if (_this._onAddChildrenHandler) _this._onAddChildrenHandler(event);\n return hypertyResource;\n }\n /**\n * All Metadata about the Data Object\n * @type {Object} -\n */\n\n }, {\n key: \"pause\",\n\n /**\n * @ignore\n */\n value: function pause() {\n //TODO: this feature needs more analise\n throw 'Not implemented';\n }\n /**\n * @ignore\n */\n\n }, {\n key: \"resume\",\n value: function resume() {\n //TODO: this feature needs more analise\n throw 'Not implemented';\n }\n /**\n * @ignore\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n //TODO: should remove the subscription and send message unsubscribe?\n throw 'Not implemented';\n }\n /**\n * Create and add a DataObjectChild to a children collection.\n * @param {JSON} initialData - Initial data of the child\n * @param {MessageBodyIdentity} identity - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\n * @param {SyncChildMetadata} input - (optional) All additional metadata about the DataObjectChild.\n * @return {Promise} - Return Promise to a new DataObjectChild.\n */\n\n }, {\n key: \"addChild\",\n value: function addChild(initialData, identity, input) {\n var _this = this;\n\n var newChild; //returns promise, in the future, the API may change to asynchronous call\n\n return new Promise(function (resolve) {\n var msgChildPath = _this._url + '/children/';\n\n var childInput = _this._getChildInput(input);\n\n childInput.data = initialData; // childInput.children = children;\n\n newChild = new syncher_DataObjectChild(childInput);\n if (identity) newChild.identity = identity;\n newChild.share();\n console.log('[DataObject.addChild] added ', newChild);\n newChild.onChange(function (event) {\n _this._onChange(event, {\n path: msgChildPath,\n childId: childInput.url\n });\n }); // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[childInput.url] = newChild;\n resolve(newChild);\n });\n }\n }, {\n key: \"_deleteChildrens\",\n value: function _deleteChildrens() {\n var _this = this;\n\n var deletePromises = [];\n return new Promise(function (resolve) {\n if (_this.childrens) {\n DataObject_log.log('[DataObject.deleteChildrens]', _this.childrens);\n var child;\n\n for (child in _this.childrens) {\n // let child;\n\n /* if (children === 'resources') {\n for (child in _this.childrens[children]) {\n let childObj = _this.childrens[children][child];\n log.log('[DataObject._deleteChildrens] child',childObj);\n if (childObj.metadata.hasOwnProperty('resourceType'))\n deletePromises.push(_this.childrens[children][child].delete());\n }\n } else {*/\n var childObj = _this.childrens[child];\n DataObject_log.log('[DataObject._deleteChildrens] child', childObj);\n if (childObj.metadata.hasOwnProperty('resourceType')) deletePromises.push(_this.childrens[child].delete());\n } // }\n\n\n DataObject_log.log('[DataObject._deleteChildrens] promises ', deletePromises);\n\n if (deletePromises.length > 0) {\n Promise.all(deletePromises).then(function () {\n resolve('[DataObject._deleteChildrens] done');\n });\n } else resolve('[DataObject._deleteChildrens] nothing to delete');\n }\n });\n }\n }, {\n key: \"_getChildInput\",\n value: function _getChildInput(input) {\n var _this = this;\n\n var childInput = Object.assign({}, input);\n _this._childId++; //removing domain from childId to avoid backup issues with '.'\n\n childInput.url = _this._owner.split('/')[3] + '#' + _this._childId;\n childInput.parentObject = _this;\n childInput.reporter = _this._owner;\n childInput.created = new Date().toISOString();\n childInput.runtime = _this._syncher._runtimeUrl;\n childInput.p2pHandler = _this._syncher._p2pHandler;\n childInput.p2pRequester = _this._syncher._p2pRequester;\n childInput.schema = _this._schema;\n childInput.parent = _this.url;\n childInput.mutual = _this.metadata.mutual; // console.log('[DataObject._getChildInput] mutual ', childInput.mutual);\n\n return childInput;\n }\n }, {\n key: \"addHypertyResource\",\n value: function addHypertyResource(type, resource, identity, input) {\n var _this = this; //returns promise, in the future, the API may change to asynchronous call\n\n\n return new Promise(function (resolve) {\n var hypertyResource;\n var msgChildPath = _this._url + '/children/';\n\n var childInput = _this._getChildInput(input); // childInput.children = children;\n\n\n _this._hypertyResourceFactory.createHypertyResourceWithContent(true, type, resource, childInput).then(function (resource) {\n hypertyResource = resource;\n if (identity) hypertyResource.identity = identity;\n hypertyResource.share();\n DataObject_log.log('[DataObject.addHypertyResource] added ', hypertyResource);\n hypertyResource.onChange(function (event) {\n _this._onChange(event, {\n path: msgChildPath,\n childId: hypertyResource.childId\n });\n }); // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[hypertyResource.childId] = hypertyResource;\n resolve(hypertyResource);\n });\n });\n }\n /**\n * Setup the callback to process create and delete of childrens.\n * @param {function(event: MsgEvent)} callback\n * TODO: add childrenId to support different handlers per children\n */\n\n }, {\n key: \"onAddChild\",\n value: function onAddChild(callback) {\n this._onAddChildrenHandler = callback;\n } //FLOW-IN: message received from a remote DataObject -> addChild\n\n }, {\n key: \"_onChildCreate\",\n value: function _onChildCreate(msg) {\n var _this = this; // console.log('[DataObject._onChildCreate] receivedBy ' + _this._owner + ' : ', msg);\n // if this is an heartbeat msg foward it to heatbeat handler\n\n\n if (msg.body.resource === 'heartbeat') {\n console.log('[DataObject._onChildCreate] new heartbeat received ' + msg.body.value);\n\n this._heartBeat.onNewHeartbeat(msg.body.value);\n } else {\n console.log('[DataObject._onChildCreate] new child receivedBy ' + _this._owner + ' : ', msg);\n var response = {\n from: msg.to,\n to: msg.from,\n type: 'response',\n id: msg.id,\n body: {\n code: 100\n }\n };\n\n _this._bus.postMessage(response);\n\n if (msg.body.value.resourceType) {\n _this._onHypertyResourceAdded(msg);\n } else _this._onChildAdded(msg);\n }\n }\n }, {\n key: \"_onChildAdded\",\n value: function _onChildAdded(msg) {\n var _this = this;\n\n var childInput = deepClone(msg.body.value);\n childInput.parentObject = _this; // let children = childInput.children;\n\n var newChild = new syncher_DataObjectChild(childInput);\n newChild.identity = msg.body.identity; // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[childInput.url] = newChild;\n if (msg.to === _this.metadata.url) newChild.store();\n\n _this._hypertyEvt(msg, newChild);\n }\n }, {\n key: \"_onHypertyResourceAdded\",\n value: function _onHypertyResourceAdded(msg) {\n var _this = this;\n\n var input = msg.body.value;\n var hypertyResource; // let children = input.children;\n\n input.parentObject = _this;\n hypertyResource = _this._hypertyResourceFactory.createHypertyResource(false, input.resourceType, input);\n hypertyResource.identity = msg.body.identity; // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[hypertyResource.childId] = hypertyResource;\n\n _this._hypertyEvt(msg, hypertyResource); // locally store messages that are directly sent to the hyperty\n // ie to sync with messages sent when offline\n\n\n if (msg.to === _this.metadata.url) hypertyResource.store();\n }\n }, {\n key: \"_hypertyEvt\",\n value: function _hypertyEvt(msg, child) {\n var _this = this;\n\n var event = {\n type: msg.type,\n from: msg.from,\n url: msg.to,\n value: child.data,\n childId: child.url,\n identity: msg.body.identity,\n child: child\n };\n\n if (child.resourceType) {\n event.resource = child;\n }\n\n if (_this._onAddChildrenHandler) _this._onAddChildrenHandler(event);\n } //send delta messages to subscriptions\n\n }, {\n key: \"_onChange\",\n value: function _onChange(event, childInfo) {\n var _this = this;\n\n _this._metadata.lastModified = new Date().toISOString();\n _this._version++;\n\n if (_this._status === 'live') {\n //FLOW-OUT: this message will be sent directly to a resource changes address: MessageBus\n var changeMsg = {\n type: 'update',\n from: _this._url,\n to: _this._url + '/changes',\n body: {\n version: _this._version,\n source: _this._owner,\n attribute: event.field,\n lastModified: _this._metadata.lastModified\n }\n };\n DataObject_log.log('[DataObject - _onChange] - ', event, childInfo, changeMsg);\n\n if (event.oType === ObjectType.OBJECT) {\n if (event.cType !== ChangeType.REMOVE) {\n changeMsg.body.value = deepClone(event.data);\n }\n } else {\n changeMsg.body.attributeType = event.oType;\n changeMsg.body.value = event.data;\n\n if (event.cType !== ChangeType.UPDATE) {\n changeMsg.body.operation = event.cType;\n }\n } //childInfo must have (path, childId)\n\n\n if (childInfo) {\n changeMsg.to = childInfo.path;\n changeMsg.body.resource = childInfo.childId;\n } //TODO: For Further Study\n\n\n if (!_this.data._mutual) changeMsg.body.mutual = _this._mutual;\n\n _this._bus.postMessage(changeMsg);\n }\n } //FLOW-IN: delta message received from a remote DataObjectReporter or DataObjectChild when changing data\n\n }, {\n key: \"_changeObject\",\n value: function _changeObject(syncObj, msg) {\n var _this = this; //TODO: update version ?\n //how to handle an incorrect version ? Example: receive a version 3 when the observer is in version 1, where is the version 2 ?\n //will we need to confirm the reception ?\n\n\n if (_this._version + 1 <= msg.body.version) {\n _this._version = msg.body.version;\n var path = msg.body.attribute;\n var value;\n if (DataObject_typeof(msg.body.value) === 'object') value = deepClone(msg.body.value);else value = msg.body.value;\n var findResult = syncObj.findBefore(path);\n\n if (msg.body.lastModified) {\n _this._metadata.lastModified = msg.body.lastModified;\n } else {\n _this._metadata.lastModified = new Date().toISOString();\n }\n\n if (msg.body.attributeType === ObjectType.ARRAY) {\n if (msg.body.operation === ChangeType.ADD) {\n var arr = findResult.obj;\n var index = findResult.last;\n Array.prototype.splice.apply(arr, [index, 0].concat(value));\n } else if (msg.body.operation === ChangeType.REMOVE) {\n var _arr = findResult.obj;\n var _index = findResult.last;\n\n _arr.splice(_index, value);\n } else {\n findResult.obj[findResult.last] = value; // UPDATE\n }\n } else {\n if (msg.body.hasOwnProperty('value')) {\n findResult.obj[findResult.last] = value; // UPDATE or ADD\n } else {\n delete findResult.obj[findResult.last]; // REMOVE\n }\n }\n } else {\n //TODO: how to handle unsynchronized versions?\n DataObject_log.log('UNSYNCHRONIZED VERSION: (data => ' + _this._version + ', msg => ' + msg.body.version + ')');\n }\n } //FLOW-IN: message received from a remote DataObjectChild when changing data\n\n }, {\n key: \"_changeChildren\",\n value: function _changeChildren(msg) {\n var _this = this;\n\n var dividedURL = divideURL(msg.to);\n var identity = dividedURL.identity; // const resource = identity ? identity.substring(identity.lastIndexOf('/') + 1) : undefined;\n\n var childId = msg.body.resource;\n var children = _this._childrenObjects[childId];\n DataObject_log.log('Change children: ', _this._owner, msg, resource);\n\n if (children) {\n _this._changeObject(children._syncObj, msg);\n } else {\n DataObject_log.warn('No children found for: ', childId);\n }\n }\n }, {\n key: \"metadata\",\n get: function get() {\n return this._metadata;\n }\n /**\n * Object URL of reporter or observer\n * @type {ObjectURL}\n */\n\n }, {\n key: \"url\",\n get: function get() {\n return this._url;\n }\n /**\n * Object schema URL (this field is not yet stable, and is subsject to change)\n * @type {SchemaURL}\n */\n\n }, {\n key: \"schema\",\n get: function get() {\n return this._schema;\n }\n /**\n * Status of the reporter or observer connection (this field is not yet stable, and is subsject to change)\n * @type {Status} - Enum of: on | paused\n */\n\n }, {\n key: \"status\",\n get: function get() {\n return this._status;\n }\n /**\n * Data structure to be synchronized.\n * @type {JSON} - JSON structure that should follow the defined schema, if any.\n */\n\n }, {\n key: \"data\",\n get: function get() {\n return this._syncObj.data;\n }\n /**\n * All created children's since the subscription, doesn't contain all children's since reporter creation.\n * @type {Object}\n */\n\n }, {\n key: \"childrens\",\n get: function get() {\n return this._childrenObjects;\n }\n }]);\n\n return DataObject;\n}();\n\n/* harmony default export */ var syncher_DataObject = (DataObject_DataObject);\n// CONCATENATED MODULE: ./src/syncher/DataObjectReporter.js\nfunction DataObjectReporter_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObjectReporter_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectReporter_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObjectReporter_typeof(obj); }\n\nfunction DataObjectReporter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectReporter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectReporter_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectReporter_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectReporter_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction DataObjectReporter_possibleConstructorReturn(self, call) { if (call && (DataObjectReporter_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return DataObjectReporter_assertThisInitialized(self); }\n\nfunction DataObjectReporter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction DataObjectReporter_get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { DataObjectReporter_get = Reflect.get; } else { DataObjectReporter_get = function _get(target, property, receiver) { var base = DataObjectReporter_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return DataObjectReporter_get(target, property, receiver || target); }\n\nfunction DataObjectReporter_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DataObjectReporter_getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction DataObjectReporter_getPrototypeOf(o) { DataObjectReporter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataObjectReporter_getPrototypeOf(o); }\n\nfunction DataObjectReporter_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DataObjectReporter_setPrototypeOf(subClass, superClass); }\n\nfunction DataObjectReporter_setPrototypeOf(o, p) { DataObjectReporter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataObjectReporter_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar DataObjectReporter_log = loglevel[\"getLogger\"]('DataObjectReporter');\n\n\n/**\n * The class returned from the Syncher create call.\n * To be used as a reporter point, changes will be submited to DataObjectObserver instances.\n */\n\nvar DataObjectReporter_DataObjectReporter =\n/*#__PURE__*/\nfunction (_DataObject) {\n DataObjectReporter_inherits(DataObjectReporter, _DataObject);\n\n /* private\n _subscriptions: \n ----event handlers----\n _onSubscriptionHandler: (event) => void\n _onResponseHandler: (event) => void\n _onReadHandler: (event) => void\n */\n\n /**\n * @ignore\n * Should not be used directly by Hyperties. It's called by the Syncher.create method\n */\n //constructor(syncher, url, created, reporter, runtime, schema, name, initialStatus, initialData, childrens, mutual = true, resumed = false, description, tags, resources, observerStorage, publicObservation) {\n function DataObjectReporter(input) {\n var _this2;\n\n DataObjectReporter_classCallCheck(this, DataObjectReporter);\n\n _this2 = DataObjectReporter_possibleConstructorReturn(this, DataObjectReporter_getPrototypeOf(DataObjectReporter).call(this, input));\n\n var _this = DataObjectReporter_assertThisInitialized(_this2);\n\n _this._subscriptions = {};\n\n _this._syncObj.observe(function (event) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] ' + _this.url + ' publish change: ', event);\n\n _this._onChange(event);\n });\n\n _this._allocateListeners();\n\n _this.invitations = []; // array of promises with pending invitations\n\n _this._childrenSizeThreshold = 50000; // to be used when replying to sync requests to ensure each response msg is not too large\n\n return _this2;\n }\n\n DataObjectReporter_createClass(DataObjectReporter, [{\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n DataObjectReporter_get(DataObjectReporter_getPrototypeOf(DataObjectReporter.prototype), \"_allocateListeners\", this).call(this);\n\n var _this = this;\n\n _this._objectListener = _this._bus.addListener(_this._url, function (msg) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] listener ' + _this._url + ' Received: ', msg);\n\n switch (msg.type) {\n case 'response':\n _this._onResponse(msg);\n\n break;\n\n case 'read':\n _this._onRead(msg);\n\n break;\n\n case 'execute':\n _this._onExecute(msg);\n\n break;\n\n case 'create':\n _this._onChildCreate(msg);\n\n break;\n // to create child objects that were sent whenn offline\n }\n });\n _this._runtimeStatusListener = _this._bus.addListener(_this._syncher._runtimeUrl + '/status', function (evt) {\n console.log('[Syncher.DataObjectReporter] runtime status event received ' + evt);\n\n if (evt.body && evt.body.resource && evt.body.resource === _this._url && evt.body.value && evt.body.value.backupRevision) {\n // broadcast backupRevision update\n _this.data.backupRevision = evt.body.value.backupRevision;\n console.log('[Syncher.DataObjectReporter] DO updated with backup revision ' + _this.data.backupRevision);\n }\n });\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n DataObjectReporter_get(DataObjectReporter_getPrototypeOf(DataObjectReporter.prototype), \"_releaseListeners\", this).call(this);\n\n var _this = this;\n\n _this._objectListener.remove();\n }\n /**\n * Send invitations (create messages) to hyperties, observers list.\n * @param {HypertyURL[]} observers List of Hyperty URL's\n */\n\n }, {\n key: \"inviteObservers\",\n value: function inviteObservers(observers, p2p) {\n var _this = this; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onCreate\n // TODO: remove value and add resources? should similar to 1st create\n\n\n var toInvite = observers; // let invitePromises = [];\n\n /* observers.forEach((observer)=> {\n if (!_this.invitations[observer]) {\n toInvite.push(observer);\n _this.invitations[observer] = observer;\n }\n });*/\n\n if (toInvite.length > 0) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] InviteObservers ', toInvite, _this._metadata);\n toInvite.forEach(function (observer) {\n var invitation = new Promise(function (resolve, reject) {\n var inviteMsg = {\n type: 'create',\n from: _this._syncher._owner,\n to: _this._syncher._subURL,\n body: {\n resume: false,\n resource: _this._url,\n schema: _this._schema,\n value: _this._metadata,\n authorise: [observer]\n }\n };\n if (p2p) inviteMsg.body.p2p = p2p;\n if (!_this.data.mutual) inviteMsg.body.mutual = _this.data.mutual;\n\n _this._bus.postMessage(inviteMsg, function (reply) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] Invitation reply ', reply);\n var result = {\n invited: observer,\n code: reply.body && reply.body.code ? reply.body.code : 500,\n desc: reply.body && reply.body.desc ? reply.body.desc : 'Unknown'\n };\n if (result.code < 300) resolve(result);\n /* else if (result.code >= 300) {\n if (_this.metadata.offline) {\n resolve(_this._processOfflineInvitation(inviteMsg));\n }*/\n else reject(result); // } \n });\n });\n\n _this.invitations.push(invitation);\n }); // return(invitePromises);\n }\n }\n /**\n * Release and delete object data\n */\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n if (_this._heartBeat) _this._heartBeat.stop();\n\n _this._deleteChildrens().then(function (result) {\n DataObjectReporter_log.log(result); //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onDelete\n\n var deleteMsg = {\n type: 'delete',\n from: _this._owner,\n to: _this._syncher._subURL,\n body: {\n resource: _this._url\n }\n };\n\n _this._bus.postMessage(deleteMsg, function (reply) {\n DataObjectReporter_log.log('DataObjectReporter-DELETE: ', reply);\n\n if (reply.body.code === 200) {\n _this._releaseListeners();\n\n delete _this._syncher._reporters[_this._url]; //_this._syncObj.unobserve();\n\n _this._syncObj = {};\n }\n });\n });\n }\n /**\n * Subscriptions requested and accepted to this reporter\n * @type {Object}\n */\n\n }, {\n key: \"onSubscription\",\n\n /**\n * Setup the callback to process subscribe and unsubscribe notifications\n * @param {function(event: MsgEvent)} callback function to receive events\n */\n value: function onSubscription(callback) {\n this._onSubscriptionHandler = callback;\n }\n /**\n * Setup the callback to process response notifications of the create's\n * @param {function(event: MsgEvent)} callback function to receive events\n */\n\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n this._onResponseHandler = callback;\n }\n /**\n * Setup the callback to process read notifications\n * @param {function(event: MsgEvent)} callback\n */\n\n }, {\n key: \"onRead\",\n value: function onRead(callback) {\n this._onReadHandler = callback;\n }\n /**\n * Setup the callback to process execute notifications\n * @param {function(event: MsgEvent)} callback\n */\n\n }, {\n key: \"onExecute\",\n value: function onExecute(callback) {\n this._onExecuteHandler = callback;\n } //FLOW-IN: message received from parent Syncher -> _onForward\n\n }, {\n key: \"_onForward\",\n value: function _onForward(msg) {\n var _this = this;\n\n DataObjectReporter_log.log('DataObjectReporter-RCV: ', msg);\n\n switch (msg.body.type) {\n case 'subscribe':\n _this._onSubscribe(msg);\n\n break;\n\n case 'unsubscribe':\n _this._onUnSubscribe(msg);\n\n break;\n }\n } //FLOW-IN: message received from this -> _onForward: emitted by a remote Syncher -> subscribe\n\n }, {\n key: \"_onSubscribe\",\n value: function _onSubscribe(msg) {\n var _this = this;\n\n var hypertyUrl = msg.body.from;\n var dividedURL = divideURL(hypertyUrl);\n var domain = dividedURL.domain;\n var mutual = true;\n if (msg.body.hasOwnProperty('mutual') && !msg.body.mutual) mutual = false;\n console.log('[DataObjectReporter._onSubscribe]', msg, domain, dividedURL);\n var event = {\n type: msg.body.type,\n url: hypertyUrl,\n domain: domain,\n identity: msg.body.identity,\n nutual: mutual,\n accept: function accept() {\n //create new subscription\n var sub = {\n url: hypertyUrl,\n status: 'live'\n };\n _this._subscriptions[hypertyUrl] = sub;\n\n if (_this.metadata.subscriptions) {\n _this.metadata.subscriptions.push(sub.url);\n }\n\n var msgValue = deepClone(_this._metadata);\n msgValue.data = deepClone(_this.data);\n msgValue.version = _this._version; //process and send childrens data\n // let childrenValues = {};\n //\n // if (_this._childrenObjects) {\n // Object.keys(_this._childrenObjects).forEach((childrenId) => {\n // let childrenData = _this._childrenObjects[childrenId];\n // childrenValues[childrenId] = deepClone(childrenData);\n // });\n // msgValue.childrenObjects = childrenValues;\n // }\n\n var sendMsg = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n schema: _this._schema,\n value: msgValue\n }\n }; //TODO: For Further Study\n\n if (msg.body.hasOwnProperty('mutual') && !msg.body.mutual) {\n sendMsg.body.mutual = msg.body.mutual; // TODO: remove?\n\n _this.data.mutual = false;\n }\n\n if (_this._heartBeat) {\n sendMsg.body.value.childrenObjects = {};\n sendMsg.body.value.childrenObjects.heartbeat = _this._heartBeat.heartbeat;\n }\n\n console.log('[DataObjectReporter._onSubscribe.accept] sending response: ', sendMsg); //send ok response message\n\n _this._bus.postMessage(sendMsg);\n\n return sub;\n },\n reject: function reject(reason) {\n //send reject response message\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 403,\n desc: reason\n }\n });\n }\n };\n\n if (_this._onSubscriptionHandler) {\n DataObjectReporter_log.log('SUBSCRIPTION-EVENT: ', event);\n\n _this._onSubscriptionHandler(event);\n }\n } //FLOW-IN: message received from this -> _onForward: emitted by a remote DataObjectObserver -> unsubscribe\n\n }, {\n key: \"_onUnSubscribe\",\n value: function _onUnSubscribe(msg) {\n var _this = this;\n\n var hypertyUrl = msg.body.from;\n var dividedURL = divideURL(hypertyUrl);\n var domain = dividedURL.domain;\n DataObjectReporter_log.log('[DataObjectReporter._onUnSubscribe]', msg, domain, dividedURL); //let sub = _this._subscriptions[hypertyUrl];\n\n delete _this._subscriptions[hypertyUrl];\n delete _this.invitations[hypertyUrl];\n var event = {\n type: msg.body.type,\n url: hypertyUrl,\n domain: domain,\n identity: msg.body.identity\n }; // TODO: check if the _onSubscriptionHandler it is the same of the subscriptions???\n\n if (_this._onSubscriptionHandler) {\n DataObjectReporter_log.log('UN-SUBSCRIPTION-EVENT: ', event);\n\n _this._onSubscriptionHandler(event);\n }\n } //FLOW-IN: message received from ReporterURL address: emited by a remote Syncher -> _onRemoteCreate -> event.ack\n\n }, {\n key: \"_onResponse\",\n value: function _onResponse(msg) {\n var _this = this;\n\n var event = {\n type: msg.type,\n url: msg.from,\n code: msg.body.code\n };\n\n if (_this._onResponseHandler) {\n DataObjectReporter_log.log('RESPONSE-EVENT: ', event);\n\n _this._onResponseHandler(event);\n }\n } //FLOW-IN: message received from ReporterURL address: emited by a remote Syncher -> read\n\n }, {\n key: \"_onRead\",\n value: function _onRead(msg) {\n var _this = this;\n\n var childrensSize = JSON.stringify(_this.childrensJSON).length;\n var largeObject = childrensSize > _this._childrenSizeThreshold ? true : false;\n var event = {\n type: msg.type,\n url: msg.from,\n accept: function accept() {\n if (largeObject) _this._syncReplyForLargeData(msg);else _this._syncReply(msg);\n },\n reject: function reject(reason) {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 401,\n desc: reason\n }\n });\n }\n }; // if the requester is an authorised observer, the data object is responded otherwise an event is triggered\n\n var subscriptions = [];\n\n if (_this.metadata.subscriptions) {\n subscriptions = _this.metadata.subscriptions;\n } else if (_this._subscriptions) {\n subscriptions = Object.keys(_this._subscriptions).map(function (key) {\n return _this._subscriptions[key].url;\n });\n }\n\n if (subscriptions.indexOf(msg.from) != -1) {\n if (largeObject) _this._syncReplyForLargeData(msg);else _this._syncReply(msg);\n } else if (_this._onReadHandler) {\n DataObjectReporter_log.log('READ-EVENT: ', event);\n\n _this._onReadHandler(event);\n }\n }\n }, {\n key: \"_syncReply\",\n value: function _syncReply(msg) {\n var _this = this;\n\n var objectValue = deepClone(_this.metadata);\n objectValue.data = deepClone(_this.data);\n objectValue.childrenObjects = deepClone(_this.childrensJSON);\n objectValue.version = _this._version;\n var response = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n value: objectValue\n }\n };\n\n _this._bus.postMessage(response);\n } // This function is only used if the data object to be synched has childrenOjects too large\n\n }, {\n key: \"_syncReplyForLargeData\",\n value: function _syncReplyForLargeData(msg) {\n //set attribute with number of spllited messages\n var _this = this; // lets set the initial message with no childObjects\n\n\n var objectValue = deepClone(_this.metadata);\n objectValue.data = deepClone(_this.data);\n objectValue.version = _this._version;\n delete objectValue.childrenObjects;\n var children;\n var values = []; // array of values to be sent in separated responses\n\n var childrenValue = {}; // value to be used in each response\n\n for (child in _this._childrenObjects) {\n // let child;\n childrenValue[child] = {}; // for (child in _this._childrenObjects[children]) {\n\n if (JSON.stringify(childrenValue).length > _this._childrenSizeThreshold) {\n //childrenValue big enough to be sent in a response message\n values.push(childrenValue); // childrenValue = {};\n // childrenValue[child] = {};\n }\n\n childrenValue[child] = {};\n childrenValue[child].value = _this._childrenObjects[child].metadata;\n childrenValue[child].identity = _this._childrenObjects[child].identity; // }\n }\n\n values.push(childrenValue);\n objectValue.responses = values.length + 1; //number of responses to be sent\n\n var initialResponse = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 100,\n value: objectValue\n }\n };\n\n _this._bus.postMessage(initialResponse);\n\n values.forEach(function (value) {\n var response = deepClone(initialResponse);\n response.body.value = value;\n response.body.value.responses = objectValue.responses;\n setTimeout(function () {\n _this._bus.postMessage(response);\n }, 50); // should put a timeout?\n });\n } // Execute request received\n\n }, {\n key: \"_onExecute\",\n value: function _onExecute(msg) {\n var _this = this;\n\n if (!msg.body.method) throw '[DataObjectReporter._onExecute] method missing ', msg;\n var response = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n };\n var event = {\n type: msg.type,\n url: msg.from,\n method: msg.body.method,\n params: msg.body.params,\n accept: function accept() {\n _this._bus.postMessage(response);\n },\n reject: function reject(reason) {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 401,\n desc: reason\n }\n });\n }\n };\n\n if (_this._onExecuteHandler) {\n DataObjectReporter_log.log('[DataObjectReporter] EXECUTE-EVENT: ', event);\n\n _this._onExecuteHandler(event);\n }\n }\n }, {\n key: \"subscriptions\",\n get: function get() {\n return this._subscriptions;\n }\n }, {\n key: \"childrensJSON\",\n get: function get() {\n var _this = this;\n\n var childrens = {}; // let children;\n // for (children in _this._childrenObjects) {\n\n var child; // childrens[children] = {};\n\n for (child in _this._childrenObjects) {\n childrens[child] = {};\n childrens[child].value = _this._childrenObjects[child].metadata;\n childrens[child].identity = _this._childrenObjects[child].identity;\n } // }\n\n\n return childrens;\n }\n }]);\n\n return DataObjectReporter;\n}(syncher_DataObject\n/* implements SyncStatus */\n);\n\n/* harmony default export */ var syncher_DataObjectReporter = (DataObjectReporter_DataObjectReporter);\n// CONCATENATED MODULE: ./src/syncher/DataObjectObserver.js\nfunction DataObjectObserver_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObjectObserver_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectObserver_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObjectObserver_typeof(obj); }\n\nfunction DataObjectObserver_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectObserver_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectObserver_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectObserver_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectObserver_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction DataObjectObserver_possibleConstructorReturn(self, call) { if (call && (DataObjectObserver_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return DataObjectObserver_assertThisInitialized(self); }\n\nfunction DataObjectObserver_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction DataObjectObserver_get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { DataObjectObserver_get = Reflect.get; } else { DataObjectObserver_get = function _get(target, property, receiver) { var base = DataObjectObserver_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return DataObjectObserver_get(target, property, receiver || target); }\n\nfunction DataObjectObserver_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DataObjectObserver_getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction DataObjectObserver_getPrototypeOf(o) { DataObjectObserver_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataObjectObserver_getPrototypeOf(o); }\n\nfunction DataObjectObserver_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DataObjectObserver_setPrototypeOf(subClass, superClass); }\n\nfunction DataObjectObserver_setPrototypeOf(o, p) { DataObjectObserver_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataObjectObserver_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar DataObjectObserver_log = loglevel[\"getLogger\"]('DataObjectObserver');\n\n\nvar FilterType = {\n ANY: 'any',\n START: 'start',\n EXACT: 'exact'\n};\n/**\n * The class returned from the Syncher subscribe call.\n * To be used as an observation point from a DataObjectReporter change.\n */\n\nvar DataObjectObserver_DataObjectObserver =\n/*#__PURE__*/\nfunction (_DataObject) {\n DataObjectObserver_inherits(DataObjectObserver, _DataObject);\n\n /* private\n _changeListener: MsgListener\n ----event handlers----\n _filters: {: {type: , callback: } }\n */\n\n /**\n * @ignore\n * Should not be used directly by Hyperties. It's called by the Syncher.subscribe method\n */\n //TODO: For Further Study\n function DataObjectObserver(input) {\n var _this2;\n\n DataObjectObserver_classCallCheck(this, DataObjectObserver);\n\n //todo: check why\n //input.initialData = input.initialData.data;\n _this2 = DataObjectObserver_possibleConstructorReturn(this, DataObjectObserver_getPrototypeOf(DataObjectObserver).call(this, input));\n\n var _this = DataObjectObserver_assertThisInitialized(_this2);\n\n _this._version = input.version;\n _this._filters = {};\n\n _this._syncObj.observe(function (event) {\n _this._onFilter(event);\n });\n\n _this._allocateListeners();\n\n return _this2;\n }\n /**\n * Sync Data Object Observer with last version of Data Object Reporter. Useful for Resumes\n */\n\n\n DataObjectObserver_createClass(DataObjectObserver, [{\n key: \"sync\",\n value: function sync() {\n var _this = this;\n\n DataObjectObserver_log.info('[DataObjectObserver_sync] synchronising ');\n return new Promise(function (resolve, reject) {\n var criteria = {}; // if (this.metadata.backupRevision) criteria.backupRevision = this.metadata.backupRevision;\n\n _this._syncher.read(_this._metadata.url, criteria).then(function (value) {\n DataObjectObserver_log.info('[DataObjectObserver_sync] value to sync: ', value);\n Object.assign(_this.data, deepClone(value.data));\n _this._version = value.version;\n _this._metadata.lastModified = value.lastModified; //TODO: check first if there are new childrenObjects to avoid overhead\n\n if (value.childrenObjects) {\n _this.resumeChildrens(value.childrenObjects);\n\n _this._storeChildrens();\n\n resolve(true);\n } else resolve(true);\n /*if (value.version != _this._version) {\n log.info('[DataObjectObserver_sync] updating existing data: ', _this.data);\n Object.assign(_this.data || {}, deepClone(value.data));\n _this._metadata = deepClone(value);\n delete _this._metadata.data;\n _this._version = value.version;\n } else {\n log.info('[DataObjectObserver_sync] existing data is updated: ', value);\n }*/\n\n }).catch(function (reason) {\n DataObjectObserver_log.info('[DataObjectObserver_sync] sync failed: ', reason);\n resolve(false);\n });\n });\n }\n }, {\n key: \"_storeChildrens\",\n value: function _storeChildrens() {\n var _this = this;\n\n var childrens = {}; //TODO: to be sent to HypertyResourceStorage when ready to handle Chat Messages\n\n Object.keys(_this._childrenObjects).forEach(function (childId) {\n var children = _this._childrenObjects; // childrens[childrenResource] = {};\n // Object.keys(children).forEach((childId) => {\n\n childrens[childId] = {};\n childrens[childId].value = children[childId].metadata;\n childrens[childId].identity = children[childId].identity; // });\n });\n var msg = {\n from: _this._owner,\n to: _this._syncher._subURL,\n type: 'create',\n body: {\n resource: _this._url,\n attribute: 'childrenObjects',\n value: childrens\n }\n };\n\n _this._bus.postMessage(msg);\n }\n }, {\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n DataObjectObserver_get(DataObjectObserver_getPrototypeOf(DataObjectObserver.prototype), \"_allocateListeners\", this).call(this);\n\n var _this = this;\n\n _this._changeListener = _this._bus.addListener(_this._url + '/changes', function (msg) {\n if (msg.type === 'update') {\n DataObjectObserver_log.log('DataObjectObserver-' + _this._url + '-RCV: ', msg);\n\n _this._changeObject(_this._syncObj, msg);\n }\n });\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n DataObjectObserver_get(DataObjectObserver_getPrototypeOf(DataObjectObserver.prototype), \"_releaseListeners\", this).call(this);\n\n var _this = this;\n\n _this._changeListener.remove();\n }\n /**\n * Release and delete object data\n */\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n if (_this._heartBeat) _this._heartBeat.stop();\n\n _this._deleteChildrens().then(function () {\n _this.unsubscribe();\n\n _this._releaseListeners();\n\n delete _this._syncher._observers[_this._url];\n });\n }\n /**\n * Release and delete object data\n */\n\n }, {\n key: \"unsubscribe\",\n value: function unsubscribe() {\n var _this = this; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onLocalUnSubscribe\n\n\n var unSubscribeMsg = {\n type: 'unsubscribe',\n from: _this._owner,\n to: _this._syncher._subURL,\n body: {\n resource: _this._url\n }\n };\n\n _this._bus.postMessage(unSubscribeMsg, function (reply) {\n DataObjectObserver_log.log('DataObjectObserver-UNSUBSCRIBE: ', reply);\n\n if (reply.body.code === 200) {\n _this._releaseListeners();\n\n delete _this._syncher._observers[_this._url];\n }\n });\n }\n /**\n * Register the change listeners sent by the reporter\n * @param {string} filter - Filter that identifies the field (separated dot path). Accepts * at the end for a more unrestricted filtering.\n * @param {function(event: MsgEvent)} callback\n */\n\n }, {\n key: \"onChange\",\n value: function onChange(filter, callback) {\n var key = filter;\n var filterObj = {\n type: FilterType.EXACT,\n callback: callback\n };\n var idx = filter.indexOf('*');\n\n if (idx === filter.length - 1) {\n if (idx === 0) {\n filterObj.type = FilterType.ANY;\n } else {\n filterObj.type = FilterType.START;\n key = filter.substr(0, filter.length - 1);\n }\n }\n\n this._filters[key] = filterObj;\n }\n }, {\n key: \"_onFilter\",\n value: function _onFilter(event) {\n var _this = this;\n\n Object.keys(_this._filters).forEach(function (key) {\n var filter = _this._filters[key];\n\n if (filter.type === FilterType.ANY) {\n //match anything\n filter.callback(event);\n } else if (filter.type === FilterType.START) {\n //if starts with filter...\n if (event.field.indexOf(key) === 0) {\n filter.callback(event);\n }\n } else if (filter.type === FilterType.EXACT) {\n //exact match\n if (event.field === key) {\n filter.callback(event);\n }\n }\n });\n }\n }, {\n key: \"onDisconnected\",\n value: function onDisconnected(callback) {\n var _this3 = this;\n\n return new Promise(function (resolve, reject) {\n _this3._subscribeRegistration().then(function () {\n _this3._onDisconnected = callback;\n resolve();\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n }, {\n key: \"_subscribeRegistration\",\n value: function _subscribeRegistration() {\n var _this4 = this;\n\n var msg = {\n type: 'subscribe',\n from: this._owner,\n to: this._syncher._runtimeUrl + '/subscriptions',\n body: {\n resources: [this._url + '/registration']\n }\n };\n return new Promise(function (resolve, reject) {\n _this4._bus.postMessage(msg, function (reply) {\n DataObjectObserver_log.log(\"[DataObjectObserver._subscribeRegistration] \".concat(_this4._url, \" rcved reply \"), reply);\n\n if (reply.body.code === 200) {\n _this4._generateListener(_this4._url + '/registration');\n\n resolve();\n } else {\n DataObjectObserver_log.error('Error subscribing registration status for ', _this4._url);\n reject('Error subscribing registration status for ' + _this4._url);\n }\n });\n });\n }\n }, {\n key: \"_generateListener\",\n value: function _generateListener(notificationURL) {\n var _this = this;\n\n _this._bus.addListener(notificationURL, function (msg) {\n DataObjectObserver_log.log(\"[DataObjectObserver.registrationNotification] \".concat(_this._url, \": \"), msg);\n\n if (msg.body.value && msg.body.value === 'disconnected' && _this._onDisconnected) {\n DataObjectObserver_log.log(\"[DataObjectObserver] \".concat(_this._url, \": was disconnected \"), msg);\n\n _this._onDisconnected();\n }\n });\n }\n /**\n * Requests the reporter to execute a method on the data object\n * @param {string} method - Name of the function to be executed.\n * @param {array} params - array of parameters for the requested function\n * @return {promise}\n */\n\n }, {\n key: \"execute\",\n value: function execute(method, params) {\n var _this5 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var msg = {\n type: 'execute',\n from: _this5._owner,\n to: _this._url,\n body: {\n method: method,\n params: params\n }\n };\n\n _this._bus.postMessage(msg, function (reply) {\n DataObjectObserver_log.log(\"[DataObjectObserver.execute] \".concat(_this._url, \" rcved reply \"), reply);\n\n if (reply.body.code === 200) {\n resolve();\n } else {\n DataObjectObserver_log.warn(\"[DataObjectObserver.execute] execution of method \".concat(method, \" was reject by reporter\"));\n reject(\"[DataObjectObserver.execute] execution of method \".concat(method, \" was reject by reporter\"));\n }\n });\n });\n }\n }]);\n\n return DataObjectObserver;\n}(syncher_DataObject\n/* implements SyncStatus */\n);\n\n/* harmony default export */ var syncher_DataObjectObserver = (DataObjectObserver_DataObjectObserver);\n// CONCATENATED MODULE: ./src/syncher/DataProvisional.js\nfunction DataProvisional_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataProvisional_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataProvisional_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataProvisional_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataProvisional_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n * @access private\n * This class is responsible for collecting delta changes in remote objects, before the response of subscription reach the observer.\n * It's used in Syncher -> subscribe. The flow is defined as:\n * 1. (observer) --subscribe--\x3e (reporter)\n * 2. (observer) <--delta updates-- (reporter)\n * 3. (observer) <--subscribe response-- (reporter)\n * This means that there could be delta updates transferred before the subscription confirmation.\n * Since there is no DataObjectObserver before the ubscription confirmation, there should be some other object collecting the updates.\n * Provisional data is applied to the DataObjectObserver after confirmation. Or discarded if there is no confirmation.\n */\n// Log System\n\nvar DataProvisional_log = loglevel[\"getLogger\"]('DataProvisional');\n\nvar DataProvisional =\n/*#__PURE__*/\nfunction () {\n /* private\n _childrenListeners: [MsgListener]\n _listener: MsgListener\n _changes: []\n */\n function DataProvisional(owner, url, bus, children) {\n DataProvisional_classCallCheck(this, DataProvisional);\n\n var _this = this;\n\n _this._owner = owner;\n _this._url = url;\n _this._bus = bus;\n _this._children = children;\n _this._changes = [];\n\n _this._allocateListeners();\n }\n\n DataProvisional_createClass(DataProvisional, [{\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this = this;\n\n _this._listener = _this._bus.addListener(_this._url, function (msg) {\n DataProvisional_log.log('DataProvisional-' + _this._url + '-RCV: ', msg);\n\n _this._changes.push(msg);\n });\n /*\n _this._childrenListeners = [];\n if (_this._children) {\n let childBaseURL = url + '/children/';\n _this._children.forEach((child) => {\n let childURL = childBaseURL + child;\n let listener = _this._bus.addListener(childURL, (msg) => {\n //ignore msg sent by himself\n if (msg.from !== owner) {\n log.log(msg);\n }\n });\n _this._childrenListeners.push(listener);\n });\n }*/\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n _this._listener.remove();\n /*_this._childrenListeners.forEach((listener) => {\n listener.remove();\n });*/\n\n }\n }, {\n key: \"apply\",\n value: function apply(observer) {\n var _this = this;\n\n _this._changes.forEach(function (change) {\n observer._changeObject(observer._syncObj, change);\n });\n }\n }, {\n key: \"children\",\n get: function get() {\n return this._children;\n }\n }]);\n\n return DataProvisional;\n}();\n\n/* harmony default export */ var syncher_DataProvisional = (DataProvisional);\n// CONCATENATED MODULE: ./src/syncher/Syncher.js\nfunction Syncher_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Syncher_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Syncher_createClass(Constructor, protoProps, staticProps) { if (protoProps) Syncher_defineProperties(Constructor.prototype, protoProps); if (staticProps) Syncher_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar Syncher_log = loglevel[\"getLogger\"]('Syncher');\n\n\n\n\n/**\n* The main class for the syncher package.\n* The Syncher is a singleton class per Hyperty/URL and it is the owner of all created Data Sync Objects according to the Reporter - Observer pattern.\n* Main functionality is to create reporters and to subscribe to existing ones.\n*/\n\nvar Syncher_Syncher =\n/*#__PURE__*/\nfunction () {\n /* private\n _owner: URL\n _bus: MiniBus\n _subURL: URL\n _reporters: \n _observers: \n _provisionals: \n ----event handlers----\n _onNotificationHandler: (event) => void\n _onResume: (event) => void\n */\n\n /**\n * Constructor that should be used by the Hyperty owner\n * @param {HypertyURL} owner - Hyperty URL owner. An URL allocated by the runtime that uniquely identifies the Hyperty.\n * @param {MiniBus} bus - An instance of the MiniBus provided in the sandbox. When an object (Reporter or Observed) is created, the SyncherManager will add a listener in the MiniBus to receive/send Messages of that object.\n * @param {JSON} config - Configuration data. The only required field for now is the runtimeURL.\n */\n function Syncher(owner, bus, config) {\n Syncher_classCallCheck(this, Syncher);\n\n var _this = this;\n\n _this._owner = owner;\n _this._bus = bus;\n _this._subURL = config.runtimeURL + '/sm';\n _this._runtimeUrl = config.runtimeURL;\n _this._p2pHandler = config.p2pHandler;\n _this._p2pRequester = config.p2pRequester;\n _this._reporters = {};\n _this._observers = {};\n _this._provisionals = {};\n bus.addListener(owner, function (msg) {\n //ignore msg sent by himself\n if (msg.from !== owner) {\n Syncher_log.info('[Syncher] Syncher-RCV: ', msg, _this);\n\n switch (msg.type) {\n case 'forward':\n _this._onForward(msg);\n\n break;\n\n case 'create':\n _this._onRemoteCreate(msg);\n\n break;\n\n case 'delete':\n _this._onRemoteDelete(msg);\n\n break;\n\n case 'execute':\n _this._onExecute(msg);\n\n break;\n }\n }\n });\n }\n /**\n * The owner of the Syncher and all created reporters.\n * @type {HypertyURL}\n */\n\n\n Syncher_createClass(Syncher, [{\n key: \"create\",\n\n /**\n * Request a DataObjectReporter creation. The URL will be be requested by the allocation mechanism.\n * @param {SchemaURL} schema - Hyperty Catalogue URL address that can be used to retrieve the JSON-Schema describing the Data Object schema\n * @param {HypertyURL[]} observers - List of hyperties that are pre-authorized for subscription\n * @param {JSON} initialData - Initial data of the reporter\n * @param {boolean} store - (Optional) if true, object will be stored by the runtime\n * @param {boolean} p2p - (Optional) if true, data synchronisation stream will use p2p connection as much as possible\n * @param {string} name - (Optional) the name of the dataobject\n * @param {MessageBodyIdentity} identity - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\n * @param {SyncMetadata} input - (optional) all metadata required to sunc the Data Object.\n * @return {Promise} Return Promise to a new Reporter. The reporter can be accepted or rejected by the PEP\n */\n value: function create(schema, observers, initialData) {\n var store = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var p2p = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var name = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'no name';\n var identity = arguments.length > 6 ? arguments[6] : undefined;\n var input = arguments.length > 7 ? arguments[7] : undefined;\n if (!schema) throw Error('[Syncher - Create] - You need specify the data object schema');\n if (!observers) throw Error('[Syncher - Create] -The observers should be defined');\n\n var _this = this;\n\n input = input || {};\n var createInput = Object.assign({}, input);\n createInput.p2p = p2p;\n createInput.store = store;\n createInput.schema = schema;\n createInput.authorise = observers;\n createInput.p2pHandler = _this._p2pHandler;\n createInput.p2pRequester = _this._p2pRequester;\n initialData ? createInput.data = deepClone(initialData) : createInput.data = {};\n createInput.name = name.length === 0 ? 'no name' : name;\n createInput.reporter = input.hasOwnProperty('reporter') && typeof input.reporter !== 'boolean' ? input.reporter : _this._owner;\n createInput.resume = false;\n\n if (input) {\n createInput.mutual = input.hasOwnProperty('mutual') ? input.mutual : false;\n createInput.name = input.hasOwnProperty('name') ? input.name : createInput.name;\n } else {\n createInput.mutual = false;\n }\n\n if (input.hasOwnProperty('reuseURL')) {\n createInput.resource = input.reuseURL;\n }\n\n if (identity) {\n createInput.identity = identity;\n } //Object.assign(createInput, {resume: false});\n //debugger;\n // console.log('[syncher - create] - create Reporter - createInput: ', createInput);\n\n\n return _this._create(createInput);\n }\n /**\n * Request a DataObjectReporter creation. The URL will be be requested by the allocation mechanism.\n * @param {Object} criteria - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\n * @return {Promise[]} Return a promise with a list of DataObjectReporter to be resumed;\n */\n\n }, {\n key: \"resumeReporters\",\n value: function resumeReporters(criteria) {\n var _this = this;\n\n Syncher_log.log('[syncher - create] - resume Reporter - criteria: ', criteria);\n Object.assign(criteria, {\n resume: true\n });\n return _this._resumeCreate(criteria);\n }\n /**\n * Request a subscription to an existent reporter object.\n * @param {SchemaURL} schema - Hyperty Catalogue URL address that can be used to retrieve the JSON-Schema describing the Data Object schema\n * @param {ObjectURL} objURL - Address of the existent reporter object to be observed\n * @param {Boolean} [store=false] - Save the subscription on the Syncher Manager for further resume (Default is false)\n * @param {Boolean} [p2p=false] - Info about if should use p2p connection (Default is false)\n * @param {Boolean} [mutual=true] - Info about if messages of this object should be encrypted (Default is true)\n * @param {MessageBodyIdentity} identity - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\n * @return {Promise} Return Promise to a new observer. It's associated with the reporter.\n */\n\n }, {\n key: \"subscribe\",\n value: function subscribe(input) {\n /* let _this = this;\n let criteria = {};\n criteria.p2p = p2p;\n criteria.store = store;\n criteria.schema = schema;\n criteria.domain_subscription = domain_subscription;\n criteria.resource = objURL;\n if (identity) { criteria.identity = identity; }\n //TODO: For Further Study\n criteria.mutual = mutual;\n log.log('[syncher - subscribe] - subscribe criteria: ', criteria);\n Object.assign(criteria, {resume: false});*/\n return this._subscribe(input);\n }\n /**\n * Request a subscription to an existent reporter object.\n * @param {criteria} criteria - Information to discovery the observer object\n * @return {Promise} Return Promise to a new observer. It's associated with the reporter.\n */\n\n }, {\n key: \"resumeObservers\",\n value: function resumeObservers(criteria) {\n var _this = this;\n\n var _criteria = criteria || {};\n\n Object.assign(_criteria, {\n resume: true\n });\n return _this._resumeSubscribe(_criteria);\n }\n /**\n * Request a read action on the reporter object\n * @param {ObjectURL} objURL - URL of the reporter object to be read\n * @return {Promise} Return Promise to last available data of the reporter\n */\n\n }, {\n key: \"read\",\n value: function read(objURL, criteria) {\n var _this = this;\n\n console.log('[Syncher.read] ', objURL);\n return new Promise(function (resolve, reject) {\n // in case the object is synched in a remote storage, lets sync with it\n\n /* if (_this._observers[objURL] && _this._observers[objURL].metadata.hasOwnProperty('backup') && _this._observers[objURL].metadata.backup) {\n \n let readMsg = {\n type: 'read', from: _this._owner, to: _this._subURL, \n body: { resource: objURL}\n };\n \n if (criteria) readMsg.body.criteria = criteria;\n \n let callback = (reply) => {\n return _this._readCallBack(reply, resolve, reject);\n };\n \n _this._bus.postMessage(readMsg, callback, false);\n \n } else {*/\n _this._readReporter(objURL).then(function (result) {\n resolve(result);\n }); // }\n\n });\n }\n }, {\n key: \"_readCallBack\",\n value: function _readCallBack(reply, resolve, reject) {\n var _this = this;\n\n console.log('[Syncher.read] reply: ', reply);\n var childrens = {};\n var value = {};\n var n = 0;\n\n if (reply.body.code < 300) {\n if (!reply.body.value.hasOwnProperty('responses')) {\n _this._bus.removeResponseListener(reply.from, reply.id);\n\n resolve(reply.body.value);\n } else {\n //data object is sent in separated messages\n if (n === 0) {\n //initial response without childrens\n value = reply.body.value;\n ++n;\n } else {\n // received response contains childrens\n delete reply.body.value.responses;\n var children;\n\n for (children in reply.body.value) {\n if (!childrens.hasOwnProperty(children)) childrens[children] = {};\n Object.assign(childrens[children], reply.body.value[children]);\n }\n\n ++n;\n\n if (n === value.responses) {\n value.childrenObjects = childrens;\n delete value.responses;\n\n _this._bus.removeResponseListener(reply.from, reply.id);\n\n resolve(value);\n }\n }\n }\n } else {\n reject(reply.body.desc);\n }\n }\n }, {\n key: \"_readReporter\",\n value: function _readReporter(objURL) {\n var _this = this; //FLOW-OUT: this message will be sent directly to reporter object (maybe there is no listener available, so it will be resolved with MessageBus -> resolve)\n //will reach the remote object in DataObjectReporter -> _onRead\n\n\n var readMsg = {\n type: 'read',\n from: _this._owner,\n to: objURL\n };\n return new Promise(function (resolve, reject) {\n _this._bus.postMessage(readMsg, function (reply) {\n return _this._readCallBack(reply, resolve, reject);\n }, false);\n });\n }\n /**\n * Setup the callback to process create and delete events of remove Reporter objects.\n * This is releated to the messagens sent by create to the observers Hyperty array.\n * @param {function(event: MsgEvent)} callback\n */\n\n }, {\n key: \"onNotification\",\n value: function onNotification(callback) {\n this._onNotificationHandler = callback;\n }\n /**\n * Setup the callback to process close events from the runtime.\n * @param {function(event: MsgEvent)} callback\n */\n\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n this._onClose = callback;\n }\n }, {\n key: \"_create\",\n value: function _create(input) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var reporterInput = Object.assign({}, input);\n var resume = input.resume;\n reporterInput.created = new Date().toISOString();\n reporterInput.runtime = _this._runtimeUrl;\n var requestValue = deepClone(reporterInput);\n delete requestValue.p2p;\n delete requestValue.store;\n delete requestValue.observers;\n delete requestValue.identity; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onCreate\n //debugger;\n\n var requestMsg = {\n type: 'create',\n from: _this._owner,\n to: _this._subURL,\n body: {\n resume: resume,\n value: requestValue\n }\n };\n requestMsg.body.schema = reporterInput.schema;\n if (reporterInput.p2p) requestMsg.body.p2p = reporterInput.p2p;\n if (reporterInput.store) requestMsg.body.store = reporterInput.store;\n if (reporterInput.identity) requestMsg.body.identity = reporterInput.identity;\n console.log('[syncher._create]: ', reporterInput, requestMsg); //request create to the allocation system. Can be rejected by the PolicyEngine.\n\n _this._bus.postMessage(requestMsg, function (reply) {\n Syncher_log.log('[syncher - create] - create-response: ', reply);\n\n if (reply.body.code === 200) {\n //reporter creation accepted\n reporterInput.url = reply.body.resource;\n /* if (reply.body.p2pHandler) reporterInput.p2pHandler = reply.body.p2pHandler;\n if (reply.body.p2pRequester) reporterInput.p2pRequester = reply.body.p2pRequester;*/\n\n reporterInput.status = 'live'; // pch: do we ned this?\n\n reporterInput.syncher = _this;\n reporterInput.childrens = reply.body.childrenResources;\n var newObj = _this._reporters[reporterInput.url];\n\n if (!newObj) {\n newObj = new syncher_DataObjectReporter(reporterInput);\n _this._reporters[reporterInput.url] = newObj;\n }\n\n newObj.inviteObservers(input.authorise, input.p2p);\n resolve(newObj);\n } else {\n //reporter creation rejected\n reject(reply.body.desc);\n }\n });\n });\n }\n }, {\n key: \"_resumeCreate\",\n value: function _resumeCreate(criteria) {\n var _this2 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var resume = criteria.resume; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onCreate\n\n var requestMsg = {\n type: 'create',\n from: _this._owner,\n to: _this._subURL,\n body: {\n resume: resume\n }\n };\n Syncher_log.log('[syncher - create]: ', criteria, requestMsg);\n\n if (criteria) {\n requestMsg.body.value = criteria;\n\n if (criteria.hasOwnProperty('reporter')) {\n requestMsg.body.value.reporter = criteria.reporter;\n } else {\n requestMsg.body.value.reporter = _this._owner;\n }\n }\n\n if (criteria.p2p) requestMsg.body.p2p = criteria.p2p;\n if (criteria.store) requestMsg.body.store = criteria.store;\n if (criteria.observers) requestMsg.body.authorise = criteria.observers;\n if (criteria.identity) requestMsg.body.identity = criteria.identity;\n Syncher_log.log('[syncher._resumeCreate] - resume message: ', requestMsg); //debugger;\n //request create to the allocation system. Can be rejected by the PolicyEngine.\n\n _this._bus.postMessage(requestMsg, function (reply) {\n Syncher_log.log('[syncher._resumeCreate] - create-resumed-response: ', reply);\n\n if (reply.body.code === 200) {\n //debugger;\n var listOfReporters = reply.body.value;\n\n for (var index in listOfReporters) {\n var dataObject = listOfReporters[index]; //reporter creation accepted\n\n dataObject.data = deepClone(dataObject.data) || {};\n\n if (dataObject.childrenObjects) {\n dataObject.childrenObjects = deepClone(dataObject.childrenObjects);\n }\n\n dataObject.mutual = false;\n dataObject.resume = true;\n dataObject.status = 'live'; // pch: do we ned this?\n\n dataObject.syncher = _this;\n Syncher_log.log('[syncher._resumeCreate] - create-resumed-dataObjectReporter', dataObject);\n var newObj = new syncher_DataObjectReporter(dataObject);\n\n if (dataObject.childrenObjects) {\n newObj.resumeChildrens(dataObject.childrenObjects);\n }\n\n _this._reporters[dataObject.url] = newObj;\n }\n\n resolve(_this._reporters);\n if (_this2._onReportersResume) _this2._onReportersResume(_this2._reporters);\n } else if (reply.body.code === 404) {\n resolve({});\n } else {\n //reporter creation rejected\n reject(reply.body.desc);\n }\n });\n });\n }\n }, {\n key: \"_subscribe\",\n value: function _subscribe(input) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onLocalSubscribe\n var subscribeMsg = {\n type: 'subscribe',\n from: _this._owner,\n to: _this._subURL,\n body: input\n }; // Hyperty request to be an Observer\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#hyperty-request-to-be-an-observer\n // Resume Subscriptions for the same Hyperty URL\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-the-same-hyperty-url\n // Resume Subscriptions for a certain user and data schema independently of the Hyperty URL.\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-a-certain-user-and-data-schema-independently-of-the-hyperty-url\n\n /* if (input) {\n if (input.hasOwnProperty('p2p')) subscribeMsg.body.p2p = input.p2p;\n if (input.hasOwnProperty('store')) subscribeMsg.body.store = input.store;\n if (input.hasOwnProperty('schema')) subscribeMsg.body.schema = input.schema;\n if (input.hasOwnProperty('identity')) subscribeMsg.body.identity = input.identity;\n if (input.hasOwnProperty('resource')) subscribeMsg.body.resource = input.resource;\n if (input.hasOwnProperty('domain_subscription')) subscribeMsg.body.domain_subscription = input.domain_subscription;\n }\n \n \n subscribeMsg.body.resume = input.resume;\n \n //TODO: For Further Study\n if (input.hasOwnProperty('mutual')) subscribeMsg.body.mutual = input.mutual;*/\n\n Syncher_log.log('[syncher_subscribe] - subscribe message: ', input, subscribeMsg); //request subscription\n //Provisional data is applied to the DataObjectObserver after confirmation. Or discarded if there is no confirmation.\n //for more info see the DataProvisional class documentation.\n\n _this._bus.postMessage(subscribeMsg, function (reply) {\n Syncher_log.log('[syncher] - subscribe-response: ', reply);\n var objURL = reply.body.resource;\n var newProvisional = _this._provisionals[objURL];\n delete _this._provisionals[objURL];\n if (newProvisional) newProvisional._releaseListeners();\n\n if (reply.body.code < 200) {\n Syncher_log.log('[syncher] - new DataProvisional: ', reply.body.childrenResources, objURL);\n newProvisional = new syncher_DataProvisional(_this._owner, objURL, _this._bus, reply.body.childrenResources);\n _this._provisionals[objURL] = newProvisional;\n } else if (reply.body.code === 200) {\n Syncher_log.log('[syncher] - new Data Object Observer: ', reply, _this._provisionals);\n var observerInput = reply.body.value;\n observerInput.syncher = _this;\n observerInput.p2p = input.p2p;\n observerInput.store = input.store;\n observerInput.identity = input.identity;\n observerInput.resume = false; // todo: For Further Study\n\n observerInput.mutual = input.mutual; //observerInput.children = newProvisional.children;\n //TODO: mutual For Further Study\n\n var newObj = _this._observers[objURL];\n\n if (!newObj) {\n newObj = new syncher_DataObjectObserver(observerInput);\n _this._observers[objURL] = newObj;\n } else {\n newObj.sync();\n }\n\n Syncher_log.log('[syncher] - new Data Object Observer already exist: ', newObj);\n resolve(newObj);\n\n if (newProvisional) {\n newProvisional.apply(newObj);\n }\n } else {\n reject(reply.body.desc);\n }\n });\n });\n }\n /*\n _processOfflineSubscription(subscription, redirectTo) {\n let _this = this;\n \n let forward = {\n from: subscription.from,\n type: 'forward',\n to: redirectTo,\n body: subscription\n };\n \n console.log('[Syncher._processOfflineSubscription] forwading ', forward);\n \n _this._bus.postMessage(forward);\n \n let result = {\n code: 302,\n desc: \"Found \" + redirectTo\n };\n \n return(result);\n \n }*/\n\n }, {\n key: \"_resumeSubscribe\",\n value: function _resumeSubscribe(criteria) {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onLocalSubscribe\n var subscribeMsg = {\n type: 'subscribe',\n from: _this._owner,\n to: _this._subURL,\n body: {}\n }; // Hyperty request to be an Observer\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#hyperty-request-to-be-an-observer\n // Resume Subscriptions for the same Hyperty URL\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-the-same-hyperty-url\n // Resume Subscriptions for a certain user and data schema independently of the Hyperty URL.\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-a-certain-user-and-data-schema-independently-of-the-hyperty-url\n\n if (criteria) {\n if (criteria.hasOwnProperty('p2p')) subscribeMsg.body.p2p = criteria.p2p;\n if (criteria.hasOwnProperty('store')) subscribeMsg.body.store = criteria.store;\n if (criteria.hasOwnProperty('schema')) subscribeMsg.body.schema = criteria.schema;\n if (criteria.hasOwnProperty('identity')) subscribeMsg.body.identity = criteria.identity;\n if (criteria.hasOwnProperty('resource')) subscribeMsg.body.resource = criteria.resource;\n }\n\n subscribeMsg.body.resume = criteria.resume; //TODO: For Further Study\n\n var mutual = criteria.mutual;\n if (criteria.hasOwnProperty('mutual')) subscribeMsg.body.mutual = mutual;\n console.log('[syncher] - subscribe message: ', criteria, subscribeMsg); //request subscription\n //Provisional data is applied to the DataObjectObserver after confirmation. Or discarded if there is no confirmation.\n //for more info see the DataProvisional class documentation.\n\n _this._bus.postMessage(subscribeMsg, function (reply) {\n console.log('[syncher] - subscribe-resumed-response: ', reply);\n var objURL = reply.body.resource;\n var newProvisional = _this._provisionals[objURL];\n delete _this._provisionals[objURL];\n if (newProvisional) newProvisional._releaseListeners();\n\n if (reply.body.code < 200) {\n // todo: check if this is needed for the resume\n Syncher_log.log('[syncher] - resume new DataProvisional: ', reply, objURL);\n newProvisional = new syncher_DataProvisional(_this._owner, objURL, _this._bus, reply.body.childrenResources);\n _this._provisionals[objURL] = newProvisional;\n } else if (reply.body.code === 200) {\n var listOfObservers = reply.body.value;\n\n for (var index in listOfObservers) {\n var dataObject = listOfObservers[index];\n console.log('[syncher] - Resume Object Observer: ', reply, dataObject, _this._provisionals);\n\n if (dataObject.childrenObjects) {\n dataObject.childrenObjects = deepClone(dataObject.childrenObjects);\n }\n\n dataObject.data = deepClone(dataObject.data) || {};\n dataObject.resume = true;\n dataObject.syncher = _this; //TODO: mutual For Further Study\n\n console.log('[syncher._resumeSubscribe] - create new dataObject: ', dataObject);\n var newObj = new syncher_DataObjectObserver(dataObject);\n\n if (dataObject.childrenObjects) {\n newObj.resumeChildrens(dataObject.childrenObjects);\n }\n\n Syncher_log.log('[syncher._resumeSubscribe] - new dataObject', newObj);\n _this._observers[newObj.url] = newObj;\n\n if (_this._provisionals[newObj.url]) {\n _this._provisionals[newObj.url].apply(newObj);\n } //lets sync with Reporter\n // it was commented to let hyperties decide when to sync\n //newObj.sync();\n\n }\n\n resolve(_this._observers);\n if (_this3._onObserversResume) _this3._onObserversResume(_this._observers);\n } else if (reply.body.code === 404) {\n resolve({});\n } else {\n reject(reply.body.desc);\n }\n });\n });\n } //FLOW-IN: message received from a local runtime ReporterObject -> _onRemoteSubscribe\n\n }, {\n key: \"_onForward\",\n value: function _onForward(msg) {\n var _this = this;\n\n var reporter = _this._reporters[msg.body.to];\n\n reporter._onForward(msg);\n } //FLOW-IN: message received from a remote Syncher -> create (this is actually an invitation to subscribe)\n\n }, {\n key: \"_onRemoteCreate\",\n value: function _onRemoteCreate(msg) {\n var _this = this;\n\n var resource = msg.from.slice(0, -13); //remove \"/subscription\" from the URL\n\n var dividedURL = divideURL(resource);\n var domain = dividedURL.domain;\n var event = {\n type: msg.type,\n from: msg.body.source,\n url: resource,\n domain: domain,\n schema: msg.body.schema,\n value: msg.body.value,\n identity: msg.body.identity,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType\n }\n });\n }\n };\n\n if (_this._onNotificationHandler) {\n Syncher_log.info('[Syncher] NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler(event);\n }\n } //FLOW-IN: message received from a remote DataObjectReporter -> delete\n\n }, {\n key: \"_onRemoteDelete\",\n value: function _onRemoteDelete(msg) {\n var _this = this; //remove \"/subscription\" from the URL\n\n\n var resource = msg.body.resource;\n var object = _this._observers[resource];\n var unsubscribe = {\n from: _this.owner,\n to: _this._subURL,\n id: msg.id,\n type: 'unsubscribe',\n body: {\n resource: msg.body.resource\n }\n };\n\n _this._bus.postMessage(unsubscribe);\n\n delete _this._observers[resource];\n\n if (object) {\n var event = {\n type: msg.type,\n url: resource,\n identity: msg.body.identity,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //TODO: any other different options for the release process, like accept but nor release local?\n\n\n if (lType === 200) {\n object.delete();\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType,\n source: _this._owner\n }\n });\n }\n };\n\n if (_this._onNotificationHandler) {\n Syncher_log.log('NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler(event);\n }\n } else {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 404,\n source: _this._owner\n }\n });\n }\n } // close event received from runtime registry\n\n }, {\n key: \"_onExecute\",\n value: function _onExecute(msg) {\n var _this = this;\n\n var reply = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n };\n\n if ((msg.from === _this._runtimeUrl + '/registry/' || msg.from === _this._runtimeUrl + '/registry') && msg.body && msg.body.method && msg.body.method === 'close' && _this._onClose) {\n var event = {\n type: 'close',\n ack: function ack(type) {\n if (type) {\n reply.body.code = type;\n } //send ack response message\n\n\n _this._bus.postMessage(reply);\n }\n };\n Syncher_log.info('[Syncher] Close-EVENT: ', event);\n\n _this._onClose(event);\n } else {\n _this._bus.postMessage(reply);\n }\n }\n /**\n * Callback system to trigger the resumed reporters\n * @param {Function} callback - function callback which will be invoked\n * @return {Object} Return one object with all resumed reporters;\n */\n\n }, {\n key: \"onReportersResume\",\n value: function onReportersResume(callback) {\n this._onReportersResume = callback;\n }\n /**\n * Callback system to trigger the resumed observers\n * @param {Function} callback - function callback which will be invoked\n * @return {Object} Return one object with all resumed observers;\n */\n\n }, {\n key: \"onObserversResume\",\n value: function onObserversResume(callback) {\n this._onObserversResume = callback;\n }\n }, {\n key: \"owner\",\n get: function get() {\n return this._owner;\n }\n /**\n * All owned reporters, the ones that were created by a create\n * @type {Object}\n */\n\n }, {\n key: \"reporters\",\n get: function get() {\n return this._reporters;\n }\n /**\n * All owned observers, the ones that were created by a local subscription\n * @type {Object}\n */\n\n }, {\n key: \"observers\",\n get: function get() {\n return this._observers;\n }\n }]);\n\n return Syncher;\n}();\n\n/* harmony default export */ var syncher_Syncher = (Syncher_Syncher);\n// CONCATENATED MODULE: ./src/syncher/NotificationHandler.js\nfunction NotificationHandler_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction NotificationHandler_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction NotificationHandler_createClass(Constructor, protoProps, staticProps) { if (protoProps) NotificationHandler_defineProperties(Constructor.prototype, protoProps); if (staticProps) NotificationHandler_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* The Notitification Handler is used to handle notifications not processed by the syncher when running in a sandbox.\n*/\n\n\nvar NotificationHandler_NotificationHandler =\n/*#__PURE__*/\nfunction () {\n function NotificationHandler(bus) {\n NotificationHandler_classCallCheck(this, NotificationHandler);\n\n if (!bus) throw Error('[NotificationHandler Constructor] bus input is mandatory');\n this._bus = bus;\n this._onNotificationHandler = {};\n }\n\n NotificationHandler_createClass(NotificationHandler, [{\n key: \"onNotification\",\n value: function onNotification(scheme, callback) {\n this._onNotificationHandler[scheme] = callback;\n }\n }, {\n key: \"onCreate\",\n value: function onCreate(msg) {\n var _this = this; // let resource = msg.from.slice(0, -13); //remove \"/subscription\" from the URL\n\n\n var resource = msg.body.hasOwnProperty('resource') ? msg.body.resource : msg.from.slice(0, -13);\n var dividedURL = divideURL(resource);\n var domain = dividedURL.domain;\n var scheme = resource.split('://')[0];\n\n var _error = function error(reason) {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 400,\n desc: 'Bad Request: ' + reason\n }\n });\n };\n\n if (!msg.body.hasOwnProperty('source')) {\n _error('Missing source');\n }\n\n if (!msg.body.hasOwnProperty('schema')) {\n _error('Missing schema');\n }\n\n if (!msg.body.hasOwnProperty('value')) {\n _error('Missing value');\n }\n\n if (!msg.body.hasOwnProperty('identity')) {\n _error('Missing identity');\n }\n\n var event = {\n type: msg.type,\n from: msg.body.source,\n url: resource,\n domain: domain,\n schema: msg.body.schema,\n value: msg.body.value,\n identity: msg.body.identity,\n to: msg.to,\n via: msg.body.via,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType\n }\n });\n },\n error: function error(reason) {\n _error(reason);\n }\n };\n\n if (_this._onNotificationHandler[scheme]) {\n console.info('[NotificationHandler] NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler[scheme](event);\n }\n }\n }, {\n key: \"onDelete\",\n value: function onDelete(msg) {\n var _this = this; //remove \"/subscription\" from the URL\n\n\n var resource = msg.body.resource;\n var object = _this._observers[resource];\n var unsubscribe = {\n from: _this.owner,\n to: _this._subURL,\n id: msg.id,\n type: 'unsubscribe',\n body: {\n resource: msg.body.resource\n }\n };\n\n _this._bus.postMessage(unsubscribe);\n\n delete _this._observers[resource];\n\n if (object) {\n var event = {\n type: msg.type,\n url: resource,\n identity: msg.body.identity,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //TODO: any other different options for the release process, like accept but nor release local?\n\n\n if (lType === 200) {\n object.delete();\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType,\n source: _this._owner\n }\n });\n }\n };\n\n if (_this._onNotificationHandler) {\n log.log('NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler(event);\n }\n } else {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 404,\n source: _this._owner\n }\n });\n }\n }\n }]);\n\n return NotificationHandler;\n}();\n\n/* harmony default export */ var syncher_NotificationHandler = (NotificationHandler_NotificationHandler);\n// CONCATENATED MODULE: ./src/identity/IdentityManager.js\nfunction IdentityManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction IdentityManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction IdentityManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) IdentityManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) IdentityManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* Core IdentityManager interface\n* Class to allow applications to search for Identities registered in runtime-core\n*/\n\nvar IdentityManager_IdentityManager =\n/*#__PURE__*/\nfunction () {\n /**\n * To initialise the IdentityManager, which will provide the support for hyperties to\n * query about identities registered\n * @param {String} owner owner\n * @param {String} runtimeURL runtimeURL\n * @param {MessageBus} msgbus msgbus\n */\n function IdentityManager(owner, runtimeURL, msgBus) {\n IdentityManager_classCallCheck(this, IdentityManager);\n\n var _this = this;\n\n _this.messageBus = msgBus;\n _this.domain = divideURL(owner).domain;\n _this.owner = owner;\n _this.runtimeURL = runtimeURL;\n }\n /**\n * Function to query the runtime registry about the identity to which the hyperty was associated\n * @param {String} type (Optional) type of user info required\n * @param {String} owner (Optional) owner to search for\n * @return {Promise} userURL userURL associated to the hyperty\n */\n\n\n IdentityManager_createClass(IdentityManager, [{\n key: \"discoverUserRegistered\",\n value: function discoverUserRegistered(type, hyperty) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var activeHypertyURL; // if any type of search is selected query for that type, otherwise query for default user info\n\n var searchType = type ? type : '.';\n\n if (!hyperty) {\n activeHypertyURL = _this.owner;\n } else {\n activeHypertyURL = hyperty;\n }\n\n var msg = {\n type: 'read',\n from: activeHypertyURL,\n to: _this.runtimeURL + '/registry/',\n body: {\n resource: searchType,\n criteria: activeHypertyURL\n }\n };\n\n _this.messageBus.postMessage(msg, function (reply) {\n var userURL = reply.body.resource;\n\n if (userURL && reply.body.code === 200) {\n resolve(userURL);\n } else {\n reject('code: ' + reply.body.code + ' No user was found');\n }\n });\n });\n }\n /**\n * Function to query the Identity Module about authenticated identities from a certain domain\n * @param {String} idp idp domain of the identity to be discovered\n * @return {Promise} identity\n */\n\n }, {\n key: \"discoverIdentityPerIdP\",\n value: function discoverIdentityPerIdP(idp) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var msg = {\n type: 'read',\n from: this.owner,\n to: _this.runtimeURL + '/idm',\n body: {\n resource: idp,\n criteria: 'idp'\n }\n };\n\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n resolve(reply.body.value);\n } else {\n reject(reply.body.code + ' ' + reply.body.desc);\n }\n });\n });\n }\n }]);\n\n return IdentityManager;\n}();\n\n/* harmony default export */ var identity_IdentityManager = (IdentityManager_IdentityManager);\n// CONCATENATED MODULE: ./src/discovery/RegistrationStatus.js\nfunction RegistrationStatus_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RegistrationStatus_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RegistrationStatus_createClass(Constructor, protoProps, staticProps) { if (protoProps) RegistrationStatus_defineProperties(Constructor.prototype, protoProps); if (staticProps) RegistrationStatus_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar RegistrationStatus_log = loglevel[\"getLogger\"]('RegistrationStatus');\n\n/**\n* The RegistrationStatus lib allows to monitor registration status of an Hyperty or Data Object\n*\n*/\n\nvar RegistrationStatus_RegistrationStatus =\n/*#__PURE__*/\nfunction () {\n /**\n * @param {URL} url URL address of the entity to be monitored\n * @param {URL} runtimeURL the current URL of the Runtime Instance used\n * @param {HypertyURL} owner the URL of the Hyperty instance that is using this lib\n * @param {MiniBus} owner the URL of the Hyperty instance that is using this lib\n *\n */\n function RegistrationStatus(url, runtimeURL, owner, msgBus) {\n RegistrationStatus_classCallCheck(this, RegistrationStatus);\n\n this._registryObjectURL = url;\n this._runtimeURL = runtimeURL;\n this._domain = divideURL(runtimeURL).domain;\n this._discoveredObjectURL = owner;\n this._messageBus = msgBus;\n this._subscriptionSet = false;\n this._subscribers = {\n live: {},\n disconnected: {}\n };\n }\n\n RegistrationStatus_createClass(RegistrationStatus, [{\n key: \"onLive\",\n value: function onLive(subscriber, callback) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (!_this._subscriptionSet) {\n _this._subscribe().then(function () {\n _this._subscribers.live[subscriber] = callback;\n resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n _this._subscribers.live[subscriber] = callback;\n resolve();\n }\n });\n }\n }, {\n key: \"onDisconnected\",\n value: function onDisconnected(subscriber, callback) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n if (!_this2._subscriptionSet) {\n _this2._subscribe().then(function () {\n _this2._subscribers.disconnected[subscriber] = callback;\n resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n _this2._subscribers.disconnected[subscriber] = callback;\n resolve();\n }\n });\n }\n }, {\n key: \"_subscribe\",\n value: function _subscribe() {\n var _this3 = this;\n\n var msg = {\n type: 'subscribe',\n from: this._discoveredObjectURL,\n to: this._runtimeURL + '/subscriptions',\n body: {\n resources: [this._registryObjectURL + '/registration']\n }\n };\n return new Promise(function (resolve, reject) {\n _this3._messageBus.postMessage(msg, function (reply) {\n RegistrationStatus_log.log(\"[DiscoveredObject.subscribe] \".concat(_this3._registryObjectURL, \" rcved reply \"), reply);\n\n if (reply.body.code === 200) {\n _this3._generateListener(_this3._registryObjectURL + '/registration');\n\n _this3._subscriptionSet = true;\n resolve();\n } else {\n RegistrationStatus_log.error('Error subscribing ', _this3._registryObjectURL);\n reject('Error subscribing ' + _this3._registryObjectURL);\n }\n });\n });\n }\n }, {\n key: \"_generateListener\",\n value: function _generateListener(notificationURL) {\n var _this4 = this;\n\n this._messageBus.addListener(notificationURL, function (msg) {\n RegistrationStatus_log.log(\"[DiscoveredObject.notification] \".concat(_this4._registryObjectURL, \": \"), msg);\n\n _this4._processNotification(msg);\n });\n }\n }, {\n key: \"_processNotification\",\n value: function _processNotification(msg) {\n var _this5 = this;\n\n var status = msg.body.value;\n setTimeout(function () {\n // Hack to give time for onLive Hyperties to get ready. To be removed when Hyperty State machaine is implemented\n Object.keys(_this5._subscribers[status]).forEach(function (subscriber) {\n return _this5._subscribers[status][subscriber]();\n });\n }, 5000);\n }\n }, {\n key: \"_unsubscribe\",\n value: function _unsubscribe() {\n var _this6 = this;\n\n var msg = {\n type: 'unsubscribe',\n from: this._discoveredObjectURL,\n to: this._runtimeURL + '/subscriptions',\n body: {\n resource: this._registryObjectURL + '/registration'\n }\n };\n return new Promise(function (resolve, reject) {\n _this6._messageBus.postMessage(msg, function (reply) {\n RegistrationStatus_log.log(\"[DiscoveredObject.unsubscribe] \".concat(_this6._registryObjectURL, \" rcved reply \"), reply);\n\n if (reply.body.code === 200) {\n resolve();\n } else {\n RegistrationStatus_log.error('Error unsubscribing ', _this6._registryObjectURL);\n reject('Error unsubscribing ' + _this6._registryObjectURL);\n }\n });\n });\n }\n }, {\n key: \"unsubscribeLive\",\n value: function unsubscribeLive(subscriber) {\n var _this7 = this;\n\n return new Promise(function (resolve, reject) {\n if (subscriber in _this7._subscribers.live) {\n //TODO: unsubscribe outside this condition\n delete _this7._subscribers.live[subscriber];\n }\n\n if (_this7._areSubscriptionsEmpty()) {\n _this7._unsubscribe().then(function () {\n return resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n resolve();\n }\n /* } else {\n reject(`${subscriber} doesn't subscribe onLive for ${this._registryObjectURL}`);\n }*/\n\n });\n }\n }, {\n key: \"unsubscribeDisconnected\",\n value: function unsubscribeDisconnected(subscriber) {\n var _this8 = this;\n\n return new Promise(function (resolve, reject) {\n if (subscriber in _this8._subscribers.disconnected) {\n delete _this8._subscribers.disconnected[subscriber];\n\n if (_this8._areSubscriptionsEmpty()) {\n _this8._unsubscribe().then(function () {\n return resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n resolve();\n }\n } else {\n reject(\"\".concat(subscriber, \" doesn't subscribe onDisconnected for \").concat(_this8._registryObjectURL));\n }\n });\n }\n }, {\n key: \"_areSubscriptionsEmpty\",\n value: function _areSubscriptionsEmpty() {\n return Object.keys(this._subscribers.live).length === 0 && Object.keys(this._subscribers.disconnected).length === 0;\n }\n }]);\n\n return RegistrationStatus;\n}();\n\n/* harmony default export */ var discovery_RegistrationStatus = (RegistrationStatus_RegistrationStatus);\n// CONCATENATED MODULE: ./src/discovery/DiscoveredObject.js\nfunction DiscoveredObject_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DiscoveredObject_typeof = function _typeof(obj) { return typeof obj; }; } else { DiscoveredObject_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DiscoveredObject_typeof(obj); }\n\nfunction DiscoveredObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DiscoveredObject_possibleConstructorReturn(self, call) { if (call && (DiscoveredObject_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return DiscoveredObject_assertThisInitialized(self); }\n\nfunction DiscoveredObject_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction DiscoveredObject_getPrototypeOf(o) { DiscoveredObject_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DiscoveredObject_getPrototypeOf(o); }\n\nfunction DiscoveredObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DiscoveredObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) DiscoveredObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) DiscoveredObject_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction DiscoveredObject_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DiscoveredObject_setPrototypeOf(subClass, superClass); }\n\nfunction DiscoveredObject_setPrototypeOf(o, p) { DiscoveredObject_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DiscoveredObject_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n//import {divideURL, convertToUserURL} from '../utils/utils';\n\n/**\n* Discovered Object interface\n*/\n\nvar DiscoveredObject =\n/*#__PURE__*/\nfunction (_RegistrationStatus) {\n DiscoveredObject_inherits(DiscoveredObject, _RegistrationStatus);\n\n DiscoveredObject_createClass(DiscoveredObject, [{\n key: \"data\",\n get: function get() {\n return this._data;\n }\n }]);\n\n function DiscoveredObject(data, runtimeURL, discoveryURL, msgBus, discovery) {\n var _this2;\n\n DiscoveredObject_classCallCheck(this, DiscoveredObject);\n\n _this2 = DiscoveredObject_possibleConstructorReturn(this, DiscoveredObject_getPrototypeOf(DiscoveredObject).call(this, data.hypertyID || data.url, runtimeURL, discoveryURL, msgBus));\n _this2._data = data;\n _this2._discovery = discovery;\n return _this2;\n }\n /**\n * function to check the status of the DiscoveredObject.\n * Depending on existing subscribers it may trigger onLive or onDisconnected events.\n *\n */\n\n\n DiscoveredObject_createClass(DiscoveredObject, [{\n key: \"check\",\n value: function check() {\n // query DR for the status and call processNotification with msg received\n var _this = this;\n\n var message = {\n body: {}\n };\n\n if (_this._discoveredObjectURL.startsWith('hyperty://')) {\n _this._discovery.discoverHypertyPerURL(_this._discoveredObjectURL).then(function (registration) {\n message.body.status = registration.status;\n\n _this._processNotification(message);\n });\n } else {\n _this._discovery.discoverDataObjectsPerURL(_this._discoveredObjectURL).then(function (registration) {\n message.body.status = registration.status;\n\n _this._processNotification(message);\n });\n }\n }\n }]);\n\n return DiscoveredObject;\n}(discovery_RegistrationStatus);\n\n/* harmony default export */ var discovery_DiscoveredObject = (DiscoveredObject);\n// CONCATENATED MODULE: ./src/discovery/Discovery.js\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction Discovery_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Discovery_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Discovery_createClass(Constructor, protoProps, staticProps) { if (protoProps) Discovery_defineProperties(Constructor.prototype, protoProps); if (staticProps) Discovery_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar Discovery_log = loglevel[\"getLogger\"]('Discovery');\n\n\n/**\n* Core Discovery interface\n* Class to allow applications to search for hyperties and DataObjects using the message bus\n*/\n\nvar Discovery_Discovery =\n/*#__PURE__*/\nfunction () {\n /**\n * To initialise the HypertyDiscover, which will provide the support for hyperties to\n * query users registered in outside the internal core.\n * @param {MessageBus} msgbus msgbus\n * @param {RuntimeURL} runtimeURL runtimeURL\n */\n function Discovery(hypertyURL, runtimeURL, msgBus) {\n Discovery_classCallCheck(this, Discovery);\n\n var _this = this;\n\n _this.messageBus = msgBus;\n _this.runtimeURL = runtimeURL;\n _this.domain = divideURL(hypertyURL).domain;\n _this.discoveryURL = hypertyURL;\n }\n /**\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\n * @param {String} userIdentifier\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n */\n\n\n Discovery_createClass(Discovery, [{\n key: \"_isLegacyUser\",\n value: function _isLegacyUser(userIdentifier) {\n if (userIdentifier.includes(':') && !userIdentifier.includes('user://')) {\n return true;\n } else {\n return false;\n }\n }\n /**\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\n * @param {String} userIdentifier\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n */\n\n }, {\n key: \"discoverHypertiesPerUserProfileData\",\n value: function discoverHypertiesPerUserProfileData(userIdentifier, schema, resources) {\n var _this = this;\n\n var filteredHyperties = [];\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/userprofile/' + userIdentifier\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n if (!_this._isLegacyUser(userIdentifier)) {\n // todo: to reomve when discovery of legcay users are supported\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n reply.body.value.map(function (hyperty) {\n if (hyperty.hypertyID != _this.discoveryURL) filteredHyperties.push(hyperty);\n });\n if (filteredHyperties.length === 0) resolve([]);else {\n Discovery_log.log(\"[Discovery.discoverHypertiesPerUserProfileData] Reply log: \", filteredHyperties);\n resolve(filteredHyperties);\n }\n } else {\n Discovery_log.warn(\"[Discovery.discoverHypertiesPerUserProfileData] Error Reply for \" + userIdentifier + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n } else {\n resolve([{\n hypertyID: userIdentifier,\n status: 'live'\n }]);\n }\n });\n }\n /**\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\n * returns DiscoveredObject\n * @param {String} userIdentifier\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n */\n\n }, {\n key: \"discoverHypertiesPerUserProfileDataDO\",\n value: function discoverHypertiesPerUserProfileDataDO(userIdentifier, schema, resources) {\n var _this2 = this,\n _arguments = arguments;\n\n return new Promise(function (resolve, reject) {\n _this2.discoverHypertiesPerUserProfileData.apply(_this2, _toConsumableArray(_arguments)).then(function (hyperties) {\n resolve(_this2._convertToDiscoveredObject(hyperties));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\n * Advanced Search for DataObjects registered in domain registry associated with some user identifier (eg email, name ...)\n * @param {String} userIdentifier\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n */\n\n }, {\n key: \"discoverDataObjectsPerUserProfileData\",\n value: function discoverDataObjectsPerUserProfileData(userIdentifier, schema, resources) {\n var _this = this;\n\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/userprofile/' + userIdentifier\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n if (!_this._isLegacyUser(userIdentifier)) {\n // todo: to reomve when discovery of legcay users are supported\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjectsPerUserProfileData] Error Reply for \" + userIdentifier + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n } else {\n resolve([{\n hypertyID: userIdentifier,\n status: 'live'\n }]);\n }\n });\n }\n /**\n * function to request about dataObject registered in domain registry, and\n * returns discoveredObject.\n * @param {String} guidURL guid URL e.g user-guid://\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverDataObjectsPerUserProfileDataDO\",\n value: function discoverDataObjectsPerUserProfileDataDO(guidURL, schema, resources) {\n var _this3 = this,\n _arguments2 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this3.discoverDataObjectsPerUserProfileData.apply(_this3, _toConsumableArray(_arguments2)).then(function (registryObjects) {\n return resolve(_this3._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\n * Advanced Search for Hyperties registered in domain registry associated with some GUID\n * @param {String} guidURL guid URL e.g user-guid://\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n */\n\n }, {\n key: \"discoverHypertiesPerGUID\",\n value: function discoverHypertiesPerGUID(guidURL, schema, resources) {\n var _this = this;\n\n var filteredHyperties = [];\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/guid/' + guidURL\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n reply.body.value.map(function (hyperty) {\n if (hyperty.hypertyID != _this.discoveryURL) filteredHyperties.push(hyperty);\n });\n if (filteredHyperties.length === 0) reject('No Hyperty was found');else {\n Discovery_log.log(\"Reply log: \", filteredHyperties);\n resolve(filteredHyperties);\n }\n } else {\n Discovery_log.warn(\"[Discovery.discoverHypertiesPerGUID] Error Reply for \" + guidURL + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\n * Advanced Search for Hyperties registered in domain registry associated with some GUID\n * returns DiscoveredObject\n * @param {String} guidURL guid URL e.g user-guid://\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n */\n\n }, {\n key: \"discoverHypertiesPerGUIDDO\",\n value: function discoverHypertiesPerGUIDDO(guidURL, schema, resources) {\n var _this4 = this,\n _arguments3 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this4.discoverHypertiesPerGUID.apply(_this4, _toConsumableArray(_arguments3)).then(function (hyperties) {\n resolve(_this4._convertToDiscoveredObject(hyperties));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\n * Advanced Search for DataObjects registered in domain registry associated with some GUID\n * @param {String} guidURL guid URL e.g user-guid://\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverDataObjectsPerGUID\",\n value: function discoverDataObjectsPerGUID(guidURL, schema, resources) {\n var _this = this;\n\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/guid/' + guidURL\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjectsPerGUID] Error Reply for \" + guidURL + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\n * function to request about dataObject registered in domain registry, and\n * returns discoveredObject.\n * @param {String} guidURL guid URL e.g user-guid://\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverDataObjectsPerGUIDDO\",\n value: function discoverDataObjectsPerGUIDDO(guidURL, schema, resources) {\n var _this5 = this,\n _arguments4 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this5.discoverDataObjectsPerGUID.apply(_this5, _toConsumableArray(_arguments4)).then(function (registryObjects) {\n return resolve(_this5._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /** Advanced Search for Hyperties registered in domain registry\n * @param {String} user user identifier, either in url or email format\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverHyperties\",\n value: function discoverHyperties(user, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n var filteredHyperties = [];\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/user/' + user\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n if (!_this._isLegacyUser(user)) {\n // todo: to reomve when discovery of legcay users are supported\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200 || reply.body.code === 500) {\n reply.body.value.map(function (hyperty) {\n if (hyperty.hypertyID != _this.discoveryURL) filteredHyperties.push(hyperty);\n });\n /* if(filteredHyperties.length === 0)\n reject('No Hyperty was found');\n else {*/\n\n Discovery_log.log(\"[Discovery.discoverHyperties] Reply : \", filteredHyperties);\n resolve(filteredHyperties); // }\n } else {\n Discovery_log.warn(\"[Discovery.discoverHyperties] Error Reply for \" + user + \" Reason: \", reply.body.description);\n resolve(filteredHyperties);\n }\n });\n } else {\n resolve([{\n hypertyID: user,\n status: 'live'\n }]);\n }\n });\n }\n /** Advanced Search for Hyperties registered in domain registry,\n *returns DiscoveredObject\n * @param {String} user user identifier, either in url or email format\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverHypertiesDO\",\n value: function discoverHypertiesDO(user, schema, resources, domain) {\n var _this6 = this,\n _arguments5 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this6.discoverHyperties.apply(_this6, _toConsumableArray(_arguments5)).then(function (hyperties) {\n resolve(_this6._convertToDiscoveredObject(hyperties));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /** Advanced Search for DataObjects registered in domain registry\n * @param {String} user user identifier, either in url or email format\n * @param {Array} schema (Optional) types of dataObjects schemas\n * @param {Array} resources (Optional) types of dataObjects resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverDataObjects\",\n value: function discoverDataObjects(user, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/user/' + user\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjects] Error Reply for \" + user + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\n * function to request about dataObject registered in domain registry, and\n * returns discoveredObject.\n * @param {String} user user identifier, either in url or email format\n * @param {Array} schema (Optional) types of dataObjects schemas\n * @param {Array} resources (Optional) types of dataObjects resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverDataObjectsDO\",\n value: function discoverDataObjectsDO(user, schema, resources, domain) {\n var _this7 = this,\n _arguments6 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this7.discoverDataObjects.apply(_this7, _toConsumableArray(_arguments6)).then(function (registryObjects) {\n return resolve(_this7._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\n * function to request about hyperties registered in domain registry, and\n * return the hyperty information, if found.\n * @param {String} url hyperty URL\n * @param {String} domain (Optional)\n */\n\n }, {\n key: \"discoverHypertyPerURL\",\n value: function discoverHypertyPerURL(url, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/url/' + url,\n criteria: {\n domain: activeDomain\n }\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverHypertyPerURL] Error Reply for \" + url + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\n * function to request about hyperties registered in domain registry, and\n * returns discoveredObject.\n * @param {String} url hyperty URL\n * @param {String} domain (Optional)\n */\n\n }, {\n key: \"discoverHypertyPerURLDO\",\n value: function discoverHypertyPerURLDO(url, domain) {\n var _this8 = this,\n _arguments7 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this8.discoverHypertyPerURL.apply(_this8, _toConsumableArray(_arguments7)).then(function (hyperty) {\n return resolve(new discovery_DiscoveredObject(hyperty, _this8.runtimeURL, _this8.discoveryURL, _this8.messageBus, _this8));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\n * function to request about dataObject registered in domain registry, and\n * return the dataObject information, if found.\n * @param {String} url dataObject URL\n * @param {String} domain (Optional)\n */\n\n }, {\n key: \"discoverDataObjectPerURL\",\n value: function discoverDataObjectPerURL(url, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/url/' + url,\n criteria: {\n domain: activeDomain\n }\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjectPerURL] Error Reply for \" + url + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\n * function to request about dataObject registered in domain registry, and\n * returns discoveredObject.\n * @param {String} url dataObject URL\n * @param {String} domain (Optional)\n */\n\n }, {\n key: \"discoverDataObjectPerURLDO\",\n value: function discoverDataObjectPerURLDO(url, domain) {\n var _this9 = this,\n _arguments8 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this9.discoverDataObjectPerURL.apply(_this9, _toConsumableArray(_arguments8)).then(function (registryObject) {\n return resolve(new discovery_DiscoveredObject(registryObject, _this9.runtimeURL, _this9.discoveryURL, _this9.messageBus, _this9));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\n * function to request about an dataObjects registered in domain registry with a given name, and\n * return the dataObjects information, if found.\n * @param {String} name dataObject URL\n * @param {Array} schema (Optional) types of dataObjects schemas\n * @param {Array} resources (Optional) types of dataObjects resources\n * @param {String} domain (Optional)\n */\n\n }, {\n key: \"discoverDataObjectsPerName\",\n value: function discoverDataObjectsPerName(name, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/name/' + name\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjectsPerName] Error Reply for \" + name + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\n * function to request about dataObject registered in domain registry, and\n * returns discoveredObject.\n * @param {String} name dataObject URL\n * @param {Array} schema (Optional) types of dataObjects schemas\n * @param {Array} resources (Optional) types of dataObjects resources\n * @param {String} domain (Optional)\n */\n\n }, {\n key: \"discoverDataObjectsPerNameDO\",\n value: function discoverDataObjectsPerNameDO(name, schema, resources, domain) {\n var _this10 = this,\n _arguments9 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this10.discoverDataObjectsPerName.apply(_this10, _toConsumableArray(_arguments9)).then(function (registryObjects) {\n return resolve(_this10._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\n * function to request about specific reporter dataObject registered in domain registry, and\n * return the dataObjects from that reporter.\n * @param {String} reporter dataObject reporter\n * @param {Array} schema (Optional) types of dataObjects schemas\n * @param {Array} resources (Optional) types of dataObjects resources\n * @param {String} domain (Optional)\n */\n\n }, {\n key: \"discoverDataObjectsPerReporter\",\n value: function discoverDataObjectsPerReporter(reporter, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/reporter/' + reporter\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n Discovery_log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n Discovery_log.warn(\"[Discovery.discoverDataObjectsPerName] Error Reply for \" + reporter + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\n * function to request about dataObject registered in domain registry, and\n * returns discoveredObject.\n * @param {String} name dataObject URL\n * @param {Array} schema (Optional) types of dataObjects schemas\n * @param {Array} resources (Optional) types of dataObjects resources\n * @param {String} domain (Optional)\n */\n\n }, {\n key: \"discoverDataObjectsPerReporterDO\",\n value: function discoverDataObjectsPerReporterDO(reporter, schema, resources, domain) {\n var _this11 = this,\n _arguments10 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this11.discoverDataObjectsPerReporter.apply(_this11, _toConsumableArray(_arguments10)).then(function (registryObjects) {\n return resolve(_this11._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n }, {\n key: \"_convertToDiscoveredObject\",\n value: function _convertToDiscoveredObject(registryObjects) {\n var _this12 = this;\n\n return registryObjects.map(function (registryObject) {\n return new discovery_DiscoveredObject(registryObject, _this12.runtimeURL, _this12.discoveryURL, _this12.messageBus, _this12);\n });\n }\n /** Advanced Search for dataObjects registered in domain registry\n * @deprecated Deprecated. Use discoverDataObjectsPerName instead\n * @param {String} name name of the dataObject\n * @param {Array} schema (Optional) types of dataObject schemas\n * @param {Array} resources (Optional) types of dataObject resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverDataObject\",\n value: function discoverDataObject(name, schema, resources, domain) {\n var _this = this;\n\n var activeDomain; //let userIdentifier = convertToUserURL(user);\n\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: name,\n criteria: {\n resources: resources,\n dataSchemes: schema\n }\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n Discovery_log.log('[Discovery]', reply);\n\n if (reply.body.code > 299) {\n Discovery_log.warn(\"[Discovery.discoverDataObject] Error Reply for \" + name + \" Reason: \", reply.body.description);\n return resolve([]);\n }\n\n var hyperties = reply.body.value;\n\n if (hyperties) {\n resolve(hyperties);\n } else {\n resolve([]);\n }\n });\n });\n }\n /** Advanced Search for Hyperties registered in domain registry\n * @deprecated Deprecated. Use discoverHyperties instead\n * @param {String} user user identifier, either in url or email format\n * @param {Array} schema (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverHyperty\",\n value: function discoverHyperty(user, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n var userIdentifier = convertToUserURL(user);\n\n if (!domain) {\n activeDomain = _this.domain;\n } else {\n activeDomain = domain;\n }\n\n return new Promise(function (resolve, reject) {\n Discovery_log.log('[Discovery.discoverHyperty] ACTIVE DOMAIN -> ', activeDomain, 'user->', user, 'schema->', schema, 'resources->', resources, 'domain->', domain);\n\n if (user.includes(':') && !user.includes('user://')) {\n Discovery_log.log('[Discovery.discoverHyperty] ' + user + ' is legacy domain');\n var legacyUser = {\n userID: user,\n hypertyID: user,\n schema: schema,\n resources: resources\n };\n return resolve(legacyUser);\n }\n\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: userIdentifier,\n criteria: {\n resources: resources,\n dataSchemes: schema\n }\n }\n };\n Discovery_log.info('[Discovery] msg to send->', msg);\n\n _this.messageBus.postMessage(msg, function (reply) {\n Discovery_log.info('[Discovery] ON discoverHyperty->', reply);\n var hyperties = reply.body.value;\n\n if (hyperties) {\n resolve(hyperties);\n } else {\n reject('No Hyperty was found');\n }\n });\n });\n }\n /**\n * function to request about users registered in domain registry, and\n * return the last hyperty instance registered by the user.\n * @deprecated Deprecated. Use discoverHyperty instead\n * @param {email} email\n * @param {domain} domain (Optional)\n */\n\n }, {\n key: \"discoverHypertyPerUser\",\n value: function discoverHypertyPerUser(email, domain) {\n var _this = this;\n\n var activeDomain;\n return new Promise(function (resolve, reject) {\n // Hack for legacy users\n if (email.includes(':') && !email.includes('user://')) {\n Discovery_log.log('[Discovery.discoverHyperty] ' + email + 'is legacy domain');\n var legacyUser = {\n id: email,\n hypertyURL: email,\n descriptor: 'unknown'\n };\n return resolve(legacyUser);\n }\n\n if (!domain) {\n activeDomain = _this.domain;\n } else {\n activeDomain = domain;\n }\n\n var identityURL = 'user://' + email.substring(email.indexOf('@') + 1, email.length) + '/' + email.substring(0, email.indexOf('@')); // message to query domain registry, asking for a user hyperty.\n\n var message = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: identityURL\n }\n };\n Discovery_log.info('[Discovery] Message: ', message, activeDomain, identityURL); //log.info('[Discovery] message READ', message);\n\n _this.messageBus.postMessage(message, function (reply) {\n Discovery_log.info('[Discovery] message reply', reply);\n var hyperty;\n var mostRecent;\n var lastHyperty;\n var value = reply.body.value;\n\n for (hyperty in value) {\n if (value[hyperty].lastModified !== undefined) {\n if (mostRecent === undefined) {\n mostRecent = new Date(value[hyperty].lastModified);\n lastHyperty = hyperty;\n } else {\n var hypertyDate = new Date(value[hyperty].lastModified);\n\n if (mostRecent.getTime() < hypertyDate.getTime()) {\n mostRecent = hypertyDate;\n lastHyperty = hyperty;\n }\n }\n }\n }\n\n Discovery_log.info('[Discovery] Last Hyperty: ', lastHyperty, mostRecent);\n var hypertyURL = lastHyperty;\n\n if (hypertyURL === undefined) {\n return reject('User Hyperty not found');\n }\n\n var idPackage = {\n id: email,\n descriptor: value[hypertyURL].descriptor,\n hypertyURL: hypertyURL\n };\n Discovery_log.info('[Discovery] ===> hypertyDiscovery messageBundle: ', idPackage);\n resolve(idPackage);\n });\n });\n }\n /**\n * function to request about users registered in domain registry, and\n * return the all the hyperties registered by the user\n * @deprecated Deprecated. Use discoverHyperty instead\n * @param {email} email\n * @param {domain} domain (Optional)\n */\n\n }, {\n key: \"discoverHypertiesPerUser\",\n value: function discoverHypertiesPerUser(email, domain) {\n var _this = this;\n\n var activeDomain;\n Discovery_log.log('on Function->', email);\n return new Promise(function (resolve, reject) {\n if (email.includes(':') && !email.includes('user://')) {\n Discovery_log.log('[Discovery.discoverHyperty] is legacy domain');\n var legacyUser = {\n userID: email,\n hypertyID: email,\n schema: schema,\n resources: resources\n };\n return resolve(legacyUser);\n }\n\n if (!domain) {\n activeDomain = _this.domain;\n } else {\n activeDomain = domain;\n }\n\n var identityURL = 'user://' + email.substring(email.indexOf('@') + 1, email.length) + '/' + email.substring(0, email.indexOf('@')); // message to query domain registry, asking for a user hyperty.\n\n var message = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: identityURL\n }\n };\n Discovery_log.log('[Discovery] Message discoverHypertiesPerUser: ', message, activeDomain, identityURL); //log.info('[Discovery] message READ', message);\n\n _this.messageBus.postMessage(message, function (reply) {\n Discovery_log.info('[Discovery] discoverHypertiesPerUser reply', reply);\n var value = reply.body.value;\n\n if (!value) {\n return reject('User Hyperty not found');\n }\n\n resolve(value);\n });\n });\n }\n /**\n * function to request about users registered in domain registry, and\n * return the all the hyperties registered by the user\n * @deprecated Deprecated. Use discoverHyperty instead\n * @param {email} email\n * @param {domain} domain (Optional)\n */\n\n }, {\n key: \"resumeDiscoveries\",\n value: function resumeDiscoveries() {\n var _this = this;\n\n Discovery_log.log('[Discovery] resumeDiscoveries');\n return new Promise(function (resolve, reject) {\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/subscriptions',\n body: {\n resource: _this.discoveryURL\n }\n };\n\n _this.messageBus.postMessage(msg, function (reply) {\n Discovery_log.log('[Discovery.resumeDiscoveries] reply: ', reply);\n var notifications = [];\n\n if (reply.body.code === 200) {\n var urls = reply.body.value; // URLs to add listeners to\n //lets create one DiscoveryObject per notification\n\n urls.forEach(function (url) {\n var objectUrl = url.split('/registration')[0];\n var data = {};\n data.url = objectUrl;\n Discovery_log.log('[Discovery.resumeDiscoveries] adding listener to: ', objectUrl);\n\n if (objectUrl.includes('hyperty://')) {\n notifications.push(_this.discoverHypertyPerURLDO(objectUrl));\n } else {\n notifications.push(_this.discoverDataObjectPerURLDO(objectUrl));\n }\n });\n Promise.all(notifications).then(function (values) {\n resolve(values);\n });\n } else {\n resolve([]);\n }\n });\n });\n }\n }]);\n\n return Discovery;\n}();\n\n/* harmony default export */ var discovery_Discovery = (Discovery_Discovery);\n// CONCATENATED MODULE: ./src/utils/Search.js\nfunction Search_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Search_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Search_createClass(Constructor, protoProps, staticProps) { if (protoProps) Search_defineProperties(Constructor.prototype, protoProps); if (staticProps) Search_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar Search =\n/*#__PURE__*/\nfunction () {\n function Search(discovery, identityManager) {\n Search_classCallCheck(this, Search);\n\n if (!discovery) throw new Error('The discovery component is a needed parameter');\n if (!identityManager) throw new Error('The identityManager component is a needed parameter');\n\n var _this = this;\n\n _this.discovery = discovery;\n _this.identityManager = identityManager;\n }\n\n Search_createClass(Search, [{\n key: \"myIdentity\",\n value: function myIdentity() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.identityManager.discoverUserRegistered().then(function (result) {\n resolve(result);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"hyperties\",\n value: function hyperties(users, schemes, resources) {\n var globalFlag = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n } //TODO: reuse users or the other way around\n\n /**\n * List of usersURL to search\n * @param {array} users List of UserUR, like this format user:///\n * @return {Promise}\n */\n\n }, {\n key: \"users\",\n value: function users(usersURLs, providedDomains, schemes, resources) {\n var globalFlag = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n if (!usersURLs) throw new Error('You need to provide a list of users');\n if (!providedDomains) throw new Error('You need to provide a list of domains');\n if (!resources) throw new Error('You need to provide a list of resources');\n if (!schemes) throw new Error('You need to provide a list of schemes');\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.info('[Search] Users: ', usersURLs, usersURLs.length);\n console.info('[Search] Domains: ', providedDomains, providedDomains.length);\n\n if (usersURLs.length === 0) {\n console.info('Don\\'t have users to discovery');\n resolve(usersURLs);\n } else {\n var getUsers = [];\n usersURLs.forEach(function (userURL, index) {\n var currentDomain = providedDomains[index];\n console.info('[Search] Search user ' + userURL + ' for provided domain:', currentDomain);\n\n if (!globalFlag) {\n getUsers.push(_this.discovery.discoverHyperties(userURL, schemes, resources, currentDomain));\n } else {\n getUsers.push(_this.discovery.discoverHypertiesPerUserProfileData(userURL, schemes, resources));\n }\n });\n console.info('Requests promises: ', getUsers);\n Promise.all(getUsers.map(function (promise) {\n return promise.then(function (hyperty) {\n return hyperty;\n }, function (error) {\n return error;\n });\n })).then(function (hyperties) {\n console.info('[Search] Hyperties from new Discovery', hyperties);\n var result = hyperties.map(function (hyperty) {\n if (hyperty.hasOwnProperty('hypertyID')) return hyperty;\n var recent = Object.keys(hyperty).reduceRight(function (a, b) {\n var hypertyDate = new Date(hyperty[b].lastModified);\n var hypertyDateP = new Date(hyperty[a].lastModified);\n\n if (hypertyDateP.getTime() < hypertyDate.getTime()) {\n return b;\n }\n\n return a;\n });\n return hyperty[recent];\n });\n var clean = result.filter(function (hyperty) {\n return hyperty.hasOwnProperty('hypertyID');\n });\n console.log('Requests result: ', clean);\n hyperties.forEach(function (entry) {\n if (entry !== 'No Hyperty was found') {\n return resolve(clean);\n }\n });\n reject('No Hyperty was found');\n }).catch(function (reason) {\n console.error(reason);\n resolve(usersURLs);\n });\n }\n });\n }\n }]);\n\n return Search;\n}();\n\n/* harmony default export */ var utils_Search = (Search);\n// CONCATENATED MODULE: ./src/utils/EventEmitter.js\nfunction EventEmitter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction EventEmitter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction EventEmitter_createClass(Constructor, protoProps, staticProps) { if (protoProps) EventEmitter_defineProperties(Constructor.prototype, protoProps); if (staticProps) EventEmitter_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n * EventEmitter\n * All classes which extends this, can have addEventListener and trigger events;\n */\nvar EventEmitter =\n/*#__PURE__*/\nfunction () {\n function EventEmitter() {\n EventEmitter_classCallCheck(this, EventEmitter);\n }\n\n EventEmitter_createClass(EventEmitter, [{\n key: \"addEventListener\",\n\n /**\n * addEventListener listen for an eventType\n * @param {string} eventType - listening for this type of event\n * @param {Function} cb - callback function will be executed when the event it is invoked\n */\n value: function addEventListener(eventType, cb) {\n var _this = this;\n\n _this[eventType] = cb;\n }\n /**\n * Invoke the eventType\n * @param {string} eventType - event will be invoked\n * @param {object} params - parameters will be passed to the addEventListener\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(eventType, params) {\n var _this = this;\n\n if (_this[eventType]) {\n _this[eventType](params);\n }\n }\n }]);\n\n return EventEmitter;\n}();\n\n/* harmony default export */ var utils_EventEmitter = (EventEmitter);\n// CONCATENATED MODULE: ./src/contextManager/ContextObserver.js\nfunction ContextObserver_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { ContextObserver_typeof = function _typeof(obj) { return typeof obj; }; } else { ContextObserver_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return ContextObserver_typeof(obj); }\n\nfunction ContextObserver_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ContextObserver_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ContextObserver_createClass(Constructor, protoProps, staticProps) { if (protoProps) ContextObserver_defineProperties(Constructor.prototype, protoProps); if (staticProps) ContextObserver_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction ContextObserver_possibleConstructorReturn(self, call) { if (call && (ContextObserver_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return ContextObserver_assertThisInitialized(self); }\n\nfunction ContextObserver_getPrototypeOf(o) { ContextObserver_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ContextObserver_getPrototypeOf(o); }\n\nfunction ContextObserver_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction ContextObserver_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ContextObserver_setPrototypeOf(subClass, superClass); }\n\nfunction ContextObserver_setPrototypeOf(o, p) { ContextObserver_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ContextObserver_setPrototypeOf(o, p); }\n\n//import IdentityManager from '../identityManager/IdentityManager';\n//import Syncher from '../syncher/Syncher.js';\n//import Discovery from '../discovery/Discovery.js';\n//import {divideURL} from '../utils/utils';\n//import Search from '../utils/Search';\n\n/**\n* Context Observer;\n* @author Paulo Chainho [paulo-g-chainho@alticelabs.com]\n*/\n\nvar ContextObserver =\n/*#__PURE__*/\nfunction (_EventEmitter) {\n ContextObserver_inherits(ContextObserver, _EventEmitter);\n\n function ContextObserver(hypertyURL, bus, configuration, contextResourceTypes, factory, syncher) {\n var _this2;\n\n ContextObserver_classCallCheck(this, ContextObserver);\n\n if (!hypertyURL) throw new Error('The hypertyURL is a needed parameter');\n if (!bus) throw new Error('The MiniBus is a needed parameter');\n if (!configuration) throw new Error('The configuration is a needed parameter ');\n if (!factory) throw new Error('The factory is a needed parameter ');\n _this2 = ContextObserver_possibleConstructorReturn(this, ContextObserver_getPrototypeOf(ContextObserver).call(this));\n\n var _this = ContextObserver_assertThisInitialized(_this2);\n\n _this._contextResourceTypes = contextResourceTypes;\n _this._url = hypertyURL;\n _this._discoverUsersPromises = {}; // object with promises executed at discoverUsers function\n\n _this._observePromises = {}; // object with promises executed at observe function\n //let identityManager = new IdentityManager(hypertyURL, configuration.runtimeURL, bus);\n\n console.log('[ContextObserver] started with hypertyURL->', hypertyURL);\n _this._domain = factory.divideURL(configuration.runtimeURL).domain;\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + _this._domain + '/.well-known/dataschema/Context';\n _this._users2observe = [];\n _this._observers = {};\n _this2._syncher = syncher ? syncher : factory.createSyncher(hypertyURL, bus, configuration);\n var discovery = factory.createDiscovery(hypertyURL, configuration.runtimeURL, bus);\n _this._discovery = discovery;\n _this._discoveries = {}; //list of discovered objects\n //_this.identityManager = identityManager;\n //_this.search = new Search(discovery, identityManager);\n\n window.discovery = _this._discovery;\n return _this2;\n }\n\n ContextObserver_createClass(ContextObserver, [{\n key: \"start\",\n value: function start(resumedContext, disconnectedCallBack) {\n var _this = this;\n\n console.log('[ContextObserver.start] ');\n return new Promise(function (resolve, reject) {\n _this._syncher.resumeObservers({\n store: true\n }).then(function (observers) {\n var observersList = Object.keys(observers);\n\n if (observersList.length > 0) {\n console.log('[ContextObserver.start] resuming: ', observers);\n /*observersList.forEach((i)=>{\n _this._users2observe.push(new UserAvailabilityController(observers[i]));\n });*/\n\n _this._observers = observers;\n resolve(observers);\n observersList.forEach(function (observer) {\n var Context = observers[observer]; // By default resumed context is set with resumedContext.\n\n if (resumedContext) context.data.values = resumedContext; // Context will will be updated with value synchronized with reporter if connected\n\n Context.sync(); //Add listener to be notified when reporter is abruptly disconnected\n\n if (disconnectedCallBack) Context.onDisconnected(disconnectedCallBack);\n });\n } else {\n resolve(false);\n }\n }).catch(function (reason) {\n console.info('[ContextObserver] Resume Observer failed | ', reason);\n resolve(false);\n });\n }).catch(function (reason) {\n reject('[ContextObserver] Start failed | ', reason);\n });\n }\n }, {\n key: \"resumeDiscoveries\",\n value: function resumeDiscoveries() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._discovery.resumeDiscoveries().then(function (discoveries) {\n console.log('[ContextObserver._resumeDiscoveries] found: ', discoveries);\n discoveries.forEach(function (discovery) {\n if (discovery.data.resources && discovery.data.resources[0] === _this._contextResourceTypes[0]) {\n console.log('[ContextObserver._resumeDiscoveries] resuming: ', discovery);\n\n if (discovery.data.status === 'live') {\n // previously discovered object is now live\n resolve([discovery.data]);\n discovery.unsubscribeLive(_this._url);\n } else {\n // previously discovered object is still disconnected\n discovery.onLive(_this._url, function () {\n console.log('[ContextObserver._resumeDiscoveries] disconnected Hyperty is back to live', discovery);\n resolve([discovery.data]);\n discovery.unsubscribeLive(_this._url);\n });\n }\n }\n });\n });\n }).catch(function (reason) {\n reject('[ContextObserver] resumeDiscoveries failed | ', reason);\n });\n }\n }, {\n key: \"onResumeObserver\",\n value: function onResumeObserver(callback) {\n var _this = this;\n\n _this._onResumeObserver = callback;\n }\n }, {\n key: \"discoverUsers\",\n value: function discoverUsers(email, domain) {\n var _this = this;\n\n var user = email + '@' + domain;\n\n if (!_this._discoverUsersPromises[user]) {\n _this._discoverUsersPromises[user] = new Promise(function (resolve, reject) {\n _this._discovery.discoverHypertiesDO(email, ['context'], _this._contextResourceTypes, domain).then(function (hyperties) {\n //_this.search.users([email], [domain], ['context'], ['Context_context']).then(function(a) {\n console.log('[ContextObserver.discoverUsers] discovery result->', hyperties);\n var discovered = [];\n var disconnected = [];\n hyperties.forEach(function (hyperty) {\n _this._discoveries[hyperty.data.hypertyID] = hyperty;\n\n if (hyperty.data.status === 'live') {\n discovered.push(hyperty.data);\n } else {\n disconnected.push(hyperty);\n }\n });\n\n if (discovered.length > 0) {\n console.log('[ContextObserver.discoverUsers] returning discovered hyperties data->', discovered);\n resolve(discovered);\n } else if (disconnected.length > 0) {\n console.log('[ContextObserver.discoverUsers] disconnected Hyperties ', disconnected); //resolve([]);\n\n disconnected[0].onLive(_this._url, function () {\n console.log('[ContextObserver.discoverUsers] disconnected Hyperty is back to live', disconnected[0]);\n discovered.push(disconnected[0].data);\n resolve(discovered);\n disconnected[0].unsubscribeLive(_this._url);\n });\n }\n });\n });\n }\n\n return _this._discoverUsersPromises[user];\n }\n /**\n * This function is used to start the user Context observation for a certain user Context reporter\n * @param {DiscoveredObject} hyperty Hyperty to be observed.\n * @return { DataObjectObserver} It returns as a Promise the UserAvailability Data Object Observer.\n */\n\n }, {\n key: \"observe\",\n value: function observe(hyperty) {\n var domainSubscription = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var _this = this;\n\n if (!_this._observePromises[hyperty.hypertyID]) {\n _this._observePromises[hyperty.hypertyID] = new Promise(function (resolve, reject) {\n //check if we are already observing it\n _this._users2observe.forEach(function (Context) {\n if (Context._reporter === hyperty.hypertyID) return resolve(Context);\n });\n\n _this._discovery.discoverDataObjectsPerReporter(hyperty.hypertyID, ['context'], _this._contextResourceTypes, _this._domain).then(function (dataObjects) {\n console.log('[ContextObserver.discoverAvailability] discovered context objects ', dataObjects);\n var last = 0;\n var url;\n dataObjects.forEach(function (dataObject) {\n if (dataObject.hasOwnProperty('lastModified') && dataObject.hasOwnProperty('url') && Date.parse(dataObject.lastModified) > last) {\n last = dataObject.lastModified;\n url = dataObject.url; //console.log('URL DATA Object', url);\n }\n });\n\n if (last != 0 && url) {\n resolve(_this._subscribeContext(hyperty, url, domainSubscription));\n } else {\n reject('[ContextObserver.observe] discovered DataObjecs are invalid', dataObjects);\n }\n });\n });\n }\n\n return _this._observePromises[hyperty.hypertyID];\n }\n }, {\n key: \"_subscribeContext\",\n value: function _subscribeContext(hyperty, url) {\n var domainSubscription = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var _this = this; // avoid duplicated subscriptions\n\n\n return new Promise(function (resolve, reject) {\n _this._users2observe.forEach(function (Context) {\n if (Context.url === url) return resolve(Context);\n });\n\n var input = {\n schema: _this._objectDescURL,\n resource: url,\n store: null,\n p2p: null,\n mutual: null,\n domain_subscription: domainSubscription\n };\n\n _this._syncher.subscribe(input).then(function (Context) {\n console.log('[ContextObserver._subscribeContext] observer object', Context); //let newUserAvailability = new UserAvailabilityController(Context, userID);\n\n _this._users2observe.push(Context); // When Object is disconnected set user Context status as unavailable\n\n\n Context.onDisconnected(function () {\n console.log('[ContextObserver.onDisconnected]: ', Context);\n Context.data.values[0].value = 'unavailable';\n Context.sync();\n });\n resolve(Context);\n });\n });\n }\n }, {\n key: \"_discoverAndSubscribeLegacyUsers\",\n value: function _discoverAndSubscribeLegacyUsers(name) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._discovery.discoverDataObjectsPerName(name).then(function (result) {\n console.log('[ContextObserver._discoverAndSubscribeLegacyUsers] All DataObjects Result', result);\n result.forEach(function (obj) {\n if (obj.status === 'live') {\n console.log('Live obj', obj);\n\n if (!obj.hypertyID) {\n obj.hypertyID = obj.reporter;\n }\n\n _this._subscribeContext(obj.schema, obj.url).then(function (resultSubscribe) {\n console.log('[ContextObserver._discoverAndSubscribeLegacyUsers] _subscribeContext', resultSubscribe);\n return resolve(resultSubscribe);\n });\n }\n });\n }).catch(function (err) {\n console.log('error ', err);\n });\n });\n }\n /**\n * This function is used to stop the user Context observation for a certain user\n * @param {string} Context the UserAvailability Data Object Observer URL to be unobserved.\n */\n\n }, {\n key: \"unobserve\",\n value: function unobserve(Context) {\n var _this = this;\n\n _this._users2observe.forEach(function (user, index) {\n if (user.url === Context) {\n user.unsubscribe();\n\n _this._users2observe.splice(index, 1);\n }\n });\n }\n }]);\n\n return ContextObserver;\n}(utils_EventEmitter);\n\n/* harmony default export */ var contextManager_ContextObserver = (ContextObserver);\n// CONCATENATED MODULE: ./src/contextManager/ContextReporter.js\nfunction ContextReporter_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { ContextReporter_typeof = function _typeof(obj) { return typeof obj; }; } else { ContextReporter_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return ContextReporter_typeof(obj); }\n\nfunction ContextReporter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ContextReporter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ContextReporter_createClass(Constructor, protoProps, staticProps) { if (protoProps) ContextReporter_defineProperties(Constructor.prototype, protoProps); if (staticProps) ContextReporter_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction ContextReporter_possibleConstructorReturn(self, call) { if (call && (ContextReporter_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return ContextReporter_assertThisInitialized(self); }\n\nfunction ContextReporter_getPrototypeOf(o) { ContextReporter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ContextReporter_getPrototypeOf(o); }\n\nfunction ContextReporter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction ContextReporter_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ContextReporter_setPrototypeOf(subClass, superClass); }\n\nfunction ContextReporter_setPrototypeOf(o, p) { ContextReporter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ContextReporter_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Service Framework\n//import Syncher from '../syncher/Syncher';\n// Utils\n //import {divideURL} from '../utils/utils.js';\n// import availability from './availability.js';\n\n/**\n* Context Reporter;\n* @author Paulo Chainho [paulo-g-chainho@alticelabs.com]\n*/\n\nvar ContextReporter =\n/*#__PURE__*/\nfunction (_EventEmitter) {\n ContextReporter_inherits(ContextReporter, _EventEmitter);\n\n function ContextReporter(hypertyURL, bus, configuration, factory, syncher) {\n var _this2;\n\n ContextReporter_classCallCheck(this, ContextReporter);\n\n if (!hypertyURL) throw new Error('The hypertyURL is a needed parameter');\n if (!bus) throw new Error('The MiniBus is a needed parameter');\n if (!configuration) throw new Error('The configuration is a needed parameter');\n _this2 = ContextReporter_possibleConstructorReturn(this, ContextReporter_getPrototypeOf(ContextReporter).call(this, hypertyURL, bus, configuration));\n\n var _this = ContextReporter_assertThisInitialized(_this2);\n\n console.info('[ContextReporter] started with url: ', hypertyURL);\n _this2.syncher = syncher ? syncher : factory.createSyncher(hypertyURL, bus, configuration); // this.discovery = new Discovery(hypertyURL, bus);\n\n _this2.domain = factory.divideURL(configuration.runtimeURL).domain;\n _this2.contexts = {};\n _this2.contextDescURL = 'hyperty-catalogue://catalogue.' + _this2.domain + '/.well-known/dataschema/Context'; // this.heartbeat = [];\n\n _this2.syncher.onNotification(function (event) {\n var _this = ContextReporter_assertThisInitialized(_this2);\n\n _this.onNotification(event);\n }); //TODO: uncomment when used with service framework develop branch\n\n\n _this2.syncher.onClose(function (event) {\n console.log('[ContextReporter.onClose]');\n\n var _this = ContextReporter_assertThisInitialized(_this2);\n\n _this.setStatus(event.id, 'unavailable');\n\n event.ack();\n });\n\n return _this2;\n } //TODO: move to User availability Reporter or to abstract HypertyContextReporter\n\n\n ContextReporter_createClass(ContextReporter, [{\n key: \"start\",\n value: function start() {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this3.syncher.resumeReporters({\n store: true\n }).then(function (reporters) {\n var reportersList = Object.keys(reporters);\n\n if (reportersList.length > 0) {\n console.log('[ContextReporter.start] resuming ', reporters[reportersList[0]]); // set availability to available\n\n _this.contexts = reporters; //TODO:\n\n reportersList.forEach(function (context) {\n _this._onSubscription(_this.contexts[context]);\n });\n resolve(_this.contexts);\n } else {\n console.log('[ContextReporter.start] nothing to resume ', reporters);\n resolve(false);\n }\n }).catch(function (reason) {\n console.error('[ContextReporter] Resume failed | ', reason);\n });\n }).catch(function (reason) {\n reject('[ContextReporter] Start failed | ', reason);\n });\n }\n }, {\n key: \"processNotification\",\n value: function processNotification(event) {\n var _this = this;\n\n console.log('[ContextReporter.processNotification: ', event);\n event.ack();\n }\n /**\n * This function is used to create a new status object syncher\n * @param {URL.UserURL} contacts List of Users\n * @return {Promise}\n */\n\n }, {\n key: \"create\",\n value: function create(id, init, resources) {\n var name = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'myContext';\n var reporter = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n var reuseURL = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;\n\n //debugger;\n var _this = this;\n\n var input;\n return new Promise(function (resolve, reject) {\n if (!reporter && !reuseURL) {\n input = {\n resources: resources,\n expires: 30\n };\n } else if (reporter && !reuseURL) {\n input = {\n resources: resources,\n expires: 30,\n reporter: reporter\n };\n } else if (!reporter && reuseURL) {\n input = {\n resources: resources,\n expires: 30,\n reuseURL: reuseURL\n };\n } else {\n input = {\n resources: resources,\n expires: 30,\n reuseURL: reuseURL,\n reporter: reporter\n };\n }\n\n console.info('[ContextReporter.create] lets create a new User availability Context Object ', input);\n\n _this.syncher.create(_this.contextDescURL, [], init, true, false, name, null, input).then(function (context) {\n _this.contexts[id] = context;\n\n _this._onSubscription(context);\n\n resolve(context);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"_onSubscription\",\n value: function _onSubscription(context) {\n context.onSubscription(function (event) {\n console.info('[ContextReporter._onSubscription] accepting: ', event);\n event.accept();\n });\n }\n }, {\n key: \"setContext\",\n value: function setContext(id, newContext) {\n var _this = this;\n\n console.log('THIS [ContextReporter.setContext] before change :', _this.contexts[id]);\n console.log('[ContextReporter.setContext] before change :', _this.contexts[id].data); // _this.contexts[id].data.values[0].value = newContext;\n\n _this.contexts[id].data.values = newContext;\n console.debug('[ContextReporter.setContext] after change :', _this.contexts[id].data);\n\n _this.trigger(id + '-context-update', newContext);\n }\n }]);\n\n return ContextReporter;\n}(utils_EventEmitter);\n\n/* harmony default export */ var contextManager_ContextReporter = (ContextReporter);\n// CONCATENATED MODULE: ./src/identity/UserProfile.js\nfunction UserProfile_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n* The UserProfile according to User Identity Data Model\n*/\nvar UserProfile = function UserProfile(username, userURL, picture, name, locale, profile) {\n UserProfile_classCallCheck(this, UserProfile);\n\n if (username) {\n this.preferred_username = username;\n }\n\n if (picture) {\n this.picture = picture;\n }\n\n if (name) {\n this.name = name;\n }\n\n if (locale) {\n this.locale = locale;\n }\n\n if (userURL) {\n this.userURL = userURL;\n }\n\n if (profile) Object.assign(this, profile);\n};\n\n/* harmony default export */ var identity_UserProfile = (UserProfile);\n// CONCATENATED MODULE: ./src/identity/MessageBodyIdentity.js\nfunction MessageBodyIdentity_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n* The Identity info to be added to Message.Body.Identity\n*/\n\n\nvar MessageBodyIdentity_MessageBodyIdentity = function MessageBodyIdentity(username, userURL, picture, name, locale, idp, assertion, profile) {\n MessageBodyIdentity_classCallCheck(this, MessageBodyIdentity);\n\n if (!idp) throw new Error('IDP should be a parameter');\n if (!username) throw new Error('username should be a parameter');\n this.idp = idp;\n\n if (assertion) {\n this.assertion = assertion;\n }\n\n this.userProfile = new identity_UserProfile(username, userURL, picture, name, locale, profile);\n};\n\n/* harmony default export */ var identity_MessageBodyIdentity = (MessageBodyIdentity_MessageBodyIdentity);\n// CONCATENATED MODULE: ./src/chatManager/communication.js\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\nvar CommunicationStatus = {\n OPEN: 'open',\n PENDING: 'pending',\n CLOSED: 'closed',\n PAUSED: 'paused',\n FAILED: 'failed'\n};\nvar communicationObject = {\n startingTime: '',\n status: '',\n participants: {}\n};\nvar communicationChildren = {\n \"parent\": \"communication\",\n \"listener\": \"resources\",\n \"type\": \"HypertyResource\"\n};\n/*\nexport let communicationObject = {\n id: '',\n name: '',\n owner: '',\n scheme: 'comm',\n startingTime: '',\n lastModified: '',\n duration: '',\n status: '',\n participants: []\n};\n*/\n// CONCATENATED MODULE: ./src/chatManager/InvitationsHandler.js\nfunction InvitationsHandler_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction InvitationsHandler_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction InvitationsHandler_createClass(Constructor, protoProps, staticProps) { if (protoProps) InvitationsHandler_defineProperties(Constructor.prototype, protoProps); if (staticProps) InvitationsHandler_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* To manage Group Chat Invitations\n* @author Paulo Chainho [paulo-g-chainho@alticelabs.com]\n* @version 0.1.0\n*/\n// TODO: have an instance per ChatController\nvar InvitationsHandler =\n/*#__PURE__*/\nfunction () {\n function InvitationsHandler(hypertyURL) {\n InvitationsHandler_classCallCheck(this, InvitationsHandler);\n\n if (!hypertyURL) throw Error('hypertyURL is a necessary dependecy');\n\n var _this = this;\n\n _this._hypertyURL = hypertyURL;\n _this._pending = {}; // All pending invitations\n }\n\n InvitationsHandler_createClass(InvitationsHandler, [{\n key: \"inviteDisconnectedHyperties\",\n\n /**\n * This function is used to handle notifications for disconnected Hy+erties.\n * @param {DiscoveredObject[]} disconnected array of discovered hyperties that are disconnected\n * @param {DataObjectReporter} DataObjectReporter Data Object Reporter addressed by invitations\n */\n value: function inviteDisconnectedHyperties(disconnected, dataObjectReporter) {\n var _this = this;\n\n console.log('[GroupChatManager.InvitationsHandler.inviteDisconnectedHyperties] lets invite ', disconnected);\n disconnected.forEach(function (disconnectedHyperty) {\n if (!_this._pending[dataObjectReporter]) {\n _this._pending[dataObjectReporter] = {};\n }\n\n _this._pending[dataObjectReporter][disconnectedHyperty.data.hypertyID] = disconnectedHyperty;\n disconnectedHyperty.onLive(_this._hypertyURL, function () {\n console.log('[GroupChatManager.create] disconnected Hyperty is back to live', disconnectedHyperty);\n dataObjectReporter.inviteObservers([disconnectedHyperty.data.hypertyID]);\n disconnectedHyperty.unsubscribeLive(_this._hypertyURL);\n delete _this._pending[dataObjectReporter][disconnectedHyperty.data.hypertyID];\n });\n });\n }\n /**\n * This function is used to process sent invitations. In case invitations are not acknowledge by recipient it will be handled as a disconnected hyperty\n * @param {DiscoveredObject[]} live array of discovered hyperties that are or were live\n * @param {DataObjectReporter} DataObjectReporter Data Object Reporter addressed by invitations\n */\n\n }, {\n key: \"processInvitations\",\n value: function processInvitations(live, dataObjectReporter) {\n var _this2 = this;\n\n var _this = this;\n\n var invitations = dataObjectReporter.invitations || [];\n console.log('[GroupChatManager.InvitationsHandler.processInvitations] waiting for replies ', invitations, this._invitationsResponse);\n invitations.forEach(function (invitation) {\n invitation.then(function (result) {\n console.log('[GroupChatManager.InvitationsHandler.processInvitations] - OK: ', result, _this2._invitationsResponse);\n\n if (_this2._invitationsResponse) {\n _this2._invitationsResponse(result);\n }\n }).catch(function (result) {\n console.log('[GroupChatManager.InvitationsHandler.processInvitations] - NOT OK: ', result, _this2._invitationsResponse);\n\n if (_this2._invitationsResponse) {\n _this2._invitationsResponse(result);\n }\n\n _this.inviteDisconnectedHyperties([live[result.invited]], dataObjectReporter);\n });\n });\n }\n }, {\n key: \"resumeDiscoveries\",\n value: function resumeDiscoveries(discoveryEngine, groupChat) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var live = {};\n var liveHyperties = [];\n var disconnected = [];\n var unsubscriptonPromises = [];\n discoveryEngine.resumeDiscoveries().then(function (discoveries) {\n console.log('[GroupChatManager.InvitationsHandler.resumeDiscoveries] found: ', discoveries);\n discoveries.forEach(function (discovery) {\n if (discovery.data.resources && discovery.data.resources[0] === 'chat') {\n console.log('[GroupChatManager.InvitationsHandler.resumeDiscoveries] resuming: ', discovery);\n\n if (discovery.data.status === 'live') {\n // previously discovered object is now live\n live[discovery.data.hypertyID] = discovery;\n liveHyperties.push(discovery.data.hypertyID);\n unsubscriptonPromises.push(discovery.unsubscribeLive(_this._hypertyURL));\n } else {\n // previously discovered object is still disconnected\n disconnected.push(discovery);\n }\n }\n });\n if (disconnected.length > 0) _this.inviteDisconnectedHyperties(disconnected, groupChat);\n\n if (Object.keys(live).length > 0) {\n groupChat.inviteObservers(liveHyperties);\n if (groupChat.invitations.length > 0) _this.processInvitations(live, groupChat);\n Promise.all(unsubscriptonPromises).then(function () {\n resolve();\n });\n } else resolve();\n });\n }).catch(function (reason) {\n reject('[GroupChatManager.InvitationsHandler.resumeDiscoveries] failed | ', reason);\n });\n }\n /**\n * This function is used to remove and clean all pending invitations.\n * @param {DataObjectReporter} DataObjectReporter Data Object Reporter addressed by invitations\n * @return {Promise} return a promise when all unsubscriptons for pending invitations are finished\n */\n\n }, {\n key: \"cleanInvitations\",\n value: function cleanInvitations(dataObjectReporter) {\n var _this = this;\n\n var chatInvitations = _this._pending[dataObjectReporter];\n console.log('[GroupChatManager.InvitationsHandler.cleanInvitations] ', chatInvitations);\n\n if (chatInvitations) {\n return new Promise(function (resolve, reject) {\n var pendingInvitations = Object.keys(chatInvitations);\n var unsubscriptonPromises = [];\n pendingInvitations.forEach(function (invitation) {\n unsubscriptonPromises.push(chatInvitations[invitation].unsubscribeLive(_this._hypertyURL));\n });\n Promise.all(pendingInvitations).then(function () {\n resolve();\n });\n });\n } else return Promise.resolve();\n }\n }, {\n key: \"invitationResponse\",\n set: function set(callback) {\n this._invitationsResponse = callback;\n }\n }]);\n\n return InvitationsHandler;\n}();\n\n/* harmony default export */ var chatManager_InvitationsHandler = (InvitationsHandler);\n// CONCATENATED MODULE: ./src/chatManager/ChatController.js\nfunction ChatController_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ChatController_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ChatController_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChatController_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChatController_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* The Group Chat API is used to control a Group Chat instance.\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\n* @version 0.1.0\n*/\n//import { UserInfo } from './UserInfo';\n\n\n\nvar ChatController_ChatController =\n/*#__PURE__*/\nfunction () {\n function ChatController(syncher, discovery, domain, search, identity, manager) {\n ChatController_classCallCheck(this, ChatController);\n\n if (!syncher) throw Error('Syncher is a necessary dependecy');\n if (!discovery) throw Error('Discover is a necessary dependecy');\n if (!domain) throw Error('Domain is a necessary dependecy');\n if (!search) throw Error('Search is a necessary dependecy');\n\n var _this = this;\n\n _this._syncher = syncher;\n _this.discovery = discovery;\n _this.search = search;\n _this.myIdentity = identity;\n _this.controllerMode = 'reporter';\n _this.child_cseq = 0;\n _this.domain = domain;\n _this._manager = manager;\n var hypertyURL = syncher.owner;\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication';\n _this._invitationsHandler = new chatManager_InvitationsHandler(hypertyURL);\n }\n\n ChatController_createClass(ChatController, [{\n key: \"_setOnAddChildListener\",\n value: function _setOnAddChildListener(dataObject) {\n var _this = this;\n\n dataObject.onAddChild(function (child) {\n _this.child_cseq += 1;\n console.info('[ChatManager.ChatController._setOnAddChildListener] new Child received: ', child);\n if (_this._onMessage) _this._onMessage(child);\n });\n }\n }, {\n key: \"_onSubscribe\",\n value: function _onSubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n event.accept();\n console.log('[ChatManager.ChatController.onSubscribe] event', event, dataObjectReporter.url);\n console.log('[ChatManager.ChatController.onSubscribe] New user has subscribe this object: ', dataObjectReporter.data, event.identity);\n var identity = JSON.parse(JSON.stringify(event.identity));\n\n if (identity.hasOwnProperty('assertion')) {\n delete identity.assertion;\n }\n\n var userInfo = {\n hypertyURL: event.url,\n domain: event.domain,\n identity: identity\n };\n var userURL = event.identity.userProfile.guid;\n console.log('[ChatManager.ChatController.onSubscribe] new participant', userInfo);\n\n if (event.identity.legacy) {\n userInfo.legacy = event.identity.legacy;\n }\n\n dataObjectReporter.data.participants[userURL] = userInfo;\n console.log('[ChatManager.ChatController.onSubscribe] communicationObject OBJ chatcontroller', dataObjectReporter.data.participants);\n console.log('[ChatManager.ChatController.onSubscribe - onSubscription] ', userInfo); // console.log('[ChatManager.ChatController.onSubscribe - this._onUserAdded] ', this._onUserAdded);\n\n if (this._onUserAdded) this._onUserAdded(userInfo);\n }\n }, {\n key: \"_onUnsubscribe\",\n value: function _onUnsubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n console.log('[ChatManager.ChatController.onUnsubscribe] event', event, dataObjectReporter.url);\n var participant = event.identity.userProfile;\n console.log('[ChatManager.ChatController.onUnsubscribe] participant left', participant);\n\n if (event.identity.legacy) {\n participant.legacy = event.identity.legacy;\n }\n\n delete dataObjectReporter.data.participants[participant.userURL];\n console.log('[ChatManager.ChatController.onUnsubscribe - this._onUserRemoved] ', this.onUserRemoved);\n if (this._onUserRemoved) this._onUserRemoved(participant);\n }\n /**\n * This function is used to send a file.\n * @param {string} file Is the file to be sent.\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\n */\n\n }, {\n key: \"sendFile\",\n value: function sendFile(file) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n var identity = {\n userProfile: _this.myIdentity\n };\n dataObject.addHypertyResource('resources', 'file', file, identity).then(function (resourceFile) {\n var identity = {\n userProfile: _this.myIdentity\n };\n var fileSentEvt = {\n value: resourceFile,\n identity: identity,\n resource: resourceFile\n };\n var reporterStatus = new discovery_RegistrationStatus(dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus); // recursive function to sync with chat reporter\n\n var share2Reporter = function share2Reporter(file, subscriber, evt, status) {\n var statusOfReporter = status;\n file.sharingStatus.then(resolve(evt)).catch(function (result) {\n console.log('[ChatManager.ChatController.sendFile] share failed: ', result);\n statusOfReporter.onLive(subscriber, function () {\n statusOfReporter.unsubscribeLive(subscriber);\n file.share(true);\n share2Reporter(file, subscriber, evt, statusOfReporter);\n }); //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\n });\n };\n\n share2Reporter(resourceFile, _this._manager._hypertyURL, fileSentEvt, reporterStatus);\n });\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n }\n /**\n * This function is used to send a chat message.\n * @param {string} message Is the ChatMessage to be sent.\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\n */\n\n }, {\n key: \"send\",\n value: function send(message, identity) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n // let _dataObjectChild;\n _this.child_cseq += 1;\n var msg = {\n /* url: dataObject.data.url,\n cseq: _this.child_cseq,\n reporter: dataObject.data.reporter,\n schema: dataObject.data.schema,\n name: dataObject.data.name,\n created : new Date().toJSON(),*/\n type: 'chat',\n content: message\n };\n var sender = identity ? identity : {\n userProfile: _this.myIdentity\n }; // TODO: change chatmessages to resource - chat, file\n // TODO: change message to hypertyResource - https://github.com/reTHINK-project/dev-service-framework/tree/develop/docs/datamodel/data-objects/hyperty-resource\n // TODO: handle with multiple resources - if the \"message\" will be different for each type of resources\n\n dataObject.addChild(msg, sender).then(function (dataObjectChild) {\n console.log('[ChatManager.ChatController][addChild - Chat Message]: ', dataObjectChild); //resolve(dataObjectChild);\n //TODO: move to separate function\n\n var msg = {\n childId: dataObjectChild._childId,\n from: dataObjectChild._owner,\n value: dataObjectChild.data,\n type: 'create',\n identity: sender\n };\n var reporterStatus = new discovery_RegistrationStatus(dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus); // recursive function to sync with chat reporter\n\n var share2Reporter = function share2Reporter(child, subscriber, msg, status) {\n var statusOfReporter = status;\n child.sharingStatus.then(resolve(msg)).catch(function (result) {\n statusOfReporter.onLive(subscriber, function () {\n statusOfReporter.unsubscribeLive(subscriber);\n child.share(true);\n share2Reporter(child, subscriber, msg, statusOfReporter);\n }); //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\n });\n };\n\n share2Reporter(dataObjectChild, _this._manager._hypertyURL, msg, reporterStatus);\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n });\n }\n /**\n * [onChange description]\n * @param {Function} callback [description]\n * @return {[type]} [description]\n */\n\n }, {\n key: \"onChange\",\n value: function onChange(callback) {\n var _this = this;\n\n _this._onChange = callback;\n }\n /**\n * This function is used to receive new messages.\n * @param {Function} callback Function to handle with new messages\n * @return {Communication.ChatMessage} m\n */\n\n }, {\n key: \"onMessage\",\n value: function onMessage(callback) {\n var _this = this;\n\n _this._onMessage = callback;\n }\n /**\n * [onUserAdded description]\n * @param {Function} callback [description]\n * @return {[type]} [description]\n */\n\n }, {\n key: \"onUserAdded\",\n value: function onUserAdded(callback) {\n var _this = this;\n\n _this._onUserAdded = callback;\n }\n /**\n * When the an user was removed\n * @param {Function} callback Function handle with the removed user\n * @return {[type]} [description]\n */\n\n }, {\n key: \"onUserRemoved\",\n value: function onUserRemoved(callback) {\n var _this = this;\n\n _this._onUserRemoved = callback;\n }\n /**\n * This function is used to receive requests to close the Group Chat instance.\n * @return {DeleteEvent} The DeleteEvent fired by the Syncher when the Chat is closed.\n */\n\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n var _this = this;\n\n _this._onClose = callback;\n }\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n var _this = this;\n\n _this._onResponse = callback;\n }\n /**\n * This function is used to add / invite new user on an existing Group Chat instance.\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\n */\n\n }, {\n key: \"addUser\",\n value: function addUser(users) {\n var _this = this;\n\n var haveEmptyElements = function haveEmptyElements(element) {\n console.log('Element:', element.length);\n return element.length !== 0;\n };\n\n var notFoundElements = function notFoundElements(element) {\n console.log('user not found: ', element);\n return !(element instanceof String);\n };\n\n return new Promise(function (resolve, reject) {\n if (users.filter(haveEmptyElements).length === 0) {\n return reject('Don\\'t have users to invite');\n }\n\n console.info('[ChatManager.ChatController.addUsers ]: ', users);\n /*_this.search.users(users, domains, ['comm'], ['chat'])\n .then((hypertiesIDs) => {\n if (hypertiesIDs.filter(notFoundElements).length === 0) {\n throw 'User(s) not found';\n }\n let selectedHyperties = hypertiesIDs.map((hyperty) => {\n return hyperty.hypertyID;\n });*/\n\n var usersDiscovery = [];\n var disconnected = [];\n var live = {};\n users.forEach(function (user) {\n var userDiscoveryPromise = _this.discovery.discoverHypertiesDO(user.user, ['comm'], ['chat'], user.domain);\n\n usersDiscovery.push(userDiscoveryPromise);\n });\n Promise.all(usersDiscovery).then(function (userDiscoveryResults) {\n console.log('[ChatManager.ChatController.addUsers] Users Discovery Results->', userDiscoveryResults);\n var selectedHyperties = [];\n userDiscoveryResults.forEach(function (userDiscoveryResult) {\n userDiscoveryResult.forEach(function (discovered) {\n if (discovered.data.status === 'live') {\n selectedHyperties.push(discovered.data.hypertyID);\n live[discovered.data.hypertyID] = discovered;\n } else if (disconnected.length < 5) disconnected.push(discovered);\n });\n });\n console.info('[ChatManager.ChatController]------------------------ Syncher Create ---------------------- \\n');\n console.info('[ChatManager.ChatController]Selected Hyperties: !!! ', selectedHyperties);\n console.info(\"Have \".concat(selectedHyperties.length, \" users;\")); // console.info('[ChatManager] HypertiesIDs ', hypertiesIDs);\n\n var dataObject = _this.controllerMode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n if (disconnected.length > 0) _this._invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObject);\n dataObject.inviteObservers(selectedHyperties);\n if (dataObject.invitations.length > 0) _this._invitationsHandler.processInvitations(live, dataObject);\n return;\n }).then(function () {\n console.info('[ChatManager.ChatController]Are invited with success ' + users.length + ' users;');\n resolve(true);\n }).catch(function (reason) {\n console.error('An error occurred when trying to invite users;\\n', reason);\n reject(reason);\n });\n });\n }\n /**\n * This function is used to request the Reporter to add / invite new user on an existing Group Chat instance.\n * Only Observers are allowed to use this function.\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\n */\n\n }, {\n key: \"addUserReq\",\n value: function addUserReq(users) {\n var _this = this; //check is Observer and invoke observer.execute() with new promise\n\n\n var haveEmptyElements = function haveEmptyElements(element) {\n console.log('Element:', element.length);\n return element.length !== 0;\n };\n\n return new Promise(function (resolve, reject) {\n if (users.filter(haveEmptyElements).length === 0) {\n return reject('[ChatManager.ChatController.addUserReq] Don\\'t have users to add');\n }\n\n if (!_this.controllerMode === 'observer') {\n return reject('[ChatManager.ChatController.addUserReq] only allowed to Chat Observer');\n\n var addUser = _this.addUser(users);\n\n if (_this._dataObjectObserver) {\n addUser = _this._dataObjectObserver.execute('addUser', users);\n }\n\n addUser.then(function () {\n console.info('[ChatManager.ChatController.addUserReq] Request accepted by Reporter ');\n resolve(true);\n }).catch(function (reason) {\n console.error('[ChatManager.ChatController.addUserReq] Request rejected by Reporter;\\n', reason);\n reject(reason);\n });\n }\n });\n }\n }, {\n key: \"onInvitationResponse\",\n value: function onInvitationResponse(callback) {\n var _this = this;\n\n _this._onInvitationResponse = callback;\n _this._invitationsHandler.invitationResponse = callback;\n }\n /**\n * This function is used to remove a user from an existing Group Chat instance.\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\n * @return { boolean} Promise with the status\n */\n\n /**\n * This function is used to remove a user from an existing Group Chat instance.\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\n * @param {URL.UserURL} user User to be removed from the Group Chat that is identified with reTHINK User URL.\n * @return { boolean} It returns as a Promise true if successfully removed or false otherwise.\n */\n\n }, {\n key: \"removeUser\",\n value: function removeUser(user) {\n // TODO: implement the removeUser;\n console.log('[ChatManager.ChatController]Not yet implemented: ', user);\n }\n /**\n * This function is used to close an existing Group Chat instance.\n * Only available to Chat Group Reporters i.e. the Hyperty instance that created the Group Chat.\n * @return {Boolean} It returns as a Promise true if successfully closed or false otherwise.\n */\n\n }, {\n key: \"close\",\n value: function close() {\n var del = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n // TODO: the dataObjectReporter.delete should be a Promise;\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this.controllerMode === 'reporter') {\n // reporter\n _this._invitationsHandler.cleanInvitations(_this.dataObjectReporter).then(function () {\n if (!del) {\n _this._manager.communicationObject.status = 'closed';\n resolve(true);\n } else {\n try {\n delete _this._manager._reportersControllers[_this.dataObjectReporter.url];\n\n _this.dataObjectReporter.delete();\n\n resolve(true);\n if (_this._onClose) _this._onClose({\n code: 200,\n desc: 'deleted',\n url: _this.dataObjectReporter.url\n });\n } catch (e) {\n console.error(e);\n reject(false);\n }\n }\n });\n } else {\n // observer\n if (del) {\n try {\n delete _this._manager._observersControllers[_this.dataObjectObserver.url];\n\n _this.dataObjectObserver.unsubscribe();\n\n resolve(true);\n } catch (e) {\n console.error(e);\n reject(false);\n }\n } else {\n // TODO: send message \n resolve(true);\n }\n }\n });\n }\n }, {\n key: \"invitationsHandler\",\n get: function get() {\n return this._invitationsHandler;\n }\n }, {\n key: \"url\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter.url : this.dataObjectObserver.url;\n }\n }, {\n key: \"dataObjectReporter\",\n set: function set(dataObjectReporter) {\n if (!dataObjectReporter) throw new Error('[ChatController] The data object reporter is necessary parameter ');\n\n var _this = this;\n\n _this.controllerMode = 'reporter'; // Handler to process received files\n // dataObjectReporter.onResponse(function(event) {\n // console.log('[DataObjectReporter - onResponse]', event);\n // if (_this._onInvitationResponse) {\n // _this._onInvitationResponse(event);\n // }\n //\n // });\n\n dataObjectReporter.onSubscription(function (event) {\n switch (event.type) {\n case 'subscribe':\n _this._onSubscribe(event);\n\n break;\n\n case 'unsubscribe':\n _this._onUnsubscribe(event);\n\n break;\n }\n });\n\n _this._setOnAddChildListener(dataObjectReporter);\n\n dataObjectReporter.onRead(function (event) {\n event.accept();\n });\n dataObjectReporter.onExecute(function (event) {\n switch (event.method) {\n case 'addUser':\n _this.addUser(event.params[0]).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n case 'removeUser':\n _this.removeUser(event.params).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n default:\n event.reject('[ChatController.onExecute] Chat method execution not accepted by Reporter');\n break;\n }\n });\n _this._dataObjectReporter = dataObjectReporter;\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectReporter;\n }\n }, {\n key: \"messages\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this._dataObjectReporter._childrenObjects : this._dataObjectObserver._childrenObjects;\n }\n }, {\n key: \"dataObjectObserver\",\n set: function set(dataObjectObserver) {\n var _this = this;\n\n _this.controllerMode = 'observer';\n _this._dataObjectObserver = dataObjectObserver;\n dataObjectObserver.onChange('*', function (event) {\n console.info('[ChatManager.ChatController]Observer - onChange', event);\n\n if (event.field.includes('participants')) {\n switch (event.cType) {\n case 'add':\n if (_this._onUserAdded) _this._onUserAdded(event);\n break;\n\n case 'remove':\n if (_this._onUserRemoved) _this._onUserRemoved(event);\n break;\n }\n }\n\n if (_this._onChange) _this._onChange(event);\n });\n\n _this._setOnAddChildListener(dataObjectObserver); // let childrens = dataObjectObserver.childrens;\n // Object.keys(childrens).forEach((child) => {\n // if (_this._onMessage) _this._onMessage({\n // childId: child,\n // identity: childrens[child].identity,\n // value: childrens[child].data\n // });\n // })\n\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectObserver;\n }\n }, {\n key: \"dataObject\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter : this.dataObjectObserver;\n }\n }, {\n key: \"closeEvent\",\n set: function set(event) {\n var _this = this;\n\n _this._closeEvent = event;\n if (_this._onClose) _this._onClose(event);\n },\n get: function get() {\n var _this = this;\n\n return _this._closeEvent;\n }\n }]);\n\n return ChatController;\n}();\n\n/* harmony default export */ var chatManager_ChatController = (ChatController_ChatController);\n// CONCATENATED MODULE: ./src/chatManager/UserInfo.js\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction UserInfo_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\nvar UserInfo_UserInfo = function UserInfo(hypertyURL, domain, identity) {\n var _ref;\n\n UserInfo_classCallCheck(this, UserInfo);\n\n var completeIdentity = deepClone(identity);\n\n if (!identity.hasOwnProperty('userProfile')) {\n completeIdentity['userProfile'] = identity;\n }\n\n return _ref = {\n hypertyURL: hypertyURL,\n domain: domain\n }, _defineProperty(_ref, \"domain\", domain), _defineProperty(_ref, \"identity\", completeIdentity), _ref;\n};\n// CONCATENATED MODULE: ./src/chatManager/ChatManager.js\nfunction ChatManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ChatManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ChatManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChatManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChatManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Service Framework\n//import IdentityManager from '../identityManager/IdentityManager';\n//import RegistrationStatus from '../discovery/RegistrationStatus';\n//import Discovery from '../discovery/Discovery';\n//import Syncher from '../syncher/Syncher';\n// Utils\n//import {divideURL} from '../utils/utils';\n//import Search from '../utils/Search';\n// Internals\n\n\n\n/**\n* Hyperty Group Chat Manager API (HypertyChat)\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\n* @version 0.1.0\n*/\n\nvar ChatManager_ChatManager =\n/*#__PURE__*/\nfunction () {\n function ChatManager(myUrl, bus, configuration, syncher, factory) {\n ChatManager_classCallCheck(this, ChatManager);\n\n if (!myUrl) throw new Error('[ChatManager.constructor] The myUrl is a needed parameter');\n if (!bus) throw new Error('[ChatManager.constructor] The MiniBus is a needed parameter');\n if (!configuration) throw new Error('[ChatManager.constructor] The configuration is a needed parameter');\n\n var _this = this;\n\n if (!syncher) {\n syncher = factory.createSyncher(myUrl, bus, configuration);\n }\n\n _this._runtimeURL = configuration.runtimeURL;\n var domain = factory.divideURL(_this._runtimeURL).domain;\n var discovery = factory.createDiscovery(myUrl, configuration.runtimeURL, bus);\n var identityManager = factory.createIdentityManager(myUrl, configuration.runtimeURL, bus);\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication';\n _this._reportersControllers = {};\n _this._observersControllers = {};\n _this._myUrl = myUrl;\n _this._bus = bus;\n _this._syncher = syncher;\n _this._domain = domain;\n _this.discovery = discovery;\n _this.identityManager = identityManager;\n _this.currentIdentity;\n _this.search = factory.createSearch(discovery, identityManager);\n _this.communicationObject = communicationObject;\n _this.communicationChildren = communicationChildren;\n console.log('[ChatManager] Discover ', discovery);\n console.log('[ChatManager] Identity Manager ', identityManager);\n }\n\n ChatManager_createClass(ChatManager, [{\n key: \"processNotification\",\n value: function processNotification(event) {\n var _this = this;\n\n console.log('[ChatManager.processNotification: ', event);\n\n if (event.type === 'create') {\n // TODO: replace the 100 for Message.Response\n // event.ack(200);\n if (_this._onInvitation) {\n _this._onInvitation(event);\n }\n }\n\n if (event.type === 'delete') {\n // TODO: replace the 200 for Message.Response\n event.ack(200);\n _this._observersControllers[event.url].closeEvent = event;\n delete _this._observersControllers[event.url];\n _this._observersControllers.closeEvent = event;\n _this.communicationObject = communicationObject;\n\n for (var url in this._reportersControllers) {\n this._reportersControllers[url].close(event);\n }\n\n for (var _url in this._observersControllers) {\n this._observersControllers[_url].close(event);\n }\n }\n }\n }, {\n key: \"myIdentity\",\n value: function myIdentity(identity) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.info('[ChatManager.myIdentity]');\n if (identity) return resolve(identity);\n\n if (_this._myUrl.includes('hyperty://')) {\n _this.identityManager.discoverUserRegistered().then(function (identity) {\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n } else {\n _this.identityManager.discoverIdentityPerIdP().then(function (identity) {\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n }\n });\n }\n /**\n * This function is used to create a new Group Chat providing the name and the identifiers of users to be invited.\n * @param {string} name Is a string to identify the Group Chat\n * @param {array} users Array of users to be invited to join the Group Chat. Users are identified with reTHINK User URL, like this format user:///\n * @return {ChatController} A ChatController object as a Promise.\n */\n\n }, {\n key: \"create\",\n value: function create(name, users) {\n var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var _this = this;\n\n var syncher = _this._syncher;\n return new Promise(function (resolve, reject) {\n _this.communicationObject = communicationObject;\n _this.communicationObject.cseq = 1;\n _this.communicationObject.startingTime = new Date().toJSON();\n _this.communicationObject.status = CommunicationStatus.OPEN;\n var myIdentity;\n\n _this.myIdentity().then(function (identity) {\n myIdentity = identity;\n console.log('[ChatManager.create ] My Identity', identity); // let url = _this.communicationObject.reporter;\n\n var userInfo = new UserInfo_UserInfo(_this._myUrl, _this._domain, identity); // Add my identity\n\n _this.communicationObject.participants[identity.guid] = userInfo;\n console.log('[ChatManager.create ] participants: ', _this.communicationObject.participants);\n console.log('[ChatManager.create ] communicationObject', _this.communicationObject);\n console.info('[ChatManager.create] searching ' + users); //let usersSearch = _this.search.users(users, domains, ['comm'], ['chat']);\n\n var usersDiscovery = [];\n var disconnected = [];\n var live = {};\n users.forEach(function (user) {\n var userDiscoveryPromise = _this.discovery.discoverHypertiesDO(user.user, ['comm'], ['chat'], user.domain);\n\n usersDiscovery.push(userDiscoveryPromise); //if (user.user.includes('://')) mutual = false;\n });\n Promise.all(usersDiscovery).then(function (userDiscoveryResults) {\n console.log('[ChatManager.create] Users Discovery Results->', userDiscoveryResults);\n var selectedHyperties = [];\n userDiscoveryResults.forEach(function (userDiscoveryResult) {\n userDiscoveryResult.forEach(function (discovered) {\n if (discovered.data.status === 'live') {\n selectedHyperties.push(discovered.data.hypertyID);\n live[discovered.data.hypertyID] = discovered;\n } else {\n // To control the number of subscriptions to disconnected devices\n if (disconnected.length < 5) {\n disconnected.push(discovered);\n }\n }\n });\n });\n /* return usersSearch;\n }).then((hypertiesIDs) => {\n let selectedHyperties = hypertiesIDs.map((hyperty) => {\n return hyperty.hypertyID;\n }); */\n\n console.info('[ChatManager] ---------------------- Syncher Create ---------------------- \\n');\n console.info('[ChatManager] Selected Hyperties: !!! ', selectedHyperties);\n console.info(\"Have \".concat(selectedHyperties.length, \" users;\"));\n var mutual = extra.mutual ? extra.mutual : true;\n var input = Object.assign({\n resources: ['chat'],\n mutual: mutual\n }, extra);\n delete input.name;\n if (_this.offline) input.offline = _this.offline;\n console.info('[ChatManager] input data:', input);\n return syncher.create(_this._objectDescURL, selectedHyperties, _this.communicationObject, true, false, name, {}, input);\n }).then(function (dataObjectReporter) {\n console.info('[ChatManager] 3. Return Create Data Object Reporter', dataObjectReporter);\n var chatController = new chatManager_ChatController(syncher, _this.discovery, _this._domain, _this.search, myIdentity, _this);\n chatController.dataObjectReporter = dataObjectReporter;\n _this._reportersControllers[dataObjectReporter.url] = chatController;\n console.log('[ChatManager] chatController invitationsHandler: ', chatController.invitationsHandler); // process invitations to handle not received invitations\n\n if (dataObjectReporter.invitations.length > 0) {\n chatController.invitationsHandler.processInvitations(live, dataObjectReporter);\n } // If any invited User is disconnected let's wait until it is connected again\n\n\n if (disconnected.length > 0) chatController.invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObjectReporter);\n resolve(chatController);\n }).catch(function (reason) {\n reject(reason);\n });\n }).catch(function (reason) {\n console.log('[ChatManager.create] MyIdentity Error:', reason);\n return reject(reason);\n });\n });\n }\n /**\n * This function is used to handle notifications about incoming invitations to join a Group Chat.\n * @param {Function} CreateEvent The CreateEvent fired by the Syncher when an invitaion is received\n */\n\n }, {\n key: \"onInvitation\",\n value: function onInvitation(callback) {\n var _this = this;\n\n _this._onInvitation = callback;\n }\n /**\n * This function is used to join a Group Chat.\n * @param {URL.CommunicationURL} invitationURL The Communication URL of the Group Chat to join that is provided in the invitation event\n * @return {ChatController} It returns the ChatController object as a Promise\n */\n\n }, {\n key: \"join\",\n value: function join(invitationURL) {\n var mutual = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var identity = arguments.length > 2 ? arguments[2] : undefined;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var syncher = _this._syncher;\n var myIdentity;\n console.info('[ChatManager] ------------------------ Syncher subscribe ---------------------- \\n');\n console.info('invitationURL', invitationURL);\n\n _this.myIdentity(identity).then(function (identity) {\n myIdentity = identity;\n var input = {\n schema: _this._objectDescURL,\n resource: invitationURL,\n store: true,\n p2p: false,\n mutual: mutual,\n domain_subscription: true,\n identity: identity\n };\n if (_this.offline) input.offline = _this.offline;\n return syncher.subscribe(input);\n }).then(function (dataObjectObserver) {\n console.info('Data Object Observer: ', dataObjectObserver);\n var chatController = new chatManager_ChatController(syncher, _this.discovery, _this._domain, _this.search, myIdentity, _this);\n resolve(chatController);\n chatController.dataObjectObserver = dataObjectObserver;\n _this._observersControllers[dataObjectObserver.url] = chatController;\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"offline\",\n set: function set(offline) {\n this._offline = offline;\n },\n get: function get() {\n return this._offline ? this._offline : false;\n }\n }]);\n\n return ChatManager;\n}();\n\n/* harmony default export */ var chatManager_ChatManager = (ChatManager_ChatManager);\n// CONCATENATED MODULE: ./src/chatManager/Chat.js\nfunction Chat_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Chat_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Chat_createClass(Constructor, protoProps, staticProps) { if (protoProps) Chat_defineProperties(Constructor.prototype, protoProps); if (staticProps) Chat_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* The Group Chat API is used to control a Group Chat instance.\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\n* @version 0.1.0\n*/\n//import { UserInfo } from './UserInfo';\n//import RegistrationStatus from '../discovery/RegistrationStatus';\n//import InvitationsHandler from './InvitationsHandler';\nvar Chat =\n/*#__PURE__*/\nfunction () {\n function Chat(syncher, domain, identity, manager) {\n Chat_classCallCheck(this, Chat);\n\n if (!syncher) throw Error('Syncher is a necessary dependecy'); // if (!discovery) throw Error('Discover is a necessary dependecy');\n\n if (!domain) throw Error('Domain is a necessary dependecy'); // if (!search) throw Error('Search is a necessary dependecy');\n\n var _this = this;\n\n _this._syncher = syncher; // _this.discovery = discovery;\n // _this.search = search;\n\n _this.myIdentity = identity;\n _this.controllerMode = 'reporter';\n _this.child_cseq = 0;\n _this.domain = domain;\n _this._manager = manager;\n var hypertyURL = syncher.owner;\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication'; // _this._invitationsHandler = new InvitationsHandler(hypertyURL);\n }\n /* get invitationsHandler() {\n return this._invitationsHandler;\n }*/\n\n\n Chat_createClass(Chat, [{\n key: \"_setOnAddChildListener\",\n value: function _setOnAddChildListener(dataObject) {\n var _this = this;\n\n dataObject.onAddChild(function (child) {\n _this.child_cseq += 1;\n console.info('[ChatManager.ChatController._setOnAddChildListener] new Child received: ', child);\n if (_this._onMessage) _this._onMessage(child);\n });\n }\n }, {\n key: \"_onSubscribe\",\n value: function _onSubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n event.accept();\n console.log('[ChatManager.ChatController.onSubscribe] event', event, dataObjectReporter.url);\n console.log('[ChatManager.ChatController.onSubscribe] New user has subscribe this object: ', dataObjectReporter.data, event.identity);\n var identity = JSON.parse(JSON.stringify(event.identity));\n\n if (identity.hasOwnProperty('assertion')) {\n delete identity.assertion;\n }\n\n var userInfo = {\n hypertyURL: event.url,\n domain: event.domain,\n identity: identity\n };\n var userURL = event.identity.userProfile.guid;\n console.log('[ChatManager.ChatController.onSubscribe] new participant', userInfo);\n\n if (event.identity.legacy) {\n userInfo.legacy = event.identity.legacy;\n }\n\n dataObjectReporter.data.participants[userURL] = userInfo;\n console.log('[ChatManager.ChatController.onSubscribe] communicationObject OBJ chatcontroller', dataObjectReporter.data.participants);\n console.log('[ChatManager.ChatController.onSubscribe - onSubscription] ', userInfo); // console.log('[ChatManager.ChatController.onSubscribe - this._onUserAdded] ', this._onUserAdded);\n\n if (this._onUserAdded) this._onUserAdded(userInfo);\n }\n }, {\n key: \"_onUnsubscribe\",\n value: function _onUnsubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n console.log('[ChatManager.ChatController.onUnsubscribe] event', event, dataObjectReporter.url);\n var participant = event.identity.userProfile;\n console.log('[ChatManager.ChatController.onUnsubscribe] participant left', participant);\n\n if (event.identity.legacy) {\n participant.legacy = event.identity.legacy;\n }\n\n delete dataObjectReporter.data.participants[participant.userURL];\n console.log('[ChatManager.ChatController.onUnsubscribe - this._onUserRemoved] ', this.onUserRemoved);\n if (this._onUserRemoved) this._onUserRemoved(participant);\n }\n /**\n * This function is used to send a file.\n * @param {string} file Is the file to be sent.\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\n */\n\n }, {\n key: \"sendFile\",\n value: function sendFile(file) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n var identity = {\n userProfile: _this.myIdentity\n };\n dataObject.addHypertyResource('resources', 'file', file, identity).then(function (resourceFile) {\n var identity = {\n userProfile: _this.myIdentity\n };\n var fileSentEvt = {\n value: resourceFile,\n identity: identity,\n resource: resourceFile\n };\n /* let reporterStatus = new RegistrationStatus(dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus );\n \n // recursive function to sync with chat reporter\n \n let share2Reporter = function(file, subscriber, evt, status) {\n let statusOfReporter = status;\n file.sharingStatus.then(resolve(evt)).catch((result)=>{\n console.log('[ChatManager.ChatController.sendFile] share failed: ', result);\n \n statusOfReporter.onLive( subscriber, () => {\n statusOfReporter.unsubscribeLive(subscriber);\n file.share(true);\n share2Reporter(file, subscriber, evt, statusOfReporter);\n });\n //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\n });\n }*/\n // resourceFile.share(true).then(()=>{\n\n resolve(fileSentEvt); // });\n // share2Reporter(resourceFile, _this._manager._hypertyURL, fileSentEvt, reporterStatus);\n });\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n }\n /**\n * This function is used to send a chat message.\n * @param {string} message Is the ChatMessage to be sent.\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\n */\n\n }, {\n key: \"send\",\n value: function send(message, identity) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n // let _dataObjectChild;\n _this.child_cseq += 1;\n var msg = {\n /* url: dataObject.data.url,\n cseq: _this.child_cseq,\n reporter: dataObject.data.reporter,\n schema: dataObject.data.schema,\n name: dataObject.data.name,\n created : new Date().toJSON(),*/\n type: 'chat',\n content: message\n };\n var sender = identity ? identity : {\n userProfile: _this.myIdentity\n }; // TODO: change chatmessages to resource - chat, file\n // TODO: change message to hypertyResource - https://github.com/reTHINK-project/dev-service-framework/tree/develop/docs/datamodel/data-objects/hyperty-resource\n // TODO: handle with multiple resources - if the \"message\" will be different for each type of resources\n\n dataObject.addChild(msg, sender).then(function (dataObjectChild) {\n console.log('[ChatManager.ChatController][addChild - Chat Message]: ', dataObjectChild); //resolve(dataObjectChild);\n //TODO: move to separate function\n\n var msg = {\n childId: dataObjectChild._childId,\n from: dataObjectChild._owner,\n value: dataObjectChild.data,\n type: 'create',\n identity: sender\n };\n /* let reporterStatus = new RegistrationStatus(dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus );\n \n // recursive function to sync with chat reporter\n \n let share2Reporter = function(child, subscriber, msg, status) {\n let statusOfReporter = status;\n child.sharingStatus.then(resolve(msg)).catch((result)=>{\n \n statusOfReporter.onLive( subscriber, () => {\n statusOfReporter.unsubscribeLive(subscriber);\n child.share(true);\n share2Reporter(child, subscriber, msg, statusOfReporter);\n });\n //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\n });\n }*/\n // share2Reporter(dataObjectChild, _this._manager._hypertyURL, msg, reporterStatus);\n // dataObjectChild.share(true);\n\n resolve(msg);\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n });\n }\n /**\n * [onChange description]\n * @param {Function} callback [description]\n * @return {[type]} [description]\n */\n\n }, {\n key: \"onChange\",\n value: function onChange(callback) {\n var _this = this;\n\n _this._onChange = callback;\n }\n /**\n * This function is used to receive new messages.\n * @param {Function} callback Function to handle with new messages\n * @return {Communication.ChatMessage} m\n */\n\n }, {\n key: \"onMessage\",\n value: function onMessage(callback) {\n var _this = this;\n\n _this._onMessage = callback;\n }\n /**\n * [onUserAdded description]\n * @param {Function} callback [description]\n * @return {[type]} [description]\n */\n\n }, {\n key: \"onUserAdded\",\n value: function onUserAdded(callback) {\n var _this = this;\n\n _this._onUserAdded = callback;\n }\n /**\n * When the an user was removed\n * @param {Function} callback Function handle with the removed user\n * @return {[type]} [description]\n */\n\n }, {\n key: \"onUserRemoved\",\n value: function onUserRemoved(callback) {\n var _this = this;\n\n _this._onUserRemoved = callback;\n }\n /**\n * This function is used to receive requests to close the Group Chat instance.\n * @return {DeleteEvent} The DeleteEvent fired by the Syncher when the Chat is closed.\n */\n\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n var _this = this;\n\n _this._onClose = callback;\n }\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n var _this = this;\n\n _this._onResponse = callback;\n }\n /**\n * This function is used to add / invite new user on an existing Group Chat instance.\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\n */\n\n /* addUser(users) {\n \n let _this = this;\n \n let haveEmptyElements = (element) => {\n console.log('Element:', element.length);\n return element.length !== 0;\n };\n \n let notFoundElements = (element) => {\n console.log('user not found: ', element);\n return !(element instanceof String);\n };\n \n return new Promise(function(resolve, reject) {\n \n if (users.filter(haveEmptyElements).length === 0) {\n return reject('Don\\'t have users to invite');\n }\n \n console.info('[ChatManager.ChatController.addUsers ]: ', users);\n \n /*_this.search.users(users, domains, ['comm'], ['chat'])\n \n .then((hypertiesIDs) => {\n \n if (hypertiesIDs.filter(notFoundElements).length === 0) {\n throw 'User(s) not found';\n }\n \n let selectedHyperties = hypertiesIDs.map((hyperty) => {\n return hyperty.hypertyID;\n });*/\n\n /* let usersDiscovery = [];\n let disconnected = [];\n let live = {};\n \n users.forEach((user) => {\n let userDiscoveryPromise = _this.discovery.discoverHypertiesDO(user.user, ['comm'], ['chat'], user.domain);\n usersDiscovery.push(userDiscoveryPromise);\n });\n \n Promise.all(usersDiscovery).then((userDiscoveryResults) => {\n console.log('[ChatManager.ChatController.addUsers] Users Discovery Results->', userDiscoveryResults);\n \n let selectedHyperties = [];\n \n userDiscoveryResults.forEach((userDiscoveryResult) => {\n \n userDiscoveryResult.forEach((discovered)=>{\n if (discovered.data.status === 'live'){\n selectedHyperties.push(discovered.data.hypertyID);\n live[discovered.data.hypertyID] = discovered;\n }\n else if (disconnected.length < 5) disconnected.push(discovered);\n });\n \n });\n \n console.info('[ChatManager.ChatController]------------------------ Syncher Create ---------------------- \\n');\n console.info('[ChatManager.ChatController]Selected Hyperties: !!! ', selectedHyperties);\n console.info(`Have ${selectedHyperties.length} users;`);\n // console.info('[ChatManager] HypertiesIDs ', hypertiesIDs);\n \n let dataObject = _this.controllerMode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n \n if (disconnected.length > 0) _this._invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObject);\n \n dataObject.inviteObservers(selectedHyperties);\n \n if (dataObject.invitations.length > 0) _this._invitationsHandler.processInvitations(live, dataObject);\n \n return;\n \n })\n .then(() => {\n console.info('[ChatManager.ChatController]Are invited with success ' + users.length + ' users;');\n resolve(true);\n \n \n \n }).catch((reason) => {\n console.error('An error occurred when trying to invite users;\\n', reason);\n reject(reason);\n });\n \n });\n \n }*/\n\n /**\n * This function is used to request the Reporter to add / invite new user on an existing Group Chat instance.\n * Only Observers are allowed to use this function.\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\n */\n\n /* addUserReq(users) {\n \n let _this = this;\n \n //check is Observer and invoke observer.execute() with new promise\n let haveEmptyElements = (element) => {\n console.log('Element:', element.length);\n return element.length !== 0;\n };\n \n return new Promise(function(resolve, reject) {\n \n if (users.filter(haveEmptyElements).length === 0) {\n return reject('[ChatManager.ChatController.addUserReq] Don\\'t have users to add');\n }\n if (!_this.controllerMode === 'observer') {\n return reject('[ChatManager.ChatController.addUserReq] only allowed to Chat Observer');\n \n let addUser = _this.addUser(users);\n \n if (_this._dataObjectObserver) {\n addUser = _this._dataObjectObserver.execute('addUser', users);\n }\n \n addUser.then(() => {\n console.info('[ChatManager.ChatController.addUserReq] Request accepted by Reporter ');\n resolve(true);\n }).catch((reason) => {\n console.error('[ChatManager.ChatController.addUserReq] Request rejected by Reporter;\\n', reason);\n reject(reason);\n });\n }\n \n });\n \n }*/\n\n }, {\n key: \"onInvitationResponse\",\n value: function onInvitationResponse(callback) {\n var _this = this;\n\n _this._onInvitationResponse = callback; // _this._invitationsHandler.invitationResponse = callback;\n }\n /**\n * This function is used to remove a user from an existing Group Chat instance.\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\n * @return { boolean} Promise with the status\n */\n\n /**\n * This function is used to remove a user from an existing Group Chat instance.\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\n * @param {URL.UserURL} user User to be removed from the Group Chat that is identified with reTHINK User URL.\n * @return { boolean} It returns as a Promise true if successfully removed or false otherwise.\n */\n\n }, {\n key: \"removeUser\",\n value: function removeUser(user) {\n // TODO: implement the removeUser;\n console.log('[ChatManager.ChatController]Not yet implemented: ', user);\n }\n /**\n * This function is used to close an existing Group Chat instance.\n * Only available to Chat Group Reporters i.e. the Hyperty instance that created the Group Chat.\n * @return {Boolean} It returns as a Promise true if successfully closed or false otherwise.\n */\n\n }, {\n key: \"close\",\n value: function close() {\n var del = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n // TODO: the dataObjectReporter.delete should be a Promise;\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this.controllerMode === 'reporter') {\n // reporter\n // _this._invitationsHandler.cleanInvitations(_this.dataObjectReporter).then(() => {\n if (!del) {\n _this._manager.communicationObject.status = 'closed';\n resolve(true);\n } else {\n try {\n delete _this._manager._reportersControllers[_this.dataObjectReporter.url];\n\n _this.dataObjectReporter.delete();\n\n resolve(true);\n if (_this._onClose) _this._onClose({\n code: 200,\n desc: 'deleted',\n url: _this.dataObjectReporter.url\n });\n } catch (e) {\n console.error(e);\n reject(false);\n }\n } // });\n\n } else {\n // observer\n if (del) {\n try {\n delete _this._manager._observersControllers[_this.dataObjectObserver.url];\n\n _this.dataObjectObserver.unsubscribe();\n\n resolve(true);\n } catch (e) {\n console.error(e);\n reject(false);\n }\n } else {\n // TODO: send message \n resolve(true);\n }\n }\n });\n }\n }, {\n key: \"url\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter.url : this.dataObjectObserver.url;\n }\n }, {\n key: \"dataObjectReporter\",\n set: function set(dataObjectReporter) {\n if (!dataObjectReporter) throw new Error('[ChatController] The data object reporter is necessary parameter ');\n\n var _this = this;\n\n _this.controllerMode = 'reporter'; // Handler to process received files\n // dataObjectReporter.onResponse(function(event) {\n // console.log('[DataObjectReporter - onResponse]', event);\n // if (_this._onInvitationResponse) {\n // _this._onInvitationResponse(event);\n // }\n //\n // });\n\n dataObjectReporter.onSubscription(function (event) {\n switch (event.type) {\n case 'subscribe':\n _this._onSubscribe(event);\n\n break;\n\n case 'unsubscribe':\n _this._onUnsubscribe(event);\n\n break;\n }\n });\n\n _this._setOnAddChildListener(dataObjectReporter);\n\n dataObjectReporter.onRead(function (event) {\n event.accept();\n });\n dataObjectReporter.onExecute(function (event) {\n switch (event.method) {\n case 'addUser':\n _this.addUser(event.params[0]).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n case 'removeUser':\n _this.removeUser(event.params).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n default:\n event.reject('[ChatController.onExecute] Chat method execution not accepted by Reporter');\n break;\n }\n });\n _this._dataObjectReporter = dataObjectReporter;\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectReporter;\n }\n }, {\n key: \"messages\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this._dataObjectReporter._childrenObjects : this._dataObjectObserver._childrenObjects;\n }\n }, {\n key: \"dataObjectObserver\",\n set: function set(dataObjectObserver) {\n var _this = this;\n\n _this.controllerMode = 'observer';\n _this._dataObjectObserver = dataObjectObserver;\n dataObjectObserver.onChange('*', function (event) {\n console.info('[ChatManager.ChatController]Observer - onChange', event);\n\n if (event.field.includes('participants')) {\n switch (event.cType) {\n case 'add':\n if (_this._onUserAdded) _this._onUserAdded(event);\n break;\n\n case 'remove':\n if (_this._onUserRemoved) _this._onUserRemoved(event);\n break;\n }\n }\n\n if (_this._onChange) _this._onChange(event);\n });\n\n _this._setOnAddChildListener(dataObjectObserver); // let childrens = dataObjectObserver.childrens;\n // Object.keys(childrens).forEach((child) => {\n // if (_this._onMessage) _this._onMessage({\n // childId: child,\n // identity: childrens[child].identity,\n // value: childrens[child].data\n // });\n // })\n\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectObserver;\n }\n }, {\n key: \"dataObject\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter : this.dataObjectObserver;\n }\n }, {\n key: \"closeEvent\",\n set: function set(event) {\n var _this = this;\n\n _this._closeEvent = event;\n if (_this._onClose) _this._onClose(event);\n },\n get: function get() {\n var _this = this;\n\n return _this._closeEvent;\n }\n }]);\n\n return Chat;\n}();\n\n/* harmony default export */ var chatManager_Chat = (Chat);\n// CONCATENATED MODULE: ./src/chatManager/SimpleChatManager.js\nfunction SimpleChatManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SimpleChatManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SimpleChatManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) SimpleChatManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) SimpleChatManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Service Framework\n//import IdentityManager from '../identityManager/IdentityManager';\n//import RegistrationStatus from '../discovery/RegistrationStatus';\n//import Discovery from '../discovery/Discovery';\n//import Syncher from '../syncher/Syncher';\n// Utils\n//import {divideURL} from '../utils/utils';\n//import Search from '../utils/Search';\n// Internals\n\n\n\n/**\n* Hyperty Simple Group Chat Manager API \n* @author Vitor Silva [vitor-t-silva@telecom.pt]\n* @version 0.1.0\n*/\n\nvar SimpleChatManager_SimpleSimpleChatManager =\n/*#__PURE__*/\nfunction () {\n function SimpleSimpleChatManager(myUrl, bus, configuration, syncher, factory) {\n SimpleChatManager_classCallCheck(this, SimpleSimpleChatManager);\n\n if (!myUrl) throw new Error('[SimpleChatManager.constructor] The myUrl is a needed parameter');\n if (!bus) throw new Error('[SimpleChatManager.constructor] The MiniBus is a needed parameter');\n if (!configuration) throw new Error('[SimpleChatManager.constructor] The configuration is a needed parameter');\n\n var _this = this;\n\n if (!syncher) {\n syncher = factory.createSyncher(myUrl, bus, configuration);\n }\n\n _this._runtimeURL = configuration.runtimeURL;\n var domain = factory.divideURL(_this._runtimeURL).domain; // let discovery = factory.createDiscovery(myUrl, configuration.runtimeURL, bus);\n\n var identityManager = factory.createIdentityManager(myUrl, configuration.runtimeURL, bus);\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication';\n _this._reportersControllers = {};\n _this._observersControllers = {};\n _this._myUrl = myUrl;\n _this._bus = bus;\n _this._syncher = syncher;\n _this._domain = domain; // _this.discovery = discovery;\n\n _this.identityManager = identityManager;\n _this.currentIdentity; // _this.search = factory.createSearch(discovery, identityManager);\n\n _this.communicationObject = communicationObject;\n _this.communicationChildren = communicationChildren; // console.log('[SimpleChatManager] Discover ', discovery);\n\n console.log('[SimpleChatManager] Identity Manager ', identityManager);\n }\n\n SimpleChatManager_createClass(SimpleSimpleChatManager, [{\n key: \"processNotification\",\n value: function processNotification(event) {\n var _this = this;\n\n console.log('[SimpleChatManager.processNotification: ', event);\n\n if (event.type === 'create') {\n // TODO: replace the 100 for Message.Response\n // event.ack(200);\n if (_this._onInvitation) {\n _this._onInvitation(event);\n }\n }\n\n if (event.type === 'delete') {\n // TODO: replace the 200 for Message.Response\n event.ack(200);\n _this._observersControllers[event.url].closeEvent = event;\n delete _this._observersControllers[event.url];\n _this._observersControllers.closeEvent = event;\n _this.communicationObject = communicationObject;\n\n for (var url in this._reportersControllers) {\n this._reportersControllers[url].close(event);\n }\n\n for (var _url in this._observersControllers) {\n this._observersControllers[_url].close(event);\n }\n }\n }\n }, {\n key: \"myIdentity\",\n value: function myIdentity(identity) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.info('[SimpleChatManager.myIdentity]');\n if (identity) return resolve(identity);\n\n if (_this._myUrl.includes('hyperty://')) {\n _this.identityManager.discoverUserRegistered().then(function (identity) {\n _this.currentIdentity = identity;\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n } else {\n _this.identityManager.discoverIdentityPerIdP().then(function (identity) {\n _this.currentIdentity = identity;\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n }\n });\n }\n /**\n * This function is used to create a new Group Chat providing the name and the identifiers of users to be invited.\n * @param {string} name Is a string to identify the Group Chat\n * @param {array} hyperties Array of hyperties to be invited to join the Group Chat. Users are identified with reTHINK User URL, like this format user:///\n * @return {ChatController} A ChatController object as a Promise.\n */\n\n }, {\n key: \"create\",\n value: function create(name, hyperties) {\n var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var _this = this;\n\n var syncher = _this._syncher;\n return new Promise(function (resolve, reject) {\n _this.communicationObject = communicationObject;\n _this.communicationObject.cseq = 1;\n _this.communicationObject.startingTime = new Date().toJSON();\n _this.communicationObject.status = CommunicationStatus.OPEN;\n var myIdentity;\n\n _this.myIdentity().then(function (identity) {\n myIdentity = identity;\n console.log('[SimpleChatManager.create ] My Identity', identity); // let url = _this.communicationObject.reporter;\n\n var userInfo = new UserInfo_UserInfo(_this._myUrl, _this._domain, identity); // Add my identity\n\n _this.communicationObject.participants[identity.guid] = userInfo;\n console.log('[SimpleChatManager.create ] participants: ', _this.communicationObject.participants);\n console.log('[SimpleChatManager.create ] communicationObject', _this.communicationObject);\n console.info('[SimpleChatManager] ---------------------- Syncher Create ---------------------- \\n');\n console.info('[SimpleChatManager] Selected Hyperties: !!! ', hyperties); // console.info(`Have ${hyperties.length} users;`);\n\n var mutual = extra.mutual ? extra.mutual : true;\n var input = Object.assign({\n resources: ['chat'],\n mutual: mutual\n }, extra);\n delete input.name;\n if (_this.offline) input.offline = _this.offline;\n if (_this.backup) input.backup = _this.backup;\n console.log('[SimpleChatManager] input data:', input);\n return syncher.create(_this._objectDescURL, hyperties, _this.communicationObject, true, false, name, {}, input);\n }).then(function (dataObjectReporter) {\n console.info('[SimpleChatManager] 3. Return Create Data Object Reporter', dataObjectReporter);\n var chat = new chatManager_Chat(syncher, _this._domain, myIdentity, _this);\n chat.dataObjectReporter = dataObjectReporter;\n _this._reportersControllers[dataObjectReporter.url] = chat; // console.log('[SimpleChatManager] chat invitationsHandler: ', chat.invitationsHandler);\n // process invitations to handle not received invitations\n\n /* if (dataObjectReporter.invitations.length > 0) {\n chat.invitationsHandler.processInvitations(live, dataObjectReporter);\n }\n \n // If any invited User is disconnected let's wait until it is connected again\n if (disconnected.length > 0) chat.invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObjectReporter);\n */\n\n resolve(chat);\n }).catch(function (reason) {\n reject(reason);\n });\n }).catch(function (reason) {\n console.log('[SimpleChatManager.create] MyIdentity Error:', reason);\n return reject(reason);\n }); // });\n }\n /**\n * This function is used to handle notifications about incoming invitations to join a Group Chat.\n * @param {Function} CreateEvent The CreateEvent fired by the Syncher when an invitaion is received\n */\n\n }, {\n key: \"onInvitation\",\n value: function onInvitation(callback) {\n var _this = this;\n\n _this._onInvitation = callback;\n }\n /**\n * This function is used to join a Group Chat.\n * @param {URL.CommunicationURL} invitationURL The Communication URL of the Group Chat to join that is provided in the invitation event\n * @return {ChatController} It returns the ChatController object as a Promise\n */\n\n }, {\n key: \"join\",\n value: function join(invitationURL) {\n var mutual = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var identity = arguments.length > 2 ? arguments[2] : undefined;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var syncher = _this._syncher;\n var myIdentity;\n console.info('[SimpleChatManager] ------------------------ Syncher subscribe ---------------------- \\n');\n console.info('invitationURL', invitationURL);\n\n _this.myIdentity(identity).then(function (identity) {\n myIdentity = identity;\n var input = {\n schema: _this._objectDescURL,\n resource: invitationURL,\n store: true,\n p2p: false,\n mutual: mutual,\n domain_subscription: true,\n identity: identity\n };\n if (_this.offline) input.offline = _this.offline;\n return syncher.subscribe(input);\n }).then(function (dataObjectObserver) {\n console.info('Data Object Observer: ', dataObjectObserver);\n var chat = new chatManager_Chat(syncher, _this._domain, myIdentity, _this);\n resolve(chat);\n chat.dataObjectObserver = dataObjectObserver;\n _this._observersControllers[dataObjectObserver.url] = chat;\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"offline\",\n set: function set(offline) {\n this._offline = offline;\n },\n get: function get() {\n return this._offline ? this._offline : false;\n }\n }, {\n key: \"backup\",\n set: function set(backup) {\n this._backup = backup;\n },\n get: function get() {\n return this._backup ? this._backup : false;\n }\n }]);\n\n return SimpleSimpleChatManager;\n}();\n\n/* harmony default export */ var SimpleChatManager = (SimpleChatManager_SimpleSimpleChatManager);\n// CONCATENATED MODULE: ./src/sandbox/SandboxFactory.js\nfunction SandboxFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SandboxFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SandboxFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) SandboxFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) SandboxFactory_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * Internal component to instantiate framework functionalities.\n */\n\nvar SandboxFactory_SandboxFactory =\n/*#__PURE__*/\nfunction () {\n /* private\n _components: \n */\n function SandboxFactory(bus) {\n SandboxFactory_classCallCheck(this, SandboxFactory);\n\n var _this = this;\n\n _this._bus = bus;\n _this._divideURL = divideURL;\n }\n\n SandboxFactory_createClass(SandboxFactory, [{\n key: \"createSyncher\",\n value: function createSyncher(owner, bus, config) {\n return new syncher_Syncher(owner, bus, config);\n }\n }, {\n key: \"createIdentityManager\",\n value: function createIdentityManager(hypertyURL, runtimeURL, bus) {\n var _this = this;\n\n return new identity_IdentityManager(hypertyURL, runtimeURL, bus);\n }\n }, {\n key: \"createDiscovery\",\n value: function createDiscovery(hypertyURL, runtimeURL, bus) {\n var _this = this;\n\n return new discovery_Discovery(hypertyURL, runtimeURL, bus);\n }\n }, {\n key: \"createSearch\",\n value: function createSearch(discovery, identityManager) {\n var _this = this;\n\n return new utils_Search(discovery, identityManager);\n }\n }, {\n key: \"createContextObserver\",\n value: function createContextObserver(hypertyURL, bus, config, schemes) {\n return new contextManager_ContextObserver(hypertyURL, bus, config, schemes, this);\n }\n }, {\n key: \"createContextReporter\",\n value: function createContextReporter(hypertyURL, bus, config) {\n var _this = this;\n\n return new contextManager_ContextReporter(hypertyURL, bus, config, this);\n }\n }, {\n key: \"createNotificationHandler\",\n value: function createNotificationHandler(bus) {\n var _this = this;\n\n return new syncher_NotificationHandler(bus);\n }\n }, {\n key: \"createMessageBodyIdentity\",\n value: function createMessageBodyIdentity(username, userURL, picture, name, locale, idp, assertion, profile) {\n return new identity_MessageBodyIdentity(username, userURL, picture, name, locale, idp, assertion, profile);\n }\n }, {\n key: \"createChatManager\",\n value: function createChatManager(hypertyURL, bus, configuration, syncher) {\n return new chatManager_ChatManager(hypertyURL, bus, configuration, syncher, this);\n }\n }, {\n key: \"createChatController\",\n value: function createChatController(syncher, discovery, domain, search, identity, manager) {\n return new chatManager_ChatController(syncher, discovery, domain, search, identity, manager);\n }\n }, {\n key: \"createSimpleChatManager\",\n value: function createSimpleChatManager(hypertyURL, bus, configuration, syncher) {\n return new SimpleChatManager(hypertyURL, bus, configuration, syncher, this);\n }\n }, {\n key: \"createChat\",\n value: function createChat(syncher, domain, identity, manager) {\n return new chatManager_Chat(syncher, domain, identity, manager);\n }\n }, {\n key: \"createRegistrationStatus\",\n value: function createRegistrationStatus(observer, runtimeURL, chatUrl, bus) {\n return new discovery_RegistrationStatus(observer, runtimeURL, chatUrl, bus);\n }\n }, {\n key: \"divideURL\",\n get: function get() {\n return this._divideURL;\n }\n }]);\n\n return SandboxFactory;\n}();\n\n/* harmony default export */ var sandbox_SandboxFactory = (SandboxFactory_SandboxFactory);\n// CONCATENATED MODULE: ./src/sandbox/SandboxRegistry.js\nfunction SandboxRegistry_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SandboxRegistry_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SandboxRegistry_createClass(Constructor, protoProps, staticProps) { if (protoProps) SandboxRegistry_defineProperties(Constructor.prototype, protoProps); if (staticProps) SandboxRegistry_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n * @author micaelpedrosa@gmail.com\n * Base class to implement internal deploy manager of components.\n */\n\n/**\n * @author micaelpedrosa@gmail.com\n * Internal component registry of all sandboxes.\n * Process internal request's for component deploy.\n */\n\nvar SandboxRegistry_SandboxRegistry =\n/*#__PURE__*/\nfunction () {\n /* private\n _components: \n */\n function SandboxRegistry(bus) {\n SandboxRegistry_classCallCheck(this, SandboxRegistry);\n\n var _this = this;\n\n _this._bus = bus;\n _this._factory = new sandbox_SandboxFactory(bus);\n _this._components = {};\n bus.addListener(SandboxRegistry.InternalDeployAddress, function (msg) {\n console.log('SandboxRegistry-RCV: ', msg); // let responseMsg = {\n // id: msg.id, type: 'response', from: SandboxRegistry.InternalDeployAddress, to: SandboxRegistry.ExternalDeployAddress\n // };\n\n switch (msg.type) {\n case 'create':\n _this._onDeploy(msg);\n\n break;\n\n case 'delete':\n _this._onRemove(msg);\n\n break;\n }\n });\n }\n\n SandboxRegistry_createClass(SandboxRegistry, [{\n key: \"_responseMsg\",\n value: function _responseMsg(msg, code, value) {\n var _this = this; // let messageFactory = _this.messageFactory;\n //FLOW-OUT: generic response message to external Sandbox (deploy and un-deploy responses)\n\n\n var responseMsg = {\n id: msg.id,\n type: 'response',\n from: SandboxRegistry.InternalDeployAddress,\n to: SandboxRegistry.ExternalDeployAddress\n }; // Chanege the origin message, because the response;\n // msg.from = SandboxRegistry.InternalDeployAddress;\n // msg.to = SandboxRegistry.ExternalDeployAddress;\n\n var body = {};\n if (code) body.code = code;\n if (value) body.desc = value;\n responseMsg.body = body; // return messageFactory.createResponse(msg, code, value);\n\n return responseMsg;\n } //FLOW-IN: message from the runtime core Sandbox -> deployComponent\n\n }, {\n key: \"_onDeploy\",\n value: function _onDeploy(msg) {\n var _this = this;\n\n var config = msg.body.config;\n var componentURL = msg.body.url;\n var sourceCode = msg.body.sourceCode;\n var responseCode;\n var responseDesc;\n\n if (!_this._components.hasOwnProperty(componentURL)) {\n try {\n console.log('SandboxRegistry-onDeploy: ', msg);\n _this._components[componentURL] = _this._create(componentURL, sourceCode, config, _this._factory);\n responseCode = 200;\n } catch (error) {\n responseCode = 500;\n responseDesc = error;\n }\n } else {\n responseCode = 500;\n responseDesc = 'Instance ' + componentURL + ' already exist!';\n }\n\n var responseMsg = _this._responseMsg(msg, responseCode, responseDesc);\n\n _this._bus.postMessage(responseMsg);\n } //FLOW-IN: message from the runtime core Sandbox -> removeComponent\n\n }, {\n key: \"_onRemove\",\n value: function _onRemove(msg) {\n var _this = this;\n\n var componentURL = msg.body.url;\n var responseCode;\n var responseDesc;\n\n if (_this._components.hasOwnProperty(componentURL)) {\n //remove component from the pool and all listeners\n delete _this._components[componentURL];\n\n _this._bus.removeAllListenersOf(componentURL);\n\n responseCode = 200;\n } else {\n responseCode = 500;\n responseDesc = 'Instance ' + componentURL + ' doesn\\'t exist!';\n }\n\n var responseMsg = _this._responseMsg(msg, responseCode, responseDesc);\n\n _this._bus.postMessage(responseMsg);\n }\n /**\n * This method should be implemented by the internal sandbox code.\n * @param {ComponentURL} url URL used for the instance\n * @param {string} sourceCode Code of the component\n * @param {Config} config Configuration parameters\n * @return {Object} Returns instance of the component or throw an error \"throw 'error message'\"\n */\n\n }, {\n key: \"_create\",\n value: function _create(url, sourceCode, config, factory) {//implementation specific\n\n /* example code:\n eval(sourceCode);\n return activate(url, _this._bus, config);\n */\n }\n }, {\n key: \"components\",\n get: function get() {\n return this._components;\n }\n }]);\n\n return SandboxRegistry;\n}();\n\nSandboxRegistry_SandboxRegistry.ExternalDeployAddress = 'hyperty-runtime://sandbox/external';\nSandboxRegistry_SandboxRegistry.InternalDeployAddress = 'hyperty-runtime://sandbox/internal';\n/* harmony default export */ var sandbox_SandboxRegistry = (SandboxRegistry_SandboxRegistry);\n// CONCATENATED MODULE: ./src/bus/Bus.js\nfunction Bus_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Bus_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Bus_createClass(Constructor, protoProps, staticProps) { if (protoProps) Bus_defineProperties(Constructor.prototype, protoProps); if (staticProps) Bus_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log system\n\nvar Bus_log = loglevel[\"getLogger\"]('Bus');\n/**\n* @author micaelpedrosa@gmail.com\n* Minimal interface and implementation to send and receive messages. It can be reused in many type of components.\n* Components that need a message system should receive this class as a dependency or extend it.\n* Extensions should implement the following private methods: _onPostMessage and _registerExternalListener\n*/\n\nvar Bus =\n/*#__PURE__*/\nfunction () {\n /* private\n _msgId: number;\n _subscriptions: \n _responseTimeOut: number\n _responseCallbacks: void>\n */\n function Bus() {\n Bus_classCallCheck(this, Bus);\n\n var _this = this;\n\n _this._msgId = 0;\n _this._subscriptions = {};\n _this._responseTimeOut = 15000; //default to 3s\n\n _this._responseCallbacks = {};\n\n _this._registerExternalListener();\n }\n /**\n * Register listener to receive message when \"msg.to === url\".\n * Special url \"*\" for default listener is accepted to intercept all messages.\n * @param {URL} url Address to intercept, tha is in the message \"to\"\n * @param {Listener} listener listener\n * @return {MsgListener} instance of MsgListener\n */\n\n\n Bus_createClass(Bus, [{\n key: \"addListener\",\n value: function addListener(url, listener) {\n var _this = this;\n\n var item = new MsgListener(_this._subscriptions, url, listener);\n var itemList = _this._subscriptions[url];\n\n if (!itemList) {\n itemList = [];\n _this._subscriptions[url] = itemList;\n }\n\n itemList.push(item);\n return item;\n }\n /**\n * Manually add a response listener. Only one listener per message ID should exist.\n * ATENTION, there is no timeout for this listener.\n * The listener should be removed with a removeResponseListener, failing to do this will result in a unreleased memory problem.\n * @param {URL} url Origin address of the message sent, \"msg.from\".\n * @param {number} msgId Message ID that is returned from the postMessage.\n * @param {Function} responseListener Callback function for the response\n */\n\n }, {\n key: \"addResponseListener\",\n value: function addResponseListener(url, msgId, responseListener) {\n this._responseCallbacks[url + msgId] = responseListener;\n }\n /**\n * Remove the response listener.\n * @param {URL} url Origin address of the message sent, \"msg.from\".\n * @param {number} msgId Message ID that is returned from the postMessage\n */\n\n }, {\n key: \"removeResponseListener\",\n value: function removeResponseListener(url, msgId) {\n delete this._responseCallbacks[url + msgId];\n }\n /**\n * Remove all existent listeners for the URL\n * @param {URL} url Address registered\n */\n\n }, {\n key: \"removeAllListenersOf\",\n value: function removeAllListenersOf(url) {\n delete this._subscriptions[url];\n }\n /**\n * Helper method to bind listeners (in both directions) into other MiniBus target.\n * @param {URL} outUrl Outbound URL, register listener for url in direction \"this -> target\"\n * @param {URL} inUrl Inbound URL, register listener for url in direction \"target -> this\"\n * @param {MiniBus} target The other target MiniBus\n * @return {Bound} an object that contains the properties [thisListener, targetListener] and the unbind method.\n */\n\n }, {\n key: \"bind\",\n value: function bind(outUrl, inUrl, target) {\n var _this2 = this;\n\n var _this = this;\n\n var thisListn = _this.addListener(outUrl, function (msg) {\n target.postMessage(msg);\n });\n\n var targetListn = target.addListener(inUrl, function (msg) {\n _this.postMessage(msg);\n });\n return {\n thisListener: thisListn,\n targetListener: targetListn,\n unbind: function unbind() {\n _this2.thisListener.remove();\n\n _this2.targetListener.remove();\n }\n };\n } //publish on default listeners\n\n }, {\n key: \"_publishOnDefault\",\n value: function _publishOnDefault(msg) {\n //is there any \"*\" (default) listeners?\n var itemList = this._subscriptions['*'];\n\n if (itemList) {\n this._publishOn(itemList, msg);\n }\n } //publish on a subscription list.\n\n }, {\n key: \"_publishOn\",\n value: function _publishOn(itemList, msg) {\n itemList.forEach(function (sub) {\n sub._callback(msg);\n });\n }\n }, {\n key: \"_responseCallback\",\n value: function _responseCallback(inMsg, responseCallback) {\n var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var _this = this; //automatic management of response handlers\n\n\n if (responseCallback) {\n var responseId = inMsg.from + inMsg.id;\n _this._responseCallbacks[responseId] = responseCallback;\n\n if (timeout) {\n setTimeout(function () {\n var responseFun = _this._responseCallbacks[responseId];\n delete _this._responseCallbacks[responseId];\n\n if (responseFun) {\n var errorMsg = {\n id: inMsg.id,\n type: 'response',\n body: {\n code: 408,\n desc: 'Response timeout!',\n value: inMsg\n }\n };\n responseFun(errorMsg);\n }\n }, _this._responseTimeOut);\n }\n }\n } //TODO: provisional responses should reset timeout\n\n }, {\n key: \"_onResponse\",\n value: function _onResponse(msg) {\n var _this = this;\n\n if (msg.type === 'response') {\n var responseId = msg.to + msg.id;\n var responseFun = _this._responseCallbacks[responseId];\n\n if (msg.body.code >= 200) {\n //if it's a provisional response, don't delete response listener\n delete _this._responseCallbacks[responseId];\n }\n\n if (responseFun) {\n responseFun(msg);\n return true;\n }\n }\n\n return false;\n } //receive messages from external interface\n\n }, {\n key: \"_onMessage\",\n value: function _onMessage(msg) {\n var _this = this;\n\n if (!_this._onResponse(msg)) {\n var itemList = _this._subscriptions[msg.to];\n\n if (itemList) {\n _this._publishOn(itemList, msg);\n } else {\n _this._publishOnDefault(msg);\n }\n }\n }\n }, {\n key: \"_genId\",\n value: function _genId(inMsg) {\n //TODO: how do we manage message ID's? Should it be a global runtime counter, or per URL address?\n //Global counter will not work, because there will be multiple MiniBus instances!\n //Per URL, can be a lot of data to maintain!\n //Maybe a counter per MiniBus instance. This is the assumed solution for now.\n if (!inMsg.id || inMsg.id === 0) {\n this._msgId++;\n inMsg.id = this._msgId;\n }\n }\n /**\n * Send messages to local listeners, or if not exists to external listeners.\n * It's has an optional mechanism for automatic management of response handlers.\n * The response handler will be unregistered after receiving the response, or after response timeout (default to 3s).\n * @param {Message} msg Message to send. Message ID is automatically added to the message.\n * @param {Function} responseCallback Optional parameter, if the developer what's automatic response management.\n * @return {number} Returns the message ID, in case it should be needed for manual management of the response handler.\n */\n\n }, {\n key: \"postMessage\",\n value: function postMessage(inMsg, responseCallback) {}\n /**\n * Function to post messages with a number of retries in case timeouts occur.\n * @param {Message} msg Message to send. Message ID is automatically added to the message.\n * @param {Function} responseCallback Optional parameter, if the developer what's automatic response management.\n * @param {integer} retries number of retries when timeouts occur\n * @return {boolean} message delivery result;\n */\n\n }, {\n key: \"postMessageWithRetries\",\n value: function postMessageWithRetries(msg, retries, callback) {\n var _this = this;\n\n var retry = 0; //let timeout = true;\n\n var sendMsg = function sendMsg() {\n return new Promise(function (resolve, reject) {\n _this.postMessage(msg, function (reply) {\n if (reply.body.code === 408 || reply.body.code === 500) reject();else {\n Bus_log.info('[Bus.postMessageWithRetries] msg delivered: ', msg);\n callback(reply);\n resolve();\n }\n });\n });\n };\n\n var tryAgain = function tryAgain() {\n sendMsg().then(function () {\n //timeout = false;\n return;\n }, function () {\n Bus_log.warn(\"[Bus.postMessageWithRetries] Message Bounced (retry \".concat(retry, \"): '\"), msg);\n\n if (retry++ < retries) {\n tryAgain(); // setTimeout(() => { tryAgain(); }, 1000);\n } else {\n var error = \"[Error] Message Bounced (delivery attempts \".concat(retries, \"): '\");\n throw new Error(error + msg);\n }\n });\n };\n\n tryAgain();\n }\n /**\n * Not public available, used by the class extension implementation, to process messages from the public \"postMessage\" without a registered listener.\n * Used to send the message to an external interface, like a WebWorker, IFrame, etc.\n * @param {Message.Message} msg Message\n */\n\n }, {\n key: \"_onPostMessage\",\n value: function _onPostMessage(msg) {}\n /*implementation will send message to external system*/\n\n /**\n * Not public available, used by the class extension implementation, to process all messages that enter the MiniBus from an external interface, like a WebWorker, IFrame, etc.\n * This method is called one time in the constructor to register external listeners.\n * The implementation will probably call the \"_onMessage\" method to publish in the local listeners.\n * DO NOT call \"postMessage\", there is a danger that the message enters in a cycle!\n */\n\n }, {\n key: \"_registerExternalListener\",\n value: function _registerExternalListener() {\n /*implementation will register external listener and call \"this._onMessage(msg)\" */\n }\n }]);\n\n return Bus;\n}();\n\nvar MsgListener =\n/*#__PURE__*/\nfunction () {\n /* private\n _subscriptions: ;\n _url: string;\n _callback: (msg) => void;\n */\n function MsgListener(subscriptions, url, callback) {\n Bus_classCallCheck(this, MsgListener);\n\n var _this = this;\n\n _this._subscriptions = subscriptions;\n _this._url = url;\n _this._callback = callback;\n }\n\n Bus_createClass(MsgListener, [{\n key: \"remove\",\n\n /**\n * Remove this listener from the Bus\n */\n value: function remove() {\n var _this = this;\n\n var subs = _this._subscriptions[_this._url];\n\n if (subs) {\n var index = subs.indexOf(_this);\n subs.splice(index, 1); //if there are no listeners, remove the subscription entirely.\n\n if (subs.length === 0) {\n delete _this._subscriptions[_this._url];\n }\n }\n }\n }, {\n key: \"url\",\n get: function get() {\n return this._url;\n }\n }]);\n\n return MsgListener;\n}();\n\n/* harmony default export */ var bus_Bus = (Bus);\n// CONCATENATED MODULE: ./src/bus/MiniBus.js\nfunction MiniBus_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { MiniBus_typeof = function _typeof(obj) { return typeof obj; }; } else { MiniBus_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return MiniBus_typeof(obj); }\n\nfunction MiniBus_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction MiniBus_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction MiniBus_createClass(Constructor, protoProps, staticProps) { if (protoProps) MiniBus_defineProperties(Constructor.prototype, protoProps); if (staticProps) MiniBus_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction MiniBus_possibleConstructorReturn(self, call) { if (call && (MiniBus_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return MiniBus_assertThisInitialized(self); }\n\nfunction MiniBus_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction MiniBus_getPrototypeOf(o) { MiniBus_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MiniBus_getPrototypeOf(o); }\n\nfunction MiniBus_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) MiniBus_setPrototypeOf(subClass, superClass); }\n\nfunction MiniBus_setPrototypeOf(o, p) { MiniBus_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MiniBus_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* @author micaelpedrosa@gmail.com\n* Message BUS Interface is an extension of the Bus\n* It is used mainly in the internal sandbox routing.\n*/\n\nvar MiniBus =\n/*#__PURE__*/\nfunction (_Bus) {\n MiniBus_inherits(MiniBus, _Bus);\n\n function MiniBus() {\n MiniBus_classCallCheck(this, MiniBus);\n\n return MiniBus_possibleConstructorReturn(this, MiniBus_getPrototypeOf(MiniBus).call(this));\n }\n /**\n * Post a message for routing. Message is routed directly to the external routing _onPostMessage.\n * @param {Message} inMsg JSON with mandatory Message structure {id, type, from, to}\n * @param {Callback} responseCallback Optional callback if a response is expected from the request. A response will be always sent, even if it is a \"Timeout\".\n * @return {number} the Message id\n */\n\n\n MiniBus_createClass(MiniBus, [{\n key: \"postMessage\",\n value: function postMessage(inMsg, responseCallback, timeout) {\n var _this = this;\n\n _this._genId(inMsg);\n\n _this._responseCallback(inMsg, responseCallback, timeout); //always send to external (to core MessageBus)\n\n\n _this._onPostMessage(inMsg);\n\n return inMsg.id;\n } //internal method used when a message is received by an external routing system\n\n }, {\n key: \"_onMessage\",\n value: function _onMessage(msg) {\n var _this = this;\n\n if (!_this._onResponse(msg)) {\n var itemList = _this._subscriptions[msg.to];\n\n if (itemList) {\n _this._publishOn(itemList, msg);\n\n if (!msg.to.startsWith('hyperty')) {\n _this._publishOnDefault(msg);\n }\n } else {\n _this._publishOnDefault(msg);\n }\n }\n }\n }]);\n\n return MiniBus;\n}(bus_Bus);\n\n/* harmony default export */ var bus_MiniBus = (MiniBus);\n// CONCATENATED MODULE: ./src/sandbox/Sandbox.js\nfunction Sandbox_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { Sandbox_typeof = function _typeof(obj) { return typeof obj; }; } else { Sandbox_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return Sandbox_typeof(obj); }\n\nfunction Sandbox_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Sandbox_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Sandbox_createClass(Constructor, protoProps, staticProps) { if (protoProps) Sandbox_defineProperties(Constructor.prototype, protoProps); if (staticProps) Sandbox_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction Sandbox_possibleConstructorReturn(self, call) { if (call && (Sandbox_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return Sandbox_assertThisInitialized(self); }\n\nfunction Sandbox_getPrototypeOf(o) { Sandbox_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return Sandbox_getPrototypeOf(o); }\n\nfunction Sandbox_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction Sandbox_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) Sandbox_setPrototypeOf(subClass, superClass); }\n\nfunction Sandbox_setPrototypeOf(o, p) { Sandbox_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return Sandbox_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n\nvar SandboxType = {\n APP: 'app',\n NORMAL: 'normal',\n WINDOW: 'window'\n};\n/**\n * @author micaelpedrosa@gmail.com\n * Base class to implement external sandbox component\n */\n\nvar Sandbox_Sandbox =\n/*#__PURE__*/\nfunction (_MiniBus) {\n Sandbox_inherits(Sandbox, _MiniBus);\n\n function Sandbox(capabilities) {\n var _this2;\n\n Sandbox_classCallCheck(this, Sandbox);\n\n _this2 = Sandbox_possibleConstructorReturn(this, Sandbox_getPrototypeOf(Sandbox).call(this));\n\n var _this = Sandbox_assertThisInitialized(_this2);\n\n if (capabilities) {\n _this.capabilities = capabilities;\n }\n\n return _this2;\n }\n /**\n * Deploy an instance of the component into the sandbox.\n * @param {string} componentSourceCode Component source code (Hyperty, ProtoStub, etc)\n * @param {URL} componentURL Hyperty, ProtoStub, or any other component address.\n * @param {Config} configuration Config parameters of the component\n * @return {Promise} return deployed if successful, or any other string with an error\n */\n\n\n Sandbox_createClass(Sandbox, [{\n key: \"deployComponent\",\n value: function deployComponent(componentSourceCode, componentURL, configuration) {\n var _this = this; // let messageFactory = _this.messageFactory;\n\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: deploy message for the internal SandboxRegistry -> _onDeploy\n var deployMessage = {\n type: 'create',\n from: sandbox_SandboxRegistry.ExternalDeployAddress,\n to: sandbox_SandboxRegistry.InternalDeployAddress,\n body: {\n url: componentURL,\n sourceCode: componentSourceCode,\n config: configuration\n }\n }; //send message into the sandbox internals and wait for reply\n\n _this.postMessage(deployMessage, function (reply) {\n if (reply.body.code === 200) {\n //is this response complaint with the spec?\n resolve('deployed');\n } else {\n reject(reply.body.desc);\n }\n });\n });\n }\n /**\n * Remove the instance of a previously deployed component.\n * @param {URL} componentURL Hyperty, ProtoStub, or any other component address.\n * @return {Promise} return undeployed if successful, or any other string with an error\n */\n\n }, {\n key: \"removeComponent\",\n value: function removeComponent(componentURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: un-deploy message for the internal SandboxRegistry -> _onRemove\n var removeMessage = {\n type: 'delete',\n from: sandbox_SandboxRegistry.ExternalDeployAddress,\n to: sandbox_SandboxRegistry.InternalDeployAddress,\n body: {\n url: componentURL\n }\n }; //send message into the sandbox internals and wait for reply\n\n _this.postMessage(removeMessage, function (reply) {\n if (reply.body.code === 200) {\n //is this response complaint with the spec?\n resolve('undeployed');\n } else {\n reject(reply.body.desc);\n }\n });\n });\n }\n /**\n * Matches Sandbox capabilities against provided capabilities. Used to check if sandbox provides all required capabilities\n * @param {RuntimeCapabilities} constraints set of RuntimeCapabilities to match with.\n * @return {boolean} return true if constraints are matched false otherwise\n */\n\n }, {\n key: \"matches\",\n value: function matches(constraints) {\n var _this = this;\n\n var filtered = Object.keys(constraints).filter(function (key) {\n return !(_this.capabilities[key] && _this.capabilities[key] === constraints[key]);\n });\n\n if (filtered.length === 0) {\n return true;\n } else {\n return !constraints[filtered];\n }\n }\n }]);\n\n return Sandbox;\n}(bus_MiniBus);\n\n/* harmony default export */ var sandbox_Sandbox = (Sandbox_Sandbox);\n// CONCATENATED MODULE: ./src/allocation/AddressAllocation.js\nfunction AddressAllocation_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction AddressAllocation_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction AddressAllocation_createClass(Constructor, protoProps, staticProps) { if (protoProps) AddressAllocation_defineProperties(Constructor.prototype, protoProps); if (staticProps) AddressAllocation_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log system\n\nvar AddressAllocation_log = loglevel[\"getLogger\"]('address-allocation');\n // TODO: this could not be the best way to do a Singleton but at this moment it works;\n\nvar AddressAllocation_instance;\n/**\n * Class will ask to the message node for addresses\n */\n\nvar AddressAllocation_AddressAllocation =\n/*#__PURE__*/\nfunction () {\n /* private\n _url: URL\n _bus: MiniBus\n */\n\n /**\n * Create an Address Allocation\n * @param {URL.URL} url - url from who is sending the message\n * @param {MiniBus} bus - MiniBus used for address allocation\n */\n function AddressAllocation(url, bus, registry, subscriptionManager) {\n AddressAllocation_classCallCheck(this, AddressAllocation);\n\n if (!AddressAllocation_instance) {\n this._url = url + '/address-allocation';\n this._bus = bus;\n this._registry = registry;\n this._subscriptionManager = subscriptionManager;\n AddressAllocation_instance = this;\n } else {\n return AddressAllocation_instance;\n }\n }\n\n AddressAllocation_createClass(AddressAllocation, [{\n key: \"create\",\n\n /**\n *\n * Ask for creation of a number of Hyperty addresses, to the domain message node.\n *\n * @param {Domain} domain - domain of the message node\n * @param {Number} number - number of address to be allocated\n * @param {Descriptor} info - descriptor to search for the hyperty (TODO:// this should be confirmed)\n * @see https://github.com/reTHINK-project/specs/blob/master/datamodel/core/hyperty-catalogue/readme.md#catalogue-data-model\n * @param {scheme} scheme - scheme of address to be created or reused, like: hyperty, comm, context, etc;\n * @param {boolean|URL.HypertyURL} reuseURL - reuseURL is used to reuse the hypertyURL previously registred;\n * @returns {Promise} this is Promise and returns an object with the address information\n *\n * @memberOf AddressAllocation\n */\n value: function create(domain, number, info, scheme, reuseURL) {\n AddressAllocation_log.log('[AddressAllocation.create] info ', info); //debugger;\n\n if (reuseURL) {\n if (typeof reuseURL === 'boolean') {\n if (reuseURL) {\n return this._reuseAllocatedAddress(domain, number, info, scheme, reuseURL);\n } else {\n return this._allocateNewAddress(domain, scheme, number, info);\n }\n }\n\n if (typeof reuseURL === 'string' && isURL(reuseURL)) {\n //return this._reuseAllocatedAddress(domain, number, info, scheme, reuseURL);\n return new Promise(function (resolve, reject) {\n var value = {\n newAddress: false,\n address: [reuseURL]\n };\n return resolve(value);\n });\n }\n } else {\n AddressAllocation_log.log('[AddressAllocation] - new address will be allocated'); // if there is no URL saved request a new URL\n\n return this._allocateNewAddress(domain, scheme, number, info);\n }\n }\n }, {\n key: \"_reuseAllocatedAddress\",\n value: function _reuseAllocatedAddress(domain, number, info, scheme, reuseURL) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n console.log('REUSETEST - _reuseAllocatedAddress', domain, number, info, scheme, reuseURL);\n\n _this2._registry.checkRegisteredURLs(info, reuseURL).then(function (urls) {\n console.log('REUSETEST - registeredurls', urls);\n\n if (urls) {\n AddressAllocation_log.info('[AddressAllocation - ' + scheme + '] - Reuse URL');\n var value = {\n newAddress: false,\n address: urls\n };\n resolve(value);\n } else {\n if (typeof reuseURL === 'string') {\n AddressAllocation_log.info('[AddressAllocation - reuseURL] - Object ' + reuseURL + ' not found');\n reject('URL Not Found');\n } else if (typeof reuseURL === 'boolean') {\n _this2._allocateNewAddress(domain, scheme, number, info).then(resolve).catch(reject);\n } else {\n reject('URL Not Found');\n }\n }\n });\n });\n }\n }, {\n key: \"_allocateNewAddress\",\n value: function _allocateNewAddress(domain, scheme, number, info) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var addresses = [];\n var i;\n\n for (i = 0; i < number; i++) {\n addresses.push(scheme + '://' + domain + '/' + generateGUID());\n }\n\n var result = {\n newAddress: true,\n address: addresses\n };\n\n if (scheme === 'hyperty') {\n if (info.hasOwnProperty('configuration') && info.configuration.hasOwnProperty('domain_routing') && !info.configuration.domain_routing) resolve(result);else {\n _this._subscriptionManager.createSubscription(domain, addresses, _this._url).then(function () {\n resolve(result);\n });\n }\n } else resolve(result);\n /* let msg = {\n type: 'create', from: this._url, to: 'domain://msg-node.' + domain + '/address-allocation',\n body: {value: { number: number } }\n };\n \n if (scheme !== 'hyperty') msg.body.scheme = scheme;\n \n log.info('[AddressAllocation - ' + scheme + '] - Request new URL');\n \n this._bus.postMessage(msg, (reply) => {\n if (reply.body.code === 200) {\n let result = {newAddress: true, address: reply.body.value.allocated};\n resolve(result);\n } else {\n reject(reply.body.desc);\n }\n });*/\n\n });\n }\n /**\n * Send a request to the domain message node, to deallocate one or more addresses\n * @param {Domain} domain - Domain of the message node.\n * @param {addresses} addresses to request the deallocation\n * @returns {Promise} the response by the message node\n */\n\n }, {\n key: \"delete\",\n value: function _delete(domain, addresses) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n resolve(200);\n /* let message = {\n type: 'delete', from: _this._url, to: 'domain://msg-node.' + domain + '/address-allocation',\n body: {childrenResources: addresses}\n };\n \n _this._bus.postMessage(message, (reply) => {\n if (reply.body.code === 200) {\n resolve(reply.body.code);\n } else {\n reject(reply.body.desc);\n }\n });*/\n });\n }\n }, {\n key: \"url\",\n\n /**\n * get the URL value\n * @return {string} The url value;\n */\n get: function get() {\n return this._url;\n }\n }], [{\n key: \"instance\",\n get: function get() {\n if (!AddressAllocation_instance) {\n throw new Error('The address allocation was not instantiated');\n }\n\n return AddressAllocation_instance;\n }\n }]);\n\n return AddressAllocation;\n}();\n\n/* harmony default export */ var allocation_AddressAllocation = (AddressAllocation_AddressAllocation);\n// CONCATENATED MODULE: ./src/registry/RegistryDataModel.js\nfunction RegistryDataModel_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RegistryDataModel_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RegistryDataModel_createClass(Constructor, protoProps, staticProps) { if (protoProps) RegistryDataModel_defineProperties(Constructor.prototype, protoProps); if (staticProps) RegistryDataModel_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* @author: Gil Dias (gil.dias@tecnico.ulisboa.pt)\n* Registry Data Model includes all Objects to be handled by the Registry functionality including\n*/\nvar RegistryDataModel =\n/*#__PURE__*/\nfunction () {\n function RegistryDataModel(id, url, descriptorURL, p2pRequester, startingTime, lastModified, status, stubs, stubsConfiguration) {\n RegistryDataModel_classCallCheck(this, RegistryDataModel);\n\n var _this = this;\n\n _this._id = id;\n _this._url = url;\n _this._descriptorURL = descriptorURL;\n _this._startingTime = startingTime;\n _this._lastModified = lastModified;\n _this._status = status;\n _this._stubs = stubs;\n _this._stubsConfiguration = stubsConfiguration;\n _this._p2pRequester = p2pRequester;\n }\n\n RegistryDataModel_createClass(RegistryDataModel, [{\n key: \"id\",\n get: function get() {\n var _this = this;\n\n return _this._id;\n }\n }, {\n key: \"url\",\n get: function get() {\n var _this = this;\n\n return _this._url;\n }\n }, {\n key: \"descriptorURL\",\n get: function get() {\n var _this = this;\n\n return _this._descriptorURL;\n }\n }, {\n key: \"p2pRequester\",\n get: function get() {\n var _this = this;\n\n return _this._p2pRequester;\n }\n }, {\n key: \"lastModified\",\n get: function get() {\n var _this = this;\n\n return _this._lastModified;\n }\n }]);\n\n return RegistryDataModel;\n}();\n\n/* harmony default export */ var registry_RegistryDataModel = (RegistryDataModel);\n// CONCATENATED MODULE: ./src/registry/HypertyInstance.js\nfunction HypertyInstance_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { HypertyInstance_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyInstance_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return HypertyInstance_typeof(obj); }\n\nfunction HypertyInstance_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyInstance_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyInstance_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyInstance_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyInstance_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyInstance_possibleConstructorReturn(self, call) { if (call && (HypertyInstance_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return HypertyInstance_assertThisInitialized(self); }\n\nfunction HypertyInstance_getPrototypeOf(o) { HypertyInstance_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyInstance_getPrototypeOf(o); }\n\nfunction HypertyInstance_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction HypertyInstance_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyInstance_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyInstance_setPrototypeOf(o, p) { HypertyInstance_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyInstance_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* @author: Gil Dias (gil.dias@tecnico.ulisboa.pt)\n* HypertyInstance Data Model used to model instances of Hyperties running in devices and servers.\n*/\n\nvar HypertyInstance =\n/*#__PURE__*/\nfunction (_RegistryDataModel) {\n HypertyInstance_inherits(HypertyInstance, _RegistryDataModel);\n\n function HypertyInstance(id, url, descriptorURL, descriptor, hypertyURL, user, guid, runtime, context, p2pHandler, p2pRequester, dataSchemes, resources, startingTime, lastModified) {\n var _this2;\n\n HypertyInstance_classCallCheck(this, HypertyInstance);\n\n _this2 = HypertyInstance_possibleConstructorReturn(this, HypertyInstance_getPrototypeOf(HypertyInstance).call(this, id, url, descriptorURL, p2pRequester, startingTime, lastModified));\n\n var _this = HypertyInstance_assertThisInitialized(_this2);\n\n _this._descriptor = descriptor;\n _this._hypertyURL = hypertyURL;\n _this._user = user;\n _this._guid = guid;\n _this._runtime = runtime;\n _this._context = context;\n _this._p2pHandler = p2pHandler;\n _this._dataSchemes = dataSchemes;\n _this._resources = resources;\n return _this2;\n }\n\n HypertyInstance_createClass(HypertyInstance, [{\n key: \"user\",\n set: function set(identity) {\n var _this = this;\n\n _this.user = identity;\n },\n get: function get() {\n var _this = this;\n\n return _this._user;\n }\n }, {\n key: \"hypertyURL\",\n get: function get() {\n var _this = this;\n\n return _this._hypertyURL;\n }\n }, {\n key: \"descriptor\",\n get: function get() {\n var _this = this;\n\n return _this._descriptor;\n }\n }, {\n key: \"objectName\",\n get: function get() {\n var _this = this;\n\n return _this._descriptor._objectName;\n }\n }, {\n key: \"p2pHandler\",\n get: function get() {\n var _this = this;\n\n return _this._p2pHandler;\n }\n }, {\n key: \"dataSchemes\",\n get: function get() {\n var _this = this;\n\n return _this._dataSchemes;\n }\n }, {\n key: \"resources\",\n get: function get() {\n var _this = this;\n\n return _this._resources;\n }\n }, {\n key: \"runtimeURL\",\n get: function get() {\n var _this = this;\n\n return _this._runtime;\n }\n }]);\n\n return HypertyInstance;\n}(registry_RegistryDataModel);\n\n/* harmony default export */ var registry_HypertyInstance = (HypertyInstance);\n// CONCATENATED MODULE: ./src/registry/DomainRegistration.js\nfunction DomainRegistration_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DomainRegistration_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DomainRegistration_createClass(Constructor, protoProps, staticProps) { if (protoProps) DomainRegistration_defineProperties(Constructor.prototype, protoProps); if (staticProps) DomainRegistration_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar DomainRegistration_log = loglevel[\"getLogger\"]('Registry');\n\n\n/**\n* Runtime DomainRegistration Interface\n*/\n\nvar DomainRegistration_DomainRegistration =\n/*#__PURE__*/\nfunction () {\n /**\n * To initialise the Runtime Registry with the RuntimeURL that will be the basis to derive the internal runtime addresses when allocating addresses to internal runtime component. In addition, the Registry domain back-end to be used to remotely register Runtime components, is also passed as input parameter.\n * @param {MessageBus} messageBus msgbus\n * @param {HypertyRuntimeURL} runtimeURL runtimeURL\n * @param {DomainURL} domain remoteRegistry\n */\n function DomainRegistration(runtimeURL, registryURL, domain, messageBus) {\n DomainRegistration_classCallCheck(this, DomainRegistration);\n\n if (!runtimeURL) throw new Error('runtimeURL is missing.');\n if (!registryURL) throw new Error('registryURL is missing.');\n if (!domain) throw new Error('domain is missing.');\n if (!messageBus) throw new Error('messageBus is missing.');\n\n var _this = this;\n\n _this.registryURL = registryURL;\n _this.runtimeURL = runtimeURL;\n _this._registrationRetries = 5; // number of attempts to register Hyperties and DataObjects when errors occurs\n // the expires in 3600, represents 1 hour\n //the expires is in seconds, unit of measure received by the domain registry\n\n _this.expiresTime = 3600;\n _this._domain = domain;\n _this._messageBus = messageBus;\n }\n /**\n * function to unregister an hypertyInstance in the Domain Registry\n * @param {String} hypertyInstance HypertyInsntance url\n *\n */\n\n\n DomainRegistration_createClass(DomainRegistration, [{\n key: \"unregisterHyperty\",\n value: function unregisterHyperty(hypertyInstance) {\n var _this = this;\n\n var message = {\n type: 'update',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n resource: '/hyperty/' + hypertyInstance,\n value: 'disconnected',\n attribute: 'status'\n }\n };\n\n _this._messageBus.postMessage(message, function (reply) {\n DomainRegistration_log.log('[DomainRegistration] unregister hyperty Reply', reply);\n });\n }\n /**\n * function to unregister a Data Object in the Domain Registry\n * @param {String} hypertyInstance HypertyInsntance url\n *\n */\n\n }, {\n key: \"unregisterDataObject\",\n value: function unregisterDataObject(url) {\n var _this = this;\n\n var message = {\n type: 'update',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n resource: url,\n value: {\n status: 'disconnected'\n }\n }\n };\n\n _this._messageBus.postMessage(message, function (reply) {\n DomainRegistration_log.log('[DomainRegistration] unregister dataObject Reply', reply);\n });\n }\n /**\n * function to delete an dataObjectInstance in the Domain Registry\n * @param {String} name DataObjectName\n */\n\n }, {\n key: \"deleteDataObjectInstance\",\n value: function deleteDataObjectInstance(name) {\n var _this = this;\n\n var message = {\n type: 'delete',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n value: {\n name: name\n }\n }\n };\n\n _this._messageBus.postMessage(message, function (reply) {\n DomainRegistration_log.log('[DomainRegistration] unregister dataObject Reply', reply);\n });\n }\n /**\n * Function to update an Hyperty\n */\n\n }, {\n key: \"updateHypertyInstance\",\n value: function updateHypertyInstance(resource, value) {\n var _this = this;\n\n var message = {\n type: 'UPDATE',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n resource: resource,\n value: value\n }\n };\n\n _this._messageBus.post.postMessage(message, function (reply) {// log.log('[Registry] Updated hyperty reply', reply);\n });\n }\n /**\n * To register a new Data Object in the Domain Registry.\n * @param {JSON} registration registration data to be used\n * @param {boolean} resume if this is just to update the registration with the resume of a data object\n */\n\n }, {\n key: \"registerDataObject\",\n value: function registerDataObject(registration, resume, p2pHandlerStub) {\n var _this = this;\n\n var p2pHandler;\n var p2pRequester;\n return new Promise(function (resolve, reject) {\n var dataScheme = [];\n var filteredDataScheme = registration.url.split(':');\n dataScheme.push(filteredDataScheme[0]);\n\n if (Object.keys(p2pHandlerStub).length !== 0) {\n p2pHandler = p2pHandlerStub[_this.runtimeURL].url;\n p2pRequester = runtimeUtils.runtimeDescriptor.p2pRequesterStub;\n }\n\n registration.startingTime = registration.created;\n delete registration.authorise;\n delete registration.created;\n delete registration.mutual;\n delete registration.resume;\n if (!registration.expires) registration.expires = _this.expiresTime;\n registration.dataSchemes = dataScheme;\n\n if (p2pHandler) {\n registration.p2pHandler = p2pHandler;\n registration.p2pRequester = p2pRequester;\n }\n\n registration.status = 'live';\n var message;\n\n if (!resume) {\n DomainRegistration_log.log('[Registry.registerDataObject] registering new data object URL', registration);\n message = {\n type: 'create',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n value: registration,\n policy: 'policy'\n }\n };\n } else {\n DomainRegistration_log.log('[Registry.registerDataObject] registering previously registered data object URL', registration);\n message = {\n type: 'update',\n to: 'domain://registry.' + _this._domain,\n from: _this.registryURL,\n body: {\n resource: registration.url,\n value: {\n status: 'live'\n }\n }\n };\n }\n\n try {\n _this._messageBus.postMessageWithRetries(message, _this._registrationRetries, function (reply) {\n // log.log('[Registry.registerDataObject] ===> registerDataObject Reply: ', reply);\n if (reply.body.code === 200) {\n resolve(registration);\n } else {\n reject('error on register DataObject');\n }\n });\n } catch (e) {\n DomainRegistration_log.error(e);\n reject(e);\n } //timer to keep the registration alive\n // the time is defined by a little less than half of the expires time defined\n\n\n var keepAliveTimer = setInterval(function () {\n var message = {\n type: 'update',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n resource: registration.url,\n value: {\n status: 'live'\n },\n method: 'refresh'\n }\n };\n\n _this._messageBus.postMessage(message, function (reply) {// log.log('[Registry.registerDataObject] KeepAlive Reply: ', reply);\n });\n }, registration.expires / 1.1 / 2 * 1000);\n });\n }\n /**\n * To register a new Hyperty in the Domain Registry.\n * @param {HypertyInstance} hyperty Hyperty to be registered\n * @param {boolean} resume if this is just to update the registration with the resume of a data object\n */\n\n }, {\n key: \"registerHyperty\",\n value: function registerHyperty(hyperty, resume) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var runtime = _this.runtimeURL;\n var status = 'live'; //message to register the new hyperty, within the domain registry\n\n var message;\n var registrationExpires = _this.expiresTime;\n var messageValue = {\n user: hyperty.user.email,\n descriptor: hyperty.descriptorURL,\n url: hyperty.hypertyURL,\n expires: registrationExpires,\n resources: hyperty.resources,\n dataSchemes: hyperty.dataSchemes,\n runtime: runtime,\n status: status\n }; // set a different expires if defined in the hyperty configuration\n\n if (hyperty.p2pHandler) {\n messageValue.p2pHandler = hyperty.p2pHandler;\n messageValue.p2pRequester = hyperty.p2pRequester;\n } // set a different expires value if configured in the Hyperty descriptor\n\n\n if (hyperty.descriptor.configuration && hyperty.descriptor.configuration.expires) registrationExpires = hyperty.descriptor.configuration.expires;\n\n if (!resume) {\n // log.log('[Registry registerHyperty] registering new Hyperty URL', addressURL.address[0]);\n // set a different expires if defined in the hyperty configuration\n // log.log('[Registry registerHyperty] registering new Hyperty at domain registry ', messageValue);\n message = {\n type: 'create',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n value: messageValue,\n policy: 'policy'\n }\n };\n } else {\n // log.log('[Registry registerHyperty] registering previously registered Hyperty URL', addressURL.address[0]);\n message = {\n type: 'update',\n to: 'domain://registry.' + _this._domain,\n from: _this.registryURL,\n body: {\n resource: hyperty.hypertyURL,\n value: {\n status: 'live',\n user: hyperty.user.email\n }\n }\n };\n\n if (hyperty.p2pHandler) {\n message.body.value.p2pHandler = hyperty.p2pHandler;\n message.body.value.p2pRequester = hyperty.p2pRequester;\n }\n } // log.log('[Registry registerHyperty] Hyperty registration at domain registry - ', message);\n\n\n try {\n _this._messageBus.postMessageWithRetries(message, _this._registrationRetries, function (reply) {\n // log.log('[Registry registerHyperty] Hyperty registration response: ', reply);\n if (reply.body.code === 200) {\n var result = {\n url: hyperty.hypertyURL\n };\n\n if (hyperty.p2pHandler) {\n result.p2pHandler = hyperty.p2pHandler;\n result.p2pRequester = hyperty.p2pRequester;\n }\n\n resolve(result);\n } else if (reply.body.code === 404) {\n // log.log('[Registry registerHyperty] The update was not possible. Registering new Hyperty at domain registry');\n message = {\n type: 'create',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n value: messageValue,\n policy: 'policy'\n }\n };\n\n try {\n _this._messageBus.postMessageWithRetries(message, _this._registrationRetries, function (reply) {\n // log.log('[Registry registerHyperty] Hyperty registration update response: ', reply);\n if (reply.body.code === 200) {\n var _result = {\n url: hyperty.hypertyURL\n };\n\n if (hyperty.p2pHandler) {\n _result.p2pHandler = hyperty.p2pHandler;\n _result.p2pRequester = hyperty.p2pRequester;\n }\n\n resolve(_result);\n } else {\n throw new Error('Failed to register an Hyperty: ' + reply);\n }\n });\n } catch (e) {\n DomainRegistration_log.error(e);\n reject(e);\n }\n } else {\n throw new Error('Failed to register an Hyperty to domain: ', reply);\n }\n });\n } catch (e) {\n DomainRegistration_log.error(e);\n reject(e);\n } //timer to keep the registration alive\n // the time is defined by a little less than half of the expires time defined\n\n\n var keepAliveTimer = setInterval(function () {\n var message = {\n type: 'update',\n from: _this.registryURL,\n to: 'domain://registry.' + _this._domain,\n body: {\n resource: hyperty.hypertyURL,\n value: {\n status: 'live'\n },\n method: 'refresh'\n }\n };\n\n _this._messageBus.postMessage(message, function (reply) {// log.log('[Registry registerHyperty] KeepAlive Reply: ', reply);\n });\n }, registrationExpires / 1.1 / 2 * 1000);\n });\n }\n }]);\n\n return DomainRegistration;\n}();\n\n/* harmony default export */ var registry_DomainRegistration = (DomainRegistration_DomainRegistration);\n// CONCATENATED MODULE: ./src/registry/P2PConnectionResolve.js\nfunction P2PConnectionResolve_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction P2PConnectionResolve_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction P2PConnectionResolve_createClass(Constructor, protoProps, staticProps) { if (protoProps) P2PConnectionResolve_defineProperties(Constructor.prototype, protoProps); if (staticProps) P2PConnectionResolve_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar P2PConnectionResolve_log = loglevel[\"getLogger\"]('P2PConnectionResolve');\n/**\n* To process address resolution for p2p connections\n*/\n\nvar P2PConnectionResolve =\n/*#__PURE__*/\nfunction () {\n function P2PConnectionResolve(registry) {\n P2PConnectionResolve_classCallCheck(this, P2PConnectionResolve);\n\n var _this = this;\n\n _this._registry = registry;\n _this._remoteP2PEntities = {}; // All remote entities and associated runtime url that are reachable with existing p2p connections\n }\n /**\n * Verifies if remote Entity can be reached with a P2P Connection.\n * @param {URL.URL} info object URL\n * @return {HypertyDataObjectInstance} addressURL return the Data Object instance registered URL, return undefined otherwise\n */\n\n\n P2PConnectionResolve_createClass(P2PConnectionResolve, [{\n key: \"checkP2P\",\n value: function checkP2P(msg) {\n if (!msg.hasOwnProperty('to')) {\n // throw Error('The p2p verification was failed');\n return Promise.reject('The p2p verification was failed');\n }\n\n var scheme = msg.to.split('://')[0];\n var comp = msg.to.split('://')[1].split('/')[2];\n var url;\n if (comp) url = msg.to.substring(0, msg.to.indexOf('/' + comp));else url = msg.to;\n var p2p = {};\n if (msg.body && msg.body.p2p) p2p.p2p = msg.body.p2p;\n\n if (msg.body && msg.body.p2pHandler && msg.body.p2pRequester) {\n p2p.p2pHandler = msg.body.p2pHandler;\n p2p.p2pRequester = msg.body.p2pRequester;\n p2p.runtime = msg.body.p2pHandler.split('/p2phandler/')[0];\n }\n\n switch (scheme) {\n case 'runtime':\n return this.checkP2PRuntime(url, p2p);\n break;\n\n default:\n return this.checkP2PEntity(url, p2p);\n break;\n }\n }\n /**\n * Verifies if remote Entity (Hyperty or Data Object) can be reached with a P2P Connection.\n * @param {string} url Remote Entity URL to be checked\n * @param {object} p2p p2p information to be used including ´runtime´ with remote Runtime URL, 'p2pHandler' remote P2P Handler Stub URL and p2pRequester with Catalogue URL of P2P Requester to be used\n * @return {promise} registeredEntity if p2p connection is possible it returns p2p information to be used in the connection, otherwise the promise is rejected\n */\n\n }, {\n key: \"checkP2PEntity\",\n value: function checkP2PEntity(url, p2p) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var remoteEntity = _this._remoteP2PEntities[url];\n if (remoteEntity) resolve(remoteEntity);else if (p2p.runtime) resolve(p2p); // use provided p2p if available in the message body\n else if (p2p.p2p) {\n // otherwise look on Domain Registry\n P2PConnectionResolve_log.log('[Registry - checkP2PEntity] - search in Domain Registry: ', url);\n var message = {\n type: 'read',\n from: _this._registry.registryURL,\n to: 'domain://registry.' + _this._registry._domain,\n body: {\n resource: url\n }\n };\n\n _this._registry._messageBus.postMessage(message, function (reply) {\n P2PConnectionResolve_log.log('[Registry - checkP2PEntity] Domain Registry reply', reply);\n\n if ('value' in reply.body) {\n //todo: store retrieved entity\n var resolvedEntity = reply.body.value;\n\n if (resolvedEntity.hasOwnProperty('p2pHandler')) {\n resolve(resolvedEntity);\n } else {\n reject('[Registry checkP2PEntity] Hyperty found does not support P2P', reply.body.value);\n }\n } else {\n reject('[Registry checkP2PEntity] Hyperty with P2PHandler not found', reply.body.code);\n }\n });\n } else reject('[Registry checkP2PEntity] No P2P Connection available for ', url);\n });\n }\n /**\n * Verifies if remote Runtime can be reached with a P2P Connection.\n * @param {URL.URL} runtimeURL Runtime URL\n * @return {Object} p2pConnection return the P2PConnection instance registered URL, return undefined otherwise\n */\n\n }, {\n key: \"checkP2PRuntime\",\n value: function checkP2PRuntime(runtimeURL, p2p) {\n var _this = this;\n\n var registeredRuntime = {}; // look on locally stored p2p connections\n\n return new Promise(function (resolve, reject) {\n if (_this._registry.p2pConnectionList[runtimeURL]) {\n resolve({\n runtime: runtimeURL\n });\n } else if (p2p.runtime) {\n registeredRuntime = p2p;\n resolve(registeredRuntime);\n } else reject('[Registry.P2PConnectionResolve.checkP2PRuntime] No P2P Connection found to ', runtimeURL);\n });\n }\n /**\n * Verifies if remote Hyperty can be reached with a P2P Connection.\n * @param {JSON} info object or entity charateristics info\n * @return {addressURL} addressURL return the URL if there is any previousy registered URL, return undefined otherwise\n */\n\n }, {\n key: \"checkP2PHyperty\",\n value: function checkP2PHyperty(hypertyURL, p2p) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var hyperty; // look on locally stored hyperties\n\n for (var i in _this._registry.remoteHypertyList) {\n hyperty = _this._registry.remoteHypertyList[i];\n P2PConnectionResolve_log.log('[Registry - checkP2PHyperty] - for each Hyperty: ', hyperty); // todo: change to \"hyperty.url\" to be aligned with hyperty instance data model spec\n\n if (hyperty.hypertyID === hypertyURL) {\n if (hyperty.hasOwnProperty('p2pHandler')) {\n resolve(hyperty);\n } else {\n reject('[Registry checkP2PHyperty] Hyperty found does not support P2P', hyperty);\n }\n\n return;\n }\n }\n\n if (!hyperty && p2p.runtime) resolve(p2p); // use provided p2p if available in the message body\n else if (!hyperty && p2p.p2p) {\n // otherwise look on Domain Registry\n P2PConnectionResolve_log.log('[Registry - checkP2PHyperty] - search in Domain Registry: ', hyperty);\n var message = {\n type: 'read',\n from: _this._registry.registryURL,\n to: 'domain://registry.' + _this._registry._domain,\n body: {\n resource: hypertyURL\n }\n };\n\n _this._registry._messageBus.postMessage(message, function (reply) {\n P2PConnectionResolve_log.log('[Registry - checkP2PHyperty] Domain Registry reply', reply);\n\n if ('value' in reply.body) {\n //todo: store retrieved hyperty\n var resolvedHyperty = reply.body.value;\n\n _this._registry.remoteHypertyList.push(resolvedHyperty);\n\n if (resolvedHyperty.hasOwnProperty('p2pHandler')) {\n resolve(resolvedHyperty);\n } else {\n reject('[Registry checkP2PHyperty] Hyperty found does not support P2P', reply.body.value);\n }\n } else {\n reject('[Registry checkP2PHyperty] Hyperty with P2PHandler not found', reply.body.code);\n }\n });\n } else reject('[Registry checkP2PHyperty] No P2P Connection available for ', hypertyURL);\n });\n }\n /**\n * Verifies if remote Data Object can be reached with a P2P Connection.\n * @param {URL.URL} DataObjectURL object URL\n * @return {HypertyDataObjectInstance} addressURL return the Data Object instance registered URL, return undefined otherwise\n */\n\n }, {\n key: \"checkP2PDataObject\",\n value: function checkP2PDataObject(url, p2p) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n // look on locally stored Remote Data Objects\n var dataobject = _this._registry.remoteDataObjectList.filter(function (i) {\n return _this._registry.remoteDataObjectList[i].url === url;\n });\n\n if (dataobject.length !== 0 && dataobject[0].p2pRequester) {\n resolve(dataobject[0]);\n } else if (dataobject.length !== 0) {\n reject('[Registry checkP2PDataObject] Data Object found does not support P2P', dataobject[0]);\n } else if (dataobject.length === 0 && p2p.runtime) resolve(p2p); // use provided p2p info if available in the message body\n else if (dataobject.length && p2p.p2p) {\n // otherwise look on Domain Registry\n // look on Domain Registry\n var message = {\n type: 'read',\n from: _this._registry.registryURL,\n to: 'domain://registry.' + _this._registry._domain,\n body: {\n resource: url\n }\n };\n\n _this._registry._messageBus.postMessage(message, function (reply) {\n P2PConnectionResolve_log.log('discover data object per url reply', reply);\n\n if ('value' in reply.body) {\n //todo: store retrieved hyperty\n var resolvedDataObject = reply.body.value;\n\n _this._registry.remoteDataObjectList.push(resolvedDataObject);\n\n if (resolvedDataObject.p2pRequester) {\n resolve(resolvedDataObject);\n } else {\n reject('[Registry checkP2PDataObject] Data Object found does not support P2P', reply.body.value);\n }\n } else {\n reject('[Registry checkP2PDataObject] not found', reply.body.code);\n }\n });\n } else reject('[Registry checkP2PDataObject] no P2P Connection found');\n });\n }\n }, {\n key: \"addRemoteP2PEntity\",\n value: function addRemoteP2PEntity(url, runtime) {\n this._remoteP2PEntities[url] = runtime;\n }\n }, {\n key: \"removeRemoteP2PEntity\",\n value: function removeRemoteP2PEntity(url) {\n delete this._remoteP2PEntities[url];\n }\n }, {\n key: \"reconnectP2PRequester\",\n value: function reconnectP2PRequester(p2pRequester) {\n var _this = this;\n\n P2PConnectionResolve_log.log('[P2PConenctionResolve.reconnectP2PRequester] lets try to reconnect P2P Requester Stub: ', p2pRequester);\n return new Promise(function (resolve, reject) {\n var remoteRuntime = p2pRequester.runtime;\n var message = {\n type: 'execute',\n from: _this._registry.registryURL,\n to: p2pRequester.url,\n body: {\n method: 'connect',\n params: [p2pRequester.p2pHandler]\n }\n }; // lets prepare the p2pRequesterSTub reconnect by setting an observer to its status changes\n\n _this._registry.watchingYou.observe('p2pRequesterStub', function (change) {\n P2PConnectionResolve_log.log('[P2PConenctionResolve.reconnectP2PRequester] p2pRequesterStubs changed ' + _this._registry.p2pRequesterStub);\n\n if (change.keypath.split('.')[0] === remoteRuntime && change.name === 'status') {\n switch (change.newValue) {\n case 'live':\n P2PConnectionResolve_log.log('[P2PConenctionResolve.reconnectP2PRequester] p2pRequester is live ' + _this._registry.p2pRequesterStub[remoteRuntime]);\n resolve(_this._registry.p2pRequesterStub[remoteRuntime].url);\n break;\n\n case 'failed':\n P2PConnectionResolve_log.log('[P2PConenctionResolve.reconnectP2PRequester] p2pRequester reconnect failed ' + _this._registry.p2pRequesterStub[remoteRuntime]);\n reject('P2P Requester reconnect failed');\n break;\n\n default:\n }\n }\n }); // stub load\n\n\n _this._registry._messageBus.postMessage(message, function (reply) {\n P2PConnectionResolve_log.log('[P2PConenctionResolve.reconnectP2PRequester] reconnect request reply', reply);\n });\n });\n }\n }]);\n\n return P2PConnectionResolve;\n}();\n\n/* harmony default export */ var registry_P2PConnectionResolve = (P2PConnectionResolve);\n// CONCATENATED MODULE: ./src/utils/WatchingYou.js\nfunction WatchingYou_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction WatchingYou_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction WatchingYou_createClass(Constructor, protoProps, staticProps) { if (protoProps) WatchingYou_defineProperties(Constructor.prototype, protoProps); if (staticProps) WatchingYou_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar WatchingYou =\n/*#__PURE__*/\nfunction () {\n function WatchingYou() {\n WatchingYou_classCallCheck(this, WatchingYou);\n\n this._watching = {};\n this._observers = [];\n }\n\n WatchingYou_createClass(WatchingYou, [{\n key: \"watch\",\n value: function watch(key, object) {\n var _this = this;\n\n var deep = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n if (deep) {\n this._watching[key] = Object.deepObserve(object, function (changes) {\n changes.every(function (change) {\n _this._fireEvent(key, change);\n });\n });\n } else {\n this._watching[key] = Object.observe(object, function (changes) {\n changes.every(function (change) {\n _this._fireEvent(key, change);\n });\n });\n }\n\n return this._watching[key];\n }\n }, {\n key: \"observe\",\n value: function observe(key, callback) {\n this._observers.push({\n key: key,\n callback: callback\n });\n }\n }, {\n key: \"_fireEvent\",\n value: function _fireEvent(key, change) {\n this._observers.filter(function (observe) {\n return observe.key === key;\n }).forEach(function (observe) {\n observe.callback(change);\n });\n }\n }]);\n\n return WatchingYou;\n}();\n\n/* harmony default export */ var utils_WatchingYou = (WatchingYou);\n/*let watchChanges = new WatchChanges();\nlet p2pRequesterStub = watchChanges.watch('p2p', {}, true);\nlet stub = watchChanges.watch('stub', {});\n\nwatchChanges.observe('p2p', (change) => {\n console.log('p2pRequesterStub: ' + change.name + ' - ' + JSON.stringify(change.newValue));\n});\n\nwatchChanges.observe('p2p', (change) => {\n console.log('p2pRequesterStub: ' + change.name + ' - ' + JSON.stringify(change.newValue));\n});\n\nwatchChanges.observe('stub', (change) => {\n console.log('stub ' + change.name);\n});\n\np2pRequesterStub.a = {};\nstub.b = {name: 'vitor'};\np2pRequesterStub.a.name = 'Hello';\nstub.b = {name: 'vitor'};\np2pRequesterStub.a.age = '32';\np2pRequesterStub.a.name = 'World';*/\n// CONCATENATED MODULE: ./src/Utils.js\n\n\n// CONCATENATED MODULE: ./src/registry/Registry.js\nfunction Registry_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { Registry_typeof = function _typeof(obj) { return typeof obj; }; } else { Registry_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return Registry_typeof(obj); }\n\nfunction Registry_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Registry_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Registry_createClass(Constructor, protoProps, staticProps) { if (protoProps) Registry_defineProperties(Constructor.prototype, protoProps); if (staticProps) Registry_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar Registry_log = loglevel[\"getLogger\"]('Registry');\n\n\n\n\n\n\n\n\n // import DiscoveryServiceFramework from './DiscoveryServiceFramework';\n\nvar STATUS = {\n CREATED: 'created',\n LIVE: 'live',\n DEPLOYING: 'deploying',\n DEPLOYED: 'deployed',\n PROGRESS: 'in-progress',\n DISCONNECTED: 'disconnected',\n FAILED: 'deployment-failed',\n DEAD: 'dead'\n};\n/*import IdentityManager from './IdentityManager';\nimport Discovery from './Discovery';*/\n\n/**\n* Runtime Registry Interface\n*/\n\nvar Registry_Registry =\n/*#__PURE__*/\nfunction () {\n /**\n * To initialise the Runtime Registry with the RuntimeURL that will be the basis to derive the internal runtime addresses when allocating addresses to internal runtime component. In addition, the Registry domain back-end to be used to remotely register Runtime components, is also passed as input parameter.\n * @param {MessageBus} msgbus msgbus\n * @param {HypertyRuntimeURL} runtimeURL runtimeURL\n * @param {AppSandbox} appSandbox appSandbox\n * @param {runtimeCatalogue} runtimeCatalogue runtimeCatalogue\n * @param {DomainURL} remoteRegistry remoteRegistry\n * @param {storageManager} storageManager\n */\n function Registry(runtimeURL, appSandbox, identityModule, runtimeCatalogue, runtimeCapabilities, storageManager, p2pHandlerURL, remoteRegistry) {\n Registry_classCallCheck(this, Registry);\n\n // how some functions receive the parameters for example:\n // new Registry('hyperty-runtime://sp1/123', appSandbox, idModule, remoteRegistry);\n // registry.registerStub(sandbox, 'sp1');\n // registry.registerHyperty(sandBox, 'hyperty-runtime://sp1/123');\n // registry.resolve('hyperty-runtime://sp1/123');\n if (!runtimeURL) throw new Error('runtimeURL is missing.');\n if (!storageManager) throw new Error('storageManager is missing.');\n /*if (!remoteRegistry) throw new Error('remoteRegistry is missing');*/\n\n var _this = this;\n\n _this.registryURL = runtimeURL + '/registry/';\n _this.appSandbox = appSandbox;\n _this.runtimeURL = runtimeURL;\n _this.p2pHandlerURL = p2pHandlerURL;\n _this.runtimeCatalogue = runtimeCatalogue;\n _this.remoteRegistry = remoteRegistry;\n _this.idModule = identityModule;\n _this.storageManager = storageManager;\n _this.runtimeCapabilities = runtimeCapabilities;\n _this.identifier = generateGUID();\n _this.hypertiesListToRemove = {};\n _this.hypertiesList = [];\n _this.remoteHypertyList = [];\n _this.remoteDataObjectList = [];\n _this.idpLegacyProxyList = {};\n _this.watchingYou = new utils_WatchingYou();\n _this.p2pHandlerStub = {};\n _this.p2pRequesterStub = _this.watchingYou.watch('p2pRequesterStub', {}, true);\n _this.p2pConnectionList = _this.watchingYou.watch('p2pConnectionList', {}, true);\n _this.p2pHandlerAssociation = {};\n _this.protostubsList = _this.watchingYou.watch('protostubsList', {}, true);\n _this.idpProxyList = _this.watchingYou.watch('idpProxyList', {}, true);\n _this.dataObjectList = {};\n _this.subscribedDataObjectList = {};\n _this.sandboxesList = {\n sandbox: {},\n appSandbox: {}\n };\n _this.pepList = {};\n _this.registries = {};\n _this._domain = divideURL(_this.registryURL).domain;\n _this.sandboxesList.appSandbox[runtimeURL] = appSandbox;\n var p2pConnectionResolve = new registry_P2PConnectionResolve(_this);\n _this._p2pConnectionResolve = p2pConnectionResolve;\n _this._hypertyUrls = {};\n _this._dataObjectUrls = {};\n }\n\n Registry_createClass(Registry, [{\n key: \"loadRegistry\",\n value: function loadRegistry() {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this.storageManager.get('registry:HypertyURLs').then(function (urlsList) {\n if (urlsList) _this._hypertyUrls = urlsList;\n\n _this.storageManager.get('registry:DataObjectURLs').then(function (urlsList) {\n if (urlsList) _this._dataObjectUrls = urlsList;\n resolve();\n });\n });\n });\n }\n }, {\n key: \"_getIdentityAssociated\",\n value: function _getIdentityAssociated(type, hypertyURL) {\n var _this = this;\n\n for (var hyperty in _this.hypertiesList) {\n var value = _this.hypertiesList[hyperty];\n\n if (value._hypertyURL === hypertyURL) {\n switch (type) {\n case 'username':\n return value._user.username;\n\n case 'cn':\n return value._user.cn;\n\n case 'locale':\n return value._user.locale;\n\n case 'avatar':\n return value._user.avatar;\n\n case 'userURL':\n return value._user.userURL;\n\n case '.':\n return value._user;\n\n default:\n return '';\n }\n }\n }\n\n return '';\n }\n /**\n * This function is used to return the sandbox instance where the Application is executing. It is assumed there is just one App per Runtime instance.\n */\n\n }, {\n key: \"getAppSandbox\",\n value: function getAppSandbox() {\n var _this = this;\n\n return _this.appSandbox;\n }\n /**\n * This function returns the user associated to the hyperty URL\n * @param {String} hypertyURL hyperty URL\n * @return {String} userURL user URL\n */\n\n }, {\n key: \"getHypertyOwner\",\n value: function getHypertyOwner(hypertyURL) {\n var _this = this;\n\n var userURL;\n\n for (var index in _this.hypertiesList) {\n var hyperty = _this.hypertiesList[index];\n\n if (hyperty.hypertyURL === hypertyURL) {\n return hyperty.user.userURL;\n }\n }\n\n return userURL;\n }\n /**\n * This function returns the user associated to the hyperty URL\n * @param {String} dataObjectURL dataObjectURL URL\n * @return {String} userURL user URL\n */\n\n }, {\n key: \"getDataObjectReporter\",\n value: function getDataObjectReporter(dataObjectURL) {\n var _this = this;\n\n var DOurl = removePathFromURL(dataObjectURL);\n\n for (var index in _this.dataObjectList) {\n var dataObject = _this.dataObjectList[index];\n\n if (dataObject.url === DOurl) {\n return dataObject.reporter;\n }\n }\n\n return null;\n }\n /**\n * returns the hyperty Name from a given url. This url could be from a dataObject or hyperty\n * @param {String} url hyperty or dataObject URL\n * @return {String} hypertyName hyperty Name\n */\n\n }, {\n key: \"getHypertyName\",\n value: function getHypertyName(url) {\n var _this = this;\n\n var isHypertyURL = divideURL(url).type === 'hyperty'; //value to be returned in the end\n\n var hypertyName; //if is not an hyperty, check if is a dataObject and obtain his reporter\n\n var hypertyURL = isHypertyURL ? url : _this.getReporterURLSynchonous(url);\n\n for (var index in _this.hypertiesList) {\n var hyperty = _this.hypertiesList[index];\n\n if (hyperty.hypertyURL === hypertyURL) {\n hypertyName = hyperty.objectName;\n break;\n }\n }\n\n return hypertyName;\n }\n /**\n * function to return the reporterURL associated with the dataobject URL\n * @param {String} dataObjectURL dataObjectURL\n * @return {String} reporterURL reporterURL\n */\n\n }, {\n key: \"getReporterURL\",\n value: function getReporterURL(dataObjectURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var dataObject = _this.dataObjectList[dataObjectURL];\n\n if (dataObject) {\n resolve(dataObject.reporter);\n } else {\n reject('No reporter was found');\n }\n });\n }\n /**\n * function to return the reporterURL associated with the dataobject URL. no promise returned\n * @param {String} dataObjectURL dataObjectURL\n * @return {String} reporterURL reporterURL\n */\n\n }, {\n key: \"getReporterURLSynchonous\",\n value: function getReporterURLSynchonous(dataObjectURL) {\n var _this = this;\n\n var dataObject = _this.dataObjectList[dataObjectURL];\n return dataObject ? dataObject.reporter : undefined;\n }\n /**\n * returns the hyperty URL that subscribed the dataObject\n * @param {String} url url format\n * @return {String} Hyperty URL subscribed to the URL\n */\n\n }, {\n key: \"getDataObjectSubscriberHyperty\",\n value: function getDataObjectSubscriberHyperty(url) {\n var _this = this;\n\n return _this.subscribedDataObjectList[url];\n }\n /**\n * register a desired dataObject to subscribe\n * @param {String} dataObjectURL dataObject URL\n */\n\n }, {\n key: \"registerSubscribedDataObject\",\n value: function registerSubscribedDataObject(dataObjectURL, hypertyURL) {\n var _this = this;\n\n if (_this.subscribedDataObjectList[dataObjectURL] === undefined) {\n _this.subscribedDataObjectList[dataObjectURL] = hypertyURL;\n }\n }\n /**\n * Function to return the list of pre authorised users received in the creation of a data object\n * @param {String} dataObjectURL dataObjectURL\n * @return {Array} preAuth List of pre authorised users\n */\n\n }, {\n key: \"getPreAuthSubscribers\",\n value: function getPreAuthSubscribers(dataObjectURL) {\n var _this = this;\n\n var dataObject = _this.dataObjectList[dataObjectURL];\n var preAuth = [];\n\n if (dataObject) {\n preAuth = dataObject.authorise;\n }\n\n return preAuth;\n }\n /**\n * send requests to unregister all hyperties registered in domain registry\n * @return {Promise} return a promise if the result of unregistration all hyperties\n */\n\n }, {\n key: \"unregisterAllHyperties\",\n value: function unregisterAllHyperties() {\n var _this = this;\n\n var unregisterResults = [];\n return new Promise(function (resolve, reject) {\n for (var index in _this.hypertiesList) {\n var hyperty = _this.hypertiesList[index];\n\n var result = _this.unregisterHypertyInstance(hyperty.hypertyURL);\n\n unregisterResults.push(result);\n }\n\n Promise.all(unregisterResults).then(function () {\n resolve('successfully unregistered all hyperties');\n }, function (error) {\n reject(error);\n });\n });\n }\n /**\n * function to unregister an hypertyInstance in the Domain Registry\n * @param {String} hypertyInstance HypertyInsntance url\n *\n */\n\n }, {\n key: \"unregisterHypertyInstance\",\n value: function unregisterHypertyInstance(hypertyInstance) {\n //TODO working but the user\n var _this = this;\n\n var closeMsg = {\n type: 'execute',\n from: _this.registryURL,\n to: hypertyInstance,\n body: {\n method: 'close'\n }\n }; // Send message to hyperty to close\n\n _this._messageBus.postMessage(closeMsg, function (reply) {\n Registry_log.log('[Registry.unregisterHypertyInstance] Close Reply', reply);\n\n _this._domainRegistration.unregisterHyperty(hypertyInstance);\n });\n }\n /**\n * function to unregister a Data Object in the Domain Registry\n * @param {String} hypertyInstance HypertyInsntance url\n *\n */\n\n }, {\n key: \"unregisterDataObject\",\n value: function unregisterDataObject(url) {\n this._domainRegistration.unregisterDataObject(url);\n }\n /**\n * register a new subscriber in the dataObject registered\n * @param {String} dataObjectURL dataObject URL\n * @param {String} subscriberURL subscriber URL\n */\n\n }, {\n key: \"registerSubscriber\",\n value: function registerSubscriber(dataObjectURL, subscriberURL) {\n var _this = this;\n\n var dataObject = _this.dataObjectList[dataObjectURL];\n\n if (dataObject) {\n if (!dataObject.subscribers) dataObject.subscribers = [];\n dataObject.subscribers.push(subscriberURL);\n _this.dataObjectList[dataObjectURL] = dataObject;\n }\n }\n /**\n * get the subscribers registered within a dataObject\n * @param {String} dataObjectURL dataObject URL\n * @param {Array} Substribers List\n */\n\n }, {\n key: \"getDataObjectSubscribers\",\n value: function getDataObjectSubscribers(dataObjectURL) {\n var _this = this;\n\n var dataObject = _this.dataObjectList[dataObjectURL];\n\n if (dataObject) {\n return dataObject.subscribers;\n } else {\n throw 'No dataObject was found';\n }\n }\n /**\n * To register a new Data Object in the runtime which returns the dataObjectURL allocated to the new Data Object.\n * @param {String} identifier identifier\n * @param {String} dataObjectschema dataObjectschema\n * @param {String} dataObjectUrl dataObjectUrl\n * @param {String} dataObjectReporter dataObjectReporter\n * @param {Array} resources dataObject resources\n * @param {Array} authorise list of pre authorised authorised IDs\n */\n //registerDataObject(identifier, dataObjectschema, dataObjectUrl, dataObjectReporter, resources, addressURL, authorise) {\n\n }, {\n key: \"registerDataObject\",\n value: function registerDataObject(objectRegistration) {\n var _this = this;\n\n var registration = deepClone(objectRegistration);\n return new Promise(function (resolve, reject) {\n _this.dataObjectList[objectRegistration.url] = objectRegistration; // _this.storageManager.get('registry:DataObjectURLs').then((urlsList) => {\n\n /* if (!urlsList) {\n urlsList = {};\n }*/\n //update the list with the new elements\n\n _this._dataObjectUrls[objectRegistration.name + objectRegistration.schema + objectRegistration.resources + objectRegistration.reporter] = objectRegistration.url; // step to obtain the list of all URL registered to updated with the new one.\n\n _this.storageManager.set('registry:DataObjectURLs', 0, _this._dataObjectUrls).then(function () {\n if (_this.isInterworkingProtoStub(registration.reporter)) {\n registration.interworking = true;\n }\n\n var domainRegistration = true;\n if (registration.hasOwnProperty(\"domain_registration\")) domainRegistration = registration.domain_registration;\n if (domainRegistration) _this._domainRegistration.registerDataObject(registration, objectRegistration.resume, _this.p2pHandlerStub).then(function (registered) {\n resolve(registered);\n });else resolve(registration);\n }).catch(function (reason) {\n Registry_log.error('[Registry registerDataObject] Error: ', reason);\n reject(reason);\n });\n }); // });\n }\n }, {\n key: \"_getResourcesAndSchemes\",\n value: function _getResourcesAndSchemes(descriptor) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var resources; // check if the hyperty resources is a vector or a string\n // TODO delete later when catalogue is fixed\n\n if (typeof descriptor.hypertyType === 'string') {\n resources = [];\n resources.push(descriptor.hypertyType);\n } else {\n resources = descriptor.hypertyType;\n }\n\n var objName = descriptor.objectName;\n var descriptorDataSchema = descriptor.dataObjects;\n var dataSchemasArray = []; //this will create a array with a Promise in each position\n\n for (var index in descriptorDataSchema) {\n dataSchemasArray.push(_this.runtimeCatalogue.getDataSchemaDescriptor(descriptorDataSchema[index]));\n } // as soon as the previous array is completed, this will wait for the resolve of all promises in the array\n\n\n Promise.all(dataSchemasArray).then(function (dataSchemas) {\n var filteredDataSchemas = [];\n\n for (var _index in dataSchemas) {\n var dataSchema = dataSchemas[_index];\n filteredDataSchemas.push(dataSchema.sourcePackage.sourceCode.properties.scheme);\n } // log.log('[Registry] Hyperty Schemas', filteredDataSchemas);\n // log.log('[Registry] Hyperty resources', resources);\n\n\n resolve({\n resources: resources,\n dataSchema: filteredDataSchemas,\n name: objName\n });\n });\n });\n }\n /**\n * method that returns previously registered Hyperty or DataObjects URLS, for given characteristics\n * @param {JSON} info object or hyperty charateristics info\n * @return {addressURL} addressURL return the URL if there is any previousy registered URL, return undefined otherwise\n */\n\n }, {\n key: \"checkRegisteredURLs\",\n value: function checkRegisteredURLs(info, reuseURL) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var objectType = info.reporter ? 'registry:DataObjectURLs' : 'registry:HypertyURLs';\n\n if (typeof reuseURL === 'string') {\n objectType = reuseURL && divideURL(reuseURL).type !== 'hyperty' ? 'registry:DataObjectURLs' : 'registry:HypertyURLs';\n } //debugger;\n\n\n _this.storageManager.get(objectType).then(function (urlsList) {\n if (!urlsList) {\n urlsList = {};\n }\n\n if (typeof reuseURL === 'string') {\n Registry_log.info('[Registry - checkRegisteredURLs] - look for ' + reuseURL + ' on ', urlsList);\n var searchResult = Object.keys(urlsList).map(function (key) {\n var indexOf = urlsList[key].indexOf(reuseURL);\n return urlsList[key][indexOf];\n });\n Registry_log.info('[Registry - checkRegisteredURLs] - found ' + searchResult.length + ' results on ', searchResult);\n\n if (searchResult.length === 1) {\n return resolve(searchResult);\n } else {\n return resolve(undefined);\n }\n }\n\n if (objectType === 'registry:HypertyURLs') {\n _this._getResourcesAndSchemes(info).then(function (value) {\n if (urlsList[value.resources + value.dataSchema + value.name]) {\n // log.log('[Registry] reusage of hyperty URL');\n return resolve(urlsList[value.resources + value.dataSchema + value.name]);\n } else {\n // log.log('[Registry] no hyperty URL was previously registered ');\n return resolve(undefined);\n }\n });\n } else {\n var characteristics = info.name + info.schema + info.resources + info.reporter;\n\n if (urlsList[characteristics]) {\n // log.log('[Registry] reusage of dataObject URL');\n if (typeof urlsList[characteristics] === 'string') {\n var arrayToResolve = [];\n arrayToResolve.push(urlsList[characteristics]);\n return resolve(arrayToResolve);\n } else {\n return resolve(urlsList[characteristics]);\n }\n } else {\n // log.log('[Registry] no dataObject URL was previously registered');\n return resolve(undefined);\n }\n }\n });\n });\n }\n /**\n * To register a new Hyperty in the runtime which returns the HypertyURL allocated to the new Hyperty.\n * @param {Sandbox} sandbox sandbox\n * @param {HypertyCatalogueURL} HypertyCatalogueURL descriptor\n * @param {object} IdpConstraint - constraints to be used when selecting the identity to be associated with the Hyperty including origin, idp, and idHint.\n * @return {HypertyURL} HypertyURL\n */\n\n }, {\n key: \"registerHyperty\",\n value: function registerHyperty(sandbox, importPath, descriptor, addressURL, IdpConstraint) {\n var _this = this;\n\n var hypertyCapabilities;\n return new Promise(function (resolve, reject) {\n _this.idModule.getIdentityAssertion(IdpConstraint).then(function (result) {\n var userProfile = result.userProfile; // log.log('[Registry registerHyperty] userProfile', userProfile);\n\n if (_this._messageBus === undefined) {\n reject('[Registry registerHyperty] MessageBus is undefined');\n } else {\n //call check if the protostub exist: to be removed\n\n /* _this.resolve(domainUrl).then(function(a) {\n // log.log('[Registry registerHyperty] stub to domain registry- ', a);*/\n // _this.storageManager.get('registry:HypertyURLs').then((urlsList) => {\n // log.log('[Registry registerHyperty] storageManager] - ', urlsList);\n _this._getResourcesAndSchemes(descriptor).then(function (value) {\n hypertyCapabilities = value;\n /* if (!urlsList) {\n urlsList = {};\n }*/\n\n _this._hypertyUrls[hypertyCapabilities.resources + hypertyCapabilities.dataSchema + hypertyCapabilities.name] = addressURL.address;\n\n _this.storageManager.set('registry:HypertyURLs', 0, _this._hypertyUrls).then(function () {\n //check whether the received sanbox e ApplicationSandbox or a normal sandbox\n if (sandbox.type === 'app') {\n _this.sandboxesList.appSandbox[addressURL.address[0]] = sandbox;\n } else if (sandbox.type === 'normal') {\n _this.sandboxesList.sandbox[addressURL.address[0]] = sandbox;\n } else {\n reject('Wrong SandboxType');\n }\n\n var p2pHandler;\n var p2pRequester;\n\n if (Object.keys(_this.p2pHandlerStub).length !== 0) {\n p2pHandler = _this.p2pHandlerStub[_this.runtimeURL].url;\n p2pRequester = runtimeUtils.runtimeDescriptor.p2pRequesterStub;\n }\n\n var hyperty = new registry_HypertyInstance(_this.identifier, _this.registryURL, importPath, descriptor, addressURL.address[0], userProfile, 'guid', _this.runtimeURL, 'ctx', p2pHandler, p2pRequester, hypertyCapabilities.dataSchema, hypertyCapabilities.resources);\n\n _this.hypertiesList.push(hyperty);\n /*--- start here move p2p and domain registry related features to a separated function.-------..*/\n\n\n var registrationAtdomain = true;\n\n if (descriptor.hasOwnProperty(\"configuration\") && descriptor.configuration.hasOwnProperty(\"domain_registration\")) {\n registrationAtdomain = descriptor.configuration.domain_registration;\n }\n\n if (registrationAtdomain) _this._domainRegistration.registerHyperty(hyperty, addressURL.newAddress).then(function (registered) {\n resolve(registered);\n });else resolve({\n url: hyperty.hypertyURL\n });\n /*------------------- END HERE MOVE DOMAIN REGISTRY ------------------*/\n }).catch(function (reason) {\n // log.log('[Registry registerHyperty] Error: ', reason);\n reject(reason);\n });\n }); // });\n\n }\n }, function (err) {\n reject('[Registry registerHyperty] ', err);\n });\n });\n }\n /**\n * To unregister a previously registered Hyperty\n * @param {HypertyURL} HypertyURL url url\n */\n\n }, {\n key: \"unregisterHyperty\",\n value: function unregisterHyperty(url) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var found = false;\n var index = 0;\n\n for (index = 0; index < _this.hypertiesList.length; index++) {\n var hyperty = _this.hypertiesList[index];\n\n if (hyperty !== undefined) {\n if (hyperty.hypertyURL === url) {\n found = true;\n break;\n }\n }\n }\n\n if (found === false) {\n reject('Hyperty not found');\n } else {\n delete _this.hypertiesList[index];\n resolve('Hyperty successfully deleted');\n }\n });\n }\n /**\n * To discover protocol stubs available in the runtime for a certain domain. If available, it returns the runtime url for the protocol stub that connects to the requested domain. Required by the runtime BUS to route messages to remote servers or peers (do we need something similar for Hyperties?).\n * @param {DomainURL} DomainURL url\n * @return {RuntimeURL} RuntimeURL\n */\n\n }, {\n key: \"discoverProtostub\",\n value: function discoverProtostub(url) {\n if (!url) throw new Error('Parameter url needed');\n\n var _this = this;\n\n var dividedURL = divideURL(url);\n var domainURL = dividedURL.domain;\n\n if (_this.protostubsList.hasOwnProperty(domainURL) && _this.protostubsList[domainURL].status === STATUS.LIVE) {\n return _this.protostubsList[domainURL];\n } else {\n _this.protostubsList[domainURL] = {\n status: STATUS.DEPLOYING\n };\n throw new Error('[Registry - discoverProtoStub ] Message Node Protostub Not Found. Creating one');\n }\n }\n /**\n * To discover protocol stubs available in the runtime for a certain remote runtime URL. If available, it returns the runtime url for the protocol stub that connects to the requested domain.\n * Required by the runtime BUS to route messages to remote servers or peers (do we need something similar for Hyperties?).\n * @param {RuntimeURL} RuntimeURL url\n * @return {p2pRequester} RuntimeURL\n */\n\n }, {\n key: \"discoverP2PStub\",\n value: function discoverP2PStub(runtimeURL) {\n var _this = this;\n\n if (runtimeURL) {\n if (_this.p2pRequesterStub.hasOwnProperty(runtimeURL) && _this.p2pRequesterStub[runtimeURL].status === STATUS.LIVE) {\n return _this.p2pRequesterStub[runtimeURL];\n } else {\n _this.p2pRequesterStub[runtimeURL] = {\n status: STATUS.CREATED\n };\n throw new Error('[Registry - discoverP2PStub ] P2P Requester Stub Not Found. Creating one');\n }\n } else {\n if (_this.p2pHandlerStub.hasOwnProperty(_this.runtimeURL)) {\n return _this.p2pHandlerStub[_this.runtimeURL];\n } else {\n _this.p2pHandlerStub[_this.runtimeURL] = {\n status: STATUS.CREATED\n };\n throw new Error('[Registry - discoverP2PStub ] P2P Handler Stub Not Found.');\n }\n }\n }\n /**\n * To register a new Protocol Stub in the runtime including as input parameters the function to postMessage, the DomainURL that is connected with the stub, which returns the RuntimeURL allocated to the new ProtocolStub.\n * @param {Sandbox} Sandbox\n * @param {stubID} Domain or hyperty runtime to register the stub\n * @param {descriptorURL} Catalogue URL of the Protostub descriptor\n * @param {descriptor} Protostub descriptor\n * @return {RuntimeProtoStubURL}\n */\n\n }, {\n key: \"registerStub\",\n value: function registerStub(sandbox, stubID, p2pConfig, descriptorURL, descriptor) {\n var _this = this;\n\n var _stubDescriptor = descriptor;\n return new Promise(function (resolve, reject) {\n var runtimeProtoStubURL; //check if messageBus is registered in registry or not\n\n if (_this._messageBus === undefined) {\n reject('MessageBus not found on registerStub');\n }\n\n Registry_log.info('[Registry - registerStub] - stubID ', stubID);\n /* if (!stubID.indexOf('msg-node.')) {\n stubID = stubID.substring(stubID.indexOf('.') + 1);\n }*/\n\n var P2PRequesterStub;\n\n if (p2pConfig) {\n if (p2pConfig.hasOwnProperty('isHandlerStub') && p2pConfig.isHandlerStub) {\n runtimeProtoStubURL = _this.p2pHandlerURL;\n _this.p2pHandlerStub[stubID] = {\n url: runtimeProtoStubURL,\n status: STATUS.CREATED\n };\n _this.p2pHandlerAssociation[_this.runtimeURL] = [];\n _this.sandboxesList.sandbox[runtimeProtoStubURL] = sandbox;\n Registry_log.info('[Registry - registerStub - P2PHandlerStub] - ', stubID, ' - ', runtimeProtoStubURL);\n resolve(_this.p2pHandlerStub[stubID]);\n } else {\n P2PRequesterStub = p2pConfig.p2pRequesterStub;\n runtimeProtoStubURL = 'runtime://' + divideURL(p2pConfig.remoteRuntimeURL).domain + '/p2prequester/' + generateGUID();\n Registry_log.info('[Registry - registerStub - P2PRequesterStub] - ', P2PRequesterStub, ' - ', runtimeProtoStubURL); // to be clarified what is this p2pHandlerAssociation\n\n _this.p2pHandlerAssociation[_this.runtimeURL].push(runtimeProtoStubURL);\n\n _this.p2pRequesterStub[stubID] = {\n url: runtimeProtoStubURL,\n status: STATUS.CREATED\n };\n _this.sandboxesList.sandbox[runtimeProtoStubURL] = sandbox; //Setup P2P Requester path into MN\n\n var msg = {\n type: 'subscribe',\n from: _this.registryURL,\n to: 'domain://msg-node.' + _this._domain + '/sm',\n body: {\n subscribe: [runtimeProtoStubURL],\n source: _this.registryURL\n }\n };\n\n _this._messageBus.postMessage(msg, function (reply) {// log.log('[Registry - register Stub] p2pRequester path setup: ', reply);\n });\n\n resolve(_this.p2pRequesterStub[stubID]);\n }\n } else {\n console.log('[Registry - registerStub - Normal Stub] descriptor', descriptor);\n\n if (!Registry_typeof(descriptor) === 'string' && descriptor.hasOwnProperty('_interworking') && descriptor._interworking) {\n runtimeProtoStubURL = 'runtime://' + stubID + '/protostub/' + 'scheme1';\n } else {\n runtimeProtoStubURL = 'runtime://' + stubID + '/protostub/' + generateGUID();\n }\n\n Registry_log.info('[Registry - registerStub - Normal Stub] - ', stubID); // TODO: Optimize this\n\n _this.protostubsList[stubID] = {\n url: runtimeProtoStubURL,\n status: STATUS.DEPLOYING\n };\n\n if (descriptorURL) {\n _this.protostubsList[stubID].descriptorURL = descriptorURL;\n }\n\n if (_stubDescriptor && _stubDescriptor.interworking) {\n _this.protostubsList[stubID].interworking = _stubDescriptor.interworking;\n }\n\n _this.sandboxesList.sandbox[runtimeProtoStubURL] = sandbox;\n resolve(_this.protostubsList[stubID]);\n } // resolve(runtimeProtoStubURL);\n\n\n _this._messageBus.addListener(runtimeProtoStubURL + '/status', function (msg) {\n _this._onProtostubStatusEvent(msg);\n });\n });\n }\n /**\n * To Process status events fired by protostubs\n * @param {Message} message Event Message\n */\n\n }, {\n key: \"_onProtostubStatusEvent\",\n value: function _onProtostubStatusEvent(msg) {\n var _this = this; // log.log('[Registry onProtostubStatusEvent]: ', msg);\n\n\n var runtimeProtoStubURL = msg.from;\n\n if (!msg.to.includes('/status')) {\n Registry_log.error('[Registry onProtostubStatusEvent] Not Status Event: ', msg);\n return;\n } else {\n // broadcast Protostub status event to all Hyperties\n var from = msg.from;\n msg.from = _this.runtimeURL;\n msg.to = _this.runtimeURL + '/status';\n msg.body.resource = from;\n\n _this._messageBus.postMessage(msg);\n } // process status events from message node protostubs\n\n\n if (runtimeProtoStubURL.includes('/protostub/')) {\n // TODO: uncomment below when protostubs are updated with new status value \"live\"\n Object.keys(_this.protostubsList).filter(function (key) {\n return _this.protostubsList[key].url === runtimeProtoStubURL;\n }).map(function (key) {\n _this.protostubsList[key].status = msg.body.value; // log.log('[Registry - onProtostubStatusEvent] - Protostub status: ', _this.protostubsList[key]);\n });\n } else {\n // process status events from p2p connections\n if (msg.body.resource) {\n var remoteRuntimeURL = msg.body.resource;\n\n if (_this.p2pConnectionList[remoteRuntimeURL]) {\n _this.p2pConnectionList[remoteRuntimeURL].status = msg.body.value;\n _this.p2pConnectionList[remoteRuntimeURL].url = runtimeProtoStubURL;\n } else {\n var p2pConnection = {\n status: msg.body.value,\n url: runtimeProtoStubURL\n };\n _this.p2pConnectionList[remoteRuntimeURL] = p2pConnection;\n } // log.log('[Registry - onProtostubStatusEvent] - P2PConnection status: ', _this.p2pConnectionList[remoteRuntimeURL]);\n // Update P2P Requester protostub if it is coming from there\n\n\n if (runtimeProtoStubURL.includes('/p2prequester/')) {\n _this.p2pRequesterStub[remoteRuntimeURL].status = msg.body.value; // log.log('[Registry - onProtostubStatusEvent] - P2P Requester status: ', _this.p2pRequesterStub[remoteRuntimeURL]);\n } else {\n // if from P2PHandler with status disconencted, lets remove from p2pConnectionList\n if (msg.body.value === 'disconnected') delete _this.p2pConnectionList[remoteRuntimeURL];\n }\n } else {\n if (runtimeProtoStubURL.includes('/p2prequester/')) {\n // It is an event from P2P Requester without mandatory \"resource\" field\n Registry_log.error('[Registry onProtostubStatusEvent] resource missing: ', msg);\n return;\n } else {\n // It is an event from P2P Handler\n _this.p2pHandlerStub[_this.runtimeURL].status = msg.body.value; // log.log('[Registry - onProtostubStatusEvent] - P2PHandler Stub status: ', _this.p2pHandlerStub[_this.runtimeURL]);\n }\n }\n }\n }\n /**\n * To unregister a previously registered protocol stub\n * @param {HypertyRuntimeURL} HypertyRuntimeURL hypertyRuntimeURL\n */\n\n }, {\n key: \"unregisterStub\",\n value: function unregisterStub(hypertyRuntimeURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this.protostubsList.hasOwnProperty(hypertyRuntimeURL)) {\n delete _this.protostubsList[hypertyRuntimeURL];\n resolve('ProtostubURL removed');\n } else {\n reject('Error on unregisterStub: Hyperty not found');\n }\n });\n }\n /**\n * To register a new Identity Provider proxy in the runtime including as input parameters the function to postMessage, the DomainURL that is connected with the stub, which returns the RuntimeURL allocated to the new ProtocolStub.\n * @param {Sandbox} Sandbox\n * @param {DomainURL} DomainURL service provider domain\n * @return {RuntimeIdpProxyURL}\n */\n\n }, {\n key: \"registerIdpProxy\",\n value: function registerIdpProxy(sandbox, domainURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var idpProxyStubURL; //check if messageBus is registered in registry or not\n\n if (_this._messageBus === undefined) {\n reject('MessageBus not found on registerStub');\n }\n\n idpProxyStubURL = 'domain-idp://' + domainURL + '/stub/' + generateGUID(); // TODO: Optimize this\n\n _this.idpProxyList[domainURL] = {\n url: idpProxyStubURL,\n status: STATUS.DEPLOYING\n };\n _this.sandboxesList.sandbox[idpProxyStubURL] = sandbox; // sandbox.addListener('*', function(msg) {\n // _this._messageBus.postMessage(msg);\n // });\n\n resolve(idpProxyStubURL);\n\n _this._messageBus.addListener(idpProxyStubURL + '/status', function (msg) {\n _this._onIdpProxyStatusEvent(msg);\n });\n });\n }\n /**\n * To Process status events fired by Idp Proxies\n * @param {Message} message Event Message\n */\n\n }, {\n key: \"_onIdpProxyStatusEvent\",\n value: function _onIdpProxyStatusEvent(msg) {\n var _this = this; // log.log('[Registry onIdpProxyStatusEvent]: ', msg);\n\n\n var idpProxyURL = msg.from;\n\n if (!msg.to.includes('/status')) {\n Registry_log.error('[Registry onIdpProxyStatusEvent] Not Status Event: ', msg);\n return;\n }\n\n Object.keys(_this.idpProxyList).filter(function (key) {\n return _this.idpProxyList[key].url === idpProxyURL;\n }).map(function (key) {\n _this.idpProxyList[key].status = msg.body.value; // log.log('[Registry - onIdpProxyStatusEvent] - Idp Proxy status: ', _this.idpProxyList[key]);\n });\n }\n /**\n * To discover idpProxy stubs available in the runtime for a certain domain. If available, it returns the runtime url for the idpProxy stub that connects to the requested domain. Required by the runtime BUS to route messages to remote servers or peers\n * @param {DomainURL} DomainURL url\n * @return {RuntimeURL} RuntimeURL idpProxyUrl\n */\n\n }, {\n key: \"discoverIdpProxy\",\n value: function discoverIdpProxy(url) {\n if (!url) throw new Error('Parameter url needed');\n\n var _this = this;\n\n var dividedURL = divideURL(url);\n var domainURL = dividedURL.domain;\n\n if (_this.idpProxyList.hasOwnProperty(domainURL) && _this.idpProxyList[domainURL].status === STATUS.LIVE) {\n return _this.idpProxyList[domainURL];\n } else {\n _this.idpProxyList[domainURL] = {\n status: STATUS.PROGRESS\n };\n throw new Error('[Registry - discoverIdpProxy ] Idp Proxy Not Found. Creating one');\n }\n }\n /**\n * To register a new Policy Enforcer in the runtime including as input parameters the function to postMessage, the HypertyURL associated with the PEP, which returns the RuntimeURL allocated to the new Policy Enforcer component.\n * @param {Message.Message} postMessage postMessage\n * @param {HypertyURL} HypertyURL hyperty\n * @return {HypertyRuntimeURL} HypertyRuntimeURL\n */\n\n }, {\n key: \"registerPEP\",\n value: function registerPEP(postMessage, hyperty) {\n var _this = this;\n\n return new Promise(function (resolve) {\n //TODO check what parameter in the postMessage the pep is.\n _this.pepList[hyperty] = postMessage;\n resolve('PEP registered with success');\n });\n }\n /**\n * To unregister a previously registered protocol stub\n * @param {HypertyRuntimeURL} HypertyRuntimeURL HypertyRuntimeURL\n */\n\n }, {\n key: \"unregisterPEP\",\n value: function unregisterPEP(HypertyRuntimeURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var result = _this.pepList[HypertyRuntimeURL];\n\n if (result === undefined) {\n reject('Pep Not found.');\n } else {\n resolve('PEP successfully removed.');\n }\n });\n }\n /**\n * To discover sandboxes available in the runtime for a certain domain and a certain set of capabilities. Required by the runtime UA to avoid more than one sandbox for the same domain.\n * @param {DomainURL} DomainURL url\n * @return {RuntimeSandbox} RuntimeSandbox\n */\n\n }, {\n key: \"getSandbox\",\n value: function getSandbox(url, constraints) {\n if (!url) throw new Error('Parameter url needed'); // log.log('[Registry getSandbox] getSandbox for: ', url, ' and capabilities: ', constraints);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var request; //first try to find the url in the appSandbox list\n\n request = _this.sandboxesList.appSandbox[url]; //if no appSandbox was found, try to search in the normal sandboxes list\n\n if (!request) {\n request = _this.sandboxesList.sandbox[url];\n\n if (!request) {\n var domain;\n\n if (url.includes('://')) {\n domain = divideURL(url).domain;\n } else {\n domain = url;\n } // search in the sandboxes list for a entry containing the domain given\n\n\n for (var sandbox in _this.sandboxesList.sandbox) {\n //todo: uncomment sandbox constraints match condition with runtime sharing\n if (sandbox.includes(domain) && _this.sandboxesList.sandbox[sandbox].matches(constraints)) {\n var _ret = function () {\n var current = _this.sandboxesList.sandbox[sandbox];\n var match = Object.keys(constraints).filter(function (constraint) {\n return constraint === 'browser' && current.type === SandboxType.NORMAL || constraint === 'windowSanbox' && current.type === SandboxType.WINDOW;\n }).length > 0 ? true : false;\n\n if (match) {\n request = current;\n }\n\n return \"break\";\n }();\n\n if (_ret === \"break\") break;\n }\n }\n }\n }\n\n if (!request) {\n reject('no sandbox found for: ' + url);\n } else {\n resolve(request);\n }\n });\n }\n }, {\n key: \"resolveNormalStub\",\n value: function resolveNormalStub(url) {\n // log.log('resolveNormalStub ' + url);\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //split the url to find the domainURL. deals with the url for example as:\n //\"hyperty-runtime://sp1/protostub/123\",\n var dividedURL = divideURL(url);\n var domainUrl = dividedURL.domain;\n var type = dividedURL.type;\n\n if (url.includes(_this.runtimeURL) || url.includes('://sandbox/')) {\n Registry_log.error('[Registry - resolve] URL to be resolved should have listeners ', url);\n reject('[Registry - resolve] URL to be resolved should have listeners ', url);\n } // resolve the domain protostub in case of a message to global registry\n\n\n if (url.includes('global://registry')) {\n domainUrl = _this._domain;\n } else {\n if (!domainUrl.indexOf('msg-node.') || !domainUrl.indexOf('registry.')) {\n domainUrl = domainUrl.substring(domainUrl.indexOf('.') + 1);\n }\n }\n\n _this.isLegacy(url).then(function (isLegacy) {\n // if legacy it should resolve for .\n if (isLegacy && type !== 'domain-idp') {\n domainUrl = type + '.' + getUserIdentityDomain(url);\n }\n\n Registry_log.info('[Registry.resolve] domainUrl:', domainUrl);\n var registredComponent;\n\n if (type === 'domain-idp') {\n registredComponent = _this.idpProxyList.hasOwnProperty(domainUrl) ? _this.idpProxyList[domainUrl] : false;\n } else {\n registredComponent = _this.protostubsList.hasOwnProperty(domainUrl) ? _this.protostubsList[domainUrl] : false;\n }\n\n Registry_log.info('[Registry.resolve] registred:', registredComponent); // TODO since the protostubs have other states this should be revised, because the status could change from DEPLOYED to LIVE\n // TODO and this validation will trigger a new load of IDPProxy or Protostub;\n\n if (registredComponent && registredComponent.hasOwnProperty('status') && (registredComponent.status === STATUS.DEPLOYED || registredComponent.status === STATUS.CREATED || registredComponent.status === STATUS.LIVE || registredComponent.status === STATUS.DISCONNECTED)) {\n Registry_log.info('[Registry.resolve] Resolved: ', registredComponent.url, registredComponent.status);\n resolve(registredComponent.url);\n } else {\n //todo: use switch-case to support other types of stubs\n if (type === 'domain-idp') {\n // The IdP Proxy does not exist, let's prepare its deployment by watching its status\n _this.watchingYou.observe('idpProxyList', function (change) {\n // log.log('[Registry - resolveNormalStub] idpProxyList changed ' + _this.idpProxyList);\n var keypath = change.keypath;\n if (keypath.includes('status')) keypath = keypath.replace('.status', '');\n\n if (keypath === domainUrl && change.name === 'status' && change.newValue === STATUS.CREATED) {\n // log.log('[Registry - resolveNormalStub] idpProxyList is live ' + _this.idpProxyList[domainUrl]);\n resolve(_this.idpProxyList[domainUrl].url);\n }\n });\n\n if (!registredComponent || registredComponent.status === STATUS.FAILED) {\n // this process will load the idp proxy, because is not yet registered;\n Registry_log.info('[Registry.resolveNormalStub] deploy new IDPProxy: ', domainUrl);\n\n _this.loader.loadIdpProxy(domainUrl).then(function () {\n Registry_log.info('[Registry.resolveNormalStub] IdP Proxy deployed: ', _this.idpProxyList[domainUrl]);\n }).catch(function (reason) {\n Registry_log.error('[Registry.resolve] Error resolving Load IDPProxy: ', reason);\n _this.idpProxyList[domainUrl].status = 'deployment-failed';\n reject(reason);\n });\n }\n } else {\n // The protoStub does not exist, let's prepare its deployment by watching its status\n _this.watchingYou.observe('protostubsList', function (change) {\n // log.log('[Registry - resolveNormalStub] protostubsList changed ' + _this.protostubsList);\n var keypath = change.keypath;\n if (keypath.includes('status')) keypath = keypath.replace('.status', '');\n\n if (keypath === domainUrl && change.name === 'status' && change.newValue === STATUS.CREATED) {\n // log.log('[Registry - resolve] protostub is live ' + _this.protostubsList[domainUrl]);\n resolve(_this.protostubsList[domainUrl].url);\n }\n });\n\n if (!registredComponent || registredComponent.status === STATUS.FAILED) {\n // lets deploy the protostub\n Registry_log.info('[Registry.resolve] trigger new ProtocolStub: ', domainUrl);\n\n _this.loader.loadStub(domainUrl).then(function () {// log.log('[Registry - resolveNormalStub] Stub deployed: ', _this.protostubsList[domainUrl]);\n }).catch(function (reason) {\n Registry_log.error('[Registry.resolveNormalStub] Error resolving Load ProtocolStub: ', reason);\n reject(reason);\n });\n }\n }\n }\n }).catch(function (reason) {\n Registry_log.error('[Registry.resolve] Error resolving islegacy: ', reason);\n reject(reason);\n });\n });\n }\n /**\n * To verify if source is valid and to resolve target runtime url address if needed (eg protostub runtime url in case the message is to be dispatched to a remote endpoint).\n * @param {URL.URL} url url\n * @return {Promise} Promise \n */\n\n }, {\n key: \"resolve\",\n value: function resolve(msg) {\n Registry_log.info('[Registry - Resolve] - ', msg);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var url = msg.to ? msg.to : msg;\n var p2p = msg.body && msg.body.p2p ? msg.body.p2p : false; // log.log('P2P: ', p2p, url);\n // log.log('P2P - p2pHandlerStub: ', !_this.p2pHandlerStub[_this.runtimeURL], _this.p2pHandlerStub, _this.runtimeURL);\n // log.log('P2P - isBackendServiceURL: ', isBackendServiceURL(url), isBackendServiceURL, url);\n // log.log('P2P - includes runtimeURL: ', url.includes(_this.runtimeURL));\n // log.log('P2P - includes p2phandler: ', url.includes('/p2phandler/'));\n // log.log('P2P - includes p2prequester: ', url.includes('/p2prequester/'));\n // Skip p2p procedure when not supported by the Runtime or for backend services\n\n if (!_this.p2pHandlerStub[_this.runtimeURL] || isBackendServiceURL(url) || url.includes(_this.runtimeURL) || url.includes('/p2phandler/') || url.includes('/p2prequester/')) {\n Registry_log.info('[Registry - resolve] - Resolve normal stub: ', _this.p2pHandlerStub, _this.runtimeURL, isBackendServiceURL(url), p2p, url);\n\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n } else {\n Registry_log.info('[Registry - resolve] - checkP2P: ', p2p, url, _this._p2pConnectionResolve);\n\n _this._p2pConnectionResolve.checkP2P(msg).then(function (registeredP2P) {\n // log.log('[Registry - resolve] found registered P2P: ', registeredP2P);\n var p2pConnection = _this.p2pConnectionList[registeredP2P.runtime];\n\n if (!p2pConnection) {\n p2pConnection = registeredP2P;\n _this.p2pConnectionList[registeredP2P.runtime] = p2pConnection;\n }\n\n switch (p2pConnection.status) {\n case STATUS.LIVE:\n msg.body.peer = registeredP2P.runtime;\n resolve(p2pConnection.url, msg);\n break;\n\n case STATUS.CREATED: // p2p connection setup is ongoing, use MN Stub\n\n case STATUS.PROGRESS:\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n\n break;\n\n case STATUS.DISCONNECTED:\n // p2p connection stub was disconnected, let's ask to connect again\n Registry_log.info('[Registry - Resolve] - p2pConnection is disconnected lets try to reconnect');\n\n _this._p2pConnectionResolve.reconnectP2PRequester(p2pConnection).then(function (returnURL) {\n // log.log('[Registry - Resolve] - was reconnected with p2pRequesterStubt: ', returnURL);\n resolve(returnURL);\n }, function (reason) {\n Registry_log.info('[Registry - Resolve] - Reason: ', reason);\n\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n });\n\n break;\n\n default:\n Registry_log.info('[Registry - resolve] - P2P: ', p2p);\n\n if (!p2p) {\n // no p2p connection exists and the message sender does not ask one. Lets use the MN Stub\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n } else {\n _this._setupP2PRequester(registeredP2P).then(function (returnURL) {\n // no p2p connection exists but the message sender is asking one. Lets try to setup one\n resolve(returnURL);\n }, function (reason) {\n Registry_log.info('[Registry - Resolve] - Reason: ', reason);\n\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n });\n }\n\n break;\n }\n }, function (reason) {\n Registry_log.info('[Registry - Resolve] - Reason: ', reason);\n\n _this.resolveNormalStub(url).then(function (returnURL) {\n resolve(returnURL);\n });\n });\n }\n });\n }\n }, {\n key: \"_setupP2PRequester\",\n value: function _setupP2PRequester(input) {\n var _this = this;\n\n Registry_log.log('[Registry._setupP2PConnection] loadStub with p2pRequester: ', input);\n return new Promise(function (resolve, reject) {\n var remoteRuntime = input.runtime;\n var p2pConfig = {\n remoteRuntimeURL: remoteRuntime,\n p2pHandler: input.p2pHandler,\n p2pRequesterStub: true\n }; // lets prepare the p2pRequesterSTub deployment by setting an observer to its status changes\n\n _this.watchingYou.observe('p2pRequesterStub', function (change) {\n Registry_log.log('[Registry._setupP2PConnection] p2pRequesterStubs changed ' + _this.p2pRequesterStub);\n\n if (change.keypath.split('.')[0] === remoteRuntime && change.name === 'status' && change.newValue === STATUS.LIVE) {\n Registry_log.log('[Registry._setupP2PConnection] p2pRequester is live ' + _this.p2pRequesterStub[remoteRuntime]);\n resolve(_this.p2pRequesterStub[remoteRuntime].url);\n }\n }); // stub load\n\n\n _this.loader.loadStub(input.p2pRequester, p2pConfig).then(function () {\n Registry_log.log('[Registry._setupP2PConnection] p2pRequester deployed: ', _this.p2pRequesterStub[remoteRuntime]);\n }).catch(function (error) {\n reject(error);\n });\n });\n }\n /**\n * To verify if url is for a legacy service.\n * @param {URL.URL} url url\n * @return {boolean}\n */\n\n }, {\n key: \"isLegacy\",\n value: function isLegacy(url) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (url === _this._domain) {\n return resolve(false);\n }\n\n Registry_log.log('[Registry] [Registry.Registry.isLegacy] ', url); // TODO: to be defined in the runtime configuration\n\n var nonLegacy = ['hyperty-runtime', 'domain', 'global', 'hyperty'];\n var urlDivided = divideURL(url);\n\n if (nonLegacy.indexOf(urlDivided.type) !== -1 || urlDivided.domain === _this._domain) {\n return resolve(false);\n } // process User URLs\n\n\n if (url.split('@').length > 1) {\n var domain = urlDivided.domain; // log.log('[Registry] [Registry.Registry.isLegacy] domain: ', domain);\n\n if (_this.idpLegacyProxyList.hasOwnProperty(domain)) {\n var result = _this.idpLegacyProxyList[domain];\n\n if (result.interworking) {\n return resolve(result.interworking);\n } else {\n return resolve(false);\n }\n }\n\n _this._loader.descriptors.getIdpProxyDescriptor(domain).then(function (result) {\n // log.log('[Registry] [Registry.Registry.isLegacy] Legacy stub descriptor: ', result);\n if (result.interworking) {\n _this.idpLegacyProxyList[domain] = result;\n resolve(result.interworking);\n } else {\n resolve(false);\n }\n }).catch(function (reason) {\n Registry_log.warn('problem loading idp proxy descriptor for domain:', domain, ' because ', reason);\n reject(reason);\n });\n } else {\n // process protostub URLs\n resolve(_this.isInterworkingProtoStub(url));\n }\n });\n }\n /**\n * To verify if URL is locally registered or not.\n * @param {URL.URL} url url\n * @return {boolean}\n */\n\n }, {\n key: \"isLocal\",\n value: function isLocal(url) {\n var runtimeScheme = ['hyperty-runtime', 'runtime'];\n var hypertyScheme = ['hyperty'];\n var urlScheme = url.split('://')[0]; // Process Runtime Core URLs.\n // Messages originated from protostubs should also not include the runtimeURL in its URL.\n\n if (runtimeScheme.indexOf(urlScheme) !== -1) {\n return url.includes(this.runtimeURL);\n } // Process Hyperty URLs\n // Todo: hypertiesList should be an object not an array\n\n\n if (hypertyScheme.indexOf(urlScheme) !== -1) {\n for (var index in this.hypertiesList) {\n var hyperty = this.hypertiesList[index];\n\n if (hyperty.hypertyURL === url) {\n return true;\n }\n }\n\n return false;\n } // Process Data Object URLs\n\n\n if (url.includes('/subscription')) {\n url = url.substring(0, url.indexOf('/subscription'));\n }\n\n var dataObject = this.dataObjectList[url];\n\n if (dataObject) {\n if (dataObject.interworking) {\n return !dataObject.interworking;\n }\n\n return true;\n }\n\n return false;\n }\n /**\n * To verify if protostub is to interwork with a legacy domain.\n * @param {URL.URL} runtimeProtostubURL The runtime URL of the Protostub\n * @return {boolean}\n */\n\n }, {\n key: \"isInterworkingProtoStub\",\n value: function isInterworkingProtoStub(runtimeProtostubURL) {\n var _this = this;\n\n if (typeof runtimeProtostubURL === 'boolean') {\n return false;\n }\n\n if (!runtimeProtostubURL.includes('/protostub/')) {\n return false;\n }\n\n var filtered = Object.keys(_this.protostubsList).filter(function (key) {\n return _this.protostubsList[key].url === runtimeProtostubURL;\n }).map(function (key) {\n if (_this.protostubsList[key].hasOwnProperty('interworking')) {\n return _this.protostubsList[key].interworking;\n } else {\n return false;\n }\n })[0];\n return filtered;\n }\n }, {\n key: \"loader\",\n set: function set(loader) {\n var _this = this;\n\n _this._loader = loader;\n },\n get: function get() {\n var _this = this;\n\n return _this._loader;\n }\n /**\n * return the messageBus in this Registry\n * @param {MessageBus} messageBus\n */\n\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this._messageBus;\n }\n /**\n * Set the messageBus in this Registry\n * @param {MessageBus} messageBus\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this._messageBus = messageBus;\n\n _this._messageBus.addListener(_this.registryURL, function (msg) {\n // log.log('[Registry listener] ', msg);\n var isHyperty = utils_isHypertyURL(msg.from);\n var hasCriteria = msg.body.hasOwnProperty('criteria');\n var isURLResource;\n var isUserResource;\n var isHypertyResource;\n\n if (msg.body.hasOwnProperty('resource') && msg.body.resource !== '.') {\n isURLResource = isURL(msg.body.resource);\n isUserResource = isUserURL(msg.body.resource);\n isHypertyResource = utils_isHypertyURL(msg.body.resource);\n }\n\n var isDelete = msg.type === 'delete';\n var hasName;\n var hasUser;\n\n if (msg.body.hasOwnProperty('value')) {\n hasName = msg.body.value.hasOwnProperty('name');\n hasUser = msg.body.value.hasOwnProperty('user');\n }\n\n if (msg.type === 'response') {\n Registry_log.error('[Register listener] skipping ', msg);\n return;\n } // msg sent by identity manager library\n\n\n var userUrl = _this._getIdentityAssociated(msg.body.resource, msg.body.criteria);\n\n var reply = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: {\n resource: userUrl\n }\n };\n reply.body.code = userUrl ? 200 : 404;\n\n _this._messageBus.postMessage(reply);\n }); // Install AddressAllocation\n\n\n var addressAllocation = allocation_AddressAllocation.instance;\n _this.addressAllocation = addressAllocation;\n _this._domainRegistration = new registry_DomainRegistration(_this.runtimeURL, _this.registryURL, _this._domain, messageBus); // log.log('[Registry - AddressAllocation] - ', addressAllocation);\n }\n }]);\n\n return Registry;\n}();\n\n/* harmony default export */ var registry_Registry = (Registry_Registry);\n// CONCATENATED MODULE: ./src/runtime/runtimeConfiguration.js\nvar runtimeConfiguration_runtimeConfiguration = {\n // TODO this should be changed with the definition used for indexeddb\n // look at: https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore\n // Now we are using the definition for Dexie; (http://dexie.org/docs/Version/Version.stores())\n storageSchemas: {\n capabilities: {\n capabilities: 'key,version,value'\n },\n subscriptions: {\n subscriptions: 'key,version,value'\n },\n runtime: {\n 'runtime:URL': 'key,version,value',\n 'p2pHandler:URL': 'key,version,value'\n },\n registry: {\n 'registry:DataObjectURLs': 'key,version,value',\n 'registry:HypertyURLs': 'key,version,value'\n },\n cryptoManager: {\n userAsymmetricKey: 'key,version,value',\n dataObjectSessionKeys: 'key,version,value'\n },\n identity: {\n accessTokens: 'key,version,value',\n identities: 'userURL, userProfile.email, userProfile.userURL, userProfile.name'\n },\n runtimeCatalogue: {\n runtimeCatalogue: '&cguid, accessControlPolicy, constraints, dataObjects, type, objectName, sourcePackage, version, url'\n },\n policy: {\n 'rethink:activePolicy': 'key,version,value',\n 'rethink:groups': 'key,version,value',\n 'rethink:userPolicies': 'key,version,value',\n 'rethink:spPolicies': 'key,version,value'\n },\n syncherManager: {\n 'syncherManager:ObjectURLs': 'key,version,value',\n 'remotes': 'key,version,value'\n },\n hypertyResources: {\n hypertyResources: '&resourceURL, name, contentUrl, content, created, reporter, resourceType'\n }\n },\n runtimeURLS: {\n registry: {\n prefix: 'hyperty-runtime://',\n suffix: 'registry'\n },\n identityModule: {\n prefix: 'hyperty-runtime://',\n suffix: '/idm'\n },\n runtimeUA: {\n prefix: 'hyperty-runtime://',\n suffix: '/ua'\n },\n catalogue: {\n prefix: 'hyperty-runtime://',\n suffix: '/catalogue'\n },\n graphConnector: {\n prefix: 'hyperty-runtime://',\n suffix: '/graph'\n },\n syncManager: {\n prefix: 'hyperty-runtime://',\n suffix: '/sm'\n }\n },\n catalogueURLs: {\n protocolstub: {\n prefix: 'hyperty-catalogue://catalogue.',\n suffix: '/.well-known/protocolstub/',\n fallback: 'hyperty-catalogue://catalogue.%domain%/.well-known/protocolstub/'\n },\n idpProxy: {\n prefix: 'hyperty-catalogue://catalogue.',\n suffix: '/.well-known/idp-proxy/',\n fallback: 'hyperty-catalogue://catalogue.%domain%/.well-known/idp-proxy/'\n }\n },\n msgNodeURL: {\n prefix: 'domain://msg-node.',\n suffix: '',\n hypertyAddressAllocation: '/hyperty-address-allocation',\n objectAddressAllocation: '/object-address-allocation',\n subscriptionManagement: '/sm'\n },\n domainRegistryURL: {\n prefix: 'domain://registry.',\n suffix: ''\n },\n globalRegistryURL: 'global://registry.',\n remoteStorage: 'https://backup.rethink-dev.alticelabs.com/'\n};\n// CONCATENATED MODULE: ./src/identity/Identities.js\nfunction Identities_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Identities_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Identities_createClass(Constructor, protoProps, staticProps) { if (protoProps) Identities_defineProperties(Constructor.prototype, protoProps); if (staticProps) Identities_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar Identities_log = loglevel[\"getLogger\"]('IdentityModule');\n\n\n/**\n* The Identity Data Model is used to model the reTHINK User entity. The Identity data model is handled by Identity Management functionality.\n*\n*/\n\nvar Identities_Identities =\n/*#__PURE__*/\nfunction () {\n function Identities(type, storageManager) {\n Identities_classCallCheck(this, Identities);\n\n var _this = this;\n\n _this._watchingYou = new utils_WatchingYou();\n _this._storageManager = storageManager;\n _this._guid;\n _this._type = type;\n _this._identities = {};\n _this._accessTokens = _this.watchingYou.watch('accessTokens', {}, true);\n }\n\n Identities_createClass(Identities, [{\n key: \"reset\",\n value: function reset() {\n this._identities = {};\n console.log(this);\n this.currentIdentity = undefined;\n this.defaultIdentity = undefined;\n }\n }, {\n key: \"getIdentity\",\n value: function getIdentity(identifier) {\n return Object.assign({}, this._identities[identifier]);\n }\n }, {\n key: \"loadIdentities\",\n value: function loadIdentities() {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this._storageManager.get(null, null, 'identities').then(function (identities) {\n Identities_log.info('[Identities.Load Identities] identities: ', identities);\n\n if (identities) {\n _this._identities = identities; // let's set as default identity the one that expires later\n\n _this.identifiers.forEach(function (id) {\n var timeNow = secondsSinceEpoch();\n var identity = _this._identities[id];\n var expires = identity.expires; // if (!identity.hasOwnProperty('interworking')\n // || !identity.interworking) {\n\n _this.defaultIdentity = id;\n\n if (parseInt(expires) > timeNow) {\n _this.defaultIdentity.expires = parseInt(expires);\n _this.currentIdentity = id;\n }\n });\n }\n\n resolve();\n });\n });\n }\n }, {\n key: \"loadAccessTokens\",\n value: function loadAccessTokens() {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this._storageManager.get('accessTokens').then(function (accessTokens) {\n if (accessTokens) _this._accessTokens = accessTokens;\n resolve();\n });\n });\n } // to confirm if this function is required when the App constraints the identity selection\n\n }, {\n key: \"addIdentity\",\n value: function addIdentity(identity) {\n var _this2 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this._isValid(identity)) {\n var id = identity.identifiers[0];\n Object.assign(_this2._identities[id], identity);\n\n _this2._storeIdentity(identity).then(function () {\n _this2._identities[id].status = 'created';\n resolve();\n });\n } else {\n reject('[Identities.addIdentity] invalid IdAssertion');\n }\n });\n }\n }, {\n key: \"addAssertion\",\n value: function addAssertion(assertion) {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this._isValid(assertion)) {\n assertion.userProfile.guid = _this._guid;\n var userUrl = assertion.userProfile.userURL;\n if (!_this.identities[userUrl]) _this._identities[userUrl] = assertion;else _this.identities[userUrl] = assertion;\n\n _this._store().then(function () {\n _this3._identities[userUrl].status = 'created';\n\n if (_this.defaultIdentity == false) {\n _this.defaultIdentity = userUrl;\n }\n\n resolve(assertion);\n });\n } else {\n reject('[Identities.addAssertion] invalid IdAssertion: ', assertion);\n }\n });\n }\n }, {\n key: \"removeIdentity\",\n value: function removeIdentity(userUrl) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n delete _this.identities[userUrl];\n\n _this._store().then(function () {\n resolve();\n });\n });\n }\n }, {\n key: \"addAccessToken\",\n value: function addAccessToken(accessToken) {\n var _this = this;\n\n Identities_log.info('[Identities.addAccessToken] ', accessToken);\n return new Promise(function (resolve, reject) {\n if (_this._isValidAccessToken(accessToken)) {\n // let newAccessToken = deepClone(accessToken);\n _this._accessTokens[accessToken.domain] = accessToken;\n\n _this._storeAccessTokens().then(function () {\n _this._accessTokens[accessToken.domain].status = 'created';\n resolve(accessToken);\n });\n } else {\n reject('[Identities.addIdentity] invalid AccessToken: ', accessToken);\n }\n });\n }\n }, {\n key: \"setAccessTokenInProgress\",\n value: function setAccessTokenInProgress(domain) {\n if (this._accessTokens[domain]) this._accessTokens[domain].status = 'in-progress';else this._accessTokens[domain] = {\n status: 'in-progress'\n };\n }\n }, {\n key: \"getAccessToken\",\n value: function getAccessToken(domain, resources) {\n var accessToken = this._accessTokens[domain];\n\n if (!accessToken) {\n return undefined;\n } else if (resources.every(function (i) {\n return accessToken.resources.indexOf(i) != -1;\n })) {\n return this._accessTokens[domain];\n } else {\n return new Error('[Identities.getAccessToken] Not found for ', domain);\n }\n }\n }, {\n key: \"removeAccessToken\",\n value: function removeAccessToken(domain, resources) {\n var _this4 = this;\n\n var _this = this;\n\n return new Promise(function (resolve) {\n var accessToken = _this4._accessTokens[domain];\n\n if (!accessToken) {\n resolve();\n } else if (resources.every(function (i) {\n return accessToken.resources.indexOf(i) != -1;\n })) {\n delete _this4._accessTokens[domain];\n\n _this._storeAccessTokens().then(function () {\n resolve();\n });\n } else {\n resolve();\n }\n });\n }\n }, {\n key: \"updateAssertion\",\n value: function updateAssertion(assertion) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var userUrl = assertion.userProfile.userURL;\n\n if (!_this.identities[userUrl]) {\n return reject('[Identities.updateAssertion] Identity not found for ', userUrl);\n } else {\n _this.identities[userUrl] = assertion;\n\n _this._store().then(function () {\n resolve();\n });\n }\n });\n }\n }, {\n key: \"updateAccessToken\",\n value: function updateAccessToken(accessToken) {\n var _this = this;\n\n Identities_log.info('[Identities.updateAccessToken] ', accessToken);\n return new Promise(function (resolve, reject) {\n if (_this._isValidAccessToken(accessToken)) {\n _this._accessTokens[accessToken.domain].expires = accessToken.expires;\n _this._accessTokens[accessToken.domain].accessToken = accessToken.accessToken;\n\n _this._storeAccessTokens().then(function () {\n _this._accessTokens[accessToken.domain].status = 'created';\n resolve(accessToken);\n });\n } else {\n reject('[Identities.updateAccessToken] invalid AccessToken: ', accessToken);\n }\n });\n }\n }, {\n key: \"addIdAssertion\",\n value: function addIdAssertion(identifier, assertion, idp, scope) {\n var _this = this;\n\n var newIdAssertion = new IdAssertion(assertion, idp, scope);\n\n _this.idAssertionList.push(newIdAssertion);\n } //TODO: complete with more verifications. To be moved to Identity?\n\n }, {\n key: \"_isValid\",\n value: function _isValid(identity) {\n if (!identity.hasOwnProperty('assertion')) {\n return false;\n }\n\n var splitedAssertion = identity.assertion.split('.');\n var assertionParsed; //verify if the token contains the 3 components, or just the assertion\n\n try {\n if (splitedAssertion[1]) {\n assertionParsed = decode(splitedAssertion[1]);\n } else {\n assertionParsed = decode(identity.assertion);\n }\n } catch (err) {\n return false;\n }\n\n return true;\n }\n }, {\n key: \"_isValidAccessToken\",\n value: function _isValidAccessToken(accessToken) {\n if (!accessToken.hasOwnProperty('accessToken')) {\n return false;\n }\n\n if (!accessToken.hasOwnProperty('domain')) {\n return false;\n }\n\n if (!(accessToken.hasOwnProperty('resources') && Array.isArray(accessToken.resources))) {\n return false;\n }\n\n if (!(accessToken.hasOwnProperty('expires') && Number.isInteger(accessToken.expires))) {\n return false;\n }\n\n if (!accessToken.hasOwnProperty('input')) {\n return false;\n }\n\n return true;\n } //TODO: add function to only set one new identity using the new indexed storage manager\n\n }, {\n key: \"_store\",\n value: function _store() {\n var _this5 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var store = Object.keys(_this5._identities).map(function (userURL) {\n return _this._storageManager.set(userURL, 0, _this5._identities[userURL], 'identities');\n });\n Promise.all(store).then(function () {\n resolve();\n }).catch(function (err) {\n reject('On _sendReporterSessionKey from method storeIdentity error: ' + err);\n });\n });\n }\n }, {\n key: \"_storeAccessTokens\",\n value: function _storeAccessTokens() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var accessTokens = deepClone(_this._accessTokens);\n\n _this._storageManager.set('accessTokens', 0, accessTokens).then(function () {\n resolve();\n }).catch(function (err) {\n reject('On _sendReporterSessionKey from method storeIdentity error: ' + err);\n });\n });\n }\n }, {\n key: \"identities\",\n get: function get() {\n return this._identities;\n }\n }, {\n key: \"accessTokens\",\n get: function get() {\n return this._accessTokens;\n }\n }, {\n key: \"watchingYou\",\n get: function get() {\n return this._watchingYou;\n }\n }, {\n key: \"guid\",\n set: function set(guid) {\n this._guid = guid;\n },\n get: function get() {\n return this._guid;\n }\n }, {\n key: \"defaultIdentity\",\n set: function set(identifier) {\n if (this.identities[identifier]) this._defaultIdentity = identifier;else throw new Error('[Identities.set defaultIdentity ] Error: identity does not exist here: ', identifier);\n },\n get: function get() {\n if (this._defaultIdentity) return Object.assign({}, this.identities[this._defaultIdentity]);else return false;\n }\n }, {\n key: \"currentIdentity\",\n set: function set(identifier) {\n if (this.identities[identifier]) this._currentIdentity = identifier;else throw '[Identities.set currentIdentity ] Error: identity does not exist here: ', identifier;\n },\n get: function get() {\n return Object.assign({}, this.identities[this._currentIdentity]);\n }\n }, {\n key: \"identifiers\",\n get: function get() {\n return Object.keys(this._identities);\n }\n }]);\n\n return Identities;\n}(); // move to Identity service framework?\n\n\nvar IdAssertion =\n/*#__PURE__*/\nfunction () {\n function IdAssertion(assertion, idp, userProfile) {\n Identities_classCallCheck(this, IdAssertion);\n\n var _this = this;\n\n _this._assertion = assertion;\n _this._idp = idp;\n _this._userProfile = userProfile;\n }\n\n Identities_createClass(IdAssertion, [{\n key: \"assertion\",\n get: function get() {\n return this._assertion;\n }\n }, {\n key: \"idp\",\n get: function get() {\n return this._idp;\n }\n }, {\n key: \"userProfile\",\n get: function get() {\n return this._userProfile;\n }\n }]);\n\n return IdAssertion;\n}();\n\nvar IdValidation =\n/*#__PURE__*/\nfunction () {\n function IdValidation(identity, contents) {\n Identities_classCallCheck(this, IdValidation);\n\n var _this = this;\n\n _this.identity = identity;\n _this.contents = contents;\n }\n\n Identities_createClass(IdValidation, [{\n key: \"validates\",\n value: function validates(identity, contents) {//TODO implement the logic\n }\n }]);\n\n return IdValidation;\n}();\n\n/* harmony default export */ var identity_Identities = (Identities_Identities);\n// CONCATENATED MODULE: ./src/identity/GuiFake.js\nfunction GuiFake_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// Log System\n\nvar GuiFake_log = loglevel[\"getLogger\"]('IdentityModule');\n/**\n* fake class for the gui to select the identity,\n* TODO replace with the proper identity GUI\n*\n*/\n\nvar GuiFake = function GuiFake(url, messageBus) {\n GuiFake_classCallCheck(this, GuiFake);\n\n GuiFake_log.log('FakeGUI_deployed');\n\n var _this = this;\n\n _this._url = url;\n _this._waitTime = 10000;\n _this._messageBus = messageBus;\n\n _this._messageBus.addListener(_this._url, function (msg) {\n if (msg.hasOwnProperty('type') && msg.type === 'create' && msg.body.hasOwnProperty('value') && msg.body.value.hasOwnProperty('identities') && msg.body.value.hasOwnProperty('idps')) {\n var identities = msg.body.value.identities;\n var idps = msg.body.value.idps;\n var value;\n\n if (identities[0] !== undefined) {\n value = {\n type: 'identity',\n value: identities[0],\n code: 200\n };\n } else {\n value = {\n type: 'idp',\n value: idps[2].domain,\n code: 200\n };\n }\n\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n }; // to test on the identity side the listener without the timeout\n // can represent the time the user takes to choose and identity\n\n if (msg.body.value === 'wait') {\n setTimeout(function () {\n _this._messageBus.postMessage(replyMsg);\n }, _this._waitTime);\n } else {\n _this._messageBus.postMessage(replyMsg);\n }\n } else {\n GuiFake_log.log('Ignoring messages not intended to FakeGUI.', msg);\n }\n });\n};\n\n/* harmony default export */ var identity_GuiFake = (GuiFake);\n// CONCATENATED MODULE: ./src/identity/IdentityModule.js\nfunction IdentityModule_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction IdentityModule_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction IdentityModule_createClass(Constructor, protoProps, staticProps) { if (protoProps) IdentityModule_defineProperties(Constructor.prototype, protoProps); if (staticProps) IdentityModule_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar IdentityModule_log = loglevel[\"getLogger\"]('IdentityModule');\n\n\n\n\n/**\n*\n* The Identity Module (Id Module) is the component responsible for handling the\n* user identity and the association of this identity with the Hyperty instances,\n* in order to make Hyperty instances identifiable. The identity in the reTHINK project\n* is not fixed to a unique Identity Service Provider, but obtained through several\n* different Identity sources. With this approach, the Id Module provides to the user the\n* option to choose the preferred method for authentication.\n* This module will thus able to support multiple Identity acquisition methods,\n* such as OpenID connect 1.0, Kerberos System, or authentication through smart cards.\n* For example, a user with a Google account can use the Google as an Identity Provider to provide Identity Tokens,\n* which can be used by the Identity Module to associate it with a Hyperty instance.\n*\n* The Identity Module uses a node package, the HelloJS, which is a client-side JavaScript API for authentication\n* that facilitates the requests for the OpenID connect protocol. This method allows for some abstraction\n* when making requests for different Identity Providers, such as OpenID connect used by Google, Facebook, Microsoft, for example.\n*\n* When a request for a user identity is made using the method loginWithRP(identifier, scope),\n* this method will analyse the Identity Provider chosen to obtain an identity and will use the HelloJS node package\n* with the selected Identity Provider and identity scope. After the HelloJS request for an Access Token\n* to the Identity Providers, the user will be prompted to authenticate towards the Identity Provider.\n* Upon receiving the Access Token, this token is validated with a RESTful web service request to an endpoint\n* on the Identity Provider Authorization Server, and after the validation is done,\n* an ID token is obtained with the information according to the scope required.\n* This ID token is then preserved in this module that can obtained through the getIdentities()\n* and is passed as return value of the loginWithRP function. The methods generateAssertion and validateAssertion have not yet been developed.\n*\n*/\n\nvar IdentityModule_IdentityModule =\n/*#__PURE__*/\nfunction () {\n /**\n * This is the constructor to initialise the Identity Module it does not require any input.\n */\n function IdentityModule(runtimeURL, runtimeCapabilities, storageManager, dataObjectsStorage, cryptoManager, runtimeCatalogue) {\n IdentityModule_classCallCheck(this, IdentityModule);\n\n var _this = this;\n\n if (!runtimeURL) throw new Error('runtimeURL is missing.');\n if (!storageManager) throw new Error('storageManager is missing');\n if (!cryptoManager) throw new Error('cryptoManager is missing');\n if (!runtimeCatalogue) throw new Error('runtimeCatalogue is missing');\n _this._runtimeURL = runtimeURL;\n _this._runtimeCatalogue = runtimeCatalogue;\n _this.dataObjectsStorage = dataObjectsStorage;\n _this._idmURL = _this._runtimeURL + '/idm';\n _this._guiURL = _this._runtimeURL + '/identity-gui';\n _this.runtimeCapabilities = runtimeCapabilities;\n _this._domain = divideURL(_this._runtimeURL).domain; //to store items with this format: {identity: identityURL, token: tokenID}\n\n _this._identities = new identity_Identities('human', storageManager); // to be reviewed: watchingYou identitiesList or identities?\n // _this.identitiesList = _this.watchingYou.watch('identitiesList', {}, true);\n\n _this._crypto = cryptoManager;\n /* _this.emailsList = [];\n let newIdentity = new Identity('guid', 'HUMAN');\n _this.identity = newIdentity;\n _this.currentIdentity;\n _this.identities.defaultIdentity;*/\n //stores the association of the dataObject and the Hyperty registered within\n\n _this.dataObjectsIdentity = {}; // is this needed?\n\n _this._listOfIdps = []; // variable to know if the GUI is deployed to choose the identity. if the real GUI is not deployed, a fake gui is deployed instead.\n\n _this.guiDeployed = false;\n } //******************* GET AND SET METHODS *******************\n\n /**\n * return the messageBus in this Registry\n * @param {MessageBus} messageBus\n */\n\n\n IdentityModule_createClass(IdentityModule, [{\n key: \"getIdentity\",\n //******************* IDENTITY RELEATED METHODS *******************\n\n /**\n * gets all the information from a given userURL\n * @param {String} userURL user url\n * @return {JSON} identity identity bundle from the userURL\n */\n value: function getIdentity(userURL) {\n return this.identities.getIdentity(userURL);\n }\n /**\n * Function to set the current Identity with a given Identity\n * @param {Identity} identity identity\n */\n\n /* setCurrentIdentity(identity) {\n let _this = this;\n _this.currentIdentity = identity;\n }*/\n\n /**\n * Function to return all the identities registered within a session by a user.\n * These identities are returned in an array containing a JSON package for each user identity.\n * @return {Array} Identities\n */\n\n }, {\n key: \"getIdentitiesToChoose\",\n value: function getIdentitiesToChoose() {\n var _this2 = this;\n\n // let identities = _this.identities.identifiers;\n // let idps = [\n // { domain: 'google.com', type: 'idToken'},\n // { domain: 'microsoft.com', type: 'idToken'},\n // { domain: 'orange.fr', type: 'idToken'},\n // { domain: 'slack.com', type: 'Legacy'}\n // ];\n // todo: retrieve available idps from runtime catalogue\n // todo: enable oauth idps\n // let idps = [\n // { domain: 'google.com', type: 'idToken' },\n // { domain: 'microsoft.com', type: 'idToken' },\n // { domain: 'facebook.com', type: 'idToken' },\n // { domain: 'slack.com', type: 'idToken' }\n // ];\n return new Promise(function (resolve) {\n var url = runtimeConfiguration_runtimeConfiguration.catalogueURLs.idpProxy.prefix + _this2._domain + runtimeConfiguration_runtimeConfiguration.catalogueURLs.idpProxy.suffix;\n Promise.all([_this2.runtimeCapabilities.isAvailable('browser'), _this2.runtimeCapabilities.isAvailable('node')]).then(function (result) {\n var isBrowser = result[0];\n var isNode = result[1];\n var constraints = {\n constraints: {}\n };\n constraints.constraints.node = isNode;\n constraints.constraints.browser = isBrowser;\n\n _this2._runtimeCatalogue.getTypeList(url, constraints).then(function (idps) {\n var listOfIdps = idps.map(function (key) {\n return {\n domain: key,\n type: 'idToken'\n };\n });\n IdentityModule_log.info('[IdentityModule.getIdentityAssertion:getIdentitiesToChoose]', idps, listOfIdps);\n _this2._listOfIdps = listOfIdps;\n return resolve({\n defaultIdentity: _this2.identities.defaultIdentity,\n identities: _this2.identities.identities,\n idps: listOfIdps\n });\n });\n });\n });\n }\n /**\n * Function to return the selected Identity within a session\n * @return {Identity} identity identity\n */\n\n /* getCurrentIdentity() {\n let _this = this;\n return _this.currentIdentity;\n }*/\n\n }, {\n key: \"init\",\n value: function init(guid) {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this._identities.loadIdentities().then(function () {\n if (!guid) {\n _this._crypto.getMyPublicKey().then(function (key) {\n var hash = _this._crypto.crypto._sha256(stringify(key)).then(function (hash) {\n guid = 'user-guid://' + hash;\n _this.identities.guid = guid;\n\n _this._identities.loadAccessTokens().then(function () {\n resolve();\n });\n }).catch(function (error) {\n console.log('[IdentityModule] error', error);\n });\n });\n } else {\n _this.identities.guid = guid;\n\n _this._identities.loadAccessTokens().then(function () {\n resolve();\n });\n }\n });\n });\n }\n /**\n * Function that fetch an identityAssertion from a user.\n *\n * @return {IdAssertion} IdAssertion\n */\n\n }, {\n key: \"getIdentityAssertion\",\n value: function getIdentityAssertion(identityBundle) {\n IdentityModule_log.log('[IdentityModule.getIdentityAssertion:identityBundle]', identityBundle);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //CHECK whether is browser environment or nodejs\n //if it is browser, then create a fake identity\n _this.runtimeCapabilities.isAvailable('browser').then(function (result) {\n IdentityModule_log.log('runtime browser identity acquisition', result);\n if (!result) return; //todo: only idp should be mandatory when identityBundle exists\n\n if (identityBundle && identityBundle.hasOwnProperty('idp')) {\n var idp = identityBundle.idp;\n var origin = identityBundle.hasOwnProperty('origin') ? identityBundle.origin : 'origin';\n var idHint = identityBundle.hasOwnProperty('idHint') ? identityBundle.idHint : '';\n\n if (_this.identities.defaultIdentity) {\n var assertion = _this.identities.defaultIdentity;\n\n if (assertion.expires > secondsSinceEpoch()) {\n return resolve(assertion);\n } else if (assertion.hasOwnProperty('refresh')) {\n IdentityModule_log.log('[Identity.IdentityModule.getIdentityAssertion] refreshing assertion: ', assertion);\n\n _this._refreshIdAssertion().then(function (newAssertion) {\n IdentityModule_log.log('[IdentityModule.getIdentityAssertion] refreshed assertion.', newAssertion);\n return resolve(newAssertion);\n }, function (error) {\n IdentityModule_log.error('[IdentityModule.getIdentityAssertion] error on refresIdAssertion: ', error, ' Asking for a new IdAssertion.');\n\n _this._getIdAssertionForDomain(origin, idp, idHint).then(function (assertion) {\n resolve(assertion);\n }, function (error) {\n reject(error);\n });\n });\n } else {\n _this._getIdAssertionForDomain(origin, idp, idHint).then(function (assertion) {\n resolve(assertion);\n }, function (error) {\n reject(error);\n });\n }\n } else {\n _this._getIdAssertionForDomain(origin, idp, idHint).then(function (assertion) {\n resolve(assertion);\n }, function (error) {\n reject(error);\n });\n }\n } else if (_this.identities.defaultIdentity) {\n var _assertion = _this.identities.defaultIdentity;\n\n if (_assertion.expires > secondsSinceEpoch()) {\n return resolve(_assertion);\n } else if (_assertion.hasOwnProperty('refresh')) {\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] refreshing assertion: ', _assertion);\n\n _this._refreshIdAssertion(_assertion).then(function (newAssertion) {\n IdentityModule_log.log('[IdentityModule.getIdentityAssertion] refreshed assertion.', newAssertion);\n return resolve(newAssertion);\n }, function (error) {\n IdentityModule_log.error('[IdentityModule.getIdentityAssertion] error on refresIdAssertion: ', error, ' Asking for a new IdAssertion.');\n\n _this.selectIdentityFromGUI().then(function (assertion) {\n IdentityModule_log.log('[IdentityModule] Identity selected from GUI.');\n _this.identities.defaultIdentity = assertion.userProfile.userURL;\n return resolve(assertion);\n }, function (err) {\n return reject(err);\n });\n });\n } else {\n _this.selectIdentityFromGUI().then(function (assertion) {\n IdentityModule_log.log('[IdentityModule] Identity selected from GUI.');\n _this.identities.defaultIdentity = assertion.userProfile.userURL;\n return resolve(assertion);\n }, function (err) {\n return reject(err);\n });\n }\n } else {\n _this.selectIdentityFromGUI().then(function (assertion) {\n IdentityModule_log.log('[IdentityModule] Identity selected from GUI.');\n _this.identities.defaultIdentity = assertion.userProfile.userURL;\n return resolve(assertion);\n }, function (err) {\n return reject(err);\n });\n }\n }).catch(function (error) {\n IdentityModule_log.error('Error on identity acquisition ', error);\n return reject(error);\n });\n\n _this.runtimeCapabilities.isAvailable('node').then(function (result) {\n IdentityModule_log.log('node identity acquisition', result);\n if (!result) return;\n\n if (_this.identities.currentIdentity) {\n //TODO verify whether the token is still valid or not.\n // should be needed to make further requests, to obtain a valid token\n return resolve(_this.identities.currentIdentity);\n } else {\n IdentityModule_log.log('getIdentityAssertion for nodejs');\n var idp = {\n type: 'idp',\n value: 'nodejs-idp',\n code: 200,\n auth: false\n };\n\n _this.callNodeJsGenerateMethods(idp.value, 'origin').then(function (value) {\n resolve(value);\n }, function (err) {\n reject(err);\n });\n }\n }).catch(function (error) {\n IdentityModule_log.error('Error on identity acquisition ', error);\n reject(error);\n });\n });\n }\n }, {\n key: \"_getIdAssertionForDomain\",\n value: function _getIdAssertionForDomain(origin, idp, idHint) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.selectIdentityForHyperty(origin, idp, idHint).then(function (assertion) {\n IdentityModule_log.log('[IdentityModule._getIdAssertionForDomain] Identity selected by hyperty.');\n return resolve(assertion);\n }, function (err) {\n // if it got an error then just select identity from GUI\n // log.error('[IdentityModule] Could not select identity from hyperty.');\n _this.selectIdentityFromGUI().then(function (newAssertion) {\n IdentityModule_log.log('[IdentityModule._getIdAssertionForDomain] Identity selected by hyperty.');\n return resolve(newAssertion);\n }, function (err) {\n return reject(err);\n });\n });\n });\n }\n }, {\n key: \"_refreshIdAssertion\",\n value: function _refreshIdAssertion(assertion) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.sendRefreshMessage(assertion).then(function (newAssertion) {\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] refreshed assertion: ', newAssertion);\n\n _this.identities.updateAssertion(newAssertion).then(function () {\n resolve(newAssertion);\n }, function (err) {\n IdentityModule_log.error('[IdentityModule.getValidToken] error updating the assertion ', err);\n reject(err);\n });\n }, function (err) {\n IdentityModule_log.error('[IdentityModule.getValidToken] error refreshing the assertion ', err);\n reject(err);\n });\n });\n }\n /**\n * Function to return all the users URLs registered within a session\n * These users URLs are returned in an array of strings.\n * @return {Array} users\n */\n\n }, {\n key: \"getUsersIDs\",\n value: function getUsersIDs() {\n /* log.log('[getUsersIDs:emailFormat]', emailFormat);\n log.log('getUsersIDs:emailFormat', emailFormat);\n let _this = this;\n let users = [];*/\n //if request comes with the emailFormat option, then convert url to email format\n\n /* let converter = (emailFormat) ? getUserEmailFromURL : (value) => { return value; };\n for (let index in _this.identities) {\n let identity = _this.identities[index];\n users.push(converter(identity.identity));\n }*/\n return this.identities.identifiers;\n }\n /**\n * Function to remove an identity\n * @param {String} userURL userURL\n * @return {Promise}\n */\n\n }, {\n key: \"deleteIdentity\",\n value: function deleteIdentity(userURL) {\n return this.identities.removeIdentity(userURL);\n }\n /**\n * Function to unregister an identity from the emailsList array and not show in to the GUI\n * @param {String} email email\n */\n\n /* unregisterIdentity(email) {\n let _this = this;\n for (let e in _this.emailsList) {\n if (_this.emailsList[e] === email) {\n _this.emailsList.splice(e, 1);\n }\n }\n }*/\n // to be used when runtime is not executed in a sandbox\n\n }, {\n key: \"listenShowAdmin\",\n value: function listenShowAdmin(callback) {\n this._showAdmin = callback;\n }\n /**\n * Function that sends a request to the GUI using messages. Sends all identities registered and\n * the Idps supported, and return the identity/idp received by the GUI\n * @param {Array} identities list of identitiies\n * @param {Array} idps list of idps to authenticate\n * @return {Promise} returns a chosen identity or idp\n */\n\n }, {\n key: \"requestIdentityToGUI\",\n value: function requestIdentityToGUI(identities, idps) {\n IdentityModule_log.log('[IdentityModule.requestIdentityToGUI:identities]', identities);\n IdentityModule_log.log('[IdentityModule.requestIdentityToGUI:idps]', idps);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //condition to check if the real GUI is deployed. If not, deploys a fake gui\n if (_this.guiDeployed === false) {\n var guiFakeURL = _this._guiURL;\n var guiFake = new identity_GuiFake(guiFakeURL, _this._messageBus);\n _this.guiFake = guiFake;\n _this.guiDeployed = true;\n }\n\n var message = {\n type: 'create',\n to: _this._guiURL,\n from: _this._idmURL,\n body: {\n value: {\n identities: identities,\n idps: idps\n }\n }\n };\n\n var callback = function callback(msg) {\n _this._messageBus.removeResponseListener(_this._idmURL, msg.id); // todo: to return the user URL and not the email or identifier\n\n\n if (msg.body.code === 200) {\n var selectedIdentity = msg.body;\n IdentityModule_log.log('selectedIdentity: ', selectedIdentity.value);\n resolve(selectedIdentity);\n } else {\n reject('error on requesting an identity to the GUI');\n }\n }; //postMessage with callback but without timeout\n\n\n try {\n _this._messageBus.postMessage(message, callback, false);\n } catch (err) {\n reject('In method callIdentityModuleFunc error: ' + err);\n }\n });\n }\n }, {\n key: \"callNodeJsGenerateMethods\",\n value: function callNodeJsGenerateMethods(idp, origin) {\n IdentityModule_log.log('[callNodeJsGenerateMethods:idp]', idp);\n IdentityModule_log.log('[callNodeJsGenerateMethods:origin]', origin);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //debugger;\n var publicKey; //let keyPair = nodeJSKeyPairPopulate;\n //generates the RSA key pair\n\n _this._crypto.getMyPublicKey().then(function (key) {\n IdentityModule_log.log('[callNodeJsGenerateMethods:key]', key);\n publicKey = stringify(key);\n IdentityModule_log.log('[callNodeJsGenerateMethods] NO_URL');\n return _this.generateAssertion(publicKey, origin, 'url', idp);\n }).then(function (value) {\n if (value) {\n resolve(value);\n } else {\n reject('Error on obtaining Identity');\n }\n }).catch(function (err) {\n IdentityModule_log.log(err);\n reject(err);\n });\n });\n }\n }, {\n key: \"callGenerateMethods\",\n value: function callGenerateMethods(idp, origin) {\n IdentityModule_log.log('[callGenerateMethods:idp]', idp);\n IdentityModule_log.log('[callGenerateMethods:origin]', origin);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var publicKey; //generates the RSA key pair\n\n _this._crypto.getMyPublicKey().then(function (key) {\n IdentityModule_log.log('[callGenerateMethods:key]', key);\n publicKey = stringify(key); // userkeyPair = keyPair;\n\n IdentityModule_log.log('generateAssertion:no_hint');\n return _this.generateAssertion(publicKey, origin, '', idp);\n }).then(function (url) {\n _this.myHint = url;\n IdentityModule_log.log('generateAssertion:hint');\n return _this.generateAssertion(publicKey, origin, url, idp);\n }).then(function (value) {\n if (value) {\n resolve(value);\n } else {\n reject('Error on obtaining Identity');\n }\n }).catch(function (err) {\n IdentityModule_log.error(err);\n reject(err);\n });\n });\n }\n }, {\n key: \"loginSelectedIdentity\",\n value: function loginSelectedIdentity(publicKey, origin, idp, loginUrl) {\n IdentityModule_log.log('[loginSelectedIdentity:publicKey]', publicKey);\n IdentityModule_log.log('[loginSelectedIdentity:origin]', origin);\n IdentityModule_log.log('[loginSelectedIdentity:idp]', idp); // log.log('[loginSelectedIdentity:keyPair]', keyPair);\n\n IdentityModule_log.log('[loginSelectedIdentity:loginUrl]', loginUrl);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n IdentityModule_log.log('[IdentityModule] openPopup');\n\n _this.callIdentityModuleFunc('openPopup', {\n urlreceived: loginUrl\n }).then(function (idCode) {\n return idCode;\n }, function (err) {\n IdentityModule_log.error('Error while logging in for the selected identity.');\n return reject(err);\n }).then(function (idCode) {\n _this.sendGenerateMessage(publicKey, origin, idCode, idp).then(function (newResponse) {\n if (newResponse.hasOwnProperty('assertion')) {\n _this.identities.addAssertion(newResponse).then(function (result) {\n resolve('Login was successfull');\n }).catch(function (err) {\n reject('Login has failed:' + err);\n });\n } else {\n IdentityModule_log.error('Error while logging in for the selected identity.');\n return reject('Could not generate a valid assertion for selected identity.');\n }\n }).catch(function (err) {\n reject('On loginSelectedIdentity from method sendGenerateMessage error: ' + err);\n });\n });\n });\n }\n }, {\n key: \"selectIdentityForHyperty\",\n value: function selectIdentityForHyperty(origin, idp, idHint) {\n IdentityModule_log.log('[selectIdentityForHyperty:origin]', origin);\n IdentityModule_log.log('[selectIdentityForHyperty:idp]', idp);\n IdentityModule_log.log('[selectIdentityForHyperty:idHint]', idHint);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //generates the RSA key pair\n _this._crypto.getMyPublicKey().then(function (key) {\n var publicKey = stringify(key);\n\n _this.sendGenerateMessage(publicKey, origin, idHint, idp).then(function (response) {\n if (response.hasOwnProperty('assertion')) {\n // identity was logged in, just save it\n _this.identities.addAssertion(response).then(function (value) {\n return resolve(response);\n }, function (err) {\n return reject(err);\n });\n } else if (response.hasOwnProperty('loginUrl')) {\n // identity was not logged in\n _this.loginSelectedIdentity(publicKey, origin, idp, response.loginUrl).then(function (value) {\n return resolve(value);\n }, function (err) {\n return reject(err);\n });\n } else {\n // you should never get here, if you do then the IdP Proxy is not well implemented\n // log.error('GenerateAssertion returned invalid response.');\n IdentityModule_log.log('Proceeding by logging in.');\n\n _this.callGenerateMethods(idp, origin).then(function (value) {\n return resolve(value);\n }, function (err) {\n return reject(err);\n });\n }\n }).catch(function (err) {\n reject('On selectIdentityForHyperty from method sendGenerateMessage error: ' + err);\n });\n }).catch(function (err) {\n reject('On selectIdentityForHyperty from method generateRSAKeyPair error: ' + err);\n });\n });\n }\n }, {\n key: \"selectIdentityFromGUI\",\n value: function selectIdentityFromGUI(origin) {\n var _this3 = this;\n\n IdentityModule_log.log('[IdentityModule.selectIdentityFromGUI:origin]', origin);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this3.getIdentitiesToChoose().then(function (identitiesInfo) {\n return _this.requestIdentityToGUI(identitiesInfo.identities, identitiesInfo.idps);\n }).then(function (value) {\n if (value.type === 'identity') {\n // let chosenID = getUserURLFromEmail(value.value);\n // hack while the user url is not returned from requestIdentityToGUI;\n\n /* let chosenID = 'user://' + _this.identities.currentIdentity.idp.domain + '/' + value.value;\n _this.identities.defaultIdentity = _this.identities.currentIdentity;*/\n // returns the identity info from the chosen id\n // if (_this.identities.currentIdentity) resolve(_this.identities.currentIdentity.assertion);\n if (_this.identities.identities[value.value]) resolve(_this.identities.identities[value.value]);else reject('[IdentityModule.selectIdentityFromGUI] identity not found: ', value.value);\n } else if (value.type === 'idp') {\n _this.callGenerateMethods(value.value, origin).then(function (value) {\n return resolve(value);\n }, function (err) {\n return reject(err);\n });\n } else {\n return reject('error on GUI received message.');\n }\n }).catch(function (err) {\n reject('On selectIdentityFromGUI from method requestIdentityToGUI error: ' + err);\n });\n });\n }\n }, {\n key: \"callIdentityModuleFunc\",\n value: function callIdentityModuleFunc(methodName, parameters, domain, resource) {\n IdentityModule_log.log('[callIdentityModuleFunc:methodName]', methodName);\n IdentityModule_log.log('[callIdentityModuleFunc:parameters]', parameters);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this._showAdmin) {\n if (methodName === 'getAccessToken') {\n _this._showAdmin(methodName, parameters.urlreceived, domain, resource).then(function (result) {\n resolve(result);\n });\n } else _this._showAdmin(methodName);\n } else {\n var message = {\n type: 'execute',\n to: _this._guiURL,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: methodName,\n params: parameters\n }\n }; //post msg with callback but without timout\n\n var callback = function callback(msg) {\n _this._messageBus.removeResponseListener(_this._idmURL, msg.id);\n\n var result = msg.body.value;\n resolve(result);\n };\n\n try {\n _this._messageBus.postMessage(message, callback, false);\n } catch (err) {\n reject('In method callIdentityModuleFunc error: ' + err);\n }\n }\n });\n } //******************* TOKEN METHODS *******************\n\n /**\n * get a Token to be added to a message\n * @param {String} fromURL origin of the message\n * @param {String} toURL target of the messageok\n * @return {JSON} token token to be added to the message\n */\n\n }, {\n key: \"getToken\",\n value: function getToken(msg) {\n var _this = this;\n\n var fromURL = msg.from;\n var toUrl = msg.to;\n\n if (msg.hasOwnProperty('body') && msg.body.hasOwnProperty('source')) {\n fromURL = msg.body.source;\n }\n\n if (msg.type === 'forward') {\n fromURL = msg.body.from;\n }\n\n if (msg.hasOwnProperty('body') && msg.body.hasOwnProperty('subscriber')) {\n fromURL = msg.body.subscriber;\n }\n\n return new Promise(function (resolve, reject) {\n IdentityModule_log.log('[IdentityModule.getToken] for msg ', msg); //log.log('toUrl', toUrl);\n\n _this.registry.isLegacy(toUrl).then(function (result) {\n // log.log('[Identity.IdentityModule.getToken] isLEGACY: ', result);\n if (result) {\n _this._getAccessToken(msg).then(function (token) {\n IdentityModule_log.log('[IdentityModule.getToken] access token ', token);\n resolve(deepClone(token));\n }).catch(function (err) {\n reject('[IdentityModule.getToken] Access Token error ' + err);\n });\n } else {\n _this._getValidToken(fromURL).then(function (token) {\n resolve(token);\n }).catch(function (err) {\n reject('On getToken from method _getValidToken error: ' + err);\n });\n }\n }).catch(function (err) {\n reject('On getToken from method isLegacy error: ' + err);\n });\n });\n }\n /**\n * get an Id Token for a HypertyURL\n * @param {String} hypertyURL the Hyperty address\n * @return {JSON} token Id token to be added to the message\n */\n\n }, {\n key: \"getIdToken\",\n value: function getIdToken(hypertyURL) {\n IdentityModule_log.info('getIdToken:hypertyURL ', hypertyURL);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var splitURL = hypertyURL.split('://');\n var userURL;\n\n if (splitURL[0] !== 'hyperty') {\n // it is a Data Object URL\n _this._getHypertyFromDataObject(hypertyURL).then(function (returnedHypertyURL) {\n userURL = _this.registry.getHypertyOwner(returnedHypertyURL);\n\n if (userURL) {\n var _identity = _this.identities.getIdentity(userURL);\n\n if (_identity) return resolve(_identity);else return reject('[IdentityModule.getIdToken] Identity not found for: ', userURL);\n } else {\n return reject('[IdentityModule.getIdToken] User not found for hyperty: ', returnedHypertyURL);\n }\n }).catch(function (reason) {\n IdentityModule_log.error('[IdentityModule.getIdToken] Error: ', reason);\n reject(reason);\n });\n } else {\n userURL = _this.registry.getHypertyOwner(hypertyURL);\n\n if (userURL) {\n var _identity2 = _this.identities.getIdentity(userURL);\n\n if (_identity2) return resolve(_identity2);else return reject('[IdentityModule.getIdToken] Identity not found for: ', userURL);\n } else {\n return reject('[IdentityModule.getIdToken] User not found for hyperty: ', userURL);\n }\n }\n });\n }\n /**\n * get an Access Token for an external API\n * @param {String} url the external url\n * @return {JSON} token Access token to be added to the message\n */\n\n }, {\n key: \"_getAccessToken\",\n value: function _getAccessToken(msg) {\n var url = msg.to;\n\n var _this = this;\n\n return new Promise(function (resolve) {\n if (!msg.hasOwnProperty('body')) {\n return reject('[IdentityModule._getAccessToken] missing mandatory msg body: ', msg);\n }\n\n if (!msg.body.hasOwnProperty('value')) {\n return reject('[IdentityModule._getAccessToken] missing mandatory msg body value: ', msg);\n }\n\n if (!msg.body.value.hasOwnProperty('resources')) {\n return reject('[IdentityModule._getAccessToken] missing mandatory msg body value resources: ', msg);\n }\n\n var domainToCheck = divideURL(url).domain;\n\n if (url.includes('protostub')) {\n domainToCheck = domainToCheck.replace(domainToCheck.split('.')[0] + '.', '');\n }\n\n var resources = msg.body.value.resources;\n\n _this._getAccessTokenForDomain(domainToCheck, resources).then(function (token) {\n resolve(token);\n });\n });\n }\n }, {\n key: \"_getAccessTokenForDomain\",\n value: function _getAccessTokenForDomain(domainToCheck, resources) {\n var _this = this;\n\n var token;\n return new Promise(function (resolve, reject) {\n try {\n token = _this.identities.getAccessToken(domainToCheck, resources);\n } catch (e) {\n return reject('[IdentityModule._getAccessTokenForDomain] Access Token error ' + err);\n }\n\n if (!token) {\n _this._getNewAccessToken(domainToCheck, resources).then(function (token) {\n IdentityModule_log.log('[Identity.IdentityModule._getAccessTokenForDomain] new Access Token ', token);\n return resolve(token);\n }).catch(function (err) {\n reject('[IdentityModule._getAccessTokenForDomain] on getNewAccessToken ' + err);\n });\n } else if (token.status === 'in-progress') {\n return resolve(_this._inProgressAccessToken(domainToCheck, resources));\n } else {\n var timeNow = secondsSinceEpoch();\n IdentityModule_log.log('[Identity.IdentityModule._getAccessTokenForDomain] found Access Token ', token);\n\n if (timeNow >= token.expires) {\n // if (true) {\n if (token.hasOwnProperty(\"refresh\")) {\n _this._refreshAccessToken(deepClone(token)).then(function (newToken) {\n return resolve(_this.identities.updateAccessToken(newToken));\n });\n } else {\n _this._revokeAccessToken(token, domainToCheck, resources).then(function () {\n setTimeout(function () {\n return _this._getNewAccessToken(domainToCheck, resources);\n }, 1000);\n });\n }\n } else return resolve(deepClone(token));\n }\n });\n }\n }, {\n key: \"_revokeAccessToken\",\n value: function _revokeAccessToken(token, domain, resources) {\n var _this = this; // let domain = _this._resolveDomain(oldIdentity.idp);\n // let message;\n // let assertion = _this.getIdentity(oldIdentity.userProfile.userURL);\n\n\n IdentityModule_log.log('[IdentityModule._revokeAccessToken] to be revoked ', token);\n return new Promise(function (resolve, reject) {\n // let domain = _this._resolveDomain(token.domain);\n var message;\n message = {\n type: 'execute',\n to: _this._resolveDomain(token.domain),\n from: _this._idmURL,\n body: {\n method: 'revokeAccessToken',\n params: {\n token: token\n }\n }\n };\n IdentityModule_log.log('[IdentityModule._revokeAccessToken] revoke msg ', message);\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n var result = res.body.value;\n if (result) _this._identities.removeAccessToken(domain, resources).then(function () {\n resolve(result);\n });\n resolve();\n });\n } catch (err) {\n reject('In IdentityModule._revokeAccessToken on postMessage error: ' + err);\n }\n });\n }\n }, {\n key: \"_inProgressAccessToken\",\n value: function _inProgressAccessToken(domain, resources) {\n var _this4 = this;\n\n this.identities.watchingYou.observe('accessTokens', function (change) {\n IdentityModule_log.log('[IdentityModule._inProgressAccessToken] accessTokens changed ' + _this4.identities.accessTokens);\n var keypath = change.keypath;\n\n if (keypath.includes('status')) {\n keypath = keypath.replace('.status', '');\n }\n\n if (keypath === domain && change.name === 'status' && change.newValue === 'created') {\n // log.log('[Identity.IdentityModule.getToken] token is created ' + _this.identitiesList[domain]);\n return _this4.identities.getAccessToken(domain, resources);\n }\n });\n }\n }, {\n key: \"_getNewAccessToken\",\n value: function _getNewAccessToken(domain, resources) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.identities.setAccessTokenInProgress(domain);\n\n var message = {\n type: 'execute',\n to: _this._resolveDomain(domain),\n from: _this._idmURL,\n body: {\n method: 'getAccessTokenAuthorisationEndpoint',\n params: resources\n }\n }; //let's first get the authorisation URL from the Idp Proxy\n\n _this._messageBus.postMessage(message, function (res) {\n if (res.body.code > 299) {\n return reject('[IdentityModule._getNewAccessToken] Error on getAccessTokenAuthorisationEndpoint from IdP Proxy: ', res.body.desc);\n } // let's ask the user for authorisation\n\n\n _this.callIdentityModuleFunc('getAccessToken', {\n urlreceived: res.body.value\n }, domain, resources[0]).then(function (authorisation) {\n IdentityModule_log.log('[IdentityModule:callIdentityModuleFunc:openPopup] auhtorisation result: ', authorisation);\n message.body.method = 'getAccessToken';\n message.body.params = {\n resources: resources,\n login: authorisation\n }; //wihtout callback to avoid timeout errors?\n // let's ask Access Token from the Idp Proxy\n\n _this._messageBus.postMessage(message, function (res) {\n if (res.body.code > 299) return reject('[IdentityModule._getNewAccessToken] Error on getAccessToken from IdP Proxy: ', res.body.desc);\n\n _this.identities.addAccessToken(res.body.value).then(function (token) {\n IdentityModule_log.info('[IdentityModule._getNewAccessToken] resolving token: ', token);\n return resolve(res.body.value);\n }, function (err) {\n reject(err);\n });\n });\n }, function (err) {\n reject(err);\n });\n });\n });\n }\n }, {\n key: \"_refreshAccessToken\",\n value: function _refreshAccessToken(outdatedToken) {\n var _this = this; // let domain = _this._resolveDomain(oldIdentity.idp);\n // let message;\n // let assertion = _this.getIdentity(oldIdentity.userProfile.userURL);\n\n\n IdentityModule_log.log('IdentityModule._refreshAccessToken:outdatedToken', outdatedToken);\n return new Promise(function (resolve, reject) {\n var domain = _this._resolveDomain(outdatedToken.domain);\n\n var message;\n message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n method: 'refreshAccessToken',\n params: {\n token: outdatedToken\n }\n }\n };\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n var result = res.body.value;\n resolve(result);\n });\n } catch (err) {\n reject('In IdentityModule._refreshAccessToken on postMessage error: ' + err);\n }\n });\n }\n }, {\n key: \"sendRefreshMessage\",\n value: function sendRefreshMessage(oldIdentity) {\n var _this = this; // let domain = _this._resolveDomain(oldIdentity.idp);\n // let message;\n // let assertion = _this.getIdentity(oldIdentity.userProfile.userURL);\n\n\n IdentityModule_log.log('sendRefreshMessage:oldIdentity', oldIdentity);\n return new Promise(function (resolve, reject) {\n var domain = _this._resolveDomain(oldIdentity.idp.domain);\n\n var message;\n\n var assertion = _this.getIdentity(oldIdentity.userProfile.userURL);\n\n IdentityModule_log.info('sendRefreshMessage:oldIdentity', oldIdentity);\n message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: 'refreshAssertion',\n params: {\n identity: assertion\n }\n }\n };\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n if (res.body.code < 300) {\n var result = res.body.value;\n resolve(result);\n } else resolve(res.body.value.body.params, identity);\n });\n } catch (err) {\n reject('In sendRefreshMessage on postMessage error: ' + err);\n }\n });\n }\n }, {\n key: \"getAccessToken\",\n value: function getAccessToken(idpDomain, resources, login) {\n IdentityModule_log.log('[getAccessToken:idpDomain]', idpDomain);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var domain = _this._resolveDomain(idpDomain);\n\n var message;\n message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: 'getAccessToken',\n params: {\n resources: resources,\n login: login\n }\n }\n };\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n if (res.body.code < 299) {\n var result = res.body.value;\n resolve(result);\n } else resolve(res.body);\n });\n } catch (err) {\n reject('IdentityModule.In getAccessToken: ' + err);\n }\n });\n }\n }, {\n key: \"getAccessTokenAuthorisationEndpoint\",\n value: function getAccessTokenAuthorisationEndpoint(scope, idpDomain) {\n IdentityModule_log.log('[getAccessTokenAuthorisationEndpoint:idpDomain]', idpDomain);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var domain = _this._resolveDomain(idpDomain);\n\n var message;\n message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: 'getAccessTokenAuthorisationEndpoint',\n params: {\n resources: scope\n }\n }\n };\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n var result = res.body.value;\n resolve(result);\n });\n } catch (err) {\n reject('In getAccessTokenAuthorisationEndpoint: ' + err);\n }\n });\n }\n }, {\n key: \"sendGenerateMessage\",\n value: function sendGenerateMessage(contents, origin, usernameHint, idpDomain) {\n IdentityModule_log.log('[sendGenerateMessage:contents]', contents);\n IdentityModule_log.log('[sendGenerateMessage:origin]', origin);\n IdentityModule_log.log('[sendGenerateMessage:usernameHint]', usernameHint);\n IdentityModule_log.log('[sendGenerateMessage:idpDomain]', idpDomain);\n IdentityModule_log.log('sendGenerateMessage_hint');\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var domain = _this._resolveDomain(idpDomain);\n\n var message;\n message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: 'generateAssertion',\n params: {\n contents: contents,\n origin: origin,\n usernameHint: usernameHint\n }\n }\n };\n\n try {\n _this._messageBus.postMessage(message, function (res) {\n if (res.body.code < 300) resolve(res.body.value);else reject(res.body);\n });\n } catch (err) {\n reject('In sendGenerateMessage: ' + err);\n }\n });\n }\n /**\n * Requests the IdpProxy from a given Domain for an identityAssertion\n *\n * @param {DOMString} contents contents\n * @param {DOMString} origin origin\n * @param {DOMString} usernameHint usernameHint\n * @param {JSON} keyPair user keyPair\n * @return {IdAssertion} IdAssertion\n */\n\n }, {\n key: \"generateAssertion\",\n value: function generateAssertion(contents, origin, usernameHint, idpDomain) {\n IdentityModule_log.log('[generateAssertion:contents]', contents);\n IdentityModule_log.log('[generateAssertion:origin]', origin);\n IdentityModule_log.log('[generateAssertion:usernameHint]', usernameHint); // log.log('[generateAssertion:keyPair]', keyPair);\n\n IdentityModule_log.log('[generateAssertion:idpDomain]', idpDomain);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n IdentityModule_log.log('[IdentityModule:sendGenerateMessage:sendGenerateMessage]', usernameHint);\n\n _this.sendGenerateMessage(contents, origin, usernameHint, idpDomain).then(function (result) {\n if (result) {\n _this.identities.addAssertion(result).then(function (value) {\n resolve(result);\n }, function (err) {\n reject(err);\n });\n } else {\n reject('error on obtaining identity information');\n }\n }, function (error) {\n if (error.hasOwnProperty('description') && error.description.hasOwnProperty('loginUrl')) {\n _this.callIdentityModuleFunc('login', {\n urlreceived: error.description.loginUrl\n }).then(function (value) {\n IdentityModule_log.log('[IdentityModule:callIdentityModuleFunc:openPopup]', usernameHint);\n resolve(value);\n }, function (err) {\n reject(err);\n });\n } else {\n IdentityModule_log.error('[IdentityModule:sendGenerateMessage] generate assertion with hint error ', error);\n reject(error);\n }\n }).catch(function (err) {\n reject('On generateAssertion from method sendGenerateMessage error: ' + err);\n });\n });\n }\n /**\n * Requests the IdpProxy from a given Domain to validate an IdentityAssertion\n * Returns a promise with the result from the validation.\n * @param {DOMString} assertion\n * @param {DOMString} origin origin\n * @return {Promise} Promise promise with the result from the validation\n */\n\n }, {\n key: \"validateAssertion\",\n value: function validateAssertion(assertion, origin, idpDomain) {\n IdentityModule_log.log('[validateAssertion:assertion]', assertion);\n IdentityModule_log.log('[validateAssertion:origin]', origin);\n IdentityModule_log.log('[validateAssertion:idpDomain]', idpDomain);\n\n var _this = this;\n\n var domain = _this._resolveDomain(idpDomain);\n\n var message = {\n type: 'execute',\n to: domain,\n from: _this._idmURL,\n body: {\n resource: 'identity',\n method: 'validateAssertion',\n params: {\n assertion: assertion,\n origin: origin\n }\n }\n };\n return new Promise(function (resolve, reject) {\n try {\n _this._messageBus.postMessage(message, function (result) {\n if (result.body.code === 200) {\n resolve(result.body.value);\n } else {\n reject('error', result.body.code);\n }\n });\n } catch (err) {\n reject('On validateAssertion from method postMessage error: ' + err);\n }\n });\n }\n }, {\n key: \"addGUIListeners\",\n value: function addGUIListeners() {\n var _this = this;\n\n _this._messageBus.addListener(_this._idmURL, function (msg) {\n var funcName = msg.body.method;\n IdentityModule_log.log('[IdentityModule:addGUIListeners]', msg, msg.body, funcName);\n var returnedValue;\n\n if (funcName === 'deployGUI') {\n returnedValue = _this.deployGUI();\n } else if (funcName === 'getIdentitiesToChoose') {\n _this.getIdentitiesToChoose().then(function (result) {\n // if the function requested is not a promise\n var value = {\n type: 'execute',\n value: result,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if storeIdentity method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'unregisterIdentity') {\n var email = msg.body.params.email;\n returnedValue = _this.unregisterIdentity(email);\n } else if (funcName === 'getMyPublicKey') {\n // because generateRSAKeyPair is a promise\n // we have to send the message only after getting the key pair\n _this._crypto.getMyPublicKey().then(function (pubKey) {\n pubKey = stringify(pubKey);\n var value = {\n type: 'execute',\n value: pubKey,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if generateRSAKeyPair method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'sendGenerateMessage') {\n var contents = msg.body.params.contents;\n var origin = msg.body.params.origin;\n var usernameHint = msg.body.params.usernameHint;\n var idpDomain = msg.body.params.idpDomain;\n var _replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to\n };\n\n _this.sendGenerateMessage(contents, origin, usernameHint, idpDomain).then(function (returnedValue) {\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n _replyMsg.body = value;\n\n try {\n _this._messageBus.postMessage(_replyMsg);\n } catch (err) {\n IdentityModule_log.error('IdentityModule.addGUIListeners sendGenerateMessage error: ' + err);\n }\n }, function (err) {\n IdentityModule_log.info('IDPProxy generateAssertion reply error ' + err);\n _replyMsg.body = err;\n\n _this._messageBus.postMessage(_replyMsg);\n });\n\n return;\n } else if (funcName === 'getAccessTokenAuthorisationEndpoint') {\n var scope = msg.body.params.scope;\n var _idpDomain = msg.body.params.idpDomain;\n\n _this.getAccessTokenAuthorisationEndpoint(scope, _idpDomain).then(function (returnedValue) {\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if sendGenerateMessage method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'addAccessToken') {\n var accessToken = msg.body.params;\n\n _this.identities.addAccessToken(accessToken).then(function (returnedValue) {\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if storeIdentity method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'getAccessToken') {\n var domain = msg.body.params.idpDomain;\n var resources = msg.body.params.resources;\n var login = msg.body.params.login;\n var _replyMsg2 = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to\n };\n\n _this.getAccessToken(domain, resources, login).then(function (returnedValue) {\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n _replyMsg2.body = value;\n\n try {\n _this._messageBus.postMessage(_replyMsg2);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if sendGenerateMessage method postMessage error: ' + err);\n }\n }, function (error) {\n try {\n _replyMsg2.body = error;\n\n _this._messageBus.postMessage(_replyMsg2);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if sendGenerateMessage method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'addAssertion') {\n var result = msg.body.params; // let keyPair = msg.body.params.keyPair;\n\n _this.identities.addAssertion(result).then(function (returnedValue) {\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if storeIdentity method postMessage error: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'refreshAccessToken') {\n var _domain = msg.body.params.domain;\n var _resources = msg.body.params.resources;\n\n _this._getAccessTokenForDomain(_domain, _resources).then(function (token) {\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: {\n value: token.accessToken,\n code: 200\n }\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners for refreshAccessToken request: ' + err);\n }\n });\n\n return;\n } else if (funcName === 'unauthorise') {\n var _domain2 = msg.body.params.domain;\n var _resources2 = msg.body.params.resources;\n\n try {\n _this._revokeAccessToken(_this.identities.getAccessToken(_domain2, _resources2), _domain2, _resources2);\n } catch (e) {\n return reject('[IdentityModule.addGUIListeners] unauthorise error ' + err);\n }\n\n var _replyMsg3 = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: {\n value: true,\n code: 200\n }\n };\n\n try {\n _this._messageBus.postMessage(_replyMsg3);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners for refreshAccessToken request: ' + err);\n }\n\n return;\n }\n /*else if (funcName === 'selectIdentityForHyperty') {\n let origin = msg.body.params.origin;\n let idp = msg.body.params.idp;\n let idHint = msg.body.params.idHint;\n _this.selectIdentityForHyperty(origin, idp, idHint);\n return;\n }*/\n // if the function requested is not a promise\n\n\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n IdentityModule_log.error('On addGUIListeners from if storeIdentity method postMessage error: ' + err);\n }\n });\n }\n }, {\n key: \"deployGUI\",\n value: function deployGUI() {\n var _this = this;\n\n _this.guiDeployed = true;\n } //******************* PRIVATE METHODS *******************\n\n /**\n * GetValidToken is for non legacy hyperties and verifies if the Token is still valid\n * if the token is invalid it requests a new token\n * @param {String} hypertyURL hypertyURL\n * @return {Promise}\n */\n\n }, {\n key: \"_getValidToken\",\n value: function _getValidToken(hypertyURL) {\n IdentityModule_log.log('[IdentityModule._getValidToken]:hypertyURL', hypertyURL);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.getIdToken(hypertyURL).then(function (assertion) {\n IdentityModule_log.log('[IdentityModule._getValidToken] retrieved IdAssertion', assertion);\n var timeNow = secondsSinceEpoch();\n if (!assertion.hasOwnProperty('expires')) return resolve(assertion);\n var expirationDate = assertion.expires;\n /* if (completeId.hasOwnProperty('info')) {\n if (completeId.info.hasOwnProperty('expires')) {\n expirationDate = completeId.info.expires;\n } else if (completeId.info.hasOwnProperty('tokenIDJSON')) {\n expirationDate = completeId.info.tokenIDJSON.exp;\n } else {\n // throw 'The ID Token does not have an expiration time';\n log.info('The ID Token does not have an expiration time');\n resolve(assertion);\n }\n } else if (completeId.hasOwnProperty('infoToken') && completeId.infoToken.hasOwnProperty('exp')) {\n expirationDate = completeId.infoToken.exp;\n } else {\n // throw 'The ID Token does not have an expiration time';\n log.info('The ID Token does not have an expiration time');\n resolve(assertion);\n }*/\n\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] Token expires in', expirationDate);\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] time now:', timeNow);\n\n if (timeNow >= expirationDate) {\n // if (timeNow >= 0) {\n if (assertion.hasOwnProperty('refresh')) {\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] refreshing assertion: ', assertion);\n\n _this.sendRefreshMessage(assertion).then(function (newAssertion) {\n IdentityModule_log.log('[Identity.IdentityModule.getValidToken] refreshed assertion: ', newAssertion);\n\n _this.identities.updateAssertion(newAssertion).then(function () {\n resolve(newAssertion);\n }, function (err) {\n IdentityModule_log.error('[IdentityModule.getValidToken] error updating the assertion ', err);\n reject(err);\n });\n }, function (err) {\n IdentityModule_log.error('[IdentityModule.getValidToken] error refreshing the assertion ', err);\n reject(err);\n });\n } else {\n // no refresh token available, user has to authenticate again to get a new assertion\n // generate new idToken\n _this.callGenerateMethods(assertion.idp.domain).then(function (value) {\n resolve(value);\n }).catch(function (err) {\n reject('[IdentityModule.getValidToken] error when generating a new assertion ' + err);\n });\n }\n } else {\n resolve(assertion);\n }\n }).catch(function (error) {\n IdentityModule_log.error('[IdentityModule.getValidToken] error on getIdToken', error);\n reject(error);\n });\n });\n }\n /**\n * returns the reporter associated to the dataObject URL\n * @param {String} dataObjectURL dataObject url\n * @return {String} reporter dataObject url reporter\n */\n\n }, {\n key: \"_getHypertyFromDataObject\",\n value: function _getHypertyFromDataObject(dataObjectURL) {\n IdentityModule_log.info('_getHypertyFromDataObject:dataObjectURL', dataObjectURL);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var splitedURL = divideURL(dataObjectURL);\n var domain = splitedURL.domain;\n var finalURL = parseMessageURL(dataObjectURL); // check if is the creator of the hyperty\n\n var reporterURL = _this.registry.getReporterURLSynchonous(finalURL);\n\n IdentityModule_log.info('_getHypertyFromDataObject:reporterURL', reporterURL);\n\n if (reporterURL) {\n resolve(reporterURL);\n } else {\n // check if there is already an association from an hypertyURL to the dataObject\n var storedReporterURL = _this.dataObjectsIdentity[finalURL];\n IdentityModule_log.info('_getHypertyFromDataObject:storedReporterURL', storedReporterURL);\n\n if (storedReporterURL) {\n resolve(storedReporterURL);\n } else {\n // check if there is any hyperty that subscribed the dataObjectURL\n var subscriberHyperty = _this.registry.getDataObjectSubscriberHyperty(dataObjectURL);\n\n IdentityModule_log.info('_getHypertyFromDataObject:subscriberHyperty', subscriberHyperty);\n\n if (subscriberHyperty) {\n resolve(subscriberHyperty);\n } else {\n // search in domain registry for the hyperty associated to the dataObject\n // search in case is a subscriber who wants to know the reporter\n // To be reviewed in order to avoid the discovery transaction\n _this._coreDiscovery.discoverDataObjectPerURL(finalURL, domain).then(function (dataObject) {\n IdentityModule_log.info('_getHypertyFromDataObject:dataObject', dataObject);\n _this.dataObjectsIdentity[finalURL] = dataObject.reporter;\n IdentityModule_log.info('_getHypertyFromDataObject:dataObject.reporter', dataObject.reporter);\n resolve(dataObject.reporter);\n }, function (err) {\n reject(err);\n });\n }\n }\n }\n });\n }\n /**\n * Function that resolve and create the domainURL in case it is provided one. If not, resolve the default domainURL\n * @param {String} idpDomain idpDomain (Optional)\n */\n\n }, {\n key: \"_resolveDomain\",\n value: function _resolveDomain(idpDomain) {\n if (!idpDomain) {\n return 'domain-idp://google.com';\n } else {\n return 'domain-idp://' + idpDomain;\n }\n }\n /*\n _secondsSinceEpoch() {\n return Math.floor(Date.now() / 1000);\n }*/\n\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this._messageBus;\n }\n /**\n * Set the messageBus in this Registry\n * @param {MessageBus} messageBus\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this._messageBus = messageBus;\n\n _this.addGUIListeners();\n }\n /**\n * return the coreDiscovery component\n * do we need this??\n */\n\n }, {\n key: \"coreDiscovery\",\n get: function get() {\n var _this = this;\n\n return _this._coreDiscovery;\n }\n /**\n * Set the coreDiscovery component\n * @param {coreDiscovery} coreDiscovery\n */\n ,\n set: function set(coreDiscovery) {\n var _this = this;\n\n _this._coreDiscovery = coreDiscovery;\n }\n /**\n * return the registry in this idModule\n * @param {registry} registry\n */\n\n }, {\n key: \"registry\",\n get: function get() {\n var _this = this;\n\n return _this._registry;\n }\n /**\n * Set the registry in this idModule\n * @param {registry} reg\n */\n ,\n set: function set(registry) {\n var _this = this;\n\n _this._registry = registry;\n }\n }, {\n key: \"identities\",\n get: function get() {\n var _this = this;\n\n return _this._identities;\n },\n set: function set(identities) {\n var _this = this;\n\n _this._identities = identities;\n }\n }, {\n key: \"idps\",\n get: function get() {\n return this._listOfIdps;\n }\n }]);\n\n return IdentityModule;\n}();\n\n/* harmony default export */ var identity_IdentityModule = (IdentityModule_IdentityModule);\n// CONCATENATED MODULE: ./src/identity/IdentityHandler.js\nfunction IdentityHandler_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction IdentityHandler_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction IdentityHandler_createClass(Constructor, protoProps, staticProps) { if (protoProps) IdentityHandler_defineProperties(Constructor.prototype, protoProps); if (staticProps) IdentityHandler_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Provides an API to manage identities from msg bus pipeline\n* TODO: rename to something like IdentityPipelineHandler in order not to conflict with framework related IdentityHandler\n*/\n\n\nvar IdentityHandler_log = loglevel[\"getLogger\"]('IdentityHandler');\n\nvar IdentityHandler_IdentityHandler =\n/*#__PURE__*/\nfunction () {\n function IdentityHandler(idm) {\n IdentityHandler_classCallCheck(this, IdentityHandler);\n\n var _this = this;\n\n _this._idm = idm;\n }\n\n IdentityHandler_createClass(IdentityHandler, [{\n key: \"reset\",\n value: function reset() {\n console.log('IM reset'); // this._idm.identities.reset();\n\n this._idm.identities = new identity_Identities(this._idm.identities._type, this._idm.identities._storageManager);\n console.log(this._idm.identities);\n }\n }, {\n key: \"_isToSetID\",\n value: function _isToSetID(message) {\n var schemasToIgnore = ['domain-idp', 'runtime', 'domain'];\n var _from = message.from;\n\n if (message.body && message.body.hasOwnProperty('source')) {\n _from = message.body.source;\n }\n\n if (message.body && message.body.hasOwnProperty('subscriber')) {\n _from = message.body.subscriber;\n }\n\n if (message.type === 'forward') {\n return false;\n } // Signalling Messages between P2P Stubs don't have Identities. FFS\n\n\n if (_from.includes('/p2prequester/') || _from.includes('/p2phandler/')) {\n return false;\n }\n\n var splitFrom = _from.split('://');\n\n var fromSchema = splitFrom[0];\n var isToIgnore = schemasToIgnore.indexOf(fromSchema) === -1;\n return isToIgnore;\n }\n }, {\n key: \"processMessage\",\n value: function processMessage(message) {\n var _this2 = this;\n\n IdentityHandler_log.log('[IdentityHandler.processMessage] ', message);\n return new Promise(function (resolve, reject) {\n // skip messages that don't need identity tokens in the body\n if (!_this2._isToSetID(message)) return resolve(message);\n /* let from = message.from;\n let sourceURL = undefined;\n if ( message.hasOwnProperty('body') && message.body.hasOwnProperty('source')) {\n from = message.body.source;\n }\n if (message.type === 'forward') {\n from = message.body.from;\n }\n if (message.hasOwnProperty('body') && message.body.hasOwnProperty('subscriber')) {\n from = message.body.subscriber;\n }*/\n\n _this2._idm.getToken(message).then(function (identity) {\n if (!message.hasOwnProperty('body')) message.body = {};\n message.body.identity = identity;\n resolve(message);\n }).catch(function (reason) {\n IdentityHandler_log.error(reason);\n reject(reason);\n });\n });\n }\n }]);\n\n return IdentityHandler;\n}();\n\n/* harmony default export */ var identity_IdentityHandler = (IdentityHandler_IdentityHandler);\n// CONCATENATED MODULE: ./src/policy/ActionsService.js\nfunction ActionsService_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ActionsService_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ActionsService_createClass(Constructor, protoProps, staticProps) { if (protoProps) ActionsService_defineProperties(Constructor.prototype, protoProps); if (staticProps) ActionsService_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar ActionsService =\n/*#__PURE__*/\nfunction () {\n function ActionsService(context) {\n ActionsService_classCallCheck(this, ActionsService);\n\n this.context = context;\n }\n\n ActionsService_createClass(ActionsService, [{\n key: \"enforcePolicies\",\n value: function enforcePolicies(message, isIncomingMessage) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var policies = _this.context.getPolicies(message, isIncomingMessage);\n\n if (policies !== undefined) {\n if (policies.serviceProviderPolicy !== undefined) {\n policies.serviceProviderPolicy.enforceActions(_this.context, message).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n if (policies.userPolicy !== undefined) {\n policies.userPolicy.enforceActions(_this.context, message).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve([message]);\n }\n }\n } else {\n resolve([message]);\n }\n });\n }\n }, {\n key: \"forwardToID\",\n value: function forwardToID(message, email) {\n var _this = this;\n\n if (!_this.context.runtimeRegistry) throw new Error('forward message to given ID is unsupported in this environment');\n return new Promise(function (resolve, reject) {\n if (_this.context.runtimeRegistry.hypertiesList[0].hypertyURL === message.to) {\n var splitTo = message.to.split('://');\n\n if (splitTo[0] !== 'runtime') {\n _this.context.runtimeRegistry.discoverHypertyPerUser(email).then(function (result) {\n message.to = result.hypertyURL;\n message.body.via = undefined;\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(message);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve(message);\n }\n } else {\n resolve(message);\n }\n });\n }\n }, {\n key: \"forwardToHyperty\",\n value: function forwardToHyperty(message, hypertyURL) {\n var _this = this;\n\n if (!_this.context.runtimeRegistry) throw new Error('forward message to given ID is unsupported in this environment');\n return new Promise(function (resolve) {\n if (_this.context.runtimeRegistry.hypertiesList[0].hypertyURL === message.to) {\n var splitTo = message.to.split('://');\n\n if (splitTo[0] !== 'runtime') {\n message.to = hypertyURL;\n message.body.via = undefined;\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(message);\n } else {\n resolve(message);\n }\n } else {\n resolve(message);\n }\n });\n }\n }, {\n key: \"sendAutomaticMessage\",\n value: function sendAutomaticMessage(message, text) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var automaticMessage = {\n from: message.to,\n to: message.from,\n body: {\n value: text\n },\n type: message.type\n };\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(automaticMessage);\n });\n }\n }]);\n\n return ActionsService;\n}();\n\n/* harmony default export */ var policy_ActionsService = (ActionsService);\n// CONCATENATED MODULE: ./src/policy/Operators.js\nfunction Operators_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Operators_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Operators_createClass(Constructor, protoProps, staticProps) { if (protoProps) Operators_defineProperties(Constructor.prototype, protoProps); if (staticProps) Operators_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar Operators =\n/*#__PURE__*/\nfunction () {\n function Operators() {\n Operators_classCallCheck(this, Operators);\n }\n\n Operators_createClass(Operators, [{\n key: \"and\",\n value: function and(params) {\n return params[0] && params[1];\n }\n }, {\n key: \"between\",\n value: function between(params) {\n var start = parseInt(params[0][0]);\n var end = parseInt(params[0][1]);\n var now = params[1];\n\n if (end < start) {\n now = now < start ? now += 2400 : now;\n end += 2400;\n }\n\n return now > start && now < end;\n }\n }, {\n key: \"equals\",\n value: function equals(params) {\n return String(params[0]) === '*' || String(params[0]) === String(params[1]);\n }\n }, {\n key: \"greaterThan\",\n value: function greaterThan(params) {\n return params[1] > params[0];\n }\n }, {\n key: \"in\",\n value: function _in(params) {\n return params[0].indexOf(params[1]) > -1;\n }\n }, {\n key: \"lessThan\",\n value: function lessThan(params) {\n return params[1] < params[0];\n }\n }, {\n key: \"not\",\n value: function not(params) {\n return !params[0];\n }\n }, {\n key: \"or\",\n value: function or(params) {\n return params[0] || params[1];\n }\n }]);\n\n return Operators;\n}();\n\n/* harmony default export */ var policy_Operators = (Operators);\n// CONCATENATED MODULE: ./src/policy/PDP.js\nfunction PDP_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction PDP_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction PDP_createClass(Constructor, protoProps, staticProps) { if (protoProps) PDP_defineProperties(Constructor.prototype, protoProps); if (staticProps) PDP_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/**\n* The Policy Decision Point (PDP) decides if a message is to be authorised by checking a set of\n* policies. The resource to be verified is specified in the first word of the 'condition' field of\n* a Policy object. The implementation that verifies if the message is compliant with a policy is\n* specified in a hashtable to allow dynamic definition of the implementation, providing\n* extensibility to the Policy Engine functionalities.\n*/\n\nvar PDP_PDP =\n/*#__PURE__*/\nfunction () {\n function PDP(context) {\n PDP_classCallCheck(this, PDP);\n\n this.context = context;\n this.operators = new policy_Operators();\n }\n\n PDP_createClass(PDP, [{\n key: \"evaluatePolicies\",\n value: function evaluatePolicies(message, isIncomingMessage) {\n var policies = this.context.getPolicies(message, isIncomingMessage);\n var result = 'Not Applicable';\n\n if (policies !== undefined) {\n result = this.evaluatePolicy(message, policies.serviceProviderPolicy, isIncomingMessage);\n\n if (result || result === 'Not Applicable') {\n var userResult = this.evaluatePolicy(message, policies.userPolicy, isIncomingMessage);\n\n if (userResult !== 'Not Applicable') {\n result = userResult;\n }\n }\n }\n\n return result;\n }\n }, {\n key: \"evaluatePolicy\",\n value: function evaluatePolicy(message, policy, isIncoming) {\n var result = 'Not Applicable';\n\n if (policy) {\n result = policy.evaluateRules(this.context, message, isIncoming);\n }\n\n return result;\n }\n }]);\n\n return PDP;\n}();\n\n/* harmony default export */ var policy_PDP = (PDP_PDP);\n// CONCATENATED MODULE: ./src/policy/combiningAlgorithms/AllowOverrides.js\nfunction AllowOverrides_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction AllowOverrides_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction AllowOverrides_createClass(Constructor, protoProps, staticProps) { if (protoProps) AllowOverrides_defineProperties(Constructor.prototype, protoProps); if (staticProps) AllowOverrides_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* @author Ana Caldeira \n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\n*/\nvar AllowOverrides =\n/*#__PURE__*/\nfunction () {\n function AllowOverrides() {\n AllowOverrides_classCallCheck(this, AllowOverrides);\n }\n\n AllowOverrides_createClass(AllowOverrides, [{\n key: \"combine\",\n\n /**\n * Given an array of individual authorization decisions, prioritizes a positive one.\n * @param {boolean[]} decisions\n * @returns {boolean}\n */\n value: function combine(decisions) {\n if (decisions.indexOf(true) !== -1) {\n return true;\n } else {\n if (decisions.indexOf(false) !== -1) {\n return false;\n } else {\n return 'Not Applicable';\n }\n }\n }\n }]);\n\n return AllowOverrides;\n}();\n\n/* harmony default export */ var combiningAlgorithms_AllowOverrides = (AllowOverrides);\n// CONCATENATED MODULE: ./src/policy/combiningAlgorithms/BlockOverrides.js\nfunction BlockOverrides_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction BlockOverrides_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction BlockOverrides_createClass(Constructor, protoProps, staticProps) { if (protoProps) BlockOverrides_defineProperties(Constructor.prototype, protoProps); if (staticProps) BlockOverrides_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* @author Ana Caldeira \n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\n*/\nvar BlockOverrides =\n/*#__PURE__*/\nfunction () {\n function BlockOverrides() {\n BlockOverrides_classCallCheck(this, BlockOverrides);\n }\n\n BlockOverrides_createClass(BlockOverrides, [{\n key: \"combine\",\n\n /**\n * Given an array of individual authorisation decisions, prioritises a negative one.\n * @param {boolean[]} decisions\n * @returns {boolean}\n */\n value: function combine(decisions) {\n if (decisions.indexOf(false) !== -1) {\n return false;\n } else {\n if (decisions.indexOf(true) !== -1) {\n return true;\n } else {\n return 'Not Applicable';\n }\n }\n }\n }]);\n\n return BlockOverrides;\n}();\n\n/* harmony default export */ var combiningAlgorithms_BlockOverrides = (BlockOverrides);\n// CONCATENATED MODULE: ./src/policy/combiningAlgorithms/FirstApplicable.js\nfunction FirstApplicable_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction FirstApplicable_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction FirstApplicable_createClass(Constructor, protoProps, staticProps) { if (protoProps) FirstApplicable_defineProperties(Constructor.prototype, protoProps); if (staticProps) FirstApplicable_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* @author Ana Caldeira \n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\n*/\nvar FirstApplicable =\n/*#__PURE__*/\nfunction () {\n function FirstApplicable() {\n FirstApplicable_classCallCheck(this, FirstApplicable);\n }\n\n FirstApplicable_createClass(FirstApplicable, [{\n key: \"combine\",\n\n /**\n * Given an array of individual authorisation decisions, returns the first one different from 'Not Applicable', either positive or negative.\n * @param {boolean[]} decisions\n * @returns {boolean}\n */\n value: function combine(decisions) {\n for (var i in decisions) {\n if (decisions[i] !== 'Not Applicable') {\n return decisions[i];\n }\n }\n\n return 'Not Applicable';\n }\n }]);\n\n return FirstApplicable;\n}();\n\n/* harmony default export */ var combiningAlgorithms_FirstApplicable = (FirstApplicable);\n// CONCATENATED MODULE: ./src/policy/conditions/Condition.js\nfunction Condition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Condition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Condition_createClass(Constructor, protoProps, staticProps) { if (protoProps) Condition_defineProperties(Constructor.prototype, protoProps); if (staticProps) Condition_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* @author Ana Caldeira \n* @classdesc Class to represent a condition and evaluate its applicability.\n*/\n\nvar Condition_Condition =\n/*#__PURE__*/\nfunction () {\n /**\n * Creates a new Condition.\n * @class\n * @param {string} attribute\n * @param {string} operator\n * @param {*} params\n */\n function Condition(attribute, operator, params) {\n Condition_classCallCheck(this, Condition);\n\n this.attribute = attribute;\n this.operator = operator;\n this.params = params;\n this.operators = new policy_Operators();\n }\n /**\n * Verifies if the condition is applicable to the message. First, the system value that corresponds to the attribute is retrieved; then, that value is compared with the parameter specified in the condition by executing the operator implementation. If the operator is 'in' and the name of a group is given, then the array holding the members of the group is retrieved before the comparison.\n * @param {Object} context environment where the Policy Engine is being used\n * @param {Object} message\n */\n\n\n Condition_createClass(Condition, [{\n key: \"isApplicable\",\n value: function isApplicable(context, message) {\n context[this.attribute] = {\n message: message\n };\n var value = context[this.attribute];\n var tempParam;\n\n if (this.operator === 'in') {\n if (!Array.isArray(this.params)) {\n tempParam = context.getGroup(this.params, message.to);\n return this.operators[this.operator]([tempParam, value]);\n }\n }\n\n return this.operators[this.operator]([this.params, value]);\n }\n }]);\n\n return Condition;\n}();\n\n/* harmony default export */ var conditions_Condition = (Condition_Condition);\n// CONCATENATED MODULE: ./src/policy/conditions/SubscriptionCondition.js\nfunction SubscriptionCondition_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { SubscriptionCondition_typeof = function _typeof(obj) { return typeof obj; }; } else { SubscriptionCondition_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return SubscriptionCondition_typeof(obj); }\n\nfunction SubscriptionCondition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SubscriptionCondition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SubscriptionCondition_createClass(Constructor, protoProps, staticProps) { if (protoProps) SubscriptionCondition_defineProperties(Constructor.prototype, protoProps); if (staticProps) SubscriptionCondition_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction SubscriptionCondition_possibleConstructorReturn(self, call) { if (call && (SubscriptionCondition_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return SubscriptionCondition_assertThisInitialized(self); }\n\nfunction SubscriptionCondition_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction SubscriptionCondition_get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { SubscriptionCondition_get = Reflect.get; } else { SubscriptionCondition_get = function _get(target, property, receiver) { var base = SubscriptionCondition_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return SubscriptionCondition_get(target, property, receiver || target); }\n\nfunction SubscriptionCondition_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = SubscriptionCondition_getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction SubscriptionCondition_getPrototypeOf(o) { SubscriptionCondition_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return SubscriptionCondition_getPrototypeOf(o); }\n\nfunction SubscriptionCondition_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) SubscriptionCondition_setPrototypeOf(subClass, superClass); }\n\nfunction SubscriptionCondition_setPrototypeOf(o, p) { SubscriptionCondition_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return SubscriptionCondition_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n* @author Ana Caldeira \n* @classdesc Class to represent a subscription condition and evaluate its applicability.\n*/\n\nvar SubscriptionCondition =\n/*#__PURE__*/\nfunction (_Condition) {\n SubscriptionCondition_inherits(SubscriptionCondition, _Condition);\n\n /**\n * Creates a new SubscriptionCondition.\n * @class\n * @param {string} attribute\n * @param {string} operator\n * @param {*} params\n */\n function SubscriptionCondition(attribute, operator, params) {\n SubscriptionCondition_classCallCheck(this, SubscriptionCondition);\n\n return SubscriptionCondition_possibleConstructorReturn(this, SubscriptionCondition_getPrototypeOf(SubscriptionCondition).call(this, attribute, operator, params));\n }\n /**\n * Verifies if the subscription condition is applicable to the message. First, verifies if the message is of the subscription type; second, verifies if the message is from a remote runtime to guarantee that the subscription is being validated in the destination runtime; third, verifies if the subscription preference is met.\n * @param {Object} context environment where the Policy Engine is being used\n * @param {Object} message\n */\n\n\n SubscriptionCondition_createClass(SubscriptionCondition, [{\n key: \"isApplicable\",\n value: function isApplicable(context, message) {\n var isSubscription = message.type === 'subscribe';\n var isFromRemoteSM = context.isFromRemoteSM(message.from);\n\n if (isSubscription & isFromRemoteSM) {\n return SubscriptionCondition_get(SubscriptionCondition_getPrototypeOf(SubscriptionCondition.prototype), \"isApplicable\", this).call(this, context, message);\n } else {\n return false;\n }\n }\n }]);\n\n return SubscriptionCondition;\n}(conditions_Condition);\n\n/* harmony default export */ var conditions_SubscriptionCondition = (SubscriptionCondition);\n// CONCATENATED MODULE: ./src/policy/conditions/AdvancedCondition.js\nfunction AdvancedCondition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction AdvancedCondition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction AdvancedCondition_createClass(Constructor, protoProps, staticProps) { if (protoProps) AdvancedCondition_defineProperties(Constructor.prototype, protoProps); if (staticProps) AdvancedCondition_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar AdvancedCondition_AdvancedCondition =\n/*#__PURE__*/\nfunction () {\n function AdvancedCondition(condition) {\n AdvancedCondition_classCallCheck(this, AdvancedCondition);\n\n this.operators = new policy_Operators();\n\n if (condition.operators !== undefined) {\n condition = condition.condition;\n }\n\n condition = this.buildCondition(condition);\n this.condition = condition;\n }\n\n AdvancedCondition_createClass(AdvancedCondition, [{\n key: \"buildCondition\",\n value: function buildCondition(condition) {\n if (Array.isArray(condition[1])) {\n condition[1] = this.buildCondition(condition[1]);\n } else {\n if (condition[1].attribute === 'subscription') {\n condition[1] = new conditions_SubscriptionCondition(condition[1].attribute, condition[1].operator, condition[1].params);\n } else {\n condition[1] = new conditions_Condition(condition[1].attribute, condition[1].operator, condition[1].params);\n }\n }\n\n if (condition[2] !== undefined) {\n if (Array.isArray(condition[2])) {\n condition[2] = this.buildCondition(condition[2]);\n } else {\n if (condition[2].attribute === 'subscription') {\n condition[2] = new conditions_SubscriptionCondition(condition[2].attribute, condition[2].operator, condition[2].params);\n } else {\n condition[2] = new conditions_Condition(condition[2].attribute, condition[2].operator, condition[2].params);\n }\n }\n }\n\n return condition;\n }\n }, {\n key: \"isApplicable\",\n value: function isApplicable(context, message, scope, target, operator, left, right) {\n if (!operator) {\n operator = this.condition[0];\n left = this.condition[1];\n right = this.condition[2];\n }\n\n while (!(left instanceof conditions_Condition) & !(left instanceof conditions_SubscriptionCondition) & typeof left !== 'boolean') {\n left = this.isApplicable(context, message, scope, target, left[0], left[1], left[2]);\n }\n\n if (right !== undefined) {\n while (!(right instanceof conditions_Condition) & !(right instanceof conditions_SubscriptionCondition) & typeof right !== 'boolean') {\n right = this.isApplicable(context, message, scope, target, right[0], right[1], right[2]);\n }\n }\n\n var resultLeft = typeof left === 'boolean' ? left : left.isApplicable(context, message, scope, target);\n var resultRight;\n\n if (right !== undefined) {\n resultRight = typeof right === 'boolean' ? right : right.isApplicable(context, message, scope, target);\n }\n\n return this.operators[operator]([resultLeft, resultRight]);\n }\n }]);\n\n return AdvancedCondition;\n}();\n\n/* harmony default export */ var conditions_AdvancedCondition = (AdvancedCondition_AdvancedCondition);\n// CONCATENATED MODULE: ./src/policy/Rule.js\nfunction Rule_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Rule_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Rule_createClass(Constructor, protoProps, staticProps) { if (protoProps) Rule_defineProperties(Constructor.prototype, protoProps); if (staticProps) Rule_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\nvar Rule_Rule =\n/*#__PURE__*/\nfunction () {\n function Rule(decision, condition, scope, target, priority) {\n Rule_classCallCheck(this, Rule);\n\n this.decision = decision;\n this.setCondition(condition);\n this.priority = priority;\n this.scope = scope;\n this.target = target;\n }\n\n Rule_createClass(Rule, [{\n key: \"setCondition\",\n value: function setCondition(condition) {\n if (!(condition instanceof conditions_Condition || condition instanceof conditions_AdvancedCondition || condition instanceof conditions_AdvancedCondition)) {\n var attribute = condition.attribute;\n\n switch (attribute) {\n case 'subscription':\n this.condition = new conditions_AdvancedCondition(condition.attribute, condition.operator, condition.params);\n break;\n\n case undefined:\n this.condition = new conditions_AdvancedCondition(condition);\n break;\n\n default:\n this.condition = new conditions_Condition(condition.attribute, condition.operator, condition.params);\n }\n } else {\n this.condition = condition;\n }\n }\n }, {\n key: \"evaluate\",\n value: function evaluate(context, message, isIncoming) {\n var field = isIncoming ? message.to : message.from;\n var hypertyName;\n\n switch (this.scope) {\n case 'global':\n break;\n\n case 'hyperty':\n if (isDataObjectURL(field)) {\n var reporter = context.runtimeRegistry.getReporterURLSynchonous(removePathFromURL(field));\n\n if (reporter !== undefined) {\n hypertyName = context.runtimeRegistry.getHypertyName(reporter);\n }\n } else {\n if (field.split('://')[0] === 'hyperty') {\n hypertyName = context.runtimeRegistry.getHypertyName(removePathFromURL(field));\n }\n }\n\n if (hypertyName === this.target) {\n break;\n }\n\n return 'Not Applicable';\n\n case 'identity':\n var owner;\n\n if (isDataObjectURL(field)) {\n var _reporter = context.runtimeRegistry.getReporterURLSynchonous(removePathFromURL(field));\n\n owner = context.runtimeRegistry.getHypertyOwner(_reporter);\n } else {\n if (field.split('://')[0] === 'hyperty') {\n owner = context.runtimeRegistry.getHypertyOwner(removePathFromURL(field));\n }\n }\n\n if (owner !== undefined) {\n owner = getUserEmailFromURL(owner);\n }\n\n if (owner === this.target) {\n break;\n }\n\n return 'Not Applicable';\n }\n\n if (this.condition.isApplicable(context, message, this.scope, this.target)) {\n return this.decision;\n } else {\n return 'Not Applicable';\n }\n }\n }]);\n\n return Rule;\n}();\n\n/* harmony default export */ var policy_Rule = (Rule_Rule);\n// CONCATENATED MODULE: ./src/policy/Policy.js\nfunction Policy_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Policy_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Policy_createClass(Constructor, protoProps, staticProps) { if (protoProps) Policy_defineProperties(Constructor.prototype, protoProps); if (staticProps) Policy_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\nvar Policy_Policy =\n/*#__PURE__*/\nfunction () {\n function Policy(key, rules, actions, combiningAlgorithm) {\n Policy_classCallCheck(this, Policy);\n\n if (!key) throw new Error('key is not defined');\n if (!actions) throw new Error('actions are not defined');\n this.actions = actions;\n this.key = key;\n\n this._setRules(rules);\n\n this._setCombiningAlgorithm(combiningAlgorithm);\n }\n\n Policy_createClass(Policy, [{\n key: \"addAction\",\n value: function addAction(method, param) {\n this.actions.push({\n method: method,\n param: param\n });\n }\n }, {\n key: \"createRule\",\n value: function createRule(decision, condition, scope, target, priority) {\n if (priority === undefined) {\n priority = this.getLastPriority() + 1;\n }\n\n var rule = new policy_Rule(decision, condition, scope, target, priority);\n this.rules.push(rule);\n }\n }, {\n key: \"deleteRule\",\n value: function deleteRule(rule) {\n var indexToRemove = this.rules.indexOf(rule);\n this.rules.splice(indexToRemove, 1);\n }\n }, {\n key: \"enforceActions\",\n value: function enforceActions(context, message) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var results = [];\n\n if (_this.actions.length !== 0) {\n for (var i in _this.actions) {\n var result = context.pep.actionsService[_this.actions[i].method](message, _this.actions[i].param);\n\n results.push(result);\n }\n\n Promise.all(results).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve([message]);\n }\n });\n }\n }, {\n key: \"evaluateRules\",\n value: function evaluateRules(context, message, isIncoming) {\n var results = [];\n\n for (var i in this.rules) {\n results.push(this.rules[i].evaluate(context, message, isIncoming));\n }\n\n return this.combiningAlgorithm.combine(results);\n }\n }, {\n key: \"getLastPriority\",\n value: function getLastPriority() {\n var priorities = [];\n\n if (this.rules.length !== 0) {\n for (var i in this.rules) {\n priorities.push(this.rules[i].priority);\n }\n\n return Math.max.apply(Math, priorities);\n } else {\n return -1;\n }\n }\n }, {\n key: \"getRuleByPriority\",\n value: function getRuleByPriority(priority) {\n for (var i in this.rules) {\n if (String(this.rules[i].priority) === String(priority)) {\n return this.rules[i];\n }\n }\n\n throw Error('Rule with priority ' + priority + ' does not exist!');\n }\n }, {\n key: \"_setCombiningAlgorithm\",\n value: function _setCombiningAlgorithm(combiningAlgorithm) {\n if (!combiningAlgorithm) {\n combiningAlgorithm = 'blockOverrides';\n }\n\n switch (combiningAlgorithm) {\n case 'blockOverrides':\n this.combiningAlgorithm = new combiningAlgorithms_BlockOverrides();\n break;\n\n case 'allowOverrides':\n this.combiningAlgorithm = new combiningAlgorithms_AllowOverrides();\n break;\n\n case 'firstApplicable':\n this.combiningAlgorithm = new combiningAlgorithms_FirstApplicable();\n break;\n\n default:\n throw Error('Unknown algorithm: ' + combiningAlgorithm);\n }\n }\n }, {\n key: \"_setRules\",\n value: function _setRules(rules) {\n this.rules = [];\n\n for (var i in rules) {\n var rule = rules[i];\n\n if (rule.priority === undefined) {\n rule.priority = this.getLastPriority() + 1;\n }\n\n if (!(rule instanceof policy_Rule)) {\n rule = new policy_Rule(rule.decision, rule.condition, rule.scope, rule.target, rule.priority);\n }\n\n this.rules.push(rule);\n }\n }\n }, {\n key: \"sortRules\",\n value: function sortRules() {\n return this.rules.sort(function (a, b) {\n var x = a.priority;\n var y = b.priority;\n return x < y ? -1 : x > y ? 1 : 0;\n });\n }\n }]);\n\n return Policy;\n}();\n\n/* harmony default export */ var policy_Policy = (Policy_Policy);\n// CONCATENATED MODULE: ./src/policy/PEP.js\nfunction PEP_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction PEP_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction PEP_createClass(Constructor, protoProps, staticProps) { if (protoProps) PEP_defineProperties(Constructor.prototype, protoProps); if (staticProps) PEP_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar PEP_log = loglevel[\"getLogger\"]('PEP');\n\n\n\n\n\nvar PEP_PEP =\n/*#__PURE__*/\nfunction () {\n /**\n * Creates a Policy Enforcement Point (PEP) instance\n * @param {Object} context\n */\n function PEP(context) {\n PEP_classCallCheck(this, PEP);\n\n var _this = this;\n\n _this.pdp = new policy_PDP(context);\n _this.actionsService = new policy_ActionsService(context);\n _this.context = context;\n context.pep = _this; //TODO should be added a trigger to verify when the loadConfigurations is successfully completed\n\n context.loadConfigurations();\n }\n /**\n * return the messageBus in this Registry\n * @param {MessageBus} messageBus\n */\n\n\n PEP_createClass(PEP, [{\n key: \"addGUIListeners\",\n value: function addGUIListeners() {\n var _this = this;\n\n _this.context.messageBus.addListener(_this.context.pepURL, function (msg) {\n var funcName = msg.body.method;\n var returnedValue;\n\n if (funcName === 'addToGroup') {\n var groupName = msg.body.params.groupName;\n var userEmail = msg.body.params.userEmail;\n returnedValue = _this.context.addToGroup(groupName, userEmail);\n } else if (funcName === 'createGroup') {\n var _groupName = msg.body.params.groupName;\n returnedValue = _this.context.createGroup(_groupName);\n } else if (funcName === 'addPolicy') {\n var source = msg.body.params.source;\n var key = msg.body.params.key;\n var policy = msg.body.params.policy;\n var combiningAlgorithm = msg.body.params.combiningAlgorithm;\n returnedValue = _this.addPolicy(source, key, policy, combiningAlgorithm);\n } else if (funcName === 'deleteGroup') {\n var _groupName2 = msg.body.params.groupName;\n returnedValue = _this.context.deleteGroup(_groupName2);\n } else if (funcName === 'removePolicy') {\n var _source = msg.body.params.source;\n var _key = msg.body.params.key;\n returnedValue = _this.removePolicy(_source, _key);\n } else if (funcName === 'savePolicies') {\n var _source2 = msg.body.params.source;\n returnedValue = _this.context.savePolicies(_source2);\n } else if (funcName === 'userPolicies') {\n returnedValue = _this.context.userPolicies;\n } else if (funcName === 'activeUserPolicy') {\n var userPolicy = msg.body.params.userPolicy;\n\n if (userPolicy) {\n _this.context.activeUserPolicy = userPolicy;\n }\n\n returnedValue = _this.context.activeUserPolicy;\n } else if (funcName === 'userPolicy') {\n var _key2 = msg.body.params.key;\n returnedValue = _this.context.userPolicies[_key2];\n } else if (funcName === 'saveActivePolicy') {\n returnedValue = _this.context.saveActivePolicy();\n } else if (funcName === 'getMyEmails') {\n returnedValue = _this.context.getMyEmails();\n } else if (funcName === 'getMyHyperties') {\n returnedValue = _this.context.getMyHyperties();\n } else if (funcName === 'groups') {\n returnedValue = _this.context.groups;\n } else if (funcName === 'getGroupsNames') {\n returnedValue = _this.context.getGroupsNames();\n }\n\n if (funcName === 'removeFromGroup') {\n var _groupName3 = msg.body.params.groupName;\n var _userEmail = msg.body.params.userEmail;\n returnedValue = _this.context.removeFromGroup(_groupName3, _userEmail);\n }\n\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n _this.context.messageBus.postMessage(replyMsg);\n });\n }\n /**\n * Adds a policy to the Policy Enforcement Point (PEP). The policy can be created by the service\n * provider or by the user.\n * @param {String} source\n * @param {String} key\n * @param {Object} policy\n */\n\n }, {\n key: \"addPolicy\",\n value: function addPolicy(source, key, policy, combiningAlgorithm) {\n if (!source) throw new Error('source is not defined');\n if (!key) throw new Error('key is not defined');\n\n if (policy === undefined) {\n policy = new policy_Policy(key, [], [], combiningAlgorithm);\n } else {\n if (!(policy instanceof policy_Policy)) {\n policy = new policy_Policy(policy.key, policy.rules, policy.actions, policy.combiningAlgorithm);\n }\n }\n\n switch (source) {\n case 'SERVICE_PROVIDER':\n this.context.savePolicies(source, policy, key);\n break;\n\n case 'USER':\n this.context.userPolicies[key] = policy;\n this.context.savePolicies(source);\n break;\n\n default:\n throw Error('Unknown policy source: ' + source);\n }\n }\n }, {\n key: \"authorise\",\n value: function authorise(message, isIncoming) {\n var _this2 = this;\n\n // log.log('[Policy.PEP Authorise] ', message);\n // log.log(message);\n if (!message) throw new Error('message is not defined');\n if (!message.from) throw new Error('message.from is not defined');\n if (!message.to) throw new Error('message.to is not defined');\n if (!message.type) throw new Error('message.type is not defined');\n message.body = message.body || {};\n return new Promise(function (resolve, reject) {\n message.body = message.body || {};\n var _this = _this2;\n\n var result = _this.pdp.evaluatePolicies(message, isIncoming);\n\n if (result === 'Not Applicable') {\n result = _this.context.defaultBehaviour;\n message.body.auth = false;\n }\n\n _this.actionsService.enforcePolicies(message, isIncoming).then(function (messages) {\n for (var i in messages) {\n message = messages[i];\n\n if (result) {\n message.body.auth = message.body.auth === undefined ? true : message.body.auth;\n resolve(message);\n } else {\n var errorMessage = {\n body: {\n code: 403,\n description: 'Blocked by policy'\n },\n from: message.to,\n to: message.from,\n type: 'response'\n };\n reject(errorMessage);\n }\n }\n }, function (error) {\n reject(error);\n });\n });\n }\n }, {\n key: \"authoriseSync\",\n value: function authoriseSync(message) {\n var result;\n message.body = message.body || {};\n result = this.pdp.evaluatePolicies(message, true);\n\n if (result === 'Not Applicable') {\n result = this.context.defaultBehaviour;\n }\n\n return result;\n }\n }, {\n key: \"removePolicy\",\n value: function removePolicy(source, key) {\n if (!source) throw new Error('source is not defined');\n if (source !== '*' && !key) throw new Error('key is not defined');\n\n switch (source) {\n case '*':\n this.context.serviceProviderPolicy = {};\n this.context.userPolicies = {};\n this.context.activeUserPolicy = undefined;\n this.context.savePolicies('USER');\n this.context.savePolicies('SERVICE_PROVIDER');\n this.context.saveActivePolicy();\n break;\n\n case 'SERVICE_PROVIDER':\n delete this.context.serviceProviderPolicy[key];\n this.context.savePolicies();\n break;\n\n case 'USER':\n delete this.context.userPolicies[key];\n\n if (key === this.context.activeUserPolicy) {\n this.context.activeUserPolicy = undefined;\n this.context.saveActivePolicy();\n }\n\n this.context.savePolicies('USER');\n break;\n\n default:\n throw Error('Unknown policy source: ' + source);\n }\n }\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this.context.messageBus;\n }\n /**\n * Set the messageBus in this Registry\n * @param {MessageBus} messageBus\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this.context.messageBus = messageBus;\n\n _this.addGUIListeners();\n }\n }]);\n\n return PEP;\n}();\n\n/* harmony default export */ var policy_PEP = (PEP_PEP);\n// CONCATENATED MODULE: ./src/bus/Pipeline.js\nfunction Pipeline_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Pipeline_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Pipeline_createClass(Constructor, protoProps, staticProps) { if (protoProps) Pipeline_defineProperties(Constructor.prototype, protoProps); if (staticProps) Pipeline_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\nvar Pipeline_log = loglevel[\"getLogger\"]('Pipeline');\n/**\n* @author micaelpedrosa@gmail.com\n* Sequencial processor of methods. Similar to how Sequential Promise's work, but better fit for message processing.\n* Normal use for this, is to intercept all messages with configured handlers, and act accordingly.\n*/\n\n\n\nvar Pipeline =\n/*#__PURE__*/\nfunction () {\n /* public\n handlers: ((PipeContext) => void)[]\n onFail: (error) => void\n */\n function Pipeline(_onFail) {\n Pipeline_classCallCheck(this, Pipeline);\n\n var _this = this;\n\n _this.handlers = [];\n _this.onFail = _onFail;\n }\n /**\n * Insert a message in the pipeline queue. All messages are wrapped with a PipeContext.\n * @param {Message} msg Message for the queue\n * @param {Callback} onDeliver When message is finished processing from all handlers, it will be delivered in this callback.\n */\n\n\n Pipeline_createClass(Pipeline, [{\n key: \"process\",\n value: function process(msg, onDeliver) {\n var _this = this;\n\n if (_this.handlers.length > 0) {\n var iter = new Iterator(_this.handlers);\n iter.next(new PipeContext(_this, iter, msg, onDeliver));\n } else {\n onDeliver(msg);\n }\n }\n }]);\n\n return Pipeline;\n}();\n/**\n* @author micaelpedrosa@gmail.com\n* Wrapper around a message that adds actions that can be fired by any interceptor handler.\n* The Pipeline is asynchronous, so an handler should always call an action, the default one is \"next()\"\n*/\n\n\nvar PipeContext =\n/*#__PURE__*/\nfunction () {\n /* private\n _inStop: boolean\n _pipeline: Pipeline\n _iter: Iterator\n _msg: Message\n */\n function PipeContext(pipeline, iter, msg, onDeliver) {\n Pipeline_classCallCheck(this, PipeContext);\n\n var _this = this;\n\n _this._inStop = false;\n _this._pipeline = pipeline;\n _this._iter = iter;\n _this._msg = msg;\n _this._onDeliver = onDeliver;\n }\n\n Pipeline_createClass(PipeContext, [{\n key: \"next\",\n\n /**\n * Proceed to the next interceptor handler, unless there was an error. If it's the last one, proceed to onDeliver handler.\n */\n value: function next() {\n var _this = this;\n\n if (!_this._inStop) {\n if (_this._iter.hasNext) {\n _this._iter.next(_this);\n } else {\n _this._onDeliver(_this._msg);\n }\n }\n }\n /**\n * Proceed directly to the onDeliver handler, unless there was an error.\n */\n\n }, {\n key: \"deliver\",\n value: function deliver() {\n var _this = this;\n\n if (!_this._inStop) {\n _this._inStop = true;\n\n _this._onDeliver(_this._msg);\n }\n }\n /**\n * Mark the context with an error and proceed to the onFail handler.\n * @param {[type]} error [description]\n */\n\n }, {\n key: \"fail\",\n value: function fail(error) {\n var _this = this;\n\n if (!_this._inStop) {\n _this._inStop = true;\n\n if (_this._pipeline.onFail) {\n _this._pipeline.onFail(error);\n }\n }\n }\n }, {\n key: \"pipeline\",\n get: function get() {\n return this._pipeline;\n }\n }, {\n key: \"msg\",\n get: function get() {\n return this._msg;\n },\n set: function set(inMsg) {\n this._msg = inMsg;\n }\n }]);\n\n return PipeContext;\n}();\n\nvar Iterator =\n/*#__PURE__*/\nfunction () {\n /* private\n _index: number\n _array: []\n */\n function Iterator(array) {\n Pipeline_classCallCheck(this, Iterator);\n\n this._index = -1;\n this._array = array;\n }\n\n Pipeline_createClass(Iterator, [{\n key: \"hasNext\",\n get: function get() {\n return this._index < this._array.length - 1;\n }\n }, {\n key: \"next\",\n get: function get() {\n this._index++;\n return this._array[this._index];\n }\n }]);\n\n return Iterator;\n}();\n\n/* harmony default export */ var bus_Pipeline = (Pipeline);\n// CONCATENATED MODULE: ./src/bus/MessageBus.js\nfunction MessageBus_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { MessageBus_typeof = function _typeof(obj) { return typeof obj; }; } else { MessageBus_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return MessageBus_typeof(obj); }\n\nfunction MessageBus_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction MessageBus_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction MessageBus_createClass(Constructor, protoProps, staticProps) { if (protoProps) MessageBus_defineProperties(Constructor.prototype, protoProps); if (staticProps) MessageBus_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction MessageBus_possibleConstructorReturn(self, call) { if (call && (MessageBus_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return MessageBus_assertThisInitialized(self); }\n\nfunction MessageBus_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction MessageBus_getPrototypeOf(o) { MessageBus_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return MessageBus_getPrototypeOf(o); }\n\nfunction MessageBus_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) MessageBus_setPrototypeOf(subClass, superClass); }\n\nfunction MessageBus_setPrototypeOf(o, p) { MessageBus_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return MessageBus_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log system\n\nvar MessageBus_log = loglevel[\"getLogger\"]('MessageBus');\n\n\n/**\n* @author micaelpedrosa@gmail.com\n* Message BUS Interface is an extension of the Bus\n* It doesn't support the default '*' listener, instead it uses the registry.resolve(..)\n*/\n\nvar MessageBus_MessageBus =\n/*#__PURE__*/\nfunction (_Bus) {\n MessageBus_inherits(MessageBus, _Bus);\n\n /* private\n _registry: Registry\n _forwards: { : { fl: MsgListener, sandboxToUrls: Map(Sandbox, [to-url]), urlToSandbox: { to-url: Sandbox } } }\n _pipeline: Pipeline\n */\n //TODO: future optimization\n //1. message batch processing with setInterval\n //2. resolve default gateway/protostub with register.resolve\n function MessageBus(registry) {\n var _this2;\n\n MessageBus_classCallCheck(this, MessageBus);\n\n _this2 = MessageBus_possibleConstructorReturn(this, MessageBus_getPrototypeOf(MessageBus).call(this));\n _this2._registry = registry;\n _this2._forwards = {};\n _this2._pipelineIn = new bus_Pipeline(function (error) {\n MessageBus_log.error('PIPELINE-ERROR: ', JSON.stringify(error));\n });\n _this2._pipelineOut = new bus_Pipeline(function (error) {\n MessageBus_log.error('PIPELINE-ERROR: ', JSON.stringify(error));\n });\n return _this2;\n }\n\n MessageBus_createClass(MessageBus, [{\n key: \"postMessage\",\n\n /**\n * Post a message for routing. It will first search for a listener, if there is no one, it sends to a external routing using the _onPostMessage.\n * External routing use the registry.resolve(..) method to decide the destination sandbox.\n * @param {Message} inMsg JSON with mandatory Message structure {id, type, from, to}\n * @param {Callback} responseCallback Optional callback if a response is expected from the request. A response will be always sent, even if it is a \"Timeout\".\n * @return {number} the Message id\n */\n value: function postMessage(inMsg, responseCallback, timeout) {\n MessageBus_log.info('onPOSTMessage: ', inMsg);\n\n var _this = this;\n\n var deliver = function deliver(msg) {\n _this._responseCallback(inMsg, responseCallback, timeout);\n\n if (!_this._onResponse(msg)) {\n var itemList = _this._subscriptions[msg.to];\n\n if (itemList) {\n //do not publish on default address, because of loopback cycle\n _this._publishOn(itemList, msg);\n } else {\n //if there is no listener, send to external interface\n _this._onPostMessage(msg);\n }\n }\n };\n\n _this._genId(inMsg);\n\n if (_this._isToProcess(inMsg)) {\n var isIncoming = _this._isIncomingMessage(inMsg);\n\n if (isIncoming) _this._pipelineIn.process(inMsg, deliver);else _this._pipelineOut.process(inMsg, deliver);\n } else deliver(inMsg);\n\n return inMsg.id;\n }\n }, {\n key: \"_isToProcess\",\n value: function _isToProcess(message) {\n var schemasToIgnore = ['domain', 'domain-idp', 'global', 'hyperty-runtime', 'runtime'];\n var splitFrom = message.from.split('://');\n var fromSchema = splitFrom[0];\n var splitTo = message.to.split('://');\n var toSchema = splitTo[0];\n var from = message.from;\n var to = message.to; // Signalling messages between P2P Stubs don't have to be verified. FFS\n\n if (message.body && message.body.source) {\n from = message.body.source;\n }\n\n if (message.body && message.body.subscriber) {\n from = message.body.subscriber;\n }\n\n if (from.indexOf('/p2phandler/') !== -1 || from.indexOf('/p2prequester/') !== -1 || to.indexOf('/p2phandler/') !== -1 || to.indexOf('/p2prequester/') !== -1) {\n return false;\n }\n\n if (this._registry.isLocal(from) && this._registry.isLocal(message.to)) return false;\n\n if (message.from === fromSchema || message.to === toSchema || message.type === 'read' || message.type === 'response' || message.from.includes('hyperty://') && message.type === 'delete') {\n return false;\n } else {\n return schemasToIgnore.indexOf(fromSchema) === -1 || schemasToIgnore.indexOf(toSchema) === -1;\n }\n }\n }, {\n key: \"_isIncomingMessage\",\n value: function _isIncomingMessage(message) {\n var from;\n\n if (message.type === 'forward') {\n MessageBus_log.info('[MessageBus - isIncomingMessage] - message.type: ', message.type);\n from = message.body.from;\n } else if (message.hasOwnProperty('body') && message.body.hasOwnProperty('source') && message.body.source) {\n MessageBus_log.info('[MessageBus - isIncomingMessage] - message.body.source: ', message.body.source);\n from = message.body.source;\n } else if (message.hasOwnProperty('body') && message.body.hasOwnProperty('subscriber') && message.body.subscriber) {\n //TODO: this subscriber validation should not exist, because is outdated\n //TODO: the syncher and syncher manager not following the correct spec;\n MessageBus_log.info('[MessageBus - isIncomingMessage] - message.body.subscriber: ', message.body.subscriber);\n from = message.body.subscriber;\n } else if (message.hasOwnProperty('body') && message.body.hasOwnProperty('reporter') && message.body.reporter) {\n //TODO: this subscriber validation should not exist, because is outdated\n //TODO: the syncher and syncher manager not following the correct spec;\n MessageBus_log.info('[MessageBus - isIncomingMessage] - message.body.reporter: ', message.body.reporter);\n from = message.body.reporter;\n } else {\n MessageBus_log.info('[MessageBus - isIncomingMessage] - message.from ', message.from);\n from = message.from;\n }\n\n MessageBus_log.info('[MessageBus - isIncomingMessage] - check if isLocal: ', from);\n return !this._registry.isLocal(from);\n }\n /**\n * Adds an external publish address listener. Every message for the address will be forwarded to the external routing by _onPostMessage.\n * This means, even if there is a listener for the address, it will also send the message to the external routing.\n * @param {URL} from Publish address.\n */\n\n }, {\n key: \"addPublish\",\n value: function addPublish(from) {\n var _this3 = this;\n\n var _this = this; //verify if forward exist\n\n\n var refCount = _this._forwards[from];\n\n if (!refCount) {\n var forwardListener = _this.addListener(from, function (msg) {\n MessageBus_log.info('MB-PUBLISH: ( ' + from + ' )');\n\n _this._onPostMessage(msg);\n });\n\n refCount = {\n counter: 0,\n fl: forwardListener,\n remove: function remove() {\n _this3.counter--;\n\n if (_this3.counter === 0) {\n _this3.fl.remove();\n\n delete _this._forwards[from];\n }\n }\n };\n _this._forwards[from] = refCount;\n }\n\n refCount.counter++;\n return refCount;\n }\n /**\n * Adds a forward listener for a message destination. Every message reaching an address will be also sent to the forward address.\n * @param {URL} from Message destination, it's actually the field \"to\" of the message.\n * @param {URL} to Forward address.\n */\n\n }, {\n key: \"addForward\",\n value: function addForward(from, to) {\n var _this = this;\n\n return _this.addListener(from, function (msg) {\n MessageBus_log.info('MB-FORWARD: ( ' + from + ' to ' + to + ' )');\n\n _this.forward(to, msg);\n });\n }\n /**\n * Just forward's a message to the forward address. Listeners should be available for the forward address.\n * @param {URL} url Forward address.\n * @param {Message} msg Message to forward\n */\n\n }, {\n key: \"forward\",\n value: function forward(url, msg) {\n var _this = this;\n\n var itemList = _this._subscriptions[url];\n\n if (itemList) {\n _this._publishOn(itemList, msg);\n }\n } //default route, if there are no listeners available for a message destination.\n\n }, {\n key: \"_onPostMessage\",\n value: function _onPostMessage(msg) {\n var _this = this; //resolve external protostub...\n\n\n _this._registry.resolve(msg).then(function (route, msg2route) {\n if (msg2route) _this.forward(route, msg2route);else _this.forward(route, msg);\n }).catch(function (e) {\n MessageBus_log.error('RESOLVE-ERROR: ', e);\n });\n }\n }, {\n key: \"pipelineIn\",\n get: function get() {\n return this._pipelineIn;\n }\n }, {\n key: \"pipelineOut\",\n get: function get() {\n return this._pipelineOut;\n }\n }]);\n\n return MessageBus;\n}(bus_Bus);\n\n/* harmony default export */ var bus_MessageBus = (MessageBus_MessageBus);\n// CONCATENATED MODULE: ./src/cryptoManager/utf8.js\n// Marshals a string to Uint8Array.\nfunction encodeUTF8(s) {\n var i = 0;\n var bytes = new Uint8Array(s.length * 4);\n\n for (var ci = 0; ci != s.length; ci++) {\n try {\n var xxx = s.charCodeAt(ci);\n } catch (err) {\n console.log(err.message);\n return;\n }\n\n var c = s.charCodeAt(ci);\n\n if (c < 128) {\n bytes[i++] = c;\n continue;\n }\n\n if (c < 2048) {\n bytes[i++] = c >> 6 | 192;\n } else {\n if (c > 0xd7ff && c < 0xdc00) {\n if (++ci == s.length) throw 'UTF-8 encode: incomplete surrogate pair';\n var c2 = s.charCodeAt(ci);\n if (c2 < 0xdc00 || c2 > 0xdfff) throw 'UTF-8 encode: second char code 0x' + c2.toString(16) + ' at index ' + ci + ' in surrogate pair out of range';\n c = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff);\n bytes[i++] = c >> 18 | 240;\n bytes[i++] = c >> 12 & 63 | 128;\n } else {\n // c <= 0xffff\n bytes[i++] = c >> 12 | 224;\n }\n\n bytes[i++] = c >> 6 & 63 | 128;\n }\n\n bytes[i++] = c & 63 | 128;\n }\n\n return bytes.subarray(0, i);\n} // Unmarshals an Uint8Array to string.\n\nfunction decodeUTF8(bytes) {\n var s = '';\n var i = 0;\n\n while (i < bytes.length) {\n var c = bytes[i++];\n\n if (c > 127) {\n if (c > 191 && c < 224) {\n if (i >= bytes.length) throw 'UTF-8 decode: incomplete 2-byte sequence';\n c = (c & 31) << 6 | bytes[i] & 63;\n } else if (c > 223 && c < 240) {\n if (i + 1 >= bytes.length) throw 'UTF-8 decode: incomplete 3-byte sequence';\n c = (c & 15) << 12 | (bytes[i] & 63) << 6 | bytes[++i] & 63;\n } else if (c > 239 && c < 248) {\n if (i + 2 >= bytes.length) throw 'UTF-8 decode: incomplete 4-byte sequence';\n c = (c & 7) << 18 | (bytes[i] & 63) << 12 | (bytes[++i] & 63) << 6 | bytes[++i] & 63;\n } else throw 'UTF-8 decode: unknown multibyte start 0x' + c.toString(16) + ' at index ' + (i - 1);\n\n ++i;\n }\n\n if (c <= 0xffff) s += String.fromCharCode(c);else if (c <= 0x10ffff) {\n c -= 0x10000;\n s += String.fromCharCode(c >> 10 | 0xd800);\n s += String.fromCharCode(c & 0x3FF | 0xdc00);\n } else throw 'UTF-8 decode: code point 0x' + c.toString(16) + ' exceeds UTF-16 reach';\n }\n\n return s;\n}\n// CONCATENATED MODULE: ./src/cryptoManager/Crypto.js\nfunction Crypto_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Crypto_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Crypto_createClass(Constructor, protoProps, staticProps) { if (protoProps) Crypto_defineProperties(Constructor.prototype, protoProps); if (staticProps) Crypto_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar Crypto_log = loglevel[\"getLogger\"]('CryptoManager');\n/**\n* Class with the cryptographic functions for the authentication protocol\n*\n*/\n\nvar Crypto_Crypto =\n/*#__PURE__*/\nfunction () {\n /**\n * Runtimefactory is passed in the costructor, because the nodeJS has a different crypto module\n * from the browser. RuntimeFactory provides a wrapper for the fuctions of nodeJS, so they can be\n * invoked browser like.\n */\n function Crypto(runtimeFactory) {\n Crypto_classCallCheck(this, Crypto);\n\n var _this = this;\n\n typeof runtimeFactory.createWebcrypto === 'function' ? _this._crypto = runtimeFactory.createWebcrypto() : _this._crypto = crypto;\n }\n /**\n * Performs a RSA encryption\n * @param {ArrayBuffer} value the public key\n * @param {BufferSource} value data to be encryped\n * @return {Uint8Array} encrypted data\n */\n\n\n Crypto_createClass(Crypto, [{\n key: \"encryptRSA\",\n value: function encryptRSA(pubKey, data) {\n Crypto_log.log('encryptRSA:pubKey', pubKey);\n Crypto_log.log('encryptRSA:data', data);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importRSAencryptKey(new Uint8Array(pubKey)).then(function (publicKey) {\n _this._crypto.subtle.encrypt({\n name: 'RSA-OAEP'\n }, publicKey, //from generateKey or importKey above\n data //ArrayBuffer of data you want to encrypt\n ).then(function (encrypted) {\n //returns an ArrayBuffer containing the encrypted data\n // log.log('crypto-encryptRSA', new Uint8Array(encrypted));\n resolve(new Uint8Array(encrypted));\n }).catch(function (err) {\n // log.log('crypto-encryptRSA', err);\n reject(err);\n });\n });\n });\n }\n /**\n * Performs a RSA decryption\n * @param {ArrayBuffer} value the private key\n * @param {BufferSource} value data to be decrypted\n * @return {Uint8Array} decrypted data\n */\n\n }, {\n key: \"decryptRSA\",\n value: function decryptRSA(privKey, data) {\n Crypto_log.log('decryptRSA:privKey', privKey);\n Crypto_log.log('decryptRSA:data', data);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importRSAdecryptKey(privKey).then(function (privateKey) {\n _this._crypto.subtle.decrypt({\n name: 'RSA-OAEP'\n }, privateKey, //from generateKey or importKey above\n data //ArrayBuffer of the data\n ).then(function (decrypted) {\n var decryptedData = new Uint8Array(decrypted); // log.log('crypto-decryptRSA', decryptedData);\n\n resolve(decryptedData);\n }).catch(function (err) {\n // log.log('crypto-decryptRSA', err);\n reject(err);\n });\n });\n });\n }\n /**\n * Performs a RSA sign\n * @param {ArrayBuffer} value the private key\n * @param {BufferSource} value data to be signed\n * @return {Uint8Array} data signature\n */\n\n }, {\n key: \"signRSA\",\n value: function signRSA(privKey, data) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importRSAsignKey(privKey).then(function (privateKey) {\n _this._crypto.subtle.sign({\n name: 'RSASSA-PKCS1-v1_5'\n }, privateKey, //from generateKey or importKey above\n encodeUTF8(data) //ArrayBuffer of data you want to sign\n ).then(function (signature) {\n //returns an ArrayBuffer containing the signature\n // log.log('crypto-signRSA', new Uint8Array(signature));\n resolve(new Uint8Array(signature));\n }).catch(function (err) {\n // log.log('crypto-signRSA', err);\n reject(err);\n });\n });\n });\n }\n /**\n * Performs a RSA signature verification\n * @param {ArrayBuffer} value the public key\n * @param {BufferSource} value data to be verified\n * @return {Boolean} result of the signature verification\n */\n\n }, {\n key: \"verifyRSA\",\n value: function verifyRSA(pubKey, data, signature) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importRSAverifyKey(pubKey).then(function (publicKey) {\n _this._crypto.subtle.verify({\n name: 'RSASSA-PKCS1-v1_5'\n }, publicKey, //from generateKey or importKey above\n signature, //ArrayBuffer of the signature\n encodeUTF8(data) //ArrayBuffer of the data\n ).then(function (isvalid) {\n //returns a boolean on whether the signature is true or not\n // log.log('crypto-verifyRSA', isvalid);\n resolve(isvalid);\n }).catch(function (err) {\n // log.log('crypto-verifyRSA', err);\n reject(err);\n });\n });\n });\n }\n /**\n * Performs a RSA signature verification\n * @param {ArrayBuffer} value the public key\n * @param {BufferSource} value data to be verified\n * @return {Boolean} result of the signature verification\n */\n\n }, {\n key: \"encryptAES\",\n value: function encryptAES(key, data, iv) {\n Crypto_log.log('encryptAES:key', key);\n Crypto_log.log('encryptAES:data', data);\n Crypto_log.log('encryptAES:iv', iv);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importAESkey(key).then(function (aesKey) {\n _this._crypto.subtle.encrypt({\n name: 'AES-CBC',\n //Don't re-use initialization vectors!\n //Always generate a new iv every time your encrypt!\n iv: iv\n }, aesKey, //from generateKey or importKey above\n encodeUTF8(data) //ArrayBuffer of data you want to encrypt\n ).then(function (encrypted) {\n //returns an ArrayBuffer containing the encrypted data\n // log.log('crypto-encryptAES', new Uint8Array(encrypted));\n resolve(new Uint8Array(encrypted));\n }).catch(function (err) {\n // log.log('crypto-encryptAES', err);\n reject(err);\n });\n });\n });\n }\n }, {\n key: \"decryptAES\",\n value: function decryptAES(key, data, iv) {\n Crypto_log.log('decryptAES:key', key);\n Crypto_log.log('decryptAES:data', data);\n Crypto_log.log('decryptAES:iv', iv);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importAESkey(key).then(function (aesKey) {\n _this._crypto.subtle.decrypt({\n name: 'AES-CBC',\n iv: iv\n }, aesKey, //from generateKey or importKey above\n data //ArrayBuffer of the data\n ).then(function (decrypted) {\n var decodedData = decodeUTF8(new Uint8Array(decrypted));\n Crypto_log.log('crypto-decryptAES', decodedData);\n resolve(decodedData);\n }).catch(function (err) {\n // log.log('crypto-decryptAES', err);\n reject(err);\n });\n });\n });\n }\n /**\n * creates a hash using the HMAC algorithm\n * @param {byteArray} key key to be used in the hmac\n * @param {string} data information to be hashed\n * @return {byteArray} signature resulting hash\n */\n\n }, {\n key: \"hashHMAC\",\n value: function hashHMAC(key, data) {\n Crypto_log.log('hashHMAC:key', key);\n Crypto_log.log('hashHMAC:data', data);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (typeof data != 'string') {\n data = JSON.stringify(data);\n Crypto_log.log('Converting hashHMAC inpured DATA');\n Crypto_log.log('HHashHMAC:', data);\n }\n\n _this._importHMACkey(key).then(function (hmacKey) {\n _this._crypto.subtle.sign({\n name: 'HMAC'\n }, hmacKey, //from generateKey or importKey above\n encodeUTF8(data) //ArrayBuffer of data you want to sign\n ).then(function (signature) {\n Crypto_log.log('HashHMAC signature:', new Uint8Array(signature)); // log.log('crypto-hashHMAC', signature);\n //returns an ArrayBuffer containing the signature\n\n resolve(new Uint8Array(signature));\n }).catch(function (err) {\n // log.log('crypto-hashHMAC', err);\n reject(err);\n });\n });\n });\n }\n /**\n * verifies an hash using the HMAC algorithm\n * @param {byteArray} key key to be used in the hmac\n * @param {string} data information to be hashed to compare\n * @param {byteArray} signature hash to compare with the received data\n * @return {boolean} isvalid boolean saying if the data corresponds to the hash received\n */\n\n }, {\n key: \"verifyHMAC\",\n value: function verifyHMAC(key, data, signature) {\n Crypto_log.log('verifyHMAC:key', key);\n Crypto_log.log('verifyHMAC:data', data);\n Crypto_log.log('verifyHMAC:signature', signature);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._importHMACkey(key).then(function (hmacKey) {\n if (typeof data != 'string') {\n data = JSON.stringify(data);\n Crypto_log.log('Converting verifyHMAC inputed DATA:', data);\n }\n\n _this._crypto.subtle.verify({\n name: 'HMAC'\n }, hmacKey, //from generateKey or importKey above\n signature, //ArrayBuffer of the signature\n encodeUTF8(data) //ArrayBuffer of the data\n ).then(function (isvalid) {\n //returns a boolean on whether the signature is true or not\n // log.log('crypto-verifyHMAC', isvalid);\n Crypto_log.log('verifyHMAC result', isvalid);\n isvalid ? resolve(isvalid) : reject(isvalid);\n }).catch(function (err) {\n Crypto_log.error('crypto-verifyHMAC', err);\n reject(err);\n });\n });\n });\n }\n /**\n * generates a RSA public/private key pair with a modulus length of 2048 bits\n * @return {JSON} keyPair json containing the public and private keys\n */\n\n }, {\n key: \"generateRSAKeyPair\",\n value: function generateRSAKeyPair() {\n var _this = this;\n\n var keyPair = {};\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.generateKey({\n name: 'RSA-PSS',\n modulusLength: 2048,\n //can be 1024, 2048, or 4096\n publicExponent: new Uint8Array([0x01, 0x00, 0x01]),\n hash: {\n name: 'SHA-256' //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n\n }\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['sign', 'verify'] //can be any combination of 'sign' and 'verify'\n ).then(function (key) {\n //returns a keypair object\n // log.log(key);\n _this._crypto.subtle.exportKey('spki', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n key.publicKey //can be a publicKey or privateKey, as long as extractable was true\n ).then(function (publicKey) {\n //returns the exported key data\n keyPair.public = new Uint8Array(publicKey);\n return _this._crypto.subtle.exportKey('pkcs8', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n key.privateKey //can be a publicKey or privateKey, as long as extractable was true\n );\n }).then(function (privateKey) {\n keyPair.private = new Uint8Array(privateKey); // log.log('crypto-generateRSAKeyPair', keyPair);\n\n resolve(keyPair);\n }).catch(function (err) {\n Crypto_log.error(err);\n reject(err);\n });\n }).catch(function (err) {\n Crypto_log.error(err);\n reject(err);\n });\n });\n }\n /**\n * Generates a 128 bit random value.\n * @return {byteArray} array random value\n */\n\n }, {\n key: \"generateIV\",\n value: function generateIV() {\n var _this = this;\n\n var array = new Uint8Array(16);\n\n _this._crypto.getRandomValues(array);\n\n return array;\n }\n /**\n * Generates a 256 bit random value. 32 bits are extrated from the machine time,\n * the remaining are generated randomly\n * @return {byteArray} array random value\n */\n\n }, {\n key: \"generateRandom\",\n value: function generateRandom() {\n var _this = this;\n\n var array = new Uint8Array(32);\n\n _this._crypto.getRandomValues(array);\n\n var date = Date.now();\n var dateEncoded = encodeUTF8(date.toString()); //extract the least significant 4 bytes in the date\n\n var finalDate = dateEncoded.slice(dateEncoded.length - 4, dateEncoded.length); // add in the first 4 bytes of the array the bytes extracted previously;\n\n for (var i = 0; i < 4; i++) {\n array[i] = finalDate[i];\n }\n\n return array;\n }\n /**\n * generates a premaster secret (PMS) of 48 bytes (384 bits) randomly\n * @return {byteArray} array premaster secret key\n */\n\n }, {\n key: \"generatePMS\",\n value: function generatePMS() {\n var _this = this;\n\n var array = new Uint8Array(48);\n\n _this._crypto.getRandomValues(array);\n\n return array;\n }\n /**\n * generates a masterKey secret (PMS) of 48 bytes (384 bits) using the premaster secret and\n * two randoms\n * @return {byteArray} array master secret key with 48 bytes\n */\n\n }, {\n key: \"generateMasterSecret\",\n value: function generateMasterSecret(hmacKey, data) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var key = new Uint8Array(48);\n var seed = data;\n\n _this._digest(hmacKey).then(function (digestedKey) {\n _this.hashHMAC(digestedKey, seed).then(function (keypart0) {\n //copy the first 32 bytes into the key\n for (var i = 0; i < 32; i++) {\n key[i] = keypart0[i];\n }\n\n return _this.hashHMAC(digestedKey, seed + keypart0);\n }).then(function (keypart1) {\n //copy the first 16 bytes to the key remaining 16 bytes\n for (var i = 0; i < 16; i++) {\n key[i + 32] = keypart1[i];\n } // log.log('crypto-generateMasterSecret', key);\n\n\n resolve(key);\n }).catch(function (err) {\n // log.log('crypto-generateMasterSecret', err);\n reject(err);\n });\n });\n });\n }\n /**\n * generates both users MAC and encryption keys. generate as output an array\n * with 4 byteArray each with 32 bytes\n * @param {byteArray} secret secret to be used in the HMAC function\n * @param {String} data information to be used as seed\n * @return {Array} key array with the information to generate keys\n */\n\n }, {\n key: \"generateKeys\",\n value: function generateKeys(hmacKey, data) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var key = [];\n var seed = data; // iterate 4 times to obtain a 1024 key size\n\n _this.hashHMAC(hmacKey, seed).then(function (keypart0) {\n key.push(keypart0);\n return _this.hashHMAC(hmacKey, seed + keypart0);\n }).then(function (keypart1) {\n key.push(keypart1);\n return _this.hashHMAC(hmacKey, seed + keypart1);\n }).then(function (keypart2) {\n key.push(keypart2);\n return _this.hashHMAC(hmacKey, seed + keypart2);\n }).then(function (keypart3) {\n key.push(keypart3); // log.log('crypto-generateKeys', key);\n\n resolve(key);\n }).catch(function (err) {\n // log.log('crypto-generateKeys', err);\n reject(err);\n }); // log.log(hmacKey, data);\n\n });\n }\n }, {\n key: \"_importRSAsignKey\",\n value: function _importRSAsignKey(privKey) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.importKey('pkcs8', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n privKey, {\n //these are the algorithm options\n name: 'RSASSA-PKCS1-v1_5',\n hash: {\n name: 'SHA-256' //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n\n }\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['sign'] //'verify' for public key import, 'sign' for private key imports\n ).then(function (privateKey) {\n //returns a publicKey (or privateKey if you are importing a private key)\n // log.log('crypto-_importRSAsignKey', privateKey);\n resolve(privateKey);\n }).catch(function (err) {\n Crypto_log.error('crypto-_importRSAsignKey', err);\n reject(err);\n });\n });\n }\n }, {\n key: \"_importRSAverifyKey\",\n value: function _importRSAverifyKey(pubKey) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.importKey('spki', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n pubKey, {\n //these are the algorithm options\n name: 'RSASSA-PKCS1-v1_5',\n hash: {\n name: 'SHA-256' //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n\n }\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['verify'] //'verify' for public key import, 'sign' for private key imports\n ).then(function (publicKey) {\n //returns a publicKey (or privateKey if you are importing a private key)\n // log.log('crypto-_importRSAverifyKey', publicKey);\n resolve(publicKey);\n }).catch(function (err) {\n Crypto_log.error('crypto-_importRSAverifyKey', err);\n reject(err);\n });\n });\n }\n }, {\n key: \"_importRSAencryptKey\",\n value: function _importRSAencryptKey(pubKey) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.importKey('spki', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n pubKey, {\n //these are the algorithm options\n name: 'RSA-OAEP',\n hash: {\n name: 'SHA-256' //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n\n }\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['encrypt'] //'encrypt' or 'wrapKey' for public key import or\n //'decrypt' or 'unwrapKey' for private key imports\n ).then(function (publicKey) {\n //returns a publicKey (or privateKey if you are importing a private key)\n // log.log('crypto-_importRSAencryptKey', publicKey);\n resolve(publicKey);\n }).catch(function (err) {\n Crypto_log.error('crypto-_importRSAencryptKey', err.name);\n reject(err);\n });\n });\n }\n }, {\n key: \"_importRSAdecryptKey\",\n value: function _importRSAdecryptKey(privKey) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.importKey('pkcs8', //can be 'jwk' (public or private), 'spki' (public only), or 'pkcs8' (private only)\n privKey, {\n //these are the algorithm options\n name: 'RSA-OAEP',\n hash: {\n name: 'SHA-256' //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n\n }\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['decrypt'] //'encrypt' or 'wrapKey' for public key import or\n //'decrypt' or 'unwrapKey' for private key imports\n ).then(function (privateKey) {\n //returns a publicKey (or privateKey if you are importing a private key)\n // log.log('crypto-_importRSAdecryptKey', privateKey);\n resolve(privateKey);\n }).catch(function (err) {\n Crypto_log.error('crypto-_importRSAdecryptKey', err);\n reject(err);\n });\n });\n }\n }, {\n key: \"concatPMSwithRandoms\",\n value: function concatPMSwithRandoms(pms, toRandom, fromRandom) {\n var finalKey = new Uint8Array(pms.length + toRandom.length + fromRandom.length); // add PremasterKey\n\n for (var i = 0; i < pms.length; i++) {\n finalKey[i] = pms[i];\n } //add to random\n\n\n for (var _i = 0; _i < toRandom.length; _i++) {\n finalKey[_i + pms.length] = pms[_i];\n } //add from random\n\n\n for (var _i2 = 0; _i2 < fromRandom.length; _i2++) {\n finalKey[_i2 + pms.length + toRandom.length] = pms[_i2];\n }\n\n return finalKey;\n }\n }, {\n key: \"_generate256bitKey\",\n value: function _generate256bitKey() {\n var _this = this;\n\n var array = new Uint8Array(32);\n\n _this._crypto.getRandomValues(array);\n\n return array;\n }\n /**\n * imports the secret to the HMAC function\n * @param {byteArray} arrayBuffer bytes to import as key\n * @return {JSON} key key ready to be used in the HMAC cryptographic function\n */\n\n }, {\n key: \"_importHMACkey\",\n value: function _importHMACkey(arrayBuffer) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._digest(arrayBuffer).then(function (key) {\n _this._crypto.subtle.importKey('raw', //can be 'jwk' or 'raw'\n key, {\n //this is the algorithm options\n name: 'HMAC',\n hash: {\n name: 'SHA-256'\n },\n //can be 'SHA-1', 'SHA-256', 'SHA-384', or 'SHA-512'\n length: 256 //optional, if you want your key length to differ from the hash function's block length\n\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['sign', 'verify'] //can be any combination of 'sign' and 'verify'\n ).then(function (key) {\n //returns the symmetric key\n // log.log('crypto-_importHMACkey', key);\n resolve(key);\n }).catch(function (err) {\n reject(err);\n });\n });\n });\n }\n }, {\n key: \"_digest\",\n value: function _digest(value) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.digest({\n name: 'SHA-256'\n }, value //The data you want to hash as an ArrayBuffer\n ).then(function (hash) {\n //returns the hash as an ArrayBuffer\n // log.log('crypto-digest', new Uint8Array(hash));\n resolve(new Uint8Array(hash));\n }).catch(function (err) {\n Crypto_log.error(err);\n reject(err);\n });\n });\n }\n }, {\n key: \"_importAESkey\",\n value: function _importAESkey(arrayBuffer) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._crypto.subtle.importKey('raw', //can be 'jwk' or 'raw'\n arrayBuffer, {\n //this is the algorithm options\n name: 'AES-CBC'\n }, true, //whether the key is extractable (i.e. can be used in exportKey)\n ['encrypt', 'decrypt'] //can be 'encrypt', 'decrypt', 'wrapKey', or 'unwrapKey'\n ).then(function (key) {\n //returns the symmetric key\n // log.log('crypto-importAESkey', key);\n resolve(key);\n }).catch(function (err) {\n Crypto_log.error('crypto-importAESkey', err);\n reject(err);\n });\n });\n }\n }, {\n key: \"_sha256\",\n value: function _sha256(str) {\n var _this = this;\n\n var buffer = new TextEncoder('utf-8').encode(str);\n return _this._crypto.subtle.digest('SHA-256', buffer).then(function (hash) {\n return _this._hex(hash);\n });\n }\n }, {\n key: \"_hex\",\n value: function _hex(buffer) {\n var hexCodes = [];\n var view = new DataView(buffer);\n\n for (var i = 0; i < view.byteLength; i += 4) {\n // Using getUint32 reduces the number of iterations needed (we process 4 bytes each time)\n var value = view.getUint32(i);\n var stringValue = value.toString(16);\n var padding = '00000000';\n var paddedValue = (padding + stringValue).slice(-padding.length);\n hexCodes.push(paddedValue);\n } // Join all the hex strings into one\n\n\n return hexCodes.join('');\n }\n }]);\n\n return Crypto;\n}();\n\n/* harmony default export */ var cryptoManager_Crypto = (Crypto_Crypto);\n// CONCATENATED MODULE: ./src/cryptoManager/CryptoManager.js\nfunction CryptoManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction CryptoManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CryptoManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) CryptoManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) CryptoManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar CryptoManager_log = loglevel[\"getLogger\"]('CryptoManager');\n\n\n/**\n* The Crypto Manager provides manages cryptographic features for the runtime including:\n* - Mutual Authentication between peers\n* - Crypto Keys\n* - e2e encryption and decription of communication between Hyperties and dta objects\n*\n*/\n\nvar CryptoManager_CryptoManager =\n/*#__PURE__*/\nfunction () {\n /**\n * This is the constructor to initialise the CryptoManager, it does not require any input.\n * The init() must called in order to set mandatories attributes\n */\n function CryptoManager(storageManager) {\n CryptoManager_classCallCheck(this, CryptoManager);\n\n this.storageManager = storageManager;\n this.userDefaultKeyRef = 'userAsymmetricKey';\n }\n\n CryptoManager_createClass(CryptoManager, [{\n key: \"init\",\n value: function init(runtimeURL, runtimeCapabilities, storageManager, dataObjectsStorage, registry, coreDiscovery, idm, runtimeFactory) {\n var _this = this;\n\n if (!runtimeURL) throw new Error('[] runtimeURL is missing.');\n if (!storageManager) throw new Error('storageManager is missing');\n if (!runtimeFactory) throw new Error('runtimeFactory is missing');\n _this._runtimeURL = runtimeURL;\n _this._cryptoManagerURL = _this._runtimeURL + '/cryptoManager'; //_this._myURL = _this._runtimeURL + '/crypto';\n\n _this.storageManager = storageManager;\n _this.dataObjectsStorage = dataObjectsStorage;\n _this.runtimeCapabilities = runtimeCapabilities;\n _this._runtimeFactory = runtimeFactory;\n _this._domain = divideURL(_this._runtimeURL).domain;\n _this.crypto = new cryptoManager_Crypto(_this._runtimeFactory); // hashTable to store all the crypto information between two hyperties\n\n _this.chatKeys = {}; // hashTable to store the symmetric keys to be used in the chat group\n\n _this.dataObjectSessionKeys = {}; //failsafe to enable/disable all the criptographic functions\n\n _this.isToUseEncryption = true;\n _this._registry = registry;\n _this._coreDiscovery = coreDiscovery;\n _this._idm = idm;\n } //******************* GET AND SET METHODS *******************\n\n /**\n * return the messageBus in this Registry\n * @param {MessageBus} messageBus\n */\n\n }, {\n key: \"loadSessionKeys\",\n // to be used to initialise IDM with SessionKeys used in previous session\n value: function loadSessionKeys() {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this.storageManager.get('dataObjectSessionKeys').then(function (sessionKeys) {\n if (sessionKeys) _this.dataObjectSessionKeys = sessionKeys;else _this.dataObjectSessionKeys = {};\n resolve();\n });\n });\n }\n }, {\n key: \"_isFromRemoteSM\",\n value: function _isFromRemoteSM(from) {\n var splitFrom = from.split('://');\n return splitFrom[0] === 'runtime' && from !== this._runtimeURL + '/sm';\n }\n }, {\n key: \"addCryptoGUIListeners\",\n value: function addCryptoGUIListeners() {\n //TODO: Change the GUI invocation of this method\n var _this = this;\n\n _this._messageBus.addListener(_this._cryptoManagerURL, function (msg) {\n var funcName = msg.body.method; //let returnedValue;\n\n if (funcName === 'generateRSAKeyPair') {\n _this._crypto.getMyPublicKey().then(function (key) {\n var value = {\n type: 'execute',\n value: key,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n try {\n _this._messageBus.postMessage(replyMsg);\n } catch (err) {\n CryptoManager_log.error('On addGUIListeners from if generateRSAKeyPair method postMessage error: ' + err);\n }\n });\n\n return;\n }\n });\n } //******************* ENCRYPTION METHODS *******************\n\n /**\n * Identifies the messages to be encrypted\n * @param {Message} message\n * @returns {boolean} returns true if the message requires encryption\n */\n\n }, {\n key: \"_isToEncrypt\",\n value: function _isToEncrypt(message) {\n var _this = this;\n\n CryptoManager_log.log('[CryptoManager._isToEncrypt]', message);\n var isCreate = message.type === 'create';\n var isFromHyperty = message.from.includes('hyperty://');\n var isToHyperty = message.to.includes('hyperty://');\n var isToDataObject = isDataObjectURL(message.to);\n\n var reporter = _this.registry.getDataObjectReporter(message.to);\n\n var doMutualAuthentication = message.hasOwnProperty('body') && message.body.hasOwnProperty('mutual') ? message.body.mutual : message.hasOwnProperty('body') && message.body.hasOwnProperty('value') && message.body.value.hasOwnProperty('mutual') ? message.body.value.mutual : true;\n if (!doMutualAuthentication) return false;\n\n if (reporter !== null && utils_isLegacy(reporter)) {\n return false;\n } //if is not to apply encryption, then returns resolve\n\n\n if (!this.isToUseEncryption && !(message.type === 'handshake')) {\n CryptoManager_log.info('not handshake: encryption disabled');\n return false;\n }\n\n if (message.type === 'update') {\n CryptoManager_log.info('update:encryption disabled');\n return false;\n }\n\n if (message.type === 'forward') {\n CryptoManager_log.info('forward:encryption disabled');\n return false;\n }\n\n if (utils_isLegacy(message.to)) return false;\n return isCreate && isFromHyperty && isToHyperty || isCreate && isFromHyperty && isToDataObject && doMutualAuthentication || message.type === 'handshake' || message.type === 'update' && doMutualAuthentication;\n }\n }, {\n key: \"_isToDecrypt\",\n value: function _isToDecrypt(message) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n // For sybscribe message let's start the mutualAuthentication\n var isSubscription = message.type === 'subscribe';\n\n var isFromRemoteSM = _this._isFromRemoteSM(message.from);\n\n var mutual = message.body.hasOwnProperty('value') && message.body.value.hasOwnProperty('mutual') ? message.body.value.mutual : message.body.hasOwnProperty('mutual') ? message.body.mutual : true; // let mutual = message.body.hasOwnProperty('mutual') ? message.body.mutual : false;\n\n if (isSubscription && isFromRemoteSM && mutual) {\n // if (isSubscription && isFromRemoteSM ) {\n CryptoManager_log.log('[CryptoManager._isToDecrypt] _doMutualAuthenticationPhase1');\n console.log('[CryptoManager._isToDecrypt] ', message);\n\n var reporter = _this.registry.getDataObjectReporter(message.to);\n\n if (reporter !== null && utils_isLegacy(reporter)) {\n return resolve(false);\n }\n\n _this._doMutualAuthenticationPhase1(message).then(function () {\n resolve(false);\n }, function (error) {\n reject(error);\n }); // } else if (message.hasOwnProperty('body') && message.body.hasOwnProperty('value') && typeof message.body.value === 'string') {\n\n } else if (message.hasOwnProperty('body') && message.body.hasOwnProperty('value') && typeof message.body.value === 'string' && mutual) {\n CryptoManager_log.log('[CryptoManager._isToDecrypt] true');\n resolve(true);\n } else {\n CryptoManager_log.log('[CryptoManager._isToDecrypt] false');\n resolve(false);\n }\n }).catch(function (error) {\n CryptoManager_log.error('[CryptoManager._isToDecrypt]', error);\n });\n }\n }, {\n key: \"encryptMessage\",\n value: function encryptMessage(message) {\n //log.info('encryptMessage:message', message);\n var _this = this;\n\n CryptoManager_log.log('encrypt message ');\n return new Promise(function (resolve, reject) {\n var isHandShakeType = message.type === 'handshake'; //if is not to apply encryption, then returns resolve\n\n if (!_this._isToEncrypt(message)) {\n // log.log('decryption disabled');\n return resolve(message);\n }\n\n var dataObjectURL = parseMessageURL(message.to);\n var isToDataObject = isDataObjectURL(dataObjectURL);\n var isToLegacyIdentity = utils_isLegacy(message.to);\n var isFromHyperty = divideURL(message.from).type === 'hyperty';\n var isToHyperty = divideURL(message.to).type === 'hyperty';\n\n if (message.type === 'update') {\n CryptoManager_log.log('encrypt message: message type update');\n return resolve(message);\n }\n\n if (isToLegacyIdentity) {\n resolve(message);\n } else if (isFromHyperty && isToHyperty) {\n var userURL = _this._registry.getHypertyOwner(message.from);\n\n if (userURL) {\n // check if exists any keys between two users\n var chatKeys = _this.chatKeys[message.from + '<->' + message.to];\n\n if (!chatKeys) {\n chatKeys = _this._newChatCrypto(message, userURL); //log.log('createChatKey encrypt', message.from + message.to);\n\n _this.chatKeys[message.from + '<->' + message.to] = chatKeys;\n message.body.handshakePhase = 'startHandShake';\n }\n\n if (chatKeys.authenticated && !isHandShakeType) {\n var iv = _this.crypto.generateIV();\n\n _this.crypto.encryptAES(chatKeys.keys.hypertyFromSessionKey, stringify(message.body.value), iv).then(function (encryptedValue) {\n var filteredMessage = _this._filterMessageToHash(message, stringify(message.body.value) + stringify(iv), chatKeys.hypertyFrom.messageInfo);\n\n _this.crypto.hashHMAC(chatKeys.keys.hypertyFromHashKey, filteredMessage).then(function (hash) {\n //log.log('result of hash ', hash);\n var value = {\n iv: encode(iv),\n value: encode(encryptedValue),\n hash: encode(hash)\n };\n message.body.value = encode(value);\n resolve(message);\n });\n }); // if is a handshake message, just resolve it\n\n } else if (isHandShakeType) {\n resolve(message); // else, starts a new handshake protocol\n } else {\n _this._doHandShakePhase(message, chatKeys).then(function (value) {\n _this.chatKeys[message.from + '<->' + message.to] = value.chatKeys;\n\n _this._messageBus.postMessage(value.message);\n\n reject('encrypt handshake protocol phase ');\n });\n }\n } else {\n reject('In encryptMessage: Hyperty owner URL was not found');\n } //if from hyperty to a dataObjectURL\n\n } else if (isFromHyperty && isToDataObject) {\n //log.log('dataObject value to encrypt: ', message.body.value);\n //log.log('IdentityModule - encrypt from hyperty to dataobject ', message);\n _this.storageManager.get('dataObjectSessionKeys').then(function (sessionKeys) {\n sessionKeys = chatkeysToArrayCloner(sessionKeys || {});\n var dataObjectKey = sessionKeys ? sessionKeys[dataObjectURL] : null;\n\n _this.dataObjectsStorage.getDataObject(dataObjectURL).then(function (isHypertyReporter) {\n //if no key exists, create a new one if is the reporter of dataObject\n if (!dataObjectKey) {\n // if the hyperty is the reporter of the dataObject then generates a session key\n if (isHypertyReporter.reporter && isHypertyReporter.reporter === message.from) {\n var sessionKey = _this.crypto.generateRandom();\n\n _this.dataObjectSessionKeys[dataObjectURL] = {\n sessionKey: sessionKey,\n isToEncrypt: true\n };\n var dataObjectSessionKeysClone = chatkeysToStringCloner(_this.dataObjectSessionKeys); //TODO: check if this does not need to be stored\n\n _this.storageManager.set('dataObjectSessionKeys', 0, dataObjectSessionKeysClone).catch(function (err) {\n reject('On encryptMessage from method storageManager.set error: ' + err);\n });\n\n dataObjectKey = _this.dataObjectSessionKeys[dataObjectURL];\n }\n } //check if there is already a session key for the chat room\n\n\n if (dataObjectKey) {\n // and if is to apply encryption, encrypt the messages\n if (dataObjectKey.isToEncrypt) {\n var _iv = _this.crypto.generateIV();\n\n var stringifiedIV = stringify(_iv);\n var stringifiedMessageBody = stringify(message.body.value);\n\n _this.crypto.encryptAES(dataObjectKey.sessionKey, stringifiedMessageBody, _iv).then(function (encryptedValue) {\n delete message.body.identity.assertion; //TODO: Check why assertion is comming on the message!\n\n delete message.body.identity.expires; //TODO: Check why expires is comming on the message!\n\n var filteredMessage = _this._filterMessageToHash(message, stringifiedMessageBody + stringifiedIV);\n\n _this.crypto.hashHMAC(dataObjectKey.sessionKey, filteredMessage).then(function (hash) {\n // log.log('hash ', hash);\n var newValue = {\n value: encode(encryptedValue),\n iv: encode(_iv),\n hash: encode(hash)\n };\n message.body.value = stringify(newValue);\n resolve(message);\n });\n }); // if not, just send the message\n\n } else {\n resolve(message);\n } // start the generation of a new session Key\n\n } else {\n reject('Data object key could not be defined: Failed to decrypt message ');\n }\n }).catch(function (err) {\n reject('On encryptMessage from method dataObjectsStorage.getDataObject error: ' + err);\n });\n }).catch(function (err) {\n reject('On encryptMessage from method storageManager.get error: ' + err);\n });\n }\n });\n }\n }, {\n key: \"encryptDataObject\",\n value: function encryptDataObject(dataObject, sender) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n CryptoManager_log.info('dataObject value to encrypt: ', dataObject);\n var dataObjectURL = parseMessageURL(sender);\n\n _this.storageManager.get('dataObjectSessionKeys').then(function (sessionKeys) {\n sessionKeys = chatkeysToArrayCloner(sessionKeys || {});\n var dataObjectKey = sessionKeys ? sessionKeys[dataObjectURL] : null; //check if there is already a session key for the chat room\n\n if (dataObjectKey) {\n // and if is to apply encryption, encrypt the messages\n if (dataObjectKey.isToEncrypt) {\n var iv = _this.crypto.generateIV();\n\n _this.crypto.encryptAES(dataObjectKey.sessionKey, stringify(dataObject), iv).then(function (encryptedValue) {\n var newValue = {\n value: encode(encryptedValue),\n iv: encode(iv)\n }; //log.log('encrypted dataObject', newValue);\n\n return resolve(newValue);\n }).catch(function (err) {\n reject('On encryptDataObject from method encryptAES error: ' + err);\n }); // if not, just send the message\n\n } else {\n CryptoManager_log.info('The dataObject is not encrypted');\n return resolve(dataObject);\n } // start the generation of a new session Key\n\n } else {\n return reject('No dataObjectKey for this dataObjectURL:', dataObjectURL);\n }\n }).catch(function (err) {\n reject('On encryptDataObject from method storageManager.get error: ' + err);\n });\n });\n }\n }, {\n key: \"decryptMessage\",\n value: function decryptMessage(message) {\n var _this = this; // log.log('decryptMessage:message', message);\n\n\n return new Promise(function (resolve, reject) {\n var isHandShakeType = message.type === 'handshake';\n\n _this._isToDecrypt(message).then(function (isToDecrypt) {\n //if is not to apply encryption, then returns resolve\n if (!isToDecrypt) return resolve(message);\n var dataObjectURL = parseMessageURL(message.to);\n var isToDataObject = isDataObjectURL(dataObjectURL);\n var isFromHyperty = divideURL(message.from).type === 'hyperty';\n var isToHyperty = divideURL(message.to).type === 'hyperty';\n\n if (message.type === 'update') {\n return resolve(message);\n } //is is hyperty to hyperty communication\n\n\n if (isFromHyperty && isToHyperty) {\n // log.log('decrypt hyperty to hyperty');\n var userURL = _this._registry.getHypertyOwner(message.to);\n\n if (userURL) {\n var chatKeys = _this.chatKeys[message.to + '<->' + message.from];\n\n if (!chatKeys) {\n chatKeys = _this._newChatCrypto(message, userURL, 'decrypt');\n _this.chatKeys[message.to + '<->' + message.from] = chatKeys;\n }\n\n if (chatKeys.authenticated && !isHandShakeType) {\n var value = decode(message.body.value);\n var iv = decodeToUint8Array(value.iv);\n var data = decodeToUint8Array(value.value);\n var hash = decodeToUint8Array(value.hash);\n\n _this.crypto.decryptAES(chatKeys.keys.hypertyToSessionKey, data, iv).then(function (decryptedData) {\n // log.log('decrypted value ', decryptedData);\n message.body.value = decryptedData;\n\n var filteredMessage = _this._filterMessageToHash(message, decryptedData + iv);\n\n _this.crypto.verifyHMAC(chatKeys.keys.hypertyToHashKey, filteredMessage, hash).then(function (result) {\n //log.log('result of hash verification! ', result);\n message.body.assertedIdentity = true;\n resolve(message);\n });\n });\n } else if (isHandShakeType) {\n _this._doHandShakePhase(message, chatKeys).then(function (value) {\n //if it was started by doMutualAuthentication then ends the protocol\n if (value === 'handShakeEnd') {//reject('decrypt handshake protocol phase');\n // if was started by a message, then resend that message\n } else {\n _this.chatKeys[message.to + '<->' + message.from] = value.chatKeys;\n\n _this._messageBus.postMessage(value.message); //reject('decrypt handshake protocol phase ');\n\n }\n });\n } else {\n reject('wrong message do decrypt');\n }\n } else {\n reject('error on decrypt message');\n } //if from hyperty to a dataObjectURL\n\n } else if (isFromHyperty && isToDataObject) {\n // log.log('dataObject value to decrypt: ', message.body);\n _this.storageManager.get('dataObjectSessionKeys').then(function (sessionKeys) {\n sessionKeys = chatkeysToArrayCloner(sessionKeys || {});\n var dataObjectKey = sessionKeys ? sessionKeys[dataObjectURL] : null;\n\n if (dataObjectKey) {\n //check if is to apply encryption\n if (dataObjectKey.isToEncrypt) {\n var parsedValue = parse(message.body.value);\n\n var _iv2 = decodeToUint8Array(parsedValue.iv);\n\n var encryptedValue = decodeToUint8Array(parsedValue.value);\n\n var _hash = decodeToUint8Array(parsedValue.hash);\n\n _this.crypto.decryptAES(dataObjectKey.sessionKey, encryptedValue, _iv2).then(function (decryptedValue) {\n var parsedValue = parse(decryptedValue); // log.log('decrypted Value,', parsedValue);\n\n message.body.value = parsedValue;\n\n var filteredMessage = _this._filterMessageToHash(message, stringify(parsedValue) + stringify(_iv2));\n\n _this.crypto.verifyHMAC(dataObjectKey.sessionKey, filteredMessage, _hash).then(function (result) {\n CryptoManager_log.log('Received message HMAC result', result);\n message.body.assertedIdentity = true;\n resolve(message);\n }).catch(function (err) {\n reject('Message HMAC is invalid: ' + err);\n });\n }); //if not, just return the message\n\n } else {\n message.body.assertedIdentity = true;\n resolve(message);\n }\n } else {\n message.body.assertedIdentity = true;\n resolve(message); //reject('no sessionKey for chat room found');\n }\n });\n } else {\n reject('wrong message to decrypt');\n }\n });\n });\n }\n }, {\n key: \"decryptDataObject\",\n value: function decryptDataObject(dataObject, sender) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //if is not to apply encryption, then returns resolve\n if (!_this.isToUseEncryption) {\n // log.log('decryption disabled');\n return resolve(dataObject);\n }\n\n var dataObjectURL = parseMessageURL(sender); // log.log('dataObject value to decrypt: ', dataObject);\n\n _this.storageManager.get('dataObjectSessionKeys').then(function (sessionKeys) {\n sessionKeys = chatkeysToArrayCloner(sessionKeys);\n var dataObjectKey = sessionKeys ? sessionKeys[dataObjectURL] : null;\n\n if (dataObjectKey) {\n //check if is to apply encryption\n if (dataObjectKey.isToEncrypt) {\n var iv = decodeToUint8Array(dataObject.iv);\n var encryptedValue = decodeToUint8Array(dataObject.value);\n\n _this.crypto.decryptAES(dataObjectKey.sessionKey, encryptedValue, iv).then(function (decryptedValue) {\n var parsedValue = parse(decryptedValue);\n var newValue = {\n value: parsedValue,\n iv: encode(iv)\n }; // log.log('decrypted dataObject,', newValue);\n\n return resolve(newValue);\n }).catch(function (err) {\n reject('On decryptDataObject from method encryptAES error: ' + err);\n }); //if not, just return the dataObject\n\n } else {\n // log.log('The dataObject is not encrypted');\n return resolve(dataObject);\n }\n } else {\n return reject('No dataObjectKey for this dataObjectURL:', dataObjectURL);\n }\n });\n });\n }\n }, {\n key: \"_doMutualAuthenticationPhase1\",\n value: function _doMutualAuthenticationPhase1(message) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var to = message.to.split('/'); //let subsIndex = to.indexOf('subscription');\n //let isDataObjectSubscription = subsIndex !== -1;\n\n to.pop();\n var dataObjectURL = to[0] + '//' + to[2] + '/' + to[3];\n\n _this._doMutualAuthenticationPhase2(dataObjectURL, message.body.subscriber).then(function () {\n _this._registry.registerSubscriber(dataObjectURL, message.body.subscriber);\n\n resolve();\n }, function (error) {\n reject(error);\n });\n });\n }\n }, {\n key: \"_doMutualAuthenticationPhase2\",\n value: function _doMutualAuthenticationPhase2(sender, receiver) {\n CryptoManager_log.info('doMutualAuthentication:sender ', sender);\n CryptoManager_log.info('doMutualAuthentication:receiver ', receiver);\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var dataObjectURL; // check if the sender is a dataObject and if so stores that value\n\n var reporterURL = _this._registry.getReporterURLSynchonous(sender);\n\n if (reporterURL) {\n dataObjectURL = sender;\n sender = reporterURL;\n }\n\n var msg = {\n to: receiver,\n from: sender,\n callback: undefined,\n body: {\n handshakePhase: 'startHandShake',\n ignore: 'ignoreMessage'\n }\n };\n\n if (!sender || !receiver) {\n return reject('sender or receiver missing on doMutualAuthentication');\n }\n\n var chatKeys = _this.chatKeys[sender + '<->' + receiver];\n\n var userURL = _this._registry.getHypertyOwner(sender);\n\n if (userURL) {\n if (!chatKeys) {\n // callback to resolve when finish the mutual authentication\n var resolved = function resolved(value) {\n // log.log('callback value:', value);\n resolve(value);\n };\n\n msg.callback = resolved;\n msg.dataObjectURL = dataObjectURL;\n chatKeys = _this._newChatCrypto(msg, userURL);\n _this.chatKeys[sender + '<->' + receiver] = chatKeys;\n }\n\n if (chatKeys.authenticated) {\n var startSessionKeyExchange = {\n to: sender,\n from: receiver\n };\n chatKeys.dataObjectURL = dataObjectURL;\n\n _this._sendReporterSessionKey(startSessionKeyExchange, chatKeys).then(function (value) {\n _this._messageBus.postMessage(value.message);\n\n resolve('exchange of chat sessionKey initiated');\n }).catch(function (err) {\n reject('On doMutualAuthentication from method _sendReporterSessionKey error: ' + err);\n });\n } else {\n _this._doHandShakePhase(msg, chatKeys);\n }\n } else {\n reject('Mutual authentication error: Hyperty owner could not be resolved');\n }\n });\n }\n /**\n * returns the reporter associated to the dataObject URL\n * @param {String} dataObjectURL dataObject url\n * @return {String} reporter dataObject url reporter\n */\n\n /* _getHypertyFromDataObject(dataObjectURL) {\n log.info('_getHypertyFromDataObject:dataObjectURL', dataObjectURL);\n let _this = this;\n return new Promise(function(resolve, reject) {\n let splitedURL = divideURL(dataObjectURL);\n let domain = splitedURL.domain;\n let finalURL = _this._parseMessageURL(dataObjectURL);\n // check if is the creator of the hyperty\n let reporterURL = _this.registry.getReporterURLSynchonous(finalURL);\n log.info('_getHypertyFromDataObject:reporterURL', reporterURL);\n if (reporterURL) {\n resolve(reporterURL);\n } else {\n // check if there is already an association from an hypertyURL to the dataObject\n let storedReporterURL = _this.dataObjectsIdentity[finalURL];\n log.info('_getHypertyFromDataObject:storedReporterURL', storedReporterURL);\n if (storedReporterURL) {\n resolve(storedReporterURL);\n } else {\n // check if there is any hyperty that subscribed the dataObjectURL\n let subscriberHyperty = _this.registry.getDataObjectSubscriberHyperty(dataObjectURL);\n log.info('_getHypertyFromDataObject:subscriberHyperty', subscriberHyperty);\n if (subscriberHyperty) {\n resolve(subscriberHyperty);\n } else {\n // search in domain registry for the hyperty associated to the dataObject\n // search in case is a subscriber who wants to know the reporter\n _this._coreDiscovery.discoverDataObjectPerURL(finalURL, domain).then(dataObject => {\n log.info('_getHypertyFromDataObject:dataObject', dataObject);\n _this.dataObjectsIdentity[finalURL] = dataObject.reporter;\n log.info('_getHypertyFromDataObject:dataObject.reporter', dataObject.reporter);\n resolve(dataObject.reporter);\n }, err => {\n reject(err);\n });\n }\n }\n }\n });\n }*/\n\n }, {\n key: \"_sendReporterSessionKey\",\n value: function _sendReporterSessionKey(message, chatKeys) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var sessionKeyBundle = _this.dataObjectSessionKeys[chatKeys.dataObjectURL];\n var reporterSessionKeyMsg;\n var valueToEncrypt;\n var sessionKey;\n var iv;\n var value = {}; //if there is not yet a session Key, generates a new one\n\n if (!sessionKeyBundle) {\n sessionKey = _this.crypto.generateRandom();\n _this.dataObjectSessionKeys[chatKeys.dataObjectURL] = {\n sessionKey: sessionKey,\n isToEncrypt: true\n };\n var dataObjectSessionKeysClone = chatkeysToStringCloner(_this.dataObjectSessionKeys);\n\n _this.storageManager.set('dataObjectSessionKeys', 0, dataObjectSessionKeysClone).catch(function (err) {\n reject('On _sendReporterSessionKey from method storageManager.set(dataObjectSessionKeys...) error: ' + err);\n });\n } else {\n sessionKey = sessionKeyBundle.sessionKey;\n }\n\n try {\n valueToEncrypt = encode({\n value: encode(sessionKey),\n dataObjectURL: chatKeys.dataObjectURL\n });\n } catch (err) {\n return reject('On _sendReporterSessionKey from method storageManager.set error valueToEncrypt: ' + err);\n }\n\n iv = _this.crypto.generateIV();\n value.iv = encode(iv);\n\n _this.crypto.encryptAES(chatKeys.keys.hypertyFromSessionKey, valueToEncrypt, iv).then(function (encryptedValue) {\n reporterSessionKeyMsg = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'reporterSessionKey',\n value: encode(encryptedValue)\n }\n };\n\n var filteredMessage = _this._filterMessageToHash(reporterSessionKeyMsg, valueToEncrypt + iv, chatKeys.hypertyFrom.messageInfo);\n\n return _this.crypto.hashHMAC(chatKeys.keys.hypertyFromHashKey, filteredMessage);\n }).then(function (hashedMessage) {\n var valueWithHash = encode({\n value: reporterSessionKeyMsg.body.value,\n hash: encode(hashedMessage),\n iv: value.iv\n });\n reporterSessionKeyMsg.body.value = valueWithHash;\n resolve({\n message: reporterSessionKeyMsg,\n chatKeys: chatKeys\n });\n }).catch(function (err) {\n reject('On _sendReporterSessionKey from chained promises encryptAES error: ' + err);\n });\n });\n }\n /**\n * Function that resolve and create the domainURL in case it is provided one. If not, resolve the default domainURL\n * @param {String} idpDomain idpDomain (Optional)\n */\n\n }, {\n key: \"_resolveDomain\",\n value: function _resolveDomain(idpDomain) {\n if (!idpDomain) {\n return 'domain-idp://google.com';\n } else {\n return 'domain-idp://' + idpDomain;\n }\n }\n }, {\n key: \"_doHandShakePhase\",\n value: function _doHandShakePhase(message, chatKeys) {\n // log('_doHandShakePhase:dataObject', message);\n //\tlog('_doHandShakePhase:chatKeys', chatKeys);\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var handshakeType = message.body.handshakePhase;\n var iv;\n var hash;\n var value = {};\n var filteredMessage;\n var privateKeyHolder;\n CryptoManager_log.info('handshake phase: ', handshakeType);\n\n switch (handshakeType) {\n case 'startHandShake':\n {\n chatKeys.keys.fromRandom = _this.crypto.generateRandom();\n var startHandShakeMsg = {\n type: 'handshake',\n to: message.to,\n from: message.from,\n body: {\n handshakePhase: 'senderHello',\n value: encode(chatKeys.keys.fromRandom)\n }\n };\n chatKeys.handshakeHistory.senderHello = _this._filterMessageToHash(startHandShakeMsg, undefined, chatKeys.hypertyFrom.messageInfo); // check if was the encrypt function or the mutual authentication that request the\n // start of the handShakePhase.\n\n if (chatKeys.initialMessage) {\n resolve({\n message: startHandShakeMsg,\n chatKeys: chatKeys\n });\n } else {\n _this.chatKeys[message.from + '<->' + message.to] = chatKeys;\n\n _this._messageBus.postMessage(startHandShakeMsg);\n }\n\n break;\n }\n\n case 'senderHello':\n {\n CryptoManager_log.log('senderHello');\n chatKeys.handshakeHistory.senderHello = _this._filterMessageToHash(message);\n chatKeys.keys.fromRandom = decodeToUint8Array(message.body.value);\n chatKeys.keys.toRandom = _this.crypto.generateRandom();\n var senderHelloMsg = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'receiverHello',\n value: encode(chatKeys.keys.toRandom)\n }\n };\n chatKeys.handshakeHistory.receiverHello = _this._filterMessageToHash(senderHelloMsg, undefined, chatKeys.hypertyFrom.messageInfo);\n resolve({\n message: senderHelloMsg,\n chatKeys: chatKeys\n });\n break;\n }\n\n case 'receiverHello':\n {\n CryptoManager_log.log('receiverHello');\n\n _this.getMyPrivateKey().then(function (privateKey) {\n privateKeyHolder = privateKey;\n chatKeys.handshakeHistory.receiverHello = _this._filterMessageToHash(message);\n return _this._idm.validateAssertion(message.body.identity.assertion, undefined, message.body.identity.idp.domain);\n }).then(function (value) {\n //TODO remove later this verification as soon as all the IdP proxy are updated in the example\n var encodedpublicKey = typeof value.contents === 'string' ? value.contents : value.contents.nonce;\n var receiverPublicKey = parseToUint8Array(encodedpublicKey);\n\n var premasterSecret = _this.crypto.generatePMS();\n\n var toRandom = message.body.value;\n chatKeys.hypertyTo.assertion = message.body.identity.assertion;\n chatKeys.hypertyTo.publicKey = receiverPublicKey;\n chatKeys.hypertyTo.userID = message.body.identity.userProfile.userURL;\n chatKeys.keys.toRandom = decodeToUint8Array(toRandom);\n chatKeys.keys.premasterKey = premasterSecret;\n\n var concatKey = _this.crypto.concatPMSwithRandoms(premasterSecret, chatKeys.keys.toRandom, chatKeys.keys.fromRandom);\n\n return _this.crypto.generateMasterSecret(concatKey, 'messageHistoric' + chatKeys.keys.toRandom + chatKeys.keys.fromRandom); //generate the master key\n }).then(function (masterKey) {\n chatKeys.keys.masterKey = masterKey;\n return _this.crypto.generateKeys(masterKey, 'key expansion' + chatKeys.keys.toRandom + chatKeys.keys.fromRandom); //generate the symmetric and hash keys\n }).then(function (keys) {\n chatKeys.keys.hypertyToSessionKey = new Uint8Array(keys[0]);\n chatKeys.keys.hypertyFromSessionKey = new Uint8Array(keys[1]);\n chatKeys.keys.hypertyToHashKey = new Uint8Array(keys[2]);\n chatKeys.keys.hypertyFromHashKey = new Uint8Array(keys[3]);\n iv = _this.crypto.generateIV();\n value.iv = encode(iv);\n var messageStructure = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'senderCertificate'\n }\n }; // hash the value and the iv\n\n filteredMessage = _this._filterMessageToHash(messageStructure, 'ok' + iv, chatKeys.hypertyFrom.messageInfo);\n return _this.crypto.hashHMAC(chatKeys.keys.hypertyFromHashKey, filteredMessage);\n }).then(function (hash) {\n value.hash = encode(hash); //encrypt the data\n\n return _this.crypto.encryptAES(chatKeys.keys.hypertyFromSessionKey, 'ok', iv);\n }).then(function (encryptedData) {\n value.symetricEncryption = encode(encryptedData);\n return _this.crypto.encryptRSA(chatKeys.hypertyTo.publicKey, chatKeys.keys.premasterKey);\n }).then(function (encryptedValue) {\n value.assymetricEncryption = encode(encryptedValue);\n var messageStructure = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'senderCertificate'\n }\n };\n\n var messageToHash = _this._filterMessageToHash(messageStructure, chatKeys.keys.premasterKey, chatKeys.hypertyFrom.messageInfo);\n\n return _this.crypto.signRSA(privateKeyHolder, encode(chatKeys.handshakeHistory) + encode(messageToHash));\n }).then(function (signature) {\n value.signature = encode(signature);\n var receiverHelloMsg = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'senderCertificate',\n value: encode(value)\n }\n };\n chatKeys.handshakeHistory.senderCertificate = _this._filterMessageToHash(receiverHelloMsg, 'ok' + iv, chatKeys.hypertyFrom.messageInfo);\n resolve({\n message: receiverHelloMsg,\n chatKeys: chatKeys\n });\n }, function (error) {\n return reject(error);\n });\n\n break;\n }\n\n case 'senderCertificate':\n {\n CryptoManager_log.log('senderCertificate');\n var receivedValue = decode(message.body.value);\n\n _this.getMyPrivateKey().then(function (privateKey) {\n privateKeyHolder = privateKey;\n return _this._idm.validateAssertion(message.body.identity.assertion, undefined, message.body.identity.idp.domain);\n }).then(function (value) {\n var encryptedPMS = decodeToUint8Array(receivedValue.assymetricEncryption); //TODO remove later this verification as soon as all the IdP proxy are updated in the example\n\n var encodedpublicKey = typeof value.contents === 'string' ? value.contents : value.contents.nonce;\n var senderPublicKey = parseToUint8Array(encodedpublicKey);\n chatKeys.hypertyTo.assertion = message.body.identity.assertion;\n chatKeys.hypertyTo.publicKey = senderPublicKey;\n chatKeys.hypertyTo.userID = message.body.identity.userProfile.userURL;\n return _this.crypto.decryptRSA(privateKeyHolder, encryptedPMS);\n }, function (error) {\n // log.log(error);\n reject('Error during authentication of identity: ', error.message); //obtain the PremasterKey using the private key\n }).then(function (pms) {\n chatKeys.keys.premasterKey = new Uint8Array(pms);\n var signature = decodeToUint8Array(receivedValue.signature);\n\n var receivedmsgToHash = _this._filterMessageToHash(message, chatKeys.keys.premasterKey);\n\n return _this.crypto.verifyRSA(chatKeys.hypertyTo.publicKey, encode(chatKeys.handshakeHistory) + encode(receivedmsgToHash), signature); // validates the signature received\n }).then(function (signValidationResult) {\n //log.log('SenderCertificate - signature validation result ', signValidationResult);\n var concatKey = _this.crypto.concatPMSwithRandoms(chatKeys.keys.premasterKey, chatKeys.keys.toRandom, chatKeys.keys.fromRandom);\n\n return _this.crypto.generateMasterSecret(concatKey, 'messageHistoric' + chatKeys.keys.toRandom + chatKeys.keys.fromRandom); // generates the master keys from the Premaster key and the randoms\n }).then(function (masterKey) {\n chatKeys.keys.masterKey = masterKey;\n return _this.crypto.generateKeys(masterKey, 'key expansion' + chatKeys.keys.toRandom + chatKeys.keys.fromRandom); // generates the symmetric keys to be used in the symmetric encryption\n }).then(function (keys) {\n chatKeys.keys.hypertyFromSessionKey = new Uint8Array(keys[0]);\n chatKeys.keys.hypertyToSessionKey = new Uint8Array(keys[1]);\n chatKeys.keys.hypertyFromHashKey = new Uint8Array(keys[2]);\n chatKeys.keys.hypertyToHashKey = new Uint8Array(keys[3]);\n iv = decodeToUint8Array(receivedValue.iv);\n var data = decodeToUint8Array(receivedValue.symetricEncryption);\n return _this.crypto.decryptAES(chatKeys.keys.hypertyToSessionKey, data, iv);\n }).then(function (decryptedData) {\n // log.log('decryptedData', decryptedData);\n chatKeys.handshakeHistory.senderCertificate = _this._filterMessageToHash(message, decryptedData + iv);\n var hashReceived = decodeToUint8Array(receivedValue.hash);\n filteredMessage = _this._filterMessageToHash(message, decryptedData + iv);\n return _this.crypto.verifyHMAC(chatKeys.keys.hypertyToHashKey, filteredMessage, hashReceived);\n }).then(function (verifiedHash) {\n // log.log('result of hash verification ', verifiedHash);\n var receiverFinishedMessage = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'receiverFinishedMessage'\n }\n };\n iv = _this.crypto.generateIV();\n value.iv = encode(iv);\n filteredMessage = _this._filterMessageToHash(receiverFinishedMessage, 'ok!' + iv, chatKeys.hypertyFrom.messageInfo); //log.log('TIAGO: doHandShakePhase verifiedHash');\n\n return _this.crypto.hashHMAC(chatKeys.keys.hypertyFromHashKey, filteredMessage);\n }).then(function (hash) {\n value.hash = encode(hash);\n return _this.crypto.encryptAES(chatKeys.keys.hypertyFromSessionKey, 'ok!', iv);\n }).then(function (encryptedValue) {\n value.value = encode(encryptedValue);\n var receiverFinishedMessage = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'receiverFinishedMessage',\n value: encode(value)\n }\n };\n chatKeys.handshakeHistory.receiverFinishedMessage = _this._filterMessageToHash(receiverFinishedMessage, 'ok!' + iv, chatKeys.hypertyFrom.messageInfo);\n chatKeys.authenticated = true;\n resolve({\n message: receiverFinishedMessage,\n chatKeys: chatKeys\n });\n }).catch(function (err) {\n reject('On _doHandShakePhase from senderCertificate error: ' + err);\n });\n\n break;\n }\n\n case 'receiverFinishedMessage':\n {\n chatKeys.authenticated = true;\n value = decode(message.body.value);\n iv = decodeToUint8Array(value.iv);\n var data = decodeToUint8Array(value.value);\n hash = decodeToUint8Array(value.hash);\n\n _this.crypto.decryptAES(chatKeys.keys.hypertyToSessionKey, data, iv).then(function (decryptedData) {\n // log.log('decryptedData', decryptedData);\n chatKeys.handshakeHistory.receiverFinishedMessage = _this._filterMessageToHash(message, decryptedData + iv);\n\n var filteredMessage = _this._filterMessageToHash(message, decryptedData + iv);\n\n _this.crypto.verifyHMAC(chatKeys.keys.hypertyToHashKey, filteredMessage, hash).then(function (result) {\n // check if there was an initial message that was blocked and send it\n if (chatKeys.initialMessage) {\n var initialMessage = {\n type: 'create',\n to: message.from,\n from: message.to,\n body: {\n value: chatKeys.initialMessage.body.value\n }\n };\n resolve({\n message: initialMessage,\n chatKeys: chatKeys\n }); //sends the sessionKey to the subscriber hyperty\n } else {\n _this._sendReporterSessionKey(message, chatKeys).then(function (value) {\n resolve(value);\n }).catch(function (err) {\n reject('On _doHandShakePhase from receiverFinishedMessage error: ' + err);\n });\n }\n });\n });\n\n break;\n }\n\n case 'reporterSessionKey':\n {\n CryptoManager_log.log('reporterSessionKey');\n var valueIVandHash = decode(message.body.value);\n hash = decodeToUint8Array(valueIVandHash.hash);\n iv = decodeToUint8Array(valueIVandHash.iv);\n var encryptedValue = decodeToUint8Array(valueIVandHash.value);\n var parsedValue;\n var sessionKey;\n var dataObjectURL;\n var receiverAcknowledgeMsg; //log.log('[IdentityModule reporterSessionKey] - decryptAES: ', chatKeys.keys.hypertyToSessionKey, encryptedValue, iv);\n\n _this.crypto.decryptAES(chatKeys.keys.hypertyToSessionKey, encryptedValue, iv).then(function (decryptedValue) {\n parsedValue = decode(decryptedValue);\n sessionKey = decodeToUint8Array(parsedValue.value);\n dataObjectURL = parsedValue.dataObjectURL;\n\n var messageToHash = _this._filterMessageToHash(message, decryptedValue + iv);\n\n return _this.crypto.verifyHMAC(chatKeys.keys.hypertyToHashKey, messageToHash, hash);\n }).then(function (hashResult) {\n // log.log('hash successfully validated ', hashResult);\n _this.dataObjectSessionKeys[dataObjectURL] = {\n sessionKey: sessionKey,\n isToEncrypt: true\n };\n var dataObjectSessionKeysClone = chatkeysToStringCloner(_this.dataObjectSessionKeys);\n\n _this.storageManager.set('dataObjectSessionKeys', 0, dataObjectSessionKeysClone).catch(function (err) {\n reject('On _sendReporterSessionKey from method reporterSessionKey error: ' + err);\n });\n\n iv = _this.crypto.generateIV();\n value.iv = encode(iv);\n return _this.crypto.encryptAES(chatKeys.keys.hypertyFromSessionKey, 'ok!!', iv);\n }).then(function (encryptedValue) {\n receiverAcknowledgeMsg = {\n type: 'handshake',\n to: message.from,\n from: message.to,\n body: {\n handshakePhase: 'receiverAcknowledge'\n }\n };\n value.value = encode(encryptedValue);\n\n var messageToHash = _this._filterMessageToHash(receiverAcknowledgeMsg, 'ok!!' + iv, chatKeys.hypertyFrom.messageInfo);\n\n return _this.crypto.hashHMAC(chatKeys.keys.hypertyFromHashKey, messageToHash);\n }).then(function (hashedMessage) {\n var finalValue = encode({\n value: value.value,\n hash: encode(hashedMessage),\n iv: value.iv\n });\n receiverAcknowledgeMsg.body.value = finalValue;\n resolve({\n message: receiverAcknowledgeMsg,\n chatKeys: chatKeys\n });\n }).catch(function (err) {\n reject('On _doHandShakePhase from reporterSessionKey error: ' + err);\n });\n\n break;\n }\n\n case 'receiverAcknowledge':\n {\n CryptoManager_log.log('receiverAcknowledge');\n var receivedvalueIVandHash = decode(message.body.value);\n var receivedHash = decodeToUint8Array(receivedvalueIVandHash.hash);\n iv = decodeToUint8Array(receivedvalueIVandHash.iv);\n var receivedEncryptedValue = decodeToUint8Array(receivedvalueIVandHash.value);\n\n _this.crypto.decryptAES(chatKeys.keys.hypertyToSessionKey, receivedEncryptedValue, iv).then(function (decryptedValue) {\n var filteredMessage = _this._filterMessageToHash(message, decryptedValue + iv);\n\n return _this.crypto.verifyHMAC(chatKeys.keys.hypertyToHashKey, filteredMessage, receivedHash);\n }).then(function (hashResult) {\n // log.log('hashResult ', hashResult);\n var callback = chatKeys.callback;\n\n if (callback) {\n callback('handShakeEnd');\n }\n\n resolve('handShakeEnd');\n }).catch(function (err) {\n reject('On _doHandShakePhase from receiverAcknowledge error: ' + err);\n });\n\n break;\n }\n\n default:\n reject(message);\n }\n });\n }\n /**\n * filter the messages to hash, by removing some fields not generated by the runtime core\n * @param {Message} message message\n * @param {String} decryptedValue (Optional) value from body.value in case it originally comes encrypted\n * @param {JSON} identity(Optional) add the hyperty identity associated in case is not added to the initial message\n * @return {Message} new message filtered\n */\n\n }, {\n key: \"_filterMessageToHash\",\n value: function _filterMessageToHash(message, decryptedValue, identity) {\n return {\n type: message.type,\n from: message.from,\n to: message.to,\n body: {\n identity: identity || message.body.identity,\n value: decryptedValue || message.body.value,\n handshakePhase: message.body.handshakePhase\n }\n };\n }\n /**\n * generates the initial structure for the keys between two users\n * @param {JSON} message initial message that triggers the mutual authentication\n * @param {String} userURL userURL\n * @param {boolean} receiver(Optional) indicates if is the sender or the receiver that creates a new chat crypto\n * @return {JSON} newChatCrypto new JSON structure for the chat crypto\n */\n\n }, {\n key: \"_newChatCrypto\",\n value: function _newChatCrypto(message, userURL, receiver) {\n var _this = this; //check whether is the sender or the receiver to create a new chatCrypto\n //to mantain consistency on the keys if the receiver create a new chatCrypto,\n //then invert the fields\n\n\n var from = receiver ? message.to : message.from;\n var to = receiver ? message.from : message.to;\n\n var userInfo = _this._idm.getIdentity(userURL);\n\n var newChatCrypto = {\n hypertyFrom: {\n hyperty: from,\n userID: userInfo.userProfile.userURL,\n //privateKey: \"getMyPublicKey\",\n //publicKey: \"getMyPrivateKey\",\n assertion: userInfo.assertion,\n messageInfo: userInfo\n },\n hypertyTo: {\n hyperty: to,\n userID: undefined,\n publicKey: undefined,\n assertion: undefined\n },\n keys: {\n hypertyToSessionKey: undefined,\n hypertyFromSessionKey: undefined,\n hypertyToHashKey: undefined,\n hypertyFromHashKey: undefined,\n toRandom: undefined,\n fromRandom: undefined,\n premasterKey: undefined,\n masterKey: undefined\n },\n handshakeHistory: {\n senderHello: undefined,\n receiverHello: undefined,\n senderCertificate: undefined,\n receiverFinishedMessage: undefined\n },\n initialMessage: message.body.ignore ? undefined : message,\n callback: message.callback,\n authenticated: false,\n dataObjectURL: message.dataObjectURL\n };\n return newChatCrypto;\n }\n /**\n * Retrieves a public keys given a user refrence. If no key is found,\n generates a new key asymmetric key and retrieves the public keys.\n * @param {userRef} String user reference for the key pair\n * @return {Array} public key\n */\n\n }, {\n key: \"getMyPublicKey\",\n value: function getMyPublicKey() {\n var userRef = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.userDefaultKeyRef;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.storageManager.get(userRef).then(function (storedKeyPair) {\n if (storedKeyPair) {\n return resolve(storedKeyPair.public);\n }\n\n _this._generateAndStoreNewAsymetricKey(userRef).then(function (generatedKeyPair) {\n resolve(generatedKeyPair.public);\n }).catch(function (err) {\n CryptoManager_log.error('[getMyPublicKey:_generateAndStoreNewAsymetricKey:err]: ' + err.message);\n reject(err);\n });\n }).catch(function (err) {\n CryptoManager_log.error('[getMyPublicKey:storageManager:err]: ' + err.message);\n reject(err);\n });\n });\n }\n /**\n * Retrieves a private keys given a user refrence. If no key is found,\n generates a new key asymmetric key and retrieves the private key.\n * @param {userRef} String user reference for the key pair\n * @return {Array} private key\n **/\n\n }, {\n key: \"getMyPrivateKey\",\n value: function getMyPrivateKey() {\n var userRef = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.userDefaultKeyRef;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.storageManager.get(userRef).then(function (storedKeyPair) {\n if (storedKeyPair) {\n return resolve(storedKeyPair.private);\n }\n\n _this._generateAndStoreNewAsymetricKey(userRef).then(function (generatedKeyPair) {\n resolve(generatedKeyPair.private);\n }).catch(function (err) {\n CryptoManager_log.error('[getMyPrivateKey:_generateAndStoreNewAsymetricKey:err]: ' + err.message);\n reject(err);\n });\n }).catch(function (err) {\n CryptoManager_log.error('[getMyPrivateKey:storageManager:err]: ' + err.message);\n reject(err);\n });\n });\n }\n /**\n * Generates a new key pair, stores and retrives the key pair.\n * @param {userRef} String user reference for the key pair\n * @return {Array} private key\n **/\n\n }, {\n key: \"_generateAndStoreNewAsymetricKey\",\n value: function _generateAndStoreNewAsymetricKey(userRef) {\n var _this = this;\n\n var keyPair = undefined;\n return new Promise(function (resolve, reject) {\n // _this.crypto.generateRSAKeyPair().then(generatedKeyPair => {\n var generatedKeyPair = {};\n generatedKeyPair.private = generateGUID();\n generatedKeyPair.public = generateGUID();\n CryptoManager_log.log('_generateAndStoreNewAsymetricKey:userAsymmetricKeyGenerated', generatedKeyPair);\n keyPair = generatedKeyPair;\n\n _this.storageManager.set(userRef, 0, generatedKeyPair); // }).then(storedReference => {\n // log.log('_generateAndStoreNewAsymetricKey:userAsymmetricKeySuccess', storedReference);\n\n\n resolve(keyPair);\n }).catch(function (err) {\n CryptoManager_log.error('[_generateAndStoreNewAsymetricKey:err]: ' + err.message);\n reject(err);\n }); // });\n }\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this._messageBus;\n }\n /**\n * Set the messageBus in this Registry\n * @param {MessageBus} messageBus\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this._messageBus = messageBus;\n\n _this.addCryptoGUIListeners();\n }\n /**\n * return the coreDiscovery component\n */\n\n }, {\n key: \"coreDiscovery\",\n get: function get() {\n var _this = this;\n\n return _this._coreDiscovery;\n }\n /**\n * return user's public key\n */\n\n /* getMyPublicKey() {\n // to be implemented\n return new Promise((resolve)=> {\n resolve('mypublickey');\n });\n }\n */\n\n /**\n * Set the coreDiscovery component\n * @param {coreDiscovery} coreDiscovery\n */\n ,\n set: function set(coreDiscovery) {\n var _this = this;\n\n _this._coreDiscovery = coreDiscovery;\n }\n /**\n * return the registry in this idModule\n * @param {registry} registry\n */\n\n }, {\n key: \"registry\",\n get: function get() {\n var _this = this;\n\n return _this._registry;\n }\n /**\n * Set the registry in this idModule\n * @param {registry} reg\n */\n ,\n set: function set(registry) {\n var _this = this;\n\n _this._registry = registry;\n }\n }]);\n\n return CryptoManager;\n}();\n/*\nconst nodeJSKeyPairPopulate = { public: [48, 130, 1, 34, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 3, 130, 1, 15, 0, 48, 130, 1, 10, 2, 130, 1, 1, 0, 228, 43, 101, 12, 121, 7, 157, 71, 81, 58, 219, 32, 10, 108, 193, 179, 212, 116, 255, 59, 217, 32, 161, 201, 53, 171, 226, 199, 137, 202, 171, 60, 82, 53, 125, 62, 177, 126, 165, 24, 141, 30, 15, 226, 59, 107, 34, 7, 13, 149, 112, 125, 10, 230, 191, 156, 164, 177, 10, 185, 13, 66, 3, 217, 166, 244, 90, 119, 111, 27, 145, 104, 71, 189, 166, 226, 255, 133, 83, 151, 231, 101, 151, 89, 22, 19, 65, 154, 10, 53, 208, 218, 252, 219, 37, 50, 212, 86, 145, 107, 132, 90, 233, 202, 227, 108, 114, 141, 29, 73, 187, 31, 13, 234, 0, 232, 24, 191, 35, 149, 179, 138, 214, 159, 245, 162, 148, 221, 118, 17, 105, 89, 151, 146, 209, 55, 236, 61, 143, 233, 228, 10, 115, 8, 81, 197, 45, 123, 187, 223, 176, 254, 165, 69, 143, 29, 100, 114, 17, 130, 226, 223, 33, 11, 240, 81, 61, 172, 191, 157, 246, 202, 87, 131, 221, 88, 48, 127, 159, 119, 160, 152, 117, 61, 253, 174, 65, 214, 203, 218, 63, 50, 78, 160, 181, 221, 211, 128, 70, 178, 191, 170, 0, 13, 122, 173, 12, 203, 252, 4, 184, 225, 252, 7, 62, 96, 116, 15, 216, 158, 55, 85, 48, 16, 9, 206, 119, 74, 112, 243, 136, 84, 184, 223, 254, 101, 91, 61, 10, 91, 85, 192, 147, 144, 57, 29, 66, 238, 199, 244, 193, 194, 150, 232, 200, 107, 2, 3, 1, 0, 1],\n private: [48, 130, 4, 191, 2, 1, 0, 48, 13, 6, 9, 42, 134, 72, 134, 247, 13, 1, 1, 1, 5, 0, 4, 130, 4, 169, 48, 130, 4, 165, 2, 1, 0, 2, 130, 1, 1, 0, 228, 43, 101, 12, 121, 7, 157, 71, 81, 58, 219, 32, 10, 108, 193, 179, 212, 116, 255, 59, 217, 32, 161, 201, 53, 171, 226, 199, 137, 202, 171, 60, 82, 53, 125, 62, 177, 126, 165, 24, 141, 30, 15, 226, 59, 107, 34, 7, 13, 149, 112, 125, 10, 230, 191, 156, 164, 177, 10, 185, 13, 66, 3, 217, 166, 244, 90, 119, 111, 27, 145, 104, 71, 189, 166, 226, 255, 133, 83, 151, 231, 101, 151, 89, 22, 19, 65, 154, 10, 53, 208, 218, 252, 219, 37, 50, 212, 86, 145, 107, 132, 90, 233, 202, 227, 108, 114, 141, 29, 73, 187, 31, 13, 234, 0, 232, 24, 191, 35, 149, 179, 138, 214, 159, 245, 162, 148, 221, 118, 17, 105, 89, 151, 146, 209, 55, 236, 61, 143, 233, 228, 10, 115, 8, 81, 197, 45, 123, 187, 223, 176, 254, 165, 69, 143, 29, 100, 114, 17, 130, 226, 223, 33, 11, 240, 81, 61, 172, 191, 157, 246, 202, 87, 131, 221, 88, 48, 127, 159, 119, 160, 152, 117, 61, 253, 174, 65, 214, 203, 218, 63, 50, 78, 160, 181, 221, 211, 128, 70, 178, 191, 170, 0, 13, 122, 173, 12, 203, 252, 4, 184, 225, 252, 7, 62, 96, 116, 15, 216, 158, 55, 85, 48, 16, 9, 206, 119, 74, 112, 243, 136, 84, 184, 223, 254, 101, 91, 61, 10, 91, 85, 192, 147, 144, 57, 29, 66, 238, 199, 244, 193, 194, 150, 232, 200, 107, 2, 3, 1, 0, 1, 2, 130, 1, 0, 103, 244, 137, 118, 116, 82, 14, 203, 102, 107, 253, 88, 12, 199, 222, 60, 243, 136, 86, 157, 74, 224, 190, 53, 113, 57, 157, 250, 49, 130, 96, 31, 252, 136, 152, 70, 143, 17, 215, 96, 103, 51, 18, 35, 141, 212, 210, 205, 9, 216, 83, 70, 245, 71, 138, 119, 112, 229, 164, 176, 9, 37, 81, 161, 193, 154, 68, 249, 115, 106, 201, 6, 12, 225, 144, 126, 141, 210, 141, 242, 128, 159, 221, 163, 222, 21, 233, 230, 167, 206, 59, 24, 250, 233, 81, 122, 102, 26, 6, 233, 72, 133, 47, 77, 155, 238, 86, 6, 139, 24, 131, 163, 179, 112, 48, 247, 142, 6, 207, 204, 173, 223, 140, 199, 150, 95, 123, 152, 202, 155, 131, 238, 62, 96, 133, 4, 217, 51, 121, 30, 38, 178, 189, 216, 44, 35, 241, 93, 7, 62, 90, 111, 216, 66, 209, 243, 128, 234, 141, 84, 135, 181, 13, 38, 220, 114, 245, 240, 178, 95, 220, 206, 11, 186, 234, 213, 66, 121, 83, 68, 89, 75, 46, 183, 145, 183, 147, 160, 215, 118, 198, 125, 181, 146, 30, 251, 58, 87, 47, 209, 237, 97, 24, 47, 179, 6, 110, 242, 99, 150, 226, 148, 198, 174, 146, 101, 213, 87, 178, 10, 223, 105, 18, 56, 53, 22, 212, 158, 170, 176, 51, 86, 145, 125, 124, 44, 9, 85, 19, 144, 246, 170, 78, 124, 30, 32, 12, 166, 174, 139, 77, 63, 173, 82, 10, 153, 2, 129, 129, 0, 248, 18, 143, 246, 137, 136, 145, 219, 178, 39, 27, 94, 64, 90, 47, 163, 114, 60, 63, 187, 131, 143, 244, 16, 42, 128, 231, 117, 92, 98, 219, 155, 62, 107, 252, 17, 245, 45, 160, 225, 103, 142, 72, 36, 193, 150, 235, 214, 175, 62, 212, 56, 45, 9, 0, 60, 114, 107, 134, 228, 204, 131, 131, 214, 94, 201, 148, 159, 99, 139, 181, 13, 119, 38, 30, 107, 166, 165, 203, 43, 34, 20, 207, 171, 32, 58, 167, 62, 196, 153, 103, 204, 213, 247, 48, 111, 227, 59, 95, 97, 194, 187, 53, 10, 247, 108, 58, 86, 28, 29, 113, 8, 110, 171, 220, 245, 11, 82, 233, 223, 91, 68, 166, 117, 174, 187, 62, 77, 2, 129, 129, 0, 235, 118, 2, 105, 239, 212, 30, 104, 157, 41, 109, 11, 248, 152, 22, 236, 97, 40, 153, 131, 228, 5, 86, 187, 113, 126, 144, 76, 141, 79, 110, 250, 146, 152, 49, 58, 156, 201, 176, 92, 189, 209, 30, 112, 108, 175, 204, 204, 247, 164, 46, 129, 239, 98, 127, 49, 145, 218, 63, 193, 124, 174, 18, 98, 201, 99, 154, 162, 138, 78, 159, 253, 3, 248, 3, 209, 36, 239, 193, 155, 193, 5, 19, 236, 37, 78, 118, 135, 250, 199, 7, 141, 248, 120, 36, 136, 93, 98, 174, 60, 18, 215, 93, 174, 107, 141, 116, 145, 167, 221, 210, 169, 247, 67, 254, 222, 161, 134, 63, 221, 90, 87, 42, 99, 227, 81, 173, 151, 2, 129, 129, 0, 133, 23, 168, 103, 83, 232, 146, 160, 181, 23, 40, 38, 204, 13, 214, 203, 49, 41, 195, 227, 189, 181, 8, 243, 119, 106, 75, 67, 250, 250, 10, 234, 98, 118, 26, 250, 35, 121, 132, 124, 10, 76, 26, 198, 165, 154, 108, 19, 117, 88, 23, 17, 192, 143, 184, 177, 181, 141, 157, 4, 185, 248, 193, 77, 204, 243, 7, 170, 240, 4, 111, 113, 183, 0, 27, 136, 20, 19, 149, 74, 33, 241, 218, 108, 236, 80, 171, 148, 16, 116, 97, 109, 83, 74, 88, 145, 94, 239, 102, 192, 19, 114, 207, 5, 128, 51, 111, 164, 237, 86, 154, 99, 52, 197, 62, 57, 182, 6, 152, 245, 61, 137, 58, 105, 159, 2, 84, 109, 2, 129, 129, 0, 226, 67, 111, 132, 95, 91, 101, 177, 63, 189, 44, 53, 193, 184, 92, 230, 223, 98, 133, 74, 209, 86, 52, 7, 65, 195, 206, 100, 81, 178, 144, 65, 167, 151, 42, 79, 89, 149, 18, 173, 188, 21, 244, 251, 49, 230, 41, 150, 153, 46, 35, 38, 231, 99, 174, 56, 115, 32, 215, 253, 85, 147, 108, 197, 147, 34, 236, 216, 222, 177, 57, 90, 136, 114, 207, 48, 46, 31, 90, 220, 18, 58, 143, 239, 111, 214, 27, 95, 6, 36, 53, 229, 62, 108, 45, 39, 1, 30, 47, 178, 56, 164, 206, 56, 42, 208, 46, 193, 61, 31, 147, 45, 147, 23, 187, 22, 50, 255, 111, 229, 132, 199, 152, 75, 142, 136, 209, 151, 2, 129, 129, 0, 165, 56, 232, 76, 55, 57, 240, 159, 92, 207, 220, 143, 130, 30, 57, 234, 251, 172, 171, 180, 54, 159, 229, 96, 246, 73, 112, 146, 75, 157, 242, 201, 161, 218, 37, 176, 35, 170, 50, 90, 148, 102, 191, 199, 239, 174, 78, 72, 67, 85, 199, 45, 149, 145, 132, 161, 212, 33, 157, 75, 216, 79, 39, 233, 18, 210, 255, 26, 72, 229, 239, 44, 12, 147, 158, 176, 192, 95, 126, 32, 175, 23, 226, 131, 139, 197, 175, 193, 62, 8, 151, 252, 68, 154, 94, 89, 189, 125, 90, 30, 36, 175, 73, 230, 194, 13, 233, 247, 123, 60, 241, 47, 171, 51, 189, 112, 111, 213, 141, 89, 70, 249, 236, 63, 236, 110, 115, 208]};\n*/\n\n\n/* harmony default export */ var cryptoManager_CryptoManager = (new CryptoManager_CryptoManager());\n// EXTERNAL MODULE: ./node_modules/path-browserify/index.js\nvar path_browserify = __webpack_require__(286);\n\n// CONCATENATED MODULE: ./src/runtime/Loader.js\nfunction Loader_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Loader_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Loader_createClass(Constructor, protoProps, staticProps) { if (protoProps) Loader_defineProperties(Constructor.prototype, protoProps); if (staticProps) Loader_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar Loader_log = loglevel[\"getLogger\"]('Loader');\n\n\n\n\nvar Loader_Loader =\n/*#__PURE__*/\nfunction () {\n function Loader(runtimeURL, runtimeConfiguration, runtimeDescriptorsInstance) {\n Loader_classCallCheck(this, Loader);\n\n if (!runtimeConfiguration) throw Error('[Runtime.Loader] The descriptor need to know the runtime configuration');\n if (!runtimeDescriptorsInstance) throw Error('[Runtime.Loader] The descriptor need to know the runtime Descriptor instance');\n this.log = Loader_log;\n this.runtimeConfiguration = runtimeConfiguration;\n this.descriptors = runtimeDescriptorsInstance;\n }\n /**\n * Set runtime url\n * @param {string} value runtimeURL\n */\n\n\n Loader_createClass(Loader, [{\n key: \"loadHyperty\",\n\n /**\n * Deploy Hyperty from Catalogue URL\n *\n * @see https://github.com/reTHINK-project/specs/tree/master/datamodel/core/address\n *\n * @param {URL.HypertyCatalogueURL} hypertyCatalogueURL - The Catalogue URL used to identify descriptors in the Catalogue.\n * @param {boolean|URL.HypertyURL} [reuseURL=false] reuseURL - reuseURL is used to reuse the hypertyURL previously registred, by default the reuse is disabled;\n * @param {URL} appURL - the app url origin address;\n * @param {object} IdpConstraint - constraints to be used when selecting the identity to be associated with the Hyperty including origin, idp, and idHint.\n * @returns {Promise} this is Promise and returns true if all components are loaded with success or an error if someone fails.\n *\n * @memberOf Loader\n */\n value: function loadHyperty(hypertyClass) {\n var _this = this;\n\n var reuseURL = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var IdpConstraint = arguments.length > 2 ? arguments[2] : undefined;\n var appURL = arguments.length > 3 ? arguments[3] : undefined;\n if (!this._readyToUse()) return false;\n if (!hypertyClass) throw new Error('[Runtime.Loader] hypertyClass parameter is needed');\n\n var _hypertyURL;\n\n var _hypertySandbox;\n\n var _hypertySourcePackage;\n\n var haveError = false;\n var instance = new hypertyClass();\n var hyperty = instance.name;\n return new Promise(function (resolve, reject) {\n var errorReason = function errorReason(reason) {\n Loader_log.info('[Runtime.Loader] Something failed on the deploy hyperty: ', reason);\n reject(reason);\n };\n\n var handleError = function handleError(reason) {\n haveError = true;\n reject(reason);\n };\n\n Loader_log.info('[Runtime.Loader.loadHyperty] ', hyperty);\n var _hypertyDescriptor = instance.descriptor;\n _hypertyDescriptor.dataObjects[0] = _hypertyDescriptor.dataObjects[0].replace('%domain%', _this._registry._domain); // at this point, we have completed \"step 2 and 3\" as shown in https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md\n\n Loader_log.info('[Runtime.Loader] 1: return hyperty descriptor: ', _hypertyDescriptor);\n _hypertySandbox = _this.registry.getAppSandbox();\n var numberOfAddresses = 1; //debugger;\n\n _this._addressAllocation.create(_this._registry._domain, numberOfAddresses, _hypertyDescriptor, 'hyperty', reuseURL).then(function (addresses) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 6: return the addresses for the hyperty', addresses); // Register hyperty\n\n return _this.registry.registerHyperty(_hypertySandbox, hyperty, _hypertyDescriptor, addresses, IdpConstraint);\n }, handleError).then(function (registrationResult) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 7: registration result', registrationResult); // we have completed step 16 of https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md right now.\n\n _hypertyURL = registrationResult.url; // Extend original hyperty configuration;\n\n var configuration = {};\n\n if (!emptyObject(_hypertyDescriptor.configuration)) {\n try {\n configuration = Object.assign({}, JSON.parse(_hypertyDescriptor.configuration));\n } catch (e) {\n configuration = _hypertyDescriptor.configuration;\n }\n }\n\n configuration.runtimeURL = _this._runtimeURL;\n\n if (registrationResult.p2pHandler) {\n configuration.p2pHandler = registrationResult.p2pHandler;\n configuration.p2pRequester = registrationResult.p2pRequester;\n } // We will deploy the component - step 17 of https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md right now.\n\n\n try {\n // return _hypertySandbox.deployComponent(_hypertySourcePackage.sourceCode, _hypertyURL, configuration);\n return _hypertySandbox.deployComponent(instance, _hypertyURL, configuration);\n } catch (e) {\n Loader_log.info('[Runtime.Loader] Error on deploy component:', e);\n reject(e);\n }\n }, handleError).then(function (deployComponentStatus) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 8: Deploy component status for hyperty: ', deployComponentStatus); // we have completed step 19 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md right now.\n // Add the message bus listener to the appSandbox or hypertSandbox;\n\n _this.messageBus.addListener(_hypertyURL, function (msg) {\n _hypertySandbox.postMessage(msg);\n }); // Add the message bus listener to the appSandbox or hypertSandbox;\n\n\n _this.messageBus.addListener(_this.runtimeURL + '/status', function (msg) {\n _hypertySandbox.postMessage(msg);\n }); // we have completed step 20 of https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md right now.\n\n\n var deployed = {\n runtimeHypertyURL: _hypertyURL,\n status: deployComponentStatus,\n name: hyperty,\n instance: instance\n };\n Loader_log.info('[Runtime.Loader] Hyperty deployed: ', deployed);\n resolve(instance); // we have completed step 21 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-hyperty.md right now.\n\n Loader_log.info('[Runtime.Loader] ------------------ END ------------------------');\n }, handleError).catch(errorReason);\n });\n }\n /**\n * Deploy Stub from Catalogue URL or domain url\n * @param {URL.URL} protostubURL Catalogue URL for the ProtoStub to be loaded or the domain to be target by the protostub\n * @param {Object} p2pConfig configuration of p2p\n */\n\n }, {\n key: \"loadStub\",\n value: function loadStub(protostubURL, p2pConfig) {\n var _this2 = this;\n\n if (!this._readyToUse()) return false;\n if (!protostubURL) throw new Error('[Runtime.Loader.loadStub]ProtoStub descriptor url parameter is needed');\n return new Promise(function (resolve, reject) {\n // to analyse if domain for p2pHandlers should be something else and not the default domain itself\n var domain = divideURL(protostubURL).domain;\n\n if (!domain) {\n domain = protostubURL;\n }\n\n var _stubSandbox;\n\n var _stubDescriptor;\n\n var _runtimeProtoStubURL;\n\n var _stubSourcePackage;\n\n var haveError = false;\n var stubId;\n\n var errorReason = function errorReason(reason) {\n Loader_log.info('[Runtime.Loader.loadStub]Something failed on the deploy of protocolstub: ', reason);\n reject(reason);\n };\n\n var handleError = function handleError(reason) {\n haveError = true;\n reject(reason);\n }; // Discover Protocol Stub\n\n\n var discoverStub;\n var isP2PHandler = false;\n var isP2PRequester = false;\n var stubCapabilities = {};\n Loader_log.info('[Runtime.Loader.loadStub] starting loading for ', protostubURL, ' with p2pconfig ', p2pConfig);\n Loader_log.info('[Runtime.Loader.loadStub]Discover or Create a new ProtoStub for domain: ', domain); // step 2 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n try {\n if (p2pConfig) {\n if (p2pConfig.hasOwnProperty('isHandlerStub') && p2pConfig.isHandlerStub) {\n // step 6 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n isP2PHandler = true;\n stubId = _this2.runtimeURL;\n discoverStub = _this2.registry.discoverP2PStub();\n } else {\n isP2PRequester = true;\n var p2pHandlerRuntimeURL = p2pConfig.remoteRuntimeURL;\n stubId = p2pHandlerRuntimeURL; // step 4 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n // step 5 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n discoverStub = _this2.registry.discoverP2PStub(p2pHandlerRuntimeURL);\n }\n } else {\n // step 3 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n stubId = domain;\n discoverStub = _this2.registry.discoverProtostub(domain);\n } // Is registed?\n\n\n Loader_log.info('[Runtime.Loader.loadStub]1. Proto Stub Discovered for ', protostubURL, ': ', discoverStub); // step 23 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n resolve(discoverStub);\n Loader_log.info(' [Runtime.Loader]------------------- END ---------------------------\\n');\n } catch (reason) {\n // is not registed?\n Loader_log.info('[Runtime.Loader.loadStub]1. Proto Stub not found ' + reason); // step 8 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _this2.descriptors.getStubDescriptor(protostubURL).then(function (stubDescriptor) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader.loadStub]2. return the ProtoStub descriptor'); // step 9 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _stubDescriptor = stubDescriptor;\n var sourcePackageURL = stubDescriptor.sourcePackageURL;\n\n if (sourcePackageURL === '/sourcePackage') {\n return stubDescriptor.sourcePackage;\n } // step 10 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n\n return _this2.runtimeCatalogue.getSourcePackageFromURL(sourcePackageURL);\n }, handleError).catch(errorReason).then(function (stubSourcePackage) {\n if (haveError) return false; // According to debug, it seems RuntimeCatalogue does not support yet constraints. It appears empty!!!!\n\n if (_stubDescriptor && _stubDescriptor.constraints) {\n stubCapabilities = _stubDescriptor.constraints;\n } // step 11 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n\n Loader_log.info('[Runtime.Loader.loadStub]3. return the ProtoStub Source Code');\n _stubSourcePackage = stubSourcePackage; // this will return the sandbox or one promise to getSandbox;\n // step 12 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n return _this2.registry.getSandbox(domain, stubCapabilities);\n }).then(function (stubSandbox) {\n if (haveError) return false; // step 15 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n Loader_log.info('[Runtime.Loader.loadStub]4. if the sandbox is registered then return the sandbox ', stubSandbox);\n _stubSandbox = stubSandbox;\n return stubSandbox;\n }).catch(function (reason) {\n if (haveError) return false; // step 13 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n Loader_log.info('[Runtime.Loader.loadStub]5. Sandbox was not found, creating a new one ', reason); // check if the sandbox is registed for this stub descriptor url;\n // step 14 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n return _this2._runtimeFactory.createSandbox(stubCapabilities).then(function (sandbox) {\n sandbox.addListener('*', function (msg) {\n _this2.messageBus.postMessage(msg);\n });\n return sandbox;\n });\n }).then(function (sandbox) {\n if (haveError) return false; // step 16 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n Loader_log.info('[Runtime.Loader.loadStub]6. return the sandbox instance and register', sandbox, 'to domain ', domain);\n _stubSandbox = sandbox; // we need register stub on registry - step xxx https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n return _this2.registry.registerStub(_stubSandbox, stubId, p2pConfig, protostubURL, _stubDescriptor);\n }, handleError).then(function (runtimeProtoStub) {\n if (haveError) return false; // step 23 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n Loader_log.info('[Runtime.Loader.loadStub] 7. return the runtime protostub url: ', runtimeProtoStub);\n _runtimeProtoStubURL = runtimeProtoStub.url; // Extend original hyperty configuration;\n\n var configuration = {};\n\n if (!emptyObject(_stubDescriptor.configuration)) {\n try {\n configuration = Object.assign({}, JSON.parse(_stubDescriptor.configuration));\n } catch (e) {\n configuration = _stubDescriptor.configuration;\n }\n }\n\n if (p2pConfig) {\n try {\n configuration = Object.assign(configuration, JSON.parse(p2pConfig));\n } catch (e) {\n configuration = Object.assign(configuration, p2pConfig);\n }\n } // required for protostub session\n\n\n configuration.runtimeURL = _this2._runtimeURL; // step 24 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n try {\n // step 26 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n Loader_log.info('[Runtime.Loader.loadStub] 8: adding sandbox listener to protostubURL : ', _runtimeProtoStubURL); // step 27 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n // Add the message bus listener\n\n _this2.messageBus.addListener(_runtimeProtoStubURL, function (msg) {\n _stubSandbox.postMessage(msg);\n });\n\n return _stubSandbox.deployComponent(_stubSourcePackage.sourceCode, _runtimeProtoStubURL, configuration);\n } catch (e) {\n Loader_log.error('[Runtime.Loader.loadStub] Error on deploy component:', e);\n reject(e);\n }\n }, handleError).then(function () {\n if (haveError) return false; // step 28 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n var stub;\n\n if (p2pConfig) {\n Loader_log.log('[Runtime.Loader.loadStub] p2pConfig: ', p2pConfig);\n if (p2pConfig.hasOwnProperty('isHandlerStub')) stub = _this2.registry.p2pHandlerStub[_this2._runtimeURL];\n if (p2pConfig.hasOwnProperty('p2pRequesterStub')) stub = _this2.registry.p2pRequesterStub[p2pConfig.remoteRuntimeURL];\n } else {\n stub = _this2.registry.protostubsList[domain];\n }\n\n Loader_log.log('[Runtime.Loader.loadStub] Stub: ', stub);\n resolve(stub);\n Loader_log.info('[Runtime.Loader.loadStub]------------------- END ---------------------------\\n');\n }, handleError).catch(errorReason);\n }\n });\n }\n /**\n * Deploy idpProxy from Catalogue URL or domain url\n * @param {URL.URL} domain domain\n */\n\n }, {\n key: \"loadIdpProxy\",\n value: function loadIdpProxy(idpProxyURL) {\n var _this3 = this;\n\n if (!this._readyToUse()) return false;\n if (!idpProxyURL) throw new Error('[Runtime.Loader] IdpProxy descriptor url parameter is needed');\n return new Promise(function (resolve, reject) {\n var domain = divideURL(idpProxyURL).domain;\n\n if (!domain) {\n domain = idpProxyURL;\n }\n\n var _proxySandbox;\n\n var _proxyDescriptor;\n\n var _runtimeIdpProxyURL;\n\n var _proxySourcePackage;\n\n var haveError = false;\n\n var errorReason = function errorReason(reason) {\n Loader_log.info('[Runtime.Loader] Something failed on the deploy of IdpProxy: ', reason);\n reject(reason);\n };\n\n var handleError = function handleError(reason) {\n haveError = true;\n reject(reason);\n }; // Discover IDPProxy\n\n\n Loader_log.info('[Runtime.Loader] ------------------- IDP Proxy Deploy ---------------------------\\n');\n Loader_log.info('[Runtime.Loader] Discover or Create a new IdpProxy for domain/URL: ', domain);\n\n try {\n var runtimeIdpProxyURL = _this3.registry.discoverIdpProxy(domain); // Is registed?\n\n\n Loader_log.info('[Runtime.Loader] 1. IDPProxy Discovered: ', runtimeIdpProxyURL); // we have completed step 2 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n var idpProxy = _this3.registry.idpProxyList[domain];\n Loader_log.log('Deployed: ', idpProxy);\n resolve(idpProxy);\n Loader_log.info('[Runtime.Loader] ------------------- END ---------------------------\\n');\n } catch (reason) {\n // is not registed?\n Loader_log.info('[Runtime.Loader] 1. IdpProxy not found:', reason); // we have completed step 3 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n // we need to get ProtoStub descriptor step 4 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _this3.descriptors.getIdpProxyDescriptor(idpProxyURL).then(function (proxyDescriptor) {\n Loader_log.info('[Runtime.Loader] 2. Return the IDPProxy descriptor'); // we have completed step 5 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _proxyDescriptor = proxyDescriptor;\n var sourcePackageURL = proxyDescriptor.sourcePackageURL;\n\n if (sourcePackageURL === '/sourcePackage') {\n return proxyDescriptor.sourcePackage;\n } // we need to get ProtoStub Source code from descriptor - step 6 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n\n return _this3.runtimeCatalogue.getSourcePackageFromURL(sourcePackageURL);\n }, handleError).then(function (sourcePackage) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 3. return the IDPProxy source package'); // we have completed step 7 https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _proxySourcePackage = sourcePackage; // TODO: Check on PEP (policy Engine) if we need the sandbox and check if the Sandbox Factory have the context sandbox;\n\n var policy = true;\n return policy;\n }, handleError).then(function (policy) {\n if (haveError) return false; // this will return the sandbox or one promise to getSandbox;\n\n return _this3.registry.getSandbox(domain);\n }).then(function (proxySandbox) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 4. if the sandbox is registered then return the sandbox', proxySandbox);\n _proxySandbox = proxySandbox;\n return proxySandbox;\n }).catch(function (reason) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 5. Sandbox was not found, creating a new one', reason);\n var proxyCapabilities = {};\n\n if (_proxyDescriptor && _proxyDescriptor.hasOwnProperty('capabilities')) {\n _proxyDescriptor = _proxyDescriptor.stubCapabilities;\n }\n\n return _this3._runtimeFactory.createSandbox(proxyCapabilities).then(function (sandbox) {\n sandbox.addListener('*', function (msg) {\n _this3.messageBus.postMessage(msg);\n });\n return sandbox;\n });\n }).then(function (sandbox) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 6. return the sandbox instance and register', sandbox, 'to domain ', domain);\n _proxySandbox = sandbox; // we need register stub on registry - step xxx https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n return _this3.registry.registerIdpProxy(sandbox, domain);\n }, handleError).then(function (runtimeIdpProxyURL) {\n if (haveError) return false;\n Loader_log.info('[Runtime.Loader] 7. Return the runtime Idp Proxy URL: ', runtimeIdpProxyURL); // we have completed step xxx https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n\n _runtimeIdpProxyURL = runtimeIdpProxyURL; // Extend original hyperty configuration;\n\n var configuration = {};\n\n if (!emptyObject(_proxyDescriptor.configuration)) {\n try {\n configuration = Object.assign({}, JSON.parse(_proxyDescriptor.configuration));\n } catch (e) {\n configuration = _proxyDescriptor.configuration;\n }\n }\n\n configuration.runtimeURL = _this3._runtimeURL; // Deploy Component step xxx\n\n try {\n // we have completed step xxx https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n // Add the message bus listener\n _this3.messageBus.addListener(_runtimeIdpProxyURL, function (msg) {\n _proxySandbox.postMessage(msg);\n });\n\n return _proxySandbox.deployComponent(_proxySourcePackage.sourceCode, runtimeIdpProxyURL, configuration);\n } catch (e) {\n Loader_log.info('[Runtime.Loader] Error on deploy component:', e);\n reject(e);\n }\n }, handleError).then(function () {\n if (haveError) return false; // we have completed step xxx https://github.com/reTHINK-project/core-framework/blob/master/docs/specs/runtime/dynamic-view/basics/deploy-protostub.md\n // Load Stub function resolved with success;\n // let idpProxy = {\n // runtimeIdpProxyURL: _runtimeIdpProxyURL,\n // status: deployComponentStatus\n // };\n //this.registry.idpProxyList[domain].status = 'deployed';\n\n var idpProxy = _this3.registry.idpProxyList[domain];\n Loader_log.log('[Runtime.Loader.loadIdpProxy] 8: loaded: ', idpProxy);\n resolve(idpProxy);\n Loader_log.info('[Runtime.Loader.loadIdpProxy] ------------------- END ---------------------------\\n');\n }, handleError).catch(errorReason);\n }\n });\n } // Check if the loader is ready to load all components\n\n }, {\n key: \"_readyToUse\",\n value: function _readyToUse() {\n var status = false;\n if (!this._runtimeURL) throw new Error('[Runtime.Loader] The loader need the runtime url address');\n if (!this._messagesBus) throw new Error('[Runtime.Loader] The loader need the messageBus component');\n if (!this._registry) throw new Error('[Runtime.Loader] The loader need the registry component');\n if (!this._runtimeFactory) throw new Error('[Runtime.Loader] The loader need the runtime factory component');\n status = true;\n return status;\n }\n }, {\n key: \"runtimeURL\",\n set: function set(value) {\n this._runtimeURL = value;\n }\n /**\n * Get runtime url\n * @return {string} value runtimeURL\n */\n ,\n get: function get() {\n return this._runtimeURL;\n }\n /**\n * Set Registry component\n * @param {Registry} value Registry Component\n */\n\n }, {\n key: \"registry\",\n set: function set(value) {\n this._registry = value; // Install AddressAllocation\n\n var addressAllocation = allocation_AddressAllocation.instance;\n this._addressAllocation = addressAllocation;\n Loader_log.log('[Loader - AddressAllocation] - ', addressAllocation);\n }\n /**\n * Get Registry component\n * @return {Registry} Registry component\n */\n ,\n get: function get() {\n return this._registry;\n }\n /**\n * Set Message Bus component\n * @param {MessageBus} value Message bus component\n */\n\n }, {\n key: \"messageBus\",\n set: function set(value) {\n this._messagesBus = value;\n }\n /**\n * Get Message Bus component\n * @return {MessageBus} Message Bus component\n */\n ,\n get: function get() {\n return this._messagesBus;\n }\n /**\n * Set Runtime Factory component\n * @param {runtimeFactory} value Factory includes the specific implementations for each environment\n */\n\n }, {\n key: \"runtimeFactory\",\n set: function set(value) {\n this._runtimeFactory = value;\n }\n /**\n * Get Runtime Factory component\n * @return {runtimeFactory} Runtime Factory component\n */\n ,\n get: function get() {\n return this._runtimeFactory;\n }\n }]);\n\n return Loader;\n}();\n\n/* harmony default export */ var runtime_Loader = (Loader_Loader);\n// CONCATENATED MODULE: ./src/runtime/Storage.js\n\nvar storages = {};\nfunction Storage_storage(runtimeFactory, runtimeStatusUpdate) {\n if (!runtimeFactory) throw new Error('The runtime factory is a needed parameter');\n console.log('[Storage.storage] storageSchemas ', runtimeConfiguration_runtimeConfiguration.storageSchemas);\n Object.keys(runtimeConfiguration_runtimeConfiguration.storageSchemas).forEach(function (key) {\n if (!storages.hasOwnProperty(key)) {\n storages[key] = runtimeFactory.storageManager(key, runtimeConfiguration_runtimeConfiguration.storageSchemas[key], runtimeStatusUpdate);\n }\n });\n return storages;\n}\nfunction createSyncDB(key, runtimeFactory, schema, runtimeStatusUpdate) {\n var url = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n if (!runtimeFactory) throw new Error('The runtime factory is a needed parameter');\n var remote = url ? url : runtimeConfiguration_runtimeConfiguration.remoteStorage;\n return runtimeFactory.storageManager(key, schema, runtimeStatusUpdate, remote);\n}\n// CONCATENATED MODULE: ./src/runtime/Descriptors.js\nfunction Descriptors_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Descriptors_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Descriptors_createClass(Constructor, protoProps, staticProps) { if (protoProps) Descriptors_defineProperties(Constructor.prototype, protoProps); if (staticProps) Descriptors_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\nvar Descriptors_log = loglevel[\"getLogger\"]('Descriptors');\n\nvar Descriptors_Descriptors =\n/*#__PURE__*/\nfunction () {\n function Descriptors(runtimeURL, catalogue, runtimeConfiguration) {\n Descriptors_classCallCheck(this, Descriptors);\n\n if (!runtimeURL) throw Error('The descriptor need to know the runtime url to be used');\n if (!catalogue) throw Error('The descriptor needs the catalogue instance');\n if (!runtimeConfiguration) throw Error('The descriptor needs the runtime configuration');\n this.log = Descriptors_log;\n this.runtimeConfiguration = runtimeConfiguration;\n this.runtimeURL = runtimeURL;\n this.catalogue = catalogue;\n this.constraints = runtimeUtils.runtimeCapabilities;\n }\n\n Descriptors_createClass(Descriptors, [{\n key: \"getHypertyDescriptor\",\n value: function getHypertyDescriptor(hypertyURL) {\n return this.catalogue.getHypertyDescriptor(hypertyURL, true, this.constraints);\n }\n }, {\n key: \"getStubDescriptor\",\n value: function getStubDescriptor(stubURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var domain;\n var protostub;\n var protoStubURL;\n var originDividedURL = divideURL(_this.runtimeURL);\n var originDomain = originDividedURL.domain;\n\n if (stubURL.includes('://')) {\n var dividedURL = divideURL(stubURL);\n domain = dividedURL.domain;\n var path = dividedURL.identity;\n\n if (path) {\n protostub = path.substring(path.lastIndexOf('/') + 1);\n } else {\n protostub = 'default';\n }\n } else {\n protostub = 'default';\n domain = stubURL;\n }\n\n protoStubURL = buildURL(_this.runtimeConfiguration, 'catalogueURLs', 'protocolstub', protostub);\n\n if (domain !== _this.runtimeConfiguration.domain) {\n if (!stubURL.indexOf('https') || !stubURL.indexOf('hyperty-catalogue')) {\n protoStubURL = stubURL;\n } else {\n // TODO: check how to load form different configuration domain\n var resource = getConfigurationResources(_this.runtimeConfiguration, 'catalogueURLs', 'protocolstub');\n protoStubURL = resource.prefix + domain + resource.suffix + protostub;\n }\n }\n\n Descriptors_log.log('Load ProtocolStub for domain, ' + domain + ' : ', protoStubURL);\n return _this.catalogue.getStubDescriptor(protoStubURL, true, _this.constraints).then(function (result) {\n resolve(result);\n }).catch(function (error) {\n // log.log('Error: ', error);\n protostub = domain;\n domain = originDomain;\n var resource = getConfigurationResources(_this.runtimeConfiguration, 'catalogueURLs', 'protocolstub');\n protoStubURL = resource.prefix + domain + resource.suffix + protostub; // log.log('Fallback -> Load Protocolstub for domain, ' + domain + ' : ', protostub);\n\n return _this.catalogue.getStubDescriptor(protoStubURL, true, _this.constraints);\n }).then(function (result) {\n resolve(result);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"getIdpProxyDescriptor\",\n value: function getIdpProxyDescriptor(idpProxyURL) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n var domain;\n var idpproxy;\n var originDividedURL = divideURL(_this2.runtimeURL);\n var originDomain = originDividedURL.domain;\n var constraints = _this2.constraints;\n constraints.constraints.onlyAccessToken = true;\n constraints.constraints.onlyIdAssertionValidation = true;\n console.log('LOG HERE', constraints);\n\n if (idpProxyURL.includes('://')) {\n var dividedURL = divideURL(idpProxyURL);\n domain = dividedURL.domain;\n var path = dividedURL.identity;\n\n if (path) {\n idpproxy = path.substring(path.lastIndexOf('/') + 1);\n } else {\n idpproxy = 'default';\n }\n } else {\n idpproxy = 'default';\n domain = idpProxyURL;\n }\n\n var resource = getConfigurationResources(_this2.runtimeConfiguration, 'catalogueURLs', 'idpProxy');\n idpProxyURL = resource.prefix + domain + resource.suffix + idpproxy; // log.log('Load Idp Proxy for domain, ' + domain + ' : ', idpProxyURL);\n\n return _this2.catalogue.getIdpProxyDescriptor(idpProxyURL, true, constraints).then(function (result) {\n resolve(result);\n }).catch(function () {\n idpproxy = domain;\n domain = originDomain;\n idpProxyURL = buildURL(_this2.runtimeConfiguration, 'catalogueURLs', 'idpProxy', idpproxy); // log.log('Load Idp Proxy for domain, ' + domain + ' : ', idpProxyURL);\n\n return _this2.catalogue.getIdpProxyDescriptor(idpProxyURL, true, constraints);\n }).then(function (result) {\n resolve(result);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }]);\n\n return Descriptors;\n}();\n\n/* harmony default export */ var runtime_Descriptors = (Descriptors_Descriptors);\n// CONCATENATED MODULE: ./src/runtime/MsgBusHandlers.js\nfunction MsgBusHandlers_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction MsgBusHandlers_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction MsgBusHandlers_createClass(Constructor, protoProps, staticProps) { if (protoProps) MsgBusHandlers_defineProperties(Constructor.prototype, protoProps); if (staticProps) MsgBusHandlers_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n * Class where message bus handlers are built. To be used by the RuntimeUA to initialise the runtime UA.\n */\n//import { log as logLevels } from '../logLevels';\n// Log System\n\nvar MsgBusHandlers_log = loglevel[\"getLogger\"]('RuntimeUA');\n\nvar MsgBusHandlers =\n/*#__PURE__*/\nfunction () {\n function MsgBusHandlers(pep, idm, crypto) {\n MsgBusHandlers_classCallCheck(this, MsgBusHandlers);\n\n if (!pep) throw Error('[MsgBusHandlers] pep input paramenter is mandatory');\n if (!idm) throw Error('[MsgBusHandlers] idm input paramente is mandatory');\n if (!crypto) throw Error('[MsgBusHandlers] crypto input paramente is mandatory');\n this.policyEngine = pep;\n this.identityManager = idm;\n this.cryptoManager = crypto;\n } // Policy based access control for incoming messages\n\n\n MsgBusHandlers_createClass(MsgBusHandlers, [{\n key: \"pepInHandler\",\n get: function get() {\n var _this = this;\n\n return function (ctx) {\n _this.policyEngine.authorise(ctx.msg, true).then(function (changedMgs) {\n ctx.msg = changedMgs;\n ctx.next();\n }).catch(function (reason) {\n MsgBusHandlers_log.error(reason);\n ctx.fail(reason);\n });\n };\n } // Policy based access control for outgoing messages\n\n }, {\n key: \"pepOutHandler\",\n get: function get() {\n var _this = this;\n\n return function (ctx) {\n _this.policyEngine.authorise(ctx.msg, false).then(function (changedMgs) {\n ctx.msg = changedMgs;\n ctx.next();\n }).catch(function (reason) {\n MsgBusHandlers_log.error(reason);\n ctx.fail(reason);\n });\n };\n } // Add Identity info to messages\n\n }, {\n key: \"idmHandler\",\n get: function get() {\n var _this = this;\n\n return function (ctx) {\n _this.identityManager.processMessage(ctx.msg).then(function (changedMgs) {\n ctx.msg = changedMgs;\n ctx.next();\n }).catch(function (reason) {\n MsgBusHandlers_log.error(reason);\n ctx.fail(reason);\n });\n };\n } // encrypt messages\n\n }, {\n key: \"encryptHandler\",\n get: function get() {\n var _this = this;\n\n return function (ctx) {\n _this.cryptoManager.encryptMessage(ctx.msg).then(function (changedMgs) {\n ctx.msg = changedMgs;\n ctx.next();\n }).catch(function (reason) {\n MsgBusHandlers_log.error(reason);\n ctx.fail(reason);\n });\n };\n } // decrypt messages\n\n }, {\n key: \"decryptHandler\",\n get: function get() {\n var _this = this;\n\n return function (ctx) {\n _this.cryptoManager.decryptMessage(ctx.msg).then(function (changedMgs) {\n ctx.msg = changedMgs;\n ctx.next();\n }).catch(function (reason) {\n MsgBusHandlers_log.warn(reason);\n ctx.fail(reason);\n });\n };\n }\n }]);\n\n return MsgBusHandlers;\n}();\n\n/* harmony default export */ var runtime_MsgBusHandlers = (MsgBusHandlers);\n// CONCATENATED MODULE: ./src/discovery/CoreDiscovery.js\nfunction CoreDiscovery_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction CoreDiscovery_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CoreDiscovery_createClass(Constructor, protoProps, staticProps) { if (protoProps) CoreDiscovery_defineProperties(Constructor.prototype, protoProps); if (staticProps) CoreDiscovery_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar CoreDiscovery_log = loglevel[\"getLogger\"]('CoreDiscovery');\n\n/**\n* Core Discovery interface\n* Class to allow applications to search for hyperties and DataObjects using the message bus\n*/\n\nvar CoreDiscovery_CoreDiscovery =\n/*#__PURE__*/\nfunction () {\n /**\n * To initialise the Discovery, which will provide the support for hyperties to\n * query users registered in outside the internal core.\n * @param {MessageBus} msgbus msgbus\n * @param {RuntimeURL} runtimeURL runtimeURL\n * @param {graphConnector} graphConnector\n */\n function CoreDiscovery(runtimeURL, msgBus, graphConnector, runtimeFactory, registry) {\n CoreDiscovery_classCallCheck(this, CoreDiscovery);\n\n if (!runtimeFactory) throw Error('The catalogue needs the runtimeFactory');\n\n var _this = this;\n\n this._messageBus = msgBus;\n _this.graphConnector = graphConnector;\n _this.httpRequest = runtimeFactory.createHttpRequest();\n _this.domain = divideURL(runtimeURL).domain;\n _this.discoveryURL = runtimeURL + '/discovery/';\n _this.registry = registry;\n\n _this.messageBus.addListener(_this.discoveryURL, function (msg) {\n _this.discoveryManager(msg).then(function (result) {\n //FLOW-OUT: message response\n _this.messageBus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n value: result\n }\n });\n }).catch(function (err) {\n var description;\n var code;\n\n if (err === 'GraphConnector') {\n description = 'This search is not available at the moment. Try later.';\n code = 500;\n } else {\n description = 'Not Found';\n code = 404;\n } //FLOW-OUT: error message response\n\n\n _this.messageBus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: code,\n description: description\n }\n });\n });\n });\n }\n /**\n * Returns the MessageBus.\n */\n\n\n CoreDiscovery_createClass(CoreDiscovery, [{\n key: \"discoveryManager\",\n\n /* function to decide what discovery method to call and later return the response msg */\n value: function discoveryManager(msg) {\n var _this = this;\n\n var domain = divideURL(msg.from).domain;\n var atributes = msg.body.resource.split('/').filter(Boolean);\n var resources = [];\n var dataSchemes = [];\n CoreDiscovery_log.log('[CoreDiscovery.discoveryManager] received: ', msg);\n\n if (msg.body.criteria) {\n if (msg.body.criteria.resources) {\n resources = msg.body.criteria.resources;\n }\n\n if (msg.body.criteria.dataSchemes) {\n dataSchemes = msg.body.criteria.dataSchemes;\n }\n }\n\n switch (atributes[1]) {\n case 'user':\n if (atributes[0] == 'hyperty') {\n return _this.discoverHyperties(msg.body.resource.split('user/')[1], dataSchemes, resources, msg.body.criteria.domain);\n } else {\n return _this.discoverDataObjects(msg.body.resource.split('user/')[1], dataSchemes, resources, msg.body.criteria.domain);\n }\n\n break;\n\n case 'url':\n if (atributes[0] == 'hyperty') {\n return _this.discoverHypertyPerURL(msg.body.resource.split('url/')[1], msg.body.criteria.domain);\n } else {\n return _this.discoverDataObjectPerURL(msg.body.resource.split('url/')[1], msg.body.criteria.domain);\n }\n\n break;\n\n case 'name':\n return _this.discoverDataObjectsPerName(msg.body.resource.split('name/')[1], dataSchemes, resources, msg.body.criteria.domain);\n break;\n\n case 'reporter':\n return _this.discoverDataObjectsPerReporter(msg.body.resource.split('reporter/')[1], dataSchemes, resources, msg.body.criteria.domain);\n break;\n\n case 'guid':\n if (typeof _this.graphConnector !== 'undefined' && _this.graphConnector !== null) {\n if (atributes[0] == 'hyperty') {\n return _this.discoverHypertiesPerGUID(msg.body.resource.split('user-guid://')[1], dataSchemes, resources);\n } else {\n return _this.discoverDataObjectsPerGUID(msg.body.resource.split('user-guid://')[1], dataSchemes, resources);\n }\n\n break;\n } else {\n return Promise.reject('GraphConnector');\n break;\n }\n\n case 'userprofile':\n if (typeof _this.graphConnector !== 'undefined' && _this.graphConnector !== null) {\n if (atributes[0] == 'hyperty') {\n return _this.discoverHypertiesPerUserProfileData(msg.body.resource.split('userprofile/')[1], dataSchemes, resources);\n } else {\n return _this.discoverDataObjectsPerUserProfileData(msg.body.resource.split('userprofile/')[1], dataSchemes, resources);\n }\n\n break;\n } else {\n return Promise.reject('GraphConnector');\n break;\n }\n\n }\n }\n /**\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\n * @param {String} userIdentifier\n * @param {Array} dataSchemes (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n */\n\n }, {\n key: \"discoverHypertiesPerUserProfileData\",\n value: function discoverHypertiesPerUserProfileData(userIdentifier, dataSchemes, resources) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //translate user identifier (e.g. email, name...) into the associated GUIDs\n _this.discoverGUIDPerUserIdentifier(userIdentifier).then(function (guids) {\n var hypertiesPromises = guids.map(function (guid) {\n return new Promise(function (resolve, reject) {\n _this.discoverHypertiesPerGUID(guid, dataSchemes, resources).then(function (hyperties) {\n resolve(hyperties);\n }).catch(function (err) {\n resolve([]);\n });\n });\n });\n Promise.all(hypertiesPromises).then(function (hypertiesResult) {\n var hyperties = [].concat.apply([], hypertiesResult);\n\n if (hyperties.length === 0) {\n return reject('No hyperties were found');\n }\n\n resolve(hyperties);\n });\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /**\n * Advanced Search for DataObjects registered in domain registry associated with some user identifier (eg email, name ...)\n * @param {String} userIdentifier\n * @param {Array} dataSchemes (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n */\n\n }, {\n key: \"discoverDataObjectsPerUserProfileData\",\n value: function discoverDataObjectsPerUserProfileData(userIdentifier, dataSchemes, resources) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //translate user identifier (e.g. email, name...) into the associated GUIDs\n _this.discoverGUIDPerUserIdentifier(userIdentifier).then(function (guids) {\n var dataObjectsPromises = guids.map(function (guid) {\n return new Promise(function (resolve, reject) {\n _this.discoverDataObjectsPerGUID(guid, dataSchemes, resources).then(function (dataObjects) {\n resolve(dataObjects);\n }).catch(function (err) {\n resolve([]);\n });\n });\n });\n Promise.all(dataObjectsPromises).then(function (dataObjectsResult) {\n var dataObjects = [].concat.apply([], dataObjectsResult);\n\n if (dataObjects.length === 0) {\n return reject('No dataObjects were found');\n }\n\n resolve(dataObjects);\n });\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /**\n * Advanced Search for Hyperties registered in domain registry associated with some GUID\n * @param {String} guid\n * @param {Array} dataSchemes (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n */\n\n }, {\n key: \"discoverHypertiesPerGUID\",\n value: function discoverHypertiesPerGUID(guid, dataSchemes, resources) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //translate GUID into the user IDs to query the domain registry\n _this.discoverUserIdsPerGUID(guid).then(function (uids) {\n //translate user IDs into the associated hyperties registered in some domain\n var hypertiesPromises = uids.map(function (uid) {\n return new Promise(function (resolve, reject) {\n _this.discoverHyperties(uid.uID, dataSchemes, resources, uid.domain).then(function (hyperties) {\n resolve(hyperties);\n }).catch(function (err) {\n resolve([]);\n });\n });\n });\n Promise.all(hypertiesPromises).then(function (hypertiesResult) {\n var hyperties = [].concat.apply([], hypertiesResult);\n\n if (hyperties.length === 0) {\n return reject('No hyperties were found');\n } // log.log('Hyperties : ', hyperties);\n\n\n resolve(hyperties);\n });\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /**\n * Advanced Search for DataObjects registered in domain registry associated with some GUID\n * @param {String} guid\n * @param {Array} dataSchemes (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n */\n\n }, {\n key: \"discoverDataObjectsPerGUID\",\n value: function discoverDataObjectsPerGUID(guid, dataSchemes, resources) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //translate GUID into the user IDs to query the domain registry\n _this.discoverUserIdsPerGUID(guid).then(function (uids) {\n //translate user IDs into the associated dataObjects registered in some domain\n var dataObjectPromises = uids.map(function (uid) {\n return new Promise(function (resolve, reject) {\n _this.discoverDataObjects(uid.uID, dataSchemes, resources, uid.domain).then(function (dataObjects) {\n resolve(dataObjects);\n }).catch(function (err) {\n resolve([]);\n });\n });\n });\n Promise.all(dataObjectPromises).then(function (dataObjectsResult) {\n var dataObjects = [].concat.apply([], dataObjectsResult);\n\n if (dataObjects.length === 0) {\n return reject('No dataObjects were found');\n } // log.log('DataObjects : ', dataObjects);\n\n\n resolve(dataObjects);\n });\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /** Advanced Search for Hyperties registered in domain registry and associated with some user ID\n * @param {String} user user identifier, either in url or email format\n * @param {Array} dataSchemes (Optional) types of hyperties schemas\n * @param {Array} resources (Optional) types of hyperties resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverHyperties\",\n value: function discoverHyperties(user, dataSchemes, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {}\n };\n\n if (user.indexOf('user://') > -1) {\n msg.body.resource = user;\n } else {\n msg.body.resource = '/hyperty/idp-identifier/' + user;\n }\n\n if (dataSchemes.length > 0) {\n if (!msg.body.criteria) {\n msg.body.criteria = {};\n }\n\n msg.body.criteria.dataSchemes = dataSchemes;\n }\n\n if (resources.length > 0) {\n if (!msg.body.criteria) {\n msg.body.criteria = {};\n }\n\n msg.body.criteria.resources = resources;\n }\n\n return new Promise(function (resolve, reject) {\n // log.log(\"[CoreDiscovery.discoverHyperties] sending msg \", msg);\n _this.messageBus.postMessage(msg, function (reply) {\n // log.log(\"[CoreDiscovery.discoverHyperties] rcved reply \", reply);\n if (reply.body.code === 200 || reply.body.code === 500) {\n var hyperties = reply.body.value;\n var finalHyperties = [];\n\n for (var key in hyperties) {\n finalHyperties.push(hyperties[key]);\n }\n\n if (finalHyperties.length > 0) {\n // log.log(\"[CoreDiscovery.discoverHyperties] Hyperties Found: \", finalHyperties);\n resolve(finalHyperties);\n } else {\n return reject('No Hyperty was found');\n }\n } else {\n return reject('No Hyperty was found');\n }\n /*_this.registry.isLegacy(user).then((legacy) => {\n if (legacy) resolve([{hypertyID: user }])\n else return reject('No Hyperty was found');\n });*/\n\n });\n });\n }\n /** Advanced Search for DataObjects registered in domain registry and associated with some user ID\n * @param {String} user user identifier, either in url or email format\n * @param {Array} dataSchemes (Optional) types of dataObjects schemas\n * @param {Array} resources (Optional) types of dataObjects resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverDataObjects\",\n value: function discoverDataObjects(user, dataSchemes, resources, domain) {\n var _this = this;\n\n var activeDomain;\n var dataObjectsArray = [];\n activeDomain = !domain ? _this.domain : domain;\n return new Promise(function (resolve, reject) {\n //translate user identifier (e.g. email, name...) into the associated hyperties\n _this.discoverHyperties(user, [], [], activeDomain).then(function (hyperties) {\n var finalHyperties = [];\n\n for (var key in hyperties) {\n finalHyperties.push(hyperties[key]);\n } //translate hyperties URLs into the associated dataObjects registered in some domain\n\n\n var dataObjectsPromises = finalHyperties.map(function (hyperty) {\n return new Promise(function (resolve, reject) {\n _this.discoverDataObjectsPerReporter(hyperty.hypertyID, dataSchemes, resources, activeDomain).then(function (dataObject) {\n resolve(dataObject);\n }).catch(function (err) {\n resolve([]);\n });\n });\n });\n Promise.all(dataObjectsPromises).then(function (dataObjectsResult) {\n var dataObjects = [].concat.apply([], dataObjectsResult);\n dataObjects.forEach(function (dataObject) {\n dataObjectsArray.push(dataObject);\n });\n var finalDataObjects = [];\n\n for (var key in dataObjectsArray) {\n finalDataObjects.push(dataObjectsArray[key]);\n }\n\n if (finalDataObjects.length === 0) {\n return reject('No dataObjects were found');\n } // log.log('DataObjects Found: ', finalDataObjects);\n\n\n resolve(finalDataObjects);\n });\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /**\n * function to request about hyperties registered in domain registry, and\n * return the hyperty information, if found.\n * @param {String} url dataObject URL\n * @param {String} domain (Optional)\n * @return {Promise} Promise\n */\n\n }, {\n key: \"discoverHypertyPerURL\",\n value: function discoverHypertyPerURL(url, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: url\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code !== 200 && reply.body.code !== 500) {\n return reject('No Hyperty was found');\n }\n\n var hyperty = reply.body.value;\n\n if (hyperty) {\n // log.log('Hyperty found: ', hyperty);\n resolve(hyperty);\n } else {\n return reject('No Hyperty was found');\n }\n });\n });\n }\n /**\n * function to request about dataObject registered in domain registry, and\n * return the dataObject information, if found.\n * @param {String} url dataObject URL\n * @param {String} domain (Optional)\n * @return {Promise} Promise\n */\n\n }, {\n key: \"discoverDataObjectPerURL\",\n value: function discoverDataObjectPerURL(url, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: url\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n var dataObject = reply.body.value;\n\n if (dataObject) {\n // log.log('DataObject found: ', dataObject);\n resolve(dataObject);\n } else {\n return reject('DataObject not found');\n }\n });\n });\n }\n /** Advanced Search for dataObjects registered in domain registry\n * @param {String} name name of the dataObject\n * @param {Array} dataSchemes (Optional) types of dataObject schemas\n * @param {Array} resources (Optional) types of dataObject resources\n * @param {String} domain (Optional) domain of the registry to search\n */\n\n }, {\n key: \"discoverDataObjectsPerName\",\n value: function discoverDataObjectsPerName(name, dataSchemes, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: name\n }\n };\n\n if (dataSchemes.length > 0) {\n if (!msg.body.criteria) {\n msg.body.criteria = {};\n }\n\n msg.body.criteria.dataSchemes = dataSchemes;\n }\n\n if (resources.length > 0) {\n if (!msg.body.criteria) {\n msg.body.criteria = {};\n }\n\n msg.body.criteria.resources = resources;\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n var dataObjects = reply.body.value;\n var finalDataObjects = [];\n\n for (var key in dataObjects) {\n finalDataObjects.push(dataObjects[key]);\n }\n\n if (finalDataObjects.length > 0) {\n // log.log(\"DataObjects Found: \", finalDataObjects);\n resolve(finalDataObjects);\n } else {\n return reject('No DataObject was found');\n }\n });\n });\n }\n /**\n * function to request about specific reporter dataObject registered in domain registry, and\n * return the dataObjects from that reporter.\n * @param {String} reporter dataObject reporter\n * @param {Array} scdataSchemeshema (Optional) types of dataObjects schemas\n * @param {Array} resources (Optional) types of dataObjects resources\n * @param {String} domain (Optional)\n */\n\n }, {\n key: \"discoverDataObjectsPerReporter\",\n value: function discoverDataObjectsPerReporter(reporter, dataSchemes, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: '/comm',\n criteria: {\n reporter: reporter\n }\n }\n };\n\n if (dataSchemes.length > 0) {\n msg.body.criteria.dataSchemes = dataSchemes;\n }\n\n if (resources.length > 0) {\n msg.body.criteria.resources = resources;\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n var dataObjects = reply.body.value;\n var finalDataObjects = [];\n\n for (var key in dataObjects) {\n finalDataObjects.push(dataObjects[key]);\n }\n\n if (finalDataObjects.length > 0) {\n // log.log(\"DataObjects Found: \", finalDataObjects);\n resolve(finalDataObjects);\n } else {\n return reject('No DataObject was found');\n }\n });\n });\n }\n /**\n * function to request global registry about the user IDs associated with some GUID\n * @param {String} guid\n * @return {Promise} Promise\n */\n\n }, {\n key: \"discoverUserIdsPerGUID\",\n value: function discoverUserIdsPerGUID(guid) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n // log.log(\"GO graphConnector:\", guid);\n _this.graphConnector.queryGlobalRegistry(guid).then(function (graphConnectorContactData) {\n // log.log('Information returned from Global Registry: ', graphConnectorContactData);\n if (typeof graphConnectorContactData === 'string' || !graphConnectorContactData) {\n return reject('Unsuccessful discover userIDs by GUID');\n } else {\n var userids = graphConnectorContactData.userIDs;\n\n if (userids.length === 0) {\n return reject('UserIDs not available');\n }\n\n resolve(userids);\n }\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n /**\n * function to request discovery service about the GUID associated with some user identifier (eg email, name ...)\n * @param {String} userIdentifier\n * @return {Promise} Promise\n */\n\n }, {\n key: \"discoverGUIDPerUserIdentifier\",\n value: function discoverGUIDPerUserIdentifier(userIdentifier) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var lookupURLDiscoveryService = 'https://rethink.tlabscloud.com/discovery/rest/discover/lookup?searchquery=';\n\n _this.httpRequest.get(lookupURLDiscoveryService + userIdentifier).then(function (json) {\n // log.log('discover GUID by user identifier', json);\n var response = JSON.parse(json);\n var filteredGuid = response.results.filter(function (x) {\n return x.rethinkID != undefined;\n });\n\n if (filteredGuid.length === 0) {\n return reject('Unsuccessful discover GUID by user identifier');\n }\n\n var guids = filteredGuid.map(function (x) {\n return x.rethinkID;\n });\n return resolve(guids);\n }).catch(function (err) {\n // log.log(\"HTTP Request error: \", err);\n return reject(err);\n });\n });\n }\n }, {\n key: \"messageBus\",\n get: function get() {\n return this._messageBus;\n }\n /**\n * Sets the MessageBus.\n * @param {MessageBus} messageBus The Message Bus.\n */\n ,\n set: function set(messageBus) {\n this._messageBus = messageBus;\n }\n }]);\n\n return CoreDiscovery;\n}();\n\n/* harmony default export */ var discovery_CoreDiscovery = (CoreDiscovery_CoreDiscovery);\n// CONCATENATED MODULE: ./src/store-objects/DataObjectsStorage.js\nfunction DataObjectsStorage_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObjectsStorage_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectsStorage_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObjectsStorage_typeof(obj); }\n\nfunction DataObjectsStorage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectsStorage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectsStorage_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectsStorage_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectsStorage_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar DataObjectsStorage_log = loglevel[\"getLogger\"]('DataObjectsStorage');\n\n\n\nvar DataObjectsStorage_DataObjectsStorage =\n/*#__PURE__*/\nfunction () {\n function DataObjectsStorage(storageManager) {\n var storedDataObjects = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var factory = arguments.length > 2 ? arguments[2] : undefined;\n var runtimeStatusUpdate = arguments.length > 3 ? arguments[3] : undefined;\n\n DataObjectsStorage_classCallCheck(this, DataObjectsStorage);\n\n if (!storageManager) throw new Error('[Store Data Objects] - Needs the storageManager component');\n this._storageManager = storageManager;\n this._storeDataObject = storedDataObjects;\n this._cache = {};\n this._createSyncDB = createSyncDB; // to create Data Objects to be synched with remote storages\n\n this._remotes = {}; // List of DO synched with remote storages\n\n this._factory = factory;\n this._table = 'syncherManager:ObjectURLs';\n this._remoteStorageTable = 'dataObjectStorage';\n this._remoteSchema = 'url';\n this._runtimeStatusUpdate = runtimeStatusUpdate;\n } // load Data Objects synched with remote Storages\n\n\n DataObjectsStorage_createClass(DataObjectsStorage, [{\n key: \"loadRemote\",\n value: function loadRemote() {\n var _this2 = this;\n\n var resume = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var loading = [];\n var loadingDBs = [];\n\n _this._storageManager.get(null, null, 'remotes').then(function (remotes) {\n // in case we don't have any remotes locally stored\n DataObjectsStorage_log.info('[StoreDataObjects.loadRemote] remotes: ', remotes);\n if (!remotes) resolve();\n if (!resume) _this._remotes = remotes;\n DataObjectsStorage_log.info('[StoreDataObjects.loadRemote] loading: ', _this._remotes);\n var remoteObjects = Object.keys(remotes); // in case we don't have any remotes locally stored\n\n if (remoteObjects.length === 0) resolve();\n remoteObjects.forEach(function (db) {\n var schema = {};\n var table = db.split('/')[3];\n schema[table] = _this2._remoteSchema;\n _this._remotes[db] = createSyncDB(db, _this2._factory, schema, _this2._runtimeStatusUpdate); // _this._remotes[remote] = createSyncDB(remote, _this._factory, 'remoteDataObjectStorage' );\n\n loading.push(_this._remotes[db].get(null, null, table));\n });\n Promise.all(loading).then(function () {\n DataObjectsStorage_log.log('[StoreDataObjects.loadRemote] loaded. Starting init'); //TODO: init this._storeDataObject with loaded data objects\n\n Object.keys(_this._remotes).forEach(function (remote) {\n var table = remote.split('/')[3];\n loadingDBs.push(_this._remotes[remote].get(null, null, table));\n });\n Promise.all(loadingDBs).then(function (dataObjs) {\n if (dataObjs.length === 0) resolve();\n dataObjs.forEach(function (dO) {\n Object.keys(dO).forEach(function (url) {\n DataObjectsStorage_log.log('[StoreDataObjects.loadRemote] loaded remote ', dO[url]); // if (dO[remote].isReporter) {\n\n var type = _this2._getTypeOfObject(dO[url].isReporter);\n\n if (!_this._storeDataObject) _this._storeDataObject = {};\n if (!_this._storeDataObject.hasOwnProperty(type)) _this._storeDataObject[type] = {};\n _this._storeDataObject[type][url] = dO[url];\n });\n });\n resolve(_this._storeDataObject);\n }, function (error) {\n reject(error);\n });\n });\n }, function (error) {\n reject(error);\n });\n\n resolve();\n });\n } // delete Data Objects synched with remote Storages\n\n }, {\n key: \"deleteRemotes\",\n value: function deleteRemotes() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var deleting = [];\n var disconnecting = [];\n\n _this._storageManager.get(null, null, 'remotes').then(function (remotes) {\n // in case we don't have any remotes locally stored\n DataObjectsStorage_log.info('[StoreDataObjects.deleteRemotes] remotes: ', remotes);\n if (!remotes) resolve();\n var remoteObjects = Object.keys(_this._remotes); // in case we don't have any remotes locally stored\n\n if (remoteObjects.length === 0) resolve();\n remoteObjects.forEach(function (db) {\n deleting.push(_this._remotes[db].disconnect());\n deleting.push(_this._remotes[db].delete());\n });\n Promise.all(deleting).then(function () {\n DataObjectsStorage_log.log('[StoreDataObjects.deleteRemotes] deleted.');\n resolve();\n }, function (error) {\n resolve();\n });\n });\n\n resolve();\n });\n }\n /**\n * @description should set the initial state of the dataObjectURL to be resumed if necessary;\n *\n * @param {DataObjectURL} url - dataObjectURL to be saved;\n * @param {Boolean} isReporter - the object to be saved is a reporter\n * @param {SchemaURL} schema - the schema url\n * @param {String} status - the status of current dataObject\n * @param {HypertyURL} reporter - the Reporter hypertyURL\n * @param {Array} subscription - list of subscriptions\n * @param {Array} children - list of childs of dataObjectURL\n * @param {Array} childrens - list of childrens, like, 'chatmessage';\n * @param {Array {\n \n console.log('[DataObjectStorage.initialObserverSync] connected ');\n \n setTimeout(function() {\n _this._remotes[resource].disconnect().then(()=>{\n console.log('[DataObjectStorage.initialObserverSync] disconnected ');\n },(error)=> {\n log.error('[DataObjectStorage.initialObserverSync] Error disconnecting with remote storage');\n reject(error);\n });\n }, 15000)\n \n }, (error) => {\n log.error('[DataObjectStorage.initialObserverSync] Error connecting to remote storage');\n reject(error)\n });\n \n }*/\n\n /**\n * @description should save and update the current dataObject data information\n *\n * @param {Boolean} isReporter - the object to be saved is a reporter\n * @param {DataObjectURL} resource - dataObjectURL to be saved or updated;\n * @param {String} attribute - attribute inside the data which will be saved\n * @param {any} data - value will be saved inside the attribute;\n */\n\n }, {\n key: \"saveData\",\n value: function saveData(isReporter, resource, attribute, value, updateRuntimeStatus) {\n var storeDataObject = this._storeDataObject;\n\n var type = this._getTypeOfObject(isReporter);\n\n if (!storeDataObject || !storeDataObject[type] || !storeDataObject[type][resource]) {\n DataObjectsStorage_log.log('[StoreDataObjects - save data] - not saved');\n return;\n }\n\n DataObjectsStorage_log.log('[StoreDataObjects - saveData] - ', isReporter, type, resource, attribute, value);\n\n if (!storeDataObject[type][resource].hasOwnProperty('data')) {\n storeDataObject[type][resource].data = {};\n }\n\n if (attribute) {\n var _data;\n\n if (DataObjectsStorage_typeof(value) === 'object') _data = deepClone(value);else _data = value;\n utils_assign(storeDataObject[type][resource].data, attribute, _data);\n } else {\n storeDataObject[type][resource].data = deepClone(value) || {};\n }\n\n this._storeDataObject = storeDataObject;\n var db = storeDataObject[type][resource].backup ? storeDataObject[type][resource].url : 'syncherManager:ObjectURLs';\n var storage = storeDataObject[type][resource].backup ? this._remotes[db] : this._storageManager;\n var table = storeDataObject[type][resource].backup ? db.split('/')[3] : this._table;\n var data = storeDataObject[type][resource].backup ? storeDataObject[type][resource] : this._filterRemotes(storeDataObject);\n storage.set(db, 1, data, table, updateRuntimeStatus).then(function () {\n return storeDataObject[type][resource];\n }, function (error) {\n console.error(error);\n return storeDataObject[type][resource];\n });\n }\n }, {\n key: \"saveChildrens\",\n value: function saveChildrens(isReporter, resource, attribute, value) {\n var storeDataObject = this._storeDataObject;\n\n var type = this._getTypeOfObject(isReporter);\n\n if (!storeDataObject || !storeDataObject[type] || !storeDataObject[type][resource]) {\n DataObjectsStorage_log.log('[StoreDataObjects - save childrens] - not saved');\n return;\n }\n\n if (!storeDataObject[type][resource].hasOwnProperty('childrens')) {\n storeDataObject[type][resource].childrenObjects = {};\n }\n /* if (!storeDataObject[type][resource].childrenObjects.hasOwnProperty('resources')) {\n storeDataObject[type][resource].childrenObjects.resources = {};\n }*/\n\n\n if (attribute) {\n utils_assign(storeDataObject[type][resource].childrenObjects, attribute, deepClone(value));\n } else {\n storeDataObject[type][resource].childrenObjects = deepClone(value) || {};\n }\n\n this._storeDataObject = storeDataObject;\n var db = storeDataObject[type][resource].backup ? storeDataObject[type][resource].url : 'syncherManager:ObjectURLs';\n var storage = storeDataObject[type][resource].backup ? this._remotes[db] : this._storageManager;\n var table = storeDataObject[type][resource].backup ? db.split('/')[3] : this._table;\n var data = storeDataObject[type][resource].backup ? storeDataObject[type][resource] : this._filterRemotes(storeDataObject);\n storage.set(db, 1, data, table).then(function () {\n return storeDataObject[type][resource];\n });\n }\n /**\n * @description should save and update the current dataObject information\n *\n * @param {Boolean} isReporter - the object to be saved is a reporter\n * @param {DataObjectURL} resource - dataObjectURL to be saved or updated;\n * @param {String} attribute - attribute inside the data which will be saved\n * @param {any} data - value will be saved inside the attribute;\n */\n\n }, {\n key: \"update\",\n value: function update(isReporter, resource, attribute, value, updateRuntimeStatus) {\n var storeDataObject = this._storeDataObject;\n\n var type = this._getTypeOfObject(isReporter);\n\n if (!storeDataObject || !storeDataObject[type] || !storeDataObject[type][resource]) {\n DataObjectsStorage_log.log('[StoreDataObjects - update] - not saved');\n return;\n }\n\n DataObjectsStorage_log.log('[StoreDataObjects - update] - ', isReporter, type, resource, attribute, value);\n\n if (storeDataObject[type] && storeDataObject[type][resource] && resource && attribute && value) {\n if (attribute === 'subscriptions' || attribute === 'subscriberUsers') {\n var update = true;\n\n if (attribute === 'subscriptions') {\n update = !this._isOwner(storeDataObject[type][resource], value);\n }\n\n if (update) this._updateToArray(storeDataObject[type], resource, attribute, value);\n } else {\n storeDataObject[type][resource][attribute] = value;\n }\n\n this._storeDataObject = storeDataObject;\n var db = storeDataObject[type][resource].backup ? storeDataObject[type][resource].url : 'syncherManager:ObjectURLs';\n var storage = storeDataObject[type][resource].backup ? this._remotes[db] : this._storageManager;\n var table = storeDataObject[type][resource].backup ? db.split('/')[3] : this._table;\n var data = storeDataObject[type][resource].backup ? storeDataObject[type][resource] : this._filterRemotes(storeDataObject);\n storage.set(db, 1, data, table, updateRuntimeStatus).then(function () {\n return storeDataObject[type][resource];\n });\n }\n }\n /**\n * @description should delete stored information from the dataObject\n *\n * @param {Boolean} isReporter - the object to be saved is a reporter\n * @param {DataObjectURL} resource - dataObjectURL to be saved or updated;\n * @param {String} attribute - attribute inside the data which will be saved\n * @param {any} data - value will be saved inside the attribute;\n */\n\n }, {\n key: \"delete\",\n value: function _delete(isReporter, resource, attribute, value) {\n var storeDataObject = this._storeDataObject;\n\n var type = this._getTypeOfObject(isReporter);\n\n if (!storeDataObject || !storeDataObject[type] || !storeDataObject[type][resource]) {\n DataObjectsStorage_log.log('[StoreDataObjects - delete] - not saved');\n return;\n }\n\n if (storeDataObject[type] && storeDataObject[type][resource] && resource && attribute && value) {\n if (attribute === 'subscriptions' || attribute === 'subscriberUsers') {\n this._removeFromArray(storeDataObject[type], resource, attribute, value);\n } else {\n delete storeDataObject[type][resource][attribute];\n }\n\n this._storeDataObject = storeDataObject;\n var db = storeDataObject[type][resource].backup ? storeDataObject[type][resource].url : 'syncherManager:ObjectURLs';\n var storage = storeDataObject[type][resource].backup ? this._remotes[db] : this._storageManager;\n var table = storeDataObject[type][resource].backup ? db.split('/')[3] : this._table;\n var data = storeDataObject[type][resource].backup ? storeDataObject[type][resource] : this._filterRemotes(storeDataObject);\n storage.set(db, 1, data, table);\n return storeDataObject[type][resource];\n }\n }\n /**\n * Delete Data Object from the storage\n */\n\n }, {\n key: \"deleteResource\",\n value: function deleteResource(resource) {\n var _this4 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (resource) {\n // return this.getAll().then((storedDataObjects) => {\n DataObjectsStorage_log.info('[DataObjectStorage.deleteResource] deleting: ', resource); // let this._storeDataObject = Object.assign(this._storeDataObject || {});\n\n var backup;\n var db;\n var storage;\n\n if (_this._storeDataObject.hasOwnProperty('observers') && _this._storeDataObject.observers.hasOwnProperty(resource)) {\n backup = _this._storeDataObject.observers[resource].backup ? true : false;\n db = backup ? _this._storeDataObject.observers[resource].url : 'syncherManager:ObjectURLs';\n storage = backup ? _this._remotes[db] : _this._storageManager;\n delete _this._storeDataObject.observers[resource];\n }\n\n if (_this._storeDataObject.hasOwnProperty('reporters') && _this._storeDataObject.reporters.hasOwnProperty(resource)) {\n backup = _this._storeDataObject.reporters[resource].backup ? true : false;\n db = backup ? _this._storeDataObject.reporters[resource].url : 'syncherManager:ObjectURLs';\n storage = backup ? _this._remotes[db] : _this._storageManager;\n delete _this._storeDataObject.reporters[resource];\n } // this._storeDataObject = this._storeDataObject;\n\n\n if (backup && storage) {\n storage.delete().then(function () {\n delete _this._remotes[db];\n\n _this._storageManager.delete(resource, null, 'remotes');\n });\n } else {\n storage.set(db, 1, _this4._filterRemotes(_this._storeDataObject));\n }\n\n return resolve(); // });\n } else {\n reject(new Error('[StoreDataObjects] - Can\\'t delete this ' + resource));\n }\n });\n }\n }, {\n key: \"getAll\",\n value: function getAll() {\n var _this5 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._storeDataObject = _this5._storageManager.get('syncherManager:ObjectURLs').then(function (objects) {\n _this._storeDataObject = objects;\n\n _this.loadRemote(true).then(function (storedObjects) {\n resolve(_this._storeDataObject);\n });\n });\n }); // return this._storageManager.get('syncherManager:ObjectURLs');\n } // To sync local storage with remote storage server\n\n }, {\n key: \"sync\",\n value: function sync(resource, backupRevision) {\n var once = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var _this = this;\n\n if (_this._remotes[resource]) {\n var table = resource.split('/')[3];\n if (backupRevision) return _this._sync(resource, backupRevision, once, table);else _this._remotes[resource].getBackupRevision(resource).then(function (backupRevision) {\n return _this._sync(resource, backupRevision, once, table);\n });\n } else {\n var info = '[DataObjectStorage.sync] Info: ' + resource + ' is not synched with remote storage.';\n DataObjectsStorage_log.info(info); // reject(info);\n }\n }\n }, {\n key: \"_sync\",\n value: function _sync(resource, backupRevision, once, table) {\n var _this = this;\n\n console.log('[DataObjectStorage._sync] backupRevision: ', backupRevision);\n return new Promise(function (resolve, reject) {\n var options = {\n table: table,\n observer: false,\n syncedRevision: backupRevision + 3\n };\n\n _this._remotes[resource].connect(options).then(function () {\n DataObjectsStorage_log.info('[DataObjectStorage.sync] connected with remote ');\n\n _this._remotes[resource].get(null, null, table).then(function (dataObject) {\n // this._remotes[resource].get().then((dataObject)=>{\n DataObjectsStorage_log.info('[DataObjectStorage.sync] returning synched DO: ', dataObject);\n\n if (once) {\n setTimeout(function () {\n _this._remotes[resource].disconnect().then(function () {\n DataObjectsStorage_log.info('[DataObjectStorage.sync] disconnected '); // resolve(dataObject[resource]);\n }, function (error) {\n DataObjectsStorage_log.error('[DataObjectStorage.sync] Error synching with remote storage');\n reject(error);\n });\n }, 2000);\n }\n\n resolve(dataObject[resource]);\n }, function (error) {\n DataObjectsStorage_log.error('[DataObjectStorage.sync] Error retrieving stored data object');\n reject(error);\n });\n }, function (error) {\n DataObjectsStorage_log.error('[DataObjectStorage.sync] Error connecting to remote storage ', error);\n\n _this._remotes[resource].get(null, null, table).then(function (dataObject) {\n DataObjectsStorage_log.info('[DataObjectStorage.sync] returning synched DO: ', dataObject);\n resolve(dataObject[resource]);\n });\n });\n });\n }\n }, {\n key: \"stopSync\",\n value: function stopSync(resource) {\n if (this._remotes[resource]) this._remotes[resource].disconnect();\n }\n /**\n * @description should look for a specific dataObjectURL\n *\n * @param {DataObjectURL} resource - the dataObjectURL will be searched\n *\n * @returns Promise object with the dataObject information;\n */\n\n }, {\n key: \"getDataObject\",\n value: function getDataObject(resource) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n /* this._remotes[resource].get().then((dataObject)=> {\n return resolve(dataObject);\n } , () => {\n this._storageManager.get('syncherManager:ObjectURLs').then((storedDataObject) => {*/\n var storedDataObject = _this6._storeDataObject;\n var observers = storedDataObject.hasOwnProperty('observers') ? storedDataObject.observers : {};\n var reporters = storedDataObject.hasOwnProperty('reporters') ? storedDataObject.reporters : {};\n var currentReporter = Object.keys(reporters).find(function (value) {\n return value === resource;\n });\n var currentObserver = Object.keys(observers).find(function (value) {\n return value === resource;\n });\n var dataObject;\n\n if (currentObserver) {\n dataObject = storedDataObject.observers[currentObserver];\n }\n\n if (currentReporter) {\n dataObject = storedDataObject.reporters[currentReporter];\n }\n\n DataObjectsStorage_log.info('[StoreDataObjects - getDataObject] - for observer: ', currentObserver);\n DataObjectsStorage_log.info('[StoreDataObjects - getDataObject] - for reporters: ', currentReporter);\n DataObjectsStorage_log.info('[StoreDataObjects - getDataObject] - resolve: ', dataObject);\n return dataObject ? resolve(dataObject) : reject('No dataObject was found'); // });\n // });\n });\n }\n /**\n * @description should get the dataObject information by the message\n *\n * @param {Object} msg - message would be analised to get the current dataObject information\n * @param {Boolean} isReporter - the object to be saved is a reporter\n *\n * @returns Promise should retun an object with the dataObject or null\n */\n\n }, {\n key: \"getResourcesByCriteria\",\n value: function getResourcesByCriteria(msg, isReporter) {\n var _this7 = this;\n\n return new Promise(function (resolve) {\n var type = _this7._getTypeOfObject(isReporter); // this.getAll(isReporter).then((storedDataObjects) => {\n\n\n var storedDataObjects = _this7._storeDataObject;\n\n if (!storedDataObjects) {\n DataObjectsStorage_log.log('[DataObjectsStorage.getResourcesByCriteria] don\\'t have stored data objects');\n return resolve(null);\n }\n\n if (msg.body && msg.body.hasOwnProperty('resume') && !msg.body.resume) {\n return resolve(null);\n } // check if the message have other criteria\n // if not search for on the 'from' of the message.\n\n\n var result = [];\n\n var hasSubscription = _this7._hasSubscription(storedDataObjects[type], msg.from);\n\n var isOwner = _this7._searchOwner(storedDataObjects[type], msg.from);\n\n var isToProtoStubResume = _this7._checkProtostubResume(storedDataObjects, msg);\n\n DataObjectsStorage_log.log('[StoredDataObjects - getResourcesByCriteria]:', storedDataObjects, msg, hasSubscription, isOwner);\n\n if (msg.hasOwnProperty('from') && hasSubscription || isOwner || isToProtoStubResume) {\n var resource;\n\n if (isOwner) {\n resource = _this7._getResourcesByOwner(storedDataObjects[type], msg.from);\n } else {\n resource = _this7._getResourcesBySubscription(storedDataObjects[type], msg.from);\n }\n\n var identityFoundData = [];\n if (msg.body && msg.body.identity) identityFoundData = _this7._getResourcesByIdentity(storedDataObjects[type], msg.body.identity); //TODO: remove schema since metadata already includes the schema?\n\n var schemaFoundData = [];\n if (msg.body && msg.body.schema) schemaFoundData = _this7._getResourcesBySchema(storedDataObjects[type], msg.body.schema);\n var metadataFound = [];\n\n if (msg.body && msg.body.value) {\n var metadata = msg.body.value;\n delete metadata.data;\n metadataFound = _this7._getResourcesByMetadata(storedDataObjects[type], metadata);\n }\n\n var dataFound = [];\n if (msg.body && msg.body.value && msg.body.value.data) dataFound = _this7._getResourcesByData(storedDataObjects[type], msg.body.value.data); // you can pass as arrays as you want.. it will be merged in on place\n // removed duplicates;\n\n result = _this7._intersection(resource, identityFoundData, schemaFoundData, dataFound, metadataFound);\n\n if (result.length == 0 && isToProtoStubResume && type == 'observers' && msg.from.split('protostub').length > 0) {\n var storedObservers = storedDataObjects[type];\n var fromDomain = divideURL(msg.from).domain;\n Object.keys(storedObservers).filter(function (objectURL) {\n var subscriptions = storedObservers[objectURL].subscriptions;\n var hasSubscription = false;\n subscriptions.forEach(function (subscription) {\n var subscriptionDomain = divideURL(subscription).domain;\n\n if (subscriptionDomain == fromDomain) {\n result.push(objectURL);\n }\n });\n });\n }\n } else {\n return resolve(null);\n }\n\n var init = {};\n result.forEach(function (key) {\n var currentIsReporter = storedDataObjects[type][key];\n init[key] = currentIsReporter;\n return init;\n });\n DataObjectsStorage_log.log('[Store Data Objects] - ', init);\n resolve(init);\n }); // });\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_getResourcesByIdentity\",\n value: function _getResourcesByIdentity(storedData, userURL) {\n if (!storedData) return [];\n return Object.keys(storedData).filter(function (objectURL) {\n return storedData[objectURL].subscriberUsers.filter(function (current) {\n return current === userURL;\n }).length;\n });\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_getResourcesByOwner\",\n value: function _getResourcesByOwner(storedData, owner) {\n if (!storedData) return [];\n return Object.keys(storedData).filter(function (objectURL) {\n return storedData[objectURL].reporter === owner;\n });\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_getResourcesBySubscription\",\n value: function _getResourcesBySubscription(storedData, subscription) {\n if (!storedData) return [];\n return Object.keys(storedData).filter(function (objectURL) {\n return storedData[objectURL].subscriptions.filter(function (current) {\n return current === subscription;\n }).length;\n });\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_getResourcesBySchema\",\n value: function _getResourcesBySchema(storedData, schema) {\n return Object.keys(storedData).filter(function (objectURL) {\n var currentObject = storedData[objectURL];\n return Object.keys(currentObject).filter(function (key) {\n return key === 'schema' && currentObject[key] === schema;\n }).length;\n });\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_getResourcesByMetadata\",\n value: function _getResourcesByMetadata(storedData, metadata) {\n if (!metadata) return [];\n return Object.keys(storedData).filter(function (objectURL) {\n var currentObject = storedData[objectURL];\n return Object.keys(currentObject).filter(function (key) {\n // search on storeDataObjects for specific key provided from data;\n return Object.keys(metadata).filter(function (searchFor) {\n return key === searchFor && currentObject[key] === metadata[searchFor];\n }).length;\n }).length;\n });\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_getResourcesByData\",\n value: function _getResourcesByData(storedData, data) {\n if (!data) return [];\n return Object.keys(storedData).filter(function (objectURL) {\n var currentObject = storedData[objectURL].hasOwnProperty('data') ? storedData[objectURL].data : {};\n return Object.keys(currentObject).filter(function (key) {\n // search on storeDataObjects for specific key provided from data;\n return Object.keys(data).filter(function (searchFor) {\n return key === searchFor && currentObject[key] === data[searchFor];\n }).length;\n }).length;\n });\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_hasSubscription\",\n value: function _hasSubscription(storedData, subscription) {\n if (!storedData) return false;\n return Object.keys(storedData).filter(function (objectURL) {\n return storedData[objectURL].subscriptions.filter(function (current) {\n return current === subscription;\n }).length;\n }).length > 0 ? true : false;\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_searchOwner\",\n value: function _searchOwner(storedData, from) {\n if (!storedData) return false;\n return Object.keys(storedData).filter(function (objectURL) {\n return storedData[objectURL].reporter === from;\n }).length > 0 ? true : false;\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_checkProtostubResume\",\n value: function _checkProtostubResume(storedDataObjects, msg) {\n if (!storedDataObjects) return false;\n\n if (msg.hasOwnProperty('body') && msg.body.hasOwnProperty('value') && msg.body.value.hasOwnProperty('reporter')) {\n var reporter = msg.body.value.reporter;\n\n if (storedDataObjects.hasOwnProperty('reporters')) {\n var reportersStored = storedDataObjects.reporters;\n return Object.keys(reportersStored).filter(function (objectURL) {\n return reportersStored[objectURL].reporter === reporter;\n }).length > 0 ? true : false;\n } else {\n return false;\n }\n } else if (storedDataObjects.hasOwnProperty('observers')) {\n var storedObservers = storedDataObjects.observers;\n var fromDomain = divideURL(msg.from).domain;\n return Object.keys(storedObservers).filter(function (objectURL) {\n var subscriptions = storedObservers[objectURL].subscriptions;\n var hasSubscription = false;\n subscriptions.forEach(function (subscription) {\n var subscriptionDomain = divideURL(subscription).domain;\n\n if (subscriptionDomain == fromDomain) {\n hasSubscription = true;\n }\n });\n\n if (hasSubscription) {\n return true;\n }\n }).length > 0 ? true : false;\n }\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_isOwner\",\n value: function _isOwner(value, url) {\n if (!value) return false;\n return value.reporter === url ? true : false;\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_intersection\",\n value: function _intersection() {\n var args = Array.from(arguments);\n var result = args.reduce(function (first, second) {\n return first.concat(second);\n }).filter(function (value, index, self) {\n return self.indexOf(value) === index;\n });\n DataObjectsStorage_log.log('DataObjectsStorage._intersection] Result an unique array of strings: ', result);\n return result;\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_updateToArray\",\n value: function _updateToArray(storeDataObject, resource, key, value) {\n DataObjectsStorage_log.log('[DataObjectsStorage] - _updateToArray: ', storeDataObject, resource, key, value);\n if (storeDataObject[resource][key].indexOf(value) === -1) storeDataObject[resource][key].push(value);\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_removeFromArray\",\n value: function _removeFromArray(storeDataObject, resource, key, value) {\n var indexOfValue = storeDataObject[resource][key].indexOf(value);\n if (indexOfValue === -1) storeDataObject[resource][key].splice(indexOfValue, 1);\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_hasValue\",\n value: function _hasValue(obj, key, value) {\n return obj.hasOwnProperty(key) && obj[key] === value;\n }\n /**\n * @private\n * @todo documentation\n */\n\n }, {\n key: \"_getTypeOfObject\",\n value: function _getTypeOfObject(isReporter) {\n return isReporter ? 'reporters' : 'observers';\n }\n }]);\n\n return DataObjectsStorage;\n}();\n\n/* harmony default export */ var store_objects_DataObjectsStorage = (DataObjectsStorage_DataObjectsStorage);\n// CONCATENATED MODULE: ./src/utils/PromiseQueue.js\nfunction PromiseQueue_toConsumableArray(arr) { return PromiseQueue_arrayWithoutHoles(arr) || PromiseQueue_iterableToArray(arr) || PromiseQueue_nonIterableSpread(); }\n\nfunction PromiseQueue_nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction PromiseQueue_iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction PromiseQueue_arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction PromiseQueue_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction PromiseQueue_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction PromiseQueue_createClass(Constructor, protoProps, staticProps) { if (protoProps) PromiseQueue_defineProperties(Constructor.prototype, protoProps); if (staticProps) PromiseQueue_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar PromiseQueue =\n/*#__PURE__*/\nfunction () {\n // TODO: Improve this Queuing\n function PromiseQueue(concurrency) {\n PromiseQueue_classCallCheck(this, PromiseQueue);\n\n this.flushing = false;\n this.Promise = Promise;\n this.concurrency = typeof concurrency !== 'number' ? 1 : concurrency;\n this.promises = [];\n this.queue = [];\n this.isProcessing = false;\n }\n\n PromiseQueue_createClass(PromiseQueue, [{\n key: \"done\",\n value: function done(cb) {\n this.callback = cb;\n }\n }, {\n key: \"add\",\n value: function add(promise) {\n var _this = this;\n\n this.queue.push(promise);\n\n if (!this.isProcessing) {\n return this.queue.reduce(function (promiseChain, currentTask) {\n return promiseChain.then(function (chainResults) {\n return currentTask.then(function (currentResult) {\n return [].concat(PromiseQueue_toConsumableArray(chainResults), [currentResult]);\n });\n });\n }, Promise.resolve([])).then(function (arrayOfResults) {\n // Do something with all results\n _this.isProcessing = false;\n });\n }\n }\n }]);\n\n return PromiseQueue;\n}();\n\n/* harmony default export */ var utils_PromiseQueue = (PromiseQueue);\n// CONCATENATED MODULE: ./src/hyperty-resource/HypertyResourcesStorage.js\nfunction HypertyResourcesStorage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyResourcesStorage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyResourcesStorage_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyResourcesStorage_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyResourcesStorage_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar HypertyResourcesStorage_log = loglevel[\"getLogger\"]('HypertyResourcesStorage');\n\n\n\nvar HypertyResourcesStorage_HypertyResourcesStorage =\n/*#__PURE__*/\nfunction () {\n function HypertyResourcesStorage(runtimeURL, bus, storageManager, hypertyResources) {\n HypertyResourcesStorage_classCallCheck(this, HypertyResourcesStorage);\n\n if (!storageManager) throw new Error('[HypertyResourcesStorage constructor] mandatory storageManager parameter missing');\n if (!runtimeURL) throw new Error('[HypertyResourcesStorage constructor] mandatory runtimeURL parameter missing');\n if (!bus) throw new Error('[HypertyResourcesStorage constructor] mandatory bus parameter missing');\n\n var _this = this;\n\n _this._bus = bus;\n _this._storageLimit = 0.9; // the save storageLimit;\n\n _this._url = runtimeURL + '/storage';\n _this._storageManager = storageManager;\n _this.promiseQueue = new utils_PromiseQueue();\n _this._hypertyResources = hypertyResources;\n bus.addListener(_this._url, function (msg) {\n HypertyResourcesStorage_log.info('[HypertyResourcesStorage] Message RCV: ', msg);\n\n switch (msg.type) {\n case 'create':\n _this._onCreate(msg);\n\n break;\n\n case 'read':\n _this._onRead(msg);\n\n break;\n\n case 'delete':\n _this._onDelete(msg);\n\n break;\n }\n });\n }\n /**\n * check the available storage quota\n *\n * @memberof HypertyResourcesStorage\n */\n\n\n HypertyResourcesStorage_createClass(HypertyResourcesStorage, [{\n key: \"checkStorageQuota\",\n value: function checkStorageQuota() {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n if (_this2._availableQuota && _this2._usage) {\n return resolve(availableSpace(_this2._usage, _this2._availableQuota));\n }\n\n if (navigator) {\n navigator.storage.estimate().then(function (estimate) {\n _this2._availableQuota = estimate.quota;\n _this2._usage = estimate.usage;\n resolve(availableSpace(_this2._usage, _this2._availableQuota));\n }).catch(function (reason) {\n HypertyResourcesStorage_log.error('[HypertyResourcesStorage] CheckStorageQuota error: ', reason);\n reject(reason);\n });\n }\n });\n }\n /**\n * @description should save an HypertyResource contained in the body of a create message request;\n *\n * @param {string} message - message containing the hyperty resource to be stored\n */\n\n }, {\n key: \"_onCreate\",\n value: function _onCreate(message) {\n var _this = this;\n\n if (!message.body || !message.body.value) throw new Error('[HypertyResourcesStorage._onCreate] mandatory message body value missing: ', message);\n var content = message.body.value;\n var contentURL = content.contentURL;\n var resourceURL = '';\n\n if (!contentURL) {\n contentURL = [];\n resourceURL = _this._url + '/' + generateGUID();\n } else {\n var currentURL = contentURL[0];\n var resource = currentURL.substr(currentURL.lastIndexOf('/') + 1);\n resourceURL = _this._url + '/' + resource;\n }\n\n if (!_this._hypertyResources.hasOwnProperty(resourceURL)) {\n contentURL.push(resourceURL);\n content.contentURL = contentURL;\n }\n\n this._hypertyResources[resourceURL] = content;\n this.promiseQueue.add(this._toSave(resourceURL, message, content));\n }\n }, {\n key: \"_toSave\",\n value: function _toSave(resourceURL, message, content) {\n var _this3 = this;\n\n return new Promise(function (resolve, reject) {\n var error = function error(reason) {\n var response = {\n from: message.to,\n to: message.from,\n id: message.id,\n type: 'response',\n body: {\n value: resourceURL,\n code: 500,\n description: reason\n }\n };\n\n _this3._bus.postMessage(response);\n\n return reject(reason);\n };\n\n _this3.checkStorageQuota().then(function (result) {\n if (content.size > result.quota) {\n var msg = 'The storage do not have space to store that resource';\n error(msg);\n throw Error(msg);\n }\n\n var spaceAvailable = result.quota;\n var allocated = result.usage + content.size;\n\n if (result.percent >= _this3._storageLimit || allocated > spaceAvailable) {\n return _this3._getOlderResources(content.size);\n } else {\n return true;\n }\n }).then(function () {\n return _this3._storageManager.set(resourceURL, 1, content);\n }).then(function () {\n var response = {\n from: message.to,\n to: message.from,\n id: message.id,\n type: 'response',\n body: {\n value: resourceURL,\n code: 200\n }\n };\n\n _this3._bus.postMessage(response);\n\n HypertyResourcesStorage_log.log('Success');\n return resolve();\n }).catch(error);\n });\n }\n }, {\n key: \"_getOlderResources\",\n value: function _getOlderResources(size) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n _this4._storageManager.get().then(function (result) {\n var resources = Object.keys(result);\n var total = 0;\n var reduced = resources.sort(function (a, b) {\n return result[a].created < result[b].created;\n }).reduce(function (previousResource, currentResource) {\n var current = _this4._hypertyResources[currentResource];\n HypertyResourcesStorage_log.log('[HypertyResourcesStorage] _getOlderResources: ', total, size, currentResource, _this4._availableQuota);\n\n if (total <= size) {\n total += current.size;\n previousResource.push(currentResource);\n }\n\n return previousResource;\n }, []);\n var deleting = reduced.map(function (key) {\n return _this4._storageManager.delete(key);\n });\n Promise.all(deleting).then(function () {\n resolve(true);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n });\n }\n /**\n * @description should return an HypertyResource stored in the Storage Manager identified by the content url contained in the body of a read message request;\n *\n * @param {string} message - message containing the hyperty resource to be stored\n */\n\n }, {\n key: \"_onRead\",\n value: function _onRead(message) {\n var _this = this;\n\n if (!message.body || !message.body.resource) throw new Error('[HypertyResourcesStorage._onRead] mandatory message body resource missing: ', message);\n var contentUrl = message.body.resource;\n var response = {\n from: message.to,\n to: message.from,\n id: message.id,\n type: 'response',\n body: {}\n }; // let content = _this._hypertyResources[contentUrl];\n\n HypertyResourcesStorage_log.info('[HypertyResourcesStorage._onRead] get resourceURL:', contentUrl);\n\n this._storageManager.get('resourceURL', contentUrl).then(function (content) {\n HypertyResourcesStorage_log.info('[HypertyResourcesStorage._onRead] found content:', content);\n\n if (content) {\n if (content.resourceType === 'file') {\n _this._onReadFile(response, content);\n } else {\n response.body.code = 200;\n response.body.p2p = true;\n response.body.value = content;\n\n _this._bus.postMessage(response);\n }\n } else {\n response.body.code = 404;\n response.body.desc = 'Content Not Found for ' + contentUrl;\n\n _this._bus.postMessage(response);\n }\n }); //response.body.code = 404;\n //_this._hypertyResources[contentUrl] = message.body.value;\n\n }\n }, {\n key: \"_onReadFile\",\n value: function _onReadFile(response, resource) {\n var _this = this;\n\n var reader = new FileReader();\n\n reader.onload = function (theFile) {\n HypertyResourcesStorage_log.info('[FileHypertyResource.init] file loaded ', theFile);\n response.body.code = 200;\n response.body.p2p = true;\n response.body.value = deepClone(resource);\n response.body.value.content = theFile.target.result;\n\n _this._bus.postMessage(response);\n };\n\n if (resource.mimetype.includes('text/')) {\n reader.readAsText(resource.content);\n } else {\n var current = resource.content;\n var blob;\n\n if (Array.isArray(current)) {\n blob = new Blob(current, {\n type: resource.mimetype\n });\n } else {\n blob = new Blob([current], {\n type: resource.mimetype\n });\n }\n\n reader.readAsArrayBuffer(blob);\n }\n }\n /**\n * @description should delete an HypertyResource from the storage;\n *\n * @param {string} message - message containing the content URL of the hyperty resource to be deleted\n */\n\n }, {\n key: \"_onDelete\",\n value: function _onDelete(message) {\n var _this = this;\n\n if (!message.body) throw new Error('[HypertyResourcesStorage._onDelete] mandatory message body missing: ', message);\n\n if (message.body.resource) {\n delete _this._hypertyResources[message.body.resource];\n } else if (message.body.resources) {\n message.body.resources.forEach(function (resource) {\n delete _this._hypertyResources[resource];\n });\n } else {\n throw new Error('[HypertyResourcesStorage._onDelete] mandatory resource missing: ', message);\n }\n\n _this._storageManager.delete('resourceURL', message.body.resource).then(function () {\n var response = {\n from: message.to,\n to: message.from,\n id: message.id,\n type: 'response',\n body: {\n code: 200\n }\n };\n\n _this._bus.postMessage(response);\n }).catch(function (reason) {\n var response = {\n from: message.to,\n to: message.from,\n id: message.id,\n type: 'response',\n body: {\n code: 400,\n description: reason\n }\n };\n\n _this._bus.postMessage(response);\n });\n }\n }]);\n\n return HypertyResourcesStorage;\n}();\n\n/* harmony default export */ var hyperty_resource_HypertyResourcesStorage = (HypertyResourcesStorage_HypertyResourcesStorage);\n// CONCATENATED MODULE: ./src/syncher/Subscription.js\nfunction Subscription_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Subscription_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Subscription_createClass(Constructor, protoProps, staticProps) { if (protoProps) Subscription_defineProperties(Constructor.prototype, protoProps); if (staticProps) Subscription_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar Subscription_log = loglevel[\"getLogger\"]('SynSubscription');\n\nvar Subscription =\n/*#__PURE__*/\nfunction () {\n function Subscription(bus, owner, url, isReporter) {\n Subscription_classCallCheck(this, Subscription);\n\n var _this = this;\n\n var childBaseURL = url + '/children/';\n var changeURL = url + '/changes'; //process delete message\n\n _this._deleteListener = bus.addListener(changeURL, function (msg) {\n if (msg.type === 'delete') {\n Subscription_log.log('Subscription-DELETE: ', msg); //FLOW-OUT: message sent to all subscribers\n\n var deleteMessageToHyperty = {\n type: 'delete',\n from: msg.from,\n to: owner,\n body: {\n identity: msg.body.identity,\n resource: url\n }\n }; //send delete to hyperty\n\n bus.postMessage(deleteMessageToHyperty, function (reply) {\n Subscription_log.log('Subscription-DELETE-REPLY: ', reply);\n\n if (reply.body.code === 200) {\n _this._releaseListeners();\n }\n });\n }\n }); //add change publish address or forward\n\n if (isReporter) {\n _this._changeListener = bus.addPublish(changeURL);\n } else {\n _this._changeListener = bus.addForward(changeURL, owner);\n }\n\n _this._childrenListeners = []; // log.log('[Subscription] - childID', childrens);\n // childrens.forEach((child) => {\n // let childId = childBaseURL + child;\n // log.log('[Subscription] - childID', childBaseURL);\n //add children publish address\n\n var childrenForward = bus.addPublish(childBaseURL);\n\n _this._childrenListeners.push(childrenForward); //add self forward if an observer\n\n\n if (!isReporter) {\n var selfForward = bus.addForward(childBaseURL, owner);\n\n _this._childrenListeners.push(selfForward);\n } // });\n\n }\n\n Subscription_createClass(Subscription, [{\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n _this._deleteListener.remove();\n\n _this._changeListener.remove();\n\n _this._childrenListeners.forEach(function (forward) {\n forward.remove();\n });\n }\n }]);\n\n return Subscription;\n}();\n\n/* harmony default export */ var syncher_Subscription = (Subscription);\n// CONCATENATED MODULE: ./src/syncher/ReporterObject.js\nfunction ReporterObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ReporterObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ReporterObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) ReporterObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) ReporterObject_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar ReporterObject_log = loglevel[\"getLogger\"]('ReporterObject');\n\n\n\n\nvar ReporterObject_ReporterObject =\n/*#__PURE__*/\nfunction () {\n function ReporterObject(parent, owner, url, childrens, offline) {\n ReporterObject_classCallCheck(this, ReporterObject);\n\n var _this = this;\n\n _this._parent = parent;\n _this._owner = owner;\n _this._url = url;\n _this._bus = parent._bus;\n _this._domain = divideURL(url).domain;\n _this._objSubscriptorURL = _this._url + '/subscription';\n _this._subscriptions = {};\n _this._childrens = childrens;\n _this._childrenListeners = [];\n _this._forwards = {};\n _this._isToSaveData = false;\n\n _this._allocateListeners();\n\n _this._offline = offline ? offline : false;\n }\n\n ReporterObject_createClass(ReporterObject, [{\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this2 = this;\n\n var _this = this; //add subscription listener...\n\n\n _this._subscriptionListener = _this._bus.addListener(_this._objSubscriptorURL, function (msg) {\n ReporterObject_log.info('[SyncherManager.ReporterObject received ]', msg);\n\n switch (msg.type) {\n case 'subscribe':\n _this._onRemoteSubscribe(msg);\n\n break;\n\n case 'unsubscribe':\n _this._onRemoteUnSubscribe(msg);\n\n break;\n\n case 'response':\n _this._onRemoteResponse(msg);\n\n break;\n\n case 'forward':\n _this._onForwardedRemoteSubscribe(msg);\n\n break;\n }\n });\n var changeURL = _this._url + '/changes';\n _this._changeListener = _this._bus.addListener(changeURL, function (msg) {\n ReporterObject_log.info('[SyncherManager.ReporterObject ] SyncherManager-' + changeURL + '-RCV: ', msg); //do not save changes to backupRevision to avoid infinite loops\n\n if (_this2._isToSaveData && msg.body.attribute) {\n var updateRuntimeStatus = msg.body.attribute !== 'backupRevision' ? true : false;\n ReporterObject_log.log('[SyncherManager.ReporterObject ] SyncherManager - save data: ', msg);\n\n _this._parent._dataObjectsStorage.update(true, _this._url, 'version', msg.body.version, updateRuntimeStatus);\n\n _this._parent._dataObjectsStorage.update(true, _this._url, 'lastModified', msg.body.lastModified, updateRuntimeStatus);\n\n _this._parent._dataObjectsStorage.saveData(true, _this._url, msg.body.attribute, msg.body.value, updateRuntimeStatus);\n }\n });\n }\n }, {\n key: \"_onForwardedRemoteSubscribe\",\n // To handle subscriptions sent while the reporter was offline ie forwarded by a Offline Subscription Manager service\n value: function _onForwardedRemoteSubscribe(msg) {\n this._onRemoteSubscribe(msg.body);\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n _this._subscriptionListener.remove();\n\n _this._changeListener.remove();\n\n _this._childrenListeners.forEach(function (cl) {\n cl.remove();\n });\n\n Object.keys(_this._forwards).forEach(function (key) {\n _this.forwardUnSubscribe(key);\n }); //remove all subscriptions\n\n Object.keys(_this._subscriptions).forEach(function (key) {\n _this._subscriptions[key]._releaseListeners();\n });\n }\n }, {\n key: \"resumeSubscriptions\",\n value: function resumeSubscriptions(subscriptions) {\n var _this = this;\n\n if (!subscriptions) return;\n Object.keys(subscriptions).forEach(function (key) {\n var hypertyURL = subscriptions[key];\n ReporterObject_log.log('[SyncherManager.ReporterObject] - resume subscriptions', _this, hypertyURL, _this._childrens);\n\n if (!_this._subscriptions[hypertyURL]) {\n _this._subscriptions[hypertyURL] = new syncher_Subscription(_this._bus, _this._owner, _this._url, true);\n }\n });\n }\n /**\n * Register a listener in the msg-node and in the local MessageBus, so that messages on this address are forwarded to the reporter object\n * @param {string} address - URL to register the listeners\n * @return {Promise} Return Promise OK or error\n */\n\n }, {\n key: \"forwardSubscribe\",\n value: function forwardSubscribe(addresses) {\n var _this = this; //FLOW-OUT: message sent to the msg-node SubscriptionManager component\n\n\n var nodeSubscribeMsg = {\n type: 'subscribe',\n from: _this._parent._url,\n to: 'domain://msg-node.' + _this._domain + '/sm',\n body: {\n resources: addresses,\n source: _this._owner\n }\n };\n return new Promise(function (resolve, reject) {\n _this._bus.postMessage(nodeSubscribeMsg, function (reply) {\n ReporterObject_log.log('[SyncherManager.ReporterObject ]forward-subscribe-response(reporter): ', reply);\n\n if (reply.body.code === 200) {\n var newForward = _this._bus.addForward(_this._url, _this._owner);\n\n _this._forwards[addresses[0]] = newForward;\n resolve();\n } else {\n reject('Error on msg-node subscription: ' + reply.body.desc);\n }\n });\n });\n }\n /**\n * UnRegister a listener in the msg-node and in the local MessageBus, so that messages on this address are removed from forward\n * @param {string} address - URL to un-register the listeners\n */\n\n }, {\n key: \"forwardUnSubscribe\",\n value: function forwardUnSubscribe(address) {\n var _this = this;\n\n _this._forwards[address].remove();\n\n delete _this._forwards[address]; //FLOW-OUT: message sent to the msg-node SubscriptionManager component\n\n var nodeUnSubscribeMsg = {\n type: 'unsubscribe',\n from: _this._parent._url,\n to: 'domain://msg-node.' + _this._domain + '/sm',\n body: {\n resources: [address],\n source: _this._owner\n }\n };\n\n _this._bus.postMessage(nodeUnSubscribeMsg);\n }\n /**\n * Register listeners for a list of childrens. Public channels used to transmit messages.\n * @param {string[]} childrens - channels to register\n * @return {Promise} Return Promise OK or error\n */\n\n }, {\n key: \"addChildrens\",\n value: function addChildrens() {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this._childrens.length === 0) {\n resolve();\n return;\n }\n\n var childBaseURL = _this._url + '/children/';\n ReporterObject_log.log('[SyncherManager.ReporterObject - addChildrens] - childrens: ', childBaseURL);\n /* childrens.forEach((child) => {\n _this._childrens.push(child);\n });*/\n\n /*\n _this._childrens.forEach((child) => {\n let childId = childBaseURL + child;\n let selfForward = _this._bus.addForward(childId, owner);\n _this._childrenListeners.push(selfForward);\n });*/\n\n var subscriptions = []; // childrens.forEach((child) => subscriptions.push(childBaseURL + child));\n\n subscriptions.push(childBaseURL); //_this._storageSubscriptions[_this._objSubscriptorURL] = {url: _this._url, owner: _this._owner, childrens: _this._childrens};\n //FLOW-OUT: message sent to the msg-node SubscriptionManager component\n\n var nodeSubscribeMsg = {\n type: 'subscribe',\n from: _this._parent._url,\n to: 'domain://msg-node.' + _this._domain + '/sm',\n body: {\n resources: subscriptions,\n source: _this._owner\n }\n };\n\n _this._bus.postMessage(nodeSubscribeMsg, function (reply) {\n ReporterObject_log.log('[SyncherManager.ReporterObject ]node-subscribe-response(reporter):', reply);\n\n if (reply.body.code === 200) {\n //add children listeners on local ...\n subscriptions.forEach(function (childURL) {\n var childListener = _this._bus.addListener(childURL, function (msg) {\n //TODO: what todo here? Save childrens?\n ReporterObject_log.log('[SyncherManager.ReporterObject received]', msg);\n\n if (msg.type === 'create' && msg.to.includes('children') && _this3._isToSaveData) {\n // if the value is not encrypted lets encrypt it\n // todo: should be subject to some policy\n var splitedReporterURL = splitObjectURL(msg.to);\n var url = splitedReporterURL.url;\n if (!msg.body.hasOwnProperty('mutual')) msg.body.mutual = true; //remove false when mutualAuthentication is enabled\n\n if (!(typeof msg.body.value === 'string') && msg.body.mutual) {\n ReporterObject_log.log('[SyncherManager.ReporterObject] encrypting received data ', msg.body.value);\n cryptoManager_CryptoManager.encryptDataObject(msg.body.value, url).then(function (encryptedValue) {\n ReporterObject_log.log('[SyncherManager.ReporterObject] encrypted data ', encryptedValue);\n\n _this._storeChildObject(msg, JSON.stringify(encryptedValue));\n }).catch(function (reason) {\n ReporterObject_log.warn('[SyncherManager._decryptChildrens] failed : ', reason, ' Storing unencrypted');\n\n _this._storeChildObject(msg, msg.body.value);\n });\n } else {\n _this._storeChildObject(msg, msg.body.value);\n }\n }\n });\n\n _this._childrenListeners.push(childListener);\n\n var selfForward = _this._bus.addForward(childURL, _this._owner);\n\n _this._childrenListeners.push(selfForward);\n });\n resolve();\n } else {\n reject('Error on msg-node subscription: ' + reply.body.desc);\n }\n });\n });\n } // store childObject\n\n }, {\n key: \"_storeChildObject\",\n value: function _storeChildObject(msg, data) {\n var _this = this;\n\n var splitedReporterURL = splitObjectURL(msg.to);\n var url = splitedReporterURL.url;\n var resource = splitedReporterURL.resource;\n var value;\n /* if (msg.body.identity) {\n value.identity = msg.body.identity;\n delete value.identity.assertion;\n delete value.identity.expires;\n }*/\n\n var objectURLResource = msg.body.resource;\n var attribute = resource;\n if (objectURLResource === 'heartbeat') value = data;else value = {\n identity: msg.body.identity,\n value: data\n }; // if (objectURLResource) attribute += '.' + objectURLResource;\n\n if (objectURLResource) attribute = objectURLResource; // this identity data is not needed to be stored\n\n console.log('[SyncherManager.ReporterObject._storeChildObject] : ', url, attribute, value);\n\n _this._parent._dataObjectsStorage.saveChildrens(true, url, attribute, value);\n }\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n var domain = divideURL(_this._owner).domain; //FLOW-OUT: message sent directly to all subscribers of the reporter\n\n _this._bus.postMessage({\n type: 'delete',\n from: _this._objSubscriptorURL,\n to: _this._url + '/changes'\n }); //FLOW-OUT: message sent to the msg-node ObjectAllocationManager component\n\n\n _this._bus.postMessage({\n type: 'delete',\n from: _this._parent._url,\n to: 'domain://msg-node.' + domain + '/object-address-allocation',\n body: {\n resource: _this._url,\n childrenResources: _this._childrens\n }\n });\n\n _this._releaseListeners();\n\n delete _this._parent._reporters[_this._url];\n }\n }, {\n key: \"_onRemoteResponse\",\n value: function _onRemoteResponse(msg) {\n var _this = this;\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: _this._url,\n body: {\n code: msg.body.code,\n identity: msg.body.identity,\n source: msg.from\n }\n });\n } //FLOW-IN: message received from Syncher -> subscribe\n\n }, {\n key: \"_onRemoteSubscribe\",\n value: function _onRemoteSubscribe(msg) {\n var _this = this;\n\n var hypertyURL = msg.body.subscriber; //validate if subscription already exists?\n\n if (_this._subscriptions[hypertyURL]) {\n // let errorMsg = {\n // id: msg.id, type: 'response', from: msg.to, to: hypertyURL,\n // body: { code: 500, desc: 'Subscription for (' + _this._url + ' : ' + hypertyURL + ') already exists!' }\n // };\n //\n // _this._bus.postMessage(errorMsg);\n // return;\n // new version because of reusage\n _this._subscriptions[hypertyURL]._releaseListeners();\n } //ask to subscribe to Syncher? (depends on the operation mode)\n //TODO: get mode from object!\n\n\n var mode = 'sub/pub';\n\n if (mode === 'sub/pub') {\n //FLOW-OUT: message sent to local hyperty address Syncher -> _onForward\n var forwardMsg = {\n type: 'forward',\n from: _this._url,\n to: _this._owner,\n body: {\n type: msg.type,\n from: hypertyURL,\n to: _this._url,\n identity: msg.body.identity\n }\n }; //TODO: For Further Study\n\n if (msg.body.hasOwnProperty('mutual')) forwardMsg.body.mutual = msg.body.mutual;\n\n _this._bus.postMessage(forwardMsg, function (reply) {\n ReporterObject_log.log('[SyncherManager.ReporterObject ]forward-reply: ', reply);\n\n if (reply.body.code === 200) {\n if (!_this._subscriptions[hypertyURL]) {\n ReporterObject_log.log('[SyncherManager.ReporterObject] - _onRemoteSubscribe:', _this._childrens);\n _this._subscriptions[hypertyURL] = new syncher_Subscription(_this._bus, _this._owner, _this._url, true);\n }\n } // Store for each reporter hyperty the dataObject\n\n\n var userURL;\n\n if (msg.body.identity && msg.body.identity.userProfile.userURL) {\n userURL = msg.body.identity.userProfile.userURL;\n\n _this._parent._dataObjectsStorage.update(true, _this._url, 'subscriberUsers', userURL);\n } //TODO: mutual and sessionkeys updates were removed. FFS\n\n /* if (msg.body.hasOwnProperty('mutual')) {\n // _this._parent._identityModule.updateIsToEncryptForDataObjectSessionKey(_this._url, msg.body.mutual).then(()=>{\n _this._parent._dataObjectsStorage.update(true, _this._url, 'mutual', msg.body.mutual);\n // });\n }*/\n\n\n _this._parent._dataObjectsStorage.update(true, _this._url, 'subscriptions', hypertyURL);\n\n reply.body.owner = _this._owner; //FLOW-OUT: subscription response sent (forward from internal Hyperty)\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: reply.body\n });\n });\n }\n } //FLOW-IN: message received from remote ObserverObject -> removeSubscription\n\n }, {\n key: \"_onRemoteUnSubscribe\",\n value: function _onRemoteUnSubscribe(msg) {\n var _this = this;\n\n var unsubscriber = msg.body.source;\n var subscription = _this._subscriptions[unsubscriber];\n\n if (subscription) {\n subscription._releaseListeners();\n\n delete _this._subscriptions[unsubscriber];\n var forwardMsg = {\n type: 'forward',\n from: _this._url,\n to: _this._owner,\n body: {\n type: msg.type,\n from: unsubscriber,\n to: _this._url,\n identity: msg.body.identity\n }\n };\n\n _this._bus.postMessage(forwardMsg);\n }\n }\n }, {\n key: \"offline\",\n get: function get() {\n return this._offline;\n }\n }, {\n key: \"isToSaveData\",\n set: function set(value) {\n this._isToSaveData = value;\n }\n }]);\n\n return ReporterObject;\n}();\n\n/* harmony default export */ var syncher_ReporterObject = (ReporterObject_ReporterObject);\n// CONCATENATED MODULE: ./src/syncher/ObserverObject.js\nfunction ObserverObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ObserverObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ObserverObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) ObserverObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) ObserverObject_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar ObserverObject_log = loglevel[\"getLogger\"]('ObserverObject');\n\n\n\n\nvar ObserverObject_ObserverObject =\n/*#__PURE__*/\nfunction () {\n function ObserverObject(parent, url, childrens) {\n var _this2 = this;\n\n ObserverObject_classCallCheck(this, ObserverObject);\n\n var _this = this;\n\n _this._parent = parent;\n _this._url = url;\n _this._childrens = childrens;\n _this._bus = parent._bus;\n _this._subscriptions = {};\n _this._storageSubscriptions = {};\n _this._childrenListeners = [];\n this._isToSaveData = false;\n var changeURL = _this._url + '/changes';\n _this._changeListener = _this._bus.addListener(changeURL, function (msg) {\n ObserverObject_log.log('[SyncherManager.ObserverObject ] SyncherManager-' + changeURL + '-RCV: ', msg); //TODO: what todo here? Save changes?\n\n if (_this2._isToSaveData && msg.body.attribute) {\n ObserverObject_log.log('[SyncherManager.ObserverObject ] SyncherManager - save data: ', msg);\n\n _this._parent._dataObjectsStorage.update(false, _this._url, 'version', msg.body.version);\n\n _this._parent._dataObjectsStorage.update(false, _this._url, 'lastModified', msg.body.lastModified);\n\n _this._parent._dataObjectsStorage.saveData(false, _this._url, msg.body.attribute, msg.body.value);\n }\n });\n }\n\n ObserverObject_createClass(ObserverObject, [{\n key: \"_newSubscription\",\n value: function _newSubscription(hyperty) {\n var _this = this;\n\n var subscription = _this._subscriptions[hyperty];\n ObserverObject_log.log('[Observer Object - new subscription] - ', _this._subscriptions, hyperty, _this._subscriptions.hasOwnProperty(hyperty));\n\n if (!subscription) {\n _this._subscriptions[hyperty] = new syncher_Subscription(_this._bus, hyperty, _this._url, false);\n }\n }\n }, {\n key: \"addSubscription\",\n value: function addSubscription(hyperty) {\n var _this = this;\n\n _this._newSubscription(hyperty);\n }\n }, {\n key: \"addChildrens\",\n value: function addChildrens() {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve) {\n if (_this._childrens.length === 0) {\n resolve();\n return;\n }\n\n var childBaseURL = _this._url + '/children/';\n ObserverObject_log.log('[SyncherManager.ObserverObject - addChildrens] - childrens: ', childBaseURL); // childrens.forEach((child) => {\n\n var childListener = _this._bus.addListener(childBaseURL, function (msg) {\n //TODO: what todo here? Save childrens?\n ObserverObject_log.log('[SyncherManager.ObserverObject received]', msg);\n\n if (msg.type === 'create' && msg.to.includes('children') && _this3._isToSaveData) {\n var splitedReporterURL = splitObjectURL(msg.to);\n var url = splitedReporterURL.url;\n if (!msg.body.hasOwnProperty('mutual')) msg.body.mutual = true; //remove false when mutualAuthentication is enabled\n\n if (!(typeof msg.body.value === 'string') && msg.body.mutual) {\n ObserverObject_log.log('[SyncherManager.ObserverObject] encrypting received data ', msg.body.value);\n cryptoManager_CryptoManager.encryptDataObject(msg.body.value, url).then(function (encryptedValue) {\n ObserverObject_log.log('[SyncherManager.ObserverObject] encrypted data ', encryptedValue);\n\n _this._storeChildObject(msg, JSON.stringify(encryptedValue));\n }).catch(function (reason) {\n ObserverObject_log.warn('[SyncherManager.ObserverObject._encryptChild] failed, storing unencrypted ', reason);\n\n _this._storeChildObject(msg, msg.body.value);\n });\n } else {\n _this._storeChildObject(msg, msg.body.value);\n }\n }\n\n ObserverObject_log.log('[SyncherManager.ObserverObject children Listeners]', _this._childrenListeners, childListener);\n\n if (_this._childrenListeners.indexOf(childListener) === -1) {\n _this._childrenListeners.push(childListener);\n }\n });\n }); // });\n } // store childObject\n\n }, {\n key: \"_storeChildObject\",\n value: function _storeChildObject(msg, data) {\n var _this = this;\n\n var splitedReporterURL = splitObjectURL(msg.to);\n var url = splitedReporterURL.url;\n var resource = splitedReporterURL.resource;\n var value = {};\n /* let value = {\n identity: msg.body.identity,\n value: data\n };*/\n // this identity data is not needed to be stored\n\n /* delete value.identity.assertion;\n delete value.identity.expires;*/\n\n var objectURLResource = msg.body.resource;\n var attribute = resource;\n\n if (objectURLResource === 'heartbeat') {\n value = data;\n } else {\n value.identity = msg.body.identity;\n value.value = data;\n } // if (objectURLResource) attribute += '.' + objectURLResource;\n\n\n if (objectURLResource) attribute = objectURLResource;\n ObserverObject_log.log('[SyncherManager.ObserverObject._storeChildObject] : ', url, attribute, value);\n\n _this._parent._dataObjectsStorage.saveChildrens(false, url, attribute, value);\n }\n }, {\n key: \"removeSubscription\",\n value: function removeSubscription(msg) {\n var _this = this;\n\n var hyperty = msg.from;\n var domain = divideURL(hyperty).domain;\n var objURLSubscription = _this._url + '/subscription';\n var subscription = _this._subscriptions[hyperty];\n\n if (subscription) {\n //FLOW-OUT: message sent to remote ReporterObject -> _onRemoteUnSubscribe\n _this._bus.postMessage({\n type: 'unsubscribe',\n from: _this._parent._url,\n to: objURLSubscription,\n body: {\n source: hyperty,\n identity: msg.body.identity\n }\n }); //TODO: should I wait for response before unsubscribe on msg-node\n //FLOW-OUT: message sent to msg-node SubscriptionManager component\n\n\n _this._bus.postMessage({\n type: 'unsubscribe',\n from: _this._parent._url,\n to: 'domain://msg-node.' + domain + '/sm',\n body: {\n resource: _this._url,\n resources: [_this._url + '/children/']\n }\n });\n\n subscription._releaseListeners();\n\n delete _this._subscriptions[hyperty];\n }\n }\n }, {\n key: \"isToSaveData\",\n set: function set(value) {\n this._isToSaveData = value;\n }\n }]);\n\n return ObserverObject;\n}();\n\n/* harmony default export */ var syncher_ObserverObject = (ObserverObject_ObserverObject);\n// CONCATENATED MODULE: ./src/syncher/SyncherManager.js\nfunction SyncherManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SyncherManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SyncherManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) SyncherManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) SyncherManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar SyncherManager_log = loglevel[\"getLogger\"]('SyncherManager');\n //import { schemaValidation } from '../utils/schemaValidation';\n\n\n\n\n\n/**\n * @author micaelpedrosa@gmail.com\n * Core Syncronization system.\n */\n\nvar SyncherManager_SyncherManager =\n/*#__PURE__*/\nfunction () {\n /* private\n _url: URL\n _bus: MiniBus\n _registry: Registry\n _allocator: AddressAllocation\n _reporters: { ObjectURL: ReporterObject }\n _observers: { ObjectURL: ObserverObject }\n */\n function SyncherManager(runtimeURL, bus, registry, catalog, storageManager, allocator, storeDataObjects, identityModule) {\n SyncherManager_classCallCheck(this, SyncherManager);\n\n if (!runtimeURL) throw new Error('[Syncher Manager] - needs the runtimeURL parameter');\n if (!bus) throw new Error('[Syncher Manager] - needs the MessageBus instance');\n if (!registry) throw new Error('[Syncher Manager] - needs the Registry instance');\n if (!catalog) throw new Error('[Syncher Manager] - needs the RuntimeCatalogue instance');\n if (!storageManager) throw new Error('[Syncher Manager] - need the storageManager instance');\n\n var _this = this;\n\n _this._bus = bus;\n _this._registry = registry;\n _this._catalog = catalog;\n _this._storageManager = storageManager;\n _this._identityModule = identityModule; //TODO: these should be saved in persistence engine?\n\n _this.runtimeURL = runtimeURL;\n _this._url = runtimeURL + '/sm';\n _this._objectURL = runtimeURL + '/object-allocation';\n _this._reporters = {};\n _this._observers = {};\n _this._dataObjectsStorage = storeDataObjects;\n console.log('[NOTSAVING] storeDataObjects', storeDataObjects); //TODO: this should not be hardcoded!\n\n _this._domain = divideURL(runtimeURL).domain;\n\n if (allocator) {\n _this._allocator = allocator;\n } else {\n _this._allocator = allocation_AddressAllocation.instance;\n }\n\n SyncherManager_log.log('[SyncherManager - AddressAllocation] - ', _this._allocator);\n bus.addListener(_this._url, function (msg) {\n SyncherManager_log.info('[SyncherManager] RCV: ', msg);\n\n switch (msg.type) {\n case 'create':\n _this._onCreate(msg);\n\n break;\n\n case 'delete':\n _this._onDelete(msg);\n\n break;\n\n case 'subscribe':\n _this._onLocalSubscribe(msg);\n\n break;\n\n case 'unsubscribe':\n _this._onLocalUnSubscribe(msg);\n\n break;\n\n case 'read':\n _this._onRead(msg);\n\n break;\n\n case 'execute':\n _this._onExecute(msg);\n\n break;\n }\n });\n }\n\n SyncherManager_createClass(SyncherManager, [{\n key: \"_onExecute\",\n //FLOW-IN: message received from Syncher -> read\n value: function _onExecute(msg) {\n var _this = this;\n\n var reply = {\n type: 'response',\n from: msg.to,\n to: msg.from,\n id: msg.id\n };\n SyncherManager_log.info('[SyncherManager.onExecute] new message', msg);\n\n if (msg.hasOwnProperty('body') && msg.body.hasOwnProperty('method') && msg.body.hasOwnProperty('params')) {\n switch (msg.body.method) {\n case 'sync':\n _this._dataObjectsStorage.sync(msg.body.params[0], msg.body.params[1], false);\n\n break;\n\n case 'stopSync':\n _this._dataObjectsStorage.stopSync(msg.body.params[0]);\n\n break;\n }\n\n reply.body = {\n code: 200\n };\n\n _this._bus.postMessage(reply);\n } else {\n reply.body = {\n code: 400,\n desc: 'missing body or body method / params mandatory fields'\n };\n SyncherManager_log.error('[SyncherManager.onExecute] error. Missing body or body method / params mandatory fields', msg);\n\n _this._bus.postMessage(reply);\n }\n } //FLOW-IN: message received from Syncher -> read\n\n }, {\n key: \"_onRead\",\n value: function _onRead(msg) {\n var _this = this;\n\n var reply = {\n type: 'response',\n from: msg.to,\n to: msg.from,\n id: msg.id\n };\n SyncherManager_log.info('[SyncherManager.onRead] new message', msg);\n\n if (msg.hasOwnProperty('body') && msg.body.hasOwnProperty('resource')) {\n _this._dataObjectsStorage.sync(msg.body.resource, criteria.backupRevision, true).then(function (dataObject) {\n reply.body = {\n code: 200,\n value: dataObject\n };\n SyncherManager_log.info('[SyncherManager.onRead] found object: ', dataObject);\n\n _this._bus.postMessage(reply);\n }, function (error) {\n reply.body = {\n code: 400,\n desc: error\n };\n SyncherManager_log.error('[SyncherManager.onRead] error: ', error);\n\n _this._bus.postMessage(reply);\n });\n } else {\n reply.body = {\n code: 400,\n desc: 'missing body or body resource mandatory fields'\n };\n SyncherManager_log.error('[SyncherManager.onRead] error. Missing body or body resource mandatory fields', msg);\n\n _this._bus.postMessage(reply);\n }\n } //FLOW-IN: message received from Syncher -> create\n\n }, {\n key: \"_onCreate\",\n value: function _onCreate(msg) {\n var _this2 = this;\n\n var from = msg.from;\n var to = msg.to;\n\n var _this = this; // check if message is to save new childrenObjects in the local storage\n // TODO: check if message is to store new child in the local storage and call storeChild. How to distinguish from others?\n //debugger;\n\n\n if (msg.body.attribute) {\n this._storeChildrens(msg);\n } else {\n if (!msg.body.hasOwnProperty('resume') || msg.body.hasOwnProperty('resume') && !msg.body.resume) {\n // check if this is an invitation message\n if (msg.body.authorise) {\n this._authorise(msg);\n\n SyncherManager_log.info('[SyncherManager.onCreate - invite observers]', msg);\n } else {\n // this is to create a new data object\n SyncherManager_log.info('[SyncherManager.onCreate - Create New Object]', msg);\n\n this._newCreate(msg);\n }\n } else {\n // If from the hyperty side, call the resumeReporter we will have resume = true'\n // so we will create an resumed object and will try to resume the object previously saved;\n this._dataObjectsStorage.getResourcesByCriteria(msg, true).then(function (result) {\n SyncherManager_log.info('[SyncherManager - Create Resumed] - ResourcesByCriteria | Message: ', msg, ' result: ', result);\n\n if (result && Object.keys(result).length > 0) {\n var listOfReporters = [];\n Object.keys(result).forEach(function (objURL) {\n listOfReporters.push(_this._resumeCreate(msg, result[objURL]));\n });\n Promise.all(listOfReporters).then(function (resumedReporters) {\n SyncherManager_log.log('[SyncherManager - Create Resumed]', resumedReporters); // TODO: shoud send the information if some object was failing;\n\n var successfullyResumed = Object.values(resumedReporters).filter(function (reporter) {\n return reporter !== false;\n });\n SyncherManager_log.info('[SyncherManager.onCreate] returning resumed objects : ', successfullyResumed); //FLOW-OUT: message response to Syncher -> create resume\n\n _this2._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: to,\n to: from,\n body: {\n code: 200,\n value: deepClone(successfullyResumed)\n }\n });\n /*successfullyResumed.forEach((reporter) => {\n if (reporter.backup) {\n this._dataObjectsStorage.sync(reporter.url);\n }\n });*/\n\n });\n } else {\n //forward to hyperty:\n var reply = {};\n reply.id = msg.id;\n reply.from = msg.to;\n reply.to = msg.from;\n reply.type = 'response';\n reply.body = {\n code: 404,\n desc: 'No data objects reporters to be resumed'\n };\n\n _this2._bus.postMessage(reply);\n }\n });\n }\n }\n }\n }, {\n key: \"_storeChildrens\",\n value: function _storeChildrens(msg) {\n var _this = this;\n\n var resource = msg.body.resource;\n var attribute = msg.body.attribute;\n\n if (attribute === 'childrenObjects') {\n _this._dataObjectsStorage.saveChildrens(false, resource, undefined, msg.body.value);\n } else {\n _this._dataObjectsStorage.saveChildrens(true, resource, attribute, msg.body.value);\n }\n }\n }, {\n key: \"_newCreate\",\n value: function _newCreate(msg) {\n var _this3 = this;\n\n var _this = this;\n\n var owner = msg.from;\n var domain = divideURL(msg.from).domain; // if reporter is in a Interworking Protostub the runtime domain backend services will be used\n\n if (_this._registry.isInterworkingProtoStub(msg.from)) {\n domain = divideURL(_this.runtimeURL).domain;\n } // let domainRegistration = msg.body.value.hasOwnProperty('domain_registration') ? msg.body.value.domain_registration : true;\n\n\n var domainRouting = msg.body.value.hasOwnProperty('domain_routing') ? msg.body.value.domain_routing : true; // Process invitation message to observers\n\n /*if (msg.body.authorise) {\n _this._authorise(msg);\n return;\n }*/\n //get schema from catalogue and parse -> (scheme, children)\n\n _this._catalog.getDataSchemaDescriptor(msg.body.schema).then(function (descriptor) {\n var properties = descriptor.sourcePackage.sourceCode.properties;\n var scheme = properties.scheme ? properties.scheme : 'resource';\n var childrens = properties.childrens ? properties.childrens : []; // Do schema validation\n // TODO: check if is need to handle with the result of validation\n // schemaValidation(scheme, descriptor, msg.body.value);\n\n var objectInfo = {\n name: msg.body.value.name,\n schema: msg.body.value.schema,\n reporter: msg.body.value.reporter,\n resources: msg.body.value.resources\n }; // should resuse data object url if it passed\n\n var reuseDataObject = msg.body.value.resource;\n var numOfAddress = 1; //debugger;\n //request address allocation of a new object from the msg-node\n //_this._allocator.create(domain, numOfAddress, objectInfo, scheme, reuseDataObject).then((allocated) => {\n\n _this._allocator.create(domain, numOfAddress, objectInfo, scheme, reuseDataObject).then(function (allocated) {\n var objectRegistration = deepClone(msg.body.value);\n objectRegistration.url = allocated.address[0];\n objectRegistration.authorise = msg.body.authorise;\n objectRegistration.childrens = childrens; //objectRegistration.expires = 30;//TODO: get it from data object configuration description when present\n\n delete objectRegistration.data;\n SyncherManager_log.log('[SyncherManager._newCreate] ALLOCATOR CREATE:', allocated);\n var subscriptionURL = objectRegistration.url + '/subscription';\n SyncherManager_log.log('[SyncherManager._newCreate] Subscription URL', subscriptionURL); //To register the dataObject in the runtimeRegistry\n\n SyncherManager_log.info('[SyncherManager._newCreate] Register Object: ', objectRegistration); //_this._registry.registerDataObject(msg.body.value.name, msg.body.value.schema, objURL, msg.body.value.reporter, msg.body.value.resources, allocated, msg.body.authorise).then((resolve) => {\n\n _this._registry.registerDataObject(objectRegistration).then(function (registeredObject) {\n SyncherManager_log.log('[SyncherManager._newCreate] DataObject successfully registered', registeredObject); //all OK -> create reporter and register listeners\n\n var reporter;\n\n if (!_this3._reporters[objectRegistration.url]) {\n var offline = objectRegistration.offline ? objectRegistration.offline : false;\n reporter = new syncher_ReporterObject(_this, owner, objectRegistration.url, childrens, offline);\n } else {\n reporter = _this3._reporters[objectRegistration.url];\n }\n\n SyncherManager_log.log('[SyncherManager - new Create] - ', msg); // Store for each reporter hyperty the dataObject\n\n var userURL; // let interworking = false;\n\n if (msg.body.hasOwnProperty('identity') && msg.body.identity.userProfile && msg.body.identity.userProfile.userURL) {\n userURL = msg.body.identity.userProfile.userURL; // if (!userURL.includes('user://')) {\n // interworking = true;\n // }\n } else {\n userURL = _this._registry.getHypertyOwner(msg.from); // if (!userURL) {\n // interworking = true;\n // }\n } // should we use the msg.body.value instead?\n\n\n var metadata = deepClone(objectRegistration);\n metadata.subscriberUser = userURL;\n metadata.isReporter = true; // Store the dataObject information\n //if (!interworking) {\n\n if (msg.body.hasOwnProperty('store') && msg.body.store) {\n reporter.isToSaveData = true;\n metadata.isToSaveData = true;\n\n if (msg.body.value.data) {\n metadata.data = deepClone(msg.body.value.data); // _this._dataObjectsStorage.saveData(true, objectRegistration.url, null, msg.body.value.data); }\n // _this._dataObjectsStorage.update(true, objectRegistration.url, 'isToSaveData', true);\n // if (msg.body.value.data) { _this._dataObjectsStorage.saveData(true, objectRegistration.url, null, msg.body.value.data); }\n }\n }\n\n _this._dataObjectsStorage.set(metadata).then(function (storeObject) {\n if (metadata.offline) {\n //register new DataObject at Offline Subscription Manager\n msg.body.identity.guid = _this._identityModule._identities.guid;\n var forward = {\n from: msg.to,\n to: metadata.offline + '/register',\n type: 'forward',\n body: msg\n };\n forward.body.body.resource = objectRegistration.url;\n forward.body.body.value = metadata;\n SyncherManager_log.log('[SyncherManager.newCreate] registering new object at offline manager ', forward);\n\n _this._bus.postMessage(forward);\n } //}\n\n\n var responseMsg = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: owner,\n body: {\n code: 200,\n resource: objectRegistration.url,\n childrenResources: childrens\n }\n }; // adding listeners to forward to reporter\n\n if (domainRouting) {\n reporter.forwardSubscribe([objectRegistration.url, subscriptionURL]).then(function () {\n reporter.addChildrens().then(function () {\n _this._reporters[objectRegistration.url] = reporter; //FLOW-OUT: message response to Syncher -> create\n\n _this._bus.postMessage(responseMsg);\n });\n });\n } else {\n reporter.addChildrens().then(function () {\n _this._reporters[objectRegistration.url] = reporter; //FLOW-OUT: message response to Syncher -> create\n\n _this._bus.postMessage(responseMsg);\n });\n }\n }, function (error) {\n SyncherManager_log.error(error);\n });\n }, function (error) {\n SyncherManager_log.error(error);\n });\n });\n }).catch(function (reason) {\n //FLOW-OUT: error message response to Syncher -> create\n var responseMsg = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: owner,\n body: {\n code: 500,\n desc: reason\n }\n };\n\n _this._bus.postMessage(responseMsg);\n });\n }\n }, {\n key: \"_resumeCreate\",\n value: function _resumeCreate(msg, storedObject) {\n var _this4 = this;\n\n var _this = this;\n\n return new Promise(function (resolve) {\n var owner = msg.from;\n var schema = storedObject.schema;\n var resource = storedObject.url;\n var domainRegistration = storedObject.hasOwnProperty('domain_registration') ? storedObject.domain_registration : true;\n var initialData = storedObject.data;\n SyncherManager_log.log('[SyncherManager] - resume create', msg, storedObject); //get schema from catalogue and parse -> (scheme, children)\n\n _this._catalog.getDataSchemaDescriptor(schema).then(function (descriptor) {\n var properties = descriptor.sourcePackage.sourceCode.properties;\n var scheme = properties.scheme ? properties.scheme.constant : 'resource';\n var childrens = properties.childrens ? properties.childrens : [];\n SyncherManager_log.log('[SyncherManager] - getDataSchemaDescriptor: ', descriptor, childrens); // Do schema validation\n // TODO: check if is need to handle with the result of validation\n // schemaValidation(scheme, descriptor, initialData);\n //all OK -> create reporter and register listeners\n\n var reporter;\n var offline;\n\n if (!_this4._reporters[resource]) {\n offline = storedObject.offline ? storedObject.offline : false;\n reporter = new syncher_ReporterObject(_this, owner, resource, childrens, offline);\n } else {\n reporter = _this4._reporters[resource];\n }\n\n reporter.isToSaveData = storedObject.isToSaveData;\n\n if (offline) {\n //update new DataObject at Offline Subscription Manager\n var _msg = {\n from: _this._url,\n to: offline + '/register',\n type: 'update',\n body: {}\n };\n SyncherManager_log.log('[SyncherManager._resumeCreate] update object at offline manager ', _msg);\n\n _this._bus.postMessage(_msg);\n }\n\n if (domainRegistration) {\n reporter.forwardSubscribe([storedObject.url]).then(function () {\n SyncherManager_log.log('[SyncherManager._resumeCreate] resumingReporterSubscription ', storedObject);\n\n _this._resumeReporterSubscriptions(msg, storedObject, reporter, childrens, domainRegistration).then(function (resumeObject) {\n SyncherManager_log.log('[SyncherManager._resumeCreate] resolved resumed object ', resumeObject);\n resolve(resumeObject);\n });\n });\n } else resolve(_this._resumeReporterSubscriptions(msg, storedObject, reporter, childrens, domainRegistration)); // resolve();\n\n }).catch(function (reason) {\n SyncherManager_log.error('[SyncherManager - resume create] - fail on getDataSchemaDescriptor: ', reason);\n resolve(false);\n });\n });\n }\n }, {\n key: \"_resumeReporterSubscriptions\",\n value: function _resumeReporterSubscriptions(msg, storedObject, reporter, childrens, domainRegistration) {\n var _this = this;\n\n var resource = storedObject.url;\n var objectRegistration = deepClone(msg.body.value);\n objectRegistration.url = storedObject.url;\n objectRegistration.expires = storedObject.expires;\n objectRegistration.domain_registration = domainRegistration;\n delete objectRegistration.data;\n return new Promise(function (resolve) {\n reporter.addChildrens().then(function () {\n reporter.resumeSubscriptions(storedObject.subscriptions);\n _this._reporters[resource] = reporter;\n SyncherManager_log.info('[SyncherManager - resume create] - resolved resumed: ', storedObject);\n return _this._decryptChildrens(storedObject, childrens);\n }).then(function (decryptedObject) {\n SyncherManager_log.info('[SyncherManager._resumeReporterSubscriptions] Register Object: ', objectRegistration);\n\n _this._registry.registerDataObject(objectRegistration).then(function (registered) {\n SyncherManager_log.log('[SyncherManager._resumeReporterSubscriptions] DataObject registration successfully updated', registered);\n SyncherManager_log.log('[SyncherManager._resumeReporterSubscriptions] resolving object', decryptedObject);\n resolve(decryptedObject);\n }); // log.log('result of previous promise');\n\n }).catch(function (reason) {\n SyncherManager_log.error('[SyncherManager - resume create] - fail on addChildrens: ', reason);\n resolve(false);\n });\n });\n } // to decrypt DataChildObjects if they are encrypted\n\n }, {\n key: \"_decryptChildrens\",\n value: function _decryptChildrens(encryptedObject, childrens) {\n var _this = this;\n\n var storedObject = deepClone(encryptedObject);\n return new Promise(function (resolve) {\n if (!childrens) {\n resolve(storedObject);\n } else {\n var childrensObj = Object.keys(storedObject.childrenObjects);\n\n if (childrensObj.length === 0) {\n resolve(storedObject);\n }\n\n childrens.forEach(function (children) {\n // let childObjects = storedObject.childrenObjects[children];\n var childObjects = storedObject.childrenObjects;\n SyncherManager_log.log('[SyncherManager._decryptChildrens] dataObjectChilds to decrypt ', childObjects);\n var listOfDecryptedObjects = [];\n Object.keys(childObjects).forEach(function (childId) {\n var child = childObjects[childId];\n var owner = childId.split('#')[0];\n\n if (typeof child.value === 'string') {\n SyncherManager_log.log('[SyncherManager._decryptChildrens] createdBy ', owner, ' object: ', child.value);\n var decrypted = cryptoManager_CryptoManager.decryptDataObject(JSON.parse(child.value), storedObject.url);\n listOfDecryptedObjects.push(decrypted);\n }\n });\n Promise.all(listOfDecryptedObjects).then(function (decryptedObjects) {\n SyncherManager_log.log('[SyncherManager._decryptChildrens] returning decrypted ', decryptedObjects);\n decryptedObjects.forEach(function (decryptedObject) {\n var childId = decryptedObject.value.url;\n storedObject.childrenObjects[childId].value = decryptedObject.value;\n });\n SyncherManager_log.log('[SyncherManager._decryptChildrens] storedObject ', storedObject);\n resolve(storedObject);\n }).catch(function (reason) {\n SyncherManager_log.warn('[SyncherManager._decryptChildrens] failed : ', reason);\n });\n });\n }\n });\n } // Process invitations to observers\n\n }, {\n key: \"_authorise\",\n value: function _authorise(msg) {\n var _this = this;\n\n if (!msg.body.resource) {\n throw new Error('[SyncherManager._authorise] invitation request without data object url:', msg);\n }\n\n var objSubscriptorURL = msg.body.resource + '/subscription';\n var p2p = msg.body.p2p ? msg.body.p2p : false;\n SyncherManager_log.log('[SyncherManager - authorise] - ', msg);\n\n if (msg.body.authorise) {\n msg.body.authorise.forEach(function (hypertyURL) {\n //FLOW-OUT: send invites to list of remote Syncher -> _onRemoteCreate -> onNotification\n _this._bus.postMessage({\n type: 'create',\n from: objSubscriptorURL,\n to: hypertyURL,\n body: {\n p2p: p2p,\n identity: msg.body.identity,\n source: msg.from,\n value: msg.body.value,\n schema: msg.body.schema\n }\n }, function (reply) {\n // lets forward the invitation response\n var response = {\n from: msg.to,\n to: msg.from,\n id: msg.id,\n type: reply.type,\n body: reply.body\n };\n\n _this._bus.postMessage(response);\n });\n });\n }\n } //FLOW-IN: message received from DataObjectReporter -> delete\n\n }, {\n key: \"_onDelete\",\n value: function _onDelete(msg) {\n var _this = this;\n\n var objURL = msg.body.resource;\n var object = _this._reporters[objURL];\n\n if (object) {\n //TODO: is there any policy verification before delete?\n if (object.offline) {\n //register new DataObject at Offline Subscription Manager\n var forward = {\n from: msg.to,\n to: object.offline + '/register',\n type: 'forward',\n body: msg\n };\n SyncherManager_log.log('[SyncherManager._onDelete] unregistering object from offline manager ', forward);\n\n _this._bus.postMessage(forward);\n }\n\n object.delete();\n\n this._dataObjectsStorage.deleteResource(objURL).then(function (result) {\n SyncherManager_log.log('[SyncherManager - onDelete] - deleteResource: ', result);\n\n _this._registry.unregisterDataObject(objURL); //TODO: unregister object?\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n });\n });\n }\n } //FLOW-IN: message received from local Syncher -> subscribe\n\n }, {\n key: \"_onLocalSubscribe\",\n value: function _onLocalSubscribe(msg) {\n var _this5 = this;\n\n //debugger;\n if (msg.body.hasOwnProperty('resume') && msg.body.resume) {\n this._dataObjectsStorage.getResourcesByCriteria(msg, false).then(function (result) {\n SyncherManager_log.info('[SyncherManager.onLocalSubscribe. resume]: ', msg, ' result: ', result);\n\n if (result && Object.keys(result).length > 0) {\n var listOfObservers = []; // TODO: should reuse the stored information\n\n Object.keys(result).forEach(function (objURL) {\n SyncherManager_log.log('[SyncherManager - resume Subscribe] - reuse current object url: ', result[objURL]);\n listOfObservers.push(_this5._resumeSubscription(msg, result[objURL]));\n });\n Promise.all(listOfObservers).then(function (resumedObservers) {\n SyncherManager_log.log('[SyncherManager - Observers Resumed]', resumedObservers); // TODO: shoud send the information if some object is failing;\n\n var successfullyResumed = Object.values(resumedObservers).filter(function (observer) {\n return observer !== false;\n });\n var response = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n value: successfullyResumed\n }\n };\n SyncherManager_log.log('[SyncherManager - Observers Resumed] replying ', response); //FLOW-OUT: message response to Syncher -> create\n\n _this5._bus.postMessage(response);\n });\n } else {\n //forward to hyperty:\n var reply = {};\n reply.id = msg.id;\n reply.from = msg.to;\n reply.to = msg.from;\n reply.type = 'response';\n reply.body = {\n code: 404,\n desc: 'No data objects observers to be resumed'\n };\n\n _this5._bus.postMessage(reply);\n }\n });\n } else {\n SyncherManager_log.log('[SyncherManager.onLocalSubscribe - new Subscribe] - ', msg.body.schema, msg.body.resource);\n\n this._newSubscription(msg);\n }\n }\n }, {\n key: \"_newSubscription\",\n value: function _newSubscription(msg) {\n var _this = this;\n\n var objURL = msg.body.resource;\n var hypertyURL = msg.from;\n var domain = divideURL(objURL).domain;\n var domainSubscription = msg.body.hasOwnProperty('domain_subscription') ? msg.body.domain_subscription : true;\n var childBaseURL = objURL + '/children/'; //get schema from catalogue and parse -> (children)\n\n _this._catalog.getDataSchemaDescriptor(msg.body.schema).then(function (descriptor) {\n var properties = descriptor.sourcePackage.sourceCode.properties;\n var childrens = properties.childrens ? properties.childrens : [];\n var subscriptions = [];\n subscriptions.push(objURL + '/changes'); // childrens.forEach((child) => subscriptions.push(childBaseURL + child));\n\n subscriptions.push(childBaseURL); //children addresses\n\n if (domainSubscription) {\n //FLOW-OUT: subscribe message to the msg-node, registering listeners on the broker\n var nodeSubscribeMsg = {\n type: 'subscribe',\n from: _this._url,\n to: 'domain://msg-node.' + domain + '/sm',\n body: {\n identity: msg.body.identity,\n resources: subscriptions,\n source: hypertyURL\n }\n }; //subscribe in msg-node\n\n _this._bus.postMessage(nodeSubscribeMsg, function (reply) {\n SyncherManager_log.log('node-subscribe-response(observer): ', reply);\n console.log('REUSETEST SyncherManager - node-subscribe-response(observer): ', reply);\n\n if (reply.body.code === 200) {\n _this._newReporterSubscribe(msg, hypertyURL, objURL, childrens);\n } else {\n //listener rejected\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: hypertyURL,\n body: reply.body\n });\n }\n });\n } else _this._newReporterSubscribe(msg, hypertyURL, objURL, childrens);\n });\n }\n }, {\n key: \"_newReporterSubscribe\",\n value: function _newReporterSubscribe(msg, hypertyURL, objURL, childrens) {\n var _this = this;\n\n var objURLSubscription = objURL + '/subscription'; //FLOW-OUT: reply with provisional response\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: hypertyURL,\n body: {\n code: 100,\n childrenResources: childrens,\n schema: msg.body.schema,\n resource: msg.body.resource\n }\n }); //FLOW-OUT: subscribe message to remote ReporterObject -> _onRemoteSubscribe\n\n\n var objSubscribeMsg = {\n type: 'subscribe',\n from: _this._url,\n to: objURLSubscription,\n body: {\n identity: msg.body.identity,\n subscriber: hypertyURL\n }\n }; //TODO: For Further Study\n\n if (msg.body.hasOwnProperty('mutual')) objSubscribeMsg.body.mutual = msg.body.mutual;\n SyncherManager_log.log('[SyncherManager._newSubscription]', objSubscribeMsg, msg);\n console.log('REUSETEST SyncherManager - [SyncherManager._newSubscription]', objSubscribeMsg, msg); //subscribe to reporter SM\n\n _this._bus.postMessage(objSubscribeMsg, function (reply) {\n SyncherManager_log.log('reporter-subscribe-response-new: ', reply);\n console.log('REUSETEST SyncherManager - reporter-subscribe-response-new: ', reply);\n if (reply.body.code === 200) _this._processSuccessfullSubscription(reply, hypertyURL, objURL, childrens, msg);else if (msg.body.offline) _this._processOfflineSubscription(objSubscribeMsg, msg.body.offline, hypertyURL, objURL, childrens, msg);else {//TODO: send response back to Hyperty with error message received in the reply\n }\n });\n }\n }, {\n key: \"_processOfflineSubscription\",\n value: function _processOfflineSubscription(subscription, redirectTo, hypertyURL, objURL, childrens, msg) {\n var _this = this;\n\n var forward = {\n from: subscription.from,\n type: 'forward',\n to: redirectTo,\n body: subscription\n };\n console.log('[SyncherManager._processOfflineSubscription] forwading ', forward);\n\n _this._bus.postMessage(forward, function (reply) {\n SyncherManager_log.log('[SyncherManager._processOfflineSubscription] reply ', reply);\n if (reply.body.code === 200) _this._processSuccessfullSubscription(reply, hypertyURL, objURL, childrens, msg);else {//TODO: send response back to Hyperty with error message received in the reply\n }\n });\n }\n }, {\n key: \"_processSuccessfullSubscription\",\n value: function _processSuccessfullSubscription(reply, hypertyURL, objURL, childrens, msg) {\n var _this = this;\n\n SyncherManager_log.log('[SyncherManager._newSubscription] - observers: ', _this._observers, objURL, _this._observers[objURL]);\n console.log('REUSETEST SyncherManager - 200 code[SyncherManager._newSubscription] - observers: ', _this._observers, objURL, _this._observers[objURL]);\n var observer = _this._observers[objURL];\n\n if (!observer) {\n observer = new syncher_ObserverObject(_this, objURL, childrens);\n SyncherManager_log.log('[SyncherManager._newSubscription] - observers: create new ObserverObject: ', observer);\n _this._observers[objURL] = observer; // register new hyperty subscription\n\n observer.addSubscription(hypertyURL); // add childrens and listeners to save data if necessary\n\n observer.addChildrens();\n }\n\n var interworking = false; //debugger;\n // Store for each reporter hyperty the dataObject\n\n var userURL;\n\n if (msg.body.hasOwnProperty('identity') && msg.body.identity.userProfile && msg.body.identity.userProfile.userURL) {\n userURL = msg.body.identity.userProfile.userURL;\n\n if (!userURL.includes('user://')) {\n interworking = true;\n }\n } else {\n userURL = _this._registry.getHypertyOwner(msg.from);\n if (!userURL) interworking = true;\n }\n\n var metadata = deepClone(reply.body.value); // let childrenObjects = metadata.childrenObjects || {};\n\n delete metadata.data;\n delete metadata.childrenObjects;\n metadata.childrens = childrens;\n metadata.subscriberUser = userURL;\n metadata.isReporter = false;\n metadata.subscriberHyperty = hypertyURL;\n\n if (!interworking) {\n //_this._dataObjectsStorage.set(objURL, false, msg.body.schema, 'on', reply.body.owner, hypertyURL, childrens, userURL);\n _this._dataObjectsStorage.set(metadata);\n\n if (metadata.hasOwnProperty('store') && metadata.store || metadata.hasOwnProperty('isToSaveData') && metadata.isToSaveData) {\n observer.isToSaveData = true;\n\n _this._dataObjectsStorage.update(false, objURL, 'isToSaveData', true);\n\n _this._dataObjectsStorage.saveData(false, objURL, null, reply.body.value.data); // if (childrens) _this._dataObjectsStorage.initialObserverSync(objURL, reply.body.value.data.backupRevision);\n\n }\n } //forward to hyperty:\n\n\n reply.id = msg.id;\n reply.from = _this._url;\n reply.to = hypertyURL;\n reply.body.schema = msg.body.schema;\n reply.body.resource = msg.body.resource; //TODO: For Further Study\n\n if (msg.body.hasOwnProperty('mutual')) reply.body.mutual = msg.body.mutual;\n SyncherManager_log.log('[subscribe] - new subscription: ', msg, reply, observer);\n\n this._bus.postMessage(reply);\n }\n }, {\n key: \"_resumeSubscription\",\n value: function _resumeSubscription(msg, storedObject) {\n var _this6 = this;\n\n return new Promise(function (resolve) {\n var objURL = storedObject.url;\n var schema = storedObject.schema;\n var hypertyURL = msg.from; // let objURLSubscription = objURL + '/subscription';\n\n var childBaseURL = objURL + '/children/';\n SyncherManager_log.log('[SyncherManager - ReuseSubscription] - objURL: ', objURL, ' - schema:', schema); //get schema from catalogue and parse -> (children)\n // TODO: remove this since children resources should be available in the DataObjectsStorage\n\n _this6._catalog.getDataSchemaDescriptor(schema).then(function (descriptor) {\n var properties = descriptor.sourcePackage.sourceCode.properties;\n var childrens = properties.childrens ? properties.childrens : []; //children addresses\n\n var subscriptions = [];\n subscriptions.push(objURL + '/changes'); // childrens.forEach((child) => subscriptions.push(childBaseURL + child));\n\n subscriptions.push(childBaseURL); //FLOW-OUT: reply with provisional response\n\n _this6._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: hypertyURL,\n body: {\n code: 100,\n childrenResources: childrens,\n schema: schema,\n resource: objURL\n }\n }); //FLOW-OUT: subscribe message to remote ReporterObject -> _onRemoteSubscribe\n\n /*let objSubscribeMsg = {\n type: 'subscribe', from: this._url, to: objURLSubscription,\n body: { subscriber: hypertyURL, identity: msg.body.identity }\n };\n //subscribe to reporter SM\n this._bus.postMessage(objSubscribeMsg, (reply) => {*/\n\n\n var observer = _this6._observers[objURL];\n\n if (!observer) {\n observer = new syncher_ObserverObject(_this6, objURL, childrens);\n observer.isToSaveData = storedObject.isToSaveData;\n _this6._observers[objURL] = observer;\n } //register new hyperty subscription\n\n\n observer.addSubscription(hypertyURL);\n observer.addChildrens(); // Object.assign(storedObject.data, reply.body.value.data);\n // Object.assign(storedObject.childrens, reply.body.value.childrens);\n //log.log('[subscribe] - resume subscription: ', msg, reply, storedObject, observer);\n\n return _this6._decryptChildrens(storedObject, childrens);\n }).then(function (decryptedObject) {\n // log.log('result of previous promise');\n resolve(decryptedObject);\n }).catch(function (reason) {\n SyncherManager_log.error('[SyncherManager - resume subscription] - fail on getDataSchemaDescriptor: ', reason);\n resolve(false);\n });\n });\n } //FLOW-IN: message received from local DataObjectObserver -> unsubscribe\n\n }, {\n key: \"_onLocalUnSubscribe\",\n value: function _onLocalUnSubscribe(msg) {\n var _this = this;\n\n var hypertyURL = msg.from;\n var objURL = msg.body.resource;\n var observer = _this._observers[objURL];\n\n if (observer) {\n //TODO: is there any policy verification before delete?\n observer.removeSubscription(msg); //TODO: destroy object in the registry?\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n });\n\n this._dataObjectsStorage.deleteResource(objURL); //TODO: remove Object if no more subscription?\n\n\n delete _this._observers[objURL];\n }\n }\n }, {\n key: \"url\",\n get: function get() {\n return this._url;\n }\n }]);\n\n return SyncherManager;\n}();\n\n/* harmony default export */ var syncher_SyncherManager = (SyncherManager_SyncherManager);\n// CONCATENATED MODULE: ./src/subscriptionManager/Subscription.js\nfunction subscriptionManager_Subscription_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction subscriptionManager_Subscription_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction subscriptionManager_Subscription_createClass(Constructor, protoProps, staticProps) { if (protoProps) subscriptionManager_Subscription_defineProperties(Constructor.prototype, protoProps); if (staticProps) subscriptionManager_Subscription_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar subscriptionManager_Subscription_log = loglevel[\"getLogger\"]('Subscription');\n\nvar Subscription_Subscription =\n/*#__PURE__*/\nfunction () {\n function Subscription(bus, subscriber, resource) {\n subscriptionManager_Subscription_classCallCheck(this, Subscription);\n\n var _this = this;\n\n _this._subscriber = subscriber;\n _this.resource = resource;\n subscriptionManager_Subscription_log.log('[SubscriptionManager.Subscription] new: ', subscriber, resource); //add forward\n\n _this._listener = bus.addForward(resource, subscriber);\n }\n\n subscriptionManager_Subscription_createClass(Subscription, [{\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n _this._listener.remove();\n }\n }]);\n\n return Subscription;\n}();\n\n/* harmony default export */ var subscriptionManager_Subscription = (Subscription_Subscription);\n// CONCATENATED MODULE: ./src/subscriptionManager/SubscriptionManager.js\nfunction SubscriptionManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SubscriptionManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SubscriptionManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) SubscriptionManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) SubscriptionManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n// Log System\n\nvar SubscriptionManager_log = loglevel[\"getLogger\"]('SubscriptionManager');\n\n\n/**\n * @author paulo-g-chainho@alticelabs.com\n * Subscription Manager used to manage routing paths at the runtime.\n */\n\nvar SubscriptionManager_SubscriptionManager =\n/*#__PURE__*/\nfunction () {\n function SubscriptionManager(runtimeURL, bus, storage) {\n SubscriptionManager_classCallCheck(this, SubscriptionManager);\n\n if (!runtimeURL) throw new Error('[SubscriptionManager] - needs the runtimeURL parameter');\n if (!bus) throw new Error('[SubscriptionManager] - needs the MessageBus instance');\n\n var _this = this;\n\n _this._bus = bus;\n _this._storage = storage;\n _this._subscriptions = {};\n _this._subscriptionsStorage = {}; //TODO: these should be saved in persistence engine?\n\n _this.runtimeURL = runtimeURL;\n _this._url = runtimeURL + '/subscriptions'; //TODO: this should not be hardcoded!\n\n _this._domain = divideURL(runtimeURL).domain;\n bus.addListener(_this._url, function (msg) {\n SubscriptionManager_log.info('[SubscriptionManager] RCV: ', msg);\n\n switch (msg.type) {\n case 'subscribe':\n _this._onSubscribe(msg);\n\n break;\n\n case 'unsubscribe':\n _this._onUnSubscribe(msg);\n\n break;\n\n case 'read':\n _this._onRead(msg);\n\n break;\n }\n });\n }\n\n SubscriptionManager_createClass(SubscriptionManager, [{\n key: \"init\",\n value: function init() {\n var _this = this;\n\n return new Promise(function (resolve) {\n _this._storage.get('subscriptions').then(function (subscriptions) {\n SubscriptionManager_log.log('[SubscriptionManager.init] resume subscriptions: ', subscriptions);\n\n if (subscriptions) {\n _this._subscriptionsStorage = subscriptions;\n Object.values(subscriptions).forEach(function (subscription) {\n _this.createSubscription(subscription.domain, subscription.resources, subscription.subscriber, subscription.identity);\n });\n }\n\n resolve();\n });\n });\n }\n }, {\n key: \"_onSubscribe\",\n //message received to set a routing path\n value: function _onSubscribe(msg) {\n var _this = this;\n\n var resources = msg.body.resources;\n var subscriber = msg.from;\n var domain = divideURL(resources[0]).domain; //we are assuming resources are all from the same domain\n\n var identity = msg.body.identity;\n\n _this.createSubscription(domain, resources, subscriber, identity).then(function (reply) {\n //forward to hyperty:\n reply.id = msg.id;\n reply.from = _this._url;\n reply.to = subscriber;\n reply.body = msg.body;\n reply.body.code = 200;\n SubscriptionManager_log.log('[SubscriptionManager] - craeteSubscription: ', msg, reply, subscriber);\n\n _this._bus.postMessage(reply);\n\n if (!_this._subscriptionsStorage[subscriber]) {\n _this._subscriptionsStorage[subscriber] = {\n domain: domain,\n resources: resources,\n subscriber: subscriber,\n identity: identity\n };\n } else {\n resources.forEach(function (resource) {\n if (!_this._subscriptionsStorage[subscriber].resources.includes(resource)) {\n _this._subscriptionsStorage[subscriber].resources.push(resource);\n }\n });\n }\n\n _this._storage.set('subscriptions', 1, _this._subscriptionsStorage);\n });\n }\n }, {\n key: \"createSubscription\",\n value: function createSubscription(domain, resources, subscriber, identity) {\n var _this = this; //debugger;\n\n\n return new Promise(function (resolve) {\n //FLOW-OUT: subscribe message to the msg-node, registering listeners on the broker\n var nodeSubscribeMsg = {\n type: 'subscribe',\n from: _this._url,\n to: 'domain://msg-node.' + domain + '/sm',\n body: {\n identity: identity,\n resources: resources,\n source: subscriber\n }\n }; //subscribe in msg-node\n\n _this._bus.postMessage(nodeSubscribeMsg, function (reply) {\n SubscriptionManager_log.log('[SubscriptionManager] node-subscribe-response: ', reply); //if (reply.body.code === 200) {//TODO: uncomment when MN replies with correct response body code\n //TODO: support multiple routes for multiple resources\n\n var subscription = _this._subscriptions[subscriber];\n SubscriptionManager_log.log('[SubscriptionManager] - ', _this._subscriptions, resources, _this._subscriptions.hasOwnProperty(subscriber));\n\n if (!subscription) {\n _this._subscriptions[subscriber] = {};\n }\n\n resources.forEach(function (resource) {\n _this._subscriptions[subscriber][resource] = new subscriptionManager_Subscription(_this._bus, subscriber, resource);\n });\n resolve(reply);\n });\n });\n } // message received to remove routing path\n\n }, {\n key: \"_onUnSubscribe\",\n value: function _onUnSubscribe(msg) {\n var _this = this;\n\n var unsubscriber = msg.from;\n var resource = msg.body.resource;\n\n if (_this._subscriptions[unsubscriber] && _this._subscriptions[unsubscriber][resource]) {\n var domain = divideURL(resource).domain;\n var subscription = _this._subscriptions[unsubscriber][resource]; //FLOW-OUT: message sent to msg-node SubscriptionManager component\n\n _this._bus.postMessage({\n type: 'unsubscribe',\n from: _this._url,\n to: 'domain://msg-node.' + domain + '/sm',\n body: {\n resources: [resource],\n source: unsubscriber\n }\n });\n\n subscription._releaseListeners();\n\n delete _this._subscriptions[unsubscriber][resource];\n\n if (_this._subscriptionsStorage[unsubscriber]) {\n var i = _this._subscriptionsStorage[unsubscriber].resources.indexOf(resource);\n\n if (i != -1) {\n _this._subscriptionsStorage[unsubscriber].resources.splice(i, 1);\n }\n\n _this._storage.set('subscriptions', 1, _this._subscriptionsStorage);\n }\n }\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n });\n } //message received to read existing routing paths. At this point limited to read all existing routing paths set for one listener\n\n }, {\n key: \"_onRead\",\n value: function _onRead(msg) {\n var _this = this;\n\n var listenerAddress = msg.body.resource;\n var reply;\n SubscriptionManager_log.log('[SubscriptionManager] - request to read Subscriptions: ', msg);\n\n _this._storage.get('subscriptions').then(function (subscriptions) {\n if (subscriptions && subscriptions[listenerAddress]) {\n var resources = subscriptions[listenerAddress].resources;\n reply = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n value: resources\n }\n };\n } else {\n reply = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 404,\n description: 'Not Found'\n }\n };\n }\n\n _this._bus.postMessage(reply);\n });\n }\n }, {\n key: \"url\",\n get: function get() {\n return this._url;\n }\n }]);\n\n return SubscriptionManager;\n}();\n\n/* harmony default export */ var subscriptionManager_SubscriptionManager = (SubscriptionManager_SubscriptionManager);\n// CONCATENATED MODULE: ./src/policy/ReThinkCtx.js\nfunction ReThinkCtx_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ReThinkCtx_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ReThinkCtx_createClass(Constructor, protoProps, staticProps) { if (protoProps) ReThinkCtx_defineProperties(Constructor.prototype, protoProps); if (staticProps) ReThinkCtx_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar ReThinkCtx_ReThinkCtx =\n/*#__PURE__*/\nfunction () {\n function ReThinkCtx() {\n ReThinkCtx_classCallCheck(this, ReThinkCtx);\n\n this.defaultBehaviour = true;\n this.groups = {};\n }\n\n ReThinkCtx_createClass(ReThinkCtx, [{\n key: \"scheme\",\n get: function get() {\n return this._scheme;\n },\n set: function set(params) {\n var from = params.message.from;\n\n if (isDataObjectURL(from)) {\n this._scheme = divideURL(from).type;\n } else {\n this._scheme = undefined;\n }\n }\n }, {\n key: \"date\",\n get: function get() {\n return this._date;\n },\n set: function set(now) {\n var date = new Date();\n var day = String(date.getDate());\n\n if (day.length === 1) {\n day = '0' + day;\n }\n\n var month = String(date.getMonth() + 1);\n\n if (month.length === 1) {\n month = '0' + month;\n }\n\n this._date = day + '/' + month + '/' + date.getFullYear();\n }\n }, {\n key: \"domain\",\n get: function get() {\n return this._domain;\n },\n set: function set(params) {\n if (params.message.body.identity !== undefined) {\n this._domain = divideEmail(params.message.body.identity.userProfile.username).domain;\n }\n }\n }, {\n key: \"type\",\n get: function get() {\n return this._type;\n },\n set: function set(params) {\n var message = params.message;\n\n if (message.body.value !== undefined) {\n this._type = message.body.value.resourceType;\n }\n }\n }, {\n key: \"source\",\n get: function get() {\n return this._source;\n },\n set: function set(params) {\n if (params.message.body.identity !== undefined) {\n this._source = params.message.body.identity.userProfile.username;\n }\n }\n }, {\n key: \"time\",\n get: function get() {\n return this._time;\n },\n set: function set(now) {\n now = new Date();\n var minutes = String(now.getMinutes());\n\n if (minutes.length === 1) {\n minutes = '0' + minutes;\n }\n\n this._time = parseInt(String(now.getHours()) + minutes);\n }\n }, {\n key: \"weekday\",\n get: function get() {\n return this._weekday;\n },\n set: function set(now) {\n this._weekday = String(new Date().getDay());\n }\n }]);\n\n return ReThinkCtx;\n}();\n\n/* harmony default export */ var policy_ReThinkCtx = (ReThinkCtx_ReThinkCtx);\n// CONCATENATED MODULE: ./src/policy/context/RuntimeCoreCtx.js\nfunction RuntimeCoreCtx_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { RuntimeCoreCtx_typeof = function _typeof(obj) { return typeof obj; }; } else { RuntimeCoreCtx_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return RuntimeCoreCtx_typeof(obj); }\n\nfunction RuntimeCoreCtx_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RuntimeCoreCtx_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RuntimeCoreCtx_createClass(Constructor, protoProps, staticProps) { if (protoProps) RuntimeCoreCtx_defineProperties(Constructor.prototype, protoProps); if (staticProps) RuntimeCoreCtx_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction RuntimeCoreCtx_possibleConstructorReturn(self, call) { if (call && (RuntimeCoreCtx_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return RuntimeCoreCtx_assertThisInitialized(self); }\n\nfunction RuntimeCoreCtx_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction RuntimeCoreCtx_getPrototypeOf(o) { RuntimeCoreCtx_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return RuntimeCoreCtx_getPrototypeOf(o); }\n\nfunction RuntimeCoreCtx_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) RuntimeCoreCtx_setPrototypeOf(subClass, superClass); }\n\nfunction RuntimeCoreCtx_setPrototypeOf(o, p) { RuntimeCoreCtx_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return RuntimeCoreCtx_setPrototypeOf(o, p); }\n\n\nvar RuntimeCoreCtx_log = loglevel[\"getLogger\"]('PEP');\n\n\n\n\n\n\nvar RuntimeCoreCtx_RuntimeCoreCtx =\n/*#__PURE__*/\nfunction (_ReThinkCtx) {\n RuntimeCoreCtx_inherits(RuntimeCoreCtx, _ReThinkCtx);\n\n function RuntimeCoreCtx(runtimeURL, idModule, runtimeRegistry, storageManager, runtimeCapabilities) {\n var _this2;\n\n RuntimeCoreCtx_classCallCheck(this, RuntimeCoreCtx);\n\n _this2 = RuntimeCoreCtx_possibleConstructorReturn(this, RuntimeCoreCtx_getPrototypeOf(RuntimeCoreCtx).call(this));\n _this2._runtimeURL = runtimeURL;\n _this2._pepURL = _this2._runtimeURL + '/pep';\n _this2._guiURL = _this2._runtimeURL + '/policy-gui';\n _this2.idModule = idModule;\n _this2.runtimeRegistry = runtimeRegistry;\n _this2.activeUserPolicy = undefined;\n _this2.serviceProviderPolicy = {};\n _this2.userPolicies = {};\n _this2.storageManager = storageManager;\n _this2.runtimeCapabilities = runtimeCapabilities;\n return _this2;\n }\n\n RuntimeCoreCtx_createClass(RuntimeCoreCtx, [{\n key: \"loadConfigurations\",\n value: function loadConfigurations() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.log(_this.storageManager);\n\n _this.storageManager.get('rethink:activePolicy').then(function (value) {\n _this.activeUserPolicy = value;\n return _this.storageManager.get('rethink:groups');\n }).then(function (groupInfo) {\n var groups = groupInfo;\n _this.groups = groups === undefined ? {} : groups;\n return _this.storageManager.get('rethink:spPolicies');\n }).then(function (policiesInfo) {\n var spPolicies = policiesInfo;\n _this.serviceProviderPolicy = spPolicies === undefined ? {} : spPolicies;\n\n _this._loadUserPolicies().then(function () {\n resolve();\n });\n });\n });\n }\n }, {\n key: \"getPolicies\",\n value: function getPolicies(message, isIncomingMessage) {\n var policies = {};\n\n if (this.activeUserPolicy !== undefined) {\n policies.userPolicy = this.userPolicies[this.activeUserPolicy];\n }\n\n policies.serviceProviderPolicy = this.getServiceProviderPolicy(message, isIncomingMessage);\n return policies;\n }\n }, {\n key: \"_isValidUpdate\",\n value: function _isValidUpdate(message) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (message.from.split('://').length > 1) {\n _this.idModule._getHypertyFromDataObject(message.from).then(function (hypertyURL) {\n if (hypertyURL === message.body.source) {\n resolve(message);\n } else {\n reject('The source of the message is not valid.');\n }\n }, function (error) {\n reject(error);\n });\n } else {\n resolve(message);\n }\n });\n }\n }, {\n key: \"getMyEmails\",\n value: function getMyEmails() {\n var identities = this.idModule.getIdentities();\n var emails = [];\n\n for (var i in identities) {\n emails.push(getUserEmailFromURL(identities[i].identity));\n }\n\n return emails;\n }\n }, {\n key: \"getMyHyperties\",\n value: function getMyHyperties() {\n var hyperties = this.runtimeRegistry.hypertiesList;\n var hypertiesNames = [];\n\n for (var i in hyperties) {\n var hypertyName = hyperties[i].objectName;\n\n if (hypertiesNames.indexOf(hypertyName) === -1) {\n hypertiesNames.push(hypertyName);\n }\n }\n\n return hypertiesNames;\n }\n }, {\n key: \"getServiceProviderPolicy\",\n value: function getServiceProviderPolicy(message, isIncoming) {\n var policy;\n\n if (isIncoming) {\n var toHyperty = this.runtimeRegistry.getHypertyName(message.to);\n policy = this.serviceProviderPolicy[toHyperty];\n } else {\n var fromHyperty = this.runtimeRegistry.getHypertyName(message.from);\n policy = this.serviceProviderPolicy[fromHyperty];\n }\n\n return policy;\n }\n }, {\n key: \"getURL\",\n value: function getURL(url) {\n var splitURL = url.split('/');\n return splitURL[0] + '//' + splitURL[2] + '/' + splitURL[3];\n }\n /**\n * Creates a group with the given name.\n * @param {String} groupName\n */\n\n }, {\n key: \"_loadUserPolicies\",\n value: function _loadUserPolicies() {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.storageManager.get('rethink:userPolicies').then(function (value) {\n var policies = value;\n\n if (policies !== undefined) {\n for (var i in policies) {\n _this3.pep.addPolicy('USER', i, policies[i]);\n }\n }\n\n resolve();\n });\n });\n }\n }, {\n key: \"_getLastComponentOfURL\",\n value: function _getLastComponentOfURL(url) {\n var split = url.split('/');\n return split[split.length - 1];\n }\n }, {\n key: \"_getPoliciesJSON\",\n value: function _getPoliciesJSON(policies) {\n for (var i in policies) {\n var combiningAlgorithm = policies[i].combiningAlgorithm;\n\n if (combiningAlgorithm instanceof combiningAlgorithms_BlockOverrides) {\n policies[i].combiningAlgorithm = 'blockOverrides';\n } else {\n if (combiningAlgorithm instanceof combiningAlgorithms_AllowOverrides) {\n policies[i].combiningAlgorithm = 'allowOverrides';\n } else {\n if (combiningAlgorithm instanceof combiningAlgorithms_FirstApplicable) {\n policies[i].combiningAlgorithm = 'firstApplicable';\n } else {\n policies[i].combiningAlgorithm = undefined;\n }\n }\n }\n }\n\n return policies;\n }\n }, {\n key: \"saveActivePolicy\",\n value: function saveActivePolicy() {\n var _this4 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.storageManager.set('rethink:activePolicy', 0, _this4.activeUserPolicy).then(function () {\n resolve();\n });\n });\n }\n }, {\n key: \"saveGroups\",\n value: function saveGroups() {\n var _this5 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.storageManager.set('rethink:groups', 0, _this5.groups).then(function () {\n resolve();\n });\n });\n }\n }, {\n key: \"savePolicies\",\n value: function savePolicies(source, policy, key) {\n var policiesJson;\n\n switch (source) {\n case 'USER':\n policiesJson = JSON.stringify(this.userPolicies);\n policiesJson = this._getPoliciesJSON(JSON.parse(policiesJson));\n this.storageManager.set('rethink:userPolicies', 0, policiesJson);\n break;\n\n case 'SERVICE_PROVIDER':\n if (policy !== undefined & key !== undefined) {\n this.serviceProviderPolicy[key] = policy;\n }\n\n policiesJson = JSON.stringify(this.serviceProviderPolicy);\n policiesJson = this._getPoliciesJSON(JSON.parse(policiesJson));\n this.storageManager.set('rethink:spPolicies', 0, policiesJson);\n break;\n\n default:\n throw Error('Unknown policy source: ' + source);\n }\n }\n }, {\n key: \"getGroupsNames\",\n value: function getGroupsNames() {\n var myGroups = this.groups;\n var groupsNames = [];\n\n if (myGroups !== undefined) {\n for (var groupName in myGroups) {\n groupsNames.push(groupName);\n }\n }\n\n return groupsNames;\n }\n }, {\n key: \"getGroup\",\n value: function getGroup(groupName, destination) {\n var members = [];\n\n if (groupName === 'preauthorised') {\n var dataObjectURL = destination.split('/');\n dataObjectURL.pop();\n dataObjectURL = dataObjectURL[0] + '//' + dataObjectURL[2];\n members = this.runtimeRegistry.getPreAuthSubscribers(dataObjectURL);\n } else {\n if (this.groups[groupName] !== undefined) {\n members = this.groups[groupName];\n }\n }\n\n return members;\n }\n /**\n * Creates a group with the given name.\n * @param {String} groupName\n */\n\n }, {\n key: \"createGroup\",\n value: function createGroup(groupName) {\n this.groups[groupName] = [];\n this.saveGroups();\n }\n }, {\n key: \"deleteGroup\",\n value: function deleteGroup(groupName) {\n delete this.groups[groupName];\n this.saveGroups();\n }\n /**\n * Adds the given user email to the group with the given name.\n * @param {String} userEmail\n * @param {String} groupName\n */\n\n }, {\n key: \"addToGroup\",\n value: function addToGroup(groupName, userEmail) {\n var myGroups = this.groups;\n\n if (myGroups[groupName] !== undefined) {\n if (myGroups[groupName].indexOf(userEmail) === -1) {\n myGroups[groupName].push(userEmail);\n this.saveGroups();\n }\n } else {\n throw Error('Group \"' + groupName + '\" does not exist!');\n }\n }\n }, {\n key: \"removeFromGroup\",\n value: function removeFromGroup(groupName, userEmail) {\n var group = this.groups[groupName];\n group.splice(group.indexOf(userEmail), 1);\n this.saveGroups();\n }\n }, {\n key: \"pepURL\",\n get: function get() {\n var _this = this;\n\n return _this._pepURL;\n }\n }, {\n key: \"guiURL\",\n get: function get() {\n var _this = this;\n\n return _this._guiURL;\n }\n }, {\n key: \"runtimeURL\",\n get: function get() {\n var _this = this;\n\n return _this._runtimeURL;\n }\n /**\n * return the messageBus in this Registry\n * @param {MessageBus} messageBus\n */\n\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this._messageBus;\n }\n /**\n * Set the messageBus in this Registry\n * @param {MessageBus} messageBus\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this._messageBus = messageBus;\n }\n }, {\n key: \"subscription\",\n get: function get() {\n return this._subscription;\n },\n set: function set(params) {\n this._subscription = params.message.body.subscriber;\n }\n }]);\n\n return RuntimeCoreCtx;\n}(policy_ReThinkCtx);\n\n/* harmony default export */ var context_RuntimeCoreCtx = (RuntimeCoreCtx_RuntimeCoreCtx);\n// EXTERNAL MODULE: ./node_modules/tv4/tv4.js\nvar tv4 = __webpack_require__(87);\nvar tv4_default = /*#__PURE__*/__webpack_require__.n(tv4);\n\n// CONCATENATED MODULE: ./src/runtime-catalogue/RethinkObject.js\nfunction RethinkObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RethinkObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RethinkObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) RethinkObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) RethinkObject_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n * Copyright 2016 PT Inovação e Sistemas SA\n * Copyright 2016 INESC-ID\n * Copyright 2016 QUOBIS NETWORKS SL\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n * Copyright 2016 ORANGE SA\n * Copyright 2016 Deutsche Telekom AG\n * Copyright 2016 Apizee\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n **/\n\nvar RethinkObject_RethinkObject =\n/*#__PURE__*/\nfunction () {\n function RethinkObject() {\n RethinkObject_classCallCheck(this, RethinkObject);\n }\n\n RethinkObject_createClass(RethinkObject, [{\n key: \"validate\",\n\n /**\n * Validates this RethinkObject against the provided schema.\n *\n * LIMITATIONS: The provided schema cannot contain references to other schemas, since they can't be resolved.\n * @param schema - schema to validate against\n * @returns {boolean} true if valid, false otherwise\n */\n value: function validate(schema) {\n // add schema itself so local references work\n tv4_default.a.addSchema(schema.id, schema); // JSON stringify -> parse needed to have proper validation\n\n var result = tv4_default.a.validateMultiple(JSON.parse(JSON.stringify(this)), schema); // delete error stacks to improve logging\n\n result.errors.forEach(function (error) {\n delete error.stack;\n }); // print more details about validation if it fails or schema contains $refs\n\n if (!result.valid || result.missing.length > 0) {\n console.warn(\"Object validation \" + (result.valid ? \"succeeded, but schema contained references:\" : \"failed:\"), JSON.stringify(result, null, 2));\n console.log(\"Object:\", JSON.stringify(this, null, 2));\n }\n\n return result.valid;\n }\n }]);\n\n return RethinkObject;\n}();\n/* harmony default export */ var runtime_catalogue_RethinkObject = (RethinkObject_RethinkObject);\n// CONCATENATED MODULE: ./src/runtime-catalogue/CatalogueDataObject.js\nfunction CatalogueDataObject_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { CatalogueDataObject_typeof = function _typeof(obj) { return typeof obj; }; } else { CatalogueDataObject_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return CatalogueDataObject_typeof(obj); }\n\nfunction CatalogueDataObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction CatalogueDataObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CatalogueDataObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) CatalogueDataObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) CatalogueDataObject_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction CatalogueDataObject_possibleConstructorReturn(self, call) { if (call && (CatalogueDataObject_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return CatalogueDataObject_assertThisInitialized(self); }\n\nfunction CatalogueDataObject_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction CatalogueDataObject_getPrototypeOf(o) { CatalogueDataObject_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return CatalogueDataObject_getPrototypeOf(o); }\n\nfunction CatalogueDataObject_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) CatalogueDataObject_setPrototypeOf(subClass, superClass); }\n\nfunction CatalogueDataObject_setPrototypeOf(o, p) { CatalogueDataObject_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return CatalogueDataObject_setPrototypeOf(o, p); }\n\n/**\n * Copyright 2016 PT Inovação e Sistemas SA\n * Copyright 2016 INESC-ID\n * Copyright 2016 QUOBIS NETWORKS SL\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n * Copyright 2016 ORANGE SA\n * Copyright 2016 Deutsche Telekom AG\n * Copyright 2016 Apizee\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n **/\n\n/**\n * @author alice.cheambe[at]fokus.fraunhofer.de\n * The CatalogueDataObject class is the representation of the reTHINK Catalogue Data Model\n */\n\nvar CatalogueDataObject =\n/*#__PURE__*/\nfunction (_RethinkObject) {\n CatalogueDataObject_inherits(CatalogueDataObject, _RethinkObject);\n\n /**\n * Creates the Catalogue Data Object\n * @param guid - Global Unique identifier of the Catalogue Object (e.g. Hyperty descriptor, ProtocolStub descriptor,\n * etc) enabling the same object to be stored and discovered in different Catalogues. That means, guid corresponds to\n * [resource-type-id] per BNF of Resource Path. Couldn't we have problems with too long URL paths?\n * @param type - indicates the type of Catalogue Data Object e.g. Hyperty, ProtocolStub, etc\n * @param {string} version - Indicates the version of Catalogue Data\n * @param objectName - human-understandable name of the catalogue object e.g. \"My Awesome Hyperty\"\n * @param description - description of the source package\n * @param language - the programming language used in the SourcePackage.SourceCode\n * @param sourcePackageURL - A string containing the URL from where the source code package of the corresponding\n * catalogue object, e.g. deployable packages containing executable code for Hyperties or ProtoStubs, can be downloaded\n */\n function CatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL) {\n var _this;\n\n CatalogueDataObject_classCallCheck(this, CatalogueDataObject);\n\n _this = CatalogueDataObject_possibleConstructorReturn(this, CatalogueDataObject_getPrototypeOf(CatalogueDataObject).call(this));\n _this._guid = guid;\n _this._type = type;\n _this._version = version;\n _this._objectName = objectName;\n _this._description = description;\n _this._language = language;\n _this._sourcePackageURL = sourcePackageURL;\n _this._signature = null;\n _this._sourcePackage = null;\n return _this;\n } // Getters\n\n\n CatalogueDataObject_createClass(CatalogueDataObject, [{\n key: \"guid\",\n get: function get() {\n return this._guid;\n },\n set: function set(guid) {\n if (guid) this._guid = guid;\n }\n }, {\n key: \"type\",\n get: function get() {\n return this._type;\n },\n set: function set(type) {\n if (type) this._type = type;\n }\n }, {\n key: \"version\",\n get: function get() {\n return this._version;\n },\n set: function set(version) {\n if (version) {\n this._version = version;\n }\n }\n }, {\n key: \"objectName\",\n get: function get() {\n return this._objectName;\n },\n set: function set(objectName) {\n if (objectName) this._objectName = objectName;\n }\n }, {\n key: \"description\",\n get: function get() {\n return this._description;\n },\n set: function set(description) {\n if (description) this._description = description;\n }\n }, {\n key: \"language\",\n get: function get() {\n return this._language;\n },\n set: function set(language) {\n if (language) this._language = language;\n }\n }, {\n key: \"signature\",\n get: function get() {\n return this._signature;\n },\n // Setters\n\n /**\n * Set the signature to enables integrity and authenticity verification\n * @param signature\n */\n set: function set(signature) {\n if (signature) this._signature = signature;\n }\n }, {\n key: \"sourcePackage\",\n get: function get() {\n return this._sourcePackage;\n },\n set: function set(sourcePackage) {\n if (sourcePackage) this._sourcePackage = sourcePackage;\n }\n }, {\n key: \"sourcePackageURL\",\n get: function get() {\n return this._sourcePackageURL;\n },\n set: function set(sourcePackageURL) {\n if (sourcePackageURL) this._sourcePackageURL = sourcePackageURL;\n }\n }]);\n\n return CatalogueDataObject;\n}(runtime_catalogue_RethinkObject); //Alice: removed POLICY_ENFORCER: 'policy_enforcer', DATA_SCHEMA: 'data_schema' from the list\n//wrt: https://github.com/reTHINK-project/dev-service-framework/blob/develop/docs/datamodel/core/hyperty-catalogue/readme.md#data-object-schema\n\n\nvar CatalogueObjectType = {\n HYPERTY: 'hyperty',\n PROTOSTUB: 'protostub',\n HYPERTY_RUNTIME: 'hyperty_runtime',\n HYPERTY_INTERCEPTOR: 'hyperty_inspector',\n HYPERTY_DATA_OBJECT: 'hyperty_data_object'\n};\nvar DataObjectSourceLanguage = {\n JAVASCRIPT_ECMA6: 'javascript_ecma6',\n JAVASCRIPT_ECMA5: 'javascript_ecma5',\n JSON_SCHEMA_V4: 'json_schema_v4',\n PYTHON: 'python',\n TYPESCRIPT: 'typescript'\n};\n/* harmony default export */ var runtime_catalogue_CatalogueDataObject = (CatalogueDataObject);\n// CONCATENATED MODULE: ./src/runtime-catalogue/SourcePackage.js\nfunction SourcePackage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SourcePackage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SourcePackage_createClass(Constructor, protoProps, staticProps) { if (protoProps) SourcePackage_defineProperties(Constructor.prototype, protoProps); if (staticProps) SourcePackage_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n * Created by amo on 14/11/2015.\n */\nvar SourcePackage =\n/*#__PURE__*/\nfunction () {\n function SourcePackage(sourceCodeClassname, sourceCode) {\n SourcePackage_classCallCheck(this, SourcePackage);\n\n this._sourceCode = sourceCode;\n this._sourceCodeClassname = sourceCodeClassname;\n this._encoding = null;\n this._signature = null;\n }\n\n SourcePackage_createClass(SourcePackage, [{\n key: \"sourceCode\",\n get: function get() {\n return this._sourceCode;\n },\n set: function set(sourceCode) {\n if (sourceCode) this._sourceCode = sourceCode;\n }\n }, {\n key: \"sourceCodeClassname\",\n get: function get() {\n return this._sourceCodeClassname;\n },\n set: function set(sourceCodeClassname) {\n if (sourceCodeClassname) this._sourceCodeClassname = sourceCodeClassname;\n }\n }, {\n key: \"encoding\",\n get: function get() {\n return this._encoding;\n },\n set: function set(encoding) {\n if (encoding) this._encoding = encoding;\n }\n }, {\n key: \"signature\",\n get: function get() {\n return this._signature;\n },\n set: function set(sign) {\n if (sign) this._signature = sign;\n }\n }]);\n\n return SourcePackage;\n}();\n\n/* harmony default export */ var runtime_catalogue_SourcePackage = (SourcePackage);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyDescriptor.js\nfunction HypertyDescriptor_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { HypertyDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return HypertyDescriptor_typeof(obj); }\n\nfunction HypertyDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyDescriptor_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return HypertyDescriptor_assertThisInitialized(self); }\n\nfunction HypertyDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction HypertyDescriptor_getPrototypeOf(o) { HypertyDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyDescriptor_getPrototypeOf(o); }\n\nfunction HypertyDescriptor_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyDescriptor_setPrototypeOf(o, p) { HypertyDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyDescriptor_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n * Created by amo on 14/11/2015.\n */\n\n\nvar HypertyDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyDescriptor_inherits(HypertyDescriptor, _CatalogueDataObject);\n\n /**\n *\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object enabling the same object to be\n * stored and discovered in different Catalogues. Guid corresponds to per BNF of Resource Path.\n * @param {CatalogueObjectType} catalogueType - \tIndicates the type of Catalogue Data Object\n * @param {string} version\n * @param {string} objectName\n * @param {string} description\n * @param {string} language\n * @param {string} sourcePackageURL\n * @param {HypertyResourceType[]} hypertyType A tag that identifies what type of hyperty is described in the object.\n * @param {URL.HypertyCatalogueURLList} dataObjectUrls - It defines the Data Object Schemas supported by the Hyperty\n * through a list of Catalogue URLs from where these schemas can be reached\n */\n function HypertyDescriptor(guid, catalogueType, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjectUrls) {\n var _this;\n\n HypertyDescriptor_classCallCheck(this, HypertyDescriptor);\n\n _this = HypertyDescriptor_possibleConstructorReturn(this, HypertyDescriptor_getPrototypeOf(HypertyDescriptor).call(this, guid, catalogueType, version, objectName, description, language, sourcePackageURL));\n _this._configuration = {};\n _this._constraints = {};\n _this._policies = {};\n _this._messageSchema = null;\n _this._hypertyType = hypertyType;\n _this._dataObjects = dataObjectUrls;\n return _this;\n }\n\n HypertyDescriptor_createClass(HypertyDescriptor, [{\n key: \"hypertyType\",\n get: function get() {\n return this._hypertyType;\n },\n set: function set(hType) {\n if (hType) this._hypertyType = hType;\n }\n }, {\n key: \"dataObjects\",\n get: function get() {\n return this._dataObjects;\n },\n set: function set(dataObjects) {\n if (dataObjects) this._dataObjects = dataObjects;\n }\n }, {\n key: \"configuration\",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n if (configuration) this._configuration = configuration;\n }\n }, {\n key: \"constraints\",\n get: function get() {\n return this._constraints;\n },\n set: function set(constraints) {\n if (constraints) this._constraints = constraints;\n }\n }, {\n key: \"messageSchema\",\n get: function get() {\n return this._messageSchema;\n },\n set: function set(messageSchema) {\n if (messageSchema) this._messageSchema = messageSchema;\n }\n }, {\n key: \"policies\",\n get: function get() {\n return this._policies;\n },\n set: function set(policies) {\n if (policies) this._policies = policies;\n }\n }]);\n\n return HypertyDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\nvar RuntimeHypertyCapabilityType = {};\nvar HypertyType = {\n COMMUNICATOR: 'communicator',\n IDENTITY: 'identity',\n CONTEXT: 'context'\n};\nvar HypertyResourceType = {\n chat: 'CHAT',\n audio: 'Audio',\n video: 'Video',\n av: 'AV',\n screen: 'SCREEN',\n file: 'FILe',\n midi: 'MIDI'\n};\n/* harmony default export */ var runtime_catalogue_HypertyDescriptor = (HypertyDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/ProtocolStubDescriptor.js\nfunction ProtocolStubDescriptor_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { ProtocolStubDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { ProtocolStubDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return ProtocolStubDescriptor_typeof(obj); }\n\nfunction ProtocolStubDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ProtocolStubDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ProtocolStubDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) ProtocolStubDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) ProtocolStubDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction ProtocolStubDescriptor_possibleConstructorReturn(self, call) { if (call && (ProtocolStubDescriptor_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return ProtocolStubDescriptor_assertThisInitialized(self); }\n\nfunction ProtocolStubDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction ProtocolStubDescriptor_getPrototypeOf(o) { ProtocolStubDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ProtocolStubDescriptor_getPrototypeOf(o); }\n\nfunction ProtocolStubDescriptor_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ProtocolStubDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction ProtocolStubDescriptor_setPrototypeOf(o, p) { ProtocolStubDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ProtocolStubDescriptor_setPrototypeOf(o, p); }\n\n/**\n * Copyright 2016 PT Inovação e Sistemas SA\n * Copyright 2016 INESC-ID\n * Copyright 2016 QUOBIS NETWORKS SL\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n * Copyright 2016 ORANGE SA\n * Copyright 2016 Deutsche Telekom AG\n * Copyright 2016 Apizee\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n **/\n\n/**\n * Created by amo on 14/11/2015.\n */\n\n\nvar ProtocolStubDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n ProtocolStubDescriptor_inherits(ProtocolStubDescriptor, _CatalogueDataObject);\n\n function ProtocolStubDescriptor(guid, type, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication) {\n var _this;\n\n ProtocolStubDescriptor_classCallCheck(this, ProtocolStubDescriptor);\n\n _this = ProtocolStubDescriptor_possibleConstructorReturn(this, ProtocolStubDescriptor_getPrototypeOf(ProtocolStubDescriptor).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._messageSchemas = messageSchemas;\n if (configuration) _this._configuration = configuration;else _this._configuration = {};\n if (constraints) _this._constraints = constraints;else _this._constraints = {};\n _this._hypertyType = hypertyType;\n if (dataObjects) _this._dataObjects = dataObjects;else _this._dataObjects = [];\n _this._interworking = interworking;\n _this._idpProxy = idpProxy;\n _this._mutualAuthentication = mutualAuthentication;\n return _this;\n }\n\n ProtocolStubDescriptor_createClass(ProtocolStubDescriptor, [{\n key: \"messageSchemas\",\n get: function get() {\n return this._messageSchemas;\n },\n set: function set(messageSchemas) {\n if (messageSchemas) this._messageSchemas = messageSchemas;\n }\n }, {\n key: \"constraints\",\n get: function get() {\n return this._constraints;\n },\n set: function set(constraints) {\n if (constraints) this._constraints = constraints;\n }\n }, {\n key: \"configuration\",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n if (configuration) this._configuration = configuration;\n }\n }, {\n key: \"hypertyType\",\n get: function get() {\n return this._hypertyType;\n },\n set: function set(value) {\n this._hypertyType = value;\n }\n }, {\n key: \"dataObjects\",\n get: function get() {\n return this._dataObjects;\n },\n set: function set(value) {\n this._dataObjects = value;\n }\n }, {\n key: \"interworking\",\n get: function get() {\n return this._interworking;\n },\n set: function set(value) {\n this._interworking = value;\n }\n }, {\n key: \"idpProxy\",\n get: function get() {\n return this._idpProxy;\n },\n set: function set(value) {\n this._idpProxy = value;\n }\n }, {\n key: \"mutualAuthentication\",\n get: function get() {\n return this._mutualAuthentication;\n },\n set: function set(value) {\n this._mutualAuthentication = value;\n }\n }]);\n\n return ProtocolStubDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\n/* harmony default export */ var runtime_catalogue_ProtocolStubDescriptor = (ProtocolStubDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyRuntimeDescriptor.js\nfunction HypertyRuntimeDescriptor_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { HypertyRuntimeDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyRuntimeDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return HypertyRuntimeDescriptor_typeof(obj); }\n\nfunction HypertyRuntimeDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyRuntimeDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyRuntimeDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyRuntimeDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyRuntimeDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyRuntimeDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyRuntimeDescriptor_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return HypertyRuntimeDescriptor_assertThisInitialized(self); }\n\nfunction HypertyRuntimeDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction HypertyRuntimeDescriptor_getPrototypeOf(o) { HypertyRuntimeDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyRuntimeDescriptor_getPrototypeOf(o); }\n\nfunction HypertyRuntimeDescriptor_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyRuntimeDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyRuntimeDescriptor_setPrototypeOf(o, p) { HypertyRuntimeDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyRuntimeDescriptor_setPrototypeOf(o, p); }\n\n/**\n * Copyright 2016 PT Inovação e Sistemas SA\n * Copyright 2016 INESC-ID\n * Copyright 2016 QUOBIS NETWORKS SL\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n * Copyright 2016 ORANGE SA\n * Copyright 2016 Deutsche Telekom AG\n * Copyright 2016 Apizee\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n **/\n\n/**\n * Created by amo on 14/11/2015.\n */\n\n\nvar HypertyRuntimeDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyRuntimeDescriptor_inherits(HypertyRuntimeDescriptor, _CatalogueDataObject);\n\n function HypertyRuntimeDescriptor(guid, catalogueType, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub) {\n var _this;\n\n HypertyRuntimeDescriptor_classCallCheck(this, HypertyRuntimeDescriptor);\n\n _this = HypertyRuntimeDescriptor_possibleConstructorReturn(this, HypertyRuntimeDescriptor_getPrototypeOf(HypertyRuntimeDescriptor).call(this, guid, catalogueType, version, objectName, description, language, sourcePackageURL));\n _this._runtimeType = runtimeType;\n if (hypertyCapabilities) _this._hypertyCapabilities = hypertyCapabilities;else _this._hypertyCapabilities = new RuntimeHypertyCapability(true, false, false, false, false);\n if (protocolCapabilities) _this._protocolCapabilities = protocolCapabilities;else _this._protocolCapabilities = new RuntimeProtocolCapability(true, false, true, false, false, false);\n _this._p2pHandlerStub = p2pHandlerStub;\n _this._p2pRequesterStub = p2pRequesterStub;\n return _this;\n }\n\n HypertyRuntimeDescriptor_createClass(HypertyRuntimeDescriptor, [{\n key: \"runtimeType\",\n get: function get() {\n return this._runtimeType;\n },\n set: function set(runtimeType) {\n if (runtimeType) this._runtimeType = runtimeType;\n }\n }, {\n key: \"hypertyCapabilities\",\n get: function get() {\n return this._hypertyCapabilities;\n },\n set: function set(hypertyCapabilities) {\n if (hypertyCapabilities) this._hypertyCapabilities = hypertyCapabilities;\n }\n }, {\n key: \"protocolCapabilities\",\n get: function get() {\n return this._hypertyCapabilities;\n },\n set: function set(protocolCapabilities) {\n if (protocolCapabilities) this._protocolCapabilities = protocolCapabilities;\n }\n }, {\n key: \"p2pHandlerStub\",\n get: function get() {\n return this._p2pHandlerStub;\n },\n set: function set(value) {\n this._p2pHandlerStub = value;\n }\n }, {\n key: \"p2pRequesterStub\",\n get: function get() {\n return this._p2pRequesterStub;\n },\n set: function set(value) {\n this._p2pRequesterStub = value;\n }\n }]);\n\n return HypertyRuntimeDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n/**\n * A class representation of the capability set of the Runtime Hyperty\n */\n\n\nvar RuntimeHypertyCapability =\n/*#__PURE__*/\nfunction () {\n /**\n * Creates an object of the Runtime Hyperty capability set\n * @param {boolean} isWebRTCSupported\n * @param {boolean} isMicSupported\n * @param {boolean} isCameraSupported\n * @param {boolean} isSensorSupported\n * @param {boolean} isORTCSupported\n */\n function RuntimeHypertyCapability(isWebRTCSupported, isMicSupported, isCameraSupported, isSensorSupported, isORTCSupported) {\n HypertyRuntimeDescriptor_classCallCheck(this, RuntimeHypertyCapability);\n\n this._isWebRTC = isWebRTCSupported;\n this._isMic = isMicSupported;\n this._isCamera = isCameraSupported;\n this._isSensor = isSensorSupported;\n this._isORTC = isORTCSupported;\n }\n\n HypertyRuntimeDescriptor_createClass(RuntimeHypertyCapability, [{\n key: \"getCapabilitySet\",\n value: function getCapabilitySet() {\n return JSON.stringify(this);\n }\n }, {\n key: \"isMic\",\n get: function get() {\n return this._isMic;\n }\n }, {\n key: \"isCamera\",\n get: function get() {\n return this._isCamera;\n }\n }, {\n key: \"isSensor\",\n get: function get() {\n return this._isSensor;\n }\n }, {\n key: \"isWebRTC\",\n get: function get() {\n return this._isWebRTC;\n }\n }, {\n key: \"isORTCS\",\n get: function get() {\n return this._isORTC;\n }\n }]);\n\n return RuntimeHypertyCapability;\n}();\n/**\n * A class representation of the protocol capability set of the Runtime Hyperty\n */\n\nvar RuntimeProtocolCapability =\n/*#__PURE__*/\nfunction () {\n /**\n * Creates an object of the runtime protocol capability\n * @param {boolean} isHttp\n * @param {boolean} isHttps\n * @param {boolean} isWS\n * @param {boolean} isWSS\n * @param {boolean} isCoap\n * @param {boolean} isDataChannel\n */\n function RuntimeProtocolCapability(isHttp, isHttps, isWS, isWSS, isCoap, isDataChannel) {\n HypertyRuntimeDescriptor_classCallCheck(this, RuntimeProtocolCapability);\n\n this._isHttp = isHttp;\n this._isHttps = isHttps;\n this._isWS = isWS;\n this._isWSS = isWSS;\n this._isCoap = isCoap;\n this._isDataChannel = isDataChannel;\n }\n\n HypertyRuntimeDescriptor_createClass(RuntimeProtocolCapability, [{\n key: \"isHttp\",\n value: function isHttp() {\n return this._isHttp;\n }\n }, {\n key: \"isHttps\",\n value: function isHttps() {\n return this._isHttps;\n }\n }, {\n key: \"isWS\",\n value: function isWS() {\n return this._isWS;\n }\n }, {\n key: \"isSensorSupported\",\n value: function isSensorSupported() {\n return this._isSensor;\n }\n }, {\n key: \"isWSS\",\n value: function isWSS() {\n return this._isWSS;\n }\n }, {\n key: \"isCoap\",\n value: function isCoap() {\n return this._isCoap;\n }\n }, {\n key: \"isDataChannel\",\n value: function isDataChannel() {\n return this._isDataChannel;\n }\n }, {\n key: \"getCapabilitySet\",\n value: function getCapabilitySet() {\n return JSON.stringify(this);\n }\n }]);\n\n return RuntimeProtocolCapability;\n}();\nvar RuntimeType = {\n BROWSER: 'browser',\n STANDALONE: 'standalone',\n SERVER: 'server',\n GATEWAY: 'gateway'\n};\n/* harmony default export */ var runtime_catalogue_HypertyRuntimeDescriptor = (HypertyRuntimeDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyInterceptorDescriptor.js\nfunction HypertyInterceptorDescriptor_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { HypertyInterceptorDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyInterceptorDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return HypertyInterceptorDescriptor_typeof(obj); }\n\nfunction HypertyInterceptorDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyInterceptorDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyInterceptorDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyInterceptorDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyInterceptorDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyInterceptorDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyInterceptorDescriptor_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return HypertyInterceptorDescriptor_assertThisInitialized(self); }\n\nfunction HypertyInterceptorDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction HypertyInterceptorDescriptor_getPrototypeOf(o) { HypertyInterceptorDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyInterceptorDescriptor_getPrototypeOf(o); }\n\nfunction HypertyInterceptorDescriptor_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyInterceptorDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyInterceptorDescriptor_setPrototypeOf(o, p) { HypertyInterceptorDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyInterceptorDescriptor_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n * Created by pzu on 19.11.15.\n */\n\n\nvar PolicyEnforcerDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyInterceptorDescriptor_inherits(PolicyEnforcerDescriptor, _CatalogueDataObject);\n\n function PolicyEnforcerDescriptor(guid, type, version, objectName, description, language, sourcePackageURL, configuration, policies) {\n var _this;\n\n HypertyInterceptorDescriptor_classCallCheck(this, PolicyEnforcerDescriptor);\n\n _this = HypertyInterceptorDescriptor_possibleConstructorReturn(this, HypertyInterceptorDescriptor_getPrototypeOf(PolicyEnforcerDescriptor).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._configuration = configuration;\n _this._policies = policies;\n return _this;\n }\n\n HypertyInterceptorDescriptor_createClass(PolicyEnforcerDescriptor, [{\n key: \"configuration\",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n this._configuration = configuration;\n }\n }, {\n key: \"policies\",\n get: function get() {\n return this._policies;\n },\n set: function set(policies) {\n this._policies = policies;\n }\n }]);\n\n return PolicyEnforcerDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\n/* harmony default export */ var HypertyInterceptorDescriptor = (PolicyEnforcerDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/DataObjectSchema.js\nfunction DataObjectSchema_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObjectSchema_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectSchema_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObjectSchema_typeof(obj); }\n\nfunction DataObjectSchema_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectSchema_possibleConstructorReturn(self, call) { if (call && (DataObjectSchema_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return DataObjectSchema_assertThisInitialized(self); }\n\nfunction DataObjectSchema_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction DataObjectSchema_getPrototypeOf(o) { DataObjectSchema_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataObjectSchema_getPrototypeOf(o); }\n\nfunction DataObjectSchema_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DataObjectSchema_setPrototypeOf(subClass, superClass); }\n\nfunction DataObjectSchema_setPrototypeOf(o, p) { DataObjectSchema_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataObjectSchema_setPrototypeOf(o, p); }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n\n/**\n * Created by pzu on 19.11.15.\n */\n\nvar DataObjectSchema =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n DataObjectSchema_inherits(DataObjectSchema, _CatalogueDataObject);\n\n function DataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL) {\n DataObjectSchema_classCallCheck(this, DataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(DataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n }\n\n return DataObjectSchema;\n}(runtime_catalogue_CatalogueDataObject); //Children\n\nvar MessageDataObjectSchema =\n/*#__PURE__*/\nfunction (_DataObjectSchema) {\n DataObjectSchema_inherits(MessageDataObjectSchema, _DataObjectSchema);\n\n function MessageDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL) {\n DataObjectSchema_classCallCheck(this, MessageDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(MessageDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n }\n\n return MessageDataObjectSchema;\n}(DataObjectSchema);\nvar HypertyDataObjectSchema =\n/*#__PURE__*/\nfunction (_DataObjectSchema2) {\n DataObjectSchema_inherits(HypertyDataObjectSchema, _DataObjectSchema2);\n\n function HypertyDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy, dataUrlScheme) {\n var _this;\n\n DataObjectSchema_classCallCheck(this, HypertyDataObjectSchema);\n\n _this = DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(HypertyDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._accessControlPolicy = accessControlPolicy;\n _this._scheme = dataUrlScheme;\n return _this;\n }\n\n return HypertyDataObjectSchema;\n}(DataObjectSchema); //Children\n\nvar CommunicationDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch) {\n DataObjectSchema_inherits(CommunicationDataObjectSchema, _HypertyDataObjectSch);\n\n function CommunicationDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, CommunicationDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(CommunicationDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return CommunicationDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar ConnectionDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch2) {\n DataObjectSchema_inherits(ConnectionDataObjectSchema, _HypertyDataObjectSch2);\n\n function ConnectionDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, ConnectionDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(ConnectionDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return ConnectionDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar IdentityDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch3) {\n DataObjectSchema_inherits(IdentityDataObjectSchema, _HypertyDataObjectSch3);\n\n function IdentityDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, IdentityDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(IdentityDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return IdentityDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar ContextDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch4) {\n DataObjectSchema_inherits(ContextDataObjectSchema, _HypertyDataObjectSch4);\n\n function ContextDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, ContextDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(ContextDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return ContextDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar DataUrlScheme = {\n COMM: 'COMM',\n CONNECTION: 'CONNECTION',\n CTXT: 'CTXT',\n IDENTITY: 'IDENTITY'\n};\n/* harmony default export */ var runtime_catalogue_DataObjectSchema = (DataObjectSchema);\n// CONCATENATED MODULE: ./src/runtime-catalogue/CatalogueDataObjectFactory.js\nfunction CatalogueDataObjectFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction CatalogueDataObjectFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CatalogueDataObjectFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) CatalogueDataObjectFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) CatalogueDataObjectFactory_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n * Copyright 2016 PT Inovação e Sistemas SA\n * Copyright 2016 INESC-ID\n * Copyright 2016 QUOBIS NETWORKS SL\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n * Copyright 2016 ORANGE SA\n * Copyright 2016 Deutsche Telekom AG\n * Copyright 2016 Apizee\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n **/\n\n\n\n\n\n\n\n\nvar CatalogueDataObjectFactory_CatalogueDataObjectFactory =\n/*#__PURE__*/\nfunction () {\n function CatalogueDataObjectFactory() {\n CatalogueDataObjectFactory_classCallCheck(this, CatalogueDataObjectFactory);\n }\n\n CatalogueDataObjectFactory_createClass(CatalogueDataObjectFactory, [{\n key: \"createCatalogueDataObject\",\n\n /**\n * Create CatalogueDataObject\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\n * @param {CatalogueObjectType} type - Indicates the type of Catalogue Data Object\n * @param {string} version - Indicates the version of Catalogue Data\n * @param {string} objectName - Human-understandable name of the catalogue object\n * @param {string} description\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\n * @returns {CatalogueDataObject}\n */\n value: function createCatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === \"undefined\" || typeof type === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new runtime_catalogue_CatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL);\n }\n /**\n * Create HypertyDescriptor\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\n * @param {string} version - Indicates the version of Catalogue Data\n * @param {string} objectName - Human-understandable name of the catalogue object\n * @param {string} description\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object\n * can be downloaded.\n * @param {HypertyResourceType[]} hypertyType - An array of HypertyResourceType that identifies what type of hyperty\n * resources are handled by the object.\n * @param {URL.URLList} dataObjects - Defines the Data Object Schemas supported by the Hyperty through a list of Catalogue URLs from where these schemas can be reached.\n * @returns {HypertyDescriptor}\n */\n\n }, {\n key: \"createHypertyDescriptorObject\",\n value: function createHypertyDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjects) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\" || typeof hypertyType === \"undefined\" || typeof dataObjects === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new runtime_catalogue_HypertyDescriptor(guid, CatalogueObjectType.HYPERTY, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjects);\n }\n /**\n * Create ProtocolStubDescriptor\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\n * @param {string} version - Indicates the version of Catalogue Data\n * @param {string} objectName - Human-understandable name of the catalogue object\n * @param {string} description\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\n * @param {URL.URL} messageSchemas - Defines the Schema describing the Message Data Model used by the Hyperty through the Catalogue URL from where the Message schema can be reached. If not defined, by default it is assumed the standard Message Model is used.\n * @param configuration - Data required to configure the ProtocolStub\n * @param constraints - Describes capabilities required from the Hyperty Runtime in order to be able to execute the ProtocolStub\n * @param hypertyType\n * @param dataObjects\n * @param interworking\n * @param idpProxy\n * @param mutualAuthentication\n * @returns {ProtocolStubDescriptor}\n */\n\n }, {\n key: \"createProtoStubDescriptorObject\",\n value: function createProtoStubDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\" || typeof messageSchemas === \"undefined\" || typeof configuration === \"undefined\" || typeof constraints === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new runtime_catalogue_ProtocolStubDescriptor(guid, CatalogueObjectType.PROTOSTUB, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication);\n }\n /**\n * Create HypertyRuntimeDescriptor\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\n * @param {string} version - Indicates the version of Catalogue Data\n * @param {string} objectName - Human-understandable name of the catalogue object\n * @param {string} description\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\n * @param {RuntimeType}runtimeType\n * @param {RuntimeHypertyCapabilities} hypertyCapabilities - Supported capabilities to execute Hyperties\n * @param {RuntimeProtocolCapabilities} protocolCapabilities - Supported capabilities to execute Protocol Stubs\n * @param p2pHandlerStub\n * @param p2pRequesterStub\n * @returns {HypertyRuntimeDescriptor} the data object of the Hyperty Runtime Descriptor\n */\n\n }, {\n key: \"createHypertyRuntimeDescriptorObject\",\n value: function createHypertyRuntimeDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\" || typeof runtimeType === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new runtime_catalogue_HypertyRuntimeDescriptor(guid, CatalogueObjectType.HYPERTY_RUNTIME, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub);\n }\n /**\n * Create Hyperty Interceptor Descriptor\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\n * @param {string} version - Indicates the version of Catalogue Data\n * @param {string} objectName - Human-understandable name of the catalogue object\n * @param {string} description\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\n * @param configuration\n * @param policies\n * @returns {PolicyEnforcerDescriptor}\n */\n\n }, {\n key: \"createHypertyInterceptorDescriptorObject\",\n value: function createHypertyInterceptorDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, configuration, policies) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new HypertyInterceptorDescriptor(guid, CatalogueObjectType.HYPERTY_INTERCEPTOR, version, objectName, description, language, sourcePackageURL, configuration, policies);\n }\n /**\n * Create DataObjectSchema which in effect is the MessageDataObjectSchema\n * @deprecated Use either createMessageDataObjectSchema or createHypertyDataObjectSchema instead\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\n * @param {string} version - Indicates the version of Catalogue Data\n * @param {string} objectName - Human-understandable name of the catalogue object\n * @param {string} description\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\n * @returns {DataObjectSchema}\n */\n\n }, {\n key: \"createDataObjectSchema\",\n value: function createDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new DataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL);\n }\n /**\n * Create DataObjectSchema which in effect is the MessageDataObjectSchema\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\n * @param {string} version - Indicates the version of Catalogue Data\n * @param {string} objectName - Human-understandable name of the catalogue object\n * @param {string} description\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\n * @returns {DataObjectSchema}\n */\n\n }, {\n key: \"createMessageDataObjectSchema\",\n value: function createMessageDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new DataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL);\n }\n /**\n * Create HypertyDataObjectSchema\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\n * @param {string} version - Indicates the version of Catalogue Data\n * @param {string} objectName - Human-understandable name of the catalogue object\n * @param {string} description\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\n * @param {string} accessControlPolicy - policy rule to access object (see Reporter-Observer Comm pattern)\n * @param {DataUrlScheme} scheme - identifies the data scheme (COMM, CONNECTION, CTXT or IDENTITY)\n * @returns {DataObjectSchema}\n */\n\n }, {\n key: \"createHypertyDataObjectSchema\",\n value: function createHypertyDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL, accessControlPolicy, scheme) {\n if (typeof guid === \"undefined\" || typeof version === \"undefined\" || typeof objectName === \"undefined\" || typeof description === \"undefined\" || typeof language === \"undefined\" || typeof sourcePackageURL === \"undefined\" || typeof scheme === \"undefined\" || typeof accessControlPolicy === \"undefined\") throw new Error(\"Invalid parameters!\");\n if (scheme === DataUrlScheme.COMM) return new CommunicationDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.CONNECTION) return new ConnectionDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.CTXT) return new ContextDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.IDENTITY) return new IdentityDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);\n }\n /**\n * Create SourcePackage\n * @param sourceCodeClassname - The Class-name of the SourceCode\n * @param sourceCode - The source code of the catalogue object\n * @returns {SourcePackage}\n */\n\n }, {\n key: \"createSourcePackage\",\n value: function createSourcePackage(sourceCodeClassname, sourceCode) {\n if (typeof sourceCode === \"undefined\" || typeof sourceCodeClassname === \"undefined\") throw new Error(\"Invalid parameters!\");\n return new runtime_catalogue_SourcePackage(sourceCodeClassname, sourceCode);\n }\n }]);\n\n return CatalogueDataObjectFactory;\n}();\n\n/* harmony default export */ var runtime_catalogue_CatalogueDataObjectFactory = (CatalogueDataObjectFactory_CatalogueDataObjectFactory);\n// CONCATENATED MODULE: ./src/runtime-catalogue/RuntimeCatalogue.js\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction RuntimeCatalogue_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RuntimeCatalogue_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RuntimeCatalogue_createClass(Constructor, protoProps, staticProps) { if (protoProps) RuntimeCatalogue_defineProperties(Constructor.prototype, protoProps); if (staticProps) RuntimeCatalogue_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar RuntimeCatalogue_log = loglevel[\"getLogger\"]('RuntimeCatalogue');\n\n\nvar RuntimeCatalogue_RuntimeCatalogue =\n/*#__PURE__*/\nfunction () {\n function RuntimeCatalogue(runtimeFactory, name, schema) {\n RuntimeCatalogue_classCallCheck(this, RuntimeCatalogue);\n\n if (!runtimeFactory) throw Error('The catalogue needs the runtimeFactory');\n this._runtimeFactory = runtimeFactory;\n this._factory = new runtime_catalogue_CatalogueDataObjectFactory();\n this.httpRequest = runtimeFactory.createHttpRequest();\n this.atob = runtimeFactory.atob ? runtimeFactory.atob : atob;\n var storageName = name ? name : 'runtimeCatalogue';\n var storageSchema = schema ? schema : '&cguid, accessControlPolicy, constraints, dataObjects, type, objectName, sourcePackage, version, url';\n var schemas = {};\n schemas[storageName] = storageSchema;\n this.storageManager = runtimeFactory.storageManager(storageName, schemas);\n }\n /**\n * Get a Catalogue Data Object (Descriptor) from a URL, and construct it using the provided function\n * @param {String} descriptorURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty\n * @param {function} createFunc - e.g. createHyperty\n * @param {boolean} [getFull] - whether or not to get descriptor with sourcePackage, or only the descriptor part\n * @param {JSON} constraints - constraints object\n * @returns {Promise} - Promise that fulfills with the requested descriptor in the appropriate type.\n * If constraints were provided, a descriptor is only returned if it meets the constraints, otherwise the promise will be rejected.\n */\n\n\n RuntimeCatalogue_createClass(RuntimeCatalogue, [{\n key: \"getDescriptor\",\n value: function getDescriptor(descriptorURL, createFunc) {\n var _this = this;\n\n var getFull = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n var constraints = arguments.length > 3 ? arguments[3] : undefined;\n RuntimeCatalogue_log.info('[RuntimeCatalogue] - getting descriptor from: ', descriptorURL, ' with constraints: ', constraints);\n return new Promise(function (resolve, reject) {\n if (_this._runtimeFactory.isOnline()) {\n resolve(_this._getDescriptor(descriptorURL, createFunc, getFull, constraints));\n } else {\n _this.storageManager.get('url', descriptorURL).then(function (descriptor) {\n console.log('[RuntimeCatalogue] saved offline descriptor ', descriptor);\n if (descriptor) resolve(createFunc.apply(_this, [descriptor, constraints]));else resolve(_this._getDescriptor(descriptorURL, createFunc, getFull, constraints));\n });\n }\n });\n }\n }, {\n key: \"_getDescriptor\",\n value: function _getDescriptor(descriptorURL, createFunc) {\n var _this2 = this;\n\n var getFull = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n var constraints = arguments.length > 3 ? arguments[3] : undefined;\n // some flags for optimization\n // (later the descriptor will not be saved in case both of these booleans are true)\n var isSavedDescriptor = false;\n var isCompleteDescriptor = false; // get raw descriptor\n // first checks if descriptor is already in localStorage (based on cguid and version)\n\n var descriptorPromise;\n\n if (constraints != undefined) {\n descriptorPromise = Promise.all([this.httpRequest.post(descriptorURL + '/version', {\n body: JSON.stringify(constraints)\n }), this.httpRequest.post(descriptorURL + '/cguid', {\n body: JSON.stringify(constraints)\n })]);\n } else {\n descriptorPromise = Promise.all([this.httpRequest.get(descriptorURL + '/version'), this.httpRequest.get(descriptorURL + '/cguid')]);\n }\n\n descriptorPromise = descriptorPromise.then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n version = _ref2[0],\n cguid = _ref2[1];\n\n RuntimeCatalogue_log.log('[RuntimeCatalogue.getDescriptor] - got version (' + version + ') and cguid (' + cguid + ') for descriptor ' + descriptorURL); // check if same version is contained in localStorage\n\n return _this2.storageManager.getVersion('cguid', cguid).then(function (dbVersion) {\n if (dbVersion >= version) {\n RuntimeCatalogue_log.log('[RuntimeCatalogue.getDescriptor] local version is updated for ', descriptorURL);\n isSavedDescriptor = true;\n return _this2.storageManager.get('cguid', cguid);\n } else {\n RuntimeCatalogue_log.log('[RuntimeCatalogue.getDescriptor] local version not updated for ', descriptorURL, ' retrieving from remote catalogue ...'); // no saved copy, proceed with retrieving descriptor\n\n var retrievePromise = constraints != undefined ? _this2.httpRequest.post(descriptorURL, {\n body: JSON.stringify(constraints)\n }) : _this2.httpRequest.get(descriptorURL);\n return retrievePromise.then(function (descriptor) {\n descriptor = JSON.parse(descriptor); //log.log(\"got descriptor:\", JSON.stringify(descriptor, null, 2));\n\n if (descriptor['ERROR']) {\n // TODO handle error properly\n throw new Error(descriptor);\n } else {\n return descriptor;\n }\n });\n }\n });\n }).catch(function (error) {\n var errorString = 'Unable to get descriptor for ' + descriptorURL + (constraints != undefined ? ' with constraints ' + constraints : '') + ': ' + error;\n RuntimeCatalogue_log.error(errorString);\n throw new Error(errorString);\n });\n var returnPromise = descriptorPromise; // if getFull, attach sourcePackage\n\n if (getFull) {\n RuntimeCatalogue_log.log('adding promise to attach sourcePackage');\n returnPromise = descriptorPromise.then(function (descriptor) {\n if (descriptor.sourcePackage) {\n isCompleteDescriptor = true;\n return descriptor;\n } else {\n isCompleteDescriptor = false;\n return _this2.attachRawSourcePackage(descriptor);\n }\n });\n } // finally create object\n\n\n returnPromise = returnPromise.then(function (descriptor) {\n // store if not saved before, or if full descriptor was requested and only partial descriptor was stored.\n if (!isSavedDescriptor || isSavedDescriptor && !isCompleteDescriptor && getFull) {\n descriptor.url = descriptorURL;\n\n _this2.storageManager.set(descriptor.cguid, descriptor.version, descriptor);\n }\n\n return createFunc.apply(_this2, [descriptor, constraints]);\n });\n return returnPromise;\n }\n /**\n * Uses the sourcePackageURL from the descriptor, requests the sourcePackage and attaches it to the descriptor.\n * @param {CatalogueDataObject} descriptor\n * @param {JSON} constraints - constraints object\n * @returns {Promise} - fulfills with complete descriptor\n */\n\n }, {\n key: \"attachRawSourcePackage\",\n value: function attachRawSourcePackage(descriptor, constraints) {\n var _this3 = this;\n\n RuntimeCatalogue_log.log('attaching raw sourcePackage from:', descriptor.sourcePackageURL);\n return new Promise(function (resolve, reject) {\n var retrievePromise = constraints != undefined ? _this3.httpRequest.post(descriptor.sourcePackageURL, {\n body: JSON.stringify(constraints)\n }) : _this3.httpRequest.get(descriptor.sourcePackageURL);\n retrievePromise.then(function (sourcePackage) {\n sourcePackage = JSON.parse(sourcePackage); //delete descriptor.sourcePackageURL;\n //log.log(\"attaching sourcePackage:\", sourcePackage);\n\n descriptor.sourcePackage = sourcePackage;\n resolve(descriptor);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n /**\n * Get HypertyDescriptor\n * @param hypertyURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\n * @param {JSON} constraints - constraints object\n * @returns {Promise}\n */\n\n }, {\n key: \"getHypertyDescriptor\",\n value: function getHypertyDescriptor(hypertyURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(hypertyURL, this.createHyperty, getFull, constraints);\n }\n /**\n * Get StubDescriptor\n * @param stubURL - e.g. mydomain.com/.well-known/protostub/MyProtostub\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\n * @param {JSON} constraints - constraints object\n * @returns {Promise}\n */\n\n }, {\n key: \"getStubDescriptor\",\n value: function getStubDescriptor(stubURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(stubURL, this.createStub, getFull, constraints);\n }\n /**\n * Get RuntimeDescriptor\n * @param runtimeURL - e.g. mydomain.com/.well-known/runtime/MyRuntime\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\n * @param {JSON} constraints - constraints object\n * @returns {Promise}\n */\n\n }, {\n key: \"getRuntimeDescriptor\",\n value: function getRuntimeDescriptor(runtimeURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(runtimeURL, this.createRuntimeDescriptor, getFull, constraints);\n }\n /**\n * Get DataSchemaDescriptor\n * @param dataSchemaURL - e.g. mydomain.com/.well-known/dataschema/MyDataSchema\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\n * @param {JSON} constraints - constraints object\n * @returns {Promise}\n */\n\n }, {\n key: \"getDataSchemaDescriptor\",\n value: function getDataSchemaDescriptor(dataSchemaURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n // return this.getDescriptor(dataSchemaURL, this.createDataSchema, getFull, constraints)\n return new Promise(function (resolve) {\n var schema = dataSchemaURL.split('/dataschema/')[1];\n RuntimeCatalogue_log.log('[RuntimeCatalogue.getDataSchemaDescriptor] schema ', schema);\n var descriptor = {\n sourcePackage: {\n sourceCode: {\n properties: {}\n }\n }\n }; // let scheme = properties.scheme ? properties.scheme.co : [];\n\n switch (schema) {\n case 'Context':\n case 'ContextReporter':\n case 'ContextObserver':\n descriptor.sourcePackage.sourceCode.properties.scheme = 'context';\n break;\n\n case 'Connection':\n descriptor.sourcePackage.sourceCode.properties.scheme = 'connection';\n break;\n\n case 'WalletData':\n descriptor.sourcePackage.sourceCode.properties.scheme = 'walletData';\n break;\n\n case 'Communication':\n descriptor.sourcePackage.sourceCode.properties.scheme = 'comm';\n descriptor.sourcePackage.sourceCode.properties.childrens = ['resources'];\n break;\n\n case 'HelloWorldDataSchema':\n descriptor.sourcePackage.sourceCode.properties.scheme = 'hello';\n break;\n\n default:\n descriptor.sourcePackage.sourceCode.properties.scheme = 'resource';\n descriptor.sourcePackage.sourceCode.properties.childrens = [];\n break;\n }\n\n resolve(descriptor);\n });\n }\n /**\n * Get IDPProxyDescriptor\n * @param idpProxyURL - e.g. mydomain.com/.well-known/idp-proxy/MyProxy\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\n * @param {JSON} constraints - constraints object\n * @returns {Promise}\n */\n\n }, {\n key: \"getIdpProxyDescriptor\",\n value: function getIdpProxyDescriptor(idpProxyURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(idpProxyURL, this.createIdpProxy, getFull, constraints);\n }\n /**\n * Create HypertyDescriptor based on raw object that contains its attributes\n * @param {JSON} rawHyperty\n * @returns {HypertyDescriptor}\n */\n\n }, {\n key: \"createHyperty\",\n value: function createHyperty(rawHyperty) {\n //log.log(\"createHyperty:\", rawHyperty);\n // create the descriptor\n var hyperty = this._factory.createHypertyDescriptorObject(rawHyperty['cguid'], rawHyperty['version'], rawHyperty['objectName'], rawHyperty['description'], rawHyperty['language'], rawHyperty['sourcePackageURL'], rawHyperty['type'] || rawHyperty['hypertyType'], rawHyperty['dataObjects']); //log.log(\"factory returned:\", hyperty);\n // optional fields\n\n\n hyperty.configuration = rawHyperty['configuration'];\n hyperty.constraints = rawHyperty['constraints'];\n hyperty.messageSchema = rawHyperty['messageSchema'];\n hyperty.policies = rawHyperty['policies'];\n hyperty.signature = rawHyperty['signature']; // parse and attach sourcePackage\n\n var sourcePackage = rawHyperty['sourcePackage'];\n\n if (sourcePackage) {\n hyperty.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return hyperty;\n }\n /**\n * Create ProtocolStubDescriptor based on raw object that contains its attributes\n * @param rawStub\n * @returns {ProtocolStubDescriptor}\n */\n\n }, {\n key: \"createStub\",\n value: function createStub(rawStub) {\n // log.log(\"creating stub descriptor based on: \", rawStub);\n // create the descriptor\n var stub = this._factory.createProtoStubDescriptorObject(rawStub['cguid'], rawStub['version'], rawStub['objectName'], rawStub['description'], rawStub['language'], rawStub['sourcePackageURL'], rawStub['messageSchemas'], rawStub['configuration'], rawStub['constraints'], rawStub['hypertyType'], rawStub['dataObjects'], rawStub['interworking'], rawStub['idpProxy'], rawStub['mutualAuthentication']); // optional fields\n\n\n stub.signature = rawStub['signature']; // parse and attach the sourcePackage\n\n var sourcePackage = rawStub['sourcePackage'];\n\n if (sourcePackage) {\n stub.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return stub;\n }\n /**\n * Create HypertyRuntimeDescriptor based on raw object that contains its attributes\n * @param rawRuntime\n * @returns {HypertyRuntimeDescriptor}\n */\n\n }, {\n key: \"createRuntimeDescriptor\",\n value: function createRuntimeDescriptor(rawRuntime) {\n // parse capabilities first\n try {\n rawRuntime['hypertyCapabilities'] = JSON.parse(rawRuntime['hypertyCapabilities']);\n rawRuntime['protocolCapabilities'] = JSON.parse(rawRuntime['protocolCapabilities']);\n } catch (e) {} // already json object\n //log.log(\"creating runtime descriptor based on: \", rawRuntime);\n // create the descriptor\n\n\n var runtime = this._factory.createHypertyRuntimeDescriptorObject(rawRuntime['cguid'], rawRuntime['version'], rawRuntime['objectName'], rawRuntime['description'], rawRuntime['language'], rawRuntime['sourcePackageURL'], rawRuntime['type'] || rawRuntime['runtimeType'], rawRuntime['hypertyCapabilities'], rawRuntime['protocolCapabilities'], rawRuntime['p2pHandlerStub'], rawRuntime['p2pRequesterStub']); // optional fields\n\n\n runtime.signature = rawRuntime['signature']; // parse and attach sourcePackage\n\n var sourcePackage = rawRuntime['sourcePackage'];\n\n if (sourcePackage) {\n // log.log(\"runtime has sourcePackage:\", sourcePackage);\n runtime.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return runtime;\n }\n /**\n * Create DataObjectSchema based on raw object that contains its attributes\n * @param rawSchema\n * @returns {DataObjectSchema}\n */\n\n }, {\n key: \"createDataSchema\",\n value: function createDataSchema(rawSchema) {\n //log.log(\"creating dataSchema based on: \", rawSchema);\n var dataSchema; //log.log('1. createMessageDataObjectSchema: ', rawSchema[\"accessControlPolicy\"]);\n //log.log('2. createMessageDataObjectSchema: ', rawSchema[\"scheme\"]);\n\n if (rawSchema['accessControlPolicy'] && rawSchema['scheme']) {\n dataSchema = this._factory.createHypertyDataObjectSchema(rawSchema['cguid'], rawSchema['version'], rawSchema['objectName'], rawSchema['description'], rawSchema['language'], rawSchema['sourcePackageURL'], rawSchema['accessControlPolicy'], rawSchema['scheme']);\n } else {\n //log.log('3. createMessageDataObjectSchema: ', rawSchema);\n dataSchema = this._factory.createMessageDataObjectSchema(rawSchema['cguid'], rawSchema['version'], rawSchema['objectName'], rawSchema['description'], rawSchema['language'], rawSchema['sourcePackageURL']);\n } // optional fields\n\n\n dataSchema.signature = rawSchema['signature']; // parse and attach sourcePackage\n\n var sourcePackage = rawSchema['sourcePackage'];\n\n if (sourcePackage) {\n //log.log(\"dataSchema has sourcePackage:\", sourcePackage);\n dataSchema.sourcePackage = this.createSourcePackage(sourcePackage);\n\n try {\n dataSchema.sourcePackage.sourceCode = JSON.parse(dataSchema.sourcePackage.sourceCode);\n } catch (e) {\n RuntimeCatalogue_log.log('DataSchema Source code is already parsed');\n }\n\n return dataSchema;\n } //log.log(\"created dataSchema descriptor object:\", dataSchema);\n\n\n return dataSchema;\n }\n /**\n * Create ProtocolStubDescriptor based on raw object that contains its attributes\n * @param rawProxy\n * @returns {ProtocolStubDescriptor}\n */\n\n }, {\n key: \"createIdpProxy\",\n value: function createIdpProxy(rawProxy) {\n // log.log(\"creating idpproxy descriptor based on: \", rawProxy);\n // create the descriptor\n var idpproxy = this._factory.createProtoStubDescriptorObject(rawProxy['cguid'], rawProxy['version'], rawProxy['objectName'], rawProxy['description'], rawProxy['language'], rawProxy['sourcePackageURL'], rawProxy['messageSchemas'], rawProxy['configuration'], rawProxy['constraints'], rawProxy['hypertyType'], rawProxy['dataObjects'], rawProxy['interworking'], rawProxy['idpProxy'], rawProxy['mutualAuthentication']); // optional fields\n\n\n idpproxy.signature = rawProxy['signature']; // parse and attach the sourcePackage\n\n var sourcePackage = rawProxy['sourcePackage'];\n\n if (sourcePackage) {\n sourcePackage = this.createSourcePackage(sourcePackage);\n idpproxy.sourcePackage = sourcePackage;\n }\n\n return idpproxy;\n }\n }, {\n key: \"createSourcePackage\",\n value: function createSourcePackage(sp) {\n //log.log(\"createSourcePackage:\", sp);\n // check encoding\n if (sp['encoding'] === 'base64') {\n sp['sourceCode'] = this.atob(sp['sourceCode']);\n sp['encoding'] = 'utf-8';\n }\n\n var sourcePackage = this._factory.createSourcePackage(sp['sourceCodeClassname'], sp['sourceCode']);\n\n if (sp['encoding']) sourcePackage.encoding = sp['encoding'];\n if (sp['signature']) sourcePackage.signature = sp['signature'];\n return sourcePackage;\n }\n /**\n * Get source Package from a URL\n * @param sourcePackageURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty/sourcePackage\n * @returns {Promise}\n */\n\n }, {\n key: \"getSourcePackageFromURL\",\n value: function getSourcePackageFromURL(sourcePackageURL) {\n var _this4 = this;\n\n RuntimeCatalogue_log.log('getting sourcePackage from:', sourcePackageURL);\n return new Promise(function (resolve, reject) {\n _this4.httpRequest.get(sourcePackageURL).then(function (result) {\n //log.log(\"got raw sourcePackage:\", result);\n if (result['ERROR']) {\n // TODO handle error properly\n reject(result);\n } else {\n result = JSON.parse(result);\n\n var sourcePackage = _this4.createSourcePackage(result);\n\n resolve(sourcePackage);\n }\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n /**\n * Returns the sourceCode of a given descriptor\n * @param {CatalogueDataObject} descriptor - Catalogue Object that was retrieved using e.g. getHypertyDescriptor()\n * @returns {Promise}\n */\n\n }, {\n key: \"getSourceCodeFromDescriptor\",\n value: function getSourceCodeFromDescriptor(descriptor) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n if (descriptor.sourcePackage) {\n //log.log(\"descriptor has sourcePackage\");\n //log.log(\"returning sourceCode:\", descriptor.sourcePackage.sourceCode);\n resolve(descriptor.sourcePackage.sourceCode);\n } else {\n _this5.storageManager.getVersion(descriptor.sourcePackageURL + '/sourceCode').then(function (dbVersion) {\n if (dbVersion >= descriptor.version) {\n RuntimeCatalogue_log.log('returning cached version from storageManager');\n\n _this5.storageManager.get(descriptor.sourcePackageURL + '/sourceCode').then(function (sourceCode) {\n resolve(sourceCode);\n }).catch(function (reason) {\n reject(reason);\n });\n } else {\n _this5.httpRequest.get(descriptor.sourcePackageURL + '/sourceCode').then(function (sourceCode) {\n if (sourceCode['ERROR']) {\n // TODO handle error properly\n reject(sourceCode);\n } else {\n _this5.storageManager.set(descriptor.sourcePackageURL + '/sourceCode', descriptor.version, sourceCode);\n\n resolve(sourceCode);\n }\n }).catch(function (reason) {\n reject(reason);\n });\n }\n }).catch(function (reason) {\n reject(reason);\n });\n }\n });\n }\n /**\n * Returns the list of available catalogue objects for the given \"type URL\",\n * i.e. a catalogue URL that specifies a type, but no catalogue object name.\n * @param typeURL - URL pointing to the catalogue object type you want a list of available objects for,\n * e.g. hyperty-catalogue://catalogue.fokus.fraunhofer.de/.well-known/idp-proxy\n * @param {JSON} constraints - constraints object\n * @returns {Promise} typeListPromise - Promise that fulfills with the list of available catalogue object names for the requested type,\n * rejects on HTTP error or if the HTTP response is not in JSON.\n * If constraints were provided, then the list only contains those objects that meet the constraints\n */\n\n }, {\n key: \"getTypeList\",\n value: function getTypeList(typeURL, constraints) {\n var _this6 = this;\n\n return new Promise(function (resolve, reject) {\n var requestPromise = constraints != undefined ? _this6.httpRequest.post(typeURL, {\n body: JSON.stringify(constraints)\n }) : _this6.httpRequest.get(typeURL);\n requestPromise.then(function (typeList) {\n typeList = JSON.parse(typeList);\n resolve(typeList);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"deleteFromPM\",\n value: function deleteFromPM(url) {\n return this.storageManager.delete(url);\n }\n }, {\n key: \"runtimeURL\",\n set: function set(runtimeURL) {\n this._runtimeURL = runtimeURL;\n },\n get: function get() {\n return this._runtimeURL;\n }\n }]);\n\n return RuntimeCatalogue;\n}();\n\n/* harmony default export */ var runtime_catalogue_RuntimeCatalogue = (RuntimeCatalogue_RuntimeCatalogue);\n// CONCATENATED MODULE: ./src/runtime/RuntimeUA.js\nfunction RuntimeUA_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction RuntimeUA_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RuntimeUA_createClass(Constructor, protoProps, staticProps) { if (protoProps) RuntimeUA_defineProperties(Constructor.prototype, protoProps); if (staticProps) RuntimeUA_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\n* Copyright 2016 PT Inovação e Sistemas SA\n* Copyright 2016 INESC-ID\n* Copyright 2016 QUOBIS NETWORKS SL\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\n* Copyright 2016 ORANGE SA\n* Copyright 2016 Deutsche Telekom AG\n* Copyright 2016 Apizee\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n* http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n**/\n // Log System\n\n\nvar RuntimeUA_log = loglevel[\"getLogger\"]('RuntimeUA'); //Main dependecies\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n //import GraphConnector from '../graphconnector/GraphConnector';\n\n\n\n\n\n\n\n\n/**\n * Runtime User Agent Interface will process all the dependecies of the core runtime;\n * @author Vitor Silva [vitor-t-silva@telecom.pt]\n * @version 0.4.0\n *\n * @property {runtimeFactory} runtimeFactory - Specific implementation for all environments;\n * @property {RuntimeCatalogue} runtimeCatalogue - Catalogue of components can be installed;\n * @property {runtimeURL} runtimeURL - This identify the core runtime, should be unique;\n * @property {IdentityModule} identityModule - Identity Module;\n * @property {PEP} policyEngine - Policy Engine Module;\n * @property {Registry} registry - Registry Module;\n * @property {MessageBus} messageBus - Message Bus is used like a router to redirect the messages from one component to other(s)\n * @property {GraphConnector} graphConnector - Graph Connector handling GUID and contacts\n * @property {CoreDiscovery} coreDiscovery - Discovery for discovery hyperties/dataObjects\n */\n\nvar RuntimeUA_RuntimeUA =\n/*#__PURE__*/\nfunction () {\n /**\n * Create a new instance of Runtime User Agent\n * @param {descriptor} runtimeDescriptor - pass all the hyperty runtime descriptor\n * @param {runtimeFactory} runtimeFactory - Specific implementation for the environment where the core runtime will run;\n * @param {domain} domainURL - specify the domain base for the runtime;\n */\n function RuntimeUA(runtimeDescriptor, runtimeFactory, domain) {\n RuntimeUA_classCallCheck(this, RuntimeUA);\n\n if (!runtimeDescriptor) throw new Error('The runtime descriptor is a needed parameter');\n if (!runtimeFactory) throw new Error('The sandbox factory is a needed parameter');\n if (!domain) throw new Error('You need the domain of runtime'); // Configuration object with information related with servers\n\n this.runtimeConfiguration = Object.assign({\n domain: domain\n }, runtimeConfiguration_runtimeConfiguration);\n this.runtimeFactory = runtimeFactory;\n this.log = RuntimeUA_log;\n this.logLevels = loglevel_default.a;\n\n if (runtimeDescriptor.p2pHandlerStub && typeof runtimeDescriptor.p2pHandlerStub === 'string' && runtimeDescriptor.p2pHandlerStub.includes('://')) {\n this.p2p = true;\n } else {\n this.p2p = false;\n }\n\n runtimeUtils.runtimeDescriptor = runtimeDescriptor;\n this.runtimeUtils = runtimeUtils;\n this.storages = {};\n /* if (typeof runtimeFactory.createRuntimeCatalogue === 'function') {\n this.runtimeCatalogue = runtimeFactory.createRuntimeCatalogue();\n } else {\n throw new Error('Check your Runtime Factory because it needs the Runtime Catalogue implementation');\n }*/\n\n this.runtimeCatalogue = new runtime_catalogue_RuntimeCatalogue(runtimeFactory);\n /* if (typeof runtimeFactory.persistenceManager === 'function') {\n this.persistenceManager = runtimeFactory.persistenceManager();\n } else {\n throw new Error('Check your Runtime Factory because it needs the Persistence Manager implementation');\n }*/\n\n if (typeof runtimeFactory.storageManager === 'function') {\n this.storages = Storage_storage(runtimeFactory, this);\n } else {\n throw new Error('Check your Runtime Factory because it needs the Storage Manager implementation');\n }\n\n if (typeof runtimeFactory.runtimeCapabilities === 'function') {\n this.runtimeCapabilities = runtimeFactory.runtimeCapabilities(this.storages.capabilities);\n } else {\n RuntimeUA_log.info('Check your RuntimeFactory because it needs the Runtime Capabilities implementation');\n }\n }\n /**\n * Intialize the installation of runtime\n *\n * @access public\n * @return {Promise} this is Promise and if the installation process happened without any problems returns true otherwise the error.\n *\n * @memberOf RuntimeUA\n */\n\n\n RuntimeUA_createClass(RuntimeUA, [{\n key: \"init\",\n value: function init(guid) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n _this2.domain = _this2.runtimeConfiguration.domain;\n RuntimeUA_log.info('[RuntimeUA - init] Starting ');\n\n try {\n var getCapabilities = _this2.runtimeCapabilities.getRuntimeCapabilities();\n\n var getRuntimeURL = _this2.storages.runtime.get('runtime:URL');\n\n var getStoredDataObjects = _this2.storages.syncherManager.get('syncherManager:ObjectURLs');\n\n var getHypertyStorageObjects = _this2.storages.hypertyResources.get();\n\n var getP2PHandlerURL = _this2.storages.runtime.get('p2pHandler:URL'); // let getRemotes = this.storages.syncherManager.get('remotes');\n\n\n Promise.all([getRuntimeURL, getCapabilities, getStoredDataObjects, getHypertyStorageObjects, getP2PHandlerURL]).then(function (results) {\n _this2.runtimeURL = results[0] ? results[0].runtimeURL : results[0];\n\n if (!_this2.runtimeURL) {\n _this2.runtimeURL = 'runtime://' + _this2.domain + '/' + generateGUID();\n\n _this2.storages.runtime.set('runtime:URL', 1, {\n runtimeURL: _this2.runtimeURL\n });\n }\n\n _this2.capabilities = results[1];\n Object.assign(runtimeUtils.runtimeCapabilities.constraints, results[1]);\n _this2._dataObjectsStorage = new store_objects_DataObjectsStorage(_this2.storages.syncherManager, results[2] || {}, _this2.runtimeFactory, _this2);\n _this2._hypertyResources = results[3] || {};\n _this2.p2pHandlerURL = results[4] ? results[4].p2pHandlerURL : results[4];\n\n if (!_this2.p2pHandlerURL) {\n _this2.p2pHandlerURL = _this2.runtimeURL + '/p2phandler/' + generateGUID();\n RuntimeUA_log.info('[RuntimeUA - init] P2PHandlerURL: ', _this2.p2pHandlerURL);\n\n _this2.storages.runtime.set('p2pHandler:URL', 1, {\n p2pHandlerURL: _this2.p2pHandlerURL\n });\n }\n /* log.info('[RuntimeUA - init] dataObjectsStorage remote load starting');\n this._dataObjectsStorage.loadRemote().then(()=> {\n log.info('[RuntimeUA - init] dataObjectsStorage remote load concluded');*/\n\n\n return _this2._loadComponents(guid); // });\n }).then(function (status) {\n _this2._setNetworkStatusListeners();\n\n _this2._hypertyResourcesStorage = new hyperty_resource_HypertyResourcesStorage(_this2.runtimeURL, _this2.messageBus, _this2.storages.hypertyResources, _this2._hypertyResources);\n\n if (_this2.p2p) {\n RuntimeUA_log.info('[RuntimeUA - init] load p2pHandler: ', status);\n return _this2._loadP2PHandler();\n } else {\n RuntimeUA_log.info('[RuntimeUA - init] P2P not supported');\n return 'P2P Not Supported';\n }\n }).then(function (result) {\n RuntimeUA_log.info('[runtime ua - init] - status: ', result);\n resolve(true);\n }, function (reason) {\n RuntimeUA_log.error('ERROR: ', reason);\n resolve(true);\n });\n } catch (e) {\n reject(e);\n }\n });\n }\n }, {\n key: \"_setNetworkStatusListeners\",\n value: function _setNetworkStatusListeners() {\n this.runtimeFactory.listenOnline(this._updateRuntimeStatus('online'));\n this.runtimeFactory.listenOffline(this._updateRuntimeStatus('offline'));\n }\n }, {\n key: \"_updateRuntimeStatus\",\n value: function _updateRuntimeStatus(event) {\n var _this = this;\n\n _this.messageBus.postMessage({\n from: this.runtimeURL,\n to: this.runtimeURL + '/status',\n type: 'update',\n body: event\n });\n }\n }, {\n key: \"_loadP2PHandler\",\n value: function _loadP2PHandler() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n var runtimeDescriptor = runtimeUtils.runtimeDescriptor;\n var p2pStubHandler = runtimeDescriptor.p2pHandlerStub;\n var p2pConfig = {\n isHandlerStub: true,\n runtimeURL: _this3.runtimeURL\n };\n RuntimeUA_log.log('[RuntimeUA loadP2PHandler] P2PStubHandler: ', p2pStubHandler);\n\n _this3.loader.loadStub(p2pStubHandler, p2pConfig).then(function (result) {\n var runtimeUAURL = _this3.runtimeURL + '/ua';\n var msg = {\n type: 'subscribe',\n from: runtimeUAURL,\n to: 'domain://msg-node.' + _this3.domain + '/sm',\n body: {\n subscribe: [result.url],\n source: _this3.runtimeURL\n }\n };\n\n _this3.messageBus.addListener(runtimeUAURL, function (msg) {\n RuntimeUA_log.log('[runtime ua - listener] - receive msg: ', msg);\n });\n\n _this3.messageBus.postMessage(msg, function (reply) {\n RuntimeUA_log.log('[runtime ua - postMessage] - reply: ', reply);\n });\n\n RuntimeUA_log.info('[runtime ua - p2p installation] - success: ', result);\n resolve(true);\n }).catch(function (reason) {\n RuntimeUA_log.info('[runtime ua - p2p installation] - fail: ', reason);\n resolve(false);\n });\n });\n }\n /**\n *\n * @access private\n * @return {Promise} this is Promise and returns true if all components are loaded with success or an error if someone fails.\n *\n * @memberOf RuntimeUA\n */\n\n }, {\n key: \"_loadComponents\",\n value: function _loadComponents(guid) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n try {\n // Prepare the on instance to handle with the fallbacks and runtimeCatalogue;\n _this4.descriptorInstance = new runtime_Descriptors(_this4.runtimeURL, _this4.runtimeCatalogue, _this4.runtimeConfiguration); // Prepare the loader to load the hyperties, protostubs and idpproxy;\n\n _this4.loader = new runtime_Loader(_this4.runtimeURL, _this4.runtimeConfiguration, _this4.descriptorInstance); // Instantiate the identity Module\n\n _this4.identityModule = new identity_IdentityModule(_this4.runtimeURL, _this4.runtimeCapabilities, _this4.storages.identity, _this4._dataObjectsStorage, cryptoManager_CryptoManager, _this4.runtimeCatalogue); // Use the sandbox factory to create an AppSandbox;\n // In the future can be decided by policyEngine if we need\n // create a AppSandbox or not;\n\n var appSandbox = _this4.runtimeFactory.createAppSandbox(); // Instantiate the Registry Module\n\n\n _this4.registry = new registry_Registry(_this4.runtimeURL, appSandbox, _this4.identityModule, _this4.runtimeCatalogue, _this4.runtimeCapabilities, _this4.storages.registry, _this4.p2pHandlerURL); // Set the loader to load Hyperties, Stubs and IdpProxies\n\n _this4.registry.loader = _this4.loader; // Instantiate the Message Bus\n\n _this4.messageBus = new bus_MessageBus(_this4.registry); // Instanciate the SubscriptionManager;\n\n _this4.subscriptionManager = new subscriptionManager_SubscriptionManager(_this4.runtimeURL, _this4.messageBus, _this4.storages.subscriptions); // Prepare the address allocation instance;\n\n _this4.addressAllocation = new allocation_AddressAllocation(_this4.runtimeURL, _this4.messageBus, _this4.registry, _this4.subscriptionManager); // Instantiate the Policy Engine\n\n _this4.policyEngine = new policy_PEP(new context_RuntimeCoreCtx(_this4.runtimeURL, _this4.identityModule, _this4.registry, _this4.storages.policy, _this4.runtimeCapabilities)); // Instantiate Discovery\n\n _this4.coreDiscovery = new discovery_CoreDiscovery(_this4.runtimeURL, _this4.messageBus, _this4.graphConnector, _this4.runtimeFactory, _this4.registry); // Instantiate the identityHandler\n\n _this4.identityHandler = new identity_IdentityHandler(_this4.identityModule); // initialise the CryptoManager\n\n cryptoManager_CryptoManager.init(_this4.runtimeURL, _this4.runtimeCapabilities, _this4.storages.cryptoManager, _this4._dataObjectsStorage, _this4.registry, _this4.coreDiscovery, _this4.identityModule, _this4.runtimeFactory); // Instantiate the Graph Connector\n // this.graphConnector = process.env.MODE !== 'light' ? new GraphConnector(this.runtimeURL, this.messageBus, this.storageManager) : null;\n\n _this4.handlers = new runtime_MsgBusHandlers(_this4.policyEngine, _this4.identityHandler, cryptoManager_CryptoManager); // (un)comment bellow to not encrypt messages\n\n _this4.messageBus.pipelineOut.handlers = [_this4.handlers.idmHandler, _this4.handlers.pepOutHandler];\n _this4.messageBus.pipelineIn.handlers = [_this4.handlers.pepInHandler]; // (un)comment bellow to encrypt messages\n // this.messageBus.pipelineOut.handlers = [this.handlers.idmHandler, this.handlers.pepOutHandler, this.handlers.encryptHandler];\n // this.messageBus.pipelineIn.handlers = [this.handlers.decryptHandler, this.handlers.pepInHandler];\n // Add to App Sandbox the listener;\n\n appSandbox.addListener('*', function (msg) {\n _this4.messageBus.postMessage(msg);\n });\n cryptoManager_CryptoManager.messageBus = _this4.messageBus; // Register messageBus on Registry\n\n _this4.registry.messageBus = _this4.messageBus; // Policy Engine\n\n _this4.policyEngine.messageBus = _this4.messageBus; // Register messageBus on IDM\n\n _this4.identityModule.messageBus = _this4.messageBus; // Register registry on IdentityModule\n\n _this4.identityModule.registry = _this4.registry; // Register coreDiscovery on IdentityModule\n\n _this4.identityModule.coreDiscovery = _this4.coreDiscovery; // Use sandbox factory to use specific methods\n // and set the message bus to the factory\n\n _this4.runtimeFactory.messageBus = _this4.messageBus; // Instanciate the SyncherManager;\n\n _this4.syncherManager = new syncher_SyncherManager(_this4.runtimeURL, _this4.messageBus, _this4.registry, _this4.runtimeCatalogue, _this4.storages.syncherManager, null, _this4._dataObjectsStorage, _this4.identityModule); // Set into loader the needed components;\n\n _this4.loader.runtimeURL = _this4.runtimeURL;\n _this4.loader.messageBus = _this4.messageBus;\n _this4.loader.registry = _this4.registry;\n _this4.loader.runtimeCatalogue = _this4.runtimeCatalogue;\n _this4.loader.runtimeFactory = _this4.runtimeFactory; //Instantiate Discovery Lib for notification testing\n // this.discovery = new Discovery(\"hyperty://localhost/test\", this.runtimeURL, this.messageBus);\n // this.loadStub(\"localhost\");\n // setTimeout(() => {\n // this.discovery.discoverHypertiesDO(\"user://google.com/openidtest20@gmail.com\")\n // .then(hyperties => {\n // hyperties.forEach(hyperty =>{\n // hyperty.onLive(() => log.log(`Notification from ${hyperty.data.hypertyID} changed to live`));\n // hyperty.onDisconnected(() => log.log(`Notification from ${hyperty.data.hypertyID} changed to disconnected`));\n // });\n // });\n // }, 2000);\n // this.subscriptionManager.init().then(()=>{\n // resolve(true);\n // });\n\n var prepareComponents = [];\n prepareComponents.push(_this4.subscriptionManager.init());\n prepareComponents.push(_this4.identityModule.init(guid));\n prepareComponents.push(cryptoManager_CryptoManager.loadSessionKeys());\n prepareComponents.push(_this4.registry.loadRegistry());\n prepareComponents.push(_this4._dataObjectsStorage.loadRemote());\n Promise.all(prepareComponents).then(function (result) {\n if (result.length === 5) {\n resolve(true);\n } else {\n reject('[RuntimeUA._loadComponents] Error ] ', result);\n }\n }).catch(function (reason) {\n throw Error(reason);\n });\n } catch (e) {\n reject(e);\n }\n });\n }\n /**\n * Deploy Hyperty from Catalogue URL\n *\n * @see https://github.com/reTHINK-project/specs/tree/master/datamodel/core/address\n *\n * @param {URL.HypertyCatalogueURL} hypertyCatalogueURL - The Catalogue URL used to identify descriptors in the Catalogue.\n * @param {boolean|URL.HypertyURL} [reuseURL=false] reuseURL - reuseURL is used to reuse the hypertyURL previously registred, by default the reuse is disabled;\n * @param {URL} appURL - the app url address; // TODO: improve this description;\n * @returns {Promise} this is Promise and returns true if all components are loaded with success or an error if someone fails.\n *\n * @memberOf RuntimeUA\n */\n\n }, {\n key: \"loadHyperty\",\n value: function loadHyperty(hypertyCatalogueURL) {\n var reuseURL = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var appURL = arguments.length > 2 ? arguments[2] : undefined;\n if (!hypertyCatalogueURL) throw new Error('Hyperty descriptor url parameter is needed');\n return this.loader.loadHyperty(hypertyCatalogueURL, reuseURL, appURL);\n }\n /**\n * Deploy Stub from Catalogue URL or domain url\n * @param {URL.URL} domain domain\n */\n\n }, {\n key: \"loadStub\",\n value: function loadStub(protocolstubCatalogueURL) {\n if (!protocolstubCatalogueURL) throw new Error('ProtoStub descriptor url parameter is needed');\n return this.loader.loadStub(protocolstubCatalogueURL);\n }\n /**\n * Deploy idpProxy from Catalogue URL or domain url\n * @param {URL.URL} domain domain\n */\n\n }, {\n key: \"loadIdpProxy\",\n value: function loadIdpProxy(ipdProxyCatalogueURL) {\n RuntimeUA_log.log('ipdProxyCatalogueURL', ipdProxyCatalogueURL);\n if (!ipdProxyCatalogueURL) throw new Error('The IDP Proxy URL is a needed parameter, could be a DOMAIN or a URL');\n return this.loader.loadIdpProxy(ipdProxyCatalogueURL);\n }\n /**\n * Used to close all the runtime; Unregister all hyperties;\n * @return {Promise} result of the close method, with true or false to the operation success;\n */\n\n }, {\n key: \"close\",\n value: function close(logOut) {\n console.log('Runtime core logout: ', logOut);\n\n var _this = this;\n\n if (logOut === true) {\n this.identityHandler.reset();\n }\n\n RuntimeUA_log.info('Unregister all hyperties');\n return new Promise(function (resolve, reject) {\n _this.registry.unregisterAllHyperties().then(function (result) {\n RuntimeUA_log.info('All the hyperties are unregisted with Success:', result);\n resolve(true);\n }).catch(function (reason) {\n RuntimeUA_log.error('Failed to unregister the hyperties', reason);\n reject(false);\n });\n });\n }\n /**\n * Used to reset the runtime by deleting all data from the storage manager;\n * @return {Promise} result of the reset method, with true or false to the operation success;\n */\n\n }, {\n key: \"reset\",\n value: function reset() {\n var _this5 = this;\n\n console.log('RuntimeUA.Runtime core reset: ');\n var reseting = [];\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //TODO: delegate db reset operation to each component\n // this.identityManager.reset();\n _this5._dataObjectsStorage.deleteRemotes().then(function () {\n return resolve();\n }).then(function () {\n _this5.storages.identity.get(false, false, 'identities').then(function (identities) {\n var identitiesKeys = Object.keys(identities);\n identitiesKeys.forEach(function (key) {\n reseting.push(_this5.storages.identity.delete(key, false, 'identities'));\n });\n reseting.push(_this5.storages.capabilities.delete('capabilities'));\n reseting.push(_this5.storages.cryptoManager.delete('userAsymmetricKey'));\n reseting.push(_this5.storages.hypertyResources.delete('hypertyResources'));\n reseting.push(_this5.storages.identity.delete('accessTokens'));\n reseting.push(_this5.storages.registry.delete('registry:DataObjectURLs'));\n reseting.push(_this5.storages.registry.delete('registry:HypertyURLs'));\n reseting.push(_this5.storages.runtime.delete('p2pHandler:URL'));\n reseting.push(_this5.storages.runtime.delete('runtime:URL')); // reseting.push(this.storages.runtimeCatalogue.delete('runtimeCatalogue'));\n\n reseting.push(_this5.storages.subscriptions.delete('subscriptions'));\n reseting.push(_this5.storages.syncherManager.delete('syncherManager:ObjectURLs'));\n reseting.push(_this5.storages.syncherManager.delete('remotes'));\n Promise.all(reseting).then(function (result) {\n RuntimeUA_log.info('[RuntimeUA.reset] reset with Success:', result);\n return resolve(true);\n }).catch(function (reason) {\n RuntimeUA_log.error('Failed to reset all DBs', reason);\n resolve(false);\n });\n });\n });\n });\n }\n }]);\n\n return RuntimeUA;\n}();\n\n/* harmony default export */ var runtime_RuntimeUA = __webpack_exports__[\"default\"] = (RuntimeUA_RuntimeUA);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjg4LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2xvZ0xldmVscy5qcz83ZDM0Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lL3J1bnRpbWVVdGlscy5qcz83YTFhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy91dGlscy91dGlscy5qcz9mYTdkIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9zeW5jaGVyL1Byb3h5T2JqZWN0LmpzPzRlZWIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvRGF0YU9iamVjdENoaWxkLmpzPzIxZTEiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvSGVhcnRCZWF0LmpzP2IxNjciLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2h5cGVydHktcmVzb3VyY2UvSHlwZXJ0eVJlc291cmNlLmpzP2NjNmMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3V0aWxzL0ltYWdlVG9vbHMuanM/MWUwNyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvaHlwZXJ0eS1yZXNvdXJjZS9GaWxlSHlwZXJ0eVJlc291cmNlLmpzPzUzNmYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2h5cGVydHktcmVzb3VyY2UvSHlwZXJ0eVJlc291cmNlRmFjdG9yeS5qcz9mMDgzIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9zeW5jaGVyL0RhdGFPYmplY3QuanM/OWQwMiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9EYXRhT2JqZWN0UmVwb3J0ZXIuanM/MjNmZiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9EYXRhT2JqZWN0T2JzZXJ2ZXIuanM/YzVjMyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9EYXRhUHJvdmlzaW9uYWwuanM/NDA0NyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9TeW5jaGVyLmpzPzE2ZDgiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvTm90aWZpY2F0aW9uSGFuZGxlci5qcz8yOGIyIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9JZGVudGl0eU1hbmFnZXIuanM/MTYzOCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cy5qcz83Yzg1Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9kaXNjb3ZlcnkvRGlzY292ZXJlZE9iamVjdC5qcz8wMjM5Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9kaXNjb3ZlcnkvRGlzY292ZXJ5LmpzPzRhNDYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3V0aWxzL1NlYXJjaC5qcz9mYzlhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy91dGlscy9FdmVudEVtaXR0ZXIuanM/OGE4YSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY29udGV4dE1hbmFnZXIvQ29udGV4dE9ic2VydmVyLmpzP2NjZjAiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NvbnRleHRNYW5hZ2VyL0NvbnRleHRSZXBvcnRlci5qcz8yZGY4Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9Vc2VyUHJvZmlsZS5qcz81ODU4Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9NZXNzYWdlQm9keUlkZW50aXR5LmpzPzc1NDkiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL2NvbW11bmljYXRpb24uanM/Mzc5YiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY2hhdE1hbmFnZXIvSW52aXRhdGlvbnNIYW5kbGVyLmpzPzI3ZDAiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL0NoYXRDb250cm9sbGVyLmpzPzFkOWIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL1VzZXJJbmZvLmpzPzU3ZDQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL0NoYXRNYW5hZ2VyLmpzPzhkYWYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL0NoYXQuanM/MDBiZCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY2hhdE1hbmFnZXIvU2ltcGxlQ2hhdE1hbmFnZXIuanM/YTk1NSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc2FuZGJveC9TYW5kYm94RmFjdG9yeS5qcz8wYTZhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9zYW5kYm94L1NhbmRib3hSZWdpc3RyeS5qcz84YmU0Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9idXMvQnVzLmpzPzJlZjIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2J1cy9NaW5pQnVzLmpzP2Q5YWQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3NhbmRib3gvU2FuZGJveC5qcz83NTYzIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9hbGxvY2F0aW9uL0FkZHJlc3NBbGxvY2F0aW9uLmpzPzU2OGQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3JlZ2lzdHJ5L1JlZ2lzdHJ5RGF0YU1vZGVsLmpzP2M2OWYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3JlZ2lzdHJ5L0h5cGVydHlJbnN0YW5jZS5qcz9hYjZhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9yZWdpc3RyeS9Eb21haW5SZWdpc3RyYXRpb24uanM/ZWRlMSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcmVnaXN0cnkvUDJQQ29ubmVjdGlvblJlc29sdmUuanM/NjJiZiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvdXRpbHMvV2F0Y2hpbmdZb3UuanM/MTExZiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvVXRpbHMuanM/OWM4ZSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcmVnaXN0cnkvUmVnaXN0cnkuanM/ZDdiZCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS9ydW50aW1lQ29uZmlndXJhdGlvbi5qcz8wODNkIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9JZGVudGl0aWVzLmpzP2M0MjAiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2lkZW50aXR5L0d1aUZha2UuanM/OTA3ZSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvaWRlbnRpdHkvSWRlbnRpdHlNb2R1bGUuanM/NGVjNCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvaWRlbnRpdHkvSWRlbnRpdHlIYW5kbGVyLmpzPzMyZjUiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9BY3Rpb25zU2VydmljZS5qcz85ZTcyIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9wb2xpY3kvT3BlcmF0b3JzLmpzPzNiMmYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9QRFAuanM/MjJlZCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvQWxsb3dPdmVycmlkZXMuanM/MGQxNyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvQmxvY2tPdmVycmlkZXMuanM/N2Q2NyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvRmlyc3RBcHBsaWNhYmxlLmpzP2ExMzIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9jb25kaXRpb25zL0NvbmRpdGlvbi5qcz8zMzE1Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9wb2xpY3kvY29uZGl0aW9ucy9TdWJzY3JpcHRpb25Db25kaXRpb24uanM/N2UxYiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbmRpdGlvbnMvQWR2YW5jZWRDb25kaXRpb24uanM/OWMzMiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L1J1bGUuanM/NWRkOCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L1BvbGljeS5qcz9kMWFkIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9wb2xpY3kvUEVQLmpzPzlhMWYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2J1cy9QaXBlbGluZS5qcz84ZjhiIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9idXMvTWVzc2FnZUJ1cy5qcz85OTViIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9jcnlwdG9NYW5hZ2VyL3V0ZjguanM/OWRhZSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY3J5cHRvTWFuYWdlci9DcnlwdG8uanM/OTMzMiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY3J5cHRvTWFuYWdlci9DcnlwdG9NYW5hZ2VyLmpzP2JiNGMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUvTG9hZGVyLmpzP2U4YmQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUvU3RvcmFnZS5qcz83MzM4Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lL0Rlc2NyaXB0b3JzLmpzP2M2MmYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUvTXNnQnVzSGFuZGxlcnMuanM/NzYzNyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvZGlzY292ZXJ5L0NvcmVEaXNjb3ZlcnkuanM/YmY3NyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3RvcmUtb2JqZWN0cy9EYXRhT2JqZWN0c1N0b3JhZ2UuanM/ODlkNyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvdXRpbHMvUHJvbWlzZVF1ZXVlLmpzP2Q4NjIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2h5cGVydHktcmVzb3VyY2UvSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2UuanM/ZjllOSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9TdWJzY3JpcHRpb24uanM/Mjg5OSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9SZXBvcnRlck9iamVjdC5qcz81ZjllIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9zeW5jaGVyL09ic2VydmVyT2JqZWN0LmpzP2FhMzgiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvU3luY2hlck1hbmFnZXIuanM/NjU5OCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3Vic2NyaXB0aW9uTWFuYWdlci9TdWJzY3JpcHRpb24uanM/Nzk2MCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3Vic2NyaXB0aW9uTWFuYWdlci9TdWJzY3JpcHRpb25NYW5hZ2VyLmpzP2QwMjMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9SZVRoaW5rQ3R4LmpzP2NjMzEiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9jb250ZXh0L1J1bnRpbWVDb3JlQ3R4LmpzPzE2NGQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL1JldGhpbmtPYmplY3QuanM/YjkwYSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvQ2F0YWxvZ3VlRGF0YU9iamVjdC5qcz9mZTMxIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9Tb3VyY2VQYWNrYWdlLmpzP2FlMjkiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL0h5cGVydHlEZXNjcmlwdG9yLmpzP2VhOWMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL1Byb3RvY29sU3R1YkRlc2NyaXB0b3IuanM/YjBjYiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvSHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yLmpzP2VlMjgiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL0h5cGVydHlJbnRlcmNlcHRvckRlc2NyaXB0b3IuanM/YzY0YiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvRGF0YU9iamVjdFNjaGVtYS5qcz9mMTIzIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9DYXRhbG9ndWVEYXRhT2JqZWN0RmFjdG9yeS5qcz82ZTM0Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9SdW50aW1lQ2F0YWxvZ3VlLmpzPzQwYTYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUvUnVudGltZVVBLmpzPzgwYjAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICdsb2dsZXZlbCc7XG5cbmNvbnN0IGEgPSBsb2cuZ2V0TG9nZ2VyKCdhZGRyZXNzLWFsbG9jYXRpb24nKTtcbmNvbnN0IGIgPSBsb2cuZ2V0TG9nZ2VyKCdCdXMnKTtcbmNvbnN0IGMgPSBsb2cuZ2V0TG9nZ2VyKCdNZXNzYWdlQnVzJyk7XG5jb25zdCBkID0gbG9nLmdldExvZ2dlcignQ29yZURpc2NvdmVyeScpO1xuY29uc3QgZSA9IGxvZy5nZXRMb2dnZXIoJ1N0b3JhZ2VNYW5hZ2VyJyk7XG5jb25zdCBmID0gbG9nLmdldExvZ2dlcignSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2UnKTtcbmNvbnN0IGcgPSBsb2cuZ2V0TG9nZ2VyKCdJZGVudGl0eU1vZHVsZScpO1xuY29uc3QgaCA9IGxvZy5nZXRMb2dnZXIoJ1BFUCcpO1xuY29uc3QgaSA9IGxvZy5nZXRMb2dnZXIoJ1AyUENvbm5lY3Rpb25SZXNvbHZlJyk7XG5jb25zdCBqID0gbG9nLmdldExvZ2dlcignUmVnaXN0cnknKTtcbmNvbnN0IGsgPSBsb2cuZ2V0TG9nZ2VyKCdSdW50aW1lVUEnKTtcbmNvbnN0IGwgPSBsb2cuZ2V0TG9nZ2VyKCdMb2FkZXInKTtcbmNvbnN0IG0gPSBsb2cuZ2V0TG9nZ2VyKCdEZXNjcmlwdG9ycycpO1xuY29uc3QgbiA9IGxvZy5nZXRMb2dnZXIoJ0RhdGFPYmplY3RzU3RvcmFnZScpO1xuY29uc3QgbyA9IGxvZy5nZXRMb2dnZXIoJ1N1YnNjcmlwdGlvbicpO1xuY29uc3QgcCA9IGxvZy5nZXRMb2dnZXIoJ1N1YnNjcmlwdGlvbk1hbmFnZXInKTtcbmNvbnN0IHEgPSBsb2cuZ2V0TG9nZ2VyKCdPYnNlcnZlck9iamVjdCcpO1xuY29uc3QgciA9IGxvZy5nZXRMb2dnZXIoJ1JlcG9ydGVyT2JqZWN0Jyk7XG5jb25zdCBzID0gbG9nLmdldExvZ2dlcignU3luU3Vic2NyaXB0aW9uJyk7XG5jb25zdCB0ID0gbG9nLmdldExvZ2dlcignU3luY2hlck1hbmFnZXInKTtcbmNvbnN0IHUgPSBsb2cuZ2V0TG9nZ2VyKCdJZGVudGl0eUhhbmRsZXInKTtcbmNvbnN0IHYgPSBsb2cuZ2V0TG9nZ2VyKCdDcnlwdG9NYW5hZ2VyJyk7XG5jb25zdCB4ID0gbG9nLmdldExvZ2dlcignUGlwZWxpbmUnKTtcbmNvbnN0IGYxID0gbG9nLmdldExvZ2dlcignU3luY2hlcicpO1xuY29uc3QgZjIgPSBsb2cuZ2V0TG9nZ2VyKCdSdW50aW1lQ2F0YWxvZ3VlJyk7XG5cblxuZXhwb3J0IHsgbG9nIH07XG5cbi8qKlxuICAwIGFjdHVhbCBsb2dnaW5nIG1ldGhvZHMsIG9yZGVyZWQgYW5kIGF2YWlsYWJsZSBhczpcblxuICAgICAgMCAtIGxvZy50cmFjZShtc2cpXG4gICAgICAxIC0gbG9nLmRlYnVnKG1zZylcbiAgICAgIDIgLSBsb2cuaW5mbyhtc2cpXG4gICAgICAzIC0gbG9nLndhcm4obXNnKVxuICAgICAgNCAtIGxvZy5lcnJvcihtc2cpXG5cbiAgbG9nLmxvZyhtc2cpIGlzIGFsc28gYXZhaWxhYmxlLCBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnKG1zZyksIHRvIGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIGNvbnNvbGUsIGFuZCBtYWtlIG1pZ3JhdGlvbiBlYXNpZXIuXG5cbiAgRXhhY3Qgb3V0cHV0IGZvcm1hdHRpbmcgb2YgdGhlc2Ugd2lsbCBkZXBlbmQgb24gdGhlIGNvbnNvbGUgYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgeW91ciBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIG1hbnkgZW52aXJvbm1lbnRzIHdpbGwgaW5jbHVkZSBhIGZ1bGwgc3RhY2sgdHJhY2Ugd2l0aCBhbGwgdHJhY2UoKSBjYWxscywgYW5kIGljb25zIG9yIHNpbWlsYXIgdG8gaGlnaGxpZ2h0IG90aGVyIGNhbGxzLlxuXG4gIFRoZXNlIG1ldGhvZHMgc2hvdWxkIG5ldmVyIGZhaWwgaW4gYW55IGVudmlyb25tZW50LCBldmVuIGlmIG5vIGNvbnNvbGUgb2JqZWN0IGlzIGN1cnJlbnRseSBhdmFpbGFibGUsIGFuZCBzaG91bGQgYWx3YXlzIGZhbGwgYmFjayB0byBhbiBhdmFpbGFibGUgbG9nIG1ldGhvZCBldmVuIGlmIHRoZSBzcGVjaWZpYyBtZXRob2QgY2FsbGVkIChlLmcuIHdhcm4pIGlzbid0IGF2YWlsYWJsZS5cblxuICBCZSBhd2FyZSB0aGF0IGFsbCB0aGlzIG1lYW5zIHRoYXQgdGhlc2UgbWV0aG9kIHdvbid0IG5lY2Vzc2FyaWx5IGFsd2F5cyBwcm9kdWNlIGV4YWN0bHkgdGhlIG91dHB1dCB5b3UgZXhwZWN0IGluIGV2ZXJ5IGVudmlyb25tZW50OyBsb2dsZXZlbCBvbmx5IGd1YXJhbnRlZXMgdGhhdCB0aGVzZSBtZXRob2RzIHdpbGwgbmV2ZXIgZXhwbG9kZSBvbiB5b3UsIGFuZCB0aGF0IGl0IHdpbGwgY2FsbCB0aGUgbW9zdCByZWxldmFudCBtZXRob2QgaXQgY2FuIGZpbmQsIHdpdGggeW91ciBhcmd1bWVudC4gRmlyZWZveCBpcyBhIG5vdGFibGUgZXhhbXBsZSBoZXJlOiBkdWUgdG8gYSBjdXJyZW50IEZpcmVmb3ggYnVnIGxvZy50cmFjZShtc2cpIGNhbGxzIGluIEZpcmVmb3ggd2lsbCBwcmludCBvbmx5IHRoZSBzdGFja3RyYWNlLCBhbmQgd29uJ3QgaW5jbHVkZSBhbnkgcGFzc2VkIG1lc3NhZ2UgYXJndW1lbnRzLlxuXG4qL1xuXG5cbi8vIGFkZHJlc3MtYWxsb2NhdGlvblxuYS5zZXRMZXZlbCgwKTtcblxuLy8gQnVzXG5iLnNldExldmVsKDMpO1xuXG4vLyBNZXNzYWdlQnVzXG5jLnNldExldmVsKDMpO1xuXG4vLyBDb3JlRGlzY292ZXJ5XG5kLnNldExldmVsKDUpO1xuXG4vLyBTdG9yYWdlTWFuYWdlclxuZS5zZXRMZXZlbCgwKTtcblxuLy8gSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2VcbmYuc2V0TGV2ZWwoMyk7XG5cbi8vIElkZW50aXR5TW9kdWxlXG5nLnNldExldmVsKDApO1xuXG4vLyBQRVBcbmguc2V0TGV2ZWwoMyk7XG5cbi8vIFAyUENvbm5lY3Rpb25SZXNvbHZlXG5pLnNldExldmVsKDMpO1xuXG4vLyBSZWdpc3RyeVxuai5zZXRMZXZlbCgwKTtcblxuLy8gUnVudGltZVVBXG5rLnNldExldmVsKDApO1xuXG4vLyBMb2FkZXJcbmwuc2V0TGV2ZWwoMCk7XG5cbi8vIERlc2NyaXB0b3JzXG5tLnNldExldmVsKDMpO1xuXG4vLyBEYXRhT2JqZWN0c1N0b3JhZ2Vcbm4uc2V0TGV2ZWwoMCk7XG5cbi8vIFN1YnNjcmlwdGlvblxuby5zZXRMZXZlbCgzKTtcblxuLy8gU3Vic2NyaXB0aW9uTWFuYWdlclxucC5zZXRMZXZlbCgzKTtcblxuLy8gT2JzZXJ2ZXJPYmplY3RcbnEuc2V0TGV2ZWwoMCk7XG5cbi8vIFJlcG9ydGVyT2JqZWN0XG5yLnNldExldmVsKDApO1xuXG4vLyBTeW5TdWJzY3JpcHRpb25cbnMuc2V0TGV2ZWwoMyk7XG5cbi8vIFN5bmNoZXJNYW5hZ2VyXG50LnNldExldmVsKDApO1xuXG4vLyBJZGVudGl0eUhhbmRsZXJcbnUuc2V0TGV2ZWwoMyk7XG5cbi8vIENyeXB0b01hbmFnZXJcbnYuc2V0TGV2ZWwoMCk7XG5cbi8vIFBpcGVsaW5lXG54LnNldExldmVsKDApO1xuXG4vLyBTeW5jaGVyXG5mMS5zZXRMZXZlbCgwKTtcblxuLy8gU3luY2hlciBEYXRhT2JqZWN0T2JzZXJ2ZXJcbmYxLnNldExldmVsKDApO1xuXG4vLyBSdW50aW1lQ2F0YWxvZ3VlXG5mMi5zZXRMZXZlbCgwKTtcbiIsImV4cG9ydCBsZXQgcnVudGltZVV0aWxzID0ge1xuICBydW50aW1lRGVzY3JpcHRvcjoge30sXG4gIHJ1bnRpbWVDYXBhYmlsaXRpZXM6IHtcbiAgICBjb25zdHJhaW50czoge31cbiAgfVxufTtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cbi8qKlxuICogU3VwcG9ydCBtb2R1bGUgd2l0aCBzb21lIGZ1bmN0aW9ucyB3aWxsIGJlIHVzZWZ1bFxuICogQG1vZHVsZSB1dGlsc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgZGl2aWRlVVJMXG4gKiBAdHlwZSBPYmplY3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIFVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG9mIFVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkZW50aXR5IFRoZSBpZGVudGl0eSBvZiBVUkxcbiAqL1xuXG4vKipcbiAqIERpdmlkZSBhbiB1cmwgaW4gdHlwZSwgZG9tYWluIGFuZCBpZGVudGl0eVxuICogQHBhcmFtICB7VVJMLlVSTH0gdXJsIC0gdXJsIGFkZHJlc3NcbiAqIEByZXR1cm4ge2RpdmlkZVVSTH0gdGhlIHJlc3VsdCBvZiBkaXZpZGVVUkxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZVVSTCh1cmwpIHtcblxuICBmdW5jdGlvbiByZWN1cnNlKHZhbHVlKSB7XG4gICAgY29uc3QgcmVnZXggPSAvKFthLXpBLVotXSopKDpcXC9cXC8oPzpcXC4pP3w6KShbLWEtekEtWjAtOUA6JS5fK34jPV17MiwyNTZ9KShbLWEtekEtWjAtOUA6JS5fK34jPS9dKikvZ2k7XG4gICAgY29uc3Qgc3Vic3QgPSAnJDEsJDMsJDQnO1xuICAgIGxldCBwYXJ0cyA9IHZhbHVlLnJlcGxhY2UocmVnZXgsIHN1YnN0KS5zcGxpdCgnLCcpO1xuICAgIHJldHVybiBwYXJ0cztcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IHJlY3Vyc2UodXJsKTtcblxuICAvLyBJZiB0aGUgdXJsIGhhcyBubyBzY2hlbWVcbiAgaWYgKHBhcnRzWzBdID09PSB1cmwgJiYgIXBhcnRzWzBdLmluY2x1ZGVzKCdAJykpIHtcblxuICAgIGxldCByZXN1bHQgPSB7XG4gICAgICB0eXBlOiAnJyxcbiAgICAgIGRvbWFpbjogdXJsLFxuICAgICAgaWRlbnRpdHk6ICcnXG4gICAgfTtcblxuICAgIGNvbnNvbGUud2FybignW0RpdmlkZVVSTF0gRGl2aWRlVVJMIGRvblxcJ3Qgc3VwcG9ydCB1cmwgd2l0aG91dCBzY2hlbWUuIFBsZWFzZSByZXZpZXcgeW91ciB1cmwgYWRkcmVzcycsIHVybCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgdGhlIHVybCBoYXMgdGhlIHNjaGVtZSBhbmQgaW5jbHVkZXMgYW4gQFxuICBpZiAocGFydHNbMF0gPT09IHVybCAmJiBwYXJ0c1swXS5pbmNsdWRlcygnQCcpKSB7XG4gICAgbGV0IHNjaGVtZSA9IHBhcnRzWzBdID09PSB1cmwgPyAnc210cCcgOiBwYXJ0c1swXTtcbiAgICBwYXJ0cyA9IHJlY3Vyc2Uoc2NoZW1lICsgJzovLycgKyBwYXJ0c1swXSk7XG4gIH1cblxuICAvLyBpZiB0aGUgZG9tYWluIGluY2x1ZGVzIGFuIEAsIGRpdmlkZSBpdCB0byBkb21haW4gYW5kIGlkZW50aXR5IHJlc3BlY3RpdmVseVxuICBpZiAocGFydHNbMV0uaW5jbHVkZXMoJ0AnKSkge1xuICAgIHBhcnRzWzJdID0gcGFydHNbMF0gKyAnOi8vJyArIHBhcnRzWzFdO1xuICAgIHBhcnRzWzFdID0gcGFydHNbMV0uc3Vic3RyKHBhcnRzWzFdLmluZGV4T2YoJ0AnKSArIDEpO1xuICB9IFx0LyplbHNlIGlmIChwYXJ0c1syXS5pbmNsdWRlcygnLycpKSB7XG4gICAgcGFydHNbMl0gPSBwYXJ0c1syXS5zdWJzdHIocGFydHNbMl0ubGFzdEluZGV4T2YoJy8nKSsxKTtcbiAgfSovXG5cbiAgbGV0IHJlc3VsdCA9IHtcbiAgICB0eXBlOiBwYXJ0c1swXSxcbiAgICBkb21haW46IHBhcnRzWzFdLFxuICAgIGlkZW50aXR5OiBwYXJ0c1syXVxuICB9O1xuXG4gIHJldHVybiByZXN1bHQ7XG5cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBPYmplY3QgaXMgZW1wdHlcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqZWN0IE9iamVjdCB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICBzdGF0dXMgb2YgT2JqZWN0LCBlbXB0eSBvciBub3QgKHRydWV8ZmFsc2UpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlPYmplY3Qob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aCA+IDAgPyBmYWxzZSA6IHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWNvbmRzU2luY2VFcG9jaCgpIHtcbiAgcmV0dXJuIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xufVxuXG5cbi8qKlxuICogTWFrZSBhIENPUFkgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbiAqIEBwYXJhbSAge09iamVjdH0gIG9iaiAtIG9iamVjdCB0byBiZSBjbG9uZWRcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDbG9uZShvYmopIHtcbiAgLy9UT0RPOiBzaW1wbGUgYnV0IGluZWZmaWNpZW50IEpTT04gZGVlcCBjbG9uZS4uLlxuICBpZiAob2JqKSByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVBhdGhGcm9tVVJMKHVybCkge1xuICBsZXQgc3BsaXRVUkwgPSB1cmwuc3BsaXQoJy8nKTtcbiAgcmV0dXJuIHNwbGl0VVJMWzBdICsgJy8vJyArIHNwbGl0VVJMWzJdICsgJy8nICsgc3BsaXRVUkxbM107XG59XG5cbi8qKlxuICogT2J0YWlucyB0aGUgdXNlciBVUkwgdGhhdCBjb3JyZXNwb25kcyB0byBhIGdpdmVuIGVtYWlsXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVzZXJFbWFpbCBUaGUgdXNlciBlbWFpbFxuICogQHJldHVybiB7VVJMLlVSTH0gdXNlclVSTCBUaGUgdXNlciBVUkxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJVUkxGcm9tRW1haWwodXNlckVtYWlsKSB7XG4gIGxldCBpbmRleE9mQXQgPSB1c2VyRW1haWwuaW5kZXhPZignQCcpO1xuICByZXR1cm4gJ3VzZXI6Ly8nICsgdXNlckVtYWlsLnN1YnN0cmluZyhpbmRleE9mQXQgKyAxLCB1c2VyRW1haWwubGVuZ3RoKSArICcvJyArIHVzZXJFbWFpbC5zdWJzdHJpbmcoMCwgaW5kZXhPZkF0KTtcbn1cblxuLyoqXG4gKiBPYnRhaW5zIHRoZSB1c2VyIGVtYWlsIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBVUkxcbiAqIEBwYXJhbSAge1VSTC5VUkx9IHVzZXJVUkwgVGhlIHVzZXIgVVJMXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHVzZXJFbWFpbCBUaGUgdXNlciBlbWFpbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlckVtYWlsRnJvbVVSTCh1c2VyVVJMKSB7XG4gIGxldCB1cmwgPSBkaXZpZGVVUkwodXNlclVSTCk7XG4gIHJldHVybiB1cmwuaWRlbnRpdHkucmVwbGFjZSgnLycsICcnKSArICdAJyArIHVybC5kb21haW47IC8vIGlkZW50aXR5IGZpZWxkIGhhcyAnL2V4YW1wbGVJRCcgaW5zdGVhZCBvZiAnZXhhbXBsZUlEJ1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB1c2VyIGlkZW50aWZpZXIgaXMgYWxyZWFkeSBpbiB0aGUgVVJMIGZvcm1hdCwgaWYgbm90LCBjb252ZXJ0IHRvIFVSTCBmb3JtYXRcbiAqIEBwYXJhbSAge3N0cmluZ30gICBpZGVudGlmaWVyICB1c2VyIGlkZW50aWZpZXJcbiAqIEByZXR1cm4ge3N0cmluZ30gICB1c2VyVVJMICAgIHRoZSB1c2VyIFVSTFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvVXNlclVSTChpZGVudGlmaWVyKSB7XG5cbiAgLy8gY2hlY2sgaWYgdGhlIGlkZW50aWZpZXIgaXMgYWxyZWFkeSBpbiB0aGUgdXJsIGZvcm1hdFxuICBpZiAoaWRlbnRpZmllci5zdWJzdHJpbmcoMCwgNykgPT09ICd1c2VyOi8vJykge1xuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKGlkZW50aWZpZXIpO1xuXG4gICAgLy9jaGVjayBpZiB0aGUgdXJsIGlzIHdlbGwgZm9ybWF0ZWRcbiAgICBpZiAoZGl2aWRlZFVSTC5kb21haW4gJiYgZGl2aWRlZFVSTC5pZGVudGl0eSkge1xuICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93ICd1c2VyVVJMIHdpdGggd3JvbmcgZm9ybWF0JztcbiAgICB9XG5cbiAgLy9pZiBub3QsIGNvbnZlcnQgdGhlIHVzZXIgZW1haWwgdG8gVVJMIGZvcm1hdFxuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZXRVc2VyVVJMRnJvbUVtYWlsKGlkZW50aWZpZXIpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFPYmplY3RVUkwodXJsKSB7XG4gIGxldCBzY2hlbWFzVG9JZ25vcmUgPSBbJ2RvbWFpbi1pZHAnLCAncnVudGltZScsICdkb21haW4nLCAnaHlwZXJ0eSddO1xuICBsZXQgc3BsaXRVUkwgPSAodXJsKS5zcGxpdCgnOi8vJyk7XG4gIGxldCB1cmxTY2hlbWEgPSBzcGxpdFVSTFswXTtcblxuICByZXR1cm4gc2NoZW1hc1RvSWdub3JlLmluZGV4T2YodXJsU2NoZW1hKSA9PT0gLTE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xlZ2FjeSh1cmwpIHtcbiAgaWYgKHVybC5zcGxpdCgnQCcpLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVVJMKHVybCkge1xuICByZXR1cm4gKHVybCkuc3BsaXQoJy8nKS5sZW5ndGggPj0gMztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVXNlclVSTCh1cmwpIHtcbiAgcmV0dXJuIGRpdmlkZVVSTCh1cmwpLnR5cGUgPT09ICd1c2VyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSHlwZXJ0eVVSTCh1cmwpIHtcbiAgcmV0dXJuIGRpdmlkZVVSTCh1cmwpLnR5cGUgPT09ICdoeXBlcnR5Jztcbn1cblxuLyoqXG4gKiBnZXQgaW5mb3JtYXRpb24gcmVsYXRpdmUgZWFjaCBjb21wb25lbnQgY29uZmlndXJlZCBvbiBydW50aW1lIGNvbmZpZ3VyYXRpb247XG4gKiBAcGFyYW0gIHtvYmplY3R9IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggYWxsIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSAge3N0cmluZ30gY29tcG9uZW50ICAgICBzdHJpbmcgd2l0aCB0aGUgY29tcG9uZW50IHRvIGdldCB0aGUgY29uZmlndXJhdGlvbiwgbGlrZSwgcnVudGltZVVSTFMsIGNhdGFsb2d1ZVVSTHMsIG1zZ05vZGVVUkwsIGRvbWFpblJlZ2lzdHJ5VVJMO1xuICogQHBhcmFtICB7c3RyaW5nfSByZXNvdXJjZSAgICAgIHR5cGUgb2YgcmVzb3VyY2UgdG8gZ2V0LCBsaWtlLCBjYXRhbG9ndWUsIHJ1bnRpbWVVQSwgcHJvdG9jb2xzdHViLCBpZHBQcm94eVxuICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAgICAgIHJldHVybiBhbiBvYmplY3Qgd2l0aCBhbGwgY29uZmlndXJhdGlvbnM7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb25maWd1cmF0aW9uUmVzb3VyY2VzKGNvbmZpZ3VyYXRpb24sIGNvbXBvbmVudCwgcmVzb3VyY2UpIHtcbiAgbGV0IG9iamVjdFJlc291cmNlID0gY29uZmlndXJhdGlvbltjb21wb25lbnRdO1xuICBsZXQgcmVzb3VyY2VUeXBlID0gb2JqZWN0UmVzb3VyY2VbcmVzb3VyY2VdO1xuXG4gIHJldHVybiByZXNvdXJjZVR5cGU7XG59XG5cbi8qKlxuICogQnVpbGQgYSBmdWxsIHVybCB3aXRoIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb247XG4gKiBAcGFyYW0gIHtvYmplY3R9IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggYWxsIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSAge3N0cmluZ30gY29tcG9uZW50ICAgICBzdHJpbmcgd2l0aCB0aGUgY29tcG9uZW50IHRvIGdldCB0aGUgY29uZmlndXJhdGlvbiwgbGlrZSwgcnVudGltZVVSTFMsIGNhdGFsb2d1ZVVSTHMsIG1zZ05vZGVVUkwsIGRvbWFpblJlZ2lzdHJ5VVJMO1xuICogQHBhcmFtICB7c3RyaW5nfSByZXNvdXJjZSAgICAgIHR5cGUgb2YgcmVzb3VyY2UgdG8gZ2V0LCBsaWtlLCBjYXRhbG9ndWUsIHJ1bnRpbWVVQSwgcHJvdG9jb2xzdHViLCBpZHBQcm94eVxuICogQHBhcmFtICB7c3RyaW5nfSB0eXBlICAgICAgICAgIHJlc291cmNlIHRvIGdldCwgbGlrZSBhIGh5cGVydHkgbmFtZSBvciBwcm90b2NvbHN0dWIgbmFtZTtcbiAqIEBwYXJhbSAge2Jvb2xlYW59IHVzZUZhbGxiYWNrICBpZiB0cnVlIHRoZSBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIGhhdmUgYSBmYWxsYmFjayB1cmw7XG4gKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgcGFydGlhbCB1cmwgdG8gY29udGFjdCB0aGUgcmVzb3VyY2U7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFVSTChjb25maWd1cmF0aW9uLCBjb21wb25lbnQsIHJlc291cmNlLCB0eXBlLCB1c2VGYWxsYmFjayA9IGZhbHNlKSB7XG4gIGxldCBvYmplY3RSZXNvdXJjZSA9IGNvbmZpZ3VyYXRpb25bY29tcG9uZW50XTtcbiAgbGV0IHVybDtcblxuICBpZiAoIW9iamVjdFJlc291cmNlLmhhc093blByb3BlcnR5KHJlc291cmNlKSkge1xuICAgIHRocm93IEVycm9yKCdUaGUgY29uZmlndXJhdGlvbiAnICsgSlNPTi5zdHJpbmdpZnkob2JqZWN0UmVzb3VyY2UsICcnLCAyKSArICcgZG9uXFwndCBoYXZlIHRoZSAnICsgcmVzb3VyY2UgKyAnIHJlc291cmNlIHlvdSBhcmUgbG9va2luZyBmb3InKTtcbiAgfVxuXG4gIGxldCByZXNvdXJjZVR5cGUgPSBvYmplY3RSZXNvdXJjZVtyZXNvdXJjZV07XG5cbiAgaWYgKHR5cGUpIHtcbiAgICB1cmwgPSByZXNvdXJjZVR5cGUucHJlZml4ICsgY29uZmlndXJhdGlvbi5kb21haW4gKyByZXNvdXJjZVR5cGUuc3VmZml4ICsgdHlwZTtcbiAgICBpZiAocmVzb3VyY2VUeXBlLmhhc093blByb3BlcnR5KCdmYWxsYmFjaycpICYmIHVzZUZhbGxiYWNrKSB7XG4gICAgICBpZiAocmVzb3VyY2VUeXBlLmZhbGxiYWNrLmluZGV4T2YoJyVkb21haW4lJykpIHtcbiAgICAgICAgdXJsID0gcmVzb3VyY2VUeXBlLmZhbGxiYWNrLnJlcGxhY2UoLyglZG9tYWluJSkvZywgY29uZmlndXJhdGlvbi5kb21haW4pICsgdHlwZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVybCA9IHJlc291cmNlVHlwZS5mYWxsYmFjayArIHR5cGU7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHVybCA9IHJlc291cmNlVHlwZS5wcmVmaXggKyBjb25maWd1cmF0aW9uLmRvbWFpbiArIHJlc291cmNlVHlwZS5zdWZmaXg7XG4gIH1cblxuICAvLyBjb25zb2xlLmxvZyh1cmwpO1xuXG4gIHJldHVybiB1cmw7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBHbG9iYWwgVW5pcXVlIElEXG4gKlxuICogQHJldHVybnMgU3RyaW5nO1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVHVUlEKCkge1xuXG4gIGZ1bmN0aW9uIHM0KCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKVxuICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgLnN1YnN0cmluZygxKTtcbiAgfVxuXG4gIHJldHVybiBzNCgpICsgczQoKSArICctJyArIHM0KCkgKyAnLScgKyBzNCgpICsgJy0nICsgczQoKSArICctJyArIHM0KCkgKyBzNCgpICsgczQoKTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlcklkZW50aXR5RG9tYWluKHVybCkge1xuICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTCh1cmwpO1xuICBsZXQgc3BsaXRlZERvbWFpbiA9IGRpdmlkZWRVUkwuZG9tYWluLnNwbGl0KCcuJyk7XG4gIGxldCBzcGxpdGVkTGVuZ3RoID0gc3BsaXRlZERvbWFpbi5sZW5ndGg7XG4gIGlmIChzcGxpdGVkTGVuZ3RoID09IDEpIHtcbiAgICByZXR1cm4gc3BsaXRlZERvbWFpbltzcGxpdGVkTGVuZ3RoIC0gMV07XG4gIH1cbiAgbGV0IGRvbWFpbiA9IHNwbGl0ZWREb21haW5bc3BsaXRlZExlbmd0aCAtIDJdICsgJy4nICsgc3BsaXRlZERvbWFpbltzcGxpdGVkTGVuZ3RoIC0gMV07XG4gIHJldHVybiBkb21haW47XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgVVJMIGlzIGZyb20gYSBiYWNrZW5kIHNlcnZpY2VcbiAqIEBwYXJhbSAge3N0cmluZ30gdXJsICAgICBVUkwgdG8gYmUgcHJvY2Vzc2VkXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JhY2tlbmRTZXJ2aWNlVVJMKHVybCkge1xuICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTCh1cmwpO1xuICBsZXQgc3BsaXRlZERvbWFpbiA9IGRpdmlkZWRVUkwuZG9tYWluLnNwbGl0KCcuJyk7XG4gIGxldCBiYWNrZW5kU2NoZW1lcyA9IFsnZG9tYWluJywgJ2dsb2JhbCcsICdkb21haW4taWRwJ107IC8vIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSBydW50aW1lIGNvbmZpZ3VyYXRpb25cbiAgbGV0IGJhY2tlbmRTdWJEb21haW5zID0gWydyZWdpc3RyeScsICdtc2ctbm9kZSddOyAvLyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uXG4gIGxldCBzdWJEb21haW47XG5cbiAgaWYgKHNwbGl0ZWREb21haW4ubGVuZ3RoID4gMSkge1xuICAgIHN1YkRvbWFpbiA9IHNwbGl0ZWREb21haW4uZmlsdGVyKGl0ZW0gPT4gYmFja2VuZFN1YkRvbWFpbnMuaW5kZXhPZihpdGVtKSAhPT0gLTEpWzBdO1xuICB9XG5cbiAgaWYgKHN1YkRvbWFpbiAmJiBiYWNrZW5kU3ViRG9tYWlucy5pbmRleE9mKHN1YkRvbWFpbikgIT09IC0xKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZGl2aWRlZFVSTC50eXBlKSB7XG4gICAgcmV0dXJuIChiYWNrZW5kU2NoZW1lcy5pbmRleE9mKGRpdmlkZWRVUkwudHlwZSkgIT09IC0xKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZUVtYWlsKGVtYWlsKSB7XG4gIGxldCBpbmRleE9mQXQgPSBlbWFpbC5pbmRleE9mKCdAJyk7XG5cbiAgbGV0IHJlc3VsdCA9IHtcbiAgICB1c2VybmFtZTogZW1haWwuc3Vic3RyaW5nKDAsIGluZGV4T2ZBdCksXG4gICAgZG9tYWluOiBlbWFpbC5zdWJzdHJpbmcoaW5kZXhPZkF0ICsgMSwgZW1haWwubGVuZ3RoKVxuICB9O1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbihvYmosIGtleVBhdGgsIHZhbHVlKSB7XG5cbiAgaWYgKCFvYmopIG9iaiA9IHt9O1xuICBpZiAodHlwZW9mKGtleVBhdGgpID09PSAnc3RyaW5nJykga2V5UGF0aCA9IHBhcnNlQXR0cmlidXRlcyhrZXlQYXRoKTtcblxuICBsZXQgbGFzdEtleUluZGV4ID0ga2V5UGF0aC5sZW5ndGggLSAxO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdEtleUluZGV4OyArK2kpIHtcbiAgICBsZXQga2V5ID0ga2V5UGF0aFtpXTtcbiAgICBpZiAoIShrZXkgaW4gb2JqKSkge1xuICAgICAgb2JqW2tleV0gPSB7fTtcbiAgICB9XG5cbiAgICBvYmogPSBvYmpba2V5XTtcblxuICB9XG5cbiAgb2JqW2tleVBhdGhbbGFzdEtleUluZGV4XV0gPSB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0T2JqZWN0VVJMKGRhdGFPYmplY3RVUkwpIHtcbiAgY29uc29sZS5pbmZvKCdbdXRpbHMgLSBzcGxpdE9iamVjdFVSTF06ICcsIGRhdGFPYmplY3RVUkwpO1xuXG4gIGxldCBzcGxpdGVkVVJMID0gZGF0YU9iamVjdFVSTC5zcGxpdCgnLycpO1xuICBsZXQgdXJsID0gc3BsaXRlZFVSTFswXSArICcvLycgKyBzcGxpdGVkVVJMWzJdICsgJy8nICsgc3BsaXRlZFVSTFszXTtcbiAgbGV0IHJlc291cmNlID0gc3BsaXRlZFVSTFs1XTtcblxuICBsZXQgcmVzdWx0ID0ge1xuICAgIHVybDogdXJsLFxuICAgIHJlc291cmNlOiByZXNvdXJjZVxuICB9O1xuXG4gIGNvbnNvbGUuaW5mbygnW3V0aWxzIC0gc3BsaXRPYmplY3RVUkxdOiAnLCByZXN1bHQpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0F0dHJpYnV0ZShwYXRoKSB7XG5cbiAgbGV0IHJlZ2V4ID0gLygoKFthLXpBLVpdKyk6XFwvXFwvKFswLTlhLXpBLVpdWy1cXHddKlswLTlhLXpBLVpdXFwuKStbYS16QS1aXXsyLDl9KVxcL1thLXpBLVowLTkuXStAW2EtekEtWjAtOV0rKC0pP1thLXpBLVowLTldKyhcXC4pP1thLXpBLVowLTldezIsMTB9P1xcLlthLXpBLVpdezIsMTB9KSguKyg/PS5pZGVudGl0eSkpPy9nbTtcblxuICBsZXQgbGlzdCA9IFtdO1xuICBsZXQgZmluYWwgPSBbXTtcbiAgbGV0IHRlc3QgPSBwYXRoLm1hdGNoKHJlZ2V4KTtcblxuICBpZiAodGVzdCA9PSBudWxsKSB7XG4gICAgZmluYWwgPSBwYXRoLnNwbGl0KCcuJyk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IG07XG4gICAgd2hpbGUgKChtID0gcmVnZXguZXhlYyhwYXRoKSkgIT09IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGluZmluaXRlIGxvb3BzIHdpdGggemVyby13aWR0aCBtYXRjaGVzXG4gICAgICBpZiAobS5pbmRleCA9PT0gcmVnZXgubGFzdEluZGV4KSB7XG4gICAgICAgIHJlZ2V4Lmxhc3RJbmRleCsrO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgcmVzdWx0IGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBgbWAtdmFyaWFibGUuXG4gICAgICBtLmZvckVhY2goKG1hdGNoLCBncm91cEluZGV4KSA9PiB7XG4gICAgICAgIGlmIChncm91cEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgbGlzdC5wdXNoKG1hdGNoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCByZXN1bHQ7XG4gICAgbGlzdC5mb3JFYWNoKCh1cmwpID0+IHtcblxuICAgICAgcmVzdWx0ID0gcGF0aC5yZXBsYWNlKHVybCwgJyotKicpO1xuICAgICAgZmluYWwgPSByZXN1bHQuc3BsaXQoJy4nKS5tYXAoKGl0ZW0pID0+IHtcblxuICAgICAgICBpZiAoaXRlbSA9PT0gJyotKicpIHsgcmV0dXJuIHVybDsgfVxuXG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBjb25zb2xlLmxvZygnW1J1bnRpbWVDb3JlLlV0aWxzLmNoZWNrQXR0cmlidXRlXScsIGZpbmFsKTtcbiAgcmV0dXJuIGZpbmFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBdHRyaWJ1dGVzKHBhdGgpIHtcbiAgbGV0IHJlZ2V4ID0gLyhbMC05YS16QS1aXVstXFx3XSopOlxcL1xcLy9nO1xuXG4gIGxldCBzdHJpbmczID0gJ2lkZW50aXR5JztcblxuICBpZiAoIXBhdGguaW5jbHVkZXMoJzovLycpKSB7XG4gICAgcmV0dXJuIChwYXRoLnNwbGl0KCcuJykpO1xuICB9IGVsc2Uge1xuICAgIGxldCBzdHJpbmcxID0gcGF0aC5zcGxpdChyZWdleClbMF07XG5cbiAgICBsZXQgYXJyYXkxID0gc3RyaW5nMS5zcGxpdCgnLicpO1xuXG4gICAgbGV0IHN0cmluZzIgPSBwYXRoLnJlcGxhY2Uoc3RyaW5nMSwgJycpO1xuXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoc3RyaW5nMykpIHtcblxuICAgICAgbGV0IGFycmF5MiA9IHN0cmluZzIuc3BsaXQoc3RyaW5nMyArICcuJyk7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdhcnJheTIgJyArIGFycmF5Mik7XG5cbiAgICAgIHN0cmluZzIgPSBhcnJheTJbMF0uc2xpY2UoJy4nLCAtMSk7XG5cbiAgICAgIGFycmF5MiA9IGFycmF5MlsxXS5zcGxpdCgnLicpO1xuXG4gICAgICBhcnJheTEucHVzaChzdHJpbmcyLCBzdHJpbmczKTtcblxuICAgICAgYXJyYXkxID0gYXJyYXkxLmNvbmNhdChhcnJheTIpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGFycmF5MS5wdXNoKHN0cmluZzIpO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIChhcnJheTEuZmlsdGVyKEJvb2xlYW4pKTtcblxuICB9XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkob2JqKSB7XG4gIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG5cbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKSA9PT0gSlNPTi5zdHJpbmdpZnkoe30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hhdGtleXNUb1N0cmluZ0Nsb25lcihzZXNzaW9uS2V5cykge1xuICBsZXQgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmUgPSB7fTtcbiAgbGV0IGZpZWxkcyA9IE9iamVjdC5rZXlzKHNlc3Npb25LZXlzKTtcbiAgaWYgKGZpZWxkcykge1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICBmaWVsZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW2ldO1xuICAgICAgICBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZVtmaWVsZF0gPSB7fTtcbiAgICAgICAgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmVbZmllbGRdLnNlc3Npb25LZXkgPSBzZXNzaW9uS2V5c1tmaWVsZF0uc2Vzc2lvbktleS50b1N0cmluZygpO1xuICAgICAgICBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZVtmaWVsZF0uaXNUb0VuY3J5cHQgPSBzZXNzaW9uS2V5c1tmaWVsZF0uaXNUb0VuY3J5cHQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdfY2hhdGtleXNUb1N0cmluZ0Nsb25lcjplcnInLCBlcnIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGF0a2V5c1RvQXJyYXlDbG9uZXIoc2Vzc2lvbktleXMpIHtcbiAgbGV0IGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lID0ge307XG4gIGxldCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzZXNzaW9uS2V5cyk7XG4gIGlmIChmaWVsZHMpIHtcbiAgICB0cnkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAgZmllbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBmaWVsZCA9IGZpZWxkc1tpXTtcbiAgICAgICAgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmVbZmllbGRdID0ge307XG4gICAgICAgIGxldCBhcnJheVZhbHVlcyA9IEpTT04ucGFyc2UoJ1snICsgc2Vzc2lvbktleXNbZmllbGRdLnNlc3Npb25LZXkgKyAnXScpO1xuICAgICAgICBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZVtmaWVsZF0uc2Vzc2lvbktleSA9IG5ldyBVaW50OEFycmF5KGFycmF5VmFsdWVzKTtcbiAgICAgICAgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmVbZmllbGRdLmlzVG9FbmNyeXB0ID0gc2Vzc2lvbktleXNbZmllbGRdLmlzVG9FbmNyeXB0O1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignX2NoYXRrZXlzVG9BcnJheUNsb25lcjplcnInLCBlcnIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1lc3NhZ2VVUkwoVVJMKSB7XG4gIGxldCBzcGxpdGVkVG9VUkwgPSBVUkwuc3BsaXQoJy8nKTtcbiAgaWYgKHNwbGl0ZWRUb1VSTC5sZW5ndGggPD0gNikge1xuICAgIHJldHVybiBzcGxpdGVkVG9VUkxbMF0gKyAnLy8nICsgc3BsaXRlZFRvVVJMWzJdICsgJy8nICsgc3BsaXRlZFRvVVJMWzNdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzcGxpdGVkVG9VUkxbMF0gKyAnLy8nICsgc3BsaXRlZFRvVVJMWzJdICsgJy8nICsgc3BsaXRlZFRvVVJMWzNdICsgJy8nICsgc3BsaXRlZFRvVVJMWzRdO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdmFpbGFibGVTcGFjZSh1c2FnZSwgcXVvdGEpIHtcbiAgY29uc3QgYXZhaWxhYmxlID0gKHVzYWdlIC8gcXVvdGEpLnRvRml4ZWQoMik7XG4gIHJldHVybiB7XG4gICAgcXVvdGE6IHF1b3RhLFxuICAgIHVzYWdlOiB1c2FnZSxcbiAgICBwZXJjZW50OiBOdW1iZXIoYXZhaWxhYmxlKVxuICB9O1xufVxuXG4vKipcbiogRW5jb2RlcyBhIEpTIG9iamVjdCB0byBiYXNlIDY0IGVuY29kZVxuKiBAcGFyYW0gICB7T2JqZWN0fSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcbiogQHJldHVybiAge3N0cmluZ30gICBlbmNvZGVkIHZhbHVlXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZSh2YWx1ZSkge1xuICB0cnkge1xuICAgIGxldCBzdHJpbmdWYWx1ZSA9IHN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgcmV0dXJuIGJ0b2Eoc3RyaW5nVmFsdWUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMuZW5jb2RlOmVycl0gJyArIGVycik7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuICAqIERlY29kZSBhIGJhc2U2NCBzdHJpbmcgdG8gb2JqZWN0XG4gICogQHBhcmFtICAge3N0cmluZ19iNjR9ICAgIHZhbHVlICAgIHZhbHVlIGVuY29kZWQgaW4gYmFzZSA2NFxuICAqIEByZXR1cm4gIHtPYmplY3R9IGRlY29kZWRWYWx1ZVxuICAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZSh2YWx1ZSkge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGF0b2IodmFsdWUpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coJ1tVdGlscy5kZWNvZGU6ZXJyXSAnICsgZXJyKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLyoqXG4qIERlY29kZSBhIGJhc2U2NCBzdHJpbmcgdG8gVWludDhBcnJheVxuKiBAcGFyYW0gICB7c3RyaW5nX2I2NH0gICAgdmFsdWUgICAgYnl0ZUFycmF5IHZhbHVlXG4qIEByZXR1cm4gIHtVaW50OEFycmF5fSAgIGVuY29kZWQgdmFsdWVcbiovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVG9VaW50OEFycmF5KHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGRlY29kZSh2YWx1ZSkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMuZGVjb2RlVG9VaW50OEFycmF5OmVycl0gJyArIGVycik7XG4gICAgdGhyb3cgZXJyO1xuICB9XG59XG5cbi8qKlxuKiBDb252ZXJ0cyBhIEpTIG9iamVjdCB0byBzdHJpbmdcbiogTk9URTogU3BlY2lhbCBjb252ZXJzaW9uIGZvciBVaW50OEFycmF5c1xuKiBAcGFyYW0gICB7T2JqZWN0fSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcbiogQHJldHVybiAge1VpbnQ4QXJyYXl9ICAgZW5jb2RlZCB2YWx1ZVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUpIHtcbiAgdHJ5IHtcbiAgICBsZXQgc3RyaW5nVmFsdWU7XG4gICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBVaW50OEFycmF5KSB7XG4gICAgICBzdHJpbmdWYWx1ZSA9ICdbJyArIHZhbHVlLnRvU3RyaW5nKCkgKyAnXSc7IC8vIHRoZSBbXSBpcyBmb3IgSlNPTi5wYXJzZSBjb21wYXRpYmlsaXR5XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmluZ1ZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyaW5nVmFsdWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1tVdGlscy5zdHJpbmdpZnk6ZXJyXSAnICsgZXJyKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLyoqXG4qIENvbnZlcnRzIGEgc3RyaW5naWZpZWQgb2JqZWN0IHRvIG9iamVjdFxuKiBAcGFyYW0gICB7U3RyaW5nfSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcbiogQHJldHVybiAge09iamVjdH0gICBlbmNvZGVkIHZhbHVlXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMucGFyc2U6ZXJyXScgKyBlcnIpO1xuICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICBjb25zb2xlLmVycm9yKCdUaGF0IHRoYXQgY2F1c2UgdGhlIGVycm9yOicsIHZhbHVlKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cbn1cblxuLyoqXG4qIENvbnZlcnRzIGEgc3RyaW5naWZpZWQgb2JqZWN0IHRvIG9iamVjdFxuKiBAcGFyYW0gICB7U3RyaW5nfSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcbiogQHJldHVybiAge1VpbnQ4QXJyYXl9ICAgZW5jb2RlZCB2YWx1ZVxuKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRvVWludDhBcnJheSh2YWx1ZSkge1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShwYXJzZSh2YWx1ZSkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMucGFyc2VUb1VpbnQ4QXJyYXk6ZXJyXScgKyBlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxufVxuIiwiaW1wb3J0ICdwcm94eS1vYnNlcnZlJztcbmltcG9ydCB7cGFyc2VBdHRyaWJ1dGVzfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbmNvbnN0IG9iamVjdFR5cGUgPSB7QVJSQVk6ICdbb2JqZWN0IEFycmF5XScsIE9CSkVDVDogJ1tvYmplY3QgT2JqZWN0XScgfTtcblxuLyoqXG4gKiBAYWNjZXNzIHByaXZhdGVcbiAqIE1haW4gY2xhc3MgdGhhdCBtYWludGFpbnMgYSBKU09OIG9iamVjdCwgYW5kIG9ic2VydmVzIGNoYW5nZXMgaW4gdGhpcyBvYmplY3QsIHJlY3Vyc2l2ZWx5LlxuICogSW50ZXJuYWwgb2JqZWN0cyBhbmQgYXJyYXlzIGFyZSBhbHNvIG9ic2VydmVkLlxuICovXG5jbGFzcyBTeW5jT2JqZWN0IHtcblxuICBjb25zdHJ1Y3Rvcihpbml0aWFsRGF0YSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5fb2JzZXJ2ZXJzID0gW107XG4gICAgX3RoaXMuX2ZpbHRlcnMgPSB7fTtcblxuICAgIHRoaXMuX2RhdGEgPSBpbml0aWFsRGF0YSB8fCB7fTtcblxuICAgIHRoaXMuX2ludGVybmFsT2JzZXJ2ZSh0aGlzLl9kYXRhKTtcbiAgfVxuXG4gIGdldCBkYXRhKCkgeyByZXR1cm4gdGhpcy5fZGF0YTsgfVxuXG4gIG9ic2VydmUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vYnNlcnZlcnMucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICBmaW5kKHBhdGgpIHtcbiAgICBsZXQgbGlzdCA9IHBhcnNlQXR0cmlidXRlcyhwYXRoKTtcblxuICAgIHJldHVybiB0aGlzLl9maW5kV2l0aFNwbGl0KGxpc3QpO1xuICB9XG5cbiAgZmluZEJlZm9yZShwYXRoKSB7XG4gICAgbGV0IHJlc3VsdCA9IHt9O1xuICAgIGxldCBsaXN0ID0gcGFyc2VBdHRyaWJ1dGVzKHBhdGgpO1xuICAgIHJlc3VsdC5sYXN0ID0gbGlzdC5wb3AoKTtcbiAgICByZXN1bHQub2JqID0gdGhpcy5fZmluZFdpdGhTcGxpdChsaXN0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfZmluZFdpdGhTcGxpdChsaXN0KSB7XG4gICAgbGV0IG9iaiA9IHRoaXMuX2RhdGE7XG4gICAgbGlzdC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgb2JqID0gb2JqW3ZhbHVlXTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBfaW50ZXJuYWxPYnNlcnZlKG9iamVjdCkge1xuXG4gICAgbGV0IGhhbmRsZXIgPSAoY2hhbmdlc2V0KSA9PiB7XG5cbiAgICAgIGNoYW5nZXNldC5ldmVyeSgoY2hhbmdlKSA9PiB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlcyhjaGFuZ2UpO1xuICAgICAgfSk7XG5cbiAgICB9O1xuXG4gICAgdGhpcy5fZGF0YSA9IE9iamVjdC5kZWVwT2JzZXJ2ZShvYmplY3QsIGhhbmRsZXIpO1xuXG4gIH1cblxuICBfZmlyZUV2ZW50KGV2ZW50KSB7XG4gICAgdGhpcy5fb2JzZXJ2ZXJzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBfb25DaGFuZ2VzKGNoYW5nZSkge1xuXG4gICAgbGV0IG9iaiA9IGNoYW5nZS5vYmplY3Q7XG4gICAgbGV0IG9ialR5cGU7XG5cbiAgICBpZiAob2JqLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcbiAgICAgIG9ialR5cGUgPSBPYmplY3RUeXBlLk9CSkVDVDtcbiAgICB9XG5cbiAgICBpZiAob2JqLmNvbnN0cnVjdG9yID09PSBBcnJheSkge1xuICAgICAgb2JqVHlwZSA9IE9iamVjdFR5cGUuQVJSQVk7XG4gICAgfVxuXG4gICAgbGV0IGZpZWxkU3RyaW5nID0gY2hhbmdlLmtleXBhdGg7XG5cbiAgICAvLyBjb25zb2xlLmxvZygnRmllbGQ6JywgZmllbGRTdHJpbmcpO1xuICAgIC8vIGNvbnNvbGUubG9nKCd0eXBlOicsIGNoYW5nZS50eXBlKTtcblxuICAgIC8vbGV0IG9sZFZhbHVlID0gY2hhbmdlLm9sZFZhbHVlO1xuICAgIGxldCBuZXdWYWx1ZSA9IG9ialtjaGFuZ2UubmFtZV07XG5cbiAgICAvLyBjb25zb2xlLmluZm8oY2hhbmdlLnR5cGUgKyAnIHwgRmllbGQ6ICcgKyBmaWVsZFN0cmluZyArICcgfCBOZXcgVmFsdWU6JywgSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpLCBmaWVsZFN0cmluZy5pbmNsdWRlcygnbGVuZ3RoJykpO1xuXG4gICAgaWYgKGNoYW5nZS50eXBlID09PSAndXBkYXRlJyAmJiAhZmllbGRTdHJpbmcuaW5jbHVkZXMoJy5sZW5ndGgnKSkge1xuICAgICAgdGhpcy5fZmlyZUV2ZW50KHtcbiAgICAgICAgY1R5cGU6IENoYW5nZVR5cGUuVVBEQVRFLFxuICAgICAgICBvVHlwZTogb2JqVHlwZSxcbiAgICAgICAgZmllbGQ6IGZpZWxkU3RyaW5nLFxuICAgICAgICBkYXRhOiBuZXdWYWx1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZS50eXBlID09PSAnYWRkJykge1xuICAgICAgdGhpcy5fZmlyZUV2ZW50KHtcbiAgICAgICAgY1R5cGU6IENoYW5nZVR5cGUuQURELFxuICAgICAgICBvVHlwZTogb2JqVHlwZSxcbiAgICAgICAgZmllbGQ6IGZpZWxkU3RyaW5nLFxuICAgICAgICBkYXRhOiBuZXdWYWx1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZS50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgdGhpcy5fZmlyZUV2ZW50KHtcbiAgICAgICAgY1R5cGU6IENoYW5nZVR5cGUuUkVNT1ZFLFxuICAgICAgICBvVHlwZTogb2JqVHlwZSxcbiAgICAgICAgZmllbGQ6IGZpZWxkU3RyaW5nXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxufVxuXG5leHBvcnQgbGV0IENoYW5nZVR5cGUgPSB7VVBEQVRFOiAndXBkYXRlJywgQUREOiAnYWRkJywgUkVNT1ZFOiAncmVtb3ZlJ307XG5leHBvcnQgbGV0IE9iamVjdFR5cGUgPSB7T0JKRUNUOiAnb2JqZWN0JywgQVJSQVk6ICdhcnJheSd9O1xuZXhwb3J0IGRlZmF1bHQgU3luY09iamVjdDtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cbi8vIExvZyBTeXN0ZW1cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignRGF0YU9iamVjdENoaWxkJyk7XG5cbmltcG9ydCBTeW5jT2JqZWN0IGZyb20gJy4vUHJveHlPYmplY3QnO1xuXG5pbXBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tICcuLi91dGlscy91dGlscy5qcyc7XG5cbi8qKlxuICogVGhlIGNsYXNzIHJldHVybmVkIGZyb20gdGhlIERhdGFPYmplY3QgYWRkQ2hpbGRyZW4gY2FsbCBvciBmcm9tIG9uQWRkQ2hpbGRyZW4gaWYgcmVtb3RlbHkgY3JlYXRlZC5cbiAqL1xuY2xhc3MgRGF0YU9iamVjdENoaWxkIC8qIGltcGxlbWVudHMgU3luY1N0YXR1cyAqLyB7XG4gIC8qIHByaXZhdGVcblxuICAtLS0tZXZlbnQgaGFuZGxlcnMtLS0tXG4gIF9vblJlc3BvbnNlSGFuZGxlcjogKGV2ZW50KSA9PiB2b2lkXG4gICovXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICogU2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IEh5cGVydGllcy4gSXQncyBjYWxsZWQgYnkgdGhlIERhdGFPYmplY3QuYWRkQ2hpbGRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcihwYXIpIHtcbiAgICAgIHRocm93ICdbRGF0YU9iamVjdENoaWxkXSAnICsgcGFyICsgJyBtYW5kYXRvcnkgcGFyYW1ldGVyIGlzIG1pc3NpbmcnO1xuICAgIH1cblxuICAgIGlucHV0LnBhcmVudCA/ICBfdGhpcy5fcGFyZW50ID0gaW5wdXQucGFyZW50IDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdwYXJlbnQnKTtcbiAgICBpbnB1dC51cmwgPyAgX3RoaXMuX3VybCA9IGlucHV0LnVybCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcigndXJsJyk7XG4gICAgaW5wdXQuY3JlYXRlZCA/IF90aGlzLl9jcmVhdGVkID0gaW5wdXQuY3JlYXRlZCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcignY3JlYXRlZCcpO1xuICAgIGlucHV0LnJlcG9ydGVyID8gX3RoaXMuX3JlcG9ydGVyID0gaW5wdXQucmVwb3J0ZXIgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3JlcG9ydGVyJyk7XG4gICAgaW5wdXQucnVudGltZSA/IF90aGlzLl9ydW50aW1lID0gaW5wdXQucnVudGltZSA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcigncnVudGltZScpO1xuICAgIGlucHV0LnNjaGVtYSA/IF90aGlzLl9zY2hlbWEgPSBpbnB1dC5zY2hlbWEgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3NjaGVtYScpO1xuICAgIGlucHV0LnBhcmVudE9iamVjdCA/IF90aGlzLl9wYXJlbnRPYmplY3QgPSBpbnB1dC5wYXJlbnRPYmplY3QgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3BhcmVudE9iamVjdCcpO1xuXG4gICAgaWYgKGlucHV0Lm5hbWUpIF90aGlzLl9uYW1lID0gaW5wdXQubmFtZTtcbiAgICBpZiAoaW5wdXQuZGVzY3JpcHRpb24pIF90aGlzLl9kZXNjcmlwdGlvbiA9IGlucHV0LmRlc2NyaXB0aW9uO1xuICAgIGlmIChpbnB1dC50YWdzKSBfdGhpcy5fdGFncyA9IGlucHV0LnRhZ3M7XG4gICAgaWYgKGlucHV0LnJlc291cmNlcykgX3RoaXMuX3Jlc291cmNlcyA9IGlucHV0LnJlc291cmNlcztcbiAgICBpZiAoaW5wdXQub2JzZXJ2ZXJTdG9yYWdlKSBfdGhpcy5fb2JzZXJ2ZXJTdG9yYWdlID0gaW5wdXQub2JzZXJ2ZXJTdG9yYWdlO1xuICAgIGlmIChpbnB1dC5wdWJsaWNPYnNlcnZhdGlvbikgX3RoaXMuX3B1YmxpY09ic2VydmF0aW9uID0gaW5wdXQucHVibGljT2JzZXJ2YXRpb247XG5cbiAgICBfdGhpcy5fY2hpbGRJZCA9IGlucHV0LnVybDtcblxuICAgIGlmIChpbnB1dC5kYXRhKSB7XG4gICAgICBfdGhpcy5fc3luY09iaiA9IG5ldyBTeW5jT2JqZWN0KGlucHV0LmRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5fc3luY09iaiA9IG5ldyBTeW5jT2JqZWN0KHt9KTtcbiAgICB9XG5cbiAgICBsb2cubG9nKCdbRGF0YU9iamVjdENoaWxkIC0gIENvbnN0cnVjdG9yXSAtICcsIF90aGlzLl9zeW5jT2JqKTtcblxuICAgIF90aGlzLl9idXMgPSBfdGhpcy5fcGFyZW50T2JqZWN0Ll9idXM7XG4gICAgX3RoaXMuX293bmVyID0gX3RoaXMuX3BhcmVudE9iamVjdC5fb3duZXI7XG5cbiAgICBfdGhpcy5fYWxsb2NhdGVMaXN0ZW5lcnMoKTtcblxuICAgIF90aGlzLl9tZXRhZGF0YSA9IGlucHV0O1xuXG4gICAgLy8gZGVsZXRlIF90aGlzLl9tZXRhZGF0YS5kYXRhO1xuICAgIGRlbGV0ZSBfdGhpcy5fbWV0YWRhdGEucGFyZW50T2JqZWN0O1xuXG4gICAgX3RoaXMuX3NoYXJpbmdTdGF0dXMgPSBmYWxzZTtcblxuICB9XG5cbiAgZ2V0IHNoYXJlYWJsZSgpIHtcbiAgICBsZXQgc2hhcmVhYmxlID0gdGhpcy5tZXRhZGF0YTtcbiAgICBzaGFyZWFibGUuZGF0YSA9IHRoaXMuZGF0YTtcblxuICAgIHJldHVybiBzaGFyZWFibGU7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNoYXJlIHRoZSBjaGlsZCBPYmplY3QgYW1vbmcgYXV0aG9yaXNlZCBIeXBlcnRpZXNcbiAgICogQHBhcmFtICB7Ym9vbGVhbn0gICAgIHJlcG9ydGVyICBJZiB0cnVlIHRoZSBjaGlsZCBvYmplY3QgaXMgb25seSBzaGFyZWQgdG8gUGFyZW50IHJlcG9ydGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8SlNPTj59ICAgICAgICBJdCByZXR1cm5zIGEgcHJvbWlzZSB3aXRoIHRoZSBzaGFyaW5nIHJlc3VsdHMuXG4gICAqL1xuXG4gIHNoYXJlKHRvUmVwb3J0ZXIpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX3NoYXJpbmdTdGF0dXMgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGxldCB0bztcbiAgICAgIGxldCByZXBvcnRlciA9IHRvUmVwb3J0ZXI7XG5cbiAgICAgIGlmIChyZXBvcnRlcikge1xuICAgICAgICB0byA9IF90aGlzLm1ldGFkYXRhLnBhcmVudDtcbiAgICAgIH0gZWxzZSB0byA9IF90aGlzLm1ldGFkYXRhLnBhcmVudCArICcvY2hpbGRyZW4vJztcblxuICAgICAgbGV0IGNoaWxkVmFsdWUgPSBfdGhpcy5tZXRhZGF0YTtcbiAgICAgIGNoaWxkVmFsdWUuZGF0YSA9IF90aGlzLmRhdGE7XG5cbiAgICAgIC8vRkxPVy1PVVQ6IHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gYSByZXNvdXJjZSBjaGlsZCBhZGRyZXNzOiBNZXNzYWdlQnVzXG4gICAgICBsZXQgcmVxdWVzdE1zZyA9IHtcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsIGZyb206IF90aGlzLm1ldGFkYXRhLnJlcG9ydGVyLCB0bzogdG8sXG4gICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IGNoaWxkVmFsdWUudXJsLCB2YWx1ZTogY2hpbGRWYWx1ZSB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoX3RoaXMuaWRlbnRpdHkpICAgICAge1xuICAgICAgICByZXF1ZXN0TXNnLmJvZHkuaWRlbnRpdHkgPSBfdGhpcy5pZGVudGl0eTtcbiAgICAgIH1cblxuICAgICAgLy90byBiZSB1c2VkIHRvIGRpc2FibGUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIGZvciBsZWdhY3kgdXNlcnNcblxuICAgICAgaWYgKF90aGlzLl9wYXJlbnRPYmplY3QuZGF0YS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykpIHJlcXVlc3RNc2cuYm9keS5tdXR1YWwgPSBfdGhpcy5fcGFyZW50T2JqZWN0LmRhdGEubXV0dWFsO1xuXG4gICAgICBpZiAoX3RoaXMuX3BhcmVudE9iamVjdC5tZXRhZGF0YS5yZXBvcnRlciA9PT0gX3RoaXMubWV0YWRhdGEucmVwb3J0ZXIpIHtcbiAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShkZWVwQ2xvbmUocmVxdWVzdE1zZykpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBsZXQgY2FsbGJhY2sgPSAocmVwbHkpID0+IHtcblxuICAgICAgICAgIGlmIChyZXBseS50byA9PT0gX3RoaXMuX3JlcG9ydGVyKSB7XG4gICAgICAgICAgICBfdGhpcy5fYnVzLnJlbW92ZVJlc3BvbnNlTGlzdGVuZXIocmVxdWVzdE1zZy5mcm9tLCByZXBseS5pZCk7XG5cbiAgICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyLkRhdGFPYmplY3RDaGlsZC5zaGFyZV0gUGFyZW50IHJlcG9ydGVyIHJlcGx5ICcsIHJlcGx5KTtcblxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgY29kZTogcmVwbHkuYm9keSAmJiByZXBseS5ib2R5LmNvZGUgPyByZXBseS5ib2R5LmNvZGUgOiA1MDAsXG4gICAgICAgICAgICAgIGRlc2M6IHJlcGx5LmJvZHkgJiYgcmVwbHkuYm9keS5kZXNjID8gcmVwbHkuYm9keS5kZXNjIDogJ1Vua25vd24nXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlIDwgMzAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICB9IGVsc2UgcmV0dXJuIHJlamVjdChyZXN1bHQpO1xuXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBpZCA9IF90aGlzLl9idXMucG9zdE1lc3NhZ2UoZGVlcENsb25lKHJlcXVlc3RNc2cpLCBjYWxsYmFjaywgZmFsc2UpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PiB7XG5cbiAgICAgICAgICAvLyBJZiBSZXBvcnRlciBkb2VzICBub3QgcmVwbHkgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWRcbiAgICAgICAgICBfdGhpcy5fYnVzLnJlbW92ZVJlc3BvbnNlTGlzdGVuZXIocmVxdWVzdE1zZy5mcm9tLCBpZCk7XG5cbiAgICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogNDA4LFxuICAgICAgICAgICAgZGVzYzogJ3RpbW91dCdcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJldHVybiByZWplY3QocmVzdWx0KTtcblxuICAgICAgICB9LCAzMDAwKTtcblxuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2hhcmUgdGhlIGNoaWxkIE9iamVjdCBhbW9uZyBhdXRob3Jpc2VkIEh5cGVydGllc1xuICAgICAqIEBwYXJhbSAge2Jvb2xlYW59ICAgICByZXBvcnRlciAgSWYgdHJ1ZSB0aGUgY2hpbGQgb2JqZWN0IGlzIG9ubHkgc2hhcmVkIHRvIFBhcmVudCByZXBvcnRlclxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8SlNPTj59ICAgICAgICBJdCByZXR1cm5zIGEgcHJvbWlzZSB3aXRoIHRoZSBzaGFyaW5nIHJlc3VsdHMuXG4gICAgICovXG5cbiAgc3RvcmUoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBjaGlsZCA9IHt9O1xuICAgIGxldCBrZXkgPSBfdGhpcy5tZXRhZGF0YS5jaGlsZHJlbiArICcuJyArIF90aGlzLm1ldGFkYXRhLnVybDtcblxuICAgIGNoaWxkLnZhbHVlID0gX3RoaXMubWV0YWRhdGE7XG4gICAgY2hpbGQuaWRlbnRpdHkgPSBfdGhpcy5pZGVudGl0eTtcblxuICAgIGxldCBtc2cgPSB7XG5cbiAgICAgIGZyb206IF90aGlzLm1ldGFkYXRhLnJlcG9ydGVyLFxuICAgICAgdG86IF90aGlzLl9wYXJlbnRPYmplY3QuX3N5bmNoZXIuX3N1YlVSTCxcbiAgICAgIHR5cGU6ICdjcmVhdGUnLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogX3RoaXMubWV0YWRhdGEucGFyZW50LFxuICAgICAgICBhdHRyaWJ1dGU6IGtleSxcbiAgICAgICAgdmFsdWU6IGNoaWxkXG4gICAgICB9XG4gICAgfTtcblxuICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0Q2hpbGQuc3RvcmVdOicsIG1zZyk7XG5cbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1zZyk7XG4gIH1cblxuICBfYWxsb2NhdGVMaXN0ZW5lcnMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIC8vdGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgY2hpbGRyZW4gcmVwb3J0ZXJzXG4gICAgaWYgKF90aGlzLl9yZXBvcnRlciA9PT0gX3RoaXMuX293bmVyKSB7XG4gICAgICBfdGhpcy5fbGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKF90aGlzLl9yZXBvcnRlciwgKG1zZykgPT4ge1xuICAgICAgICBpZiAobXNnLnR5cGUgPT09ICdyZXNwb25zZScgJiYgbXNnLmlkID09PSBfdGhpcy5fbXNnSWQpIHtcbiAgICAgICAgICBsb2cubG9nKCdEYXRhT2JqZWN0Q2hpbGQub25SZXNwb25zZTonLCBtc2cpO1xuICAgICAgICAgIF90aGlzLl9vblJlc3BvbnNlKG1zZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9yZWxlYXNlTGlzdGVuZXJzKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoX3RoaXMuX2xpc3RlbmVyKSB7XG4gICAgICBfdGhpcy5fbGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgYW5kIGRlbGV0ZSBvYmplY3QgZGF0YVxuICAgKi9cbiAgZGVsZXRlKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cblxuICAgIF90aGlzLl9yZWxlYXNlTGlzdGVuZXJzKCk7XG5cbiAgICAvL1RPRE86IHNlbmQgZGVsZXRlIG1lc3NhZ2UgP1xuXG4gICAgLy8gbm90aGluZyB0byBiZSBkb25lXG4gICAgLy8gcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgLy8gICBsb2cubG9nKCdbRGF0YU9iamVjdENoaWxkLmRlbGV0ZV0nKTtcbiAgICAvLyAgIHJlc29sdmUoKTtcbiAgICAvLyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGwgTWV0YWRhdGEgYWJvdXQgdGhlIENoaWxkIERhdGEgT2JqZWN0XG4gICAqIEB0eXBlIHtPYmplY3R9IC1cbiAgICovXG4gIGdldCBtZXRhZGF0YSgpIHsgcmV0dXJuIHRoaXMuX21ldGFkYXRhOyB9XG5cbiAgLyoqXG4gICAqIENoaWxkcmVuIElEIGdlbmVyYXRlZCBvbiBhZGRDaGlsZHJlbi4gVW5pcXVlIGlkZW50aWZpZXJcbiAgICogQHR5cGUge1VSTH0gLSBVUkwgb2YgdGhlIGZvcm1hdCA8SHlwZXJ0eVVSTD4jPG51bWVyaWMtc2VxdWVuY2U+XG4gICAqL1xuICBnZXQgY2hpbGRJZCgpIHsgcmV0dXJuIHRoaXMuX2NoaWxkSWQ7IH1cblxuICAvKipcbiAgICogRGF0YSBTdHJ1Y3R1cmUgdG8gYmUgc3luY2hyb25pemVkLlxuICAgKiBAdHlwZSB7SlNPTn0gLSBKU09OIHN0cnVjdHVyZSB0aGF0IHNob3VsZCBmb2xsb3cgdGhlIGRlZmluZWQgc2NoZW1hLCBpZiBhbnkuXG4gICAqL1xuXG4gIGdldCBzaGFyaW5nU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLl9zaGFyaW5nU3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAgKiBEYXRhIFN0cnVjdHVyZSB0byBiZSBzeW5jaHJvbml6ZWQuXG4gICAgKiBAdHlwZSB7SlNPTn0gLSBKU09OIHN0cnVjdHVyZSB0aGF0IHNob3VsZCBmb2xsb3cgdGhlIGRlZmluZWQgc2NoZW1hLCBpZiBhbnkuXG4gICAgKi9cblxuICBnZXQgZGF0YSgpIHsgcmV0dXJuIHRoaXMuX3N5bmNPYmouZGF0YTsgfVxuXG4gIC8qKlxuICAgKiBTZXQgZm9yIHRoaXMgZGF0YU9iamVjdENoaWxkIGFuIGlkZW50aXR5XG4gICAqIEBtZXRob2QgaWRlbnRpdHlcbiAgICogQHBhcmFtICB7SWRlbnRpdHl9IGlkZW50aXR5IGlkZW50aXR5IGZyb20gd2hvIGNyZWF0ZWQgdGhlIG1lc3NhZ2VcbiAgICovXG4gIHNldCBpZGVudGl0eShpZGVudGl0eSkgeyB0aGlzLl9pZGVudGl0eSA9IGlkZW50aXR5OyB9XG5cbiAgLyoqXG4gICAqIEdldCBmb3IgdGhpcyBkYXRhT2JqZWN0Q2hpbGQgYW4gaWRlbnRpdHlcbiAgICogQG1ldGhvZCBpZGVudGl0eVxuICAgKiBAcmV0dXJuIHtJZGVudGl0eX0gaWRlbnRpdHkgZnJvbSB3aG8gY3JlYXRlZCB0aGUgbWVzc2FnZVxuICAgKi9cbiAgZ2V0IGlkZW50aXR5KCkgeyByZXR1cm4gdGhpcy5faWRlbnRpdHk7IH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIGNoYW5nZSBsaXN0ZW5lcnMgc2VudCBieSB0aGUgcmVwb3J0ZXIgY2hpbGRcbiAgICogQHBhcmFtIHtmdW5jdGlvbihldmVudDogTXNnRXZlbnQpfSBjYWxsYmFja1xuICAgKi9cbiAgb25DaGFuZ2UoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9zeW5jT2JqLm9ic2VydmUoKGV2ZW50KSA9PiB7XG4gICAgICBsb2cubG9nKCdbRGF0YU9iamVjdENoaWxkIC0gb2JzZXJ2ZXJdIC0gJywgZXZlbnQpO1xuICAgICAgY2FsbGJhY2soZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIHJlc3BvbnNlIG5vdGlmaWNhdGlvbnMgb2YgdGhlIGNyZWF0ZXNcbiAgICogQHBhcmFtIHtmdW5jdGlvbihldmVudDogTXNnRXZlbnQpfSBjYWxsYmFja1xuICAgKi9cbiAgb25SZXNwb25zZShjYWxsYmFjaykge1xuICAgIHRoaXMuX29uUmVzcG9uc2VIYW5kbGVyID0gY2FsbGJhY2s7XG4gIH1cblxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIHJlbW90ZSBEYXRhT2JqZWN0IC0+IF9vbkNoaWxkQ3JlYXRlXG4gIF9vblJlc3BvbnNlKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgZXZlbnQgPSB7XG4gICAgICB0eXBlOiBtc2cudHlwZSxcbiAgICAgIHVybDogbXNnLmJvZHkuc291cmNlLFxuICAgICAgY29kZTogbXNnLmJvZHkuY29kZVxuICAgIH07XG5cbiAgICBpZiAoX3RoaXMuX29uUmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICBfdGhpcy5fb25SZXNwb25zZUhhbmRsZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IERhdGFPYmplY3RDaGlsZDtcbiIsIlxuXG5pbXBvcnQgeyBzZWNvbmRzU2luY2VFcG9jaCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcblxuLyoqXG4gKiBDbGFzcyB0byBoYW5kbGUgQ2hpbGRyZW4gRGF0YSBPYmplY3QgSGVhcnQgYmVhdHMgXG4gKiByZXF1aXJlZCB0byBtYW5hZ2Ugc3luY2hyb25pc2F0aW9uIHdpdGggcmVtb3RlIHN0b3JhZ2Ugc2VydmVycy5cbiAqL1xuY2xhc3MgSGVhcnRCZWF0IHtcbiAgLyogcHJpdmF0ZVxuXG4gICovXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICogU2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IEh5cGVydGllcy4gSXQncyBjYWxsZWQgYnkgdGhlIERhdGFPYmplY3QgY29uc3RydWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKGJ1cywgaHlwZXJ0eVVybCwgcnVudGltZVVybCwgZGF0YU9iamVjdCwgaGVhcnRCZWF0UmF0ZSA9IDYwKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcihwYXIpIHtcbiAgICAgIHRocm93ICdbSGVhcnRCZWF0XSAnICsgcGFyICsgJyBtYW5kYXRvcnkgcGFyYW1ldGVyIGlzIG1pc3NpbmcnO1xuICAgIH1cblxuICAgIGJ1cyA/IF90aGlzLl9idXMgPSBidXMgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ2J1cycpO1xuICAgIGRhdGFPYmplY3QgPyBfdGhpcy5fZGF0YU9iamVjdCA9IGRhdGFPYmplY3QgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ2RhdGFPYmplY3QnKTtcbiAgICBoZWFydEJlYXRSYXRlID8gX3RoaXMuX2hlYXJ0QmVhdFJhdGUgPSBoZWFydEJlYXRSYXRlIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdoZWFydEJlYXRSYXRlJyk7XG4gICAgcnVudGltZVVybCA/IF90aGlzLl9ydW50aW1lVXJsID0gcnVudGltZVVybCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcigncnVudGltZVVybCcpO1xuICAgIGh5cGVydHlVcmwgPyBfdGhpcy5faHlwZXJ0eVVybCA9IGh5cGVydHlVcmwgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ2h5cGVydHlVcmwnKTtcbiAgICB0aGlzLmhlYXJ0YmVhdCA9IDA7XG5cbiAgICBfdGhpcy5fc3RvcCA9IHtcbiAgICAgIGhlYXJ0QmVhdDogZmFsc2UsXG4gICAgICBzeW5jOiBmdW5jdGlvbiAoYnVzKSB7XG4gICAgICAgIGxldCBzdG9wU3luY01zZyA9IHtcbiAgICAgICAgICBmcm9tOiBoeXBlcnR5VXJsLFxuICAgICAgICAgIHRvOiBydW50aW1lVXJsICsgJy9zbScsXG4gICAgICAgICAgdHlwZTogJ2V4ZWN1dGUnLFxuICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3N0b3BTeW5jJyxcbiAgICAgICAgICAgIHBhcmFtczogW2RhdGFPYmplY3QudXJsXVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zb2xlLmxvZygnW0hlYXJ0YmVhdC5zdG9wLnN5bmMoKV0gc2VuZGluZyBtc2c6Jywgc3RvcFN5bmNNc2cpO1xuXG4gICAgICAgIGJ1cy5wb3N0TWVzc2FnZShzdG9wU3luY01zZyk7XG5cbiAgICAgIH1cblxuICAgIH07XG5cbiAgfVxuXG4gIHN0YXJ0KHJlc3VtZSwgaXNSZXBvcnRlciA9IGZhbHNlKSB7XG5cbiAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdF0gc3RhcnRpbmcuIGlzUmVwb3J0ZXI6ICcsIGlzUmVwb3J0ZXIpO1xuXG4gICAgaWYgKHJlc3VtZSB8fCAhaXNSZXBvcnRlcikge1xuICAgICAgdGhpcy5fZ2V0TGFzdEhlYXJCZWF0KCkudGhlbigoKSA9PiB7XG4gICAgICAgIGxldCBpc0hlYXJ0QmVhdEFjdGl2ZSA9IHRoaXMuX2lzSGVhcnRCZWF0QWN0aXZlKHRoaXMuaGVhcnRCZWF0LCB0aGlzLl9oZWFydEJlYXRSYXRlICogMik7XG5cbiAgICAgICAgaWYgKCFpc0hlYXJ0QmVhdEFjdGl2ZSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0XSBoZWFydCBiZWF0cyBhcmUgZGlzYWJsZWQgZm9yICcsIHRoaXMuX2RhdGFPYmplY3QpO1xuXG4gICAgICAgICAgLy8gSXMgZGlzYWJsZWQ6IGxldHMgc3RhcnQgb2JzZXJ2ZXIgaGVhcnQgYmVhdCBhbmQgc3RhcnQgc3luY2hpbmcgd2l0aCByZW1vdGUgc3RvcmFnZSBzZXJ2ZXJcbiAgICAgICAgICB0aGlzLl9zdG9wLmhlYXJ0QmVhdCA9IHRoaXMuX3N0YXJ0SGVhcnRCZWF0KHRoaXMuX2hlYXJ0QmVhdFJhdGUpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0XSAgJywgdGhpcy5faHlwZXJ0eVVybCwgJyBzdGFydGVkIHN5bmNoaW5nIHdpdGggcmVtb3RlIHN0b3JhZ2Ugc2VydmVyJyk7XG4gICAgICAgICAgdGhpcy5fc3RhcnRTeW5jKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gIGhlYXJ0IGJlYXQgaXMgYWN0aXZlLCBcbiAgICAgICAgICAvLyBpdCBtZWFucyB0aGUgZGF0YSBvYmplY3QgaXMgYWxyZWFkeSBiZWluZyBzeW5jaHJvbmlzZWQgd2l0aCByZW1vdGUgc3RvcmFnZSBzZXJ2ZXJcbiAgICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gd2F0Y2ggdGhlIGhlYXJ0IGJlYXQgYW5kIHRyeSB0byByZXBsYWNlIGl0IGluIGNhc2UgaXQgZmFpbHMuXG4gICAgICAgICAgdGhpcy5fd2F0Y2hIZWFydEJlYXQodGhpcy5faGVhcnRCZWF0UmF0ZSwgdHJ1ZSwgdGhpcy5fb25IZXJ0YmVhdFN0b3BwZWQpO1xuXG4gICAgICAgIH1cblxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3N0YXJ0SGVhcnRCZWF0KHRoaXMuX2hlYXJ0QmVhdFJhdGUpO1xuICAgICAgdGhpcy5fc3RhcnRTeW5jKCk7XG4gICAgfSBcblxuICB9XG5cbiAgX2dldExhc3RIZWFyQmVhdCgpIHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICBcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdC5fZ2V0TGFzdEhlYXJCZWF0XSBzdG9wIHdhaXRpbmcgJyk7XG4gICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgfSwgdGhpcy5faGVhcnRCZWF0UmF0ZSAqIDEwMDAgKiAxLjUpO1xuICBcbiAgICB9KTtcblxuICB9XG5cbiAgc3RvcCgpIHtcbiAgICBpZiAodGhpcy5fc3RvcC5oZWFydEJlYXQpXG4gICAgICB0aGlzLl9zdG9wLmhlYXJ0QmVhdCgpO1xuXG4gICAgdGhpcy5fc3RvcC5zeW5jKHRoaXMuX2J1cyk7XG4gIH1cblxuICBnZXQgaGVhcnRCZWF0KCkge1xuICAgIGlmICh0aGlzLmhlYXJ0YmVhdClcbiAgICAgIHJldHVybiB0aGlzLmhlYXJ0YmVhdDtcbiAgICBlbHNlIHJldHVybiAwO1xuICB9XG5cbiAgb25OZXdIZWFydGJlYXQoaGVhcnRiZWF0KSB7XG4gICAgdGhpcy5oZWFydGJlYXQgPSBoZWFydGJlYXQ7XG4gIH1cblxuICBfaXNIZWFydEJlYXRBY3RpdmUobGFzdEhlYXJ0YmVhdCwgbWF4SGVhcnRCZWF0SW50ZXJ2YWwpIHtcbiAgICBsZXQgbGFzdEhlYXJ0UGVyaW9kSW50ZXJ2YWwgPSBzZWNvbmRzU2luY2VFcG9jaCgpIC0gbGFzdEhlYXJ0YmVhdDtcbiAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdC5faXNIZWFydEJlYXRBY3RpdmVdIG5vdyAtIGxhc3RIZWFydEJlYXQnLCBsYXN0SGVhcnRQZXJpb2RJbnRlcnZhbCk7XG5cbiAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdC5faXNIZWFydEJlYXRBY3RpdmVdICcsICEobGFzdEhlYXJ0UGVyaW9kSW50ZXJ2YWwgPiBtYXhIZWFydEJlYXRJbnRlcnZhbCAqIDIpKTtcbiAgICByZXR1cm4gKCEobGFzdEhlYXJ0UGVyaW9kSW50ZXJ2YWwgPiBtYXhIZWFydEJlYXRJbnRlcnZhbCAqIDIpKTtcbiAgfVxuXG5cbiAgX3N0YXJ0SGVhcnRCZWF0KHJhdGUpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IG1zZyA9IHtcbiAgICAgIGZyb206IF90aGlzLl9oeXBlcnR5VXJsLFxuICAgICAgdG86IF90aGlzLl9kYXRhT2JqZWN0LnVybCArICcvY2hpbGRyZW4vJyxcbiAgICAgIHR5cGU6ICdjcmVhdGUnLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogJ2hlYXJ0YmVhdCcsXG4gICAgICAgIG11dHVhbDogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBzZWNvbmRzU2luY2VFcG9jaCgpLFxuICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdC5fc3RhcnRIZWFydEJlYXRdIHN0YXJ0aW5nIC4uLiAnLCBtc2cuYm9keS52YWx1ZSk7XG5cbiAgICB0aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnKTtcblxuICAgIHRoaXMuaGVhcnRiZWF0ID0gc2Vjb25kc1NpbmNlRXBvY2goKTtcblxuICAgIGxldCBpZCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcblxuICAgICAgbGV0IG1zZyA9IHtcbiAgICAgICAgZnJvbTogX3RoaXMuX2h5cGVydHlVcmwsXG4gICAgICAgIHRvOiBfdGhpcy5fZGF0YU9iamVjdC51cmwgKyAnL2NoaWxkcmVuLycsXG4gICAgICAgIHR5cGU6ICdjcmVhdGUnLFxuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgcmVzb3VyY2U6ICdoZWFydGJlYXQnLFxuICAgICAgICAgIG11dHVhbDogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IHNlY29uZHNTaW5jZUVwb2NoKCksXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0XSAnLCBtc2cpO1xuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2cpO1xuICAgICAgdGhpcy5oZWFydGJlYXQgPSBzZWNvbmRzU2luY2VFcG9jaCgpO1xuXG4gICAgfSwgcmF0ZSAqIDEwMDApO1xuXG4gICAgLy8gcmV0dXJucyBmdW5jdGlvbiB0byBzdG9wIHRoZSBoZWFydCBiZWF0XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChpZCk7XG4gICAgfVxuICB9XG5cbiAgX3N0YXJ0U3luYygpIHtcblxuICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll9zdGFydFN5bmNdIHN0YXJ0aW5nIG9ic2VydmVyIHN5bmMgJywgdGhpcy5fZGF0YU9iamVjdC5kYXRhKTtcbiAgICBsZXQgYmFja3VwUmV2aXNpb24gPSB0aGlzLl9kYXRhT2JqZWN0LmRhdGEuYmFja3VwUmV2aXNpb247XG4gICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXQuX3N0YXJ0U3luY10gYmFja3VwUmV2aXNpb24gJywgYmFja3VwUmV2aXNpb24pO1xuICAgIGxldCBtc2cgPSB7XG4gICAgICBmcm9tOiB0aGlzLl9oeXBlcnR5VXJsLFxuICAgICAgdG86IHRoaXMuX3J1bnRpbWVVcmwgKyAnL3NtJyxcbiAgICAgIHR5cGU6ICdleGVjdXRlJyxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgbWV0aG9kOiAnc3luYycsXG4gICAgICAgIHBhcmFtczogW3RoaXMuX2RhdGFPYmplY3QudXJsLCBiYWNrdXBSZXZpc2lvbl1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdC5fc3RhcnRTeW5jXSBzZW5kaW5nIG1zZyAnLCBtc2cpO1xuXG4gICAgdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1zZyk7XG5cbiAgfVxuXG4gIF93YXRjaEhlYXJ0QmVhdChyYXRlLCBvbldhdGNoaW5nSXNFbmFibGVkLCBjYWxsYmFjaykge1xuICAgIC8vICBxZG8gbyBoZWFydEJlYXQgdGVybWluYXIgY2hhbWEgY2FsbGJhY2sgXG4gICAgLy8gdXNhIGhlYXJ0QmVhdCBSYXRpbmcgcGFyYSBpbmljaWFyIHRpbWVyIG5vIHJlc3BlY3Rpdm8gXG4gICAgLy8gY2FtcG8gZG8gRE8gY2hhbWFuZG8gaXNIZWFydEJlYXRBY3RpdmUoKVxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgc3luY0Z1biA9IGNhbGxiYWNrO1xuICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll93YXRjaEhlYXJ0QmVhdF0gc3RhcnRlZCB3YXRjaGluZyAnLCBfdGhpcy5oZWFydEJlYXQpO1xuXG4gICAgLy9sZXQgaGVhcnRCZWF0ID0gdHlwZSArICdIZWFydEJlYXQnO1xuXG4gICAgbGV0IHdhdGNoZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG5cbiAgICAgIGlmIChvbldhdGNoaW5nSXNFbmFibGVkICYmICFfdGhpcy5faXNIZWFydEJlYXRBY3RpdmUoX3RoaXMuaGVhcnRCZWF0LCBfdGhpcy5faGVhcnRCZWF0UmF0ZSkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXQuX3dhdGNoSGVhcnRCZWF0XSBoYXMgc3RvcHBlZCAnLCBfdGhpcy5fZGF0YU9iamVjdC5kYXRhKTtcblxuICAgICAgICBjbGVhckludGVydmFsKHdhdGNoZXIpO1xuICAgICAgICBzeW5jRnVuKF90aGlzKTtcbiAgICAgIH0gZWxzZSBpZiAoIW9uV2F0Y2hpbmdJc0VuYWJsZWQgJiYgdGhpcy5faXNIZWFydEJlYXRBY3RpdmUoX3RoaXMuaGVhcnRCZWF0LCBfdGhpcy5faGVhcnRCZWF0UmF0ZSkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXQuX3dhdGNoSGVhcnRCZWF0XSBoYXMgY2hhbmdlZCB0byBkaXNhYmxlZCAnLCBfdGhpcy5fZGF0YU9iamVjdC5kYXRhKTtcblxuICAgICAgICBjbGVhckludGVydmFsKHdhdGNoZXIpO1xuICAgICAgICBzeW5jRnVuKCk7XG4gICAgICB9XG5cbiAgICB9LCByYXRlICogMTAwMCAqIDIpO1xuXG4gIH1cblxuICBfb25IZXJ0YmVhdFN0b3BwZWQoX3RoaXMpIHtcblxuICAgIF90aGlzLl9zdGFydEhlYXJ0QmVhdChfdGhpcy5faGVhcnRCZWF0UmF0ZSk7XG4gICAgX3RoaXMuX3N0YXJ0U3luYygpO1xuICB9XG5cblxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlYXJ0QmVhdDtcbiIsIi8qKlxuKiBUaGUgSHlwZXJ0eSBSZXNvdXJjZSBEYXRhIE1vZGVsIGlzIHVzZWQgdG8gbW9kZWwgcmVzb3VjZXMgaGFuZGxlZCBieSBIeXBlcnRpZXMgYW5kIERhdGEgT2JqZWN0cyBpbmNsdWRpbmcgY2hhdCBtZXNzYWdlcywgZmlsZXMsIHJlYWwgdGltZSBodW1hbiBhdWRpbyBhbmQgdmlkZW8uLlxuKlxuKi9cblxuLy8gTG9nIFN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdIeXBlcnR5UmVzb3VyY2UnKTtcblxuaW1wb3J0IHsgZGVlcENsb25lIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuanMnO1xuaW1wb3J0IERhdGFPYmplY3RDaGlsZCBmcm9tICcuLi9zeW5jaGVyL0RhdGFPYmplY3RDaGlsZC5qcyc7XG5cbmNsYXNzIEh5cGVydHlSZXNvdXJjZSBleHRlbmRzIERhdGFPYmplY3RDaGlsZCB7XG5cbiAgLyoqXG4gICogSHlwZXJ0eVJlc291cmNlIGNvbnN0cnVjdG9yXG4gICpcbiAgKiBAcGFyYW0gIHtVUkx9IGxvY2FsUnVudGltZVVSTCBSdW50aW1lVVJMIG9mIGxvY2FsIHJ1bnRpbWVcbiAgKiBAcGFyYW0gIHtVUkx9IGlucHV0Lm93bmVyIEh5cGVydHlVUkwgb2YgdGhlIEh5cGVydHkgaGFuZGxpbmcgdGhpcyByZXNvdXJjZVxuICAqIEBwYXJhbSAge1VSTH0gaW5wdXQucnVudGltZSBSdW50aW1lIFVSTCB3aGVyZSB0aGlzIHJlc291cmNlIGlzIGhvc3RlZFxuICAqIEBwYXJhbSAge0J1c30gaW5wdXQuYnVzIHNhbmRib3ggbWVzc2FnZSBidXNcbiAgKiBAcGFyYW0gIHtEYXRhT2JqZWN0fSBpbnB1dC5wYXJlbnQgUGFyZW50IERhdGEgT2JqZWN0IHdoZXJlIHRoZSBIeXBlcnR5UmVzb3VyY2UgaXMgaGFuZGxlZCBhcyBhIGNoaWxkXG4gICogQHBhcmFtICB7Qm9vbGVhbn0gaXNTZW5kZXIgaW5kaWNhdGVzIGlmIHBhcmVudCBpcyBSZXBvcnRlciBvciBhbiBPYnNlcnZlclxuICAqIEBwYXJhbSAge0FycmF5fSBpbnB1dCBvcHRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzXG4gICovXG5cbiAgY29uc3RydWN0b3IoaXNTZW5kZXIsIGlucHV0KSB7XG4gICAgc3VwZXIoaW5wdXQpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5hcnJheWJ1ZmZlclNpemVMaW1pdCA9IDUyNDI4ODA7IC8vYWJvdmUgdGhpcyBsaW1pdCBjb250ZW50IGlzIG5vdCBzYXZlZCBhcyBBcnJheUJ1ZmZlclxuXG4gICAgX3RoaXMuX2lzU2VuZGVyID0gaXNTZW5kZXI7XG5cbiAgICBfdGhpcy5fbG9jYWxTdG9yYWdlVVJMID0gX3RoaXMuX3BhcmVudE9iamVjdC5fc3luY2hlci5fcnVudGltZVVybCArICcvc3RvcmFnZSc7XG5cbiAgfVxuXG4gIGdldCByZXNvdXJjZVR5cGUoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMubWV0YWRhdGEucmVzb3VyY2VUeXBlO1xuICB9XG5cbiAgZ2V0IG1pbWV0eXBlKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9tZXRhZGF0YS50eXBlO1xuICB9XG5cbiAgZ2V0IGNvbnRlbnQoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuX2NvbnRlbnQ7XG4gIH1cblxuICBnZXQgY29udGVudFVSTCgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fbWV0YWRhdGEuY29udGVudFVSTDtcbiAgfVxuXG4gIGdldCBzaGFyZWFibGUoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgc2hhcmVhYmxlID0gc3VwZXIubWV0YWRhdGE7XG4gICAgc2hhcmVhYmxlLnJlc291cmNlVHlwZSA9IF90aGlzLnJlc291cmNlVHlwZTtcbiAgICByZXR1cm4gc2hhcmVhYmxlO1xuICB9XG5cbiAgLypcbiAgc2V0IHBhcmVudChwYXJlbnQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gIH0qL1xuXG4gIHNhdmUoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgbGV0IG1zZyA9IHtcbiAgICAgICAgZnJvbTogX3RoaXMuX293bmVyLFxuICAgICAgICB0bzogX3RoaXMuX2xvY2FsU3RvcmFnZVVSTCxcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgIGJvZHk6IHsgdmFsdWU6IGRlZXBDbG9uZShfdGhpcy5fbWV0YWRhdGEpIH1cbiAgICAgIH07XG5cbiAgICAgIGxldCBjYWxsYmFjayA9IChyZXBseSkgPT4ge1xuICAgICAgICBsb2cuaW5mbygnW0h5cGVydHlSZXNvdXJjZS5zYXZlXSByZXBseTogJywgcmVwbHkpO1xuICAgICAgICBfdGhpcy5fYnVzLnJlbW92ZVJlc3BvbnNlTGlzdGVuZXIoX3RoaXMuX293bmVyLCByZXBseS5pZCk7XG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xuICAgICAgICAgIGlmIChyZXBseS5ib2R5LnZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLl9tZXRhZGF0YS5jb250ZW50VVJMKSBfdGhpcy5fbWV0YWRhdGEuY29udGVudFVSTCA9IFtdO1xuICAgICAgICAgICAgX3RoaXMuX21ldGFkYXRhLmNvbnRlbnRVUkwucHVzaChyZXBseS5ib2R5LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHJlcGx5LmJvZHkuY29kZSArICcgJyArIHJlcGx5LmJvZHkuZGVzYyk7XG5cbiAgICAgIH07XG5cbiAgICAgIG1zZy5ib2R5LnZhbHVlLmNvbnRlbnQgPSBfdGhpcy5fY29udGVudDtcblxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2csIGNhbGxiYWNrLCBmYWxzZSk7XG5cbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICogRnVuY3Rpb24gdG8gUmVhZCBIeXBlcnR5UmVzb3VyY2VcbiAgKlxuICAqIEBwYXJhbSAge30gY2FsbGJhY2sgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdpdGggcHJvZ3Jlc3MgaW5mb3JtYXRpb24gaW4gdGVybXMgb2YgcGVyY2VudGFnZVxuICAqIEByZXR1cm4gIHtQcm9taXNlfSAgaW5wdXQgb3B0aW9uYWwgaW5wdXQgcGFyYW1ldGVyc1xuICAqL1xuXG5cbiAgcmVhZChjYWxsYmFjaykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbG9nLmluZm8oJ1tIeXBlcnR5UmVzb3VyY2UucmVhZF0gJywgdGhpcyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGlmIChfdGhpcy5jb250ZW50KSB7XG4gICAgICAgIHJlc29sdmUoX3RoaXMpO1xuICAgICAgfSBlbHNlIHtcblxuICAgICAgICAvL1RPRE86IHVzZSBhbiBpdGVyYXRpb24gdG8gZ2V0IG9ubGluZSBydW50aW1lIHN0b3JhZ2VzIHdoZW4gc29tZSBhcmUgb2ZmbGluZVxuICAgICAgICBsZXQgc3RvcmFnZSA9IF90aGlzLl9nZXRCZXN0Q29udGVudFVSTChfdGhpcy5fbWV0YWRhdGEuY29udGVudFVSTCk7XG5cbiAgICAgICAgbG9nLmxvZygnU3RvcmFnZTonLCBzdG9yYWdlKTtcblxuICAgICAgICBsZXQgbXNnID0ge1xuICAgICAgICAgIGZyb206IF90aGlzLl9vd25lcixcbiAgICAgICAgICB0bzogc3RvcmFnZS51cmwsXG4gICAgICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IHN0b3JhZ2UudXJsICsgJy8nICsgc3RvcmFnZS5yZXNvdXJjZSwgcDJwOiB0cnVlIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoX3RoaXMubWV0YWRhdGEucDJwUmVxdWVzdGVyICYmIF90aGlzLm1ldGFkYXRhLnAycEhhbmRsZXIpIHtcbiAgICAgICAgICBtc2cuYm9keS5wMnBSZXF1ZXN0ZXIgPSBfdGhpcy5tZXRhZGF0YS5wMnBSZXF1ZXN0ZXI7XG4gICAgICAgICAgbXNnLmJvZHkucDJwSGFuZGxlciA9IF90aGlzLm1ldGFkYXRhLnAycEhhbmRsZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlIGZpcnN0IG9uIHRoZSBMb2NhbCBIeXBlcnR5IFJlc291cmNlIFN0b3JhZ2U7XG4gICAgICAgIF90aGlzLl9nZXRCZXN0UmVzb3VyY2UobXNnLCBjYWxsYmFjaykudGhlbigocmVwbHkpID0+IHtcbiAgICAgICAgICBsb2cuaW5mbygnW0h5cGVydHlSZXNvdXJjZV0gLSBnZXQgbG9jYWxseSB0aGUgcmVzb3VyY2U6JywgcmVwbHkpO1xuICAgICAgICAgIHJlc29sdmUoX3RoaXMpO1xuICAgICAgICB9KS5jYXRjaCgocmVwbHkpID0+IHtcblxuICAgICAgICAgIGxvZy53YXJuKCdbSHlwZXJ0eVJlc291cmNlXSAtIGdldCBsb2NhbGx5IHRoZSByZXNvdXJjZSBmYWlsJywgcmVwbHkpO1xuXG4gICAgICAgICAgLy8gR2VuZXJhdGUgbmV3IG1lc3NhZ2UgdG8gbm90IHVzZSB0aGUgc2FtZSBpZCBvZiB0aGUgbGFzdCBvbmU7XG4gICAgICAgICAgbGV0IG1zZyA9IHtcbiAgICAgICAgICAgIGZyb206IF90aGlzLl9vd25lcixcbiAgICAgICAgICAgIHRvOiBzdG9yYWdlLnJlbW90ZVVSTCxcbiAgICAgICAgICAgIHR5cGU6ICdyZWFkJyxcbiAgICAgICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IHN0b3JhZ2UucmVtb3RlVVJMICsgJy8nICsgc3RvcmFnZS5yZXNvdXJjZSwgcDJwOiB0cnVlIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKF90aGlzLm1ldGFkYXRhLnAycFJlcXVlc3RlciAmJiBfdGhpcy5tZXRhZGF0YS5wMnBIYW5kbGVyKSB7XG4gICAgICAgICAgICBtc2cuYm9keS5wMnBSZXF1ZXN0ZXIgPSBfdGhpcy5tZXRhZGF0YS5wMnBSZXF1ZXN0ZXI7XG4gICAgICAgICAgICBtc2cuYm9keS5wMnBIYW5kbGVyID0gX3RoaXMubWV0YWRhdGEucDJwSGFuZGxlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBnZXQgdGhlIHJlc291cmNlIG9uIHRoZSBSZW1vdGUgSHlwZXJ0eSBSZXNvdXJjZSBTdG9yYWdlO1xuICAgICAgICAgIF90aGlzLl9nZXRCZXN0UmVzb3VyY2UobXNnLCBjYWxsYmFjaykudGhlbigocmVwbHkpID0+IHtcbiAgICAgICAgICAgIGxvZy53YXJuKCdbSHlwZXJ0eVJlc291cmNlXSAtIGdldCByZW1vdGVseSB0aGUgcmVzb3VyY2UnLCByZXBseSk7XG4gICAgICAgICAgICByZXNvbHZlKF90aGlzKTtcbiAgICAgICAgICB9KS5jYXRjaCgocmVwbHkpID0+IHtcbiAgICAgICAgICAgIGxvZy53YXJuKCdbSHlwZXJ0eVJlc291cmNlXSAtIGdldCByZW1vdGVseSB0aGUgcmVzb3VyY2UgZmFpbCcsIHJlcGx5KTtcbiAgICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmNvZGUgKyAnICcgKyByZXBseS5ib2R5LmRlc2MpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfZ2V0QmVzdFJlc291cmNlKG1zZywgaW5Qcm9ncmVzc0NhbGxiYWNrKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGxldCB3YWl0Rm9yUmVzcG9uc2UgPSBzZXRUaW1lb3V0KCgpID0+IHtcblxuICAgICAgICAvLyBJZiBSZXBvcnRlciBkb2VzICBub3QgcmVwbHkgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWRcbiAgICAgICAgX3RoaXMuX2J1cy5yZW1vdmVSZXNwb25zZUxpc3RlbmVyKF90aGlzLl9vd25lciwgaWQpO1xuXG4gICAgICAgIG1zZy5ib2R5LmNvZGUgPSA0MDg7XG4gICAgICAgIG1zZy5ib2R5LmRlc2MgPSAnUmVzcG9uc2UgdGltZW91dCdcblxuICAgICAgICByZXR1cm4gcmVqZWN0KG1zZyk7XG5cbiAgICAgIH0sIDMwMDApO1xuXG4gICAgICBsZXQgY2FsbGJhY2sgPSAocmVwbHkpID0+IHtcbiAgICAgICAgbG9nLmxvZygnW0h5cGVydHlSZXNvdXJjZS5yZWFkXSByZXBseTogJywgcmVwbHkpO1xuICAgICAgICBsZXQgaWQgPSByZXBseS5pZDtcblxuICAgICAgICBjbGVhclRpbWVvdXQod2FpdEZvclJlc3BvbnNlKTtcblxuICAgICAgICBzd2l0Y2ggKHJlcGx5LmJvZHkuY29kZSkge1xuICAgICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgICAgX3RoaXMuX2NvbnRlbnQgPSByZXBseS5ib2R5LnZhbHVlLmNvbnRlbnQ7XG5cbiAgICAgICAgICAgIC8vIHNhdmUgbG9jYWxseSBpZiBub3QgdG9vIGJpZ1xuICAgICAgICAgICAgaWYgKHJlcGx5LmJvZHkudmFsdWUuc2l6ZSA8IF90aGlzLmFycmF5YnVmZmVyU2l6ZUxpbWl0KSB7XG4gICAgICAgICAgICAgIF90aGlzLnNhdmUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3RoaXMuX2J1cy5yZW1vdmVSZXNwb25zZUxpc3RlbmVyKF90aGlzLl9vd25lciwgaWQpO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXBseSk7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAxODM6XG4gICAgICAgICAgICBpblByb2dyZXNzQ2FsbGJhY2socmVwbHkuYm9keS52YWx1ZSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBfdGhpcy5fYnVzLnJlbW92ZVJlc3BvbnNlTGlzdGVuZXIoX3RoaXMuX293bmVyLCBpZCk7XG4gICAgICAgICAgICByZWplY3QocmVwbHkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgfTtcblxuICAgICAgbGV0IGlkID0gX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2csIGNhbGxiYWNrLCBmYWxzZSk7XG5cbiAgICB9KTtcblxuICB9XG5cbiAgLy8gUmVtb3ZlIEh5cGVydHkgZnJvbSB0aGUgbG9jYWwgc3RvcmFnZVxuXG4gIGRlbGV0ZSgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbG9nLmluZm8oJ1tIeXBlcnR5UmVzb3VyY2UuZGVsZXRlXScsIF90aGlzLm1ldGFkYXRhKTtcblxuXG4gICAgbGV0IG1zZyA9IHtcbiAgICAgIGZyb206IF90aGlzLl9vd25lcixcbiAgICAgIHRvOiBfdGhpcy5fbG9jYWxTdG9yYWdlVVJMLFxuICAgICAgdHlwZTogJ2RlbGV0ZScsXG4gICAgICBib2R5OiB7IHJlc291cmNlczogX3RoaXMubWV0YWRhdGEuY29udGVudFVSTCB9XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlIDwgMzAwKSByZXNvbHZlKHRydWUpO1xuICAgICAgICBlbHNlIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBfZ2V0QmVzdENvbnRlbnRVUkwoY29udGVudFVSTExpc3QpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBjb25zdCBjb250ZW50VVJMID0gY29udGVudFVSTExpc3RbMF07XG4gICAgY29uc3Qgc3BsaXRlZFJlc291cmNlID0gY29udGVudFVSTC5zdWJzdHIoY29udGVudFVSTC5sYXN0SW5kZXhPZignLycpICsgMSk7XG4gICAgY29uc3QgdXJsID0gX3RoaXMuX2xvY2FsU3RvcmFnZVVSTDsgLy8gY29udGVudFVSTC5zdWJzdHIoMCwgY29udGVudFVSTC5sYXN0SW5kZXhPZignLycpKTtcbiAgICBjb25zdCByZW1vdGVSZXNvdXJjZSA9IGNvbnRlbnRVUkwuc3Vic3RyKDAsIGNvbnRlbnRVUkwubGFzdEluZGV4T2YoJy8nKSk7XG5cbiAgICByZXR1cm4ge3VybDogdXJsLCByZXNvdXJjZTogc3BsaXRlZFJlc291cmNlLCByZW1vdGVVUkw6IHJlbW90ZVJlc291cmNlIH07XG5cbiAgfVxuXG59XG5cblxuZXhwb3J0IGRlZmF1bHQgSHlwZXJ0eVJlc291cmNlO1xuIiwibGV0IGhhc0Jsb2JDb25zdHJ1Y3RvciA9IHR5cGVvZihCbG9iKSAhPT0gJ3VuZGVmaW5lZCcgJiYgKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbihuZXcgQmxvYigpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59KCkpO1xuXG5sZXQgaGFzQXJyYXlCdWZmZXJWaWV3U3VwcG9ydCA9IGhhc0Jsb2JDb25zdHJ1Y3RvciAmJiB0eXBlb2YoVWludDhBcnJheSkgIT09ICd1bmRlZmluZWQnICYmIChmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtuZXcgVWludDhBcnJheSgxMDApXSkuc2l6ZSA9PT0gMTAwO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0oKSk7XG5cbmxldCBoYXNUb0Jsb2JTdXBwb3J0ID0gKHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiA/IEhUTUxDYW52YXNFbGVtZW50LnByb3RvdHlwZS50b0Jsb2IgOiBmYWxzZSk7XG5cbmxldCBoYXNCbG9iU3VwcG9ydCA9IChoYXNUb0Jsb2JTdXBwb3J0IHx8ICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgYXRvYiAhPT0gJ3VuZGVmaW5lZCcpKTtcblxubGV0IGhhc1JlYWRlclN1cHBvcnQgPSAodHlwZW9mIEZpbGVSZWFkZXIgIT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBVUkwgIT09ICd1bmRlZmluZWQnKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSW1hZ2VUb29scyB7XG4gICAgc3RhdGljIHJlc2l6ZShmaWxlLCBtYXhEaW1lbnNpb25zLCBjYWxsYmFjaykge1xuICAgICAgICBpZiAodHlwZW9mIG1heERpbWVuc2lvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrID0gbWF4RGltZW5zaW9ucztcbiAgICAgICAgICAgIG1heERpbWVuc2lvbnMgPSB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDY0MCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDQ4MFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhXaWR0aCAgPSBtYXhEaW1lbnNpb25zLndpZHRoO1xuICAgICAgICBsZXQgbWF4SGVpZ2h0ID0gbWF4RGltZW5zaW9ucy5oZWlnaHQ7XG5cbiAgICAgICAgaWYgKCFJbWFnZVRvb2xzLmlzU3VwcG9ydGVkKCkgfHwgIWZpbGUudHlwZS5tYXRjaCgvaW1hZ2UuKi8pKSB7XG4gICAgICAgICAgICBjYWxsYmFjayhmaWxlLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsZS50eXBlLm1hdGNoKC9pbWFnZVxcL2dpZi8pKSB7XG4gICAgICAgICAgICAvLyBOb3QgYXR0ZW1wdGluZywgY291bGQgYmUgYW4gYW5pbWF0ZWQgZ2lmXG4gICAgICAgICAgICBjYWxsYmFjayhmaWxlLCBmYWxzZSk7XG4gICAgICAgICAgICAvLyBUT0RPOiB1c2UgaHR0cHM6Ly9naXRodWIuY29tL2FudGltYXR0ZXIxNS93aGFtbXkgdG8gY29udmVydCBnaWYgdG8gd2VibVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG4gICAgICAgICAgICBcbiAgICAgICAgaW1hZ2Uub25sb2FkID0gKGltZ0V2dCkgPT4ge1xuICAgICAgICAgICAgbGV0IHdpZHRoICA9IGltYWdlLndpZHRoO1xuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGltYWdlLmhlaWdodDtcbiAgICAgICAgICAgIGxldCBpc1Rvb0xhcmdlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmICh3aWR0aCA+PSBoZWlnaHQgJiYgd2lkdGggPiBtYXhEaW1lbnNpb25zLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgLy8gd2lkdGggaXMgdGhlIGxhcmdlc3QgZGltZW5zaW9uLCBhbmQgaXQncyB0b28gYmlnLlxuICAgICAgICAgICAgICAgIGhlaWdodCAqPSBtYXhEaW1lbnNpb25zLndpZHRoIC8gd2lkdGg7XG4gICAgICAgICAgICAgICAgd2lkdGggPSBtYXhEaW1lbnNpb25zLndpZHRoO1xuICAgICAgICAgICAgICAgIGlzVG9vTGFyZ2UgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoZWlnaHQgPiBtYXhEaW1lbnNpb25zLmhlaWdodCkge1xuICAgICAgICAgICAgICAgIC8vIGVpdGhlciB3aWR0aCB3YXNuJ3Qgb3Zlci1zaXplIG9yIGhlaWdodCBpcyB0aGUgbGFyZ2VzdCBkaW1lbnNpb25cbiAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIGhlaWdodCBpcyBvdmVyLXNpemVcbiAgICAgICAgICAgICAgICB3aWR0aCAqPSBtYXhEaW1lbnNpb25zLmhlaWdodCAvIGhlaWdodDtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBtYXhEaW1lbnNpb25zLmhlaWdodDtcbiAgICAgICAgICAgICAgICBpc1Rvb0xhcmdlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc1Rvb0xhcmdlKSB7XG4gICAgICAgICAgICAgICAgLy8gZWFybHkgZXhpdDsgbm8gbmVlZCB0byByZXNpemVcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhmaWxlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgICAgIGxldCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgICAgICBpZiAoaGFzVG9CbG9iU3VwcG9ydCkge1xuICAgICAgICAgICAgICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soYmxvYiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSwgZmlsZS50eXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGJsb2IgPSBJbWFnZVRvb2xzLl90b0Jsb2IoY2FudmFzLCBmaWxlLnR5cGUpO1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGJsb2IsIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBJbWFnZVRvb2xzLl9sb2FkSW1hZ2UoaW1hZ2UsIGZpbGUpO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBfdG9CbG9iKGNhbnZhcywgdHlwZSkge1xuICAgICAgICBsZXQgZGF0YVVSSSA9IGNhbnZhcy50b0RhdGFVUkwodHlwZSk7XG4gICAgICAgIGxldCBkYXRhVVJJUGFydHMgPSBkYXRhVVJJLnNwbGl0KCcsJyk7XG4gICAgICAgIGxldCBieXRlU3RyaW5nO1xuICAgICAgICBpZiAoZGF0YVVSSVBhcnRzWzBdLmluZGV4T2YoJ2Jhc2U2NCcpID49IDApIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgYmFzZTY0IHRvIHJhdyBiaW5hcnkgZGF0YSBoZWxkIGluIGEgc3RyaW5nOlxuICAgICAgICAgICAgYnl0ZVN0cmluZyA9IGF0b2IoZGF0YVVSSVBhcnRzWzFdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgYmFzZTY0L1VSTEVuY29kZWQgZGF0YSBjb21wb25lbnQgdG8gcmF3IGJpbmFyeSBkYXRhOlxuICAgICAgICAgICAgYnl0ZVN0cmluZyA9IGRlY29kZVVSSUNvbXBvbmVudChkYXRhVVJJUGFydHNbMV0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XG4gICAgICAgIGxldCBpbnRBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIGludEFycmF5W2ldID0gYnl0ZVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1pbWVTdHJpbmcgPSBkYXRhVVJJUGFydHNbMF0uc3BsaXQoJzonKVsxXS5zcGxpdCgnOycpWzBdO1xuICAgICAgICBsZXQgYmxvYiA9IG51bGw7XG5cbiAgICAgICAgaWYgKGhhc0Jsb2JDb25zdHJ1Y3Rvcikge1xuICAgICAgICAgICAgYmxvYiA9IG5ldyBCbG9iKFxuICAgICAgICAgICAgICAgIFtoYXNBcnJheUJ1ZmZlclZpZXdTdXBwb3J0ID8gaW50QXJyYXkgOiBhcnJheUJ1ZmZlcl0sXG4gICAgICAgICAgICAgICAge3R5cGU6IG1pbWVTdHJpbmd9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJiID0gbmV3IEJsb2JCdWlsZGVyKCk7XG4gICAgICAgICAgICBiYi5hcHBlbmQoYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgYmxvYiA9IGJiLmdldEJsb2IobWltZVN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmxvYjtcbiAgICB9XG5cbiAgICBzdGF0aWMgX2xvYWRJbWFnZShpbWFnZSwgZmlsZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHR5cGVvZihVUkwpID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgICAgICAgICAgaW1hZ2Uuc3JjID0gZXZ0LnRhcmdldC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7IGNhbGxiYWNrKCk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjaygpOyB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgc3RhdGljIGlzU3VwcG9ydGVkKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgKHR5cGVvZihIVE1MQ2FudmFzRWxlbWVudCkgIT09ICd1bmRlZmluZWQnKSBcbiAgICAgICAgICAgICYmIGhhc0Jsb2JTdXBwb3J0XG4gICAgICAgICAgICAmJiBoYXNSZWFkZXJTdXBwb3J0XG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiLyoqXG4qIFRoZSBIeXBlcnR5IFJlc291cmNlIERhdGEgTW9kZWwgaXMgdXNlZCB0byBtb2RlbCByZXNvdWNlcyBoYW5kbGVkIGJ5IEh5cGVydGllcyBhbmQgRGF0YSBPYmplY3RzIGluY2x1ZGluZyBjaGF0IG1lc3NhZ2VzLCBmaWxlcywgcmVhbCB0aW1lIGh1bWFuIGF1ZGlvIGFuZCB2aWRlby4uXG4qXG4qL1xuXG4vLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0ZpbGVIeXBlcnR5UmVzb3VyY2UnKTtcblxuaW1wb3J0IEh5cGVydHlSZXNvdXJjZSBmcm9tICcuL0h5cGVydHlSZXNvdXJjZSc7XG5pbXBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tICcuLi91dGlscy91dGlscy5qcyc7XG5pbXBvcnQgSW1hZ2VUb29scyBmcm9tICcuLi91dGlscy9JbWFnZVRvb2xzLmpzJztcblxuXG5jbGFzcyBGaWxlSHlwZXJ0eVJlc291cmNlIGV4dGVuZHMgSHlwZXJ0eVJlc291cmNlIHtcblxuICAvKipcbiAgKiBGaWxlSHlwZXJ0eVJlc291cmNlIGNvbnN0cnVjdG9yXG4gICpcbiAgKiBAcGFyYW0gIHtVUkx9IG93bmVyIEh5cGVydHlVUkwgb2YgdGhlIEh5cGVydHkgaGFuZGxpbmcgdGhpcyByZXNvdXJjZVxuICAqIEBwYXJhbSAge1VSTH0gcnVudGltZSBSdW50aW1lIFVSTCB3aGVyZSB0aGlzIHJlc291cmNlIGlzIGhvc3RlZFxuICAqIEBwYXJhbSAge0J1c30gYnVzIHNhbmRib3ggbWVzc2FnZSBidXNcbiAgKiBAcGFyYW0gIHtEYXRhT2JqZWN0fSBwYXJlbnQgUGFyZW50IERhdGEgT2JqZWN0IHdoZXJlIHRoZSBIeXBlcnR5UmVzb3VyY2UgaXMgaGFuZGxlZCBhcyBhIGNoaWxkXG4gICogQHBhcmFtICB7RmlsZX0gZmlsZSBmaWxlIHRvIGJlIGVuY29kZWQgYXMgSHlwZXJ0eVJlc291cmNlXG4gICogQHBhcmFtICB7Qm9vbGVhbn0gaXNSZXBvcnRlciBpbmRpY2F0ZXMgaWYgcGFyZW50IGlzIFJlcG9ydGVyIG9yIGFuIE9ic2VydmVyXG4gICogQHBhcmFtICB7QXJyYXl9IGlucHV0IG9wdGlvbmFsIGlucHV0IHBhcmFtZXRlcnNcbiAgKi9cblxuICBjb25zdHJ1Y3Rvcihpc1NlbmRlciwgaW5wdXQpIHtcblxuICAgIHN1cGVyKGlzU2VuZGVyLCBpbnB1dCk7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMubWV0YWRhdGEucmVzb3VyY2VUeXBlID0gJ2ZpbGUnO1xuXG4gIH1cblxuICBpbml0KGZpbGUpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCFmaWxlKSB0aHJvdyBuZXcgRXJyb3IoJ1tGaWxlSHlwZXJ0eVJlc291cmNlLmNvbnN0cnVjdG9yXSBtaXNzaW5nIG1hbmRhdG9yeSAqZmlsZSogaW5wdXQgJyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIF90aGlzLl9tZXRhZGF0YS5uYW1lID0gZmlsZS5uYW1lO1xuICAgICAgX3RoaXMuX21ldGFkYXRhLmxhc3RNb2RpZmllZCA9IGZpbGUubGFzdE1vZGlmaWVkO1xuICAgICAgX3RoaXMuX21ldGFkYXRhLnNpemUgPSBmaWxlLnNpemU7XG4gICAgICBfdGhpcy5fbWV0YWRhdGEubWltZXR5cGUgPSBmaWxlLnR5cGU7XG5cbiAgICAgIGxvZy5sb2coJ1tGaWxlSHlwZXJ0eVJlc291cmNlLmluaXRdIGZpbGU6ICcsIGZpbGUpO1xuXG4gICAgICBpZiAoX3RoaXMuX2lzU2VuZGVyKSB7XG5cbiAgICAgICAgbGV0IG1pbWV0eXBlID0gZmlsZS50eXBlLnNwbGl0KCcvJylbMF07XG5cbiAgICAgICAgc3dpdGNoIChtaW1ldHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2ltYWdlJyA6XG4gICAgICAgICAgICBfdGhpcy5fZ2V0SW1hZ2VQcmV2aWV3KGZpbGUpLnRoZW4oKHByZXZpZXcpPT57XG4gICAgICAgICAgICAgIF90aGlzLl9tZXRhZGF0YS5wcmV2aWV3ID0gcHJldmlldztcbiAgICAgICAgICAgICAgX3RoaXMuX2NvbnRlbnQgPSBmaWxlO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQgOlxuICAgICAgICAgICAgX3RoaXMuX2NvbnRlbnQgPSBmaWxlO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0b28gYmlnIGxldHMgc3RvcmUgYXMgRmlsZSBhbmQgYXNBcnJheSBCdWZmZXJcblxuICAgICAgLy8gIGlmIChmaWxlLnNpemUgPiBfdGhpcy5hcnJheWJ1ZmZlclNpemVMaW1pdCkge1xuICAgICAgLyogIH0gZWxzZSB7XG5cbiAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbih0aGVGaWxlKSB7XG5cbiAgICAgICAgICAgIGxvZy5sb2coJ1tGaWxlSHlwZXJ0eVJlc291cmNlLmluaXRdIGZpbGUgbG9hZGVkICcsIHRoZUZpbGUpO1xuXG4gICAgICAgICAgICBfdGhpcy5fY29udGVudCA9IHRoZUZpbGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcblxuICAgICAgICB9Ki9cbiAgICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5fY29udGVudCA9IGZpbGUuY29udGVudDtcbiAgICAgIGlmIChmaWxlLnByZXZpZXcpIF90aGlzLl9tZXRhZGF0YS5wcmV2aWV3ID0gZmlsZS5wcmV2aWV3O1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIH0pO1xuXG4gIH1cblxuIF9nZXRJbWFnZVByZXZpZXcoaW1hZ2Upe1xuICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e1xuXG4gICBJbWFnZVRvb2xzLnJlc2l6ZShpbWFnZSwge1xuICAgICAgICB3aWR0aDogMTAwLCAvLyBtYXhpbXVtIHdpZHRoXG4gICAgICAgIGhlaWdodDogMTAwIC8vIG1heGltdW0gaGVpZ2h0XG4gICAgfSwgZnVuY3Rpb24oYmxvYiwgZGlkSXRSZXNpemUpIHtcbiAgICAgICAgLy8gZGlkSXRSZXNpemUgd2lsbCBiZSB0cnVlIGlmIGl0IG1hbmFnZWQgdG8gcmVzaXplIGl0LCBvdGhlcndpc2UgZmFsc2UgKGFuZCB3aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgZmlsZSBhcyAnYmxvYicpXG4gICAgICAgIGlmIChkaWRJdFJlc2l6ZSkge1xuICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuXG4gICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKHRoZUltYWdlKSB7XG4gICAgICAgICAgICByZXNvbHZlKHRoZUltYWdlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4oJ1tGaWxlSHlwZXJ0eVJlc291cmNlLl9nZXRJbWFnZVByZXZpZXddIHVuYWJsZSB0byBjcmVhdGUgaW1hZ2UgcHJldmlldyBmcm9tIG9yaWdpbmFsIGltYWdlICcpO1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuIH1cblxuXG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuX21ldGFkYXRhLm5hbWU7XG4gIH1cblxuICBnZXQgcHJldmlldygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fbWV0YWRhdGEucHJldmlldztcbiAgfVxuXG4gIC8qKlxuICAqIFNoYXJlIGZpbGUgYXMgYSBkYXRhIG9iamVjdCBjaGlsZCBvZiBhIGRhdGEgb2JqZWN0IHBhcmVudFxuICAqXG4gICogQHBhcmFtICB7c3RyaW5nfSBjaGlsZHJlbiBEYXRhIE9iamVjdCBQYXJlbnQgY2hpbGRyZW4gbmFtZSB3aGVyZSB0aGUgZmlsZSBpcyBzaGFyZWRcbiAgKi9cblxuLyogIHNoYXJlKGNoaWxkcmVuKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIC8vdG8gYmUgaW1wcm92ZWQgYW5kIGFkYXB0ZWRcblxuICAgICAgaWYgKCFfdGhpcy5faXNTZW5kZXIpIHJldHVybiByZWplY3QoJ1tGaWxlSHlwZXJ0eVJlc291cmNlLnNoYXJlXSBPYnNlcnZlcnMgY2FuIG5vdCBzaGFyZSBmaWxlcycpO1xuXG4gICAgICBsZXQgZmlsZTJzaGFyZSA9IF90aGlzLl9tZXRhZGF0YTtcbiAgICAgIGZpbGUyc2hhcmUudHlwZSA9IF90aGlzLl90eXBlO1xuXG4gICAgICBfdGhpcy5fcGFyZW50LmFkZENoaWxkKGNoaWxkcmVuLCBmaWxlMnNoYXJlKS50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RDaGlsZCkge1xuICAgICAgICBsb2cubG9nKCdbRmlsZUh5cGVydHlSZXNvdXJjZS5zaGFyZV0gb2JqZWN0IGNoaWxkOiAnLCBkYXRhT2JqZWN0Q2hpbGQpO1xuXG4gICAgICAgIGxldCBzaGFyZWRGaWxlID0gZGF0YU9iamVjdENoaWxkLmRhdGE7XG5cbiAgICAgICAgcmVzb2x2ZShzaGFyZWRGaWxlKTtcblxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIGxvZy5lcnJvcignUmVhc29uOicsIHJlYXNvbik7XG4gICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgfSk7XG5cbiAgICB9KTtcblxuICB9Ki9cblxuICAvKipcbiAgKiBSZXR1cm5zIGZpbGUgY29udGVudCBvcHRpbWlzZWQgdG8gYmUgZGlzcGxheWVkIGluIGEgbWVzc2FnZSBsaW5lXG4gICpcbiAgKiBAcGFyYW0gIHtzdHJpbmd9IGNoaWxkcmVuIERhdGEgT2JqZWN0IFBhcmVudCBjaGlsZHJlbiBuYW1lIHdoZXJlIHRoZSBmaWxlIGlzIHNoYXJlZFxuICAqL1xuXG4gIHRvTWVzc2FnZSgpIHtcbiAgICAvL1RPRE86IHRvIGJlIGltcGxlbWVudGVkLiBJdCBzaG91bGQgcmV0dXJuIEhUTUwgd2l0aCBpbWcgYXR0cmlidXRlIGFzIGEgdGh1bWJuYWlsIHBsdXMgdGhlIG5hbWUuXG4gIH1cblxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IEZpbGVIeXBlcnR5UmVzb3VyY2U7XG4iLCIvKipcbiogVGhlIEh5cGVydHkgUmVzb3VyY2UgRGF0YSBNb2RlbCBpcyB1c2VkIHRvIG1vZGVsIHJlc291Y2VzIGhhbmRsZWQgYnkgSHlwZXJ0aWVzIGFuZCBEYXRhIE9iamVjdHMgaW5jbHVkaW5nIGNoYXQgbWVzc2FnZXMsIGZpbGVzLCByZWFsIHRpbWUgaHVtYW4gYXVkaW8gYW5kIHZpZGVvLi5cbipcbiovXG5cbmltcG9ydCBGaWxlSHlwZXJ0eVJlc291cmNlIGZyb20gJy4vRmlsZUh5cGVydHlSZXNvdXJjZSc7XG5cbmNsYXNzIEh5cGVydHlSZXNvdXJjZUZhY3Rvcnkge1xuXG4gIC8qKlxuICAqIEh5cGVydHlSZXNvdXJjZUZhY3RvcnkgY29uc3RydWN0b3JcbiAgKlxuICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gIH1cblxuICBjcmVhdGVIeXBlcnR5UmVzb3VyY2UoaXNTZW5kZXIsIHR5cGUsIG1ldGFkYXRhKSB7XG4gICAgbGV0IG5ld0h5cGVydHlSZXNvdXJjZTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICAgIG5ld0h5cGVydHlSZXNvdXJjZSA9IG5ldyBGaWxlSHlwZXJ0eVJlc291cmNlKGlzU2VuZGVyLCBtZXRhZGF0YSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbSHlwZXJ0eVJlc291cmNlRmFjdG9yeS5jcmVhdGVIeXBlcnR5UmVzb3VyY2VdIG5vdCBzdXBwb3J0ZWQgdHlwZTogJywgdHlwZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4obmV3SHlwZXJ0eVJlc291cmNlKTtcblxuICB9XG5cbiAgY3JlYXRlSHlwZXJ0eVJlc291cmNlV2l0aENvbnRlbnQoaXNTZW5kZXIsIHR5cGUsIGNvbnRlbnQsIG1ldGFkYXRhKSB7XG4gICAgbGV0IG5ld0h5cGVydHlSZXNvdXJjZTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdmaWxlJzpcbiAgICAgICAgbmV3SHlwZXJ0eVJlc291cmNlID0gbmV3IEZpbGVIeXBlcnR5UmVzb3VyY2UoaXNTZW5kZXIsIG1ldGFkYXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZWplY3QoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG5ld0h5cGVydHlSZXNvdXJjZS5pbml0KGNvbnRlbnQpLnRoZW4oKCk9PntcbiAgICAgICAgcmV0dXJuIG5ld0h5cGVydHlSZXNvdXJjZS5zYXZlKCk7Ly8gc2tpcCBzYXZlP1xuICAgICAgfSkudGhlbigoKT0+e1xuICAgICAgICByZXNvbHZlKG5ld0h5cGVydHlSZXNvdXJjZSk7XG4gICAgICB9KTtcblxuICB9KTtcblxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEh5cGVydHlSZXNvdXJjZUZhY3Rvcnk7XG4iLCIvKipcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cbipcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKiovXG5cbi8vIExvZyBTeXN0ZW1cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignRGF0YU9iamVjdCcpO1xuXG5pbXBvcnQgU3luY09iamVjdCwgeyBDaGFuZ2VUeXBlLCBPYmplY3RUeXBlIH0gZnJvbSAnLi9Qcm94eU9iamVjdCc7XG5pbXBvcnQgRGF0YU9iamVjdENoaWxkIGZyb20gJy4vRGF0YU9iamVjdENoaWxkJztcbmltcG9ydCBIZWFydEJlYXQgZnJvbSAnLi9IZWFydEJlYXQnO1xuaW1wb3J0IHsgZGVlcENsb25lLCBkaXZpZGVVUkwgfSBmcm9tICcuLi91dGlscy91dGlscy5qcyc7XG5pbXBvcnQgSHlwZXJ0eVJlc291cmNlRmFjdG9yeSBmcm9tICcuLi9oeXBlcnR5LXJlc291cmNlL0h5cGVydHlSZXNvdXJjZUZhY3RvcnkuanMnO1xuXG4vKipcbiAqIE1haW4gZXh0ZW5zaW9uIGNsYXNzIGZvciBvYnNlcnZlcnMgYW5kIHJlcG9ydGVycywgd2l0aCBjb21tb24gcHJvcGVydGllcyBhbmQgbWV0aG9kcy5cbiAqIENoaWxkcmVuIG1hbmFnZW1lbnQgaXMgY29tbW9uIGZvciBvYnNlcnZlcnMgYW5kIHJlcG9ydGVycy5cbiAqL1xuY2xhc3MgRGF0YU9iamVjdCB7XG4gIC8qIHByaXZhdGVcbiAgX3ZlcnNpb246IG51bWJlclxuXG4gIF9vd25lcjogSHlwZXJ0eVVSTFxuICBfdXJsOiBPYmplY3RVUkxcbiAgX3NjaGVtYTogU2NoZW1hXG4gIF9idXM6IE1pbmlCdXNcbiAgX3N0YXR1czogb24gfCBwYXVzZWRcbiAgX3N5bmNPYmo6IFN5bmNEYXRhXG5cbiAgX2NoaWxkcmVuOiB7IGlkOiBEYXRhT2JqZWN0Q2hpbGQgfVxuICBfY2hpbGRyZW5MaXN0ZW5lcjogW01zZ0xpc3RlbmVyXVxuXG4gIC0tLS1ldmVudCBoYW5kbGVycy0tLS1cbiAgX29uQWRkQ2hpbGRIYW5kbGVyOiAoZXZlbnQpID0+IHZvaWRcbiAgKi9cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKiBTaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgSHlwZXJ0aWVzLiBJdCdzIGNhbGxlZCBieSB0aGUgU3luY2hlciBjcmVhdGUgb3Igc3Vic2NyaWJlIG1ldGhvZCdzXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGZ1bmN0aW9uIHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcihwYXIpIHtcbiAgICAgIHRocm93ICdbRGF0YU9iamVjdF0gJyArIHBhciArICcgbWFuZGF0b3J5IHBhcmFtZXRlciBpcyBtaXNzaW5nJztcbiAgICB9XG5cbiAgICBpbnB1dC5zeW5jaGVyID8gX3RoaXMuX3N5bmNoZXIgPSBpbnB1dC5zeW5jaGVyIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdzeW5jaGVyJyk7XG4gICAgaW5wdXQudXJsID8gX3RoaXMuX3VybCA9IGlucHV0LnVybCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcigndXJsJyk7XG4gICAgaW5wdXQuY3JlYXRlZCA/IF90aGlzLl9jcmVhdGVkID0gaW5wdXQuY3JlYXRlZCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcignY3JlYXRlZCcpO1xuICAgIGlucHV0LnJlcG9ydGVyID8gX3RoaXMuX3JlcG9ydGVyID0gaW5wdXQucmVwb3J0ZXIgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3JlcG9ydGVyJyk7XG4gICAgaW5wdXQucnVudGltZSA/IF90aGlzLl9ydW50aW1lID0gaW5wdXQucnVudGltZSA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcigncnVudGltZScpO1xuICAgIGlucHV0LnNjaGVtYSA/IF90aGlzLl9zY2hlbWEgPSBpbnB1dC5zY2hlbWEgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3NjaGVtYScpO1xuICAgIGlucHV0Lm5hbWUgPyBfdGhpcy5fbmFtZSA9IGlucHV0Lm5hbWUgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ25hbWUnKTtcblxuXG4gICAgX3RoaXMuX3N0YXR1cyA9IGlucHV0LnN0YXR1cztcblxuICAgIGlmIChpbnB1dC5kYXRhKSB7XG4gICAgICBfdGhpcy5fc3luY09iaiA9IG5ldyBTeW5jT2JqZWN0KGlucHV0LmRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5fc3luY09iaiA9IG5ldyBTeW5jT2JqZWN0KHt9KTtcbiAgICB9XG4gICAgX3RoaXMuX2NoaWxkcmVucyA9IGlucHV0LmNoaWxkcmVucztcblxuICAgIC8vVE9ETzogRm9yIEZ1cnRoZXIgU3R1ZHlcbiAgICBfdGhpcy5fbXV0dWFsID0gaW5wdXQubXV0dWFsO1xuXG4gICAgX3RoaXMuX3ZlcnNpb24gPSAwO1xuICAgIF90aGlzLl9jaGlsZElkID0gMTtcbiAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcjsgLy9idXMgbGlzdGVuZXIgZm9yIGNoaWxkcmVuXG4gICAgX3RoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyOyAvL0h5cGVydHkgc2lkZSBoYW5kbGVycyB0byBwcm9jZXNzIGNoaWxkIG9iamVjdHMgY3JlYXRlZCBieSByZW1vdGUgSHlwZXJ0aWVzXG5cbiAgICBfdGhpcy5fcmVzdW1lZCA9IGlucHV0LnJlc3VtZTtcblxuICAgIGlmIChpbnB1dC5yZXN1bWUpIHsgX3RoaXMuX3ZlcnNpb24gPSBpbnB1dC52ZXJzaW9uOyB9XG5cbiAgICBfdGhpcy5fb3duZXIgPSBpbnB1dC5zeW5jaGVyLl9vd25lcjtcbiAgICBfdGhpcy5fYnVzID0gaW5wdXQuc3luY2hlci5fYnVzO1xuXG4gICAgaWYgKGlucHV0LmRlc2NyaXB0aW9uKSBfdGhpcy5fZGVzY3JpcHRpb24gPSBpbnB1dC5kZXNjcmlwdGlvbjtcbiAgICBpZiAoaW5wdXQudGFncykgX3RoaXMuX3RhZ3MgPSBpbnB1dC50YWdzO1xuICAgIGlmIChpbnB1dC5yZXNvdXJjZXMpIF90aGlzLl9yZXNvdXJjZXMgPSBpbnB1dC5yZXNvdXJjZXM7XG4gICAgaWYgKGlucHV0Lm9ic2VydmVyU3RvcmFnZSkgX3RoaXMuX29ic2VydmVyU3RvcmFnZSA9IGlucHV0Lm9ic2VydmVyU3RvcmFnZTtcbiAgICBpZiAoaW5wdXQucHVibGljT2JzZXJ2YXRpb24pIF90aGlzLl9wdWJsaWNPYnNlcnZhdGlvbiA9IGlucHV0LnB1YmxpY09ic2VydmF0aW9uO1xuXG4gICAgX3RoaXMuX21ldGFkYXRhID0gT2JqZWN0LmFzc2lnbihpbnB1dCk7XG5cbiAgICAvLyAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3RdIG11dHVhbCAnLCBfdGhpcy5fbWV0YWRhdGEubXV0dWFsKTtcblxuICAgIGlmICghaW5wdXQuaGFzT3duUHJvcGVydHkoJ3Jlc3VtZScpIHx8IChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgncmVzdW1lJykgJiYgIWlucHV0LnJlc3VtZSkpIHtcbiAgICAgIF90aGlzLl9tZXRhZGF0YS5sYXN0TW9kaWZpZWQgPSBfdGhpcy5fbWV0YWRhdGEuY3JlYXRlZDtcbiAgICB9XG5cbiAgICBkZWxldGUgX3RoaXMuX21ldGFkYXRhLmRhdGE7XG4gICAgZGVsZXRlIF90aGlzLl9tZXRhZGF0YS5zeW5jaGVyO1xuICAgIGRlbGV0ZSBfdGhpcy5fbWV0YWRhdGEuYXV0aG9yaXNlO1xuXG4gICAgX3RoaXMuX2h5cGVydHlSZXNvdXJjZUZhY3RvcnkgPSBuZXcgSHlwZXJ0eVJlc291cmNlRmFjdG9yeSgpO1xuICAgIF90aGlzLl9jaGlsZHJlbk9iamVjdHMgPSB7fTtcbiAgICBfdGhpcy5fc2hhcmVkQ2hpbGRzID0gW107IC8vY2hpbGRPYmplY3RzIHRoYXQgd2VyZSBub3Qgc2VudCB5ZXQgdG8gUmVwb3J0ZXJzXG5cbiAgICBpZiAoaW5wdXQuYmFja3VwICYmIF90aGlzLl9jaGlsZHJlbnMpIHtcbiAgICAgIGxldCBsYXN0SGVhcnRiZWF0ID0gKGlucHV0Lmhhc093blByb3BlcnR5KCdjaGlsZHJlbk9iamVjdHMnKSAmJiBpbnB1dC5jaGlsZHJlbk9iamVjdHMuaGFzT3duUHJvcGVydHkoJ2hlYXJ0YmVhdCcpKVxuICAgICAgICA/IGlucHV0LmNoaWxkcmVuT2JqZWN0cy5oZWFydGJlYXQgOiAwO1xuICAgICAgX3RoaXMuX2hlYXJ0QmVhdCA9IG5ldyBIZWFydEJlYXQoX3RoaXMuX2J1cywgX3RoaXMuX293bmVyLCBfdGhpcy5fc3luY2hlci5fcnVudGltZVVybCwgdGhpcywgMTUsIGxhc3RIZWFydGJlYXQpO1xuICAgICAgaWYgKF90aGlzLl9yZXN1bWVkKSBfdGhpcy5faGVhcnRCZWF0LnN0YXJ0KHRydWUsIF90aGlzLm1ldGFkYXRhLmlzUmVwb3J0ZXIpO1xuICAgICAgZWxzZSBfdGhpcy5faGVhcnRCZWF0LnN0YXJ0KGZhbHNlLCBfdGhpcy5tZXRhZGF0YS5pc1JlcG9ydGVyKTtcblxuICAgIH1cbiAgfVxuXG4gIF9nZXRMYXN0Q2hpbGRJZCgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IGNoaWxkSWRJbnQgPSAwO1xuICAgIGxldCBjaGlsZElkU3RyaW5nID0gX3RoaXMuX293bmVyICsgJyMnICsgY2hpbGRJZEludDtcblxuXG4gICAgT2JqZWN0LmtleXMoX3RoaXMuX2NoaWxkcmVucykuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgIGlmIChfdGhpcy5fY2hpbGRyZW5zW2tleV0uY2hpbGRJZCA+IGNoaWxkSWRTdHJpbmcpIHtcbiAgICAgICAgY2hpbGRJZFN0cmluZyA9IF90aGlzLl9jaGlsZHJlbnNba2V5XS5jaGlsZElkO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNoaWxkSWRJbnQgPSBOdW1iZXIoY2hpbGRJZFN0cmluZy5zcGxpdCgnIycpWzFdKTtcbiAgfVxuXG4gIF9hbGxvY2F0ZUxpc3RlbmVycygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IGNoaWxkQmFzZVVSTCA9IF90aGlzLl91cmwgKyAnL2NoaWxkcmVuLyc7XG4gICAgbG9nLmxvZygnW0RhdGEgT2JqZWN0IC0gQWxsb2NhdGVMaXN0ZW5lcnNdIC0gJywgX3RoaXMuX2NoaWxkcmVucyk7XG4gICAgaWYgKF90aGlzLl9jaGlsZHJlbnMpIHtcbiAgICAgIC8vICAgICAgX3RoaXMuX2NoaWxkcmVucy5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgbGV0IGNoaWxkVVJMID0gY2hpbGRCYXNlVVJMO1xuICAgICAgbGV0IGxpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihjaGlsZFVSTCwgKG1zZykgPT4ge1xuICAgICAgICAvL2lnbm9yZSBtc2cgc2VudCBieSBoaW1zZWxmXG4gICAgICAgIGlmIChtc2cuZnJvbSAhPT0gdGhpcy5fb3duZXIpIHtcbiAgICAgICAgICBsb2cubG9nKCdEYXRhT2JqZWN0LUNoaWxkcmVuLVJDVjogJywgbXNnKTtcbiAgICAgICAgICBzd2l0Y2ggKG1zZy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdjcmVhdGUnOiBfdGhpcy5fb25DaGlsZENyZWF0ZShtc2cpOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6IGxvZy5sb2cobXNnKTsgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiBfdGhpcy5fY2hhbmdlQ2hpbGRyZW4obXNnKTsgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICB9KTtcblxuICAgICAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX3JlbGVhc2VMaXN0ZW5lcnMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmIChfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcikge1xuICAgICAgX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXIucmVtb3ZlKCk7XG5cbiAgICAgIE9iamVjdC5rZXlzKF90aGlzLl9jaGlsZHJlbk9iamVjdHMpLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIC8qICAgICAgaWYgKGNoaWxkcmVuID09PSAncmVzb3VyY2VzJykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRyZW5dKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlbl1bY2hpbGRdLl9yZWxlYXNlTGlzdGVuZXJzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7Ki9cbiAgICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZF0uX3JlbGVhc2VMaXN0ZW5lcnMoKTtcbiAgICAgICAgLy8gICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cblxuICB9XG5cbiAgLyoqXG4gICAqIFN5bmMgRGF0YSBPYmplY3QgT2JzZXJ2ZXIgd2l0aCBsYXN0IHZlcnNpb24gb2YgRGF0YSBPYmplY3QgUmVwb3J0ZXIuIFVzZWZ1bCBmb3IgUmVzdW1lc1xuICAgKi9cbiAgc3luYygpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0LnN5bmNdIHN5bmNocm9uaXNpbmcgJyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBsZXQgY3JpdGVyaWEgPSB7fTtcblxuICAgICAgaWYgKHRoaXMubWV0YWRhdGEuYmFja3VwUmV2aXNpb24pIGNyaXRlcmlhLmJhY2t1cFJldmlzaW9uID0gdGhpcy5tZXRhZGF0YS5iYWNrdXBSZXZpc2lvbjtcblxuICAgICAgX3RoaXMuX3N5bmNoZXIucmVhZChfdGhpcy5fbWV0YWRhdGEudXJsLCBjcml0ZXJpYSkudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0LnN5bmNdIHZhbHVlIHRvIHN5bmM6ICcsIHZhbHVlKTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKF90aGlzLmRhdGEsIGRlZXBDbG9uZSh2YWx1ZS5kYXRhKSk7XG5cbiAgICAgICAgX3RoaXMuX3ZlcnNpb24gPSB2YWx1ZS52ZXJzaW9uO1xuXG4gICAgICAgIF90aGlzLl9tZXRhZGF0YS5sYXN0TW9kaWZpZWQgPSB2YWx1ZS5sYXN0TW9kaWZpZWQ7XG5cbiAgICAgICAgLy9UT0RPOiBjaGVjayBmaXJzdCBpZiB0aGVyZSBhcmUgbmV3IGNoaWxkcmVuT2JqZWN0cyB0byBhdm9pZCBvdmVyaGVhZFxuXG4gICAgICAgIGlmICh2YWx1ZS5jaGlsZHJlbk9iamVjdHMpIHtcbiAgICAgICAgICBfdGhpcy5yZXN1bWVDaGlsZHJlbnModmFsdWUuY2hpbGRyZW5PYmplY3RzKTtcbiAgICAgICAgICBfdGhpcy5fc3RvcmVDaGlsZHJlbnMoKTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9IGVsc2UgcmVzb2x2ZSh0cnVlKTtcblxuXG4gICAgICAgIC8qaWYgKHZhbHVlLnZlcnNpb24gIT0gX3RoaXMuX3ZlcnNpb24pIHtcbiAgICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3Quc3luY10gdXBkYXRpbmcgZXhpc3RpbmcgZGF0YTogJywgX3RoaXMuZGF0YSk7XG5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKF90aGlzLmRhdGEgfHwge30sIGRlZXBDbG9uZSh2YWx1ZS5kYXRhKSk7XG5cbiAgICAgICAgICBfdGhpcy5fbWV0YWRhdGEgPSBkZWVwQ2xvbmUodmFsdWUpO1xuXG4gICAgICAgICAgZGVsZXRlIF90aGlzLl9tZXRhZGF0YS5kYXRhO1xuXG4gICAgICAgICAgX3RoaXMuX3ZlcnNpb24gPSB2YWx1ZS52ZXJzaW9uO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0LnN5bmNdIGV4aXN0aW5nIGRhdGEgaXMgdXBkYXRlZDogJywgdmFsdWUpO1xuICAgICAgICB9Ki9cblxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3Quc3luY10gc3luYyBmYWlsZWQ6ICcsIHJlYXNvbik7XG4gICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG4gIH1cbiAgLyoqXG4gICAqXG4gICAqL1xuICByZXN1bWVDaGlsZHJlbnMoY2hpbGRyZW5zKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBjaGlsZElkU3RyaW5nID0gdGhpcy5fb3duZXIuc3BsaXQoJy8nKVszXSArICcjJyArIHRoaXMuX2NoaWxkSWQ7XG5cbiAgICAvL3NldHVwIGNoaWxkcmVucyBkYXRhIGZyb20gc3Vic2NyaXB0aW9uXG4gICAgLy8gICAgT2JqZWN0LmtleXMoY2hpbGRyZW5zKS5mb3JFYWNoKChjaGlsZHJlblJlc291cmNlKSA9PiB7XG4gICAgLy8gICAgICBsZXQgY2hpbGRyZW4gPSBjaGlsZHJlbnNbY2hpbGRyZW5SZXNvdXJjZV07XG4gICAgbGV0IGNoaWxkcmVuID0gY2hpbGRyZW5zO1xuXG4gICAgLy9fdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuUmVzb3VyY2VdID0ge307XG4gICAgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmZvckVhY2goKGNoaWxkSWQpID0+IHtcbiAgICAgIGxldCBuZXdDaGlsZCA9IGZhbHNlO1xuXG4vKiAgICAgICAgaWYgKCFfdGhpcy5fY2hpbGRyZW5PYmplY3RzLmhhc093blByb3BlcnR5KGNoaWxkcmVuUmVzb3VyY2UpKVxuICAgICAgICAgIF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRyZW5SZXNvdXJjZV0gPSB7fTsqL1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIGl0IGlzIHRoZSBsYXN0IGhlYXJ0YmVhdFxuXG4gICAgICAgIGlmIChjaGlsZElkID09PSAnaGVhcnRiZWF0Jykge1xuLy8gICAgICAgICAgX3RoaXMuX2hlYXJ0QmVhdC5vbk5ld0hlYXJ0YmVhdChjaGlsZHJlbltjaGlsZElkXS52YWx1ZSk7XG4vLyAgICAgICAgICBfdGhpcy5faGVhcnRCZWF0LnN0YXJ0KHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkcmVuW2NoaWxkSWRdLmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmIGNoaWxkcmVuW2NoaWxkSWRdLnZhbHVlLnJlc291cmNlVHlwZSAmJiAhX3RoaXMuX2NoaWxkcmVuT2JqZWN0cy5oYXNPd25Qcm9wZXJ0eShjaGlsZElkKSkge1xuICAgICAgICBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkSWRdID0gX3RoaXMuX3Jlc3VtZUh5cGVydHlSZXNvdXJjZShjaGlsZHJlbltjaGlsZElkXSk7XG4gICAgICAgIG5ld0NoaWxkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAoIV90aGlzLl9jaGlsZHJlbk9iamVjdHMuaGFzT3duUHJvcGVydHkoY2hpbGRJZCkpIHtcblxuICAgICAgICBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkSWRdID0gX3RoaXMuX3Jlc3VtZUNoaWxkKGNoaWxkcmVuW2NoaWxkSWRdKTtcbiAgICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3QucmVzdW1lQ2hpbGRyZW5zXSBuZXcgRGF0YU9iamVjdENoaWxkOiAnLCBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkSWRdKTtcbiAgICAgICAgbmV3Q2hpbGQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3Q2hpbGQgJiYgY2hpbGRJZCA+IGNoaWxkSWRTdHJpbmcpIHtcbiAgICAgICAgY2hpbGRJZFN0cmluZyA9IGNoaWxkSWQ7XG4gICAgICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0UmVwb3J0ZXIucmVzdW1lQ2hpbGRyZW5zXSAtIHJlc3VtaW5nOiAnLCB0aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRJZF0pO1xuICAgICAgfVxuXG4gICAgfSk7XG4gICAgLy8gICAgfSk7XG5cbiAgICB0aGlzLl9jaGlsZElkID0gTnVtYmVyKGNoaWxkSWRTdHJpbmcuc3BsaXQoJyMnKVsxXSk7XG5cbiAgfVxuXG4gIF9yZXN1bWVDaGlsZChpbnB1dCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGNoaWxkSW5wdXQgPSBpbnB1dC52YWx1ZTtcbiAgICBjaGlsZElucHV0LnBhcmVudE9iamVjdCA9IF90aGlzO1xuICAgIGNoaWxkSW5wdXQucGFyZW50ID0gX3RoaXMuX3VybDtcblxuICAgIGxldCBjaGlsZCA9IG5ldyBEYXRhT2JqZWN0Q2hpbGQoY2hpbGRJbnB1dCk7XG5cbiAgICBjaGlsZC5pZGVudGl0eSA9IGlucHV0LmlkZW50aXR5O1xuXG4gICAgbGV0IGV2ZW50ID0ge1xuICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICBmcm9tOiBjaGlsZC5yZXBvcnRlcixcbiAgICAgIHVybDogY2hpbGQucGFyZW50LFxuICAgICAgdmFsdWU6IGNoaWxkLmRhdGEsXG4gICAgICBjaGlsZElkOiBjaGlsZC51cmwsXG4gICAgICBpZGVudGl0eTogY2hpbGQuaWRlbnRpdHksXG4gICAgICBjaGlsZDogY2hpbGRcbiAgICB9O1xuXG4gICAgaWYgKGNoaWxkLnJlc291cmNlVHlwZSkge1xuICAgICAgZXZlbnQucmVzb3VyY2UgPSBjaGlsZDtcblxuICAgIH1cblxuICAgIGlmIChfdGhpcy5fb25BZGRDaGlsZHJlbkhhbmRsZXIpIF90aGlzLl9vbkFkZENoaWxkcmVuSGFuZGxlcihldmVudCk7XG5cbiAgICByZXR1cm4gY2hpbGQ7XG5cbiAgfVxuXG4gIF9yZXN1bWVIeXBlcnR5UmVzb3VyY2UoaW5wdXQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBjaGlsZElucHV0ID0gaW5wdXQudmFsdWU7XG4gICAgY2hpbGRJbnB1dC5wYXJlbnRPYmplY3QgPSBfdGhpcztcbiAgICBjaGlsZElucHV0LnBhcmVudCA9IF90aGlzLl91cmw7XG5cbiAgICBsZXQgaHlwZXJ0eVJlc291cmNlID0gX3RoaXMuX2h5cGVydHlSZXNvdXJjZUZhY3RvcnkuY3JlYXRlSHlwZXJ0eVJlc291cmNlKGZhbHNlLCBjaGlsZElucHV0LnJlc291cmNlVHlwZSwgY2hpbGRJbnB1dClcblxuICAgIGh5cGVydHlSZXNvdXJjZS5pZGVudGl0eSA9IGlucHV0LmlkZW50aXR5O1xuXG4gICAgbGV0IGV2ZW50ID0ge1xuICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICBmcm9tOiBoeXBlcnR5UmVzb3VyY2UucmVwb3J0ZXIsXG4gICAgICB1cmw6IGh5cGVydHlSZXNvdXJjZS5wYXJlbnQsXG4gICAgICB2YWx1ZTogaHlwZXJ0eVJlc291cmNlLmRhdGEsXG4gICAgICBjaGlsZElkOiBoeXBlcnR5UmVzb3VyY2UudXJsLFxuICAgICAgaWRlbnRpdHk6IGh5cGVydHlSZXNvdXJjZS5pZGVudGl0eSxcbiAgICAgIGNoaWxkOiBoeXBlcnR5UmVzb3VyY2VcbiAgICB9O1xuXG4gICAgaWYgKGh5cGVydHlSZXNvdXJjZS5yZXNvdXJjZVR5cGUpIHtcbiAgICAgIGV2ZW50LnJlc291cmNlID0gaHlwZXJ0eVJlc291cmNlO1xuXG4gICAgfVxuXG4gICAgaWYgKF90aGlzLl9vbkFkZENoaWxkcmVuSGFuZGxlcikgX3RoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyKGV2ZW50KTtcblxuICAgIHJldHVybiBoeXBlcnR5UmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogQWxsIE1ldGFkYXRhIGFib3V0IHRoZSBEYXRhIE9iamVjdFxuICAgKiBAdHlwZSB7T2JqZWN0fSAtXG4gICAqL1xuXG4gIGdldCBtZXRhZGF0YSgpIHsgcmV0dXJuIHRoaXMuX21ldGFkYXRhOyB9XG5cbiAgLyoqXG4gICAqIE9iamVjdCBVUkwgb2YgcmVwb3J0ZXIgb3Igb2JzZXJ2ZXJcbiAgICogQHR5cGUge09iamVjdFVSTH1cbiAgICovXG4gIGdldCB1cmwoKSB7IHJldHVybiB0aGlzLl91cmw7IH1cblxuICAvKipcbiAgICogT2JqZWN0IHNjaGVtYSBVUkwgKHRoaXMgZmllbGQgaXMgbm90IHlldCBzdGFibGUsIGFuZCBpcyBzdWJzamVjdCB0byBjaGFuZ2UpXG4gICAqIEB0eXBlIHtTY2hlbWFVUkx9XG4gICAqL1xuICBnZXQgc2NoZW1hKCkgeyByZXR1cm4gdGhpcy5fc2NoZW1hOyB9XG5cbiAgLyoqXG4gICAqIFN0YXR1cyBvZiB0aGUgcmVwb3J0ZXIgb3Igb2JzZXJ2ZXIgY29ubmVjdGlvbiAodGhpcyBmaWVsZCBpcyBub3QgeWV0IHN0YWJsZSwgYW5kIGlzIHN1YnNqZWN0IHRvIGNoYW5nZSlcbiAgICogQHR5cGUge1N0YXR1c30gLSBFbnVtIG9mOiBvbiB8IHBhdXNlZFxuICAgKi9cbiAgZ2V0IHN0YXR1cygpIHsgcmV0dXJuIHRoaXMuX3N0YXR1czsgfVxuXG4gIC8qKlxuICAgKiBEYXRhIHN0cnVjdHVyZSB0byBiZSBzeW5jaHJvbml6ZWQuXG4gICAqIEB0eXBlIHtKU09OfSAtIEpTT04gc3RydWN0dXJlIHRoYXQgc2hvdWxkIGZvbGxvdyB0aGUgZGVmaW5lZCBzY2hlbWEsIGlmIGFueS5cbiAgICovXG4gIGdldCBkYXRhKCkgeyByZXR1cm4gdGhpcy5fc3luY09iai5kYXRhOyB9XG5cbiAgLyoqXG4gICAqIEFsbCBjcmVhdGVkIGNoaWxkcmVuJ3Mgc2luY2UgdGhlIHN1YnNjcmlwdGlvbiwgZG9lc24ndCBjb250YWluIGFsbCBjaGlsZHJlbidzIHNpbmNlIHJlcG9ydGVyIGNyZWF0aW9uLlxuICAgKiBAdHlwZSB7T2JqZWN0PENoaWxkSWQsIERhdGFPYmplY3RDaGlsZD59XG4gICAqL1xuICBnZXQgY2hpbGRyZW5zKCkgeyByZXR1cm4gdGhpcy5fY2hpbGRyZW5PYmplY3RzOyB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHBhdXNlKCkge1xuICAgIC8vVE9ETzogdGhpcyBmZWF0dXJlIG5lZWRzIG1vcmUgYW5hbGlzZVxuICAgIHRocm93ICdOb3QgaW1wbGVtZW50ZWQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHJlc3VtZSgpIHtcbiAgICAvL1RPRE86IHRoaXMgZmVhdHVyZSBuZWVkcyBtb3JlIGFuYWxpc2VcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzdG9wKCkge1xuICAgIC8vVE9ETzogc2hvdWxkIHJlbW92ZSB0aGUgc3Vic2NyaXB0aW9uIGFuZCBzZW5kIG1lc3NhZ2UgdW5zdWJzY3JpYmU/XG4gICAgdGhyb3cgJ05vdCBpbXBsZW1lbnRlZCc7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuZCBhZGQgYSBEYXRhT2JqZWN0Q2hpbGQgdG8gYSBjaGlsZHJlbiBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0ge0pTT059IGluaXRpYWxEYXRhIC0gSW5pdGlhbCBkYXRhIG9mIHRoZSBjaGlsZFxuICAgKiBAcGFyYW0gIHtNZXNzYWdlQm9keUlkZW50aXR5fSBpZGVudGl0eSAtIChvcHRpb25hbCkgaWRlbnRpdHkgZGF0YSB0byBiZSBhZGRlZCB0byBpZGVudGl0eSB0aGUgdXNlciByZXBvcnRlci4gVG8gYmUgdXNlZCBmb3IgbGVnYWN5IGlkZW50aXRpZXMuXG4gICAqIEBwYXJhbSAge1N5bmNDaGlsZE1ldGFkYXRhfSBpbnB1dCAtIChvcHRpb25hbCkgQWxsIGFkZGl0aW9uYWwgbWV0YWRhdGEgYWJvdXQgdGhlIERhdGFPYmplY3RDaGlsZC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxEYXRhT2JqZWN0Q2hpbGQ+fSAtIFJldHVybiBQcm9taXNlIHRvIGEgbmV3IERhdGFPYmplY3RDaGlsZC5cbiAgICovXG5cbiAgYWRkQ2hpbGQoaW5pdGlhbERhdGEsIGlkZW50aXR5LCBpbnB1dCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IG5ld0NoaWxkO1xuXG4gICAgLy9yZXR1cm5zIHByb21pc2UsIGluIHRoZSBmdXR1cmUsIHRoZSBBUEkgbWF5IGNoYW5nZSB0byBhc3luY2hyb25vdXMgY2FsbFxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgICBsZXQgbXNnQ2hpbGRQYXRoID0gX3RoaXMuX3VybCArICcvY2hpbGRyZW4vJztcblxuXG4gICAgICBsZXQgY2hpbGRJbnB1dCA9IF90aGlzLl9nZXRDaGlsZElucHV0KGlucHV0KTtcbiAgICAgIGNoaWxkSW5wdXQuZGF0YSA9IGluaXRpYWxEYXRhO1xuICAgICAgLy8gICAgICBjaGlsZElucHV0LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICBuZXdDaGlsZCA9IG5ldyBEYXRhT2JqZWN0Q2hpbGQoY2hpbGRJbnB1dCk7XG5cbiAgICAgIGlmIChpZGVudGl0eSkgbmV3Q2hpbGQuaWRlbnRpdHkgPSBpZGVudGl0eTtcblxuICAgICAgbmV3Q2hpbGQuc2hhcmUoKTtcblxuICAgICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0LmFkZENoaWxkXSBhZGRlZCAnLCBuZXdDaGlsZCk7XG5cbiAgICAgIG5ld0NoaWxkLm9uQ2hhbmdlKChldmVudCkgPT4ge1xuICAgICAgICBfdGhpcy5fb25DaGFuZ2UoZXZlbnQsIHsgcGF0aDogbXNnQ2hpbGRQYXRoLCBjaGlsZElkOiBjaGlsZElucHV0LnVybCB9KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyAgICAgaWYgKCFfdGhpcy5fY2hpbGRyZW5PYmplY3RzLmhhc093blByb3BlcnR5KGNoaWxkcmVuKSkgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlbl0gPSB7fTtcblxuICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZElucHV0LnVybF0gPSBuZXdDaGlsZDtcblxuICAgICAgcmVzb2x2ZShuZXdDaGlsZCk7XG4gICAgfSk7XG4gIH1cblxuICBfZGVsZXRlQ2hpbGRyZW5zKCkge1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgZGVsZXRlUHJvbWlzZXMgPSBbXTtcblxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBpZiAoX3RoaXMuY2hpbGRyZW5zKSB7XG4gICAgICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0LmRlbGV0ZUNoaWxkcmVuc10nLCBfdGhpcy5jaGlsZHJlbnMpO1xuICAgICAgICBsZXQgY2hpbGQ7XG5cbiAgICAgICAgZm9yIChjaGlsZCBpbiBfdGhpcy5jaGlsZHJlbnMpIHtcbiAgICAgICAgICAvLyAgICAgICAgICBsZXQgY2hpbGQ7XG5cbiAgICAgICAgICAvKiAgICAgICAgICBpZiAoY2hpbGRyZW4gPT09ICdyZXNvdXJjZXMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGlsZCBpbiBfdGhpcy5jaGlsZHJlbnNbY2hpbGRyZW5dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRPYmogPSBfdGhpcy5jaGlsZHJlbnNbY2hpbGRyZW5dW2NoaWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0Ll9kZWxldGVDaGlsZHJlbnNdIGNoaWxkJyxjaGlsZE9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRPYmoubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoJ3Jlc291cmNlVHlwZScpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVQcm9taXNlcy5wdXNoKF90aGlzLmNoaWxkcmVuc1tjaGlsZHJlbl1bY2hpbGRdLmRlbGV0ZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyovXG4gICAgICAgICAgbGV0IGNoaWxkT2JqID0gX3RoaXMuY2hpbGRyZW5zW2NoaWxkXTtcbiAgICAgICAgICBsb2cubG9nKCdbRGF0YU9iamVjdC5fZGVsZXRlQ2hpbGRyZW5zXSBjaGlsZCcsIGNoaWxkT2JqKTtcbiAgICAgICAgICBpZiAoY2hpbGRPYmoubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoJ3Jlc291cmNlVHlwZScpKVxuICAgICAgICAgICAgZGVsZXRlUHJvbWlzZXMucHVzaChfdGhpcy5jaGlsZHJlbnNbY2hpbGRdLmRlbGV0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgfVxuXG4gICAgICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0Ll9kZWxldGVDaGlsZHJlbnNdIHByb21pc2VzICcsIGRlbGV0ZVByb21pc2VzKTtcblxuICAgICAgICBpZiAoZGVsZXRlUHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIFByb21pc2UuYWxsKGRlbGV0ZVByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoJ1tEYXRhT2JqZWN0Ll9kZWxldGVDaGlsZHJlbnNdIGRvbmUnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHJlc29sdmUoJ1tEYXRhT2JqZWN0Ll9kZWxldGVDaGlsZHJlbnNdIG5vdGhpbmcgdG8gZGVsZXRlJyk7XG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgX2dldENoaWxkSW5wdXQoaW5wdXQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBjaGlsZElucHV0ID0gT2JqZWN0LmFzc2lnbih7fSwgaW5wdXQpO1xuXG4gICAgX3RoaXMuX2NoaWxkSWQrKztcblxuICAgIC8vcmVtb3ZpbmcgZG9tYWluIGZyb20gY2hpbGRJZCB0byBhdm9pZCBiYWNrdXAgaXNzdWVzIHdpdGggJy4nXG5cbiAgICBjaGlsZElucHV0LnVybCA9IF90aGlzLl9vd25lci5zcGxpdCgnLycpWzNdICsgJyMnICsgX3RoaXMuX2NoaWxkSWQ7XG5cbiAgICBjaGlsZElucHV0LnBhcmVudE9iamVjdCA9IF90aGlzO1xuICAgIGNoaWxkSW5wdXQucmVwb3J0ZXIgPSBfdGhpcy5fb3duZXI7XG4gICAgY2hpbGRJbnB1dC5jcmVhdGVkID0gKG5ldyBEYXRlKS50b0lTT1N0cmluZygpO1xuICAgIGNoaWxkSW5wdXQucnVudGltZSA9IF90aGlzLl9zeW5jaGVyLl9ydW50aW1lVXJsO1xuICAgIGNoaWxkSW5wdXQucDJwSGFuZGxlciA9IF90aGlzLl9zeW5jaGVyLl9wMnBIYW5kbGVyO1xuICAgIGNoaWxkSW5wdXQucDJwUmVxdWVzdGVyID0gX3RoaXMuX3N5bmNoZXIuX3AycFJlcXVlc3RlcjtcbiAgICBjaGlsZElucHV0LnNjaGVtYSA9IF90aGlzLl9zY2hlbWE7XG4gICAgY2hpbGRJbnB1dC5wYXJlbnQgPSBfdGhpcy51cmw7XG4gICAgY2hpbGRJbnB1dC5tdXR1YWwgPSBfdGhpcy5tZXRhZGF0YS5tdXR1YWw7XG4gICAgLy8gICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0Ll9nZXRDaGlsZElucHV0XSBtdXR1YWwgJywgY2hpbGRJbnB1dC5tdXR1YWwpO1xuXG4gICAgcmV0dXJuIGNoaWxkSW5wdXQ7XG4gIH1cblxuICBhZGRIeXBlcnR5UmVzb3VyY2UodHlwZSwgcmVzb3VyY2UsIGlkZW50aXR5LCBpbnB1dCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAvL3JldHVybnMgcHJvbWlzZSwgaW4gdGhlIGZ1dHVyZSwgdGhlIEFQSSBtYXkgY2hhbmdlIHRvIGFzeW5jaHJvbm91cyBjYWxsXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cbiAgICAgIGxldCBoeXBlcnR5UmVzb3VyY2U7XG4gICAgICBsZXQgbXNnQ2hpbGRQYXRoID0gX3RoaXMuX3VybCArICcvY2hpbGRyZW4vJztcblxuICAgICAgbGV0IGNoaWxkSW5wdXQgPSBfdGhpcy5fZ2V0Q2hpbGRJbnB1dChpbnB1dCk7XG4gICAgICAvLyAgICAgIGNoaWxkSW5wdXQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAgX3RoaXMuX2h5cGVydHlSZXNvdXJjZUZhY3RvcnkuY3JlYXRlSHlwZXJ0eVJlc291cmNlV2l0aENvbnRlbnQodHJ1ZSwgdHlwZSwgcmVzb3VyY2UsIGNoaWxkSW5wdXQpLnRoZW4oKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGh5cGVydHlSZXNvdXJjZSA9IHJlc291cmNlO1xuXG4gICAgICAgIGlmIChpZGVudGl0eSkgaHlwZXJ0eVJlc291cmNlLmlkZW50aXR5ID0gaWRlbnRpdHk7XG5cbiAgICAgICAgaHlwZXJ0eVJlc291cmNlLnNoYXJlKCk7XG5cbiAgICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3QuYWRkSHlwZXJ0eVJlc291cmNlXSBhZGRlZCAnLCBoeXBlcnR5UmVzb3VyY2UpO1xuXG4gICAgICAgIGh5cGVydHlSZXNvdXJjZS5vbkNoYW5nZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICBfdGhpcy5fb25DaGFuZ2UoZXZlbnQsIHsgcGF0aDogbXNnQ2hpbGRQYXRoLCBjaGlsZElkOiBoeXBlcnR5UmVzb3VyY2UuY2hpbGRJZCB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gICAgICAgIGlmICghX3RoaXMuX2NoaWxkcmVuT2JqZWN0cy5oYXNPd25Qcm9wZXJ0eShjaGlsZHJlbikpIF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRyZW5dID0ge307XG5cbiAgICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1toeXBlcnR5UmVzb3VyY2UuY2hpbGRJZF0gPSBoeXBlcnR5UmVzb3VyY2U7XG5cbiAgICAgICAgcmVzb2x2ZShoeXBlcnR5UmVzb3VyY2UpO1xuICAgICAgfSk7XG5cblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIGNyZWF0ZSBhbmQgZGVsZXRlIG9mIGNoaWxkcmVucy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbihldmVudDogTXNnRXZlbnQpfSBjYWxsYmFja1xuICAgKiBUT0RPOiBhZGQgY2hpbGRyZW5JZCB0byBzdXBwb3J0IGRpZmZlcmVudCBoYW5kbGVycyBwZXIgY2hpbGRyZW5cbiAgICovXG4gIG9uQWRkQ2hpbGQoY2FsbGJhY2spIHtcblxuICAgIHRoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyID0gY2FsbGJhY2s7XG4gIH1cblxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIHJlbW90ZSBEYXRhT2JqZWN0IC0+IGFkZENoaWxkXG4gIF9vbkNoaWxkQ3JlYXRlKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAvLyAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3QuX29uQ2hpbGRDcmVhdGVdIHJlY2VpdmVkQnkgJyArIF90aGlzLl9vd25lciArICcgOiAnLCBtc2cpO1xuXG4gICAgLy8gaWYgdGhpcyBpcyBhbiBoZWFydGJlYXQgbXNnIGZvd2FyZCBpdCB0byBoZWF0YmVhdCBoYW5kbGVyXG5cbiAgICBpZiAobXNnLmJvZHkucmVzb3VyY2UgPT09ICdoZWFydGJlYXQnKSB7XG4gICAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3QuX29uQ2hpbGRDcmVhdGVdIG5ldyBoZWFydGJlYXQgcmVjZWl2ZWQgJyArIG1zZy5ib2R5LnZhbHVlKTtcbiAgICAgIHRoaXMuX2hlYXJ0QmVhdC5vbk5ld0hlYXJ0YmVhdChtc2cuYm9keS52YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdC5fb25DaGlsZENyZWF0ZV0gbmV3IGNoaWxkIHJlY2VpdmVkQnkgJyArIF90aGlzLl9vd25lciArICcgOiAnLCBtc2cpO1xuICAgICAgbGV0IHJlc3BvbnNlID0ge1xuICAgICAgICBmcm9tOiBtc2cudG8sXG4gICAgICAgIHRvOiBtc2cuZnJvbSxcbiAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgaWQ6IG1zZy5pZCxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIGNvZGU6IDEwMFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xuXG4gICAgICBpZiAobXNnLmJvZHkudmFsdWUucmVzb3VyY2VUeXBlKSB7XG4gICAgICAgIF90aGlzLl9vbkh5cGVydHlSZXNvdXJjZUFkZGVkKG1zZyk7XG4gICAgICB9IGVsc2UgX3RoaXMuX29uQ2hpbGRBZGRlZChtc2cpO1xuXG4gICAgfVxuXG4gIH1cblxuICBfb25DaGlsZEFkZGVkKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGNoaWxkSW5wdXQgPSBkZWVwQ2xvbmUobXNnLmJvZHkudmFsdWUpO1xuICAgIGNoaWxkSW5wdXQucGFyZW50T2JqZWN0ID0gX3RoaXM7XG5cbiAgICAvLyAgICBsZXQgY2hpbGRyZW4gPSBjaGlsZElucHV0LmNoaWxkcmVuO1xuXG4gICAgbGV0IG5ld0NoaWxkID0gbmV3IERhdGFPYmplY3RDaGlsZChjaGlsZElucHV0KTtcbiAgICBuZXdDaGlsZC5pZGVudGl0eSA9IG1zZy5ib2R5LmlkZW50aXR5O1xuXG5cbiAgICAvLyAgICBpZiAoIV90aGlzLl9jaGlsZHJlbk9iamVjdHMuaGFzT3duUHJvcGVydHkoY2hpbGRyZW4pKSBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuXSA9IHt9O1xuXG4gICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZElucHV0LnVybF0gPSBuZXdDaGlsZDtcblxuICAgIGlmIChtc2cudG8gPT09IF90aGlzLm1ldGFkYXRhLnVybCkgbmV3Q2hpbGQuc3RvcmUoKTtcblxuICAgIF90aGlzLl9oeXBlcnR5RXZ0KG1zZywgbmV3Q2hpbGQpO1xuICB9XG5cbiAgX29uSHlwZXJ0eVJlc291cmNlQWRkZWQobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgaW5wdXQgPSBtc2cuYm9keS52YWx1ZTtcbiAgICBsZXQgaHlwZXJ0eVJlc291cmNlO1xuXG4gICAgLy8gICAgbGV0IGNoaWxkcmVuID0gaW5wdXQuY2hpbGRyZW47XG5cbiAgICBpbnB1dC5wYXJlbnRPYmplY3QgPSBfdGhpcztcblxuICAgIGh5cGVydHlSZXNvdXJjZSA9IF90aGlzLl9oeXBlcnR5UmVzb3VyY2VGYWN0b3J5LmNyZWF0ZUh5cGVydHlSZXNvdXJjZShmYWxzZSwgaW5wdXQucmVzb3VyY2VUeXBlLCBpbnB1dCk7XG4gICAgaHlwZXJ0eVJlc291cmNlLmlkZW50aXR5ID0gbXNnLmJvZHkuaWRlbnRpdHk7XG5cbiAgICAvLyAgICBpZiAoIV90aGlzLl9jaGlsZHJlbk9iamVjdHMuaGFzT3duUHJvcGVydHkoY2hpbGRyZW4pKSBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuXSA9IHt9O1xuXG4gICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1toeXBlcnR5UmVzb3VyY2UuY2hpbGRJZF0gPSBoeXBlcnR5UmVzb3VyY2U7XG5cbiAgICBfdGhpcy5faHlwZXJ0eUV2dChtc2csIGh5cGVydHlSZXNvdXJjZSk7XG5cbiAgICAvLyBsb2NhbGx5IHN0b3JlIG1lc3NhZ2VzIHRoYXQgYXJlIGRpcmVjdGx5IHNlbnQgdG8gdGhlIGh5cGVydHlcbiAgICAvLyBpZSB0byBzeW5jIHdpdGggbWVzc2FnZXMgc2VudCB3aGVuIG9mZmxpbmVcblxuICAgIGlmIChtc2cudG8gPT09IF90aGlzLm1ldGFkYXRhLnVybCkgaHlwZXJ0eVJlc291cmNlLnN0b3JlKCk7XG4gIH1cblxuICBfaHlwZXJ0eUV2dChtc2csIGNoaWxkKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBldmVudCA9IHtcbiAgICAgIHR5cGU6IG1zZy50eXBlLFxuICAgICAgZnJvbTogbXNnLmZyb20sXG4gICAgICB1cmw6IG1zZy50byxcbiAgICAgIHZhbHVlOiBjaGlsZC5kYXRhLFxuICAgICAgY2hpbGRJZDogY2hpbGQudXJsLFxuICAgICAgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LFxuICAgICAgY2hpbGQ6IGNoaWxkXG4gICAgfTtcblxuICAgIGlmIChjaGlsZC5yZXNvdXJjZVR5cGUpIHtcbiAgICAgIGV2ZW50LnJlc291cmNlID0gY2hpbGQ7XG5cbiAgICB9XG5cbiAgICBpZiAoX3RoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyKSBfdGhpcy5fb25BZGRDaGlsZHJlbkhhbmRsZXIoZXZlbnQpO1xuICB9XG5cbiAgLy9zZW5kIGRlbHRhIG1lc3NhZ2VzIHRvIHN1YnNjcmlwdGlvbnNcbiAgX29uQ2hhbmdlKGV2ZW50LCBjaGlsZEluZm8pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX21ldGFkYXRhLmxhc3RNb2RpZmllZCA9IChuZXcgRGF0ZSkudG9JU09TdHJpbmcoKTtcblxuICAgIF90aGlzLl92ZXJzaW9uKys7XG5cbiAgICBpZiAoX3RoaXMuX3N0YXR1cyA9PT0gJ2xpdmUnKSB7XG4gICAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IGRpcmVjdGx5IHRvIGEgcmVzb3VyY2UgY2hhbmdlcyBhZGRyZXNzOiBNZXNzYWdlQnVzXG4gICAgICBsZXQgY2hhbmdlTXNnID0ge1xuICAgICAgICB0eXBlOiAndXBkYXRlJywgZnJvbTogX3RoaXMuX3VybCwgdG86IF90aGlzLl91cmwgKyAnL2NoYW5nZXMnLFxuICAgICAgICBib2R5OiB7IHZlcnNpb246IF90aGlzLl92ZXJzaW9uLCBzb3VyY2U6IF90aGlzLl9vd25lciwgYXR0cmlidXRlOiBldmVudC5maWVsZCwgbGFzdE1vZGlmaWVkOiBfdGhpcy5fbWV0YWRhdGEubGFzdE1vZGlmaWVkIH1cbiAgICAgIH07XG5cbiAgICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0IC0gX29uQ2hhbmdlXSAtICcsIGV2ZW50LCBjaGlsZEluZm8sIGNoYW5nZU1zZyk7XG5cbiAgICAgIGlmIChldmVudC5vVHlwZSA9PT0gT2JqZWN0VHlwZS5PQkpFQ1QpIHtcbiAgICAgICAgaWYgKGV2ZW50LmNUeXBlICE9PSBDaGFuZ2VUeXBlLlJFTU9WRSkge1xuICAgICAgICAgIGNoYW5nZU1zZy5ib2R5LnZhbHVlID0gZGVlcENsb25lKGV2ZW50LmRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGFuZ2VNc2cuYm9keS5hdHRyaWJ1dGVUeXBlID0gZXZlbnQub1R5cGU7XG4gICAgICAgIGNoYW5nZU1zZy5ib2R5LnZhbHVlID0gZXZlbnQuZGF0YTtcbiAgICAgICAgaWYgKGV2ZW50LmNUeXBlICE9PSBDaGFuZ2VUeXBlLlVQREFURSkge1xuICAgICAgICAgIGNoYW5nZU1zZy5ib2R5Lm9wZXJhdGlvbiA9IGV2ZW50LmNUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vY2hpbGRJbmZvIG11c3QgaGF2ZSAocGF0aCwgY2hpbGRJZClcbiAgICAgIGlmIChjaGlsZEluZm8pIHtcbiAgICAgICAgY2hhbmdlTXNnLnRvID0gY2hpbGRJbmZvLnBhdGg7XG4gICAgICAgIGNoYW5nZU1zZy5ib2R5LnJlc291cmNlID0gY2hpbGRJbmZvLmNoaWxkSWQ7XG4gICAgICB9XG5cbiAgICAgIC8vVE9ETzogRm9yIEZ1cnRoZXIgU3R1ZHlcbiAgICAgIGlmICghX3RoaXMuZGF0YS5fbXV0dWFsKSBjaGFuZ2VNc2cuYm9keS5tdXR1YWwgPSBfdGhpcy5fbXV0dWFsO1xuXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKGNoYW5nZU1zZyk7XG4gICAgfVxuICB9XG5cbiAgLy9GTE9XLUlOOiBkZWx0YSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYSByZW1vdGUgRGF0YU9iamVjdFJlcG9ydGVyIG9yIERhdGFPYmplY3RDaGlsZCB3aGVuIGNoYW5naW5nIGRhdGFcbiAgX2NoYW5nZU9iamVjdChzeW5jT2JqLCBtc2cpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy9UT0RPOiB1cGRhdGUgdmVyc2lvbiA/XG4gICAgLy9ob3cgdG8gaGFuZGxlIGFuIGluY29ycmVjdCB2ZXJzaW9uID8gRXhhbXBsZTogcmVjZWl2ZSBhIHZlcnNpb24gMyB3aGVuIHRoZSBvYnNlcnZlciBpcyBpbiB2ZXJzaW9uIDEsIHdoZXJlIGlzIHRoZSB2ZXJzaW9uIDIgP1xuICAgIC8vd2lsbCB3ZSBuZWVkIHRvIGNvbmZpcm0gdGhlIHJlY2VwdGlvbiA/XG4gICAgaWYgKF90aGlzLl92ZXJzaW9uICsgMSA8PSBtc2cuYm9keS52ZXJzaW9uKSB7XG4gICAgICBfdGhpcy5fdmVyc2lvbiA9IG1zZy5ib2R5LnZlcnNpb247XG4gICAgICBsZXQgcGF0aCA9IG1zZy5ib2R5LmF0dHJpYnV0ZTtcbiAgICAgIGxldCB2YWx1ZTtcbiAgICAgIGlmICh0eXBlb2YgbXNnLmJvZHkudmFsdWUgPT09ICdvYmplY3QnKSB2YWx1ZSA9IGRlZXBDbG9uZShtc2cuYm9keS52YWx1ZSk7XG4gICAgICBlbHNlIHZhbHVlID0gbXNnLmJvZHkudmFsdWU7XG5cbiAgICAgIGxldCBmaW5kUmVzdWx0ID0gc3luY09iai5maW5kQmVmb3JlKHBhdGgpO1xuXG4gICAgICBpZiAobXNnLmJvZHkubGFzdE1vZGlmaWVkKSB7XG4gICAgICAgIF90aGlzLl9tZXRhZGF0YS5sYXN0TW9kaWZpZWQgPSBtc2cuYm9keS5sYXN0TW9kaWZpZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5fbWV0YWRhdGEubGFzdE1vZGlmaWVkID0gKG5ldyBEYXRlKS50b0lTT1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAobXNnLmJvZHkuYXR0cmlidXRlVHlwZSA9PT0gT2JqZWN0VHlwZS5BUlJBWSkge1xuICAgICAgICBpZiAobXNnLmJvZHkub3BlcmF0aW9uID09PSBDaGFuZ2VUeXBlLkFERCkge1xuICAgICAgICAgIGxldCBhcnIgPSBmaW5kUmVzdWx0Lm9iajtcbiAgICAgICAgICBsZXQgaW5kZXggPSBmaW5kUmVzdWx0Lmxhc3Q7XG4gICAgICAgICAgQXJyYXkucHJvdG90eXBlLnNwbGljZS5hcHBseShhcnIsIFtpbmRleCwgMF0uY29uY2F0KHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobXNnLmJvZHkub3BlcmF0aW9uID09PSBDaGFuZ2VUeXBlLlJFTU9WRSkge1xuICAgICAgICAgIGxldCBhcnIgPSBmaW5kUmVzdWx0Lm9iajtcbiAgICAgICAgICBsZXQgaW5kZXggPSBmaW5kUmVzdWx0Lmxhc3Q7XG4gICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmRSZXN1bHQub2JqW2ZpbmRSZXN1bHQubGFzdF0gPSB2YWx1ZTsgLy8gVVBEQVRFXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xuICAgICAgICAgIGZpbmRSZXN1bHQub2JqW2ZpbmRSZXN1bHQubGFzdF0gPSB2YWx1ZTsgLy8gVVBEQVRFIG9yIEFERFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBmaW5kUmVzdWx0Lm9ialtmaW5kUmVzdWx0Lmxhc3RdOyAvLyBSRU1PVkVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL1RPRE86IGhvdyB0byBoYW5kbGUgdW5zeW5jaHJvbml6ZWQgdmVyc2lvbnM/XG4gICAgICBsb2cubG9nKCdVTlNZTkNIUk9OSVpFRCBWRVJTSU9OOiAoZGF0YSA9PiAnICsgX3RoaXMuX3ZlcnNpb24gKyAnLCBtc2cgPT4gJyArIG1zZy5ib2R5LnZlcnNpb24gKyAnKScpO1xuICAgIH1cbiAgfVxuXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgcmVtb3RlIERhdGFPYmplY3RDaGlsZCB3aGVuIGNoYW5naW5nIGRhdGFcbiAgX2NoYW5nZUNoaWxkcmVuKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgY29uc3QgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTChtc2cudG8pO1xuICAgIGNvbnN0IGlkZW50aXR5ID0gZGl2aWRlZFVSTC5pZGVudGl0eTtcbiAgICAvLyAgICBjb25zdCByZXNvdXJjZSA9IGlkZW50aXR5ID8gaWRlbnRpdHkuc3Vic3RyaW5nKGlkZW50aXR5Lmxhc3RJbmRleE9mKCcvJykgKyAxKSA6IHVuZGVmaW5lZDtcblxuICAgIGxldCBjaGlsZElkID0gbXNnLmJvZHkucmVzb3VyY2U7XG4gICAgbGV0IGNoaWxkcmVuID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZElkXTtcblxuICAgIGxvZy5sb2coJ0NoYW5nZSBjaGlsZHJlbjogJywgX3RoaXMuX293bmVyLCBtc2csIHJlc291cmNlKTtcblxuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgX3RoaXMuX2NoYW5nZU9iamVjdChjaGlsZHJlbi5fc3luY09iaiwgbXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4oJ05vIGNoaWxkcmVuIGZvdW5kIGZvcjogJywgY2hpbGRJZCk7XG4gICAgfVxuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGF0YU9iamVjdDtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLy8gTG9nIFN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdEYXRhT2JqZWN0UmVwb3J0ZXInKTtcblxuaW1wb3J0IERhdGFPYmplY3QgZnJvbSAnLi9EYXRhT2JqZWN0JztcblxuaW1wb3J0IHsgZGVlcENsb25lLCBkaXZpZGVVUkwgfSBmcm9tICcuLi91dGlscy91dGlscy5qcyc7XG5cbi8qKlxuICogVGhlIGNsYXNzIHJldHVybmVkIGZyb20gdGhlIFN5bmNoZXIgY3JlYXRlIGNhbGwuXG4gKiBUbyBiZSB1c2VkIGFzIGEgcmVwb3J0ZXIgcG9pbnQsIGNoYW5nZXMgd2lsbCBiZSBzdWJtaXRlZCB0byBEYXRhT2JqZWN0T2JzZXJ2ZXIgaW5zdGFuY2VzLlxuICovXG5jbGFzcyBEYXRhT2JqZWN0UmVwb3J0ZXIgZXh0ZW5kcyBEYXRhT2JqZWN0IC8qIGltcGxlbWVudHMgU3luY1N0YXR1cyAqLyB7XG4gIC8qIHByaXZhdGVcbiAgX3N1YnNjcmlwdGlvbnM6IDxoeXBlcnR5VXJsOiB7IHN0YXR1czogc3RyaW5nIH0gfT5cblxuICAtLS0tZXZlbnQgaGFuZGxlcnMtLS0tXG4gIF9vblN1YnNjcmlwdGlvbkhhbmRsZXI6IChldmVudCkgPT4gdm9pZFxuICBfb25SZXNwb25zZUhhbmRsZXI6IChldmVudCkgPT4gdm9pZFxuICBfb25SZWFkSGFuZGxlcjogKGV2ZW50KSA9PiB2b2lkXG4gICovXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICogU2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IEh5cGVydGllcy4gSXQncyBjYWxsZWQgYnkgdGhlIFN5bmNoZXIuY3JlYXRlIG1ldGhvZFxuICAgKi9cblxuICAvL2NvbnN0cnVjdG9yKHN5bmNoZXIsIHVybCwgY3JlYXRlZCwgcmVwb3J0ZXIsIHJ1bnRpbWUsIHNjaGVtYSwgbmFtZSwgaW5pdGlhbFN0YXR1cywgaW5pdGlhbERhdGEsIGNoaWxkcmVucywgbXV0dWFsID0gdHJ1ZSwgcmVzdW1lZCA9IGZhbHNlLCBkZXNjcmlwdGlvbiwgdGFncywgcmVzb3VyY2VzLCBvYnNlcnZlclN0b3JhZ2UsIHB1YmxpY09ic2VydmF0aW9uKSB7XG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XG5cbiAgICBzdXBlcihpbnB1dCk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9zdWJzY3JpcHRpb25zID0ge307XG5cbiAgICBfdGhpcy5fc3luY09iai5vYnNlcnZlKChldmVudCkgPT4ge1xuICAgICAgbG9nLmxvZygnW1N5bmNoZXIuRGF0YU9iamVjdFJlcG9ydGVyXSAnICsgX3RoaXMudXJsICsgJyBwdWJsaXNoIGNoYW5nZTogJywgZXZlbnQpO1xuICAgICAgX3RoaXMuX29uQ2hhbmdlKGV2ZW50KTtcbiAgICB9KTtcblxuICAgIF90aGlzLl9hbGxvY2F0ZUxpc3RlbmVycygpO1xuXG4gICAgX3RoaXMuaW52aXRhdGlvbnMgPSBbXTsgLy8gYXJyYXkgb2YgcHJvbWlzZXMgd2l0aCBwZW5kaW5nIGludml0YXRpb25zXG4gICAgX3RoaXMuX2NoaWxkcmVuU2l6ZVRocmVzaG9sZCA9IDUwMDAwOy8vIHRvIGJlIHVzZWQgd2hlbiByZXBseWluZyB0byBzeW5jIHJlcXVlc3RzIHRvIGVuc3VyZSBlYWNoIHJlc3BvbnNlIG1zZyBpcyBub3QgdG9vIGxhcmdlXG5cbiAgfVxuXG4gIF9hbGxvY2F0ZUxpc3RlbmVycygpIHtcbiAgICBzdXBlci5fYWxsb2NhdGVMaXN0ZW5lcnMoKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX29iamVjdExpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihfdGhpcy5fdXJsLCAobXNnKSA9PiB7XG4gICAgICBsb2cubG9nKCdbU3luY2hlci5EYXRhT2JqZWN0UmVwb3J0ZXJdIGxpc3RlbmVyICcgKyBfdGhpcy5fdXJsICsgJyBSZWNlaXZlZDogJywgbXNnKTtcbiAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgICAgY2FzZSAncmVzcG9uc2UnOiBfdGhpcy5fb25SZXNwb25zZShtc2cpOyBicmVhaztcbiAgICAgICAgY2FzZSAncmVhZCc6IF90aGlzLl9vblJlYWQobXNnKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2V4ZWN1dGUnOiBfdGhpcy5fb25FeGVjdXRlKG1zZyk7IGJyZWFrO1xuICAgICAgICBjYXNlICdjcmVhdGUnOiBfdGhpcy5fb25DaGlsZENyZWF0ZShtc2cpOyBicmVhazsvLyB0byBjcmVhdGUgY2hpbGQgb2JqZWN0cyB0aGF0IHdlcmUgc2VudCB3aGVubiBvZmZsaW5lXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpcy5fcnVudGltZVN0YXR1c0xpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihfdGhpcy5fc3luY2hlci5fcnVudGltZVVybCsnL3N0YXR1cycgLCAoZXZ0KSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnW1N5bmNoZXIuRGF0YU9iamVjdFJlcG9ydGVyXSBydW50aW1lIHN0YXR1cyBldmVudCByZWNlaXZlZCAnICsgZXZ0KTtcblxuICAgICAgaWYgKGV2dC5ib2R5ICYmIGV2dC5ib2R5LnJlc291cmNlICYmIGV2dC5ib2R5LnJlc291cmNlID09PSBfdGhpcy5fdXJsICYmIFxuICAgICAgICBldnQuYm9keS52YWx1ZSAmJiBldnQuYm9keS52YWx1ZS5iYWNrdXBSZXZpc2lvbiApIHtcbiAgICAgICAgICAvLyBicm9hZGNhc3QgYmFja3VwUmV2aXNpb24gdXBkYXRlXG5cbiAgICAgICAgICBfdGhpcy5kYXRhLmJhY2t1cFJldmlzaW9uID0gZXZ0LmJvZHkudmFsdWUuYmFja3VwUmV2aXNpb247XG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTeW5jaGVyLkRhdGFPYmplY3RSZXBvcnRlcl0gRE8gdXBkYXRlZCB3aXRoIGJhY2t1cCByZXZpc2lvbiAnICsgX3RoaXMuZGF0YS5iYWNrdXBSZXZpc2lvbik7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgX3JlbGVhc2VMaXN0ZW5lcnMoKSB7XG4gICAgc3VwZXIuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX29iamVjdExpc3RlbmVyLnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgaW52aXRhdGlvbnMgKGNyZWF0ZSBtZXNzYWdlcykgdG8gaHlwZXJ0aWVzLCBvYnNlcnZlcnMgbGlzdC5cbiAgICogQHBhcmFtICB7SHlwZXJ0eVVSTFtdfSBvYnNlcnZlcnMgTGlzdCBvZiBIeXBlcnR5IFVSTCdzXG4gICAqL1xuICBpbnZpdGVPYnNlcnZlcnMob2JzZXJ2ZXJzLCBwMnApIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG5cbiAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBydW50aW1lIGluc3RhbmNlIG9mIFN5bmNoZXJNYW5hZ2VyIC0+IF9vbkNyZWF0ZVxuICAgIC8vIFRPRE86IHJlbW92ZSB2YWx1ZSBhbmQgYWRkIHJlc291cmNlcz8gc2hvdWxkIHNpbWlsYXIgdG8gMXN0IGNyZWF0ZVxuXG4gICAgbGV0IHRvSW52aXRlID0gb2JzZXJ2ZXJzO1xuXG4gICAgLy8gbGV0IGludml0ZVByb21pc2VzID0gW107XG5cbiAgICAvKiAgb2JzZXJ2ZXJzLmZvckVhY2goKG9ic2VydmVyKT0+IHtcbiAgICAgIGlmICghX3RoaXMuaW52aXRhdGlvbnNbb2JzZXJ2ZXJdKSB7XG4gICAgICAgIHRvSW52aXRlLnB1c2gob2JzZXJ2ZXIpO1xuICAgICAgICBfdGhpcy5pbnZpdGF0aW9uc1tvYnNlcnZlcl0gPSBvYnNlcnZlcjtcbiAgICAgIH1cbiAgICB9KTsqL1xuXG5cbiAgICBpZiAodG9JbnZpdGUubGVuZ3RoID4gMCkge1xuICAgICAgbG9nLmxvZygnW1N5bmNoZXIuRGF0YU9iamVjdFJlcG9ydGVyXSBJbnZpdGVPYnNlcnZlcnMgJywgdG9JbnZpdGUsIF90aGlzLl9tZXRhZGF0YSk7XG5cbiAgICAgIHRvSW52aXRlLmZvckVhY2goKG9ic2VydmVyKT0+e1xuXG4gICAgICAgIGxldCBpbnZpdGF0aW9uID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAgICAgbGV0IGludml0ZU1zZyA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdjcmVhdGUnLCBmcm9tOiBfdGhpcy5fc3luY2hlci5fb3duZXIsIHRvOiBfdGhpcy5fc3luY2hlci5fc3ViVVJMLFxuICAgICAgICAgICAgYm9keTogeyByZXN1bWU6IGZhbHNlLCByZXNvdXJjZTogX3RoaXMuX3VybCwgc2NoZW1hOiBfdGhpcy5fc2NoZW1hLCB2YWx1ZTogX3RoaXMuX21ldGFkYXRhLCBhdXRob3Jpc2U6IFtvYnNlcnZlcl0gfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAocDJwKSBpbnZpdGVNc2cuYm9keS5wMnAgPSBwMnA7XG5cbiAgICAgICAgICBpZiAoIV90aGlzLmRhdGEubXV0dWFsKSBpbnZpdGVNc2cuYm9keS5tdXR1YWwgPSBfdGhpcy5kYXRhLm11dHVhbDtcblxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UoaW52aXRlTXNnLCAocmVwbHkpPT57XG4gICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlci5EYXRhT2JqZWN0UmVwb3J0ZXJdIEludml0YXRpb24gcmVwbHkgJywgcmVwbHkpO1xuXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgICBpbnZpdGVkOiBvYnNlcnZlcixcbiAgICAgICAgICAgICAgY29kZTogcmVwbHkuYm9keSAmJiByZXBseS5ib2R5LmNvZGUgPyByZXBseS5ib2R5LmNvZGUgOiA1MDAsXG4gICAgICAgICAgICAgIGRlc2M6IHJlcGx5LmJvZHkgJiYgcmVwbHkuYm9keS5kZXNjID8gcmVwbHkuYm9keS5kZXNjIDogJ1Vua25vd24nXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0LmNvZGUgPCAzMDApIHJlc29sdmUocmVzdWx0KTtcbi8qICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0LmNvZGUgPj0gMzAwKSB7XG4gICAgICAgICAgICAgIGlmIChfdGhpcy5tZXRhZGF0YS5vZmZsaW5lKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShfdGhpcy5fcHJvY2Vzc09mZmxpbmVJbnZpdGF0aW9uKGludml0ZU1zZykpO1xuICAgICAgICAgICAgICB9Ki8gZWxzZSByZWplY3QocmVzdWx0KTtcbi8vICAgICAgICAgICAgfSBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMuaW52aXRhdGlvbnMucHVzaChpbnZpdGF0aW9uKTtcblxuICAgICAgfSk7XG5cbiAgICAgIC8vICAgICAgcmV0dXJuKGludml0ZVByb21pc2VzKTtcblxuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgYW5kIGRlbGV0ZSBvYmplY3QgZGF0YVxuICAgKi9cbiAgZGVsZXRlKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgIGlmKF90aGlzLl9oZWFydEJlYXQpIF90aGlzLl9oZWFydEJlYXQuc3RvcCgpO1xuXG4gICAgX3RoaXMuX2RlbGV0ZUNoaWxkcmVucygpLnRoZW4oKHJlc3VsdCk9PntcbiAgICAgIGxvZy5sb2cocmVzdWx0KTtcbiAgICAgIC8vRkxPVy1PVVQ6IHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgaW5zdGFuY2Ugb2YgU3luY2hlck1hbmFnZXIgLT4gX29uRGVsZXRlXG4gICAgICBsZXQgZGVsZXRlTXNnID0ge1xuICAgICAgICB0eXBlOiAnZGVsZXRlJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N5bmNoZXIuX3N1YlVSTCxcbiAgICAgICAgYm9keTogeyByZXNvdXJjZTogX3RoaXMuX3VybCB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKGRlbGV0ZU1zZywgKHJlcGx5KSA9PiB7XG4gICAgICAgIGxvZy5sb2coJ0RhdGFPYmplY3RSZXBvcnRlci1ERUxFVEU6ICcsIHJlcGx5KTtcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgX3RoaXMuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcbiAgICAgICAgICBkZWxldGUgX3RoaXMuX3N5bmNoZXIuX3JlcG9ydGVyc1tfdGhpcy5fdXJsXTtcblxuICAgICAgICAgIC8vX3RoaXMuX3N5bmNPYmoudW5vYnNlcnZlKCk7XG4gICAgICAgICAgX3RoaXMuX3N5bmNPYmogPSB7fTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpcHRpb25zIHJlcXVlc3RlZCBhbmQgYWNjZXB0ZWQgdG8gdGhpcyByZXBvcnRlclxuICAgKiBAdHlwZSB7T2JqZWN0PEh5cGVydHlVUkwsIFN5bmNTdWJzY3JpcHRpb24+fVxuICAgKi9cbiAgZ2V0IHN1YnNjcmlwdGlvbnMoKSB7IHJldHVybiB0aGlzLl9zdWJzY3JpcHRpb25zOyB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIHN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgbm90aWZpY2F0aW9uc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlY2VpdmUgZXZlbnRzXG4gICAqL1xuICBvblN1YnNjcmlwdGlvbihjYWxsYmFjaykge1xuICAgIHRoaXMuX29uU3Vic2NyaXB0aW9uSGFuZGxlciA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIHJlc3BvbnNlIG5vdGlmaWNhdGlvbnMgb2YgdGhlIGNyZWF0ZSdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQ6IE1zZ0V2ZW50KX0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVjZWl2ZSBldmVudHNcbiAgICovXG4gIG9uUmVzcG9uc2UoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vblJlc3BvbnNlSGFuZGxlciA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIHJlYWQgbm90aWZpY2F0aW9uc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrXG4gICAqL1xuXG4gIG9uUmVhZChjYWxsYmFjaykge1xuICAgIHRoaXMuX29uUmVhZEhhbmRsZXIgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR1cCB0aGUgY2FsbGJhY2sgdG8gcHJvY2VzcyBleGVjdXRlIG5vdGlmaWNhdGlvbnNcbiAgICogQHBhcmFtIHtmdW5jdGlvbihldmVudDogTXNnRXZlbnQpfSBjYWxsYmFja1xuICAgKi9cblxuICBvbkV4ZWN1dGUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbkV4ZWN1dGVIYW5kbGVyID0gY2FsbGJhY2s7XG4gIH1cblxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBwYXJlbnQgU3luY2hlciAtPiBfb25Gb3J3YXJkXG4gIF9vbkZvcndhcmQobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxvZy5sb2coJ0RhdGFPYmplY3RSZXBvcnRlci1SQ1Y6ICcsIG1zZyk7XG4gICAgc3dpdGNoIChtc2cuYm9keS50eXBlKSB7XG4gICAgICBjYXNlICdzdWJzY3JpYmUnOiBfdGhpcy5fb25TdWJzY3JpYmUobXNnKTsgYnJlYWs7XG4gICAgICBjYXNlICd1bnN1YnNjcmliZSc6IF90aGlzLl9vblVuU3Vic2NyaWJlKG1zZyk7IGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIHRoaXMgLT4gX29uRm9yd2FyZDogZW1pdHRlZCBieSBhIHJlbW90ZSBTeW5jaGVyIC0+IHN1YnNjcmliZVxuICBfb25TdWJzY3JpYmUobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgaHlwZXJ0eVVybCA9IG1zZy5ib2R5LmZyb207XG4gICAgbGV0IGRpdmlkZWRVUkwgPSBkaXZpZGVVUkwoaHlwZXJ0eVVybCk7XG4gICAgbGV0IGRvbWFpbiA9IGRpdmlkZWRVUkwuZG9tYWluO1xuICAgIGxldCBtdXR1YWwgPSB0cnVlO1xuXG4gICAgaWYgKG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSAmJiAhbXNnLmJvZHkubXV0dWFsKSBtdXR1YWwgPSBmYWxzZTtcblxuXG4gICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0UmVwb3J0ZXIuX29uU3Vic2NyaWJlXScsIG1zZywgZG9tYWluLCBkaXZpZGVkVVJMKTtcblxuICAgIGxldCBldmVudCA9IHtcbiAgICAgIHR5cGU6IG1zZy5ib2R5LnR5cGUsXG4gICAgICB1cmw6IGh5cGVydHlVcmwsXG5cbiAgICAgIGRvbWFpbjogZG9tYWluLFxuXG4gICAgICBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHksXG5cbiAgICAgIG51dHVhbDogbXV0dWFsLFxuXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgLy9jcmVhdGUgbmV3IHN1YnNjcmlwdGlvblxuICAgICAgICBsZXQgc3ViID0geyB1cmw6IGh5cGVydHlVcmwsIHN0YXR1czogJ2xpdmUnIH07XG4gICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHlVcmxdID0gc3ViO1xuICAgICAgICBpZiAoX3RoaXMubWV0YWRhdGEuc3Vic2NyaXB0aW9ucykgeyBfdGhpcy5tZXRhZGF0YS5zdWJzY3JpcHRpb25zLnB1c2goc3ViLnVybCk7IH1cblxuICAgICAgICBsZXQgbXNnVmFsdWUgPSBkZWVwQ2xvbmUoX3RoaXMuX21ldGFkYXRhKTtcbiAgICAgICAgbXNnVmFsdWUuZGF0YSA9IGRlZXBDbG9uZShfdGhpcy5kYXRhKTtcbiAgICAgICAgbXNnVmFsdWUudmVyc2lvbiA9IF90aGlzLl92ZXJzaW9uO1xuXG4gICAgICAgIC8vcHJvY2VzcyBhbmQgc2VuZCBjaGlsZHJlbnMgZGF0YVxuICAgICAgICAvLyBsZXQgY2hpbGRyZW5WYWx1ZXMgPSB7fTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gaWYgKF90aGlzLl9jaGlsZHJlbk9iamVjdHMpIHtcbiAgICAgICAgLy8gICBPYmplY3Qua2V5cyhfdGhpcy5fY2hpbGRyZW5PYmplY3RzKS5mb3JFYWNoKChjaGlsZHJlbklkKSA9PiB7XG4gICAgICAgIC8vICAgICBsZXQgY2hpbGRyZW5EYXRhID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlbklkXTtcbiAgICAgICAgLy8gICAgIGNoaWxkcmVuVmFsdWVzW2NoaWxkcmVuSWRdID0gZGVlcENsb25lKGNoaWxkcmVuRGF0YSk7XG4gICAgICAgIC8vICAgfSk7XG4gICAgICAgIC8vICAgbXNnVmFsdWUuY2hpbGRyZW5PYmplY3RzID0gY2hpbGRyZW5WYWx1ZXM7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBsZXQgc2VuZE1zZyA9IHtcbiAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcbiAgICAgICAgICBib2R5OiB7IGNvZGU6IDIwMCwgc2NoZW1hOiBfdGhpcy5fc2NoZW1hLCB2YWx1ZTogbXNnVmFsdWUgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETzogRm9yIEZ1cnRoZXIgU3R1ZHlcbiAgICAgICAgaWYgKG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSAmJiAhbXNnLmJvZHkubXV0dWFsKSB7XG4gICAgICAgICAgc2VuZE1zZy5ib2R5Lm11dHVhbCA9IG1zZy5ib2R5Lm11dHVhbDsvLyBUT0RPOiByZW1vdmU/XG4gICAgICAgICAgX3RoaXMuZGF0YS5tdXR1YWwgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpcy5faGVhcnRCZWF0KSB7XG4gICAgICAgICAgc2VuZE1zZy5ib2R5LnZhbHVlLmNoaWxkcmVuT2JqZWN0cyA9IHt9O1xuICAgICAgICAgIHNlbmRNc2cuYm9keS52YWx1ZS5jaGlsZHJlbk9iamVjdHMuaGVhcnRiZWF0ID0gX3RoaXMuX2hlYXJ0QmVhdC5oZWFydGJlYXQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3RSZXBvcnRlci5fb25TdWJzY3JpYmUuYWNjZXB0XSBzZW5kaW5nIHJlc3BvbnNlOiAnLCBzZW5kTXNnKVxuXG4gICAgICAgIC8vc2VuZCBvayByZXNwb25zZSBtZXNzYWdlXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoc2VuZE1zZyk7XG5cbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICAgIH0sXG5cbiAgICAgIHJlamVjdDogKHJlYXNvbikgPT4ge1xuICAgICAgICAvL3NlbmQgcmVqZWN0IHJlc3BvbnNlIG1lc3NhZ2VcbiAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXG4gICAgICAgICAgYm9keTogeyBjb2RlOiA0MDMsIGRlc2M6IHJlYXNvbiB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoX3RoaXMuX29uU3Vic2NyaXB0aW9uSGFuZGxlcikge1xuICAgICAgbG9nLmxvZygnU1VCU0NSSVBUSU9OLUVWRU5UOiAnLCBldmVudCk7XG4gICAgICBfdGhpcy5fb25TdWJzY3JpcHRpb25IYW5kbGVyKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGlzIC0+IF9vbkZvcndhcmQ6IGVtaXR0ZWQgYnkgYSByZW1vdGUgRGF0YU9iamVjdE9ic2VydmVyIC0+IHVuc3Vic2NyaWJlXG4gIF9vblVuU3Vic2NyaWJlKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGh5cGVydHlVcmwgPSBtc2cuYm9keS5mcm9tO1xuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKGh5cGVydHlVcmwpO1xuICAgIGxldCBkb21haW4gPSBkaXZpZGVkVVJMLmRvbWFpbjtcblxuICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0UmVwb3J0ZXIuX29uVW5TdWJzY3JpYmVdJywgbXNnLCBkb21haW4sIGRpdmlkZWRVUkwpO1xuXG4gICAgLy9sZXQgc3ViID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbaHlwZXJ0eVVybF07XG4gICAgZGVsZXRlIF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHlVcmxdO1xuICAgIGRlbGV0ZSBfdGhpcy5pbnZpdGF0aW9uc1toeXBlcnR5VXJsXTtcblxuICAgIGxldCBldmVudCA9IHtcbiAgICAgIHR5cGU6IG1zZy5ib2R5LnR5cGUsXG4gICAgICB1cmw6IGh5cGVydHlVcmwsXG4gICAgICBkb21haW46IGRvbWFpbixcbiAgICAgIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eVxuICAgIH07XG5cbiAgICAvLyBUT0RPOiBjaGVjayBpZiB0aGUgX29uU3Vic2NyaXB0aW9uSGFuZGxlciBpdCBpcyB0aGUgc2FtZSBvZiB0aGUgc3Vic2NyaXB0aW9ucz8/P1xuICAgIGlmIChfdGhpcy5fb25TdWJzY3JpcHRpb25IYW5kbGVyKSB7XG4gICAgICBsb2cubG9nKCdVTi1TVUJTQ1JJUFRJT04tRVZFTlQ6ICcsIGV2ZW50KTtcbiAgICAgIF90aGlzLl9vblN1YnNjcmlwdGlvbkhhbmRsZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIFJlcG9ydGVyVVJMIGFkZHJlc3M6IGVtaXRlZCBieSBhIHJlbW90ZSBTeW5jaGVyIC0+IF9vblJlbW90ZUNyZWF0ZSAtPiBldmVudC5hY2tcbiAgX29uUmVzcG9uc2UobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBldmVudCA9IHtcbiAgICAgIHR5cGU6IG1zZy50eXBlLFxuICAgICAgdXJsOiBtc2cuZnJvbSxcbiAgICAgIGNvZGU6IG1zZy5ib2R5LmNvZGVcbiAgICB9O1xuXG4gICAgaWYgKF90aGlzLl9vblJlc3BvbnNlSGFuZGxlcikge1xuICAgICAgbG9nLmxvZygnUkVTUE9OU0UtRVZFTlQ6ICcsIGV2ZW50KTtcbiAgICAgIF90aGlzLl9vblJlc3BvbnNlSGFuZGxlcihldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLy9GTE9XLUlOOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gUmVwb3J0ZXJVUkwgYWRkcmVzczogZW1pdGVkIGJ5IGEgcmVtb3RlIFN5bmNoZXIgLT4gcmVhZFxuICBfb25SZWFkKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGNoaWxkcmVuc1NpemUgPSBKU09OLnN0cmluZ2lmeShfdGhpcy5jaGlsZHJlbnNKU09OKS5sZW5ndGg7XG5cbiAgICBsZXQgbGFyZ2VPYmplY3QgPSAoY2hpbGRyZW5zU2l6ZSA+IF90aGlzLl9jaGlsZHJlblNpemVUaHJlc2hvbGQpID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgbGV0IGV2ZW50ID0ge1xuICAgICAgdHlwZTogbXNnLnR5cGUsXG4gICAgICB1cmw6IG1zZy5mcm9tLFxuXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcbiAgICAgICAgaWYgKGxhcmdlT2JqZWN0KSBfdGhpcy5fc3luY1JlcGx5Rm9yTGFyZ2VEYXRhKG1zZyk7XG4gICAgICAgIGVsc2UgX3RoaXMuX3N5bmNSZXBseShtc2cpO1xuICAgICAgfSxcblxuICAgICAgcmVqZWN0OiAocmVhc29uKSA9PiB7XG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxuICAgICAgICAgIGJvZHk6IHsgY29kZTogNDAxLCBkZXNjOiByZWFzb24gfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gaWYgdGhlIHJlcXVlc3RlciBpcyBhbiBhdXRob3Jpc2VkIG9ic2VydmVyLCB0aGUgZGF0YSBvYmplY3QgaXMgcmVzcG9uZGVkIG90aGVyd2lzZSBhbiBldmVudCBpcyB0cmlnZ2VyZWRcbiAgICBsZXQgc3Vic2NyaXB0aW9ucyA9IFtdO1xuXG4gICAgaWYgKF90aGlzLm1ldGFkYXRhLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHN1YnNjcmlwdGlvbnMgPSBfdGhpcy5tZXRhZGF0YS5zdWJzY3JpcHRpb25zO1xuICAgIH0gZWxzZSBpZiAoX3RoaXMuX3N1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHN1YnNjcmlwdGlvbnMgPSBPYmplY3Qua2V5cyhfdGhpcy5fc3Vic2NyaXB0aW9ucykubWFwKGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gX3RoaXMuX3N1YnNjcmlwdGlvbnNba2V5XS51cmw7IH0pO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpcHRpb25zLmluZGV4T2YobXNnLmZyb20pICE9IC0xKSB7XG4gICAgICBpZiAobGFyZ2VPYmplY3QpIF90aGlzLl9zeW5jUmVwbHlGb3JMYXJnZURhdGEobXNnKTtcbiAgICAgIGVsc2UgX3RoaXMuX3N5bmNSZXBseShtc2cpO1xuICAgIH0gZWxzZSBpZiAoX3RoaXMuX29uUmVhZEhhbmRsZXIpIHtcbiAgICAgIGxvZy5sb2coJ1JFQUQtRVZFTlQ6ICcsIGV2ZW50KTtcbiAgICAgIF90aGlzLl9vblJlYWRIYW5kbGVyKGV2ZW50KTtcbiAgICB9XG5cbiAgfVxuXG4gIGdldCBjaGlsZHJlbnNKU09OKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGNoaWxkcmVucyA9IHt9O1xuXG4vLyAgICBsZXQgY2hpbGRyZW47XG5cbi8vICAgIGZvciAoY2hpbGRyZW4gaW4gX3RoaXMuX2NoaWxkcmVuT2JqZWN0cykge1xuICAgICAgbGV0IGNoaWxkO1xuLy8gICAgICBjaGlsZHJlbnNbY2hpbGRyZW5dID0ge307XG4gICAgICBmb3IgKGNoaWxkIGluIF90aGlzLl9jaGlsZHJlbk9iamVjdHMpIHtcbiAgICAgICAgY2hpbGRyZW5zW2NoaWxkXSA9IHt9O1xuICAgICAgICBjaGlsZHJlbnNbY2hpbGRdLnZhbHVlID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZF0ubWV0YWRhdGE7XG4gICAgICAgIGNoaWxkcmVuc1tjaGlsZF0uaWRlbnRpdHkgPSBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkXS5pZGVudGl0eTtcbiAgICAgIH1cbi8vICAgIH1cblxuICAgIHJldHVybiBjaGlsZHJlbnM7XG4gIH1cblxuICBfc3luY1JlcGx5KG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgb2JqZWN0VmFsdWUgPSBkZWVwQ2xvbmUoX3RoaXMubWV0YWRhdGEpO1xuXG4gICAgb2JqZWN0VmFsdWUuZGF0YSA9IGRlZXBDbG9uZShfdGhpcy5kYXRhKTtcbiAgICBvYmplY3RWYWx1ZS5jaGlsZHJlbk9iamVjdHMgPSBkZWVwQ2xvbmUoX3RoaXMuY2hpbGRyZW5zSlNPTik7XG5cbiAgICBvYmplY3RWYWx1ZS52ZXJzaW9uID0gX3RoaXMuX3ZlcnNpb247XG5cbiAgICBsZXQgcmVzcG9uc2UgPSB7XG4gICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcbiAgICAgIGJvZHk6IHsgY29kZTogMjAwLCB2YWx1ZTogb2JqZWN0VmFsdWUgfVxuICAgIH07XG5cbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcblxuICB9XG5cbiAgLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgaWYgdGhlIGRhdGEgb2JqZWN0IHRvIGJlIHN5bmNoZWQgaGFzIGNoaWxkcmVuT2plY3RzIHRvbyBsYXJnZVxuXG4gIF9zeW5jUmVwbHlGb3JMYXJnZURhdGEobXNnKSB7XG4gIC8vc2V0IGF0dHJpYnV0ZSB3aXRoIG51bWJlciBvZiBzcGxsaXRlZCBtZXNzYWdlc1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAvLyBsZXRzIHNldCB0aGUgaW5pdGlhbCBtZXNzYWdlIHdpdGggbm8gY2hpbGRPYmplY3RzXG5cbiAgICBsZXQgb2JqZWN0VmFsdWUgPSBkZWVwQ2xvbmUoX3RoaXMubWV0YWRhdGEpO1xuXG4gICAgb2JqZWN0VmFsdWUuZGF0YSA9IGRlZXBDbG9uZShfdGhpcy5kYXRhKTtcblxuICAgIG9iamVjdFZhbHVlLnZlcnNpb24gPSBfdGhpcy5fdmVyc2lvbjtcblxuICAgIGRlbGV0ZSBvYmplY3RWYWx1ZS5jaGlsZHJlbk9iamVjdHM7XG5cbiAgICBsZXQgY2hpbGRyZW47XG4gICAgbGV0IHZhbHVlcyA9IFtdOyAvLyBhcnJheSBvZiB2YWx1ZXMgdG8gYmUgc2VudCBpbiBzZXBhcmF0ZWQgcmVzcG9uc2VzXG4gICAgbGV0IGNoaWxkcmVuVmFsdWUgPSB7fTsgLy8gdmFsdWUgdG8gYmUgdXNlZCBpbiBlYWNoIHJlc3BvbnNlXG5cbiAgICBmb3IgKGNoaWxkIGluIF90aGlzLl9jaGlsZHJlbk9iamVjdHMpIHtcbi8vICAgICAgbGV0IGNoaWxkO1xuICAgICAgY2hpbGRyZW5WYWx1ZVtjaGlsZF0gPSB7fTtcbi8vICAgICAgZm9yIChjaGlsZCBpbiBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuXSkge1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoY2hpbGRyZW5WYWx1ZSkubGVuZ3RoID4gX3RoaXMuX2NoaWxkcmVuU2l6ZVRocmVzaG9sZCkge1xuICAgICAgICAgIC8vY2hpbGRyZW5WYWx1ZSBiaWcgZW5vdWdoIHRvIGJlIHNlbnQgaW4gYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICAgICAgdmFsdWVzLnB1c2goY2hpbGRyZW5WYWx1ZSk7XG4vLyAgICAgICAgICBjaGlsZHJlblZhbHVlID0ge307XG4vLyAgICAgICAgICBjaGlsZHJlblZhbHVlW2NoaWxkXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuVmFsdWVbY2hpbGRdID0ge307XG4gICAgICAgIGNoaWxkcmVuVmFsdWVbY2hpbGRdLnZhbHVlID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZF0ubWV0YWRhdGE7XG4gICAgICAgIGNoaWxkcmVuVmFsdWVbY2hpbGRdLmlkZW50aXR5ID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZF0uaWRlbnRpdHk7XG4vLyAgICAgIH1cbiAgICB9XG5cbiAgICB2YWx1ZXMucHVzaChjaGlsZHJlblZhbHVlKTtcblxuICAgIG9iamVjdFZhbHVlLnJlc3BvbnNlcyA9IHZhbHVlcy5sZW5ndGggKyAxOyAvL251bWJlciBvZiByZXNwb25zZXMgdG8gYmUgc2VudFxuXG4gICAgbGV0IGluaXRpYWxSZXNwb25zZSA9IHtcbiAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxuICAgICAgYm9keTogeyBjb2RlOiAxMDAsIHZhbHVlOiBvYmplY3RWYWx1ZSB9XG4gICAgfTtcblxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UoaW5pdGlhbFJlc3BvbnNlKTtcblxuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuXG4gICAgICBsZXQgcmVzcG9uc2UgPSBkZWVwQ2xvbmUoaW5pdGlhbFJlc3BvbnNlKTtcblxuICAgICAgcmVzcG9uc2UuYm9keS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICByZXNwb25zZS5ib2R5LnZhbHVlLnJlc3BvbnNlcyA9IG9iamVjdFZhbHVlLnJlc3BvbnNlcztcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7IF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpOyB9LCA1MCk7XG5cbiAgICAgIC8vIHNob3VsZCBwdXQgYSB0aW1lb3V0P1xuXG4gICAgfSk7XG5cbiAgfVxuXG4gIC8vIEV4ZWN1dGUgcmVxdWVzdCByZWNlaXZlZFxuICBfb25FeGVjdXRlKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIW1zZy5ib2R5Lm1ldGhvZCkgdGhyb3cgJ1tEYXRhT2JqZWN0UmVwb3J0ZXIuX29uRXhlY3V0ZV0gbWV0aG9kIG1pc3NpbmcgJywgbXNnO1xuXG4gICAgbGV0IHJlc3BvbnNlID0ge1xuICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXG4gICAgICBib2R5OiB7IGNvZGU6IDIwMCB9XG4gICAgfTtcblxuICAgIGxldCBldmVudCA9IHtcbiAgICAgIHR5cGU6IG1zZy50eXBlLFxuICAgICAgdXJsOiBtc2cuZnJvbSxcbiAgICAgIG1ldGhvZDogbXNnLmJvZHkubWV0aG9kLFxuICAgICAgcGFyYW1zOiBtc2cuYm9keS5wYXJhbXMsXG5cbiAgICAgIGFjY2VwdDogKCkgPT4ge1xuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHJlamVjdDogKHJlYXNvbikgPT4ge1xuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcbiAgICAgICAgICBib2R5OiB7IGNvZGU6IDQwMSwgZGVzYzogcmVhc29uIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChfdGhpcy5fb25FeGVjdXRlSGFuZGxlcikge1xuICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3RSZXBvcnRlcl0gRVhFQ1VURS1FVkVOVDogJywgZXZlbnQpO1xuICAgICAgX3RoaXMuX29uRXhlY3V0ZUhhbmRsZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IERhdGFPYmplY3RSZXBvcnRlcjtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLy8gTG9nIFN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdEYXRhT2JqZWN0T2JzZXJ2ZXInKTtcblxuaW1wb3J0IHsgZGVlcENsb25lIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IERhdGFPYmplY3QgZnJvbSAnLi9EYXRhT2JqZWN0JztcblxubGV0IEZpbHRlclR5cGUgPSB7QU5ZOiAnYW55JywgU1RBUlQ6ICdzdGFydCcsIEVYQUNUOiAnZXhhY3QnfTtcblxuLyoqXG4gKiBUaGUgY2xhc3MgcmV0dXJuZWQgZnJvbSB0aGUgU3luY2hlciBzdWJzY3JpYmUgY2FsbC5cbiAqIFRvIGJlIHVzZWQgYXMgYW4gb2JzZXJ2YXRpb24gcG9pbnQgZnJvbSBhIERhdGFPYmplY3RSZXBvcnRlciBjaGFuZ2UuXG4gKi9cbmNsYXNzIERhdGFPYmplY3RPYnNlcnZlciBleHRlbmRzIERhdGFPYmplY3QgLyogaW1wbGVtZW50cyBTeW5jU3RhdHVzICovIHtcbiAgLyogcHJpdmF0ZVxuICBfY2hhbmdlTGlzdGVuZXI6IE1zZ0xpc3RlbmVyXG5cbiAgLS0tLWV2ZW50IGhhbmRsZXJzLS0tLVxuICBfZmlsdGVyczogezxmaWx0ZXI+OiB7dHlwZTogPHN0YXJ0LCBleGFjdD4sIGNhbGxiYWNrOiA8ZnVuY3Rpb24+fSB9XG4gICovXG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICogU2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IEh5cGVydGllcy4gSXQncyBjYWxsZWQgYnkgdGhlIFN5bmNoZXIuc3Vic2NyaWJlIG1ldGhvZFxuICAgKi9cblxuICAvL1RPRE86IEZvciBGdXJ0aGVyIFN0dWR5XG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XG4gICAgLy90b2RvOiBjaGVjayB3aHlcbiAgICAvL2lucHV0LmluaXRpYWxEYXRhID0gaW5wdXQuaW5pdGlhbERhdGEuZGF0YTtcblxuICAgIHN1cGVyKGlucHV0KTtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5fdmVyc2lvbiA9IGlucHV0LnZlcnNpb247XG4gICAgX3RoaXMuX2ZpbHRlcnMgPSB7fTtcblxuICAgIF90aGlzLl9zeW5jT2JqLm9ic2VydmUoKGV2ZW50KSA9PiB7XG4gICAgICBfdGhpcy5fb25GaWx0ZXIoZXZlbnQpO1xuICAgIH0pO1xuXG5cbiAgICBfdGhpcy5fYWxsb2NhdGVMaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIERhdGEgT2JqZWN0IE9ic2VydmVyIHdpdGggbGFzdCB2ZXJzaW9uIG9mIERhdGEgT2JqZWN0IFJlcG9ydGVyLiBVc2VmdWwgZm9yIFJlc3VtZXNcbiAgICovXG4gIHN5bmMoKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdE9ic2VydmVyX3N5bmNdIHN5bmNocm9uaXNpbmcgJyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBsZXQgY3JpdGVyaWEgPSB7fTtcblxuLy8gICAgICBpZiAodGhpcy5tZXRhZGF0YS5iYWNrdXBSZXZpc2lvbikgY3JpdGVyaWEuYmFja3VwUmV2aXNpb24gPSB0aGlzLm1ldGFkYXRhLmJhY2t1cFJldmlzaW9uO1xuXG4gICAgICBfdGhpcy5fc3luY2hlci5yZWFkKF90aGlzLl9tZXRhZGF0YS51cmwsIGNyaXRlcmlhKS50aGVuKCh2YWx1ZSk9PntcbiAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0T2JzZXJ2ZXJfc3luY10gdmFsdWUgdG8gc3luYzogJywgdmFsdWUpO1xuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oX3RoaXMuZGF0YSwgZGVlcENsb25lKHZhbHVlLmRhdGEpKTtcblxuICAgICAgICBfdGhpcy5fdmVyc2lvbiA9IHZhbHVlLnZlcnNpb247XG5cbiAgICAgICAgX3RoaXMuX21ldGFkYXRhLmxhc3RNb2RpZmllZCA9IHZhbHVlLmxhc3RNb2RpZmllZDtcblxuICAgICAgICAvL1RPRE86IGNoZWNrIGZpcnN0IGlmIHRoZXJlIGFyZSBuZXcgY2hpbGRyZW5PYmplY3RzIHRvIGF2b2lkIG92ZXJoZWFkXG5cbiAgICAgICAgaWYgKHZhbHVlLmNoaWxkcmVuT2JqZWN0cykge1xuICAgICAgICAgIF90aGlzLnJlc3VtZUNoaWxkcmVucyh2YWx1ZS5jaGlsZHJlbk9iamVjdHMpO1xuICAgICAgICAgIF90aGlzLl9zdG9yZUNoaWxkcmVucygpO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSByZXNvbHZlKHRydWUpO1xuXG5cbiAgICAgICAgLyppZiAodmFsdWUudmVyc2lvbiAhPSBfdGhpcy5fdmVyc2lvbikge1xuICAgICAgICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdE9ic2VydmVyX3N5bmNdIHVwZGF0aW5nIGV4aXN0aW5nIGRhdGE6ICcsIF90aGlzLmRhdGEpO1xuXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihfdGhpcy5kYXRhIHx8IHt9LCBkZWVwQ2xvbmUodmFsdWUuZGF0YSkpO1xuXG4gICAgICAgICAgX3RoaXMuX21ldGFkYXRhID0gZGVlcENsb25lKHZhbHVlKTtcblxuICAgICAgICAgIGRlbGV0ZSBfdGhpcy5fbWV0YWRhdGEuZGF0YTtcblxuICAgICAgICAgIF90aGlzLl92ZXJzaW9uID0gdmFsdWUudmVyc2lvbjtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdE9ic2VydmVyX3N5bmNdIGV4aXN0aW5nIGRhdGEgaXMgdXBkYXRlZDogJywgdmFsdWUpO1xuICAgICAgICB9Ki9cblxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3RPYnNlcnZlcl9zeW5jXSBzeW5jIGZhaWxlZDogJywgcmVhc29uKTtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG5cbiAgfVxuXG4gIF9zdG9yZUNoaWxkcmVucygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IGNoaWxkcmVucyA9IHt9O1xuXG4gICAgLy9UT0RPOiB0byBiZSBzZW50IHRvIEh5cGVydHlSZXNvdXJjZVN0b3JhZ2Ugd2hlbiByZWFkeSB0byBoYW5kbGUgQ2hhdCBNZXNzYWdlc1xuXG4gICAgT2JqZWN0LmtleXMoX3RoaXMuX2NoaWxkcmVuT2JqZWN0cykuZm9yRWFjaCgoY2hpbGRJZCkgPT4ge1xuICAgICAgbGV0IGNoaWxkcmVuID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0cztcbi8vICAgICAgY2hpbGRyZW5zW2NoaWxkcmVuUmVzb3VyY2VdID0ge307XG5cbi8vICAgICAgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmZvckVhY2goKGNoaWxkSWQpID0+IHtcbiAgICAgICAgY2hpbGRyZW5zW2NoaWxkSWRdID0ge307XG4gICAgICAgIGNoaWxkcmVuc1tjaGlsZElkXS52YWx1ZSA9IGNoaWxkcmVuW2NoaWxkSWRdLm1ldGFkYXRhO1xuICAgICAgICBjaGlsZHJlbnNbY2hpbGRJZF0uaWRlbnRpdHkgPSBjaGlsZHJlbltjaGlsZElkXS5pZGVudGl0eTtcbi8vICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAgIGxldCBtc2cgPSB7XG5cbiAgICAgICAgZnJvbTogX3RoaXMuX293bmVyLFxuICAgICAgICB0bzogX3RoaXMuX3N5bmNoZXIuX3N1YlVSTCxcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICByZXNvdXJjZTogX3RoaXMuX3VybCxcbiAgICAgICAgICBhdHRyaWJ1dGU6ICdjaGlsZHJlbk9iamVjdHMnLFxuICAgICAgICAgIHZhbHVlOiBjaGlsZHJlbnNcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2cpO1xuXG4gIH1cblxuICBfYWxsb2NhdGVMaXN0ZW5lcnMoKSB7XG4gICAgc3VwZXIuX2FsbG9jYXRlTGlzdGVuZXJzKCk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9jaGFuZ2VMaXN0ZW5lciA9IF90aGlzLl9idXMuYWRkTGlzdGVuZXIoX3RoaXMuX3VybCArICcvY2hhbmdlcycsIChtc2cpID0+IHtcbiAgICAgIGlmIChtc2cudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgICAgbG9nLmxvZygnRGF0YU9iamVjdE9ic2VydmVyLScgKyBfdGhpcy5fdXJsICsgJy1SQ1Y6ICcsIG1zZyk7XG4gICAgICAgIF90aGlzLl9jaGFuZ2VPYmplY3QoX3RoaXMuX3N5bmNPYmosIG1zZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfcmVsZWFzZUxpc3RlbmVycygpIHtcbiAgICBzdXBlci5fcmVsZWFzZUxpc3RlbmVycygpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5fY2hhbmdlTGlzdGVuZXIucmVtb3ZlKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSBhbmQgZGVsZXRlIG9iamVjdCBkYXRhXG4gICAqL1xuICBkZWxldGUoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmIChfdGhpcy5faGVhcnRCZWF0KSBfdGhpcy5faGVhcnRCZWF0LnN0b3AoKTtcblxuICAgIF90aGlzLl9kZWxldGVDaGlsZHJlbnMoKS50aGVuKCgpPT57XG4gICAgICBfdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgX3RoaXMuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcbiAgICAgIGRlbGV0ZSBfdGhpcy5fc3luY2hlci5fb2JzZXJ2ZXJzW190aGlzLl91cmxdO1xuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSBhbmQgZGVsZXRlIG9iamVjdCBkYXRhXG4gICAqL1xuICB1bnN1YnNjcmliZSgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy9GTE9XLU9VVDogdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcnVudGltZSBpbnN0YW5jZSBvZiBTeW5jaGVyTWFuYWdlciAtPiBfb25Mb2NhbFVuU3Vic2NyaWJlXG4gICAgbGV0IHVuU3Vic2NyaWJlTXNnID0ge1xuICAgICAgdHlwZTogJ3Vuc3Vic2NyaWJlJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N5bmNoZXIuX3N1YlVSTCxcbiAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IF90aGlzLl91cmwgfVxuICAgIH07XG5cbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHVuU3Vic2NyaWJlTXNnLCAocmVwbHkpID0+IHtcbiAgICAgIGxvZy5sb2coJ0RhdGFPYmplY3RPYnNlcnZlci1VTlNVQlNDUklCRTogJywgcmVwbHkpO1xuICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XG4gICAgICAgIF90aGlzLl9yZWxlYXNlTGlzdGVuZXJzKCk7XG4gICAgICAgIGRlbGV0ZSBfdGhpcy5fc3luY2hlci5fb2JzZXJ2ZXJzW190aGlzLl91cmxdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoZSBjaGFuZ2UgbGlzdGVuZXJzIHNlbnQgYnkgdGhlIHJlcG9ydGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWx0ZXIgLSBGaWx0ZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBmaWVsZCAoc2VwYXJhdGVkIGRvdCBwYXRoKS4gQWNjZXB0cyAqIGF0IHRoZSBlbmQgZm9yIGEgbW9yZSB1bnJlc3RyaWN0ZWQgZmlsdGVyaW5nLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrXG4gICAqL1xuICBvbkNoYW5nZShmaWx0ZXIsIGNhbGxiYWNrKSB7XG4gICAgbGV0IGtleSA9IGZpbHRlcjtcbiAgICBsZXQgZmlsdGVyT2JqID0ge1xuICAgICAgdHlwZTogRmlsdGVyVHlwZS5FWEFDVCxcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xuICAgIH07XG5cbiAgICBsZXQgaWR4ID0gZmlsdGVyLmluZGV4T2YoJyonKTtcbiAgICBpZiAoaWR4ID09PSBmaWx0ZXIubGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKGlkeCA9PT0gMCkge1xuICAgICAgICBmaWx0ZXJPYmoudHlwZSA9IEZpbHRlclR5cGUuQU5ZO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmlsdGVyT2JqLnR5cGUgPSBGaWx0ZXJUeXBlLlNUQVJUO1xuICAgICAgICBrZXkgPSBmaWx0ZXIuc3Vic3RyKDAsIGZpbHRlci5sZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9maWx0ZXJzW2tleV0gPSBmaWx0ZXJPYmo7XG4gIH1cblxuICBfb25GaWx0ZXIoZXZlbnQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgT2JqZWN0LmtleXMoX3RoaXMuX2ZpbHRlcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgbGV0IGZpbHRlciA9IF90aGlzLl9maWx0ZXJzW2tleV07XG4gICAgICBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuQU5ZKSB7XG4gICAgICAgIC8vbWF0Y2ggYW55dGhpbmdcbiAgICAgICAgZmlsdGVyLmNhbGxiYWNrKGV2ZW50KTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuU1RBUlQpIHtcbiAgICAgICAgLy9pZiBzdGFydHMgd2l0aCBmaWx0ZXIuLi5cbiAgICAgICAgaWYgKGV2ZW50LmZpZWxkLmluZGV4T2Yoa2V5KSA9PT0gMCkge1xuICAgICAgICAgIGZpbHRlci5jYWxsYmFjayhldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuRVhBQ1QpIHtcbiAgICAgICAgLy9leGFjdCBtYXRjaFxuICAgICAgICBpZiAoZXZlbnQuZmllbGQgPT09IGtleSkge1xuICAgICAgICAgIGZpbHRlci5jYWxsYmFjayhldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uRGlzY29ubmVjdGVkKGNhbGxiYWNrKSB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICB0aGlzLl9zdWJzY3JpYmVSZWdpc3RyYXRpb24oKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl9vbkRpc2Nvbm5lY3RlZCA9IGNhbGxiYWNrO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IHJlamVjdChlcnIpKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9zdWJzY3JpYmVSZWdpc3RyYXRpb24oKSB7XG5cbiAgICBjb25zdCBtc2cgPSB7XG4gICAgICB0eXBlOiAnc3Vic2NyaWJlJyxcbiAgICAgIGZyb206IHRoaXMuX293bmVyLFxuICAgICAgdG86IHRoaXMuX3N5bmNoZXIuX3J1bnRpbWVVcmwgKyAnL3N1YnNjcmlwdGlvbnMnLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLl91cmwgKyAnL3JlZ2lzdHJhdGlvbiddXG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHRoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuICAgICAgICBsb2cubG9nKGBbRGF0YU9iamVjdE9ic2VydmVyLl9zdWJzY3JpYmVSZWdpc3RyYXRpb25dICR7dGhpcy5fdXJsfSByY3ZlZCByZXBseSBgLCByZXBseSk7XG5cbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgdGhpcy5fZ2VuZXJhdGVMaXN0ZW5lcih0aGlzLl91cmwgKyAnL3JlZ2lzdHJhdGlvbicpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1YnNjcmliaW5nIHJlZ2lzdHJhdGlvbiBzdGF0dXMgZm9yICcsIHRoaXMuX3VybCk7XG4gICAgICAgICAgcmVqZWN0KCdFcnJvciBzdWJzY3JpYmluZyByZWdpc3RyYXRpb24gc3RhdHVzIGZvciAnICsgdGhpcy5fdXJsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBfZ2VuZXJhdGVMaXN0ZW5lcihub3RpZmljYXRpb25VUkwpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihub3RpZmljYXRpb25VUkwsIChtc2cpID0+IHtcbiAgICAgIGxvZy5sb2coYFtEYXRhT2JqZWN0T2JzZXJ2ZXIucmVnaXN0cmF0aW9uTm90aWZpY2F0aW9uXSAke190aGlzLl91cmx9OiBgLCBtc2cpO1xuICAgICAgaWYgKG1zZy5ib2R5LnZhbHVlICYmIG1zZy5ib2R5LnZhbHVlID09PSAnZGlzY29ubmVjdGVkJyAmJiBfdGhpcy5fb25EaXNjb25uZWN0ZWQpIHtcbiAgICAgICAgbG9nLmxvZyhgW0RhdGFPYmplY3RPYnNlcnZlcl0gJHtfdGhpcy5fdXJsfTogd2FzIGRpc2Nvbm5lY3RlZCBgLCBtc2cpO1xuICAgICAgICBfdGhpcy5fb25EaXNjb25uZWN0ZWQoKTtcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3RzIHRoZSByZXBvcnRlciB0byBleGVjdXRlIGEgbWV0aG9kIG9uIHRoZSBkYXRhIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIC0gTmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXG4gICAqIEBwYXJhbSB7YXJyYXl9IHBhcmFtcyAtIGFycmF5IG9mIHBhcmFtZXRlcnMgZm9yIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb25cbiAgICogQHJldHVybiB7cHJvbWlzZX1cbiAgICovXG5cbiAgZXhlY3V0ZShtZXRob2QsIHBhcmFtcykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBjb25zdCBtc2cgPSB7XG4gICAgICAgIHR5cGU6ICdleGVjdXRlJyxcbiAgICAgICAgZnJvbTogdGhpcy5fb3duZXIsXG4gICAgICAgIHRvOiBfdGhpcy5fdXJsLFxuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgcGFyYW1zOiBwYXJhbXNcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuICAgICAgICBsb2cubG9nKGBbRGF0YU9iamVjdE9ic2VydmVyLmV4ZWN1dGVdICR7X3RoaXMuX3VybH0gcmN2ZWQgcmVwbHkgYCwgcmVwbHkpO1xuXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cud2FybihgW0RhdGFPYmplY3RPYnNlcnZlci5leGVjdXRlXSBleGVjdXRpb24gb2YgbWV0aG9kICR7bWV0aG9kfSB3YXMgcmVqZWN0IGJ5IHJlcG9ydGVyYCk7XG4gICAgICAgICAgcmVqZWN0KGBbRGF0YU9iamVjdE9ic2VydmVyLmV4ZWN1dGVdIGV4ZWN1dGlvbiBvZiBtZXRob2QgJHttZXRob2R9IHdhcyByZWplY3QgYnkgcmVwb3J0ZXJgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGF0YU9iamVjdE9ic2VydmVyO1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vKipcbiAqIEBhY2Nlc3MgcHJpdmF0ZVxuICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgY29sbGVjdGluZyBkZWx0YSBjaGFuZ2VzIGluIHJlbW90ZSBvYmplY3RzLCBiZWZvcmUgdGhlIHJlc3BvbnNlIG9mIHN1YnNjcmlwdGlvbiByZWFjaCB0aGUgb2JzZXJ2ZXIuXG4gKiBJdCdzIHVzZWQgaW4gU3luY2hlciAtPiBzdWJzY3JpYmUuIFRoZSBmbG93IGlzIGRlZmluZWQgYXM6XG4gKiAxLiAob2JzZXJ2ZXIpIC0tc3Vic2NyaWJlLS0+IChyZXBvcnRlcilcbiAqIDIuIChvYnNlcnZlcikgPC0tZGVsdGEgdXBkYXRlcy0tIChyZXBvcnRlcilcbiAqIDMuIChvYnNlcnZlcikgPC0tc3Vic2NyaWJlIHJlc3BvbnNlLS0gKHJlcG9ydGVyKVxuICogVGhpcyBtZWFucyB0aGF0IHRoZXJlIGNvdWxkIGJlIGRlbHRhIHVwZGF0ZXMgdHJhbnNmZXJyZWQgYmVmb3JlIHRoZSBzdWJzY3JpcHRpb24gY29uZmlybWF0aW9uLlxuICogU2luY2UgdGhlcmUgaXMgbm8gRGF0YU9iamVjdE9ic2VydmVyIGJlZm9yZSB0aGUgdWJzY3JpcHRpb24gY29uZmlybWF0aW9uLCB0aGVyZSBzaG91bGQgYmUgc29tZSBvdGhlciBvYmplY3QgY29sbGVjdGluZyB0aGUgdXBkYXRlcy5cbiAqIFByb3Zpc2lvbmFsIGRhdGEgaXMgYXBwbGllZCB0byB0aGUgRGF0YU9iamVjdE9ic2VydmVyIGFmdGVyIGNvbmZpcm1hdGlvbi4gT3IgZGlzY2FyZGVkIGlmIHRoZXJlIGlzIG5vIGNvbmZpcm1hdGlvbi5cbiAqL1xuXG4vLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0RhdGFQcm92aXNpb25hbCcpO1xuXG5jbGFzcyBEYXRhUHJvdmlzaW9uYWwge1xuICAvKiBwcml2YXRlXG4gIF9jaGlsZHJlbkxpc3RlbmVyczogW01zZ0xpc3RlbmVyXVxuICBfbGlzdGVuZXI6IE1zZ0xpc3RlbmVyXG5cbiAgX2NoYW5nZXM6IFtdXG4gICovXG5cbiAgY29uc3RydWN0b3Iob3duZXIsIHVybCwgYnVzLCBjaGlsZHJlbikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5fb3duZXIgPSBvd25lcjtcbiAgICBfdGhpcy5fdXJsID0gdXJsO1xuICAgIF90aGlzLl9idXMgPSBidXM7XG4gICAgX3RoaXMuX2NoaWxkcmVuID0gY2hpbGRyZW47XG5cbiAgICBfdGhpcy5fY2hhbmdlcyA9IFtdO1xuICAgIF90aGlzLl9hbGxvY2F0ZUxpc3RlbmVycygpO1xuICB9XG5cbiAgX2FsbG9jYXRlTGlzdGVuZXJzKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5fbGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKF90aGlzLl91cmwsIChtc2cpID0+IHtcbiAgICAgIGxvZy5sb2coJ0RhdGFQcm92aXNpb25hbC0nICsgX3RoaXMuX3VybCArICctUkNWOiAnLCBtc2cpO1xuICAgICAgX3RoaXMuX2NoYW5nZXMucHVzaChtc2cpO1xuICAgIH0pO1xuXG4gICAgLypcbiAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMgPSBbXTtcbiAgICBpZiAoX3RoaXMuX2NoaWxkcmVuKSB7XG4gICAgICBsZXQgY2hpbGRCYXNlVVJMID0gdXJsICsgJy9jaGlsZHJlbi8nO1xuICAgICAgX3RoaXMuX2NoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICAgIGxldCBjaGlsZFVSTCA9IGNoaWxkQmFzZVVSTCArIGNoaWxkO1xuICAgICAgICBsZXQgbGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKGNoaWxkVVJMLCAobXNnKSA9PiB7XG4gICAgICAgICAgLy9pZ25vcmUgbXNnIHNlbnQgYnkgaGltc2VsZlxuICAgICAgICAgIGlmIChtc2cuZnJvbSAhPT0gb3duZXIpIHtcbiAgICAgICAgICAgIGxvZy5sb2cobXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH0qL1xuICB9XG5cbiAgX3JlbGVhc2VMaXN0ZW5lcnMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9saXN0ZW5lci5yZW1vdmUoKTtcblxuICAgIC8qX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICBsaXN0ZW5lci5yZW1vdmUoKTtcbiAgICB9KTsqL1xuICB9XG5cbiAgZ2V0IGNoaWxkcmVuKCkgeyByZXR1cm4gdGhpcy5fY2hpbGRyZW47IH1cblxuICBhcHBseShvYnNlcnZlcikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX2NoYW5nZXMuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICBvYnNlcnZlci5fY2hhbmdlT2JqZWN0KG9ic2VydmVyLl9zeW5jT2JqLCBjaGFuZ2UpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERhdGFQcm92aXNpb25hbDtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLy8gTG9nIFN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdTeW5jaGVyJyk7XG5cbmltcG9ydCB7IGRlZXBDbG9uZSwgZGl2aWRlVVJMIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQgRGF0YU9iamVjdFJlcG9ydGVyIGZyb20gJy4vRGF0YU9iamVjdFJlcG9ydGVyJztcbmltcG9ydCBEYXRhT2JqZWN0T2JzZXJ2ZXIgZnJvbSAnLi9EYXRhT2JqZWN0T2JzZXJ2ZXInO1xuaW1wb3J0IERhdGFQcm92aXNpb25hbCBmcm9tICcuL0RhdGFQcm92aXNpb25hbCc7XG5cbi8qKlxuKiBUaGUgbWFpbiBjbGFzcyBmb3IgdGhlIHN5bmNoZXIgcGFja2FnZS5cbiogVGhlIFN5bmNoZXIgaXMgYSBzaW5nbGV0b24gY2xhc3MgcGVyIEh5cGVydHkvVVJMIGFuZCBpdCBpcyB0aGUgb3duZXIgb2YgYWxsIGNyZWF0ZWQgRGF0YSBTeW5jIE9iamVjdHMgYWNjb3JkaW5nIHRvIHRoZSBSZXBvcnRlciAtIE9ic2VydmVyIHBhdHRlcm4uXG4qIE1haW4gZnVuY3Rpb25hbGl0eSBpcyB0byBjcmVhdGUgcmVwb3J0ZXJzIGFuZCB0byBzdWJzY3JpYmUgdG8gZXhpc3Rpbmcgb25lcy5cbiovXG5jbGFzcyBTeW5jaGVyIHtcbiAgLyogcHJpdmF0ZVxuICBfb3duZXI6IFVSTFxuICBfYnVzOiBNaW5pQnVzXG5cbiAgX3N1YlVSTDogVVJMXG5cbiAgX3JlcG9ydGVyczogPHVybDogRGF0YU9iamVjdFJlcG9ydGVyPlxuICBfb2JzZXJ2ZXJzOiA8dXJsOiBEYXRhT2JqZWN0T2JzZXJ2ZXI+XG4gIF9wcm92aXNpb25hbHM6IDx1cmw6IERhdGFQcm92aXNpb25hbD5cblxuICAtLS0tZXZlbnQgaGFuZGxlcnMtLS0tXG4gIF9vbk5vdGlmaWNhdGlvbkhhbmRsZXI6IChldmVudCkgPT4gdm9pZFxuICBfb25SZXN1bWU6IChldmVudCkgPT4gdm9pZFxuICAqL1xuXG4gIC8qKlxuICAqIENvbnN0cnVjdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIEh5cGVydHkgb3duZXJcbiAgKiBAcGFyYW0ge0h5cGVydHlVUkx9IG93bmVyIC0gSHlwZXJ0eSBVUkwgb3duZXIuIEFuIFVSTCBhbGxvY2F0ZWQgYnkgdGhlIHJ1bnRpbWUgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBIeXBlcnR5LlxuICAqIEBwYXJhbSB7TWluaUJ1c30gYnVzIC0gQW4gaW5zdGFuY2Ugb2YgdGhlIE1pbmlCdXMgcHJvdmlkZWQgaW4gdGhlIHNhbmRib3guIFdoZW4gYW4gb2JqZWN0IChSZXBvcnRlciBvciBPYnNlcnZlZCkgaXMgY3JlYXRlZCwgdGhlIFN5bmNoZXJNYW5hZ2VyIHdpbGwgYWRkIGEgbGlzdGVuZXIgaW4gdGhlIE1pbmlCdXMgdG8gcmVjZWl2ZS9zZW5kIE1lc3NhZ2VzIG9mIHRoYXQgb2JqZWN0LlxuICAqIEBwYXJhbSB7SlNPTn0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBkYXRhLiBUaGUgb25seSByZXF1aXJlZCBmaWVsZCBmb3Igbm93IGlzIHRoZSBydW50aW1lVVJMLlxuICAqL1xuICBjb25zdHJ1Y3Rvcihvd25lciwgYnVzLCBjb25maWcpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX293bmVyID0gb3duZXI7XG4gICAgX3RoaXMuX2J1cyA9IGJ1cztcblxuICAgIF90aGlzLl9zdWJVUkwgPSBjb25maWcucnVudGltZVVSTCArICcvc20nO1xuICAgIF90aGlzLl9ydW50aW1lVXJsID0gY29uZmlnLnJ1bnRpbWVVUkw7XG5cbiAgICBfdGhpcy5fcDJwSGFuZGxlciA9IGNvbmZpZy5wMnBIYW5kbGVyO1xuICAgIF90aGlzLl9wMnBSZXF1ZXN0ZXIgPSBjb25maWcucDJwUmVxdWVzdGVyO1xuXG4gICAgX3RoaXMuX3JlcG9ydGVycyA9IHt9O1xuICAgIF90aGlzLl9vYnNlcnZlcnMgPSB7fTtcbiAgICBfdGhpcy5fcHJvdmlzaW9uYWxzID0ge307XG5cbiAgICBidXMuYWRkTGlzdGVuZXIob3duZXIsIChtc2cpID0+IHtcbiAgICAgIC8vaWdub3JlIG1zZyBzZW50IGJ5IGhpbXNlbGZcbiAgICAgIGlmIChtc2cuZnJvbSAhPT0gb3duZXIpIHtcbiAgICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyXSBTeW5jaGVyLVJDVjogJywgbXNnLCBfdGhpcyk7XG4gICAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdmb3J3YXJkJzogX3RoaXMuX29uRm9yd2FyZChtc2cpOyBicmVhaztcbiAgICAgICAgICBjYXNlICdjcmVhdGUnOiBfdGhpcy5fb25SZW1vdGVDcmVhdGUobXNnKTsgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZGVsZXRlJzogX3RoaXMuX29uUmVtb3RlRGVsZXRlKG1zZyk7IGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2V4ZWN1dGUnOiBfdGhpcy5fb25FeGVjdXRlKG1zZyk7IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBUaGUgb3duZXIgb2YgdGhlIFN5bmNoZXIgYW5kIGFsbCBjcmVhdGVkIHJlcG9ydGVycy5cbiAgKiBAdHlwZSB7SHlwZXJ0eVVSTH1cbiAgKi9cbiAgZ2V0IG93bmVyKCkgeyByZXR1cm4gdGhpcy5fb3duZXI7IH1cblxuICAvKipcbiAgKiBBbGwgb3duZWQgcmVwb3J0ZXJzLCB0aGUgb25lcyB0aGF0IHdlcmUgY3JlYXRlZCBieSBhIGNyZWF0ZVxuICAqIEB0eXBlIHtPYmplY3Q8VVJMLCBEYXRhT2JqZWN0UmVwb3J0ZXI+fVxuICAqL1xuICBnZXQgcmVwb3J0ZXJzKCkgeyByZXR1cm4gdGhpcy5fcmVwb3J0ZXJzOyB9XG5cbiAgLyoqXG4gICogQWxsIG93bmVkIG9ic2VydmVycywgdGhlIG9uZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgYSBsb2NhbCBzdWJzY3JpcHRpb25cbiAgKiBAdHlwZSB7T2JqZWN0PFVSTCwgRGF0YU9iamVjdE9ic2VydmVyPn1cbiAgKi9cbiAgZ2V0IG9ic2VydmVycygpIHsgcmV0dXJuIHRoaXMuX29ic2VydmVyczsgfVxuXG4gIC8qKlxuICAqIFJlcXVlc3QgYSBEYXRhT2JqZWN0UmVwb3J0ZXIgY3JlYXRpb24uIFRoZSBVUkwgd2lsbCBiZSBiZSByZXF1ZXN0ZWQgYnkgdGhlIGFsbG9jYXRpb24gbWVjaGFuaXNtLlxuICAqIEBwYXJhbSAge1NjaGVtYVVSTH0gc2NoZW1hIC0gSHlwZXJ0eSBDYXRhbG9ndWUgVVJMIGFkZHJlc3MgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgSlNPTi1TY2hlbWEgZGVzY3JpYmluZyB0aGUgRGF0YSBPYmplY3Qgc2NoZW1hXG4gICogQHBhcmFtICB7SHlwZXJ0eVVSTFtdfSBvYnNlcnZlcnMgLSBMaXN0IG9mIGh5cGVydGllcyB0aGF0IGFyZSBwcmUtYXV0aG9yaXplZCBmb3Igc3Vic2NyaXB0aW9uXG4gICogQHBhcmFtICB7SlNPTn0gaW5pdGlhbERhdGEgLSBJbml0aWFsIGRhdGEgb2YgdGhlIHJlcG9ydGVyXG4gICogQHBhcmFtICB7Ym9vbGVhbn0gc3RvcmUgLSAoT3B0aW9uYWwpIGlmIHRydWUsIG9iamVjdCB3aWxsIGJlIHN0b3JlZCBieSB0aGUgcnVudGltZVxuICAqIEBwYXJhbSAge2Jvb2xlYW59IHAycCAtIChPcHRpb25hbCkgaWYgdHJ1ZSwgZGF0YSBzeW5jaHJvbmlzYXRpb24gc3RyZWFtIHdpbGwgdXNlIHAycCBjb25uZWN0aW9uIGFzIG11Y2ggYXMgcG9zc2libGVcbiAgKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgLSAoT3B0aW9uYWwpIHRoZSBuYW1lIG9mIHRoZSBkYXRhb2JqZWN0XG4gICogQHBhcmFtICB7TWVzc2FnZUJvZHlJZGVudGl0eX0gaWRlbnRpdHkgLSAob3B0aW9uYWwpIGlkZW50aXR5IGRhdGEgdG8gYmUgYWRkZWQgdG8gaWRlbnRpdHkgdGhlIHVzZXIgcmVwb3J0ZXIuIFRvIGJlIHVzZWQgZm9yIGxlZ2FjeSBpZGVudGl0aWVzLlxuICAqIEBwYXJhbSAge1N5bmNNZXRhZGF0YX0gaW5wdXQgLSAob3B0aW9uYWwpIGFsbCBtZXRhZGF0YSByZXF1aXJlZCB0byBzdW5jIHRoZSBEYXRhIE9iamVjdC5cbiAgKiBAcmV0dXJuIHtQcm9taXNlPERhdGFPYmplY3RSZXBvcnRlcj59IFJldHVybiBQcm9taXNlIHRvIGEgbmV3IFJlcG9ydGVyLiBUaGUgcmVwb3J0ZXIgY2FuIGJlIGFjY2VwdGVkIG9yIHJlamVjdGVkIGJ5IHRoZSBQRVBcbiAgKi9cbiAgY3JlYXRlKHNjaGVtYSwgb2JzZXJ2ZXJzLCBpbml0aWFsRGF0YSwgc3RvcmUgPSBmYWxzZSwgcDJwID0gZmFsc2UsIG5hbWUgPSAnbm8gbmFtZScsIGlkZW50aXR5LCBpbnB1dCkge1xuXG4gICAgaWYgKCFzY2hlbWEpIHRocm93IEVycm9yKCdbU3luY2hlciAtIENyZWF0ZV0gLSBZb3UgbmVlZCBzcGVjaWZ5IHRoZSBkYXRhIG9iamVjdCBzY2hlbWEnKTtcbiAgICBpZiAoIW9ic2VydmVycykgdGhyb3cgRXJyb3IoJ1tTeW5jaGVyIC0gQ3JlYXRlXSAtVGhlIG9ic2VydmVycyBzaG91bGQgYmUgZGVmaW5lZCcpO1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBpbnB1dCA9IGlucHV0IHx8IHt9O1xuICAgIGxldCBjcmVhdGVJbnB1dCAgPSBPYmplY3QuYXNzaWduKHt9LCBpbnB1dCk7XG5cbiAgICBjcmVhdGVJbnB1dC5wMnAgPSBwMnA7XG4gICAgY3JlYXRlSW5wdXQuc3RvcmUgPSBzdG9yZTtcbiAgICBjcmVhdGVJbnB1dC5zY2hlbWEgPSBzY2hlbWE7XG4gICAgY3JlYXRlSW5wdXQuYXV0aG9yaXNlID0gb2JzZXJ2ZXJzO1xuICAgIGNyZWF0ZUlucHV0LnAycEhhbmRsZXIgPSBfdGhpcy5fcDJwSGFuZGxlcjtcbiAgICBjcmVhdGVJbnB1dC5wMnBSZXF1ZXN0ZXIgPSBfdGhpcy5fcDJwUmVxdWVzdGVyO1xuICAgIChpbml0aWFsRGF0YSkgPyBjcmVhdGVJbnB1dC5kYXRhID0gZGVlcENsb25lKGluaXRpYWxEYXRhKSA6IGNyZWF0ZUlucHV0LmRhdGEgPSB7fTtcbiAgICBjcmVhdGVJbnB1dC5uYW1lID0gbmFtZS5sZW5ndGggPT09IDAgPyAnbm8gbmFtZScgOiBuYW1lO1xuICAgIGNyZWF0ZUlucHV0LnJlcG9ydGVyID0gKGlucHV0Lmhhc093blByb3BlcnR5KCdyZXBvcnRlcicpICYmICgodHlwZW9mIGlucHV0LnJlcG9ydGVyKSAhPT0gJ2Jvb2xlYW4nKSkgPyBpbnB1dC5yZXBvcnRlciA6IF90aGlzLl9vd25lcjtcbiAgICBjcmVhdGVJbnB1dC5yZXN1bWUgPSBmYWxzZTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIGNyZWF0ZUlucHV0Lm11dHVhbCA9IGlucHV0Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSA/IGlucHV0Lm11dHVhbCA6IGZhbHNlO1xuICAgICAgY3JlYXRlSW5wdXQubmFtZSA9IGlucHV0Lmhhc093blByb3BlcnR5KCduYW1lJykgPyBpbnB1dC5uYW1lIDogY3JlYXRlSW5wdXQubmFtZTtcbiAgICB9IGVsc2UgeyBjcmVhdGVJbnB1dC5tdXR1YWwgPSBmYWxzZTsgfVxuXG4gICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCdyZXVzZVVSTCcpKSB7XG4gICAgICBjcmVhdGVJbnB1dC5yZXNvdXJjZSA9IGlucHV0LnJldXNlVVJMO1xuICAgIH1cblxuICAgIGlmIChpZGVudGl0eSkgICAgICB7IGNyZWF0ZUlucHV0LmlkZW50aXR5ID0gaWRlbnRpdHk7IH1cblxuICAgIC8vT2JqZWN0LmFzc2lnbihjcmVhdGVJbnB1dCwge3Jlc3VtZTogZmFsc2V9KTtcbiAgICAvL2RlYnVnZ2VyO1xuLy8gICAgY29uc29sZS5sb2coJ1tzeW5jaGVyIC0gY3JlYXRlXSAtIGNyZWF0ZSBSZXBvcnRlciAtIGNyZWF0ZUlucHV0OiAnLCBjcmVhdGVJbnB1dCk7XG5cbiAgICByZXR1cm4gX3RoaXMuX2NyZWF0ZShjcmVhdGVJbnB1dCk7XG4gIH1cblxuICAvKipcbiAgKiBSZXF1ZXN0IGEgRGF0YU9iamVjdFJlcG9ydGVyIGNyZWF0aW9uLiBUaGUgVVJMIHdpbGwgYmUgYmUgcmVxdWVzdGVkIGJ5IHRoZSBhbGxvY2F0aW9uIG1lY2hhbmlzbS5cbiAgKiBAcGFyYW0gIHtPYmplY3R9IGNyaXRlcmlhIC0gKG9wdGlvbmFsKSBpZGVudGl0eSBkYXRhIHRvIGJlIGFkZGVkIHRvIGlkZW50aXR5IHRoZSB1c2VyIHJlcG9ydGVyLiBUbyBiZSB1c2VkIGZvciBsZWdhY3kgaWRlbnRpdGllcy5cbiAgKiBAcmV0dXJuIHtQcm9taXNlPERhdGFPYmplY3RSZXBvcnRlcj5bXX0gUmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEgbGlzdCBvZiBEYXRhT2JqZWN0UmVwb3J0ZXIgdG8gYmUgcmVzdW1lZDtcbiAgKi9cbiAgcmVzdW1lUmVwb3J0ZXJzKGNyaXRlcmlhKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsb2cubG9nKCdbc3luY2hlciAtIGNyZWF0ZV0gLSByZXN1bWUgUmVwb3J0ZXIgLSBjcml0ZXJpYTogJywgY3JpdGVyaWEpO1xuXG4gICAgT2JqZWN0LmFzc2lnbihjcml0ZXJpYSwge3Jlc3VtZTogdHJ1ZX0pO1xuXG4gICAgcmV0dXJuIF90aGlzLl9yZXN1bWVDcmVhdGUoY3JpdGVyaWEpO1xuICB9XG5cbiAgLyoqXG4gICogUmVxdWVzdCBhIHN1YnNjcmlwdGlvbiB0byBhbiBleGlzdGVudCByZXBvcnRlciBvYmplY3QuXG4gICogQHBhcmFtIHtTY2hlbWFVUkx9IHNjaGVtYSAtIEh5cGVydHkgQ2F0YWxvZ3VlIFVSTCBhZGRyZXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIEpTT04tU2NoZW1hIGRlc2NyaWJpbmcgdGhlIERhdGEgT2JqZWN0IHNjaGVtYVxuICAqIEBwYXJhbSB7T2JqZWN0VVJMfSBvYmpVUkwgLSBBZGRyZXNzIG9mIHRoZSBleGlzdGVudCByZXBvcnRlciBvYmplY3QgdG8gYmUgb2JzZXJ2ZWRcbiAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdG9yZT1mYWxzZV0gLSBTYXZlIHRoZSBzdWJzY3JpcHRpb24gb24gdGhlIFN5bmNoZXIgTWFuYWdlciBmb3IgZnVydGhlciByZXN1bWUgKERlZmF1bHQgaXMgZmFsc2UpXG4gICogQHBhcmFtIHtCb29sZWFufSBbcDJwPWZhbHNlXSAtIEluZm8gYWJvdXQgaWYgc2hvdWxkIHVzZSBwMnAgY29ubmVjdGlvbiAoRGVmYXVsdCBpcyBmYWxzZSlcbiAgKiBAcGFyYW0ge0Jvb2xlYW59IFttdXR1YWw9dHJ1ZV0gLSBJbmZvIGFib3V0IGlmIG1lc3NhZ2VzIG9mIHRoaXMgb2JqZWN0IHNob3VsZCBiZSBlbmNyeXB0ZWQgKERlZmF1bHQgaXMgdHJ1ZSlcbiAgKiBAcGFyYW0gIHtNZXNzYWdlQm9keUlkZW50aXR5fSBpZGVudGl0eSAtIChvcHRpb25hbCkgaWRlbnRpdHkgZGF0YSB0byBiZSBhZGRlZCB0byBpZGVudGl0eSB0aGUgdXNlciByZXBvcnRlci4gVG8gYmUgdXNlZCBmb3IgbGVnYWN5IGlkZW50aXRpZXMuXG4gICogQHJldHVybiB7UHJvbWlzZTxEYXRhT2JqZWN0T2JzZXJ2ZXI+fSBSZXR1cm4gUHJvbWlzZSB0byBhIG5ldyBvYnNlcnZlci4gSXQncyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcG9ydGVyLlxuICAqL1xuXG4gIHN1YnNjcmliZShpbnB1dCkge1xuICAvKiAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgY3JpdGVyaWEgPSB7fTtcblxuICAgIGNyaXRlcmlhLnAycCA9IHAycDtcbiAgICBjcml0ZXJpYS5zdG9yZSA9IHN0b3JlO1xuICAgIGNyaXRlcmlhLnNjaGVtYSA9IHNjaGVtYTtcbiAgICBjcml0ZXJpYS5kb21haW5fc3Vic2NyaXB0aW9uID0gZG9tYWluX3N1YnNjcmlwdGlvbjtcblxuICAgIGNyaXRlcmlhLnJlc291cmNlID0gb2JqVVJMO1xuICAgIGlmIChpZGVudGl0eSkgICAgICB7IGNyaXRlcmlhLmlkZW50aXR5ID0gaWRlbnRpdHk7IH1cblxuICAgIC8vVE9ETzogRm9yIEZ1cnRoZXIgU3R1ZHlcbiAgICBjcml0ZXJpYS5tdXR1YWwgPSBtdXR1YWw7XG5cbiAgICBsb2cubG9nKCdbc3luY2hlciAtIHN1YnNjcmliZV0gLSBzdWJzY3JpYmUgY3JpdGVyaWE6ICcsIGNyaXRlcmlhKTtcblxuICAgIE9iamVjdC5hc3NpZ24oY3JpdGVyaWEsIHtyZXN1bWU6IGZhbHNlfSk7Ki9cblxuICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmUoaW5wdXQpO1xuICB9XG5cbiAgLyoqXG4gICogUmVxdWVzdCBhIHN1YnNjcmlwdGlvbiB0byBhbiBleGlzdGVudCByZXBvcnRlciBvYmplY3QuXG4gICogQHBhcmFtIHtjcml0ZXJpYX0gY3JpdGVyaWEgLSBJbmZvcm1hdGlvbiB0byBkaXNjb3ZlcnkgdGhlIG9ic2VydmVyIG9iamVjdFxuICAqIEByZXR1cm4ge1Byb21pc2U8RGF0YU9iamVjdE9ic2VydmVyPn0gUmV0dXJuIFByb21pc2UgdG8gYSBuZXcgb2JzZXJ2ZXIuIEl0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXBvcnRlci5cbiAgKi9cbiAgcmVzdW1lT2JzZXJ2ZXJzKGNyaXRlcmlhKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgX2NyaXRlcmlhID0gY3JpdGVyaWEgfHwge307XG5cbiAgICBPYmplY3QuYXNzaWduKF9jcml0ZXJpYSwge3Jlc3VtZTogdHJ1ZX0pO1xuXG4gICAgcmV0dXJuIF90aGlzLl9yZXN1bWVTdWJzY3JpYmUoX2NyaXRlcmlhKTtcbiAgfVxuXG4gIC8qKlxuICAqIFJlcXVlc3QgYSByZWFkIGFjdGlvbiBvbiB0aGUgcmVwb3J0ZXIgb2JqZWN0XG4gICogQHBhcmFtIHtPYmplY3RVUkx9IG9ialVSTCAtIFVSTCBvZiB0aGUgcmVwb3J0ZXIgb2JqZWN0IHRvIGJlIHJlYWRcbiAgKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdD59IFJldHVybiBQcm9taXNlIHRvIGxhc3QgYXZhaWxhYmxlIGRhdGEgb2YgdGhlIHJlcG9ydGVyXG4gICovXG4gIHJlYWQob2JqVVJMLCBjcml0ZXJpYSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgY29uc29sZS5sb2coJ1tTeW5jaGVyLnJlYWRdICcsIG9ialVSTCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAvLyBpbiBjYXNlIHRoZSBvYmplY3QgaXMgc3luY2hlZCBpbiBhIHJlbW90ZSBzdG9yYWdlLCBsZXRzIHN5bmMgd2l0aCBpdFxuLyogICAgICBpZiAoX3RoaXMuX29ic2VydmVyc1tvYmpVUkxdICYmIF90aGlzLl9vYnNlcnZlcnNbb2JqVVJMXS5tZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eSgnYmFja3VwJykgJiYgX3RoaXMuX29ic2VydmVyc1tvYmpVUkxdLm1ldGFkYXRhLmJhY2t1cCkge1xuXG4gICAgICAgIGxldCByZWFkTXNnID0ge1xuICAgICAgICAgIHR5cGU6ICdyZWFkJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N1YlVSTCwgXG4gICAgICAgICAgYm9keTogeyByZXNvdXJjZTogb2JqVVJMfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChjcml0ZXJpYSkgcmVhZE1zZy5ib2R5LmNyaXRlcmlhID0gY3JpdGVyaWE7XG5cbiAgICAgICAgICBsZXQgY2FsbGJhY2sgPSAocmVwbHkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5fcmVhZENhbGxCYWNrKHJlcGx5LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH07XG4gICAgXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZWFkTXNnLCBjYWxsYmFjaywgZmFsc2UpO1xuICAgIFxuICAgICAgfSBlbHNlIHsqL1xuICAgICAgICBfdGhpcy5fcmVhZFJlcG9ydGVyKG9ialVSTCkudGhlbigocmVzdWx0KT0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfSk7XG4vLyAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgX3JlYWRDYWxsQmFjayhyZXBseSwgcmVzb2x2ZSxyZWplY3QpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBjb25zb2xlLmxvZygnW1N5bmNoZXIucmVhZF0gcmVwbHk6ICcsIHJlcGx5KTtcblxuICAgICAgbGV0IGNoaWxkcmVucyA9IHt9O1xuICAgICAgbGV0IHZhbHVlID0ge307XG4gICAgICBsZXQgbiA9IDA7XG5cbiAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPCAzMDApIHtcbiAgICAgICAgaWYgKCFyZXBseS5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdyZXNwb25zZXMnKSkge1xuICAgICAgICAgIF90aGlzLl9idXMucmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcihyZXBseS5mcm9tLCByZXBseS5pZCk7XG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHsgLy9kYXRhIG9iamVjdCBpcyBzZW50IGluIHNlcGFyYXRlZCBtZXNzYWdlc1xuICAgICAgICAgIGlmIChuID09PSAwKSB7IC8vaW5pdGlhbCByZXNwb25zZSB3aXRob3V0IGNoaWxkcmVuc1xuICAgICAgICAgICAgdmFsdWUgPSByZXBseS5ib2R5LnZhbHVlO1xuICAgICAgICAgICAgKytuO1xuICAgICAgICAgIH0gZWxzZSB7IC8vIHJlY2VpdmVkIHJlc3BvbnNlIGNvbnRhaW5zIGNoaWxkcmVuc1xuICAgICAgICAgICAgZGVsZXRlIHJlcGx5LmJvZHkudmFsdWUucmVzcG9uc2VzO1xuICAgICAgICAgICAgbGV0IGNoaWxkcmVuO1xuICAgICAgICAgICAgZm9yIChjaGlsZHJlbiBpbiByZXBseS5ib2R5LnZhbHVlKSB7XG4gICAgICAgICAgICAgIGlmICghY2hpbGRyZW5zLmhhc093blByb3BlcnR5KGNoaWxkcmVuKSkgY2hpbGRyZW5zW2NoaWxkcmVuXSA9IHt9O1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNoaWxkcmVuc1tjaGlsZHJlbl0sIHJlcGx5LmJvZHkudmFsdWVbY2hpbGRyZW5dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICsrbjtcbiAgICAgICAgICAgIGlmIChuID09PSB2YWx1ZS5yZXNwb25zZXMpIHtcbiAgICAgICAgICAgICAgdmFsdWUuY2hpbGRyZW5PYmplY3RzID0gY2hpbGRyZW5zO1xuICAgICAgICAgICAgICBkZWxldGUgdmFsdWUucmVzcG9uc2VzO1xuICAgICAgICAgICAgICBfdGhpcy5fYnVzLnJlbW92ZVJlc3BvbnNlTGlzdGVuZXIocmVwbHkuZnJvbSwgcmVwbHkuaWQpO1xuICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgIHJlamVjdChyZXBseS5ib2R5LmRlc2MpO1xuICAgICAgfVxuXG4gIH1cblxuICBfcmVhZFJlcG9ydGVyKG9ialVSTCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IGRpcmVjdGx5IHRvIHJlcG9ydGVyIG9iamVjdCAobWF5YmUgdGhlcmUgaXMgbm8gbGlzdGVuZXIgYXZhaWxhYmxlLCBzbyBpdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggTWVzc2FnZUJ1cyAtPiByZXNvbHZlKVxuICAgIC8vd2lsbCByZWFjaCB0aGUgcmVtb3RlIG9iamVjdCBpbiBEYXRhT2JqZWN0UmVwb3J0ZXIgLT4gX29uUmVhZFxuICAgIGxldCByZWFkTXNnID0ge1xuICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBfdGhpcy5fb3duZXIsIHRvOiBvYmpVUkxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZWFkTXNnLCAocmVwbHkpID0+IHtcbiAgICAgICAgcmV0dXJuIF90aGlzLl9yZWFkQ2FsbEJhY2socmVwbHksIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9LCBmYWxzZSk7XG5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIGNyZWF0ZSBhbmQgZGVsZXRlIGV2ZW50cyBvZiByZW1vdmUgUmVwb3J0ZXIgb2JqZWN0cy5cbiAgKiBUaGlzIGlzIHJlbGVhdGVkIHRvIHRoZSBtZXNzYWdlbnMgc2VudCBieSBjcmVhdGUgdG8gdGhlIG9ic2VydmVycyBIeXBlcnR5IGFycmF5LlxuICAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQ6IE1zZ0V2ZW50KX0gY2FsbGJhY2tcbiAgKi9cbiAgb25Ob3RpZmljYXRpb24oY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIGNsb3NlIGV2ZW50cyBmcm9tIHRoZSBydW50aW1lLlxuICAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQ6IE1zZ0V2ZW50KX0gY2FsbGJhY2tcbiAgKi9cbiAgb25DbG9zZShjYWxsYmFjaykge1xuICAgIHRoaXMuX29uQ2xvc2UgPSBjYWxsYmFjaztcbiAgfVxuXG4gIF9jcmVhdGUoaW5wdXQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgbGV0IHJlcG9ydGVySW5wdXQgID0gT2JqZWN0LmFzc2lnbih7fSwgaW5wdXQpO1xuXG4gICAgICBsZXQgcmVzdW1lID0gaW5wdXQucmVzdW1lO1xuXG4gICAgICByZXBvcnRlcklucHV0LmNyZWF0ZWQgPSAobmV3IERhdGUpLnRvSVNPU3RyaW5nKCk7XG4gICAgICByZXBvcnRlcklucHV0LnJ1bnRpbWUgPSBfdGhpcy5fcnVudGltZVVybDtcblxuICAgICAgbGV0IHJlcXVlc3RWYWx1ZSA9IGRlZXBDbG9uZShyZXBvcnRlcklucHV0KTtcblxuICAgICAgZGVsZXRlIHJlcXVlc3RWYWx1ZS5wMnA7XG4gICAgICBkZWxldGUgcmVxdWVzdFZhbHVlLnN0b3JlO1xuICAgICAgZGVsZXRlIHJlcXVlc3RWYWx1ZS5vYnNlcnZlcnM7XG4gICAgICBkZWxldGUgcmVxdWVzdFZhbHVlLmlkZW50aXR5O1xuXG4gICAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBydW50aW1lIGluc3RhbmNlIG9mIFN5bmNoZXJNYW5hZ2VyIC0+IF9vbkNyZWF0ZVxuICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgIGxldCByZXF1ZXN0TXNnID0ge1xuICAgICAgICB0eXBlOiAnY3JlYXRlJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N1YlVSTCxcbiAgICAgICAgYm9keTogeyByZXN1bWU6IHJlc3VtZSwgdmFsdWU6IHJlcXVlc3RWYWx1ZSAgfVxuICAgICAgfTtcblxuXG4gICAgICByZXF1ZXN0TXNnLmJvZHkuc2NoZW1hID0gcmVwb3J0ZXJJbnB1dC5zY2hlbWE7XG5cbiAgICAgIGlmIChyZXBvcnRlcklucHV0LnAycCkgcmVxdWVzdE1zZy5ib2R5LnAycCA9IHJlcG9ydGVySW5wdXQucDJwO1xuICAgICAgaWYgKHJlcG9ydGVySW5wdXQuc3RvcmUpIHJlcXVlc3RNc2cuYm9keS5zdG9yZSA9IHJlcG9ydGVySW5wdXQuc3RvcmU7XG4gICAgICBpZiAocmVwb3J0ZXJJbnB1dC5pZGVudGl0eSkgcmVxdWVzdE1zZy5ib2R5LmlkZW50aXR5ID0gcmVwb3J0ZXJJbnB1dC5pZGVudGl0eTtcblxuICAgICAgY29uc29sZS5sb2coJ1tzeW5jaGVyLl9jcmVhdGVdOiAnLCByZXBvcnRlcklucHV0LCByZXF1ZXN0TXNnKTtcblxuICAgICAgLy9yZXF1ZXN0IGNyZWF0ZSB0byB0aGUgYWxsb2NhdGlvbiBzeXN0ZW0uIENhbiBiZSByZWplY3RlZCBieSB0aGUgUG9saWN5RW5naW5lLlxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXF1ZXN0TXNnLCAocmVwbHkpID0+IHtcbiAgICAgICAgbG9nLmxvZygnW3N5bmNoZXIgLSBjcmVhdGVdIC0gY3JlYXRlLXJlc3BvbnNlOiAnLCByZXBseSk7XG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xuICAgICAgICAgIC8vcmVwb3J0ZXIgY3JlYXRpb24gYWNjZXB0ZWRcbiAgICAgICAgICByZXBvcnRlcklucHV0LnVybCA9IHJlcGx5LmJvZHkucmVzb3VyY2U7XG5cbi8qICAgICAgICAgIGlmIChyZXBseS5ib2R5LnAycEhhbmRsZXIpIHJlcG9ydGVySW5wdXQucDJwSGFuZGxlciA9IHJlcGx5LmJvZHkucDJwSGFuZGxlcjtcbiAgICAgICAgICBpZiAocmVwbHkuYm9keS5wMnBSZXF1ZXN0ZXIpIHJlcG9ydGVySW5wdXQucDJwUmVxdWVzdGVyID0gcmVwbHkuYm9keS5wMnBSZXF1ZXN0ZXI7Ki9cblxuICAgICAgICAgIHJlcG9ydGVySW5wdXQuc3RhdHVzID0gJ2xpdmUnOy8vIHBjaDogZG8gd2UgbmVkIHRoaXM/XG4gICAgICAgICAgcmVwb3J0ZXJJbnB1dC5zeW5jaGVyID0gX3RoaXM7XG4gICAgICAgICAgcmVwb3J0ZXJJbnB1dC5jaGlsZHJlbnMgPSByZXBseS5ib2R5LmNoaWxkcmVuUmVzb3VyY2VzO1xuXG4gICAgICAgICAgbGV0IG5ld09iaiA9IF90aGlzLl9yZXBvcnRlcnNbcmVwb3J0ZXJJbnB1dC51cmxdO1xuXG4gICAgICAgICAgaWYgKCFuZXdPYmopIHtcbiAgICAgICAgICAgIG5ld09iaiA9IG5ldyBEYXRhT2JqZWN0UmVwb3J0ZXIocmVwb3J0ZXJJbnB1dCk7XG4gICAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXJzW3JlcG9ydGVySW5wdXQudXJsXSA9IG5ld09iajtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdPYmouaW52aXRlT2JzZXJ2ZXJzKGlucHV0LmF1dGhvcmlzZSwgaW5wdXQucDJwKTtcblxuICAgICAgICAgIHJlc29sdmUobmV3T2JqKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vcmVwb3J0ZXIgY3JlYXRpb24gcmVqZWN0ZWRcbiAgICAgICAgICByZWplY3QocmVwbHkuYm9keS5kZXNjKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIF9yZXN1bWVDcmVhdGUoY3JpdGVyaWEpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCByZXN1bWUgPSBjcml0ZXJpYS5yZXN1bWU7XG5cbiAgICAgIC8vRkxPVy1PVVQ6IHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgaW5zdGFuY2Ugb2YgU3luY2hlck1hbmFnZXIgLT4gX29uQ3JlYXRlXG4gICAgICBsZXQgcmVxdWVzdE1zZyA9IHtcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsIGZyb206IF90aGlzLl9vd25lciwgdG86IF90aGlzLl9zdWJVUkwsXG4gICAgICAgIGJvZHk6IHsgcmVzdW1lOiByZXN1bWUgfVxuICAgICAgfTtcblxuICAgICAgbG9nLmxvZygnW3N5bmNoZXIgLSBjcmVhdGVdOiAnLCBjcml0ZXJpYSwgcmVxdWVzdE1zZyk7XG4gICAgICBpZiAoY3JpdGVyaWEpIHtcbiAgICAgICAgcmVxdWVzdE1zZy5ib2R5LnZhbHVlID0gY3JpdGVyaWE7XG4gICAgICAgIGlmIChjcml0ZXJpYS5oYXNPd25Qcm9wZXJ0eSgncmVwb3J0ZXInKSkge1xuICAgICAgICAgIHJlcXVlc3RNc2cuYm9keS52YWx1ZS5yZXBvcnRlciA9IGNyaXRlcmlhLnJlcG9ydGVyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcXVlc3RNc2cuYm9keS52YWx1ZS5yZXBvcnRlciA9IF90aGlzLl9vd25lcjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY3JpdGVyaWEucDJwKSByZXF1ZXN0TXNnLmJvZHkucDJwID0gY3JpdGVyaWEucDJwO1xuICAgICAgaWYgKGNyaXRlcmlhLnN0b3JlKSByZXF1ZXN0TXNnLmJvZHkuc3RvcmUgPSBjcml0ZXJpYS5zdG9yZTtcbiAgICAgIGlmIChjcml0ZXJpYS5vYnNlcnZlcnMpIHJlcXVlc3RNc2cuYm9keS5hdXRob3Jpc2UgPSBjcml0ZXJpYS5vYnNlcnZlcnM7XG4gICAgICBpZiAoY3JpdGVyaWEuaWRlbnRpdHkpIHJlcXVlc3RNc2cuYm9keS5pZGVudGl0eSA9IGNyaXRlcmlhLmlkZW50aXR5O1xuXG4gICAgICBsb2cubG9nKCdbc3luY2hlci5fcmVzdW1lQ3JlYXRlXSAtIHJlc3VtZSBtZXNzYWdlOiAnLCByZXF1ZXN0TXNnKTtcblxuICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgLy9yZXF1ZXN0IGNyZWF0ZSB0byB0aGUgYWxsb2NhdGlvbiBzeXN0ZW0uIENhbiBiZSByZWplY3RlZCBieSB0aGUgUG9saWN5RW5naW5lLlxuXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlcXVlc3RNc2csIChyZXBseSkgPT4ge1xuICAgICAgICBsb2cubG9nKCdbc3luY2hlci5fcmVzdW1lQ3JlYXRlXSAtIGNyZWF0ZS1yZXN1bWVkLXJlc3BvbnNlOiAnLCByZXBseSk7XG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xuICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgbGV0IGxpc3RPZlJlcG9ydGVycyA9IHJlcGx5LmJvZHkudmFsdWU7XG5cbiAgICAgICAgICBmb3IgKGxldCBpbmRleCBpbiBsaXN0T2ZSZXBvcnRlcnMpIHtcblxuICAgICAgICAgICAgbGV0IGRhdGFPYmplY3QgPSBsaXN0T2ZSZXBvcnRlcnNbaW5kZXhdO1xuXG4gICAgICAgICAgICAvL3JlcG9ydGVyIGNyZWF0aW9uIGFjY2VwdGVkXG5cbiAgICAgICAgICAgIGRhdGFPYmplY3QuZGF0YSA9IGRlZXBDbG9uZShkYXRhT2JqZWN0LmRhdGEpIHx8IHt9O1xuXG4gICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpIHsgZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMgPSBkZWVwQ2xvbmUoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpOyB9XG5cbiAgICAgICAgICAgIGRhdGFPYmplY3QubXV0dWFsID0gZmFsc2U7XG4gICAgICAgICAgICBkYXRhT2JqZWN0LnJlc3VtZSA9IHRydWU7XG4gICAgICAgICAgICBkYXRhT2JqZWN0LnN0YXR1cyA9ICdsaXZlJzsvLyBwY2g6IGRvIHdlIG5lZCB0aGlzP1xuICAgICAgICAgICAgZGF0YU9iamVjdC5zeW5jaGVyID0gX3RoaXM7XG5cbiAgICAgICAgICAgIGxvZy5sb2coJ1tzeW5jaGVyLl9yZXN1bWVDcmVhdGVdIC0gY3JlYXRlLXJlc3VtZWQtZGF0YU9iamVjdFJlcG9ydGVyJywgZGF0YU9iamVjdCk7XG5cbiAgICAgICAgICAgIGxldCBuZXdPYmogPSBuZXcgRGF0YU9iamVjdFJlcG9ydGVyKGRhdGFPYmplY3QpO1xuXG4gICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpIHtcbiAgICAgICAgICAgICAgbmV3T2JqLnJlc3VtZUNoaWxkcmVucyhkYXRhT2JqZWN0LmNoaWxkcmVuT2JqZWN0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXJzW2RhdGFPYmplY3QudXJsXSA9IG5ld09iajtcblxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoX3RoaXMuX3JlcG9ydGVycyk7XG4gICAgICAgICAgaWYgKHRoaXMuX29uUmVwb3J0ZXJzUmVzdW1lKSB0aGlzLl9vblJlcG9ydGVyc1Jlc3VtZSh0aGlzLl9yZXBvcnRlcnMpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVwbHkuYm9keS5jb2RlID09PSA0MDQpIHtcbiAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvL3JlcG9ydGVyIGNyZWF0aW9uIHJlamVjdGVkXG4gICAgICAgICAgcmVqZWN0KHJlcGx5LmJvZHkuZGVzYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX3N1YnNjcmliZShpbnB1dCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBydW50aW1lIGluc3RhbmNlIG9mIFN5bmNoZXJNYW5hZ2VyIC0+IF9vbkxvY2FsU3Vic2NyaWJlXG4gICAgICBsZXQgc3Vic2NyaWJlTXNnID0ge1xuICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N1YlVSTCxcbiAgICAgICAgYm9keTogaW5wdXRcbiAgICAgIH07XG5cbiAgICAgIC8vIEh5cGVydHkgcmVxdWVzdCB0byBiZSBhbiBPYnNlcnZlclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9zcGVjcy9ibG9iL21hc3Rlci9tZXNzYWdlcy9kYXRhLXN5bmMtbWVzc2FnZXMubWQjaHlwZXJ0eS1yZXF1ZXN0LXRvLWJlLWFuLW9ic2VydmVyXG5cbiAgICAgIC8vIFJlc3VtZSBTdWJzY3JpcHRpb25zIGZvciB0aGUgc2FtZSBIeXBlcnR5IFVSTFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9zcGVjcy9ibG9iL21hc3Rlci9tZXNzYWdlcy9kYXRhLXN5bmMtbWVzc2FnZXMubWQjcmVzdW1lLXN1YnNjcmlwdGlvbnMtZm9yLXRoZS1zYW1lLWh5cGVydHktdXJsXG5cbiAgICAgIC8vIFJlc3VtZSBTdWJzY3JpcHRpb25zIGZvciBhIGNlcnRhaW4gdXNlciBhbmQgZGF0YSBzY2hlbWEgaW5kZXBlbmRlbnRseSBvZiB0aGUgSHlwZXJ0eSBVUkwuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L3NwZWNzL2Jsb2IvbWFzdGVyL21lc3NhZ2VzL2RhdGEtc3luYy1tZXNzYWdlcy5tZCNyZXN1bWUtc3Vic2NyaXB0aW9ucy1mb3ItYS1jZXJ0YWluLXVzZXItYW5kLWRhdGEtc2NoZW1hLWluZGVwZW5kZW50bHktb2YtdGhlLWh5cGVydHktdXJsXG4vKiAgICAgIGlmIChpbnB1dCkge1xuICAgICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ3AycCcpKSBzdWJzY3JpYmVNc2cuYm9keS5wMnAgPSBpbnB1dC5wMnA7XG4gICAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgnc3RvcmUnKSkgc3Vic2NyaWJlTXNnLmJvZHkuc3RvcmUgPSBpbnB1dC5zdG9yZTtcbiAgICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCdzY2hlbWEnKSkgc3Vic2NyaWJlTXNnLmJvZHkuc2NoZW1hID0gaW5wdXQuc2NoZW1hO1xuICAgICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ2lkZW50aXR5JykpIHN1YnNjcmliZU1zZy5ib2R5LmlkZW50aXR5ID0gaW5wdXQuaWRlbnRpdHk7XG4gICAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgncmVzb3VyY2UnKSkgc3Vic2NyaWJlTXNnLmJvZHkucmVzb3VyY2UgPSBpbnB1dC5yZXNvdXJjZTtcbiAgICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCdkb21haW5fc3Vic2NyaXB0aW9uJykpIHN1YnNjcmliZU1zZy5ib2R5LmRvbWFpbl9zdWJzY3JpcHRpb24gPSBpbnB1dC5kb21haW5fc3Vic2NyaXB0aW9uO1xuICAgICAgfVxuICAgICAgXG5cbiAgICAgIHN1YnNjcmliZU1zZy5ib2R5LnJlc3VtZSA9IGlucHV0LnJlc3VtZTtcblxuICAgICAgLy9UT0RPOiBGb3IgRnVydGhlciBTdHVkeVxuICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSkgc3Vic2NyaWJlTXNnLmJvZHkubXV0dWFsID0gaW5wdXQubXV0dWFsOyovXG5cbiAgICAgIGxvZy5sb2coJ1tzeW5jaGVyX3N1YnNjcmliZV0gLSBzdWJzY3JpYmUgbWVzc2FnZTogJywgaW5wdXQsIHN1YnNjcmliZU1zZyk7XG5cbiAgICAgIC8vcmVxdWVzdCBzdWJzY3JpcHRpb25cbiAgICAgIC8vUHJvdmlzaW9uYWwgZGF0YSBpcyBhcHBsaWVkIHRvIHRoZSBEYXRhT2JqZWN0T2JzZXJ2ZXIgYWZ0ZXIgY29uZmlybWF0aW9uLiBPciBkaXNjYXJkZWQgaWYgdGhlcmUgaXMgbm8gY29uZmlybWF0aW9uLlxuICAgICAgLy9mb3IgbW9yZSBpbmZvIHNlZSB0aGUgRGF0YVByb3Zpc2lvbmFsIGNsYXNzIGRvY3VtZW50YXRpb24uXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHN1YnNjcmliZU1zZywgKHJlcGx5KSA9PiB7XG4gICAgICAgIGxvZy5sb2coJ1tzeW5jaGVyXSAtIHN1YnNjcmliZS1yZXNwb25zZTogJywgcmVwbHkpO1xuXG4gICAgICAgIGxldCBvYmpVUkwgPSByZXBseS5ib2R5LnJlc291cmNlO1xuXG4gICAgICAgIGxldCBuZXdQcm92aXNpb25hbCA9IF90aGlzLl9wcm92aXNpb25hbHNbb2JqVVJMXTtcbiAgICAgICAgZGVsZXRlIF90aGlzLl9wcm92aXNpb25hbHNbb2JqVVJMXTtcbiAgICAgICAgaWYgKG5ld1Byb3Zpc2lvbmFsKSBuZXdQcm92aXNpb25hbC5fcmVsZWFzZUxpc3RlbmVycygpO1xuXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPCAyMDApIHtcbiAgICAgICAgICBsb2cubG9nKCdbc3luY2hlcl0gLSBuZXcgRGF0YVByb3Zpc2lvbmFsOiAnLCByZXBseS5ib2R5LmNoaWxkcmVuUmVzb3VyY2VzLCBvYmpVUkwpO1xuICAgICAgICAgIG5ld1Byb3Zpc2lvbmFsID0gbmV3IERhdGFQcm92aXNpb25hbChfdGhpcy5fb3duZXIsIG9ialVSTCwgX3RoaXMuX2J1cywgcmVwbHkuYm9keS5jaGlsZHJlblJlc291cmNlcyk7XG4gICAgICAgICAgX3RoaXMuX3Byb3Zpc2lvbmFsc1tvYmpVUkxdID0gbmV3UHJvdmlzaW9uYWw7XG4gICAgICAgIH0gZWxzZSBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcbiAgICAgICAgICBsb2cubG9nKCdbc3luY2hlcl0gLSBuZXcgRGF0YSBPYmplY3QgT2JzZXJ2ZXI6ICcsIHJlcGx5LCBfdGhpcy5fcHJvdmlzaW9uYWxzKTtcblxuICAgICAgICAgIGxldCBvYnNlcnZlcklucHV0ID0gcmVwbHkuYm9keS52YWx1ZTtcblxuICAgICAgICAgIG9ic2VydmVySW5wdXQuc3luY2hlciA9IF90aGlzO1xuICAgICAgICAgIG9ic2VydmVySW5wdXQucDJwID0gaW5wdXQucDJwO1xuICAgICAgICAgIG9ic2VydmVySW5wdXQuc3RvcmUgPSBpbnB1dC5zdG9yZTtcbiAgICAgICAgICBvYnNlcnZlcklucHV0LmlkZW50aXR5ID0gaW5wdXQuaWRlbnRpdHk7XG4gICAgICAgICAgb2JzZXJ2ZXJJbnB1dC5yZXN1bWUgPSBmYWxzZTtcblxuICAgICAgICAgIC8vIHRvZG86IEZvciBGdXJ0aGVyIFN0dWR5XG4gICAgICAgICAgb2JzZXJ2ZXJJbnB1dC5tdXR1YWwgPSBpbnB1dC5tdXR1YWw7XG5cbiAgICAgICAgICAvL29ic2VydmVySW5wdXQuY2hpbGRyZW4gPSBuZXdQcm92aXNpb25hbC5jaGlsZHJlbjtcblxuICAgICAgICAgIC8vVE9ETzogbXV0dWFsIEZvciBGdXJ0aGVyIFN0dWR5XG4gICAgICAgICAgbGV0IG5ld09iaiA9IF90aGlzLl9vYnNlcnZlcnNbb2JqVVJMXTtcbiAgICAgICAgICBpZiAoIW5ld09iaikge1xuICAgICAgICAgICAgbmV3T2JqID0gbmV3IERhdGFPYmplY3RPYnNlcnZlcihvYnNlcnZlcklucHV0KTtcbiAgICAgICAgICAgIF90aGlzLl9vYnNlcnZlcnNbb2JqVVJMXSA9IG5ld09iajtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3T2JqLnN5bmMoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsb2cubG9nKCdbc3luY2hlcl0gLSBuZXcgRGF0YSBPYmplY3QgT2JzZXJ2ZXIgYWxyZWFkeSBleGlzdDogJywgbmV3T2JqKTtcblxuICAgICAgICAgIHJlc29sdmUobmV3T2JqKTtcblxuICAgICAgICAgIGlmIChuZXdQcm92aXNpb25hbCkgeyBuZXdQcm92aXNpb25hbC5hcHBseShuZXdPYmopOyB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVwbHkuYm9keS5kZXNjKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbi8qXG4gIF9wcm9jZXNzT2ZmbGluZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIHJlZGlyZWN0VG8pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IGZvcndhcmQgPSB7XG4gICAgICBmcm9tOiBzdWJzY3JpcHRpb24uZnJvbSxcbiAgICAgIHR5cGU6ICdmb3J3YXJkJyxcbiAgICAgIHRvOiByZWRpcmVjdFRvLFxuICAgICAgYm9keTogc3Vic2NyaXB0aW9uXG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKCdbU3luY2hlci5fcHJvY2Vzc09mZmxpbmVTdWJzY3JpcHRpb25dIGZvcndhZGluZyAnLCBmb3J3YXJkKTtcblxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UoZm9yd2FyZCk7XG5cbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgY29kZTogMzAyLFxuICAgICAgZGVzYzogXCJGb3VuZCBcIiArIHJlZGlyZWN0VG9cbiAgICB9O1xuXG4gICAgcmV0dXJuKHJlc3VsdCk7XG5cbiAgfSovXG5cblxuICBfcmVzdW1lU3Vic2NyaWJlKGNyaXRlcmlhKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIC8vRkxPVy1PVVQ6IHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgaW5zdGFuY2Ugb2YgU3luY2hlck1hbmFnZXIgLT4gX29uTG9jYWxTdWJzY3JpYmVcbiAgICAgIGxldCBzdWJzY3JpYmVNc2cgPSB7XG4gICAgICAgIHR5cGU6ICdzdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fb3duZXIsIHRvOiBfdGhpcy5fc3ViVVJMLFxuICAgICAgICBib2R5OiB7fVxuICAgICAgfTtcblxuICAgICAgLy8gSHlwZXJ0eSByZXF1ZXN0IHRvIGJlIGFuIE9ic2VydmVyXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L3NwZWNzL2Jsb2IvbWFzdGVyL21lc3NhZ2VzL2RhdGEtc3luYy1tZXNzYWdlcy5tZCNoeXBlcnR5LXJlcXVlc3QtdG8tYmUtYW4tb2JzZXJ2ZXJcblxuICAgICAgLy8gUmVzdW1lIFN1YnNjcmlwdGlvbnMgZm9yIHRoZSBzYW1lIEh5cGVydHkgVVJMXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L3NwZWNzL2Jsb2IvbWFzdGVyL21lc3NhZ2VzL2RhdGEtc3luYy1tZXNzYWdlcy5tZCNyZXN1bWUtc3Vic2NyaXB0aW9ucy1mb3ItdGhlLXNhbWUtaHlwZXJ0eS11cmxcblxuICAgICAgLy8gUmVzdW1lIFN1YnNjcmlwdGlvbnMgZm9yIGEgY2VydGFpbiB1c2VyIGFuZCBkYXRhIHNjaGVtYSBpbmRlcGVuZGVudGx5IG9mIHRoZSBIeXBlcnR5IFVSTC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3Qvc3BlY3MvYmxvYi9tYXN0ZXIvbWVzc2FnZXMvZGF0YS1zeW5jLW1lc3NhZ2VzLm1kI3Jlc3VtZS1zdWJzY3JpcHRpb25zLWZvci1hLWNlcnRhaW4tdXNlci1hbmQtZGF0YS1zY2hlbWEtaW5kZXBlbmRlbnRseS1vZi10aGUtaHlwZXJ0eS11cmxcbiAgICAgIGlmIChjcml0ZXJpYSkge1xuICAgICAgICBpZiAoY3JpdGVyaWEuaGFzT3duUHJvcGVydHkoJ3AycCcpKSBzdWJzY3JpYmVNc2cuYm9keS5wMnAgPSBjcml0ZXJpYS5wMnA7XG4gICAgICAgIGlmIChjcml0ZXJpYS5oYXNPd25Qcm9wZXJ0eSgnc3RvcmUnKSkgc3Vic2NyaWJlTXNnLmJvZHkuc3RvcmUgPSBjcml0ZXJpYS5zdG9yZTtcbiAgICAgICAgaWYgKGNyaXRlcmlhLmhhc093blByb3BlcnR5KCdzY2hlbWEnKSkgc3Vic2NyaWJlTXNnLmJvZHkuc2NoZW1hID0gY3JpdGVyaWEuc2NoZW1hO1xuICAgICAgICBpZiAoY3JpdGVyaWEuaGFzT3duUHJvcGVydHkoJ2lkZW50aXR5JykpIHN1YnNjcmliZU1zZy5ib2R5LmlkZW50aXR5ID0gY3JpdGVyaWEuaWRlbnRpdHk7XG4gICAgICAgIGlmIChjcml0ZXJpYS5oYXNPd25Qcm9wZXJ0eSgncmVzb3VyY2UnKSkgc3Vic2NyaWJlTXNnLmJvZHkucmVzb3VyY2UgPSBjcml0ZXJpYS5yZXNvdXJjZTtcbiAgICAgIH1cblxuICAgICAgc3Vic2NyaWJlTXNnLmJvZHkucmVzdW1lID0gY3JpdGVyaWEucmVzdW1lO1xuXG4gICAgICAvL1RPRE86IEZvciBGdXJ0aGVyIFN0dWR5XG4gICAgICBsZXQgbXV0dWFsID0gY3JpdGVyaWEubXV0dWFsO1xuICAgICAgaWYgKGNyaXRlcmlhLmhhc093blByb3BlcnR5KCdtdXR1YWwnKSkgc3Vic2NyaWJlTXNnLmJvZHkubXV0dWFsID0gbXV0dWFsO1xuXG4gICAgICBjb25zb2xlLmxvZygnW3N5bmNoZXJdIC0gc3Vic2NyaWJlIG1lc3NhZ2U6ICcsIGNyaXRlcmlhLCBzdWJzY3JpYmVNc2cpO1xuXG4gICAgICAvL3JlcXVlc3Qgc3Vic2NyaXB0aW9uXG4gICAgICAvL1Byb3Zpc2lvbmFsIGRhdGEgaXMgYXBwbGllZCB0byB0aGUgRGF0YU9iamVjdE9ic2VydmVyIGFmdGVyIGNvbmZpcm1hdGlvbi4gT3IgZGlzY2FyZGVkIGlmIHRoZXJlIGlzIG5vIGNvbmZpcm1hdGlvbi5cbiAgICAgIC8vZm9yIG1vcmUgaW5mbyBzZWUgdGhlIERhdGFQcm92aXNpb25hbCBjbGFzcyBkb2N1bWVudGF0aW9uLlxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShzdWJzY3JpYmVNc2csIChyZXBseSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnW3N5bmNoZXJdIC0gc3Vic2NyaWJlLXJlc3VtZWQtcmVzcG9uc2U6ICcsIHJlcGx5KTtcblxuICAgICAgICBsZXQgb2JqVVJMID0gcmVwbHkuYm9keS5yZXNvdXJjZTtcblxuICAgICAgICBsZXQgbmV3UHJvdmlzaW9uYWwgPSBfdGhpcy5fcHJvdmlzaW9uYWxzW29ialVSTF07XG4gICAgICAgIGRlbGV0ZSBfdGhpcy5fcHJvdmlzaW9uYWxzW29ialVSTF07XG4gICAgICAgIGlmIChuZXdQcm92aXNpb25hbCkgbmV3UHJvdmlzaW9uYWwuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcblxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlIDwgMjAwKSB7IC8vIHRvZG86IGNoZWNrIGlmIHRoaXMgaXMgbmVlZGVkIGZvciB0aGUgcmVzdW1lXG5cbiAgICAgICAgICBsb2cubG9nKCdbc3luY2hlcl0gLSByZXN1bWUgbmV3IERhdGFQcm92aXNpb25hbDogJywgcmVwbHksIG9ialVSTCk7XG4gICAgICAgICAgbmV3UHJvdmlzaW9uYWwgPSBuZXcgRGF0YVByb3Zpc2lvbmFsKF90aGlzLl9vd25lciwgb2JqVVJMLCBfdGhpcy5fYnVzLCByZXBseS5ib2R5LmNoaWxkcmVuUmVzb3VyY2VzKTtcbiAgICAgICAgICBfdGhpcy5fcHJvdmlzaW9uYWxzW29ialVSTF0gPSBuZXdQcm92aXNpb25hbDtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XG5cbiAgICAgICAgICBsZXQgbGlzdE9mT2JzZXJ2ZXJzID0gcmVwbHkuYm9keS52YWx1ZTtcblxuICAgICAgICAgIGZvciAobGV0IGluZGV4IGluIGxpc3RPZk9ic2VydmVycykge1xuXG4gICAgICAgICAgICBsZXQgZGF0YU9iamVjdCA9IGxpc3RPZk9ic2VydmVyc1tpbmRleF07XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW3N5bmNoZXJdIC0gUmVzdW1lIE9iamVjdCBPYnNlcnZlcjogJywgcmVwbHksIGRhdGFPYmplY3QsIF90aGlzLl9wcm92aXNpb25hbHMpO1xuXG4gICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpIHsgZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMgPSBkZWVwQ2xvbmUoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpOyB9XG5cbiAgICAgICAgICAgIGRhdGFPYmplY3QuZGF0YSA9IGRlZXBDbG9uZShkYXRhT2JqZWN0LmRhdGEpIHx8IHt9O1xuICAgICAgICAgICAgZGF0YU9iamVjdC5yZXN1bWUgPSB0cnVlO1xuICAgICAgICAgICAgZGF0YU9iamVjdC5zeW5jaGVyID0gX3RoaXM7XG5cbiAgICAgICAgICAgIC8vVE9ETzogbXV0dWFsIEZvciBGdXJ0aGVyIFN0dWR5XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW3N5bmNoZXIuX3Jlc3VtZVN1YnNjcmliZV0gLSBjcmVhdGUgbmV3IGRhdGFPYmplY3Q6ICcsIGRhdGFPYmplY3QpO1xuICAgICAgICAgICAgbGV0IG5ld09iaiA9IG5ldyBEYXRhT2JqZWN0T2JzZXJ2ZXIoZGF0YU9iamVjdCk7XG5cbiAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmNoaWxkcmVuT2JqZWN0cykgeyBuZXdPYmoucmVzdW1lQ2hpbGRyZW5zKGRhdGFPYmplY3QuY2hpbGRyZW5PYmplY3RzKTsgfVxuICAgICAgICAgICAgbG9nLmxvZygnW3N5bmNoZXIuX3Jlc3VtZVN1YnNjcmliZV0gLSBuZXcgZGF0YU9iamVjdCcsIG5ld09iaik7XG4gICAgICAgICAgICBfdGhpcy5fb2JzZXJ2ZXJzW25ld09iai51cmxdID0gbmV3T2JqO1xuXG4gICAgICAgICAgICBpZiAoX3RoaXMuX3Byb3Zpc2lvbmFsc1tuZXdPYmoudXJsXSkge1xuICAgICAgICAgICAgICBfdGhpcy5fcHJvdmlzaW9uYWxzW25ld09iai51cmxdLmFwcGx5KG5ld09iaik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vbGV0cyBzeW5jIHdpdGggUmVwb3J0ZXJcbiAgICAgICAgICAgIC8vIGl0IHdhcyBjb21tZW50ZWQgdG8gbGV0IGh5cGVydGllcyBkZWNpZGUgd2hlbiB0byBzeW5jXG4gICAgICAgICAgICAvL25ld09iai5zeW5jKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShfdGhpcy5fb2JzZXJ2ZXJzKTtcblxuICAgICAgICAgIGlmICh0aGlzLl9vbk9ic2VydmVyc1Jlc3VtZSkgdGhpcy5fb25PYnNlcnZlcnNSZXN1bWUoX3RoaXMuX29ic2VydmVycyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDQwNCkge1xuICAgICAgICAgIHJlc29sdmUoe30pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmRlc2MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICB9XG5cbiAgLy9GTE9XLUlOOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYSBsb2NhbCBydW50aW1lIFJlcG9ydGVyT2JqZWN0IC0+IF9vblJlbW90ZVN1YnNjcmliZVxuICBfb25Gb3J3YXJkKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgcmVwb3J0ZXIgPSBfdGhpcy5fcmVwb3J0ZXJzW21zZy5ib2R5LnRvXTtcbiAgICByZXBvcnRlci5fb25Gb3J3YXJkKG1zZyk7XG4gIH1cblxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIHJlbW90ZSBTeW5jaGVyIC0+IGNyZWF0ZSAodGhpcyBpcyBhY3R1YWxseSBhbiBpbnZpdGF0aW9uIHRvIHN1YnNjcmliZSlcbiAgX29uUmVtb3RlQ3JlYXRlKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IHJlc291cmNlID0gbXNnLmZyb20uc2xpY2UoMCwgLTEzKTsgLy9yZW1vdmUgXCIvc3Vic2NyaXB0aW9uXCIgZnJvbSB0aGUgVVJMXG4gICAgbGV0IGRpdmlkZWRVUkwgPSBkaXZpZGVVUkwocmVzb3VyY2UpO1xuICAgIGxldCBkb21haW4gPSBkaXZpZGVkVVJMLmRvbWFpbjtcblxuICAgIGxldCBldmVudCA9IHtcbiAgICAgIHR5cGU6IG1zZy50eXBlLFxuICAgICAgZnJvbTogbXNnLmJvZHkuc291cmNlLFxuICAgICAgdXJsOiByZXNvdXJjZSxcbiAgICAgIGRvbWFpbjogZG9tYWluLFxuICAgICAgc2NoZW1hOiBtc2cuYm9keS5zY2hlbWEsXG4gICAgICB2YWx1ZTogbXNnLmJvZHkudmFsdWUsXG4gICAgICBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHksXG5cbiAgICAgIGFjazogKHR5cGUpID0+IHtcbiAgICAgICAgbGV0IGxUeXBlID0gMjAwO1xuICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgIGxUeXBlID0gdHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgLy9zZW5kIGFjayByZXNwb25zZSBtZXNzYWdlXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxuICAgICAgICAgIGJvZHk6IHsgY29kZTogbFR5cGUgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKF90aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgIGxvZy5pbmZvKCdbU3luY2hlcl0gTk9USUZJQ0FUSU9OLUVWRU5UOiAnLCBldmVudCk7XG4gICAgICBfdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIHJlbW90ZSBEYXRhT2JqZWN0UmVwb3J0ZXIgLT4gZGVsZXRlXG4gIF9vblJlbW90ZURlbGV0ZShtc2cpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAvL3JlbW92ZSBcIi9zdWJzY3JpcHRpb25cIiBmcm9tIHRoZSBVUkxcbiAgICBsZXQgcmVzb3VyY2UgPSBtc2cuYm9keS5yZXNvdXJjZTtcblxuICAgIGxldCBvYmplY3QgPSBfdGhpcy5fb2JzZXJ2ZXJzW3Jlc291cmNlXTtcblxuICAgIGxldCB1bnN1YnNjcmliZSA9IHtcbiAgICAgIGZyb206IF90aGlzLm93bmVyLFxuICAgICAgdG86IF90aGlzLl9zdWJVUkwsXG4gICAgICBpZDogbXNnLmlkLFxuICAgICAgdHlwZTogJ3Vuc3Vic2NyaWJlJyxcbiAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IG1zZy5ib2R5LnJlc291cmNlIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh1bnN1YnNjcmliZSk7XG5cbiAgICBkZWxldGUgX3RoaXMuX29ic2VydmVyc1tyZXNvdXJjZV07XG5cbiAgICBpZiAob2JqZWN0KSB7XG4gICAgICBsZXQgZXZlbnQgPSB7XG4gICAgICAgIHR5cGU6IG1zZy50eXBlLFxuICAgICAgICB1cmw6IHJlc291cmNlLFxuICAgICAgICBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHksXG5cbiAgICAgICAgYWNrOiAodHlwZSkgPT4ge1xuICAgICAgICAgIGxldCBsVHlwZSA9IDIwMDtcbiAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgbFR5cGUgPSB0eXBlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgLy9UT0RPOiBhbnkgb3RoZXIgZGlmZmVyZW50IG9wdGlvbnMgZm9yIHRoZSByZWxlYXNlIHByb2Nlc3MsIGxpa2UgYWNjZXB0IGJ1dCBub3IgcmVsZWFzZSBsb2NhbD9cbiAgICAgICAgICBpZiAobFR5cGUgPT09IDIwMCkge1xuICAgICAgICAgICAgb2JqZWN0LmRlbGV0ZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vc2VuZCBhY2sgcmVzcG9uc2UgbWVzc2FnZVxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXG4gICAgICAgICAgICBib2R5OiB7IGNvZGU6IGxUeXBlLCBzb3VyY2U6IF90aGlzLl9vd25lciB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChfdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgIGxvZy5sb2coJ05PVElGSUNBVElPTi1FVkVOVDogJywgZXZlbnQpO1xuICAgICAgICBfdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxuICAgICAgICBib2R5OiB7IGNvZGU6IDQwNCwgc291cmNlOiBfdGhpcy5fb3duZXIgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gY2xvc2UgZXZlbnQgcmVjZWl2ZWQgZnJvbSBydW50aW1lIHJlZ2lzdHJ5XG4gIF9vbkV4ZWN1dGUobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCByZXBseSA9IHtcbiAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxuICAgICAgYm9keTogeyBjb2RlOiAyMDAgfVxuICAgIH07XG5cbiAgICBpZiAoKG1zZy5mcm9tID09PSBfdGhpcy5fcnVudGltZVVybCArICcvcmVnaXN0cnkvJyB8fCBtc2cuZnJvbSA9PT0gX3RoaXMuX3J1bnRpbWVVcmwgKyAnL3JlZ2lzdHJ5JykgJiYgbXNnLmJvZHkgJiYgbXNnLmJvZHkubWV0aG9kICYmIG1zZy5ib2R5Lm1ldGhvZCA9PT0gJ2Nsb3NlJyAmJiBfdGhpcy5fb25DbG9zZSkge1xuICAgICAgbGV0IGV2ZW50ID0ge1xuICAgICAgICB0eXBlOiAnY2xvc2UnLFxuXG4gICAgICAgIGFjazogKHR5cGUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgcmVwbHkuYm9keS5jb2RlID0gdHlwZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgIC8vc2VuZCBhY2sgcmVzcG9uc2UgbWVzc2FnZVxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVwbHkpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBsb2cuaW5mbygnW1N5bmNoZXJdIENsb3NlLUVWRU5UOiAnLCBldmVudCk7XG4gICAgICBfdGhpcy5fb25DbG9zZShldmVudCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXBseSk7XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgKiBDYWxsYmFjayBzeXN0ZW0gdG8gdHJpZ2dlciB0aGUgcmVzdW1lZCByZXBvcnRlcnNcbiAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBmdW5jdGlvbiBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGludm9rZWRcbiAgKiBAcmV0dXJuIHtPYmplY3Q8VVJMLCBEYXRhT2JqZWN0UmVwb3J0ZXI+fSBSZXR1cm4gb25lIG9iamVjdCB3aXRoIGFsbCByZXN1bWVkIHJlcG9ydGVycztcbiAgKi9cbiAgb25SZXBvcnRlcnNSZXN1bWUoY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vblJlcG9ydGVyc1Jlc3VtZSA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICogQ2FsbGJhY2sgc3lzdGVtIHRvIHRyaWdnZXIgdGhlIHJlc3VtZWQgb2JzZXJ2ZXJzXG4gICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIC0gZnVuY3Rpb24gY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBpbnZva2VkXG4gICogQHJldHVybiB7T2JqZWN0PFVSTCwgRGF0YU9iamVjdE9ic2VydmVyPn0gUmV0dXJuIG9uZSBvYmplY3Qgd2l0aCBhbGwgcmVzdW1lZCBvYnNlcnZlcnM7XG4gICovXG4gIG9uT2JzZXJ2ZXJzUmVzdW1lKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb25PYnNlcnZlcnNSZXN1bWUgPSBjYWxsYmFjaztcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFN5bmNoZXI7XG4iLCIvKipcbiogVGhlIE5vdGl0aWZpY2F0aW9uIEhhbmRsZXIgaXMgdXNlZCB0byBoYW5kbGUgbm90aWZpY2F0aW9ucyBub3QgcHJvY2Vzc2VkIGJ5IHRoZSBzeW5jaGVyIHdoZW4gcnVubmluZyBpbiBhIHNhbmRib3guXG4qL1xuXG5pbXBvcnQgeyBkaXZpZGVVUkwgfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbmNsYXNzIE5vdGlmaWNhdGlvbkhhbmRsZXIge1xuXG4gIGNvbnN0cnVjdG9yKGJ1cykge1xuXG4gICAgaWYgKCFidXMpIHRocm93IEVycm9yKCdbTm90aWZpY2F0aW9uSGFuZGxlciBDb25zdHJ1Y3Rvcl0gYnVzIGlucHV0IGlzIG1hbmRhdG9yeScpO1xuICAgIHRoaXMuX2J1cyA9IGJ1cztcbiAgICB0aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIgPSB7fTtcbiAgfVxuXG4gIG9uTm90aWZpY2F0aW9uKHNjaGVtZSwgY2FsbGJhY2spIHtcbiAgICB0aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXJbc2NoZW1lXSA9IGNhbGxiYWNrO1xuICB9XG5cbiAgb25DcmVhdGUobXNnKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAvLyAgbGV0IHJlc291cmNlID0gbXNnLmZyb20uc2xpY2UoMCwgLTEzKTsgLy9yZW1vdmUgXCIvc3Vic2NyaXB0aW9uXCIgZnJvbSB0aGUgVVJMXG5cbiAgICBsZXQgcmVzb3VyY2UgPSBtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgncmVzb3VyY2UnKSA/IG1zZy5ib2R5LnJlc291cmNlIDogbXNnLmZyb20uc2xpY2UoMCwgLTEzKTtcbiAgICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTChyZXNvdXJjZSk7XG4gICAgbGV0IGRvbWFpbiA9IGRpdmlkZWRVUkwuZG9tYWluO1xuICAgIGxldCBzY2hlbWUgPSByZXNvdXJjZS5zcGxpdCgnOi8vJylbMF07XG5cbiAgICBsZXQgZXJyb3IgPSAocmVhc29uKSA9PiB7XG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXG4gICAgICAgIGJvZHk6IHsgY29kZTogNDAwLCBkZXNjOiAnQmFkIFJlcXVlc3Q6ICcgKyByZWFzb24gfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICghbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3NvdXJjZScpKSB7IGVycm9yKCdNaXNzaW5nIHNvdXJjZScpOyB9XG4gICAgaWYgKCFtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnc2NoZW1hJykpIHsgZXJyb3IoJ01pc3Npbmcgc2NoZW1hJyk7IH1cbiAgICBpZiAoIW1zZy5ib2R5Lmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7IGVycm9yKCdNaXNzaW5nIHZhbHVlJyk7IH1cbiAgICBpZiAoIW1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdpZGVudGl0eScpKSB7IGVycm9yKCdNaXNzaW5nIGlkZW50aXR5Jyk7IH1cblxuICAgIGxldCBldmVudCA9IHtcbiAgICAgIHR5cGU6IG1zZy50eXBlLFxuICAgICAgZnJvbTogbXNnLmJvZHkuc291cmNlLFxuICAgICAgdXJsOiByZXNvdXJjZSxcbiAgICAgIGRvbWFpbjogZG9tYWluLFxuICAgICAgc2NoZW1hOiBtc2cuYm9keS5zY2hlbWEsXG4gICAgICB2YWx1ZTogbXNnLmJvZHkudmFsdWUsXG4gICAgICBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHksXG4gICAgICB0bzogbXNnLnRvLFxuICAgICAgdmlhOiBtc2cuYm9keS52aWEsXG5cbiAgICAgIGFjazogKHR5cGUpID0+IHtcbiAgICAgICAgbGV0IGxUeXBlID0gMjAwO1xuICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgIGxUeXBlID0gdHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgLy9zZW5kIGFjayByZXNwb25zZSBtZXNzYWdlXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxuICAgICAgICAgIGJvZHk6IHsgY29kZTogbFR5cGUgfVxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKHJlYXNvbikgPT4ge1xuICAgICAgICBlcnJvcihyZWFzb24pO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKF90aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXJbc2NoZW1lXSkge1xuICAgICAgY29uc29sZS5pbmZvKCdbTm90aWZpY2F0aW9uSGFuZGxlcl0gTk9USUZJQ0FUSU9OLUVWRU5UOiAnLCBldmVudCk7XG4gICAgICBfdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyW3NjaGVtZV0oZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIG9uRGVsZXRlKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgIC8vcmVtb3ZlIFwiL3N1YnNjcmlwdGlvblwiIGZyb20gdGhlIFVSTFxuICAgIGxldCByZXNvdXJjZSA9IG1zZy5ib2R5LnJlc291cmNlO1xuXG4gICAgbGV0IG9iamVjdCA9IF90aGlzLl9vYnNlcnZlcnNbcmVzb3VyY2VdO1xuXG4gICAgbGV0IHVuc3Vic2NyaWJlID0ge1xuICAgICAgZnJvbTogX3RoaXMub3duZXIsXG4gICAgICB0bzogX3RoaXMuX3N1YlVSTCxcbiAgICAgIGlkOiBtc2cuaWQsXG4gICAgICB0eXBlOiAndW5zdWJzY3JpYmUnLFxuICAgICAgYm9keTogeyByZXNvdXJjZTogbXNnLmJvZHkucmVzb3VyY2UgfVxuICAgIH07XG5cbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHVuc3Vic2NyaWJlKTtcblxuICAgIGRlbGV0ZSBfdGhpcy5fb2JzZXJ2ZXJzW3Jlc291cmNlXTtcblxuICAgIGlmIChvYmplY3QpIHtcbiAgICAgIGxldCBldmVudCA9IHtcbiAgICAgICAgdHlwZTogbXNnLnR5cGUsXG4gICAgICAgIHVybDogcmVzb3VyY2UsXG4gICAgICAgIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSxcblxuICAgICAgICBhY2s6ICh0eXBlKSA9PiB7XG4gICAgICAgICAgbGV0IGxUeXBlID0gMjAwO1xuICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICBsVHlwZSA9IHR5cGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAvL1RPRE86IGFueSBvdGhlciBkaWZmZXJlbnQgb3B0aW9ucyBmb3IgdGhlIHJlbGVhc2UgcHJvY2VzcywgbGlrZSBhY2NlcHQgYnV0IG5vciByZWxlYXNlIGxvY2FsP1xuICAgICAgICAgIGlmIChsVHlwZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICBvYmplY3QuZGVsZXRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy9zZW5kIGFjayByZXNwb25zZSBtZXNzYWdlXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcbiAgICAgICAgICAgIGJvZHk6IHsgY29kZTogbFR5cGUsIHNvdXJjZTogX3RoaXMuX293bmVyIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKF90aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgbG9nLmxvZygnTk9USUZJQ0FUSU9OLUVWRU5UOiAnLCBldmVudCk7XG4gICAgICAgIF90aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIoZXZlbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXG4gICAgICAgIGJvZHk6IHsgY29kZTogNDA0LCBzb3VyY2U6IF90aGlzLl9vd25lciB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTm90aWZpY2F0aW9uSGFuZGxlcjtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cbmltcG9ydCB7ZGl2aWRlVVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbi8qKlxuKiBDb3JlIElkZW50aXR5TWFuYWdlciBpbnRlcmZhY2VcbiogQ2xhc3MgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIHNlYXJjaCBmb3IgSWRlbnRpdGllcyByZWdpc3RlcmVkIGluIHJ1bnRpbWUtY29yZVxuKi9cbmNsYXNzIElkZW50aXR5TWFuYWdlciB7XG5cbiAgLyoqXG4gICogVG8gaW5pdGlhbGlzZSB0aGUgSWRlbnRpdHlNYW5hZ2VyLCB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIHN1cHBvcnQgZm9yIGh5cGVydGllcyB0b1xuICAqIHF1ZXJ5IGFib3V0IGlkZW50aXRpZXMgcmVnaXN0ZXJlZFxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgb3duZXIgICAgICAgICAgICBvd25lclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgcnVudGltZVVSTCAgICAgICAgICAgIHJ1bnRpbWVVUkxcbiAgKiBAcGFyYW0gIHtNZXNzYWdlQnVzfSAgICAgICAgICBtc2didXMgICAgICAgICAgICAgICAgbXNnYnVzXG4gICovXG4gIGNvbnN0cnVjdG9yKG93bmVyLCBydW50aW1lVVJMLCBtc2dCdXMpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLm1lc3NhZ2VCdXMgPSBtc2dCdXM7XG5cbiAgICBfdGhpcy5kb21haW4gPSBkaXZpZGVVUkwob3duZXIpLmRvbWFpbjtcbiAgICBfdGhpcy5vd25lciA9IG93bmVyO1xuICAgIF90aGlzLnJ1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xuICB9XG5cbiAgLyoqXG4gICogRnVuY3Rpb24gdG8gcXVlcnkgdGhlIHJ1bnRpbWUgcmVnaXN0cnkgYWJvdXQgdGhlIGlkZW50aXR5IHRvIHdoaWNoIHRoZSBoeXBlcnR5IHdhcyBhc3NvY2lhdGVkXG4gICogQHBhcmFtIHtTdHJpbmd9ICAgICAgIHR5cGUgKE9wdGlvbmFsKSAgICAgICAgIHR5cGUgb2YgdXNlciBpbmZvIHJlcXVpcmVkXG4gICogQHBhcmFtIHtTdHJpbmd9ICAgICAgIG93bmVyIChPcHRpb25hbCkgICBvd25lciB0byBzZWFyY2ggZm9yXG4gICogQHJldHVybiB7UHJvbWlzZX0gICAgIHVzZXJVUkwgICAgICAgdXNlclVSTCBhc3NvY2lhdGVkIHRvIHRoZSBoeXBlcnR5XG4gICovXG4gIGRpc2NvdmVyVXNlclJlZ2lzdGVyZWQodHlwZSwgaHlwZXJ0eSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGxldCBhY3RpdmVIeXBlcnR5VVJMO1xuXG4gICAgICAvLyBpZiBhbnkgdHlwZSBvZiBzZWFyY2ggaXMgc2VsZWN0ZWQgcXVlcnkgZm9yIHRoYXQgdHlwZSwgb3RoZXJ3aXNlIHF1ZXJ5IGZvciBkZWZhdWx0IHVzZXIgaW5mb1xuICAgICAgbGV0IHNlYXJjaFR5cGUgPSAodHlwZSkgPyB0eXBlIDogJy4nO1xuXG4gICAgICBpZiAoIWh5cGVydHkpIHtcbiAgICAgICAgYWN0aXZlSHlwZXJ0eVVSTCA9IF90aGlzLm93bmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZlSHlwZXJ0eVVSTCA9IGh5cGVydHk7XG4gICAgICB9XG5cbiAgICAgIGxldCBtc2cgPSB7XG4gICAgICAgIHR5cGU6ICdyZWFkJywgZnJvbTogYWN0aXZlSHlwZXJ0eVVSTCwgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL3JlZ2lzdHJ5LycsIGJvZHk6IHsgcmVzb3VyY2U6IHNlYXJjaFR5cGUsIGNyaXRlcmlhOiBhY3RpdmVIeXBlcnR5VVJMfVxuICAgICAgfTtcblxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuXG4gICAgICAgIGxldCB1c2VyVVJMID0gcmVwbHkuYm9keS5yZXNvdXJjZTtcblxuICAgICAgICBpZiAodXNlclVSTCAmJiByZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xuICAgICAgICAgIHJlc29sdmUodXNlclVSTCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KCdjb2RlOiAnICsgcmVwbHkuYm9keS5jb2RlICsgJyBObyB1c2VyIHdhcyBmb3VuZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIEZ1bmN0aW9uIHRvIHF1ZXJ5IHRoZSBJZGVudGl0eSBNb2R1bGUgYWJvdXQgYXV0aGVudGljYXRlZCBpZGVudGl0aWVzIGZyb20gYSBjZXJ0YWluIGRvbWFpblxuICAqIEBwYXJhbSB7U3RyaW5nfSAgICAgICBpZHAgaWRwIGRvbWFpbiBvZiB0aGUgaWRlbnRpdHkgdG8gYmUgZGlzY292ZXJlZFxuICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICBpZGVudGl0eVxuICAqL1xuXG4gIGRpc2NvdmVySWRlbnRpdHlQZXJJZFAoaWRwKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgbGV0IG1zZyA9IHtcbiAgICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiB0aGlzLm93bmVyLCB0bzogX3RoaXMucnVudGltZVVSTCArICcvaWRtJywgYm9keTogeyByZXNvdXJjZTogaWRwLCBjcml0ZXJpYTogJ2lkcCd9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XG5cbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVwbHkuYm9keS5jb2RlICsgJyAnICsgcmVwbHkuYm9keS5kZXNjKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSWRlbnRpdHlNYW5hZ2VyO1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1JlZ2lzdHJhdGlvblN0YXR1cycpO1xuXG5pbXBvcnQgeyBkaXZpZGVVUkwgfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbi8qKlxuKiBUaGUgUmVnaXN0cmF0aW9uU3RhdHVzIGxpYiBhbGxvd3MgdG8gbW9uaXRvciByZWdpc3RyYXRpb24gc3RhdHVzIG9mIGFuIEh5cGVydHkgb3IgRGF0YSBPYmplY3RcbipcbiovXG5jbGFzcyBSZWdpc3RyYXRpb25TdGF0dXMge1xuXG4gIC8qKlxuICAqIEBwYXJhbSB7VVJMfSB1cmwgVVJMIGFkZHJlc3Mgb2YgdGhlIGVudGl0eSB0byBiZSBtb25pdG9yZWRcbiAgKiBAcGFyYW0ge1VSTH0gcnVudGltZVVSTCB0aGUgY3VycmVudCBVUkwgb2YgdGhlIFJ1bnRpbWUgSW5zdGFuY2UgdXNlZFxuICAqIEBwYXJhbSB7SHlwZXJ0eVVSTH0gb3duZXIgdGhlIFVSTCBvZiB0aGUgSHlwZXJ0eSBpbnN0YW5jZSB0aGF0IGlzIHVzaW5nIHRoaXMgbGliXG4gICogQHBhcmFtIHtNaW5pQnVzfSBvd25lciB0aGUgVVJMIG9mIHRoZSBIeXBlcnR5IGluc3RhbmNlIHRoYXQgaXMgdXNpbmcgdGhpcyBsaWJcbiAgKlxuICAqL1xuXG4gIGNvbnN0cnVjdG9yKHVybCwgcnVudGltZVVSTCwgb3duZXIsIG1zZ0J1cykge1xuICAgIHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMID0gdXJsO1xuICAgIHRoaXMuX3J1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xuICAgIHRoaXMuX2RvbWFpbiA9IGRpdmlkZVVSTChydW50aW1lVVJMKS5kb21haW47XG4gICAgdGhpcy5fZGlzY292ZXJlZE9iamVjdFVSTCA9IG93bmVyO1xuICAgIHRoaXMuX21lc3NhZ2VCdXMgPSBtc2dCdXM7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uU2V0ID0gZmFsc2U7XG4gICAgdGhpcy5fc3Vic2NyaWJlcnMgPSB7XG4gICAgICBsaXZlOiB7fSxcbiAgICAgIGRpc2Nvbm5lY3RlZDoge31cbiAgICB9O1xuICB9XG5cblxuICBvbkxpdmUoc3Vic2NyaWJlciwgY2FsbGJhY2spIHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGlmICghdGhpcy5fc3Vic2NyaXB0aW9uU2V0KSB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZSgpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9zdWJzY3JpYmVycy5saXZlW3N1YnNjcmliZXJdID0gY2FsbGJhY2s7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycikgPT4gcmVqZWN0KGVycikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlcnMubGl2ZVtzdWJzY3JpYmVyXSA9IGNhbGxiYWNrO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbkRpc2Nvbm5lY3RlZChzdWJzY3JpYmVyLCBjYWxsYmFjaykge1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgaWYgKCF0aGlzLl9zdWJzY3JpcHRpb25TZXQpIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKClcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX3N1YnNjcmliZXJzLmRpc2Nvbm5lY3RlZFtzdWJzY3JpYmVyXSA9IGNhbGxiYWNrO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHJlamVjdChlcnIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmliZXJzLmRpc2Nvbm5lY3RlZFtzdWJzY3JpYmVyXSA9IGNhbGxiYWNrO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfc3Vic2NyaWJlKCkge1xuXG4gICAgY29uc3QgbXNnID0ge1xuICAgICAgdHlwZTogJ3N1YnNjcmliZScsXG4gICAgICBmcm9tOiB0aGlzLl9kaXNjb3ZlcmVkT2JqZWN0VVJMLFxuICAgICAgdG86IHRoaXMuX3J1bnRpbWVVUkwgKyAnL3N1YnNjcmlwdGlvbnMnLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLl9yZWdpc3RyeU9iamVjdFVSTCArICcvcmVnaXN0cmF0aW9uJ11cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuICAgICAgICBsb2cubG9nKGBbRGlzY292ZXJlZE9iamVjdC5zdWJzY3JpYmVdICR7dGhpcy5fcmVnaXN0cnlPYmplY3RVUkx9IHJjdmVkIHJlcGx5IGAsIHJlcGx5KTtcblxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcbiAgICAgICAgICB0aGlzLl9nZW5lcmF0ZUxpc3RlbmVyKHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMICsgJy9yZWdpc3RyYXRpb24nKTtcbiAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25TZXQgPSB0cnVlO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1YnNjcmliaW5nICcsIHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMKTtcbiAgICAgICAgICByZWplY3QoJ0Vycm9yIHN1YnNjcmliaW5nICcgKyB0aGlzLl9yZWdpc3RyeU9iamVjdFVSTCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX2dlbmVyYXRlTGlzdGVuZXIobm90aWZpY2F0aW9uVVJMKSB7XG5cbiAgICB0aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKG5vdGlmaWNhdGlvblVSTCwgKG1zZykgPT4ge1xuICAgICAgbG9nLmxvZyhgW0Rpc2NvdmVyZWRPYmplY3Qubm90aWZpY2F0aW9uXSAke3RoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMfTogYCwgbXNnKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NOb3RpZmljYXRpb24obXNnKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9wcm9jZXNzTm90aWZpY2F0aW9uKG1zZykge1xuICAgIGNvbnN0IHN0YXR1cyA9IG1zZy5ib2R5LnZhbHVlO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgIC8vIEhhY2sgdG8gZ2l2ZSB0aW1lIGZvciBvbkxpdmUgSHlwZXJ0aWVzIHRvIGdldCByZWFkeS4gVG8gYmUgcmVtb3ZlZCB3aGVuIEh5cGVydHkgU3RhdGUgbWFjaGFpbmUgaXMgaW1wbGVtZW50ZWRcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3N1YnNjcmliZXJzW3N0YXR1c10pLmZvckVhY2goXG4gICAgICAgIHN1YnNjcmliZXIgPT4gdGhpcy5fc3Vic2NyaWJlcnNbc3RhdHVzXVtzdWJzY3JpYmVyXSgpXG4gICAgICApO1xuXG4gICAgfSwgNTAwMCk7XG5cbiAgfVxuXG5cbiAgX3Vuc3Vic2NyaWJlKCkge1xuXG4gICAgY29uc3QgbXNnID0ge1xuICAgICAgdHlwZTogJ3Vuc3Vic2NyaWJlJyxcbiAgICAgIGZyb206IHRoaXMuX2Rpc2NvdmVyZWRPYmplY3RVUkwsXG4gICAgICB0bzogdGhpcy5fcnVudGltZVVSTCArICcvc3Vic2NyaXB0aW9ucycsXG4gICAgICBib2R5OiB7XG4gICAgICAgIHJlc291cmNlOiB0aGlzLl9yZWdpc3RyeU9iamVjdFVSTCArICcvcmVnaXN0cmF0aW9uJ1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XG4gICAgICAgIGxvZy5sb2coYFtEaXNjb3ZlcmVkT2JqZWN0LnVuc3Vic2NyaWJlXSAke3RoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMfSByY3ZlZCByZXBseSBgLCByZXBseSk7XG5cbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy5lcnJvcignRXJyb3IgdW5zdWJzY3JpYmluZyAnLCB0aGlzLl9yZWdpc3RyeU9iamVjdFVSTCk7XG4gICAgICAgICAgcmVqZWN0KCdFcnJvciB1bnN1YnNjcmliaW5nICcgKyB0aGlzLl9yZWdpc3RyeU9iamVjdFVSTCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgdW5zdWJzY3JpYmVMaXZlKHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBpZiAoc3Vic2NyaWJlciBpbiB0aGlzLl9zdWJzY3JpYmVycy5saXZlKSB7XG5cbiAgICAgICAgICAvL1RPRE86IHVuc3Vic2NyaWJlIG91dHNpZGUgdGhpcyBjb25kaXRpb25cbiAgICAgICAgZGVsZXRlIHRoaXMuX3N1YnNjcmliZXJzLmxpdmVbc3Vic2NyaWJlcl07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9hcmVTdWJzY3JpcHRpb25zRW1wdHkoKSkge1xuICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiByZXNvbHZlKCkpXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4gcmVqZWN0KGVycikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfVxuXG4gICAgICAvKiAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoYCR7c3Vic2NyaWJlcn0gZG9lc24ndCBzdWJzY3JpYmUgb25MaXZlIGZvciAke3RoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMfWApO1xuICAgICAgICB9Ki9cbiAgICB9KTtcbiAgfVxuXG4gIHVuc3Vic2NyaWJlRGlzY29ubmVjdGVkKHN1YnNjcmliZXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBpZiAoc3Vic2NyaWJlciBpbiB0aGlzLl9zdWJzY3JpYmVycy5kaXNjb25uZWN0ZWQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX3N1YnNjcmliZXJzLmRpc2Nvbm5lY3RlZFtzdWJzY3JpYmVyXTtcblxuICAgICAgICBpZiAodGhpcy5fYXJlU3Vic2NyaXB0aW9uc0VtcHR5KCkpIHtcbiAgICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpXG4gICAgICAgICAgLnRoZW4oKCkgPT4gcmVzb2x2ZSgpKVxuICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiByZWplY3QoZXJyKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoYCR7c3Vic2NyaWJlcn0gZG9lc24ndCBzdWJzY3JpYmUgb25EaXNjb25uZWN0ZWQgZm9yICR7dGhpcy5fcmVnaXN0cnlPYmplY3RVUkx9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBfYXJlU3Vic2NyaXB0aW9uc0VtcHR5KCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9zdWJzY3JpYmVycy5saXZlKS5sZW5ndGggPT09IDBcbiAgICAgICYmIE9iamVjdC5rZXlzKHRoaXMuX3N1YnNjcmliZXJzLmRpc2Nvbm5lY3RlZCkubGVuZ3RoID09PSAwO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVnaXN0cmF0aW9uU3RhdHVzO1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vL2ltcG9ydCB7ZGl2aWRlVVJMLCBjb252ZXJ0VG9Vc2VyVVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgUmVnaXN0cmF0aW9uU3RhdHVzIGZyb20gJy4vUmVnaXN0cmF0aW9uU3RhdHVzJztcblxuLyoqXG4qIERpc2NvdmVyZWQgT2JqZWN0IGludGVyZmFjZVxuKi9cbmNsYXNzIERpc2NvdmVyZWRPYmplY3QgZXh0ZW5kcyBSZWdpc3RyYXRpb25TdGF0dXMge1xuXG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgY29uc3RydWN0b3IoZGF0YSwgcnVudGltZVVSTCwgZGlzY292ZXJ5VVJMLCBtc2dCdXMsIGRpc2NvdmVyeSkge1xuICAgIHN1cGVyKGRhdGEuaHlwZXJ0eUlEIHx8IGRhdGEudXJsLCBydW50aW1lVVJMLCBkaXNjb3ZlcnlVUkwsIG1zZ0J1cyk7XG5cbiAgICB0aGlzLl9kYXRhID0gZGF0YTtcbiAgICB0aGlzLl9kaXNjb3ZlcnkgPSBkaXNjb3Zlcnk7XG4gIH1cblxuXG5cblxuICAvKipcbiAgKiBmdW5jdGlvbiB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBEaXNjb3ZlcmVkT2JqZWN0LlxuICAqIERlcGVuZGluZyBvbiBleGlzdGluZyBzdWJzY3JpYmVycyBpdCBtYXkgdHJpZ2dlciBvbkxpdmUgb3Igb25EaXNjb25uZWN0ZWQgZXZlbnRzLlxuICAqXG4gICovXG5cbiAgY2hlY2soKSB7XG4gICAgLy8gcXVlcnkgRFIgZm9yIHRoZSBzdGF0dXMgYW5kIGNhbGwgcHJvY2Vzc05vdGlmaWNhdGlvbiB3aXRoIG1zZyByZWNlaXZlZFxuXG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgIGJvZHk6IHt9XG4gICAgfTtcblxuICAgIGlmIChfdGhpcy5fZGlzY292ZXJlZE9iamVjdFVSTC5zdGFydHNXaXRoKCdoeXBlcnR5Oi8vJykgKSB7XG4gICAgICBfdGhpcy5fZGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0eVBlclVSTChfdGhpcy5fZGlzY292ZXJlZE9iamVjdFVSTCkudGhlbigocmVnaXN0cmF0aW9uKT0+e1xuICAgICAgICBtZXNzYWdlLmJvZHkuc3RhdHVzID0gcmVnaXN0cmF0aW9uLnN0YXR1cztcbiAgICAgICAgX3RoaXMuX3Byb2Nlc3NOb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMuX2Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyVVJMKF90aGlzLl9kaXNjb3ZlcmVkT2JqZWN0VVJMKS50aGVuKChyZWdpc3RyYXRpb24pPT57XG4gICAgICAgIG1lc3NhZ2UuYm9keS5zdGF0dXMgPSByZWdpc3RyYXRpb24uc3RhdHVzO1xuICAgICAgICBfdGhpcy5fcHJvY2Vzc05vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG5cblxufVxuXG5leHBvcnQgZGVmYXVsdCBEaXNjb3ZlcmVkT2JqZWN0O1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0Rpc2NvdmVyeScpO1xuXG5pbXBvcnQge2RpdmlkZVVSTCwgY29udmVydFRvVXNlclVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IERpc2NvdmVyZWRPYmplY3QgZnJvbSAnLi9EaXNjb3ZlcmVkT2JqZWN0JztcblxuLyoqXG4qIENvcmUgRGlzY292ZXJ5IGludGVyZmFjZVxuKiBDbGFzcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gc2VhcmNoIGZvciBoeXBlcnRpZXMgYW5kIERhdGFPYmplY3RzIHVzaW5nIHRoZSBtZXNzYWdlIGJ1c1xuKi9cbmNsYXNzIERpc2NvdmVyeSB7XG5cbiAgLyoqXG4gICogVG8gaW5pdGlhbGlzZSB0aGUgSHlwZXJ0eURpc2NvdmVyLCB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIHN1cHBvcnQgZm9yIGh5cGVydGllcyB0b1xuICAqIHF1ZXJ5IHVzZXJzIHJlZ2lzdGVyZWQgaW4gb3V0c2lkZSB0aGUgaW50ZXJuYWwgY29yZS5cbiAgKiBAcGFyYW0gIHtNZXNzYWdlQnVzfSAgICAgICAgICBtc2didXMgICAgICAgICAgICAgICAgbXNnYnVzXG4gICogQHBhcmFtICB7UnVudGltZVVSTH0gICAgICAgICAgcnVudGltZVVSTCAgICAgICAgICAgIHJ1bnRpbWVVUkxcbiAgKi9cbiAgY29uc3RydWN0b3IoaHlwZXJ0eVVSTCwgcnVudGltZVVSTCwgbXNnQnVzKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5tZXNzYWdlQnVzID0gbXNnQnVzO1xuICAgIF90aGlzLnJ1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xuXG4gICAgX3RoaXMuZG9tYWluID0gZGl2aWRlVVJMKGh5cGVydHlVUkwpLmRvbWFpbjtcbiAgICBfdGhpcy5kaXNjb3ZlcnlVUkwgPSBoeXBlcnR5VVJMO1xuICB9XG5cbiAgLyoqXG4gICogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgdXNlciBpZGVudGlmaWVyIChlZyBlbWFpbCwgbmFtZSAuLi4pXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlcklkZW50aWZpZXJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqL1xuICBfaXNMZWdhY3lVc2VyKHVzZXJJZGVudGlmaWVyKSB7XG4gICAgaWYgKHVzZXJJZGVudGlmaWVyLmluY2x1ZGVzKCc6JykgJiYgIXVzZXJJZGVudGlmaWVyLmluY2x1ZGVzKCd1c2VyOi8vJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgdXNlciBpZGVudGlmaWVyIChlZyBlbWFpbCwgbmFtZSAuLi4pXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlcklkZW50aWZpZXJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqL1xuICBkaXNjb3Zlckh5cGVydGllc1BlclVzZXJQcm9maWxlRGF0YSh1c2VySWRlbnRpZmllciwgc2NoZW1hLCByZXNvdXJjZXMpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBmaWx0ZXJlZEh5cGVydGllcyA9IFtdO1xuXG4gICAgbGV0IG1zZyA9IHtcbiAgICAgIHR5cGU6ICdyZWFkJyxcbiAgICAgIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCxcbiAgICAgIHRvOiBfdGhpcy5ydW50aW1lVVJMICsgJy9kaXNjb3ZlcnkvJyxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgcmVzb3VyY2U6ICcvaHlwZXJ0eS91c2VycHJvZmlsZS8nICsgdXNlcklkZW50aWZpZXIsXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzY2hlbWEgfHwgcmVzb3VyY2VzKSB7XG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcbiAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsXG4gICAgICAgIGRhdGFTY2hlbWVzOiBzY2hlbWFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBpZiAoIV90aGlzLl9pc0xlZ2FjeVVzZXIodXNlcklkZW50aWZpZXIpKSB7Ly8gdG9kbzogdG8gcmVvbXZlIHdoZW4gZGlzY292ZXJ5IG9mIGxlZ2NheSB1c2VycyBhcmUgc3VwcG9ydGVkXG5cbiAgICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuXG4gICAgICAgICAgaWYocmVwbHkuYm9keS5jb2RlID09PSAyMDApe1xuICAgICAgICAgICAgcmVwbHkuYm9keS52YWx1ZS5tYXAoZnVuY3Rpb24oaHlwZXJ0eSkge1xuICAgICAgICAgICAgICAgaWYoaHlwZXJ0eS5oeXBlcnR5SUQgIT0gX3RoaXMuZGlzY292ZXJ5VVJMKVxuICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSHlwZXJ0aWVzLnB1c2goaHlwZXJ0eSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmKGZpbHRlcmVkSHlwZXJ0aWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgbG9nLmxvZyhcIltEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGFdIFJlcGx5IGxvZzogXCIsZmlsdGVyZWRIeXBlcnRpZXMpO1xuICAgICAgICAgICAgICByZXNvbHZlKGZpbHRlcmVkSHlwZXJ0aWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGFdIEVycm9yIFJlcGx5IGZvciBcIiArIHVzZXJJZGVudGlmaWVyICsgXCIgUmVhc29uOiBcIiwgcmVwbHkuYm9keS5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShbe2h5cGVydHlJRDogdXNlcklkZW50aWZpZXIsIHN0YXR1czogJ2xpdmUnfV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgdXNlciBpZGVudGlmaWVyIChlZyBlbWFpbCwgbmFtZSAuLi4pXG4gICogcmV0dXJucyBEaXNjb3ZlcmVkT2JqZWN0XG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlcklkZW50aWZpZXJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqL1xuICBkaXNjb3Zlckh5cGVydGllc1BlclVzZXJQcm9maWxlRGF0YURPKHVzZXJJZGVudGlmaWVyLCBzY2hlbWEsIHJlc291cmNlcykge1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGEoLi4uYXJndW1lbnRzKVxuICAgICAgLnRoZW4oaHlwZXJ0aWVzID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLl9jb252ZXJ0VG9EaXNjb3ZlcmVkT2JqZWN0KGh5cGVydGllcykpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgRGF0YU9iamVjdHMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgdXNlciBpZGVudGlmaWVyIChlZyBlbWFpbCwgbmFtZSAuLi4pXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlcklkZW50aWZpZXJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqL1xuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyVXNlclByb2ZpbGVEYXRhKHVzZXJJZGVudGlmaWVyLCBzY2hlbWEsIHJlc291cmNlcykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgbXNnID0ge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogJy9kYXRhT2JqZWN0L3VzZXJwcm9maWxlLycgKyB1c2VySWRlbnRpZmllcixcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYoc2NoZW1hIHx8IHJlc291cmNlcykge1xuICAgICAgbXNnLmJvZHlbJ2NyaXRlcmlhJ10gPSB7XG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLFxuICAgICAgICBkYXRhU2NoZW1lczogc2NoZW1hXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgaWYgKCFfdGhpcy5faXNMZWdhY3lVc2VyKHVzZXJJZGVudGlmaWVyKSkgey8vIHRvZG86IHRvIHJlb212ZSB3aGVuIGRpc2NvdmVyeSBvZiBsZWdjYXkgdXNlcnMgYXJlIHN1cHBvcnRlZFxuXG4gICAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcblxuICAgICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKXtcbiAgICAgICAgICAgIGxvZy5sb2coXCJSZXBseSBsb2c6IFwiLHJlcGx5LmJvZHkudmFsdWUpO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0c1BlclVzZXJQcm9maWxlRGF0YV0gRXJyb3IgUmVwbHkgZm9yIFwiICsgdXNlcklkZW50aWZpZXIgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoW3toeXBlcnR5SUQ6IHVzZXJJZGVudGlmaWVyLCBzdGF0dXM6ICdsaXZlJ31dKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBkYXRhT2JqZWN0IHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcbiAgKiByZXR1cm5zIGRpc2NvdmVyZWRPYmplY3QuXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZ3VpZFVSTCAgICAgICAgICAgICAgICBndWlkIFVSTCBlLmcgdXNlci1ndWlkOi8vPHVuaXF1ZS11c2VyLWlkZW50aWZpZXI+XG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKSAgICAgZG9tYWluIG9mIHRoZSByZWdpc3RyeSB0byBzZWFyY2hcbiAgKi9cbiAgZGlzY292ZXJEYXRhT2JqZWN0c1BlclVzZXJQcm9maWxlRGF0YURPKGd1aWRVUkwsIHNjaGVtYSwgcmVzb3VyY2VzKSB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RzUGVyVXNlclByb2ZpbGVEYXRhKC4uLmFyZ3VtZW50cylcbiAgICAgICAgLnRoZW4ocmVnaXN0cnlPYmplY3RzID0+IHJlc29sdmUodGhpcy5fY29udmVydFRvRGlzY292ZXJlZE9iamVjdChyZWdpc3RyeU9iamVjdHMpKSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgR1VJRFxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGd1aWRVUkwgICAgICAgICAgICAgICAgZ3VpZCBVUkwgZS5nIHVzZXItZ3VpZDovLzx1bmlxdWUtdXNlci1pZGVudGlmaWVyPlxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXG4gICovXG4gIGRpc2NvdmVySHlwZXJ0aWVzUGVyR1VJRChndWlkVVJMLCBzY2hlbWEsIHJlc291cmNlcykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGZpbHRlcmVkSHlwZXJ0aWVzID0gW107XG5cbiAgICBsZXQgbXNnID0ge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogJy9oeXBlcnR5L2d1aWQvJyArIGd1aWRVUkwsXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmKHNjaGVtYSB8fCByZXNvdXJjZXMpIHtcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xuICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcbiAgICAgICAgZGF0YVNjaGVtZXM6IHNjaGVtYVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcblxuICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCl7XG4gICAgICAgICAgcmVwbHkuYm9keS52YWx1ZS5tYXAoZnVuY3Rpb24oaHlwZXJ0eSkge1xuICAgICAgICAgICAgIGlmKGh5cGVydHkuaHlwZXJ0eUlEICE9IF90aGlzLmRpc2NvdmVyeVVSTClcbiAgICAgICAgICAgICAgICAgZmlsdGVyZWRIeXBlcnRpZXMucHVzaChoeXBlcnR5KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZihmaWx0ZXJlZEh5cGVydGllcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZWplY3QoJ05vIEh5cGVydHkgd2FzIGZvdW5kJyk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2cubG9nKFwiUmVwbHkgbG9nOiBcIixmaWx0ZXJlZEh5cGVydGllcyk7XG4gICAgICAgICAgICByZXNvbHZlKGZpbHRlcmVkSHlwZXJ0aWVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJbRGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0aWVzUGVyR1VJRF0gRXJyb3IgUmVwbHkgZm9yIFwiICsgZ3VpZFVSTCArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xuICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIEdVSURcbiAgKiByZXR1cm5zIERpc2NvdmVyZWRPYmplY3RcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBndWlkVVJMICAgICAgICAgICAgICAgIGd1aWQgVVJMIGUuZyB1c2VyLWd1aWQ6Ly88dW5pcXVlLXVzZXItaWRlbnRpZmllcj5cbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqL1xuICBkaXNjb3Zlckh5cGVydGllc1BlckdVSURETyhndWlkVVJMLCBzY2hlbWEsIHJlc291cmNlcykge1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGlzY292ZXJIeXBlcnRpZXNQZXJHVUlEKC4uLmFyZ3VtZW50cylcbiAgICAgIC50aGVuKGh5cGVydGllcyA9PiB7XG4gICAgICAgIHJlc29sdmUodGhpcy5fY29udmVydFRvRGlzY292ZXJlZE9iamVjdChoeXBlcnRpZXMpKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBBZHZhbmNlZCBTZWFyY2ggZm9yIERhdGFPYmplY3RzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIEdVSURcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBndWlkVVJMICAgICAgICAgICAgICAgIGd1aWQgVVJMIGUuZyB1c2VyLWd1aWQ6Ly88dW5pcXVlLXVzZXItaWRlbnRpZmllcj5cbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxuICAqL1xuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyR1VJRChndWlkVVJMLCBzY2hlbWEsIHJlc291cmNlcykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgbXNnID0ge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogJy9kYXRhT2JqZWN0L2d1aWQvJyArIGd1aWRVUkwsXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmKHNjaGVtYSB8fCByZXNvdXJjZXMpIHtcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xuICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcbiAgICAgICAgZGF0YVNjaGVtZXM6IHNjaGVtYVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcblxuICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCl7XG4gICAgICAgICAgbG9nLmxvZyhcIlJlcGx5IGxvZzogXCIscmVwbHkuYm9keS52YWx1ZSk7XG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0c1BlckdVSURdIEVycm9yIFJlcGx5IGZvciBcIiArIGd1aWRVUkwgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcbiAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IGRhdGFPYmplY3QgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxuICAqIHJldHVybnMgZGlzY292ZXJlZE9iamVjdC5cbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBndWlkVVJMICAgICAgICAgICAgICAgIGd1aWQgVVJMIGUuZyB1c2VyLWd1aWQ6Ly88dW5pcXVlLXVzZXItaWRlbnRpZmllcj5cbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxuICAqL1xuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyR1VJRERPKGd1aWRVUkwsIHNjaGVtYSwgcmVzb3VyY2VzKSB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RzUGVyR1VJRCguLi5hcmd1bWVudHMpXG4gICAgICAgIC50aGVuKHJlZ2lzdHJ5T2JqZWN0cyA9PiByZXNvbHZlKHRoaXMuX2NvbnZlcnRUb0Rpc2NvdmVyZWRPYmplY3QocmVnaXN0cnlPYmplY3RzKSkpXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlZCBTZWFyY2ggZm9yIEh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeVxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXIgICAgICAgICAgICAgICAgICB1c2VyIGlkZW50aWZpZXIsIGVpdGhlciBpbiB1cmwgb3IgZW1haWwgZm9ybWF0XG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKSAgICAgZG9tYWluIG9mIHRoZSByZWdpc3RyeSB0byBzZWFyY2hcbiAgKi9cbiAgZGlzY292ZXJIeXBlcnRpZXModXNlciwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcbiAgICBsZXQgZmlsdGVyZWRIeXBlcnRpZXMgPSBbXTtcblxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcblxuICAgIGxldCBtc2cgPSB7XG4gICAgICB0eXBlOiAncmVhZCcsXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXG4gICAgICBib2R5OiB7XG4gICAgICAgIHJlc291cmNlOiAnL2h5cGVydHkvdXNlci8nICsgdXNlcixcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYoc2NoZW1hIHx8IHJlc291cmNlcykge1xuICAgICAgbXNnLmJvZHlbJ2NyaXRlcmlhJ10gPSB7XG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLFxuICAgICAgICBkYXRhU2NoZW1lczogc2NoZW1hLFxuICAgICAgICBkb21haW46IGFjdGl2ZURvbWFpblxuICAgICAgfTtcbiAgICB9ZWxzZSB7XG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcbiAgICAgICAgZG9tYWluOiBhY3RpdmVEb21haW5cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGlmICghX3RoaXMuX2lzTGVnYWN5VXNlcih1c2VyKSkgey8vIHRvZG86IHRvIHJlb212ZSB3aGVuIGRpc2NvdmVyeSBvZiBsZWdjYXkgdXNlcnMgYXJlIHN1cHBvcnRlZFxuXG4gICAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcblxuICAgICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwIHx8IHJlcGx5LmJvZHkuY29kZSA9PT0gNTAwKXtcbiAgICAgICAgICAgIHJlcGx5LmJvZHkudmFsdWUubWFwKGZ1bmN0aW9uKGh5cGVydHkpIHtcbiAgICAgICAgICAgICAgIGlmKGh5cGVydHkuaHlwZXJ0eUlEICE9IF90aGlzLmRpc2NvdmVyeVVSTClcbiAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEh5cGVydGllcy5wdXNoKGh5cGVydHkpO1xuICAgICAgICAgICAgfSk7XG4vKiAgICAgICAgICAgIGlmKGZpbHRlcmVkSHlwZXJ0aWVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgcmVqZWN0KCdObyBIeXBlcnR5IHdhcyBmb3VuZCcpO1xuICAgICAgICAgICAgZWxzZSB7Ki9cbiAgICAgICAgICAgICAgbG9nLmxvZyhcIltEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNdIFJlcGx5IDogXCIsZmlsdGVyZWRIeXBlcnRpZXMpO1xuICAgICAgICAgICAgICByZXNvbHZlKGZpbHRlcmVkSHlwZXJ0aWVzKTtcbi8vICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllc10gRXJyb3IgUmVwbHkgZm9yIFwiICsgdXNlciArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgcmVzb2x2ZShmaWx0ZXJlZEh5cGVydGllcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoW3toeXBlcnR5SUQ6IHVzZXIsIHN0YXR1czogJ2xpdmUnfV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LFxuICAqcmV0dXJucyBEaXNjb3ZlcmVkT2JqZWN0XG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlciAgICAgICAgICAgICAgICAgIHVzZXIgaWRlbnRpZmllciwgZWl0aGVyIGluIHVybCBvciBlbWFpbCBmb3JtYXRcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxuICAqL1xuICBkaXNjb3Zlckh5cGVydGllc0RPKHVzZXIsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmRpc2NvdmVySHlwZXJ0aWVzKC4uLmFyZ3VtZW50cylcbiAgICAgIC50aGVuKGh5cGVydGllcyA9PiB7XG4gICAgICAgIHJlc29sdmUodGhpcy5fY29udmVydFRvRGlzY292ZXJlZE9iamVjdChoeXBlcnRpZXMpKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQWR2YW5jZWQgU2VhcmNoIGZvciBEYXRhT2JqZWN0cyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeVxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXIgICAgICAgICAgICAgICAgICB1c2VyIGlkZW50aWZpZXIsIGVpdGhlciBpbiB1cmwgb3IgZW1haWwgZm9ybWF0XG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgZGF0YU9iamVjdHMgcmVzb3VyY2VzXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXG4gICovXG4gIGRpc2NvdmVyRGF0YU9iamVjdHModXNlciwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcblxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcblxuICAgIGxldCBtc2cgPSB7XG4gICAgICB0eXBlOiAncmVhZCcsXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXG4gICAgICBib2R5OiB7XG4gICAgICAgIHJlc291cmNlOiAnL2RhdGFPYmplY3QvdXNlci8nICsgdXNlcixcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYoc2NoZW1hIHx8IHJlc291cmNlcykge1xuICAgICAgbXNnLmJvZHlbJ2NyaXRlcmlhJ10gPSB7XG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLFxuICAgICAgICBkYXRhU2NoZW1lczogc2NoZW1hLFxuICAgICAgICBkb21haW46IGFjdGl2ZURvbWFpblxuICAgICAgfTtcbiAgICB9ZWxzZSB7XG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcbiAgICAgICAgZG9tYWluOiBhY3RpdmVEb21haW5cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcblxuICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCl7XG4gICAgICAgICAgbG9nLmxvZyhcIlJlcGx5IFZhbHVlIExvZzogXCIscmVwbHkuYm9keS52YWx1ZSk7XG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0c10gRXJyb3IgUmVwbHkgZm9yIFwiICsgdXNlciArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xuICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXG4gICogcmV0dXJucyBkaXNjb3ZlcmVkT2JqZWN0LlxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXIgICAgICAgICAgICAgICAgICB1c2VyIGlkZW50aWZpZXIsIGVpdGhlciBpbiB1cmwgb3IgZW1haWwgZm9ybWF0XG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgZGF0YU9iamVjdHMgcmVzb3VyY2VzXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXG4gICovXG4gIGRpc2NvdmVyRGF0YU9iamVjdHNETyh1c2VyLCBzY2hlbWEsIHJlc291cmNlcywgZG9tYWluKSB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RzKC4uLmFyZ3VtZW50cylcbiAgICAgICAgLnRoZW4ocmVnaXN0cnlPYmplY3RzID0+IHJlc29sdmUodGhpcy5fY29udmVydFRvRGlzY292ZXJlZE9iamVjdChyZWdpc3RyeU9iamVjdHMpKSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBoeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxuICAqIHJldHVybiB0aGUgaHlwZXJ0eSBpbmZvcm1hdGlvbiwgaWYgZm91bmQuXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgdXJsICBoeXBlcnR5IFVSTFxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKVxuICAqL1xuICBkaXNjb3Zlckh5cGVydHlQZXJVUkwodXJsLCBkb21haW4pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBhY3RpdmVEb21haW47XG5cbiAgICBhY3RpdmVEb21haW4gPSAoIWRvbWFpbikgPyBfdGhpcy5kb21haW4gOiBkb21haW47XG5cbiAgICBsZXQgbXNnID0ge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogJy9oeXBlcnR5L3VybC8nICsgdXJsLFxuICAgICAgICBjcml0ZXJpYToge1xuICAgICAgICAgIGRvbWFpbjogYWN0aXZlRG9tYWluXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XG5cbiAgICAgICAgaWYocmVwbHkuYm9keS5jb2RlID09PSAyMDApe1xuICAgICAgICAgIGxvZy5sb2coXCJSZXBseSBWYWx1ZSBMb2c6IFwiLHJlcGx5LmJvZHkudmFsdWUpO1xuICAgICAgICAgIHJlc29sdmUocmVwbHkuYm9keS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbG9nLndhcm4oXCJbRGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0eVBlclVSTF0gRXJyb3IgUmVwbHkgZm9yIFwiICsgdXJsICsgXCIgUmVhc29uOiBcIiwgcmVwbHkuYm9keS5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBoeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxuICAqIHJldHVybnMgZGlzY292ZXJlZE9iamVjdC5cbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICB1cmwgIGh5cGVydHkgVVJMXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXG4gICovXG4gIGRpc2NvdmVySHlwZXJ0eVBlclVSTERPKHVybCwgZG9tYWluKSB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kaXNjb3Zlckh5cGVydHlQZXJVUkwoLi4uYXJndW1lbnRzKVxuICAgICAgICAudGhlbihoeXBlcnR5ID0+IHJlc29sdmUobmV3IERpc2NvdmVyZWRPYmplY3QoaHlwZXJ0eSwgdGhpcy5ydW50aW1lVVJMLCB0aGlzLmRpc2NvdmVyeVVSTCwgdGhpcy5tZXNzYWdlQnVzLCB0aGlzKSkpXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXG4gICogcmV0dXJuIHRoZSBkYXRhT2JqZWN0IGluZm9ybWF0aW9uLCBpZiBmb3VuZC5cbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICB1cmwgIGRhdGFPYmplY3QgVVJMXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXG4gICovXG4gIGRpc2NvdmVyRGF0YU9iamVjdFBlclVSTCh1cmwsIGRvbWFpbikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcblxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcblxuICAgIGxldCBtc2cgPSB7XG4gICAgICB0eXBlOiAncmVhZCcsXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXG4gICAgICBib2R5OiB7XG4gICAgICAgIHJlc291cmNlOiAnL2RhdGFPYmplY3QvdXJsLycgKyB1cmwsXG4gICAgICAgIGNyaXRlcmlhOiB7XG4gICAgICAgICAgZG9tYWluOiBhY3RpdmVEb21haW5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcblxuICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCl7XG4gICAgICAgICAgbG9nLmxvZyhcIlJlcGx5IFZhbHVlIExvZzogXCIscmVwbHkuYm9keS52YWx1ZSk7XG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0UGVyVVJMXSBFcnJvciBSZXBseSBmb3IgXCIgKyB1cmwgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcbiAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IGRhdGFPYmplY3QgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxuICAqIHJldHVybnMgZGlzY292ZXJlZE9iamVjdC5cbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICB1cmwgIGRhdGFPYmplY3QgVVJMXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXG4gICovXG4gIGRpc2NvdmVyRGF0YU9iamVjdFBlclVSTERPKHVybCwgZG9tYWluKSB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RQZXJVUkwoLi4uYXJndW1lbnRzKVxuICAgICAgICAudGhlbihyZWdpc3RyeU9iamVjdCA9PiByZXNvbHZlKG5ldyBEaXNjb3ZlcmVkT2JqZWN0KHJlZ2lzdHJ5T2JqZWN0LCB0aGlzLnJ1bnRpbWVVUkwsIHRoaXMuZGlzY292ZXJ5VVJMLCB0aGlzLm1lc3NhZ2VCdXMsIHRoaXMpKSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBhbiBkYXRhT2JqZWN0cyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSB3aXRoIGEgZ2l2ZW4gbmFtZSwgYW5kXG4gICogcmV0dXJuIHRoZSBkYXRhT2JqZWN0cyBpbmZvcm1hdGlvbiwgaWYgZm91bmQuXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgbmFtZSAgZGF0YU9iamVjdCBVUkxcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdHMgc2NoZW1hc1xuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBkYXRhT2JqZWN0cyByZXNvdXJjZXNcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcbiAgKi9cbiAgZGlzY292ZXJEYXRhT2JqZWN0c1Blck5hbWUobmFtZSwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcblxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcblxuICAgIGxldCBtc2cgPSB7XG4gICAgICB0eXBlOiAncmVhZCcsXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXG4gICAgICBib2R5OiB7XG4gICAgICAgIHJlc291cmNlOiAnL2RhdGFPYmplY3QvbmFtZS8nICsgbmFtZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZihzY2hlbWEgfHwgcmVzb3VyY2VzKSB7XG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcbiAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsXG4gICAgICAgIGRhdGFTY2hlbWVzOiBzY2hlbWEsXG4gICAgICAgIGRvbWFpbjogYWN0aXZlRG9tYWluXG4gICAgICB9O1xuICAgIH1lbHNlIHtcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xuICAgICAgICBkb21haW46IGFjdGl2ZURvbWFpblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuXG4gICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKXtcbiAgICAgICAgICBsb2cubG9nKFwiUmVwbHkgVmFsdWUgTG9nOiBcIixyZXBseS5ib2R5LnZhbHVlKTtcbiAgICAgICAgICByZXNvbHZlKHJlcGx5LmJvZHkudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyTmFtZV0gRXJyb3IgUmVwbHkgZm9yIFwiICsgbmFtZSArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xuICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXG4gICogcmV0dXJucyBkaXNjb3ZlcmVkT2JqZWN0LlxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgIG5hbWUgIGRhdGFPYmplY3QgVVJMXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgZGF0YU9iamVjdHMgcmVzb3VyY2VzXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXG4gICovXG4gIGRpc2NvdmVyRGF0YU9iamVjdHNQZXJOYW1lRE8obmFtZSwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGlzY292ZXJEYXRhT2JqZWN0c1Blck5hbWUoLi4uYXJndW1lbnRzKVxuICAgICAgICAudGhlbihyZWdpc3RyeU9iamVjdHMgPT4gcmVzb2x2ZSh0aGlzLl9jb252ZXJ0VG9EaXNjb3ZlcmVkT2JqZWN0KHJlZ2lzdHJ5T2JqZWN0cykpKVxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IHNwZWNpZmljIHJlcG9ydGVyIGRhdGFPYmplY3QgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxuICAqIHJldHVybiB0aGUgZGF0YU9iamVjdHMgZnJvbSB0aGF0IHJlcG9ydGVyLlxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHJlcG9ydGVyICAgICBkYXRhT2JqZWN0IHJlcG9ydGVyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgZGF0YU9iamVjdHMgcmVzb3VyY2VzXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluICAgICAgIChPcHRpb25hbClcbiAgKi9cbiAgZGlzY292ZXJEYXRhT2JqZWN0c1BlclJlcG9ydGVyKHJlcG9ydGVyLCBzY2hlbWEsIHJlc291cmNlcywgZG9tYWluKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xuXG4gICAgYWN0aXZlRG9tYWluID0gKCFkb21haW4pID8gX3RoaXMuZG9tYWluIDogZG9tYWluO1xuXG5cbiAgICBsZXQgbXNnID0ge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogJy9kYXRhT2JqZWN0L3JlcG9ydGVyLycgKyByZXBvcnRlclxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZihzY2hlbWEgfHwgcmVzb3VyY2VzKSB7XG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcbiAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsXG4gICAgICAgIGRhdGFTY2hlbWVzOiBzY2hlbWEsXG4gICAgICAgIGRvbWFpbjogYWN0aXZlRG9tYWluXG4gICAgICB9O1xuICAgIH1lbHNlIHtcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xuICAgICAgICBkb21haW46IGFjdGl2ZURvbWFpblxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuXG4gICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKXtcbiAgICAgICAgICBsb2cubG9nKFwiUmVwbHkgVmFsdWUgTG9nOiBcIixyZXBseS5ib2R5LnZhbHVlKTtcbiAgICAgICAgICByZXNvbHZlKHJlcGx5LmJvZHkudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyTmFtZV0gRXJyb3IgUmVwbHkgZm9yIFwiICsgcmVwb3J0ZXIgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcbiAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IGRhdGFPYmplY3QgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxuICAqIHJldHVybnMgZGlzY292ZXJlZE9iamVjdC5cbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICBuYW1lICBkYXRhT2JqZWN0IFVSTFxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBkYXRhT2JqZWN0cyBzY2hlbWFzXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHJlc291cmNlc1xuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKVxuICAqL1xuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyUmVwb3J0ZXJETyhyZXBvcnRlciwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuZGlzY292ZXJEYXRhT2JqZWN0c1BlclJlcG9ydGVyKC4uLmFyZ3VtZW50cylcbiAgICAgICAgLnRoZW4ocmVnaXN0cnlPYmplY3RzID0+IHJlc29sdmUodGhpcy5fY29udmVydFRvRGlzY292ZXJlZE9iamVjdChyZWdpc3RyeU9iamVjdHMpKSlcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NvbnZlcnRUb0Rpc2NvdmVyZWRPYmplY3QocmVnaXN0cnlPYmplY3RzKSB7XG4gICAgcmV0dXJuIHJlZ2lzdHJ5T2JqZWN0cy5tYXAoKHJlZ2lzdHJ5T2JqZWN0KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IERpc2NvdmVyZWRPYmplY3QocmVnaXN0cnlPYmplY3QsIHRoaXMucnVudGltZVVSTCwgdGhpcy5kaXNjb3ZlcnlVUkwsIHRoaXMubWVzc2FnZUJ1cywgdGhpcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQWR2YW5jZWQgU2VhcmNoIGZvciBkYXRhT2JqZWN0cyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeVxuICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQuIFVzZSBkaXNjb3ZlckRhdGFPYmplY3RzUGVyTmFtZSBpbnN0ZWFkXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgbmFtZSAgICAgICAgICAgICAgICAgIG5hbWUgb2YgdGhlIGRhdGFPYmplY3RcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdCBzY2hlbWFzXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3QgcmVzb3VyY2VzXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXG4gICovXG4gIGRpc2NvdmVyRGF0YU9iamVjdChuYW1lLCBzY2hlbWEsIHJlc291cmNlcywgZG9tYWluKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xuICAgIC8vbGV0IHVzZXJJZGVudGlmaWVyID0gY29udmVydFRvVXNlclVSTCh1c2VyKTtcblxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcblxuICAgIGxldCBtc2cgPSB7XG4gICAgICB0eXBlOiAncmVhZCcsIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCwgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgYWN0aXZlRG9tYWluLCBib2R5OiB7IHJlc291cmNlOiBuYW1lLFxuICAgICAgY3JpdGVyaWE6IHtyZXNvdXJjZXM6IHJlc291cmNlcywgZGF0YVNjaGVtZXM6IHNjaGVtYX1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XG4gICAgICAgIGxvZy5sb2coJ1tEaXNjb3ZlcnldJywgcmVwbHkpXG5cbiAgICAgICAgaWYocmVwbHkuYm9keS5jb2RlPjI5OSkge1xuICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RdIEVycm9yIFJlcGx5IGZvciBcIiArIG5hbWUgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaHlwZXJ0aWVzID0gcmVwbHkuYm9keS52YWx1ZTtcblxuICAgICAgICBpZiAoaHlwZXJ0aWVzKSB7XG4gICAgICAgICAgcmVzb2x2ZShoeXBlcnRpZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlZCBTZWFyY2ggZm9yIEh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeVxuICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQuIFVzZSBkaXNjb3Zlckh5cGVydGllcyBpbnN0ZWFkXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlciAgICAgICAgICAgICAgICAgIHVzZXIgaWRlbnRpZmllciwgZWl0aGVyIGluIHVybCBvciBlbWFpbCBmb3JtYXRcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxuICAqL1xuICBkaXNjb3Zlckh5cGVydHkodXNlciwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcbiAgICBsZXQgdXNlcklkZW50aWZpZXIgPSBjb252ZXJ0VG9Vc2VyVVJMKHVzZXIpO1xuXG4gICAgaWYgKCFkb21haW4pIHtcbiAgICAgIGFjdGl2ZURvbWFpbiA9IF90aGlzLmRvbWFpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgYWN0aXZlRG9tYWluID0gZG9tYWluO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgbG9nLmxvZygnW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydHldIEFDVElWRSBET01BSU4gLT4gJywgYWN0aXZlRG9tYWluLCAndXNlci0+JywgdXNlciwgJ3NjaGVtYS0+Jywgc2NoZW1hLCAncmVzb3VyY2VzLT4nLCByZXNvdXJjZXMsICdkb21haW4tPicsIGRvbWFpbik7XG4gICAgICBpZiAodXNlci5pbmNsdWRlcygnOicpICYmICF1c2VyLmluY2x1ZGVzKCd1c2VyOi8vJykpIHtcbiAgICAgICAgbG9nLmxvZygnW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydHldICcgKyB1c2VyICsgJyBpcyBsZWdhY3kgZG9tYWluJyk7XG4gICAgICAgIGxldCBsZWdhY3lVc2VyID0geyB1c2VySUQ6IHVzZXIsIGh5cGVydHlJRDogdXNlciwgc2NoZW1hOiBzY2hlbWEsIHJlc291cmNlczogcmVzb3VyY2VzIH07XG4gICAgICAgIHJldHVybiByZXNvbHZlKGxlZ2FjeVVzZXIpO1xuICAgICAgfVxuICAgICAgbGV0IG1zZyA9IHtcbiAgICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIGFjdGl2ZURvbWFpbiwgYm9keTogeyByZXNvdXJjZTogdXNlcklkZW50aWZpZXIsXG4gICAgICAgIGNyaXRlcmlhOiB7cmVzb3VyY2VzOiByZXNvdXJjZXMsIGRhdGFTY2hlbWVzOiBzY2hlbWF9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGxvZy5pbmZvKCdbRGlzY292ZXJ5XSBtc2cgdG8gc2VuZC0+JywgbXNnKTtcblxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuXG4gICAgICAgIGxvZy5pbmZvKCdbRGlzY292ZXJ5XSBPTiBkaXNjb3Zlckh5cGVydHktPicsIHJlcGx5KTtcbiAgICAgICAgbGV0IGh5cGVydGllcyA9IHJlcGx5LmJvZHkudmFsdWU7XG5cbiAgICAgICAgaWYgKGh5cGVydGllcykge1xuICAgICAgICAgIHJlc29sdmUoaHlwZXJ0aWVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoJ05vIEh5cGVydHkgd2FzIGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCB1c2VycyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXG4gICogcmV0dXJuIHRoZSBsYXN0IGh5cGVydHkgaW5zdGFuY2UgcmVnaXN0ZXJlZCBieSB0aGUgdXNlci5cbiAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkLiBVc2UgZGlzY292ZXJIeXBlcnR5IGluc3RlYWRcbiAgKiBAcGFyYW0gIHtlbWFpbH0gICAgICAgICAgICAgIGVtYWlsXG4gICogQHBhcmFtICB7ZG9tYWlufSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXG4gICovXG4gIGRpc2NvdmVySHlwZXJ0eVBlclVzZXIoZW1haWwsIGRvbWFpbikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgLy8gSGFjayBmb3IgbGVnYWN5IHVzZXJzXG4gICAgICBpZiAoZW1haWwuaW5jbHVkZXMoJzonKSAmJiAhZW1haWwuaW5jbHVkZXMoJ3VzZXI6Ly8nKSkge1xuICAgICAgICBsb2cubG9nKCdbRGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0eV0gJyArIGVtYWlsICsnaXMgbGVnYWN5IGRvbWFpbicpO1xuICAgICAgICBsZXQgbGVnYWN5VXNlciA9IHsgaWQ6IGVtYWlsLCBoeXBlcnR5VVJMOiBlbWFpbCwgZGVzY3JpcHRvcjogJ3Vua25vd24nIH07XG4gICAgICAgIHJldHVybiByZXNvbHZlKGxlZ2FjeVVzZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRvbWFpbikge1xuICAgICAgICBhY3RpdmVEb21haW4gPSBfdGhpcy5kb21haW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmVEb21haW4gPSBkb21haW47XG4gICAgICB9XG5cbiAgICAgIGxldCBpZGVudGl0eVVSTCA9ICd1c2VyOi8vJyArIGVtYWlsLnN1YnN0cmluZyhlbWFpbC5pbmRleE9mKCdAJykgKyAxLCBlbWFpbC5sZW5ndGgpICsgJy8nICsgZW1haWwuc3Vic3RyaW5nKDAsIGVtYWlsLmluZGV4T2YoJ0AnKSk7XG5cblxuICAgICAgLy8gbWVzc2FnZSB0byBxdWVyeSBkb21haW4gcmVnaXN0cnksIGFza2luZyBmb3IgYSB1c2VyIGh5cGVydHkuXG4gICAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIGFjdGl2ZURvbWFpbiwgYm9keTogeyByZXNvdXJjZTogaWRlbnRpdHlVUkx9XG4gICAgICB9O1xuXG4gICAgICBsb2cuaW5mbygnW0Rpc2NvdmVyeV0gTWVzc2FnZTogJywgbWVzc2FnZSwgYWN0aXZlRG9tYWluLCBpZGVudGl0eVVSTCk7XG5cbiAgICAgIC8vbG9nLmluZm8oJ1tEaXNjb3ZlcnldIG1lc3NhZ2UgUkVBRCcsIG1lc3NhZ2UpO1xuXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xuICAgICAgICBsb2cuaW5mbygnW0Rpc2NvdmVyeV0gbWVzc2FnZSByZXBseScsIHJlcGx5KTtcblxuICAgICAgICBsZXQgaHlwZXJ0eTtcbiAgICAgICAgbGV0IG1vc3RSZWNlbnQ7XG4gICAgICAgIGxldCBsYXN0SHlwZXJ0eTtcbiAgICAgICAgbGV0IHZhbHVlID0gcmVwbHkuYm9keS52YWx1ZTtcblxuICAgICAgICBmb3IgKGh5cGVydHkgaW4gdmFsdWUpIHtcbiAgICAgICAgICBpZiAodmFsdWVbaHlwZXJ0eV0ubGFzdE1vZGlmaWVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChtb3N0UmVjZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbW9zdFJlY2VudCA9IG5ldyBEYXRlKHZhbHVlW2h5cGVydHldLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAgIGxhc3RIeXBlcnR5ID0gaHlwZXJ0eTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxldCBoeXBlcnR5RGF0ZSA9IG5ldyBEYXRlKHZhbHVlW2h5cGVydHldLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAgIGlmIChtb3N0UmVjZW50LmdldFRpbWUoKSA8IGh5cGVydHlEYXRlLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgIG1vc3RSZWNlbnQgPSBoeXBlcnR5RGF0ZTtcbiAgICAgICAgICAgICAgICBsYXN0SHlwZXJ0eSA9IGh5cGVydHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2cuaW5mbygnW0Rpc2NvdmVyeV0gTGFzdCBIeXBlcnR5OiAnLCBsYXN0SHlwZXJ0eSwgbW9zdFJlY2VudCk7XG5cbiAgICAgICAgbGV0IGh5cGVydHlVUkwgPSBsYXN0SHlwZXJ0eTtcblxuICAgICAgICBpZiAoaHlwZXJ0eVVSTCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnVXNlciBIeXBlcnR5IG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlkUGFja2FnZSA9IHtcbiAgICAgICAgICBpZDogZW1haWwsXG4gICAgICAgICAgZGVzY3JpcHRvcjogdmFsdWVbaHlwZXJ0eVVSTF0uZGVzY3JpcHRvcixcbiAgICAgICAgICBoeXBlcnR5VVJMOiBoeXBlcnR5VVJMXG4gICAgICAgIH07XG5cbiAgICAgICAgbG9nLmluZm8oJ1tEaXNjb3ZlcnldID09PT4gaHlwZXJ0eURpc2NvdmVyeSBtZXNzYWdlQnVuZGxlOiAnLCBpZFBhY2thZ2UpO1xuICAgICAgICByZXNvbHZlKGlkUGFja2FnZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgdXNlcnMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxuICAqIHJldHVybiB0aGUgYWxsIHRoZSBoeXBlcnRpZXMgcmVnaXN0ZXJlZCBieSB0aGUgdXNlclxuICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQuIFVzZSBkaXNjb3Zlckh5cGVydHkgaW5zdGVhZFxuICAqIEBwYXJhbSAge2VtYWlsfSAgICAgICAgICAgICAgZW1haWxcbiAgKiBAcGFyYW0gIHtkb21haW59ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcbiAgKi9cbiAgZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyKGVtYWlsLCBkb21haW4pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBhY3RpdmVEb21haW47XG4gICAgbG9nLmxvZygnb24gRnVuY3Rpb24tPicsIGVtYWlsKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGlmIChlbWFpbC5pbmNsdWRlcygnOicpICYmICFlbWFpbC5pbmNsdWRlcygndXNlcjovLycpKSB7XG4gICAgICAgIGxvZy5sb2coJ1tEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnR5XSBpcyBsZWdhY3kgZG9tYWluJyk7XG4gICAgICAgIGxldCBsZWdhY3lVc2VyID0geyB1c2VySUQ6IGVtYWlsLCBoeXBlcnR5SUQ6IGVtYWlsLCBzY2hlbWE6IHNjaGVtYSwgcmVzb3VyY2VzOiByZXNvdXJjZXMgfTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUobGVnYWN5VXNlcik7XG4gICAgICB9XG5cbiAgICAgIGlmICghZG9tYWluKSB7XG4gICAgICAgIGFjdGl2ZURvbWFpbiA9IF90aGlzLmRvbWFpbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2ZURvbWFpbiA9IGRvbWFpbjtcbiAgICAgIH1cblxuICAgICAgbGV0IGlkZW50aXR5VVJMID0gJ3VzZXI6Ly8nICsgZW1haWwuc3Vic3RyaW5nKGVtYWlsLmluZGV4T2YoJ0AnKSArIDEsIGVtYWlsLmxlbmd0aCkgKyAnLycgKyBlbWFpbC5zdWJzdHJpbmcoMCwgZW1haWwuaW5kZXhPZignQCcpKTtcblxuICAgICAgLy8gbWVzc2FnZSB0byBxdWVyeSBkb21haW4gcmVnaXN0cnksIGFza2luZyBmb3IgYSB1c2VyIGh5cGVydHkuXG4gICAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIGFjdGl2ZURvbWFpbiwgYm9keTogeyByZXNvdXJjZTogaWRlbnRpdHlVUkx9XG4gICAgICB9O1xuXG4gICAgICBsb2cubG9nKCdbRGlzY292ZXJ5XSBNZXNzYWdlIGRpc2NvdmVySHlwZXJ0aWVzUGVyVXNlcjogJywgbWVzc2FnZSwgYWN0aXZlRG9tYWluLCBpZGVudGl0eVVSTCk7XG5cbiAgICAgIC8vbG9nLmluZm8oJ1tEaXNjb3ZlcnldIG1lc3NhZ2UgUkVBRCcsIG1lc3NhZ2UpO1xuXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xuICAgICAgICBsb2cuaW5mbygnW0Rpc2NvdmVyeV0gZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyIHJlcGx5JywgcmVwbHkpO1xuXG4gICAgICAgIGxldCB2YWx1ZSA9IHJlcGx5LmJvZHkudmFsdWU7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgIHJldHVybiByZWplY3QoJ1VzZXIgSHlwZXJ0eSBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IHVzZXJzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcbiAgKiByZXR1cm4gdGhlIGFsbCB0aGUgaHlwZXJ0aWVzIHJlZ2lzdGVyZWQgYnkgdGhlIHVzZXJcbiAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkLiBVc2UgZGlzY292ZXJIeXBlcnR5IGluc3RlYWRcbiAgKiBAcGFyYW0gIHtlbWFpbH0gICAgICAgICAgICAgIGVtYWlsXG4gICogQHBhcmFtICB7ZG9tYWlufSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXG4gICovXG4gIHJlc3VtZURpc2NvdmVyaWVzKCkge1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxvZy5sb2coJ1tEaXNjb3ZlcnldIHJlc3VtZURpc2NvdmVyaWVzJyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGxldCBtc2cgPSB7XG4gICAgICAgIHR5cGU6ICdyZWFkJywgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLCB0bzogX3RoaXMucnVudGltZVVSTCArICcvc3Vic2NyaXB0aW9ucycsIGJvZHk6IHsgcmVzb3VyY2U6IF90aGlzLmRpc2NvdmVyeVVSTH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpPT57XG4gICAgICAgIGxvZy5sb2coJ1tEaXNjb3ZlcnkucmVzdW1lRGlzY292ZXJpZXNdIHJlcGx5OiAnLCByZXBseSk7XG5cbiAgICAgICAgbGV0IG5vdGlmaWNhdGlvbnMgPSBbXTtcblxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcbiAgICAgICAgICBsZXQgdXJscyA9IHJlcGx5LmJvZHkudmFsdWU7Ly8gVVJMcyB0byBhZGQgbGlzdGVuZXJzIHRvXG5cbiAgICAgICAgICAvL2xldHMgY3JlYXRlIG9uZSBEaXNjb3ZlcnlPYmplY3QgcGVyIG5vdGlmaWNhdGlvblxuICAgICAgICAgIHVybHMuZm9yRWFjaCgodXJsKSA9PiB7XG4gICAgICAgICAgICBsZXQgb2JqZWN0VXJsID0gdXJsLnNwbGl0KCcvcmVnaXN0cmF0aW9uJylbMF07XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHt9O1xuICAgICAgICAgICAgZGF0YS51cmwgPSBvYmplY3RVcmw7XG4gICAgICAgICAgICBsb2cubG9nKCdbRGlzY292ZXJ5LnJlc3VtZURpc2NvdmVyaWVzXSBhZGRpbmcgbGlzdGVuZXIgdG86ICcsIG9iamVjdFVybCk7XG5cbiAgICAgICAgICAgIGlmIChvYmplY3RVcmwuaW5jbHVkZXMoJ2h5cGVydHk6Ly8nKSkge1xuICAgICAgICAgICAgICBub3RpZmljYXRpb25zLnB1c2goX3RoaXMuZGlzY292ZXJIeXBlcnR5UGVyVVJMRE8ob2JqZWN0VXJsKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBub3RpZmljYXRpb25zLnB1c2goX3RoaXMuZGlzY292ZXJEYXRhT2JqZWN0UGVyVVJMRE8ob2JqZWN0VXJsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgUHJvbWlzZS5hbGwobm90aWZpY2F0aW9ucykudGhlbih2YWx1ZXM9PnsgcmVzb2x2ZSh2YWx1ZXMpOyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB9KTtcblxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpc2NvdmVyeTtcbiIsImNsYXNzIFNlYXJjaCB7XG5cbiAgY29uc3RydWN0b3IoZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpIHtcblxuICAgIGlmICghZGlzY292ZXJ5KSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkaXNjb3ZlcnkgY29tcG9uZW50IGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xuICAgIGlmICghaWRlbnRpdHlNYW5hZ2VyKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBpZGVudGl0eU1hbmFnZXIgY29tcG9uZW50IGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLmRpc2NvdmVyeSA9IGRpc2NvdmVyeTtcbiAgICBfdGhpcy5pZGVudGl0eU1hbmFnZXIgPSBpZGVudGl0eU1hbmFnZXI7XG5cbiAgfVxuXG4gIG15SWRlbnRpdHkoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyLmRpc2NvdmVyVXNlclJlZ2lzdGVyZWQoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgfVxuXG4gIGh5cGVydGllcyh1c2Vycywgc2NoZW1lcywgcmVzb3VyY2VzLCBnbG9iYWxGbGFnID0gZmFsc2UpIHtcbiAgICAvL1RPRE86IHJldXNlIHVzZXJzIG9yIHRoZSBvdGhlciB3YXkgYXJvdW5kXG5cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHVzZXJzVVJMIHRvIHNlYXJjaFxuICAgKiBAcGFyYW0gIHthcnJheTxVUkwudXNlclVSTD59ICB1c2VycyBMaXN0IG9mIFVzZXJVUiwgbGlrZSB0aGlzIGZvcm1hdCB1c2VyOi8vPGlwZGRvbWFpbj4vPHVzZXItaWRlbnRpZmllcj5cbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIHVzZXJzKHVzZXJzVVJMcywgcHJvdmlkZWREb21haW5zLCBzY2hlbWVzLCByZXNvdXJjZXMsIGdsb2JhbEZsYWcgPSBmYWxzZSkge1xuXG4gICAgaWYgKCF1c2Vyc1VSTHMpIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgdXNlcnMnKTtcbiAgICBpZiAoIXByb3ZpZGVkRG9tYWlucykgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBwcm92aWRlIGEgbGlzdCBvZiBkb21haW5zJyk7XG4gICAgaWYgKCFyZXNvdXJjZXMpIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgcmVzb3VyY2VzJyk7XG4gICAgaWYgKCFzY2hlbWVzKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBuZWVkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIHNjaGVtZXMnKTtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGNvbnNvbGUuaW5mbygnW1NlYXJjaF0gVXNlcnM6ICcsIHVzZXJzVVJMcywgdXNlcnNVUkxzLmxlbmd0aCk7XG4gICAgICBjb25zb2xlLmluZm8oJ1tTZWFyY2hdIERvbWFpbnM6ICcsIHByb3ZpZGVkRG9tYWlucywgcHJvdmlkZWREb21haW5zLmxlbmd0aCk7XG4gICAgICBpZiAodXNlcnNVUkxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RvblxcJ3QgaGF2ZSB1c2VycyB0byBkaXNjb3ZlcnknKTtcbiAgICAgICAgcmVzb2x2ZSh1c2Vyc1VSTHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGdldFVzZXJzID0gW107XG5cbiAgICAgICAgdXNlcnNVUkxzLmZvckVhY2goKHVzZXJVUkwsIGluZGV4KSA9PiB7XG4gICAgICAgICAgbGV0IGN1cnJlbnREb21haW4gPSBwcm92aWRlZERvbWFpbnNbaW5kZXhdO1xuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW1NlYXJjaF0gU2VhcmNoIHVzZXIgJyArIHVzZXJVUkwgKyAnIGZvciBwcm92aWRlZCBkb21haW46JywgY3VycmVudERvbWFpbik7XG4gICAgICAgICAgaWYgKCFnbG9iYWxGbGFnKSB7XG4gICAgICAgICAgICBnZXRVc2Vycy5wdXNoKF90aGlzLmRpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllcyh1c2VyVVJMLCBzY2hlbWVzLCByZXNvdXJjZXMsIGN1cnJlbnREb21haW4pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0VXNlcnMucHVzaChfdGhpcy5kaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGEodXNlclVSTCwgc2NoZW1lcywgcmVzb3VyY2VzKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUuaW5mbygnUmVxdWVzdHMgcHJvbWlzZXM6ICcsIGdldFVzZXJzKTtcblxuICAgICAgICBQcm9taXNlLmFsbChnZXRVc2Vycy5tYXAoKHByb21pc2UpID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZS50aGVuKChoeXBlcnR5KSA9PiB7IHJldHVybiBoeXBlcnR5OyB9LCAoZXJyb3IpID0+IHsgcmV0dXJuIGVycm9yOyB9KTtcbiAgICAgICAgfSkpLnRoZW4oKGh5cGVydGllcykgPT4ge1xuXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbU2VhcmNoXSBIeXBlcnRpZXMgZnJvbSBuZXcgRGlzY292ZXJ5JywgaHlwZXJ0aWVzKTtcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gaHlwZXJ0aWVzLm1hcChmdW5jdGlvbihoeXBlcnR5KSB7XG5cbiAgICAgICAgICAgIGlmIChoeXBlcnR5Lmhhc093blByb3BlcnR5KCdoeXBlcnR5SUQnKSlcbiAgICAgICAgICAgICAgcmV0dXJuIGh5cGVydHk7XG4gICAgICAgICAgICBsZXQgcmVjZW50ID0gT2JqZWN0LmtleXMoaHlwZXJ0eSkucmVkdWNlUmlnaHQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgICAgICBsZXQgaHlwZXJ0eURhdGUgPSBuZXcgRGF0ZShoeXBlcnR5W2JdLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAgIGxldCBoeXBlcnR5RGF0ZVAgPSBuZXcgRGF0ZShoeXBlcnR5W2FdLmxhc3RNb2RpZmllZCk7XG4gICAgICAgICAgICAgIGlmIChoeXBlcnR5RGF0ZVAuZ2V0VGltZSgpIDwgaHlwZXJ0eURhdGUuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGh5cGVydHlbcmVjZW50XTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGxldCBjbGVhbiA9IHJlc3VsdC5maWx0ZXIoKGh5cGVydHkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBoeXBlcnR5Lmhhc093blByb3BlcnR5KCdoeXBlcnR5SUQnKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXF1ZXN0cyByZXN1bHQ6ICcsIGNsZWFuKTtcblxuICAgICAgICAgIGh5cGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICAgICAgICBpZiAoZW50cnkgIT09ICdObyBIeXBlcnR5IHdhcyBmb3VuZCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoY2xlYW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVqZWN0KCdObyBIeXBlcnR5IHdhcyBmb3VuZCcpO1xuXG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKHJlYXNvbik7XG4gICAgICAgICAgcmVzb2x2ZSh1c2Vyc1VSTHMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZWFyY2g7XG4iLCIvKipcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cbipcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKiovXG4vKipcbiAqIEV2ZW50RW1pdHRlclxuICogQWxsIGNsYXNzZXMgd2hpY2ggZXh0ZW5kcyB0aGlzLCBjYW4gaGF2ZSBhZGRFdmVudExpc3RlbmVyIGFuZCB0cmlnZ2VyIGV2ZW50cztcbiAqL1xuY2xhc3MgRXZlbnRFbWl0dGVyIHtcblxuICAvKipcbiAgICogYWRkRXZlbnRMaXN0ZW5lciBsaXN0ZW4gZm9yIGFuIGV2ZW50VHlwZVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgZXZlbnRUeXBlIC0gbGlzdGVuaW5nIGZvciB0aGlzIHR5cGUgb2YgZXZlbnRcbiAgICogQHBhcmFtICB7RnVuY3Rpb259ICAgICAgIGNiICAgICAgICAtIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiB0aGUgZXZlbnQgaXQgaXMgaW52b2tlZFxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNiKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpc1tldmVudFR5cGVdID0gY2I7XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIHRoZSBldmVudFR5cGVcbiAgICogQHBhcmFtICB7c3RyaW5nfSBldmVudFR5cGUgLSBldmVudCB3aWxsIGJlIGludm9rZWRcbiAgICogQHBhcmFtICB7b2JqZWN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBhZGRFdmVudExpc3RlbmVyXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50VHlwZSwgcGFyYW1zKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmIChfdGhpc1tldmVudFR5cGVdKSB7XG4gICAgICBfdGhpc1tldmVudFR5cGVdKHBhcmFtcyk7XG4gICAgfVxuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRFbWl0dGVyO1xuIiwiLy9pbXBvcnQgSWRlbnRpdHlNYW5hZ2VyIGZyb20gJy4uL2lkZW50aXR5TWFuYWdlci9JZGVudGl0eU1hbmFnZXInO1xuLy9pbXBvcnQgU3luY2hlciBmcm9tICcuLi9zeW5jaGVyL1N5bmNoZXIuanMnO1xuLy9pbXBvcnQgRGlzY292ZXJ5IGZyb20gJy4uL2Rpc2NvdmVyeS9EaXNjb3ZlcnkuanMnO1xuLy9pbXBvcnQge2RpdmlkZVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG4vL2ltcG9ydCBTZWFyY2ggZnJvbSAnLi4vdXRpbHMvU2VhcmNoJztcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnLi4vdXRpbHMvRXZlbnRFbWl0dGVyJztcblxuLyoqXG4qIENvbnRleHQgT2JzZXJ2ZXI7XG4qIEBhdXRob3IgUGF1bG8gQ2hhaW5obyBbcGF1bG8tZy1jaGFpbmhvQGFsdGljZWxhYnMuY29tXVxuKi9cblxuY2xhc3MgQ29udGV4dE9ic2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcblxuICBjb25zdHJ1Y3RvcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24sIGNvbnRleHRSZXNvdXJjZVR5cGVzLCBmYWN0b3J5LCBzeW5jaGVyKSB7XG4gICAgaWYgKCFoeXBlcnR5VVJMKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBoeXBlcnR5VVJMIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xuICAgIGlmICghYnVzKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBNaW5pQnVzIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29uZmlndXJhdGlvbiBpcyBhIG5lZWRlZCBwYXJhbWV0ZXIgJyk7XG4gICAgaWYgKCFmYWN0b3J5KSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBmYWN0b3J5IGlzIGEgbmVlZGVkIHBhcmFtZXRlciAnKTtcblxuICAgIHN1cGVyKCk7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX2NvbnRleHRSZXNvdXJjZVR5cGVzID0gY29udGV4dFJlc291cmNlVHlwZXM7XG4gICAgX3RoaXMuX3VybCA9IGh5cGVydHlVUkw7XG4gICAgX3RoaXMuX2Rpc2NvdmVyVXNlcnNQcm9taXNlcyA9IHt9OyAvLyBvYmplY3Qgd2l0aCBwcm9taXNlcyBleGVjdXRlZCBhdCBkaXNjb3ZlclVzZXJzIGZ1bmN0aW9uXG4gICAgX3RoaXMuX29ic2VydmVQcm9taXNlcyA9IHt9OyAvLyBvYmplY3Qgd2l0aCBwcm9taXNlcyBleGVjdXRlZCBhdCBvYnNlcnZlIGZ1bmN0aW9uXG5cblxuICAgIC8vbGV0IGlkZW50aXR5TWFuYWdlciA9IG5ldyBJZGVudGl0eU1hbmFnZXIoaHlwZXJ0eVVSTCwgY29uZmlndXJhdGlvbi5ydW50aW1lVVJMLCBidXMpO1xuICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyXSBzdGFydGVkIHdpdGggaHlwZXJ0eVVSTC0+JywgaHlwZXJ0eVVSTCk7XG4gICAgX3RoaXMuX2RvbWFpbiA9IGZhY3RvcnkuZGl2aWRlVVJMKGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTCkuZG9tYWluO1xuICAgIF90aGlzLl9vYmplY3REZXNjVVJMID0gJ2h5cGVydHktY2F0YWxvZ3VlOi8vY2F0YWxvZ3VlLicgKyBfdGhpcy5fZG9tYWluICsgJy8ud2VsbC1rbm93bi9kYXRhc2NoZW1hL0NvbnRleHQnO1xuXG4gICAgX3RoaXMuX3VzZXJzMm9ic2VydmUgPSBbXTtcbiAgICBfdGhpcy5fb2JzZXJ2ZXJzID0ge307XG5cbiAgICB0aGlzLl9zeW5jaGVyID0gc3luY2hlciA/IHN5bmNoZXIgOiBmYWN0b3J5LmNyZWF0ZVN5bmNoZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWd1cmF0aW9uKTtcblxuICAgIGxldCBkaXNjb3ZlcnkgPSBmYWN0b3J5LmNyZWF0ZURpc2NvdmVyeShoeXBlcnR5VVJMLCBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwsIGJ1cyk7XG4gICAgX3RoaXMuX2Rpc2NvdmVyeSA9IGRpc2NvdmVyeTtcblxuICAgIF90aGlzLl9kaXNjb3ZlcmllcyA9IHt9OyAvL2xpc3Qgb2YgZGlzY292ZXJlZCBvYmplY3RzXG4gICAgLy9fdGhpcy5pZGVudGl0eU1hbmFnZXIgPSBpZGVudGl0eU1hbmFnZXI7XG4gICAgLy9fdGhpcy5zZWFyY2ggPSBuZXcgU2VhcmNoKGRpc2NvdmVyeSwgaWRlbnRpdHlNYW5hZ2VyKTtcbiAgICB3aW5kb3cuZGlzY292ZXJ5ID0gX3RoaXMuX2Rpc2NvdmVyeTtcbiAgfVxuXG5cbiAgc3RhcnQocmVzdW1lZENvbnRleHQsIGRpc2Nvbm5lY3RlZENhbGxCYWNrKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5zdGFydF0gJyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX3RoaXMuX3N5bmNoZXIucmVzdW1lT2JzZXJ2ZXJzKHtzdG9yZTogdHJ1ZX0pLnRoZW4oKG9ic2VydmVycykgPT4ge1xuXG4gICAgICAgIGxldCBvYnNlcnZlcnNMaXN0ID0gT2JqZWN0LmtleXMob2JzZXJ2ZXJzKTtcblxuICAgICAgICBpZiAob2JzZXJ2ZXJzTGlzdC5sZW5ndGggID4gMCkge1xuXG4gICAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIuc3RhcnRdIHJlc3VtaW5nOiAnLCBvYnNlcnZlcnMpO1xuXG4gICAgICAgICAgLypvYnNlcnZlcnNMaXN0LmZvckVhY2goKGkpPT57XG4gICAgICAgICAgX3RoaXMuX3VzZXJzMm9ic2VydmUucHVzaChuZXcgVXNlckF2YWlsYWJpbGl0eUNvbnRyb2xsZXIob2JzZXJ2ZXJzW2ldKSk7XG4gICAgICAgIH0pOyovXG4gICAgICAgICAgX3RoaXMuX29ic2VydmVycyA9IG9ic2VydmVycztcblxuICAgICAgICAgIHJlc29sdmUob2JzZXJ2ZXJzKTtcblxuICAgICAgICAgIG9ic2VydmVyc0xpc3QuZm9yRWFjaCgob2JzZXJ2ZXIpID0+e1xuICAgICAgICAgICAgbGV0IENvbnRleHQgPSBvYnNlcnZlcnNbb2JzZXJ2ZXJdO1xuXG4gICAgICAgICAgICAvLyBCeSBkZWZhdWx0IHJlc3VtZWQgY29udGV4dCBpcyBzZXQgd2l0aCByZXN1bWVkQ29udGV4dC5cbiAgICAgICAgICAgIGlmIChyZXN1bWVkQ29udGV4dCkgY29udGV4dC5kYXRhLnZhbHVlcyA9IHJlc3VtZWRDb250ZXh0O1xuXG4gICAgICAgICAgICAvLyBDb250ZXh0IHdpbGwgd2lsbCBiZSB1cGRhdGVkIHdpdGggdmFsdWUgc3luY2hyb25pemVkIHdpdGggcmVwb3J0ZXIgaWYgY29ubmVjdGVkXG4gICAgICAgICAgICBDb250ZXh0LnN5bmMoKTtcblxuICAgICAgICAgICAgLy9BZGQgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgd2hlbiByZXBvcnRlciBpcyBhYnJ1cHRseSBkaXNjb25uZWN0ZWRcbiAgICAgICAgICAgIGlmIChkaXNjb25uZWN0ZWRDYWxsQmFjaykgQ29udGV4dC5vbkRpc2Nvbm5lY3RlZChkaXNjb25uZWN0ZWRDYWxsQmFjayk7XG4gICAgICAgICAgfSk7XG5cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ29udGV4dE9ic2VydmVyXSBSZXN1bWUgT2JzZXJ2ZXIgZmFpbGVkIHwgJywgcmVhc29uKTtcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICByZWplY3QoJ1tDb250ZXh0T2JzZXJ2ZXJdIFN0YXJ0IGZhaWxlZCB8ICcsIHJlYXNvbik7XG4gICAgfSk7XG4gIH1cblxuICByZXN1bWVEaXNjb3ZlcmllcygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF90aGlzLl9kaXNjb3ZlcnkucmVzdW1lRGlzY292ZXJpZXMoKS50aGVuKChkaXNjb3ZlcmllcykgPT4ge1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLl9yZXN1bWVEaXNjb3Zlcmllc10gZm91bmQ6ICcsIGRpc2NvdmVyaWVzKTtcblxuICAgICAgICBkaXNjb3Zlcmllcy5mb3JFYWNoKChkaXNjb3ZlcnkpID0+e1xuXG4gICAgICAgICAgaWYgKGRpc2NvdmVyeS5kYXRhLnJlc291cmNlcyAmJiBkaXNjb3ZlcnkuZGF0YS5yZXNvdXJjZXNbMF0gPT09IF90aGlzLl9jb250ZXh0UmVzb3VyY2VUeXBlc1swXSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIuX3Jlc3VtZURpc2NvdmVyaWVzXSByZXN1bWluZzogJywgZGlzY292ZXJ5KTtcblxuICAgICAgICAgICAgaWYgKGRpc2NvdmVyeS5kYXRhLnN0YXR1cyA9PT0gJ2xpdmUnKSB7IC8vIHByZXZpb3VzbHkgZGlzY292ZXJlZCBvYmplY3QgaXMgbm93IGxpdmVcbiAgICAgICAgICAgICAgcmVzb2x2ZShbZGlzY292ZXJ5LmRhdGFdKTtcbiAgICAgICAgICAgICAgZGlzY292ZXJ5LnVuc3Vic2NyaWJlTGl2ZShfdGhpcy5fdXJsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIHByZXZpb3VzbHkgZGlzY292ZXJlZCBvYmplY3QgaXMgc3RpbGwgZGlzY29ubmVjdGVkXG4gICAgICAgICAgICAgIGRpc2NvdmVyeS5vbkxpdmUoX3RoaXMuX3VybCwgKCk9PntcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5fcmVzdW1lRGlzY292ZXJpZXNdIGRpc2Nvbm5lY3RlZCBIeXBlcnR5IGlzIGJhY2sgdG8gbGl2ZScsIGRpc2NvdmVyeSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShbZGlzY292ZXJ5LmRhdGFdKTtcbiAgICAgICAgICAgICAgICBkaXNjb3ZlcnkudW5zdWJzY3JpYmVMaXZlKF90aGlzLl91cmwpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgcmVqZWN0KCdbQ29udGV4dE9ic2VydmVyXSByZXN1bWVEaXNjb3ZlcmllcyBmYWlsZWQgfCAnLCByZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgb25SZXN1bWVPYnNlcnZlcihjYWxsYmFjaykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX29uUmVzdW1lT2JzZXJ2ZXIgPSBjYWxsYmFjaztcbiAgfVxuXG5cbiAgZGlzY292ZXJVc2VycyhlbWFpbCwgZG9tYWluKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuXG4gICAgbGV0IHVzZXIgPSBlbWFpbCArICdAJyArIGRvbWFpbjtcblxuICAgIGlmICghX3RoaXMuX2Rpc2NvdmVyVXNlcnNQcm9taXNlc1t1c2VyXSkge1xuICAgICAgX3RoaXMuX2Rpc2NvdmVyVXNlcnNQcm9taXNlc1t1c2VyXSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICAgIF90aGlzLl9kaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNETyhlbWFpbCwgWydjb250ZXh0J10sIF90aGlzLl9jb250ZXh0UmVzb3VyY2VUeXBlcywgZG9tYWluKS50aGVuKGh5cGVydGllcyA9PntcbiAgICAgICAgICAvL190aGlzLnNlYXJjaC51c2VycyhbZW1haWxdLCBbZG9tYWluXSwgWydjb250ZXh0J10sIFsnQ29udGV4dF9jb250ZXh0J10pLnRoZW4oZnVuY3Rpb24oYSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLmRpc2NvdmVyVXNlcnNdIGRpc2NvdmVyeSByZXN1bHQtPicsIGh5cGVydGllcyk7XG4gICAgICAgICAgbGV0IGRpc2NvdmVyZWQgPSBbXTtcbiAgICAgICAgICBsZXQgZGlzY29ubmVjdGVkID0gW107XG4gICAgICAgICAgaHlwZXJ0aWVzLmZvckVhY2goaHlwZXJ0eSA9PntcbiAgICAgICAgICAgIF90aGlzLl9kaXNjb3Zlcmllc1toeXBlcnR5LmRhdGEuaHlwZXJ0eUlEXSA9IGh5cGVydHk7XG4gICAgICAgICAgICBpZiAoaHlwZXJ0eS5kYXRhLnN0YXR1cyA9PT0gJ2xpdmUnKSB7XG4gICAgICAgICAgICAgIGRpc2NvdmVyZWQucHVzaChoeXBlcnR5LmRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGlzY29ubmVjdGVkLnB1c2goaHlwZXJ0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cblxuICAgICAgICAgIGlmIChkaXNjb3ZlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLmRpc2NvdmVyVXNlcnNdIHJldHVybmluZyBkaXNjb3ZlcmVkIGh5cGVydGllcyBkYXRhLT4nLCBkaXNjb3ZlcmVkKTtcbiAgICAgICAgICAgIHJlc29sdmUoZGlzY292ZXJlZCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChkaXNjb25uZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIuZGlzY292ZXJVc2Vyc10gZGlzY29ubmVjdGVkIEh5cGVydGllcyAnLCBkaXNjb25uZWN0ZWQpO1xuXG4gICAgICAgICAgICAvL3Jlc29sdmUoW10pO1xuXG4gICAgICAgICAgICBkaXNjb25uZWN0ZWRbMF0ub25MaXZlKF90aGlzLl91cmwsICgpPT57XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLmRpc2NvdmVyVXNlcnNdIGRpc2Nvbm5lY3RlZCBIeXBlcnR5IGlzIGJhY2sgdG8gbGl2ZScsIGRpc2Nvbm5lY3RlZFswXSk7XG5cbiAgICAgICAgICAgICAgZGlzY292ZXJlZC5wdXNoKGRpc2Nvbm5lY3RlZFswXS5kYXRhKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShkaXNjb3ZlcmVkKTtcbiAgICAgICAgICAgICAgZGlzY29ubmVjdGVkWzBdLnVuc3Vic2NyaWJlTGl2ZShfdGhpcy5fdXJsKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF90aGlzLl9kaXNjb3ZlclVzZXJzUHJvbWlzZXNbdXNlcl07XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IHRoZSB1c2VyIENvbnRleHQgb2JzZXJ2YXRpb24gZm9yIGEgY2VydGFpbiB1c2VyIENvbnRleHQgcmVwb3J0ZXJcbiAgICogQHBhcmFtICB7RGlzY292ZXJlZE9iamVjdH0gaHlwZXJ0eSAgICAgICBIeXBlcnR5IHRvIGJlIG9ic2VydmVkLlxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT4gRGF0YU9iamVjdE9ic2VydmVyfSAgICAgIEl0IHJldHVybnMgYXMgYSBQcm9taXNlIHRoZSBVc2VyQXZhaWxhYmlsaXR5IERhdGEgT2JqZWN0IE9ic2VydmVyLlxuICAgKi9cblxuICBvYnNlcnZlKGh5cGVydHksIGRvbWFpblN1YnNjcmlwdGlvbiA9IHRydWUpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGlmICghX3RoaXMuX29ic2VydmVQcm9taXNlc1toeXBlcnR5Lmh5cGVydHlJRF0pIHtcbiAgICAgIF90aGlzLl9vYnNlcnZlUHJvbWlzZXNbaHlwZXJ0eS5oeXBlcnR5SURdID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAvL2NoZWNrIGlmIHdlIGFyZSBhbHJlYWR5IG9ic2VydmluZyBpdFxuICAgICAgICBfdGhpcy5fdXNlcnMyb2JzZXJ2ZS5mb3JFYWNoKChDb250ZXh0KSA9PiB7XG4gICAgICAgICAgaWYgKENvbnRleHQuX3JlcG9ydGVyID09PSBoeXBlcnR5Lmh5cGVydHlJRCkgcmV0dXJuIHJlc29sdmUoQ29udGV4dCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzLl9kaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0c1BlclJlcG9ydGVyKGh5cGVydHkuaHlwZXJ0eUlELCBbJ2NvbnRleHQnXSwgX3RoaXMuX2NvbnRleHRSZXNvdXJjZVR5cGVzLCAgX3RoaXMuX2RvbWFpbikudGhlbihmdW5jdGlvbihkYXRhT2JqZWN0cykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLmRpc2NvdmVyQXZhaWxhYmlsaXR5XSBkaXNjb3ZlcmVkIGNvbnRleHQgb2JqZWN0cyAnLCBkYXRhT2JqZWN0cyk7XG4gICAgICAgICAgbGV0IGxhc3QgPSAwO1xuICAgICAgICAgIGxldCB1cmw7XG5cbiAgICAgICAgICBkYXRhT2JqZWN0cy5mb3JFYWNoKChkYXRhT2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnbGFzdE1vZGlmaWVkJykgJiYgZGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndXJsJykgJiYgRGF0ZS5wYXJzZShkYXRhT2JqZWN0Lmxhc3RNb2RpZmllZCkgPiBsYXN0KSB7XG4gICAgICAgICAgICAgIGxhc3QgPSBkYXRhT2JqZWN0Lmxhc3RNb2RpZmllZDtcbiAgICAgICAgICAgICAgdXJsID0gZGF0YU9iamVjdC51cmw7XG5cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ1VSTCBEQVRBIE9iamVjdCcsIHVybCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGxhc3QgIT0gMCAmJiB1cmwpIHtcbiAgICAgICAgICAgIHJlc29sdmUoX3RoaXMuX3N1YnNjcmliZUNvbnRleHQoaHlwZXJ0eSwgdXJsLCBkb21haW5TdWJzY3JpcHRpb24pKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KCdbQ29udGV4dE9ic2VydmVyLm9ic2VydmVdIGRpc2NvdmVyZWQgRGF0YU9iamVjcyBhcmUgaW52YWxpZCcsIGRhdGFPYmplY3RzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBfdGhpcy5fb2JzZXJ2ZVByb21pc2VzW2h5cGVydHkuaHlwZXJ0eUlEXTtcbiAgfVxuXG4gIF9zdWJzY3JpYmVDb250ZXh0KGh5cGVydHksIHVybCwgZG9tYWluU3Vic2NyaXB0aW9uID0gdHJ1ZSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAvLyBhdm9pZCBkdXBsaWNhdGVkIHN1YnNjcmlwdGlvbnNcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIF90aGlzLl91c2VyczJvYnNlcnZlLmZvckVhY2goKENvbnRleHQpID0+IHtcbiAgICAgICAgaWYgKENvbnRleHQudXJsID09PSB1cmwpIHJldHVybiByZXNvbHZlKENvbnRleHQpO1xuICAgICAgfSk7XG5cbiAgICAgIGxldCBpbnB1dCA9IHtcbiAgICAgICAgc2NoZW1hOiBfdGhpcy5fb2JqZWN0RGVzY1VSTCxcbiAgICAgICAgcmVzb3VyY2U6IHVybCxcbiAgICAgICAgc3RvcmU6IG51bGwsXG4gICAgICAgIHAycDogbnVsbCxcbiAgICAgICAgbXV0dWFsOiBudWxsLFxuICAgICAgICBkb21haW5fc3Vic2NyaXB0aW9uOiBkb21haW5TdWJzY3JpcHRpb25cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl9zeW5jaGVyLnN1YnNjcmliZShpbnB1dCkudGhlbigoQ29udGV4dCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5fc3Vic2NyaWJlQ29udGV4dF0gb2JzZXJ2ZXIgb2JqZWN0JywgQ29udGV4dCk7XG5cbiAgICAgICAgLy9sZXQgbmV3VXNlckF2YWlsYWJpbGl0eSA9IG5ldyBVc2VyQXZhaWxhYmlsaXR5Q29udHJvbGxlcihDb250ZXh0LCB1c2VySUQpO1xuXG4gICAgICAgIF90aGlzLl91c2VyczJvYnNlcnZlLnB1c2goQ29udGV4dCk7XG5cbiAgICAgICAgLy8gV2hlbiBPYmplY3QgaXMgZGlzY29ubmVjdGVkIHNldCB1c2VyIENvbnRleHQgc3RhdHVzIGFzIHVuYXZhaWxhYmxlXG4gICAgICAgIENvbnRleHQub25EaXNjb25uZWN0ZWQoKCk9PntcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5vbkRpc2Nvbm5lY3RlZF06ICcsIENvbnRleHQpO1xuXG4gICAgICAgICAgQ29udGV4dC5kYXRhLnZhbHVlc1swXS52YWx1ZSA9ICd1bmF2YWlsYWJsZSc7XG4gICAgICAgICAgQ29udGV4dC5zeW5jKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc29sdmUoQ29udGV4dCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9kaXNjb3ZlckFuZFN1YnNjcmliZUxlZ2FjeVVzZXJzKG5hbWUpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIF90aGlzLl9kaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0c1Blck5hbWUobmFtZSkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIuX2Rpc2NvdmVyQW5kU3Vic2NyaWJlTGVnYWN5VXNlcnNdIEFsbCBEYXRhT2JqZWN0cyBSZXN1bHQnLCByZXN1bHQpO1xuICAgICAgICByZXN1bHQuZm9yRWFjaChmdW5jdGlvbihvYmopIHtcbiAgICAgICAgICBpZiAob2JqLnN0YXR1cyA9PT0gJ2xpdmUnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTGl2ZSBvYmonLCBvYmopO1xuICAgICAgICAgICAgaWYgKCFvYmouaHlwZXJ0eUlEKSB7XG4gICAgICAgICAgICAgIG9iai5oeXBlcnR5SUQgPSBvYmoucmVwb3J0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfdGhpcy5fc3Vic2NyaWJlQ29udGV4dChvYmouc2NoZW1hLCBvYmoudXJsKS50aGVuKGZ1bmN0aW9uKHJlc3VsdFN1YnNjcmliZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5fZGlzY292ZXJBbmRTdWJzY3JpYmVMZWdhY3lVc2Vyc10gX3N1YnNjcmliZUNvbnRleHQnLCByZXN1bHRTdWJzY3JpYmUpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXN1bHRTdWJzY3JpYmUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgJywgZXJyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RvcCB0aGUgdXNlciBDb250ZXh0IG9ic2VydmF0aW9uIGZvciBhIGNlcnRhaW4gdXNlclxuICogQHBhcmFtICB7c3RyaW5nfSBDb250ZXh0ICAgICAgIHRoZSBVc2VyQXZhaWxhYmlsaXR5IERhdGEgT2JqZWN0IE9ic2VydmVyIFVSTCB0byBiZSB1bm9ic2VydmVkLlxuICovXG5cbiAgdW5vYnNlcnZlKENvbnRleHQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX3VzZXJzMm9ic2VydmUuZm9yRWFjaCgodXNlciwgaW5kZXgpID0+IHtcbiAgICAgIGlmICh1c2VyLnVybCA9PT0gQ29udGV4dCkge1xuICAgICAgICB1c2VyLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIF90aGlzLl91c2VyczJvYnNlcnZlLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbnRleHRPYnNlcnZlcjtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLy8gU2VydmljZSBGcmFtZXdvcmtcbi8vaW1wb3J0IFN5bmNoZXIgZnJvbSAnLi4vc3luY2hlci9TeW5jaGVyJztcblxuLy8gVXRpbHNcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnLi4vdXRpbHMvRXZlbnRFbWl0dGVyLmpzJztcbi8vaW1wb3J0IHtkaXZpZGVVUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcblxuLy8gaW1wb3J0IGF2YWlsYWJpbGl0eSBmcm9tICcuL2F2YWlsYWJpbGl0eS5qcyc7XG5cbi8qKlxuKiBDb250ZXh0IFJlcG9ydGVyO1xuKiBAYXV0aG9yIFBhdWxvIENoYWluaG8gW3BhdWxvLWctY2hhaW5ob0BhbHRpY2VsYWJzLmNvbV1cbiovXG5jbGFzcyBDb250ZXh0UmVwb3J0ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuXG4gIGNvbnN0cnVjdG9yKGh5cGVydHlVUkwsIGJ1cywgY29uZmlndXJhdGlvbiwgZmFjdG9yeSwgc3luY2hlcikge1xuICAgIGlmICghaHlwZXJ0eVVSTCkgdGhyb3cgbmV3IEVycm9yKCdUaGUgaHlwZXJ0eVVSTCBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcbiAgICBpZiAoIWJ1cykgdGhyb3cgbmV3IEVycm9yKCdUaGUgTWluaUJ1cyBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcignVGhlIGNvbmZpZ3VyYXRpb24gaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XG5cbiAgICBzdXBlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24pO1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGNvbnNvbGUuaW5mbygnW0NvbnRleHRSZXBvcnRlcl0gc3RhcnRlZCB3aXRoIHVybDogJywgaHlwZXJ0eVVSTCk7XG5cbiAgICB0aGlzLnN5bmNoZXIgPSBzeW5jaGVyID8gc3luY2hlciA6IGZhY3RvcnkuY3JlYXRlU3luY2hlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24pO1xuXG5cbiAgICAvLyAgICB0aGlzLmRpc2NvdmVyeSA9IG5ldyBEaXNjb3ZlcnkoaHlwZXJ0eVVSTCwgYnVzKTtcbiAgICB0aGlzLmRvbWFpbiA9IGZhY3RvcnkuZGl2aWRlVVJMKGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTCkuZG9tYWluO1xuICAgIHRoaXMuY29udGV4dHMgPSB7fTtcblxuICAgIHRoaXMuY29udGV4dERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIHRoaXMuZG9tYWluICsgJy8ud2VsbC1rbm93bi9kYXRhc2NoZW1hL0NvbnRleHQnO1xuXG5cbiAgICAvLyAgICB0aGlzLmhlYXJ0YmVhdCA9IFtdO1xuXG4gICAgdGhpcy5zeW5jaGVyLm9uTm90aWZpY2F0aW9uKChldmVudCkgPT4ge1xuICAgICAgbGV0IF90aGlzID0gdGhpcztcbiAgICAgIF90aGlzLm9uTm90aWZpY2F0aW9uKGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vVE9ETzogdW5jb21tZW50IHdoZW4gdXNlZCB3aXRoIHNlcnZpY2UgZnJhbWV3b3JrIGRldmVsb3AgYnJhbmNoXG5cbiAgICB0aGlzLnN5bmNoZXIub25DbG9zZSgoZXZlbnQpID0+IHtcblxuICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0UmVwb3J0ZXIub25DbG9zZV0nKTtcbiAgICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgICBfdGhpcy5zZXRTdGF0dXMoZXZlbnQuaWQsICd1bmF2YWlsYWJsZScpO1xuICAgICAgZXZlbnQuYWNrKCk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIC8vVE9ETzogbW92ZSB0byBVc2VyIGF2YWlsYWJpbGl0eSBSZXBvcnRlciBvciB0byBhYnN0cmFjdCBIeXBlcnR5Q29udGV4dFJlcG9ydGVyXG5cbiAgc3RhcnQoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHRoaXMuc3luY2hlci5yZXN1bWVSZXBvcnRlcnMoe3N0b3JlOiB0cnVlfSkudGhlbigocmVwb3J0ZXJzKSA9PiB7XG5cbiAgICAgICAgbGV0IHJlcG9ydGVyc0xpc3QgPSBPYmplY3Qua2V5cyhyZXBvcnRlcnMpO1xuXG4gICAgICAgIGlmIChyZXBvcnRlcnNMaXN0Lmxlbmd0aCAgPiAwKSB7XG5cbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRSZXBvcnRlci5zdGFydF0gcmVzdW1pbmcgJywgcmVwb3J0ZXJzW3JlcG9ydGVyc0xpc3RbMF1dKTtcblxuICAgICAgICAgIC8vIHNldCBhdmFpbGFiaWxpdHkgdG8gYXZhaWxhYmxlXG5cbiAgICAgICAgICBfdGhpcy5jb250ZXh0cyA9IHJlcG9ydGVycztcblxuICAgICAgICAgIC8vVE9ETzpcbiAgICAgICAgICByZXBvcnRlcnNMaXN0LmZvckVhY2goKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIF90aGlzLl9vblN1YnNjcmlwdGlvbihfdGhpcy5jb250ZXh0c1tjb250ZXh0XSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXNvbHZlKF90aGlzLmNvbnRleHRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRSZXBvcnRlci5zdGFydF0gbm90aGluZyB0byByZXN1bWUgJywgcmVwb3J0ZXJzKTtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDb250ZXh0UmVwb3J0ZXJdIFJlc3VtZSBmYWlsZWQgfCAnLCByZWFzb24pO1xuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgcmVqZWN0KCdbQ29udGV4dFJlcG9ydGVyXSBTdGFydCBmYWlsZWQgfCAnLCByZWFzb24pO1xuICAgIH0pO1xuICB9XG5cblxuICBwcm9jZXNzTm90aWZpY2F0aW9uKGV2ZW50KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBjb25zb2xlLmxvZygnW0NvbnRleHRSZXBvcnRlci5wcm9jZXNzTm90aWZpY2F0aW9uOiAnLCBldmVudCk7XG5cbiAgICBldmVudC5hY2soKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgc3RhdHVzIG9iamVjdCBzeW5jaGVyXG4gICAqIEBwYXJhbSAge1VSTC5Vc2VyVVJMfSBjb250YWN0cyBMaXN0IG9mIFVzZXJzXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICAqL1xuICBjcmVhdGUoaWQsIGluaXQsIHJlc291cmNlcywgbmFtZSA9ICdteUNvbnRleHQnLCByZXBvcnRlciA9IG51bGwsIHJldXNlVVJMID0gbnVsbCkge1xuICAgIC8vZGVidWdnZXI7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgaW5wdXQ7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghcmVwb3J0ZXIgJiYgIXJldXNlVVJMKSB7XG4gICAgICAgIGlucHV0ID0ge3Jlc291cmNlczogcmVzb3VyY2VzLCBleHBpcmVzOiAzMH07XG4gICAgICB9IGVsc2UgaWYgKHJlcG9ydGVyICYmICFyZXVzZVVSTCkge1xuICAgICAgICBpbnB1dCA9IHtyZXNvdXJjZXM6IHJlc291cmNlcywgZXhwaXJlczogMzAsIHJlcG9ydGVyOiByZXBvcnRlcn07XG4gICAgICB9IGVsc2UgaWYgKCFyZXBvcnRlciAmJiByZXVzZVVSTCkge1xuICAgICAgICBpbnB1dCA9IHtyZXNvdXJjZXM6IHJlc291cmNlcywgZXhwaXJlczogMzAsIHJldXNlVVJMOiByZXVzZVVSTH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnB1dCA9IHtyZXNvdXJjZXM6IHJlc291cmNlcywgZXhwaXJlczogMzAsIHJldXNlVVJMOiByZXVzZVVSTCwgcmVwb3J0ZXI6IHJlcG9ydGVyfTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5pbmZvKCdbQ29udGV4dFJlcG9ydGVyLmNyZWF0ZV0gbGV0cyBjcmVhdGUgYSBuZXcgVXNlciBhdmFpbGFiaWxpdHkgQ29udGV4dCBPYmplY3QgJywgaW5wdXQpO1xuICAgICAgX3RoaXMuc3luY2hlci5jcmVhdGUoX3RoaXMuY29udGV4dERlc2NVUkwsIFtdLCBpbml0LCB0cnVlLCBmYWxzZSwgbmFtZSwgbnVsbCwgaW5wdXQpXG4gICAgICAgIC50aGVuKChjb250ZXh0KSA9PiB7XG4gICAgICAgICAgX3RoaXMuY29udGV4dHNbaWRdID0gY29udGV4dDtcblxuICAgICAgICAgIF90aGlzLl9vblN1YnNjcmlwdGlvbihjb250ZXh0KTtcbiAgICAgICAgICByZXNvbHZlKGNvbnRleHQpO1xuXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuXG4gIH1cblxuICBfb25TdWJzY3JpcHRpb24oY29udGV4dCkge1xuICAgIGNvbnRleHQub25TdWJzY3JpcHRpb24oKGV2ZW50KSA9PiB7XG4gICAgICBjb25zb2xlLmluZm8oJ1tDb250ZXh0UmVwb3J0ZXIuX29uU3Vic2NyaXB0aW9uXSBhY2NlcHRpbmc6ICcsIGV2ZW50KTtcbiAgICAgIGV2ZW50LmFjY2VwdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0Q29udGV4dChpZCwgbmV3Q29udGV4dCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgY29uc29sZS5sb2coJ1RISVMgW0NvbnRleHRSZXBvcnRlci5zZXRDb250ZXh0XSBiZWZvcmUgY2hhbmdlIDonLCBfdGhpcy5jb250ZXh0c1tpZF0pO1xuICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dFJlcG9ydGVyLnNldENvbnRleHRdIGJlZm9yZSBjaGFuZ2UgOicsIF90aGlzLmNvbnRleHRzW2lkXS5kYXRhKTtcblxuICAgIC8vICAgIF90aGlzLmNvbnRleHRzW2lkXS5kYXRhLnZhbHVlc1swXS52YWx1ZSA9IG5ld0NvbnRleHQ7XG5cbiAgICBfdGhpcy5jb250ZXh0c1tpZF0uZGF0YS52YWx1ZXMgPSBuZXdDb250ZXh0O1xuICAgIGNvbnNvbGUuZGVidWcoJ1tDb250ZXh0UmVwb3J0ZXIuc2V0Q29udGV4dF0gYWZ0ZXIgY2hhbmdlIDonLCBfdGhpcy5jb250ZXh0c1tpZF0uZGF0YSk7XG4gICAgX3RoaXMudHJpZ2dlcihpZCArICctY29udGV4dC11cGRhdGUnLCBuZXdDb250ZXh0KTtcblxuICB9XG5cblxufVxuXG5leHBvcnQgZGVmYXVsdCBDb250ZXh0UmVwb3J0ZXI7XG4iLCIvKipcbiogVGhlIFVzZXJQcm9maWxlIGFjY29yZGluZyB0byBVc2VyIElkZW50aXR5IERhdGEgTW9kZWxcbiovXG5cblxuY2xhc3MgVXNlclByb2ZpbGUge1xuXG4gIGNvbnN0cnVjdG9yKHVzZXJuYW1lLCB1c2VyVVJMLCBwaWN0dXJlLCBuYW1lLCBsb2NhbGUsIHByb2ZpbGUpIHtcblxuICAgIGlmICh1c2VybmFtZSkgeyB0aGlzLnByZWZlcnJlZF91c2VybmFtZSA9IHVzZXJuYW1lOyB9XG4gICAgaWYgKHBpY3R1cmUpIHsgdGhpcy5waWN0dXJlID0gcGljdHVyZTsgfVxuICAgIGlmIChuYW1lKSB7IHRoaXMubmFtZSA9IG5hbWU7IH1cbiAgICBpZiAobG9jYWxlKSB7IHRoaXMubG9jYWxlID0gbG9jYWxlOyB9XG4gICAgaWYgKHVzZXJVUkwpIHsgdGhpcy51c2VyVVJMID0gdXNlclVSTDsgfVxuICAgIGlmIChwcm9maWxlKSBPYmplY3QuYXNzaWduKHRoaXMsIHByb2ZpbGUpO1xuXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVXNlclByb2ZpbGU7XG4iLCIvKipcbiogVGhlIElkZW50aXR5IGluZm8gdG8gYmUgYWRkZWQgdG8gTWVzc2FnZS5Cb2R5LklkZW50aXR5XG4qL1xuXG5pbXBvcnQgVXNlclByb2ZpbGUgZnJvbSAnLi9Vc2VyUHJvZmlsZSc7XG5cbmNsYXNzIE1lc3NhZ2VCb2R5SWRlbnRpdHkge1xuXG4gIGNvbnN0cnVjdG9yKHVzZXJuYW1lLCB1c2VyVVJMLCBwaWN0dXJlLCBuYW1lLCBsb2NhbGUsIGlkcCwgYXNzZXJ0aW9uLCBwcm9maWxlKSB7XG5cbiAgICBpZiAoIWlkcCkgdGhyb3cgbmV3IEVycm9yKCdJRFAgc2hvdWxkIGJlIGEgcGFyYW1ldGVyJyk7XG4gICAgaWYgKCF1c2VybmFtZSkgdGhyb3cgbmV3IEVycm9yKCd1c2VybmFtZSBzaG91bGQgYmUgYSBwYXJhbWV0ZXInKTtcblxuICAgIHRoaXMuaWRwID0gaWRwO1xuXG4gICAgaWYgKGFzc2VydGlvbikgICAgICB7IHRoaXMuYXNzZXJ0aW9uID0gYXNzZXJ0aW9uOyB9XG4gICAgdGhpcy51c2VyUHJvZmlsZSA9IG5ldyBVc2VyUHJvZmlsZSh1c2VybmFtZSwgdXNlclVSTCwgcGljdHVyZSwgbmFtZSwgbG9jYWxlLCBwcm9maWxlKTtcblxuICB9XG5cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlQm9keUlkZW50aXR5O1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG5leHBvcnQgY29uc3QgQ29tbXVuaWNhdGlvblN0YXR1cyA9IHtcbiAgT1BFTjogJ29wZW4nLFxuICBQRU5ESU5HOiAncGVuZGluZycsXG4gIENMT1NFRDogJ2Nsb3NlZCcsXG4gIFBBVVNFRDogJ3BhdXNlZCcsXG4gIEZBSUxFRDogJ2ZhaWxlZCdcbn07XG5cbmV4cG9ydCBsZXQgY29tbXVuaWNhdGlvbk9iamVjdCA9IHtcbiAgc3RhcnRpbmdUaW1lOiAnJyxcbiAgc3RhdHVzOiAnJyxcbiAgcGFydGljaXBhbnRzOiB7fVxufTtcblxuZXhwb3J0IGxldCBjb21tdW5pY2F0aW9uQ2hpbGRyZW4gPSB7XG4gIFwicGFyZW50XCIgOiBcImNvbW11bmljYXRpb25cIixcbiAgXCJsaXN0ZW5lclwiIDogXCJyZXNvdXJjZXNcIixcbiAgXCJ0eXBlXCIgOiBcIkh5cGVydHlSZXNvdXJjZVwiXG59O1xuXG4vKlxuZXhwb3J0IGxldCBjb21tdW5pY2F0aW9uT2JqZWN0ID0ge1xuICBpZDogJycsXG4gIG5hbWU6ICcnLFxuICBvd25lcjogJycsXG4gIHNjaGVtZTogJ2NvbW0nLFxuICBzdGFydGluZ1RpbWU6ICcnLFxuICBsYXN0TW9kaWZpZWQ6ICcnLFxuICBkdXJhdGlvbjogJycsXG4gIHN0YXR1czogJycsXG4gIHBhcnRpY2lwYW50czogW11cbn07XG4qL1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vKipcbiogVG8gbWFuYWdlIEdyb3VwIENoYXQgSW52aXRhdGlvbnNcbiogQGF1dGhvciBQYXVsbyBDaGFpbmhvIFtwYXVsby1nLWNoYWluaG9AYWx0aWNlbGFicy5jb21dXG4qIEB2ZXJzaW9uIDAuMS4wXG4qL1xuXG4vLyBUT0RPOiBoYXZlIGFuIGluc3RhbmNlIHBlciBDaGF0Q29udHJvbGxlclxuXG5jbGFzcyBJbnZpdGF0aW9uc0hhbmRsZXIge1xuXG4gIGNvbnN0cnVjdG9yKGh5cGVydHlVUkwpIHtcblxuICAgIGlmICghaHlwZXJ0eVVSTCkgdGhyb3cgRXJyb3IoJ2h5cGVydHlVUkwgaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9oeXBlcnR5VVJMID0gaHlwZXJ0eVVSTDtcblxuICAgIF90aGlzLl9wZW5kaW5nID0ge307IC8vIEFsbCBwZW5kaW5nIGludml0YXRpb25zXG4gIH1cblxuICBzZXQgaW52aXRhdGlvblJlc3BvbnNlKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5faW52aXRhdGlvbnNSZXNwb25zZSA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBoYW5kbGUgbm90aWZpY2F0aW9ucyBmb3IgZGlzY29ubmVjdGVkIEh5K2VydGllcy5cbiAgICogQHBhcmFtICB7RGlzY292ZXJlZE9iamVjdFtdfSAgICBkaXNjb25uZWN0ZWQgIGFycmF5IG9mIGRpc2NvdmVyZWQgaHlwZXJ0aWVzIHRoYXQgYXJlIGRpc2Nvbm5lY3RlZFxuICAgKiBAcGFyYW0gIHtEYXRhT2JqZWN0UmVwb3J0ZXJ9ICAgIERhdGFPYmplY3RSZXBvcnRlciAgIERhdGEgT2JqZWN0IFJlcG9ydGVyIGFkZHJlc3NlZCBieSBpbnZpdGF0aW9uc1xuICAgKi9cblxuICBpbnZpdGVEaXNjb25uZWN0ZWRIeXBlcnRpZXMoZGlzY29ubmVjdGVkLCBkYXRhT2JqZWN0UmVwb3J0ZXIpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgY29uc29sZS5sb2coJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5pbnZpdGVEaXNjb25uZWN0ZWRIeXBlcnRpZXNdIGxldHMgaW52aXRlICcsIGRpc2Nvbm5lY3RlZCk7XG5cbiAgICBkaXNjb25uZWN0ZWQuZm9yRWFjaCgoZGlzY29ubmVjdGVkSHlwZXJ0eSk9PntcblxuICAgICAgaWYgKCFfdGhpcy5fcGVuZGluZ1tkYXRhT2JqZWN0UmVwb3J0ZXJdKSB7XG4gICAgICAgIF90aGlzLl9wZW5kaW5nW2RhdGFPYmplY3RSZXBvcnRlcl0gPSB7fTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3BlbmRpbmdbZGF0YU9iamVjdFJlcG9ydGVyXVtkaXNjb25uZWN0ZWRIeXBlcnR5LmRhdGEuaHlwZXJ0eUlEXSA9IGRpc2Nvbm5lY3RlZEh5cGVydHk7XG5cbiAgICAgIGRpc2Nvbm5lY3RlZEh5cGVydHkub25MaXZlKF90aGlzLl9oeXBlcnR5VVJMLCgpPT57XG4gICAgICAgIGNvbnNvbGUubG9nKCdbR3JvdXBDaGF0TWFuYWdlci5jcmVhdGVdIGRpc2Nvbm5lY3RlZCBIeXBlcnR5IGlzIGJhY2sgdG8gbGl2ZScsIGRpc2Nvbm5lY3RlZEh5cGVydHkpO1xuXG4gICAgICAgIGRhdGFPYmplY3RSZXBvcnRlci5pbnZpdGVPYnNlcnZlcnMoW2Rpc2Nvbm5lY3RlZEh5cGVydHkuZGF0YS5oeXBlcnR5SURdKTtcblxuICAgICAgICBkaXNjb25uZWN0ZWRIeXBlcnR5LnVuc3Vic2NyaWJlTGl2ZShfdGhpcy5faHlwZXJ0eVVSTCk7XG5cbiAgICAgICAgZGVsZXRlIF90aGlzLl9wZW5kaW5nW2RhdGFPYmplY3RSZXBvcnRlcl1bZGlzY29ubmVjdGVkSHlwZXJ0eS5kYXRhLmh5cGVydHlJRF07XG5cbiAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJvY2VzcyBzZW50IGludml0YXRpb25zLiBJbiBjYXNlIGludml0YXRpb25zIGFyZSBub3QgYWNrbm93bGVkZ2UgYnkgcmVjaXBpZW50IGl0IHdpbGwgYmUgaGFuZGxlZCBhcyBhIGRpc2Nvbm5lY3RlZCBoeXBlcnR5XG4gICAqIEBwYXJhbSAge0Rpc2NvdmVyZWRPYmplY3RbXX0gICAgbGl2ZSAgYXJyYXkgb2YgZGlzY292ZXJlZCBoeXBlcnRpZXMgdGhhdCBhcmUgb3Igd2VyZSBsaXZlXG4gICAqIEBwYXJhbSAge0RhdGFPYmplY3RSZXBvcnRlcn0gICAgRGF0YU9iamVjdFJlcG9ydGVyICAgRGF0YSBPYmplY3QgUmVwb3J0ZXIgYWRkcmVzc2VkIGJ5IGludml0YXRpb25zXG4gICAqL1xuXG4gIHByb2Nlc3NJbnZpdGF0aW9ucyhsaXZlLCBkYXRhT2JqZWN0UmVwb3J0ZXIpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IGludml0YXRpb25zID0gZGF0YU9iamVjdFJlcG9ydGVyLmludml0YXRpb25zIHx8IFtdO1xuXG4gICAgY29uc29sZS5sb2coJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5wcm9jZXNzSW52aXRhdGlvbnNdIHdhaXRpbmcgZm9yIHJlcGxpZXMgJywgaW52aXRhdGlvbnMsIHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UpO1xuXG4gICAgaW52aXRhdGlvbnMuZm9yRWFjaCgoaW52aXRhdGlvbikgPT4ge1xuICAgICAgaW52aXRhdGlvbi50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5wcm9jZXNzSW52aXRhdGlvbnNdIC0gT0s6ICcsIHJlc3VsdCwgdGhpcy5faW52aXRhdGlvbnNSZXNwb25zZSk7XG4gICAgICAgIGlmICh0aGlzLl9pbnZpdGF0aW9uc1Jlc3BvbnNlKSB7IHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UocmVzdWx0KTsgfVxuICAgICAgfSkuY2F0Y2goKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnW0dyb3VwQ2hhdE1hbmFnZXIuSW52aXRhdGlvbnNIYW5kbGVyLnByb2Nlc3NJbnZpdGF0aW9uc10gLSBOT1QgT0s6ICcsIHJlc3VsdCwgdGhpcy5faW52aXRhdGlvbnNSZXNwb25zZSk7XG4gICAgICAgIGlmICh0aGlzLl9pbnZpdGF0aW9uc1Jlc3BvbnNlKSB7IHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UocmVzdWx0KTsgfVxuICAgICAgICBfdGhpcy5pbnZpdGVEaXNjb25uZWN0ZWRIeXBlcnRpZXMoW2xpdmVbcmVzdWx0Lmludml0ZWRdXSwgZGF0YU9iamVjdFJlcG9ydGVyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIH1cblxuICByZXN1bWVEaXNjb3ZlcmllcyhkaXNjb3ZlcnlFbmdpbmUsIGdyb3VwQ2hhdCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBsZXQgbGl2ZSA9IHt9O1xuICAgICAgbGV0IGxpdmVIeXBlcnRpZXMgPSBbXTtcbiAgICAgIGxldCBkaXNjb25uZWN0ZWQgPSBbXTtcbiAgICAgIGxldCB1bnN1YnNjcmlwdG9uUHJvbWlzZXMgPSBbXTtcblxuICAgICAgZGlzY292ZXJ5RW5naW5lLnJlc3VtZURpc2NvdmVyaWVzKCkudGhlbigoZGlzY292ZXJpZXMpID0+IHtcblxuICAgICAgICBjb25zb2xlLmxvZygnW0dyb3VwQ2hhdE1hbmFnZXIuSW52aXRhdGlvbnNIYW5kbGVyLnJlc3VtZURpc2NvdmVyaWVzXSBmb3VuZDogJywgZGlzY292ZXJpZXMpO1xuXG4gICAgICAgIGRpc2NvdmVyaWVzLmZvckVhY2goKGRpc2NvdmVyeSkgPT57XG5cbiAgICAgICAgICBpZiAoZGlzY292ZXJ5LmRhdGEucmVzb3VyY2VzICYmIGRpc2NvdmVyeS5kYXRhLnJlc291cmNlc1swXSA9PT0gJ2NoYXQnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0dyb3VwQ2hhdE1hbmFnZXIuSW52aXRhdGlvbnNIYW5kbGVyLnJlc3VtZURpc2NvdmVyaWVzXSByZXN1bWluZzogJywgZGlzY292ZXJ5KTtcblxuICAgICAgICAgICAgaWYgKGRpc2NvdmVyeS5kYXRhLnN0YXR1cyA9PT0gJ2xpdmUnICkgey8vIHByZXZpb3VzbHkgZGlzY292ZXJlZCBvYmplY3QgaXMgbm93IGxpdmVcbiAgICAgICAgICAgICAgbGl2ZVtkaXNjb3ZlcnkuZGF0YS5oeXBlcnR5SURdID0gZGlzY292ZXJ5O1xuICAgICAgICAgICAgICBsaXZlSHlwZXJ0aWVzLnB1c2goZGlzY292ZXJ5LmRhdGEuaHlwZXJ0eUlEKTtcbiAgICAgICAgICAgICAgdW5zdWJzY3JpcHRvblByb21pc2VzLnB1c2goIGRpc2NvdmVyeS51bnN1YnNjcmliZUxpdmUoX3RoaXMuX2h5cGVydHlVUkwpICk7XG4gICAgICAgICAgICB9IGVsc2Ugey8vIHByZXZpb3VzbHkgZGlzY292ZXJlZCBvYmplY3QgaXMgc3RpbGwgZGlzY29ubmVjdGVkXG4gICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZC5wdXNoKGRpc2NvdmVyeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGRpc2Nvbm5lY3RlZC5sZW5ndGggPiAwKSBfdGhpcy5pbnZpdGVEaXNjb25uZWN0ZWRIeXBlcnRpZXMoZGlzY29ubmVjdGVkLCBncm91cENoYXQpO1xuXG4gICAgICAgIGlmICggT2JqZWN0LmtleXMobGl2ZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGdyb3VwQ2hhdC5pbnZpdGVPYnNlcnZlcnMobGl2ZUh5cGVydGllcyk7XG5cbiAgICAgICAgICBpZiAoZ3JvdXBDaGF0Lmludml0YXRpb25zLmxlbmd0aCA+IDApIF90aGlzLnByb2Nlc3NJbnZpdGF0aW9ucyhsaXZlLCBncm91cENoYXQpO1xuXG4gICAgICAgICAgUHJvbWlzZS5hbGwodW5zdWJzY3JpcHRvblByb21pc2VzKS50aGVuKCgpPT57IHJlc29sdmUoKX0pO1xuXG4gICAgICAgIH0gZWxzZSByZXNvbHZlKCk7XG5cbiAgICAgIH0pO1xuICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICByZWplY3QoJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5yZXN1bWVEaXNjb3Zlcmllc10gZmFpbGVkIHwgJywgcmVhc29uKTtcbiAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSBhbmQgY2xlYW4gYWxsIHBlbmRpbmcgaW52aXRhdGlvbnMuXG4gICAqIEBwYXJhbSAge0RhdGFPYmplY3RSZXBvcnRlcn0gICAgRGF0YU9iamVjdFJlcG9ydGVyICAgRGF0YSBPYmplY3QgUmVwb3J0ZXIgYWRkcmVzc2VkIGJ5IGludml0YXRpb25zXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IHJldHVybiBhIHByb21pc2Ugd2hlbiBhbGwgdW5zdWJzY3JpcHRvbnMgZm9yIHBlbmRpbmcgaW52aXRhdGlvbnMgYXJlIGZpbmlzaGVkXG4gICAqL1xuXG4gIGNsZWFuSW52aXRhdGlvbnMoZGF0YU9iamVjdFJlcG9ydGVyKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBjaGF0SW52aXRhdGlvbnMgPSBfdGhpcy5fcGVuZGluZ1tkYXRhT2JqZWN0UmVwb3J0ZXJdO1xuXG4gICAgY29uc29sZS5sb2coJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5jbGVhbkludml0YXRpb25zXSAnLCBjaGF0SW52aXRhdGlvbnMpO1xuXG4gICAgaWYgKGNoYXRJbnZpdGF0aW9ucykge1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgcGVuZGluZ0ludml0YXRpb25zID0gT2JqZWN0LmtleXMoY2hhdEludml0YXRpb25zKTtcblxuICAgICAgICBsZXQgdW5zdWJzY3JpcHRvblByb21pc2VzID0gW107XG5cbiAgICAgICAgcGVuZGluZ0ludml0YXRpb25zLmZvckVhY2goKGludml0YXRpb24pPT57XG4gICAgICAgICAgdW5zdWJzY3JpcHRvblByb21pc2VzLnB1c2goIGNoYXRJbnZpdGF0aW9uc1tpbnZpdGF0aW9uXS51bnN1YnNjcmliZUxpdmUoX3RoaXMuX2h5cGVydHlVUkwpICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFByb21pc2UuYWxsKHBlbmRpbmdJbnZpdGF0aW9ucykudGhlbigoKT0+eyByZXNvbHZlKCk7IH0pO1xuXG4gICAgICB9KTtcblxuICAgIH0gZWxzZSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblxuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW52aXRhdGlvbnNIYW5kbGVyO1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vKipcbiogVGhlIEdyb3VwIENoYXQgQVBJIGlzIHVzZWQgdG8gY29udHJvbCBhIEdyb3VwIENoYXQgaW5zdGFuY2UuXG4qIEBhdXRob3IgVml0b3IgU2lsdmEgW3ZpdG9yLXQtc2lsdmFAdGVsZWNvbS5wdF1cbiogQHZlcnNpb24gMC4xLjBcbiovXG5cbi8vaW1wb3J0IHsgVXNlckluZm8gfSBmcm9tICcuL1VzZXJJbmZvJztcbmltcG9ydCBSZWdpc3RyYXRpb25TdGF0dXMgZnJvbSAnLi4vZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cyc7XG5pbXBvcnQgSW52aXRhdGlvbnNIYW5kbGVyIGZyb20gJy4vSW52aXRhdGlvbnNIYW5kbGVyJztcblxuY2xhc3MgQ2hhdENvbnRyb2xsZXIge1xuXG4gIGNvbnN0cnVjdG9yKHN5bmNoZXIsIGRpc2NvdmVyeSwgZG9tYWluLCBzZWFyY2gsIGlkZW50aXR5LCBtYW5hZ2VyKSB7XG5cbiAgICBpZiAoIXN5bmNoZXIpIHRocm93IEVycm9yKCdTeW5jaGVyIGlzIGEgbmVjZXNzYXJ5IGRlcGVuZGVjeScpO1xuICAgIGlmICghZGlzY292ZXJ5KSB0aHJvdyBFcnJvcignRGlzY292ZXIgaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XG4gICAgaWYgKCFkb21haW4pIHRocm93IEVycm9yKCdEb21haW4gaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XG4gICAgaWYgKCFzZWFyY2gpIHRocm93IEVycm9yKCdTZWFyY2ggaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9zeW5jaGVyID0gc3luY2hlcjtcbiAgICBfdGhpcy5kaXNjb3ZlcnkgPSBkaXNjb3Zlcnk7XG4gICAgX3RoaXMuc2VhcmNoID0gc2VhcmNoO1xuICAgIF90aGlzLm15SWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdyZXBvcnRlcic7XG4gICAgX3RoaXMuY2hpbGRfY3NlcSA9IDA7XG4gICAgX3RoaXMuZG9tYWluID0gZG9tYWluO1xuXG4gICAgX3RoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuXG4gICAgY29uc3QgaHlwZXJ0eVVSTCA9IHN5bmNoZXIub3duZXI7XG5cbiAgICBfdGhpcy5fb2JqZWN0RGVzY1VSTCA9ICdoeXBlcnR5LWNhdGFsb2d1ZTovL2NhdGFsb2d1ZS4nICsgZG9tYWluICsgJy8ud2VsbC1rbm93bi9kYXRhc2NoZW1hL0NvbW11bmljYXRpb24nO1xuXG4gICAgX3RoaXMuX2ludml0YXRpb25zSGFuZGxlciA9IG5ldyBJbnZpdGF0aW9uc0hhbmRsZXIoaHlwZXJ0eVVSTCk7XG5cbiAgfVxuXG4gIGdldCBpbnZpdGF0aW9uc0hhbmRsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludml0YXRpb25zSGFuZGxlcjtcbiAgfVxuXG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbGxlck1vZGUgPT09ICdyZXBvcnRlcicgPyB0aGlzLmRhdGFPYmplY3RSZXBvcnRlci51cmwgOiB0aGlzLmRhdGFPYmplY3RPYnNlcnZlci51cmw7XG4gIH1cblxuICBzZXQgZGF0YU9iamVjdFJlcG9ydGVyKGRhdGFPYmplY3RSZXBvcnRlcikge1xuXG4gICAgaWYgKCFkYXRhT2JqZWN0UmVwb3J0ZXIpIHRocm93IG5ldyBFcnJvcignW0NoYXRDb250cm9sbGVyXSBUaGUgZGF0YSBvYmplY3QgcmVwb3J0ZXIgaXMgbmVjZXNzYXJ5IHBhcmFtZXRlciAnKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuY29udHJvbGxlck1vZGUgPSAncmVwb3J0ZXInO1xuXG4gICAgLy8gSGFuZGxlciB0byBwcm9jZXNzIHJlY2VpdmVkIGZpbGVzXG5cbiAgICAvLyBkYXRhT2JqZWN0UmVwb3J0ZXIub25SZXNwb25zZShmdW5jdGlvbihldmVudCkge1xuICAgIC8vICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0UmVwb3J0ZXIgLSBvblJlc3BvbnNlXScsIGV2ZW50KTtcbiAgICAvLyAgIGlmIChfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UpIHtcbiAgICAvLyAgICAgX3RoaXMuX29uSW52aXRhdGlvblJlc3BvbnNlKGV2ZW50KTtcbiAgICAvLyAgIH1cbiAgICAvL1xuICAgIC8vIH0pO1xuXG4gICAgZGF0YU9iamVjdFJlcG9ydGVyLm9uU3Vic2NyaXB0aW9uKGZ1bmN0aW9uKGV2ZW50KSB7XG5cbiAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICBjYXNlICdzdWJzY3JpYmUnOiBfdGhpcy5fb25TdWJzY3JpYmUoZXZlbnQpOyBicmVhaztcbiAgICAgICAgY2FzZSAndW5zdWJzY3JpYmUnOiBfdGhpcy5fb25VbnN1YnNjcmliZShldmVudCk7IGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgX3RoaXMuX3NldE9uQWRkQ2hpbGRMaXN0ZW5lcihkYXRhT2JqZWN0UmVwb3J0ZXIpO1xuXG4gICAgZGF0YU9iamVjdFJlcG9ydGVyLm9uUmVhZCgoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LmFjY2VwdCgpO1xuICAgIH0pO1xuXG4gICAgZGF0YU9iamVjdFJlcG9ydGVyLm9uRXhlY3V0ZSgoZXZlbnQpID0+IHtcbiAgICAgIHN3aXRjaCAoZXZlbnQubWV0aG9kKSB7XG4gICAgICAgIGNhc2UgJ2FkZFVzZXInOlxuICAgICAgICAgIF90aGlzLmFkZFVzZXIoZXZlbnQucGFyYW1zWzBdKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGV2ZW50LmFjY2VwdCgpO1xuICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignUmVhc29uOicsIHJlYXNvbik7XG4gICAgICAgICAgICBldmVudC5yZWplY3QocmVhc29uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdyZW1vdmVVc2VyJzpcbiAgICAgICAgICAgIF90aGlzLnJlbW92ZVVzZXIoZXZlbnQucGFyYW1zKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgZXZlbnQuYWNjZXB0KCk7XG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignUmVhc29uOicsIHJlYXNvbik7XG4gICAgICAgICAgICAgIGV2ZW50LnJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDogZXZlbnQucmVqZWN0KCdbQ2hhdENvbnRyb2xsZXIub25FeGVjdXRlXSBDaGF0IG1ldGhvZCBleGVjdXRpb24gbm90IGFjY2VwdGVkIGJ5IFJlcG9ydGVyJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpcy5fZGF0YU9iamVjdFJlcG9ydGVyID0gZGF0YU9iamVjdFJlcG9ydGVyO1xuXG4gIH1cblxuICBnZXQgZGF0YU9iamVjdFJlcG9ydGVyKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9kYXRhT2JqZWN0UmVwb3J0ZXI7XG4gIH1cblxuICBnZXQgbWVzc2FnZXMoKSB7XG5cbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlci5fY2hpbGRyZW5PYmplY3RzIDogdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyLl9jaGlsZHJlbk9iamVjdHM7XG4gIH1cblxuICBzZXQgZGF0YU9iamVjdE9ic2VydmVyKGRhdGFPYmplY3RPYnNlcnZlcikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdvYnNlcnZlcic7XG5cbiAgICBfdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyID0gZGF0YU9iamVjdE9ic2VydmVyO1xuXG4gICAgZGF0YU9iamVjdE9ic2VydmVyLm9uQ2hhbmdlKCcqJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXU9ic2VydmVyIC0gb25DaGFuZ2UnLCBldmVudCk7XG5cbiAgICAgIGlmIChldmVudC5maWVsZC5pbmNsdWRlcygncGFydGljaXBhbnRzJykpIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5jVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2FkZCc6XG4gICAgICAgICAgICBpZiAoX3RoaXMuX29uVXNlckFkZGVkKSBfdGhpcy5fb25Vc2VyQWRkZWQoZXZlbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdyZW1vdmUnOlxuICAgICAgICAgICAgaWYgKF90aGlzLl9vblVzZXJSZW1vdmVkKSBfdGhpcy5fb25Vc2VyUmVtb3ZlZChldmVudCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMuX29uQ2hhbmdlKSBfdGhpcy5fb25DaGFuZ2UoZXZlbnQpO1xuXG4gICAgfSk7XG5cbiAgICBfdGhpcy5fc2V0T25BZGRDaGlsZExpc3RlbmVyKGRhdGFPYmplY3RPYnNlcnZlcik7XG5cbiAgICAvLyBsZXQgY2hpbGRyZW5zID0gZGF0YU9iamVjdE9ic2VydmVyLmNoaWxkcmVucztcbiAgICAvLyBPYmplY3Qua2V5cyhjaGlsZHJlbnMpLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgLy8gICBpZiAoX3RoaXMuX29uTWVzc2FnZSkgX3RoaXMuX29uTWVzc2FnZSh7XG4gICAgLy8gICAgIGNoaWxkSWQ6IGNoaWxkLFxuICAgIC8vICAgICBpZGVudGl0eTogY2hpbGRyZW5zW2NoaWxkXS5pZGVudGl0eSxcbiAgICAvLyAgICAgdmFsdWU6IGNoaWxkcmVuc1tjaGlsZF0uZGF0YVxuICAgIC8vICAgfSk7XG4gICAgLy8gfSlcblxuICB9XG5cbiAgZ2V0IGRhdGFPYmplY3RPYnNlcnZlcigpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyO1xuICB9XG5cbiAgX3NldE9uQWRkQ2hpbGRMaXN0ZW5lcihkYXRhT2JqZWN0KSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgZGF0YU9iamVjdC5vbkFkZENoaWxkKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBfdGhpcy5jaGlsZF9jc2VxICs9MTtcbiAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLl9zZXRPbkFkZENoaWxkTGlzdGVuZXJdIG5ldyBDaGlsZCByZWNlaXZlZDogJywgY2hpbGQpO1xuXG4gICAgICBpZiAoX3RoaXMuX29uTWVzc2FnZSkgX3RoaXMuX29uTWVzc2FnZShjaGlsZCk7XG4gICAgfSk7XG5cbiAgfVxuXG5cbiAgZ2V0IGRhdGFPYmplY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbGxlck1vZGUgPT09ICdyZXBvcnRlcicgPyB0aGlzLmRhdGFPYmplY3RSZXBvcnRlciA6IHRoaXMuZGF0YU9iamVjdE9ic2VydmVyO1xuICB9XG5cbiAgc2V0IGNsb3NlRXZlbnQoZXZlbnQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9jbG9zZUV2ZW50ID0gZXZlbnQ7XG5cbiAgICBpZiAoX3RoaXMuX29uQ2xvc2UpIF90aGlzLl9vbkNsb3NlKGV2ZW50KTtcbiAgfVxuXG4gIGdldCBjbG9zZUV2ZW50KCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9jbG9zZUV2ZW50O1xuICB9XG5cblxuXG4gIF9vblN1YnNjcmliZShldmVudCkge1xuXG4gICAgbGV0IGRhdGFPYmplY3RSZXBvcnRlciA9IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcblxuICAgIGV2ZW50LmFjY2VwdCgpO1xuXG5cbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uU3Vic2NyaWJlXSBldmVudCcsIGV2ZW50LCBkYXRhT2JqZWN0UmVwb3J0ZXIudXJsKTtcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uU3Vic2NyaWJlXSBOZXcgdXNlciBoYXMgc3Vic2NyaWJlIHRoaXMgb2JqZWN0OiAnLCBkYXRhT2JqZWN0UmVwb3J0ZXIuZGF0YSwgZXZlbnQuaWRlbnRpdHkpO1xuXG4gICAgbGV0IGlkZW50aXR5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShldmVudC5pZGVudGl0eSkpO1xuXG4gICAgaWYgKGlkZW50aXR5Lmhhc093blByb3BlcnR5KCdhc3NlcnRpb24nKSkge1xuICAgICAgZGVsZXRlIGlkZW50aXR5LmFzc2VydGlvblxuICAgIH1cblxuICAgIGxldCB1c2VySW5mbyA9IHtcbiAgICAgIGh5cGVydHlVUkw6IGV2ZW50LnVybCxcbiAgICAgIGRvbWFpbjogZXZlbnQuZG9tYWluLFxuICAgICAgaWRlbnRpdHk6IGlkZW50aXR5XG4gICAgfVxuICAgIGxldCB1c2VyVVJMID0gZXZlbnQuaWRlbnRpdHkudXNlclByb2ZpbGUuZ3VpZDtcblxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdICBuZXcgcGFydGljaXBhbnQnLCB1c2VySW5mbyk7XG4gICAgaWYgKGV2ZW50LmlkZW50aXR5LmxlZ2FjeSkge1xuICAgICB1c2VySW5mby5sZWdhY3kgPSBldmVudC5pZGVudGl0eS5sZWdhY3k7XG4gICAgfVxuXG4gICAgZGF0YU9iamVjdFJlcG9ydGVyLmRhdGEucGFydGljaXBhbnRzW3VzZXJVUkxdID0gdXNlckluZm87XG5cbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uU3Vic2NyaWJlXSBjb21tdW5pY2F0aW9uT2JqZWN0IE9CSiBjaGF0Y29udHJvbGxlcicsIGRhdGFPYmplY3RSZXBvcnRlci5kYXRhLnBhcnRpY2lwYW50cyk7XG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZSAtIG9uU3Vic2NyaXB0aW9uXSAnLCB1c2VySW5mbyk7XG4gICAgLy8gY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZSAtIHRoaXMuX29uVXNlckFkZGVkXSAnLCB0aGlzLl9vblVzZXJBZGRlZCk7XG5cbiAgICBpZiAodGhpcy5fb25Vc2VyQWRkZWQpIHRoaXMuX29uVXNlckFkZGVkKHVzZXJJbmZvKTtcbiAgfVxuXG4gIF9vblVuc3Vic2NyaWJlKGV2ZW50KSB7XG4gICAgbGV0IGRhdGFPYmplY3RSZXBvcnRlciA9IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcblxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZV0gZXZlbnQnLCBldmVudCwgZGF0YU9iamVjdFJlcG9ydGVyLnVybCk7XG5cbiAgICBsZXQgcGFydGljaXBhbnQgPSBldmVudC5pZGVudGl0eS51c2VyUHJvZmlsZTtcblxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZV0gIHBhcnRpY2lwYW50IGxlZnQnLCBwYXJ0aWNpcGFudCk7XG4gICAgaWYgKGV2ZW50LmlkZW50aXR5LmxlZ2FjeSkge1xuICAgICAgcGFydGljaXBhbnQubGVnYWN5ID0gZXZlbnQuaWRlbnRpdHkubGVnYWN5O1xuICAgIH1cblxuICAgIGRlbGV0ZSBkYXRhT2JqZWN0UmVwb3J0ZXIuZGF0YS5wYXJ0aWNpcGFudHNbcGFydGljaXBhbnQudXNlclVSTF07XG5cbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uVW5zdWJzY3JpYmUgLSB0aGlzLl9vblVzZXJSZW1vdmVkXSAnLCB0aGlzLm9uVXNlclJlbW92ZWQpO1xuICAgIGlmICh0aGlzLl9vblVzZXJSZW1vdmVkKSB0aGlzLl9vblVzZXJSZW1vdmVkKHBhcnRpY2lwYW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGZpbGUuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICAgIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICBJcyB0aGUgZmlsZSB0byBiZSBzZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbW11bmljYXRpb24uQ2hhdE1lc3NhZ2U+fSAgICAgICAgSXQgcmV0dXJucyB0aGUgQ2hhdE1lc3NhZ2UgY2hpbGQgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIFN5bmNoZXIgYXMgYSBQcm9taXNlLlxuICAgKi9cbiAgc2VuZEZpbGUoZmlsZSkge1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgbW9kZSA9IF90aGlzLmNvbnRyb2xsZXJNb2RlO1xuICAgIGxldCBkYXRhT2JqZWN0ID0gbW9kZSA9PT0gJ3JlcG9ydGVyJyA/IF90aGlzLmRhdGFPYmplY3RSZXBvcnRlciA6IF90aGlzLmRhdGFPYmplY3RPYnNlcnZlcjtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgbGV0IGlkZW50aXR5ID0ge1xuICAgICAgICB1c2VyUHJvZmlsZTogX3RoaXMubXlJZGVudGl0eVxuICAgICAgfTtcblxuICAgICAgZGF0YU9iamVjdC5hZGRIeXBlcnR5UmVzb3VyY2UoJ3Jlc291cmNlcycsICdmaWxlJywgIGZpbGUsIGlkZW50aXR5KS50aGVuKGZ1bmN0aW9uKHJlc291cmNlRmlsZSkge1xuXG4gICAgICAgICAgbGV0IGlkZW50aXR5ID0ge1xuICAgICAgICAgICAgICB1c2VyUHJvZmlsZTogX3RoaXMubXlJZGVudGl0eVxuICAgICAgICAgIH07XG4gICAgICAgICAgbGV0IGZpbGVTZW50RXZ0ID0geyB2YWx1ZSA6IHJlc291cmNlRmlsZSwgaWRlbnRpdHk6IGlkZW50aXR5LCByZXNvdXJjZTogcmVzb3VyY2VGaWxlfTtcblxuICAgICAgICAgIGxldCByZXBvcnRlclN0YXR1cyA9IG5ldyBSZWdpc3RyYXRpb25TdGF0dXMoZGF0YU9iamVjdC51cmwsIF90aGlzLl9tYW5hZ2VyLl9ydW50aW1lVVJMLCBfdGhpcy5fbWFuYWdlci5faHlwZXJ0eVVSTCwgX3RoaXMuX21hbmFnZXIuX2J1cyApO1xuXG4gICAgICAgICAgLy8gcmVjdXJzaXZlIGZ1bmN0aW9uIHRvIHN5bmMgd2l0aCBjaGF0IHJlcG9ydGVyXG5cbiAgICAgICAgICAgIGxldCBzaGFyZTJSZXBvcnRlciA9IGZ1bmN0aW9uKGZpbGUsIHN1YnNjcmliZXIsIGV2dCwgc3RhdHVzKSB7XG4gICAgICAgICAgICAgIGxldCBzdGF0dXNPZlJlcG9ydGVyID0gc3RhdHVzO1xuICAgICAgICAgICAgICBmaWxlLnNoYXJpbmdTdGF0dXMudGhlbihyZXNvbHZlKGV2dCkpLmNhdGNoKChyZXN1bHQpPT57XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5zZW5kRmlsZV0gc2hhcmUgZmFpbGVkOiAnLCByZXN1bHQpO1xuXG4gICAgICAgICAgICAgICAgc3RhdHVzT2ZSZXBvcnRlci5vbkxpdmUoIHN1YnNjcmliZXIsICgpID0+IHtcbiAgICAgICAgICAgICAgICBzdGF0dXNPZlJlcG9ydGVyLnVuc3Vic2NyaWJlTGl2ZShzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgICAgICBmaWxlLnNoYXJlKHRydWUpO1xuICAgICAgICAgICAgICAgIHNoYXJlMlJlcG9ydGVyKGZpbGUsIHN1YnNjcmliZXIsIGV2dCwgc3RhdHVzT2ZSZXBvcnRlcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAvL1RPRE86IHN1YnNjcmliZSB0byBzeW5jIHdoZW4gcmVwb3J0ZXIgaXMgbGl2ZS4gTmV3IHN5bmNoZWQgbWVzc2FnZXMgc2hvdWxkIHRyaWdnZXIgb25NZXNzYWdlIGllIG9uQ2hpbGRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNoYXJlMlJlcG9ydGVyKHJlc291cmNlRmlsZSwgX3RoaXMuX21hbmFnZXIuX2h5cGVydHlVUkwsIGZpbGVTZW50RXZ0LCByZXBvcnRlclN0YXR1cyk7XG4gICAgICAgIH0pO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgY29uc29sZS5lcnJvcignUmVhc29uOicsIHJlYXNvbik7XG4gICAgICByZWplY3QocmVhc29uKTtcbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGEgY2hhdCBtZXNzYWdlLlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgICBtZXNzYWdlICAgICAgICAgICAgICAgICAgICAgICAgSXMgdGhlIENoYXRNZXNzYWdlIHRvIGJlIHNlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q29tbXVuaWNhdGlvbi5DaGF0TWVzc2FnZT59ICAgICAgICBJdCByZXR1cm5zIHRoZSBDaGF0TWVzc2FnZSBjaGlsZCBvYmplY3QgY3JlYXRlZCBieSB0aGUgU3luY2hlciBhcyBhIFByb21pc2UuXG4gICAqL1xuICBzZW5kKG1lc3NhZ2UsIGlkZW50aXR5KSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBtb2RlID0gX3RoaXMuY29udHJvbGxlck1vZGU7XG4gICAgbGV0IGRhdGFPYmplY3QgPSBtb2RlID09PSAncmVwb3J0ZXInID8gX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyIDogX3RoaXMuZGF0YU9iamVjdE9ic2VydmVyO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4vLyAgICAgIGxldCBfZGF0YU9iamVjdENoaWxkO1xuICAgICAgX3RoaXMuY2hpbGRfY3NlcSArPSAxO1xuICAgICAgbGV0IG1zZyA9IHtcblxuLyogICAgICAgIHVybDogZGF0YU9iamVjdC5kYXRhLnVybCxcbiAgICAgICAgY3NlcTogX3RoaXMuY2hpbGRfY3NlcSxcbiAgICAgICAgcmVwb3J0ZXI6IGRhdGFPYmplY3QuZGF0YS5yZXBvcnRlcixcbiAgICAgICAgc2NoZW1hOiBkYXRhT2JqZWN0LmRhdGEuc2NoZW1hLFxuICAgICAgICBuYW1lOiBkYXRhT2JqZWN0LmRhdGEubmFtZSxcbiAgICAgICAgY3JlYXRlZCA6IG5ldyBEYXRlKCkudG9KU09OKCksKi9cblxuICAgICAgICB0eXBlOiAnY2hhdCcsXG4gICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2VcbiAgICAgIH1cblxuICAgICAgbGV0IHNlbmRlciA9IGlkZW50aXR5ID8gaWRlbnRpdHkgOiB7XG4gICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XG4gICAgICB9O1xuXG5cbiAgICAgIC8vIFRPRE86IGNoYW5nZSBjaGF0bWVzc2FnZXMgdG8gcmVzb3VyY2UgLSBjaGF0LCBmaWxlXG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgbWVzc2FnZSB0byBoeXBlcnR5UmVzb3VyY2UgLSBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2Rldi1zZXJ2aWNlLWZyYW1ld29yay90cmVlL2RldmVsb3AvZG9jcy9kYXRhbW9kZWwvZGF0YS1vYmplY3RzL2h5cGVydHktcmVzb3VyY2VcbiAgICAgIC8vIFRPRE86IGhhbmRsZSB3aXRoIG11bHRpcGxlIHJlc291cmNlcyAtIGlmIHRoZSBcIm1lc3NhZ2VcIiB3aWxsIGJlIGRpZmZlcmVudCBmb3IgZWFjaCB0eXBlIG9mIHJlc291cmNlc1xuICAgICAgZGF0YU9iamVjdC5hZGRDaGlsZChtc2csIHNlbmRlcikudGhlbihmdW5jdGlvbihkYXRhT2JqZWN0Q2hpbGQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1bYWRkQ2hpbGQgLSBDaGF0IE1lc3NhZ2VdOiAnLCBkYXRhT2JqZWN0Q2hpbGQpO1xuICAgICAgICAvL3Jlc29sdmUoZGF0YU9iamVjdENoaWxkKTtcblxuICAgICAgICAvL1RPRE86IG1vdmUgdG8gc2VwYXJhdGUgZnVuY3Rpb25cblxuXG4gICAgICAgIGxldCBtc2cgPSB7XG4gICAgICAgICAgY2hpbGRJZDogZGF0YU9iamVjdENoaWxkLl9jaGlsZElkLFxuICAgICAgICAgIGZyb206IGRhdGFPYmplY3RDaGlsZC5fb3duZXIsXG4gICAgICAgICAgdmFsdWU6IGRhdGFPYmplY3RDaGlsZC5kYXRhLFxuICAgICAgICAgIHR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgIGlkZW50aXR5OiBzZW5kZXJcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcmVwb3J0ZXJTdGF0dXMgPSBuZXcgUmVnaXN0cmF0aW9uU3RhdHVzKGRhdGFPYmplY3QudXJsLCBfdGhpcy5fbWFuYWdlci5fcnVudGltZVVSTCwgX3RoaXMuX21hbmFnZXIuX2h5cGVydHlVUkwsIF90aGlzLl9tYW5hZ2VyLl9idXMgKTtcblxuICAgICAgICAvLyByZWN1cnNpdmUgZnVuY3Rpb24gdG8gc3luYyB3aXRoIGNoYXQgcmVwb3J0ZXJcblxuICAgICAgICAgIGxldCBzaGFyZTJSZXBvcnRlciA9IGZ1bmN0aW9uKGNoaWxkLCBzdWJzY3JpYmVyLCBtc2csIHN0YXR1cykge1xuICAgICAgICAgICAgbGV0IHN0YXR1c09mUmVwb3J0ZXIgPSBzdGF0dXM7XG4gICAgICAgICAgICBjaGlsZC5zaGFyaW5nU3RhdHVzLnRoZW4ocmVzb2x2ZShtc2cpKS5jYXRjaCgocmVzdWx0KT0+e1xuXG4gICAgICAgICAgICAgICAgc3RhdHVzT2ZSZXBvcnRlci5vbkxpdmUoIHN1YnNjcmliZXIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHN0YXR1c09mUmVwb3J0ZXIudW5zdWJzY3JpYmVMaXZlKHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgICAgICAgY2hpbGQuc2hhcmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICBzaGFyZTJSZXBvcnRlcihjaGlsZCwgc3Vic2NyaWJlciwgbXNnLCBzdGF0dXNPZlJlcG9ydGVyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvL1RPRE86IHN1YnNjcmliZSB0byBzeW5jIHdoZW4gcmVwb3J0ZXIgaXMgbGl2ZS4gTmV3IHN5bmNoZWQgbWVzc2FnZXMgc2hvdWxkIHRyaWdnZXIgb25NZXNzYWdlIGllIG9uQ2hpbGRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNoYXJlMlJlcG9ydGVyKGRhdGFPYmplY3RDaGlsZCwgX3RoaXMuX21hbmFnZXIuX2h5cGVydHlVUkwsIG1zZywgcmVwb3J0ZXJTdGF0dXMpO1xuXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdSZWFzb246JywgcmVhc29uKTtcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogW29uQ2hhbmdlIGRlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2sgW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgb25DaGFuZ2UoY2FsbGJhY2spIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9vbkNoYW5nZSA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNlaXZlIG5ldyBtZXNzYWdlcy5cbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGhhbmRsZSB3aXRoIG5ldyBtZXNzYWdlc1xuICAgKiBAcmV0dXJuIHtDb21tdW5pY2F0aW9uLkNoYXRNZXNzYWdlfSBtXG4gICAqL1xuICBvbk1lc3NhZ2UoY2FsbGJhY2spIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9vbk1lc3NhZ2UgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBbb25Vc2VyQWRkZWQgZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgICAgICBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBvblVzZXJBZGRlZChjYWxsYmFjaykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX29uVXNlckFkZGVkID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiB0aGUgYW4gdXNlciB3YXMgcmVtb3ZlZFxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2sgRnVuY3Rpb24gaGFuZGxlIHdpdGggdGhlIHJlbW92ZWQgdXNlclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxuICAgKi9cbiAgb25Vc2VyUmVtb3ZlZChjYWxsYmFjaykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX29uVXNlclJlbW92ZWQgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSByZXF1ZXN0cyB0byBjbG9zZSB0aGUgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7RGVsZXRlRXZlbnR9IFRoZSBEZWxldGVFdmVudCBmaXJlZCBieSB0aGUgU3luY2hlciB3aGVuIHRoZSBDaGF0IGlzIGNsb3NlZC5cbiAgICovXG4gIG9uQ2xvc2UoY2FsbGJhY2spIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9vbkNsb3NlID0gY2FsbGJhY2s7XG4gIH1cblxuICBvblJlc3BvbnNlKGNhbGxiYWNrKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fb25SZXNwb25zZSA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgLyBpbnZpdGUgbmV3IHVzZXIgb24gYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cbiAgICogT25seSB0aGUgUmVwb3J0ZXIsIGkuZS4gdGhlIEh5cGVydHkgdGhhdCBoYXMgY3JlYXRlZCB0aGUgR3JvdXAgQ2hhdCwgaXMgYWxsb3dlZCB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtVUkwuVXNlclVSTH0gIHVzZXJzICBVc2VyIHRvIGJlIGludml0ZWQgdG8gam9pbiB0aGUgR3JvdXAgQ2hhdCB0aGF0IGlzIGlkZW50aWZpZWQgd2l0aCByZVRISU5LIFVzZXIgVVJMLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSAgIEl0IHJldHVybnMgYXMgYSBQcm9taXNlIHRydWUgaWYgc3VjY2Vzc2Z1bGx5IGludml0ZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgYWRkVXNlcih1c2Vycykge1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBoYXZlRW1wdHlFbGVtZW50cyA9IChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnRWxlbWVudDonLCBlbGVtZW50Lmxlbmd0aCk7XG4gICAgICByZXR1cm4gZWxlbWVudC5sZW5ndGggIT09IDA7XG4gICAgfTtcblxuICAgIGxldCBub3RGb3VuZEVsZW1lbnRzID0gKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCd1c2VyIG5vdCBmb3VuZDogJywgZWxlbWVudCk7XG4gICAgICByZXR1cm4gIShlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBpZiAodXNlcnMuZmlsdGVyKGhhdmVFbXB0eUVsZW1lbnRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnRG9uXFwndCBoYXZlIHVzZXJzIHRvIGludml0ZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5hZGRVc2VycyBdOiAnLCB1c2Vycyk7XG5cbiAgICAgIC8qX3RoaXMuc2VhcmNoLnVzZXJzKHVzZXJzLCBkb21haW5zLCBbJ2NvbW0nXSwgWydjaGF0J10pXG5cbiAgICAudGhlbigoaHlwZXJ0aWVzSURzKSA9PiB7XG5cbiAgICAgIGlmIChoeXBlcnRpZXNJRHMuZmlsdGVyKG5vdEZvdW5kRWxlbWVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyAnVXNlcihzKSBub3QgZm91bmQnO1xuICAgICAgfVxuXG4gICAgICBsZXQgc2VsZWN0ZWRIeXBlcnRpZXMgPSBoeXBlcnRpZXNJRHMubWFwKChoeXBlcnR5KSA9PiB7XG4gICAgICAgIHJldHVybiBoeXBlcnR5Lmh5cGVydHlJRDtcbiAgICAgIH0pOyovXG5cbiAgICAgIGxldCB1c2Vyc0Rpc2NvdmVyeSA9IFtdO1xuICAgICAgbGV0IGRpc2Nvbm5lY3RlZCA9IFtdO1xuICAgICAgbGV0IGxpdmUgPSB7fTtcblxuICAgICAgdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgICBsZXQgdXNlckRpc2NvdmVyeVByb21pc2UgPSBfdGhpcy5kaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNETyh1c2VyLnVzZXIsIFsnY29tbSddLCBbJ2NoYXQnXSwgdXNlci5kb21haW4pO1xuICAgICAgICAgIHVzZXJzRGlzY292ZXJ5LnB1c2godXNlckRpc2NvdmVyeVByb21pc2UpO1xuICAgICAgICB9KTtcblxuICAgICAgUHJvbWlzZS5hbGwodXNlcnNEaXNjb3ZlcnkpLnRoZW4oKHVzZXJEaXNjb3ZlcnlSZXN1bHRzKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlcnNdIFVzZXJzIERpc2NvdmVyeSBSZXN1bHRzLT4nLCB1c2VyRGlzY292ZXJ5UmVzdWx0cyk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkSHlwZXJ0aWVzID0gW107XG5cbiAgICAgICAgIHVzZXJEaXNjb3ZlcnlSZXN1bHRzLmZvckVhY2goKHVzZXJEaXNjb3ZlcnlSZXN1bHQpID0+IHtcblxuICAgICAgICAgICB1c2VyRGlzY292ZXJ5UmVzdWx0LmZvckVhY2goKGRpc2NvdmVyZWQpPT57XG4gICAgICAgICAgICAgaWYgKGRpc2NvdmVyZWQuZGF0YS5zdGF0dXMgPT09ICdsaXZlJyl7XG4gICAgICAgICAgICAgICBzZWxlY3RlZEh5cGVydGllcy5wdXNoKGRpc2NvdmVyZWQuZGF0YS5oeXBlcnR5SUQpO1xuICAgICAgICAgICAgICAgbGl2ZVtkaXNjb3ZlcmVkLmRhdGEuaHlwZXJ0eUlEXSA9IGRpc2NvdmVyZWQ7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGVsc2UgaWYgKGRpc2Nvbm5lY3RlZC5sZW5ndGggPCA1KSBkaXNjb25uZWN0ZWQucHVzaChkaXNjb3ZlcmVkKTtcbiAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXJdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5bmNoZXIgQ3JlYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXFxuJyk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXVNlbGVjdGVkIEh5cGVydGllczogISEhICcsIHNlbGVjdGVkSHlwZXJ0aWVzKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBIYXZlICR7c2VsZWN0ZWRIeXBlcnRpZXMubGVuZ3RofSB1c2VycztgKTtcbi8vICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlcl0gSHlwZXJ0aWVzSURzICcsIGh5cGVydGllc0lEcyk7XG5cbiAgICAgICAgbGV0IGRhdGFPYmplY3QgPSBfdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IF90aGlzLmRhdGFPYmplY3RSZXBvcnRlciA6IF90aGlzLmRhdGFPYmplY3RPYnNlcnZlcjtcblxuICAgICAgICBpZiAoZGlzY29ubmVjdGVkLmxlbmd0aCA+IDApIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIuaW52aXRlRGlzY29ubmVjdGVkSHlwZXJ0aWVzKGRpc2Nvbm5lY3RlZCwgZGF0YU9iamVjdCk7XG5cbiAgICAgICAgZGF0YU9iamVjdC5pbnZpdGVPYnNlcnZlcnMoc2VsZWN0ZWRIeXBlcnRpZXMpO1xuXG4gICAgICAgIGlmIChkYXRhT2JqZWN0Lmludml0YXRpb25zLmxlbmd0aCA+IDApIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIucHJvY2Vzc0ludml0YXRpb25zKGxpdmUsIGRhdGFPYmplY3QpO1xuXG4gICAgICAgIHJldHVybjtcblxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXJdQXJlIGludml0ZWQgd2l0aCBzdWNjZXNzICcgKyB1c2Vycy5sZW5ndGggKyAnIHVzZXJzOycpO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG5cblxuXG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGVuIHRyeWluZyB0byBpbnZpdGUgdXNlcnM7XFxuJywgcmVhc29uKTtcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXF1ZXN0IHRoZSBSZXBvcnRlciB0byBhZGQgLyBpbnZpdGUgbmV3IHVzZXIgb24gYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cbiAgICogT25seSBPYnNlcnZlcnMgYXJlIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7VVJMLlVzZXJVUkx9ICB1c2VycyAgVXNlciB0byBiZSBpbnZpdGVkIHRvIGpvaW4gdGhlIEdyb3VwIENoYXQgdGhhdCBpcyBpZGVudGlmaWVkIHdpdGggcmVUSElOSyBVc2VyIFVSTC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxib29sZWFuPn0gICBJdCByZXR1cm5zIGFzIGEgUHJvbWlzZSB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBpbnZpdGVkIG9yIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGFkZFVzZXJSZXEodXNlcnMpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAvL2NoZWNrIGlzIE9ic2VydmVyIGFuZCBpbnZva2Ugb2JzZXJ2ZXIuZXhlY3V0ZSgpIHdpdGggbmV3IHByb21pc2VcbiAgICBsZXQgaGF2ZUVtcHR5RWxlbWVudHMgPSAoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ0VsZW1lbnQ6JywgZWxlbWVudC5sZW5ndGgpO1xuICAgICAgcmV0dXJuIGVsZW1lbnQubGVuZ3RoICE9PSAwO1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGlmICh1c2Vycy5maWx0ZXIoaGF2ZUVtcHR5RWxlbWVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlclJlcV0gRG9uXFwndCBoYXZlIHVzZXJzIHRvIGFkZCcpO1xuICAgICAgfVxuICAgICAgaWYgKCFfdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ29ic2VydmVyJykge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlclJlcV0gb25seSBhbGxvd2VkIHRvIENoYXQgT2JzZXJ2ZXInKTtcblxuICAgICAgbGV0IGFkZFVzZXIgPSBfdGhpcy5hZGRVc2VyKHVzZXJzKTtcblxuICAgICAgaWYgKF90aGlzLl9kYXRhT2JqZWN0T2JzZXJ2ZXIpIHtcbiAgICAgICAgYWRkVXNlciA9IF90aGlzLl9kYXRhT2JqZWN0T2JzZXJ2ZXIuZXhlY3V0ZSgnYWRkVXNlcicsIHVzZXJzKTtcbiAgICAgIH1cblxuICAgICAgYWRkVXNlci50aGVuKCgpID0+IHtcbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlclJlcV0gUmVxdWVzdCBhY2NlcHRlZCBieSBSZXBvcnRlciAnKTtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIFJlcXVlc3QgcmVqZWN0ZWQgYnkgUmVwb3J0ZXI7XFxuJywgcmVhc29uKTtcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgfSk7XG5cbn1cblxuICBvbkludml0YXRpb25SZXNwb25zZShjYWxsYmFjaykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX29uSW52aXRhdGlvblJlc3BvbnNlID0gY2FsbGJhY2s7XG4gICAgX3RoaXMuX2ludml0YXRpb25zSGFuZGxlci5pbnZpdGF0aW9uUmVzcG9uc2UgPSBjYWxsYmFjaztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgYSB1c2VyIGZyb20gYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cbiAgICogT25seSB0aGUgUmVwb3J0ZXIsIGkuZS4gdGhlIEh5cGVydHkgdGhhdCBoYXMgY3JlYXRlZCB0aGUgR3JvdXAgQ2hhdCwgaXMgYWxsb3dlZCB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7PFByb21pc2U+IGJvb2xlYW59IFByb21pc2Ugd2l0aCB0aGUgc3RhdHVzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVtb3ZlIGEgdXNlciBmcm9tIGFuIGV4aXN0aW5nIEdyb3VwIENoYXQgaW5zdGFuY2UuXG4gICAqIE9ubHkgdGhlIFJlcG9ydGVyLCBpLmUuIHRoZSBIeXBlcnR5IHRoYXQgaGFzIGNyZWF0ZWQgdGhlIEdyb3VwIENoYXQsIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSAge1VSTC5Vc2VyVVJMfSB1c2VyICAgICAgIFVzZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBHcm91cCBDaGF0IHRoYXQgaXMgaWRlbnRpZmllZCB3aXRoIHJlVEhJTksgVXNlciBVUkwuXG4gICAqIEByZXR1cm4gezxQcm9taXNlPiBib29sZWFufSAgICAgIEl0IHJldHVybnMgYXMgYSBQcm9taXNlIHRydWUgaWYgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVtb3ZlVXNlcih1c2VyKSB7XG5cbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhlIHJlbW92ZVVzZXI7XG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1Ob3QgeWV0IGltcGxlbWVudGVkOiAnLCB1c2VyKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbG9zZSBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxuICAgKiBPbmx5IGF2YWlsYWJsZSB0byBDaGF0IEdyb3VwIFJlcG9ydGVycyBpLmUuIHRoZSBIeXBlcnR5IGluc3RhbmNlIHRoYXQgY3JlYXRlZCB0aGUgR3JvdXAgQ2hhdC5cbiAgICogQHJldHVybiB7PFByb21pc2U+Qm9vbGVhbn0gSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgY2xvc2VkIG9yIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGNsb3NlKGRlbCA9IHRydWUpIHtcbiAgICAvLyBUT0RPOiB0aGUgZGF0YU9iamVjdFJlcG9ydGVyLmRlbGV0ZSBzaG91bGQgYmUgYSBQcm9taXNlO1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBcbiAgICAgIGlmIChfdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJykge1xuICAgICAgICAvLyByZXBvcnRlclxuICAgICAgICBfdGhpcy5faW52aXRhdGlvbnNIYW5kbGVyLmNsZWFuSW52aXRhdGlvbnMoX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoIWRlbCkge1xuICAgICAgICAgICAgX3RoaXMuX21hbmFnZXIuY29tbXVuaWNhdGlvbk9iamVjdC5zdGF0dXMgPSAnY2xvc2VkJztcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2V7XG5cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICBkZWxldGUgX3RoaXMuX21hbmFnZXIuX3JlcG9ydGVyc0NvbnRyb2xsZXJzW190aGlzLmRhdGFPYmplY3RSZXBvcnRlci51cmxdO1xuICAgICAgICAgICAgICAgIF90aGlzLmRhdGFPYmplY3RSZXBvcnRlci5kZWxldGUoKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fb25DbG9zZSkgX3RoaXMuX29uQ2xvc2Uoe1xuICAgICAgICAgICAgICAgICAgY29kZTogMjAwLFxuICAgICAgICAgICAgICAgICAgZGVzYzogJ2RlbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgdXJsOiBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIudXJsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGZhbHNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG9ic2VydmVyXG4gICAgICAgIGlmKGRlbCl7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5fbWFuYWdlci5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbX3RoaXMuZGF0YU9iamVjdE9ic2VydmVyLnVybF07XG4gICAgICAgICAgICBfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgLy8gVE9ETzogc2VuZCBtZXNzYWdlIFxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGF0Q29udHJvbGxlcjtcbiIsImltcG9ydCB7IGRlZXBDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFVzZXJJbmZvIHtcblxuICBjb25zdHJ1Y3RvcihoeXBlcnR5VVJMLCBkb21haW4sIGlkZW50aXR5KSB7XG5cbiAgICBsZXQgY29tcGxldGVJZGVudGl0eSA9IGRlZXBDbG9uZShpZGVudGl0eSk7XG4gICAgaWYgKCFpZGVudGl0eS5oYXNPd25Qcm9wZXJ0eSgndXNlclByb2ZpbGUnKSkge1xuICAgICAgY29tcGxldGVJZGVudGl0eVsndXNlclByb2ZpbGUnXSA9IGlkZW50aXR5O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBoeXBlcnR5VVJMOiBoeXBlcnR5VVJMLFxuICAgICAgZG9tYWluLCBkb21haW4sXG4gICAgICBpZGVudGl0eTogY29tcGxldGVJZGVudGl0eVxuICAgIH1cblxuICB9XG5cbn1cbiIsIlxuLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vLyBTZXJ2aWNlIEZyYW1ld29ya1xuLy9pbXBvcnQgSWRlbnRpdHlNYW5hZ2VyIGZyb20gJy4uL2lkZW50aXR5TWFuYWdlci9JZGVudGl0eU1hbmFnZXInO1xuLy9pbXBvcnQgUmVnaXN0cmF0aW9uU3RhdHVzIGZyb20gJy4uL2Rpc2NvdmVyeS9SZWdpc3RyYXRpb25TdGF0dXMnO1xuLy9pbXBvcnQgRGlzY292ZXJ5IGZyb20gJy4uL2Rpc2NvdmVyeS9EaXNjb3ZlcnknO1xuLy9pbXBvcnQgU3luY2hlciBmcm9tICcuLi9zeW5jaGVyL1N5bmNoZXInO1xuXG4vLyBVdGlsc1xuLy9pbXBvcnQge2RpdmlkZVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuLy9pbXBvcnQgU2VhcmNoIGZyb20gJy4uL3V0aWxzL1NlYXJjaCc7XG5cbi8vIEludGVybmFsc1xuaW1wb3J0IHsgY29tbXVuaWNhdGlvbk9iamVjdCwgQ29tbXVuaWNhdGlvblN0YXR1cywgY29tbXVuaWNhdGlvbkNoaWxkcmVuIH0gZnJvbSAnLi9jb21tdW5pY2F0aW9uJztcbmltcG9ydCBDaGF0Q29udHJvbGxlciBmcm9tICcuL0NoYXRDb250cm9sbGVyJztcbmltcG9ydCB7IFVzZXJJbmZvIH0gZnJvbSAnLi9Vc2VySW5mbyc7XG5cbi8qKlxuKiBIeXBlcnR5IEdyb3VwIENoYXQgTWFuYWdlciBBUEkgKEh5cGVydHlDaGF0KVxuKiBAYXV0aG9yIFZpdG9yIFNpbHZhIFt2aXRvci10LXNpbHZhQHRlbGVjb20ucHRdXG4qIEB2ZXJzaW9uIDAuMS4wXG4qL1xuY2xhc3MgQ2hhdE1hbmFnZXIge1xuXG4gIGNvbnN0cnVjdG9yKG15VXJsLCBidXMsIGNvbmZpZ3VyYXRpb24sIHN5bmNoZXIsIGZhY3RvcnkpIHtcbiAgICBpZiAoIW15VXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1tDaGF0TWFuYWdlci5jb25zdHJ1Y3Rvcl0gVGhlIG15VXJsIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xuICAgIGlmICghYnVzKSB0aHJvdyBuZXcgRXJyb3IoJ1tDaGF0TWFuYWdlci5jb25zdHJ1Y3Rvcl0gVGhlIE1pbmlCdXMgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoJ1tDaGF0TWFuYWdlci5jb25zdHJ1Y3Rvcl0gVGhlIGNvbmZpZ3VyYXRpb24gaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGlmICghc3luY2hlcikge1xuICAgICAgc3luY2hlciA9IGZhY3RvcnkuY3JlYXRlU3luY2hlcihteVVybCwgYnVzLCBjb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICBfdGhpcy5fcnVudGltZVVSTCA9IGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTDtcblxuICAgIGxldCBkb21haW4gPSBmYWN0b3J5LmRpdmlkZVVSTChfdGhpcy5fcnVudGltZVVSTCkuZG9tYWluO1xuICAgIGxldCBkaXNjb3ZlcnkgPSBmYWN0b3J5LmNyZWF0ZURpc2NvdmVyeShteVVybCwgY29uZmlndXJhdGlvbi5ydW50aW1lVVJMLCBidXMpO1xuICAgIGxldCBpZGVudGl0eU1hbmFnZXIgPSBmYWN0b3J5LmNyZWF0ZUlkZW50aXR5TWFuYWdlcihteVVybCwgY29uZmlndXJhdGlvbi5ydW50aW1lVVJMLCBidXMpO1xuXG4gICAgX3RoaXMuX29iamVjdERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIGRvbWFpbiArICcvLndlbGwta25vd24vZGF0YXNjaGVtYS9Db21tdW5pY2F0aW9uJztcblxuICAgIF90aGlzLl9yZXBvcnRlcnNDb250cm9sbGVycyA9IHt9O1xuICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVycyA9IHt9O1xuXG4gICAgX3RoaXMuX215VXJsID0gbXlVcmw7XG4gICAgX3RoaXMuX2J1cyA9IGJ1cztcbiAgICBfdGhpcy5fc3luY2hlciA9IHN5bmNoZXI7XG4gICAgX3RoaXMuX2RvbWFpbiA9IGRvbWFpbjtcblxuICAgIF90aGlzLmRpc2NvdmVyeSA9IGRpc2NvdmVyeTtcbiAgICBfdGhpcy5pZGVudGl0eU1hbmFnZXIgPSBpZGVudGl0eU1hbmFnZXI7XG4gICAgX3RoaXMuY3VycmVudElkZW50aXR5O1xuXG4gICAgX3RoaXMuc2VhcmNoID0gZmFjdG9yeS5jcmVhdGVTZWFyY2goZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpO1xuXG4gICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdCA9IGNvbW11bmljYXRpb25PYmplY3Q7XG5cbiAgICBfdGhpcy5jb21tdW5pY2F0aW9uQ2hpbGRyZW4gPSBjb21tdW5pY2F0aW9uQ2hpbGRyZW47XG5cbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyXSBEaXNjb3ZlciAnLCBkaXNjb3ZlcnkpO1xuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXJdIElkZW50aXR5IE1hbmFnZXIgJywgaWRlbnRpdHlNYW5hZ2VyKTtcblxuXG4gIH1cblxuICBzZXQgb2ZmbGluZShvZmZsaW5lKSB7XG4gICAgdGhpcy5fb2ZmbGluZSA9IG9mZmxpbmU7XG4gIH1cblxuICBnZXQgb2ZmbGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fb2ZmbGluZSA/IHRoaXMuX29mZmxpbmUgOiBmYWxzZTtcbiAgfVxuXG5cbiAgcHJvY2Vzc05vdGlmaWNhdGlvbihldmVudCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5wcm9jZXNzTm90aWZpY2F0aW9uOiAnLCBldmVudCk7XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NyZWF0ZScpIHtcblxuICAgICAgLy8gVE9ETzogcmVwbGFjZSB0aGUgMTAwIGZvciBNZXNzYWdlLlJlc3BvbnNlXG4gICAgICAvLyBldmVudC5hY2soMjAwKTtcblxuICAgICAgaWYgKF90aGlzLl9vbkludml0YXRpb24pIHsgX3RoaXMuX29uSW52aXRhdGlvbihldmVudCk7IH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2RlbGV0ZScpIHtcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlIDIwMCBmb3IgTWVzc2FnZS5SZXNwb25zZVxuICAgICAgZXZlbnQuYWNrKDIwMCk7XG5cbiAgICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVyc1tldmVudC51cmxdLmNsb3NlRXZlbnQgPSBldmVudDtcblxuICAgICAgZGVsZXRlIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVyc1tldmVudC51cmxdO1xuXG4gICAgICBfdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnMuY2xvc2VFdmVudCA9IGV2ZW50O1xuXG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcblxuXG4gICAgICBmb3IgKGxldCB1cmwgaW4gdGhpcy5fcmVwb3J0ZXJzQ29udHJvbGxlcnMpIHtcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXJzQ29udHJvbGxlcnNbdXJsXS5jbG9zZShldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IHVybCBpbiB0aGlzLl9vYnNlcnZlcnNDb250cm9sbGVycykge1xuICAgICAgICB0aGlzLl9vYnNlcnZlcnNDb250cm9sbGVyc1t1cmxdLmNsb3NlKGV2ZW50KTtcbiAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIG15SWRlbnRpdHkoaWRlbnRpdHkpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLm15SWRlbnRpdHldJyk7XG4gICAgICBpZiAoaWRlbnRpdHkpIHJldHVybiByZXNvbHZlKGlkZW50aXR5KTtcblxuICAgICAgaWYgKF90aGlzLl9teVVybC5pbmNsdWRlcygnaHlwZXJ0eTovLycpKSB7XG4gICAgICAgIF90aGlzLmlkZW50aXR5TWFuYWdlci5kaXNjb3ZlclVzZXJSZWdpc3RlcmVkKCkudGhlbigoaWRlbnRpdHkpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGlkZW50aXR5KTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyLmRpc2NvdmVySWRlbnRpdHlQZXJJZFAoKS50aGVuKChpZGVudGl0eSkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoaWRlbnRpdHkpO1xuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBHcm91cCBDaGF0IHByb3ZpZGluZyB0aGUgbmFtZSBhbmQgdGhlIGlkZW50aWZpZXJzIG9mIHVzZXJzIHRvIGJlIGludml0ZWQuXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBuYW1lICBJcyBhIHN0cmluZyB0byBpZGVudGlmeSB0aGUgR3JvdXAgQ2hhdFxuICAgKiBAcGFyYW0gIHthcnJheTxVUkwudXNlclVSTD59ICAgICAgICAgdXNlcnMgQXJyYXkgb2YgdXNlcnMgdG8gYmUgaW52aXRlZCB0byBqb2luIHRoZSBHcm91cCBDaGF0LiBVc2VycyBhcmUgaWRlbnRpZmllZCB3aXRoIHJlVEhJTksgVXNlciBVUkwsIGxpa2UgdGhpcyBmb3JtYXQgdXNlcjovLzxpcGRkb21haW4+Lzx1c2VyLWlkZW50aWZpZXI+XG4gICAqIEByZXR1cm4gezxQcm9taXNlPkNoYXRDb250cm9sbGVyfSAgICBBIENoYXRDb250cm9sbGVyIG9iamVjdCBhcyBhIFByb21pc2UuXG4gICAqL1xuICBjcmVhdGUobmFtZSwgdXNlcnMsIGV4dHJhID0ge30pIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IHN5bmNoZXIgPSBfdGhpcy5fc3luY2hlcjtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QgPSBjb21tdW5pY2F0aW9uT2JqZWN0O1xuICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5jc2VxID0gMTtcbiAgICAgIF90aGlzLmNvbW11bmljYXRpb25PYmplY3Quc3RhcnRpbmdUaW1lID0gbmV3IERhdGUoKS50b0pTT04oKTtcbiAgICAgIF90aGlzLmNvbW11bmljYXRpb25PYmplY3Quc3RhdHVzID0gIENvbW11bmljYXRpb25TdGF0dXMuT1BFTjtcblxuICAgICAgbGV0IG15SWRlbnRpdHk7XG5cbiAgICAgIF90aGlzLm15SWRlbnRpdHkoKS50aGVuKChpZGVudGl0eSkgPT4ge1xuICAgICAgICBteUlkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuY3JlYXRlIF0gTXkgSWRlbnRpdHknLCBpZGVudGl0eSk7XG5cbiAgICAgICAgLy8gbGV0IHVybCA9IF90aGlzLmNvbW11bmljYXRpb25PYmplY3QucmVwb3J0ZXI7XG5cbiAgICAgICAgbGV0IHVzZXJJbmZvID0gbmV3IFVzZXJJbmZvKF90aGlzLl9teVVybCwgX3RoaXMuX2RvbWFpbiwgaWRlbnRpdHkpO1xuXG4gICAgICAgIC8vIEFkZCBteSBpZGVudGl0eVxuICAgICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0LnBhcnRpY2lwYW50c1tpZGVudGl0eS5ndWlkXSA9IHVzZXJJbmZvO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuY3JlYXRlIF0gcGFydGljaXBhbnRzOiAnLCBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0LnBhcnRpY2lwYW50cyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuY3JlYXRlIF0gY29tbXVuaWNhdGlvbk9iamVjdCcsIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QpO1xuICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5jcmVhdGVdIHNlYXJjaGluZyAnICsgdXNlcnMpO1xuXG4gICAgICAgIC8vbGV0IHVzZXJzU2VhcmNoID0gX3RoaXMuc2VhcmNoLnVzZXJzKHVzZXJzLCBkb21haW5zLCBbJ2NvbW0nXSwgWydjaGF0J10pO1xuXG4gICAgICAgIGxldCB1c2Vyc0Rpc2NvdmVyeSA9IFtdO1xuXG4gICAgICAgIGxldCBkaXNjb25uZWN0ZWQgPSBbXTtcbiAgICAgICAgbGV0IGxpdmUgPSB7fTtcblxuICAgICAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XG4gICAgICAgICAgbGV0IHVzZXJEaXNjb3ZlcnlQcm9taXNlID0gX3RoaXMuZGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0aWVzRE8odXNlci51c2VyLCBbJ2NvbW0nXSwgWydjaGF0J10sIHVzZXIuZG9tYWluKTtcbiAgICAgICAgICB1c2Vyc0Rpc2NvdmVyeS5wdXNoKHVzZXJEaXNjb3ZlcnlQcm9taXNlKTtcblxuICAgICAgICAgIC8vaWYgKHVzZXIudXNlci5pbmNsdWRlcygnOi8vJykpIG11dHVhbCA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICBQcm9taXNlLmFsbCh1c2Vyc0Rpc2NvdmVyeSkudGhlbigodXNlckRpc2NvdmVyeVJlc3VsdHMpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLmNyZWF0ZV0gVXNlcnMgRGlzY292ZXJ5IFJlc3VsdHMtPicsIHVzZXJEaXNjb3ZlcnlSZXN1bHRzKTtcblxuICAgICAgICAgIGxldCBzZWxlY3RlZEh5cGVydGllcyA9IFtdO1xuXG4gICAgICAgICAgdXNlckRpc2NvdmVyeVJlc3VsdHMuZm9yRWFjaCgodXNlckRpc2NvdmVyeVJlc3VsdCkgPT4ge1xuXG4gICAgICAgICAgICB1c2VyRGlzY292ZXJ5UmVzdWx0LmZvckVhY2goKGRpc2NvdmVyZWQpPT57XG4gICAgICAgICAgICAgIGlmIChkaXNjb3ZlcmVkLmRhdGEuc3RhdHVzID09PSAnbGl2ZScpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEh5cGVydGllcy5wdXNoKGRpc2NvdmVyZWQuZGF0YS5oeXBlcnR5SUQpO1xuICAgICAgICAgICAgICAgIGxpdmVbZGlzY292ZXJlZC5kYXRhLmh5cGVydHlJRF0gPSBkaXNjb3ZlcmVkO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRvIGNvbnRyb2wgdGhlIG51bWJlciBvZiBzdWJzY3JpcHRpb25zIHRvIGRpc2Nvbm5lY3RlZCBkZXZpY2VzXG4gICAgICAgICAgICAgICAgIGlmIChkaXNjb25uZWN0ZWQubGVuZ3RoIDwgNSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQucHVzaChkaXNjb3ZlcmVkKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgLyogICAgICAgIHJldHVybiB1c2Vyc1NlYXJjaDtcbiAgICAgIH0pLnRoZW4oKGh5cGVydGllc0lEcykgPT4ge1xuICAgICAgICBsZXQgc2VsZWN0ZWRIeXBlcnRpZXMgPSBoeXBlcnRpZXNJRHMubWFwKChoeXBlcnR5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGh5cGVydHkuaHlwZXJ0eUlEO1xuICAgICAgICB9KTsgKi9cblxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5bmNoZXIgQ3JlYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXFxuJyk7XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXJdIFNlbGVjdGVkIEh5cGVydGllczogISEhICcsIHNlbGVjdGVkSHlwZXJ0aWVzKTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEhhdmUgJHtzZWxlY3RlZEh5cGVydGllcy5sZW5ndGh9IHVzZXJzO2ApO1xuICAgICAgICAgIGxldCBtdXR1YWwgPSBleHRyYS5tdXR1YWwgPyBleHRyYS5tdXR1YWwgOiB0cnVlO1xuXG4gICAgICAgICAgbGV0IGlucHV0ID0gT2JqZWN0LmFzc2lnbih7cmVzb3VyY2VzOiBbJ2NoYXQnXSwgbXV0dWFsOiBtdXR1YWx9LCBleHRyYSk7XG4gICAgICAgICAgZGVsZXRlIGlucHV0Lm5hbWU7XG5cbiAgICAgICAgICBpZiAoX3RoaXMub2ZmbGluZSkgaW5wdXQub2ZmbGluZSA9IF90aGlzLm9mZmxpbmU7XG5cbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlcl0gaW5wdXQgZGF0YTonLCBpbnB1dCk7XG4gICAgICAgICAgcmV0dXJuIHN5bmNoZXIuY3JlYXRlKF90aGlzLl9vYmplY3REZXNjVVJMLCBzZWxlY3RlZEh5cGVydGllcywgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdCwgdHJ1ZSwgZmFsc2UsIG5hbWUsIHt9LCBpbnB1dCk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdFJlcG9ydGVyKSB7XG5cbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlcl0gMy4gUmV0dXJuIENyZWF0ZSBEYXRhIE9iamVjdCBSZXBvcnRlcicsIGRhdGFPYmplY3RSZXBvcnRlcik7XG5cbiAgICAgICAgICBsZXQgY2hhdENvbnRyb2xsZXIgPSBuZXcgQ2hhdENvbnRyb2xsZXIoc3luY2hlciwgX3RoaXMuZGlzY292ZXJ5LCBfdGhpcy5fZG9tYWluLCBfdGhpcy5zZWFyY2gsIG15SWRlbnRpdHksIF90aGlzKTtcbiAgICAgICAgICBjaGF0Q29udHJvbGxlci5kYXRhT2JqZWN0UmVwb3J0ZXIgPSBkYXRhT2JqZWN0UmVwb3J0ZXI7XG5cbiAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXJzQ29udHJvbGxlcnNbZGF0YU9iamVjdFJlcG9ydGVyLnVybF0gPSBjaGF0Q29udHJvbGxlcjtcblxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXJdIGNoYXRDb250cm9sbGVyIGludml0YXRpb25zSGFuZGxlcjogJywgICBjaGF0Q29udHJvbGxlci5pbnZpdGF0aW9uc0hhbmRsZXIpO1xuXG4gICAgICAgICAgLy8gcHJvY2VzcyBpbnZpdGF0aW9ucyB0byBoYW5kbGUgbm90IHJlY2VpdmVkIGludml0YXRpb25zXG4gICAgICAgICAgaWYgKGRhdGFPYmplY3RSZXBvcnRlci5pbnZpdGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjaGF0Q29udHJvbGxlci5pbnZpdGF0aW9uc0hhbmRsZXIucHJvY2Vzc0ludml0YXRpb25zKGxpdmUsIGRhdGFPYmplY3RSZXBvcnRlcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYW55IGludml0ZWQgVXNlciBpcyBkaXNjb25uZWN0ZWQgbGV0J3Mgd2FpdCB1bnRpbCBpdCBpcyBjb25uZWN0ZWQgYWdhaW5cbiAgICAgICAgICBpZiAoZGlzY29ubmVjdGVkLmxlbmd0aCA+IDApIGNoYXRDb250cm9sbGVyLmludml0YXRpb25zSGFuZGxlci5pbnZpdGVEaXNjb25uZWN0ZWRIeXBlcnRpZXMoZGlzY29ubmVjdGVkLCBkYXRhT2JqZWN0UmVwb3J0ZXIpO1xuXG4gICAgICAgICAgcmVzb2x2ZShjaGF0Q29udHJvbGxlcik7XG5cbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0pO1xuXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuY3JlYXRlXSBNeUlkZW50aXR5IEVycm9yOicsIHJlYXNvbik7XG4gICAgICAgIHJldHVybiByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIH1cblxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaGFuZGxlIG5vdGlmaWNhdGlvbnMgYWJvdXQgaW5jb21pbmcgaW52aXRhdGlvbnMgdG8gam9pbiBhIEdyb3VwIENoYXQuXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBDcmVhdGVFdmVudCBUaGUgQ3JlYXRlRXZlbnQgZmlyZWQgYnkgdGhlIFN5bmNoZXIgd2hlbiBhbiBpbnZpdGFpb24gaXMgcmVjZWl2ZWRcbiAgICovXG4gIG9uSW52aXRhdGlvbihjYWxsYmFjaykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX29uSW52aXRhdGlvbiA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBqb2luIGEgR3JvdXAgQ2hhdC5cbiAgICogQHBhcmFtICB7VVJMLkNvbW11bmljYXRpb25VUkx9IGludml0YXRpb25VUkwgIFRoZSBDb21tdW5pY2F0aW9uIFVSTCBvZiB0aGUgR3JvdXAgQ2hhdCB0byBqb2luIHRoYXQgaXMgcHJvdmlkZWQgaW4gdGhlIGludml0YXRpb24gZXZlbnRcbiAgICogQHJldHVybiB7PFByb21pc2U+Q2hhdENvbnRyb2xsZXJ9ICAgICAgICAgICAgIEl0IHJldHVybnMgdGhlIENoYXRDb250cm9sbGVyIG9iamVjdCBhcyBhIFByb21pc2VcbiAgICovXG4gIGpvaW4oaW52aXRhdGlvblVSTCwgbXV0dWFsID0gdHJ1ZSwgaWRlbnRpdHkpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgbGV0IHN5bmNoZXIgPSBfdGhpcy5fc3luY2hlcjtcbiAgICAgIGxldCBteUlkZW50aXR5O1xuXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlcl0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5bmNoZXIgc3Vic2NyaWJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXFxuJyk7XG4gICAgICBjb25zb2xlLmluZm8oJ2ludml0YXRpb25VUkwnLCBpbnZpdGF0aW9uVVJMKTtcbiAgICAgIF90aGlzLm15SWRlbnRpdHkoaWRlbnRpdHkpLnRoZW4oKGlkZW50aXR5KSA9PiB7XG4gICAgICAgIG15SWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICAgICAgbGV0IGlucHV0ID0ge1xuICAgICAgICAgIHNjaGVtYTogX3RoaXMuX29iamVjdERlc2NVUkwsXG4gICAgICAgICAgcmVzb3VyY2U6IGludml0YXRpb25VUkwsXG4gICAgICAgICAgc3RvcmU6IHRydWUsXG4gICAgICAgICAgcDJwOiBmYWxzZSxcbiAgICAgICAgICBtdXR1YWw6IG11dHVhbCxcbiAgICAgICAgICBkb21haW5fc3Vic2NyaXB0aW9uOiB0cnVlLFxuICAgICAgICAgIGlkZW50aXR5OiBpZGVudGl0eVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChfdGhpcy5vZmZsaW5lKSBpbnB1dC5vZmZsaW5lID0gX3RoaXMub2ZmbGluZTtcblxuICAgICAgICByZXR1cm4gc3luY2hlci5zdWJzY3JpYmUoaW5wdXQpO1xuXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RPYnNlcnZlcikge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGEgT2JqZWN0IE9ic2VydmVyOiAnLCBkYXRhT2JqZWN0T2JzZXJ2ZXIpO1xuXG4gICAgICAgIGxldCBjaGF0Q29udHJvbGxlciA9IG5ldyBDaGF0Q29udHJvbGxlcihzeW5jaGVyLCBfdGhpcy5kaXNjb3ZlcnksIF90aGlzLl9kb21haW4sIF90aGlzLnNlYXJjaCwgbXlJZGVudGl0eSwgX3RoaXMpO1xuICAgICAgICByZXNvbHZlKGNoYXRDb250cm9sbGVyKTtcblxuICAgICAgICBjaGF0Q29udHJvbGxlci5kYXRhT2JqZWN0T2JzZXJ2ZXIgPSBkYXRhT2JqZWN0T2JzZXJ2ZXI7XG5cbiAgICAgICAgX3RoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzW2RhdGFPYmplY3RPYnNlcnZlci51cmxdID0gY2hhdENvbnRyb2xsZXI7XG5cbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGF0TWFuYWdlcjtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLyoqXG4qIFRoZSBHcm91cCBDaGF0IEFQSSBpcyB1c2VkIHRvIGNvbnRyb2wgYSBHcm91cCBDaGF0IGluc3RhbmNlLlxuKiBAYXV0aG9yIFZpdG9yIFNpbHZhIFt2aXRvci10LXNpbHZhQHRlbGVjb20ucHRdXG4qIEB2ZXJzaW9uIDAuMS4wXG4qL1xuXG4vL2ltcG9ydCB7IFVzZXJJbmZvIH0gZnJvbSAnLi9Vc2VySW5mbyc7XG4vL2ltcG9ydCBSZWdpc3RyYXRpb25TdGF0dXMgZnJvbSAnLi4vZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cyc7XG4vL2ltcG9ydCBJbnZpdGF0aW9uc0hhbmRsZXIgZnJvbSAnLi9JbnZpdGF0aW9uc0hhbmRsZXInO1xuXG5jbGFzcyBDaGF0IHtcblxuICBjb25zdHJ1Y3RvcihzeW5jaGVyLCBkb21haW4sIGlkZW50aXR5LCBtYW5hZ2VyKSB7XG5cbiAgICBpZiAoIXN5bmNoZXIpIHRocm93IEVycm9yKCdTeW5jaGVyIGlzIGEgbmVjZXNzYXJ5IGRlcGVuZGVjeScpO1xuLy8gICAgaWYgKCFkaXNjb3ZlcnkpIHRocm93IEVycm9yKCdEaXNjb3ZlciBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlY3knKTtcbiAgICBpZiAoIWRvbWFpbikgdGhyb3cgRXJyb3IoJ0RvbWFpbiBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlY3knKTtcbi8vICAgIGlmICghc2VhcmNoKSB0aHJvdyBFcnJvcignU2VhcmNoIGlzIGEgbmVjZXNzYXJ5IGRlcGVuZGVjeScpO1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fc3luY2hlciA9IHN5bmNoZXI7XG4vLyAgICBfdGhpcy5kaXNjb3ZlcnkgPSBkaXNjb3Zlcnk7XG4vLyAgICBfdGhpcy5zZWFyY2ggPSBzZWFyY2g7XG4gICAgX3RoaXMubXlJZGVudGl0eSA9IGlkZW50aXR5O1xuICAgIF90aGlzLmNvbnRyb2xsZXJNb2RlID0gJ3JlcG9ydGVyJztcbiAgICBfdGhpcy5jaGlsZF9jc2VxID0gMDtcbiAgICBfdGhpcy5kb21haW4gPSBkb21haW47XG5cbiAgICBfdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XG5cbiAgICBjb25zdCBoeXBlcnR5VVJMID0gc3luY2hlci5vd25lcjtcblxuICAgIF90aGlzLl9vYmplY3REZXNjVVJMID0gJ2h5cGVydHktY2F0YWxvZ3VlOi8vY2F0YWxvZ3VlLicgKyBkb21haW4gKyAnLy53ZWxsLWtub3duL2RhdGFzY2hlbWEvQ29tbXVuaWNhdGlvbic7XG5cbi8vICAgIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIgPSBuZXcgSW52aXRhdGlvbnNIYW5kbGVyKGh5cGVydHlVUkwpO1xuXG4gIH1cblxuLyogIGdldCBpbnZpdGF0aW9uc0hhbmRsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludml0YXRpb25zSGFuZGxlcjtcbiAgfSovXG5cbiAgZ2V0IHVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuZGF0YU9iamVjdFJlcG9ydGVyLnVybCA6IHRoaXMuZGF0YU9iamVjdE9ic2VydmVyLnVybDtcbiAgfVxuXG4gIHNldCBkYXRhT2JqZWN0UmVwb3J0ZXIoZGF0YU9iamVjdFJlcG9ydGVyKSB7XG5cbiAgICBpZiAoIWRhdGFPYmplY3RSZXBvcnRlcikgdGhyb3cgbmV3IEVycm9yKCdbQ2hhdENvbnRyb2xsZXJdIFRoZSBkYXRhIG9iamVjdCByZXBvcnRlciBpcyBuZWNlc3NhcnkgcGFyYW1ldGVyICcpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdyZXBvcnRlcic7XG5cbiAgICAvLyBIYW5kbGVyIHRvIHByb2Nlc3MgcmVjZWl2ZWQgZmlsZXNcblxuICAgIC8vIGRhdGFPYmplY3RSZXBvcnRlci5vblJlc3BvbnNlKGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgLy8gICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3RSZXBvcnRlciAtIG9uUmVzcG9uc2VdJywgZXZlbnQpO1xuICAgIC8vICAgaWYgKF90aGlzLl9vbkludml0YXRpb25SZXNwb25zZSkge1xuICAgIC8vICAgICBfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UoZXZlbnQpO1xuICAgIC8vICAgfVxuICAgIC8vXG4gICAgLy8gfSk7XG5cbiAgICBkYXRhT2JqZWN0UmVwb3J0ZXIub25TdWJzY3JpcHRpb24oZnVuY3Rpb24oZXZlbnQpIHtcblxuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3N1YnNjcmliZSc6IF90aGlzLl9vblN1YnNjcmliZShldmVudCk7IGJyZWFrO1xuICAgICAgICBjYXNlICd1bnN1YnNjcmliZSc6IF90aGlzLl9vblVuc3Vic2NyaWJlKGV2ZW50KTsgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpcy5fc2V0T25BZGRDaGlsZExpc3RlbmVyKGRhdGFPYmplY3RSZXBvcnRlcik7XG5cbiAgICBkYXRhT2JqZWN0UmVwb3J0ZXIub25SZWFkKChldmVudCkgPT4ge1xuICAgICAgZXZlbnQuYWNjZXB0KCk7XG4gICAgfSk7XG5cbiAgICBkYXRhT2JqZWN0UmVwb3J0ZXIub25FeGVjdXRlKChldmVudCkgPT4ge1xuICAgICAgc3dpdGNoIChldmVudC5tZXRob2QpIHtcbiAgICAgICAgY2FzZSAnYWRkVXNlcic6XG4gICAgICAgICAgX3RoaXMuYWRkVXNlcihldmVudC5wYXJhbXNbMF0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZXZlbnQuYWNjZXB0KCk7XG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWFzb246JywgcmVhc29uKTtcbiAgICAgICAgICAgIGV2ZW50LnJlamVjdChyZWFzb24pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ3JlbW92ZVVzZXInOlxuICAgICAgICAgICAgX3RoaXMucmVtb3ZlVXNlcihldmVudC5wYXJhbXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBldmVudC5hY2NlcHQoKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWFzb246JywgcmVhc29uKTtcbiAgICAgICAgICAgICAgZXZlbnQucmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiBldmVudC5yZWplY3QoJ1tDaGF0Q29udHJvbGxlci5vbkV4ZWN1dGVdIENoYXQgbWV0aG9kIGV4ZWN1dGlvbiBub3QgYWNjZXB0ZWQgYnkgUmVwb3J0ZXInKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF90aGlzLl9kYXRhT2JqZWN0UmVwb3J0ZXIgPSBkYXRhT2JqZWN0UmVwb3J0ZXI7XG5cbiAgfVxuXG4gIGdldCBkYXRhT2JqZWN0UmVwb3J0ZXIoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcbiAgfVxuXG4gIGdldCBtZXNzYWdlcygpIHtcblxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInID8gdGhpcy5fZGF0YU9iamVjdFJlcG9ydGVyLl9jaGlsZHJlbk9iamVjdHMgOiB0aGlzLl9kYXRhT2JqZWN0T2JzZXJ2ZXIuX2NoaWxkcmVuT2JqZWN0cztcbiAgfVxuXG4gIHNldCBkYXRhT2JqZWN0T2JzZXJ2ZXIoZGF0YU9iamVjdE9ic2VydmVyKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLmNvbnRyb2xsZXJNb2RlID0gJ29ic2VydmVyJztcblxuICAgIF90aGlzLl9kYXRhT2JqZWN0T2JzZXJ2ZXIgPSBkYXRhT2JqZWN0T2JzZXJ2ZXI7XG5cbiAgICBkYXRhT2JqZWN0T2JzZXJ2ZXIub25DaGFuZ2UoJyonLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXJdT2JzZXJ2ZXIgLSBvbkNoYW5nZScsIGV2ZW50KTtcblxuICAgICAgaWYgKGV2ZW50LmZpZWxkLmluY2x1ZGVzKCdwYXJ0aWNpcGFudHMnKSkge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LmNUeXBlKSB7XG4gICAgICAgICAgY2FzZSAnYWRkJzpcbiAgICAgICAgICAgIGlmIChfdGhpcy5fb25Vc2VyQWRkZWQpIF90aGlzLl9vblVzZXJBZGRlZChldmVudCk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3JlbW92ZSc6XG4gICAgICAgICAgICBpZiAoX3RoaXMuX29uVXNlclJlbW92ZWQpIF90aGlzLl9vblVzZXJSZW1vdmVkKGV2ZW50KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5fb25DaGFuZ2UpIF90aGlzLl9vbkNoYW5nZShldmVudCk7XG5cbiAgICB9KTtcblxuICAgIF90aGlzLl9zZXRPbkFkZENoaWxkTGlzdGVuZXIoZGF0YU9iamVjdE9ic2VydmVyKTtcblxuICAgIC8vIGxldCBjaGlsZHJlbnMgPSBkYXRhT2JqZWN0T2JzZXJ2ZXIuY2hpbGRyZW5zO1xuICAgIC8vIE9iamVjdC5rZXlzKGNoaWxkcmVucykuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAvLyAgIGlmIChfdGhpcy5fb25NZXNzYWdlKSBfdGhpcy5fb25NZXNzYWdlKHtcbiAgICAvLyAgICAgY2hpbGRJZDogY2hpbGQsXG4gICAgLy8gICAgIGlkZW50aXR5OiBjaGlsZHJlbnNbY2hpbGRdLmlkZW50aXR5LFxuICAgIC8vICAgICB2YWx1ZTogY2hpbGRyZW5zW2NoaWxkXS5kYXRhXG4gICAgLy8gICB9KTtcbiAgICAvLyB9KVxuXG4gIH1cblxuICBnZXQgZGF0YU9iamVjdE9ic2VydmVyKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9kYXRhT2JqZWN0T2JzZXJ2ZXI7XG4gIH1cblxuICBfc2V0T25BZGRDaGlsZExpc3RlbmVyKGRhdGFPYmplY3QpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBkYXRhT2JqZWN0Lm9uQWRkQ2hpbGQoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIF90aGlzLmNoaWxkX2NzZXEgKz0xO1xuICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuX3NldE9uQWRkQ2hpbGRMaXN0ZW5lcl0gbmV3IENoaWxkIHJlY2VpdmVkOiAnLCBjaGlsZCk7XG5cbiAgICAgIGlmIChfdGhpcy5fb25NZXNzYWdlKSBfdGhpcy5fb25NZXNzYWdlKGNoaWxkKTtcbiAgICB9KTtcblxuICB9XG5cblxuICBnZXQgZGF0YU9iamVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuZGF0YU9iamVjdFJlcG9ydGVyIDogdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXI7XG4gIH1cblxuICBzZXQgY2xvc2VFdmVudChldmVudCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX2Nsb3NlRXZlbnQgPSBldmVudDtcblxuICAgIGlmIChfdGhpcy5fb25DbG9zZSkgX3RoaXMuX29uQ2xvc2UoZXZlbnQpO1xuICB9XG5cbiAgZ2V0IGNsb3NlRXZlbnQoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuX2Nsb3NlRXZlbnQ7XG4gIH1cblxuXG5cbiAgX29uU3Vic2NyaWJlKGV2ZW50KSB7XG5cbiAgICBsZXQgZGF0YU9iamVjdFJlcG9ydGVyID0gdGhpcy5fZGF0YU9iamVjdFJlcG9ydGVyO1xuXG4gICAgZXZlbnQuYWNjZXB0KCk7XG5cblxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdIGV2ZW50JywgZXZlbnQsIGRhdGFPYmplY3RSZXBvcnRlci51cmwpO1xuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdIE5ldyB1c2VyIGhhcyBzdWJzY3JpYmUgdGhpcyBvYmplY3Q6ICcsIGRhdGFPYmplY3RSZXBvcnRlci5kYXRhLCBldmVudC5pZGVudGl0eSk7XG5cbiAgICBsZXQgaWRlbnRpdHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV2ZW50LmlkZW50aXR5KSk7XG5cbiAgICBpZiAoaWRlbnRpdHkuaGFzT3duUHJvcGVydHkoJ2Fzc2VydGlvbicpKSB7XG4gICAgICBkZWxldGUgaWRlbnRpdHkuYXNzZXJ0aW9uXG4gICAgfVxuXG4gICAgbGV0IHVzZXJJbmZvID0ge1xuICAgICAgaHlwZXJ0eVVSTDogZXZlbnQudXJsLFxuICAgICAgZG9tYWluOiBldmVudC5kb21haW4sXG4gICAgICBpZGVudGl0eTogaWRlbnRpdHlcbiAgICB9XG4gICAgbGV0IHVzZXJVUkwgPSBldmVudC5pZGVudGl0eS51c2VyUHJvZmlsZS5ndWlkO1xuXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZV0gIG5ldyBwYXJ0aWNpcGFudCcsIHVzZXJJbmZvKTtcbiAgICBpZiAoZXZlbnQuaWRlbnRpdHkubGVnYWN5KSB7XG4gICAgIHVzZXJJbmZvLmxlZ2FjeSA9IGV2ZW50LmlkZW50aXR5LmxlZ2FjeTtcbiAgICB9XG5cbiAgICBkYXRhT2JqZWN0UmVwb3J0ZXIuZGF0YS5wYXJ0aWNpcGFudHNbdXNlclVSTF0gPSB1c2VySW5mbztcblxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdIGNvbW11bmljYXRpb25PYmplY3QgT0JKIGNoYXRjb250cm9sbGVyJywgZGF0YU9iamVjdFJlcG9ydGVyLmRhdGEucGFydGljaXBhbnRzKTtcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uU3Vic2NyaWJlIC0gb25TdWJzY3JpcHRpb25dICcsIHVzZXJJbmZvKTtcbiAgICAvLyBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uU3Vic2NyaWJlIC0gdGhpcy5fb25Vc2VyQWRkZWRdICcsIHRoaXMuX29uVXNlckFkZGVkKTtcblxuICAgIGlmICh0aGlzLl9vblVzZXJBZGRlZCkgdGhpcy5fb25Vc2VyQWRkZWQodXNlckluZm8pO1xuICB9XG5cbiAgX29uVW5zdWJzY3JpYmUoZXZlbnQpIHtcbiAgICBsZXQgZGF0YU9iamVjdFJlcG9ydGVyID0gdGhpcy5fZGF0YU9iamVjdFJlcG9ydGVyO1xuXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblVuc3Vic2NyaWJlXSBldmVudCcsIGV2ZW50LCBkYXRhT2JqZWN0UmVwb3J0ZXIudXJsKTtcblxuICAgIGxldCBwYXJ0aWNpcGFudCA9IGV2ZW50LmlkZW50aXR5LnVzZXJQcm9maWxlO1xuXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblVuc3Vic2NyaWJlXSAgcGFydGljaXBhbnQgbGVmdCcsIHBhcnRpY2lwYW50KTtcbiAgICBpZiAoZXZlbnQuaWRlbnRpdHkubGVnYWN5KSB7XG4gICAgICBwYXJ0aWNpcGFudC5sZWdhY3kgPSBldmVudC5pZGVudGl0eS5sZWdhY3k7XG4gICAgfVxuXG4gICAgZGVsZXRlIGRhdGFPYmplY3RSZXBvcnRlci5kYXRhLnBhcnRpY2lwYW50c1twYXJ0aWNpcGFudC51c2VyVVJMXTtcblxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZSAtIHRoaXMuX29uVXNlclJlbW92ZWRdICcsIHRoaXMub25Vc2VyUmVtb3ZlZCk7XG4gICAgaWYgKHRoaXMuX29uVXNlclJlbW92ZWQpIHRoaXMuX29uVXNlclJlbW92ZWQocGFydGljaXBhbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGEgZmlsZS5cbiAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgIElzIHRoZSBmaWxlIHRvIGJlIHNlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q29tbXVuaWNhdGlvbi5DaGF0TWVzc2FnZT59ICAgICAgICBJdCByZXR1cm5zIHRoZSBDaGF0TWVzc2FnZSBjaGlsZCBvYmplY3QgY3JlYXRlZCBieSB0aGUgU3luY2hlciBhcyBhIFByb21pc2UuXG4gICAqL1xuICBzZW5kRmlsZShmaWxlKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBtb2RlID0gX3RoaXMuY29udHJvbGxlck1vZGU7XG4gICAgbGV0IGRhdGFPYmplY3QgPSBtb2RlID09PSAncmVwb3J0ZXInID8gX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyIDogX3RoaXMuZGF0YU9iamVjdE9ic2VydmVyO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBsZXQgaWRlbnRpdHkgPSB7XG4gICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XG4gICAgICB9O1xuXG4gICAgICBkYXRhT2JqZWN0LmFkZEh5cGVydHlSZXNvdXJjZSgncmVzb3VyY2VzJywgJ2ZpbGUnLCAgZmlsZSwgaWRlbnRpdHkpLnRoZW4oZnVuY3Rpb24ocmVzb3VyY2VGaWxlKSB7XG5cbiAgICAgICAgICBsZXQgaWRlbnRpdHkgPSB7XG4gICAgICAgICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XG4gICAgICAgICAgfTtcbiAgICAgICAgICBsZXQgZmlsZVNlbnRFdnQgPSB7IHZhbHVlIDogcmVzb3VyY2VGaWxlLCBpZGVudGl0eTogaWRlbnRpdHksIHJlc291cmNlOiByZXNvdXJjZUZpbGV9O1xuXG4vKiAgICAgICAgICBsZXQgcmVwb3J0ZXJTdGF0dXMgPSBuZXcgUmVnaXN0cmF0aW9uU3RhdHVzKGRhdGFPYmplY3QudXJsLCBfdGhpcy5fbWFuYWdlci5fcnVudGltZVVSTCwgX3RoaXMuX21hbmFnZXIuX2h5cGVydHlVUkwsIF90aGlzLl9tYW5hZ2VyLl9idXMgKTtcblxuICAgICAgICAgIC8vIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0byBzeW5jIHdpdGggY2hhdCByZXBvcnRlclxuXG4gICAgICAgICAgICBsZXQgc2hhcmUyUmVwb3J0ZXIgPSBmdW5jdGlvbihmaWxlLCBzdWJzY3JpYmVyLCBldnQsIHN0YXR1cykge1xuICAgICAgICAgICAgICBsZXQgc3RhdHVzT2ZSZXBvcnRlciA9IHN0YXR1cztcbiAgICAgICAgICAgICAgZmlsZS5zaGFyaW5nU3RhdHVzLnRoZW4ocmVzb2x2ZShldnQpKS5jYXRjaCgocmVzdWx0KT0+e1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuc2VuZEZpbGVdIHNoYXJlIGZhaWxlZDogJywgcmVzdWx0KTtcblxuICAgICAgICAgICAgICAgIHN0YXR1c09mUmVwb3J0ZXIub25MaXZlKCBzdWJzY3JpYmVyLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzT2ZSZXBvcnRlci51bnN1YnNjcmliZUxpdmUoc3Vic2NyaWJlcik7XG4gICAgICAgICAgICAgICAgZmlsZS5zaGFyZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBzaGFyZTJSZXBvcnRlcihmaWxlLCBzdWJzY3JpYmVyLCBldnQsIHN0YXR1c09mUmVwb3J0ZXIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgLy9UT0RPOiBzdWJzY3JpYmUgdG8gc3luYyB3aGVuIHJlcG9ydGVyIGlzIGxpdmUuIE5ldyBzeW5jaGVkIG1lc3NhZ2VzIHNob3VsZCB0cmlnZ2VyIG9uTWVzc2FnZSBpZSBvbkNoaWxkXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSovXG5cbi8vICAgICAgICAgICAgcmVzb3VyY2VGaWxlLnNoYXJlKHRydWUpLnRoZW4oKCk9PntcbiAgICAgICAgICAgICAgcmVzb2x2ZShmaWxlU2VudEV2dCk7XG4vLyAgICAgICAgICAgIH0pO1xuLy8gICAgICAgICAgICBzaGFyZTJSZXBvcnRlcihyZXNvdXJjZUZpbGUsIF90aGlzLl9tYW5hZ2VyLl9oeXBlcnR5VVJMLCBmaWxlU2VudEV2dCwgcmVwb3J0ZXJTdGF0dXMpO1xuICAgICAgICB9KTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xuICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGNoYXQgbWVzc2FnZS5cbiAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgIElzIHRoZSBDaGF0TWVzc2FnZSB0byBiZSBzZW50LlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbW11bmljYXRpb24uQ2hhdE1lc3NhZ2U+fSAgICAgICAgSXQgcmV0dXJucyB0aGUgQ2hhdE1lc3NhZ2UgY2hpbGQgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIFN5bmNoZXIgYXMgYSBQcm9taXNlLlxuICAgKi9cbiAgc2VuZChtZXNzYWdlLCBpZGVudGl0eSkge1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgbW9kZSA9IF90aGlzLmNvbnRyb2xsZXJNb2RlO1xuICAgIGxldCBkYXRhT2JqZWN0ID0gbW9kZSA9PT0gJ3JlcG9ydGVyJyA/IF90aGlzLmRhdGFPYmplY3RSZXBvcnRlciA6IF90aGlzLmRhdGFPYmplY3RPYnNlcnZlcjtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuLy8gICAgICBsZXQgX2RhdGFPYmplY3RDaGlsZDtcbiAgICAgIF90aGlzLmNoaWxkX2NzZXEgKz0gMTtcbiAgICAgIGxldCBtc2cgPSB7XG5cbi8qICAgICAgICB1cmw6IGRhdGFPYmplY3QuZGF0YS51cmwsXG4gICAgICAgIGNzZXE6IF90aGlzLmNoaWxkX2NzZXEsXG4gICAgICAgIHJlcG9ydGVyOiBkYXRhT2JqZWN0LmRhdGEucmVwb3J0ZXIsXG4gICAgICAgIHNjaGVtYTogZGF0YU9iamVjdC5kYXRhLnNjaGVtYSxcbiAgICAgICAgbmFtZTogZGF0YU9iamVjdC5kYXRhLm5hbWUsXG4gICAgICAgIGNyZWF0ZWQgOiBuZXcgRGF0ZSgpLnRvSlNPTigpLCovXG5cbiAgICAgICAgdHlwZTogJ2NoYXQnLFxuICAgICAgICBjb250ZW50OiBtZXNzYWdlXG4gICAgICB9XG5cbiAgICAgIGxldCBzZW5kZXIgPSBpZGVudGl0eSA/IGlkZW50aXR5IDoge1xuICAgICAgICB1c2VyUHJvZmlsZTogX3RoaXMubXlJZGVudGl0eVxuICAgICAgfTtcblxuXG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgY2hhdG1lc3NhZ2VzIHRvIHJlc291cmNlIC0gY2hhdCwgZmlsZVxuICAgICAgLy8gVE9ETzogY2hhbmdlIG1lc3NhZ2UgdG8gaHlwZXJ0eVJlc291cmNlIC0gaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9kZXYtc2VydmljZS1mcmFtZXdvcmsvdHJlZS9kZXZlbG9wL2RvY3MvZGF0YW1vZGVsL2RhdGEtb2JqZWN0cy9oeXBlcnR5LXJlc291cmNlXG4gICAgICAvLyBUT0RPOiBoYW5kbGUgd2l0aCBtdWx0aXBsZSByZXNvdXJjZXMgLSBpZiB0aGUgXCJtZXNzYWdlXCIgd2lsbCBiZSBkaWZmZXJlbnQgZm9yIGVhY2ggdHlwZSBvZiByZXNvdXJjZXNcbiAgICAgIGRhdGFPYmplY3QuYWRkQ2hpbGQobXNnLCBzZW5kZXIpLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdENoaWxkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXJdW2FkZENoaWxkIC0gQ2hhdCBNZXNzYWdlXTogJywgZGF0YU9iamVjdENoaWxkKTtcbiAgICAgICAgLy9yZXNvbHZlKGRhdGFPYmplY3RDaGlsZCk7XG5cbiAgICAgICAgLy9UT0RPOiBtb3ZlIHRvIHNlcGFyYXRlIGZ1bmN0aW9uXG5cblxuICAgICAgICBsZXQgbXNnID0ge1xuICAgICAgICAgIGNoaWxkSWQ6IGRhdGFPYmplY3RDaGlsZC5fY2hpbGRJZCxcbiAgICAgICAgICBmcm9tOiBkYXRhT2JqZWN0Q2hpbGQuX293bmVyLFxuICAgICAgICAgIHZhbHVlOiBkYXRhT2JqZWN0Q2hpbGQuZGF0YSxcbiAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgICAgICBpZGVudGl0eTogc2VuZGVyXG4gICAgICAgIH07XG5cbi8qICAgICAgICBsZXQgcmVwb3J0ZXJTdGF0dXMgPSBuZXcgUmVnaXN0cmF0aW9uU3RhdHVzKGRhdGFPYmplY3QudXJsLCBfdGhpcy5fbWFuYWdlci5fcnVudGltZVVSTCwgX3RoaXMuX21hbmFnZXIuX2h5cGVydHlVUkwsIF90aGlzLl9tYW5hZ2VyLl9idXMgKTtcblxuICAgICAgICAvLyByZWN1cnNpdmUgZnVuY3Rpb24gdG8gc3luYyB3aXRoIGNoYXQgcmVwb3J0ZXJcblxuICAgICAgICAgIGxldCBzaGFyZTJSZXBvcnRlciA9IGZ1bmN0aW9uKGNoaWxkLCBzdWJzY3JpYmVyLCBtc2csIHN0YXR1cykge1xuICAgICAgICAgICAgbGV0IHN0YXR1c09mUmVwb3J0ZXIgPSBzdGF0dXM7XG4gICAgICAgICAgICBjaGlsZC5zaGFyaW5nU3RhdHVzLnRoZW4ocmVzb2x2ZShtc2cpKS5jYXRjaCgocmVzdWx0KT0+e1xuXG4gICAgICAgICAgICAgICAgc3RhdHVzT2ZSZXBvcnRlci5vbkxpdmUoIHN1YnNjcmliZXIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHN0YXR1c09mUmVwb3J0ZXIudW5zdWJzY3JpYmVMaXZlKHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgICAgICAgY2hpbGQuc2hhcmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICBzaGFyZTJSZXBvcnRlcihjaGlsZCwgc3Vic2NyaWJlciwgbXNnLCBzdGF0dXNPZlJlcG9ydGVyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvL1RPRE86IHN1YnNjcmliZSB0byBzeW5jIHdoZW4gcmVwb3J0ZXIgaXMgbGl2ZS4gTmV3IHN5bmNoZWQgbWVzc2FnZXMgc2hvdWxkIHRyaWdnZXIgb25NZXNzYWdlIGllIG9uQ2hpbGRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0qL1xuXG4vLyAgICAgICAgICBzaGFyZTJSZXBvcnRlcihkYXRhT2JqZWN0Q2hpbGQsIF90aGlzLl9tYW5hZ2VyLl9oeXBlcnR5VVJMLCBtc2csIHJlcG9ydGVyU3RhdHVzKTtcbi8vICAgICAgICBkYXRhT2JqZWN0Q2hpbGQuc2hhcmUodHJ1ZSk7XG4gICAgICAgICAgcmVzb2x2ZShtc2cpO1xuXG5cbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBbb25DaGFuZ2UgZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayBbZGVzY3JpcHRpb25dXG4gICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgICAgICBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBvbkNoYW5nZShjYWxsYmFjaykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX29uQ2hhbmdlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlY2VpdmUgbmV3IG1lc3NhZ2VzLlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2sgRnVuY3Rpb24gdG8gaGFuZGxlIHdpdGggbmV3IG1lc3NhZ2VzXG4gICAqIEByZXR1cm4ge0NvbW11bmljYXRpb24uQ2hhdE1lc3NhZ2V9IG1cbiAgICovXG4gIG9uTWVzc2FnZShjYWxsYmFjaykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX29uTWVzc2FnZSA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFtvblVzZXJBZGRlZCBkZXNjcmlwdGlvbl1cbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7W3R5cGVdfSAgICAgICAgICAgIFtkZXNjcmlwdGlvbl1cbiAgICovXG4gIG9uVXNlckFkZGVkKGNhbGxiYWNrKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fb25Vc2VyQWRkZWQgPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBhbiB1c2VyIHdhcyByZW1vdmVkXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBjYWxsYmFjayBGdW5jdGlvbiBoYW5kbGUgd2l0aCB0aGUgcmVtb3ZlZCB1c2VyXG4gICAqIEByZXR1cm4ge1t0eXBlXX0gICAgICAgICAgICBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBvblVzZXJSZW1vdmVkKGNhbGxiYWNrKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fb25Vc2VyUmVtb3ZlZCA9IGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZWNlaXZlIHJlcXVlc3RzIHRvIGNsb3NlIHRoZSBHcm91cCBDaGF0IGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHtEZWxldGVFdmVudH0gVGhlIERlbGV0ZUV2ZW50IGZpcmVkIGJ5IHRoZSBTeW5jaGVyIHdoZW4gdGhlIENoYXQgaXMgY2xvc2VkLlxuICAgKi9cbiAgb25DbG9zZShjYWxsYmFjaykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX29uQ2xvc2UgPSBjYWxsYmFjaztcbiAgfVxuXG4gIG9uUmVzcG9uc2UoY2FsbGJhY2spIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9vblJlc3BvbnNlID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCAvIGludml0ZSBuZXcgdXNlciBvbiBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxuICAgKiBPbmx5IHRoZSBSZXBvcnRlciwgaS5lLiB0aGUgSHlwZXJ0eSB0aGF0IGhhcyBjcmVhdGVkIHRoZSBHcm91cCBDaGF0LCBpcyBhbGxvd2VkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLlxuICAgKiBAcGFyYW0ge1VSTC5Vc2VyVVJMfSAgdXNlcnMgIFVzZXIgdG8gYmUgaW52aXRlZCB0byBqb2luIHRoZSBHcm91cCBDaGF0IHRoYXQgaXMgaWRlbnRpZmllZCB3aXRoIHJlVEhJTksgVXNlciBVUkwuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59ICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW52aXRlZCBvciBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuLyogIGFkZFVzZXIodXNlcnMpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgaGF2ZUVtcHR5RWxlbWVudHMgPSAoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ0VsZW1lbnQ6JywgZWxlbWVudC5sZW5ndGgpO1xuICAgICAgcmV0dXJuIGVsZW1lbnQubGVuZ3RoICE9PSAwO1xuICAgIH07XG5cbiAgICBsZXQgbm90Rm91bmRFbGVtZW50cyA9IChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygndXNlciBub3QgZm91bmQ6ICcsIGVsZW1lbnQpO1xuICAgICAgcmV0dXJuICEoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZyk7XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgaWYgKHVzZXJzLmZpbHRlcihoYXZlRW1wdHlFbGVtZW50cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoJ0RvblxcJ3QgaGF2ZSB1c2VycyB0byBpbnZpdGUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlcnMgXTogJywgdXNlcnMpO1xuXG4gICAgICAvKl90aGlzLnNlYXJjaC51c2Vycyh1c2VycywgZG9tYWlucywgWydjb21tJ10sIFsnY2hhdCddKVxuXG4gICAgLnRoZW4oKGh5cGVydGllc0lEcykgPT4ge1xuXG4gICAgICBpZiAoaHlwZXJ0aWVzSURzLmZpbHRlcihub3RGb3VuZEVsZW1lbnRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgJ1VzZXIocykgbm90IGZvdW5kJztcbiAgICAgIH1cblxuICAgICAgbGV0IHNlbGVjdGVkSHlwZXJ0aWVzID0gaHlwZXJ0aWVzSURzLm1hcCgoaHlwZXJ0eSkgPT4ge1xuICAgICAgICByZXR1cm4gaHlwZXJ0eS5oeXBlcnR5SUQ7XG4gICAgICB9KTsqL1xuXG4vKiAgICAgIGxldCB1c2Vyc0Rpc2NvdmVyeSA9IFtdO1xuICAgICAgbGV0IGRpc2Nvbm5lY3RlZCA9IFtdO1xuICAgICAgbGV0IGxpdmUgPSB7fTtcblxuICAgICAgdXNlcnMuZm9yRWFjaCgodXNlcikgPT4ge1xuICAgICAgICBsZXQgdXNlckRpc2NvdmVyeVByb21pc2UgPSBfdGhpcy5kaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNETyh1c2VyLnVzZXIsIFsnY29tbSddLCBbJ2NoYXQnXSwgdXNlci5kb21haW4pO1xuICAgICAgICAgIHVzZXJzRGlzY292ZXJ5LnB1c2godXNlckRpc2NvdmVyeVByb21pc2UpO1xuICAgICAgICB9KTtcblxuICAgICAgUHJvbWlzZS5hbGwodXNlcnNEaXNjb3ZlcnkpLnRoZW4oKHVzZXJEaXNjb3ZlcnlSZXN1bHRzKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlcnNdIFVzZXJzIERpc2NvdmVyeSBSZXN1bHRzLT4nLCB1c2VyRGlzY292ZXJ5UmVzdWx0cyk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkSHlwZXJ0aWVzID0gW107XG5cbiAgICAgICAgIHVzZXJEaXNjb3ZlcnlSZXN1bHRzLmZvckVhY2goKHVzZXJEaXNjb3ZlcnlSZXN1bHQpID0+IHtcblxuICAgICAgICAgICB1c2VyRGlzY292ZXJ5UmVzdWx0LmZvckVhY2goKGRpc2NvdmVyZWQpPT57XG4gICAgICAgICAgICAgaWYgKGRpc2NvdmVyZWQuZGF0YS5zdGF0dXMgPT09ICdsaXZlJyl7XG4gICAgICAgICAgICAgICBzZWxlY3RlZEh5cGVydGllcy5wdXNoKGRpc2NvdmVyZWQuZGF0YS5oeXBlcnR5SUQpO1xuICAgICAgICAgICAgICAgbGl2ZVtkaXNjb3ZlcmVkLmRhdGEuaHlwZXJ0eUlEXSA9IGRpc2NvdmVyZWQ7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICAgIGVsc2UgaWYgKGRpc2Nvbm5lY3RlZC5sZW5ndGggPCA1KSBkaXNjb25uZWN0ZWQucHVzaChkaXNjb3ZlcmVkKTtcbiAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXJdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5bmNoZXIgQ3JlYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXFxuJyk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXVNlbGVjdGVkIEh5cGVydGllczogISEhICcsIHNlbGVjdGVkSHlwZXJ0aWVzKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBIYXZlICR7c2VsZWN0ZWRIeXBlcnRpZXMubGVuZ3RofSB1c2VycztgKTtcbi8vICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlcl0gSHlwZXJ0aWVzSURzICcsIGh5cGVydGllc0lEcyk7XG5cbiAgICAgICAgbGV0IGRhdGFPYmplY3QgPSBfdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IF90aGlzLmRhdGFPYmplY3RSZXBvcnRlciA6IF90aGlzLmRhdGFPYmplY3RPYnNlcnZlcjtcblxuICAgICAgICBpZiAoZGlzY29ubmVjdGVkLmxlbmd0aCA+IDApIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIuaW52aXRlRGlzY29ubmVjdGVkSHlwZXJ0aWVzKGRpc2Nvbm5lY3RlZCwgZGF0YU9iamVjdCk7XG5cbiAgICAgICAgZGF0YU9iamVjdC5pbnZpdGVPYnNlcnZlcnMoc2VsZWN0ZWRIeXBlcnRpZXMpO1xuXG4gICAgICAgIGlmIChkYXRhT2JqZWN0Lmludml0YXRpb25zLmxlbmd0aCA+IDApIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIucHJvY2Vzc0ludml0YXRpb25zKGxpdmUsIGRhdGFPYmplY3QpO1xuXG4gICAgICAgIHJldHVybjtcblxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXJdQXJlIGludml0ZWQgd2l0aCBzdWNjZXNzICcgKyB1c2Vycy5sZW5ndGggKyAnIHVzZXJzOycpO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG5cblxuXG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCB3aGVuIHRyeWluZyB0byBpbnZpdGUgdXNlcnM7XFxuJywgcmVhc29uKTtcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgfSk7XG5cbiAgICB9KTtcblxuICB9Ki9cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlcXVlc3QgdGhlIFJlcG9ydGVyIHRvIGFkZCAvIGludml0ZSBuZXcgdXNlciBvbiBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxuICAgKiBPbmx5IE9ic2VydmVycyBhcmUgYWxsb3dlZCB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtVUkwuVXNlclVSTH0gIHVzZXJzICBVc2VyIHRvIGJlIGludml0ZWQgdG8gam9pbiB0aGUgR3JvdXAgQ2hhdCB0aGF0IGlzIGlkZW50aWZpZWQgd2l0aCByZVRISU5LIFVzZXIgVVJMLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSAgIEl0IHJldHVybnMgYXMgYSBQcm9taXNlIHRydWUgaWYgc3VjY2Vzc2Z1bGx5IGludml0ZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbi8qICBhZGRVc2VyUmVxKHVzZXJzKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy9jaGVjayBpcyBPYnNlcnZlciBhbmQgaW52b2tlIG9ic2VydmVyLmV4ZWN1dGUoKSB3aXRoIG5ldyBwcm9taXNlXG4gICAgbGV0IGhhdmVFbXB0eUVsZW1lbnRzID0gKGVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdFbGVtZW50OicsIGVsZW1lbnQubGVuZ3RoKTtcbiAgICAgIHJldHVybiBlbGVtZW50Lmxlbmd0aCAhPT0gMDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBpZiAodXNlcnMuZmlsdGVyKGhhdmVFbXB0eUVsZW1lbnRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIERvblxcJ3QgaGF2ZSB1c2VycyB0byBhZGQnKTtcbiAgICAgIH1cbiAgICAgIGlmICghX3RoaXMuY29udHJvbGxlck1vZGUgPT09ICdvYnNlcnZlcicpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIG9ubHkgYWxsb3dlZCB0byBDaGF0IE9ic2VydmVyJyk7XG5cbiAgICAgIGxldCBhZGRVc2VyID0gX3RoaXMuYWRkVXNlcih1c2Vycyk7XG5cbiAgICAgIGlmIChfdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyKSB7XG4gICAgICAgIGFkZFVzZXIgPSBfdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyLmV4ZWN1dGUoJ2FkZFVzZXInLCB1c2Vycyk7XG4gICAgICB9XG5cbiAgICAgIGFkZFVzZXIudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIFJlcXVlc3QgYWNjZXB0ZWQgYnkgUmVwb3J0ZXIgJyk7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5hZGRVc2VyUmVxXSBSZXF1ZXN0IHJlamVjdGVkIGJ5IFJlcG9ydGVyO1xcbicsIHJlYXNvbik7XG4gICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gIH0pO1xuXG59Ki9cblxuICBvbkludml0YXRpb25SZXNwb25zZShjYWxsYmFjaykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX29uSW52aXRhdGlvblJlc3BvbnNlID0gY2FsbGJhY2s7XG4vLyAgICBfdGhpcy5faW52aXRhdGlvbnNIYW5kbGVyLmludml0YXRpb25SZXNwb25zZSA9IGNhbGxiYWNrO1xuICB9XG5cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSBhIHVzZXIgZnJvbSBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxuICAgKiBPbmx5IHRoZSBSZXBvcnRlciwgaS5lLiB0aGUgSHlwZXJ0eSB0aGF0IGhhcyBjcmVhdGVkIHRoZSBHcm91cCBDaGF0LCBpcyBhbGxvd2VkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT4gYm9vbGVhbn0gUHJvbWlzZSB3aXRoIHRoZSBzdGF0dXNcbiAgICovXG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgYSB1c2VyIGZyb20gYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cbiAgICogT25seSB0aGUgUmVwb3J0ZXIsIGkuZS4gdGhlIEh5cGVydHkgdGhhdCBoYXMgY3JlYXRlZCB0aGUgR3JvdXAgQ2hhdCwgaXMgYWxsb3dlZCB0byB1c2UgdGhpcyBmdW5jdGlvbi5cbiAgICogQHBhcmFtICB7VVJMLlVzZXJVUkx9IHVzZXIgICAgICAgVXNlciB0byBiZSByZW1vdmVkIGZyb20gdGhlIEdyb3VwIENoYXQgdGhhdCBpcyBpZGVudGlmaWVkIHdpdGggcmVUSElOSyBVc2VyIFVSTC5cbiAgICogQHJldHVybiB7PFByb21pc2U+IGJvb2xlYW59ICAgICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBvciBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICByZW1vdmVVc2VyKHVzZXIpIHtcblxuICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGUgcmVtb3ZlVXNlcjtcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXU5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICcsIHVzZXIpO1xuXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNsb3NlIGFuIGV4aXN0aW5nIEdyb3VwIENoYXQgaW5zdGFuY2UuXG4gICAqIE9ubHkgYXZhaWxhYmxlIHRvIENoYXQgR3JvdXAgUmVwb3J0ZXJzIGkuZS4gdGhlIEh5cGVydHkgaW5zdGFuY2UgdGhhdCBjcmVhdGVkIHRoZSBHcm91cCBDaGF0LlxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5Cb29sZWFufSBJdCByZXR1cm5zIGFzIGEgUHJvbWlzZSB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBjbG9zZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgY2xvc2UoZGVsID0gdHJ1ZSkge1xuICAgIC8vIFRPRE86IHRoZSBkYXRhT2JqZWN0UmVwb3J0ZXIuZGVsZXRlIHNob3VsZCBiZSBhIFByb21pc2U7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIFxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIFxuICAgICAgaWYgKF90aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInKSB7XG4gICAgICAgIC8vIHJlcG9ydGVyXG4vLyAgICAgICAgX3RoaXMuX2ludml0YXRpb25zSGFuZGxlci5jbGVhbkludml0YXRpb25zKF90aGlzLmRhdGFPYmplY3RSZXBvcnRlcikudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKCFkZWwpIHtcbiAgICAgICAgICAgIF90aGlzLl9tYW5hZ2VyLmNvbW11bmljYXRpb25PYmplY3Quc3RhdHVzID0gJ2Nsb3NlZCc7XG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNle1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgZGVsZXRlIF90aGlzLl9tYW5hZ2VyLl9yZXBvcnRlcnNDb250cm9sbGVyc1tfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIudXJsXTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIuZGVsZXRlKCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX29uQ2xvc2UpIF90aGlzLl9vbkNsb3NlKHtcbiAgICAgICAgICAgICAgICAgIGNvZGU6IDIwMCxcbiAgICAgICAgICAgICAgICAgIGRlc2M6ICdkZWxldGVkJyxcbiAgICAgICAgICAgICAgICAgIHVybDogX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyLnVybFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgfSk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG9ic2VydmVyXG4gICAgICAgIGlmKGRlbCl7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5fbWFuYWdlci5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbX3RoaXMuZGF0YU9iamVjdE9ic2VydmVyLnVybF07XG4gICAgICAgICAgICBfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2V7XG4gICAgICAgICAgLy8gVE9ETzogc2VuZCBtZXNzYWdlIFxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0gXG4gICAgICAgIFxuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBDaGF0O1xuIiwiXG4vKipcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cbipcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKiovXG5cbi8vIFNlcnZpY2UgRnJhbWV3b3JrXG4vL2ltcG9ydCBJZGVudGl0eU1hbmFnZXIgZnJvbSAnLi4vaWRlbnRpdHlNYW5hZ2VyL0lkZW50aXR5TWFuYWdlcic7XG4vL2ltcG9ydCBSZWdpc3RyYXRpb25TdGF0dXMgZnJvbSAnLi4vZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cyc7XG4vL2ltcG9ydCBEaXNjb3ZlcnkgZnJvbSAnLi4vZGlzY292ZXJ5L0Rpc2NvdmVyeSc7XG4vL2ltcG9ydCBTeW5jaGVyIGZyb20gJy4uL3N5bmNoZXIvU3luY2hlcic7XG5cbi8vIFV0aWxzXG4vL2ltcG9ydCB7ZGl2aWRlVVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XG4vL2ltcG9ydCBTZWFyY2ggZnJvbSAnLi4vdXRpbHMvU2VhcmNoJztcblxuLy8gSW50ZXJuYWxzXG5pbXBvcnQgeyBjb21tdW5pY2F0aW9uT2JqZWN0LCBDb21tdW5pY2F0aW9uU3RhdHVzLCBjb21tdW5pY2F0aW9uQ2hpbGRyZW4gfSBmcm9tICcuL2NvbW11bmljYXRpb24nO1xuaW1wb3J0IENoYXQgZnJvbSAnLi9DaGF0JztcbmltcG9ydCB7IFVzZXJJbmZvIH0gZnJvbSAnLi9Vc2VySW5mbyc7XG5cbi8qKlxuKiBIeXBlcnR5IFNpbXBsZSBHcm91cCBDaGF0IE1hbmFnZXIgQVBJIFxuKiBAYXV0aG9yIFZpdG9yIFNpbHZhIFt2aXRvci10LXNpbHZhQHRlbGVjb20ucHRdXG4qIEB2ZXJzaW9uIDAuMS4wXG4qL1xuY2xhc3MgU2ltcGxlU2ltcGxlQ2hhdE1hbmFnZXIge1xuXG4gIGNvbnN0cnVjdG9yKG15VXJsLCBidXMsIGNvbmZpZ3VyYXRpb24sIHN5bmNoZXIsIGZhY3RvcnkpIHtcbiAgICBpZiAoIW15VXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1tTaW1wbGVDaGF0TWFuYWdlci5jb25zdHJ1Y3Rvcl0gVGhlIG15VXJsIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xuICAgIGlmICghYnVzKSB0aHJvdyBuZXcgRXJyb3IoJ1tTaW1wbGVDaGF0TWFuYWdlci5jb25zdHJ1Y3Rvcl0gVGhlIE1pbmlCdXMgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XG4gICAgaWYgKCFjb25maWd1cmF0aW9uKSB0aHJvdyBuZXcgRXJyb3IoJ1tTaW1wbGVDaGF0TWFuYWdlci5jb25zdHJ1Y3Rvcl0gVGhlIGNvbmZpZ3VyYXRpb24gaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGlmICghc3luY2hlcikge1xuICAgICAgc3luY2hlciA9IGZhY3RvcnkuY3JlYXRlU3luY2hlcihteVVybCwgYnVzLCBjb25maWd1cmF0aW9uKTtcbiAgICB9XG5cbiAgICBfdGhpcy5fcnVudGltZVVSTCA9IGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTDtcblxuICAgIGxldCBkb21haW4gPSBmYWN0b3J5LmRpdmlkZVVSTChfdGhpcy5fcnVudGltZVVSTCkuZG9tYWluO1xuLy8gICAgbGV0IGRpc2NvdmVyeSA9IGZhY3RvcnkuY3JlYXRlRGlzY292ZXJ5KG15VXJsLCBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwsIGJ1cyk7XG4gICAgbGV0IGlkZW50aXR5TWFuYWdlciA9IGZhY3RvcnkuY3JlYXRlSWRlbnRpdHlNYW5hZ2VyKG15VXJsLCBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwsIGJ1cyk7XG5cbiAgICBfdGhpcy5fb2JqZWN0RGVzY1VSTCA9ICdoeXBlcnR5LWNhdGFsb2d1ZTovL2NhdGFsb2d1ZS4nICsgZG9tYWluICsgJy8ud2VsbC1rbm93bi9kYXRhc2NoZW1hL0NvbW11bmljYXRpb24nO1xuXG4gICAgX3RoaXMuX3JlcG9ydGVyc0NvbnRyb2xsZXJzID0ge307XG4gICAgX3RoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzID0ge307XG5cbiAgICBfdGhpcy5fbXlVcmwgPSBteVVybDtcbiAgICBfdGhpcy5fYnVzID0gYnVzO1xuICAgIF90aGlzLl9zeW5jaGVyID0gc3luY2hlcjtcbiAgICBfdGhpcy5fZG9tYWluID0gZG9tYWluO1xuXG4vLyAgICBfdGhpcy5kaXNjb3ZlcnkgPSBkaXNjb3Zlcnk7XG4gICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyID0gaWRlbnRpdHlNYW5hZ2VyO1xuICAgIF90aGlzLmN1cnJlbnRJZGVudGl0eTtcblxuLy8gICAgX3RoaXMuc2VhcmNoID0gZmFjdG9yeS5jcmVhdGVTZWFyY2goZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpO1xuXG4gICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdCA9IGNvbW11bmljYXRpb25PYmplY3Q7XG5cbiAgICBfdGhpcy5jb21tdW5pY2F0aW9uQ2hpbGRyZW4gPSBjb21tdW5pY2F0aW9uQ2hpbGRyZW47XG5cbi8vICAgIGNvbnNvbGUubG9nKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIERpc2NvdmVyICcsIGRpc2NvdmVyeSk7XG4gICAgY29uc29sZS5sb2coJ1tTaW1wbGVDaGF0TWFuYWdlcl0gSWRlbnRpdHkgTWFuYWdlciAnLCBpZGVudGl0eU1hbmFnZXIpO1xuXG5cbiAgfVxuXG4gIHNldCBvZmZsaW5lKG9mZmxpbmUpIHtcbiAgICB0aGlzLl9vZmZsaW5lID0gb2ZmbGluZTtcbiAgfVxuXG4gIGdldCBvZmZsaW5lKCkge1xuICAgIHJldHVybiB0aGlzLl9vZmZsaW5lID8gdGhpcy5fb2ZmbGluZSA6IGZhbHNlO1xuICB9XG5cbiAgc2V0IGJhY2t1cChiYWNrdXApIHtcbiAgICB0aGlzLl9iYWNrdXAgPSBiYWNrdXA7XG4gIH1cblxuICBnZXQgYmFja3VwKCkge1xuICAgIHJldHVybiB0aGlzLl9iYWNrdXAgPyB0aGlzLl9iYWNrdXAgOiBmYWxzZTtcbiAgfVxuXG4gIHByb2Nlc3NOb3RpZmljYXRpb24oZXZlbnQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGNvbnNvbGUubG9nKCdbU2ltcGxlQ2hhdE1hbmFnZXIucHJvY2Vzc05vdGlmaWNhdGlvbjogJywgZXZlbnQpO1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjcmVhdGUnKSB7XG5cbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlIDEwMCBmb3IgTWVzc2FnZS5SZXNwb25zZVxuICAgICAgLy8gZXZlbnQuYWNrKDIwMCk7XG5cbiAgICAgIGlmIChfdGhpcy5fb25JbnZpdGF0aW9uKSB7IF90aGlzLl9vbkludml0YXRpb24oZXZlbnQpOyB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkZWxldGUnKSB7XG4gICAgICAvLyBUT0RPOiByZXBsYWNlIHRoZSAyMDAgZm9yIE1lc3NhZ2UuUmVzcG9uc2VcbiAgICAgIGV2ZW50LmFjaygyMDApO1xuXG4gICAgICBfdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbZXZlbnQudXJsXS5jbG9zZUV2ZW50ID0gZXZlbnQ7XG5cbiAgICAgIGRlbGV0ZSBfdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbZXZlbnQudXJsXTtcblxuICAgICAgX3RoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzLmNsb3NlRXZlbnQgPSBldmVudDtcblxuICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdCA9IGNvbW11bmljYXRpb25PYmplY3Q7XG5cblxuICAgICAgZm9yIChsZXQgdXJsIGluIHRoaXMuX3JlcG9ydGVyc0NvbnRyb2xsZXJzKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydGVyc0NvbnRyb2xsZXJzW3VybF0uY2xvc2UoZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCB1cmwgaW4gdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnMpIHtcbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbdXJsXS5jbG9zZShldmVudCk7XG4gICAgICB9XG5cbiAgICB9XG4gIH1cblxuICBteUlkZW50aXR5KGlkZW50aXR5KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zb2xlLmluZm8oJ1tTaW1wbGVDaGF0TWFuYWdlci5teUlkZW50aXR5XScpO1xuICAgICAgaWYgKGlkZW50aXR5KSByZXR1cm4gcmVzb2x2ZShpZGVudGl0eSk7XG5cbiAgICAgIGlmIChfdGhpcy5fbXlVcmwuaW5jbHVkZXMoJ2h5cGVydHk6Ly8nKSkge1xuICAgICAgICBfdGhpcy5pZGVudGl0eU1hbmFnZXIuZGlzY292ZXJVc2VyUmVnaXN0ZXJlZCgpLnRoZW4oKGlkZW50aXR5KSA9PiB7XG4gICAgICAgICAgX3RoaXMuY3VycmVudElkZW50aXR5ID0gaWRlbnRpdHk7XG4gICAgICAgICAgcmVzb2x2ZShpZGVudGl0eSk7XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLmlkZW50aXR5TWFuYWdlci5kaXNjb3ZlcklkZW50aXR5UGVySWRQKCkudGhlbigoaWRlbnRpdHkpID0+IHtcbiAgICAgICAgICBfdGhpcy5jdXJyZW50SWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICAgICAgICByZXNvbHZlKGlkZW50aXR5KTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgR3JvdXAgQ2hhdCBwcm92aWRpbmcgdGhlIG5hbWUgYW5kIHRoZSBpZGVudGlmaWVycyBvZiB1c2VycyB0byBiZSBpbnZpdGVkLlxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgbmFtZSAgSXMgYSBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIEdyb3VwIENoYXRcbiAgICogQHBhcmFtICB7YXJyYXk8VVJMLkh5cGVydHlVUkw+fSAgICAgICAgIGh5cGVydGllcyBBcnJheSBvZiBoeXBlcnRpZXMgdG8gYmUgaW52aXRlZCB0byBqb2luIHRoZSBHcm91cCBDaGF0LiBVc2VycyBhcmUgaWRlbnRpZmllZCB3aXRoIHJlVEhJTksgVXNlciBVUkwsIGxpa2UgdGhpcyBmb3JtYXQgdXNlcjovLzxpcGRkb21haW4+Lzx1c2VyLWlkZW50aWZpZXI+XG4gICAqIEByZXR1cm4gezxQcm9taXNlPkNoYXRDb250cm9sbGVyfSAgICBBIENoYXRDb250cm9sbGVyIG9iamVjdCBhcyBhIFByb21pc2UuXG4gICAqL1xuICBjcmVhdGUobmFtZSwgaHlwZXJ0aWVzLCBleHRyYSA9IHt9KSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBzeW5jaGVyID0gX3RoaXMuX3N5bmNoZXI7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcbiAgICAgIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QuY3NlcSA9IDE7XG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0LnN0YXJ0aW5nVGltZSA9IG5ldyBEYXRlKCkudG9KU09OKCk7XG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0LnN0YXR1cyA9ICBDb21tdW5pY2F0aW9uU3RhdHVzLk9QRU47XG5cbiAgICAgIGxldCBteUlkZW50aXR5O1xuXG4gICAgICBfdGhpcy5teUlkZW50aXR5KCkudGhlbigoaWRlbnRpdHkpID0+IHtcbiAgICAgICAgbXlJZGVudGl0eSA9IGlkZW50aXR5O1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXBsZUNoYXRNYW5hZ2VyLmNyZWF0ZSBdIE15IElkZW50aXR5JywgaWRlbnRpdHkpO1xuXG4gICAgICAgIC8vIGxldCB1cmwgPSBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0LnJlcG9ydGVyO1xuXG4gICAgICAgIGxldCB1c2VySW5mbyA9IG5ldyBVc2VySW5mbyhfdGhpcy5fbXlVcmwsIF90aGlzLl9kb21haW4sIGlkZW50aXR5KTtcblxuICAgICAgICAvLyBBZGQgbXkgaWRlbnRpdHlcbiAgICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5wYXJ0aWNpcGFudHNbaWRlbnRpdHkuZ3VpZF0gPSB1c2VySW5mbztcblxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXBsZUNoYXRNYW5hZ2VyLmNyZWF0ZSBdIHBhcnRpY2lwYW50czogJywgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5wYXJ0aWNpcGFudHMpO1xuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXBsZUNoYXRNYW5hZ2VyLmNyZWF0ZSBdIGNvbW11bmljYXRpb25PYmplY3QnLCBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0KTtcblxuXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3luY2hlciBDcmVhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBcXG4nKTtcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tTaW1wbGVDaGF0TWFuYWdlcl0gU2VsZWN0ZWQgSHlwZXJ0aWVzOiAhISEgJywgaHlwZXJ0aWVzKTtcbi8vICAgICAgICAgIGNvbnNvbGUuaW5mbyhgSGF2ZSAke2h5cGVydGllcy5sZW5ndGh9IHVzZXJzO2ApO1xuICAgICAgICAgIGxldCBtdXR1YWwgPSBleHRyYS5tdXR1YWwgPyBleHRyYS5tdXR1YWwgOiB0cnVlO1xuXG4gICAgICAgICAgbGV0IGlucHV0ID0gT2JqZWN0LmFzc2lnbih7cmVzb3VyY2VzOiBbJ2NoYXQnXSwgbXV0dWFsOiBtdXR1YWx9LCBleHRyYSk7XG4gICAgICAgICAgZGVsZXRlIGlucHV0Lm5hbWU7XG5cbiAgICAgICAgICBpZiAoX3RoaXMub2ZmbGluZSkgaW5wdXQub2ZmbGluZSA9IF90aGlzLm9mZmxpbmU7XG4gICAgICAgICAgaWYgKF90aGlzLmJhY2t1cCkgaW5wdXQuYmFja3VwID0gX3RoaXMuYmFja3VwO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coJ1tTaW1wbGVDaGF0TWFuYWdlcl0gaW5wdXQgZGF0YTonLCBpbnB1dCk7XG4gICAgICAgICAgcmV0dXJuIHN5bmNoZXIuY3JlYXRlKF90aGlzLl9vYmplY3REZXNjVVJMLCBoeXBlcnRpZXMsIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QsIHRydWUsIGZhbHNlLCBuYW1lLCB7fSwgaW5wdXQpO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RSZXBvcnRlcikge1xuXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIDMuIFJldHVybiBDcmVhdGUgRGF0YSBPYmplY3QgUmVwb3J0ZXInLCBkYXRhT2JqZWN0UmVwb3J0ZXIpO1xuXG4gICAgICAgICAgbGV0IGNoYXQgPSBuZXcgQ2hhdChzeW5jaGVyLCBfdGhpcy5fZG9tYWluLCBteUlkZW50aXR5LCBfdGhpcyk7XG4gICAgICAgICAgY2hhdC5kYXRhT2JqZWN0UmVwb3J0ZXIgPSBkYXRhT2JqZWN0UmVwb3J0ZXI7XG5cbiAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXJzQ29udHJvbGxlcnNbZGF0YU9iamVjdFJlcG9ydGVyLnVybF0gPSBjaGF0O1xuXG4vLyAgICAgICAgICBjb25zb2xlLmxvZygnW1NpbXBsZUNoYXRNYW5hZ2VyXSBjaGF0IGludml0YXRpb25zSGFuZGxlcjogJywgICBjaGF0Lmludml0YXRpb25zSGFuZGxlcik7XG5cbiAgICAgICAgICAvLyBwcm9jZXNzIGludml0YXRpb25zIHRvIGhhbmRsZSBub3QgcmVjZWl2ZWQgaW52aXRhdGlvbnNcbi8qICAgICAgICAgIGlmIChkYXRhT2JqZWN0UmVwb3J0ZXIuaW52aXRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY2hhdC5pbnZpdGF0aW9uc0hhbmRsZXIucHJvY2Vzc0ludml0YXRpb25zKGxpdmUsIGRhdGFPYmplY3RSZXBvcnRlcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgYW55IGludml0ZWQgVXNlciBpcyBkaXNjb25uZWN0ZWQgbGV0J3Mgd2FpdCB1bnRpbCBpdCBpcyBjb25uZWN0ZWQgYWdhaW5cbiAgICAgICAgICBpZiAoZGlzY29ubmVjdGVkLmxlbmd0aCA+IDApIGNoYXQuaW52aXRhdGlvbnNIYW5kbGVyLmludml0ZURpc2Nvbm5lY3RlZEh5cGVydGllcyhkaXNjb25uZWN0ZWQsIGRhdGFPYmplY3RSZXBvcnRlcik7XG4qL1xuICAgICAgICAgIHJlc29sdmUoY2hhdCk7XG5cbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XG4gICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0pO1xuXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltcGxlQ2hhdE1hbmFnZXIuY3JlYXRlXSBNeUlkZW50aXR5IEVycm9yOicsIHJlYXNvbik7XG4gICAgICAgIHJldHVybiByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuLy8gICAgfSk7XG5cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBoYW5kbGUgbm90aWZpY2F0aW9ucyBhYm91dCBpbmNvbWluZyBpbnZpdGF0aW9ucyB0byBqb2luIGEgR3JvdXAgQ2hhdC5cbiAgICogQHBhcmFtICB7RnVuY3Rpb259IENyZWF0ZUV2ZW50IFRoZSBDcmVhdGVFdmVudCBmaXJlZCBieSB0aGUgU3luY2hlciB3aGVuIGFuIGludml0YWlvbiBpcyByZWNlaXZlZFxuICAgKi9cbiAgb25JbnZpdGF0aW9uKGNhbGxiYWNrKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fb25JbnZpdGF0aW9uID0gY2FsbGJhY2s7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGpvaW4gYSBHcm91cCBDaGF0LlxuICAgKiBAcGFyYW0gIHtVUkwuQ29tbXVuaWNhdGlvblVSTH0gaW52aXRhdGlvblVSTCAgVGhlIENvbW11bmljYXRpb24gVVJMIG9mIHRoZSBHcm91cCBDaGF0IHRvIGpvaW4gdGhhdCBpcyBwcm92aWRlZCBpbiB0aGUgaW52aXRhdGlvbiBldmVudFxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5DaGF0Q29udHJvbGxlcn0gICAgICAgICAgICAgSXQgcmV0dXJucyB0aGUgQ2hhdENvbnRyb2xsZXIgb2JqZWN0IGFzIGEgUHJvbWlzZVxuICAgKi9cbiAgam9pbihpbnZpdGF0aW9uVVJMLCBtdXR1YWwgPSBmYWxzZSwgaWRlbnRpdHkpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgbGV0IHN5bmNoZXIgPSBfdGhpcy5fc3luY2hlcjtcbiAgICAgIGxldCBteUlkZW50aXR5O1xuXG4gICAgICBjb25zb2xlLmluZm8oJ1tTaW1wbGVDaGF0TWFuYWdlcl0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5bmNoZXIgc3Vic2NyaWJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXFxuJyk7XG4gICAgICBjb25zb2xlLmluZm8oJ2ludml0YXRpb25VUkwnLCBpbnZpdGF0aW9uVVJMKTtcbiAgICAgIF90aGlzLm15SWRlbnRpdHkoaWRlbnRpdHkpLnRoZW4oKGlkZW50aXR5KSA9PiB7XG4gICAgICAgIG15SWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICAgICAgbGV0IGlucHV0ID0ge1xuICAgICAgICAgIHNjaGVtYTogX3RoaXMuX29iamVjdERlc2NVUkwsXG4gICAgICAgICAgcmVzb3VyY2U6IGludml0YXRpb25VUkwsXG4gICAgICAgICAgc3RvcmU6IHRydWUsXG4gICAgICAgICAgcDJwOiBmYWxzZSxcbiAgICAgICAgICBtdXR1YWw6IG11dHVhbCxcbiAgICAgICAgICBkb21haW5fc3Vic2NyaXB0aW9uOiB0cnVlLFxuICAgICAgICAgIGlkZW50aXR5OiBpZGVudGl0eVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChfdGhpcy5vZmZsaW5lKSBpbnB1dC5vZmZsaW5lID0gX3RoaXMub2ZmbGluZTtcblxuICAgICAgICByZXR1cm4gc3luY2hlci5zdWJzY3JpYmUoaW5wdXQpO1xuXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RPYnNlcnZlcikge1xuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGEgT2JqZWN0IE9ic2VydmVyOiAnLCBkYXRhT2JqZWN0T2JzZXJ2ZXIpO1xuXG4gICAgICAgIGxldCBjaGF0ID0gbmV3IENoYXQoc3luY2hlciwgX3RoaXMuX2RvbWFpbiwgbXlJZGVudGl0eSwgX3RoaXMpO1xuICAgICAgICByZXNvbHZlKGNoYXQpO1xuXG4gICAgICAgIGNoYXQuZGF0YU9iamVjdE9ic2VydmVyID0gZGF0YU9iamVjdE9ic2VydmVyO1xuXG4gICAgICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVyc1tkYXRhT2JqZWN0T2JzZXJ2ZXIudXJsXSA9IGNoYXQ7XG5cbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTaW1wbGVTaW1wbGVDaGF0TWFuYWdlcjtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cbmltcG9ydCBTeW5jaGVyIGZyb20gJy4uL3N5bmNoZXIvU3luY2hlcic7XG5pbXBvcnQgTm90aWZpY2F0aW9uSGFuZGxlciBmcm9tICcuLi9zeW5jaGVyL05vdGlmaWNhdGlvbkhhbmRsZXInO1xuaW1wb3J0IHtkaXZpZGVVUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBJZGVudGl0eU1hbmFnZXIgZnJvbSAnLi4vaWRlbnRpdHkvSWRlbnRpdHlNYW5hZ2VyJztcbmltcG9ydCBEaXNjb3ZlcnkgZnJvbSAnLi4vZGlzY292ZXJ5L0Rpc2NvdmVyeSc7XG5pbXBvcnQgUmVnaXN0cmF0aW9uU3RhdHVzIGZyb20gJy4uL2Rpc2NvdmVyeS9SZWdpc3RyYXRpb25TdGF0dXMnO1xuaW1wb3J0IFNlYXJjaCBmcm9tICcuLi91dGlscy9TZWFyY2gnO1xuaW1wb3J0IENvbnRleHRPYnNlcnZlciBmcm9tICcuLi9jb250ZXh0TWFuYWdlci9Db250ZXh0T2JzZXJ2ZXInO1xuaW1wb3J0IENvbnRleHRSZXBvcnRlciBmcm9tICcuLi9jb250ZXh0TWFuYWdlci9Db250ZXh0UmVwb3J0ZXInO1xuaW1wb3J0IE1lc3NhZ2VCb2R5SWRlbnRpdHkgZnJvbSAnLi4vaWRlbnRpdHkvTWVzc2FnZUJvZHlJZGVudGl0eSc7XG5pbXBvcnQgQ2hhdE1hbmFnZXIgZnJvbSAnLi4vY2hhdE1hbmFnZXIvQ2hhdE1hbmFnZXInO1xuaW1wb3J0IENoYXRDb250cm9sbGVyIGZyb20gJy4uL2NoYXRNYW5hZ2VyL0NoYXRDb250cm9sbGVyJztcbmltcG9ydCBTaW1wbGVDaGF0TWFuYWdlciBmcm9tICcuLi9jaGF0TWFuYWdlci9TaW1wbGVDaGF0TWFuYWdlcic7XG5pbXBvcnQgQ2hhdCBmcm9tICcuLi9jaGF0TWFuYWdlci9DaGF0JztcblxuLyoqXG4gKiBJbnRlcm5hbCBjb21wb25lbnQgdG8gaW5zdGFudGlhdGUgZnJhbWV3b3JrIGZ1bmN0aW9uYWxpdGllcy5cbiAqL1xuY2xhc3MgU2FuZGJveEZhY3Rvcnkge1xuICAvKiBwcml2YXRlXG4gIF9jb21wb25lbnRzOiA8dXJsOiBpbnN0YW5jZT5cbiAgKi9cblxuICBjb25zdHJ1Y3RvcihidXMpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9idXMgPSBidXM7XG4gICAgX3RoaXMuX2RpdmlkZVVSTCA9IGRpdmlkZVVSTDtcblxuICB9XG5cbiAgY3JlYXRlU3luY2hlcihvd25lciwgYnVzLCBjb25maWcpIHsgXG4gICAgcmV0dXJuIG5ldyBTeW5jaGVyKG93bmVyLCBidXMsIGNvbmZpZyk7XG4gICB9XG5cbiAgIGNyZWF0ZUlkZW50aXR5TWFuYWdlcihoeXBlcnR5VVJMLCBydW50aW1lVVJMLCBidXMpIHsgXG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gbmV3IElkZW50aXR5TWFuYWdlcihoeXBlcnR5VVJMLCBydW50aW1lVVJMLCBidXMpO1xuICAgfVxuXG4gICBjcmVhdGVEaXNjb3ZlcnkoaHlwZXJ0eVVSTCwgcnVudGltZVVSTCwgYnVzKSB7IFxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBEaXNjb3ZlcnkoaHlwZXJ0eVVSTCwgcnVudGltZVVSTCwgYnVzKTtcbiAgIH1cblxuICAgY3JlYXRlU2VhcmNoKGRpc2NvdmVyeSwgaWRlbnRpdHlNYW5hZ2VyKSB7IFxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBTZWFyY2goZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpO1xuICAgfVxuXG4gICBjcmVhdGVDb250ZXh0T2JzZXJ2ZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWcsIHNjaGVtZXMpIHsgXG4gICAgcmV0dXJuIG5ldyBDb250ZXh0T2JzZXJ2ZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWcsIHNjaGVtZXMsIHRoaXMpO1xuICAgfVxuXG4gICBjcmVhdGVDb250ZXh0UmVwb3J0ZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWcpIHsgXG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gbmV3IENvbnRleHRSZXBvcnRlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZywgdGhpcyk7XG4gICB9XG5cbiAgIGNyZWF0ZU5vdGlmaWNhdGlvbkhhbmRsZXIoYnVzKSB7IFxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBOb3RpZmljYXRpb25IYW5kbGVyKGJ1cyk7XG4gICB9XG5cbiAgIGNyZWF0ZU1lc3NhZ2VCb2R5SWRlbnRpdHkodXNlcm5hbWUsIHVzZXJVUkwsIHBpY3R1cmUsIG5hbWUsIGxvY2FsZSwgaWRwLCBhc3NlcnRpb24sIHByb2ZpbGUpIHsgXG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlQm9keUlkZW50aXR5KHVzZXJuYW1lLCB1c2VyVVJMLCBwaWN0dXJlLCBuYW1lLCBsb2NhbGUsIGlkcCwgYXNzZXJ0aW9uLCBwcm9maWxlKTtcbiAgIH1cblxuICAgY3JlYXRlQ2hhdE1hbmFnZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWd1cmF0aW9uLCBzeW5jaGVyKSB7IFxuICAgIHJldHVybiBuZXcgQ2hhdE1hbmFnZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWd1cmF0aW9uLCBzeW5jaGVyLCB0aGlzKTtcbiAgIH1cblxuICAgY3JlYXRlQ2hhdENvbnRyb2xsZXIoc3luY2hlciwgZGlzY292ZXJ5LCBkb21haW4sIHNlYXJjaCwgaWRlbnRpdHksIG1hbmFnZXIpIHsgXG4gICAgcmV0dXJuIG5ldyBDaGF0Q29udHJvbGxlcihzeW5jaGVyLCBkaXNjb3ZlcnksIGRvbWFpbiwgc2VhcmNoLCBpZGVudGl0eSwgbWFuYWdlcik7XG4gICB9XG5cbiAgIGNyZWF0ZVNpbXBsZUNoYXRNYW5hZ2VyKGh5cGVydHlVUkwsIGJ1cywgY29uZmlndXJhdGlvbiwgc3luY2hlcikgeyBcbiAgICByZXR1cm4gbmV3IFNpbXBsZUNoYXRNYW5hZ2VyKGh5cGVydHlVUkwsIGJ1cywgY29uZmlndXJhdGlvbiwgc3luY2hlciwgdGhpcyk7XG4gICB9XG5cbiAgIGNyZWF0ZUNoYXQoc3luY2hlciwgZG9tYWluLCBpZGVudGl0eSwgbWFuYWdlcikgeyBcbiAgICByZXR1cm4gbmV3IENoYXQoc3luY2hlciwgZG9tYWluLCBpZGVudGl0eSwgbWFuYWdlcik7XG4gICB9XG4gICBnZXQgZGl2aWRlVVJMKCl7XG4gICAgIHJldHVybiB0aGlzLl9kaXZpZGVVUkw7XG4gICB9XG5cbiAgIGNyZWF0ZVJlZ2lzdHJhdGlvblN0YXR1cyhvYnNlcnZlciwgcnVudGltZVVSTCwgY2hhdFVybCwgYnVzKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25TdGF0dXMob2JzZXJ2ZXIsIHJ1bnRpbWVVUkwsIGNoYXRVcmwsIGJ1cyk7XG5cbiAgfVxuXG5cblxufVxuXG5cbmV4cG9ydCBkZWZhdWx0IFNhbmRib3hGYWN0b3J5O1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuLyoqXG4gKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXG4gKiBCYXNlIGNsYXNzIHRvIGltcGxlbWVudCBpbnRlcm5hbCBkZXBsb3kgbWFuYWdlciBvZiBjb21wb25lbnRzLlxuICovXG5pbXBvcnQgU2FuZGJveEZhY3RvcnkgZnJvbSAnLi9TYW5kYm94RmFjdG9yeSc7XG5cbi8qKlxuICogQGF1dGhvciBtaWNhZWxwZWRyb3NhQGdtYWlsLmNvbVxuICogSW50ZXJuYWwgY29tcG9uZW50IHJlZ2lzdHJ5IG9mIGFsbCBzYW5kYm94ZXMuXG4gKiBQcm9jZXNzIGludGVybmFsIHJlcXVlc3QncyBmb3IgY29tcG9uZW50IGRlcGxveS5cbiAqL1xuY2xhc3MgU2FuZGJveFJlZ2lzdHJ5IHtcbiAgLyogcHJpdmF0ZVxuICBfY29tcG9uZW50czogPHVybDogaW5zdGFuY2U+XG4gICovXG5cbiAgY29uc3RydWN0b3IoYnVzKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9idXMgPSBidXM7XG4gICAgX3RoaXMuX2ZhY3RvcnkgPSBuZXcgU2FuZGJveEZhY3RvcnkoYnVzKTtcbiAgICBfdGhpcy5fY29tcG9uZW50cyA9IHt9O1xuXG4gICAgYnVzLmFkZExpc3RlbmVyKFNhbmRib3hSZWdpc3RyeS5JbnRlcm5hbERlcGxveUFkZHJlc3MsIChtc2cpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdTYW5kYm94UmVnaXN0cnktUkNWOiAnLCBtc2cpO1xuICAgICAgLy8gbGV0IHJlc3BvbnNlTXNnID0ge1xuICAgICAgLy8gICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBTYW5kYm94UmVnaXN0cnkuSW50ZXJuYWxEZXBsb3lBZGRyZXNzLCB0bzogU2FuZGJveFJlZ2lzdHJ5LkV4dGVybmFsRGVwbG95QWRkcmVzc1xuICAgICAgLy8gfTtcblxuICAgICAgc3dpdGNoIChtc2cudHlwZSkge1xuICAgICAgICBjYXNlICdjcmVhdGUnOiBfdGhpcy5fb25EZXBsb3kobXNnKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RlbGV0ZSc6IF90aGlzLl9vblJlbW92ZShtc2cpOyBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldCBjb21wb25lbnRzKCkgeyByZXR1cm4gdGhpcy5fY29tcG9uZW50czsgfVxuXG4gIF9yZXNwb25zZU1zZyhtc2csIGNvZGUsIHZhbHVlKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy8gbGV0IG1lc3NhZ2VGYWN0b3J5ID0gX3RoaXMubWVzc2FnZUZhY3Rvcnk7XG5cbiAgICAvL0ZMT1ctT1VUOiBnZW5lcmljIHJlc3BvbnNlIG1lc3NhZ2UgdG8gZXh0ZXJuYWwgU2FuZGJveCAoZGVwbG95IGFuZCB1bi1kZXBsb3kgcmVzcG9uc2VzKVxuICAgIGxldCByZXNwb25zZU1zZyA9IHtcbiAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IFNhbmRib3hSZWdpc3RyeS5JbnRlcm5hbERlcGxveUFkZHJlc3MsIHRvOiBTYW5kYm94UmVnaXN0cnkuRXh0ZXJuYWxEZXBsb3lBZGRyZXNzXG4gICAgfTtcblxuICAgIC8vIENoYW5lZ2UgdGhlIG9yaWdpbiBtZXNzYWdlLCBiZWNhdXNlIHRoZSByZXNwb25zZTtcbiAgICAvLyBtc2cuZnJvbSA9IFNhbmRib3hSZWdpc3RyeS5JbnRlcm5hbERlcGxveUFkZHJlc3M7XG4gICAgLy8gbXNnLnRvID0gU2FuZGJveFJlZ2lzdHJ5LkV4dGVybmFsRGVwbG95QWRkcmVzcztcblxuICAgIGxldCBib2R5ID0ge307XG4gICAgaWYgKGNvZGUpIGJvZHkuY29kZSA9IGNvZGU7XG4gICAgaWYgKHZhbHVlKSBib2R5LmRlc2MgPSB2YWx1ZTtcblxuICAgIHJlc3BvbnNlTXNnLmJvZHkgPSBib2R5O1xuXG4gICAgLy8gcmV0dXJuIG1lc3NhZ2VGYWN0b3J5LmNyZWF0ZVJlc3BvbnNlKG1zZywgY29kZSwgdmFsdWUpO1xuICAgIHJldHVybiByZXNwb25zZU1zZztcbiAgfVxuXG4gIC8vRkxPVy1JTjogbWVzc2FnZSBmcm9tIHRoZSBydW50aW1lIGNvcmUgU2FuZGJveCAtPiBkZXBsb3lDb21wb25lbnRcbiAgX29uRGVwbG95KG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGNvbmZpZyA9IG1zZy5ib2R5LmNvbmZpZztcbiAgICBsZXQgY29tcG9uZW50VVJMID0gbXNnLmJvZHkudXJsO1xuICAgIGxldCBzb3VyY2VDb2RlID0gbXNnLmJvZHkuc291cmNlQ29kZTtcbiAgICBsZXQgcmVzcG9uc2VDb2RlO1xuICAgIGxldCByZXNwb25zZURlc2M7XG5cbiAgICBpZiAoIV90aGlzLl9jb21wb25lbnRzLmhhc093blByb3BlcnR5KGNvbXBvbmVudFVSTCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygnU2FuZGJveFJlZ2lzdHJ5LW9uRGVwbG95OiAnLCBtc2cpO1xuICAgICAgX3RoaXMuX2NvbXBvbmVudHNbY29tcG9uZW50VVJMXSA9IF90aGlzLl9jcmVhdGUoY29tcG9uZW50VVJMLCBzb3VyY2VDb2RlLCBjb25maWcsIF90aGlzLl9mYWN0b3J5ICk7XG4gICAgICAgIHJlc3BvbnNlQ29kZSA9IDIwMDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlc3BvbnNlQ29kZSA9IDUwMDtcbiAgICAgICAgcmVzcG9uc2VEZXNjID0gZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlQ29kZSA9IDUwMDtcbiAgICAgIHJlc3BvbnNlRGVzYyA9ICdJbnN0YW5jZSAnICsgY29tcG9uZW50VVJMICsgJyBhbHJlYWR5IGV4aXN0ISc7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlTXNnID0gX3RoaXMuX3Jlc3BvbnNlTXNnKG1zZywgcmVzcG9uc2VDb2RlLCByZXNwb25zZURlc2MpO1xuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2VNc2cpO1xuICB9XG5cbiAgLy9GTE9XLUlOOiBtZXNzYWdlIGZyb20gdGhlIHJ1bnRpbWUgY29yZSBTYW5kYm94IC0+IHJlbW92ZUNvbXBvbmVudFxuICBfb25SZW1vdmUobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgY29tcG9uZW50VVJMID0gbXNnLmJvZHkudXJsO1xuICAgIGxldCByZXNwb25zZUNvZGU7XG4gICAgbGV0IHJlc3BvbnNlRGVzYztcblxuICAgIGlmIChfdGhpcy5fY29tcG9uZW50cy5oYXNPd25Qcm9wZXJ0eShjb21wb25lbnRVUkwpKSB7XG4gICAgICAvL3JlbW92ZSBjb21wb25lbnQgZnJvbSB0aGUgcG9vbCBhbmQgYWxsIGxpc3RlbmVyc1xuICAgICAgZGVsZXRlIF90aGlzLl9jb21wb25lbnRzW2NvbXBvbmVudFVSTF07XG4gICAgICBfdGhpcy5fYnVzLnJlbW92ZUFsbExpc3RlbmVyc09mKGNvbXBvbmVudFVSTCk7XG4gICAgICByZXNwb25zZUNvZGUgPSAyMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3BvbnNlQ29kZSA9IDUwMDtcbiAgICAgIHJlc3BvbnNlRGVzYyA9ICdJbnN0YW5jZSAnICsgY29tcG9uZW50VVJMICsgJyBkb2VzblxcJ3QgZXhpc3QhJztcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2VNc2cgPSBfdGhpcy5fcmVzcG9uc2VNc2cobXNnLCByZXNwb25zZUNvZGUsIHJlc3BvbnNlRGVzYyk7XG5cbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlTXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGludGVybmFsIHNhbmRib3ggY29kZS5cbiAgICogQHBhcmFtICB7Q29tcG9uZW50VVJMfSB1cmwgVVJMIHVzZWQgZm9yIHRoZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHNvdXJjZUNvZGUgQ29kZSBvZiB0aGUgY29tcG9uZW50XG4gICAqIEBwYXJhbSAge0NvbmZpZ30gY29uZmlnIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCBvciB0aHJvdyBhbiBlcnJvciBcInRocm93ICdlcnJvciBtZXNzYWdlJ1wiXG4gICAqL1xuICBfY3JlYXRlKHVybCwgc291cmNlQ29kZSwgY29uZmlnLCBmYWN0b3J5KSB7XG4gICAgLy9pbXBsZW1lbnRhdGlvbiBzcGVjaWZpY1xuICAgIC8qIGV4YW1wbGUgY29kZTpcbiAgICAgIGV2YWwoc291cmNlQ29kZSk7XG4gICAgICByZXR1cm4gYWN0aXZhdGUodXJsLCBfdGhpcy5fYnVzLCBjb25maWcpO1xuICAgICovXG4gIH1cbn1cblxuU2FuZGJveFJlZ2lzdHJ5LkV4dGVybmFsRGVwbG95QWRkcmVzcyA9ICdoeXBlcnR5LXJ1bnRpbWU6Ly9zYW5kYm94L2V4dGVybmFsJztcblNhbmRib3hSZWdpc3RyeS5JbnRlcm5hbERlcGxveUFkZHJlc3MgPSAnaHlwZXJ0eS1ydW50aW1lOi8vc2FuZGJveC9pbnRlcm5hbCc7XG5cbmV4cG9ydCBkZWZhdWx0IFNhbmRib3hSZWdpc3RyeTtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLy8gTG9nIHN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdCdXMnKTtcblxuLyoqXG4qIEBhdXRob3IgbWljYWVscGVkcm9zYUBnbWFpbC5jb21cbiogTWluaW1hbCBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uIHRvIHNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMuIEl0IGNhbiBiZSByZXVzZWQgaW4gbWFueSB0eXBlIG9mIGNvbXBvbmVudHMuXG4qIENvbXBvbmVudHMgdGhhdCBuZWVkIGEgbWVzc2FnZSBzeXN0ZW0gc2hvdWxkIHJlY2VpdmUgdGhpcyBjbGFzcyBhcyBhIGRlcGVuZGVuY3kgb3IgZXh0ZW5kIGl0LlxuKiBFeHRlbnNpb25zIHNob3VsZCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBwcml2YXRlIG1ldGhvZHM6IF9vblBvc3RNZXNzYWdlIGFuZCBfcmVnaXN0ZXJFeHRlcm5hbExpc3RlbmVyXG4qL1xuY2xhc3MgQnVzIHtcbiAgLyogcHJpdmF0ZVxuICBfbXNnSWQ6IG51bWJlcjtcbiAgX3N1YnNjcmlwdGlvbnM6IDx1cmw6IE1zZ0xpc3RlbmVyW10+XG5cbiAgX3Jlc3BvbnNlVGltZU91dDogbnVtYmVyXG4gIF9yZXNwb25zZUNhbGxiYWNrczogPHVybCtpZDogKG1zZykgPT4gdm9pZD5cblxuICAqL1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX21zZ0lkID0gMDtcbiAgICBfdGhpcy5fc3Vic2NyaXB0aW9ucyA9IHt9O1xuXG4gICAgX3RoaXMuX3Jlc3BvbnNlVGltZU91dCA9IDE1MDAwOyAvL2RlZmF1bHQgdG8gM3NcbiAgICBfdGhpcy5fcmVzcG9uc2VDYWxsYmFja3MgPSB7fTtcblxuICAgIF90aGlzLl9yZWdpc3RlckV4dGVybmFsTGlzdGVuZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAqIFJlZ2lzdGVyIGxpc3RlbmVyIHRvIHJlY2VpdmUgbWVzc2FnZSB3aGVuIFwibXNnLnRvID09PSB1cmxcIi5cbiAgKiBTcGVjaWFsIHVybCBcIipcIiBmb3IgZGVmYXVsdCBsaXN0ZW5lciBpcyBhY2NlcHRlZCB0byBpbnRlcmNlcHQgYWxsIG1lc3NhZ2VzLlxuICAqIEBwYXJhbSB7VVJMfSB1cmwgQWRkcmVzcyB0byBpbnRlcmNlcHQsIHRoYSBpcyBpbiB0aGUgbWVzc2FnZSBcInRvXCJcbiAgKiBAcGFyYW0ge0xpc3RlbmVyfSBsaXN0ZW5lciBsaXN0ZW5lclxuICAqIEByZXR1cm4ge01zZ0xpc3RlbmVyfSBpbnN0YW5jZSBvZiBNc2dMaXN0ZW5lclxuICAqL1xuICBhZGRMaXN0ZW5lcih1cmwsIGxpc3RlbmVyKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBpdGVtID0gbmV3IE1zZ0xpc3RlbmVyKF90aGlzLl9zdWJzY3JpcHRpb25zLCB1cmwsIGxpc3RlbmVyKTtcbiAgICBsZXQgaXRlbUxpc3QgPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1cmxdO1xuICAgIGlmICghaXRlbUxpc3QpIHtcbiAgICAgIGl0ZW1MaXN0ID0gW107XG4gICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1cmxdID0gaXRlbUxpc3Q7XG4gICAgfVxuXG4gICAgaXRlbUxpc3QucHVzaChpdGVtKTtcbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBhZGQgYSByZXNwb25zZSBsaXN0ZW5lci4gT25seSBvbmUgbGlzdGVuZXIgcGVyIG1lc3NhZ2UgSUQgc2hvdWxkIGV4aXN0LlxuICAgKiBBVEVOVElPTiwgdGhlcmUgaXMgbm8gdGltZW91dCBmb3IgdGhpcyBsaXN0ZW5lci5cbiAgICogVGhlIGxpc3RlbmVyIHNob3VsZCBiZSByZW1vdmVkIHdpdGggYSByZW1vdmVSZXNwb25zZUxpc3RlbmVyLCBmYWlsaW5nIHRvIGRvIHRoaXMgd2lsbCByZXN1bHQgaW4gYSB1bnJlbGVhc2VkIG1lbW9yeSBwcm9ibGVtLlxuICAgKiBAcGFyYW0ge1VSTH0gdXJsIE9yaWdpbiBhZGRyZXNzIG9mIHRoZSBtZXNzYWdlIHNlbnQsIFwibXNnLmZyb21cIi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1zZ0lkIE1lc3NhZ2UgSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIHRoZSBwb3N0TWVzc2FnZS5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzcG9uc2VMaXN0ZW5lciBDYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIHJlc3BvbnNlXG4gICAqL1xuICBhZGRSZXNwb25zZUxpc3RlbmVyKHVybCwgbXNnSWQsIHJlc3BvbnNlTGlzdGVuZXIpIHtcbiAgICB0aGlzLl9yZXNwb25zZUNhbGxiYWNrc1t1cmwgKyBtc2dJZF0gPSByZXNwb25zZUxpc3RlbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgcmVzcG9uc2UgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSB7VVJMfSB1cmwgT3JpZ2luIGFkZHJlc3Mgb2YgdGhlIG1lc3NhZ2Ugc2VudCwgXCJtc2cuZnJvbVwiLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbXNnSWQgIE1lc3NhZ2UgSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIHRoZSBwb3N0TWVzc2FnZVxuICAgKi9cbiAgcmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcih1cmwsIG1zZ0lkKSB7XG4gICAgZGVsZXRlIHRoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3VybCArIG1zZ0lkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGV4aXN0ZW50IGxpc3RlbmVycyBmb3IgdGhlIFVSTFxuICAgKiBAcGFyYW0gIHtVUkx9IHVybCBBZGRyZXNzIHJlZ2lzdGVyZWRcbiAgICovXG4gIHJlbW92ZUFsbExpc3RlbmVyc09mKHVybCkge1xuICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpcHRpb25zW3VybF07XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBiaW5kIGxpc3RlbmVycyAoaW4gYm90aCBkaXJlY3Rpb25zKSBpbnRvIG90aGVyIE1pbmlCdXMgdGFyZ2V0LlxuICAgKiBAcGFyYW0gIHtVUkx9IG91dFVybCBPdXRib3VuZCBVUkwsIHJlZ2lzdGVyIGxpc3RlbmVyIGZvciB1cmwgaW4gZGlyZWN0aW9uIFwidGhpcyAtPiB0YXJnZXRcIlxuICAgKiBAcGFyYW0gIHtVUkx9IGluVXJsIEluYm91bmQgVVJMLCByZWdpc3RlciBsaXN0ZW5lciBmb3IgdXJsIGluIGRpcmVjdGlvbiBcInRhcmdldCAtPiB0aGlzXCJcbiAgICogQHBhcmFtICB7TWluaUJ1c30gdGFyZ2V0IFRoZSBvdGhlciB0YXJnZXQgTWluaUJ1c1xuICAgKiBAcmV0dXJuIHtCb3VuZH0gYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHByb3BlcnRpZXMgW3RoaXNMaXN0ZW5lciwgdGFyZ2V0TGlzdGVuZXJdIGFuZCB0aGUgdW5iaW5kIG1ldGhvZC5cbiAgICovXG4gIGJpbmQob3V0VXJsLCBpblVybCwgdGFyZ2V0KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCB0aGlzTGlzdG4gPSBfdGhpcy5hZGRMaXN0ZW5lcihvdXRVcmwsIChtc2cpID0+IHtcbiAgICAgIHRhcmdldC5wb3N0TWVzc2FnZShtc2cpO1xuICAgIH0pO1xuXG4gICAgbGV0IHRhcmdldExpc3RuID0gdGFyZ2V0LmFkZExpc3RlbmVyKGluVXJsLCAobXNnKSA9PiB7XG4gICAgICBfdGhpcy5wb3N0TWVzc2FnZShtc2cpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRoaXNMaXN0ZW5lcjogdGhpc0xpc3RuLFxuICAgICAgdGFyZ2V0TGlzdGVuZXI6IHRhcmdldExpc3RuLFxuICAgICAgdW5iaW5kOiAoKSA9PiB7XG4gICAgICAgIHRoaXMudGhpc0xpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLnRhcmdldExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvL3B1Ymxpc2ggb24gZGVmYXVsdCBsaXN0ZW5lcnNcbiAgX3B1Ymxpc2hPbkRlZmF1bHQobXNnKSB7XG4gICAgLy9pcyB0aGVyZSBhbnkgXCIqXCIgKGRlZmF1bHQpIGxpc3RlbmVycz9cbiAgICBsZXQgaXRlbUxpc3QgPSB0aGlzLl9zdWJzY3JpcHRpb25zWycqJ107XG4gICAgaWYgKGl0ZW1MaXN0KSB7XG4gICAgICB0aGlzLl9wdWJsaXNoT24oaXRlbUxpc3QsIG1zZyk7XG4gICAgfVxuICB9XG5cbiAgLy9wdWJsaXNoIG9uIGEgc3Vic2NyaXB0aW9uIGxpc3QuXG4gIF9wdWJsaXNoT24oaXRlbUxpc3QsIG1zZykge1xuICAgIGl0ZW1MaXN0LmZvckVhY2goKHN1YikgPT4ge1xuICAgICAgc3ViLl9jYWxsYmFjayhtc2cpO1xuICAgIH0pO1xuICB9XG5cbiAgX3Jlc3BvbnNlQ2FsbGJhY2soaW5Nc2csIHJlc3BvbnNlQ2FsbGJhY2ssIHRpbWVvdXQgPSB0cnVlKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIC8vYXV0b21hdGljIG1hbmFnZW1lbnQgb2YgcmVzcG9uc2UgaGFuZGxlcnNcbiAgICBpZiAocmVzcG9uc2VDYWxsYmFjaykge1xuICAgICAgbGV0IHJlc3BvbnNlSWQgPSBpbk1zZy5mcm9tICsgaW5Nc2cuaWQ7XG4gICAgICBfdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbcmVzcG9uc2VJZF0gPSByZXNwb25zZUNhbGxiYWNrO1xuXG4gICAgICBpZiAodGltZW91dCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBsZXQgcmVzcG9uc2VGdW4gPSBfdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbcmVzcG9uc2VJZF07XG4gICAgICAgICAgZGVsZXRlIF90aGlzLl9yZXNwb25zZUNhbGxiYWNrc1tyZXNwb25zZUlkXTtcblxuICAgICAgICAgIGlmIChyZXNwb25zZUZ1bikge1xuICAgICAgICAgICAgbGV0IGVycm9yTXNnID0ge1xuICAgICAgICAgICAgICBpZDogaW5Nc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICAgICAgICAgIGJvZHk6IHsgY29kZTogNDA4LCBkZXNjOiAnUmVzcG9uc2UgdGltZW91dCEnLCB2YWx1ZTogaW5Nc2cgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmVzcG9uc2VGdW4oZXJyb3JNc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgX3RoaXMuX3Jlc3BvbnNlVGltZU91dCk7XG4gICAgICB9XG5cbiAgICB9XG4gIH1cblxuLy9UT0RPOiBwcm92aXNpb25hbCByZXNwb25zZXMgc2hvdWxkIHJlc2V0IHRpbWVvdXRcbiAgX29uUmVzcG9uc2UobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmIChtc2cudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xuICAgICAgbGV0IHJlc3BvbnNlSWQgPSBtc2cudG8gKyBtc2cuaWQ7XG4gICAgICBsZXQgcmVzcG9uc2VGdW4gPSBfdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbcmVzcG9uc2VJZF07XG5cbiAgICAgIGlmIChtc2cuYm9keS5jb2RlID49IDIwMCkgeyAvL2lmIGl0J3MgYSBwcm92aXNpb25hbCByZXNwb25zZSwgZG9uJ3QgZGVsZXRlIHJlc3BvbnNlIGxpc3RlbmVyXG4gICAgICAgIGRlbGV0ZSBfdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbcmVzcG9uc2VJZF07XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZUZ1bikge1xuICAgICAgICByZXNwb25zZUZ1bihtc2cpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy9yZWNlaXZlIG1lc3NhZ2VzIGZyb20gZXh0ZXJuYWwgaW50ZXJmYWNlXG4gIF9vbk1lc3NhZ2UobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmICghX3RoaXMuX29uUmVzcG9uc2UobXNnKSkge1xuICAgICAgbGV0IGl0ZW1MaXN0ID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbbXNnLnRvXTtcbiAgICAgIGlmIChpdGVtTGlzdCkge1xuICAgICAgICBfdGhpcy5fcHVibGlzaE9uKGl0ZW1MaXN0LCBtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbkRlZmF1bHQobXNnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfZ2VuSWQoaW5Nc2cpIHtcbiAgICAvL1RPRE86IGhvdyBkbyB3ZSBtYW5hZ2UgbWVzc2FnZSBJRCdzPyBTaG91bGQgaXQgYmUgYSBnbG9iYWwgcnVudGltZSBjb3VudGVyLCBvciBwZXIgVVJMIGFkZHJlc3M/XG4gICAgLy9HbG9iYWwgY291bnRlciB3aWxsIG5vdCB3b3JrLCBiZWNhdXNlIHRoZXJlIHdpbGwgYmUgbXVsdGlwbGUgTWluaUJ1cyBpbnN0YW5jZXMhXG4gICAgLy9QZXIgVVJMLCBjYW4gYmUgYSBsb3Qgb2YgZGF0YSB0byBtYWludGFpbiFcbiAgICAvL01heWJlIGEgY291bnRlciBwZXIgTWluaUJ1cyBpbnN0YW5jZS4gVGhpcyBpcyB0aGUgYXNzdW1lZCBzb2x1dGlvbiBmb3Igbm93LlxuICAgIGlmICghaW5Nc2cuaWQgfHwgaW5Nc2cuaWQgPT09IDApIHtcbiAgICAgIHRoaXMuX21zZ0lkKys7XG4gICAgICBpbk1zZy5pZCA9IHRoaXMuX21zZ0lkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAqIFNlbmQgbWVzc2FnZXMgdG8gbG9jYWwgbGlzdGVuZXJzLCBvciBpZiBub3QgZXhpc3RzIHRvIGV4dGVybmFsIGxpc3RlbmVycy5cbiAgKiBJdCdzIGhhcyBhbiBvcHRpb25hbCBtZWNoYW5pc20gZm9yIGF1dG9tYXRpYyBtYW5hZ2VtZW50IG9mIHJlc3BvbnNlIGhhbmRsZXJzLlxuICAqIFRoZSByZXNwb25zZSBoYW5kbGVyIHdpbGwgYmUgdW5yZWdpc3RlcmVkIGFmdGVyIHJlY2VpdmluZyB0aGUgcmVzcG9uc2UsIG9yIGFmdGVyIHJlc3BvbnNlIHRpbWVvdXQgKGRlZmF1bHQgdG8gM3MpLlxuICAqIEBwYXJhbSAge01lc3NhZ2V9IG1zZyBNZXNzYWdlIHRvIHNlbmQuIE1lc3NhZ2UgSUQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgbWVzc2FnZS5cbiAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gcmVzcG9uc2VDYWxsYmFjayBPcHRpb25hbCBwYXJhbWV0ZXIsIGlmIHRoZSBkZXZlbG9wZXIgd2hhdCdzIGF1dG9tYXRpYyByZXNwb25zZSBtYW5hZ2VtZW50LlxuICAqIEByZXR1cm4ge251bWJlcn0gUmV0dXJucyB0aGUgbWVzc2FnZSBJRCwgaW4gY2FzZSBpdCBzaG91bGQgYmUgbmVlZGVkIGZvciBtYW51YWwgbWFuYWdlbWVudCBvZiB0aGUgcmVzcG9uc2UgaGFuZGxlci5cbiAgKi9cbiAgcG9zdE1lc3NhZ2UoaW5Nc2csIHJlc3BvbnNlQ2FsbGJhY2spIHsgfVxuXG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0byBwb3N0IG1lc3NhZ2VzIHdpdGggYSBudW1iZXIgb2YgcmV0cmllcyBpbiBjYXNlIHRpbWVvdXRzIG9jY3VyLlxuICAgKiBAcGFyYW0gIHtNZXNzYWdlfSBtc2cgTWVzc2FnZSB0byBzZW5kLiBNZXNzYWdlIElEIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSByZXNwb25zZUNhbGxiYWNrIE9wdGlvbmFsIHBhcmFtZXRlciwgaWYgdGhlIGRldmVsb3BlciB3aGF0J3MgYXV0b21hdGljIHJlc3BvbnNlIG1hbmFnZW1lbnQuXG4gICAqIEBwYXJhbSAge2ludGVnZXJ9IHJldHJpZXMgbnVtYmVyIG9mIHJldHJpZXMgd2hlbiB0aW1lb3V0cyBvY2N1clxuICAgKiBAcmV0dXJuIHtib29sZWFufSBtZXNzYWdlIGRlbGl2ZXJ5IHJlc3VsdDtcbiAgICovXG5cblxuICBwb3N0TWVzc2FnZVdpdGhSZXRyaWVzKG1zZywgcmV0cmllcywgY2FsbGJhY2spIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgcmV0cnkgPSAwO1xuICAgIC8vbGV0IHRpbWVvdXQgPSB0cnVlO1xuXG4gICAgbGV0IHNlbmRNc2cgPSBmdW5jdGlvbigpIHtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgX3RoaXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcbiAgICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSA0MDggfHwgcmVwbHkuYm9keS5jb2RlID09PSA1MDApIHJlamVjdCgpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nLmluZm8oJ1tCdXMucG9zdE1lc3NhZ2VXaXRoUmV0cmllc10gbXNnIGRlbGl2ZXJlZDogJywgbXNnKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKHJlcGx5KTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGxldCB0cnlBZ2FpbiA9ICgpID0+IHtcbiAgICAgIHNlbmRNc2coKS50aGVuKCgpPT57XG4gICAgICAgIC8vdGltZW91dCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9LCAoKT0+e1xuICAgICAgICBsb2cud2FybihgW0J1cy5wb3N0TWVzc2FnZVdpdGhSZXRyaWVzXSBNZXNzYWdlIEJvdW5jZWQgKHJldHJ5ICR7cmV0cnl9KTogJ2AsIG1zZyk7XG4gICAgICAgIGlmIChyZXRyeSsrIDwgcmV0cmllcykge1xuICAgICAgICAgIHRyeUFnYWluKCk7XG4gICAgICAgICAgLy8gc2V0VGltZW91dCgoKSA9PiB7IHRyeUFnYWluKCk7IH0sIDEwMDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gYFtFcnJvcl0gTWVzc2FnZSBCb3VuY2VkIChkZWxpdmVyeSBhdHRlbXB0cyAke3JldHJpZXN9KTogJ2A7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yICsgbXNnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB0cnlBZ2FpbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdCBwdWJsaWMgYXZhaWxhYmxlLCB1c2VkIGJ5IHRoZSBjbGFzcyBleHRlbnNpb24gaW1wbGVtZW50YXRpb24sIHRvIHByb2Nlc3MgbWVzc2FnZXMgZnJvbSB0aGUgcHVibGljIFwicG9zdE1lc3NhZ2VcIiB3aXRob3V0IGEgcmVnaXN0ZXJlZCBsaXN0ZW5lci5cbiAgICogVXNlZCB0byBzZW5kIHRoZSBtZXNzYWdlIHRvIGFuIGV4dGVybmFsIGludGVyZmFjZSwgbGlrZSBhIFdlYldvcmtlciwgSUZyYW1lLCBldGMuXG4gICAqIEBwYXJhbSAge01lc3NhZ2UuTWVzc2FnZX0gbXNnIE1lc3NhZ2VcbiAgICovXG4gIF9vblBvc3RNZXNzYWdlKG1zZykgeyAvKmltcGxlbWVudGF0aW9uIHdpbGwgc2VuZCBtZXNzYWdlIHRvIGV4dGVybmFsIHN5c3RlbSovIH1cblxuICAvKipcbiAgICogTm90IHB1YmxpYyBhdmFpbGFibGUsIHVzZWQgYnkgdGhlIGNsYXNzIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiwgdG8gcHJvY2VzcyBhbGwgbWVzc2FnZXMgdGhhdCBlbnRlciB0aGUgTWluaUJ1cyBmcm9tIGFuIGV4dGVybmFsIGludGVyZmFjZSwgbGlrZSBhIFdlYldvcmtlciwgSUZyYW1lLCBldGMuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmUgdGltZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gcmVnaXN0ZXIgZXh0ZXJuYWwgbGlzdGVuZXJzLlxuICAgKiBUaGUgaW1wbGVtZW50YXRpb24gd2lsbCBwcm9iYWJseSBjYWxsIHRoZSBcIl9vbk1lc3NhZ2VcIiBtZXRob2QgdG8gcHVibGlzaCBpbiB0aGUgbG9jYWwgbGlzdGVuZXJzLlxuICAgKiBETyBOT1QgY2FsbCBcInBvc3RNZXNzYWdlXCIsIHRoZXJlIGlzIGEgZGFuZ2VyIHRoYXQgdGhlIG1lc3NhZ2UgZW50ZXJzIGluIGEgY3ljbGUhXG4gICAqL1xuICBfcmVnaXN0ZXJFeHRlcm5hbExpc3RlbmVyKCkgeyAvKmltcGxlbWVudGF0aW9uIHdpbGwgcmVnaXN0ZXIgZXh0ZXJuYWwgbGlzdGVuZXIgYW5kIGNhbGwgXCJ0aGlzLl9vbk1lc3NhZ2UobXNnKVwiICovIH1cblxufVxuXG5jbGFzcyBNc2dMaXN0ZW5lciB7XG4gIC8qIHByaXZhdGVcbiAgX3N1YnNjcmlwdGlvbnM6IDxzdHJpbmc6IE1zZ0xpc3RlbmVyW10+O1xuICBfdXJsOiBzdHJpbmc7XG4gIF9jYWxsYmFjazogKG1zZykgPT4gdm9pZDtcbiAgKi9cblxuICBjb25zdHJ1Y3RvcihzdWJzY3JpcHRpb25zLCB1cmwsIGNhbGxiYWNrKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9zdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucztcbiAgICBfdGhpcy5fdXJsID0gdXJsO1xuICAgIF90aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICB9XG5cbiAgZ2V0IHVybCgpIHsgcmV0dXJuIHRoaXMuX3VybDsgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhpcyBsaXN0ZW5lciBmcm9tIHRoZSBCdXNcbiAgICovXG4gIHJlbW92ZSgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IHN1YnMgPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1tfdGhpcy5fdXJsXTtcbiAgICBpZiAoc3Vicykge1xuICAgICAgbGV0IGluZGV4ID0gc3Vicy5pbmRleE9mKF90aGlzKTtcbiAgICAgIHN1YnMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgLy9pZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLCByZW1vdmUgdGhlIHN1YnNjcmlwdGlvbiBlbnRpcmVseS5cbiAgICAgIGlmIChzdWJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgX3RoaXMuX3N1YnNjcmlwdGlvbnNbX3RoaXMuX3VybF07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJ1cztcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cbmltcG9ydCBCdXMgZnJvbSAnLi9CdXMnO1xuXG4vKipcbiogQGF1dGhvciBtaWNhZWxwZWRyb3NhQGdtYWlsLmNvbVxuKiBNZXNzYWdlIEJVUyBJbnRlcmZhY2UgaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSBCdXNcbiogSXQgaXMgdXNlZCBtYWlubHkgaW4gdGhlIGludGVybmFsIHNhbmRib3ggcm91dGluZy5cbiovXG5jbGFzcyBNaW5pQnVzIGV4dGVuZHMgQnVzIHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgYSBtZXNzYWdlIGZvciByb3V0aW5nLiBNZXNzYWdlIGlzIHJvdXRlZCBkaXJlY3RseSB0byB0aGUgZXh0ZXJuYWwgcm91dGluZyBfb25Qb3N0TWVzc2FnZS5cbiAgICogQHBhcmFtICB7TWVzc2FnZX0gaW5Nc2cgICAgICAgICAgICBKU09OIHdpdGggbWFuZGF0b3J5IE1lc3NhZ2Ugc3RydWN0dXJlIHtpZCwgdHlwZSwgZnJvbSwgdG99XG4gICAqIEBwYXJhbSAge0NhbGxiYWNrfSByZXNwb25zZUNhbGxiYWNrIE9wdGlvbmFsIGNhbGxiYWNrIGlmIGEgcmVzcG9uc2UgaXMgZXhwZWN0ZWQgZnJvbSB0aGUgcmVxdWVzdC4gQSByZXNwb25zZSB3aWxsIGJlIGFsd2F5cyBzZW50LCBldmVuIGlmIGl0IGlzIGEgXCJUaW1lb3V0XCIuXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgICAgICAgICAgICB0aGUgTWVzc2FnZSBpZFxuICAgKi9cbiAgcG9zdE1lc3NhZ2UoaW5Nc2csIHJlc3BvbnNlQ2FsbGJhY2ssIHRpbWVvdXQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX2dlbklkKGluTXNnKTtcbiAgICBfdGhpcy5fcmVzcG9uc2VDYWxsYmFjayhpbk1zZywgcmVzcG9uc2VDYWxsYmFjaywgdGltZW91dCk7XG5cbiAgICAvL2Fsd2F5cyBzZW5kIHRvIGV4dGVybmFsICh0byBjb3JlIE1lc3NhZ2VCdXMpXG4gICAgX3RoaXMuX29uUG9zdE1lc3NhZ2UoaW5Nc2cpO1xuXG4gICAgcmV0dXJuIGluTXNnLmlkO1xuICB9XG5cbiAgLy9pbnRlcm5hbCBtZXRob2QgdXNlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBieSBhbiBleHRlcm5hbCByb3V0aW5nIHN5c3RlbVxuICBfb25NZXNzYWdlKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIV90aGlzLl9vblJlc3BvbnNlKG1zZykpIHtcbiAgICAgIGxldCBpdGVtTGlzdCA9IF90aGlzLl9zdWJzY3JpcHRpb25zW21zZy50b107XG4gICAgICBpZiAoaXRlbUxpc3QpIHtcbiAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbihpdGVtTGlzdCwgbXNnKTtcbiAgICAgICAgaWYgKCFtc2cudG8uc3RhcnRzV2l0aCgnaHlwZXJ0eScpKSB7XG4gICAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbkRlZmF1bHQobXNnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbkRlZmF1bHQobXNnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBNaW5pQnVzO1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuaW1wb3J0IFNhbmRib3hSZWdpc3RyeSBmcm9tICcuL1NhbmRib3hSZWdpc3RyeSc7XG5pbXBvcnQgTWluaUJ1cyBmcm9tICcuLi9idXMvTWluaUJ1cyc7XG5cblxuZXhwb3J0IGxldCBTYW5kYm94VHlwZSA9IHtBUFA6ICdhcHAnLCBOT1JNQUw6ICdub3JtYWwnLCBXSU5ET1c6ICd3aW5kb3cnfTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXG4gKiBCYXNlIGNsYXNzIHRvIGltcGxlbWVudCBleHRlcm5hbCBzYW5kYm94IGNvbXBvbmVudFxuICovXG5jbGFzcyBTYW5kYm94IGV4dGVuZHMgTWluaUJ1cyB7XG5cbiAgY29uc3RydWN0b3IoY2FwYWJpbGl0aWVzKSB7XG5cbiAgICBzdXBlcigpO1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmIChjYXBhYmlsaXRpZXMpICAgICAgeyBfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7IH1cblxuXG4gIH1cblxuICAvKipcbiAgICogRGVwbG95IGFuIGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQgaW50byB0aGUgc2FuZGJveC5cbiAgICogQHBhcmFtICB7c3RyaW5nfSBjb21wb25lbnRTb3VyY2VDb2RlIENvbXBvbmVudCBzb3VyY2UgY29kZSAoSHlwZXJ0eSwgUHJvdG9TdHViLCBldGMpXG4gICAqIEBwYXJhbSAge1VSTH0gY29tcG9uZW50VVJMIEh5cGVydHksIFByb3RvU3R1Yiwgb3IgYW55IG90aGVyIGNvbXBvbmVudCBhZGRyZXNzLlxuICAgKiBAcGFyYW0gIHtDb25maWd9IGNvbmZpZ3VyYXRpb24gQ29uZmlnIHBhcmFtZXRlcnMgb2YgdGhlIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IHJldHVybiBkZXBsb3llZCBpZiBzdWNjZXNzZnVsLCBvciBhbnkgb3RoZXIgc3RyaW5nIHdpdGggYW4gZXJyb3JcbiAgICovXG4gIGRlcGxveUNvbXBvbmVudChjb21wb25lbnRTb3VyY2VDb2RlLCBjb21wb25lbnRVUkwsIGNvbmZpZ3VyYXRpb24pIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAvLyBsZXQgbWVzc2FnZUZhY3RvcnkgPSBfdGhpcy5tZXNzYWdlRmFjdG9yeTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvL0ZMT1ctT1VUOiBkZXBsb3kgbWVzc2FnZSBmb3IgdGhlIGludGVybmFsIFNhbmRib3hSZWdpc3RyeSAtPiBfb25EZXBsb3lcbiAgICAgIGxldCBkZXBsb3lNZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiAnY3JlYXRlJywgZnJvbTogU2FuZGJveFJlZ2lzdHJ5LkV4dGVybmFsRGVwbG95QWRkcmVzcywgdG86IFNhbmRib3hSZWdpc3RyeS5JbnRlcm5hbERlcGxveUFkZHJlc3MsXG4gICAgICAgIGJvZHk6IHsgdXJsOiBjb21wb25lbnRVUkwsIHNvdXJjZUNvZGU6IGNvbXBvbmVudFNvdXJjZUNvZGUsIGNvbmZpZzogY29uZmlndXJhdGlvbiB9XG4gICAgICB9O1xuXG4gICAgICAvL3NlbmQgbWVzc2FnZSBpbnRvIHRoZSBzYW5kYm94IGludGVybmFscyBhbmQgd2FpdCBmb3IgcmVwbHlcbiAgICAgIF90aGlzLnBvc3RNZXNzYWdlKGRlcGxveU1lc3NhZ2UsIChyZXBseSkgPT4ge1xuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcbiAgICAgICAgICAvL2lzIHRoaXMgcmVzcG9uc2UgY29tcGxhaW50IHdpdGggdGhlIHNwZWM/XG4gICAgICAgICAgcmVzb2x2ZSgnZGVwbG95ZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QocmVwbHkuYm9keS5kZXNjKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBpbnN0YW5jZSBvZiBhIHByZXZpb3VzbHkgZGVwbG95ZWQgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gIHtVUkx9IGNvbXBvbmVudFVSTCBIeXBlcnR5LCBQcm90b1N0dWIsIG9yIGFueSBvdGhlciBjb21wb25lbnQgYWRkcmVzcy5cbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSByZXR1cm4gdW5kZXBsb3llZCBpZiBzdWNjZXNzZnVsLCBvciBhbnkgb3RoZXIgc3RyaW5nIHdpdGggYW4gZXJyb3JcbiAgICovXG4gIHJlbW92ZUNvbXBvbmVudChjb21wb25lbnRVUkwpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vRkxPVy1PVVQ6IHVuLWRlcGxveSBtZXNzYWdlIGZvciB0aGUgaW50ZXJuYWwgU2FuZGJveFJlZ2lzdHJ5IC0+IF9vblJlbW92ZVxuICAgICAgbGV0IHJlbW92ZU1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6ICdkZWxldGUnLCBmcm9tOiBTYW5kYm94UmVnaXN0cnkuRXh0ZXJuYWxEZXBsb3lBZGRyZXNzLCB0bzogU2FuZGJveFJlZ2lzdHJ5LkludGVybmFsRGVwbG95QWRkcmVzcyxcbiAgICAgICAgYm9keTogeyB1cmw6IGNvbXBvbmVudFVSTCB9XG4gICAgICB9O1xuXG4gICAgICAvL3NlbmQgbWVzc2FnZSBpbnRvIHRoZSBzYW5kYm94IGludGVybmFscyBhbmQgd2FpdCBmb3IgcmVwbHlcbiAgICAgIF90aGlzLnBvc3RNZXNzYWdlKHJlbW92ZU1lc3NhZ2UsIChyZXBseSkgPT4ge1xuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcbiAgICAgICAgICAvL2lzIHRoaXMgcmVzcG9uc2UgY29tcGxhaW50IHdpdGggdGhlIHNwZWM/XG4gICAgICAgICAgcmVzb2x2ZSgndW5kZXBsb3llZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmRlc2MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIE1hdGNoZXMgU2FuZGJveCBjYXBhYmlsaXRpZXMgYWdhaW5zdCBwcm92aWRlZCBjYXBhYmlsaXRpZXMuIFVzZWQgdG8gY2hlY2sgaWYgc2FuZGJveCBwcm92aWRlcyBhbGwgcmVxdWlyZWQgY2FwYWJpbGl0aWVzXG4gICogQHBhcmFtICB7UnVudGltZUNhcGFiaWxpdGllc30gY29uc3RyYWludHMgc2V0IG9mIFJ1bnRpbWVDYXBhYmlsaXRpZXMgdG8gbWF0Y2ggd2l0aC5cbiAgKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm4gdHJ1ZSBpZiBjb25zdHJhaW50cyBhcmUgbWF0Y2hlZCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG5cbiAgbWF0Y2hlcyhjb25zdHJhaW50cykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgZmlsdGVyZWQgPSBPYmplY3Qua2V5cyhjb25zdHJhaW50cykuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgIHJldHVybiAhKF90aGlzLmNhcGFiaWxpdGllc1trZXldICYmIF90aGlzLmNhcGFiaWxpdGllc1trZXldID09PSBjb25zdHJhaW50c1trZXldKTtcbiAgICB9KTtcblxuICAgIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApICAgICAgeyByZXR1cm4gdHJ1ZTsgfSAgICBlbHNlICAgICAgeyByZXR1cm4gIShjb25zdHJhaW50c1tmaWx0ZXJlZF0pOyB9XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTYW5kYm94O1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vLyBMb2cgc3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ2FkZHJlc3MtYWxsb2NhdGlvbicpO1xuXG5cbmltcG9ydCB7aXNVUkwsIGdlbmVyYXRlR1VJRH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG4vLyBUT0RPOiB0aGlzIGNvdWxkIG5vdCBiZSB0aGUgYmVzdCB3YXkgdG8gZG8gYSBTaW5nbGV0b24gYnV0IGF0IHRoaXMgbW9tZW50IGl0IHdvcmtzO1xuXG5sZXQgaW5zdGFuY2U7XG5cbi8qKlxuICogQ2xhc3Mgd2lsbCBhc2sgdG8gdGhlIG1lc3NhZ2Ugbm9kZSBmb3IgYWRkcmVzc2VzXG4gKi9cbmNsYXNzIEFkZHJlc3NBbGxvY2F0aW9uIHtcbiAgLyogcHJpdmF0ZVxuICBfdXJsOiBVUkxcbiAgX2J1czogTWluaUJ1c1xuICAqL1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gQWRkcmVzcyBBbGxvY2F0aW9uXG4gICAqIEBwYXJhbSAge1VSTC5VUkx9ICAgICAgdXJsIC0gdXJsIGZyb20gd2hvIGlzIHNlbmRpbmcgdGhlIG1lc3NhZ2VcbiAgICogQHBhcmFtICB7TWluaUJ1c30gICAgICBidXMgLSBNaW5pQnVzIHVzZWQgZm9yIGFkZHJlc3MgYWxsb2NhdGlvblxuICAgKi9cbiAgY29uc3RydWN0b3IodXJsLCBidXMsIHJlZ2lzdHJ5LCBzdWJzY3JpcHRpb25NYW5hZ2VyKSB7XG5cbiAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICB0aGlzLl91cmwgPSB1cmwgKyAnL2FkZHJlc3MtYWxsb2NhdGlvbic7XG4gICAgICB0aGlzLl9idXMgPSBidXM7XG4gICAgICB0aGlzLl9yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uTWFuYWdlciA9IHN1YnNjcmlwdGlvbk1hbmFnZXI7XG4gICAgICBpbnN0YW5jZSA9IHRoaXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGluc3RhbmNlKCkge1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGFkZHJlc3MgYWxsb2NhdGlvbiB3YXMgbm90IGluc3RhbnRpYXRlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZVxuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgVVJMIHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHVybCB2YWx1ZTtcbiAgICovXG4gIGdldCB1cmwoKSB7IHJldHVybiB0aGlzLl91cmw7IH1cblxuXG4gIC8qKlxuICAgKlxuICAgKiBBc2sgZm9yIGNyZWF0aW9uIG9mIGEgbnVtYmVyIG9mIEh5cGVydHkgYWRkcmVzc2VzLCB0byB0aGUgZG9tYWluIG1lc3NhZ2Ugbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtEb21haW59IGRvbWFpbiAtIGRvbWFpbiBvZiB0aGUgbWVzc2FnZSBub2RlXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBudW1iZXIgLSBudW1iZXIgb2YgYWRkcmVzcyB0byBiZSBhbGxvY2F0ZWRcbiAgICogQHBhcmFtIHtEZXNjcmlwdG9yfSBpbmZvIC0gZGVzY3JpcHRvciB0byBzZWFyY2ggZm9yIHRoZSBoeXBlcnR5IChUT0RPOi8vIHRoaXMgc2hvdWxkIGJlIGNvbmZpcm1lZClcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L3NwZWNzL2Jsb2IvbWFzdGVyL2RhdGFtb2RlbC9jb3JlL2h5cGVydHktY2F0YWxvZ3VlL3JlYWRtZS5tZCNjYXRhbG9ndWUtZGF0YS1tb2RlbFxuICAgKiBAcGFyYW0ge3NjaGVtZX0gc2NoZW1lIC0gc2NoZW1lIG9mIGFkZHJlc3MgdG8gYmUgY3JlYXRlZCBvciByZXVzZWQsIGxpa2U6IGh5cGVydHksIGNvbW0sIGNvbnRleHQsIGV0YztcbiAgICogQHBhcmFtIHtib29sZWFufFVSTC5IeXBlcnR5VVJMfSByZXVzZVVSTCAtIHJldXNlVVJMIGlzIHVzZWQgdG8gcmV1c2UgdGhlIGh5cGVydHlVUkwgcHJldmlvdXNseSByZWdpc3RyZWQ7XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdCwgRXJyb3I+fSB0aGlzIGlzIFByb21pc2UgYW5kIHJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIGFkZHJlc3MgaW5mb3JtYXRpb25cbiAgICpcbiAgICogQG1lbWJlck9mIEFkZHJlc3NBbGxvY2F0aW9uXG4gICAqL1xuICBjcmVhdGUoZG9tYWluLCBudW1iZXIsIGluZm8sIHNjaGVtZSwgcmV1c2VVUkwpIHtcblxuICAgIGxvZy5sb2coJ1tBZGRyZXNzQWxsb2NhdGlvbi5jcmVhdGVdIGluZm8gJywgaW5mbyk7XG4gICAgLy9kZWJ1Z2dlcjtcbiAgICBpZiAocmV1c2VVUkwpIHtcblxuICAgICAgaWYgKHR5cGVvZihyZXVzZVVSTCkgPT09ICdib29sZWFuJykge1xuXG4gICAgICAgIGlmIChyZXVzZVVSTCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9yZXVzZUFsbG9jYXRlZEFkZHJlc3MoZG9tYWluLCBudW1iZXIsIGluZm8sIHNjaGVtZSwgcmV1c2VVUkwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9hbGxvY2F0ZU5ld0FkZHJlc3MoZG9tYWluLCBzY2hlbWUsIG51bWJlciwgaW5mbyk7XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mKHJldXNlVVJMKSA9PT0gJ3N0cmluZycgJiYgaXNVUkwocmV1c2VVUkwpKSB7XG4gICAgICAgIC8vcmV0dXJuIHRoaXMuX3JldXNlQWxsb2NhdGVkQWRkcmVzcyhkb21haW4sIG51bWJlciwgaW5mbywgc2NoZW1lLCByZXVzZVVSTCk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbGV0IHZhbHVlID0geyBuZXdBZGRyZXNzOiBmYWxzZSwgYWRkcmVzczogW3JldXNlVVJMXSB9O1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmxvZygnW0FkZHJlc3NBbGxvY2F0aW9uXSAtIG5ldyBhZGRyZXNzIHdpbGwgYmUgYWxsb2NhdGVkJyk7XG5cbiAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIFVSTCBzYXZlZCByZXF1ZXN0IGEgbmV3IFVSTFxuICAgICAgcmV0dXJuIHRoaXMuX2FsbG9jYXRlTmV3QWRkcmVzcyhkb21haW4sIHNjaGVtZSwgbnVtYmVyLCBpbmZvKTtcbiAgICB9XG5cbiAgfVxuXG4gIF9yZXVzZUFsbG9jYXRlZEFkZHJlc3MoZG9tYWluLCBudW1iZXIsIGluZm8sIHNjaGVtZSwgcmV1c2VVUkwpIHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGNvbnNvbGUubG9nKCdSRVVTRVRFU1QgLSAgX3JldXNlQWxsb2NhdGVkQWRkcmVzcycsIGRvbWFpbiwgbnVtYmVyLCBpbmZvLCBzY2hlbWUsIHJldXNlVVJMKTtcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5LmNoZWNrUmVnaXN0ZXJlZFVSTHMoaW5mbywgcmV1c2VVUkwpLnRoZW4oKHVybHMpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1JFVVNFVEVTVCAtICByZWdpc3RlcmVkdXJscycsIHVybHMpO1xuICAgICAgICBpZiAodXJscykge1xuICAgICAgICAgIGxvZy5pbmZvKCdbQWRkcmVzc0FsbG9jYXRpb24gLSAnICsgc2NoZW1lICsgJ10gLSBSZXVzZSBVUkwnKTtcbiAgICAgICAgICBsZXQgdmFsdWUgPSB7bmV3QWRkcmVzczogZmFsc2UsIGFkZHJlc3M6IHVybHN9O1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgaWYgKHR5cGVvZihyZXVzZVVSTCkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBsb2cuaW5mbygnW0FkZHJlc3NBbGxvY2F0aW9uIC0gcmV1c2VVUkxdIC0gT2JqZWN0ICcgKyByZXVzZVVSTCArICcgbm90IGZvdW5kJyk7XG4gICAgICAgICAgICByZWplY3QoJ1VSTCBOb3QgRm91bmQnKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihyZXVzZVVSTCkgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhpcy5fYWxsb2NhdGVOZXdBZGRyZXNzKGRvbWFpbiwgc2NoZW1lLCBudW1iZXIsIGluZm8pLnRoZW4ocmVzb2x2ZSkuY2F0Y2gocmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KCdVUkwgTm90IEZvdW5kJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgfSk7XG5cbiAgICB9KTtcbiAgfVxuXG4gIF9hbGxvY2F0ZU5ld0FkZHJlc3MoZG9tYWluLCBzY2hlbWUsIG51bWJlciwgaW5mbykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBsZXQgYWRkcmVzc2VzID0gW107XG4gICAgICB2YXIgaTtcblxuICAgICAgZm9yIChpPTA7IGk8IG51bWJlcjsgaSsrKSB7XG4gICAgICAgIGFkZHJlc3Nlcy5wdXNoKHNjaGVtZSsnOi8vJyArIGRvbWFpbiArICcvJyArIGdlbmVyYXRlR1VJRCgpKVxuICAgICAgfVxuXG4gICAgICBsZXQgcmVzdWx0ID0ge25ld0FkZHJlc3M6IHRydWUsIGFkZHJlc3M6IGFkZHJlc3Nlc307XG5cbiAgICAgIGlmIChzY2hlbWUgPT09ICdoeXBlcnR5JyApIHtcbiAgICAgICAgaWYgKGluZm8uaGFzT3duUHJvcGVydHkoJ2NvbmZpZ3VyYXRpb24nKSAmJiBpbmZvLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoJ2RvbWFpbl9yb3V0aW5nJykgJiYgIWluZm8uY29uZmlndXJhdGlvbi5kb21haW5fcm91dGluZykgXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uTWFuYWdlci5jcmVhdGVTdWJzY3JpcHRpb24oZG9tYWluLGFkZHJlc3NlcywgX3RoaXMuX3VybCkudGhlbigoKT0+e1xuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG5cblxuLyogICAgICBsZXQgbXNnID0ge1xuICAgICAgICB0eXBlOiAnY3JlYXRlJywgZnJvbTogdGhpcy5fdXJsLCB0bzogJ2RvbWFpbjovL21zZy1ub2RlLicgKyBkb21haW4gKyAnL2FkZHJlc3MtYWxsb2NhdGlvbicsXG4gICAgICAgIGJvZHk6IHt2YWx1ZTogeyBudW1iZXI6IG51bWJlciB9IH1cbiAgICAgIH07XG5cbiAgICAgIGlmIChzY2hlbWUgIT09ICdoeXBlcnR5JykgbXNnLmJvZHkuc2NoZW1lID0gc2NoZW1lO1xuXG4gICAgICBsb2cuaW5mbygnW0FkZHJlc3NBbGxvY2F0aW9uIC0gJyArIHNjaGVtZSArICddIC0gUmVxdWVzdCBuZXcgVVJMJyk7XG5cbiAgICAgIHRoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcbiAgICAgICAgICBsZXQgcmVzdWx0ID0ge25ld0FkZHJlc3M6IHRydWUsIGFkZHJlc3M6IHJlcGx5LmJvZHkudmFsdWUuYWxsb2NhdGVkfTtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlcGx5LmJvZHkuZGVzYyk7XG4gICAgICAgIH1cbiAgICAgIH0pOyovXG5cbiAgICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgZG9tYWluIG1lc3NhZ2Ugbm9kZSwgdG8gZGVhbGxvY2F0ZSBvbmUgb3IgbW9yZSBhZGRyZXNzZXNcbiAgKiBAcGFyYW0gIHtEb21haW59IGRvbWFpbiAtIERvbWFpbiBvZiB0aGUgbWVzc2FnZSBub2RlLlxuICAqIEBwYXJhbSAge2FkZHJlc3Nlc30gYWRkcmVzc2VzIHRvIHJlcXVlc3QgdGhlIGRlYWxsb2NhdGlvblxuICAqIEByZXR1cm5zIHtQcm9taXNlfSAgdGhlIHJlc3BvbnNlIGJ5IHRoZSBtZXNzYWdlIG5vZGVcbiAgKi9cbiAgZGVsZXRlKGRvbWFpbiwgYWRkcmVzc2VzKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHJlc29sdmUoMjAwKTtcblxuLyogICAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogJ2RlbGV0ZScsIGZyb206IF90aGlzLl91cmwsIHRvOiAnZG9tYWluOi8vbXNnLW5vZGUuJyArIGRvbWFpbiArICcvYWRkcmVzcy1hbGxvY2F0aW9uJyxcbiAgICAgICAgYm9keToge2NoaWxkcmVuUmVzb3VyY2VzOiBhZGRyZXNzZXN9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcbiAgICAgICAgICByZXNvbHZlKHJlcGx5LmJvZHkuY29kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KHJlcGx5LmJvZHkuZGVzYyk7XG4gICAgICAgIH1cbiAgICAgIH0pOyovXG4gICAgfSk7XG5cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBZGRyZXNzQWxsb2NhdGlvbjtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cbi8qKlxuKiAgIEBhdXRob3I6IEdpbCBEaWFzIChnaWwuZGlhc0B0ZWNuaWNvLnVsaXNib2EucHQpXG4qICAgUmVnaXN0cnkgRGF0YSBNb2RlbCBpbmNsdWRlcyBhbGwgT2JqZWN0cyB0byBiZSBoYW5kbGVkIGJ5IHRoZSBSZWdpc3RyeSBmdW5jdGlvbmFsaXR5IGluY2x1ZGluZ1xuKi9cbmNsYXNzIFJlZ2lzdHJ5RGF0YU1vZGVsIHtcblxuICBjb25zdHJ1Y3RvcihpZCwgdXJsLCBkZXNjcmlwdG9yVVJMLCBwMnBSZXF1ZXN0ZXIsIHN0YXJ0aW5nVGltZSwgbGFzdE1vZGlmaWVkLCBzdGF0dXMsIHN0dWJzLCBzdHVic0NvbmZpZ3VyYXRpb24pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX2lkID0gaWQ7XG4gICAgX3RoaXMuX3VybCA9IHVybDtcbiAgICBfdGhpcy5fZGVzY3JpcHRvclVSTCA9IGRlc2NyaXB0b3JVUkw7XG4gICAgX3RoaXMuX3N0YXJ0aW5nVGltZSA9IHN0YXJ0aW5nVGltZTtcbiAgICBfdGhpcy5fbGFzdE1vZGlmaWVkID0gbGFzdE1vZGlmaWVkO1xuICAgIF90aGlzLl9zdGF0dXMgPSBzdGF0dXM7XG4gICAgX3RoaXMuX3N0dWJzID0gc3R1YnM7XG4gICAgX3RoaXMuX3N0dWJzQ29uZmlndXJhdGlvbiA9IHN0dWJzQ29uZmlndXJhdGlvbjtcbiAgICBfdGhpcy5fcDJwUmVxdWVzdGVyID0gcDJwUmVxdWVzdGVyO1xuICB9XG5cbiAgZ2V0IGlkKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9pZDtcbiAgfVxuXG4gIGdldCB1cmwoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuX3VybDtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdG9yVVJMKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9kZXNjcmlwdG9yVVJMO1xuICB9XG5cbiAgZ2V0IHAycFJlcXVlc3RlcigpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fcDJwUmVxdWVzdGVyO1xuICB9XG5cbiAgZ2V0IGxhc3RNb2RpZmllZCgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fbGFzdE1vZGlmaWVkO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVnaXN0cnlEYXRhTW9kZWw7XG4iLCIvKipcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cbipcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKiovXG5pbXBvcnQgUmVnaXN0cnlEYXRhTW9kZWwgZnJvbSAnLi9SZWdpc3RyeURhdGFNb2RlbCc7XG5cbi8qKlxuKiAgIEBhdXRob3I6IEdpbCBEaWFzIChnaWwuZGlhc0B0ZWNuaWNvLnVsaXNib2EucHQpXG4qICAgSHlwZXJ0eUluc3RhbmNlIERhdGEgTW9kZWwgdXNlZCB0byBtb2RlbCBpbnN0YW5jZXMgb2YgSHlwZXJ0aWVzIHJ1bm5pbmcgaW4gZGV2aWNlcyBhbmQgc2VydmVycy5cbiovXG5jbGFzcyBIeXBlcnR5SW5zdGFuY2UgZXh0ZW5kcyBSZWdpc3RyeURhdGFNb2RlbCB7XG5cbiAgY29uc3RydWN0b3IoaWQsIHVybCwgZGVzY3JpcHRvclVSTCwgZGVzY3JpcHRvciwgaHlwZXJ0eVVSTCwgdXNlciwgZ3VpZCwgcnVudGltZSwgY29udGV4dCwgcDJwSGFuZGxlciwgcDJwUmVxdWVzdGVyLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzLCBzdGFydGluZ1RpbWUsIGxhc3RNb2RpZmllZCkge1xuICAgIHN1cGVyKGlkLCB1cmwsIGRlc2NyaXB0b3JVUkwsIHAycFJlcXVlc3Rlciwgc3RhcnRpbmdUaW1lLCBsYXN0TW9kaWZpZWQpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yO1xuICAgIF90aGlzLl9oeXBlcnR5VVJMID0gaHlwZXJ0eVVSTDtcbiAgICBfdGhpcy5fdXNlciA9IHVzZXI7XG4gICAgX3RoaXMuX2d1aWQgPSBndWlkO1xuICAgIF90aGlzLl9ydW50aW1lID0gcnVudGltZTtcbiAgICBfdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgX3RoaXMuX3AycEhhbmRsZXIgPSBwMnBIYW5kbGVyO1xuICAgIF90aGlzLl9kYXRhU2NoZW1lcyA9IGRhdGFTY2hlbWVzO1xuICAgIF90aGlzLl9yZXNvdXJjZXMgPSByZXNvdXJjZXM7XG4gIH1cblxuICBzZXQgdXNlcihpZGVudGl0eSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMudXNlciA9IGlkZW50aXR5O1xuICB9XG5cbiAgZ2V0IHVzZXIoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuX3VzZXI7XG4gIH1cblxuICBnZXQgaHlwZXJ0eVVSTCgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5faHlwZXJ0eVVSTDtcbiAgfVxuXG4gIGdldCBkZXNjcmlwdG9yKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9kZXNjcmlwdG9yO1xuICB9XG5cbiAgZ2V0IG9iamVjdE5hbWUoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuX2Rlc2NyaXB0b3IuX29iamVjdE5hbWU7XG4gIH1cblxuICBnZXQgcDJwSGFuZGxlcigpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fcDJwSGFuZGxlcjtcbiAgfVxuXG4gIGdldCBkYXRhU2NoZW1lcygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fZGF0YVNjaGVtZXM7XG4gIH1cblxuICBnZXQgcmVzb3VyY2VzKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9yZXNvdXJjZXM7XG4gIH1cblxuICBnZXQgcnVudGltZVVSTCgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fcnVudGltZTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5SW5zdGFuY2U7XG4iLCIvKipcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cbipcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKiovXG5cbi8vIExvZyBTeXN0ZW1cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignUmVnaXN0cnknKTtcblxuaW1wb3J0IHsgcnVudGltZVV0aWxzICB9IGZyb20gJy4uL3J1bnRpbWUvcnVudGltZVV0aWxzJztcblxuaW1wb3J0IEh5cGVydHlJbnN0YW5jZSBmcm9tICcuL0h5cGVydHlJbnN0YW5jZSc7XG5cblxuLyoqXG4qIFJ1bnRpbWUgRG9tYWluUmVnaXN0cmF0aW9uIEludGVyZmFjZVxuKi9cbmNsYXNzIERvbWFpblJlZ2lzdHJhdGlvbiB7XG5cbiAgLyoqXG4gICogVG8gaW5pdGlhbGlzZSB0aGUgUnVudGltZSBSZWdpc3RyeSB3aXRoIHRoZSBSdW50aW1lVVJMIHRoYXQgd2lsbCBiZSB0aGUgYmFzaXMgdG8gZGVyaXZlIHRoZSBpbnRlcm5hbCBydW50aW1lIGFkZHJlc3NlcyB3aGVuIGFsbG9jYXRpbmcgYWRkcmVzc2VzIHRvIGludGVybmFsIHJ1bnRpbWUgY29tcG9uZW50LiBJbiBhZGRpdGlvbiwgdGhlIFJlZ2lzdHJ5IGRvbWFpbiBiYWNrLWVuZCB0byBiZSB1c2VkIHRvIHJlbW90ZWx5IHJlZ2lzdGVyIFJ1bnRpbWUgY29tcG9uZW50cywgaXMgYWxzbyBwYXNzZWQgYXMgaW5wdXQgcGFyYW1ldGVyLlxuICAqIEBwYXJhbSAge01lc3NhZ2VCdXN9ICAgICAgICAgIG1lc3NhZ2VCdXMgICAgICAgICAgICAgICAgbXNnYnVzXG4gICogQHBhcmFtICB7SHlwZXJ0eVJ1bnRpbWVVUkx9ICAgcnVudGltZVVSTCAgICAgICAgICAgIHJ1bnRpbWVVUkxcbiAgKiBAcGFyYW0gIHtEb21haW5VUkx9ICAgICAgICAgICBkb21haW4gICAgICAgIHJlbW90ZVJlZ2lzdHJ5XG4gICovXG4gIGNvbnN0cnVjdG9yKHJ1bnRpbWVVUkwsIHJlZ2lzdHJ5VVJMLCBkb21haW4sIG1lc3NhZ2VCdXMpIHtcblxuICAgIGlmICghcnVudGltZVVSTCkgdGhyb3cgbmV3IEVycm9yKCdydW50aW1lVVJMIGlzIG1pc3NpbmcuJyk7XG4gICAgaWYgKCFyZWdpc3RyeVVSTCkgdGhyb3cgbmV3IEVycm9yKCdyZWdpc3RyeVVSTCBpcyBtaXNzaW5nLicpO1xuICAgIGlmICghZG9tYWluKSB0aHJvdyBuZXcgRXJyb3IoJ2RvbWFpbiBpcyBtaXNzaW5nLicpO1xuICAgIGlmICghbWVzc2FnZUJ1cykgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlQnVzIGlzIG1pc3NpbmcuJyk7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMucmVnaXN0cnlVUkwgPSByZWdpc3RyeVVSTDtcbiAgICBfdGhpcy5ydW50aW1lVVJMID0gcnVudGltZVVSTDtcbiAgICBfdGhpcy5fcmVnaXN0cmF0aW9uUmV0cmllcyA9IDU7Ly8gbnVtYmVyIG9mIGF0dGVtcHRzIHRvIHJlZ2lzdGVyIEh5cGVydGllcyBhbmQgRGF0YU9iamVjdHMgd2hlbiBlcnJvcnMgb2NjdXJzXG5cbiAgICAvLyB0aGUgZXhwaXJlcyBpbiAzNjAwLCByZXByZXNlbnRzIDEgaG91clxuICAgIC8vdGhlIGV4cGlyZXMgaXMgaW4gc2Vjb25kcywgdW5pdCBvZiBtZWFzdXJlIHJlY2VpdmVkIGJ5IHRoZSBkb21haW4gcmVnaXN0cnlcbiAgICBfdGhpcy5leHBpcmVzVGltZSA9IDM2MDA7XG5cbiAgICBfdGhpcy5fZG9tYWluID0gZG9tYWluO1xuICAgIF90aGlzLl9tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcbiAgfVxuXG5cbiAgLyoqXG4gICogIGZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIgYW4gaHlwZXJ0eUluc3RhbmNlIGluIHRoZSBEb21haW4gUmVnaXN0cnlcbiAgKiAgQHBhcmFtICAge1N0cmluZ30gICAgICBoeXBlcnR5SW5zdGFuY2UgICBIeXBlcnR5SW5zbnRhbmNlIHVybFxuICAqXG4gICovXG4gIHVucmVnaXN0ZXJIeXBlcnR5KGh5cGVydHlJbnN0YW5jZSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGxldCBtZXNzYWdlID0geyB0eXBlOiAndXBkYXRlJywgZnJvbTogX3RoaXMucmVnaXN0cnlVUkwsXG4gICAgICAgIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIF90aGlzLl9kb21haW4sXG4gICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6ICcvaHlwZXJ0eS8nICsgaHlwZXJ0eUluc3RhbmNlLCB2YWx1ZTogJ2Rpc2Nvbm5lY3RlZCcsIGF0dHJpYnV0ZTogJ3N0YXR1cycgfX07XG5cbiAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xuICAgICAgICBsb2cubG9nKCdbRG9tYWluUmVnaXN0cmF0aW9uXSB1bnJlZ2lzdGVyIGh5cGVydHkgUmVwbHknLCByZXBseSk7XG5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqICBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIGEgRGF0YSBPYmplY3QgaW4gdGhlIERvbWFpbiBSZWdpc3RyeVxuICAqICBAcGFyYW0gICB7U3RyaW5nfSAgICAgIGh5cGVydHlJbnN0YW5jZSAgIEh5cGVydHlJbnNudGFuY2UgdXJsXG4gICpcbiAgKi9cbiAgdW5yZWdpc3RlckRhdGFPYmplY3QodXJsKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBtZXNzYWdlID0geyB0eXBlOiAndXBkYXRlJywgZnJvbTogX3RoaXMucmVnaXN0cnlVUkwsXG4gICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fZG9tYWluLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogdXJsLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHN0YXR1czogJ2Rpc2Nvbm5lY3RlZCdcbiAgICAgICAgfVxuICAgICAgfX07XG5cbiAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVwbHkpID0+IHtcbiAgICAgIGxvZy5sb2coJ1tEb21haW5SZWdpc3RyYXRpb25dIHVucmVnaXN0ZXIgZGF0YU9iamVjdCBSZXBseScsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqICBmdW5jdGlvbiB0byBkZWxldGUgYW4gZGF0YU9iamVjdEluc3RhbmNlIGluIHRoZSBEb21haW4gUmVnaXN0cnlcbiAgKiAgQHBhcmFtICAge1N0cmluZ30gICAgbmFtZSAgICAgIERhdGFPYmplY3ROYW1lXG4gICovXG4gIGRlbGV0ZURhdGFPYmplY3RJbnN0YW5jZShuYW1lKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBtZXNzYWdlID0geyB0eXBlOiAnZGVsZXRlJywgZnJvbTogX3RoaXMucmVnaXN0cnlVUkwsXG4gICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fZG9tYWluLFxuICAgICAgYm9keTogeyB2YWx1ZToge25hbWU6IG5hbWV9fX07XG5cbiAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVwbHkpID0+IHtcbiAgICAgIGxvZy5sb2coJ1tEb21haW5SZWdpc3RyYXRpb25dIHVucmVnaXN0ZXIgZGF0YU9iamVjdCBSZXBseScsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIEZ1bmN0aW9uIHRvIHVwZGF0ZSBhbiBIeXBlcnR5XG4gICovXG4gIHVwZGF0ZUh5cGVydHlJbnN0YW5jZShyZXNvdXJjZSwgdmFsdWUpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IG1lc3NhZ2UgPSB7IHR5cGU6ICdVUERBVEUnLCBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCxcbiAgICAgIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIF90aGlzLl9kb21haW4sXG4gICAgICBib2R5OiB7IHJlc291cmNlOiByZXNvdXJjZSwgdmFsdWU6IHZhbHVlfX07XG5cbiAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0LnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xuICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5XSBVcGRhdGVkIGh5cGVydHkgcmVwbHknLCByZXBseSk7XG4gICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAqIFRvIHJlZ2lzdGVyIGEgbmV3IERhdGEgT2JqZWN0IGluIHRoZSBEb21haW4gUmVnaXN0cnkuXG4gICogQHBhcmFtICB7SlNPTn0gICAgIHJlZ2lzdHJhdGlvbiAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24gZGF0YSB0byBiZSB1c2VkXG4gICogQHBhcmFtICB7Ym9vbGVhbn0gICAgIHJlc3VtZSAgICAgICAgICAgICAgICAgICAgIGlmIHRoaXMgaXMganVzdCB0byB1cGRhdGUgdGhlIHJlZ2lzdHJhdGlvbiB3aXRoIHRoZSByZXN1bWUgb2YgYSBkYXRhIG9iamVjdFxuICAqL1xuXG4gIHJlZ2lzdGVyRGF0YU9iamVjdChyZWdpc3RyYXRpb24sIHJlc3VtZSwgcDJwSGFuZGxlclN0dWIpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgcDJwSGFuZGxlcjtcbiAgICBsZXQgcDJwUmVxdWVzdGVyO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBsZXQgZGF0YVNjaGVtZSA9IFtdO1xuICAgICAgbGV0IGZpbHRlcmVkRGF0YVNjaGVtZSA9IHJlZ2lzdHJhdGlvbi51cmwuc3BsaXQoJzonKTtcbiAgICAgIGRhdGFTY2hlbWUucHVzaChmaWx0ZXJlZERhdGFTY2hlbWVbMF0pO1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXMocDJwSGFuZGxlclN0dWIpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgcDJwSGFuZGxlciA9IHAycEhhbmRsZXJTdHViW190aGlzLnJ1bnRpbWVVUkxdLnVybDtcbiAgICAgIHAycFJlcXVlc3RlciA9IHJ1bnRpbWVVdGlscy5ydW50aW1lRGVzY3JpcHRvci5wMnBSZXF1ZXN0ZXJTdHViO1xuICAgIH1cblxuICAgIHJlZ2lzdHJhdGlvbi5zdGFydGluZ1RpbWUgPSByZWdpc3RyYXRpb24uY3JlYXRlZDtcblxuICAgIGRlbGV0ZSByZWdpc3RyYXRpb24uYXV0aG9yaXNlO1xuICAgIGRlbGV0ZSByZWdpc3RyYXRpb24uY3JlYXRlZDtcbiAgICBkZWxldGUgcmVnaXN0cmF0aW9uLm11dHVhbDtcbiAgICBkZWxldGUgcmVnaXN0cmF0aW9uLnJlc3VtZTtcblxuICAgIGlmICghcmVnaXN0cmF0aW9uLmV4cGlyZXMpIHJlZ2lzdHJhdGlvbi5leHBpcmVzID0gX3RoaXMuZXhwaXJlc1RpbWU7XG5cbiAgICByZWdpc3RyYXRpb24uZGF0YVNjaGVtZXMgPSBkYXRhU2NoZW1lO1xuXG4gICAgaWYgKHAycEhhbmRsZXIpIHtcbiAgICAgIHJlZ2lzdHJhdGlvbi5wMnBIYW5kbGVyID0gcDJwSGFuZGxlcjtcbiAgICAgIHJlZ2lzdHJhdGlvbi5wMnBSZXF1ZXN0ZXIgPSBwMnBSZXF1ZXN0ZXI7XG4gICAgfVxuXG4gICAgcmVnaXN0cmF0aW9uLnN0YXR1cyA9ICdsaXZlJztcblxuICAgIGxldCBtZXNzYWdlO1xuXG4gICAgaWYgKCFyZXN1bWUpIHtcblxuICAgICAgbG9nLmxvZygnW1JlZ2lzdHJ5LnJlZ2lzdGVyRGF0YU9iamVjdF0gcmVnaXN0ZXJpbmcgbmV3IGRhdGEgb2JqZWN0IFVSTCcsIHJlZ2lzdHJhdGlvbik7XG5cbiAgICAgIG1lc3NhZ2UgPSB7IHR5cGU6ICdjcmVhdGUnLCBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCwgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgX3RoaXMuX2RvbWFpbiwgYm9keTogeyB2YWx1ZTogcmVnaXN0cmF0aW9uLCBwb2xpY3k6ICdwb2xpY3knIH0gfTtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIGxvZy5sb2coJ1tSZWdpc3RyeS5yZWdpc3RlckRhdGFPYmplY3RdIHJlZ2lzdGVyaW5nIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBkYXRhIG9iamVjdCBVUkwnLCByZWdpc3RyYXRpb24pO1xuXG4gICAgICBtZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiAndXBkYXRlJyxcbiAgICAgICAgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgX3RoaXMuX2RvbWFpbixcbiAgICAgICAgZnJvbTogX3RoaXMucmVnaXN0cnlVUkwsXG4gICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IHJlZ2lzdHJhdGlvbi51cmwsIHZhbHVlOiB7IHN0YXR1czogJ2xpdmUnIH0gfVxuICAgICAgfTtcblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZVdpdGhSZXRyaWVzKG1lc3NhZ2UsIF90aGlzLl9yZWdpc3RyYXRpb25SZXRyaWVzLCAocmVwbHkpID0+IHtcbiAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5LnJlZ2lzdGVyRGF0YU9iamVjdF0gPT09PiByZWdpc3RlckRhdGFPYmplY3QgUmVwbHk6ICcsIHJlcGx5KTtcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgcmVzb2x2ZShyZWdpc3RyYXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdCgnZXJyb3Igb24gcmVnaXN0ZXIgRGF0YU9iamVjdCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZXJyb3IoZSk7XG4gICAgICByZWplY3QoZSk7XG4gICAgfVxuXG5cbiAgICAvL3RpbWVyIHRvIGtlZXAgdGhlIHJlZ2lzdHJhdGlvbiBhbGl2ZVxuICAgIC8vIHRoZSB0aW1lIGlzIGRlZmluZWQgYnkgYSBsaXR0bGUgbGVzcyB0aGFuIGhhbGYgb2YgdGhlIGV4cGlyZXMgdGltZSBkZWZpbmVkXG4gICAgbGV0IGtlZXBBbGl2ZVRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuXG4gICAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogJ3VwZGF0ZScsXG4gICAgICAgIGZyb206IF90aGlzLnJlZ2lzdHJ5VVJMLFxuICAgICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fZG9tYWluLFxuICAgICAgICBib2R5OiB7IHJlc291cmNlOiByZWdpc3RyYXRpb24udXJsLCB2YWx1ZTogeyBzdGF0dXM6ICdsaXZlJyB9LCBtZXRob2Q6ICdyZWZyZXNoJyB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVwbHkpID0+IHtcbiAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5LnJlZ2lzdGVyRGF0YU9iamVjdF0gS2VlcEFsaXZlIFJlcGx5OiAnLCByZXBseSk7XG4gICAgICB9KTtcbiAgICB9LCAoKChyZWdpc3RyYXRpb24uZXhwaXJlcyAvIDEuMSkgLyAyKSAqIDEwMDApKTtcblxuICB9KTtcblxuXG4gIH1cblxuXG5cblxuICAvKipcbiAgKiBUbyByZWdpc3RlciBhIG5ldyBIeXBlcnR5IGluIHRoZSBEb21haW4gUmVnaXN0cnkuXG4gICogQHBhcmFtICB7SHlwZXJ0eUluc3RhbmNlfSAgICAgaHlwZXJ0eSAgICAgICAgICAgIEh5cGVydHkgdG8gYmUgcmVnaXN0ZXJlZFxuICAqIEBwYXJhbSAge2Jvb2xlYW59ICAgICByZXN1bWUgICAgICAgICAgICAgICAgICAgICBpZiB0aGlzIGlzIGp1c3QgdG8gdXBkYXRlIHRoZSByZWdpc3RyYXRpb24gd2l0aCB0aGUgcmVzdW1lIG9mIGEgZGF0YSBvYmplY3RcbiAgKi9cblxuXG4gIHJlZ2lzdGVySHlwZXJ0eShoeXBlcnR5LCByZXN1bWUpe1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgIGxldCBydW50aW1lID0gX3RoaXMucnVudGltZVVSTDtcbiAgICBsZXQgc3RhdHVzID0gJ2xpdmUnO1xuXG4gICAgLy9tZXNzYWdlIHRvIHJlZ2lzdGVyIHRoZSBuZXcgaHlwZXJ0eSwgd2l0aGluIHRoZSBkb21haW4gcmVnaXN0cnlcbiAgICBsZXQgbWVzc2FnZTtcbiAgICBsZXQgcmVnaXN0cmF0aW9uRXhwaXJlcyA9IF90aGlzLmV4cGlyZXNUaW1lO1xuXG4gICAgbGV0IG1lc3NhZ2VWYWx1ZSA9IHtcbiAgICAgIHVzZXI6IGh5cGVydHkudXNlci5lbWFpbCxcbiAgICAgIGRlc2NyaXB0b3I6IGh5cGVydHkuZGVzY3JpcHRvclVSTCxcbiAgICAgIHVybDogaHlwZXJ0eS5oeXBlcnR5VVJMLFxuICAgICAgZXhwaXJlczogcmVnaXN0cmF0aW9uRXhwaXJlcyxcbiAgICAgIHJlc291cmNlczogaHlwZXJ0eS5yZXNvdXJjZXMsXG4gICAgICBkYXRhU2NoZW1lczogaHlwZXJ0eS5kYXRhU2NoZW1lcyxcbiAgICAgIHJ1bnRpbWU6IHJ1bnRpbWUsXG4gICAgICBzdGF0dXM6IHN0YXR1c1xuICAgIH07XG5cbiAgICAvLyBzZXQgYSBkaWZmZXJlbnQgZXhwaXJlcyBpZiBkZWZpbmVkIGluIHRoZSBoeXBlcnR5IGNvbmZpZ3VyYXRpb25cblxuICAgIGlmIChoeXBlcnR5LnAycEhhbmRsZXIpIHtcbiAgICAgIG1lc3NhZ2VWYWx1ZS5wMnBIYW5kbGVyID0gaHlwZXJ0eS5wMnBIYW5kbGVyO1xuICAgICAgbWVzc2FnZVZhbHVlLnAycFJlcXVlc3RlciA9IGh5cGVydHkucDJwUmVxdWVzdGVyO1xuICAgIH1cblxuICAgIC8vIHNldCBhIGRpZmZlcmVudCBleHBpcmVzIHZhbHVlIGlmIGNvbmZpZ3VyZWQgaW4gdGhlIEh5cGVydHkgZGVzY3JpcHRvclxuXG4gICAgaWYgKGh5cGVydHkuZGVzY3JpcHRvci5jb25maWd1cmF0aW9uICYmIGh5cGVydHkuZGVzY3JpcHRvci5jb25maWd1cmF0aW9uLmV4cGlyZXMpIHJlZ2lzdHJhdGlvbkV4cGlyZXMgPSBoeXBlcnR5LmRlc2NyaXB0b3IuY29uZmlndXJhdGlvbi5leHBpcmVzO1xuXG4gICAgaWYgKCFyZXN1bWUpIHtcbiAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIHJlZ2lzdGVyaW5nIG5ldyBIeXBlcnR5IFVSTCcsIGFkZHJlc3NVUkwuYWRkcmVzc1swXSk7XG5cblxuICAgICAgLy8gc2V0IGEgZGlmZmVyZW50IGV4cGlyZXMgaWYgZGVmaW5lZCBpbiB0aGUgaHlwZXJ0eSBjb25maWd1cmF0aW9uXG5cblxuICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IHJlZ2lzdGVySHlwZXJ0eV0gcmVnaXN0ZXJpbmcgbmV3IEh5cGVydHkgYXQgZG9tYWluIHJlZ2lzdHJ5ICcsIG1lc3NhZ2VWYWx1ZSk7XG5cbiAgICAgIG1lc3NhZ2UgPSB7dHlwZTogJ2NyZWF0ZScsIGZyb206IF90aGlzLnJlZ2lzdHJ5VVJMLCB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fZG9tYWluLCBib2R5OiB7dmFsdWU6IG1lc3NhZ2VWYWx1ZSwgcG9saWN5OiAncG9saWN5J319O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIHJlZ2lzdGVyaW5nIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBIeXBlcnR5IFVSTCcsIGFkZHJlc3NVUkwuYWRkcmVzc1swXSk7XG5cbiAgICAgIG1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6ICd1cGRhdGUnLFxuICAgICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fZG9tYWluLFxuICAgICAgICBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCxcbiAgICAgICAgYm9keToge3Jlc291cmNlOiBoeXBlcnR5Lmh5cGVydHlVUkwsIHZhbHVlOiB7IHN0YXR1czogJ2xpdmUnLCB1c2VyOiBoeXBlcnR5LnVzZXIuZW1haWwgfX1cbiAgICAgIH07XG5cbiAgICAgIGlmIChoeXBlcnR5LnAycEhhbmRsZXIpIHtcbiAgICAgICAgbWVzc2FnZS5ib2R5LnZhbHVlLnAycEhhbmRsZXIgPSBoeXBlcnR5LnAycEhhbmRsZXI7XG4gICAgICAgIG1lc3NhZ2UuYm9keS52YWx1ZS5wMnBSZXF1ZXN0ZXIgPSBoeXBlcnR5LnAycFJlcXVlc3RlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgcmVnaXN0ZXJIeXBlcnR5XSBIeXBlcnR5IHJlZ2lzdHJhdGlvbiBhdCBkb21haW4gcmVnaXN0cnkgIC0gJywgbWVzc2FnZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlV2l0aFJldHJpZXMobWVzc2FnZSwgX3RoaXMuX3JlZ2lzdHJhdGlvblJldHJpZXMsIChyZXBseSkgPT4ge1xuICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIEh5cGVydHkgcmVnaXN0cmF0aW9uIHJlc3BvbnNlOiAnLCByZXBseSk7XG5cbiAgICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB7IHVybDogaHlwZXJ0eS5oeXBlcnR5VVJMfTtcbiAgICAgICAgICAgIGlmIChoeXBlcnR5LnAycEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgcmVzdWx0LnAycEhhbmRsZXIgPSBoeXBlcnR5LnAycEhhbmRsZXI7XG4gICAgICAgICAgICAgIHJlc3VsdC5wMnBSZXF1ZXN0ZXIgPSBoeXBlcnR5LnAycFJlcXVlc3RlcjtcbiAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gNDA0KSB7XG4gICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgcmVnaXN0ZXJIeXBlcnR5XSBUaGUgdXBkYXRlIHdhcyBub3QgcG9zc2libGUuIFJlZ2lzdGVyaW5nIG5ldyBIeXBlcnR5IGF0IGRvbWFpbiByZWdpc3RyeScpO1xuXG4gICAgICAgICAgICBtZXNzYWdlID0ge3R5cGU6ICdjcmVhdGUnLCBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCwgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgX3RoaXMuX2RvbWFpbiwgYm9keToge3ZhbHVlOiBtZXNzYWdlVmFsdWUsIHBvbGljeTogJ3BvbGljeSd9fTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2VXaXRoUmV0cmllcyhtZXNzYWdlLCBfdGhpcy5fcmVnaXN0cmF0aW9uUmV0cmllcywgKHJlcGx5KSA9PntcbiAgICAgICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgcmVnaXN0ZXJIeXBlcnR5XSBIeXBlcnR5IHJlZ2lzdHJhdGlvbiB1cGRhdGUgcmVzcG9uc2U6ICcsIHJlcGx5KTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHsgdXJsOiBoeXBlcnR5Lmh5cGVydHlVUkx9O1xuICAgICAgICAgICAgICAgICAgaWYgKGh5cGVydHkucDJwSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucDJwSGFuZGxlciA9IGh5cGVydHkucDJwSGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnAycFJlcXVlc3RlciA9IGh5cGVydHkucDJwUmVxdWVzdGVyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byByZWdpc3RlciBhbiBIeXBlcnR5OiAnICsgcmVwbHkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgbG9nLmVycm9yKGUpO1xuICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHJlZ2lzdGVyIGFuIEh5cGVydHkgdG8gZG9tYWluOiAnLCByZXBseSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuXG4gICAgICAvL3RpbWVyIHRvIGtlZXAgdGhlIHJlZ2lzdHJhdGlvbiBhbGl2ZVxuICAgICAgLy8gdGhlIHRpbWUgaXMgZGVmaW5lZCBieSBhIGxpdHRsZSBsZXNzIHRoYW4gaGFsZiBvZiB0aGUgZXhwaXJlcyB0aW1lIGRlZmluZWRcbiAgICAgIGxldCBrZWVwQWxpdmVUaW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIGxldCBtZXNzYWdlID0ge1xuICAgICAgICAgIHR5cGU6ICd1cGRhdGUnLFxuICAgICAgICAgIGZyb206IF90aGlzLnJlZ2lzdHJ5VVJMLFxuICAgICAgICAgIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIF90aGlzLl9kb21haW4sXG4gICAgICAgICAgYm9keTogeyByZXNvdXJjZTogaHlwZXJ0eS5oeXBlcnR5VVJMLCB2YWx1ZToge3N0YXR1czogJ2xpdmUnfSwgbWV0aG9kOiAncmVmcmVzaCcgfX07XG5cbiAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcGx5KSA9PiB7XG4gICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IHJlZ2lzdGVySHlwZXJ0eV0gS2VlcEFsaXZlIFJlcGx5OiAnLCByZXBseSk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgKCgocmVnaXN0cmF0aW9uRXhwaXJlcyAvIDEuMSkgLyAyKSAqIDEwMDApKTtcbiAgICB9KTtcblxuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRG9tYWluUmVnaXN0cmF0aW9uO1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1AyUENvbm5lY3Rpb25SZXNvbHZlJyk7XG5cbi8qKlxuKiAgIFRvIHByb2Nlc3MgYWRkcmVzcyByZXNvbHV0aW9uIGZvciBwMnAgY29ubmVjdGlvbnNcbiovXG5jbGFzcyBQMlBDb25uZWN0aW9uUmVzb2x2ZSAge1xuXG4gIGNvbnN0cnVjdG9yKHJlZ2lzdHJ5KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICBfdGhpcy5fcmVtb3RlUDJQRW50aXRpZXMgPSB7fTsgLy8gQWxsIHJlbW90ZSBlbnRpdGllcyBhbmQgYXNzb2NpYXRlZCBydW50aW1lIHVybCB0aGF0IGFyZSByZWFjaGFibGUgd2l0aCBleGlzdGluZyBwMnAgY29ubmVjdGlvbnNcblxuICB9XG5cblxuICAvKipcbiAgKiBWZXJpZmllcyBpZiByZW1vdGUgRW50aXR5IGNhbiBiZSByZWFjaGVkIHdpdGggYSBQMlAgQ29ubmVjdGlvbi5cbiAgKiBAcGFyYW0gIHtVUkwuVVJMfSAgICAgICAgaW5mbyAgICAgICAgICAgb2JqZWN0IFVSTFxuICAqIEByZXR1cm4ge0h5cGVydHlEYXRhT2JqZWN0SW5zdGFuY2V9ICBhZGRyZXNzVVJMICAgICByZXR1cm4gdGhlIERhdGEgT2JqZWN0IGluc3RhbmNlIHJlZ2lzdGVyZWQgVVJMLCByZXR1cm4gdW5kZWZpbmVkIG90aGVyd2lzZVxuICAqL1xuXG4gIGNoZWNrUDJQKG1zZykge1xuXG4gICAgaWYgKCFtc2cuaGFzT3duUHJvcGVydHkoJ3RvJykpIHtcbiAgICAgIC8vIHRocm93IEVycm9yKCdUaGUgcDJwIHZlcmlmaWNhdGlvbiB3YXMgZmFpbGVkJyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ1RoZSBwMnAgdmVyaWZpY2F0aW9uIHdhcyBmYWlsZWQnKTtcbiAgICB9XG5cbiAgICBsZXQgc2NoZW1lID0gbXNnLnRvLnNwbGl0KCc6Ly8nKVswXTtcblxuICAgIGxldCBjb21wID0gbXNnLnRvLnNwbGl0KCc6Ly8nKVsxXS5zcGxpdCgnLycpWzJdO1xuXG4gICAgbGV0IHVybDtcblxuICAgIGlmIChjb21wKSB1cmwgPSBtc2cudG8uc3Vic3RyaW5nKDAsIG1zZy50by5pbmRleE9mKCcvJyArIGNvbXApKTtcbiAgICBlbHNlIHVybCA9IG1zZy50bztcblxuICAgIGxldCBwMnAgPSB7fTtcblxuICAgIGlmIChtc2cuYm9keSAmJiBtc2cuYm9keS5wMnApIHAycC5wMnAgPSBtc2cuYm9keS5wMnA7XG5cbiAgICBpZiAobXNnLmJvZHkgJiYgbXNnLmJvZHkucDJwSGFuZGxlciAmJiBtc2cuYm9keS5wMnBSZXF1ZXN0ZXIpIHtcbiAgICAgIHAycC5wMnBIYW5kbGVyID0gbXNnLmJvZHkucDJwSGFuZGxlcjtcbiAgICAgIHAycC5wMnBSZXF1ZXN0ZXIgPSBtc2cuYm9keS5wMnBSZXF1ZXN0ZXI7XG4gICAgICBwMnAucnVudGltZSA9IG1zZy5ib2R5LnAycEhhbmRsZXIuc3BsaXQoJy9wMnBoYW5kbGVyLycpWzBdO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc2NoZW1lKSB7XG4gICAgICBjYXNlICdydW50aW1lJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tQMlBSdW50aW1lKHVybCwgcDJwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5jaGVja1AyUEVudGl0eSh1cmwsIHAycCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICogVmVyaWZpZXMgaWYgcmVtb3RlIEVudGl0eSAoSHlwZXJ0eSBvciBEYXRhIE9iamVjdCkgY2FuIGJlIHJlYWNoZWQgd2l0aCBhIFAyUCBDb25uZWN0aW9uLlxuICAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgIHVybCAgICAgICAgICAgUmVtb3RlIEVudGl0eSBVUkwgdG8gYmUgY2hlY2tlZFxuICAqIEBwYXJhbSAge29iamVjdH0gICAgICAgIHAycCAgICAgICAgICAgcDJwIGluZm9ybWF0aW9uIHRvIGJlIHVzZWQgaW5jbHVkaW5nIMK0cnVudGltZcK0IHdpdGggcmVtb3RlIFJ1bnRpbWUgVVJMLCAncDJwSGFuZGxlcicgcmVtb3RlIFAyUCBIYW5kbGVyIFN0dWIgVVJMIGFuZCBwMnBSZXF1ZXN0ZXIgd2l0aCBDYXRhbG9ndWUgVVJMIG9mIFAyUCBSZXF1ZXN0ZXIgdG8gYmUgdXNlZFxuICAqIEByZXR1cm4ge3Byb21pc2V9IHJlZ2lzdGVyZWRFbnRpdHkgICAgIGlmIHAycCBjb25uZWN0aW9uIGlzIHBvc3NpYmxlIGl0IHJldHVybnMgcDJwIGluZm9ybWF0aW9uIHRvIGJlIHVzZWQgaW4gdGhlIGNvbm5lY3Rpb24sIG90aGVyd2lzZSB0aGUgcHJvbWlzZSBpcyByZWplY3RlZFxuICAqL1xuXG4gIGNoZWNrUDJQRW50aXR5KHVybCwgcDJwKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgcmVtb3RlRW50aXR5ID0gX3RoaXMuX3JlbW90ZVAyUEVudGl0aWVzW3VybF07XG5cbiAgICAgIGlmIChyZW1vdGVFbnRpdHkpIHJlc29sdmUocmVtb3RlRW50aXR5KTtcbiAgICAgIGVsc2UgaWYgKHAycC5ydW50aW1lKSByZXNvbHZlKHAycCk7IC8vIHVzZSBwcm92aWRlZCBwMnAgaWYgYXZhaWxhYmxlIGluIHRoZSBtZXNzYWdlIGJvZHlcbiAgICAgIGVsc2UgaWYgKHAycC5wMnApIHsgLy8gb3RoZXJ3aXNlIGxvb2sgb24gRG9tYWluIFJlZ2lzdHJ5XG5cbiAgICAgICAgbG9nLmxvZygnW1JlZ2lzdHJ5IC0gY2hlY2tQMlBFbnRpdHldIC0gc2VhcmNoIGluIERvbWFpbiBSZWdpc3RyeTogJywgdXJsKTtcblxuICAgICAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgICAgICB0eXBlOiAncmVhZCcsXG4gICAgICAgICAgZnJvbTogX3RoaXMuX3JlZ2lzdHJ5LnJlZ2lzdHJ5VVJMLFxuICAgICAgICAgIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIF90aGlzLl9yZWdpc3RyeS5fZG9tYWluLFxuICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIHJlc291cmNlOiB1cmxcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgX3RoaXMuX3JlZ2lzdHJ5Ll9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xuICAgICAgICAgIGxvZy5sb2coJ1tSZWdpc3RyeSAtIGNoZWNrUDJQRW50aXR5XSBEb21haW4gUmVnaXN0cnkgcmVwbHknLCByZXBseSk7XG4gICAgICAgICAgaWYgKCd2YWx1ZScgaW4gcmVwbHkuYm9keSkge1xuXG4gICAgICAgICAgICAvL3RvZG86IHN0b3JlIHJldHJpZXZlZCBlbnRpdHlcbiAgICAgICAgICAgIGxldCByZXNvbHZlZEVudGl0eSA9IHJlcGx5LmJvZHkudmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChyZXNvbHZlZEVudGl0eS5oYXNPd25Qcm9wZXJ0eSgncDJwSGFuZGxlcicpKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZWRFbnRpdHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVqZWN0KCdbUmVnaXN0cnkgY2hlY2tQMlBFbnRpdHldIEh5cGVydHkgZm91bmQgZG9lcyBub3Qgc3VwcG9ydCBQMlAnLCByZXBseS5ib2R5LnZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoJ1tSZWdpc3RyeSBjaGVja1AyUEVudGl0eV0gSHlwZXJ0eSB3aXRoIFAyUEhhbmRsZXIgbm90IGZvdW5kJywgcmVwbHkuYm9keS5jb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHJlamVjdCgnW1JlZ2lzdHJ5IGNoZWNrUDJQRW50aXR5XSBObyBQMlAgQ29ubmVjdGlvbiBhdmFpbGFibGUgZm9yICcsIHVybCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBWZXJpZmllcyBpZiByZW1vdGUgUnVudGltZSBjYW4gYmUgcmVhY2hlZCB3aXRoIGEgUDJQIENvbm5lY3Rpb24uXG4gICogQHBhcmFtICB7VVJMLlVSTH0gICAgICAgIHJ1bnRpbWVVUkwgICAgICAgICAgIFJ1bnRpbWUgVVJMXG4gICogQHJldHVybiB7T2JqZWN0fSAgcDJwQ29ubmVjdGlvbiAgICByZXR1cm4gdGhlIFAyUENvbm5lY3Rpb24gaW5zdGFuY2UgcmVnaXN0ZXJlZCBVUkwsIHJldHVybiB1bmRlZmluZWQgb3RoZXJ3aXNlXG4gICovXG5cbiAgY2hlY2tQMlBSdW50aW1lKHJ1bnRpbWVVUkwsIHAycCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgcmVnaXN0ZXJlZFJ1bnRpbWUgPSB7fTtcblxuICAgIC8vIGxvb2sgb24gbG9jYWxseSBzdG9yZWQgcDJwIGNvbm5lY3Rpb25zXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChfdGhpcy5fcmVnaXN0cnkucDJwQ29ubmVjdGlvbkxpc3RbcnVudGltZVVSTF0pIHtcbiAgICAgICAgcmVzb2x2ZSh7cnVudGltZTogcnVudGltZVVSTH0pO1xuICAgICAgfSBlbHNlIGlmICggcDJwLnJ1bnRpbWUpIHtcbiAgICAgICAgcmVnaXN0ZXJlZFJ1bnRpbWUgPSBwMnA7XG4gICAgICAgIHJlc29sdmUocmVnaXN0ZXJlZFJ1bnRpbWUpO1xuICAgICAgfSBlbHNlIHJlamVjdCgnW1JlZ2lzdHJ5LlAyUENvbm5lY3Rpb25SZXNvbHZlLmNoZWNrUDJQUnVudGltZV0gTm8gUDJQIENvbm5lY3Rpb24gZm91bmQgdG8gJywgcnVudGltZVVSTCk7XG5cbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICogVmVyaWZpZXMgaWYgcmVtb3RlIEh5cGVydHkgY2FuIGJlIHJlYWNoZWQgd2l0aCBhIFAyUCBDb25uZWN0aW9uLlxuICAqIEBwYXJhbSAge0pTT059ICAgICAgICBpbmZvICAgICAgICAgICBvYmplY3Qgb3IgZW50aXR5IGNoYXJhdGVyaXN0aWNzIGluZm9cbiAgKiBAcmV0dXJuIHthZGRyZXNzVVJMfSAgYWRkcmVzc1VSTCAgICAgcmV0dXJuIHRoZSBVUkwgaWYgdGhlcmUgaXMgYW55IHByZXZpb3VzeSByZWdpc3RlcmVkIFVSTCwgcmV0dXJuIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgKi9cblxuICBjaGVja1AyUEh5cGVydHkoaHlwZXJ0eVVSTCwgcDJwKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgaHlwZXJ0eTtcblxuXG4gICAgICAvLyBsb29rIG9uIGxvY2FsbHkgc3RvcmVkIGh5cGVydGllc1xuXG4gICAgICBmb3IgKGxldCBpIGluIF90aGlzLl9yZWdpc3RyeS5yZW1vdGVIeXBlcnR5TGlzdCkge1xuICAgICAgICBoeXBlcnR5ID0gX3RoaXMuX3JlZ2lzdHJ5LnJlbW90ZUh5cGVydHlMaXN0W2ldO1xuXG4gICAgICAgIGxvZy5sb2coJ1tSZWdpc3RyeSAtIGNoZWNrUDJQSHlwZXJ0eV0gLSBmb3IgZWFjaCBIeXBlcnR5OiAnLCBoeXBlcnR5KTtcblxuICAgICAgICAvLyB0b2RvOiBjaGFuZ2UgdG8gXCJoeXBlcnR5LnVybFwiIHRvIGJlIGFsaWduZWQgd2l0aCBoeXBlcnR5IGluc3RhbmNlIGRhdGEgbW9kZWwgc3BlY1xuXG4gICAgICAgIGlmIChoeXBlcnR5Lmh5cGVydHlJRCA9PT0gaHlwZXJ0eVVSTCkge1xuXG4gICAgICAgICAgaWYgKGh5cGVydHkuaGFzT3duUHJvcGVydHkoJ3AycEhhbmRsZXInKSkge1xuICAgICAgICAgICAgcmVzb2x2ZShoeXBlcnR5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KCdbUmVnaXN0cnkgY2hlY2tQMlBIeXBlcnR5XSBIeXBlcnR5IGZvdW5kIGRvZXMgbm90IHN1cHBvcnQgUDJQJywgaHlwZXJ0eSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWh5cGVydHkgJiYgcDJwLnJ1bnRpbWUpIHJlc29sdmUocDJwKTsgLy8gdXNlIHByb3ZpZGVkIHAycCBpZiBhdmFpbGFibGUgaW4gdGhlIG1lc3NhZ2UgYm9keVxuICAgICAgZWxzZSBpZiAoIWh5cGVydHkgJiYgcDJwLnAycCkgeyAvLyBvdGhlcndpc2UgbG9vayBvbiBEb21haW4gUmVnaXN0cnlcblxuICAgICAgICBsb2cubG9nKCdbUmVnaXN0cnkgLSBjaGVja1AyUEh5cGVydHldIC0gc2VhcmNoIGluIERvbWFpbiBSZWdpc3RyeTogJywgaHlwZXJ0eSk7XG5cbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB7XG4gICAgICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAgICAgIGZyb206IF90aGlzLl9yZWdpc3RyeS5yZWdpc3RyeVVSTCxcbiAgICAgICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBfdGhpcy5fcmVnaXN0cnkuX2RvbWFpbixcbiAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICByZXNvdXJjZTogaHlwZXJ0eVVSTFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBfdGhpcy5fcmVnaXN0cnkuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcGx5KSA9PiB7XG4gICAgICAgICAgbG9nLmxvZygnW1JlZ2lzdHJ5IC0gY2hlY2tQMlBIeXBlcnR5XSBEb21haW4gUmVnaXN0cnkgcmVwbHknLCByZXBseSk7XG4gICAgICAgICAgaWYgKCd2YWx1ZScgaW4gcmVwbHkuYm9keSkge1xuXG4gICAgICAgICAgICAvL3RvZG86IHN0b3JlIHJldHJpZXZlZCBoeXBlcnR5XG4gICAgICAgICAgICBsZXQgcmVzb2x2ZWRIeXBlcnR5ID0gcmVwbHkuYm9keS52YWx1ZTtcblxuICAgICAgICAgICAgX3RoaXMuX3JlZ2lzdHJ5LnJlbW90ZUh5cGVydHlMaXN0LnB1c2gocmVzb2x2ZWRIeXBlcnR5KTtcblxuICAgICAgICAgICAgaWYgKHJlc29sdmVkSHlwZXJ0eS5oYXNPd25Qcm9wZXJ0eSgncDJwSGFuZGxlcicpKSB7XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZWRIeXBlcnR5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdCgnW1JlZ2lzdHJ5IGNoZWNrUDJQSHlwZXJ0eV0gSHlwZXJ0eSBmb3VuZCBkb2VzIG5vdCBzdXBwb3J0IFAyUCcsIHJlcGx5LmJvZHkudmFsdWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdCgnW1JlZ2lzdHJ5IGNoZWNrUDJQSHlwZXJ0eV0gSHlwZXJ0eSB3aXRoIFAyUEhhbmRsZXIgbm90IGZvdW5kJywgcmVwbHkuYm9keS5jb2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHJlamVjdCgnW1JlZ2lzdHJ5IGNoZWNrUDJQSHlwZXJ0eV0gTm8gUDJQIENvbm5lY3Rpb24gYXZhaWxhYmxlIGZvciAnLCBoeXBlcnR5VVJMKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFZlcmlmaWVzIGlmIHJlbW90ZSBEYXRhIE9iamVjdCBjYW4gYmUgcmVhY2hlZCB3aXRoIGEgUDJQIENvbm5lY3Rpb24uXG4gICogQHBhcmFtICB7VVJMLlVSTH0gICAgICAgIERhdGFPYmplY3RVUkwgICAgICAgICAgIG9iamVjdCBVUkxcbiAgKiBAcmV0dXJuIHtIeXBlcnR5RGF0YU9iamVjdEluc3RhbmNlfSAgYWRkcmVzc1VSTCAgICAgcmV0dXJuIHRoZSBEYXRhIE9iamVjdCBpbnN0YW5jZSByZWdpc3RlcmVkIFVSTCwgcmV0dXJuIHVuZGVmaW5lZCBvdGhlcndpc2VcbiAgKi9cblxuICBjaGVja1AyUERhdGFPYmplY3QodXJsLCBwMnApIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgLy8gbG9vayBvbiBsb2NhbGx5IHN0b3JlZCBSZW1vdGUgRGF0YSBPYmplY3RzXG5cbiAgICAgIGxldCBkYXRhb2JqZWN0ID0gX3RoaXMuX3JlZ2lzdHJ5LnJlbW90ZURhdGFPYmplY3RMaXN0LmZpbHRlcigoaSkgPT4ge1xuICAgICAgICByZXR1cm4gKF90aGlzLl9yZWdpc3RyeS5yZW1vdGVEYXRhT2JqZWN0TGlzdFtpXS51cmwgPT09IHVybCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGRhdGFvYmplY3QubGVuZ3RoICE9PSAwICYmIGRhdGFvYmplY3RbMF0ucDJwUmVxdWVzdGVyKSB7XG4gICAgICAgIHJlc29sdmUoZGF0YW9iamVjdFswXSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGFvYmplY3QubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJlamVjdCgnW1JlZ2lzdHJ5IGNoZWNrUDJQRGF0YU9iamVjdF0gRGF0YSBPYmplY3QgZm91bmQgZG9lcyBub3Qgc3VwcG9ydCBQMlAnLCBkYXRhb2JqZWN0WzBdKTtcbiAgICAgIH0gZWxzZSBpZiAoZGF0YW9iamVjdC5sZW5ndGggPT09IDAgJiYgcDJwLnJ1bnRpbWUpIHJlc29sdmUocDJwKTsgLy8gdXNlIHByb3ZpZGVkIHAycCBpbmZvIGlmIGF2YWlsYWJsZSBpbiB0aGUgbWVzc2FnZSBib2R5XG4gICAgICBlbHNlIGlmIChkYXRhb2JqZWN0Lmxlbmd0aCAmJiBwMnAucDJwKSB7IC8vIG90aGVyd2lzZSBsb29rIG9uIERvbWFpbiBSZWdpc3RyeVxuXG4gICAgICAvLyBsb29rIG9uIERvbWFpbiBSZWdpc3RyeVxuXG4gICAgICAgIGxldCBtZXNzYWdlID0ge1xuICAgICAgICAgIHR5cGU6ICdyZWFkJyxcbiAgICAgICAgICBmcm9tOiBfdGhpcy5fcmVnaXN0cnkucmVnaXN0cnlVUkwsXG4gICAgICAgICAgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgX3RoaXMuX3JlZ2lzdHJ5Ll9kb21haW4sXG4gICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgcmVzb3VyY2U6IHVybFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBfdGhpcy5fcmVnaXN0cnkuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcGx5KSA9PiB7XG4gICAgICAgICAgbG9nLmxvZygnZGlzY292ZXIgZGF0YSBvYmplY3QgcGVyIHVybCByZXBseScsIHJlcGx5KTtcbiAgICAgICAgICBpZiAoJ3ZhbHVlJyBpbiByZXBseS5ib2R5KSB7XG5cbiAgICAgICAgICAgIC8vdG9kbzogc3RvcmUgcmV0cmlldmVkIGh5cGVydHlcbiAgICAgICAgICAgIGxldCByZXNvbHZlZERhdGFPYmplY3QgPSByZXBseS5ib2R5LnZhbHVlO1xuXG4gICAgICAgICAgICBfdGhpcy5fcmVnaXN0cnkucmVtb3RlRGF0YU9iamVjdExpc3QucHVzaChyZXNvbHZlZERhdGFPYmplY3QpO1xuXG4gICAgICAgICAgICBpZiAocmVzb2x2ZWREYXRhT2JqZWN0LnAycFJlcXVlc3Rlcikge1xuICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkRGF0YU9iamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZWplY3QoJ1tSZWdpc3RyeSBjaGVja1AyUERhdGFPYmplY3RdIERhdGEgT2JqZWN0IGZvdW5kIGRvZXMgbm90IHN1cHBvcnQgUDJQJywgcmVwbHkuYm9keS52YWx1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KCdbUmVnaXN0cnkgY2hlY2tQMlBEYXRhT2JqZWN0XSBub3QgZm91bmQnLCByZXBseS5ib2R5LmNvZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgcmVqZWN0KCdbUmVnaXN0cnkgY2hlY2tQMlBEYXRhT2JqZWN0XSBubyBQMlAgQ29ubmVjdGlvbiBmb3VuZCcpO1xuICAgIH0pO1xuICB9XG5cbiAgYWRkUmVtb3RlUDJQRW50aXR5KHVybCwgcnVudGltZSkge1xuICAgIHRoaXMuX3JlbW90ZVAyUEVudGl0aWVzW3VybF0gPSBydW50aW1lO1xuICB9XG5cbiAgcmVtb3ZlUmVtb3RlUDJQRW50aXR5KHVybCkge1xuICAgIGRlbGV0ZSB0aGlzLl9yZW1vdGVQMlBFbnRpdGllc1t1cmxdO1xuICB9XG5cbiAgcmVjb25uZWN0UDJQUmVxdWVzdGVyKHAycFJlcXVlc3Rlcikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsb2cubG9nKCdbUDJQQ29uZW5jdGlvblJlc29sdmUucmVjb25uZWN0UDJQUmVxdWVzdGVyXSBsZXRzIHRyeSB0byByZWNvbm5lY3QgUDJQIFJlcXVlc3RlciBTdHViOiAnLCBwMnBSZXF1ZXN0ZXIpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgbGV0IHJlbW90ZVJ1bnRpbWUgPSBwMnBSZXF1ZXN0ZXIucnVudGltZTtcblxuICAgICAgbGV0IG1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6ICdleGVjdXRlJyxcbiAgICAgICAgZnJvbTogX3RoaXMuX3JlZ2lzdHJ5LnJlZ2lzdHJ5VVJMLFxuICAgICAgICB0bzogcDJwUmVxdWVzdGVyLnVybCxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG1ldGhvZDogJ2Nvbm5lY3QnLFxuICAgICAgICAgIHBhcmFtczogW3AycFJlcXVlc3Rlci5wMnBIYW5kbGVyXVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBsZXRzIHByZXBhcmUgdGhlIHAycFJlcXVlc3RlclNUdWIgcmVjb25uZWN0IGJ5IHNldHRpbmcgYW4gb2JzZXJ2ZXIgdG8gaXRzIHN0YXR1cyBjaGFuZ2VzXG5cbiAgICAgIF90aGlzLl9yZWdpc3RyeS53YXRjaGluZ1lvdS5vYnNlcnZlKCdwMnBSZXF1ZXN0ZXJTdHViJywgKGNoYW5nZSkgPT4ge1xuXG4gICAgICAgIGxvZy5sb2coJ1tQMlBDb25lbmN0aW9uUmVzb2x2ZS5yZWNvbm5lY3RQMlBSZXF1ZXN0ZXJdIHAycFJlcXVlc3RlclN0dWJzIGNoYW5nZWQgJyArIF90aGlzLl9yZWdpc3RyeS5wMnBSZXF1ZXN0ZXJTdHViKTtcblxuICAgICAgICBpZiAoY2hhbmdlLmtleXBhdGguc3BsaXQoJy4nKVswXSA9PT0gcmVtb3RlUnVudGltZSAmJiBjaGFuZ2UubmFtZSA9PT0gJ3N0YXR1cycpIHtcbiAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS5uZXdWYWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnbGl2ZSc6XG4gICAgICAgICAgICAgIGxvZy5sb2coJ1tQMlBDb25lbmN0aW9uUmVzb2x2ZS5yZWNvbm5lY3RQMlBSZXF1ZXN0ZXJdIHAycFJlcXVlc3RlciBpcyBsaXZlICcgKyBfdGhpcy5fcmVnaXN0cnkucDJwUmVxdWVzdGVyU3R1YltyZW1vdGVSdW50aW1lXSk7XG4gICAgICAgICAgICAgIHJlc29sdmUoX3RoaXMuX3JlZ2lzdHJ5LnAycFJlcXVlc3RlclN0dWJbcmVtb3RlUnVudGltZV0udXJsKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmYWlsZWQnOlxuICAgICAgICAgICAgICBsb2cubG9nKCdbUDJQQ29uZW5jdGlvblJlc29sdmUucmVjb25uZWN0UDJQUmVxdWVzdGVyXSBwMnBSZXF1ZXN0ZXIgcmVjb25uZWN0IGZhaWxlZCAnICsgX3RoaXMuX3JlZ2lzdHJ5LnAycFJlcXVlc3RlclN0dWJbcmVtb3RlUnVudGltZV0pO1xuICAgICAgICAgICAgICByZWplY3QoJ1AyUCBSZXF1ZXN0ZXIgcmVjb25uZWN0IGZhaWxlZCcpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gIHN0dWIgbG9hZFxuICAgICAgX3RoaXMuX3JlZ2lzdHJ5Ll9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXBseSkgPT4ge1xuICAgICAgICBsb2cubG9nKCdbUDJQQ29uZW5jdGlvblJlc29sdmUucmVjb25uZWN0UDJQUmVxdWVzdGVyXSByZWNvbm5lY3QgcmVxdWVzdCByZXBseScsIHJlcGx5KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUDJQQ29ubmVjdGlvblJlc29sdmU7XG4iLCJpbXBvcnQgJ3Byb3h5LW9ic2VydmUnO1xuXG5jbGFzcyBXYXRjaGluZ1lvdSB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fd2F0Y2hpbmcgPSB7fTtcbiAgICB0aGlzLl9vYnNlcnZlcnMgPSBbXTtcbiAgfVxuXG4gIHdhdGNoKGtleSwgb2JqZWN0LCBkZWVwID0gZmFsc2UpIHtcbiAgICBpZiAoZGVlcCkge1xuICAgICAgdGhpcy5fd2F0Y2hpbmdba2V5XSA9IE9iamVjdC5kZWVwT2JzZXJ2ZShvYmplY3QsIChjaGFuZ2VzKSA9PiB7XG4gICAgICAgIGNoYW5nZXMuZXZlcnkoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudChrZXksIGNoYW5nZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dhdGNoaW5nW2tleV0gPSBPYmplY3Qub2JzZXJ2ZShvYmplY3QsIChjaGFuZ2VzKSA9PiB7XG4gICAgICAgIGNoYW5nZXMuZXZlcnkoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZpcmVFdmVudChrZXksIGNoYW5nZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl93YXRjaGluZ1trZXldO1xuICB9XG5cbiAgb2JzZXJ2ZShrZXksIGNhbGxiYWNrKSB7XG4gICAgdGhpcy5fb2JzZXJ2ZXJzLnB1c2goe2tleToga2V5LCBjYWxsYmFjazogY2FsbGJhY2t9KTtcbiAgfVxuXG4gIF9maXJlRXZlbnQoa2V5LCBjaGFuZ2UpIHtcblxuICAgIHRoaXMuX29ic2VydmVycy5maWx0ZXIoKG9ic2VydmUpID0+IHtcbiAgICAgIHJldHVybiBvYnNlcnZlLmtleSA9PT0ga2V5O1xuICAgIH0pLmZvckVhY2goKG9ic2VydmUpID0+IHtcbiAgICAgIG9ic2VydmUuY2FsbGJhY2soY2hhbmdlKTtcbiAgICB9KTtcblxuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgV2F0Y2hpbmdZb3U7XG5cbi8qbGV0IHdhdGNoQ2hhbmdlcyA9IG5ldyBXYXRjaENoYW5nZXMoKTtcbmxldCBwMnBSZXF1ZXN0ZXJTdHViID0gd2F0Y2hDaGFuZ2VzLndhdGNoKCdwMnAnLCB7fSwgdHJ1ZSk7XG5sZXQgc3R1YiA9IHdhdGNoQ2hhbmdlcy53YXRjaCgnc3R1YicsIHt9KTtcblxud2F0Y2hDaGFuZ2VzLm9ic2VydmUoJ3AycCcsIChjaGFuZ2UpID0+IHtcbiAgY29uc29sZS5sb2coJ3AycFJlcXVlc3RlclN0dWI6ICcgKyBjaGFuZ2UubmFtZSArICcgLSAnICsgSlNPTi5zdHJpbmdpZnkoY2hhbmdlLm5ld1ZhbHVlKSk7XG59KTtcblxud2F0Y2hDaGFuZ2VzLm9ic2VydmUoJ3AycCcsIChjaGFuZ2UpID0+IHtcbiAgY29uc29sZS5sb2coJ3AycFJlcXVlc3RlclN0dWI6ICcgKyBjaGFuZ2UubmFtZSArICcgLSAnICsgSlNPTi5zdHJpbmdpZnkoY2hhbmdlLm5ld1ZhbHVlKSk7XG59KTtcblxud2F0Y2hDaGFuZ2VzLm9ic2VydmUoJ3N0dWInLCAoY2hhbmdlKSA9PiB7XG4gIGNvbnNvbGUubG9nKCdzdHViICcgKyBjaGFuZ2UubmFtZSk7XG59KTtcblxucDJwUmVxdWVzdGVyU3R1Yi5hID0ge307XG5zdHViLmIgPSB7bmFtZTogJ3ZpdG9yJ307XG5wMnBSZXF1ZXN0ZXJTdHViLmEubmFtZSA9ICdIZWxsbyc7XG5zdHViLmIgPSB7bmFtZTogJ3ZpdG9yJ307XG5wMnBSZXF1ZXN0ZXJTdHViLmEuYWdlID0gJzMyJztcbnAycFJlcXVlc3RlclN0dWIuYS5uYW1lID0gJ1dvcmxkJzsqL1xuIiwiaW1wb3J0IFdhdGNoaW5nWW91IGZyb20gJy4vdXRpbHMvV2F0Y2hpbmdZb3UnO1xuXG5leHBvcnQgeyBXYXRjaGluZ1lvdSB9O1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1JlZ2lzdHJ5Jyk7XG5cbmltcG9ydCB7IHJ1bnRpbWVVdGlscyB9IGZyb20gJy4uL3J1bnRpbWUvcnVudGltZVV0aWxzJztcbmltcG9ydCB7IFNhbmRib3hUeXBlfSBmcm9tICcuLi9zYW5kYm94L1NhbmRib3gnO1xuXG5pbXBvcnQgQWRkcmVzc0FsbG9jYXRpb24gZnJvbSAnLi4vYWxsb2NhdGlvbi9BZGRyZXNzQWxsb2NhdGlvbic7XG5pbXBvcnQgSHlwZXJ0eUluc3RhbmNlIGZyb20gJy4vSHlwZXJ0eUluc3RhbmNlJztcbmltcG9ydCBEb21haW5SZWdpc3RyYXRpb24gZnJvbSAnLi9Eb21haW5SZWdpc3RyYXRpb24nO1xuaW1wb3J0IFAyUENvbm5lY3Rpb25SZXNvbHZlIGZyb20gJy4vUDJQQ29ubmVjdGlvblJlc29sdmUnO1xuXG5pbXBvcnQgeyBkaXZpZGVVUkwsIGlzSHlwZXJ0eVVSTCwgaXNVUkwsIGlzVXNlclVSTCwgZ2VuZXJhdGVHVUlELCBnZXRVc2VySWRlbnRpdHlEb21haW4sIGlzQmFja2VuZFNlcnZpY2VVUkwsIGRlZXBDbG9uZSwgcmVtb3ZlUGF0aEZyb21VUkwgfSBmcm9tICcuLi91dGlscy91dGlscy5qcyc7XG5cbmltcG9ydCAncHJveHktb2JzZXJ2ZSc7XG5pbXBvcnQgeyBXYXRjaGluZ1lvdSB9IGZyb20gJy4uL1V0aWxzJztcblxuLy8gaW1wb3J0IERpc2NvdmVyeVNlcnZpY2VGcmFtZXdvcmsgZnJvbSAnLi9EaXNjb3ZlcnlTZXJ2aWNlRnJhbWV3b3JrJztcblxuY29uc3QgU1RBVFVTID0geyBDUkVBVEVEOiAnY3JlYXRlZCcsIExJVkU6ICdsaXZlJywgREVQTE9ZSU5HOiAnZGVwbG95aW5nJywgREVQTE9ZRUQ6ICdkZXBsb3llZCcsIFBST0dSRVNTOiAnaW4tcHJvZ3Jlc3MnLCBESVNDT05ORUNURUQ6ICdkaXNjb25uZWN0ZWQnLCBGQUlMRUQ6ICdkZXBsb3ltZW50LWZhaWxlZCcsIERFQUQ6ICdkZWFkJyB9O1xuXG4vKmltcG9ydCBJZGVudGl0eU1hbmFnZXIgZnJvbSAnLi9JZGVudGl0eU1hbmFnZXInO1xuaW1wb3J0IERpc2NvdmVyeSBmcm9tICcuL0Rpc2NvdmVyeSc7Ki9cblxuLyoqXG4qIFJ1bnRpbWUgUmVnaXN0cnkgSW50ZXJmYWNlXG4qL1xuY2xhc3MgUmVnaXN0cnkge1xuXG4gIC8qKlxuICAqIFRvIGluaXRpYWxpc2UgdGhlIFJ1bnRpbWUgUmVnaXN0cnkgd2l0aCB0aGUgUnVudGltZVVSTCB0aGF0IHdpbGwgYmUgdGhlIGJhc2lzIHRvIGRlcml2ZSB0aGUgaW50ZXJuYWwgcnVudGltZSBhZGRyZXNzZXMgd2hlbiBhbGxvY2F0aW5nIGFkZHJlc3NlcyB0byBpbnRlcm5hbCBydW50aW1lIGNvbXBvbmVudC4gSW4gYWRkaXRpb24sIHRoZSBSZWdpc3RyeSBkb21haW4gYmFjay1lbmQgdG8gYmUgdXNlZCB0byByZW1vdGVseSByZWdpc3RlciBSdW50aW1lIGNvbXBvbmVudHMsIGlzIGFsc28gcGFzc2VkIGFzIGlucHV0IHBhcmFtZXRlci5cbiAgKiBAcGFyYW0gIHtNZXNzYWdlQnVzfSAgICAgICAgICBtc2didXMgICAgICAgICAgICAgICAgbXNnYnVzXG4gICogQHBhcmFtICB7SHlwZXJ0eVJ1bnRpbWVVUkx9ICAgcnVudGltZVVSTCAgICAgICAgICAgIHJ1bnRpbWVVUkxcbiAgKiBAcGFyYW0gIHtBcHBTYW5kYm94fSAgICAgICAgICBhcHBTYW5kYm94ICAgICAgICAgICAgYXBwU2FuZGJveFxuICAqIEBwYXJhbSAge3J1bnRpbWVDYXRhbG9ndWV9ICAgIHJ1bnRpbWVDYXRhbG9ndWUgICAgICBydW50aW1lQ2F0YWxvZ3VlXG4gICogQHBhcmFtICB7RG9tYWluVVJMfSAgICAgICAgICAgcmVtb3RlUmVnaXN0cnkgICAgICAgIHJlbW90ZVJlZ2lzdHJ5XG4gICogQHBhcmFtICB7c3RvcmFnZU1hbmFnZXJ9ICAgICAgc3RvcmFnZU1hbmFnZXJcbiAgKi9cbiAgY29uc3RydWN0b3IocnVudGltZVVSTCwgYXBwU2FuZGJveCwgaWRlbnRpdHlNb2R1bGUsIHJ1bnRpbWVDYXRhbG9ndWUsIHJ1bnRpbWVDYXBhYmlsaXRpZXMsIHN0b3JhZ2VNYW5hZ2VyLCBwMnBIYW5kbGVyVVJMLCByZW1vdGVSZWdpc3RyeSkge1xuXG4gICAgLy8gaG93IHNvbWUgZnVuY3Rpb25zIHJlY2VpdmUgdGhlIHBhcmFtZXRlcnMgZm9yIGV4YW1wbGU6XG4gICAgLy8gbmV3IFJlZ2lzdHJ5KCdoeXBlcnR5LXJ1bnRpbWU6Ly9zcDEvMTIzJywgYXBwU2FuZGJveCwgaWRNb2R1bGUsIHJlbW90ZVJlZ2lzdHJ5KTtcbiAgICAvLyByZWdpc3RyeS5yZWdpc3RlclN0dWIoc2FuZGJveCwgJ3NwMScpO1xuICAgIC8vIHJlZ2lzdHJ5LnJlZ2lzdGVySHlwZXJ0eShzYW5kQm94LCAnaHlwZXJ0eS1ydW50aW1lOi8vc3AxLzEyMycpO1xuICAgIC8vIHJlZ2lzdHJ5LnJlc29sdmUoJ2h5cGVydHktcnVudGltZTovL3NwMS8xMjMnKTtcblxuICAgIGlmICghcnVudGltZVVSTCkgdGhyb3cgbmV3IEVycm9yKCdydW50aW1lVVJMIGlzIG1pc3NpbmcuJyk7XG4gICAgaWYgKCFzdG9yYWdlTWFuYWdlcikgdGhyb3cgbmV3IEVycm9yKCdzdG9yYWdlTWFuYWdlciBpcyBtaXNzaW5nLicpO1xuXG4gICAgLyppZiAoIXJlbW90ZVJlZ2lzdHJ5KSB0aHJvdyBuZXcgRXJyb3IoJ3JlbW90ZVJlZ2lzdHJ5IGlzIG1pc3NpbmcnKTsqL1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLnJlZ2lzdHJ5VVJMID0gcnVudGltZVVSTCArICcvcmVnaXN0cnkvJztcbiAgICBfdGhpcy5hcHBTYW5kYm94ID0gYXBwU2FuZGJveDtcbiAgICBfdGhpcy5ydW50aW1lVVJMID0gcnVudGltZVVSTDtcbiAgICBfdGhpcy5wMnBIYW5kbGVyVVJMID0gcDJwSGFuZGxlclVSTDtcbiAgICBfdGhpcy5ydW50aW1lQ2F0YWxvZ3VlID0gcnVudGltZUNhdGFsb2d1ZTtcbiAgICBfdGhpcy5yZW1vdGVSZWdpc3RyeSA9IHJlbW90ZVJlZ2lzdHJ5O1xuICAgIF90aGlzLmlkTW9kdWxlID0gaWRlbnRpdHlNb2R1bGU7XG4gICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIgPSBzdG9yYWdlTWFuYWdlcjtcbiAgICBfdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzID0gcnVudGltZUNhcGFiaWxpdGllcztcbiAgICBfdGhpcy5pZGVudGlmaWVyID0gZ2VuZXJhdGVHVUlEKCk7XG5cbiAgICBfdGhpcy5oeXBlcnRpZXNMaXN0VG9SZW1vdmUgPSB7fTtcbiAgICBfdGhpcy5oeXBlcnRpZXNMaXN0ID0gW107XG4gICAgX3RoaXMucmVtb3RlSHlwZXJ0eUxpc3QgPSBbXTtcbiAgICBfdGhpcy5yZW1vdGVEYXRhT2JqZWN0TGlzdCA9IFtdO1xuICAgIF90aGlzLmlkcExlZ2FjeVByb3h5TGlzdCA9IHt9O1xuXG4gICAgX3RoaXMud2F0Y2hpbmdZb3UgPSBuZXcgV2F0Y2hpbmdZb3UoKTtcbiAgICBfdGhpcy5wMnBIYW5kbGVyU3R1YiA9IHt9O1xuICAgIF90aGlzLnAycFJlcXVlc3RlclN0dWIgPSBfdGhpcy53YXRjaGluZ1lvdS53YXRjaCgncDJwUmVxdWVzdGVyU3R1YicsIHt9LCB0cnVlKTtcbiAgICBfdGhpcy5wMnBDb25uZWN0aW9uTGlzdCA9IF90aGlzLndhdGNoaW5nWW91LndhdGNoKCdwMnBDb25uZWN0aW9uTGlzdCcsIHt9LCB0cnVlKTtcbiAgICBfdGhpcy5wMnBIYW5kbGVyQXNzb2NpYXRpb24gPSB7fTtcblxuICAgIF90aGlzLnByb3Rvc3R1YnNMaXN0ID0gX3RoaXMud2F0Y2hpbmdZb3Uud2F0Y2goJ3Byb3Rvc3R1YnNMaXN0Jywge30sIHRydWUpO1xuICAgIF90aGlzLmlkcFByb3h5TGlzdCA9IF90aGlzLndhdGNoaW5nWW91LndhdGNoKCdpZHBQcm94eUxpc3QnLCB7fSwgdHJ1ZSk7XG4gICAgX3RoaXMuZGF0YU9iamVjdExpc3QgPSB7fTtcbiAgICBfdGhpcy5zdWJzY3JpYmVkRGF0YU9iamVjdExpc3QgPSB7fTtcbiAgICBfdGhpcy5zYW5kYm94ZXNMaXN0ID0ge3NhbmRib3g6IHt9LCBhcHBTYW5kYm94OiB7fSB9O1xuICAgIF90aGlzLnBlcExpc3QgPSB7fTtcbiAgICBfdGhpcy5yZWdpc3RyaWVzID0ge307XG5cbiAgICBfdGhpcy5fZG9tYWluID0gZGl2aWRlVVJMKF90aGlzLnJlZ2lzdHJ5VVJMKS5kb21haW47XG4gICAgX3RoaXMuc2FuZGJveGVzTGlzdC5hcHBTYW5kYm94W3J1bnRpbWVVUkxdID0gYXBwU2FuZGJveDtcbiAgICBsZXQgcDJwQ29ubmVjdGlvblJlc29sdmUgPSBuZXcgUDJQQ29ubmVjdGlvblJlc29sdmUoX3RoaXMpO1xuXG4gICAgX3RoaXMuX3AycENvbm5lY3Rpb25SZXNvbHZlID0gcDJwQ29ubmVjdGlvblJlc29sdmU7XG5cbiAgICBfdGhpcy5faHlwZXJ0eVVybHMgPSB7fTtcbiAgICBfdGhpcy5fZGF0YU9iamVjdFVybHMgPSB7fTtcbiAgfVxuXG4gIGxvYWRSZWdpc3RyeSgpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCgncmVnaXN0cnk6SHlwZXJ0eVVSTHMnKS50aGVuKCh1cmxzTGlzdCkgPT4ge1xuICAgICAgICBpZiAodXJsc0xpc3QpIF90aGlzLl9oeXBlcnR5VXJscyA9IHVybHNMaXN0O1xuICAgICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5nZXQoJ3JlZ2lzdHJ5OkRhdGFPYmplY3RVUkxzJykudGhlbigodXJsc0xpc3QpID0+IHtcbiAgICAgICAgICBpZiAodXJsc0xpc3QpIF90aGlzLl9kYXRhT2JqZWN0VXJscyA9IHVybHNMaXN0O1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldCBsb2FkZXIobG9hZGVyKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fbG9hZGVyID0gbG9hZGVyO1xuICB9XG5cbiAgZ2V0IGxvYWRlcigpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fbG9hZGVyO1xuICB9XG5cbiAgLyoqXG4gICogcmV0dXJuIHRoZSBtZXNzYWdlQnVzIGluIHRoaXMgUmVnaXN0cnlcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXG4gICovXG4gIGdldCBtZXNzYWdlQnVzKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9tZXNzYWdlQnVzO1xuICB9XG5cbiAgLyoqXG4gICogU2V0IHRoZSBtZXNzYWdlQnVzIGluIHRoaXMgUmVnaXN0cnlcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXG4gICovXG4gIHNldCBtZXNzYWdlQnVzKG1lc3NhZ2VCdXMpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcblxuICAgIF90aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF90aGlzLnJlZ2lzdHJ5VVJMLCBmdW5jdGlvbihtc2cpIHtcblxuICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IGxpc3RlbmVyXSAnLCBtc2cpO1xuXG4gICAgICBsZXQgaXNIeXBlcnR5ID0gaXNIeXBlcnR5VVJMKG1zZy5mcm9tKTtcbiAgICAgIGxldCBoYXNDcml0ZXJpYSA9IG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdjcml0ZXJpYScpO1xuICAgICAgbGV0IGlzVVJMUmVzb3VyY2U7XG4gICAgICBsZXQgaXNVc2VyUmVzb3VyY2U7XG4gICAgICBsZXQgaXNIeXBlcnR5UmVzb3VyY2U7XG5cbiAgICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgncmVzb3VyY2UnKSAmJiBtc2cuYm9keS5yZXNvdXJjZSAhPT0gJy4nKSB7XG4gICAgICAgIGlzVVJMUmVzb3VyY2UgPSBpc1VSTChtc2cuYm9keS5yZXNvdXJjZSk7XG4gICAgICAgIGlzVXNlclJlc291cmNlID0gaXNVc2VyVVJMKG1zZy5ib2R5LnJlc291cmNlKTtcbiAgICAgICAgaXNIeXBlcnR5UmVzb3VyY2UgPSBpc0h5cGVydHlVUkwobXNnLmJvZHkucmVzb3VyY2UpO1xuICAgICAgfVxuICAgICAgbGV0IGlzRGVsZXRlID0gbXNnLnR5cGUgPT09ICdkZWxldGUnO1xuICAgICAgbGV0IGhhc05hbWU7XG4gICAgICBsZXQgaGFzVXNlcjtcblxuICAgICAgaWYgKG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICAgIGhhc05hbWUgPSBtc2cuYm9keS52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpO1xuICAgICAgICBoYXNVc2VyID0gbXNnLmJvZHkudmFsdWUuaGFzT3duUHJvcGVydHkoJ3VzZXInKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1zZy50eXBlID09PSAncmVzcG9uc2UnKSB7XG4gICAgICAgIGxvZy5lcnJvcignW1JlZ2lzdGVyIGxpc3RlbmVyXSBza2lwcGluZyAnLCBtc2cpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIG1zZyBzZW50IGJ5IGlkZW50aXR5IG1hbmFnZXIgbGlicmFyeVxuICAgICAgbGV0IHVzZXJVcmwgPSBfdGhpcy5fZ2V0SWRlbnRpdHlBc3NvY2lhdGVkKG1zZy5ib2R5LnJlc291cmNlLCBtc2cuYm9keS5jcml0ZXJpYSk7XG5cbiAgICAgIGxldCByZXBseSA9IHtpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCB0bzogbXNnLmZyb20sIGZyb206IG1zZy50bywgYm9keToge3Jlc291cmNlOiB1c2VyVXJsfX07XG4gICAgICByZXBseS5ib2R5LmNvZGUgPSAodXNlclVybCkgPyAyMDAgOiA0MDQ7XG5cbiAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHJlcGx5KTtcblxuICAgIH0pO1xuXG4gICAgLy8gSW5zdGFsbCBBZGRyZXNzQWxsb2NhdGlvblxuICAgIGxldCBhZGRyZXNzQWxsb2NhdGlvbiA9IEFkZHJlc3NBbGxvY2F0aW9uLmluc3RhbmNlO1xuICAgIF90aGlzLmFkZHJlc3NBbGxvY2F0aW9uID0gYWRkcmVzc0FsbG9jYXRpb247XG5cbiAgICBfdGhpcy5fZG9tYWluUmVnaXN0cmF0aW9uID0gbmV3IERvbWFpblJlZ2lzdHJhdGlvbihfdGhpcy5ydW50aW1lVVJMLF90aGlzLnJlZ2lzdHJ5VVJMLCBfdGhpcy5fZG9tYWluLCBtZXNzYWdlQnVzKTtcblxuICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSAtIEFkZHJlc3NBbGxvY2F0aW9uXSAtICcsIGFkZHJlc3NBbGxvY2F0aW9uKTtcbiAgfVxuXG5cbiAgX2dldElkZW50aXR5QXNzb2NpYXRlZCh0eXBlLCBoeXBlcnR5VVJMKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGZvciAobGV0IGh5cGVydHkgaW4gX3RoaXMuaHlwZXJ0aWVzTGlzdCkge1xuICAgICAgbGV0IHZhbHVlID0gX3RoaXMuaHlwZXJ0aWVzTGlzdFtoeXBlcnR5XTtcblxuICAgICAgaWYgKHZhbHVlLl9oeXBlcnR5VVJMID09PSBoeXBlcnR5VVJMKSB7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgJ3VzZXJuYW1lJzpcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5fdXNlci51c2VybmFtZTtcbiAgICAgICAgICBjYXNlICdjbic6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuX3VzZXIuY247XG4gICAgICAgICAgY2FzZSAnbG9jYWxlJzpcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5fdXNlci5sb2NhbGU7XG4gICAgICAgICAgY2FzZSAnYXZhdGFyJzpcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5fdXNlci5hdmF0YXI7XG4gICAgICAgICAgY2FzZSAndXNlclVSTCc6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUuX3VzZXIudXNlclVSTDtcbiAgICAgICAgICBjYXNlICcuJzpcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5fdXNlcjtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIHNhbmRib3ggaW5zdGFuY2Ugd2hlcmUgdGhlIEFwcGxpY2F0aW9uIGlzIGV4ZWN1dGluZy4gSXQgaXMgYXNzdW1lZCB0aGVyZSBpcyBqdXN0IG9uZSBBcHAgcGVyIFJ1bnRpbWUgaW5zdGFuY2UuXG4gICovXG4gIGdldEFwcFNhbmRib3goKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuYXBwU2FuZGJveDtcbiAgfVxuXG4gIC8qKlxuICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdXNlciBhc3NvY2lhdGVkIHRvIHRoZSBoeXBlcnR5IFVSTFxuICAqIEBwYXJhbSAgICB7U3RyaW5nfSAgICBoeXBlcnR5VVJMICAgICAgaHlwZXJ0eSBVUkxcbiAgKiBAcmV0dXJuICAge1N0cmluZ30gICAgdXNlclVSTCAgICAgICAgIHVzZXIgVVJMXG4gICovXG4gIGdldEh5cGVydHlPd25lcihoeXBlcnR5VVJMKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCB1c2VyVVJMO1xuXG4gICAgZm9yIChsZXQgaW5kZXggaW4gX3RoaXMuaHlwZXJ0aWVzTGlzdCkge1xuICAgICAgbGV0IGh5cGVydHkgPSBfdGhpcy5oeXBlcnRpZXNMaXN0W2luZGV4XTtcblxuICAgICAgaWYgKGh5cGVydHkuaHlwZXJ0eVVSTCA9PT0gaHlwZXJ0eVVSTCkge1xuICAgICAgICByZXR1cm4gaHlwZXJ0eS51c2VyLnVzZXJVUkw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1c2VyVVJMO1xuICB9XG5cbiAgLyoqXG4gICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB1c2VyIGFzc29jaWF0ZWQgdG8gdGhlIGh5cGVydHkgVVJMXG4gICogQHBhcmFtICAgIHtTdHJpbmd9ICAgIGRhdGFPYmplY3RVUkwgICAgICBkYXRhT2JqZWN0VVJMIFVSTFxuICAqIEByZXR1cm4gICB7U3RyaW5nfSAgICB1c2VyVVJMICAgICAgICAgdXNlciBVUkxcbiAgKi9cbiAgZ2V0RGF0YU9iamVjdFJlcG9ydGVyKGRhdGFPYmplY3RVUkwpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IERPdXJsID0gcmVtb3ZlUGF0aEZyb21VUkwoZGF0YU9iamVjdFVSTCk7XG4gICAgZm9yIChsZXQgaW5kZXggaW4gX3RoaXMuZGF0YU9iamVjdExpc3QpIHtcbiAgICAgIGxldCBkYXRhT2JqZWN0ID0gX3RoaXMuZGF0YU9iamVjdExpc3RbaW5kZXhdO1xuXG4gICAgICBpZiAoZGF0YU9iamVjdC51cmwgPT09IERPdXJsKSB7XG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0LnJlcG9ydGVyO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAqIHJldHVybnMgdGhlIGh5cGVydHkgTmFtZSBmcm9tIGEgZ2l2ZW4gdXJsLiBUaGlzIHVybCBjb3VsZCBiZSBmcm9tIGEgZGF0YU9iamVjdCBvciBoeXBlcnR5XG4gICogQHBhcmFtICAgIHtTdHJpbmd9ICAgIHVybCAgICAgIGh5cGVydHkgb3IgZGF0YU9iamVjdCBVUkxcbiAgKiBAcmV0dXJuICAge1N0cmluZ30gICAgaHlwZXJ0eU5hbWUgICAgIGh5cGVydHkgTmFtZVxuICAqL1xuICBnZXRIeXBlcnR5TmFtZSh1cmwpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IGlzSHlwZXJ0eVVSTCA9IGRpdmlkZVVSTCh1cmwpLnR5cGUgPT09ICdoeXBlcnR5JztcblxuICAgIC8vdmFsdWUgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGVuZFxuICAgIGxldCBoeXBlcnR5TmFtZTtcblxuICAgIC8vaWYgaXMgbm90IGFuIGh5cGVydHksIGNoZWNrIGlmIGlzIGEgZGF0YU9iamVjdCBhbmQgb2J0YWluIGhpcyByZXBvcnRlclxuICAgIGxldCBoeXBlcnR5VVJMID0gaXNIeXBlcnR5VVJMID8gdXJsIDogX3RoaXMuZ2V0UmVwb3J0ZXJVUkxTeW5jaG9ub3VzKHVybCk7XG5cbiAgICBmb3IgKGxldCBpbmRleCBpbiBfdGhpcy5oeXBlcnRpZXNMaXN0KSB7XG4gICAgICBsZXQgaHlwZXJ0eSA9IF90aGlzLmh5cGVydGllc0xpc3RbaW5kZXhdO1xuICAgICAgaWYgKGh5cGVydHkuaHlwZXJ0eVVSTCA9PT0gaHlwZXJ0eVVSTCkge1xuICAgICAgICBoeXBlcnR5TmFtZSA9IGh5cGVydHkub2JqZWN0TmFtZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoeXBlcnR5TmFtZTtcbiAgfVxuXG4gIC8qKlxuICAqIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgcmVwb3J0ZXJVUkwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhb2JqZWN0IFVSTFxuICAqIEBwYXJhbSAgICB7U3RyaW5nfSAgICAgZGF0YU9iamVjdFVSTCAgICBkYXRhT2JqZWN0VVJMXG4gICogQHJldHVybiAgIHtTdHJpbmd9ICAgICByZXBvcnRlclVSTCAgICAgIHJlcG9ydGVyVVJMXG4gICovXG4gIGdldFJlcG9ydGVyVVJMKGRhdGFPYmplY3RVUkwpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBsZXQgZGF0YU9iamVjdCA9IF90aGlzLmRhdGFPYmplY3RMaXN0W2RhdGFPYmplY3RVUkxdO1xuXG4gICAgICBpZiAoZGF0YU9iamVjdCkge1xuICAgICAgICByZXNvbHZlKGRhdGFPYmplY3QucmVwb3J0ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KCdObyByZXBvcnRlciB3YXMgZm91bmQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgcmVwb3J0ZXJVUkwgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhb2JqZWN0IFVSTC4gbm8gcHJvbWlzZSByZXR1cm5lZFxuICAqIEBwYXJhbSAgICB7U3RyaW5nfSAgICAgZGF0YU9iamVjdFVSTCAgICBkYXRhT2JqZWN0VVJMXG4gICogQHJldHVybiAgIHtTdHJpbmd9ICAgICByZXBvcnRlclVSTCAgICAgIHJlcG9ydGVyVVJMXG4gICovXG4gIGdldFJlcG9ydGVyVVJMU3luY2hvbm91cyhkYXRhT2JqZWN0VVJMKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBkYXRhT2JqZWN0ID0gX3RoaXMuZGF0YU9iamVjdExpc3RbZGF0YU9iamVjdFVSTF07XG5cbiAgICByZXR1cm4gKGRhdGFPYmplY3QpID8gZGF0YU9iamVjdC5yZXBvcnRlciA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAqIHJldHVybnMgdGhlIGh5cGVydHkgVVJMIHRoYXQgc3Vic2NyaWJlZCB0aGUgZGF0YU9iamVjdFxuICAqIEBwYXJhbSAgICB7U3RyaW5nfSAgICAgdXJsICAgICAgICAgICAgdXJsIGZvcm1hdFxuICAqIEByZXR1cm4gICB7U3RyaW5nfSAgICBIeXBlcnR5IFVSTCBzdWJzY3JpYmVkIHRvIHRoZSBVUkxcbiAgKi9cbiAgZ2V0RGF0YU9iamVjdFN1YnNjcmliZXJIeXBlcnR5KHVybCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gX3RoaXMuc3Vic2NyaWJlZERhdGFPYmplY3RMaXN0W3VybF07XG4gIH1cblxuICAvKipcbiAgKiByZWdpc3RlciBhIGRlc2lyZWQgZGF0YU9iamVjdCB0byBzdWJzY3JpYmVcbiAgKiBAcGFyYW0gICAge1N0cmluZ30gICAgZGF0YU9iamVjdFVSTCAgICAgIGRhdGFPYmplY3QgVVJMXG4gICovXG4gIHJlZ2lzdGVyU3Vic2NyaWJlZERhdGFPYmplY3QoZGF0YU9iamVjdFVSTCwgaHlwZXJ0eVVSTCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgaWYgKF90aGlzLnN1YnNjcmliZWREYXRhT2JqZWN0TGlzdFtkYXRhT2JqZWN0VVJMXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBfdGhpcy5zdWJzY3JpYmVkRGF0YU9iamVjdExpc3RbZGF0YU9iamVjdFVSTF0gPSBoeXBlcnR5VVJMO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAqIEZ1bmN0aW9uIHRvIHJldHVybiB0aGUgbGlzdCBvZiBwcmUgYXV0aG9yaXNlZCB1c2VycyByZWNlaXZlZCBpbiB0aGUgY3JlYXRpb24gb2YgYSBkYXRhIG9iamVjdFxuICAqIEBwYXJhbSAgICB7U3RyaW5nfSAgICAgICAgICAgIGRhdGFPYmplY3RVUkwgICAgZGF0YU9iamVjdFVSTFxuICAqIEByZXR1cm4gICB7QXJyYXk8U3RyaW5nPn0gICAgIHByZUF1dGggICAgICAgICBMaXN0IG9mIHByZSBhdXRob3Jpc2VkIHVzZXJzXG4gICovXG4gIGdldFByZUF1dGhTdWJzY3JpYmVycyhkYXRhT2JqZWN0VVJMKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgZGF0YU9iamVjdCA9IF90aGlzLmRhdGFPYmplY3RMaXN0W2RhdGFPYmplY3RVUkxdO1xuICAgIGxldCBwcmVBdXRoID0gW107XG5cbiAgICBpZiAoZGF0YU9iamVjdCkge1xuICAgICAgcHJlQXV0aCA9IGRhdGFPYmplY3QuYXV0aG9yaXNlO1xuICAgIH1cbiAgICByZXR1cm4gcHJlQXV0aDtcbiAgfVxuXG4gIC8qKlxuICAqIHNlbmQgcmVxdWVzdHMgdG8gdW5yZWdpc3RlciBhbGwgaHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5XG4gICogQHJldHVybiAgIHtQcm9taXNlfSAgICAgcmV0dXJuIGEgcHJvbWlzZSBpZiB0aGUgcmVzdWx0IG9mIHVucmVnaXN0cmF0aW9uIGFsbCBoeXBlcnRpZXNcbiAgKi9cbiAgdW5yZWdpc3RlckFsbEh5cGVydGllcygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IHVucmVnaXN0ZXJSZXN1bHRzID0gW107XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGZvciAobGV0IGluZGV4IGluIF90aGlzLmh5cGVydGllc0xpc3QpIHtcbiAgICAgICAgbGV0IGh5cGVydHkgPSBfdGhpcy5oeXBlcnRpZXNMaXN0W2luZGV4XTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IF90aGlzLnVucmVnaXN0ZXJIeXBlcnR5SW5zdGFuY2UoaHlwZXJ0eS5oeXBlcnR5VVJMKTtcbiAgICAgICAgdW5yZWdpc3RlclJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICBQcm9taXNlLmFsbCh1bnJlZ2lzdGVyUmVzdWx0cykudGhlbigoKSA9PiB7XG5cbiAgICAgICAgcmVzb2x2ZSgnc3VjY2Vzc2Z1bGx5IHVucmVnaXN0ZXJlZCBhbGwgaHlwZXJ0aWVzJyk7XG4gICAgICB9LCBlcnJvciA9PiB7IHJlamVjdChlcnJvcik7IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogIGZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIgYW4gaHlwZXJ0eUluc3RhbmNlIGluIHRoZSBEb21haW4gUmVnaXN0cnlcbiAgKiAgQHBhcmFtICAge1N0cmluZ30gICAgICBoeXBlcnR5SW5zdGFuY2UgICBIeXBlcnR5SW5zbnRhbmNlIHVybFxuICAqXG4gICovXG4gIHVucmVnaXN0ZXJIeXBlcnR5SW5zdGFuY2UoaHlwZXJ0eUluc3RhbmNlKSB7XG4gICAgLy9UT0RPIHdvcmtpbmcgYnV0IHRoZSB1c2VyXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBjbG9zZU1zZyA9IHsgdHlwZTogJ2V4ZWN1dGUnLCBmcm9tOiBfdGhpcy5yZWdpc3RyeVVSTCxcbiAgICAgIHRvOiBoeXBlcnR5SW5zdGFuY2UsXG4gICAgICBib2R5OiB7IG1ldGhvZDogJ2Nsb3NlJyB9fTtcblxuICAgIC8vIFNlbmQgbWVzc2FnZSB0byBoeXBlcnR5IHRvIGNsb3NlXG4gICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UoY2xvc2VNc2csIChyZXBseSkgPT4ge1xuICAgICAgbG9nLmxvZygnW1JlZ2lzdHJ5LnVucmVnaXN0ZXJIeXBlcnR5SW5zdGFuY2VdIENsb3NlIFJlcGx5JywgcmVwbHkpO1xuXG4gICAgICBfdGhpcy5fZG9tYWluUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXJIeXBlcnR5KGh5cGVydHlJbnN0YW5jZSk7XG5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqICBmdW5jdGlvbiB0byB1bnJlZ2lzdGVyIGEgRGF0YSBPYmplY3QgaW4gdGhlIERvbWFpbiBSZWdpc3RyeVxuICAqICBAcGFyYW0gICB7U3RyaW5nfSAgICAgIGh5cGVydHlJbnN0YW5jZSAgIEh5cGVydHlJbnNudGFuY2UgdXJsXG4gICpcbiAgKi9cbiAgdW5yZWdpc3RlckRhdGFPYmplY3QodXJsKSB7XG4gICAgdGhpcy5fZG9tYWluUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXJEYXRhT2JqZWN0KHVybCk7XG4gIH1cblxuXG4gIC8qKlxuICAqIHJlZ2lzdGVyIGEgbmV3IHN1YnNjcmliZXIgaW4gdGhlIGRhdGFPYmplY3QgcmVnaXN0ZXJlZFxuICAqIEBwYXJhbSAge1N0cmluZ30gICBkYXRhT2JqZWN0VVJMICAgIGRhdGFPYmplY3QgVVJMXG4gICogQHBhcmFtICB7U3RyaW5nfSAgIHN1YnNjcmliZXJVUkwgICAgc3Vic2NyaWJlciBVUkxcbiAgKi9cbiAgcmVnaXN0ZXJTdWJzY3JpYmVyKGRhdGFPYmplY3RVUkwsIHN1YnNjcmliZXJVUkwpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBkYXRhT2JqZWN0ID0gX3RoaXMuZGF0YU9iamVjdExpc3RbZGF0YU9iamVjdFVSTF07XG5cbiAgICBpZiAoZGF0YU9iamVjdCkge1xuXG4gICAgICBpZiAoIWRhdGFPYmplY3Quc3Vic2NyaWJlcnMpIGRhdGFPYmplY3Quc3Vic2NyaWJlcnMgPSBbXTtcblxuICAgICAgZGF0YU9iamVjdC5zdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXJVUkwpO1xuICAgICAgX3RoaXMuZGF0YU9iamVjdExpc3RbZGF0YU9iamVjdFVSTF0gPSBkYXRhT2JqZWN0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAqIGdldCB0aGUgc3Vic2NyaWJlcnMgcmVnaXN0ZXJlZCB3aXRoaW4gYSBkYXRhT2JqZWN0XG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICBkYXRhT2JqZWN0VVJMICAgIGRhdGFPYmplY3QgVVJMXG4gICogQHBhcmFtICB7QXJyYXk8U3RyaW5nPn0gICBTdWJzdHJpYmVycyBMaXN0XG4gICovXG4gIGdldERhdGFPYmplY3RTdWJzY3JpYmVycyhkYXRhT2JqZWN0VVJMKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgZGF0YU9iamVjdCA9IF90aGlzLmRhdGFPYmplY3RMaXN0W2RhdGFPYmplY3RVUkxdO1xuXG4gICAgaWYgKGRhdGFPYmplY3QpIHtcbiAgICAgIHJldHVybiBkYXRhT2JqZWN0LnN1YnNjcmliZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyAnTm8gZGF0YU9iamVjdCB3YXMgZm91bmQnO1xuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICogVG8gcmVnaXN0ZXIgYSBuZXcgRGF0YSBPYmplY3QgaW4gdGhlIHJ1bnRpbWUgd2hpY2ggcmV0dXJucyB0aGUgZGF0YU9iamVjdFVSTCBhbGxvY2F0ZWQgdG8gdGhlIG5ldyBEYXRhIE9iamVjdC5cbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgZGF0YU9iamVjdHNjaGVtYSAgICAgICAgICAgIGRhdGFPYmplY3RzY2hlbWFcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgZGF0YU9iamVjdFVybCAgICAgICAgICAgICAgIGRhdGFPYmplY3RVcmxcbiAgKiBAcGFyYW0ge1N0cmluZ30gICAgICBkYXRhT2JqZWN0UmVwb3J0ZXIgICAgICAgICAgIGRhdGFPYmplY3RSZXBvcnRlclxuICAqIEBwYXJhbSAge0FycmF5fSAgICAgcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdCByZXNvdXJjZXNcbiAgKiBAcGFyYW0gIHtBcnJheX0gICAgIGF1dGhvcmlzZSAgICAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgcHJlIGF1dGhvcmlzZWQgYXV0aG9yaXNlZCBJRHNcbiAgKi9cbiAgLy9yZWdpc3RlckRhdGFPYmplY3QoaWRlbnRpZmllciwgZGF0YU9iamVjdHNjaGVtYSwgZGF0YU9iamVjdFVybCwgZGF0YU9iamVjdFJlcG9ydGVyLCByZXNvdXJjZXMsIGFkZHJlc3NVUkwsIGF1dGhvcmlzZSkge1xuICByZWdpc3RlckRhdGFPYmplY3Qob2JqZWN0UmVnaXN0cmF0aW9uKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCByZWdpc3RyYXRpb24gPSBkZWVwQ2xvbmUob2JqZWN0UmVnaXN0cmF0aW9uKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuXG4gICAgICBfdGhpcy5kYXRhT2JqZWN0TGlzdFtvYmplY3RSZWdpc3RyYXRpb24udXJsXSA9IG9iamVjdFJlZ2lzdHJhdGlvbjtcblxuLy8gICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5nZXQoJ3JlZ2lzdHJ5OkRhdGFPYmplY3RVUkxzJykudGhlbigodXJsc0xpc3QpID0+IHtcblxuLyogICAgICAgIGlmICghdXJsc0xpc3QpIHtcbiAgICAgICAgICB1cmxzTGlzdCA9IHt9O1xuICAgICAgICB9Ki9cblxuICAgICAgICAvL3VwZGF0ZSB0aGUgbGlzdCB3aXRoIHRoZSBuZXcgZWxlbWVudHNcbiAgICAgICAgX3RoaXMuX2RhdGFPYmplY3RVcmxzW29iamVjdFJlZ2lzdHJhdGlvbi5uYW1lICsgb2JqZWN0UmVnaXN0cmF0aW9uLnNjaGVtYSArIG9iamVjdFJlZ2lzdHJhdGlvbi5yZXNvdXJjZXMgKyBvYmplY3RSZWdpc3RyYXRpb24ucmVwb3J0ZXJdID0gb2JqZWN0UmVnaXN0cmF0aW9uLnVybDtcblxuICAgICAgICAvLyBzdGVwIHRvIG9idGFpbiB0aGUgbGlzdCBvZiBhbGwgVVJMIHJlZ2lzdGVyZWQgdG8gdXBkYXRlZCB3aXRoIHRoZSBuZXcgb25lLlxuICAgICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQoJ3JlZ2lzdHJ5OkRhdGFPYmplY3RVUkxzJywgMCwgX3RoaXMuX2RhdGFPYmplY3RVcmxzKS50aGVuKCgpID0+IHtcblxuICAgICAgICAgIGlmIChfdGhpcy5pc0ludGVyd29ya2luZ1Byb3RvU3R1YihyZWdpc3RyYXRpb24ucmVwb3J0ZXIpKSB7XG4gICAgICAgICAgICByZWdpc3RyYXRpb24uaW50ZXJ3b3JraW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgZG9tYWluUmVnaXN0cmF0aW9uID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChyZWdpc3RyYXRpb24uaGFzT3duUHJvcGVydHkoXCJkb21haW5fcmVnaXN0cmF0aW9uXCIpKVxuICAgICAgICAgIGRvbWFpblJlZ2lzdHJhdGlvbiA9IHJlZ2lzdHJhdGlvbi5kb21haW5fcmVnaXN0cmF0aW9uO1xuXG4gICAgICAgICAgaWYgKGRvbWFpblJlZ2lzdHJhdGlvbilcbiAgICAgICAgICAgIF90aGlzLl9kb21haW5SZWdpc3RyYXRpb24ucmVnaXN0ZXJEYXRhT2JqZWN0KHJlZ2lzdHJhdGlvbixvYmplY3RSZWdpc3RyYXRpb24ucmVzdW1lLCBfdGhpcy5wMnBIYW5kbGVyU3R1YikudGhlbigoIHJlZ2lzdGVyZWQgKSA9PnsgcmVzb2x2ZShyZWdpc3RlcmVkKSB9KTtcbiAgICAgICAgICBlbHNlIHJlc29sdmUocmVnaXN0cmF0aW9uKTtcblxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ1tSZWdpc3RyeSByZWdpc3RlckRhdGFPYmplY3RdIEVycm9yOiAnLCByZWFzb24pO1xuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuLy8gICAgfSk7XG4gIH1cblxuXG4gIF9nZXRSZXNvdXJjZXNBbmRTY2hlbWVzKGRlc2NyaXB0b3IpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKT0+IHtcblxuICAgICAgbGV0IHJlc291cmNlcztcblxuICAgICAgLy8gY2hlY2sgaWYgdGhlIGh5cGVydHkgcmVzb3VyY2VzIGlzIGEgdmVjdG9yIG9yIGEgc3RyaW5nXG4gICAgICAvLyBUT0RPIGRlbGV0ZSBsYXRlciB3aGVuIGNhdGFsb2d1ZSBpcyBmaXhlZFxuICAgICAgaWYgKHR5cGVvZiAoZGVzY3JpcHRvci5oeXBlcnR5VHlwZSkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlc291cmNlcyA9IFtdO1xuICAgICAgICByZXNvdXJjZXMucHVzaChkZXNjcmlwdG9yLmh5cGVydHlUeXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc291cmNlcyA9IGRlc2NyaXB0b3IuaHlwZXJ0eVR5cGU7XG4gICAgICB9XG5cbiAgICAgIGxldCBvYmpOYW1lID0gZGVzY3JpcHRvci5vYmplY3ROYW1lO1xuXG4gICAgICBsZXQgZGVzY3JpcHRvckRhdGFTY2hlbWEgPSBkZXNjcmlwdG9yLmRhdGFPYmplY3RzO1xuICAgICAgbGV0IGRhdGFTY2hlbWFzQXJyYXkgPSBbXTtcblxuICAgICAgLy90aGlzIHdpbGwgY3JlYXRlIGEgYXJyYXkgd2l0aCBhIFByb21pc2UgaW4gZWFjaCBwb3NpdGlvblxuICAgICAgZm9yIChsZXQgaW5kZXggaW4gZGVzY3JpcHRvckRhdGFTY2hlbWEpIHtcbiAgICAgICAgZGF0YVNjaGVtYXNBcnJheS5wdXNoKF90aGlzLnJ1bnRpbWVDYXRhbG9ndWUuZ2V0RGF0YVNjaGVtYURlc2NyaXB0b3IoZGVzY3JpcHRvckRhdGFTY2hlbWFbaW5kZXhdKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGFzIHNvb24gYXMgdGhlIHByZXZpb3VzIGFycmF5IGlzIGNvbXBsZXRlZCwgdGhpcyB3aWxsIHdhaXQgZm9yIHRoZSByZXNvbHZlIG9mIGFsbCBwcm9taXNlcyBpbiB0aGUgYXJyYXlcbiAgICAgIFByb21pc2UuYWxsKGRhdGFTY2hlbWFzQXJyYXkpLnRoZW4oZnVuY3Rpb24oZGF0YVNjaGVtYXMpIHtcblxuICAgICAgICBsZXQgZmlsdGVyZWREYXRhU2NoZW1hcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCBpbiBkYXRhU2NoZW1hcykge1xuICAgICAgICAgIGxldCBkYXRhU2NoZW1hID0gZGF0YVNjaGVtYXNbaW5kZXhdO1xuICAgICAgICAgIGZpbHRlcmVkRGF0YVNjaGVtYXMucHVzaChkYXRhU2NoZW1hLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLnNjaGVtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnldIEh5cGVydHkgU2NoZW1hcycsIGZpbHRlcmVkRGF0YVNjaGVtYXMpO1xuICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnldIEh5cGVydHkgcmVzb3VyY2VzJywgcmVzb3VyY2VzKTtcblxuICAgICAgICByZXNvbHZlKHtyZXNvdXJjZXM6IHJlc291cmNlcywgZGF0YVNjaGVtYTogZmlsdGVyZWREYXRhU2NoZW1hcywgbmFtZTogb2JqTmFtZX0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBtZXRob2QgdGhhdCByZXR1cm5zIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBIeXBlcnR5IG9yIERhdGFPYmplY3RzIFVSTFMsIGZvciBnaXZlbiBjaGFyYWN0ZXJpc3RpY3NcbiAgKiBAcGFyYW0gIHtKU09OfSAgICAgICAgaW5mbyAgICAgICAgICAgb2JqZWN0IG9yIGh5cGVydHkgY2hhcmF0ZXJpc3RpY3MgaW5mb1xuICAqIEByZXR1cm4ge2FkZHJlc3NVUkx9ICBhZGRyZXNzVVJMICAgICByZXR1cm4gdGhlIFVSTCBpZiB0aGVyZSBpcyBhbnkgcHJldmlvdXN5IHJlZ2lzdGVyZWQgVVJMLCByZXR1cm4gdW5kZWZpbmVkIG90aGVyd2lzZVxuICAqL1xuICBjaGVja1JlZ2lzdGVyZWRVUkxzKGluZm8sIHJldXNlVVJMKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgICBsZXQgb2JqZWN0VHlwZSA9IChpbmZvLnJlcG9ydGVyKSA/ICdyZWdpc3RyeTpEYXRhT2JqZWN0VVJMcycgOiAncmVnaXN0cnk6SHlwZXJ0eVVSTHMnO1xuXG4gICAgICBpZiAodHlwZW9mKHJldXNlVVJMKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqZWN0VHlwZSA9IHJldXNlVVJMICYmIGRpdmlkZVVSTChyZXVzZVVSTCkudHlwZSAhPT0gJ2h5cGVydHknID8gJ3JlZ2lzdHJ5OkRhdGFPYmplY3RVUkxzJyA6ICdyZWdpc3RyeTpIeXBlcnR5VVJMcyc7XG4gICAgICB9XG4gICAgICAvL2RlYnVnZ2VyO1xuICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KG9iamVjdFR5cGUpLnRoZW4oKHVybHNMaXN0KSA9PiB7XG5cbiAgICAgICAgaWYgKCF1cmxzTGlzdCkge1xuICAgICAgICAgIHVybHNMaXN0ID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mKHJldXNlVVJMKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBsb2cuaW5mbygnW1JlZ2lzdHJ5IC0gY2hlY2tSZWdpc3RlcmVkVVJMc10gLSBsb29rIGZvciAnICsgcmV1c2VVUkwgKyAnIG9uICcsIHVybHNMaXN0KTtcblxuICAgICAgICAgIGxldCBzZWFyY2hSZXN1bHQgPSBPYmplY3Qua2V5cyh1cmxzTGlzdCkubWFwKChrZXkpID0+IHtcbiAgICAgICAgICAgIGxldCBpbmRleE9mID0gdXJsc0xpc3Rba2V5XS5pbmRleE9mKHJldXNlVVJMKTtcbiAgICAgICAgICAgIHJldHVybiB1cmxzTGlzdFtrZXldW2luZGV4T2ZdO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIGNoZWNrUmVnaXN0ZXJlZFVSTHNdIC0gZm91bmQgJyArIHNlYXJjaFJlc3VsdC5sZW5ndGggKyAnIHJlc3VsdHMgb24gJywgc2VhcmNoUmVzdWx0KTtcbiAgICAgICAgICBpZiAoc2VhcmNoUmVzdWx0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoc2VhcmNoUmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob2JqZWN0VHlwZSA9PT0gJ3JlZ2lzdHJ5Okh5cGVydHlVUkxzJykge1xuICAgICAgICAgIF90aGlzLl9nZXRSZXNvdXJjZXNBbmRTY2hlbWVzKGluZm8pLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodXJsc0xpc3RbdmFsdWUucmVzb3VyY2VzICsgdmFsdWUuZGF0YVNjaGVtYSArIHZhbHVlLm5hbWVdKSB7XG4gICAgICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeV0gcmV1c2FnZSBvZiBoeXBlcnR5IFVSTCcpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh1cmxzTGlzdFt2YWx1ZS5yZXNvdXJjZXMgKyB2YWx1ZS5kYXRhU2NoZW1hICsgdmFsdWUubmFtZV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5XSBubyBoeXBlcnR5IFVSTCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkICcpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgbGV0IGNoYXJhY3RlcmlzdGljcyA9IGluZm8ubmFtZSArIGluZm8uc2NoZW1hICsgaW5mby5yZXNvdXJjZXMgKyBpbmZvLnJlcG9ydGVyO1xuXG4gICAgICAgICAgaWYgKHVybHNMaXN0W2NoYXJhY3RlcmlzdGljc10pIHtcbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeV0gcmV1c2FnZSBvZiBkYXRhT2JqZWN0IFVSTCcpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZih1cmxzTGlzdFtjaGFyYWN0ZXJpc3RpY3NdKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgbGV0IGFycmF5VG9SZXNvbHZlID0gW107XG4gICAgICAgICAgICAgIGFycmF5VG9SZXNvbHZlLnB1c2godXJsc0xpc3RbY2hhcmFjdGVyaXN0aWNzXSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGFycmF5VG9SZXNvbHZlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHVybHNMaXN0W2NoYXJhY3RlcmlzdGljc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnldIG5vIGRhdGFPYmplY3QgVVJMIHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQnKTtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAqIFRvIHJlZ2lzdGVyIGEgbmV3IEh5cGVydHkgaW4gdGhlIHJ1bnRpbWUgd2hpY2ggcmV0dXJucyB0aGUgSHlwZXJ0eVVSTCBhbGxvY2F0ZWQgdG8gdGhlIG5ldyBIeXBlcnR5LlxuICAqIEBwYXJhbSAge1NhbmRib3h9ICAgICAgICAgICAgIHNhbmRib3ggICAgICAgICAgICAgICBzYW5kYm94XG4gICogQHBhcmFtICB7SHlwZXJ0eUNhdGFsb2d1ZVVSTH0gSHlwZXJ0eUNhdGFsb2d1ZVVSTCAgIGRlc2NyaXB0b3JcbiAgKiBAcGFyYW0ge29iamVjdH0gSWRwQ29uc3RyYWludCAtIGNvbnN0cmFpbnRzIHRvIGJlIHVzZWQgd2hlbiBzZWxlY3RpbmcgdGhlIGlkZW50aXR5IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSHlwZXJ0eSBpbmNsdWRpbmcgb3JpZ2luLCBpZHAsIGFuZCBpZEhpbnQuXG4gICogQHJldHVybiB7SHlwZXJ0eVVSTH0gICAgICAgICAgSHlwZXJ0eVVSTFxuICAqL1xuICByZWdpc3Rlckh5cGVydHkoc2FuZGJveCwgaW1wb3J0UGF0aCwgZGVzY3JpcHRvciwgYWRkcmVzc1VSTCwgSWRwQ29uc3RyYWludCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgaHlwZXJ0eUNhcGFiaWxpdGllcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuXG4gICAgICBfdGhpcy5pZE1vZHVsZS5nZXRJZGVudGl0eUFzc2VydGlvbihJZHBDb25zdHJhaW50KS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuXG4gICAgICAgIGxldCB1c2VyUHJvZmlsZSA9IHJlc3VsdC51c2VyUHJvZmlsZTtcblxuICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgcmVnaXN0ZXJIeXBlcnR5XSB1c2VyUHJvZmlsZScsIHVzZXJQcm9maWxlKTtcblxuICAgICAgICBpZiAoX3RoaXMuX21lc3NhZ2VCdXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlamVjdCgnW1JlZ2lzdHJ5IHJlZ2lzdGVySHlwZXJ0eV0gTWVzc2FnZUJ1cyBpcyB1bmRlZmluZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvL2NhbGwgY2hlY2sgaWYgdGhlIHByb3Rvc3R1YiBleGlzdDogdG8gYmUgcmVtb3ZlZFxuICAgICAgICAgIC8qICBfdGhpcy5yZXNvbHZlKGRvbWFpblVybCkudGhlbihmdW5jdGlvbihhKSB7XG4gICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgcmVnaXN0ZXJIeXBlcnR5XSBzdHViIHRvIGRvbWFpbiByZWdpc3RyeS0gJywgYSk7Ki9cblxuLy8gICAgICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdyZWdpc3RyeTpIeXBlcnR5VVJMcycpLnRoZW4oKHVybHNMaXN0KSA9PiB7XG5cbiAgICAgICAgXG5cbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSByZWdpc3Rlckh5cGVydHldIHN0b3JhZ2VNYW5hZ2VyXSAtICcsIHVybHNMaXN0KTtcblxuICAgICAgICAgICAgX3RoaXMuX2dldFJlc291cmNlc0FuZFNjaGVtZXMoZGVzY3JpcHRvcikudGhlbigodmFsdWUpID0+IHtcblxuICAgICAgICAgICAgICBoeXBlcnR5Q2FwYWJpbGl0aWVzID0gdmFsdWU7XG5cbi8qICAgICAgICAgICAgICBpZiAoIXVybHNMaXN0KSB7XG4gICAgICAgICAgICAgICAgdXJsc0xpc3QgPSB7fTtcbiAgICAgICAgICAgICAgfSovXG5cbiAgICAgICAgICAgICAgX3RoaXMuX2h5cGVydHlVcmxzW2h5cGVydHlDYXBhYmlsaXRpZXMucmVzb3VyY2VzICsgaHlwZXJ0eUNhcGFiaWxpdGllcy5kYXRhU2NoZW1hICsgaHlwZXJ0eUNhcGFiaWxpdGllcy5uYW1lXSA9IGFkZHJlc3NVUkwuYWRkcmVzcztcbiAgICAgICAgICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuc2V0KCdyZWdpc3RyeTpIeXBlcnR5VVJMcycsIDAsIF90aGlzLl9oeXBlcnR5VXJscykudGhlbigoKSA9PiB7XG5cblxuICAgICAgICAgICAgICAgIC8vY2hlY2sgd2hldGhlciB0aGUgcmVjZWl2ZWQgc2FuYm94IGUgQXBwbGljYXRpb25TYW5kYm94IG9yIGEgbm9ybWFsIHNhbmRib3hcbiAgICAgICAgICAgICAgICBpZiAoc2FuZGJveC50eXBlID09PSAnYXBwJykge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuc2FuZGJveGVzTGlzdC5hcHBTYW5kYm94W2FkZHJlc3NVUkwuYWRkcmVzc1swXV0gPSBzYW5kYm94O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2FuZGJveC50eXBlID09PSAnbm9ybWFsJykge1xuICAgICAgICAgICAgICAgICAgX3RoaXMuc2FuZGJveGVzTGlzdC5zYW5kYm94W2FkZHJlc3NVUkwuYWRkcmVzc1swXV0gPSBzYW5kYm94O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZWplY3QoJ1dyb25nIFNhbmRib3hUeXBlJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHAycEhhbmRsZXI7XG4gICAgICAgICAgICAgICAgbGV0IHAycFJlcXVlc3RlcjtcblxuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhfdGhpcy5wMnBIYW5kbGVyU3R1YikubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICBwMnBIYW5kbGVyID0gX3RoaXMucDJwSGFuZGxlclN0dWJbX3RoaXMucnVudGltZVVSTF0udXJsO1xuICAgICAgICAgICAgICAgICAgcDJwUmVxdWVzdGVyID0gcnVudGltZVV0aWxzLnJ1bnRpbWVEZXNjcmlwdG9yLnAycFJlcXVlc3RlclN0dWI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGh5cGVydHkgPSBuZXcgSHlwZXJ0eUluc3RhbmNlKF90aGlzLmlkZW50aWZpZXIsIF90aGlzLnJlZ2lzdHJ5VVJMLCBpbXBvcnRQYXRoLCBkZXNjcmlwdG9yLFxuICAgICAgICAgICAgICAgICAgYWRkcmVzc1VSTC5hZGRyZXNzWzBdLCB1c2VyUHJvZmlsZSwgJ2d1aWQnLCBfdGhpcy5ydW50aW1lVVJMLCAnY3R4JywgcDJwSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgcDJwUmVxdWVzdGVyLCBoeXBlcnR5Q2FwYWJpbGl0aWVzLmRhdGFTY2hlbWEsIGh5cGVydHlDYXBhYmlsaXRpZXMucmVzb3VyY2VzKTtcblxuICAgICAgICAgICAgICAgIF90aGlzLmh5cGVydGllc0xpc3QucHVzaChoeXBlcnR5KTtcblxuICAgICAgICAgICAgICAgIC8qLS0tIHN0YXJ0IGhlcmUgbW92ZSBwMnAgYW5kIGRvbWFpbiByZWdpc3RyeSByZWxhdGVkIGZlYXR1cmVzIHRvIGEgc2VwYXJhdGVkIGZ1bmN0aW9uLi0tLS0tLS0uLiovXG5cbiAgICAgICAgICAgICAgICBsZXQgcmVnaXN0cmF0aW9uQXRkb21haW4gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKCBkZXNjcmlwdG9yLmhhc093blByb3BlcnR5KFwiY29uZmlndXJhdGlvblwiKSAmJiBkZXNjcmlwdG9yLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoXCJkb21haW5fcmVnaXN0cmF0aW9uXCIpKSB7XG4gICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb25BdGRvbWFpbiA9IGRlc2NyaXB0b3IuY29uZmlndXJhdGlvbi5kb21haW5fcmVnaXN0cmF0aW9uO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBpZiAocmVnaXN0cmF0aW9uQXRkb21haW4pIF90aGlzLl9kb21haW5SZWdpc3RyYXRpb24ucmVnaXN0ZXJIeXBlcnR5KGh5cGVydHksIGFkZHJlc3NVUkwubmV3QWRkcmVzcykudGhlbigocmVnaXN0ZXJlZCk9PiB7cmVzb2x2ZShyZWdpc3RlcmVkKX0pO1xuICAgICAgICAgICAgICAgICAgZWxzZSByZXNvbHZlKHsgdXJsOiBoeXBlcnR5Lmh5cGVydHlVUkx9KTtcblxuICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgSEVSRSBNT1ZFIERPTUFJTiBSRUdJU1RSWSAtLS0tLS0tLS0tLS0tLS0tLS0qL1xuICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgcmVnaXN0ZXJIeXBlcnR5XSBFcnJvcjogJywgcmVhc29uKTtcbiAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbi8vICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgcmVqZWN0KCdbUmVnaXN0cnkgcmVnaXN0ZXJIeXBlcnR5XSAnLCBlcnIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG5cbiAgLyoqXG4gICogVG8gdW5yZWdpc3RlciBhIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBIeXBlcnR5XG4gICogQHBhcmFtICB7SHlwZXJ0eVVSTH0gICAgICAgICAgSHlwZXJ0eVVSTCB1cmwgICAgICAgIHVybFxuICAqL1xuICB1bnJlZ2lzdGVySHlwZXJ0eSh1cmwpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICAgIGZvclx0KGluZGV4ID0gMDsgaW5kZXggPCBfdGhpcy5oeXBlcnRpZXNMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBsZXQgaHlwZXJ0eSA9IF90aGlzLmh5cGVydGllc0xpc3RbaW5kZXhdO1xuICAgICAgICBpZiAoaHlwZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGh5cGVydHkuaHlwZXJ0eVVSTCA9PT0gdXJsKSB7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZvdW5kID09PSBmYWxzZSkge1xuICAgICAgICByZWplY3QoJ0h5cGVydHkgbm90IGZvdW5kJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgX3RoaXMuaHlwZXJ0aWVzTGlzdFtpbmRleF07XG4gICAgICAgIHJlc29sdmUoJ0h5cGVydHkgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICogVG8gZGlzY292ZXIgcHJvdG9jb2wgc3R1YnMgYXZhaWxhYmxlIGluIHRoZSBydW50aW1lIGZvciBhIGNlcnRhaW4gZG9tYWluLiBJZiBhdmFpbGFibGUsIGl0IHJldHVybnMgdGhlIHJ1bnRpbWUgdXJsIGZvciB0aGUgcHJvdG9jb2wgc3R1YiB0aGF0IGNvbm5lY3RzIHRvIHRoZSByZXF1ZXN0ZWQgZG9tYWluLiBSZXF1aXJlZCBieSB0aGUgcnVudGltZSBCVVMgdG8gcm91dGUgbWVzc2FnZXMgdG8gcmVtb3RlIHNlcnZlcnMgb3IgcGVlcnMgKGRvIHdlIG5lZWQgc29tZXRoaW5nIHNpbWlsYXIgZm9yIEh5cGVydGllcz8pLlxuICAqIEBwYXJhbSAge0RvbWFpblVSTH0gICAgICAgICAgIERvbWFpblVSTCAgICAgICAgICAgIHVybFxuICAqIEByZXR1cm4ge1J1bnRpbWVVUkx9ICAgICAgICAgICBSdW50aW1lVVJMXG4gICovXG4gIGRpc2NvdmVyUHJvdG9zdHViKHVybCkge1xuICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciB1cmwgbmVlZGVkJyk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKHVybCk7XG4gICAgbGV0IGRvbWFpblVSTCA9IGRpdmlkZWRVUkwuZG9tYWluO1xuXG4gICAgaWYgKF90aGlzLnByb3Rvc3R1YnNMaXN0Lmhhc093blByb3BlcnR5KGRvbWFpblVSTCkgJiYgX3RoaXMucHJvdG9zdHVic0xpc3RbZG9tYWluVVJMXS5zdGF0dXMgPT09IFNUQVRVUy5MSVZFKSB7XG4gICAgICByZXR1cm4gKF90aGlzLnByb3Rvc3R1YnNMaXN0W2RvbWFpblVSTF0pO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIF90aGlzLnByb3Rvc3R1YnNMaXN0W2RvbWFpblVSTF0gPSB7XG4gICAgICAgIHN0YXR1czogU1RBVFVTLkRFUExPWUlOR1xuICAgICAgfTtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVnaXN0cnkgLSBkaXNjb3ZlclByb3RvU3R1YiBdIE1lc3NhZ2UgTm9kZSBQcm90b3N0dWIgTm90IEZvdW5kLiBDcmVhdGluZyBvbmUnKTtcblxuICAgIH1cblxuICB9XG5cbiAgLyoqXG4gICogVG8gZGlzY292ZXIgcHJvdG9jb2wgc3R1YnMgYXZhaWxhYmxlIGluIHRoZSBydW50aW1lIGZvciBhIGNlcnRhaW4gcmVtb3RlIHJ1bnRpbWUgVVJMLiBJZiBhdmFpbGFibGUsIGl0IHJldHVybnMgdGhlIHJ1bnRpbWUgdXJsIGZvciB0aGUgcHJvdG9jb2wgc3R1YiB0aGF0IGNvbm5lY3RzIHRvIHRoZSByZXF1ZXN0ZWQgZG9tYWluLlxuICAqIFJlcXVpcmVkIGJ5IHRoZSBydW50aW1lIEJVUyB0byByb3V0ZSBtZXNzYWdlcyB0byByZW1vdGUgc2VydmVycyBvciBwZWVycyAoZG8gd2UgbmVlZCBzb21ldGhpbmcgc2ltaWxhciBmb3IgSHlwZXJ0aWVzPykuXG4gICogQHBhcmFtICB7UnVudGltZVVSTH0gICAgICAgICAgIFJ1bnRpbWVVUkwgICAgICAgICAgICB1cmxcbiAgKiBAcmV0dXJuIHtwMnBSZXF1ZXN0ZXJ9ICAgICAgICAgICBSdW50aW1lVVJMXG4gICovXG4gIGRpc2NvdmVyUDJQU3R1YihydW50aW1lVVJMKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmIChydW50aW1lVVJMKSB7XG5cbiAgICAgIGlmIChfdGhpcy5wMnBSZXF1ZXN0ZXJTdHViLmhhc093blByb3BlcnR5KHJ1bnRpbWVVUkwpICYmIF90aGlzLnAycFJlcXVlc3RlclN0dWJbcnVudGltZVVSTF0uc3RhdHVzID09PSBTVEFUVVMuTElWRSkge1xuICAgICAgICByZXR1cm4gKF90aGlzLnAycFJlcXVlc3RlclN0dWJbcnVudGltZVVSTF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMucDJwUmVxdWVzdGVyU3R1YltydW50aW1lVVJMXSA9IHtcbiAgICAgICAgICBzdGF0dXM6IFNUQVRVUy5DUkVBVEVEXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVnaXN0cnkgLSBkaXNjb3ZlclAyUFN0dWIgXSBQMlAgUmVxdWVzdGVyIFN0dWIgTm90IEZvdW5kLiBDcmVhdGluZyBvbmUnKTtcblxuICAgICAgfVxuICAgIH0gZWxzZSB7XG5cbiAgICAgIGlmIChfdGhpcy5wMnBIYW5kbGVyU3R1Yi5oYXNPd25Qcm9wZXJ0eShfdGhpcy5ydW50aW1lVVJMKSkge1xuICAgICAgICByZXR1cm4gKF90aGlzLnAycEhhbmRsZXJTdHViW190aGlzLnJ1bnRpbWVVUkxdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzLnAycEhhbmRsZXJTdHViW190aGlzLnJ1bnRpbWVVUkxdID0ge1xuICAgICAgICAgIHN0YXR1czogU1RBVFVTLkNSRUFURURcbiAgICAgICAgfTtcblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWdpc3RyeSAtIGRpc2NvdmVyUDJQU3R1YiBdIFAyUCBIYW5kbGVyIFN0dWIgTm90IEZvdW5kLicpO1xuICAgICAgfVxuXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogVG8gcmVnaXN0ZXIgYSBuZXcgUHJvdG9jb2wgU3R1YiBpbiB0aGUgcnVudGltZSBpbmNsdWRpbmcgYXMgaW5wdXQgcGFyYW1ldGVycyB0aGUgZnVuY3Rpb24gdG8gcG9zdE1lc3NhZ2UsIHRoZSBEb21haW5VUkwgdGhhdCBpcyBjb25uZWN0ZWQgd2l0aCB0aGUgc3R1Yiwgd2hpY2ggcmV0dXJucyB0aGUgUnVudGltZVVSTCBhbGxvY2F0ZWQgdG8gdGhlIG5ldyBQcm90b2NvbFN0dWIuXG4gICAqIEBwYXJhbSAge1NhbmRib3h9ICAgICAgIFNhbmRib3hcbiAgICogQHBhcmFtICB7c3R1YklEfSAgICAgICAgRG9tYWluIG9yIGh5cGVydHkgcnVudGltZSB0byByZWdpc3RlciB0aGUgc3R1YlxuICAgKiBAcGFyYW0gIHtkZXNjcmlwdG9yVVJMfSAgICAgQ2F0YWxvZ3VlIFVSTCBvZiB0aGUgUHJvdG9zdHViIGRlc2NyaXB0b3JcbiAgICogQHBhcmFtICB7ZGVzY3JpcHRvcn0gICAgIFByb3Rvc3R1YiBkZXNjcmlwdG9yXG4gICAqIEByZXR1cm4ge1J1bnRpbWVQcm90b1N0dWJVUkx9XG4gICAqL1xuICByZWdpc3RlclN0dWIoc2FuZGJveCwgc3R1YklELCBwMnBDb25maWcsIGRlc2NyaXB0b3JVUkwsIGRlc2NyaXB0b3IpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IF9zdHViRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGxldCBydW50aW1lUHJvdG9TdHViVVJMO1xuXG4gICAgICAvL2NoZWNrIGlmIG1lc3NhZ2VCdXMgaXMgcmVnaXN0ZXJlZCBpbiByZWdpc3RyeSBvciBub3RcbiAgICAgIGlmIChfdGhpcy5fbWVzc2FnZUJ1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlamVjdCgnTWVzc2FnZUJ1cyBub3QgZm91bmQgb24gcmVnaXN0ZXJTdHViJyk7XG4gICAgICB9XG5cbiAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkgLSByZWdpc3RlclN0dWJdIC0gc3R1YklEICcsIHN0dWJJRCk7XG5cbiAgICAgIC8qIGlmICghc3R1YklELmluZGV4T2YoJ21zZy1ub2RlLicpKSB7XG4gICAgICAgIHN0dWJJRCA9IHN0dWJJRC5zdWJzdHJpbmcoc3R1YklELmluZGV4T2YoJy4nKSArIDEpO1xuICAgICAgfSovXG5cbiAgICAgIGxldCBQMlBSZXF1ZXN0ZXJTdHViO1xuXG4gICAgICBpZiAocDJwQ29uZmlnKSB7XG5cbiAgICAgICAgaWYgKHAycENvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnaXNIYW5kbGVyU3R1YicpICYmIHAycENvbmZpZy5pc0hhbmRsZXJTdHViKSB7XG4gICAgICAgICAgcnVudGltZVByb3RvU3R1YlVSTCA9IF90aGlzLnAycEhhbmRsZXJVUkw7XG5cbiAgICAgICAgICBfdGhpcy5wMnBIYW5kbGVyU3R1YltzdHViSURdID0ge1xuICAgICAgICAgICAgdXJsOiBydW50aW1lUHJvdG9TdHViVVJMLFxuICAgICAgICAgICAgc3RhdHVzOiBTVEFUVVMuQ1JFQVRFRFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBfdGhpcy5wMnBIYW5kbGVyQXNzb2NpYXRpb25bX3RoaXMucnVudGltZVVSTF0gPSBbXTtcblxuICAgICAgICAgIF90aGlzLnNhbmRib3hlc0xpc3Quc2FuZGJveFtydW50aW1lUHJvdG9TdHViVVJMXSA9IHNhbmRib3g7XG4gICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIHJlZ2lzdGVyU3R1YiAtIFAyUEhhbmRsZXJTdHViXSAtICcsIHN0dWJJRCwgJyAtICcsIHJ1bnRpbWVQcm90b1N0dWJVUkwpO1xuICAgICAgICAgIHJlc29sdmUoX3RoaXMucDJwSGFuZGxlclN0dWJbc3R1YklEXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgUDJQUmVxdWVzdGVyU3R1YiA9IHAycENvbmZpZy5wMnBSZXF1ZXN0ZXJTdHViO1xuICAgICAgICAgIHJ1bnRpbWVQcm90b1N0dWJVUkwgPSAncnVudGltZTovLycgKyBkaXZpZGVVUkwocDJwQ29uZmlnLnJlbW90ZVJ1bnRpbWVVUkwpLmRvbWFpbiArICcvcDJwcmVxdWVzdGVyLycgKyBnZW5lcmF0ZUdVSUQoKTtcbiAgICAgICAgICBsb2cuaW5mbygnW1JlZ2lzdHJ5IC0gcmVnaXN0ZXJTdHViIC0gUDJQUmVxdWVzdGVyU3R1Yl0gLSAnLCBQMlBSZXF1ZXN0ZXJTdHViLCAnIC0gJywgcnVudGltZVByb3RvU3R1YlVSTCk7XG5cbiAgICAgICAgICAvLyB0byBiZSBjbGFyaWZpZWQgd2hhdCBpcyB0aGlzIHAycEhhbmRsZXJBc3NvY2lhdGlvblxuICAgICAgICAgIF90aGlzLnAycEhhbmRsZXJBc3NvY2lhdGlvbltfdGhpcy5ydW50aW1lVVJMXS5wdXNoKHJ1bnRpbWVQcm90b1N0dWJVUkwpO1xuICAgICAgICAgIF90aGlzLnAycFJlcXVlc3RlclN0dWJbc3R1YklEXSA9IHtcbiAgICAgICAgICAgIHVybDogcnVudGltZVByb3RvU3R1YlVSTCxcbiAgICAgICAgICAgIHN0YXR1czogU1RBVFVTLkNSRUFURURcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgX3RoaXMuc2FuZGJveGVzTGlzdC5zYW5kYm94W3J1bnRpbWVQcm90b1N0dWJVUkxdID0gc2FuZGJveDtcblxuICAgICAgICAgIC8vU2V0dXAgUDJQIFJlcXVlc3RlciBwYXRoIGludG8gTU5cblxuICAgICAgICAgIGxldCBtc2cgPSB7XG4gICAgICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJyxcbiAgICAgICAgICAgIGZyb206IF90aGlzLnJlZ2lzdHJ5VVJMLFxuICAgICAgICAgICAgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgX3RoaXMuX2RvbWFpbiArICcvc20nLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICBzdWJzY3JpYmU6IFtydW50aW1lUHJvdG9TdHViVVJMXSxcbiAgICAgICAgICAgICAgc291cmNlOiBfdGhpcy5yZWdpc3RyeVVSTFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gcmVnaXN0ZXIgU3R1Yl0gcDJwUmVxdWVzdGVyIHBhdGggc2V0dXA6ICcsIHJlcGx5KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlc29sdmUoX3RoaXMucDJwUmVxdWVzdGVyU3R1YltzdHViSURdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1tSZWdpc3RyeSAtIHJlZ2lzdGVyU3R1YiAtIE5vcm1hbCBTdHViXSBkZXNjcmlwdG9yJywgZGVzY3JpcHRvcik7XG5cbiAgICAgICAgaWYgKCAhdHlwZW9mKGRlc2NyaXB0b3IpID09PSAnc3RyaW5nJyAmJiBkZXNjcmlwdG9yLmhhc093blByb3BlcnR5KCdfaW50ZXJ3b3JraW5nJykgJiYgZGVzY3JpcHRvci5faW50ZXJ3b3JraW5nKSB7XG4gICAgICAgICAgcnVudGltZVByb3RvU3R1YlVSTCA9ICdydW50aW1lOi8vJyArIHN0dWJJRCArICcvcHJvdG9zdHViLycgKyAnc2NoZW1lMSc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcnVudGltZVByb3RvU3R1YlVSTCA9ICdydW50aW1lOi8vJyArIHN0dWJJRCArICcvcHJvdG9zdHViLycgKyBnZW5lcmF0ZUdVSUQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkgLSByZWdpc3RlclN0dWIgLSBOb3JtYWwgU3R1Yl0gLSAnLCBzdHViSUQpO1xuXG4gICAgICAgIC8vIFRPRE86IE9wdGltaXplIHRoaXNcbiAgICAgICAgX3RoaXMucHJvdG9zdHVic0xpc3Rbc3R1YklEXSA9IHtcbiAgICAgICAgICB1cmw6IHJ1bnRpbWVQcm90b1N0dWJVUkwsXG4gICAgICAgICAgc3RhdHVzOiBTVEFUVVMuREVQTE9ZSU5HXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGRlc2NyaXB0b3JVUkwpIHtcbiAgICAgICAgICBfdGhpcy5wcm90b3N0dWJzTGlzdFtzdHViSURdLmRlc2NyaXB0b3JVUkwgPSBkZXNjcmlwdG9yVVJMO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKF9zdHViRGVzY3JpcHRvciAmJiAoX3N0dWJEZXNjcmlwdG9yLmludGVyd29ya2luZykpIHtcbiAgICAgICAgICBfdGhpcy5wcm90b3N0dWJzTGlzdFtzdHViSURdLmludGVyd29ya2luZyA9IF9zdHViRGVzY3JpcHRvci5pbnRlcndvcmtpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5zYW5kYm94ZXNMaXN0LnNhbmRib3hbcnVudGltZVByb3RvU3R1YlVSTF0gPSBzYW5kYm94O1xuXG4gICAgICAgIHJlc29sdmUoX3RoaXMucHJvdG9zdHVic0xpc3Rbc3R1YklEXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlc29sdmUocnVudGltZVByb3RvU3R1YlVSTCk7XG5cbiAgICAgIF90aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKHJ1bnRpbWVQcm90b1N0dWJVUkwgKyAnL3N0YXR1cycsIChtc2cpID0+IHtcbiAgICAgICAgX3RoaXMuX29uUHJvdG9zdHViU3RhdHVzRXZlbnQobXNnKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAqIFRvIFByb2Nlc3Mgc3RhdHVzIGV2ZW50cyBmaXJlZCBieSBwcm90b3N0dWJzXG4gICogQHBhcmFtICB7TWVzc2FnZX0gICBtZXNzYWdlICAgICBFdmVudCBNZXNzYWdlXG4gICovXG5cbiAgX29uUHJvdG9zdHViU3RhdHVzRXZlbnQobXNnKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IG9uUHJvdG9zdHViU3RhdHVzRXZlbnRdOiAnLCBtc2cpO1xuXG4gICAgbGV0IHJ1bnRpbWVQcm90b1N0dWJVUkwgPSBtc2cuZnJvbTtcblxuICAgIGlmICghbXNnLnRvLmluY2x1ZGVzKCcvc3RhdHVzJykpIHtcbiAgICAgIGxvZy5lcnJvcignW1JlZ2lzdHJ5IG9uUHJvdG9zdHViU3RhdHVzRXZlbnRdIE5vdCBTdGF0dXMgRXZlbnQ6ICcsIG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHsvLyBicm9hZGNhc3QgUHJvdG9zdHViIHN0YXR1cyBldmVudCB0byBhbGwgSHlwZXJ0aWVzXG4gICAgICBsZXQgZnJvbSA9ICBtc2cuZnJvbTtcbiAgICAgIG1zZy5mcm9tID0gX3RoaXMucnVudGltZVVSTDtcbiAgICAgIG1zZy50byA9IF90aGlzLnJ1bnRpbWVVUkwrJy9zdGF0dXMnO1xuICAgICAgbXNnLmJvZHkucmVzb3VyY2UgPSBmcm9tO1xuICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnKTtcbiAgICB9XG5cbiAgICAvLyBwcm9jZXNzIHN0YXR1cyBldmVudHMgZnJvbSBtZXNzYWdlIG5vZGUgcHJvdG9zdHVic1xuXG4gICAgaWYgKHJ1bnRpbWVQcm90b1N0dWJVUkwuaW5jbHVkZXMoJy9wcm90b3N0dWIvJykpIHtcblxuICAgIC8vIFRPRE86IHVuY29tbWVudCBiZWxvdyB3aGVuIHByb3Rvc3R1YnMgYXJlIHVwZGF0ZWQgd2l0aCBuZXcgc3RhdHVzIHZhbHVlIFwibGl2ZVwiXG4gICAgICBPYmplY3Qua2V5cyhfdGhpcy5wcm90b3N0dWJzTGlzdCkuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnByb3Rvc3R1YnNMaXN0W2tleV0udXJsID09PSBydW50aW1lUHJvdG9TdHViVVJMO1xuICAgICAgfSkubWFwKChrZXkpID0+IHtcbiAgICAgICAgX3RoaXMucHJvdG9zdHVic0xpc3Rba2V5XS5zdGF0dXMgPSBtc2cuYm9keS52YWx1ZTtcblxuICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgLSBvblByb3Rvc3R1YlN0YXR1c0V2ZW50XSAtIFByb3Rvc3R1YiBzdGF0dXM6ICcsIF90aGlzLnByb3Rvc3R1YnNMaXN0W2tleV0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHsgLy8gcHJvY2VzcyBzdGF0dXMgZXZlbnRzIGZyb20gcDJwIGNvbm5lY3Rpb25zXG5cbiAgICAgIGlmIChtc2cuYm9keS5yZXNvdXJjZSkge1xuICAgICAgICBsZXQgcmVtb3RlUnVudGltZVVSTCA9IG1zZy5ib2R5LnJlc291cmNlO1xuXG4gICAgICAgIGlmIChfdGhpcy5wMnBDb25uZWN0aW9uTGlzdFtyZW1vdGVSdW50aW1lVVJMXSkge1xuICAgICAgICAgIF90aGlzLnAycENvbm5lY3Rpb25MaXN0W3JlbW90ZVJ1bnRpbWVVUkxdLnN0YXR1cyA9ICBtc2cuYm9keS52YWx1ZTtcbiAgICAgICAgICBfdGhpcy5wMnBDb25uZWN0aW9uTGlzdFtyZW1vdGVSdW50aW1lVVJMXS51cmwgPSAgcnVudGltZVByb3RvU3R1YlVSTDtcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIGxldCAgcDJwQ29ubmVjdGlvbiA9IHtcbiAgICAgICAgICAgIHN0YXR1czogbXNnLmJvZHkudmFsdWUsXG4gICAgICAgICAgICB1cmw6IHJ1bnRpbWVQcm90b1N0dWJVUkxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgX3RoaXMucDJwQ29ubmVjdGlvbkxpc3RbcmVtb3RlUnVudGltZVVSTF0gPSAgcDJwQ29ubmVjdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSAtIG9uUHJvdG9zdHViU3RhdHVzRXZlbnRdIC0gUDJQQ29ubmVjdGlvbiBzdGF0dXM6ICcsIF90aGlzLnAycENvbm5lY3Rpb25MaXN0W3JlbW90ZVJ1bnRpbWVVUkxdKTtcblxuICAgICAgICAvLyBVcGRhdGUgUDJQIFJlcXVlc3RlciBwcm90b3N0dWIgaWYgaXQgaXMgY29taW5nIGZyb20gdGhlcmVcbiAgICAgICAgaWYgKHJ1bnRpbWVQcm90b1N0dWJVUkwuaW5jbHVkZXMoJy9wMnByZXF1ZXN0ZXIvJykpIHtcbiAgICAgICAgICBfdGhpcy5wMnBSZXF1ZXN0ZXJTdHViW3JlbW90ZVJ1bnRpbWVVUkxdLnN0YXR1cyA9IG1zZy5ib2R5LnZhbHVlO1xuXG4gICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gb25Qcm90b3N0dWJTdGF0dXNFdmVudF0gLSBQMlAgUmVxdWVzdGVyIHN0YXR1czogJywgX3RoaXMucDJwUmVxdWVzdGVyU3R1YltyZW1vdGVSdW50aW1lVVJMXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gaWYgZnJvbSBQMlBIYW5kbGVyIHdpdGggc3RhdHVzIGRpc2NvbmVuY3RlZCwgbGV0cyByZW1vdmUgZnJvbSBwMnBDb25uZWN0aW9uTGlzdFxuICAgICAgICAgIGlmIChtc2cuYm9keS52YWx1ZSA9PT0gJ2Rpc2Nvbm5lY3RlZCcpIGRlbGV0ZSBfdGhpcy5wMnBDb25uZWN0aW9uTGlzdFtyZW1vdGVSdW50aW1lVVJMXTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocnVudGltZVByb3RvU3R1YlVSTC5pbmNsdWRlcygnL3AycHJlcXVlc3Rlci8nKSkge1xuICAgICAgICAgIC8vIEl0IGlzIGFuIGV2ZW50IGZyb20gUDJQIFJlcXVlc3RlciB3aXRob3V0IG1hbmRhdG9yeSBcInJlc291cmNlXCIgZmllbGRcbiAgICAgICAgICBsb2cuZXJyb3IoJ1tSZWdpc3RyeSBvblByb3Rvc3R1YlN0YXR1c0V2ZW50XSByZXNvdXJjZSBtaXNzaW5nOiAnLCBtc2cpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJdCBpcyBhbiBldmVudCBmcm9tIFAyUCBIYW5kbGVyXG4gICAgICAgICAgX3RoaXMucDJwSGFuZGxlclN0dWJbX3RoaXMucnVudGltZVVSTF0uc3RhdHVzID0gbXNnLmJvZHkudmFsdWU7XG5cbiAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgLSBvblByb3Rvc3R1YlN0YXR1c0V2ZW50XSAtIFAyUEhhbmRsZXIgU3R1YiBzdGF0dXM6ICcsIF90aGlzLnAycEhhbmRsZXJTdHViW190aGlzLnJ1bnRpbWVVUkxdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgKiBUbyB1bnJlZ2lzdGVyIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHByb3RvY29sIHN0dWJcbiAgKiBAcGFyYW0gIHtIeXBlcnR5UnVudGltZVVSTH0gICBIeXBlcnR5UnVudGltZVVSTCAgICAgaHlwZXJ0eVJ1bnRpbWVVUkxcbiAgKi9cbiAgdW5yZWdpc3RlclN0dWIoaHlwZXJ0eVJ1bnRpbWVVUkwpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBpZiAoX3RoaXMucHJvdG9zdHVic0xpc3QuaGFzT3duUHJvcGVydHkoaHlwZXJ0eVJ1bnRpbWVVUkwpKSB7XG4gICAgICAgIGRlbGV0ZSBfdGhpcy5wcm90b3N0dWJzTGlzdFtoeXBlcnR5UnVudGltZVVSTF07XG4gICAgICAgIHJlc29sdmUoJ1Byb3Rvc3R1YlVSTCByZW1vdmVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoJ0Vycm9yIG9uIHVucmVnaXN0ZXJTdHViOiBIeXBlcnR5IG5vdCBmb3VuZCcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIHJlZ2lzdGVyIGEgbmV3IElkZW50aXR5IFByb3ZpZGVyIHByb3h5IGluIHRoZSBydW50aW1lIGluY2x1ZGluZyBhcyBpbnB1dCBwYXJhbWV0ZXJzIHRoZSBmdW5jdGlvbiB0byBwb3N0TWVzc2FnZSwgdGhlIERvbWFpblVSTCB0aGF0IGlzIGNvbm5lY3RlZCB3aXRoIHRoZSBzdHViLCB3aGljaCByZXR1cm5zIHRoZSBSdW50aW1lVVJMIGFsbG9jYXRlZCB0byB0aGUgbmV3IFByb3RvY29sU3R1Yi5cbiAgICogQHBhcmFtIHtTYW5kYm94fSAgICAgICAgU2FuZGJveFxuICAgKiBAcGFyYW0gIHtEb21haW5VUkx9ICAgICBEb21haW5VUkwgc2VydmljZSBwcm92aWRlciBkb21haW5cbiAgICogQHJldHVybiB7UnVudGltZUlkcFByb3h5VVJMfVxuICAgKi9cbiAgcmVnaXN0ZXJJZHBQcm94eShzYW5kYm94LCBkb21haW5VUkwpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBsZXQgaWRwUHJveHlTdHViVVJMO1xuXG4gICAgICAvL2NoZWNrIGlmIG1lc3NhZ2VCdXMgaXMgcmVnaXN0ZXJlZCBpbiByZWdpc3RyeSBvciBub3RcbiAgICAgIGlmIChfdGhpcy5fbWVzc2FnZUJ1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlamVjdCgnTWVzc2FnZUJ1cyBub3QgZm91bmQgb24gcmVnaXN0ZXJTdHViJyk7XG4gICAgICB9XG5cbiAgICAgIGlkcFByb3h5U3R1YlVSTCA9ICdkb21haW4taWRwOi8vJyArIGRvbWFpblVSTCArICcvc3R1Yi8nICsgZ2VuZXJhdGVHVUlEKCk7XG5cbiAgICAgIC8vIFRPRE86IE9wdGltaXplIHRoaXNcbiAgICAgIF90aGlzLmlkcFByb3h5TGlzdFtkb21haW5VUkxdID0ge1xuICAgICAgICB1cmw6IGlkcFByb3h5U3R1YlVSTCxcbiAgICAgICAgc3RhdHVzOiBTVEFUVVMuREVQTE9ZSU5HXG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5zYW5kYm94ZXNMaXN0LnNhbmRib3hbaWRwUHJveHlTdHViVVJMXSA9IHNhbmRib3g7XG5cbiAgICAgIC8vIHNhbmRib3guYWRkTGlzdGVuZXIoJyonLCBmdW5jdGlvbihtc2cpIHtcbiAgICAgIC8vICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgIC8vIH0pO1xuXG4gICAgICByZXNvbHZlKGlkcFByb3h5U3R1YlVSTCk7XG5cbiAgICAgIF90aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKGlkcFByb3h5U3R1YlVSTCArICcvc3RhdHVzJywgKG1zZykgPT4ge1xuICAgICAgICBfdGhpcy5fb25JZHBQcm94eVN0YXR1c0V2ZW50KG1zZyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFRvIFByb2Nlc3Mgc3RhdHVzIGV2ZW50cyBmaXJlZCBieSBJZHAgUHJveGllc1xuICAqIEBwYXJhbSAge01lc3NhZ2V9ICAgbWVzc2FnZSAgICAgRXZlbnQgTWVzc2FnZVxuICAqL1xuXG4gIF9vbklkcFByb3h5U3RhdHVzRXZlbnQobXNnKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IG9uSWRwUHJveHlTdGF0dXNFdmVudF06ICcsIG1zZyk7XG5cbiAgICBsZXQgaWRwUHJveHlVUkwgPSBtc2cuZnJvbTtcblxuICAgIGlmICghbXNnLnRvLmluY2x1ZGVzKCcvc3RhdHVzJykpIHtcbiAgICAgIGxvZy5lcnJvcignW1JlZ2lzdHJ5IG9uSWRwUHJveHlTdGF0dXNFdmVudF0gTm90IFN0YXR1cyBFdmVudDogJywgbXNnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhfdGhpcy5pZHBQcm94eUxpc3QpLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgICByZXR1cm4gX3RoaXMuaWRwUHJveHlMaXN0W2tleV0udXJsID09PSBpZHBQcm94eVVSTDtcbiAgICB9KS5tYXAoKGtleSkgPT4ge1xuICAgICAgX3RoaXMuaWRwUHJveHlMaXN0W2tleV0uc3RhdHVzID0gbXNnLmJvZHkudmFsdWU7XG5cbiAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSAtIG9uSWRwUHJveHlTdGF0dXNFdmVudF0gLSBJZHAgUHJveHkgc3RhdHVzOiAnLCBfdGhpcy5pZHBQcm94eUxpc3Rba2V5XSk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAqIFRvIGRpc2NvdmVyIGlkcFByb3h5IHN0dWJzIGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZSBmb3IgYSBjZXJ0YWluIGRvbWFpbi4gSWYgYXZhaWxhYmxlLCBpdCByZXR1cm5zIHRoZSBydW50aW1lIHVybCBmb3IgdGhlIGlkcFByb3h5IHN0dWIgdGhhdCBjb25uZWN0cyB0byB0aGUgcmVxdWVzdGVkIGRvbWFpbi4gUmVxdWlyZWQgYnkgdGhlIHJ1bnRpbWUgQlVTIHRvIHJvdXRlIG1lc3NhZ2VzIHRvIHJlbW90ZSBzZXJ2ZXJzIG9yIHBlZXJzXG4gICogQHBhcmFtICB7RG9tYWluVVJMfSAgICAgICAgICAgRG9tYWluVVJMICAgICAgICAgICAgdXJsXG4gICogQHJldHVybiB7UnVudGltZVVSTH0gICAgICAgICAgIFJ1bnRpbWVVUkwgICAgICAgICBpZHBQcm94eVVybFxuICAqL1xuICBkaXNjb3ZlcklkcFByb3h5KHVybCkge1xuICAgIGlmICghdXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtZXRlciB1cmwgbmVlZGVkJyk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKHVybCk7XG4gICAgbGV0IGRvbWFpblVSTCA9IGRpdmlkZWRVUkwuZG9tYWluO1xuXG4gICAgaWYgKF90aGlzLmlkcFByb3h5TGlzdC5oYXNPd25Qcm9wZXJ0eShkb21haW5VUkwpICYmIF90aGlzLmlkcFByb3h5TGlzdFtkb21haW5VUkxdLnN0YXR1cyA9PT0gU1RBVFVTLkxJVkUpIHtcbiAgICAgIHJldHVybiAoX3RoaXMuaWRwUHJveHlMaXN0W2RvbWFpblVSTF0pO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIF90aGlzLmlkcFByb3h5TGlzdFtkb21haW5VUkxdID0ge1xuICAgICAgICBzdGF0dXM6IFNUQVRVUy5QUk9HUkVTU1xuICAgICAgfTtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVnaXN0cnkgLSBkaXNjb3ZlcklkcFByb3h5IF0gSWRwIFByb3h5IE5vdCBGb3VuZC4gQ3JlYXRpbmcgb25lJyk7XG5cbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAqIFRvIHJlZ2lzdGVyIGEgbmV3IFBvbGljeSBFbmZvcmNlciBpbiB0aGUgcnVudGltZSBpbmNsdWRpbmcgYXMgaW5wdXQgcGFyYW1ldGVycyB0aGUgZnVuY3Rpb24gdG8gcG9zdE1lc3NhZ2UsIHRoZSBIeXBlcnR5VVJMIGFzc29jaWF0ZWQgd2l0aCB0aGUgUEVQLCB3aGljaCByZXR1cm5zIHRoZSBSdW50aW1lVVJMIGFsbG9jYXRlZCB0byB0aGUgbmV3IFBvbGljeSBFbmZvcmNlciBjb21wb25lbnQuXG4gICogQHBhcmFtICB7TWVzc2FnZS5NZXNzYWdlfSBwb3N0TWVzc2FnZSBwb3N0TWVzc2FnZVxuICAqIEBwYXJhbSAge0h5cGVydHlVUkx9ICAgICAgICAgIEh5cGVydHlVUkwgICAgICAgICAgICBoeXBlcnR5XG4gICogQHJldHVybiB7SHlwZXJ0eVJ1bnRpbWVVUkx9ICAgSHlwZXJ0eVJ1bnRpbWVVUkxcbiAgKi9cbiAgcmVnaXN0ZXJQRVAocG9zdE1lc3NhZ2UsIGh5cGVydHkpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpIHtcbiAgICAgIC8vVE9ETyBjaGVjayB3aGF0IHBhcmFtZXRlciBpbiB0aGUgcG9zdE1lc3NhZ2UgdGhlIHBlcCBpcy5cbiAgICAgIF90aGlzLnBlcExpc3RbaHlwZXJ0eV0gPSBwb3N0TWVzc2FnZTtcbiAgICAgIHJlc29sdmUoJ1BFUCByZWdpc3RlcmVkIHdpdGggc3VjY2VzcycpO1xuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgKiBUbyB1bnJlZ2lzdGVyIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIHByb3RvY29sIHN0dWJcbiAgKiBAcGFyYW0gIHtIeXBlcnR5UnVudGltZVVSTH0gICBIeXBlcnR5UnVudGltZVVSTCAgICAgSHlwZXJ0eVJ1bnRpbWVVUkxcbiAgKi9cbiAgdW5yZWdpc3RlclBFUChIeXBlcnR5UnVudGltZVVSTCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGxldCByZXN1bHQgPSBfdGhpcy5wZXBMaXN0W0h5cGVydHlSdW50aW1lVVJMXTtcblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlamVjdCgnUGVwIE5vdCBmb3VuZC4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoJ1BFUCBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4nKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICogVG8gZGlzY292ZXIgc2FuZGJveGVzIGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZSBmb3IgYSBjZXJ0YWluIGRvbWFpbiBhbmQgYSBjZXJ0YWluIHNldCBvZiBjYXBhYmlsaXRpZXMuIFJlcXVpcmVkIGJ5IHRoZSBydW50aW1lIFVBIHRvIGF2b2lkIG1vcmUgdGhhbiBvbmUgc2FuZGJveCBmb3IgdGhlIHNhbWUgZG9tYWluLlxuICAqIEBwYXJhbSAge0RvbWFpblVSTH0gRG9tYWluVVJMIHVybFxuICAqIEByZXR1cm4ge1J1bnRpbWVTYW5kYm94fSAgICAgICAgICAgUnVudGltZVNhbmRib3hcbiAgKi9cbiAgZ2V0U2FuZGJveCh1cmwsIGNvbnN0cmFpbnRzKSB7XG4gICAgaWYgKCF1cmwpIHRocm93IG5ldyBFcnJvcignUGFyYW1ldGVyIHVybCBuZWVkZWQnKTtcblxuICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSBnZXRTYW5kYm94XSBnZXRTYW5kYm94IGZvcjogJywgdXJsLCAnIGFuZCBjYXBhYmlsaXRpZXM6ICcsIGNvbnN0cmFpbnRzKTtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBsZXQgcmVxdWVzdDtcblxuICAgICAgLy9maXJzdCB0cnkgdG8gZmluZCB0aGUgdXJsIGluIHRoZSBhcHBTYW5kYm94IGxpc3RcbiAgICAgIHJlcXVlc3QgPSBfdGhpcy5zYW5kYm94ZXNMaXN0LmFwcFNhbmRib3hbdXJsXTtcblxuICAgICAgLy9pZiBubyBhcHBTYW5kYm94IHdhcyBmb3VuZCwgdHJ5IHRvIHNlYXJjaCBpbiB0aGUgbm9ybWFsIHNhbmRib3hlcyBsaXN0XG4gICAgICBpZiAoIXJlcXVlc3QpIHtcbiAgICAgICAgcmVxdWVzdCA9IF90aGlzLnNhbmRib3hlc0xpc3Quc2FuZGJveFt1cmxdO1xuXG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuXG4gICAgICAgICAgbGV0IGRvbWFpbjtcblxuICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJzovLycpKSB7XG4gICAgICAgICAgICBkb21haW4gPSBkaXZpZGVVUkwodXJsKS5kb21haW47XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvbWFpbiA9IHVybDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzZWFyY2ggaW4gdGhlIHNhbmRib3hlcyBsaXN0IGZvciBhIGVudHJ5IGNvbnRhaW5pbmcgdGhlIGRvbWFpbiBnaXZlblxuICAgICAgICAgIGZvciAobGV0IHNhbmRib3ggaW4gX3RoaXMuc2FuZGJveGVzTGlzdC5zYW5kYm94KSB7XG4gICAgICAgICAgICAvL3RvZG86IHVuY29tbWVudCBzYW5kYm94IGNvbnN0cmFpbnRzIG1hdGNoIGNvbmRpdGlvbiB3aXRoIHJ1bnRpbWUgc2hhcmluZ1xuICAgICAgICAgICAgaWYgKHNhbmRib3guaW5jbHVkZXMoZG9tYWluKSAmJiBfdGhpcy5zYW5kYm94ZXNMaXN0LnNhbmRib3hbc2FuZGJveF0ubWF0Y2hlcyhjb25zdHJhaW50cykpIHtcbiAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IF90aGlzLnNhbmRib3hlc0xpc3Quc2FuZGJveFtzYW5kYm94XTtcbiAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBPYmplY3Qua2V5cyhjb25zdHJhaW50cykuZmlsdGVyKGNvbnN0cmFpbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAoY29uc3RyYWludCA9PT0gJ2Jyb3dzZXInICYmIGN1cnJlbnQudHlwZSA9PT0gU2FuZGJveFR5cGUuTk9STUFMKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIChjb25zdHJhaW50ID09PSAnd2luZG93U2FuYm94JyAmJiBjdXJyZW50LnR5cGUgPT09IFNhbmRib3hUeXBlLldJTkRPVyk7XG5cbiAgICAgICAgICAgICAgfSkubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsgcmVxdWVzdCA9IGN1cnJlbnQ7IH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICByZWplY3QoJ25vIHNhbmRib3ggZm91bmQgZm9yOiAnICsgdXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUocmVxdWVzdCk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxuXG4gIHJlc29sdmVOb3JtYWxTdHViKHVybCkge1xuICAgIC8vIGxvZy5sb2coJ3Jlc29sdmVOb3JtYWxTdHViICcgKyB1cmwpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAvL3NwbGl0IHRoZSB1cmwgdG8gZmluZCB0aGUgZG9tYWluVVJMLiBkZWFscyB3aXRoIHRoZSB1cmwgZm9yIGV4YW1wbGUgYXM6XG4gICAgICAvL1wiaHlwZXJ0eS1ydW50aW1lOi8vc3AxL3Byb3Rvc3R1Yi8xMjNcIixcbiAgICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKHVybCk7XG4gICAgICBsZXQgZG9tYWluVXJsID0gZGl2aWRlZFVSTC5kb21haW47XG4gICAgICBsZXQgdHlwZSA9IGRpdmlkZWRVUkwudHlwZTtcblxuICAgICAgaWYgKHVybC5pbmNsdWRlcyhfdGhpcy5ydW50aW1lVVJMKSB8fCB1cmwuaW5jbHVkZXMoJzovL3NhbmRib3gvJykpIHtcbiAgICAgICAgbG9nLmVycm9yKCdbUmVnaXN0cnkgLSByZXNvbHZlXSBVUkwgdG8gYmUgcmVzb2x2ZWQgc2hvdWxkIGhhdmUgbGlzdGVuZXJzICcsIHVybCk7XG4gICAgICAgIHJlamVjdCgnW1JlZ2lzdHJ5IC0gcmVzb2x2ZV0gVVJMIHRvIGJlIHJlc29sdmVkIHNob3VsZCBoYXZlIGxpc3RlbmVycyAnLCB1cmwpO1xuICAgICAgfVxuXG4gICAgICAvLyByZXNvbHZlIHRoZSBkb21haW4gcHJvdG9zdHViIGluIGNhc2Ugb2YgYSBtZXNzYWdlIHRvIGdsb2JhbCByZWdpc3RyeVxuICAgICAgaWYgKHVybC5pbmNsdWRlcygnZ2xvYmFsOi8vcmVnaXN0cnknKSkge1xuICAgICAgICBkb21haW5VcmwgPSBfdGhpcy5fZG9tYWluO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFkb21haW5VcmwuaW5kZXhPZignbXNnLW5vZGUuJykgfHwgIWRvbWFpblVybC5pbmRleE9mKCdyZWdpc3RyeS4nKSkge1xuICAgICAgICAgIGRvbWFpblVybCA9IGRvbWFpblVybC5zdWJzdHJpbmcoZG9tYWluVXJsLmluZGV4T2YoJy4nKSArIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF90aGlzLmlzTGVnYWN5KHVybCkudGhlbigoaXNMZWdhY3kpID0+IHtcblxuICAgICAgICAvLyBpZiBsZWdhY3kgaXQgc2hvdWxkIHJlc29sdmUgZm9yIDxwcm90b2NvbD4uPGRvbWFpbj5cbiAgICAgICAgaWYgKGlzTGVnYWN5ICYmIHR5cGUgIT09ICdkb21haW4taWRwJykge1xuICAgICAgICAgIGRvbWFpblVybCA9IHR5cGUgKyAnLicgKyBnZXRVc2VySWRlbnRpdHlEb21haW4odXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkucmVzb2x2ZV0gZG9tYWluVXJsOicsIGRvbWFpblVybCk7XG5cbiAgICAgICAgbGV0IHJlZ2lzdHJlZENvbXBvbmVudDtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ2RvbWFpbi1pZHAnKSB7XG4gICAgICAgICAgcmVnaXN0cmVkQ29tcG9uZW50ICA9IF90aGlzLmlkcFByb3h5TGlzdC5oYXNPd25Qcm9wZXJ0eShkb21haW5VcmwpID8gX3RoaXMuaWRwUHJveHlMaXN0W2RvbWFpblVybF0gOiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWdpc3RyZWRDb21wb25lbnQgID0gX3RoaXMucHJvdG9zdHVic0xpc3QuaGFzT3duUHJvcGVydHkoZG9tYWluVXJsKSA/IF90aGlzLnByb3Rvc3R1YnNMaXN0W2RvbWFpblVybF0gOiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkucmVzb2x2ZV0gcmVnaXN0cmVkOicsIHJlZ2lzdHJlZENvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gVE9ETyBzaW5jZSB0aGUgcHJvdG9zdHVicyBoYXZlIG90aGVyIHN0YXRlcyB0aGlzIHNob3VsZCBiZSByZXZpc2VkLCBiZWNhdXNlIHRoZSBzdGF0dXMgY291bGQgY2hhbmdlIGZyb20gREVQTE9ZRUQgdG8gTElWRVxuICAgICAgICAvLyBUT0RPIGFuZCB0aGlzIHZhbGlkYXRpb24gd2lsbCB0cmlnZ2VyIGEgbmV3IGxvYWQgb2YgSURQUHJveHkgb3IgUHJvdG9zdHViO1xuICAgICAgICBpZiAocmVnaXN0cmVkQ29tcG9uZW50ICYmIHJlZ2lzdHJlZENvbXBvbmVudC5oYXNPd25Qcm9wZXJ0eSgnc3RhdHVzJykgJiZcbiAgICAgICAgIChyZWdpc3RyZWRDb21wb25lbnQuc3RhdHVzID09PSBTVEFUVVMuREVQTE9ZRUQgfHwgcmVnaXN0cmVkQ29tcG9uZW50LnN0YXR1cyA9PT0gU1RBVFVTLkNSRUFURUQgfHxcbiAgICAgICAgICByZWdpc3RyZWRDb21wb25lbnQuc3RhdHVzID09PSBTVEFUVVMuTElWRSB8fCByZWdpc3RyZWRDb21wb25lbnQuc3RhdHVzID09PSBTVEFUVVMuRElTQ09OTkVDVEVEKSkge1xuICAgICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkucmVzb2x2ZV0gUmVzb2x2ZWQ6ICcsIHJlZ2lzdHJlZENvbXBvbmVudC51cmwsIHJlZ2lzdHJlZENvbXBvbmVudC5zdGF0dXMpO1xuICAgICAgICAgIHJlc29sdmUocmVnaXN0cmVkQ29tcG9uZW50LnVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy90b2RvOiB1c2Ugc3dpdGNoLWNhc2UgdG8gc3VwcG9ydCBvdGhlciB0eXBlcyBvZiBzdHVic1xuICAgICAgICAgIGlmICh0eXBlID09PSAnZG9tYWluLWlkcCcpIHtcblxuICAgICAgICAgICAgLy8gVGhlIElkUCBQcm94eSBkb2VzIG5vdCBleGlzdCwgbGV0J3MgcHJlcGFyZSBpdHMgZGVwbG95bWVudCBieSB3YXRjaGluZyBpdHMgc3RhdHVzXG5cbiAgICAgICAgICAgIF90aGlzLndhdGNoaW5nWW91Lm9ic2VydmUoJ2lkcFByb3h5TGlzdCcsIChjaGFuZ2UpID0+IHtcblxuICAgICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgLSByZXNvbHZlTm9ybWFsU3R1Yl0gaWRwUHJveHlMaXN0IGNoYW5nZWQgJyArIF90aGlzLmlkcFByb3h5TGlzdCk7XG5cbiAgICAgICAgICAgICAgbGV0IGtleXBhdGggPSBjaGFuZ2Uua2V5cGF0aDtcblxuICAgICAgICAgICAgICBpZiAoa2V5cGF0aC5pbmNsdWRlcygnc3RhdHVzJykpXG4gICAgICAgICAgICAgICAga2V5cGF0aCA9IGtleXBhdGgucmVwbGFjZSgnLnN0YXR1cycsICcnKTtcblxuICAgICAgICAgICAgICBpZiAoa2V5cGF0aCA9PT0gZG9tYWluVXJsICYmIGNoYW5nZS5uYW1lID09PSAnc3RhdHVzJyAmJiBjaGFuZ2UubmV3VmFsdWUgPT09IFNUQVRVUy5DUkVBVEVEKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gcmVzb2x2ZU5vcm1hbFN0dWJdIGlkcFByb3h5TGlzdCBpcyBsaXZlICcgKyBfdGhpcy5pZHBQcm94eUxpc3RbZG9tYWluVXJsXSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShfdGhpcy5pZHBQcm94eUxpc3RbZG9tYWluVXJsXS51cmwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFyZWdpc3RyZWRDb21wb25lbnQgfHwgcmVnaXN0cmVkQ29tcG9uZW50LnN0YXR1cyA9PT0gU1RBVFVTLkZBSUxFRCApIHtcbiAgICAgICAgICAgICAgLy8gdGhpcyBwcm9jZXNzIHdpbGwgbG9hZCB0aGUgaWRwIHByb3h5LCBiZWNhdXNlIGlzIG5vdCB5ZXQgcmVnaXN0ZXJlZDtcbiAgICAgICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeS5yZXNvbHZlTm9ybWFsU3R1Yl0gZGVwbG95IG5ldyBJRFBQcm94eTogJywgZG9tYWluVXJsKTtcbiAgICAgICAgICAgICAgX3RoaXMubG9hZGVyLmxvYWRJZHBQcm94eShkb21haW5VcmwpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeS5yZXNvbHZlTm9ybWFsU3R1Yl0gSWRQIFByb3h5IGRlcGxveWVkOiAnLCBfdGhpcy5pZHBQcm94eUxpc3RbZG9tYWluVXJsXSk7XG5cbiAgICAgICAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignW1JlZ2lzdHJ5LnJlc29sdmVdIEVycm9yIHJlc29sdmluZyBMb2FkIElEUFByb3h5OiAnLCByZWFzb24pO1xuICAgICAgICAgICAgICAgIF90aGlzLmlkcFByb3h5TGlzdFtkb21haW5VcmxdLnN0YXR1cyA9ICdkZXBsb3ltZW50LWZhaWxlZCc7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAvLyBUaGUgcHJvdG9TdHViIGRvZXMgbm90IGV4aXN0LCBsZXQncyBwcmVwYXJlIGl0cyBkZXBsb3ltZW50IGJ5IHdhdGNoaW5nIGl0cyBzdGF0dXNcblxuICAgICAgICAgICAgX3RoaXMud2F0Y2hpbmdZb3Uub2JzZXJ2ZSgncHJvdG9zdHVic0xpc3QnLCAoY2hhbmdlKSA9PiB7XG5cbiAgICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gcmVzb2x2ZU5vcm1hbFN0dWJdIHByb3Rvc3R1YnNMaXN0IGNoYW5nZWQgJyArIF90aGlzLnByb3Rvc3R1YnNMaXN0KTtcblxuICAgICAgICAgICAgICBsZXQga2V5cGF0aCA9IGNoYW5nZS5rZXlwYXRoO1xuXG4gICAgICAgICAgICAgIGlmIChrZXlwYXRoLmluY2x1ZGVzKCdzdGF0dXMnKSlcbiAgICAgICAgICAgICAgICBrZXlwYXRoID0ga2V5cGF0aC5yZXBsYWNlKCcuc3RhdHVzJywgJycpO1xuXG4gICAgICAgICAgICAgIGlmIChrZXlwYXRoID09PSBkb21haW5VcmwgJiYgY2hhbmdlLm5hbWUgPT09ICdzdGF0dXMnICYmIGNoYW5nZS5uZXdWYWx1ZSA9PT0gU1RBVFVTLkNSRUFURUQpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2cubG9nKCdbUmVnaXN0cnkgLSByZXNvbHZlXSBwcm90b3N0dWIgaXMgbGl2ZSAnICsgX3RoaXMucHJvdG9zdHVic0xpc3RbZG9tYWluVXJsXSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShfdGhpcy5wcm90b3N0dWJzTGlzdFtkb21haW5VcmxdLnVybCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoIXJlZ2lzdHJlZENvbXBvbmVudCB8fCByZWdpc3RyZWRDb21wb25lbnQuc3RhdHVzID09PSBTVEFUVVMuRkFJTEVEKSB7XG4gICAgICAgICAgICAgIC8vIGxldHMgZGVwbG95IHRoZSBwcm90b3N0dWJcbiAgICAgICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeS5yZXNvbHZlXSB0cmlnZ2VyIG5ldyBQcm90b2NvbFN0dWI6ICcsIGRvbWFpblVybCk7XG4gICAgICAgICAgICAgIF90aGlzLmxvYWRlci5sb2FkU3R1Yihkb21haW5VcmwpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gcmVzb2x2ZU5vcm1hbFN0dWJdIFN0dWIgZGVwbG95ZWQ6ICcsIF90aGlzLnByb3Rvc3R1YnNMaXN0W2RvbWFpblVybF0pO1xuICAgICAgICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKCdbUmVnaXN0cnkucmVzb2x2ZU5vcm1hbFN0dWJdIEVycm9yIHJlc29sdmluZyBMb2FkIFByb3RvY29sU3R1YjogJywgcmVhc29uKTtcbiAgICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgIGxvZy5lcnJvcignW1JlZ2lzdHJ5LnJlc29sdmVdIEVycm9yIHJlc29sdmluZyBpc2xlZ2FjeTogJywgcmVhc29uKTtcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgKiBUbyB2ZXJpZnkgaWYgc291cmNlIGlzIHZhbGlkIGFuZCB0byByZXNvbHZlIHRhcmdldCBydW50aW1lIHVybCBhZGRyZXNzIGlmIG5lZWRlZCAoZWcgcHJvdG9zdHViIHJ1bnRpbWUgdXJsIGluIGNhc2UgdGhlIG1lc3NhZ2UgaXMgdG8gYmUgZGlzcGF0Y2hlZCB0byBhIHJlbW90ZSBlbmRwb2ludCkuXG4gICogQHBhcmFtICB7VVJMLlVSTH0gIHVybCAgICAgICB1cmxcbiAgKiBAcmV0dXJuIHtQcm9taXNlPFVSTC5VUkw+fSAgICAgICAgICAgICAgICAgUHJvbWlzZSA8VVJMLlVSTD5cbiAgKi9cbiAgcmVzb2x2ZShtc2cpIHtcbiAgICBsb2cuaW5mbygnW1JlZ2lzdHJ5IC0gUmVzb2x2ZV0gLSAgJywgbXNnKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgbGV0IHVybCA9IG1zZy50byA/IG1zZy50byA6IG1zZztcblxuICAgICAgbGV0IHAycCA9IChtc2cuYm9keSAmJiBtc2cuYm9keS5wMnApID8gbXNnLmJvZHkucDJwIDogZmFsc2U7XG5cbiAgICAgIC8vIGxvZy5sb2coJ1AyUDogJywgcDJwLCB1cmwpO1xuICAgICAgLy8gbG9nLmxvZygnUDJQIC0gcDJwSGFuZGxlclN0dWI6ICcsICFfdGhpcy5wMnBIYW5kbGVyU3R1YltfdGhpcy5ydW50aW1lVVJMXSwgX3RoaXMucDJwSGFuZGxlclN0dWIsIF90aGlzLnJ1bnRpbWVVUkwpO1xuICAgICAgLy8gbG9nLmxvZygnUDJQIC0gaXNCYWNrZW5kU2VydmljZVVSTDogJywgaXNCYWNrZW5kU2VydmljZVVSTCh1cmwpLCBpc0JhY2tlbmRTZXJ2aWNlVVJMLCB1cmwpO1xuICAgICAgLy8gbG9nLmxvZygnUDJQIC0gaW5jbHVkZXMgcnVudGltZVVSTDogJywgdXJsLmluY2x1ZGVzKF90aGlzLnJ1bnRpbWVVUkwpKTtcbiAgICAgIC8vIGxvZy5sb2coJ1AyUCAtIGluY2x1ZGVzIHAycGhhbmRsZXI6ICcsIHVybC5pbmNsdWRlcygnL3AycGhhbmRsZXIvJykpO1xuICAgICAgLy8gbG9nLmxvZygnUDJQIC0gaW5jbHVkZXMgcDJwcmVxdWVzdGVyOiAnLCB1cmwuaW5jbHVkZXMoJy9wMnByZXF1ZXN0ZXIvJykpO1xuXG4gICAgICAvLyBTa2lwIHAycCBwcm9jZWR1cmUgd2hlbiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBSdW50aW1lIG9yIGZvciBiYWNrZW5kIHNlcnZpY2VzXG5cbiAgICAgIGlmICghX3RoaXMucDJwSGFuZGxlclN0dWJbX3RoaXMucnVudGltZVVSTF0gfHwgaXNCYWNrZW5kU2VydmljZVVSTCh1cmwpIHx8IHVybC5pbmNsdWRlcyhfdGhpcy5ydW50aW1lVVJMKSB8fCB1cmwuaW5jbHVkZXMoJy9wMnBoYW5kbGVyLycpIHx8IHVybC5pbmNsdWRlcygnL3AycHJlcXVlc3Rlci8nKSkge1xuXG4gICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkgLSByZXNvbHZlXSAtIFJlc29sdmUgbm9ybWFsIHN0dWI6ICcsIF90aGlzLnAycEhhbmRsZXJTdHViLCBfdGhpcy5ydW50aW1lVVJMLCBpc0JhY2tlbmRTZXJ2aWNlVVJMKHVybCksIHAycCwgdXJsKTtcbiAgICAgICAgX3RoaXMucmVzb2x2ZU5vcm1hbFN0dWIodXJsKS50aGVuKChyZXR1cm5VUkwpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHJldHVyblVSTCk7XG4gICAgICAgIH0pO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkgLSByZXNvbHZlXSAtIGNoZWNrUDJQOiAnLCBwMnAsIHVybCwgX3RoaXMuX3AycENvbm5lY3Rpb25SZXNvbHZlKTtcbiAgICAgICAgX3RoaXMuX3AycENvbm5lY3Rpb25SZXNvbHZlLmNoZWNrUDJQKG1zZykudGhlbigocmVnaXN0ZXJlZFAyUCkgPT4ge1xuXG4gICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5IC0gcmVzb2x2ZV0gZm91bmQgcmVnaXN0ZXJlZCBQMlA6ICcsIHJlZ2lzdGVyZWRQMlApO1xuXG4gICAgICAgICAgbGV0IHAycENvbm5lY3Rpb24gPSBfdGhpcy5wMnBDb25uZWN0aW9uTGlzdFtyZWdpc3RlcmVkUDJQLnJ1bnRpbWVdO1xuXG4gICAgICAgICAgaWYgKCFwMnBDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICBwMnBDb25uZWN0aW9uID0gcmVnaXN0ZXJlZFAyUDtcbiAgICAgICAgICAgIF90aGlzLnAycENvbm5lY3Rpb25MaXN0W3JlZ2lzdGVyZWRQMlAucnVudGltZV0gPSBwMnBDb25uZWN0aW9uO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3aXRjaCAocDJwQ29ubmVjdGlvbi5zdGF0dXMpIHtcbiAgICAgICAgICAgIGNhc2UgU1RBVFVTLkxJVkU6XG4gICAgICAgICAgICAgIG1zZy5ib2R5LnBlZXIgPSByZWdpc3RlcmVkUDJQLnJ1bnRpbWU7XG4gICAgICAgICAgICAgIHJlc29sdmUocDJwQ29ubmVjdGlvbi51cmwsIG1zZyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTVEFUVVMuQ1JFQVRFRDogLy8gcDJwIGNvbm5lY3Rpb24gc2V0dXAgaXMgb25nb2luZywgdXNlIE1OIFN0dWJcbiAgICAgICAgICAgIGNhc2UgU1RBVFVTLlBST0dSRVNTOlxuICAgICAgICAgICAgICBfdGhpcy5yZXNvbHZlTm9ybWFsU3R1Yih1cmwpLnRoZW4oKHJldHVyblVSTCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVVJMKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTVEFUVVMuRElTQ09OTkVDVEVEOiAvLyBwMnAgY29ubmVjdGlvbiBzdHViIHdhcyBkaXNjb25uZWN0ZWQsIGxldCdzIGFzayB0byBjb25uZWN0IGFnYWluXG4gICAgICAgICAgICAgIGxvZy5pbmZvKCdbUmVnaXN0cnkgLSBSZXNvbHZlXSAtIHAycENvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkIGxldHMgdHJ5IHRvIHJlY29ubmVjdCcpO1xuICAgICAgICAgICAgICBfdGhpcy5fcDJwQ29ubmVjdGlvblJlc29sdmUucmVjb25uZWN0UDJQUmVxdWVzdGVyKHAycENvbm5lY3Rpb24pLnRoZW4oKHJldHVyblVSTCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGxvZy5sb2coJ1tSZWdpc3RyeSAtIFJlc29sdmVdIC0gd2FzIHJlY29ubmVjdGVkIHdpdGggcDJwUmVxdWVzdGVyU3R1YnQ6ICcsIHJldHVyblVSTCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5VUkwpO1xuICAgICAgICAgICAgICB9LCAocmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIFJlc29sdmVdIC0gUmVhc29uOiAnLCByZWFzb24pO1xuXG4gICAgICAgICAgICAgICAgX3RoaXMucmVzb2x2ZU5vcm1hbFN0dWIodXJsKS50aGVuKChyZXR1cm5VUkwpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVVJMKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcblxuICAgICAgICAgICAgICBsb2cuaW5mbygnW1JlZ2lzdHJ5IC0gcmVzb2x2ZV0gLSBQMlA6ICcsIHAycCk7XG4gICAgICAgICAgICAgIGlmICghcDJwKSB7IC8vIG5vIHAycCBjb25uZWN0aW9uIGV4aXN0cyBhbmQgdGhlIG1lc3NhZ2Ugc2VuZGVyIGRvZXMgbm90IGFzayBvbmUuIExldHMgdXNlIHRoZSBNTiBTdHViXG4gICAgICAgICAgICAgICAgX3RoaXMucmVzb2x2ZU5vcm1hbFN0dWIodXJsKS50aGVuKChyZXR1cm5VUkwpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUocmV0dXJuVVJMKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIF90aGlzLl9zZXR1cFAyUFJlcXVlc3RlcihyZWdpc3RlcmVkUDJQKS50aGVuKChyZXR1cm5VUkwpID0+IHsgLy8gbm8gcDJwIGNvbm5lY3Rpb24gZXhpc3RzIGJ1dCB0aGUgbWVzc2FnZSBzZW5kZXIgaXMgYXNraW5nIG9uZS4gTGV0cyB0cnkgdG8gc2V0dXAgb25lXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblVSTCk7XG4gICAgICAgICAgICAgICAgfSwgKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgbG9nLmluZm8oJ1tSZWdpc3RyeSAtIFJlc29sdmVdIC0gUmVhc29uOiAnLCByZWFzb24pO1xuXG4gICAgICAgICAgICAgICAgICBfdGhpcy5yZXNvbHZlTm9ybWFsU3R1Yih1cmwpLnRoZW4oKHJldHVyblVSTCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJldHVyblVSTCk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH0sIChyZWFzb24pID0+IHtcbiAgICAgICAgICBsb2cuaW5mbygnW1JlZ2lzdHJ5IC0gUmVzb2x2ZV0gLSBSZWFzb246ICcsIHJlYXNvbik7XG5cbiAgICAgICAgICBfdGhpcy5yZXNvbHZlTm9ybWFsU3R1Yih1cmwpLnRoZW4oKHJldHVyblVSTCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXR1cm5VUkwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cbiAgX3NldHVwUDJQUmVxdWVzdGVyKGlucHV0KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxvZy5sb2coJ1tSZWdpc3RyeS5fc2V0dXBQMlBDb25uZWN0aW9uXSBsb2FkU3R1YiB3aXRoIHAycFJlcXVlc3RlcjogJywgaW5wdXQpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgbGV0IHJlbW90ZVJ1bnRpbWUgPSBpbnB1dC5ydW50aW1lO1xuXG4gICAgICBsZXQgcDJwQ29uZmlnID0geyByZW1vdGVSdW50aW1lVVJMOiByZW1vdGVSdW50aW1lLCBwMnBIYW5kbGVyOiBpbnB1dC5wMnBIYW5kbGVyLCBwMnBSZXF1ZXN0ZXJTdHViOiB0cnVlIH07XG5cbiAgICAgIC8vIGxldHMgcHJlcGFyZSB0aGUgcDJwUmVxdWVzdGVyU1R1YiBkZXBsb3ltZW50IGJ5IHNldHRpbmcgYW4gb2JzZXJ2ZXIgdG8gaXRzIHN0YXR1cyBjaGFuZ2VzXG5cbiAgICAgIF90aGlzLndhdGNoaW5nWW91Lm9ic2VydmUoJ3AycFJlcXVlc3RlclN0dWInLCAoY2hhbmdlKSA9PiB7XG5cbiAgICAgICAgbG9nLmxvZygnW1JlZ2lzdHJ5Ll9zZXR1cFAyUENvbm5lY3Rpb25dIHAycFJlcXVlc3RlclN0dWJzIGNoYW5nZWQgJyArIF90aGlzLnAycFJlcXVlc3RlclN0dWIpO1xuXG4gICAgICAgIGlmIChjaGFuZ2Uua2V5cGF0aC5zcGxpdCgnLicpWzBdID09PSByZW1vdGVSdW50aW1lICYmIGNoYW5nZS5uYW1lID09PSAnc3RhdHVzJyAmJiBjaGFuZ2UubmV3VmFsdWUgPT09IFNUQVRVUy5MSVZFKSB7XG4gICAgICAgICAgbG9nLmxvZygnW1JlZ2lzdHJ5Ll9zZXR1cFAyUENvbm5lY3Rpb25dIHAycFJlcXVlc3RlciBpcyBsaXZlICcgKyBfdGhpcy5wMnBSZXF1ZXN0ZXJTdHViW3JlbW90ZVJ1bnRpbWVdKTtcbiAgICAgICAgICByZXNvbHZlKF90aGlzLnAycFJlcXVlc3RlclN0dWJbcmVtb3RlUnVudGltZV0udXJsKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vICBzdHViIGxvYWRcbiAgICAgIF90aGlzLmxvYWRlci5sb2FkU3R1YihpbnB1dC5wMnBSZXF1ZXN0ZXIsIHAycENvbmZpZykudGhlbigoKSA9PiB7XG5cbiAgICAgICAgbG9nLmxvZygnW1JlZ2lzdHJ5Ll9zZXR1cFAyUENvbm5lY3Rpb25dIHAycFJlcXVlc3RlciBkZXBsb3llZDogJywgX3RoaXMucDJwUmVxdWVzdGVyU3R1YltyZW1vdGVSdW50aW1lXSk7XG5cblxuICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFRvIHZlcmlmeSBpZiB1cmwgaXMgZm9yIGEgbGVnYWN5IHNlcnZpY2UuXG4gICogQHBhcmFtICB7VVJMLlVSTH0gIHVybCAgICAgIHVybFxuICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICovXG4gIGlzTGVnYWN5KHVybCkge1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGlmICh1cmwgPT09IF90aGlzLl9kb21haW4pIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuXG4gICAgICBsb2cubG9nKCdbUmVnaXN0cnldIFtSZWdpc3RyeS5SZWdpc3RyeS5pc0xlZ2FjeV0gJywgdXJsKTtcblxuICAgICAgLy8gVE9ETzogdG8gYmUgZGVmaW5lZCBpbiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uXG4gICAgICBsZXQgbm9uTGVnYWN5ID0gWydoeXBlcnR5LXJ1bnRpbWUnLCAnZG9tYWluJywgJ2dsb2JhbCcsICdoeXBlcnR5J107XG5cbiAgICAgIGxldCB1cmxEaXZpZGVkID0gZGl2aWRlVVJMKHVybCk7XG5cbiAgICAgIGlmIChub25MZWdhY3kuaW5kZXhPZih1cmxEaXZpZGVkLnR5cGUpICE9PSAtMSB8fCB1cmxEaXZpZGVkLmRvbWFpbiA9PT0gX3RoaXMuX2RvbWFpbikge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHByb2Nlc3MgVXNlciBVUkxzXG4gICAgICBpZiAodXJsLnNwbGl0KCdAJykubGVuZ3RoID4gMSkge1xuICAgICAgICBsZXQgZG9tYWluID0gdXJsRGl2aWRlZC5kb21haW47XG5cbiAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5XSBbUmVnaXN0cnkuUmVnaXN0cnkuaXNMZWdhY3ldIGRvbWFpbjogJywgZG9tYWluKTtcbiAgICAgICAgaWYgKF90aGlzLmlkcExlZ2FjeVByb3h5TGlzdC5oYXNPd25Qcm9wZXJ0eShkb21haW4pKSB7XG5cbiAgICAgICAgICBsZXQgcmVzdWx0ID0gX3RoaXMuaWRwTGVnYWN5UHJveHlMaXN0W2RvbWFpbl07XG5cbiAgICAgICAgICBpZiAocmVzdWx0LmludGVyd29ya2luZykge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0LmludGVyd29ya2luZyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5fbG9hZGVyLmRlc2NyaXB0b3JzLmdldElkcFByb3h5RGVzY3JpcHRvcihkb21haW4pLnRoZW4oKHJlc3VsdCkgPT4ge1xuXG4gICAgICAgICAgLy8gbG9nLmxvZygnW1JlZ2lzdHJ5XSBbUmVnaXN0cnkuUmVnaXN0cnkuaXNMZWdhY3ldIExlZ2FjeSBzdHViIGRlc2NyaXB0b3I6ICcsIHJlc3VsdCk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LmludGVyd29ya2luZykge1xuICAgICAgICAgICAgX3RoaXMuaWRwTGVnYWN5UHJveHlMaXN0W2RvbWFpbl0gPSByZXN1bHQ7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdC5pbnRlcndvcmtpbmcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICAgIGxvZy53YXJuKCdwcm9ibGVtIGxvYWRpbmcgaWRwIHByb3h5IGRlc2NyaXB0b3IgZm9yIGRvbWFpbjonLCBkb21haW4sICcgYmVjYXVzZSAnLCByZWFzb24pO1xuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7IC8vIHByb2Nlc3MgcHJvdG9zdHViIFVSTHNcbiAgICAgICAgcmVzb2x2ZShfdGhpcy5pc0ludGVyd29ya2luZ1Byb3RvU3R1Yih1cmwpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFRvIHZlcmlmeSBpZiBVUkwgaXMgbG9jYWxseSByZWdpc3RlcmVkIG9yIG5vdC5cbiAgKiBAcGFyYW0gIHtVUkwuVVJMfSAgdXJsICAgICAgdXJsXG4gICogQHJldHVybiB7Ym9vbGVhbn1cbiAgKi9cblxuICBpc0xvY2FsKHVybCkge1xuXG4gICAgbGV0IHJ1bnRpbWVTY2hlbWUgPSBbJ2h5cGVydHktcnVudGltZScsICdydW50aW1lJ107XG4gICAgbGV0IGh5cGVydHlTY2hlbWUgPSBbJ2h5cGVydHknXTtcbiAgICBsZXQgdXJsU2NoZW1lID0gdXJsLnNwbGl0KCc6Ly8nKVswXTtcblxuICAgIC8vIFByb2Nlc3MgUnVudGltZSBDb3JlIFVSTHMuXG4gICAgLy8gTWVzc2FnZXMgb3JpZ2luYXRlZCBmcm9tIHByb3Rvc3R1YnMgc2hvdWxkIGFsc28gbm90IGluY2x1ZGUgdGhlIHJ1bnRpbWVVUkwgaW4gaXRzIFVSTC5cblxuICAgIGlmIChydW50aW1lU2NoZW1lLmluZGV4T2YodXJsU2NoZW1lKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB1cmwuaW5jbHVkZXModGhpcy5ydW50aW1lVVJMKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIEh5cGVydHkgVVJMc1xuICAgIC8vIFRvZG86IGh5cGVydGllc0xpc3Qgc2hvdWxkIGJlIGFuIG9iamVjdCBub3QgYW4gYXJyYXlcblxuICAgIGlmIChoeXBlcnR5U2NoZW1lLmluZGV4T2YodXJsU2NoZW1lKSAhPT0gLTEpIHtcblxuICAgICAgZm9yIChsZXQgaW5kZXggaW4gdGhpcy5oeXBlcnRpZXNMaXN0KSB7XG4gICAgICAgIGxldCBoeXBlcnR5ID0gdGhpcy5oeXBlcnRpZXNMaXN0W2luZGV4XTtcbiAgICAgICAgaWYgKGh5cGVydHkuaHlwZXJ0eVVSTCA9PT0gdXJsKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgRGF0YSBPYmplY3QgVVJMc1xuXG4gICAgaWYgKHVybC5pbmNsdWRlcygnL3N1YnNjcmlwdGlvbicpKSB7XG4gICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIHVybC5pbmRleE9mKCcvc3Vic2NyaXB0aW9uJykpO1xuICAgIH1cblxuICAgIGxldCBkYXRhT2JqZWN0ID0gdGhpcy5kYXRhT2JqZWN0TGlzdFt1cmxdO1xuXG4gICAgaWYgKGRhdGFPYmplY3QpIHtcbiAgICAgIGlmIChkYXRhT2JqZWN0LmludGVyd29ya2luZykge1xuICAgICAgICByZXR1cm4gIWRhdGFPYmplY3QuaW50ZXJ3b3JraW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICogVG8gdmVyaWZ5IGlmIHByb3Rvc3R1YiBpcyB0byBpbnRlcndvcmsgd2l0aCBhIGxlZ2FjeSBkb21haW4uXG4gICogQHBhcmFtICB7VVJMLlVSTH0gIHJ1bnRpbWVQcm90b3N0dWJVUkwgICAgICBUaGUgcnVudGltZSBVUkwgb2YgdGhlIFByb3Rvc3R1YlxuICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICovXG5cbiAgaXNJbnRlcndvcmtpbmdQcm90b1N0dWIocnVudGltZVByb3Rvc3R1YlVSTCkge1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmICh0eXBlb2YgcnVudGltZVByb3Rvc3R1YlVSTCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCEocnVudGltZVByb3Rvc3R1YlVSTC5pbmNsdWRlcygnL3Byb3Rvc3R1Yi8nKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgZmlsdGVyZWQgPSBPYmplY3Qua2V5cyhfdGhpcy5wcm90b3N0dWJzTGlzdCkuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgIHJldHVybiBfdGhpcy5wcm90b3N0dWJzTGlzdFtrZXldLnVybCA9PT0gcnVudGltZVByb3Rvc3R1YlVSTDtcbiAgICB9KS5tYXAoKGtleSkgPT4ge1xuXG4gICAgICBpZiAoX3RoaXMucHJvdG9zdHVic0xpc3Rba2V5XS5oYXNPd25Qcm9wZXJ0eSgnaW50ZXJ3b3JraW5nJykpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLnByb3Rvc3R1YnNMaXN0W2tleV0uaW50ZXJ3b3JraW5nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pWzBdO1xuXG4gICAgcmV0dXJuIGZpbHRlcmVkO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlZ2lzdHJ5O1xuIiwiZXhwb3J0IGNvbnN0IHJ1bnRpbWVDb25maWd1cmF0aW9uID0ge1xuXG4gIC8vIFRPRE8gdGhpcyBzaG91bGQgYmUgY2hhbmdlZCB3aXRoIHRoZSBkZWZpbml0aW9uIHVzZWQgZm9yIGluZGV4ZWRkYlxuICAvLyBsb29rIGF0OiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSURCT2JqZWN0U3RvcmVcbiAgLy8gTm93IHdlIGFyZSB1c2luZyB0aGUgZGVmaW5pdGlvbiBmb3IgRGV4aWU7IChodHRwOi8vZGV4aWUub3JnL2RvY3MvVmVyc2lvbi9WZXJzaW9uLnN0b3JlcygpKVxuICBzdG9yYWdlU2NoZW1hczoge1xuICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgY2FwYWJpbGl0aWVzOiAna2V5LHZlcnNpb24sdmFsdWUnXG4gICAgfSxcbiAgICBzdWJzY3JpcHRpb25zOiB7XG4gICAgICBzdWJzY3JpcHRpb25zOiAna2V5LHZlcnNpb24sdmFsdWUnXG4gICAgfSxcbiAgICBydW50aW1lOiB7XG4gICAgICAncnVudGltZTpVUkwnOiAna2V5LHZlcnNpb24sdmFsdWUnLFxuICAgICAgJ3AycEhhbmRsZXI6VVJMJzogJ2tleSx2ZXJzaW9uLHZhbHVlJ1xuICAgIH0sXG4gICAgcmVnaXN0cnk6IHtcbiAgICAgICdyZWdpc3RyeTpEYXRhT2JqZWN0VVJMcyc6ICdrZXksdmVyc2lvbix2YWx1ZScsXG4gICAgICAncmVnaXN0cnk6SHlwZXJ0eVVSTHMnOiAna2V5LHZlcnNpb24sdmFsdWUnXG4gICAgfSxcbiAgICBjcnlwdG9NYW5hZ2VyOiB7XG4gICAgICB1c2VyQXN5bW1ldHJpY0tleTogJ2tleSx2ZXJzaW9uLHZhbHVlJyxcbiAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5czogJ2tleSx2ZXJzaW9uLHZhbHVlJ1xuICAgIH0sXG4gICAgaWRlbnRpdHk6IHtcbiAgICAgIGFjY2Vzc1Rva2VuczogJ2tleSx2ZXJzaW9uLHZhbHVlJyxcbiAgICAgIGlkZW50aXRpZXM6ICd1c2VyVVJMLCB1c2VyUHJvZmlsZS5lbWFpbCwgdXNlclByb2ZpbGUudXNlclVSTCwgdXNlclByb2ZpbGUubmFtZSdcbiAgICB9LFxuICAgIHJ1bnRpbWVDYXRhbG9ndWU6IHtcbiAgICAgIHJ1bnRpbWVDYXRhbG9ndWU6ICcmY2d1aWQsIGFjY2Vzc0NvbnRyb2xQb2xpY3ksIGNvbnN0cmFpbnRzLCBkYXRhT2JqZWN0cywgdHlwZSwgb2JqZWN0TmFtZSwgc291cmNlUGFja2FnZSwgdmVyc2lvbiwgdXJsJ1xuICAgIH0sXG4gICAgcG9saWN5OiB7XG4gICAgICAncmV0aGluazphY3RpdmVQb2xpY3knOiAna2V5LHZlcnNpb24sdmFsdWUnLFxuICAgICAgJ3JldGhpbms6Z3JvdXBzJzogJ2tleSx2ZXJzaW9uLHZhbHVlJyxcbiAgICAgICdyZXRoaW5rOnVzZXJQb2xpY2llcyc6ICdrZXksdmVyc2lvbix2YWx1ZScsXG4gICAgICAncmV0aGluazpzcFBvbGljaWVzJzogJ2tleSx2ZXJzaW9uLHZhbHVlJ1xuICAgIH0sXG4gICAgc3luY2hlck1hbmFnZXI6IHtcbiAgICAgICdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJzogJ2tleSx2ZXJzaW9uLHZhbHVlJyxcbiAgICAgICdyZW1vdGVzJzogJ2tleSx2ZXJzaW9uLHZhbHVlJ1xuICAgIH0sXG4gICAgaHlwZXJ0eVJlc291cmNlczoge1xuICAgICAgaHlwZXJ0eVJlc291cmNlczogJyZyZXNvdXJjZVVSTCwgbmFtZSwgY29udGVudFVybCwgY29udGVudCwgY3JlYXRlZCwgcmVwb3J0ZXIsIHJlc291cmNlVHlwZSdcbiAgICB9XG4gIH0sXG5cbiAgcnVudGltZVVSTFM6IHtcbiAgICByZWdpc3RyeToge1xuICAgICAgcHJlZml4OiAnaHlwZXJ0eS1ydW50aW1lOi8vJyxcbiAgICAgIHN1ZmZpeDogJ3JlZ2lzdHJ5J1xuICAgIH0sXG4gICAgaWRlbnRpdHlNb2R1bGU6IHtcbiAgICAgIHByZWZpeDogJ2h5cGVydHktcnVudGltZTovLycsXG4gICAgICBzdWZmaXg6ICcvaWRtJ1xuICAgIH0sXG4gICAgcnVudGltZVVBOiB7XG4gICAgICBwcmVmaXg6ICdoeXBlcnR5LXJ1bnRpbWU6Ly8nLFxuICAgICAgc3VmZml4OiAnL3VhJ1xuICAgIH0sXG4gICAgY2F0YWxvZ3VlOiB7XG4gICAgICBwcmVmaXg6ICdoeXBlcnR5LXJ1bnRpbWU6Ly8nLFxuICAgICAgc3VmZml4OiAnL2NhdGFsb2d1ZSdcbiAgICB9LFxuICAgIGdyYXBoQ29ubmVjdG9yOiB7XG4gICAgICBwcmVmaXg6ICdoeXBlcnR5LXJ1bnRpbWU6Ly8nLFxuICAgICAgc3VmZml4OiAnL2dyYXBoJ1xuICAgIH0sXG4gICAgc3luY01hbmFnZXI6IHtcbiAgICAgIHByZWZpeDogJ2h5cGVydHktcnVudGltZTovLycsXG4gICAgICBzdWZmaXg6ICcvc20nXG4gICAgfVxuICB9LFxuICBjYXRhbG9ndWVVUkxzOiB7XG4gICAgcHJvdG9jb2xzdHViOiB7XG4gICAgICBwcmVmaXg6ICdoeXBlcnR5LWNhdGFsb2d1ZTovL2NhdGFsb2d1ZS4nLFxuICAgICAgc3VmZml4OiAnLy53ZWxsLWtub3duL3Byb3RvY29sc3R1Yi8nLFxuICAgICAgZmFsbGJhY2s6ICdoeXBlcnR5LWNhdGFsb2d1ZTovL2NhdGFsb2d1ZS4lZG9tYWluJS8ud2VsbC1rbm93bi9wcm90b2NvbHN0dWIvJ1xuICAgIH0sXG4gICAgaWRwUHJveHk6IHtcbiAgICAgIHByZWZpeDogJ2h5cGVydHktY2F0YWxvZ3VlOi8vY2F0YWxvZ3VlLicsXG4gICAgICBzdWZmaXg6ICcvLndlbGwta25vd24vaWRwLXByb3h5LycsXG4gICAgICBmYWxsYmFjazogJ2h5cGVydHktY2F0YWxvZ3VlOi8vY2F0YWxvZ3VlLiVkb21haW4lLy53ZWxsLWtub3duL2lkcC1wcm94eS8nXG4gICAgfVxuICB9LFxuICBtc2dOb2RlVVJMOiB7XG4gICAgcHJlZml4OiAnZG9tYWluOi8vbXNnLW5vZGUuJyxcbiAgICBzdWZmaXg6ICcnLFxuICAgIGh5cGVydHlBZGRyZXNzQWxsb2NhdGlvbjogJy9oeXBlcnR5LWFkZHJlc3MtYWxsb2NhdGlvbicsXG4gICAgb2JqZWN0QWRkcmVzc0FsbG9jYXRpb246ICcvb2JqZWN0LWFkZHJlc3MtYWxsb2NhdGlvbicsXG4gICAgc3Vic2NyaXB0aW9uTWFuYWdlbWVudDogJy9zbSdcbiAgfSxcbiAgZG9tYWluUmVnaXN0cnlVUkw6IHtcbiAgICBwcmVmaXg6ICdkb21haW46Ly9yZWdpc3RyeS4nLFxuICAgIHN1ZmZpeDogJydcbiAgfSxcbiAgZ2xvYmFsUmVnaXN0cnlVUkw6ICdnbG9iYWw6Ly9yZWdpc3RyeS4nLFxuICByZW1vdGVTdG9yYWdlOiAnaHR0cHM6Ly9iYWNrdXAucmV0aGluay1kZXYuYWx0aWNlbGFicy5jb20vJ1xufTtcbiIsIi8vIExvZyBTeXN0ZW1cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignSWRlbnRpdHlNb2R1bGUnKTtcblxuaW1wb3J0IHsgZGVjb2RlLCBzZWNvbmRzU2luY2VFcG9jaCwgZGVlcENsb25lIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuanMnO1xuaW1wb3J0IHsgV2F0Y2hpbmdZb3UgfSBmcm9tICcuLi9VdGlscyc7XG5cblxuLyoqXG4qIFRoZSBJZGVudGl0eSBEYXRhIE1vZGVsIGlzIHVzZWQgdG8gbW9kZWwgdGhlIHJlVEhJTksgVXNlciBlbnRpdHkuIFRoZSBJZGVudGl0eSBkYXRhIG1vZGVsIGlzIGhhbmRsZWQgYnkgSWRlbnRpdHkgTWFuYWdlbWVudCBmdW5jdGlvbmFsaXR5LlxuKlxuKi9cbmNsYXNzIElkZW50aXRpZXMge1xuXG4gIGNvbnN0cnVjdG9yKHR5cGUsIHN0b3JhZ2VNYW5hZ2VyKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl93YXRjaGluZ1lvdSA9IG5ldyBXYXRjaGluZ1lvdSgpO1xuXG4gICAgX3RoaXMuX3N0b3JhZ2VNYW5hZ2VyID0gc3RvcmFnZU1hbmFnZXI7XG4gICAgX3RoaXMuX2d1aWQ7XG4gICAgX3RoaXMuX3R5cGUgPSB0eXBlO1xuICAgIF90aGlzLl9pZGVudGl0aWVzID0ge307XG4gICAgX3RoaXMuX2FjY2Vzc1Rva2VucyA9IF90aGlzLndhdGNoaW5nWW91LndhdGNoKCdhY2Nlc3NUb2tlbnMnLCB7fSwgdHJ1ZSk7XG5cbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuX2lkZW50aXRpZXMgPSB7fTtcbiAgICBjb25zb2xlLmxvZyh0aGlzKTtcbiAgICB0aGlzLmN1cnJlbnRJZGVudGl0eSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlZmF1bHRJZGVudGl0eSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldCBpZGVudGl0aWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9pZGVudGl0aWVzO1xuICB9XG5cbiAgZ2V0IGFjY2Vzc1Rva2VucygpIHtcbiAgICByZXR1cm4gdGhpcy5fYWNjZXNzVG9rZW5zO1xuICB9XG5cbiAgZ2V0IHdhdGNoaW5nWW91KCkge1xuICAgIHJldHVybiB0aGlzLl93YXRjaGluZ1lvdTtcbiAgfVxuXG4gIHNldCBndWlkKGd1aWQpIHtcbiAgICB0aGlzLl9ndWlkID0gZ3VpZDtcbiAgfVxuXG4gIGdldCBndWlkKCkge1xuICAgIHJldHVybiB0aGlzLl9ndWlkO1xuICB9XG5cbiAgc2V0IGRlZmF1bHRJZGVudGl0eShpZGVudGlmaWVyKSB7XG4gICAgaWYgKHRoaXMuaWRlbnRpdGllc1tpZGVudGlmaWVyXSkgdGhpcy5fZGVmYXVsdElkZW50aXR5ID0gaWRlbnRpZmllcjtcbiAgICBlbHNlIHRocm93IG5ldyBFcnJvcignW0lkZW50aXRpZXMuc2V0IGRlZmF1bHRJZGVudGl0eSBdIEVycm9yOiBpZGVudGl0eSBkb2VzIG5vdCBleGlzdCBoZXJlOiAnLCBpZGVudGlmaWVyKTtcbiAgfVxuXG4gIHNldCBjdXJyZW50SWRlbnRpdHkoaWRlbnRpZmllcikge1xuICAgIGlmICh0aGlzLmlkZW50aXRpZXNbaWRlbnRpZmllcl0pIHRoaXMuX2N1cnJlbnRJZGVudGl0eSA9IGlkZW50aWZpZXI7XG4gICAgZWxzZSB0aHJvdyAnW0lkZW50aXRpZXMuc2V0IGN1cnJlbnRJZGVudGl0eSBdIEVycm9yOiBpZGVudGl0eSBkb2VzIG5vdCBleGlzdCBoZXJlOiAnLCBpZGVudGlmaWVyO1xuICB9XG5cbiAgZ2V0IGRlZmF1bHRJZGVudGl0eSgpIHtcbiAgICBpZiAodGhpcy5fZGVmYXVsdElkZW50aXR5KSByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5pZGVudGl0aWVzW3RoaXMuX2RlZmF1bHRJZGVudGl0eV0pO1xuICAgIGVsc2UgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZ2V0IGN1cnJlbnRJZGVudGl0eSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5pZGVudGl0aWVzW3RoaXMuX2N1cnJlbnRJZGVudGl0eV0pO1xuICB9XG5cbiAgZ2V0IGlkZW50aWZpZXJzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pZGVudGl0aWVzKTtcbiAgfVxuXG4gIGdldElkZW50aXR5KGlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5faWRlbnRpdGllc1tpZGVudGlmaWVyXSk7XG4gIH1cblxuICBsb2FkSWRlbnRpdGllcygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgICBfdGhpcy5fc3RvcmFnZU1hbmFnZXIuZ2V0KG51bGwsIG51bGwsICdpZGVudGl0aWVzJykudGhlbigoaWRlbnRpdGllcykgPT4ge1xuXG4gICAgICAgIGxvZy5pbmZvKCdbSWRlbnRpdGllcy5Mb2FkIElkZW50aXRpZXNdIGlkZW50aXRpZXM6ICcsIGlkZW50aXRpZXMpO1xuXG4gICAgICAgIGlmIChpZGVudGl0aWVzKSB7XG4gICAgICAgICAgX3RoaXMuX2lkZW50aXRpZXMgPSBpZGVudGl0aWVzO1xuXG4gICAgICAgICAgLy8gbGV0J3Mgc2V0IGFzIGRlZmF1bHQgaWRlbnRpdHkgdGhlIG9uZSB0aGF0IGV4cGlyZXMgbGF0ZXJcblxuICAgICAgICAgIF90aGlzLmlkZW50aWZpZXJzLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGltZU5vdyA9IHNlY29uZHNTaW5jZUVwb2NoKCk7XG4gICAgICAgICAgICBsZXQgaWRlbnRpdHkgPSBfdGhpcy5faWRlbnRpdGllc1tpZF07XG4gICAgICAgICAgICBsZXQgZXhwaXJlcyA9IGlkZW50aXR5LmV4cGlyZXM7XG5cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgaWYgKCFpZGVudGl0eS5oYXNPd25Qcm9wZXJ0eSgnaW50ZXJ3b3JraW5nJylcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgfHwgIWlkZW50aXR5LmludGVyd29ya2luZykge1xuICAgICAgICAgICAgX3RoaXMuZGVmYXVsdElkZW50aXR5ID0gaWQ7XG5cbiAgICAgICAgICAgIGlmIChwYXJzZUludChleHBpcmVzKSA+IHRpbWVOb3cpIHtcbiAgICAgICAgICAgICAgX3RoaXMuZGVmYXVsdElkZW50aXR5LmV4cGlyZXMgPSBwYXJzZUludChleHBpcmVzKTtcbiAgICAgICAgICAgICAgX3RoaXMuY3VycmVudElkZW50aXR5ID0gaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgbG9hZEFjY2Vzc1Rva2VucygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgICBfdGhpcy5fc3RvcmFnZU1hbmFnZXIuZ2V0KCdhY2Nlc3NUb2tlbnMnKS50aGVuKChhY2Nlc3NUb2tlbnMpID0+IHtcblxuICAgICAgICBpZiAoYWNjZXNzVG9rZW5zKSBfdGhpcy5fYWNjZXNzVG9rZW5zID0gYWNjZXNzVG9rZW5zO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHRvIGNvbmZpcm0gaWYgdGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCB3aGVuIHRoZSBBcHAgY29uc3RyYWludHMgdGhlIGlkZW50aXR5IHNlbGVjdGlvblxuXG4gIGFkZElkZW50aXR5KGlkZW50aXR5KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoX3RoaXMuX2lzVmFsaWQoaWRlbnRpdHkpKSB7XG4gICAgICAgIGxldCBpZCA9IGlkZW50aXR5LmlkZW50aWZpZXJzWzBdO1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX2lkZW50aXRpZXNbaWRdLCBpZGVudGl0eSk7XG4gICAgICAgIHRoaXMuX3N0b3JlSWRlbnRpdHkoaWRlbnRpdHkpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2lkZW50aXRpZXNbaWRdLnN0YXR1cyA9ICdjcmVhdGVkJztcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHsgcmVqZWN0KCdbSWRlbnRpdGllcy5hZGRJZGVudGl0eV0gaW52YWxpZCBJZEFzc2VydGlvbicpOyB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIGFkZEFzc2VydGlvbihhc3NlcnRpb24pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChfdGhpcy5faXNWYWxpZChhc3NlcnRpb24pKSB7XG4gICAgICAgIGFzc2VydGlvbi51c2VyUHJvZmlsZS5ndWlkID0gX3RoaXMuX2d1aWQ7XG4gICAgICAgIGxldCB1c2VyVXJsID0gYXNzZXJ0aW9uLnVzZXJQcm9maWxlLnVzZXJVUkw7XG4gICAgICAgIGlmICghX3RoaXMuaWRlbnRpdGllc1t1c2VyVXJsXSkgX3RoaXMuX2lkZW50aXRpZXNbdXNlclVybF0gPSBhc3NlcnRpb247XG4gICAgICAgIGVsc2UgX3RoaXMuaWRlbnRpdGllc1t1c2VyVXJsXSA9IGFzc2VydGlvbjtcblxuICAgICAgICBfdGhpcy5fc3RvcmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9pZGVudGl0aWVzW3VzZXJVcmxdLnN0YXR1cyA9ICdjcmVhdGVkJztcbiAgICAgICAgICBpZiAoX3RoaXMuZGVmYXVsdElkZW50aXR5ID09IGZhbHNlKSB7XG4gICAgICAgICAgICBfdGhpcy5kZWZhdWx0SWRlbnRpdHkgPSB1c2VyVXJsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlKGFzc2VydGlvbik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHsgcmVqZWN0KCdbSWRlbnRpdGllcy5hZGRBc3NlcnRpb25dIGludmFsaWQgSWRBc3NlcnRpb246ICcsIGFzc2VydGlvbik7IH1cbiAgICB9KTtcblxuICB9XG5cbiAgcmVtb3ZlSWRlbnRpdHkodXNlclVybCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBkZWxldGUgX3RoaXMuaWRlbnRpdGllc1t1c2VyVXJsXTtcblxuICAgICAgX3RoaXMuX3N0b3JlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgfVxuXG4gIGFkZEFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsb2cuaW5mbygnW0lkZW50aXRpZXMuYWRkQWNjZXNzVG9rZW5dICcsIGFjY2Vzc1Rva2VuKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGlmIChfdGhpcy5faXNWYWxpZEFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuKSkge1xuXG4gICAgICAgIC8vICAgICAgICBsZXQgbmV3QWNjZXNzVG9rZW4gPSBkZWVwQ2xvbmUoYWNjZXNzVG9rZW4pO1xuXG4gICAgICAgIF90aGlzLl9hY2Nlc3NUb2tlbnNbYWNjZXNzVG9rZW4uZG9tYWluXSA9IGFjY2Vzc1Rva2VuO1xuXG4gICAgICAgIF90aGlzLl9zdG9yZUFjY2Vzc1Rva2VucygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIF90aGlzLl9hY2Nlc3NUb2tlbnNbYWNjZXNzVG9rZW4uZG9tYWluXS5zdGF0dXMgPSAnY3JlYXRlZCc7XG4gICAgICAgICAgcmVzb2x2ZShhY2Nlc3NUb2tlbik7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHsgcmVqZWN0KCdbSWRlbnRpdGllcy5hZGRJZGVudGl0eV0gaW52YWxpZCBBY2Nlc3NUb2tlbjogJywgYWNjZXNzVG9rZW4pOyB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIHNldEFjY2Vzc1Rva2VuSW5Qcm9ncmVzcyhkb21haW4pIHtcblxuICAgIGlmICh0aGlzLl9hY2Nlc3NUb2tlbnNbZG9tYWluXSkgdGhpcy5fYWNjZXNzVG9rZW5zW2RvbWFpbl0uc3RhdHVzID0gJ2luLXByb2dyZXNzJztcbiAgICBlbHNlIHRoaXMuX2FjY2Vzc1Rva2Vuc1tkb21haW5dID0geyBzdGF0dXM6ICdpbi1wcm9ncmVzcycgfTtcbiAgfVxuXG4gIGdldEFjY2Vzc1Rva2VuKGRvbWFpbiwgcmVzb3VyY2VzKSB7XG4gICAgbGV0IGFjY2Vzc1Rva2VuID0gdGhpcy5fYWNjZXNzVG9rZW5zW2RvbWFpbl07XG5cbiAgICBpZiAoIWFjY2Vzc1Rva2VuKSB7IHJldHVybiB1bmRlZmluZWQ7IH0gZWxzZSBpZiAoXG4gICAgICByZXNvdXJjZXMuZXZlcnkoKGkpID0+IHsgcmV0dXJuIGFjY2Vzc1Rva2VuLnJlc291cmNlcy5pbmRleE9mKGkpICE9IC0xOyB9KSkgeyByZXR1cm4gdGhpcy5fYWNjZXNzVG9rZW5zW2RvbWFpbl07IH0gZWxzZSB7IHJldHVybiBuZXcgRXJyb3IoJ1tJZGVudGl0aWVzLmdldEFjY2Vzc1Rva2VuXSBOb3QgZm91bmQgZm9yICcsIGRvbWFpbik7IH1cblxuICB9XG5cbiAgcmVtb3ZlQWNjZXNzVG9rZW4oZG9tYWluLCByZXNvdXJjZXMpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0aGlzLl9hY2Nlc3NUb2tlbnNbZG9tYWluXTtcblxuICAgICAgaWYgKCFhY2Nlc3NUb2tlbikgeyByZXNvbHZlKCk7IH0gZWxzZSBpZiAoXG4gICAgICAgIHJlc291cmNlcy5ldmVyeSgoaSkgPT4geyBcbiAgICAgICAgICByZXR1cm4gYWNjZXNzVG9rZW4ucmVzb3VyY2VzLmluZGV4T2YoaSkgIT0gLTE7IFxuICAgICAgICB9KSkge1xuICAgICAgICAgICBkZWxldGUgdGhpcy5fYWNjZXNzVG9rZW5zW2RvbWFpbl07IFxuICAgICAgICAgICBfdGhpcy5fc3RvcmVBY2Nlc3NUb2tlbnMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9XG4gIFxuICAgIH0pO1xuXG5cbiAgfVxuXG4gIHVwZGF0ZUFzc2VydGlvbihhc3NlcnRpb24pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBsZXQgdXNlclVybCA9IGFzc2VydGlvbi51c2VyUHJvZmlsZS51c2VyVVJMO1xuXG4gICAgICBpZiAoIV90aGlzLmlkZW50aXRpZXNbdXNlclVybF0pIHsgcmV0dXJuIHJlamVjdCgnW0lkZW50aXRpZXMudXBkYXRlQXNzZXJ0aW9uXSBJZGVudGl0eSBub3QgZm91bmQgZm9yICcsIHVzZXJVcmwpOyB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5pZGVudGl0aWVzW3VzZXJVcmxdID0gYXNzZXJ0aW9uO1xuICAgICAgICBfdGhpcy5fc3RvcmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgfSk7XG5cbiAgfVxuXG4gIHVwZGF0ZUFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsb2cuaW5mbygnW0lkZW50aXRpZXMudXBkYXRlQWNjZXNzVG9rZW5dICcsIGFjY2Vzc1Rva2VuKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGlmIChfdGhpcy5faXNWYWxpZEFjY2Vzc1Rva2VuKGFjY2Vzc1Rva2VuKSkge1xuXG4gICAgICAgIF90aGlzLl9hY2Nlc3NUb2tlbnNbYWNjZXNzVG9rZW4uZG9tYWluXS5leHBpcmVzID0gYWNjZXNzVG9rZW4uZXhwaXJlcztcbiAgICAgICAgX3RoaXMuX2FjY2Vzc1Rva2Vuc1thY2Nlc3NUb2tlbi5kb21haW5dLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW4uYWNjZXNzVG9rZW47XG5cbiAgICAgICAgX3RoaXMuX3N0b3JlQWNjZXNzVG9rZW5zKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgX3RoaXMuX2FjY2Vzc1Rva2Vuc1thY2Nlc3NUb2tlbi5kb21haW5dLnN0YXR1cyA9ICdjcmVhdGVkJztcbiAgICAgICAgICByZXNvbHZlKGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgeyByZWplY3QoJ1tJZGVudGl0aWVzLnVwZGF0ZUFjY2Vzc1Rva2VuXSBpbnZhbGlkIEFjY2Vzc1Rva2VuOiAnLCBhY2Nlc3NUb2tlbik7IH1cbiAgICB9KTtcblxuICB9XG5cbiAgYWRkSWRBc3NlcnRpb24oaWRlbnRpZmllciwgYXNzZXJ0aW9uLCBpZHAsIHNjb3BlKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBuZXdJZEFzc2VydGlvbiA9IG5ldyBJZEFzc2VydGlvbihhc3NlcnRpb24sIGlkcCwgc2NvcGUpO1xuXG4gICAgX3RoaXMuaWRBc3NlcnRpb25MaXN0LnB1c2gobmV3SWRBc3NlcnRpb24pO1xuICB9XG5cbiAgLy9UT0RPOiBjb21wbGV0ZSB3aXRoIG1vcmUgdmVyaWZpY2F0aW9ucy4gVG8gYmUgbW92ZWQgdG8gSWRlbnRpdHk/XG5cbiAgX2lzVmFsaWQoaWRlbnRpdHkpIHtcbiAgICBpZiAoIWlkZW50aXR5Lmhhc093blByb3BlcnR5KCdhc3NlcnRpb24nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBzcGxpdGVkQXNzZXJ0aW9uID0gaWRlbnRpdHkuYXNzZXJ0aW9uLnNwbGl0KCcuJyk7XG4gICAgbGV0IGFzc2VydGlvblBhcnNlZDtcblxuICAgIC8vdmVyaWZ5IGlmIHRoZSB0b2tlbiBjb250YWlucyB0aGUgMyBjb21wb25lbnRzLCBvciBqdXN0IHRoZSBhc3NlcnRpb25cbiAgICB0cnkge1xuICAgICAgaWYgKHNwbGl0ZWRBc3NlcnRpb25bMV0pIHtcbiAgICAgICAgYXNzZXJ0aW9uUGFyc2VkID0gZGVjb2RlKHNwbGl0ZWRBc3NlcnRpb25bMV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0aW9uUGFyc2VkID0gZGVjb2RlKGlkZW50aXR5LmFzc2VydGlvbik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG5cbiAgICByZXR1cm4gdHJ1ZTtcblxuICB9XG5cbiAgX2lzVmFsaWRBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikge1xuXG4gICAgaWYgKCFhY2Nlc3NUb2tlbi5oYXNPd25Qcm9wZXJ0eSgnYWNjZXNzVG9rZW4nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghYWNjZXNzVG9rZW4uaGFzT3duUHJvcGVydHkoJ2RvbWFpbicpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCEoYWNjZXNzVG9rZW4uaGFzT3duUHJvcGVydHkoJ3Jlc291cmNlcycpICYmIEFycmF5LmlzQXJyYXkoYWNjZXNzVG9rZW4ucmVzb3VyY2VzKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cblxuICAgIGlmICghKGFjY2Vzc1Rva2VuLmhhc093blByb3BlcnR5KCdleHBpcmVzJykgJiYgTnVtYmVyLmlzSW50ZWdlcihhY2Nlc3NUb2tlbi5leHBpcmVzKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWFjY2Vzc1Rva2VuLmhhc093blByb3BlcnR5KCdpbnB1dCcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG5cbiAgfVxuXG4gIC8vVE9ETzogYWRkIGZ1bmN0aW9uIHRvIG9ubHkgc2V0IG9uZSBuZXcgaWRlbnRpdHkgdXNpbmcgdGhlIG5ldyBpbmRleGVkIHN0b3JhZ2UgbWFuYWdlclxuXG4gIF9zdG9yZSgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgY29uc3Qgc3RvcmUgPSBPYmplY3Qua2V5cyh0aGlzLl9pZGVudGl0aWVzKS5tYXAoKHVzZXJVUkwpID0+IHtcbiAgICAgICAgcmV0dXJuIF90aGlzLl9zdG9yYWdlTWFuYWdlci5zZXQodXNlclVSTCwgMCwgdGhpcy5faWRlbnRpdGllc1t1c2VyVVJMXSwgJ2lkZW50aXRpZXMnKTtcbiAgICAgIH0pO1xuXG4gICAgICBQcm9taXNlLmFsbChzdG9yZSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIHJlamVjdCgnT24gX3NlbmRSZXBvcnRlclNlc3Npb25LZXkgZnJvbSBtZXRob2Qgc3RvcmVJZGVudGl0eSBlcnJvcjogJyArIGVycik7XG4gICAgICB9KTtcblxuICAgIH0pO1xuICB9XG4gIF9zdG9yZUFjY2Vzc1Rva2VucygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgbGV0IGFjY2Vzc1Rva2VucyA9IGRlZXBDbG9uZShfdGhpcy5fYWNjZXNzVG9rZW5zKTtcblxuICAgICAgX3RoaXMuX3N0b3JhZ2VNYW5hZ2VyLnNldCgnYWNjZXNzVG9rZW5zJywgMCwgYWNjZXNzVG9rZW5zKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgcmVqZWN0KCdPbiBfc2VuZFJlcG9ydGVyU2Vzc2lvbktleSBmcm9tIG1ldGhvZCBzdG9yZUlkZW50aXR5IGVycm9yOiAnICsgZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxufVxuXG4vLyBtb3ZlIHRvIElkZW50aXR5IHNlcnZpY2UgZnJhbWV3b3JrP1xuXG5jbGFzcyBJZEFzc2VydGlvbiB7XG5cbiAgY29uc3RydWN0b3IoYXNzZXJ0aW9uLCBpZHAsIHVzZXJQcm9maWxlKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9hc3NlcnRpb24gPSBhc3NlcnRpb247XG4gICAgX3RoaXMuX2lkcCA9IGlkcDtcbiAgICBfdGhpcy5fdXNlclByb2ZpbGUgPSB1c2VyUHJvZmlsZTtcbiAgfVxuXG4gIGdldCBhc3NlcnRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Fzc2VydGlvbjtcbiAgfVxuXG4gIGdldCBpZHAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkcDtcbiAgfVxuXG4gIGdldCB1c2VyUHJvZmlsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlclByb2ZpbGU7XG4gIH1cblxufVxuXG5jbGFzcyBJZFZhbGlkYXRpb24ge1xuXG4gIGNvbnN0cnVjdG9yKGlkZW50aXR5LCBjb250ZW50cykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuaWRlbnRpdHkgPSBpZGVudGl0eTtcbiAgICBfdGhpcy5jb250ZW50cyA9IGNvbnRlbnRzO1xuICB9XG5cbiAgdmFsaWRhdGVzKGlkZW50aXR5LCBjb250ZW50cykge1xuICAgIC8vVE9ETyBpbXBsZW1lbnQgdGhlIGxvZ2ljXG5cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJZGVudGl0aWVzO1xuIiwiLy8gTG9nIFN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdJZGVudGl0eU1vZHVsZScpO1xuXG4vKipcbiogZmFrZSBjbGFzcyBmb3IgdGhlIGd1aSB0byBzZWxlY3QgdGhlIGlkZW50aXR5LFxuKiBUT0RPIHJlcGxhY2Ugd2l0aCB0aGUgcHJvcGVyIGlkZW50aXR5IEdVSVxuKlxuKi9cbmNsYXNzIEd1aUZha2Uge1xuXG4gIGNvbnN0cnVjdG9yKHVybCwgbWVzc2FnZUJ1cykge1xuICAgIGxvZy5sb2coJ0Zha2VHVUlfZGVwbG95ZWQnKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX3VybCA9IHVybDtcbiAgICBfdGhpcy5fd2FpdFRpbWUgPSAxMDAwMDtcbiAgICBfdGhpcy5fbWVzc2FnZUJ1cyA9IG1lc3NhZ2VCdXM7XG5cbiAgICBfdGhpcy5fbWVzc2FnZUJ1cy5hZGRMaXN0ZW5lcihfdGhpcy5fdXJsLCBtc2cgPT4ge1xuXG4gICAgICBpZiAobXNnLmhhc093blByb3BlcnR5KCd0eXBlJykgJiZcbiAgICAgICAgICBtc2cudHlwZSA9PT0gJ2NyZWF0ZScgJiZcbiAgICAgICAgICBtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSAmJlxuICAgICAgICAgIG1zZy5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdpZGVudGl0aWVzJykgJiZcbiAgICAgICAgICBtc2cuYm9keS52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnaWRwcycpKSB7XG5cbiAgICAgICAgbGV0IGlkZW50aXRpZXMgPSBtc2cuYm9keS52YWx1ZS5pZGVudGl0aWVzO1xuICAgICAgICBsZXQgaWRwcyA9IG1zZy5ib2R5LnZhbHVlLmlkcHM7XG5cbiAgICAgICAgbGV0IHZhbHVlO1xuXG4gICAgICAgIGlmIChpZGVudGl0aWVzWzBdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWx1ZSA9IHt0eXBlOiAnaWRlbnRpdHknLCB2YWx1ZTogaWRlbnRpdGllc1swXSwgY29kZTogMjAwfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IHt0eXBlOiAnaWRwJywgdmFsdWU6IGlkcHNbMl0uZG9tYWluLCBjb2RlOiAyMDB9O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlcGx5TXNnID0ge2lkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIHRvOiBtc2cuZnJvbSwgZnJvbTogbXNnLnRvLCBib2R5OiB2YWx1ZX07XG5cbiAgICAgICAgLy8gdG8gdGVzdCBvbiB0aGUgaWRlbnRpdHkgc2lkZSB0aGUgbGlzdGVuZXIgd2l0aG91dCB0aGUgdGltZW91dFxuICAgICAgICAvLyBjYW4gcmVwcmVzZW50IHRoZSB0aW1lIHRoZSB1c2VyIHRha2VzIHRvIGNob29zZSBhbmQgaWRlbnRpdHlcbiAgICAgICAgaWYgKG1zZy5ib2R5LnZhbHVlID09PSAnd2FpdCcpIHtcblxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xuICAgICAgICAgIH0sIF90aGlzLl93YWl0VGltZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cubG9nKCdJZ25vcmluZyBtZXNzYWdlcyBub3QgaW50ZW5kZWQgdG8gRmFrZUdVSS4nLCBtc2cpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgR3VpRmFrZTtcbiIsIi8vIExvZyBTeXN0ZW1cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignSWRlbnRpdHlNb2R1bGUnKTtcblxuaW1wb3J0IHsgc2Vjb25kc1NpbmNlRXBvY2gsIGRpdmlkZVVSTCwgcGFyc2VNZXNzYWdlVVJMLCBzdHJpbmdpZnksIGRlZXBDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vcnVudGltZS9ydW50aW1lQ29uZmlndXJhdGlvbic7XG5cbmltcG9ydCBJZGVudGl0aWVzIGZyb20gJy4vSWRlbnRpdGllcyc7XG5pbXBvcnQgR3VpRmFrZSBmcm9tICcuL0d1aUZha2UnO1xuXG4vKipcbipcbiogVGhlIElkZW50aXR5IE1vZHVsZSAoSWQgTW9kdWxlKSBpcyB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyB0aGVcbiogdXNlciBpZGVudGl0eSBhbmQgdGhlIGFzc29jaWF0aW9uIG9mIHRoaXMgaWRlbnRpdHkgd2l0aCB0aGUgSHlwZXJ0eSBpbnN0YW5jZXMsXG4qIGluIG9yZGVyIHRvIG1ha2UgSHlwZXJ0eSBpbnN0YW5jZXMgaWRlbnRpZmlhYmxlLiBUaGUgaWRlbnRpdHkgaW4gdGhlIHJlVEhJTksgcHJvamVjdFxuKiBpcyBub3QgZml4ZWQgdG8gYSB1bmlxdWUgSWRlbnRpdHkgU2VydmljZSBQcm92aWRlciwgYnV0IG9idGFpbmVkIHRocm91Z2ggc2V2ZXJhbFxuKiBkaWZmZXJlbnQgSWRlbnRpdHkgc291cmNlcy4gV2l0aCB0aGlzIGFwcHJvYWNoLCB0aGUgSWQgTW9kdWxlIHByb3ZpZGVzIHRvIHRoZSB1c2VyIHRoZVxuKiBvcHRpb24gdG8gY2hvb3NlIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBhdXRoZW50aWNhdGlvbi5cbiogVGhpcyBtb2R1bGUgd2lsbCB0aHVzIGFibGUgdG8gc3VwcG9ydCBtdWx0aXBsZSBJZGVudGl0eSBhY3F1aXNpdGlvbiBtZXRob2RzLFxuKiBzdWNoIGFzIE9wZW5JRCBjb25uZWN0IDEuMCwgS2VyYmVyb3MgU3lzdGVtLCBvciBhdXRoZW50aWNhdGlvbiB0aHJvdWdoIHNtYXJ0IGNhcmRzLlxuKiBGb3IgZXhhbXBsZSwgYSB1c2VyIHdpdGggYSBHb29nbGUgYWNjb3VudCBjYW4gdXNlIHRoZSBHb29nbGUgYXMgYW4gSWRlbnRpdHkgUHJvdmlkZXIgdG8gcHJvdmlkZSBJZGVudGl0eSBUb2tlbnMsXG4qICB3aGljaCBjYW4gYmUgdXNlZCBieSB0aGUgSWRlbnRpdHkgTW9kdWxlIHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgSHlwZXJ0eSBpbnN0YW5jZS5cbipcbiogVGhlIElkZW50aXR5IE1vZHVsZSB1c2VzIGEgbm9kZSBwYWNrYWdlLCB0aGUgSGVsbG9KUywgd2hpY2ggaXMgYSBjbGllbnQtc2lkZSBKYXZhU2NyaXB0IEFQSSBmb3IgYXV0aGVudGljYXRpb25cbiogdGhhdCBmYWNpbGl0YXRlcyB0aGUgcmVxdWVzdHMgZm9yIHRoZSBPcGVuSUQgY29ubmVjdCBwcm90b2NvbC4gVGhpcyBtZXRob2QgYWxsb3dzIGZvciBzb21lIGFic3RyYWN0aW9uXG4qIHdoZW4gbWFraW5nIHJlcXVlc3RzIGZvciBkaWZmZXJlbnQgSWRlbnRpdHkgUHJvdmlkZXJzLCBzdWNoIGFzIE9wZW5JRCBjb25uZWN0IHVzZWQgYnkgR29vZ2xlLCBGYWNlYm9vaywgTWljcm9zb2Z0LCBmb3IgZXhhbXBsZS5cbipcbiogV2hlbiBhIHJlcXVlc3QgZm9yIGEgdXNlciBpZGVudGl0eSBpcyBtYWRlIHVzaW5nIHRoZSBtZXRob2QgbG9naW5XaXRoUlAoaWRlbnRpZmllciwgc2NvcGUpLFxuKiB0aGlzIG1ldGhvZCB3aWxsIGFuYWx5c2UgdGhlIElkZW50aXR5IFByb3ZpZGVyIGNob3NlbiB0byBvYnRhaW4gYW4gaWRlbnRpdHkgYW5kIHdpbGwgdXNlIHRoZSBIZWxsb0pTIG5vZGUgcGFja2FnZVxuKiB3aXRoIHRoZSBzZWxlY3RlZCBJZGVudGl0eSBQcm92aWRlciBhbmQgaWRlbnRpdHkgc2NvcGUuIEFmdGVyIHRoZSBIZWxsb0pTIHJlcXVlc3QgZm9yIGFuIEFjY2VzcyBUb2tlblxuKiB0byB0aGUgSWRlbnRpdHkgUHJvdmlkZXJzLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIGF1dGhlbnRpY2F0ZSB0b3dhcmRzIHRoZSBJZGVudGl0eSBQcm92aWRlci5cbiogVXBvbiByZWNlaXZpbmcgdGhlIEFjY2VzcyBUb2tlbiwgdGhpcyB0b2tlbiBpcyB2YWxpZGF0ZWQgd2l0aCBhIFJFU1RmdWwgd2ViIHNlcnZpY2UgcmVxdWVzdCB0byBhbiBlbmRwb2ludFxuKiBvbiB0aGUgSWRlbnRpdHkgUHJvdmlkZXIgQXV0aG9yaXphdGlvbiBTZXJ2ZXIsIGFuZCBhZnRlciB0aGUgdmFsaWRhdGlvbiBpcyBkb25lLFxuKiBhbiBJRCB0b2tlbiBpcyBvYnRhaW5lZCB3aXRoIHRoZSBpbmZvcm1hdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNjb3BlIHJlcXVpcmVkLlxuKiBUaGlzIElEIHRva2VuIGlzIHRoZW4gcHJlc2VydmVkIGluIHRoaXMgbW9kdWxlIHRoYXQgY2FuIG9idGFpbmVkIHRocm91Z2ggdGhlIGdldElkZW50aXRpZXMoKVxuKiBhbmQgaXMgcGFzc2VkIGFzIHJldHVybiB2YWx1ZSBvZiB0aGUgbG9naW5XaXRoUlAgZnVuY3Rpb24uIFRoZSBtZXRob2RzIGdlbmVyYXRlQXNzZXJ0aW9uIGFuZCB2YWxpZGF0ZUFzc2VydGlvbiBoYXZlIG5vdCB5ZXQgYmVlbiBkZXZlbG9wZWQuXG4qXG4qL1xuY2xhc3MgSWRlbnRpdHlNb2R1bGUge1xuXG4gIC8qKlxuICAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIHRvIGluaXRpYWxpc2UgdGhlIElkZW50aXR5IE1vZHVsZSBpdCBkb2VzIG5vdCByZXF1aXJlIGFueSBpbnB1dC5cbiAgKi9cbiAgY29uc3RydWN0b3IocnVudGltZVVSTCwgcnVudGltZUNhcGFiaWxpdGllcywgc3RvcmFnZU1hbmFnZXIsIGRhdGFPYmplY3RzU3RvcmFnZSwgY3J5cHRvTWFuYWdlciwgcnVudGltZUNhdGFsb2d1ZSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIXJ1bnRpbWVVUkwpIHRocm93IG5ldyBFcnJvcigncnVudGltZVVSTCBpcyBtaXNzaW5nLicpO1xuICAgIGlmICghc3RvcmFnZU1hbmFnZXIpIHRocm93IG5ldyBFcnJvcignc3RvcmFnZU1hbmFnZXIgaXMgbWlzc2luZycpO1xuICAgIGlmICghY3J5cHRvTWFuYWdlcikgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG9NYW5hZ2VyIGlzIG1pc3NpbmcnKTtcbiAgICBpZiAoIXJ1bnRpbWVDYXRhbG9ndWUpIHRocm93IG5ldyBFcnJvcigncnVudGltZUNhdGFsb2d1ZSBpcyBtaXNzaW5nJyk7XG5cbiAgICBfdGhpcy5fcnVudGltZVVSTCA9IHJ1bnRpbWVVUkw7XG5cbiAgICBfdGhpcy5fcnVudGltZUNhdGFsb2d1ZSA9IHJ1bnRpbWVDYXRhbG9ndWU7XG5cbiAgICBfdGhpcy5kYXRhT2JqZWN0c1N0b3JhZ2UgPSBkYXRhT2JqZWN0c1N0b3JhZ2U7XG4gICAgX3RoaXMuX2lkbVVSTCA9IF90aGlzLl9ydW50aW1lVVJMICsgJy9pZG0nO1xuICAgIF90aGlzLl9ndWlVUkwgPSBfdGhpcy5fcnVudGltZVVSTCArICcvaWRlbnRpdHktZ3VpJztcbiAgICBfdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzID0gcnVudGltZUNhcGFiaWxpdGllcztcblxuICAgIF90aGlzLl9kb21haW4gPSBkaXZpZGVVUkwoX3RoaXMuX3J1bnRpbWVVUkwpLmRvbWFpbjtcblxuXG4gICAgLy90byBzdG9yZSBpdGVtcyB3aXRoIHRoaXMgZm9ybWF0OiB7aWRlbnRpdHk6IGlkZW50aXR5VVJMLCB0b2tlbjogdG9rZW5JRH1cbiAgICBfdGhpcy5faWRlbnRpdGllcyA9IG5ldyBJZGVudGl0aWVzKCdodW1hbicsIHN0b3JhZ2VNYW5hZ2VyKTtcblxuICAgIC8vIHRvIGJlIHJldmlld2VkOiB3YXRjaGluZ1lvdSBpZGVudGl0aWVzTGlzdCBvciBpZGVudGl0aWVzP1xuICAgIC8vICAgIF90aGlzLmlkZW50aXRpZXNMaXN0ID0gX3RoaXMud2F0Y2hpbmdZb3Uud2F0Y2goJ2lkZW50aXRpZXNMaXN0Jywge30sIHRydWUpO1xuICAgIF90aGlzLl9jcnlwdG8gPSBjcnlwdG9NYW5hZ2VyO1xuXG4gICAgLyogICAgX3RoaXMuZW1haWxzTGlzdCA9IFtdO1xuICAgIGxldCBuZXdJZGVudGl0eSA9IG5ldyBJZGVudGl0eSgnZ3VpZCcsICdIVU1BTicpO1xuICAgIF90aGlzLmlkZW50aXR5ID0gbmV3SWRlbnRpdHk7XG4gICAgX3RoaXMuY3VycmVudElkZW50aXR5O1xuICAgIF90aGlzLmlkZW50aXRpZXMuZGVmYXVsdElkZW50aXR5OyovXG5cbiAgICAvL3N0b3JlcyB0aGUgYXNzb2NpYXRpb24gb2YgdGhlIGRhdGFPYmplY3QgYW5kIHRoZSBIeXBlcnR5IHJlZ2lzdGVyZWQgd2l0aGluXG4gICAgX3RoaXMuZGF0YU9iamVjdHNJZGVudGl0eSA9IHt9OyAvLyBpcyB0aGlzIG5lZWRlZD9cblxuICAgIF90aGlzLl9saXN0T2ZJZHBzID0gW107XG5cbiAgICAvLyB2YXJpYWJsZSB0byBrbm93IGlmIHRoZSBHVUkgaXMgZGVwbG95ZWQgdG8gY2hvb3NlIHRoZSBpZGVudGl0eS4gaWYgdGhlIHJlYWwgR1VJIGlzIG5vdCBkZXBsb3llZCwgYSBmYWtlIGd1aSBpcyBkZXBsb3llZCBpbnN0ZWFkLlxuICAgIF90aGlzLmd1aURlcGxveWVkID0gZmFsc2U7XG5cbiAgfVxuXG4gIC8vKioqKioqKioqKioqKioqKioqKiBHRVQgQU5EIFNFVCBNRVRIT0RTICoqKioqKioqKioqKioqKioqKipcblxuICAvKipcbiAgKiByZXR1cm4gdGhlIG1lc3NhZ2VCdXMgaW4gdGhpcyBSZWdpc3RyeVxuICAqIEBwYXJhbSB7TWVzc2FnZUJ1c30gICAgICAgICAgIG1lc3NhZ2VCdXNcbiAgKi9cbiAgZ2V0IG1lc3NhZ2VCdXMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuX21lc3NhZ2VCdXM7XG4gIH1cblxuICAvKipcbiAgKiBTZXQgdGhlIG1lc3NhZ2VCdXMgaW4gdGhpcyBSZWdpc3RyeVxuICAqIEBwYXJhbSB7TWVzc2FnZUJ1c30gICAgICAgICAgIG1lc3NhZ2VCdXNcbiAgKi9cbiAgc2V0IG1lc3NhZ2VCdXMobWVzc2FnZUJ1cykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX21lc3NhZ2VCdXMgPSBtZXNzYWdlQnVzO1xuICAgIF90aGlzLmFkZEdVSUxpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICogcmV0dXJuIHRoZSBjb3JlRGlzY292ZXJ5IGNvbXBvbmVudFxuICAqIGRvIHdlIG5lZWQgdGhpcz8/XG4gICovXG4gIGdldCBjb3JlRGlzY292ZXJ5KCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9jb3JlRGlzY292ZXJ5O1xuICB9XG5cbiAgLyoqXG4gICogU2V0IHRoZSBjb3JlRGlzY292ZXJ5IGNvbXBvbmVudFxuICAqIEBwYXJhbSB7Y29yZURpc2NvdmVyeX0gY29yZURpc2NvdmVyeVxuICAqL1xuICBzZXQgY29yZURpc2NvdmVyeShjb3JlRGlzY292ZXJ5KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fY29yZURpc2NvdmVyeSA9IGNvcmVEaXNjb3Zlcnk7XG4gIH1cblxuICAvKipcbiAgKiByZXR1cm4gdGhlIHJlZ2lzdHJ5IGluIHRoaXMgaWRNb2R1bGVcbiAgKiBAcGFyYW0ge3JlZ2lzdHJ5fSAgICAgICAgICAgcmVnaXN0cnlcbiAgKi9cbiAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9yZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAqIFNldCB0aGUgcmVnaXN0cnkgaW4gdGhpcyBpZE1vZHVsZVxuICAqIEBwYXJhbSB7cmVnaXN0cnl9ICAgICByZWdcbiAgKi9cbiAgc2V0IHJlZ2lzdHJ5KHJlZ2lzdHJ5KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgfVxuXG5cbiAgLy8qKioqKioqKioqKioqKioqKioqIElERU5USVRZIFJFTEVBVEVEIE1FVEhPRFMgKioqKioqKioqKioqKioqKioqKlxuICAvKipcbiAgKiBnZXRzIGFsbCB0aGUgaW5mb3JtYXRpb24gZnJvbSBhIGdpdmVuIHVzZXJVUkxcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICB1c2VyVVJMICAgICB1c2VyIHVybFxuICAqIEByZXR1cm4ge0pTT059ICAgIGlkZW50aXR5ICAgIGlkZW50aXR5IGJ1bmRsZSBmcm9tIHRoZSB1c2VyVVJMXG4gICovXG4gIGdldElkZW50aXR5KHVzZXJVUkwpIHtcbiAgICByZXR1cm4gdGhpcy5pZGVudGl0aWVzLmdldElkZW50aXR5KHVzZXJVUkwpO1xuICB9XG5cbiAgLyoqXG4gICogRnVuY3Rpb24gdG8gc2V0IHRoZSBjdXJyZW50IElkZW50aXR5IHdpdGggYSBnaXZlbiBJZGVudGl0eVxuICAqIEBwYXJhbSB7SWRlbnRpdHl9ICAgICAgICBpZGVudGl0eSAgICAgICAgIGlkZW50aXR5XG4gICovXG5cbiAgLyogIHNldEN1cnJlbnRJZGVudGl0eShpZGVudGl0eSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuY3VycmVudElkZW50aXR5ID0gaWRlbnRpdHk7XG4gIH0qL1xuXG4gIC8qKlxuICAqIEZ1bmN0aW9uIHRvIHJldHVybiBhbGwgdGhlIGlkZW50aXRpZXMgcmVnaXN0ZXJlZCB3aXRoaW4gYSBzZXNzaW9uIGJ5IGEgdXNlci5cbiAgKiBUaGVzZSBpZGVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhbiBhcnJheSBjb250YWluaW5nIGEgSlNPTiBwYWNrYWdlIGZvciBlYWNoIHVzZXIgaWRlbnRpdHkuXG4gICogQHJldHVybiB7QXJyYXk8SWRlbnRpdGllcz59ICAgICAgICAgSWRlbnRpdGllc1xuICAqL1xuICBnZXQgaWRlbnRpdGllcygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5faWRlbnRpdGllcztcbiAgfVxuXG4gIHNldCBpZGVudGl0aWVzKGlkZW50aXRpZXMpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9pZGVudGl0aWVzID0gaWRlbnRpdGllcztcbiAgfVxuXG4gIGdldCBpZHBzKCkge1xuICAgIHJldHVybiB0aGlzLl9saXN0T2ZJZHBzO1xuICB9XG5cbiAgZ2V0SWRlbnRpdGllc1RvQ2hvb3NlKCkge1xuICAgIC8vICAgIGxldCBpZGVudGl0aWVzID0gX3RoaXMuaWRlbnRpdGllcy5pZGVudGlmaWVycztcblxuICAgIC8vIGxldCBpZHBzID0gW1xuICAgIC8vICAgeyBkb21haW46ICdnb29nbGUuY29tJywgdHlwZTogJ2lkVG9rZW4nfSxcbiAgICAvLyAgIHsgZG9tYWluOiAnbWljcm9zb2Z0LmNvbScsIHR5cGU6ICdpZFRva2VuJ30sXG4gICAgLy8gICB7IGRvbWFpbjogJ29yYW5nZS5mcicsIHR5cGU6ICdpZFRva2VuJ30sXG4gICAgLy8gICB7IGRvbWFpbjogJ3NsYWNrLmNvbScsIHR5cGU6ICdMZWdhY3knfVxuICAgIC8vIF07XG5cbiAgICAvLyB0b2RvOiByZXRyaWV2ZSBhdmFpbGFibGUgaWRwcyBmcm9tIHJ1bnRpbWUgY2F0YWxvZ3VlXG4gICAgLy8gdG9kbzogZW5hYmxlIG9hdXRoIGlkcHNcbiAgICAvLyBsZXQgaWRwcyA9IFtcbiAgICAvLyAgIHsgZG9tYWluOiAnZ29vZ2xlLmNvbScsIHR5cGU6ICdpZFRva2VuJyB9LFxuICAgIC8vICAgeyBkb21haW46ICdtaWNyb3NvZnQuY29tJywgdHlwZTogJ2lkVG9rZW4nIH0sXG4gICAgLy8gICB7IGRvbWFpbjogJ2ZhY2Vib29rLmNvbScsIHR5cGU6ICdpZFRva2VuJyB9LFxuICAgIC8vICAgeyBkb21haW46ICdzbGFjay5jb20nLCB0eXBlOiAnaWRUb2tlbicgfVxuICAgIC8vIF07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblxuICAgICAgY29uc3QgdXJsID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY2F0YWxvZ3VlVVJMcy5pZHBQcm94eS5wcmVmaXggKyB0aGlzLl9kb21haW4gKyBydW50aW1lQ29uZmlndXJhdGlvbi5jYXRhbG9ndWVVUkxzLmlkcFByb3h5LnN1ZmZpeDtcblxuICAgICAgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLnJ1bnRpbWVDYXBhYmlsaXRpZXMuaXNBdmFpbGFibGUoJ2Jyb3dzZXInKSxcbiAgICAgICAgdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzLmlzQXZhaWxhYmxlKCdub2RlJyldKVxuICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG5cbiAgICAgICAgICBjb25zdCBpc0Jyb3dzZXIgPSByZXN1bHRbMF07XG4gICAgICAgICAgY29uc3QgaXNOb2RlID0gcmVzdWx0WzFdO1xuXG4gICAgICAgICAgY29uc3QgY29uc3RyYWludHMgPSB7IGNvbnN0cmFpbnRzOiB7fSB9O1xuICAgICAgICAgIGNvbnN0cmFpbnRzLmNvbnN0cmFpbnRzLm5vZGUgPSBpc05vZGU7XG4gICAgICAgICAgY29uc3RyYWludHMuY29uc3RyYWludHMuYnJvd3NlciA9IGlzQnJvd3NlcjtcblxuICAgICAgICAgIHRoaXMuX3J1bnRpbWVDYXRhbG9ndWUuZ2V0VHlwZUxpc3QodXJsLCBjb25zdHJhaW50cykudGhlbigoaWRwcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGlzdE9mSWRwcyA9IGlkcHMubWFwKGtleSA9PiB7IHJldHVybiB7IGRvbWFpbjoga2V5LCB0eXBlOiAnaWRUb2tlbicgfTsgfSk7XG4gICAgICAgICAgICBsb2cuaW5mbygnW0lkZW50aXR5TW9kdWxlLmdldElkZW50aXR5QXNzZXJ0aW9uOmdldElkZW50aXRpZXNUb0Nob29zZV0nLCBpZHBzLCBsaXN0T2ZJZHBzKTtcbiAgICAgICAgICAgIHRoaXMuX2xpc3RPZklkcHMgPSBsaXN0T2ZJZHBzO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyBkZWZhdWx0SWRlbnRpdHk6IHRoaXMuaWRlbnRpdGllcy5kZWZhdWx0SWRlbnRpdHksIGlkZW50aXRpZXM6IHRoaXMuaWRlbnRpdGllcy5pZGVudGl0aWVzLCBpZHBzOiBsaXN0T2ZJZHBzIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAqIEZ1bmN0aW9uIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgSWRlbnRpdHkgd2l0aGluIGEgc2Vzc2lvblxuICAqIEByZXR1cm4ge0lkZW50aXR5fSAgICAgICAgaWRlbnRpdHkgICAgICAgICBpZGVudGl0eVxuICAqL1xuICAvKiAgZ2V0Q3VycmVudElkZW50aXR5KCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLmN1cnJlbnRJZGVudGl0eTtcbiAgfSovXG5cbiAgaW5pdChndWlkKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIF90aGlzLl9pZGVudGl0aWVzLmxvYWRJZGVudGl0aWVzKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgaWYgKCFndWlkKSB7XG4gICAgICAgICAgX3RoaXMuX2NyeXB0by5nZXRNeVB1YmxpY0tleSgpLnRoZW4oKGtleSkgPT4ge1xuICAgICAgICAgICAgbGV0IGhhc2ggPSBfdGhpcy5fY3J5cHRvLmNyeXB0by5fc2hhMjU2KHN0cmluZ2lmeShrZXkpKS50aGVuKChoYXNoKSA9PiB7XG5cbiAgICAgICAgICAgICAgZ3VpZCA9ICd1c2VyLWd1aWQ6Ly8nICsgaGFzaDtcbiAgICAgICAgICAgICAgX3RoaXMuaWRlbnRpdGllcy5ndWlkID0gZ3VpZDtcbiAgICAgICAgICAgICAgX3RoaXMuX2lkZW50aXRpZXMubG9hZEFjY2Vzc1Rva2VucygpLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0lkZW50aXR5TW9kdWxlXSBlcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX3RoaXMuaWRlbnRpdGllcy5ndWlkID0gZ3VpZDtcbiAgICAgICAgICBfdGhpcy5faWRlbnRpdGllcy5sb2FkQWNjZXNzVG9rZW5zKCkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgKiBGdW5jdGlvbiB0aGF0IGZldGNoIGFuIGlkZW50aXR5QXNzZXJ0aW9uIGZyb20gYSB1c2VyLlxuICAqXG4gICogQHJldHVybiB7SWRBc3NlcnRpb259ICAgICAgICAgICAgICBJZEFzc2VydGlvblxuICAqL1xuICBnZXRJZGVudGl0eUFzc2VydGlvbihpZGVudGl0eUJ1bmRsZSkge1xuICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5nZXRJZGVudGl0eUFzc2VydGlvbjppZGVudGl0eUJ1bmRsZV0nLCBpZGVudGl0eUJ1bmRsZSk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIC8vQ0hFQ0sgd2hldGhlciBpcyBicm93c2VyIGVudmlyb25tZW50IG9yIG5vZGVqc1xuICAgICAgLy9pZiBpdCBpcyBicm93c2VyLCB0aGVuIGNyZWF0ZSBhIGZha2UgaWRlbnRpdHlcblxuICAgICAgX3RoaXMucnVudGltZUNhcGFiaWxpdGllcy5pc0F2YWlsYWJsZSgnYnJvd3NlcicpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICBsb2cubG9nKCdydW50aW1lIGJyb3dzZXIgaWRlbnRpdHkgYWNxdWlzaXRpb24nLCByZXN1bHQpO1xuXG4gICAgICAgIGlmICghcmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgLy90b2RvOiBvbmx5IGlkcCBzaG91bGQgYmUgbWFuZGF0b3J5IHdoZW4gaWRlbnRpdHlCdW5kbGUgZXhpc3RzXG5cbiAgICAgICAgaWYgKGlkZW50aXR5QnVuZGxlICYmXG4gICAgICAgICAgaWRlbnRpdHlCdW5kbGUuaGFzT3duUHJvcGVydHkoJ2lkcCcpKSB7XG5cbiAgICAgICAgICBsZXQgaWRwID0gaWRlbnRpdHlCdW5kbGUuaWRwO1xuICAgICAgICAgIGxldCBvcmlnaW4gPSBpZGVudGl0eUJ1bmRsZS5oYXNPd25Qcm9wZXJ0eSgnb3JpZ2luJykgPyBpZGVudGl0eUJ1bmRsZS5vcmlnaW4gOiAnb3JpZ2luJztcbiAgICAgICAgICBsZXQgaWRIaW50ID0gaWRlbnRpdHlCdW5kbGUuaGFzT3duUHJvcGVydHkoJ2lkSGludCcpID8gaWRlbnRpdHlCdW5kbGUuaWRIaW50IDogJyc7XG5cbiAgICAgICAgICBpZiAoX3RoaXMuaWRlbnRpdGllcy5kZWZhdWx0SWRlbnRpdHkpIHtcbiAgICAgICAgICAgIGxldCBhc3NlcnRpb24gPSBfdGhpcy5pZGVudGl0aWVzLmRlZmF1bHRJZGVudGl0eTtcblxuICAgICAgICAgICAgaWYgKGFzc2VydGlvbi5leHBpcmVzID4gc2Vjb25kc1NpbmNlRXBvY2goKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhc3NlcnRpb24pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhc3NlcnRpb24uaGFzT3duUHJvcGVydHkoJ3JlZnJlc2gnKSkge1xuICAgICAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHkuSWRlbnRpdHlNb2R1bGUuZ2V0SWRlbnRpdHlBc3NlcnRpb25dIHJlZnJlc2hpbmcgYXNzZXJ0aW9uOiAnLCBhc3NlcnRpb24pO1xuXG4gICAgICAgICAgICAgIF90aGlzLl9yZWZyZXNoSWRBc3NlcnRpb24oKS50aGVuKChuZXdBc3NlcnRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGUuZ2V0SWRlbnRpdHlBc3NlcnRpb25dIHJlZnJlc2hlZCBhc3NlcnRpb24uJywgbmV3QXNzZXJ0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXdBc3NlcnRpb24pO1xuICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoJ1tJZGVudGl0eU1vZHVsZS5nZXRJZGVudGl0eUFzc2VydGlvbl0gZXJyb3Igb24gcmVmcmVzSWRBc3NlcnRpb246ICcsIGVycm9yLCAnIEFza2luZyBmb3IgYSBuZXcgSWRBc3NlcnRpb24uJylcbiAgICAgICAgICAgICAgICBfdGhpcy5fZ2V0SWRBc3NlcnRpb25Gb3JEb21haW4ob3JpZ2luLCBpZHAsIGlkSGludCkudGhlbigoYXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKGFzc2VydGlvbik7XG4gICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3RoaXMuX2dldElkQXNzZXJ0aW9uRm9yRG9tYWluKG9yaWdpbiwgaWRwLCBpZEhpbnQpLnRoZW4oKGFzc2VydGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoYXNzZXJ0aW9uKTtcbiAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLl9nZXRJZEFzc2VydGlvbkZvckRvbWFpbihvcmlnaW4sIGlkcCwgaWRIaW50KS50aGVuKChhc3NlcnRpb24pID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShhc3NlcnRpb24pO1xuICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChfdGhpcy5pZGVudGl0aWVzLmRlZmF1bHRJZGVudGl0eSkge1xuICAgICAgICAgIGxldCBhc3NlcnRpb24gPSBfdGhpcy5pZGVudGl0aWVzLmRlZmF1bHRJZGVudGl0eTtcblxuICAgICAgICAgIGlmIChhc3NlcnRpb24uZXhwaXJlcyA+IHNlY29uZHNTaW5jZUVwb2NoKCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGFzc2VydGlvbik7XG4gICAgICAgICAgfSBlbHNlIGlmIChhc3NlcnRpb24uaGFzT3duUHJvcGVydHkoJ3JlZnJlc2gnKSkge1xuICAgICAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5LklkZW50aXR5TW9kdWxlLmdldFZhbGlkVG9rZW5dIHJlZnJlc2hpbmcgYXNzZXJ0aW9uOiAnLCBhc3NlcnRpb24pO1xuXG4gICAgICAgICAgICBfdGhpcy5fcmVmcmVzaElkQXNzZXJ0aW9uKGFzc2VydGlvbikudGhlbigobmV3QXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5nZXRJZGVudGl0eUFzc2VydGlvbl0gcmVmcmVzaGVkIGFzc2VydGlvbi4nLCBuZXdBc3NlcnRpb24pO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXdBc3NlcnRpb24pO1xuXG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgbG9nLmVycm9yKCdbSWRlbnRpdHlNb2R1bGUuZ2V0SWRlbnRpdHlBc3NlcnRpb25dIGVycm9yIG9uIHJlZnJlc0lkQXNzZXJ0aW9uOiAnLCBlcnJvciwgJyBBc2tpbmcgZm9yIGEgbmV3IElkQXNzZXJ0aW9uLicpXG5cbiAgICAgICAgICAgICAgX3RoaXMuc2VsZWN0SWRlbnRpdHlGcm9tR1VJKCkudGhlbigoYXNzZXJ0aW9uKSA9PiB7XG5cbiAgICAgICAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGVdIElkZW50aXR5IHNlbGVjdGVkIGZyb20gR1VJLicpO1xuXG4gICAgICAgICAgICAgICAgX3RoaXMuaWRlbnRpdGllcy5kZWZhdWx0SWRlbnRpdHkgPSBhc3NlcnRpb24udXNlclByb2ZpbGUudXNlclVSTDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhc3NlcnRpb24pO1xuXG4gICAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5zZWxlY3RJZGVudGl0eUZyb21HVUkoKS50aGVuKChhc3NlcnRpb24pID0+IHtcblxuICAgICAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGVdIElkZW50aXR5IHNlbGVjdGVkIGZyb20gR1VJLicpO1xuXG4gICAgICAgICAgICAgIF90aGlzLmlkZW50aXRpZXMuZGVmYXVsdElkZW50aXR5ID0gYXNzZXJ0aW9uLnVzZXJQcm9maWxlLnVzZXJVUkw7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGFzc2VydGlvbik7XG5cbiAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzLnNlbGVjdElkZW50aXR5RnJvbUdVSSgpLnRoZW4oKGFzc2VydGlvbikgPT4ge1xuXG4gICAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGVdIElkZW50aXR5IHNlbGVjdGVkIGZyb20gR1VJLicpO1xuXG4gICAgICAgICAgICBfdGhpcy5pZGVudGl0aWVzLmRlZmF1bHRJZGVudGl0eSA9IGFzc2VydGlvbi51c2VyUHJvZmlsZS51c2VyVVJMO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXNzZXJ0aW9uKTtcblxuICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9XG4gICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGxvZy5lcnJvcignRXJyb3Igb24gaWRlbnRpdHkgYWNxdWlzaXRpb24gJywgZXJyb3IpO1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzLmlzQXZhaWxhYmxlKCdub2RlJykudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIGxvZy5sb2coJ25vZGUgaWRlbnRpdHkgYWNxdWlzaXRpb24nLCByZXN1bHQpO1xuXG4gICAgICAgIGlmICghcmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgaWYgKF90aGlzLmlkZW50aXRpZXMuY3VycmVudElkZW50aXR5KSB7XG4gICAgICAgICAgLy9UT0RPIHZlcmlmeSB3aGV0aGVyIHRoZSB0b2tlbiBpcyBzdGlsbCB2YWxpZCBvciBub3QuXG4gICAgICAgICAgLy8gc2hvdWxkIGJlIG5lZWRlZCB0byBtYWtlIGZ1cnRoZXIgcmVxdWVzdHMsIHRvIG9idGFpbiBhIHZhbGlkIHRva2VuXG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoX3RoaXMuaWRlbnRpdGllcy5jdXJyZW50SWRlbnRpdHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy5sb2coJ2dldElkZW50aXR5QXNzZXJ0aW9uIGZvciBub2RlanMnKTtcblxuICAgICAgICAgIGxldCBpZHAgPSB7IHR5cGU6ICdpZHAnLCB2YWx1ZTogJ25vZGVqcy1pZHAnLCBjb2RlOiAyMDAsIGF1dGg6IGZhbHNlIH07XG4gICAgICAgICAgX3RoaXMuY2FsbE5vZGVKc0dlbmVyYXRlTWV0aG9kcyhpZHAudmFsdWUsICdvcmlnaW4nKS50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBsb2cuZXJyb3IoJ0Vycm9yIG9uIGlkZW50aXR5IGFjcXVpc2l0aW9uICcsIGVycm9yKTtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX2dldElkQXNzZXJ0aW9uRm9yRG9tYWluKG9yaWdpbiwgaWRwLCBpZEhpbnQpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX3RoaXMuc2VsZWN0SWRlbnRpdHlGb3JIeXBlcnR5KG9yaWdpbiwgaWRwLCBpZEhpbnQpLnRoZW4oKGFzc2VydGlvbikgPT4ge1xuICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGUuX2dldElkQXNzZXJ0aW9uRm9yRG9tYWluXSBJZGVudGl0eSBzZWxlY3RlZCBieSBoeXBlcnR5LicpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShhc3NlcnRpb24pO1xuICAgICAgfSwgKGVycikgPT4geyAvLyBpZiBpdCBnb3QgYW4gZXJyb3IgdGhlbiBqdXN0IHNlbGVjdCBpZGVudGl0eSBmcm9tIEdVSVxuICAgICAgICAvLyBsb2cuZXJyb3IoJ1tJZGVudGl0eU1vZHVsZV0gQ291bGQgbm90IHNlbGVjdCBpZGVudGl0eSBmcm9tIGh5cGVydHkuJyk7XG5cbiAgICAgICAgX3RoaXMuc2VsZWN0SWRlbnRpdHlGcm9tR1VJKCkudGhlbigobmV3QXNzZXJ0aW9uKSA9PiB7XG4gICAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlLl9nZXRJZEFzc2VydGlvbkZvckRvbWFpbl0gSWRlbnRpdHkgc2VsZWN0ZWQgYnkgaHlwZXJ0eS4nKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXdBc3NlcnRpb24pO1xuICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgfVxuXG4gIF9yZWZyZXNoSWRBc3NlcnRpb24oYXNzZXJ0aW9uKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBfdGhpcy5zZW5kUmVmcmVzaE1lc3NhZ2UoYXNzZXJ0aW9uKS50aGVuKChuZXdBc3NlcnRpb24pID0+IHtcbiAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5LklkZW50aXR5TW9kdWxlLmdldFZhbGlkVG9rZW5dIHJlZnJlc2hlZCBhc3NlcnRpb246ICcsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIF90aGlzLmlkZW50aXRpZXMudXBkYXRlQXNzZXJ0aW9uKG5ld0Fzc2VydGlvbikudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShuZXdBc3NlcnRpb24pO1xuICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgbG9nLmVycm9yKCdbSWRlbnRpdHlNb2R1bGUuZ2V0VmFsaWRUb2tlbl0gZXJyb3IgdXBkYXRpbmcgdGhlIGFzc2VydGlvbiAnLCBlcnIpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgbG9nLmVycm9yKCdbSWRlbnRpdHlNb2R1bGUuZ2V0VmFsaWRUb2tlbl0gZXJyb3IgcmVmcmVzaGluZyB0aGUgYXNzZXJ0aW9uICcsIGVycik7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG5cbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICogRnVuY3Rpb24gdG8gcmV0dXJuIGFsbCB0aGUgdXNlcnMgVVJMcyByZWdpc3RlcmVkIHdpdGhpbiBhIHNlc3Npb25cbiAgKiBUaGVzZSB1c2VycyBVUkxzIGFyZSByZXR1cm5lZCBpbiBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59ICAgICAgICAgdXNlcnNcbiAgKi9cbiAgZ2V0VXNlcnNJRHMoKSB7XG4gICAgLyogIGxvZy5sb2coJ1tnZXRVc2Vyc0lEczplbWFpbEZvcm1hdF0nLCBlbWFpbEZvcm1hdCk7XG4gICAgICBsb2cubG9nKCdnZXRVc2Vyc0lEczplbWFpbEZvcm1hdCcsIGVtYWlsRm9ybWF0KTtcbiAgICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgICBsZXQgdXNlcnMgPSBbXTsqL1xuXG4gICAgLy9pZiByZXF1ZXN0IGNvbWVzIHdpdGggdGhlIGVtYWlsRm9ybWF0IG9wdGlvbiwgdGhlbiBjb252ZXJ0IHVybCB0byBlbWFpbCBmb3JtYXRcbiAgICAvKiAgICBsZXQgY29udmVydGVyID0gKGVtYWlsRm9ybWF0KSA/IGdldFVzZXJFbWFpbEZyb21VUkwgOiAodmFsdWUpID0+IHsgcmV0dXJuIHZhbHVlOyB9O1xuXG4gICAgZm9yIChsZXQgaW5kZXggaW4gX3RoaXMuaWRlbnRpdGllcykge1xuICAgICAgbGV0IGlkZW50aXR5ID0gX3RoaXMuaWRlbnRpdGllc1tpbmRleF07XG4gICAgICB1c2Vycy5wdXNoKGNvbnZlcnRlcihpZGVudGl0eS5pZGVudGl0eSkpO1xuICAgIH0qL1xuXG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdGllcy5pZGVudGlmaWVycztcbiAgfVxuXG4gIC8qKlxuICAqIEZ1bmN0aW9uIHRvIHJlbW92ZSBhbiBpZGVudGl0eVxuICAqIEBwYXJhbSB7U3RyaW5nfSAgICB1c2VyVVJMICAgICAgdXNlclVSTFxuICAqIEByZXR1cm4ge1Byb21pc2V9XG4gICovXG5cbiAgZGVsZXRlSWRlbnRpdHkodXNlclVSTCkge1xuXG4gICAgcmV0dXJuIHRoaXMuaWRlbnRpdGllcy5yZW1vdmVJZGVudGl0eSh1c2VyVVJMKTtcblxuICB9XG5cbiAgLyoqXG4gICogRnVuY3Rpb24gdG8gdW5yZWdpc3RlciBhbiBpZGVudGl0eSBmcm9tIHRoZSBlbWFpbHNMaXN0IGFycmF5IGFuZCBub3Qgc2hvdyBpbiB0byB0aGUgR1VJXG4gICogQHBhcmFtIHtTdHJpbmd9ICAgIGVtYWlsICAgICAgZW1haWxcbiAgKi9cbiAgLyogIHVucmVnaXN0ZXJJZGVudGl0eShlbWFpbCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBmb3IgKGxldCBlIGluIF90aGlzLmVtYWlsc0xpc3QpIHtcbiAgICAgIGlmIChfdGhpcy5lbWFpbHNMaXN0W2VdID09PSBlbWFpbCkge1xuICAgICAgICBfdGhpcy5lbWFpbHNMaXN0LnNwbGljZShlLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0qL1xuXG4gIC8vIHRvIGJlIHVzZWQgd2hlbiBydW50aW1lIGlzIG5vdCBleGVjdXRlZCBpbiBhIHNhbmRib3hcblxuICBsaXN0ZW5TaG93QWRtaW4oY2FsbGJhY2spIHtcbiAgICB0aGlzLl9zaG93QWRtaW4gPSBjYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAqIEZ1bmN0aW9uIHRoYXQgc2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBHVUkgdXNpbmcgbWVzc2FnZXMuIFNlbmRzIGFsbCBpZGVudGl0aWVzIHJlZ2lzdGVyZWQgYW5kXG4gICogdGhlIElkcHMgc3VwcG9ydGVkLCBhbmQgcmV0dXJuIHRoZSBpZGVudGl0eS9pZHAgcmVjZWl2ZWQgYnkgdGhlIEdVSVxuICAqIEBwYXJhbSB7QXJyYXk8aWRlbnRpdHk+fSAgaWRlbnRpdGllcyAgICAgIGxpc3Qgb2YgaWRlbnRpdGlpZXNcbiAgKiBAcGFyYW0ge0FycmF5PFN0cmluZz59ICAgIGlkcHMgICAgICAgICAgICBsaXN0IG9mIGlkcHMgdG8gYXV0aGVudGljYXRlXG4gICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgICByZXR1cm5zIGEgY2hvc2VuIGlkZW50aXR5IG9yIGlkcFxuICAqL1xuICByZXF1ZXN0SWRlbnRpdHlUb0dVSShpZGVudGl0aWVzLCBpZHBzKSB7XG4gICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlLnJlcXVlc3RJZGVudGl0eVRvR1VJOmlkZW50aXRpZXNdJywgaWRlbnRpdGllcyk7XG4gICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlLnJlcXVlc3RJZGVudGl0eVRvR1VJOmlkcHNdJywgaWRwcyk7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIC8vY29uZGl0aW9uIHRvIGNoZWNrIGlmIHRoZSByZWFsIEdVSSBpcyBkZXBsb3llZC4gSWYgbm90LCBkZXBsb3lzIGEgZmFrZSBndWlcbiAgICAgIGlmIChfdGhpcy5ndWlEZXBsb3llZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgbGV0IGd1aUZha2VVUkwgPSBfdGhpcy5fZ3VpVVJMO1xuICAgICAgICBsZXQgZ3VpRmFrZSA9IG5ldyBHdWlGYWtlKGd1aUZha2VVUkwsIF90aGlzLl9tZXNzYWdlQnVzKTtcbiAgICAgICAgX3RoaXMuZ3VpRmFrZSA9IGd1aUZha2U7XG4gICAgICAgIF90aGlzLmd1aURlcGxveWVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6ICdjcmVhdGUnLCB0bzogX3RoaXMuX2d1aVVSTCwgZnJvbTogX3RoaXMuX2lkbVVSTCxcbiAgICAgICAgYm9keTogeyB2YWx1ZTogeyBpZGVudGl0aWVzOiBpZGVudGl0aWVzLCBpZHBzOiBpZHBzIH0gfVxuICAgICAgfTtcblxuICAgICAgbGV0IGNhbGxiYWNrID0gbXNnID0+IHtcbiAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcihfdGhpcy5faWRtVVJMLCBtc2cuaWQpO1xuXG5cbiAgICAgICAgLy8gdG9kbzogdG8gcmV0dXJuIHRoZSB1c2VyIFVSTCBhbmQgbm90IHRoZSBlbWFpbCBvciBpZGVudGlmaWVyXG5cbiAgICAgICAgaWYgKG1zZy5ib2R5LmNvZGUgPT09IDIwMCkge1xuICAgICAgICAgIGxldCBzZWxlY3RlZElkZW50aXR5ID0gbXNnLmJvZHk7XG5cbiAgICAgICAgICBsb2cubG9nKCdzZWxlY3RlZElkZW50aXR5OiAnLCBzZWxlY3RlZElkZW50aXR5LnZhbHVlKTtcbiAgICAgICAgICByZXNvbHZlKHNlbGVjdGVkSWRlbnRpdHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdCgnZXJyb3Igb24gcmVxdWVzdGluZyBhbiBpZGVudGl0eSB0byB0aGUgR1VJJyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vcG9zdE1lc3NhZ2Ugd2l0aCBjYWxsYmFjayBidXQgd2l0aG91dCB0aW1lb3V0XG4gICAgICB0cnkge1xuICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCBjYWxsYmFjaywgZmFsc2UpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlamVjdCgnSW4gbWV0aG9kIGNhbGxJZGVudGl0eU1vZHVsZUZ1bmMgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2FsbE5vZGVKc0dlbmVyYXRlTWV0aG9kcyhpZHAsIG9yaWdpbikge1xuICAgIGxvZy5sb2coJ1tjYWxsTm9kZUpzR2VuZXJhdGVNZXRob2RzOmlkcF0nLCBpZHApO1xuICAgIGxvZy5sb2coJ1tjYWxsTm9kZUpzR2VuZXJhdGVNZXRob2RzOm9yaWdpbl0nLCBvcmlnaW4pO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgIGxldCBwdWJsaWNLZXk7XG5cbiAgICAgIC8vbGV0IGtleVBhaXIgPSBub2RlSlNLZXlQYWlyUG9wdWxhdGU7XG5cbiAgICAgIC8vZ2VuZXJhdGVzIHRoZSBSU0Ega2V5IHBhaXJcbiAgICAgIF90aGlzLl9jcnlwdG8uZ2V0TXlQdWJsaWNLZXkoKS50aGVuKGZ1bmN0aW9uIChrZXkpIHtcblxuICAgICAgICBsb2cubG9nKCdbY2FsbE5vZGVKc0dlbmVyYXRlTWV0aG9kczprZXldJywga2V5KTtcblxuICAgICAgICBwdWJsaWNLZXkgPSBzdHJpbmdpZnkoa2V5KTtcblxuICAgICAgICBsb2cubG9nKCdbY2FsbE5vZGVKc0dlbmVyYXRlTWV0aG9kc10gTk9fVVJMJyk7XG5cbiAgICAgICAgcmV0dXJuIF90aGlzLmdlbmVyYXRlQXNzZXJ0aW9uKHB1YmxpY0tleSwgb3JpZ2luLCAndXJsJywgaWRwKTtcblxuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KCdFcnJvciBvbiBvYnRhaW5pbmcgSWRlbnRpdHknKTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBsb2cubG9nKGVycik7XG4gICAgICAgIHJlamVjdChlcnIpO1xuXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNhbGxHZW5lcmF0ZU1ldGhvZHMoaWRwLCBvcmlnaW4pIHtcbiAgICBsb2cubG9nKCdbY2FsbEdlbmVyYXRlTWV0aG9kczppZHBdJywgaWRwKTtcbiAgICBsb2cubG9nKCdbY2FsbEdlbmVyYXRlTWV0aG9kczpvcmlnaW5dJywgb3JpZ2luKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgbGV0IHB1YmxpY0tleTtcblxuICAgICAgLy9nZW5lcmF0ZXMgdGhlIFJTQSBrZXkgcGFpclxuICAgICAgX3RoaXMuX2NyeXB0by5nZXRNeVB1YmxpY0tleSgpLnRoZW4oZnVuY3Rpb24gKGtleSkge1xuXG4gICAgICAgIGxvZy5sb2coJ1tjYWxsR2VuZXJhdGVNZXRob2RzOmtleV0nLCBrZXkpO1xuXG4gICAgICAgIHB1YmxpY0tleSA9IHN0cmluZ2lmeShrZXkpO1xuXG4gICAgICAgIC8vICAgICAgICB1c2Vya2V5UGFpciA9IGtleVBhaXI7XG4gICAgICAgIGxvZy5sb2coJ2dlbmVyYXRlQXNzZXJ0aW9uOm5vX2hpbnQnKTtcbiAgICAgICAgcmV0dXJuIF90aGlzLmdlbmVyYXRlQXNzZXJ0aW9uKHB1YmxpY0tleSwgb3JpZ2luLCAnJywgaWRwKTtcblxuICAgICAgfSkudGhlbihmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIF90aGlzLm15SGludCA9IHVybDtcbiAgICAgICAgbG9nLmxvZygnZ2VuZXJhdGVBc3NlcnRpb246aGludCcpO1xuICAgICAgICByZXR1cm4gX3RoaXMuZ2VuZXJhdGVBc3NlcnRpb24ocHVibGljS2V5LCBvcmlnaW4sIHVybCwgaWRwKTtcblxuICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KCdFcnJvciBvbiBvYnRhaW5pbmcgSWRlbnRpdHknKTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBsb2cuZXJyb3IoZXJyKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgbG9naW5TZWxlY3RlZElkZW50aXR5KHB1YmxpY0tleSwgb3JpZ2luLCBpZHAsIGxvZ2luVXJsKSB7XG4gICAgbG9nLmxvZygnW2xvZ2luU2VsZWN0ZWRJZGVudGl0eTpwdWJsaWNLZXldJywgcHVibGljS2V5KTtcbiAgICBsb2cubG9nKCdbbG9naW5TZWxlY3RlZElkZW50aXR5Om9yaWdpbl0nLCBvcmlnaW4pO1xuICAgIGxvZy5sb2coJ1tsb2dpblNlbGVjdGVkSWRlbnRpdHk6aWRwXScsIGlkcCk7XG5cbiAgICAvLyAgICBsb2cubG9nKCdbbG9naW5TZWxlY3RlZElkZW50aXR5OmtleVBhaXJdJywga2V5UGFpcik7XG4gICAgbG9nLmxvZygnW2xvZ2luU2VsZWN0ZWRJZGVudGl0eTpsb2dpblVybF0nLCBsb2dpblVybCk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGVdIG9wZW5Qb3B1cCcpO1xuICAgICAgX3RoaXMuY2FsbElkZW50aXR5TW9kdWxlRnVuYygnb3BlblBvcHVwJywgeyB1cmxyZWNlaXZlZDogbG9naW5VcmwgfSkudGhlbigoaWRDb2RlKSA9PiB7XG4gICAgICAgIHJldHVybiBpZENvZGU7XG4gICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGxvZy5lcnJvcignRXJyb3Igd2hpbGUgbG9nZ2luZyBpbiBmb3IgdGhlIHNlbGVjdGVkIGlkZW50aXR5LicpO1xuICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICB9KS50aGVuKChpZENvZGUpID0+IHtcbiAgICAgICAgX3RoaXMuc2VuZEdlbmVyYXRlTWVzc2FnZShwdWJsaWNLZXksIG9yaWdpbiwgaWRDb2RlLCBpZHApLnRoZW4oKG5ld1Jlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKG5ld1Jlc3BvbnNlLmhhc093blByb3BlcnR5KCdhc3NlcnRpb24nKSkge1xuICAgICAgICAgICAgX3RoaXMuaWRlbnRpdGllcy5hZGRBc3NlcnRpb24obmV3UmVzcG9uc2UpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgnTG9naW4gd2FzIHN1Y2Nlc3NmdWxsJyk7XG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ0xvZ2luIGhhcyBmYWlsZWQ6JyArIGVycik7IH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0Vycm9yIHdoaWxlIGxvZ2dpbmcgaW4gZm9yIHRoZSBzZWxlY3RlZCBpZGVudGl0eS4nKTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGFzc2VydGlvbiBmb3Igc2VsZWN0ZWQgaWRlbnRpdHkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIGxvZ2luU2VsZWN0ZWRJZGVudGl0eSBmcm9tIG1ldGhvZCBzZW5kR2VuZXJhdGVNZXNzYWdlIGVycm9yOiAgJyArIGVycik7IH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG4gIHNlbGVjdElkZW50aXR5Rm9ySHlwZXJ0eShvcmlnaW4sIGlkcCwgaWRIaW50KSB7XG4gICAgbG9nLmxvZygnW3NlbGVjdElkZW50aXR5Rm9ySHlwZXJ0eTpvcmlnaW5dJywgb3JpZ2luKTtcbiAgICBsb2cubG9nKCdbc2VsZWN0SWRlbnRpdHlGb3JIeXBlcnR5OmlkcF0nLCBpZHApO1xuICAgIGxvZy5sb2coJ1tzZWxlY3RJZGVudGl0eUZvckh5cGVydHk6aWRIaW50XScsIGlkSGludCk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIC8vZ2VuZXJhdGVzIHRoZSBSU0Ega2V5IHBhaXJcbiAgICAgIF90aGlzLl9jcnlwdG8uZ2V0TXlQdWJsaWNLZXkoKS50aGVuKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgbGV0IHB1YmxpY0tleSA9IHN0cmluZ2lmeShrZXkpO1xuXG4gICAgICAgIF90aGlzLnNlbmRHZW5lcmF0ZU1lc3NhZ2UocHVibGljS2V5LCBvcmlnaW4sIGlkSGludCwgaWRwKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5oYXNPd25Qcm9wZXJ0eSgnYXNzZXJ0aW9uJykpIHsgLy8gaWRlbnRpdHkgd2FzIGxvZ2dlZCBpbiwganVzdCBzYXZlIGl0XG4gICAgICAgICAgICBfdGhpcy5pZGVudGl0aWVzLmFkZEFzc2VydGlvbihyZXNwb25zZSkudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmhhc093blByb3BlcnR5KCdsb2dpblVybCcpKSB7IC8vIGlkZW50aXR5IHdhcyBub3QgbG9nZ2VkIGluXG4gICAgICAgICAgICBfdGhpcy5sb2dpblNlbGVjdGVkSWRlbnRpdHkocHVibGljS2V5LCBvcmlnaW4sIGlkcCwgcmVzcG9uc2UubG9naW5VcmwpLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHsgLy8geW91IHNob3VsZCBuZXZlciBnZXQgaGVyZSwgaWYgeW91IGRvIHRoZW4gdGhlIElkUCBQcm94eSBpcyBub3Qgd2VsbCBpbXBsZW1lbnRlZFxuICAgICAgICAgICAgLy8gbG9nLmVycm9yKCdHZW5lcmF0ZUFzc2VydGlvbiByZXR1cm5lZCBpbnZhbGlkIHJlc3BvbnNlLicpO1xuICAgICAgICAgICAgbG9nLmxvZygnUHJvY2VlZGluZyBieSBsb2dnaW5nIGluLicpO1xuICAgICAgICAgICAgX3RoaXMuY2FsbEdlbmVyYXRlTWV0aG9kcyhpZHAsIG9yaWdpbikudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7IHJlamVjdCgnT24gc2VsZWN0SWRlbnRpdHlGb3JIeXBlcnR5IGZyb20gbWV0aG9kIHNlbmRHZW5lcmF0ZU1lc3NhZ2UgZXJyb3I6ICAnICsgZXJyKTsgfSk7XG4gICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIHNlbGVjdElkZW50aXR5Rm9ySHlwZXJ0eSBmcm9tIG1ldGhvZCBnZW5lcmF0ZVJTQUtleVBhaXIgZXJyb3I6ICAnICsgZXJyKTsgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RJZGVudGl0eUZyb21HVUkob3JpZ2luKSB7XG4gICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlLnNlbGVjdElkZW50aXR5RnJvbUdVSTpvcmlnaW5dJywgb3JpZ2luKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgdGhpcy5nZXRJZGVudGl0aWVzVG9DaG9vc2UoKS50aGVuKChpZGVudGl0aWVzSW5mbykgPT4ge1xuICAgICAgICByZXR1cm4gX3RoaXMucmVxdWVzdElkZW50aXR5VG9HVUkoaWRlbnRpdGllc0luZm8uaWRlbnRpdGllcywgaWRlbnRpdGllc0luZm8uaWRwcyk7XG4gICAgICB9KS50aGVuKHZhbHVlID0+IHtcblxuICAgICAgICBpZiAodmFsdWUudHlwZSA9PT0gJ2lkZW50aXR5Jykge1xuXG4gICAgICAgICAgLy8gIGxldCBjaG9zZW5JRCA9IGdldFVzZXJVUkxGcm9tRW1haWwodmFsdWUudmFsdWUpO1xuICAgICAgICAgIC8vIGhhY2sgd2hpbGUgdGhlIHVzZXIgdXJsIGlzIG5vdCByZXR1cm5lZCBmcm9tIHJlcXVlc3RJZGVudGl0eVRvR1VJO1xuXG4gICAgICAgICAgLyogICAgICAgICAgbGV0IGNob3NlbklEID0gJ3VzZXI6Ly8nICsgX3RoaXMuaWRlbnRpdGllcy5jdXJyZW50SWRlbnRpdHkuaWRwLmRvbWFpbiArICcvJyArIHZhbHVlLnZhbHVlO1xuXG4gICAgICAgICAgX3RoaXMuaWRlbnRpdGllcy5kZWZhdWx0SWRlbnRpdHkgPSBfdGhpcy5pZGVudGl0aWVzLmN1cnJlbnRJZGVudGl0eTsqL1xuXG4gICAgICAgICAgLy8gcmV0dXJucyB0aGUgaWRlbnRpdHkgaW5mbyBmcm9tIHRoZSBjaG9zZW4gaWRcbiAgICAgICAgICAvLyAgICAgICAgICBpZiAoX3RoaXMuaWRlbnRpdGllcy5jdXJyZW50SWRlbnRpdHkpIHJlc29sdmUoX3RoaXMuaWRlbnRpdGllcy5jdXJyZW50SWRlbnRpdHkuYXNzZXJ0aW9uKTtcbiAgICAgICAgICBpZiAoX3RoaXMuaWRlbnRpdGllcy5pZGVudGl0aWVzW3ZhbHVlLnZhbHVlXSkgcmVzb2x2ZShfdGhpcy5pZGVudGl0aWVzLmlkZW50aXRpZXNbdmFsdWUudmFsdWVdKTtcbiAgICAgICAgICBlbHNlIHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLnNlbGVjdElkZW50aXR5RnJvbUdVSV0gaWRlbnRpdHkgbm90IGZvdW5kOiAnLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PT0gJ2lkcCcpIHtcblxuICAgICAgICAgIF90aGlzLmNhbGxHZW5lcmF0ZU1ldGhvZHModmFsdWUudmFsdWUsIG9yaWdpbikudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KCdlcnJvciBvbiBHVUkgcmVjZWl2ZWQgbWVzc2FnZS4nKTtcbiAgICAgICAgfVxuICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KCdPbiBzZWxlY3RJZGVudGl0eUZyb21HVUkgZnJvbSBtZXRob2QgcmVxdWVzdElkZW50aXR5VG9HVUkgZXJyb3I6ICAnICsgZXJyKTsgfSk7XG4gICAgfSk7XG4gIH1cblxuXG4gIGNhbGxJZGVudGl0eU1vZHVsZUZ1bmMobWV0aG9kTmFtZSwgcGFyYW1ldGVycywgZG9tYWluLCByZXNvdXJjZSkge1xuICAgIGxvZy5sb2coJ1tjYWxsSWRlbnRpdHlNb2R1bGVGdW5jOm1ldGhvZE5hbWVdJywgbWV0aG9kTmFtZSk7XG4gICAgbG9nLmxvZygnW2NhbGxJZGVudGl0eU1vZHVsZUZ1bmM6cGFyYW1ldGVyc10nLCBwYXJhbWV0ZXJzKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgaWYgKF90aGlzLl9zaG93QWRtaW4pIHtcbiAgICAgICAgaWYgKG1ldGhvZE5hbWUgPT09ICdnZXRBY2Nlc3NUb2tlbicpIHtcbiAgICAgICAgICBfdGhpcy5fc2hvd0FkbWluKG1ldGhvZE5hbWUsIHBhcmFtZXRlcnMudXJscmVjZWl2ZWQsIGRvbWFpbiwgcmVzb3VyY2UpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgX3RoaXMuX3Nob3dBZG1pbihtZXRob2ROYW1lKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgICAgICB0eXBlOiAnZXhlY3V0ZScsIHRvOiBfdGhpcy5fZ3VpVVJMLCBmcm9tOiBfdGhpcy5faWRtVVJMLFxuICAgICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6ICdpZGVudGl0eScsIG1ldGhvZDogbWV0aG9kTmFtZSwgcGFyYW1zOiBwYXJhbWV0ZXJzIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvL3Bvc3QgbXNnIHdpdGggY2FsbGJhY2sgYnV0IHdpdGhvdXQgdGltb3V0XG4gICAgICAgIGxldCBjYWxsYmFjayA9IG1zZyA9PiB7XG4gICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcihfdGhpcy5faWRtVVJMLCBtc2cuaWQpO1xuICAgICAgICAgIGxldCByZXN1bHQgPSBtc2cuYm9keS52YWx1ZTtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH07XG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCBjYWxsYmFjaywgZmFsc2UpO1xuXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdCgnSW4gbWV0aG9kIGNhbGxJZGVudGl0eU1vZHVsZUZ1bmMgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vKioqKioqKioqKioqKioqKioqKiBUT0tFTiBNRVRIT0RTICoqKioqKioqKioqKioqKioqKipcbiAgLyoqXG4gICogZ2V0IGEgVG9rZW4gdG8gYmUgYWRkZWQgdG8gYSBtZXNzYWdlXG4gICogQHBhcmFtICB7U3RyaW5nfSAgZnJvbVVSTCAgICAgb3JpZ2luIG9mIHRoZSBtZXNzYWdlXG4gICogQHBhcmFtICB7U3RyaW5nfSAgdG9VUkwgICAgIHRhcmdldCBvZiB0aGUgbWVzc2FnZW9rXG4gICogQHJldHVybiB7SlNPTn0gICAgdG9rZW4gICAgdG9rZW4gdG8gYmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2VcbiAgKi9cbiAgZ2V0VG9rZW4obXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgZnJvbVVSTCA9IG1zZy5mcm9tO1xuICAgIGxldCB0b1VybCA9IG1zZy50bztcbiAgICBpZiAobXNnLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3NvdXJjZScpKSB7XG4gICAgICBmcm9tVVJMID0gbXNnLmJvZHkuc291cmNlO1xuICAgIH1cblxuICAgIGlmIChtc2cudHlwZSA9PT0gJ2ZvcndhcmQnKSB7XG4gICAgICBmcm9tVVJMID0gbXNnLmJvZHkuZnJvbTtcbiAgICB9XG5cbiAgICBpZiAobXNnLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3N1YnNjcmliZXInKSkge1xuICAgICAgZnJvbVVSTCA9IG1zZy5ib2R5LnN1YnNjcmliZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5nZXRUb2tlbl0gZm9yIG1zZyAnLCBtc2cpO1xuXG4gICAgICAvL2xvZy5sb2coJ3RvVXJsJywgdG9VcmwpO1xuICAgICAgX3RoaXMucmVnaXN0cnkuaXNMZWdhY3kodG9VcmwpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAvLyBsb2cubG9nKCdbSWRlbnRpdHkuSWRlbnRpdHlNb2R1bGUuZ2V0VG9rZW5dIGlzTEVHQUNZOiAnLCByZXN1bHQpO1xuICAgICAgICBpZiAocmVzdWx0KSB7XG5cbiAgICAgICAgICBfdGhpcy5fZ2V0QWNjZXNzVG9rZW4obXNnKS50aGVuKCh0b2tlbikgPT4ge1xuICAgICAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlLmdldFRva2VuXSBhY2Nlc3MgdG9rZW4gJywgdG9rZW4pO1xuICAgICAgICAgICAgcmVzb2x2ZShkZWVwQ2xvbmUodG9rZW4pKTtcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5nZXRUb2tlbl0gQWNjZXNzIFRva2VuIGVycm9yICcgKyBlcnIpOyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpcy5fZ2V0VmFsaWRUb2tlbihmcm9tVVJMKS50aGVuKCh0b2tlbikgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSh0b2tlbik7XG4gICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KCdPbiBnZXRUb2tlbiBmcm9tIG1ldGhvZCBfZ2V0VmFsaWRUb2tlbiBlcnJvcjogJyArIGVycik7IH0pO1xuICAgICAgICB9XG4gICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIGdldFRva2VuIGZyb20gbWV0aG9kIGlzTGVnYWN5IGVycm9yOiAnICsgZXJyKTsgfSk7XG4gICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAqIGdldCBhbiBJZCBUb2tlbiBmb3IgYSBIeXBlcnR5VVJMXG4gICogQHBhcmFtICB7U3RyaW5nfSAgaHlwZXJ0eVVSTCAgICAgdGhlIEh5cGVydHkgYWRkcmVzc1xuICAqIEByZXR1cm4ge0pTT059ICAgIHRva2VuICAgIElkIHRva2VuIHRvIGJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlXG4gICovXG4gIGdldElkVG9rZW4oaHlwZXJ0eVVSTCkge1xuICAgIGxvZy5pbmZvKCdnZXRJZFRva2VuOmh5cGVydHlVUkwgJywgaHlwZXJ0eVVSTCk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgbGV0IHNwbGl0VVJMID0gaHlwZXJ0eVVSTC5zcGxpdCgnOi8vJyk7XG4gICAgICBsZXQgdXNlclVSTDtcbiAgICAgIGlmIChzcGxpdFVSTFswXSAhPT0gJ2h5cGVydHknKSB7IC8vIGl0IGlzIGEgRGF0YSBPYmplY3QgVVJMXG5cbiAgICAgICAgX3RoaXMuX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdChoeXBlcnR5VVJMKS50aGVuKChyZXR1cm5lZEh5cGVydHlVUkwpID0+IHtcblxuICAgICAgICAgIHVzZXJVUkwgPSBfdGhpcy5yZWdpc3RyeS5nZXRIeXBlcnR5T3duZXIocmV0dXJuZWRIeXBlcnR5VVJMKTtcblxuICAgICAgICAgIGlmICh1c2VyVVJMKSB7XG4gICAgICAgICAgICBsZXQgaWRlbnRpdHkgPSBfdGhpcy5pZGVudGl0aWVzLmdldElkZW50aXR5KHVzZXJVUkwpO1xuICAgICAgICAgICAgaWYgKGlkZW50aXR5KSByZXR1cm4gcmVzb2x2ZShpZGVudGl0eSk7XG4gICAgICAgICAgICBlbHNlIHJldHVybiByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5nZXRJZFRva2VuXSBJZGVudGl0eSBub3QgZm91bmQgZm9yOiAnLCB1c2VyVVJMKTtcbiAgICAgICAgICB9IGVsc2UgeyByZXR1cm4gcmVqZWN0KCdbSWRlbnRpdHlNb2R1bGUuZ2V0SWRUb2tlbl0gVXNlciBub3QgZm91bmQgZm9yIGh5cGVydHk6ICcsIHJldHVybmVkSHlwZXJ0eVVSTCk7IH1cbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICAgIGxvZy5lcnJvcignW0lkZW50aXR5TW9kdWxlLmdldElkVG9rZW5dIEVycm9yOiAnLCByZWFzb24pO1xuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVzZXJVUkwgPSBfdGhpcy5yZWdpc3RyeS5nZXRIeXBlcnR5T3duZXIoaHlwZXJ0eVVSTCk7XG4gICAgICAgIGlmICh1c2VyVVJMKSB7XG5cbiAgICAgICAgICBsZXQgaWRlbnRpdHkgPSBfdGhpcy5pZGVudGl0aWVzLmdldElkZW50aXR5KHVzZXJVUkwpO1xuICAgICAgICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIHJlc29sdmUoaWRlbnRpdHkpO1xuICAgICAgICAgIGVsc2UgcmV0dXJuIHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLmdldElkVG9rZW5dIElkZW50aXR5IG5vdCBmb3VuZCBmb3I6ICcsIHVzZXJVUkwpO1xuXG4gICAgICAgIH0gZWxzZSB7IHJldHVybiByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5nZXRJZFRva2VuXSBVc2VyIG5vdCBmb3VuZCBmb3IgaHlwZXJ0eTogJywgdXNlclVSTCk7IH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIGdldCBhbiBBY2Nlc3MgVG9rZW4gZm9yIGFuIGV4dGVybmFsIEFQSVxuICAqIEBwYXJhbSAge1N0cmluZ30gIHVybCAgICAgdGhlIGV4dGVybmFsIHVybFxuICAqIEByZXR1cm4ge0pTT059ICAgIHRva2VuICAgIEFjY2VzcyB0b2tlbiB0byBiZSBhZGRlZCB0byB0aGUgbWVzc2FnZVxuICAqL1xuICBfZ2V0QWNjZXNzVG9rZW4obXNnKSB7XG4gICAgbGV0IHVybCA9IG1zZy50bztcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmICghbXNnLmhhc093blByb3BlcnR5KCdib2R5JykpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLl9nZXRBY2Nlc3NUb2tlbl0gbWlzc2luZyBtYW5kYXRvcnkgbXNnIGJvZHk6ICcsIG1zZyk7XG4gICAgICB9XG4gICAgICBpZiAoIW1zZy5ib2R5Lmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5fZ2V0QWNjZXNzVG9rZW5dIG1pc3NpbmcgbWFuZGF0b3J5IG1zZyBib2R5IHZhbHVlOiAnLCBtc2cpO1xuICAgICAgfVxuICAgICAgaWYgKCFtc2cuYm9keS52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgncmVzb3VyY2VzJykpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLl9nZXRBY2Nlc3NUb2tlbl0gbWlzc2luZyBtYW5kYXRvcnkgbXNnIGJvZHkgdmFsdWUgcmVzb3VyY2VzOiAnLCBtc2cpO1xuICAgICAgfVxuICAgICAgbGV0IGRvbWFpblRvQ2hlY2sgPSBkaXZpZGVVUkwodXJsKS5kb21haW47XG5cbiAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ3Byb3Rvc3R1YicpKSB7XG4gICAgICAgIGRvbWFpblRvQ2hlY2sgPSBkb21haW5Ub0NoZWNrLnJlcGxhY2UoZG9tYWluVG9DaGVjay5zcGxpdCgnLicpWzBdICsgJy4nLCAnJyk7XG4gICAgICB9XG5cbiAgICAgIGxldCByZXNvdXJjZXMgPSBtc2cuYm9keS52YWx1ZS5yZXNvdXJjZXM7XG5cbiAgICAgIF90aGlzLl9nZXRBY2Nlc3NUb2tlbkZvckRvbWFpbihkb21haW5Ub0NoZWNrLCByZXNvdXJjZXMpLnRoZW4oKHRva2VuKSA9PiB7XG4gICAgICAgIHJlc29sdmUodG9rZW4pO1xuICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG5cbiAgfVxuXG4gIF9nZXRBY2Nlc3NUb2tlbkZvckRvbWFpbihkb21haW5Ub0NoZWNrLCByZXNvdXJjZXMpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCB0b2tlbjtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRva2VuID0gX3RoaXMuaWRlbnRpdGllcy5nZXRBY2Nlc3NUb2tlbihkb21haW5Ub0NoZWNrLCByZXNvdXJjZXMpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdbSWRlbnRpdHlNb2R1bGUuX2dldEFjY2Vzc1Rva2VuRm9yRG9tYWluXSBBY2Nlc3MgVG9rZW4gZXJyb3IgJyArIGVycik7XG4gICAgICB9XG5cbiAgICAgIGlmICghdG9rZW4pIHtcbiAgICAgICAgX3RoaXMuX2dldE5ld0FjY2Vzc1Rva2VuKGRvbWFpblRvQ2hlY2ssIHJlc291cmNlcykudGhlbigodG9rZW4pID0+IHtcbiAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHkuSWRlbnRpdHlNb2R1bGUuX2dldEFjY2Vzc1Rva2VuRm9yRG9tYWluXSBuZXcgQWNjZXNzIFRva2VuICcsIHRva2VuKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0b2tlbik7XG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7IHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLl9nZXRBY2Nlc3NUb2tlbkZvckRvbWFpbl0gb24gZ2V0TmV3QWNjZXNzVG9rZW4gJyArIGVycik7IH0pO1xuICAgICAgfSBlbHNlIGlmICh0b2tlbi5zdGF0dXMgPT09ICdpbi1wcm9ncmVzcycpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoX3RoaXMuX2luUHJvZ3Jlc3NBY2Nlc3NUb2tlbihkb21haW5Ub0NoZWNrLCByZXNvdXJjZXMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB0aW1lTm93ID0gc2Vjb25kc1NpbmNlRXBvY2goKTtcblxuICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHkuSWRlbnRpdHlNb2R1bGUuX2dldEFjY2Vzc1Rva2VuRm9yRG9tYWluXSBmb3VuZCAgQWNjZXNzIFRva2VuICcsIHRva2VuKTtcblxuICAgICAgICBpZiAodGltZU5vdyA+PSB0b2tlbi5leHBpcmVzKSB7XG4gICAgICAgICAgLy8gICAgICAgIGlmICh0cnVlKSB7XG4gICAgICAgICAgaWYgKHRva2VuLmhhc093blByb3BlcnR5KFwicmVmcmVzaFwiKSkge1xuICAgICAgICAgICAgX3RoaXMuX3JlZnJlc2hBY2Nlc3NUb2tlbihkZWVwQ2xvbmUodG9rZW4pKS50aGVuKChuZXdUb2tlbikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShfdGhpcy5pZGVudGl0aWVzLnVwZGF0ZUFjY2Vzc1Rva2VuKG5ld1Rva2VuKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMuX3Jldm9rZUFjY2Vzc1Rva2VuKHRva2VuLCBkb21haW5Ub0NoZWNrLCByZXNvdXJjZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2dldE5ld0FjY2Vzc1Rva2VuKGRvbWFpblRvQ2hlY2ssIHJlc291cmNlcyk7XG5cbiAgICAgICAgICAgICAgfSwgMTAwMCk7XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgfSBcblxuICAgICAgICB9IGVsc2UgcmV0dXJuIHJlc29sdmUoZGVlcENsb25lKHRva2VuKSk7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxuXG5cbiAgX3Jldm9rZUFjY2Vzc1Rva2VuKHRva2VuLCBkb21haW4sIHJlc291cmNlcykge1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIC8vICAgIGxldCBkb21haW4gPSBfdGhpcy5fcmVzb2x2ZURvbWFpbihvbGRJZGVudGl0eS5pZHApO1xuICAgIC8vICAgIGxldCBtZXNzYWdlO1xuICAgIC8vICAgIGxldCBhc3NlcnRpb24gPSBfdGhpcy5nZXRJZGVudGl0eShvbGRJZGVudGl0eS51c2VyUHJvZmlsZS51c2VyVVJMKTtcblxuICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5fcmV2b2tlQWNjZXNzVG9rZW5dIHRvIGJlIHJldm9rZWQgJywgdG9rZW4pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuLy8gICAgICBsZXQgZG9tYWluID0gX3RoaXMuX3Jlc29sdmVEb21haW4odG9rZW4uZG9tYWluKTtcbiAgICAgIGxldCBtZXNzYWdlO1xuXG4gICAgICBtZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiAnZXhlY3V0ZScsXG4gICAgICAgIHRvOiBfdGhpcy5fcmVzb2x2ZURvbWFpbih0b2tlbi5kb21haW4pLFxuICAgICAgICBmcm9tOiBfdGhpcy5faWRtVVJMLFxuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgbWV0aG9kOiAncmV2b2tlQWNjZXNzVG9rZW4nLFxuICAgICAgICAgIHBhcmFtczogeyB0b2tlbjogdG9rZW4gfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGUuX3Jldm9rZUFjY2Vzc1Rva2VuXSByZXZva2UgbXNnICcsIG1lc3NhZ2UpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVzKSA9PiB7XG5cbiAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzLmJvZHkudmFsdWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCkgX3RoaXMuX2lkZW50aXRpZXMucmVtb3ZlQWNjZXNzVG9rZW4oZG9tYWluLCByZXNvdXJjZXMpLnRoZW4oKCk9PntcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KCdJbiBJZGVudGl0eU1vZHVsZS5fcmV2b2tlQWNjZXNzVG9rZW4gb24gcG9zdE1lc3NhZ2UgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgfVxuXG4gICAgfSk7XG5cblxuXG5cbiAgfVxuXG5cbiAgX2luUHJvZ3Jlc3NBY2Nlc3NUb2tlbihkb21haW4sIHJlc291cmNlcykge1xuICAgIHRoaXMuaWRlbnRpdGllcy53YXRjaGluZ1lvdS5vYnNlcnZlKCdhY2Nlc3NUb2tlbnMnLCAoY2hhbmdlKSA9PiB7XG5cbiAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5faW5Qcm9ncmVzc0FjY2Vzc1Rva2VuXSBhY2Nlc3NUb2tlbnMgY2hhbmdlZCAnICsgdGhpcy5pZGVudGl0aWVzLmFjY2Vzc1Rva2Vucyk7XG5cbiAgICAgIGxldCBrZXlwYXRoID0gY2hhbmdlLmtleXBhdGg7XG5cbiAgICAgIGlmIChrZXlwYXRoLmluY2x1ZGVzKCdzdGF0dXMnKSkge1xuICAgICAgICBrZXlwYXRoID0ga2V5cGF0aC5yZXBsYWNlKCcuc3RhdHVzJywgJycpO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2V5cGF0aCA9PT0gZG9tYWluICYmIGNoYW5nZS5uYW1lID09PSAnc3RhdHVzJyAmJiBjaGFuZ2UubmV3VmFsdWUgPT09ICdjcmVhdGVkJykge1xuICAgICAgICAvLyBsb2cubG9nKCdbSWRlbnRpdHkuSWRlbnRpdHlNb2R1bGUuZ2V0VG9rZW5dIHRva2VuIGlzIGNyZWF0ZWQgJyArIF90aGlzLmlkZW50aXRpZXNMaXN0W2RvbWFpbl0pO1xuICAgICAgICByZXR1cm4gKHRoaXMuaWRlbnRpdGllcy5nZXRBY2Nlc3NUb2tlbihkb21haW4sIHJlc291cmNlcykpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuXG4gIF9nZXROZXdBY2Nlc3NUb2tlbihkb21haW4sIHJlc291cmNlcykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBfdGhpcy5pZGVudGl0aWVzLnNldEFjY2Vzc1Rva2VuSW5Qcm9ncmVzcyhkb21haW4pO1xuXG4gICAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogJ2V4ZWN1dGUnLFxuICAgICAgICB0bzogX3RoaXMuX3Jlc29sdmVEb21haW4oZG9tYWluKSxcbiAgICAgICAgZnJvbTogX3RoaXMuX2lkbVVSTCxcbiAgICAgICAgYm9keToge1xuICAgICAgICAgIG1ldGhvZDogJ2dldEFjY2Vzc1Rva2VuQXV0aG9yaXNhdGlvbkVuZHBvaW50JyxcbiAgICAgICAgICBwYXJhbXM6IHJlc291cmNlc1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvL2xldCdzIGZpcnN0IGdldCB0aGUgYXV0aG9yaXNhdGlvbiBVUkwgZnJvbSB0aGUgSWRwIFByb3h5XG4gICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVzKSA9PiB7XG4gICAgICAgIGlmIChyZXMuYm9keS5jb2RlID4gMjk5KSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLl9nZXROZXdBY2Nlc3NUb2tlbl0gRXJyb3Igb24gZ2V0QWNjZXNzVG9rZW5BdXRob3Jpc2F0aW9uRW5kcG9pbnQgZnJvbSBJZFAgUHJveHk6ICcsIHJlcy5ib2R5LmRlc2MpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbGV0J3MgYXNrIHRoZSB1c2VyIGZvciBhdXRob3Jpc2F0aW9uXG4gICAgICAgIF90aGlzLmNhbGxJZGVudGl0eU1vZHVsZUZ1bmMoJ2dldEFjY2Vzc1Rva2VuJywgeyB1cmxyZWNlaXZlZDogcmVzLmJvZHkudmFsdWUgfSwgZG9tYWluLCByZXNvdXJjZXNbMF0pLnRoZW4oKGF1dGhvcmlzYXRpb24pID0+IHtcbiAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHlNb2R1bGU6Y2FsbElkZW50aXR5TW9kdWxlRnVuYzpvcGVuUG9wdXBdIGF1aHRvcmlzYXRpb24gcmVzdWx0OiAnLCBhdXRob3Jpc2F0aW9uKTtcblxuICAgICAgICAgIG1lc3NhZ2UuYm9keS5tZXRob2QgPSAnZ2V0QWNjZXNzVG9rZW4nO1xuICAgICAgICAgIG1lc3NhZ2UuYm9keS5wYXJhbXMgPSB7XG4gICAgICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcbiAgICAgICAgICAgIGxvZ2luOiBhdXRob3Jpc2F0aW9uXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIC8vd2lodG91dCBjYWxsYmFjayB0byBhdm9pZCB0aW1lb3V0IGVycm9ycz9cblxuICAgICAgICAgIC8vIGxldCdzIGFzayBBY2Nlc3MgVG9rZW4gZnJvbSB0aGUgSWRwIFByb3h5XG4gICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcykgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcy5ib2R5LmNvZGUgPiAyOTkpIHJldHVybiByZWplY3QoJ1tJZGVudGl0eU1vZHVsZS5fZ2V0TmV3QWNjZXNzVG9rZW5dIEVycm9yIG9uIGdldEFjY2Vzc1Rva2VuIGZyb20gSWRQIFByb3h5OiAnLCByZXMuYm9keS5kZXNjKTtcblxuICAgICAgICAgICAgX3RoaXMuaWRlbnRpdGllcy5hZGRBY2Nlc3NUb2tlbihyZXMuYm9keS52YWx1ZSkudGhlbigodG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgbG9nLmluZm8oJ1tJZGVudGl0eU1vZHVsZS5fZ2V0TmV3QWNjZXNzVG9rZW5dIHJlc29sdmluZyB0b2tlbjogJywgdG9rZW4pO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShyZXMuYm9keS52YWx1ZSk7XG5cbiAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgfSk7XG5cbiAgICB9KTtcbiAgfVxuXG5cbiAgX3JlZnJlc2hBY2Nlc3NUb2tlbihvdXRkYXRlZFRva2VuKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIC8vICAgIGxldCBkb21haW4gPSBfdGhpcy5fcmVzb2x2ZURvbWFpbihvbGRJZGVudGl0eS5pZHApO1xuICAgIC8vICAgIGxldCBtZXNzYWdlO1xuICAgIC8vICAgIGxldCBhc3NlcnRpb24gPSBfdGhpcy5nZXRJZGVudGl0eShvbGRJZGVudGl0eS51c2VyUHJvZmlsZS51c2VyVVJMKTtcblxuICAgIGxvZy5sb2coJ0lkZW50aXR5TW9kdWxlLl9yZWZyZXNoQWNjZXNzVG9rZW46b3V0ZGF0ZWRUb2tlbicsIG91dGRhdGVkVG9rZW4pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgbGV0IGRvbWFpbiA9IF90aGlzLl9yZXNvbHZlRG9tYWluKG91dGRhdGVkVG9rZW4uZG9tYWluKTtcbiAgICAgIGxldCBtZXNzYWdlO1xuXG4gICAgICBtZXNzYWdlID0geyB0eXBlOiAnZXhlY3V0ZScsIHRvOiBkb21haW4sIGZyb206IF90aGlzLl9pZG1VUkwsIGJvZHk6IHsgbWV0aG9kOiAncmVmcmVzaEFjY2Vzc1Rva2VuJywgcGFyYW1zOiB7IHRva2VuOiBvdXRkYXRlZFRva2VuIH0gfSB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcykgPT4ge1xuICAgICAgICAgIGxldCByZXN1bHQgPSByZXMuYm9keS52YWx1ZTtcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlamVjdCgnSW4gSWRlbnRpdHlNb2R1bGUuX3JlZnJlc2hBY2Nlc3NUb2tlbiBvbiBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgc2VuZFJlZnJlc2hNZXNzYWdlKG9sZElkZW50aXR5KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIC8vICAgIGxldCBkb21haW4gPSBfdGhpcy5fcmVzb2x2ZURvbWFpbihvbGRJZGVudGl0eS5pZHApO1xuICAgIC8vICAgIGxldCBtZXNzYWdlO1xuICAgIC8vICAgIGxldCBhc3NlcnRpb24gPSBfdGhpcy5nZXRJZGVudGl0eShvbGRJZGVudGl0eS51c2VyUHJvZmlsZS51c2VyVVJMKTtcblxuICAgIGxvZy5sb2coJ3NlbmRSZWZyZXNoTWVzc2FnZTpvbGRJZGVudGl0eScsIG9sZElkZW50aXR5KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgZG9tYWluID0gX3RoaXMuX3Jlc29sdmVEb21haW4ob2xkSWRlbnRpdHkuaWRwLmRvbWFpbik7XG4gICAgICBsZXQgbWVzc2FnZTtcbiAgICAgIGxldCBhc3NlcnRpb24gPSBfdGhpcy5nZXRJZGVudGl0eShvbGRJZGVudGl0eS51c2VyUHJvZmlsZS51c2VyVVJMKTtcblxuICAgICAgbG9nLmluZm8oJ3NlbmRSZWZyZXNoTWVzc2FnZTpvbGRJZGVudGl0eScsIG9sZElkZW50aXR5KTtcblxuICAgICAgbWVzc2FnZSA9IHsgdHlwZTogJ2V4ZWN1dGUnLCB0bzogZG9tYWluLCBmcm9tOiBfdGhpcy5faWRtVVJMLCBib2R5OiB7IHJlc291cmNlOiAnaWRlbnRpdHknLCBtZXRob2Q6ICdyZWZyZXNoQXNzZXJ0aW9uJywgcGFyYW1zOiB7IGlkZW50aXR5OiBhc3NlcnRpb24gfSB9IH07XG4gICAgICB0cnkge1xuICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5ib2R5LmNvZGUgPCAzMDApIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXMuYm9keS52YWx1ZTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXMuYm9keS52YWx1ZS5ib2R5LnBhcmFtcywgaWRlbnRpdHkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZWplY3QoJ0luIHNlbmRSZWZyZXNoTWVzc2FnZSBvbiBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgZ2V0QWNjZXNzVG9rZW4oaWRwRG9tYWluLCByZXNvdXJjZXMsIGxvZ2luKSB7XG4gICAgbG9nLmxvZygnW2dldEFjY2Vzc1Rva2VuOmlkcERvbWFpbl0nLCBpZHBEb21haW4pO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBsZXQgZG9tYWluID0gX3RoaXMuX3Jlc29sdmVEb21haW4oaWRwRG9tYWluKTtcbiAgICAgIGxldCBtZXNzYWdlO1xuXG4gICAgICBtZXNzYWdlID0ge1xuICAgICAgICB0eXBlOiAnZXhlY3V0ZScsIHRvOiBkb21haW4sIGZyb206IF90aGlzLl9pZG1VUkwsIGJvZHk6IHsgcmVzb3VyY2U6ICdpZGVudGl0eScsIG1ldGhvZDogJ2dldEFjY2Vzc1Rva2VuJywgcGFyYW1zOiB7IHJlc291cmNlczogcmVzb3VyY2VzLCBsb2dpbjogbG9naW4gfSB9XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcykgPT4ge1xuXG4gICAgICAgICAgaWYgKHJlcy5ib2R5LmNvZGUgPCAyOTkpIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXMuYm9keS52YWx1ZTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXMuYm9keSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJlamVjdCgnSWRlbnRpdHlNb2R1bGUuSW4gZ2V0QWNjZXNzVG9rZW46ICcgKyBlcnIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0QWNjZXNzVG9rZW5BdXRob3Jpc2F0aW9uRW5kcG9pbnQoc2NvcGUsIGlkcERvbWFpbikge1xuICAgIGxvZy5sb2coJ1tnZXRBY2Nlc3NUb2tlbkF1dGhvcmlzYXRpb25FbmRwb2ludDppZHBEb21haW5dJywgaWRwRG9tYWluKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgbGV0IGRvbWFpbiA9IF90aGlzLl9yZXNvbHZlRG9tYWluKGlkcERvbWFpbik7XG4gICAgICBsZXQgbWVzc2FnZTtcblxuICAgICAgbWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogJ2V4ZWN1dGUnLCB0bzogZG9tYWluLCBmcm9tOiBfdGhpcy5faWRtVVJMLCBib2R5OiB7IHJlc291cmNlOiAnaWRlbnRpdHknLCBtZXRob2Q6ICdnZXRBY2Nlc3NUb2tlbkF1dGhvcmlzYXRpb25FbmRwb2ludCcsIHBhcmFtczogeyByZXNvdXJjZXM6IHNjb3BlIH0gfVxuICAgICAgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXMpID0+IHtcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzLmJvZHkudmFsdWU7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZWplY3QoJ0luIGdldEFjY2Vzc1Rva2VuQXV0aG9yaXNhdGlvbkVuZHBvaW50OiAnICsgZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNlbmRHZW5lcmF0ZU1lc3NhZ2UoY29udGVudHMsIG9yaWdpbiwgdXNlcm5hbWVIaW50LCBpZHBEb21haW4pIHtcbiAgICBsb2cubG9nKCdbc2VuZEdlbmVyYXRlTWVzc2FnZTpjb250ZW50c10nLCBjb250ZW50cyk7XG4gICAgbG9nLmxvZygnW3NlbmRHZW5lcmF0ZU1lc3NhZ2U6b3JpZ2luXScsIG9yaWdpbik7XG4gICAgbG9nLmxvZygnW3NlbmRHZW5lcmF0ZU1lc3NhZ2U6dXNlcm5hbWVIaW50XScsIHVzZXJuYW1lSGludCk7XG4gICAgbG9nLmxvZygnW3NlbmRHZW5lcmF0ZU1lc3NhZ2U6aWRwRG9tYWluXScsIGlkcERvbWFpbik7XG4gICAgbG9nLmxvZygnc2VuZEdlbmVyYXRlTWVzc2FnZV9oaW50Jyk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGxldCBkb21haW4gPSBfdGhpcy5fcmVzb2x2ZURvbWFpbihpZHBEb21haW4pO1xuICAgICAgbGV0IG1lc3NhZ2U7XG5cbiAgICAgIG1lc3NhZ2UgPSB7XG4gICAgICAgIHR5cGU6ICdleGVjdXRlJywgdG86IGRvbWFpbiwgZnJvbTogX3RoaXMuX2lkbVVSTCwgYm9keTogeyByZXNvdXJjZTogJ2lkZW50aXR5JywgbWV0aG9kOiAnZ2VuZXJhdGVBc3NlcnRpb24nLCBwYXJhbXM6IHsgY29udGVudHM6IGNvbnRlbnRzLCBvcmlnaW46IG9yaWdpbiwgdXNlcm5hbWVIaW50OiB1c2VybmFtZUhpbnQgfSB9XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcykgPT4ge1xuXG4gICAgICAgICAgaWYgKHJlcy5ib2R5LmNvZGUgPCAzMDApIHJlc29sdmUocmVzLmJvZHkudmFsdWUpO1xuICAgICAgICAgIGVsc2UgcmVqZWN0KHJlcy5ib2R5KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KCdJbiBzZW5kR2VuZXJhdGVNZXNzYWdlOiAnICsgZXJyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFJlcXVlc3RzIHRoZSBJZHBQcm94eSBmcm9tIGEgZ2l2ZW4gRG9tYWluIGZvciBhbiBpZGVudGl0eUFzc2VydGlvblxuICAqXG4gICogQHBhcmFtICB7RE9NU3RyaW5nfSBjb250ZW50cyAgICAgY29udGVudHNcbiAgKiBAcGFyYW0gIHtET01TdHJpbmd9IG9yaWdpbiAgICAgICBvcmlnaW5cbiAgKiBAcGFyYW0gIHtET01TdHJpbmd9IHVzZXJuYW1lSGludCB1c2VybmFtZUhpbnRcbiAgKiBAcGFyYW0gIHtKU09OfSAgICAgIGtleVBhaXIgICAgICAgdXNlciBrZXlQYWlyXG4gICogQHJldHVybiB7SWRBc3NlcnRpb259ICAgICAgICAgICAgICBJZEFzc2VydGlvblxuICAqL1xuICBnZW5lcmF0ZUFzc2VydGlvbihjb250ZW50cywgb3JpZ2luLCB1c2VybmFtZUhpbnQsIGlkcERvbWFpbikge1xuICAgIGxvZy5sb2coJ1tnZW5lcmF0ZUFzc2VydGlvbjpjb250ZW50c10nLCBjb250ZW50cyk7XG4gICAgbG9nLmxvZygnW2dlbmVyYXRlQXNzZXJ0aW9uOm9yaWdpbl0nLCBvcmlnaW4pO1xuICAgIGxvZy5sb2coJ1tnZW5lcmF0ZUFzc2VydGlvbjp1c2VybmFtZUhpbnRdJywgdXNlcm5hbWVIaW50KTtcblxuICAgIC8vICAgIGxvZy5sb2coJ1tnZW5lcmF0ZUFzc2VydGlvbjprZXlQYWlyXScsIGtleVBhaXIpO1xuICAgIGxvZy5sb2coJ1tnZW5lcmF0ZUFzc2VydGlvbjppZHBEb21haW5dJywgaWRwRG9tYWluKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZTpzZW5kR2VuZXJhdGVNZXNzYWdlOnNlbmRHZW5lcmF0ZU1lc3NhZ2VdJywgdXNlcm5hbWVIaW50KTtcbiAgICAgIF90aGlzLnNlbmRHZW5lcmF0ZU1lc3NhZ2UoY29udGVudHMsIG9yaWdpbiwgdXNlcm5hbWVIaW50LCBpZHBEb21haW4pLnRoZW4oKHJlc3VsdCkgPT4ge1xuXG4gICAgICAgIGlmIChyZXN1bHQpIHtcblxuICAgICAgICAgIF90aGlzLmlkZW50aXRpZXMuYWRkQXNzZXJ0aW9uKHJlc3VsdCkudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdCgnZXJyb3Igb24gb2J0YWluaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uJyk7XG4gICAgICAgIH1cblxuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvci5oYXNPd25Qcm9wZXJ0eSgnZGVzY3JpcHRpb24nKSAmJiBlcnJvci5kZXNjcmlwdGlvbi5oYXNPd25Qcm9wZXJ0eSgnbG9naW5VcmwnKSkge1xuICAgICAgICAgIF90aGlzLmNhbGxJZGVudGl0eU1vZHVsZUZ1bmMoJ2xvZ2luJywgeyB1cmxyZWNlaXZlZDogZXJyb3IuZGVzY3JpcHRpb24ubG9naW5VcmwgfSkudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZTpjYWxsSWRlbnRpdHlNb2R1bGVGdW5jOm9wZW5Qb3B1cF0nLCB1c2VybmFtZUhpbnQpO1xuXG4gICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ1tJZGVudGl0eU1vZHVsZTpzZW5kR2VuZXJhdGVNZXNzYWdlXSBnZW5lcmF0ZSBhc3NlcnRpb24gd2l0aCBoaW50IGVycm9yICcsIGVycm9yKTtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIGdlbmVyYXRlQXNzZXJ0aW9uIGZyb20gbWV0aG9kIHNlbmRHZW5lcmF0ZU1lc3NhZ2UgZXJyb3I6ICcgKyBlcnIpOyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFJlcXVlc3RzIHRoZSBJZHBQcm94eSBmcm9tIGEgZ2l2ZW4gRG9tYWluIHRvIHZhbGlkYXRlIGFuIElkZW50aXR5QXNzZXJ0aW9uXG4gICogUmV0dXJucyBhIHByb21pc2Ugd2l0aCB0aGUgcmVzdWx0IGZyb20gdGhlIHZhbGlkYXRpb24uXG4gICogQHBhcmFtICB7RE9NU3RyaW5nfSBhc3NlcnRpb25cbiAgKiBAcGFyYW0gIHtET01TdHJpbmd9IG9yaWdpbiAgICAgICBvcmlnaW5cbiAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICAgIFByb21pc2UgICAgICAgICBwcm9taXNlIHdpdGggdGhlIHJlc3VsdCBmcm9tIHRoZSB2YWxpZGF0aW9uXG4gICovXG4gIHZhbGlkYXRlQXNzZXJ0aW9uKGFzc2VydGlvbiwgb3JpZ2luLCBpZHBEb21haW4pIHtcbiAgICBsb2cubG9nKCdbdmFsaWRhdGVBc3NlcnRpb246YXNzZXJ0aW9uXScsIGFzc2VydGlvbik7XG4gICAgbG9nLmxvZygnW3ZhbGlkYXRlQXNzZXJ0aW9uOm9yaWdpbl0nLCBvcmlnaW4pO1xuICAgIGxvZy5sb2coJ1t2YWxpZGF0ZUFzc2VydGlvbjppZHBEb21haW5dJywgaWRwRG9tYWluKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IGRvbWFpbiA9IF90aGlzLl9yZXNvbHZlRG9tYWluKGlkcERvbWFpbik7XG5cbiAgICBsZXQgbWVzc2FnZSA9IHtcbiAgICAgIHR5cGU6ICdleGVjdXRlJywgdG86IGRvbWFpbiwgZnJvbTogX3RoaXMuX2lkbVVSTCwgYm9keToge1xuICAgICAgICByZXNvdXJjZTogJ2lkZW50aXR5JywgbWV0aG9kOiAndmFsaWRhdGVBc3NlcnRpb24nLFxuICAgICAgICBwYXJhbXM6IHsgYXNzZXJ0aW9uOiBhc3NlcnRpb24sIG9yaWdpbjogb3JpZ2luIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UsIChyZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAocmVzdWx0LmJvZHkuY29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdC5ib2R5LnZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KCdlcnJvcicsIHJlc3VsdC5ib2R5LmNvZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KCdPbiB2YWxpZGF0ZUFzc2VydGlvbiBmcm9tIG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhZGRHVUlMaXN0ZW5lcnMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF90aGlzLl9pZG1VUkwsIChtc2cpID0+IHtcbiAgICAgIGxldCBmdW5jTmFtZSA9IG1zZy5ib2R5Lm1ldGhvZDtcblxuICAgICAgbG9nLmxvZygnW0lkZW50aXR5TW9kdWxlOmFkZEdVSUxpc3RlbmVyc10nLCBtc2csIG1zZy5ib2R5LCBmdW5jTmFtZSk7XG5cbiAgICAgIGxldCByZXR1cm5lZFZhbHVlO1xuXG4gICAgICBpZiAoZnVuY05hbWUgPT09ICdkZXBsb3lHVUknKSB7XG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5kZXBsb3lHVUkoKTtcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdnZXRJZGVudGl0aWVzVG9DaG9vc2UnKSB7XG4gICAgICAgIF90aGlzLmdldElkZW50aXRpZXNUb0Nob29zZSgpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIC8vIGlmIHRoZSBmdW5jdGlvbiByZXF1ZXN0ZWQgaXMgbm90IGEgcHJvbWlzZVxuICAgICAgICAgIGxldCB2YWx1ZSA9IHsgdHlwZTogJ2V4ZWN1dGUnLCB2YWx1ZTogcmVzdWx0LCBjb2RlOiAyMDAgfTtcbiAgICAgICAgICBsZXQgcmVwbHlNc2cgPSB7IGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIHRvOiBtc2cuZnJvbSwgZnJvbTogbXNnLnRvLCBib2R5OiB2YWx1ZSB9O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ09uIGFkZEdVSUxpc3RlbmVycyBmcm9tIGlmIHN0b3JlSWRlbnRpdHkgbWV0aG9kIHBvc3RNZXNzYWdlIGVycm9yOiAnICsgZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICd1bnJlZ2lzdGVySWRlbnRpdHknKSB7XG4gICAgICAgIGxldCBlbWFpbCA9IG1zZy5ib2R5LnBhcmFtcy5lbWFpbDtcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLnVucmVnaXN0ZXJJZGVudGl0eShlbWFpbCk7XG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnZ2V0TXlQdWJsaWNLZXknKSB7XG4gICAgICAgIC8vIGJlY2F1c2UgZ2VuZXJhdGVSU0FLZXlQYWlyIGlzIGEgcHJvbWlzZVxuICAgICAgICAvLyB3ZSBoYXZlIHRvIHNlbmQgdGhlIG1lc3NhZ2Ugb25seSBhZnRlciBnZXR0aW5nIHRoZSBrZXkgcGFpclxuICAgICAgICBfdGhpcy5fY3J5cHRvLmdldE15UHVibGljS2V5KCkudGhlbigocHViS2V5KSA9PiB7XG4gICAgICAgICAgcHViS2V5ID0gc3RyaW5naWZ5KHB1YktleSk7XG4gICAgICAgICAgbGV0IHZhbHVlID0geyB0eXBlOiAnZXhlY3V0ZScsIHZhbHVlOiBwdWJLZXksIGNvZGU6IDIwMCB9O1xuICAgICAgICAgIGxldCByZXBseU1zZyA9IHsgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgdG86IG1zZy5mcm9tLCBmcm9tOiBtc2cudG8sIGJvZHk6IHZhbHVlIH07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHJlcGx5TXNnKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignT24gYWRkR1VJTGlzdGVuZXJzIGZyb20gaWYgZ2VuZXJhdGVSU0FLZXlQYWlyIG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ3NlbmRHZW5lcmF0ZU1lc3NhZ2UnKSB7XG4gICAgICAgIGxldCBjb250ZW50cyA9IG1zZy5ib2R5LnBhcmFtcy5jb250ZW50cztcbiAgICAgICAgbGV0IG9yaWdpbiA9IG1zZy5ib2R5LnBhcmFtcy5vcmlnaW47XG4gICAgICAgIGxldCB1c2VybmFtZUhpbnQgPSBtc2cuYm9keS5wYXJhbXMudXNlcm5hbWVIaW50O1xuICAgICAgICBsZXQgaWRwRG9tYWluID0gbXNnLmJvZHkucGFyYW1zLmlkcERvbWFpbjtcbiAgICAgICAgbGV0IHJlcGx5TXNnID0geyBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCB0bzogbXNnLmZyb20sIGZyb206IG1zZy50byB9O1xuICAgICAgICBfdGhpcy5zZW5kR2VuZXJhdGVNZXNzYWdlKGNvbnRlbnRzLCBvcmlnaW4sIHVzZXJuYW1lSGludCwgaWRwRG9tYWluKS50aGVuKChyZXR1cm5lZFZhbHVlKSA9PiB7XG4gICAgICAgICAgbGV0IHZhbHVlID0geyB0eXBlOiAnZXhlY3V0ZScsIHZhbHVlOiByZXR1cm5lZFZhbHVlLCBjb2RlOiAyMDAgfTtcbiAgICAgICAgICByZXBseU1zZy5ib2R5ID0gdmFsdWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHJlcGx5TXNnKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignSWRlbnRpdHlNb2R1bGUuYWRkR1VJTGlzdGVuZXJzIHNlbmRHZW5lcmF0ZU1lc3NhZ2UgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgICAgbG9nLmluZm8oJ0lEUFByb3h5IGdlbmVyYXRlQXNzZXJ0aW9uIHJlcGx5IGVycm9yICcgKyBlcnIpO1xuICAgICAgICAgIHJlcGx5TXNnLmJvZHkgPSBlcnI7XG4gICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xuXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnZ2V0QWNjZXNzVG9rZW5BdXRob3Jpc2F0aW9uRW5kcG9pbnQnKSB7XG4gICAgICAgIGxldCBzY29wZSA9IG1zZy5ib2R5LnBhcmFtcy5zY29wZTtcbiAgICAgICAgbGV0IGlkcERvbWFpbiA9IG1zZy5ib2R5LnBhcmFtcy5pZHBEb21haW47XG4gICAgICAgIF90aGlzLmdldEFjY2Vzc1Rva2VuQXV0aG9yaXNhdGlvbkVuZHBvaW50KHNjb3BlLCBpZHBEb21haW4pLnRoZW4oKHJldHVybmVkVmFsdWUpID0+IHtcbiAgICAgICAgICBsZXQgdmFsdWUgPSB7IHR5cGU6ICdleGVjdXRlJywgdmFsdWU6IHJldHVybmVkVmFsdWUsIGNvZGU6IDIwMCB9O1xuICAgICAgICAgIGxldCByZXBseU1zZyA9IHsgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgdG86IG1zZy5mcm9tLCBmcm9tOiBtc2cudG8sIGJvZHk6IHZhbHVlIH07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHJlcGx5TXNnKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignT24gYWRkR1VJTGlzdGVuZXJzIGZyb20gaWYgc2VuZEdlbmVyYXRlTWVzc2FnZSBtZXRob2QgcG9zdE1lc3NhZ2UgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2FkZEFjY2Vzc1Rva2VuJykge1xuICAgICAgICBsZXQgYWNjZXNzVG9rZW4gPSBtc2cuYm9keS5wYXJhbXM7XG5cbiAgICAgICAgX3RoaXMuaWRlbnRpdGllcy5hZGRBY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikudGhlbigocmV0dXJuZWRWYWx1ZSkgPT4ge1xuICAgICAgICAgIGxldCB2YWx1ZSA9IHsgdHlwZTogJ2V4ZWN1dGUnLCB2YWx1ZTogcmV0dXJuZWRWYWx1ZSwgY29kZTogMjAwIH07XG4gICAgICAgICAgbGV0IHJlcGx5TXNnID0geyBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCB0bzogbXNnLmZyb20sIGZyb206IG1zZy50bywgYm9keTogdmFsdWUgfTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZnJvbSBpZiBzdG9yZUlkZW50aXR5IG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnZ2V0QWNjZXNzVG9rZW4nKSB7XG5cbiAgICAgICAgbGV0IGRvbWFpbiA9IG1zZy5ib2R5LnBhcmFtcy5pZHBEb21haW47XG4gICAgICAgIGxldCByZXNvdXJjZXMgPSBtc2cuYm9keS5wYXJhbXMucmVzb3VyY2VzO1xuICAgICAgICBsZXQgbG9naW4gPSBtc2cuYm9keS5wYXJhbXMubG9naW47XG4gICAgICAgIGxldCByZXBseU1zZyA9IHsgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgdG86IG1zZy5mcm9tLCBmcm9tOiBtc2cudG8gfTtcblxuICAgICAgICBfdGhpcy5nZXRBY2Nlc3NUb2tlbihkb21haW4sIHJlc291cmNlcywgbG9naW4pLnRoZW4oKHJldHVybmVkVmFsdWUpID0+IHtcbiAgICAgICAgICBsZXQgdmFsdWUgPSB7IHR5cGU6ICdleGVjdXRlJywgdmFsdWU6IHJldHVybmVkVmFsdWUsIGNvZGU6IDIwMCB9O1xuICAgICAgICAgIHJlcGx5TXNnLmJvZHkgPSB2YWx1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZnJvbSBpZiBzZW5kR2VuZXJhdGVNZXNzYWdlIG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXBseU1zZy5ib2R5ID0gZXJyb3I7XG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ09uIGFkZEdVSUxpc3RlbmVycyBmcm9tIGlmIHNlbmRHZW5lcmF0ZU1lc3NhZ2UgbWV0aG9kIHBvc3RNZXNzYWdlIGVycm9yOiAnICsgZXJyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdhZGRBc3NlcnRpb24nKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBtc2cuYm9keS5wYXJhbXM7XG5cbiAgICAgICAgLy8gICAgICAgIGxldCBrZXlQYWlyID0gbXNnLmJvZHkucGFyYW1zLmtleVBhaXI7XG4gICAgICAgIF90aGlzLmlkZW50aXRpZXMuYWRkQXNzZXJ0aW9uKHJlc3VsdCkudGhlbigocmV0dXJuZWRWYWx1ZSkgPT4ge1xuICAgICAgICAgIGxldCB2YWx1ZSA9IHsgdHlwZTogJ2V4ZWN1dGUnLCB2YWx1ZTogcmV0dXJuZWRWYWx1ZSwgY29kZTogMjAwIH07XG4gICAgICAgICAgbGV0IHJlcGx5TXNnID0geyBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCB0bzogbXNnLmZyb20sIGZyb206IG1zZy50bywgYm9keTogdmFsdWUgfTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZnJvbSBpZiBzdG9yZUlkZW50aXR5IG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAncmVmcmVzaEFjY2Vzc1Rva2VuJykge1xuICAgICAgICBsZXQgZG9tYWluID0gbXNnLmJvZHkucGFyYW1zLmRvbWFpbjtcbiAgICAgICAgbGV0IHJlc291cmNlcyA9IG1zZy5ib2R5LnBhcmFtcy5yZXNvdXJjZXM7XG5cbiAgICAgICAgX3RoaXMuX2dldEFjY2Vzc1Rva2VuRm9yRG9tYWluKGRvbWFpbiwgcmVzb3VyY2VzKS50aGVuKCh0b2tlbikgPT4ge1xuICAgICAgICAgIGxldCByZXBseU1zZyA9IHtcbiAgICAgICAgICAgIGlkOiBtc2cuaWQsXG4gICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnLFxuICAgICAgICAgICAgdG86IG1zZy5mcm9tLFxuICAgICAgICAgICAgZnJvbTogbXNnLnRvLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICB2YWx1ZTogdG9rZW4uYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICAgIGNvZGU6IDIwMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHJlcGx5TXNnKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignT24gYWRkR1VJTGlzdGVuZXJzIGZvciByZWZyZXNoQWNjZXNzVG9rZW4gcmVxdWVzdDogJyArIGVycik7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAndW5hdXRob3Jpc2UnKSB7XG4gICAgICAgIGxldCBkb21haW4gPSBtc2cuYm9keS5wYXJhbXMuZG9tYWluO1xuICAgICAgICBsZXQgcmVzb3VyY2VzID0gbXNnLmJvZHkucGFyYW1zLnJlc291cmNlcztcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIF90aGlzLl9yZXZva2VBY2Nlc3NUb2tlbihfdGhpcy5pZGVudGl0aWVzLmdldEFjY2Vzc1Rva2VuKGRvbWFpbiwgcmVzb3VyY2VzKSwgZG9tYWluLCByZXNvdXJjZXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLmFkZEdVSUxpc3RlbmVyc10gdW5hdXRob3Jpc2UgZXJyb3IgJyArIGVycik7XG4gICAgICAgIH1cblxuICAgICAgICAgIGxldCByZXBseU1zZyA9IHtcbiAgICAgICAgICAgIGlkOiBtc2cuaWQsXG4gICAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnLFxuICAgICAgICAgICAgdG86IG1zZy5mcm9tLFxuICAgICAgICAgICAgZnJvbTogbXNnLnRvLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgY29kZTogMjAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZm9yIHJlZnJlc2hBY2Nlc3NUb2tlbiByZXF1ZXN0OiAnICsgZXJyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfS8qZWxzZSBpZiAoZnVuY05hbWUgPT09ICdzZWxlY3RJZGVudGl0eUZvckh5cGVydHknKSB7XG4gICAgICAgIGxldCBvcmlnaW4gPSBtc2cuYm9keS5wYXJhbXMub3JpZ2luO1xuICAgICAgICBsZXQgaWRwID0gbXNnLmJvZHkucGFyYW1zLmlkcDtcbiAgICAgICAgbGV0IGlkSGludCA9IG1zZy5ib2R5LnBhcmFtcy5pZEhpbnQ7XG4gICAgICAgIF90aGlzLnNlbGVjdElkZW50aXR5Rm9ySHlwZXJ0eShvcmlnaW4sIGlkcCwgaWRIaW50KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSovXG5cbiAgICAgIC8vIGlmIHRoZSBmdW5jdGlvbiByZXF1ZXN0ZWQgaXMgbm90IGEgcHJvbWlzZVxuICAgICAgbGV0IHZhbHVlID0geyB0eXBlOiAnZXhlY3V0ZScsIHZhbHVlOiByZXR1cm5lZFZhbHVlLCBjb2RlOiAyMDAgfTtcbiAgICAgIGxldCByZXBseU1zZyA9IHsgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgdG86IG1zZy5mcm9tLCBmcm9tOiBtc2cudG8sIGJvZHk6IHZhbHVlIH07XG4gICAgICB0cnkge1xuICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLmVycm9yKCdPbiBhZGRHVUlMaXN0ZW5lcnMgZnJvbSBpZiBzdG9yZUlkZW50aXR5IG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxuXG4gIGRlcGxveUdVSSgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLmd1aURlcGxveWVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8vKioqKioqKioqKioqKioqKioqKiBQUklWQVRFIE1FVEhPRFMgKioqKioqKioqKioqKioqKioqKlxuICAvKipcbiAgICogR2V0VmFsaWRUb2tlbiBpcyBmb3Igbm9uIGxlZ2FjeSBoeXBlcnRpZXMgYW5kIHZlcmlmaWVzIGlmIHRoZSBUb2tlbiBpcyBzdGlsbCB2YWxpZFxuICAgKiBpZiB0aGUgdG9rZW4gaXMgaW52YWxpZCBpdCByZXF1ZXN0cyBhIG5ldyB0b2tlblxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IGh5cGVydHlVUkwgaHlwZXJ0eVVSTFxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgX2dldFZhbGlkVG9rZW4oaHlwZXJ0eVVSTCkge1xuICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5fZ2V0VmFsaWRUb2tlbl06aHlwZXJ0eVVSTCcsIGh5cGVydHlVUkwpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF90aGlzLmdldElkVG9rZW4oaHlwZXJ0eVVSTCkudGhlbihmdW5jdGlvbiAoYXNzZXJ0aW9uKSB7XG4gICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eU1vZHVsZS5fZ2V0VmFsaWRUb2tlbl0gcmV0cmlldmVkIElkQXNzZXJ0aW9uJywgYXNzZXJ0aW9uKTtcbiAgICAgICAgbGV0IHRpbWVOb3cgPSBzZWNvbmRzU2luY2VFcG9jaCgpO1xuXG4gICAgICAgIGlmICghYXNzZXJ0aW9uLmhhc093blByb3BlcnR5KCdleHBpcmVzJykpIHJldHVybiByZXNvbHZlKGFzc2VydGlvbik7XG5cbiAgICAgICAgbGV0IGV4cGlyYXRpb25EYXRlID0gYXNzZXJ0aW9uLmV4cGlyZXM7XG5cbiAgICAgICAgLyogaWYgKGNvbXBsZXRlSWQuaGFzT3duUHJvcGVydHkoJ2luZm8nKSkge1xuICAgICAgICAgIGlmIChjb21wbGV0ZUlkLmluZm8uaGFzT3duUHJvcGVydHkoJ2V4cGlyZXMnKSkge1xuICAgICAgICAgICAgZXhwaXJhdGlvbkRhdGUgPSBjb21wbGV0ZUlkLmluZm8uZXhwaXJlcztcbiAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBsZXRlSWQuaW5mby5oYXNPd25Qcm9wZXJ0eSgndG9rZW5JREpTT04nKSkge1xuICAgICAgICAgICAgZXhwaXJhdGlvbkRhdGUgPSBjb21wbGV0ZUlkLmluZm8udG9rZW5JREpTT04uZXhwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB0aHJvdyAnVGhlIElEIFRva2VuIGRvZXMgbm90IGhhdmUgYW4gZXhwaXJhdGlvbiB0aW1lJztcbiAgICAgICAgICAgIGxvZy5pbmZvKCdUaGUgSUQgVG9rZW4gZG9lcyBub3QgaGF2ZSBhbiBleHBpcmF0aW9uIHRpbWUnKTtcbiAgICAgICAgICAgIHJlc29sdmUoYXNzZXJ0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcGxldGVJZC5oYXNPd25Qcm9wZXJ0eSgnaW5mb1Rva2VuJykgJiYgY29tcGxldGVJZC5pbmZvVG9rZW4uaGFzT3duUHJvcGVydHkoJ2V4cCcpKSB7XG4gICAgICAgICAgZXhwaXJhdGlvbkRhdGUgPSBjb21wbGV0ZUlkLmluZm9Ub2tlbi5leHA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhyb3cgJ1RoZSBJRCBUb2tlbiBkb2VzIG5vdCBoYXZlIGFuIGV4cGlyYXRpb24gdGltZSc7XG4gICAgICAgICAgbG9nLmluZm8oJ1RoZSBJRCBUb2tlbiBkb2VzIG5vdCBoYXZlIGFuIGV4cGlyYXRpb24gdGltZScpO1xuICAgICAgICAgIHJlc29sdmUoYXNzZXJ0aW9uKTtcbiAgICAgICAgfSovXG5cbiAgICAgICAgbG9nLmxvZygnW0lkZW50aXR5LklkZW50aXR5TW9kdWxlLmdldFZhbGlkVG9rZW5dIFRva2VuIGV4cGlyZXMgaW4nLCBleHBpcmF0aW9uRGF0ZSk7XG4gICAgICAgIGxvZy5sb2coJ1tJZGVudGl0eS5JZGVudGl0eU1vZHVsZS5nZXRWYWxpZFRva2VuXSB0aW1lIG5vdzonLCB0aW1lTm93KTtcblxuICAgICAgICBpZiAodGltZU5vdyA+PSBleHBpcmF0aW9uRGF0ZSkge1xuICAgICAgICAgIC8vICAgICAgICBpZiAodGltZU5vdyA+PSAwKSB7XG4gICAgICAgICAgaWYgKGFzc2VydGlvbi5oYXNPd25Qcm9wZXJ0eSgncmVmcmVzaCcpKSB7XG4gICAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHkuSWRlbnRpdHlNb2R1bGUuZ2V0VmFsaWRUb2tlbl0gcmVmcmVzaGluZyBhc3NlcnRpb246ICcsIGFzc2VydGlvbik7XG5cbiAgICAgICAgICAgIF90aGlzLnNlbmRSZWZyZXNoTWVzc2FnZShhc3NlcnRpb24pLnRoZW4oKG5ld0Fzc2VydGlvbikgPT4ge1xuICAgICAgICAgICAgICBsb2cubG9nKCdbSWRlbnRpdHkuSWRlbnRpdHlNb2R1bGUuZ2V0VmFsaWRUb2tlbl0gcmVmcmVzaGVkIGFzc2VydGlvbjogJywgbmV3QXNzZXJ0aW9uKTtcbiAgICAgICAgICAgICAgX3RoaXMuaWRlbnRpdGllcy51cGRhdGVBc3NlcnRpb24obmV3QXNzZXJ0aW9uKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKG5ld0Fzc2VydGlvbik7XG4gICAgICAgICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoJ1tJZGVudGl0eU1vZHVsZS5nZXRWYWxpZFRva2VuXSBlcnJvciB1cGRhdGluZyB0aGUgYXNzZXJ0aW9uICcsIGVycik7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ1tJZGVudGl0eU1vZHVsZS5nZXRWYWxpZFRva2VuXSBlcnJvciByZWZyZXNoaW5nIHRoZSBhc3NlcnRpb24gJywgZXJyKTtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgeyAvLyBubyByZWZyZXNoIHRva2VuIGF2YWlsYWJsZSwgdXNlciBoYXMgdG8gYXV0aGVudGljYXRlIGFnYWluIHRvIGdldCBhIG5ldyBhc3NlcnRpb25cbiAgICAgICAgICAgIC8vIGdlbmVyYXRlIG5ldyBpZFRva2VuXG4gICAgICAgICAgICBfdGhpcy5jYWxsR2VuZXJhdGVNZXRob2RzKGFzc2VydGlvbi5pZHAuZG9tYWluKS50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7IHJlamVjdCgnW0lkZW50aXR5TW9kdWxlLmdldFZhbGlkVG9rZW5dIGVycm9yIHdoZW4gZ2VuZXJhdGluZyBhIG5ldyBhc3NlcnRpb24gJyArIGVycik7IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvbHZlKGFzc2VydGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICBsb2cuZXJyb3IoJ1tJZGVudGl0eU1vZHVsZS5nZXRWYWxpZFRva2VuXSBlcnJvciBvbiBnZXRJZFRva2VuJywgZXJyb3IpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiByZXR1cm5zIHRoZSByZXBvcnRlciBhc3NvY2lhdGVkIHRvIHRoZSBkYXRhT2JqZWN0IFVSTFxuICAqIEBwYXJhbSAgIHtTdHJpbmd9ICAgZGF0YU9iamVjdFVSTCAgICAgICAgIGRhdGFPYmplY3QgdXJsXG4gICogQHJldHVybiAgIHtTdHJpbmd9ICByZXBvcnRlciAgICAgICAgICAgICAgZGF0YU9iamVjdCB1cmwgcmVwb3J0ZXJcbiAgKi9cbiAgX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdChkYXRhT2JqZWN0VVJMKSB7XG4gICAgbG9nLmluZm8oJ19nZXRIeXBlcnR5RnJvbURhdGFPYmplY3Q6ZGF0YU9iamVjdFVSTCcsIGRhdGFPYmplY3RVUkwpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBsZXQgc3BsaXRlZFVSTCA9IGRpdmlkZVVSTChkYXRhT2JqZWN0VVJMKTtcbiAgICAgIGxldCBkb21haW4gPSBzcGxpdGVkVVJMLmRvbWFpbjtcbiAgICAgIGxldCBmaW5hbFVSTCA9IHBhcnNlTWVzc2FnZVVSTChkYXRhT2JqZWN0VVJMKTtcblxuICAgICAgLy8gY2hlY2sgaWYgaXMgdGhlIGNyZWF0b3Igb2YgdGhlIGh5cGVydHlcbiAgICAgIGxldCByZXBvcnRlclVSTCA9IF90aGlzLnJlZ2lzdHJ5LmdldFJlcG9ydGVyVVJMU3luY2hvbm91cyhmaW5hbFVSTCk7XG4gICAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpyZXBvcnRlclVSTCcsIHJlcG9ydGVyVVJMKTtcblxuICAgICAgaWYgKHJlcG9ydGVyVVJMKSB7XG4gICAgICAgIHJlc29sdmUocmVwb3J0ZXJVUkwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBhc3NvY2lhdGlvbiBmcm9tIGFuIGh5cGVydHlVUkwgdG8gdGhlIGRhdGFPYmplY3RcbiAgICAgICAgbGV0IHN0b3JlZFJlcG9ydGVyVVJMID0gX3RoaXMuZGF0YU9iamVjdHNJZGVudGl0eVtmaW5hbFVSTF07XG4gICAgICAgIGxvZy5pbmZvKCdfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0OnN0b3JlZFJlcG9ydGVyVVJMJywgc3RvcmVkUmVwb3J0ZXJVUkwpO1xuXG4gICAgICAgIGlmIChzdG9yZWRSZXBvcnRlclVSTCkge1xuICAgICAgICAgIHJlc29sdmUoc3RvcmVkUmVwb3J0ZXJVUkwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBoeXBlcnR5IHRoYXQgc3Vic2NyaWJlZCB0aGUgZGF0YU9iamVjdFVSTFxuICAgICAgICAgIGxldCBzdWJzY3JpYmVySHlwZXJ0eSA9IF90aGlzLnJlZ2lzdHJ5LmdldERhdGFPYmplY3RTdWJzY3JpYmVySHlwZXJ0eShkYXRhT2JqZWN0VVJMKTtcbiAgICAgICAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpzdWJzY3JpYmVySHlwZXJ0eScsIHN1YnNjcmliZXJIeXBlcnR5KTtcblxuICAgICAgICAgIGlmIChzdWJzY3JpYmVySHlwZXJ0eSkge1xuICAgICAgICAgICAgcmVzb2x2ZShzdWJzY3JpYmVySHlwZXJ0eSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNlYXJjaCBpbiBkb21haW4gcmVnaXN0cnkgZm9yIHRoZSBoeXBlcnR5IGFzc29jaWF0ZWQgdG8gdGhlIGRhdGFPYmplY3RcbiAgICAgICAgICAgIC8vIHNlYXJjaCBpbiBjYXNlIGlzIGEgc3Vic2NyaWJlciB3aG8gd2FudHMgdG8ga25vdyB0aGUgcmVwb3J0ZXJcbiAgICAgICAgICAgIC8vIFRvIGJlIHJldmlld2VkIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBkaXNjb3ZlcnkgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgIF90aGlzLl9jb3JlRGlzY292ZXJ5LmRpc2NvdmVyRGF0YU9iamVjdFBlclVSTChmaW5hbFVSTCwgZG9tYWluKS50aGVuKGRhdGFPYmplY3QgPT4ge1xuICAgICAgICAgICAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpkYXRhT2JqZWN0JywgZGF0YU9iamVjdCk7XG4gICAgICAgICAgICAgIF90aGlzLmRhdGFPYmplY3RzSWRlbnRpdHlbZmluYWxVUkxdID0gZGF0YU9iamVjdC5yZXBvcnRlcjtcbiAgICAgICAgICAgICAgbG9nLmluZm8oJ19nZXRIeXBlcnR5RnJvbURhdGFPYmplY3Q6ZGF0YU9iamVjdC5yZXBvcnRlcicsIGRhdGFPYmplY3QucmVwb3J0ZXIpO1xuICAgICAgICAgICAgICByZXNvbHZlKGRhdGFPYmplY3QucmVwb3J0ZXIpO1xuICAgICAgICAgICAgfSwgZXJyID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIEZ1bmN0aW9uIHRoYXQgcmVzb2x2ZSBhbmQgY3JlYXRlIHRoZSBkb21haW5VUkwgaW4gY2FzZSBpdCBpcyBwcm92aWRlZCBvbmUuIElmIG5vdCwgcmVzb2x2ZSB0aGUgZGVmYXVsdCBkb21haW5VUkxcbiAgKiBAcGFyYW0ge1N0cmluZ30gICAgIGlkcERvbWFpbiAgICAgaWRwRG9tYWluIChPcHRpb25hbClcbiAgKi9cbiAgX3Jlc29sdmVEb21haW4oaWRwRG9tYWluKSB7XG4gICAgaWYgKCFpZHBEb21haW4pIHtcbiAgICAgIHJldHVybiAnZG9tYWluLWlkcDovL2dvb2dsZS5jb20nO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ2RvbWFpbi1pZHA6Ly8nICsgaWRwRG9tYWluO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAgX3NlY29uZHNTaW5jZUVwb2NoKCkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgIH0qL1xufVxuXG5cbmV4cG9ydCBkZWZhdWx0IElkZW50aXR5TW9kdWxlO1xuIiwiLyoqXG4qIFByb3ZpZGVzIGFuIEFQSSB0byBtYW5hZ2UgaWRlbnRpdGllcyBmcm9tIG1zZyBidXMgcGlwZWxpbmVcbiogVE9ETzogcmVuYW1lIHRvIHNvbWV0aGluZyBsaWtlIElkZW50aXR5UGlwZWxpbmVIYW5kbGVyIGluIG9yZGVyIG5vdCB0byBjb25mbGljdCB3aXRoIGZyYW1ld29yayByZWxhdGVkIElkZW50aXR5SGFuZGxlclxuKi9cblxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmltcG9ydCBJZGVudGl0aWVzIGZyb20gJy4vSWRlbnRpdGllcyc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignSWRlbnRpdHlIYW5kbGVyJyk7XG5cbmNsYXNzIElkZW50aXR5SGFuZGxlciB7XG5cbiAgY29uc3RydWN0b3IoaWRtKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9pZG0gPSBpZG07XG5cbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIGNvbnNvbGUubG9nKCdJTSByZXNldCcpO1xuXG4gICAgLy8gdGhpcy5faWRtLmlkZW50aXRpZXMucmVzZXQoKTtcbiAgICB0aGlzLl9pZG0uaWRlbnRpdGllcyA9IG5ldyBJZGVudGl0aWVzKHRoaXMuX2lkbS5pZGVudGl0aWVzLl90eXBlLCB0aGlzLl9pZG0uaWRlbnRpdGllcy5fc3RvcmFnZU1hbmFnZXIpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMuX2lkbS5pZGVudGl0aWVzKTtcbiAgfVxuXG4gIF9pc1RvU2V0SUQobWVzc2FnZSkge1xuICAgIGxldCBzY2hlbWFzVG9JZ25vcmUgPSBbJ2RvbWFpbi1pZHAnLCAncnVudGltZScsICdkb21haW4nXTtcblxuICAgIGxldCBfZnJvbSA9IG1lc3NhZ2UuZnJvbTtcblxuICAgIGlmIChtZXNzYWdlLmJvZHkgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdzb3VyY2UnKSkge1xuICAgICAgX2Zyb20gPSBtZXNzYWdlLmJvZHkuc291cmNlO1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLmJvZHkgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdzdWJzY3JpYmVyJykpIHtcbiAgICAgIF9mcm9tID0gbWVzc2FnZS5ib2R5LnN1YnNjcmliZXI7XG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2ZvcndhcmQnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gU2lnbmFsbGluZyBNZXNzYWdlcyBiZXR3ZWVuIFAyUCBTdHVicyBkb24ndCBoYXZlIElkZW50aXRpZXMuIEZGU1xuICAgIGlmIChfZnJvbS5pbmNsdWRlcygnL3AycHJlcXVlc3Rlci8nKSB8fCBfZnJvbS5pbmNsdWRlcygnL3AycGhhbmRsZXIvJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgc3BsaXRGcm9tID0gKF9mcm9tKS5zcGxpdCgnOi8vJyk7XG4gICAgbGV0IGZyb21TY2hlbWEgPSBzcGxpdEZyb21bMF07XG4gICAgbGV0IGlzVG9JZ25vcmUgPSBzY2hlbWFzVG9JZ25vcmUuaW5kZXhPZihmcm9tU2NoZW1hKSA9PT0gLTE7XG5cbiAgICByZXR1cm4gaXNUb0lnbm9yZTtcbiAgfVxuXG4gIHByb2Nlc3NNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICBsb2cubG9nKCdbSWRlbnRpdHlIYW5kbGVyLnByb2Nlc3NNZXNzYWdlXSAnLCBtZXNzYWdlKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIC8vIHNraXAgbWVzc2FnZXMgdGhhdCBkb24ndCBuZWVkIGlkZW50aXR5IHRva2VucyBpbiB0aGUgYm9keVxuXG4gICAgICBpZiAoIXRoaXMuX2lzVG9TZXRJRChtZXNzYWdlKSkgcmV0dXJuIHJlc29sdmUobWVzc2FnZSk7XG5cbiAgICAgIC8qICAgICAgbGV0IGZyb20gPSBtZXNzYWdlLmZyb207XG4gICAgICBsZXQgc291cmNlVVJMID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCBtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdzb3VyY2UnKSkge1xuICAgICAgICBmcm9tID0gbWVzc2FnZS5ib2R5LnNvdXJjZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2ZvcndhcmQnKSB7XG4gICAgICAgIGZyb20gPSBtZXNzYWdlLmJvZHkuZnJvbTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoJ2JvZHknKSAmJiBtZXNzYWdlLmJvZHkuaGFzT3duUHJvcGVydHkoJ3N1YnNjcmliZXInKSkge1xuICAgICAgICBmcm9tID0gbWVzc2FnZS5ib2R5LnN1YnNjcmliZXI7XG4gICAgICB9Ki9cblxuICAgICAgdGhpcy5faWRtLmdldFRva2VuKG1lc3NhZ2UpLnRoZW4oKGlkZW50aXR5KSA9PiB7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykpIG1lc3NhZ2UuYm9keSA9IHt9O1xuXG4gICAgICAgIG1lc3NhZ2UuYm9keS5pZGVudGl0eSA9IGlkZW50aXR5O1xuICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICBsb2cuZXJyb3IocmVhc29uKTtcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG5cbiAgfVxuXG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgSWRlbnRpdHlIYW5kbGVyO1xuIiwiY2xhc3MgQWN0aW9uc1NlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgZW5mb3JjZVBvbGljaWVzKG1lc3NhZ2UsIGlzSW5jb21pbmdNZXNzYWdlKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBsZXQgcG9saWNpZXMgPSBfdGhpcy5jb250ZXh0LmdldFBvbGljaWVzKG1lc3NhZ2UsIGlzSW5jb21pbmdNZXNzYWdlKTtcblxuICAgICAgaWYgKHBvbGljaWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHBvbGljaWVzLnNlcnZpY2VQcm92aWRlclBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcG9saWNpZXMuc2VydmljZVByb3ZpZGVyUG9saWN5LmVuZm9yY2VBY3Rpb25zKF90aGlzLmNvbnRleHQsIG1lc3NhZ2UpLnRoZW4obWVzc2FnZXMgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlcyk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChwb2xpY2llcy51c2VyUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBvbGljaWVzLnVzZXJQb2xpY3kuZW5mb3JjZUFjdGlvbnMoX3RoaXMuY29udGV4dCwgbWVzc2FnZSkudGhlbihtZXNzYWdlcyA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZXMpO1xuICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShbbWVzc2FnZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShbbWVzc2FnZV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yd2FyZFRvSUQobWVzc2FnZSwgZW1haWwpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGlmICghX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkpIHRocm93IG5ldyBFcnJvcignZm9yd2FyZCBtZXNzYWdlIHRvIGdpdmVuIElEIGlzIHVuc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkuaHlwZXJ0aWVzTGlzdFswXS5oeXBlcnR5VVJMID09PSBtZXNzYWdlLnRvKSB7XG4gICAgICAgIGxldCBzcGxpdFRvID0gKG1lc3NhZ2UudG8pLnNwbGl0KCc6Ly8nKTtcbiAgICAgICAgaWYgKHNwbGl0VG9bMF0gIT09ICdydW50aW1lJykge1xuICAgICAgICAgIF90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5LmRpc2NvdmVySHlwZXJ0eVBlclVzZXIoZW1haWwpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2UudG8gPSByZXN1bHQuaHlwZXJ0eVVSTDtcbiAgICAgICAgICAgIG1lc3NhZ2UuYm9keS52aWEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUobWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmb3J3YXJkVG9IeXBlcnR5KG1lc3NhZ2UsIGh5cGVydHlVUkwpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGlmICghX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkpIHRocm93IG5ldyBFcnJvcignZm9yd2FyZCBtZXNzYWdlIHRvIGdpdmVuIElEIGlzIHVuc3VwcG9ydGVkIGluIHRoaXMgZW52aXJvbm1lbnQnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKF90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5Lmh5cGVydGllc0xpc3RbMF0uaHlwZXJ0eVVSTCA9PT0gbWVzc2FnZS50bykge1xuICAgICAgICBsZXQgc3BsaXRUbyA9IChtZXNzYWdlLnRvKS5zcGxpdCgnOi8vJyk7XG4gICAgICAgIGlmIChzcGxpdFRvWzBdICE9PSAncnVudGltZScpIHtcbiAgICAgICAgICBtZXNzYWdlLnRvID0gaHlwZXJ0eVVSTDtcbiAgICAgICAgICBtZXNzYWdlLmJvZHkudmlhID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgICAgX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNlbmRBdXRvbWF0aWNNZXNzYWdlKG1lc3NhZ2UsIHRleHQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IGF1dG9tYXRpY01lc3NhZ2UgPSB7XG4gICAgICAgIGZyb206IG1lc3NhZ2UudG8sXG4gICAgICAgIHRvOiBtZXNzYWdlLmZyb20sXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICB2YWx1ZTogdGV4dFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBtZXNzYWdlLnR5cGVcbiAgICAgIH07XG4gICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UoYXV0b21hdGljTWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBBY3Rpb25zU2VydmljZTtcbiIsImNsYXNzIE9wZXJhdG9ycyB7XG5cbiAgYW5kKHBhcmFtcykge1xuICAgIHJldHVybiBwYXJhbXNbMF0gJiYgcGFyYW1zWzFdO1xuICB9XG5cbiAgYmV0d2VlbihwYXJhbXMpIHtcbiAgICBsZXQgc3RhcnQgPSBwYXJzZUludChwYXJhbXNbMF1bMF0pO1xuICAgIGxldCBlbmQgPSBwYXJzZUludChwYXJhbXNbMF1bMV0pO1xuICAgIGxldCBub3cgPSBwYXJhbXNbMV07XG5cbiAgICBpZiAoZW5kIDwgc3RhcnQpIHtcbiAgICAgIG5vdyA9IChub3cgPCBzdGFydCkgPyBub3cgKz0gMjQwMCA6IG5vdztcbiAgICAgIGVuZCArPSAyNDAwO1xuICAgIH1cblxuICAgIHJldHVybiAobm93ID4gc3RhcnQgJiYgbm93IDwgZW5kKTtcbiAgfVxuXG4gIGVxdWFscyhwYXJhbXMpIHtcbiAgICByZXR1cm4gU3RyaW5nKHBhcmFtc1swXSkgPT09ICcqJyB8fCBTdHJpbmcocGFyYW1zWzBdKSA9PT0gU3RyaW5nKHBhcmFtc1sxXSk7XG4gIH1cblxuICBncmVhdGVyVGhhbihwYXJhbXMpIHtcbiAgICByZXR1cm4gcGFyYW1zWzFdID4gcGFyYW1zWzBdO1xuICB9XG5cbiAgaW4ocGFyYW1zKSB7XG4gICAgcmV0dXJuIHBhcmFtc1swXS5pbmRleE9mKHBhcmFtc1sxXSkgPiAtMTtcbiAgfVxuXG4gIGxlc3NUaGFuKHBhcmFtcykge1xuICAgIHJldHVybiBwYXJhbXNbMV0gPCBwYXJhbXNbMF07XG4gIH1cblxuICBub3QocGFyYW1zKSB7XG4gICAgcmV0dXJuICFwYXJhbXNbMF07XG4gIH1cblxuICBvcihwYXJhbXMpIHtcbiAgICByZXR1cm4gcGFyYW1zWzBdIHx8IHBhcmFtc1sxXTtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IE9wZXJhdG9ycztcbiIsImltcG9ydCBPcGVyYXRvcnMgZnJvbSAnLi9PcGVyYXRvcnMnO1xuXG4vKipcbiogVGhlIFBvbGljeSBEZWNpc2lvbiBQb2ludCAoUERQKSBkZWNpZGVzIGlmIGEgbWVzc2FnZSBpcyB0byBiZSBhdXRob3Jpc2VkIGJ5IGNoZWNraW5nIGEgc2V0IG9mXG4qIHBvbGljaWVzLiBUaGUgcmVzb3VyY2UgdG8gYmUgdmVyaWZpZWQgaXMgc3BlY2lmaWVkIGluIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSAnY29uZGl0aW9uJyBmaWVsZCBvZlxuKiBhIFBvbGljeSBvYmplY3QuIFRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHZlcmlmaWVzIGlmIHRoZSBtZXNzYWdlIGlzIGNvbXBsaWFudCB3aXRoIGEgcG9saWN5IGlzXG4qIHNwZWNpZmllZCBpbiBhIGhhc2h0YWJsZSB0byBhbGxvdyBkeW5hbWljIGRlZmluaXRpb24gb2YgdGhlIGltcGxlbWVudGF0aW9uLCBwcm92aWRpbmdcbiogZXh0ZW5zaWJpbGl0eSB0byB0aGUgUG9saWN5IEVuZ2luZSBmdW5jdGlvbmFsaXRpZXMuXG4qL1xuY2xhc3MgUERQIHtcblxuICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLm9wZXJhdG9ycyA9IG5ldyBPcGVyYXRvcnMoKTtcbiAgfVxuXG4gIGV2YWx1YXRlUG9saWNpZXMobWVzc2FnZSwgaXNJbmNvbWluZ01lc3NhZ2UpIHtcbiAgICBsZXQgcG9saWNpZXMgPSB0aGlzLmNvbnRleHQuZ2V0UG9saWNpZXMobWVzc2FnZSwgaXNJbmNvbWluZ01lc3NhZ2UpO1xuICAgIGxldCByZXN1bHQgPSAnTm90IEFwcGxpY2FibGUnO1xuICAgIGlmIChwb2xpY2llcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmV2YWx1YXRlUG9saWN5KG1lc3NhZ2UsIHBvbGljaWVzLnNlcnZpY2VQcm92aWRlclBvbGljeSwgaXNJbmNvbWluZ01lc3NhZ2UpO1xuICAgICAgaWYgKHJlc3VsdCB8fCByZXN1bHQgPT09ICdOb3QgQXBwbGljYWJsZScpIHtcbiAgICAgICAgbGV0IHVzZXJSZXN1bHQgPSB0aGlzLmV2YWx1YXRlUG9saWN5KG1lc3NhZ2UsIHBvbGljaWVzLnVzZXJQb2xpY3ksIGlzSW5jb21pbmdNZXNzYWdlKTtcbiAgICAgICAgaWYgKHVzZXJSZXN1bHQgIT09ICdOb3QgQXBwbGljYWJsZScpIHtcbiAgICAgICAgICByZXN1bHQgPSB1c2VyUmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGV2YWx1YXRlUG9saWN5KG1lc3NhZ2UsIHBvbGljeSwgaXNJbmNvbWluZykge1xuICAgIGxldCByZXN1bHQgPSAnTm90IEFwcGxpY2FibGUnO1xuICAgIGlmIChwb2xpY3kpIHtcbiAgICAgIHJlc3VsdCA9IHBvbGljeS5ldmFsdWF0ZVJ1bGVzKHRoaXMuY29udGV4dCwgbWVzc2FnZSwgaXNJbmNvbWluZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFBEUDtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLyoqXG4qIEBhdXRob3IgQW5hIENhbGRlaXJhIDxhbmEuY2FsZGVpcmFAdGVjbmljby51bGlzYm9hLnB0PlxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIGNvbWJpbmUgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb25zIHRoYXQgcmVzdWx0IGZyb20gcnVsZXMgZXZhbHVhdGlvbi5cbiovXG5jbGFzcyBBbGxvd092ZXJyaWRlcyB7XG5cbiAgLyoqXG4gICogR2l2ZW4gYW4gYXJyYXkgb2YgaW5kaXZpZHVhbCBhdXRob3JpemF0aW9uIGRlY2lzaW9ucywgcHJpb3JpdGl6ZXMgYSBwb3NpdGl2ZSBvbmUuXG4gICogQHBhcmFtICAgIHtib29sZWFuW119ICAgZGVjaXNpb25zXG4gICogQHJldHVybnMgIHtib29sZWFufVxuICAqL1xuICBjb21iaW5lKGRlY2lzaW9ucykge1xuICAgIGlmIChkZWNpc2lvbnMuaW5kZXhPZih0cnVlKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVjaXNpb25zLmluZGV4T2YoZmFsc2UpICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ05vdCBBcHBsaWNhYmxlJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBBbGxvd092ZXJyaWRlcztcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLyoqXG4qIEBhdXRob3IgQW5hIENhbGRlaXJhIDxhbmEuY2FsZGVpcmFAdGVjbmljby51bGlzYm9hLnB0PlxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIGNvbWJpbmUgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb25zIHRoYXQgcmVzdWx0IGZyb20gcnVsZXMgZXZhbHVhdGlvbi5cbiovXG5jbGFzcyBCbG9ja092ZXJyaWRlcyB7XG5cbiAgLyoqXG4gICogR2l2ZW4gYW4gYXJyYXkgb2YgaW5kaXZpZHVhbCBhdXRob3Jpc2F0aW9uIGRlY2lzaW9ucywgcHJpb3JpdGlzZXMgYSBuZWdhdGl2ZSBvbmUuXG4gICogQHBhcmFtICAgIHtib29sZWFuW119ICAgZGVjaXNpb25zXG4gICogQHJldHVybnMgIHtib29sZWFufVxuICAqL1xuICBjb21iaW5lKGRlY2lzaW9ucykge1xuICAgIGlmIChkZWNpc2lvbnMuaW5kZXhPZihmYWxzZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChkZWNpc2lvbnMuaW5kZXhPZih0cnVlKSAhPT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJ05vdCBBcHBsaWNhYmxlJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBCbG9ja092ZXJyaWRlcztcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLyoqXG4qIEBhdXRob3IgQW5hIENhbGRlaXJhIDxhbmEuY2FsZGVpcmFAdGVjbmljby51bGlzYm9hLnB0PlxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIGNvbWJpbmUgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb25zIHRoYXQgcmVzdWx0IGZyb20gcnVsZXMgZXZhbHVhdGlvbi5cbiovXG5jbGFzcyBGaXJzdEFwcGxpY2FibGUge1xuXG4gIC8qKlxuICAqIEdpdmVuIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgYXV0aG9yaXNhdGlvbiBkZWNpc2lvbnMsIHJldHVybnMgdGhlIGZpcnN0IG9uZSBkaWZmZXJlbnQgZnJvbSAnTm90IEFwcGxpY2FibGUnLCBlaXRoZXIgcG9zaXRpdmUgb3IgbmVnYXRpdmUuXG4gICogQHBhcmFtICAgIHtib29sZWFuW119ICAgICBkZWNpc2lvbnNcbiAgKiBAcmV0dXJucyAge2Jvb2xlYW59XG4gICovXG4gIGNvbWJpbmUoZGVjaXNpb25zKSB7XG4gICAgZm9yIChsZXQgaSBpbiBkZWNpc2lvbnMpIHtcbiAgICAgIGlmIChkZWNpc2lvbnNbaV0gIT09ICdOb3QgQXBwbGljYWJsZScpIHtcbiAgICAgICAgcmV0dXJuIGRlY2lzaW9uc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICdOb3QgQXBwbGljYWJsZSc7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBGaXJzdEFwcGxpY2FibGU7XG4iLCIvKipcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cbipcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKiovXG5cbmltcG9ydCBPcGVyYXRvcnMgZnJvbSAnLi4vT3BlcmF0b3JzJztcblxuLyoqXG4qIEBhdXRob3IgQW5hIENhbGRlaXJhIDxhbmEuY2FsZGVpcmFAdGVjbmljby51bGlzYm9hLnB0PlxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIHJlcHJlc2VudCBhIGNvbmRpdGlvbiBhbmQgZXZhbHVhdGUgaXRzIGFwcGxpY2FiaWxpdHkuXG4qL1xuY2xhc3MgQ29uZGl0aW9uIHtcblxuICAvKipcbiAgKiBDcmVhdGVzIGEgbmV3IENvbmRpdGlvbi5cbiAgKiBAY2xhc3NcbiAgKiBAcGFyYW0gIHtzdHJpbmd9ICBhdHRyaWJ1dGVcbiAgKiBAcGFyYW0gIHtzdHJpbmd9ICBvcGVyYXRvclxuICAqIEBwYXJhbSAgeyp9ICAgICAgIHBhcmFtc1xuICAqL1xuICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGUsIG9wZXJhdG9yLCBwYXJhbXMpIHtcbiAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gICAgdGhpcy5vcGVyYXRvcnMgPSBuZXcgT3BlcmF0b3JzKCk7XG4gIH1cblxuICAvKipcbiAgKiBWZXJpZmllcyBpZiB0aGUgY29uZGl0aW9uIGlzIGFwcGxpY2FibGUgdG8gdGhlIG1lc3NhZ2UuIEZpcnN0LCB0aGUgc3lzdGVtIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGF0dHJpYnV0ZSBpcyByZXRyaWV2ZWQ7IHRoZW4sIHRoYXQgdmFsdWUgaXMgY29tcGFyZWQgd2l0aCB0aGUgcGFyYW1ldGVyIHNwZWNpZmllZCBpbiB0aGUgY29uZGl0aW9uIGJ5IGV4ZWN1dGluZyB0aGUgb3BlcmF0b3IgaW1wbGVtZW50YXRpb24uIElmIHRoZSBvcGVyYXRvciBpcyAnaW4nIGFuZCB0aGUgbmFtZSBvZiBhIGdyb3VwIGlzIGdpdmVuLCB0aGVuIHRoZSBhcnJheSBob2xkaW5nIHRoZSBtZW1iZXJzIG9mIHRoZSBncm91cCBpcyByZXRyaWV2ZWQgYmVmb3JlIHRoZSBjb21wYXJpc29uLlxuICAqIEBwYXJhbSAge09iamVjdH0gICAgY29udGV4dCAgIGVudmlyb25tZW50IHdoZXJlIHRoZSBQb2xpY3kgRW5naW5lIGlzIGJlaW5nIHVzZWRcbiAgKiBAcGFyYW0gIHtPYmplY3R9ICAgIG1lc3NhZ2VcbiAgKi9cbiAgaXNBcHBsaWNhYmxlKGNvbnRleHQsIG1lc3NhZ2UpIHtcbiAgICBjb250ZXh0W3RoaXMuYXR0cmlidXRlXSA9IHsgbWVzc2FnZTogbWVzc2FnZSB9O1xuICAgIGxldCB2YWx1ZSA9IGNvbnRleHRbdGhpcy5hdHRyaWJ1dGVdO1xuICAgIGxldCB0ZW1wUGFyYW07XG5cbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJ2luJykge1xuICAgICAgaWYgKCEoQXJyYXkuaXNBcnJheSh0aGlzLnBhcmFtcykpKSB7XG4gICAgICAgIHRlbXBQYXJhbSA9IGNvbnRleHQuZ2V0R3JvdXAodGhpcy5wYXJhbXMsIG1lc3NhZ2UudG8pO1xuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0oW3RlbXBQYXJhbSwgdmFsdWVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0oW3RoaXMucGFyYW1zLCB2YWx1ZV0pO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29uZGl0aW9uO1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG5pbXBvcnQgQ29uZGl0aW9uIGZyb20gJy4vQ29uZGl0aW9uJztcblxuLyoqXG4qIEBhdXRob3IgQW5hIENhbGRlaXJhIDxhbmEuY2FsZGVpcmFAdGVjbmljby51bGlzYm9hLnB0PlxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIHJlcHJlc2VudCBhIHN1YnNjcmlwdGlvbiBjb25kaXRpb24gYW5kIGV2YWx1YXRlIGl0cyBhcHBsaWNhYmlsaXR5LlxuKi9cbmNsYXNzIFN1YnNjcmlwdGlvbkNvbmRpdGlvbiBleHRlbmRzIENvbmRpdGlvbiB7XG5cbiAgLyoqXG4gICogQ3JlYXRlcyBhIG5ldyBTdWJzY3JpcHRpb25Db25kaXRpb24uXG4gICogQGNsYXNzXG4gICogQHBhcmFtICB7c3RyaW5nfSAgYXR0cmlidXRlXG4gICogQHBhcmFtICB7c3RyaW5nfSAgb3BlcmF0b3JcbiAgKiBAcGFyYW0gIHsqfSAgICAgICBwYXJhbXNcbiAgKi9cbiAgY29uc3RydWN0b3IoYXR0cmlidXRlLCBvcGVyYXRvciwgcGFyYW1zKSB7XG4gICAgc3VwZXIoYXR0cmlidXRlLCBvcGVyYXRvciwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAqIFZlcmlmaWVzIGlmIHRoZSBzdWJzY3JpcHRpb24gY29uZGl0aW9uIGlzIGFwcGxpY2FibGUgdG8gdGhlIG1lc3NhZ2UuIEZpcnN0LCB2ZXJpZmllcyBpZiB0aGUgbWVzc2FnZSBpcyBvZiB0aGUgc3Vic2NyaXB0aW9uIHR5cGU7IHNlY29uZCwgdmVyaWZpZXMgaWYgdGhlIG1lc3NhZ2UgaXMgZnJvbSBhIHJlbW90ZSBydW50aW1lIHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBzdWJzY3JpcHRpb24gaXMgYmVpbmcgdmFsaWRhdGVkIGluIHRoZSBkZXN0aW5hdGlvbiBydW50aW1lOyB0aGlyZCwgdmVyaWZpZXMgaWYgdGhlIHN1YnNjcmlwdGlvbiBwcmVmZXJlbmNlIGlzIG1ldC5cbiAgKiBAcGFyYW0gIHtPYmplY3R9ICAgIGNvbnRleHQgICBlbnZpcm9ubWVudCB3aGVyZSB0aGUgUG9saWN5IEVuZ2luZSBpcyBiZWluZyB1c2VkXG4gICogQHBhcmFtICB7T2JqZWN0fSAgICBtZXNzYWdlXG4gICovXG4gIGlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlKSB7XG4gICAgbGV0IGlzU3Vic2NyaXB0aW9uID0gbWVzc2FnZS50eXBlID09PSAnc3Vic2NyaWJlJztcbiAgICBsZXQgaXNGcm9tUmVtb3RlU00gPSBjb250ZXh0LmlzRnJvbVJlbW90ZVNNKG1lc3NhZ2UuZnJvbSk7XG4gICAgaWYgKGlzU3Vic2NyaXB0aW9uICYgaXNGcm9tUmVtb3RlU00pIHtcbiAgICAgIHJldHVybiBzdXBlci5pc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBTdWJzY3JpcHRpb25Db25kaXRpb247XG4iLCJpbXBvcnQgQ29uZGl0aW9uIGZyb20gJy4vQ29uZGl0aW9uJztcbmltcG9ydCBPcGVyYXRvcnMgZnJvbSAnLi4vT3BlcmF0b3JzJztcbmltcG9ydCBTdWJzY3JpcHRpb25Db25kaXRpb24gZnJvbSAnLi9TdWJzY3JpcHRpb25Db25kaXRpb24nO1xuXG5jbGFzcyBBZHZhbmNlZENvbmRpdGlvbiB7XG5cbiAgY29uc3RydWN0b3IoY29uZGl0aW9uKSB7XG4gICAgdGhpcy5vcGVyYXRvcnMgPSBuZXcgT3BlcmF0b3JzKCk7XG4gICAgaWYgKGNvbmRpdGlvbi5vcGVyYXRvcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmNvbmRpdGlvbjtcbiAgICB9XG4gICAgY29uZGl0aW9uID0gdGhpcy5idWlsZENvbmRpdGlvbihjb25kaXRpb24pO1xuICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xuICB9XG5cbiAgYnVpbGRDb25kaXRpb24oY29uZGl0aW9uKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uWzFdKSkge1xuICAgICAgY29uZGl0aW9uWzFdID0gdGhpcy5idWlsZENvbmRpdGlvbihjb25kaXRpb25bMV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29uZGl0aW9uWzFdLmF0dHJpYnV0ZSA9PT0gJ3N1YnNjcmlwdGlvbicpIHtcbiAgICAgICAgY29uZGl0aW9uWzFdID0gbmV3IFN1YnNjcmlwdGlvbkNvbmRpdGlvbihjb25kaXRpb25bMV0uYXR0cmlidXRlLCBjb25kaXRpb25bMV0ub3BlcmF0b3IsIGNvbmRpdGlvblsxXS5wYXJhbXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uZGl0aW9uWzFdID0gbmV3IENvbmRpdGlvbihjb25kaXRpb25bMV0uYXR0cmlidXRlLCBjb25kaXRpb25bMV0ub3BlcmF0b3IsIGNvbmRpdGlvblsxXS5wYXJhbXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25kaXRpb25bMl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZGl0aW9uWzJdKSkge1xuICAgICAgICBjb25kaXRpb25bMl0gPSB0aGlzLmJ1aWxkQ29uZGl0aW9uKGNvbmRpdGlvblsyXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29uZGl0aW9uWzJdLmF0dHJpYnV0ZSA9PT0gJ3N1YnNjcmlwdGlvbicpIHtcbiAgICAgICAgICBjb25kaXRpb25bMl0gPSBuZXcgU3Vic2NyaXB0aW9uQ29uZGl0aW9uKGNvbmRpdGlvblsyXS5hdHRyaWJ1dGUsIGNvbmRpdGlvblsyXS5vcGVyYXRvciwgY29uZGl0aW9uWzJdLnBhcmFtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uWzJdID0gbmV3IENvbmRpdGlvbihjb25kaXRpb25bMl0uYXR0cmlidXRlLCBjb25kaXRpb25bMl0ub3BlcmF0b3IsIGNvbmRpdGlvblsyXS5wYXJhbXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb25kaXRpb247XG4gIH1cblxuICBpc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSwgc2NvcGUsIHRhcmdldCwgb3BlcmF0b3IsIGxlZnQsIHJpZ2h0KSB7XG4gICAgaWYgKCFvcGVyYXRvcikge1xuICAgICAgb3BlcmF0b3IgPSB0aGlzLmNvbmRpdGlvblswXTtcbiAgICAgIGxlZnQgPSB0aGlzLmNvbmRpdGlvblsxXTtcbiAgICAgIHJpZ2h0ID0gdGhpcy5jb25kaXRpb25bMl07XG4gICAgfVxuXG4gICAgd2hpbGUgKCEobGVmdCBpbnN0YW5jZW9mIENvbmRpdGlvbikgJiAhKGxlZnQgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb25Db25kaXRpb24pICYgKHR5cGVvZiBsZWZ0ICE9PSAnYm9vbGVhbicpKSB7XG4gICAgICBsZWZ0ID0gdGhpcy5pc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSwgc2NvcGUsIHRhcmdldCwgbGVmdFswXSwgbGVmdFsxXSwgbGVmdFsyXSk7XG4gICAgfVxuICAgIGlmIChyaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB3aGlsZSAoIShyaWdodCBpbnN0YW5jZW9mIENvbmRpdGlvbikgJiAhKHJpZ2h0IGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uQ29uZGl0aW9uKSAmICh0eXBlb2YgcmlnaHQgIT09ICdib29sZWFuJykpIHtcbiAgICAgICAgcmlnaHQgPSB0aGlzLmlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlLCBzY29wZSwgdGFyZ2V0LCByaWdodFswXSwgcmlnaHRbMV0sIHJpZ2h0WzJdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0TGVmdCA9ICh0eXBlb2YgbGVmdCA9PT0gJ2Jvb2xlYW4nKSA/IGxlZnQgOiBsZWZ0LmlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlLCBzY29wZSwgdGFyZ2V0KTtcbiAgICBsZXQgcmVzdWx0UmlnaHQ7XG4gICAgaWYgKHJpZ2h0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdFJpZ2h0ID0gKHR5cGVvZiByaWdodCA9PT0gJ2Jvb2xlYW4nKSA/IHJpZ2h0IDogcmlnaHQuaXNBcHBsaWNhYmxlKGNvbnRleHQsIG1lc3NhZ2UsIHNjb3BlLCB0YXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vcGVyYXRvcnNbb3BlcmF0b3JdKFtyZXN1bHRMZWZ0LCByZXN1bHRSaWdodF0pO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgQWR2YW5jZWRDb25kaXRpb247XG4iLCJpbXBvcnQgQWR2YW5jZWRDb25kaXRpb24gZnJvbSAnLi9jb25kaXRpb25zL0FkdmFuY2VkQ29uZGl0aW9uJztcbmltcG9ydCBDb25kaXRpb24gZnJvbSAnLi9jb25kaXRpb25zL0NvbmRpdGlvbic7XG5pbXBvcnQge2dldFVzZXJFbWFpbEZyb21VUkwsIGlzRGF0YU9iamVjdFVSTCwgcmVtb3ZlUGF0aEZyb21VUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBTdWJzY3JpcHRpb25Db25kaXRpb24gZnJvbSAnLi9jb25kaXRpb25zL0FkdmFuY2VkQ29uZGl0aW9uJztcblxuY2xhc3MgUnVsZSB7XG5cbiAgY29uc3RydWN0b3IoZGVjaXNpb24sIGNvbmRpdGlvbiwgc2NvcGUsIHRhcmdldCwgcHJpb3JpdHkpIHtcbiAgICB0aGlzLmRlY2lzaW9uID0gZGVjaXNpb247XG4gICAgdGhpcy5zZXRDb25kaXRpb24oY29uZGl0aW9uKTtcbiAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7XG4gICAgdGhpcy5zY29wZSA9IHNjb3BlO1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG5cbiAgc2V0Q29uZGl0aW9uKGNvbmRpdGlvbikge1xuICAgIGlmICghKGNvbmRpdGlvbiBpbnN0YW5jZW9mIENvbmRpdGlvbiB8fCBjb25kaXRpb24gaW5zdGFuY2VvZiBTdWJzY3JpcHRpb25Db25kaXRpb24gfHwgY29uZGl0aW9uIGluc3RhbmNlb2YgQWR2YW5jZWRDb25kaXRpb24pKSB7XG4gICAgICBsZXQgYXR0cmlidXRlID0gY29uZGl0aW9uLmF0dHJpYnV0ZTtcbiAgICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7XG4gICAgICAgIGNhc2UgJ3N1YnNjcmlwdGlvbic6XG4gICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBuZXcgU3Vic2NyaXB0aW9uQ29uZGl0aW9uKGNvbmRpdGlvbi5hdHRyaWJ1dGUsIGNvbmRpdGlvbi5vcGVyYXRvciwgY29uZGl0aW9uLnBhcmFtcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICAgIHRoaXMuY29uZGl0aW9uID0gbmV3IEFkdmFuY2VkQ29uZGl0aW9uKGNvbmRpdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBuZXcgQ29uZGl0aW9uKGNvbmRpdGlvbi5hdHRyaWJ1dGUsIGNvbmRpdGlvbi5vcGVyYXRvciwgY29uZGl0aW9uLnBhcmFtcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29uZGl0aW9uID0gY29uZGl0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGV2YWx1YXRlKGNvbnRleHQsIG1lc3NhZ2UsIGlzSW5jb21pbmcpIHtcbiAgICBsZXQgZmllbGQgPSAoaXNJbmNvbWluZykgPyBtZXNzYWdlLnRvIDogbWVzc2FnZS5mcm9tO1xuICAgIGxldCBoeXBlcnR5TmFtZTtcbiAgICBzd2l0Y2ggKHRoaXMuc2NvcGUpIHtcbiAgICAgIGNhc2UgJ2dsb2JhbCc6XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdoeXBlcnR5JzpcbiAgICAgICAgaWYgKGlzRGF0YU9iamVjdFVSTChmaWVsZCkpIHtcbiAgICAgICAgICBsZXQgcmVwb3J0ZXIgPSBjb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5nZXRSZXBvcnRlclVSTFN5bmNob25vdXMocmVtb3ZlUGF0aEZyb21VUkwoZmllbGQpKTtcbiAgICAgICAgICBpZiAocmVwb3J0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaHlwZXJ0eU5hbWUgPSBjb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5nZXRIeXBlcnR5TmFtZShyZXBvcnRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChmaWVsZC5zcGxpdCgnOi8vJylbMF0gPT09ICdoeXBlcnR5Jykge1xuICAgICAgICAgICAgaHlwZXJ0eU5hbWUgPSBjb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5nZXRIeXBlcnR5TmFtZShyZW1vdmVQYXRoRnJvbVVSTChmaWVsZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaHlwZXJ0eU5hbWUgPT09IHRoaXMudGFyZ2V0KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJ05vdCBBcHBsaWNhYmxlJztcblxuICAgICAgY2FzZSAnaWRlbnRpdHknOlxuICAgICAgICBsZXQgb3duZXI7XG5cbiAgICAgICAgaWYgKGlzRGF0YU9iamVjdFVSTChmaWVsZCkpIHtcbiAgICAgICAgICBsZXQgcmVwb3J0ZXIgPSBjb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5nZXRSZXBvcnRlclVSTFN5bmNob25vdXMocmVtb3ZlUGF0aEZyb21VUkwoZmllbGQpKTtcbiAgICAgICAgICBvd25lciA9IGNvbnRleHQucnVudGltZVJlZ2lzdHJ5LmdldEh5cGVydHlPd25lcihyZXBvcnRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGZpZWxkLnNwbGl0KCc6Ly8nKVswXSA9PT0gJ2h5cGVydHknKSB7XG4gICAgICAgICAgICBvd25lciA9IGNvbnRleHQucnVudGltZVJlZ2lzdHJ5LmdldEh5cGVydHlPd25lcihyZW1vdmVQYXRoRnJvbVVSTChmaWVsZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAob3duZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG93bmVyID0gZ2V0VXNlckVtYWlsRnJvbVVSTChvd25lcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG93bmVyID09PSB0aGlzLnRhcmdldCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICdOb3QgQXBwbGljYWJsZSc7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZGl0aW9uLmlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlLCB0aGlzLnNjb3BlLCB0aGlzLnRhcmdldCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlY2lzaW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJ05vdCBBcHBsaWNhYmxlJztcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUnVsZTtcbiIsImltcG9ydCBBbGxvd092ZXJyaWRlcyBmcm9tICcuL2NvbWJpbmluZ0FsZ29yaXRobXMvQWxsb3dPdmVycmlkZXMnO1xuaW1wb3J0IEJsb2NrT3ZlcnJpZGVzIGZyb20gJy4vY29tYmluaW5nQWxnb3JpdGhtcy9CbG9ja092ZXJyaWRlcyc7XG5pbXBvcnQgRmlyc3RBcHBsaWNhYmxlIGZyb20gJy4vY29tYmluaW5nQWxnb3JpdGhtcy9GaXJzdEFwcGxpY2FibGUnO1xuaW1wb3J0IFJ1bGUgZnJvbSAnLi9SdWxlJztcblxuY2xhc3MgUG9saWN5IHtcblxuICBjb25zdHJ1Y3RvcihrZXksIHJ1bGVzLCBhY3Rpb25zLCBjb21iaW5pbmdBbGdvcml0aG0pIHtcbiAgICBpZiAoIWtleSkgdGhyb3cgbmV3IEVycm9yKCdrZXkgaXMgbm90IGRlZmluZWQnKTtcbiAgICBpZiAoIWFjdGlvbnMpIHRocm93IG5ldyBFcnJvcignYWN0aW9ucyBhcmUgbm90IGRlZmluZWQnKTtcblxuICAgIHRoaXMuYWN0aW9ucyA9IGFjdGlvbnM7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdGhpcy5fc2V0UnVsZXMocnVsZXMpO1xuICAgIHRoaXMuX3NldENvbWJpbmluZ0FsZ29yaXRobShjb21iaW5pbmdBbGdvcml0aG0pO1xuICB9XG5cbiAgYWRkQWN0aW9uKG1ldGhvZCwgcGFyYW0pIHtcbiAgICB0aGlzLmFjdGlvbnMucHVzaCh7IG1ldGhvZDogbWV0aG9kLCBwYXJhbTogcGFyYW0gfSk7XG4gIH1cblxuICBjcmVhdGVSdWxlKGRlY2lzaW9uLCBjb25kaXRpb24sIHNjb3BlLCB0YXJnZXQsIHByaW9yaXR5KSB7XG4gICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHByaW9yaXR5ID0gdGhpcy5nZXRMYXN0UHJpb3JpdHkoKSArIDE7XG4gICAgfVxuICAgIGxldCBydWxlID0gbmV3IFJ1bGUoZGVjaXNpb24sIGNvbmRpdGlvbiwgc2NvcGUsIHRhcmdldCwgcHJpb3JpdHkpO1xuICAgIHRoaXMucnVsZXMucHVzaChydWxlKTtcbiAgfVxuXG4gIGRlbGV0ZVJ1bGUocnVsZSkge1xuICAgIGxldCBpbmRleFRvUmVtb3ZlID0gdGhpcy5ydWxlcy5pbmRleE9mKHJ1bGUpO1xuICAgIHRoaXMucnVsZXMuc3BsaWNlKGluZGV4VG9SZW1vdmUsIDEpO1xuICB9XG5cbiAgZW5mb3JjZUFjdGlvbnMoY29udGV4dCwgbWVzc2FnZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmFjdGlvbnMpIHtcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gY29udGV4dC5wZXAuYWN0aW9uc1NlcnZpY2VbdGhpcy5hY3Rpb25zW2ldLm1ldGhvZF0obWVzc2FnZSwgdGhpcy5hY3Rpb25zW2ldLnBhcmFtKTtcbiAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICBQcm9taXNlLmFsbChyZXN1bHRzKS50aGVuKChtZXNzYWdlcykgPT4ge1xuICAgICAgICAgIHJlc29sdmUobWVzc2FnZXMpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKFttZXNzYWdlXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBldmFsdWF0ZVJ1bGVzKGNvbnRleHQsIG1lc3NhZ2UsIGlzSW5jb21pbmcpIHtcbiAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgaW4gdGhpcy5ydWxlcykge1xuICAgICAgcmVzdWx0cy5wdXNoKHRoaXMucnVsZXNbaV0uZXZhbHVhdGUoY29udGV4dCwgbWVzc2FnZSwgaXNJbmNvbWluZykpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbWJpbmluZ0FsZ29yaXRobS5jb21iaW5lKHJlc3VsdHMpO1xuICB9XG5cbiAgZ2V0TGFzdFByaW9yaXR5KCkge1xuICAgIGxldCBwcmlvcml0aWVzID0gW107XG5cbiAgICBpZiAodGhpcy5ydWxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgIGZvciAobGV0IGkgaW4gdGhpcy5ydWxlcykge1xuICAgICAgICBwcmlvcml0aWVzLnB1c2godGhpcy5ydWxlc1tpXS5wcmlvcml0eSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgcHJpb3JpdGllcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gIH1cblxuICBnZXRSdWxlQnlQcmlvcml0eShwcmlvcml0eSkge1xuICAgIGZvciAobGV0IGkgaW4gdGhpcy5ydWxlcykge1xuICAgICAgaWYgKFN0cmluZyh0aGlzLnJ1bGVzW2ldLnByaW9yaXR5KSA9PT0gU3RyaW5nKHByaW9yaXR5KSkge1xuICAgICAgICByZXR1cm4gdGhpcy5ydWxlc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgRXJyb3IoJ1J1bGUgd2l0aCBwcmlvcml0eSAnICsgcHJpb3JpdHkgKyAnIGRvZXMgbm90IGV4aXN0IScpO1xuICB9XG5cbiAgX3NldENvbWJpbmluZ0FsZ29yaXRobShjb21iaW5pbmdBbGdvcml0aG0pIHtcbiAgICBpZiAoIWNvbWJpbmluZ0FsZ29yaXRobSkge1xuICAgICAgY29tYmluaW5nQWxnb3JpdGhtID0gJ2Jsb2NrT3ZlcnJpZGVzJztcbiAgICB9XG4gICAgc3dpdGNoIChjb21iaW5pbmdBbGdvcml0aG0pIHtcbiAgICAgIGNhc2UgJ2Jsb2NrT3ZlcnJpZGVzJzpcbiAgICAgICAgdGhpcy5jb21iaW5pbmdBbGdvcml0aG0gPSBuZXcgQmxvY2tPdmVycmlkZXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhbGxvd092ZXJyaWRlcyc6XG4gICAgICAgIHRoaXMuY29tYmluaW5nQWxnb3JpdGhtID0gbmV3IEFsbG93T3ZlcnJpZGVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmlyc3RBcHBsaWNhYmxlJzpcbiAgICAgICAgdGhpcy5jb21iaW5pbmdBbGdvcml0aG0gPSBuZXcgRmlyc3RBcHBsaWNhYmxlKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gYWxnb3JpdGhtOiAnICsgY29tYmluaW5nQWxnb3JpdGhtKTtcbiAgICB9XG4gIH1cblxuICBfc2V0UnVsZXMocnVsZXMpIHtcbiAgICB0aGlzLnJ1bGVzID0gW107XG5cbiAgICBmb3IgKGxldCBpIGluIHJ1bGVzKSB7XG4gICAgICBsZXQgcnVsZSA9IHJ1bGVzW2ldO1xuICAgICAgaWYgKHJ1bGUucHJpb3JpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBydWxlLnByaW9yaXR5ID0gdGhpcy5nZXRMYXN0UHJpb3JpdHkoKSArIDE7XG4gICAgICB9XG4gICAgICBpZiAoIShydWxlIGluc3RhbmNlb2YgUnVsZSkpIHtcbiAgICAgICAgcnVsZSA9IG5ldyBSdWxlKHJ1bGUuZGVjaXNpb24sIHJ1bGUuY29uZGl0aW9uLCBydWxlLnNjb3BlLCBydWxlLnRhcmdldCwgcnVsZS5wcmlvcml0eSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJ1bGVzLnB1c2gocnVsZSk7XG4gICAgfVxuICB9XG5cbiAgc29ydFJ1bGVzKCkge1xuICAgIHJldHVybiB0aGlzLnJ1bGVzLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgbGV0IHggPSBhLnByaW9yaXR5OyBsZXQgeSA9IGIucHJpb3JpdHk7XG4gICAgICByZXR1cm4gKCh4IDwgeSkgPyAtMSA6ICgoeCA+IHkpID8gMSA6IDApKTtcbiAgICB9KTtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFBvbGljeTtcbiIsIi8vIExvZyBTeXN0ZW1cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignUEVQJyk7XG5cbmltcG9ydCBBY3Rpb25zU2VydmljZSBmcm9tICcuL0FjdGlvbnNTZXJ2aWNlJztcbmltcG9ydCBQRFAgZnJvbSAnLi9QRFAnO1xuaW1wb3J0IFBvbGljeSBmcm9tICcuL1BvbGljeSc7XG5pbXBvcnQge2lzSHlwZXJ0eVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG5jbGFzcyBQRVAge1xuXG4gIC8qKlxuICAqIENyZWF0ZXMgYSBQb2xpY3kgRW5mb3JjZW1lbnQgUG9pbnQgKFBFUCkgaW5zdGFuY2VcbiAgKiBAcGFyYW0gICAge09iamVjdH0gICAgY29udGV4dFxuICAqL1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLnBkcCA9IG5ldyBQRFAoY29udGV4dCk7XG4gICAgX3RoaXMuYWN0aW9uc1NlcnZpY2UgPSBuZXcgQWN0aW9uc1NlcnZpY2UoY29udGV4dCk7XG4gICAgX3RoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgY29udGV4dC5wZXAgPSBfdGhpcztcblxuICAgIC8vVE9ETyBzaG91bGQgYmUgYWRkZWQgYSB0cmlnZ2VyIHRvIHZlcmlmeSB3aGVuIHRoZSBsb2FkQ29uZmlndXJhdGlvbnMgaXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZFxuICAgIGNvbnRleHQubG9hZENvbmZpZ3VyYXRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgKiByZXR1cm4gdGhlIG1lc3NhZ2VCdXMgaW4gdGhpcyBSZWdpc3RyeVxuICAqIEBwYXJhbSB7TWVzc2FnZUJ1c30gICAgICAgICAgIG1lc3NhZ2VCdXNcbiAgKi9cbiAgZ2V0IG1lc3NhZ2VCdXMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuY29udGV4dC5tZXNzYWdlQnVzO1xuICB9XG5cbiAgLyoqXG4gICogU2V0IHRoZSBtZXNzYWdlQnVzIGluIHRoaXMgUmVnaXN0cnlcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXG4gICovXG4gIHNldCBtZXNzYWdlQnVzKG1lc3NhZ2VCdXMpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLmNvbnRleHQubWVzc2FnZUJ1cyA9IG1lc3NhZ2VCdXM7XG4gICAgX3RoaXMuYWRkR1VJTGlzdGVuZXJzKCk7XG4gIH1cblxuICBhZGRHVUlMaXN0ZW5lcnMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLmNvbnRleHQubWVzc2FnZUJ1cy5hZGRMaXN0ZW5lcihfdGhpcy5jb250ZXh0LnBlcFVSTCwgKG1zZykgPT4ge1xuICAgICAgbGV0IGZ1bmNOYW1lID0gbXNnLmJvZHkubWV0aG9kO1xuXG4gICAgICBsZXQgcmV0dXJuZWRWYWx1ZTtcbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gJ2FkZFRvR3JvdXAnKSB7XG4gICAgICAgIGxldCBncm91cE5hbWUgPSBtc2cuYm9keS5wYXJhbXMuZ3JvdXBOYW1lO1xuICAgICAgICBsZXQgdXNlckVtYWlsID0gbXNnLmJvZHkucGFyYW1zLnVzZXJFbWFpbDtcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuYWRkVG9Hcm91cChncm91cE5hbWUsIHVzZXJFbWFpbCk7XG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnY3JlYXRlR3JvdXAnKSB7XG4gICAgICAgIGxldCBncm91cE5hbWUgPSBtc2cuYm9keS5wYXJhbXMuZ3JvdXBOYW1lO1xuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC5jcmVhdGVHcm91cChncm91cE5hbWUpO1xuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2FkZFBvbGljeScpIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IG1zZy5ib2R5LnBhcmFtcy5zb3VyY2U7XG4gICAgICAgIGxldCBrZXkgPSBtc2cuYm9keS5wYXJhbXMua2V5O1xuICAgICAgICBsZXQgcG9saWN5ID0gbXNnLmJvZHkucGFyYW1zLnBvbGljeTtcbiAgICAgICAgbGV0IGNvbWJpbmluZ0FsZ29yaXRobSA9IG1zZy5ib2R5LnBhcmFtcy5jb21iaW5pbmdBbGdvcml0aG07XG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5hZGRQb2xpY3koc291cmNlLCBrZXksIHBvbGljeSwgY29tYmluaW5nQWxnb3JpdGhtKTtcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdkZWxldGVHcm91cCcpIHtcbiAgICAgICAgbGV0IGdyb3VwTmFtZSA9IG1zZy5ib2R5LnBhcmFtcy5ncm91cE5hbWU7XG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LmRlbGV0ZUdyb3VwKGdyb3VwTmFtZSk7XG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAncmVtb3ZlUG9saWN5Jykge1xuICAgICAgICBsZXQgc291cmNlID0gbXNnLmJvZHkucGFyYW1zLnNvdXJjZTtcbiAgICAgICAgbGV0IGtleSA9IG1zZy5ib2R5LnBhcmFtcy5rZXk7XG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5yZW1vdmVQb2xpY3koc291cmNlLCBrZXkpO1xuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ3NhdmVQb2xpY2llcycpIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IG1zZy5ib2R5LnBhcmFtcy5zb3VyY2U7XG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcyhzb3VyY2UpO1xuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ3VzZXJQb2xpY2llcycpIHtcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQudXNlclBvbGljaWVzO1xuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2FjdGl2ZVVzZXJQb2xpY3knKSB7XG4gICAgICAgIGxldCB1c2VyUG9saWN5ID0gbXNnLmJvZHkucGFyYW1zLnVzZXJQb2xpY3k7XG4gICAgICAgIGlmICh1c2VyUG9saWN5KSB7IF90aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeSA9IHVzZXJQb2xpY3k7IH1cbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeTtcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICd1c2VyUG9saWN5Jykge1xuICAgICAgICBsZXQga2V5ID0gbXNnLmJvZHkucGFyYW1zLmtleTtcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQudXNlclBvbGljaWVzW2tleV07XG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnc2F2ZUFjdGl2ZVBvbGljeScpIHtcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuc2F2ZUFjdGl2ZVBvbGljeSgpO1xuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2dldE15RW1haWxzJykge1xuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC5nZXRNeUVtYWlscygpO1xuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2dldE15SHlwZXJ0aWVzJykge1xuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC5nZXRNeUh5cGVydGllcygpO1xuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2dyb3VwcycpIHtcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuZ3JvdXBzO1xuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2dldEdyb3Vwc05hbWVzJykge1xuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC5nZXRHcm91cHNOYW1lcygpO1xuICAgICAgfSBpZiAoZnVuY05hbWUgPT09ICdyZW1vdmVGcm9tR3JvdXAnKSB7XG4gICAgICAgIGxldCBncm91cE5hbWUgPSBtc2cuYm9keS5wYXJhbXMuZ3JvdXBOYW1lO1xuICAgICAgICBsZXQgdXNlckVtYWlsID0gbXNnLmJvZHkucGFyYW1zLnVzZXJFbWFpbDtcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQucmVtb3ZlRnJvbUdyb3VwKGdyb3VwTmFtZSwgdXNlckVtYWlsKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbHVlID0ge3R5cGU6ICdleGVjdXRlJywgdmFsdWU6IHJldHVybmVkVmFsdWUsIGNvZGU6IDIwMH07XG4gICAgICBsZXQgcmVwbHlNc2cgPSB7aWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgdG86IG1zZy5mcm9tLCBmcm9tOiBtc2cudG8sIGJvZHk6IHZhbHVlfTtcbiAgICAgIF90aGlzLmNvbnRleHQubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShyZXBseU1zZyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBBZGRzIGEgcG9saWN5IHRvIHRoZSBQb2xpY3kgRW5mb3JjZW1lbnQgUG9pbnQgKFBFUCkuIFRoZSBwb2xpY3kgY2FuIGJlIGNyZWF0ZWQgYnkgdGhlIHNlcnZpY2VcbiAgKiBwcm92aWRlciBvciBieSB0aGUgdXNlci5cbiAgKiBAcGFyYW0gICAge1N0cmluZ30gICAgc291cmNlXG4gICogQHBhcmFtICAgIHtTdHJpbmd9ICAgIGtleVxuICAqIEBwYXJhbSAgICB7T2JqZWN0fSAgICBwb2xpY3lcbiAgKi9cbiAgYWRkUG9saWN5KHNvdXJjZSwga2V5LCBwb2xpY3ksIGNvbWJpbmluZ0FsZ29yaXRobSkge1xuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgRXJyb3IoJ3NvdXJjZSBpcyBub3QgZGVmaW5lZCcpO1xuICAgIGlmICgha2V5KSB0aHJvdyBuZXcgRXJyb3IoJ2tleSBpcyBub3QgZGVmaW5lZCcpO1xuXG4gICAgaWYgKHBvbGljeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwb2xpY3kgPSBuZXcgUG9saWN5KGtleSwgW10sIFtdLCBjb21iaW5pbmdBbGdvcml0aG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIShwb2xpY3kgaW5zdGFuY2VvZiBQb2xpY3kpKSB7XG4gICAgICAgIHBvbGljeSA9IG5ldyBQb2xpY3kocG9saWN5LmtleSwgcG9saWN5LnJ1bGVzLCBwb2xpY3kuYWN0aW9ucywgcG9saWN5LmNvbWJpbmluZ0FsZ29yaXRobSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgIGNhc2UgJ1NFUlZJQ0VfUFJPVklERVInOlxuICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZVBvbGljaWVzKHNvdXJjZSwgcG9saWN5LCBrZXkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1VTRVInOlxuICAgICAgICB0aGlzLmNvbnRleHQudXNlclBvbGljaWVzW2tleV0gPSBwb2xpY3k7XG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlUG9saWNpZXMoc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBwb2xpY3kgc291cmNlOiAnICsgc291cmNlKTtcbiAgICB9XG4gIH1cblxuICBhdXRob3Jpc2UobWVzc2FnZSwgaXNJbmNvbWluZykge1xuICAgIC8vIGxvZy5sb2coJ1tQb2xpY3kuUEVQIEF1dGhvcmlzZV0gJywgbWVzc2FnZSk7XG4gICAgLy8gbG9nLmxvZyhtZXNzYWdlKTtcbiAgICBpZiAoIW1lc3NhZ2UpIHRocm93IG5ldyBFcnJvcignbWVzc2FnZSBpcyBub3QgZGVmaW5lZCcpO1xuICAgIGlmICghbWVzc2FnZS5mcm9tKSB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UuZnJvbSBpcyBub3QgZGVmaW5lZCcpO1xuICAgIGlmICghbWVzc2FnZS50bykgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlLnRvIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgaWYgKCFtZXNzYWdlLnR5cGUpIHRocm93IG5ldyBFcnJvcignbWVzc2FnZS50eXBlIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgbWVzc2FnZS5ib2R5ID0gbWVzc2FnZS5ib2R5IHx8IHt9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgbWVzc2FnZS5ib2R5ID0gbWVzc2FnZS5ib2R5IHx8IHt9O1xuICAgICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgICAgbGV0IHJlc3VsdCA9IF90aGlzLnBkcC5ldmFsdWF0ZVBvbGljaWVzKG1lc3NhZ2UsIGlzSW5jb21pbmcpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gJ05vdCBBcHBsaWNhYmxlJykge1xuICAgICAgICByZXN1bHQgPSBfdGhpcy5jb250ZXh0LmRlZmF1bHRCZWhhdmlvdXI7XG4gICAgICAgIG1lc3NhZ2UuYm9keS5hdXRoID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBfdGhpcy5hY3Rpb25zU2VydmljZS5lbmZvcmNlUG9saWNpZXMobWVzc2FnZSwgaXNJbmNvbWluZykudGhlbihtZXNzYWdlcyA9PiB7XG4gICAgICAgIGZvciAobGV0IGkgaW4gbWVzc2FnZXMpIHtcbiAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZXNbaV07XG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgbWVzc2FnZS5ib2R5LmF1dGggPSAobWVzc2FnZS5ib2R5LmF1dGggPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogbWVzc2FnZS5ib2R5LmF1dGg7XG4gICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0geyBib2R5OiB7IGNvZGU6IDQwMywgZGVzY3JpcHRpb246ICdCbG9ja2VkIGJ5IHBvbGljeScgfSwgZnJvbTogbWVzc2FnZS50bywgdG86IG1lc3NhZ2UuZnJvbSwgdHlwZTogJ3Jlc3BvbnNlJyB9O1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cbiAgYXV0aG9yaXNlU3luYyhtZXNzYWdlKSB7XG4gICAgbGV0IHJlc3VsdDtcbiAgICBtZXNzYWdlLmJvZHkgPSBtZXNzYWdlLmJvZHkgfHwge307XG4gICAgcmVzdWx0ID0gdGhpcy5wZHAuZXZhbHVhdGVQb2xpY2llcyhtZXNzYWdlLCB0cnVlKTtcbiAgICBpZiAocmVzdWx0ID09PSAnTm90IEFwcGxpY2FibGUnKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLmNvbnRleHQuZGVmYXVsdEJlaGF2aW91cjtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcblxuICB9XG5cbiAgcmVtb3ZlUG9saWN5KHNvdXJjZSwga2V5KSB7XG4gICAgaWYgKCFzb3VyY2UpIHRocm93IG5ldyBFcnJvcignc291cmNlIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgaWYgKHNvdXJjZSAhPT0gJyonICYmICFrZXkpIHRocm93IG5ldyBFcnJvcigna2V5IGlzIG5vdCBkZWZpbmVkJyk7XG5cbiAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgY2FzZSAnKic6XG4gICAgICAgIHRoaXMuY29udGV4dC5zZXJ2aWNlUHJvdmlkZXJQb2xpY3kgPSB7fTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnVzZXJQb2xpY2llcyA9IHt9O1xuICAgICAgICB0aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcygnVVNFUicpO1xuICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZVBvbGljaWVzKCdTRVJWSUNFX1BST1ZJREVSJyk7XG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlQWN0aXZlUG9saWN5KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnU0VSVklDRV9QUk9WSURFUic6XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNvbnRleHQuc2VydmljZVByb3ZpZGVyUG9saWN5W2tleV07XG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlUG9saWNpZXMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdVU0VSJzpcbiAgICAgICAgZGVsZXRlIHRoaXMuY29udGV4dC51c2VyUG9saWNpZXNba2V5XTtcbiAgICAgICAgaWYgKGtleSA9PT0gdGhpcy5jb250ZXh0LmFjdGl2ZVVzZXJQb2xpY3kpIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZUFjdGl2ZVBvbGljeSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlUG9saWNpZXMoJ1VTRVInKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBwb2xpY3kgc291cmNlOiAnICsgc291cmNlKTtcbiAgICB9XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBQRVA7XG4iLCIvKipcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cbipcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKiovXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1BpcGVsaW5lJyk7XG5cbi8qKlxuKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXG4qIFNlcXVlbmNpYWwgcHJvY2Vzc29yIG9mIG1ldGhvZHMuIFNpbWlsYXIgdG8gaG93IFNlcXVlbnRpYWwgUHJvbWlzZSdzIHdvcmssIGJ1dCBiZXR0ZXIgZml0IGZvciBtZXNzYWdlIHByb2Nlc3NpbmcuXG4qIE5vcm1hbCB1c2UgZm9yIHRoaXMsIGlzIHRvIGludGVyY2VwdCBhbGwgbWVzc2FnZXMgd2l0aCBjb25maWd1cmVkIGhhbmRsZXJzLCBhbmQgYWN0IGFjY29yZGluZ2x5LlxuKi9cblxuaW1wb3J0IHtpc0RhdGFPYmplY3RVUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcblxuY2xhc3MgUGlwZWxpbmUge1xuICAvKiBwdWJsaWNcbiAgICBoYW5kbGVyczogKChQaXBlQ29udGV4dCkgPT4gdm9pZClbXVxuICAgIG9uRmFpbDogKGVycm9yKSA9PiB2b2lkXG4gICovXG5cbiAgY29uc3RydWN0b3IoX29uRmFpbCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5oYW5kbGVycyA9IFtdO1xuICAgIF90aGlzLm9uRmFpbCA9IF9vbkZhaWw7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGEgbWVzc2FnZSBpbiB0aGUgcGlwZWxpbmUgcXVldWUuIEFsbCBtZXNzYWdlcyBhcmUgd3JhcHBlZCB3aXRoIGEgUGlwZUNvbnRleHQuXG4gICAqIEBwYXJhbSAge01lc3NhZ2V9IG1zZyAgICAgICBNZXNzYWdlIGZvciB0aGUgcXVldWVcbiAgICogQHBhcmFtICB7Q2FsbGJhY2t9IG9uRGVsaXZlciBXaGVuIG1lc3NhZ2UgaXMgZmluaXNoZWQgcHJvY2Vzc2luZyBmcm9tIGFsbCBoYW5kbGVycywgaXQgd2lsbCBiZSBkZWxpdmVyZWQgaW4gdGhpcyBjYWxsYmFjay5cbiAgICovXG4gIHByb2Nlc3MobXNnLCBvbkRlbGl2ZXIpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKF90aGlzLmhhbmRsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBpdGVyID0gbmV3IEl0ZXJhdG9yKF90aGlzLmhhbmRsZXJzKTtcbiAgICAgIGl0ZXIubmV4dChuZXcgUGlwZUNvbnRleHQoX3RoaXMsIGl0ZXIsIG1zZywgb25EZWxpdmVyKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uRGVsaXZlcihtc2cpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiogQGF1dGhvciBtaWNhZWxwZWRyb3NhQGdtYWlsLmNvbVxuKiBXcmFwcGVyIGFyb3VuZCBhIG1lc3NhZ2UgdGhhdCBhZGRzIGFjdGlvbnMgdGhhdCBjYW4gYmUgZmlyZWQgYnkgYW55IGludGVyY2VwdG9yIGhhbmRsZXIuXG4qIFRoZSBQaXBlbGluZSBpcyBhc3luY2hyb25vdXMsIHNvIGFuIGhhbmRsZXIgc2hvdWxkIGFsd2F5cyBjYWxsIGFuIGFjdGlvbiwgdGhlIGRlZmF1bHQgb25lIGlzIFwibmV4dCgpXCJcbiovXG5jbGFzcyBQaXBlQ29udGV4dCB7XG4gIC8qIHByaXZhdGVcbiAgICBfaW5TdG9wOiBib29sZWFuXG5cbiAgICBfcGlwZWxpbmU6IFBpcGVsaW5lXG4gICAgX2l0ZXI6IEl0ZXJhdG9yXG4gICAgX21zZzogTWVzc2FnZVxuICAqL1xuXG4gIGNvbnN0cnVjdG9yKHBpcGVsaW5lLCBpdGVyLCBtc2csIG9uRGVsaXZlcikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5faW5TdG9wID0gZmFsc2U7XG5cbiAgICBfdGhpcy5fcGlwZWxpbmUgPSBwaXBlbGluZTtcbiAgICBfdGhpcy5faXRlciA9IGl0ZXI7XG4gICAgX3RoaXMuX21zZyA9IG1zZztcbiAgICBfdGhpcy5fb25EZWxpdmVyID0gb25EZWxpdmVyO1xuICB9XG5cbiAgZ2V0IHBpcGVsaW5lKCkgeyByZXR1cm4gdGhpcy5fcGlwZWxpbmU7IH1cblxuICBnZXQgbXNnKCkgeyByZXR1cm4gdGhpcy5fbXNnOyB9XG4gIHNldCBtc2coaW5Nc2cpIHsgdGhpcy5fbXNnID0gaW5Nc2c7IH1cblxuICAvKipcbiAgICogUHJvY2VlZCB0byB0aGUgbmV4dCBpbnRlcmNlcHRvciBoYW5kbGVyLCB1bmxlc3MgdGhlcmUgd2FzIGFuIGVycm9yLiBJZiBpdCdzIHRoZSBsYXN0IG9uZSwgcHJvY2VlZCB0byBvbkRlbGl2ZXIgaGFuZGxlci5cbiAgICovXG4gIG5leHQoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmICghX3RoaXMuX2luU3RvcCkge1xuICAgICAgaWYgKF90aGlzLl9pdGVyLmhhc05leHQpIHtcbiAgICAgICAgX3RoaXMuX2l0ZXIubmV4dChfdGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpcy5fb25EZWxpdmVyKF90aGlzLl9tc2cpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZWVkIGRpcmVjdGx5IHRvIHRoZSBvbkRlbGl2ZXIgaGFuZGxlciwgdW5sZXNzIHRoZXJlIHdhcyBhbiBlcnJvci5cbiAgICovXG4gIGRlbGl2ZXIoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBpZiAoIV90aGlzLl9pblN0b3ApIHtcbiAgICAgIF90aGlzLl9pblN0b3AgPSB0cnVlO1xuICAgICAgX3RoaXMuX29uRGVsaXZlcihfdGhpcy5fbXNnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFyayB0aGUgY29udGV4dCB3aXRoIGFuIGVycm9yIGFuZCBwcm9jZWVkIHRvIHRoZSBvbkZhaWwgaGFuZGxlci5cbiAgICogQHBhcmFtICB7W3R5cGVdfSBlcnJvciBbZGVzY3JpcHRpb25dXG4gICAqL1xuICBmYWlsKGVycm9yKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmICghX3RoaXMuX2luU3RvcCkge1xuICAgICAgX3RoaXMuX2luU3RvcCA9IHRydWU7XG4gICAgICBpZiAoX3RoaXMuX3BpcGVsaW5lLm9uRmFpbCkge1xuICAgICAgICBfdGhpcy5fcGlwZWxpbmUub25GYWlsKGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG5cblxufVxuXG5jbGFzcyBJdGVyYXRvciB7XG4gIC8qIHByaXZhdGVcbiAgICBfaW5kZXg6IG51bWJlclxuICAgIF9hcnJheTogW11cbiAgKi9cblxuICBjb25zdHJ1Y3RvcihhcnJheSkge1xuICAgIHRoaXMuX2luZGV4ID0gLTE7XG4gICAgdGhpcy5fYXJyYXkgPSBhcnJheTtcbiAgfVxuXG4gIGdldCBoYXNOZXh0KCkge1xuICAgIHJldHVybiB0aGlzLl9pbmRleCA8IHRoaXMuX2FycmF5Lmxlbmd0aCAtIDE7XG4gIH1cblxuICBnZXQgbmV4dCgpIHtcbiAgICB0aGlzLl9pbmRleCsrO1xuICAgIHJldHVybiB0aGlzLl9hcnJheVt0aGlzLl9pbmRleF07XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGlwZWxpbmU7XG4iLCIvKipcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cbipcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKiovXG5cbi8vIExvZyBzeXN0ZW1cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignTWVzc2FnZUJ1cycpO1xuXG5pbXBvcnQgQnVzIGZyb20gJy4vQnVzJztcbmltcG9ydCBQaXBlbGluZSBmcm9tICcuL1BpcGVsaW5lJztcblxuLyoqXG4qIEBhdXRob3IgbWljYWVscGVkcm9zYUBnbWFpbC5jb21cbiogTWVzc2FnZSBCVVMgSW50ZXJmYWNlIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgQnVzXG4qIEl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZGVmYXVsdCAnKicgbGlzdGVuZXIsIGluc3RlYWQgaXQgdXNlcyB0aGUgcmVnaXN0cnkucmVzb2x2ZSguLilcbiovXG5jbGFzcyBNZXNzYWdlQnVzIGV4dGVuZHMgQnVzIHtcbiAgLyogcHJpdmF0ZVxuICBfcmVnaXN0cnk6IFJlZ2lzdHJ5XG4gIF9mb3J3YXJkczogeyA8ZnJvbS11cmw+OiB7IGZsOiBNc2dMaXN0ZW5lciwgc2FuZGJveFRvVXJsczogTWFwKFNhbmRib3gsIFt0by11cmxdKSwgdXJsVG9TYW5kYm94OiB7IHRvLXVybDogU2FuZGJveCB9IH0gfVxuXG4gIF9waXBlbGluZTogUGlwZWxpbmVcbiAgKi9cblxuICAvL1RPRE86IGZ1dHVyZSBvcHRpbWl6YXRpb25cbiAgLy8xLiBtZXNzYWdlIGJhdGNoIHByb2Nlc3Npbmcgd2l0aCBzZXRJbnRlcnZhbFxuICAvLzIuIHJlc29sdmUgZGVmYXVsdCBnYXRld2F5L3Byb3Rvc3R1YiB3aXRoIHJlZ2lzdGVyLnJlc29sdmVcblxuICBjb25zdHJ1Y3RvcihyZWdpc3RyeSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICB0aGlzLl9mb3J3YXJkcyA9IHt9O1xuXG4gICAgdGhpcy5fcGlwZWxpbmVJbiA9IG5ldyBQaXBlbGluZSgoZXJyb3IpID0+IHtcbiAgICAgIGxvZy5lcnJvcignUElQRUxJTkUtRVJST1I6ICcsIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9waXBlbGluZU91dCA9IG5ldyBQaXBlbGluZSgoZXJyb3IpID0+IHtcbiAgICAgIGxvZy5lcnJvcignUElQRUxJTkUtRVJST1I6ICcsIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgcGlwZWxpbmVJbigpIHsgcmV0dXJuIHRoaXMuX3BpcGVsaW5lSW47IH1cblxuICBnZXQgcGlwZWxpbmVPdXQoKSB7IHJldHVybiB0aGlzLl9waXBlbGluZU91dDsgfVxuXG4gIC8qKlxuICAgKiBQb3N0IGEgbWVzc2FnZSBmb3Igcm91dGluZy4gSXQgd2lsbCBmaXJzdCBzZWFyY2ggZm9yIGEgbGlzdGVuZXIsIGlmIHRoZXJlIGlzIG5vIG9uZSwgaXQgc2VuZHMgdG8gYSBleHRlcm5hbCByb3V0aW5nIHVzaW5nIHRoZSBfb25Qb3N0TWVzc2FnZS5cbiAgICogRXh0ZXJuYWwgcm91dGluZyB1c2UgdGhlIHJlZ2lzdHJ5LnJlc29sdmUoLi4pIG1ldGhvZCB0byBkZWNpZGUgdGhlIGRlc3RpbmF0aW9uIHNhbmRib3guXG4gICAqIEBwYXJhbSAge01lc3NhZ2V9IGluTXNnICAgICAgICAgICAgSlNPTiB3aXRoIG1hbmRhdG9yeSBNZXNzYWdlIHN0cnVjdHVyZSB7aWQsIHR5cGUsIGZyb20sIHRvfVxuICAgKiBAcGFyYW0gIHtDYWxsYmFja30gcmVzcG9uc2VDYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayBpZiBhIHJlc3BvbnNlIGlzIGV4cGVjdGVkIGZyb20gdGhlIHJlcXVlc3QuIEEgcmVzcG9uc2Ugd2lsbCBiZSBhbHdheXMgc2VudCwgZXZlbiBpZiBpdCBpcyBhIFwiVGltZW91dFwiLlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9ICAgICAgICAgICAgICAgICAgdGhlIE1lc3NhZ2UgaWRcbiAgICovXG4gIHBvc3RNZXNzYWdlKGluTXNnLCByZXNwb25zZUNhbGxiYWNrLCB0aW1lb3V0KSB7XG4gICAgbG9nLmluZm8oJ29uUE9TVE1lc3NhZ2U6ICcsIGluTXNnKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IGRlbGl2ZXIgPSAobXNnKSA9PiB7XG5cbiAgICAgICAgICBfdGhpcy5fcmVzcG9uc2VDYWxsYmFjayhpbk1zZywgcmVzcG9uc2VDYWxsYmFjaywgdGltZW91dCk7XG5cbiAgICAgICAgICBpZiAoIV90aGlzLl9vblJlc3BvbnNlKG1zZykpIHtcbiAgICAgICAgICAgIGxldCBpdGVtTGlzdCA9IF90aGlzLl9zdWJzY3JpcHRpb25zW21zZy50b107XG4gICAgICAgICAgICBpZiAoaXRlbUxpc3QpIHtcbiAgICAgICAgICAgICAgLy9kbyBub3QgcHVibGlzaCBvbiBkZWZhdWx0IGFkZHJlc3MsIGJlY2F1c2Ugb2YgbG9vcGJhY2sgY3ljbGVcbiAgICAgICAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbihpdGVtTGlzdCwgbXNnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgbm8gbGlzdGVuZXIsIHNlbmQgdG8gZXh0ZXJuYWwgaW50ZXJmYWNlXG4gICAgICAgICAgICAgIF90aGlzLl9vblBvc3RNZXNzYWdlKG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgIH1cblxuICAgIF90aGlzLl9nZW5JZChpbk1zZyk7XG5cbiAgICBpZiAoX3RoaXMuX2lzVG9Qcm9jZXNzKGluTXNnKSkge1xuICAgICAgbGV0IGlzSW5jb21pbmcgPSBfdGhpcy5faXNJbmNvbWluZ01lc3NhZ2UoaW5Nc2cpO1xuXG4gICAgICBpZiAoaXNJbmNvbWluZykgX3RoaXMuX3BpcGVsaW5lSW4ucHJvY2Vzcyhpbk1zZywgZGVsaXZlcik7XG4gICAgICBlbHNlIF90aGlzLl9waXBlbGluZU91dC5wcm9jZXNzKGluTXNnLCBkZWxpdmVyKTtcbiAgICB9IGVsc2UgZGVsaXZlcihpbk1zZyk7XG5cbiAgICByZXR1cm4gaW5Nc2cuaWQ7XG5cbiAgfVxuXG5cbiAgX2lzVG9Qcm9jZXNzKG1lc3NhZ2UpIHtcbiAgICBsZXQgc2NoZW1hc1RvSWdub3JlID0gWydkb21haW4nLCAnZG9tYWluLWlkcCcsICdnbG9iYWwnLCAnaHlwZXJ0eS1ydW50aW1lJywgJ3J1bnRpbWUnXTtcbiAgICBsZXQgc3BsaXRGcm9tID0gKG1lc3NhZ2UuZnJvbSkuc3BsaXQoJzovLycpO1xuICAgIGxldCBmcm9tU2NoZW1hID0gc3BsaXRGcm9tWzBdO1xuICAgIGxldCBzcGxpdFRvID0gKG1lc3NhZ2UudG8pLnNwbGl0KCc6Ly8nKTtcbiAgICBsZXQgdG9TY2hlbWEgPSAgc3BsaXRUb1swXTtcbiAgICBsZXQgZnJvbSA9IG1lc3NhZ2UuZnJvbTtcbiAgICBsZXQgdG8gPSBtZXNzYWdlLnRvO1xuXG4gICAgLy8gU2lnbmFsbGluZyBtZXNzYWdlcyBiZXR3ZWVuIFAyUCBTdHVicyBkb24ndCBoYXZlIHRvIGJlIHZlcmlmaWVkLiBGRlNcblxuICAgIGlmIChtZXNzYWdlLmJvZHkgJiYgbWVzc2FnZS5ib2R5LnNvdXJjZSkge1xuICAgICAgZnJvbSA9IG1lc3NhZ2UuYm9keS5zb3VyY2U7XG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UuYm9keSAmJiBtZXNzYWdlLmJvZHkuc3Vic2NyaWJlcikge1xuICAgICAgZnJvbSA9IG1lc3NhZ2UuYm9keS5zdWJzY3JpYmVyO1xuICAgIH1cblxuICAgIGlmIChmcm9tLmluZGV4T2YoJy9wMnBoYW5kbGVyLycpICE9PSAtMSB8fCBmcm9tLmluZGV4T2YoJy9wMnByZXF1ZXN0ZXIvJykgIT09IC0xIHx8IHRvLmluZGV4T2YoJy9wMnBoYW5kbGVyLycpICE9PSAtMSB8fCB0by5pbmRleE9mKCcvcDJwcmVxdWVzdGVyLycpICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZWdpc3RyeS5pc0xvY2FsKGZyb20pICYmIHRoaXMuX3JlZ2lzdHJ5LmlzTG9jYWwobWVzc2FnZS50bykpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAobWVzc2FnZS5mcm9tID09PSBmcm9tU2NoZW1hIHx8IG1lc3NhZ2UudG8gPT09IHRvU2NoZW1hIHx8IG1lc3NhZ2UudHlwZSA9PT0gJ3JlYWQnIHx8IG1lc3NhZ2UudHlwZSA9PT0gJ3Jlc3BvbnNlJyB8fCAobWVzc2FnZS5mcm9tLmluY2x1ZGVzKCdoeXBlcnR5Oi8vJykgJiYgbWVzc2FnZS50eXBlID09PSAnZGVsZXRlJykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNjaGVtYXNUb0lnbm9yZS5pbmRleE9mKGZyb21TY2hlbWEpID09PSAtMSB8fCBzY2hlbWFzVG9JZ25vcmUuaW5kZXhPZih0b1NjaGVtYSkgPT09IC0xO1xuICAgIH1cbiAgfVxuXG4gIF9pc0luY29taW5nTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgbGV0IGZyb207XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSAnZm9yd2FyZCcpIHtcbiAgICAgIGxvZy5pbmZvKCdbTWVzc2FnZUJ1cyAtIGlzSW5jb21pbmdNZXNzYWdlXSAtIG1lc3NhZ2UudHlwZTogJywgbWVzc2FnZS50eXBlKTtcbiAgICAgIGZyb20gPSBtZXNzYWdlLmJvZHkuZnJvbTtcbiAgICB9IGVsc2UgaWYgKG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoJ2JvZHknKSAmJiBtZXNzYWdlLmJvZHkuaGFzT3duUHJvcGVydHkoJ3NvdXJjZScpICYmIG1lc3NhZ2UuYm9keS5zb3VyY2UpIHtcbiAgICAgIGxvZy5pbmZvKCdbTWVzc2FnZUJ1cyAtIGlzSW5jb21pbmdNZXNzYWdlXSAtIG1lc3NhZ2UuYm9keS5zb3VyY2U6ICcsIG1lc3NhZ2UuYm9keS5zb3VyY2UpO1xuICAgICAgZnJvbSA9IG1lc3NhZ2UuYm9keS5zb3VyY2U7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdzdWJzY3JpYmVyJykgJiYgbWVzc2FnZS5ib2R5LnN1YnNjcmliZXIpIHtcbiAgICAgIC8vVE9ETzogdGhpcyBzdWJzY3JpYmVyIHZhbGlkYXRpb24gc2hvdWxkIG5vdCBleGlzdCwgYmVjYXVzZSBpcyBvdXRkYXRlZFxuICAgICAgLy9UT0RPOiB0aGUgc3luY2hlciBhbmQgc3luY2hlciBtYW5hZ2VyIG5vdCBmb2xsb3dpbmcgdGhlIGNvcnJlY3Qgc3BlYztcbiAgICAgIGxvZy5pbmZvKCdbTWVzc2FnZUJ1cyAtIGlzSW5jb21pbmdNZXNzYWdlXSAtIG1lc3NhZ2UuYm9keS5zdWJzY3JpYmVyOiAnLCBtZXNzYWdlLmJvZHkuc3Vic2NyaWJlcik7XG4gICAgICBmcm9tID0gbWVzc2FnZS5ib2R5LnN1YnNjcmliZXI7XG4gICAgfSAgZWxzZSBpZiAobWVzc2FnZS5oYXNPd25Qcm9wZXJ0eSgnYm9keScpICYmIG1lc3NhZ2UuYm9keS5oYXNPd25Qcm9wZXJ0eSgncmVwb3J0ZXInKSAmJiBtZXNzYWdlLmJvZHkucmVwb3J0ZXIpIHtcbiAgICAgIC8vVE9ETzogdGhpcyBzdWJzY3JpYmVyIHZhbGlkYXRpb24gc2hvdWxkIG5vdCBleGlzdCwgYmVjYXVzZSBpcyBvdXRkYXRlZFxuICAgICAgLy9UT0RPOiB0aGUgc3luY2hlciBhbmQgc3luY2hlciBtYW5hZ2VyIG5vdCBmb2xsb3dpbmcgdGhlIGNvcnJlY3Qgc3BlYztcbiAgICAgIGxvZy5pbmZvKCdbTWVzc2FnZUJ1cyAtIGlzSW5jb21pbmdNZXNzYWdlXSAtIG1lc3NhZ2UuYm9keS5yZXBvcnRlcjogJywgbWVzc2FnZS5ib2R5LnJlcG9ydGVyKTtcbiAgICAgIGZyb20gPSBtZXNzYWdlLmJvZHkucmVwb3J0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKCdbTWVzc2FnZUJ1cyAtIGlzSW5jb21pbmdNZXNzYWdlXSAtIG1lc3NhZ2UuZnJvbSAnLCBtZXNzYWdlLmZyb20pO1xuICAgICAgZnJvbSA9IG1lc3NhZ2UuZnJvbTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbygnW01lc3NhZ2VCdXMgLSBpc0luY29taW5nTWVzc2FnZV0gLSBjaGVjayBpZiBpc0xvY2FsOiAnLCBmcm9tKTtcbiAgICByZXR1cm4gIXRoaXMuX3JlZ2lzdHJ5LmlzTG9jYWwoZnJvbSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV4dGVybmFsIHB1Ymxpc2ggYWRkcmVzcyBsaXN0ZW5lci4gRXZlcnkgbWVzc2FnZSBmb3IgdGhlIGFkZHJlc3Mgd2lsbCBiZSBmb3J3YXJkZWQgdG8gdGhlIGV4dGVybmFsIHJvdXRpbmcgYnkgX29uUG9zdE1lc3NhZ2UuXG4gICAqIFRoaXMgbWVhbnMsIGV2ZW4gaWYgdGhlcmUgaXMgYSBsaXN0ZW5lciBmb3IgdGhlIGFkZHJlc3MsIGl0IHdpbGwgYWxzbyBzZW5kIHRoZSBtZXNzYWdlIHRvIHRoZSBleHRlcm5hbCByb3V0aW5nLlxuICAgKiBAcGFyYW0ge1VSTH0gZnJvbSBQdWJsaXNoIGFkZHJlc3MuXG4gICAqL1xuICBhZGRQdWJsaXNoKGZyb20pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy92ZXJpZnkgaWYgZm9yd2FyZCBleGlzdFxuICAgIGxldCByZWZDb3VudCA9IF90aGlzLl9mb3J3YXJkc1tmcm9tXTtcbiAgICBpZiAoIXJlZkNvdW50KSB7XG4gICAgICBsZXQgZm9yd2FyZExpc3RlbmVyID0gX3RoaXMuYWRkTGlzdGVuZXIoZnJvbSwgKG1zZykgPT4ge1xuICAgICAgICBsb2cuaW5mbygnTUItUFVCTElTSDogKCAnICsgZnJvbSArICcgKScpO1xuICAgICAgICBfdGhpcy5fb25Qb3N0TWVzc2FnZShtc2cpO1xuICAgICAgfSk7XG5cbiAgICAgIHJlZkNvdW50ID0ge1xuICAgICAgICBjb3VudGVyOiAwLFxuICAgICAgICBmbDogZm9yd2FyZExpc3RlbmVyLFxuICAgICAgICByZW1vdmU6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvdW50ZXItLTtcbiAgICAgICAgICBpZiAodGhpcy5jb3VudGVyID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZsLnJlbW92ZSgpO1xuICAgICAgICAgICAgZGVsZXRlIF90aGlzLl9mb3J3YXJkc1tmcm9tXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgX3RoaXMuX2ZvcndhcmRzW2Zyb21dID0gcmVmQ291bnQ7XG4gICB9XG5cbiAgIHJlZkNvdW50LmNvdW50ZXIrKztcbiAgIHJldHVybiByZWZDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgZm9yd2FyZCBsaXN0ZW5lciBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLiBFdmVyeSBtZXNzYWdlIHJlYWNoaW5nIGFuIGFkZHJlc3Mgd2lsbCBiZSBhbHNvIHNlbnQgdG8gdGhlIGZvcndhcmQgYWRkcmVzcy5cbiAgICogQHBhcmFtIHtVUkx9IGZyb20gTWVzc2FnZSBkZXN0aW5hdGlvbiwgaXQncyBhY3R1YWxseSB0aGUgZmllbGQgXCJ0b1wiIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0ge1VSTH0gdG8gICBGb3J3YXJkIGFkZHJlc3MuXG4gICAqL1xuICAgYWRkRm9yd2FyZChmcm9tLCB0bykge1xuICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgIHJldHVybiBfdGhpcy5hZGRMaXN0ZW5lcihmcm9tLCAobXNnKSA9PiB7XG4gICAgICAgbG9nLmluZm8oJ01CLUZPUldBUkQ6ICggJyArIGZyb20gKyAnIHRvICcgKyB0byArICcgKScpO1xuICAgICAgIF90aGlzLmZvcndhcmQodG8sIG1zZyk7XG4gICAgIH0pO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEp1c3QgZm9yd2FyZCdzIGEgbWVzc2FnZSB0byB0aGUgZm9yd2FyZCBhZGRyZXNzLiBMaXN0ZW5lcnMgc2hvdWxkIGJlIGF2YWlsYWJsZSBmb3IgdGhlIGZvcndhcmQgYWRkcmVzcy5cbiAgICAqIEBwYXJhbSAge1VSTH0gdXJsIEZvcndhcmQgYWRkcmVzcy5cbiAgICAqIEBwYXJhbSAge01lc3NhZ2V9IG1zZyBNZXNzYWdlIHRvIGZvcndhcmRcbiAgICAqL1xuICAgZm9yd2FyZCh1cmwsIG1zZykge1xuICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgIGxldCBpdGVtTGlzdCA9IF90aGlzLl9zdWJzY3JpcHRpb25zW3VybF07XG4gICAgIGlmIChpdGVtTGlzdCkge1xuICAgICAgIF90aGlzLl9wdWJsaXNoT24oaXRlbUxpc3QsIG1zZyk7XG4gICAgIH1cbiAgIH1cblxuICAgLy9kZWZhdWx0IHJvdXRlLCBpZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGF2YWlsYWJsZSBmb3IgYSBtZXNzYWdlIGRlc3RpbmF0aW9uLlxuICAgX29uUG9zdE1lc3NhZ2UobXNnKSB7XG4gICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAgLy9yZXNvbHZlIGV4dGVybmFsIHByb3Rvc3R1Yi4uLlxuICAgICBfdGhpcy5fcmVnaXN0cnkucmVzb2x2ZShtc2cpLnRoZW4oKHJvdXRlLCBtc2cycm91dGUpID0+IHtcbiAgICAgICBpZiAobXNnMnJvdXRlKSBfdGhpcy5mb3J3YXJkKHJvdXRlLCBtc2cycm91dGUpO1xuICAgICAgIGVsc2UgX3RoaXMuZm9yd2FyZChyb3V0ZSwgbXNnKTtcbiAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZSkge1xuICAgICAgIGxvZy5lcnJvcignUkVTT0xWRS1FUlJPUjogJywgZSk7XG4gICAgIH0pO1xuICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNZXNzYWdlQnVzO1xuIiwiLy8gTWFyc2hhbHMgYSBzdHJpbmcgdG8gVWludDhBcnJheS5cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVVVEY4KHMpIHtcblx0dmFyIGkgPSAwO1xuXHR2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShzLmxlbmd0aCAqIDQpO1xuXHRmb3IgKHZhciBjaSA9IDA7IGNpICE9IHMubGVuZ3RoOyBjaSsrKSB7XG4gICAgdHJ5e1xuICAgICAgdmFyIHh4eCA9IHMuY2hhckNvZGVBdChjaSk7XG4gICAgfSBjYXRjaCAoZXJyKXtcbiAgICAgIGNvbnNvbGUubG9nKGVyci5tZXNzYWdlKTtcbiAgICAgIHJldHVybjtcblxuICAgIH1cblx0XHR2YXIgYyA9IHMuY2hhckNvZGVBdChjaSk7XG5cdFx0aWYgKGMgPCAxMjgpIHtcblx0XHRcdGJ5dGVzW2krK10gPSBjO1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGlmIChjIDwgMjA0OCkge1xuXHRcdFx0Ynl0ZXNbaSsrXSA9IGMgPj4gNiB8IDE5Mjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGMgPiAweGQ3ZmYgJiYgYyA8IDB4ZGMwMCkge1xuXHRcdFx0XHRpZiAoKytjaSA9PSBzLmxlbmd0aCkgdGhyb3cgJ1VURi04IGVuY29kZTogaW5jb21wbGV0ZSBzdXJyb2dhdGUgcGFpcic7XG5cdFx0XHRcdHZhciBjMiA9IHMuY2hhckNvZGVBdChjaSk7XG5cdFx0XHRcdGlmIChjMiA8IDB4ZGMwMCB8fCBjMiA+IDB4ZGZmZikgdGhyb3cgJ1VURi04IGVuY29kZTogc2Vjb25kIGNoYXIgY29kZSAweCcgKyBjMi50b1N0cmluZygxNikgKyAnIGF0IGluZGV4ICcgKyBjaSArICcgaW4gc3Vycm9nYXRlIHBhaXIgb3V0IG9mIHJhbmdlJztcblx0XHRcdFx0YyA9IDB4MTAwMDAgKyAoKGMgJiAweDAzZmYpIDw8IDEwKSArIChjMiAmIDB4MDNmZik7XG5cdFx0XHRcdGJ5dGVzW2krK10gPSBjID4+IDE4IHwgMjQwO1xuXHRcdFx0XHRieXRlc1tpKytdID0gYz4+IDEyICYgNjMgfCAxMjg7XG5cdFx0XHR9IGVsc2UgeyAvLyBjIDw9IDB4ZmZmZlxuXHRcdFx0XHRieXRlc1tpKytdID0gYyA+PiAxMiB8IDIyNDtcblx0XHRcdH1cblx0XHRcdGJ5dGVzW2krK10gPSBjID4+IDYgJiA2MyB8IDEyODtcblx0XHR9XG5cdFx0Ynl0ZXNbaSsrXSA9IGMgJiA2MyB8IDEyODtcblx0fVxuXHRyZXR1cm4gYnl0ZXMuc3ViYXJyYXkoMCwgaSk7XG59XG5cbi8vIFVubWFyc2hhbHMgYW4gVWludDhBcnJheSB0byBzdHJpbmcuXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVVRGOChieXRlcykge1xuXHR2YXIgcyA9ICcnO1xuXHR2YXIgaSA9IDA7XG5cdHdoaWxlIChpIDwgYnl0ZXMubGVuZ3RoKSB7XG5cdFx0dmFyIGMgPSBieXRlc1tpKytdO1xuXHRcdGlmIChjID4gMTI3KSB7XG5cdFx0XHRpZiAoYyA+IDE5MSAmJiBjIDwgMjI0KSB7XG5cdFx0XHRcdGlmIChpID49IGJ5dGVzLmxlbmd0aCkgdGhyb3cgJ1VURi04IGRlY29kZTogaW5jb21wbGV0ZSAyLWJ5dGUgc2VxdWVuY2UnO1xuXHRcdFx0XHRjID0gKGMgJiAzMSkgPDwgNiB8IGJ5dGVzW2ldICYgNjM7XG5cdFx0XHR9IGVsc2UgaWYgKGMgPiAyMjMgJiYgYyA8IDI0MCkge1xuXHRcdFx0XHRpZiAoaSArIDEgPj0gYnl0ZXMubGVuZ3RoKSB0aHJvdyAnVVRGLTggZGVjb2RlOiBpbmNvbXBsZXRlIDMtYnl0ZSBzZXF1ZW5jZSc7XG5cdFx0XHRcdGMgPSAoYyAmIDE1KSA8PCAxMiB8IChieXRlc1tpXSAmIDYzKSA8PCA2IHwgYnl0ZXNbKytpXSAmIDYzO1xuXHRcdFx0fSBlbHNlIGlmIChjID4gMjM5ICYmIGMgPCAyNDgpIHtcblx0XHRcdFx0aWYgKGkrMiA+PSBieXRlcy5sZW5ndGgpIHRocm93ICdVVEYtOCBkZWNvZGU6IGluY29tcGxldGUgNC1ieXRlIHNlcXVlbmNlJztcblx0XHRcdFx0YyA9IChjICYgNykgPDwgMTggfCAoYnl0ZXNbaV0gJiA2MykgPDwgMTIgfCAoYnl0ZXNbKytpXSAmIDYzKSA8PCA2IHwgYnl0ZXNbKytpXSAmIDYzO1xuXHRcdFx0fSBlbHNlIHRocm93ICdVVEYtOCBkZWNvZGU6IHVua25vd24gbXVsdGlieXRlIHN0YXJ0IDB4JyArIGMudG9TdHJpbmcoMTYpICsgJyBhdCBpbmRleCAnICsgKGkgLSAxKTtcblx0XHRcdCsraTtcblx0XHR9XG5cblx0XHRpZiAoYyA8PSAweGZmZmYpIHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcblx0XHRlbHNlIGlmIChjIDw9IDB4MTBmZmZmKSB7XG5cdFx0XHRjIC09IDB4MTAwMDA7XG5cdFx0XHRzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyA+PiAxMCB8IDB4ZDgwMClcblx0XHRcdHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjICYgMHgzRkYgfCAweGRjMDApXG5cdFx0fSBlbHNlIHRocm93ICdVVEYtOCBkZWNvZGU6IGNvZGUgcG9pbnQgMHgnICsgYy50b1N0cmluZygxNikgKyAnIGV4Y2VlZHMgVVRGLTE2IHJlYWNoJztcblx0fVxuXHRyZXR1cm4gcztcbn1cbiIsImltcG9ydCB7ZW5jb2RlVVRGOCwgZGVjb2RlVVRGOH0gZnJvbSAnLi91dGY4LmpzJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQ3J5cHRvTWFuYWdlcicpO1xuXG4vKipcbiogQ2xhc3Mgd2l0aCB0aGUgY3J5cHRvZ3JhcGhpYyBmdW5jdGlvbnMgZm9yIHRoZSBhdXRoZW50aWNhdGlvbiBwcm90b2NvbFxuKlxuKi9cbmNsYXNzIENyeXB0byB7XG5cbi8qKlxuKiBSdW50aW1lZmFjdG9yeSBpcyBwYXNzZWQgaW4gdGhlIGNvc3RydWN0b3IsIGJlY2F1c2UgdGhlIG5vZGVKUyBoYXMgYSBkaWZmZXJlbnQgY3J5cHRvIG1vZHVsZVxuKiBmcm9tIHRoZSBicm93c2VyLiBSdW50aW1lRmFjdG9yeSBwcm92aWRlcyBhIHdyYXBwZXIgZm9yIHRoZSBmdWN0aW9ucyBvZiBub2RlSlMsIHNvIHRoZXkgY2FuIGJlXG4qIGludm9rZWQgYnJvd3NlciBsaWtlLlxuKi9cbiAgY29uc3RydWN0b3IocnVudGltZUZhY3RvcnkpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHR5cGVvZiBydW50aW1lRmFjdG9yeS5jcmVhdGVXZWJjcnlwdG8gPT09ICdmdW5jdGlvbicgPyBfdGhpcy5fY3J5cHRvID0gcnVudGltZUZhY3RvcnkuY3JlYXRlV2ViY3J5cHRvKCkgOiBfdGhpcy5fY3J5cHRvID0gY3J5cHRvO1xuICB9XG5cbiAgLyoqXG4gICogUGVyZm9ybXMgYSBSU0EgZW5jcnlwdGlvblxuICAqIEBwYXJhbSAgIHtBcnJheUJ1ZmZlcn0gICAgdmFsdWUgICAgdGhlIHB1YmxpYyBrZXlcbiAgKiBAcGFyYW0gICB7QnVmZmVyU291cmNlfSAgICB2YWx1ZSAgICBkYXRhIHRvIGJlIGVuY3J5cGVkXG4gICogQHJldHVybiAge1VpbnQ4QXJyYXl9ICAgZW5jcnlwdGVkIGRhdGFcbiAgKi9cbiAgZW5jcnlwdFJTQShwdWJLZXksIGRhdGEpIHtcbiAgICBsb2cubG9nKCdlbmNyeXB0UlNBOnB1YktleScsIHB1YktleSk7XG4gICAgbG9nLmxvZygnZW5jcnlwdFJTQTpkYXRhJywgZGF0YSk7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgX3RoaXMuX2ltcG9ydFJTQWVuY3J5cHRLZXkobmV3IFVpbnQ4QXJyYXkocHViS2V5KSkudGhlbihmdW5jdGlvbihwdWJsaWNLZXkpIHtcblxuICAgICAgICBfdGhpcy5fY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdSU0EtT0FFUCdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHB1YmxpY0tleSwgLy9mcm9tIGdlbmVyYXRlS2V5IG9yIGltcG9ydEtleSBhYm92ZVxuICAgICAgICAgIGRhdGEgLy9BcnJheUJ1ZmZlciBvZiBkYXRhIHlvdSB3YW50IHRvIGVuY3J5cHRcbiAgICAgICAgKVxuICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGVuY3J5cHRlZCkge1xuICAgICAgICAgIC8vcmV0dXJucyBhbiBBcnJheUJ1ZmZlciBjb250YWluaW5nIHRoZSBlbmNyeXB0ZWQgZGF0YVxuICAgICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1lbmNyeXB0UlNBJywgbmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG4gICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZCkpO1xuXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWVuY3J5cHRSU0EnLCBlcnIpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFBlcmZvcm1zIGEgUlNBIGRlY3J5cHRpb25cbiAgKiBAcGFyYW0gICB7QXJyYXlCdWZmZXJ9ICAgIHZhbHVlICAgIHRoZSBwcml2YXRlIGtleVxuICAqIEBwYXJhbSAgIHtCdWZmZXJTb3VyY2V9ICAgIHZhbHVlICAgIGRhdGEgdG8gYmUgZGVjcnlwdGVkXG4gICogQHJldHVybiAge1VpbnQ4QXJyYXl9ICAgZGVjcnlwdGVkIGRhdGFcbiAgKi9cbiAgZGVjcnlwdFJTQShwcml2S2V5LCBkYXRhKSB7XG4gICAgbG9nLmxvZygnZGVjcnlwdFJTQTpwcml2S2V5JywgcHJpdktleSk7XG4gICAgbG9nLmxvZygnZGVjcnlwdFJTQTpkYXRhJywgZGF0YSk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIF90aGlzLl9pbXBvcnRSU0FkZWNyeXB0S2V5KHByaXZLZXkpLnRoZW4oZnVuY3Rpb24ocHJpdmF0ZUtleSkge1xuXG4gICAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJpdmF0ZUtleSwgLy9mcm9tIGdlbmVyYXRlS2V5IG9yIGltcG9ydEtleSBhYm92ZVxuICAgICAgICAgIGRhdGEgLy9BcnJheUJ1ZmZlciBvZiB0aGUgZGF0YVxuICAgICAgICApXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGVjcnlwdGVkKSB7XG5cbiAgICAgICAgICAgIGxldCBkZWNyeXB0ZWREYXRhID0gbmV3IFVpbnQ4QXJyYXkoZGVjcnlwdGVkKTtcblxuICAgICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWRlY3J5cHRSU0EnLCBkZWNyeXB0ZWREYXRhKTtcbiAgICAgICAgICAgIHJlc29sdmUoZGVjcnlwdGVkRGF0YSk7XG5cbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tZGVjcnlwdFJTQScsIGVycik7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBQZXJmb3JtcyBhIFJTQSBzaWduXG4gICogQHBhcmFtICAge0FycmF5QnVmZmVyfSAgICB2YWx1ZSAgICB0aGUgcHJpdmF0ZSBrZXlcbiAgKiBAcGFyYW0gICB7QnVmZmVyU291cmNlfSAgICB2YWx1ZSAgICBkYXRhIHRvIGJlIHNpZ25lZFxuICAqIEByZXR1cm4gIHtVaW50OEFycmF5fSAgIGRhdGEgc2lnbmF0dXJlXG4gICovXG4gIHNpZ25SU0EocHJpdktleSwgZGF0YSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBfdGhpcy5faW1wb3J0UlNBc2lnbktleShwcml2S2V5KS50aGVuKGZ1bmN0aW9uKHByaXZhdGVLZXkpIHtcblxuICAgICAgICBfdGhpcy5fY3J5cHRvLnN1YnRsZS5zaWduKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdSU0FTU0EtUEtDUzEtdjFfNSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByaXZhdGVLZXksIC8vZnJvbSBnZW5lcmF0ZUtleSBvciBpbXBvcnRLZXkgYWJvdmVcbiAgICAgICAgICBlbmNvZGVVVEY4KGRhdGEpIC8vQXJyYXlCdWZmZXIgb2YgZGF0YSB5b3Ugd2FudCB0byBzaWduXG4gICAgICAgIClcbiAgICAgICAgICAudGhlbihmdW5jdGlvbihzaWduYXR1cmUpIHtcbiAgICAgICAgICAvL3JldHVybnMgYW4gQXJyYXlCdWZmZXIgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlXG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLXNpZ25SU0EnLCBuZXcgVWludDhBcnJheShzaWduYXR1cmUpKTtcbiAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSk7XG5cbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tc2lnblJTQScsIGVycik7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgfSk7XG5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFBlcmZvcm1zIGEgUlNBIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cbiAgKiBAcGFyYW0gICB7QXJyYXlCdWZmZXJ9ICAgIHZhbHVlICAgIHRoZSBwdWJsaWMga2V5XG4gICogQHBhcmFtICAge0J1ZmZlclNvdXJjZX0gICAgdmFsdWUgICAgZGF0YSB0byBiZSB2ZXJpZmllZFxuICAqIEByZXR1cm4gIHtCb29sZWFufSAgIHJlc3VsdCBvZiB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvblxuICAqL1xuICB2ZXJpZnlSU0EocHViS2V5LCBkYXRhLCBzaWduYXR1cmUpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgX3RoaXMuX2ltcG9ydFJTQXZlcmlmeUtleShwdWJLZXkpLnRoZW4oZnVuY3Rpb24ocHVibGljS2V5KSB7XG5cbiAgICAgICAgX3RoaXMuX2NyeXB0by5zdWJ0bGUudmVyaWZ5KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdSU0FTU0EtUEtDUzEtdjFfNSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHB1YmxpY0tleSwgLy9mcm9tIGdlbmVyYXRlS2V5IG9yIGltcG9ydEtleSBhYm92ZVxuICAgICAgICAgIHNpZ25hdHVyZSwgLy9BcnJheUJ1ZmZlciBvZiB0aGUgc2lnbmF0dXJlXG4gICAgICAgICAgZW5jb2RlVVRGOChkYXRhKSAvL0FycmF5QnVmZmVyIG9mIHRoZSBkYXRhXG4gICAgICAgIClcbiAgICAgICAgICAudGhlbihmdW5jdGlvbihpc3ZhbGlkKSB7XG4gICAgICAgICAgLy9yZXR1cm5zIGEgYm9vbGVhbiBvbiB3aGV0aGVyIHRoZSBzaWduYXR1cmUgaXMgdHJ1ZSBvciBub3RcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tdmVyaWZ5UlNBJywgaXN2YWxpZCk7XG4gICAgICAgICAgICByZXNvbHZlKGlzdmFsaWQpO1xuXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLXZlcmlmeVJTQScsIGVycik7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgfSk7XG5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFBlcmZvcm1zIGEgUlNBIHNpZ25hdHVyZSB2ZXJpZmljYXRpb25cbiAgKiBAcGFyYW0gICB7QXJyYXlCdWZmZXJ9ICAgIHZhbHVlICAgIHRoZSBwdWJsaWMga2V5XG4gICogQHBhcmFtICAge0J1ZmZlclNvdXJjZX0gICAgdmFsdWUgICAgZGF0YSB0byBiZSB2ZXJpZmllZFxuICAqIEByZXR1cm4gIHtCb29sZWFufSAgIHJlc3VsdCBvZiB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvblxuICAqL1xuICBlbmNyeXB0QUVTKGtleSwgZGF0YSwgaXYpIHtcbiAgICBsb2cubG9nKCdlbmNyeXB0QUVTOmtleScsIGtleSk7XG4gICAgbG9nLmxvZygnZW5jcnlwdEFFUzpkYXRhJywgZGF0YSk7XG4gICAgbG9nLmxvZygnZW5jcnlwdEFFUzppdicsIGl2KTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgX3RoaXMuX2ltcG9ydEFFU2tleShrZXkpLnRoZW4oZnVuY3Rpb24oYWVzS2V5KSB7XG5cbiAgICAgICAgX3RoaXMuX2NyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnQUVTLUNCQycsXG5cbiAgICAgICAgICAgIC8vRG9uJ3QgcmUtdXNlIGluaXRpYWxpemF0aW9uIHZlY3RvcnMhXG4gICAgICAgICAgICAvL0Fsd2F5cyBnZW5lcmF0ZSBhIG5ldyBpdiBldmVyeSB0aW1lIHlvdXIgZW5jcnlwdCFcbiAgICAgICAgICAgIGl2OiBpdlxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWVzS2V5LCAvL2Zyb20gZ2VuZXJhdGVLZXkgb3IgaW1wb3J0S2V5IGFib3ZlXG4gICAgICAgICAgZW5jb2RlVVRGOChkYXRhKSAvL0FycmF5QnVmZmVyIG9mIGRhdGEgeW91IHdhbnQgdG8gZW5jcnlwdFxuICAgICAgICApXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZW5jcnlwdGVkKSB7XG4gICAgICAgICAgLy9yZXR1cm5zIGFuIEFycmF5QnVmZmVyIGNvbnRhaW5pbmcgdGhlIGVuY3J5cHRlZCBkYXRhXG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWVuY3J5cHRBRVMnLCBuZXcgVWludDhBcnJheShlbmNyeXB0ZWQpKTtcbiAgICAgICAgICAgIHJlc29sdmUobmV3IFVpbnQ4QXJyYXkoZW5jcnlwdGVkKSk7XG5cbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tZW5jcnlwdEFFUycsIGVycik7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgfSk7XG5cbiAgICB9KTtcbiAgfVxuXG4gIGRlY3J5cHRBRVMoa2V5LCBkYXRhLCBpdikge1xuICAgIGxvZy5sb2coJ2RlY3J5cHRBRVM6a2V5Jywga2V5KTtcbiAgICBsb2cubG9nKCdkZWNyeXB0QUVTOmRhdGEnLCBkYXRhKTtcbiAgICBsb2cubG9nKCdkZWNyeXB0QUVTOml2JywgaXYpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBfdGhpcy5faW1wb3J0QUVTa2V5KGtleSkudGhlbihmdW5jdGlvbihhZXNLZXkpIHtcblxuICAgICAgICBfdGhpcy5fY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdBRVMtQ0JDJyxcbiAgICAgICAgICAgIGl2OiBpdlxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWVzS2V5LCAvL2Zyb20gZ2VuZXJhdGVLZXkgb3IgaW1wb3J0S2V5IGFib3ZlXG4gICAgICAgICAgZGF0YSAvL0FycmF5QnVmZmVyIG9mIHRoZSBkYXRhXG4gICAgICAgIClcbiAgICAgICAgICAudGhlbihmdW5jdGlvbihkZWNyeXB0ZWQpIHtcblxuICAgICAgICAgICAgbGV0IGRlY29kZWREYXRhID0gZGVjb2RlVVRGOChuZXcgVWludDhBcnJheShkZWNyeXB0ZWQpKTtcbiAgICAgICAgICAgIGxvZy5sb2coJ2NyeXB0by1kZWNyeXB0QUVTJywgZGVjb2RlZERhdGEpO1xuICAgICAgICAgICAgcmVzb2x2ZShkZWNvZGVkRGF0YSk7XG5cbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tZGVjcnlwdEFFUycsIGVycik7XG4gICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgfSk7XG5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIGNyZWF0ZXMgYSBoYXNoIHVzaW5nIHRoZSBITUFDIGFsZ29yaXRobVxuICAqIEBwYXJhbSAge2J5dGVBcnJheX0gICAga2V5ICAgICAgIGtleSB0byBiZSB1c2VkIGluIHRoZSBobWFjXG4gICogQHBhcmFtICB7c3RyaW5nfSAgICAgIGRhdGEgICAgICAgaW5mb3JtYXRpb24gdG8gYmUgaGFzaGVkXG4gICogQHJldHVybiAge2J5dGVBcnJheX0gICBzaWduYXR1cmUgIHJlc3VsdGluZyBoYXNoXG4gICovXG4gIGhhc2hITUFDKGtleSwgZGF0YSkge1xuICAgIGxvZy5sb2coJ2hhc2hITUFDOmtleScsIGtleSk7XG4gICAgbG9nLmxvZygnaGFzaEhNQUM6ZGF0YScsIGRhdGEpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPSAnc3RyaW5nJykge1xuICAgICAgICBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgIGxvZy5sb2coJ0NvbnZlcnRpbmcgaGFzaEhNQUMgaW5wdXJlZCBEQVRBJyk7XG4gICAgICAgIGxvZy5sb2coJ0hIYXNoSE1BQzonLCBkYXRhKTtcbiAgICAgIH1cblxuXG4gICAgICBfdGhpcy5faW1wb3J0SE1BQ2tleShrZXkpLnRoZW4oZnVuY3Rpb24oaG1hY0tleSkge1xuXG4gICAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLnNpZ24oXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ0hNQUMnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBobWFjS2V5LCAvL2Zyb20gZ2VuZXJhdGVLZXkgb3IgaW1wb3J0S2V5IGFib3ZlXG4gICAgICAgICAgZW5jb2RlVVRGOChkYXRhKSAvL0FycmF5QnVmZmVyIG9mIGRhdGEgeW91IHdhbnQgdG8gc2lnblxuICAgICAgICApXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24oc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICBsb2cubG9nKCdIYXNoSE1BQyBzaWduYXR1cmU6JywgbmV3IFVpbnQ4QXJyYXkoc2lnbmF0dXJlKSk7XG5cbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1oYXNoSE1BQycsIHNpZ25hdHVyZSk7XG4gICAgICAgICAgICAvL3JldHVybnMgYW4gQXJyYXlCdWZmZXIgY29udGFpbmluZyB0aGUgc2lnbmF0dXJlXG4gICAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KHNpZ25hdHVyZSkpO1xuXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8taGFzaEhNQUMnLCBlcnIpO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIHZlcmlmaWVzIGFuIGhhc2ggdXNpbmcgdGhlIEhNQUMgYWxnb3JpdGhtXG4gICogQHBhcmFtICB7Ynl0ZUFycmF5fSAgICBrZXkgICAgICAga2V5IHRvIGJlIHVzZWQgaW4gdGhlIGhtYWNcbiAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgZGF0YSAgICAgICBpbmZvcm1hdGlvbiB0byBiZSBoYXNoZWQgdG8gY29tcGFyZVxuICAqIEBwYXJhbSAge2J5dGVBcnJheX0gIHNpZ25hdHVyZSAgIGhhc2ggdG8gY29tcGFyZSB3aXRoIHRoZSByZWNlaXZlZCBkYXRhXG4gICogQHJldHVybiAge2Jvb2xlYW59ICAgaXN2YWxpZCAgICAgYm9vbGVhbiBzYXlpbmcgaWYgdGhlIGRhdGEgY29ycmVzcG9uZHMgdG8gdGhlIGhhc2ggcmVjZWl2ZWRcbiAgKi9cbiAgdmVyaWZ5SE1BQyhrZXksIGRhdGEsIHNpZ25hdHVyZSkge1xuICAgIGxvZy5sb2coJ3ZlcmlmeUhNQUM6a2V5Jywga2V5KTtcbiAgICBsb2cubG9nKCd2ZXJpZnlITUFDOmRhdGEnLCBkYXRhKTtcbiAgICBsb2cubG9nKCd2ZXJpZnlITUFDOnNpZ25hdHVyZScsIHNpZ25hdHVyZSk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgX3RoaXMuX2ltcG9ydEhNQUNrZXkoa2V5KS50aGVuKGZ1bmN0aW9uKGhtYWNLZXkpIHtcblxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgICAgbG9nLmxvZygnQ29udmVydGluZyB2ZXJpZnlITUFDIGlucHV0ZWQgREFUQTonLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLnZlcmlmeShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnSE1BQydcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhtYWNLZXksIC8vZnJvbSBnZW5lcmF0ZUtleSBvciBpbXBvcnRLZXkgYWJvdmVcbiAgICAgICAgICBzaWduYXR1cmUsIC8vQXJyYXlCdWZmZXIgb2YgdGhlIHNpZ25hdHVyZVxuICAgICAgICAgIGVuY29kZVVURjgoZGF0YSkgLy9BcnJheUJ1ZmZlciBvZiB0aGUgZGF0YVxuICAgICAgICApXG4gICAgICAgICAgLnRoZW4oZnVuY3Rpb24oaXN2YWxpZCkge1xuICAgICAgICAgIC8vcmV0dXJucyBhIGJvb2xlYW4gb24gd2hldGhlciB0aGUgc2lnbmF0dXJlIGlzIHRydWUgb3Igbm90XG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLXZlcmlmeUhNQUMnLCBpc3ZhbGlkKTtcbiAgICAgICAgICAgIGxvZy5sb2coJ3ZlcmlmeUhNQUMgcmVzdWx0JywgaXN2YWxpZCk7XG4gICAgICAgICAgICAoaXN2YWxpZCkgPyByZXNvbHZlKGlzdmFsaWQpIDogcmVqZWN0KGlzdmFsaWQpO1xuXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ2NyeXB0by12ZXJpZnlITUFDJywgZXJyKTtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBnZW5lcmF0ZXMgYSBSU0EgcHVibGljL3ByaXZhdGUga2V5IHBhaXIgd2l0aCBhIG1vZHVsdXMgbGVuZ3RoIG9mIDIwNDggYml0c1xuICAqIEByZXR1cm4gIHtKU09OfSAgIGtleVBhaXIgICAganNvbiBjb250YWluaW5nIHRoZSBwdWJsaWMgYW5kIHByaXZhdGUga2V5c1xuICAqL1xuICBnZW5lcmF0ZVJTQUtleVBhaXIoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQga2V5UGFpciA9IHt9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgX3RoaXMuX2NyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnUlNBLVBTUycsXG4gICAgICAgICAgbW9kdWx1c0xlbmd0aDogMjA0OCwgLy9jYW4gYmUgMTAyNCwgMjA0OCwgb3IgNDA5NlxuICAgICAgICAgIHB1YmxpY0V4cG9uZW50OiBuZXcgVWludDhBcnJheShbMHgwMSwgMHgwMCwgMHgwMV0pLFxuICAgICAgICAgIGhhc2g6IHtuYW1lOiAnU0hBLTI1Nid9IC8vY2FuIGJlICdTSEEtMScsICdTSEEtMjU2JywgJ1NIQS0zODQnLCBvciAnU0hBLTUxMidcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZSwgLy93aGV0aGVyIHRoZSBrZXkgaXMgZXh0cmFjdGFibGUgKGkuZS4gY2FuIGJlIHVzZWQgaW4gZXhwb3J0S2V5KVxuICAgICAgICBbJ3NpZ24nLCAndmVyaWZ5J10gLy9jYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mICdzaWduJyBhbmQgJ3ZlcmlmeSdcblxuICAgICAgKS50aGVuKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAvL3JldHVybnMgYSBrZXlwYWlyIG9iamVjdFxuICAgICAgICAvLyBsb2cubG9nKGtleSk7XG5cbiAgICAgICAgX3RoaXMuX2NyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KFxuICAgICAgICAgICdzcGtpJywgLy9jYW4gYmUgJ2p3aycgKHB1YmxpYyBvciBwcml2YXRlKSwgJ3Nwa2knIChwdWJsaWMgb25seSksIG9yICdwa2NzOCcgKHByaXZhdGUgb25seSlcbiAgICAgICAgICBrZXkucHVibGljS2V5IC8vY2FuIGJlIGEgcHVibGljS2V5IG9yIHByaXZhdGVLZXksIGFzIGxvbmcgYXMgZXh0cmFjdGFibGUgd2FzIHRydWVcbiAgICAgICAgKS50aGVuKGZ1bmN0aW9uKHB1YmxpY0tleSkge1xuICAgICAgICAgIC8vcmV0dXJucyB0aGUgZXhwb3J0ZWQga2V5IGRhdGFcbiAgICAgICAgICBrZXlQYWlyLnB1YmxpYyAgPSBuZXcgVWludDhBcnJheShwdWJsaWNLZXkpO1xuICAgICAgICAgIHJldHVybiBfdGhpcy5fY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoXG4gICAgICAgICAgICAncGtjczgnLCAvL2NhbiBiZSAnandrJyAocHVibGljIG9yIHByaXZhdGUpLCAnc3BraScgKHB1YmxpYyBvbmx5KSwgb3IgJ3BrY3M4JyAocHJpdmF0ZSBvbmx5KVxuICAgICAgICAgICAga2V5LnByaXZhdGVLZXkgLy9jYW4gYmUgYSBwdWJsaWNLZXkgb3IgcHJpdmF0ZUtleSwgYXMgbG9uZyBhcyBleHRyYWN0YWJsZSB3YXMgdHJ1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24ocHJpdmF0ZUtleSkge1xuICAgICAgICAgIGtleVBhaXIucHJpdmF0ZSAgPSBuZXcgVWludDhBcnJheShwcml2YXRlS2V5KTtcblxuICAgICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1nZW5lcmF0ZVJTQUtleVBhaXInLCBrZXlQYWlyKTtcbiAgICAgICAgICByZXNvbHZlKGtleVBhaXIpO1xuXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvcihlcnIpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogR2VuZXJhdGVzIGEgMTI4IGJpdCByYW5kb20gdmFsdWUuXG4gICogQHJldHVybiB7Ynl0ZUFycmF5fSAgYXJyYXkgICAgcmFuZG9tIHZhbHVlXG4gICovXG4gIGdlbmVyYXRlSVYoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBhcnJheSA9IG5ldyAgVWludDhBcnJheSgxNik7XG4gICAgX3RoaXMuX2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuXG4gICAgcmV0dXJuIGFycmF5O1xuICB9XG5cbiAgLyoqXG4gICogR2VuZXJhdGVzIGEgMjU2IGJpdCByYW5kb20gdmFsdWUuIDMyIGJpdHMgYXJlIGV4dHJhdGVkIGZyb20gdGhlIG1hY2hpbmUgdGltZSxcbiAgKiB0aGUgcmVtYWluaW5nIGFyZSBnZW5lcmF0ZWQgcmFuZG9tbHlcbiAgKiBAcmV0dXJuIHtieXRlQXJyYXl9ICBhcnJheSAgICByYW5kb20gdmFsdWVcbiAgKi9cbiAgZ2VuZXJhdGVSYW5kb20oKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBhcnJheSA9IG5ldyAgVWludDhBcnJheSgzMik7XG4gICAgX3RoaXMuX2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuXG4gICAgbGV0IGRhdGUgPSBEYXRlLm5vdygpO1xuXG4gICAgbGV0IGRhdGVFbmNvZGVkID0gZW5jb2RlVVRGOChkYXRlLnRvU3RyaW5nKCkpO1xuXG4gICAgLy9leHRyYWN0IHRoZSBsZWFzdCBzaWduaWZpY2FudCA0IGJ5dGVzIGluIHRoZSBkYXRlXG4gICAgbGV0IGZpbmFsRGF0ZSA9IGRhdGVFbmNvZGVkLnNsaWNlKGRhdGVFbmNvZGVkLmxlbmd0aCAtIDQsIGRhdGVFbmNvZGVkLmxlbmd0aCk7XG5cbiAgICAvLyBhZGQgaW4gdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGFycmF5IHRoZSBieXRlcyBleHRyYWN0ZWQgcHJldmlvdXNseTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykgeyBhcnJheVtpXSA9IGZpbmFsRGF0ZVtpXTsgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAqIGdlbmVyYXRlcyBhIHByZW1hc3RlciBzZWNyZXQgKFBNUykgb2YgNDggYnl0ZXMgKDM4NCBiaXRzKSByYW5kb21seVxuICAqIEByZXR1cm4ge2J5dGVBcnJheX0gIGFycmF5ICAgIHByZW1hc3RlciBzZWNyZXQga2V5XG4gICovXG4gIGdlbmVyYXRlUE1TKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgYXJyYXkgPSBuZXcgVWludDhBcnJheSg0OCk7XG4gICAgX3RoaXMuX2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyYXkpO1xuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAqIGdlbmVyYXRlcyBhIG1hc3RlcktleSBzZWNyZXQgKFBNUykgb2YgNDggYnl0ZXMgKDM4NCBiaXRzKSB1c2luZyB0aGUgcHJlbWFzdGVyIHNlY3JldCBhbmRcbiAgKiB0d28gcmFuZG9tc1xuICAqIEByZXR1cm4ge2J5dGVBcnJheX0gIGFycmF5ICAgIG1hc3RlciBzZWNyZXQga2V5IHdpdGggNDggYnl0ZXNcbiAgKi9cbiAgZ2VuZXJhdGVNYXN0ZXJTZWNyZXQoaG1hY0tleSwgZGF0YSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBsZXQga2V5ID0gbmV3IFVpbnQ4QXJyYXkoNDgpO1xuICAgICAgbGV0IHNlZWQgPSBkYXRhO1xuXG4gICAgICBfdGhpcy5fZGlnZXN0KGhtYWNLZXkpLnRoZW4oKGRpZ2VzdGVkS2V5KSA9PiB7XG5cbiAgICAgICAgX3RoaXMuaGFzaEhNQUMoZGlnZXN0ZWRLZXksIHNlZWQpLnRoZW4oZnVuY3Rpb24oa2V5cGFydDApIHtcblxuICAgICAgICAgIC8vY29weSB0aGUgZmlyc3QgMzIgYnl0ZXMgaW50byB0aGUga2V5XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7IGtleVtpXSA9IGtleXBhcnQwW2ldOyB9XG4gICAgICAgICAgcmV0dXJuIF90aGlzLmhhc2hITUFDKGRpZ2VzdGVkS2V5LCBzZWVkICsga2V5cGFydDApO1xuXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oa2V5cGFydDEpIHtcblxuICAgICAgICAgIC8vY29weSB0aGUgZmlyc3QgMTYgYnl0ZXMgdG8gdGhlIGtleSByZW1haW5pbmcgMTYgYnl0ZXNcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHsga2V5W2kgKyAzMl0gPSBrZXlwYXJ0MVtpXTsgfVxuXG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWdlbmVyYXRlTWFzdGVyU2VjcmV0Jywga2V5KTtcbiAgICAgICAgICByZXNvbHZlKGtleSk7XG5cbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWdlbmVyYXRlTWFzdGVyU2VjcmV0JywgZXJyKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogZ2VuZXJhdGVzIGJvdGggdXNlcnMgTUFDIGFuZCBlbmNyeXB0aW9uIGtleXMuIGdlbmVyYXRlIGFzIG91dHB1dCBhbiBhcnJheVxuICAqIHdpdGggNCBieXRlQXJyYXkgZWFjaCB3aXRoIDMyIGJ5dGVzXG4gICogQHBhcmFtICB7Ynl0ZUFycmF5fSAgICAgICAgc2VjcmV0ICAgICAgIHNlY3JldCB0byBiZSB1c2VkIGluIHRoZSBITUFDIGZ1bmN0aW9uXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZGF0YSAgICAgICAgIGluZm9ybWF0aW9uIHRvIGJlIHVzZWQgYXMgc2VlZFxuICAqIEByZXR1cm4ge0FycmF5PGJ5dGVBcnJheT59IGtleSAgICAgICAgICBhcnJheSB3aXRoIHRoZSBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBrZXlzXG4gICovXG4gIGdlbmVyYXRlS2V5cyhobWFjS2V5LCBkYXRhKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgbGV0IGtleSA9IFtdO1xuICAgICAgbGV0IHNlZWQgPSBkYXRhO1xuXG4gICAgICAvLyBpdGVyYXRlIDQgdGltZXMgdG8gb2J0YWluIGEgMTAyNCBrZXkgc2l6ZVxuICAgICAgX3RoaXMuaGFzaEhNQUMoaG1hY0tleSwgc2VlZCkudGhlbihmdW5jdGlvbihrZXlwYXJ0MCkge1xuICAgICAgICBrZXkucHVzaChrZXlwYXJ0MCk7XG4gICAgICAgIHJldHVybiBfdGhpcy5oYXNoSE1BQyhobWFjS2V5LCBzZWVkICsga2V5cGFydDApO1xuXG4gICAgICB9KS50aGVuKGZ1bmN0aW9uKGtleXBhcnQxKSB7XG4gICAgICAgIGtleS5wdXNoKGtleXBhcnQxKTtcbiAgICAgICAgcmV0dXJuIF90aGlzLmhhc2hITUFDKGhtYWNLZXksIHNlZWQgKyBrZXlwYXJ0MSk7XG5cbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24oa2V5cGFydDIpIHtcbiAgICAgICAga2V5LnB1c2goa2V5cGFydDIpO1xuICAgICAgICByZXR1cm4gX3RoaXMuaGFzaEhNQUMoaG1hY0tleSwgc2VlZCArIGtleXBhcnQyKTtcblxuICAgICAgfSkudGhlbihmdW5jdGlvbihrZXlwYXJ0Mykge1xuICAgICAgICBrZXkucHVzaChrZXlwYXJ0Myk7XG5cbiAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWdlbmVyYXRlS2V5cycsIGtleSk7XG4gICAgICAgIHJlc29sdmUoa2V5KTtcblxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1nZW5lcmF0ZUtleXMnLCBlcnIpO1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBsb2cubG9nKGhtYWNLZXksIGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgX2ltcG9ydFJTQXNpZ25LZXkocHJpdktleSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBfdGhpcy5fY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICAgICdwa2NzOCcsIC8vY2FuIGJlICdqd2snIChwdWJsaWMgb3IgcHJpdmF0ZSksICdzcGtpJyAocHVibGljIG9ubHkpLCBvciAncGtjczgnIChwcml2YXRlIG9ubHkpXG4gICAgICAgIHByaXZLZXksXG4gICAgICAgIHsgICAvL3RoZXNlIGFyZSB0aGUgYWxnb3JpdGhtIG9wdGlvbnNcbiAgICAgICAgICBuYW1lOiAnUlNBU1NBLVBLQ1MxLXYxXzUnLFxuICAgICAgICAgIGhhc2g6IHtuYW1lOiAnU0hBLTI1Nid9IC8vY2FuIGJlICdTSEEtMScsICdTSEEtMjU2JywgJ1NIQS0zODQnLCBvciAnU0hBLTUxMidcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZSwgLy93aGV0aGVyIHRoZSBrZXkgaXMgZXh0cmFjdGFibGUgKGkuZS4gY2FuIGJlIHVzZWQgaW4gZXhwb3J0S2V5KVxuICAgICAgICBbJ3NpZ24nXSAvLyd2ZXJpZnknIGZvciBwdWJsaWMga2V5IGltcG9ydCwgJ3NpZ24nIGZvciBwcml2YXRlIGtleSBpbXBvcnRzXG4gICAgICApXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKHByaXZhdGVLZXkpIHtcbiAgICAgICAgLy9yZXR1cm5zIGEgcHVibGljS2V5IChvciBwcml2YXRlS2V5IGlmIHlvdSBhcmUgaW1wb3J0aW5nIGEgcHJpdmF0ZSBrZXkpXG4gICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1faW1wb3J0UlNBc2lnbktleScsIHByaXZhdGVLZXkpO1xuICAgICAgICAgIHJlc29sdmUocHJpdmF0ZUtleSk7XG5cbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdjcnlwdG8tX2ltcG9ydFJTQXNpZ25LZXknLCBlcnIpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9pbXBvcnRSU0F2ZXJpZnlLZXkocHViS2V5KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgICAgJ3Nwa2knLCAvL2NhbiBiZSAnandrJyAocHVibGljIG9yIHByaXZhdGUpLCAnc3BraScgKHB1YmxpYyBvbmx5KSwgb3IgJ3BrY3M4JyAocHJpdmF0ZSBvbmx5KVxuICAgICAgICBwdWJLZXksXG4gICAgICAgIHsgICAvL3RoZXNlIGFyZSB0aGUgYWxnb3JpdGhtIG9wdGlvbnNcbiAgICAgICAgICBuYW1lOiAnUlNBU1NBLVBLQ1MxLXYxXzUnLFxuICAgICAgICAgIGhhc2g6IHtuYW1lOiAnU0hBLTI1Nid9IC8vY2FuIGJlICdTSEEtMScsICdTSEEtMjU2JywgJ1NIQS0zODQnLCBvciAnU0hBLTUxMidcbiAgICAgICAgfSxcbiAgICAgICAgdHJ1ZSwgLy93aGV0aGVyIHRoZSBrZXkgaXMgZXh0cmFjdGFibGUgKGkuZS4gY2FuIGJlIHVzZWQgaW4gZXhwb3J0S2V5KVxuICAgICAgICBbJ3ZlcmlmeSddIC8vJ3ZlcmlmeScgZm9yIHB1YmxpYyBrZXkgaW1wb3J0LCAnc2lnbicgZm9yIHByaXZhdGUga2V5IGltcG9ydHNcbiAgICAgIClcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocHVibGljS2V5KSB7XG4gICAgICAgIC8vcmV0dXJucyBhIHB1YmxpY0tleSAob3IgcHJpdmF0ZUtleSBpZiB5b3UgYXJlIGltcG9ydGluZyBhIHByaXZhdGUga2V5KVxuICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tX2ltcG9ydFJTQXZlcmlmeUtleScsIHB1YmxpY0tleSk7XG4gICAgICAgICAgcmVzb2x2ZShwdWJsaWNLZXkpO1xuXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIGxvZy5lcnJvcignY3J5cHRvLV9pbXBvcnRSU0F2ZXJpZnlLZXknLCBlcnIpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9pbXBvcnRSU0FlbmNyeXB0S2V5KHB1YktleSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBfdGhpcy5fY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgICAgICdzcGtpJywgLy9jYW4gYmUgJ2p3aycgKHB1YmxpYyBvciBwcml2YXRlKSwgJ3Nwa2knIChwdWJsaWMgb25seSksIG9yICdwa2NzOCcgKHByaXZhdGUgb25seSlcbiAgICAgICAgcHViS2V5LFxuICAgICAgICB7ICAgLy90aGVzZSBhcmUgdGhlIGFsZ29yaXRobSBvcHRpb25zXG4gICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICBoYXNoOiB7bmFtZTogJ1NIQS0yNTYnfSAvL2NhbiBiZSAnU0hBLTEnLCAnU0hBLTI1NicsICdTSEEtMzg0Jywgb3IgJ1NIQS01MTInXG4gICAgICAgIH0sXG4gICAgICAgIHRydWUsIC8vd2hldGhlciB0aGUga2V5IGlzIGV4dHJhY3RhYmxlIChpLmUuIGNhbiBiZSB1c2VkIGluIGV4cG9ydEtleSlcbiAgICAgICAgWydlbmNyeXB0J10gLy8nZW5jcnlwdCcgb3IgJ3dyYXBLZXknIGZvciBwdWJsaWMga2V5IGltcG9ydCBvclxuICAgICAgICAvLydkZWNyeXB0JyBvciAndW53cmFwS2V5JyBmb3IgcHJpdmF0ZSBrZXkgaW1wb3J0c1xuICAgICAgKVxuICAgICAgICAudGhlbihmdW5jdGlvbihwdWJsaWNLZXkpIHtcbiAgICAgICAgLy9yZXR1cm5zIGEgcHVibGljS2V5IChvciBwcml2YXRlS2V5IGlmIHlvdSBhcmUgaW1wb3J0aW5nIGEgcHJpdmF0ZSBrZXkpXG4gICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1faW1wb3J0UlNBZW5jcnlwdEtleScsIHB1YmxpY0tleSk7XG4gICAgICAgICAgcmVzb2x2ZShwdWJsaWNLZXkpO1xuXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIGxvZy5lcnJvcignY3J5cHRvLV9pbXBvcnRSU0FlbmNyeXB0S2V5JywgZXJyLm5hbWUpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9pbXBvcnRSU0FkZWNyeXB0S2V5KHByaXZLZXkpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgX3RoaXMuX2NyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAncGtjczgnLCAvL2NhbiBiZSAnandrJyAocHVibGljIG9yIHByaXZhdGUpLCAnc3BraScgKHB1YmxpYyBvbmx5KSwgb3IgJ3BrY3M4JyAocHJpdmF0ZSBvbmx5KVxuICAgICAgICBwcml2S2V5LFxuICAgICAgICB7ICAgLy90aGVzZSBhcmUgdGhlIGFsZ29yaXRobSBvcHRpb25zXG4gICAgICAgICAgbmFtZTogJ1JTQS1PQUVQJyxcbiAgICAgICAgICBoYXNoOiB7bmFtZTogJ1NIQS0yNTYnfSAvL2NhbiBiZSAnU0hBLTEnLCAnU0hBLTI1NicsICdTSEEtMzg0Jywgb3IgJ1NIQS01MTInXG4gICAgICAgIH0sXG4gICAgICAgIHRydWUsIC8vd2hldGhlciB0aGUga2V5IGlzIGV4dHJhY3RhYmxlIChpLmUuIGNhbiBiZSB1c2VkIGluIGV4cG9ydEtleSlcbiAgICAgICAgWydkZWNyeXB0J10gLy8nZW5jcnlwdCcgb3IgJ3dyYXBLZXknIGZvciBwdWJsaWMga2V5IGltcG9ydCBvclxuICAgICAgICAvLydkZWNyeXB0JyBvciAndW53cmFwS2V5JyBmb3IgcHJpdmF0ZSBrZXkgaW1wb3J0c1xuICAgICAgKVxuICAgICAgICAudGhlbihmdW5jdGlvbihwcml2YXRlS2V5KSB7XG4gICAgICAgIC8vcmV0dXJucyBhIHB1YmxpY0tleSAob3IgcHJpdmF0ZUtleSBpZiB5b3UgYXJlIGltcG9ydGluZyBhIHByaXZhdGUga2V5KVxuICAgICAgICAvLyBsb2cubG9nKCdjcnlwdG8tX2ltcG9ydFJTQWRlY3J5cHRLZXknLCBwcml2YXRlS2V5KTtcbiAgICAgICAgICByZXNvbHZlKHByaXZhdGVLZXkpO1xuXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIGxvZy5lcnJvcignY3J5cHRvLV9pbXBvcnRSU0FkZWNyeXB0S2V5JywgZXJyKTtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBjb25jYXRQTVN3aXRoUmFuZG9tcyhwbXMsIHRvUmFuZG9tLCBmcm9tUmFuZG9tKSB7XG5cbiAgICBsZXQgZmluYWxLZXkgPSBuZXcgVWludDhBcnJheShwbXMubGVuZ3RoICsgdG9SYW5kb20ubGVuZ3RoICsgZnJvbVJhbmRvbS5sZW5ndGgpO1xuXG4gICAgLy8gYWRkIFByZW1hc3RlcktleVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmaW5hbEtleVtpXSA9IHBtc1tpXTtcbiAgICB9XG5cbiAgICAvL2FkZCB0byByYW5kb21cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvUmFuZG9tLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmaW5hbEtleVtpICsgcG1zLmxlbmd0aF0gPSBwbXNbaV07XG4gICAgfVxuXG4gICAgLy9hZGQgZnJvbSByYW5kb21cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21SYW5kb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZpbmFsS2V5W2kgKyBwbXMubGVuZ3RoICsgdG9SYW5kb20ubGVuZ3RoXSA9IHBtc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmluYWxLZXk7XG4gIH1cblxuICBfZ2VuZXJhdGUyNTZiaXRLZXkoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgYXJyYXkgPSBuZXcgIFVpbnQ4QXJyYXkoMzIpO1xuICAgIF90aGlzLl9jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycmF5KTtcblxuICAgIHJldHVybiBhcnJheTtcbiAgfVxuXG4gIC8qKlxuICAqIGltcG9ydHMgdGhlIHNlY3JldCB0byB0aGUgSE1BQyBmdW5jdGlvblxuICAqIEBwYXJhbSAge2J5dGVBcnJheX0gICBhcnJheUJ1ZmZlciAgICAgYnl0ZXMgdG8gaW1wb3J0IGFzIGtleVxuICAqIEByZXR1cm4ge0pTT059ICAgICAgIGtleSAgICAgICAgICAgICAga2V5IHJlYWR5IHRvIGJlIHVzZWQgaW4gdGhlIEhNQUMgY3J5cHRvZ3JhcGhpYyBmdW5jdGlvblxuICAqL1xuICBfaW1wb3J0SE1BQ2tleShhcnJheUJ1ZmZlcikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIF90aGlzLl9kaWdlc3QoYXJyYXlCdWZmZXIpLnRoZW4oKGtleSkgPT4ge1xuXG4gICAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLmltcG9ydEtleShcbiAgICAgICAgICAncmF3JywgLy9jYW4gYmUgJ2p3aycgb3IgJ3JhdydcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgeyAgIC8vdGhpcyBpcyB0aGUgYWxnb3JpdGhtIG9wdGlvbnNcbiAgICAgICAgICAgIG5hbWU6ICdITUFDJyxcbiAgICAgICAgICAgIGhhc2g6IHtuYW1lOiAnU0hBLTI1Nid9LCAvL2NhbiBiZSAnU0hBLTEnLCAnU0hBLTI1NicsICdTSEEtMzg0Jywgb3IgJ1NIQS01MTInXG4gICAgICAgICAgICBsZW5ndGg6IDI1NiAvL29wdGlvbmFsLCBpZiB5b3Ugd2FudCB5b3VyIGtleSBsZW5ndGggdG8gZGlmZmVyIGZyb20gdGhlIGhhc2ggZnVuY3Rpb24ncyBibG9jayBsZW5ndGhcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRydWUsIC8vd2hldGhlciB0aGUga2V5IGlzIGV4dHJhY3RhYmxlIChpLmUuIGNhbiBiZSB1c2VkIGluIGV4cG9ydEtleSlcbiAgICAgICAgICBbJ3NpZ24nLCAndmVyaWZ5J10gLy9jYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mICdzaWduJyBhbmQgJ3ZlcmlmeSdcbiAgICAgICAgKS50aGVuKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIC8vcmV0dXJucyB0aGUgc3ltbWV0cmljIGtleVxuICAgICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1faW1wb3J0SE1BQ2tleScsIGtleSk7XG4gICAgICAgICAgcmVzb2x2ZShrZXkpO1xuICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBfZGlnZXN0KHZhbHVlKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIF90aGlzLl9jcnlwdG8uc3VidGxlLmRpZ2VzdChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdTSEEtMjU2J1xuICAgICAgICB9LFxuICAgICAgICB2YWx1ZSAvL1RoZSBkYXRhIHlvdSB3YW50IHRvIGhhc2ggYXMgYW4gQXJyYXlCdWZmZXJcbiAgICAgIClcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oaGFzaCkge1xuICAgICAgICAvL3JldHVybnMgdGhlIGhhc2ggYXMgYW4gQXJyYXlCdWZmZXJcbiAgICAgICAgLy8gbG9nLmxvZygnY3J5cHRvLWRpZ2VzdCcsIG5ldyBVaW50OEFycmF5KGhhc2gpKTtcbiAgICAgICAgICByZXNvbHZlKG5ldyBVaW50OEFycmF5KGhhc2gpKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIGxvZy5lcnJvcihlcnIpO1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuICB9XG5cbiAgX2ltcG9ydEFFU2tleShhcnJheUJ1ZmZlcikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgX3RoaXMuX2NyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICAgICAncmF3JywgLy9jYW4gYmUgJ2p3aycgb3IgJ3JhdydcbiAgICAgICAgYXJyYXlCdWZmZXIsXG4gICAgICAgIHsgICAvL3RoaXMgaXMgdGhlIGFsZ29yaXRobSBvcHRpb25zXG4gICAgICAgICAgbmFtZTogJ0FFUy1DQkMnXG4gICAgICAgIH0sXG4gICAgICAgIHRydWUsIC8vd2hldGhlciB0aGUga2V5IGlzIGV4dHJhY3RhYmxlIChpLmUuIGNhbiBiZSB1c2VkIGluIGV4cG9ydEtleSlcbiAgICAgICAgWydlbmNyeXB0JywgJ2RlY3J5cHQnXSAvL2NhbiBiZSAnZW5jcnlwdCcsICdkZWNyeXB0JywgJ3dyYXBLZXknLCBvciAndW53cmFwS2V5J1xuICAgICAgKVxuICAgICAgICAudGhlbihmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgLy9yZXR1cm5zIHRoZSBzeW1tZXRyaWMga2V5XG4gICAgICAgIC8vIGxvZy5sb2coJ2NyeXB0by1pbXBvcnRBRVNrZXknLCBrZXkpO1xuICAgICAgICAgIHJlc29sdmUoa2V5KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIGxvZy5lcnJvcignY3J5cHRvLWltcG9ydEFFU2tleScsIGVycik7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX3NoYTI1NihzdHIpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBidWZmZXIgPSBuZXcgVGV4dEVuY29kZXIoJ3V0Zi04JykuZW5jb2RlKHN0cik7XG4gICAgcmV0dXJuIF90aGlzLl9jcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGJ1ZmZlcikudGhlbihmdW5jdGlvbihoYXNoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuX2hleChoYXNoKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9oZXgoYnVmZmVyKSB7XG4gICAgbGV0IGhleENvZGVzID0gW107XG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoYnVmZmVyKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZXcuYnl0ZUxlbmd0aDsgaSArPSA0KSB7XG4gICAgICAvLyBVc2luZyBnZXRVaW50MzIgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgbmVlZGVkICh3ZSBwcm9jZXNzIDQgYnl0ZXMgZWFjaCB0aW1lKVxuICAgICAgbGV0IHZhbHVlID0gdmlldy5nZXRVaW50MzIoaSlcblxuICAgICAgbGV0IHN0cmluZ1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoMTYpXG5cbiAgICAgIGxldCBwYWRkaW5nID0gJzAwMDAwMDAwJ1xuICAgICAgbGV0IHBhZGRlZFZhbHVlID0gKHBhZGRpbmcgKyBzdHJpbmdWYWx1ZSkuc2xpY2UoLXBhZGRpbmcubGVuZ3RoKVxuICAgICAgaGV4Q29kZXMucHVzaChwYWRkZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gSm9pbiBhbGwgdGhlIGhleCBzdHJpbmdzIGludG8gb25lXG4gICAgcmV0dXJuIGhleENvZGVzLmpvaW4oJycpO1xuICB9XG5cblxufVxuXG5leHBvcnQgZGVmYXVsdCBDcnlwdG87XG4iLCIvLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0NyeXB0b01hbmFnZXInKTtcblxuaW1wb3J0IHtkaXZpZGVVUkwsIGlzRGF0YU9iamVjdFVSTCwgaXNMZWdhY3ksIGNoYXRrZXlzVG9TdHJpbmdDbG9uZXIsIGNoYXRrZXlzVG9BcnJheUNsb25lciwgcGFyc2VNZXNzYWdlVVJMLFxuICBwYXJzZSwgc3RyaW5naWZ5LCBlbmNvZGUsIGRlY29kZSwgZGVjb2RlVG9VaW50OEFycmF5LCBwYXJzZVRvVWludDhBcnJheSwgZ2VuZXJhdGVHVUlEfSBmcm9tICcuLi91dGlscy91dGlscy5qcyc7XG5pbXBvcnQgQ3J5cHRvIGZyb20gJy4vQ3J5cHRvJztcblxuLyoqXG4qICBUaGUgQ3J5cHRvIE1hbmFnZXIgcHJvdmlkZXMgbWFuYWdlcyBjcnlwdG9ncmFwaGljIGZlYXR1cmVzIGZvciB0aGUgcnVudGltZSBpbmNsdWRpbmc6XG4qICAtIE11dHVhbCBBdXRoZW50aWNhdGlvbiBiZXR3ZWVuIHBlZXJzXG4qICAtIENyeXB0byBLZXlzXG4qICAtIGUyZSBlbmNyeXB0aW9uIGFuZCBkZWNyaXB0aW9uIG9mIGNvbW11bmljYXRpb24gYmV0d2VlbiBIeXBlcnRpZXMgYW5kIGR0YSBvYmplY3RzXG4qXG4qL1xuY2xhc3MgQ3J5cHRvTWFuYWdlciB7XG5cbiAgLyoqXG4gICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgdG8gaW5pdGlhbGlzZSB0aGUgQ3J5cHRvTWFuYWdlciwgaXQgZG9lcyBub3QgcmVxdWlyZSBhbnkgaW5wdXQuXG4gICogVGhlIGluaXQoKSBtdXN0IGNhbGxlZCBpbiBvcmRlciB0byBzZXQgbWFuZGF0b3JpZXMgYXR0cmlidXRlc1xuICAqL1xuXG4gIGNvbnN0cnVjdG9yKHN0b3JhZ2VNYW5hZ2VyKSB7XG4gICAgdGhpcy5zdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VyO1xuICAgIHRoaXMudXNlckRlZmF1bHRLZXlSZWYgPSAndXNlckFzeW1tZXRyaWNLZXknO1xuICB9XG5cbiAgaW5pdChydW50aW1lVVJMLCBydW50aW1lQ2FwYWJpbGl0aWVzLCBzdG9yYWdlTWFuYWdlciwgZGF0YU9iamVjdHNTdG9yYWdlLCByZWdpc3RyeSwgY29yZURpc2NvdmVyeSwgaWRtLCBydW50aW1lRmFjdG9yeSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIXJ1bnRpbWVVUkwpIHRocm93IG5ldyBFcnJvcignW10gcnVudGltZVVSTCBpcyBtaXNzaW5nLicpO1xuICAgIGlmICghc3RvcmFnZU1hbmFnZXIpIHRocm93IG5ldyBFcnJvcignc3RvcmFnZU1hbmFnZXIgaXMgbWlzc2luZycpO1xuICAgIGlmICghcnVudGltZUZhY3RvcnkpIHRocm93IG5ldyBFcnJvcigncnVudGltZUZhY3RvcnkgaXMgbWlzc2luZycpO1xuXG4gICAgX3RoaXMuX3J1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xuICAgIF90aGlzLl9jcnlwdG9NYW5hZ2VyVVJMID0gX3RoaXMuX3J1bnRpbWVVUkwgKyAnL2NyeXB0b01hbmFnZXInO1xuXG4gICAgLy9fdGhpcy5fbXlVUkwgPSBfdGhpcy5fcnVudGltZVVSTCArICcvY3J5cHRvJztcbiAgICBfdGhpcy5zdG9yYWdlTWFuYWdlciA9IHN0b3JhZ2VNYW5hZ2VyO1xuICAgIF90aGlzLmRhdGFPYmplY3RzU3RvcmFnZSA9IGRhdGFPYmplY3RzU3RvcmFnZTtcbiAgICBfdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzID0gcnVudGltZUNhcGFiaWxpdGllcztcblxuICAgIF90aGlzLl9ydW50aW1lRmFjdG9yeSA9IHJ1bnRpbWVGYWN0b3J5O1xuICAgIF90aGlzLl9kb21haW4gPSBkaXZpZGVVUkwoX3RoaXMuX3J1bnRpbWVVUkwpLmRvbWFpbjtcblxuICAgIF90aGlzLmNyeXB0byA9IG5ldyBDcnlwdG8oX3RoaXMuX3J1bnRpbWVGYWN0b3J5KTtcblxuICAgIC8vIGhhc2hUYWJsZSB0byBzdG9yZSBhbGwgdGhlIGNyeXB0byBpbmZvcm1hdGlvbiBiZXR3ZWVuIHR3byBoeXBlcnRpZXNcbiAgICBfdGhpcy5jaGF0S2V5cyA9IHt9O1xuXG4gICAgLy8gaGFzaFRhYmxlIHRvIHN0b3JlIHRoZSBzeW1tZXRyaWMga2V5cyB0byBiZSB1c2VkIGluIHRoZSBjaGF0IGdyb3VwXG4gICAgX3RoaXMuZGF0YU9iamVjdFNlc3Npb25LZXlzID0ge307XG5cbiAgICAvL2ZhaWxzYWZlIHRvIGVuYWJsZS9kaXNhYmxlIGFsbCB0aGUgY3JpcHRvZ3JhcGhpYyBmdW5jdGlvbnNcbiAgICBfdGhpcy5pc1RvVXNlRW5jcnlwdGlvbiA9IHRydWU7XG5cbiAgICBfdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgICBfdGhpcy5fY29yZURpc2NvdmVyeSA9IGNvcmVEaXNjb3Zlcnk7XG5cbiAgICBfdGhpcy5faWRtID0gaWRtO1xuXG4gIH1cblxuICAvLyoqKioqKioqKioqKioqKioqKiogR0VUIEFORCBTRVQgTUVUSE9EUyAqKioqKioqKioqKioqKioqKioqXG5cbiAgLyoqXG4gICogcmV0dXJuIHRoZSBtZXNzYWdlQnVzIGluIHRoaXMgUmVnaXN0cnlcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXG4gICovXG4gIGdldCBtZXNzYWdlQnVzKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9tZXNzYWdlQnVzO1xuICB9XG5cbiAgLyoqXG4gICogU2V0IHRoZSBtZXNzYWdlQnVzIGluIHRoaXMgUmVnaXN0cnlcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXG4gICovXG4gIHNldCBtZXNzYWdlQnVzKG1lc3NhZ2VCdXMpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcblxuICAgIF90aGlzLmFkZENyeXB0b0dVSUxpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICogcmV0dXJuIHRoZSBjb3JlRGlzY292ZXJ5IGNvbXBvbmVudFxuICAqL1xuICBnZXQgY29yZURpc2NvdmVyeSgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fY29yZURpc2NvdmVyeTtcbiAgfVxuXG4gIC8qKlxuICAqIHJldHVybiB1c2VyJ3MgcHVibGljIGtleVxuICAqL1xuXG4gIC8qICBnZXRNeVB1YmxpY0tleSgpIHtcbiAgICAvLyB0byBiZSBpbXBsZW1lbnRlZFxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKT0+IHtcbiAgICAgIHJlc29sdmUoJ215cHVibGlja2V5Jyk7XG5cbiAgICB9KTtcbiAgfVxuKi9cbiAgLyoqXG4gICogU2V0IHRoZSBjb3JlRGlzY292ZXJ5IGNvbXBvbmVudFxuICAqIEBwYXJhbSB7Y29yZURpc2NvdmVyeX0gY29yZURpc2NvdmVyeVxuICAqL1xuICBzZXQgY29yZURpc2NvdmVyeShjb3JlRGlzY292ZXJ5KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fY29yZURpc2NvdmVyeSA9IGNvcmVEaXNjb3Zlcnk7XG4gIH1cblxuICAvKipcbiAgKiByZXR1cm4gdGhlIHJlZ2lzdHJ5IGluIHRoaXMgaWRNb2R1bGVcbiAgKiBAcGFyYW0ge3JlZ2lzdHJ5fSAgICAgICAgICAgcmVnaXN0cnlcbiAgKi9cbiAgZ2V0IHJlZ2lzdHJ5KCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIF90aGlzLl9yZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAqIFNldCB0aGUgcmVnaXN0cnkgaW4gdGhpcyBpZE1vZHVsZVxuICAqIEBwYXJhbSB7cmVnaXN0cnl9ICAgICByZWdcbiAgKi9cbiAgc2V0IHJlZ2lzdHJ5KHJlZ2lzdHJ5KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBfdGhpcy5fcmVnaXN0cnkgPSByZWdpc3RyeTtcbiAgfVxuXG5cbiAgLy8gdG8gYmUgdXNlZCB0byBpbml0aWFsaXNlIElETSB3aXRoIFNlc3Npb25LZXlzIHVzZWQgaW4gcHJldmlvdXMgc2Vzc2lvblxuXG4gIGxvYWRTZXNzaW9uS2V5cygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5nZXQoJ2RhdGFPYmplY3RTZXNzaW9uS2V5cycpLnRoZW4oKHNlc3Npb25LZXlzKSA9PiB7XG4gICAgICAgIGlmIChzZXNzaW9uS2V5cykgX3RoaXMuZGF0YU9iamVjdFNlc3Npb25LZXlzID0gc2Vzc2lvbktleXM7XG4gICAgICAgIGVsc2UgX3RoaXMuZGF0YU9iamVjdFNlc3Npb25LZXlzID0ge307XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX2lzRnJvbVJlbW90ZVNNKGZyb20pIHtcbiAgICBsZXQgc3BsaXRGcm9tID0gZnJvbS5zcGxpdCgnOi8vJyk7XG4gICAgcmV0dXJuIHNwbGl0RnJvbVswXSA9PT0gJ3J1bnRpbWUnICYmIGZyb20gIT09IHRoaXMuX3J1bnRpbWVVUkwgKyAnL3NtJztcbiAgfVxuXG4gIGFkZENyeXB0b0dVSUxpc3RlbmVycygpIHtcbiAgICAvL1RPRE86IENoYW5nZSB0aGUgR1VJIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2RcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgX3RoaXMuX21lc3NhZ2VCdXMuYWRkTGlzdGVuZXIoX3RoaXMuX2NyeXB0b01hbmFnZXJVUkwsIChtc2cpID0+IHtcbiAgICAgIGxldCBmdW5jTmFtZSA9IG1zZy5ib2R5Lm1ldGhvZDtcblxuICAgICAgLy9sZXQgcmV0dXJuZWRWYWx1ZTtcbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gJ2dlbmVyYXRlUlNBS2V5UGFpcicpIHtcbiAgICAgICAgX3RoaXMuX2NyeXB0by5nZXRNeVB1YmxpY0tleSgpLnRoZW4oKGtleSkgPT4ge1xuICAgICAgICAgIGxldCB2YWx1ZSA9IHt0eXBlOiAnZXhlY3V0ZScsIHZhbHVlOiBrZXksIGNvZGU6IDIwMH07XG4gICAgICAgICAgbGV0IHJlcGx5TXNnID0ge2lkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIHRvOiBtc2cuZnJvbSwgZnJvbTogbXNnLnRvLCBib2R5OiB2YWx1ZX07XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHJlcGx5TXNnKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignT24gYWRkR1VJTGlzdGVuZXJzIGZyb20gaWYgZ2VuZXJhdGVSU0FLZXlQYWlyIG1ldGhvZCBwb3N0TWVzc2FnZSBlcnJvcjogJyArIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgfSk7XG4gIH1cblxuXG4gIC8vKioqKioqKioqKioqKioqKioqKiBFTkNSWVBUSU9OIE1FVEhPRFMgKioqKioqKioqKioqKioqKioqKlxuICAvKipcbiogSWRlbnRpZmllcyB0aGUgbWVzc2FnZXMgdG8gYmUgZW5jcnlwdGVkXG4qIEBwYXJhbSB7TWVzc2FnZX0gICAgbWVzc2FnZVxuKiBAcmV0dXJucyB7Ym9vbGVhbn0gIHJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2FnZSByZXF1aXJlcyBlbmNyeXB0aW9uXG4qL1xuXG4gIF9pc1RvRW5jcnlwdChtZXNzYWdlKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsb2cubG9nKCdbQ3J5cHRvTWFuYWdlci5faXNUb0VuY3J5cHRdJywgbWVzc2FnZSk7XG4gICAgbGV0IGlzQ3JlYXRlID0gbWVzc2FnZS50eXBlID09PSAnY3JlYXRlJztcbiAgICBsZXQgaXNGcm9tSHlwZXJ0eSA9IG1lc3NhZ2UuZnJvbS5pbmNsdWRlcygnaHlwZXJ0eTovLycpO1xuICAgIGxldCBpc1RvSHlwZXJ0eSA9IG1lc3NhZ2UudG8uaW5jbHVkZXMoJ2h5cGVydHk6Ly8nKTtcbiAgICBsZXQgaXNUb0RhdGFPYmplY3QgPSBpc0RhdGFPYmplY3RVUkwobWVzc2FnZS50byk7XG4gICAgbGV0IHJlcG9ydGVyID0gX3RoaXMucmVnaXN0cnkuZ2V0RGF0YU9iamVjdFJlcG9ydGVyKG1lc3NhZ2UudG8pO1xuXG4gICAgbGV0IGRvTXV0dWFsQXV0aGVudGljYXRpb24gPSBtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSA/IG1lc3NhZ2UuYm9keS5tdXR1YWxcbiAgICA6ICBtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmIG1lc3NhZ2UuYm9keS52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykgPyBtZXNzYWdlLmJvZHkudmFsdWUubXV0dWFsICA6IHRydWU7XG5cbiAgICBpZiAoIWRvTXV0dWFsQXV0aGVudGljYXRpb24pIHJldHVybiBmYWxzZTtcbiAgICBpZiAocmVwb3J0ZXIgIT09IG51bGwgJiYgaXNMZWdhY3kocmVwb3J0ZXIpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9pZiBpcyBub3QgdG8gYXBwbHkgZW5jcnlwdGlvbiwgdGhlbiByZXR1cm5zIHJlc29sdmVcbiAgICBpZiAoIXRoaXMuaXNUb1VzZUVuY3J5cHRpb24gJiYgIShtZXNzYWdlLnR5cGUgPT09ICdoYW5kc2hha2UnKSkge1xuICAgICAgbG9nLmluZm8oJ25vdCBoYW5kc2hha2U6IGVuY3J5cHRpb24gZGlzYWJsZWQnKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSAndXBkYXRlJykge1xuICAgICAgbG9nLmluZm8oJ3VwZGF0ZTplbmNyeXB0aW9uIGRpc2FibGVkJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ2ZvcndhcmQnKSB7XG4gICAgICBsb2cuaW5mbygnZm9yd2FyZDplbmNyeXB0aW9uIGRpc2FibGVkJyk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzTGVnYWN5KG1lc3NhZ2UudG8pKSByZXR1cm4gZmFsc2U7XG5cbiAgICByZXR1cm4gKChpc0NyZWF0ZSAmJiBpc0Zyb21IeXBlcnR5ICYmIGlzVG9IeXBlcnR5KSB8fCAoaXNDcmVhdGUgJiYgaXNGcm9tSHlwZXJ0eSAmJiBpc1RvRGF0YU9iamVjdCAmJiBkb011dHVhbEF1dGhlbnRpY2F0aW9uKSB8fCBtZXNzYWdlLnR5cGUgPT09ICdoYW5kc2hha2UnIHx8IChtZXNzYWdlLnR5cGUgPT09ICd1cGRhdGUnICYmIGRvTXV0dWFsQXV0aGVudGljYXRpb24pKTtcbiAgfVxuXG5cbiAgX2lzVG9EZWNyeXB0KG1lc3NhZ2UpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gRm9yIHN5YnNjcmliZSBtZXNzYWdlIGxldCdzIHN0YXJ0IHRoZSBtdXR1YWxBdXRoZW50aWNhdGlvblxuICAgICAgbGV0IGlzU3Vic2NyaXB0aW9uID0gbWVzc2FnZS50eXBlID09PSAnc3Vic2NyaWJlJztcbiAgICAgIGxldCBpc0Zyb21SZW1vdGVTTSA9IF90aGlzLl9pc0Zyb21SZW1vdGVTTShtZXNzYWdlLmZyb20pO1xuICAgICAgbGV0IG11dHVhbCA9IG1lc3NhZ2UuYm9keS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSAmJiBtZXNzYWdlLmJvZHkudmFsdWUuaGFzT3duUHJvcGVydHkoJ211dHVhbCcpID8gbWVzc2FnZS5ib2R5LnZhbHVlLm11dHVhbCA6IFxuICAgICAgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSA/IG1lc3NhZ2UuYm9keS5tdXR1YWwgOiB0cnVlO1xuICAgICAgLy8gICAgICBsZXQgbXV0dWFsID0gbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSA/IG1lc3NhZ2UuYm9keS5tdXR1YWwgOiBmYWxzZTtcblxuaWYgKGlzU3Vic2NyaXB0aW9uICYmIGlzRnJvbVJlbW90ZVNNICYmIG11dHVhbCkge1xuLy8gIGlmIChpc1N1YnNjcmlwdGlvbiAmJiBpc0Zyb21SZW1vdGVTTSApIHtcbiAgICBsb2cubG9nKCdbQ3J5cHRvTWFuYWdlci5faXNUb0RlY3J5cHRdIF9kb011dHVhbEF1dGhlbnRpY2F0aW9uUGhhc2UxJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ3J5cHRvTWFuYWdlci5faXNUb0RlY3J5cHRdICcsIG1lc3NhZ2UpO1xuICAgICAgICBsZXQgcmVwb3J0ZXIgPSBfdGhpcy5yZWdpc3RyeS5nZXREYXRhT2JqZWN0UmVwb3J0ZXIobWVzc2FnZS50byk7XG4gICAgICAgIGlmIChyZXBvcnRlciAhPT0gbnVsbCAmJiBpc0xlZ2FjeShyZXBvcnRlcikpIHtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5fZG9NdXR1YWxBdXRoZW50aWNhdGlvblBoYXNlMShtZXNzYWdlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG5cbi8vICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbWVzc2FnZS5ib2R5Lmhhc093blByb3BlcnR5KCd2YWx1ZScpICYmIHR5cGVvZiBtZXNzYWdlLmJvZHkudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UuaGFzT3duUHJvcGVydHkoJ2JvZHknKSAmJiBtZXNzYWdlLmJvZHkuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykgJiYgdHlwZW9mIG1lc3NhZ2UuYm9keS52YWx1ZSA9PT0gJ3N0cmluZycgJiYgbXV0dWFsKSB7XG4gICAgICAgIGxvZy5sb2coJ1tDcnlwdG9NYW5hZ2VyLl9pc1RvRGVjcnlwdF0gdHJ1ZScpO1xuICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmxvZygnW0NyeXB0b01hbmFnZXIuX2lzVG9EZWNyeXB0XSBmYWxzZScpO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH1cblxuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgbG9nLmVycm9yKCdbQ3J5cHRvTWFuYWdlci5faXNUb0RlY3J5cHRdJywgZXJyb3IpO1xuICAgIH0pO1xuXG4gIH1cblxuICBlbmNyeXB0TWVzc2FnZShtZXNzYWdlKSB7XG4gICAgLy9sb2cuaW5mbygnZW5jcnlwdE1lc3NhZ2U6bWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsb2cubG9nKCdlbmNyeXB0IG1lc3NhZ2UgJyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGxldCBpc0hhbmRTaGFrZVR5cGUgPSBtZXNzYWdlLnR5cGUgPT09ICdoYW5kc2hha2UnO1xuXG4gICAgICAvL2lmIGlzIG5vdCB0byBhcHBseSBlbmNyeXB0aW9uLCB0aGVuIHJldHVybnMgcmVzb2x2ZVxuICAgICAgaWYgKCFfdGhpcy5faXNUb0VuY3J5cHQobWVzc2FnZSkpIHtcbiAgICAgICAgLy8gbG9nLmxvZygnZGVjcnlwdGlvbiBkaXNhYmxlZCcpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShtZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGRhdGFPYmplY3RVUkwgPSBwYXJzZU1lc3NhZ2VVUkwobWVzc2FnZS50byk7XG5cbiAgICAgIGxldCBpc1RvRGF0YU9iamVjdCA9IGlzRGF0YU9iamVjdFVSTChkYXRhT2JqZWN0VVJMKTtcbiAgICAgIGxldCBpc1RvTGVnYWN5SWRlbnRpdHkgPSBpc0xlZ2FjeShtZXNzYWdlLnRvKTtcbiAgICAgIGxldCBpc0Zyb21IeXBlcnR5ID0gZGl2aWRlVVJMKG1lc3NhZ2UuZnJvbSkudHlwZSA9PT0gJ2h5cGVydHknO1xuICAgICAgbGV0IGlzVG9IeXBlcnR5ID0gZGl2aWRlVVJMKG1lc3NhZ2UudG8pLnR5cGUgPT09ICdoeXBlcnR5JztcblxuICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICAgICAgbG9nLmxvZygnZW5jcnlwdCBtZXNzYWdlOiBtZXNzYWdlIHR5cGUgdXBkYXRlJyk7XG4gICAgICAgIHJldHVybiByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNUb0xlZ2FjeUlkZW50aXR5KSB7XG4gICAgICAgIHJlc29sdmUobWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzRnJvbUh5cGVydHkgJiYgaXNUb0h5cGVydHkpIHtcbiAgICAgICAgbGV0IHVzZXJVUkwgPSBfdGhpcy5fcmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKG1lc3NhZ2UuZnJvbSk7XG4gICAgICAgIGlmICh1c2VyVVJMKSB7XG5cbiAgICAgICAgICAvLyBjaGVjayBpZiBleGlzdHMgYW55IGtleXMgYmV0d2VlbiB0d28gdXNlcnNcbiAgICAgICAgICBsZXQgY2hhdEtleXMgPSBfdGhpcy5jaGF0S2V5c1ttZXNzYWdlLmZyb20gKyAnPC0+JyArIG1lc3NhZ2UudG9dO1xuICAgICAgICAgIGlmICghY2hhdEtleXMpIHtcbiAgICAgICAgICAgIGNoYXRLZXlzID0gX3RoaXMuX25ld0NoYXRDcnlwdG8obWVzc2FnZSwgdXNlclVSTCk7XG5cbiAgICAgICAgICAgIC8vbG9nLmxvZygnY3JlYXRlQ2hhdEtleSBlbmNyeXB0JywgbWVzc2FnZS5mcm9tICsgbWVzc2FnZS50byk7XG4gICAgICAgICAgICBfdGhpcy5jaGF0S2V5c1ttZXNzYWdlLmZyb20gKyAnPC0+JyArIG1lc3NhZ2UudG9dID0gY2hhdEtleXM7XG4gICAgICAgICAgICBtZXNzYWdlLmJvZHkuaGFuZHNoYWtlUGhhc2UgPSAnc3RhcnRIYW5kU2hha2UnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjaGF0S2V5cy5hdXRoZW50aWNhdGVkICYmICFpc0hhbmRTaGFrZVR5cGUpIHtcblxuICAgICAgICAgICAgbGV0IGl2ID0gX3RoaXMuY3J5cHRvLmdlbmVyYXRlSVYoKTtcbiAgICAgICAgICAgIF90aGlzLmNyeXB0by5lbmNyeXB0QUVTKGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21TZXNzaW9uS2V5LCBzdHJpbmdpZnkobWVzc2FnZS5ib2R5LnZhbHVlKSwgaXYpLnRoZW4oZW5jcnlwdGVkVmFsdWUgPT4ge1xuXG4gICAgICAgICAgICAgIGxldCBmaWx0ZXJlZE1lc3NhZ2UgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChtZXNzYWdlLCBzdHJpbmdpZnkobWVzc2FnZS5ib2R5LnZhbHVlKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdpZnkoaXYpLCBjaGF0S2V5cy5oeXBlcnR5RnJvbS5tZXNzYWdlSW5mbyk7XG5cbiAgICAgICAgICAgICAgX3RoaXMuY3J5cHRvLmhhc2hITUFDKGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21IYXNoS2V5LCBmaWx0ZXJlZE1lc3NhZ2UpLnRoZW4oaGFzaCA9PiB7XG4gICAgICAgICAgICAgICAgLy9sb2cubG9nKCdyZXN1bHQgb2YgaGFzaCAnLCBoYXNoKTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB7aXY6IGVuY29kZShpdiksIHZhbHVlOiBlbmNvZGUoZW5jcnlwdGVkVmFsdWUpLCBoYXNoOiBlbmNvZGUoaGFzaCl9O1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UuYm9keS52YWx1ZSA9IGVuY29kZSh2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBpZiBpcyBhIGhhbmRzaGFrZSBtZXNzYWdlLCBqdXN0IHJlc29sdmUgaXRcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzSGFuZFNoYWtlVHlwZSkge1xuICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcblxuICAgICAgICAgICAgLy8gZWxzZSwgc3RhcnRzIGEgbmV3IGhhbmRzaGFrZSBwcm90b2NvbFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5fZG9IYW5kU2hha2VQaGFzZShtZXNzYWdlLCBjaGF0S2V5cykudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgICBfdGhpcy5jaGF0S2V5c1ttZXNzYWdlLmZyb20gKyAnPC0+JyArIG1lc3NhZ2UudG9dID0gdmFsdWUuY2hhdEtleXM7XG5cbiAgICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UodmFsdWUubWVzc2FnZSk7XG4gICAgICAgICAgICAgIHJlamVjdCgnZW5jcnlwdCBoYW5kc2hha2UgcHJvdG9jb2wgcGhhc2UgJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KCdJbiBlbmNyeXB0TWVzc2FnZTogSHlwZXJ0eSBvd25lciBVUkwgd2FzIG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgIC8vaWYgZnJvbSBoeXBlcnR5IHRvIGEgZGF0YU9iamVjdFVSTFxuICAgICAgfSBlbHNlIGlmIChpc0Zyb21IeXBlcnR5ICYmIGlzVG9EYXRhT2JqZWN0KSB7XG5cbiAgICAgICAgLy9sb2cubG9nKCdkYXRhT2JqZWN0IHZhbHVlIHRvIGVuY3J5cHQ6ICcsIG1lc3NhZ2UuYm9keS52YWx1ZSk7XG4gICAgICAgIC8vbG9nLmxvZygnSWRlbnRpdHlNb2R1bGUgLSBlbmNyeXB0IGZyb20gaHlwZXJ0eSB0byBkYXRhb2JqZWN0ICcsIG1lc3NhZ2UpO1xuXG4gICAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCgnZGF0YU9iamVjdFNlc3Npb25LZXlzJykudGhlbigoc2Vzc2lvbktleXMpID0+IHtcbiAgICAgICAgICBzZXNzaW9uS2V5cyA9IGNoYXRrZXlzVG9BcnJheUNsb25lcihzZXNzaW9uS2V5cyB8fCB7fSk7XG4gICAgICAgICAgbGV0IGRhdGFPYmplY3RLZXkgPSBzZXNzaW9uS2V5cyA/IHNlc3Npb25LZXlzW2RhdGFPYmplY3RVUkxdIDogbnVsbDtcblxuICAgICAgICAgIF90aGlzLmRhdGFPYmplY3RzU3RvcmFnZS5nZXREYXRhT2JqZWN0KGRhdGFPYmplY3RVUkwpLnRoZW4oKGlzSHlwZXJ0eVJlcG9ydGVyKSA9PiB7XG4gICAgICAgICAgICAvL2lmIG5vIGtleSBleGlzdHMsIGNyZWF0ZSBhIG5ldyBvbmUgaWYgaXMgdGhlIHJlcG9ydGVyIG9mIGRhdGFPYmplY3RcbiAgICAgICAgICAgIGlmICghZGF0YU9iamVjdEtleSkge1xuICAgICAgICAgICAgICAvLyBpZiB0aGUgaHlwZXJ0eSBpcyB0aGUgcmVwb3J0ZXIgb2YgdGhlIGRhdGFPYmplY3QgdGhlbiBnZW5lcmF0ZXMgYSBzZXNzaW9uIGtleVxuICAgICAgICAgICAgICBpZiAoaXNIeXBlcnR5UmVwb3J0ZXIucmVwb3J0ZXIgJiYgaXNIeXBlcnR5UmVwb3J0ZXIucmVwb3J0ZXIgPT09IG1lc3NhZ2UuZnJvbSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHNlc3Npb25LZXkgPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVSYW5kb20oKTtcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhT2JqZWN0U2Vzc2lvbktleXNbZGF0YU9iamVjdFVSTF0gPSB7c2Vzc2lvbktleTogc2Vzc2lvbktleSwgaXNUb0VuY3J5cHQ6IHRydWV9O1xuICAgICAgICAgICAgICAgIGxldCBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZSA9IGNoYXRrZXlzVG9TdHJpbmdDbG9uZXIoX3RoaXMuZGF0YU9iamVjdFNlc3Npb25LZXlzKTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgaWYgdGhpcyBkb2VzIG5vdCBuZWVkIHRvIGJlIHN0b3JlZFxuICAgICAgICAgICAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldCgnZGF0YU9iamVjdFNlc3Npb25LZXlzJywgMCwgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmUpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICByZWplY3QoJ09uIGVuY3J5cHRNZXNzYWdlIGZyb20gbWV0aG9kIHN0b3JhZ2VNYW5hZ2VyLnNldCBlcnJvcjogJyArIGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdEtleSA9IF90aGlzLmRhdGFPYmplY3RTZXNzaW9uS2V5c1tkYXRhT2JqZWN0VVJMXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBzZXNzaW9uIGtleSBmb3IgdGhlIGNoYXQgcm9vbVxuICAgICAgICAgICAgaWYgKGRhdGFPYmplY3RLZXkpIHtcblxuICAgICAgICAgICAgICAvLyBhbmQgaWYgaXMgdG8gYXBwbHkgZW5jcnlwdGlvbiwgZW5jcnlwdCB0aGUgbWVzc2FnZXNcbiAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3RLZXkuaXNUb0VuY3J5cHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgaXYgPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVJVigpO1xuICAgICAgICAgICAgICAgIGxldCBzdHJpbmdpZmllZElWID0gc3RyaW5naWZ5KGl2KTtcbiAgICAgICAgICAgICAgICBsZXQgc3RyaW5naWZpZWRNZXNzYWdlQm9keSA9IHN0cmluZ2lmeShtZXNzYWdlLmJvZHkudmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgX3RoaXMuY3J5cHRvLmVuY3J5cHRBRVMoZGF0YU9iamVjdEtleS5zZXNzaW9uS2V5LCBzdHJpbmdpZmllZE1lc3NhZ2VCb2R5LCBpdikudGhlbihlbmNyeXB0ZWRWYWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZS5ib2R5LmlkZW50aXR5LmFzc2VydGlvbjsgLy9UT0RPOiBDaGVjayB3aHkgYXNzZXJ0aW9uIGlzIGNvbW1pbmcgb24gdGhlIG1lc3NhZ2UhXG4gICAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZS5ib2R5LmlkZW50aXR5LmV4cGlyZXM7IC8vVE9ETzogQ2hlY2sgd2h5IGV4cGlyZXMgaXMgY29tbWluZyBvbiB0aGUgbWVzc2FnZSFcbiAgICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJlZE1lc3NhZ2UgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChtZXNzYWdlLCBzdHJpbmdpZmllZE1lc3NhZ2VCb2R5ICsgc3RyaW5naWZpZWRJVik7XG5cbiAgICAgICAgICAgICAgICAgIF90aGlzLmNyeXB0by5oYXNoSE1BQyhkYXRhT2JqZWN0S2V5LnNlc3Npb25LZXksIGZpbHRlcmVkTWVzc2FnZSkudGhlbihoYXNoID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nLmxvZygnaGFzaCAnLCBoYXNoKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VmFsdWUgPSB7dmFsdWU6IGVuY29kZShlbmNyeXB0ZWRWYWx1ZSksIGl2OiBlbmNvZGUoaXYpLCBoYXNoOiBlbmNvZGUoaGFzaCl9O1xuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYm9keS52YWx1ZSA9IHN0cmluZ2lmeShuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBpZiBub3QsIGp1c3Qgc2VuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgZ2VuZXJhdGlvbiBvZiBhIG5ldyBzZXNzaW9uIEtleVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVqZWN0KCdEYXRhIG9iamVjdCBrZXkgY291bGQgbm90IGJlIGRlZmluZWQ6IEZhaWxlZCB0byBkZWNyeXB0IG1lc3NhZ2UgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KCdPbiBlbmNyeXB0TWVzc2FnZSBmcm9tIG1ldGhvZCBkYXRhT2JqZWN0c1N0b3JhZ2UuZ2V0RGF0YU9iamVjdCBlcnJvcjogJyArIGVycik7IH0pO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIGVuY3J5cHRNZXNzYWdlIGZyb20gbWV0aG9kIHN0b3JhZ2VNYW5hZ2VyLmdldCBlcnJvcjogJyArIGVycik7IH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZW5jcnlwdERhdGFPYmplY3QoZGF0YU9iamVjdCwgc2VuZGVyKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGxvZy5pbmZvKCdkYXRhT2JqZWN0IHZhbHVlIHRvIGVuY3J5cHQ6ICcsIGRhdGFPYmplY3QpO1xuXG4gICAgICBsZXQgZGF0YU9iamVjdFVSTCA9IHBhcnNlTWVzc2FnZVVSTChzZW5kZXIpO1xuXG4gICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5nZXQoJ2RhdGFPYmplY3RTZXNzaW9uS2V5cycpLnRoZW4oKHNlc3Npb25LZXlzKSA9PiB7XG4gICAgICAgIHNlc3Npb25LZXlzID0gY2hhdGtleXNUb0FycmF5Q2xvbmVyKHNlc3Npb25LZXlzIHx8IHt9KTtcbiAgICAgICAgbGV0IGRhdGFPYmplY3RLZXkgPSBzZXNzaW9uS2V5cyA/IHNlc3Npb25LZXlzW2RhdGFPYmplY3RVUkxdIDogbnVsbDtcblxuICAgICAgICAvL2NoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSBzZXNzaW9uIGtleSBmb3IgdGhlIGNoYXQgcm9vbVxuICAgICAgICBpZiAoZGF0YU9iamVjdEtleSkge1xuXG4gICAgICAgICAgLy8gYW5kIGlmIGlzIHRvIGFwcGx5IGVuY3J5cHRpb24sIGVuY3J5cHQgdGhlIG1lc3NhZ2VzXG4gICAgICAgICAgaWYgKGRhdGFPYmplY3RLZXkuaXNUb0VuY3J5cHQpIHtcbiAgICAgICAgICAgIGxldCBpdiA9IF90aGlzLmNyeXB0by5nZW5lcmF0ZUlWKCk7XG5cbiAgICAgICAgICAgIF90aGlzLmNyeXB0by5lbmNyeXB0QUVTKGRhdGFPYmplY3RLZXkuc2Vzc2lvbktleSwgc3RyaW5naWZ5KGRhdGFPYmplY3QpLCBpdikudGhlbihlbmNyeXB0ZWRWYWx1ZSA9PiB7XG4gICAgICAgICAgICAgIGxldCBuZXdWYWx1ZSA9IHsgdmFsdWU6IGVuY29kZShlbmNyeXB0ZWRWYWx1ZSksIGl2OiBlbmNvZGUoaXYpIH07XG5cbiAgICAgICAgICAgICAgLy9sb2cubG9nKCdlbmNyeXB0ZWQgZGF0YU9iamVjdCcsIG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobmV3VmFsdWUpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KCdPbiBlbmNyeXB0RGF0YU9iamVjdCBmcm9tIG1ldGhvZCBlbmNyeXB0QUVTIGVycm9yOiAnICsgZXJyKTsgfSk7XG5cbiAgICAgICAgICAvLyBpZiBub3QsIGp1c3Qgc2VuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cuaW5mbygnVGhlIGRhdGFPYmplY3QgaXMgbm90IGVuY3J5cHRlZCcpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YU9iamVjdCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc3RhcnQgdGhlIGdlbmVyYXRpb24gb2YgYSBuZXcgc2Vzc2lvbiBLZXlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KCdObyBkYXRhT2JqZWN0S2V5IGZvciB0aGlzIGRhdGFPYmplY3RVUkw6JywgZGF0YU9iamVjdFVSTCk7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKGVyciA9PiB7IHJlamVjdCgnT24gZW5jcnlwdERhdGFPYmplY3QgZnJvbSBtZXRob2Qgc3RvcmFnZU1hbmFnZXIuZ2V0IGVycm9yOiAnICsgZXJyKTsgfSk7XG4gICAgfSk7XG4gIH1cblxuICBkZWNyeXB0TWVzc2FnZShtZXNzYWdlKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIC8vICBsb2cubG9nKCdkZWNyeXB0TWVzc2FnZTptZXNzYWdlJywgbWVzc2FnZSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBsZXQgaXNIYW5kU2hha2VUeXBlID0gbWVzc2FnZS50eXBlID09PSAnaGFuZHNoYWtlJztcblxuICAgICAgX3RoaXMuX2lzVG9EZWNyeXB0KG1lc3NhZ2UpLnRoZW4oKGlzVG9EZWNyeXB0KSA9PiB7XG5cbiAgICAgICAgLy9pZiBpcyBub3QgdG8gYXBwbHkgZW5jcnlwdGlvbiwgdGhlbiByZXR1cm5zIHJlc29sdmVcbiAgICAgICAgaWYgKCFpc1RvRGVjcnlwdCkgcmV0dXJuIHJlc29sdmUobWVzc2FnZSk7XG5cbiAgICAgICAgbGV0IGRhdGFPYmplY3RVUkwgPSBwYXJzZU1lc3NhZ2VVUkwobWVzc2FnZS50byk7XG5cbiAgICAgICAgbGV0IGlzVG9EYXRhT2JqZWN0ID0gaXNEYXRhT2JqZWN0VVJMKGRhdGFPYmplY3RVUkwpO1xuICAgICAgICBsZXQgaXNGcm9tSHlwZXJ0eSA9IGRpdmlkZVVSTChtZXNzYWdlLmZyb20pLnR5cGUgPT09ICdoeXBlcnR5JztcbiAgICAgICAgbGV0IGlzVG9IeXBlcnR5ID0gZGl2aWRlVVJMKG1lc3NhZ2UudG8pLnR5cGUgPT09ICdoeXBlcnR5JztcblxuICAgICAgICBpZiAobWVzc2FnZS50eXBlID09PSAndXBkYXRlJykge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pcyBpcyBoeXBlcnR5IHRvIGh5cGVydHkgY29tbXVuaWNhdGlvblxuICAgICAgICBpZiAoaXNGcm9tSHlwZXJ0eSAmJiBpc1RvSHlwZXJ0eSkge1xuICAgICAgICAgIC8vIGxvZy5sb2coJ2RlY3J5cHQgaHlwZXJ0eSB0byBoeXBlcnR5Jyk7XG4gICAgICAgICAgbGV0IHVzZXJVUkwgPSBfdGhpcy5fcmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKG1lc3NhZ2UudG8pO1xuICAgICAgICAgIGlmICh1c2VyVVJMKSB7XG5cbiAgICAgICAgICAgIGxldCBjaGF0S2V5cyA9IF90aGlzLmNoYXRLZXlzW21lc3NhZ2UudG8gKyAnPC0+JyArIG1lc3NhZ2UuZnJvbV07XG4gICAgICAgICAgICBpZiAoIWNoYXRLZXlzKSB7XG4gICAgICAgICAgICAgIGNoYXRLZXlzID0gX3RoaXMuX25ld0NoYXRDcnlwdG8obWVzc2FnZSwgdXNlclVSTCwgJ2RlY3J5cHQnKTtcbiAgICAgICAgICAgICAgX3RoaXMuY2hhdEtleXNbbWVzc2FnZS50byArICc8LT4nICsgbWVzc2FnZS5mcm9tXSA9IGNoYXRLZXlzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2hhdEtleXMuYXV0aGVudGljYXRlZCAmJiAhaXNIYW5kU2hha2VUeXBlKSB7XG4gICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGRlY29kZShtZXNzYWdlLmJvZHkudmFsdWUpO1xuICAgICAgICAgICAgICBsZXQgaXYgPSBkZWNvZGVUb1VpbnQ4QXJyYXkodmFsdWUuaXYpO1xuICAgICAgICAgICAgICBsZXQgZGF0YSA9IGRlY29kZVRvVWludDhBcnJheSh2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgIGxldCBoYXNoID0gZGVjb2RlVG9VaW50OEFycmF5KHZhbHVlLmhhc2gpO1xuICAgICAgICAgICAgICBfdGhpcy5jcnlwdG8uZGVjcnlwdEFFUyhjaGF0S2V5cy5rZXlzLmh5cGVydHlUb1Nlc3Npb25LZXksIGRhdGEsIGl2KS50aGVuKGRlY3J5cHRlZERhdGEgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGxvZy5sb2coJ2RlY3J5cHRlZCB2YWx1ZSAnLCBkZWNyeXB0ZWREYXRhKTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmJvZHkudmFsdWUgPSBkZWNyeXB0ZWREYXRhO1xuXG4gICAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkTWVzc2FnZSA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIGRlY3J5cHRlZERhdGEgKyBpdik7XG5cbiAgICAgICAgICAgICAgICBfdGhpcy5jcnlwdG8udmVyaWZ5SE1BQyhjaGF0S2V5cy5rZXlzLmh5cGVydHlUb0hhc2hLZXksIGZpbHRlcmVkTWVzc2FnZSwgaGFzaCkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgICAgLy9sb2cubG9nKCdyZXN1bHQgb2YgaGFzaCB2ZXJpZmljYXRpb24hICcsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlLmJvZHkuYXNzZXJ0ZWRJZGVudGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0hhbmRTaGFrZVR5cGUpIHtcbiAgICAgICAgICAgICAgX3RoaXMuX2RvSGFuZFNoYWtlUGhhc2UobWVzc2FnZSwgY2hhdEtleXMpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcblxuICAgICAgICAgICAgICAgIC8vaWYgaXQgd2FzIHN0YXJ0ZWQgYnkgZG9NdXR1YWxBdXRoZW50aWNhdGlvbiB0aGVuIGVuZHMgdGhlIHByb3RvY29sXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnaGFuZFNoYWtlRW5kJykge1xuICAgICAgICAgICAgICAgICAgLy9yZWplY3QoJ2RlY3J5cHQgaGFuZHNoYWtlIHByb3RvY29sIHBoYXNlJyk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIGlmIHdhcyBzdGFydGVkIGJ5IGEgbWVzc2FnZSwgdGhlbiByZXNlbmQgdGhhdCBtZXNzYWdlXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLmNoYXRLZXlzW21lc3NhZ2UudG8gKyAnPC0+JyArIG1lc3NhZ2UuZnJvbV0gPSB2YWx1ZS5jaGF0S2V5cztcbiAgICAgICAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHZhbHVlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAvL3JlamVjdCgnZGVjcnlwdCBoYW5kc2hha2UgcHJvdG9jb2wgcGhhc2UgJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlamVjdCgnd3JvbmcgbWVzc2FnZSBkbyBkZWNyeXB0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdCgnZXJyb3Igb24gZGVjcnlwdCBtZXNzYWdlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy9pZiBmcm9tIGh5cGVydHkgdG8gYSBkYXRhT2JqZWN0VVJMXG4gICAgICAgIH0gZWxzZSBpZiAoaXNGcm9tSHlwZXJ0eSAmJiBpc1RvRGF0YU9iamVjdCkge1xuICAgICAgICAgIC8vIGxvZy5sb2coJ2RhdGFPYmplY3QgdmFsdWUgdG8gZGVjcnlwdDogJywgbWVzc2FnZS5ib2R5KTtcblxuICAgICAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCgnZGF0YU9iamVjdFNlc3Npb25LZXlzJykudGhlbigoc2Vzc2lvbktleXMpID0+IHtcbiAgICAgICAgICAgIHNlc3Npb25LZXlzID0gY2hhdGtleXNUb0FycmF5Q2xvbmVyKHNlc3Npb25LZXlzIHx8IHt9KTtcbiAgICAgICAgICAgIGxldCBkYXRhT2JqZWN0S2V5ID0gc2Vzc2lvbktleXMgPyBzZXNzaW9uS2V5c1tkYXRhT2JqZWN0VVJMXSA6IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0S2V5KSB7XG5cbiAgICAgICAgICAgICAgLy9jaGVjayBpZiBpcyB0byBhcHBseSBlbmNyeXB0aW9uXG4gICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0S2V5LmlzVG9FbmNyeXB0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlZFZhbHVlID0gcGFyc2UobWVzc2FnZS5ib2R5LnZhbHVlKTtcbiAgICAgICAgICAgICAgICBsZXQgaXYgPSBkZWNvZGVUb1VpbnQ4QXJyYXkocGFyc2VkVmFsdWUuaXYpO1xuICAgICAgICAgICAgICAgIGxldCBlbmNyeXB0ZWRWYWx1ZSA9IGRlY29kZVRvVWludDhBcnJheShwYXJzZWRWYWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgbGV0IGhhc2ggPSBkZWNvZGVUb1VpbnQ4QXJyYXkocGFyc2VkVmFsdWUuaGFzaCk7XG5cbiAgICAgICAgICAgICAgICBfdGhpcy5jcnlwdG8uZGVjcnlwdEFFUyhkYXRhT2JqZWN0S2V5LnNlc3Npb25LZXksIGVuY3J5cHRlZFZhbHVlLCBpdikudGhlbihkZWNyeXB0ZWRWYWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkVmFsdWUgPSBwYXJzZShkZWNyeXB0ZWRWYWx1ZSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIGxvZy5sb2coJ2RlY3J5cHRlZCBWYWx1ZSwnLCBwYXJzZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICBtZXNzYWdlLmJvZHkudmFsdWUgPSBwYXJzZWRWYWx1ZTtcblxuICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcmVkTWVzc2FnZSA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIHN0cmluZ2lmeShwYXJzZWRWYWx1ZSkgKyBzdHJpbmdpZnkoaXYpKTtcblxuICAgICAgICAgICAgICAgICAgX3RoaXMuY3J5cHRvLnZlcmlmeUhNQUMoZGF0YU9iamVjdEtleS5zZXNzaW9uS2V5LCBmaWx0ZXJlZE1lc3NhZ2UsIGhhc2gpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nLmxvZygnUmVjZWl2ZWQgbWVzc2FnZSBITUFDIHJlc3VsdCcsIHJlc3VsdCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ib2R5LmFzc2VydGVkSWRlbnRpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KCdNZXNzYWdlIEhNQUMgaXMgaW52YWxpZDogJyArIGVycik7IH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy9pZiBub3QsIGp1c3QgcmV0dXJuIHRoZSBtZXNzYWdlXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5ib2R5LmFzc2VydGVkSWRlbnRpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWVzc2FnZS5ib2R5LmFzc2VydGVkSWRlbnRpdHkgPSB0cnVlO1xuICAgICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgIC8vcmVqZWN0KCdubyBzZXNzaW9uS2V5IGZvciBjaGF0IHJvb20gZm91bmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdCgnd3JvbmcgbWVzc2FnZSB0byBkZWNyeXB0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICBkZWNyeXB0RGF0YU9iamVjdChkYXRhT2JqZWN0LCBzZW5kZXIpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgLy9pZiBpcyBub3QgdG8gYXBwbHkgZW5jcnlwdGlvbiwgdGhlbiByZXR1cm5zIHJlc29sdmVcbiAgICAgIGlmICghX3RoaXMuaXNUb1VzZUVuY3J5cHRpb24pIHtcbiAgICAgICAgLy8gbG9nLmxvZygnZGVjcnlwdGlvbiBkaXNhYmxlZCcpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhT2JqZWN0KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGRhdGFPYmplY3RVUkwgPSBwYXJzZU1lc3NhZ2VVUkwoc2VuZGVyKTtcblxuICAgICAgLy8gbG9nLmxvZygnZGF0YU9iamVjdCB2YWx1ZSB0byBkZWNyeXB0OiAnLCBkYXRhT2JqZWN0KTtcblxuICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdkYXRhT2JqZWN0U2Vzc2lvbktleXMnKS50aGVuKChzZXNzaW9uS2V5cykgPT4ge1xuICAgICAgICBzZXNzaW9uS2V5cyA9IGNoYXRrZXlzVG9BcnJheUNsb25lcihzZXNzaW9uS2V5cyk7XG4gICAgICAgIGxldCBkYXRhT2JqZWN0S2V5ID0gc2Vzc2lvbktleXMgPyBzZXNzaW9uS2V5c1tkYXRhT2JqZWN0VVJMXSA6IG51bGw7XG5cbiAgICAgICAgaWYgKGRhdGFPYmplY3RLZXkpIHtcblxuICAgICAgICAgIC8vY2hlY2sgaWYgaXMgdG8gYXBwbHkgZW5jcnlwdGlvblxuICAgICAgICAgIGlmIChkYXRhT2JqZWN0S2V5LmlzVG9FbmNyeXB0KSB7XG4gICAgICAgICAgICBsZXQgaXYgPSBkZWNvZGVUb1VpbnQ4QXJyYXkoZGF0YU9iamVjdC5pdik7XG4gICAgICAgICAgICBsZXQgZW5jcnlwdGVkVmFsdWUgPSBkZWNvZGVUb1VpbnQ4QXJyYXkoZGF0YU9iamVjdC52YWx1ZSk7XG5cbiAgICAgICAgICAgIF90aGlzLmNyeXB0by5kZWNyeXB0QUVTKGRhdGFPYmplY3RLZXkuc2Vzc2lvbktleSwgZW5jcnlwdGVkVmFsdWUsIGl2KS50aGVuKGRlY3J5cHRlZFZhbHVlID0+IHtcbiAgICAgICAgICAgICAgbGV0IHBhcnNlZFZhbHVlID0gcGFyc2UoZGVjcnlwdGVkVmFsdWUpO1xuICAgICAgICAgICAgICBsZXQgbmV3VmFsdWUgPSB7IHZhbHVlOiBwYXJzZWRWYWx1ZSwgaXY6IGVuY29kZShpdikgfTtcblxuICAgICAgICAgICAgICAvLyBsb2cubG9nKCdkZWNyeXB0ZWQgZGF0YU9iamVjdCwnLCBuZXdWYWx1ZSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUobmV3VmFsdWUpO1xuICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHsgcmVqZWN0KCdPbiBkZWNyeXB0RGF0YU9iamVjdCBmcm9tIG1ldGhvZCBlbmNyeXB0QUVTIGVycm9yOiAnICsgZXJyKTsgfSk7XG5cbiAgICAgICAgICAvL2lmIG5vdCwganVzdCByZXR1cm4gdGhlIGRhdGFPYmplY3RcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gbG9nLmxvZygnVGhlIGRhdGFPYmplY3QgaXMgbm90IGVuY3J5cHRlZCcpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoZGF0YU9iamVjdCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnTm8gZGF0YU9iamVjdEtleSBmb3IgdGhpcyBkYXRhT2JqZWN0VVJMOicsIGRhdGFPYmplY3RVUkwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9kb011dHVhbEF1dGhlbnRpY2F0aW9uUGhhc2UxKG1lc3NhZ2UpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGxldCB0byA9IG1lc3NhZ2UudG8uc3BsaXQoJy8nKTtcblxuICAgICAgLy9sZXQgc3Vic0luZGV4ID0gdG8uaW5kZXhPZignc3Vic2NyaXB0aW9uJyk7XG4gICAgICAvL2xldCBpc0RhdGFPYmplY3RTdWJzY3JpcHRpb24gPSBzdWJzSW5kZXggIT09IC0xO1xuICAgICAgdG8ucG9wKCk7XG4gICAgICBsZXQgZGF0YU9iamVjdFVSTCA9IHRvWzBdICsgJy8vJyArIHRvWzJdICsgJy8nICsgdG9bM107XG4gICAgICBfdGhpcy5fZG9NdXR1YWxBdXRoZW50aWNhdGlvblBoYXNlMihkYXRhT2JqZWN0VVJMLCBtZXNzYWdlLmJvZHkuc3Vic2NyaWJlcikudGhlbigoKSA9PiB7XG4gICAgICAgIF90aGlzLl9yZWdpc3RyeS5yZWdpc3RlclN1YnNjcmliZXIoZGF0YU9iamVjdFVSTCwgbWVzc2FnZS5ib2R5LnN1YnNjcmliZXIpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX2RvTXV0dWFsQXV0aGVudGljYXRpb25QaGFzZTIoc2VuZGVyLCByZWNlaXZlcikge1xuICAgIGxvZy5pbmZvKCdkb011dHVhbEF1dGhlbnRpY2F0aW9uOnNlbmRlciAnLCBzZW5kZXIpO1xuICAgIGxvZy5pbmZvKCdkb011dHVhbEF1dGhlbnRpY2F0aW9uOnJlY2VpdmVyICcsIHJlY2VpdmVyKTtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBsZXQgZGF0YU9iamVjdFVSTDtcblxuICAgICAgLy8gY2hlY2sgaWYgdGhlIHNlbmRlciBpcyBhIGRhdGFPYmplY3QgYW5kIGlmIHNvIHN0b3JlcyB0aGF0IHZhbHVlXG4gICAgICBsZXQgcmVwb3J0ZXJVUkwgPSBfdGhpcy5fcmVnaXN0cnkuZ2V0UmVwb3J0ZXJVUkxTeW5jaG9ub3VzKHNlbmRlcik7XG4gICAgICBpZiAocmVwb3J0ZXJVUkwpIHtcbiAgICAgICAgZGF0YU9iamVjdFVSTCA9IHNlbmRlcjtcbiAgICAgICAgc2VuZGVyID0gcmVwb3J0ZXJVUkw7XG4gICAgICB9XG5cbiAgICAgIGxldCBtc2cgPSB7XG4gICAgICAgIHRvOiByZWNlaXZlcixcbiAgICAgICAgZnJvbTogc2VuZGVyLFxuICAgICAgICBjYWxsYmFjazogdW5kZWZpbmVkLFxuICAgICAgICBib2R5OiB7aGFuZHNoYWtlUGhhc2U6ICdzdGFydEhhbmRTaGFrZScsIGlnbm9yZTogJ2lnbm9yZU1lc3NhZ2UnfVxuICAgICAgfTtcblxuICAgICAgaWYgKCFzZW5kZXIgfHwgIXJlY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoJ3NlbmRlciBvciByZWNlaXZlciBtaXNzaW5nIG9uIGRvTXV0dWFsQXV0aGVudGljYXRpb24nKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGNoYXRLZXlzID0gX3RoaXMuY2hhdEtleXNbc2VuZGVyICsgJzwtPicgKyByZWNlaXZlcl07XG4gICAgICBsZXQgdXNlclVSTCA9IF90aGlzLl9yZWdpc3RyeS5nZXRIeXBlcnR5T3duZXIoc2VuZGVyKTtcblxuICAgICAgaWYgKHVzZXJVUkwpIHtcblxuICAgICAgICBpZiAoIWNoYXRLZXlzKSB7XG4gICAgICAgICAgLy8gY2FsbGJhY2sgdG8gcmVzb2x2ZSB3aGVuIGZpbmlzaCB0aGUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uXG4gICAgICAgICAgbGV0IHJlc29sdmVkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ2NhbGxiYWNrIHZhbHVlOicsIHZhbHVlKTtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbXNnLmNhbGxiYWNrID0gcmVzb2x2ZWQ7XG4gICAgICAgICAgbXNnLmRhdGFPYmplY3RVUkwgPSBkYXRhT2JqZWN0VVJMO1xuXG4gICAgICAgICAgY2hhdEtleXMgPSBfdGhpcy5fbmV3Q2hhdENyeXB0byhtc2csIHVzZXJVUkwpO1xuICAgICAgICAgIF90aGlzLmNoYXRLZXlzW3NlbmRlciArICc8LT4nICsgcmVjZWl2ZXJdID0gY2hhdEtleXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhdEtleXMuYXV0aGVudGljYXRlZCkge1xuXG4gICAgICAgICAgbGV0IHN0YXJ0U2Vzc2lvbktleUV4Y2hhbmdlID0ge1xuICAgICAgICAgICAgdG86IHNlbmRlcixcbiAgICAgICAgICAgIGZyb206IHJlY2VpdmVyXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjaGF0S2V5cy5kYXRhT2JqZWN0VVJMID0gZGF0YU9iamVjdFVSTDtcbiAgICAgICAgICBfdGhpcy5fc2VuZFJlcG9ydGVyU2Vzc2lvbktleShzdGFydFNlc3Npb25LZXlFeGNoYW5nZSwgY2hhdEtleXMpLnRoZW4odmFsdWUgPT4ge1xuXG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZSh2YWx1ZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIHJlc29sdmUoJ2V4Y2hhbmdlIG9mIGNoYXQgc2Vzc2lvbktleSBpbml0aWF0ZWQnKTtcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4geyByZWplY3QoJ09uIGRvTXV0dWFsQXV0aGVudGljYXRpb24gZnJvbSBtZXRob2QgX3NlbmRSZXBvcnRlclNlc3Npb25LZXkgZXJyb3I6ICcgKyBlcnIpOyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpcy5fZG9IYW5kU2hha2VQaGFzZShtc2csIGNoYXRLZXlzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KCdNdXR1YWwgYXV0aGVudGljYXRpb24gZXJyb3I6IEh5cGVydHkgb3duZXIgY291bGQgbm90IGJlIHJlc29sdmVkJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG5cbiAgLyoqXG4gICogcmV0dXJucyB0aGUgcmVwb3J0ZXIgYXNzb2NpYXRlZCB0byB0aGUgZGF0YU9iamVjdCBVUkxcbiAgKiBAcGFyYW0gICB7U3RyaW5nfSAgIGRhdGFPYmplY3RVUkwgICAgICAgICBkYXRhT2JqZWN0IHVybFxuICAqIEByZXR1cm4gICB7U3RyaW5nfSAgcmVwb3J0ZXIgICAgICAgICAgICAgIGRhdGFPYmplY3QgdXJsIHJlcG9ydGVyXG4gICovXG4gIC8qICBfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0KGRhdGFPYmplY3RVUkwpIHtcbiAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpkYXRhT2JqZWN0VVJMJywgZGF0YU9iamVjdFVSTCk7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgbGV0IHNwbGl0ZWRVUkwgPSBkaXZpZGVVUkwoZGF0YU9iamVjdFVSTCk7XG4gICAgICBsZXQgZG9tYWluID0gc3BsaXRlZFVSTC5kb21haW47XG4gICAgICBsZXQgZmluYWxVUkwgPSBfdGhpcy5fcGFyc2VNZXNzYWdlVVJMKGRhdGFPYmplY3RVUkwpO1xuXG4gICAgICAvLyBjaGVjayBpZiBpcyB0aGUgY3JlYXRvciBvZiB0aGUgaHlwZXJ0eVxuICAgICAgbGV0IHJlcG9ydGVyVVJMID0gX3RoaXMucmVnaXN0cnkuZ2V0UmVwb3J0ZXJVUkxTeW5jaG9ub3VzKGZpbmFsVVJMKTtcbiAgICAgIGxvZy5pbmZvKCdfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0OnJlcG9ydGVyVVJMJywgcmVwb3J0ZXJVUkwpO1xuXG4gICAgICBpZiAocmVwb3J0ZXJVUkwpIHtcbiAgICAgICAgcmVzb2x2ZShyZXBvcnRlclVSTCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGFzc29jaWF0aW9uIGZyb20gYW4gaHlwZXJ0eVVSTCB0byB0aGUgZGF0YU9iamVjdFxuICAgICAgICBsZXQgc3RvcmVkUmVwb3J0ZXJVUkwgPSBfdGhpcy5kYXRhT2JqZWN0c0lkZW50aXR5W2ZpbmFsVVJMXTtcbiAgICAgICAgbG9nLmluZm8oJ19nZXRIeXBlcnR5RnJvbURhdGFPYmplY3Q6c3RvcmVkUmVwb3J0ZXJVUkwnLCBzdG9yZWRSZXBvcnRlclVSTCk7XG5cbiAgICAgICAgaWYgKHN0b3JlZFJlcG9ydGVyVVJMKSB7XG4gICAgICAgICAgcmVzb2x2ZShzdG9yZWRSZXBvcnRlclVSTCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW55IGh5cGVydHkgdGhhdCBzdWJzY3JpYmVkIHRoZSBkYXRhT2JqZWN0VVJMXG4gICAgICAgICAgbGV0IHN1YnNjcmliZXJIeXBlcnR5ID0gX3RoaXMucmVnaXN0cnkuZ2V0RGF0YU9iamVjdFN1YnNjcmliZXJIeXBlcnR5KGRhdGFPYmplY3RVUkwpO1xuICAgICAgICAgIGxvZy5pbmZvKCdfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0OnN1YnNjcmliZXJIeXBlcnR5Jywgc3Vic2NyaWJlckh5cGVydHkpO1xuXG4gICAgICAgICAgaWYgKHN1YnNjcmliZXJIeXBlcnR5KSB7XG4gICAgICAgICAgICByZXNvbHZlKHN1YnNjcmliZXJIeXBlcnR5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2VhcmNoIGluIGRvbWFpbiByZWdpc3RyeSBmb3IgdGhlIGh5cGVydHkgYXNzb2NpYXRlZCB0byB0aGUgZGF0YU9iamVjdFxuICAgICAgICAgICAgLy8gc2VhcmNoIGluIGNhc2UgaXMgYSBzdWJzY3JpYmVyIHdobyB3YW50cyB0byBrbm93IHRoZSByZXBvcnRlclxuICAgICAgICAgICAgX3RoaXMuX2NvcmVEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0UGVyVVJMKGZpbmFsVVJMLCBkb21haW4pLnRoZW4oZGF0YU9iamVjdCA9PiB7XG4gICAgICAgICAgICAgIGxvZy5pbmZvKCdfZ2V0SHlwZXJ0eUZyb21EYXRhT2JqZWN0OmRhdGFPYmplY3QnLCBkYXRhT2JqZWN0KTtcbiAgICAgICAgICAgICAgX3RoaXMuZGF0YU9iamVjdHNJZGVudGl0eVtmaW5hbFVSTF0gPSBkYXRhT2JqZWN0LnJlcG9ydGVyO1xuICAgICAgICAgICAgICBsb2cuaW5mbygnX2dldEh5cGVydHlGcm9tRGF0YU9iamVjdDpkYXRhT2JqZWN0LnJlcG9ydGVyJywgZGF0YU9iamVjdC5yZXBvcnRlcik7XG4gICAgICAgICAgICAgIHJlc29sdmUoZGF0YU9iamVjdC5yZXBvcnRlcik7XG4gICAgICAgICAgICB9LCBlcnIgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9Ki9cblxuICBfc2VuZFJlcG9ydGVyU2Vzc2lvbktleShtZXNzYWdlLCBjaGF0S2V5cykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGxldCBzZXNzaW9uS2V5QnVuZGxlID0gX3RoaXMuZGF0YU9iamVjdFNlc3Npb25LZXlzW2NoYXRLZXlzLmRhdGFPYmplY3RVUkxdO1xuICAgICAgbGV0IHJlcG9ydGVyU2Vzc2lvbktleU1zZztcbiAgICAgIGxldCB2YWx1ZVRvRW5jcnlwdDtcbiAgICAgIGxldCBzZXNzaW9uS2V5O1xuICAgICAgbGV0IGl2O1xuICAgICAgbGV0IHZhbHVlID0ge307XG5cbiAgICAgIC8vaWYgdGhlcmUgaXMgbm90IHlldCBhIHNlc3Npb24gS2V5LCBnZW5lcmF0ZXMgYSBuZXcgb25lXG4gICAgICBpZiAoIXNlc3Npb25LZXlCdW5kbGUpIHtcbiAgICAgICAgc2Vzc2lvbktleSA9IF90aGlzLmNyeXB0by5nZW5lcmF0ZVJhbmRvbSgpO1xuICAgICAgICBfdGhpcy5kYXRhT2JqZWN0U2Vzc2lvbktleXNbY2hhdEtleXMuZGF0YU9iamVjdFVSTF0gPSB7c2Vzc2lvbktleTogc2Vzc2lvbktleSwgaXNUb0VuY3J5cHQ6IHRydWV9O1xuXG4gICAgICAgIGxldCBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZSA9IGNoYXRrZXlzVG9TdHJpbmdDbG9uZXIoX3RoaXMuZGF0YU9iamVjdFNlc3Npb25LZXlzKTtcblxuICAgICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQoJ2RhdGFPYmplY3RTZXNzaW9uS2V5cycsIDAsIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIHJlamVjdCgnT24gX3NlbmRSZXBvcnRlclNlc3Npb25LZXkgZnJvbSBtZXRob2Qgc3RvcmFnZU1hbmFnZXIuc2V0KGRhdGFPYmplY3RTZXNzaW9uS2V5cy4uLikgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgICB9KTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Vzc2lvbktleSA9IHNlc3Npb25LZXlCdW5kbGUuc2Vzc2lvbktleTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFsdWVUb0VuY3J5cHQgPSBlbmNvZGUoe3ZhbHVlOiBlbmNvZGUoc2Vzc2lvbktleSksIGRhdGFPYmplY3RVUkw6IGNoYXRLZXlzLmRhdGFPYmplY3RVUkx9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXR1cm4gcmVqZWN0KCdPbiBfc2VuZFJlcG9ydGVyU2Vzc2lvbktleSBmcm9tIG1ldGhvZCBzdG9yYWdlTWFuYWdlci5zZXQgZXJyb3IgdmFsdWVUb0VuY3J5cHQ6ICcgKyBlcnIpO1xuICAgICAgfVxuXG4gICAgICBpdiA9IF90aGlzLmNyeXB0by5nZW5lcmF0ZUlWKCk7XG4gICAgICB2YWx1ZS5pdiA9IGVuY29kZShpdik7XG4gICAgICBfdGhpcy5jcnlwdG8uZW5jcnlwdEFFUyhjaGF0S2V5cy5rZXlzLmh5cGVydHlGcm9tU2Vzc2lvbktleSwgdmFsdWVUb0VuY3J5cHQsIGl2KS50aGVuKGVuY3J5cHRlZFZhbHVlID0+IHtcblxuICAgICAgICByZXBvcnRlclNlc3Npb25LZXlNc2cgPSB7XG4gICAgICAgICAgdHlwZTogJ2hhbmRzaGFrZScsXG4gICAgICAgICAgdG86IG1lc3NhZ2UuZnJvbSxcbiAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxuICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIGhhbmRzaGFrZVBoYXNlOiAncmVwb3J0ZXJTZXNzaW9uS2V5JyxcbiAgICAgICAgICAgIHZhbHVlOiBlbmNvZGUoZW5jcnlwdGVkVmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBmaWx0ZXJlZE1lc3NhZ2UgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChyZXBvcnRlclNlc3Npb25LZXlNc2csIHZhbHVlVG9FbmNyeXB0ICsgaXYsIGNoYXRLZXlzLmh5cGVydHlGcm9tLm1lc3NhZ2VJbmZvKTtcblxuICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmhhc2hITUFDKGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21IYXNoS2V5LCBmaWx0ZXJlZE1lc3NhZ2UpO1xuICAgICAgfSkudGhlbihoYXNoZWRNZXNzYWdlID0+IHtcbiAgICAgICAgbGV0IHZhbHVlV2l0aEhhc2ggPSBlbmNvZGUoe3ZhbHVlOiByZXBvcnRlclNlc3Npb25LZXlNc2cuYm9keS52YWx1ZSwgaGFzaDogZW5jb2RlKGhhc2hlZE1lc3NhZ2UpLCBpdjogdmFsdWUuaXZ9KTtcblxuICAgICAgICByZXBvcnRlclNlc3Npb25LZXlNc2cuYm9keS52YWx1ZSA9IHZhbHVlV2l0aEhhc2g7XG5cbiAgICAgICAgcmVzb2x2ZSh7bWVzc2FnZTogcmVwb3J0ZXJTZXNzaW9uS2V5TXNnLCBjaGF0S2V5czogY2hhdEtleXN9KTtcbiAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgIHJlamVjdCgnT24gX3NlbmRSZXBvcnRlclNlc3Npb25LZXkgZnJvbSBjaGFpbmVkIHByb21pc2VzIGVuY3J5cHRBRVMgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBGdW5jdGlvbiB0aGF0IHJlc29sdmUgYW5kIGNyZWF0ZSB0aGUgZG9tYWluVVJMIGluIGNhc2UgaXQgaXMgcHJvdmlkZWQgb25lLiBJZiBub3QsIHJlc29sdmUgdGhlIGRlZmF1bHQgZG9tYWluVVJMXG4gICogQHBhcmFtIHtTdHJpbmd9ICAgICBpZHBEb21haW4gICAgIGlkcERvbWFpbiAoT3B0aW9uYWwpXG4gICovXG4gIF9yZXNvbHZlRG9tYWluKGlkcERvbWFpbikge1xuICAgIGlmICghaWRwRG9tYWluKSB7XG4gICAgICByZXR1cm4gJ2RvbWFpbi1pZHA6Ly9nb29nbGUuY29tJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICdkb21haW4taWRwOi8vJyArIGlkcERvbWFpbjtcbiAgICB9XG4gIH1cblxuICBfZG9IYW5kU2hha2VQaGFzZShtZXNzYWdlLCBjaGF0S2V5cykge1xuICAvLyBsb2coJ19kb0hhbmRTaGFrZVBoYXNlOmRhdGFPYmplY3QnLCBtZXNzYWdlKTtcbiAgLy9cdGxvZygnX2RvSGFuZFNoYWtlUGhhc2U6Y2hhdEtleXMnLCBjaGF0S2V5cyk7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICBsZXQgaGFuZHNoYWtlVHlwZSA9IG1lc3NhZ2UuYm9keS5oYW5kc2hha2VQaGFzZTtcbiAgICAgIGxldCBpdjtcbiAgICAgIGxldCBoYXNoO1xuICAgICAgbGV0IHZhbHVlID0ge307XG4gICAgICBsZXQgZmlsdGVyZWRNZXNzYWdlO1xuICAgICAgbGV0IHByaXZhdGVLZXlIb2xkZXI7XG5cbiAgICAgIGxvZy5pbmZvKCdoYW5kc2hha2UgcGhhc2U6ICcsIGhhbmRzaGFrZVR5cGUpO1xuXG4gICAgICBzd2l0Y2ggKGhhbmRzaGFrZVR5cGUpIHtcblxuICAgICAgICBjYXNlICdzdGFydEhhbmRTaGFrZSc6IHtcbiAgICAgICAgICBjaGF0S2V5cy5rZXlzLmZyb21SYW5kb20gPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVSYW5kb20oKTtcbiAgICAgICAgICBsZXQgc3RhcnRIYW5kU2hha2VNc2cgPSB7XG4gICAgICAgICAgICB0eXBlOiAnaGFuZHNoYWtlJyxcbiAgICAgICAgICAgIHRvOiBtZXNzYWdlLnRvLFxuICAgICAgICAgICAgZnJvbTogbWVzc2FnZS5mcm9tLFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICBoYW5kc2hha2VQaGFzZTogJ3NlbmRlckhlbGxvJyxcbiAgICAgICAgICAgICAgdmFsdWU6IGVuY29kZShjaGF0S2V5cy5rZXlzLmZyb21SYW5kb20pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjaGF0S2V5cy5oYW5kc2hha2VIaXN0b3J5LnNlbmRlckhlbGxvID0gX3RoaXMuX2ZpbHRlck1lc3NhZ2VUb0hhc2goc3RhcnRIYW5kU2hha2VNc2csIHVuZGVmaW5lZCwgY2hhdEtleXMuaHlwZXJ0eUZyb20ubWVzc2FnZUluZm8pO1xuXG4gICAgICAgICAgLy8gY2hlY2sgaWYgd2FzIHRoZSBlbmNyeXB0IGZ1bmN0aW9uIG9yIHRoZSBtdXR1YWwgYXV0aGVudGljYXRpb24gdGhhdCByZXF1ZXN0IHRoZVxuICAgICAgICAgIC8vIHN0YXJ0IG9mIHRoZSBoYW5kU2hha2VQaGFzZS5cblxuICAgICAgICAgIGlmIChjaGF0S2V5cy5pbml0aWFsTWVzc2FnZSkge1xuICAgICAgICAgICAgcmVzb2x2ZSh7bWVzc2FnZTogc3RhcnRIYW5kU2hha2VNc2csIGNoYXRLZXlzOiBjaGF0S2V5c30pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfdGhpcy5jaGF0S2V5c1ttZXNzYWdlLmZyb20gKyAnPC0+JyArIG1lc3NhZ2UudG9dID0gY2hhdEtleXM7XG4gICAgICAgICAgICBfdGhpcy5fbWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShzdGFydEhhbmRTaGFrZU1zZyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzZW5kZXJIZWxsbyc6IHtcblxuICAgICAgICAgIGxvZy5sb2coJ3NlbmRlckhlbGxvJyk7XG4gICAgICAgICAgY2hhdEtleXMuaGFuZHNoYWtlSGlzdG9yeS5zZW5kZXJIZWxsbyA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UpO1xuICAgICAgICAgIGNoYXRLZXlzLmtleXMuZnJvbVJhbmRvbSA9IGRlY29kZVRvVWludDhBcnJheShtZXNzYWdlLmJvZHkudmFsdWUpO1xuICAgICAgICAgIGNoYXRLZXlzLmtleXMudG9SYW5kb20gPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVSYW5kb20oKTtcblxuICAgICAgICAgIGxldCBzZW5kZXJIZWxsb01zZyA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdoYW5kc2hha2UnLFxuICAgICAgICAgICAgdG86IG1lc3NhZ2UuZnJvbSxcbiAgICAgICAgICAgIGZyb206IG1lc3NhZ2UudG8sXG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgIGhhbmRzaGFrZVBoYXNlOiAncmVjZWl2ZXJIZWxsbycsXG4gICAgICAgICAgICAgIHZhbHVlOiBlbmNvZGUoY2hhdEtleXMua2V5cy50b1JhbmRvbSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGNoYXRLZXlzLmhhbmRzaGFrZUhpc3RvcnkucmVjZWl2ZXJIZWxsbyA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKHNlbmRlckhlbGxvTXNnLCB1bmRlZmluZWQsIGNoYXRLZXlzLmh5cGVydHlGcm9tLm1lc3NhZ2VJbmZvKTtcbiAgICAgICAgICByZXNvbHZlKHttZXNzYWdlOiBzZW5kZXJIZWxsb01zZywgY2hhdEtleXM6IGNoYXRLZXlzfSk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdyZWNlaXZlckhlbGxvJzoge1xuXG4gICAgICAgICAgbG9nLmxvZygncmVjZWl2ZXJIZWxsbycpO1xuICAgICAgICAgIF90aGlzLmdldE15UHJpdmF0ZUtleSgpLnRoZW4ocHJpdmF0ZUtleSA9PntcbiAgICAgICAgICAgIHByaXZhdGVLZXlIb2xkZXIgPSBwcml2YXRlS2V5O1xuXG4gICAgICAgICAgICBjaGF0S2V5cy5oYW5kc2hha2VIaXN0b3J5LnJlY2VpdmVySGVsbG8gPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChtZXNzYWdlKTtcblxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9pZG0udmFsaWRhdGVBc3NlcnRpb24obWVzc2FnZS5ib2R5LmlkZW50aXR5LmFzc2VydGlvbiwgdW5kZWZpbmVkLCBtZXNzYWdlLmJvZHkuaWRlbnRpdHkuaWRwLmRvbWFpbik7XG4gICAgICAgICAgfSkudGhlbigodmFsdWUpID0+IHtcblxuICAgICAgICAgICAgLy9UT0RPIHJlbW92ZSBsYXRlciB0aGlzIHZlcmlmaWNhdGlvbiBhcyBzb29uIGFzIGFsbCB0aGUgSWRQIHByb3h5IGFyZSB1cGRhdGVkIGluIHRoZSBleGFtcGxlXG4gICAgICAgICAgICBsZXQgZW5jb2RlZHB1YmxpY0tleSA9ICh0eXBlb2YgdmFsdWUuY29udGVudHMgPT09ICdzdHJpbmcnKSA/IHZhbHVlLmNvbnRlbnRzIDogdmFsdWUuY29udGVudHMubm9uY2U7XG5cbiAgICAgICAgICAgIGxldCByZWNlaXZlclB1YmxpY0tleSA9IHBhcnNlVG9VaW50OEFycmF5KGVuY29kZWRwdWJsaWNLZXkpO1xuICAgICAgICAgICAgbGV0IHByZW1hc3RlclNlY3JldCA9IF90aGlzLmNyeXB0by5nZW5lcmF0ZVBNUygpO1xuICAgICAgICAgICAgbGV0IHRvUmFuZG9tID0gbWVzc2FnZS5ib2R5LnZhbHVlO1xuICAgICAgICAgICAgY2hhdEtleXMuaHlwZXJ0eVRvLmFzc2VydGlvbiA9IG1lc3NhZ2UuYm9keS5pZGVudGl0eS5hc3NlcnRpb247XG4gICAgICAgICAgICBjaGF0S2V5cy5oeXBlcnR5VG8ucHVibGljS2V5ID0gcmVjZWl2ZXJQdWJsaWNLZXk7XG4gICAgICAgICAgICBjaGF0S2V5cy5oeXBlcnR5VG8udXNlcklEICAgID0gbWVzc2FnZS5ib2R5LmlkZW50aXR5LnVzZXJQcm9maWxlLnVzZXJVUkw7XG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLnRvUmFuZG9tICA9IGRlY29kZVRvVWludDhBcnJheSh0b1JhbmRvbSk7XG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLnByZW1hc3RlcktleSA9IHByZW1hc3RlclNlY3JldDtcblxuICAgICAgICAgICAgbGV0IGNvbmNhdEtleSA9IF90aGlzLmNyeXB0by5jb25jYXRQTVN3aXRoUmFuZG9tcyhwcmVtYXN0ZXJTZWNyZXQsIGNoYXRLZXlzLmtleXMudG9SYW5kb20sIGNoYXRLZXlzLmtleXMuZnJvbVJhbmRvbSk7XG5cbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVNYXN0ZXJTZWNyZXQoY29uY2F0S2V5LCAnbWVzc2FnZUhpc3RvcmljJyArIGNoYXRLZXlzLmtleXMudG9SYW5kb20gKyBjaGF0S2V5cy5rZXlzLmZyb21SYW5kb20pO1xuXG4gICAgICAgICAgICAvL2dlbmVyYXRlIHRoZSBtYXN0ZXIga2V5XG4gICAgICAgICAgfSkudGhlbigobWFzdGVyS2V5KSA9PiB7XG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLm1hc3RlcktleSA9IG1hc3RlcktleTtcblxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by5nZW5lcmF0ZUtleXMobWFzdGVyS2V5LCAna2V5IGV4cGFuc2lvbicgKyBjaGF0S2V5cy5rZXlzLnRvUmFuZG9tICsgY2hhdEtleXMua2V5cy5mcm9tUmFuZG9tKTtcblxuICAgICAgICAgICAgLy9nZW5lcmF0ZSB0aGUgc3ltbWV0cmljIGFuZCBoYXNoIGtleXNcbiAgICAgICAgICB9KS50aGVuKChrZXlzKSA9PiB7XG5cbiAgICAgICAgICAgIGNoYXRLZXlzLmtleXMuaHlwZXJ0eVRvU2Vzc2lvbktleSA9IG5ldyBVaW50OEFycmF5KGtleXNbMF0pO1xuICAgICAgICAgICAgY2hhdEtleXMua2V5cy5oeXBlcnR5RnJvbVNlc3Npb25LZXkgPSBuZXcgVWludDhBcnJheShrZXlzWzFdKTtcbiAgICAgICAgICAgIGNoYXRLZXlzLmtleXMuaHlwZXJ0eVRvSGFzaEtleSA9IG5ldyBVaW50OEFycmF5KGtleXNbMl0pO1xuICAgICAgICAgICAgY2hhdEtleXMua2V5cy5oeXBlcnR5RnJvbUhhc2hLZXkgPSBuZXcgVWludDhBcnJheShrZXlzWzNdKTtcbiAgICAgICAgICAgIGl2ID0gX3RoaXMuY3J5cHRvLmdlbmVyYXRlSVYoKTtcbiAgICAgICAgICAgIHZhbHVlLml2ID0gZW5jb2RlKGl2KTtcblxuICAgICAgICAgICAgbGV0IG1lc3NhZ2VTdHJ1Y3R1cmUgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdoYW5kc2hha2UnLFxuICAgICAgICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxuICAgICAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxuICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgaGFuZHNoYWtlUGhhc2U6ICdzZW5kZXJDZXJ0aWZpY2F0ZSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gaGFzaCB0aGUgdmFsdWUgYW5kIHRoZSBpdlxuICAgICAgICAgICAgZmlsdGVyZWRNZXNzYWdlID0gX3RoaXMuX2ZpbHRlck1lc3NhZ2VUb0hhc2gobWVzc2FnZVN0cnVjdHVyZSwgJ29rJyArIGl2LCBjaGF0S2V5cy5oeXBlcnR5RnJvbS5tZXNzYWdlSW5mbyk7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmhhc2hITUFDKGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21IYXNoS2V5LCBmaWx0ZXJlZE1lc3NhZ2UpO1xuICAgICAgICAgIH0pLnRoZW4oKGhhc2gpID0+IHtcbiAgICAgICAgICAgIHZhbHVlLmhhc2ggPSBlbmNvZGUoaGFzaCk7XG5cbiAgICAgICAgICAgIC8vZW5jcnlwdCB0aGUgZGF0YVxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by5lbmNyeXB0QUVTKGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21TZXNzaW9uS2V5LCAnb2snLCBpdik7XG4gICAgICAgICAgfSkudGhlbigoZW5jcnlwdGVkRGF0YSkgPT4ge1xuICAgICAgICAgICAgdmFsdWUuc3ltZXRyaWNFbmNyeXB0aW9uID0gZW5jb2RlKGVuY3J5cHRlZERhdGEpO1xuXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmVuY3J5cHRSU0EoY2hhdEtleXMuaHlwZXJ0eVRvLnB1YmxpY0tleSwgY2hhdEtleXMua2V5cy5wcmVtYXN0ZXJLZXkpO1xuXG4gICAgICAgICAgfSkudGhlbigoZW5jcnlwdGVkVmFsdWUpID0+IHtcbiAgICAgICAgICAgIHZhbHVlLmFzc3ltZXRyaWNFbmNyeXB0aW9uID0gZW5jb2RlKGVuY3J5cHRlZFZhbHVlKTtcblxuICAgICAgICAgICAgbGV0IG1lc3NhZ2VTdHJ1Y3R1cmUgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdoYW5kc2hha2UnLFxuICAgICAgICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxuICAgICAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxuICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgaGFuZHNoYWtlUGhhc2U6ICdzZW5kZXJDZXJ0aWZpY2F0ZSdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IG1lc3NhZ2VUb0hhc2ggPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChtZXNzYWdlU3RydWN0dXJlLCBjaGF0S2V5cy5rZXlzLnByZW1hc3RlcktleSwgY2hhdEtleXMuaHlwZXJ0eUZyb20ubWVzc2FnZUluZm8pO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by5zaWduUlNBKHByaXZhdGVLZXlIb2xkZXIsIGVuY29kZShjaGF0S2V5cy5oYW5kc2hha2VIaXN0b3J5KSArIGVuY29kZShtZXNzYWdlVG9IYXNoKSk7XG4gICAgICAgICAgfSkudGhlbihzaWduYXR1cmUgPT4ge1xuXG4gICAgICAgICAgICB2YWx1ZS5zaWduYXR1cmUgPSBlbmNvZGUoc2lnbmF0dXJlKTtcblxuICAgICAgICAgICAgbGV0IHJlY2VpdmVySGVsbG9Nc2cgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdoYW5kc2hha2UnLFxuICAgICAgICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxuICAgICAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxuICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgaGFuZHNoYWtlUGhhc2U6ICdzZW5kZXJDZXJ0aWZpY2F0ZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGVuY29kZSh2YWx1ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNoYXRLZXlzLmhhbmRzaGFrZUhpc3Rvcnkuc2VuZGVyQ2VydGlmaWNhdGUgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChyZWNlaXZlckhlbGxvTXNnLCAnb2snICsgaXYsIGNoYXRLZXlzLmh5cGVydHlGcm9tLm1lc3NhZ2VJbmZvKTtcblxuICAgICAgICAgICAgcmVzb2x2ZSh7bWVzc2FnZTogcmVjZWl2ZXJIZWxsb01zZywgY2hhdEtleXM6IGNoYXRLZXlzfSk7XG5cbiAgICAgICAgICB9LCBlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NlbmRlckNlcnRpZmljYXRlJzoge1xuXG4gICAgICAgICAgbG9nLmxvZygnc2VuZGVyQ2VydGlmaWNhdGUnKTtcblxuICAgICAgICAgIGxldCByZWNlaXZlZFZhbHVlID0gZGVjb2RlKG1lc3NhZ2UuYm9keS52YWx1ZSk7XG5cbiAgICAgICAgICBfdGhpcy5nZXRNeVByaXZhdGVLZXkoKS50aGVuKHByaXZhdGVLZXkgPT57XG4gICAgICAgICAgICBwcml2YXRlS2V5SG9sZGVyID0gcHJpdmF0ZUtleTtcblxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9pZG0udmFsaWRhdGVBc3NlcnRpb24obWVzc2FnZS5ib2R5LmlkZW50aXR5LmFzc2VydGlvbiwgdW5kZWZpbmVkLCBtZXNzYWdlLmJvZHkuaWRlbnRpdHkuaWRwLmRvbWFpbik7XG4gICAgICAgICAgfSkudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGxldCBlbmNyeXB0ZWRQTVMgPSBkZWNvZGVUb1VpbnQ4QXJyYXkocmVjZWl2ZWRWYWx1ZS5hc3N5bWV0cmljRW5jcnlwdGlvbik7XG5cbiAgICAgICAgICAgIC8vVE9ETyByZW1vdmUgbGF0ZXIgdGhpcyB2ZXJpZmljYXRpb24gYXMgc29vbiBhcyBhbGwgdGhlIElkUCBwcm94eSBhcmUgdXBkYXRlZCBpbiB0aGUgZXhhbXBsZVxuICAgICAgICAgICAgbGV0IGVuY29kZWRwdWJsaWNLZXkgPSAodHlwZW9mIHZhbHVlLmNvbnRlbnRzID09PSAnc3RyaW5nJykgPyB2YWx1ZS5jb250ZW50cyA6IHZhbHVlLmNvbnRlbnRzLm5vbmNlO1xuXG4gICAgICAgICAgICBsZXQgc2VuZGVyUHVibGljS2V5ID0gcGFyc2VUb1VpbnQ4QXJyYXkoZW5jb2RlZHB1YmxpY0tleSk7XG4gICAgICAgICAgICBjaGF0S2V5cy5oeXBlcnR5VG8uYXNzZXJ0aW9uID0gbWVzc2FnZS5ib2R5LmlkZW50aXR5LmFzc2VydGlvbjtcbiAgICAgICAgICAgIGNoYXRLZXlzLmh5cGVydHlUby5wdWJsaWNLZXkgPSBzZW5kZXJQdWJsaWNLZXk7XG4gICAgICAgICAgICBjaGF0S2V5cy5oeXBlcnR5VG8udXNlcklEICAgID0gbWVzc2FnZS5ib2R5LmlkZW50aXR5LnVzZXJQcm9maWxlLnVzZXJVUkw7XG5cbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8uZGVjcnlwdFJTQShwcml2YXRlS2V5SG9sZGVyLCBlbmNyeXB0ZWRQTVMpO1xuXG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAvLyBsb2cubG9nKGVycm9yKTtcbiAgICAgICAgICAgIHJlamVjdCgnRXJyb3IgZHVyaW5nIGF1dGhlbnRpY2F0aW9uIG9mIGlkZW50aXR5OiAnLCBlcnJvci5tZXNzYWdlKTtcblxuICAgICAgICAgICAgLy9vYnRhaW4gdGhlIFByZW1hc3RlcktleSB1c2luZyB0aGUgcHJpdmF0ZSBrZXlcbiAgICAgICAgICB9KS50aGVuKHBtcyA9PiB7XG5cbiAgICAgICAgICAgIGNoYXRLZXlzLmtleXMucHJlbWFzdGVyS2V5ID0gbmV3IFVpbnQ4QXJyYXkocG1zKTtcblxuICAgICAgICAgICAgbGV0IHNpZ25hdHVyZSA9IGRlY29kZVRvVWludDhBcnJheShyZWNlaXZlZFZhbHVlLnNpZ25hdHVyZSk7XG5cbiAgICAgICAgICAgIGxldCByZWNlaXZlZG1zZ1RvSGFzaCA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIGNoYXRLZXlzLmtleXMucHJlbWFzdGVyS2V5KTtcblxuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by52ZXJpZnlSU0EoY2hhdEtleXMuaHlwZXJ0eVRvLnB1YmxpY0tleSwgZW5jb2RlKGNoYXRLZXlzLmhhbmRzaGFrZUhpc3RvcnkpICsgZW5jb2RlKHJlY2VpdmVkbXNnVG9IYXNoKSwgc2lnbmF0dXJlKTtcblxuICAgICAgICAgICAgLy8gdmFsaWRhdGVzIHRoZSBzaWduYXR1cmUgcmVjZWl2ZWRcbiAgICAgICAgICB9KS50aGVuKHNpZ25WYWxpZGF0aW9uUmVzdWx0ID0+IHtcblxuICAgICAgICAgICAgLy9sb2cubG9nKCdTZW5kZXJDZXJ0aWZpY2F0ZSAtIHNpZ25hdHVyZSB2YWxpZGF0aW9uIHJlc3VsdCAnLCBzaWduVmFsaWRhdGlvblJlc3VsdCk7XG4gICAgICAgICAgICBsZXQgY29uY2F0S2V5ID0gX3RoaXMuY3J5cHRvLmNvbmNhdFBNU3dpdGhSYW5kb21zKGNoYXRLZXlzLmtleXMucHJlbWFzdGVyS2V5LCBjaGF0S2V5cy5rZXlzLnRvUmFuZG9tLCBjaGF0S2V5cy5rZXlzLmZyb21SYW5kb20pO1xuXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmdlbmVyYXRlTWFzdGVyU2VjcmV0KGNvbmNhdEtleSwgJ21lc3NhZ2VIaXN0b3JpYycgKyBjaGF0S2V5cy5rZXlzLnRvUmFuZG9tICsgY2hhdEtleXMua2V5cy5mcm9tUmFuZG9tKTtcblxuICAgICAgICAgICAgLy8gZ2VuZXJhdGVzIHRoZSBtYXN0ZXIga2V5cyBmcm9tIHRoZSBQcmVtYXN0ZXIga2V5IGFuZCB0aGUgcmFuZG9tc1xuICAgICAgICAgIH0pLnRoZW4obWFzdGVyS2V5ID0+IHtcbiAgICAgICAgICAgIGNoYXRLZXlzLmtleXMubWFzdGVyS2V5ID0gbWFzdGVyS2V5O1xuXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmdlbmVyYXRlS2V5cyhtYXN0ZXJLZXksICdrZXkgZXhwYW5zaW9uJyArIGNoYXRLZXlzLmtleXMudG9SYW5kb20gKyBjaGF0S2V5cy5rZXlzLmZyb21SYW5kb20pO1xuXG4gICAgICAgICAgICAvLyBnZW5lcmF0ZXMgdGhlIHN5bW1ldHJpYyBrZXlzIHRvIGJlIHVzZWQgaW4gdGhlIHN5bW1ldHJpYyBlbmNyeXB0aW9uXG4gICAgICAgICAgfSkudGhlbihrZXlzID0+IHtcbiAgICAgICAgICAgIGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21TZXNzaW9uS2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5c1swXSk7XG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLmh5cGVydHlUb1Nlc3Npb25LZXkgPSBuZXcgVWludDhBcnJheShrZXlzWzFdKTtcbiAgICAgICAgICAgIGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21IYXNoS2V5ID0gbmV3IFVpbnQ4QXJyYXkoa2V5c1syXSk7XG4gICAgICAgICAgICBjaGF0S2V5cy5rZXlzLmh5cGVydHlUb0hhc2hLZXkgPSBuZXcgVWludDhBcnJheShrZXlzWzNdKTtcbiAgICAgICAgICAgIGl2ID0gZGVjb2RlVG9VaW50OEFycmF5KHJlY2VpdmVkVmFsdWUuaXYpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSBkZWNvZGVUb1VpbnQ4QXJyYXkocmVjZWl2ZWRWYWx1ZS5zeW1ldHJpY0VuY3J5cHRpb24pO1xuXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLmRlY3J5cHRBRVMoY2hhdEtleXMua2V5cy5oeXBlcnR5VG9TZXNzaW9uS2V5LCBkYXRhLCBpdik7XG5cbiAgICAgICAgICB9KS50aGVuKGRlY3J5cHRlZERhdGEgPT4ge1xuICAgICAgICAgICAgLy8gbG9nLmxvZygnZGVjcnlwdGVkRGF0YScsIGRlY3J5cHRlZERhdGEpO1xuXG4gICAgICAgICAgICBjaGF0S2V5cy5oYW5kc2hha2VIaXN0b3J5LnNlbmRlckNlcnRpZmljYXRlID0gX3RoaXMuX2ZpbHRlck1lc3NhZ2VUb0hhc2gobWVzc2FnZSwgZGVjcnlwdGVkRGF0YSArIGl2KTtcblxuICAgICAgICAgICAgbGV0IGhhc2hSZWNlaXZlZCA9IGRlY29kZVRvVWludDhBcnJheShyZWNlaXZlZFZhbHVlLmhhc2gpO1xuXG4gICAgICAgICAgICBmaWx0ZXJlZE1lc3NhZ2UgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChtZXNzYWdlLCBkZWNyeXB0ZWREYXRhICsgaXYpO1xuXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLnZlcmlmeUhNQUMoY2hhdEtleXMua2V5cy5oeXBlcnR5VG9IYXNoS2V5LCBmaWx0ZXJlZE1lc3NhZ2UsIGhhc2hSZWNlaXZlZCk7XG5cbiAgICAgICAgICB9KS50aGVuKHZlcmlmaWVkSGFzaCAgPT4ge1xuXG4gICAgICAgICAgICAvLyBsb2cubG9nKCdyZXN1bHQgb2YgaGFzaCB2ZXJpZmljYXRpb24gJywgdmVyaWZpZWRIYXNoKTtcbiAgICAgICAgICAgIGxldCByZWNlaXZlckZpbmlzaGVkTWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2hhbmRzaGFrZScsXG4gICAgICAgICAgICAgIHRvOiBtZXNzYWdlLmZyb20sXG4gICAgICAgICAgICAgIGZyb206IG1lc3NhZ2UudG8sXG4gICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICBoYW5kc2hha2VQaGFzZTogJ3JlY2VpdmVyRmluaXNoZWRNZXNzYWdlJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaXYgPSBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVJVigpO1xuICAgICAgICAgICAgdmFsdWUuaXYgPSBlbmNvZGUoaXYpO1xuXG4gICAgICAgICAgICBmaWx0ZXJlZE1lc3NhZ2UgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChyZWNlaXZlckZpbmlzaGVkTWVzc2FnZSwgJ29rIScgKyBpdiwgY2hhdEtleXMuaHlwZXJ0eUZyb20ubWVzc2FnZUluZm8pO1xuXG4gICAgICAgICAgICAvL2xvZy5sb2coJ1RJQUdPOiBkb0hhbmRTaGFrZVBoYXNlIHZlcmlmaWVkSGFzaCcpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by5oYXNoSE1BQyhjaGF0S2V5cy5rZXlzLmh5cGVydHlGcm9tSGFzaEtleSwgZmlsdGVyZWRNZXNzYWdlKTtcbiAgICAgICAgICB9KS50aGVuKGhhc2ggPT4ge1xuXG4gICAgICAgICAgICB2YWx1ZS5oYXNoID0gZW5jb2RlKGhhc2gpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by5lbmNyeXB0QUVTKGNoYXRLZXlzLmtleXMuaHlwZXJ0eUZyb21TZXNzaW9uS2V5LCAnb2shJywgaXYpO1xuXG4gICAgICAgICAgfSkudGhlbihlbmNyeXB0ZWRWYWx1ZSA9PiB7XG4gICAgICAgICAgICB2YWx1ZS52YWx1ZSA9IGVuY29kZShlbmNyeXB0ZWRWYWx1ZSk7XG4gICAgICAgICAgICBsZXQgcmVjZWl2ZXJGaW5pc2hlZE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdoYW5kc2hha2UnLFxuICAgICAgICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxuICAgICAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxuICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgaGFuZHNoYWtlUGhhc2U6ICdyZWNlaXZlckZpbmlzaGVkTWVzc2FnZScsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGVuY29kZSh2YWx1ZSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY2hhdEtleXMuaGFuZHNoYWtlSGlzdG9yeS5yZWNlaXZlckZpbmlzaGVkTWVzc2FnZSA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKHJlY2VpdmVyRmluaXNoZWRNZXNzYWdlLCAnb2shJyArIGl2LCBjaGF0S2V5cy5oeXBlcnR5RnJvbS5tZXNzYWdlSW5mbyk7XG4gICAgICAgICAgICBjaGF0S2V5cy5hdXRoZW50aWNhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc29sdmUoe21lc3NhZ2U6IHJlY2VpdmVyRmluaXNoZWRNZXNzYWdlLCBjaGF0S2V5czogY2hhdEtleXN9KTtcbiAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KCdPbiBfZG9IYW5kU2hha2VQaGFzZSBmcm9tIHNlbmRlckNlcnRpZmljYXRlIGVycm9yOiAnICsgZXJyKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3JlY2VpdmVyRmluaXNoZWRNZXNzYWdlJzoge1xuXG4gICAgICAgICAgY2hhdEtleXMuYXV0aGVudGljYXRlZCA9IHRydWU7XG5cbiAgICAgICAgICB2YWx1ZSA9IGRlY29kZShtZXNzYWdlLmJvZHkudmFsdWUpO1xuXG4gICAgICAgICAgaXYgPSBkZWNvZGVUb1VpbnQ4QXJyYXkodmFsdWUuaXYpO1xuICAgICAgICAgIGxldCBkYXRhID0gZGVjb2RlVG9VaW50OEFycmF5KHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICBoYXNoID0gZGVjb2RlVG9VaW50OEFycmF5KHZhbHVlLmhhc2gpO1xuXG4gICAgICAgICAgX3RoaXMuY3J5cHRvLmRlY3J5cHRBRVMoY2hhdEtleXMua2V5cy5oeXBlcnR5VG9TZXNzaW9uS2V5LCBkYXRhLCBpdikudGhlbihkZWNyeXB0ZWREYXRhID0+IHtcbiAgICAgICAgICAgIC8vIGxvZy5sb2coJ2RlY3J5cHRlZERhdGEnLCBkZWNyeXB0ZWREYXRhKTtcbiAgICAgICAgICAgIGNoYXRLZXlzLmhhbmRzaGFrZUhpc3RvcnkucmVjZWl2ZXJGaW5pc2hlZE1lc3NhZ2UgPSBfdGhpcy5fZmlsdGVyTWVzc2FnZVRvSGFzaChtZXNzYWdlLCBkZWNyeXB0ZWREYXRhICsgaXYpO1xuXG4gICAgICAgICAgICBsZXQgZmlsdGVyZWRNZXNzYWdlID0gX3RoaXMuX2ZpbHRlck1lc3NhZ2VUb0hhc2gobWVzc2FnZSwgZGVjcnlwdGVkRGF0YSArIGl2KTtcbiAgICAgICAgICAgIF90aGlzLmNyeXB0by52ZXJpZnlITUFDKGNoYXRLZXlzLmtleXMuaHlwZXJ0eVRvSGFzaEtleSwgZmlsdGVyZWRNZXNzYWdlLCBoYXNoKS50aGVuKHJlc3VsdCA9PiB7XG5cbiAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgd2FzIGFuIGluaXRpYWwgbWVzc2FnZSB0aGF0IHdhcyBibG9ja2VkIGFuZCBzZW5kIGl0XG4gICAgICAgICAgICAgIGlmIChjaGF0S2V5cy5pbml0aWFsTWVzc2FnZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IGluaXRpYWxNZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxuICAgICAgICAgICAgICAgICAgZnJvbTogbWVzc2FnZS50byxcbiAgICAgICAgICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNoYXRLZXlzLmluaXRpYWxNZXNzYWdlLmJvZHkudmFsdWVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7bWVzc2FnZTogaW5pdGlhbE1lc3NhZ2UsIGNoYXRLZXlzOiBjaGF0S2V5c30pO1xuXG4gICAgICAgICAgICAgICAgLy9zZW5kcyB0aGUgc2Vzc2lvbktleSB0byB0aGUgc3Vic2NyaWJlciBoeXBlcnR5XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX3NlbmRSZXBvcnRlclNlc3Npb25LZXkobWVzc2FnZSwgY2hhdEtleXMpLnRoZW4odmFsdWUgPT4ge1xuXG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVqZWN0KCdPbiBfZG9IYW5kU2hha2VQaGFzZSBmcm9tIHJlY2VpdmVyRmluaXNoZWRNZXNzYWdlIGVycm9yOiAnICsgZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3JlcG9ydGVyU2Vzc2lvbktleSc6IHtcblxuICAgICAgICAgIGxvZy5sb2coJ3JlcG9ydGVyU2Vzc2lvbktleScpO1xuXG4gICAgICAgICAgbGV0IHZhbHVlSVZhbmRIYXNoID0gZGVjb2RlKG1lc3NhZ2UuYm9keS52YWx1ZSk7XG4gICAgICAgICAgaGFzaCA9IGRlY29kZVRvVWludDhBcnJheSh2YWx1ZUlWYW5kSGFzaC5oYXNoKTtcbiAgICAgICAgICBpdiA9IGRlY29kZVRvVWludDhBcnJheSh2YWx1ZUlWYW5kSGFzaC5pdik7XG4gICAgICAgICAgbGV0IGVuY3J5cHRlZFZhbHVlID0gZGVjb2RlVG9VaW50OEFycmF5KHZhbHVlSVZhbmRIYXNoLnZhbHVlKTtcbiAgICAgICAgICBsZXQgcGFyc2VkVmFsdWU7XG4gICAgICAgICAgbGV0IHNlc3Npb25LZXk7XG4gICAgICAgICAgbGV0IGRhdGFPYmplY3RVUkw7XG4gICAgICAgICAgbGV0IHJlY2VpdmVyQWNrbm93bGVkZ2VNc2c7XG5cbiAgICAgICAgICAvL2xvZy5sb2coJ1tJZGVudGl0eU1vZHVsZSByZXBvcnRlclNlc3Npb25LZXldIC0gZGVjcnlwdEFFUzogJywgY2hhdEtleXMua2V5cy5oeXBlcnR5VG9TZXNzaW9uS2V5LCBlbmNyeXB0ZWRWYWx1ZSwgaXYpO1xuXG4gICAgICAgICAgX3RoaXMuY3J5cHRvLmRlY3J5cHRBRVMoY2hhdEtleXMua2V5cy5oeXBlcnR5VG9TZXNzaW9uS2V5LCBlbmNyeXB0ZWRWYWx1ZSwgaXYpLnRoZW4oZGVjcnlwdGVkVmFsdWUgPT4ge1xuXG4gICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IGRlY29kZShkZWNyeXB0ZWRWYWx1ZSk7XG4gICAgICAgICAgICBzZXNzaW9uS2V5ID0gZGVjb2RlVG9VaW50OEFycmF5KHBhcnNlZFZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgIGRhdGFPYmplY3RVUkwgPSBwYXJzZWRWYWx1ZS5kYXRhT2JqZWN0VVJMO1xuXG4gICAgICAgICAgICBsZXQgbWVzc2FnZVRvSGFzaCA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIGRlY3J5cHRlZFZhbHVlICsgaXYpO1xuXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY3J5cHRvLnZlcmlmeUhNQUMoY2hhdEtleXMua2V5cy5oeXBlcnR5VG9IYXNoS2V5LCBtZXNzYWdlVG9IYXNoLCBoYXNoKTtcblxuICAgICAgICAgIH0pLnRoZW4oaGFzaFJlc3VsdCA9PiB7XG5cblxuICAgICAgICAgICAgLy8gbG9nLmxvZygnaGFzaCBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkICcsIGhhc2hSZXN1bHQpO1xuXG4gICAgICAgICAgICBfdGhpcy5kYXRhT2JqZWN0U2Vzc2lvbktleXNbZGF0YU9iamVjdFVSTF0gPSAge3Nlc3Npb25LZXk6IHNlc3Npb25LZXksIGlzVG9FbmNyeXB0OiB0cnVlfTtcbiAgICAgICAgICAgIGxldCBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZSA9IGNoYXRrZXlzVG9TdHJpbmdDbG9uZXIoX3RoaXMuZGF0YU9iamVjdFNlc3Npb25LZXlzKTtcbiAgICAgICAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldCgnZGF0YU9iamVjdFNlc3Npb25LZXlzJywgMCwgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmUpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdCgnT24gX3NlbmRSZXBvcnRlclNlc3Npb25LZXkgZnJvbSBtZXRob2QgcmVwb3J0ZXJTZXNzaW9uS2V5IGVycm9yOiAnICsgZXJyKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpdiA9IF90aGlzLmNyeXB0by5nZW5lcmF0ZUlWKCk7XG4gICAgICAgICAgICB2YWx1ZS5pdiA9IGVuY29kZShpdik7XG5cbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8uZW5jcnlwdEFFUyhjaGF0S2V5cy5rZXlzLmh5cGVydHlGcm9tU2Vzc2lvbktleSwgJ29rISEnLCBpdik7XG4gICAgICAgICAgfSkudGhlbihlbmNyeXB0ZWRWYWx1ZSA9PiB7XG5cbiAgICAgICAgICAgIHJlY2VpdmVyQWNrbm93bGVkZ2VNc2cgPSB7XG4gICAgICAgICAgICAgIHR5cGU6ICdoYW5kc2hha2UnLFxuICAgICAgICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxuICAgICAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxuICAgICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgICAgaGFuZHNoYWtlUGhhc2U6ICdyZWNlaXZlckFja25vd2xlZGdlJ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YWx1ZS52YWx1ZSA9IGVuY29kZShlbmNyeXB0ZWRWYWx1ZSk7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZVRvSGFzaCA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKHJlY2VpdmVyQWNrbm93bGVkZ2VNc2csICdvayEhJyArIGl2LCBjaGF0S2V5cy5oeXBlcnR5RnJvbS5tZXNzYWdlSW5mbyk7XG5cbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcnlwdG8uaGFzaEhNQUMoY2hhdEtleXMua2V5cy5oeXBlcnR5RnJvbUhhc2hLZXksIG1lc3NhZ2VUb0hhc2gpO1xuICAgICAgICAgIH0pLnRoZW4oaGFzaGVkTWVzc2FnZSA9PiB7XG4gICAgICAgICAgICBsZXQgZmluYWxWYWx1ZSA9IGVuY29kZSh7dmFsdWU6IHZhbHVlLnZhbHVlLCBoYXNoOiBlbmNvZGUoaGFzaGVkTWVzc2FnZSksIGl2OiB2YWx1ZS5pdn0pO1xuXG4gICAgICAgICAgICByZWNlaXZlckFja25vd2xlZGdlTXNnLmJvZHkudmFsdWUgPSBmaW5hbFZhbHVlO1xuICAgICAgICAgICAgcmVzb2x2ZSh7bWVzc2FnZTogcmVjZWl2ZXJBY2tub3dsZWRnZU1zZywgY2hhdEtleXM6IGNoYXRLZXlzfSk7XG4gICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIHJlamVjdCgnT24gX2RvSGFuZFNoYWtlUGhhc2UgZnJvbSByZXBvcnRlclNlc3Npb25LZXkgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdyZWNlaXZlckFja25vd2xlZGdlJzoge1xuXG4gICAgICAgICAgbG9nLmxvZygncmVjZWl2ZXJBY2tub3dsZWRnZScpO1xuXG4gICAgICAgICAgbGV0IHJlY2VpdmVkdmFsdWVJVmFuZEhhc2ggPSBkZWNvZGUobWVzc2FnZS5ib2R5LnZhbHVlKTtcbiAgICAgICAgICBsZXQgcmVjZWl2ZWRIYXNoID0gZGVjb2RlVG9VaW50OEFycmF5KHJlY2VpdmVkdmFsdWVJVmFuZEhhc2guaGFzaCk7XG4gICAgICAgICAgaXYgPSBkZWNvZGVUb1VpbnQ4QXJyYXkocmVjZWl2ZWR2YWx1ZUlWYW5kSGFzaC5pdik7XG4gICAgICAgICAgbGV0IHJlY2VpdmVkRW5jcnlwdGVkVmFsdWUgPSBkZWNvZGVUb1VpbnQ4QXJyYXkocmVjZWl2ZWR2YWx1ZUlWYW5kSGFzaC52YWx1ZSk7XG5cbiAgICAgICAgICBfdGhpcy5jcnlwdG8uZGVjcnlwdEFFUyhjaGF0S2V5cy5rZXlzLmh5cGVydHlUb1Nlc3Npb25LZXksIHJlY2VpdmVkRW5jcnlwdGVkVmFsdWUsIGl2KS50aGVuKGRlY3J5cHRlZFZhbHVlID0+IHtcblxuICAgICAgICAgICAgbGV0IGZpbHRlcmVkTWVzc2FnZSA9IF90aGlzLl9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIGRlY3J5cHRlZFZhbHVlICsgaXYpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyeXB0by52ZXJpZnlITUFDKGNoYXRLZXlzLmtleXMuaHlwZXJ0eVRvSGFzaEtleSwgZmlsdGVyZWRNZXNzYWdlLCByZWNlaXZlZEhhc2gpO1xuICAgICAgICAgIH0pLnRoZW4oaGFzaFJlc3VsdCA9PiB7XG4gICAgICAgICAgICAvLyBsb2cubG9nKCdoYXNoUmVzdWx0ICcsIGhhc2hSZXN1bHQpO1xuXG4gICAgICAgICAgICBsZXQgY2FsbGJhY2sgPSBjaGF0S2V5cy5jYWxsYmFjaztcblxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKCdoYW5kU2hha2VFbmQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoJ2hhbmRTaGFrZUVuZCcpO1xuICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICByZWplY3QoJ09uIF9kb0hhbmRTaGFrZVBoYXNlIGZyb20gcmVjZWl2ZXJBY2tub3dsZWRnZSBlcnJvcjogJyArIGVycik7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVqZWN0KG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogZmlsdGVyIHRoZSBtZXNzYWdlcyB0byBoYXNoLCBieSByZW1vdmluZyBzb21lIGZpZWxkcyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBydW50aW1lIGNvcmVcbiAgKiBAcGFyYW0ge01lc3NhZ2V9ICBtZXNzYWdlICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVxuICAqIEBwYXJhbSB7U3RyaW5nfSAgZGVjcnlwdGVkVmFsdWUgKE9wdGlvbmFsKSAgICB2YWx1ZSBmcm9tIGJvZHkudmFsdWUgaW4gY2FzZSBpdCBvcmlnaW5hbGx5IGNvbWVzIGVuY3J5cHRlZFxuICAqIEBwYXJhbSB7SlNPTn0gIGlkZW50aXR5KE9wdGlvbmFsKSAgICBhZGQgdGhlIGh5cGVydHkgaWRlbnRpdHkgYXNzb2NpYXRlZCBpbiBjYXNlIGlzIG5vdCBhZGRlZCB0byB0aGUgaW5pdGlhbCBtZXNzYWdlXG4gICogQHJldHVybiB7TWVzc2FnZX0gIG5ldyBtZXNzYWdlIGZpbHRlcmVkXG4gICovXG4gIF9maWx0ZXJNZXNzYWdlVG9IYXNoKG1lc3NhZ2UsIGRlY3J5cHRlZFZhbHVlLCBpZGVudGl0eSkge1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IG1lc3NhZ2UudHlwZSxcbiAgICAgIGZyb206IG1lc3NhZ2UuZnJvbSxcbiAgICAgIHRvOiBtZXNzYWdlLnRvLFxuICAgICAgYm9keToge1xuICAgICAgICBpZGVudGl0eTogaWRlbnRpdHkgfHwgbWVzc2FnZS5ib2R5LmlkZW50aXR5LFxuICAgICAgICB2YWx1ZTogZGVjcnlwdGVkVmFsdWUgfHwgbWVzc2FnZS5ib2R5LnZhbHVlLFxuICAgICAgICBoYW5kc2hha2VQaGFzZTogbWVzc2FnZS5ib2R5LmhhbmRzaGFrZVBoYXNlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAqIGdlbmVyYXRlcyB0aGUgaW5pdGlhbCBzdHJ1Y3R1cmUgZm9yIHRoZSBrZXlzIGJldHdlZW4gdHdvIHVzZXJzXG4gICogQHBhcmFtIHtKU09OfSAgICBtZXNzYWdlICAgICAgICAgICAgICBpbml0aWFsIG1lc3NhZ2UgdGhhdCB0cmlnZ2VycyB0aGUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uXG4gICogQHBhcmFtIHtTdHJpbmd9ICB1c2VyVVJMICAgICAgICAgICAgICB1c2VyVVJMXG4gICogQHBhcmFtIHtib29sZWFufSByZWNlaXZlcihPcHRpb25hbCkgIGluZGljYXRlcyBpZiBpcyB0aGUgc2VuZGVyIG9yIHRoZSByZWNlaXZlciB0aGF0IGNyZWF0ZXMgYSBuZXcgY2hhdCBjcnlwdG9cbiAgKiBAcmV0dXJuIHtKU09OfSBuZXdDaGF0Q3J5cHRvICBuZXcgSlNPTiBzdHJ1Y3R1cmUgZm9yIHRoZSBjaGF0IGNyeXB0b1xuICAqL1xuICBfbmV3Q2hhdENyeXB0byhtZXNzYWdlLCB1c2VyVVJMLCByZWNlaXZlcikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAvL2NoZWNrIHdoZXRoZXIgaXMgdGhlIHNlbmRlciBvciB0aGUgcmVjZWl2ZXIgdG8gY3JlYXRlIGEgbmV3IGNoYXRDcnlwdG9cbiAgICAvL3RvIG1hbnRhaW4gY29uc2lzdGVuY3kgb24gdGhlIGtleXMgaWYgdGhlIHJlY2VpdmVyIGNyZWF0ZSBhIG5ldyBjaGF0Q3J5cHRvLFxuICAgIC8vdGhlbiBpbnZlcnQgdGhlIGZpZWxkc1xuICAgIGxldCBmcm9tID0gKHJlY2VpdmVyKSA/IG1lc3NhZ2UudG8gOiBtZXNzYWdlLmZyb207XG4gICAgbGV0IHRvID0gKHJlY2VpdmVyKSA/IG1lc3NhZ2UuZnJvbSA6IG1lc3NhZ2UudG87XG5cbiAgICBsZXQgdXNlckluZm8gPSBfdGhpcy5faWRtLmdldElkZW50aXR5KHVzZXJVUkwpO1xuXG4gICAgbGV0IG5ld0NoYXRDcnlwdG8gPVxuICAgICAge1xuICAgICAgICBoeXBlcnR5RnJvbTpcbiAgICAgICAge1xuICAgICAgICAgIGh5cGVydHk6IGZyb20sXG4gICAgICAgICAgdXNlcklEOiB1c2VySW5mby51c2VyUHJvZmlsZS51c2VyVVJMLFxuXG4gICAgICAgICAgLy9wcml2YXRlS2V5OiBcImdldE15UHVibGljS2V5XCIsXG4gICAgICAgICAgLy9wdWJsaWNLZXk6IFwiZ2V0TXlQcml2YXRlS2V5XCIsXG4gICAgICAgICAgYXNzZXJ0aW9uOiB1c2VySW5mby5hc3NlcnRpb24sXG4gICAgICAgICAgbWVzc2FnZUluZm86IHVzZXJJbmZvXG4gICAgICAgIH0sXG4gICAgICAgIGh5cGVydHlUbzpcbiAgICAgICAge1xuICAgICAgICAgIGh5cGVydHk6IHRvLFxuICAgICAgICAgIHVzZXJJRDogdW5kZWZpbmVkLFxuICAgICAgICAgIHB1YmxpY0tleTogdW5kZWZpbmVkLFxuICAgICAgICAgIGFzc2VydGlvbjogdW5kZWZpbmVkXG4gICAgICAgIH0sXG4gICAgICAgIGtleXM6XG4gICAgICAgIHtcbiAgICAgICAgICBoeXBlcnR5VG9TZXNzaW9uS2V5OiB1bmRlZmluZWQsXG4gICAgICAgICAgaHlwZXJ0eUZyb21TZXNzaW9uS2V5OiB1bmRlZmluZWQsXG4gICAgICAgICAgaHlwZXJ0eVRvSGFzaEtleTogdW5kZWZpbmVkLFxuICAgICAgICAgIGh5cGVydHlGcm9tSGFzaEtleTogdW5kZWZpbmVkLFxuICAgICAgICAgIHRvUmFuZG9tOiB1bmRlZmluZWQsXG4gICAgICAgICAgZnJvbVJhbmRvbTogdW5kZWZpbmVkLFxuICAgICAgICAgIHByZW1hc3RlcktleTogdW5kZWZpbmVkLFxuICAgICAgICAgIG1hc3RlcktleTogdW5kZWZpbmVkXG4gICAgICAgIH0sXG4gICAgICAgIGhhbmRzaGFrZUhpc3Rvcnk6IHtcbiAgICAgICAgICBzZW5kZXJIZWxsbzogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlY2VpdmVySGVsbG86IHVuZGVmaW5lZCxcbiAgICAgICAgICBzZW5kZXJDZXJ0aWZpY2F0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHJlY2VpdmVyRmluaXNoZWRNZXNzYWdlOiB1bmRlZmluZWRcbiAgICAgICAgfSxcbiAgICAgICAgaW5pdGlhbE1lc3NhZ2U6IChtZXNzYWdlLmJvZHkuaWdub3JlKSA/IHVuZGVmaW5lZCA6IG1lc3NhZ2UsXG4gICAgICAgIGNhbGxiYWNrOiBtZXNzYWdlLmNhbGxiYWNrLFxuICAgICAgICBhdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICAgICAgZGF0YU9iamVjdFVSTDogbWVzc2FnZS5kYXRhT2JqZWN0VVJMXG4gICAgICB9O1xuXG4gICAgcmV0dXJuIG5ld0NoYXRDcnlwdG87XG4gIH1cblxuICAvKipcbiAgKiBSZXRyaWV2ZXMgYSBwdWJsaWMga2V5cyBnaXZlbiBhIHVzZXIgcmVmcmVuY2UuIElmIG5vIGtleSBpcyBmb3VuZCxcbiAgZ2VuZXJhdGVzIGEgbmV3IGtleSBhc3ltbWV0cmljIGtleSBhbmQgcmV0cmlldmVzIHRoZSBwdWJsaWMga2V5cy5cbiAgKiBAcGFyYW0gICB7dXNlclJlZn0gICAgU3RyaW5nICAgIHVzZXIgcmVmZXJlbmNlIGZvciB0aGUga2V5IHBhaXJcbiAgKiBAcmV0dXJuICB7QXJyYXl9ICAgcHVibGljIGtleVxuICAqL1xuICBnZXRNeVB1YmxpY0tleSh1c2VyUmVmID0gdGhpcy51c2VyRGVmYXVsdEtleVJlZikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCh1c2VyUmVmKS50aGVuKHN0b3JlZEtleVBhaXIgPT4ge1xuICAgICAgICBpZiAoc3RvcmVkS2V5UGFpcikge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKHN0b3JlZEtleVBhaXIucHVibGljKTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5fZ2VuZXJhdGVBbmRTdG9yZU5ld0FzeW1ldHJpY0tleSh1c2VyUmVmKS50aGVuKGdlbmVyYXRlZEtleVBhaXIgPT4ge1xuICAgICAgICAgIHJlc29sdmUoZ2VuZXJhdGVkS2V5UGFpci5wdWJsaWMpO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGxvZy5lcnJvcignW2dldE15UHVibGljS2V5Ol9nZW5lcmF0ZUFuZFN0b3JlTmV3QXN5bWV0cmljS2V5OmVycl06ICcgKyBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgbG9nLmVycm9yKCdbZ2V0TXlQdWJsaWNLZXk6c3RvcmFnZU1hbmFnZXI6ZXJyXTogJyArIGVyci5tZXNzYWdlKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIFJldHJpZXZlcyBhIHByaXZhdGUga2V5cyBnaXZlbiBhIHVzZXIgcmVmcmVuY2UuIElmIG5vIGtleSBpcyBmb3VuZCxcbiAgZ2VuZXJhdGVzIGEgbmV3IGtleSBhc3ltbWV0cmljIGtleSBhbmQgcmV0cmlldmVzIHRoZSBwcml2YXRlIGtleS5cbiAgKiBAcGFyYW0gICB7dXNlclJlZn0gICAgU3RyaW5nICAgIHVzZXIgcmVmZXJlbmNlIGZvciB0aGUga2V5IHBhaXJcbiAgKiBAcmV0dXJuICB7QXJyYXl9ICAgcHJpdmF0ZSBrZXlcbiAgKiovXG4gIGdldE15UHJpdmF0ZUtleSh1c2VyUmVmID0gdGhpcy51c2VyRGVmYXVsdEtleVJlZikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldCh1c2VyUmVmKS50aGVuKHN0b3JlZEtleVBhaXIgPT4ge1xuICAgICAgICBpZiAoc3RvcmVkS2V5UGFpcikge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKHN0b3JlZEtleVBhaXIucHJpdmF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgX3RoaXMuX2dlbmVyYXRlQW5kU3RvcmVOZXdBc3ltZXRyaWNLZXkodXNlclJlZikudGhlbihnZW5lcmF0ZWRLZXlQYWlyID0+IHtcbiAgICAgICAgICByZXNvbHZlKGdlbmVyYXRlZEtleVBhaXIucHJpdmF0ZSk7XG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgbG9nLmVycm9yKCdbZ2V0TXlQcml2YXRlS2V5Ol9nZW5lcmF0ZUFuZFN0b3JlTmV3QXN5bWV0cmljS2V5OmVycl06ICcgKyBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgbG9nLmVycm9yKCdbZ2V0TXlQcml2YXRlS2V5OnN0b3JhZ2VNYW5hZ2VyOmVycl06ICcgKyBlcnIubWVzc2FnZSk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAqIEdlbmVyYXRlcyBhIG5ldyBrZXkgcGFpciwgc3RvcmVzIGFuZCByZXRyaXZlcyB0aGUga2V5IHBhaXIuXG4gICogQHBhcmFtICAge3VzZXJSZWZ9ICAgIFN0cmluZyAgICB1c2VyIHJlZmVyZW5jZSBmb3IgdGhlIGtleSBwYWlyXG4gICogQHJldHVybiAge0FycmF5fSAgIHByaXZhdGUga2V5XG4gICoqL1xuICBfZ2VuZXJhdGVBbmRTdG9yZU5ld0FzeW1ldHJpY0tleSh1c2VyUmVmKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQga2V5UGFpciA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuLy8gICAgICBfdGhpcy5jcnlwdG8uZ2VuZXJhdGVSU0FLZXlQYWlyKCkudGhlbihnZW5lcmF0ZWRLZXlQYWlyID0+IHtcbiAgICAgICAgbGV0IGdlbmVyYXRlZEtleVBhaXIgPSB7fTtcbiAgICAgICAgZ2VuZXJhdGVkS2V5UGFpci5wcml2YXRlID0gZ2VuZXJhdGVHVUlEKCk7XG4gICAgICAgIGdlbmVyYXRlZEtleVBhaXIucHVibGljID0gZ2VuZXJhdGVHVUlEKCk7XG4gICAgICAgIGxvZy5sb2coJ19nZW5lcmF0ZUFuZFN0b3JlTmV3QXN5bWV0cmljS2V5OnVzZXJBc3ltbWV0cmljS2V5R2VuZXJhdGVkJywgZ2VuZXJhdGVkS2V5UGFpcik7XG4gICAgICAgIGtleVBhaXIgPSBnZW5lcmF0ZWRLZXlQYWlyO1xuICAgICAgICBfdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQodXNlclJlZiwgMCwgZ2VuZXJhdGVkS2V5UGFpcik7XG4vLyAgICAgIH0pLnRoZW4oc3RvcmVkUmVmZXJlbmNlID0+IHtcbi8vICAgICAgICBsb2cubG9nKCdfZ2VuZXJhdGVBbmRTdG9yZU5ld0FzeW1ldHJpY0tleTp1c2VyQXN5bW1ldHJpY0tleVN1Y2Nlc3MnLCBzdG9yZWRSZWZlcmVuY2UpO1xuICAgICAgICByZXNvbHZlKGtleVBhaXIpO1xuICAgICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgbG9nLmVycm9yKCdbX2dlbmVyYXRlQW5kU3RvcmVOZXdBc3ltZXRyaWNLZXk6ZXJyXTogJyArIGVyci5tZXNzYWdlKTtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9KTtcbi8vICAgIH0pO1xuICB9XG5cbn1cblxuLypcbmNvbnN0IG5vZGVKU0tleVBhaXJQb3B1bGF0ZSA9IHsgcHVibGljOiBbNDgsIDEzMCwgMSwgMzQsIDQ4LCAxMywgNiwgOSwgNDIsIDEzNCwgNzIsIDEzNCwgMjQ3LCAxMywgMSwgMSwgMSwgNSwgMCwgMywgMTMwLCAxLCAxNSwgMCwgNDgsIDEzMCwgMSwgMTAsIDIsIDEzMCwgMSwgMSwgMCwgMjI4LCA0MywgMTAxLCAxMiwgMTIxLCA3LCAxNTcsIDcxLCA4MSwgNTgsIDIxOSwgMzIsIDEwLCAxMDgsIDE5MywgMTc5LCAyMTIsIDExNiwgMjU1LCA1OSwgMjE3LCAzMiwgMTYxLCAyMDEsIDUzLCAxNzEsIDIyNiwgMTk5LCAxMzcsIDIwMiwgMTcxLCA2MCwgODIsIDUzLCAxMjUsIDYyLCAxNzcsIDEyNiwgMTY1LCAyNCwgMTQxLCAzMCwgMTUsIDIyNiwgNTksIDEwNywgMzQsIDcsIDEzLCAxNDksIDExMiwgMTI1LCAxMCwgMjMwLCAxOTEsIDE1NiwgMTY0LCAxNzcsIDEwLCAxODUsIDEzLCA2NiwgMywgMjE3LCAxNjYsIDI0NCwgOTAsIDExOSwgMTExLCAyNywgMTQ1LCAxMDQsIDcxLCAxODksIDE2NiwgMjI2LCAyNTUsIDEzMywgODMsIDE1MSwgMjMxLCAxMDEsIDE1MSwgODksIDIyLCAxOSwgNjUsIDE1NCwgMTAsIDUzLCAyMDgsIDIxOCwgMjUyLCAyMTksIDM3LCA1MCwgMjEyLCA4NiwgMTQ1LCAxMDcsIDEzMiwgOTAsIDIzMywgMjAyLCAyMjcsIDEwOCwgMTE0LCAxNDEsIDI5LCA3MywgMTg3LCAzMSwgMTMsIDIzNCwgMCwgMjMyLCAyNCwgMTkxLCAzNSwgMTQ5LCAxNzksIDEzOCwgMjE0LCAxNTksIDI0NSwgMTYyLCAxNDgsIDIyMSwgMTE4LCAxNywgMTA1LCA4OSwgMTUxLCAxNDYsIDIwOSwgNTUsIDIzNiwgNjEsIDE0MywgMjMzLCAyMjgsIDEwLCAxMTUsIDgsIDgxLCAxOTcsIDQ1LCAxMjMsIDE4NywgMjIzLCAxNzYsIDI1NCwgMTY1LCA2OSwgMTQzLCAyOSwgMTAwLCAxMTQsIDE3LCAxMzAsIDIyNiwgMjIzLCAzMywgMTEsIDI0MCwgODEsIDYxLCAxNzIsIDE5MSwgMTU3LCAyNDYsIDIwMiwgODcsIDEzMSwgMjIxLCA4OCwgNDgsIDEyNywgMTU5LCAxMTksIDE2MCwgMTUyLCAxMTcsIDYxLCAyNTMsIDE3NCwgNjUsIDIxNCwgMjAzLCAyMTgsIDYzLCA1MCwgNzgsIDE2MCwgMTgxLCAyMjEsIDIxMSwgMTI4LCA3MCwgMTc4LCAxOTEsIDE3MCwgMCwgMTMsIDEyMiwgMTczLCAxMiwgMjAzLCAyNTIsIDQsIDE4NCwgMjI1LCAyNTIsIDcsIDYyLCA5NiwgMTE2LCAxNSwgMjE2LCAxNTgsIDU1LCA4NSwgNDgsIDE2LCA5LCAyMDYsIDExOSwgNzQsIDExMiwgMjQzLCAxMzYsIDg0LCAxODQsIDIyMywgMjU0LCAxMDEsIDkxLCA2MSwgMTAsIDkxLCA4NSwgMTkyLCAxNDcsIDE0NCwgNTcsIDI5LCA2NiwgMjM4LCAxOTksIDI0NCwgMTkzLCAxOTQsIDE1MCwgMjMyLCAyMDAsIDEwNywgMiwgMywgMSwgMCwgMV0sXG4gIHByaXZhdGU6IFs0OCwgMTMwLCA0LCAxOTEsIDIsIDEsIDAsIDQ4LCAxMywgNiwgOSwgNDIsIDEzNCwgNzIsIDEzNCwgMjQ3LCAxMywgMSwgMSwgMSwgNSwgMCwgNCwgMTMwLCA0LCAxNjksIDQ4LCAxMzAsIDQsIDE2NSwgMiwgMSwgMCwgMiwgMTMwLCAxLCAxLCAwLCAyMjgsIDQzLCAxMDEsIDEyLCAxMjEsIDcsIDE1NywgNzEsIDgxLCA1OCwgMjE5LCAzMiwgMTAsIDEwOCwgMTkzLCAxNzksIDIxMiwgMTE2LCAyNTUsIDU5LCAyMTcsIDMyLCAxNjEsIDIwMSwgNTMsIDE3MSwgMjI2LCAxOTksIDEzNywgMjAyLCAxNzEsIDYwLCA4MiwgNTMsIDEyNSwgNjIsIDE3NywgMTI2LCAxNjUsIDI0LCAxNDEsIDMwLCAxNSwgMjI2LCA1OSwgMTA3LCAzNCwgNywgMTMsIDE0OSwgMTEyLCAxMjUsIDEwLCAyMzAsIDE5MSwgMTU2LCAxNjQsIDE3NywgMTAsIDE4NSwgMTMsIDY2LCAzLCAyMTcsIDE2NiwgMjQ0LCA5MCwgMTE5LCAxMTEsIDI3LCAxNDUsIDEwNCwgNzEsIDE4OSwgMTY2LCAyMjYsIDI1NSwgMTMzLCA4MywgMTUxLCAyMzEsIDEwMSwgMTUxLCA4OSwgMjIsIDE5LCA2NSwgMTU0LCAxMCwgNTMsIDIwOCwgMjE4LCAyNTIsIDIxOSwgMzcsIDUwLCAyMTIsIDg2LCAxNDUsIDEwNywgMTMyLCA5MCwgMjMzLCAyMDIsIDIyNywgMTA4LCAxMTQsIDE0MSwgMjksIDczLCAxODcsIDMxLCAxMywgMjM0LCAwLCAyMzIsIDI0LCAxOTEsIDM1LCAxNDksIDE3OSwgMTM4LCAyMTQsIDE1OSwgMjQ1LCAxNjIsIDE0OCwgMjIxLCAxMTgsIDE3LCAxMDUsIDg5LCAxNTEsIDE0NiwgMjA5LCA1NSwgMjM2LCA2MSwgMTQzLCAyMzMsIDIyOCwgMTAsIDExNSwgOCwgODEsIDE5NywgNDUsIDEyMywgMTg3LCAyMjMsIDE3NiwgMjU0LCAxNjUsIDY5LCAxNDMsIDI5LCAxMDAsIDExNCwgMTcsIDEzMCwgMjI2LCAyMjMsIDMzLCAxMSwgMjQwLCA4MSwgNjEsIDE3MiwgMTkxLCAxNTcsIDI0NiwgMjAyLCA4NywgMTMxLCAyMjEsIDg4LCA0OCwgMTI3LCAxNTksIDExOSwgMTYwLCAxNTIsIDExNywgNjEsIDI1MywgMTc0LCA2NSwgMjE0LCAyMDMsIDIxOCwgNjMsIDUwLCA3OCwgMTYwLCAxODEsIDIyMSwgMjExLCAxMjgsIDcwLCAxNzgsIDE5MSwgMTcwLCAwLCAxMywgMTIyLCAxNzMsIDEyLCAyMDMsIDI1MiwgNCwgMTg0LCAyMjUsIDI1MiwgNywgNjIsIDk2LCAxMTYsIDE1LCAyMTYsIDE1OCwgNTUsIDg1LCA0OCwgMTYsIDksIDIwNiwgMTE5LCA3NCwgMTEyLCAyNDMsIDEzNiwgODQsIDE4NCwgMjIzLCAyNTQsIDEwMSwgOTEsIDYxLCAxMCwgOTEsIDg1LCAxOTIsIDE0NywgMTQ0LCA1NywgMjksIDY2LCAyMzgsIDE5OSwgMjQ0LCAxOTMsIDE5NCwgMTUwLCAyMzIsIDIwMCwgMTA3LCAyLCAzLCAxLCAwLCAxLCAyLCAxMzAsIDEsIDAsIDEwMywgMjQ0LCAxMzcsIDExOCwgMTE2LCA4MiwgMTQsIDIwMywgMTAyLCAxMDcsIDI1MywgODgsIDEyLCAxOTksIDIyMiwgNjAsIDI0MywgMTM2LCA4NiwgMTU3LCA3NCwgMjI0LCAxOTAsIDUzLCAxMTMsIDU3LCAxNTcsIDI1MCwgNDksIDEzMCwgOTYsIDMxLCAyNTIsIDEzNiwgMTUyLCA3MCwgMTQzLCAxNywgMjE1LCA5NiwgMTAzLCA1MSwgMTgsIDM1LCAxNDEsIDIxMiwgMjEwLCAyMDUsIDksIDIxNiwgODMsIDcwLCAyNDUsIDcxLCAxMzgsIDExOSwgMTEyLCAyMjksIDE2NCwgMTc2LCA5LCAzNywgODEsIDE2MSwgMTkzLCAxNTQsIDY4LCAyNDksIDExNSwgMTA2LCAyMDEsIDYsIDEyLCAyMjUsIDE0NCwgMTI2LCAxNDEsIDIxMCwgMTQxLCAyNDIsIDEyOCwgMTU5LCAyMjEsIDE2MywgMjIyLCAyMSwgMjMzLCAyMzAsIDE2NywgMjA2LCA1OSwgMjQsIDI1MCwgMjMzLCA4MSwgMTIyLCAxMDIsIDI2LCA2LCAyMzMsIDcyLCAxMzMsIDQ3LCA3NywgMTU1LCAyMzgsIDg2LCA2LCAxMzksIDI0LCAxMzEsIDE2MywgMTc5LCAxMTIsIDQ4LCAyNDcsIDE0MiwgNiwgMjA3LCAyMDQsIDE3MywgMjIzLCAxNDAsIDE5OSwgMTUwLCA5NSwgMTIzLCAxNTIsIDIwMiwgMTU1LCAxMzEsIDIzOCwgNjIsIDk2LCAxMzMsIDQsIDIxNywgNTEsIDEyMSwgMzAsIDM4LCAxNzgsIDE4OSwgMjE2LCA0NCwgMzUsIDI0MSwgOTMsIDcsIDYyLCA5MCwgMTExLCAyMTYsIDY2LCAyMDksIDI0MywgMTI4LCAyMzQsIDE0MSwgODQsIDEzNSwgMTgxLCAxMywgMzgsIDIyMCwgMTE0LCAyNDUsIDI0MCwgMTc4LCA5NSwgMjIwLCAyMDYsIDExLCAxODYsIDIzNCwgMjEzLCA2NiwgMTIxLCA4MywgNjgsIDg5LCA3NSwgNDYsIDE4MywgMTQ1LCAxODMsIDE0NywgMTYwLCAyMTUsIDExOCwgMTk4LCAxMjUsIDE4MSwgMTQ2LCAzMCwgMjUxLCA1OCwgODcsIDQ3LCAyMDksIDIzNywgOTcsIDI0LCA0NywgMTc5LCA2LCAxMTAsIDI0MiwgOTksIDE1MCwgMjI2LCAxNDgsIDE5OCwgMTc0LCAxNDYsIDEwMSwgMjEzLCA4NywgMTc4LCAxMCwgMjIzLCAxMDUsIDE4LCA1NiwgNTMsIDIyLCAyMTIsIDE1OCwgMTcwLCAxNzYsIDUxLCA4NiwgMTQ1LCAxMjUsIDEyNCwgNDQsIDksIDg1LCAxOSwgMTQ0LCAyNDYsIDE3MCwgNzgsIDEyNCwgMzAsIDMyLCAxMiwgMTY2LCAxNzQsIDEzOSwgNzcsIDYzLCAxNzMsIDgyLCAxMCwgMTUzLCAyLCAxMjksIDEyOSwgMCwgMjQ4LCAxOCwgMTQzLCAyNDYsIDEzNywgMTM2LCAxNDUsIDIxOSwgMTc4LCAzOSwgMjcsIDk0LCA2NCwgOTAsIDQ3LCAxNjMsIDExNCwgNjAsIDYzLCAxODcsIDEzMSwgMTQzLCAyNDQsIDE2LCA0MiwgMTI4LCAyMzEsIDExNywgOTIsIDk4LCAyMTksIDE1NSwgNjIsIDEwNywgMjUyLCAxNywgMjQ1LCA0NSwgMTYwLCAyMjUsIDEwMywgMTQyLCA3MiwgMzYsIDE5MywgMTUwLCAyMzUsIDIxNCwgMTc1LCA2MiwgMjEyLCA1NiwgNDUsIDksIDAsIDYwLCAxMTQsIDEwNywgMTM0LCAyMjgsIDIwNCwgMTMxLCAxMzEsIDIxNCwgOTQsIDIwMSwgMTQ4LCAxNTksIDk5LCAxMzksIDE4MSwgMTMsIDExOSwgMzgsIDMwLCAxMDcsIDE2NiwgMTY1LCAyMDMsIDQzLCAzNCwgMjAsIDIwNywgMTcxLCAzMiwgNTgsIDE2NywgNjIsIDE5NiwgMTUzLCAxMDMsIDIwNCwgMjEzLCAyNDcsIDQ4LCAxMTEsIDIyNywgNTksIDk1LCA5NywgMTk0LCAxODcsIDUzLCAxMCwgMjQ3LCAxMDgsIDU4LCA4NiwgMjgsIDI5LCAxMTMsIDgsIDExMCwgMTcxLCAyMjAsIDI0NSwgMTEsIDgyLCAyMzMsIDIyMywgOTEsIDY4LCAxNjYsIDExNywgMTc0LCAxODcsIDYyLCA3NywgMiwgMTI5LCAxMjksIDAsIDIzNSwgMTE4LCAyLCAxMDUsIDIzOSwgMjEyLCAzMCwgMTA0LCAxNTcsIDQxLCAxMDksIDExLCAyNDgsIDE1MiwgMjIsIDIzNiwgOTcsIDQwLCAxNTMsIDEzMSwgMjI4LCA1LCA4NiwgMTg3LCAxMTMsIDEyNiwgMTQ0LCA3NiwgMTQxLCA3OSwgMTEwLCAyNTAsIDE0NiwgMTUyLCA0OSwgNTgsIDE1NiwgMjAxLCAxNzYsIDkyLCAxODksIDIwOSwgMzAsIDExMiwgMTA4LCAxNzUsIDIwNCwgMjA0LCAyNDcsIDE2NCwgNDYsIDEyOSwgMjM5LCA5OCwgMTI3LCA0OSwgMTQ1LCAyMTgsIDYzLCAxOTMsIDEyNCwgMTc0LCAxOCwgOTgsIDIwMSwgOTksIDE1NCwgMTYyLCAxMzgsIDc4LCAxNTksIDI1MywgMywgMjQ4LCAzLCAyMDksIDM2LCAyMzksIDE5MywgMTU1LCAxOTMsIDUsIDE5LCAyMzYsIDM3LCA3OCwgMTE4LCAxMzUsIDI1MCwgMTk5LCA3LCAxNDEsIDI0OCwgMTIwLCAzNiwgMTM2LCA5MywgOTgsIDE3NCwgNjAsIDE4LCAyMTUsIDkzLCAxNzQsIDEwNywgMTQxLCAxMTYsIDE0NSwgMTY3LCAyMjEsIDIxMCwgMTY5LCAyNDcsIDY3LCAyNTQsIDIyMiwgMTYxLCAxMzQsIDYzLCAyMjEsIDkwLCA4NywgNDIsIDk5LCAyMjcsIDgxLCAxNzMsIDE1MSwgMiwgMTI5LCAxMjksIDAsIDEzMywgMjMsIDE2OCwgMTAzLCA4MywgMjMyLCAxNDYsIDE2MCwgMTgxLCAyMywgNDAsIDM4LCAyMDQsIDEzLCAyMTQsIDIwMywgNDksIDQxLCAxOTUsIDIyNywgMTg5LCAxODEsIDgsIDI0MywgMTE5LCAxMDYsIDc1LCA2NywgMjUwLCAyNTAsIDEwLCAyMzQsIDk4LCAxMTgsIDI2LCAyNTAsIDM1LCAxMjEsIDEzMiwgMTI0LCAxMCwgNzYsIDI2LCAxOTgsIDE2NSwgMTU0LCAxMDgsIDE5LCAxMTcsIDg4LCAyMywgMTcsIDE5MiwgMTQzLCAxODQsIDE3NywgMTgxLCAxNDEsIDE1NywgNCwgMTg1LCAyNDgsIDE5MywgNzcsIDIwNCwgMjQzLCA3LCAxNzAsIDI0MCwgNCwgMTExLCAxMTMsIDE4MywgMCwgMjcsIDEzNiwgMjAsIDE5LCAxNDksIDc0LCAzMywgMjQxLCAyMTgsIDEwOCwgMjM2LCA4MCwgMTcxLCAxNDgsIDE2LCAxMTYsIDk3LCAxMDksIDgzLCA3NCwgODgsIDE0NSwgOTQsIDIzOSwgMTAyLCAxOTIsIDE5LCAxMTQsIDIwNywgNSwgMTI4LCA1MSwgMTExLCAxNjQsIDIzNywgODYsIDE1NCwgOTksIDUyLCAxOTcsIDYyLCA1NywgMTgyLCA2LCAxNTIsIDI0NSwgNjEsIDEzNywgNTgsIDEwNSwgMTU5LCAyLCA4NCwgMTA5LCAyLCAxMjksIDEyOSwgMCwgMjI2LCA2NywgMTExLCAxMzIsIDk1LCA5MSwgMTAxLCAxNzcsIDYzLCAxODksIDQ0LCA1MywgMTkzLCAxODQsIDkyLCAyMzAsIDIyMywgOTgsIDEzMywgNzQsIDIwOSwgODYsIDUyLCA3LCA2NSwgMTk1LCAyMDYsIDEwMCwgODEsIDE3OCwgMTQ0LCA2NSwgMTY3LCAxNTEsIDQyLCA3OSwgODksIDE0OSwgMTgsIDE3MywgMTg4LCAyMSwgMjQ0LCAyNTEsIDQ5LCAyMzAsIDQxLCAxNTAsIDE1MywgNDYsIDM1LCAzOCwgMjMxLCA5OSwgMTc0LCA1NiwgMTE1LCAzMiwgMjE1LCAyNTMsIDg1LCAxNDcsIDEwOCwgMTk3LCAxNDcsIDM0LCAyMzYsIDIxNiwgMjIyLCAxNzcsIDU3LCA5MCwgMTM2LCAxMTQsIDIwNywgNDgsIDQ2LCAzMSwgOTAsIDIyMCwgMTgsIDU4LCAxNDMsIDIzOSwgMTExLCAyMTQsIDI3LCA5NSwgNiwgMzYsIDUzLCAyMjksIDYyLCAxMDgsIDQ1LCAzOSwgMSwgMzAsIDQ3LCAxNzgsIDU2LCAxNjQsIDIwNiwgNTYsIDQyLCAyMDgsIDQ2LCAxOTMsIDYxLCAzMSwgMTQ3LCA0NSwgMTQ3LCAyMywgMTg3LCAyMiwgNTAsIDI1NSwgMTExLCAyMjksIDEzMiwgMTk5LCAxNTIsIDc1LCAxNDIsIDEzNiwgMjA5LCAxNTEsIDIsIDEyOSwgMTI5LCAwLCAxNjUsIDU2LCAyMzIsIDc2LCA1NSwgNTcsIDI0MCwgMTU5LCA5MiwgMjA3LCAyMjAsIDE0MywgMTMwLCAzMCwgNTcsIDIzNCwgMjUxLCAxNzIsIDE3MSwgMTgwLCA1NCwgMTU5LCAyMjksIDk2LCAyNDYsIDczLCAxMTIsIDE0NiwgNzUsIDE1NywgMjQyLCAyMDEsIDE2MSwgMjE4LCAzNywgMTc2LCAzNSwgMTcwLCA1MCwgOTAsIDE0OCwgMTAyLCAxOTEsIDE5OSwgMjM5LCAxNzQsIDc4LCA3MiwgNjcsIDg1LCAxOTksIDQ1LCAxNDksIDE0NSwgMTMyLCAxNjEsIDIxMiwgMzMsIDE1NywgNzUsIDIxNiwgNzksIDM5LCAyMzMsIDE4LCAyMTAsIDI1NSwgMjYsIDcyLCAyMjksIDIzOSwgNDQsIDEyLCAxNDcsIDE1OCwgMTc2LCAxOTIsIDk1LCAxMjYsIDMyLCAxNzUsIDIzLCAyMjYsIDEzMSwgMTM5LCAxOTcsIDE3NSwgMTkzLCA2MiwgOCwgMTUxLCAyNTIsIDY4LCAxNTQsIDk0LCA4OSwgMTg5LCAxMjUsIDkwLCAzMCwgMzYsIDE3NSwgNzMsIDIzMCwgMTk0LCAxMywgMjMzLCAyNDcsIDEyMywgNjAsIDI0MSwgNDcsIDE3MSwgNTEsIDE4OSwgMTEyLCAxMTEsIDIxMywgMTQxLCA4OSwgNzAsIDI0OSwgMjM2LCA2MywgMjM2LCAxMTAsIDExNSwgMjA4XX07XG4qL1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgQ3J5cHRvTWFuYWdlcigpO1xuIiwiLy8gTG9nIFN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdMb2FkZXInKTtcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBkaXZpZGVVUkwsIGVtcHR5T2JqZWN0IH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEFkZHJlc3NBbGxvY2F0aW9uIGZyb20gJy4uL2FsbG9jYXRpb24vQWRkcmVzc0FsbG9jYXRpb24nO1xuXG5jbGFzcyBMb2FkZXIge1xuXG4gIGNvbnN0cnVjdG9yKHJ1bnRpbWVVUkwsIHJ1bnRpbWVDb25maWd1cmF0aW9uLCBydW50aW1lRGVzY3JpcHRvcnNJbnN0YW5jZSkge1xuICAgIGlmICghcnVudGltZUNvbmZpZ3VyYXRpb24pIHRocm93IEVycm9yKCdbUnVudGltZS5Mb2FkZXJdIFRoZSBkZXNjcmlwdG9yIG5lZWQgdG8ga25vdyB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uJyk7XG4gICAgaWYgKCFydW50aW1lRGVzY3JpcHRvcnNJbnN0YW5jZSkgdGhyb3cgRXJyb3IoJ1tSdW50aW1lLkxvYWRlcl0gVGhlIGRlc2NyaXB0b3IgbmVlZCB0byBrbm93IHRoZSBydW50aW1lIERlc2NyaXB0b3IgaW5zdGFuY2UnKTtcblxuICAgIHRoaXMubG9nID0gbG9nO1xuXG4gICAgdGhpcy5ydW50aW1lQ29uZmlndXJhdGlvbiA9IHJ1bnRpbWVDb25maWd1cmF0aW9uO1xuICAgIHRoaXMuZGVzY3JpcHRvcnMgPSBydW50aW1lRGVzY3JpcHRvcnNJbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcnVudGltZSB1cmxcbiAgICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBydW50aW1lVVJMXG4gICAqL1xuICBzZXQgcnVudGltZVVSTCh2YWx1ZSkge1xuICAgIHRoaXMuX3J1bnRpbWVVUkwgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcnVudGltZSB1cmxcbiAgICogQHJldHVybiB7c3RyaW5nfSB2YWx1ZSBydW50aW1lVVJMXG4gICAqL1xuICBnZXQgcnVudGltZVVSTCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVudGltZVVSTDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgUmVnaXN0cnkgY29tcG9uZW50XG4gICAqIEBwYXJhbSAge1JlZ2lzdHJ5fSB2YWx1ZSBSZWdpc3RyeSBDb21wb25lbnRcbiAgICovXG4gIHNldCByZWdpc3RyeSh2YWx1ZSkge1xuICAgIHRoaXMuX3JlZ2lzdHJ5ID0gdmFsdWU7XG5cbiAgICAvLyBJbnN0YWxsIEFkZHJlc3NBbGxvY2F0aW9uXG4gICAgbGV0IGFkZHJlc3NBbGxvY2F0aW9uID0gQWRkcmVzc0FsbG9jYXRpb24uaW5zdGFuY2U7XG4gICAgdGhpcy5fYWRkcmVzc0FsbG9jYXRpb24gPSBhZGRyZXNzQWxsb2NhdGlvbjtcblxuICAgIGxvZy5sb2coJ1tMb2FkZXIgLSBBZGRyZXNzQWxsb2NhdGlvbl0gLSAnLCBhZGRyZXNzQWxsb2NhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IFJlZ2lzdHJ5IGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHtSZWdpc3RyeX0gUmVnaXN0cnkgY29tcG9uZW50XG4gICAqL1xuICBnZXQgcmVnaXN0cnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBNZXNzYWdlIEJ1cyBjb21wb25lbnRcbiAgICogQHBhcmFtICB7TWVzc2FnZUJ1c30gdmFsdWUgTWVzc2FnZSBidXMgY29tcG9uZW50XG4gICAqL1xuICBzZXQgbWVzc2FnZUJ1cyh2YWx1ZSkge1xuICAgIHRoaXMuX21lc3NhZ2VzQnVzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1lc3NhZ2UgQnVzIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHtNZXNzYWdlQnVzfSBNZXNzYWdlIEJ1cyBjb21wb25lbnRcbiAgICovXG4gIGdldCBtZXNzYWdlQnVzKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlc0J1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgUnVudGltZSBGYWN0b3J5IGNvbXBvbmVudFxuICAgKiBAcGFyYW0gIHtydW50aW1lRmFjdG9yeX0gdmFsdWUgRmFjdG9yeSBpbmNsdWRlcyB0aGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIGZvciBlYWNoIGVudmlyb25tZW50XG4gICAqL1xuICBzZXQgcnVudGltZUZhY3RvcnkodmFsdWUpIHtcbiAgICB0aGlzLl9ydW50aW1lRmFjdG9yeSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBSdW50aW1lIEZhY3RvcnkgY29tcG9uZW50XG4gICAqIEByZXR1cm4ge3J1bnRpbWVGYWN0b3J5fSBSdW50aW1lIEZhY3RvcnkgY29tcG9uZW50XG4gICAqL1xuICBnZXQgcnVudGltZUZhY3RvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3J1bnRpbWVGYWN0b3J5O1xuICB9XG5cblxuICAvKipcbiAgICogRGVwbG95IEh5cGVydHkgZnJvbSBDYXRhbG9ndWUgVVJMXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9zcGVjcy90cmVlL21hc3Rlci9kYXRhbW9kZWwvY29yZS9hZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7VVJMLkh5cGVydHlDYXRhbG9ndWVVUkx9IGh5cGVydHlDYXRhbG9ndWVVUkwgLSBUaGUgQ2F0YWxvZ3VlIFVSTCB1c2VkIHRvIGlkZW50aWZ5IGRlc2NyaXB0b3JzIGluIHRoZSBDYXRhbG9ndWUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbnxVUkwuSHlwZXJ0eVVSTH0gW3JldXNlVVJMPWZhbHNlXSByZXVzZVVSTCAtIHJldXNlVVJMIGlzIHVzZWQgdG8gcmV1c2UgdGhlIGh5cGVydHlVUkwgcHJldmlvdXNseSByZWdpc3RyZWQsIGJ5IGRlZmF1bHQgdGhlIHJldXNlIGlzIGRpc2FibGVkO1xuICAgKiBAcGFyYW0ge1VSTH0gYXBwVVJMIC0gdGhlIGFwcCB1cmwgb3JpZ2luIGFkZHJlc3M7XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBJZHBDb25zdHJhaW50IC0gY29uc3RyYWludHMgdG8gYmUgdXNlZCB3aGVuIHNlbGVjdGluZyB0aGUgaWRlbnRpdHkgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBIeXBlcnR5IGluY2x1ZGluZyBvcmlnaW4sIGlkcCwgYW5kIGlkSGludC5cbiAgICogQHJldHVybnMge1Byb21pc2U8Qm9vbGVhbiwgRXJyb3I+fSB0aGlzIGlzIFByb21pc2UgYW5kIHJldHVybnMgdHJ1ZSBpZiBhbGwgY29tcG9uZW50cyBhcmUgbG9hZGVkIHdpdGggc3VjY2VzcyBvciBhbiBlcnJvciBpZiBzb21lb25lIGZhaWxzLlxuICAgKlxuICAgKiBAbWVtYmVyT2YgTG9hZGVyXG4gICAqL1xuICBsb2FkSHlwZXJ0eShoeXBlcnR5Q2xhc3MsIHJldXNlVVJMID0gZmFsc2UsIElkcENvbnN0cmFpbnQsIGFwcFVSTCkge1xuXG4gICAgaWYgKCF0aGlzLl9yZWFkeVRvVXNlKCkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWh5cGVydHlDbGFzcykgdGhyb3cgbmV3IEVycm9yKCdbUnVudGltZS5Mb2FkZXJdIGh5cGVydHlDbGFzcyBwYXJhbWV0ZXIgaXMgbmVlZGVkJyk7XG5cblxuICAgIGxldCBfaHlwZXJ0eVVSTDtcbiAgICBsZXQgX2h5cGVydHlTYW5kYm94O1xuICAgIGxldCBfaHlwZXJ0eVNvdXJjZVBhY2thZ2U7XG4gICAgbGV0IGhhdmVFcnJvciA9IGZhbHNlO1xuICAgIGxldCBpbnN0YW5jZSA9IG5ldyBoeXBlcnR5Q2xhc3MoKTtcbiAgICBsZXQgaHlwZXJ0eSA9IGluc3RhbmNlLm5hbWU7XG5cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGxldCBlcnJvclJlYXNvbiA9IChyZWFzb24pID0+IHtcbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gU29tZXRoaW5nIGZhaWxlZCBvbiB0aGUgZGVwbG95IGh5cGVydHk6ICcsIHJlYXNvbik7XG4gICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgfTtcbiAgXG4gICAgICBsZXQgaGFuZGxlRXJyb3IgPSAocmVhc29uKSA9PiB7XG4gICAgICAgIGhhdmVFcnJvciA9IHRydWU7XG4gICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgfTtcbiAgXG4gICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRIeXBlcnR5XSAnLCBoeXBlcnR5KTtcbiAgICAgIGxldCBfaHlwZXJ0eURlc2NyaXB0b3IgPSBpbnN0YW5jZS5kZXNjcmlwdG9yO1xuXG4gICAgICBfaHlwZXJ0eURlc2NyaXB0b3IuZGF0YU9iamVjdHNbMF0gPSBfaHlwZXJ0eURlc2NyaXB0b3IuZGF0YU9iamVjdHNbMF0ucmVwbGFjZSgnJWRvbWFpbiUnLCB0aGlzLl9yZWdpc3RyeS5fZG9tYWluKTtcblxuICAgICAgLy8gYXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBjb21wbGV0ZWQgXCJzdGVwIDIgYW5kIDNcIiBhcyBzaG93biBpbiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1oeXBlcnR5Lm1kXG4gICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSAxOiByZXR1cm4gaHlwZXJ0eSBkZXNjcmlwdG9yOiAnLCBfaHlwZXJ0eURlc2NyaXB0b3IpO1xuXG5cbiAgICAgIF9oeXBlcnR5U2FuZGJveCA9IHRoaXMucmVnaXN0cnkuZ2V0QXBwU2FuZGJveCgpO1xuXG5cblxuICAgICAgbGV0IG51bWJlck9mQWRkcmVzc2VzID0gMTtcbiAgICAgIC8vZGVidWdnZXI7XG4gICAgICB0aGlzLl9hZGRyZXNzQWxsb2NhdGlvbi5jcmVhdGUodGhpcy5fcmVnaXN0cnkuX2RvbWFpbiwgbnVtYmVyT2ZBZGRyZXNzZXMsIF9oeXBlcnR5RGVzY3JpcHRvciwgJ2h5cGVydHknLCByZXVzZVVSTClcbiAgICAgIC50aGVuKChhZGRyZXNzZXMpID0+IHtcbiAgICAgICAgaWYgKGhhdmVFcnJvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSA2OiByZXR1cm4gdGhlIGFkZHJlc3NlcyBmb3IgdGhlIGh5cGVydHknLCBhZGRyZXNzZXMpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGh5cGVydHlcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnkucmVnaXN0ZXJIeXBlcnR5KF9oeXBlcnR5U2FuZGJveCwgaHlwZXJ0eSwgX2h5cGVydHlEZXNjcmlwdG9yLCBhZGRyZXNzZXMsIElkcENvbnN0cmFpbnQpO1xuICAgICAgfSwgaGFuZGxlRXJyb3IpXG4gICAgICAudGhlbigocmVnaXN0cmF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gNzogcmVnaXN0cmF0aW9uIHJlc3VsdCcsIHJlZ2lzdHJhdGlvblJlc3VsdCk7XG5cbiAgICAgICAgLy8gd2UgaGF2ZSBjb21wbGV0ZWQgc3RlcCAxNiBvZiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1oeXBlcnR5Lm1kIHJpZ2h0IG5vdy5cbiAgICAgICAgX2h5cGVydHlVUkwgPSByZWdpc3RyYXRpb25SZXN1bHQudXJsO1xuXG4gICAgICAgIC8vIEV4dGVuZCBvcmlnaW5hbCBoeXBlcnR5IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIGxldCBjb25maWd1cmF0aW9uID0ge307XG4gICAgICAgIGlmICghZW1wdHlPYmplY3QoX2h5cGVydHlEZXNjcmlwdG9yLmNvbmZpZ3VyYXRpb24pKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBPYmplY3QuYXNzaWduKHt9LCBKU09OLnBhcnNlKF9oeXBlcnR5RGVzY3JpcHRvci5jb25maWd1cmF0aW9uKSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uZmlndXJhdGlvbiA9IF9oeXBlcnR5RGVzY3JpcHRvci5jb25maWd1cmF0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwgPSB0aGlzLl9ydW50aW1lVVJMO1xuXG4gICAgICAgIGlmIChyZWdpc3RyYXRpb25SZXN1bHQucDJwSGFuZGxlcikge1xuICAgICAgICAgIGNvbmZpZ3VyYXRpb24ucDJwSGFuZGxlciA9IHJlZ2lzdHJhdGlvblJlc3VsdC5wMnBIYW5kbGVyO1xuICAgICAgICAgIGNvbmZpZ3VyYXRpb24ucDJwUmVxdWVzdGVyID0gcmVnaXN0cmF0aW9uUmVzdWx0LnAycFJlcXVlc3RlcjtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gV2Ugd2lsbCBkZXBsb3kgdGhlIGNvbXBvbmVudCAtIHN0ZXAgMTcgb2YgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktaHlwZXJ0eS5tZCByaWdodCBub3cuXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBfaHlwZXJ0eVNhbmRib3guZGVwbG95Q29tcG9uZW50KF9oeXBlcnR5U291cmNlUGFja2FnZS5zb3VyY2VDb2RlLCBfaHlwZXJ0eVVSTCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgICAgcmV0dXJuIF9oeXBlcnR5U2FuZGJveC5kZXBsb3lDb21wb25lbnQoaW5zdGFuY2UsIF9oeXBlcnR5VVJMLCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIEVycm9yIG9uIGRlcGxveSBjb21wb25lbnQ6JywgZSk7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9LCBoYW5kbGVFcnJvcilcbiAgICAgIC50aGVuKChkZXBsb3lDb21wb25lbnRTdGF0dXMpID0+IHtcbiAgICAgICAgaWYgKGhhdmVFcnJvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSA4OiBEZXBsb3kgY29tcG9uZW50IHN0YXR1cyBmb3IgaHlwZXJ0eTogJywgZGVwbG95Q29tcG9uZW50U3RhdHVzKTtcblxuICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIDE5IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LWh5cGVydHkubWQgcmlnaHQgbm93LlxuXG4gICAgICAgIC8vIEFkZCB0aGUgbWVzc2FnZSBidXMgbGlzdGVuZXIgdG8gdGhlIGFwcFNhbmRib3ggb3IgaHlwZXJ0U2FuZGJveDtcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF9oeXBlcnR5VVJMLCAobXNnKSA9PiB7XG4gICAgICAgICAgX2h5cGVydHlTYW5kYm94LnBvc3RNZXNzYWdlKG1zZyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCB0aGUgbWVzc2FnZSBidXMgbGlzdGVuZXIgdG8gdGhlIGFwcFNhbmRib3ggb3IgaHlwZXJ0U2FuZGJveDtcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzLmFkZExpc3RlbmVyKHRoaXMucnVudGltZVVSTCArICcvc3RhdHVzJywgKG1zZykgPT4ge1xuICAgICAgICAgIF9oeXBlcnR5U2FuZGJveC5wb3N0TWVzc2FnZShtc2cpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIDIwIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LWh5cGVydHkubWQgcmlnaHQgbm93LlxuICAgICAgICBsZXQgZGVwbG95ZWQgPSB7XG4gICAgICAgICAgcnVudGltZUh5cGVydHlVUkw6IF9oeXBlcnR5VVJMLFxuICAgICAgICAgIHN0YXR1czogZGVwbG95Q29tcG9uZW50U3RhdHVzLFxuICAgICAgICAgIG5hbWU6IGh5cGVydHksXG4gICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICAgIH07XG5cbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gSHlwZXJ0eSBkZXBsb3llZDogJywgZGVwbG95ZWQpO1xuICAgICAgICByZXNvbHZlKGluc3RhbmNlKTtcblxuICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIDIxIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LWh5cGVydHkubWQgcmlnaHQgbm93LlxuICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSAtLS0tLS0tLS0tLS0tLS0tLS0gRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgfSwgaGFuZGxlRXJyb3IpXG4gICAgICAuY2F0Y2goZXJyb3JSZWFzb24pO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBEZXBsb3kgU3R1YiBmcm9tIENhdGFsb2d1ZSBVUkwgb3IgZG9tYWluIHVybFxuICAqIEBwYXJhbSAge1VSTC5VUkx9ICAgICBwcm90b3N0dWJVUkwgICAgQ2F0YWxvZ3VlIFVSTCBmb3IgdGhlIFByb3RvU3R1YiB0byBiZSBsb2FkZWQgb3IgdGhlIGRvbWFpbiB0byBiZSB0YXJnZXQgYnkgdGhlIHByb3Rvc3R1YlxuICAqIEBwYXJhbSAge09iamVjdH0gICAgICBwMnBDb25maWcgICAgICAgY29uZmlndXJhdGlvbiBvZiBwMnBcbiAgKi9cbiAgbG9hZFN0dWIocHJvdG9zdHViVVJMLCBwMnBDb25maWcpIHtcblxuICAgIGlmICghdGhpcy5fcmVhZHlUb1VzZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFwcm90b3N0dWJVUkwpIHRocm93IG5ldyBFcnJvcignW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXVByb3RvU3R1YiBkZXNjcmlwdG9yIHVybCBwYXJhbWV0ZXIgaXMgbmVlZGVkJyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICAvLyB0byBhbmFseXNlIGlmIGRvbWFpbiBmb3IgcDJwSGFuZGxlcnMgc2hvdWxkIGJlIHNvbWV0aGluZyBlbHNlIGFuZCBub3QgdGhlIGRlZmF1bHQgZG9tYWluIGl0c2VsZlxuXG4gICAgICBsZXQgZG9tYWluID0gZGl2aWRlVVJMKHByb3Rvc3R1YlVSTCkuZG9tYWluO1xuXG4gICAgICBpZiAoIWRvbWFpbikge1xuICAgICAgICBkb21haW4gPSBwcm90b3N0dWJVUkw7XG4gICAgICB9XG5cbiAgICAgIGxldCBfc3R1YlNhbmRib3g7XG4gICAgICBsZXQgX3N0dWJEZXNjcmlwdG9yO1xuICAgICAgbGV0IF9ydW50aW1lUHJvdG9TdHViVVJMO1xuICAgICAgbGV0IF9zdHViU291cmNlUGFja2FnZTtcbiAgICAgIGxldCBoYXZlRXJyb3IgPSBmYWxzZTtcbiAgICAgIGxldCBzdHViSWQ7XG5cbiAgICAgIGxldCBlcnJvclJlYXNvbiA9IChyZWFzb24pID0+IHtcbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl1Tb21ldGhpbmcgZmFpbGVkIG9uIHRoZSBkZXBsb3kgb2YgcHJvdG9jb2xzdHViOiAnLCByZWFzb24pO1xuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH07XG5cbiAgICAgIGxldCBoYW5kbGVFcnJvciA9IChyZWFzb24pID0+IHtcbiAgICAgICAgaGF2ZUVycm9yID0gdHJ1ZTtcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9O1xuXG4gICAgICAvLyBEaXNjb3ZlciBQcm90b2NvbCBTdHViXG4gICAgICBsZXQgZGlzY292ZXJTdHViO1xuICAgICAgbGV0IGlzUDJQSGFuZGxlciA9IGZhbHNlO1xuICAgICAgbGV0IGlzUDJQUmVxdWVzdGVyID0gZmFsc2U7XG4gICAgICBsZXQgc3R1YkNhcGFiaWxpdGllcyA9IHt9O1xuXG4gICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXSBzdGFydGluZyBsb2FkaW5nIGZvciAnLCBwcm90b3N0dWJVUkwsICcgd2l0aCBwMnBjb25maWcgJywgcDJwQ29uZmlnKTtcbiAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXIubG9hZFN0dWJdRGlzY292ZXIgb3IgQ3JlYXRlIGEgbmV3IFByb3RvU3R1YiBmb3IgZG9tYWluOiAnLCBkb21haW4pO1xuXG4gICAgICAvLyBzdGVwIDIgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG4gICAgICB0cnkge1xuICAgICAgICBpZiAocDJwQ29uZmlnKSB7XG5cbiAgICAgICAgICBpZiAocDJwQ29uZmlnLmhhc093blByb3BlcnR5KCdpc0hhbmRsZXJTdHViJykgJiYgcDJwQ29uZmlnLmlzSGFuZGxlclN0dWIpIHtcbiAgICAgICAgICAgIC8vIHN0ZXAgNiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcbiAgICAgICAgICAgIGlzUDJQSGFuZGxlciA9IHRydWU7XG4gICAgICAgICAgICBzdHViSWQgPSB0aGlzLnJ1bnRpbWVVUkw7XG4gICAgICAgICAgICBkaXNjb3ZlclN0dWIgPSB0aGlzLnJlZ2lzdHJ5LmRpc2NvdmVyUDJQU3R1YigpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpc1AyUFJlcXVlc3RlciA9IHRydWU7XG4gICAgICAgICAgICBsZXQgcDJwSGFuZGxlclJ1bnRpbWVVUkwgPSBwMnBDb25maWcucmVtb3RlUnVudGltZVVSTDtcbiAgICAgICAgICAgIHN0dWJJZCA9IHAycEhhbmRsZXJSdW50aW1lVVJMO1xuXG4gICAgICAgICAgICAvLyBzdGVwIDQgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG5cbiAgICAgICAgICAgIC8vIHN0ZXAgNSBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcbiAgICAgICAgICAgIGRpc2NvdmVyU3R1YiA9IHRoaXMucmVnaXN0cnkuZGlzY292ZXJQMlBTdHViKHAycEhhbmRsZXJSdW50aW1lVVJMKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzdGVwIDMgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG4gICAgICAgICAgc3R1YklkID0gZG9tYWluO1xuICAgICAgICAgIGRpc2NvdmVyU3R1YiA9IHRoaXMucmVnaXN0cnkuZGlzY292ZXJQcm90b3N0dWIoZG9tYWluKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElzIHJlZ2lzdGVkP1xuICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXTEuIFByb3RvIFN0dWIgRGlzY292ZXJlZCBmb3IgJywgcHJvdG9zdHViVVJMLCAnOiAnLCBkaXNjb3ZlclN0dWIpO1xuXG4gICAgICAgIC8vIHN0ZXAgMjMgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG4gICAgICAgIHJlc29sdmUoZGlzY292ZXJTdHViKTtcbiAgICAgICAgbG9nLmluZm8oJyBbUnVudGltZS5Mb2FkZXJdLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJyk7XG5cbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuXG4gICAgICAgIC8vIGlzIG5vdCByZWdpc3RlZD9cbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl0xLiBQcm90byBTdHViIG5vdCBmb3VuZCAnICsgcmVhc29uKTtcblxuICAgICAgICAvLyBzdGVwIDggaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcnMuZ2V0U3R1YkRlc2NyaXB0b3IocHJvdG9zdHViVVJMKVxuICAgICAgICAgIC50aGVuKChzdHViRGVzY3JpcHRvcikgPT4ge1xuXG4gICAgICAgICAgICBpZiAoaGF2ZUVycm9yKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXTIuIHJldHVybiB0aGUgUHJvdG9TdHViIGRlc2NyaXB0b3InKTtcblxuICAgICAgICAgICAgLy8gc3RlcCA5IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxuICAgICAgICAgICAgX3N0dWJEZXNjcmlwdG9yID0gc3R1YkRlc2NyaXB0b3I7XG5cbiAgICAgICAgICAgIGxldCBzb3VyY2VQYWNrYWdlVVJMID0gc3R1YkRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTDtcblxuICAgICAgICAgICAgaWYgKHNvdXJjZVBhY2thZ2VVUkwgPT09ICcvc291cmNlUGFja2FnZScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0dWJEZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHN0ZXAgMTAgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ydW50aW1lQ2F0YWxvZ3VlLmdldFNvdXJjZVBhY2thZ2VGcm9tVVJMKHNvdXJjZVBhY2thZ2VVUkwpO1xuICAgICAgICAgIH0sIGhhbmRsZUVycm9yKVxuICAgICAgICAgIC5jYXRjaChlcnJvclJlYXNvbilcbiAgICAgICAgICAudGhlbigoc3R1YlNvdXJjZVBhY2thZ2UpID0+IHtcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIGRlYnVnLCBpdCBzZWVtcyBSdW50aW1lQ2F0YWxvZ3VlIGRvZXMgbm90IHN1cHBvcnQgeWV0IGNvbnN0cmFpbnRzLiBJdCBhcHBlYXJzIGVtcHR5ISEhIVxuXG4gICAgICAgICAgICBpZiAoX3N0dWJEZXNjcmlwdG9yICYmIF9zdHViRGVzY3JpcHRvci5jb25zdHJhaW50cykge1xuICAgICAgICAgICAgICBzdHViQ2FwYWJpbGl0aWVzID0gX3N0dWJEZXNjcmlwdG9yLmNvbnN0cmFpbnRzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzdGVwIDExIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl0zLiByZXR1cm4gdGhlIFByb3RvU3R1YiBTb3VyY2UgQ29kZScpO1xuICAgICAgICAgICAgX3N0dWJTb3VyY2VQYWNrYWdlID0gc3R1YlNvdXJjZVBhY2thZ2U7XG5cbiAgICAgICAgICAgIC8vIHRoaXMgd2lsbCByZXR1cm4gdGhlIHNhbmRib3ggb3Igb25lIHByb21pc2UgdG8gZ2V0U2FuZGJveDtcbiAgICAgICAgICAgIC8vIHN0ZXAgMTIgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeS5nZXRTYW5kYm94KGRvbWFpbiwgc3R1YkNhcGFiaWxpdGllcyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoc3R1YlNhbmRib3gpID0+IHtcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gc3RlcCAxNSBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcbiAgICAgICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXIubG9hZFN0dWJdNC4gaWYgdGhlIHNhbmRib3ggaXMgcmVnaXN0ZXJlZCB0aGVuIHJldHVybiB0aGUgc2FuZGJveCAnLCBzdHViU2FuZGJveCk7XG5cbiAgICAgICAgICAgIF9zdHViU2FuZGJveCA9IHN0dWJTYW5kYm94O1xuICAgICAgICAgICAgcmV0dXJuIHN0dWJTYW5kYm94O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gc3RlcCAxMyBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcbiAgICAgICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXIubG9hZFN0dWJdNS4gU2FuZGJveCB3YXMgbm90IGZvdW5kLCBjcmVhdGluZyBhIG5ldyBvbmUgJywgcmVhc29uKTtcblxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHNhbmRib3ggaXMgcmVnaXN0ZWQgZm9yIHRoaXMgc3R1YiBkZXNjcmlwdG9yIHVybDtcblxuXG4gICAgICAgICAgICAvLyBzdGVwIDE0IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3J1bnRpbWVGYWN0b3J5LmNyZWF0ZVNhbmRib3goc3R1YkNhcGFiaWxpdGllcykudGhlbigoc2FuZGJveCkgPT4ge1xuICAgICAgICAgICAgICBzYW5kYm94LmFkZExpc3RlbmVyKCcqJywgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2cpO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICByZXR1cm4gc2FuZGJveDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoc2FuZGJveCkgPT4ge1xuICAgICAgICAgICAgaWYgKGhhdmVFcnJvcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBzdGVwIDE2IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl02LiByZXR1cm4gdGhlIHNhbmRib3ggaW5zdGFuY2UgYW5kIHJlZ2lzdGVyJywgc2FuZGJveCwgJ3RvIGRvbWFpbiAnLCBkb21haW4pO1xuXG4gICAgICAgICAgICBfc3R1YlNhbmRib3ggPSBzYW5kYm94O1xuXG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHJlZ2lzdGVyIHN0dWIgb24gcmVnaXN0cnkgLSBzdGVwIHh4eCBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlZ2lzdGVyU3R1Yihfc3R1YlNhbmRib3gsIHN0dWJJZCwgcDJwQ29uZmlnLCBwcm90b3N0dWJVUkwsIF9zdHViRGVzY3JpcHRvcik7XG4gICAgICAgICAgfSwgaGFuZGxlRXJyb3IpXG4gICAgICAgICAgLnRoZW4oKHJ1bnRpbWVQcm90b1N0dWIpID0+IHtcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gc3RlcCAyMyBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcbiAgICAgICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXIubG9hZFN0dWJdIDcuIHJldHVybiB0aGUgcnVudGltZSBwcm90b3N0dWIgdXJsOiAnLCBydW50aW1lUHJvdG9TdHViKTtcblxuICAgICAgICAgICAgX3J1bnRpbWVQcm90b1N0dWJVUkwgPSBydW50aW1lUHJvdG9TdHViLnVybDtcblxuICAgICAgICAgICAgLy8gRXh0ZW5kIG9yaWdpbmFsIGh5cGVydHkgY29uZmlndXJhdGlvbjtcbiAgICAgICAgICAgIGxldCBjb25maWd1cmF0aW9uID0ge307XG4gICAgICAgICAgICBpZiAoIWVtcHR5T2JqZWN0KF9zdHViRGVzY3JpcHRvci5jb25maWd1cmF0aW9uKSkge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBPYmplY3QuYXNzaWduKHt9LCBKU09OLnBhcnNlKF9zdHViRGVzY3JpcHRvci5jb25maWd1cmF0aW9uKSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gX3N0dWJEZXNjcmlwdG9yLmNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHAycENvbmZpZykge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBPYmplY3QuYXNzaWduKGNvbmZpZ3VyYXRpb24sIEpTT04ucGFyc2UocDJwQ29uZmlnKSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbihjb25maWd1cmF0aW9uLCBwMnBDb25maWcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHJlcXVpcmVkIGZvciBwcm90b3N0dWIgc2Vzc2lvblxuXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwgPSB0aGlzLl9ydW50aW1lVVJMO1xuXG4gICAgICAgICAgICAvLyBzdGVwIDI0IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8gc3RlcCAyNiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcbiAgICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl0gODogYWRkaW5nIHNhbmRib3ggbGlzdGVuZXIgdG8gcHJvdG9zdHViVVJMIDogJywgX3J1bnRpbWVQcm90b1N0dWJVUkwpO1xuXG4gICAgICAgICAgICAgIC8vIHN0ZXAgMjcgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG4gICAgICAgICAgICAgIC8vIEFkZCB0aGUgbWVzc2FnZSBidXMgbGlzdGVuZXJcbiAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF9ydW50aW1lUHJvdG9TdHViVVJMLCAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgX3N0dWJTYW5kYm94LnBvc3RNZXNzYWdlKG1zZyk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybiBfc3R1YlNhbmRib3guZGVwbG95Q29tcG9uZW50KF9zdHViU291cmNlUGFja2FnZS5zb3VyY2VDb2RlLCBfcnVudGltZVByb3RvU3R1YlVSTCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXSBFcnJvciBvbiBkZXBsb3kgY29tcG9uZW50OicsIGUpO1xuICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgaGFuZGxlRXJyb3IpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGhhdmVFcnJvcikgcmV0dXJuIGZhbHNlO1xuXG5cbiAgICAgICAgICAgIC8vIHN0ZXAgMjggaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG4gICAgICAgICAgICBsZXQgc3R1YjtcbiAgICAgICAgICAgIGlmIChwMnBDb25maWcpIHtcbiAgICAgICAgICAgICAgbG9nLmxvZygnW1J1bnRpbWUuTG9hZGVyLmxvYWRTdHViXSBwMnBDb25maWc6ICcsIHAycENvbmZpZyk7XG5cbiAgICAgICAgICAgICAgaWYgKHAycENvbmZpZy5oYXNPd25Qcm9wZXJ0eSgnaXNIYW5kbGVyU3R1YicpKSBzdHViID0gdGhpcy5yZWdpc3RyeS5wMnBIYW5kbGVyU3R1Ylt0aGlzLl9ydW50aW1lVVJMXTtcbiAgICAgICAgICAgICAgaWYgKHAycENvbmZpZy5oYXNPd25Qcm9wZXJ0eSgncDJwUmVxdWVzdGVyU3R1YicpKSBzdHViID0gdGhpcy5yZWdpc3RyeS5wMnBSZXF1ZXN0ZXJTdHViW3AycENvbmZpZy5yZW1vdGVSdW50aW1lVVJMXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0dWIgPSB0aGlzLnJlZ2lzdHJ5LnByb3Rvc3R1YnNMaXN0W2RvbWFpbl07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxvZy5sb2coJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl0gU3R1YjogJywgc3R1Yik7XG4gICAgICAgICAgICByZXNvbHZlKHN0dWIpO1xuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkU3R1Yl0tLS0tLS0tLS0tLS0tLS0tLS0tIEVORCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4nKTtcbiAgICAgICAgICB9LCBoYW5kbGVFcnJvcilcbiAgICAgICAgICAuY2F0Y2goZXJyb3JSZWFzb24pO1xuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICogRGVwbG95IGlkcFByb3h5IGZyb20gQ2F0YWxvZ3VlIFVSTCBvciBkb21haW4gdXJsXG4gICogQHBhcmFtICB7VVJMLlVSTH0gICAgIGRvbWFpbiAgICAgICAgICBkb21haW5cbiAgKi9cblxuICBsb2FkSWRwUHJveHkoaWRwUHJveHlVUkwpIHtcblxuICAgIGlmICghdGhpcy5fcmVhZHlUb1VzZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFpZHBQcm94eVVSTCkgdGhyb3cgbmV3IEVycm9yKCdbUnVudGltZS5Mb2FkZXJdIElkcFByb3h5IGRlc2NyaXB0b3IgdXJsIHBhcmFtZXRlciBpcyBuZWVkZWQnKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGxldCBkb21haW4gPSBkaXZpZGVVUkwoaWRwUHJveHlVUkwpLmRvbWFpbjtcblxuICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgZG9tYWluID0gaWRwUHJveHlVUkw7XG4gICAgICB9XG5cbiAgICAgIGxldCBfcHJveHlTYW5kYm94O1xuICAgICAgbGV0IF9wcm94eURlc2NyaXB0b3I7XG4gICAgICBsZXQgX3J1bnRpbWVJZHBQcm94eVVSTDtcbiAgICAgIGxldCBfcHJveHlTb3VyY2VQYWNrYWdlO1xuICAgICAgbGV0IGhhdmVFcnJvciA9IGZhbHNlO1xuXG4gICAgICBsZXQgZXJyb3JSZWFzb24gPSAocmVhc29uKSA9PiB7XG4gICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIFNvbWV0aGluZyBmYWlsZWQgb24gdGhlIGRlcGxveSBvZiBJZHBQcm94eTogJywgcmVhc29uKTtcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9O1xuXG4gICAgICBsZXQgaGFuZGxlRXJyb3IgPSAocmVhc29uKSA9PiB7XG4gICAgICAgIGhhdmVFcnJvciA9IHRydWU7XG4gICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgfTtcblxuICAgICAgLy8gRGlzY292ZXIgSURQUHJveHlcbiAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIC0tLS0tLS0tLS0tLS0tLS0tLS0gSURQIFByb3h5IERlcGxveSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4nKTtcbiAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIERpc2NvdmVyIG9yIENyZWF0ZSBhIG5ldyBJZHBQcm94eSBmb3IgZG9tYWluL1VSTDogJywgZG9tYWluKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHJ1bnRpbWVJZHBQcm94eVVSTCA9IHRoaXMucmVnaXN0cnkuZGlzY292ZXJJZHBQcm94eShkb21haW4pO1xuXG4gICAgICAgIC8vIElzIHJlZ2lzdGVkP1xuICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSAxLiBJRFBQcm94eSBEaXNjb3ZlcmVkOiAnLCBydW50aW1lSWRwUHJveHlVUkwpO1xuXG4gICAgICAgIC8vIHdlIGhhdmUgY29tcGxldGVkIHN0ZXAgMiBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcblxuICAgICAgICBsZXQgaWRwUHJveHkgPSB0aGlzLnJlZ2lzdHJ5LmlkcFByb3h5TGlzdFtkb21haW5dO1xuICAgICAgICBsb2cubG9nKCdEZXBsb3llZDogJywgaWRwUHJveHkpO1xuXG4gICAgICAgIHJlc29sdmUoaWRwUHJveHkpO1xuICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSAtLS0tLS0tLS0tLS0tLS0tLS0tIEVORCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4nKTtcbiAgICAgIH0gY2F0Y2ggKHJlYXNvbikge1xuXG4gICAgICAgIC8vIGlzIG5vdCByZWdpc3RlZD9cbiAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gMS4gSWRwUHJveHkgbm90IGZvdW5kOicsIHJlYXNvbik7XG5cbiAgICAgICAgLy8gd2UgaGF2ZSBjb21wbGV0ZWQgc3RlcCAzIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxuXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gZ2V0IFByb3RvU3R1YiBkZXNjcmlwdG9yIHN0ZXAgNCBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcbiAgICAgICAgdGhpcy5kZXNjcmlwdG9ycy5nZXRJZHBQcm94eURlc2NyaXB0b3IoaWRwUHJveHlVUkwpXG4gICAgICAgICAgLnRoZW4oKHByb3h5RGVzY3JpcHRvcikgPT4ge1xuXG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWUuTG9hZGVyXSAyLiBSZXR1cm4gdGhlIElEUFByb3h5IGRlc2NyaXB0b3InKTtcblxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBjb21wbGV0ZWQgc3RlcCA1IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxuICAgICAgICAgICAgX3Byb3h5RGVzY3JpcHRvciA9IHByb3h5RGVzY3JpcHRvcjtcblxuICAgICAgICAgICAgbGV0IHNvdXJjZVBhY2thZ2VVUkwgPSBwcm94eURlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTDtcblxuICAgICAgICAgICAgaWYgKHNvdXJjZVBhY2thZ2VVUkwgPT09ICcvc291cmNlUGFja2FnZScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHByb3h5RGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGdldCBQcm90b1N0dWIgU291cmNlIGNvZGUgZnJvbSBkZXNjcmlwdG9yIC0gc3RlcCA2IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVudGltZUNhdGFsb2d1ZS5nZXRTb3VyY2VQYWNrYWdlRnJvbVVSTChzb3VyY2VQYWNrYWdlVVJMKTtcbiAgICAgICAgICB9LCBoYW5kbGVFcnJvcilcbiAgICAgICAgICAudGhlbigoc291cmNlUGFja2FnZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGhhdmVFcnJvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gMy4gcmV0dXJuIHRoZSBJRFBQcm94eSBzb3VyY2UgcGFja2FnZScpO1xuXG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIDcgaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG5cbiAgICAgICAgICAgIF9wcm94eVNvdXJjZVBhY2thZ2UgPSBzb3VyY2VQYWNrYWdlO1xuXG4gICAgICAgICAgICAvLyBUT0RPOiBDaGVjayBvbiBQRVAgKHBvbGljeSBFbmdpbmUpIGlmIHdlIG5lZWQgdGhlIHNhbmRib3ggYW5kIGNoZWNrIGlmIHRoZSBTYW5kYm94IEZhY3RvcnkgaGF2ZSB0aGUgY29udGV4dCBzYW5kYm94O1xuICAgICAgICAgICAgbGV0IHBvbGljeSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gcG9saWN5O1xuICAgICAgICAgIH0sIGhhbmRsZUVycm9yKVxuICAgICAgICAgIC50aGVuKChwb2xpY3kpID0+IHtcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gdGhpcyB3aWxsIHJldHVybiB0aGUgc2FuZGJveCBvciBvbmUgcHJvbWlzZSB0byBnZXRTYW5kYm94O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnkuZ2V0U2FuZGJveChkb21haW4pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4oKHByb3h5U2FuZGJveCkgPT4ge1xuICAgICAgICAgICAgaWYgKGhhdmVFcnJvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gNC4gaWYgdGhlIHNhbmRib3ggaXMgcmVnaXN0ZXJlZCB0aGVuIHJldHVybiB0aGUgc2FuZGJveCcsIHByb3h5U2FuZGJveCk7XG5cbiAgICAgICAgICAgIF9wcm94eVNhbmRib3ggPSBwcm94eVNhbmRib3g7XG4gICAgICAgICAgICByZXR1cm4gcHJveHlTYW5kYm94O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIDUuIFNhbmRib3ggd2FzIG5vdCBmb3VuZCwgY3JlYXRpbmcgYSBuZXcgb25lJywgcmVhc29uKTtcblxuICAgICAgICAgICAgbGV0IHByb3h5Q2FwYWJpbGl0aWVzID0ge307XG4gICAgICAgICAgICBpZiAoX3Byb3h5RGVzY3JpcHRvciAmJiBfcHJveHlEZXNjcmlwdG9yLmhhc093blByb3BlcnR5KCdjYXBhYmlsaXRpZXMnKSkge1xuICAgICAgICAgICAgICBfcHJveHlEZXNjcmlwdG9yID0gX3Byb3h5RGVzY3JpcHRvci5zdHViQ2FwYWJpbGl0aWVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcnVudGltZUZhY3RvcnkuY3JlYXRlU2FuZGJveChwcm94eUNhcGFiaWxpdGllcykudGhlbigoc2FuZGJveCkgPT4ge1xuXG4gICAgICAgICAgICAgIHNhbmRib3guYWRkTGlzdGVuZXIoJyonLCAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZyk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybiBzYW5kYm94O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigoc2FuZGJveCkgPT4ge1xuICAgICAgICAgICAgaWYgKGhhdmVFcnJvcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlcl0gNi4gcmV0dXJuIHRoZSBzYW5kYm94IGluc3RhbmNlIGFuZCByZWdpc3RlcicsIHNhbmRib3gsICd0byBkb21haW4gJywgZG9tYWluKTtcblxuICAgICAgICAgICAgX3Byb3h5U2FuZGJveCA9IHNhbmRib3g7XG5cbiAgICAgICAgICAgIC8vIHdlIG5lZWQgcmVnaXN0ZXIgc3R1YiBvbiByZWdpc3RyeSAtIHN0ZXAgeHh4IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0cnkucmVnaXN0ZXJJZHBQcm94eShzYW5kYm94LCBkb21haW4pO1xuICAgICAgICAgIH0sIGhhbmRsZUVycm9yKVxuICAgICAgICAgIC50aGVuKChydW50aW1lSWRwUHJveHlVUkwpID0+IHtcbiAgICAgICAgICAgIGlmIChoYXZlRXJyb3IpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIDcuIFJldHVybiB0aGUgcnVudGltZSBJZHAgUHJveHkgVVJMOiAnLCBydW50aW1lSWRwUHJveHlVUkwpO1xuXG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGNvbXBsZXRlZCBzdGVwIHh4eCBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2NvcmUtZnJhbWV3b3JrL2Jsb2IvbWFzdGVyL2RvY3Mvc3BlY3MvcnVudGltZS9keW5hbWljLXZpZXcvYmFzaWNzL2RlcGxveS1wcm90b3N0dWIubWRcblxuICAgICAgICAgICAgX3J1bnRpbWVJZHBQcm94eVVSTCA9IHJ1bnRpbWVJZHBQcm94eVVSTDtcblxuICAgICAgICAgICAgLy8gRXh0ZW5kIG9yaWdpbmFsIGh5cGVydHkgY29uZmlndXJhdGlvbjtcbiAgICAgICAgICAgIGxldCBjb25maWd1cmF0aW9uID0ge307XG4gICAgICAgICAgICBpZiAoIWVtcHR5T2JqZWN0KF9wcm94eURlc2NyaXB0b3IuY29uZmlndXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uID0gT2JqZWN0LmFzc2lnbih7fSwgSlNPTi5wYXJzZShfcHJveHlEZXNjcmlwdG9yLmNvbmZpZ3VyYXRpb24pKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBfcHJveHlEZXNjcmlwdG9yLmNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTCA9IHRoaXMuX3J1bnRpbWVVUkw7XG5cbiAgICAgICAgICAgIC8vIERlcGxveSBDb21wb25lbnQgc3RlcCB4eHhcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIHdlIGhhdmUgY29tcGxldGVkIHN0ZXAgeHh4IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvY29yZS1mcmFtZXdvcmsvYmxvYi9tYXN0ZXIvZG9jcy9zcGVjcy9ydW50aW1lL2R5bmFtaWMtdmlldy9iYXNpY3MvZGVwbG95LXByb3Rvc3R1Yi5tZFxuXG4gICAgICAgICAgICAgIC8vIEFkZCB0aGUgbWVzc2FnZSBidXMgbGlzdGVuZXJcbiAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF9ydW50aW1lSWRwUHJveHlVUkwsIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICBfcHJveHlTYW5kYm94LnBvc3RNZXNzYWdlKG1zZyk7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIHJldHVybiBfcHJveHlTYW5kYm94LmRlcGxveUNvbXBvbmVudChfcHJveHlTb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUsIHJ1bnRpbWVJZHBQcm94eVVSTCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGxvZy5pbmZvKCdbUnVudGltZS5Mb2FkZXJdIEVycm9yIG9uIGRlcGxveSBjb21wb25lbnQ6JywgZSk7XG4gICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCBoYW5kbGVFcnJvcilcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaGF2ZUVycm9yKSByZXR1cm4gZmFsc2U7XG5cblxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBjb21wbGV0ZWQgc3RlcCB4eHggaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9jb3JlLWZyYW1ld29yay9ibG9iL21hc3Rlci9kb2NzL3NwZWNzL3J1bnRpbWUvZHluYW1pYy12aWV3L2Jhc2ljcy9kZXBsb3ktcHJvdG9zdHViLm1kXG5cbiAgICAgICAgICAgIC8vIExvYWQgU3R1YiBmdW5jdGlvbiByZXNvbHZlZCB3aXRoIHN1Y2Nlc3M7XG4gICAgICAgICAgICAvLyBsZXQgaWRwUHJveHkgPSB7XG4gICAgICAgICAgICAvLyAgIHJ1bnRpbWVJZHBQcm94eVVSTDogX3J1bnRpbWVJZHBQcm94eVVSTCxcbiAgICAgICAgICAgIC8vICAgc3RhdHVzOiBkZXBsb3lDb21wb25lbnRTdGF0dXNcbiAgICAgICAgICAgIC8vIH07XG5cbiAgICAgICAgICAgIC8vdGhpcy5yZWdpc3RyeS5pZHBQcm94eUxpc3RbZG9tYWluXS5zdGF0dXMgPSAnZGVwbG95ZWQnO1xuICAgICAgICAgICAgbGV0IGlkcFByb3h5ID0gdGhpcy5yZWdpc3RyeS5pZHBQcm94eUxpc3RbZG9tYWluXTtcblxuICAgICAgICAgICAgbG9nLmxvZygnW1J1bnRpbWUuTG9hZGVyLmxvYWRJZHBQcm94eV0gODogbG9hZGVkOiAnLCBpZHBQcm94eSk7XG5cbiAgICAgICAgICAgIHJlc29sdmUoaWRwUHJveHkpO1xuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lLkxvYWRlci5sb2FkSWRwUHJveHldIC0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxcbicpO1xuXG4gICAgICAgICAgfSwgaGFuZGxlRXJyb3IpXG4gICAgICAgICAgLmNhdGNoKGVycm9yUmVhc29uKTtcbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgdGhlIGxvYWRlciBpcyByZWFkeSB0byBsb2FkIGFsbCBjb21wb25lbnRzXG4gIF9yZWFkeVRvVXNlKCkge1xuXG4gICAgbGV0IHN0YXR1cyA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLl9ydW50aW1lVVJMKSB0aHJvdyBuZXcgRXJyb3IoJ1tSdW50aW1lLkxvYWRlcl0gVGhlIGxvYWRlciBuZWVkIHRoZSBydW50aW1lIHVybCBhZGRyZXNzJyk7XG4gICAgaWYgKCF0aGlzLl9tZXNzYWdlc0J1cykgdGhyb3cgbmV3IEVycm9yKCdbUnVudGltZS5Mb2FkZXJdIFRoZSBsb2FkZXIgbmVlZCB0aGUgbWVzc2FnZUJ1cyBjb21wb25lbnQnKTtcbiAgICBpZiAoIXRoaXMuX3JlZ2lzdHJ5KSB0aHJvdyBuZXcgRXJyb3IoJ1tSdW50aW1lLkxvYWRlcl0gVGhlIGxvYWRlciBuZWVkIHRoZSByZWdpc3RyeSBjb21wb25lbnQnKTtcbiAgICBpZiAoIXRoaXMuX3J1bnRpbWVGYWN0b3J5KSB0aHJvdyBuZXcgRXJyb3IoJ1tSdW50aW1lLkxvYWRlcl0gVGhlIGxvYWRlciBuZWVkIHRoZSBydW50aW1lIGZhY3RvcnkgY29tcG9uZW50Jyk7XG5cbiAgICBzdGF0dXMgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXM7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBMb2FkZXI7XG4iLCJpbXBvcnQgeyBydW50aW1lQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vcnVudGltZUNvbmZpZ3VyYXRpb24nO1xuXG5sZXQgc3RvcmFnZXMgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0b3JhZ2UocnVudGltZUZhY3RvcnksIHJ1bnRpbWVTdGF0dXNVcGRhdGUpIHtcbiAgaWYgKCFydW50aW1lRmFjdG9yeSkgdGhyb3cgbmV3IEVycm9yKCdUaGUgcnVudGltZSBmYWN0b3J5IGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xuXG4gIGNvbnNvbGUubG9nKCdbU3RvcmFnZS5zdG9yYWdlXSBzdG9yYWdlU2NoZW1hcyAnLCBydW50aW1lQ29uZmlndXJhdGlvbi5zdG9yYWdlU2NoZW1hcyk7XG5cbiAgT2JqZWN0LmtleXMocnVudGltZUNvbmZpZ3VyYXRpb24uc3RvcmFnZVNjaGVtYXMpLmZvckVhY2goKGtleSkgPT4ge1xuXG4gICAgaWYgKCFzdG9yYWdlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICBzdG9yYWdlc1trZXldID0gcnVudGltZUZhY3Rvcnkuc3RvcmFnZU1hbmFnZXIoa2V5LCBydW50aW1lQ29uZmlndXJhdGlvbi5zdG9yYWdlU2NoZW1hc1trZXldLCBydW50aW1lU3RhdHVzVXBkYXRlKTtcbiAgICB9XG5cbiAgfSk7XG5cbiAgcmV0dXJuIHN0b3JhZ2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3luY0RCKGtleSwgcnVudGltZUZhY3RvcnksIHNjaGVtYSwgcnVudGltZVN0YXR1c1VwZGF0ZSwgdXJsID0gZmFsc2UpIHtcbiAgaWYgKCFydW50aW1lRmFjdG9yeSkgdGhyb3cgbmV3IEVycm9yKCdUaGUgcnVudGltZSBmYWN0b3J5IGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xuXG4gIGxldCByZW1vdGUgPSB1cmwgPyB1cmwgOiBydW50aW1lQ29uZmlndXJhdGlvbi5yZW1vdGVTdG9yYWdlO1xuXG4gIHJldHVybiBydW50aW1lRmFjdG9yeS5zdG9yYWdlTWFuYWdlcihrZXksIHNjaGVtYSwgcnVudGltZVN0YXR1c1VwZGF0ZSwgcmVtb3RlKTtcblxufVxuIiwiaW1wb3J0IHtkaXZpZGVVUkwsIGdldENvbmZpZ3VyYXRpb25SZXNvdXJjZXMsIGJ1aWxkVVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgeyBydW50aW1lVXRpbHMgfSBmcm9tICcuL3J1bnRpbWVVdGlscyc7XG5cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignRGVzY3JpcHRvcnMnKTtcblxuY2xhc3MgRGVzY3JpcHRvcnMge1xuXG4gIGNvbnN0cnVjdG9yKHJ1bnRpbWVVUkwsIGNhdGFsb2d1ZSwgcnVudGltZUNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoIXJ1bnRpbWVVUkwpIHRocm93IEVycm9yKCdUaGUgZGVzY3JpcHRvciBuZWVkIHRvIGtub3cgdGhlIHJ1bnRpbWUgdXJsIHRvIGJlIHVzZWQnKTtcbiAgICBpZiAoIWNhdGFsb2d1ZSkgdGhyb3cgRXJyb3IoJ1RoZSBkZXNjcmlwdG9yIG5lZWRzIHRoZSBjYXRhbG9ndWUgaW5zdGFuY2UnKTtcbiAgICBpZiAoIXJ1bnRpbWVDb25maWd1cmF0aW9uKSB0aHJvdyBFcnJvcignVGhlIGRlc2NyaXB0b3IgbmVlZHMgdGhlIHJ1bnRpbWUgY29uZmlndXJhdGlvbicpO1xuXG4gICAgdGhpcy5sb2cgPSBsb2c7XG5cbiAgICB0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uID0gcnVudGltZUNvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5ydW50aW1lVVJMID0gcnVudGltZVVSTDtcbiAgICB0aGlzLmNhdGFsb2d1ZSA9IGNhdGFsb2d1ZTtcblxuICAgIHRoaXMuY29uc3RyYWludHMgPSBydW50aW1lVXRpbHMucnVudGltZUNhcGFiaWxpdGllcztcbiAgfVxuXG4gIGdldEh5cGVydHlEZXNjcmlwdG9yKGh5cGVydHlVUkwpIHtcbiAgICByZXR1cm4gdGhpcy5jYXRhbG9ndWUuZ2V0SHlwZXJ0eURlc2NyaXB0b3IoaHlwZXJ0eVVSTCwgdHJ1ZSwgdGhpcy5jb25zdHJhaW50cyk7XG4gIH1cblxuICBnZXRTdHViRGVzY3JpcHRvcihzdHViVVJMKSB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBsZXQgZG9tYWluO1xuICAgICAgbGV0IHByb3Rvc3R1YjtcbiAgICAgIGxldCBwcm90b1N0dWJVUkw7XG5cbiAgICAgIGxldCBvcmlnaW5EaXZpZGVkVVJMID0gZGl2aWRlVVJMKHRoaXMucnVudGltZVVSTCk7XG4gICAgICBsZXQgb3JpZ2luRG9tYWluID0gb3JpZ2luRGl2aWRlZFVSTC5kb21haW47XG5cbiAgICAgIGlmIChzdHViVVJMLmluY2x1ZGVzKCc6Ly8nKSkge1xuICAgICAgICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTChzdHViVVJMKTtcbiAgICAgICAgZG9tYWluID0gZGl2aWRlZFVSTC5kb21haW47XG4gICAgICAgIGxldCBwYXRoID0gZGl2aWRlZFVSTC5pZGVudGl0eTtcblxuICAgICAgICBpZiAocGF0aCkge1xuICAgICAgICAgIHByb3Rvc3R1YiA9IHBhdGguc3Vic3RyaW5nKHBhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3Rvc3R1YiA9ICdkZWZhdWx0JztcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm90b3N0dWIgPSAnZGVmYXVsdCc7XG4gICAgICAgIGRvbWFpbiA9IHN0dWJVUkw7XG4gICAgICB9XG5cbiAgICAgIHByb3RvU3R1YlVSTCA9IGJ1aWxkVVJMKHRoaXMucnVudGltZUNvbmZpZ3VyYXRpb24sICdjYXRhbG9ndWVVUkxzJywgJ3Byb3RvY29sc3R1YicsIHByb3Rvc3R1Yik7XG4gICAgICBpZiAoZG9tYWluICE9PSB0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uLmRvbWFpbikge1xuICAgICAgICBpZiAoIXN0dWJVUkwuaW5kZXhPZignaHR0cHMnKSB8fCAhc3R1YlVSTC5pbmRleE9mKCdoeXBlcnR5LWNhdGFsb2d1ZScpKSB7XG4gICAgICAgICAgcHJvdG9TdHViVVJMID0gc3R1YlVSTDtcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGhvdyB0byBsb2FkIGZvcm0gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gZG9tYWluXG4gICAgICAgICAgbGV0IHJlc291cmNlID0gZ2V0Q29uZmlndXJhdGlvblJlc291cmNlcyh0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uLCAnY2F0YWxvZ3VlVVJMcycsICdwcm90b2NvbHN0dWInKTtcbiAgICAgICAgICBwcm90b1N0dWJVUkwgPSByZXNvdXJjZS5wcmVmaXggKyBkb21haW4gKyByZXNvdXJjZS5zdWZmaXggKyBwcm90b3N0dWI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nLmxvZygnTG9hZCBQcm90b2NvbFN0dWIgZm9yIGRvbWFpbiwgJyArIGRvbWFpbiArICcgOiAnLCBwcm90b1N0dWJVUkwpO1xuICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ3VlLmdldFN0dWJEZXNjcmlwdG9yKHByb3RvU3R1YlVSTCwgdHJ1ZSwgdGhpcy5jb25zdHJhaW50cykudGhlbigocmVzdWx0KSA9PiB7XG5cbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuXG4gICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcblxuICAgICAgICAvLyBsb2cubG9nKCdFcnJvcjogJywgZXJyb3IpO1xuXG4gICAgICAgIHByb3Rvc3R1YiA9IGRvbWFpbjtcbiAgICAgICAgZG9tYWluID0gb3JpZ2luRG9tYWluO1xuXG4gICAgICAgIGxldCByZXNvdXJjZSA9IGdldENvbmZpZ3VyYXRpb25SZXNvdXJjZXModGhpcy5ydW50aW1lQ29uZmlndXJhdGlvbiwgJ2NhdGFsb2d1ZVVSTHMnLCAncHJvdG9jb2xzdHViJyk7XG4gICAgICAgIHByb3RvU3R1YlVSTCA9IHJlc291cmNlLnByZWZpeCArIGRvbWFpbiArIHJlc291cmNlLnN1ZmZpeCArIHByb3Rvc3R1YjtcblxuICAgICAgICAvLyBsb2cubG9nKCdGYWxsYmFjayAtPiBMb2FkIFByb3RvY29sc3R1YiBmb3IgZG9tYWluLCAnICsgZG9tYWluICsgJyA6ICcsIHByb3Rvc3R1Yik7XG4gICAgICAgIHJldHVybiB0aGlzLmNhdGFsb2d1ZS5nZXRTdHViRGVzY3JpcHRvcihwcm90b1N0dWJVUkwsIHRydWUsIHRoaXMuY29uc3RyYWludHMpO1xuICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcblxuICAgIH0pO1xuICB9XG5cbiAgZ2V0SWRwUHJveHlEZXNjcmlwdG9yKGlkcFByb3h5VVJMKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgbGV0IGRvbWFpbjtcbiAgICAgIGxldCBpZHBwcm94eTtcblxuICAgICAgbGV0IG9yaWdpbkRpdmlkZWRVUkwgPSBkaXZpZGVVUkwodGhpcy5ydW50aW1lVVJMKTtcbiAgICAgIGxldCBvcmlnaW5Eb21haW4gPSBvcmlnaW5EaXZpZGVkVVJMLmRvbWFpbjtcbiAgICAgIGxldCBjb25zdHJhaW50cyA9IHRoaXMuY29uc3RyYWludHM7XG5cbiAgICAgIGNvbnN0cmFpbnRzLmNvbnN0cmFpbnRzLm9ubHlBY2Nlc3NUb2tlbiA9IHRydWU7XG4gICAgICBjb25zdHJhaW50cy5jb25zdHJhaW50cy5vbmx5SWRBc3NlcnRpb25WYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUubG9nKCdMT0cgSEVSRScsIGNvbnN0cmFpbnRzKTtcbiAgICAgIGlmIChpZHBQcm94eVVSTC5pbmNsdWRlcygnOi8vJykpIHtcbiAgICAgICAgbGV0IGRpdmlkZWRVUkwgPSBkaXZpZGVVUkwoaWRwUHJveHlVUkwpO1xuICAgICAgICBkb21haW4gPSBkaXZpZGVkVVJMLmRvbWFpbjtcbiAgICAgICAgbGV0IHBhdGggPSBkaXZpZGVkVVJMLmlkZW50aXR5O1xuICAgICAgICBpZiAocGF0aCkge1xuICAgICAgICAgIGlkcHByb3h5ID0gcGF0aC5zdWJzdHJpbmcocGF0aC5sYXN0SW5kZXhPZignLycpICsgMSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWRwcHJveHkgPSAnZGVmYXVsdCc7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWRwcHJveHkgPSAnZGVmYXVsdCc7XG4gICAgICAgIGRvbWFpbiA9IGlkcFByb3h5VVJMO1xuICAgICAgfVxuXG5cbiAgICAgIGxldCByZXNvdXJjZSA9IGdldENvbmZpZ3VyYXRpb25SZXNvdXJjZXModGhpcy5ydW50aW1lQ29uZmlndXJhdGlvbiwgJ2NhdGFsb2d1ZVVSTHMnLCAnaWRwUHJveHknKTtcblxuICAgICAgaWRwUHJveHlVUkwgPSByZXNvdXJjZS5wcmVmaXggKyBkb21haW4gKyByZXNvdXJjZS5zdWZmaXggKyBpZHBwcm94eTtcbiAgICAgIC8vIGxvZy5sb2coJ0xvYWQgSWRwIFByb3h5IGZvciBkb21haW4sICcgKyBkb21haW4gKyAnIDogJywgaWRwUHJveHlVUkwpO1xuICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ3VlLmdldElkcFByb3h5RGVzY3JpcHRvcihpZHBQcm94eVVSTCwgdHJ1ZSwgY29uc3RyYWludHMpLnRoZW4oKHJlc3VsdCkgPT4ge1xuXG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcblxuICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuXG4gICAgICAgIGlkcHByb3h5ID0gZG9tYWluO1xuICAgICAgICBkb21haW4gPSBvcmlnaW5Eb21haW47XG5cbiAgICAgICAgaWRwUHJveHlVUkwgPSBidWlsZFVSTCh0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uLCAnY2F0YWxvZ3VlVVJMcycsICdpZHBQcm94eScsIGlkcHByb3h5KTtcblxuICAgICAgICAvLyBsb2cubG9nKCdMb2FkIElkcCBQcm94eSBmb3IgZG9tYWluLCAnICsgZG9tYWluICsgJyA6ICcsIGlkcFByb3h5VVJMKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ3VlLmdldElkcFByb3h5RGVzY3JpcHRvcihpZHBQcm94eVVSTCwgdHJ1ZSwgY29uc3RyYWludHMpO1xuICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcblxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERlc2NyaXB0b3JzO1xuIiwiLyoqXG4gKiAgQ2xhc3Mgd2hlcmUgbWVzc2FnZSBidXMgaGFuZGxlcnMgYXJlIGJ1aWx0LiBUbyBiZSB1c2VkIGJ5IHRoZSBSdW50aW1lVUEgdG8gaW5pdGlhbGlzZSB0aGUgcnVudGltZSBVQS5cbiAqL1xuXG4vL2ltcG9ydCB7IGxvZyBhcyBsb2dMZXZlbHMgfSBmcm9tICcuLi9sb2dMZXZlbHMnO1xuXG4vLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1J1bnRpbWVVQScpO1xuXG5jbGFzcyBNc2dCdXNIYW5kbGVycyB7XG5cbiAgY29uc3RydWN0b3IocGVwLCBpZG0sIGNyeXB0bykge1xuICAgIGlmICghcGVwKSB0aHJvdyBFcnJvcignW01zZ0J1c0hhbmRsZXJzXSBwZXAgaW5wdXQgcGFyYW1lbnRlciBpcyBtYW5kYXRvcnknKTtcbiAgICBpZiAoIWlkbSkgdGhyb3cgRXJyb3IoJ1tNc2dCdXNIYW5kbGVyc10gaWRtIGlucHV0IHBhcmFtZW50ZSBpcyBtYW5kYXRvcnknKTtcbiAgICBpZiAoIWNyeXB0bykgdGhyb3cgRXJyb3IoJ1tNc2dCdXNIYW5kbGVyc10gY3J5cHRvIGlucHV0IHBhcmFtZW50ZSBpcyBtYW5kYXRvcnknKTtcblxuICAgIHRoaXMucG9saWN5RW5naW5lID0gcGVwO1xuICAgIHRoaXMuaWRlbnRpdHlNYW5hZ2VyID0gaWRtO1xuICAgIHRoaXMuY3J5cHRvTWFuYWdlciA9IGNyeXB0bztcbiAgfVxuXG4gIC8vIFBvbGljeSBiYXNlZCBhY2Nlc3MgY29udHJvbCBmb3IgaW5jb21pbmcgbWVzc2FnZXNcblxuICBnZXQgcGVwSW5IYW5kbGVyKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gKGN0eCkgPT4ge1xuICAgICAgX3RoaXMucG9saWN5RW5naW5lLmF1dGhvcmlzZShjdHgubXNnLCB0cnVlKS50aGVuKChjaGFuZ2VkTWdzKSA9PiB7XG4gICAgICAgIGN0eC5tc2cgPSBjaGFuZ2VkTWdzO1xuICAgICAgICBjdHgubmV4dCgpO1xuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICBsb2cuZXJyb3IocmVhc29uKTtcbiAgICAgICAgY3R4LmZhaWwocmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgfVxuXG4gIC8vIFBvbGljeSBiYXNlZCBhY2Nlc3MgY29udHJvbCBmb3Igb3V0Z29pbmcgbWVzc2FnZXNcbiAgZ2V0IHBlcE91dEhhbmRsZXIoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gKGN0eCkgPT4ge1xuICAgICAgX3RoaXMucG9saWN5RW5naW5lLmF1dGhvcmlzZShjdHgubXNnLCBmYWxzZSkudGhlbigoY2hhbmdlZE1ncykgPT4ge1xuICAgICAgICBjdHgubXNnID0gY2hhbmdlZE1ncztcbiAgICAgICAgY3R4Lm5leHQoKTtcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgbG9nLmVycm9yKHJlYXNvbik7XG4gICAgICAgIGN0eC5mYWlsKHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgLy8gQWRkIElkZW50aXR5IGluZm8gdG8gbWVzc2FnZXNcbiAgZ2V0IGlkbUhhbmRsZXIoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gKGN0eCkgPT4ge1xuICAgICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyLnByb2Nlc3NNZXNzYWdlKGN0eC5tc2cpLnRoZW4oKGNoYW5nZWRNZ3MpID0+IHtcbiAgICAgICAgY3R4Lm1zZyA9IGNoYW5nZWRNZ3M7XG4gICAgICAgIGN0eC5uZXh0KCk7XG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgIGxvZy5lcnJvcihyZWFzb24pO1xuICAgICAgICBjdHguZmFpbChyZWFzb24pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIGVuY3J5cHQgbWVzc2FnZXNcblxuICBnZXQgZW5jcnlwdEhhbmRsZXIoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gKGN0eCkgPT4ge1xuICAgICAgX3RoaXMuY3J5cHRvTWFuYWdlci5lbmNyeXB0TWVzc2FnZShjdHgubXNnKS50aGVuKChjaGFuZ2VkTWdzKSA9PiB7XG4gICAgICAgIGN0eC5tc2cgPSBjaGFuZ2VkTWdzO1xuICAgICAgICBjdHgubmV4dCgpO1xuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICBsb2cuZXJyb3IocmVhc29uKTtcbiAgICAgICAgY3R4LmZhaWwocmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgfVxuXG4gIC8vIGRlY3J5cHQgbWVzc2FnZXNcblxuICBnZXQgZGVjcnlwdEhhbmRsZXIoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gKGN0eCkgPT4ge1xuICAgICAgX3RoaXMuY3J5cHRvTWFuYWdlci5kZWNyeXB0TWVzc2FnZShjdHgubXNnKS50aGVuKChjaGFuZ2VkTWdzKSA9PiB7XG4gICAgICAgIGN0eC5tc2cgPSBjaGFuZ2VkTWdzO1xuICAgICAgICBjdHgubmV4dCgpO1xuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICBsb2cud2FybihyZWFzb24pO1xuICAgICAgICBjdHguZmFpbChyZWFzb24pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTXNnQnVzSGFuZGxlcnM7XG4iLCIvKipcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cbipcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbipcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbipcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKiovXG5cbi8vIExvZyBTeXN0ZW1cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQ29yZURpc2NvdmVyeScpO1xuXG5cbmltcG9ydCB7ZGl2aWRlVVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbi8qKlxuKiBDb3JlIERpc2NvdmVyeSBpbnRlcmZhY2VcbiogQ2xhc3MgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIHNlYXJjaCBmb3IgaHlwZXJ0aWVzIGFuZCBEYXRhT2JqZWN0cyB1c2luZyB0aGUgbWVzc2FnZSBidXNcbiovXG5jbGFzcyBDb3JlRGlzY292ZXJ5IHtcblxuICAvKipcbiAgKiBUbyBpbml0aWFsaXNlIHRoZSBEaXNjb3ZlcnksIHdoaWNoIHdpbGwgcHJvdmlkZSB0aGUgc3VwcG9ydCBmb3IgaHlwZXJ0aWVzIHRvXG4gICogcXVlcnkgdXNlcnMgcmVnaXN0ZXJlZCBpbiBvdXRzaWRlIHRoZSBpbnRlcm5hbCBjb3JlLlxuICAqIEBwYXJhbSAge01lc3NhZ2VCdXN9ICAgICAgICAgIG1zZ2J1cyAgICAgICAgICAgICAgICBtc2didXNcbiAgKiBAcGFyYW0gIHtSdW50aW1lVVJMfSAgICAgICAgICBydW50aW1lVVJMICAgICAgICAgICAgcnVudGltZVVSTFxuICAqIEBwYXJhbSAge2dyYXBoQ29ubmVjdG9yfSAgICBncmFwaENvbm5lY3RvclxuICAqL1xuICBjb25zdHJ1Y3RvcihydW50aW1lVVJMLCBtc2dCdXMsIGdyYXBoQ29ubmVjdG9yLCBydW50aW1lRmFjdG9yeSwgcmVnaXN0cnkpIHtcbiAgICBpZiAoIXJ1bnRpbWVGYWN0b3J5KSB0aHJvdyBFcnJvcignVGhlIGNhdGFsb2d1ZSBuZWVkcyB0aGUgcnVudGltZUZhY3RvcnknKTtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgdGhpcy5fbWVzc2FnZUJ1cyA9IG1zZ0J1cztcbiAgICBfdGhpcy5ncmFwaENvbm5lY3RvciA9IGdyYXBoQ29ubmVjdG9yO1xuICAgIF90aGlzLmh0dHBSZXF1ZXN0ID0gcnVudGltZUZhY3RvcnkuY3JlYXRlSHR0cFJlcXVlc3QoKTtcbiAgICBfdGhpcy5kb21haW4gPSBkaXZpZGVVUkwocnVudGltZVVSTCkuZG9tYWluO1xuICAgIF90aGlzLmRpc2NvdmVyeVVSTCA9IHJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nO1xuICAgIF90aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG5cbiAgICBfdGhpcy5tZXNzYWdlQnVzLmFkZExpc3RlbmVyKF90aGlzLmRpc2NvdmVyeVVSTCwgKG1zZykgPT4ge1xuXG4gICAgICBfdGhpcy5kaXNjb3ZlcnlNYW5hZ2VyKG1zZykudGhlbihyZXN1bHQgPT57XG5cbiAgICAgICAgLy9GTE9XLU9VVDogbWVzc2FnZSByZXNwb25zZVxuICAgICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICAgICAgZnJvbTogbXNnLnRvLFxuICAgICAgICAgIHRvOiBtc2cuZnJvbSxcbiAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAgICB2YWx1ZTogcmVzdWx0XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICBsZXQgZGVzY3JpcHRpb247XG4gICAgICAgICAgbGV0IGNvZGU7XG5cbiAgICAgICAgICBpZiAoZXJyID09PSAnR3JhcGhDb25uZWN0b3InKSB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICdUaGlzIHNlYXJjaCBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSBtb21lbnQuIFRyeSBsYXRlci4nO1xuICAgICAgICAgICAgY29kZSA9IDUwMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAnTm90IEZvdW5kJztcbiAgICAgICAgICAgIGNvZGUgPSA0MDQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy9GTE9XLU9VVDogZXJyb3IgbWVzc2FnZSByZXNwb25zZVxuICAgICAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgaWQ6IG1zZy5pZCxcbiAgICAgICAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICAgICAgICBmcm9tOiBtc2cudG8sXG4gICAgICAgICAgICB0bzogbXNnLmZyb20sXG4gICAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICAgIGNvZGU6IGNvZGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBNZXNzYWdlQnVzLlxuICAgKi9cbiAgZ2V0IG1lc3NhZ2VCdXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VCdXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgTWVzc2FnZUJ1cy5cbiAgICogQHBhcmFtIHtNZXNzYWdlQnVzfSAgICAgICAgICAgbWVzc2FnZUJ1cyAgICBUaGUgTWVzc2FnZSBCdXMuXG4gICAqL1xuICBzZXQgbWVzc2FnZUJ1cyhtZXNzYWdlQnVzKSB7XG4gICAgdGhpcy5fbWVzc2FnZUJ1cyA9IG1lc3NhZ2VCdXM7XG4gIH1cblxuICAvKiBmdW5jdGlvbiB0byBkZWNpZGUgd2hhdCBkaXNjb3ZlcnkgbWV0aG9kIHRvIGNhbGwgYW5kIGxhdGVyIHJldHVybiB0aGUgcmVzcG9uc2UgbXNnICAqL1xuICBkaXNjb3ZlcnlNYW5hZ2VyKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGRvbWFpbiA9IGRpdmlkZVVSTChtc2cuZnJvbSkuZG9tYWluO1xuICAgIGxldCBhdHJpYnV0ZXMgPSBtc2cuYm9keS5yZXNvdXJjZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgcmVzb3VyY2VzID0gW107XG4gICAgbGV0IGRhdGFTY2hlbWVzID0gW107XG5cbiAgICBsb2cubG9nKCdbQ29yZURpc2NvdmVyeS5kaXNjb3ZlcnlNYW5hZ2VyXSByZWNlaXZlZDogJywgbXNnKTtcblxuICAgIGlmIChtc2cuYm9keS5jcml0ZXJpYSkge1xuICAgICAgaWYgKG1zZy5ib2R5LmNyaXRlcmlhLnJlc291cmNlcykgeyByZXNvdXJjZXMgPSBtc2cuYm9keS5jcml0ZXJpYS5yZXNvdXJjZXM7IH1cbiAgICAgIGlmIChtc2cuYm9keS5jcml0ZXJpYS5kYXRhU2NoZW1lcykgeyBkYXRhU2NoZW1lcyA9IG1zZy5ib2R5LmNyaXRlcmlhLmRhdGFTY2hlbWVzOyB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChhdHJpYnV0ZXNbMV0pIHtcbiAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICBpZiAoYXRyaWJ1dGVzWzBdID09ICdoeXBlcnR5JykgeyByZXR1cm4gX3RoaXMuZGlzY292ZXJIeXBlcnRpZXMobXNnLmJvZHkucmVzb3VyY2Uuc3BsaXQoJ3VzZXIvJylbMV0sIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIG1zZy5ib2R5LmNyaXRlcmlhLmRvbWFpbik7IH0gZWxzZSB7IHJldHVybiBfdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RzKG1zZy5ib2R5LnJlc291cmNlLnNwbGl0KCd1c2VyLycpWzFdLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzLCBtc2cuYm9keS5jcml0ZXJpYS5kb21haW4pOyB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd1cmwnOlxuICAgICAgICBpZiAoYXRyaWJ1dGVzWzBdID09ICdoeXBlcnR5JykgeyByZXR1cm4gX3RoaXMuZGlzY292ZXJIeXBlcnR5UGVyVVJMKG1zZy5ib2R5LnJlc291cmNlLnNwbGl0KCd1cmwvJylbMV0sIG1zZy5ib2R5LmNyaXRlcmlhLmRvbWFpbik7IH0gZWxzZSB7IHJldHVybiBfdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RQZXJVUkwobXNnLmJvZHkucmVzb3VyY2Uuc3BsaXQoJ3VybC8nKVsxXSwgbXNnLmJvZHkuY3JpdGVyaWEuZG9tYWluKTsgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICByZXR1cm4gX3RoaXMuZGlzY292ZXJEYXRhT2JqZWN0c1Blck5hbWUobXNnLmJvZHkucmVzb3VyY2Uuc3BsaXQoJ25hbWUvJylbMV0sIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIG1zZy5ib2R5LmNyaXRlcmlhLmRvbWFpbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVwb3J0ZXInOlxuICAgICAgICByZXR1cm4gX3RoaXMuZGlzY292ZXJEYXRhT2JqZWN0c1BlclJlcG9ydGVyKG1zZy5ib2R5LnJlc291cmNlLnNwbGl0KCdyZXBvcnRlci8nKVsxXSwgZGF0YVNjaGVtZXMsIHJlc291cmNlcywgbXNnLmJvZHkuY3JpdGVyaWEuZG9tYWluKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdndWlkJzpcbiAgICAgICAgaWYgKHR5cGVvZiBfdGhpcy5ncmFwaENvbm5lY3RvciAhPT0gJ3VuZGVmaW5lZCcgJiYgIF90aGlzLmdyYXBoQ29ubmVjdG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGF0cmlidXRlc1swXSA9PSAnaHlwZXJ0eScpIHsgcmV0dXJuIF90aGlzLmRpc2NvdmVySHlwZXJ0aWVzUGVyR1VJRChtc2cuYm9keS5yZXNvdXJjZS5zcGxpdCgndXNlci1ndWlkOi8vJylbMV0sIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMpOyB9IGVsc2UgeyByZXR1cm4gX3RoaXMuZGlzY292ZXJEYXRhT2JqZWN0c1BlckdVSUQobXNnLmJvZHkucmVzb3VyY2Uuc3BsaXQoJ3VzZXItZ3VpZDovLycpWzFdLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKTsgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnR3JhcGhDb25uZWN0b3InKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY2FzZSAndXNlcnByb2ZpbGUnOlxuICAgICAgICBpZiAodHlwZW9mIF90aGlzLmdyYXBoQ29ubmVjdG9yICE9PSAndW5kZWZpbmVkJyAmJiAgX3RoaXMuZ3JhcGhDb25uZWN0b3IgIT09IG51bGwpIHtcbiAgICAgICAgICBpZiAoYXRyaWJ1dGVzWzBdID09ICdoeXBlcnR5JykgeyByZXR1cm4gX3RoaXMuZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGEobXNnLmJvZHkucmVzb3VyY2Uuc3BsaXQoJ3VzZXJwcm9maWxlLycpWzFdLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKTsgfSBlbHNlIHsgcmV0dXJuIF90aGlzLmRpc2NvdmVyRGF0YU9iamVjdHNQZXJVc2VyUHJvZmlsZURhdGEobXNnLmJvZHkucmVzb3VyY2Uuc3BsaXQoJ3VzZXJwcm9maWxlLycpWzFdLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKTsgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnR3JhcGhDb25uZWN0b3InKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIHVzZXIgaWRlbnRpZmllciAoZWcgZW1haWwsIG5hbWUgLi4uKVxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXJJZGVudGlmaWVyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgZGF0YVNjaGVtZXMgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqL1xuICBkaXNjb3Zlckh5cGVydGllc1BlclVzZXJQcm9maWxlRGF0YSh1c2VySWRlbnRpZmllciwgZGF0YVNjaGVtZXMsIHJlc291cmNlcykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIC8vdHJhbnNsYXRlIHVzZXIgaWRlbnRpZmllciAoZS5nLiBlbWFpbCwgbmFtZS4uLikgaW50byB0aGUgYXNzb2NpYXRlZCBHVUlEc1xuICAgICAgX3RoaXMuZGlzY292ZXJHVUlEUGVyVXNlcklkZW50aWZpZXIodXNlcklkZW50aWZpZXIpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGd1aWRzKSB7XG5cbiAgICAgICAgICBsZXQgaHlwZXJ0aWVzUHJvbWlzZXMgPSBndWlkcy5tYXAoZnVuY3Rpb24oZ3VpZCkge1xuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgIF90aGlzLmRpc2NvdmVySHlwZXJ0aWVzUGVyR1VJRChndWlkLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGh5cGVydGllcykge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShoeXBlcnRpZXMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIFByb21pc2UuYWxsKGh5cGVydGllc1Byb21pc2VzKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oaHlwZXJ0aWVzUmVzdWx0KSB7XG5cbiAgICAgICAgICAgICAgbGV0IGh5cGVydGllcyA9IFtdLmNvbmNhdC5hcHBseShbXSwgaHlwZXJ0aWVzUmVzdWx0KTtcblxuICAgICAgICAgICAgICBpZiAoaHlwZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoJ05vIGh5cGVydGllcyB3ZXJlIGZvdW5kJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXNvbHZlKGh5cGVydGllcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBBZHZhbmNlZCBTZWFyY2ggZm9yIERhdGFPYmplY3RzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIHVzZXIgaWRlbnRpZmllciAoZWcgZW1haWwsIG5hbWUgLi4uKVxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXJJZGVudGlmaWVyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgZGF0YVNjaGVtZXMgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqL1xuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyVXNlclByb2ZpbGVEYXRhKHVzZXJJZGVudGlmaWVyLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgLy90cmFuc2xhdGUgdXNlciBpZGVudGlmaWVyIChlLmcuIGVtYWlsLCBuYW1lLi4uKSBpbnRvIHRoZSBhc3NvY2lhdGVkIEdVSURzXG4gICAgICBfdGhpcy5kaXNjb3ZlckdVSURQZXJVc2VySWRlbnRpZmllcih1c2VySWRlbnRpZmllcilcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24oZ3VpZHMpIHtcblxuICAgICAgICAgIGxldCBkYXRhT2JqZWN0c1Byb21pc2VzID0gZ3VpZHMubWFwKGZ1bmN0aW9uKGd1aWQpIHtcblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICBfdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RzUGVyR1VJRChndWlkLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RzKSB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGFPYmplY3RzKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBQcm9taXNlLmFsbChkYXRhT2JqZWN0c1Byb21pc2VzKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdHNSZXN1bHQpIHtcblxuICAgICAgICAgICAgICBsZXQgZGF0YU9iamVjdHMgPSBbXS5jb25jYXQuYXBwbHkoW10sIGRhdGFPYmplY3RzUmVzdWx0KTtcblxuICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdCgnTm8gZGF0YU9iamVjdHMgd2VyZSBmb3VuZCcpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhT2JqZWN0cyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBBZHZhbmNlZCBTZWFyY2ggZm9yIEh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggc29tZSBHVUlEXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICBndWlkXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgZGF0YVNjaGVtZXMgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xuICAqL1xuICBkaXNjb3Zlckh5cGVydGllc1BlckdVSUQoZ3VpZCwgZGF0YVNjaGVtZXMsIHJlc291cmNlcykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIC8vdHJhbnNsYXRlIEdVSUQgaW50byB0aGUgdXNlciBJRHMgdG8gcXVlcnkgdGhlIGRvbWFpbiByZWdpc3RyeVxuICAgICAgX3RoaXMuZGlzY292ZXJVc2VySWRzUGVyR1VJRChndWlkKVxuICAgICAgICAudGhlbihmdW5jdGlvbih1aWRzKSB7XG5cbiAgICAgICAgLy90cmFuc2xhdGUgdXNlciBJRHMgaW50byB0aGUgYXNzb2NpYXRlZCBoeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBzb21lIGRvbWFpblxuICAgICAgICAgIGxldCBoeXBlcnRpZXNQcm9taXNlcyA9IHVpZHMubWFwKGZ1bmN0aW9uKHVpZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICBfdGhpcy5kaXNjb3Zlckh5cGVydGllcyh1aWQudUlELCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzLCB1aWQuZG9tYWluKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGh5cGVydGllcykge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShoeXBlcnRpZXMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIFByb21pc2UuYWxsKGh5cGVydGllc1Byb21pc2VzKVxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oaHlwZXJ0aWVzUmVzdWx0KSB7XG5cbiAgICAgICAgICAgICAgbGV0IGh5cGVydGllcyA9IFtdLmNvbmNhdC5hcHBseShbXSwgaHlwZXJ0aWVzUmVzdWx0KTtcblxuICAgICAgICAgICAgICBpZiAoaHlwZXJ0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoJ05vIGh5cGVydGllcyB3ZXJlIGZvdW5kJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBsb2cubG9nKCdIeXBlcnRpZXMgOiAnLCBoeXBlcnRpZXMpO1xuICAgICAgICAgICAgICByZXNvbHZlKGh5cGVydGllcyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgRGF0YU9iamVjdHMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgR1VJRFxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgZ3VpZFxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIGRhdGFTY2hlbWVzIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcbiAgKi9cbiAgZGlzY292ZXJEYXRhT2JqZWN0c1BlckdVSUQoZ3VpZCwgZGF0YVNjaGVtZXMsIHJlc291cmNlcykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIC8vdHJhbnNsYXRlIEdVSUQgaW50byB0aGUgdXNlciBJRHMgdG8gcXVlcnkgdGhlIGRvbWFpbiByZWdpc3RyeVxuICAgICAgX3RoaXMuZGlzY292ZXJVc2VySWRzUGVyR1VJRChndWlkKVxuICAgICAgICAudGhlbihmdW5jdGlvbih1aWRzKSB7XG5cbiAgICAgICAgLy90cmFuc2xhdGUgdXNlciBJRHMgaW50byB0aGUgYXNzb2NpYXRlZCBkYXRhT2JqZWN0cyByZWdpc3RlcmVkIGluIHNvbWUgZG9tYWluXG4gICAgICAgICAgbGV0IGRhdGFPYmplY3RQcm9taXNlcyA9IHVpZHMubWFwKGZ1bmN0aW9uKHVpZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICBfdGhpcy5kaXNjb3ZlckRhdGFPYmplY3RzKHVpZC51SUQsIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIHVpZC5kb21haW4pXG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdHMpIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YU9iamVjdHMpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIFByb21pc2UuYWxsKGRhdGFPYmplY3RQcm9taXNlcylcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RzUmVzdWx0KSB7XG5cbiAgICAgICAgICAgICAgbGV0IGRhdGFPYmplY3RzID0gW10uY29uY2F0LmFwcGx5KFtdLCBkYXRhT2JqZWN0c1Jlc3VsdCk7XG5cbiAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoJ05vIGRhdGFPYmplY3RzIHdlcmUgZm91bmQnKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIGxvZy5sb2coJ0RhdGFPYmplY3RzIDogJywgZGF0YU9iamVjdHMpO1xuICAgICAgICAgICAgICByZXNvbHZlKGRhdGFPYmplY3RzKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFuZCBhc3NvY2lhdGVkIHdpdGggc29tZSB1c2VyIElEXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlciAgICAgICAgICAgICAgICAgIHVzZXIgaWRlbnRpZmllciwgZWl0aGVyIGluIHVybCBvciBlbWFpbCBmb3JtYXRcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBkYXRhU2NoZW1lcyAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXG4gICovXG4gIGRpc2NvdmVySHlwZXJ0aWVzKHVzZXIsIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIGRvbWFpbikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcblxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcblxuICAgIGxldCBtc2cgPSB7XG4gICAgICB0eXBlOiAncmVhZCcsXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXG4gICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBhY3RpdmVEb21haW4sXG4gICAgICBib2R5OiB7XG5cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHVzZXIuaW5kZXhPZigndXNlcjovLycpID4gLTEpIHsgbXNnLmJvZHkucmVzb3VyY2UgPSB1c2VyOyB9IGVsc2UgeyBtc2cuYm9keS5yZXNvdXJjZSA9ICcvaHlwZXJ0eS9pZHAtaWRlbnRpZmllci8nICsgdXNlcjsgfVxuXG4gICAgaWYgKGRhdGFTY2hlbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghbXNnLmJvZHkuY3JpdGVyaWEpIHsgbXNnLmJvZHkuY3JpdGVyaWEgPSB7fTsgfVxuICAgICAgbXNnLmJvZHkuY3JpdGVyaWEuZGF0YVNjaGVtZXMgPSBkYXRhU2NoZW1lcztcbiAgICB9XG5cbiAgICBpZiAocmVzb3VyY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghbXNnLmJvZHkuY3JpdGVyaWEpIHsgbXNnLmJvZHkuY3JpdGVyaWEgPSB7fTsgfVxuICAgICAgbXNnLmJvZHkuY3JpdGVyaWEucmVzb3VyY2VzID0gcmVzb3VyY2VzO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIC8vIGxvZy5sb2coXCJbQ29yZURpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllc10gc2VuZGluZyBtc2cgXCIsIG1zZyk7XG5cbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcblxuICAgICAgICAvLyBsb2cubG9nKFwiW0NvcmVEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNdIHJjdmVkIHJlcGx5IFwiLCByZXBseSk7XG5cbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwIHx8IHJlcGx5LmJvZHkuY29kZSA9PT0gNTAwKSB7XG4gICAgICAgICAgbGV0IGh5cGVydGllcyA9IHJlcGx5LmJvZHkudmFsdWU7XG5cbiAgICAgICAgICBsZXQgZmluYWxIeXBlcnRpZXMgPSBbXTtcbiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gaHlwZXJ0aWVzKSBmaW5hbEh5cGVydGllcy5wdXNoKGh5cGVydGllc1trZXldKTtcblxuICAgICAgICAgIGlmIChmaW5hbEh5cGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBsb2cubG9nKFwiW0NvcmVEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNdIEh5cGVydGllcyBGb3VuZDogXCIsIGZpbmFsSHlwZXJ0aWVzKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmluYWxIeXBlcnRpZXMpO1xuICAgICAgICAgIH0gZWxzZSB7IHJldHVybiByZWplY3QoJ05vIEh5cGVydHkgd2FzIGZvdW5kJyk7IH1cbiAgICAgICAgfSBlbHNlIHsgcmV0dXJuIHJlamVjdCgnTm8gSHlwZXJ0eSB3YXMgZm91bmQnKTsgfVxuXG4gICAgICAgIC8qX3RoaXMucmVnaXN0cnkuaXNMZWdhY3kodXNlcikudGhlbigobGVnYWN5KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChsZWdhY3kpIHJlc29sdmUoW3toeXBlcnR5SUQ6IHVzZXIgfV0pXG4gICAgICAgICAgICAgIGVsc2UgcmV0dXJuIHJlamVjdCgnTm8gSHlwZXJ0eSB3YXMgZm91bmQnKTtcbiAgICAgICAgICB9KTsqL1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQWR2YW5jZWQgU2VhcmNoIGZvciBEYXRhT2JqZWN0cyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSBhbmQgYXNzb2NpYXRlZCB3aXRoIHNvbWUgdXNlciBJRFxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXIgICAgICAgICAgICAgICAgICB1c2VyIGlkZW50aWZpZXIsIGVpdGhlciBpbiB1cmwgb3IgZW1haWwgZm9ybWF0XG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgZGF0YVNjaGVtZXMgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdHMgc2NoZW1hc1xuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBkYXRhT2JqZWN0cyByZXNvdXJjZXNcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKSAgICAgZG9tYWluIG9mIHRoZSByZWdpc3RyeSB0byBzZWFyY2hcbiAgKi9cbiAgZGlzY292ZXJEYXRhT2JqZWN0cyh1c2VyLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzLCBkb21haW4pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBhY3RpdmVEb21haW47XG4gICAgbGV0IGRhdGFPYmplY3RzQXJyYXkgPSBbXTtcblxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgLy90cmFuc2xhdGUgdXNlciBpZGVudGlmaWVyIChlLmcuIGVtYWlsLCBuYW1lLi4uKSBpbnRvIHRoZSBhc3NvY2lhdGVkIGh5cGVydGllc1xuICAgICAgX3RoaXMuZGlzY292ZXJIeXBlcnRpZXModXNlciwgW10sIFtdLCBhY3RpdmVEb21haW4pXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGh5cGVydGllcykge1xuXG4gICAgICAgICAgbGV0IGZpbmFsSHlwZXJ0aWVzID0gW107XG4gICAgICAgICAgZm9yICh2YXIga2V5IGluIGh5cGVydGllcykgZmluYWxIeXBlcnRpZXMucHVzaChoeXBlcnRpZXNba2V5XSk7XG5cbiAgICAgICAgICAvL3RyYW5zbGF0ZSBoeXBlcnRpZXMgVVJMcyBpbnRvIHRoZSBhc3NvY2lhdGVkIGRhdGFPYmplY3RzIHJlZ2lzdGVyZWQgaW4gc29tZSBkb21haW5cbiAgICAgICAgICBsZXQgZGF0YU9iamVjdHNQcm9taXNlcyA9IGZpbmFsSHlwZXJ0aWVzLm1hcChmdW5jdGlvbihoeXBlcnR5KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICAgIF90aGlzLmRpc2NvdmVyRGF0YU9iamVjdHNQZXJSZXBvcnRlcihoeXBlcnR5Lmh5cGVydHlJRCwgZGF0YVNjaGVtZXMsIHJlc291cmNlcywgYWN0aXZlRG9tYWluKVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YU9iamVjdCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgUHJvbWlzZS5hbGwoZGF0YU9iamVjdHNQcm9taXNlcylcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RzUmVzdWx0KSB7XG5cbiAgICAgICAgICAgICAgbGV0IGRhdGFPYmplY3RzID0gW10uY29uY2F0LmFwcGx5KFtdLCBkYXRhT2JqZWN0c1Jlc3VsdCk7XG5cbiAgICAgICAgICAgICAgZGF0YU9iamVjdHMuZm9yRWFjaChmdW5jdGlvbihkYXRhT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdHNBcnJheS5wdXNoKGRhdGFPYmplY3QpO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBsZXQgZmluYWxEYXRhT2JqZWN0cyA9IFtdO1xuICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YU9iamVjdHNBcnJheSkgZmluYWxEYXRhT2JqZWN0cy5wdXNoKGRhdGFPYmplY3RzQXJyYXlba2V5XSk7XG5cbiAgICAgICAgICAgICAgaWYgKGZpbmFsRGF0YU9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdCgnTm8gZGF0YU9iamVjdHMgd2VyZSBmb3VuZCcpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gbG9nLmxvZygnRGF0YU9iamVjdHMgRm91bmQ6ICcsIGZpbmFsRGF0YU9iamVjdHMpO1xuICAgICAgICAgICAgICByZXNvbHZlKGZpbmFsRGF0YU9iamVjdHMpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IGh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXG4gICogcmV0dXJuIHRoZSBoeXBlcnR5IGluZm9ybWF0aW9uLCBpZiBmb3VuZC5cbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICB1cmwgIGRhdGFPYmplY3QgVVJMXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXG4gICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgICAgUHJvbWlzZVxuICAqL1xuICBkaXNjb3Zlckh5cGVydHlQZXJVUkwodXJsLCBkb21haW4pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBhY3RpdmVEb21haW47XG5cbiAgICBhY3RpdmVEb21haW4gPSAoIWRvbWFpbikgPyBfdGhpcy5kb21haW4gOiBkb21haW47XG5cbiAgICBsZXQgbXNnID0ge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxuICAgICAgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgYWN0aXZlRG9tYWluLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogdXJsXG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgIT09IDIwMCAmJiByZXBseS5ib2R5LmNvZGUgIT09IDUwMCkgeyByZXR1cm4gcmVqZWN0KCdObyBIeXBlcnR5IHdhcyBmb3VuZCcpOyB9XG5cbiAgICAgICAgbGV0IGh5cGVydHkgPSByZXBseS5ib2R5LnZhbHVlO1xuXG4gICAgICAgIGlmIChoeXBlcnR5KSB7XG4gICAgICAgICAgLy8gbG9nLmxvZygnSHlwZXJ0eSBmb3VuZDogJywgaHlwZXJ0eSk7XG4gICAgICAgICAgcmVzb2x2ZShoeXBlcnR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KCdObyBIeXBlcnR5IHdhcyBmb3VuZCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXG4gICogcmV0dXJuIHRoZSBkYXRhT2JqZWN0IGluZm9ybWF0aW9uLCBpZiBmb3VuZC5cbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICB1cmwgIGRhdGFPYmplY3QgVVJMXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXG4gICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgICAgUHJvbWlzZVxuICAqL1xuICBkaXNjb3ZlckRhdGFPYmplY3RQZXJVUkwodXJsLCBkb21haW4pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBhY3RpdmVEb21haW47XG5cbiAgICBhY3RpdmVEb21haW4gPSAoIWRvbWFpbikgPyBfdGhpcy5kb21haW4gOiBkb21haW47XG5cbiAgICBsZXQgbXNnID0ge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxuICAgICAgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgYWN0aXZlRG9tYWluLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogdXJsXG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xuXG4gICAgICAgIGxldCBkYXRhT2JqZWN0ID0gcmVwbHkuYm9keS52YWx1ZTtcblxuICAgICAgICBpZiAoZGF0YU9iamVjdCkge1xuICAgICAgICAgIC8vIGxvZy5sb2coJ0RhdGFPYmplY3QgZm91bmQ6ICcsIGRhdGFPYmplY3QpO1xuICAgICAgICAgIHJlc29sdmUoZGF0YU9iamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdCgnRGF0YU9iamVjdCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQWR2YW5jZWQgU2VhcmNoIGZvciBkYXRhT2JqZWN0cyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeVxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgICBuYW1lIG9mIHRoZSBkYXRhT2JqZWN0XG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgZGF0YVNjaGVtZXMgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdCBzY2hlbWFzXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3QgcmVzb3VyY2VzXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXG4gICovXG4gIGRpc2NvdmVyRGF0YU9iamVjdHNQZXJOYW1lKG5hbWUsIGRhdGFTY2hlbWVzLCByZXNvdXJjZXMsIGRvbWFpbikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcblxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcblxuICAgIGxldCBtc2cgPSB7XG4gICAgICB0eXBlOiAncmVhZCcsXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXG4gICAgICB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBhY3RpdmVEb21haW4sXG4gICAgICBib2R5OiB7XG4gICAgICAgIHJlc291cmNlOiBuYW1lXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChkYXRhU2NoZW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIW1zZy5ib2R5LmNyaXRlcmlhKSB7IG1zZy5ib2R5LmNyaXRlcmlhID0ge307IH1cbiAgICAgIG1zZy5ib2R5LmNyaXRlcmlhLmRhdGFTY2hlbWVzID0gZGF0YVNjaGVtZXM7XG4gICAgfVxuXG4gICAgaWYgKHJlc291cmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAoIW1zZy5ib2R5LmNyaXRlcmlhKSB7IG1zZy5ib2R5LmNyaXRlcmlhID0ge307IH1cbiAgICAgIG1zZy5ib2R5LmNyaXRlcmlhLnJlc291cmNlcyA9IHJlc291cmNlcztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcblxuICAgICAgICBsZXQgZGF0YU9iamVjdHMgPSByZXBseS5ib2R5LnZhbHVlO1xuXG4gICAgICAgIGxldCBmaW5hbERhdGFPYmplY3RzID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhT2JqZWN0cykgZmluYWxEYXRhT2JqZWN0cy5wdXNoKGRhdGFPYmplY3RzW2tleV0pO1xuXG4gICAgICAgIGlmIChmaW5hbERhdGFPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBsb2cubG9nKFwiRGF0YU9iamVjdHMgRm91bmQ6IFwiLCBmaW5hbERhdGFPYmplY3RzKTtcbiAgICAgICAgICByZXNvbHZlKGZpbmFsRGF0YU9iamVjdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZWplY3QoJ05vIERhdGFPYmplY3Qgd2FzIGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBzcGVjaWZpYyByZXBvcnRlciBkYXRhT2JqZWN0IHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcbiAgKiByZXR1cm4gdGhlIGRhdGFPYmplY3RzIGZyb20gdGhhdCByZXBvcnRlci5cbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICByZXBvcnRlciAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0IHJlcG9ydGVyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NkYXRhU2NoZW1lc2hlbWEgICAgICAgICAgICAgICAgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdHMgc2NoZW1hc1xuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAgICAgICAgICAgICAgICAgICAgICAgIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHJlc291cmNlc1xuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChPcHRpb25hbClcbiAgKi9cbiAgZGlzY292ZXJEYXRhT2JqZWN0c1BlclJlcG9ydGVyKHJlcG9ydGVyLCBkYXRhU2NoZW1lcywgcmVzb3VyY2VzLCBkb21haW4pIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBhY3RpdmVEb21haW47XG5cbiAgICBhY3RpdmVEb21haW4gPSAoIWRvbWFpbikgPyBfdGhpcy5kb21haW4gOiBkb21haW47XG5cbiAgICBsZXQgbXNnID0ge1xuICAgICAgdHlwZTogJ3JlYWQnLFxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxuICAgICAgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgYWN0aXZlRG9tYWluLFxuICAgICAgYm9keToge1xuICAgICAgICByZXNvdXJjZTogJy9jb21tJyxcbiAgICAgICAgY3JpdGVyaWE6IHtcbiAgICAgICAgICByZXBvcnRlcjogcmVwb3J0ZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoZGF0YVNjaGVtZXMubGVuZ3RoID4gMCkgeyBtc2cuYm9keS5jcml0ZXJpYS5kYXRhU2NoZW1lcyA9IGRhdGFTY2hlbWVzOyB9XG5cbiAgICBpZiAocmVzb3VyY2VzLmxlbmd0aCA+IDApIHsgbXNnLmJvZHkuY3JpdGVyaWEucmVzb3VyY2VzID0gcmVzb3VyY2VzOyB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcblxuICAgICAgICBsZXQgZGF0YU9iamVjdHMgPSByZXBseS5ib2R5LnZhbHVlO1xuXG4gICAgICAgIGxldCBmaW5hbERhdGFPYmplY3RzID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhT2JqZWN0cykgZmluYWxEYXRhT2JqZWN0cy5wdXNoKGRhdGFPYmplY3RzW2tleV0pO1xuXG4gICAgICAgIGlmIChmaW5hbERhdGFPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBsb2cubG9nKFwiRGF0YU9iamVjdHMgRm91bmQ6IFwiLCBmaW5hbERhdGFPYmplY3RzKTtcbiAgICAgICAgICByZXNvbHZlKGZpbmFsRGF0YU9iamVjdHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZWplY3QoJ05vIERhdGFPYmplY3Qgd2FzIGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBnbG9iYWwgcmVnaXN0cnkgYWJvdXQgdGhlIHVzZXIgSURzIGFzc29jaWF0ZWQgd2l0aCBzb21lIEdVSURcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICBndWlkXG4gICogQHJldHVybiB7UHJvbWlzZX0gICAgICAgICAgUHJvbWlzZVxuICAqL1xuICBkaXNjb3ZlclVzZXJJZHNQZXJHVUlEKGd1aWQpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuXG4gICAgICAvLyBsb2cubG9nKFwiR08gZ3JhcGhDb25uZWN0b3I6XCIsIGd1aWQpO1xuXG4gICAgICBfdGhpcy5ncmFwaENvbm5lY3Rvci5xdWVyeUdsb2JhbFJlZ2lzdHJ5KGd1aWQpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGdyYXBoQ29ubmVjdG9yQ29udGFjdERhdGEpIHtcblxuICAgICAgICAvLyBsb2cubG9nKCdJbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIEdsb2JhbCBSZWdpc3RyeTogJywgZ3JhcGhDb25uZWN0b3JDb250YWN0RGF0YSk7XG5cbiAgICAgICAgICBpZiAodHlwZW9mIGdyYXBoQ29ubmVjdG9yQ29udGFjdERhdGEgPT09ICdzdHJpbmcnIHx8ICFncmFwaENvbm5lY3RvckNvbnRhY3REYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KCdVbnN1Y2Nlc3NmdWwgZGlzY292ZXIgdXNlcklEcyBieSBHVUlEJyk7XG4gICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgbGV0IHVzZXJpZHMgPSBncmFwaENvbm5lY3RvckNvbnRhY3REYXRhLnVzZXJJRHM7XG5cbiAgICAgICAgICAgIGlmICh1c2VyaWRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gcmVqZWN0KCdVc2VySURzIG5vdCBhdmFpbGFibGUnKTsgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHVzZXJpZHMpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB9KTtcblxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBkaXNjb3Zlcnkgc2VydmljZSBhYm91dCB0aGUgR1VJRCBhc3NvY2lhdGVkIHdpdGggc29tZSB1c2VyIGlkZW50aWZpZXIgKGVnIGVtYWlsLCBuYW1lIC4uLilcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgdXNlcklkZW50aWZpZXJcbiAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgICAgICAgUHJvbWlzZVxuICAqL1xuICBkaXNjb3ZlckdVSURQZXJVc2VySWRlbnRpZmllcih1c2VySWRlbnRpZmllcikge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XG5cbiAgICAgIGxldCBsb29rdXBVUkxEaXNjb3ZlcnlTZXJ2aWNlID0gJ2h0dHBzOi8vcmV0aGluay50bGFic2Nsb3VkLmNvbS9kaXNjb3ZlcnkvcmVzdC9kaXNjb3Zlci9sb29rdXA/c2VhcmNocXVlcnk9JztcbiAgICAgIF90aGlzLmh0dHBSZXF1ZXN0LmdldChsb29rdXBVUkxEaXNjb3ZlcnlTZXJ2aWNlICsgdXNlcklkZW50aWZpZXIpXG4gICAgICAgIC50aGVuKGZ1bmN0aW9uKGpzb24pIHtcbiAgICAgICAgLy8gbG9nLmxvZygnZGlzY292ZXIgR1VJRCBieSB1c2VyIGlkZW50aWZpZXInLCBqc29uKTtcblxuICAgICAgICAgIGxldCByZXNwb25zZSA9IEpTT04ucGFyc2UoanNvbik7XG4gICAgICAgICAgbGV0IGZpbHRlcmVkR3VpZCA9IHJlc3BvbnNlLnJlc3VsdHMuZmlsdGVyKGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4LnJldGhpbmtJRCAhPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoZmlsdGVyZWRHdWlkLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gcmVqZWN0KCdVbnN1Y2Nlc3NmdWwgZGlzY292ZXIgR1VJRCBieSB1c2VyIGlkZW50aWZpZXInKTsgfVxuXG4gICAgICAgICAgbGV0IGd1aWRzID0gZmlsdGVyZWRHdWlkLm1hcChmdW5jdGlvbih4KSB7IHJldHVybiB4LnJldGhpbmtJRDsgfSk7XG5cbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShndWlkcyk7XG5cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICAvLyBsb2cubG9nKFwiSFRUUCBSZXF1ZXN0IGVycm9yOiBcIiwgZXJyKTtcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvcmVEaXNjb3Zlcnk7XG4iLCIvLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0RhdGFPYmplY3RzU3RvcmFnZScpO1xuXG5pbXBvcnQgeyBhc3NpZ24sIGRlZXBDbG9uZSwgZGl2aWRlVVJMIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQgeyBjcmVhdGVTeW5jREIgfSBmcm9tICcuLi9ydW50aW1lL1N0b3JhZ2UnO1xuXG5jbGFzcyBEYXRhT2JqZWN0c1N0b3JhZ2Uge1xuXG4gIGNvbnN0cnVjdG9yKHN0b3JhZ2VNYW5hZ2VyLCBzdG9yZWREYXRhT2JqZWN0cyA9IHt9LCBmYWN0b3J5LCBydW50aW1lU3RhdHVzVXBkYXRlKSB7XG4gICAgaWYgKCFzdG9yYWdlTWFuYWdlcikgdGhyb3cgbmV3IEVycm9yKCdbU3RvcmUgRGF0YSBPYmplY3RzXSAtIE5lZWRzIHRoZSBzdG9yYWdlTWFuYWdlciBjb21wb25lbnQnKTtcblxuICAgIHRoaXMuX3N0b3JhZ2VNYW5hZ2VyID0gc3RvcmFnZU1hbmFnZXI7XG5cbiAgICB0aGlzLl9zdG9yZURhdGFPYmplY3QgPSBzdG9yZWREYXRhT2JqZWN0cztcblxuICAgIHRoaXMuX2NhY2hlID0ge307XG5cbiAgICB0aGlzLl9jcmVhdGVTeW5jREIgPSBjcmVhdGVTeW5jREI7IC8vIHRvIGNyZWF0ZSBEYXRhIE9iamVjdHMgdG8gYmUgc3luY2hlZCB3aXRoIHJlbW90ZSBzdG9yYWdlc1xuICAgIHRoaXMuX3JlbW90ZXMgPSB7fTsgLy8gTGlzdCBvZiBETyBzeW5jaGVkIHdpdGggcmVtb3RlIHN0b3JhZ2VzXG4gICAgdGhpcy5fZmFjdG9yeSA9IGZhY3Rvcnk7XG4gICAgdGhpcy5fdGFibGUgPSAnc3luY2hlck1hbmFnZXI6T2JqZWN0VVJMcyc7XG4gICAgdGhpcy5fcmVtb3RlU3RvcmFnZVRhYmxlID0gJ2RhdGFPYmplY3RTdG9yYWdlJztcbiAgICB0aGlzLl9yZW1vdGVTY2hlbWEgPSAndXJsJztcbiAgICB0aGlzLl9ydW50aW1lU3RhdHVzVXBkYXRlID0gcnVudGltZVN0YXR1c1VwZGF0ZTtcbiAgfVxuXG4gIC8vIGxvYWQgRGF0YSBPYmplY3RzIHN5bmNoZWQgd2l0aCByZW1vdGUgU3RvcmFnZXNcblxuICBsb2FkUmVtb3RlKHJlc3VtZSA9IGZhbHNlKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IGxvYWRpbmcgPSBbXTtcbiAgICAgIGxldCBsb2FkaW5nREJzID0gW107XG5cbiAgICAgIF90aGlzLl9zdG9yYWdlTWFuYWdlci5nZXQobnVsbCwgbnVsbCwgJ3JlbW90ZXMnKS50aGVuKChyZW1vdGVzKSA9PiB7XG5cbiAgICAgICAgLy8gaW4gY2FzZSB3ZSBkb24ndCBoYXZlIGFueSByZW1vdGVzIGxvY2FsbHkgc3RvcmVkXG4gICAgICAgIGxvZy5pbmZvKCdbU3RvcmVEYXRhT2JqZWN0cy5sb2FkUmVtb3RlXSByZW1vdGVzOiAnLCByZW1vdGVzKTtcbiAgICAgICAgaWYgKCFyZW1vdGVzKSByZXNvbHZlKCk7XG5cbiAgICAgICAgaWYgKCFyZXN1bWUpIF90aGlzLl9yZW1vdGVzID0gcmVtb3RlcztcblxuICAgICAgICBsb2cuaW5mbygnW1N0b3JlRGF0YU9iamVjdHMubG9hZFJlbW90ZV0gbG9hZGluZzogJywgX3RoaXMuX3JlbW90ZXMpO1xuXG4gICAgICAgIGxldCByZW1vdGVPYmplY3RzID0gT2JqZWN0LmtleXMocmVtb3Rlcyk7XG5cbiAgICAgICAgLy8gaW4gY2FzZSB3ZSBkb24ndCBoYXZlIGFueSByZW1vdGVzIGxvY2FsbHkgc3RvcmVkXG5cbiAgICAgICAgaWYgKHJlbW90ZU9iamVjdHMubGVuZ3RoID09PSAwKSByZXNvbHZlKCk7XG5cbiAgICAgICAgcmVtb3RlT2JqZWN0cy5mb3JFYWNoKChkYikgPT4ge1xuICAgICAgICAgIGxldCBzY2hlbWEgPSB7fTtcbiAgICAgICAgICBsZXQgdGFibGUgPSBkYi5zcGxpdCgnLycpWzNdO1xuICAgICAgICAgIHNjaGVtYVt0YWJsZV0gPSB0aGlzLl9yZW1vdGVTY2hlbWE7XG4gICAgICAgICAgX3RoaXMuX3JlbW90ZXNbZGJdID0gY3JlYXRlU3luY0RCKGRiLCB0aGlzLl9mYWN0b3J5LCBzY2hlbWEsIHRoaXMuX3J1bnRpbWVTdGF0dXNVcGRhdGUpO1xuICAgICAgICAgIC8vICAgICAgICAgICAgX3RoaXMuX3JlbW90ZXNbcmVtb3RlXSA9IGNyZWF0ZVN5bmNEQihyZW1vdGUsIF90aGlzLl9mYWN0b3J5LCAncmVtb3RlRGF0YU9iamVjdFN0b3JhZ2UnICk7XG4gICAgICAgICAgbG9hZGluZy5wdXNoKF90aGlzLl9yZW1vdGVzW2RiXS5nZXQobnVsbCwgbnVsbCwgdGFibGUpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgUHJvbWlzZS5hbGwobG9hZGluZykudGhlbigoKSA9PiB7XG4gICAgICAgICAgbG9nLmxvZygnW1N0b3JlRGF0YU9iamVjdHMubG9hZFJlbW90ZV0gbG9hZGVkLiBTdGFydGluZyBpbml0Jyk7XG4gICAgICAgICAgLy9UT0RPOiBpbml0IHRoaXMuX3N0b3JlRGF0YU9iamVjdCB3aXRoIGxvYWRlZCBkYXRhIG9iamVjdHNcbiAgICAgICAgICBPYmplY3Qua2V5cyhfdGhpcy5fcmVtb3RlcykuZm9yRWFjaCgocmVtb3RlKSA9PiB7XG4gICAgICAgICAgICBsZXQgdGFibGUgPSByZW1vdGUuc3BsaXQoJy8nKVszXTtcbiAgICAgICAgICAgIGxvYWRpbmdEQnMucHVzaChfdGhpcy5fcmVtb3Rlc1tyZW1vdGVdLmdldChudWxsLCBudWxsLCB0YWJsZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIFByb21pc2UuYWxsKGxvYWRpbmdEQnMpLnRoZW4oKGRhdGFPYmpzKSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChkYXRhT2Jqcy5sZW5ndGggPT09IDApIHJlc29sdmUoKTtcblxuICAgICAgICAgICAgZGF0YU9ianMuZm9yRWFjaCgoZE8pID0+IHtcbiAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZE8pLmZvckVhY2goKHVybCkgPT4ge1xuXG4gICAgICAgICAgICAgICAgbG9nLmxvZygnW1N0b3JlRGF0YU9iamVjdHMubG9hZFJlbW90ZV0gbG9hZGVkIHJlbW90ZSAnLCBkT1t1cmxdKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgaWYgKGRPW3JlbW90ZV0uaXNSZXBvcnRlcikge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gdGhpcy5fZ2V0VHlwZU9mT2JqZWN0KGRPW3VybF0uaXNSZXBvcnRlcik7XG5cbiAgICAgICAgICAgICAgICBpZiAoIV90aGlzLl9zdG9yZURhdGFPYmplY3QpIF90aGlzLl9zdG9yZURhdGFPYmplY3QgPSB7fTtcblxuICAgICAgICAgICAgICAgIGlmICghX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgX3RoaXMuX3N0b3JlRGF0YU9iamVjdFt0eXBlXSA9IHt9O1xuXG4gICAgICAgICAgICAgICAgX3RoaXMuX3N0b3JlRGF0YU9iamVjdFt0eXBlXVt1cmxdID0gZE9bdXJsXTtcblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzb2x2ZShfdGhpcy5fc3RvcmVEYXRhT2JqZWN0KTtcblxuICAgICAgICAgIH0sIChlcnJvcikgPT4geyByZWplY3QoZXJyb3IpIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgfSk7XG4gIH1cblxuIC8vIGRlbGV0ZSBEYXRhIE9iamVjdHMgc3luY2hlZCB3aXRoIHJlbW90ZSBTdG9yYWdlc1xuXG4gZGVsZXRlUmVtb3RlcygpIHtcbiAgbGV0IF90aGlzID0gdGhpcztcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgZGVsZXRpbmcgPSBbXTtcbiAgICBsZXQgZGlzY29ubmVjdGluZyA9IFtdO1xuXG4gICAgX3RoaXMuX3N0b3JhZ2VNYW5hZ2VyLmdldChudWxsLCBudWxsLCAncmVtb3RlcycpLnRoZW4oKHJlbW90ZXMpID0+IHtcblxuICAgICAgLy8gaW4gY2FzZSB3ZSBkb24ndCBoYXZlIGFueSByZW1vdGVzIGxvY2FsbHkgc3RvcmVkXG4gICAgICBsb2cuaW5mbygnW1N0b3JlRGF0YU9iamVjdHMuZGVsZXRlUmVtb3Rlc10gcmVtb3RlczogJywgcmVtb3Rlcyk7XG4gICAgICBpZiAoIXJlbW90ZXMpIHJlc29sdmUoKTtcblxuICAgICAgbGV0IHJlbW90ZU9iamVjdHMgPSBPYmplY3Qua2V5cyhfdGhpcy5fcmVtb3Rlcyk7XG5cbiAgICAgIC8vIGluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgcmVtb3RlcyBsb2NhbGx5IHN0b3JlZFxuXG4gICAgICBpZiAocmVtb3RlT2JqZWN0cy5sZW5ndGggPT09IDApIHJlc29sdmUoKTtcblxuICAgICAgcmVtb3RlT2JqZWN0cy5mb3JFYWNoKChkYikgPT4ge1xuICAgICAgICBkZWxldGluZy5wdXNoKFxuICAgICAgICAgIF90aGlzLl9yZW1vdGVzW2RiXS5kaXNjb25uZWN0KClcbiAgICAgICAgKTtcbiAgICAgICAgZGVsZXRpbmcucHVzaChcbiAgICAgICAgICBfdGhpcy5fcmVtb3Rlc1tkYl0uZGVsZXRlKClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBQcm9taXNlLmFsbChkZWxldGluZykudGhlbigoKSA9PiB7XG4gICAgICAgIGxvZy5sb2coJ1tTdG9yZURhdGFPYmplY3RzLmRlbGV0ZVJlbW90ZXNdIGRlbGV0ZWQuJyk7XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgICAgfSwgKGVycm9yKSA9PiB7IHJlc29sdmUoKTsgfSk7XG4gICAgICB9KTtcblxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuXG4gIH0pO1xufVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gc2hvdWxkIHNldCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgZGF0YU9iamVjdFVSTCB0byBiZSByZXN1bWVkIGlmIG5lY2Vzc2FyeTtcbiAgICpcbiAgICogQHBhcmFtIHtEYXRhT2JqZWN0VVJMfSB1cmwgLSBkYXRhT2JqZWN0VVJMIHRvIGJlIHNhdmVkO1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzUmVwb3J0ZXIgLSB0aGUgb2JqZWN0IHRvIGJlIHNhdmVkIGlzIGEgcmVwb3J0ZXJcbiAgICogQHBhcmFtIHtTY2hlbWFVUkx9IHNjaGVtYSAtIHRoZSBzY2hlbWEgdXJsXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdGF0dXMgLSB0aGUgc3RhdHVzIG9mIGN1cnJlbnQgZGF0YU9iamVjdFxuICAgKiBAcGFyYW0ge0h5cGVydHlVUkx9IHJlcG9ydGVyIC0gdGhlIFJlcG9ydGVyIGh5cGVydHlVUkxcbiAgICogQHBhcmFtIHtBcnJheTxIeXBlcnR5VVJMPn0gc3Vic2NyaXB0aW9uIC0gbGlzdCBvZiBzdWJzY3JpcHRpb25zXG4gICAqIEBwYXJhbSB7QXJyYXk8RGF0YU9iamVjdENoaWxkPn0gY2hpbGRyZW4gLSBsaXN0IG9mIGNoaWxkcyBvZiBkYXRhT2JqZWN0VVJMXG4gICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gY2hpbGRyZW5zIC0gbGlzdCBvZiBjaGlsZHJlbnMsIGxpa2UsICdjaGF0bWVzc2FnZSc7XG4gICAqIEBwYXJhbSB7QXJyYXk8VXNlclVSTH0gc3Vic2NyaWJlclVzZXIgLSBsaXN0IG9mIHN1YnNjcmliZWQgdXNlcnM7XG4gICAqL1xuXG4gIHNldChtZXRhZGF0YSkge1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzdG9yZURhdGFPYmplY3QgPSB0aGlzLl9zdG9yZURhdGFPYmplY3QgPyB0aGlzLl9zdG9yZURhdGFPYmplY3QgOiB7fTtcbiAgICAgIGxldCB0eXBlID0gdGhpcy5fZ2V0VHlwZU9mT2JqZWN0KG1ldGFkYXRhLmlzUmVwb3J0ZXIpO1xuXG5cbiAgICAgIGlmICghc3RvcmVEYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KHR5cGUpKSBzdG9yZURhdGFPYmplY3RbdHlwZV0gPSB7fTtcblxuICAgICAgaWYgKCFzdG9yZURhdGFPYmplY3RbdHlwZV0uaGFzT3duUHJvcGVydHkobWV0YWRhdGEudXJsKSkge1xuICAgICAgICBzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXSA9IHt9O1xuICAgICAgICBzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXS5zdWJzY3JpcHRpb25zID0gW107Ly8gVE9ETzpkbyB3ZSBuZWVkIHRoaXM/XG4gICAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLnN1YnNjcmliZXJVc2VycyA9IFtdOy8vIFRPRE86ZG8gd2UgbmVlZCB0aGlzP1xuICAgICAgICBzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXS5jaGlsZHJlbk9iamVjdHMgPSB7fTtcbiAgICAgICAgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0uZGF0YSA9IHt9O1xuICAgICAgfVxuXG4gICAgICBPYmplY3QuYXNzaWduKHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLCBtZXRhZGF0YSk7XG4gICAgICBkZWxldGUgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0uc3Vic2NyaWJlclVzZXI7XG4gICAgICBkZWxldGUgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0uc3Vic2NyaWJlckh5cGVydHk7XG5cbiAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLmJhY2t1cCA9IG1ldGFkYXRhLmhhc093blByb3BlcnR5KCdiYWNrdXAnKSA/IG1ldGFkYXRhLmJhY2t1cCA6IGZhbHNlO1xuXG4gICAgICAvKmlmIChzY2hlbWEpIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLnNjaGVtYSA9IHNjaGVtYTtcbiAgICAgIGlmIChzdGF0dXMpIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIGlmIChjaGlsZHJlblJlc291cmNlcykgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0uY2hpbGRyZW5SZXNvdXJjZXMgPSBjaGlsZHJlblJlc291cmNlczsqL1xuXG4gICAgICBpZiAobWV0YWRhdGEuc3Vic2NyaWJlckh5cGVydHkgJiYgIW1ldGFkYXRhLmlzUmVwb3J0ZXIpIHsgLy8gVE9ETzogZG8gd2UgbmVlZCB0aGlzP1xuICAgICAgICB0aGlzLl91cGRhdGVUb0FycmF5KHN0b3JlRGF0YU9iamVjdFt0eXBlXSwgbWV0YWRhdGEudXJsLCAnc3Vic2NyaXB0aW9ucycsIG1ldGFkYXRhLnN1YnNjcmliZXJIeXBlcnR5KTtcbiAgICAgIH1cblxuICAgICAgLy9zdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXS5vd25lciA9IG93bmVyO1xuXG4gICAgICBpZiAobWV0YWRhdGEuc3Vic2NyaWJlclVzZXIpIHsgLy8gVE9ETzogZG8gd2UgbmVlZCB0aGlzP1xuICAgICAgICBpZiAoc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0uc3Vic2NyaWJlclVzZXJzLmluZGV4T2YobWV0YWRhdGEuc3Vic2NyaWJlclVzZXIpKSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlVG9BcnJheShzdG9yZURhdGFPYmplY3RbdHlwZV0sIG1ldGFkYXRhLnVybCwgJ3N1YnNjcmliZXJVc2VycycsIG1ldGFkYXRhLnN1YnNjcmliZXJVc2VyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdG9yZURhdGFPYmplY3QgPSBzdG9yZURhdGFPYmplY3Q7XG5cbiAgICAgIGxldCBiYWNrdXAgPSBtZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eSgnYmFja3VwJykgPyBtZXRhZGF0YS5iYWNrdXAgOiBmYWxzZTtcbiAgICAgIGxldCBkYiA9IGJhY2t1cCA/IG1ldGFkYXRhLnVybCA6IHRoaXMuX3RhYmxlO1xuICAgICAgbGV0IHRhYmxlID0gYmFja3VwID8gZGIuc3BsaXQoJy8nKVszXSA6IHRoaXMuX3RhYmxlO1xuICAgICAgaWYgKGJhY2t1cCAmJiAhdGhpcy5fcmVtb3Rlc1tkYl0pIHtcbiAgICAgICAgbGV0IHNjaGVtYSA9IHt9O1xuICAgICAgICBzY2hlbWFbdGFibGVdID0gdGhpcy5fcmVtb3RlU2NoZW1hO1xuICAgICAgICB0aGlzLl9yZW1vdGVzW2RiXSA9IGNyZWF0ZVN5bmNEQihkYiwgdGhpcy5fZmFjdG9yeSwgc2NoZW1hLCB0aGlzLl9ydW50aW1lU3RhdHVzVXBkYXRlKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2F2ZSBEYXRhIE9iamVjdCBVUkwgYXQgcmVtb3RlcyB0YWJsZSB0byBzdXBwb3J0IHJlc3VtZXNcblxuICAgICAgaWYgKGJhY2t1cCkgdGhpcy5fc3RvcmFnZU1hbmFnZXIuc2V0KG1ldGFkYXRhLnVybCwgMCwgbWV0YWRhdGEudXJsLCAncmVtb3RlcycpO1xuXG4gICAgICBsZXQgc3RvcmFnZSA9IGJhY2t1cCA/IHRoaXMuX3JlbW90ZXNbZGJdIDogdGhpcy5fc3RvcmFnZU1hbmFnZXI7XG5cbiAgICAgIGlmIChtZXRhZGF0YS5pc1JlcG9ydGVyICYmIGJhY2t1cCkgey8vIGxldHMgY29ubmVjdCB0byByZW1vdGUgc3RvcmFnZSB0byBlbmFibGUgc3luY1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHsgdGFibGU6IHRhYmxlIH07XG4gICAgICAgIHN0b3JhZ2UuY29ubmVjdChvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBzdG9yYWdlLnNldChkYiwgMCwgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0sIHRhYmxlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF0pO1xuICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdbRGF0YU9iamVjdFN0b3JhZ2Uuc2V0XSBmYWlsZWQgdG8gc2F2ZSBpbnRvIHJlbW90ZSBzdG9yYWdlOiAnLCBlcnJvcik7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0VG9SZW1vdGVUaHJlYWQoc3RvcmFnZSwgb3B0aW9ucywgZGIsIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLCB0YWJsZSk7XG4gICAgICAgICAgICByZXNvbHZlKHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgbG9nLmVycm9yKCdbRGF0YU9iamVjdFN0b3JhZ2Uuc2V0XSBmYWlsZWQgdG8gY29ubmVjdCB3aXRoIHJlbW90ZSBzdG9yYWdlOiAnLCBlcnJvciwgJyB0cnlpbmcgYWdhaW4uLi4nKTtcbiAgICAgICAgICB0aGlzLl9jb25uZWN0VG9SZW1vdGVUaHJlYWQoc3RvcmFnZSwgb3B0aW9ucywgZGIsIHN0b3JlRGF0YU9iamVjdFt0eXBlXVttZXRhZGF0YS51cmxdLCB0YWJsZSk7XG4gICAgICAgICAgcmVzb2x2ZShzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyAgICAgICAgICByZXR1cm4gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW21ldGFkYXRhLnVybF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdG9yYWdlLnNldChkYiwgMSwgdGhpcy5fZmlsdGVyUmVtb3RlcyhzdG9yZURhdGFPYmplY3QpLCB0YWJsZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShzdG9yZURhdGFPYmplY3RbdHlwZV1bbWV0YWRhdGEudXJsXSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX2Nvbm5lY3RUb1JlbW90ZVRocmVhZChzdG9yYWdlLCBvcHRpb25zLCBkYiwgZGF0YU9iamVjdCwgdGFibGUpIHtcblxuICAgIGxldCBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBsZXQgaWQ7XG5cbiAgICBsZXQgY29ubmVjdCA9IGZ1bmN0aW9uIChkTykge1xuICAgICAgbG9nLmVycm9yKCdbRGF0YU9iamVjdFN0b3JhZ2UuX2Nvbm5lY3RUb1JlbW90ZV0gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gcmVtb3RlIHN0b3JhZ2UgLi4uICcpO1xuICAgICAgc3RvcmFnZS5jb25uZWN0KG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICBzdG9yYWdlLnNldChkYiwgMCwgZE8sIHRhYmxlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICBjb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaWQpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ1tEYXRhT2JqZWN0U3RvcmFnZS5fY29ubmVjdFRvUmVtb3RlXSBmYWlsZWQgdG8gc2F2ZSBpbnRvIHJlbW90ZSBzdG9yYWdlOiAnLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIGxvZy5lcnJvcignW0RhdGFPYmplY3RTdG9yYWdlLl9jb25uZWN0VG9SZW1vdGVdIGZhaWxlZCB0byBjb25uZWN0IHRvIHJlbW90ZSBzdG9yYWdlOiAnLCBlcnJvcik7XG4gICAgICB9KTtcblxuICAgIH1cblxuICAgIGlkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuXG4gICAgICBpZiAoIWNvbm5lY3RlZCkgY29ubmVjdChkYXRhT2JqZWN0KTtcbiAgICB9LCA1MDAwKTtcblxuXG4gIH1cblxuICAvLyB0byBmaWx0ZXIgRGF0YSBPYmplY3RzIHRoYXQgYXJlIHN0b3JlZCBvdXRzaWRlIHRoZSBPYmplY3RVUkxzIHRhYmxlXG5cbiAgX2ZpbHRlclJlbW90ZXMoc3RvcmVEYXRhT2JqZWN0KSB7XG4gICAgbGV0IHJlbW90ZXMgPSBPYmplY3Qua2V5cyh0aGlzLl9yZW1vdGVzKTtcblxuICAgIGxldCBmaWx0ZXJlZCA9IGRlZXBDbG9uZShzdG9yZURhdGFPYmplY3QpO1xuXG4gICAgcmVtb3Rlcy5mb3JFYWNoKChyZW1vdGUpID0+IHtcbiAgICAgIGlmIChmaWx0ZXJlZFsncmVwb3J0ZXJzJ11bcmVtb3RlXSkgZGVsZXRlIGZpbHRlcmVkWydyZXBvcnRlcnMnXVtyZW1vdGVdO1xuICAgICAgZWxzZSBkZWxldGUgZmlsdGVyZWRbJ29ic2VydmVycyddW3JlbW90ZV07XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3RTdG9yYWdlLl9maWx0ZXJSZW1vdGVzXSAnLCBmaWx0ZXJlZCk7XG5cbiAgICByZXR1cm4gZmlsdGVyZWQ7XG4gIH1cblxuICAvLyBJbml0aWFsIFN5bmMgb2YgT2JzZXJ2ZXIgdG8gYXZvaWQgbGF0ZXIgbWlzbWF0Y2hlcyB3aXRoIHN5bmMgcmV2aXNpb25zXG4gIC8vIE9VdGRhdGVkOiBub3QgdXNlZCBhbnltb3JlXG4gIC8qXG4gICAgaW5pdGlhbE9ic2VydmVyU3luYyhyZXNvdXJjZSwgYmFja3VwUmV2aXNpb24pIHtcbiAgICAgIC8vIHRvIGJlIGNvbXBsZXRlZFxuICAgICAgbGV0IHRhYmxlID0gcmVzb3VyY2Uuc3BsaXQoJy8nKVszXTtcbiAgXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICBcbiAgICAgIGxldCBvcHRpb25zID0ge3RhYmxlOiB0YWJsZSwgb2JzZXJ2ZXI6IHRydWUsIGJhc2VSZXZpc2lvbjogYmFja3VwUmV2aXNpb24sIHN5bmNlZFJldmlzaW9uOiBiYWNrdXBSZXZpc2lvbn07XG4gIFxuICAgICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0U3RvcmFnZS5pbml0aWFsT2JzZXJ2ZXJTeW5jXSBvYmplY3Q6ICcsIHJlc291cmNlLCAnIHJldmlzaW9uICcsIGJhY2t1cFJldmlzaW9uKVxuICBcbiAgICAgIF90aGlzLl9yZW1vdGVzW3Jlc291cmNlXS5jb25uZWN0KG9wdGlvbnMpLnRoZW4oKCk9PiB7XG4gIFxuICAgICAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3RTdG9yYWdlLmluaXRpYWxPYnNlcnZlclN5bmNdIGNvbm5lY3RlZCAnKTtcbiAgXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuX3JlbW90ZXNbcmVzb3VyY2VdLmRpc2Nvbm5lY3QoKS50aGVuKCgpPT57XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3RTdG9yYWdlLmluaXRpYWxPYnNlcnZlclN5bmNdIGRpc2Nvbm5lY3RlZCAnKTtcbiAgICAgICAgICAgICAgfSwoZXJyb3IpPT4ge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignW0RhdGFPYmplY3RTdG9yYWdlLmluaXRpYWxPYnNlcnZlclN5bmNdIEVycm9yIGRpc2Nvbm5lY3Rpbmcgd2l0aCByZW1vdGUgc3RvcmFnZScpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9LCAxNTAwMClcbiAgXG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nLmVycm9yKCdbRGF0YU9iamVjdFN0b3JhZ2UuaW5pdGlhbE9ic2VydmVyU3luY10gRXJyb3IgY29ubmVjdGluZyB0byByZW1vdGUgc3RvcmFnZScpO1xuICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICB9KTtcbiAgXG4gICAgfSovXG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBzaG91bGQgc2F2ZSBhbmQgdXBkYXRlIHRoZSBjdXJyZW50IGRhdGFPYmplY3QgZGF0YSBpbmZvcm1hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzUmVwb3J0ZXIgLSB0aGUgb2JqZWN0IHRvIGJlIHNhdmVkIGlzIGEgcmVwb3J0ZXJcbiAgICogQHBhcmFtIHtEYXRhT2JqZWN0VVJMfSByZXNvdXJjZSAtIGRhdGFPYmplY3RVUkwgdG8gYmUgc2F2ZWQgb3IgdXBkYXRlZDtcbiAgICogQHBhcmFtIHtTdHJpbmd9IGF0dHJpYnV0ZSAtIGF0dHJpYnV0ZSBpbnNpZGUgdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSBzYXZlZFxuICAgKiBAcGFyYW0ge2FueX0gZGF0YSAtIHZhbHVlIHdpbGwgYmUgc2F2ZWQgaW5zaWRlIHRoZSBhdHRyaWJ1dGU7XG4gICAqL1xuICBzYXZlRGF0YShpc1JlcG9ydGVyLCByZXNvdXJjZSwgYXR0cmlidXRlLCB2YWx1ZSwgdXBkYXRlUnVudGltZVN0YXR1cykge1xuXG4gICAgbGV0IHN0b3JlRGF0YU9iamVjdCA9IHRoaXMuX3N0b3JlRGF0YU9iamVjdDtcbiAgICBsZXQgdHlwZSA9IHRoaXMuX2dldFR5cGVPZk9iamVjdChpc1JlcG9ydGVyKTtcblxuICAgIGlmICghc3RvcmVEYXRhT2JqZWN0IHx8ICFzdG9yZURhdGFPYmplY3RbdHlwZV0gfHwgIXN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0pIHtcbiAgICAgIGxvZy5sb2coJ1tTdG9yZURhdGFPYmplY3RzIC0gc2F2ZSBkYXRhXSAtIG5vdCBzYXZlZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZy5sb2coJ1tTdG9yZURhdGFPYmplY3RzIC0gc2F2ZURhdGFdIC0gJywgaXNSZXBvcnRlciwgdHlwZSwgcmVzb3VyY2UsIGF0dHJpYnV0ZSwgdmFsdWUpO1xuXG4gICAgaWYgKCFzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmhhc093blByb3BlcnR5KCdkYXRhJykpIHtcbiAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uZGF0YSA9IHt9O1xuICAgIH1cblxuICAgIGlmIChhdHRyaWJ1dGUpIHtcbiAgICAgIGxldCBkYXRhO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIGRhdGEgPSBkZWVwQ2xvbmUodmFsdWUpO1xuICAgICAgZWxzZSBkYXRhID0gdmFsdWU7XG5cbiAgICAgIGFzc2lnbihzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmRhdGEsIGF0dHJpYnV0ZSwgZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uZGF0YSA9IGRlZXBDbG9uZSh2YWx1ZSkgfHwge307XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcmVEYXRhT2JqZWN0ID0gc3RvcmVEYXRhT2JqZWN0O1xuICAgIGxldCBkYiA9IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uYmFja3VwID8gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS51cmwgOiAnc3luY2hlck1hbmFnZXI6T2JqZWN0VVJMcyc7XG4gICAgbGV0IHN0b3JhZ2UgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IHRoaXMuX3JlbW90ZXNbZGJdIDogdGhpcy5fc3RvcmFnZU1hbmFnZXI7XG4gICAgbGV0IHRhYmxlID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBkYi5zcGxpdCgnLycpWzNdIDogdGhpcy5fdGFibGU7XG4gICAgbGV0IGRhdGEgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0gOiB0aGlzLl9maWx0ZXJSZW1vdGVzKHN0b3JlRGF0YU9iamVjdCk7XG4gICAgc3RvcmFnZS5zZXQoZGIsIDEsIGRhdGEsIHRhYmxlLCB1cGRhdGVSdW50aW1lU3RhdHVzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdO1xuICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICByZXR1cm4gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXTtcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVDaGlsZHJlbnMoaXNSZXBvcnRlciwgcmVzb3VyY2UsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgICBsZXQgc3RvcmVEYXRhT2JqZWN0ID0gdGhpcy5fc3RvcmVEYXRhT2JqZWN0O1xuICAgIGxldCB0eXBlID0gdGhpcy5fZ2V0VHlwZU9mT2JqZWN0KGlzUmVwb3J0ZXIpO1xuXG4gICAgaWYgKCFzdG9yZURhdGFPYmplY3QgfHwgIXN0b3JlRGF0YU9iamVjdFt0eXBlXSB8fCAhc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXSkge1xuICAgICAgbG9nLmxvZygnW1N0b3JlRGF0YU9iamVjdHMgLSBzYXZlIGNoaWxkcmVuc10gLSBub3Qgc2F2ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uaGFzT3duUHJvcGVydHkoJ2NoaWxkcmVucycpKSB7XG4gICAgICBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmNoaWxkcmVuT2JqZWN0cyA9IHt9O1xuICAgIH1cblxuICAgIC8qICAgIGlmICghc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5jaGlsZHJlbk9iamVjdHMuaGFzT3duUHJvcGVydHkoJ3Jlc291cmNlcycpKSB7XG4gICAgICAgICAgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5jaGlsZHJlbk9iamVjdHMucmVzb3VyY2VzID0ge307XG4gICAgICAgIH0qL1xuXG4gICAgaWYgKGF0dHJpYnV0ZSkge1xuICAgICAgYXNzaWduKHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uY2hpbGRyZW5PYmplY3RzLCBhdHRyaWJ1dGUsIGRlZXBDbG9uZSh2YWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmNoaWxkcmVuT2JqZWN0cyA9IGRlZXBDbG9uZSh2YWx1ZSkgfHwge307XG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcmVEYXRhT2JqZWN0ID0gc3RvcmVEYXRhT2JqZWN0O1xuICAgIGxldCBkYiA9IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0uYmFja3VwID8gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS51cmwgOiAnc3luY2hlck1hbmFnZXI6T2JqZWN0VVJMcyc7XG4gICAgbGV0IHN0b3JhZ2UgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IHRoaXMuX3JlbW90ZXNbZGJdIDogdGhpcy5fc3RvcmFnZU1hbmFnZXI7XG4gICAgbGV0IHRhYmxlID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBkYi5zcGxpdCgnLycpWzNdIDogdGhpcy5fdGFibGU7XG4gICAgbGV0IGRhdGEgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0gOiB0aGlzLl9maWx0ZXJSZW1vdGVzKHN0b3JlRGF0YU9iamVjdCk7XG4gICAgc3RvcmFnZS5zZXQoZGIsIDEsIGRhdGEsIHRhYmxlKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdO1xuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIHNob3VsZCBzYXZlIGFuZCB1cGRhdGUgdGhlIGN1cnJlbnQgZGF0YU9iamVjdCBpbmZvcm1hdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzUmVwb3J0ZXIgLSB0aGUgb2JqZWN0IHRvIGJlIHNhdmVkIGlzIGEgcmVwb3J0ZXJcbiAgICogQHBhcmFtIHtEYXRhT2JqZWN0VVJMfSByZXNvdXJjZSAtIGRhdGFPYmplY3RVUkwgdG8gYmUgc2F2ZWQgb3IgdXBkYXRlZDtcbiAgICogQHBhcmFtIHtTdHJpbmd9IGF0dHJpYnV0ZSAtIGF0dHJpYnV0ZSBpbnNpZGUgdGhlIGRhdGEgd2hpY2ggd2lsbCBiZSBzYXZlZFxuICAgKiBAcGFyYW0ge2FueX0gZGF0YSAtIHZhbHVlIHdpbGwgYmUgc2F2ZWQgaW5zaWRlIHRoZSBhdHRyaWJ1dGU7XG4gICAqL1xuICB1cGRhdGUoaXNSZXBvcnRlciwgcmVzb3VyY2UsIGF0dHJpYnV0ZSwgdmFsdWUsIHVwZGF0ZVJ1bnRpbWVTdGF0dXMpIHtcblxuICAgIGxldCBzdG9yZURhdGFPYmplY3QgPSB0aGlzLl9zdG9yZURhdGFPYmplY3Q7XG4gICAgbGV0IHR5cGUgPSB0aGlzLl9nZXRUeXBlT2ZPYmplY3QoaXNSZXBvcnRlcik7XG5cbiAgICBpZiAoIXN0b3JlRGF0YU9iamVjdCB8fCAhc3RvcmVEYXRhT2JqZWN0W3R5cGVdIHx8ICFzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdKSB7XG4gICAgICBsb2cubG9nKCdbU3RvcmVEYXRhT2JqZWN0cyAtIHVwZGF0ZV0gLSBub3Qgc2F2ZWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2cubG9nKCdbU3RvcmVEYXRhT2JqZWN0cyAtIHVwZGF0ZV0gLSAnLCBpc1JlcG9ydGVyLCB0eXBlLCByZXNvdXJjZSwgYXR0cmlidXRlLCB2YWx1ZSk7XG5cbiAgICBpZiAoc3RvcmVEYXRhT2JqZWN0W3R5cGVdICYmIHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0gJiYgcmVzb3VyY2UgJiYgYXR0cmlidXRlICYmIHZhbHVlKSB7XG5cbiAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICdzdWJzY3JpcHRpb25zJyB8fCBhdHRyaWJ1dGUgPT09ICdzdWJzY3JpYmVyVXNlcnMnKSB7XG4gICAgICAgIGxldCB1cGRhdGUgPSB0cnVlO1xuXG4gICAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICdzdWJzY3JpcHRpb25zJykge1xuICAgICAgICAgIHVwZGF0ZSA9ICF0aGlzLl9pc093bmVyKHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0sIHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGUpIHRoaXMuX3VwZGF0ZVRvQXJyYXkoc3RvcmVEYXRhT2JqZWN0W3R5cGVdLCByZXNvdXJjZSwgYXR0cmlidXRlLCB2YWx1ZSk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV1bYXR0cmlidXRlXSA9IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdG9yZURhdGFPYmplY3QgPSBzdG9yZURhdGFPYmplY3Q7XG4gICAgICBsZXQgZGIgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0udXJsIDogJ3N5bmNoZXJNYW5hZ2VyOk9iamVjdFVSTHMnO1xuICAgICAgbGV0IHN0b3JhZ2UgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IHRoaXMuX3JlbW90ZXNbZGJdIDogdGhpcy5fc3RvcmFnZU1hbmFnZXI7XG4gICAgICBsZXQgdGFibGUgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IGRiLnNwbGl0KCcvJylbM10gOiB0aGlzLl90YWJsZTtcbiAgICAgIGxldCBkYXRhID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdIDogdGhpcy5fZmlsdGVyUmVtb3RlcyhzdG9yZURhdGFPYmplY3QpO1xuICAgICAgc3RvcmFnZS5zZXQoZGIsIDEsIGRhdGEsIHRhYmxlLCB1cGRhdGVSdW50aW1lU3RhdHVzKS50aGVuKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIHNob3VsZCBkZWxldGUgc3RvcmVkIGluZm9ybWF0aW9uIGZyb20gdGhlIGRhdGFPYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtCb29sZWFufSBpc1JlcG9ydGVyIC0gdGhlIG9iamVjdCB0byBiZSBzYXZlZCBpcyBhIHJlcG9ydGVyXG4gICAqIEBwYXJhbSB7RGF0YU9iamVjdFVSTH0gcmVzb3VyY2UgLSBkYXRhT2JqZWN0VVJMIHRvIGJlIHNhdmVkIG9yIHVwZGF0ZWQ7XG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhdHRyaWJ1dGUgLSBhdHRyaWJ1dGUgaW5zaWRlIHRoZSBkYXRhIHdoaWNoIHdpbGwgYmUgc2F2ZWRcbiAgICogQHBhcmFtIHthbnl9IGRhdGEgLSB2YWx1ZSB3aWxsIGJlIHNhdmVkIGluc2lkZSB0aGUgYXR0cmlidXRlO1xuICAgKi9cbiAgZGVsZXRlKGlzUmVwb3J0ZXIsIHJlc291cmNlLCBhdHRyaWJ1dGUsIHZhbHVlKSB7XG5cbiAgICBsZXQgc3RvcmVEYXRhT2JqZWN0ID0gdGhpcy5fc3RvcmVEYXRhT2JqZWN0O1xuICAgIGxldCB0eXBlID0gdGhpcy5fZ2V0VHlwZU9mT2JqZWN0KGlzUmVwb3J0ZXIpO1xuXG4gICAgaWYgKCFzdG9yZURhdGFPYmplY3QgfHwgIXN0b3JlRGF0YU9iamVjdFt0eXBlXSB8fCAhc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXSkge1xuICAgICAgbG9nLmxvZygnW1N0b3JlRGF0YU9iamVjdHMgLSBkZWxldGVdIC0gbm90IHNhdmVkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0b3JlRGF0YU9iamVjdFt0eXBlXSAmJiBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdICYmIHJlc291cmNlICYmIGF0dHJpYnV0ZSAmJiB2YWx1ZSkge1xuXG4gICAgICBpZiAoYXR0cmlidXRlID09PSAnc3Vic2NyaXB0aW9ucycgfHwgYXR0cmlidXRlID09PSAnc3Vic2NyaWJlclVzZXJzJykge1xuICAgICAgICB0aGlzLl9yZW1vdmVGcm9tQXJyYXkoc3RvcmVEYXRhT2JqZWN0W3R5cGVdLCByZXNvdXJjZSwgYXR0cmlidXRlLCB2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXVthdHRyaWJ1dGVdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zdG9yZURhdGFPYmplY3QgPSBzdG9yZURhdGFPYmplY3Q7XG4gICAgICBsZXQgZGIgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV0udXJsIDogJ3N5bmNoZXJNYW5hZ2VyOk9iamVjdFVSTHMnO1xuICAgICAgbGV0IHN0b3JhZ2UgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IHRoaXMuX3JlbW90ZXNbZGJdIDogdGhpcy5fc3RvcmFnZU1hbmFnZXI7XG4gICAgICBsZXQgdGFibGUgPSBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdLmJhY2t1cCA/IGRiLnNwbGl0KCcvJylbM10gOiB0aGlzLl90YWJsZTtcbiAgICAgIGxldCBkYXRhID0gc3RvcmVEYXRhT2JqZWN0W3R5cGVdW3Jlc291cmNlXS5iYWNrdXAgPyBzdG9yZURhdGFPYmplY3RbdHlwZV1bcmVzb3VyY2VdIDogdGhpcy5fZmlsdGVyUmVtb3RlcyhzdG9yZURhdGFPYmplY3QpO1xuICAgICAgc3RvcmFnZS5zZXQoZGIsIDEsIGRhdGEsIHRhYmxlKTtcblxuICAgICAgcmV0dXJuIHN0b3JlRGF0YU9iamVjdFt0eXBlXVtyZXNvdXJjZV07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBEYXRhIE9iamVjdCBmcm9tIHRoZSBzdG9yYWdlXG4gICAqL1xuXG4gIGRlbGV0ZVJlc291cmNlKHJlc291cmNlKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgaWYgKHJlc291cmNlKSB7XG4gICAgICAgIC8vICAgICAgICByZXR1cm4gdGhpcy5nZXRBbGwoKS50aGVuKChzdG9yZWREYXRhT2JqZWN0cykgPT4ge1xuICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3RTdG9yYWdlLmRlbGV0ZVJlc291cmNlXSBkZWxldGluZzogJywgcmVzb3VyY2UpO1xuXG4gICAgICAgIC8vICAgICAgICAgIGxldCB0aGlzLl9zdG9yZURhdGFPYmplY3QgPSBPYmplY3QuYXNzaWduKHRoaXMuX3N0b3JlRGF0YU9iamVjdCB8fCB7fSk7XG5cbiAgICAgICAgbGV0IGJhY2t1cDtcbiAgICAgICAgbGV0IGRiO1xuICAgICAgICBsZXQgc3RvcmFnZTtcblxuICAgICAgICBpZiAoX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnb2JzZXJ2ZXJzJykgJiYgX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5vYnNlcnZlcnMuaGFzT3duUHJvcGVydHkocmVzb3VyY2UpKSB7XG4gICAgICAgICAgYmFja3VwID0gKF90aGlzLl9zdG9yZURhdGFPYmplY3Qub2JzZXJ2ZXJzW3Jlc291cmNlXS5iYWNrdXApID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgICAgZGIgPSBiYWNrdXAgPyBfdGhpcy5fc3RvcmVEYXRhT2JqZWN0Lm9ic2VydmVyc1tyZXNvdXJjZV0udXJsIDogJ3N5bmNoZXJNYW5hZ2VyOk9iamVjdFVSTHMnO1xuICAgICAgICAgIHN0b3JhZ2UgPSBiYWNrdXAgPyBfdGhpcy5fcmVtb3Rlc1tkYl0gOiBfdGhpcy5fc3RvcmFnZU1hbmFnZXI7XG4gICAgICAgICAgZGVsZXRlIF90aGlzLl9zdG9yZURhdGFPYmplY3Qub2JzZXJ2ZXJzW3Jlc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChfdGhpcy5fc3RvcmVEYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KCdyZXBvcnRlcnMnKSAmJiBfdGhpcy5fc3RvcmVEYXRhT2JqZWN0LnJlcG9ydGVycy5oYXNPd25Qcm9wZXJ0eShyZXNvdXJjZSkpIHtcbiAgICAgICAgICBiYWNrdXAgPSAoX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5yZXBvcnRlcnNbcmVzb3VyY2VdLmJhY2t1cCkgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICBkYiA9IGJhY2t1cCA/IF90aGlzLl9zdG9yZURhdGFPYmplY3QucmVwb3J0ZXJzW3Jlc291cmNlXS51cmwgOiAnc3luY2hlck1hbmFnZXI6T2JqZWN0VVJMcyc7XG4gICAgICAgICAgc3RvcmFnZSA9IGJhY2t1cCA/IF90aGlzLl9yZW1vdGVzW2RiXSA6IF90aGlzLl9zdG9yYWdlTWFuYWdlcjtcbiAgICAgICAgICBkZWxldGUgX3RoaXMuX3N0b3JlRGF0YU9iamVjdC5yZXBvcnRlcnNbcmVzb3VyY2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gICAgICAgICAgdGhpcy5fc3RvcmVEYXRhT2JqZWN0ID0gdGhpcy5fc3RvcmVEYXRhT2JqZWN0O1xuXG4gICAgICAgIGlmIChiYWNrdXAgJiYgc3RvcmFnZSkge1xuICAgICAgICAgIHN0b3JhZ2UuZGVsZXRlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBkZWxldGUgX3RoaXMuX3JlbW90ZXNbZGJdO1xuICAgICAgICAgICAgX3RoaXMuX3N0b3JhZ2VNYW5hZ2VyLmRlbGV0ZShyZXNvdXJjZSwgbnVsbCwgJ3JlbW90ZXMnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdG9yYWdlLnNldChkYiwgMSwgdGhpcy5fZmlsdGVyUmVtb3RlcyhfdGhpcy5fc3RvcmVEYXRhT2JqZWN0KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuXG4gICAgICAgIC8vICAgICAgICB9KTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignW1N0b3JlRGF0YU9iamVjdHNdIC0gQ2FuXFwndCBkZWxldGUgdGhpcyAnICsgcmVzb3VyY2UpKTtcbiAgICAgIH1cblxuICAgIH0pO1xuXG4gIH1cblxuICBnZXRBbGwoKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF90aGlzLl9zdG9yZURhdGFPYmplY3QgPSB0aGlzLl9zdG9yYWdlTWFuYWdlci5nZXQoJ3N5bmNoZXJNYW5hZ2VyOk9iamVjdFVSTHMnKS50aGVuKChvYmplY3RzKSA9PiB7XG4gICAgICAgIF90aGlzLl9zdG9yZURhdGFPYmplY3QgPSBvYmplY3RzO1xuICAgICAgICBfdGhpcy5sb2FkUmVtb3RlKHRydWUpLnRoZW4oKHN0b3JlZE9iamVjdHMpID0+IHtcbiAgICAgICAgICByZXNvbHZlKF90aGlzLl9zdG9yZURhdGFPYmplY3QpO1xuICAgICAgICB9KTtcblxuICAgICAgfSk7XG5cbiAgICB9KTtcbiAgICAvLyAgICByZXR1cm4gdGhpcy5fc3RvcmFnZU1hbmFnZXIuZ2V0KCdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJyk7XG4gIH1cblxuICAvLyBUbyBzeW5jIGxvY2FsIHN0b3JhZ2Ugd2l0aCByZW1vdGUgc3RvcmFnZSBzZXJ2ZXJcblxuICBzeW5jKHJlc291cmNlLCBiYWNrdXBSZXZpc2lvbiwgb25jZSA9IHRydWUpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKF90aGlzLl9yZW1vdGVzW3Jlc291cmNlXSkge1xuXG4gICAgICBsZXQgdGFibGUgPSByZXNvdXJjZS5zcGxpdCgnLycpWzNdO1xuXG4gICAgICBpZiAoYmFja3VwUmV2aXNpb24pIHJldHVybiBfdGhpcy5fc3luYyhyZXNvdXJjZSwgYmFja3VwUmV2aXNpb24sIG9uY2UsIHRhYmxlKTtcbiAgICAgIGVsc2UgX3RoaXMuX3JlbW90ZXNbcmVzb3VyY2VdLmdldEJhY2t1cFJldmlzaW9uKHJlc291cmNlKS50aGVuKChiYWNrdXBSZXZpc2lvbikgPT4ge1xuICAgICAgICByZXR1cm4gX3RoaXMuX3N5bmMocmVzb3VyY2UsIGJhY2t1cFJldmlzaW9uLCBvbmNlLCB0YWJsZSk7XG5cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaW5mbyA9ICdbRGF0YU9iamVjdFN0b3JhZ2Uuc3luY10gSW5mbzogJyArIHJlc291cmNlICsgJyBpcyBub3Qgc3luY2hlZCB3aXRoIHJlbW90ZSBzdG9yYWdlLidcbiAgICAgIGxvZy5pbmZvKGluZm8pO1xuICAgICAgLy8gICAgICAgICAgcmVqZWN0KGluZm8pO1xuICAgIH1cbiAgfVxuXG4gIF9zeW5jKHJlc291cmNlLCBiYWNrdXBSZXZpc2lvbiwgb25jZSwgdGFibGUpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0U3RvcmFnZS5fc3luY10gYmFja3VwUmV2aXNpb246ICcsIGJhY2t1cFJldmlzaW9uKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGxldCBvcHRpb25zID0geyB0YWJsZTogdGFibGUsIG9ic2VydmVyOiBmYWxzZSwgc3luY2VkUmV2aXNpb246IGJhY2t1cFJldmlzaW9uICsgMyB9O1xuXG4gICAgICBfdGhpcy5fcmVtb3Rlc1tyZXNvdXJjZV0uY29ubmVjdChvcHRpb25zKS50aGVuKCgpID0+IHtcbiAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0U3RvcmFnZS5zeW5jXSBjb25uZWN0ZWQgd2l0aCByZW1vdGUgJyk7XG5cbiAgICAgICAgX3RoaXMuX3JlbW90ZXNbcmVzb3VyY2VdLmdldChudWxsLCBudWxsLCB0YWJsZSkudGhlbigoZGF0YU9iamVjdCkgPT4ge1xuICAgICAgICAgIC8vICAgICAgICAgIHRoaXMuX3JlbW90ZXNbcmVzb3VyY2VdLmdldCgpLnRoZW4oKGRhdGFPYmplY3QpPT57XG4gICAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0U3RvcmFnZS5zeW5jXSByZXR1cm5pbmcgc3luY2hlZCBETzogJywgZGF0YU9iamVjdCk7XG5cbiAgICAgICAgICBpZiAob25jZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIF90aGlzLl9yZW1vdGVzW3Jlc291cmNlXS5kaXNjb25uZWN0KCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0U3RvcmFnZS5zeW5jXSBkaXNjb25uZWN0ZWQgJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhT2JqZWN0W3Jlc291cmNlXSk7XG4gICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignW0RhdGFPYmplY3RTdG9yYWdlLnN5bmNdIEVycm9yIHN5bmNoaW5nIHdpdGggcmVtb3RlIHN0b3JhZ2UnKTtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDIwMDApXG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZGF0YU9iamVjdFtyZXNvdXJjZV0pO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ1tEYXRhT2JqZWN0U3RvcmFnZS5zeW5jXSBFcnJvciByZXRyaWV2aW5nIHN0b3JlZCBkYXRhIG9iamVjdCcpO1xuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSk7XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgbG9nLmVycm9yKCdbRGF0YU9iamVjdFN0b3JhZ2Uuc3luY10gRXJyb3IgY29ubmVjdGluZyB0byByZW1vdGUgc3RvcmFnZSAnLCBlcnJvcik7XG4gICAgICAgIF90aGlzLl9yZW1vdGVzW3Jlc291cmNlXS5nZXQobnVsbCwgbnVsbCwgdGFibGUpLnRoZW4oKGRhdGFPYmplY3QpID0+IHtcbiAgICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3RTdG9yYWdlLnN5bmNdIHJldHVybmluZyBzeW5jaGVkIERPOiAnLCBkYXRhT2JqZWN0KTtcbiAgICAgICAgICByZXNvbHZlKGRhdGFPYmplY3RbcmVzb3VyY2VdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0b3BTeW5jKHJlc291cmNlKSB7XG5cbiAgICBpZiAodGhpcy5fcmVtb3Rlc1tyZXNvdXJjZV0pIHRoaXMuX3JlbW90ZXNbcmVzb3VyY2VdLmRpc2Nvbm5lY3QoKTtcblxuICB9XG5cbiAgLyoqXG4qIEBkZXNjcmlwdGlvbiBzaG91bGQgbG9vayBmb3IgYSBzcGVjaWZpYyBkYXRhT2JqZWN0VVJMXG4qXG4qIEBwYXJhbSB7RGF0YU9iamVjdFVSTH0gcmVzb3VyY2UgLSB0aGUgZGF0YU9iamVjdFVSTCB3aWxsIGJlIHNlYXJjaGVkXG4qXG4qIEByZXR1cm5zIFByb21pc2U8T2JqZWN0PiBvYmplY3Qgd2l0aCB0aGUgZGF0YU9iamVjdCBpbmZvcm1hdGlvbjtcbiovXG4gIGdldERhdGFPYmplY3QocmVzb3VyY2UpIHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIC8qICAgICAgdGhpcy5fcmVtb3Rlc1tyZXNvdXJjZV0uZ2V0KCkudGhlbigoZGF0YU9iamVjdCk9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGRhdGFPYmplY3QpO1xuICAgICAgICAgICAgfSAsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5fc3RvcmFnZU1hbmFnZXIuZ2V0KCdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJykudGhlbigoc3RvcmVkRGF0YU9iamVjdCkgPT4geyovXG5cbiAgICAgIGxldCBzdG9yZWREYXRhT2JqZWN0ID0gdGhpcy5fc3RvcmVEYXRhT2JqZWN0O1xuXG4gICAgICBsZXQgb2JzZXJ2ZXJzID0gc3RvcmVkRGF0YU9iamVjdC5oYXNPd25Qcm9wZXJ0eSgnb2JzZXJ2ZXJzJykgPyBzdG9yZWREYXRhT2JqZWN0Lm9ic2VydmVycyA6IHt9O1xuICAgICAgbGV0IHJlcG9ydGVycyA9IHN0b3JlZERhdGFPYmplY3QuaGFzT3duUHJvcGVydHkoJ3JlcG9ydGVycycpID8gc3RvcmVkRGF0YU9iamVjdC5yZXBvcnRlcnMgOiB7fTtcblxuICAgICAgbGV0IGN1cnJlbnRSZXBvcnRlciA9IE9iamVjdC5rZXlzKHJlcG9ydGVycykuZmluZCgodmFsdWUpID0+IHsgcmV0dXJuIHZhbHVlID09PSByZXNvdXJjZTsgfSk7XG4gICAgICBsZXQgY3VycmVudE9ic2VydmVyID0gT2JqZWN0LmtleXMob2JzZXJ2ZXJzKS5maW5kKCh2YWx1ZSkgPT4geyByZXR1cm4gdmFsdWUgPT09IHJlc291cmNlOyB9KTtcbiAgICAgIGxldCBkYXRhT2JqZWN0O1xuXG4gICAgICBpZiAoY3VycmVudE9ic2VydmVyKSB7IGRhdGFPYmplY3QgPSBzdG9yZWREYXRhT2JqZWN0Lm9ic2VydmVyc1tjdXJyZW50T2JzZXJ2ZXJdOyB9XG4gICAgICBpZiAoY3VycmVudFJlcG9ydGVyKSB7IGRhdGFPYmplY3QgPSBzdG9yZWREYXRhT2JqZWN0LnJlcG9ydGVyc1tjdXJyZW50UmVwb3J0ZXJdOyB9XG5cbiAgICAgIGxvZy5pbmZvKCdbU3RvcmVEYXRhT2JqZWN0cyAtIGdldERhdGFPYmplY3RdIC0gZm9yIG9ic2VydmVyOiAnLCBjdXJyZW50T2JzZXJ2ZXIpO1xuICAgICAgbG9nLmluZm8oJ1tTdG9yZURhdGFPYmplY3RzIC0gZ2V0RGF0YU9iamVjdF0gLSBmb3IgcmVwb3J0ZXJzOiAnLCBjdXJyZW50UmVwb3J0ZXIpO1xuXG4gICAgICBsb2cuaW5mbygnW1N0b3JlRGF0YU9iamVjdHMgLSBnZXREYXRhT2JqZWN0XSAtIHJlc29sdmU6ICcsIGRhdGFPYmplY3QpO1xuICAgICAgcmV0dXJuIGRhdGFPYmplY3QgPyByZXNvbHZlKGRhdGFPYmplY3QpIDogcmVqZWN0KCdObyBkYXRhT2JqZWN0IHdhcyBmb3VuZCcpO1xuXG4gICAgICAvLyAgICAgICAgfSk7XG5cbiAgICAgIC8vICAgICAgfSk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gc2hvdWxkIGdldCB0aGUgZGF0YU9iamVjdCBpbmZvcm1hdGlvbiBieSB0aGUgbWVzc2FnZVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gbXNnIC0gbWVzc2FnZSB3b3VsZCBiZSBhbmFsaXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgZGF0YU9iamVjdCBpbmZvcm1hdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzUmVwb3J0ZXIgLSB0aGUgb2JqZWN0IHRvIGJlIHNhdmVkIGlzIGEgcmVwb3J0ZXJcbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZTxvYmplY3Q+IHNob3VsZCByZXR1biBhbiBvYmplY3Qgd2l0aCB0aGUgZGF0YU9iamVjdCBvciBudWxsXG4gICAqL1xuICBnZXRSZXNvdXJjZXNCeUNyaXRlcmlhKG1zZywgaXNSZXBvcnRlcikge1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cbiAgICAgIGxldCB0eXBlID0gdGhpcy5fZ2V0VHlwZU9mT2JqZWN0KGlzUmVwb3J0ZXIpO1xuXG4gICAgICAvLyAgICAgIHRoaXMuZ2V0QWxsKGlzUmVwb3J0ZXIpLnRoZW4oKHN0b3JlZERhdGFPYmplY3RzKSA9PiB7XG4gICAgICBsZXQgc3RvcmVkRGF0YU9iamVjdHMgPSB0aGlzLl9zdG9yZURhdGFPYmplY3Q7XG5cbiAgICAgIGlmICghc3RvcmVkRGF0YU9iamVjdHMpIHtcbiAgICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3RzU3RvcmFnZS5nZXRSZXNvdXJjZXNCeUNyaXRlcmlhXSBkb25cXCd0IGhhdmUgc3RvcmVkIGRhdGEgb2JqZWN0cycpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShudWxsKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1zZy5ib2R5ICYmIG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdyZXN1bWUnKSAmJiAhbXNnLmJvZHkucmVzdW1lKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKG51bGwpO1xuICAgICAgfVxuXG4gICAgICAvLyBjaGVjayBpZiB0aGUgbWVzc2FnZSBoYXZlIG90aGVyIGNyaXRlcmlhXG4gICAgICAvLyBpZiBub3Qgc2VhcmNoIGZvciBvbiB0aGUgJ2Zyb20nIG9mIHRoZSBtZXNzYWdlLlxuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgbGV0IGhhc1N1YnNjcmlwdGlvbiA9IHRoaXMuX2hhc1N1YnNjcmlwdGlvbihzdG9yZWREYXRhT2JqZWN0c1t0eXBlXSwgbXNnLmZyb20pO1xuICAgICAgbGV0IGlzT3duZXIgPSB0aGlzLl9zZWFyY2hPd25lcihzdG9yZWREYXRhT2JqZWN0c1t0eXBlXSwgbXNnLmZyb20pO1xuICAgICAgbGV0IGlzVG9Qcm90b1N0dWJSZXN1bWUgPSB0aGlzLl9jaGVja1Byb3Rvc3R1YlJlc3VtZShzdG9yZWREYXRhT2JqZWN0cywgbXNnKTtcbiAgICAgIGxvZy5sb2coJ1tTdG9yZWREYXRhT2JqZWN0cyAtIGdldFJlc291cmNlc0J5Q3JpdGVyaWFdOicsIHN0b3JlZERhdGFPYmplY3RzLCBtc2csIGhhc1N1YnNjcmlwdGlvbiwgaXNPd25lcik7XG4gICAgICBpZiAobXNnLmhhc093blByb3BlcnR5KCdmcm9tJykgJiYgaGFzU3Vic2NyaXB0aW9uIHx8IGlzT3duZXIgfHwgaXNUb1Byb3RvU3R1YlJlc3VtZSkge1xuICAgICAgICBsZXQgcmVzb3VyY2U7XG5cbiAgICAgICAgaWYgKGlzT3duZXIpIHtcbiAgICAgICAgICByZXNvdXJjZSA9IHRoaXMuX2dldFJlc291cmNlc0J5T3duZXIoc3RvcmVkRGF0YU9iamVjdHNbdHlwZV0sIG1zZy5mcm9tKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXNvdXJjZSA9IHRoaXMuX2dldFJlc291cmNlc0J5U3Vic2NyaXB0aW9uKHN0b3JlZERhdGFPYmplY3RzW3R5cGVdLCBtc2cuZnJvbSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaWRlbnRpdHlGb3VuZERhdGEgPSBbXTtcbiAgICAgICAgaWYgKG1zZy5ib2R5ICYmIG1zZy5ib2R5LmlkZW50aXR5KSBpZGVudGl0eUZvdW5kRGF0YSA9IHRoaXMuX2dldFJlc291cmNlc0J5SWRlbnRpdHkoc3RvcmVkRGF0YU9iamVjdHNbdHlwZV0sIG1zZy5ib2R5LmlkZW50aXR5KTtcblxuICAgICAgICAvL1RPRE86IHJlbW92ZSBzY2hlbWEgc2luY2UgbWV0YWRhdGEgYWxyZWFkeSBpbmNsdWRlcyB0aGUgc2NoZW1hP1xuXG4gICAgICAgIGxldCBzY2hlbWFGb3VuZERhdGEgPSBbXTtcbiAgICAgICAgaWYgKG1zZy5ib2R5ICYmIG1zZy5ib2R5LnNjaGVtYSkgc2NoZW1hRm91bmREYXRhID0gdGhpcy5fZ2V0UmVzb3VyY2VzQnlTY2hlbWEoc3RvcmVkRGF0YU9iamVjdHNbdHlwZV0sIG1zZy5ib2R5LnNjaGVtYSk7XG5cbiAgICAgICAgbGV0IG1ldGFkYXRhRm91bmQgPSBbXTtcbiAgICAgICAgaWYgKG1zZy5ib2R5ICYmIG1zZy5ib2R5LnZhbHVlKSB7XG4gICAgICAgICAgbGV0IG1ldGFkYXRhID0gbXNnLmJvZHkudmFsdWU7XG4gICAgICAgICAgZGVsZXRlIG1ldGFkYXRhLmRhdGE7XG4gICAgICAgICAgbWV0YWRhdGFGb3VuZCA9IHRoaXMuX2dldFJlc291cmNlc0J5TWV0YWRhdGEoc3RvcmVkRGF0YU9iamVjdHNbdHlwZV0sIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhRm91bmQgPSBbXTtcbiAgICAgICAgaWYgKG1zZy5ib2R5ICYmIG1zZy5ib2R5LnZhbHVlICYmIG1zZy5ib2R5LnZhbHVlLmRhdGEpIGRhdGFGb3VuZCA9IHRoaXMuX2dldFJlc291cmNlc0J5RGF0YShzdG9yZWREYXRhT2JqZWN0c1t0eXBlXSwgbXNnLmJvZHkudmFsdWUuZGF0YSk7XG5cbiAgICAgICAgLy8geW91IGNhbiBwYXNzIGFzIGFycmF5cyBhcyB5b3Ugd2FudC4uIGl0IHdpbGwgYmUgbWVyZ2VkIGluIG9uIHBsYWNlXG4gICAgICAgIC8vIHJlbW92ZWQgZHVwbGljYXRlcztcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5faW50ZXJzZWN0aW9uKHJlc291cmNlLCBpZGVudGl0eUZvdW5kRGF0YSwgc2NoZW1hRm91bmREYXRhLCBkYXRhRm91bmQsIG1ldGFkYXRhRm91bmQpO1xuXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09IDAgJiYgaXNUb1Byb3RvU3R1YlJlc3VtZSAmJiB0eXBlID09ICdvYnNlcnZlcnMnICYmIG1zZy5mcm9tLnNwbGl0KCdwcm90b3N0dWInKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbGV0IHN0b3JlZE9ic2VydmVycyA9IHN0b3JlZERhdGFPYmplY3RzW3R5cGVdO1xuICAgICAgICAgIGxldCBmcm9tRG9tYWluID0gZGl2aWRlVVJMKG1zZy5mcm9tKS5kb21haW47XG4gICAgICAgICAgT2JqZWN0LmtleXMoc3RvcmVkT2JzZXJ2ZXJzKS5maWx0ZXIoKG9iamVjdFVSTCkgPT4ge1xuICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbnMgPSBzdG9yZWRPYnNlcnZlcnNbb2JqZWN0VVJMXS5zdWJzY3JpcHRpb25zO1xuICAgICAgICAgICAgbGV0IGhhc1N1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbkRvbWFpbiA9IGRpdmlkZVVSTChzdWJzY3JpcHRpb24pLmRvbWFpbjtcbiAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbkRvbWFpbiA9PSBmcm9tRG9tYWluKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob2JqZWN0VVJMKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBpbml0ID0ge307XG4gICAgICByZXN1bHQuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGxldCBjdXJyZW50SXNSZXBvcnRlciA9IHN0b3JlZERhdGFPYmplY3RzW3R5cGVdW2tleV07XG4gICAgICAgIGluaXRba2V5XSA9IGN1cnJlbnRJc1JlcG9ydGVyO1xuICAgICAgICByZXR1cm4gaW5pdDtcbiAgICAgIH0pO1xuXG4gICAgICBsb2cubG9nKCdbU3RvcmUgRGF0YSBPYmplY3RzXSAtICcsIGluaXQpO1xuXG4gICAgICByZXNvbHZlKGluaXQpO1xuICAgIH0pO1xuXG4gICAgLy8gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBfZ2V0UmVzb3VyY2VzQnlJZGVudGl0eShzdG9yZWREYXRhLCB1c2VyVVJMKSB7XG4gICAgaWYgKCFzdG9yZWREYXRhKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc3RvcmVkRGF0YSkuZmlsdGVyKChvYmplY3RVUkwpID0+IHtcbiAgICAgIHJldHVybiBzdG9yZWREYXRhW29iamVjdFVSTF0uc3Vic2NyaWJlclVzZXJzLmZpbHRlcigoY3VycmVudCkgPT4ge1xuICAgICAgICByZXR1cm4gY3VycmVudCA9PT0gdXNlclVSTDtcbiAgICAgIH0pLmxlbmd0aDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBfZ2V0UmVzb3VyY2VzQnlPd25lcihzdG9yZWREYXRhLCBvd25lcikge1xuICAgIGlmICghc3RvcmVkRGF0YSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhzdG9yZWREYXRhKS5maWx0ZXIoKG9iamVjdFVSTCkgPT4ge1xuICAgICAgcmV0dXJuIHN0b3JlZERhdGFbb2JqZWN0VVJMXS5yZXBvcnRlciA9PT0gb3duZXI7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHRvZG8gZG9jdW1lbnRhdGlvblxuICAgKi9cbiAgX2dldFJlc291cmNlc0J5U3Vic2NyaXB0aW9uKHN0b3JlZERhdGEsIHN1YnNjcmlwdGlvbikge1xuICAgIGlmICghc3RvcmVkRGF0YSkgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0b3JlZERhdGEpLmZpbHRlcigob2JqZWN0VVJMKSA9PiB7XG4gICAgICByZXR1cm4gc3RvcmVkRGF0YVtvYmplY3RVUkxdLnN1YnNjcmlwdGlvbnMuZmlsdGVyKChjdXJyZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBjdXJyZW50ID09PSBzdWJzY3JpcHRpb247XG4gICAgICB9KS5sZW5ndGg7XG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBfZ2V0UmVzb3VyY2VzQnlTY2hlbWEoc3RvcmVkRGF0YSwgc2NoZW1hKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0b3JlZERhdGEpLmZpbHRlcigob2JqZWN0VVJMKSA9PiB7XG4gICAgICBsZXQgY3VycmVudE9iamVjdCA9IHN0b3JlZERhdGFbb2JqZWN0VVJMXTtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhjdXJyZW50T2JqZWN0KS5maWx0ZXIoKGtleSkgPT4ge1xuICAgICAgICByZXR1cm4ga2V5ID09PSAnc2NoZW1hJyAmJiBjdXJyZW50T2JqZWN0W2tleV0gPT09IHNjaGVtYTtcbiAgICAgIH0pLmxlbmd0aDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBfZ2V0UmVzb3VyY2VzQnlNZXRhZGF0YShzdG9yZWREYXRhLCBtZXRhZGF0YSkge1xuICAgIGlmICghbWV0YWRhdGEpIHJldHVybiBbXTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhzdG9yZWREYXRhKS5maWx0ZXIoKG9iamVjdFVSTCkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRPYmplY3QgPSBzdG9yZWREYXRhW29iamVjdFVSTF07XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMoY3VycmVudE9iamVjdCkuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgICAgLy8gc2VhcmNoIG9uIHN0b3JlRGF0YU9iamVjdHMgZm9yIHNwZWNpZmljIGtleSBwcm92aWRlZCBmcm9tIGRhdGE7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhtZXRhZGF0YSkuZmlsdGVyKHNlYXJjaEZvciA9PiB7XG4gICAgICAgICAgcmV0dXJuIGtleSA9PT0gc2VhcmNoRm9yICYmIGN1cnJlbnRPYmplY3Rba2V5XSA9PT0gbWV0YWRhdGFbc2VhcmNoRm9yXTtcbiAgICAgICAgfSkubGVuZ3RoO1xuXG4gICAgICB9KS5sZW5ndGg7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHRvZG8gZG9jdW1lbnRhdGlvblxuICAgKi9cbiAgX2dldFJlc291cmNlc0J5RGF0YShzdG9yZWREYXRhLCBkYXRhKSB7XG4gICAgaWYgKCFkYXRhKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc3RvcmVkRGF0YSkuZmlsdGVyKChvYmplY3RVUkwpID0+IHtcbiAgICAgIGxldCBjdXJyZW50T2JqZWN0ID0gc3RvcmVkRGF0YVtvYmplY3RVUkxdLmhhc093blByb3BlcnR5KCdkYXRhJykgPyBzdG9yZWREYXRhW29iamVjdFVSTF0uZGF0YSA6IHt9O1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGN1cnJlbnRPYmplY3QpLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgICAgIC8vIHNlYXJjaCBvbiBzdG9yZURhdGFPYmplY3RzIGZvciBzcGVjaWZpYyBrZXkgcHJvdmlkZWQgZnJvbSBkYXRhO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoZGF0YSkuZmlsdGVyKHNlYXJjaEZvciA9PiB7XG4gICAgICAgICAgcmV0dXJuIGtleSA9PT0gc2VhcmNoRm9yICYmIGN1cnJlbnRPYmplY3Rba2V5XSA9PT0gZGF0YVtzZWFyY2hGb3JdO1xuICAgICAgICB9KS5sZW5ndGg7XG5cbiAgICAgIH0pLmxlbmd0aDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBfaGFzU3Vic2NyaXB0aW9uKHN0b3JlZERhdGEsIHN1YnNjcmlwdGlvbikge1xuICAgIGlmICghc3RvcmVkRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0b3JlZERhdGEpLmZpbHRlcigob2JqZWN0VVJMKSA9PiB7XG4gICAgICByZXR1cm4gc3RvcmVkRGF0YVtvYmplY3RVUkxdLnN1YnNjcmlwdGlvbnMuZmlsdGVyKChjdXJyZW50KSA9PiB7XG4gICAgICAgIHJldHVybiBjdXJyZW50ID09PSBzdWJzY3JpcHRpb247XG4gICAgICB9KS5sZW5ndGg7XG4gICAgfSkubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBfc2VhcmNoT3duZXIoc3RvcmVkRGF0YSwgZnJvbSkge1xuICAgIGlmICghc3RvcmVkRGF0YSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0b3JlZERhdGEpLmZpbHRlcigob2JqZWN0VVJMKSA9PiB7XG4gICAgICByZXR1cm4gc3RvcmVkRGF0YVtvYmplY3RVUkxdLnJlcG9ydGVyID09PSBmcm9tO1xuICAgIH0pLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHRvZG8gZG9jdW1lbnRhdGlvblxuICAgKi9cbiAgX2NoZWNrUHJvdG9zdHViUmVzdW1lKHN0b3JlZERhdGFPYmplY3RzLCBtc2cpIHtcblxuICAgIGlmICghc3RvcmVkRGF0YU9iamVjdHMpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChtc2cuaGFzT3duUHJvcGVydHkoJ2JvZHknKSAmJiBtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSAmJiBtc2cuYm9keS52YWx1ZS5oYXNPd25Qcm9wZXJ0eSgncmVwb3J0ZXInKSkge1xuICAgICAgbGV0IHJlcG9ydGVyID0gbXNnLmJvZHkudmFsdWUucmVwb3J0ZXI7XG4gICAgICBpZiAoc3RvcmVkRGF0YU9iamVjdHMuaGFzT3duUHJvcGVydHkoJ3JlcG9ydGVycycpKSB7XG4gICAgICAgIGxldCByZXBvcnRlcnNTdG9yZWQgPSBzdG9yZWREYXRhT2JqZWN0cy5yZXBvcnRlcnM7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXBvcnRlcnNTdG9yZWQpLmZpbHRlcigob2JqZWN0VVJMKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlcG9ydGVyc1N0b3JlZFtvYmplY3RVUkxdLnJlcG9ydGVyID09PSByZXBvcnRlcjtcbiAgICAgICAgfSkubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHN0b3JlZERhdGFPYmplY3RzLmhhc093blByb3BlcnR5KCdvYnNlcnZlcnMnKSkge1xuICAgICAgbGV0IHN0b3JlZE9ic2VydmVycyA9IHN0b3JlZERhdGFPYmplY3RzLm9ic2VydmVycztcbiAgICAgIGxldCBmcm9tRG9tYWluID0gZGl2aWRlVVJMKG1zZy5mcm9tKS5kb21haW47XG5cbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzdG9yZWRPYnNlcnZlcnMpLmZpbHRlcigob2JqZWN0VVJMKSA9PiB7XG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gc3RvcmVkT2JzZXJ2ZXJzW29iamVjdFVSTF0uc3Vic2NyaXB0aW9ucztcbiAgICAgICAgbGV0IGhhc1N1YnNjcmlwdGlvbiA9IGZhbHNlO1xuICAgICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICAgICAgICAgIGxldCBzdWJzY3JpcHRpb25Eb21haW4gPSBkaXZpZGVVUkwoc3Vic2NyaXB0aW9uKS5kb21haW47XG4gICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbkRvbWFpbiA9PSBmcm9tRG9tYWluKSB7XG4gICAgICAgICAgICBoYXNTdWJzY3JpcHRpb24gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChoYXNTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSkubGVuZ3RoID4gMCA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHRvZG8gZG9jdW1lbnRhdGlvblxuICAgKi9cbiAgX2lzT3duZXIodmFsdWUsIHVybCkge1xuICAgIGlmICghdmFsdWUpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdmFsdWUucmVwb3J0ZXIgPT09IHVybCA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdG9kbyBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBfaW50ZXJzZWN0aW9uKCkge1xuICAgIGxldCBhcmdzID0gQXJyYXkuZnJvbShhcmd1bWVudHMpO1xuXG4gICAgbGV0IHJlc3VsdCA9IGFyZ3MucmVkdWNlKChmaXJzdCwgc2Vjb25kKSA9PiB7XG4gICAgICByZXR1cm4gZmlyc3QuY29uY2F0KHNlY29uZCk7XG4gICAgfSkuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHtcbiAgICAgIHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDtcbiAgICB9KTtcbiAgICBsb2cubG9nKCdEYXRhT2JqZWN0c1N0b3JhZ2UuX2ludGVyc2VjdGlvbl0gUmVzdWx0IGFuIHVuaXF1ZSBhcnJheSBvZiBzdHJpbmdzOiAnLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHRvZG8gZG9jdW1lbnRhdGlvblxuICAgKi9cbiAgX3VwZGF0ZVRvQXJyYXkoc3RvcmVEYXRhT2JqZWN0LCByZXNvdXJjZSwga2V5LCB2YWx1ZSkge1xuICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0c1N0b3JhZ2VdIC0gX3VwZGF0ZVRvQXJyYXk6ICcsIHN0b3JlRGF0YU9iamVjdCwgcmVzb3VyY2UsIGtleSwgdmFsdWUpO1xuICAgIGlmIChzdG9yZURhdGFPYmplY3RbcmVzb3VyY2VdW2tleV0uaW5kZXhPZih2YWx1ZSkgPT09IC0xKSBzdG9yZURhdGFPYmplY3RbcmVzb3VyY2VdW2tleV0ucHVzaCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHRvZG8gZG9jdW1lbnRhdGlvblxuICAgKi9cbiAgX3JlbW92ZUZyb21BcnJheShzdG9yZURhdGFPYmplY3QsIHJlc291cmNlLCBrZXksIHZhbHVlKSB7XG4gICAgbGV0IGluZGV4T2ZWYWx1ZSA9IHN0b3JlRGF0YU9iamVjdFtyZXNvdXJjZV1ba2V5XS5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAoaW5kZXhPZlZhbHVlID09PSAtMSkgc3RvcmVEYXRhT2JqZWN0W3Jlc291cmNlXVtrZXldLnNwbGljZShpbmRleE9mVmFsdWUsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0b2RvIGRvY3VtZW50YXRpb25cbiAgICovXG4gIF9oYXNWYWx1ZShvYmosIGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gb2JqLmhhc093blByb3BlcnR5KGtleSkgJiYgb2JqW2tleV0gPT09IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEB0b2RvIGRvY3VtZW50YXRpb25cbiAgICovXG4gIF9nZXRUeXBlT2ZPYmplY3QoaXNSZXBvcnRlcikge1xuICAgIHJldHVybiBpc1JlcG9ydGVyID8gJ3JlcG9ydGVycycgOiAnb2JzZXJ2ZXJzJztcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IERhdGFPYmplY3RzU3RvcmFnZTtcbiIsImNsYXNzIFByb21pc2VRdWV1ZSB7XG5cbiAgLy8gVE9ETzogSW1wcm92ZSB0aGlzIFF1ZXVpbmdcbiAgY29uc3RydWN0b3IoY29uY3VycmVuY3kpIHtcbiAgICB0aGlzLmZsdXNoaW5nID0gZmFsc2U7XG4gICAgdGhpcy5Qcm9taXNlID0gUHJvbWlzZTtcbiAgICB0aGlzLmNvbmN1cnJlbmN5ID0gKHR5cGVvZiBjb25jdXJyZW5jeSAhPT0gJ251bWJlcicpID8gMSA6IGNvbmN1cnJlbmN5O1xuICAgIHRoaXMucHJvbWlzZXMgPSBbXTtcbiAgICB0aGlzLnF1ZXVlID0gW107XG4gICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGRvbmUoY2IpIHtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2I7XG4gIH1cblxuICBhZGQocHJvbWlzZSkge1xuICAgIHRoaXMucXVldWUucHVzaChwcm9taXNlKTtcblxuICAgIGlmICghdGhpcy5pc1Byb2Nlc3NpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1ZXVlLnJlZHVjZSgocHJvbWlzZUNoYWluLCBjdXJyZW50VGFzaykgPT4ge1xuICAgICAgICByZXR1cm4gcHJvbWlzZUNoYWluLnRoZW4oY2hhaW5SZXN1bHRzID0+IGN1cnJlbnRUYXNrLnRoZW4oY3VycmVudFJlc3VsdCA9PiBbLi4uY2hhaW5SZXN1bHRzLCBjdXJyZW50UmVzdWx0XSkpO1xuICAgICAgfSwgUHJvbWlzZS5yZXNvbHZlKFtdKSkudGhlbihhcnJheU9mUmVzdWx0cyA9PiB7XG4gICAgICAgIC8vIERvIHNvbWV0aGluZyB3aXRoIGFsbCByZXN1bHRzXG4gICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgIH1cbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb21pc2VRdWV1ZTtcblxuIiwiLy8gTG9nIFN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZScpO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUdVSUQsIGRlZXBDbG9uZSwgYXZhaWxhYmxlU3BhY2UgfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbmltcG9ydCBQcm9taXNlUXVldWUgZnJvbSAnLi4vdXRpbHMvUHJvbWlzZVF1ZXVlJztcblxuY2xhc3MgSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2Uge1xuXG4gIGNvbnN0cnVjdG9yKHJ1bnRpbWVVUkwsIGJ1cywgc3RvcmFnZU1hbmFnZXIsIGh5cGVydHlSZXNvdXJjZXMpIHtcblxuICAgIGlmICghc3RvcmFnZU1hbmFnZXIpIHRocm93IG5ldyBFcnJvcignW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlIGNvbnN0cnVjdG9yXSBtYW5kYXRvcnkgc3RvcmFnZU1hbmFnZXIgcGFyYW1ldGVyIG1pc3NpbmcnKTtcbiAgICBpZiAoIXJ1bnRpbWVVUkwpIHRocm93IG5ldyBFcnJvcignW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlIGNvbnN0cnVjdG9yXSBtYW5kYXRvcnkgcnVudGltZVVSTCBwYXJhbWV0ZXIgbWlzc2luZycpO1xuICAgIGlmICghYnVzKSB0aHJvdyBuZXcgRXJyb3IoJ1tIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZSBjb25zdHJ1Y3Rvcl0gbWFuZGF0b3J5IGJ1cyBwYXJhbWV0ZXIgbWlzc2luZycpO1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9idXMgPSBidXM7XG5cbiAgICBfdGhpcy5fc3RvcmFnZUxpbWl0ID0gMC45OyAvLyB0aGUgc2F2ZSBzdG9yYWdlTGltaXQ7XG5cbiAgICBfdGhpcy5fdXJsID0gcnVudGltZVVSTCArICcvc3RvcmFnZSc7XG5cbiAgICBfdGhpcy5fc3RvcmFnZU1hbmFnZXIgPSBzdG9yYWdlTWFuYWdlcjtcblxuICAgIF90aGlzLnByb21pc2VRdWV1ZSA9IG5ldyBQcm9taXNlUXVldWUoKTtcblxuICAgIF90aGlzLl9oeXBlcnR5UmVzb3VyY2VzID0gaHlwZXJ0eVJlc291cmNlcztcblxuICAgIGJ1cy5hZGRMaXN0ZW5lcihfdGhpcy5fdXJsLCAobXNnKSA9PiB7XG4gICAgICBsb2cuaW5mbygnW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlXSBNZXNzYWdlIFJDVjogJywgbXNnKTtcbiAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnY3JlYXRlJzogX3RoaXMuX29uQ3JlYXRlKG1zZyk7IGJyZWFrO1xuICAgICAgICBjYXNlICdyZWFkJzogX3RoaXMuX29uUmVhZChtc2cpOyBicmVhaztcbiAgICAgICAgY2FzZSAnZGVsZXRlJzogX3RoaXMuX29uRGVsZXRlKG1zZyk7IGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogY2hlY2sgdGhlIGF2YWlsYWJsZSBzdG9yYWdlIHF1b3RhXG4gICAqXG4gICAqIEBtZW1iZXJvZiBIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZVxuICAgKi9cbiAgY2hlY2tTdG9yYWdlUXVvdGEoKSB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICBpZiAodGhpcy5fYXZhaWxhYmxlUXVvdGEgJiYgdGhpcy5fdXNhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoYXZhaWxhYmxlU3BhY2UodGhpcy5fdXNhZ2UsIHRoaXMuX2F2YWlsYWJsZVF1b3RhKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuYXZpZ2F0b3IpIHtcblxuICAgICAgICBuYXZpZ2F0b3Iuc3RvcmFnZS5lc3RpbWF0ZSgpLnRoZW4oKGVzdGltYXRlKSA9PiB7XG4gICAgICAgICAgdGhpcy5fYXZhaWxhYmxlUXVvdGEgPSBlc3RpbWF0ZS5xdW90YTtcbiAgICAgICAgICB0aGlzLl91c2FnZSA9IGVzdGltYXRlLnVzYWdlO1xuICAgICAgICAgIHJlc29sdmUoYXZhaWxhYmxlU3BhY2UodGhpcy5fdXNhZ2UsIHRoaXMuX2F2YWlsYWJsZVF1b3RhKSk7XG5cbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICAgIGxvZy5lcnJvcignW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlXSBDaGVja1N0b3JhZ2VRdW90YSBlcnJvcjogJywgcmVhc29uKTtcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIH1cblxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIHNob3VsZCBzYXZlIGFuIEh5cGVydHlSZXNvdXJjZSBjb250YWluZWQgaW4gdGhlIGJvZHkgb2YgYSBjcmVhdGUgbWVzc2FnZSByZXF1ZXN0O1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgaHlwZXJ0eSByZXNvdXJjZSB0byBiZSBzdG9yZWRcbiAgICovXG5cbiAgX29uQ3JlYXRlKG1lc3NhZ2UpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAoIW1lc3NhZ2UuYm9keSB8fCAhbWVzc2FnZS5ib2R5LnZhbHVlKSB0aHJvdyBuZXcgRXJyb3IoJ1tIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZS5fb25DcmVhdGVdIG1hbmRhdG9yeSBtZXNzYWdlIGJvZHkgdmFsdWUgbWlzc2luZzogJywgbWVzc2FnZSk7XG5cbiAgICBsZXQgY29udGVudCA9IG1lc3NhZ2UuYm9keS52YWx1ZTtcbiAgICBsZXQgY29udGVudFVSTCA9IGNvbnRlbnQuY29udGVudFVSTDtcbiAgICBsZXQgcmVzb3VyY2VVUkwgPSAnJztcblxuICAgIGlmICghY29udGVudFVSTCkge1xuXG4gICAgICBjb250ZW50VVJMID0gW107XG4gICAgICByZXNvdXJjZVVSTCA9IF90aGlzLl91cmwgKyAnLycgKyBnZW5lcmF0ZUdVSUQoKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXJyZW50VVJMID0gY29udGVudFVSTFswXTtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gY3VycmVudFVSTC5zdWJzdHIoY3VycmVudFVSTC5sYXN0SW5kZXhPZignLycpICsgMSk7XG4gICAgICByZXNvdXJjZVVSTCA9IF90aGlzLl91cmwgKyAnLycgKyByZXNvdXJjZTtcbiAgICB9XG5cbiAgICBpZiAoIV90aGlzLl9oeXBlcnR5UmVzb3VyY2VzLmhhc093blByb3BlcnR5KHJlc291cmNlVVJMKSkge1xuXG4gICAgICBjb250ZW50VVJMLnB1c2gocmVzb3VyY2VVUkwpO1xuICAgICAgY29udGVudC5jb250ZW50VVJMID0gY29udGVudFVSTDtcblxuICAgIH1cblxuICAgIHRoaXMuX2h5cGVydHlSZXNvdXJjZXNbcmVzb3VyY2VVUkxdID0gY29udGVudDtcblxuICAgIHRoaXMucHJvbWlzZVF1ZXVlLmFkZCh0aGlzLl90b1NhdmUocmVzb3VyY2VVUkwsIG1lc3NhZ2UsIGNvbnRlbnQpKTtcblxuICB9XG5cbiAgX3RvU2F2ZShyZXNvdXJjZVVSTCwgbWVzc2FnZSwgY29udGVudCkge1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgY29uc3QgZXJyb3IgPSAocmVhc29uKSA9PiB7XG4gICAgICAgIGxldCByZXNwb25zZSA9IHtcbiAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxuICAgICAgICAgIHRvOiBtZXNzYWdlLmZyb20sXG4gICAgICAgICAgaWQ6IG1lc3NhZ2UuaWQsXG4gICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgICBib2R5OiB7IHZhbHVlOiByZXNvdXJjZVVSTCwgY29kZTogNTAwLCBkZXNjcmlwdGlvbjogcmVhc29uIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xuXG4gICAgICAgIHJldHVybiByZWplY3QocmVhc29uKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuY2hlY2tTdG9yYWdlUXVvdGEoKS50aGVuKChyZXN1bHQpID0+IHtcblxuICAgICAgICBpZiAoY29udGVudC5zaXplID4gcmVzdWx0LnF1b3RhKSB7XG4gICAgICAgICAgY29uc3QgbXNnID0gJ1RoZSBzdG9yYWdlIGRvIG5vdCBoYXZlIHNwYWNlIHRvIHN0b3JlIHRoYXQgcmVzb3VyY2UnO1xuICAgICAgICAgIGVycm9yKG1zZyk7XG4gICAgICAgICAgdGhyb3cgRXJyb3IobXNnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwYWNlQXZhaWxhYmxlID0gcmVzdWx0LnF1b3RhO1xuICAgICAgICBjb25zdCBhbGxvY2F0ZWQgPSByZXN1bHQudXNhZ2UgKyBjb250ZW50LnNpemU7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5wZXJjZW50ID49IHRoaXMuX3N0b3JhZ2VMaW1pdCB8fCBhbGxvY2F0ZWQgPiBzcGFjZUF2YWlsYWJsZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRPbGRlclJlc291cmNlcyhjb250ZW50LnNpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmFnZU1hbmFnZXIuc2V0KHJlc291cmNlVVJMLCAxLCBjb250ZW50KTtcbiAgICAgIH0pLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgIGxldCByZXNwb25zZSA9IHtcbiAgICAgICAgICBmcm9tOiBtZXNzYWdlLnRvLFxuICAgICAgICAgIHRvOiBtZXNzYWdlLmZyb20sXG4gICAgICAgICAgaWQ6IG1lc3NhZ2UuaWQsXG4gICAgICAgICAgdHlwZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgICBib2R5OiB7IHZhbHVlOiByZXNvdXJjZVVSTCwgY29kZTogMjAwIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xuXG4gICAgICAgIGxvZy5sb2coJ1N1Y2Nlc3MnKTtcblxuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuXG4gICAgICB9KS5jYXRjaChlcnJvcik7XG5cbiAgICB9KTtcblxuICB9XG5cbiAgX2dldE9sZGVyUmVzb3VyY2VzKHNpemUpIHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHRoaXMuX3N0b3JhZ2VNYW5hZ2VyLmdldCgpLnRoZW4oKHJlc3VsdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IE9iamVjdC5rZXlzKHJlc3VsdCk7XG5cbiAgICAgICAgbGV0IHRvdGFsID0gMDtcbiAgICAgICAgY29uc3QgcmVkdWNlZCA9IHJlc291cmNlcy5zb3J0KChhLCBiKSA9PiByZXN1bHRbYV0uY3JlYXRlZCA8IHJlc3VsdFtiXS5jcmVhdGVkKVxuICAgICAgICAgIC5yZWR1Y2UoKHByZXZpb3VzUmVzb3VyY2UsIGN1cnJlbnRSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuX2h5cGVydHlSZXNvdXJjZXNbY3VycmVudFJlc291cmNlXTtcblxuICAgICAgICAgICAgbG9nLmxvZygnW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlXSBfZ2V0T2xkZXJSZXNvdXJjZXM6ICcsIHRvdGFsLCBzaXplLCBjdXJyZW50UmVzb3VyY2UsIHRoaXMuX2F2YWlsYWJsZVF1b3RhKTtcblxuICAgICAgICAgICAgaWYgKHRvdGFsIDw9IHNpemUpIHtcbiAgICAgICAgICAgICAgdG90YWwgKz0gY3VycmVudC5zaXplO1xuICAgICAgICAgICAgICBwcmV2aW91c1Jlc291cmNlLnB1c2goY3VycmVudFJlc291cmNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzUmVzb3VyY2U7XG5cbiAgICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRpbmcgPSByZWR1Y2VkLm1hcChrZXkgPT4gdGhpcy5fc3RvcmFnZU1hbmFnZXIuZGVsZXRlKGtleSkpO1xuXG4gICAgICAgIFByb21pc2UuYWxsKGRlbGV0aW5nKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0pO1xuXG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIHNob3VsZCByZXR1cm4gYW4gSHlwZXJ0eVJlc291cmNlIHN0b3JlZCBpbiB0aGUgU3RvcmFnZSBNYW5hZ2VyIGlkZW50aWZpZWQgYnkgdGhlIGNvbnRlbnQgdXJsIGNvbnRhaW5lZCBpbiB0aGUgYm9keSBvZiBhIHJlYWQgbWVzc2FnZSByZXF1ZXN0O1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgaHlwZXJ0eSByZXNvdXJjZSB0byBiZSBzdG9yZWRcbiAgICovXG5cbiAgX29uUmVhZChtZXNzYWdlKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCFtZXNzYWdlLmJvZHkgfHwgIW1lc3NhZ2UuYm9keS5yZXNvdXJjZSkgdGhyb3cgbmV3IEVycm9yKCdbSHlwZXJ0eVJlc291cmNlc1N0b3JhZ2UuX29uUmVhZF0gbWFuZGF0b3J5IG1lc3NhZ2UgYm9keSByZXNvdXJjZSBtaXNzaW5nOiAnLCBtZXNzYWdlKTtcblxuICAgIGxldCBjb250ZW50VXJsID0gbWVzc2FnZS5ib2R5LnJlc291cmNlO1xuXG4gICAgbGV0IHJlc3BvbnNlID0ge1xuICAgICAgZnJvbTogbWVzc2FnZS50byxcbiAgICAgIHRvOiBtZXNzYWdlLmZyb20sXG4gICAgICBpZDogbWVzc2FnZS5pZCxcbiAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICBib2R5OiB7fVxuICAgIH07XG5cbiAgICAvLyBsZXQgY29udGVudCA9IF90aGlzLl9oeXBlcnR5UmVzb3VyY2VzW2NvbnRlbnRVcmxdO1xuXG4gICAgbG9nLmluZm8oJ1tIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZS5fb25SZWFkXSBnZXQgcmVzb3VyY2VVUkw6JywgY29udGVudFVybCk7XG5cbiAgICB0aGlzLl9zdG9yYWdlTWFuYWdlci5nZXQoJ3Jlc291cmNlVVJMJywgY29udGVudFVybCkudGhlbigoY29udGVudCkgPT4ge1xuXG4gICAgICBsb2cuaW5mbygnW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlLl9vblJlYWRdIGZvdW5kIGNvbnRlbnQ6JywgY29udGVudCk7XG5cbiAgICAgIGlmIChjb250ZW50KSB7XG5cbiAgICAgICAgaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgICBfdGhpcy5fb25SZWFkRmlsZShyZXNwb25zZSwgY29udGVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzcG9uc2UuYm9keS5jb2RlID0gMjAwO1xuICAgICAgICAgIHJlc3BvbnNlLmJvZHkucDJwID0gdHJ1ZTtcbiAgICAgICAgICByZXNwb25zZS5ib2R5LnZhbHVlID0gY29udGVudDtcbiAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZS5ib2R5LmNvZGUgPSA0MDQ7XG4gICAgICAgIHJlc3BvbnNlLmJvZHkuZGVzYyA9ICdDb250ZW50IE5vdCBGb3VuZCBmb3IgJyArIGNvbnRlbnRVcmw7XG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xuXG4gICAgICB9XG5cbiAgICB9KTtcblxuICAgIC8vcmVzcG9uc2UuYm9keS5jb2RlID0gNDA0O1xuXG4gICAgLy9fdGhpcy5faHlwZXJ0eVJlc291cmNlc1tjb250ZW50VXJsXSA9IG1lc3NhZ2UuYm9keS52YWx1ZTtcblxuXG4gIH1cblxuICBfb25SZWFkRmlsZShyZXNwb25zZSwgcmVzb3VyY2UpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24odGhlRmlsZSkge1xuXG4gICAgICBsb2cuaW5mbygnW0ZpbGVIeXBlcnR5UmVzb3VyY2UuaW5pdF0gZmlsZSBsb2FkZWQgJywgdGhlRmlsZSk7XG5cbiAgICAgIHJlc3BvbnNlLmJvZHkuY29kZSA9IDIwMDtcbiAgICAgIHJlc3BvbnNlLmJvZHkucDJwID0gdHJ1ZTtcbiAgICAgIHJlc3BvbnNlLmJvZHkudmFsdWUgPSBkZWVwQ2xvbmUocmVzb3VyY2UpO1xuICAgICAgcmVzcG9uc2UuYm9keS52YWx1ZS5jb250ZW50ID0gdGhlRmlsZS50YXJnZXQucmVzdWx0O1xuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXNwb25zZSk7XG4gICAgfTtcblxuICAgIGlmIChyZXNvdXJjZS5taW1ldHlwZS5pbmNsdWRlcygndGV4dC8nKSkge1xuICAgICAgcmVhZGVyLnJlYWRBc1RleHQocmVzb3VyY2UuY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSByZXNvdXJjZS5jb250ZW50O1xuXG4gICAgICBsZXQgYmxvYjtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XG4gICAgICAgIGJsb2IgPSBuZXcgQmxvYihjdXJyZW50LCB7IHR5cGU6IHJlc291cmNlLm1pbWV0eXBlfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBibG9iID0gbmV3IEJsb2IoW2N1cnJlbnRdLCB7IHR5cGU6IHJlc291cmNlLm1pbWV0eXBlfSk7XG4gICAgICB9XG5cbiAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIHNob3VsZCBkZWxldGUgYW4gSHlwZXJ0eVJlc291cmNlIGZyb20gdGhlIHN0b3JhZ2U7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gbWVzc2FnZSBjb250YWluaW5nIHRoZSBjb250ZW50IFVSTCBvZiB0aGUgaHlwZXJ0eSByZXNvdXJjZSB0byBiZSBkZWxldGVkXG4gICAqL1xuXG4gIF9vbkRlbGV0ZShtZXNzYWdlKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCFtZXNzYWdlLmJvZHkpIHRocm93IG5ldyBFcnJvcignW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlLl9vbkRlbGV0ZV0gbWFuZGF0b3J5IG1lc3NhZ2UgYm9keSBtaXNzaW5nOiAnLCBtZXNzYWdlKTtcblxuICAgIGlmIChtZXNzYWdlLmJvZHkucmVzb3VyY2UpIHtcbiAgICAgIGRlbGV0ZSBfdGhpcy5faHlwZXJ0eVJlc291cmNlc1ttZXNzYWdlLmJvZHkucmVzb3VyY2VdO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS5ib2R5LnJlc291cmNlcykge1xuICAgICAgbWVzc2FnZS5ib2R5LnJlc291cmNlcy5mb3JFYWNoKChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBkZWxldGUgX3RoaXMuX2h5cGVydHlSZXNvdXJjZXNbcmVzb3VyY2VdO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlLl9vbkRlbGV0ZV0gbWFuZGF0b3J5IHJlc291cmNlIG1pc3Npbmc6ICcsIG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIF90aGlzLl9zdG9yYWdlTWFuYWdlci5kZWxldGUoJ3Jlc291cmNlVVJMJywgbWVzc2FnZS5ib2R5LnJlc291cmNlKS50aGVuKCgpID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHtcbiAgICAgICAgZnJvbTogbWVzc2FnZS50byxcbiAgICAgICAgdG86IG1lc3NhZ2UuZnJvbSxcbiAgICAgICAgaWQ6IG1lc3NhZ2UuaWQsXG4gICAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICAgIGJvZHk6IHsgY29kZTogMjAwIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xuICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgIGxldCByZXNwb25zZSA9IHtcbiAgICAgICAgZnJvbTogbWVzc2FnZS50byxcbiAgICAgICAgdG86IG1lc3NhZ2UuZnJvbSxcbiAgICAgICAgaWQ6IG1lc3NhZ2UuaWQsXG4gICAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICAgIGJvZHk6IHsgY29kZTogNDAwLCBkZXNjcmlwdGlvbjogcmVhc29uIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xuICAgIH0pO1xuXG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZTtcbiIsIi8vIExvZyBTeXN0ZW1cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignU3luU3Vic2NyaXB0aW9uJyk7XG5cbmNsYXNzIFN1YnNjcmlwdGlvbiB7XG5cbiAgY29uc3RydWN0b3IoYnVzLCBvd25lciwgdXJsLCBpc1JlcG9ydGVyKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgY2hpbGRCYXNlVVJMID0gdXJsICsgJy9jaGlsZHJlbi8nO1xuICAgIGxldCBjaGFuZ2VVUkwgPSB1cmwgKyAnL2NoYW5nZXMnO1xuXG4gICAgLy9wcm9jZXNzIGRlbGV0ZSBtZXNzYWdlXG4gICAgX3RoaXMuX2RlbGV0ZUxpc3RlbmVyID0gYnVzLmFkZExpc3RlbmVyKGNoYW5nZVVSTCwgKG1zZykgPT4ge1xuICAgICAgaWYgKG1zZy50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgICBsb2cubG9nKCdTdWJzY3JpcHRpb24tREVMRVRFOiAnLCBtc2cpO1xuXG4gICAgICAgIC8vRkxPVy1PVVQ6IG1lc3NhZ2Ugc2VudCB0byBhbGwgc3Vic2NyaWJlcnNcbiAgICAgICAgbGV0IGRlbGV0ZU1lc3NhZ2VUb0h5cGVydHkgPSB7XG4gICAgICAgICAgdHlwZTogJ2RlbGV0ZScsIGZyb206IG1zZy5mcm9tLCB0bzogb3duZXIsXG4gICAgICAgICAgYm9keTogeyBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHksIHJlc291cmNlOiB1cmwgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vc2VuZCBkZWxldGUgdG8gaHlwZXJ0eVxuICAgICAgICBidXMucG9zdE1lc3NhZ2UoZGVsZXRlTWVzc2FnZVRvSHlwZXJ0eSwgKHJlcGx5KSA9PiB7XG4gICAgICAgICAgbG9nLmxvZygnU3Vic2NyaXB0aW9uLURFTEVURS1SRVBMWTogJywgcmVwbHkpO1xuICAgICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xuICAgICAgICAgICAgX3RoaXMuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9hZGQgY2hhbmdlIHB1Ymxpc2ggYWRkcmVzcyBvciBmb3J3YXJkXG4gICAgaWYgKGlzUmVwb3J0ZXIpIHtcbiAgICAgIF90aGlzLl9jaGFuZ2VMaXN0ZW5lciA9IGJ1cy5hZGRQdWJsaXNoKGNoYW5nZVVSTCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzLl9jaGFuZ2VMaXN0ZW5lciA9IGJ1cy5hZGRGb3J3YXJkKGNoYW5nZVVSTCwgb3duZXIpO1xuICAgIH1cblxuICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycyA9IFtdO1xuLy8gICAgbG9nLmxvZygnW1N1YnNjcmlwdGlvbl0gLSBjaGlsZElEJywgY2hpbGRyZW5zKTtcbi8vICAgIGNoaWxkcmVucy5mb3JFYWNoKChjaGlsZCkgPT4ge1xuLy8gICAgbGV0IGNoaWxkSWQgPSBjaGlsZEJhc2VVUkwgKyBjaGlsZDtcblxuLy8gICAgICBsb2cubG9nKCdbU3Vic2NyaXB0aW9uXSAtIGNoaWxkSUQnLCBjaGlsZEJhc2VVUkwpO1xuXG4gICAgICAvL2FkZCBjaGlsZHJlbiBwdWJsaXNoIGFkZHJlc3NcbiAgICAgIGxldCBjaGlsZHJlbkZvcndhcmQgPSBidXMuYWRkUHVibGlzaChjaGlsZEJhc2VVUkwpO1xuICAgICAgX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXJzLnB1c2goY2hpbGRyZW5Gb3J3YXJkKTtcblxuICAgICAgLy9hZGQgc2VsZiBmb3J3YXJkIGlmIGFuIG9ic2VydmVyXG4gICAgICBpZiAoIWlzUmVwb3J0ZXIpIHtcbiAgICAgICAgbGV0IHNlbGZGb3J3YXJkID0gYnVzLmFkZEZvcndhcmQoY2hpbGRCYXNlVVJMLCBvd25lcik7XG4gICAgICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5wdXNoKHNlbGZGb3J3YXJkKTtcbiAgICAgIH1cbi8vICAgIH0pO1xuICB9XG5cbiAgX3JlbGVhc2VMaXN0ZW5lcnMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9kZWxldGVMaXN0ZW5lci5yZW1vdmUoKTtcblxuICAgIF90aGlzLl9jaGFuZ2VMaXN0ZW5lci5yZW1vdmUoKTtcblxuICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5mb3JFYWNoKChmb3J3YXJkKSA9PiB7XG4gICAgICBmb3J3YXJkLnJlbW92ZSgpO1xuICAgIH0pO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3Vic2NyaXB0aW9uO1xuIiwiLy8gTG9nIFN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdSZXBvcnRlck9iamVjdCcpO1xuXG5pbXBvcnQgeyBkaXZpZGVVUkwsIHNwbGl0T2JqZWN0VVJMIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IFN1YnNjcmlwdGlvbiBmcm9tICcuL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgKiBhcyBjcnlwdG9NYW5hZ2VyIGZyb20gJy4uL2NyeXB0b01hbmFnZXIvQ3J5cHRvTWFuYWdlcic7XG5cbmNsYXNzIFJlcG9ydGVyT2JqZWN0IHtcblxuICBjb25zdHJ1Y3RvcihwYXJlbnQsIG93bmVyLCB1cmwsIGNoaWxkcmVucywgb2ZmbGluZSkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgIF90aGlzLl9vd25lciA9IG93bmVyO1xuICAgIF90aGlzLl91cmwgPSB1cmw7XG5cbiAgICBfdGhpcy5fYnVzID0gcGFyZW50Ll9idXM7XG5cbiAgICBfdGhpcy5fZG9tYWluID0gZGl2aWRlVVJMKHVybCkuZG9tYWluO1xuICAgIF90aGlzLl9vYmpTdWJzY3JpcHRvclVSTCA9IF90aGlzLl91cmwgKyAnL3N1YnNjcmlwdGlvbic7XG5cbiAgICBfdGhpcy5fc3Vic2NyaXB0aW9ucyA9IHt9O1xuICAgIF90aGlzLl9jaGlsZHJlbnMgPSBjaGlsZHJlbnM7XG4gICAgX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXJzID0gW107XG5cbiAgICBfdGhpcy5fZm9yd2FyZHMgPSB7fTtcblxuICAgIF90aGlzLl9pc1RvU2F2ZURhdGEgPSBmYWxzZTtcblxuICAgIF90aGlzLl9hbGxvY2F0ZUxpc3RlbmVycygpO1xuXG4gICAgX3RoaXMuX29mZmxpbmUgPSBvZmZsaW5lID8gb2ZmbGluZSA6IGZhbHNlO1xuICB9XG5cbiAgZ2V0IG9mZmxpbmUoKXtcbiAgICByZXR1cm4gdGhpcy5fb2ZmbGluZTtcbiAgfVxuXG4gIF9hbGxvY2F0ZUxpc3RlbmVycygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgLy9hZGQgc3Vic2NyaXB0aW9uIGxpc3RlbmVyLi4uXG4gICAgX3RoaXMuX3N1YnNjcmlwdGlvbkxpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihfdGhpcy5fb2JqU3Vic2NyaXB0b3JVUkwsIChtc2cpID0+IHtcbiAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIuUmVwb3J0ZXJPYmplY3QgcmVjZWl2ZWQgXScsIG1zZyk7XG4gICAgICBzd2l0Y2ggKG1zZy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3N1YnNjcmliZSc6IF90aGlzLl9vblJlbW90ZVN1YnNjcmliZShtc2cpOyBicmVhaztcbiAgICAgICAgY2FzZSAndW5zdWJzY3JpYmUnOiBfdGhpcy5fb25SZW1vdGVVblN1YnNjcmliZShtc2cpOyBicmVhaztcbiAgICAgICAgY2FzZSAncmVzcG9uc2UnOiBfdGhpcy5fb25SZW1vdGVSZXNwb25zZShtc2cpOyBicmVhaztcbiAgICAgICAgY2FzZSAnZm9yd2FyZCc6IF90aGlzLl9vbkZvcndhcmRlZFJlbW90ZVN1YnNjcmliZShtc2cpOyBicmVhaztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCBjaGFuZ2VVUkwgPSBfdGhpcy5fdXJsICsgJy9jaGFuZ2VzJztcbiAgICBfdGhpcy5fY2hhbmdlTGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKGNoYW5nZVVSTCwgKG1zZykgPT4ge1xuXG4gICAgICBsb2cuaW5mbygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0IF0gU3luY2hlck1hbmFnZXItJyArIGNoYW5nZVVSTCArICctUkNWOiAnLCBtc2cpO1xuXG4gICAgICAvL2RvIG5vdCBzYXZlIGNoYW5nZXMgdG8gYmFja3VwUmV2aXNpb24gdG8gYXZvaWQgaW5maW5pdGUgbG9vcHNcbiAgICAgIGlmICh0aGlzLl9pc1RvU2F2ZURhdGEgJiYgbXNnLmJvZHkuYXR0cmlidXRlICkge1xuICAgICAgICBsZXQgdXBkYXRlUnVudGltZVN0YXR1cyA9IG1zZy5ib2R5LmF0dHJpYnV0ZSAhPT0gJ2JhY2t1cFJldmlzaW9uJyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0IF0gU3luY2hlck1hbmFnZXIgLSBzYXZlIGRhdGE6ICcsIG1zZyk7XG4gICAgICAgIF90aGlzLl9wYXJlbnQuX2RhdGFPYmplY3RzU3RvcmFnZS51cGRhdGUodHJ1ZSwgX3RoaXMuX3VybCwgJ3ZlcnNpb24nLCBtc2cuYm9keS52ZXJzaW9uLCB1cGRhdGVSdW50aW1lU3RhdHVzKTtcbiAgICAgICAgX3RoaXMuX3BhcmVudC5fZGF0YU9iamVjdHNTdG9yYWdlLnVwZGF0ZSh0cnVlLCBfdGhpcy5fdXJsLCAnbGFzdE1vZGlmaWVkJywgbXNnLmJvZHkubGFzdE1vZGlmaWVkLCB1cGRhdGVSdW50aW1lU3RhdHVzKTtcbiAgICAgICAgX3RoaXMuX3BhcmVudC5fZGF0YU9iamVjdHNTdG9yYWdlLnNhdmVEYXRhKHRydWUsIF90aGlzLl91cmwsIG1zZy5ib2R5LmF0dHJpYnV0ZSwgbXNnLmJvZHkudmFsdWUsIHVwZGF0ZVJ1bnRpbWVTdGF0dXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0IGlzVG9TYXZlRGF0YSh2YWx1ZSkge1xuICAgIHRoaXMuX2lzVG9TYXZlRGF0YSA9IHZhbHVlO1xuICB9XG5cbiAgLy8gVG8gaGFuZGxlIHN1YnNjcmlwdGlvbnMgc2VudCB3aGlsZSB0aGUgcmVwb3J0ZXIgd2FzIG9mZmxpbmUgaWUgZm9yd2FyZGVkIGJ5IGEgT2ZmbGluZSBTdWJzY3JpcHRpb24gTWFuYWdlciBzZXJ2aWNlXG5cbiAgX29uRm9yd2FyZGVkUmVtb3RlU3Vic2NyaWJlKG1zZykge1xuICAgIHRoaXMuX29uUmVtb3RlU3Vic2NyaWJlKG1zZy5ib2R5KTtcbiAgfVxuXG4gIF9yZWxlYXNlTGlzdGVuZXJzKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5fc3Vic2NyaXB0aW9uTGlzdGVuZXIucmVtb3ZlKCk7XG5cbiAgICBfdGhpcy5fY2hhbmdlTGlzdGVuZXIucmVtb3ZlKCk7XG5cbiAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMuZm9yRWFjaCgoY2wpID0+IHtcbiAgICAgIGNsLnJlbW92ZSgpO1xuICAgIH0pO1xuXG4gICAgT2JqZWN0LmtleXMoX3RoaXMuX2ZvcndhcmRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIF90aGlzLmZvcndhcmRVblN1YnNjcmliZShrZXkpO1xuICAgIH0pO1xuXG4gICAgLy9yZW1vdmUgYWxsIHN1YnNjcmlwdGlvbnNcbiAgICBPYmplY3Qua2V5cyhfdGhpcy5fc3Vic2NyaXB0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uc1trZXldLl9yZWxlYXNlTGlzdGVuZXJzKCk7XG4gICAgfSk7XG4gIH1cblxuICByZXN1bWVTdWJzY3JpcHRpb25zKHN1YnNjcmlwdGlvbnMpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCFzdWJzY3JpcHRpb25zKVxuICAgICAgcmV0dXJuO1xuXG4gICAgT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBsZXQgaHlwZXJ0eVVSTCA9IHN1YnNjcmlwdGlvbnNba2V5XTtcblxuICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0XSAtIHJlc3VtZSBzdWJzY3JpcHRpb25zJywgX3RoaXMsIGh5cGVydHlVUkwsIF90aGlzLl9jaGlsZHJlbnMpO1xuXG4gICAgICBpZiAoIV90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHlVUkxdKSB7XG4gICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHlVUkxdID0gbmV3IFN1YnNjcmlwdGlvbihfdGhpcy5fYnVzLCBfdGhpcy5fb3duZXIsIF90aGlzLl91cmwsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciBpbiB0aGUgbXNnLW5vZGUgYW5kIGluIHRoZSBsb2NhbCBNZXNzYWdlQnVzLCBzbyB0aGF0IG1lc3NhZ2VzIG9uIHRoaXMgYWRkcmVzcyBhcmUgZm9yd2FyZGVkIHRvIHRoZSByZXBvcnRlciBvYmplY3RcbiAgICogQHBhcmFtICB7c3RyaW5nfSBhZGRyZXNzIC0gVVJMIHRvIHJlZ2lzdGVyIHRoZSBsaXN0ZW5lcnNcbiAgICogQHJldHVybiB7UHJvbWlzZX0gUmV0dXJuIFByb21pc2UgT0sgb3IgZXJyb3JcbiAgICovXG4gIGZvcndhcmRTdWJzY3JpYmUoYWRkcmVzc2VzKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIC8vRkxPVy1PVVQ6IG1lc3NhZ2Ugc2VudCB0byB0aGUgbXNnLW5vZGUgU3Vic2NyaXB0aW9uTWFuYWdlciBjb21wb25lbnRcbiAgICBsZXQgbm9kZVN1YnNjcmliZU1zZyA9IHtcbiAgICAgIHR5cGU6ICdzdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fcGFyZW50Ll91cmwsIHRvOiAnZG9tYWluOi8vbXNnLW5vZGUuJyArIF90aGlzLl9kb21haW4gKyAnL3NtJyxcbiAgICAgIGJvZHk6IHsgcmVzb3VyY2VzOiBhZGRyZXNzZXMsIHNvdXJjZTogX3RoaXMuX293bmVyIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uobm9kZVN1YnNjcmliZU1zZywgKHJlcGx5KSA9PiB7XG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5SZXBvcnRlck9iamVjdCBdZm9yd2FyZC1zdWJzY3JpYmUtcmVzcG9uc2UocmVwb3J0ZXIpOiAnLCByZXBseSk7XG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xuICAgICAgICAgIGxldCBuZXdGb3J3YXJkID0gX3RoaXMuX2J1cy5hZGRGb3J3YXJkKF90aGlzLl91cmwsIF90aGlzLl9vd25lcik7XG4gICAgICAgICAgX3RoaXMuX2ZvcndhcmRzW2FkZHJlc3Nlc1swXV0gPSBuZXdGb3J3YXJkO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoJ0Vycm9yIG9uIG1zZy1ub2RlIHN1YnNjcmlwdGlvbjogJyArIHJlcGx5LmJvZHkuZGVzYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuUmVnaXN0ZXIgYSBsaXN0ZW5lciBpbiB0aGUgbXNnLW5vZGUgYW5kIGluIHRoZSBsb2NhbCBNZXNzYWdlQnVzLCBzbyB0aGF0IG1lc3NhZ2VzIG9uIHRoaXMgYWRkcmVzcyBhcmUgcmVtb3ZlZCBmcm9tIGZvcndhcmRcbiAgICogQHBhcmFtICB7c3RyaW5nfSBhZGRyZXNzIC0gVVJMIHRvIHVuLXJlZ2lzdGVyIHRoZSBsaXN0ZW5lcnNcbiAgICovXG4gIGZvcndhcmRVblN1YnNjcmliZShhZGRyZXNzKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9mb3J3YXJkc1thZGRyZXNzXS5yZW1vdmUoKTtcbiAgICBkZWxldGUgX3RoaXMuX2ZvcndhcmRzW2FkZHJlc3NdO1xuXG4gICAgLy9GTE9XLU9VVDogbWVzc2FnZSBzZW50IHRvIHRoZSBtc2ctbm9kZSBTdWJzY3JpcHRpb25NYW5hZ2VyIGNvbXBvbmVudFxuICAgIGxldCBub2RlVW5TdWJzY3JpYmVNc2cgPSB7XG4gICAgICB0eXBlOiAndW5zdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fcGFyZW50Ll91cmwsIHRvOiAnZG9tYWluOi8vbXNnLW5vZGUuJyArIF90aGlzLl9kb21haW4gKyAnL3NtJyxcbiAgICAgIGJvZHk6IHsgcmVzb3VyY2VzOiBbYWRkcmVzc10sIHNvdXJjZTogX3RoaXMuX293bmVyIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShub2RlVW5TdWJzY3JpYmVNc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGxpc3RlbmVycyBmb3IgYSBsaXN0IG9mIGNoaWxkcmVucy4gUHVibGljIGNoYW5uZWxzIHVzZWQgdG8gdHJhbnNtaXQgbWVzc2FnZXMuXG4gICAqIEBwYXJhbSAge3N0cmluZ1tdfSBjaGlsZHJlbnMgLSBjaGFubmVscyB0byByZWdpc3RlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXR1cm4gUHJvbWlzZSBPSyBvciBlcnJvclxuICAgKi9cbiAgYWRkQ2hpbGRyZW5zKCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKF90aGlzLl9jaGlsZHJlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgICAgbGV0IGNoaWxkQmFzZVVSTCA9IF90aGlzLl91cmwgKyAnL2NoaWxkcmVuLyc7XG4gICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuUmVwb3J0ZXJPYmplY3QgLSBhZGRDaGlsZHJlbnNdIC0gY2hpbGRyZW5zOiAnLCBjaGlsZEJhc2VVUkwpO1xuXG4gIC8qICAgIGNoaWxkcmVucy5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgICBfdGhpcy5fY2hpbGRyZW5zLnB1c2goY2hpbGQpO1xuICAgICAgfSk7Ki9cblxuICAgICAgLypcbiAgICAgIF90aGlzLl9jaGlsZHJlbnMuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgbGV0IGNoaWxkSWQgPSBjaGlsZEJhc2VVUkwgKyBjaGlsZDtcblxuICAgICAgICBsZXQgc2VsZkZvcndhcmQgPSBfdGhpcy5fYnVzLmFkZEZvcndhcmQoY2hpbGRJZCwgb3duZXIpO1xuICAgICAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMucHVzaChzZWxmRm9yd2FyZCk7XG4gICAgICB9KTsqL1xuXG4gICAgICBsZXQgc3Vic2NyaXB0aW9ucyA9IFtdO1xuLy8gICAgICBjaGlsZHJlbnMuZm9yRWFjaCgoY2hpbGQpID0+IHN1YnNjcmlwdGlvbnMucHVzaChjaGlsZEJhc2VVUkwgKyBjaGlsZCkpO1xuICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKGNoaWxkQmFzZVVSTCApO1xuXG4gICAgICAvL190aGlzLl9zdG9yYWdlU3Vic2NyaXB0aW9uc1tfdGhpcy5fb2JqU3Vic2NyaXB0b3JVUkxdID0ge3VybDogX3RoaXMuX3VybCwgb3duZXI6IF90aGlzLl9vd25lciwgY2hpbGRyZW5zOiBfdGhpcy5fY2hpbGRyZW5zfTtcblxuICAgICAgLy9GTE9XLU9VVDogbWVzc2FnZSBzZW50IHRvIHRoZSBtc2ctbm9kZSBTdWJzY3JpcHRpb25NYW5hZ2VyIGNvbXBvbmVudFxuICAgICAgbGV0IG5vZGVTdWJzY3JpYmVNc2cgPSB7XG4gICAgICAgIHR5cGU6ICdzdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fcGFyZW50Ll91cmwsIHRvOiAnZG9tYWluOi8vbXNnLW5vZGUuJyArIF90aGlzLl9kb21haW4gKyAnL3NtJyxcbiAgICAgICAgYm9keTogeyByZXNvdXJjZXM6IHN1YnNjcmlwdGlvbnMsIHNvdXJjZTogX3RoaXMuX293bmVyIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uobm9kZVN1YnNjcmliZU1zZywgKHJlcGx5KSA9PiB7XG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5SZXBvcnRlck9iamVjdCBdbm9kZS1zdWJzY3JpYmUtcmVzcG9uc2UocmVwb3J0ZXIpOicsIHJlcGx5KTtcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XG5cbiAgICAgICAgICAvL2FkZCBjaGlsZHJlbiBsaXN0ZW5lcnMgb24gbG9jYWwgLi4uXG4gICAgICAgICAgc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChjaGlsZFVSTCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNoaWxkTGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKGNoaWxkVVJMLCAobXNnKSA9PiB7XG4gICAgICAgICAgICAgIC8vVE9ETzogd2hhdCB0b2RvIGhlcmU/IFNhdmUgY2hpbGRyZW5zP1xuICAgICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuUmVwb3J0ZXJPYmplY3QgcmVjZWl2ZWRdJywgbXNnKTtcblxuXG4gICAgICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2NyZWF0ZScgJiYgbXNnLnRvLmluY2x1ZGVzKCdjaGlsZHJlbicpICYmIHRoaXMuX2lzVG9TYXZlRGF0YSkge1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIG5vdCBlbmNyeXB0ZWQgbGV0cyBlbmNyeXB0IGl0XG4gICAgICAgICAgICAgICAgLy8gdG9kbzogc2hvdWxkIGJlIHN1YmplY3QgdG8gc29tZSBwb2xpY3lcbiAgICAgICAgICAgICAgICBsZXQgc3BsaXRlZFJlcG9ydGVyVVJMID0gc3BsaXRPYmplY3RVUkwobXNnLnRvKTtcblxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBzcGxpdGVkUmVwb3J0ZXJVUkwudXJsO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykpIG1zZy5ib2R5Lm11dHVhbCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAvL3JlbW92ZSBmYWxzZSB3aGVuIG11dHVhbEF1dGhlbnRpY2F0aW9uIGlzIGVuYWJsZWRcbiAgICAgICAgICAgICAgICBpZiAoISh0eXBlb2YgbXNnLmJvZHkudmFsdWUgPT09ICdzdHJpbmcnKSAmJiBtc2cuYm9keS5tdXR1YWwpIHtcblxuICAgICAgICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0XSBlbmNyeXB0aW5nIHJlY2VpdmVkIGRhdGEgJywgbXNnLmJvZHkudmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgICBjcnlwdG9NYW5hZ2VyLmRlZmF1bHQuZW5jcnlwdERhdGFPYmplY3QobXNnLmJvZHkudmFsdWUsIHVybCkudGhlbigoZW5jcnlwdGVkVmFsdWUpPT57XG4gICAgICAgICAgICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5SZXBvcnRlck9iamVjdF0gZW5jcnlwdGVkIGRhdGEgJywgIGVuY3J5cHRlZFZhbHVlKTtcblxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5fc3RvcmVDaGlsZE9iamVjdChtc2csIEpTT04uc3RyaW5naWZ5KGVuY3J5cHRlZFZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCdbU3luY2hlck1hbmFnZXIuX2RlY3J5cHRDaGlsZHJlbnNdIGZhaWxlZCA6ICcsIHJlYXNvbiwgJyBTdG9yaW5nIHVuZW5jcnlwdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9zdG9yZUNoaWxkT2JqZWN0KG1zZywgbXNnLmJvZHkudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLl9zdG9yZUNoaWxkT2JqZWN0KG1zZywgbXNnLmJvZHkudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5wdXNoKGNoaWxkTGlzdGVuZXIpO1xuXG4gICAgICAgICAgICBsZXQgc2VsZkZvcndhcmQgPSBfdGhpcy5fYnVzLmFkZEZvcndhcmQoY2hpbGRVUkwsIF90aGlzLl9vd25lcik7XG4gICAgICAgICAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMucHVzaChzZWxmRm9yd2FyZCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KCdFcnJvciBvbiBtc2ctbm9kZSBzdWJzY3JpcHRpb246ICcgKyByZXBseS5ib2R5LmRlc2MpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHN0b3JlIGNoaWxkT2JqZWN0XG5cbiAgX3N0b3JlQ2hpbGRPYmplY3QobXNnLCBkYXRhKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBzcGxpdGVkUmVwb3J0ZXJVUkwgPSBzcGxpdE9iamVjdFVSTChtc2cudG8pO1xuXG4gICAgbGV0IHVybCA9IHNwbGl0ZWRSZXBvcnRlclVSTC51cmw7XG5cbiAgICBsZXQgcmVzb3VyY2UgPSBzcGxpdGVkUmVwb3J0ZXJVUkwucmVzb3VyY2U7XG4gICAgbGV0IHZhbHVlO1xuICAgIFxuXG4vKiAgICBpZiAobXNnLmJvZHkuaWRlbnRpdHkpIHtcbiAgICAgIHZhbHVlLmlkZW50aXR5ID0gbXNnLmJvZHkuaWRlbnRpdHk7XG4gICAgICBkZWxldGUgdmFsdWUuaWRlbnRpdHkuYXNzZXJ0aW9uO1xuICAgICAgZGVsZXRlIHZhbHVlLmlkZW50aXR5LmV4cGlyZXM7XG4gICAgfSovXG5cbiAgICBsZXQgb2JqZWN0VVJMUmVzb3VyY2UgPSBtc2cuYm9keS5yZXNvdXJjZTtcbiAgICBsZXQgYXR0cmlidXRlID0gcmVzb3VyY2U7XG5cbiAgICBpZiAob2JqZWN0VVJMUmVzb3VyY2UgPT09ICdoZWFydGJlYXQnICkgdmFsdWUgPSBkYXRhO1xuICAgIGVsc2UgdmFsdWUgPSB7XG4gICAgICBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHksXG4gICAgICB2YWx1ZTogZGF0YVxuICAgIH07XG5cbi8vICAgIGlmIChvYmplY3RVUkxSZXNvdXJjZSkgYXR0cmlidXRlICs9ICcuJyArIG9iamVjdFVSTFJlc291cmNlO1xuICAgIGlmIChvYmplY3RVUkxSZXNvdXJjZSkgYXR0cmlidXRlID0gb2JqZWN0VVJMUmVzb3VyY2U7XG5cbiAgICAvLyB0aGlzIGlkZW50aXR5IGRhdGEgaXMgbm90IG5lZWRlZCB0byBiZSBzdG9yZWRcblxuXG4gICAgY29uc29sZS5sb2coJ1tTeW5jaGVyTWFuYWdlci5SZXBvcnRlck9iamVjdC5fc3RvcmVDaGlsZE9iamVjdF0gOiAnLCB1cmwsIGF0dHJpYnV0ZSwgdmFsdWUpO1xuXG4gICAgX3RoaXMuX3BhcmVudC5fZGF0YU9iamVjdHNTdG9yYWdlLnNhdmVDaGlsZHJlbnModHJ1ZSwgdXJsLCBhdHRyaWJ1dGUsIHZhbHVlKTtcbiAgfVxuXG4gIGRlbGV0ZSgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCBkb21haW4gPSBkaXZpZGVVUkwoX3RoaXMuX293bmVyKS5kb21haW47XG5cbiAgICAvL0ZMT1ctT1VUOiBtZXNzYWdlIHNlbnQgZGlyZWN0bHkgdG8gYWxsIHN1YnNjcmliZXJzIG9mIHRoZSByZXBvcnRlclxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogJ2RlbGV0ZScsIGZyb206IF90aGlzLl9vYmpTdWJzY3JpcHRvclVSTCwgdG86IF90aGlzLl91cmwgKyAnL2NoYW5nZXMnXG4gICAgfSk7XG5cbiAgICAvL0ZMT1ctT1VUOiBtZXNzYWdlIHNlbnQgdG8gdGhlIG1zZy1ub2RlIE9iamVjdEFsbG9jYXRpb25NYW5hZ2VyIGNvbXBvbmVudFxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgdHlwZTogJ2RlbGV0ZScsIGZyb206IF90aGlzLl9wYXJlbnQuX3VybCwgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgZG9tYWluICsgJy9vYmplY3QtYWRkcmVzcy1hbGxvY2F0aW9uJyxcbiAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IF90aGlzLl91cmwsIGNoaWxkcmVuUmVzb3VyY2VzOiBfdGhpcy5fY2hpbGRyZW5zIH1cbiAgICB9KTtcblxuICAgIF90aGlzLl9yZWxlYXNlTGlzdGVuZXJzKCk7XG4gICAgZGVsZXRlIF90aGlzLl9wYXJlbnQuX3JlcG9ydGVyc1tfdGhpcy5fdXJsXTtcbiAgfVxuXG4gIF9vblJlbW90ZVJlc3BvbnNlKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcbiAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IF90aGlzLl91cmwsXG4gICAgICBib2R5OiB7IGNvZGU6IG1zZy5ib2R5LmNvZGUsIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSwgc291cmNlOiBtc2cuZnJvbSB9XG4gICAgfSk7XG4gIH1cblxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBTeW5jaGVyIC0+IHN1YnNjcmliZVxuICBfb25SZW1vdGVTdWJzY3JpYmUobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICBsZXQgaHlwZXJ0eVVSTCA9IG1zZy5ib2R5LnN1YnNjcmliZXI7XG5cbiAgICAvL3ZhbGlkYXRlIGlmIHN1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cz9cbiAgICBpZiAoX3RoaXMuX3N1YnNjcmlwdGlvbnNbaHlwZXJ0eVVSTF0pIHtcbiAgICAgIC8vIGxldCBlcnJvck1zZyA9IHtcbiAgICAgIC8vICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogaHlwZXJ0eVVSTCxcbiAgICAgIC8vICAgYm9keTogeyBjb2RlOiA1MDAsIGRlc2M6ICdTdWJzY3JpcHRpb24gZm9yICgnICsgX3RoaXMuX3VybCArICcgOiAnICsgIGh5cGVydHlVUkwgKyAnKSBhbHJlYWR5IGV4aXN0cyEnIH1cbiAgICAgIC8vIH07XG4gICAgICAvL1xuICAgICAgLy8gX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShlcnJvck1zZyk7XG4gICAgICAvLyByZXR1cm47XG5cbiAgICAgIC8vIG5ldyB2ZXJzaW9uIGJlY2F1c2Ugb2YgcmV1c2FnZVxuICAgICAgX3RoaXMuX3N1YnNjcmlwdGlvbnNbaHlwZXJ0eVVSTF0uX3JlbGVhc2VMaXN0ZW5lcnMoKTtcbiAgICB9XG5cbiAgICAvL2FzayB0byBzdWJzY3JpYmUgdG8gU3luY2hlcj8gKGRlcGVuZHMgb24gdGhlIG9wZXJhdGlvbiBtb2RlKVxuICAgIC8vVE9ETzogZ2V0IG1vZGUgZnJvbSBvYmplY3QhXG4gICAgbGV0IG1vZGUgPSAnc3ViL3B1Yic7XG5cbiAgICBpZiAobW9kZSA9PT0gJ3N1Yi9wdWInKSB7XG4gICAgICAvL0ZMT1ctT1VUOiBtZXNzYWdlIHNlbnQgdG8gbG9jYWwgaHlwZXJ0eSBhZGRyZXNzIFN5bmNoZXIgLT4gX29uRm9yd2FyZFxuICAgICAgbGV0IGZvcndhcmRNc2cgPSB7XG4gICAgICAgIHR5cGU6ICdmb3J3YXJkJywgZnJvbTogX3RoaXMuX3VybCwgdG86IF90aGlzLl9vd25lcixcbiAgICAgICAgYm9keTogeyB0eXBlOiBtc2cudHlwZSwgZnJvbTogaHlwZXJ0eVVSTCwgdG86IF90aGlzLl91cmwsIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSB9XG4gICAgICB9O1xuXG4gICAgICAvL1RPRE86IEZvciBGdXJ0aGVyIFN0dWR5XG4gICAgICBpZiAobXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ211dHVhbCcpKSBmb3J3YXJkTXNnLmJvZHkubXV0dWFsID0gbXNnLmJvZHkubXV0dWFsO1xuXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKGZvcndhcmRNc2csIChyZXBseSkgPT4ge1xuICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuUmVwb3J0ZXJPYmplY3QgXWZvcndhcmQtcmVwbHk6ICcsIHJlcGx5KTtcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XG4gICAgICAgICAgaWYgKCFfdGhpcy5fc3Vic2NyaXB0aW9uc1toeXBlcnR5VVJMXSkge1xuICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLlJlcG9ydGVyT2JqZWN0XSAtIF9vblJlbW90ZVN1YnNjcmliZTonLCBfdGhpcy5fY2hpbGRyZW5zKTtcbiAgICAgICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHlVUkxdID0gbmV3IFN1YnNjcmlwdGlvbihfdGhpcy5fYnVzLCBfdGhpcy5fb3duZXIsIF90aGlzLl91cmwsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gU3RvcmUgZm9yIGVhY2ggcmVwb3J0ZXIgaHlwZXJ0eSB0aGUgZGF0YU9iamVjdFxuICAgICAgICBsZXQgdXNlclVSTDtcbiAgICAgICAgaWYgKG1zZy5ib2R5LmlkZW50aXR5ICYmIG1zZy5ib2R5LmlkZW50aXR5LnVzZXJQcm9maWxlLnVzZXJVUkwpIHtcbiAgICAgICAgICB1c2VyVVJMID0gbXNnLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUudXNlclVSTDtcbiAgICAgICAgICBfdGhpcy5fcGFyZW50Ll9kYXRhT2JqZWN0c1N0b3JhZ2UudXBkYXRlKHRydWUsIF90aGlzLl91cmwsICdzdWJzY3JpYmVyVXNlcnMnLCB1c2VyVVJMKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogbXV0dWFsIGFuZCBzZXNzaW9ua2V5cyB1cGRhdGVzIHdlcmUgcmVtb3ZlZC4gRkZTXG5cbiAgICAgICAgLyogICAgICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykpIHtcbi8vICAgICAgICAgIF90aGlzLl9wYXJlbnQuX2lkZW50aXR5TW9kdWxlLnVwZGF0ZUlzVG9FbmNyeXB0Rm9yRGF0YU9iamVjdFNlc3Npb25LZXkoX3RoaXMuX3VybCwgbXNnLmJvZHkubXV0dWFsKS50aGVuKCgpPT57XG4gICAgICAgICAgICBfdGhpcy5fcGFyZW50Ll9kYXRhT2JqZWN0c1N0b3JhZ2UudXBkYXRlKHRydWUsIF90aGlzLl91cmwsICdtdXR1YWwnLCBtc2cuYm9keS5tdXR1YWwpO1xuLy8gICAgICAgICAgfSk7XG4gICAgICAgIH0qL1xuXG4gICAgICAgIF90aGlzLl9wYXJlbnQuX2RhdGFPYmplY3RzU3RvcmFnZS51cGRhdGUodHJ1ZSwgX3RoaXMuX3VybCwgJ3N1YnNjcmlwdGlvbnMnLCBoeXBlcnR5VVJMKTtcblxuICAgICAgICByZXBseS5ib2R5Lm93bmVyID0gX3RoaXMuX293bmVyO1xuXG4gICAgICAgIC8vRkxPVy1PVVQ6IHN1YnNjcmlwdGlvbiByZXNwb25zZSBzZW50IChmb3J3YXJkIGZyb20gaW50ZXJuYWwgSHlwZXJ0eSlcbiAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXG4gICAgICAgICAgYm9keTogcmVwbHkuYm9keVxuICAgICAgICB9KTtcblxuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSByZW1vdGUgT2JzZXJ2ZXJPYmplY3QgLT4gcmVtb3ZlU3Vic2NyaXB0aW9uXG4gIF9vblJlbW90ZVVuU3Vic2NyaWJlKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgbGV0IHVuc3Vic2NyaWJlciA9IG1zZy5ib2R5LnNvdXJjZTtcblxuICAgIGxldCBzdWJzY3JpcHRpb24gPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1bnN1YnNjcmliZXJdO1xuICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgIHN1YnNjcmlwdGlvbi5fcmVsZWFzZUxpc3RlbmVycygpO1xuICAgICAgZGVsZXRlIF90aGlzLl9zdWJzY3JpcHRpb25zW3Vuc3Vic2NyaWJlcl07XG5cbiAgICAgIGxldCBmb3J3YXJkTXNnID0ge1xuICAgICAgICB0eXBlOiAnZm9yd2FyZCcsIGZyb206IF90aGlzLl91cmwsIHRvOiBfdGhpcy5fb3duZXIsXG4gICAgICAgIGJvZHk6IHsgdHlwZTogbXNnLnR5cGUsIGZyb206IHVuc3Vic2NyaWJlciwgdG86IF90aGlzLl91cmwsIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSB9XG4gICAgICB9O1xuXG5cbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UoZm9yd2FyZE1zZyk7XG4gICAgfVxuXG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBSZXBvcnRlck9iamVjdDtcbiIsIi8vIExvZyBTeXN0ZW1cbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignT2JzZXJ2ZXJPYmplY3QnKTtcblxuaW1wb3J0IHsgZGl2aWRlVVJMLCBzcGxpdE9iamVjdFVSTCwgZGVlcENsb25lIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IFN1YnNjcmlwdGlvbiBmcm9tICcuL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQgKiBhcyBjcnlwdG9NYW5hZ2VyIGZyb20gJy4uL2NyeXB0b01hbmFnZXIvQ3J5cHRvTWFuYWdlcic7XG5cbmNsYXNzIE9ic2VydmVyT2JqZWN0IHtcblxuICBjb25zdHJ1Y3RvcihwYXJlbnQsIHVybCwgY2hpbGRyZW5zKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgX3RoaXMuX3VybCA9IHVybDtcbiAgICBfdGhpcy5fY2hpbGRyZW5zID0gY2hpbGRyZW5zO1xuXG4gICAgX3RoaXMuX2J1cyA9IHBhcmVudC5fYnVzO1xuXG4gICAgX3RoaXMuX3N1YnNjcmlwdGlvbnMgPSB7fTtcbiAgICBfdGhpcy5fc3RvcmFnZVN1YnNjcmlwdGlvbnMgPSB7fTtcbiAgICBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMgPSBbXTtcblxuICAgIHRoaXMuX2lzVG9TYXZlRGF0YSA9IGZhbHNlO1xuXG4gICAgbGV0IGNoYW5nZVVSTCA9IF90aGlzLl91cmwgKyAnL2NoYW5nZXMnO1xuICAgIF90aGlzLl9jaGFuZ2VMaXN0ZW5lciA9IF90aGlzLl9idXMuYWRkTGlzdGVuZXIoY2hhbmdlVVJMLCAobXNnKSA9PiB7XG5cbiAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5PYnNlcnZlck9iamVjdCBdIFN5bmNoZXJNYW5hZ2VyLScgKyBjaGFuZ2VVUkwgKyAnLVJDVjogJywgbXNnKTtcblxuICAgICAgLy9UT0RPOiB3aGF0IHRvZG8gaGVyZT8gU2F2ZSBjaGFuZ2VzP1xuICAgICAgaWYgKHRoaXMuX2lzVG9TYXZlRGF0YSAmJiBtc2cuYm9keS5hdHRyaWJ1dGUpIHtcbiAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLk9ic2VydmVyT2JqZWN0IF0gU3luY2hlck1hbmFnZXIgLSBzYXZlIGRhdGE6ICcsIG1zZyk7XG4gICAgICAgIF90aGlzLl9wYXJlbnQuX2RhdGFPYmplY3RzU3RvcmFnZS51cGRhdGUoZmFsc2UsIF90aGlzLl91cmwsICd2ZXJzaW9uJywgbXNnLmJvZHkudmVyc2lvbik7XG4gICAgICAgIF90aGlzLl9wYXJlbnQuX2RhdGFPYmplY3RzU3RvcmFnZS51cGRhdGUoZmFsc2UsIF90aGlzLl91cmwsICdsYXN0TW9kaWZpZWQnLCBtc2cuYm9keS5sYXN0TW9kaWZpZWQpO1xuICAgICAgICBfdGhpcy5fcGFyZW50Ll9kYXRhT2JqZWN0c1N0b3JhZ2Uuc2F2ZURhdGEoZmFsc2UsIF90aGlzLl91cmwsIG1zZy5ib2R5LmF0dHJpYnV0ZSwgbXNnLmJvZHkudmFsdWUpO1xuICAgICAgfVxuXG4gICAgfSk7XG4gIH1cblxuICBzZXQgaXNUb1NhdmVEYXRhKHZhbHVlKSB7XG4gICAgdGhpcy5faXNUb1NhdmVEYXRhID0gdmFsdWU7XG4gIH1cblxuICBfbmV3U3Vic2NyaXB0aW9uKGh5cGVydHkpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IHN1YnNjcmlwdGlvbiA9IF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHldO1xuICAgIGxvZy5sb2coJ1tPYnNlcnZlciBPYmplY3QgLSBuZXcgc3Vic2NyaXB0aW9uXSAtICcsICBfdGhpcy5fc3Vic2NyaXB0aW9ucywgaHlwZXJ0eSwgX3RoaXMuX3N1YnNjcmlwdGlvbnMuaGFzT3duUHJvcGVydHkoaHlwZXJ0eSkpO1xuICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uc1toeXBlcnR5XSA9IG5ldyBTdWJzY3JpcHRpb24oX3RoaXMuX2J1cywgaHlwZXJ0eSwgX3RoaXMuX3VybCwgZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFkZFN1YnNjcmlwdGlvbihoeXBlcnR5KSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9uZXdTdWJzY3JpcHRpb24oaHlwZXJ0eSk7XG4gIH1cblxuICBhZGRDaGlsZHJlbnMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKF90aGlzLl9jaGlsZHJlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgICAgbGV0IGNoaWxkQmFzZVVSTCA9IF90aGlzLl91cmwgKyAnL2NoaWxkcmVuLyc7XG4gICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuT2JzZXJ2ZXJPYmplY3QgLSBhZGRDaGlsZHJlbnNdIC0gY2hpbGRyZW5zOiAnLCBjaGlsZEJhc2VVUkwpO1xuXG4vLyAgICAgIGNoaWxkcmVucy5mb3JFYWNoKChjaGlsZCkgPT4ge1xuXG4gICAgICAgIGxldCBjaGlsZExpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihjaGlsZEJhc2VVUkwsIChtc2cpID0+IHtcbiAgICAgICAgICAvL1RPRE86IHdoYXQgdG9kbyBoZXJlPyBTYXZlIGNoaWxkcmVucz9cbiAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuT2JzZXJ2ZXJPYmplY3QgcmVjZWl2ZWRdJywgbXNnKTtcblxuICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2NyZWF0ZScgJiYgbXNnLnRvLmluY2x1ZGVzKCdjaGlsZHJlbicpICYmIHRoaXMuX2lzVG9TYXZlRGF0YSkge1xuICAgICAgICAgICAgbGV0IHNwbGl0ZWRSZXBvcnRlclVSTCA9IHNwbGl0T2JqZWN0VVJMKG1zZy50byk7XG5cbiAgICAgICAgICAgIGxldCB1cmwgPSBzcGxpdGVkUmVwb3J0ZXJVUkwudXJsO1xuXG4gICAgICAgICAgICBpZiAoIW1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSkgbXNnLmJvZHkubXV0dWFsID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy9yZW1vdmUgZmFsc2Ugd2hlbiBtdXR1YWxBdXRoZW50aWNhdGlvbiBpcyBlbmFibGVkXG4gICAgICAgICAgICBpZiAoISh0eXBlb2YgbXNnLmJvZHkudmFsdWUgPT09ICdzdHJpbmcnKSAmJiBtc2cuYm9keS5tdXR1YWwpIHtcblxuICAgICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuT2JzZXJ2ZXJPYmplY3RdIGVuY3J5cHRpbmcgcmVjZWl2ZWQgZGF0YSAnLCBtc2cuYm9keS52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgY3J5cHRvTWFuYWdlci5kZWZhdWx0LmVuY3J5cHREYXRhT2JqZWN0KG1zZy5ib2R5LnZhbHVlLCB1cmwpLnRoZW4oKGVuY3J5cHRlZFZhbHVlKT0+e1xuICAgICAgICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5PYnNlcnZlck9iamVjdF0gZW5jcnlwdGVkIGRhdGEgJywgIGVuY3J5cHRlZFZhbHVlKTtcblxuICAgICAgICAgICAgICAgIF90aGlzLl9zdG9yZUNoaWxkT2JqZWN0KG1zZywgSlNPTi5zdHJpbmdpZnkoZW5jcnlwdGVkVmFsdWUpKTtcbiAgICAgICAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgICAgIGxvZy53YXJuKCdbU3luY2hlck1hbmFnZXIuT2JzZXJ2ZXJPYmplY3QuX2VuY3J5cHRDaGlsZF0gZmFpbGVkLCBzdG9yaW5nIHVuZW5jcnlwdGVkICcsIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgX3RoaXMuX3N0b3JlQ2hpbGRPYmplY3QobXNnLCBtc2cuYm9keS52YWx1ZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgX3RoaXMuX3N0b3JlQ2hpbGRPYmplY3QobXNnLCBtc2cuYm9keS52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLk9ic2VydmVyT2JqZWN0IGNoaWxkcmVuIExpc3RlbmVyc10nLCBfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMsIGNoaWxkTGlzdGVuZXIpO1xuICAgICAgICAgIGlmIChfdGhpcy5fY2hpbGRyZW5MaXN0ZW5lcnMuaW5kZXhPZihjaGlsZExpc3RlbmVyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5wdXNoKGNoaWxkTGlzdGVuZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgfSk7XG5cbi8vICAgIH0pO1xuICB9XG5cbiAgLy8gc3RvcmUgY2hpbGRPYmplY3RcblxuICBfc3RvcmVDaGlsZE9iamVjdChtc2csIGRhdGEpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IHNwbGl0ZWRSZXBvcnRlclVSTCA9IHNwbGl0T2JqZWN0VVJMKG1zZy50byk7XG5cbiAgICBsZXQgdXJsID0gc3BsaXRlZFJlcG9ydGVyVVJMLnVybDtcblxuICAgIGxldCByZXNvdXJjZSA9IHNwbGl0ZWRSZXBvcnRlclVSTC5yZXNvdXJjZTtcbiAgICBsZXQgdmFsdWUgPSB7fTtcblxuLyogICAgbGV0IHZhbHVlID0ge1xuICAgICAgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LFxuICAgICAgdmFsdWU6IGRhdGFcbiAgICB9OyovXG5cbiAgICAvLyB0aGlzIGlkZW50aXR5IGRhdGEgaXMgbm90IG5lZWRlZCB0byBiZSBzdG9yZWRcbi8qICAgIGRlbGV0ZSB2YWx1ZS5pZGVudGl0eS5hc3NlcnRpb247XG4gICAgZGVsZXRlIHZhbHVlLmlkZW50aXR5LmV4cGlyZXM7Ki9cblxuICAgIGxldCBvYmplY3RVUkxSZXNvdXJjZSA9IG1zZy5ib2R5LnJlc291cmNlO1xuICAgIGxldCBhdHRyaWJ1dGUgPSByZXNvdXJjZTtcblxuICAgIGlmIChvYmplY3RVUkxSZXNvdXJjZSA9PT0gJ2hlYXJ0YmVhdCcpIHtcbiAgICAgIHZhbHVlID0gZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUuaWRlbnRpdHk9IG1zZy5ib2R5LmlkZW50aXR5O1xuICAgICAgdmFsdWUudmFsdWUgPSBkYXRhO1xuICAgIH0gXG5cbi8vICAgIGlmIChvYmplY3RVUkxSZXNvdXJjZSkgYXR0cmlidXRlICs9ICcuJyArIG9iamVjdFVSTFJlc291cmNlO1xuICAgIGlmIChvYmplY3RVUkxSZXNvdXJjZSkgYXR0cmlidXRlID0gb2JqZWN0VVJMUmVzb3VyY2U7XG5cbiAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuT2JzZXJ2ZXJPYmplY3QuX3N0b3JlQ2hpbGRPYmplY3RdIDogJywgdXJsLCBhdHRyaWJ1dGUsIHZhbHVlKTtcblxuICAgIF90aGlzLl9wYXJlbnQuX2RhdGFPYmplY3RzU3RvcmFnZS5zYXZlQ2hpbGRyZW5zKGZhbHNlLCB1cmwsIGF0dHJpYnV0ZSwgdmFsdWUpO1xuICB9XG5cbiAgcmVtb3ZlU3Vic2NyaXB0aW9uKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgaHlwZXJ0eSA9IG1zZy5mcm9tO1xuXG4gICAgbGV0IGRvbWFpbiA9IGRpdmlkZVVSTChoeXBlcnR5KS5kb21haW47XG4gICAgbGV0IG9ialVSTFN1YnNjcmlwdGlvbiA9IF90aGlzLl91cmwgKyAnL3N1YnNjcmlwdGlvbic7XG5cbiAgICBsZXQgc3Vic2NyaXB0aW9uID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbaHlwZXJ0eV07XG4gICAgaWYgKHN1YnNjcmlwdGlvbikge1xuICAgICAgLy9GTE9XLU9VVDogbWVzc2FnZSBzZW50IHRvIHJlbW90ZSBSZXBvcnRlck9iamVjdCAtPiBfb25SZW1vdGVVblN1YnNjcmliZVxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6ICd1bnN1YnNjcmliZScsIGZyb206IF90aGlzLl9wYXJlbnQuX3VybCwgdG86IG9ialVSTFN1YnNjcmlwdGlvbixcbiAgICAgICAgYm9keTogeyBzb3VyY2U6IGh5cGVydHksIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSB9XG4gICAgICB9KTtcblxuICAgICAgLy9UT0RPOiBzaG91bGQgSSB3YWl0IGZvciByZXNwb25zZSBiZWZvcmUgdW5zdWJzY3JpYmUgb24gbXNnLW5vZGVcbiAgICAgIC8vRkxPVy1PVVQ6IG1lc3NhZ2Ugc2VudCB0byBtc2ctbm9kZSBTdWJzY3JpcHRpb25NYW5hZ2VyIGNvbXBvbmVudFxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6ICd1bnN1YnNjcmliZScsIGZyb206IF90aGlzLl9wYXJlbnQuX3VybCwgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgZG9tYWluICsgJy9zbScsXG4gICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IF90aGlzLl91cmwsIHJlc291cmNlczogW190aGlzLl91cmwgKyAnL2NoaWxkcmVuLyddIH1cbiAgICAgIH0pO1xuXG4gICAgICBzdWJzY3JpcHRpb24uX3JlbGVhc2VMaXN0ZW5lcnMoKTtcbiAgICAgIGRlbGV0ZSBfdGhpcy5fc3Vic2NyaXB0aW9uc1toeXBlcnR5XTtcbiAgICB9XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBPYnNlcnZlck9iamVjdDtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLy8gTG9nIFN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdTeW5jaGVyTWFuYWdlcicpO1xuXG5pbXBvcnQgeyBkaXZpZGVVUkwsIGRlZXBDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbi8vaW1wb3J0IHsgc2NoZW1hVmFsaWRhdGlvbiB9IGZyb20gJy4uL3V0aWxzL3NjaGVtYVZhbGlkYXRpb24nO1xuXG5pbXBvcnQgQWRkcmVzc0FsbG9jYXRpb24gZnJvbSAnLi4vYWxsb2NhdGlvbi9BZGRyZXNzQWxsb2NhdGlvbic7XG5pbXBvcnQgUmVwb3J0ZXJPYmplY3QgZnJvbSAnLi9SZXBvcnRlck9iamVjdCc7XG5pbXBvcnQgT2JzZXJ2ZXJPYmplY3QgZnJvbSAnLi9PYnNlcnZlck9iamVjdCc7XG5pbXBvcnQgKiBhcyBjcnlwdG9NYW5hZ2VyIGZyb20gJy4uL2NyeXB0b01hbmFnZXIvQ3J5cHRvTWFuYWdlcic7XG5cbi8qKlxuICogQGF1dGhvciBtaWNhZWxwZWRyb3NhQGdtYWlsLmNvbVxuICogQ29yZSBTeW5jcm9uaXphdGlvbiBzeXN0ZW0uXG4gKi9cbmNsYXNzIFN5bmNoZXJNYW5hZ2VyIHtcbiAgLyogcHJpdmF0ZVxuICBfdXJsOiBVUkxcbiAgX2J1czogTWluaUJ1c1xuICBfcmVnaXN0cnk6IFJlZ2lzdHJ5XG4gIF9hbGxvY2F0b3I6IEFkZHJlc3NBbGxvY2F0aW9uXG5cbiAgX3JlcG9ydGVyczogeyBPYmplY3RVUkw6IFJlcG9ydGVyT2JqZWN0IH1cbiAgX29ic2VydmVyczogeyBPYmplY3RVUkw6IE9ic2VydmVyT2JqZWN0IH1cbiAgKi9cblxuICBjb25zdHJ1Y3RvcihydW50aW1lVVJMLCBidXMsIHJlZ2lzdHJ5LCBjYXRhbG9nLCBzdG9yYWdlTWFuYWdlciwgYWxsb2NhdG9yLCBzdG9yZURhdGFPYmplY3RzLCBpZGVudGl0eU1vZHVsZSkge1xuICAgIGlmICghcnVudGltZVVSTCkgdGhyb3cgbmV3IEVycm9yKCdbU3luY2hlciBNYW5hZ2VyXSAtIG5lZWRzIHRoZSBydW50aW1lVVJMIHBhcmFtZXRlcicpO1xuICAgIGlmICghYnVzKSB0aHJvdyBuZXcgRXJyb3IoJ1tTeW5jaGVyIE1hbmFnZXJdIC0gbmVlZHMgdGhlIE1lc3NhZ2VCdXMgaW5zdGFuY2UnKTtcbiAgICBpZiAoIXJlZ2lzdHJ5KSB0aHJvdyBuZXcgRXJyb3IoJ1tTeW5jaGVyIE1hbmFnZXJdIC0gbmVlZHMgdGhlIFJlZ2lzdHJ5IGluc3RhbmNlJyk7XG4gICAgaWYgKCFjYXRhbG9nKSB0aHJvdyBuZXcgRXJyb3IoJ1tTeW5jaGVyIE1hbmFnZXJdIC0gbmVlZHMgdGhlIFJ1bnRpbWVDYXRhbG9ndWUgaW5zdGFuY2UnKTtcbiAgICBpZiAoIXN0b3JhZ2VNYW5hZ2VyKSB0aHJvdyBuZXcgRXJyb3IoJ1tTeW5jaGVyIE1hbmFnZXJdIC0gbmVlZCB0aGUgc3RvcmFnZU1hbmFnZXIgaW5zdGFuY2UnKTtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5fYnVzID0gYnVzO1xuICAgIF90aGlzLl9yZWdpc3RyeSA9IHJlZ2lzdHJ5O1xuICAgIF90aGlzLl9jYXRhbG9nID0gY2F0YWxvZztcbiAgICBfdGhpcy5fc3RvcmFnZU1hbmFnZXIgPSBzdG9yYWdlTWFuYWdlcjtcbiAgICBfdGhpcy5faWRlbnRpdHlNb2R1bGUgPSBpZGVudGl0eU1vZHVsZTtcblxuICAgIC8vVE9ETzogdGhlc2Ugc2hvdWxkIGJlIHNhdmVkIGluIHBlcnNpc3RlbmNlIGVuZ2luZT9cbiAgICBfdGhpcy5ydW50aW1lVVJMID0gcnVudGltZVVSTDtcbiAgICBfdGhpcy5fdXJsID0gcnVudGltZVVSTCArICcvc20nO1xuICAgIF90aGlzLl9vYmplY3RVUkwgPSBydW50aW1lVVJMICsgJy9vYmplY3QtYWxsb2NhdGlvbic7XG5cbiAgICBfdGhpcy5fcmVwb3J0ZXJzID0ge307XG4gICAgX3RoaXMuX29ic2VydmVycyA9IHt9O1xuXG4gICAgX3RoaXMuX2RhdGFPYmplY3RzU3RvcmFnZSA9IHN0b3JlRGF0YU9iamVjdHM7XG4gICAgY29uc29sZS5sb2coJ1tOT1RTQVZJTkddIHN0b3JlRGF0YU9iamVjdHMnLCBzdG9yZURhdGFPYmplY3RzKTtcbiAgICAvL1RPRE86IHRoaXMgc2hvdWxkIG5vdCBiZSBoYXJkY29kZWQhXG4gICAgX3RoaXMuX2RvbWFpbiA9IGRpdmlkZVVSTChydW50aW1lVVJMKS5kb21haW47XG5cbiAgICBpZiAoYWxsb2NhdG9yKSB7XG4gICAgICBfdGhpcy5fYWxsb2NhdG9yID0gYWxsb2NhdG9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpcy5fYWxsb2NhdG9yID0gQWRkcmVzc0FsbG9jYXRpb24uaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyIC0gQWRkcmVzc0FsbG9jYXRpb25dIC0gJywgX3RoaXMuX2FsbG9jYXRvcik7XG5cbiAgICBidXMuYWRkTGlzdGVuZXIoX3RoaXMuX3VybCwgKG1zZykgPT4ge1xuICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyTWFuYWdlcl0gUkNWOiAnLCBtc2cpO1xuICAgICAgc3dpdGNoIChtc2cudHlwZSkge1xuICAgICAgICBjYXNlICdjcmVhdGUnOiBfdGhpcy5fb25DcmVhdGUobXNnKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2RlbGV0ZSc6IF90aGlzLl9vbkRlbGV0ZShtc2cpOyBicmVhaztcbiAgICAgICAgY2FzZSAnc3Vic2NyaWJlJzogX3RoaXMuX29uTG9jYWxTdWJzY3JpYmUobXNnKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3Vuc3Vic2NyaWJlJzogX3RoaXMuX29uTG9jYWxVblN1YnNjcmliZShtc2cpOyBicmVhaztcbiAgICAgICAgY2FzZSAncmVhZCc6IF90aGlzLl9vblJlYWQobXNnKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2V4ZWN1dGUnOiBfdGhpcy5fb25FeGVjdXRlKG1zZyk7IGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIH1cblxuICBnZXQgdXJsKCkgeyByZXR1cm4gdGhpcy5fdXJsOyB9XG5cbiAgICAgIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIFN5bmNoZXIgLT4gcmVhZFxuICAgICAgX29uRXhlY3V0ZShtc2cpIHtcblxuICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIGxldCByZXBseSA9IHtcbiAgICAgICAgICB0eXBlOiAncmVzcG9uc2UnLFxuICAgICAgICAgIGZyb206IG1zZy50byxcbiAgICAgICAgICB0bzogbXNnLmZyb20sXG4gICAgICAgICAgaWQ6IG1zZy5pZFxuICAgICAgICB9XG5cbiAgICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyTWFuYWdlci5vbkV4ZWN1dGVdIG5ldyBtZXNzYWdlJywgbXNnKTtcblxuICAgICAgICBpZiAobXNnLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ21ldGhvZCcpICYmIG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdwYXJhbXMnKSkge1xuXG4gICAgICAgIHN3aXRjaCAobXNnLmJvZHkubWV0aG9kKSB7XG4gICAgICAgICAgY2FzZSAnc3luYyc6IF90aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2Uuc3luYyhtc2cuYm9keS5wYXJhbXNbMF0sIG1zZy5ib2R5LnBhcmFtc1sxXSwgZmFsc2UpO1xuICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdzdG9wU3luYyc6IF90aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2Uuc3RvcFN5bmMobXNnLmJvZHkucGFyYW1zWzBdKTtcbiAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAgICAgcmVwbHkuYm9keSA9IHtcbiAgICAgICAgICAgICAgY29kZTogMjAwXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlcGx5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcGx5LmJvZHkgPSB7XG4gICAgICAgICAgICBjb2RlOiA0MDAsXG4gICAgICAgICAgICBkZXNjOiAnbWlzc2luZyBib2R5IG9yIGJvZHkgbWV0aG9kIC8gcGFyYW1zIG1hbmRhdG9yeSBmaWVsZHMnXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGxvZy5lcnJvcignW1N5bmNoZXJNYW5hZ2VyLm9uRXhlY3V0ZV0gZXJyb3IuIE1pc3NpbmcgYm9keSBvciBib2R5IG1ldGhvZCAvIHBhcmFtcyBtYW5kYXRvcnkgZmllbGRzJywgbXNnKTtcblxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVwbHkpO1xuXG5cbiAgICAgICAgfVxuXG4gICAgICB9XG5cbiAgICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBTeW5jaGVyIC0+IHJlYWRcbiAgICBfb25SZWFkKG1zZykge1xuXG4gICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBsZXQgcmVwbHkgPSB7XG4gICAgICAgIHR5cGU6ICdyZXNwb25zZScsXG4gICAgICAgIGZyb206IG1zZy50byxcbiAgICAgICAgdG86IG1zZy5mcm9tLFxuICAgICAgICBpZDogbXNnLmlkXG4gICAgICB9XG4gICAgICBsb2cuaW5mbygnW1N5bmNoZXJNYW5hZ2VyLm9uUmVhZF0gbmV3IG1lc3NhZ2UnLCBtc2cpO1xuXG4gICAgICBpZiAobXNnLmhhc093blByb3BlcnR5KCdib2R5JykgJiYgbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3Jlc291cmNlJykpIHtcbiAgICAgICAgX3RoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5zeW5jKG1zZy5ib2R5LnJlc291cmNlLCBjcml0ZXJpYS5iYWNrdXBSZXZpc2lvbiwgdHJ1ZSkudGhlbigoZGF0YU9iamVjdCk9PntcbiAgICAgICAgICByZXBseS5ib2R5ID0ge1xuICAgICAgICAgICAgY29kZTogMjAwLFxuICAgICAgICAgICAgdmFsdWU6IGRhdGFPYmplY3RcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyTWFuYWdlci5vblJlYWRdIGZvdW5kIG9iamVjdDogJywgZGF0YU9iamVjdCk7XG5cbiAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlcGx5KTtcbiAgICAgICAgfSwgKGVycm9yKT0+e1xuICAgICAgICAgIHJlcGx5LmJvZHkgPSB7XG4gICAgICAgICAgICBjb2RlOiA0MDAsXG4gICAgICAgICAgICBkZXNjOiBlcnJvclxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBsb2cuZXJyb3IoJ1tTeW5jaGVyTWFuYWdlci5vblJlYWRdIGVycm9yOiAnLCBlcnJvcik7XG5cbiAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlcGx5KTtcblxuICAgICAgICB9KTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVwbHkuYm9keSA9IHtcbiAgICAgICAgICBjb2RlOiA0MDAsXG4gICAgICAgICAgZGVzYzogJ21pc3NpbmcgYm9keSBvciBib2R5IHJlc291cmNlIG1hbmRhdG9yeSBmaWVsZHMnXG4gICAgICAgIH07XG5cbiAgICAgICAgbG9nLmVycm9yKCdbU3luY2hlck1hbmFnZXIub25SZWFkXSBlcnJvci4gTWlzc2luZyBib2R5IG9yIGJvZHkgcmVzb3VyY2UgbWFuZGF0b3J5IGZpZWxkcycsIG1zZyk7XG5cbiAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXBseSk7XG5cblxuICAgICAgfVxuXG4gICAgfVxuXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIFN5bmNoZXIgLT4gY3JlYXRlXG4gIF9vbkNyZWF0ZShtc2cpIHtcblxuICAgIGxldCBmcm9tID0gbXNnLmZyb207XG4gICAgbGV0IHRvID0gbXNnLnRvO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICAvLyBjaGVjayBpZiBtZXNzYWdlIGlzIHRvIHNhdmUgbmV3IGNoaWxkcmVuT2JqZWN0cyBpbiB0aGUgbG9jYWwgc3RvcmFnZVxuICAgIC8vIFRPRE86IGNoZWNrIGlmIG1lc3NhZ2UgaXMgdG8gc3RvcmUgbmV3IGNoaWxkIGluIHRoZSBsb2NhbCBzdG9yYWdlIGFuZCBjYWxsIHN0b3JlQ2hpbGQuIEhvdyB0byBkaXN0aW5ndWlzaCBmcm9tIG90aGVycz9cblxuICAgIC8vZGVidWdnZXI7XG4gICAgaWYgKG1zZy5ib2R5LmF0dHJpYnV0ZSkgeyB0aGlzLl9zdG9yZUNoaWxkcmVucyhtc2cpOyB9IGVsc2Uge1xuXG4gICAgICBpZiAoIW1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdyZXN1bWUnKSB8fCAobXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3Jlc3VtZScpICYmICFtc2cuYm9keS5yZXN1bWUpKSB7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBhbiBpbnZpdGF0aW9uIG1lc3NhZ2VcbiAgICAgICAgaWYgKG1zZy5ib2R5LmF1dGhvcmlzZSkge1xuICAgICAgICAgIHRoaXMuX2F1dGhvcmlzZShtc2cpO1xuICAgICAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIub25DcmVhdGUgLSBpbnZpdGUgb2JzZXJ2ZXJzXScsIG1zZyk7XG4gICAgICAgIH0gZWxzZSB7IC8vIHRoaXMgaXMgdG8gY3JlYXRlIGEgbmV3IGRhdGEgb2JqZWN0XG4gICAgICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyTWFuYWdlci5vbkNyZWF0ZSAtIENyZWF0ZSBOZXcgT2JqZWN0XScsIG1zZyk7XG4gICAgICAgICAgdGhpcy5fbmV3Q3JlYXRlKG1zZyk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICAvLyBJZiBmcm9tIHRoZSBoeXBlcnR5IHNpZGUsIGNhbGwgdGhlIHJlc3VtZVJlcG9ydGVyIHdlIHdpbGwgaGF2ZSByZXN1bWUgPSB0cnVlJ1xuICAgICAgICAvLyBzbyB3ZSB3aWxsIGNyZWF0ZSBhbiByZXN1bWVkIG9iamVjdCBhbmQgd2lsbCB0cnkgdG8gcmVzdW1lIHRoZSBvYmplY3QgcHJldmlvdXNseSBzYXZlZDtcbiAgICAgICAgdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLmdldFJlc291cmNlc0J5Q3JpdGVyaWEobXNnLCB0cnVlKS50aGVuKChyZXN1bHQpID0+IHtcblxuICAgICAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIgLSBDcmVhdGUgUmVzdW1lZF0gLSBSZXNvdXJjZXNCeUNyaXRlcmlhIHwgTWVzc2FnZTogJywgbXNnLCAnIHJlc3VsdDogJywgcmVzdWx0KTtcblxuICAgICAgICAgIGlmIChyZXN1bHQgJiYgT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwKSB7XG5cbiAgICAgICAgICAgIGxldCBsaXN0T2ZSZXBvcnRlcnMgPSBbXTtcblxuICAgICAgICAgICAgT2JqZWN0LmtleXMocmVzdWx0KS5mb3JFYWNoKChvYmpVUkwpID0+IHtcblxuICAgICAgICAgICAgICBsaXN0T2ZSZXBvcnRlcnMucHVzaChcbiAgICAgICAgICAgICAgICAgIF90aGlzLl9yZXN1bWVDcmVhdGUobXNnLCByZXN1bHRbb2JqVVJMXSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIFByb21pc2UuYWxsKGxpc3RPZlJlcG9ydGVycykudGhlbigocmVzdW1lZFJlcG9ydGVycykgPT4ge1xuICAgICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIgLSBDcmVhdGUgUmVzdW1lZF0nLCByZXN1bWVkUmVwb3J0ZXJzKTtcblxuICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91ZCBzZW5kIHRoZSBpbmZvcm1hdGlvbiBpZiBzb21lIG9iamVjdCB3YXMgZmFpbGluZztcbiAgICAgICAgICAgICAgbGV0IHN1Y2Nlc3NmdWxseVJlc3VtZWQgPSBPYmplY3QudmFsdWVzKHJlc3VtZWRSZXBvcnRlcnMpLmZpbHRlcigocmVwb3J0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVwb3J0ZXIgIT09IGZhbHNlO1xuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBsb2cuaW5mbygnW1N5bmNoZXJNYW5hZ2VyLm9uQ3JlYXRlXSByZXR1cm5pbmcgcmVzdW1lZCBvYmplY3RzIDogJywgc3VjY2Vzc2Z1bGx5UmVzdW1lZCk7XG5cbiAgICAgICAgICAgICAgLy9GTE9XLU9VVDogbWVzc2FnZSByZXNwb25zZSB0byBTeW5jaGVyIC0+IGNyZWF0ZSByZXN1bWVcbiAgICAgICAgICAgICAgdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiB0bywgdG86IGZyb20sXG4gICAgICAgICAgICAgICAgYm9keTogeyBjb2RlOiAyMDAsIHZhbHVlOiBkZWVwQ2xvbmUoc3VjY2Vzc2Z1bGx5UmVzdW1lZCkgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvKnN1Y2Nlc3NmdWxseVJlc3VtZWQuZm9yRWFjaCgocmVwb3J0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZXIuYmFja3VwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2Uuc3luYyhyZXBvcnRlci51cmwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7Ki9cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9mb3J3YXJkIHRvIGh5cGVydHk6XG4gICAgICAgICAgICBsZXQgcmVwbHkgPSB7fTtcbiAgICAgICAgICAgIHJlcGx5LmlkID0gbXNnLmlkO1xuICAgICAgICAgICAgcmVwbHkuZnJvbSA9IG1zZy50bztcbiAgICAgICAgICAgIHJlcGx5LnRvID0gbXNnLmZyb207XG4gICAgICAgICAgICByZXBseS50eXBlID0gJ3Jlc3BvbnNlJztcbiAgICAgICAgICAgIHJlcGx5LmJvZHkgPSB7XG4gICAgICAgICAgICAgIGNvZGU6IDQwNCxcbiAgICAgICAgICAgICAgZGVzYzogJ05vIGRhdGEgb2JqZWN0cyByZXBvcnRlcnMgdG8gYmUgcmVzdW1lZCdcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLl9idXMucG9zdE1lc3NhZ2UocmVwbHkpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgfVxuXG4gIF9zdG9yZUNoaWxkcmVucyhtc2cpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IHJlc291cmNlID0gbXNnLmJvZHkucmVzb3VyY2U7XG4gICAgbGV0IGF0dHJpYnV0ZSA9IG1zZy5ib2R5LmF0dHJpYnV0ZTtcblxuICAgIGlmIChhdHRyaWJ1dGUgPT09ICdjaGlsZHJlbk9iamVjdHMnKSB7XG4gICAgICBfdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLnNhdmVDaGlsZHJlbnMoZmFsc2UsIHJlc291cmNlLCB1bmRlZmluZWQsIG1zZy5ib2R5LnZhbHVlKTtcbiAgICB9IGVsc2UgeyBfdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLnNhdmVDaGlsZHJlbnModHJ1ZSwgcmVzb3VyY2UsIGF0dHJpYnV0ZSwgbXNnLmJvZHkudmFsdWUpO1xuICAgICAgIH1cblxuICB9XG5cbiAgX25ld0NyZWF0ZShtc2cpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IG93bmVyID0gbXNnLmZyb207XG4gICAgbGV0IGRvbWFpbiA9IGRpdmlkZVVSTChtc2cuZnJvbSkuZG9tYWluO1xuXG4gICAgLy8gaWYgcmVwb3J0ZXIgaXMgaW4gYSBJbnRlcndvcmtpbmcgUHJvdG9zdHViIHRoZSBydW50aW1lIGRvbWFpbiBiYWNrZW5kIHNlcnZpY2VzIHdpbGwgYmUgdXNlZFxuICAgIGlmIChfdGhpcy5fcmVnaXN0cnkuaXNJbnRlcndvcmtpbmdQcm90b1N0dWIobXNnLmZyb20pKSB7XG4gICAgICBkb21haW4gPSBkaXZpZGVVUkwoX3RoaXMucnVudGltZVVSTCkuZG9tYWluO1xuICAgIH1cblxuLy8gICAgbGV0IGRvbWFpblJlZ2lzdHJhdGlvbiA9IG1zZy5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdkb21haW5fcmVnaXN0cmF0aW9uJykgPyBtc2cuYm9keS52YWx1ZS5kb21haW5fcmVnaXN0cmF0aW9uIDogdHJ1ZTtcbiAgICBsZXQgZG9tYWluUm91dGluZyA9IG1zZy5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdkb21haW5fcm91dGluZycpID8gbXNnLmJvZHkudmFsdWUuZG9tYWluX3JvdXRpbmcgOiB0cnVlO1xuXG4gICAgLy8gUHJvY2VzcyBpbnZpdGF0aW9uIG1lc3NhZ2UgdG8gb2JzZXJ2ZXJzXG5cbiAgICAvKmlmIChtc2cuYm9keS5hdXRob3Jpc2UpIHtcbiAgICAgIF90aGlzLl9hdXRob3Jpc2UobXNnKTtcbiAgICAgIHJldHVybjtcbiAgICB9Ki9cblxuICAgIC8vZ2V0IHNjaGVtYSBmcm9tIGNhdGFsb2d1ZSBhbmQgcGFyc2UgLT4gKHNjaGVtZSwgY2hpbGRyZW4pXG4gICAgX3RoaXMuX2NhdGFsb2cuZ2V0RGF0YVNjaGVtYURlc2NyaXB0b3IobXNnLmJvZHkuc2NoZW1hKS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XG5cblxuXG5cbiAgICAgIGxldCBwcm9wZXJ0aWVzID0gZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcztcbiAgICAgIGxldCBzY2hlbWUgPSBwcm9wZXJ0aWVzLnNjaGVtZSA/IHByb3BlcnRpZXMuc2NoZW1lIDogJ3Jlc291cmNlJztcbiAgICAgIGxldCBjaGlsZHJlbnMgPSBwcm9wZXJ0aWVzLmNoaWxkcmVucyA/IHByb3BlcnRpZXMuY2hpbGRyZW5zIDogW107XG5cbiAgICAgIC8vIERvIHNjaGVtYSB2YWxpZGF0aW9uXG4gICAgICAvLyBUT0RPOiBjaGVjayBpZiBpcyBuZWVkIHRvIGhhbmRsZSB3aXRoIHRoZSByZXN1bHQgb2YgdmFsaWRhdGlvblxuICAgICAgLy8gICAgICBzY2hlbWFWYWxpZGF0aW9uKHNjaGVtZSwgZGVzY3JpcHRvciwgbXNnLmJvZHkudmFsdWUpO1xuXG4gICAgICBsZXQgb2JqZWN0SW5mbyA9IHtcbiAgICAgICAgbmFtZTogbXNnLmJvZHkudmFsdWUubmFtZSxcbiAgICAgICAgc2NoZW1hOiBtc2cuYm9keS52YWx1ZS5zY2hlbWEsXG4gICAgICAgIHJlcG9ydGVyOiBtc2cuYm9keS52YWx1ZS5yZXBvcnRlcixcbiAgICAgICAgcmVzb3VyY2VzOiBtc2cuYm9keS52YWx1ZS5yZXNvdXJjZXNcbiAgICAgIH07XG5cbiAgICAgIC8vIHNob3VsZCByZXN1c2UgZGF0YSBvYmplY3QgdXJsIGlmIGl0IHBhc3NlZFxuICAgICAgbGV0IHJldXNlRGF0YU9iamVjdCA9IG1zZy5ib2R5LnZhbHVlLnJlc291cmNlO1xuICAgICAgbGV0IG51bU9mQWRkcmVzcyA9IDE7XG5cbiAgICAgIC8vZGVidWdnZXI7XG4gICAgICAvL3JlcXVlc3QgYWRkcmVzcyBhbGxvY2F0aW9uIG9mIGEgbmV3IG9iamVjdCBmcm9tIHRoZSBtc2ctbm9kZVxuICAgICAgLy9fdGhpcy5fYWxsb2NhdG9yLmNyZWF0ZShkb21haW4sIG51bU9mQWRkcmVzcywgb2JqZWN0SW5mbywgc2NoZW1lLCByZXVzZURhdGFPYmplY3QpLnRoZW4oKGFsbG9jYXRlZCkgPT4ge1xuICAgICAgX3RoaXMuX2FsbG9jYXRvci5jcmVhdGUoZG9tYWluLCBudW1PZkFkZHJlc3MsIG9iamVjdEluZm8sIHNjaGVtZSwgcmV1c2VEYXRhT2JqZWN0KS50aGVuKChhbGxvY2F0ZWQpID0+IHtcblxuICAgICAgICBsZXQgb2JqZWN0UmVnaXN0cmF0aW9uID0gZGVlcENsb25lKG1zZy5ib2R5LnZhbHVlKTtcbiAgICAgICAgb2JqZWN0UmVnaXN0cmF0aW9uLnVybCA9IGFsbG9jYXRlZC5hZGRyZXNzWzBdO1xuICAgICAgICBvYmplY3RSZWdpc3RyYXRpb24uYXV0aG9yaXNlID0gbXNnLmJvZHkuYXV0aG9yaXNlO1xuICAgICAgICBvYmplY3RSZWdpc3RyYXRpb24uY2hpbGRyZW5zID0gY2hpbGRyZW5zO1xuXG4gICAgICAgIC8vb2JqZWN0UmVnaXN0cmF0aW9uLmV4cGlyZXMgPSAzMDsvL1RPRE86IGdldCBpdCBmcm9tIGRhdGEgb2JqZWN0IGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb24gd2hlbiBwcmVzZW50XG5cbiAgICAgICAgZGVsZXRlIG9iamVjdFJlZ2lzdHJhdGlvbi5kYXRhO1xuXG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fbmV3Q3JlYXRlXSBBTExPQ0FUT1IgQ1JFQVRFOicsIGFsbG9jYXRlZCk7XG5cbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvblVSTCA9IG9iamVjdFJlZ2lzdHJhdGlvbi51cmwgKyAnL3N1YnNjcmlwdGlvbic7XG5cbiAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLl9uZXdDcmVhdGVdIFN1YnNjcmlwdGlvbiBVUkwnLCBzdWJzY3JpcHRpb25VUkwpO1xuXG4gICAgICAgIC8vVG8gcmVnaXN0ZXIgdGhlIGRhdGFPYmplY3QgaW4gdGhlIHJ1bnRpbWVSZWdpc3RyeVxuICAgICAgICBsb2cuaW5mbygnW1N5bmNoZXJNYW5hZ2VyLl9uZXdDcmVhdGVdIFJlZ2lzdGVyIE9iamVjdDogJywgb2JqZWN0UmVnaXN0cmF0aW9uKTtcblxuICAgICAgICAvL190aGlzLl9yZWdpc3RyeS5yZWdpc3RlckRhdGFPYmplY3QobXNnLmJvZHkudmFsdWUubmFtZSwgbXNnLmJvZHkudmFsdWUuc2NoZW1hLCBvYmpVUkwsIG1zZy5ib2R5LnZhbHVlLnJlcG9ydGVyLCBtc2cuYm9keS52YWx1ZS5yZXNvdXJjZXMsIGFsbG9jYXRlZCwgbXNnLmJvZHkuYXV0aG9yaXNlKS50aGVuKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIF90aGlzLl9yZWdpc3RyeS5yZWdpc3RlckRhdGFPYmplY3Qob2JqZWN0UmVnaXN0cmF0aW9uKS50aGVuKChyZWdpc3RlcmVkT2JqZWN0KSA9PiB7XG4gICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLl9uZXdDcmVhdGVdIERhdGFPYmplY3Qgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQnLCByZWdpc3RlcmVkT2JqZWN0KTtcblxuICAgICAgICAgIC8vYWxsIE9LIC0+IGNyZWF0ZSByZXBvcnRlciBhbmQgcmVnaXN0ZXIgbGlzdGVuZXJzXG4gICAgICAgICAgbGV0IHJlcG9ydGVyO1xuXG5cbiAgICAgICAgICBpZiAoIXRoaXMuX3JlcG9ydGVyc1tvYmplY3RSZWdpc3RyYXRpb24udXJsXSkge1xuICAgICAgICAgICAgbGV0IG9mZmxpbmUgPSBvYmplY3RSZWdpc3RyYXRpb24ub2ZmbGluZSA/IG9iamVjdFJlZ2lzdHJhdGlvbi5vZmZsaW5lIDogZmFsc2U7XG4gICAgICAgICAgICByZXBvcnRlciA9IG5ldyBSZXBvcnRlck9iamVjdChfdGhpcywgb3duZXIsIG9iamVjdFJlZ2lzdHJhdGlvbi51cmwsIGNoaWxkcmVucywgb2ZmbGluZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcG9ydGVyID0gdGhpcy5fcmVwb3J0ZXJzW29iamVjdFJlZ2lzdHJhdGlvbi51cmxdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlciAtIG5ldyBDcmVhdGVdIC0gJywgbXNnKTtcblxuICAgICAgICAgIC8vIFN0b3JlIGZvciBlYWNoIHJlcG9ydGVyIGh5cGVydHkgdGhlIGRhdGFPYmplY3RcbiAgICAgICAgICBsZXQgdXNlclVSTDtcbiAgICAgICAgICAvLyBsZXQgaW50ZXJ3b3JraW5nID0gZmFsc2U7XG5cbiAgICAgICAgICBpZiAobXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ2lkZW50aXR5JykgJiYgbXNnLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUgJiYgbXNnLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUudXNlclVSTCkge1xuICAgICAgICAgICAgdXNlclVSTCA9IG1zZy5ib2R5LmlkZW50aXR5LnVzZXJQcm9maWxlLnVzZXJVUkw7XG5cbiAgICAgICAgICAgIC8vIGlmICghdXNlclVSTC5pbmNsdWRlcygndXNlcjovLycpKSB7XG4gICAgICAgICAgICAvLyAgIGludGVyd29ya2luZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVzZXJVUkwgPSBfdGhpcy5fcmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKG1zZy5mcm9tKTtcblxuICAgICAgICAgICAgLy8gaWYgKCF1c2VyVVJMKSB7XG4gICAgICAgICAgICAvLyAgIGludGVyd29ya2luZyA9IHRydWU7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2hvdWxkIHdlIHVzZSB0aGUgbXNnLmJvZHkudmFsdWUgaW5zdGVhZD9cblxuICAgICAgICAgIGxldCBtZXRhZGF0YSA9IGRlZXBDbG9uZShvYmplY3RSZWdpc3RyYXRpb24pO1xuICAgICAgICAgIG1ldGFkYXRhLnN1YnNjcmliZXJVc2VyID0gdXNlclVSTDtcbiAgICAgICAgICBtZXRhZGF0YS5pc1JlcG9ydGVyID0gdHJ1ZTtcblxuICAgICAgICAgIC8vIFN0b3JlIHRoZSBkYXRhT2JqZWN0IGluZm9ybWF0aW9uXG5cbiAgICAgICAgICAvL2lmICghaW50ZXJ3b3JraW5nKSB7XG5cbiAgICAgICAgICBpZiAobXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3N0b3JlJykgJiYgbXNnLmJvZHkuc3RvcmUpIHtcbiAgICAgICAgICAgIHJlcG9ydGVyLmlzVG9TYXZlRGF0YSA9IHRydWU7XG4gICAgICAgICAgICBtZXRhZGF0YS5pc1RvU2F2ZURhdGEgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKG1zZy5ib2R5LnZhbHVlLmRhdGEpIHtcbiAgICAgICAgICAgICAgbWV0YWRhdGEuZGF0YSA9IGRlZXBDbG9uZShtc2cuYm9keS52YWx1ZS5kYXRhKTtcbi8vICAgICAgICAgICAgICBfdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLnNhdmVEYXRhKHRydWUsIG9iamVjdFJlZ2lzdHJhdGlvbi51cmwsIG51bGwsIG1zZy5ib2R5LnZhbHVlLmRhdGEpOyB9XG4vLyAgICAgICAgICAgIF90aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2UudXBkYXRlKHRydWUsIG9iamVjdFJlZ2lzdHJhdGlvbi51cmwsICdpc1RvU2F2ZURhdGEnLCB0cnVlKTtcblxuLy8gICAgICAgICAgICBpZiAobXNnLmJvZHkudmFsdWUuZGF0YSkgeyBfdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLnNhdmVEYXRhKHRydWUsIG9iamVjdFJlZ2lzdHJhdGlvbi51cmwsIG51bGwsIG1zZy5ib2R5LnZhbHVlLmRhdGEpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIF90aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2Uuc2V0KG1ldGFkYXRhKS50aGVuKChzdG9yZU9iamVjdCkgPT4ge1xuXG4gICAgICAgICAgICBpZiAobWV0YWRhdGEub2ZmbGluZSkgeyAvL3JlZ2lzdGVyIG5ldyBEYXRhT2JqZWN0IGF0IE9mZmxpbmUgU3Vic2NyaXB0aW9uIE1hbmFnZXJcbiAgICAgICAgICAgICAgbXNnLmJvZHkuaWRlbnRpdHkuZ3VpZCA9IF90aGlzLl9pZGVudGl0eU1vZHVsZS5faWRlbnRpdGllcy5ndWlkO1xuICAgICAgICAgICAgICBsZXQgZm9yd2FyZCA9IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBtc2cudG8sXG4gICAgICAgICAgICAgICAgdG86IG1ldGFkYXRhLm9mZmxpbmUgKyAnL3JlZ2lzdGVyJyxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZm9yd2FyZCcsXG4gICAgICAgICAgICAgICAgYm9keTogbXNnXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgZm9yd2FyZC5ib2R5LmJvZHkucmVzb3VyY2UgPSBvYmplY3RSZWdpc3RyYXRpb24udXJsO1xuXG4gICAgICAgICAgICAgIGZvcndhcmQuYm9keS5ib2R5LnZhbHVlID0gbWV0YWRhdGE7XG5cbiAgICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLm5ld0NyZWF0ZV0gcmVnaXN0ZXJpbmcgbmV3IG9iamVjdCBhdCBvZmZsaW5lIG1hbmFnZXIgJywgZm9yd2FyZCk7XG5cbiAgICAgICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShmb3J3YXJkKTtcblxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgLy99XG4gICAgICAgICAgbGV0IHJlc3BvbnNlTXNnID0ge1xuICAgICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogb3duZXIsXG4gICAgICAgICAgICBib2R5OiB7IGNvZGU6IDIwMCwgcmVzb3VyY2U6IG9iamVjdFJlZ2lzdHJhdGlvbi51cmwsIGNoaWxkcmVuUmVzb3VyY2VzOiBjaGlsZHJlbnMgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBhZGRpbmcgbGlzdGVuZXJzIHRvIGZvcndhcmQgdG8gcmVwb3J0ZXJcblxuICAgICAgICAgIGlmIChkb21haW5Sb3V0aW5nKSB7XG5cbiAgICAgICAgICAgIHJlcG9ydGVyLmZvcndhcmRTdWJzY3JpYmUoW29iamVjdFJlZ2lzdHJhdGlvbi51cmwsIHN1YnNjcmlwdGlvblVSTF0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICByZXBvcnRlci5hZGRDaGlsZHJlbnMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXJzW29iamVjdFJlZ2lzdHJhdGlvbi51cmxdID0gcmVwb3J0ZXI7XG5cblxuICAgICAgICAgICAgICAgIC8vRkxPVy1PVVQ6IG1lc3NhZ2UgcmVzcG9uc2UgdG8gU3luY2hlciAtPiBjcmVhdGVcbiAgICAgICAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlTXNnKTtcblxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXBvcnRlci5hZGRDaGlsZHJlbnMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgX3RoaXMuX3JlcG9ydGVyc1tvYmplY3RSZWdpc3RyYXRpb24udXJsXSA9IHJlcG9ydGVyO1xuXG5cbiAgICAgICAgICAgICAgLy9GTE9XLU9VVDogbWVzc2FnZSByZXNwb25zZSB0byBTeW5jaGVyIC0+IGNyZWF0ZVxuICAgICAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlTXNnKTtcblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICB9XG4gICAgICAgICAgfSwgKGVycm9yKT0+IHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihlcnJvcik7XG4gICAgICAgICAgfSk7XG5cblxuICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9KTtcblxuICAgICAgfSk7XG4gICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgLy9GTE9XLU9VVDogZXJyb3IgbWVzc2FnZSByZXNwb25zZSB0byBTeW5jaGVyIC0+IGNyZWF0ZVxuICAgICAgbGV0IHJlc3BvbnNlTXNnID0ge1xuICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBvd25lcixcbiAgICAgICAgYm9keTogeyBjb2RlOiA1MDAsIGRlc2M6IHJlYXNvbiB9XG4gICAgICB9O1xuXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlTXNnKTtcbiAgICB9KTtcblxuICB9XG5cbiAgX3Jlc3VtZUNyZWF0ZShtc2csIHN0b3JlZE9iamVjdCkge1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgICBsZXQgb3duZXIgPSBtc2cuZnJvbTtcbiAgICAgIGxldCBzY2hlbWEgPSBzdG9yZWRPYmplY3Quc2NoZW1hO1xuICAgICAgbGV0IHJlc291cmNlID0gc3RvcmVkT2JqZWN0LnVybDtcbiAgICAgIGxldCBkb21haW5SZWdpc3RyYXRpb24gPSBzdG9yZWRPYmplY3QuaGFzT3duUHJvcGVydHkoJ2RvbWFpbl9yZWdpc3RyYXRpb24nKSA/IHN0b3JlZE9iamVjdC5kb21haW5fcmVnaXN0cmF0aW9uIDogdHJ1ZTtcbiAgICAgIGxldCBpbml0aWFsRGF0YSA9IHN0b3JlZE9iamVjdC5kYXRhO1xuXG4gICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXJdIC0gcmVzdW1lIGNyZWF0ZScsIG1zZywgc3RvcmVkT2JqZWN0KTtcblxuICAgICAgLy9nZXQgc2NoZW1hIGZyb20gY2F0YWxvZ3VlIGFuZCBwYXJzZSAtPiAoc2NoZW1lLCBjaGlsZHJlbilcbiAgICAgIF90aGlzLl9jYXRhbG9nLmdldERhdGFTY2hlbWFEZXNjcmlwdG9yKHNjaGVtYSkudGhlbigoZGVzY3JpcHRvcikgPT4ge1xuXG4gICAgICAgIGxldCBwcm9wZXJ0aWVzID0gZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcztcbiAgICAgICAgbGV0IHNjaGVtZSA9IHByb3BlcnRpZXMuc2NoZW1lID8gcHJvcGVydGllcy5zY2hlbWUuY29uc3RhbnQgOiAncmVzb3VyY2UnO1xuICAgICAgICBsZXQgY2hpbGRyZW5zID0gcHJvcGVydGllcy5jaGlsZHJlbnMgPyBwcm9wZXJ0aWVzLmNoaWxkcmVucyA6IFtdO1xuXG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlcl0gLSBnZXREYXRhU2NoZW1hRGVzY3JpcHRvcjogJywgZGVzY3JpcHRvciwgY2hpbGRyZW5zKTtcblxuICAgICAgICAvLyBEbyBzY2hlbWEgdmFsaWRhdGlvblxuICAgICAgICAvLyBUT0RPOiBjaGVjayBpZiBpcyBuZWVkIHRvIGhhbmRsZSB3aXRoIHRoZSByZXN1bHQgb2YgdmFsaWRhdGlvblxuICAgICAgICAvLyAgICAgICAgc2NoZW1hVmFsaWRhdGlvbihzY2hlbWUsIGRlc2NyaXB0b3IsIGluaXRpYWxEYXRhKTtcblxuXG4gICAgICAgIC8vYWxsIE9LIC0+IGNyZWF0ZSByZXBvcnRlciBhbmQgcmVnaXN0ZXIgbGlzdGVuZXJzXG4gICAgICAgIGxldCByZXBvcnRlcjtcbiAgICAgICAgbGV0IG9mZmxpbmU7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9yZXBvcnRlcnNbcmVzb3VyY2VdKSB7XG4gICAgICAgICAgb2ZmbGluZSA9IHN0b3JlZE9iamVjdC5vZmZsaW5lID8gc3RvcmVkT2JqZWN0Lm9mZmxpbmUgOiBmYWxzZTtcbiAgICAgICAgICByZXBvcnRlciA9IG5ldyBSZXBvcnRlck9iamVjdChfdGhpcywgb3duZXIsIHJlc291cmNlLCBjaGlsZHJlbnMsIG9mZmxpbmUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcG9ydGVyID0gdGhpcy5fcmVwb3J0ZXJzW3Jlc291cmNlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcG9ydGVyLmlzVG9TYXZlRGF0YSA9IHN0b3JlZE9iamVjdC5pc1RvU2F2ZURhdGE7XG5cbiAgICAgICAgaWYgKG9mZmxpbmUpIHsgLy91cGRhdGUgbmV3IERhdGFPYmplY3QgYXQgT2ZmbGluZSBTdWJzY3JpcHRpb24gTWFuYWdlclxuICAgICAgICAgIGxldCBtc2cgPSB7XG4gICAgICAgICAgICBmcm9tOiBfdGhpcy5fdXJsLFxuICAgICAgICAgICAgdG86IG9mZmxpbmUgKyAnL3JlZ2lzdGVyJyxcbiAgICAgICAgICAgIHR5cGU6ICd1cGRhdGUnLFxuICAgICAgICAgICAgYm9keToge31cbiAgICAgICAgICB9O1xuICBcbiAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuX3Jlc3VtZUNyZWF0ZV0gdXBkYXRlIG9iamVjdCBhdCBvZmZsaW5lIG1hbmFnZXIgJywgbXNnKTtcbiAgXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2cpO1xuICBcbiAgXG4gICAgICAgIH1cbiAgXG5cbiAgICAgICAgaWYgKGRvbWFpblJlZ2lzdHJhdGlvbikge1xuICAgICAgICAgIHJlcG9ydGVyLmZvcndhcmRTdWJzY3JpYmUoW3N0b3JlZE9iamVjdC51cmxdKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fcmVzdW1lQ3JlYXRlXSByZXN1bWluZ1JlcG9ydGVyU3Vic2NyaXB0aW9uICcsIHN0b3JlZE9iamVjdCk7XG4gICAgICAgICAgICBfdGhpcy5fcmVzdW1lUmVwb3J0ZXJTdWJzY3JpcHRpb25zKG1zZywgc3RvcmVkT2JqZWN0LCByZXBvcnRlciwgY2hpbGRyZW5zLCBkb21haW5SZWdpc3RyYXRpb24pLnRoZW4oKHJlc3VtZU9iamVjdCk9PntcbiAgICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLl9yZXN1bWVDcmVhdGVdIHJlc29sdmVkIHJlc3VtZWQgb2JqZWN0ICcsIHJlc3VtZU9iamVjdCk7XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzdW1lT2JqZWN0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSByZXNvbHZlKF90aGlzLl9yZXN1bWVSZXBvcnRlclN1YnNjcmlwdGlvbnMobXNnLCBzdG9yZWRPYmplY3QsIHJlcG9ydGVyLCBjaGlsZHJlbnMsIGRvbWFpblJlZ2lzdHJhdGlvbikpO1xuXG4gICAgICAgIC8vICByZXNvbHZlKCk7XG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgIGxvZy5lcnJvcignW1N5bmNoZXJNYW5hZ2VyIC0gcmVzdW1lIGNyZWF0ZV0gLSBmYWlsIG9uIGdldERhdGFTY2hlbWFEZXNjcmlwdG9yOiAnLCByZWFzb24pO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX3Jlc3VtZVJlcG9ydGVyU3Vic2NyaXB0aW9ucyhtc2csIHN0b3JlZE9iamVjdCwgcmVwb3J0ZXIsIGNoaWxkcmVucywgZG9tYWluUmVnaXN0cmF0aW9uKXtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIGxldCByZXNvdXJjZSA9IHN0b3JlZE9iamVjdC51cmw7XG4gICAgbGV0IG9iamVjdFJlZ2lzdHJhdGlvbiA9IGRlZXBDbG9uZShtc2cuYm9keS52YWx1ZSk7XG4gICAgb2JqZWN0UmVnaXN0cmF0aW9uLnVybCA9IHN0b3JlZE9iamVjdC51cmw7XG4gICAgb2JqZWN0UmVnaXN0cmF0aW9uLmV4cGlyZXMgPSBzdG9yZWRPYmplY3QuZXhwaXJlcztcbiAgICBvYmplY3RSZWdpc3RyYXRpb24uZG9tYWluX3JlZ2lzdHJhdGlvbiA9IGRvbWFpblJlZ2lzdHJhdGlvbjtcblxuICAgIGRlbGV0ZSBvYmplY3RSZWdpc3RyYXRpb24uZGF0YTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG5cbiAgICByZXBvcnRlci5hZGRDaGlsZHJlbnMoKS50aGVuKCgpID0+IHtcblxuICAgICAgcmVwb3J0ZXIucmVzdW1lU3Vic2NyaXB0aW9ucyhzdG9yZWRPYmplY3Quc3Vic2NyaXB0aW9ucyk7XG5cbiAgICAgIF90aGlzLl9yZXBvcnRlcnNbcmVzb3VyY2VdID0gcmVwb3J0ZXI7XG5cbiAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIgLSByZXN1bWUgY3JlYXRlXSAtIHJlc29sdmVkIHJlc3VtZWQ6ICcsIHN0b3JlZE9iamVjdCk7XG5cbiAgICAgIHJldHVybiBfdGhpcy5fZGVjcnlwdENoaWxkcmVucyhzdG9yZWRPYmplY3QsIGNoaWxkcmVucyk7XG4gICAgfSkudGhlbigoZGVjcnlwdGVkT2JqZWN0KSA9PiB7XG5cbiAgICAgIGxvZy5pbmZvKCdbU3luY2hlck1hbmFnZXIuX3Jlc3VtZVJlcG9ydGVyU3Vic2NyaXB0aW9uc10gUmVnaXN0ZXIgT2JqZWN0OiAnLCBvYmplY3RSZWdpc3RyYXRpb24pO1xuICAgICAgX3RoaXMuX3JlZ2lzdHJ5LnJlZ2lzdGVyRGF0YU9iamVjdChvYmplY3RSZWdpc3RyYXRpb24pLnRoZW4oKHJlZ2lzdGVyZWQpID0+IHtcbiAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLl9yZXN1bWVSZXBvcnRlclN1YnNjcmlwdGlvbnNdIERhdGFPYmplY3QgcmVnaXN0cmF0aW9uIHN1Y2Nlc3NmdWxseSB1cGRhdGVkJywgcmVnaXN0ZXJlZCk7XG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fcmVzdW1lUmVwb3J0ZXJTdWJzY3JpcHRpb25zXSByZXNvbHZpbmcgb2JqZWN0JywgZGVjcnlwdGVkT2JqZWN0KTtcbiAgICAgICAgcmVzb2x2ZShkZWNyeXB0ZWRPYmplY3QpO1xuXG4gICAgICB9KTtcblxuICAgICAgLy8gbG9nLmxvZygncmVzdWx0IG9mIHByZXZpb3VzIHByb21pc2UnKTtcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICBsb2cuZXJyb3IoJ1tTeW5jaGVyTWFuYWdlciAtIHJlc3VtZSBjcmVhdGVdIC0gZmFpbCBvbiBhZGRDaGlsZHJlbnM6ICcsIHJlYXNvbik7XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgfVxuXG4gIC8vIHRvIGRlY3J5cHQgRGF0YUNoaWxkT2JqZWN0cyBpZiB0aGV5IGFyZSBlbmNyeXB0ZWRcblxuICBfZGVjcnlwdENoaWxkcmVucyhlbmNyeXB0ZWRPYmplY3QsIGNoaWxkcmVucykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgc3RvcmVkT2JqZWN0ID0gZGVlcENsb25lKGVuY3J5cHRlZE9iamVjdCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cbiAgICAgIGlmICghY2hpbGRyZW5zKSB7IHJlc29sdmUoc3RvcmVkT2JqZWN0KTsgfSBlbHNlIHtcbiAgICAgICAgbGV0IGNoaWxkcmVuc09iaiA9IE9iamVjdC5rZXlzKHN0b3JlZE9iamVjdC5jaGlsZHJlbk9iamVjdHMpO1xuXG4gICAgICAgIGlmIChjaGlsZHJlbnNPYmoubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmVzb2x2ZShzdG9yZWRPYmplY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkcmVuKSA9PiB7XG5cbi8vICAgICAgICAgIGxldCBjaGlsZE9iamVjdHMgPSBzdG9yZWRPYmplY3QuY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuXTtcbiAgICAgICAgICBsZXQgY2hpbGRPYmplY3RzID0gc3RvcmVkT2JqZWN0LmNoaWxkcmVuT2JqZWN0cztcblxuICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fZGVjcnlwdENoaWxkcmVuc10gZGF0YU9iamVjdENoaWxkcyB0byBkZWNyeXB0ICcsIGNoaWxkT2JqZWN0cyk7XG5cbiAgICAgICAgICBsZXQgbGlzdE9mRGVjcnlwdGVkT2JqZWN0cyA9IFtdO1xuXG4gICAgICAgICAgT2JqZWN0LmtleXMoY2hpbGRPYmplY3RzKS5mb3JFYWNoKChjaGlsZElkKSA9PiB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBjaGlsZE9iamVjdHNbY2hpbGRJZF07XG4gICAgICAgICAgICBsZXQgb3duZXIgPSBjaGlsZElkLnNwbGl0KCcjJylbMF07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLl9kZWNyeXB0Q2hpbGRyZW5zXSBjcmVhdGVkQnkgJywgb3duZXIsICcgb2JqZWN0OiAnLCBjaGlsZC52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgbGV0IGRlY3J5cHRlZCA9IGNyeXB0b01hbmFnZXIuZGVmYXVsdC5kZWNyeXB0RGF0YU9iamVjdChKU09OLnBhcnNlKGNoaWxkLnZhbHVlKSwgc3RvcmVkT2JqZWN0LnVybCk7XG5cbiAgICAgICAgICAgICAgbGlzdE9mRGVjcnlwdGVkT2JqZWN0cy5wdXNoKGRlY3J5cHRlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBQcm9taXNlLmFsbChsaXN0T2ZEZWNyeXB0ZWRPYmplY3RzKS50aGVuKChkZWNyeXB0ZWRPYmplY3RzKSA9PiB7XG5cbiAgICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fZGVjcnlwdENoaWxkcmVuc10gcmV0dXJuaW5nIGRlY3J5cHRlZCAnLCBkZWNyeXB0ZWRPYmplY3RzKTtcblxuICAgICAgICAgICAgZGVjcnlwdGVkT2JqZWN0cy5mb3JFYWNoKChkZWNyeXB0ZWRPYmplY3QpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRJZCA9IGRlY3J5cHRlZE9iamVjdC52YWx1ZS51cmw7XG4gICAgICAgICAgICAgIHN0b3JlZE9iamVjdC5jaGlsZHJlbk9iamVjdHNbY2hpbGRJZF0udmFsdWUgPSBkZWNyeXB0ZWRPYmplY3QudmFsdWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLl9kZWNyeXB0Q2hpbGRyZW5zXSBzdG9yZWRPYmplY3QgJywgc3RvcmVkT2JqZWN0KTtcblxuICAgICAgICAgICAgcmVzb2x2ZShzdG9yZWRPYmplY3QpO1xuXG4gICAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgbG9nLndhcm4oJ1tTeW5jaGVyTWFuYWdlci5fZGVjcnlwdENoaWxkcmVuc10gZmFpbGVkIDogJywgcmVhc29uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBQcm9jZXNzIGludml0YXRpb25zIHRvIG9ic2VydmVyc1xuXG4gIF9hdXRob3Jpc2UobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGlmICghbXNnLmJvZHkucmVzb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1N5bmNoZXJNYW5hZ2VyLl9hdXRob3Jpc2VdIGludml0YXRpb24gcmVxdWVzdCB3aXRob3V0IGRhdGEgb2JqZWN0IHVybDonLCBtc2cpO1xuICAgIH1cblxuICAgIGxldCBvYmpTdWJzY3JpcHRvclVSTCA9IG1zZy5ib2R5LnJlc291cmNlICsgJy9zdWJzY3JpcHRpb24nO1xuICAgIGxldCBwMnAgPSBtc2cuYm9keS5wMnAgPyBtc2cuYm9keS5wMnAgOiBmYWxzZTtcblxuICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlciAtICBhdXRob3Jpc2VdIC0gJywgbXNnKTtcblxuICAgIGlmIChtc2cuYm9keS5hdXRob3Jpc2UpIHtcbiAgICAgIG1zZy5ib2R5LmF1dGhvcmlzZS5mb3JFYWNoKChoeXBlcnR5VVJMKSA9PiB7XG4gICAgICAgIC8vRkxPVy1PVVQ6IHNlbmQgaW52aXRlcyB0byBsaXN0IG9mIHJlbW90ZSBTeW5jaGVyIC0+IF9vblJlbW90ZUNyZWF0ZSAtPiBvbk5vdGlmaWNhdGlvblxuXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHR5cGU6ICdjcmVhdGUnLCBmcm9tOiBvYmpTdWJzY3JpcHRvclVSTCwgdG86IGh5cGVydHlVUkwsXG4gICAgICAgICAgYm9keTogeyBwMnA6IHAycCwgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LCBzb3VyY2U6IG1zZy5mcm9tLCB2YWx1ZTogbXNnLmJvZHkudmFsdWUsIHNjaGVtYTogbXNnLmJvZHkuc2NoZW1hIH1cbiAgICAgICAgfSwgKHJlcGx5KSA9PiB7IC8vIGxldHMgZm9yd2FyZCB0aGUgaW52aXRhdGlvbiByZXNwb25zZVxuICAgICAgICAgIGxldCByZXNwb25zZSA9IHtcbiAgICAgICAgICAgIGZyb206IG1zZy50byxcbiAgICAgICAgICAgIHRvOiBtc2cuZnJvbSxcbiAgICAgICAgICAgIGlkOiBtc2cuaWQsXG4gICAgICAgICAgICB0eXBlOiByZXBseS50eXBlLFxuICAgICAgICAgICAgYm9keTogcmVwbHkuYm9keVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBEYXRhT2JqZWN0UmVwb3J0ZXIgLT4gZGVsZXRlXG4gIF9vbkRlbGV0ZShtc2cpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IG9ialVSTCA9IG1zZy5ib2R5LnJlc291cmNlO1xuXG4gICAgbGV0IG9iamVjdCA9IF90aGlzLl9yZXBvcnRlcnNbb2JqVVJMXTtcbiAgICBpZiAob2JqZWN0KSB7XG4gICAgICAvL1RPRE86IGlzIHRoZXJlIGFueSBwb2xpY3kgdmVyaWZpY2F0aW9uIGJlZm9yZSBkZWxldGU/XG5cbiAgICAgIGlmIChvYmplY3Qub2ZmbGluZSkgeyAvL3JlZ2lzdGVyIG5ldyBEYXRhT2JqZWN0IGF0IE9mZmxpbmUgU3Vic2NyaXB0aW9uIE1hbmFnZXJcbiAgICAgICAgbGV0IGZvcndhcmQgPSB7XG4gICAgICAgICAgZnJvbTogbXNnLnRvLFxuICAgICAgICAgIHRvOiBvYmplY3Qub2ZmbGluZSArICcvcmVnaXN0ZXInLFxuICAgICAgICAgIHR5cGU6ICdmb3J3YXJkJyxcbiAgICAgICAgICBib2R5OiBtc2dcbiAgICAgICAgfTtcblxuICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuX29uRGVsZXRlXSB1bnJlZ2lzdGVyaW5nIG9iamVjdCBmcm9tIG9mZmxpbmUgbWFuYWdlciAnLCBmb3J3YXJkKTtcblxuICAgICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKGZvcndhcmQpO1xuXG5cbiAgICAgIH1cblxuICAgICAgb2JqZWN0LmRlbGV0ZSgpO1xuXG4gICAgICB0aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2UuZGVsZXRlUmVzb3VyY2Uob2JqVVJMKS50aGVuKChyZXN1bHQpID0+IHtcblxuXG4gICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlciAtIG9uRGVsZXRlXSAtIGRlbGV0ZVJlc291cmNlOiAnLCByZXN1bHQpO1xuXG4gICAgICAgIF90aGlzLl9yZWdpc3RyeS51bnJlZ2lzdGVyRGF0YU9iamVjdChvYmpVUkwpO1xuXG5cbiAgICAgICAgLy9UT0RPOiB1bnJlZ2lzdGVyIG9iamVjdD9cbiAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXG4gICAgICAgICAgYm9keTogeyBjb2RlOiAyMDAgfVxuICAgICAgICB9KTtcblxuICAgICAgfSk7XG5cbiAgICB9XG4gIH1cblxuXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIGxvY2FsIFN5bmNoZXIgLT4gc3Vic2NyaWJlXG4gIF9vbkxvY2FsU3Vic2NyaWJlKG1zZykge1xuICAgIC8vZGVidWdnZXI7XG5cbiAgICBpZiAobXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3Jlc3VtZScpICYmIChtc2cuYm9keS5yZXN1bWUgKSkge1xuICAgICAgdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLmdldFJlc291cmNlc0J5Q3JpdGVyaWEobXNnLCBmYWxzZSkudGhlbigocmVzdWx0KSA9PiB7XG5cbiAgICAgICAgbG9nLmluZm8oJ1tTeW5jaGVyTWFuYWdlci5vbkxvY2FsU3Vic2NyaWJlLiByZXN1bWVdOiAnLCBtc2csICcgcmVzdWx0OiAnLCByZXN1bHQpO1xuICBcbiAgICAgICAgaWYgKHJlc3VsdCAmJiBPYmplY3Qua2V5cyhyZXN1bHQpLmxlbmd0aCA+IDApIHtcbiAgXG4gICAgICAgICAgbGV0IGxpc3RPZk9ic2VydmVycyA9IFtdO1xuICBcbiAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgcmV1c2UgdGhlIHN0b3JlZCBpbmZvcm1hdGlvblxuICAgICAgICAgIE9iamVjdC5rZXlzKHJlc3VsdCkuZm9yRWFjaCgob2JqVVJMKSA9PiB7XG4gICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIgLSByZXN1bWUgU3Vic2NyaWJlXSAtIHJldXNlIGN1cnJlbnQgb2JqZWN0IHVybDogJywgcmVzdWx0W29ialVSTF0pO1xuICAgICAgICAgICAgbGlzdE9mT2JzZXJ2ZXJzLnB1c2godGhpcy5fcmVzdW1lU3Vic2NyaXB0aW9uKG1zZywgcmVzdWx0W29ialVSTF0pKTtcbiAgICAgICAgICB9KTtcbiAgXG4gICAgICAgICAgUHJvbWlzZS5hbGwobGlzdE9mT2JzZXJ2ZXJzKS50aGVuKChyZXN1bWVkT2JzZXJ2ZXJzKSA9PiB7XG4gICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIgLSBPYnNlcnZlcnMgUmVzdW1lZF0nLCByZXN1bWVkT2JzZXJ2ZXJzKTtcbiAgXG4gICAgICAgICAgICAvLyBUT0RPOiBzaG91ZCBzZW5kIHRoZSBpbmZvcm1hdGlvbiBpZiBzb21lIG9iamVjdCBpcyBmYWlsaW5nO1xuICAgICAgICAgICAgbGV0IHN1Y2Nlc3NmdWxseVJlc3VtZWQgPSBPYmplY3QudmFsdWVzKHJlc3VtZWRPYnNlcnZlcnMpLmZpbHRlcigob2JzZXJ2ZXIpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyICE9PSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICBcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXG4gICAgICAgICAgICAgIGJvZHk6IHsgY29kZTogMjAwLCB2YWx1ZTogc3VjY2Vzc2Z1bGx5UmVzdW1lZCB9XG4gICAgICAgICAgICB9O1xuICBcbiAgICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlciAtIE9ic2VydmVycyBSZXN1bWVkXSByZXBseWluZyAnLCByZXNwb25zZSk7XG4gIFxuICAgICAgICAgICAgLy9GTE9XLU9VVDogbWVzc2FnZSByZXNwb25zZSB0byBTeW5jaGVyIC0+IGNyZWF0ZVxuICAgICAgICAgICAgdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcbiAgXG4gICAgICAgICAgfSk7XG4gIFxuICAgICAgIFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vZm9yd2FyZCB0byBoeXBlcnR5OlxuICAgICAgICAgIGxldCByZXBseSA9IHt9O1xuICAgICAgICAgIHJlcGx5LmlkID0gbXNnLmlkO1xuICAgICAgICAgIHJlcGx5LmZyb20gPSBtc2cudG87XG4gICAgICAgICAgcmVwbHkudG8gPSBtc2cuZnJvbTtcbiAgICAgICAgICByZXBseS50eXBlID0gJ3Jlc3BvbnNlJztcbiAgICAgICAgICByZXBseS5ib2R5ID0ge1xuICAgICAgICAgICAgY29kZTogNDA0LFxuICAgICAgICAgICAgZGVzYzogJ05vIGRhdGEgb2JqZWN0cyBvYnNlcnZlcnMgdG8gYmUgcmVzdW1lZCdcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXBseSk7XG4gICAgICAgIH1cbiAgXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLm9uTG9jYWxTdWJzY3JpYmUgLSBuZXcgU3Vic2NyaWJlXSAtICcsIG1zZy5ib2R5LnNjaGVtYSwgbXNnLmJvZHkucmVzb3VyY2UpO1xuICAgICAgdGhpcy5fbmV3U3Vic2NyaXB0aW9uKG1zZyk7XG4gICAgfVxuIFxuXG4gIH1cblxuICBfbmV3U3Vic2NyaXB0aW9uKG1zZykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgb2JqVVJMID0gbXNnLmJvZHkucmVzb3VyY2U7XG5cbiAgICBsZXQgaHlwZXJ0eVVSTCA9IG1zZy5mcm9tO1xuICAgIGxldCBkb21haW4gPSBkaXZpZGVVUkwob2JqVVJMKS5kb21haW47XG4gICAgbGV0IGRvbWFpblN1YnNjcmlwdGlvbiA9IG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdkb21haW5fc3Vic2NyaXB0aW9uJykgPyBtc2cuYm9keS5kb21haW5fc3Vic2NyaXB0aW9uIDogdHJ1ZTtcblxuICAgIGxldCBjaGlsZEJhc2VVUkwgPSBvYmpVUkwgKyAnL2NoaWxkcmVuLyc7XG5cbiAgICAvL2dldCBzY2hlbWEgZnJvbSBjYXRhbG9ndWUgYW5kIHBhcnNlIC0+IChjaGlsZHJlbilcbiAgICBfdGhpcy5fY2F0YWxvZy5nZXREYXRhU2NoZW1hRGVzY3JpcHRvcihtc2cuYm9keS5zY2hlbWEpLnRoZW4oKGRlc2NyaXB0b3IpID0+IHtcbiAgICAgIGxldCBwcm9wZXJ0aWVzID0gZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcztcbiAgICAgIGxldCBjaGlsZHJlbnMgPSBwcm9wZXJ0aWVzLmNoaWxkcmVucyA/IHByb3BlcnRpZXMuY2hpbGRyZW5zIDogW107XG5cbiAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICBzdWJzY3JpcHRpb25zLnB1c2gob2JqVVJMICsgJy9jaGFuZ2VzJyk7XG5cbi8vICAgICAgY2hpbGRyZW5zLmZvckVhY2goKGNoaWxkKSA9PiBzdWJzY3JpcHRpb25zLnB1c2goY2hpbGRCYXNlVVJMICsgY2hpbGQpKTtcbiAgICAgIHN1YnNjcmlwdGlvbnMucHVzaChjaGlsZEJhc2VVUkwpO1xuXG4gICAgICAvL2NoaWxkcmVuIGFkZHJlc3Nlc1xuXG4gICAgICBpZiAoZG9tYWluU3Vic2NyaXB0aW9uKSB7ICAvL0ZMT1ctT1VUOiBzdWJzY3JpYmUgbWVzc2FnZSB0byB0aGUgbXNnLW5vZGUsIHJlZ2lzdGVyaW5nIGxpc3RlbmVycyBvbiB0aGUgYnJva2VyXG4gICAgICBsZXQgbm9kZVN1YnNjcmliZU1zZyA9IHtcbiAgICAgICAgdHlwZTogJ3N1YnNjcmliZScsIGZyb206IF90aGlzLl91cmwsIHRvOiAnZG9tYWluOi8vbXNnLW5vZGUuJyArIGRvbWFpbiArICcvc20nLFxuICAgICAgICBib2R5OiB7IGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSwgcmVzb3VyY2VzOiBzdWJzY3JpcHRpb25zLCBzb3VyY2U6IGh5cGVydHlVUkwgfVxuICAgICAgfTtcblxuICAgICAgLy9zdWJzY3JpYmUgaW4gbXNnLW5vZGVcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uobm9kZVN1YnNjcmliZU1zZywgKHJlcGx5KSA9PiB7XG4gICAgICAgIGxvZy5sb2coJ25vZGUtc3Vic2NyaWJlLXJlc3BvbnNlKG9ic2VydmVyKTogJywgcmVwbHkpO1xuICAgICAgICBjb25zb2xlLmxvZygnUkVVU0VURVNUIFN5bmNoZXJNYW5hZ2VyIC0gbm9kZS1zdWJzY3JpYmUtcmVzcG9uc2Uob2JzZXJ2ZXIpOiAnLCByZXBseSk7XG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xuICAgICAgICAgIF90aGlzLl9uZXdSZXBvcnRlclN1YnNjcmliZShtc2csIGh5cGVydHlVUkwsIG9ialVSTCwgY2hpbGRyZW5zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvL2xpc3RlbmVyIHJlamVjdGVkXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBoeXBlcnR5VVJMLFxuICAgICAgICAgICAgYm9keTogcmVwbHkuYm9keVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgX3RoaXMuX25ld1JlcG9ydGVyU3Vic2NyaWJlKG1zZywgaHlwZXJ0eVVSTCwgb2JqVVJMLCBjaGlsZHJlbnMpO1xuXG5cbiAgICB9KTtcblxuICB9XG5cbiAgX25ld1JlcG9ydGVyU3Vic2NyaWJlKG1zZywgaHlwZXJ0eVVSTCwgb2JqVVJMLCBjaGlsZHJlbnMpe1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBvYmpVUkxTdWJzY3JpcHRpb24gPSBvYmpVUkwgKyAnL3N1YnNjcmlwdGlvbic7XG5cbiAgICAgICAgICAvL0ZMT1ctT1VUOiByZXBseSB3aXRoIHByb3Zpc2lvbmFsIHJlc3BvbnNlXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBoeXBlcnR5VVJMLFxuICAgICAgICAgICAgYm9keTogeyBjb2RlOiAxMDAsIGNoaWxkcmVuUmVzb3VyY2VzOiBjaGlsZHJlbnMsIHNjaGVtYTogbXNnLmJvZHkuc2NoZW1hLCByZXNvdXJjZTogbXNnLmJvZHkucmVzb3VyY2UgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy9GTE9XLU9VVDogc3Vic2NyaWJlIG1lc3NhZ2UgdG8gcmVtb3RlIFJlcG9ydGVyT2JqZWN0IC0+IF9vblJlbW90ZVN1YnNjcmliZVxuICAgICAgICAgIGxldCBvYmpTdWJzY3JpYmVNc2cgPSB7XG4gICAgICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJywgZnJvbTogX3RoaXMuX3VybCwgdG86IG9ialVSTFN1YnNjcmlwdGlvbixcbiAgICAgICAgICAgIGJvZHk6IHsgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LCBzdWJzY3JpYmVyOiBoeXBlcnR5VVJMIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy9UT0RPOiBGb3IgRnVydGhlciBTdHVkeVxuICAgICAgICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykpIG9ialN1YnNjcmliZU1zZy5ib2R5Lm11dHVhbCA9IG1zZy5ib2R5Lm11dHVhbDtcbiAgICAgICAgICBsb2cubG9nKCdbU3luY2hlck1hbmFnZXIuX25ld1N1YnNjcmlwdGlvbl0nLCBvYmpTdWJzY3JpYmVNc2csIG1zZyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1JFVVNFVEVTVCBTeW5jaGVyTWFuYWdlciAtIFtTeW5jaGVyTWFuYWdlci5fbmV3U3Vic2NyaXB0aW9uXScsIG9ialN1YnNjcmliZU1zZywgbXNnKTtcbiAgICAgICAgICAvL3N1YnNjcmliZSB0byByZXBvcnRlciBTTVxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uob2JqU3Vic2NyaWJlTXNnLCAocmVwbHkpID0+IHtcbiAgICAgICAgICAgIGxvZy5sb2coJ3JlcG9ydGVyLXN1YnNjcmliZS1yZXNwb25zZS1uZXc6ICcsIHJlcGx5KTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSRVVTRVRFU1QgU3luY2hlck1hbmFnZXIgLSByZXBvcnRlci1zdWJzY3JpYmUtcmVzcG9uc2UtbmV3OiAnLCByZXBseSk7XG4gICAgICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIF90aGlzLl9wcm9jZXNzU3VjY2Vzc2Z1bGxTdWJzY3JpcHRpb24ocmVwbHksIGh5cGVydHlVUkwsIG9ialVSTCwgY2hpbGRyZW5zLCBtc2cpO1xuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmJvZHkub2ZmbGluZSkgX3RoaXMuX3Byb2Nlc3NPZmZsaW5lU3Vic2NyaXB0aW9uKG9ialN1YnNjcmliZU1zZywgbXNnLmJvZHkub2ZmbGluZSwgaHlwZXJ0eVVSTCwgb2JqVVJMLCBjaGlsZHJlbnMsIG1zZyk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgLy9UT0RPOiBzZW5kIHJlc3BvbnNlIGJhY2sgdG8gSHlwZXJ0eSB3aXRoIGVycm9yIG1lc3NhZ2UgcmVjZWl2ZWQgaW4gdGhlIHJlcGx5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gIH1cblxuICBfcHJvY2Vzc09mZmxpbmVTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCByZWRpcmVjdFRvLCBoeXBlcnR5VVJMLCBvYmpVUkwsIGNoaWxkcmVucywgbXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBmb3J3YXJkID0ge1xuICAgICAgZnJvbTogc3Vic2NyaXB0aW9uLmZyb20sXG4gICAgICB0eXBlOiAnZm9yd2FyZCcsXG4gICAgICB0bzogcmVkaXJlY3RUbyxcbiAgICAgIGJvZHk6IHN1YnNjcmlwdGlvblxuICAgIH07XG5cbiAgICBjb25zb2xlLmxvZygnW1N5bmNoZXJNYW5hZ2VyLl9wcm9jZXNzT2ZmbGluZVN1YnNjcmlwdGlvbl0gZm9yd2FkaW5nICcsIGZvcndhcmQpO1xuXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShmb3J3YXJkLCAocmVwbHkpID0+IHtcbiAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fcHJvY2Vzc09mZmxpbmVTdWJzY3JpcHRpb25dIHJlcGx5ICcsIHJlcGx5KTtcbiAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkgX3RoaXMuX3Byb2Nlc3NTdWNjZXNzZnVsbFN1YnNjcmlwdGlvbihyZXBseSwgaHlwZXJ0eVVSTCwgb2JqVVJMLCBjaGlsZHJlbnMsIG1zZyk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy9UT0RPOiBzZW5kIHJlc3BvbnNlIGJhY2sgdG8gSHlwZXJ0eSB3aXRoIGVycm9yIG1lc3NhZ2UgcmVjZWl2ZWQgaW4gdGhlIHJlcGx5XG4gICAgICB9XG4gICAgfSk7XG5cblxuICB9XG5cbiAgX3Byb2Nlc3NTdWNjZXNzZnVsbFN1YnNjcmlwdGlvbihyZXBseSwgaHlwZXJ0eVVSTCwgb2JqVVJMLCBjaGlsZHJlbnMsIG1zZykge1xuXG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlci5fbmV3U3Vic2NyaXB0aW9uXSAtIG9ic2VydmVyczogJywgX3RoaXMuX29ic2VydmVycywgb2JqVVJMLCBfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF0pO1xuICAgIGNvbnNvbGUubG9nKCdSRVVTRVRFU1QgU3luY2hlck1hbmFnZXIgLSAyMDAgY29kZVtTeW5jaGVyTWFuYWdlci5fbmV3U3Vic2NyaXB0aW9uXSAtIG9ic2VydmVyczogJywgX3RoaXMuX29ic2VydmVycywgb2JqVVJMLCBfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF0pO1xuICAgIGxldCBvYnNlcnZlciA9IF90aGlzLl9vYnNlcnZlcnNbb2JqVVJMXTtcbiAgICBpZiAoIW9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlciA9IG5ldyBPYnNlcnZlck9iamVjdChfdGhpcywgb2JqVVJMLCBjaGlsZHJlbnMpO1xuICAgICAgbG9nLmxvZygnW1N5bmNoZXJNYW5hZ2VyLl9uZXdTdWJzY3JpcHRpb25dIC0gb2JzZXJ2ZXJzOiBjcmVhdGUgbmV3IE9ic2VydmVyT2JqZWN0OiAnLCBvYnNlcnZlcik7XG4gICAgICBfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF0gPSBvYnNlcnZlcjtcblxuICAgICAgLy8gcmVnaXN0ZXIgbmV3IGh5cGVydHkgc3Vic2NyaXB0aW9uXG4gICAgICBvYnNlcnZlci5hZGRTdWJzY3JpcHRpb24oaHlwZXJ0eVVSTCk7XG5cbiAgICAgIC8vIGFkZCBjaGlsZHJlbnMgYW5kIGxpc3RlbmVycyB0byBzYXZlIGRhdGEgaWYgbmVjZXNzYXJ5XG4gICAgICBvYnNlcnZlci5hZGRDaGlsZHJlbnMoKTtcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ3b3JraW5nID0gZmFsc2U7XG5cbiAgICAvL2RlYnVnZ2VyO1xuXG4gICAgLy8gU3RvcmUgZm9yIGVhY2ggcmVwb3J0ZXIgaHlwZXJ0eSB0aGUgZGF0YU9iamVjdFxuICAgIGxldCB1c2VyVVJMO1xuICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnaWRlbnRpdHknKSAmJiBtc2cuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZSAmJiBtc2cuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZS51c2VyVVJMKSB7XG4gICAgICB1c2VyVVJMID0gbXNnLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUudXNlclVSTDtcbiAgICAgIGlmICghdXNlclVSTC5pbmNsdWRlcygndXNlcjovLycpKSB7XG4gICAgICAgIGludGVyd29ya2luZyA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHVzZXJVUkwgPSBfdGhpcy5fcmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKG1zZy5mcm9tKTtcbiAgICAgIGlmICghdXNlclVSTCkgaW50ZXJ3b3JraW5nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgbWV0YWRhdGEgPSBkZWVwQ2xvbmUocmVwbHkuYm9keS52YWx1ZSk7XG5cbiAgICAvLyBsZXQgY2hpbGRyZW5PYmplY3RzID0gbWV0YWRhdGEuY2hpbGRyZW5PYmplY3RzIHx8IHt9O1xuXG4gICAgZGVsZXRlIG1ldGFkYXRhLmRhdGE7XG4gICAgZGVsZXRlIG1ldGFkYXRhLmNoaWxkcmVuT2JqZWN0cztcblxuICAgIG1ldGFkYXRhLmNoaWxkcmVucyA9IGNoaWxkcmVucztcbiAgICBtZXRhZGF0YS5zdWJzY3JpYmVyVXNlciA9IHVzZXJVUkw7XG4gICAgbWV0YWRhdGEuaXNSZXBvcnRlciA9IGZhbHNlO1xuICAgIG1ldGFkYXRhLnN1YnNjcmliZXJIeXBlcnR5ID0gaHlwZXJ0eVVSTDtcblxuICAgIGlmICghaW50ZXJ3b3JraW5nKSB7XG4gICAgICAvL190aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2Uuc2V0KG9ialVSTCwgZmFsc2UsIG1zZy5ib2R5LnNjaGVtYSwgJ29uJywgcmVwbHkuYm9keS5vd25lciwgaHlwZXJ0eVVSTCwgY2hpbGRyZW5zLCB1c2VyVVJMKTtcbiAgICAgIF90aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2Uuc2V0KG1ldGFkYXRhKTtcbiAgICAgIGlmICgobWV0YWRhdGEuaGFzT3duUHJvcGVydHkoJ3N0b3JlJykgJiYgbWV0YWRhdGEuc3RvcmUpIHx8IChtZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eSgnaXNUb1NhdmVEYXRhJykgJiYgbWV0YWRhdGEuaXNUb1NhdmVEYXRhKSkge1xuICAgICAgICBvYnNlcnZlci5pc1RvU2F2ZURhdGEgPSB0cnVlO1xuICAgICAgICBfdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLnVwZGF0ZShmYWxzZSwgb2JqVVJMLCAnaXNUb1NhdmVEYXRhJywgdHJ1ZSk7XG4gICAgICAgIF90aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2Uuc2F2ZURhdGEoZmFsc2UsIG9ialVSTCwgbnVsbCwgcmVwbHkuYm9keS52YWx1ZS5kYXRhKTtcbi8vICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVucykgX3RoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5pbml0aWFsT2JzZXJ2ZXJTeW5jKG9ialVSTCwgcmVwbHkuYm9keS52YWx1ZS5kYXRhLmJhY2t1cFJldmlzaW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL2ZvcndhcmQgdG8gaHlwZXJ0eTpcbiAgICByZXBseS5pZCA9IG1zZy5pZDtcbiAgICByZXBseS5mcm9tID0gX3RoaXMuX3VybDtcbiAgICByZXBseS50byA9IGh5cGVydHlVUkw7XG4gICAgcmVwbHkuYm9keS5zY2hlbWEgPSBtc2cuYm9keS5zY2hlbWE7XG4gICAgcmVwbHkuYm9keS5yZXNvdXJjZSA9IG1zZy5ib2R5LnJlc291cmNlO1xuXG4gICAgLy9UT0RPOiBGb3IgRnVydGhlciBTdHVkeVxuICAgIGlmIChtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykpIHJlcGx5LmJvZHkubXV0dWFsID0gbXNnLmJvZHkubXV0dWFsO1xuICAgIGxvZy5sb2coJ1tzdWJzY3JpYmVdIC0gbmV3IHN1YnNjcmlwdGlvbjogJywgbXNnLCByZXBseSwgb2JzZXJ2ZXIpO1xuXG4gICAgdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlcGx5KTtcblxuICB9XG5cbiAgX3Jlc3VtZVN1YnNjcmlwdGlvbihtc2csIHN0b3JlZE9iamVjdCkge1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cbiAgICAgIGxldCBvYmpVUkwgPSBzdG9yZWRPYmplY3QudXJsO1xuICAgICAgbGV0IHNjaGVtYSA9IHN0b3JlZE9iamVjdC5zY2hlbWE7XG5cbiAgICAgIGxldCBoeXBlcnR5VVJMID0gbXNnLmZyb207XG5cbiAgICAgIC8vIGxldCBvYmpVUkxTdWJzY3JpcHRpb24gPSBvYmpVUkwgKyAnL3N1YnNjcmlwdGlvbic7XG5cbiAgICAgIGxldCBjaGlsZEJhc2VVUkwgPSBvYmpVUkwgKyAnL2NoaWxkcmVuLyc7XG5cbiAgICAgIGxvZy5sb2coJ1tTeW5jaGVyTWFuYWdlciAtIFJldXNlU3Vic2NyaXB0aW9uXSAtIG9ialVSTDogJywgb2JqVVJMLCAnIC0gc2NoZW1hOicsIHNjaGVtYSk7XG5cbiAgICAgIC8vZ2V0IHNjaGVtYSBmcm9tIGNhdGFsb2d1ZSBhbmQgcGFyc2UgLT4gKGNoaWxkcmVuKVxuICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgc2luY2UgY2hpbGRyZW4gcmVzb3VyY2VzIHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIERhdGFPYmplY3RzU3RvcmFnZVxuICAgICAgdGhpcy5fY2F0YWxvZy5nZXREYXRhU2NoZW1hRGVzY3JpcHRvcihzY2hlbWEpLnRoZW4oKGRlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzO1xuICAgICAgICBsZXQgY2hpbGRyZW5zID0gcHJvcGVydGllcy5jaGlsZHJlbnMgPyBwcm9wZXJ0aWVzLmNoaWxkcmVucyA6IFtdO1xuXG4gICAgICAgIC8vY2hpbGRyZW4gYWRkcmVzc2VzXG4gICAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgIHN1YnNjcmlwdGlvbnMucHVzaChvYmpVUkwgKyAnL2NoYW5nZXMnKTtcbi8vICAgICAgICBjaGlsZHJlbnMuZm9yRWFjaCgoY2hpbGQpID0+IHN1YnNjcmlwdGlvbnMucHVzaChjaGlsZEJhc2VVUkwgKyBjaGlsZCkpO1xuICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goY2hpbGRCYXNlVVJMKTtcblxuICAgICAgICAvL0ZMT1ctT1VUOiByZXBseSB3aXRoIHByb3Zpc2lvbmFsIHJlc3BvbnNlXG4gICAgICAgIHRoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogaHlwZXJ0eVVSTCxcbiAgICAgICAgICBib2R5OiB7IGNvZGU6IDEwMCwgY2hpbGRyZW5SZXNvdXJjZXM6IGNoaWxkcmVucywgc2NoZW1hOiBzY2hlbWEsIHJlc291cmNlOiBvYmpVUkwgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvL0ZMT1ctT1VUOiBzdWJzY3JpYmUgbWVzc2FnZSB0byByZW1vdGUgUmVwb3J0ZXJPYmplY3QgLT4gX29uUmVtb3RlU3Vic2NyaWJlXG4gICAgICAgIC8qbGV0IG9ialN1YnNjcmliZU1zZyA9IHtcbiAgICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJywgZnJvbTogdGhpcy5fdXJsLCB0bzogb2JqVVJMU3Vic2NyaXB0aW9uLFxuICAgICAgICAgIGJvZHk6IHsgc3Vic2NyaWJlcjogaHlwZXJ0eVVSTCwgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5IH1cbiAgICAgICAgfTtcblxuICAgICAgICAvL3N1YnNjcmliZSB0byByZXBvcnRlciBTTVxuICAgICAgICB0aGlzLl9idXMucG9zdE1lc3NhZ2Uob2JqU3Vic2NyaWJlTXNnLCAocmVwbHkpID0+IHsqL1xuXG4gICAgICAgIGxldCBvYnNlcnZlciA9IHRoaXMuX29ic2VydmVyc1tvYmpVUkxdO1xuICAgICAgICBpZiAoIW9ic2VydmVyKSB7XG4gICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2ZXJPYmplY3QodGhpcywgb2JqVVJMLCBjaGlsZHJlbnMpO1xuICAgICAgICAgIG9ic2VydmVyLmlzVG9TYXZlRGF0YSA9IHN0b3JlZE9iamVjdC5pc1RvU2F2ZURhdGE7XG4gICAgICAgICAgdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF0gPSBvYnNlcnZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcmVnaXN0ZXIgbmV3IGh5cGVydHkgc3Vic2NyaXB0aW9uXG4gICAgICAgIG9ic2VydmVyLmFkZFN1YnNjcmlwdGlvbihoeXBlcnR5VVJMKTtcbiAgICAgICAgb2JzZXJ2ZXIuYWRkQ2hpbGRyZW5zKCk7XG5cbiAgICAgICAgLy8gT2JqZWN0LmFzc2lnbihzdG9yZWRPYmplY3QuZGF0YSwgcmVwbHkuYm9keS52YWx1ZS5kYXRhKTtcbiAgICAgICAgLy8gT2JqZWN0LmFzc2lnbihzdG9yZWRPYmplY3QuY2hpbGRyZW5zLCByZXBseS5ib2R5LnZhbHVlLmNoaWxkcmVucyk7XG5cbiAgICAgICAgLy9sb2cubG9nKCdbc3Vic2NyaWJlXSAtIHJlc3VtZSBzdWJzY3JpcHRpb246ICcsIG1zZywgcmVwbHksIHN0b3JlZE9iamVjdCwgb2JzZXJ2ZXIpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNyeXB0Q2hpbGRyZW5zKHN0b3JlZE9iamVjdCwgY2hpbGRyZW5zKTtcbiAgICAgIH0pLnRoZW4oKGRlY3J5cHRlZE9iamVjdCkgPT4ge1xuICAgICAgICAvLyBsb2cubG9nKCdyZXN1bHQgb2YgcHJldmlvdXMgcHJvbWlzZScpO1xuICAgICAgICByZXNvbHZlKGRlY3J5cHRlZE9iamVjdCk7XG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgIGxvZy5lcnJvcignW1N5bmNoZXJNYW5hZ2VyIC0gcmVzdW1lIHN1YnNjcmlwdGlvbl0gLSBmYWlsIG9uIGdldERhdGFTY2hlbWFEZXNjcmlwdG9yOiAnLCByZWFzb24pO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy9GTE9XLUlOOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gbG9jYWwgRGF0YU9iamVjdE9ic2VydmVyIC0+IHVuc3Vic2NyaWJlXG4gIF9vbkxvY2FsVW5TdWJzY3JpYmUobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCBoeXBlcnR5VVJMID0gbXNnLmZyb207XG4gICAgbGV0IG9ialVSTCA9IG1zZy5ib2R5LnJlc291cmNlO1xuXG4gICAgbGV0IG9ic2VydmVyID0gX3RoaXMuX29ic2VydmVyc1tvYmpVUkxdO1xuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgLy9UT0RPOiBpcyB0aGVyZSBhbnkgcG9saWN5IHZlcmlmaWNhdGlvbiBiZWZvcmUgZGVsZXRlP1xuICAgICAgb2JzZXJ2ZXIucmVtb3ZlU3Vic2NyaXB0aW9uKG1zZyk7XG5cbiAgICAgIC8vVE9ETzogZGVzdHJveSBvYmplY3QgaW4gdGhlIHJlZ2lzdHJ5P1xuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxuICAgICAgICBib2R5OiB7IGNvZGU6IDIwMCB9XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLmRlbGV0ZVJlc291cmNlKG9ialVSTCk7XG5cbiAgICAgIC8vVE9ETzogcmVtb3ZlIE9iamVjdCBpZiBubyBtb3JlIHN1YnNjcmlwdGlvbj9cbiAgICAgIGRlbGV0ZSBfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF07XG4gICAgfVxuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3luY2hlck1hbmFnZXI7XG4iLCIvLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1N1YnNjcmlwdGlvbicpO1xuXG5jbGFzcyBTdWJzY3JpcHRpb24ge1xuXG4gIGNvbnN0cnVjdG9yKGJ1cywgc3Vic2NyaWJlciwgcmVzb3VyY2UpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIF90aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICBfdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlO1xuXG4gICAgbG9nLmxvZygnW1N1YnNjcmlwdGlvbk1hbmFnZXIuU3Vic2NyaXB0aW9uXSBuZXc6ICcsIHN1YnNjcmliZXIsIHJlc291cmNlKVxuXG4gICAgLy9hZGQgZm9yd2FyZFxuICAgIF90aGlzLl9saXN0ZW5lciA9IGJ1cy5hZGRGb3J3YXJkKHJlc291cmNlLCBzdWJzY3JpYmVyKTtcblxuICB9XG5cbiAgX3JlbGVhc2VMaXN0ZW5lcnMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIF90aGlzLl9saXN0ZW5lci5yZW1vdmUoKTtcblxuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3Vic2NyaXB0aW9uO1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1N1YnNjcmlwdGlvbk1hbmFnZXInKTtcblxuaW1wb3J0IHsgZGl2aWRlVVJMIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IFN1YnNjcmlwdGlvbiBmcm9tICcuL1N1YnNjcmlwdGlvbic7XG5cblxuLyoqXG4gKiBAYXV0aG9yIHBhdWxvLWctY2hhaW5ob0BhbHRpY2VsYWJzLmNvbVxuICogU3Vic2NyaXB0aW9uIE1hbmFnZXIgdXNlZCB0byBtYW5hZ2Ugcm91dGluZyBwYXRocyBhdCB0aGUgcnVudGltZS5cbiAqL1xuXG5jbGFzcyBTdWJzY3JpcHRpb25NYW5hZ2VyIHtcblxuICBjb25zdHJ1Y3RvcihydW50aW1lVVJMLCBidXMsIHN0b3JhZ2UpIHtcbiAgICBpZiAoIXJ1bnRpbWVVUkwpIHRocm93IG5ldyBFcnJvcignW1N1YnNjcmlwdGlvbk1hbmFnZXJdIC0gbmVlZHMgdGhlIHJ1bnRpbWVVUkwgcGFyYW1ldGVyJyk7XG4gICAgaWYgKCFidXMpIHRocm93IG5ldyBFcnJvcignW1N1YnNjcmlwdGlvbk1hbmFnZXJdIC0gbmVlZHMgdGhlIE1lc3NhZ2VCdXMgaW5zdGFuY2UnKTtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5fYnVzID0gYnVzO1xuICAgIF90aGlzLl9zdG9yYWdlID0gc3RvcmFnZTtcblxuICAgIF90aGlzLl9zdWJzY3JpcHRpb25zID0ge307XG5cbiAgICBfdGhpcy5fc3Vic2NyaXB0aW9uc1N0b3JhZ2UgPSB7fTtcblxuICAgIC8vVE9ETzogdGhlc2Ugc2hvdWxkIGJlIHNhdmVkIGluIHBlcnNpc3RlbmNlIGVuZ2luZT9cbiAgICBfdGhpcy5ydW50aW1lVVJMID0gcnVudGltZVVSTDtcbiAgICBfdGhpcy5fdXJsID0gcnVudGltZVVSTCArICcvc3Vic2NyaXB0aW9ucyc7XG5cbiAgICAvL1RPRE86IHRoaXMgc2hvdWxkIG5vdCBiZSBoYXJkY29kZWQhXG4gICAgX3RoaXMuX2RvbWFpbiA9IGRpdmlkZVVSTChydW50aW1lVVJMKS5kb21haW47XG5cbiAgICBidXMuYWRkTGlzdGVuZXIoX3RoaXMuX3VybCwgKG1zZykgPT4ge1xuICAgICAgbG9nLmluZm8oJ1tTdWJzY3JpcHRpb25NYW5hZ2VyXSBSQ1Y6ICcsIG1zZyk7XG4gICAgICBzd2l0Y2ggKG1zZy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3N1YnNjcmliZSc6IF90aGlzLl9vblN1YnNjcmliZShtc2cpOyBicmVhaztcbiAgICAgICAgY2FzZSAndW5zdWJzY3JpYmUnOiBfdGhpcy5fb25VblN1YnNjcmliZShtc2cpOyBicmVhaztcbiAgICAgICAgY2FzZSAncmVhZCc6IF90aGlzLl9vblJlYWQobXNnKTsgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIGluaXQoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgICBfdGhpcy5fc3RvcmFnZS5nZXQoJ3N1YnNjcmlwdGlvbnMnKS50aGVuKChzdWJzY3JpcHRpb25zKSA9PiB7XG4gICAgICAgIGxvZy5sb2coJ1tTdWJzY3JpcHRpb25NYW5hZ2VyLmluaXRdIHJlc3VtZSBzdWJzY3JpcHRpb25zOiAnLCBzdWJzY3JpcHRpb25zKTtcbiAgICAgICAgaWYgKHN1YnNjcmlwdGlvbnMpIHtcblxuICAgICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zU3RvcmFnZSA9IHN1YnNjcmlwdGlvbnM7XG5cbiAgICAgICAgICBPYmplY3QudmFsdWVzKHN1YnNjcmlwdGlvbnMpLmZvckVhY2goKHN1YnNjcmlwdGlvbik9PntcbiAgICAgICAgICAgIF90aGlzLmNyZWF0ZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24uZG9tYWluLCBzdWJzY3JpcHRpb24ucmVzb3VyY2VzLCBzdWJzY3JpcHRpb24uc3Vic2NyaWJlciwgc3Vic2NyaXB0aW9uLmlkZW50aXR5KTtcblxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG5cbiAgICB9KTtcblxuXG4gIH1cblxuICBnZXQgdXJsKCkgeyByZXR1cm4gdGhpcy5fdXJsOyB9XG5cblxuICAvL21lc3NhZ2UgcmVjZWl2ZWQgdG8gc2V0IGEgcm91dGluZyBwYXRoXG4gIF9vblN1YnNjcmliZShtc2cpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBsZXQgcmVzb3VyY2VzID0gbXNnLmJvZHkucmVzb3VyY2VzO1xuXG4gICAgbGV0IHN1YnNjcmliZXIgPSBtc2cuZnJvbTtcbiAgICBsZXQgZG9tYWluID0gZGl2aWRlVVJMKHJlc291cmNlc1swXSkuZG9tYWluOyAvL3dlIGFyZSBhc3N1bWluZyByZXNvdXJjZXMgYXJlIGFsbCBmcm9tIHRoZSBzYW1lIGRvbWFpblxuXG4gICAgbGV0IGlkZW50aXR5ID0gbXNnLmJvZHkuaWRlbnRpdHk7XG5cbiAgICBfdGhpcy5jcmVhdGVTdWJzY3JpcHRpb24oZG9tYWluLCByZXNvdXJjZXMsIHN1YnNjcmliZXIsIGlkZW50aXR5KS50aGVuKChyZXBseSk9PntcbiAgICAgIC8vZm9yd2FyZCB0byBoeXBlcnR5OlxuICAgICAgcmVwbHkuaWQgPSBtc2cuaWQ7XG4gICAgICByZXBseS5mcm9tID0gX3RoaXMuX3VybDtcbiAgICAgIHJlcGx5LnRvID0gc3Vic2NyaWJlcjtcbiAgICAgIHJlcGx5LmJvZHkgPSBtc2cuYm9keTtcbiAgICAgIHJlcGx5LmJvZHkuY29kZSA9IDIwMDtcblxuICAgICAgbG9nLmxvZygnW1N1YnNjcmlwdGlvbk1hbmFnZXJdIC0gY3JhZXRlU3Vic2NyaXB0aW9uOiAnLCBtc2csIHJlcGx5LCBzdWJzY3JpYmVyKTtcblxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXBseSk7XG5cblxuICAgICAgaWYgKCFfdGhpcy5fc3Vic2NyaXB0aW9uc1N0b3JhZ2Vbc3Vic2NyaWJlcl0pIHtcblxuXG4gICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zU3RvcmFnZVtzdWJzY3JpYmVyXSA9IHtcbiAgICAgICAgICBkb21haW46IGRvbWFpbixcbiAgICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcbiAgICAgICAgICBzdWJzY3JpYmVyOiBzdWJzY3JpYmVyLFxuICAgICAgICAgIGlkZW50aXR5OiBpZGVudGl0eVxuICAgICAgICB9O1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvdXJjZXMuZm9yRWFjaCgocmVzb3VyY2UpID0+IHtcbiAgICAgICAgICBpZiAoIShfdGhpcy5fc3Vic2NyaXB0aW9uc1N0b3JhZ2Vbc3Vic2NyaWJlcl0ucmVzb3VyY2VzLmluY2x1ZGVzKHJlc291cmNlKSkpIHtcbiAgICAgICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zU3RvcmFnZVtzdWJzY3JpYmVyXS5yZXNvdXJjZXMucHVzaChyZXNvdXJjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMuX3N0b3JhZ2Uuc2V0KCdzdWJzY3JpcHRpb25zJywgMSwgX3RoaXMuX3N1YnNjcmlwdGlvbnNTdG9yYWdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNyZWF0ZVN1YnNjcmlwdGlvbihkb21haW4sIHJlc291cmNlcywgc3Vic2NyaWJlciwgaWRlbnRpdHkpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgLy9kZWJ1Z2dlcjtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIC8vRkxPVy1PVVQ6IHN1YnNjcmliZSBtZXNzYWdlIHRvIHRoZSBtc2ctbm9kZSwgcmVnaXN0ZXJpbmcgbGlzdGVuZXJzIG9uIHRoZSBicm9rZXJcblxuICAgICAgbGV0IG5vZGVTdWJzY3JpYmVNc2cgPSB7XG4gICAgICAgIHR5cGU6ICdzdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fdXJsLCB0bzogJ2RvbWFpbjovL21zZy1ub2RlLicgKyBkb21haW4gKyAnL3NtJyxcbiAgICAgICAgYm9keTogeyBpZGVudGl0eTogaWRlbnRpdHksIHJlc291cmNlczogcmVzb3VyY2VzLCBzb3VyY2U6IHN1YnNjcmliZXIgfVxuICAgICAgfTtcblxuICAgICAgLy9zdWJzY3JpYmUgaW4gbXNnLW5vZGVcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uobm9kZVN1YnNjcmliZU1zZywgKHJlcGx5KSA9PiB7XG4gICAgICAgIGxvZy5sb2coJ1tTdWJzY3JpcHRpb25NYW5hZ2VyXSBub2RlLXN1YnNjcmliZS1yZXNwb25zZTogJywgcmVwbHkpO1xuXG4gICAgICAgIC8vaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7Ly9UT0RPOiB1bmNvbW1lbnQgd2hlbiAgTU4gcmVwbGllcyB3aXRoIGNvcnJlY3QgcmVzcG9uc2UgYm9keSBjb2RlXG5cbiAgICAgICAgLy9UT0RPOiBzdXBwb3J0IG11bHRpcGxlIHJvdXRlcyBmb3IgbXVsdGlwbGUgcmVzb3VyY2VzXG5cbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IF90aGlzLl9zdWJzY3JpcHRpb25zW3N1YnNjcmliZXJdO1xuICAgICAgICBsb2cubG9nKCdbU3Vic2NyaXB0aW9uTWFuYWdlcl0gLSAnLCAgX3RoaXMuX3N1YnNjcmlwdGlvbnMsIHJlc291cmNlcywgX3RoaXMuX3N1YnNjcmlwdGlvbnMuaGFzT3duUHJvcGVydHkoc3Vic2NyaWJlcikpO1xuICAgICAgICBpZiAoIXN1YnNjcmlwdGlvbikge1xuICAgICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zW3N1YnNjcmliZXJdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICByZXNvdXJjZXMuZm9yRWFjaCgocmVzb3VyY2UpPT57XG4gICAgICAgICAgX3RoaXMuX3N1YnNjcmlwdGlvbnNbc3Vic2NyaWJlcl1bcmVzb3VyY2VdID0gbmV3IFN1YnNjcmlwdGlvbihfdGhpcy5fYnVzLCBzdWJzY3JpYmVyLCByZXNvdXJjZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc29sdmUocmVwbHkpO1xuXG4gICAgICB9KTtcblxuICAgIH0pO1xuICB9XG5cblxuICAvLyBtZXNzYWdlIHJlY2VpdmVkIHRvIHJlbW92ZSByb3V0aW5nIHBhdGhcbiAgX29uVW5TdWJzY3JpYmUobXNnKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIGxldCB1bnN1YnNjcmliZXIgPSBtc2cuZnJvbTtcbiAgICBsZXQgcmVzb3VyY2UgPSBtc2cuYm9keS5yZXNvdXJjZTtcblxuICAgIGlmIChfdGhpcy5fc3Vic2NyaXB0aW9uc1t1bnN1YnNjcmliZXJdICYmIF90aGlzLl9zdWJzY3JpcHRpb25zW3Vuc3Vic2NyaWJlcl1bcmVzb3VyY2VdKSB7XG4gICAgICBsZXQgZG9tYWluID0gZGl2aWRlVVJMKHJlc291cmNlKS5kb21haW47XG4gICAgICBsZXQgc3Vic2NyaXB0aW9uID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbdW5zdWJzY3JpYmVyXVtyZXNvdXJjZV07XG5cbiAgICAgIC8vRkxPVy1PVVQ6IG1lc3NhZ2Ugc2VudCB0byBtc2ctbm9kZSBTdWJzY3JpcHRpb25NYW5hZ2VyIGNvbXBvbmVudFxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIHR5cGU6ICd1bnN1YnNjcmliZScsIGZyb206IF90aGlzLl91cmwsIHRvOiAnZG9tYWluOi8vbXNnLW5vZGUuJyArIGRvbWFpbiArICcvc20nLFxuICAgICAgICBib2R5OiB7IHJlc291cmNlczogW3Jlc291cmNlXSwgc291cmNlOiB1bnN1YnNjcmliZXIgfVxuICAgICAgfSk7XG5cbiAgICAgIHN1YnNjcmlwdGlvbi5fcmVsZWFzZUxpc3RlbmVycygpO1xuICAgICAgZGVsZXRlIF90aGlzLl9zdWJzY3JpcHRpb25zW3Vuc3Vic2NyaWJlcl1bcmVzb3VyY2VdO1xuXG4gICAgICBpZiAoX3RoaXMuX3N1YnNjcmlwdGlvbnNTdG9yYWdlW3Vuc3Vic2NyaWJlcl0pIHtcbiAgICAgICAgbGV0IGkgPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1N0b3JhZ2VbdW5zdWJzY3JpYmVyXS5yZXNvdXJjZXMuaW5kZXhPZihyZXNvdXJjZSk7XG4gICAgICAgIGlmIChpICE9IC0xKSB7XG4gICAgICAgICAgX3RoaXMuX3N1YnNjcmlwdGlvbnNTdG9yYWdlW3Vuc3Vic2NyaWJlcl0ucmVzb3VyY2VzLnNwbGljZShpLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5fc3RvcmFnZS5zZXQoJ3N1YnNjcmlwdGlvbnMnLCAxLCBfdGhpcy5fc3Vic2NyaXB0aW9uc1N0b3JhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xuICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXG4gICAgICBib2R5OiB7IGNvZGU6IDIwMCB9XG4gICAgfSk7XG5cbiAgfVxuXG4gIC8vbWVzc2FnZSByZWNlaXZlZCB0byByZWFkIGV4aXN0aW5nIHJvdXRpbmcgcGF0aHMuIEF0IHRoaXMgcG9pbnQgbGltaXRlZCB0byByZWFkIGFsbCBleGlzdGluZyByb3V0aW5nIHBhdGhzIHNldCBmb3Igb25lIGxpc3RlbmVyXG4gIF9vblJlYWQobXNnKSB7XG5cbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgbGV0IGxpc3RlbmVyQWRkcmVzcyA9IG1zZy5ib2R5LnJlc291cmNlO1xuICAgIGxldCByZXBseTtcblxuICAgIGxvZy5sb2coJ1tTdWJzY3JpcHRpb25NYW5hZ2VyXSAtIHJlcXVlc3QgdG8gcmVhZCBTdWJzY3JpcHRpb25zOiAnLCBtc2cpO1xuXG4gICAgX3RoaXMuX3N0b3JhZ2UuZ2V0KCdzdWJzY3JpcHRpb25zJykudGhlbigoc3Vic2NyaXB0aW9ucyk9PntcbiAgICAgIGlmIChzdWJzY3JpcHRpb25zICYmIHN1YnNjcmlwdGlvbnNbbGlzdGVuZXJBZGRyZXNzXSkge1xuICAgICAgICBsZXQgcmVzb3VyY2VzID0gc3Vic2NyaXB0aW9uc1tsaXN0ZW5lckFkZHJlc3NdLnJlc291cmNlcztcblxuICAgICAgICByZXBseSA9IHtcbiAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcbiAgICAgICAgICBib2R5OiB7IGNvZGU6IDIwMCwgdmFsdWU6IHJlc291cmNlcyB9XG4gICAgICAgIH07XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcGx5ID0ge1xuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxuICAgICAgICAgIGJvZHk6IHsgY29kZTogNDA0LCBkZXNjcmlwdGlvbjogJ05vdCBGb3VuZCcgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXBseSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3Vic2NyaXB0aW9uTWFuYWdlcjtcbiIsImltcG9ydCB7ZGl2aWRlRW1haWwsIGRpdmlkZVVSTCwgaXNEYXRhT2JqZWN0VVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbmNsYXNzIFJlVGhpbmtDdHgge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuZGVmYXVsdEJlaGF2aW91ciA9IHRydWU7XG4gICAgdGhpcy5ncm91cHMgPSB7fTtcbiAgfVxuXG4gIGdldCBzY2hlbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NjaGVtZTtcbiAgfVxuXG4gIGdldCBkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRlO1xuICB9XG5cbiAgZ2V0IGRvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBnZXQgc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICBnZXQgdGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZTtcbiAgfVxuXG4gIGdldCB3ZWVrZGF5KCkge1xuICAgIHJldHVybiB0aGlzLl93ZWVrZGF5O1xuICB9XG5cbiAgc2V0IHNjaGVtZShwYXJhbXMpIHtcbiAgICBsZXQgZnJvbSA9IHBhcmFtcy5tZXNzYWdlLmZyb207XG4gICAgaWYgKGlzRGF0YU9iamVjdFVSTChmcm9tKSkge1xuICAgICAgdGhpcy5fc2NoZW1lID0gZGl2aWRlVVJMKGZyb20pLnR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NjaGVtZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBzZXQgZGF0ZShub3cpIHtcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSk7XG4gICAgaWYgKGRheS5sZW5ndGggPT09IDEpIHtcbiAgICAgIGRheSA9ICcwJyArIGRheTtcbiAgICB9XG4gICAgbGV0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgIGlmIChtb250aC5sZW5ndGggPT09IDEpIHtcbiAgICAgIG1vbnRoID0gJzAnICsgbW9udGg7XG4gICAgfVxuICAgIHRoaXMuX2RhdGUgPSBkYXkgKyAnLycgKyBtb250aCArICcvJyArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgfVxuXG4gIHNldCBkb21haW4ocGFyYW1zKSB7XG4gICAgaWYgKHBhcmFtcy5tZXNzYWdlLmJvZHkuaWRlbnRpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZG9tYWluID0gZGl2aWRlRW1haWwocGFyYW1zLm1lc3NhZ2UuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZS51c2VybmFtZSkuZG9tYWluO1xuICAgIH1cbiAgfVxuXG4gIHNldCB0eXBlKHBhcmFtcykge1xuICAgIGxldCBtZXNzYWdlID0gcGFyYW1zLm1lc3NhZ2U7XG4gICAgaWYgKG1lc3NhZ2UuYm9keS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl90eXBlID0gbWVzc2FnZS5ib2R5LnZhbHVlLnJlc291cmNlVHlwZTtcbiAgICB9XG4gIH1cblxuICBzZXQgc291cmNlKHBhcmFtcykge1xuICAgIGlmIChwYXJhbXMubWVzc2FnZS5ib2R5LmlkZW50aXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3NvdXJjZSA9IHBhcmFtcy5tZXNzYWdlLmJvZHkuaWRlbnRpdHkudXNlclByb2ZpbGUudXNlcm5hbWU7XG4gICAgfVxuICB9XG5cbiAgc2V0IHRpbWUobm93KSB7XG4gICAgbm93ID0gbmV3IERhdGUoKTtcbiAgICBsZXQgbWludXRlcyA9IFN0cmluZyhub3cuZ2V0TWludXRlcygpKTtcbiAgICBpZiAobWludXRlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIG1pbnV0ZXMgPSAnMCcgKyBtaW51dGVzO1xuICAgIH1cbiAgICB0aGlzLl90aW1lID0gcGFyc2VJbnQoU3RyaW5nKG5vdy5nZXRIb3VycygpKSArIG1pbnV0ZXMpO1xuICB9XG5cbiAgc2V0IHdlZWtkYXkobm93KSB7XG4gICAgdGhpcy5fd2Vla2RheSA9IFN0cmluZyhuZXcgRGF0ZSgpLmdldERheSgpKTtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlVGhpbmtDdHg7XG4iLCJpbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1BFUCcpO1xuXG5pbXBvcnQgQWxsb3dPdmVycmlkZXMgZnJvbSAnLi4vY29tYmluaW5nQWxnb3JpdGhtcy9BbGxvd092ZXJyaWRlcyc7XG5pbXBvcnQgQmxvY2tPdmVycmlkZXMgZnJvbSAnLi4vY29tYmluaW5nQWxnb3JpdGhtcy9CbG9ja092ZXJyaWRlcyc7XG5pbXBvcnQge2RpdmlkZVVSTCwgZ2V0VXNlckVtYWlsRnJvbVVSTCwgaXNEYXRhT2JqZWN0VVJMfSBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5pbXBvcnQgRmlyc3RBcHBsaWNhYmxlIGZyb20gJy4uL2NvbWJpbmluZ0FsZ29yaXRobXMvRmlyc3RBcHBsaWNhYmxlJztcbmltcG9ydCBSZVRoaW5rQ3R4IGZyb20gJy4uL1JlVGhpbmtDdHgnO1xuXG5jbGFzcyBSdW50aW1lQ29yZUN0eCBleHRlbmRzIFJlVGhpbmtDdHgge1xuXG4gIGNvbnN0cnVjdG9yKHJ1bnRpbWVVUkwsIGlkTW9kdWxlLCBydW50aW1lUmVnaXN0cnksIHN0b3JhZ2VNYW5hZ2VyLCBydW50aW1lQ2FwYWJpbGl0aWVzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9ydW50aW1lVVJMID0gcnVudGltZVVSTDtcbiAgICB0aGlzLl9wZXBVUkwgPSB0aGlzLl9ydW50aW1lVVJMICsgJy9wZXAnO1xuICAgIHRoaXMuX2d1aVVSTCA9IHRoaXMuX3J1bnRpbWVVUkwgKyAnL3BvbGljeS1ndWknO1xuICAgIHRoaXMuaWRNb2R1bGUgPSBpZE1vZHVsZTtcbiAgICB0aGlzLnJ1bnRpbWVSZWdpc3RyeSA9IHJ1bnRpbWVSZWdpc3RyeTtcbiAgICB0aGlzLmFjdGl2ZVVzZXJQb2xpY3kgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5zZXJ2aWNlUHJvdmlkZXJQb2xpY3kgPSB7fTtcbiAgICB0aGlzLnVzZXJQb2xpY2llcyA9IHt9O1xuICAgIHRoaXMuc3RvcmFnZU1hbmFnZXIgPSBzdG9yYWdlTWFuYWdlcjtcbiAgICB0aGlzLnJ1bnRpbWVDYXBhYmlsaXRpZXMgPSBydW50aW1lQ2FwYWJpbGl0aWVzO1xuICB9XG5cbiAgZ2V0IHBlcFVSTCgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fcGVwVVJMO1xuICB9XG5cbiAgZ2V0IGd1aVVSTCgpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBfdGhpcy5fZ3VpVVJMO1xuICB9XG5cbiAgZ2V0IHJ1bnRpbWVVUkwoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuX3J1bnRpbWVVUkw7XG4gIH1cblxuICAvKipcbiAgKiByZXR1cm4gdGhlIG1lc3NhZ2VCdXMgaW4gdGhpcyBSZWdpc3RyeVxuICAqIEBwYXJhbSB7TWVzc2FnZUJ1c30gICAgICAgICAgIG1lc3NhZ2VCdXNcbiAgKi9cbiAgZ2V0IG1lc3NhZ2VCdXMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcbiAgICByZXR1cm4gX3RoaXMuX21lc3NhZ2VCdXM7XG4gIH1cblxuICAvKipcbiAgKiBTZXQgdGhlIG1lc3NhZ2VCdXMgaW4gdGhpcyBSZWdpc3RyeVxuICAqIEBwYXJhbSB7TWVzc2FnZUJ1c30gICAgICAgICAgIG1lc3NhZ2VCdXNcbiAgKi9cbiAgc2V0IG1lc3NhZ2VCdXMobWVzc2FnZUJ1cykge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgX3RoaXMuX21lc3NhZ2VCdXMgPSBtZXNzYWdlQnVzO1xuICB9XG5cbiAgZ2V0IHN1YnNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgc2V0IHN1YnNjcmlwdGlvbihwYXJhbXMpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSBwYXJhbXMubWVzc2FnZS5ib2R5LnN1YnNjcmliZXI7XG4gIH1cblxuICBsb2FkQ29uZmlndXJhdGlvbnMoKSB7XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIGNvbnNvbGUubG9nKF90aGlzLnN0b3JhZ2VNYW5hZ2VyKTtcblxuICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdyZXRoaW5rOmFjdGl2ZVBvbGljeScpLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgIF90aGlzLmFjdGl2ZVVzZXJQb2xpY3kgPSB2YWx1ZTtcblxuICAgICAgICByZXR1cm4gX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdyZXRoaW5rOmdyb3VwcycpO1xuICAgICAgfSkudGhlbigoZ3JvdXBJbmZvKSA9PiB7XG4gICAgICAgIGxldCBncm91cHMgPSBncm91cEluZm87XG4gICAgICAgIF90aGlzLmdyb3VwcyA9IChncm91cHMgPT09IHVuZGVmaW5lZCkgPyB7fSA6IGdyb3VwcztcblxuICAgICAgICByZXR1cm4gX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdyZXRoaW5rOnNwUG9saWNpZXMnKTtcbiAgICAgIH0pLnRoZW4oKHBvbGljaWVzSW5mbykgPT4ge1xuICAgICAgICBsZXQgc3BQb2xpY2llcyA9IHBvbGljaWVzSW5mbztcbiAgICAgICAgX3RoaXMuc2VydmljZVByb3ZpZGVyUG9saWN5ID0gKHNwUG9saWNpZXMgPT09IHVuZGVmaW5lZCkgPyB7fSA6IHNwUG9saWNpZXM7XG5cbiAgICAgICAgX3RoaXMuX2xvYWRVc2VyUG9saWNpZXMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuXG4gIGdldFBvbGljaWVzKG1lc3NhZ2UsIGlzSW5jb21pbmdNZXNzYWdlKSB7XG4gICAgbGV0IHBvbGljaWVzID0ge307XG5cbiAgICBpZiAodGhpcy5hY3RpdmVVc2VyUG9saWN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBvbGljaWVzLnVzZXJQb2xpY3kgPSB0aGlzLnVzZXJQb2xpY2llc1t0aGlzLmFjdGl2ZVVzZXJQb2xpY3ldO1xuICAgIH1cblxuICAgIHBvbGljaWVzLnNlcnZpY2VQcm92aWRlclBvbGljeSA9IHRoaXMuZ2V0U2VydmljZVByb3ZpZGVyUG9saWN5KG1lc3NhZ2UsIGlzSW5jb21pbmdNZXNzYWdlKTtcblxuICAgIHJldHVybiBwb2xpY2llcztcbiAgfVxuXG4gIF9pc1ZhbGlkVXBkYXRlKG1lc3NhZ2UpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAobWVzc2FnZS5mcm9tLnNwbGl0KCc6Ly8nKS5sZW5ndGggPiAxKSB7XG4gICAgICAgIF90aGlzLmlkTW9kdWxlLl9nZXRIeXBlcnR5RnJvbURhdGFPYmplY3QobWVzc2FnZS5mcm9tKS50aGVuKGh5cGVydHlVUkwgPT4ge1xuICAgICAgICAgIGlmIChoeXBlcnR5VVJMID09PSBtZXNzYWdlLmJvZHkuc291cmNlKSB7XG4gICAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoJ1RoZSBzb3VyY2Ugb2YgdGhlIG1lc3NhZ2UgaXMgbm90IHZhbGlkLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cblxuXG4gIGdldE15RW1haWxzKCkge1xuICAgIGxldCBpZGVudGl0aWVzID0gdGhpcy5pZE1vZHVsZS5nZXRJZGVudGl0aWVzKCk7XG4gICAgbGV0IGVtYWlscyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSBpbiBpZGVudGl0aWVzKSB7XG4gICAgICBlbWFpbHMucHVzaChnZXRVc2VyRW1haWxGcm9tVVJMKGlkZW50aXRpZXNbaV0uaWRlbnRpdHkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW1haWxzO1xuICB9XG5cbiAgZ2V0TXlIeXBlcnRpZXMoKSB7XG4gICAgbGV0IGh5cGVydGllcyA9IHRoaXMucnVudGltZVJlZ2lzdHJ5Lmh5cGVydGllc0xpc3Q7XG4gICAgbGV0IGh5cGVydGllc05hbWVzID0gW107XG5cbiAgICBmb3IgKGxldCBpIGluIGh5cGVydGllcykge1xuICAgICAgbGV0IGh5cGVydHlOYW1lID0gaHlwZXJ0aWVzW2ldLm9iamVjdE5hbWU7XG4gICAgICBpZiAoaHlwZXJ0aWVzTmFtZXMuaW5kZXhPZihoeXBlcnR5TmFtZSkgPT09IC0xKSB7XG4gICAgICAgIGh5cGVydGllc05hbWVzLnB1c2goaHlwZXJ0eU5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoeXBlcnRpZXNOYW1lcztcbiAgfVxuXG4gIGdldFNlcnZpY2VQcm92aWRlclBvbGljeShtZXNzYWdlLCBpc0luY29taW5nKSB7XG4gICAgbGV0IHBvbGljeTtcblxuICAgIGlmIChpc0luY29taW5nKSB7XG4gICAgICBsZXQgdG9IeXBlcnR5ID0gdGhpcy5ydW50aW1lUmVnaXN0cnkuZ2V0SHlwZXJ0eU5hbWUobWVzc2FnZS50byk7XG4gICAgICBwb2xpY3kgPSB0aGlzLnNlcnZpY2VQcm92aWRlclBvbGljeVt0b0h5cGVydHldO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJvbUh5cGVydHkgPSB0aGlzLnJ1bnRpbWVSZWdpc3RyeS5nZXRIeXBlcnR5TmFtZShtZXNzYWdlLmZyb20pO1xuICAgICAgcG9saWN5ID0gdGhpcy5zZXJ2aWNlUHJvdmlkZXJQb2xpY3lbZnJvbUh5cGVydHldO1xuICAgIH1cbiAgICByZXR1cm4gcG9saWN5O1xuICB9XG5cblxuICBnZXRVUkwodXJsKSB7XG4gICAgbGV0IHNwbGl0VVJMID0gdXJsLnNwbGl0KCcvJyk7XG4gICAgcmV0dXJuIHNwbGl0VVJMWzBdICsgJy8vJyArIHNwbGl0VVJMWzJdICsgJy8nICsgc3BsaXRVUkxbM107XG4gIH1cblxuXG4gIC8qKlxuICAqIENyZWF0ZXMgYSBncm91cCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAqIEBwYXJhbSAge1N0cmluZ30gIGdyb3VwTmFtZVxuICAqL1xuICBfbG9hZFVzZXJQb2xpY2llcygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdyZXRoaW5rOnVzZXJQb2xpY2llcycpLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgIGxldCBwb2xpY2llcyA9IHZhbHVlO1xuICAgICAgICBpZiAocG9saWNpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZvciAobGV0IGkgaW4gcG9saWNpZXMpIHtcbiAgICAgICAgICAgIHRoaXMucGVwLmFkZFBvbGljeSgnVVNFUicsIGksIHBvbGljaWVzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIF9nZXRMYXN0Q29tcG9uZW50T2ZVUkwodXJsKSB7XG4gICAgbGV0IHNwbGl0ID0gdXJsLnNwbGl0KCcvJyk7XG4gICAgcmV0dXJuIHNwbGl0W3NwbGl0Lmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgX2dldFBvbGljaWVzSlNPTihwb2xpY2llcykge1xuICAgIGZvciAobGV0IGkgaW4gcG9saWNpZXMpIHtcbiAgICAgIGxldCBjb21iaW5pbmdBbGdvcml0aG0gPSBwb2xpY2llc1tpXS5jb21iaW5pbmdBbGdvcml0aG07XG4gICAgICBpZiAoY29tYmluaW5nQWxnb3JpdGhtIGluc3RhbmNlb2YgQmxvY2tPdmVycmlkZXMpIHtcbiAgICAgICAgcG9saWNpZXNbaV0uY29tYmluaW5nQWxnb3JpdGhtID0gJ2Jsb2NrT3ZlcnJpZGVzJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb21iaW5pbmdBbGdvcml0aG0gaW5zdGFuY2VvZiBBbGxvd092ZXJyaWRlcykge1xuICAgICAgICAgIHBvbGljaWVzW2ldLmNvbWJpbmluZ0FsZ29yaXRobSA9ICdhbGxvd092ZXJyaWRlcyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNvbWJpbmluZ0FsZ29yaXRobSBpbnN0YW5jZW9mIEZpcnN0QXBwbGljYWJsZSkge1xuICAgICAgICAgICAgcG9saWNpZXNbaV0uY29tYmluaW5nQWxnb3JpdGhtID0gJ2ZpcnN0QXBwbGljYWJsZSc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvbGljaWVzW2ldLmNvbWJpbmluZ0FsZ29yaXRobSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcG9saWNpZXM7XG4gIH1cblxuICBzYXZlQWN0aXZlUG9saWN5KCkge1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgX3RoaXMuc3RvcmFnZU1hbmFnZXIuc2V0KCdyZXRoaW5rOmFjdGl2ZVBvbGljeScsIDAsIHRoaXMuYWN0aXZlVXNlclBvbGljeSkudGhlbigoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2F2ZUdyb3VwcygpIHtcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF90aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldCgncmV0aGluazpncm91cHMnLCAwLCB0aGlzLmdyb3VwcykudGhlbigoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2F2ZVBvbGljaWVzKHNvdXJjZSwgcG9saWN5LCBrZXkpIHtcbiAgICBsZXQgcG9saWNpZXNKc29uO1xuXG4gICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgIGNhc2UgJ1VTRVInOlxuICAgICAgICBwb2xpY2llc0pzb24gPSBKU09OLnN0cmluZ2lmeSh0aGlzLnVzZXJQb2xpY2llcyk7XG4gICAgICAgIHBvbGljaWVzSnNvbiA9IHRoaXMuX2dldFBvbGljaWVzSlNPTihKU09OLnBhcnNlKHBvbGljaWVzSnNvbikpO1xuICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldCgncmV0aGluazp1c2VyUG9saWNpZXMnLCAwLCBwb2xpY2llc0pzb24pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1NFUlZJQ0VfUFJPVklERVInOlxuICAgICAgICBpZiAocG9saWN5ICE9PSB1bmRlZmluZWQgJiBrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMuc2VydmljZVByb3ZpZGVyUG9saWN5W2tleV0gPSBwb2xpY3k7XG4gICAgICAgIH1cbiAgICAgICAgcG9saWNpZXNKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5zZXJ2aWNlUHJvdmlkZXJQb2xpY3kpO1xuICAgICAgICBwb2xpY2llc0pzb24gPSB0aGlzLl9nZXRQb2xpY2llc0pTT04oSlNPTi5wYXJzZShwb2xpY2llc0pzb24pKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQoJ3JldGhpbms6c3BQb2xpY2llcycsIDAsIHBvbGljaWVzSnNvbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gcG9saWN5IHNvdXJjZTogJyArIHNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0R3JvdXBzTmFtZXMoKSB7XG4gICAgbGV0IG15R3JvdXBzID0gdGhpcy5ncm91cHM7XG4gICAgbGV0IGdyb3Vwc05hbWVzID0gW107XG4gICAgaWYgKG15R3JvdXBzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAobGV0IGdyb3VwTmFtZSBpbiBteUdyb3Vwcykge1xuICAgICAgICBncm91cHNOYW1lcy5wdXNoKGdyb3VwTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBncm91cHNOYW1lcztcbiAgfVxuXG4gIGdldEdyb3VwKGdyb3VwTmFtZSwgZGVzdGluYXRpb24pIHtcbiAgICBsZXQgbWVtYmVycyA9IFtdO1xuXG4gICAgaWYgKGdyb3VwTmFtZSA9PT0gJ3ByZWF1dGhvcmlzZWQnKSB7XG4gICAgICBsZXQgZGF0YU9iamVjdFVSTCA9IGRlc3RpbmF0aW9uLnNwbGl0KCcvJyk7XG4gICAgICBkYXRhT2JqZWN0VVJMLnBvcCgpO1xuICAgICAgZGF0YU9iamVjdFVSTCA9IGRhdGFPYmplY3RVUkxbMF0gKyAnLy8nICsgZGF0YU9iamVjdFVSTFsyXTtcbiAgICAgIG1lbWJlcnMgPSB0aGlzLnJ1bnRpbWVSZWdpc3RyeS5nZXRQcmVBdXRoU3Vic2NyaWJlcnMoZGF0YU9iamVjdFVSTCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmdyb3Vwc1tncm91cE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWVtYmVycyA9IHRoaXMuZ3JvdXBzW2dyb3VwTmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lbWJlcnM7XG4gIH1cblxuICAvKipcbiAgKiBDcmVhdGVzIGEgZ3JvdXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICBncm91cE5hbWVcbiAgKi9cbiAgY3JlYXRlR3JvdXAoZ3JvdXBOYW1lKSB7XG4gICAgdGhpcy5ncm91cHNbZ3JvdXBOYW1lXSA9IFtdO1xuICAgIHRoaXMuc2F2ZUdyb3VwcygpO1xuICB9XG5cbiAgZGVsZXRlR3JvdXAoZ3JvdXBOYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMuZ3JvdXBzW2dyb3VwTmFtZV07XG4gICAgdGhpcy5zYXZlR3JvdXBzKCk7XG4gIH1cblxuICAvKipcbiAgKiBBZGRzIHRoZSBnaXZlbiB1c2VyIGVtYWlsIHRvIHRoZSBncm91cCB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICAqIEBwYXJhbSAge1N0cmluZ30gIHVzZXJFbWFpbFxuICAqIEBwYXJhbSAge1N0cmluZ30gIGdyb3VwTmFtZVxuICAqL1xuICBhZGRUb0dyb3VwKGdyb3VwTmFtZSwgdXNlckVtYWlsKSB7XG4gICAgbGV0IG15R3JvdXBzID0gdGhpcy5ncm91cHM7XG4gICAgaWYgKG15R3JvdXBzW2dyb3VwTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKG15R3JvdXBzW2dyb3VwTmFtZV0uaW5kZXhPZih1c2VyRW1haWwpID09PSAtMSkge1xuICAgICAgICBteUdyb3Vwc1tncm91cE5hbWVdLnB1c2godXNlckVtYWlsKTtcbiAgICAgICAgdGhpcy5zYXZlR3JvdXBzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKCdHcm91cCBcIicgKyBncm91cE5hbWUgKyAnXCIgZG9lcyBub3QgZXhpc3QhJyk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRnJvbUdyb3VwKGdyb3VwTmFtZSwgdXNlckVtYWlsKSB7XG4gICAgbGV0IGdyb3VwID0gdGhpcy5ncm91cHNbZ3JvdXBOYW1lXTtcblxuICAgIGdyb3VwLnNwbGljZShncm91cC5pbmRleE9mKHVzZXJFbWFpbCksIDEpO1xuICAgIHRoaXMuc2F2ZUdyb3VwcygpO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUnVudGltZUNvcmVDdHg7XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuICogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuICogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiAqIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuICogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4gKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiovXG5pbXBvcnQgdHY0IGZyb20gXCJ0djRcIjtcblxuZXhwb3J0IGNsYXNzIFJldGhpbmtPYmplY3Qge1xuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGVzIHRoaXMgUmV0aGlua09iamVjdCBhZ2FpbnN0IHRoZSBwcm92aWRlZCBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBMSU1JVEFUSU9OUzogVGhlIHByb3ZpZGVkIHNjaGVtYSBjYW5ub3QgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIHNjaGVtYXMsIHNpbmNlIHRoZXkgY2FuJ3QgYmUgcmVzb2x2ZWQuXG4gICAgICogQHBhcmFtIHNjaGVtYSAtIHNjaGVtYSB0byB2YWxpZGF0ZSBhZ2FpbnN0XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgaWYgdmFsaWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHZhbGlkYXRlKHNjaGVtYSkge1xuICAgICAgICAvLyBhZGQgc2NoZW1hIGl0c2VsZiBzbyBsb2NhbCByZWZlcmVuY2VzIHdvcmtcbiAgICAgICAgdHY0LmFkZFNjaGVtYShzY2hlbWEuaWQsIHNjaGVtYSk7XG5cbiAgICAgICAgLy8gSlNPTiBzdHJpbmdpZnkgLT4gcGFyc2UgbmVlZGVkIHRvIGhhdmUgcHJvcGVyIHZhbGlkYXRpb25cbiAgICAgICAgbGV0IHJlc3VsdCA9IHR2NC52YWxpZGF0ZU11bHRpcGxlKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcykpLCBzY2hlbWEpO1xuXG4gICAgICAgIC8vIGRlbGV0ZSBlcnJvciBzdGFja3MgdG8gaW1wcm92ZSBsb2dnaW5nXG4gICAgICAgIHJlc3VsdC5lcnJvcnMuZm9yRWFjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBlcnJvci5zdGFjaztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gcHJpbnQgbW9yZSBkZXRhaWxzIGFib3V0IHZhbGlkYXRpb24gaWYgaXQgZmFpbHMgb3Igc2NoZW1hIGNvbnRhaW5zICRyZWZzXG4gICAgICAgIGlmICghcmVzdWx0LnZhbGlkIHx8IChyZXN1bHQubWlzc2luZy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKFwiT2JqZWN0IHZhbGlkYXRpb24gXCIgKyAocmVzdWx0LnZhbGlkID8gXCJzdWNjZWVkZWQsIGJ1dCBzY2hlbWEgY29udGFpbmVkIHJlZmVyZW5jZXM6XCIgOiBcImZhaWxlZDpcIiksIEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJPYmplY3Q6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsIDIpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbGlkO1xuICAgIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBSZXRoaW5rT2JqZWN0O1xuXG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuICogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuICogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiAqIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuICogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4gKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiovXG5pbXBvcnQgUmV0aGlua09iamVjdCBmcm9tIFwiLi9SZXRoaW5rT2JqZWN0XCI7XG5cbi8qKlxuICogQGF1dGhvciBhbGljZS5jaGVhbWJlW2F0XWZva3VzLmZyYXVuaG9mZXIuZGVcbiAqIFRoZSBDYXRhbG9ndWVEYXRhT2JqZWN0IGNsYXNzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVUSElOSyBDYXRhbG9ndWUgRGF0YSBNb2RlbFxuICovXG5jbGFzcyBDYXRhbG9ndWVEYXRhT2JqZWN0IGV4dGVuZHMgUmV0aGlua09iamVjdCB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0XG4gICAgICogQHBhcmFtIGd1aWQgLSBHbG9iYWwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIENhdGFsb2d1ZSBPYmplY3QgKGUuZy4gSHlwZXJ0eSBkZXNjcmlwdG9yLCBQcm90b2NvbFN0dWIgZGVzY3JpcHRvcixcbiAgICAgKiBldGMpIGVuYWJsaW5nIHRoZSBzYW1lIG9iamVjdCB0byBiZSBzdG9yZWQgYW5kIGRpc2NvdmVyZWQgaW4gZGlmZmVyZW50IENhdGFsb2d1ZXMuIFRoYXQgbWVhbnMsIGd1aWQgY29ycmVzcG9uZHMgdG9cbiAgICAgKiBbcmVzb3VyY2UtdHlwZS1pZF0gcGVyIEJORiBvZiBSZXNvdXJjZSBQYXRoLiBDb3VsZG4ndCB3ZSBoYXZlIHByb2JsZW1zIHdpdGggdG9vIGxvbmcgVVJMIHBhdGhzP1xuICAgICAqIEBwYXJhbSB0eXBlIC0gaW5kaWNhdGVzIHRoZSB0eXBlIG9mIENhdGFsb2d1ZSBEYXRhIE9iamVjdCBlLmcuIEh5cGVydHksIFByb3RvY29sU3R1YiwgZXRjXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcbiAgICAgKiBAcGFyYW0gb2JqZWN0TmFtZSAtIGh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3QgZS5nLiBcIk15IEF3ZXNvbWUgSHlwZXJ0eVwiXG4gICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIC0gZGVzY3JpcHRpb24gb2YgdGhlIHNvdXJjZSBwYWNrYWdlXG4gICAgICogQHBhcmFtIGxhbmd1YWdlIC0gdGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2UuU291cmNlQ29kZVxuICAgICAqIEBwYXJhbSBzb3VyY2VQYWNrYWdlVVJMIC0gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAgKiBjYXRhbG9ndWUgb2JqZWN0LCBlLmcuIGRlcGxveWFibGUgcGFja2FnZXMgY29udGFpbmluZyBleGVjdXRhYmxlIGNvZGUgZm9yIEh5cGVydGllcyBvciBQcm90b1N0dWJzLCBjYW4gYmUgZG93bmxvYWRlZFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9ndWlkID0gZ3VpZDtcbiAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9vYmplY3ROYW1lID0gb2JqZWN0TmFtZTtcbiAgICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICAgICAgdGhpcy5fc291cmNlUGFja2FnZVVSTCA9IHNvdXJjZVBhY2thZ2VVUkw7XG5cbiAgICAgICAgdGhpcy5fc2lnbmF0dXJlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc291cmNlUGFja2FnZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gR2V0dGVyc1xuICAgIGdldCBndWlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ3VpZDtcbiAgICB9XG5cbiAgICBnZXQgdHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfVxuXG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cblxuICAgIGdldCBvYmplY3ROYW1lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0TmFtZTtcbiAgICB9XG5cbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgbGFuZ3VhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcbiAgICB9XG5cbiAgICBnZXQgc2lnbmF0dXJlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmF0dXJlO1xuICAgIH1cblxuICAgIGdldCBzb3VyY2VQYWNrYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlUGFja2FnZTtcbiAgICB9XG5cbiAgICBnZXQgc291cmNlUGFja2FnZVVSTCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBhY2thZ2VVUkw7XG4gICAgfVxuXG5cbiAgICAvLyBTZXR0ZXJzXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBzaWduYXR1cmUgdG8gZW5hYmxlcyBpbnRlZ3JpdHkgYW5kIGF1dGhlbnRpY2l0eSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0gc2lnbmF0dXJlXG4gICAgICovXG4gICAgc2V0IHNpZ25hdHVyZShzaWduYXR1cmUpIHtcbiAgICAgICAgaWYgKHNpZ25hdHVyZSlcbiAgICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbiAgICB9XG5cbiAgICBzZXQgc291cmNlUGFja2FnZShzb3VyY2VQYWNrYWdlKSB7XG4gICAgICAgIGlmIChzb3VyY2VQYWNrYWdlKVxuICAgICAgICAgICAgdGhpcy5fc291cmNlUGFja2FnZSA9IHNvdXJjZVBhY2thZ2U7XG4gICAgfVxuXG4gICAgc2V0IGd1aWQoZ3VpZCkge1xuICAgICAgICBpZiAoZ3VpZClcbiAgICAgICAgICAgIHRoaXMuX2d1aWQgPSBndWlkO1xuICAgIH1cblxuICAgIHNldCB0eXBlKHR5cGUpIHtcbiAgICAgICAgaWYgKHR5cGUpXG4gICAgICAgICAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICB9XG5cbiAgICBzZXQgdmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBvYmplY3ROYW1lKG9iamVjdE5hbWUpIHtcbiAgICAgICAgaWYgKG9iamVjdE5hbWUpXG4gICAgICAgICAgICB0aGlzLl9vYmplY3ROYW1lID0gb2JqZWN0TmFtZTtcbiAgICB9XG5cbiAgICBzZXQgZGVzY3JpcHRpb24oZGVzY3JpcHRpb24pIHtcbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uKVxuICAgICAgICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICB9XG5cbiAgICBzZXQgbGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcbiAgICAgICAgaWYgKGxhbmd1YWdlKVxuICAgICAgICAgICAgdGhpcy5fbGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgICB9XG5cbiAgICBzZXQgc291cmNlUGFja2FnZVVSTChzb3VyY2VQYWNrYWdlVVJMKSB7XG4gICAgICAgIGlmIChzb3VyY2VQYWNrYWdlVVJMKVxuICAgICAgICAgICAgdGhpcy5fc291cmNlUGFja2FnZVVSTCA9IHNvdXJjZVBhY2thZ2VVUkw7XG4gICAgfVxufVxuLy9BbGljZTogcmVtb3ZlZCBQT0xJQ1lfRU5GT1JDRVI6ICdwb2xpY3lfZW5mb3JjZXInLCBEQVRBX1NDSEVNQTogJ2RhdGFfc2NoZW1hJyBmcm9tIHRoZSBsaXN0XG4vL3dydDogaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9kZXYtc2VydmljZS1mcmFtZXdvcmsvYmxvYi9kZXZlbG9wL2RvY3MvZGF0YW1vZGVsL2NvcmUvaHlwZXJ0eS1jYXRhbG9ndWUvcmVhZG1lLm1kI2RhdGEtb2JqZWN0LXNjaGVtYVxuZXhwb3J0IGNvbnN0IENhdGFsb2d1ZU9iamVjdFR5cGUgPSB7XG4gICAgSFlQRVJUWTogJ2h5cGVydHknLCBQUk9UT1NUVUI6ICdwcm90b3N0dWInLCBIWVBFUlRZX1JVTlRJTUU6ICdoeXBlcnR5X3J1bnRpbWUnLFxuICAgIEhZUEVSVFlfSU5URVJDRVBUT1I6ICdoeXBlcnR5X2luc3BlY3RvcicsIEhZUEVSVFlfREFUQV9PQkpFQ1Q6ICdoeXBlcnR5X2RhdGFfb2JqZWN0J1xufTtcbmV4cG9ydCBjb25zdCBEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2UgPSB7XG4gICAgSkFWQVNDUklQVF9FQ01BNjogJ2phdmFzY3JpcHRfZWNtYTYnLCBKQVZBU0NSSVBUX0VDTUE1OiAnamF2YXNjcmlwdF9lY21hNScsXG4gICAgSlNPTl9TQ0hFTUFfVjQ6ICdqc29uX3NjaGVtYV92NCcsIFBZVEhPTjogJ3B5dGhvbicsIFRZUEVTQ1JJUFQ6ICd0eXBlc2NyaXB0J1xufTtcbmV4cG9ydCBkZWZhdWx0IENhdGFsb2d1ZURhdGFPYmplY3Q7IiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG4vKipcbiAqIENyZWF0ZWQgYnkgYW1vIG9uIDE0LzExLzIwMTUuXG4gKi9cbmNsYXNzIFNvdXJjZVBhY2thZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHNvdXJjZUNvZGVDbGFzc25hbWUsIHNvdXJjZUNvZGUpIHtcbiAgICAgICAgdGhpcy5fc291cmNlQ29kZSA9IHNvdXJjZUNvZGU7XG4gICAgICAgIHRoaXMuX3NvdXJjZUNvZGVDbGFzc25hbWUgPSBzb3VyY2VDb2RlQ2xhc3NuYW1lO1xuXG4gICAgICAgIHRoaXMuX2VuY29kaW5nID0gbnVsbDtcbiAgICAgICAgdGhpcy5fc2lnbmF0dXJlID0gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgc291cmNlQ29kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZUNvZGU7XG4gICAgfVxuXG4gICAgZ2V0IHNvdXJjZUNvZGVDbGFzc25hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VDb2RlQ2xhc3NuYW1lO1xuICAgIH1cblxuICAgIGdldCBlbmNvZGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY29kaW5nO1xuICAgIH1cblxuICAgIGdldCBzaWduYXR1cmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmU7XG4gICAgfVxuXG4gICAgc2V0IGVuY29kaW5nKGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZylcbiAgICAgICAgICAgIHRoaXMuX2VuY29kaW5nID0gZW5jb2Rpbmc7XG4gICAgfVxuXG4gICAgc2V0IHNpZ25hdHVyZShzaWduKSB7XG4gICAgICAgIGlmIChzaWduKVxuICAgICAgICAgICAgdGhpcy5fc2lnbmF0dXJlID0gc2lnbjtcbiAgICB9XG5cbiAgICBzZXQgc291cmNlQ29kZShzb3VyY2VDb2RlKSB7XG4gICAgICAgIGlmIChzb3VyY2VDb2RlKVxuICAgICAgICAgICAgdGhpcy5fc291cmNlQ29kZSA9IHNvdXJjZUNvZGU7XG4gICAgfVxuXG4gICAgc2V0IHNvdXJjZUNvZGVDbGFzc25hbWUoc291cmNlQ29kZUNsYXNzbmFtZSkge1xuICAgICAgICBpZiAoc291cmNlQ29kZUNsYXNzbmFtZSlcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZUNvZGVDbGFzc25hbWUgPSBzb3VyY2VDb2RlQ2xhc3NuYW1lO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU291cmNlUGFja2FnZTtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLyoqXG4gKiBDcmVhdGVkIGJ5IGFtbyBvbiAxNC8xMS8yMDE1LlxuICovXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCBmcm9tICcuL0NhdGFsb2d1ZURhdGFPYmplY3QnO1xuXG5jbGFzcyBIeXBlcnR5RGVzY3JpcHRvciBleHRlbmRzIENhdGFsb2d1ZURhdGFPYmplY3Qge1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCAtIENhdGFsb2d1ZSBHbG9iYWwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIENhdGFsb2d1ZSBPYmplY3QgZW5hYmxpbmcgdGhlIHNhbWUgb2JqZWN0IHRvIGJlXG4gICAgICogc3RvcmVkIGFuZCBkaXNjb3ZlcmVkIGluIGRpZmZlcmVudCBDYXRhbG9ndWVzLiBHdWlkIGNvcnJlc3BvbmRzIHRvIDxyZXNvdXJjZS10eXBlLWlkPiBwZXIgQk5GIG9mIFJlc291cmNlIFBhdGguXG4gICAgICogQHBhcmFtIHtDYXRhbG9ndWVPYmplY3RUeXBlfSBjYXRhbG9ndWVUeXBlIC0gXHRJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMXG4gICAgICogQHBhcmFtIHtIeXBlcnR5UmVzb3VyY2VUeXBlW119IGh5cGVydHlUeXBlIEEgdGFnIHRoYXQgaWRlbnRpZmllcyB3aGF0IHR5cGUgb2YgaHlwZXJ0eSBpcyBkZXNjcmliZWQgaW4gdGhlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge1VSTC5IeXBlcnR5Q2F0YWxvZ3VlVVJMTGlzdH0gZGF0YU9iamVjdFVybHMgLSBJdCBkZWZpbmVzIHRoZSBEYXRhIE9iamVjdCBTY2hlbWFzIHN1cHBvcnRlZCBieSB0aGUgSHlwZXJ0eVxuICAgICAqIHRocm91Z2ggYSBsaXN0IG9mIENhdGFsb2d1ZSBVUkxzIGZyb20gd2hlcmUgdGhlc2Ugc2NoZW1hcyBjYW4gYmUgcmVhY2hlZFxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGd1aWQsIGNhdGFsb2d1ZVR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgaHlwZXJ0eVR5cGUsIGRhdGFPYmplY3RVcmxzKSB7XG4gICAgICAgIHN1cGVyKGd1aWQsIGNhdGFsb2d1ZVR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XG5cbiAgICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IHt9O1xuICAgICAgICB0aGlzLl9jb25zdHJhaW50cyA9IHt9O1xuICAgICAgICB0aGlzLl9wb2xpY2llcyA9IHt9O1xuICAgICAgICB0aGlzLl9tZXNzYWdlU2NoZW1hID0gbnVsbDtcblxuICAgICAgICB0aGlzLl9oeXBlcnR5VHlwZSA9IGh5cGVydHlUeXBlO1xuICAgICAgICB0aGlzLl9kYXRhT2JqZWN0cyA9IGRhdGFPYmplY3RVcmxzO1xuICAgIH1cblxuICAgIGdldCBoeXBlcnR5VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlUeXBlO1xuICAgIH1cblxuICAgIGdldCBkYXRhT2JqZWN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFPYmplY3RzO1xuICAgIH1cblxuICAgIGdldCBjb25maWd1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgY29uc3RyYWludHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdHJhaW50cztcbiAgICB9XG5cbiAgICBnZXQgbWVzc2FnZVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lc3NhZ2VTY2hlbWE7XG4gICAgfVxuXG4gICAgZ2V0IHBvbGljaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcG9saWNpZXM7XG4gICAgfVxuXG4gICAgc2V0IGh5cGVydHlUeXBlKGhUeXBlKSB7XG4gICAgICAgIGlmIChoVHlwZSlcbiAgICAgICAgICAgIHRoaXMuX2h5cGVydHlUeXBlID0gaFR5cGU7XG4gICAgfVxuXG4gICAgc2V0IGRhdGFPYmplY3RzKGRhdGFPYmplY3RzKSB7XG4gICAgICAgIGlmIChkYXRhT2JqZWN0cylcbiAgICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzID0gZGF0YU9iamVjdHM7XG4gICAgfVxuXG4gICAgc2V0IGNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbilcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIHNldCBjb25zdHJhaW50cyhjb25zdHJhaW50cykge1xuICAgICAgICBpZiAoY29uc3RyYWludHMpXG4gICAgICAgICAgICB0aGlzLl9jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzO1xuICAgIH1cblxuICAgIHNldCBtZXNzYWdlU2NoZW1hKG1lc3NhZ2VTY2hlbWEpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2VTY2hlbWEpXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2NoZW1hID0gbWVzc2FnZVNjaGVtYTtcbiAgICB9XG5cbiAgICBzZXQgcG9saWNpZXMocG9saWNpZXMpIHtcbiAgICAgICAgaWYgKHBvbGljaWVzKVxuICAgICAgICAgICAgdGhpcy5fcG9saWNpZXMgPSBwb2xpY2llcztcbiAgICB9XG5cbn1cblxuXG5leHBvcnQgY29uc3QgUnVudGltZUh5cGVydHlDYXBhYmlsaXR5VHlwZSA9IHt9O1xuZXhwb3J0IGNvbnN0IEh5cGVydHlUeXBlID0ge0NPTU1VTklDQVRPUjogJ2NvbW11bmljYXRvcicsIElERU5USVRZOiAnaWRlbnRpdHknLCBDT05URVhUOiAnY29udGV4dCd9O1xuZXhwb3J0IGNvbnN0IEh5cGVydHlSZXNvdXJjZVR5cGUgPSB7Y2hhdDogJ0NIQVQnLCBhdWRpbzogJ0F1ZGlvJywgdmlkZW86ICdWaWRlbycsIGF2OiAnQVYnLCBzY3JlZW46J1NDUkVFTicsXG4gICAgZmlsZTogJ0ZJTGUnLCBtaWRpOidNSURJJ307XG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5RGVzY3JpcHRvcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuICogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxuICogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiAqIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xuICogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4gKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiovXG5cbi8qKlxuICogQ3JlYXRlZCBieSBhbW8gb24gMTQvMTEvMjAxNS5cbiAqL1xuXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCBmcm9tIFwiLi9DYXRhbG9ndWVEYXRhT2JqZWN0XCI7XG5cbmNsYXNzIFByb3RvY29sU3R1YkRlc2NyaXB0b3IgZXh0ZW5kcyBDYXRhbG9ndWVEYXRhT2JqZWN0IHtcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIG1lc3NhZ2VTY2hlbWFzLCBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLCBoeXBlcnR5VHlwZSwgZGF0YU9iamVjdHMsIGludGVyd29ya2luZywgaWRwUHJveHksIG11dHVhbEF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICAgIHN1cGVyKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XG5cbiAgICAgICAgdGhpcy5fbWVzc2FnZVNjaGVtYXMgPSBtZXNzYWdlU2NoZW1hcztcblxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbilcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0ge307XG5cbiAgICAgICAgaWYgKGNvbnN0cmFpbnRzKVxuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWludHMgPSBjb25zdHJhaW50cztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWludHMgPSB7fTtcblxuICAgICAgICB0aGlzLl9oeXBlcnR5VHlwZSA9IGh5cGVydHlUeXBlO1xuXG4gICAgICAgIGlmIChkYXRhT2JqZWN0cylcbiAgICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzID0gZGF0YU9iamVjdHM7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzID0gW107XG4gICAgICAgIFxuICAgICAgICB0aGlzLl9pbnRlcndvcmtpbmcgPSBpbnRlcndvcmtpbmc7XG4gICAgICAgIHRoaXMuX2lkcFByb3h5ID0gaWRwUHJveHk7XG4gICAgICAgIHRoaXMuX211dHVhbEF1dGhlbnRpY2F0aW9uID0gbXV0dWFsQXV0aGVudGljYXRpb247XG5cbiAgICB9XG5cbiAgICBnZXQgbWVzc2FnZVNjaGVtYXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlU2NoZW1hcztcbiAgICB9XG5cbiAgICBnZXQgY29uc3RyYWludHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdHJhaW50cztcbiAgICB9XG5cbiAgICBnZXQgY29uZmlndXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgc2V0IG1lc3NhZ2VTY2hlbWFzKG1lc3NhZ2VTY2hlbWFzKSB7XG4gICAgICAgIGlmIChtZXNzYWdlU2NoZW1hcylcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTY2hlbWFzID0gbWVzc2FnZVNjaGVtYXM7XG4gICAgfVxuXG4gICAgc2V0IGNvbnN0cmFpbnRzKGNvbnN0cmFpbnRzKSB7XG4gICAgICAgIGlmIChjb25zdHJhaW50cylcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XG4gICAgfVxuXG4gICAgc2V0IGNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbilcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIGdldCBoeXBlcnR5VHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlUeXBlO1xuICAgIH1cblxuICAgIHNldCBoeXBlcnR5VHlwZSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9oeXBlcnR5VHlwZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBkYXRhT2JqZWN0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFPYmplY3RzO1xuICAgIH1cblxuICAgIHNldCBkYXRhT2JqZWN0cyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9kYXRhT2JqZWN0cyA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldCBpbnRlcndvcmtpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnRlcndvcmtpbmc7XG4gICAgfVxuXG4gICAgc2V0IGludGVyd29ya2luZyh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9pbnRlcndvcmtpbmcgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgaWRwUHJveHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZHBQcm94eTtcbiAgICB9XG5cbiAgICBzZXQgaWRwUHJveHkodmFsdWUpIHtcbiAgICAgICAgdGhpcy5faWRwUHJveHkgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgbXV0dWFsQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tdXR1YWxBdXRoZW50aWNhdGlvbjtcbiAgICB9XG5cbiAgICBzZXQgbXV0dWFsQXV0aGVudGljYXRpb24odmFsdWUpIHtcbiAgICAgICAgdGhpcy5fbXV0dWFsQXV0aGVudGljYXRpb24gPSB2YWx1ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb3RvY29sU3R1YkRlc2NyaXB0b3I7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXG4gKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiAqIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcbiAqIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiAqIENvcHlyaWdodCAyMDE2IEFwaXplZVxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqL1xuXG4vKipcbiAqIENyZWF0ZWQgYnkgYW1vIG9uIDE0LzExLzIwMTUuXG4gKi9cblxuaW1wb3J0IENhdGFsb2d1ZURhdGFPYmplY3QgZnJvbSBcIi4vQ2F0YWxvZ3VlRGF0YU9iamVjdFwiO1xuXG5jbGFzcyBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IgZXh0ZW5kcyBDYXRhbG9ndWVEYXRhT2JqZWN0IHtcblxuICAgIGNvbnN0cnVjdG9yKGd1aWQsIGNhdGFsb2d1ZVR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgcnVudGltZVR5cGUsXG4gICAgICAgICAgICAgICAgaHlwZXJ0eUNhcGFiaWxpdGllcywgcHJvdG9jb2xDYXBhYmlsaXRpZXMsIHAycEhhbmRsZXJTdHViLCBwMnBSZXF1ZXN0ZXJTdHViKSB7XG4gICAgICAgIHN1cGVyKGd1aWQsIGNhdGFsb2d1ZVR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XG5cbiAgICAgICAgdGhpcy5fcnVudGltZVR5cGUgPSBydW50aW1lVHlwZTtcblxuICAgICAgICBpZiAoaHlwZXJ0eUNhcGFiaWxpdGllcylcbiAgICAgICAgICAgIHRoaXMuX2h5cGVydHlDYXBhYmlsaXRpZXMgPSBoeXBlcnR5Q2FwYWJpbGl0aWVzO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLl9oeXBlcnR5Q2FwYWJpbGl0aWVzID0gbmV3IFJ1bnRpbWVIeXBlcnR5Q2FwYWJpbGl0eSh0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7XG4gICAgICAgIGlmIChwcm90b2NvbENhcGFiaWxpdGllcylcbiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sQ2FwYWJpbGl0aWVzID0gcHJvdG9jb2xDYXBhYmlsaXRpZXM7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sQ2FwYWJpbGl0aWVzID0gbmV3IFJ1bnRpbWVQcm90b2NvbENhcGFiaWxpdHkodHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuX3AycEhhbmRsZXJTdHViID0gcDJwSGFuZGxlclN0dWI7XG4gICAgICAgIHRoaXMuX3AycFJlcXVlc3RlclN0dWIgPSBwMnBSZXF1ZXN0ZXJTdHViO1xuICAgIH1cblxuICAgIGdldCBydW50aW1lVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3J1bnRpbWVUeXBlO1xuICAgIH1cblxuICAgIGdldCBoeXBlcnR5Q2FwYWJpbGl0aWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faHlwZXJ0eUNhcGFiaWxpdGllcztcbiAgICB9XG5cbiAgICBnZXQgcHJvdG9jb2xDYXBhYmlsaXRpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oeXBlcnR5Q2FwYWJpbGl0aWVzO1xuICAgIH1cblxuICAgIHNldCBydW50aW1lVHlwZShydW50aW1lVHlwZSkge1xuICAgICAgICBpZiAocnVudGltZVR5cGUpXG4gICAgICAgICAgICB0aGlzLl9ydW50aW1lVHlwZSA9IHJ1bnRpbWVUeXBlO1xuICAgIH1cblxuICAgIHNldCBoeXBlcnR5Q2FwYWJpbGl0aWVzKGh5cGVydHlDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgaWYgKGh5cGVydHlDYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICB0aGlzLl9oeXBlcnR5Q2FwYWJpbGl0aWVzID0gaHlwZXJ0eUNhcGFiaWxpdGllcztcbiAgICB9XG5cbiAgICBzZXQgcHJvdG9jb2xDYXBhYmlsaXRpZXMocHJvdG9jb2xDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgaWYgKHByb3RvY29sQ2FwYWJpbGl0aWVzKVxuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xDYXBhYmlsaXRpZXMgPSBwcm90b2NvbENhcGFiaWxpdGllcztcbiAgICB9XG5cbiAgICBnZXQgcDJwSGFuZGxlclN0dWIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wMnBIYW5kbGVyU3R1YjtcbiAgICB9XG5cbiAgICBzZXQgcDJwSGFuZGxlclN0dWIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcDJwSGFuZGxlclN0dWIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgcDJwUmVxdWVzdGVyU3R1YigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3AycFJlcXVlc3RlclN0dWI7XG4gICAgfVxuXG4gICAgc2V0IHAycFJlcXVlc3RlclN0dWIodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fcDJwUmVxdWVzdGVyU3R1YiA9IHZhbHVlO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjYXBhYmlsaXR5IHNldCBvZiB0aGUgUnVudGltZSBIeXBlcnR5XG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lSHlwZXJ0eUNhcGFiaWxpdHkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IG9mIHRoZSBSdW50aW1lIEh5cGVydHkgY2FwYWJpbGl0eSBzZXRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzV2ViUlRDU3VwcG9ydGVkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc01pY1N1cHBvcnRlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNDYW1lcmFTdXBwb3J0ZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzU2Vuc29yU3VwcG9ydGVkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc09SVENTdXBwb3J0ZWRcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihpc1dlYlJUQ1N1cHBvcnRlZCwgaXNNaWNTdXBwb3J0ZWQsIGlzQ2FtZXJhU3VwcG9ydGVkLCBpc1NlbnNvclN1cHBvcnRlZCwgaXNPUlRDU3VwcG9ydGVkKSB7XG4gICAgICAgIHRoaXMuX2lzV2ViUlRDID0gaXNXZWJSVENTdXBwb3J0ZWQ7XG4gICAgICAgIHRoaXMuX2lzTWljID0gaXNNaWNTdXBwb3J0ZWQ7XG4gICAgICAgIHRoaXMuX2lzQ2FtZXJhID0gaXNDYW1lcmFTdXBwb3J0ZWQ7XG4gICAgICAgIHRoaXMuX2lzU2Vuc29yID0gaXNTZW5zb3JTdXBwb3J0ZWQ7XG4gICAgICAgIHRoaXMuX2lzT1JUQyA9IGlzT1JUQ1N1cHBvcnRlZDtcbiAgICB9XG5cbiAgICBnZXQgaXNNaWMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc01pYztcbiAgICB9XG5cbiAgICBnZXQgaXNDYW1lcmEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbWVyYTtcbiAgICB9XG5cbiAgICBnZXQgaXNTZW5zb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1NlbnNvcjtcbiAgICB9XG5cbiAgICBnZXQgaXNXZWJSVEMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1dlYlJUQztcbiAgICB9XG5cbiAgICBnZXQgaXNPUlRDUygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzT1JUQztcbiAgICB9XG5cbiAgICBnZXRDYXBhYmlsaXR5U2V0KCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgfVxufVxuXG5cbi8qKlxuICogQSBjbGFzcyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvdG9jb2wgY2FwYWJpbGl0eSBzZXQgb2YgdGhlIFJ1bnRpbWUgSHlwZXJ0eVxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZVByb3RvY29sQ2FwYWJpbGl0eSB7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBvZiB0aGUgcnVudGltZSBwcm90b2NvbCBjYXBhYmlsaXR5XG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0h0dHBcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzSHR0cHNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzV1NcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzV1NTXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0NvYXBcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRGF0YUNoYW5uZWxcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihpc0h0dHAsIGlzSHR0cHMsIGlzV1MsIGlzV1NTLCBpc0NvYXAsIGlzRGF0YUNoYW5uZWwpIHtcbiAgICAgICAgdGhpcy5faXNIdHRwID0gaXNIdHRwO1xuICAgICAgICB0aGlzLl9pc0h0dHBzID0gaXNIdHRwcztcbiAgICAgICAgdGhpcy5faXNXUyA9IGlzV1M7XG4gICAgICAgIHRoaXMuX2lzV1NTID0gaXNXU1M7XG4gICAgICAgIHRoaXMuX2lzQ29hcCA9IGlzQ29hcDtcbiAgICAgICAgdGhpcy5faXNEYXRhQ2hhbm5lbCA9IGlzRGF0YUNoYW5uZWw7XG4gICAgfVxuXG4gICAgaXNIdHRwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNIdHRwO1xuICAgIH1cblxuICAgIGlzSHR0cHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0h0dHBzO1xuICAgIH1cblxuICAgIGlzV1MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1dTO1xuICAgIH1cblxuICAgIGlzU2Vuc29yU3VwcG9ydGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNTZW5zb3I7XG4gICAgfVxuXG4gICAgaXNXU1MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1dTUztcbiAgICB9XG5cbiAgICBpc0NvYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NvYXA7XG4gICAgfVxuXG4gICAgaXNEYXRhQ2hhbm5lbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGF0YUNoYW5uZWw7XG4gICAgfVxuXG5cbiAgICBnZXRDYXBhYmlsaXR5U2V0KCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcyk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgUnVudGltZVR5cGUgPSB7QlJPV1NFUjogJ2Jyb3dzZXInLCBTVEFOREFMT05FOiAnc3RhbmRhbG9uZScsIFNFUlZFUjogJ3NlcnZlcicsIEdBVEVXQVk6ICdnYXRld2F5J307XG5cbmV4cG9ydCBkZWZhdWx0IEh5cGVydHlSdW50aW1lRGVzY3JpcHRvcjtcbiIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLyoqXG4gKiBDcmVhdGVkIGJ5IHB6dSBvbiAxOS4xMS4xNS5cbiAqL1xuaW1wb3J0IENhdGFsb2d1ZURhdGFPYmplY3QgZnJvbSAnLi9DYXRhbG9ndWVEYXRhT2JqZWN0JztcblxuY2xhc3MgUG9saWN5RW5mb3JjZXJEZXNjcmlwdG9yIGV4dGVuZHMgQ2F0YWxvZ3VlRGF0YU9iamVjdCB7XG4gICAgY29uc3RydWN0b3IoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBjb25maWd1cmF0aW9uLCBwb2xpY2llcykge1xuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xuXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgICAgICB0aGlzLl9wb2xpY2llcyA9IHBvbGljaWVzO1xuICAgIH1cblxuICAgIGdldCBjb25maWd1cmF0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICBnZXQgcG9saWNpZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb2xpY2llcztcbiAgICB9XG5cbiAgICBzZXQgcG9saWNpZXMocG9saWNpZXMpIHtcbiAgICAgICAgdGhpcy5fcG9saWNpZXMgPSBwb2xpY2llcztcbiAgICB9XG5cbiAgICBzZXQgY29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUG9saWN5RW5mb3JjZXJEZXNjcmlwdG9yOyIsIi8qKlxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxuKlxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuKlxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuKlxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKi9cblxuLyoqXG4gKiBDcmVhdGVkIGJ5IHB6dSBvbiAxOS4xMS4xNS5cbiAqL1xuXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCBmcm9tICcuL0NhdGFsb2d1ZURhdGFPYmplY3QnO1xuXG5leHBvcnQgY2xhc3MgRGF0YU9iamVjdFNjaGVtYSBleHRlbmRzIENhdGFsb2d1ZURhdGFPYmplY3Qge1xuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCkge1xuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xuICAgIH1cblxufVxuXG5cbi8vQ2hpbGRyZW5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGF0YU9iamVjdFNjaGVtYSBleHRlbmRzIERhdGFPYmplY3RTY2hlbWEge1xuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCkge1xuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEh5cGVydHlEYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgRGF0YU9iamVjdFNjaGVtYSB7XG4gICAgY29uc3RydWN0b3IoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5LCBkYXRhVXJsU2NoZW1lKSB7XG4gICAgICAgIHN1cGVyKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XG4gICAgICAgIHRoaXMuX2FjY2Vzc0NvbnRyb2xQb2xpY3kgPSBhY2Nlc3NDb250cm9sUG9saWN5O1xuICAgICAgICB0aGlzLl9zY2hlbWUgPSBkYXRhVXJsU2NoZW1lO1xuICAgIH1cbn1cblxuLy9DaGlsZHJlblxuZXhwb3J0IGNsYXNzIENvbW11bmljYXRpb25EYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEge1xuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgYWNjZXNzQ29udHJvbFBvbGljeSkge1xuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25EYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEge1xuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgYWNjZXNzQ29udHJvbFBvbGljeSkge1xuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5RGF0YU9iamVjdFNjaGVtYSBleHRlbmRzIEh5cGVydHlEYXRhT2JqZWN0U2NoZW1hIHtcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpIHtcbiAgICAgICAgc3VwZXIoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0RGF0YU9iamVjdFNjaGVtYSBleHRlbmRzIEh5cGVydHlEYXRhT2JqZWN0U2NoZW1hIHtcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpIHtcbiAgICAgICAgc3VwZXIoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBEYXRhVXJsU2NoZW1lID0ge1xuICAgIENPTU06ICdDT01NJywgQ09OTkVDVElPTjogJ0NPTk5FQ1RJT04nLCBDVFhUOiAnQ1RYVCcsIElERU5USVRZOiAnSURFTlRJVFknXG59O1xuXG5leHBvcnQgZGVmYXVsdCBEYXRhT2JqZWN0U2NoZW1hOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXG4gKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuICogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxuICogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4gKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcbiAqIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKi9cblxuaW1wb3J0IENhdGFsb2d1ZURhdGFPYmplY3QsIHtDYXRhbG9ndWVPYmplY3RUeXBlLCBEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGZyb20gXCIuL0NhdGFsb2d1ZURhdGFPYmplY3RcIjtcbmltcG9ydCBTb3VyY2VQYWNrYWdlIGZyb20gXCIuL1NvdXJjZVBhY2thZ2VcIjtcbmltcG9ydCBIeXBlcnR5RGVzY3JpcHRvciBmcm9tIFwiLi9IeXBlcnR5RGVzY3JpcHRvclwiO1xuaW1wb3J0IFByb3RvY29sU3R1YkRlc2NyaXB0b3IgZnJvbSBcIi4vUHJvdG9jb2xTdHViRGVzY3JpcHRvclwiO1xuaW1wb3J0IEh5cGVydHlSdW50aW1lRGVzY3JpcHRvciwge1J1bnRpbWVUeXBlfSBmcm9tIFwiLi9IeXBlcnR5UnVudGltZURlc2NyaXB0b3JcIjtcbmltcG9ydCBIeXBlcnR5SW50ZXJjZXB0b3JEZXNjcmlwdG9yIGZyb20gXCIuL0h5cGVydHlJbnRlcmNlcHRvckRlc2NyaXB0b3JcIjtcbmltcG9ydCB7XG4gICAgRGF0YU9iamVjdFNjaGVtYSxcbiAgICBEYXRhVXJsU2NoZW1lLFxuICAgIENvbW11bmljYXRpb25EYXRhT2JqZWN0U2NoZW1hLFxuICAgIENvbm5lY3Rpb25EYXRhT2JqZWN0U2NoZW1hLFxuICAgIENvbnRleHREYXRhT2JqZWN0U2NoZW1hLFxuICAgIElkZW50aXR5RGF0YU9iamVjdFNjaGVtYVxufSBmcm9tIFwiLi9EYXRhT2JqZWN0U2NoZW1hXCI7XG5cbmNsYXNzIENhdGFsb2d1ZURhdGFPYmplY3RGYWN0b3J5IHtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBDYXRhbG9ndWVEYXRhT2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XG4gICAgICogQHBhcmFtIHtDYXRhbG9ndWVPYmplY3RUeXBlfSB0eXBlIC0gSW5kaWNhdGVzIHRoZSB0eXBlIG9mIENhdGFsb2d1ZSBEYXRhIE9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cbiAgICAgKiBAcmV0dXJucyB7Q2F0YWxvZ3VlRGF0YU9iamVjdH1cbiAgICAgKi9cbiAgICBjcmVhdGVDYXRhbG9ndWVEYXRhT2JqZWN0KGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIHR5cGUgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVycyFcIik7XG4gICAgICAgIHJldHVybiBuZXcgQ2F0YWxvZ3VlRGF0YU9iamVjdChndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBIeXBlcnR5RGVzY3JpcHRvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdFxuICAgICAqIGNhbiBiZSBkb3dubG9hZGVkLlxuICAgICAqIEBwYXJhbSB7SHlwZXJ0eVJlc291cmNlVHlwZVtdfSBoeXBlcnR5VHlwZSAtIEFuIGFycmF5IG9mIEh5cGVydHlSZXNvdXJjZVR5cGUgdGhhdCBpZGVudGlmaWVzIHdoYXQgdHlwZSBvZiBoeXBlcnR5XG4gICAgICogcmVzb3VyY2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtVUkwuVVJMTGlzdH0gZGF0YU9iamVjdHMgLSBEZWZpbmVzIHRoZSBEYXRhIE9iamVjdCBTY2hlbWFzIHN1cHBvcnRlZCBieSB0aGUgSHlwZXJ0eSB0aHJvdWdoIGEgbGlzdCBvZiBDYXRhbG9ndWUgVVJMcyBmcm9tIHdoZXJlIHRoZXNlIHNjaGVtYXMgY2FuIGJlIHJlYWNoZWQuXG4gICAgICogQHJldHVybnMge0h5cGVydHlEZXNjcmlwdG9yfVxuICAgICAqL1xuICAgIGNyZWF0ZUh5cGVydHlEZXNjcmlwdG9yT2JqZWN0KGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgaHlwZXJ0eVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2YgaHlwZXJ0eVR5cGUgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBkYXRhT2JqZWN0cyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xuICAgICAgICByZXR1cm4gbmV3IEh5cGVydHlEZXNjcmlwdG9yKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgaHlwZXJ0eVR5cGUsIGRhdGFPYmplY3RzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgUHJvdG9jb2xTdHViRGVzY3JpcHRvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cbiAgICAgKiBAcGFyYW0ge1VSTC5VUkx9IG1lc3NhZ2VTY2hlbWFzIC0gRGVmaW5lcyB0aGUgU2NoZW1hIGRlc2NyaWJpbmcgdGhlIE1lc3NhZ2UgRGF0YSBNb2RlbCB1c2VkIGJ5IHRoZSBIeXBlcnR5IHRocm91Z2ggdGhlIENhdGFsb2d1ZSBVUkwgZnJvbSB3aGVyZSB0aGUgTWVzc2FnZSBzY2hlbWEgY2FuIGJlIHJlYWNoZWQuIElmIG5vdCBkZWZpbmVkLCBieSBkZWZhdWx0IGl0IGlzIGFzc3VtZWQgdGhlIHN0YW5kYXJkIE1lc3NhZ2UgTW9kZWwgaXMgdXNlZC5cbiAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiAtIERhdGEgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoZSBQcm90b2NvbFN0dWJcbiAgICAgKiBAcGFyYW0gY29uc3RyYWludHMgLSBEZXNjcmliZXMgY2FwYWJpbGl0aWVzIHJlcXVpcmVkIGZyb20gdGhlIEh5cGVydHkgUnVudGltZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGV4ZWN1dGUgdGhlIFByb3RvY29sU3R1YlxuICAgICAqIEBwYXJhbSBoeXBlcnR5VHlwZVxuICAgICAqIEBwYXJhbSBkYXRhT2JqZWN0c1xuICAgICAqIEBwYXJhbSBpbnRlcndvcmtpbmdcbiAgICAgKiBAcGFyYW0gaWRwUHJveHlcbiAgICAgKiBAcGFyYW0gbXV0dWFsQXV0aGVudGljYXRpb25cbiAgICAgKiBAcmV0dXJucyB7UHJvdG9jb2xTdHViRGVzY3JpcHRvcn1cbiAgICAgKi9cbiAgICBjcmVhdGVQcm90b1N0dWJEZXNjcmlwdG9yT2JqZWN0KGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgbWVzc2FnZVNjaGVtYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLCBjb25zdHJhaW50cywgaHlwZXJ0eVR5cGUsIGRhdGFPYmplY3RzLCBpbnRlcndvcmtpbmcsIGlkcFByb3h5LCBtdXR1YWxBdXRoZW50aWNhdGlvbikge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIHZlcnNpb24gPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBvYmplY3ROYW1lID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIHNvdXJjZVBhY2thZ2VVUkwgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBtZXNzYWdlU2NoZW1hcyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIGNvbmZpZ3VyYXRpb24gPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBjb25zdHJhaW50cyA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3RvY29sU3R1YkRlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5QUk9UT1NUVUIsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIG1lc3NhZ2VTY2hlbWFzLCBjb25maWd1cmF0aW9uLCBjb25zdHJhaW50cywgaHlwZXJ0eVR5cGUsIGRhdGFPYmplY3RzLCBpbnRlcndvcmtpbmcsIGlkcFByb3h5LCBtdXR1YWxBdXRoZW50aWNhdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEh5cGVydHlSdW50aW1lRGVzY3JpcHRvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cbiAgICAgKiBAcGFyYW0ge1J1bnRpbWVUeXBlfXJ1bnRpbWVUeXBlXG4gICAgICogQHBhcmFtIHtSdW50aW1lSHlwZXJ0eUNhcGFiaWxpdGllc30gaHlwZXJ0eUNhcGFiaWxpdGllcyAtIFN1cHBvcnRlZCBjYXBhYmlsaXRpZXMgdG8gZXhlY3V0ZSBIeXBlcnRpZXNcbiAgICAgKiBAcGFyYW0ge1J1bnRpbWVQcm90b2NvbENhcGFiaWxpdGllc30gcHJvdG9jb2xDYXBhYmlsaXRpZXMgLSBTdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIHRvIGV4ZWN1dGUgUHJvdG9jb2wgU3R1YnNcbiAgICAgKiBAcGFyYW0gcDJwSGFuZGxlclN0dWJcbiAgICAgKiBAcGFyYW0gcDJwUmVxdWVzdGVyU3R1YlxuICAgICAqIEByZXR1cm5zIHtIeXBlcnR5UnVudGltZURlc2NyaXB0b3J9IHRoZSBkYXRhIG9iamVjdCBvZiB0aGUgSHlwZXJ0eSBSdW50aW1lIERlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBjcmVhdGVIeXBlcnR5UnVudGltZURlc2NyaXB0b3JPYmplY3QoZ3VpZCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lVHlwZSwgaHlwZXJ0eUNhcGFiaWxpdGllcywgcHJvdG9jb2xDYXBhYmlsaXRpZXMsIHAycEhhbmRsZXJTdHViLCBwMnBSZXF1ZXN0ZXJTdHViKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBndWlkID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2YgdmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIG9iamVjdE5hbWUgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBkZXNjcmlwdGlvbiA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIGxhbmd1YWdlID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlUGFja2FnZVVSTCA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIHJ1bnRpbWVUeXBlID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVycyFcIik7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX1JVTlRJTUUsIHZlcnNpb24sIG9iamVjdE5hbWUsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIHJ1bnRpbWVUeXBlLCBoeXBlcnR5Q2FwYWJpbGl0aWVzLCBwcm90b2NvbENhcGFiaWxpdGllcywgcDJwSGFuZGxlclN0dWIsIHAycFJlcXVlc3RlclN0dWIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBIeXBlcnR5IEludGVyY2VwdG9yIERlc2NyaXB0b3JcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCAtIENhdGFsb2d1ZSBHbG9iYWwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIENhdGFsb2d1ZSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3QgY2FuIGJlIGRvd25sb2FkZWQuXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBAcGFyYW0gcG9saWNpZXNcbiAgICAgKiBAcmV0dXJucyB7UG9saWN5RW5mb3JjZXJEZXNjcmlwdG9yfVxuICAgICAqL1xuICAgIGNyZWF0ZUh5cGVydHlJbnRlcmNlcHRvckRlc2NyaXB0b3JPYmplY3QoZ3VpZCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBjb25maWd1cmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWNpZXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVycyFcIik7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBIeXBlcnR5SW50ZXJjZXB0b3JEZXNjcmlwdG9yKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWV9JTlRFUkNFUFRPUiwgdmVyc2lvbiwgb2JqZWN0TmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgY29uZmlndXJhdGlvbiwgcG9saWNpZXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBEYXRhT2JqZWN0U2NoZW1hIHdoaWNoIGluIGVmZmVjdCBpcyB0aGUgTWVzc2FnZURhdGFPYmplY3RTY2hlbWFcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgZWl0aGVyIGNyZWF0ZU1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hIG9yIGNyZWF0ZUh5cGVydHlEYXRhT2JqZWN0U2NoZW1hIGluc3RlYWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCAtIENhdGFsb2d1ZSBHbG9iYWwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIENhdGFsb2d1ZSBPYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3QgY2FuIGJlIGRvd25sb2FkZWQuXG4gICAgICogQHJldHVybnMge0RhdGFPYmplY3RTY2hlbWF9XG4gICAgICovXG4gICAgY3JlYXRlRGF0YU9iamVjdFNjaGVtYShndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVycyFcIik7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhT2JqZWN0U2NoZW1hKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWV9EQVRBX09CSkVDVCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLFxuICAgICAgICAgICAgc291cmNlUGFja2FnZVVSTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIERhdGFPYmplY3RTY2hlbWEgd2hpY2ggaW4gZWZmZWN0IGlzIHRoZSBNZXNzYWdlRGF0YU9iamVjdFNjaGVtYVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cbiAgICAgKiBAcmV0dXJucyB7RGF0YU9iamVjdFNjaGVtYX1cbiAgICAgKi9cbiAgICBjcmVhdGVNZXNzYWdlRGF0YU9iamVjdFNjaGVtYShndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVycyFcIik7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhT2JqZWN0U2NoZW1hKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWV9EQVRBX09CSkVDVCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLFxuICAgICAgICAgICAgc291cmNlUGFja2FnZVVSTCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIEh5cGVydHlEYXRhT2JqZWN0U2NoZW1hXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSAtIEh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAgICAgKiBAcGFyYW0ge0RhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBQcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhY2thZ2VVUkwgLSBVUkwgZnJvbSB3aGVyZSB0aGUgc291cmNlIGNvZGUgcGFja2FnZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRhbG9ndWUgb2JqZWN0IGNhbiBiZSBkb3dubG9hZGVkLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY2Nlc3NDb250cm9sUG9saWN5IC0gcG9saWN5IHJ1bGUgdG8gYWNjZXNzIG9iamVjdCAoc2VlIFJlcG9ydGVyLU9ic2VydmVyIENvbW0gcGF0dGVybilcbiAgICAgKiBAcGFyYW0ge0RhdGFVcmxTY2hlbWV9IHNjaGVtZSAtIGlkZW50aWZpZXMgdGhlIGRhdGEgc2NoZW1lIChDT01NLCBDT05ORUNUSU9OLCBDVFhUIG9yIElERU5USVRZKVxuICAgICAqIEByZXR1cm5zIHtEYXRhT2JqZWN0U2NoZW1hfVxuICAgICAqL1xuICAgIGNyZWF0ZUh5cGVydHlEYXRhT2JqZWN0U2NoZW1hKGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NDb250cm9sUG9saWN5LCBzY2hlbWUpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc2NoZW1lID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2YgYWNjZXNzQ29udHJvbFBvbGljeSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xuXG4gICAgICAgIGlmIChzY2hlbWUgPT09IERhdGFVcmxTY2hlbWUuQ09NTSlcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbXVuaWNhdGlvbkRhdGFPYmplY3RTY2hlbWEoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0RBVEFfT0JKRUNULCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgc2NoZW1lLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1lID09PSBEYXRhVXJsU2NoZW1lLkNPTk5FQ1RJT04pXG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25EYXRhT2JqZWN0U2NoZW1hKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWV9EQVRBX09CSkVDVCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIHNjaGVtZSwgYWNjZXNzQ29udHJvbFBvbGljeSk7XG4gICAgICAgIGVsc2UgaWYgKHNjaGVtZSA9PT0gRGF0YVVybFNjaGVtZS5DVFhUKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250ZXh0RGF0YU9iamVjdFNjaGVtYShndWlkLCBDYXRhbG9ndWVPYmplY3RUeXBlLkhZUEVSVFlfREFUQV9PQkpFQ1QsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBzY2hlbWUsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xuICAgICAgICBlbHNlIGlmIChzY2hlbWUgPT09IERhdGFVcmxTY2hlbWUuSURFTlRJVFkpXG4gICAgICAgICAgICByZXR1cm4gbmV3IElkZW50aXR5RGF0YU9iamVjdFNjaGVtYShndWlkLCBDYXRhbG9ndWVPYmplY3RUeXBlLkhZUEVSVFlfREFUQV9PQkpFQ1QsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBzY2hlbWUsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBTb3VyY2VQYWNrYWdlXG4gICAgICogQHBhcmFtIHNvdXJjZUNvZGVDbGFzc25hbWUgLSBUaGUgQ2xhc3MtbmFtZSBvZiB0aGUgU291cmNlQ29kZVxuICAgICAqIEBwYXJhbSBzb3VyY2VDb2RlIC0gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XG4gICAgICogQHJldHVybnMge1NvdXJjZVBhY2thZ2V9XG4gICAgICovXG4gICAgY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VDb2RlQ2xhc3NuYW1lLCBzb3VyY2VDb2RlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBzb3VyY2VDb2RlID09PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlQ29kZUNsYXNzbmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xuXG4gICAgICAgIHJldHVybiBuZXcgU291cmNlUGFja2FnZShzb3VyY2VDb2RlQ2xhc3NuYW1lLCBzb3VyY2VDb2RlKTtcblxuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IENhdGFsb2d1ZURhdGFPYmplY3RGYWN0b3J5O1xuIiwiLy8gTG9nIFN5c3RlbVxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdSdW50aW1lQ2F0YWxvZ3VlJyk7XG5cbmltcG9ydCBDYXRhbG9ndWVGYWN0b3J5IGZyb20gJy4vQ2F0YWxvZ3VlRGF0YU9iamVjdEZhY3RvcnknO1xuXG5jbGFzcyBSdW50aW1lQ2F0YWxvZ3VlIHtcblxuICBjb25zdHJ1Y3RvcihydW50aW1lRmFjdG9yeSwgbmFtZSwgc2NoZW1hKSB7XG4gICAgaWYgKCFydW50aW1lRmFjdG9yeSkgdGhyb3cgRXJyb3IoJ1RoZSBjYXRhbG9ndWUgbmVlZHMgdGhlIHJ1bnRpbWVGYWN0b3J5Jyk7XG5cbiAgICB0aGlzLl9ydW50aW1lRmFjdG9yeSA9IHJ1bnRpbWVGYWN0b3J5O1xuXG4gICAgdGhpcy5fZmFjdG9yeSA9IG5ldyBDYXRhbG9ndWVGYWN0b3J5KCk7XG4gICAgdGhpcy5odHRwUmVxdWVzdCA9IHJ1bnRpbWVGYWN0b3J5LmNyZWF0ZUh0dHBSZXF1ZXN0KCk7XG4gICAgdGhpcy5hdG9iID0gcnVudGltZUZhY3RvcnkuYXRvYiA/IHJ1bnRpbWVGYWN0b3J5LmF0b2IgOiBhdG9iO1xuXG4gICAgY29uc3Qgc3RvcmFnZU5hbWUgPSBuYW1lID8gbmFtZSA6ICdydW50aW1lQ2F0YWxvZ3VlJztcbiAgICBjb25zdCBzdG9yYWdlU2NoZW1hID0gc2NoZW1hID8gc2NoZW1hIDogJyZjZ3VpZCwgYWNjZXNzQ29udHJvbFBvbGljeSwgY29uc3RyYWludHMsIGRhdGFPYmplY3RzLCB0eXBlLCBvYmplY3ROYW1lLCBzb3VyY2VQYWNrYWdlLCB2ZXJzaW9uLCB1cmwnO1xuXG4gICAgY29uc3Qgc2NoZW1hcyA9IHt9O1xuICAgIHNjaGVtYXNbc3RvcmFnZU5hbWVdID0gc3RvcmFnZVNjaGVtYTtcblxuICAgIHRoaXMuc3RvcmFnZU1hbmFnZXIgPSBydW50aW1lRmFjdG9yeS5zdG9yYWdlTWFuYWdlcihzdG9yYWdlTmFtZSwgc2NoZW1hcyk7XG5cbiAgfVxuXG4gIC8qKlxuICAgICAqIEdldCBhIENhdGFsb2d1ZSBEYXRhIE9iamVjdCAoRGVzY3JpcHRvcikgZnJvbSBhIFVSTCwgYW5kIGNvbnN0cnVjdCBpdCB1c2luZyB0aGUgcHJvdmlkZWQgZnVuY3Rpb25cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZGVzY3JpcHRvclVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL2h5cGVydHkvTXlIeXBlcnR5XG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY3JlYXRlRnVuYyAtIGUuZy4gY3JlYXRlSHlwZXJ0eVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dldEZ1bGxdIC0gd2hldGhlciBvciBub3QgdG8gZ2V0IGRlc2NyaXB0b3Igd2l0aCBzb3VyY2VQYWNrYWdlLCBvciBvbmx5IHRoZSBkZXNjcmlwdG9yIHBhcnRcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XG4gICAgICogQHJldHVybnMge1Byb21pc2V9IC0gUHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpdGggdGhlIHJlcXVlc3RlZCBkZXNjcmlwdG9yIGluIHRoZSBhcHByb3ByaWF0ZSB0eXBlLlxuICAgICAqIElmIGNvbnN0cmFpbnRzIHdlcmUgcHJvdmlkZWQsIGEgZGVzY3JpcHRvciBpcyBvbmx5IHJldHVybmVkIGlmIGl0IG1lZXRzIHRoZSBjb25zdHJhaW50cywgb3RoZXJ3aXNlIHRoZSBwcm9taXNlIHdpbGwgYmUgcmVqZWN0ZWQuXG4gICAgICovXG4gICAgZ2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yVVJMLCBjcmVhdGVGdW5jLCBnZXRGdWxsID0gdHJ1ZSwgY29uc3RyYWludHMpIHtcbiAgICAgIGxvZy5pbmZvKCdbUnVudGltZUNhdGFsb2d1ZV0gLSBnZXR0aW5nIGRlc2NyaXB0b3IgZnJvbTogJywgZGVzY3JpcHRvclVSTCwgJyB3aXRoIGNvbnN0cmFpbnRzOiAnLCBjb25zdHJhaW50cyk7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSAoKHJlc29sdmUsIHJlamVjdCk9PntcbiAgICAgICAgaWYgKHRoaXMuX3J1bnRpbWVGYWN0b3J5LmlzT25saW5lKCkgKSB7XG4gICAgICAgICAgICByZXNvbHZlKCB0aGlzLl9nZXREZXNjcmlwdG9yKGRlc2NyaXB0b3JVUkwsIGNyZWF0ZUZ1bmMsIGdldEZ1bGwsIGNvbnN0cmFpbnRzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdG9yYWdlTWFuYWdlci5nZXQoJ3VybCcsIGRlc2NyaXB0b3JVUkwpLnRoZW4oKGRlc2NyaXB0b3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbUnVudGltZUNhdGFsb2d1ZV0gc2F2ZWQgb2ZmbGluZSBkZXNjcmlwdG9yICcsIGRlc2NyaXB0b3IpO1xuXG4gICAgICAgICAgICBpZiAoZGVzY3JpcHRvcikgcmVzb2x2ZShjcmVhdGVGdW5jLmFwcGx5KHRoaXMsIFtkZXNjcmlwdG9yLCBjb25zdHJhaW50c10pKTtcbiAgICAgICAgICAgIGVsc2UgcmVzb2x2ZSggdGhpcy5fZ2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yVVJMLCBjcmVhdGVGdW5jLCBnZXRGdWxsLCBjb25zdHJhaW50cykpO1xuXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gXG4gIFxuICAgICAgfSk7XG5cbiAgICB9XG5cbiAgICBfZ2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yVVJMLCBjcmVhdGVGdW5jLCBnZXRGdWxsID0gdHJ1ZSwgY29uc3RyYWludHMpIHtcblxuICAgIC8vIHNvbWUgZmxhZ3MgZm9yIG9wdGltaXphdGlvblxuICAgIC8vIChsYXRlciB0aGUgZGVzY3JpcHRvciB3aWxsIG5vdCBiZSBzYXZlZCBpbiBjYXNlIGJvdGggb2YgdGhlc2UgYm9vbGVhbnMgYXJlIHRydWUpXG4gICAgbGV0IGlzU2F2ZWREZXNjcmlwdG9yID0gZmFsc2U7XG4gICAgbGV0IGlzQ29tcGxldGVEZXNjcmlwdG9yID0gZmFsc2U7XG5cbiAgICAvLyBnZXQgcmF3IGRlc2NyaXB0b3JcbiAgICAvLyBmaXJzdCBjaGVja3MgaWYgZGVzY3JpcHRvciBpcyBhbHJlYWR5IGluIGxvY2FsU3RvcmFnZSAoYmFzZWQgb24gY2d1aWQgYW5kIHZlcnNpb24pXG4gICAgbGV0IGRlc2NyaXB0b3JQcm9taXNlO1xuICAgIGlmIChjb25zdHJhaW50cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGRlc2NyaXB0b3JQcm9taXNlID0gUHJvbWlzZS5hbGwoW3RoaXMuaHR0cFJlcXVlc3QucG9zdChkZXNjcmlwdG9yVVJMICsgJy92ZXJzaW9uJywge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pLCB0aGlzLmh0dHBSZXF1ZXN0LnBvc3QoZGVzY3JpcHRvclVSTCArICcvY2d1aWQnLCB7Ym9keTogSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpfSldKVxuICAgIH0gZWxzZSB7XG4gICAgICBkZXNjcmlwdG9yUHJvbWlzZSA9IFByb21pc2UuYWxsKFt0aGlzLmh0dHBSZXF1ZXN0LmdldChkZXNjcmlwdG9yVVJMICsgJy92ZXJzaW9uJyksIHRoaXMuaHR0cFJlcXVlc3QuZ2V0KGRlc2NyaXB0b3JVUkwgKyAnL2NndWlkJyldKVxuICAgIH1cbiAgICBkZXNjcmlwdG9yUHJvbWlzZSA9IGRlc2NyaXB0b3JQcm9taXNlLnRoZW4oKFt2ZXJzaW9uLCBjZ3VpZF0pID0+IHtcbiAgICAgIGxvZy5sb2coJ1tSdW50aW1lQ2F0YWxvZ3VlLmdldERlc2NyaXB0b3JdIC0gZ290IHZlcnNpb24gKCcgKyB2ZXJzaW9uICsgJykgYW5kIGNndWlkICgnICsgY2d1aWQgKyAnKSBmb3IgZGVzY3JpcHRvciAnICsgZGVzY3JpcHRvclVSTCk7XG5cbiAgICAgIC8vIGNoZWNrIGlmIHNhbWUgdmVyc2lvbiBpcyBjb250YWluZWQgaW4gbG9jYWxTdG9yYWdlXG4gICAgICByZXR1cm4gdGhpcy5zdG9yYWdlTWFuYWdlci5nZXRWZXJzaW9uKCdjZ3VpZCcsIGNndWlkKS50aGVuKChkYlZlcnNpb24pID0+IHtcbiAgICAgICAgaWYgKGRiVmVyc2lvbiA+PSB2ZXJzaW9uKSB7XG4gICAgICAgICAgbG9nLmxvZygnW1J1bnRpbWVDYXRhbG9ndWUuZ2V0RGVzY3JpcHRvcl0gbG9jYWwgdmVyc2lvbiBpcyB1cGRhdGVkIGZvciAnLCBkZXNjcmlwdG9yVVJMKTtcbiAgICAgICAgICBpc1NhdmVkRGVzY3JpcHRvciA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdjZ3VpZCcsIGNndWlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cubG9nKCdbUnVudGltZUNhdGFsb2d1ZS5nZXREZXNjcmlwdG9yXSBsb2NhbCB2ZXJzaW9uIG5vdCB1cGRhdGVkIGZvciAnLCBkZXNjcmlwdG9yVVJMLCAnIHJldHJpZXZpbmcgZnJvbSByZW1vdGUgY2F0YWxvZ3VlIC4uLicpO1xuXG4gICAgICAgICAgLy8gbm8gc2F2ZWQgY29weSwgcHJvY2VlZCB3aXRoIHJldHJpZXZpbmcgZGVzY3JpcHRvclxuICAgICAgICAgIGxldCByZXRyaWV2ZVByb21pc2UgPSBjb25zdHJhaW50cyAhPSB1bmRlZmluZWQgPyB0aGlzLmh0dHBSZXF1ZXN0LnBvc3QoZGVzY3JpcHRvclVSTCwge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pIDogdGhpcy5odHRwUmVxdWVzdC5nZXQoZGVzY3JpcHRvclVSTCk7XG4gICAgICAgICAgcmV0dXJuIHJldHJpZXZlUHJvbWlzZS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XG4gICAgICAgICAgICBkZXNjcmlwdG9yID0gSlNPTi5wYXJzZShkZXNjcmlwdG9yKTtcblxuICAgICAgICAgICAgLy9sb2cubG9nKFwiZ290IGRlc2NyaXB0b3I6XCIsIEpTT04uc3RyaW5naWZ5KGRlc2NyaXB0b3IsIG51bGwsIDIpKTtcbiAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yWydFUlJPUiddKSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8gaGFuZGxlIGVycm9yIHByb3Blcmx5XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkZXNjcmlwdG9yKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgbGV0IGVycm9yU3RyaW5nID0gJ1VuYWJsZSB0byBnZXQgZGVzY3JpcHRvciBmb3IgJyArIGRlc2NyaXB0b3JVUkwgKyAoY29uc3RyYWludHMgIT0gdW5kZWZpbmVkID8gJyB3aXRoIGNvbnN0cmFpbnRzICcgKyBjb25zdHJhaW50cyA6ICcnKSArICc6ICcgKyBlcnJvcjtcbiAgICAgIGxvZy5lcnJvcihlcnJvclN0cmluZyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JTdHJpbmcpO1xuICAgIH0pO1xuXG4gICAgbGV0IHJldHVyblByb21pc2UgPSBkZXNjcmlwdG9yUHJvbWlzZTtcblxuICAgIC8vIGlmIGdldEZ1bGwsIGF0dGFjaCBzb3VyY2VQYWNrYWdlXG4gICAgaWYgKGdldEZ1bGwpIHtcbiAgICAgIGxvZy5sb2coJ2FkZGluZyBwcm9taXNlIHRvIGF0dGFjaCBzb3VyY2VQYWNrYWdlJyk7XG4gICAgICByZXR1cm5Qcm9taXNlID0gZGVzY3JpcHRvclByb21pc2UudGhlbigoZGVzY3JpcHRvcikgPT4ge1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlKSB7XG4gICAgICAgICAgaXNDb21wbGV0ZURlc2NyaXB0b3IgPSB0cnVlO1xuICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzQ29tcGxldGVEZXNjcmlwdG9yID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoUmF3U291cmNlUGFja2FnZShkZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBmaW5hbGx5IGNyZWF0ZSBvYmplY3RcbiAgICByZXR1cm5Qcm9taXNlID0gcmV0dXJuUHJvbWlzZS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XG4gICAgICAvLyBzdG9yZSBpZiBub3Qgc2F2ZWQgYmVmb3JlLCBvciBpZiBmdWxsIGRlc2NyaXB0b3Igd2FzIHJlcXVlc3RlZCBhbmQgb25seSBwYXJ0aWFsIGRlc2NyaXB0b3Igd2FzIHN0b3JlZC5cbiAgICAgIGlmICghaXNTYXZlZERlc2NyaXB0b3IgfHwgKGlzU2F2ZWREZXNjcmlwdG9yICYmICFpc0NvbXBsZXRlRGVzY3JpcHRvciAmJiBnZXRGdWxsKSkge1xuICAgICAgICBkZXNjcmlwdG9yLnVybCA9IGRlc2NyaXB0b3JVUkw7XG4gICAgICAgIHRoaXMuc3RvcmFnZU1hbmFnZXIuc2V0KGRlc2NyaXB0b3IuY2d1aWQsIGRlc2NyaXB0b3IudmVyc2lvbiwgZGVzY3JpcHRvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlRnVuYy5hcHBseSh0aGlzLCBbZGVzY3JpcHRvciwgY29uc3RyYWludHNdKTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXR1cm5Qcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAgICogVXNlcyB0aGUgc291cmNlUGFja2FnZVVSTCBmcm9tIHRoZSBkZXNjcmlwdG9yLCByZXF1ZXN0cyB0aGUgc291cmNlUGFja2FnZSBhbmQgYXR0YWNoZXMgaXQgdG8gdGhlIGRlc2NyaXB0b3IuXG4gICAgICogQHBhcmFtIHtDYXRhbG9ndWVEYXRhT2JqZWN0fSBkZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIHtKU09OfSBjb25zdHJhaW50cyAtIGNvbnN0cmFpbnRzIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSAtIGZ1bGZpbGxzIHdpdGggY29tcGxldGUgZGVzY3JpcHRvclxuICAgICAqL1xuICBhdHRhY2hSYXdTb3VyY2VQYWNrYWdlKGRlc2NyaXB0b3IsIGNvbnN0cmFpbnRzKSB7XG4gICAgbG9nLmxvZygnYXR0YWNoaW5nIHJhdyBzb3VyY2VQYWNrYWdlIGZyb206JywgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbGV0IHJldHJpZXZlUHJvbWlzZSA9IGNvbnN0cmFpbnRzICE9IHVuZGVmaW5lZCA/IHRoaXMuaHR0cFJlcXVlc3QucG9zdChkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2VVUkwsIHtib2R5OiBKU09OLnN0cmluZ2lmeShjb25zdHJhaW50cyl9KSA6IHRoaXMuaHR0cFJlcXVlc3QuZ2V0KGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCk7XG4gICAgICByZXRyaWV2ZVByb21pc2UudGhlbigoc291cmNlUGFja2FnZSkgPT4ge1xuICAgICAgICBzb3VyY2VQYWNrYWdlID0gSlNPTi5wYXJzZShzb3VyY2VQYWNrYWdlKTtcblxuICAgICAgICAvL2RlbGV0ZSBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2VVUkw7XG4gICAgICAgIC8vbG9nLmxvZyhcImF0dGFjaGluZyBzb3VyY2VQYWNrYWdlOlwiLCBzb3VyY2VQYWNrYWdlKTtcbiAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlID0gc291cmNlUGFja2FnZTtcbiAgICAgICAgcmVzb2x2ZShkZXNjcmlwdG9yKTtcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIEdldCBIeXBlcnR5RGVzY3JpcHRvclxuICAgICAqIEBwYXJhbSBoeXBlcnR5VVJMIC0gZS5nLiBteWRvbWFpbi5jb20vLndlbGwta25vd24vaHlwZXJ0eS9NeUh5cGVydHlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZXRGdWxsXSAtIGJvb2xlYW4gdG8gZGVjaWRlIHRvIGdldCB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZSBzb3VyY2VQYWNrYWdlIG9yIChwb3RlbnRpYWxseSkgd2l0aG91dFxuICAgICAqIEBwYXJhbSB7SlNPTn0gY29uc3RyYWludHMgLSBjb25zdHJhaW50cyBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgZ2V0SHlwZXJ0eURlc2NyaXB0b3IoaHlwZXJ0eVVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVzY3JpcHRvcihoeXBlcnR5VVJMLCB0aGlzLmNyZWF0ZUh5cGVydHksIGdldEZ1bGwsIGNvbnN0cmFpbnRzKVxuICB9XG5cbiAgLyoqXG4gICAgICogR2V0IFN0dWJEZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIHN0dWJVUkwgLSBlLmcuIG15ZG9tYWluLmNvbS8ud2VsbC1rbm93bi9wcm90b3N0dWIvTXlQcm90b3N0dWJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZXRGdWxsXSAtIGJvb2xlYW4gdG8gZGVjaWRlIHRvIGdldCB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZSBzb3VyY2VQYWNrYWdlIG9yIChwb3RlbnRpYWxseSkgd2l0aG91dFxuICAgICAqIEBwYXJhbSB7SlNPTn0gY29uc3RyYWludHMgLSBjb25zdHJhaW50cyBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgZ2V0U3R1YkRlc2NyaXB0b3Ioc3R1YlVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RGVzY3JpcHRvcihzdHViVVJMLCB0aGlzLmNyZWF0ZVN0dWIsIGdldEZ1bGwsIGNvbnN0cmFpbnRzKVxuICB9XG5cbiAgLyoqXG4gICAgICogR2V0IFJ1bnRpbWVEZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIHJ1bnRpbWVVUkwgLSBlLmcuIG15ZG9tYWluLmNvbS8ud2VsbC1rbm93bi9ydW50aW1lL015UnVudGltZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dldEZ1bGxdIC0gYm9vbGVhbiB0byBkZWNpZGUgdG8gZ2V0IHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIHNvdXJjZVBhY2thZ2Ugb3IgKHBvdGVudGlhbGx5KSB3aXRob3V0XG4gICAgICogQHBhcmFtIHtKU09OfSBjb25zdHJhaW50cyAtIGNvbnN0cmFpbnRzIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICBnZXRSdW50aW1lRGVzY3JpcHRvcihydW50aW1lVVJMLCBnZXRGdWxsID0gdHJ1ZSwgY29uc3RyYWludHMpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKHJ1bnRpbWVVUkwsIHRoaXMuY3JlYXRlUnVudGltZURlc2NyaXB0b3IsIGdldEZ1bGwsIGNvbnN0cmFpbnRzKVxuICB9XG5cbiAgLyoqXG4gICAgICogR2V0IERhdGFTY2hlbWFEZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIGRhdGFTY2hlbWFVUkwgLSBlLmcuIG15ZG9tYWluLmNvbS8ud2VsbC1rbm93bi9kYXRhc2NoZW1hL015RGF0YVNjaGVtYVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dldEZ1bGxdIC0gYm9vbGVhbiB0byBkZWNpZGUgdG8gZ2V0IHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIHNvdXJjZVBhY2thZ2Ugb3IgKHBvdGVudGlhbGx5KSB3aXRob3V0XG4gICAgICogQHBhcmFtIHtKU09OfSBjb25zdHJhaW50cyAtIGNvbnN0cmFpbnRzIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICBnZXREYXRhU2NoZW1hRGVzY3JpcHRvcihkYXRhU2NoZW1hVVJMLCBnZXRGdWxsID0gdHJ1ZSwgY29uc3RyYWludHMpIHtcblxuICAgIC8vICAgIHJldHVybiB0aGlzLmdldERlc2NyaXB0b3IoZGF0YVNjaGVtYVVSTCwgdGhpcy5jcmVhdGVEYXRhU2NoZW1hLCBnZXRGdWxsLCBjb25zdHJhaW50cylcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpPT4ge1xuICAgICAgbGV0IHNjaGVtYSA9IGRhdGFTY2hlbWFVUkwuc3BsaXQoJy9kYXRhc2NoZW1hLycpWzFdO1xuICAgICAgbG9nLmxvZygnW1J1bnRpbWVDYXRhbG9ndWUuZ2V0RGF0YVNjaGVtYURlc2NyaXB0b3JdIHNjaGVtYSAnLCBzY2hlbWEpO1xuICAgICAgbGV0IGRlc2NyaXB0b3IgPSB7XG4gICAgICAgIHNvdXJjZVBhY2thZ2U6IHtcbiAgICAgICAgICBzb3VyY2VDb2RlOiB7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgLy8gICAgICBsZXQgc2NoZW1lID0gcHJvcGVydGllcy5zY2hlbWUgPyBwcm9wZXJ0aWVzLnNjaGVtZS5jbyA6IFtdO1xuICBcbiAgICAgIHN3aXRjaCAoc2NoZW1hKSB7XG4gICAgICAgIGNhc2UgJ0NvbnRleHQnOlxuICAgICAgICBjYXNlICdDb250ZXh0UmVwb3J0ZXInOlxuICAgICAgICBjYXNlICdDb250ZXh0T2JzZXJ2ZXInOlxuICAgICAgICAgIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlLnByb3BlcnRpZXMuc2NoZW1lID0gJ2NvbnRleHQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdDb25uZWN0aW9uJzpcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLnNjaGVtZSA9ICdjb25uZWN0aW9uJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnV2FsbGV0RGF0YSc6XG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5zY2hlbWUgPSAnd2FsbGV0RGF0YSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0NvbW11bmljYXRpb24nOlxuICAgICAgICAgIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlLnByb3BlcnRpZXMuc2NoZW1lID0gJ2NvbW0nO1xuICAgICAgICAgIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlLnByb3BlcnRpZXMuY2hpbGRyZW5zID0gWydyZXNvdXJjZXMnXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnSGVsbG9Xb3JsZERhdGFTY2hlbWEnOlxuICAgICAgICAgIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlLnByb3BlcnRpZXMuc2NoZW1lID0gJ2hlbGxvJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLnNjaGVtZSA9ICdyZXNvdXJjZSc7XG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5jaGlsZHJlbnMgPSBbXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoZGVzY3JpcHRvcik7XG5cbiAgICB9KTtcblxuXG4gIH1cblxuICAvKipcbiAgICAgKiBHZXQgSURQUHJveHlEZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIGlkcFByb3h5VVJMIC0gZS5nLiBteWRvbWFpbi5jb20vLndlbGwta25vd24vaWRwLXByb3h5L015UHJveHlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZXRGdWxsXSAtIGJvb2xlYW4gdG8gZGVjaWRlIHRvIGdldCB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZSBzb3VyY2VQYWNrYWdlIG9yIChwb3RlbnRpYWxseSkgd2l0aG91dFxuICAgICAqIEBwYXJhbSB7SlNPTn0gY29uc3RyYWludHMgLSBjb25zdHJhaW50cyBvYmplY3RcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgZ2V0SWRwUHJveHlEZXNjcmlwdG9yKGlkcFByb3h5VVJMLCBnZXRGdWxsID0gdHJ1ZSwgY29uc3RyYWludHMpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKGlkcFByb3h5VVJMLCB0aGlzLmNyZWF0ZUlkcFByb3h5LCBnZXRGdWxsLCBjb25zdHJhaW50cylcbiAgfVxuXG4gIC8qKlxuICAgICAqIENyZWF0ZSBIeXBlcnR5RGVzY3JpcHRvciBiYXNlZCBvbiByYXcgb2JqZWN0IHRoYXQgY29udGFpbnMgaXRzIGF0dHJpYnV0ZXNcbiAgICAgKiBAcGFyYW0ge0pTT059IHJhd0h5cGVydHlcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eURlc2NyaXB0b3J9XG4gICAgICovXG4gIGNyZWF0ZUh5cGVydHkocmF3SHlwZXJ0eSkge1xuICAgIC8vbG9nLmxvZyhcImNyZWF0ZUh5cGVydHk6XCIsIHJhd0h5cGVydHkpO1xuICAgIC8vIGNyZWF0ZSB0aGUgZGVzY3JpcHRvclxuICAgIGxldCBoeXBlcnR5ID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVIeXBlcnR5RGVzY3JpcHRvck9iamVjdChcbiAgICAgIHJhd0h5cGVydHlbJ2NndWlkJ10sXG4gICAgICByYXdIeXBlcnR5Wyd2ZXJzaW9uJ10sXG4gICAgICByYXdIeXBlcnR5WydvYmplY3ROYW1lJ10sXG4gICAgICByYXdIeXBlcnR5WydkZXNjcmlwdGlvbiddLFxuICAgICAgcmF3SHlwZXJ0eVsnbGFuZ3VhZ2UnXSxcbiAgICAgIHJhd0h5cGVydHlbJ3NvdXJjZVBhY2thZ2VVUkwnXSxcbiAgICAgIHJhd0h5cGVydHlbJ3R5cGUnXSB8fCByYXdIeXBlcnR5WydoeXBlcnR5VHlwZSddLFxuICAgICAgcmF3SHlwZXJ0eVsnZGF0YU9iamVjdHMnXVxuICAgICk7XG5cbiAgICAvL2xvZy5sb2coXCJmYWN0b3J5IHJldHVybmVkOlwiLCBoeXBlcnR5KTtcblxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xuICAgIGh5cGVydHkuY29uZmlndXJhdGlvbiA9IHJhd0h5cGVydHlbJ2NvbmZpZ3VyYXRpb24nXTtcbiAgICBoeXBlcnR5LmNvbnN0cmFpbnRzID0gcmF3SHlwZXJ0eVsnY29uc3RyYWludHMnXTtcbiAgICBoeXBlcnR5Lm1lc3NhZ2VTY2hlbWEgPSByYXdIeXBlcnR5WydtZXNzYWdlU2NoZW1hJ107XG4gICAgaHlwZXJ0eS5wb2xpY2llcyA9IHJhd0h5cGVydHlbJ3BvbGljaWVzJ107XG4gICAgaHlwZXJ0eS5zaWduYXR1cmUgPSByYXdIeXBlcnR5WydzaWduYXR1cmUnXTtcblxuICAgIC8vIHBhcnNlIGFuZCBhdHRhY2ggc291cmNlUGFja2FnZVxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gcmF3SHlwZXJ0eVsnc291cmNlUGFja2FnZSddO1xuICAgIGlmIChzb3VyY2VQYWNrYWdlKSB7XG4gICAgICBoeXBlcnR5LnNvdXJjZVBhY2thZ2UgPSB0aGlzLmNyZWF0ZVNvdXJjZVBhY2thZ2Uoc291cmNlUGFja2FnZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh5cGVydHk7XG4gIH1cblxuICAvKipcbiAgICAgKiBDcmVhdGUgUHJvdG9jb2xTdHViRGVzY3JpcHRvciBiYXNlZCBvbiByYXcgb2JqZWN0IHRoYXQgY29udGFpbnMgaXRzIGF0dHJpYnV0ZXNcbiAgICAgKiBAcGFyYW0gcmF3U3R1YlxuICAgICAqIEByZXR1cm5zIHtQcm90b2NvbFN0dWJEZXNjcmlwdG9yfVxuICAgICAqL1xuICBjcmVhdGVTdHViKHJhd1N0dWIpIHtcbiAgICAvLyBsb2cubG9nKFwiY3JlYXRpbmcgc3R1YiBkZXNjcmlwdG9yIGJhc2VkIG9uOiBcIiwgcmF3U3R1Yik7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGRlc2NyaXB0b3JcbiAgICBsZXQgc3R1YiA9IHRoaXMuX2ZhY3RvcnkuY3JlYXRlUHJvdG9TdHViRGVzY3JpcHRvck9iamVjdChcbiAgICAgIHJhd1N0dWJbJ2NndWlkJ10sXG4gICAgICByYXdTdHViWyd2ZXJzaW9uJ10sXG4gICAgICByYXdTdHViWydvYmplY3ROYW1lJ10sXG4gICAgICByYXdTdHViWydkZXNjcmlwdGlvbiddLFxuICAgICAgcmF3U3R1YlsnbGFuZ3VhZ2UnXSxcbiAgICAgIHJhd1N0dWJbJ3NvdXJjZVBhY2thZ2VVUkwnXSxcbiAgICAgIHJhd1N0dWJbJ21lc3NhZ2VTY2hlbWFzJ10sXG4gICAgICByYXdTdHViWydjb25maWd1cmF0aW9uJ10sXG4gICAgICByYXdTdHViWydjb25zdHJhaW50cyddLFxuICAgICAgcmF3U3R1YlsnaHlwZXJ0eVR5cGUnXSxcbiAgICAgIHJhd1N0dWJbJ2RhdGFPYmplY3RzJ10sXG4gICAgICByYXdTdHViWydpbnRlcndvcmtpbmcnXSxcbiAgICAgIHJhd1N0dWJbJ2lkcFByb3h5J10sXG4gICAgICByYXdTdHViWydtdXR1YWxBdXRoZW50aWNhdGlvbiddXG4gICAgKTtcblxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xuICAgIHN0dWIuc2lnbmF0dXJlID0gcmF3U3R1Ylsnc2lnbmF0dXJlJ107XG5cbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHRoZSBzb3VyY2VQYWNrYWdlXG4gICAgbGV0IHNvdXJjZVBhY2thZ2UgPSByYXdTdHViWydzb3VyY2VQYWNrYWdlJ107XG4gICAgaWYgKHNvdXJjZVBhY2thZ2UpIHtcbiAgICAgIHN0dWIuc291cmNlUGFja2FnZSA9IHRoaXMuY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VQYWNrYWdlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3R1YjtcbiAgfVxuXG4gIC8qKlxuICAgICAqIENyZWF0ZSBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IgYmFzZWQgb24gcmF3IG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0cyBhdHRyaWJ1dGVzXG4gICAgICogQHBhcmFtIHJhd1J1bnRpbWVcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yfVxuICAgICAqL1xuICBjcmVhdGVSdW50aW1lRGVzY3JpcHRvcihyYXdSdW50aW1lKSB7XG4gICAgLy8gcGFyc2UgY2FwYWJpbGl0aWVzIGZpcnN0XG4gICAgdHJ5IHtcbiAgICAgIHJhd1J1bnRpbWVbJ2h5cGVydHlDYXBhYmlsaXRpZXMnXSA9IEpTT04ucGFyc2UocmF3UnVudGltZVsnaHlwZXJ0eUNhcGFiaWxpdGllcyddKTtcbiAgICAgIHJhd1J1bnRpbWVbJ3Byb3RvY29sQ2FwYWJpbGl0aWVzJ10gPSBKU09OLnBhcnNlKHJhd1J1bnRpbWVbJ3Byb3RvY29sQ2FwYWJpbGl0aWVzJ10pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGFscmVhZHkganNvbiBvYmplY3RcbiAgICB9XG5cbiAgICAvL2xvZy5sb2coXCJjcmVhdGluZyBydW50aW1lIGRlc2NyaXB0b3IgYmFzZWQgb246IFwiLCByYXdSdW50aW1lKTtcblxuXG4gICAgLy8gY3JlYXRlIHRoZSBkZXNjcmlwdG9yXG4gICAgbGV0IHJ1bnRpbWUgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZUh5cGVydHlSdW50aW1lRGVzY3JpcHRvck9iamVjdChcbiAgICAgIHJhd1J1bnRpbWVbJ2NndWlkJ10sXG4gICAgICByYXdSdW50aW1lWyd2ZXJzaW9uJ10sXG4gICAgICByYXdSdW50aW1lWydvYmplY3ROYW1lJ10sXG4gICAgICByYXdSdW50aW1lWydkZXNjcmlwdGlvbiddLFxuICAgICAgcmF3UnVudGltZVsnbGFuZ3VhZ2UnXSxcbiAgICAgIHJhd1J1bnRpbWVbJ3NvdXJjZVBhY2thZ2VVUkwnXSxcbiAgICAgIHJhd1J1bnRpbWVbJ3R5cGUnXSB8fCByYXdSdW50aW1lWydydW50aW1lVHlwZSddLFxuICAgICAgcmF3UnVudGltZVsnaHlwZXJ0eUNhcGFiaWxpdGllcyddLFxuICAgICAgcmF3UnVudGltZVsncHJvdG9jb2xDYXBhYmlsaXRpZXMnXSxcbiAgICAgIHJhd1J1bnRpbWVbJ3AycEhhbmRsZXJTdHViJ10sXG4gICAgICByYXdSdW50aW1lWydwMnBSZXF1ZXN0ZXJTdHViJ11cbiAgICApO1xuXG4gICAgLy8gb3B0aW9uYWwgZmllbGRzXG4gICAgcnVudGltZS5zaWduYXR1cmUgPSByYXdSdW50aW1lWydzaWduYXR1cmUnXTtcblxuICAgIC8vIHBhcnNlIGFuZCBhdHRhY2ggc291cmNlUGFja2FnZVxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gcmF3UnVudGltZVsnc291cmNlUGFja2FnZSddO1xuICAgIGlmIChzb3VyY2VQYWNrYWdlKSB7XG4gICAgICAvLyBsb2cubG9nKFwicnVudGltZSBoYXMgc291cmNlUGFja2FnZTpcIiwgc291cmNlUGFja2FnZSk7XG4gICAgICBydW50aW1lLnNvdXJjZVBhY2thZ2UgPSB0aGlzLmNyZWF0ZVNvdXJjZVBhY2thZ2Uoc291cmNlUGFja2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBydW50aW1lO1xuICB9XG5cbiAgLyoqXG4gICAgICogQ3JlYXRlIERhdGFPYmplY3RTY2hlbWEgYmFzZWQgb24gcmF3IG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0cyBhdHRyaWJ1dGVzXG4gICAgICogQHBhcmFtIHJhd1NjaGVtYVxuICAgICAqIEByZXR1cm5zIHtEYXRhT2JqZWN0U2NoZW1hfVxuICAgICAqL1xuICBjcmVhdGVEYXRhU2NoZW1hKHJhd1NjaGVtYSkge1xuICAgIC8vbG9nLmxvZyhcImNyZWF0aW5nIGRhdGFTY2hlbWEgYmFzZWQgb246IFwiLCByYXdTY2hlbWEpO1xuXG4gICAgbGV0IGRhdGFTY2hlbWE7XG5cbiAgICAvL2xvZy5sb2coJzEuIGNyZWF0ZU1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hOiAnLCByYXdTY2hlbWFbXCJhY2Nlc3NDb250cm9sUG9saWN5XCJdKTtcbiAgICAvL2xvZy5sb2coJzIuIGNyZWF0ZU1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hOiAnLCByYXdTY2hlbWFbXCJzY2hlbWVcIl0pO1xuICAgIGlmIChyYXdTY2hlbWFbJ2FjY2Vzc0NvbnRyb2xQb2xpY3knXSAmJiByYXdTY2hlbWFbJ3NjaGVtZSddKSB7XG4gICAgICBkYXRhU2NoZW1hID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVIeXBlcnR5RGF0YU9iamVjdFNjaGVtYShcbiAgICAgICAgcmF3U2NoZW1hWydjZ3VpZCddLFxuICAgICAgICByYXdTY2hlbWFbJ3ZlcnNpb24nXSxcbiAgICAgICAgcmF3U2NoZW1hWydvYmplY3ROYW1lJ10sXG4gICAgICAgIHJhd1NjaGVtYVsnZGVzY3JpcHRpb24nXSxcbiAgICAgICAgcmF3U2NoZW1hWydsYW5ndWFnZSddLFxuICAgICAgICByYXdTY2hlbWFbJ3NvdXJjZVBhY2thZ2VVUkwnXSxcbiAgICAgICAgcmF3U2NoZW1hWydhY2Nlc3NDb250cm9sUG9saWN5J10sXG4gICAgICAgIHJhd1NjaGVtYVsnc2NoZW1lJ11cbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgLy9sb2cubG9nKCczLiBjcmVhdGVNZXNzYWdlRGF0YU9iamVjdFNjaGVtYTogJywgcmF3U2NoZW1hKTtcbiAgICAgIGRhdGFTY2hlbWEgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZU1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hKFxuICAgICAgICByYXdTY2hlbWFbJ2NndWlkJ10sXG4gICAgICAgIHJhd1NjaGVtYVsndmVyc2lvbiddLFxuICAgICAgICByYXdTY2hlbWFbJ29iamVjdE5hbWUnXSxcbiAgICAgICAgcmF3U2NoZW1hWydkZXNjcmlwdGlvbiddLFxuICAgICAgICByYXdTY2hlbWFbJ2xhbmd1YWdlJ10sXG4gICAgICAgIHJhd1NjaGVtYVsnc291cmNlUGFja2FnZVVSTCddXG4gICAgICApXG4gICAgfVxuXG4gICAgLy8gb3B0aW9uYWwgZmllbGRzXG4gICAgZGF0YVNjaGVtYS5zaWduYXR1cmUgPSByYXdTY2hlbWFbJ3NpZ25hdHVyZSddO1xuXG4gICAgLy8gcGFyc2UgYW5kIGF0dGFjaCBzb3VyY2VQYWNrYWdlXG4gICAgbGV0IHNvdXJjZVBhY2thZ2UgPSByYXdTY2hlbWFbJ3NvdXJjZVBhY2thZ2UnXTtcbiAgICBpZiAoc291cmNlUGFja2FnZSkge1xuICAgICAgLy9sb2cubG9nKFwiZGF0YVNjaGVtYSBoYXMgc291cmNlUGFja2FnZTpcIiwgc291cmNlUGFja2FnZSk7XG4gICAgICBkYXRhU2NoZW1hLnNvdXJjZVBhY2thZ2UgPSB0aGlzLmNyZWF0ZVNvdXJjZVBhY2thZ2Uoc291cmNlUGFja2FnZSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGFTY2hlbWEuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlID0gSlNPTi5wYXJzZShkYXRhU2NoZW1hLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZy5sb2coJ0RhdGFTY2hlbWEgU291cmNlIGNvZGUgaXMgYWxyZWFkeSBwYXJzZWQnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGFTY2hlbWE7XG5cbiAgICB9XG5cbiAgICAvL2xvZy5sb2coXCJjcmVhdGVkIGRhdGFTY2hlbWEgZGVzY3JpcHRvciBvYmplY3Q6XCIsIGRhdGFTY2hlbWEpO1xuICAgIHJldHVybiBkYXRhU2NoZW1hO1xuICB9XG5cbiAgLyoqXG4gICAgICogQ3JlYXRlIFByb3RvY29sU3R1YkRlc2NyaXB0b3IgYmFzZWQgb24gcmF3IG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0cyBhdHRyaWJ1dGVzXG4gICAgICogQHBhcmFtIHJhd1Byb3h5XG4gICAgICogQHJldHVybnMge1Byb3RvY29sU3R1YkRlc2NyaXB0b3J9XG4gICAgICovXG4gIGNyZWF0ZUlkcFByb3h5KHJhd1Byb3h5KSB7XG4gICAgLy8gbG9nLmxvZyhcImNyZWF0aW5nIGlkcHByb3h5IGRlc2NyaXB0b3IgYmFzZWQgb246IFwiLCByYXdQcm94eSk7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGRlc2NyaXB0b3JcbiAgICBsZXQgaWRwcHJveHkgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZVByb3RvU3R1YkRlc2NyaXB0b3JPYmplY3QoXG4gICAgICByYXdQcm94eVsnY2d1aWQnXSxcbiAgICAgIHJhd1Byb3h5Wyd2ZXJzaW9uJ10sXG4gICAgICByYXdQcm94eVsnb2JqZWN0TmFtZSddLFxuICAgICAgcmF3UHJveHlbJ2Rlc2NyaXB0aW9uJ10sXG4gICAgICByYXdQcm94eVsnbGFuZ3VhZ2UnXSxcbiAgICAgIHJhd1Byb3h5Wydzb3VyY2VQYWNrYWdlVVJMJ10sXG4gICAgICByYXdQcm94eVsnbWVzc2FnZVNjaGVtYXMnXSxcbiAgICAgIHJhd1Byb3h5Wydjb25maWd1cmF0aW9uJ10sXG4gICAgICByYXdQcm94eVsnY29uc3RyYWludHMnXSxcbiAgICAgIHJhd1Byb3h5WydoeXBlcnR5VHlwZSddLFxuICAgICAgcmF3UHJveHlbJ2RhdGFPYmplY3RzJ10sXG4gICAgICByYXdQcm94eVsnaW50ZXJ3b3JraW5nJ10sXG4gICAgICByYXdQcm94eVsnaWRwUHJveHknXSxcbiAgICAgIHJhd1Byb3h5WydtdXR1YWxBdXRoZW50aWNhdGlvbiddXG4gICAgKTtcblxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xuICAgIGlkcHByb3h5LnNpZ25hdHVyZSA9IHJhd1Byb3h5WydzaWduYXR1cmUnXTtcblxuICAgIC8vIHBhcnNlIGFuZCBhdHRhY2ggdGhlIHNvdXJjZVBhY2thZ2VcbiAgICBsZXQgc291cmNlUGFja2FnZSA9IHJhd1Byb3h5Wydzb3VyY2VQYWNrYWdlJ107XG4gICAgaWYgKHNvdXJjZVBhY2thZ2UpIHtcbiAgICAgIHNvdXJjZVBhY2thZ2UgPSB0aGlzLmNyZWF0ZVNvdXJjZVBhY2thZ2Uoc291cmNlUGFja2FnZSk7XG4gICAgICBpZHBwcm94eS5zb3VyY2VQYWNrYWdlID0gc291cmNlUGFja2FnZTtcbiAgICB9XG5cbiAgICByZXR1cm4gaWRwcHJveHk7XG4gIH1cblxuICBjcmVhdGVTb3VyY2VQYWNrYWdlKHNwKSB7XG4gICAgLy9sb2cubG9nKFwiY3JlYXRlU291cmNlUGFja2FnZTpcIiwgc3ApO1xuXG4gICAgLy8gY2hlY2sgZW5jb2RpbmdcbiAgICBpZiAoc3BbJ2VuY29kaW5nJ10gPT09ICdiYXNlNjQnKSB7XG4gICAgICBzcFsnc291cmNlQ29kZSddID0gdGhpcy5hdG9iKHNwWydzb3VyY2VDb2RlJ10pO1xuICAgICAgc3BbJ2VuY29kaW5nJ10gPSAndXRmLTgnO1xuICAgIH1cblxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVTb3VyY2VQYWNrYWdlKHNwWydzb3VyY2VDb2RlQ2xhc3NuYW1lJ10sIHNwWydzb3VyY2VDb2RlJ10pO1xuICAgIGlmIChzcFsnZW5jb2RpbmcnXSlcbiAgICAgIHNvdXJjZVBhY2thZ2UuZW5jb2RpbmcgPSBzcFsnZW5jb2RpbmcnXTtcblxuICAgIGlmIChzcFsnc2lnbmF0dXJlJ10pXG4gICAgICBzb3VyY2VQYWNrYWdlLnNpZ25hdHVyZSA9IHNwWydzaWduYXR1cmUnXTtcblxuICAgIHJldHVybiBzb3VyY2VQYWNrYWdlO1xuICB9XG5cbiAgLyoqXG4gICAgICogR2V0IHNvdXJjZSBQYWNrYWdlIGZyb20gYSBVUkxcbiAgICAgKiBAcGFyYW0gc291cmNlUGFja2FnZVVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL2h5cGVydHkvTXlIeXBlcnR5L3NvdXJjZVBhY2thZ2VcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICAgKi9cbiAgZ2V0U291cmNlUGFja2FnZUZyb21VUkwoc291cmNlUGFja2FnZVVSTCkge1xuICAgIGxvZy5sb2coJ2dldHRpbmcgc291cmNlUGFja2FnZSBmcm9tOicsIHNvdXJjZVBhY2thZ2VVUkwpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuaHR0cFJlcXVlc3QuZ2V0KHNvdXJjZVBhY2thZ2VVUkwpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAvL2xvZy5sb2coXCJnb3QgcmF3IHNvdXJjZVBhY2thZ2U6XCIsIHJlc3VsdCk7XG4gICAgICAgIGlmIChyZXN1bHRbJ0VSUk9SJ10pIHtcbiAgICAgICAgICAvLyBUT0RPIGhhbmRsZSBlcnJvciBwcm9wZXJseVxuICAgICAgICAgIHJlamVjdChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgICBsZXQgc291cmNlUGFja2FnZSA9IHRoaXMuY3JlYXRlU291cmNlUGFja2FnZShyZXN1bHQpO1xuICAgICAgICAgIHJlc29sdmUoc291cmNlUGFja2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2VDb2RlIG9mIGEgZ2l2ZW4gZGVzY3JpcHRvclxuICAgICAqIEBwYXJhbSB7Q2F0YWxvZ3VlRGF0YU9iamVjdH0gZGVzY3JpcHRvciAtIENhdGFsb2d1ZSBPYmplY3QgdGhhdCB3YXMgcmV0cmlldmVkIHVzaW5nIGUuZy4gZ2V0SHlwZXJ0eURlc2NyaXB0b3IoKVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgICAqL1xuICBnZXRTb3VyY2VDb2RlRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlKSB7XG4gICAgICAgIC8vbG9nLmxvZyhcImRlc2NyaXB0b3IgaGFzIHNvdXJjZVBhY2thZ2VcIik7XG4gICAgICAgIC8vbG9nLmxvZyhcInJldHVybmluZyBzb3VyY2VDb2RlOlwiLCBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZSk7XG4gICAgICAgIHJlc29sdmUoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdG9yYWdlTWFuYWdlci5nZXRWZXJzaW9uKGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCArICcvc291cmNlQ29kZScpLnRoZW4oKGRiVmVyc2lvbikgPT4ge1xuICAgICAgICAgIGlmIChkYlZlcnNpb24gPj0gZGVzY3JpcHRvci52ZXJzaW9uKSB7XG4gICAgICAgICAgICBsb2cubG9nKCdyZXR1cm5pbmcgY2FjaGVkIHZlcnNpb24gZnJvbSBzdG9yYWdlTWFuYWdlcicpO1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlTWFuYWdlci5nZXQoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMICsgJy9zb3VyY2VDb2RlJykudGhlbigoc291cmNlQ29kZSkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKHNvdXJjZUNvZGUpO1xuICAgICAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmh0dHBSZXF1ZXN0LmdldChkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2VVUkwgKyAnL3NvdXJjZUNvZGUnKS50aGVuKChzb3VyY2VDb2RlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzb3VyY2VDb2RlWydFUlJPUiddKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBoYW5kbGUgZXJyb3IgcHJvcGVybHlcbiAgICAgICAgICAgICAgICByZWplY3Qoc291cmNlQ29kZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMICsgJy9zb3VyY2VDb2RlJywgZGVzY3JpcHRvci52ZXJzaW9uLCBzb3VyY2VDb2RlKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHNvdXJjZUNvZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY2F0YWxvZ3VlIG9iamVjdHMgZm9yIHRoZSBnaXZlbiBcInR5cGUgVVJMXCIsXG4gICAgICogaS5lLiBhIGNhdGFsb2d1ZSBVUkwgdGhhdCBzcGVjaWZpZXMgYSB0eXBlLCBidXQgbm8gY2F0YWxvZ3VlIG9iamVjdCBuYW1lLlxuICAgICAqIEBwYXJhbSB0eXBlVVJMIC0gVVJMIHBvaW50aW5nIHRvIHRoZSBjYXRhbG9ndWUgb2JqZWN0IHR5cGUgeW91IHdhbnQgYSBsaXN0IG9mIGF2YWlsYWJsZSBvYmplY3RzIGZvcixcbiAgICAgKiBlLmcuIGh5cGVydHktY2F0YWxvZ3VlOi8vY2F0YWxvZ3VlLmZva3VzLmZyYXVuaG9mZXIuZGUvLndlbGwta25vd24vaWRwLXByb3h5XG4gICAgICogQHBhcmFtIHtKU09OfSBjb25zdHJhaW50cyAtIGNvbnN0cmFpbnRzIG9iamVjdFxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSB0eXBlTGlzdFByb21pc2UgLSBQcm9taXNlIHRoYXQgZnVsZmlsbHMgd2l0aCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY2F0YWxvZ3VlIG9iamVjdCBuYW1lcyBmb3IgdGhlIHJlcXVlc3RlZCB0eXBlLFxuICAgICAqIHJlamVjdHMgb24gSFRUUCBlcnJvciBvciBpZiB0aGUgSFRUUCByZXNwb25zZSBpcyBub3QgaW4gSlNPTi5cbiAgICAgKiBJZiBjb25zdHJhaW50cyB3ZXJlIHByb3ZpZGVkLCB0aGVuIHRoZSBsaXN0IG9ubHkgY29udGFpbnMgdGhvc2Ugb2JqZWN0cyB0aGF0IG1lZXQgdGhlIGNvbnN0cmFpbnRzXG4gICAgICovXG4gIGdldFR5cGVMaXN0KHR5cGVVUkwsIGNvbnN0cmFpbnRzKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCByZXF1ZXN0UHJvbWlzZSA9IGNvbnN0cmFpbnRzICE9IHVuZGVmaW5lZCA/IHRoaXMuaHR0cFJlcXVlc3QucG9zdCh0eXBlVVJMLCB7Ym9keTogSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpfSkgOiB0aGlzLmh0dHBSZXF1ZXN0LmdldCh0eXBlVVJMKTtcbiAgICAgIHJlcXVlc3RQcm9taXNlLnRoZW4oKHR5cGVMaXN0KSA9PiB7XG4gICAgICAgIHR5cGVMaXN0ID0gSlNPTi5wYXJzZSh0eXBlTGlzdCk7XG4gICAgICAgIHJlc29sdmUodHlwZUxpc3QpO1xuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xuICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0IHJ1bnRpbWVVUkwocnVudGltZVVSTCkge1xuICAgIHRoaXMuX3J1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xuICB9XG5cbiAgZ2V0IHJ1bnRpbWVVUkwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3J1bnRpbWVVUkw7XG4gIH1cblxuICBkZWxldGVGcm9tUE0odXJsKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZGVsZXRlKHVybCk7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBSdW50aW1lQ2F0YWxvZ3VlO1xuIiwiLyoqXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXG4qXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4qXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4qXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqL1xuXG5cbmltcG9ydCB7IGxvZyBhcyBsb2dMZXZlbHMgfSBmcm9tICcuLi9sb2dMZXZlbHMnO1xuXG4vLyBMb2cgU3lzdGVtXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1J1bnRpbWVVQScpO1xuXG4vL01haW4gZGVwZW5kZWNpZXNcbmltcG9ydCBSZWdpc3RyeSBmcm9tICcuLi9yZWdpc3RyeS9SZWdpc3RyeSc7XG5pbXBvcnQgSWRlbnRpdHlNb2R1bGUgZnJvbSAnLi4vaWRlbnRpdHkvSWRlbnRpdHlNb2R1bGUnO1xuaW1wb3J0IElkZW50aXR5SGFuZGxlciBmcm9tICcuLi9pZGVudGl0eS9JZGVudGl0eUhhbmRsZXInO1xuaW1wb3J0IFBFUCBmcm9tICcuLi9wb2xpY3kvUEVQJztcbmltcG9ydCBNZXNzYWdlQnVzIGZyb20gJy4uL2J1cy9NZXNzYWdlQnVzJztcbmltcG9ydCB7IGdlbmVyYXRlR1VJRCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBBZGRyZXNzQWxsb2NhdGlvbiBmcm9tICcuLi9hbGxvY2F0aW9uL0FkZHJlc3NBbGxvY2F0aW9uJztcbmltcG9ydCBjcnlwdG9NYW5hZ2VyIGZyb20gJy4uL2NyeXB0b01hbmFnZXIvQ3J5cHRvTWFuYWdlcic7XG5cbmltcG9ydCBMb2FkZXIgZnJvbSAnLi9Mb2FkZXInO1xuaW1wb3J0IHsgc3RvcmFnZSB9IGZyb20gJy4vU3RvcmFnZSc7XG5pbXBvcnQgRGVzY3JpcHRvcnMgZnJvbSAnLi9EZXNjcmlwdG9ycyc7XG5cbmltcG9ydCB7IHJ1bnRpbWVDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9ydW50aW1lQ29uZmlndXJhdGlvbic7XG5pbXBvcnQgTXNnQnVzSGFuZGxlcnMgZnJvbSAnLi9Nc2dCdXNIYW5kbGVycyc7XG5pbXBvcnQgeyBydW50aW1lVXRpbHMgfSBmcm9tICcuL3J1bnRpbWVVdGlscyc7XG5cbi8vaW1wb3J0IEdyYXBoQ29ubmVjdG9yIGZyb20gJy4uL2dyYXBoY29ubmVjdG9yL0dyYXBoQ29ubmVjdG9yJztcblxuaW1wb3J0IENvcmVEaXNjb3ZlcnkgZnJvbSAnLi4vZGlzY292ZXJ5L0NvcmVEaXNjb3ZlcnknO1xuXG5pbXBvcnQgRGF0YU9iamVjdHNTdG9yYWdlIGZyb20gJy4uL3N0b3JlLW9iamVjdHMvRGF0YU9iamVjdHNTdG9yYWdlJztcbmltcG9ydCBIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZSBmcm9tICcuLi9oeXBlcnR5LXJlc291cmNlL0h5cGVydHlSZXNvdXJjZXNTdG9yYWdlJztcbmltcG9ydCBTeW5jaGVyTWFuYWdlciBmcm9tICcuLi9zeW5jaGVyL1N5bmNoZXJNYW5hZ2VyJztcbmltcG9ydCBTdWJzY3JpcHRpb25NYW5hZ2VyIGZyb20gJy4uL3N1YnNjcmlwdGlvbk1hbmFnZXIvU3Vic2NyaXB0aW9uTWFuYWdlcic7XG5pbXBvcnQgUnVudGltZUNvcmVDdHggZnJvbSAnLi4vcG9saWN5L2NvbnRleHQvUnVudGltZUNvcmVDdHgnO1xuaW1wb3J0IFJ1bnRpbWVDYXRhbG9ndWUgZnJvbSAnLi4vcnVudGltZS1jYXRhbG9ndWUvUnVudGltZUNhdGFsb2d1ZSc7XG5cbi8qKlxuICogUnVudGltZSBVc2VyIEFnZW50IEludGVyZmFjZSB3aWxsIHByb2Nlc3MgYWxsIHRoZSBkZXBlbmRlY2llcyBvZiB0aGUgY29yZSBydW50aW1lO1xuICogQGF1dGhvciBWaXRvciBTaWx2YSBbdml0b3ItdC1zaWx2YUB0ZWxlY29tLnB0XVxuICogQHZlcnNpb24gMC40LjBcbiAqXG4gKiBAcHJvcGVydHkge3J1bnRpbWVGYWN0b3J5fSBydW50aW1lRmFjdG9yeSAtIFNwZWNpZmljIGltcGxlbWVudGF0aW9uIGZvciBhbGwgZW52aXJvbm1lbnRzO1xuICogQHByb3BlcnR5IHtSdW50aW1lQ2F0YWxvZ3VlfSBydW50aW1lQ2F0YWxvZ3VlIC0gQ2F0YWxvZ3VlIG9mIGNvbXBvbmVudHMgY2FuIGJlIGluc3RhbGxlZDtcbiAqIEBwcm9wZXJ0eSB7cnVudGltZVVSTH0gcnVudGltZVVSTCAtIFRoaXMgaWRlbnRpZnkgdGhlIGNvcmUgcnVudGltZSwgc2hvdWxkIGJlIHVuaXF1ZTtcbiAqIEBwcm9wZXJ0eSB7SWRlbnRpdHlNb2R1bGV9IGlkZW50aXR5TW9kdWxlIC0gSWRlbnRpdHkgTW9kdWxlO1xuICogQHByb3BlcnR5IHtQRVB9IHBvbGljeUVuZ2luZSAtIFBvbGljeSBFbmdpbmUgTW9kdWxlO1xuICogQHByb3BlcnR5IHtSZWdpc3RyeX0gcmVnaXN0cnkgLSBSZWdpc3RyeSBNb2R1bGU7XG4gKiBAcHJvcGVydHkge01lc3NhZ2VCdXN9IG1lc3NhZ2VCdXMgLSBNZXNzYWdlIEJ1cyBpcyB1c2VkIGxpa2UgYSByb3V0ZXIgdG8gcmVkaXJlY3QgdGhlIG1lc3NhZ2VzIGZyb20gb25lIGNvbXBvbmVudCB0byBvdGhlcihzKVxuICogQHByb3BlcnR5IHtHcmFwaENvbm5lY3Rvcn0gZ3JhcGhDb25uZWN0b3IgLSBHcmFwaCBDb25uZWN0b3IgaGFuZGxpbmcgR1VJRCBhbmQgY29udGFjdHNcbiAqIEBwcm9wZXJ0eSB7Q29yZURpc2NvdmVyeX0gY29yZURpc2NvdmVyeSAtIERpc2NvdmVyeSBmb3IgZGlzY292ZXJ5IGh5cGVydGllcy9kYXRhT2JqZWN0c1xuICovXG5jbGFzcyBSdW50aW1lVUEge1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgUnVudGltZSBVc2VyIEFnZW50XG4gICAqIEBwYXJhbSB7ZGVzY3JpcHRvcn0gcnVudGltZURlc2NyaXB0b3IgLSBwYXNzIGFsbCB0aGUgaHlwZXJ0eSBydW50aW1lIGRlc2NyaXB0b3JcbiAgICogQHBhcmFtIHtydW50aW1lRmFjdG9yeX0gcnVudGltZUZhY3RvcnkgLSBTcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGVudmlyb25tZW50IHdoZXJlIHRoZSBjb3JlIHJ1bnRpbWUgd2lsbCBydW47XG4gICAqIEBwYXJhbSB7ZG9tYWlufSBkb21haW5VUkwgLSBzcGVjaWZ5IHRoZSBkb21haW4gYmFzZSBmb3IgdGhlIHJ1bnRpbWU7XG4gICAqL1xuICBjb25zdHJ1Y3RvcihydW50aW1lRGVzY3JpcHRvciwgcnVudGltZUZhY3RvcnksIGRvbWFpbikge1xuICAgIGlmICghcnVudGltZURlc2NyaXB0b3IpIHRocm93IG5ldyBFcnJvcignVGhlIHJ1bnRpbWUgZGVzY3JpcHRvciBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcbiAgICBpZiAoIXJ1bnRpbWVGYWN0b3J5KSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBzYW5kYm94IGZhY3RvcnkgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XG4gICAgaWYgKCFkb21haW4pIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdGhlIGRvbWFpbiBvZiBydW50aW1lJyk7XG5cbiAgICAvLyBDb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIHJlbGF0ZWQgd2l0aCBzZXJ2ZXJzXG4gICAgdGhpcy5ydW50aW1lQ29uZmlndXJhdGlvbiA9IE9iamVjdC5hc3NpZ24oeyBkb21haW46IGRvbWFpbiB9LCBydW50aW1lQ29uZmlndXJhdGlvbik7XG4gICAgdGhpcy5ydW50aW1lRmFjdG9yeSA9IHJ1bnRpbWVGYWN0b3J5O1xuXG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5sb2dMZXZlbHMgPSBsb2dMZXZlbHM7XG5cbiAgICBpZiAocnVudGltZURlc2NyaXB0b3IucDJwSGFuZGxlclN0dWIgJiYgdHlwZW9mIHJ1bnRpbWVEZXNjcmlwdG9yLnAycEhhbmRsZXJTdHViID09PSAnc3RyaW5nJyAmJiBydW50aW1lRGVzY3JpcHRvci5wMnBIYW5kbGVyU3R1Yi5pbmNsdWRlcygnOi8vJykpIHtcbiAgICAgIHRoaXMucDJwID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wMnAgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBydW50aW1lVXRpbHMucnVudGltZURlc2NyaXB0b3IgPSBydW50aW1lRGVzY3JpcHRvcjtcbiAgICB0aGlzLnJ1bnRpbWVVdGlscyA9IHJ1bnRpbWVVdGlscztcblxuICAgIHRoaXMuc3RvcmFnZXMgPSB7fTtcblxuLyogICAgaWYgKHR5cGVvZiBydW50aW1lRmFjdG9yeS5jcmVhdGVSdW50aW1lQ2F0YWxvZ3VlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnJ1bnRpbWVDYXRhbG9ndWUgPSBydW50aW1lRmFjdG9yeS5jcmVhdGVSdW50aW1lQ2F0YWxvZ3VlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hlY2sgeW91ciBSdW50aW1lIEZhY3RvcnkgYmVjYXVzZSBpdCBuZWVkcyB0aGUgUnVudGltZSBDYXRhbG9ndWUgaW1wbGVtZW50YXRpb24nKTtcbiAgICB9Ki9cblxuICAgIHRoaXMucnVudGltZUNhdGFsb2d1ZSA9IG5ldyBSdW50aW1lQ2F0YWxvZ3VlKHJ1bnRpbWVGYWN0b3J5KTtcblxuXG5cbi8qICAgIGlmICh0eXBlb2YgcnVudGltZUZhY3RvcnkucGVyc2lzdGVuY2VNYW5hZ2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnBlcnNpc3RlbmNlTWFuYWdlciA9IHJ1bnRpbWVGYWN0b3J5LnBlcnNpc3RlbmNlTWFuYWdlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NoZWNrIHlvdXIgUnVudGltZSBGYWN0b3J5IGJlY2F1c2UgaXQgbmVlZHMgdGhlIFBlcnNpc3RlbmNlIE1hbmFnZXIgaW1wbGVtZW50YXRpb24nKTtcbiAgICB9Ki9cblxuICAgIGlmICh0eXBlb2YgcnVudGltZUZhY3Rvcnkuc3RvcmFnZU1hbmFnZXIgPT09ICdmdW5jdGlvbicpIHtcblxuICAgICAgdGhpcy5zdG9yYWdlcyA9IHN0b3JhZ2UocnVudGltZUZhY3RvcnksIHRoaXMpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2hlY2sgeW91ciBSdW50aW1lIEZhY3RvcnkgYmVjYXVzZSBpdCBuZWVkcyB0aGUgU3RvcmFnZSBNYW5hZ2VyIGltcGxlbWVudGF0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBydW50aW1lRmFjdG9yeS5ydW50aW1lQ2FwYWJpbGl0aWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLnJ1bnRpbWVDYXBhYmlsaXRpZXMgPSBydW50aW1lRmFjdG9yeS5ydW50aW1lQ2FwYWJpbGl0aWVzKHRoaXMuc3RvcmFnZXMuY2FwYWJpbGl0aWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmluZm8oJ0NoZWNrIHlvdXIgUnVudGltZUZhY3RvcnkgYmVjYXVzZSBpdCBuZWVkcyB0aGUgUnVudGltZSBDYXBhYmlsaXRpZXMgaW1wbGVtZW50YXRpb24nKTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRpYWxpemUgdGhlIGluc3RhbGxhdGlvbiBvZiBydW50aW1lXG4gICAqXG4gICAqIEBhY2Nlc3MgcHVibGljXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Qm9vbGVhbiwgRXJyb3I+fSB0aGlzIGlzIFByb21pc2UgYW5kIGlmIHRoZSBpbnN0YWxsYXRpb24gcHJvY2VzcyBoYXBwZW5lZCB3aXRob3V0IGFueSBwcm9ibGVtcyByZXR1cm5zIHRydWUgb3RoZXJ3aXNlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQG1lbWJlck9mIFJ1bnRpbWVVQVxuICAgKi9cbiAgaW5pdChndWlkKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgdGhpcy5kb21haW4gPSB0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uLmRvbWFpbjtcblxuXG4gICAgICBsb2cuaW5mbygnW1J1bnRpbWVVQSAtIGluaXRdIFN0YXJ0aW5nICcpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgZ2V0Q2FwYWJpbGl0aWVzID0gdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzLmdldFJ1bnRpbWVDYXBhYmlsaXRpZXMoKTtcbiAgICAgICAgbGV0IGdldFJ1bnRpbWVVUkwgPSB0aGlzLnN0b3JhZ2VzLnJ1bnRpbWUuZ2V0KCdydW50aW1lOlVSTCcpO1xuICAgICAgICBsZXQgZ2V0U3RvcmVkRGF0YU9iamVjdHMgPSB0aGlzLnN0b3JhZ2VzLnN5bmNoZXJNYW5hZ2VyLmdldCgnc3luY2hlck1hbmFnZXI6T2JqZWN0VVJMcycpO1xuICAgICAgICBsZXQgZ2V0SHlwZXJ0eVN0b3JhZ2VPYmplY3RzID0gdGhpcy5zdG9yYWdlcy5oeXBlcnR5UmVzb3VyY2VzLmdldCgpO1xuICAgICAgICBsZXQgZ2V0UDJQSGFuZGxlclVSTCA9IHRoaXMuc3RvcmFnZXMucnVudGltZS5nZXQoJ3AycEhhbmRsZXI6VVJMJyk7XG4vLyAgICAgICAgbGV0IGdldFJlbW90ZXMgPSB0aGlzLnN0b3JhZ2VzLnN5bmNoZXJNYW5hZ2VyLmdldCgncmVtb3RlcycpO1xuXG4gICAgICAgIFByb21pc2UuYWxsKFtnZXRSdW50aW1lVVJMLCBnZXRDYXBhYmlsaXRpZXMsIGdldFN0b3JlZERhdGFPYmplY3RzLCBnZXRIeXBlcnR5U3RvcmFnZU9iamVjdHMsIGdldFAyUEhhbmRsZXJVUkxdKS50aGVuKChyZXN1bHRzKSA9PiB7XG5cbiAgICAgICAgICB0aGlzLnJ1bnRpbWVVUkwgPSByZXN1bHRzWzBdID8gcmVzdWx0c1swXS5ydW50aW1lVVJMIDogcmVzdWx0c1swXTtcbiAgICAgICAgICBpZiAoIXRoaXMucnVudGltZVVSTCkge1xuICAgICAgICAgICAgdGhpcy5ydW50aW1lVVJMID0gJ3J1bnRpbWU6Ly8nICsgdGhpcy5kb21haW4gKyAnLycgKyBnZW5lcmF0ZUdVSUQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZXMucnVudGltZS5zZXQoJ3J1bnRpbWU6VVJMJywgMSwgeyBydW50aW1lVVJMOiB0aGlzLnJ1bnRpbWVVUkwgfSk7XG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgICB0aGlzLmNhcGFiaWxpdGllcyA9IHJlc3VsdHNbMV07XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihydW50aW1lVXRpbHMucnVudGltZUNhcGFiaWxpdGllcy5jb25zdHJhaW50cywgcmVzdWx0c1sxXSk7XG5cbiAgICAgICAgICB0aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2UgPSBuZXcgRGF0YU9iamVjdHNTdG9yYWdlKHRoaXMuc3RvcmFnZXMuc3luY2hlck1hbmFnZXIsIHJlc3VsdHNbMl0gfHwge30sIHRoaXMucnVudGltZUZhY3RvcnksIHRoaXMgKTtcblxuICAgICAgICAgIHRoaXMuX2h5cGVydHlSZXNvdXJjZXMgPSByZXN1bHRzWzNdIHx8IHt9O1xuXG4gICAgICAgICAgdGhpcy5wMnBIYW5kbGVyVVJMID0gcmVzdWx0c1s0XSA/IHJlc3VsdHNbNF0ucDJwSGFuZGxlclVSTCA6IHJlc3VsdHNbNF07XG4gICAgICAgICAgaWYgKCF0aGlzLnAycEhhbmRsZXJVUkwpIHtcbiAgICAgICAgICAgIHRoaXMucDJwSGFuZGxlclVSTCA9IHRoaXMucnVudGltZVVSTCArICcvcDJwaGFuZGxlci8nICsgZ2VuZXJhdGVHVUlEKCk7XG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWVVQSAtIGluaXRdIFAyUEhhbmRsZXJVUkw6ICcsIHRoaXMucDJwSGFuZGxlclVSTCk7XG5cbiAgICAgICAgICAgIHRoaXMuc3RvcmFnZXMucnVudGltZS5zZXQoJ3AycEhhbmRsZXI6VVJMJywgMSwgeyBwMnBIYW5kbGVyVVJMOiB0aGlzLnAycEhhbmRsZXJVUkwgfSk7XG4gICAgICAgICAgfVxuXG4vKiAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWVVQSAtIGluaXRdIGRhdGFPYmplY3RzU3RvcmFnZSByZW1vdGUgbG9hZCBzdGFydGluZycpO1xuICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzU3RvcmFnZS5sb2FkUmVtb3RlKCkudGhlbigoKT0+IHtcbiAgICAgICAgICAgIGxvZy5pbmZvKCdbUnVudGltZVVBIC0gaW5pdF0gZGF0YU9iamVjdHNTdG9yYWdlIHJlbW90ZSBsb2FkIGNvbmNsdWRlZCcpOyovXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9hZENvbXBvbmVudHMoZ3VpZCk7XG5cbi8vICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgfSkudGhlbigoc3RhdHVzKSA9PiB7XG4gICAgICAgICAgdGhpcy5fc2V0TmV0d29ya1N0YXR1c0xpc3RlbmVycygpO1xuXG5cbiAgICAgICAgICB0aGlzLl9oeXBlcnR5UmVzb3VyY2VzU3RvcmFnZSA9IG5ldyBIeXBlcnR5UmVzb3VyY2VzU3RvcmFnZSh0aGlzLnJ1bnRpbWVVUkwsIHRoaXMubWVzc2FnZUJ1cywgdGhpcy5zdG9yYWdlcy5oeXBlcnR5UmVzb3VyY2VzLCB0aGlzLl9oeXBlcnR5UmVzb3VyY2VzKTtcblxuICAgICAgICAgIGlmICh0aGlzLnAycCkge1xuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lVUEgLSBpbml0XSBsb2FkIHAycEhhbmRsZXI6ICcsIHN0YXR1cyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFAyUEhhbmRsZXIoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nLmluZm8oJ1tSdW50aW1lVUEgLSBpbml0XSBQMlAgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgcmV0dXJuICgnUDJQIE5vdCBTdXBwb3J0ZWQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgbG9nLmluZm8oJ1tydW50aW1lIHVhIC0gaW5pdF0gLSBzdGF0dXM6ICcsIHJlc3VsdCk7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSwgKHJlYXNvbikgPT4ge1xuICAgICAgICAgIGxvZy5lcnJvcignRVJST1I6ICcsIHJlYXNvbik7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuXG4gICAgfSk7XG5cbiAgfVxuXG4gIF9zZXROZXR3b3JrU3RhdHVzTGlzdGVuZXJzKCkge1xuXG4gICAgdGhpcy5ydW50aW1lRmFjdG9yeS5saXN0ZW5PbmxpbmUoIHRoaXMuX3VwZGF0ZVJ1bnRpbWVTdGF0dXMoJ29ubGluZScpICk7XG4gICAgdGhpcy5ydW50aW1lRmFjdG9yeS5saXN0ZW5PZmZsaW5lKCB0aGlzLl91cGRhdGVSdW50aW1lU3RhdHVzKCdvZmZsaW5lJykgKTtcblxuICB9XG5cbiAgX3VwZGF0ZVJ1bnRpbWVTdGF0dXMoZXZlbnQpIHtcblxuICAgIGxldCBfdGhpcyA9IHRoaXM7XG5cbiAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKHtcbiAgICAgIGZyb206IHRoaXMucnVudGltZVVSTCxcbiAgICAgIHRvOiB0aGlzLnJ1bnRpbWVVUkwrJy9zdGF0dXMnLFxuICAgICAgdHlwZTogJ3VwZGF0ZScsXG4gICAgICBib2R5OiBldmVudFxuICAgIH0pO1xuICB9XG5cbiAgX2xvYWRQMlBIYW5kbGVyKCkge1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cbiAgICAgIGxldCBydW50aW1lRGVzY3JpcHRvciA9IHJ1bnRpbWVVdGlscy5ydW50aW1lRGVzY3JpcHRvcjtcbiAgICAgIGxldCBwMnBTdHViSGFuZGxlciA9IHJ1bnRpbWVEZXNjcmlwdG9yLnAycEhhbmRsZXJTdHViO1xuXG4gICAgICBsZXQgcDJwQ29uZmlnID0ge1xuICAgICAgICBpc0hhbmRsZXJTdHViOiB0cnVlLFxuICAgICAgICBydW50aW1lVVJMOiB0aGlzLnJ1bnRpbWVVUkxcbiAgICAgIH07XG5cbiAgICAgIGxvZy5sb2coJ1tSdW50aW1lVUEgbG9hZFAyUEhhbmRsZXJdIFAyUFN0dWJIYW5kbGVyOiAnLCBwMnBTdHViSGFuZGxlcik7XG5cbiAgICAgIHRoaXMubG9hZGVyLmxvYWRTdHViKHAycFN0dWJIYW5kbGVyLCBwMnBDb25maWcpLnRoZW4oKHJlc3VsdCkgPT4ge1xuXG4gICAgICAgIGxldCBydW50aW1lVUFVUkwgPSB0aGlzLnJ1bnRpbWVVUkwgKyAnL3VhJztcbiAgICAgICAgbGV0IG1zZyA9IHtcbiAgICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJyxcbiAgICAgICAgICBmcm9tOiBydW50aW1lVUFVUkwsXG4gICAgICAgICAgdG86ICdkb21haW46Ly9tc2ctbm9kZS4nICsgdGhpcy5kb21haW4gKyAnL3NtJyxcbiAgICAgICAgICBib2R5OiB7XG4gICAgICAgICAgICBzdWJzY3JpYmU6IFtyZXN1bHQudXJsXSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5ydW50aW1lVVJMXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubWVzc2FnZUJ1cy5hZGRMaXN0ZW5lcihydW50aW1lVUFVUkwsIChtc2cpID0+IHtcbiAgICAgICAgICBsb2cubG9nKCdbcnVudGltZSB1YSAtIGxpc3RlbmVyXSAtIHJlY2VpdmUgbXNnOiAnLCBtc2cpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcbiAgICAgICAgICBsb2cubG9nKCdbcnVudGltZSB1YSAtIHBvc3RNZXNzYWdlXSAtIHJlcGx5OiAnLCByZXBseSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxvZy5pbmZvKCdbcnVudGltZSB1YSAtIHAycCBpbnN0YWxsYXRpb25dIC0gc3VjY2VzczogJywgcmVzdWx0KTtcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcbiAgICAgICAgbG9nLmluZm8oJ1tydW50aW1lIHVhIC0gcDJwIGluc3RhbGxhdGlvbl0gLSBmYWlsOiAnLCByZWFzb24pO1xuICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAYWNjZXNzIHByaXZhdGVcbiAgICogQHJldHVybiB7UHJvbWlzZTxCb29sZWFuLCBFcnJvcj59IHRoaXMgaXMgUHJvbWlzZSBhbmQgcmV0dXJucyB0cnVlIGlmIGFsbCBjb21wb25lbnRzIGFyZSBsb2FkZWQgd2l0aCBzdWNjZXNzIG9yIGFuIGVycm9yIGlmIHNvbWVvbmUgZmFpbHMuXG4gICAqXG4gICAqIEBtZW1iZXJPZiBSdW50aW1lVUFcbiAgICovXG4gIF9sb2FkQ29tcG9uZW50cyhndWlkKSB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICB0cnkge1xuXG4gICAgICAgIC8vIFByZXBhcmUgdGhlIG9uIGluc3RhbmNlIHRvIGhhbmRsZSB3aXRoIHRoZSBmYWxsYmFja3MgYW5kIHJ1bnRpbWVDYXRhbG9ndWU7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRvckluc3RhbmNlID0gbmV3IERlc2NyaXB0b3JzKHRoaXMucnVudGltZVVSTCwgdGhpcy5ydW50aW1lQ2F0YWxvZ3VlLCB0aGlzLnJ1bnRpbWVDb25maWd1cmF0aW9uKTtcblxuICAgICAgICAvLyBQcmVwYXJlIHRoZSBsb2FkZXIgdG8gbG9hZCB0aGUgaHlwZXJ0aWVzLCBwcm90b3N0dWJzIGFuZCBpZHBwcm94eTtcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBuZXcgTG9hZGVyKHRoaXMucnVudGltZVVSTCwgdGhpcy5ydW50aW1lQ29uZmlndXJhdGlvbiwgdGhpcy5kZXNjcmlwdG9ySW5zdGFuY2UpO1xuXG4gICAgICAgIC8vIEluc3RhbnRpYXRlIHRoZSBpZGVudGl0eSBNb2R1bGVcbiAgICAgICAgdGhpcy5pZGVudGl0eU1vZHVsZSA9IG5ldyBJZGVudGl0eU1vZHVsZSh0aGlzLnJ1bnRpbWVVUkwsIHRoaXMucnVudGltZUNhcGFiaWxpdGllcywgdGhpcy5zdG9yYWdlcy5pZGVudGl0eSwgdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLCBjcnlwdG9NYW5hZ2VyLCB0aGlzLnJ1bnRpbWVDYXRhbG9ndWUpO1xuXG4gICAgICAgIC8vIFVzZSB0aGUgc2FuZGJveCBmYWN0b3J5IHRvIGNyZWF0ZSBhbiBBcHBTYW5kYm94O1xuICAgICAgICAvLyBJbiB0aGUgZnV0dXJlIGNhbiBiZSBkZWNpZGVkIGJ5IHBvbGljeUVuZ2luZSBpZiB3ZSBuZWVkXG4gICAgICAgIC8vIGNyZWF0ZSBhIEFwcFNhbmRib3ggb3Igbm90O1xuICAgICAgICBsZXQgYXBwU2FuZGJveCA9IHRoaXMucnVudGltZUZhY3RvcnkuY3JlYXRlQXBwU2FuZGJveCgpO1xuXG4gICAgICAgIC8vIEluc3RhbnRpYXRlIHRoZSBSZWdpc3RyeSBNb2R1bGVcbiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBSZWdpc3RyeSh0aGlzLnJ1bnRpbWVVUkwsIGFwcFNhbmRib3gsIHRoaXMuaWRlbnRpdHlNb2R1bGUsIHRoaXMucnVudGltZUNhdGFsb2d1ZSwgdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzLCB0aGlzLnN0b3JhZ2VzLnJlZ2lzdHJ5LCB0aGlzLnAycEhhbmRsZXJVUkwpO1xuXG4gICAgICAgIC8vIFNldCB0aGUgbG9hZGVyIHRvIGxvYWQgSHlwZXJ0aWVzLCBTdHVicyBhbmQgSWRwUHJveGllc1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5LmxvYWRlciA9IHRoaXMubG9hZGVyO1xuXG4gICAgICAgIC8vIEluc3RhbnRpYXRlIHRoZSBNZXNzYWdlIEJ1c1xuICAgICAgICB0aGlzLm1lc3NhZ2VCdXMgPSBuZXcgTWVzc2FnZUJ1cyh0aGlzLnJlZ2lzdHJ5KTtcblxuICAgICAgICAvLyBJbnN0YW5jaWF0ZSB0aGUgU3Vic2NyaXB0aW9uTWFuYWdlcjtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25NYW5hZ2VyID0gbmV3IFN1YnNjcmlwdGlvbk1hbmFnZXIodGhpcy5ydW50aW1lVVJMLCB0aGlzLm1lc3NhZ2VCdXMsIHRoaXMuc3RvcmFnZXMuc3Vic2NyaXB0aW9ucyk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSB0aGUgYWRkcmVzcyBhbGxvY2F0aW9uIGluc3RhbmNlO1xuICAgICAgICB0aGlzLmFkZHJlc3NBbGxvY2F0aW9uID0gbmV3IEFkZHJlc3NBbGxvY2F0aW9uKHRoaXMucnVudGltZVVSTCwgdGhpcy5tZXNzYWdlQnVzLCB0aGlzLnJlZ2lzdHJ5LCB0aGlzLnN1YnNjcmlwdGlvbk1hbmFnZXIpO1xuXG4gICAgICAgIC8vIEluc3RhbnRpYXRlIHRoZSBQb2xpY3kgRW5naW5lXG4gICAgICAgIHRoaXMucG9saWN5RW5naW5lID0gbmV3IFBFUChuZXcgUnVudGltZUNvcmVDdHgodGhpcy5ydW50aW1lVVJMLCB0aGlzLmlkZW50aXR5TW9kdWxlLCB0aGlzLnJlZ2lzdHJ5LCB0aGlzLnN0b3JhZ2VzLnBvbGljeSwgdGhpcy5ydW50aW1lQ2FwYWJpbGl0aWVzKSk7XG5cbiAgICAgICAgLy8gSW5zdGFudGlhdGUgRGlzY292ZXJ5XG4gICAgICAgIHRoaXMuY29yZURpc2NvdmVyeSA9IG5ldyBDb3JlRGlzY292ZXJ5KHRoaXMucnVudGltZVVSTCwgdGhpcy5tZXNzYWdlQnVzLCB0aGlzLmdyYXBoQ29ubmVjdG9yLCB0aGlzLnJ1bnRpbWVGYWN0b3J5LCB0aGlzLnJlZ2lzdHJ5KTtcblxuICAgICAgICAvLyBJbnN0YW50aWF0ZSB0aGUgaWRlbnRpdHlIYW5kbGVyXG4gICAgICAgIHRoaXMuaWRlbnRpdHlIYW5kbGVyID0gbmV3IElkZW50aXR5SGFuZGxlcih0aGlzLmlkZW50aXR5TW9kdWxlKTtcblxuICAgICAgICAvLyBpbml0aWFsaXNlIHRoZSBDcnlwdG9NYW5hZ2VyXG4gICAgICAgIGNyeXB0b01hbmFnZXIuaW5pdCh0aGlzLnJ1bnRpbWVVUkwsIHRoaXMucnVudGltZUNhcGFiaWxpdGllcywgdGhpcy5zdG9yYWdlcy5jcnlwdG9NYW5hZ2VyLCB0aGlzLl9kYXRhT2JqZWN0c1N0b3JhZ2UsIHRoaXMucmVnaXN0cnksIHRoaXMuY29yZURpc2NvdmVyeSwgdGhpcy5pZGVudGl0eU1vZHVsZSwgdGhpcy5ydW50aW1lRmFjdG9yeSk7XG5cbiAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIEdyYXBoIENvbm5lY3RvclxuLy8gICAgICAgIHRoaXMuZ3JhcGhDb25uZWN0b3IgPSBwcm9jZXNzLmVudi5NT0RFICE9PSAnbGlnaHQnID8gbmV3IEdyYXBoQ29ubmVjdG9yKHRoaXMucnVudGltZVVSTCwgdGhpcy5tZXNzYWdlQnVzLCB0aGlzLnN0b3JhZ2VNYW5hZ2VyKSA6IG51bGw7XG5cbiAgICAgICAgdGhpcy5oYW5kbGVycyA9IG5ldyBNc2dCdXNIYW5kbGVycyh0aGlzLnBvbGljeUVuZ2luZSwgdGhpcy5pZGVudGl0eUhhbmRsZXIsIGNyeXB0b01hbmFnZXIpO1xuXG4gICAgICAgIC8vICh1biljb21tZW50IGJlbGxvdyB0byBub3QgZW5jcnlwdCBtZXNzYWdlc1xuXG4gICAgICAgIHRoaXMubWVzc2FnZUJ1cy5waXBlbGluZU91dC5oYW5kbGVycyA9IFt0aGlzLmhhbmRsZXJzLmlkbUhhbmRsZXIsIHRoaXMuaGFuZGxlcnMucGVwT3V0SGFuZGxlcl07XG4gICAgICAgIHRoaXMubWVzc2FnZUJ1cy5waXBlbGluZUluLmhhbmRsZXJzID0gWyB0aGlzLmhhbmRsZXJzLnBlcEluSGFuZGxlcl07XG5cbiAgICAgICAgLy8gKHVuKWNvbW1lbnQgYmVsbG93IHRvIGVuY3J5cHQgbWVzc2FnZXNcblxuLy8gICAgICB0aGlzLm1lc3NhZ2VCdXMucGlwZWxpbmVPdXQuaGFuZGxlcnMgPSBbdGhpcy5oYW5kbGVycy5pZG1IYW5kbGVyLCB0aGlzLmhhbmRsZXJzLnBlcE91dEhhbmRsZXIsIHRoaXMuaGFuZGxlcnMuZW5jcnlwdEhhbmRsZXJdO1xuLy8gICAgICB0aGlzLm1lc3NhZ2VCdXMucGlwZWxpbmVJbi5oYW5kbGVycyA9IFt0aGlzLmhhbmRsZXJzLmRlY3J5cHRIYW5kbGVyLCB0aGlzLmhhbmRsZXJzLnBlcEluSGFuZGxlcl07XG5cbiAgICAgICAgLy8gQWRkIHRvIEFwcCBTYW5kYm94IHRoZSBsaXN0ZW5lcjtcbiAgICAgICAgYXBwU2FuZGJveC5hZGRMaXN0ZW5lcignKicsIChtc2cpID0+IHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY3J5cHRvTWFuYWdlci5tZXNzYWdlQnVzID0gdGhpcy5tZXNzYWdlQnVzO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIG1lc3NhZ2VCdXMgb24gUmVnaXN0cnlcbiAgICAgICAgdGhpcy5yZWdpc3RyeS5tZXNzYWdlQnVzID0gdGhpcy5tZXNzYWdlQnVzO1xuXG4gICAgICAgIC8vIFBvbGljeSBFbmdpbmVcbiAgICAgICAgdGhpcy5wb2xpY3lFbmdpbmUubWVzc2FnZUJ1cyA9IHRoaXMubWVzc2FnZUJ1cztcblxuICAgICAgICAvLyBSZWdpc3RlciBtZXNzYWdlQnVzIG9uIElETVxuICAgICAgICB0aGlzLmlkZW50aXR5TW9kdWxlLm1lc3NhZ2VCdXMgPSB0aGlzLm1lc3NhZ2VCdXM7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgcmVnaXN0cnkgb24gSWRlbnRpdHlNb2R1bGVcbiAgICAgICAgdGhpcy5pZGVudGl0eU1vZHVsZS5yZWdpc3RyeSA9IHRoaXMucmVnaXN0cnk7XG5cbiAgICAgICAgLy8gUmVnaXN0ZXIgY29yZURpc2NvdmVyeSBvbiBJZGVudGl0eU1vZHVsZVxuICAgICAgICB0aGlzLmlkZW50aXR5TW9kdWxlLmNvcmVEaXNjb3ZlcnkgPSB0aGlzLmNvcmVEaXNjb3Zlcnk7XG5cbiAgICAgICAgLy8gVXNlIHNhbmRib3ggZmFjdG9yeSB0byB1c2Ugc3BlY2lmaWMgbWV0aG9kc1xuICAgICAgICAvLyBhbmQgc2V0IHRoZSBtZXNzYWdlIGJ1cyB0byB0aGUgZmFjdG9yeVxuICAgICAgICB0aGlzLnJ1bnRpbWVGYWN0b3J5Lm1lc3NhZ2VCdXMgPSB0aGlzLm1lc3NhZ2VCdXM7XG5cbiAgICAgICAgLy8gSW5zdGFuY2lhdGUgdGhlIFN5bmNoZXJNYW5hZ2VyO1xuICAgICAgICB0aGlzLnN5bmNoZXJNYW5hZ2VyID0gbmV3IFN5bmNoZXJNYW5hZ2VyKHRoaXMucnVudGltZVVSTCwgdGhpcy5tZXNzYWdlQnVzLCB0aGlzLnJlZ2lzdHJ5LCB0aGlzLnJ1bnRpbWVDYXRhbG9ndWUsIHRoaXMuc3RvcmFnZXMuc3luY2hlck1hbmFnZXIsIG51bGwsIHRoaXMuX2RhdGFPYmplY3RzU3RvcmFnZSwgdGhpcy5pZGVudGl0eU1vZHVsZSk7XG5cblxuICAgICAgICAvLyBTZXQgaW50byBsb2FkZXIgdGhlIG5lZWRlZCBjb21wb25lbnRzO1xuICAgICAgICB0aGlzLmxvYWRlci5ydW50aW1lVVJMID0gdGhpcy5ydW50aW1lVVJMO1xuICAgICAgICB0aGlzLmxvYWRlci5tZXNzYWdlQnVzID0gdGhpcy5tZXNzYWdlQnVzO1xuICAgICAgICB0aGlzLmxvYWRlci5yZWdpc3RyeSA9IHRoaXMucmVnaXN0cnk7XG4gICAgICAgIHRoaXMubG9hZGVyLnJ1bnRpbWVDYXRhbG9ndWUgPSB0aGlzLnJ1bnRpbWVDYXRhbG9ndWU7XG4gICAgICAgIHRoaXMubG9hZGVyLnJ1bnRpbWVGYWN0b3J5ID0gdGhpcy5ydW50aW1lRmFjdG9yeTtcblxuICAgICAgICAvL0luc3RhbnRpYXRlIERpc2NvdmVyeSBMaWIgZm9yIG5vdGlmaWNhdGlvbiB0ZXN0aW5nXG4gICAgICAgIC8vIHRoaXMuZGlzY292ZXJ5ID0gbmV3IERpc2NvdmVyeShcImh5cGVydHk6Ly9sb2NhbGhvc3QvdGVzdFwiLCB0aGlzLnJ1bnRpbWVVUkwsIHRoaXMubWVzc2FnZUJ1cyk7XG4gICAgICAgIC8vIHRoaXMubG9hZFN0dWIoXCJsb2NhbGhvc3RcIik7XG4gICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyAgIHRoaXMuZGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0aWVzRE8oXCJ1c2VyOi8vZ29vZ2xlLmNvbS9vcGVuaWR0ZXN0MjBAZ21haWwuY29tXCIpXG4gICAgICAgIC8vICAgLnRoZW4oaHlwZXJ0aWVzID0+IHtcbiAgICAgICAgLy8gICAgIGh5cGVydGllcy5mb3JFYWNoKGh5cGVydHkgPT57XG4gICAgICAgIC8vICAgICAgIGh5cGVydHkub25MaXZlKCgpID0+IGxvZy5sb2coYE5vdGlmaWNhdGlvbiBmcm9tICR7aHlwZXJ0eS5kYXRhLmh5cGVydHlJRH0gY2hhbmdlZCB0byBsaXZlYCkpO1xuICAgICAgICAvLyAgICAgICBoeXBlcnR5Lm9uRGlzY29ubmVjdGVkKCgpID0+IGxvZy5sb2coYE5vdGlmaWNhdGlvbiBmcm9tICR7aHlwZXJ0eS5kYXRhLmh5cGVydHlJRH0gY2hhbmdlZCB0byBkaXNjb25uZWN0ZWRgKSk7XG4gICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgLy8gICB9KTtcbiAgICAgICAgLy8gfSwgMjAwMCk7XG5cblxuICAgICAgICAvLyB0aGlzLnN1YnNjcmlwdGlvbk1hbmFnZXIuaW5pdCgpLnRoZW4oKCk9PntcbiAgICAgICAgLy8gICByZXNvbHZlKHRydWUpO1xuICAgICAgICAvLyB9KTtcblxuICAgICAgICBjb25zdCBwcmVwYXJlQ29tcG9uZW50cyA9IFtdO1xuICAgICAgICBwcmVwYXJlQ29tcG9uZW50cy5wdXNoKHRoaXMuc3Vic2NyaXB0aW9uTWFuYWdlci5pbml0KCkpO1xuICAgICAgICBwcmVwYXJlQ29tcG9uZW50cy5wdXNoKHRoaXMuaWRlbnRpdHlNb2R1bGUuaW5pdChndWlkKSk7XG4gICAgICAgIHByZXBhcmVDb21wb25lbnRzLnB1c2goY3J5cHRvTWFuYWdlci5sb2FkU2Vzc2lvbktleXMoKSk7XG4gICAgICAgIHByZXBhcmVDb21wb25lbnRzLnB1c2godGhpcy5yZWdpc3RyeS5sb2FkUmVnaXN0cnkoKSk7XG4gICAgICAgIHByZXBhcmVDb21wb25lbnRzLnB1c2godGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLmxvYWRSZW1vdGUoKSk7XG5cbiAgICAgICAgUHJvbWlzZS5hbGwocHJlcGFyZUNvbXBvbmVudHMpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSA1KSB7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoJ1tSdW50aW1lVUEuX2xvYWRDb21wb25lbnRzXSBFcnJvciBdICcsIHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IocmVhc29uKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuXG4gICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXBsb3kgSHlwZXJ0eSBmcm9tIENhdGFsb2d1ZSBVUkxcbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L3NwZWNzL3RyZWUvbWFzdGVyL2RhdGFtb2RlbC9jb3JlL2FkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIHtVUkwuSHlwZXJ0eUNhdGFsb2d1ZVVSTH0gaHlwZXJ0eUNhdGFsb2d1ZVVSTCAtIFRoZSBDYXRhbG9ndWUgVVJMIHVzZWQgdG8gaWRlbnRpZnkgZGVzY3JpcHRvcnMgaW4gdGhlIENhdGFsb2d1ZS5cbiAgICogQHBhcmFtIHtib29sZWFufFVSTC5IeXBlcnR5VVJMfSBbcmV1c2VVUkw9ZmFsc2VdIHJldXNlVVJMIC0gcmV1c2VVUkwgaXMgdXNlZCB0byByZXVzZSB0aGUgaHlwZXJ0eVVSTCBwcmV2aW91c2x5IHJlZ2lzdHJlZCwgYnkgZGVmYXVsdCB0aGUgcmV1c2UgaXMgZGlzYWJsZWQ7XG4gICAqIEBwYXJhbSB7VVJMfSBhcHBVUkwgLSB0aGUgYXBwIHVybCBhZGRyZXNzOyAvLyBUT0RPOiBpbXByb3ZlIHRoaXMgZGVzY3JpcHRpb247XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEJvb2xlYW4sIEVycm9yPn0gdGhpcyBpcyBQcm9taXNlIGFuZCByZXR1cm5zIHRydWUgaWYgYWxsIGNvbXBvbmVudHMgYXJlIGxvYWRlZCB3aXRoIHN1Y2Nlc3Mgb3IgYW4gZXJyb3IgaWYgc29tZW9uZSBmYWlscy5cbiAgICpcbiAgICogQG1lbWJlck9mIFJ1bnRpbWVVQVxuICAgKi9cbiAgbG9hZEh5cGVydHkoaHlwZXJ0eUNhdGFsb2d1ZVVSTCwgcmV1c2VVUkwgPSBmYWxzZSwgYXBwVVJMKSB7XG5cbiAgICBpZiAoIWh5cGVydHlDYXRhbG9ndWVVUkwpIHRocm93IG5ldyBFcnJvcignSHlwZXJ0eSBkZXNjcmlwdG9yIHVybCBwYXJhbWV0ZXIgaXMgbmVlZGVkJyk7XG4gICAgcmV0dXJuIHRoaXMubG9hZGVyLmxvYWRIeXBlcnR5KGh5cGVydHlDYXRhbG9ndWVVUkwsIHJldXNlVVJMLCBhcHBVUkwpO1xuXG4gIH1cblxuICAvKipcbiAgKiBEZXBsb3kgU3R1YiBmcm9tIENhdGFsb2d1ZSBVUkwgb3IgZG9tYWluIHVybFxuICAqIEBwYXJhbSAge1VSTC5VUkx9ICAgICBkb21haW4gICAgICAgICAgZG9tYWluXG4gICovXG4gIGxvYWRTdHViKHByb3RvY29sc3R1YkNhdGFsb2d1ZVVSTCkge1xuXG4gICAgaWYgKCFwcm90b2NvbHN0dWJDYXRhbG9ndWVVUkwpIHRocm93IG5ldyBFcnJvcignUHJvdG9TdHViIGRlc2NyaXB0b3IgdXJsIHBhcmFtZXRlciBpcyBuZWVkZWQnKTtcbiAgICByZXR1cm4gdGhpcy5sb2FkZXIubG9hZFN0dWIocHJvdG9jb2xzdHViQ2F0YWxvZ3VlVVJMKTtcblxuICB9XG5cbiAgLyoqXG4gICogRGVwbG95IGlkcFByb3h5IGZyb20gQ2F0YWxvZ3VlIFVSTCBvciBkb21haW4gdXJsXG4gICogQHBhcmFtICB7VVJMLlVSTH0gICAgIGRvbWFpbiAgICAgICAgICBkb21haW5cbiAgKi9cbiAgbG9hZElkcFByb3h5KGlwZFByb3h5Q2F0YWxvZ3VlVVJMKSB7XG4gICAgbG9nLmxvZygnaXBkUHJveHlDYXRhbG9ndWVVUkwnLCBpcGRQcm94eUNhdGFsb2d1ZVVSTCk7XG5cbiAgICBpZiAoIWlwZFByb3h5Q2F0YWxvZ3VlVVJMKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBJRFAgUHJveHkgVVJMIGlzIGEgbmVlZGVkIHBhcmFtZXRlciwgY291bGQgYmUgYSBET01BSU4gb3IgYSBVUkwnKTtcbiAgICByZXR1cm4gdGhpcy5sb2FkZXIubG9hZElkcFByb3h5KGlwZFByb3h5Q2F0YWxvZ3VlVVJMKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGNsb3NlIGFsbCB0aGUgcnVudGltZTsgVW5yZWdpc3RlciBhbGwgaHlwZXJ0aWVzO1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPEJvb2xlYW4+fSByZXN1bHQgb2YgdGhlIGNsb3NlIG1ldGhvZCwgd2l0aCB0cnVlIG9yIGZhbHNlIHRvIHRoZSBvcGVyYXRpb24gc3VjY2VzcztcbiAgICovXG4gIGNsb3NlKGxvZ091dCkge1xuICAgIGNvbnNvbGUubG9nKCdSdW50aW1lIGNvcmUgbG9nb3V0OiAnLCBsb2dPdXQpO1xuICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgaWYgKGxvZ091dCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5pZGVudGl0eUhhbmRsZXIucmVzZXQoKTtcbiAgICB9XG5cbiAgICBsb2cuaW5mbygnVW5yZWdpc3RlciBhbGwgaHlwZXJ0aWVzJyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcblxuICAgICAgX3RoaXMucmVnaXN0cnkudW5yZWdpc3RlckFsbEh5cGVydGllcygpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICBsb2cuaW5mbygnQWxsIHRoZSBoeXBlcnRpZXMgYXJlIHVucmVnaXN0ZWQgd2l0aCBTdWNjZXNzOicsIHJlc3VsdCk7XG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIHVucmVnaXN0ZXIgdGhlIGh5cGVydGllcycsIHJlYXNvbik7XG4gICAgICAgIHJlamVjdChmYWxzZSk7XG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byByZXNldCB0aGUgcnVudGltZSBieSBkZWxldGluZyBhbGwgZGF0YSBmcm9tIHRoZSBzdG9yYWdlIG1hbmFnZXI7XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Qm9vbGVhbj59IHJlc3VsdCBvZiB0aGUgcmVzZXQgbWV0aG9kLCB3aXRoIHRydWUgb3IgZmFsc2UgdG8gdGhlIG9wZXJhdGlvbiBzdWNjZXNzO1xuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgY29uc29sZS5sb2coJ1J1bnRpbWVVQS5SdW50aW1lIGNvcmUgcmVzZXQ6ICcpO1xuXG4gICAgbGV0IHJlc2V0aW5nID0gW107XG4gICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvL1RPRE86IGRlbGVnYXRlIGRiIHJlc2V0IG9wZXJhdGlvbiB0byBlYWNoIGNvbXBvbmVudFxuICAgICAgLy8gICAgdGhpcy5pZGVudGl0eU1hbmFnZXIucmVzZXQoKTtcblxuICAgICAgdGhpcy5fZGF0YU9iamVjdHNTdG9yYWdlLmRlbGV0ZVJlbW90ZXMoKS50aGVuKCgpPT57XG4gICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICB9KS5cbiAgICAgIHRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnN0b3JhZ2VzLmlkZW50aXR5LmdldChmYWxzZSwgZmFsc2UsICdpZGVudGl0aWVzJykudGhlbigoaWRlbnRpdGllcykgPT4ge1xuICAgICAgICAgIGxldCBpZGVudGl0aWVzS2V5cyA9IE9iamVjdC5rZXlzKGlkZW50aXRpZXMpO1xuICBcbiAgICAgICAgICBpZGVudGl0aWVzS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIHJlc2V0aW5nLnB1c2godGhpcy5zdG9yYWdlcy5pZGVudGl0eS5kZWxldGUoa2V5LCBmYWxzZSwgJ2lkZW50aXRpZXMnKSk7XG4gIFxuICAgICAgICAgIH0pO1xuICBcbiAgICAgICAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMuY2FwYWJpbGl0aWVzLmRlbGV0ZSgnY2FwYWJpbGl0aWVzJykpO1xuICAgICAgICAgIHJlc2V0aW5nLnB1c2godGhpcy5zdG9yYWdlcy5jcnlwdG9NYW5hZ2VyLmRlbGV0ZSgndXNlckFzeW1tZXRyaWNLZXknKSk7XG4gICAgICAgICAgcmVzZXRpbmcucHVzaCh0aGlzLnN0b3JhZ2VzLmh5cGVydHlSZXNvdXJjZXMuZGVsZXRlKCdoeXBlcnR5UmVzb3VyY2VzJykpO1xuICAgICAgICAgIHJlc2V0aW5nLnB1c2godGhpcy5zdG9yYWdlcy5pZGVudGl0eS5kZWxldGUoJ2FjY2Vzc1Rva2VucycpKTtcbiAgICAgICAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMucmVnaXN0cnkuZGVsZXRlKCdyZWdpc3RyeTpEYXRhT2JqZWN0VVJMcycpKTtcbiAgICAgICAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMucmVnaXN0cnkuZGVsZXRlKCdyZWdpc3RyeTpIeXBlcnR5VVJMcycpKTtcbiAgICAgICAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMucnVudGltZS5kZWxldGUoJ3AycEhhbmRsZXI6VVJMJykpO1xuICAgICAgICAgIHJlc2V0aW5nLnB1c2godGhpcy5zdG9yYWdlcy5ydW50aW1lLmRlbGV0ZSgncnVudGltZTpVUkwnKSk7XG4gICAgICAgICAgLy8gICAgcmVzZXRpbmcucHVzaCh0aGlzLnN0b3JhZ2VzLnJ1bnRpbWVDYXRhbG9ndWUuZGVsZXRlKCdydW50aW1lQ2F0YWxvZ3VlJykpO1xuICAgICAgICAgIHJlc2V0aW5nLnB1c2godGhpcy5zdG9yYWdlcy5zdWJzY3JpcHRpb25zLmRlbGV0ZSgnc3Vic2NyaXB0aW9ucycpKTtcbiAgICAgICAgICByZXNldGluZy5wdXNoKHRoaXMuc3RvcmFnZXMuc3luY2hlck1hbmFnZXIuZGVsZXRlKCdzeW5jaGVyTWFuYWdlcjpPYmplY3RVUkxzJykpO1xuICAgICAgICAgIHJlc2V0aW5nLnB1c2godGhpcy5zdG9yYWdlcy5zeW5jaGVyTWFuYWdlci5kZWxldGUoJ3JlbW90ZXMnKSk7XG4gIFxuICAgICAgICAgIFByb21pc2UuYWxsKHJlc2V0aW5nKS50aGVuKChyZXN1bHQpID0+IHtcbiAgXG4gICAgICAgICAgICBsb2cuaW5mbygnW1J1bnRpbWVVQS5yZXNldF0gcmVzZXQgd2l0aCBTdWNjZXNzOicsIHJlc3VsdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byByZXNldCBhbGwgREJzJywgcmVhc29uKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG5cbiAgICB9KTtcblxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJ1bnRpbWVVQTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUZBOztBQ0FBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTs7Ozs7QUFLQTs7Ozs7Ozs7QUFRQTs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUVBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBU0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFFQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUMxa0JBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7QUFLQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7OztBQWxHQTtBQUFBO0FBQUE7Ozs7OztBQXNHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTs7Ozs7Ozs7QUMvSEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7O0FBR0E7QUFBQTs7OztBQUNBOzs7OztBQU1BOzs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBOzs7O0FBUUE7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUxBO0FBWUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTs7Ozs7Ozs7QUEwQ0E7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7O0FBeE9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQTZKQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFLQTtBQUFBO0FBQUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUFBO0FBQUE7QUFFQTs7Ozs7O0FBS0E7QUFBQTtBQUFBOzs7Ozs7QUFzQ0E7Ozs7Ozs7O0FDcFVBO0FBRUE7Ozs7O0FBSUE7OztBQUNBOzs7QUFJQTs7OztBQUlBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSkE7QUFVQTtBQUVBO0FBRUE7QUFqQkE7QUFxQkE7QUFDQTs7O0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBUUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUpBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBSkE7QUFVQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFKQTtBQVVBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7OztBQXJIQTtBQUNBO0FBR0E7Ozs7OztBQXVIQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDck9BOzs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBRUE7Ozs7Ozs7Ozs7O0FBWUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFSQTtBQVVBO0FBQ0E7Ozs7QUE0QkE7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBckJBO0FBd0JBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBOzs7QUFsT0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7OztBQW5EQTtBQUNBO0FBZ1FBOzs7Ozs7OztBQzdRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUtBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JKQTs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBRUE7Ozs7Ozs7Ozs7O0FBWUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQVFBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBWEE7QUFnQkE7QUFDQTtBQUFBOzs7Ozs7Ozs7O0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBSEE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBY0E7Ozs7OztBQU1BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyQkE7Ozs7O0FBTUE7QUFFQTs7O0FBbkRBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7QUF0SEE7QUFDQTtBQXFLQTs7Ozs7Ozs7QUNwTEE7Ozs7QUFLQTtBQUNBO0FBQ0E7OztBQUVBOzs7O0FBS0E7QUFBQTtBQUVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFFQTs7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7QUMzREE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUlBOzs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFpQkE7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTs7Ozs7O0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBOzs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFDQTtBQVNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQUNBO0FBU0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFxQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFMQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBQ0E7QUFTQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBN1pBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFJQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFJQTtBQUFBO0FBQUE7Ozs7OztBQW1ZQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNXdCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7O0FBSUE7Ozs7O0FBQ0E7Ozs7Ozs7O0FBU0E7Ozs7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFoQkE7QUFpQkE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUpBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7Ozs7Ozs7QUFRQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTs7OztBQURBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFHQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBTUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRkE7QUFJQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQTdEQTtBQUNBO0FBK0RBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBZEE7QUFDQTtBQWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7OztBQXFCQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBSUE7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFmQTtBQUNBO0FBaUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBOVZBO0FBQUE7QUFBQTs7O0FBd05BO0FBQ0E7QUFDQTtBQUFBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFwWkE7QUFBQTs7O0FBNmdCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDaGpCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBOzs7OztBQUlBOzs7OztBQUNBOzs7Ozs7QUFPQTs7OztBQUtBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQWpCQTtBQWlCQTtBQUVBOzs7Ozs7O0FBR0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBOzs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUxBO0FBQ0E7QUFXQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFPQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSkE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQXpUQTtBQUFBOzs7QUE0VEE7Ozs7Ozs7O0FDaFdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7Ozs7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTs7Ozs7QUFPQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBOzs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBUEE7QUFBQTtBQUFBOzs7Ozs7QUFVQTs7Ozs7Ozs7QUN6R0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBS0E7OztBQUNBOzs7Ozs7Ozs7Ozs7QUFlQTs7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBa0JBOzs7Ozs7Ozs7Ozs7QUFZQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7QUFXQTtBQUNBOzs7Ozs7Ozs7Ozs7QUFrQkE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBREE7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRkE7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUJBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUZBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFwQkE7QUFDQTtBQXNCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFyQkE7QUFDQTtBQXVCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVkE7QUFhQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTs7O0FBenVCQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUFBOzs7Ozs7QUFpdUJBOzs7Ozs7OztBQzMwQkE7OztBQUlBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUF6QkE7QUFDQTtBQTBCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFMQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBckJBO0FBQ0E7QUF1QkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQUNBOzs7Ozs7QUFHQTs7Ozs7Ozs7QUNwSUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFFQTs7Ozs7QUFJQTs7O0FBRUE7Ozs7Ozs7QUFPQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7OztBQ2hIQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7OztBQUlBOzs7QUFFQTs7Ozs7OztBQVFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBRUE7OztBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFTQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM05BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFFQTs7OztBQUdBOzs7Ozs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBSkE7QUFLQTtBQUtBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7OztBQXpDQTtBQUNBO0FBOENBOzs7Ozs7Ozs7Ozs7Ozs7O0FDNUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7QUFJQTs7O0FBRUE7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7O0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBRkE7QUFKQTtBQVlBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUZBO0FBSkE7QUFZQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBREE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFEQTtBQU1BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFJQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUlBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7QUFHQTs7Ozs7Ozs7QUN2K0JBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FBS0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7O0FDbkhBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTs7OztBQUlBOzs7Ozs7Ozs7O0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7O0FBS0E7Ozs7O0FBRUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBaENBO0FBaUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7O0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7Ozs7QUE1UkE7QUFDQTtBQStSQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3U0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7Ozs7O0FBSUE7Ozs7O0FBRUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBckNBO0FBc0NBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7Ozs7QUEvSUE7QUFDQTtBQW1KQTs7OztBQ3hMQTs7O0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBOzs7O0FDbkJBOzs7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUlBOztBQ3ZCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0NBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7Ozs7QUFNQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBOzs7O0FBS0E7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUdBOzs7QUE1SUE7QUFDQTtBQUNBOzs7Ozs7QUE4SUE7Ozs7Ozs7O0FDM0xBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBOzs7QUF5SEE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7QUFxQkE7QUFFQTtBQUVBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFEQTtBQUlBO0FBRUE7QUFDQTtBQURBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFPQTtBQUNBO0FBVkE7QUFhQTtBQUNBO0FBREE7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBUUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBWUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBTUE7Ozs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7QUF4bUJBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQWxCQTtBQW9CQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQWdCQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7OztBQXdkQTs7Ozs7O0FDenFCQTtBQUVBO0FBRUE7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQU1BOzs7Ozs7OztBQ2hCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBS0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBOzs7QUFVQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFyUEE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7Ozs7QUFtUEE7Ozs7Ozs7O0FDalZBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFJQTtBQUVBOzs7Ozs7O0FBd0hBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBcUJBO0FBRUE7QUFFQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBREE7QUFJQTtBQUVBO0FBQ0E7QUFEQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQU9BO0FBQ0E7QUFWQTtBQWFBO0FBQ0E7QUFEQTtBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFRQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7QUFNQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlEQTs7Ozs7OztBQU1BO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0NBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFHQTs7Ozs7O0FBTUE7Ozs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7QUExbUJBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFsQkE7QUFvQkE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFnQkE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7QUE4ZEE7Ozs7Ozs7O0FDOXFCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBS0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFHQTtBQUNBOzs7QUFpQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQUE7Ozs7Ozs7O0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBR0E7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQVVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFyTkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQTJNQTs7Ozs7Ozs7QUNqVEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBR0E7OztBQUNBOzs7QUFJQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBS0E7QUFDQTtBQUVBOzs7QUFQQTtBQUNBO0FBQ0E7Ozs7OztBQVlBOzs7Ozs7OztBQ3RIQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7Ozs7QUFJQTtBQUVBOzs7Ozs7QUFLQTs7O0FBQ0E7OztBQUlBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFGQTtBQUlBO0FBQ0E7QUFDQTs7O0FBR0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7Ozs7QUFJQTs7O0FBekZBO0FBQUE7QUFBQTs7Ozs7O0FBNEZBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUN6SkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFNQTs7O0FBQ0E7Ozs7OztBQVNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBTkE7QUFRQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFFQTs7Ozs7Ozs7OztBQVNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7O0FBTUE7QUFBQTtBQUFBOzs7Ozs7QUFJQTs7O0FBQ0E7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFHQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBbEJBO0FBQUE7QUFBQTs7Ozs7O0FBcUJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlVQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTtBQUVBOzs7Ozs7QUFLQTs7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQXZDQTtBQUNBO0FBMENBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTtBQUNBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBOzs7OztBQUlBOzs7OztBQUVBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBUEE7QUFTQTtBQUVBOzs7Ozs7Ozs7OztBQU9BO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBOzs7O0FBdEZBO0FBQ0E7QUF5RkE7Ozs7Ozs7O0FDMUhBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUVBOzs7O0FBR0E7OztBQUNBOzs7OztBQUtBOzs7OztBQUtBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFnQkE7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBRUE7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7QUFZQTtBQUVBOzs7O0FBOUpBOzs7O0FBSUE7QUFBQTtBQUFBOzs7QUFaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBbUtBOzs7Ozs7OztBQ3RPQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7Ozs7QUFJQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTtBQUVBOzs7OztBQUlBOzs7OztBQUVBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBWUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7Ozs7QUEzREE7QUFDQTtBQTZEQTs7Ozs7Ozs7QUMxRkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBOzs7O0FBR0E7OztBQUVBOzs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUZBO0FBRkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFHQTs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUpBO0FBQ0E7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBS0E7Ozs7Ozs7O0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFDQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFHQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUpBO0FBQ0E7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFJQTs7Ozs7Ozs7QUM5WEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUdBOzs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFOQTtBQVNBO0FBRUE7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSkE7QUFDQTtBQVdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBVEE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQ3JWQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUlBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNUNBOzs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7O0FBR0E7Ozs7QUFHQTs7O0FBRUE7Ozs7Ozs7OztBQVNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUE4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFkQTtBQWdCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBR0E7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7O0FBU0E7QUFDQTs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFHQTs7O0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBR0E7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOztBQUdBO0FBSUE7QUFFQTtBQUVBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFEQTtBQUlBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUlBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUpBO0FBQ0E7QUFTQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBREE7QUFJQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBVEE7QUFDQTtBQURBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBM0NBO0FBNkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQWwvQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTs7Ozs7O0FBNDZDQTs7QUN6bkRBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQURBO0FBcENBO0FBeUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUZBO0FBckJBO0FBMEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFOQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBaEdBOzs7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTs7Ozs7QUFJQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBNkNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7OztBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFsVkE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBRUE7QUFPQTtBQUNBO0FBRUE7OztBQVJBO0FBQ0E7QUFFQTtBQU9BO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7O0FBNlNBO0FBQ0E7QUFDQTtBQUFBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFHQTs7Ozs7O0FBR0E7Ozs7QUNoYUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBTUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7Ozs7QUMxREE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QkE7OztBQUVBOzs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFHQTtBQUNBO0FBQUE7QUFFQTs7Ozs7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFHQTs7Ozs7Ozs7QUF3REE7QUFDQTtBQUFBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUtBOzs7OztBQUtBOzs7Ozs7OztBQW1CQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFLQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7Ozs7O0FBSUE7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBOzs7Ozs7OztBQUtBO0FBQ0E7Ozs7QUFLQTtBQUNBO0FBQUE7Ozs7O0FBT0E7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBRUE7QUFFQTtBQUVBOzs7OztBQUlBOzs7Ozs7OztBQVVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBR0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7OztBQUdBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFKQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFLQTs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUpBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFPQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7OztBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQURBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUxBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFMQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBOzs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQWxpREE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQTRCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7QUFnOUNBOzs7Ozs7OztBQ3JvREE7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7O0FBY0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7Ozs7OztBQUtBOzs7Ozs7OztBQ2pHQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQU5BO0FBUUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDcEdBOzs7Ozs7Ozs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDN0NBO0FBRUE7Ozs7Ozs7O0FBT0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDM0NBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7OztBQUlBOzs7Ozs7Ozs7O0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDaERBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7OztBQUlBOzs7Ozs7Ozs7O0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDaERBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7OztBQUlBOzs7Ozs7Ozs7O0FBRUE7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7QUFJQTs7Ozs7Ozs7QUM3Q0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFFQTs7Ozs7QUFJQTs7O0FBRUE7Ozs7Ozs7QUFPQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQUtBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFJQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbkVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBRUE7Ozs7O0FBSUE7Ozs7O0FBRUE7Ozs7Ozs7QUFPQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBRUE7Ozs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBMUJBO0FBQ0E7QUE2QkE7Ozs7Ozs7O0FDM0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQVJBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdkNBO0FBQ0E7QUF5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFHQTs7Ozs7Ozs7QUN0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBWEE7QUFhQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQy9IQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBOzs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQVRBO0FBV0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBdEJBO0FBd0JBOzs7QUF2TEE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7QUE4S0E7Ozs7Ozs7O0FDMU5BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBOzs7QUFDQTs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBR0E7Ozs7Ozs7QUFLQTs7O0FBQ0E7Ozs7OztBQVFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQU1BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBNUNBO0FBQUE7QUFBQTs7O0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBOzs7Ozs7QUFnREE7OztBQUNBOzs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hLQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUtBOzs7OztBQUNBOzs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFYQTtBQVlBO0FBQ0E7Ozs7QUFLQTs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFUQTtBQVlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBckxBO0FBQUE7QUFBQTs7O0FBRUE7QUFBQTtBQUFBOzs7O0FBNUJBO0FBQ0E7QUFpTkE7O0FDclBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7QUNqRUE7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBSUE7OztBQUVBOzs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQURBO0FBSUE7QUFMQTtBQVFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBREE7QUFJQTtBQUxBO0FBU0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFEQTtBQUlBO0FBTEE7QUFRQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQURBO0FBSUE7QUFDQTtBQU5BO0FBU0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUxBO0FBUUE7QUFUQTtBQVlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFGQTtBQUtBO0FBTkE7QUFVQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQURBO0FBSUE7QUFMQTtBQVFBO0FBR0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBREE7QUFJQTtBQUNBO0FBTkE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBSkE7QUFPQTtBQVJBO0FBV0E7QUFDQTtBQUVBO0FBRUE7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFGQTtBQUtBO0FBUkE7QUFXQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUZBO0FBS0E7QUFSQTtBQVdBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBRkE7QUFLQTtBQUNBO0FBVEE7QUFZQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUZBO0FBS0E7QUFDQTtBQVRBO0FBWUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQVRBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFEQTtBQURBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFJQTtBQVBBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBS0E7Ozs7Ozs7O0FDNXVCQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBT0E7OztBQUVBOzs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFHQTs7Ozs7OztBQXFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7Ozs7OztBQUtBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0NBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFKQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSkE7QUFTQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUpBO0FBU0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFKQTtBQVNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFRQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFKQTtBQVVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFTQTtBQUFBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUExWkE7QUE0WkE7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFKQTtBQVVBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQXRDQTtBQXlDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFwMUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7QUFJQTs7Ozs7Ozs7QUFTQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7QUEweENBOzs7Ozs7QUFLQTs7Ozs7Ozs7Ozs7QUNsNkNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUF1RUE7Ozs7Ozs7Ozs7Ozs7QUFhQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFFQTs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBeG5CQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUlBO0FBQ0E7QUFDQTs7Ozs7O0FBNGpCQTs7QUNwcEJBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7QUMzQkE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7OztBQ25KQTs7O0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFJQTs7Ozs7Ozs7QUNyR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBR0E7QUFFQTs7Ozs7QUFJQTs7O0FBRUE7Ozs7Ozs7QUFPQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBTEE7QUFVQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUxBO0FBVUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOUJBO0FBK0JBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBQ0E7QUFRQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUVBOzs7OztBQUlBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFTQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBRkE7QUFKQTtBQUNBO0FBV0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQXZtQkE7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBOzs7Ozs7QUFnbUJBOzs7Ozs7Ozs7O0FDOXNCQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBR0E7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQWNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7O0FBSUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBOzs7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkE7Ozs7Ozs7Ozs7O0FBUUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBSUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUlBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbDlCQTs7O0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDaENBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUhBO0FBS0E7QUFFQTtBQUVBOzs7Ozs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBTEE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUNBO0FBU0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFJQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBTEE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFMQTtBQUNBO0FBT0E7QUFDQTtBQUVBOzs7Ozs7QUFJQTs7Ozs7Ozs7QUMxVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFJQTs7Ozs7Ozs7QUN4RUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFKQTtBQU1BO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQU1BO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7O0FBSUE7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBR0E7Ozs7OztBQU1BO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFGQTtBQUNBO0FBS0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFEQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUdBOzs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUtBO0FBQ0E7QUFFQTs7O0FBaFlBO0FBQ0E7QUFDQTs7O0FBZ0NBO0FBQ0E7QUFDQTs7Ozs7O0FBZ1dBOzs7Ozs7OztBQ3ZhQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7OztBQUtBO0FBQ0E7QUFBQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBTUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUE1SUE7QUFDQTtBQUNBOzs7Ozs7QUE4SUE7Ozs7Ozs7O0FDekxBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUlBOzs7QUFDQTs7Ozs7Ozs7QUFVQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQU5BO0FBUUE7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFEQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUtBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFLQTs7Ozs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7Ozs7QUFLQTtBQUNBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU9BO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFPQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBT0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFLQTtBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFLQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBR0E7QUFFQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7OztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUVBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBS0E7Ozs7Ozs7O0FBUUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBNTlCQTtBQUFBO0FBQUE7Ozs7OztBQWcrQkE7Ozs7Ozs7O0FDcGtDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUlBOzs7Ozs7OztBQzNCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7Ozs7O0FBS0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFIQTtBQUtBO0FBRUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUdBOzs7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUtBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBdkpBO0FBQUE7QUFBQTs7Ozs7O0FBMEpBOzs7Ozs7OztBQ3hQQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUEwQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUEvQkE7QUFDQTtBQUNBO0FBK0JBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUF4Q0E7QUFDQTtBQUNBO0FBd0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQTFDQTtBQUNBO0FBQ0E7QUEwQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQTdDQTtBQUNBO0FBQ0E7QUE2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBL0NBO0FBQ0E7QUFDQTtBQStDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBcERBO0FBQ0E7QUFDQTtBQW9EQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdGQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBRUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQVlBO0FBQ0E7OztBQTBDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7OztBQUlBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQWZBO0FBaUJBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQTdTQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBdkRBO0FBQ0E7QUFnVUE7Ozs7Ozs7Ozs7OztBQzFVQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7QUFGQTtBQVVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBM0JBO0FBQ0E7QUFEQTtBQUFBO0FBK0JBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZEQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTtBQUVBOzs7OztBQUlBOzs7OztBQUNBOzs7Ozs7Ozs7Ozs7O0FBYUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBWEE7QUFZQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQWtEQTtBQUNBO0FBRUE7OztBQW5EQTtBQUNBO0FBQ0E7QUFtREE7QUFDQTtBQUVBOzs7QUFwREE7QUFDQTtBQUNBO0FBb0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQXREQTtBQUNBO0FBQ0E7QUFzREE7QUFDQTtBQUVBOzs7QUF2REE7QUFDQTtBQUNBO0FBdURBO0FBQ0E7QUFFQTs7O0FBeERBO0FBQ0E7QUFDQTtBQXdEQTtBQUNBO0FBRUE7OztBQXpEQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBQUE7Ozs7QUFJQTtBQUNBO0FBRUE7OztBQWpCQTtBQUNBO0FBQ0E7QUFpQkE7QUFDQTtBQUVBOzs7QUFsQkE7QUFDQTtBQUNBO0FBaURBO0FBQ0E7QUFFQTs7OztBQW5IQTtBQXNIQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFGQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBSUE7Ozs7Ozs7O0FDM0pBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7O0FBR0E7OztBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBd0JBO0FBQ0E7QUFFQTs7O0FBekJBO0FBQ0E7QUFDQTtBQXlCQTtBQUNBO0FBRUE7OztBQTFCQTtBQUNBO0FBQ0E7QUFNQTtBQUNBO0FBRUE7OztBQVBBO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFFQTs7Ozs7O0FBYUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeEVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7O0FBR0E7QUFDQTtBQUNBOzs7OztBQUVBOzs7Ozs7Ozs7Ozs7OztBQWNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQVRBO0FBVUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBc0JBO0FBQ0E7QUFFQTs7O0FBdkJBO0FBQ0E7QUFDQTtBQXVCQTtBQUNBO0FBRUE7OztBQXhCQTtBQUNBO0FBQ0E7QUF3QkE7QUFDQTtBQUVBOzs7QUF6QkE7QUFDQTtBQUNBO0FBeUJBO0FBQ0E7QUFFQTs7O0FBMUJBO0FBQ0E7QUFDQTtBQTBCQTtBQUNBO0FBRUE7OztBQTNCQTtBQUNBO0FBQ0E7QUEyQkE7QUFDQTtBQUVBOzs7O0FBaEZBO0FBQ0E7QUFvRkE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQURBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckhBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7O0FBSUE7QUFDQTtBQUNBOzs7OztBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFLQTtBQUtBO0FBRUE7QUFLQTtBQUNBO0FBQ0E7QUF4QkE7QUEwQkE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBVUE7QUFDQTtBQUVBOzs7QUFYQTtBQUNBO0FBQ0E7QUFXQTtBQUNBO0FBRUE7OztBQVpBO0FBQ0E7QUFDQTtBQVlBO0FBQ0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7Ozs7QUEvRkE7QUFDQTtBQWlHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvSEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7QUFJQTtBQUNBO0FBQ0E7Ozs7O0FBRUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUlBO0FBS0E7QUFDQTtBQWZBO0FBZ0JBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQVVBO0FBQ0E7QUFFQTs7O0FBWEE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUVBOzs7QUFaQTtBQUNBO0FBQ0E7QUFZQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBOURBO0FBaUVBOzs7OztBQUdBO0FBQUE7QUFBQTtBQUNBOzs7Ozs7OztBQVFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBaEJBO0FBQUE7QUFBQTtBQXNDQTtBQUNBO0FBdkNBO0FBQUE7QUFBQTtBQWtCQTtBQUNBO0FBbkJBO0FBQUE7QUFBQTtBQXNCQTtBQUNBO0FBdkJBO0FBQUE7QUFBQTtBQTBCQTtBQUNBO0FBM0JBO0FBQUE7QUFBQTtBQThCQTtBQUNBO0FBL0JBO0FBQUE7QUFBQTtBQWtDQTtBQUNBO0FBbkNBO0FBQ0E7QUFEQTtBQUFBO0FBMkNBOzs7O0FBR0E7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7OztBQVNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFuQkE7QUFBQTtBQUFBO0FBcUJBO0FBQ0E7QUF0QkE7QUFBQTtBQUFBO0FBeUJBO0FBQ0E7QUExQkE7QUFBQTtBQUFBO0FBNkJBO0FBQ0E7QUE5QkE7QUFBQTtBQUFBO0FBaUNBO0FBQ0E7QUFsQ0E7QUFBQTtBQUFBO0FBcUNBO0FBQ0E7QUF0Q0E7QUFBQTtBQUFBO0FBeUNBO0FBQ0E7QUExQ0E7QUFBQTtBQUFBO0FBNkNBO0FBQ0E7QUE5Q0E7QUFBQTtBQUFBO0FBa0RBO0FBQ0E7QUFuREE7QUFDQTtBQURBO0FBQUE7QUFzREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdk1BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7O0FBR0E7QUFDQTtBQUNBOzs7OztBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFKQTtBQUtBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQVVBO0FBQ0E7QUFDQTs7O0FBVkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBbEJBO0FBQ0E7QUF3QkE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyREE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7QUFJQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFKQTtBQUFBO0FBQ0E7QUFRQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBSkE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBSEE7QUFJQTtBQUNBO0FBTkE7QUFBQTtBQUNBO0FBUUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUpBO0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBSkE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFKQTtBQUFBO0FBTUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUpBO0FBQUE7QUFNQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFJQTs7Ozs7Ozs7QUNqRkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVFBOzs7Ozs7Ozs7O0FBRUE7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQVVBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUVBO0FBV0E7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQkE7QUFFQTtBQVlBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFFQTtBQVdBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FBWUE7QUFFQTtBQVVBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUFXQTtBQUNBO0FBVUE7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FBVUE7QUFDQTtBQVVBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7O0FBWUE7QUFFQTtBQVlBO0FBWUE7QUFFQTs7Ozs7Ozs7O0FBTUE7QUFDQTtBQU1BO0FBRUE7Ozs7OztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDNVNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FBU0E7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBREE7QUFEQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUF0QkE7QUFDQTtBQXVCQTtBQUVBO0FBR0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQWFBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFnQkE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQWFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFnQkE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBR0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FBVUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFVQTtBQUNBO0FBQ0E7OztBQVZBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7O0FBUUE7Ozs7Ozs7O0FDamxCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQWVBOzs7QUFFQTs7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7QUFNQTtBQUlBOzs7Ozs7QUFNQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7O0FBUUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUVBOzs7OztBQUdBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUVBO0FBQ0E7QUFFQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSkE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQVlBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7O0FBSUE7QUFFQTtBQUNBO0FBRUE7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7O0FBR0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///288\n")}])}); \ No newline at end of file diff --git a/dist/Runtime.min.js b/dist/Runtime.min.js index 406852ac..23a52adc 100644 --- a/dist/Runtime.min.js +++ b/dist/Runtime.min.js @@ -1,5 +1,5 @@ // version: 0.16.0 -// date: Wed Jan 16 2019 10:39:53 GMT+0000 (GMT) +// date: Mon Mar 18 2019 14:21:50 GMT+0000 (Western European Standard Time) // licence: /** * Copyright 2016 PT Inovação e Sistemas SA @@ -26,7 +26,7 @@ // version: 0.16.0 -// date: Wed Jan 16 2019 10:39:53 GMT+0000 (GMT) +// date: Mon Mar 18 2019 14:21:50 GMT+0000 (Western European Standard Time) // licence: /** * Copyright 2016 PT Inovação e Sistemas SA @@ -52,171 +52,4 @@ **/ -<<<<<<< HEAD -// version: 0.15.0 -// date: Wed Jan 16 2019 10:36:42 GMT+0000 (GMT) -// licence: -/** -* Copyright 2016 PT Inovação e Sistemas SA -* Copyright 2016 INESC-ID -* Copyright 2016 QUOBIS NETWORKS SL -* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V -* Copyright 2016 ORANGE SA -* Copyright 2016 Deutsche Telekom AG -* Copyright 2016 Apizee -* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -**/ - - -// version: 0.15.0 -// date: Wed Jan 16 2019 10:36:42 GMT+0000 (GMT) -// licence: -/** -* Copyright 2016 PT Inovação e Sistemas SA -* Copyright 2016 INESC-ID -* Copyright 2016 QUOBIS NETWORKS SL -* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V -* Copyright 2016 ORANGE SA -* Copyright 2016 Deutsche Telekom AG -* Copyright 2016 Apizee -* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -**/ - - -// version: 0.15.0 -// date: Wed Jan 09 2019 17:23:51 GMT+0000 (GMT) -======= -// version: 0.16.0 -// date: Tue Jan 15 2019 09:27:25 GMT+0000 (Western European Standard Time) ->>>>>>> b64b5d630ff465c255e160833cbc1da4ee421c11 -// licence: -/** -* Copyright 2016 PT Inovação e Sistemas SA -* Copyright 2016 INESC-ID -* Copyright 2016 QUOBIS NETWORKS SL -* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V -* Copyright 2016 ORANGE SA -* Copyright 2016 Deutsche Telekom AG -* Copyright 2016 Apizee -* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -**/ - - -// version: 0.16.0 -// date: Tue Jan 15 2019 09:27:25 GMT+0000 (Western European Standard Time) -// licence: -/** -* Copyright 2016 PT Inovação e Sistemas SA -* Copyright 2016 INESC-ID -* Copyright 2016 QUOBIS NETWORKS SL -* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V -* Copyright 2016 ORANGE SA -* Copyright 2016 Deutsche Telekom AG -* Copyright 2016 Apizee -* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -**/ - - -// version: 0.16.0 -// date: Tue Jan 15 2019 09:25:55 GMT+0000 (Western European Standard Time) -// licence: -/** -* Copyright 2016 PT Inovação e Sistemas SA -* Copyright 2016 INESC-ID -* Copyright 2016 QUOBIS NETWORKS SL -* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V -* Copyright 2016 ORANGE SA -* Copyright 2016 Deutsche Telekom AG -* Copyright 2016 Apizee -* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -**/ - - -// version: 0.16.0 -// date: Tue Jan 15 2019 09:25:55 GMT+0000 (Western European Standard Time) -// licence: -/** -* Copyright 2016 PT Inovação e Sistemas SA -* Copyright 2016 INESC-ID -* Copyright 2016 QUOBIS NETWORKS SL -* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V -* Copyright 2016 ORANGE SA -* Copyright 2016 Deutsche Telekom AG -* Copyright 2016 Apizee -* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -**/ - - -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Runtime",[],t):"object"==typeof exports?exports.Runtime=t():e.Runtime=t()}(window,function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=118)}([function(e,t,r){var n,o;!function(i,s){"use strict";void 0===(o="function"==typeof(n=function(){var e=function(){},t="undefined",r=["trace","debug","info","warn","error"];function n(e,t){var r=e[t];if("function"==typeof r.bind)return r.bind(e);try{return Function.prototype.bind.call(r,e)}catch(t){return function(){return Function.prototype.apply.apply(r,[e,arguments])}}}function o(t,n){for(var o=0;o=0&&n<=c.levels.SILENT))throw"log.setLevel() called with invalid level: "+n;if(a=n,!1!==i&&function(e){var n=(r[e]||"silent").toUpperCase();if(typeof window!==t){try{return void(window.localStorage[u]=n)}catch(e){}try{window.document.cookie=encodeURIComponent(u)+"="+n+";"}catch(e){}}}(n),o.call(c,n,e),typeof console===t&&n0?o(n(e),9007199254740991):0}},function(e,t,r){var n=r(3),o=r(88),i=r(27),s=Object.defineProperty;t.f=r(9)?Object.defineProperty:function(e,t,r){if(n(e),t=i(t,!0),n(r),o)try{return s(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},function(e,t,r){e.exports=!r(2)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){var r=e.exports={version:"2.6.2"};"number"==typeof __e&&(__e=r)},function(e,t,r){var n=r(4),o=r(15),i=r(14),s=r(30)("src"),a=Function.toString,c=(""+a).split("toString");r(10).inspectSource=function(e){return a.call(e)},(e.exports=function(e,t,r,a){var u="function"==typeof r;u&&(i(r,"name")||o(r,"name",t)),e[t]!==r&&(u&&(i(r,s)||o(r,s,e[t]?""+e[t]:c.join(String(t)))),e===n?e[t]=r:a?e[t]?e[t]=r:o(e,t,r):(delete e[t],o(e,t,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[s]||a.call(this)})},function(e,t,r){var n=r(25);e.exports=function(e){return Object(n(e))}},function(e,t,r){var n=r(1),o=r(2),i=r(25),s=/"/g,a=function(e,t,r,n){var o=String(i(e)),a="<"+t;return""!==r&&(a+=" "+r+'="'+String(n).replace(s,""")+'"'),a+">"+o+""};e.exports=function(e,t){var r={};r[e]=t(a),n(n.P+n.F*o(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",r)}},function(e,t){var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,r){var n=r(8),o=r(29);e.exports=r(9)?function(e,t,r){return n.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){var n=r(44),o=r(25);e.exports=function(e){return n(o(e))}},function(e,t,r){"use strict";var n=r(2);e.exports=function(e,t){return!!e&&n(function(){t?e.call(null,function(){},1):e.call(null)})}},function(e,t){var r=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},function(e,t,r){var n=r(45),o=r(29),i=r(16),s=r(27),a=r(14),c=r(88),u=Object.getOwnPropertyDescriptor;t.f=r(9)?u:function(e,t){if(e=i(e),t=s(t,!0),c)try{return u(e,t)}catch(e){}if(a(e,t))return o(!n.f.call(e,t),e[t])}},function(e,t,r){var n=r(1),o=r(10),i=r(2);e.exports=function(e,t){var r=(o.Object||{})[e]||Object[e],s={};s[e]=t(r),n(n.S+n.F*i(function(){r(1)}),"Object",s)}},function(e,t,r){var n=r(22),o=r(44),i=r(12),s=r(7),a=r(212);e.exports=function(e,t){var r=1==e,c=2==e,u=3==e,l=4==e,f=6==e,d=5==e||f,y=t||a;return function(t,a,h){for(var p,v,g=i(t),b=o(g),m=n(a,h,3),_=s(b.length),w=0,O=r?y(t,_):c?y(t,0):void 0;_>w;w++)if((d||w in b)&&(v=m(p=b[w],w,g),e))if(r)O[w]=v;else if(v)switch(e){case 3:return!0;case 5:return p;case 6:return w;case 2:O.push(p)}else if(l)return!1;return f?-1:u||l?l:O}}},function(e,t,r){var n=r(23);e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,o){return e.call(t,r,n,o)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){"use strict";if(r(9)){var n=r(31),o=r(4),i=r(2),s=r(1),a=r(58),c=r(85),u=r(22),l=r(41),f=r(29),d=r(15),y=r(42),h=r(18),p=r(7),v=r(114),g=r(33),b=r(27),m=r(14),_=r(46),w=r(5),O=r(12),k=r(77),R=r(34),P=r(36),S=r(35).f,j=r(79),M=r(30),L=r(6),E=r(21),U=r(48),C=r(47),I=r(81),A=r(38),x=r(51),T=r(40),D=r(80),H=r(105),N=r(8),B=r(19),F=N.f,K=B.f,G=o.RangeError,q=o.TypeError,V=o.Uint8Array,W=Array.prototype,J=c.ArrayBuffer,Y=c.DataView,z=E(0),$=E(2),X=E(3),Q=E(4),Z=E(5),ee=E(6),te=U(!0),re=U(!1),ne=I.values,oe=I.keys,ie=I.entries,se=W.lastIndexOf,ae=W.reduce,ce=W.reduceRight,ue=W.join,le=W.sort,fe=W.slice,de=W.toString,ye=W.toLocaleString,he=L("iterator"),pe=L("toStringTag"),ve=M("typed_constructor"),ge=M("def_constructor"),be=a.CONSTR,me=a.TYPED,_e=a.VIEW,we=E(1,function(e,t){return Se(C(e,e[ge]),t)}),Oe=i(function(){return 1===new V(new Uint16Array([1]).buffer)[0]}),ke=!!V&&!!V.prototype.set&&i(function(){new V(1).set({})}),Re=function(e,t){var r=h(e);if(r<0||r%t)throw G("Wrong offset!");return r},Pe=function(e){if(w(e)&&me in e)return e;throw q(e+" is not a typed array!")},Se=function(e,t){if(!(w(e)&&ve in e))throw q("It is not a typed array constructor!");return new e(t)},je=function(e,t){return Me(C(e,e[ge]),t)},Me=function(e,t){for(var r=0,n=t.length,o=Se(e,n);n>r;)o[r]=t[r++];return o},Le=function(e,t,r){F(e,t,{get:function(){return this._d[r]}})},Ee=function(e){var t,r,n,o,i,s,a=O(e),c=arguments.length,l=c>1?arguments[1]:void 0,f=void 0!==l,d=j(a);if(null!=d&&!k(d)){for(s=d.call(a),n=[],t=0;!(i=s.next()).done;t++)n.push(i.value);a=n}for(f&&c>2&&(l=u(l,arguments[2],2)),t=0,r=p(a.length),o=Se(this,r);r>t;t++)o[t]=f?l(a[t],t):a[t];return o},Ue=function(){for(var e=0,t=arguments.length,r=Se(this,t);t>e;)r[e]=arguments[e++];return r},Ce=!!V&&i(function(){ye.call(new V(1))}),Ie=function(){return ye.apply(Ce?fe.call(Pe(this)):Pe(this),arguments)},Ae={copyWithin:function(e,t){return H.call(Pe(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Q(Pe(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return D.apply(Pe(this),arguments)},filter:function(e){return je(this,$(Pe(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return Z(Pe(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return ee(Pe(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){z(Pe(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return re(Pe(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return te(Pe(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return ue.apply(Pe(this),arguments)},lastIndexOf:function(e){return se.apply(Pe(this),arguments)},map:function(e){return we(Pe(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return ae.apply(Pe(this),arguments)},reduceRight:function(e){return ce.apply(Pe(this),arguments)},reverse:function(){for(var e,t=Pe(this).length,r=Math.floor(t/2),n=0;n1?arguments[1]:void 0)},sort:function(e){return le.call(Pe(this),e)},subarray:function(e,t){var r=Pe(this),n=r.length,o=g(e,n);return new(C(r,r[ge]))(r.buffer,r.byteOffset+o*r.BYTES_PER_ELEMENT,p((void 0===t?n:g(t,n))-o))}},xe=function(e,t){return je(this,fe.call(Pe(this),e,t))},Te=function(e){Pe(this);var t=Re(arguments[1],1),r=this.length,n=O(e),o=p(n.length),i=0;if(o+t>r)throw G("Wrong length!");for(;i255?255:255&n),o.v[y](r*t+o.o,n,Oe)}(this,r,e)},enumerable:!0})};m?(h=r(function(e,r,n,o){l(e,h,u,"_d");var i,s,a,c,f=0,y=0;if(w(r)){if(!(r instanceof J||"ArrayBuffer"==(c=_(r))||"SharedArrayBuffer"==c))return me in r?Me(h,r):Ee.call(h,r);i=r,y=Re(n,t);var g=r.byteLength;if(void 0===o){if(g%t)throw G("Wrong length!");if((s=g-y)<0)throw G("Wrong length!")}else if((s=p(o)*t)+y>g)throw G("Wrong length!");a=s/t}else a=v(r),i=new J(s=a*t);for(d(e,"_d",{b:i,o:y,l:s,e:a,v:new Y(i)});fdocument.F=Object<\/script>"),e.close(),c=e.F;n--;)delete c.prototype[i[n]];return c()};e.exports=Object.create||function(e,t){var r;return null!==e?(a.prototype=n(e),r=new a,a.prototype=null,r[s]=e):r=c(),void 0===t?r:o(r,t)}},function(e,t,r){var n=r(90),o=r(63).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return n(e,o)}},function(e,t,r){var n=r(14),o=r(12),i=r(62)("IE_PROTO"),s=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=o(e),n(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},function(e,t,r){var n=r(8).f,o=r(14),i=r(6)("toStringTag");e.exports=function(e,t,r){e&&!o(e=r?e:e.prototype,i)&&n(e,i,{configurable:!0,value:t})}},function(e,t){e.exports={}},function(e,t,r){var n=r(6)("unscopables"),o=Array.prototype;null==o[n]&&r(15)(o,n,{}),e.exports=function(e){o[n][e]=!0}},function(e,t,r){"use strict";var n=r(4),o=r(8),i=r(9),s=r(6)("species");e.exports=function(e){var t=n[e];i&&t&&!t[s]&&o.f(t,s,{configurable:!0,get:function(){return this}})}},function(e,t){e.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},function(e,t,r){var n=r(11);e.exports=function(e,t,r){for(var o in t)n(e,o,t[o],r);return e}},function(e,t,r){var n=r(5);e.exports=function(e,t){if(!n(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},function(e,t,r){var n=r(24);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==n(e)?e.split(""):Object(e)}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,r){var n=r(24),o=r(6)("toStringTag"),i="Arguments"==n(function(){return arguments}());e.exports=function(e){var t,r,s;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?r:i?n(t):"Object"==(s=n(t))&&"function"==typeof t.callee?"Arguments":s}},function(e,t,r){var n=r(3),o=r(23),i=r(6)("species");e.exports=function(e,t){var r,s=n(e).constructor;return void 0===s||null==(r=n(s)[i])?t:o(r)}},function(e,t,r){var n=r(16),o=r(7),i=r(33);e.exports=function(e){return function(t,r,s){var a,c=n(t),u=o(c.length),l=i(s,u);if(e&&r!=r){for(;u>l;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((e||l in c)&&c[l]===r)return e||l||0;return!e&&-1}}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,r){var n=r(1),o=r(25),i=r(2),s=r(67),a="["+s+"]",c=RegExp("^"+a+a+"*"),u=RegExp(a+a+"*$"),l=function(e,t,r){var o={},a=i(function(){return!!s[e]()||"​…"!="​…"[e]()}),c=o[e]=a?t(f):s[e];r&&(o[r]=c),n(n.P+n.F*a,"String",o)},f=l.trim=function(e,t){return e=String(o(e)),1&t&&(e=e.replace(c,"")),2&t&&(e=e.replace(u,"")),e};e.exports=l},function(e,t,r){var n=r(6)("iterator"),o=!1;try{var i=[7][n]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var r=!1;try{var i=[7],s=i[n]();s.next=function(){return{done:r=!0}},i[n]=function(){return s},e(i)}catch(e){}return r}},function(e,t,r){"use strict";var n=r(3);e.exports=function(){var e=n(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,r){"use strict";var n=r(46),o=RegExp.prototype.exec;e.exports=function(e,t){var r=e.exec;if("function"==typeof r){var i=r.call(e,t);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==n(e))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(e,t)}},function(e,t,r){"use strict";r(107);var n=r(11),o=r(15),i=r(2),s=r(25),a=r(6),c=r(82),u=a("species"),l=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),f=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var r="ab".split(e);return 2===r.length&&"a"===r[0]&&"b"===r[1]}();e.exports=function(e,t,r){var d=a(e),y=!i(function(){var t={};return t[d]=function(){return 7},7!=""[e](t)}),h=y?!i(function(){var t=!1,r=/a/;return r.exec=function(){return t=!0,null},"split"===e&&(r.constructor={},r.constructor[u]=function(){return r}),r[d](""),!t}):void 0;if(!y||!h||"replace"===e&&!l||"split"===e&&!f){var p=/./[d],v=r(s,d,""[e],function(e,t,r,n,o){return t.exec===c?y&&!o?{done:!0,value:p.call(t,r,n)}:{done:!0,value:e.call(r,t,n)}:{done:!1}}),g=v[0],b=v[1];n(String.prototype,e,g),o(RegExp.prototype,d,2==t?function(e,t){return b.call(e,this,t)}:function(e){return b.call(e,this)})}}},function(e,t,r){var n=r(22),o=r(103),i=r(77),s=r(3),a=r(7),c=r(79),u={},l={};(t=e.exports=function(e,t,r,f,d){var y,h,p,v,g=d?function(){return e}:c(e),b=n(r,f,t?2:1),m=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(i(g)){for(y=a(e.length);y>m;m++)if((v=t?b(s(h=e[m])[0],h[1]):b(e[m]))===u||v===l)return v}else for(p=g.call(e);!(h=p.next()).done;)if((v=o(p,b,h.value,t))===u||v===l)return v}).BREAK=u,t.RETURN=l},function(e,t,r){var n=r(4).navigator;e.exports=n&&n.userAgent||""},function(e,t,r){"use strict";var n=r(4),o=r(1),i=r(11),s=r(42),a=r(28),c=r(55),u=r(41),l=r(5),f=r(2),d=r(51),y=r(37),h=r(68);e.exports=function(e,t,r,p,v,g){var b=n[e],m=b,_=v?"set":"add",w=m&&m.prototype,O={},k=function(e){var t=w[e];i(w,e,"delete"==e?function(e){return!(g&&!l(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(g&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return g&&!l(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,r){return t.call(this,0===e?0:e,r),this})};if("function"==typeof m&&(g||w.forEach&&!f(function(){(new m).entries().next()}))){var R=new m,P=R[_](g?{}:-0,1)!=R,S=f(function(){R.has(1)}),j=d(function(e){new m(e)}),M=!g&&f(function(){for(var e=new m,t=5;t--;)e[_](t,t);return!e.has(-0)});j||((m=t(function(t,r){u(t,m,e);var n=h(new b,t,m);return null!=r&&c(r,v,n[_],n),n})).prototype=w,w.constructor=m),(S||M)&&(k("delete"),k("has"),v&&k("get")),(M||P)&&k(_),g&&w.clear&&delete w.clear}else m=p.getConstructor(t,e,v,_),s(m.prototype,r),a.NEED=!0;return y(m,e),O[e]=m,o(o.G+o.W+o.F*(m!=b),O),g||p.setStrong(m,e,v),m}},function(e,t,r){for(var n,o=r(4),i=r(15),s=r(30),a=s("typed_array"),c=s("view"),u=!(!o.ArrayBuffer||!o.DataView),l=u,f=0,d="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");f<9;)(n=o[d[f++]])?(i(n.prototype,a,!0),i(n.prototype,c,!0)):l=!1;e.exports={ABV:u,CONSTR:l,TYPED:a,VIEW:c}},function(e,t,r){var n=r(5),o=r(4).document,i=n(o)&&n(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t,r){var n=r(10),o=r(4),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:n.version,mode:r(31)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t,r){t.f=r(6)},function(e,t,r){var n=r(60)("keys"),o=r(30);e.exports=function(e){return n[e]||(n[e]=o(e))}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,r){var n=r(24);e.exports=Array.isArray||function(e){return"Array"==n(e)}},function(e,t,r){var n=r(4).document;e.exports=n&&n.documentElement},function(e,t,r){var n=r(5),o=r(3),i=function(e,t){if(o(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=r(22)(Function.call,r(19).f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,r){return i(e,r),t?e.__proto__=r:n(e,r),e}}({},!1):void 0),check:i}},function(e,t){e.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},function(e,t,r){var n=r(5),o=r(66).set;e.exports=function(e,t,r){var i,s=t.constructor;return s!==r&&"function"==typeof s&&(i=s.prototype)!==r.prototype&&n(i)&&o&&o(e,i),e}},function(e,t,r){"use strict";var n=r(18),o=r(25);e.exports=function(e){var t=String(o(this)),r="",i=n(e);if(i<0||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(r+=t);return r}},function(e,t){e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},function(e,t){var r=Math.expm1;e.exports=!r||r(10)>22025.465794806718||r(10)<22025.465794806718||-2e-17!=r(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:r},function(e,t,r){var n=r(18),o=r(25);e.exports=function(e){return function(t,r){var i,s,a=String(o(t)),c=n(r),u=a.length;return c<0||c>=u?e?"":void 0:(i=a.charCodeAt(c))<55296||i>56319||c+1===u||(s=a.charCodeAt(c+1))<56320||s>57343?e?a.charAt(c):i:e?a.slice(c,c+2):s-56320+(i-55296<<10)+65536}}},function(e,t,r){"use strict";var n=r(31),o=r(1),i=r(11),s=r(15),a=r(38),c=r(102),u=r(37),l=r(36),f=r(6)("iterator"),d=!([].keys&&"next"in[].keys()),y=function(){return this};e.exports=function(e,t,r,h,p,v,g){c(r,t,h);var b,m,_,w=function(e){if(!d&&e in P)return P[e];switch(e){case"keys":case"values":return function(){return new r(this,e)}}return function(){return new r(this,e)}},O=t+" Iterator",k="values"==p,R=!1,P=e.prototype,S=P[f]||P["@@iterator"]||p&&P[p],j=S||w(p),M=p?k?w("entries"):j:void 0,L="Array"==t&&P.entries||S;if(L&&(_=l(L.call(new e)))!==Object.prototype&&_.next&&(u(_,O,!0),n||"function"==typeof _[f]||s(_,f,y)),k&&S&&"values"!==S.name&&(R=!0,j=function(){return S.call(this)}),n&&!g||!d&&!R&&P[f]||s(P,f,j),a[t]=j,a[O]=y,p)if(b={values:k?j:w("values"),keys:v?j:w("keys"),entries:M},g)for(m in b)m in P||i(P,m,b[m]);else o(o.P+o.F*(d||R),t,b);return b}},function(e,t,r){var n=r(75),o=r(25);e.exports=function(e,t,r){if(n(t))throw TypeError("String#"+r+" doesn't accept regex!");return String(o(e))}},function(e,t,r){var n=r(5),o=r(24),i=r(6)("match");e.exports=function(e){var t;return n(e)&&(void 0!==(t=e[i])?!!t:"RegExp"==o(e))}},function(e,t,r){var n=r(6)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(r){try{return t[n]=!1,!"/./"[e](t)}catch(e){}}return!0}},function(e,t,r){var n=r(38),o=r(6)("iterator"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(n.Array===e||i[o]===e)}},function(e,t,r){"use strict";var n=r(8),o=r(29);e.exports=function(e,t,r){t in e?n.f(e,t,o(0,r)):e[t]=r}},function(e,t,r){var n=r(46),o=r(6)("iterator"),i=r(38);e.exports=r(10).getIteratorMethod=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[n(e)]}},function(e,t,r){"use strict";var n=r(12),o=r(33),i=r(7);e.exports=function(e){for(var t=n(this),r=i(t.length),s=arguments.length,a=o(s>1?arguments[1]:void 0,r),c=s>2?arguments[2]:void 0,u=void 0===c?r:o(c,r);u>a;)t[a++]=e;return t}},function(e,t,r){"use strict";var n=r(39),o=r(106),i=r(38),s=r(16);e.exports=r(73)(Array,"Array",function(e,t){this._t=s(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,o(1)):o(0,"keys"==t?r:"values"==t?e[r]:[r,e[r]])},"values"),i.Arguments=i.Array,n("keys"),n("values"),n("entries")},function(e,t,r){"use strict";var n=r(52),o=RegExp.prototype.exec,i=String.prototype.replace,s=o,a=function(){var e=/a/,t=/b*/g;return o.call(e,"a"),o.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),c=void 0!==/()??/.exec("")[1];(a||c)&&(s=function(e){var t,r,s,u,l=this;return c&&(r=new RegExp("^"+l.source+"$(?!\\s)",n.call(l))),a&&(t=l.lastIndex),s=o.call(l,e),a&&s&&(l.lastIndex=l.global?s.index+s[0].length:t),c&&s&&s.length>1&&i.call(s[0],r,function(){for(u=1;ur;)t.push(arguments[r++]);return g[++v]=function(){a("function"==typeof e?e:Function(e),t)},n(v),v},y=function(e){delete g[e]},"process"==r(24)(f)?n=function(e){f.nextTick(s(b,e,1))}:p&&p.now?n=function(e){p.now(s(b,e,1))}:h?(i=(o=new h).port2,o.port1.onmessage=m,n=s(i.postMessage,i,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(n=function(e){l.postMessage(e+"","*")},l.addEventListener("message",m,!1)):n="onreadystatechange"in u("script")?function(e){c.appendChild(u("script")).onreadystatechange=function(){c.removeChild(this),b.call(e)}}:function(e){setTimeout(s(b,e,1),0)}),e.exports={set:d,clear:y}},function(e,t,r){"use strict";var n=r(4),o=r(9),i=r(31),s=r(58),a=r(15),c=r(42),u=r(2),l=r(41),f=r(18),d=r(7),y=r(114),h=r(35).f,p=r(8).f,v=r(80),g=r(37),b="prototype",m="Wrong index!",_=n.ArrayBuffer,w=n.DataView,O=n.Math,k=n.RangeError,R=n.Infinity,P=_,S=O.abs,j=O.pow,M=O.floor,L=O.log,E=O.LN2,U=o?"_b":"buffer",C=o?"_l":"byteLength",I=o?"_o":"byteOffset";function A(e,t,r){var n,o,i,s=new Array(r),a=8*r-t-1,c=(1<>1,l=23===t?j(2,-24)-j(2,-77):0,f=0,d=e<0||0===e&&1/e<0?1:0;for((e=S(e))!=e||e===R?(o=e!=e?1:0,n=c):(n=M(L(e)/E),e*(i=j(2,-n))<1&&(n--,i*=2),(e+=n+u>=1?l/i:l*j(2,1-u))*i>=2&&(n++,i/=2),n+u>=c?(o=0,n=c):n+u>=1?(o=(e*i-1)*j(2,t),n+=u):(o=e*j(2,u-1)*j(2,t),n=0));t>=8;s[f++]=255&o,o/=256,t-=8);for(n=n<0;s[f++]=255&n,n/=256,a-=8);return s[--f]|=128*d,s}function x(e,t,r){var n,o=8*r-t-1,i=(1<>1,a=o-7,c=r-1,u=e[c--],l=127&u;for(u>>=7;a>0;l=256*l+e[c],c--,a-=8);for(n=l&(1<<-a)-1,l>>=-a,a+=t;a>0;n=256*n+e[c],c--,a-=8);if(0===l)l=1-s;else{if(l===i)return n?NaN:u?-R:R;n+=j(2,t),l-=s}return(u?-1:1)*n*j(2,l-t)}function T(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]}function D(e){return[255&e]}function H(e){return[255&e,e>>8&255]}function N(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function B(e){return A(e,52,8)}function F(e){return A(e,23,4)}function K(e,t,r){p(e[b],t,{get:function(){return this[r]}})}function G(e,t,r,n){var o=y(+r);if(o+t>e[C])throw k(m);var i=e[U]._b,s=o+e[I],a=i.slice(s,s+t);return n?a:a.reverse()}function q(e,t,r,n,o,i){var s=y(+r);if(s+t>e[C])throw k(m);for(var a=e[U]._b,c=s+e[I],u=n(+o),l=0;lY;)(V=J[Y++])in _||a(_,V,P[V]);i||(W.constructor=_)}var z=new w(new _(2)),$=w[b].setInt8;z.setInt8(0,2147483648),z.setInt8(1,2147483649),!z.getInt8(0)&&z.getInt8(1)||c(w[b],{setInt8:function(e,t){$.call(this,e,t<<24>>24)},setUint8:function(e,t){$.call(this,e,t<<24>>24)}},!0)}else _=function(e){l(this,_,"ArrayBuffer");var t=y(e);this._b=v.call(new Array(t),0),this[C]=t},w=function(e,t,r){l(this,w,"DataView"),l(e,_,"DataView");var n=e[C],o=f(t);if(o<0||o>n)throw k("Wrong offset!");if(o+(r=void 0===r?n-o:d(r))>n)throw k("Wrong length!");this[U]=e,this[I]=o,this[C]=r},o&&(K(_,"byteLength","_l"),K(w,"buffer","_b"),K(w,"byteLength","_l"),K(w,"byteOffset","_o")),c(w[b],{getInt8:function(e){return G(this,1,e)[0]<<24>>24},getUint8:function(e){return G(this,1,e)[0]},getInt16:function(e){var t=G(this,2,e,arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=G(this,2,e,arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return T(G(this,4,e,arguments[1]))},getUint32:function(e){return T(G(this,4,e,arguments[1]))>>>0},getFloat32:function(e){return x(G(this,4,e,arguments[1]),23,4)},getFloat64:function(e){return x(G(this,8,e,arguments[1]),52,8)},setInt8:function(e,t){q(this,1,e,D,t)},setUint8:function(e,t){q(this,1,e,D,t)},setInt16:function(e,t){q(this,2,e,H,t,arguments[2])},setUint16:function(e,t){q(this,2,e,H,t,arguments[2])},setInt32:function(e,t){q(this,4,e,N,t,arguments[2])},setUint32:function(e,t){q(this,4,e,N,t,arguments[2])},setFloat32:function(e,t){q(this,4,e,F,t,arguments[2])},setFloat64:function(e,t){q(this,8,e,B,t,arguments[2])}});g(_,"ArrayBuffer"),g(w,"DataView"),a(w[b],s.VIEW,!0),t.ArrayBuffer=_,t.DataView=w},function(e,t){!function(){"use strict";if(!Object.observe&&"function"==typeof Proxy){function e(e,t,r,n,o,i){var s,a=this;function c(e,n){if(c.delay=n,!c.pause&&a.changeset.length>0){if(!e){var o=a.changeset.filter(function(e){return!r||r.indexOf(e.type)>=0});o.length>0&&t(o)}a.changeset=[]}}return c.pause=o,c.delay=i,a.get=function(e,t){return"__observer__"===t?a:"unobserve"===t?function(){return Object.unobserve(e),e}:"deliver"===t?c:e[t]},a.target=e,a.changeset=[],a.target.__observerCallbacks__||(Object.defineProperty(e,"__observerCallbacks__",{enumerable:!1,configurable:!0,writable:!1,value:[]}),Object.defineProperty(e,"__observers__",{enumerable:!1,configurable:!0,writable:!1,value:[]})),a.target.__observerCallbacks__.push(t),a.target.__observers__.push(this),s=new Proxy(e,a),c(!1,i),s}e.prototype.deliver=function(){return this.get(null,"deliver")},e.prototype.set=function(e,t,r){var n=e[t],o=void 0===n?"add":"update";if(e[t]=r,e.__observers__.indexOf(this)>=0&&(!this.acceptlist||this.acceptlist.indexOf(o)>=0)){var i={object:e,name:t,type:o},s=0===this.changeset.length,a=this.deliver();"update"===o&&(i.oldValue=n),this.changeset.push(i),s&&a(!1,"number"==typeof a.delay?a.delay:10)}return!0},e.prototype.deleteProperty=function(e,t){var r=e[t];if(delete e[t],e.__observers__.indexOf(this)>=0&&!this.acceptlist||this.acceptlist.indexOf("delete")>=0){var n={object:e,name:t,type:"delete",oldValue:r},o=0===this.changeset.length,i=this.deliver();this.changeset.push(n),o&&i(!1,"number"==typeof i.delay?i.delay:10)}return!0},e.prototype.defineProperty=function(e,t,r){if(Object.defineProperty(e,t,r),e.__observers__.indexOf(this)>=0&&!this.acceptlist||this.acceptlist.indexOf("reconfigure")>=0){var n={object:e,name:t,type:"reconfigure"},o=0===this.changeset.length,i=this.deliver();this.changeset.push(n),o&&i(!1,"number"==typeof i.delay?i.delay:10)}return!0},e.prototype.setPrototypeOf=function(e,t){var r=Object.getPrototypeOf(e);if(Object.setPrototypeOf(e,t),e.__observers__.indexOf(this)>=0&&!this.acceptlist||this.acceptlist.indexOf("setPrototype")>=0){var n={object:e,name:"__proto__",type:"setPrototype",oldValue:r},o=0===this.changeset.length,i=this.deliver();this.changeset.push(n),o&&i(!1,"number"==typeof i.delay?i.delay:10)}return!0},e.prototype.preventExtensions=function(e){if(Object.preventExtensions(e),e.__observers__.indexOf(this)>=0&&!this.acceptlist||this.acceptlist.indexOf("preventExtensions")>=0){var t={object:e,type:"preventExtensions"},r=0===this.changeset.length,n=this.deliver();this.changeset.push(t),r&&n(!1,"number"==typeof n.delay?n.delay:10)}return!0},Object.observe=function(t,r,n,o,i,s){return new e(t,r,n,o,i,s)},Object.unobserve=function(e,t){if(e.__observerCallbacks__){if(!t)return e.__observerCallbacks__.splice(0,e.__observerCallbacks__.length),void e.__observers__.splice(0,e.__observers__.length);e.__observerCallbacks__.forEach(function(r,n){t===r&&(e.__observerCallbacks__.splice(n,1),delete e.__observers__[n].callback,e.__observers__.splice(n,1))})}},Array.observe=function(e,t,r,n,o,i){if(!(e instanceof Array||Array.isArray(e)))throw new TypeError("First argument to Array.observer is not an Array");r=r||["add","update","delete","splice"];var s=new Proxy(e,{get:function(t,n){return"unobserve"===n?function(e){return e?Object.unobserve(t,e):t.unobserve()}:"splice"===n?function(n,o){if("number"!=typeof n||"number"!=typeof o)throw new TypeError("First two arguments to Array splice are not number, number");var i=this.slice(n,n+o),s=arguments.length>1?arguments.length-2:0,c={object:e,type:"splice",index:n,removed:i,addedCount:s};if(t.splice.apply(t,arguments),r.indexOf("splice")>=0){n=0===a.__observer__.changeset.length;var u=a.__observer__.deliver();a.__observer__.changeset.push(c),n&&u(!1,"number"==typeof u.delay?u.delay:10)}}:"push"===n?function(e){return this.splice(this.length,0,e)}:"pop"===n?function(){return this.splice(this.length-1,1)}:"unshift"===n?function(e){return this.splice(0,0,e)}:"shift"===n?function(){return this.splice(0,1)}:t[n]}}),a=Object.observe(s,function(e){var n=e.filter(function(e){return"length"!==e.name&&"add"!==e.name&&(!r||r.indexOf(e.type)>=0)});n.length>0&&t(n)},r,n,o,i);return a},Array.unobserve=function(e,t){return e.unobserve(t)}}Object.deepObserve=function(e,t,r){var n=function(e){return{}.toString.call(e).match(/\s([a-zA-Z]+)/)[1].toLowerCase()};function o(e,r){Object.keys(e).forEach(function(o){if(("object"===n(e[o])||"array"===n(e[o]))&&!e[o].hasOwnProperty("__observers__")){var i=r.slice(0);i.push(o),e[o]=Object.deepObserve(e[o],t,i)}})}return o(e,r=r||[]),Object.observe(e,function(e){var n=[];e.forEach(function(e){var t=(r.length>0?r.join(".")+".":"")+e.name;"update"!==e.type&&"add"!==e.type||o(e.object,r),n.push({name:e.name,object:e.object,type:e.type,oldValue:e.oldValue,newValue:e.object[e.name],keypath:t}),function e(t,r,o,i,s){i instanceof Object?Object.keys(i).forEach(function(a){if(!o||o[a]!==i[a]){var c=o&&void 0!==o[a]?o[a]:void 0,u=void 0===c?"add":"update",l=s+"."+a;n.push({name:t,object:r,type:u,oldValue:c,newValue:i[a],keypath:l}),e(t,r,c,i[a],l)}}):o instanceof Object&&Object.keys(o).forEach(function(a){var c=null===i?"update":"delete",u=s+"."+a;n.push({name:t,object:r,type:c,oldValue:o[a],newValue:i,keypath:u}),e(t,r,o[a],void 0,u)})}(e.name,e.object,e.oldValue,e.object[e.name],t)}),t(n)})}}()},function(e,t,r){var n,o;void 0===(o="function"==typeof(n=function(){Object.keys||(Object.keys=function(){var e=Object.prototype.hasOwnProperty,t=!{toString:null}.propertyIsEnumerable("toString"),r=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],n=r.length;return function(o){if("object"!=typeof o&&"function"!=typeof o||null===o)throw new TypeError("Object.keys called on non-object");var i=[];for(var s in o)e.call(o,s)&&i.push(s);if(t)for(var a=0;a>>0;if(0===r)return-1;var n=0;if(arguments.length>1&&((n=Number(arguments[1]))!=n?n=0:0!==n&&n!==1/0&&n!==-1/0&&(n=(n>0||-1)*Math.floor(Math.abs(n)))),n>=r)return-1;for(var o=n>=0?n:Math.max(r-Math.abs(n),0);o0&&(t+=l.suffices["*"]&&i||",",l.suffices["*"]&&c&&(t+=l.name+"=")),t+=a?encodeURIComponent(f[y]).replace(/!/g,"%21"):r(f[y])}else if("object"==typeof f){c&&!l.suffices["*"]&&(t+=l.name+"=");var h=!0;for(var p in f)h||(t+=l.suffices["*"]&&i||","),h=!1,t+=a?encodeURIComponent(p).replace(/!/g,"%21"):r(p),t+=l.suffices["*"]?"=":",",t+=a?encodeURIComponent(f[p]).replace(/!/g,"%21"):r(f[p])}else c&&(t+=l.name,u&&""===f||(t+="=")),null!=l.truncate&&(f=f.substring(0,l.truncate)),t+=a?encodeURIComponent(f).replace(/!/g,"%21"):r(f)}return t};return _.varNames=l,{prefix:s,substitution:_}}function o(e){if(!(this instanceof o))return new o(e);for(var t=e.split("{"),r=[t.shift()],i=[],s=[],a=[];t.length>0;){var c=t.shift(),u=c.split("}")[0],l=c.substring(u.length+1),f=n(u);s.push(f.substitution),i.push(f.prefix),r.push(l),a=a.concat(f.substitution.varNames)}this.fill=function(e){for(var t=r[0],n=0;n0&&"/"===t.charAt(e.length-1)||"#"===r.charAt(0)||"?"===r.charAt(0))return!0}return!1}(t,e.id)&&void 0===this.schemas[e.id]&&(this.schemas[e.id]=e),e)if("enum"!==n)if("object"==typeof e[n])this.searchSchemas(e[n],t);else if("$ref"===n){var o=f(e[n]);o&&void 0===this.schemas[o]&&void 0===this.missingMap[o]&&(this.missingMap[o]=o)}},i.prototype.addSchema=function(e,t){if("string"!=typeof e||void 0===t){if("object"!=typeof e||"string"!=typeof e.id)return;e=(t=e).id}e===f(e)+"#"&&(e=f(e)),this.schemas[e]=t,delete this.missingMap[e],d(t,e),this.searchSchemas(t,e)},i.prototype.getSchemaMap=function(){var e={};for(var t in this.schemas)e[t]=this.schemas[t];return e},i.prototype.getSchemaUris=function(e){var t=[];for(var r in this.schemas)e&&!e.test(r)||t.push(r);return t},i.prototype.getMissingUris=function(e){var t=[];for(var r in this.missingMap)e&&!e.test(r)||t.push(r);return t},i.prototype.dropSchemas=function(){this.schemas={},this.reset()},i.prototype.reset=function(){this.missing=[],this.missingMap={},this.errors=[]},i.prototype.validateAll=function(e,t,r,n,o){var i;if(!(t=this.resolveRefs(t)))return null;if(t instanceof b)return this.errors.push(t),t;var s,a=this.errors.length,c=null,u=null;if(this.checkRecursive&&e&&"object"==typeof e){if(i=!this.scanned.length,e[this.validatedSchemasKey]){var l=e[this.validatedSchemasKey].indexOf(t);if(-1!==l)return this.errors=this.errors.concat(e[this.validationErrorsKey][l]),null}if(Object.isFrozen(e)&&-1!==(s=this.scannedFrozen.indexOf(e))){var f=this.scannedFrozenSchemas[s].indexOf(t);if(-1!==f)return this.errors=this.errors.concat(this.scannedFrozenValidationErrors[s][f]),null}if(this.scanned.push(e),Object.isFrozen(e))-1===s&&(s=this.scannedFrozen.length,this.scannedFrozen.push(e),this.scannedFrozenSchemas.push([])),c=this.scannedFrozenSchemas[s].length,this.scannedFrozenSchemas[s][c]=t,this.scannedFrozenValidationErrors[s][c]=[];else{if(!e[this.validatedSchemasKey])try{Object.defineProperty(e,this.validatedSchemasKey,{value:[],configurable:!0}),Object.defineProperty(e,this.validationErrorsKey,{value:[],configurable:!0})}catch(t){e[this.validatedSchemasKey]=[],e[this.validationErrorsKey]=[]}u=e[this.validatedSchemasKey].length,e[this.validatedSchemasKey][u]=t,e[this.validationErrorsKey][u]=[]}}var d=this.errors.length,y=this.validateBasic(e,t,o)||this.validateNumeric(e,t,o)||this.validateString(e,t,o)||this.validateArray(e,t,o)||this.validateObject(e,t,o)||this.validateCombinations(e,t,o)||this.validateHypermedia(e,t,o)||this.validateFormat(e,t,o)||this.validateDefinedKeywords(e,t,o)||null;if(i){for(;this.scanned.length;){delete this.scanned.pop()[this.validatedSchemasKey]}this.scannedFrozen=[],this.scannedFrozenSchemas=[]}if(y||d!==this.errors.length)for(;r&&r.length||n&&n.length;){var h=r&&r.length?""+r.pop():null,p=n&&n.length?""+n.pop():null;y&&(y=y.prefixWith(h,p)),this.prefixErrors(d,h,p)}return null!==c?this.scannedFrozenValidationErrors[s][c]=this.errors.slice(a):null!==u&&(e[this.validationErrorsKey][u]=this.errors.slice(a)),this.handleError(y)},i.prototype.validateFormat=function(e,t){if("string"!=typeof t.format||!this.formatValidators[t.format])return null;var r=this.formatValidators[t.format].call(null,e,t);return"string"==typeof r||"number"==typeof r?this.createError(h.FORMAT_CUSTOM,{message:r},"","/format",null,e,t):r&&"object"==typeof r?this.createError(h.FORMAT_CUSTOM,{message:r.message||"?"},r.dataPath||"",r.schemaPath||"/format",null,e,t):null},i.prototype.validateDefinedKeywords=function(e,t,r){for(var n in this.definedKeywords)if(void 0!==t[n])for(var o=this.definedKeywords[n],i=0;i=a&&nt.maximum)return this.createError(h.NUMBER_MAXIMUM,{value:e,maximum:t.maximum},"","/maximum",null,e,t);if(t.exclusiveMaximum&&e===t.maximum)return this.createError(h.NUMBER_MAXIMUM_EXCLUSIVE,{value:e,maximum:t.maximum},"","/exclusiveMaximum",null,e,t)}return null},i.prototype.validateNaN=function(e,t){return"number"!=typeof e?null:!0===isNaN(e)||e===1/0||e===-1/0?this.createError(h.NUMBER_NOT_A_NUMBER,{value:e},"","/type",null,e,t):null},i.prototype.validateString=function(e,t,r){return this.validateStringLength(e,t,r)||this.validateStringPattern(e,t,r)||null},i.prototype.validateStringLength=function(e,t){return"string"!=typeof e?null:void 0!==t.minLength&&e.lengtht.maxLength?this.createError(h.STRING_LENGTH_LONG,{length:e.length,maximum:t.maxLength},"","/maxLength",null,e,t):null},i.prototype.validateStringPattern=function(e,t){if("string"!=typeof e||"string"!=typeof t.pattern&&!(t.pattern instanceof RegExp))return null;var r;if(t.pattern instanceof RegExp)r=t.pattern;else{var n,o="",i=t.pattern.match(/^\/(.+)\/([img]*)$/);i?(n=i[1],o=i[2]):n=t.pattern,r=new RegExp(n,o)}return r.test(e)?null:this.createError(h.STRING_PATTERN,{pattern:t.pattern},"","/pattern",null,e,t)},i.prototype.validateArray=function(e,t,r){return Array.isArray(e)&&(this.validateArrayLength(e,t,r)||this.validateArrayUniqueItems(e,t,r)||this.validateArrayItems(e,t,r))||null},i.prototype.validateArrayLength=function(e,t){var r;return void 0!==t.minItems&&e.lengtht.maxItems&&(r=this.createError(h.ARRAY_LENGTH_LONG,{length:e.length,maximum:t.maxItems},"","/maxItems",null,e,t),this.handleError(r))?r:null},i.prototype.validateArrayUniqueItems=function(e,t){if(t.uniqueItems)for(var r=0;rt.maxProperties&&(r=this.createError(h.OBJECT_PROPERTIES_MAXIMUM,{propertyCount:n.length,maximum:t.maxProperties},"","/maxProperties",null,e,t),this.handleError(r))?r:null},i.prototype.validateObjectRequiredProperties=function(e,t){if(void 0!==t.required)for(var r=0;r 10000");if(void 0!==h[e])throw new Error("Error already defined: "+e+" as "+h[e]);if(void 0!==p[t])throw new Error("Error code already used: "+p[t]+" as "+t);for(var n in h[e]=t,p[t]=e,g[e]=g[t]=r,m){var o=m[n];o[e]&&(o[t]=o[t]||o[e])}},reset:function(){o.reset(),this.error=null,this.missing=[],this.valid=!0},missing:[],error:null,valid:!0,normSchema:d,resolveUrl:l,getDocumentUri:f,errorCodes:h};return s.language(t||"en"),s}();return _.addLanguage("en-gb",g),_.tv4=_,_})?n.apply(t,[]):n)||(e.exports=o)},function(e,t,r){e.exports=!r(9)&&!r(2)(function(){return 7!=Object.defineProperty(r(59)("div"),"a",{get:function(){return 7}}).a})},function(e,t,r){var n=r(4),o=r(10),i=r(31),s=r(61),a=r(8).f;e.exports=function(e){var t=o.Symbol||(o.Symbol=i?{}:n.Symbol||{});"_"==e.charAt(0)||e in t||a(t,e,{value:s.f(e)})}},function(e,t,r){var n=r(14),o=r(16),i=r(48)(!1),s=r(62)("IE_PROTO");e.exports=function(e,t){var r,a=o(e),c=0,u=[];for(r in a)r!=s&&n(a,r)&&u.push(r);for(;t.length>c;)n(a,r=t[c++])&&(~i(u,r)||u.push(r));return u}},function(e,t,r){var n=r(8),o=r(3),i=r(32);e.exports=r(9)?Object.defineProperties:function(e,t){o(e);for(var r,s=i(t),a=s.length,c=0;a>c;)n.f(e,r=s[c++],t[r]);return e}},function(e,t,r){var n=r(16),o=r(35).f,i={}.toString,s="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return s&&"[object Window]"==i.call(e)?function(e){try{return o(e)}catch(e){return s.slice()}}(e):o(n(e))}},function(e,t,r){"use strict";var n=r(32),o=r(49),i=r(45),s=r(12),a=r(44),c=Object.assign;e.exports=!c||r(2)(function(){var e={},t={},r=Symbol(),n="abcdefghijklmnopqrst";return e[r]=7,n.split("").forEach(function(e){t[e]=e}),7!=c({},e)[r]||Object.keys(c({},t)).join("")!=n})?function(e,t){for(var r=s(e),c=arguments.length,u=1,l=o.f,f=i.f;c>u;)for(var d,y=a(arguments[u++]),h=l?n(y).concat(l(y)):n(y),p=h.length,v=0;p>v;)f.call(y,d=h[v++])&&(r[d]=y[d]);return r}:c},function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},function(e,t,r){"use strict";var n=r(23),o=r(5),i=r(96),s=[].slice,a={};e.exports=Function.bind||function(e){var t=n(this),r=s.call(arguments,1),c=function(){var n=r.concat(s.call(arguments));return this instanceof c?function(e,t,r){if(!(t in a)){for(var n=[],o=0;o>>0||(s.test(r)?16:10))}:n},function(e,t,r){var n=r(4).parseFloat,o=r(50).trim;e.exports=1/n(r(67)+"-0")!=-1/0?function(e){var t=o(String(e),3),r=n(t);return 0===r&&"-"==t.charAt(0)?-0:r}:n},function(e,t,r){var n=r(24);e.exports=function(e,t){if("number"!=typeof e&&"Number"!=n(e))throw TypeError(t);return+e}},function(e,t,r){var n=r(5),o=Math.floor;e.exports=function(e){return!n(e)&&isFinite(e)&&o(e)===e}},function(e,t){e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)}},function(e,t,r){"use strict";var n=r(34),o=r(29),i=r(37),s={};r(15)(s,r(6)("iterator"),function(){return this}),e.exports=function(e,t,r){e.prototype=n(s,{next:o(1,r)}),i(e,t+" Iterator")}},function(e,t,r){var n=r(3);e.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){var i=e.return;throw void 0!==i&&n(i.call(e)),t}}},function(e,t,r){var n=r(23),o=r(12),i=r(44),s=r(7);e.exports=function(e,t,r,a,c){n(t);var u=o(e),l=i(u),f=s(u.length),d=c?f-1:0,y=c?-1:1;if(r<2)for(;;){if(d in l){a=l[d],d+=y;break}if(d+=y,c?d<0:f<=d)throw TypeError("Reduce of empty array with no initial value")}for(;c?d>=0:f>d;d+=y)d in l&&(a=t(a,l[d],d,u));return a}},function(e,t,r){"use strict";var n=r(12),o=r(33),i=r(7);e.exports=[].copyWithin||function(e,t){var r=n(this),s=i(r.length),a=o(e,s),c=o(t,s),u=arguments.length>2?arguments[2]:void 0,l=Math.min((void 0===u?s:o(u,s))-c,s-a),f=1;for(c0;)c in r?r[a]=r[c]:delete r[a],a+=f,c+=f;return r}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,r){"use strict";var n=r(82);r(1)({target:"RegExp",proto:!0,forced:n!==/./.exec},{exec:n})},function(e,t,r){r(9)&&"g"!=/./g.flags&&r(8).f(RegExp.prototype,"flags",{configurable:!0,get:r(52)})},function(e,t,r){"use strict";var n,o,i,s,a=r(31),c=r(4),u=r(22),l=r(46),f=r(1),d=r(5),y=r(23),h=r(41),p=r(55),v=r(47),g=r(84).set,b=r(233)(),m=r(110),_=r(234),w=r(56),O=r(111),k=c.TypeError,R=c.process,P=R&&R.versions,S=P&&P.v8||"",j=c.Promise,M="process"==l(R),L=function(){},E=o=m.f,U=!!function(){try{var e=j.resolve(1),t=(e.constructor={})[r(6)("species")]=function(e){e(L,L)};return(M||"function"==typeof PromiseRejectionEvent)&&e.then(L)instanceof t&&0!==S.indexOf("6.6")&&-1===w.indexOf("Chrome/66")}catch(e){}}(),C=function(e){var t;return!(!d(e)||"function"!=typeof(t=e.then))&&t},I=function(e,t){if(!e._n){e._n=!0;var r=e._c;b(function(){for(var n=e._v,o=1==e._s,i=0,s=function(t){var r,i,s,a=o?t.ok:t.fail,c=t.resolve,u=t.reject,l=t.domain;try{a?(o||(2==e._h&&T(e),e._h=1),!0===a?r=n:(l&&l.enter(),r=a(n),l&&(l.exit(),s=!0)),r===t.promise?u(k("Promise-chain cycle")):(i=C(r))?i.call(r,c,u):c(r)):u(n)}catch(e){l&&!s&&l.exit(),u(e)}};r.length>i;)s(r[i++]);e._c=[],e._n=!1,t&&!e._h&&A(e)})}},A=function(e){g.call(c,function(){var t,r,n,o=e._v,i=x(e);if(i&&(t=_(function(){M?R.emit("unhandledRejection",o,e):(r=c.onunhandledrejection)?r({promise:e,reason:o}):(n=c.console)&&n.error&&n.error("Unhandled promise rejection",o)}),e._h=M||x(e)?2:1),e._a=void 0,i&&t.e)throw t.v})},x=function(e){return 1!==e._h&&0===(e._a||e._c).length},T=function(e){g.call(c,function(){var t;M?R.emit("rejectionHandled",e):(t=c.onrejectionhandled)&&t({promise:e,reason:e._v})})},D=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),I(t,!0))},H=function(e){var t,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw k("Promise can't be resolved itself");(t=C(e))?b(function(){var n={_w:r,_d:!1};try{t.call(e,u(H,n,1),u(D,n,1))}catch(e){D.call(n,e)}}):(r._v=e,r._s=1,I(r,!1))}catch(e){D.call({_w:r,_d:!1},e)}}};U||(j=function(e){h(this,j,"Promise","_h"),y(e),n.call(this);try{e(u(H,this,1),u(D,this,1))}catch(e){D.call(this,e)}},(n=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=r(42)(j.prototype,{then:function(e,t){var r=E(v(this,j));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=M?R.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&I(this,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new n;this.promise=e,this.resolve=u(H,e,1),this.reject=u(D,e,1)},m.f=E=function(e){return e===j||e===s?new i(e):o(e)}),f(f.G+f.W+f.F*!U,{Promise:j}),r(37)(j,"Promise"),r(40)("Promise"),s=r(10).Promise,f(f.S+f.F*!U,"Promise",{reject:function(e){var t=E(this);return(0,t.reject)(e),t.promise}}),f(f.S+f.F*(a||!U),"Promise",{resolve:function(e){return O(a&&this===s?j:this,e)}}),f(f.S+f.F*!(U&&r(51)(function(e){j.all(e).catch(L)})),"Promise",{all:function(e){var t=this,r=E(t),n=r.resolve,o=r.reject,i=_(function(){var r=[],i=0,s=1;p(e,!1,function(e){var a=i++,c=!1;r.push(void 0),s++,t.resolve(e).then(function(e){c||(c=!0,r[a]=e,--s||n(r))},o)}),--s||n(r)});return i.e&&o(i.v),r.promise},race:function(e){var t=this,r=E(t),n=r.reject,o=_(function(){p(e,!1,function(e){t.resolve(e).then(r.resolve,n)})});return o.e&&n(o.v),r.promise}})},function(e,t,r){"use strict";var n=r(23);e.exports.f=function(e){return new function(e){var t,r;this.promise=new e(function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n}),this.resolve=n(t),this.reject=n(r)}(e)}},function(e,t,r){var n=r(3),o=r(5),i=r(110);e.exports=function(e,t){if(n(e),o(t)&&t.constructor===e)return t;var r=i.f(e);return(0,r.resolve)(t),r.promise}},function(e,t,r){"use strict";var n=r(8).f,o=r(34),i=r(42),s=r(22),a=r(41),c=r(55),u=r(73),l=r(106),f=r(40),d=r(9),y=r(28).fastKey,h=r(43),p=d?"_s":"size",v=function(e,t){var r,n=y(t);if("F"!==n)return e._i[n];for(r=e._f;r;r=r.n)if(r.k==t)return r};e.exports={getConstructor:function(e,t,r,u){var l=e(function(e,n){a(e,l,t,"_i"),e._t=t,e._i=o(null),e._f=void 0,e._l=void 0,e[p]=0,null!=n&&c(n,r,e[u],e)});return i(l.prototype,{clear:function(){for(var e=h(this,t),r=e._i,n=e._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete r[n.i];e._f=e._l=void 0,e[p]=0},delete:function(e){var r=h(this,t),n=v(r,e);if(n){var o=n.n,i=n.p;delete r._i[n.i],n.r=!0,i&&(i.n=o),o&&(o.p=i),r._f==n&&(r._f=o),r._l==n&&(r._l=i),r[p]--}return!!n},forEach:function(e){h(this,t);for(var r,n=s(e,arguments.length>1?arguments[1]:void 0,3);r=r?r.n:this._f;)for(n(r.v,r.k,this);r&&r.r;)r=r.p},has:function(e){return!!v(h(this,t),e)}}),d&&n(l.prototype,"size",{get:function(){return h(this,t)[p]}}),l},def:function(e,t,r){var n,o,i=v(e,t);return i?i.v=r:(e._l=i={i:o=y(t,!0),k:t,v:r,p:n=e._l,n:void 0,r:!1},e._f||(e._f=i),n&&(n.n=i),e[p]++,"F"!==o&&(e._i[o]=i)),e},getEntry:v,setStrong:function(e,t,r){u(e,t,function(e,r){this._t=h(e,t),this._k=r,this._l=void 0},function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?l(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,l(1))},r?"entries":"values",!r,!0),f(t)}}},function(e,t,r){"use strict";var n=r(42),o=r(28).getWeak,i=r(3),s=r(5),a=r(41),c=r(55),u=r(21),l=r(14),f=r(43),d=u(5),y=u(6),h=0,p=function(e){return e._l||(e._l=new v)},v=function(){this.a=[]},g=function(e,t){return d(e.a,function(e){return e[0]===t})};v.prototype={get:function(e){var t=g(this,e);if(t)return t[1]},has:function(e){return!!g(this,e)},set:function(e,t){var r=g(this,e);r?r[1]=t:this.a.push([e,t])},delete:function(e){var t=y(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,r,i){var u=e(function(e,n){a(e,u,t,"_i"),e._t=t,e._i=h++,e._l=void 0,null!=n&&c(n,r,e[i],e)});return n(u.prototype,{delete:function(e){if(!s(e))return!1;var r=o(e);return!0===r?p(f(this,t)).delete(e):r&&l(r,this._i)&&delete r[this._i]},has:function(e){if(!s(e))return!1;var r=o(e);return!0===r?p(f(this,t)).has(e):r&&l(r,this._i)}}),u},def:function(e,t,r){var n=o(i(t),!0);return!0===n?p(e).set(t,r):n[e._i]=r,e},ufstore:p}},function(e,t,r){var n=r(18),o=r(7);e.exports=function(e){if(void 0===e)return 0;var t=n(e),r=o(t);if(t!==r)throw RangeError("Wrong length!");return r}},function(e,t,r){var n=r(35),o=r(49),i=r(3),s=r(4).Reflect;e.exports=s&&s.ownKeys||function(e){var t=n.f(i(e)),r=o.f;return r?t.concat(r(e)):t}},function(e,t,r){var n=r(7),o=r(69),i=r(25);e.exports=function(e,t,r,s){var a=String(i(e)),c=a.length,u=void 0===r?" ":String(r),l=n(t);if(l<=c||""==u)return a;var f=l-c,d=o.call(u,Math.ceil(f/u.length));return d.length>f&&(d=d.slice(0,f)),s?d+a:a+d}},function(e,t,r){var n=r(32),o=r(16),i=r(45).f;e.exports=function(e){return function(t){for(var r,s=o(t),a=n(s),c=a.length,u=0,l=[];c>u;)i.call(s,r=a[u++])&&l.push(e?[r,s[r]]:s[r]);return l}}},function(e,t,r){r(119),e.exports=r(287)},function(e,t,r){"use strict";(function(e){r(121),r(264),r(266),r(268),r(270),r(272),r(274),r(276),r(278),r(280),r(284),e._babelPolyfill&&"undefined"!=typeof console&&console.warn&&console.warn("@babel/polyfill is loaded more than once on this page. This is probably not desirable/intended and may have consequences if different versions of the polyfills are applied sequentially. If you do need to load the polyfill more than once, use @babel/polyfill/noConflict instead to bypass the warning."),e._babelPolyfill=!0}).call(this,r(120))},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){r(122),r(124),r(125),r(126),r(127),r(128),r(129),r(130),r(131),r(132),r(133),r(134),r(135),r(136),r(137),r(138),r(139),r(140),r(141),r(142),r(143),r(144),r(145),r(146),r(147),r(148),r(149),r(150),r(151),r(152),r(153),r(154),r(155),r(156),r(157),r(158),r(159),r(160),r(161),r(162),r(163),r(164),r(165),r(167),r(168),r(169),r(170),r(171),r(172),r(173),r(174),r(175),r(176),r(177),r(178),r(179),r(180),r(181),r(182),r(183),r(184),r(185),r(186),r(187),r(188),r(189),r(190),r(191),r(192),r(193),r(194),r(195),r(196),r(197),r(198),r(199),r(200),r(202),r(203),r(205),r(206),r(207),r(208),r(209),r(210),r(211),r(214),r(215),r(216),r(217),r(218),r(219),r(220),r(221),r(222),r(223),r(224),r(225),r(226),r(81),r(227),r(107),r(228),r(108),r(229),r(230),r(231),r(232),r(109),r(235),r(236),r(237),r(238),r(239),r(240),r(241),r(242),r(243),r(244),r(245),r(246),r(247),r(248),r(249),r(250),r(251),r(252),r(253),r(254),r(255),r(256),r(257),r(258),r(259),r(260),r(261),r(262),r(263),e.exports=r(10)},function(e,t,r){"use strict";var n=r(4),o=r(14),i=r(9),s=r(1),a=r(11),c=r(28).KEY,u=r(2),l=r(60),f=r(37),d=r(30),y=r(6),h=r(61),p=r(89),v=r(123),g=r(64),b=r(3),m=r(5),_=r(16),w=r(27),O=r(29),k=r(34),R=r(92),P=r(19),S=r(8),j=r(32),M=P.f,L=S.f,E=R.f,U=n.Symbol,C=n.JSON,I=C&&C.stringify,A=y("_hidden"),x=y("toPrimitive"),T={}.propertyIsEnumerable,D=l("symbol-registry"),H=l("symbols"),N=l("op-symbols"),B=Object.prototype,F="function"==typeof U,K=n.QObject,G=!K||!K.prototype||!K.prototype.findChild,q=i&&u(function(){return 7!=k(L({},"a",{get:function(){return L(this,"a",{value:7}).a}})).a})?function(e,t,r){var n=M(B,t);n&&delete B[t],L(e,t,r),n&&e!==B&&L(B,t,n)}:L,V=function(e){var t=H[e]=k(U.prototype);return t._k=e,t},W=F&&"symbol"==typeof U.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof U},J=function(e,t,r){return e===B&&J(N,t,r),b(e),t=w(t,!0),b(r),o(H,t)?(r.enumerable?(o(e,A)&&e[A][t]&&(e[A][t]=!1),r=k(r,{enumerable:O(0,!1)})):(o(e,A)||L(e,A,O(1,{})),e[A][t]=!0),q(e,t,r)):L(e,t,r)},Y=function(e,t){b(e);for(var r,n=v(t=_(t)),o=0,i=n.length;i>o;)J(e,r=n[o++],t[r]);return e},z=function(e){var t=T.call(this,e=w(e,!0));return!(this===B&&o(H,e)&&!o(N,e))&&(!(t||!o(this,e)||!o(H,e)||o(this,A)&&this[A][e])||t)},$=function(e,t){if(e=_(e),t=w(t,!0),e!==B||!o(H,t)||o(N,t)){var r=M(e,t);return!r||!o(H,t)||o(e,A)&&e[A][t]||(r.enumerable=!0),r}},X=function(e){for(var t,r=E(_(e)),n=[],i=0;r.length>i;)o(H,t=r[i++])||t==A||t==c||n.push(t);return n},Q=function(e){for(var t,r=e===B,n=E(r?N:_(e)),i=[],s=0;n.length>s;)!o(H,t=n[s++])||r&&!o(B,t)||i.push(H[t]);return i};F||(a((U=function(){if(this instanceof U)throw TypeError("Symbol is not a constructor!");var e=d(arguments.length>0?arguments[0]:void 0),t=function(r){this===B&&t.call(N,r),o(this,A)&&o(this[A],e)&&(this[A][e]=!1),q(this,e,O(1,r))};return i&&G&&q(B,e,{configurable:!0,set:t}),V(e)}).prototype,"toString",function(){return this._k}),P.f=$,S.f=J,r(35).f=R.f=X,r(45).f=z,r(49).f=Q,i&&!r(31)&&a(B,"propertyIsEnumerable",z,!0),h.f=function(e){return V(y(e))}),s(s.G+s.W+s.F*!F,{Symbol:U});for(var Z="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),ee=0;Z.length>ee;)y(Z[ee++]);for(var te=j(y.store),re=0;te.length>re;)p(te[re++]);s(s.S+s.F*!F,"Symbol",{for:function(e){return o(D,e+="")?D[e]:D[e]=U(e)},keyFor:function(e){if(!W(e))throw TypeError(e+" is not a symbol!");for(var t in D)if(D[t]===e)return t},useSetter:function(){G=!0},useSimple:function(){G=!1}}),s(s.S+s.F*!F,"Object",{create:function(e,t){return void 0===t?k(e):Y(k(e),t)},defineProperty:J,defineProperties:Y,getOwnPropertyDescriptor:$,getOwnPropertyNames:X,getOwnPropertySymbols:Q}),C&&s(s.S+s.F*(!F||u(function(){var e=U();return"[null]"!=I([e])||"{}"!=I({a:e})||"{}"!=I(Object(e))})),"JSON",{stringify:function(e){for(var t,r,n=[e],o=1;arguments.length>o;)n.push(arguments[o++]);if(r=t=n[1],(m(t)||void 0!==e)&&!W(e))return g(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!W(t))return t}),n[1]=t,I.apply(C,n)}}),U.prototype[x]||r(15)(U.prototype,x,U.prototype.valueOf),f(U,"Symbol"),f(Math,"Math",!0),f(n.JSON,"JSON",!0)},function(e,t,r){var n=r(32),o=r(49),i=r(45);e.exports=function(e){var t=n(e),r=o.f;if(r)for(var s,a=r(e),c=i.f,u=0;a.length>u;)c.call(e,s=a[u++])&&t.push(s);return t}},function(e,t,r){var n=r(1);n(n.S,"Object",{create:r(34)})},function(e,t,r){var n=r(1);n(n.S+n.F*!r(9),"Object",{defineProperty:r(8).f})},function(e,t,r){var n=r(1);n(n.S+n.F*!r(9),"Object",{defineProperties:r(91)})},function(e,t,r){var n=r(16),o=r(19).f;r(20)("getOwnPropertyDescriptor",function(){return function(e,t){return o(n(e),t)}})},function(e,t,r){var n=r(12),o=r(36);r(20)("getPrototypeOf",function(){return function(e){return o(n(e))}})},function(e,t,r){var n=r(12),o=r(32);r(20)("keys",function(){return function(e){return o(n(e))}})},function(e,t,r){r(20)("getOwnPropertyNames",function(){return r(92).f})},function(e,t,r){var n=r(5),o=r(28).onFreeze;r(20)("freeze",function(e){return function(t){return e&&n(t)?e(o(t)):t}})},function(e,t,r){var n=r(5),o=r(28).onFreeze;r(20)("seal",function(e){return function(t){return e&&n(t)?e(o(t)):t}})},function(e,t,r){var n=r(5),o=r(28).onFreeze;r(20)("preventExtensions",function(e){return function(t){return e&&n(t)?e(o(t)):t}})},function(e,t,r){var n=r(5);r(20)("isFrozen",function(e){return function(t){return!n(t)||!!e&&e(t)}})},function(e,t,r){var n=r(5);r(20)("isSealed",function(e){return function(t){return!n(t)||!!e&&e(t)}})},function(e,t,r){var n=r(5);r(20)("isExtensible",function(e){return function(t){return!!n(t)&&(!e||e(t))}})},function(e,t,r){var n=r(1);n(n.S+n.F,"Object",{assign:r(93)})},function(e,t,r){var n=r(1);n(n.S,"Object",{is:r(94)})},function(e,t,r){var n=r(1);n(n.S,"Object",{setPrototypeOf:r(66).set})},function(e,t,r){"use strict";var n=r(46),o={};o[r(6)("toStringTag")]="z",o+""!="[object z]"&&r(11)(Object.prototype,"toString",function(){return"[object "+n(this)+"]"},!0)},function(e,t,r){var n=r(1);n(n.P,"Function",{bind:r(95)})},function(e,t,r){var n=r(8).f,o=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in o||r(9)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},function(e,t,r){"use strict";var n=r(5),o=r(36),i=r(6)("hasInstance"),s=Function.prototype;i in s||r(8).f(s,i,{value:function(e){if("function"!=typeof this||!n(e))return!1;if(!n(this.prototype))return e instanceof this;for(;e=o(e);)if(this.prototype===e)return!0;return!1}})},function(e,t,r){var n=r(1),o=r(97);n(n.G+n.F*(parseInt!=o),{parseInt:o})},function(e,t,r){var n=r(1),o=r(98);n(n.G+n.F*(parseFloat!=o),{parseFloat:o})},function(e,t,r){"use strict";var n=r(4),o=r(14),i=r(24),s=r(68),a=r(27),c=r(2),u=r(35).f,l=r(19).f,f=r(8).f,d=r(50).trim,y=n.Number,h=y,p=y.prototype,v="Number"==i(r(34)(p)),g="trim"in String.prototype,b=function(e){var t=a(e,!1);if("string"==typeof t&&t.length>2){var r,n,o,i=(t=g?t.trim():d(t,3)).charCodeAt(0);if(43===i||45===i){if(88===(r=t.charCodeAt(2))||120===r)return NaN}else if(48===i){switch(t.charCodeAt(1)){case 66:case 98:n=2,o=49;break;case 79:case 111:n=8,o=55;break;default:return+t}for(var s,c=t.slice(2),u=0,l=c.length;uo)return NaN;return parseInt(c,n)}}return+t};if(!y(" 0o1")||!y("0b1")||y("+0x1")){y=function(e){var t=arguments.length<1?0:e,r=this;return r instanceof y&&(v?c(function(){p.valueOf.call(r)}):"Number"!=i(r))?s(new h(b(t)),r,y):b(t)};for(var m,_=r(9)?u(h):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),w=0;_.length>w;w++)o(h,m=_[w])&&!o(y,m)&&f(y,m,l(h,m));y.prototype=p,p.constructor=y,r(11)(n,"Number",y)}},function(e,t,r){"use strict";var n=r(1),o=r(18),i=r(99),s=r(69),a=1..toFixed,c=Math.floor,u=[0,0,0,0,0,0],l="Number.toFixed: incorrect invocation!",f=function(e,t){for(var r=-1,n=t;++r<6;)n+=e*u[r],u[r]=n%1e7,n=c(n/1e7)},d=function(e){for(var t=6,r=0;--t>=0;)r+=u[t],u[t]=c(r/e),r=r%e*1e7},y=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==u[e]){var r=String(u[e]);t=""===t?r:t+s.call("0",7-r.length)+r}return t},h=function(e,t,r){return 0===t?r:t%2==1?h(e,t-1,r*e):h(e*e,t/2,r)};n(n.P+n.F*(!!a&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!r(2)(function(){a.call({})})),"Number",{toFixed:function(e){var t,r,n,a,c=i(this,l),u=o(e),p="",v="0";if(u<0||u>20)throw RangeError(l);if(c!=c)return"NaN";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(p="-",c=-c),c>1e-21)if(r=(t=function(e){for(var t=0,r=c*h(2,69,1);r>=4096;)t+=12,r/=4096;for(;r>=2;)t+=1,r/=2;return t}()-69)<0?c*h(2,-t,1):c/h(2,t,1),r*=4503599627370496,(t=52-t)>0){for(f(0,r),n=u;n>=7;)f(1e7,0),n-=7;for(f(h(10,n,1),0),n=t-1;n>=23;)d(1<<23),n-=23;d(1<0?p+((a=v.length)<=u?"0."+s.call("0",u-a)+v:v.slice(0,a-u)+"."+v.slice(a-u)):p+v}})},function(e,t,r){"use strict";var n=r(1),o=r(2),i=r(99),s=1..toPrecision;n(n.P+n.F*(o(function(){return"1"!==s.call(1,void 0)})||!o(function(){s.call({})})),"Number",{toPrecision:function(e){var t=i(this,"Number#toPrecision: incorrect invocation!");return void 0===e?s.call(t):s.call(t,e)}})},function(e,t,r){var n=r(1);n(n.S,"Number",{EPSILON:Math.pow(2,-52)})},function(e,t,r){var n=r(1),o=r(4).isFinite;n(n.S,"Number",{isFinite:function(e){return"number"==typeof e&&o(e)}})},function(e,t,r){var n=r(1);n(n.S,"Number",{isInteger:r(100)})},function(e,t,r){var n=r(1);n(n.S,"Number",{isNaN:function(e){return e!=e}})},function(e,t,r){var n=r(1),o=r(100),i=Math.abs;n(n.S,"Number",{isSafeInteger:function(e){return o(e)&&i(e)<=9007199254740991}})},function(e,t,r){var n=r(1);n(n.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,r){var n=r(1);n(n.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,r){var n=r(1),o=r(98);n(n.S+n.F*(Number.parseFloat!=o),"Number",{parseFloat:o})},function(e,t,r){var n=r(1),o=r(97);n(n.S+n.F*(Number.parseInt!=o),"Number",{parseInt:o})},function(e,t,r){var n=r(1),o=r(101),i=Math.sqrt,s=Math.acosh;n(n.S+n.F*!(s&&710==Math.floor(s(Number.MAX_VALUE))&&s(1/0)==1/0),"Math",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:o(e-1+i(e-1)*i(e+1))}})},function(e,t,r){var n=r(1),o=Math.asinh;n(n.S+n.F*!(o&&1/o(0)>0),"Math",{asinh:function e(t){return isFinite(t=+t)&&0!=t?t<0?-e(-t):Math.log(t+Math.sqrt(t*t+1)):t}})},function(e,t,r){var n=r(1),o=Math.atanh;n(n.S+n.F*!(o&&1/o(-0)<0),"Math",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}})},function(e,t,r){var n=r(1),o=r(70);n(n.S,"Math",{cbrt:function(e){return o(e=+e)*Math.pow(Math.abs(e),1/3)}})},function(e,t,r){var n=r(1);n(n.S,"Math",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}})},function(e,t,r){var n=r(1),o=Math.exp;n(n.S,"Math",{cosh:function(e){return(o(e=+e)+o(-e))/2}})},function(e,t,r){var n=r(1),o=r(71);n(n.S+n.F*(o!=Math.expm1),"Math",{expm1:o})},function(e,t,r){var n=r(1);n(n.S,"Math",{fround:r(166)})},function(e,t,r){var n=r(70),o=Math.pow,i=o(2,-52),s=o(2,-23),a=o(2,127)*(2-s),c=o(2,-126);e.exports=Math.fround||function(e){var t,r,o=Math.abs(e),u=n(e);return oa||r!=r?u*(1/0):u*r}},function(e,t,r){var n=r(1),o=Math.abs;n(n.S,"Math",{hypot:function(e,t){for(var r,n,i=0,s=0,a=arguments.length,c=0;s0?(n=r/c)*n:r;return c===1/0?1/0:c*Math.sqrt(i)}})},function(e,t,r){var n=r(1),o=Math.imul;n(n.S+n.F*r(2)(function(){return-5!=o(4294967295,5)||2!=o.length}),"Math",{imul:function(e,t){var r=+e,n=+t,o=65535&r,i=65535&n;return 0|o*i+((65535&r>>>16)*i+o*(65535&n>>>16)<<16>>>0)}})},function(e,t,r){var n=r(1);n(n.S,"Math",{log10:function(e){return Math.log(e)*Math.LOG10E}})},function(e,t,r){var n=r(1);n(n.S,"Math",{log1p:r(101)})},function(e,t,r){var n=r(1);n(n.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}})},function(e,t,r){var n=r(1);n(n.S,"Math",{sign:r(70)})},function(e,t,r){var n=r(1),o=r(71),i=Math.exp;n(n.S+n.F*r(2)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(e){return Math.abs(e=+e)<1?(o(e)-o(-e))/2:(i(e-1)-i(-e-1))*(Math.E/2)}})},function(e,t,r){var n=r(1),o=r(71),i=Math.exp;n(n.S,"Math",{tanh:function(e){var t=o(e=+e),r=o(-e);return t==1/0?1:r==1/0?-1:(t-r)/(i(e)+i(-e))}})},function(e,t,r){var n=r(1);n(n.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}})},function(e,t,r){var n=r(1),o=r(33),i=String.fromCharCode,s=String.fromCodePoint;n(n.S+n.F*(!!s&&1!=s.length),"String",{fromCodePoint:function(e){for(var t,r=[],n=arguments.length,s=0;n>s;){if(t=+arguments[s++],o(t,1114111)!==t)throw RangeError(t+" is not a valid code point");r.push(t<65536?i(t):i(55296+((t-=65536)>>10),t%1024+56320))}return r.join("")}})},function(e,t,r){var n=r(1),o=r(16),i=r(7);n(n.S,"String",{raw:function(e){for(var t=o(e.raw),r=i(t.length),n=arguments.length,s=[],a=0;r>a;)s.push(String(t[a++])),a=t.length?{value:void 0,done:!0}:(e=n(t,r),this._i+=e.length,{value:e,done:!1})})},function(e,t,r){"use strict";var n=r(1),o=r(72)(!1);n(n.P,"String",{codePointAt:function(e){return o(this,e)}})},function(e,t,r){"use strict";var n=r(1),o=r(7),i=r(74),s="".endsWith;n(n.P+n.F*r(76)("endsWith"),"String",{endsWith:function(e){var t=i(this,e,"endsWith"),r=arguments.length>1?arguments[1]:void 0,n=o(t.length),a=void 0===r?n:Math.min(o(r),n),c=String(e);return s?s.call(t,c,a):t.slice(a-c.length,a)===c}})},function(e,t,r){"use strict";var n=r(1),o=r(74);n(n.P+n.F*r(76)("includes"),"String",{includes:function(e){return!!~o(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,r){var n=r(1);n(n.P,"String",{repeat:r(69)})},function(e,t,r){"use strict";var n=r(1),o=r(7),i=r(74),s="".startsWith;n(n.P+n.F*r(76)("startsWith"),"String",{startsWith:function(e){var t=i(this,e,"startsWith"),r=o(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),n=String(e);return s?s.call(t,n,r):t.slice(r,r+n.length)===n}})},function(e,t,r){"use strict";r(13)("anchor",function(e){return function(t){return e(this,"a","name",t)}})},function(e,t,r){"use strict";r(13)("big",function(e){return function(){return e(this,"big","","")}})},function(e,t,r){"use strict";r(13)("blink",function(e){return function(){return e(this,"blink","","")}})},function(e,t,r){"use strict";r(13)("bold",function(e){return function(){return e(this,"b","","")}})},function(e,t,r){"use strict";r(13)("fixed",function(e){return function(){return e(this,"tt","","")}})},function(e,t,r){"use strict";r(13)("fontcolor",function(e){return function(t){return e(this,"font","color",t)}})},function(e,t,r){"use strict";r(13)("fontsize",function(e){return function(t){return e(this,"font","size",t)}})},function(e,t,r){"use strict";r(13)("italics",function(e){return function(){return e(this,"i","","")}})},function(e,t,r){"use strict";r(13)("link",function(e){return function(t){return e(this,"a","href",t)}})},function(e,t,r){"use strict";r(13)("small",function(e){return function(){return e(this,"small","","")}})},function(e,t,r){"use strict";r(13)("strike",function(e){return function(){return e(this,"strike","","")}})},function(e,t,r){"use strict";r(13)("sub",function(e){return function(){return e(this,"sub","","")}})},function(e,t,r){"use strict";r(13)("sup",function(e){return function(){return e(this,"sup","","")}})},function(e,t,r){var n=r(1);n(n.S,"Date",{now:function(){return(new Date).getTime()}})},function(e,t,r){"use strict";var n=r(1),o=r(12),i=r(27);n(n.P+n.F*r(2)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(e){var t=o(this),r=i(t);return"number"!=typeof r||isFinite(r)?t.toISOString():null}})},function(e,t,r){var n=r(1),o=r(201);n(n.P+n.F*(Date.prototype.toISOString!==o),"Date",{toISOString:o})},function(e,t,r){"use strict";var n=r(2),o=Date.prototype.getTime,i=Date.prototype.toISOString,s=function(e){return e>9?e:"0"+e};e.exports=n(function(){return"0385-07-25T07:06:39.999Z"!=i.call(new Date(-5e13-1))})||!n(function(){i.call(new Date(NaN))})?function(){if(!isFinite(o.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),r=e.getUTCMilliseconds(),n=t<0?"-":t>9999?"+":"";return n+("00000"+Math.abs(t)).slice(n?-6:-4)+"-"+s(e.getUTCMonth()+1)+"-"+s(e.getUTCDate())+"T"+s(e.getUTCHours())+":"+s(e.getUTCMinutes())+":"+s(e.getUTCSeconds())+"."+(r>99?r:"0"+s(r))+"Z"}:i},function(e,t,r){var n=Date.prototype,o=n.toString,i=n.getTime;new Date(NaN)+""!="Invalid Date"&&r(11)(n,"toString",function(){var e=i.call(this);return e==e?o.call(this):"Invalid Date"})},function(e,t,r){var n=r(6)("toPrimitive"),o=Date.prototype;n in o||r(15)(o,n,r(204))},function(e,t,r){"use strict";var n=r(3),o=r(27);e.exports=function(e){if("string"!==e&&"number"!==e&&"default"!==e)throw TypeError("Incorrect hint");return o(n(this),"number"!=e)}},function(e,t,r){var n=r(1);n(n.S,"Array",{isArray:r(64)})},function(e,t,r){"use strict";var n=r(22),o=r(1),i=r(12),s=r(103),a=r(77),c=r(7),u=r(78),l=r(79);o(o.S+o.F*!r(51)(function(e){Array.from(e)}),"Array",{from:function(e){var t,r,o,f,d=i(e),y="function"==typeof this?this:Array,h=arguments.length,p=h>1?arguments[1]:void 0,v=void 0!==p,g=0,b=l(d);if(v&&(p=n(p,h>2?arguments[2]:void 0,2)),null==b||y==Array&&a(b))for(r=new y(t=c(d.length));t>g;g++)u(r,g,v?p(d[g],g):d[g]);else for(f=b.call(d),r=new y;!(o=f.next()).done;g++)u(r,g,v?s(f,p,[o.value,g],!0):o.value);return r.length=g,r}})},function(e,t,r){"use strict";var n=r(1),o=r(78);n(n.S+n.F*r(2)(function(){function e(){}return!(Array.of.call(e)instanceof e)}),"Array",{of:function(){for(var e=0,t=arguments.length,r=new("function"==typeof this?this:Array)(t);t>e;)o(r,e,arguments[e++]);return r.length=t,r}})},function(e,t,r){"use strict";var n=r(1),o=r(16),i=[].join;n(n.P+n.F*(r(44)!=Object||!r(17)(i)),"Array",{join:function(e){return i.call(o(this),void 0===e?",":e)}})},function(e,t,r){"use strict";var n=r(1),o=r(65),i=r(24),s=r(33),a=r(7),c=[].slice;n(n.P+n.F*r(2)(function(){o&&c.call(o)}),"Array",{slice:function(e,t){var r=a(this.length),n=i(this);if(t=void 0===t?r:t,"Array"==n)return c.call(this,e,t);for(var o=s(e,r),u=s(t,r),l=a(u-o),f=new Array(l),d=0;d1&&(n=Math.min(n,i(arguments[1]))),n<0&&(n=r+n);n>=0;n--)if(n in t&&t[n]===e)return n||0;return-1}})},function(e,t,r){var n=r(1);n(n.P,"Array",{copyWithin:r(105)}),r(39)("copyWithin")},function(e,t,r){var n=r(1);n(n.P,"Array",{fill:r(80)}),r(39)("fill")},function(e,t,r){"use strict";var n=r(1),o=r(21)(5),i=!0;"find"in[]&&Array(1).find(function(){i=!1}),n(n.P+n.F*i,"Array",{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),r(39)("find")},function(e,t,r){"use strict";var n=r(1),o=r(21)(6),i="findIndex",s=!0;i in[]&&Array(1)[i](function(){s=!1}),n(n.P+n.F*s,"Array",{findIndex:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),r(39)(i)},function(e,t,r){r(40)("Array")},function(e,t,r){var n=r(4),o=r(68),i=r(8).f,s=r(35).f,a=r(75),c=r(52),u=n.RegExp,l=u,f=u.prototype,d=/a/g,y=/a/g,h=new u(d)!==d;if(r(9)&&(!h||r(2)(function(){return y[r(6)("match")]=!1,u(d)!=d||u(y)==y||"/a/i"!=u(d,"i")}))){u=function(e,t){var r=this instanceof u,n=a(e),i=void 0===t;return!r&&n&&e.constructor===u&&i?e:o(h?new l(n&&!i?e.source:e,t):l((n=e instanceof u)?e.source:e,n&&i?c.call(e):t),r?this:f,u)};for(var p=function(e){e in u||i(u,e,{configurable:!0,get:function(){return l[e]},set:function(t){l[e]=t}})},v=s(l),g=0;v.length>g;)p(v[g++]);f.constructor=u,u.prototype=f,r(11)(n,"RegExp",u)}r(40)("RegExp")},function(e,t,r){"use strict";r(108);var n=r(3),o=r(52),i=r(9),s=/./.toString,a=function(e){r(11)(RegExp.prototype,"toString",e,!0)};r(2)(function(){return"/a/b"!=s.call({source:"a",flags:"b"})})?a(function(){var e=n(this);return"/".concat(e.source,"/","flags"in e?e.flags:!i&&e instanceof RegExp?o.call(e):void 0)}):"toString"!=s.name&&a(function(){return s.call(this)})},function(e,t,r){"use strict";var n=r(3),o=r(7),i=r(83),s=r(53);r(54)("match",1,function(e,t,r,a){return[function(r){var n=e(this),o=null==r?void 0:r[t];return void 0!==o?o.call(r,n):new RegExp(r)[t](String(n))},function(e){var t=a(r,e,this);if(t.done)return t.value;var c=n(e),u=String(this);if(!c.global)return s(c,u);var l=c.unicode;c.lastIndex=0;for(var f,d=[],y=0;null!==(f=s(c,u));){var h=String(f[0]);d[y]=h,""===h&&(c.lastIndex=i(u,o(c.lastIndex),l)),y++}return 0===y?null:d}]})},function(e,t,r){"use strict";var n=r(3),o=r(12),i=r(7),s=r(18),a=r(83),c=r(53),u=Math.max,l=Math.min,f=Math.floor,d=/\$([$&`']|\d\d?|<[^>]*>)/g,y=/\$([$&`']|\d\d?)/g,h=function(e){return void 0===e?e:String(e)};r(54)("replace",2,function(e,t,r,p){return[function(n,o){var i=e(this),s=null==n?void 0:n[t];return void 0!==s?s.call(n,i,o):r.call(String(i),n,o)},function(e,t){var o=p(r,e,this,t);if(o.done)return o.value;var f=n(e),d=String(this),y="function"==typeof t;y||(t=String(t));var g=f.global;if(g){var b=f.unicode;f.lastIndex=0}for(var m=[];;){var _=c(f,d);if(null===_)break;if(m.push(_),!g)break;""===String(_[0])&&(f.lastIndex=a(d,i(f.lastIndex),b))}for(var w="",O=0,k=0;k=O&&(w+=d.slice(O,P)+E,O=P+R.length)}return w+d.slice(O)}];function v(e,t,n,i,s,a){var c=n+e.length,u=i.length,l=y;return void 0!==s&&(s=o(s),l=d),r.call(a,l,function(r,o){var a;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(c);case"<":a=s[o.slice(1,-1)];break;default:var l=+o;if(0===l)return r;if(l>u){var d=f(l/10);return 0===d?r:d<=u?void 0===i[d-1]?o.charAt(1):i[d-1]+o.charAt(1):r}a=i[l-1]}return void 0===a?"":a})}})},function(e,t,r){"use strict";var n=r(3),o=r(94),i=r(53);r(54)("search",1,function(e,t,r,s){return[function(r){var n=e(this),o=null==r?void 0:r[t];return void 0!==o?o.call(r,n):new RegExp(r)[t](String(n))},function(e){var t=s(r,e,this);if(t.done)return t.value;var a=n(e),c=String(this),u=a.lastIndex;o(u,0)||(a.lastIndex=0);var l=i(a,c);return o(a.lastIndex,u)||(a.lastIndex=u),null===l?-1:l.index}]})},function(e,t,r){"use strict";var n=r(75),o=r(3),i=r(47),s=r(83),a=r(7),c=r(53),u=r(82),l=Math.min,f=[].push,d=!!function(){try{return new RegExp("x","y")}catch(e){}}();r(54)("split",2,function(e,t,r,y){var h;return h="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,t){var o=String(this);if(void 0===e&&0===t)return[];if(!n(e))return r.call(o,e,t);for(var i,s,a,c=[],l=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),d=0,y=void 0===t?4294967295:t>>>0,h=new RegExp(e.source,l+"g");(i=u.call(h,o))&&!((s=h.lastIndex)>d&&(c.push(o.slice(d,i.index)),i.length>1&&i.index=y));)h.lastIndex===i.index&&h.lastIndex++;return d===o.length?!a&&h.test("")||c.push(""):c.push(o.slice(d)),c.length>y?c.slice(0,y):c}:"0".split(void 0,0).length?function(e,t){return void 0===e&&0===t?[]:r.call(this,e,t)}:r,[function(r,n){var o=e(this),i=null==r?void 0:r[t];return void 0!==i?i.call(r,o,n):h.call(String(o),r,n)},function(e,t){var n=y(h,e,this,t,h!==r);if(n.done)return n.value;var u=o(e),f=String(this),p=i(u,RegExp),v=u.unicode,g=(u.ignoreCase?"i":"")+(u.multiline?"m":"")+(u.unicode?"u":"")+(d?"y":"g"),b=new p(d?u:"^(?:"+u.source+")",g),m=void 0===t?4294967295:t>>>0;if(0===m)return[];if(0===f.length)return null===c(b,f)?[f]:[];for(var _=0,w=0,O=[];w0?arguments[0]:void 0)}},{get:function(e){var t=n.getEntry(o(this,"Map"),e);return t&&t.v},set:function(e,t){return n.def(o(this,"Map"),0===e?0:e,t)}},n,!0)},function(e,t,r){"use strict";var n=r(112),o=r(43);e.exports=r(57)("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return n.def(o(this,"Set"),e=0===e?0:e,e)}},n)},function(e,t,r){"use strict";var n,o=r(21)(0),i=r(11),s=r(28),a=r(93),c=r(113),u=r(5),l=r(2),f=r(43),d=s.getWeak,y=Object.isExtensible,h=c.ufstore,p={},v=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},g={get:function(e){if(u(e)){var t=d(e);return!0===t?h(f(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return c.def(f(this,"WeakMap"),e,t)}},b=e.exports=r(57)("WeakMap",v,g,c,!0,!0);l(function(){return 7!=(new b).set((Object.freeze||Object)(p),7).get(p)})&&(a((n=c.getConstructor(v,"WeakMap")).prototype,g),s.NEED=!0,o(["delete","has","get","set"],function(e){var t=b.prototype,r=t[e];i(t,e,function(t,o){if(u(t)&&!y(t)){this._f||(this._f=new n);var i=this._f[e](t,o);return"set"==e?this:i}return r.call(this,t,o)})}))},function(e,t,r){"use strict";var n=r(113),o=r(43);r(57)("WeakSet",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return n.def(o(this,"WeakSet"),e,!0)}},n,!1,!0)},function(e,t,r){"use strict";var n=r(1),o=r(58),i=r(85),s=r(3),a=r(33),c=r(7),u=r(5),l=r(4).ArrayBuffer,f=r(47),d=i.ArrayBuffer,y=i.DataView,h=o.ABV&&l.isView,p=d.prototype.slice,v=o.VIEW;n(n.G+n.W+n.F*(l!==d),{ArrayBuffer:d}),n(n.S+n.F*!o.CONSTR,"ArrayBuffer",{isView:function(e){return h&&h(e)||u(e)&&v in e}}),n(n.P+n.U+n.F*r(2)(function(){return!new d(2).slice(1,void 0).byteLength}),"ArrayBuffer",{slice:function(e,t){if(void 0!==p&&void 0===t)return p.call(s(this),e);for(var r=s(this).byteLength,n=a(e,r),o=a(void 0===t?r:t,r),i=new(f(this,d))(c(o-n)),u=new y(this),l=new y(i),h=0;n=t.length)return{value:void 0,done:!0}}while(!((e=t[this._i++])in this._t));return{value:e,done:!1}}),n(n.S,"Reflect",{enumerate:function(e){return new i(e)}})},function(e,t,r){var n=r(19),o=r(36),i=r(14),s=r(1),a=r(5),c=r(3);s(s.S,"Reflect",{get:function e(t,r){var s,u,l=arguments.length<3?t:arguments[2];return c(t)===l?t[r]:(s=n.f(t,r))?i(s,"value")?s.value:void 0!==s.get?s.get.call(l):void 0:a(u=o(t))?e(u,r,l):void 0}})},function(e,t,r){var n=r(19),o=r(1),i=r(3);o(o.S,"Reflect",{getOwnPropertyDescriptor:function(e,t){return n.f(i(e),t)}})},function(e,t,r){var n=r(1),o=r(36),i=r(3);n(n.S,"Reflect",{getPrototypeOf:function(e){return o(i(e))}})},function(e,t,r){var n=r(1);n(n.S,"Reflect",{has:function(e,t){return t in e}})},function(e,t,r){var n=r(1),o=r(3),i=Object.isExtensible;n(n.S,"Reflect",{isExtensible:function(e){return o(e),!i||i(e)}})},function(e,t,r){var n=r(1);n(n.S,"Reflect",{ownKeys:r(115)})},function(e,t,r){var n=r(1),o=r(3),i=Object.preventExtensions;n(n.S,"Reflect",{preventExtensions:function(e){o(e);try{return i&&i(e),!0}catch(e){return!1}}})},function(e,t,r){var n=r(8),o=r(19),i=r(36),s=r(14),a=r(1),c=r(29),u=r(3),l=r(5);a(a.S,"Reflect",{set:function e(t,r,a){var f,d,y=arguments.length<4?t:arguments[3],h=o.f(u(t),r);if(!h){if(l(d=i(t)))return e(d,r,a,y);h=c(0)}if(s(h,"value")){if(!1===h.writable||!l(y))return!1;if(f=o.f(y,r)){if(f.get||f.set||!1===f.writable)return!1;f.value=a,n.f(y,r,f)}else n.f(y,r,c(0,a));return!0}return void 0!==h.set&&(h.set.call(y,a),!0)}})},function(e,t,r){var n=r(1),o=r(66);o&&n(n.S,"Reflect",{setPrototypeOf:function(e,t){o.check(e,t);try{return o.set(e,t),!0}catch(e){return!1}}})},function(e,t,r){r(265),e.exports=r(10).Array.includes},function(e,t,r){"use strict";var n=r(1),o=r(48)(!0);n(n.P,"Array",{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),r(39)("includes")},function(e,t,r){r(267),e.exports=r(10).String.padStart},function(e,t,r){"use strict";var n=r(1),o=r(116),i=r(56);n(n.P+n.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(i),"String",{padStart:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0,!0)}})},function(e,t,r){r(269),e.exports=r(10).String.padEnd},function(e,t,r){"use strict";var n=r(1),o=r(116),i=r(56);n(n.P+n.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(i),"String",{padEnd:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0,!1)}})},function(e,t,r){r(271),e.exports=r(61).f("asyncIterator")},function(e,t,r){r(89)("asyncIterator")},function(e,t,r){r(273),e.exports=r(10).Object.getOwnPropertyDescriptors},function(e,t,r){var n=r(1),o=r(115),i=r(16),s=r(19),a=r(78);n(n.S,"Object",{getOwnPropertyDescriptors:function(e){for(var t,r,n=i(e),c=s.f,u=o(n),l={},f=0;u.length>f;)void 0!==(r=c(n,t=u[f++]))&&a(l,t,r);return l}})},function(e,t,r){r(275),e.exports=r(10).Object.values},function(e,t,r){var n=r(1),o=r(117)(!1);n(n.S,"Object",{values:function(e){return o(e)}})},function(e,t,r){r(277),e.exports=r(10).Object.entries},function(e,t,r){var n=r(1),o=r(117)(!0);n(n.S,"Object",{entries:function(e){return o(e)}})},function(e,t,r){"use strict";r(109),r(279),e.exports=r(10).Promise.finally},function(e,t,r){"use strict";var n=r(1),o=r(10),i=r(4),s=r(47),a=r(111);n(n.P+n.R,"Promise",{finally:function(e){var t=s(this,o.Promise||i.Promise),r="function"==typeof e;return this.then(r?function(r){return a(t,e()).then(function(){return r})}:e,r?function(r){return a(t,e()).then(function(){throw r})}:e)}})},function(e,t,r){r(281),r(282),r(283),e.exports=r(10)},function(e,t,r){var n=r(4),o=r(1),i=r(56),s=[].slice,a=/MSIE .\./.test(i),c=function(e){return function(t,r){var n=arguments.length>2,o=!!n&&s.call(arguments,2);return e(n?function(){("function"==typeof t?t:Function(t)).apply(this,o)}:t,r)}};o(o.G+o.B+o.F*a,{setTimeout:c(n.setTimeout),setInterval:c(n.setInterval)})},function(e,t,r){var n=r(1),o=r(84);n(n.G+n.B,{setImmediate:o.set,clearImmediate:o.clear})},function(e,t,r){for(var n=r(81),o=r(32),i=r(11),s=r(4),a=r(15),c=r(38),u=r(6),l=u("iterator"),f=u("toStringTag"),d=c.Array,y={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},h=o(y),p=0;p=0;--i){var s=this.tryEntries[i],a=s.completion;if("root"===s.tryLoc)return n("end");if(s.tryLoc<=this.prev){var c=o.call(s,"catchLoc"),u=o.call(s,"finallyLoc");if(c&&u){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&o.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),L(r),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;L(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:U(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=r),p}}}function _(e,t,r,n){var o=t&&t.prototype instanceof O?t:O,i=Object.create(o.prototype),s=new E(n||[]);return i._invoke=function(e,t,r){var n=f;return function(o,i){if(n===y)throw new Error("Generator is already running");if(n===h){if("throw"===o)throw i;return C()}for(r.method=o,r.arg=i;;){var s=r.delegate;if(s){var a=j(s,r);if(a){if(a===p)continue;return a}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===f)throw n=h,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=y;var c=w(e,t,r);if("normal"===c.type){if(n=r.done?h:d,c.arg===p)continue;return{value:c.arg,done:r.done}}"throw"===c.type&&(n=h,r.method="throw",r.arg=c.arg)}}}(e,r,s),i}function w(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}function O(){}function k(){}function R(){}function P(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function S(e){var t;this._invoke=function(r,n){function i(){return new Promise(function(t,i){!function t(r,n,i,s){var a=w(e[r],e,n);if("throw"!==a.type){var c=a.arg,u=c.value;return u&&"object"==typeof u&&o.call(u,"__await")?Promise.resolve(u.__await).then(function(e){t("next",e,i,s)},function(e){t("throw",e,i,s)}):Promise.resolve(u).then(function(e){c.value=e,i(c)},function(e){return t("throw",e,i,s)})}s(a.arg)}(r,n,t,i)})}return t=t?t.then(i,i):i()}}function j(e,t){var n=e.iterator[t.method];if(n===r){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=r,j(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var o=w(n,e.iterator,t.arg);if("throw"===o.type)return t.method="throw",t.arg=o.arg,t.delegate=null,p;var i=o.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=r),t.delegate=null,p):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function M(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function L(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function E(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(M,this),this.reset(!0)}function U(e){if(e){var t=e[s];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,i=function t(){for(;++n=0;n--){var o=e[n];"."===o?e.splice(n,1):".."===o?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}var n=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,o=function(e){return n.exec(e).slice(1)};function i(e,t){if(e.filter)return e.filter(t);for(var r=[],n=0;n=-1&&!n;o--){var s=o>=0?arguments[o]:e.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(t=s+"/"+t,n="/"===s.charAt(0))}return(n?"/":"")+(t=r(i(t.split("/"),function(e){return!!e}),!n).join("/"))||"."},t.normalize=function(e){var n=t.isAbsolute(e),o="/"===s(e,-1);return(e=r(i(e.split("/"),function(e){return!!e}),!n).join("/"))||n||(e="."),e&&o&&(e+="/"),(n?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(i(e,function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},t.relative=function(e,r){function n(e){for(var t=0;t=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=t.resolve(e).substr(1),r=t.resolve(r).substr(1);for(var o=n(e.split("/")),i=n(r.split("/")),s=Math.min(o.length,i.length),a=s,c=0;c1)for(var r=1;r0)}function I(){return Math.floor(Date.now()/1e3)}function A(e){if(e)return JSON.parse(JSON.stringify(e))}function x(e){var t=e.split("/");return t[0]+"//"+t[2]+"/"+t[3]}function T(e){var t=U(e);return t.identity.replace("/","")+"@"+t.domain}function D(e){var t=e.split("://")[0];return-1===["domain-idp","runtime","domain","hyperty"].indexOf(t)}function H(e){return e.split("@").length>1}function N(e){return e.split("/").length>=3}function B(e){return"hyperty"===U(e).type}function F(e,t,r){return e[t][r]}function K(e,t,r,n){var o,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=e[t];if(!s.hasOwnProperty(r))throw Error("The configuration "+JSON.stringify(s,"",2)+" don't have the "+r+" resource you are looking for");var a=s[r];return n?(o=a.prefix+e.domain+a.suffix+n,a.hasOwnProperty("fallback")&&i&&(o=a.fallback.indexOf("%domain%")?a.fallback.replace(/(%domain%)/g,e.domain)+n:a.fallback+n)):o=a.prefix+e.domain+a.suffix,o}function G(){function e(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}function q(e){var t,r=U(e),n=r.domain.split("."),o=["registry","msg-node"];return n.length>1&&(t=n.filter(function(e){return-1!==o.indexOf(e)})[0]),!(!t||-1===o.indexOf(t))||!!r.type&&-1!==["domain","global","domain-idp"].indexOf(r.type)}function V(e,t,r){e||(e={}),"string"==typeof t&&(t=J(t));for(var n=t.length-1,o=0;o4&&void 0!==arguments[4]?arguments[4]:60;function s(e){throw"[HeartBeat] "+e+" mandatory parameter is missing"}!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),t?this._bus=t:s("bus"),o?this._dataObject=o:s("dataObject"),i?this._heartBeatRate=i:s("heartBeatRate"),n?this._runtimeUrl=n:s("runtimeUrl"),r?this._hypertyUrl=r:s("hypertyUrl"),this.heartbeat=0,this._stop={heartBeat:!1,sync:function(e){var t={from:r,to:n+"/sm",type:"execute",body:{method:"stopSync",params:[o.url]}};console.log("[Heartbeat.stop.sync()] sending msg:",t),e.postMessage(t)}}}return function(e,t,r){t&&de(e.prototype,t)}(e,[{key:"start",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];console.log("[HeartBeat] starting. isReporter: ",r),e||!r?this._getLastHearBeat().then(function(){t._isHeartBeatActive(t.heartBeat,2*t._heartBeatRate)?t._watchHeartBeat(t._heartBeatRate,!0,t._onHertbeatStopped):(console.log("[HeartBeat] heart beats are disabled for ",t._dataObject),t._stop.heartBeat=t._startHeartBeat(t._heartBeatRate),console.log("[HeartBeat] ",t._hypertyUrl," started synching with remote storage server"),t._startSync())}):(this._startHeartBeat(this._heartBeatRate),this._startSync())}},{key:"_getLastHearBeat",value:function(){var e=this;return new Promise(function(t){setTimeout(function(){console.log("[HeartBeat._getLastHearBeat] stop waiting "),t()},1e3*e._heartBeatRate*1.5)})}},{key:"stop",value:function(){this._stop.heartBeat&&this._stop.heartBeat(),this._stop.sync(this._bus)}},{key:"onNewHeartbeat",value:function(e){this.heartbeat=e}},{key:"_isHeartBeatActive",value:function(e,t){var r=I()-e;return console.log("[HeartBeat._isHeartBeatActive] now - lastHeartBeat",r),console.log("[HeartBeat._isHeartBeatActive] ",!(r>2*t)),!(r>2*t)}},{key:"_startHeartBeat",value:function(e){var t=this,r={from:t._hypertyUrl,to:t._dataObject.url+"/children/",type:"create",body:{resource:"heartbeat",mutual:!1,value:I()}};console.log("[HeartBeat._startHeartBeat] starting ... ",r.body.value),this._bus.postMessage(r),this.heartbeat=I();var n=setInterval(function(){var e={from:t._hypertyUrl,to:t._dataObject.url+"/children/",type:"create",body:{resource:"heartbeat",mutual:!1,value:I()}};console.log("[HeartBeat] ",e),t._bus.postMessage(e),this.heartbeat=I()},1e3*e);return function(){clearInterval(n)}}},{key:"_startSync",value:function(){console.log("[HeartBeat._startSync] starting observer sync ",this._dataObject.data);var e=this._dataObject.data.backupRevision;console.log("[HeartBeat._startSync] backupRevision ",e);var t={from:this._hypertyUrl,to:this._runtimeUrl+"/sm",type:"execute",body:{method:"sync",params:[this._dataObject.url,e]}};console.log("[HeartBeat._startSync] sending msg ",t),this._bus.postMessage(t)}},{key:"_watchHeartBeat",value:function(e,t,r){var n=this,o=r;console.log("[HeartBeat._watchHeartBeat] started watching ",n.heartBeat);var i=setInterval(function(){t&&!n._isHeartBeatActive(n.heartBeat,n._heartBeatRate)?(console.log("[HeartBeat._watchHeartBeat] has stopped ",n._dataObject.data),clearInterval(i),o(n)):!t&&this._isHeartBeatActive(n.heartBeat,n._heartBeatRate)&&(console.log("[HeartBeat._watchHeartBeat] has changed to disabled ",n._dataObject.data),clearInterval(i),o())},1e3*e*2)}},{key:"_onHertbeatStopped",value:function(e){e._startHeartBeat(e._heartBeatRate),e._startSync()}},{key:"heartBeat",get:function(){return this.heartbeat?this.heartbeat:0}}]),e}();function he(e){return(he="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function pe(e,t){for(var r=0;r=a&&s>r.width?(a*=r.width/s,s=r.width,c=!0):a>r.height&&(s*=r.height/a,a=r.height,c=!0),c){var u=document.createElement("canvas");if(u.width=s,u.height=a,u.getContext("2d").drawImage(o,0,0,s,a),Pe)u.toBlob(function(e){n(e,!0)},t.type);else{var l=e._toBlob(u,t.type);n(l,!0)}}else n(t,!1)},e._loadImage(o,t),!0}},{key:"_toBlob",value:function(e,t){var r,n=e.toDataURL(t).split(",");r=n[0].indexOf("base64")>=0?atob(n[1]):decodeURIComponent(n[1]);for(var o=new ArrayBuffer(r.length),i=new Uint8Array(o),s=0;st&&(t=e._childrens[r].childId)}),Number(t.split("#")[1])}},{key:"_allocateListeners",value:function(){var e=this,t=this,r=t._url+"/children/";if(Be.log("[Data Object - AllocateListeners] - ",t._childrens),t._childrens)var n=r,o=t._bus.addListener(n,function(r){if(r.from!==e._owner)switch(Be.log("DataObject-Children-RCV: ",r),r.type){case"create":t._onChildCreate(r);break;case"delete":Be.log(r);break;default:t._changeChildren(r)}t._childrenListener=o})}},{key:"_releaseListeners",value:function(){var e=this;e._childrenListener&&(e._childrenListener.remove(),Object.keys(e._childrenObjects).forEach(function(t){e._childrenObjects[t]._releaseListeners()}))}},{key:"sync",value:function(){var e=this,t=this;return Be.info("[DataObject.sync] synchronising "),new Promise(function(r,n){var o={};e.metadata.backupRevision&&(o.backupRevision=e.metadata.backupRevision),t._syncher.read(t._metadata.url,o).then(function(e){Be.info("[DataObject.sync] value to sync: ",e),Object.assign(t.data,A(e.data)),t._version=e.version,t._metadata.lastModified=e.lastModified,e.childrenObjects?(t.resumeChildrens(e.childrenObjects),t._storeChildrens(),r(!0)):r(!0)}).catch(function(e){Be.info("[DataObject.sync] sync failed: ",e),r(!1)})})}},{key:"resumeChildrens",value:function(e){var t=this,r=this,n=this._owner.split("/")[3]+"#"+this._childId,o=e;Object.keys(o).forEach(function(e){var i=!1;"heartbeat"===e||(o[e].hasOwnProperty("value")&&o[e].value.resourceType&&!r._childrenObjects.hasOwnProperty(e)?(r._childrenObjects[e]=r._resumeHypertyResource(o[e]),i=!0):r._childrenObjects.hasOwnProperty(e)||(r._childrenObjects[e]=r._resumeChild(o[e]),Be.log("[DataObject.resumeChildrens] new DataObjectChild: ",r._childrenObjects[e]),i=!0)),i&&e>n&&(n=e,Be.log("[DataObjectReporter.resumeChildrens] - resuming: ",t._childrenObjects[e]))}),this._childId=Number(n.split("#")[1])}},{key:"_resumeChild",value:function(e){var t=e.value;t.parentObject=this,t.parent=this._url;var r=new fe(t);r.identity=e.identity;var n={type:"create",from:r.reporter,url:r.parent,value:r.data,childId:r.url,identity:r.identity,child:r};return r.resourceType&&(n.resource=r),this._onAddChildrenHandler&&this._onAddChildrenHandler(n),r}},{key:"_resumeHypertyResource",value:function(e){var t=e.value;t.parentObject=this,t.parent=this._url;var r=this._hypertyResourceFactory.createHypertyResource(!1,t.resourceType,t);r.identity=e.identity;var n={type:"create",from:r.reporter,url:r.parent,value:r.data,childId:r.url,identity:r.identity,child:r};return r.resourceType&&(n.resource=r),this._onAddChildrenHandler&&this._onAddChildrenHandler(n),r}},{key:"pause",value:function(){throw"Not implemented"}},{key:"resume",value:function(){throw"Not implemented"}},{key:"stop",value:function(){throw"Not implemented"}},{key:"addChild",value:function(e,t,r){var n,o=this;return new Promise(function(i){var s=o._url+"/children/",a=o._getChildInput(r);a.data=e,n=new fe(a),t&&(n.identity=t),n.share(),console.log("[DataObject.addChild] added ",n),n.onChange(function(e){o._onChange(e,{path:s,childId:a.url})}),o._childrenObjects[a.url]=n,i(n)})}},{key:"_deleteChildrens",value:function(){var e=this,t=[];return new Promise(function(r){if(e.childrens){var n;for(n in Be.log("[DataObject.deleteChildrens]",e.childrens),e.childrens){var o=e.childrens[n];Be.log("[DataObject._deleteChildrens] child",o),o.metadata.hasOwnProperty("resourceType")&&t.push(e.childrens[n].delete())}Be.log("[DataObject._deleteChildrens] promises ",t),t.length>0?Promise.all(t).then(function(){r("[DataObject._deleteChildrens] done")}):r("[DataObject._deleteChildrens] nothing to delete")}})}},{key:"_getChildInput",value:function(e){var t=Object.assign({},e);return this._childId++,t.url=this._owner.split("/")[3]+"#"+this._childId,t.parentObject=this,t.reporter=this._owner,t.created=(new Date).toISOString(),t.runtime=this._syncher._runtimeUrl,t.p2pHandler=this._syncher._p2pHandler,t.p2pRequester=this._syncher._p2pRequester,t.schema=this._schema,t.parent=this.url,t.mutual=this.metadata.mutual,t}},{key:"addHypertyResource",value:function(e,t,r,n){var o=this;return new Promise(function(i){var s,a=o._url+"/children/",c=o._getChildInput(n);o._hypertyResourceFactory.createHypertyResourceWithContent(!0,e,t,c).then(function(e){s=e,r&&(s.identity=r),s.share(),Be.log("[DataObject.addHypertyResource] added ",s),s.onChange(function(e){o._onChange(e,{path:a,childId:s.childId})}),o._childrenObjects[s.childId]=s,i(s)})})}},{key:"onAddChild",value:function(e){this._onAddChildrenHandler=e}},{key:"_onChildCreate",value:function(e){if("heartbeat"===e.body.resource)console.log("[DataObject._onChildCreate] new heartbeat received "+e.body.value),this._heartBeat.onNewHeartbeat(e.body.value);else{console.log("[DataObject._onChildCreate] new child receivedBy "+this._owner+" : ",e);var t={from:e.to,to:e.from,type:"response",id:e.id,body:{code:100}};this._bus.postMessage(t),e.body.value.resourceType?this._onHypertyResourceAdded(e):this._onChildAdded(e)}}},{key:"_onChildAdded",value:function(e){var t=A(e.body.value);t.parentObject=this;var r=new fe(t);r.identity=e.body.identity,this._childrenObjects[t.url]=r,e.to===this.metadata.url&&r.store(),this._hypertyEvt(e,r)}},{key:"_onHypertyResourceAdded",value:function(e){var t,r=e.body.value;r.parentObject=this,(t=this._hypertyResourceFactory.createHypertyResource(!1,r.resourceType,r)).identity=e.body.identity,this._childrenObjects[t.childId]=t,this._hypertyEvt(e,t),e.to===this.metadata.url&&t.store()}},{key:"_hypertyEvt",value:function(e,t){var r={type:e.type,from:e.from,url:e.to,value:t.data,childId:t.url,identity:e.body.identity,child:t};t.resourceType&&(r.resource=t),this._onAddChildrenHandler&&this._onAddChildrenHandler(r)}},{key:"_onChange",value:function(e,t){if(this._metadata.lastModified=(new Date).toISOString(),this._version++,"live"===this._status){var r={type:"update",from:this._url,to:this._url+"/changes",body:{version:this._version,source:this._owner,attribute:e.field,lastModified:this._metadata.lastModified}};Be.log("[DataObject - _onChange] - ",e,t,r),e.oType===ae.OBJECT?e.cType!==se.REMOVE&&(r.body.value=A(e.data)):(r.body.attributeType=e.oType,r.body.value=e.data,e.cType!==se.UPDATE&&(r.body.operation=e.cType)),t&&(r.to=t.path,r.body.resource=t.childId),this.data._mutual||(r.body.mutual=this._mutual),this._bus.postMessage(r)}}},{key:"_changeObject",value:function(e,t){if(this._version+1<=t.body.version){this._version=t.body.version;var r,n=t.body.attribute;r="object"===He(t.body.value)?A(t.body.value):t.body.value;var o=e.findBefore(n);if(t.body.lastModified?this._metadata.lastModified=t.body.lastModified:this._metadata.lastModified=(new Date).toISOString(),t.body.attributeType===ae.ARRAY)if(t.body.operation===se.ADD){var i=o.obj,s=o.last;Array.prototype.splice.apply(i,[s,0].concat(r))}else if(t.body.operation===se.REMOVE){var a=o.obj,c=o.last;a.splice(c,r)}else o.obj[o.last]=r;else t.body.hasOwnProperty("value")?o.obj[o.last]=r:delete o.obj[o.last]}else Be.log("UNSYNCHRONIZED VERSION: (data => "+this._version+", msg => "+t.body.version+")")}},{key:"_changeChildren",value:function(e){U(e.to).identity;var t=e.body.resource,r=this._childrenObjects[t];Be.log("Change children: ",this._owner,e,resource),r?this._changeObject(r._syncObj,e):Be.warn("No children found for: ",t)}},{key:"metadata",get:function(){return this._metadata}},{key:"url",get:function(){return this._url}},{key:"schema",get:function(){return this._schema}},{key:"status",get:function(){return this._status}},{key:"data",get:function(){return this._syncObj.data}},{key:"childrens",get:function(){return this._childrenObjects}}]),e}();function Ke(e){return(Ke="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ge(e,t){for(var r=0;r0&&(Ye.log("[Syncher.DataObjectReporter] InviteObservers ",n,r._metadata),n.forEach(function(e){var n=new Promise(function(n,o){var i={type:"create",from:r._syncher._owner,to:r._syncher._subURL,body:{resume:!1,resource:r._url,schema:r._schema,value:r._metadata,authorise:[e]}};t&&(i.body.p2p=t),r.data.mutual||(i.body.mutual=r.data.mutual),r._bus.postMessage(i,function(t){Ye.log("[Syncher.DataObjectReporter] Invitation reply ",t);var r={invited:e,code:t.body&&t.body.code?t.body.code:500,desc:t.body&&t.body.desc?t.body.desc:"Unknown"};r.code<300?n(r):o(r)})});r.invitations.push(n)}))}},{key:"delete",value:function(){var e=this;e._heartBeat&&e._heartBeat.stop(),e._deleteChildrens().then(function(t){Ye.log(t);var r={type:"delete",from:e._owner,to:e._syncher._subURL,body:{resource:e._url}};e._bus.postMessage(r,function(t){Ye.log("DataObjectReporter-DELETE: ",t),200===t.body.code&&(e._releaseListeners(),delete e._syncher._reporters[e._url],e._syncObj={})})})}},{key:"onSubscription",value:function(e){this._onSubscriptionHandler=e}},{key:"onResponse",value:function(e){this._onResponseHandler=e}},{key:"onRead",value:function(e){this._onReadHandler=e}},{key:"onExecute",value:function(e){this._onExecuteHandler=e}},{key:"_onForward",value:function(e){switch(Ye.log("DataObjectReporter-RCV: ",e),e.body.type){case"subscribe":this._onSubscribe(e);break;case"unsubscribe":this._onUnSubscribe(e)}}},{key:"_onSubscribe",value:function(e){var t=this,r=e.body.from,n=U(r),o=n.domain,i=!0;e.body.hasOwnProperty("mutual")&&!e.body.mutual&&(i=!1),console.log("[DataObjectReporter._onSubscribe]",e,o,n);var s={type:e.body.type,url:r,domain:o,identity:e.body.identity,nutual:i,accept:function(){var n={url:r,status:"live"};t._subscriptions[r]=n,t.metadata.subscriptions&&t.metadata.subscriptions.push(n.url);var o=A(t._metadata);o.data=A(t.data),o.version=t._version;var i={id:e.id,type:"response",from:e.to,to:e.from,body:{code:200,schema:t._schema,value:o}};return e.body.hasOwnProperty("mutual")&&!e.body.mutual&&(i.body.mutual=e.body.mutual,t.data.mutual=!1),t._heartBeat&&(i.body.value.childrenObjects={},i.body.value.childrenObjects.heartbeat=t._heartBeat.heartbeat),console.log("[DataObjectReporter._onSubscribe.accept] sending response: ",i),t._bus.postMessage(i),n},reject:function(r){t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:403,desc:r}})}};t._onSubscriptionHandler&&(Ye.log("SUBSCRIPTION-EVENT: ",s),t._onSubscriptionHandler(s))}},{key:"_onUnSubscribe",value:function(e){var t=e.body.from,r=U(t),n=r.domain;Ye.log("[DataObjectReporter._onUnSubscribe]",e,n,r),delete this._subscriptions[t],delete this.invitations[t];var o={type:e.body.type,url:t,domain:n,identity:e.body.identity};this._onSubscriptionHandler&&(Ye.log("UN-SUBSCRIPTION-EVENT: ",o),this._onSubscriptionHandler(o))}},{key:"_onResponse",value:function(e){var t={type:e.type,url:e.from,code:e.body.code};this._onResponseHandler&&(Ye.log("RESPONSE-EVENT: ",t),this._onResponseHandler(t))}},{key:"_onRead",value:function(e){var t=this,r=JSON.stringify(t.childrensJSON).length>t._childrenSizeThreshold,n={type:e.type,url:e.from,accept:function(){r?t._syncReplyForLargeData(e):t._syncReply(e)},reject:function(r){t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:401,desc:r}})}},o=[];t.metadata.subscriptions?o=t.metadata.subscriptions:t._subscriptions&&(o=Object.keys(t._subscriptions).map(function(e){return t._subscriptions[e].url})),-1!=o.indexOf(e.from)?r?t._syncReplyForLargeData(e):t._syncReply(e):t._onReadHandler&&(Ye.log("READ-EVENT: ",n),t._onReadHandler(n))}},{key:"_syncReply",value:function(e){var t=A(this.metadata);t.data=A(this.data),t.childrenObjects=A(this.childrensJSON),t.version=this._version;var r={id:e.id,type:"response",from:e.to,to:e.from,body:{code:200,value:t}};this._bus.postMessage(r)}},{key:"_syncReplyForLargeData",value:function(e){var t=this,r=A(t.metadata);r.data=A(t.data),r.version=t._version,delete r.childrenObjects;var n=[],o={};for(child in t._childrenObjects)o[child]={},JSON.stringify(o).length>t._childrenSizeThreshold&&n.push(o),o[child]={},o[child].value=t._childrenObjects[child].metadata,o[child].identity=t._childrenObjects[child].identity;n.push(o),r.responses=n.length+1;var i={id:e.id,type:"response",from:e.to,to:e.from,body:{code:100,value:r}};t._bus.postMessage(i),n.forEach(function(e){var n=A(i);n.body.value=e,n.body.value.responses=r.responses,setTimeout(function(){t._bus.postMessage(n)},50)})}},{key:"_onExecute",value:function(e){var t=this;if(!e.body.method)throw e;var r={id:e.id,type:"response",from:e.to,to:e.from,body:{code:200}},n={type:e.type,url:e.from,method:e.body.method,params:e.body.params,accept:function(){t._bus.postMessage(r)},reject:function(r){t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:401,desc:r}})}};t._onExecuteHandler&&(Ye.log("[DataObjectReporter] EXECUTE-EVENT: ",n),t._onExecuteHandler(n))}},{key:"subscriptions",get:function(){return this._subscriptions}},{key:"childrensJSON",get:function(){var e,t={};for(e in this._childrenObjects)t[e]={},t[e].value=this._childrenObjects[e].metadata,t[e].identity=this._childrenObjects[e].identity;return t}}]),t}();function $e(e){return($e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Xe(e,t){for(var r=0;r3&&void 0!==arguments[3]&&arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"no name",s=arguments.length>6?arguments[6]:void 0,a=arguments.length>7?arguments[7]:void 0;if(!e)throw Error("[Syncher - Create] - You need specify the data object schema");if(!t)throw Error("[Syncher - Create] -The observers should be defined");a=a||{};var c=Object.assign({},a);return c.p2p=o,c.store=n,c.schema=e,c.authorise=t,c.p2pHandler=this._p2pHandler,c.p2pRequester=this._p2pRequester,c.data=r?A(r):{},c.name=0===i.length?"no name":i,c.reporter=a.hasOwnProperty("reporter")&&"boolean"!=typeof a.reporter?a.reporter:this._owner,c.resume=!1,a?(c.mutual=!!a.hasOwnProperty("mutual")&&a.mutual,c.name=a.hasOwnProperty("name")?a.name:c.name):c.mutual=!1,a.hasOwnProperty("reuseURL")&&(c.resource=a.reuseURL),s&&(c.identity=s),this._create(c)}},{key:"resumeReporters",value:function(e){return ct.log("[syncher - create] - resume Reporter - criteria: ",e),Object.assign(e,{resume:!0}),this._resumeCreate(e)}},{key:"subscribe",value:function(e){return this._subscribe(e)}},{key:"resumeObservers",value:function(e){var t=e||{};return Object.assign(t,{resume:!0}),this._resumeSubscribe(t)}},{key:"read",value:function(e,t){var r=this;return console.log("[Syncher.read] ",e),new Promise(function(t,n){r._readReporter(e).then(function(e){t(e)})})}},{key:"_readCallBack",value:function(e,t,r){console.log("[Syncher.read] reply: ",e);var n={},o={},i=0;if(e.body.code<300)if(e.body.value.hasOwnProperty("responses"))if(0===i)o=e.body.value,++i;else{var s;for(s in delete e.body.value.responses,e.body.value)n.hasOwnProperty(s)||(n[s]={}),Object.assign(n[s],e.body.value[s]);++i===o.responses&&(o.childrenObjects=n,delete o.responses,this._bus.removeResponseListener(e.from,e.id),t(o))}else this._bus.removeResponseListener(e.from,e.id),t(e.body.value);else r(e.body.desc)}},{key:"_readReporter",value:function(e){var t=this,r={type:"read",from:t._owner,to:e};return new Promise(function(e,n){t._bus.postMessage(r,function(r){return t._readCallBack(r,e,n)},!1)})}},{key:"onNotification",value:function(e){this._onNotificationHandler=e}},{key:"onClose",value:function(e){this._onClose=e}},{key:"_create",value:function(e){var t=this;return new Promise(function(r,n){var o=Object.assign({},e),i=e.resume;o.created=(new Date).toISOString(),o.runtime=t._runtimeUrl;var s=A(o);delete s.p2p,delete s.store,delete s.observers,delete s.identity;var a={type:"create",from:t._owner,to:t._subURL,body:{resume:i,value:s}};a.body.schema=o.schema,o.p2p&&(a.body.p2p=o.p2p),o.store&&(a.body.store=o.store),o.identity&&(a.body.identity=o.identity),console.log("[syncher._create]: ",o,a),t._bus.postMessage(a,function(i){if(ct.log("[syncher - create] - create-response: ",i),200===i.body.code){o.url=i.body.resource,o.status="live",o.syncher=t,o.childrens=i.body.childrenResources;var s=t._reporters[o.url];s||(s=new ze(o),t._reporters[o.url]=s),s.inviteObservers(e.authorise,e.p2p),r(s)}else n(i.body.desc)})})}},{key:"_resumeCreate",value:function(e){var t=this,r=this;return new Promise(function(n,o){var i=e.resume,s={type:"create",from:r._owner,to:r._subURL,body:{resume:i}};ct.log("[syncher - create]: ",e,s),e&&(s.body.value=e,e.hasOwnProperty("reporter")?s.body.value.reporter=e.reporter:s.body.value.reporter=r._owner),e.p2p&&(s.body.p2p=e.p2p),e.store&&(s.body.store=e.store),e.observers&&(s.body.authorise=e.observers),e.identity&&(s.body.identity=e.identity),ct.log("[syncher._resumeCreate] - resume message: ",s),r._bus.postMessage(s,function(e){if(ct.log("[syncher._resumeCreate] - create-resumed-response: ",e),200===e.body.code){var i=e.body.value;for(var s in i){var a=i[s];a.data=A(a.data)||{},a.childrenObjects&&(a.childrenObjects=A(a.childrenObjects)),a.mutual=!1,a.resume=!0,a.status="live",a.syncher=r,ct.log("[syncher._resumeCreate] - create-resumed-dataObjectReporter",a);var c=new ze(a);a.childrenObjects&&c.resumeChildrens(a.childrenObjects),r._reporters[a.url]=c}n(r._reporters),t._onReportersResume&&t._onReportersResume(t._reporters)}else 404===e.body.code?n({}):o(e.body.desc)})})}},{key:"_subscribe",value:function(e){var t=this;return new Promise(function(r,n){var o={type:"subscribe",from:t._owner,to:t._subURL,body:e};ct.log("[syncher_subscribe] - subscribe message: ",e,o),t._bus.postMessage(o,function(o){ct.log("[syncher] - subscribe-response: ",o);var i=o.body.resource,s=t._provisionals[i];if(delete t._provisionals[i],s&&s._releaseListeners(),o.body.code<200)ct.log("[syncher] - new DataProvisional: ",o.body.childrenResources,i),s=new st(t._owner,i,t._bus,o.body.childrenResources),t._provisionals[i]=s;else if(200===o.body.code){ct.log("[syncher] - new Data Object Observer: ",o,t._provisionals);var a=o.body.value;a.syncher=t,a.p2p=e.p2p,a.store=e.store,a.identity=e.identity,a.resume=!1,a.mutual=e.mutual;var c=t._observers[i];c?c.sync():(c=new nt(a),t._observers[i]=c),ct.log("[syncher] - new Data Object Observer already exist: ",c),r(c),s&&s.apply(c)}else n(o.body.desc)})})}},{key:"_resumeSubscribe",value:function(e){var t=this,r=this;return new Promise(function(n,o){var i={type:"subscribe",from:r._owner,to:r._subURL,body:{}};e&&(e.hasOwnProperty("p2p")&&(i.body.p2p=e.p2p),e.hasOwnProperty("store")&&(i.body.store=e.store),e.hasOwnProperty("schema")&&(i.body.schema=e.schema),e.hasOwnProperty("identity")&&(i.body.identity=e.identity),e.hasOwnProperty("resource")&&(i.body.resource=e.resource)),i.body.resume=e.resume;var s=e.mutual;e.hasOwnProperty("mutual")&&(i.body.mutual=s),console.log("[syncher] - subscribe message: ",e,i),r._bus.postMessage(i,function(e){console.log("[syncher] - subscribe-resumed-response: ",e);var i=e.body.resource,s=r._provisionals[i];if(delete r._provisionals[i],s&&s._releaseListeners(),e.body.code<200)ct.log("[syncher] - resume new DataProvisional: ",e,i),s=new st(r._owner,i,r._bus,e.body.childrenResources),r._provisionals[i]=s;else if(200===e.body.code){var a=e.body.value;for(var c in a){var u=a[c];console.log("[syncher] - Resume Object Observer: ",e,u,r._provisionals),u.childrenObjects&&(u.childrenObjects=A(u.childrenObjects)),u.data=A(u.data)||{},u.resume=!0,u.syncher=r,console.log("[syncher._resumeSubscribe] - create new dataObject: ",u);var l=new nt(u);u.childrenObjects&&l.resumeChildrens(u.childrenObjects),ct.log("[syncher._resumeSubscribe] - new dataObject",l),r._observers[l.url]=l,r._provisionals[l.url]&&r._provisionals[l.url].apply(l)}n(r._observers),t._onObserversResume&&t._onObserversResume(r._observers)}else 404===e.body.code?n({}):o(e.body.desc)})})}},{key:"_onForward",value:function(e){this._reporters[e.body.to]._onForward(e)}},{key:"_onRemoteCreate",value:function(e){var t=this,r=e.from.slice(0,-13),n=U(r).domain,o={type:e.type,from:e.body.source,url:r,domain:n,schema:e.body.schema,value:e.body.value,identity:e.body.identity,ack:function(r){var n=200;r&&(n=r),t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:n}})}};t._onNotificationHandler&&(ct.info("[Syncher] NOTIFICATION-EVENT: ",o),t._onNotificationHandler(o))}},{key:"_onRemoteDelete",value:function(e){var t=this,r=e.body.resource,n=t._observers[r],o={from:t.owner,to:t._subURL,id:e.id,type:"unsubscribe",body:{resource:e.body.resource}};if(t._bus.postMessage(o),delete t._observers[r],n){var i={type:e.type,url:r,identity:e.body.identity,ack:function(r){var o=200;r&&(o=r),200===o&&n.delete(),t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:o,source:t._owner}})}};t._onNotificationHandler&&(ct.log("NOTIFICATION-EVENT: ",i),t._onNotificationHandler(i))}else t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:404,source:t._owner}})}},{key:"_onExecute",value:function(e){var t=this,r={id:e.id,type:"response",from:e.to,to:e.from,body:{code:200}};if((e.from===t._runtimeUrl+"/registry/"||e.from===t._runtimeUrl+"/registry")&&e.body&&e.body.method&&"close"===e.body.method&&t._onClose){var n={type:"close",ack:function(e){e&&(r.body.code=e),t._bus.postMessage(r)}};ct.info("[Syncher] Close-EVENT: ",n),t._onClose(n)}else t._bus.postMessage(r)}},{key:"onReportersResume",value:function(e){this._onReportersResume=e}},{key:"onObserversResume",value:function(e){this._onObserversResume=e}},{key:"owner",get:function(){return this._owner}},{key:"reporters",get:function(){return this._reporters}},{key:"observers",get:function(){return this._observers}}]),e}();function lt(e,t){for(var r=0;r299)return Pt.warn("[Discovery.discoverDataObject] Error Reply for "+e+" Reason: ",r.body.description),t([]);var n=r.body.value;t(n||[])})})}},{key:"discoverHyperty",value:function(e,t,r,n){var o,i=this,s=function(e){if("user://"===e.substring(0,7)){var t=U(e);if(t.domain&&t.identity)return e;throw"userURL with wrong format"}return function(e){var t=e.indexOf("@");return"user://"+e.substring(t+1,e.length)+"/"+e.substring(0,t)}(e)}(e);return o=n||i.domain,new Promise(function(a,c){if(Pt.log("[Discovery.discoverHyperty] ACTIVE DOMAIN -> ",o,"user->",e,"schema->",t,"resources->",r,"domain->",n),e.includes(":")&&!e.includes("user://"))return Pt.log("[Discovery.discoverHyperty] "+e+" is legacy domain"),a({userID:e,hypertyID:e,schema:t,resources:r});var u={type:"read",from:i.discoveryURL,to:"domain://registry."+o,body:{resource:s,criteria:{resources:r,dataSchemes:t}}};Pt.info("[Discovery] msg to send->",u),i.messageBus.postMessage(u,function(e){Pt.info("[Discovery] ON discoverHyperty->",e);var t=e.body.value;t?a(t):c("No Hyperty was found")})})}},{key:"discoverHypertyPerUser",value:function(e,t){var r,n=this;return new Promise(function(o,i){if(e.includes(":")&&!e.includes("user://"))return Pt.log("[Discovery.discoverHyperty] "+e+"is legacy domain"),o({id:e,hypertyURL:e,descriptor:"unknown"});r=t||n.domain;var s="user://"+e.substring(e.indexOf("@")+1,e.length)+"/"+e.substring(0,e.indexOf("@")),a={type:"read",from:n.discoveryURL,to:"domain://registry."+r,body:{resource:s}};Pt.info("[Discovery] Message: ",a,r,s),n.messageBus.postMessage(a,function(t){var r,n,s;Pt.info("[Discovery] message reply",t);var a=t.body.value;for(r in a)if(void 0!==a[r].lastModified)if(void 0===n)n=new Date(a[r].lastModified),s=r;else{var c=new Date(a[r].lastModified);n.getTime() hypertyDiscovery messageBundle: ",l),o(l)})})}},{key:"discoverHypertiesPerUser",value:function(e,t){var r,n=this;return Pt.log("on Function->",e),new Promise(function(o,i){if(e.includes(":")&&!e.includes("user://")){Pt.log("[Discovery.discoverHyperty] is legacy domain");var s={userID:e,hypertyID:e,schema:schema,resources:resources};return o(s)}r=t||n.domain;var a="user://"+e.substring(e.indexOf("@")+1,e.length)+"/"+e.substring(0,e.indexOf("@")),c={type:"read",from:n.discoveryURL,to:"domain://registry."+r,body:{resource:a}};Pt.log("[Discovery] Message discoverHypertiesPerUser: ",c,r,a),n.messageBus.postMessage(c,function(e){Pt.info("[Discovery] discoverHypertiesPerUser reply",e);var t=e.body.value;if(!t)return i("User Hyperty not found");o(t)})})}},{key:"resumeDiscoveries",value:function(){var e=this;return Pt.log("[Discovery] resumeDiscoveries"),new Promise(function(t,r){var n={type:"read",from:e.discoveryURL,to:e.runtimeURL+"/subscriptions",body:{resource:e.discoveryURL}};e.messageBus.postMessage(n,function(r){Pt.log("[Discovery.resumeDiscoveries] reply: ",r);var n=[];200===r.body.code?(r.body.value.forEach(function(t){var r=t.split("/registration")[0];Pt.log("[Discovery.resumeDiscoveries] adding listener to: ",r),r.includes("hyperty://")?n.push(e.discoverHypertyPerURLDO(r)):n.push(e.discoverDataObjectPerURLDO(r))}),Promise.all(n).then(function(e){t(e)})):t([])})})}}]),e}();function jt(e,t){for(var r=0;r3&&void 0!==arguments[3]&&arguments[3]}},{key:"users",value:function(e,t,r,n){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(!e)throw new Error("You need to provide a list of users");if(!t)throw new Error("You need to provide a list of domains");if(!n)throw new Error("You need to provide a list of resources");if(!r)throw new Error("You need to provide a list of schemes");var i=this;return new Promise(function(s,a){if(console.info("[Search] Users: ",e,e.length),console.info("[Search] Domains: ",t,t.length),0===e.length)console.info("Don't have users to discovery"),s(e);else{var c=[];e.forEach(function(e,s){var a=t[s];console.info("[Search] Search user "+e+" for provided domain:",a),o?c.push(i.discovery.discoverHypertiesPerUserProfileData(e,r,n)):c.push(i.discovery.discoverHyperties(e,r,n,a))}),console.info("Requests promises: ",c),Promise.all(c.map(function(e){return e.then(function(e){return e},function(e){return e})})).then(function(e){console.info("[Search] Hyperties from new Discovery",e);var t=e.map(function(e){if(e.hasOwnProperty("hypertyID"))return e;var t=Object.keys(e).reduceRight(function(t,r){var n=new Date(e[r].lastModified);return new Date(e[t].lastModified).getTime()",e),c._domain=i.divideURL(n.runtimeURL).domain,c._objectDescURL="hyperty-catalogue://catalogue."+c._domain+"/.well-known/dataschema/Context",c._users2observe=[],c._observers={},a._syncher=s||i.createSyncher(e,r,n);var u=i.createDiscovery(e,n.runtimeURL,r);return c._discovery=u,c._discoveries={},window.discovery=c._discovery,a}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&At(e,t)}(t,Et),function(e,t,r){t&&Ct(e.prototype,t)}(t,[{key:"start",value:function(e,t){var r=this;return console.log("[ContextObserver.start] "),new Promise(function(n,o){r._syncher.resumeObservers({store:!0}).then(function(o){var i=Object.keys(o);i.length>0?(console.log("[ContextObserver.start] resuming: ",o),r._observers=o,n(o),i.forEach(function(r){var n=o[r];e&&(context.data.values=e),n.sync(),t&&n.onDisconnected(t)})):n(!1)}).catch(function(e){console.info("[ContextObserver] Resume Observer failed | ",e),n(!1)})}).catch(function(e){reject("[ContextObserver] Start failed | ",e)})}},{key:"resumeDiscoveries",value:function(){var e=this;return new Promise(function(t,r){e._discovery.resumeDiscoveries().then(function(r){console.log("[ContextObserver._resumeDiscoveries] found: ",r),r.forEach(function(r){r.data.resources&&r.data.resources[0]===e._contextResourceTypes[0]&&(console.log("[ContextObserver._resumeDiscoveries] resuming: ",r),"live"===r.data.status?(t([r.data]),r.unsubscribeLive(e._url)):r.onLive(e._url,function(){console.log("[ContextObserver._resumeDiscoveries] disconnected Hyperty is back to live",r),t([r.data]),r.unsubscribeLive(e._url)}))})})}).catch(function(e){reject("[ContextObserver] resumeDiscoveries failed | ",e)})}},{key:"onResumeObserver",value:function(e){this._onResumeObserver=e}},{key:"discoverUsers",value:function(e,t){var r=this,n=e+"@"+t;return r._discoverUsersPromises[n]||(r._discoverUsersPromises[n]=new Promise(function(n,o){r._discovery.discoverHypertiesDO(e,["context"],r._contextResourceTypes,t).then(function(e){console.log("[ContextObserver.discoverUsers] discovery result->",e);var t=[],o=[];e.forEach(function(e){r._discoveries[e.data.hypertyID]=e,"live"===e.data.status?t.push(e.data):o.push(e)}),t.length>0?(console.log("[ContextObserver.discoverUsers] returning discovered hyperties data->",t),n(t)):o.length>0&&(console.log("[ContextObserver.discoverUsers] disconnected Hyperties ",o),o[0].onLive(r._url,function(){console.log("[ContextObserver.discoverUsers] disconnected Hyperty is back to live",o[0]),t.push(o[0].data),n(t),o[0].unsubscribeLive(r._url)}))})})),r._discoverUsersPromises[n]}},{key:"observe",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=this;return r._observePromises[e.hypertyID]||(r._observePromises[e.hypertyID]=new Promise(function(n,o){r._users2observe.forEach(function(t){if(t._reporter===e.hypertyID)return n(t)}),r._discovery.discoverDataObjectsPerReporter(e.hypertyID,["context"],r._contextResourceTypes,r._domain).then(function(i){console.log("[ContextObserver.discoverAvailability] discovered context objects ",i);var s,a=0;i.forEach(function(e){e.hasOwnProperty("lastModified")&&e.hasOwnProperty("url")&&Date.parse(e.lastModified)>a&&(a=e.lastModified,s=e.url)}),0!=a&&s?n(r._subscribeContext(e,s,t)):o("[ContextObserver.observe] discovered DataObjecs are invalid",i)})})),r._observePromises[e.hypertyID]}},{key:"_subscribeContext",value:function(e,t){var r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=this;return new Promise(function(e,o){n._users2observe.forEach(function(r){if(r.url===t)return e(r)});var i={schema:n._objectDescURL,resource:t,store:null,p2p:null,mutual:null,domain_subscription:r};n._syncher.subscribe(i).then(function(t){console.log("[ContextObserver._subscribeContext] observer object",t),n._users2observe.push(t),t.onDisconnected(function(){console.log("[ContextObserver.onDisconnected]: ",t),t.data.values[0].value="unavailable",t.sync()}),e(t)})})}},{key:"_discoverAndSubscribeLegacyUsers",value:function(e){var t=this;return new Promise(function(r,n){t._discovery.discoverDataObjectsPerName(e).then(function(e){console.log("[ContextObserver._discoverAndSubscribeLegacyUsers] All DataObjects Result",e),e.forEach(function(e){"live"===e.status&&(console.log("Live obj",e),e.hypertyID||(e.hypertyID=e.reporter),t._subscribeContext(e.schema,e.url).then(function(e){return console.log("[ContextObserver._discoverAndSubscribeLegacyUsers] _subscribeContext",e),r(e)}))})}).catch(function(e){console.log("error ",e)})})}},{key:"unobserve",value:function(e){var t=this;t._users2observe.forEach(function(r,n){r.url===e&&(r.unsubscribe(),t._users2observe.splice(n,1))})}}]),t}();function Dt(e){return(Dt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ht(e,t){for(var r=0;r0?(console.log("[ContextReporter.start] resuming ",e[n[0]]),t.contexts=e,n.forEach(function(e){t._onSubscription(t.contexts[e])}),r(t.contexts)):(console.log("[ContextReporter.start] nothing to resume ",e),r(!1))}).catch(function(e){console.error("[ContextReporter] Resume failed | ",e)})}).catch(function(e){reject("[ContextReporter] Start failed | ",e)})}},{key:"processNotification",value:function(e){console.log("[ContextReporter.processNotification: ",e),e.ack()}},{key:"create",value:function(e,t,r){var n,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"myContext",i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,a=this;return new Promise(function(c,u){n=i||s?i&&!s?{resources:r,expires:30,reporter:i}:!i&&s?{resources:r,expires:30,reuseURL:s}:{resources:r,expires:30,reuseURL:s,reporter:i}:{resources:r,expires:30},console.info("[ContextReporter.create] lets create a new User availability Context Object ",n),a.syncher.create(a.contextDescURL,[],t,!0,!1,o,null,n).then(function(t){a.contexts[e]=t,a._onSubscription(t),c(t)}).catch(function(e){u(e)})})}},{key:"_onSubscription",value:function(e){e.onSubscription(function(e){console.info("[ContextReporter._onSubscription] accepting: ",e),e.accept()})}},{key:"setContext",value:function(e,t){console.log("THIS [ContextReporter.setContext] before change :",this.contexts[e]),console.log("[ContextReporter.setContext] before change :",this.contexts[e].data),this.contexts[e].data.values=t,console.debug("[ContextReporter.setContext] after change :",this.contexts[e].data),this.trigger(e+"-context-update",t)}}]),t}(),Gt=function e(t,r,n,o,i,s){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),t&&(this.preferred_username=t),n&&(this.picture=n),o&&(this.name=o),i&&(this.locale=i),r&&(this.userURL=r),s&&Object.assign(this,s)},qt=function e(t,r,n,o,i,s,a,c){if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),!s)throw new Error("IDP should be a parameter");if(!t)throw new Error("username should be a parameter");this.idp=s,a&&(this.assertion=a),this.userProfile=new Gt(t,r,n,o,i,c)},Vt={startingTime:"",status:"",participants:{}},Wt={parent:"communication",listener:"resources",type:"HypertyResource"};function Jt(e,t){for(var r=0;r0&&r.inviteDisconnectedHyperties(a,t),Object.keys(i).length>0?(t.inviteObservers(s),t.invitations.length>0&&r.processInvitations(i,t),Promise.all(c).then(function(){n()})):n()})}).catch(function(e){reject("[GroupChatManager.InvitationsHandler.resumeDiscoveries] failed | ",e)})}},{key:"cleanInvitations",value:function(e){var t=this,r=t._pending[e];return console.log("[GroupChatManager.InvitationsHandler.cleanInvitations] ",r),r?new Promise(function(e,n){var o=Object.keys(r),i=[];o.forEach(function(e){i.push(r[e].unsubscribeLive(t._hypertyURL))}),Promise.all(o).then(function(){e()})}):Promise.resolve()}},{key:"invitationResponse",set:function(e){this._invitationsResponse=e}}]),e}();function zt(e,t){for(var r=0;r",e);var r=[];e.forEach(function(e){e.forEach(function(e){"live"===e.data.status?(r.push(e.data.hypertyID),a[e.data.hypertyID]=e):s.length<5&&s.push(e)})}),console.info("[ChatManager.ChatController]------------------------ Syncher Create ---------------------- \n"),console.info("[ChatManager.ChatController]Selected Hyperties: !!! ",r),console.info("Have ".concat(r.length," users;"));var n="reporter"===t.controllerMode?t.dataObjectReporter:t.dataObjectObserver;s.length>0&&t._invitationsHandler.inviteDisconnectedHyperties(s,n),n.inviteObservers(r),n.invitations.length>0&&t._invitationsHandler.processInvitations(a,n)}).then(function(){console.info("[ChatManager.ChatController]Are invited with success "+e.length+" users;"),n(!0)}).catch(function(e){console.error("An error occurred when trying to invite users;\n",e),o(e)})})}},{key:"addUserReq",value:function(e){var t=this,r=function(e){return console.log("Element:",e.length),0!==e.length};return new Promise(function(n,o){return 0===e.filter(r).length?o("[ChatManager.ChatController.addUserReq] Don't have users to add"):"observer"===!t.controllerMode?o("[ChatManager.ChatController.addUserReq] only allowed to Chat Observer"):void 0})}},{key:"onInvitationResponse",value:function(e){this._onInvitationResponse=e,this._invitationsHandler.invitationResponse=e}},{key:"removeUser",value:function(e){console.log("[ChatManager.ChatController]Not yet implemented: ",e)}},{key:"close",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this;return new Promise(function(r,n){if("reporter"===t.controllerMode)t._invitationsHandler.cleanInvitations(t.dataObjectReporter).then(function(){if(e)try{delete t._manager._reportersControllers[t.dataObjectReporter.url],t.dataObjectReporter.delete(),r(!0),t._onClose&&t._onClose({code:200,desc:"deleted",url:t.dataObjectReporter.url})}catch(e){console.error(e),n(!1)}else t._manager.communicationObject.status="closed",r(!0)});else if(e)try{delete t._manager._observersControllers[t.dataObjectObserver.url],t.dataObjectObserver.unsubscribe(),r(!0)}catch(e){console.error(e),n(!1)}else r(!0)})}},{key:"invitationsHandler",get:function(){return this._invitationsHandler}},{key:"url",get:function(){return"reporter"===this.controllerMode?this.dataObjectReporter.url:this.dataObjectObserver.url}},{key:"dataObjectReporter",set:function(e){if(!e)throw new Error("[ChatController] The data object reporter is necessary parameter ");var t=this;t.controllerMode="reporter",e.onSubscription(function(e){switch(e.type){case"subscribe":t._onSubscribe(e);break;case"unsubscribe":t._onUnsubscribe(e)}}),t._setOnAddChildListener(e),e.onRead(function(e){e.accept()}),e.onExecute(function(e){switch(e.method){case"addUser":t.addUser(e.params[0]).then(function(){e.accept()}).catch(function(t){console.error("Reason:",t),e.reject(t)});break;case"removeUser":t.removeUser(e.params).then(function(){e.accept()}).catch(function(t){console.error("Reason:",t),e.reject(t)});break;default:e.reject("[ChatController.onExecute] Chat method execution not accepted by Reporter")}}),t._dataObjectReporter=e},get:function(){return this._dataObjectReporter}},{key:"messages",get:function(){return"reporter"===this.controllerMode?this._dataObjectReporter._childrenObjects:this._dataObjectObserver._childrenObjects}},{key:"dataObjectObserver",set:function(e){var t=this;t.controllerMode="observer",t._dataObjectObserver=e,e.onChange("*",function(e){if(console.info("[ChatManager.ChatController]Observer - onChange",e),e.field.includes("participants"))switch(e.cType){case"add":t._onUserAdded&&t._onUserAdded(e);break;case"remove":t._onUserRemoved&&t._onUserRemoved(e)}t._onChange&&t._onChange(e)}),t._setOnAddChildListener(e)},get:function(){return this._dataObjectObserver}},{key:"dataObject",get:function(){return"reporter"===this.controllerMode?this.dataObjectReporter:this.dataObjectObserver}},{key:"closeEvent",set:function(e){this._closeEvent=e,this._onClose&&this._onClose(e)},get:function(){return this._closeEvent}}]),e}();function Xt(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var Qt=function e(t,r,n){var o;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e);var i=A(n);return n.hasOwnProperty("userProfile")||(i.userProfile=n),Xt(o={hypertyURL:t,domain:r},"domain",r),Xt(o,"identity",i),o};function Zt(e,t){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:{},n=this,o=n._syncher;return new Promise(function(i,s){var a;n.communicationObject=Vt,n.communicationObject.cseq=1,n.communicationObject.startingTime=(new Date).toJSON(),n.communicationObject.status="open",n.myIdentity().then(function(c){a=c,console.log("[ChatManager.create ] My Identity",c);var u=new Qt(n._myUrl,n._domain,c);n.communicationObject.participants[c.guid]=u,console.log("[ChatManager.create ] participants: ",n.communicationObject.participants),console.log("[ChatManager.create ] communicationObject",n.communicationObject),console.info("[ChatManager.create] searching "+t);var l=[],f=[],d={};t.forEach(function(e){var t=n.discovery.discoverHypertiesDO(e.user,["comm"],["chat"],e.domain);l.push(t)}),Promise.all(l).then(function(t){console.log("[ChatManager.create] Users Discovery Results->",t);var i=[];t.forEach(function(e){e.forEach(function(e){"live"===e.data.status?(i.push(e.data.hypertyID),d[e.data.hypertyID]=e):f.length<5&&f.push(e)})}),console.info("[ChatManager] ---------------------- Syncher Create ---------------------- \n"),console.info("[ChatManager] Selected Hyperties: !!! ",i),console.info("Have ".concat(i.length," users;"));var s=!r.mutual||r.mutual,a=Object.assign({resources:["chat"],mutual:s},r);return delete a.name,n.offline&&(a.offline=n.offline),console.info("[ChatManager] input data:",a),o.create(n._objectDescURL,i,n.communicationObject,!0,!1,e,{},a)}).then(function(e){console.info("[ChatManager] 3. Return Create Data Object Reporter",e);var t=new $t(o,n.discovery,n._domain,n.search,a,n);t.dataObjectReporter=e,n._reportersControllers[e.url]=t,console.log("[ChatManager] chatController invitationsHandler: ",t.invitationsHandler),e.invitations.length>0&&t.invitationsHandler.processInvitations(d,e),f.length>0&&t.invitationsHandler.inviteDisconnectedHyperties(f,e),i(t)}).catch(function(e){s(e)})}).catch(function(e){return console.log("[ChatManager.create] MyIdentity Error:",e),s(e)})})}},{key:"onInvitation",value:function(e){this._onInvitation=e}},{key:"join",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0,n=this;return new Promise(function(o,i){var s,a=n._syncher;console.info("[ChatManager] ------------------------ Syncher subscribe ---------------------- \n"),console.info("invitationURL",e),n.myIdentity(r).then(function(r){s=r;var o={schema:n._objectDescURL,resource:e,store:!0,p2p:!1,mutual:t,domain_subscription:!0,identity:r};return n.offline&&(o.offline=n.offline),a.subscribe(o)}).then(function(e){console.info("Data Object Observer: ",e);var t=new $t(a,n.discovery,n._domain,n.search,s,n);o(t),t.dataObjectObserver=e,n._observersControllers[e.url]=t}).catch(function(e){i(e)})})}},{key:"offline",set:function(e){this._offline=e},get:function(){return!!this._offline&&this._offline}}]),e}();function tr(e,t){for(var r=0;r0&&void 0!==arguments[0])||arguments[0],t=this;return new Promise(function(r,n){if("reporter"===t.controllerMode)if(e)try{delete t._manager._reportersControllers[t.dataObjectReporter.url],t.dataObjectReporter.delete(),r(!0),t._onClose&&t._onClose({code:200,desc:"deleted",url:t.dataObjectReporter.url})}catch(e){console.error(e),n(!1)}else t._manager.communicationObject.status="closed",r(!0);else if(e)try{delete t._manager._observersControllers[t.dataObjectObserver.url],t.dataObjectObserver.unsubscribe(),r(!0)}catch(e){console.error(e),n(!1)}else r(!0)})}},{key:"url",get:function(){return"reporter"===this.controllerMode?this.dataObjectReporter.url:this.dataObjectObserver.url}},{key:"dataObjectReporter",set:function(e){if(!e)throw new Error("[ChatController] The data object reporter is necessary parameter ");var t=this;t.controllerMode="reporter",e.onSubscription(function(e){switch(e.type){case"subscribe":t._onSubscribe(e);break;case"unsubscribe":t._onUnsubscribe(e)}}),t._setOnAddChildListener(e),e.onRead(function(e){e.accept()}),e.onExecute(function(e){switch(e.method){case"addUser":t.addUser(e.params[0]).then(function(){e.accept()}).catch(function(t){console.error("Reason:",t),e.reject(t)});break;case"removeUser":t.removeUser(e.params).then(function(){e.accept()}).catch(function(t){console.error("Reason:",t),e.reject(t)});break;default:e.reject("[ChatController.onExecute] Chat method execution not accepted by Reporter")}}),t._dataObjectReporter=e},get:function(){return this._dataObjectReporter}},{key:"messages",get:function(){return"reporter"===this.controllerMode?this._dataObjectReporter._childrenObjects:this._dataObjectObserver._childrenObjects}},{key:"dataObjectObserver",set:function(e){var t=this;t.controllerMode="observer",t._dataObjectObserver=e,e.onChange("*",function(e){if(console.info("[ChatManager.ChatController]Observer - onChange",e),e.field.includes("participants"))switch(e.cType){case"add":t._onUserAdded&&t._onUserAdded(e);break;case"remove":t._onUserRemoved&&t._onUserRemoved(e)}t._onChange&&t._onChange(e)}),t._setOnAddChildListener(e)},get:function(){return this._dataObjectObserver}},{key:"dataObject",get:function(){return"reporter"===this.controllerMode?this.dataObjectReporter:this.dataObjectObserver}},{key:"closeEvent",set:function(e){this._closeEvent=e,this._onClose&&this._onClose(e)},get:function(){return this._closeEvent}}]),e}();function nr(e,t){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:{},n=this,o=n._syncher;return new Promise(function(i,s){var a;n.communicationObject=Vt,n.communicationObject.cseq=1,n.communicationObject.startingTime=(new Date).toJSON(),n.communicationObject.status="open",n.myIdentity().then(function(i){a=i,console.log("[SimpleChatManager.create ] My Identity",i);var s=new Qt(n._myUrl,n._domain,i);n.communicationObject.participants[i.guid]=s,console.log("[SimpleChatManager.create ] participants: ",n.communicationObject.participants),console.log("[SimpleChatManager.create ] communicationObject",n.communicationObject),console.info("[SimpleChatManager] ---------------------- Syncher Create ---------------------- \n"),console.info("[SimpleChatManager] Selected Hyperties: !!! ",t);var c=!r.mutual||r.mutual,u=Object.assign({resources:["chat"],mutual:c},r);return delete u.name,n.offline&&(u.offline=n.offline),n.backup&&(u.backup=n.backup),console.log("[SimpleChatManager] input data:",u),o.create(n._objectDescURL,t,n.communicationObject,!0,!1,e,{},u)}).then(function(e){console.info("[SimpleChatManager] 3. Return Create Data Object Reporter",e);var t=new rr(o,n._domain,a,n);t.dataObjectReporter=e,n._reportersControllers[e.url]=t,i(t)}).catch(function(e){s(e)})}).catch(function(e){return console.log("[SimpleChatManager.create] MyIdentity Error:",e),reject(e)})}},{key:"onInvitation",value:function(e){this._onInvitation=e}},{key:"join",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2?arguments[2]:void 0,n=this;return new Promise(function(o,i){var s,a=n._syncher;console.info("[SimpleChatManager] ------------------------ Syncher subscribe ---------------------- \n"),console.info("invitationURL",e),n.myIdentity(r).then(function(r){s=r;var o={schema:n._objectDescURL,resource:e,store:!0,p2p:!1,mutual:t,domain_subscription:!0,identity:r};return n.offline&&(o.offline=n.offline),a.subscribe(o)}).then(function(e){console.info("Data Object Observer: ",e);var t=new rr(a,n._domain,s,n);o(t),t.dataObjectObserver=e,n._observersControllers[e.url]=t}).catch(function(e){i(e)})})}},{key:"offline",set:function(e){this._offline=e},get:function(){return!!this._offline&&this._offline}},{key:"backup",set:function(e){this._backup=e},get:function(){return!!this._backup&&this._backup}}]),e}();function ir(e,t){for(var r=0;r2&&void 0!==arguments[2])||arguments[2],n=this;if(t){var o=e.from+e.id;n._responseCallbacks[o]=t,r&&setTimeout(function(){var t=n._responseCallbacks[o];delete n._responseCallbacks[o],t&&t({id:e.id,type:"response",body:{code:408,desc:"Response timeout!",value:e}})},n._responseTimeOut)}}},{key:"_onResponse",value:function(e){if("response"===e.type){var t=e.to+e.id,r=this._responseCallbacks[t];if(e.body.code>=200&&delete this._responseCallbacks[t],r)return r(e),!0}return!1}},{key:"_onMessage",value:function(e){if(!this._onResponse(e)){var t=this._subscriptions[e.to];t?this._publishOn(t,e):this._publishOnDefault(e)}}},{key:"_genId",value:function(e){e.id&&0!==e.id||(this._msgId++,e.id=this._msgId)}},{key:"postMessage",value:function(e,t){}},{key:"postMessageWithRetries",value:function(e,t,r){var n=this,o=0;!function i(){new Promise(function(t,o){n.postMessage(e,function(n){408===n.body.code||500===n.body.code?o():(dr.info("[Bus.postMessageWithRetries] msg delivered: ",e),r(n),t())})}).then(function(){},function(){if(dr.warn("[Bus.postMessageWithRetries] Message Bounced (retry ".concat(o,"): '"),e),!(o++2&&void 0!==arguments[2]&&arguments[2];return this._watching[e]=n?Object.deepObserve(t,function(t){t.every(function(t){r._fireEvent(e,t)})}):Object.observe(t,function(t){t.every(function(t){r._fireEvent(e,t)})}),this._watching[e]}},{key:"observe",value:function(e,t){this._observers.push({key:e,callback:t})}},{key:"_fireEvent",value:function(e,t){this._observers.filter(function(t){return t.key===e}).forEach(function(e){e.callback(t)})}}]),e}();function Tr(e){return(Tr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Dr(e,t){for(var r=0;r0&&(i=e),"break"}())break;i?n(i):o("no sandbox found for: "+e)})}},{key:"resolveNormalStub",value:function(e){var t=this;return new Promise(function(r,n){var o=U(e),i=o.domain,s=o.type;(e.includes(t.runtimeURL)||e.includes("://sandbox/"))&&(Hr.error("[Registry - resolve] URL to be resolved should have listeners ",e),n("[Registry - resolve] URL to be resolved should have listeners ",e)),e.includes("global://registry")?i=t._domain:i.indexOf("msg-node.")&&i.indexOf("registry.")||(i=i.substring(i.indexOf(".")+1)),t.isLegacy(e).then(function(o){var a;o&&"domain-idp"!==s&&(i=s+"."+function(e){var t=U(e).domain.split("."),r=t.length;return 1==r?t[r-1]:t[r-2]+"."+t[r-1]}(e)),Hr.info("[Registry.resolve] domainUrl:",i),a="domain-idp"===s?!!t.idpProxyList.hasOwnProperty(i)&&t.idpProxyList[i]:!!t.protostubsList.hasOwnProperty(i)&&t.protostubsList[i],Hr.info("[Registry.resolve] registred:",a),a&&a.hasOwnProperty("status")&&("deployed"===a.status||a.status===Nr||a.status===Br||a.status===Gr)?(Hr.info("[Registry.resolve] Resolved: ",a.url,a.status),r(a.url)):"domain-idp"===s?(t.watchingYou.observe("idpProxyList",function(e){var n=e.keypath;n.includes("status")&&(n=n.replace(".status","")),n===i&&"status"===e.name&&e.newValue===Nr&&r(t.idpProxyList[i].url)}),a&&a.status!==qr||(Hr.info("[Registry.resolveNormalStub] deploy new IDPProxy: ",i),t.loader.loadIdpProxy(i).then(function(){Hr.info("[Registry.resolveNormalStub] IdP Proxy deployed: ",t.idpProxyList[i])}).catch(function(e){Hr.error("[Registry.resolve] Error resolving Load IDPProxy: ",e),t.idpProxyList[i].status="deployment-failed",n(e)}))):(t.watchingYou.observe("protostubsList",function(e){var n=e.keypath;n.includes("status")&&(n=n.replace(".status","")),n===i&&"status"===e.name&&e.newValue===Nr&&r(t.protostubsList[i].url)}),a&&a.status!==qr||(Hr.info("[Registry.resolve] trigger new ProtocolStub: ",i),t.loader.loadStub(i).then(function(){}).catch(function(e){Hr.error("[Registry.resolveNormalStub] Error resolving Load ProtocolStub: ",e),n(e)})))}).catch(function(e){Hr.error("[Registry.resolve] Error resolving islegacy: ",e),n(e)})})}},{key:"resolve",value:function(e){Hr.info("[Registry - Resolve] - ",e);var t=this;return new Promise(function(r,n){var o=e.to?e.to:e,i=!(!e.body||!e.body.p2p)&&e.body.p2p;!t.p2pHandlerStub[t.runtimeURL]||q(o)||o.includes(t.runtimeURL)||o.includes("/p2phandler/")||o.includes("/p2prequester/")?(Hr.info("[Registry - resolve] - Resolve normal stub: ",t.p2pHandlerStub,t.runtimeURL,q(o),i,o),t.resolveNormalStub(o).then(function(e){r(e)})):(Hr.info("[Registry - resolve] - checkP2P: ",i,o,t._p2pConnectionResolve),t._p2pConnectionResolve.checkP2P(e).then(function(n){var s=t.p2pConnectionList[n.runtime];switch(s||(s=n,t.p2pConnectionList[n.runtime]=s),s.status){case Br:e.body.peer=n.runtime,r(s.url,e);break;case Nr:case Kr:t.resolveNormalStub(o).then(function(e){r(e)});break;case Gr:Hr.info("[Registry - Resolve] - p2pConnection is disconnected lets try to reconnect"),t._p2pConnectionResolve.reconnectP2PRequester(s).then(function(e){r(e)},function(e){Hr.info("[Registry - Resolve] - Reason: ",e),t.resolveNormalStub(o).then(function(e){r(e)})});break;default:Hr.info("[Registry - resolve] - P2P: ",i),i?t._setupP2PRequester(n).then(function(e){r(e)},function(e){Hr.info("[Registry - Resolve] - Reason: ",e),t.resolveNormalStub(o).then(function(e){r(e)})}):t.resolveNormalStub(o).then(function(e){r(e)})}},function(e){Hr.info("[Registry - Resolve] - Reason: ",e),t.resolveNormalStub(o).then(function(e){r(e)})}))})}},{key:"_setupP2PRequester",value:function(e){var t=this;return Hr.log("[Registry._setupP2PConnection] loadStub with p2pRequester: ",e),new Promise(function(r,n){var o=e.runtime,i={remoteRuntimeURL:o,p2pHandler:e.p2pHandler,p2pRequesterStub:!0};t.watchingYou.observe("p2pRequesterStub",function(e){Hr.log("[Registry._setupP2PConnection] p2pRequesterStubs changed "+t.p2pRequesterStub),e.keypath.split(".")[0]===o&&"status"===e.name&&e.newValue===Br&&(Hr.log("[Registry._setupP2PConnection] p2pRequester is live "+t.p2pRequesterStub[o]),r(t.p2pRequesterStub[o].url))}),t.loader.loadStub(e.p2pRequester,i).then(function(){Hr.log("[Registry._setupP2PConnection] p2pRequester deployed: ",t.p2pRequesterStub[o])}).catch(function(e){n(e)})})}},{key:"isLegacy",value:function(e){var t=this;return new Promise(function(r,n){if(e===t._domain)return r(!1);Hr.log("[Registry] [Registry.Registry.isLegacy] ",e);var o=U(e);if(-1!==["hyperty-runtime","domain","global","hyperty"].indexOf(o.type)||o.domain===t._domain)return r(!1);if(e.split("@").length>1){var i=o.domain;if(t.idpLegacyProxyList.hasOwnProperty(i)){var s=t.idpLegacyProxyList[i];return s.interworking?r(s.interworking):r(!1)}t._loader.descriptors.getIdpProxyDescriptor(i).then(function(e){e.interworking?(t.idpLegacyProxyList[i]=e,r(e.interworking)):r(!1)}).catch(function(e){Hr.warn("problem loading idp proxy descriptor for domain:",i," because ",e),n(e)})}else r(t.isInterworkingProtoStub(e))})}},{key:"isLocal",value:function(e){var t=e.split("://")[0];if(-1!==["hyperty-runtime","runtime"].indexOf(t))return e.includes(this.runtimeURL);if(-1!==["hyperty"].indexOf(t)){for(var r in this.hypertiesList)if(this.hypertiesList[r].hypertyURL===e)return!0;return!1}e.includes("/subscription")&&(e=e.substring(0,e.indexOf("/subscription")));var n=this.dataObjectList[e];return!(!n||n.interworking&&n.interworking)}},{key:"isInterworkingProtoStub",value:function(e){var t=this;return"boolean"!=typeof e&&!!e.includes("/protostub/")&&Object.keys(t.protostubsList).filter(function(r){return t.protostubsList[r].url===e}).map(function(e){return!!t.protostubsList[e].hasOwnProperty("interworking")&&t.protostubsList[e].interworking})[0]}},{key:"loader",set:function(e){this._loader=e},get:function(){return this._loader}},{key:"messageBus",get:function(){return this._messageBus},set:function(e){var t=this;t._messageBus=e,t._messageBus.addListener(t.registryURL,function(e){if(B(e.from),e.body.hasOwnProperty("criteria"),e.body.hasOwnProperty("resource")&&"."!==e.body.resource&&(N(e.body.resource),function(e){U(e).type}(e.body.resource),B(e.body.resource)),e.type,e.body.hasOwnProperty("value")&&(e.body.value.hasOwnProperty("name"),e.body.value.hasOwnProperty("user")),"response"!==e.type){var r=t._getIdentityAssociated(e.body.resource,e.body.criteria),n={id:e.id,type:"response",to:e.from,from:e.to,body:{resource:r}};n.body.code=r?200:404,t._messageBus.postMessage(n)}else Hr.error("[Register listener] skipping ",e)});var r=mr.instance;t.addressAllocation=r,t._domainRegistration=new Er(t.runtimeURL,t.registryURL,t._domain,e)}}]),e}(),Wr={storageSchemas:{capabilities:{capabilities:"key,version,value"},subscriptions:{subscriptions:"key,version,value"},runtime:{"runtime:URL":"key,version,value","p2pHandler:URL":"key,version,value"},registry:{"registry:DataObjectURLs":"key,version,value","registry:HypertyURLs":"key,version,value"},cryptoManager:{userAsymmetricKey:"key,version,value",dataObjectSessionKeys:"key,version,value"},identity:{accessTokens:"key,version,value",identities:"userURL, userProfile.email, userProfile.userURL, userProfile.name"},runtimeCatalogue:{runtimeCatalogue:"&cguid, accessControlPolicy, constraints, dataObjects, hypertyType, objectName, sourcePackage, version"},policy:{"rethink:activePolicy":"key,version,value","rethink:groups":"key,version,value","rethink:userPolicies":"key,version,value","rethink:spPolicies":"key,version,value"},syncherManager:{"syncherManager:ObjectURLs":"key,version,value",remotes:"key,version,value"},hypertyResources:{hypertyResources:"&resourceURL, name, contentUrl, content, created, reporter, resourceType"}},runtimeURLS:{registry:{prefix:"hyperty-runtime://",suffix:"registry"},identityModule:{prefix:"hyperty-runtime://",suffix:"/idm"},runtimeUA:{prefix:"hyperty-runtime://",suffix:"/ua"},catalogue:{prefix:"hyperty-runtime://",suffix:"/catalogue"},graphConnector:{prefix:"hyperty-runtime://",suffix:"/graph"},syncManager:{prefix:"hyperty-runtime://",suffix:"/sm"}},catalogueURLs:{protocolstub:{prefix:"hyperty-catalogue://catalogue.",suffix:"/.well-known/protocolstub/",fallback:"hyperty-catalogue://catalogue.%domain%/.well-known/protocolstub/"},idpProxy:{prefix:"hyperty-catalogue://catalogue.",suffix:"/.well-known/idp-proxy/",fallback:"hyperty-catalogue://catalogue.%domain%/.well-known/idp-proxy/"}},msgNodeURL:{prefix:"domain://msg-node.",suffix:"",hypertyAddressAllocation:"/hyperty-address-allocation",objectAddressAllocation:"/object-address-allocation",subscriptionManagement:"/sm"},domainRegistryURL:{prefix:"domain://registry.",suffix:""},globalRegistryURL:"global://registry.",remoteStorage:"https://hysmart.rethink.ptinovacao.pt/backup/"};function Jr(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Yr(e,t){for(var r=0;rr&&(e.defaultIdentity.expires=parseInt(n),e.currentIdentity=t)})),t()})})}},{key:"loadAccessTokens",value:function(){var e=this;return new Promise(function(t){e._storageManager.get("accessTokens").then(function(r){r&&(e._accessTokens=r),t()})})}},{key:"addIdentity",value:function(e){var t=this,r=this;return new Promise(function(n,o){if(r._isValid(e)){var i=e.identifiers[0];Object.assign(t._identities[i],e),t._storeIdentity(e).then(function(){t._identities[i].status="created",n()})}else o("[Identities.addIdentity] invalid IdAssertion")})}},{key:"addAssertion",value:function(e){var t=this,r=this;return new Promise(function(n,o){if(r._isValid(e)){e.userProfile.guid=r._guid;var i=e.userProfile.userURL;r.identities[i]?r.identities[i]=e:r._identities[i]=e,r._store().then(function(){t._identities[i].status="created",0==r.defaultIdentity&&(r.defaultIdentity=i),n(e)})}else o("[Identities.addAssertion] invalid IdAssertion: ",e)})}},{key:"removeIdentity",value:function(e){var t=this;return new Promise(function(r,n){delete t.identities[e],t._store().then(function(){r()})})}},{key:"addAccessToken",value:function(e){var t=this;return $r.info("[Identities.addAccessToken] ",e),new Promise(function(r,n){t._isValidAccessToken(e)?(t._accessTokens[e.domain]=e,t._storeAccessTokens().then(function(){t._accessTokens[e.domain].status="created",r(e)})):n("[Identities.addIdentity] invalid AccessToken: ",e)})}},{key:"setAccessTokenInProgress",value:function(e){this._accessTokens[e]?this._accessTokens[e].status="in-progress":this._accessTokens[e]={status:"in-progress"}}},{key:"getAccessToken",value:function(e,t){var r=this._accessTokens[e];return r?t.every(function(e){return-1!=r.resources.indexOf(e)})?this._accessTokens[e]:new Error("[Identities.getAccessToken] Not found for ",e):void 0}},{key:"removeAccessToken",value:function(e,t){var r=this,n=this;return new Promise(function(o){var i=r._accessTokens[e];i&&t.every(function(e){return-1!=i.resources.indexOf(e)})?(delete r._accessTokens[e],n._storeAccessTokens().then(function(){o()})):o()})}},{key:"updateAssertion",value:function(e){var t=this;return new Promise(function(r){var n=e.userProfile.userURL;if(!t.identities[n])return reject("[Identities.updateAssertion] Identity not found for ",n);t.identities[n]=e,t._store().then(function(){r()})})}},{key:"updateAccessToken",value:function(e){var t=this;return $r.info("[Identities.updateAccessToken] ",e),new Promise(function(r,n){t._isValidAccessToken(e)?(t._accessTokens[e.domain].expires=e.expires,t._accessTokens[e.domain].accessToken=e.accessToken,t._storeAccessTokens().then(function(){t._accessTokens[e.domain].status="created",r(e)})):n("[Identities.updateAccessToken] invalid AccessToken: ",e)})}},{key:"addIdAssertion",value:function(e,t,r,n){var o=new Qr(t,r,n);this.idAssertionList.push(o)}},{key:"_isValid",value:function(e){if(!e.hasOwnProperty("assertion"))return!1;var t=e.assertion.split(".");try{t[1]?Z(t[1]):Z(e.assertion)}catch(e){return!1}return!0}},{key:"_isValidAccessToken",value:function(e){return!!(e.hasOwnProperty("accessToken")&&e.hasOwnProperty("domain")&&e.hasOwnProperty("resources")&&Array.isArray(e.resources)&&e.hasOwnProperty("expires")&&Number.isInteger(e.expires)&&e.hasOwnProperty("input"))}},{key:"_store",value:function(){var e=this,t=this;return new Promise(function(r,n){var o=Object.keys(e._identities).map(function(r){return t._storageManager.set(r,0,e._identities[r],"identities")});Promise.all(o).then(function(){r()}).catch(function(e){n("On _sendReporterSessionKey from method storeIdentity error: "+e)})})}},{key:"_storeAccessTokens",value:function(){var e=this;return new Promise(function(t,r){var n=A(e._accessTokens);e._storageManager.set("accessTokens",0,n).then(function(){t()}).catch(function(e){r("On _sendReporterSessionKey from method storeIdentity error: "+e)})})}},{key:"identities",get:function(){return this._identities}},{key:"accessTokens",get:function(){return this._accessTokens}},{key:"watchingYou",get:function(){return this._watchingYou}},{key:"guid",set:function(e){this._guid=e},get:function(){return this._guid}},{key:"defaultIdentity",set:function(e){if(!this.identities[e])throw new Error("[Identities.set defaultIdentity ] Error: identity does not exist here: ",e);this._defaultIdentity=e},get:function(){return!!this._defaultIdentity&&Object.assign({},this.identities[this._defaultIdentity])}},{key:"currentIdentity",set:function(e){if(!this.identities[e])throw e;this._currentIdentity=e},get:function(){return Object.assign({},this.identities[this._currentIdentity])}},{key:"identifiers",get:function(){return Object.keys(this._identities)}}]),e}(),Qr=function(){function e(t,r,n){Jr(this,e),this._assertion=t,this._idp=r,this._userProfile=n}return zr(e,[{key:"assertion",get:function(){return this._assertion}},{key:"idp",get:function(){return this._idp}},{key:"userProfile",get:function(){return this._userProfile}}]),e}(),Zr=Xr,en=n.getLogger("IdentityModule"),tn=function e(t,r){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),en.log("FakeGUI_deployed");var n=this;n._url=t,n._waitTime=1e4,n._messageBus=r,n._messageBus.addListener(n._url,function(e){if(e.hasOwnProperty("type")&&"create"===e.type&&e.body.hasOwnProperty("value")&&e.body.value.hasOwnProperty("identities")&&e.body.value.hasOwnProperty("idps")){var t,r=e.body.value.identities,o=e.body.value.idps;t=void 0!==r[0]?{type:"identity",value:r[0],code:200}:{type:"idp",value:o[2].domain,code:200};var i={id:e.id,type:"response",to:e.from,from:e.to,body:t};"wait"===e.body.value?setTimeout(function(){n._messageBus.postMessage(i)},n._waitTime):n._messageBus.postMessage(i)}else en.log("Ignoring messages not intended to FakeGUI.",e)})};function rn(e,t){for(var r=0;rI())return r(c);c.hasOwnProperty("refresh")?(nn.log("[Identity.IdentityModule.getIdentityAssertion] refreshing assertion: ",c),t._refreshIdAssertion().then(function(e){return nn.log("[IdentityModule.getIdentityAssertion] refreshed assertion.",e),r(e)},function(e){nn.error("[IdentityModule.getIdentityAssertion] error on refresIdAssertion: ",e," Asking for a new IdAssertion."),t._getIdAssertionForDomain(s,i,a).then(function(e){r(e)},function(e){n(e)})})):t._getIdAssertionForDomain(s,i,a).then(function(e){r(e)},function(e){n(e)})}else t._getIdAssertionForDomain(s,i,a).then(function(e){r(e)},function(e){n(e)})}else if(t.identities.defaultIdentity){var u=t.identities.defaultIdentity;if(u.expires>I())return r(u);u.hasOwnProperty("refresh")?(nn.log("[Identity.IdentityModule.getValidToken] refreshing assertion: ",u),t._refreshIdAssertion(u).then(function(e){return nn.log("[IdentityModule.getIdentityAssertion] refreshed assertion.",e),r(e)},function(e){nn.error("[IdentityModule.getIdentityAssertion] error on refresIdAssertion: ",e," Asking for a new IdAssertion."),t.selectIdentityFromGUI().then(function(e){return nn.log("[IdentityModule] Identity selected from GUI."),t.identities.defaultIdentity=e.userProfile.userURL,r(e)},function(e){return n(e)})})):t.selectIdentityFromGUI().then(function(e){return nn.log("[IdentityModule] Identity selected from GUI."),t.identities.defaultIdentity=e.userProfile.userURL,r(e)},function(e){return n(e)})}else t.selectIdentityFromGUI().then(function(e){return nn.log("[IdentityModule] Identity selected from GUI."),t.identities.defaultIdentity=e.userProfile.userURL,r(e)},function(e){return n(e)})}).catch(function(e){return nn.error("Error on identity acquisition ",e),n(e)}),t.runtimeCapabilities.isAvailable("node").then(function(e){if(nn.log("node identity acquisition",e),e){if(t.identities.currentIdentity)return r(t.identities.currentIdentity);nn.log("getIdentityAssertion for nodejs"),t.callNodeJsGenerateMethods("nodejs-idp","origin").then(function(e){r(e)},function(e){n(e)})}}).catch(function(e){nn.error("Error on identity acquisition ",e),n(e)})})}},{key:"_getIdAssertionForDomain",value:function(e,t,r){var n=this;return new Promise(function(o,i){n.selectIdentityForHyperty(e,t,r).then(function(e){return nn.log("[IdentityModule._getIdAssertionForDomain] Identity selected by hyperty."),o(e)},function(e){n.selectIdentityFromGUI().then(function(e){return nn.log("[IdentityModule._getIdAssertionForDomain] Identity selected by hyperty."),o(e)},function(e){return i(e)})})})}},{key:"_refreshIdAssertion",value:function(e){var t=this;return new Promise(function(r,n){t.sendRefreshMessage(e).then(function(e){nn.log("[Identity.IdentityModule.getValidToken] refreshed assertion: ",e),t.identities.updateAssertion(e).then(function(){r(e)},function(e){nn.error("[IdentityModule.getValidToken] error updating the assertion ",e),n(e)})},function(e){nn.error("[IdentityModule.getValidToken] error refreshing the assertion ",e),n(e)})})}},{key:"getUsersIDs",value:function(){return this.identities.identifiers}},{key:"deleteIdentity",value:function(e){return this.identities.removeIdentity(e)}},{key:"listenShowAdmin",value:function(e){this._showAdmin=e}},{key:"requestIdentityToGUI",value:function(e,t){nn.log("[IdentityModule.requestIdentityToGUI:identities]",e),nn.log("[IdentityModule.requestIdentityToGUI:idps]",t);var r=this;return new Promise(function(n,o){if(!1===r.guiDeployed){var i=r._guiURL,s=new tn(i,r._messageBus);r.guiFake=s,r.guiDeployed=!0}var a={type:"create",to:r._guiURL,from:r._idmURL,body:{value:{identities:e,idps:t}}};try{r._messageBus.postMessage(a,function(e){if(r._messageBus.removeResponseListener(r._idmURL,e.id),200===e.body.code){var t=e.body;nn.log("selectedIdentity: ",t.value),n(t)}else o("error on requesting an identity to the GUI")},!1)}catch(e){o("In method callIdentityModuleFunc error: "+e)}})}},{key:"callNodeJsGenerateMethods",value:function(e,t){nn.log("[callNodeJsGenerateMethods:idp]",e),nn.log("[callNodeJsGenerateMethods:origin]",t);var r=this;return new Promise(function(n,o){var i;r._crypto.getMyPublicKey().then(function(n){return nn.log("[callNodeJsGenerateMethods:key]",n),i=te(n),nn.log("[callNodeJsGenerateMethods] NO_URL"),r.generateAssertion(i,t,"url",e)}).then(function(e){e?n(e):o("Error on obtaining Identity")}).catch(function(e){nn.log(e),o(e)})})}},{key:"callGenerateMethods",value:function(e,t){nn.log("[callGenerateMethods:idp]",e),nn.log("[callGenerateMethods:origin]",t);var r=this;return new Promise(function(n,o){var i;r._crypto.getMyPublicKey().then(function(n){return nn.log("[callGenerateMethods:key]",n),i=te(n),nn.log("generateAssertion:no_hint"),r.generateAssertion(i,t,"",e)}).then(function(n){return r.myHint=n,nn.log("generateAssertion:hint"),r.generateAssertion(i,t,n,e)}).then(function(e){e?n(e):o("Error on obtaining Identity")}).catch(function(e){nn.error(e),o(e)})})}},{key:"loginSelectedIdentity",value:function(e,t,r,n){nn.log("[loginSelectedIdentity:publicKey]",e),nn.log("[loginSelectedIdentity:origin]",t),nn.log("[loginSelectedIdentity:idp]",r),nn.log("[loginSelectedIdentity:loginUrl]",n);var o=this;return new Promise(function(i,s){nn.log("[IdentityModule] openPopup"),o.callIdentityModuleFunc("login",{urlreceived:n}).then(function(e){return e},function(e){return nn.error("Error while logging in for the selected identity."),s(e)}).then(function(n){o.sendGenerateMessage(e,t,n,r).then(function(e){if(!e.hasOwnProperty("assertion"))return nn.error("Error while logging in for the selected identity."),s("Could not generate a valid assertion for selected identity.");o.identities.addAssertion(e).then(function(e){i("Login was successfull")}).catch(function(e){s("Login has failed:"+e)})}).catch(function(e){s("On loginSelectedIdentity from method sendGenerateMessage error: "+e)})})})}},{key:"selectIdentityForHyperty",value:function(e,t,r){nn.log("[selectIdentityForHyperty:origin]",e),nn.log("[selectIdentityForHyperty:idp]",t),nn.log("[selectIdentityForHyperty:idHint]",r);var n=this;return new Promise(function(o,i){n._crypto.getMyPublicKey().then(function(s){var a=te(s);n.sendGenerateMessage(a,e,r,t).then(function(r){r.hasOwnProperty("assertion")?n.identities.addAssertion(r).then(function(e){return o(r)},function(e){return i(e)}):r.hasOwnProperty("loginUrl")?n.loginSelectedIdentity(a,e,t,r.loginUrl).then(function(e){return o(e)},function(e){return i(e)}):(nn.log("Proceeding by logging in."),n.callGenerateMethods(t,e).then(function(e){return o(e)},function(e){return i(e)}))}).catch(function(e){i("On selectIdentityForHyperty from method sendGenerateMessage error: "+e)})}).catch(function(e){i("On selectIdentityForHyperty from method generateRSAKeyPair error: "+e)})})}},{key:"selectIdentityFromGUI",value:function(e){var t=this;nn.log("[IdentityModule.selectIdentityFromGUI:origin]",e);var r=this;return new Promise(function(n,o){t.getIdentitiesToChoose().then(function(e){return r.requestIdentityToGUI(e.identities,e.idps)}).then(function(t){if("identity"===t.type)r.identities.identities[t.value]?n(r.identities.identities[t.value]):o("[IdentityModule.selectIdentityFromGUI] identity not found: ",t.value);else{if("idp"!==t.type)return o("error on GUI received message.");r.callGenerateMethods(t.value,e).then(function(e){return n(e)},function(e){return o(e)})}}).catch(function(e){o("On selectIdentityFromGUI from method requestIdentityToGUI error: "+e)})})}},{key:"callIdentityModuleFunc",value:function(e,t,r,n){nn.log("[callIdentityModuleFunc:methodName]",e),nn.log("[callIdentityModuleFunc:parameters]",t);var o=this;return new Promise(function(i,s){if(o._showAdmin)"getAccessToken"===e?o._showAdmin(e,t.urlreceived,r,n).then(function(e){i(e)}):o._showAdmin(e);else{var a={type:"execute",to:o._guiURL,from:o._idmURL,body:{resource:"identity",method:e,params:t}};try{o._messageBus.postMessage(a,function(e){o._messageBus.removeResponseListener(o._idmURL,e.id);var t=e.body.value;i(t)},!1)}catch(e){s("In method callIdentityModuleFunc error: "+e)}}})}},{key:"getToken",value:function(e){var t=this,r=e.from,n=e.to;return e.hasOwnProperty("body")&&e.body.hasOwnProperty("source")&&(r=e.body.source),"forward"===e.type&&(r=e.body.from),e.hasOwnProperty("body")&&e.body.hasOwnProperty("subscriber")&&(r=e.body.subscriber),new Promise(function(o,i){nn.log("[IdentityModule.getToken] for msg ",e),t.registry.isLegacy(n).then(function(n){n?t._getAccessToken(e).then(function(e){nn.log("[IdentityModule.getToken] access token ",e),o(A(e))}).catch(function(e){i("[IdentityModule.getToken] Access Token error "+e)}):t._getValidToken(r).then(function(e){o(e)}).catch(function(e){i("On getToken from method _getValidToken error: "+e)})}).catch(function(e){i("On getToken from method isLegacy error: "+e)})})}},{key:"getIdToken",value:function(e){nn.info("getIdToken:hypertyURL ",e);var t=this;return new Promise(function(r,n){var o;if("hyperty"===e.split("://")[0]){if(o=t.registry.getHypertyOwner(e)){var i=t.identities.getIdentity(o);return i?r(i):n("[IdentityModule.getIdToken] Identity not found for: ",o)}return n("[IdentityModule.getIdToken] User not found for hyperty: ",o)}t._getHypertyFromDataObject(e).then(function(e){if(o=t.registry.getHypertyOwner(e)){var i=t.identities.getIdentity(o);return i?r(i):n("[IdentityModule.getIdToken] Identity not found for: ",o)}return n("[IdentityModule.getIdToken] User not found for hyperty: ",e)}).catch(function(e){nn.error("[IdentityModule.getIdToken] Error: ",e),n(e)})})}},{key:"_getAccessToken",value:function(e){var t=e.to,r=this;return new Promise(function(n){if(!e.hasOwnProperty("body"))return reject("[IdentityModule._getAccessToken] missing mandatory msg body: ",e);if(!e.body.hasOwnProperty("value"))return reject("[IdentityModule._getAccessToken] missing mandatory msg body value: ",e);if(!e.body.value.hasOwnProperty("resources"))return reject("[IdentityModule._getAccessToken] missing mandatory msg body value resources: ",e);var o=U(t).domain;t.includes("protostub")&&(o=o.replace(o.split(".")[0]+".",""));var i=e.body.value.resources;r._getAccessTokenForDomain(o,i).then(function(e){n(e)})})}},{key:"_getAccessTokenForDomain",value:function(e,t){var r,n=this;return new Promise(function(o,i){try{r=n.identities.getAccessToken(e,t)}catch(e){return i("[IdentityModule._getAccessTokenForDomain] Access Token error "+err)}if(r){if("in-progress"===r.status)return o(n._inProgressAccessToken(e,t));var s=I();if(nn.log("[Identity.IdentityModule._getAccessTokenForDomain] found Access Token ",r),!(s>=r.expires))return o(A(r));r.hasOwnProperty("refresh")?n._refreshAccessToken(A(r)).then(function(e){return o(n.identities.updateAccessToken(e))}):n._revokeAccessToken(r,e,t).then(function(){setTimeout(function(){return n._getNewAccessToken(e,t)},1e3)})}else n._getNewAccessToken(e,t).then(function(e){return nn.log("[Identity.IdentityModule._getAccessTokenForDomain] new Access Token ",e),o(e)}).catch(function(e){i("[IdentityModule._getAccessTokenForDomain] on getNewAccessToken "+e)})})}},{key:"_revokeAccessToken",value:function(e,t,r){var n=this;return nn.log("[IdentityModule._revokeAccessToken] to be revoked ",e),new Promise(function(o,i){var s;s={type:"execute",to:n._resolveDomain(e.domain),from:n._idmURL,body:{method:"revokeAccessToken",params:{token:e}}},nn.log("[IdentityModule._revokeAccessToken] revoke msg ",s);try{n._messageBus.postMessage(s,function(e){var i=e.body.value;i&&n._identities.removeAccessToken(t,r).then(function(){o(i)}),o()})}catch(e){i("In IdentityModule._revokeAccessToken on postMessage error: "+e)}})}},{key:"_inProgressAccessToken",value:function(e,t){var r=this;this.identities.watchingYou.observe("accessTokens",function(n){nn.log("[IdentityModule._inProgressAccessToken] accessTokens changed "+r.identities.accessTokens);var o=n.keypath;if(o.includes("status")&&(o=o.replace(".status","")),o===e&&"status"===n.name&&"created"===n.newValue)return r.identities.getAccessToken(e,t)})}},{key:"_getNewAccessToken",value:function(e,t){var r=this;return new Promise(function(n,o){r.identities.setAccessTokenInProgress(e);var i={type:"execute",to:r._resolveDomain(e),from:r._idmURL,body:{method:"getAccessTokenAuthorisationEndpoint",params:t}};r._messageBus.postMessage(i,function(s){if(s.body.code>299)return o("[IdentityModule._getNewAccessToken] Error on getAccessTokenAuthorisationEndpoint from IdP Proxy: ",s.body.desc);r.callIdentityModuleFunc("getAccessToken",{urlreceived:s.body.value},e,t[0]).then(function(e){nn.log("[IdentityModule:callIdentityModuleFunc:openPopup] auhtorisation result: ",e),i.body.method="getAccessToken",i.body.params={resources:t,login:e},r._messageBus.postMessage(i,function(e){if(e.body.code>299)return o("[IdentityModule._getNewAccessToken] Error on getAccessToken from IdP Proxy: ",e.body.desc);r.identities.addAccessToken(e.body.value).then(function(t){return nn.info("[IdentityModule._getNewAccessToken] resolving token: ",t),n(e.body.value)},function(e){o(e)})})},function(e){o(e)})})})}},{key:"_refreshAccessToken",value:function(e){var t=this;return nn.log("IdentityModule._refreshAccessToken:outdatedToken",e),new Promise(function(r,n){var o;o={type:"execute",to:t._resolveDomain(e.domain),from:t._idmURL,body:{method:"refreshAccessToken",params:{token:e}}};try{t._messageBus.postMessage(o,function(e){var t=e.body.value;r(t)})}catch(e){n("In IdentityModule._refreshAccessToken on postMessage error: "+e)}})}},{key:"sendRefreshMessage",value:function(e){var t=this;return nn.log("sendRefreshMessage:oldIdentity",e),new Promise(function(r,n){var o,i=t._resolveDomain(e.idp.domain),s=t.getIdentity(e.userProfile.userURL);nn.info("sendRefreshMessage:oldIdentity",e),o={type:"execute",to:i,from:t._idmURL,body:{resource:"identity",method:"refreshAssertion",params:{identity:s}}};try{t._messageBus.postMessage(o,function(e){if(e.body.code<300){var t=e.body.value;r(t)}else r(e.body.value.body.params,identity)})}catch(e){n("In sendRefreshMessage on postMessage error: "+e)}})}},{key:"getAccessToken",value:function(e,t,r){nn.log("[getAccessToken:idpDomain]",e);var n=this;return new Promise(function(o,i){var s;s={type:"execute",to:n._resolveDomain(e),from:n._idmURL,body:{resource:"identity",method:"getAccessToken",params:{resources:t,login:r}}};try{n._messageBus.postMessage(s,function(e){if(e.body.code<299){var t=e.body.value;o(t)}else o(e.body)})}catch(e){i("IdentityModule.In getAccessToken: "+e)}})}},{key:"getAccessTokenAuthorisationEndpoint",value:function(e,t){nn.log("[getAccessTokenAuthorisationEndpoint:idpDomain]",t);var r=this;return new Promise(function(n,o){var i;i={type:"execute",to:r._resolveDomain(t),from:r._idmURL,body:{resource:"identity",method:"getAccessTokenAuthorisationEndpoint",params:{resources:e}}};try{r._messageBus.postMessage(i,function(e){var t=e.body.value;n(t)})}catch(e){o("In getAccessTokenAuthorisationEndpoint: "+e)}})}},{key:"sendGenerateMessage",value:function(e,t,r,n){nn.log("[sendGenerateMessage:contents]",e),nn.log("[sendGenerateMessage:origin]",t),nn.log("[sendGenerateMessage:usernameHint]",r),nn.log("[sendGenerateMessage:idpDomain]",n),nn.log("sendGenerateMessage_hint");var o=this;return new Promise(function(i,s){var a;a={type:"execute",to:o._resolveDomain(n),from:o._idmURL,body:{resource:"identity",method:"generateAssertion",params:{contents:e,origin:t,usernameHint:r}}};try{o._messageBus.postMessage(a,function(e){e.body.code<300?i(e.body.value):s(e.body)})}catch(e){s("In sendGenerateMessage: "+e)}})}},{key:"generateAssertion",value:function(e,t,r,n){nn.log("[generateAssertion:contents]",e),nn.log("[generateAssertion:origin]",t),nn.log("[generateAssertion:usernameHint]",r),nn.log("[generateAssertion:idpDomain]",n);var o=this;return new Promise(function(i,s){nn.log("[IdentityModule:sendGenerateMessage:sendGenerateMessage]",r),o.sendGenerateMessage(e,t,r,n).then(function(e){e?o.identities.addAssertion(e).then(function(t){i(e)},function(e){s(e)}):s("error on obtaining identity information")},function(e){e.hasOwnProperty("description")&&e.description.hasOwnProperty("loginUrl")?o.callIdentityModuleFunc("login",{urlreceived:e.description.loginUrl}).then(function(e){nn.log("[IdentityModule:callIdentityModuleFunc:openPopup]",r),i(e)},function(e){s(e)}):(nn.error("[IdentityModule:sendGenerateMessage] generate assertion with hint error ",e),s(e))}).catch(function(e){s("On generateAssertion from method sendGenerateMessage error: "+e)})})}},{key:"validateAssertion",value:function(e,t,r){nn.log("[validateAssertion:assertion]",e),nn.log("[validateAssertion:origin]",t),nn.log("[validateAssertion:idpDomain]",r);var n=this,o={type:"execute",to:n._resolveDomain(r),from:n._idmURL,body:{resource:"identity",method:"validateAssertion",params:{assertion:e,origin:t}}};return new Promise(function(e,t){try{n._messageBus.postMessage(o,function(r){200===r.body.code?e(r.body.value):t("error",r.body.code)})}catch(e){t("On validateAssertion from method postMessage error: "+e)}})}},{key:"addGUIListeners",value:function(){var e=this;e._messageBus.addListener(e._idmURL,function(t){var r,n=t.body.method;if(nn.log("[IdentityModule:addGUIListeners]",t,t.body,n),"deployGUI"===n)r=e.deployGUI();else{if("getIdentitiesToChoose"===n)return void e.getIdentitiesToChoose().then(function(r){var n={type:"execute",value:r,code:200},o={id:t.id,type:"response",to:t.from,from:t.to,body:n};try{e._messageBus.postMessage(o)}catch(e){nn.error("On addGUIListeners from if storeIdentity method postMessage error: "+e)}});if("unregisterIdentity"===n){var o=t.body.params.email;r=e.unregisterIdentity(o)}else{if("getMyPublicKey"===n)return void e._crypto.getMyPublicKey().then(function(r){var n={type:"execute",value:r=te(r),code:200},o={id:t.id,type:"response",to:t.from,from:t.to,body:n};try{e._messageBus.postMessage(o)}catch(e){nn.error("On addGUIListeners from if generateRSAKeyPair method postMessage error: "+e)}});if("sendGenerateMessage"===n){var i=t.body.params.contents,s=t.body.params.origin,a=t.body.params.usernameHint,c=t.body.params.idpDomain,u={id:t.id,type:"response",to:t.from,from:t.to};return void e.sendGenerateMessage(i,s,a,c).then(function(t){var r={type:"execute",value:t,code:200};u.body=r;try{e._messageBus.postMessage(u)}catch(e){nn.error("IdentityModule.addGUIListeners sendGenerateMessage error: "+e)}},function(t){nn.info("IDPProxy generateAssertion reply error "+t),u.body=t,e._messageBus.postMessage(u)})}if("getAccessTokenAuthorisationEndpoint"===n){var l=t.body.params.scope,f=t.body.params.idpDomain;return void e.getAccessTokenAuthorisationEndpoint(l,f).then(function(r){var n={type:"execute",value:r,code:200},o={id:t.id,type:"response",to:t.from,from:t.to,body:n};try{e._messageBus.postMessage(o)}catch(e){nn.error("On addGUIListeners from if sendGenerateMessage method postMessage error: "+e)}})}if("addAccessToken"===n){var d=t.body.params;return void e.identities.addAccessToken(d).then(function(r){var n={type:"execute",value:r,code:200},o={id:t.id,type:"response",to:t.from,from:t.to,body:n};try{e._messageBus.postMessage(o)}catch(e){nn.error("On addGUIListeners from if storeIdentity method postMessage error: "+e)}})}if("getAccessToken"===n){var y=t.body.params.idpDomain,h=t.body.params.resources,p=t.body.params.login,v={id:t.id,type:"response",to:t.from,from:t.to};return void e.getAccessToken(y,h,p).then(function(t){var r={type:"execute",value:t,code:200};v.body=r;try{e._messageBus.postMessage(v)}catch(e){nn.error("On addGUIListeners from if sendGenerateMessage method postMessage error: "+e)}},function(t){try{v.body=t,e._messageBus.postMessage(v)}catch(e){nn.error("On addGUIListeners from if sendGenerateMessage method postMessage error: "+e)}})}if("addAssertion"===n){var g=t.body.params;return void e.identities.addAssertion(g).then(function(r){var n={type:"execute",value:r,code:200},o={id:t.id,type:"response",to:t.from,from:t.to,body:n};try{e._messageBus.postMessage(o)}catch(e){nn.error("On addGUIListeners from if storeIdentity method postMessage error: "+e)}})}if("refreshAccessToken"===n){var b=t.body.params.domain,m=t.body.params.resources;return void e._getAccessTokenForDomain(b,m).then(function(r){var n={id:t.id,type:"response",to:t.from,from:t.to,body:{value:r.accessToken,code:200}};try{e._messageBus.postMessage(n)}catch(e){nn.error("On addGUIListeners for refreshAccessToken request: "+e)}})}if("unauthorise"===n){var _=t.body.params.domain,w=t.body.params.resources;try{e._revokeAccessToken(e.identities.getAccessToken(_,w),_,w)}catch(e){return reject("[IdentityModule.addGUIListeners] unauthorise error "+err)}var O={id:t.id,type:"response",to:t.from,from:t.to,body:{value:!0,code:200}};try{e._messageBus.postMessage(O)}catch(e){nn.error("On addGUIListeners for refreshAccessToken request: "+e)}return}}}var k={type:"execute",value:r,code:200},R={id:t.id,type:"response",to:t.from,from:t.to,body:k};try{e._messageBus.postMessage(R)}catch(e){nn.error("On addGUIListeners from if storeIdentity method postMessage error: "+e)}})}},{key:"deployGUI",value:function(){this.guiDeployed=!0}},{key:"_getValidToken",value:function(e){nn.log("[IdentityModule._getValidToken]:hypertyURL",e);var t=this;return new Promise(function(r,n){t.getIdToken(e).then(function(e){nn.log("[IdentityModule._getValidToken] retrieved IdAssertion",e);var o=I();if(!e.hasOwnProperty("expires"))return r(e);var i=e.expires;nn.log("[Identity.IdentityModule.getValidToken] Token expires in",i),nn.log("[Identity.IdentityModule.getValidToken] time now:",o),o>=i?e.hasOwnProperty("refresh")?(nn.log("[Identity.IdentityModule.getValidToken] refreshing assertion: ",e),t.sendRefreshMessage(e).then(function(e){nn.log("[Identity.IdentityModule.getValidToken] refreshed assertion: ",e),t.identities.updateAssertion(e).then(function(){r(e)},function(e){nn.error("[IdentityModule.getValidToken] error updating the assertion ",e),n(e)})},function(e){nn.error("[IdentityModule.getValidToken] error refreshing the assertion ",e),n(e)})):t.callGenerateMethods(e.idp.domain).then(function(e){r(e)}).catch(function(e){n("[IdentityModule.getValidToken] error when generating a new assertion "+e)}):r(e)}).catch(function(e){nn.error("[IdentityModule.getValidToken] error on getIdToken",e),n(e)})})}},{key:"_getHypertyFromDataObject",value:function(e){nn.info("_getHypertyFromDataObject:dataObjectURL",e);var t=this;return new Promise(function(r,n){var o=U(e).domain,i=$(e),s=t.registry.getReporterURLSynchonous(i);if(nn.info("_getHypertyFromDataObject:reporterURL",s),s)r(s);else{var a=t.dataObjectsIdentity[i];if(nn.info("_getHypertyFromDataObject:storedReporterURL",a),a)r(a);else{var c=t.registry.getDataObjectSubscriberHyperty(e);nn.info("_getHypertyFromDataObject:subscriberHyperty",c),c?r(c):t._coreDiscovery.discoverDataObjectPerURL(i,o).then(function(e){nn.info("_getHypertyFromDataObject:dataObject",e),t.dataObjectsIdentity[i]=e.reporter,nn.info("_getHypertyFromDataObject:dataObject.reporter",e.reporter),r(e.reporter)},function(e){n(e)})}}})}},{key:"_resolveDomain",value:function(e){return e?"domain-idp://"+e:"domain-idp://google.com"}},{key:"messageBus",get:function(){return this._messageBus},set:function(e){this._messageBus=e,this.addGUIListeners()}},{key:"coreDiscovery",get:function(){return this._coreDiscovery},set:function(e){this._coreDiscovery=e}},{key:"registry",get:function(){return this._registry},set:function(e){this._registry=e}},{key:"identities",get:function(){return this._identities},set:function(e){this._identities=e}},{key:"idps",get:function(){return this._listOfIdps}}]),e}();function sn(e,t){for(var r=0;rt&&ne[0]}},{key:"in",value:function(e){return e[0].indexOf(e[1])>-1}},{key:"lessThan",value:function(e){return e[1]n?1:0})}}]),e}();function xn(e,t){for(var r=0;r0){var r=new Kn(this.handlers);r.next(new Fn(this,r,e,t))}else t(e)}}]),e}(),Fn=function(){function e(t,r,n,o){Dn(this,e),this._inStop=!1,this._pipeline=t,this._iter=r,this._msg=n,this._onDeliver=o}return Nn(e,[{key:"next",value:function(){this._inStop||(this._iter.hasNext?this._iter.next(this):this._onDeliver(this._msg))}},{key:"deliver",value:function(){this._inStop||(this._inStop=!0,this._onDeliver(this._msg))}},{key:"fail",value:function(e){this._inStop||(this._inStop=!0,this._pipeline.onFail&&this._pipeline.onFail(e))}},{key:"pipeline",get:function(){return this._pipeline}},{key:"msg",get:function(){return this._msg},set:function(e){this._msg=e}}]),e}(),Kn=function(){function e(t){Dn(this,e),this._index=-1,this._array=t}return Nn(e,[{key:"hasNext",get:function(){return this._index>6|192;else{if(o>55295&&o<56320){if(++n==e.length)throw"UTF-8 encode: incomplete surrogate pair";var i=e.charCodeAt(n);if(i<56320||i>57343)throw"UTF-8 encode: second char code 0x"+i.toString(16)+" at index "+n+" in surrogate pair out of range";o=65536+((1023&o)<<10)+(1023&i),r[t++]=o>>18|240,r[t++]=o>>12&63|128}else r[t++]=o>>12|224;r[t++]=o>>6&63|128}r[t++]=63&o|128}}return r.subarray(0,t)}function Xn(e,t){for(var r=0;r127){if(n>191&&n<224){if(r>=e.length)throw"UTF-8 decode: incomplete 2-byte sequence";n=(31&n)<<6|63&e[r]}else if(n>223&&n<240){if(r+1>=e.length)throw"UTF-8 decode: incomplete 3-byte sequence";n=(15&n)<<12|(63&e[r])<<6|63&e[++r]}else{if(!(n>239&&n<248))throw"UTF-8 decode: unknown multibyte start 0x"+n.toString(16)+" at index "+(r-1);if(r+2>=e.length)throw"UTF-8 decode: incomplete 4-byte sequence";n=(7&n)<<18|(63&e[r])<<12|(63&e[++r])<<6|63&e[++r]}++r}if(n<=65535)t+=String.fromCharCode(n);else{if(!(n<=1114111))throw"UTF-8 decode: code point 0x"+n.toString(16)+" exceeds UTF-16 reach";n-=65536,t+=String.fromCharCode(n>>10|55296),t+=String.fromCharCode(1023&n|56320)}}return t}(new Uint8Array(e));Qn.log("crypto-decryptAES",t),o(t)}).catch(function(e){i(e)})})})}},{key:"hashHMAC",value:function(e,t){Qn.log("hashHMAC:key",e),Qn.log("hashHMAC:data",t);var r=this;return new Promise(function(n,o){"string"!=typeof t&&(t=JSON.stringify(t),Qn.log("Converting hashHMAC inpured DATA"),Qn.log("HHashHMAC:",t)),r._importHMACkey(e).then(function(e){r._crypto.subtle.sign({name:"HMAC"},e,$n(t)).then(function(e){Qn.log("HashHMAC signature:",new Uint8Array(e)),n(new Uint8Array(e))}).catch(function(e){o(e)})})})}},{key:"verifyHMAC",value:function(e,t,r){Qn.log("verifyHMAC:key",e),Qn.log("verifyHMAC:data",t),Qn.log("verifyHMAC:signature",r);var n=this;return new Promise(function(o,i){n._importHMACkey(e).then(function(e){"string"!=typeof t&&(t=JSON.stringify(t),Qn.log("Converting verifyHMAC inputed DATA:",t)),n._crypto.subtle.verify({name:"HMAC"},e,r,$n(t)).then(function(e){Qn.log("verifyHMAC result",e),e?o(e):i(e)}).catch(function(e){Qn.error("crypto-verifyHMAC",e),i(e)})})})}},{key:"generateRSAKeyPair",value:function(){var e=this,t={};return new Promise(function(r,n){e._crypto.subtle.generateKey({name:"RSA-PSS",modulusLength:2048,publicExponent:new Uint8Array([1,0,1]),hash:{name:"SHA-256"}},!0,["sign","verify"]).then(function(o){e._crypto.subtle.exportKey("spki",o.publicKey).then(function(r){return t.public=new Uint8Array(r),e._crypto.subtle.exportKey("pkcs8",o.privateKey)}).then(function(e){t.private=new Uint8Array(e),r(t)}).catch(function(e){Qn.error(e),n(e)})}).catch(function(e){Qn.error(e),n(e)})})}},{key:"generateIV",value:function(){var e=new Uint8Array(16);return this._crypto.getRandomValues(e),e}},{key:"generateRandom",value:function(){var e=new Uint8Array(32);this._crypto.getRandomValues(e);for(var t=$n(Date.now().toString()),r=t.slice(t.length-4,t.length),n=0;n<4;n++)e[n]=r[n];return e}},{key:"generatePMS",value:function(){var e=new Uint8Array(48);return this._crypto.getRandomValues(e),e}},{key:"generateMasterSecret",value:function(e,t){var r=this;return new Promise(function(n,o){var i=new Uint8Array(48),s=t;r._digest(e).then(function(e){r.hashHMAC(e,s).then(function(t){for(var n=0;n<32;n++)i[n]=t[n];return r.hashHMAC(e,s+t)}).then(function(e){for(var t=0;t<16;t++)i[t+32]=e[t];n(i)}).catch(function(e){o(e)})})})}},{key:"generateKeys",value:function(e,t){var r=this;return new Promise(function(n,o){var i=[],s=t;r.hashHMAC(e,s).then(function(t){return i.push(t),r.hashHMAC(e,s+t)}).then(function(t){return i.push(t),r.hashHMAC(e,s+t)}).then(function(t){return i.push(t),r.hashHMAC(e,s+t)}).then(function(e){i.push(e),n(i)}).catch(function(e){o(e)})})}},{key:"_importRSAsignKey",value:function(e){var t=this;return new Promise(function(r,n){t._crypto.subtle.importKey("pkcs8",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["sign"]).then(function(e){r(e)}).catch(function(e){Qn.error("crypto-_importRSAsignKey",e),n(e)})})}},{key:"_importRSAverifyKey",value:function(e){var t=this;return new Promise(function(r,n){t._crypto.subtle.importKey("spki",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["verify"]).then(function(e){r(e)}).catch(function(e){Qn.error("crypto-_importRSAverifyKey",e),n(e)})})}},{key:"_importRSAencryptKey",value:function(e){var t=this;return new Promise(function(r,n){t._crypto.subtle.importKey("spki",e,{name:"RSA-OAEP",hash:{name:"SHA-256"}},!0,["encrypt"]).then(function(e){r(e)}).catch(function(e){Qn.error("crypto-_importRSAencryptKey",e.name),n(e)})})}},{key:"_importRSAdecryptKey",value:function(e){var t=this;return new Promise(function(r,n){t._crypto.subtle.importKey("pkcs8",e,{name:"RSA-OAEP",hash:{name:"SHA-256"}},!0,["decrypt"]).then(function(e){r(e)}).catch(function(e){Qn.error("crypto-_importRSAdecryptKey",e),n(e)})})}},{key:"concatPMSwithRandoms",value:function(e,t,r){for(var n=new Uint8Array(e.length+t.length+r.length),o=0;o"+e.to];if(f||(f=t._newChatCrypto(e,l),t.chatKeys[e.from+"<->"+e.to]=f,e.body.handshakePhase="startHandShake"),f.authenticated&&!o){var d=t.crypto.generateIV();t.crypto.encryptAES(f.keys.hypertyFromSessionKey,te(e.body.value),d).then(function(n){var o=t._filterMessageToHash(e,te(e.body.value)+te(d),f.hypertyFrom.messageInfo);t.crypto.hashHMAC(f.keys.hypertyFromHashKey,o).then(function(t){var o={iv:Q(d),value:Q(n),hash:Q(t)};e.body.value=Q(o),r(e)})})}else o?r(e):t._doHandShakePhase(e,f).then(function(r){t.chatKeys[e.from+"<->"+e.to]=r.chatKeys,t._messageBus.postMessage(r.message),n("encrypt handshake protocol phase ")})}else n("In encryptMessage: Hyperty owner URL was not found")}else c&&s&&t.storageManager.get("dataObjectSessionKeys").then(function(o){var s=(o=z(o||{}))?o[i]:null;t.dataObjectsStorage.getDataObject(i).then(function(o){if(!s&&o.reporter&&o.reporter===e.from){var a=t.crypto.generateRandom();t.dataObjectSessionKeys[i]={sessionKey:a,isToEncrypt:!0};var c=Y(t.dataObjectSessionKeys);t.storageManager.set("dataObjectSessionKeys",0,c).catch(function(e){n("On encryptMessage from method storageManager.set error: "+e)}),s=t.dataObjectSessionKeys[i]}if(s)if(s.isToEncrypt){var u=t.crypto.generateIV(),l=te(u),f=te(e.body.value);t.crypto.encryptAES(s.sessionKey,f,u).then(function(n){delete e.body.identity.assertion,delete e.body.identity.expires;var o=t._filterMessageToHash(e,f+l);t.crypto.hashHMAC(s.sessionKey,o).then(function(t){var o={value:Q(n),iv:Q(u),hash:Q(t)};e.body.value=te(o),r(e)})})}else r(e);else n("Data object key could not be defined: Failed to decrypt message ")}).catch(function(e){n("On encryptMessage from method dataObjectsStorage.getDataObject error: "+e)})}).catch(function(e){n("On encryptMessage from method storageManager.get error: "+e)})})}},{key:"encryptDataObject",value:function(e,t){var r=this;return new Promise(function(n,o){to.info("dataObject value to encrypt: ",e);var i=$(t);r.storageManager.get("dataObjectSessionKeys").then(function(t){var s=(t=z(t||{}))?t[i]:null;if(!s)return o("No dataObjectKey for this dataObjectURL:",i);if(!s.isToEncrypt)return to.info("The dataObject is not encrypted"),n(e);var a=r.crypto.generateIV();r.crypto.encryptAES(s.sessionKey,te(e),a).then(function(e){var t={value:Q(e),iv:Q(a)};return n(t)}).catch(function(e){o("On encryptDataObject from method encryptAES error: "+e)})}).catch(function(e){o("On encryptDataObject from method storageManager.get error: "+e)})})}},{key:"decryptMessage",value:function(e){var t=this;return new Promise(function(r,n){var o="handshake"===e.type;t._isToDecrypt(e).then(function(i){if(!i)return r(e);var s=$(e.to),a=D(s),c="hyperty"===U(e.from).type,u="hyperty"===U(e.to).type;if("update"===e.type)return r(e);if(c&&u){var l=t._registry.getHypertyOwner(e.to);if(l){var f=t.chatKeys[e.to+"<->"+e.from];if(f||(f=t._newChatCrypto(e,l,"decrypt"),t.chatKeys[e.to+"<->"+e.from]=f),f.authenticated&&!o){var d=Z(e.body.value),y=ee(d.iv),h=ee(d.value),p=ee(d.hash);t.crypto.decryptAES(f.keys.hypertyToSessionKey,h,y).then(function(n){e.body.value=n;var o=t._filterMessageToHash(e,n+y);t.crypto.verifyHMAC(f.keys.hypertyToHashKey,o,p).then(function(t){e.body.assertedIdentity=!0,r(e)})})}else o?t._doHandShakePhase(e,f).then(function(r){"handShakeEnd"===r||(t.chatKeys[e.to+"<->"+e.from]=r.chatKeys,t._messageBus.postMessage(r.message))}):n("wrong message do decrypt")}else n("error on decrypt message")}else c&&a?t.storageManager.get("dataObjectSessionKeys").then(function(o){var i=(o=z(o||{}))?o[s]:null;if(i)if(i.isToEncrypt){var a=re(e.body.value),c=ee(a.iv),u=ee(a.value),l=ee(a.hash);t.crypto.decryptAES(i.sessionKey,u,c).then(function(o){var s=re(o);e.body.value=s;var a=t._filterMessageToHash(e,te(s)+te(c));t.crypto.verifyHMAC(i.sessionKey,a,l).then(function(t){to.log("Received message HMAC result",t),e.body.assertedIdentity=!0,r(e)}).catch(function(e){n("Message HMAC is invalid: "+e)})})}else e.body.assertedIdentity=!0,r(e);else e.body.assertedIdentity=!0,r(e)}):n("wrong message to decrypt")})})}},{key:"decryptDataObject",value:function(e,t){var r=this;return new Promise(function(n,o){if(!r.isToUseEncryption)return n(e);var i=$(t);r.storageManager.get("dataObjectSessionKeys").then(function(t){var s=(t=z(t))?t[i]:null;if(!s)return o("No dataObjectKey for this dataObjectURL:",i);if(!s.isToEncrypt)return n(e);var a=ee(e.iv),c=ee(e.value);r.crypto.decryptAES(s.sessionKey,c,a).then(function(e){var t={value:re(e),iv:Q(a)};return n(t)}).catch(function(e){o("On decryptDataObject from method encryptAES error: "+e)})})})}},{key:"_doMutualAuthenticationPhase1",value:function(e){var t=this;return new Promise(function(r,n){var o=e.to.split("/");o.pop();var i=o[0]+"//"+o[2]+"/"+o[3];t._doMutualAuthenticationPhase2(i,e.body.subscriber).then(function(){t._registry.registerSubscriber(i,e.body.subscriber),r()},function(e){n(e)})})}},{key:"_doMutualAuthenticationPhase2",value:function(e,t){to.info("doMutualAuthentication:sender ",e),to.info("doMutualAuthentication:receiver ",t);var r=this;return new Promise(function(n,o){var i,s=r._registry.getReporterURLSynchonous(e);s&&(i=e,e=s);var a={to:t,from:e,callback:void 0,body:{handshakePhase:"startHandShake",ignore:"ignoreMessage"}};if(!e||!t)return o("sender or receiver missing on doMutualAuthentication");var c=r.chatKeys[e+"<->"+t],u=r._registry.getHypertyOwner(e);if(u)if(c||(a.callback=function(e){n(e)},a.dataObjectURL=i,c=r._newChatCrypto(a,u),r.chatKeys[e+"<->"+t]=c),c.authenticated){var l={to:e,from:t};c.dataObjectURL=i,r._sendReporterSessionKey(l,c).then(function(e){r._messageBus.postMessage(e.message),n("exchange of chat sessionKey initiated")}).catch(function(e){o("On doMutualAuthentication from method _sendReporterSessionKey error: "+e)})}else r._doHandShakePhase(a,c);else o("Mutual authentication error: Hyperty owner could not be resolved")})}},{key:"_sendReporterSessionKey",value:function(e,t){var r=this;return new Promise(function(n,o){var i,s,a,c,u=r.dataObjectSessionKeys[t.dataObjectURL],l={};if(u)a=u.sessionKey;else{a=r.crypto.generateRandom(),r.dataObjectSessionKeys[t.dataObjectURL]={sessionKey:a,isToEncrypt:!0};var f=Y(r.dataObjectSessionKeys);r.storageManager.set("dataObjectSessionKeys",0,f).catch(function(e){o("On _sendReporterSessionKey from method storageManager.set(dataObjectSessionKeys...) error: "+e)})}try{s=Q({value:Q(a),dataObjectURL:t.dataObjectURL})}catch(e){return o("On _sendReporterSessionKey from method storageManager.set error valueToEncrypt: "+e)}c=r.crypto.generateIV(),l.iv=Q(c),r.crypto.encryptAES(t.keys.hypertyFromSessionKey,s,c).then(function(n){i={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"reporterSessionKey",value:Q(n)}};var o=r._filterMessageToHash(i,s+c,t.hypertyFrom.messageInfo);return r.crypto.hashHMAC(t.keys.hypertyFromHashKey,o)}).then(function(e){var r=Q({value:i.body.value,hash:Q(e),iv:l.iv});i.body.value=r,n({message:i,chatKeys:t})}).catch(function(e){o("On _sendReporterSessionKey from chained promises encryptAES error: "+e)})})}},{key:"_resolveDomain",value:function(e){return e?"domain-idp://"+e:"domain-idp://google.com"}},{key:"_doHandShakePhase",value:function(e,t){var r=this;return new Promise(function(n,o){var i,s,a,c,u=e.body.handshakePhase,l={};switch(to.info("handshake phase: ",u),u){case"startHandShake":t.keys.fromRandom=r.crypto.generateRandom();var f={type:"handshake",to:e.to,from:e.from,body:{handshakePhase:"senderHello",value:Q(t.keys.fromRandom)}};t.handshakeHistory.senderHello=r._filterMessageToHash(f,void 0,t.hypertyFrom.messageInfo),t.initialMessage?n({message:f,chatKeys:t}):(r.chatKeys[e.from+"<->"+e.to]=t,r._messageBus.postMessage(f));break;case"senderHello":to.log("senderHello"),t.handshakeHistory.senderHello=r._filterMessageToHash(e),t.keys.fromRandom=ee(e.body.value),t.keys.toRandom=r.crypto.generateRandom();var d={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"receiverHello",value:Q(t.keys.toRandom)}};t.handshakeHistory.receiverHello=r._filterMessageToHash(d,void 0,t.hypertyFrom.messageInfo),n({message:d,chatKeys:t});break;case"receiverHello":to.log("receiverHello"),r.getMyPrivateKey().then(function(n){return c=n,t.handshakeHistory.receiverHello=r._filterMessageToHash(e),r._idm.validateAssertion(e.body.identity.assertion,void 0,e.body.identity.idp.domain)}).then(function(n){var o=ne("string"==typeof n.contents?n.contents:n.contents.nonce),i=r.crypto.generatePMS(),s=e.body.value;t.hypertyTo.assertion=e.body.identity.assertion,t.hypertyTo.publicKey=o,t.hypertyTo.userID=e.body.identity.userProfile.userURL,t.keys.toRandom=ee(s),t.keys.premasterKey=i;var a=r.crypto.concatPMSwithRandoms(i,t.keys.toRandom,t.keys.fromRandom);return r.crypto.generateMasterSecret(a,"messageHistoric"+t.keys.toRandom+t.keys.fromRandom)}).then(function(e){return t.keys.masterKey=e,r.crypto.generateKeys(e,"key expansion"+t.keys.toRandom+t.keys.fromRandom)}).then(function(n){t.keys.hypertyToSessionKey=new Uint8Array(n[0]),t.keys.hypertyFromSessionKey=new Uint8Array(n[1]),t.keys.hypertyToHashKey=new Uint8Array(n[2]),t.keys.hypertyFromHashKey=new Uint8Array(n[3]),i=r.crypto.generateIV(),l.iv=Q(i);var o={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"senderCertificate"}};return a=r._filterMessageToHash(o,"ok"+i,t.hypertyFrom.messageInfo),r.crypto.hashHMAC(t.keys.hypertyFromHashKey,a)}).then(function(e){return l.hash=Q(e),r.crypto.encryptAES(t.keys.hypertyFromSessionKey,"ok",i)}).then(function(e){return l.symetricEncryption=Q(e),r.crypto.encryptRSA(t.hypertyTo.publicKey,t.keys.premasterKey)}).then(function(n){l.assymetricEncryption=Q(n);var o={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"senderCertificate"}},i=r._filterMessageToHash(o,t.keys.premasterKey,t.hypertyFrom.messageInfo);return r.crypto.signRSA(c,Q(t.handshakeHistory)+Q(i))}).then(function(o){l.signature=Q(o);var s={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"senderCertificate",value:Q(l)}};t.handshakeHistory.senderCertificate=r._filterMessageToHash(s,"ok"+i,t.hypertyFrom.messageInfo),n({message:s,chatKeys:t})},function(e){return o(e)});break;case"senderCertificate":to.log("senderCertificate");var y=Z(e.body.value);r.getMyPrivateKey().then(function(t){return c=t,r._idm.validateAssertion(e.body.identity.assertion,void 0,e.body.identity.idp.domain)}).then(function(n){var o=ee(y.assymetricEncryption),i=ne("string"==typeof n.contents?n.contents:n.contents.nonce);return t.hypertyTo.assertion=e.body.identity.assertion,t.hypertyTo.publicKey=i,t.hypertyTo.userID=e.body.identity.userProfile.userURL,r.crypto.decryptRSA(c,o)},function(e){o("Error during authentication of identity: ",e.message)}).then(function(n){t.keys.premasterKey=new Uint8Array(n);var o=ee(y.signature),i=r._filterMessageToHash(e,t.keys.premasterKey);return r.crypto.verifyRSA(t.hypertyTo.publicKey,Q(t.handshakeHistory)+Q(i),o)}).then(function(e){var n=r.crypto.concatPMSwithRandoms(t.keys.premasterKey,t.keys.toRandom,t.keys.fromRandom);return r.crypto.generateMasterSecret(n,"messageHistoric"+t.keys.toRandom+t.keys.fromRandom)}).then(function(e){return t.keys.masterKey=e,r.crypto.generateKeys(e,"key expansion"+t.keys.toRandom+t.keys.fromRandom)}).then(function(e){t.keys.hypertyFromSessionKey=new Uint8Array(e[0]),t.keys.hypertyToSessionKey=new Uint8Array(e[1]),t.keys.hypertyFromHashKey=new Uint8Array(e[2]),t.keys.hypertyToHashKey=new Uint8Array(e[3]),i=ee(y.iv);var n=ee(y.symetricEncryption);return r.crypto.decryptAES(t.keys.hypertyToSessionKey,n,i)}).then(function(n){t.handshakeHistory.senderCertificate=r._filterMessageToHash(e,n+i);var o=ee(y.hash);return a=r._filterMessageToHash(e,n+i),r.crypto.verifyHMAC(t.keys.hypertyToHashKey,a,o)}).then(function(n){var o={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"receiverFinishedMessage"}};return i=r.crypto.generateIV(),l.iv=Q(i),a=r._filterMessageToHash(o,"ok!"+i,t.hypertyFrom.messageInfo),r.crypto.hashHMAC(t.keys.hypertyFromHashKey,a)}).then(function(e){return l.hash=Q(e),r.crypto.encryptAES(t.keys.hypertyFromSessionKey,"ok!",i)}).then(function(o){l.value=Q(o);var s={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"receiverFinishedMessage",value:Q(l)}};t.handshakeHistory.receiverFinishedMessage=r._filterMessageToHash(s,"ok!"+i,t.hypertyFrom.messageInfo),t.authenticated=!0,n({message:s,chatKeys:t})}).catch(function(e){o("On _doHandShakePhase from senderCertificate error: "+e)});break;case"receiverFinishedMessage":t.authenticated=!0,l=Z(e.body.value),i=ee(l.iv);var h=ee(l.value);s=ee(l.hash),r.crypto.decryptAES(t.keys.hypertyToSessionKey,h,i).then(function(a){t.handshakeHistory.receiverFinishedMessage=r._filterMessageToHash(e,a+i);var c=r._filterMessageToHash(e,a+i);r.crypto.verifyHMAC(t.keys.hypertyToHashKey,c,s).then(function(i){if(t.initialMessage){var s={type:"create",to:e.from,from:e.to,body:{value:t.initialMessage.body.value}};n({message:s,chatKeys:t})}else r._sendReporterSessionKey(e,t).then(function(e){n(e)}).catch(function(e){o("On _doHandShakePhase from receiverFinishedMessage error: "+e)})})});break;case"reporterSessionKey":to.log("reporterSessionKey");var p=Z(e.body.value);s=ee(p.hash),i=ee(p.iv);var v,g,b,m,_=ee(p.value);r.crypto.decryptAES(t.keys.hypertyToSessionKey,_,i).then(function(n){v=Z(n),g=ee(v.value),b=v.dataObjectURL;var o=r._filterMessageToHash(e,n+i);return r.crypto.verifyHMAC(t.keys.hypertyToHashKey,o,s)}).then(function(e){r.dataObjectSessionKeys[b]={sessionKey:g,isToEncrypt:!0};var n=Y(r.dataObjectSessionKeys);return r.storageManager.set("dataObjectSessionKeys",0,n).catch(function(e){o("On _sendReporterSessionKey from method reporterSessionKey error: "+e)}),i=r.crypto.generateIV(),l.iv=Q(i),r.crypto.encryptAES(t.keys.hypertyFromSessionKey,"ok!!",i)}).then(function(n){m={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"receiverAcknowledge"}},l.value=Q(n);var o=r._filterMessageToHash(m,"ok!!"+i,t.hypertyFrom.messageInfo);return r.crypto.hashHMAC(t.keys.hypertyFromHashKey,o)}).then(function(e){var r=Q({value:l.value,hash:Q(e),iv:l.iv});m.body.value=r,n({message:m,chatKeys:t})}).catch(function(e){o("On _doHandShakePhase from reporterSessionKey error: "+e)});break;case"receiverAcknowledge":to.log("receiverAcknowledge");var w=Z(e.body.value),O=ee(w.hash);i=ee(w.iv);var k=ee(w.value);r.crypto.decryptAES(t.keys.hypertyToSessionKey,k,i).then(function(n){var o=r._filterMessageToHash(e,n+i);return r.crypto.verifyHMAC(t.keys.hypertyToHashKey,o,O)}).then(function(e){var r=t.callback;r&&r("handShakeEnd"),n("handShakeEnd")}).catch(function(e){o("On _doHandShakePhase from receiverAcknowledge error: "+e)});break;default:o(e)}})}},{key:"_filterMessageToHash",value:function(e,t,r){return{type:e.type,from:e.from,to:e.to,body:{identity:r||e.body.identity,value:t||e.body.value,handshakePhase:e.body.handshakePhase}}}},{key:"_newChatCrypto",value:function(e,t,r){var n=r?e.to:e.from,o=r?e.from:e.to,i=this._idm.getIdentity(t);return{hypertyFrom:{hyperty:n,userID:i.userProfile.userURL,assertion:i.assertion,messageInfo:i},hypertyTo:{hyperty:o,userID:void 0,publicKey:void 0,assertion:void 0},keys:{hypertyToSessionKey:void 0,hypertyFromSessionKey:void 0,hypertyToHashKey:void 0,hypertyFromHashKey:void 0,toRandom:void 0,fromRandom:void 0,premasterKey:void 0,masterKey:void 0},handshakeHistory:{senderHello:void 0,receiverHello:void 0,senderCertificate:void 0,receiverFinishedMessage:void 0},initialMessage:e.body.ignore?void 0:e,callback:e.callback,authenticated:!1,dataObjectURL:e.dataObjectURL}}},{key:"getMyPublicKey",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.userDefaultKeyRef,t=this;return new Promise(function(r,n){t.storageManager.get(e).then(function(o){if(o)return r(o.public);t._generateAndStoreNewAsymetricKey(e).then(function(e){r(e.public)}).catch(function(e){to.error("[getMyPublicKey:_generateAndStoreNewAsymetricKey:err]: "+e.message),n(e)})}).catch(function(e){to.error("[getMyPublicKey:storageManager:err]: "+e.message),n(e)})})}},{key:"getMyPrivateKey",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.userDefaultKeyRef,t=this;return new Promise(function(r,n){t.storageManager.get(e).then(function(o){if(o)return r(o.private);t._generateAndStoreNewAsymetricKey(e).then(function(e){r(e.private)}).catch(function(e){to.error("[getMyPrivateKey:_generateAndStoreNewAsymetricKey:err]: "+e.message),n(e)})}).catch(function(e){to.error("[getMyPrivateKey:storageManager:err]: "+e.message),n(e)})})}},{key:"_generateAndStoreNewAsymetricKey",value:function(e){var t=this,r=void 0;return new Promise(function(n,o){var i={};i.private=G(),i.public=G(),to.log("_generateAndStoreNewAsymetricKey:userAsymmetricKeyGenerated",i),r=i,t.storageManager.set(e,0,i),n(r)}).catch(function(e){to.error("[_generateAndStoreNewAsymetricKey:err]: "+e.message),reject(e)})}},{key:"messageBus",get:function(){return this._messageBus},set:function(e){this._messageBus=e,this.addCryptoGUIListeners()}},{key:"coreDiscovery",get:function(){return this._coreDiscovery},set:function(e){this._coreDiscovery=e}},{key:"registry",get:function(){return this._registry},set:function(e){this._registry=e}}]),e}());function no(e,t){for(var r=0;r1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2?arguments[2]:void 0;if(arguments.length>3&&arguments[3],!this._readyToUse())return!1;if(!e)throw new Error("[Runtime.Loader] hypertyClass parameter is needed");var s=!1,a=new e,c=a.name;return new Promise(function(e,u){var l=function(e){s=!0,u(e)};oo.info("[Runtime.Loader.loadHyperty] ",c);var f=a.descriptor;f.dataObjects[0]=f.dataObjects[0].replace("%domain%",n._registry._domain),oo.info("[Runtime.Loader] 1: return hyperty descriptor: ",f),r=n.registry.getAppSandbox(),n._addressAllocation.create(n._registry._domain,1,f,"hyperty",o).then(function(e){return!s&&(oo.info("[Runtime.Loader] 6: return the addresses for the hyperty",e),n.registry.registerHyperty(r,c,f,e,i))},l).then(function(e){if(s)return!1;oo.info("[Runtime.Loader] 7: registration result",e),t=e.url;var o={};if(!C(f.configuration))try{o=Object.assign({},JSON.parse(f.configuration))}catch(e){o=f.configuration}o.runtimeURL=n._runtimeURL,e.p2pHandler&&(o.p2pHandler=e.p2pHandler,o.p2pRequester=e.p2pRequester);try{return r.deployComponent(a,t,o)}catch(e){oo.info("[Runtime.Loader] Error on deploy component:",e),u(e)}},l).then(function(o){if(s)return!1;oo.info("[Runtime.Loader] 8: Deploy component status for hyperty: ",o),n.messageBus.addListener(t,function(e){r.postMessage(e)}),n.messageBus.addListener(n.runtimeURL+"/status",function(e){r.postMessage(e)});var i={runtimeHypertyURL:t,status:o,name:c,instance:a};oo.info("[Runtime.Loader] Hyperty deployed: ",i),e(a),oo.info("[Runtime.Loader] ------------------ END ------------------------")},l).catch(function(e){oo.info("[Runtime.Loader] Something failed on the deploy hyperty: ",e),u(e)})})}},{key:"loadStub",value:function(e,t){var r=this;if(!this._readyToUse())return!1;if(!e)throw new Error("[Runtime.Loader.loadStub]ProtoStub descriptor url parameter is needed");return new Promise(function(n,o){var i,s,a,c,u=U(e).domain;u||(u=e);var l,f,d=!1,y=function(e){oo.info("[Runtime.Loader.loadStub]Something failed on the deploy of protocolstub: ",e),o(e)},h=function(e){d=!0,o(e)},p={};oo.info("[Runtime.Loader.loadStub] starting loading for ",e," with p2pconfig ",t),oo.info("[Runtime.Loader.loadStub]Discover or Create a new ProtoStub for domain: ",u);try{if(t)if(t.hasOwnProperty("isHandlerStub")&&t.isHandlerStub)l=r.runtimeURL,f=r.registry.discoverP2PStub();else{var v=t.remoteRuntimeURL;l=v,f=r.registry.discoverP2PStub(v)}else l=u,f=r.registry.discoverProtostub(u);oo.info("[Runtime.Loader.loadStub]1. Proto Stub Discovered for ",e,": ",f),n(f),oo.info(" [Runtime.Loader]------------------- END ---------------------------\n")}catch(f){oo.info("[Runtime.Loader.loadStub]1. Proto Stub not found "+f),r.descriptors.getStubDescriptor(e).then(function(e){if(d)return!1;oo.info("[Runtime.Loader.loadStub]2. return the ProtoStub descriptor"),s=e;var t=e.sourcePackageURL;return"/sourcePackage"===t?e.sourcePackage:r.runtimeCatalogue.getSourcePackageFromURL(t)},h).catch(y).then(function(e){return!d&&(s&&s.constraints&&(p=s.constraints),oo.info("[Runtime.Loader.loadStub]3. return the ProtoStub Source Code"),c=e,r.registry.getSandbox(u,p))}).then(function(e){return!d&&(oo.info("[Runtime.Loader.loadStub]4. if the sandbox is registered then return the sandbox ",e),i=e,e)}).catch(function(e){return!d&&(oo.info("[Runtime.Loader.loadStub]5. Sandbox was not found, creating a new one ",e),r._runtimeFactory.createSandbox(p).then(function(e){return e.addListener("*",function(e){r.messageBus.postMessage(e)}),e}))}).then(function(n){return!d&&(oo.info("[Runtime.Loader.loadStub]6. return the sandbox instance and register",n,"to domain ",u),i=n,r.registry.registerStub(i,l,t,e,s))},h).then(function(e){if(d)return!1;oo.info("[Runtime.Loader.loadStub] 7. return the runtime protostub url: ",e),a=e.url;var n={};if(!C(s.configuration))try{n=Object.assign({},JSON.parse(s.configuration))}catch(e){n=s.configuration}if(t)try{n=Object.assign(n,JSON.parse(t))}catch(e){n=Object.assign(n,t)}n.runtimeURL=r._runtimeURL;try{return oo.info("[Runtime.Loader.loadStub] 8: adding sandbox listener to protostubURL : ",a),r.messageBus.addListener(a,function(e){i.postMessage(e)}),i.deployComponent(c.sourceCode,a,n)}catch(e){oo.error("[Runtime.Loader.loadStub] Error on deploy component:",e),o(e)}},h).then(function(){if(d)return!1;var e;t?(oo.log("[Runtime.Loader.loadStub] p2pConfig: ",t),t.hasOwnProperty("isHandlerStub")&&(e=r.registry.p2pHandlerStub[r._runtimeURL]),t.hasOwnProperty("p2pRequesterStub")&&(e=r.registry.p2pRequesterStub[t.remoteRuntimeURL])):e=r.registry.protostubsList[u],oo.log("[Runtime.Loader.loadStub] Stub: ",e),n(e),oo.info("[Runtime.Loader.loadStub]------------------- END ---------------------------\n")},h).catch(y)}})}},{key:"loadIdpProxy",value:function(e){var t=this;if(!this._readyToUse())return!1;if(!e)throw new Error("[Runtime.Loader] IdpProxy descriptor url parameter is needed");return new Promise(function(r,n){var o,i,s,a,c=U(e).domain;c||(c=e);var u=!1,l=function(e){u=!0,n(e)};oo.info("[Runtime.Loader] ------------------- IDP Proxy Deploy ---------------------------\n"),oo.info("[Runtime.Loader] Discover or Create a new IdpProxy for domain/URL: ",c);try{var f=t.registry.discoverIdpProxy(c);oo.info("[Runtime.Loader] 1. IDPProxy Discovered: ",f);var d=t.registry.idpProxyList[c];oo.log("Deployed: ",d),r(d),oo.info("[Runtime.Loader] ------------------- END ---------------------------\n")}catch(f){oo.info("[Runtime.Loader] 1. IdpProxy not found:",f),t.descriptors.getIdpProxyDescriptor(e).then(function(e){oo.info("[Runtime.Loader] 2. Return the IDPProxy descriptor"),i=e;var r=e.sourcePackageURL;return"/sourcePackage"===r?e.sourcePackage:t.runtimeCatalogue.getSourcePackageFromURL(r)},l).then(function(e){return!u&&(oo.info("[Runtime.Loader] 3. return the IDPProxy source package"),a=e,!0)},l).then(function(e){return!u&&t.registry.getSandbox(c)}).then(function(e){return!u&&(oo.info("[Runtime.Loader] 4. if the sandbox is registered then return the sandbox",e),o=e,e)}).catch(function(e){return!u&&(oo.info("[Runtime.Loader] 5. Sandbox was not found, creating a new one",e),i&&i.hasOwnProperty("capabilities")&&(i=i.stubCapabilities),t._runtimeFactory.createSandbox({}).then(function(e){return e.addListener("*",function(e){t.messageBus.postMessage(e)}),e}))}).then(function(e){return!u&&(oo.info("[Runtime.Loader] 6. return the sandbox instance and register",e,"to domain ",c),o=e,t.registry.registerIdpProxy(e,c))},l).then(function(e){if(u)return!1;oo.info("[Runtime.Loader] 7. Return the runtime Idp Proxy URL: ",e),s=e;var r={};if(!C(i.configuration))try{r=Object.assign({},JSON.parse(i.configuration))}catch(e){r=i.configuration}r.runtimeURL=t._runtimeURL;try{return t.messageBus.addListener(s,function(e){o.postMessage(e)}),o.deployComponent(a.sourceCode,e,r)}catch(e){oo.info("[Runtime.Loader] Error on deploy component:",e),n(e)}},l).then(function(){if(u)return!1;var e=t.registry.idpProxyList[c];oo.log("[Runtime.Loader.loadIdpProxy] 8: loaded: ",e),r(e),oo.info("[Runtime.Loader.loadIdpProxy] ------------------- END ---------------------------\n")},l).catch(function(e){oo.info("[Runtime.Loader] Something failed on the deploy of IdpProxy: ",e),n(e)})}})}},{key:"_readyToUse",value:function(){if(!this._runtimeURL)throw new Error("[Runtime.Loader] The loader need the runtime url address");if(!this._messagesBus)throw new Error("[Runtime.Loader] The loader need the messageBus component");if(!this._registry)throw new Error("[Runtime.Loader] The loader need the registry component");if(!this._runtimeFactory)throw new Error("[Runtime.Loader] The loader need the runtime factory component");return!0}},{key:"runtimeURL",set:function(e){this._runtimeURL=e},get:function(){return this._runtimeURL}},{key:"registry",set:function(e){this._registry=e;var t=mr.instance;this._addressAllocation=t,oo.log("[Loader - AddressAllocation] - ",t)},get:function(){return this._registry}},{key:"messageBus",set:function(e){this._messagesBus=e},get:function(){return this._messagesBus}},{key:"runtimeFactory",set:function(e){this._runtimeFactory=e},get:function(){return this._runtimeFactory}}]),e}(),so={};function ao(e,t,r,n){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(!t)throw new Error("The runtime factory is a needed parameter");var i=o||Wr.remoteStorage;return t.storageManager(e,r,n,i)}function co(e,t){for(var r=0;r-1?s.body.resource=e:s.body.resource="/hyperty/idp-identifier/"+e,t.length>0&&(s.body.criteria||(s.body.criteria={}),s.body.criteria.dataSchemes=t),r.length>0&&(s.body.criteria||(s.body.criteria={}),s.body.criteria.resources=r),new Promise(function(e,t){i.messageBus.postMessage(s,function(r){if(200!==r.body.code&&500!==r.body.code)return t("No Hyperty was found");var n=r.body.value,o=[];for(var i in n)o.push(n[i]);if(!(o.length>0))return t("No Hyperty was found");e(o)})})}},{key:"discoverDataObjects",value:function(e,t,r,n){var o,i=this,s=[];return o=n||i.domain,new Promise(function(n,a){i.discoverHyperties(e,[],[],o).then(function(e){var c=[];for(var u in e)c.push(e[u]);var l=c.map(function(e){return new Promise(function(n,s){i.discoverDataObjectsPerReporter(e.hypertyID,t,r,o).then(function(e){n(e)}).catch(function(e){n([])})})});Promise.all(l).then(function(e){[].concat.apply([],e).forEach(function(e){s.push(e)});var t=[];for(var r in s)t.push(s[r]);if(0===t.length)return a("No dataObjects were found");n(t)})}).catch(function(e){return a(e)})})}},{key:"discoverHypertyPerURL",value:function(e,t){var r,n=this;r=t||n.domain;var o={type:"read",from:n.discoveryURL,to:"domain://registry."+r,body:{resource:e}};return new Promise(function(e,t){n.messageBus.postMessage(o,function(r){if(200!==r.body.code&&500!==r.body.code)return t("No Hyperty was found");var n=r.body.value;if(!n)return t("No Hyperty was found");e(n)})})}},{key:"discoverDataObjectPerURL",value:function(e,t){var r,n=this;r=t||n.domain;var o={type:"read",from:n.discoveryURL,to:"domain://registry."+r,body:{resource:e}};return new Promise(function(e,t){n.messageBus.postMessage(o,function(r){var n=r.body.value;if(!n)return t("DataObject not found");e(n)})})}},{key:"discoverDataObjectsPerName",value:function(e,t,r,n){var o,i=this;o=n||i.domain;var s={type:"read",from:i.discoveryURL,to:"domain://registry."+o,body:{resource:e}};return t.length>0&&(s.body.criteria||(s.body.criteria={}),s.body.criteria.dataSchemes=t),r.length>0&&(s.body.criteria||(s.body.criteria={}),s.body.criteria.resources=r),new Promise(function(e,t){i.messageBus.postMessage(s,function(r){var n=r.body.value,o=[];for(var i in n)o.push(n[i]);if(!(o.length>0))return t("No DataObject was found");e(o)})})}},{key:"discoverDataObjectsPerReporter",value:function(e,t,r,n){var o,i=this;o=n||i.domain;var s={type:"read",from:i.discoveryURL,to:"domain://registry."+o,body:{resource:"/comm",criteria:{reporter:e}}};return t.length>0&&(s.body.criteria.dataSchemes=t),r.length>0&&(s.body.criteria.resources=r),new Promise(function(e,t){i.messageBus.postMessage(s,function(r){var n=r.body.value,o=[];for(var i in n)o.push(n[i]);if(!(o.length>0))return t("No DataObject was found");e(o)})})}},{key:"discoverUserIdsPerGUID",value:function(e){var t=this;return new Promise(function(r,n){t.graphConnector.queryGlobalRegistry(e).then(function(e){if("string"==typeof e||!e)return n("Unsuccessful discover userIDs by GUID");var t=e.userIDs;if(0===t.length)return n("UserIDs not available");r(t)}).catch(function(e){return n(e)})})}},{key:"discoverGUIDPerUserIdentifier",value:function(e){var t=this;return new Promise(function(r,n){t.httpRequest.get("https://rethink.tlabscloud.com/discovery/rest/discover/lookup?searchquery="+e).then(function(e){var t=JSON.parse(e).results.filter(function(e){return null!=e.rethinkID});if(0===t.length)return n("Unsuccessful discover GUID by user identifier");var o=t.map(function(e){return e.rethinkID});return r(o)}).catch(function(e){return n(e)})})}},{key:"messageBus",get:function(){return this._messageBus},set:function(e){this._messageBus=e}}]),e}();function bo(e){return(bo="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function mo(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3?arguments[3]:void 0;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),!t)throw new Error("[Store Data Objects] - Needs the storageManager component");this._storageManager=t,this._storeDataObject=r,this._cache={},this._createSyncDB=ao,this._remotes={},this._factory=n,this._table="syncherManager:ObjectURLs",this._remoteStorageTable="dataObjectStorage",this._remoteSchema="url",this._runtimeStatusUpdate=o}return function(e,t,r){t&&mo(e.prototype,t)}(e,[{key:"loadRemote",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],r=this;return new Promise(function(n,o){var i=[],s=[];r._storageManager.get(null,null,"remotes").then(function(a){_o.info("[StoreDataObjects.loadRemote] remotes: ",a),a||n(),t||(r._remotes=a),_o.info("[StoreDataObjects.loadRemote] loading: ",r._remotes);var c=Object.keys(a);0===c.length&&n(),c.forEach(function(t){var n={},o=t.split("/")[3];n[o]=e._remoteSchema,r._remotes[t]=ao(t,e._factory,n,e._runtimeStatusUpdate),i.push(r._remotes[t].get(null,null,o))}),Promise.all(i).then(function(){_o.log("[StoreDataObjects.loadRemote] loaded. Starting init"),Object.keys(r._remotes).forEach(function(e){var t=e.split("/")[3];s.push(r._remotes[e].get(null,null,t))}),Promise.all(s).then(function(t){0===t.length&&n(),t.forEach(function(t){Object.keys(t).forEach(function(n){_o.log("[StoreDataObjects.loadRemote] loaded remote ",t[n]);var o=e._getTypeOfObject(t[n].isReporter);r._storeDataObject||(r._storeDataObject={}),r._storeDataObject.hasOwnProperty(o)||(r._storeDataObject[o]={}),r._storeDataObject[o][n]=t[n]})}),n(r._storeDataObject)},function(e){o(e)})})},function(e){o(e)}),n()})}},{key:"deleteRemotes",value:function(){var e=this;return new Promise(function(t,r){var n=[];e._storageManager.get(null,null,"remotes").then(function(r){_o.info("[StoreDataObjects.deleteRemotes] remotes: ",r),r||t();var o=Object.keys(e._remotes);0===o.length&&t(),o.forEach(function(t){n.push(e._remotes[t].disconnect()),n.push(e._remotes[t].delete())}),Promise.all(n).then(function(){_o.log("[StoreDataObjects.deleteRemotes] deleted."),t()},function(e){t()})}),t()})}},{key:"set",value:function(e){var t=this;return new Promise(function(r,n){var o=t._storeDataObject?t._storeDataObject:{},i=t._getTypeOfObject(e.isReporter);o.hasOwnProperty(i)||(o[i]={}),o[i].hasOwnProperty(e.url)||(o[i][e.url]={},o[i][e.url].subscriptions=[],o[i][e.url].subscriberUsers=[],o[i][e.url].childrenObjects={},o[i][e.url].data={}),Object.assign(o[i][e.url],e),delete o[i][e.url].subscriberUser,delete o[i][e.url].subscriberHyperty,o[i][e.url].backup=!!e.hasOwnProperty("backup")&&e.backup,e.subscriberHyperty&&!e.isReporter&&t._updateToArray(o[i],e.url,"subscriptions",e.subscriberHyperty),e.subscriberUser&&o[i][e.url].subscriberUsers.indexOf(e.subscriberUser)&&t._updateToArray(o[i],e.url,"subscriberUsers",e.subscriberUser),t._storeDataObject=o;var s=!!e.hasOwnProperty("backup")&&e.backup,a=s?e.url:t._table,c=s?a.split("/")[3]:t._table;if(s&&!t._remotes[a]){var u={};u[c]=t._remoteSchema,t._remotes[a]=ao(a,t._factory,u,t._runtimeStatusUpdate)}s&&t._storageManager.set(e.url,0,e.url,"remotes");var l=s?t._remotes[a]:t._storageManager;if(e.isReporter&&s){var f={table:c};l.connect(f).then(function(){l.set(a,0,o[i][e.url],c).then(function(){r(o[i][e.url])},function(n){_o.error("[DataObjectStorage.set] failed to save into remote storage: ",n),t._connectToRemoteThread(l,f,a,o[i][e.url],c),r(o[i][e.url])})},function(n){_o.error("[DataObjectStorage.set] failed to connect with remote storage: ",n," trying again..."),t._connectToRemoteThread(l,f,a,o[i][e.url],c),r(o[i][e.url])})}else l.set(a,1,t._filterRemotes(o),c).then(function(){r(o[i][e.url])})})}},{key:"_connectToRemoteThread",value:function(e,t,r,n,o){var i,s=!1;i=setInterval(function(){s||function(n){_o.error("[DataObjectStorage._connectToRemote] trying to connect to remote storage ... "),e.connect(t).then(function(){e.set(r,0,n,o).then(function(){s=!0,clearInterval(i)},function(e){_o.error("[DataObjectStorage._connectToRemote] failed to save into remote storage: ",e)})},function(e){_o.error("[DataObjectStorage._connectToRemote] failed to connect to remote storage: ",e)})}(n)},5e3)}},{key:"_filterRemotes",value:function(e){var t=Object.keys(this._remotes),r=A(e);return t.forEach(function(e){r.reporters[e]?delete r.reporters[e]:delete r.observers[e]}),console.log("[DataObjectStorage._filterRemotes] ",r),r}},{key:"saveData",value:function(e,t,r,n,o){var i=this._storeDataObject,s=this._getTypeOfObject(e);if(i&&i[s]&&i[s][t]){var a;_o.log("[StoreDataObjects - saveData] - ",e,s,t,r,n),i[s][t].hasOwnProperty("data")||(i[s][t].data={}),r?(a="object"===bo(n)?A(n):n,V(i[s][t].data,r,a)):i[s][t].data=A(n)||{},this._storeDataObject=i;var c=i[s][t].backup?i[s][t].url:"syncherManager:ObjectURLs",u=i[s][t].backup?this._remotes[c]:this._storageManager,l=i[s][t].backup?c.split("/")[3]:this._table,f=i[s][t].backup?i[s][t]:this._filterRemotes(i);u.set(c,1,f,l,o).then(function(){return i[s][t]},function(e){return console.error(e),i[s][t]})}else _o.log("[StoreDataObjects - save data] - not saved")}},{key:"saveChildrens",value:function(e,t,r,n){var o=this._storeDataObject,i=this._getTypeOfObject(e);if(o&&o[i]&&o[i][t]){o[i][t].hasOwnProperty("childrens")||(o[i][t].childrenObjects={}),r?V(o[i][t].childrenObjects,r,A(n)):o[i][t].childrenObjects=A(n)||{},this._storeDataObject=o;var s=o[i][t].backup?o[i][t].url:"syncherManager:ObjectURLs",a=o[i][t].backup?this._remotes[s]:this._storageManager,c=o[i][t].backup?s.split("/")[3]:this._table,u=o[i][t].backup?o[i][t]:this._filterRemotes(o);a.set(s,1,u,c).then(function(){return o[i][t]})}else _o.log("[StoreDataObjects - save childrens] - not saved")}},{key:"update",value:function(e,t,r,n,o){var i=this._storeDataObject,s=this._getTypeOfObject(e);if(i&&i[s]&&i[s][t]){if(_o.log("[StoreDataObjects - update] - ",e,s,t,r,n),i[s]&&i[s][t]&&t&&r&&n){if("subscriptions"===r||"subscriberUsers"===r){var a=!0;"subscriptions"===r&&(a=!this._isOwner(i[s][t],n)),a&&this._updateToArray(i[s],t,r,n)}else i[s][t][r]=n;this._storeDataObject=i;var c=i[s][t].backup?i[s][t].url:"syncherManager:ObjectURLs",u=i[s][t].backup?this._remotes[c]:this._storageManager,l=i[s][t].backup?c.split("/")[3]:this._table,f=i[s][t].backup?i[s][t]:this._filterRemotes(i);u.set(c,1,f,l,o).then(function(){return i[s][t]})}}else _o.log("[StoreDataObjects - update] - not saved")}},{key:"delete",value:function(e,t,r,n){var o=this._storeDataObject,i=this._getTypeOfObject(e);if(o&&o[i]&&o[i][t]){if(o[i]&&o[i][t]&&t&&r&&n){"subscriptions"===r||"subscriberUsers"===r?this._removeFromArray(o[i],t,r,n):delete o[i][t][r],this._storeDataObject=o;var s=o[i][t].backup?o[i][t].url:"syncherManager:ObjectURLs",a=o[i][t].backup?this._remotes[s]:this._storageManager,c=o[i][t].backup?s.split("/")[3]:this._table,u=o[i][t].backup?o[i][t]:this._filterRemotes(o);return a.set(s,1,u,c),o[i][t]}}else _o.log("[StoreDataObjects - delete] - not saved")}},{key:"deleteResource",value:function(e){var t=this,r=this;return new Promise(function(n,o){var i,s,a;if(e)return _o.info("[DataObjectStorage.deleteResource] deleting: ",e),r._storeDataObject.hasOwnProperty("observers")&&r._storeDataObject.observers.hasOwnProperty(e)&&(i=!!r._storeDataObject.observers[e].backup,s=i?r._storeDataObject.observers[e].url:"syncherManager:ObjectURLs",a=i?r._remotes[s]:r._storageManager,delete r._storeDataObject.observers[e]),r._storeDataObject.hasOwnProperty("reporters")&&r._storeDataObject.reporters.hasOwnProperty(e)&&(i=!!r._storeDataObject.reporters[e].backup,s=i?r._storeDataObject.reporters[e].url:"syncherManager:ObjectURLs",a=i?r._remotes[s]:r._storageManager,delete r._storeDataObject.reporters[e]),i&&a?a.delete().then(function(){delete r._remotes[s],r._storageManager.delete(e,null,"remotes")}):a.set(s,1,t._filterRemotes(r._storeDataObject)),n();o(new Error("[StoreDataObjects] - Can't delete this "+e))})}},{key:"getAll",value:function(){var e=this,t=this;return new Promise(function(r,n){t._storeDataObject=e._storageManager.get("syncherManager:ObjectURLs").then(function(e){t._storeDataObject=e,t.loadRemote(!0).then(function(e){r(t._storeDataObject)})})})}},{key:"sync",value:function(e,t){var r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=this;if(n._remotes[e]){var o=e.split("/")[3];if(t)return n._sync(e,t,r,o);n._remotes[e].getBackupRevision(e).then(function(t){return n._sync(e,t,r,o)})}else{var i="[DataObjectStorage.sync] Info: "+e+" is not synched with remote storage.";_o.info(i)}}},{key:"_sync",value:function(e,t,r,n){var o=this;return console.log("[DataObjectStorage._sync] backupRevision: ",t),new Promise(function(i,s){var a={table:n,observer:!1,syncedRevision:t+3};o._remotes[e].connect(a).then(function(){_o.info("[DataObjectStorage.sync] connected with remote "),o._remotes[e].get(null,null,n).then(function(t){_o.info("[DataObjectStorage.sync] returning synched DO: ",t),r&&setTimeout(function(){o._remotes[e].disconnect().then(function(){_o.info("[DataObjectStorage.sync] disconnected ")},function(e){_o.error("[DataObjectStorage.sync] Error synching with remote storage"),s(e)})},2e3),i(t[e])},function(e){_o.error("[DataObjectStorage.sync] Error retrieving stored data object"),s(e)})},function(t){_o.error("[DataObjectStorage.sync] Error connecting to remote storage ",t),o._remotes[e].get(null,null,n).then(function(t){_o.info("[DataObjectStorage.sync] returning synched DO: ",t),i(t[e])})})})}},{key:"stopSync",value:function(e){this._remotes[e]&&this._remotes[e].disconnect()}},{key:"getDataObject",value:function(e){var t=this;return new Promise(function(r,n){var o,i=t._storeDataObject,s=i.hasOwnProperty("observers")?i.observers:{},a=i.hasOwnProperty("reporters")?i.reporters:{},c=Object.keys(a).find(function(t){return t===e}),u=Object.keys(s).find(function(t){return t===e});return u&&(o=i.observers[u]),c&&(o=i.reporters[c]),_o.info("[StoreDataObjects - getDataObject] - for observer: ",u),_o.info("[StoreDataObjects - getDataObject] - for reporters: ",c),_o.info("[StoreDataObjects - getDataObject] - resolve: ",o),o?r(o):n("No dataObject was found")})}},{key:"getResourcesByCriteria",value:function(e,t){var r=this;return new Promise(function(n){var o=r._getTypeOfObject(t),i=r._storeDataObject;if(!i)return _o.log("[DataObjectsStorage.getResourcesByCriteria] don't have stored data objects"),n(null);if(e.body&&e.body.hasOwnProperty("resume")&&!e.body.resume)return n(null);var s,a=[],c=r._hasSubscription(i[o],e.from),u=r._searchOwner(i[o],e.from),l=r._checkProtostubResume(i,e);if(_o.log("[StoredDataObjects - getResourcesByCriteria]:",i,e,c,u),!(e.hasOwnProperty("from")&&c||u||l))return n(null);s=u?r._getResourcesByOwner(i[o],e.from):r._getResourcesBySubscription(i[o],e.from);var f=[];e.body&&e.body.identity&&(f=r._getResourcesByIdentity(i[o],e.body.identity));var d=[];e.body&&e.body.schema&&(d=r._getResourcesBySchema(i[o],e.body.schema));var y=[];if(e.body&&e.body.value){var h=e.body.value;delete h.data,y=r._getResourcesByMetadata(i[o],h)}var p=[];if(e.body&&e.body.value&&e.body.value.data&&(p=r._getResourcesByData(i[o],e.body.value.data)),0==(a=r._intersection(s,f,d,p,y)).length&&l&&"observers"==o&&e.from.split("protostub").length>0){var v=i[o],g=U(e.from).domain;Object.keys(v).filter(function(e){v[e].subscriptions.forEach(function(t){U(t).domain==g&&a.push(e)})})}var b={};a.forEach(function(e){var t=i[o][e];return b[e]=t,b}),_o.log("[Store Data Objects] - ",b),n(b)})}},{key:"_getResourcesByIdentity",value:function(e,t){return e?Object.keys(e).filter(function(r){return e[r].subscriberUsers.filter(function(e){return e===t}).length}):[]}},{key:"_getResourcesByOwner",value:function(e,t){return e?Object.keys(e).filter(function(r){return e[r].reporter===t}):[]}},{key:"_getResourcesBySubscription",value:function(e,t){return e?Object.keys(e).filter(function(r){return e[r].subscriptions.filter(function(e){return e===t}).length}):[]}},{key:"_getResourcesBySchema",value:function(e,t){return Object.keys(e).filter(function(r){var n=e[r];return Object.keys(n).filter(function(e){return"schema"===e&&n[e]===t}).length})}},{key:"_getResourcesByMetadata",value:function(e,t){return t?Object.keys(e).filter(function(r){var n=e[r];return Object.keys(n).filter(function(e){return Object.keys(t).filter(function(r){return e===r&&n[e]===t[r]}).length}).length}):[]}},{key:"_getResourcesByData",value:function(e,t){return t?Object.keys(e).filter(function(r){var n=e[r].hasOwnProperty("data")?e[r].data:{};return Object.keys(n).filter(function(e){return Object.keys(t).filter(function(r){return e===r&&n[e]===t[r]}).length}).length}):[]}},{key:"_hasSubscription",value:function(e,t){return!!e&&Object.keys(e).filter(function(r){return e[r].subscriptions.filter(function(e){return e===t}).length}).length>0}},{key:"_searchOwner",value:function(e,t){return!!e&&Object.keys(e).filter(function(r){return e[r].reporter===t}).length>0}},{key:"_checkProtostubResume",value:function(e,t){if(!e)return!1;if(t.hasOwnProperty("body")&&t.body.hasOwnProperty("value")&&t.body.value.hasOwnProperty("reporter")){var r=t.body.value.reporter;if(e.hasOwnProperty("reporters")){var n=e.reporters;return Object.keys(n).filter(function(e){return n[e].reporter===r}).length>0}return!1}if(e.hasOwnProperty("observers")){var o=e.observers,i=U(t.from).domain;return Object.keys(o).filter(function(e){var t=!1;if(o[e].subscriptions.forEach(function(e){U(e).domain==i&&(t=!0)}),t)return!0}).length>0}}},{key:"_isOwner",value:function(e,t){return!!e&&e.reporter===t}},{key:"_intersection",value:function(){var e=Array.from(arguments).reduce(function(e,t){return e.concat(t)}).filter(function(e,t,r){return r.indexOf(e)===t});return _o.log("DataObjectsStorage._intersection] Result an unique array of strings: ",e),e}},{key:"_updateToArray",value:function(e,t,r,n){_o.log("[DataObjectsStorage] - _updateToArray: ",e,t,r,n),-1===e[t][r].indexOf(n)&&e[t][r].push(n)}},{key:"_removeFromArray",value:function(e,t,r,n){var o=e[t][r].indexOf(n);-1===o&&e[t][r].splice(o,1)}},{key:"_hasValue",value:function(e,t,r){return e.hasOwnProperty(t)&&e[t]===r}},{key:"_getTypeOfObject",value:function(e){return e?"reporters":"observers"}}]),e}();function Oo(e,t){for(var r=0;re.quota){var t="The storage do not have space to store that resource";throw s(t),Error(t)}var o=e.quota,i=e.usage+r.size;return!(e.percent>=n._storageLimit||i>o)||n._getOlderResources(r.size)}).then(function(){return n._storageManager.set(e,1,r)}).then(function(){var r={from:t.to,to:t.from,id:t.id,type:"response",body:{value:e,code:200}};return n._bus.postMessage(r),Po.log("Success"),o()}).catch(s)})}},{key:"_getOlderResources",value:function(e){var t=this;return new Promise(function(r,n){t._storageManager.get().then(function(o){var i=0,s=Object.keys(o).sort(function(e,t){return o[e].created0){var s=[];Object.keys(i).forEach(function(t){s.push(o._resumeCreate(e,i[t]))}),Promise.all(s).then(function(o){Do.log("[SyncherManager - Create Resumed]",o);var i=Object.values(o).filter(function(e){return!1!==e});Do.info("[SyncherManager.onCreate] returning resumed objects : ",i),t._bus.postMessage({id:e.id,type:"response",from:n,to:r,body:{code:200,value:A(i)}})})}else{var a={};a.id=e.id,a.from=e.to,a.to=e.from,a.type="response",a.body={code:404,desc:"No data objects reporters to be resumed"},t._bus.postMessage(a)}})}},{key:"_storeChildrens",value:function(e){var t=e.body.resource,r=e.body.attribute;"childrenObjects"===r?this._dataObjectsStorage.saveChildrens(!1,t,void 0,e.body.value):this._dataObjectsStorage.saveChildrens(!0,t,r,e.body.value)}},{key:"_newCreate",value:function(e){var t=this,r=this,n=e.from,o=U(e.from).domain;r._registry.isInterworkingProtoStub(e.from)&&(o=U(r.runtimeURL).domain);var i=!e.body.value.hasOwnProperty("domain_routing")||e.body.value.domain_routing;r._catalog.getDataSchemaDescriptor(e.body.schema).then(function(s){var a=s.sourcePackage.sourceCode.properties,c=a.scheme?a.scheme:"resource",u=a.children?a.children:[],l={name:e.body.value.name,schema:e.body.value.schema,reporter:e.body.value.reporter,resources:e.body.value.resources},f=e.body.value.resource;r._allocator.create(o,1,l,c,f).then(function(o){var s=A(e.body.value);s.url=o.address[0],s.authorise=e.body.authorise,s.childrens=u,delete s.data,Do.log("[SyncherManager._newCreate] ALLOCATOR CREATE:",o);var a=s.url+"/subscription";Do.log("[SyncherManager._newCreate] Subscription URL",a),Do.info("[SyncherManager._newCreate] Register Object: ",s),r._registry.registerDataObject(s).then(function(o){var c,l;if(Do.log("[SyncherManager._newCreate] DataObject successfully registered",o),t._reporters[s.url])c=t._reporters[s.url];else{var f=!!s.offline&&s.offline;c=new Co(r,n,s.url,u,f)}Do.log("[SyncherManager - new Create] - ",e),l=e.body.hasOwnProperty("identity")&&e.body.identity.userProfile&&e.body.identity.userProfile.userURL?e.body.identity.userProfile.userURL:r._registry.getHypertyOwner(e.from);var d=A(s);d.subscriberUser=l,d.isReporter=!0,e.body.hasOwnProperty("store")&&e.body.store&&(c.isToSaveData=!0,d.isToSaveData=!0,e.body.value.data&&(d.data=A(e.body.value.data))),r._dataObjectsStorage.set(d).then(function(t){if(d.offline){e.body.identity.guid=r._identityModule._identities.guid;var o={from:e.to,to:d.offline+"/register",type:"forward",body:e};o.body.body.resource=s.url,o.body.body.value=d,Do.log("[SyncherManager.newCreate] registering new object at offline manager ",o),r._bus.postMessage(o)}var l={id:e.id,type:"response",from:e.to,to:n,body:{code:200,resource:s.url,childrenResources:u}};i?c.forwardSubscribe([s.url,a]).then(function(){c.addChildrens().then(function(){r._reporters[s.url]=c,r._bus.postMessage(l)})}):c.addChildrens().then(function(){r._reporters[s.url]=c,r._bus.postMessage(l)})},function(e){Do.error(e)})},function(e){Do.error(e)})})}).catch(function(t){var o={id:e.id,type:"response",from:e.to,to:n,body:{code:500,desc:t}};r._bus.postMessage(o)})}},{key:"_resumeCreate",value:function(e,t){var r=this,n=this;return new Promise(function(o){var i=e.from,s=t.schema,a=t.url,c=!t.hasOwnProperty("domain_registration")||t.domain_registration;t.data,Do.log("[SyncherManager] - resume create",e,t),n._catalog.getDataSchemaDescriptor(s).then(function(s){var u,l,f=s.sourcePackage.sourceCode.properties,d=(f.scheme&&f.scheme.constant,f.children?f.children.constant:[]);if(Do.log("[SyncherManager] - getDataSchemaDescriptor: ",s,d),r._reporters[a]?u=r._reporters[a]:(l=!!t.offline&&t.offline,u=new Co(n,i,a,d,l)),u.isToSaveData=t.isToSaveData,l){var y={from:n._url,to:l+"/register",type:"update",body:{}};Do.log("[SyncherManager._resumeCreate] update object at offline manager ",y),n._bus.postMessage(y)}c?u.forwardSubscribe([t.url]).then(function(){Do.log("[SyncherManager._resumeCreate] resumingReporterSubscription ",t),n._resumeReporterSubscriptions(e,t,u,d,c).then(function(e){Do.log("[SyncherManager._resumeCreate] resolved resumed object ",e),o(e)})}):o(n._resumeReporterSubscriptions(e,t,u,d,c))}).catch(function(e){Do.error("[SyncherManager - resume create] - fail on getDataSchemaDescriptor: ",e),o(!1)})})}},{key:"_resumeReporterSubscriptions",value:function(e,t,r,n,o){var i=this,s=t.url,a=A(e.body.value);return a.url=t.url,a.expires=t.expires,a.domain_registration=o,delete a.data,new Promise(function(e){r.addChildrens().then(function(){return r.resumeSubscriptions(t.subscriptions),i._reporters[s]=r,Do.info("[SyncherManager - resume create] - resolved resumed: ",t),i._decryptChildrens(t,n)}).then(function(t){Do.info("[SyncherManager._resumeReporterSubscriptions] Register Object: ",a),i._registry.registerDataObject(a).then(function(r){Do.log("[SyncherManager._resumeReporterSubscriptions] DataObject registration successfully updated",r),Do.log("[SyncherManager._resumeReporterSubscriptions] resolving object",t),e(t)})}).catch(function(t){Do.error("[SyncherManager - resume create] - fail on addChildrens: ",t),e(!1)})})}},{key:"_decryptChildrens",value:function(e,t){var r=A(e);return new Promise(function(e){t?(0===Object.keys(r.childrenObjects).length&&e(r),t.forEach(function(t){var n=r.childrenObjects;Do.log("[SyncherManager._decryptChildrens] dataObjectChilds to decrypt ",n);var o=[];Object.keys(n).forEach(function(e){var t=n[e],i=e.split("#")[0];if("string"==typeof t.value){Do.log("[SyncherManager._decryptChildrens] createdBy ",i," object: ",t.value);var s=ro.decryptDataObject(JSON.parse(t.value),r.url);o.push(s)}}),Promise.all(o).then(function(t){Do.log("[SyncherManager._decryptChildrens] returning decrypted ",t),t.forEach(function(e){var t=e.value.url;r.childrenObjects[t].value=e.value}),Do.log("[SyncherManager._decryptChildrens] storedObject ",r),e(r)}).catch(function(e){Do.warn("[SyncherManager._decryptChildrens] failed : ",e)})})):e(r)})}},{key:"_authorise",value:function(e){var t=this;if(!e.body.resource)throw new Error("[SyncherManager._authorise] invitation request without data object url:",e);var r=e.body.resource+"/subscription",n=!!e.body.p2p&&e.body.p2p;Do.log("[SyncherManager - authorise] - ",e),e.body.authorise&&e.body.authorise.forEach(function(o){t._bus.postMessage({type:"create",from:r,to:o,body:{p2p:n,identity:e.body.identity,source:e.from,value:e.body.value,schema:e.body.schema}},function(r){var n={from:e.to,to:e.from,id:e.id,type:r.type,body:r.body};t._bus.postMessage(n)})})}},{key:"_onDelete",value:function(e){var t=this,r=e.body.resource,n=t._reporters[r];if(n){if(n.offline){var o={from:e.to,to:n.offline+"/register",type:"forward",body:e};Do.log("[SyncherManager._onDelete] unregistering object from offline manager ",o),t._bus.postMessage(o)}n.delete(),this._dataObjectsStorage.deleteResource(r).then(function(n){Do.log("[SyncherManager - onDelete] - deleteResource: ",n),t._registry.unregisterDataObject(r),t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:200}})})}}},{key:"_onLocalSubscribe",value:function(e){var t=this;e.body.hasOwnProperty("resume")&&e.body.resume?this._dataObjectsStorage.getResourcesByCriteria(e,!1).then(function(r){if(Do.info("[SyncherManager.onLocalSubscribe. resume]: ",e," result: ",r),r&&Object.keys(r).length>0){var n=[];Object.keys(r).forEach(function(o){Do.log("[SyncherManager - resume Subscribe] - reuse current object url: ",r[o]),n.push(t._resumeSubscription(e,r[o]))}),Promise.all(n).then(function(r){Do.log("[SyncherManager - Observers Resumed]",r);var n=Object.values(r).filter(function(e){return!1!==e}),o={id:e.id,type:"response",from:e.to,to:e.from,body:{code:200,value:n}};Do.log("[SyncherManager - Observers Resumed] replying ",o),t._bus.postMessage(o)})}else{var o={};o.id=e.id,o.from=e.to,o.to=e.from,o.type="response",o.body={code:404,desc:"No data objects observers to be resumed"},t._bus.postMessage(o)}}):(Do.log("[SyncherManager.onLocalSubscribe - new Subscribe] - ",e.body.schema,e.body.resource),this._newSubscription(e))}},{key:"_newSubscription",value:function(e){var t=this,r=e.body.resource,n=e.from,o=U(r).domain,i=!e.body.hasOwnProperty("domain_subscription")||e.body.domain_subscription,s=r+"/children/";t._catalog.getDataSchemaDescriptor(e.body.schema).then(function(a){var c=a.sourcePackage.sourceCode.properties,u=c.children?c.children.constant:[],l=[];if(l.push(r+"/changes"),l.push(s),i){var f={type:"subscribe",from:t._url,to:"domain://msg-node."+o+"/sm",body:{identity:e.body.identity,resources:l,source:n}};t._bus.postMessage(f,function(o){Do.log("node-subscribe-response(observer): ",o),console.log("REUSETEST SyncherManager - node-subscribe-response(observer): ",o),200===o.body.code?t._newReporterSubscribe(e,n,r,u):t._bus.postMessage({id:e.id,type:"response",from:e.to,to:n,body:o.body})})}else t._newReporterSubscribe(e,n,r,u)})}},{key:"_newReporterSubscribe",value:function(e,t,r,n){var o=this,i=r+"/subscription";o._bus.postMessage({id:e.id,type:"response",from:e.to,to:t,body:{code:100,childrenResources:n,schema:e.body.schema,resource:e.body.resource}});var s={type:"subscribe",from:o._url,to:i,body:{identity:e.body.identity,subscriber:t}};e.body.hasOwnProperty("mutual")&&(s.body.mutual=e.body.mutual),Do.log("[SyncherManager._newSubscription]",s,e),console.log("REUSETEST SyncherManager - [SyncherManager._newSubscription]",s,e),o._bus.postMessage(s,function(i){Do.log("reporter-subscribe-response-new: ",i),console.log("REUSETEST SyncherManager - reporter-subscribe-response-new: ",i),200===i.body.code?o._processSuccessfullSubscription(i,t,r,n,e):e.body.offline&&o._processOfflineSubscription(s,e.body.offline,t,r,n,e)})}},{key:"_processOfflineSubscription",value:function(e,t,r,n,o,i){var s=this,a={from:e.from,type:"forward",to:t,body:e};console.log("[SyncherManager._processOfflineSubscription] forwading ",a),s._bus.postMessage(a,function(e){Do.log("[SyncherManager._processOfflineSubscription] reply ",e),200===e.body.code&&s._processSuccessfullSubscription(e,r,n,o,i)})}},{key:"_processSuccessfullSubscription",value:function(e,t,r,n,o){Do.log("[SyncherManager._newSubscription] - observers: ",this._observers,r,this._observers[r]),console.log("REUSETEST SyncherManager - 200 code[SyncherManager._newSubscription] - observers: ",this._observers,r,this._observers[r]);var i=this._observers[r];i||(i=new xo(this,r,n),Do.log("[SyncherManager._newSubscription] - observers: create new ObserverObject: ",i),this._observers[r]=i,i.addSubscription(t),i.addChildrens());var s,a=!1;o.body.hasOwnProperty("identity")&&o.body.identity.userProfile&&o.body.identity.userProfile.userURL?(s=o.body.identity.userProfile.userURL).includes("user://")||(a=!0):(s=this._registry.getHypertyOwner(o.from))||(a=!0);var c=A(e.body.value);delete c.data,delete c.childrenObjects,c.childrens=n,c.subscriberUser=s,c.isReporter=!1,c.subscriberHyperty=t,a||(this._dataObjectsStorage.set(c),(c.hasOwnProperty("store")&&c.store||c.hasOwnProperty("isToSaveData")&&c.isToSaveData)&&(i.isToSaveData=!0,this._dataObjectsStorage.update(!1,r,"isToSaveData",!0),this._dataObjectsStorage.saveData(!1,r,null,e.body.value.data))),e.id=o.id,e.from=this._url,e.to=t,e.body.schema=o.body.schema,e.body.resource=o.body.resource,o.body.hasOwnProperty("mutual")&&(e.body.mutual=o.body.mutual),Do.log("[subscribe] - new subscription: ",o,e,i),this._bus.postMessage(e)}},{key:"_resumeSubscription",value:function(e,t){var r=this;return new Promise(function(n){var o=t.url,i=t.schema,s=e.from,a=o+"/children/";Do.log("[SyncherManager - ReuseSubscription] - objURL: ",o," - schema:",i),r._catalog.getDataSchemaDescriptor(i).then(function(n){var c=n.sourcePackage.sourceCode.properties,u=c.children?c.children.constant:[],l=[];l.push(o+"/changes"),l.push(a),r._bus.postMessage({id:e.id,type:"response",from:e.to,to:s,body:{code:100,childrenResources:u,schema:i,resource:o}});var f=r._observers[o];return f||((f=new xo(r,o,u)).isToSaveData=t.isToSaveData,r._observers[o]=f),f.addSubscription(s),f.addChildrens(),r._decryptChildrens(t,u)}).then(function(e){n(e)}).catch(function(e){Do.error("[SyncherManager - resume subscription] - fail on getDataSchemaDescriptor: ",e),n(!1)})})}},{key:"_onLocalUnSubscribe",value:function(e){e.from;var t=e.body.resource,r=this._observers[t];r&&(r.removeSubscription(e),this._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:200}}),this._dataObjectsStorage.deleteResource(t),delete this._observers[t])}},{key:"url",get:function(){return this._url}}]),e}();function No(e,t){for(var r=0;r1?t.idModule._getHypertyFromDataObject(e.from).then(function(t){t===e.body.source?r(e):n("The source of the message is not valid.")},function(e){n(e)}):r(e)})}},{key:"getMyEmails",value:function(){var e=this.idModule.getIdentities(),t=[];for(var r in e)t.push(T(e[r].identity));return t}},{key:"getMyHyperties",value:function(){var e=this.runtimeRegistry.hypertiesList,t=[];for(var r in e){var n=e[r].objectName;-1===t.indexOf(n)&&t.push(n)}return t}},{key:"getServiceProviderPolicy",value:function(e,t){var r;if(t){var n=this.runtimeRegistry.getHypertyName(e.to);r=this.serviceProviderPolicy[n]}else{var o=this.runtimeRegistry.getHypertyName(e.from);r=this.serviceProviderPolicy[o]}return r}},{key:"getURL",value:function(e){var t=e.split("/");return t[0]+"//"+t[2]+"/"+t[3]}},{key:"_loadUserPolicies",value:function(){var e=this,t=this;return new Promise(function(r,n){t.storageManager.get("rethink:userPolicies").then(function(t){var n=t;if(void 0!==n)for(var o in n)e.pep.addPolicy("USER",o,n[o]);r()})})}},{key:"_getLastComponentOfURL",value:function(e){var t=e.split("/");return t[t.length-1]}},{key:"_getPoliciesJSON",value:function(e){for(var t in e){var r=e[t].combiningAlgorithm;e[t].combiningAlgorithm=r instanceof bn?"blockOverrides":r instanceof vn?"allowOverrides":r instanceof _n?"firstApplicable":void 0}return e}},{key:"saveActivePolicy",value:function(){var e=this,t=this;return new Promise(function(r,n){t.storageManager.set("rethink:activePolicy",0,e.activeUserPolicy).then(function(){r()})})}},{key:"saveGroups",value:function(){var e=this,t=this;return new Promise(function(r,n){t.storageManager.set("rethink:groups",0,e.groups).then(function(){r()})})}},{key:"savePolicies",value:function(e,t,r){var n;switch(e){case"USER":n=JSON.stringify(this.userPolicies),n=this._getPoliciesJSON(JSON.parse(n)),this.storageManager.set("rethink:userPolicies",0,n);break;case"SERVICE_PROVIDER":void 0!==t&void 0!==r&&(this.serviceProviderPolicy[r]=t),n=JSON.stringify(this.serviceProviderPolicy),n=this._getPoliciesJSON(JSON.parse(n)),this.storageManager.set("rethink:spPolicies",0,n);break;default:throw Error("Unknown policy source: "+e)}}},{key:"getGroupsNames",value:function(){var e=this.groups,t=[];if(void 0!==e)for(var r in e)t.push(r);return t}},{key:"getGroup",value:function(e,t){var r=[];if("preauthorised"===e){var n=t.split("/");n.pop(),n=n[0]+"//"+n[2],r=this.runtimeRegistry.getPreAuthSubscribers(n)}else void 0!==this.groups[e]&&(r=this.groups[e]);return r}},{key:"createGroup",value:function(e){this.groups[e]=[],this.saveGroups()}},{key:"deleteGroup",value:function(e){delete this.groups[e],this.saveGroups()}},{key:"addToGroup",value:function(e,t){var r=this.groups;if(void 0===r[e])throw Error('Group "'+e+'" does not exist!');-1===r[e].indexOf(t)&&(r[e].push(t),this.saveGroups())}},{key:"removeFromGroup",value:function(e,t){var r=this.groups[e];r.splice(r.indexOf(t),1),this.saveGroups()}},{key:"pepURL",get:function(){return this._pepURL}},{key:"guiURL",get:function(){return this._guiURL}},{key:"runtimeURL",get:function(){return this._runtimeURL}},{key:"messageBus",get:function(){return this._messageBus},set:function(e){this._messageBus=e}},{key:"subscription",get:function(){return this._subscription},set:function(e){this._subscription=e.message.body.subscriber}}]),t}(),Qo=r(87),Zo=r.n(Qo);function ei(e,t){for(var r=0;r0)&&(console.warn("Object validation "+(t.valid?"succeeded, but schema contained references:":"failed:"),JSON.stringify(t,null,2)),console.log("Object:",JSON.stringify(this,null,2))),t.valid}}]),e}();function ri(e){return(ri="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ni(e,t){for(var r=0;r2&&void 0!==arguments[2])||arguments[2],o=arguments.length>3?arguments[3]:void 0;zi.info("[RuntimeCatalogue] - getting descriptor from: ",e," with constraints: ",o);var i,s=!1,a=!1,c=i=(i=null!=o?Promise.all([this.httpRequest.post(e+"/version",{body:JSON.stringify(o)}),this.httpRequest.post(e+"/cguid",{body:JSON.stringify(o)})]):Promise.all([this.httpRequest.get(e+"/version"),this.httpRequest.get(e+"/cguid")])).then(function(t){var n=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=[],n=!0,o=!1,i=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(e){o=!0,i=e}finally{try{n||null==a.return||a.return()}finally{if(o)throw i}}return r}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}(t,2),i=n[0],a=n[1];return zi.log("[RuntimeCatalogue.getDescriptor] - got version ("+i+") and cguid ("+a+") for descriptor "+e),r.storageManager.getVersion("cguid",a).then(function(t){return t>=i?(zi.log("[RuntimeCatalogue.getDescriptor] local version is updated for ",e),s=!0,r.storageManager.get("cguid",a)):(zi.log("[RuntimeCatalogue.getDescriptor] local version not updated for ",e," retrieving from remote catalogue ..."),(null!=o?r.httpRequest.post(e,{body:JSON.stringify(o)}):r.httpRequest.get(e)).then(function(e){if((e=JSON.parse(e)).ERROR)throw new Error(e);return e}))})}).catch(function(t){var r="Unable to get descriptor for "+e+(null!=o?" with constraints "+o:"")+": "+t;throw zi.error(r),new Error(r)});return n&&(zi.log("adding promise to attach sourcePackage"),c=i.then(function(e){return e.sourcePackage?(a=!0,e):(a=!1,r.attachRawSourcePackage(e))})),c.then(function(e){return(!s||s&&!a&&n)&&r.storageManager.set(e.cguid,e.version,e),t.apply(r,[e,o])})}},{key:"attachRawSourcePackage",value:function(e,t){var r=this;return zi.log("attaching raw sourcePackage from:",e.sourcePackageURL),new Promise(function(n,o){(null!=t?r.httpRequest.post(e.sourcePackageURL,{body:JSON.stringify(t)}):r.httpRequest.get(e.sourcePackageURL)).then(function(t){t=JSON.parse(t),e.sourcePackage=t,n(e)}).catch(function(e){o(e)})})}},{key:"getHypertyDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createHyperty,t,r)}},{key:"getStubDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createStub,t,r)}},{key:"getRuntimeDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createRuntimeDescriptor,t,r)}},{key:"getDataSchemaDescriptor",value:function(e){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1],arguments.length>2&&arguments[2],new Promise(function(t){var r=e.split("/dataschema/")[1];zi.log("[RuntimeCatalogue.getDataSchemaDescriptor] schema ",r);var n={sourcePackage:{sourceCode:{properties:{}}}};switch(r){case"Context":case"ContextReporter":case"ContextObserver":n.sourcePackage.sourceCode.properties.scheme="context";break;case"Connection":n.sourcePackage.sourceCode.properties.scheme="connection";break;case"WalletData":n.sourcePackage.sourceCode.properties.scheme="walletData";break;case"Communication":n.sourcePackage.sourceCode.properties.scheme="comm",n.sourcePackage.sourceCode.properties.childrens=["resources"];break;case"HelloWorldDataSchema":n.sourcePackage.sourceCode.properties.scheme="hello";break;default:n.sourcePackage.sourceCode.properties.scheme="resource",n.sourcePackage.sourceCode.properties.childrens=[]}t(n)})}},{key:"getIdpProxyDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createIdpProxy,t,r)}},{key:"createHyperty",value:function(e){var t=this._factory.createHypertyDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.type||e.hypertyType,e.dataObjects);t.configuration=e.configuration,t.constraints=e.constraints,t.messageSchema=e.messageSchema,t.policies=e.policies,t.signature=e.signature;var r=e.sourcePackage;return r&&(t.sourcePackage=this.createSourcePackage(r)),t}},{key:"createStub",value:function(e){var t=this._factory.createProtoStubDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.messageSchemas,e.configuration,e.constraints,e.hypertyType,e.dataObjects,e.interworking,e.idpProxy,e.mutualAuthentication);t.signature=e.signature;var r=e.sourcePackage;return r&&(t.sourcePackage=this.createSourcePackage(r)),t}},{key:"createRuntimeDescriptor",value:function(e){try{e.hypertyCapabilities=JSON.parse(e.hypertyCapabilities),e.protocolCapabilities=JSON.parse(e.protocolCapabilities)}catch(e){}var t=this._factory.createHypertyRuntimeDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.type||e.runtimeType,e.hypertyCapabilities,e.protocolCapabilities,e.p2pHandlerStub,e.p2pRequesterStub);t.signature=e.signature;var r=e.sourcePackage;return r&&(t.sourcePackage=this.createSourcePackage(r)),t}},{key:"createDataSchema",value:function(e){var t;(t=e.accessControlPolicy&&e.scheme?this._factory.createHypertyDataObjectSchema(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.accessControlPolicy,e.scheme):this._factory.createMessageDataObjectSchema(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL)).signature=e.signature;var r=e.sourcePackage;if(r){t.sourcePackage=this.createSourcePackage(r);try{t.sourcePackage.sourceCode=JSON.parse(t.sourcePackage.sourceCode)}catch(e){zi.log("DataSchema Source code is already parsed")}return t}return t}},{key:"createIdpProxy",value:function(e){var t=this._factory.createProtoStubDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.messageSchemas,e.configuration,e.constraints,e.hypertyType,e.dataObjects,e.interworking,e.idpProxy,e.mutualAuthentication);t.signature=e.signature;var r=e.sourcePackage;return r&&(r=this.createSourcePackage(r),t.sourcePackage=r),t}},{key:"createSourcePackage",value:function(e){"base64"===e.encoding&&(e.sourceCode=this.atob(e.sourceCode),e.encoding="utf-8");var t=this._factory.createSourcePackage(e.sourceCodeClassname,e.sourceCode);return e.encoding&&(t.encoding=e.encoding),e.signature&&(t.signature=e.signature),t}},{key:"getSourcePackageFromURL",value:function(e){var t=this;return zi.log("getting sourcePackage from:",e),new Promise(function(r,n){t.httpRequest.get(e).then(function(e){if(e.ERROR)n(e);else{e=JSON.parse(e);var o=t.createSourcePackage(e);r(o)}}).catch(function(e){n(e)})})}},{key:"getSourceCodeFromDescriptor",value:function(e){var t=this;return new Promise(function(r,n){e.sourcePackage?r(e.sourcePackage.sourceCode):t.storageManager.getVersion(e.sourcePackageURL+"/sourceCode").then(function(o){o>=e.version?(zi.log("returning cached version from storageManager"),t.storageManager.get(e.sourcePackageURL+"/sourceCode").then(function(e){r(e)}).catch(function(e){n(e)})):t.httpRequest.get(e.sourcePackageURL+"/sourceCode").then(function(o){o.ERROR?n(o):(t.storageManager.set(e.sourcePackageURL+"/sourceCode",e.version,o),r(o))}).catch(function(e){n(e)})}).catch(function(e){n(e)})})}},{key:"getTypeList",value:function(e,t){var r=this;return new Promise(function(n,o){(null!=t?r.httpRequest.post(e,{body:JSON.stringify(t)}):r.httpRequest.get(e)).then(function(e){e=JSON.parse(e),n(e)}).catch(function(e){o(e)})})}},{key:"deleteFromPM",value:function(e){return this.storageManager.delete(e)}},{key:"runtimeURL",set:function(e){this._runtimeURL=e},get:function(){return this._runtimeURL}}]),e}();function Xi(e,t){for(var r=0;r1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2?arguments[2]:void 0;if(!e)throw new Error("Hyperty descriptor url parameter is needed");return this.loader.loadHyperty(e,t,r)}},{key:"loadStub",value:function(e){if(!e)throw new Error("ProtoStub descriptor url parameter is needed");return this.loader.loadStub(e)}},{key:"loadIdpProxy",value:function(e){if(Qi.log("ipdProxyCatalogueURL",e),!e)throw new Error("The IDP Proxy URL is a needed parameter, could be a DOMAIN or a URL");return this.loader.loadIdpProxy(e)}},{key:"close",value:function(e){console.log("Runtime core logout: ",e);var t=this;return!0===e&&this.identityHandler.reset(),Qi.info("Unregister all hyperties"),new Promise(function(e,r){t.registry.unregisterAllHyperties().then(function(t){Qi.info("All the hyperties are unregisted with Success:",t),e(!0)}).catch(function(e){Qi.error("Failed to unregister the hyperties",e),r(!1)})})}},{key:"reset",value:function(){var e=this;console.log("RuntimeUA.Runtime core reset: ");var t=[];return new Promise(function(r,n){e._dataObjectsStorage.deleteRemotes().then(function(){return r()}).then(function(){e.storages.identity.get(!1,!1,"identities").then(function(n){Object.keys(n).forEach(function(r){t.push(e.storages.identity.delete(r,!1,"identities"))}),t.push(e.storages.capabilities.delete("capabilities")),t.push(e.storages.cryptoManager.delete("userAsymmetricKey")),t.push(e.storages.hypertyResources.delete("hypertyResources")),t.push(e.storages.identity.delete("accessTokens")),t.push(e.storages.registry.delete("registry:DataObjectURLs")),t.push(e.storages.registry.delete("registry:HypertyURLs")),t.push(e.storages.runtime.delete("p2pHandler:URL")),t.push(e.storages.runtime.delete("runtime:URL")),t.push(e.storages.subscriptions.delete("subscriptions")),t.push(e.storages.syncherManager.delete("syncherManager:ObjectURLs")),t.push(e.storages.syncherManager.delete("remotes")),Promise.all(t).then(function(e){return Qi.info("[RuntimeUA.reset] reset with Success:",e),r(!0)}).catch(function(e){Qi.error("Failed to reset all DBs",e),r(!1)})})})})}}]),e}();t.default=Zi}])}); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Runtime",[],t):"object"==typeof exports?exports.Runtime=t():e.Runtime=t()}(window,function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=118)}([function(e,t,r){var n,o;!function(i,s){"use strict";void 0===(o="function"==typeof(n=function(){var e=function(){},t="undefined",r=["trace","debug","info","warn","error"];function n(e,t){var r=e[t];if("function"==typeof r.bind)return r.bind(e);try{return Function.prototype.bind.call(r,e)}catch(t){return function(){return Function.prototype.apply.apply(r,[e,arguments])}}}function o(t,n){for(var o=0;o=0&&n<=c.levels.SILENT))throw"log.setLevel() called with invalid level: "+n;if(a=n,!1!==i&&function(e){var n=(r[e]||"silent").toUpperCase();if(typeof window!==t){try{return void(window.localStorage[u]=n)}catch(e){}try{window.document.cookie=encodeURIComponent(u)+"="+n+";"}catch(e){}}}(n),o.call(c,n,e),typeof console===t&&n0?o(n(e),9007199254740991):0}},function(e,t,r){var n=r(4),o=r(88),i=r(27),s=Object.defineProperty;t.f=r(9)?Object.defineProperty:function(e,t,r){if(n(e),t=i(t,!0),n(r),o)try{return s(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},function(e,t,r){e.exports=!r(3)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){var r=e.exports={version:"2.6.5"};"number"==typeof __e&&(__e=r)},function(e,t,r){var n=r(2),o=r(15),i=r(14),s=r(30)("src"),a=r(123),c=(""+a).split("toString");r(10).inspectSource=function(e){return a.call(e)},(e.exports=function(e,t,r,a){var u="function"==typeof r;u&&(i(r,"name")||o(r,"name",t)),e[t]!==r&&(u&&(i(r,s)||o(r,s,e[t]?""+e[t]:c.join(String(t)))),e===n?e[t]=r:a?e[t]?e[t]=r:o(e,t,r):(delete e[t],o(e,t,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[s]||a.call(this)})},function(e,t,r){var n=r(25);e.exports=function(e){return Object(n(e))}},function(e,t,r){var n=r(1),o=r(3),i=r(25),s=/"/g,a=function(e,t,r,n){var o=String(i(e)),a="<"+t;return""!==r&&(a+=" "+r+'="'+String(n).replace(s,""")+'"'),a+">"+o+""};e.exports=function(e,t){var r={};r[e]=t(a),n(n.P+n.F*o(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",r)}},function(e,t){var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,r){var n=r(8),o=r(29);e.exports=r(9)?function(e,t,r){return n.f(e,t,o(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){var n=r(44),o=r(25);e.exports=function(e){return n(o(e))}},function(e,t,r){"use strict";var n=r(3);e.exports=function(e,t){return!!e&&n(function(){t?e.call(null,function(){},1):e.call(null)})}},function(e,t){var r=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},function(e,t,r){var n=r(45),o=r(29),i=r(16),s=r(27),a=r(14),c=r(88),u=Object.getOwnPropertyDescriptor;t.f=r(9)?u:function(e,t){if(e=i(e),t=s(t,!0),c)try{return u(e,t)}catch(e){}if(a(e,t))return o(!n.f.call(e,t),e[t])}},function(e,t,r){var n=r(1),o=r(10),i=r(3);e.exports=function(e,t){var r=(o.Object||{})[e]||Object[e],s={};s[e]=t(r),n(n.S+n.F*i(function(){r(1)}),"Object",s)}},function(e,t,r){var n=r(22),o=r(44),i=r(12),s=r(7),a=r(213);e.exports=function(e,t){var r=1==e,c=2==e,u=3==e,l=4==e,f=6==e,d=5==e||f,y=t||a;return function(t,a,h){for(var p,v,g=i(t),b=o(g),m=n(a,h,3),_=s(b.length),w=0,O=r?y(t,_):c?y(t,0):void 0;_>w;w++)if((d||w in b)&&(v=m(p=b[w],w,g),e))if(r)O[w]=v;else if(v)switch(e){case 3:return!0;case 5:return p;case 6:return w;case 2:O.push(p)}else if(l)return!1;return f?-1:u||l?l:O}}},function(e,t,r){var n=r(23);e.exports=function(e,t,r){if(n(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,o){return e.call(t,r,n,o)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){"use strict";if(r(9)){var n=r(31),o=r(2),i=r(3),s=r(1),a=r(59),c=r(85),u=r(22),l=r(42),f=r(29),d=r(15),y=r(43),h=r(18),p=r(7),v=r(114),g=r(33),b=r(27),m=r(14),_=r(46),w=r(5),O=r(12),k=r(77),R=r(34),P=r(36),S=r(35).f,j=r(79),M=r(30),L=r(6),E=r(21),U=r(49),C=r(47),I=r(81),A=r(39),x=r(52),T=r(41),D=r(80),H=r(105),N=r(8),B=r(19),F=N.f,K=B.f,G=o.RangeError,q=o.TypeError,V=o.Uint8Array,W=Array.prototype,J=c.ArrayBuffer,Y=c.DataView,z=E(0),$=E(2),X=E(3),Q=E(4),Z=E(5),ee=E(6),te=U(!0),re=U(!1),ne=I.values,oe=I.keys,ie=I.entries,se=W.lastIndexOf,ae=W.reduce,ce=W.reduceRight,ue=W.join,le=W.sort,fe=W.slice,de=W.toString,ye=W.toLocaleString,he=L("iterator"),pe=L("toStringTag"),ve=M("typed_constructor"),ge=M("def_constructor"),be=a.CONSTR,me=a.TYPED,_e=a.VIEW,we=E(1,function(e,t){return Se(C(e,e[ge]),t)}),Oe=i(function(){return 1===new V(new Uint16Array([1]).buffer)[0]}),ke=!!V&&!!V.prototype.set&&i(function(){new V(1).set({})}),Re=function(e,t){var r=h(e);if(r<0||r%t)throw G("Wrong offset!");return r},Pe=function(e){if(w(e)&&me in e)return e;throw q(e+" is not a typed array!")},Se=function(e,t){if(!(w(e)&&ve in e))throw q("It is not a typed array constructor!");return new e(t)},je=function(e,t){return Me(C(e,e[ge]),t)},Me=function(e,t){for(var r=0,n=t.length,o=Se(e,n);n>r;)o[r]=t[r++];return o},Le=function(e,t,r){F(e,t,{get:function(){return this._d[r]}})},Ee=function(e){var t,r,n,o,i,s,a=O(e),c=arguments.length,l=c>1?arguments[1]:void 0,f=void 0!==l,d=j(a);if(null!=d&&!k(d)){for(s=d.call(a),n=[],t=0;!(i=s.next()).done;t++)n.push(i.value);a=n}for(f&&c>2&&(l=u(l,arguments[2],2)),t=0,r=p(a.length),o=Se(this,r);r>t;t++)o[t]=f?l(a[t],t):a[t];return o},Ue=function(){for(var e=0,t=arguments.length,r=Se(this,t);t>e;)r[e]=arguments[e++];return r},Ce=!!V&&i(function(){ye.call(new V(1))}),Ie=function(){return ye.apply(Ce?fe.call(Pe(this)):Pe(this),arguments)},Ae={copyWithin:function(e,t){return H.call(Pe(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Q(Pe(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return D.apply(Pe(this),arguments)},filter:function(e){return je(this,$(Pe(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return Z(Pe(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return ee(Pe(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){z(Pe(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return re(Pe(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return te(Pe(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return ue.apply(Pe(this),arguments)},lastIndexOf:function(e){return se.apply(Pe(this),arguments)},map:function(e){return we(Pe(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return ae.apply(Pe(this),arguments)},reduceRight:function(e){return ce.apply(Pe(this),arguments)},reverse:function(){for(var e,t=Pe(this).length,r=Math.floor(t/2),n=0;n1?arguments[1]:void 0)},sort:function(e){return le.call(Pe(this),e)},subarray:function(e,t){var r=Pe(this),n=r.length,o=g(e,n);return new(C(r,r[ge]))(r.buffer,r.byteOffset+o*r.BYTES_PER_ELEMENT,p((void 0===t?n:g(t,n))-o))}},xe=function(e,t){return je(this,fe.call(Pe(this),e,t))},Te=function(e){Pe(this);var t=Re(arguments[1],1),r=this.length,n=O(e),o=p(n.length),i=0;if(o+t>r)throw G("Wrong length!");for(;i255?255:255&n),o.v[y](r*t+o.o,n,Oe)}(this,r,e)},enumerable:!0})};m?(h=r(function(e,r,n,o){l(e,h,u,"_d");var i,s,a,c,f=0,y=0;if(w(r)){if(!(r instanceof J||"ArrayBuffer"==(c=_(r))||"SharedArrayBuffer"==c))return me in r?Me(h,r):Ee.call(h,r);i=r,y=Re(n,t);var g=r.byteLength;if(void 0===o){if(g%t)throw G("Wrong length!");if((s=g-y)<0)throw G("Wrong length!")}else if((s=p(o)*t)+y>g)throw G("Wrong length!");a=s/t}else a=v(r),i=new J(s=a*t);for(d(e,"_d",{b:i,o:y,l:s,e:a,v:new Y(i)});fdocument.F=Object<\/script>"),e.close(),c=e.F;n--;)delete c.prototype[i[n]];return c()};e.exports=Object.create||function(e,t){var r;return null!==e?(a.prototype=n(e),r=new a,a.prototype=null,r[s]=e):r=c(),void 0===t?r:o(r,t)}},function(e,t,r){var n=r(90),o=r(63).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return n(e,o)}},function(e,t,r){var n=r(14),o=r(12),i=r(62)("IE_PROTO"),s=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=o(e),n(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},function(e,t,r){var n=r(5);e.exports=function(e,t){if(!n(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},function(e,t,r){var n=r(8).f,o=r(14),i=r(6)("toStringTag");e.exports=function(e,t,r){e&&!o(e=r?e:e.prototype,i)&&n(e,i,{configurable:!0,value:t})}},function(e,t){e.exports={}},function(e,t,r){var n=r(6)("unscopables"),o=Array.prototype;null==o[n]&&r(15)(o,n,{}),e.exports=function(e){o[n][e]=!0}},function(e,t,r){"use strict";var n=r(2),o=r(8),i=r(9),s=r(6)("species");e.exports=function(e){var t=n[e];i&&t&&!t[s]&&o.f(t,s,{configurable:!0,get:function(){return this}})}},function(e,t){e.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},function(e,t,r){var n=r(11);e.exports=function(e,t,r){for(var o in t)n(e,o,t[o],r);return e}},function(e,t,r){var n=r(24);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==n(e)?e.split(""):Object(e)}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,r){var n=r(24),o=r(6)("toStringTag"),i="Arguments"==n(function(){return arguments}());e.exports=function(e){var t,r,s;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),o))?r:i?n(t):"Object"==(s=n(t))&&"function"==typeof t.callee?"Arguments":s}},function(e,t,r){var n=r(4),o=r(23),i=r(6)("species");e.exports=function(e,t){var r,s=n(e).constructor;return void 0===s||null==(r=n(s)[i])?t:o(r)}},function(e,t,r){var n=r(10),o=r(2),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:n.version,mode:r(31)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t,r){var n=r(16),o=r(7),i=r(33);e.exports=function(e){return function(t,r,s){var a,c=n(t),u=o(c.length),l=i(s,u);if(e&&r!=r){for(;u>l;)if((a=c[l++])!=a)return!0}else for(;u>l;l++)if((e||l in c)&&c[l]===r)return e||l||0;return!e&&-1}}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,r){var n=r(1),o=r(25),i=r(3),s=r(67),a="["+s+"]",c=RegExp("^"+a+a+"*"),u=RegExp(a+a+"*$"),l=function(e,t,r){var o={},a=i(function(){return!!s[e]()||"​…"!="​…"[e]()}),c=o[e]=a?t(f):s[e];r&&(o[r]=c),n(n.P+n.F*a,"String",o)},f=l.trim=function(e,t){return e=String(o(e)),1&t&&(e=e.replace(c,"")),2&t&&(e=e.replace(u,"")),e};e.exports=l},function(e,t,r){var n=r(6)("iterator"),o=!1;try{var i=[7][n]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var r=!1;try{var i=[7],s=i[n]();s.next=function(){return{done:r=!0}},i[n]=function(){return s},e(i)}catch(e){}return r}},function(e,t,r){"use strict";var n=r(4);e.exports=function(){var e=n(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,r){"use strict";var n=r(46),o=RegExp.prototype.exec;e.exports=function(e,t){var r=e.exec;if("function"==typeof r){var i=r.call(e,t);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==n(e))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(e,t)}},function(e,t,r){"use strict";r(107);var n=r(11),o=r(15),i=r(3),s=r(25),a=r(6),c=r(82),u=a("species"),l=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),f=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var r="ab".split(e);return 2===r.length&&"a"===r[0]&&"b"===r[1]}();e.exports=function(e,t,r){var d=a(e),y=!i(function(){var t={};return t[d]=function(){return 7},7!=""[e](t)}),h=y?!i(function(){var t=!1,r=/a/;return r.exec=function(){return t=!0,null},"split"===e&&(r.constructor={},r.constructor[u]=function(){return r}),r[d](""),!t}):void 0;if(!y||!h||"replace"===e&&!l||"split"===e&&!f){var p=/./[d],v=r(s,d,""[e],function(e,t,r,n,o){return t.exec===c?y&&!o?{done:!0,value:p.call(t,r,n)}:{done:!0,value:e.call(r,t,n)}:{done:!1}}),g=v[0],b=v[1];n(String.prototype,e,g),o(RegExp.prototype,d,2==t?function(e,t){return b.call(e,this,t)}:function(e){return b.call(e,this)})}}},function(e,t,r){var n=r(22),o=r(103),i=r(77),s=r(4),a=r(7),c=r(79),u={},l={};(t=e.exports=function(e,t,r,f,d){var y,h,p,v,g=d?function(){return e}:c(e),b=n(r,f,t?2:1),m=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(i(g)){for(y=a(e.length);y>m;m++)if((v=t?b(s(h=e[m])[0],h[1]):b(e[m]))===u||v===l)return v}else for(p=g.call(e);!(h=p.next()).done;)if((v=o(p,b,h.value,t))===u||v===l)return v}).BREAK=u,t.RETURN=l},function(e,t,r){var n=r(2).navigator;e.exports=n&&n.userAgent||""},function(e,t,r){"use strict";var n=r(2),o=r(1),i=r(11),s=r(43),a=r(28),c=r(56),u=r(42),l=r(5),f=r(3),d=r(52),y=r(38),h=r(68);e.exports=function(e,t,r,p,v,g){var b=n[e],m=b,_=v?"set":"add",w=m&&m.prototype,O={},k=function(e){var t=w[e];i(w,e,"delete"==e?function(e){return!(g&&!l(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(g&&!l(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return g&&!l(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,r){return t.call(this,0===e?0:e,r),this})};if("function"==typeof m&&(g||w.forEach&&!f(function(){(new m).entries().next()}))){var R=new m,P=R[_](g?{}:-0,1)!=R,S=f(function(){R.has(1)}),j=d(function(e){new m(e)}),M=!g&&f(function(){for(var e=new m,t=5;t--;)e[_](t,t);return!e.has(-0)});j||((m=t(function(t,r){u(t,m,e);var n=h(new b,t,m);return null!=r&&c(r,v,n[_],n),n})).prototype=w,w.constructor=m),(S||M)&&(k("delete"),k("has"),v&&k("get")),(M||P)&&k(_),g&&w.clear&&delete w.clear}else m=p.getConstructor(t,e,v,_),s(m.prototype,r),a.NEED=!0;return y(m,e),O[e]=m,o(o.G+o.W+o.F*(m!=b),O),g||p.setStrong(m,e,v),m}},function(e,t,r){for(var n,o=r(2),i=r(15),s=r(30),a=s("typed_array"),c=s("view"),u=!(!o.ArrayBuffer||!o.DataView),l=u,f=0,d="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");f<9;)(n=o[d[f++]])?(i(n.prototype,a,!0),i(n.prototype,c,!0)):l=!1;e.exports={ABV:u,CONSTR:l,TYPED:a,VIEW:c}},function(e,t,r){var n=r(5),o=r(2).document,i=n(o)&&n(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t,r){t.f=r(6)},function(e,t,r){var n=r(48)("keys"),o=r(30);e.exports=function(e){return n[e]||(n[e]=o(e))}},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,r){var n=r(24);e.exports=Array.isArray||function(e){return"Array"==n(e)}},function(e,t,r){var n=r(2).document;e.exports=n&&n.documentElement},function(e,t,r){var n=r(5),o=r(4),i=function(e,t){if(o(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{(n=r(22)(Function.call,r(19).f(Object.prototype,"__proto__").set,2))(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,r){return i(e,r),t?e.__proto__=r:n(e,r),e}}({},!1):void 0),check:i}},function(e,t){e.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},function(e,t,r){var n=r(5),o=r(66).set;e.exports=function(e,t,r){var i,s=t.constructor;return s!==r&&"function"==typeof s&&(i=s.prototype)!==r.prototype&&n(i)&&o&&o(e,i),e}},function(e,t,r){"use strict";var n=r(18),o=r(25);e.exports=function(e){var t=String(o(this)),r="",i=n(e);if(i<0||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(r+=t);return r}},function(e,t){e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},function(e,t){var r=Math.expm1;e.exports=!r||r(10)>22025.465794806718||r(10)<22025.465794806718||-2e-17!=r(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:r},function(e,t,r){var n=r(18),o=r(25);e.exports=function(e){return function(t,r){var i,s,a=String(o(t)),c=n(r),u=a.length;return c<0||c>=u?e?"":void 0:(i=a.charCodeAt(c))<55296||i>56319||c+1===u||(s=a.charCodeAt(c+1))<56320||s>57343?e?a.charAt(c):i:e?a.slice(c,c+2):s-56320+(i-55296<<10)+65536}}},function(e,t,r){"use strict";var n=r(31),o=r(1),i=r(11),s=r(15),a=r(39),c=r(102),u=r(38),l=r(36),f=r(6)("iterator"),d=!([].keys&&"next"in[].keys()),y=function(){return this};e.exports=function(e,t,r,h,p,v,g){c(r,t,h);var b,m,_,w=function(e){if(!d&&e in P)return P[e];switch(e){case"keys":case"values":return function(){return new r(this,e)}}return function(){return new r(this,e)}},O=t+" Iterator",k="values"==p,R=!1,P=e.prototype,S=P[f]||P["@@iterator"]||p&&P[p],j=S||w(p),M=p?k?w("entries"):j:void 0,L="Array"==t&&P.entries||S;if(L&&(_=l(L.call(new e)))!==Object.prototype&&_.next&&(u(_,O,!0),n||"function"==typeof _[f]||s(_,f,y)),k&&S&&"values"!==S.name&&(R=!0,j=function(){return S.call(this)}),n&&!g||!d&&!R&&P[f]||s(P,f,j),a[t]=j,a[O]=y,p)if(b={values:k?j:w("values"),keys:v?j:w("keys"),entries:M},g)for(m in b)m in P||i(P,m,b[m]);else o(o.P+o.F*(d||R),t,b);return b}},function(e,t,r){var n=r(75),o=r(25);e.exports=function(e,t,r){if(n(t))throw TypeError("String#"+r+" doesn't accept regex!");return String(o(e))}},function(e,t,r){var n=r(5),o=r(24),i=r(6)("match");e.exports=function(e){var t;return n(e)&&(void 0!==(t=e[i])?!!t:"RegExp"==o(e))}},function(e,t,r){var n=r(6)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(r){try{return t[n]=!1,!"/./"[e](t)}catch(e){}}return!0}},function(e,t,r){var n=r(39),o=r(6)("iterator"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(n.Array===e||i[o]===e)}},function(e,t,r){"use strict";var n=r(8),o=r(29);e.exports=function(e,t,r){t in e?n.f(e,t,o(0,r)):e[t]=r}},function(e,t,r){var n=r(46),o=r(6)("iterator"),i=r(39);e.exports=r(10).getIteratorMethod=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[n(e)]}},function(e,t,r){"use strict";var n=r(12),o=r(33),i=r(7);e.exports=function(e){for(var t=n(this),r=i(t.length),s=arguments.length,a=o(s>1?arguments[1]:void 0,r),c=s>2?arguments[2]:void 0,u=void 0===c?r:o(c,r);u>a;)t[a++]=e;return t}},function(e,t,r){"use strict";var n=r(40),o=r(106),i=r(39),s=r(16);e.exports=r(73)(Array,"Array",function(e,t){this._t=s(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,o(1)):o(0,"keys"==t?r:"values"==t?e[r]:[r,e[r]])},"values"),i.Arguments=i.Array,n("keys"),n("values"),n("entries")},function(e,t,r){"use strict";var n=r(53),o=RegExp.prototype.exec,i=String.prototype.replace,s=o,a=function(){var e=/a/,t=/b*/g;return o.call(e,"a"),o.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),c=void 0!==/()??/.exec("")[1];(a||c)&&(s=function(e){var t,r,s,u,l=this;return c&&(r=new RegExp("^"+l.source+"$(?!\\s)",n.call(l))),a&&(t=l.lastIndex),s=o.call(l,e),a&&s&&(l.lastIndex=l.global?s.index+s[0].length:t),c&&s&&s.length>1&&i.call(s[0],r,function(){for(u=1;ur;)t.push(arguments[r++]);return g[++v]=function(){a("function"==typeof e?e:Function(e),t)},n(v),v},y=function(e){delete g[e]},"process"==r(24)(f)?n=function(e){f.nextTick(s(b,e,1))}:p&&p.now?n=function(e){p.now(s(b,e,1))}:h?(i=(o=new h).port2,o.port1.onmessage=m,n=s(i.postMessage,i,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(n=function(e){l.postMessage(e+"","*")},l.addEventListener("message",m,!1)):n="onreadystatechange"in u("script")?function(e){c.appendChild(u("script")).onreadystatechange=function(){c.removeChild(this),b.call(e)}}:function(e){setTimeout(s(b,e,1),0)}),e.exports={set:d,clear:y}},function(e,t,r){"use strict";var n=r(2),o=r(9),i=r(31),s=r(59),a=r(15),c=r(43),u=r(3),l=r(42),f=r(18),d=r(7),y=r(114),h=r(35).f,p=r(8).f,v=r(80),g=r(38),b="prototype",m="Wrong index!",_=n.ArrayBuffer,w=n.DataView,O=n.Math,k=n.RangeError,R=n.Infinity,P=_,S=O.abs,j=O.pow,M=O.floor,L=O.log,E=O.LN2,U=o?"_b":"buffer",C=o?"_l":"byteLength",I=o?"_o":"byteOffset";function A(e,t,r){var n,o,i,s=new Array(r),a=8*r-t-1,c=(1<>1,l=23===t?j(2,-24)-j(2,-77):0,f=0,d=e<0||0===e&&1/e<0?1:0;for((e=S(e))!=e||e===R?(o=e!=e?1:0,n=c):(n=M(L(e)/E),e*(i=j(2,-n))<1&&(n--,i*=2),(e+=n+u>=1?l/i:l*j(2,1-u))*i>=2&&(n++,i/=2),n+u>=c?(o=0,n=c):n+u>=1?(o=(e*i-1)*j(2,t),n+=u):(o=e*j(2,u-1)*j(2,t),n=0));t>=8;s[f++]=255&o,o/=256,t-=8);for(n=n<0;s[f++]=255&n,n/=256,a-=8);return s[--f]|=128*d,s}function x(e,t,r){var n,o=8*r-t-1,i=(1<>1,a=o-7,c=r-1,u=e[c--],l=127&u;for(u>>=7;a>0;l=256*l+e[c],c--,a-=8);for(n=l&(1<<-a)-1,l>>=-a,a+=t;a>0;n=256*n+e[c],c--,a-=8);if(0===l)l=1-s;else{if(l===i)return n?NaN:u?-R:R;n+=j(2,t),l-=s}return(u?-1:1)*n*j(2,l-t)}function T(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]}function D(e){return[255&e]}function H(e){return[255&e,e>>8&255]}function N(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function B(e){return A(e,52,8)}function F(e){return A(e,23,4)}function K(e,t,r){p(e[b],t,{get:function(){return this[r]}})}function G(e,t,r,n){var o=y(+r);if(o+t>e[C])throw k(m);var i=e[U]._b,s=o+e[I],a=i.slice(s,s+t);return n?a:a.reverse()}function q(e,t,r,n,o,i){var s=y(+r);if(s+t>e[C])throw k(m);for(var a=e[U]._b,c=s+e[I],u=n(+o),l=0;lY;)(V=J[Y++])in _||a(_,V,P[V]);i||(W.constructor=_)}var z=new w(new _(2)),$=w[b].setInt8;z.setInt8(0,2147483648),z.setInt8(1,2147483649),!z.getInt8(0)&&z.getInt8(1)||c(w[b],{setInt8:function(e,t){$.call(this,e,t<<24>>24)},setUint8:function(e,t){$.call(this,e,t<<24>>24)}},!0)}else _=function(e){l(this,_,"ArrayBuffer");var t=y(e);this._b=v.call(new Array(t),0),this[C]=t},w=function(e,t,r){l(this,w,"DataView"),l(e,_,"DataView");var n=e[C],o=f(t);if(o<0||o>n)throw k("Wrong offset!");if(o+(r=void 0===r?n-o:d(r))>n)throw k("Wrong length!");this[U]=e,this[I]=o,this[C]=r},o&&(K(_,"byteLength","_l"),K(w,"buffer","_b"),K(w,"byteLength","_l"),K(w,"byteOffset","_o")),c(w[b],{getInt8:function(e){return G(this,1,e)[0]<<24>>24},getUint8:function(e){return G(this,1,e)[0]},getInt16:function(e){var t=G(this,2,e,arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=G(this,2,e,arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return T(G(this,4,e,arguments[1]))},getUint32:function(e){return T(G(this,4,e,arguments[1]))>>>0},getFloat32:function(e){return x(G(this,4,e,arguments[1]),23,4)},getFloat64:function(e){return x(G(this,8,e,arguments[1]),52,8)},setInt8:function(e,t){q(this,1,e,D,t)},setUint8:function(e,t){q(this,1,e,D,t)},setInt16:function(e,t){q(this,2,e,H,t,arguments[2])},setUint16:function(e,t){q(this,2,e,H,t,arguments[2])},setInt32:function(e,t){q(this,4,e,N,t,arguments[2])},setUint32:function(e,t){q(this,4,e,N,t,arguments[2])},setFloat32:function(e,t){q(this,4,e,F,t,arguments[2])},setFloat64:function(e,t){q(this,8,e,B,t,arguments[2])}});g(_,"ArrayBuffer"),g(w,"DataView"),a(w[b],s.VIEW,!0),t.ArrayBuffer=_,t.DataView=w},function(e,t){!function(){"use strict";if(!Object.observe&&"function"==typeof Proxy){function e(e,t,r,n,o,i){var s,a=this;function c(e,n){if(c.delay=n,!c.pause&&a.changeset.length>0){if(!e){var o=a.changeset.filter(function(e){return!r||r.indexOf(e.type)>=0});o.length>0&&t(o)}a.changeset=[]}}return c.pause=o,c.delay=i,a.get=function(e,t){return"__observer__"===t?a:"unobserve"===t?function(){return Object.unobserve(e),e}:"deliver"===t?c:e[t]},a.target=e,a.changeset=[],a.target.__observerCallbacks__||(Object.defineProperty(e,"__observerCallbacks__",{enumerable:!1,configurable:!0,writable:!1,value:[]}),Object.defineProperty(e,"__observers__",{enumerable:!1,configurable:!0,writable:!1,value:[]})),a.target.__observerCallbacks__.push(t),a.target.__observers__.push(this),s=new Proxy(e,a),c(!1,i),s}e.prototype.deliver=function(){return this.get(null,"deliver")},e.prototype.set=function(e,t,r){var n=e[t],o=void 0===n?"add":"update";if(e[t]=r,e.__observers__.indexOf(this)>=0&&(!this.acceptlist||this.acceptlist.indexOf(o)>=0)){var i={object:e,name:t,type:o},s=0===this.changeset.length,a=this.deliver();"update"===o&&(i.oldValue=n),this.changeset.push(i),s&&a(!1,"number"==typeof a.delay?a.delay:10)}return!0},e.prototype.deleteProperty=function(e,t){var r=e[t];if(delete e[t],e.__observers__.indexOf(this)>=0&&!this.acceptlist||this.acceptlist.indexOf("delete")>=0){var n={object:e,name:t,type:"delete",oldValue:r},o=0===this.changeset.length,i=this.deliver();this.changeset.push(n),o&&i(!1,"number"==typeof i.delay?i.delay:10)}return!0},e.prototype.defineProperty=function(e,t,r){if(Object.defineProperty(e,t,r),e.__observers__.indexOf(this)>=0&&!this.acceptlist||this.acceptlist.indexOf("reconfigure")>=0){var n={object:e,name:t,type:"reconfigure"},o=0===this.changeset.length,i=this.deliver();this.changeset.push(n),o&&i(!1,"number"==typeof i.delay?i.delay:10)}return!0},e.prototype.setPrototypeOf=function(e,t){var r=Object.getPrototypeOf(e);if(Object.setPrototypeOf(e,t),e.__observers__.indexOf(this)>=0&&!this.acceptlist||this.acceptlist.indexOf("setPrototype")>=0){var n={object:e,name:"__proto__",type:"setPrototype",oldValue:r},o=0===this.changeset.length,i=this.deliver();this.changeset.push(n),o&&i(!1,"number"==typeof i.delay?i.delay:10)}return!0},e.prototype.preventExtensions=function(e){if(Object.preventExtensions(e),e.__observers__.indexOf(this)>=0&&!this.acceptlist||this.acceptlist.indexOf("preventExtensions")>=0){var t={object:e,type:"preventExtensions"},r=0===this.changeset.length,n=this.deliver();this.changeset.push(t),r&&n(!1,"number"==typeof n.delay?n.delay:10)}return!0},Object.observe=function(t,r,n,o,i,s){return new e(t,r,n,o,i,s)},Object.unobserve=function(e,t){if(e.__observerCallbacks__){if(!t)return e.__observerCallbacks__.splice(0,e.__observerCallbacks__.length),void e.__observers__.splice(0,e.__observers__.length);e.__observerCallbacks__.forEach(function(r,n){t===r&&(e.__observerCallbacks__.splice(n,1),delete e.__observers__[n].callback,e.__observers__.splice(n,1))})}},Array.observe=function(e,t,r,n,o,i){if(!(e instanceof Array||Array.isArray(e)))throw new TypeError("First argument to Array.observer is not an Array");r=r||["add","update","delete","splice"];var s=new Proxy(e,{get:function(t,n){return"unobserve"===n?function(e){return e?Object.unobserve(t,e):t.unobserve()}:"splice"===n?function(n,o){if("number"!=typeof n||"number"!=typeof o)throw new TypeError("First two arguments to Array splice are not number, number");var i=this.slice(n,n+o),s=arguments.length>1?arguments.length-2:0,c={object:e,type:"splice",index:n,removed:i,addedCount:s};if(t.splice.apply(t,arguments),r.indexOf("splice")>=0){n=0===a.__observer__.changeset.length;var u=a.__observer__.deliver();a.__observer__.changeset.push(c),n&&u(!1,"number"==typeof u.delay?u.delay:10)}}:"push"===n?function(e){return this.splice(this.length,0,e)}:"pop"===n?function(){return this.splice(this.length-1,1)}:"unshift"===n?function(e){return this.splice(0,0,e)}:"shift"===n?function(){return this.splice(0,1)}:t[n]}}),a=Object.observe(s,function(e){var n=e.filter(function(e){return"length"!==e.name&&"add"!==e.name&&(!r||r.indexOf(e.type)>=0)});n.length>0&&t(n)},r,n,o,i);return a},Array.unobserve=function(e,t){return e.unobserve(t)}}Object.deepObserve=function(e,t,r){var n=function(e){return{}.toString.call(e).match(/\s([a-zA-Z]+)/)[1].toLowerCase()};function o(e,r){Object.keys(e).forEach(function(o){if(("object"===n(e[o])||"array"===n(e[o]))&&!e[o].hasOwnProperty("__observers__")){var i=r.slice(0);i.push(o),e[o]=Object.deepObserve(e[o],t,i)}})}return o(e,r=r||[]),Object.observe(e,function(e){var n=[];e.forEach(function(e){var t=(r.length>0?r.join(".")+".":"")+e.name;"update"!==e.type&&"add"!==e.type||o(e.object,r),n.push({name:e.name,object:e.object,type:e.type,oldValue:e.oldValue,newValue:e.object[e.name],keypath:t}),function e(t,r,o,i,s){i instanceof Object?Object.keys(i).forEach(function(a){if(!o||o[a]!==i[a]){var c=o&&void 0!==o[a]?o[a]:void 0,u=void 0===c?"add":"update",l=s+"."+a;n.push({name:t,object:r,type:u,oldValue:c,newValue:i[a],keypath:l}),e(t,r,c,i[a],l)}}):o instanceof Object&&Object.keys(o).forEach(function(a){var c=null===i?"update":"delete",u=s+"."+a;n.push({name:t,object:r,type:c,oldValue:o[a],newValue:i,keypath:u}),e(t,r,o[a],void 0,u)})}(e.name,e.object,e.oldValue,e.object[e.name],t)}),t(n)})}}()},function(e,t,r){var n,o;void 0===(o="function"==typeof(n=function(){Object.keys||(Object.keys=function(){var e=Object.prototype.hasOwnProperty,t=!{toString:null}.propertyIsEnumerable("toString"),r=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],n=r.length;return function(o){if("object"!=typeof o&&"function"!=typeof o||null===o)throw new TypeError("Object.keys called on non-object");var i=[];for(var s in o)e.call(o,s)&&i.push(s);if(t)for(var a=0;a>>0;if(0===r)return-1;var n=0;if(arguments.length>1&&((n=Number(arguments[1]))!=n?n=0:0!==n&&n!==1/0&&n!==-1/0&&(n=(n>0||-1)*Math.floor(Math.abs(n)))),n>=r)return-1;for(var o=n>=0?n:Math.max(r-Math.abs(n),0);o0&&(t+=l.suffices["*"]&&i||",",l.suffices["*"]&&c&&(t+=l.name+"=")),t+=a?encodeURIComponent(f[y]).replace(/!/g,"%21"):r(f[y])}else if("object"==typeof f){c&&!l.suffices["*"]&&(t+=l.name+"=");var h=!0;for(var p in f)h||(t+=l.suffices["*"]&&i||","),h=!1,t+=a?encodeURIComponent(p).replace(/!/g,"%21"):r(p),t+=l.suffices["*"]?"=":",",t+=a?encodeURIComponent(f[p]).replace(/!/g,"%21"):r(f[p])}else c&&(t+=l.name,u&&""===f||(t+="=")),null!=l.truncate&&(f=f.substring(0,l.truncate)),t+=a?encodeURIComponent(f).replace(/!/g,"%21"):r(f)}return t};return _.varNames=l,{prefix:s,substitution:_}}function o(e){if(!(this instanceof o))return new o(e);for(var t=e.split("{"),r=[t.shift()],i=[],s=[],a=[];t.length>0;){var c=t.shift(),u=c.split("}")[0],l=c.substring(u.length+1),f=n(u);s.push(f.substitution),i.push(f.prefix),r.push(l),a=a.concat(f.substitution.varNames)}this.fill=function(e){for(var t=r[0],n=0;n0&&"/"===t.charAt(e.length-1)||"#"===r.charAt(0)||"?"===r.charAt(0))return!0}return!1}(t,e.id)&&void 0===this.schemas[e.id]&&(this.schemas[e.id]=e),e)if("enum"!==n)if("object"==typeof e[n])this.searchSchemas(e[n],t);else if("$ref"===n){var o=f(e[n]);o&&void 0===this.schemas[o]&&void 0===this.missingMap[o]&&(this.missingMap[o]=o)}},i.prototype.addSchema=function(e,t){if("string"!=typeof e||void 0===t){if("object"!=typeof e||"string"!=typeof e.id)return;e=(t=e).id}e===f(e)+"#"&&(e=f(e)),this.schemas[e]=t,delete this.missingMap[e],d(t,e),this.searchSchemas(t,e)},i.prototype.getSchemaMap=function(){var e={};for(var t in this.schemas)e[t]=this.schemas[t];return e},i.prototype.getSchemaUris=function(e){var t=[];for(var r in this.schemas)e&&!e.test(r)||t.push(r);return t},i.prototype.getMissingUris=function(e){var t=[];for(var r in this.missingMap)e&&!e.test(r)||t.push(r);return t},i.prototype.dropSchemas=function(){this.schemas={},this.reset()},i.prototype.reset=function(){this.missing=[],this.missingMap={},this.errors=[]},i.prototype.validateAll=function(e,t,r,n,o){var i;if(!(t=this.resolveRefs(t)))return null;if(t instanceof b)return this.errors.push(t),t;var s,a=this.errors.length,c=null,u=null;if(this.checkRecursive&&e&&"object"==typeof e){if(i=!this.scanned.length,e[this.validatedSchemasKey]){var l=e[this.validatedSchemasKey].indexOf(t);if(-1!==l)return this.errors=this.errors.concat(e[this.validationErrorsKey][l]),null}if(Object.isFrozen(e)&&-1!==(s=this.scannedFrozen.indexOf(e))){var f=this.scannedFrozenSchemas[s].indexOf(t);if(-1!==f)return this.errors=this.errors.concat(this.scannedFrozenValidationErrors[s][f]),null}if(this.scanned.push(e),Object.isFrozen(e))-1===s&&(s=this.scannedFrozen.length,this.scannedFrozen.push(e),this.scannedFrozenSchemas.push([])),c=this.scannedFrozenSchemas[s].length,this.scannedFrozenSchemas[s][c]=t,this.scannedFrozenValidationErrors[s][c]=[];else{if(!e[this.validatedSchemasKey])try{Object.defineProperty(e,this.validatedSchemasKey,{value:[],configurable:!0}),Object.defineProperty(e,this.validationErrorsKey,{value:[],configurable:!0})}catch(t){e[this.validatedSchemasKey]=[],e[this.validationErrorsKey]=[]}u=e[this.validatedSchemasKey].length,e[this.validatedSchemasKey][u]=t,e[this.validationErrorsKey][u]=[]}}var d=this.errors.length,y=this.validateBasic(e,t,o)||this.validateNumeric(e,t,o)||this.validateString(e,t,o)||this.validateArray(e,t,o)||this.validateObject(e,t,o)||this.validateCombinations(e,t,o)||this.validateHypermedia(e,t,o)||this.validateFormat(e,t,o)||this.validateDefinedKeywords(e,t,o)||null;if(i){for(;this.scanned.length;){delete this.scanned.pop()[this.validatedSchemasKey]}this.scannedFrozen=[],this.scannedFrozenSchemas=[]}if(y||d!==this.errors.length)for(;r&&r.length||n&&n.length;){var h=r&&r.length?""+r.pop():null,p=n&&n.length?""+n.pop():null;y&&(y=y.prefixWith(h,p)),this.prefixErrors(d,h,p)}return null!==c?this.scannedFrozenValidationErrors[s][c]=this.errors.slice(a):null!==u&&(e[this.validationErrorsKey][u]=this.errors.slice(a)),this.handleError(y)},i.prototype.validateFormat=function(e,t){if("string"!=typeof t.format||!this.formatValidators[t.format])return null;var r=this.formatValidators[t.format].call(null,e,t);return"string"==typeof r||"number"==typeof r?this.createError(h.FORMAT_CUSTOM,{message:r},"","/format",null,e,t):r&&"object"==typeof r?this.createError(h.FORMAT_CUSTOM,{message:r.message||"?"},r.dataPath||"",r.schemaPath||"/format",null,e,t):null},i.prototype.validateDefinedKeywords=function(e,t,r){for(var n in this.definedKeywords)if(void 0!==t[n])for(var o=this.definedKeywords[n],i=0;i=a&&nt.maximum)return this.createError(h.NUMBER_MAXIMUM,{value:e,maximum:t.maximum},"","/maximum",null,e,t);if(t.exclusiveMaximum&&e===t.maximum)return this.createError(h.NUMBER_MAXIMUM_EXCLUSIVE,{value:e,maximum:t.maximum},"","/exclusiveMaximum",null,e,t)}return null},i.prototype.validateNaN=function(e,t){return"number"!=typeof e?null:!0===isNaN(e)||e===1/0||e===-1/0?this.createError(h.NUMBER_NOT_A_NUMBER,{value:e},"","/type",null,e,t):null},i.prototype.validateString=function(e,t,r){return this.validateStringLength(e,t,r)||this.validateStringPattern(e,t,r)||null},i.prototype.validateStringLength=function(e,t){return"string"!=typeof e?null:void 0!==t.minLength&&e.lengtht.maxLength?this.createError(h.STRING_LENGTH_LONG,{length:e.length,maximum:t.maxLength},"","/maxLength",null,e,t):null},i.prototype.validateStringPattern=function(e,t){if("string"!=typeof e||"string"!=typeof t.pattern&&!(t.pattern instanceof RegExp))return null;var r;if(t.pattern instanceof RegExp)r=t.pattern;else{var n,o="",i=t.pattern.match(/^\/(.+)\/([img]*)$/);i?(n=i[1],o=i[2]):n=t.pattern,r=new RegExp(n,o)}return r.test(e)?null:this.createError(h.STRING_PATTERN,{pattern:t.pattern},"","/pattern",null,e,t)},i.prototype.validateArray=function(e,t,r){return Array.isArray(e)&&(this.validateArrayLength(e,t,r)||this.validateArrayUniqueItems(e,t,r)||this.validateArrayItems(e,t,r))||null},i.prototype.validateArrayLength=function(e,t){var r;return void 0!==t.minItems&&e.lengtht.maxItems&&(r=this.createError(h.ARRAY_LENGTH_LONG,{length:e.length,maximum:t.maxItems},"","/maxItems",null,e,t),this.handleError(r))?r:null},i.prototype.validateArrayUniqueItems=function(e,t){if(t.uniqueItems)for(var r=0;rt.maxProperties&&(r=this.createError(h.OBJECT_PROPERTIES_MAXIMUM,{propertyCount:n.length,maximum:t.maxProperties},"","/maxProperties",null,e,t),this.handleError(r))?r:null},i.prototype.validateObjectRequiredProperties=function(e,t){if(void 0!==t.required)for(var r=0;r 10000");if(void 0!==h[e])throw new Error("Error already defined: "+e+" as "+h[e]);if(void 0!==p[t])throw new Error("Error code already used: "+p[t]+" as "+t);for(var n in h[e]=t,p[t]=e,g[e]=g[t]=r,m){var o=m[n];o[e]&&(o[t]=o[t]||o[e])}},reset:function(){o.reset(),this.error=null,this.missing=[],this.valid=!0},missing:[],error:null,valid:!0,normSchema:d,resolveUrl:l,getDocumentUri:f,errorCodes:h};return s.language(t||"en"),s}();return _.addLanguage("en-gb",g),_.tv4=_,_})?n.apply(t,[]):n)||(e.exports=o)},function(e,t,r){e.exports=!r(9)&&!r(3)(function(){return 7!=Object.defineProperty(r(60)("div"),"a",{get:function(){return 7}}).a})},function(e,t,r){var n=r(2),o=r(10),i=r(31),s=r(61),a=r(8).f;e.exports=function(e){var t=o.Symbol||(o.Symbol=i?{}:n.Symbol||{});"_"==e.charAt(0)||e in t||a(t,e,{value:s.f(e)})}},function(e,t,r){var n=r(14),o=r(16),i=r(49)(!1),s=r(62)("IE_PROTO");e.exports=function(e,t){var r,a=o(e),c=0,u=[];for(r in a)r!=s&&n(a,r)&&u.push(r);for(;t.length>c;)n(a,r=t[c++])&&(~i(u,r)||u.push(r));return u}},function(e,t,r){var n=r(8),o=r(4),i=r(32);e.exports=r(9)?Object.defineProperties:function(e,t){o(e);for(var r,s=i(t),a=s.length,c=0;a>c;)n.f(e,r=s[c++],t[r]);return e}},function(e,t,r){var n=r(16),o=r(35).f,i={}.toString,s="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return s&&"[object Window]"==i.call(e)?function(e){try{return o(e)}catch(e){return s.slice()}}(e):o(n(e))}},function(e,t,r){"use strict";var n=r(32),o=r(50),i=r(45),s=r(12),a=r(44),c=Object.assign;e.exports=!c||r(3)(function(){var e={},t={},r=Symbol(),n="abcdefghijklmnopqrst";return e[r]=7,n.split("").forEach(function(e){t[e]=e}),7!=c({},e)[r]||Object.keys(c({},t)).join("")!=n})?function(e,t){for(var r=s(e),c=arguments.length,u=1,l=o.f,f=i.f;c>u;)for(var d,y=a(arguments[u++]),h=l?n(y).concat(l(y)):n(y),p=h.length,v=0;p>v;)f.call(y,d=h[v++])&&(r[d]=y[d]);return r}:c},function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},function(e,t,r){"use strict";var n=r(23),o=r(5),i=r(96),s=[].slice,a={};e.exports=Function.bind||function(e){var t=n(this),r=s.call(arguments,1),c=function(){var n=r.concat(s.call(arguments));return this instanceof c?function(e,t,r){if(!(t in a)){for(var n=[],o=0;o>>0||(s.test(r)?16:10))}:n},function(e,t,r){var n=r(2).parseFloat,o=r(51).trim;e.exports=1/n(r(67)+"-0")!=-1/0?function(e){var t=o(String(e),3),r=n(t);return 0===r&&"-"==t.charAt(0)?-0:r}:n},function(e,t,r){var n=r(24);e.exports=function(e,t){if("number"!=typeof e&&"Number"!=n(e))throw TypeError(t);return+e}},function(e,t,r){var n=r(5),o=Math.floor;e.exports=function(e){return!n(e)&&isFinite(e)&&o(e)===e}},function(e,t){e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)}},function(e,t,r){"use strict";var n=r(34),o=r(29),i=r(38),s={};r(15)(s,r(6)("iterator"),function(){return this}),e.exports=function(e,t,r){e.prototype=n(s,{next:o(1,r)}),i(e,t+" Iterator")}},function(e,t,r){var n=r(4);e.exports=function(e,t,r,o){try{return o?t(n(r)[0],r[1]):t(r)}catch(t){var i=e.return;throw void 0!==i&&n(i.call(e)),t}}},function(e,t,r){var n=r(23),o=r(12),i=r(44),s=r(7);e.exports=function(e,t,r,a,c){n(t);var u=o(e),l=i(u),f=s(u.length),d=c?f-1:0,y=c?-1:1;if(r<2)for(;;){if(d in l){a=l[d],d+=y;break}if(d+=y,c?d<0:f<=d)throw TypeError("Reduce of empty array with no initial value")}for(;c?d>=0:f>d;d+=y)d in l&&(a=t(a,l[d],d,u));return a}},function(e,t,r){"use strict";var n=r(12),o=r(33),i=r(7);e.exports=[].copyWithin||function(e,t){var r=n(this),s=i(r.length),a=o(e,s),c=o(t,s),u=arguments.length>2?arguments[2]:void 0,l=Math.min((void 0===u?s:o(u,s))-c,s-a),f=1;for(c0;)c in r?r[a]=r[c]:delete r[a],a+=f,c+=f;return r}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,r){"use strict";var n=r(82);r(1)({target:"RegExp",proto:!0,forced:n!==/./.exec},{exec:n})},function(e,t,r){r(9)&&"g"!=/./g.flags&&r(8).f(RegExp.prototype,"flags",{configurable:!0,get:r(53)})},function(e,t,r){"use strict";var n,o,i,s,a=r(31),c=r(2),u=r(22),l=r(46),f=r(1),d=r(5),y=r(23),h=r(42),p=r(56),v=r(47),g=r(84).set,b=r(234)(),m=r(110),_=r(235),w=r(57),O=r(111),k=c.TypeError,R=c.process,P=R&&R.versions,S=P&&P.v8||"",j=c.Promise,M="process"==l(R),L=function(){},E=o=m.f,U=!!function(){try{var e=j.resolve(1),t=(e.constructor={})[r(6)("species")]=function(e){e(L,L)};return(M||"function"==typeof PromiseRejectionEvent)&&e.then(L)instanceof t&&0!==S.indexOf("6.6")&&-1===w.indexOf("Chrome/66")}catch(e){}}(),C=function(e){var t;return!(!d(e)||"function"!=typeof(t=e.then))&&t},I=function(e,t){if(!e._n){e._n=!0;var r=e._c;b(function(){for(var n=e._v,o=1==e._s,i=0,s=function(t){var r,i,s,a=o?t.ok:t.fail,c=t.resolve,u=t.reject,l=t.domain;try{a?(o||(2==e._h&&T(e),e._h=1),!0===a?r=n:(l&&l.enter(),r=a(n),l&&(l.exit(),s=!0)),r===t.promise?u(k("Promise-chain cycle")):(i=C(r))?i.call(r,c,u):c(r)):u(n)}catch(e){l&&!s&&l.exit(),u(e)}};r.length>i;)s(r[i++]);e._c=[],e._n=!1,t&&!e._h&&A(e)})}},A=function(e){g.call(c,function(){var t,r,n,o=e._v,i=x(e);if(i&&(t=_(function(){M?R.emit("unhandledRejection",o,e):(r=c.onunhandledrejection)?r({promise:e,reason:o}):(n=c.console)&&n.error&&n.error("Unhandled promise rejection",o)}),e._h=M||x(e)?2:1),e._a=void 0,i&&t.e)throw t.v})},x=function(e){return 1!==e._h&&0===(e._a||e._c).length},T=function(e){g.call(c,function(){var t;M?R.emit("rejectionHandled",e):(t=c.onrejectionhandled)&&t({promise:e,reason:e._v})})},D=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),I(t,!0))},H=function(e){var t,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw k("Promise can't be resolved itself");(t=C(e))?b(function(){var n={_w:r,_d:!1};try{t.call(e,u(H,n,1),u(D,n,1))}catch(e){D.call(n,e)}}):(r._v=e,r._s=1,I(r,!1))}catch(e){D.call({_w:r,_d:!1},e)}}};U||(j=function(e){h(this,j,"Promise","_h"),y(e),n.call(this);try{e(u(H,this,1),u(D,this,1))}catch(e){D.call(this,e)}},(n=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=r(43)(j.prototype,{then:function(e,t){var r=E(v(this,j));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=M?R.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&I(this,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new n;this.promise=e,this.resolve=u(H,e,1),this.reject=u(D,e,1)},m.f=E=function(e){return e===j||e===s?new i(e):o(e)}),f(f.G+f.W+f.F*!U,{Promise:j}),r(38)(j,"Promise"),r(41)("Promise"),s=r(10).Promise,f(f.S+f.F*!U,"Promise",{reject:function(e){var t=E(this);return(0,t.reject)(e),t.promise}}),f(f.S+f.F*(a||!U),"Promise",{resolve:function(e){return O(a&&this===s?j:this,e)}}),f(f.S+f.F*!(U&&r(52)(function(e){j.all(e).catch(L)})),"Promise",{all:function(e){var t=this,r=E(t),n=r.resolve,o=r.reject,i=_(function(){var r=[],i=0,s=1;p(e,!1,function(e){var a=i++,c=!1;r.push(void 0),s++,t.resolve(e).then(function(e){c||(c=!0,r[a]=e,--s||n(r))},o)}),--s||n(r)});return i.e&&o(i.v),r.promise},race:function(e){var t=this,r=E(t),n=r.reject,o=_(function(){p(e,!1,function(e){t.resolve(e).then(r.resolve,n)})});return o.e&&n(o.v),r.promise}})},function(e,t,r){"use strict";var n=r(23);e.exports.f=function(e){return new function(e){var t,r;this.promise=new e(function(e,n){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=n}),this.resolve=n(t),this.reject=n(r)}(e)}},function(e,t,r){var n=r(4),o=r(5),i=r(110);e.exports=function(e,t){if(n(e),o(t)&&t.constructor===e)return t;var r=i.f(e);return(0,r.resolve)(t),r.promise}},function(e,t,r){"use strict";var n=r(8).f,o=r(34),i=r(43),s=r(22),a=r(42),c=r(56),u=r(73),l=r(106),f=r(41),d=r(9),y=r(28).fastKey,h=r(37),p=d?"_s":"size",v=function(e,t){var r,n=y(t);if("F"!==n)return e._i[n];for(r=e._f;r;r=r.n)if(r.k==t)return r};e.exports={getConstructor:function(e,t,r,u){var l=e(function(e,n){a(e,l,t,"_i"),e._t=t,e._i=o(null),e._f=void 0,e._l=void 0,e[p]=0,null!=n&&c(n,r,e[u],e)});return i(l.prototype,{clear:function(){for(var e=h(this,t),r=e._i,n=e._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete r[n.i];e._f=e._l=void 0,e[p]=0},delete:function(e){var r=h(this,t),n=v(r,e);if(n){var o=n.n,i=n.p;delete r._i[n.i],n.r=!0,i&&(i.n=o),o&&(o.p=i),r._f==n&&(r._f=o),r._l==n&&(r._l=i),r[p]--}return!!n},forEach:function(e){h(this,t);for(var r,n=s(e,arguments.length>1?arguments[1]:void 0,3);r=r?r.n:this._f;)for(n(r.v,r.k,this);r&&r.r;)r=r.p},has:function(e){return!!v(h(this,t),e)}}),d&&n(l.prototype,"size",{get:function(){return h(this,t)[p]}}),l},def:function(e,t,r){var n,o,i=v(e,t);return i?i.v=r:(e._l=i={i:o=y(t,!0),k:t,v:r,p:n=e._l,n:void 0,r:!1},e._f||(e._f=i),n&&(n.n=i),e[p]++,"F"!==o&&(e._i[o]=i)),e},getEntry:v,setStrong:function(e,t,r){u(e,t,function(e,r){this._t=h(e,t),this._k=r,this._l=void 0},function(){for(var e=this._k,t=this._l;t&&t.r;)t=t.p;return this._t&&(this._l=t=t?t.n:this._t._f)?l(0,"keys"==e?t.k:"values"==e?t.v:[t.k,t.v]):(this._t=void 0,l(1))},r?"entries":"values",!r,!0),f(t)}}},function(e,t,r){"use strict";var n=r(43),o=r(28).getWeak,i=r(4),s=r(5),a=r(42),c=r(56),u=r(21),l=r(14),f=r(37),d=u(5),y=u(6),h=0,p=function(e){return e._l||(e._l=new v)},v=function(){this.a=[]},g=function(e,t){return d(e.a,function(e){return e[0]===t})};v.prototype={get:function(e){var t=g(this,e);if(t)return t[1]},has:function(e){return!!g(this,e)},set:function(e,t){var r=g(this,e);r?r[1]=t:this.a.push([e,t])},delete:function(e){var t=y(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,r,i){var u=e(function(e,n){a(e,u,t,"_i"),e._t=t,e._i=h++,e._l=void 0,null!=n&&c(n,r,e[i],e)});return n(u.prototype,{delete:function(e){if(!s(e))return!1;var r=o(e);return!0===r?p(f(this,t)).delete(e):r&&l(r,this._i)&&delete r[this._i]},has:function(e){if(!s(e))return!1;var r=o(e);return!0===r?p(f(this,t)).has(e):r&&l(r,this._i)}}),u},def:function(e,t,r){var n=o(i(t),!0);return!0===n?p(e).set(t,r):n[e._i]=r,e},ufstore:p}},function(e,t,r){var n=r(18),o=r(7);e.exports=function(e){if(void 0===e)return 0;var t=n(e),r=o(t);if(t!==r)throw RangeError("Wrong length!");return r}},function(e,t,r){var n=r(35),o=r(50),i=r(4),s=r(2).Reflect;e.exports=s&&s.ownKeys||function(e){var t=n.f(i(e)),r=o.f;return r?t.concat(r(e)):t}},function(e,t,r){var n=r(7),o=r(69),i=r(25);e.exports=function(e,t,r,s){var a=String(i(e)),c=a.length,u=void 0===r?" ":String(r),l=n(t);if(l<=c||""==u)return a;var f=l-c,d=o.call(u,Math.ceil(f/u.length));return d.length>f&&(d=d.slice(0,f)),s?d+a:a+d}},function(e,t,r){var n=r(32),o=r(16),i=r(45).f;e.exports=function(e){return function(t){for(var r,s=o(t),a=n(s),c=a.length,u=0,l=[];c>u;)i.call(s,r=a[u++])&&l.push(e?[r,s[r]]:s[r]);return l}}},function(e,t,r){r(119),e.exports=r(288)},function(e,t,r){"use strict";(function(e){r(121),r(265),r(267),r(269),r(271),r(273),r(275),r(277),r(279),r(281),r(285),e._babelPolyfill&&"undefined"!=typeof console&&console.warn&&console.warn("@babel/polyfill is loaded more than once on this page. This is probably not desirable/intended and may have consequences if different versions of the polyfills are applied sequentially. If you do need to load the polyfill more than once, use @babel/polyfill/noConflict instead to bypass the warning."),e._babelPolyfill=!0}).call(this,r(120))},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){r(122),r(125),r(126),r(127),r(128),r(129),r(130),r(131),r(132),r(133),r(134),r(135),r(136),r(137),r(138),r(139),r(140),r(141),r(142),r(143),r(144),r(145),r(146),r(147),r(148),r(149),r(150),r(151),r(152),r(153),r(154),r(155),r(156),r(157),r(158),r(159),r(160),r(161),r(162),r(163),r(164),r(165),r(166),r(168),r(169),r(170),r(171),r(172),r(173),r(174),r(175),r(176),r(177),r(178),r(179),r(180),r(181),r(182),r(183),r(184),r(185),r(186),r(187),r(188),r(189),r(190),r(191),r(192),r(193),r(194),r(195),r(196),r(197),r(198),r(199),r(200),r(201),r(203),r(204),r(206),r(207),r(208),r(209),r(210),r(211),r(212),r(215),r(216),r(217),r(218),r(219),r(220),r(221),r(222),r(223),r(224),r(225),r(226),r(227),r(81),r(228),r(107),r(229),r(108),r(230),r(231),r(232),r(233),r(109),r(236),r(237),r(238),r(239),r(240),r(241),r(242),r(243),r(244),r(245),r(246),r(247),r(248),r(249),r(250),r(251),r(252),r(253),r(254),r(255),r(256),r(257),r(258),r(259),r(260),r(261),r(262),r(263),r(264),e.exports=r(10)},function(e,t,r){"use strict";var n=r(2),o=r(14),i=r(9),s=r(1),a=r(11),c=r(28).KEY,u=r(3),l=r(48),f=r(38),d=r(30),y=r(6),h=r(61),p=r(89),v=r(124),g=r(64),b=r(4),m=r(5),_=r(16),w=r(27),O=r(29),k=r(34),R=r(92),P=r(19),S=r(8),j=r(32),M=P.f,L=S.f,E=R.f,U=n.Symbol,C=n.JSON,I=C&&C.stringify,A=y("_hidden"),x=y("toPrimitive"),T={}.propertyIsEnumerable,D=l("symbol-registry"),H=l("symbols"),N=l("op-symbols"),B=Object.prototype,F="function"==typeof U,K=n.QObject,G=!K||!K.prototype||!K.prototype.findChild,q=i&&u(function(){return 7!=k(L({},"a",{get:function(){return L(this,"a",{value:7}).a}})).a})?function(e,t,r){var n=M(B,t);n&&delete B[t],L(e,t,r),n&&e!==B&&L(B,t,n)}:L,V=function(e){var t=H[e]=k(U.prototype);return t._k=e,t},W=F&&"symbol"==typeof U.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof U},J=function(e,t,r){return e===B&&J(N,t,r),b(e),t=w(t,!0),b(r),o(H,t)?(r.enumerable?(o(e,A)&&e[A][t]&&(e[A][t]=!1),r=k(r,{enumerable:O(0,!1)})):(o(e,A)||L(e,A,O(1,{})),e[A][t]=!0),q(e,t,r)):L(e,t,r)},Y=function(e,t){b(e);for(var r,n=v(t=_(t)),o=0,i=n.length;i>o;)J(e,r=n[o++],t[r]);return e},z=function(e){var t=T.call(this,e=w(e,!0));return!(this===B&&o(H,e)&&!o(N,e))&&(!(t||!o(this,e)||!o(H,e)||o(this,A)&&this[A][e])||t)},$=function(e,t){if(e=_(e),t=w(t,!0),e!==B||!o(H,t)||o(N,t)){var r=M(e,t);return!r||!o(H,t)||o(e,A)&&e[A][t]||(r.enumerable=!0),r}},X=function(e){for(var t,r=E(_(e)),n=[],i=0;r.length>i;)o(H,t=r[i++])||t==A||t==c||n.push(t);return n},Q=function(e){for(var t,r=e===B,n=E(r?N:_(e)),i=[],s=0;n.length>s;)!o(H,t=n[s++])||r&&!o(B,t)||i.push(H[t]);return i};F||(a((U=function(){if(this instanceof U)throw TypeError("Symbol is not a constructor!");var e=d(arguments.length>0?arguments[0]:void 0),t=function(r){this===B&&t.call(N,r),o(this,A)&&o(this[A],e)&&(this[A][e]=!1),q(this,e,O(1,r))};return i&&G&&q(B,e,{configurable:!0,set:t}),V(e)}).prototype,"toString",function(){return this._k}),P.f=$,S.f=J,r(35).f=R.f=X,r(45).f=z,r(50).f=Q,i&&!r(31)&&a(B,"propertyIsEnumerable",z,!0),h.f=function(e){return V(y(e))}),s(s.G+s.W+s.F*!F,{Symbol:U});for(var Z="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),ee=0;Z.length>ee;)y(Z[ee++]);for(var te=j(y.store),re=0;te.length>re;)p(te[re++]);s(s.S+s.F*!F,"Symbol",{for:function(e){return o(D,e+="")?D[e]:D[e]=U(e)},keyFor:function(e){if(!W(e))throw TypeError(e+" is not a symbol!");for(var t in D)if(D[t]===e)return t},useSetter:function(){G=!0},useSimple:function(){G=!1}}),s(s.S+s.F*!F,"Object",{create:function(e,t){return void 0===t?k(e):Y(k(e),t)},defineProperty:J,defineProperties:Y,getOwnPropertyDescriptor:$,getOwnPropertyNames:X,getOwnPropertySymbols:Q}),C&&s(s.S+s.F*(!F||u(function(){var e=U();return"[null]"!=I([e])||"{}"!=I({a:e})||"{}"!=I(Object(e))})),"JSON",{stringify:function(e){for(var t,r,n=[e],o=1;arguments.length>o;)n.push(arguments[o++]);if(r=t=n[1],(m(t)||void 0!==e)&&!W(e))return g(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!W(t))return t}),n[1]=t,I.apply(C,n)}}),U.prototype[x]||r(15)(U.prototype,x,U.prototype.valueOf),f(U,"Symbol"),f(Math,"Math",!0),f(n.JSON,"JSON",!0)},function(e,t,r){e.exports=r(48)("native-function-to-string",Function.toString)},function(e,t,r){var n=r(32),o=r(50),i=r(45);e.exports=function(e){var t=n(e),r=o.f;if(r)for(var s,a=r(e),c=i.f,u=0;a.length>u;)c.call(e,s=a[u++])&&t.push(s);return t}},function(e,t,r){var n=r(1);n(n.S,"Object",{create:r(34)})},function(e,t,r){var n=r(1);n(n.S+n.F*!r(9),"Object",{defineProperty:r(8).f})},function(e,t,r){var n=r(1);n(n.S+n.F*!r(9),"Object",{defineProperties:r(91)})},function(e,t,r){var n=r(16),o=r(19).f;r(20)("getOwnPropertyDescriptor",function(){return function(e,t){return o(n(e),t)}})},function(e,t,r){var n=r(12),o=r(36);r(20)("getPrototypeOf",function(){return function(e){return o(n(e))}})},function(e,t,r){var n=r(12),o=r(32);r(20)("keys",function(){return function(e){return o(n(e))}})},function(e,t,r){r(20)("getOwnPropertyNames",function(){return r(92).f})},function(e,t,r){var n=r(5),o=r(28).onFreeze;r(20)("freeze",function(e){return function(t){return e&&n(t)?e(o(t)):t}})},function(e,t,r){var n=r(5),o=r(28).onFreeze;r(20)("seal",function(e){return function(t){return e&&n(t)?e(o(t)):t}})},function(e,t,r){var n=r(5),o=r(28).onFreeze;r(20)("preventExtensions",function(e){return function(t){return e&&n(t)?e(o(t)):t}})},function(e,t,r){var n=r(5);r(20)("isFrozen",function(e){return function(t){return!n(t)||!!e&&e(t)}})},function(e,t,r){var n=r(5);r(20)("isSealed",function(e){return function(t){return!n(t)||!!e&&e(t)}})},function(e,t,r){var n=r(5);r(20)("isExtensible",function(e){return function(t){return!!n(t)&&(!e||e(t))}})},function(e,t,r){var n=r(1);n(n.S+n.F,"Object",{assign:r(93)})},function(e,t,r){var n=r(1);n(n.S,"Object",{is:r(94)})},function(e,t,r){var n=r(1);n(n.S,"Object",{setPrototypeOf:r(66).set})},function(e,t,r){"use strict";var n=r(46),o={};o[r(6)("toStringTag")]="z",o+""!="[object z]"&&r(11)(Object.prototype,"toString",function(){return"[object "+n(this)+"]"},!0)},function(e,t,r){var n=r(1);n(n.P,"Function",{bind:r(95)})},function(e,t,r){var n=r(8).f,o=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in o||r(9)&&n(o,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},function(e,t,r){"use strict";var n=r(5),o=r(36),i=r(6)("hasInstance"),s=Function.prototype;i in s||r(8).f(s,i,{value:function(e){if("function"!=typeof this||!n(e))return!1;if(!n(this.prototype))return e instanceof this;for(;e=o(e);)if(this.prototype===e)return!0;return!1}})},function(e,t,r){var n=r(1),o=r(97);n(n.G+n.F*(parseInt!=o),{parseInt:o})},function(e,t,r){var n=r(1),o=r(98);n(n.G+n.F*(parseFloat!=o),{parseFloat:o})},function(e,t,r){"use strict";var n=r(2),o=r(14),i=r(24),s=r(68),a=r(27),c=r(3),u=r(35).f,l=r(19).f,f=r(8).f,d=r(51).trim,y=n.Number,h=y,p=y.prototype,v="Number"==i(r(34)(p)),g="trim"in String.prototype,b=function(e){var t=a(e,!1);if("string"==typeof t&&t.length>2){var r,n,o,i=(t=g?t.trim():d(t,3)).charCodeAt(0);if(43===i||45===i){if(88===(r=t.charCodeAt(2))||120===r)return NaN}else if(48===i){switch(t.charCodeAt(1)){case 66:case 98:n=2,o=49;break;case 79:case 111:n=8,o=55;break;default:return+t}for(var s,c=t.slice(2),u=0,l=c.length;uo)return NaN;return parseInt(c,n)}}return+t};if(!y(" 0o1")||!y("0b1")||y("+0x1")){y=function(e){var t=arguments.length<1?0:e,r=this;return r instanceof y&&(v?c(function(){p.valueOf.call(r)}):"Number"!=i(r))?s(new h(b(t)),r,y):b(t)};for(var m,_=r(9)?u(h):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),w=0;_.length>w;w++)o(h,m=_[w])&&!o(y,m)&&f(y,m,l(h,m));y.prototype=p,p.constructor=y,r(11)(n,"Number",y)}},function(e,t,r){"use strict";var n=r(1),o=r(18),i=r(99),s=r(69),a=1..toFixed,c=Math.floor,u=[0,0,0,0,0,0],l="Number.toFixed: incorrect invocation!",f=function(e,t){for(var r=-1,n=t;++r<6;)n+=e*u[r],u[r]=n%1e7,n=c(n/1e7)},d=function(e){for(var t=6,r=0;--t>=0;)r+=u[t],u[t]=c(r/e),r=r%e*1e7},y=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==u[e]){var r=String(u[e]);t=""===t?r:t+s.call("0",7-r.length)+r}return t},h=function(e,t,r){return 0===t?r:t%2==1?h(e,t-1,r*e):h(e*e,t/2,r)};n(n.P+n.F*(!!a&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!r(3)(function(){a.call({})})),"Number",{toFixed:function(e){var t,r,n,a,c=i(this,l),u=o(e),p="",v="0";if(u<0||u>20)throw RangeError(l);if(c!=c)return"NaN";if(c<=-1e21||c>=1e21)return String(c);if(c<0&&(p="-",c=-c),c>1e-21)if(r=(t=function(e){for(var t=0,r=c*h(2,69,1);r>=4096;)t+=12,r/=4096;for(;r>=2;)t+=1,r/=2;return t}()-69)<0?c*h(2,-t,1):c/h(2,t,1),r*=4503599627370496,(t=52-t)>0){for(f(0,r),n=u;n>=7;)f(1e7,0),n-=7;for(f(h(10,n,1),0),n=t-1;n>=23;)d(1<<23),n-=23;d(1<0?p+((a=v.length)<=u?"0."+s.call("0",u-a)+v:v.slice(0,a-u)+"."+v.slice(a-u)):p+v}})},function(e,t,r){"use strict";var n=r(1),o=r(3),i=r(99),s=1..toPrecision;n(n.P+n.F*(o(function(){return"1"!==s.call(1,void 0)})||!o(function(){s.call({})})),"Number",{toPrecision:function(e){var t=i(this,"Number#toPrecision: incorrect invocation!");return void 0===e?s.call(t):s.call(t,e)}})},function(e,t,r){var n=r(1);n(n.S,"Number",{EPSILON:Math.pow(2,-52)})},function(e,t,r){var n=r(1),o=r(2).isFinite;n(n.S,"Number",{isFinite:function(e){return"number"==typeof e&&o(e)}})},function(e,t,r){var n=r(1);n(n.S,"Number",{isInteger:r(100)})},function(e,t,r){var n=r(1);n(n.S,"Number",{isNaN:function(e){return e!=e}})},function(e,t,r){var n=r(1),o=r(100),i=Math.abs;n(n.S,"Number",{isSafeInteger:function(e){return o(e)&&i(e)<=9007199254740991}})},function(e,t,r){var n=r(1);n(n.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,r){var n=r(1);n(n.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,r){var n=r(1),o=r(98);n(n.S+n.F*(Number.parseFloat!=o),"Number",{parseFloat:o})},function(e,t,r){var n=r(1),o=r(97);n(n.S+n.F*(Number.parseInt!=o),"Number",{parseInt:o})},function(e,t,r){var n=r(1),o=r(101),i=Math.sqrt,s=Math.acosh;n(n.S+n.F*!(s&&710==Math.floor(s(Number.MAX_VALUE))&&s(1/0)==1/0),"Math",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:o(e-1+i(e-1)*i(e+1))}})},function(e,t,r){var n=r(1),o=Math.asinh;n(n.S+n.F*!(o&&1/o(0)>0),"Math",{asinh:function e(t){return isFinite(t=+t)&&0!=t?t<0?-e(-t):Math.log(t+Math.sqrt(t*t+1)):t}})},function(e,t,r){var n=r(1),o=Math.atanh;n(n.S+n.F*!(o&&1/o(-0)<0),"Math",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}})},function(e,t,r){var n=r(1),o=r(70);n(n.S,"Math",{cbrt:function(e){return o(e=+e)*Math.pow(Math.abs(e),1/3)}})},function(e,t,r){var n=r(1);n(n.S,"Math",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}})},function(e,t,r){var n=r(1),o=Math.exp;n(n.S,"Math",{cosh:function(e){return(o(e=+e)+o(-e))/2}})},function(e,t,r){var n=r(1),o=r(71);n(n.S+n.F*(o!=Math.expm1),"Math",{expm1:o})},function(e,t,r){var n=r(1);n(n.S,"Math",{fround:r(167)})},function(e,t,r){var n=r(70),o=Math.pow,i=o(2,-52),s=o(2,-23),a=o(2,127)*(2-s),c=o(2,-126);e.exports=Math.fround||function(e){var t,r,o=Math.abs(e),u=n(e);return oa||r!=r?u*(1/0):u*r}},function(e,t,r){var n=r(1),o=Math.abs;n(n.S,"Math",{hypot:function(e,t){for(var r,n,i=0,s=0,a=arguments.length,c=0;s0?(n=r/c)*n:r;return c===1/0?1/0:c*Math.sqrt(i)}})},function(e,t,r){var n=r(1),o=Math.imul;n(n.S+n.F*r(3)(function(){return-5!=o(4294967295,5)||2!=o.length}),"Math",{imul:function(e,t){var r=+e,n=+t,o=65535&r,i=65535&n;return 0|o*i+((65535&r>>>16)*i+o*(65535&n>>>16)<<16>>>0)}})},function(e,t,r){var n=r(1);n(n.S,"Math",{log10:function(e){return Math.log(e)*Math.LOG10E}})},function(e,t,r){var n=r(1);n(n.S,"Math",{log1p:r(101)})},function(e,t,r){var n=r(1);n(n.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}})},function(e,t,r){var n=r(1);n(n.S,"Math",{sign:r(70)})},function(e,t,r){var n=r(1),o=r(71),i=Math.exp;n(n.S+n.F*r(3)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(e){return Math.abs(e=+e)<1?(o(e)-o(-e))/2:(i(e-1)-i(-e-1))*(Math.E/2)}})},function(e,t,r){var n=r(1),o=r(71),i=Math.exp;n(n.S,"Math",{tanh:function(e){var t=o(e=+e),r=o(-e);return t==1/0?1:r==1/0?-1:(t-r)/(i(e)+i(-e))}})},function(e,t,r){var n=r(1);n(n.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}})},function(e,t,r){var n=r(1),o=r(33),i=String.fromCharCode,s=String.fromCodePoint;n(n.S+n.F*(!!s&&1!=s.length),"String",{fromCodePoint:function(e){for(var t,r=[],n=arguments.length,s=0;n>s;){if(t=+arguments[s++],o(t,1114111)!==t)throw RangeError(t+" is not a valid code point");r.push(t<65536?i(t):i(55296+((t-=65536)>>10),t%1024+56320))}return r.join("")}})},function(e,t,r){var n=r(1),o=r(16),i=r(7);n(n.S,"String",{raw:function(e){for(var t=o(e.raw),r=i(t.length),n=arguments.length,s=[],a=0;r>a;)s.push(String(t[a++])),a=t.length?{value:void 0,done:!0}:(e=n(t,r),this._i+=e.length,{value:e,done:!1})})},function(e,t,r){"use strict";var n=r(1),o=r(72)(!1);n(n.P,"String",{codePointAt:function(e){return o(this,e)}})},function(e,t,r){"use strict";var n=r(1),o=r(7),i=r(74),s="".endsWith;n(n.P+n.F*r(76)("endsWith"),"String",{endsWith:function(e){var t=i(this,e,"endsWith"),r=arguments.length>1?arguments[1]:void 0,n=o(t.length),a=void 0===r?n:Math.min(o(r),n),c=String(e);return s?s.call(t,c,a):t.slice(a-c.length,a)===c}})},function(e,t,r){"use strict";var n=r(1),o=r(74);n(n.P+n.F*r(76)("includes"),"String",{includes:function(e){return!!~o(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,r){var n=r(1);n(n.P,"String",{repeat:r(69)})},function(e,t,r){"use strict";var n=r(1),o=r(7),i=r(74),s="".startsWith;n(n.P+n.F*r(76)("startsWith"),"String",{startsWith:function(e){var t=i(this,e,"startsWith"),r=o(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),n=String(e);return s?s.call(t,n,r):t.slice(r,r+n.length)===n}})},function(e,t,r){"use strict";r(13)("anchor",function(e){return function(t){return e(this,"a","name",t)}})},function(e,t,r){"use strict";r(13)("big",function(e){return function(){return e(this,"big","","")}})},function(e,t,r){"use strict";r(13)("blink",function(e){return function(){return e(this,"blink","","")}})},function(e,t,r){"use strict";r(13)("bold",function(e){return function(){return e(this,"b","","")}})},function(e,t,r){"use strict";r(13)("fixed",function(e){return function(){return e(this,"tt","","")}})},function(e,t,r){"use strict";r(13)("fontcolor",function(e){return function(t){return e(this,"font","color",t)}})},function(e,t,r){"use strict";r(13)("fontsize",function(e){return function(t){return e(this,"font","size",t)}})},function(e,t,r){"use strict";r(13)("italics",function(e){return function(){return e(this,"i","","")}})},function(e,t,r){"use strict";r(13)("link",function(e){return function(t){return e(this,"a","href",t)}})},function(e,t,r){"use strict";r(13)("small",function(e){return function(){return e(this,"small","","")}})},function(e,t,r){"use strict";r(13)("strike",function(e){return function(){return e(this,"strike","","")}})},function(e,t,r){"use strict";r(13)("sub",function(e){return function(){return e(this,"sub","","")}})},function(e,t,r){"use strict";r(13)("sup",function(e){return function(){return e(this,"sup","","")}})},function(e,t,r){var n=r(1);n(n.S,"Date",{now:function(){return(new Date).getTime()}})},function(e,t,r){"use strict";var n=r(1),o=r(12),i=r(27);n(n.P+n.F*r(3)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(e){var t=o(this),r=i(t);return"number"!=typeof r||isFinite(r)?t.toISOString():null}})},function(e,t,r){var n=r(1),o=r(202);n(n.P+n.F*(Date.prototype.toISOString!==o),"Date",{toISOString:o})},function(e,t,r){"use strict";var n=r(3),o=Date.prototype.getTime,i=Date.prototype.toISOString,s=function(e){return e>9?e:"0"+e};e.exports=n(function(){return"0385-07-25T07:06:39.999Z"!=i.call(new Date(-5e13-1))})||!n(function(){i.call(new Date(NaN))})?function(){if(!isFinite(o.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),r=e.getUTCMilliseconds(),n=t<0?"-":t>9999?"+":"";return n+("00000"+Math.abs(t)).slice(n?-6:-4)+"-"+s(e.getUTCMonth()+1)+"-"+s(e.getUTCDate())+"T"+s(e.getUTCHours())+":"+s(e.getUTCMinutes())+":"+s(e.getUTCSeconds())+"."+(r>99?r:"0"+s(r))+"Z"}:i},function(e,t,r){var n=Date.prototype,o=n.toString,i=n.getTime;new Date(NaN)+""!="Invalid Date"&&r(11)(n,"toString",function(){var e=i.call(this);return e==e?o.call(this):"Invalid Date"})},function(e,t,r){var n=r(6)("toPrimitive"),o=Date.prototype;n in o||r(15)(o,n,r(205))},function(e,t,r){"use strict";var n=r(4),o=r(27);e.exports=function(e){if("string"!==e&&"number"!==e&&"default"!==e)throw TypeError("Incorrect hint");return o(n(this),"number"!=e)}},function(e,t,r){var n=r(1);n(n.S,"Array",{isArray:r(64)})},function(e,t,r){"use strict";var n=r(22),o=r(1),i=r(12),s=r(103),a=r(77),c=r(7),u=r(78),l=r(79);o(o.S+o.F*!r(52)(function(e){Array.from(e)}),"Array",{from:function(e){var t,r,o,f,d=i(e),y="function"==typeof this?this:Array,h=arguments.length,p=h>1?arguments[1]:void 0,v=void 0!==p,g=0,b=l(d);if(v&&(p=n(p,h>2?arguments[2]:void 0,2)),null==b||y==Array&&a(b))for(r=new y(t=c(d.length));t>g;g++)u(r,g,v?p(d[g],g):d[g]);else for(f=b.call(d),r=new y;!(o=f.next()).done;g++)u(r,g,v?s(f,p,[o.value,g],!0):o.value);return r.length=g,r}})},function(e,t,r){"use strict";var n=r(1),o=r(78);n(n.S+n.F*r(3)(function(){function e(){}return!(Array.of.call(e)instanceof e)}),"Array",{of:function(){for(var e=0,t=arguments.length,r=new("function"==typeof this?this:Array)(t);t>e;)o(r,e,arguments[e++]);return r.length=t,r}})},function(e,t,r){"use strict";var n=r(1),o=r(16),i=[].join;n(n.P+n.F*(r(44)!=Object||!r(17)(i)),"Array",{join:function(e){return i.call(o(this),void 0===e?",":e)}})},function(e,t,r){"use strict";var n=r(1),o=r(65),i=r(24),s=r(33),a=r(7),c=[].slice;n(n.P+n.F*r(3)(function(){o&&c.call(o)}),"Array",{slice:function(e,t){var r=a(this.length),n=i(this);if(t=void 0===t?r:t,"Array"==n)return c.call(this,e,t);for(var o=s(e,r),u=s(t,r),l=a(u-o),f=new Array(l),d=0;d1&&(n=Math.min(n,i(arguments[1]))),n<0&&(n=r+n);n>=0;n--)if(n in t&&t[n]===e)return n||0;return-1}})},function(e,t,r){var n=r(1);n(n.P,"Array",{copyWithin:r(105)}),r(40)("copyWithin")},function(e,t,r){var n=r(1);n(n.P,"Array",{fill:r(80)}),r(40)("fill")},function(e,t,r){"use strict";var n=r(1),o=r(21)(5),i=!0;"find"in[]&&Array(1).find(function(){i=!1}),n(n.P+n.F*i,"Array",{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),r(40)("find")},function(e,t,r){"use strict";var n=r(1),o=r(21)(6),i="findIndex",s=!0;i in[]&&Array(1)[i](function(){s=!1}),n(n.P+n.F*s,"Array",{findIndex:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),r(40)(i)},function(e,t,r){r(41)("Array")},function(e,t,r){var n=r(2),o=r(68),i=r(8).f,s=r(35).f,a=r(75),c=r(53),u=n.RegExp,l=u,f=u.prototype,d=/a/g,y=/a/g,h=new u(d)!==d;if(r(9)&&(!h||r(3)(function(){return y[r(6)("match")]=!1,u(d)!=d||u(y)==y||"/a/i"!=u(d,"i")}))){u=function(e,t){var r=this instanceof u,n=a(e),i=void 0===t;return!r&&n&&e.constructor===u&&i?e:o(h?new l(n&&!i?e.source:e,t):l((n=e instanceof u)?e.source:e,n&&i?c.call(e):t),r?this:f,u)};for(var p=function(e){e in u||i(u,e,{configurable:!0,get:function(){return l[e]},set:function(t){l[e]=t}})},v=s(l),g=0;v.length>g;)p(v[g++]);f.constructor=u,u.prototype=f,r(11)(n,"RegExp",u)}r(41)("RegExp")},function(e,t,r){"use strict";r(108);var n=r(4),o=r(53),i=r(9),s=/./.toString,a=function(e){r(11)(RegExp.prototype,"toString",e,!0)};r(3)(function(){return"/a/b"!=s.call({source:"a",flags:"b"})})?a(function(){var e=n(this);return"/".concat(e.source,"/","flags"in e?e.flags:!i&&e instanceof RegExp?o.call(e):void 0)}):"toString"!=s.name&&a(function(){return s.call(this)})},function(e,t,r){"use strict";var n=r(4),o=r(7),i=r(83),s=r(54);r(55)("match",1,function(e,t,r,a){return[function(r){var n=e(this),o=null==r?void 0:r[t];return void 0!==o?o.call(r,n):new RegExp(r)[t](String(n))},function(e){var t=a(r,e,this);if(t.done)return t.value;var c=n(e),u=String(this);if(!c.global)return s(c,u);var l=c.unicode;c.lastIndex=0;for(var f,d=[],y=0;null!==(f=s(c,u));){var h=String(f[0]);d[y]=h,""===h&&(c.lastIndex=i(u,o(c.lastIndex),l)),y++}return 0===y?null:d}]})},function(e,t,r){"use strict";var n=r(4),o=r(12),i=r(7),s=r(18),a=r(83),c=r(54),u=Math.max,l=Math.min,f=Math.floor,d=/\$([$&`']|\d\d?|<[^>]*>)/g,y=/\$([$&`']|\d\d?)/g,h=function(e){return void 0===e?e:String(e)};r(55)("replace",2,function(e,t,r,p){return[function(n,o){var i=e(this),s=null==n?void 0:n[t];return void 0!==s?s.call(n,i,o):r.call(String(i),n,o)},function(e,t){var o=p(r,e,this,t);if(o.done)return o.value;var f=n(e),d=String(this),y="function"==typeof t;y||(t=String(t));var g=f.global;if(g){var b=f.unicode;f.lastIndex=0}for(var m=[];;){var _=c(f,d);if(null===_)break;if(m.push(_),!g)break;""===String(_[0])&&(f.lastIndex=a(d,i(f.lastIndex),b))}for(var w="",O=0,k=0;k=O&&(w+=d.slice(O,P)+E,O=P+R.length)}return w+d.slice(O)}];function v(e,t,n,i,s,a){var c=n+e.length,u=i.length,l=y;return void 0!==s&&(s=o(s),l=d),r.call(a,l,function(r,o){var a;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,n);case"'":return t.slice(c);case"<":a=s[o.slice(1,-1)];break;default:var l=+o;if(0===l)return r;if(l>u){var d=f(l/10);return 0===d?r:d<=u?void 0===i[d-1]?o.charAt(1):i[d-1]+o.charAt(1):r}a=i[l-1]}return void 0===a?"":a})}})},function(e,t,r){"use strict";var n=r(4),o=r(94),i=r(54);r(55)("search",1,function(e,t,r,s){return[function(r){var n=e(this),o=null==r?void 0:r[t];return void 0!==o?o.call(r,n):new RegExp(r)[t](String(n))},function(e){var t=s(r,e,this);if(t.done)return t.value;var a=n(e),c=String(this),u=a.lastIndex;o(u,0)||(a.lastIndex=0);var l=i(a,c);return o(a.lastIndex,u)||(a.lastIndex=u),null===l?-1:l.index}]})},function(e,t,r){"use strict";var n=r(75),o=r(4),i=r(47),s=r(83),a=r(7),c=r(54),u=r(82),l=r(3),f=Math.min,d=[].push,y=!l(function(){RegExp(4294967295,"y")});r(55)("split",2,function(e,t,r,l){var h;return h="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,t){var o=String(this);if(void 0===e&&0===t)return[];if(!n(e))return r.call(o,e,t);for(var i,s,a,c=[],l=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,y=void 0===t?4294967295:t>>>0,h=new RegExp(e.source,l+"g");(i=u.call(h,o))&&!((s=h.lastIndex)>f&&(c.push(o.slice(f,i.index)),i.length>1&&i.index=y));)h.lastIndex===i.index&&h.lastIndex++;return f===o.length?!a&&h.test("")||c.push(""):c.push(o.slice(f)),c.length>y?c.slice(0,y):c}:"0".split(void 0,0).length?function(e,t){return void 0===e&&0===t?[]:r.call(this,e,t)}:r,[function(r,n){var o=e(this),i=null==r?void 0:r[t];return void 0!==i?i.call(r,o,n):h.call(String(o),r,n)},function(e,t){var n=l(h,e,this,t,h!==r);if(n.done)return n.value;var u=o(e),d=String(this),p=i(u,RegExp),v=u.unicode,g=(u.ignoreCase?"i":"")+(u.multiline?"m":"")+(u.unicode?"u":"")+(y?"y":"g"),b=new p(y?u:"^(?:"+u.source+")",g),m=void 0===t?4294967295:t>>>0;if(0===m)return[];if(0===d.length)return null===c(b,d)?[d]:[];for(var _=0,w=0,O=[];w0?arguments[0]:void 0)}},{get:function(e){var t=n.getEntry(o(this,"Map"),e);return t&&t.v},set:function(e,t){return n.def(o(this,"Map"),0===e?0:e,t)}},n,!0)},function(e,t,r){"use strict";var n=r(112),o=r(37);e.exports=r(58)("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return n.def(o(this,"Set"),e=0===e?0:e,e)}},n)},function(e,t,r){"use strict";var n,o=r(2),i=r(21)(0),s=r(11),a=r(28),c=r(93),u=r(113),l=r(5),f=r(37),d=r(37),y=!o.ActiveXObject&&"ActiveXObject"in o,h=a.getWeak,p=Object.isExtensible,v=u.ufstore,g=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},b={get:function(e){if(l(e)){var t=h(e);return!0===t?v(f(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return u.def(f(this,"WeakMap"),e,t)}},m=e.exports=r(58)("WeakMap",g,b,u,!0,!0);d&&y&&(c((n=u.getConstructor(g,"WeakMap")).prototype,b),a.NEED=!0,i(["delete","has","get","set"],function(e){var t=m.prototype,r=t[e];s(t,e,function(t,o){if(l(t)&&!p(t)){this._f||(this._f=new n);var i=this._f[e](t,o);return"set"==e?this:i}return r.call(this,t,o)})}))},function(e,t,r){"use strict";var n=r(113),o=r(37);r(58)("WeakSet",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return n.def(o(this,"WeakSet"),e,!0)}},n,!1,!0)},function(e,t,r){"use strict";var n=r(1),o=r(59),i=r(85),s=r(4),a=r(33),c=r(7),u=r(5),l=r(2).ArrayBuffer,f=r(47),d=i.ArrayBuffer,y=i.DataView,h=o.ABV&&l.isView,p=d.prototype.slice,v=o.VIEW;n(n.G+n.W+n.F*(l!==d),{ArrayBuffer:d}),n(n.S+n.F*!o.CONSTR,"ArrayBuffer",{isView:function(e){return h&&h(e)||u(e)&&v in e}}),n(n.P+n.U+n.F*r(3)(function(){return!new d(2).slice(1,void 0).byteLength}),"ArrayBuffer",{slice:function(e,t){if(void 0!==p&&void 0===t)return p.call(s(this),e);for(var r=s(this).byteLength,n=a(e,r),o=a(void 0===t?r:t,r),i=new(f(this,d))(c(o-n)),u=new y(this),l=new y(i),h=0;n=t.length)return{value:void 0,done:!0}}while(!((e=t[this._i++])in this._t));return{value:e,done:!1}}),n(n.S,"Reflect",{enumerate:function(e){return new i(e)}})},function(e,t,r){var n=r(19),o=r(36),i=r(14),s=r(1),a=r(5),c=r(4);s(s.S,"Reflect",{get:function e(t,r){var s,u,l=arguments.length<3?t:arguments[2];return c(t)===l?t[r]:(s=n.f(t,r))?i(s,"value")?s.value:void 0!==s.get?s.get.call(l):void 0:a(u=o(t))?e(u,r,l):void 0}})},function(e,t,r){var n=r(19),o=r(1),i=r(4);o(o.S,"Reflect",{getOwnPropertyDescriptor:function(e,t){return n.f(i(e),t)}})},function(e,t,r){var n=r(1),o=r(36),i=r(4);n(n.S,"Reflect",{getPrototypeOf:function(e){return o(i(e))}})},function(e,t,r){var n=r(1);n(n.S,"Reflect",{has:function(e,t){return t in e}})},function(e,t,r){var n=r(1),o=r(4),i=Object.isExtensible;n(n.S,"Reflect",{isExtensible:function(e){return o(e),!i||i(e)}})},function(e,t,r){var n=r(1);n(n.S,"Reflect",{ownKeys:r(115)})},function(e,t,r){var n=r(1),o=r(4),i=Object.preventExtensions;n(n.S,"Reflect",{preventExtensions:function(e){o(e);try{return i&&i(e),!0}catch(e){return!1}}})},function(e,t,r){var n=r(8),o=r(19),i=r(36),s=r(14),a=r(1),c=r(29),u=r(4),l=r(5);a(a.S,"Reflect",{set:function e(t,r,a){var f,d,y=arguments.length<4?t:arguments[3],h=o.f(u(t),r);if(!h){if(l(d=i(t)))return e(d,r,a,y);h=c(0)}if(s(h,"value")){if(!1===h.writable||!l(y))return!1;if(f=o.f(y,r)){if(f.get||f.set||!1===f.writable)return!1;f.value=a,n.f(y,r,f)}else n.f(y,r,c(0,a));return!0}return void 0!==h.set&&(h.set.call(y,a),!0)}})},function(e,t,r){var n=r(1),o=r(66);o&&n(n.S,"Reflect",{setPrototypeOf:function(e,t){o.check(e,t);try{return o.set(e,t),!0}catch(e){return!1}}})},function(e,t,r){r(266),e.exports=r(10).Array.includes},function(e,t,r){"use strict";var n=r(1),o=r(49)(!0);n(n.P,"Array",{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),r(40)("includes")},function(e,t,r){r(268),e.exports=r(10).String.padStart},function(e,t,r){"use strict";var n=r(1),o=r(116),i=r(57),s=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(i);n(n.P+n.F*s,"String",{padStart:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0,!0)}})},function(e,t,r){r(270),e.exports=r(10).String.padEnd},function(e,t,r){"use strict";var n=r(1),o=r(116),i=r(57),s=/Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(i);n(n.P+n.F*s,"String",{padEnd:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0,!1)}})},function(e,t,r){r(272),e.exports=r(61).f("asyncIterator")},function(e,t,r){r(89)("asyncIterator")},function(e,t,r){r(274),e.exports=r(10).Object.getOwnPropertyDescriptors},function(e,t,r){var n=r(1),o=r(115),i=r(16),s=r(19),a=r(78);n(n.S,"Object",{getOwnPropertyDescriptors:function(e){for(var t,r,n=i(e),c=s.f,u=o(n),l={},f=0;u.length>f;)void 0!==(r=c(n,t=u[f++]))&&a(l,t,r);return l}})},function(e,t,r){r(276),e.exports=r(10).Object.values},function(e,t,r){var n=r(1),o=r(117)(!1);n(n.S,"Object",{values:function(e){return o(e)}})},function(e,t,r){r(278),e.exports=r(10).Object.entries},function(e,t,r){var n=r(1),o=r(117)(!0);n(n.S,"Object",{entries:function(e){return o(e)}})},function(e,t,r){"use strict";r(109),r(280),e.exports=r(10).Promise.finally},function(e,t,r){"use strict";var n=r(1),o=r(10),i=r(2),s=r(47),a=r(111);n(n.P+n.R,"Promise",{finally:function(e){var t=s(this,o.Promise||i.Promise),r="function"==typeof e;return this.then(r?function(r){return a(t,e()).then(function(){return r})}:e,r?function(r){return a(t,e()).then(function(){throw r})}:e)}})},function(e,t,r){r(282),r(283),r(284),e.exports=r(10)},function(e,t,r){var n=r(2),o=r(1),i=r(57),s=[].slice,a=/MSIE .\./.test(i),c=function(e){return function(t,r){var n=arguments.length>2,o=!!n&&s.call(arguments,2);return e(n?function(){("function"==typeof t?t:Function(t)).apply(this,o)}:t,r)}};o(o.G+o.B+o.F*a,{setTimeout:c(n.setTimeout),setInterval:c(n.setInterval)})},function(e,t,r){var n=r(1),o=r(84);n(n.G+n.B,{setImmediate:o.set,clearImmediate:o.clear})},function(e,t,r){for(var n=r(81),o=r(32),i=r(11),s=r(2),a=r(15),c=r(39),u=r(6),l=u("iterator"),f=u("toStringTag"),d=c.Array,y={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},h=o(y),p=0;p=0;--i){var s=this.tryEntries[i],a=s.completion;if("root"===s.tryLoc)return n("end");if(s.tryLoc<=this.prev){var c=o.call(s,"catchLoc"),u=o.call(s,"finallyLoc");if(c&&u){if(this.prev=0;--r){var n=this.tryEntries[r];if(n.tryLoc<=this.prev&&o.call(n,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),L(r),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;L(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:U(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=r),p}}}function _(e,t,r,n){var o=t&&t.prototype instanceof O?t:O,i=Object.create(o.prototype),s=new E(n||[]);return i._invoke=function(e,t,r){var n=f;return function(o,i){if(n===y)throw new Error("Generator is already running");if(n===h){if("throw"===o)throw i;return C()}for(r.method=o,r.arg=i;;){var s=r.delegate;if(s){var a=j(s,r);if(a){if(a===p)continue;return a}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===f)throw n=h,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n=y;var c=w(e,t,r);if("normal"===c.type){if(n=r.done?h:d,c.arg===p)continue;return{value:c.arg,done:r.done}}"throw"===c.type&&(n=h,r.method="throw",r.arg=c.arg)}}}(e,r,s),i}function w(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}function O(){}function k(){}function R(){}function P(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function S(e){var t;this._invoke=function(r,n){function i(){return new Promise(function(t,i){!function t(r,n,i,s){var a=w(e[r],e,n);if("throw"!==a.type){var c=a.arg,u=c.value;return u&&"object"==typeof u&&o.call(u,"__await")?Promise.resolve(u.__await).then(function(e){t("next",e,i,s)},function(e){t("throw",e,i,s)}):Promise.resolve(u).then(function(e){c.value=e,i(c)},function(e){return t("throw",e,i,s)})}s(a.arg)}(r,n,t,i)})}return t=t?t.then(i,i):i()}}function j(e,t){var n=e.iterator[t.method];if(n===r){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=r,j(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var o=w(n,e.iterator,t.arg);if("throw"===o.type)return t.method="throw",t.arg=o.arg,t.delegate=null,p;var i=o.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=r),t.delegate=null,p):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function M(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function L(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function E(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(M,this),this.reset(!0)}function U(e){if(e){var t=e[s];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,i=function t(){for(;++n=0;n--){var o=e[n];"."===o?e.splice(n,1):".."===o?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}var n=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,o=function(e){return n.exec(e).slice(1)};function i(e,t){if(e.filter)return e.filter(t);for(var r=[],n=0;n=-1&&!n;o--){var s=o>=0?arguments[o]:e.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(t=s+"/"+t,n="/"===s.charAt(0))}return(n?"/":"")+(t=r(i(t.split("/"),function(e){return!!e}),!n).join("/"))||"."},t.normalize=function(e){var n=t.isAbsolute(e),o="/"===s(e,-1);return(e=r(i(e.split("/"),function(e){return!!e}),!n).join("/"))||n||(e="."),e&&o&&(e+="/"),(n?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(i(e,function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},t.relative=function(e,r){function n(e){for(var t=0;t=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=t.resolve(e).substr(1),r=t.resolve(r).substr(1);for(var o=n(e.split("/")),i=n(r.split("/")),s=Math.min(o.length,i.length),a=s,c=0;c1)for(var r=1;r0)}function I(){return Math.floor(Date.now()/1e3)}function A(e){if(e)return JSON.parse(JSON.stringify(e))}function x(e){var t=e.split("/");return t[0]+"//"+t[2]+"/"+t[3]}function T(e){var t=U(e);return t.identity.replace("/","")+"@"+t.domain}function D(e){var t=e.split("://")[0];return-1===["domain-idp","runtime","domain","hyperty"].indexOf(t)}function H(e){return e.split("@").length>1}function N(e){return e.split("/").length>=3}function B(e){return"hyperty"===U(e).type}function F(e,t,r){return e[t][r]}function K(e,t,r,n){var o,i=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=e[t];if(!s.hasOwnProperty(r))throw Error("The configuration "+JSON.stringify(s,"",2)+" don't have the "+r+" resource you are looking for");var a=s[r];return n?(o=a.prefix+e.domain+a.suffix+n,a.hasOwnProperty("fallback")&&i&&(o=a.fallback.indexOf("%domain%")?a.fallback.replace(/(%domain%)/g,e.domain)+n:a.fallback+n)):o=a.prefix+e.domain+a.suffix,o}function G(){function e(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return e()+e()+"-"+e()+"-"+e()+"-"+e()+"-"+e()+e()+e()}function q(e){var t,r=U(e),n=r.domain.split("."),o=["registry","msg-node"];return n.length>1&&(t=n.filter(function(e){return-1!==o.indexOf(e)})[0]),!(!t||-1===o.indexOf(t))||!!r.type&&-1!==["domain","global","domain-idp"].indexOf(r.type)}function V(e,t,r){e||(e={}),"string"==typeof t&&(t=J(t));for(var n=t.length-1,o=0;o4&&void 0!==arguments[4]?arguments[4]:60;function s(e){throw"[HeartBeat] "+e+" mandatory parameter is missing"}!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),t?this._bus=t:s("bus"),o?this._dataObject=o:s("dataObject"),i?this._heartBeatRate=i:s("heartBeatRate"),n?this._runtimeUrl=n:s("runtimeUrl"),r?this._hypertyUrl=r:s("hypertyUrl"),this.heartbeat=0,this._stop={heartBeat:!1,sync:function(e){var t={from:r,to:n+"/sm",type:"execute",body:{method:"stopSync",params:[o.url]}};console.log("[Heartbeat.stop.sync()] sending msg:",t),e.postMessage(t)}}}return function(e,t,r){t&&de(e.prototype,t)}(e,[{key:"start",value:function(e){var t=this,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1];console.log("[HeartBeat] starting. isReporter: ",r),e||!r?this._getLastHearBeat().then(function(){t._isHeartBeatActive(t.heartBeat,2*t._heartBeatRate)?t._watchHeartBeat(t._heartBeatRate,!0,t._onHertbeatStopped):(console.log("[HeartBeat] heart beats are disabled for ",t._dataObject),t._stop.heartBeat=t._startHeartBeat(t._heartBeatRate),console.log("[HeartBeat] ",t._hypertyUrl," started synching with remote storage server"),t._startSync())}):(this._startHeartBeat(this._heartBeatRate),this._startSync())}},{key:"_getLastHearBeat",value:function(){var e=this;return new Promise(function(t){setTimeout(function(){console.log("[HeartBeat._getLastHearBeat] stop waiting "),t()},1e3*e._heartBeatRate*1.5)})}},{key:"stop",value:function(){this._stop.heartBeat&&this._stop.heartBeat(),this._stop.sync(this._bus)}},{key:"onNewHeartbeat",value:function(e){this.heartbeat=e}},{key:"_isHeartBeatActive",value:function(e,t){var r=I()-e;return console.log("[HeartBeat._isHeartBeatActive] now - lastHeartBeat",r),console.log("[HeartBeat._isHeartBeatActive] ",!(r>2*t)),!(r>2*t)}},{key:"_startHeartBeat",value:function(e){var t=this,r={from:t._hypertyUrl,to:t._dataObject.url+"/children/",type:"create",body:{resource:"heartbeat",mutual:!1,value:I()}};console.log("[HeartBeat._startHeartBeat] starting ... ",r.body.value),this._bus.postMessage(r),this.heartbeat=I();var n=setInterval(function(){var e={from:t._hypertyUrl,to:t._dataObject.url+"/children/",type:"create",body:{resource:"heartbeat",mutual:!1,value:I()}};console.log("[HeartBeat] ",e),t._bus.postMessage(e),this.heartbeat=I()},1e3*e);return function(){clearInterval(n)}}},{key:"_startSync",value:function(){console.log("[HeartBeat._startSync] starting observer sync ",this._dataObject.data);var e=this._dataObject.data.backupRevision;console.log("[HeartBeat._startSync] backupRevision ",e);var t={from:this._hypertyUrl,to:this._runtimeUrl+"/sm",type:"execute",body:{method:"sync",params:[this._dataObject.url,e]}};console.log("[HeartBeat._startSync] sending msg ",t),this._bus.postMessage(t)}},{key:"_watchHeartBeat",value:function(e,t,r){var n=this,o=r;console.log("[HeartBeat._watchHeartBeat] started watching ",n.heartBeat);var i=setInterval(function(){t&&!n._isHeartBeatActive(n.heartBeat,n._heartBeatRate)?(console.log("[HeartBeat._watchHeartBeat] has stopped ",n._dataObject.data),clearInterval(i),o(n)):!t&&this._isHeartBeatActive(n.heartBeat,n._heartBeatRate)&&(console.log("[HeartBeat._watchHeartBeat] has changed to disabled ",n._dataObject.data),clearInterval(i),o())},1e3*e*2)}},{key:"_onHertbeatStopped",value:function(e){e._startHeartBeat(e._heartBeatRate),e._startSync()}},{key:"heartBeat",get:function(){return this.heartbeat?this.heartbeat:0}}]),e}();function he(e){return(he="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function pe(e,t){for(var r=0;r=a&&s>r.width?(a*=r.width/s,s=r.width,c=!0):a>r.height&&(s*=r.height/a,a=r.height,c=!0),c){var u=document.createElement("canvas");if(u.width=s,u.height=a,u.getContext("2d").drawImage(o,0,0,s,a),Pe)u.toBlob(function(e){n(e,!0)},t.type);else{var l=e._toBlob(u,t.type);n(l,!0)}}else n(t,!1)},e._loadImage(o,t),!0}},{key:"_toBlob",value:function(e,t){var r,n=e.toDataURL(t).split(",");r=n[0].indexOf("base64")>=0?atob(n[1]):decodeURIComponent(n[1]);for(var o=new ArrayBuffer(r.length),i=new Uint8Array(o),s=0;st&&(t=e._childrens[r].childId)}),Number(t.split("#")[1])}},{key:"_allocateListeners",value:function(){var e=this,t=this,r=t._url+"/children/";if(Be.log("[Data Object - AllocateListeners] - ",t._childrens),t._childrens)var n=r,o=t._bus.addListener(n,function(r){if(r.from!==e._owner)switch(Be.log("DataObject-Children-RCV: ",r),r.type){case"create":t._onChildCreate(r);break;case"delete":Be.log(r);break;default:t._changeChildren(r)}t._childrenListener=o})}},{key:"_releaseListeners",value:function(){var e=this;e._childrenListener&&(e._childrenListener.remove(),Object.keys(e._childrenObjects).forEach(function(t){e._childrenObjects[t]._releaseListeners()}))}},{key:"sync",value:function(){var e=this,t=this;return Be.info("[DataObject.sync] synchronising "),new Promise(function(r,n){var o={};e.metadata.backupRevision&&(o.backupRevision=e.metadata.backupRevision),t._syncher.read(t._metadata.url,o).then(function(e){Be.info("[DataObject.sync] value to sync: ",e),Object.assign(t.data,A(e.data)),t._version=e.version,t._metadata.lastModified=e.lastModified,e.childrenObjects?(t.resumeChildrens(e.childrenObjects),t._storeChildrens(),r(!0)):r(!0)}).catch(function(e){Be.info("[DataObject.sync] sync failed: ",e),r(!1)})})}},{key:"resumeChildrens",value:function(e){var t=this,r=this,n=this._owner.split("/")[3]+"#"+this._childId,o=e;Object.keys(o).forEach(function(e){var i=!1;"heartbeat"===e||(o[e].hasOwnProperty("value")&&o[e].value.resourceType&&!r._childrenObjects.hasOwnProperty(e)?(r._childrenObjects[e]=r._resumeHypertyResource(o[e]),i=!0):r._childrenObjects.hasOwnProperty(e)||(r._childrenObjects[e]=r._resumeChild(o[e]),Be.log("[DataObject.resumeChildrens] new DataObjectChild: ",r._childrenObjects[e]),i=!0)),i&&e>n&&(n=e,Be.log("[DataObjectReporter.resumeChildrens] - resuming: ",t._childrenObjects[e]))}),this._childId=Number(n.split("#")[1])}},{key:"_resumeChild",value:function(e){var t=e.value;t.parentObject=this,t.parent=this._url;var r=new fe(t);r.identity=e.identity;var n={type:"create",from:r.reporter,url:r.parent,value:r.data,childId:r.url,identity:r.identity,child:r};return r.resourceType&&(n.resource=r),this._onAddChildrenHandler&&this._onAddChildrenHandler(n),r}},{key:"_resumeHypertyResource",value:function(e){var t=e.value;t.parentObject=this,t.parent=this._url;var r=this._hypertyResourceFactory.createHypertyResource(!1,t.resourceType,t);r.identity=e.identity;var n={type:"create",from:r.reporter,url:r.parent,value:r.data,childId:r.url,identity:r.identity,child:r};return r.resourceType&&(n.resource=r),this._onAddChildrenHandler&&this._onAddChildrenHandler(n),r}},{key:"pause",value:function(){throw"Not implemented"}},{key:"resume",value:function(){throw"Not implemented"}},{key:"stop",value:function(){throw"Not implemented"}},{key:"addChild",value:function(e,t,r){var n,o=this;return new Promise(function(i){var s=o._url+"/children/",a=o._getChildInput(r);a.data=e,n=new fe(a),t&&(n.identity=t),n.share(),console.log("[DataObject.addChild] added ",n),n.onChange(function(e){o._onChange(e,{path:s,childId:a.url})}),o._childrenObjects[a.url]=n,i(n)})}},{key:"_deleteChildrens",value:function(){var e=this,t=[];return new Promise(function(r){if(e.childrens){var n;for(n in Be.log("[DataObject.deleteChildrens]",e.childrens),e.childrens){var o=e.childrens[n];Be.log("[DataObject._deleteChildrens] child",o),o.metadata.hasOwnProperty("resourceType")&&t.push(e.childrens[n].delete())}Be.log("[DataObject._deleteChildrens] promises ",t),t.length>0?Promise.all(t).then(function(){r("[DataObject._deleteChildrens] done")}):r("[DataObject._deleteChildrens] nothing to delete")}})}},{key:"_getChildInput",value:function(e){var t=Object.assign({},e);return this._childId++,t.url=this._owner.split("/")[3]+"#"+this._childId,t.parentObject=this,t.reporter=this._owner,t.created=(new Date).toISOString(),t.runtime=this._syncher._runtimeUrl,t.p2pHandler=this._syncher._p2pHandler,t.p2pRequester=this._syncher._p2pRequester,t.schema=this._schema,t.parent=this.url,t.mutual=this.metadata.mutual,t}},{key:"addHypertyResource",value:function(e,t,r,n){var o=this;return new Promise(function(i){var s,a=o._url+"/children/",c=o._getChildInput(n);o._hypertyResourceFactory.createHypertyResourceWithContent(!0,e,t,c).then(function(e){s=e,r&&(s.identity=r),s.share(),Be.log("[DataObject.addHypertyResource] added ",s),s.onChange(function(e){o._onChange(e,{path:a,childId:s.childId})}),o._childrenObjects[s.childId]=s,i(s)})})}},{key:"onAddChild",value:function(e){this._onAddChildrenHandler=e}},{key:"_onChildCreate",value:function(e){if("heartbeat"===e.body.resource)console.log("[DataObject._onChildCreate] new heartbeat received "+e.body.value),this._heartBeat.onNewHeartbeat(e.body.value);else{console.log("[DataObject._onChildCreate] new child receivedBy "+this._owner+" : ",e);var t={from:e.to,to:e.from,type:"response",id:e.id,body:{code:100}};this._bus.postMessage(t),e.body.value.resourceType?this._onHypertyResourceAdded(e):this._onChildAdded(e)}}},{key:"_onChildAdded",value:function(e){var t=A(e.body.value);t.parentObject=this;var r=new fe(t);r.identity=e.body.identity,this._childrenObjects[t.url]=r,e.to===this.metadata.url&&r.store(),this._hypertyEvt(e,r)}},{key:"_onHypertyResourceAdded",value:function(e){var t,r=e.body.value;r.parentObject=this,(t=this._hypertyResourceFactory.createHypertyResource(!1,r.resourceType,r)).identity=e.body.identity,this._childrenObjects[t.childId]=t,this._hypertyEvt(e,t),e.to===this.metadata.url&&t.store()}},{key:"_hypertyEvt",value:function(e,t){var r={type:e.type,from:e.from,url:e.to,value:t.data,childId:t.url,identity:e.body.identity,child:t};t.resourceType&&(r.resource=t),this._onAddChildrenHandler&&this._onAddChildrenHandler(r)}},{key:"_onChange",value:function(e,t){if(this._metadata.lastModified=(new Date).toISOString(),this._version++,"live"===this._status){var r={type:"update",from:this._url,to:this._url+"/changes",body:{version:this._version,source:this._owner,attribute:e.field,lastModified:this._metadata.lastModified}};Be.log("[DataObject - _onChange] - ",e,t,r),e.oType===ae.OBJECT?e.cType!==se.REMOVE&&(r.body.value=A(e.data)):(r.body.attributeType=e.oType,r.body.value=e.data,e.cType!==se.UPDATE&&(r.body.operation=e.cType)),t&&(r.to=t.path,r.body.resource=t.childId),this.data._mutual||(r.body.mutual=this._mutual),this._bus.postMessage(r)}}},{key:"_changeObject",value:function(e,t){if(this._version+1<=t.body.version){this._version=t.body.version;var r,n=t.body.attribute;r="object"===He(t.body.value)?A(t.body.value):t.body.value;var o=e.findBefore(n);if(t.body.lastModified?this._metadata.lastModified=t.body.lastModified:this._metadata.lastModified=(new Date).toISOString(),t.body.attributeType===ae.ARRAY)if(t.body.operation===se.ADD){var i=o.obj,s=o.last;Array.prototype.splice.apply(i,[s,0].concat(r))}else if(t.body.operation===se.REMOVE){var a=o.obj,c=o.last;a.splice(c,r)}else o.obj[o.last]=r;else t.body.hasOwnProperty("value")?o.obj[o.last]=r:delete o.obj[o.last]}else Be.log("UNSYNCHRONIZED VERSION: (data => "+this._version+", msg => "+t.body.version+")")}},{key:"_changeChildren",value:function(e){U(e.to).identity;var t=e.body.resource,r=this._childrenObjects[t];Be.log("Change children: ",this._owner,e,resource),r?this._changeObject(r._syncObj,e):Be.warn("No children found for: ",t)}},{key:"metadata",get:function(){return this._metadata}},{key:"url",get:function(){return this._url}},{key:"schema",get:function(){return this._schema}},{key:"status",get:function(){return this._status}},{key:"data",get:function(){return this._syncObj.data}},{key:"childrens",get:function(){return this._childrenObjects}}]),e}();function Ke(e){return(Ke="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ge(e,t){for(var r=0;r0&&(Ye.log("[Syncher.DataObjectReporter] InviteObservers ",n,r._metadata),n.forEach(function(e){var n=new Promise(function(n,o){var i={type:"create",from:r._syncher._owner,to:r._syncher._subURL,body:{resume:!1,resource:r._url,schema:r._schema,value:r._metadata,authorise:[e]}};t&&(i.body.p2p=t),r.data.mutual||(i.body.mutual=r.data.mutual),r._bus.postMessage(i,function(t){Ye.log("[Syncher.DataObjectReporter] Invitation reply ",t);var r={invited:e,code:t.body&&t.body.code?t.body.code:500,desc:t.body&&t.body.desc?t.body.desc:"Unknown"};r.code<300?n(r):o(r)})});r.invitations.push(n)}))}},{key:"delete",value:function(){var e=this;e._heartBeat&&e._heartBeat.stop(),e._deleteChildrens().then(function(t){Ye.log(t);var r={type:"delete",from:e._owner,to:e._syncher._subURL,body:{resource:e._url}};e._bus.postMessage(r,function(t){Ye.log("DataObjectReporter-DELETE: ",t),200===t.body.code&&(e._releaseListeners(),delete e._syncher._reporters[e._url],e._syncObj={})})})}},{key:"onSubscription",value:function(e){this._onSubscriptionHandler=e}},{key:"onResponse",value:function(e){this._onResponseHandler=e}},{key:"onRead",value:function(e){this._onReadHandler=e}},{key:"onExecute",value:function(e){this._onExecuteHandler=e}},{key:"_onForward",value:function(e){switch(Ye.log("DataObjectReporter-RCV: ",e),e.body.type){case"subscribe":this._onSubscribe(e);break;case"unsubscribe":this._onUnSubscribe(e)}}},{key:"_onSubscribe",value:function(e){var t=this,r=e.body.from,n=U(r),o=n.domain,i=!0;e.body.hasOwnProperty("mutual")&&!e.body.mutual&&(i=!1),console.log("[DataObjectReporter._onSubscribe]",e,o,n);var s={type:e.body.type,url:r,domain:o,identity:e.body.identity,nutual:i,accept:function(){var n={url:r,status:"live"};t._subscriptions[r]=n,t.metadata.subscriptions&&t.metadata.subscriptions.push(n.url);var o=A(t._metadata);o.data=A(t.data),o.version=t._version;var i={id:e.id,type:"response",from:e.to,to:e.from,body:{code:200,schema:t._schema,value:o}};return e.body.hasOwnProperty("mutual")&&!e.body.mutual&&(i.body.mutual=e.body.mutual,t.data.mutual=!1),t._heartBeat&&(i.body.value.childrenObjects={},i.body.value.childrenObjects.heartbeat=t._heartBeat.heartbeat),console.log("[DataObjectReporter._onSubscribe.accept] sending response: ",i),t._bus.postMessage(i),n},reject:function(r){t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:403,desc:r}})}};t._onSubscriptionHandler&&(Ye.log("SUBSCRIPTION-EVENT: ",s),t._onSubscriptionHandler(s))}},{key:"_onUnSubscribe",value:function(e){var t=e.body.from,r=U(t),n=r.domain;Ye.log("[DataObjectReporter._onUnSubscribe]",e,n,r),delete this._subscriptions[t],delete this.invitations[t];var o={type:e.body.type,url:t,domain:n,identity:e.body.identity};this._onSubscriptionHandler&&(Ye.log("UN-SUBSCRIPTION-EVENT: ",o),this._onSubscriptionHandler(o))}},{key:"_onResponse",value:function(e){var t={type:e.type,url:e.from,code:e.body.code};this._onResponseHandler&&(Ye.log("RESPONSE-EVENT: ",t),this._onResponseHandler(t))}},{key:"_onRead",value:function(e){var t=this,r=JSON.stringify(t.childrensJSON).length>t._childrenSizeThreshold,n={type:e.type,url:e.from,accept:function(){r?t._syncReplyForLargeData(e):t._syncReply(e)},reject:function(r){t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:401,desc:r}})}},o=[];t.metadata.subscriptions?o=t.metadata.subscriptions:t._subscriptions&&(o=Object.keys(t._subscriptions).map(function(e){return t._subscriptions[e].url})),-1!=o.indexOf(e.from)?r?t._syncReplyForLargeData(e):t._syncReply(e):t._onReadHandler&&(Ye.log("READ-EVENT: ",n),t._onReadHandler(n))}},{key:"_syncReply",value:function(e){var t=A(this.metadata);t.data=A(this.data),t.childrenObjects=A(this.childrensJSON),t.version=this._version;var r={id:e.id,type:"response",from:e.to,to:e.from,body:{code:200,value:t}};this._bus.postMessage(r)}},{key:"_syncReplyForLargeData",value:function(e){var t=this,r=A(t.metadata);r.data=A(t.data),r.version=t._version,delete r.childrenObjects;var n=[],o={};for(child in t._childrenObjects)o[child]={},JSON.stringify(o).length>t._childrenSizeThreshold&&n.push(o),o[child]={},o[child].value=t._childrenObjects[child].metadata,o[child].identity=t._childrenObjects[child].identity;n.push(o),r.responses=n.length+1;var i={id:e.id,type:"response",from:e.to,to:e.from,body:{code:100,value:r}};t._bus.postMessage(i),n.forEach(function(e){var n=A(i);n.body.value=e,n.body.value.responses=r.responses,setTimeout(function(){t._bus.postMessage(n)},50)})}},{key:"_onExecute",value:function(e){var t=this;if(!e.body.method)throw e;var r={id:e.id,type:"response",from:e.to,to:e.from,body:{code:200}},n={type:e.type,url:e.from,method:e.body.method,params:e.body.params,accept:function(){t._bus.postMessage(r)},reject:function(r){t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:401,desc:r}})}};t._onExecuteHandler&&(Ye.log("[DataObjectReporter] EXECUTE-EVENT: ",n),t._onExecuteHandler(n))}},{key:"subscriptions",get:function(){return this._subscriptions}},{key:"childrensJSON",get:function(){var e,t={};for(e in this._childrenObjects)t[e]={},t[e].value=this._childrenObjects[e].metadata,t[e].identity=this._childrenObjects[e].identity;return t}}]),t}();function $e(e){return($e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Xe(e,t){for(var r=0;r3&&void 0!==arguments[3]&&arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"no name",s=arguments.length>6?arguments[6]:void 0,a=arguments.length>7?arguments[7]:void 0;if(!e)throw Error("[Syncher - Create] - You need specify the data object schema");if(!t)throw Error("[Syncher - Create] -The observers should be defined");a=a||{};var c=Object.assign({},a);return c.p2p=o,c.store=n,c.schema=e,c.authorise=t,c.p2pHandler=this._p2pHandler,c.p2pRequester=this._p2pRequester,c.data=r?A(r):{},c.name=0===i.length?"no name":i,c.reporter=a.hasOwnProperty("reporter")&&"boolean"!=typeof a.reporter?a.reporter:this._owner,c.resume=!1,a?(c.mutual=!!a.hasOwnProperty("mutual")&&a.mutual,c.name=a.hasOwnProperty("name")?a.name:c.name):c.mutual=!1,a.hasOwnProperty("reuseURL")&&(c.resource=a.reuseURL),s&&(c.identity=s),this._create(c)}},{key:"resumeReporters",value:function(e){return ct.log("[syncher - create] - resume Reporter - criteria: ",e),Object.assign(e,{resume:!0}),this._resumeCreate(e)}},{key:"subscribe",value:function(e){return this._subscribe(e)}},{key:"resumeObservers",value:function(e){var t=e||{};return Object.assign(t,{resume:!0}),this._resumeSubscribe(t)}},{key:"read",value:function(e,t){var r=this;return console.log("[Syncher.read] ",e),new Promise(function(t,n){r._readReporter(e).then(function(e){t(e)})})}},{key:"_readCallBack",value:function(e,t,r){console.log("[Syncher.read] reply: ",e);var n={},o={},i=0;if(e.body.code<300)if(e.body.value.hasOwnProperty("responses"))if(0===i)o=e.body.value,++i;else{var s;for(s in delete e.body.value.responses,e.body.value)n.hasOwnProperty(s)||(n[s]={}),Object.assign(n[s],e.body.value[s]);++i===o.responses&&(o.childrenObjects=n,delete o.responses,this._bus.removeResponseListener(e.from,e.id),t(o))}else this._bus.removeResponseListener(e.from,e.id),t(e.body.value);else r(e.body.desc)}},{key:"_readReporter",value:function(e){var t=this,r={type:"read",from:t._owner,to:e};return new Promise(function(e,n){t._bus.postMessage(r,function(r){return t._readCallBack(r,e,n)},!1)})}},{key:"onNotification",value:function(e){this._onNotificationHandler=e}},{key:"onClose",value:function(e){this._onClose=e}},{key:"_create",value:function(e){var t=this;return new Promise(function(r,n){var o=Object.assign({},e),i=e.resume;o.created=(new Date).toISOString(),o.runtime=t._runtimeUrl;var s=A(o);delete s.p2p,delete s.store,delete s.observers,delete s.identity;var a={type:"create",from:t._owner,to:t._subURL,body:{resume:i,value:s}};a.body.schema=o.schema,o.p2p&&(a.body.p2p=o.p2p),o.store&&(a.body.store=o.store),o.identity&&(a.body.identity=o.identity),console.log("[syncher._create]: ",o,a),t._bus.postMessage(a,function(i){if(ct.log("[syncher - create] - create-response: ",i),200===i.body.code){o.url=i.body.resource,o.status="live",o.syncher=t,o.childrens=i.body.childrenResources;var s=t._reporters[o.url];s||(s=new ze(o),t._reporters[o.url]=s),s.inviteObservers(e.authorise,e.p2p),r(s)}else n(i.body.desc)})})}},{key:"_resumeCreate",value:function(e){var t=this,r=this;return new Promise(function(n,o){var i=e.resume,s={type:"create",from:r._owner,to:r._subURL,body:{resume:i}};ct.log("[syncher - create]: ",e,s),e&&(s.body.value=e,e.hasOwnProperty("reporter")?s.body.value.reporter=e.reporter:s.body.value.reporter=r._owner),e.p2p&&(s.body.p2p=e.p2p),e.store&&(s.body.store=e.store),e.observers&&(s.body.authorise=e.observers),e.identity&&(s.body.identity=e.identity),ct.log("[syncher._resumeCreate] - resume message: ",s),r._bus.postMessage(s,function(e){if(ct.log("[syncher._resumeCreate] - create-resumed-response: ",e),200===e.body.code){var i=e.body.value;for(var s in i){var a=i[s];a.data=A(a.data)||{},a.childrenObjects&&(a.childrenObjects=A(a.childrenObjects)),a.mutual=!1,a.resume=!0,a.status="live",a.syncher=r,ct.log("[syncher._resumeCreate] - create-resumed-dataObjectReporter",a);var c=new ze(a);a.childrenObjects&&c.resumeChildrens(a.childrenObjects),r._reporters[a.url]=c}n(r._reporters),t._onReportersResume&&t._onReportersResume(t._reporters)}else 404===e.body.code?n({}):o(e.body.desc)})})}},{key:"_subscribe",value:function(e){var t=this;return new Promise(function(r,n){var o={type:"subscribe",from:t._owner,to:t._subURL,body:e};ct.log("[syncher_subscribe] - subscribe message: ",e,o),t._bus.postMessage(o,function(o){ct.log("[syncher] - subscribe-response: ",o);var i=o.body.resource,s=t._provisionals[i];if(delete t._provisionals[i],s&&s._releaseListeners(),o.body.code<200)ct.log("[syncher] - new DataProvisional: ",o.body.childrenResources,i),s=new st(t._owner,i,t._bus,o.body.childrenResources),t._provisionals[i]=s;else if(200===o.body.code){ct.log("[syncher] - new Data Object Observer: ",o,t._provisionals);var a=o.body.value;a.syncher=t,a.p2p=e.p2p,a.store=e.store,a.identity=e.identity,a.resume=!1,a.mutual=e.mutual;var c=t._observers[i];c?c.sync():(c=new nt(a),t._observers[i]=c),ct.log("[syncher] - new Data Object Observer already exist: ",c),r(c),s&&s.apply(c)}else n(o.body.desc)})})}},{key:"_resumeSubscribe",value:function(e){var t=this,r=this;return new Promise(function(n,o){var i={type:"subscribe",from:r._owner,to:r._subURL,body:{}};e&&(e.hasOwnProperty("p2p")&&(i.body.p2p=e.p2p),e.hasOwnProperty("store")&&(i.body.store=e.store),e.hasOwnProperty("schema")&&(i.body.schema=e.schema),e.hasOwnProperty("identity")&&(i.body.identity=e.identity),e.hasOwnProperty("resource")&&(i.body.resource=e.resource)),i.body.resume=e.resume;var s=e.mutual;e.hasOwnProperty("mutual")&&(i.body.mutual=s),console.log("[syncher] - subscribe message: ",e,i),r._bus.postMessage(i,function(e){console.log("[syncher] - subscribe-resumed-response: ",e);var i=e.body.resource,s=r._provisionals[i];if(delete r._provisionals[i],s&&s._releaseListeners(),e.body.code<200)ct.log("[syncher] - resume new DataProvisional: ",e,i),s=new st(r._owner,i,r._bus,e.body.childrenResources),r._provisionals[i]=s;else if(200===e.body.code){var a=e.body.value;for(var c in a){var u=a[c];console.log("[syncher] - Resume Object Observer: ",e,u,r._provisionals),u.childrenObjects&&(u.childrenObjects=A(u.childrenObjects)),u.data=A(u.data)||{},u.resume=!0,u.syncher=r,console.log("[syncher._resumeSubscribe] - create new dataObject: ",u);var l=new nt(u);u.childrenObjects&&l.resumeChildrens(u.childrenObjects),ct.log("[syncher._resumeSubscribe] - new dataObject",l),r._observers[l.url]=l,r._provisionals[l.url]&&r._provisionals[l.url].apply(l)}n(r._observers),t._onObserversResume&&t._onObserversResume(r._observers)}else 404===e.body.code?n({}):o(e.body.desc)})})}},{key:"_onForward",value:function(e){this._reporters[e.body.to]._onForward(e)}},{key:"_onRemoteCreate",value:function(e){var t=this,r=e.from.slice(0,-13),n=U(r).domain,o={type:e.type,from:e.body.source,url:r,domain:n,schema:e.body.schema,value:e.body.value,identity:e.body.identity,ack:function(r){var n=200;r&&(n=r),t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:n}})}};t._onNotificationHandler&&(ct.info("[Syncher] NOTIFICATION-EVENT: ",o),t._onNotificationHandler(o))}},{key:"_onRemoteDelete",value:function(e){var t=this,r=e.body.resource,n=t._observers[r],o={from:t.owner,to:t._subURL,id:e.id,type:"unsubscribe",body:{resource:e.body.resource}};if(t._bus.postMessage(o),delete t._observers[r],n){var i={type:e.type,url:r,identity:e.body.identity,ack:function(r){var o=200;r&&(o=r),200===o&&n.delete(),t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:o,source:t._owner}})}};t._onNotificationHandler&&(ct.log("NOTIFICATION-EVENT: ",i),t._onNotificationHandler(i))}else t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:404,source:t._owner}})}},{key:"_onExecute",value:function(e){var t=this,r={id:e.id,type:"response",from:e.to,to:e.from,body:{code:200}};if((e.from===t._runtimeUrl+"/registry/"||e.from===t._runtimeUrl+"/registry")&&e.body&&e.body.method&&"close"===e.body.method&&t._onClose){var n={type:"close",ack:function(e){e&&(r.body.code=e),t._bus.postMessage(r)}};ct.info("[Syncher] Close-EVENT: ",n),t._onClose(n)}else t._bus.postMessage(r)}},{key:"onReportersResume",value:function(e){this._onReportersResume=e}},{key:"onObserversResume",value:function(e){this._onObserversResume=e}},{key:"owner",get:function(){return this._owner}},{key:"reporters",get:function(){return this._reporters}},{key:"observers",get:function(){return this._observers}}]),e}();function lt(e,t){for(var r=0;r299)return Pt.warn("[Discovery.discoverDataObject] Error Reply for "+e+" Reason: ",r.body.description),t([]);var n=r.body.value;t(n||[])})})}},{key:"discoverHyperty",value:function(e,t,r,n){var o,i=this,s=function(e){if("user://"===e.substring(0,7)){var t=U(e);if(t.domain&&t.identity)return e;throw"userURL with wrong format"}return function(e){var t=e.indexOf("@");return"user://"+e.substring(t+1,e.length)+"/"+e.substring(0,t)}(e)}(e);return o=n||i.domain,new Promise(function(a,c){if(Pt.log("[Discovery.discoverHyperty] ACTIVE DOMAIN -> ",o,"user->",e,"schema->",t,"resources->",r,"domain->",n),e.includes(":")&&!e.includes("user://"))return Pt.log("[Discovery.discoverHyperty] "+e+" is legacy domain"),a({userID:e,hypertyID:e,schema:t,resources:r});var u={type:"read",from:i.discoveryURL,to:"domain://registry."+o,body:{resource:s,criteria:{resources:r,dataSchemes:t}}};Pt.info("[Discovery] msg to send->",u),i.messageBus.postMessage(u,function(e){Pt.info("[Discovery] ON discoverHyperty->",e);var t=e.body.value;t?a(t):c("No Hyperty was found")})})}},{key:"discoverHypertyPerUser",value:function(e,t){var r,n=this;return new Promise(function(o,i){if(e.includes(":")&&!e.includes("user://"))return Pt.log("[Discovery.discoverHyperty] "+e+"is legacy domain"),o({id:e,hypertyURL:e,descriptor:"unknown"});r=t||n.domain;var s="user://"+e.substring(e.indexOf("@")+1,e.length)+"/"+e.substring(0,e.indexOf("@")),a={type:"read",from:n.discoveryURL,to:"domain://registry."+r,body:{resource:s}};Pt.info("[Discovery] Message: ",a,r,s),n.messageBus.postMessage(a,function(t){var r,n,s;Pt.info("[Discovery] message reply",t);var a=t.body.value;for(r in a)if(void 0!==a[r].lastModified)if(void 0===n)n=new Date(a[r].lastModified),s=r;else{var c=new Date(a[r].lastModified);n.getTime() hypertyDiscovery messageBundle: ",l),o(l)})})}},{key:"discoverHypertiesPerUser",value:function(e,t){var r,n=this;return Pt.log("on Function->",e),new Promise(function(o,i){if(e.includes(":")&&!e.includes("user://")){Pt.log("[Discovery.discoverHyperty] is legacy domain");var s={userID:e,hypertyID:e,schema:schema,resources:resources};return o(s)}r=t||n.domain;var a="user://"+e.substring(e.indexOf("@")+1,e.length)+"/"+e.substring(0,e.indexOf("@")),c={type:"read",from:n.discoveryURL,to:"domain://registry."+r,body:{resource:a}};Pt.log("[Discovery] Message discoverHypertiesPerUser: ",c,r,a),n.messageBus.postMessage(c,function(e){Pt.info("[Discovery] discoverHypertiesPerUser reply",e);var t=e.body.value;if(!t)return i("User Hyperty not found");o(t)})})}},{key:"resumeDiscoveries",value:function(){var e=this;return Pt.log("[Discovery] resumeDiscoveries"),new Promise(function(t,r){var n={type:"read",from:e.discoveryURL,to:e.runtimeURL+"/subscriptions",body:{resource:e.discoveryURL}};e.messageBus.postMessage(n,function(r){Pt.log("[Discovery.resumeDiscoveries] reply: ",r);var n=[];200===r.body.code?(r.body.value.forEach(function(t){var r=t.split("/registration")[0];Pt.log("[Discovery.resumeDiscoveries] adding listener to: ",r),r.includes("hyperty://")?n.push(e.discoverHypertyPerURLDO(r)):n.push(e.discoverDataObjectPerURLDO(r))}),Promise.all(n).then(function(e){t(e)})):t([])})})}}]),e}();function jt(e,t){for(var r=0;r3&&void 0!==arguments[3]&&arguments[3]}},{key:"users",value:function(e,t,r,n){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(!e)throw new Error("You need to provide a list of users");if(!t)throw new Error("You need to provide a list of domains");if(!n)throw new Error("You need to provide a list of resources");if(!r)throw new Error("You need to provide a list of schemes");var i=this;return new Promise(function(s,a){if(console.info("[Search] Users: ",e,e.length),console.info("[Search] Domains: ",t,t.length),0===e.length)console.info("Don't have users to discovery"),s(e);else{var c=[];e.forEach(function(e,s){var a=t[s];console.info("[Search] Search user "+e+" for provided domain:",a),o?c.push(i.discovery.discoverHypertiesPerUserProfileData(e,r,n)):c.push(i.discovery.discoverHyperties(e,r,n,a))}),console.info("Requests promises: ",c),Promise.all(c.map(function(e){return e.then(function(e){return e},function(e){return e})})).then(function(e){console.info("[Search] Hyperties from new Discovery",e);var t=e.map(function(e){if(e.hasOwnProperty("hypertyID"))return e;var t=Object.keys(e).reduceRight(function(t,r){var n=new Date(e[r].lastModified);return new Date(e[t].lastModified).getTime()",e),c._domain=i.divideURL(n.runtimeURL).domain,c._objectDescURL="hyperty-catalogue://catalogue."+c._domain+"/.well-known/dataschema/Context",c._users2observe=[],c._observers={},a._syncher=s||i.createSyncher(e,r,n);var u=i.createDiscovery(e,n.runtimeURL,r);return c._discovery=u,c._discoveries={},window.discovery=c._discovery,a}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&xt(e,t)}(t,Et),function(e,t,r){t&&Ct(e.prototype,t)}(t,[{key:"start",value:function(e,t){var r=this;return console.log("[ContextObserver.start] "),new Promise(function(n,o){r._syncher.resumeObservers({store:!0}).then(function(o){var i=Object.keys(o);i.length>0?(console.log("[ContextObserver.start] resuming: ",o),r._observers=o,n(o),i.forEach(function(r){var n=o[r];e&&(context.data.values=e),n.sync(),t&&n.onDisconnected(t)})):n(!1)}).catch(function(e){console.info("[ContextObserver] Resume Observer failed | ",e),n(!1)})}).catch(function(e){reject("[ContextObserver] Start failed | ",e)})}},{key:"resumeDiscoveries",value:function(){var e=this;return new Promise(function(t,r){e._discovery.resumeDiscoveries().then(function(r){console.log("[ContextObserver._resumeDiscoveries] found: ",r),r.forEach(function(r){r.data.resources&&r.data.resources[0]===e._contextResourceTypes[0]&&(console.log("[ContextObserver._resumeDiscoveries] resuming: ",r),"live"===r.data.status?(t([r.data]),r.unsubscribeLive(e._url)):r.onLive(e._url,function(){console.log("[ContextObserver._resumeDiscoveries] disconnected Hyperty is back to live",r),t([r.data]),r.unsubscribeLive(e._url)}))})})}).catch(function(e){reject("[ContextObserver] resumeDiscoveries failed | ",e)})}},{key:"onResumeObserver",value:function(e){this._onResumeObserver=e}},{key:"discoverUsers",value:function(e,t){var r=this,n=e+"@"+t;return r._discoverUsersPromises[n]||(r._discoverUsersPromises[n]=new Promise(function(n,o){r._discovery.discoverHypertiesDO(e,["context"],r._contextResourceTypes,t).then(function(e){console.log("[ContextObserver.discoverUsers] discovery result->",e);var t=[],o=[];e.forEach(function(e){r._discoveries[e.data.hypertyID]=e,"live"===e.data.status?t.push(e.data):o.push(e)}),t.length>0?(console.log("[ContextObserver.discoverUsers] returning discovered hyperties data->",t),n(t)):o.length>0&&(console.log("[ContextObserver.discoverUsers] disconnected Hyperties ",o),o[0].onLive(r._url,function(){console.log("[ContextObserver.discoverUsers] disconnected Hyperty is back to live",o[0]),t.push(o[0].data),n(t),o[0].unsubscribeLive(r._url)}))})})),r._discoverUsersPromises[n]}},{key:"observe",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=this;return r._observePromises[e.hypertyID]||(r._observePromises[e.hypertyID]=new Promise(function(n,o){r._users2observe.forEach(function(t){if(t._reporter===e.hypertyID)return n(t)}),r._discovery.discoverDataObjectsPerReporter(e.hypertyID,["context"],r._contextResourceTypes,r._domain).then(function(i){console.log("[ContextObserver.discoverAvailability] discovered context objects ",i);var s,a=0;i.forEach(function(e){e.hasOwnProperty("lastModified")&&e.hasOwnProperty("url")&&Date.parse(e.lastModified)>a&&(a=e.lastModified,s=e.url)}),0!=a&&s?n(r._subscribeContext(e,s,t)):o("[ContextObserver.observe] discovered DataObjecs are invalid",i)})})),r._observePromises[e.hypertyID]}},{key:"_subscribeContext",value:function(e,t){var r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=this;return new Promise(function(e,o){n._users2observe.forEach(function(r){if(r.url===t)return e(r)});var i={schema:n._objectDescURL,resource:t,store:null,p2p:null,mutual:null,domain_subscription:r};n._syncher.subscribe(i).then(function(t){console.log("[ContextObserver._subscribeContext] observer object",t),n._users2observe.push(t),t.onDisconnected(function(){console.log("[ContextObserver.onDisconnected]: ",t),t.data.values[0].value="unavailable",t.sync()}),e(t)})})}},{key:"_discoverAndSubscribeLegacyUsers",value:function(e){var t=this;return new Promise(function(r,n){t._discovery.discoverDataObjectsPerName(e).then(function(e){console.log("[ContextObserver._discoverAndSubscribeLegacyUsers] All DataObjects Result",e),e.forEach(function(e){"live"===e.status&&(console.log("Live obj",e),e.hypertyID||(e.hypertyID=e.reporter),t._subscribeContext(e.schema,e.url).then(function(e){return console.log("[ContextObserver._discoverAndSubscribeLegacyUsers] _subscribeContext",e),r(e)}))})}).catch(function(e){console.log("error ",e)})})}},{key:"unobserve",value:function(e){var t=this;t._users2observe.forEach(function(r,n){r.url===e&&(r.unsubscribe(),t._users2observe.splice(n,1))})}}]),t}();function Dt(e){return(Dt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ht(e,t){for(var r=0;r0?(console.log("[ContextReporter.start] resuming ",e[n[0]]),t.contexts=e,n.forEach(function(e){t._onSubscription(t.contexts[e])}),r(t.contexts)):(console.log("[ContextReporter.start] nothing to resume ",e),r(!1))}).catch(function(e){console.error("[ContextReporter] Resume failed | ",e)})}).catch(function(e){reject("[ContextReporter] Start failed | ",e)})}},{key:"processNotification",value:function(e){console.log("[ContextReporter.processNotification: ",e),e.ack()}},{key:"create",value:function(e,t,r){var n,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"myContext",i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,a=this;return new Promise(function(c,u){n=i||s?i&&!s?{resources:r,expires:30,reporter:i}:!i&&s?{resources:r,expires:30,reuseURL:s}:{resources:r,expires:30,reuseURL:s,reporter:i}:{resources:r,expires:30},console.info("[ContextReporter.create] lets create a new User availability Context Object ",n),a.syncher.create(a.contextDescURL,[],t,!0,!1,o,null,n).then(function(t){a.contexts[e]=t,a._onSubscription(t),c(t)}).catch(function(e){u(e)})})}},{key:"_onSubscription",value:function(e){e.onSubscription(function(e){console.info("[ContextReporter._onSubscription] accepting: ",e),e.accept()})}},{key:"setContext",value:function(e,t){console.log("THIS [ContextReporter.setContext] before change :",this.contexts[e]),console.log("[ContextReporter.setContext] before change :",this.contexts[e].data),this.contexts[e].data.values=t,console.debug("[ContextReporter.setContext] after change :",this.contexts[e].data),this.trigger(e+"-context-update",t)}}]),t}(),Gt=function e(t,r,n,o,i,s){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),t&&(this.preferred_username=t),n&&(this.picture=n),o&&(this.name=o),i&&(this.locale=i),r&&(this.userURL=r),s&&Object.assign(this,s)},qt=function e(t,r,n,o,i,s,a,c){if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),!s)throw new Error("IDP should be a parameter");if(!t)throw new Error("username should be a parameter");this.idp=s,a&&(this.assertion=a),this.userProfile=new Gt(t,r,n,o,i,c)},Vt={startingTime:"",status:"",participants:{}},Wt={parent:"communication",listener:"resources",type:"HypertyResource"};function Jt(e,t){for(var r=0;r0&&r.inviteDisconnectedHyperties(a,t),Object.keys(i).length>0?(t.inviteObservers(s),t.invitations.length>0&&r.processInvitations(i,t),Promise.all(c).then(function(){n()})):n()})}).catch(function(e){reject("[GroupChatManager.InvitationsHandler.resumeDiscoveries] failed | ",e)})}},{key:"cleanInvitations",value:function(e){var t=this,r=t._pending[e];return console.log("[GroupChatManager.InvitationsHandler.cleanInvitations] ",r),r?new Promise(function(e,n){var o=Object.keys(r),i=[];o.forEach(function(e){i.push(r[e].unsubscribeLive(t._hypertyURL))}),Promise.all(o).then(function(){e()})}):Promise.resolve()}},{key:"invitationResponse",set:function(e){this._invitationsResponse=e}}]),e}();function zt(e,t){for(var r=0;r",e);var r=[];e.forEach(function(e){e.forEach(function(e){"live"===e.data.status?(r.push(e.data.hypertyID),a[e.data.hypertyID]=e):s.length<5&&s.push(e)})}),console.info("[ChatManager.ChatController]------------------------ Syncher Create ---------------------- \n"),console.info("[ChatManager.ChatController]Selected Hyperties: !!! ",r),console.info("Have ".concat(r.length," users;"));var n="reporter"===t.controllerMode?t.dataObjectReporter:t.dataObjectObserver;s.length>0&&t._invitationsHandler.inviteDisconnectedHyperties(s,n),n.inviteObservers(r),n.invitations.length>0&&t._invitationsHandler.processInvitations(a,n)}).then(function(){console.info("[ChatManager.ChatController]Are invited with success "+e.length+" users;"),n(!0)}).catch(function(e){console.error("An error occurred when trying to invite users;\n",e),o(e)})})}},{key:"addUserReq",value:function(e){var t=this,r=function(e){return console.log("Element:",e.length),0!==e.length};return new Promise(function(n,o){return 0===e.filter(r).length?o("[ChatManager.ChatController.addUserReq] Don't have users to add"):"observer"===!t.controllerMode?o("[ChatManager.ChatController.addUserReq] only allowed to Chat Observer"):void 0})}},{key:"onInvitationResponse",value:function(e){this._onInvitationResponse=e,this._invitationsHandler.invitationResponse=e}},{key:"removeUser",value:function(e){console.log("[ChatManager.ChatController]Not yet implemented: ",e)}},{key:"close",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=this;return new Promise(function(r,n){if("reporter"===t.controllerMode)t._invitationsHandler.cleanInvitations(t.dataObjectReporter).then(function(){if(e)try{delete t._manager._reportersControllers[t.dataObjectReporter.url],t.dataObjectReporter.delete(),r(!0),t._onClose&&t._onClose({code:200,desc:"deleted",url:t.dataObjectReporter.url})}catch(e){console.error(e),n(!1)}else t._manager.communicationObject.status="closed",r(!0)});else if(e)try{delete t._manager._observersControllers[t.dataObjectObserver.url],t.dataObjectObserver.unsubscribe(),r(!0)}catch(e){console.error(e),n(!1)}else r(!0)})}},{key:"invitationsHandler",get:function(){return this._invitationsHandler}},{key:"url",get:function(){return"reporter"===this.controllerMode?this.dataObjectReporter.url:this.dataObjectObserver.url}},{key:"dataObjectReporter",set:function(e){if(!e)throw new Error("[ChatController] The data object reporter is necessary parameter ");var t=this;t.controllerMode="reporter",e.onSubscription(function(e){switch(e.type){case"subscribe":t._onSubscribe(e);break;case"unsubscribe":t._onUnsubscribe(e)}}),t._setOnAddChildListener(e),e.onRead(function(e){e.accept()}),e.onExecute(function(e){switch(e.method){case"addUser":t.addUser(e.params[0]).then(function(){e.accept()}).catch(function(t){console.error("Reason:",t),e.reject(t)});break;case"removeUser":t.removeUser(e.params).then(function(){e.accept()}).catch(function(t){console.error("Reason:",t),e.reject(t)});break;default:e.reject("[ChatController.onExecute] Chat method execution not accepted by Reporter")}}),t._dataObjectReporter=e},get:function(){return this._dataObjectReporter}},{key:"messages",get:function(){return"reporter"===this.controllerMode?this._dataObjectReporter._childrenObjects:this._dataObjectObserver._childrenObjects}},{key:"dataObjectObserver",set:function(e){var t=this;t.controllerMode="observer",t._dataObjectObserver=e,e.onChange("*",function(e){if(console.info("[ChatManager.ChatController]Observer - onChange",e),e.field.includes("participants"))switch(e.cType){case"add":t._onUserAdded&&t._onUserAdded(e);break;case"remove":t._onUserRemoved&&t._onUserRemoved(e)}t._onChange&&t._onChange(e)}),t._setOnAddChildListener(e)},get:function(){return this._dataObjectObserver}},{key:"dataObject",get:function(){return"reporter"===this.controllerMode?this.dataObjectReporter:this.dataObjectObserver}},{key:"closeEvent",set:function(e){this._closeEvent=e,this._onClose&&this._onClose(e)},get:function(){return this._closeEvent}}]),e}();function Xt(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var Qt=function e(t,r,n){var o;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e);var i=A(n);return n.hasOwnProperty("userProfile")||(i.userProfile=n),Xt(o={hypertyURL:t,domain:r},"domain",r),Xt(o,"identity",i),o};function Zt(e,t){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:{},n=this,o=n._syncher;return new Promise(function(i,s){var a;n.communicationObject=Vt,n.communicationObject.cseq=1,n.communicationObject.startingTime=(new Date).toJSON(),n.communicationObject.status="open",n.myIdentity().then(function(c){a=c,console.log("[ChatManager.create ] My Identity",c);var u=new Qt(n._myUrl,n._domain,c);n.communicationObject.participants[c.guid]=u,console.log("[ChatManager.create ] participants: ",n.communicationObject.participants),console.log("[ChatManager.create ] communicationObject",n.communicationObject),console.info("[ChatManager.create] searching "+t);var l=[],f=[],d={};t.forEach(function(e){var t=n.discovery.discoverHypertiesDO(e.user,["comm"],["chat"],e.domain);l.push(t)}),Promise.all(l).then(function(t){console.log("[ChatManager.create] Users Discovery Results->",t);var i=[];t.forEach(function(e){e.forEach(function(e){"live"===e.data.status?(i.push(e.data.hypertyID),d[e.data.hypertyID]=e):f.length<5&&f.push(e)})}),console.info("[ChatManager] ---------------------- Syncher Create ---------------------- \n"),console.info("[ChatManager] Selected Hyperties: !!! ",i),console.info("Have ".concat(i.length," users;"));var s=!r.mutual||r.mutual,a=Object.assign({resources:["chat"],mutual:s},r);return delete a.name,n.offline&&(a.offline=n.offline),console.info("[ChatManager] input data:",a),o.create(n._objectDescURL,i,n.communicationObject,!0,!1,e,{},a)}).then(function(e){console.info("[ChatManager] 3. Return Create Data Object Reporter",e);var t=new $t(o,n.discovery,n._domain,n.search,a,n);t.dataObjectReporter=e,n._reportersControllers[e.url]=t,console.log("[ChatManager] chatController invitationsHandler: ",t.invitationsHandler),e.invitations.length>0&&t.invitationsHandler.processInvitations(d,e),f.length>0&&t.invitationsHandler.inviteDisconnectedHyperties(f,e),i(t)}).catch(function(e){s(e)})}).catch(function(e){return console.log("[ChatManager.create] MyIdentity Error:",e),s(e)})})}},{key:"onInvitation",value:function(e){this._onInvitation=e}},{key:"join",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0,n=this;return new Promise(function(o,i){var s,a=n._syncher;console.info("[ChatManager] ------------------------ Syncher subscribe ---------------------- \n"),console.info("invitationURL",e),n.myIdentity(r).then(function(r){s=r;var o={schema:n._objectDescURL,resource:e,store:!0,p2p:!1,mutual:t,domain_subscription:!0,identity:r};return n.offline&&(o.offline=n.offline),a.subscribe(o)}).then(function(e){console.info("Data Object Observer: ",e);var t=new $t(a,n.discovery,n._domain,n.search,s,n);o(t),t.dataObjectObserver=e,n._observersControllers[e.url]=t}).catch(function(e){i(e)})})}},{key:"offline",set:function(e){this._offline=e},get:function(){return!!this._offline&&this._offline}}]),e}();function tr(e,t){for(var r=0;r0&&void 0!==arguments[0])||arguments[0],t=this;return new Promise(function(r,n){if("reporter"===t.controllerMode)if(e)try{delete t._manager._reportersControllers[t.dataObjectReporter.url],t.dataObjectReporter.delete(),r(!0),t._onClose&&t._onClose({code:200,desc:"deleted",url:t.dataObjectReporter.url})}catch(e){console.error(e),n(!1)}else t._manager.communicationObject.status="closed",r(!0);else if(e)try{delete t._manager._observersControllers[t.dataObjectObserver.url],t.dataObjectObserver.unsubscribe(),r(!0)}catch(e){console.error(e),n(!1)}else r(!0)})}},{key:"url",get:function(){return"reporter"===this.controllerMode?this.dataObjectReporter.url:this.dataObjectObserver.url}},{key:"dataObjectReporter",set:function(e){if(!e)throw new Error("[ChatController] The data object reporter is necessary parameter ");var t=this;t.controllerMode="reporter",e.onSubscription(function(e){switch(e.type){case"subscribe":t._onSubscribe(e);break;case"unsubscribe":t._onUnsubscribe(e)}}),t._setOnAddChildListener(e),e.onRead(function(e){e.accept()}),e.onExecute(function(e){switch(e.method){case"addUser":t.addUser(e.params[0]).then(function(){e.accept()}).catch(function(t){console.error("Reason:",t),e.reject(t)});break;case"removeUser":t.removeUser(e.params).then(function(){e.accept()}).catch(function(t){console.error("Reason:",t),e.reject(t)});break;default:e.reject("[ChatController.onExecute] Chat method execution not accepted by Reporter")}}),t._dataObjectReporter=e},get:function(){return this._dataObjectReporter}},{key:"messages",get:function(){return"reporter"===this.controllerMode?this._dataObjectReporter._childrenObjects:this._dataObjectObserver._childrenObjects}},{key:"dataObjectObserver",set:function(e){var t=this;t.controllerMode="observer",t._dataObjectObserver=e,e.onChange("*",function(e){if(console.info("[ChatManager.ChatController]Observer - onChange",e),e.field.includes("participants"))switch(e.cType){case"add":t._onUserAdded&&t._onUserAdded(e);break;case"remove":t._onUserRemoved&&t._onUserRemoved(e)}t._onChange&&t._onChange(e)}),t._setOnAddChildListener(e)},get:function(){return this._dataObjectObserver}},{key:"dataObject",get:function(){return"reporter"===this.controllerMode?this.dataObjectReporter:this.dataObjectObserver}},{key:"closeEvent",set:function(e){this._closeEvent=e,this._onClose&&this._onClose(e)},get:function(){return this._closeEvent}}]),e}();function nr(e,t){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:{},n=this,o=n._syncher;return new Promise(function(i,s){var a;n.communicationObject=Vt,n.communicationObject.cseq=1,n.communicationObject.startingTime=(new Date).toJSON(),n.communicationObject.status="open",n.myIdentity().then(function(i){a=i,console.log("[SimpleChatManager.create ] My Identity",i);var s=new Qt(n._myUrl,n._domain,i);n.communicationObject.participants[i.guid]=s,console.log("[SimpleChatManager.create ] participants: ",n.communicationObject.participants),console.log("[SimpleChatManager.create ] communicationObject",n.communicationObject),console.info("[SimpleChatManager] ---------------------- Syncher Create ---------------------- \n"),console.info("[SimpleChatManager] Selected Hyperties: !!! ",t);var c=!r.mutual||r.mutual,u=Object.assign({resources:["chat"],mutual:c},r);return delete u.name,n.offline&&(u.offline=n.offline),n.backup&&(u.backup=n.backup),console.log("[SimpleChatManager] input data:",u),o.create(n._objectDescURL,t,n.communicationObject,!0,!1,e,{},u)}).then(function(e){console.info("[SimpleChatManager] 3. Return Create Data Object Reporter",e);var t=new rr(o,n._domain,a,n);t.dataObjectReporter=e,n._reportersControllers[e.url]=t,i(t)}).catch(function(e){s(e)})}).catch(function(e){return console.log("[SimpleChatManager.create] MyIdentity Error:",e),reject(e)})}},{key:"onInvitation",value:function(e){this._onInvitation=e}},{key:"join",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2?arguments[2]:void 0,n=this;return new Promise(function(o,i){var s,a=n._syncher;console.info("[SimpleChatManager] ------------------------ Syncher subscribe ---------------------- \n"),console.info("invitationURL",e),n.myIdentity(r).then(function(r){s=r;var o={schema:n._objectDescURL,resource:e,store:!0,p2p:!1,mutual:t,domain_subscription:!0,identity:r};return n.offline&&(o.offline=n.offline),a.subscribe(o)}).then(function(e){console.info("Data Object Observer: ",e);var t=new rr(a,n._domain,s,n);o(t),t.dataObjectObserver=e,n._observersControllers[e.url]=t}).catch(function(e){i(e)})})}},{key:"offline",set:function(e){this._offline=e},get:function(){return!!this._offline&&this._offline}},{key:"backup",set:function(e){this._backup=e},get:function(){return!!this._backup&&this._backup}}]),e}();function ir(e,t){for(var r=0;r2&&void 0!==arguments[2])||arguments[2],n=this;if(t){var o=e.from+e.id;n._responseCallbacks[o]=t,r&&setTimeout(function(){var t=n._responseCallbacks[o];delete n._responseCallbacks[o],t&&t({id:e.id,type:"response",body:{code:408,desc:"Response timeout!",value:e}})},n._responseTimeOut)}}},{key:"_onResponse",value:function(e){if("response"===e.type){var t=e.to+e.id,r=this._responseCallbacks[t];if(e.body.code>=200&&delete this._responseCallbacks[t],r)return r(e),!0}return!1}},{key:"_onMessage",value:function(e){if(!this._onResponse(e)){var t=this._subscriptions[e.to];t?this._publishOn(t,e):this._publishOnDefault(e)}}},{key:"_genId",value:function(e){e.id&&0!==e.id||(this._msgId++,e.id=this._msgId)}},{key:"postMessage",value:function(e,t){}},{key:"postMessageWithRetries",value:function(e,t,r){var n=this,o=0;!function i(){new Promise(function(t,o){n.postMessage(e,function(n){408===n.body.code||500===n.body.code?o():(dr.info("[Bus.postMessageWithRetries] msg delivered: ",e),r(n),t())})}).then(function(){},function(){if(dr.warn("[Bus.postMessageWithRetries] Message Bounced (retry ".concat(o,"): '"),e),!(o++2&&void 0!==arguments[2]&&arguments[2];return this._watching[e]=n?Object.deepObserve(t,function(t){t.every(function(t){r._fireEvent(e,t)})}):Object.observe(t,function(t){t.every(function(t){r._fireEvent(e,t)})}),this._watching[e]}},{key:"observe",value:function(e,t){this._observers.push({key:e,callback:t})}},{key:"_fireEvent",value:function(e,t){this._observers.filter(function(t){return t.key===e}).forEach(function(e){e.callback(t)})}}]),e}();function Tr(e){return(Tr="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Dr(e,t){for(var r=0;r0&&(i=e),"break"}())break;i?n(i):o("no sandbox found for: "+e)})}},{key:"resolveNormalStub",value:function(e){var t=this;return new Promise(function(r,n){var o=U(e),i=o.domain,s=o.type;(e.includes(t.runtimeURL)||e.includes("://sandbox/"))&&(Hr.error("[Registry - resolve] URL to be resolved should have listeners ",e),n("[Registry - resolve] URL to be resolved should have listeners ",e)),e.includes("global://registry")?i=t._domain:i.indexOf("msg-node.")&&i.indexOf("registry.")||(i=i.substring(i.indexOf(".")+1)),t.isLegacy(e).then(function(o){var a;o&&"domain-idp"!==s&&(i=s+"."+function(e){var t=U(e).domain.split("."),r=t.length;return 1==r?t[r-1]:t[r-2]+"."+t[r-1]}(e)),Hr.info("[Registry.resolve] domainUrl:",i),a="domain-idp"===s?!!t.idpProxyList.hasOwnProperty(i)&&t.idpProxyList[i]:!!t.protostubsList.hasOwnProperty(i)&&t.protostubsList[i],Hr.info("[Registry.resolve] registred:",a),a&&a.hasOwnProperty("status")&&("deployed"===a.status||a.status===Nr||a.status===Br||a.status===Gr)?(Hr.info("[Registry.resolve] Resolved: ",a.url,a.status),r(a.url)):"domain-idp"===s?(t.watchingYou.observe("idpProxyList",function(e){var n=e.keypath;n.includes("status")&&(n=n.replace(".status","")),n===i&&"status"===e.name&&e.newValue===Nr&&r(t.idpProxyList[i].url)}),a&&a.status!==qr||(Hr.info("[Registry.resolveNormalStub] deploy new IDPProxy: ",i),t.loader.loadIdpProxy(i).then(function(){Hr.info("[Registry.resolveNormalStub] IdP Proxy deployed: ",t.idpProxyList[i])}).catch(function(e){Hr.error("[Registry.resolve] Error resolving Load IDPProxy: ",e),t.idpProxyList[i].status="deployment-failed",n(e)}))):(t.watchingYou.observe("protostubsList",function(e){var n=e.keypath;n.includes("status")&&(n=n.replace(".status","")),n===i&&"status"===e.name&&e.newValue===Nr&&r(t.protostubsList[i].url)}),a&&a.status!==qr||(Hr.info("[Registry.resolve] trigger new ProtocolStub: ",i),t.loader.loadStub(i).then(function(){}).catch(function(e){Hr.error("[Registry.resolveNormalStub] Error resolving Load ProtocolStub: ",e),n(e)})))}).catch(function(e){Hr.error("[Registry.resolve] Error resolving islegacy: ",e),n(e)})})}},{key:"resolve",value:function(e){Hr.info("[Registry - Resolve] - ",e);var t=this;return new Promise(function(r,n){var o=e.to?e.to:e,i=!(!e.body||!e.body.p2p)&&e.body.p2p;!t.p2pHandlerStub[t.runtimeURL]||q(o)||o.includes(t.runtimeURL)||o.includes("/p2phandler/")||o.includes("/p2prequester/")?(Hr.info("[Registry - resolve] - Resolve normal stub: ",t.p2pHandlerStub,t.runtimeURL,q(o),i,o),t.resolveNormalStub(o).then(function(e){r(e)})):(Hr.info("[Registry - resolve] - checkP2P: ",i,o,t._p2pConnectionResolve),t._p2pConnectionResolve.checkP2P(e).then(function(n){var s=t.p2pConnectionList[n.runtime];switch(s||(s=n,t.p2pConnectionList[n.runtime]=s),s.status){case Br:e.body.peer=n.runtime,r(s.url,e);break;case Nr:case Kr:t.resolveNormalStub(o).then(function(e){r(e)});break;case Gr:Hr.info("[Registry - Resolve] - p2pConnection is disconnected lets try to reconnect"),t._p2pConnectionResolve.reconnectP2PRequester(s).then(function(e){r(e)},function(e){Hr.info("[Registry - Resolve] - Reason: ",e),t.resolveNormalStub(o).then(function(e){r(e)})});break;default:Hr.info("[Registry - resolve] - P2P: ",i),i?t._setupP2PRequester(n).then(function(e){r(e)},function(e){Hr.info("[Registry - Resolve] - Reason: ",e),t.resolveNormalStub(o).then(function(e){r(e)})}):t.resolveNormalStub(o).then(function(e){r(e)})}},function(e){Hr.info("[Registry - Resolve] - Reason: ",e),t.resolveNormalStub(o).then(function(e){r(e)})}))})}},{key:"_setupP2PRequester",value:function(e){var t=this;return Hr.log("[Registry._setupP2PConnection] loadStub with p2pRequester: ",e),new Promise(function(r,n){var o=e.runtime,i={remoteRuntimeURL:o,p2pHandler:e.p2pHandler,p2pRequesterStub:!0};t.watchingYou.observe("p2pRequesterStub",function(e){Hr.log("[Registry._setupP2PConnection] p2pRequesterStubs changed "+t.p2pRequesterStub),e.keypath.split(".")[0]===o&&"status"===e.name&&e.newValue===Br&&(Hr.log("[Registry._setupP2PConnection] p2pRequester is live "+t.p2pRequesterStub[o]),r(t.p2pRequesterStub[o].url))}),t.loader.loadStub(e.p2pRequester,i).then(function(){Hr.log("[Registry._setupP2PConnection] p2pRequester deployed: ",t.p2pRequesterStub[o])}).catch(function(e){n(e)})})}},{key:"isLegacy",value:function(e){var t=this;return new Promise(function(r,n){if(e===t._domain)return r(!1);Hr.log("[Registry] [Registry.Registry.isLegacy] ",e);var o=U(e);if(-1!==["hyperty-runtime","domain","global","hyperty"].indexOf(o.type)||o.domain===t._domain)return r(!1);if(e.split("@").length>1){var i=o.domain;if(t.idpLegacyProxyList.hasOwnProperty(i)){var s=t.idpLegacyProxyList[i];return s.interworking?r(s.interworking):r(!1)}t._loader.descriptors.getIdpProxyDescriptor(i).then(function(e){e.interworking?(t.idpLegacyProxyList[i]=e,r(e.interworking)):r(!1)}).catch(function(e){Hr.warn("problem loading idp proxy descriptor for domain:",i," because ",e),n(e)})}else r(t.isInterworkingProtoStub(e))})}},{key:"isLocal",value:function(e){var t=e.split("://")[0];if(-1!==["hyperty-runtime","runtime"].indexOf(t))return e.includes(this.runtimeURL);if(-1!==["hyperty"].indexOf(t)){for(var r in this.hypertiesList)if(this.hypertiesList[r].hypertyURL===e)return!0;return!1}e.includes("/subscription")&&(e=e.substring(0,e.indexOf("/subscription")));var n=this.dataObjectList[e];return!(!n||n.interworking&&n.interworking)}},{key:"isInterworkingProtoStub",value:function(e){var t=this;return"boolean"!=typeof e&&!!e.includes("/protostub/")&&Object.keys(t.protostubsList).filter(function(r){return t.protostubsList[r].url===e}).map(function(e){return!!t.protostubsList[e].hasOwnProperty("interworking")&&t.protostubsList[e].interworking})[0]}},{key:"loader",set:function(e){this._loader=e},get:function(){return this._loader}},{key:"messageBus",get:function(){return this._messageBus},set:function(e){var t=this;t._messageBus=e,t._messageBus.addListener(t.registryURL,function(e){if(B(e.from),e.body.hasOwnProperty("criteria"),e.body.hasOwnProperty("resource")&&"."!==e.body.resource&&(N(e.body.resource),function(e){U(e).type}(e.body.resource),B(e.body.resource)),e.type,e.body.hasOwnProperty("value")&&(e.body.value.hasOwnProperty("name"),e.body.value.hasOwnProperty("user")),"response"!==e.type){var r=t._getIdentityAssociated(e.body.resource,e.body.criteria),n={id:e.id,type:"response",to:e.from,from:e.to,body:{resource:r}};n.body.code=r?200:404,t._messageBus.postMessage(n)}else Hr.error("[Register listener] skipping ",e)});var r=mr.instance;t.addressAllocation=r,t._domainRegistration=new Er(t.runtimeURL,t.registryURL,t._domain,e)}}]),e}(),Wr={storageSchemas:{capabilities:{capabilities:"key,version,value"},subscriptions:{subscriptions:"key,version,value"},runtime:{"runtime:URL":"key,version,value","p2pHandler:URL":"key,version,value"},registry:{"registry:DataObjectURLs":"key,version,value","registry:HypertyURLs":"key,version,value"},cryptoManager:{userAsymmetricKey:"key,version,value",dataObjectSessionKeys:"key,version,value"},identity:{accessTokens:"key,version,value",identities:"userURL, userProfile.email, userProfile.userURL, userProfile.name"},runtimeCatalogue:{runtimeCatalogue:"&cguid, accessControlPolicy, constraints, dataObjects, type, objectName, sourcePackage, version, url"},policy:{"rethink:activePolicy":"key,version,value","rethink:groups":"key,version,value","rethink:userPolicies":"key,version,value","rethink:spPolicies":"key,version,value"},syncherManager:{"syncherManager:ObjectURLs":"key,version,value",remotes:"key,version,value"},hypertyResources:{hypertyResources:"&resourceURL, name, contentUrl, content, created, reporter, resourceType"}},runtimeURLS:{registry:{prefix:"hyperty-runtime://",suffix:"registry"},identityModule:{prefix:"hyperty-runtime://",suffix:"/idm"},runtimeUA:{prefix:"hyperty-runtime://",suffix:"/ua"},catalogue:{prefix:"hyperty-runtime://",suffix:"/catalogue"},graphConnector:{prefix:"hyperty-runtime://",suffix:"/graph"},syncManager:{prefix:"hyperty-runtime://",suffix:"/sm"}},catalogueURLs:{protocolstub:{prefix:"hyperty-catalogue://catalogue.",suffix:"/.well-known/protocolstub/",fallback:"hyperty-catalogue://catalogue.%domain%/.well-known/protocolstub/"},idpProxy:{prefix:"hyperty-catalogue://catalogue.",suffix:"/.well-known/idp-proxy/",fallback:"hyperty-catalogue://catalogue.%domain%/.well-known/idp-proxy/"}},msgNodeURL:{prefix:"domain://msg-node.",suffix:"",hypertyAddressAllocation:"/hyperty-address-allocation",objectAddressAllocation:"/object-address-allocation",subscriptionManagement:"/sm"},domainRegistryURL:{prefix:"domain://registry.",suffix:""},globalRegistryURL:"global://registry.",remoteStorage:"https://backup.rethink-dev.alticelabs.com/"};function Jr(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Yr(e,t){for(var r=0;rr&&(e.defaultIdentity.expires=parseInt(n),e.currentIdentity=t)})),t()})})}},{key:"loadAccessTokens",value:function(){var e=this;return new Promise(function(t){e._storageManager.get("accessTokens").then(function(r){r&&(e._accessTokens=r),t()})})}},{key:"addIdentity",value:function(e){var t=this,r=this;return new Promise(function(n,o){if(r._isValid(e)){var i=e.identifiers[0];Object.assign(t._identities[i],e),t._storeIdentity(e).then(function(){t._identities[i].status="created",n()})}else o("[Identities.addIdentity] invalid IdAssertion")})}},{key:"addAssertion",value:function(e){var t=this,r=this;return new Promise(function(n,o){if(r._isValid(e)){e.userProfile.guid=r._guid;var i=e.userProfile.userURL;r.identities[i]?r.identities[i]=e:r._identities[i]=e,r._store().then(function(){t._identities[i].status="created",0==r.defaultIdentity&&(r.defaultIdentity=i),n(e)})}else o("[Identities.addAssertion] invalid IdAssertion: ",e)})}},{key:"removeIdentity",value:function(e){var t=this;return new Promise(function(r,n){delete t.identities[e],t._store().then(function(){r()})})}},{key:"addAccessToken",value:function(e){var t=this;return $r.info("[Identities.addAccessToken] ",e),new Promise(function(r,n){t._isValidAccessToken(e)?(t._accessTokens[e.domain]=e,t._storeAccessTokens().then(function(){t._accessTokens[e.domain].status="created",r(e)})):n("[Identities.addIdentity] invalid AccessToken: ",e)})}},{key:"setAccessTokenInProgress",value:function(e){this._accessTokens[e]?this._accessTokens[e].status="in-progress":this._accessTokens[e]={status:"in-progress"}}},{key:"getAccessToken",value:function(e,t){var r=this._accessTokens[e];return r?t.every(function(e){return-1!=r.resources.indexOf(e)})?this._accessTokens[e]:new Error("[Identities.getAccessToken] Not found for ",e):void 0}},{key:"removeAccessToken",value:function(e,t){var r=this,n=this;return new Promise(function(o){var i=r._accessTokens[e];i&&t.every(function(e){return-1!=i.resources.indexOf(e)})?(delete r._accessTokens[e],n._storeAccessTokens().then(function(){o()})):o()})}},{key:"updateAssertion",value:function(e){var t=this;return new Promise(function(r){var n=e.userProfile.userURL;if(!t.identities[n])return reject("[Identities.updateAssertion] Identity not found for ",n);t.identities[n]=e,t._store().then(function(){r()})})}},{key:"updateAccessToken",value:function(e){var t=this;return $r.info("[Identities.updateAccessToken] ",e),new Promise(function(r,n){t._isValidAccessToken(e)?(t._accessTokens[e.domain].expires=e.expires,t._accessTokens[e.domain].accessToken=e.accessToken,t._storeAccessTokens().then(function(){t._accessTokens[e.domain].status="created",r(e)})):n("[Identities.updateAccessToken] invalid AccessToken: ",e)})}},{key:"addIdAssertion",value:function(e,t,r,n){var o=new Qr(t,r,n);this.idAssertionList.push(o)}},{key:"_isValid",value:function(e){if(!e.hasOwnProperty("assertion"))return!1;var t=e.assertion.split(".");try{t[1]?Z(t[1]):Z(e.assertion)}catch(e){return!1}return!0}},{key:"_isValidAccessToken",value:function(e){return!!(e.hasOwnProperty("accessToken")&&e.hasOwnProperty("domain")&&e.hasOwnProperty("resources")&&Array.isArray(e.resources)&&e.hasOwnProperty("expires")&&Number.isInteger(e.expires)&&e.hasOwnProperty("input"))}},{key:"_store",value:function(){var e=this,t=this;return new Promise(function(r,n){var o=Object.keys(e._identities).map(function(r){return t._storageManager.set(r,0,e._identities[r],"identities")});Promise.all(o).then(function(){r()}).catch(function(e){n("On _sendReporterSessionKey from method storeIdentity error: "+e)})})}},{key:"_storeAccessTokens",value:function(){var e=this;return new Promise(function(t,r){var n=A(e._accessTokens);e._storageManager.set("accessTokens",0,n).then(function(){t()}).catch(function(e){r("On _sendReporterSessionKey from method storeIdentity error: "+e)})})}},{key:"identities",get:function(){return this._identities}},{key:"accessTokens",get:function(){return this._accessTokens}},{key:"watchingYou",get:function(){return this._watchingYou}},{key:"guid",set:function(e){this._guid=e},get:function(){return this._guid}},{key:"defaultIdentity",set:function(e){if(!this.identities[e])throw new Error("[Identities.set defaultIdentity ] Error: identity does not exist here: ",e);this._defaultIdentity=e},get:function(){return!!this._defaultIdentity&&Object.assign({},this.identities[this._defaultIdentity])}},{key:"currentIdentity",set:function(e){if(!this.identities[e])throw e;this._currentIdentity=e},get:function(){return Object.assign({},this.identities[this._currentIdentity])}},{key:"identifiers",get:function(){return Object.keys(this._identities)}}]),e}(),Qr=function(){function e(t,r,n){Jr(this,e),this._assertion=t,this._idp=r,this._userProfile=n}return zr(e,[{key:"assertion",get:function(){return this._assertion}},{key:"idp",get:function(){return this._idp}},{key:"userProfile",get:function(){return this._userProfile}}]),e}(),Zr=Xr,en=n.getLogger("IdentityModule"),tn=function e(t,r){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),en.log("FakeGUI_deployed");var n=this;n._url=t,n._waitTime=1e4,n._messageBus=r,n._messageBus.addListener(n._url,function(e){if(e.hasOwnProperty("type")&&"create"===e.type&&e.body.hasOwnProperty("value")&&e.body.value.hasOwnProperty("identities")&&e.body.value.hasOwnProperty("idps")){var t,r=e.body.value.identities,o=e.body.value.idps;t=void 0!==r[0]?{type:"identity",value:r[0],code:200}:{type:"idp",value:o[2].domain,code:200};var i={id:e.id,type:"response",to:e.from,from:e.to,body:t};"wait"===e.body.value?setTimeout(function(){n._messageBus.postMessage(i)},n._waitTime):n._messageBus.postMessage(i)}else en.log("Ignoring messages not intended to FakeGUI.",e)})};function rn(e,t){for(var r=0;rI())return r(c);c.hasOwnProperty("refresh")?(nn.log("[Identity.IdentityModule.getIdentityAssertion] refreshing assertion: ",c),t._refreshIdAssertion().then(function(e){return nn.log("[IdentityModule.getIdentityAssertion] refreshed assertion.",e),r(e)},function(e){nn.error("[IdentityModule.getIdentityAssertion] error on refresIdAssertion: ",e," Asking for a new IdAssertion."),t._getIdAssertionForDomain(s,i,a).then(function(e){r(e)},function(e){n(e)})})):t._getIdAssertionForDomain(s,i,a).then(function(e){r(e)},function(e){n(e)})}else t._getIdAssertionForDomain(s,i,a).then(function(e){r(e)},function(e){n(e)})}else if(t.identities.defaultIdentity){var u=t.identities.defaultIdentity;if(u.expires>I())return r(u);u.hasOwnProperty("refresh")?(nn.log("[Identity.IdentityModule.getValidToken] refreshing assertion: ",u),t._refreshIdAssertion(u).then(function(e){return nn.log("[IdentityModule.getIdentityAssertion] refreshed assertion.",e),r(e)},function(e){nn.error("[IdentityModule.getIdentityAssertion] error on refresIdAssertion: ",e," Asking for a new IdAssertion."),t.selectIdentityFromGUI().then(function(e){return nn.log("[IdentityModule] Identity selected from GUI."),t.identities.defaultIdentity=e.userProfile.userURL,r(e)},function(e){return n(e)})})):t.selectIdentityFromGUI().then(function(e){return nn.log("[IdentityModule] Identity selected from GUI."),t.identities.defaultIdentity=e.userProfile.userURL,r(e)},function(e){return n(e)})}else t.selectIdentityFromGUI().then(function(e){return nn.log("[IdentityModule] Identity selected from GUI."),t.identities.defaultIdentity=e.userProfile.userURL,r(e)},function(e){return n(e)})}).catch(function(e){return nn.error("Error on identity acquisition ",e),n(e)}),t.runtimeCapabilities.isAvailable("node").then(function(e){if(nn.log("node identity acquisition",e),e){if(t.identities.currentIdentity)return r(t.identities.currentIdentity);nn.log("getIdentityAssertion for nodejs"),t.callNodeJsGenerateMethods("nodejs-idp","origin").then(function(e){r(e)},function(e){n(e)})}}).catch(function(e){nn.error("Error on identity acquisition ",e),n(e)})})}},{key:"_getIdAssertionForDomain",value:function(e,t,r){var n=this;return new Promise(function(o,i){n.selectIdentityForHyperty(e,t,r).then(function(e){return nn.log("[IdentityModule._getIdAssertionForDomain] Identity selected by hyperty."),o(e)},function(e){n.selectIdentityFromGUI().then(function(e){return nn.log("[IdentityModule._getIdAssertionForDomain] Identity selected by hyperty."),o(e)},function(e){return i(e)})})})}},{key:"_refreshIdAssertion",value:function(e){var t=this;return new Promise(function(r,n){t.sendRefreshMessage(e).then(function(e){nn.log("[Identity.IdentityModule.getValidToken] refreshed assertion: ",e),t.identities.updateAssertion(e).then(function(){r(e)},function(e){nn.error("[IdentityModule.getValidToken] error updating the assertion ",e),n(e)})},function(e){nn.error("[IdentityModule.getValidToken] error refreshing the assertion ",e),n(e)})})}},{key:"getUsersIDs",value:function(){return this.identities.identifiers}},{key:"deleteIdentity",value:function(e){return this.identities.removeIdentity(e)}},{key:"listenShowAdmin",value:function(e){this._showAdmin=e}},{key:"requestIdentityToGUI",value:function(e,t){nn.log("[IdentityModule.requestIdentityToGUI:identities]",e),nn.log("[IdentityModule.requestIdentityToGUI:idps]",t);var r=this;return new Promise(function(n,o){if(!1===r.guiDeployed){var i=r._guiURL,s=new tn(i,r._messageBus);r.guiFake=s,r.guiDeployed=!0}var a={type:"create",to:r._guiURL,from:r._idmURL,body:{value:{identities:e,idps:t}}};try{r._messageBus.postMessage(a,function(e){if(r._messageBus.removeResponseListener(r._idmURL,e.id),200===e.body.code){var t=e.body;nn.log("selectedIdentity: ",t.value),n(t)}else o("error on requesting an identity to the GUI")},!1)}catch(e){o("In method callIdentityModuleFunc error: "+e)}})}},{key:"callNodeJsGenerateMethods",value:function(e,t){nn.log("[callNodeJsGenerateMethods:idp]",e),nn.log("[callNodeJsGenerateMethods:origin]",t);var r=this;return new Promise(function(n,o){var i;r._crypto.getMyPublicKey().then(function(n){return nn.log("[callNodeJsGenerateMethods:key]",n),i=te(n),nn.log("[callNodeJsGenerateMethods] NO_URL"),r.generateAssertion(i,t,"url",e)}).then(function(e){e?n(e):o("Error on obtaining Identity")}).catch(function(e){nn.log(e),o(e)})})}},{key:"callGenerateMethods",value:function(e,t){nn.log("[callGenerateMethods:idp]",e),nn.log("[callGenerateMethods:origin]",t);var r=this;return new Promise(function(n,o){var i;r._crypto.getMyPublicKey().then(function(n){return nn.log("[callGenerateMethods:key]",n),i=te(n),nn.log("generateAssertion:no_hint"),r.generateAssertion(i,t,"",e)}).then(function(n){return r.myHint=n,nn.log("generateAssertion:hint"),r.generateAssertion(i,t,n,e)}).then(function(e){e?n(e):o("Error on obtaining Identity")}).catch(function(e){nn.error(e),o(e)})})}},{key:"loginSelectedIdentity",value:function(e,t,r,n){nn.log("[loginSelectedIdentity:publicKey]",e),nn.log("[loginSelectedIdentity:origin]",t),nn.log("[loginSelectedIdentity:idp]",r),nn.log("[loginSelectedIdentity:loginUrl]",n);var o=this;return new Promise(function(i,s){nn.log("[IdentityModule] openPopup"),o.callIdentityModuleFunc("openPopup",{urlreceived:n}).then(function(e){return e},function(e){return nn.error("Error while logging in for the selected identity."),s(e)}).then(function(n){o.sendGenerateMessage(e,t,n,r).then(function(e){if(!e.hasOwnProperty("assertion"))return nn.error("Error while logging in for the selected identity."),s("Could not generate a valid assertion for selected identity.");o.identities.addAssertion(e).then(function(e){i("Login was successfull")}).catch(function(e){s("Login has failed:"+e)})}).catch(function(e){s("On loginSelectedIdentity from method sendGenerateMessage error: "+e)})})})}},{key:"selectIdentityForHyperty",value:function(e,t,r){nn.log("[selectIdentityForHyperty:origin]",e),nn.log("[selectIdentityForHyperty:idp]",t),nn.log("[selectIdentityForHyperty:idHint]",r);var n=this;return new Promise(function(o,i){n._crypto.getMyPublicKey().then(function(s){var a=te(s);n.sendGenerateMessage(a,e,r,t).then(function(r){r.hasOwnProperty("assertion")?n.identities.addAssertion(r).then(function(e){return o(r)},function(e){return i(e)}):r.hasOwnProperty("loginUrl")?n.loginSelectedIdentity(a,e,t,r.loginUrl).then(function(e){return o(e)},function(e){return i(e)}):(nn.log("Proceeding by logging in."),n.callGenerateMethods(t,e).then(function(e){return o(e)},function(e){return i(e)}))}).catch(function(e){i("On selectIdentityForHyperty from method sendGenerateMessage error: "+e)})}).catch(function(e){i("On selectIdentityForHyperty from method generateRSAKeyPair error: "+e)})})}},{key:"selectIdentityFromGUI",value:function(e){var t=this;nn.log("[IdentityModule.selectIdentityFromGUI:origin]",e);var r=this;return new Promise(function(n,o){t.getIdentitiesToChoose().then(function(e){return r.requestIdentityToGUI(e.identities,e.idps)}).then(function(t){if("identity"===t.type)r.identities.identities[t.value]?n(r.identities.identities[t.value]):o("[IdentityModule.selectIdentityFromGUI] identity not found: ",t.value);else{if("idp"!==t.type)return o("error on GUI received message.");r.callGenerateMethods(t.value,e).then(function(e){return n(e)},function(e){return o(e)})}}).catch(function(e){o("On selectIdentityFromGUI from method requestIdentityToGUI error: "+e)})})}},{key:"callIdentityModuleFunc",value:function(e,t,r,n){nn.log("[callIdentityModuleFunc:methodName]",e),nn.log("[callIdentityModuleFunc:parameters]",t);var o=this;return new Promise(function(i,s){if(o._showAdmin)"getAccessToken"===e?o._showAdmin(e,t.urlreceived,r,n).then(function(e){i(e)}):o._showAdmin(e);else{var a={type:"execute",to:o._guiURL,from:o._idmURL,body:{resource:"identity",method:e,params:t}};try{o._messageBus.postMessage(a,function(e){o._messageBus.removeResponseListener(o._idmURL,e.id);var t=e.body.value;i(t)},!1)}catch(e){s("In method callIdentityModuleFunc error: "+e)}}})}},{key:"getToken",value:function(e){var t=this,r=e.from,n=e.to;return e.hasOwnProperty("body")&&e.body.hasOwnProperty("source")&&(r=e.body.source),"forward"===e.type&&(r=e.body.from),e.hasOwnProperty("body")&&e.body.hasOwnProperty("subscriber")&&(r=e.body.subscriber),new Promise(function(o,i){nn.log("[IdentityModule.getToken] for msg ",e),t.registry.isLegacy(n).then(function(n){n?t._getAccessToken(e).then(function(e){nn.log("[IdentityModule.getToken] access token ",e),o(A(e))}).catch(function(e){i("[IdentityModule.getToken] Access Token error "+e)}):t._getValidToken(r).then(function(e){o(e)}).catch(function(e){i("On getToken from method _getValidToken error: "+e)})}).catch(function(e){i("On getToken from method isLegacy error: "+e)})})}},{key:"getIdToken",value:function(e){nn.info("getIdToken:hypertyURL ",e);var t=this;return new Promise(function(r,n){var o;if("hyperty"===e.split("://")[0]){if(o=t.registry.getHypertyOwner(e)){var i=t.identities.getIdentity(o);return i?r(i):n("[IdentityModule.getIdToken] Identity not found for: ",o)}return n("[IdentityModule.getIdToken] User not found for hyperty: ",o)}t._getHypertyFromDataObject(e).then(function(e){if(o=t.registry.getHypertyOwner(e)){var i=t.identities.getIdentity(o);return i?r(i):n("[IdentityModule.getIdToken] Identity not found for: ",o)}return n("[IdentityModule.getIdToken] User not found for hyperty: ",e)}).catch(function(e){nn.error("[IdentityModule.getIdToken] Error: ",e),n(e)})})}},{key:"_getAccessToken",value:function(e){var t=e.to,r=this;return new Promise(function(n){if(!e.hasOwnProperty("body"))return reject("[IdentityModule._getAccessToken] missing mandatory msg body: ",e);if(!e.body.hasOwnProperty("value"))return reject("[IdentityModule._getAccessToken] missing mandatory msg body value: ",e);if(!e.body.value.hasOwnProperty("resources"))return reject("[IdentityModule._getAccessToken] missing mandatory msg body value resources: ",e);var o=U(t).domain;t.includes("protostub")&&(o=o.replace(o.split(".")[0]+".",""));var i=e.body.value.resources;r._getAccessTokenForDomain(o,i).then(function(e){n(e)})})}},{key:"_getAccessTokenForDomain",value:function(e,t){var r,n=this;return new Promise(function(o,i){try{r=n.identities.getAccessToken(e,t)}catch(e){return i("[IdentityModule._getAccessTokenForDomain] Access Token error "+err)}if(r){if("in-progress"===r.status)return o(n._inProgressAccessToken(e,t));var s=I();if(nn.log("[Identity.IdentityModule._getAccessTokenForDomain] found Access Token ",r),!(s>=r.expires))return o(A(r));r.hasOwnProperty("refresh")?n._refreshAccessToken(A(r)).then(function(e){return o(n.identities.updateAccessToken(e))}):n._revokeAccessToken(r,e,t).then(function(){setTimeout(function(){return n._getNewAccessToken(e,t)},1e3)})}else n._getNewAccessToken(e,t).then(function(e){return nn.log("[Identity.IdentityModule._getAccessTokenForDomain] new Access Token ",e),o(e)}).catch(function(e){i("[IdentityModule._getAccessTokenForDomain] on getNewAccessToken "+e)})})}},{key:"_revokeAccessToken",value:function(e,t,r){var n=this;return nn.log("[IdentityModule._revokeAccessToken] to be revoked ",e),new Promise(function(o,i){var s;s={type:"execute",to:n._resolveDomain(e.domain),from:n._idmURL,body:{method:"revokeAccessToken",params:{token:e}}},nn.log("[IdentityModule._revokeAccessToken] revoke msg ",s);try{n._messageBus.postMessage(s,function(e){var i=e.body.value;i&&n._identities.removeAccessToken(t,r).then(function(){o(i)}),o()})}catch(e){i("In IdentityModule._revokeAccessToken on postMessage error: "+e)}})}},{key:"_inProgressAccessToken",value:function(e,t){var r=this;this.identities.watchingYou.observe("accessTokens",function(n){nn.log("[IdentityModule._inProgressAccessToken] accessTokens changed "+r.identities.accessTokens);var o=n.keypath;if(o.includes("status")&&(o=o.replace(".status","")),o===e&&"status"===n.name&&"created"===n.newValue)return r.identities.getAccessToken(e,t)})}},{key:"_getNewAccessToken",value:function(e,t){var r=this;return new Promise(function(n,o){r.identities.setAccessTokenInProgress(e);var i={type:"execute",to:r._resolveDomain(e),from:r._idmURL,body:{method:"getAccessTokenAuthorisationEndpoint",params:t}};r._messageBus.postMessage(i,function(s){if(s.body.code>299)return o("[IdentityModule._getNewAccessToken] Error on getAccessTokenAuthorisationEndpoint from IdP Proxy: ",s.body.desc);r.callIdentityModuleFunc("getAccessToken",{urlreceived:s.body.value},e,t[0]).then(function(e){nn.log("[IdentityModule:callIdentityModuleFunc:openPopup] auhtorisation result: ",e),i.body.method="getAccessToken",i.body.params={resources:t,login:e},r._messageBus.postMessage(i,function(e){if(e.body.code>299)return o("[IdentityModule._getNewAccessToken] Error on getAccessToken from IdP Proxy: ",e.body.desc);r.identities.addAccessToken(e.body.value).then(function(t){return nn.info("[IdentityModule._getNewAccessToken] resolving token: ",t),n(e.body.value)},function(e){o(e)})})},function(e){o(e)})})})}},{key:"_refreshAccessToken",value:function(e){var t=this;return nn.log("IdentityModule._refreshAccessToken:outdatedToken",e),new Promise(function(r,n){var o;o={type:"execute",to:t._resolveDomain(e.domain),from:t._idmURL,body:{method:"refreshAccessToken",params:{token:e}}};try{t._messageBus.postMessage(o,function(e){var t=e.body.value;r(t)})}catch(e){n("In IdentityModule._refreshAccessToken on postMessage error: "+e)}})}},{key:"sendRefreshMessage",value:function(e){var t=this;return nn.log("sendRefreshMessage:oldIdentity",e),new Promise(function(r,n){var o,i=t._resolveDomain(e.idp.domain),s=t.getIdentity(e.userProfile.userURL);nn.info("sendRefreshMessage:oldIdentity",e),o={type:"execute",to:i,from:t._idmURL,body:{resource:"identity",method:"refreshAssertion",params:{identity:s}}};try{t._messageBus.postMessage(o,function(e){if(e.body.code<300){var t=e.body.value;r(t)}else r(e.body.value.body.params,identity)})}catch(e){n("In sendRefreshMessage on postMessage error: "+e)}})}},{key:"getAccessToken",value:function(e,t,r){nn.log("[getAccessToken:idpDomain]",e);var n=this;return new Promise(function(o,i){var s;s={type:"execute",to:n._resolveDomain(e),from:n._idmURL,body:{resource:"identity",method:"getAccessToken",params:{resources:t,login:r}}};try{n._messageBus.postMessage(s,function(e){if(e.body.code<299){var t=e.body.value;o(t)}else o(e.body)})}catch(e){i("IdentityModule.In getAccessToken: "+e)}})}},{key:"getAccessTokenAuthorisationEndpoint",value:function(e,t){nn.log("[getAccessTokenAuthorisationEndpoint:idpDomain]",t);var r=this;return new Promise(function(n,o){var i;i={type:"execute",to:r._resolveDomain(t),from:r._idmURL,body:{resource:"identity",method:"getAccessTokenAuthorisationEndpoint",params:{resources:e}}};try{r._messageBus.postMessage(i,function(e){var t=e.body.value;n(t)})}catch(e){o("In getAccessTokenAuthorisationEndpoint: "+e)}})}},{key:"sendGenerateMessage",value:function(e,t,r,n){nn.log("[sendGenerateMessage:contents]",e),nn.log("[sendGenerateMessage:origin]",t),nn.log("[sendGenerateMessage:usernameHint]",r),nn.log("[sendGenerateMessage:idpDomain]",n),nn.log("sendGenerateMessage_hint");var o=this;return new Promise(function(i,s){var a;a={type:"execute",to:o._resolveDomain(n),from:o._idmURL,body:{resource:"identity",method:"generateAssertion",params:{contents:e,origin:t,usernameHint:r}}};try{o._messageBus.postMessage(a,function(e){e.body.code<300?i(e.body.value):s(e.body)})}catch(e){s("In sendGenerateMessage: "+e)}})}},{key:"generateAssertion",value:function(e,t,r,n){nn.log("[generateAssertion:contents]",e),nn.log("[generateAssertion:origin]",t),nn.log("[generateAssertion:usernameHint]",r),nn.log("[generateAssertion:idpDomain]",n);var o=this;return new Promise(function(i,s){nn.log("[IdentityModule:sendGenerateMessage:sendGenerateMessage]",r),o.sendGenerateMessage(e,t,r,n).then(function(e){e?o.identities.addAssertion(e).then(function(t){i(e)},function(e){s(e)}):s("error on obtaining identity information")},function(e){e.hasOwnProperty("description")&&e.description.hasOwnProperty("loginUrl")?o.callIdentityModuleFunc("login",{urlreceived:e.description.loginUrl}).then(function(e){nn.log("[IdentityModule:callIdentityModuleFunc:openPopup]",r),i(e)},function(e){s(e)}):(nn.error("[IdentityModule:sendGenerateMessage] generate assertion with hint error ",e),s(e))}).catch(function(e){s("On generateAssertion from method sendGenerateMessage error: "+e)})})}},{key:"validateAssertion",value:function(e,t,r){nn.log("[validateAssertion:assertion]",e),nn.log("[validateAssertion:origin]",t),nn.log("[validateAssertion:idpDomain]",r);var n=this,o={type:"execute",to:n._resolveDomain(r),from:n._idmURL,body:{resource:"identity",method:"validateAssertion",params:{assertion:e,origin:t}}};return new Promise(function(e,t){try{n._messageBus.postMessage(o,function(r){200===r.body.code?e(r.body.value):t("error",r.body.code)})}catch(e){t("On validateAssertion from method postMessage error: "+e)}})}},{key:"addGUIListeners",value:function(){var e=this;e._messageBus.addListener(e._idmURL,function(t){var r,n=t.body.method;if(nn.log("[IdentityModule:addGUIListeners]",t,t.body,n),"deployGUI"===n)r=e.deployGUI();else{if("getIdentitiesToChoose"===n)return void e.getIdentitiesToChoose().then(function(r){var n={type:"execute",value:r,code:200},o={id:t.id,type:"response",to:t.from,from:t.to,body:n};try{e._messageBus.postMessage(o)}catch(e){nn.error("On addGUIListeners from if storeIdentity method postMessage error: "+e)}});if("unregisterIdentity"===n){var o=t.body.params.email;r=e.unregisterIdentity(o)}else{if("getMyPublicKey"===n)return void e._crypto.getMyPublicKey().then(function(r){var n={type:"execute",value:r=te(r),code:200},o={id:t.id,type:"response",to:t.from,from:t.to,body:n};try{e._messageBus.postMessage(o)}catch(e){nn.error("On addGUIListeners from if generateRSAKeyPair method postMessage error: "+e)}});if("sendGenerateMessage"===n){var i=t.body.params.contents,s=t.body.params.origin,a=t.body.params.usernameHint,c=t.body.params.idpDomain,u={id:t.id,type:"response",to:t.from,from:t.to};return void e.sendGenerateMessage(i,s,a,c).then(function(t){var r={type:"execute",value:t,code:200};u.body=r;try{e._messageBus.postMessage(u)}catch(e){nn.error("IdentityModule.addGUIListeners sendGenerateMessage error: "+e)}},function(t){nn.info("IDPProxy generateAssertion reply error "+t),u.body=t,e._messageBus.postMessage(u)})}if("getAccessTokenAuthorisationEndpoint"===n){var l=t.body.params.scope,f=t.body.params.idpDomain;return void e.getAccessTokenAuthorisationEndpoint(l,f).then(function(r){var n={type:"execute",value:r,code:200},o={id:t.id,type:"response",to:t.from,from:t.to,body:n};try{e._messageBus.postMessage(o)}catch(e){nn.error("On addGUIListeners from if sendGenerateMessage method postMessage error: "+e)}})}if("addAccessToken"===n){var d=t.body.params;return void e.identities.addAccessToken(d).then(function(r){var n={type:"execute",value:r,code:200},o={id:t.id,type:"response",to:t.from,from:t.to,body:n};try{e._messageBus.postMessage(o)}catch(e){nn.error("On addGUIListeners from if storeIdentity method postMessage error: "+e)}})}if("getAccessToken"===n){var y=t.body.params.idpDomain,h=t.body.params.resources,p=t.body.params.login,v={id:t.id,type:"response",to:t.from,from:t.to};return void e.getAccessToken(y,h,p).then(function(t){var r={type:"execute",value:t,code:200};v.body=r;try{e._messageBus.postMessage(v)}catch(e){nn.error("On addGUIListeners from if sendGenerateMessage method postMessage error: "+e)}},function(t){try{v.body=t,e._messageBus.postMessage(v)}catch(e){nn.error("On addGUIListeners from if sendGenerateMessage method postMessage error: "+e)}})}if("addAssertion"===n){var g=t.body.params;return void e.identities.addAssertion(g).then(function(r){var n={type:"execute",value:r,code:200},o={id:t.id,type:"response",to:t.from,from:t.to,body:n};try{e._messageBus.postMessage(o)}catch(e){nn.error("On addGUIListeners from if storeIdentity method postMessage error: "+e)}})}if("refreshAccessToken"===n){var b=t.body.params.domain,m=t.body.params.resources;return void e._getAccessTokenForDomain(b,m).then(function(r){var n={id:t.id,type:"response",to:t.from,from:t.to,body:{value:r.accessToken,code:200}};try{e._messageBus.postMessage(n)}catch(e){nn.error("On addGUIListeners for refreshAccessToken request: "+e)}})}if("unauthorise"===n){var _=t.body.params.domain,w=t.body.params.resources;try{e._revokeAccessToken(e.identities.getAccessToken(_,w),_,w)}catch(e){return reject("[IdentityModule.addGUIListeners] unauthorise error "+err)}var O={id:t.id,type:"response",to:t.from,from:t.to,body:{value:!0,code:200}};try{e._messageBus.postMessage(O)}catch(e){nn.error("On addGUIListeners for refreshAccessToken request: "+e)}return}}}var k={type:"execute",value:r,code:200},R={id:t.id,type:"response",to:t.from,from:t.to,body:k};try{e._messageBus.postMessage(R)}catch(e){nn.error("On addGUIListeners from if storeIdentity method postMessage error: "+e)}})}},{key:"deployGUI",value:function(){this.guiDeployed=!0}},{key:"_getValidToken",value:function(e){nn.log("[IdentityModule._getValidToken]:hypertyURL",e);var t=this;return new Promise(function(r,n){t.getIdToken(e).then(function(e){nn.log("[IdentityModule._getValidToken] retrieved IdAssertion",e);var o=I();if(!e.hasOwnProperty("expires"))return r(e);var i=e.expires;nn.log("[Identity.IdentityModule.getValidToken] Token expires in",i),nn.log("[Identity.IdentityModule.getValidToken] time now:",o),o>=i?e.hasOwnProperty("refresh")?(nn.log("[Identity.IdentityModule.getValidToken] refreshing assertion: ",e),t.sendRefreshMessage(e).then(function(e){nn.log("[Identity.IdentityModule.getValidToken] refreshed assertion: ",e),t.identities.updateAssertion(e).then(function(){r(e)},function(e){nn.error("[IdentityModule.getValidToken] error updating the assertion ",e),n(e)})},function(e){nn.error("[IdentityModule.getValidToken] error refreshing the assertion ",e),n(e)})):t.callGenerateMethods(e.idp.domain).then(function(e){r(e)}).catch(function(e){n("[IdentityModule.getValidToken] error when generating a new assertion "+e)}):r(e)}).catch(function(e){nn.error("[IdentityModule.getValidToken] error on getIdToken",e),n(e)})})}},{key:"_getHypertyFromDataObject",value:function(e){nn.info("_getHypertyFromDataObject:dataObjectURL",e);var t=this;return new Promise(function(r,n){var o=U(e).domain,i=$(e),s=t.registry.getReporterURLSynchonous(i);if(nn.info("_getHypertyFromDataObject:reporterURL",s),s)r(s);else{var a=t.dataObjectsIdentity[i];if(nn.info("_getHypertyFromDataObject:storedReporterURL",a),a)r(a);else{var c=t.registry.getDataObjectSubscriberHyperty(e);nn.info("_getHypertyFromDataObject:subscriberHyperty",c),c?r(c):t._coreDiscovery.discoverDataObjectPerURL(i,o).then(function(e){nn.info("_getHypertyFromDataObject:dataObject",e),t.dataObjectsIdentity[i]=e.reporter,nn.info("_getHypertyFromDataObject:dataObject.reporter",e.reporter),r(e.reporter)},function(e){n(e)})}}})}},{key:"_resolveDomain",value:function(e){return e?"domain-idp://"+e:"domain-idp://google.com"}},{key:"messageBus",get:function(){return this._messageBus},set:function(e){this._messageBus=e,this.addGUIListeners()}},{key:"coreDiscovery",get:function(){return this._coreDiscovery},set:function(e){this._coreDiscovery=e}},{key:"registry",get:function(){return this._registry},set:function(e){this._registry=e}},{key:"identities",get:function(){return this._identities},set:function(e){this._identities=e}},{key:"idps",get:function(){return this._listOfIdps}}]),e}();function sn(e,t){for(var r=0;rt&&ne[0]}},{key:"in",value:function(e){return e[0].indexOf(e[1])>-1}},{key:"lessThan",value:function(e){return e[1]n?1:0})}}]),e}();function xn(e,t){for(var r=0;r0){var r=new Kn(this.handlers);r.next(new Fn(this,r,e,t))}else t(e)}}]),e}(),Fn=function(){function e(t,r,n,o){Dn(this,e),this._inStop=!1,this._pipeline=t,this._iter=r,this._msg=n,this._onDeliver=o}return Nn(e,[{key:"next",value:function(){this._inStop||(this._iter.hasNext?this._iter.next(this):this._onDeliver(this._msg))}},{key:"deliver",value:function(){this._inStop||(this._inStop=!0,this._onDeliver(this._msg))}},{key:"fail",value:function(e){this._inStop||(this._inStop=!0,this._pipeline.onFail&&this._pipeline.onFail(e))}},{key:"pipeline",get:function(){return this._pipeline}},{key:"msg",get:function(){return this._msg},set:function(e){this._msg=e}}]),e}(),Kn=function(){function e(t){Dn(this,e),this._index=-1,this._array=t}return Nn(e,[{key:"hasNext",get:function(){return this._index>6|192;else{if(o>55295&&o<56320){if(++n==e.length)throw"UTF-8 encode: incomplete surrogate pair";var i=e.charCodeAt(n);if(i<56320||i>57343)throw"UTF-8 encode: second char code 0x"+i.toString(16)+" at index "+n+" in surrogate pair out of range";o=65536+((1023&o)<<10)+(1023&i),r[t++]=o>>18|240,r[t++]=o>>12&63|128}else r[t++]=o>>12|224;r[t++]=o>>6&63|128}r[t++]=63&o|128}}return r.subarray(0,t)}function Xn(e,t){for(var r=0;r127){if(n>191&&n<224){if(r>=e.length)throw"UTF-8 decode: incomplete 2-byte sequence";n=(31&n)<<6|63&e[r]}else if(n>223&&n<240){if(r+1>=e.length)throw"UTF-8 decode: incomplete 3-byte sequence";n=(15&n)<<12|(63&e[r])<<6|63&e[++r]}else{if(!(n>239&&n<248))throw"UTF-8 decode: unknown multibyte start 0x"+n.toString(16)+" at index "+(r-1);if(r+2>=e.length)throw"UTF-8 decode: incomplete 4-byte sequence";n=(7&n)<<18|(63&e[r])<<12|(63&e[++r])<<6|63&e[++r]}++r}if(n<=65535)t+=String.fromCharCode(n);else{if(!(n<=1114111))throw"UTF-8 decode: code point 0x"+n.toString(16)+" exceeds UTF-16 reach";n-=65536,t+=String.fromCharCode(n>>10|55296),t+=String.fromCharCode(1023&n|56320)}}return t}(new Uint8Array(e));Qn.log("crypto-decryptAES",t),o(t)}).catch(function(e){i(e)})})})}},{key:"hashHMAC",value:function(e,t){Qn.log("hashHMAC:key",e),Qn.log("hashHMAC:data",t);var r=this;return new Promise(function(n,o){"string"!=typeof t&&(t=JSON.stringify(t),Qn.log("Converting hashHMAC inpured DATA"),Qn.log("HHashHMAC:",t)),r._importHMACkey(e).then(function(e){r._crypto.subtle.sign({name:"HMAC"},e,$n(t)).then(function(e){Qn.log("HashHMAC signature:",new Uint8Array(e)),n(new Uint8Array(e))}).catch(function(e){o(e)})})})}},{key:"verifyHMAC",value:function(e,t,r){Qn.log("verifyHMAC:key",e),Qn.log("verifyHMAC:data",t),Qn.log("verifyHMAC:signature",r);var n=this;return new Promise(function(o,i){n._importHMACkey(e).then(function(e){"string"!=typeof t&&(t=JSON.stringify(t),Qn.log("Converting verifyHMAC inputed DATA:",t)),n._crypto.subtle.verify({name:"HMAC"},e,r,$n(t)).then(function(e){Qn.log("verifyHMAC result",e),e?o(e):i(e)}).catch(function(e){Qn.error("crypto-verifyHMAC",e),i(e)})})})}},{key:"generateRSAKeyPair",value:function(){var e=this,t={};return new Promise(function(r,n){e._crypto.subtle.generateKey({name:"RSA-PSS",modulusLength:2048,publicExponent:new Uint8Array([1,0,1]),hash:{name:"SHA-256"}},!0,["sign","verify"]).then(function(o){e._crypto.subtle.exportKey("spki",o.publicKey).then(function(r){return t.public=new Uint8Array(r),e._crypto.subtle.exportKey("pkcs8",o.privateKey)}).then(function(e){t.private=new Uint8Array(e),r(t)}).catch(function(e){Qn.error(e),n(e)})}).catch(function(e){Qn.error(e),n(e)})})}},{key:"generateIV",value:function(){var e=new Uint8Array(16);return this._crypto.getRandomValues(e),e}},{key:"generateRandom",value:function(){var e=new Uint8Array(32);this._crypto.getRandomValues(e);for(var t=$n(Date.now().toString()),r=t.slice(t.length-4,t.length),n=0;n<4;n++)e[n]=r[n];return e}},{key:"generatePMS",value:function(){var e=new Uint8Array(48);return this._crypto.getRandomValues(e),e}},{key:"generateMasterSecret",value:function(e,t){var r=this;return new Promise(function(n,o){var i=new Uint8Array(48),s=t;r._digest(e).then(function(e){r.hashHMAC(e,s).then(function(t){for(var n=0;n<32;n++)i[n]=t[n];return r.hashHMAC(e,s+t)}).then(function(e){for(var t=0;t<16;t++)i[t+32]=e[t];n(i)}).catch(function(e){o(e)})})})}},{key:"generateKeys",value:function(e,t){var r=this;return new Promise(function(n,o){var i=[],s=t;r.hashHMAC(e,s).then(function(t){return i.push(t),r.hashHMAC(e,s+t)}).then(function(t){return i.push(t),r.hashHMAC(e,s+t)}).then(function(t){return i.push(t),r.hashHMAC(e,s+t)}).then(function(e){i.push(e),n(i)}).catch(function(e){o(e)})})}},{key:"_importRSAsignKey",value:function(e){var t=this;return new Promise(function(r,n){t._crypto.subtle.importKey("pkcs8",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["sign"]).then(function(e){r(e)}).catch(function(e){Qn.error("crypto-_importRSAsignKey",e),n(e)})})}},{key:"_importRSAverifyKey",value:function(e){var t=this;return new Promise(function(r,n){t._crypto.subtle.importKey("spki",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["verify"]).then(function(e){r(e)}).catch(function(e){Qn.error("crypto-_importRSAverifyKey",e),n(e)})})}},{key:"_importRSAencryptKey",value:function(e){var t=this;return new Promise(function(r,n){t._crypto.subtle.importKey("spki",e,{name:"RSA-OAEP",hash:{name:"SHA-256"}},!0,["encrypt"]).then(function(e){r(e)}).catch(function(e){Qn.error("crypto-_importRSAencryptKey",e.name),n(e)})})}},{key:"_importRSAdecryptKey",value:function(e){var t=this;return new Promise(function(r,n){t._crypto.subtle.importKey("pkcs8",e,{name:"RSA-OAEP",hash:{name:"SHA-256"}},!0,["decrypt"]).then(function(e){r(e)}).catch(function(e){Qn.error("crypto-_importRSAdecryptKey",e),n(e)})})}},{key:"concatPMSwithRandoms",value:function(e,t,r){for(var n=new Uint8Array(e.length+t.length+r.length),o=0;o"+e.to];if(f||(f=t._newChatCrypto(e,l),t.chatKeys[e.from+"<->"+e.to]=f,e.body.handshakePhase="startHandShake"),f.authenticated&&!o){var d=t.crypto.generateIV();t.crypto.encryptAES(f.keys.hypertyFromSessionKey,te(e.body.value),d).then(function(n){var o=t._filterMessageToHash(e,te(e.body.value)+te(d),f.hypertyFrom.messageInfo);t.crypto.hashHMAC(f.keys.hypertyFromHashKey,o).then(function(t){var o={iv:Q(d),value:Q(n),hash:Q(t)};e.body.value=Q(o),r(e)})})}else o?r(e):t._doHandShakePhase(e,f).then(function(r){t.chatKeys[e.from+"<->"+e.to]=r.chatKeys,t._messageBus.postMessage(r.message),n("encrypt handshake protocol phase ")})}else n("In encryptMessage: Hyperty owner URL was not found")}else c&&s&&t.storageManager.get("dataObjectSessionKeys").then(function(o){var s=(o=z(o||{}))?o[i]:null;t.dataObjectsStorage.getDataObject(i).then(function(o){if(!s&&o.reporter&&o.reporter===e.from){var a=t.crypto.generateRandom();t.dataObjectSessionKeys[i]={sessionKey:a,isToEncrypt:!0};var c=Y(t.dataObjectSessionKeys);t.storageManager.set("dataObjectSessionKeys",0,c).catch(function(e){n("On encryptMessage from method storageManager.set error: "+e)}),s=t.dataObjectSessionKeys[i]}if(s)if(s.isToEncrypt){var u=t.crypto.generateIV(),l=te(u),f=te(e.body.value);t.crypto.encryptAES(s.sessionKey,f,u).then(function(n){delete e.body.identity.assertion,delete e.body.identity.expires;var o=t._filterMessageToHash(e,f+l);t.crypto.hashHMAC(s.sessionKey,o).then(function(t){var o={value:Q(n),iv:Q(u),hash:Q(t)};e.body.value=te(o),r(e)})})}else r(e);else n("Data object key could not be defined: Failed to decrypt message ")}).catch(function(e){n("On encryptMessage from method dataObjectsStorage.getDataObject error: "+e)})}).catch(function(e){n("On encryptMessage from method storageManager.get error: "+e)})})}},{key:"encryptDataObject",value:function(e,t){var r=this;return new Promise(function(n,o){to.info("dataObject value to encrypt: ",e);var i=$(t);r.storageManager.get("dataObjectSessionKeys").then(function(t){var s=(t=z(t||{}))?t[i]:null;if(!s)return o("No dataObjectKey for this dataObjectURL:",i);if(!s.isToEncrypt)return to.info("The dataObject is not encrypted"),n(e);var a=r.crypto.generateIV();r.crypto.encryptAES(s.sessionKey,te(e),a).then(function(e){var t={value:Q(e),iv:Q(a)};return n(t)}).catch(function(e){o("On encryptDataObject from method encryptAES error: "+e)})}).catch(function(e){o("On encryptDataObject from method storageManager.get error: "+e)})})}},{key:"decryptMessage",value:function(e){var t=this;return new Promise(function(r,n){var o="handshake"===e.type;t._isToDecrypt(e).then(function(i){if(!i)return r(e);var s=$(e.to),a=D(s),c="hyperty"===U(e.from).type,u="hyperty"===U(e.to).type;if("update"===e.type)return r(e);if(c&&u){var l=t._registry.getHypertyOwner(e.to);if(l){var f=t.chatKeys[e.to+"<->"+e.from];if(f||(f=t._newChatCrypto(e,l,"decrypt"),t.chatKeys[e.to+"<->"+e.from]=f),f.authenticated&&!o){var d=Z(e.body.value),y=ee(d.iv),h=ee(d.value),p=ee(d.hash);t.crypto.decryptAES(f.keys.hypertyToSessionKey,h,y).then(function(n){e.body.value=n;var o=t._filterMessageToHash(e,n+y);t.crypto.verifyHMAC(f.keys.hypertyToHashKey,o,p).then(function(t){e.body.assertedIdentity=!0,r(e)})})}else o?t._doHandShakePhase(e,f).then(function(r){"handShakeEnd"===r||(t.chatKeys[e.to+"<->"+e.from]=r.chatKeys,t._messageBus.postMessage(r.message))}):n("wrong message do decrypt")}else n("error on decrypt message")}else c&&a?t.storageManager.get("dataObjectSessionKeys").then(function(o){var i=(o=z(o||{}))?o[s]:null;if(i)if(i.isToEncrypt){var a=re(e.body.value),c=ee(a.iv),u=ee(a.value),l=ee(a.hash);t.crypto.decryptAES(i.sessionKey,u,c).then(function(o){var s=re(o);e.body.value=s;var a=t._filterMessageToHash(e,te(s)+te(c));t.crypto.verifyHMAC(i.sessionKey,a,l).then(function(t){to.log("Received message HMAC result",t),e.body.assertedIdentity=!0,r(e)}).catch(function(e){n("Message HMAC is invalid: "+e)})})}else e.body.assertedIdentity=!0,r(e);else e.body.assertedIdentity=!0,r(e)}):n("wrong message to decrypt")})})}},{key:"decryptDataObject",value:function(e,t){var r=this;return new Promise(function(n,o){if(!r.isToUseEncryption)return n(e);var i=$(t);r.storageManager.get("dataObjectSessionKeys").then(function(t){var s=(t=z(t))?t[i]:null;if(!s)return o("No dataObjectKey for this dataObjectURL:",i);if(!s.isToEncrypt)return n(e);var a=ee(e.iv),c=ee(e.value);r.crypto.decryptAES(s.sessionKey,c,a).then(function(e){var t={value:re(e),iv:Q(a)};return n(t)}).catch(function(e){o("On decryptDataObject from method encryptAES error: "+e)})})})}},{key:"_doMutualAuthenticationPhase1",value:function(e){var t=this;return new Promise(function(r,n){var o=e.to.split("/");o.pop();var i=o[0]+"//"+o[2]+"/"+o[3];t._doMutualAuthenticationPhase2(i,e.body.subscriber).then(function(){t._registry.registerSubscriber(i,e.body.subscriber),r()},function(e){n(e)})})}},{key:"_doMutualAuthenticationPhase2",value:function(e,t){to.info("doMutualAuthentication:sender ",e),to.info("doMutualAuthentication:receiver ",t);var r=this;return new Promise(function(n,o){var i,s=r._registry.getReporterURLSynchonous(e);s&&(i=e,e=s);var a={to:t,from:e,callback:void 0,body:{handshakePhase:"startHandShake",ignore:"ignoreMessage"}};if(!e||!t)return o("sender or receiver missing on doMutualAuthentication");var c=r.chatKeys[e+"<->"+t],u=r._registry.getHypertyOwner(e);if(u)if(c||(a.callback=function(e){n(e)},a.dataObjectURL=i,c=r._newChatCrypto(a,u),r.chatKeys[e+"<->"+t]=c),c.authenticated){var l={to:e,from:t};c.dataObjectURL=i,r._sendReporterSessionKey(l,c).then(function(e){r._messageBus.postMessage(e.message),n("exchange of chat sessionKey initiated")}).catch(function(e){o("On doMutualAuthentication from method _sendReporterSessionKey error: "+e)})}else r._doHandShakePhase(a,c);else o("Mutual authentication error: Hyperty owner could not be resolved")})}},{key:"_sendReporterSessionKey",value:function(e,t){var r=this;return new Promise(function(n,o){var i,s,a,c,u=r.dataObjectSessionKeys[t.dataObjectURL],l={};if(u)a=u.sessionKey;else{a=r.crypto.generateRandom(),r.dataObjectSessionKeys[t.dataObjectURL]={sessionKey:a,isToEncrypt:!0};var f=Y(r.dataObjectSessionKeys);r.storageManager.set("dataObjectSessionKeys",0,f).catch(function(e){o("On _sendReporterSessionKey from method storageManager.set(dataObjectSessionKeys...) error: "+e)})}try{s=Q({value:Q(a),dataObjectURL:t.dataObjectURL})}catch(e){return o("On _sendReporterSessionKey from method storageManager.set error valueToEncrypt: "+e)}c=r.crypto.generateIV(),l.iv=Q(c),r.crypto.encryptAES(t.keys.hypertyFromSessionKey,s,c).then(function(n){i={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"reporterSessionKey",value:Q(n)}};var o=r._filterMessageToHash(i,s+c,t.hypertyFrom.messageInfo);return r.crypto.hashHMAC(t.keys.hypertyFromHashKey,o)}).then(function(e){var r=Q({value:i.body.value,hash:Q(e),iv:l.iv});i.body.value=r,n({message:i,chatKeys:t})}).catch(function(e){o("On _sendReporterSessionKey from chained promises encryptAES error: "+e)})})}},{key:"_resolveDomain",value:function(e){return e?"domain-idp://"+e:"domain-idp://google.com"}},{key:"_doHandShakePhase",value:function(e,t){var r=this;return new Promise(function(n,o){var i,s,a,c,u=e.body.handshakePhase,l={};switch(to.info("handshake phase: ",u),u){case"startHandShake":t.keys.fromRandom=r.crypto.generateRandom();var f={type:"handshake",to:e.to,from:e.from,body:{handshakePhase:"senderHello",value:Q(t.keys.fromRandom)}};t.handshakeHistory.senderHello=r._filterMessageToHash(f,void 0,t.hypertyFrom.messageInfo),t.initialMessage?n({message:f,chatKeys:t}):(r.chatKeys[e.from+"<->"+e.to]=t,r._messageBus.postMessage(f));break;case"senderHello":to.log("senderHello"),t.handshakeHistory.senderHello=r._filterMessageToHash(e),t.keys.fromRandom=ee(e.body.value),t.keys.toRandom=r.crypto.generateRandom();var d={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"receiverHello",value:Q(t.keys.toRandom)}};t.handshakeHistory.receiverHello=r._filterMessageToHash(d,void 0,t.hypertyFrom.messageInfo),n({message:d,chatKeys:t});break;case"receiverHello":to.log("receiverHello"),r.getMyPrivateKey().then(function(n){return c=n,t.handshakeHistory.receiverHello=r._filterMessageToHash(e),r._idm.validateAssertion(e.body.identity.assertion,void 0,e.body.identity.idp.domain)}).then(function(n){var o=ne("string"==typeof n.contents?n.contents:n.contents.nonce),i=r.crypto.generatePMS(),s=e.body.value;t.hypertyTo.assertion=e.body.identity.assertion,t.hypertyTo.publicKey=o,t.hypertyTo.userID=e.body.identity.userProfile.userURL,t.keys.toRandom=ee(s),t.keys.premasterKey=i;var a=r.crypto.concatPMSwithRandoms(i,t.keys.toRandom,t.keys.fromRandom);return r.crypto.generateMasterSecret(a,"messageHistoric"+t.keys.toRandom+t.keys.fromRandom)}).then(function(e){return t.keys.masterKey=e,r.crypto.generateKeys(e,"key expansion"+t.keys.toRandom+t.keys.fromRandom)}).then(function(n){t.keys.hypertyToSessionKey=new Uint8Array(n[0]),t.keys.hypertyFromSessionKey=new Uint8Array(n[1]),t.keys.hypertyToHashKey=new Uint8Array(n[2]),t.keys.hypertyFromHashKey=new Uint8Array(n[3]),i=r.crypto.generateIV(),l.iv=Q(i);var o={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"senderCertificate"}};return a=r._filterMessageToHash(o,"ok"+i,t.hypertyFrom.messageInfo),r.crypto.hashHMAC(t.keys.hypertyFromHashKey,a)}).then(function(e){return l.hash=Q(e),r.crypto.encryptAES(t.keys.hypertyFromSessionKey,"ok",i)}).then(function(e){return l.symetricEncryption=Q(e),r.crypto.encryptRSA(t.hypertyTo.publicKey,t.keys.premasterKey)}).then(function(n){l.assymetricEncryption=Q(n);var o={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"senderCertificate"}},i=r._filterMessageToHash(o,t.keys.premasterKey,t.hypertyFrom.messageInfo);return r.crypto.signRSA(c,Q(t.handshakeHistory)+Q(i))}).then(function(o){l.signature=Q(o);var s={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"senderCertificate",value:Q(l)}};t.handshakeHistory.senderCertificate=r._filterMessageToHash(s,"ok"+i,t.hypertyFrom.messageInfo),n({message:s,chatKeys:t})},function(e){return o(e)});break;case"senderCertificate":to.log("senderCertificate");var y=Z(e.body.value);r.getMyPrivateKey().then(function(t){return c=t,r._idm.validateAssertion(e.body.identity.assertion,void 0,e.body.identity.idp.domain)}).then(function(n){var o=ee(y.assymetricEncryption),i=ne("string"==typeof n.contents?n.contents:n.contents.nonce);return t.hypertyTo.assertion=e.body.identity.assertion,t.hypertyTo.publicKey=i,t.hypertyTo.userID=e.body.identity.userProfile.userURL,r.crypto.decryptRSA(c,o)},function(e){o("Error during authentication of identity: ",e.message)}).then(function(n){t.keys.premasterKey=new Uint8Array(n);var o=ee(y.signature),i=r._filterMessageToHash(e,t.keys.premasterKey);return r.crypto.verifyRSA(t.hypertyTo.publicKey,Q(t.handshakeHistory)+Q(i),o)}).then(function(e){var n=r.crypto.concatPMSwithRandoms(t.keys.premasterKey,t.keys.toRandom,t.keys.fromRandom);return r.crypto.generateMasterSecret(n,"messageHistoric"+t.keys.toRandom+t.keys.fromRandom)}).then(function(e){return t.keys.masterKey=e,r.crypto.generateKeys(e,"key expansion"+t.keys.toRandom+t.keys.fromRandom)}).then(function(e){t.keys.hypertyFromSessionKey=new Uint8Array(e[0]),t.keys.hypertyToSessionKey=new Uint8Array(e[1]),t.keys.hypertyFromHashKey=new Uint8Array(e[2]),t.keys.hypertyToHashKey=new Uint8Array(e[3]),i=ee(y.iv);var n=ee(y.symetricEncryption);return r.crypto.decryptAES(t.keys.hypertyToSessionKey,n,i)}).then(function(n){t.handshakeHistory.senderCertificate=r._filterMessageToHash(e,n+i);var o=ee(y.hash);return a=r._filterMessageToHash(e,n+i),r.crypto.verifyHMAC(t.keys.hypertyToHashKey,a,o)}).then(function(n){var o={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"receiverFinishedMessage"}};return i=r.crypto.generateIV(),l.iv=Q(i),a=r._filterMessageToHash(o,"ok!"+i,t.hypertyFrom.messageInfo),r.crypto.hashHMAC(t.keys.hypertyFromHashKey,a)}).then(function(e){return l.hash=Q(e),r.crypto.encryptAES(t.keys.hypertyFromSessionKey,"ok!",i)}).then(function(o){l.value=Q(o);var s={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"receiverFinishedMessage",value:Q(l)}};t.handshakeHistory.receiverFinishedMessage=r._filterMessageToHash(s,"ok!"+i,t.hypertyFrom.messageInfo),t.authenticated=!0,n({message:s,chatKeys:t})}).catch(function(e){o("On _doHandShakePhase from senderCertificate error: "+e)});break;case"receiverFinishedMessage":t.authenticated=!0,l=Z(e.body.value),i=ee(l.iv);var h=ee(l.value);s=ee(l.hash),r.crypto.decryptAES(t.keys.hypertyToSessionKey,h,i).then(function(a){t.handshakeHistory.receiverFinishedMessage=r._filterMessageToHash(e,a+i);var c=r._filterMessageToHash(e,a+i);r.crypto.verifyHMAC(t.keys.hypertyToHashKey,c,s).then(function(i){if(t.initialMessage){var s={type:"create",to:e.from,from:e.to,body:{value:t.initialMessage.body.value}};n({message:s,chatKeys:t})}else r._sendReporterSessionKey(e,t).then(function(e){n(e)}).catch(function(e){o("On _doHandShakePhase from receiverFinishedMessage error: "+e)})})});break;case"reporterSessionKey":to.log("reporterSessionKey");var p=Z(e.body.value);s=ee(p.hash),i=ee(p.iv);var v,g,b,m,_=ee(p.value);r.crypto.decryptAES(t.keys.hypertyToSessionKey,_,i).then(function(n){v=Z(n),g=ee(v.value),b=v.dataObjectURL;var o=r._filterMessageToHash(e,n+i);return r.crypto.verifyHMAC(t.keys.hypertyToHashKey,o,s)}).then(function(e){r.dataObjectSessionKeys[b]={sessionKey:g,isToEncrypt:!0};var n=Y(r.dataObjectSessionKeys);return r.storageManager.set("dataObjectSessionKeys",0,n).catch(function(e){o("On _sendReporterSessionKey from method reporterSessionKey error: "+e)}),i=r.crypto.generateIV(),l.iv=Q(i),r.crypto.encryptAES(t.keys.hypertyFromSessionKey,"ok!!",i)}).then(function(n){m={type:"handshake",to:e.from,from:e.to,body:{handshakePhase:"receiverAcknowledge"}},l.value=Q(n);var o=r._filterMessageToHash(m,"ok!!"+i,t.hypertyFrom.messageInfo);return r.crypto.hashHMAC(t.keys.hypertyFromHashKey,o)}).then(function(e){var r=Q({value:l.value,hash:Q(e),iv:l.iv});m.body.value=r,n({message:m,chatKeys:t})}).catch(function(e){o("On _doHandShakePhase from reporterSessionKey error: "+e)});break;case"receiverAcknowledge":to.log("receiverAcknowledge");var w=Z(e.body.value),O=ee(w.hash);i=ee(w.iv);var k=ee(w.value);r.crypto.decryptAES(t.keys.hypertyToSessionKey,k,i).then(function(n){var o=r._filterMessageToHash(e,n+i);return r.crypto.verifyHMAC(t.keys.hypertyToHashKey,o,O)}).then(function(e){var r=t.callback;r&&r("handShakeEnd"),n("handShakeEnd")}).catch(function(e){o("On _doHandShakePhase from receiverAcknowledge error: "+e)});break;default:o(e)}})}},{key:"_filterMessageToHash",value:function(e,t,r){return{type:e.type,from:e.from,to:e.to,body:{identity:r||e.body.identity,value:t||e.body.value,handshakePhase:e.body.handshakePhase}}}},{key:"_newChatCrypto",value:function(e,t,r){var n=r?e.to:e.from,o=r?e.from:e.to,i=this._idm.getIdentity(t);return{hypertyFrom:{hyperty:n,userID:i.userProfile.userURL,assertion:i.assertion,messageInfo:i},hypertyTo:{hyperty:o,userID:void 0,publicKey:void 0,assertion:void 0},keys:{hypertyToSessionKey:void 0,hypertyFromSessionKey:void 0,hypertyToHashKey:void 0,hypertyFromHashKey:void 0,toRandom:void 0,fromRandom:void 0,premasterKey:void 0,masterKey:void 0},handshakeHistory:{senderHello:void 0,receiverHello:void 0,senderCertificate:void 0,receiverFinishedMessage:void 0},initialMessage:e.body.ignore?void 0:e,callback:e.callback,authenticated:!1,dataObjectURL:e.dataObjectURL}}},{key:"getMyPublicKey",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.userDefaultKeyRef,t=this;return new Promise(function(r,n){t.storageManager.get(e).then(function(o){if(o)return r(o.public);t._generateAndStoreNewAsymetricKey(e).then(function(e){r(e.public)}).catch(function(e){to.error("[getMyPublicKey:_generateAndStoreNewAsymetricKey:err]: "+e.message),n(e)})}).catch(function(e){to.error("[getMyPublicKey:storageManager:err]: "+e.message),n(e)})})}},{key:"getMyPrivateKey",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.userDefaultKeyRef,t=this;return new Promise(function(r,n){t.storageManager.get(e).then(function(o){if(o)return r(o.private);t._generateAndStoreNewAsymetricKey(e).then(function(e){r(e.private)}).catch(function(e){to.error("[getMyPrivateKey:_generateAndStoreNewAsymetricKey:err]: "+e.message),n(e)})}).catch(function(e){to.error("[getMyPrivateKey:storageManager:err]: "+e.message),n(e)})})}},{key:"_generateAndStoreNewAsymetricKey",value:function(e){var t=this,r=void 0;return new Promise(function(n,o){var i={};i.private=G(),i.public=G(),to.log("_generateAndStoreNewAsymetricKey:userAsymmetricKeyGenerated",i),r=i,t.storageManager.set(e,0,i),n(r)}).catch(function(e){to.error("[_generateAndStoreNewAsymetricKey:err]: "+e.message),reject(e)})}},{key:"messageBus",get:function(){return this._messageBus},set:function(e){this._messageBus=e,this.addCryptoGUIListeners()}},{key:"coreDiscovery",get:function(){return this._coreDiscovery},set:function(e){this._coreDiscovery=e}},{key:"registry",get:function(){return this._registry},set:function(e){this._registry=e}}]),e}());function no(e,t){for(var r=0;r1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2?arguments[2]:void 0;if(arguments.length>3&&arguments[3],!this._readyToUse())return!1;if(!e)throw new Error("[Runtime.Loader] hypertyClass parameter is needed");var s=!1,a=new e,c=a.name;return new Promise(function(e,u){var l=function(e){s=!0,u(e)};oo.info("[Runtime.Loader.loadHyperty] ",c);var f=a.descriptor;f.dataObjects[0]=f.dataObjects[0].replace("%domain%",n._registry._domain),oo.info("[Runtime.Loader] 1: return hyperty descriptor: ",f),r=n.registry.getAppSandbox(),n._addressAllocation.create(n._registry._domain,1,f,"hyperty",o).then(function(e){return!s&&(oo.info("[Runtime.Loader] 6: return the addresses for the hyperty",e),n.registry.registerHyperty(r,c,f,e,i))},l).then(function(e){if(s)return!1;oo.info("[Runtime.Loader] 7: registration result",e),t=e.url;var o={};if(!C(f.configuration))try{o=Object.assign({},JSON.parse(f.configuration))}catch(e){o=f.configuration}o.runtimeURL=n._runtimeURL,e.p2pHandler&&(o.p2pHandler=e.p2pHandler,o.p2pRequester=e.p2pRequester);try{return r.deployComponent(a,t,o)}catch(e){oo.info("[Runtime.Loader] Error on deploy component:",e),u(e)}},l).then(function(o){if(s)return!1;oo.info("[Runtime.Loader] 8: Deploy component status for hyperty: ",o),n.messageBus.addListener(t,function(e){r.postMessage(e)}),n.messageBus.addListener(n.runtimeURL+"/status",function(e){r.postMessage(e)});var i={runtimeHypertyURL:t,status:o,name:c,instance:a};oo.info("[Runtime.Loader] Hyperty deployed: ",i),e(a),oo.info("[Runtime.Loader] ------------------ END ------------------------")},l).catch(function(e){oo.info("[Runtime.Loader] Something failed on the deploy hyperty: ",e),u(e)})})}},{key:"loadStub",value:function(e,t){var r=this;if(!this._readyToUse())return!1;if(!e)throw new Error("[Runtime.Loader.loadStub]ProtoStub descriptor url parameter is needed");return new Promise(function(n,o){var i,s,a,c,u=U(e).domain;u||(u=e);var l,f,d=!1,y=function(e){oo.info("[Runtime.Loader.loadStub]Something failed on the deploy of protocolstub: ",e),o(e)},h=function(e){d=!0,o(e)},p={};oo.info("[Runtime.Loader.loadStub] starting loading for ",e," with p2pconfig ",t),oo.info("[Runtime.Loader.loadStub]Discover or Create a new ProtoStub for domain: ",u);try{if(t)if(t.hasOwnProperty("isHandlerStub")&&t.isHandlerStub)l=r.runtimeURL,f=r.registry.discoverP2PStub();else{var v=t.remoteRuntimeURL;l=v,f=r.registry.discoverP2PStub(v)}else l=u,f=r.registry.discoverProtostub(u);oo.info("[Runtime.Loader.loadStub]1. Proto Stub Discovered for ",e,": ",f),n(f),oo.info(" [Runtime.Loader]------------------- END ---------------------------\n")}catch(f){oo.info("[Runtime.Loader.loadStub]1. Proto Stub not found "+f),r.descriptors.getStubDescriptor(e).then(function(e){if(d)return!1;oo.info("[Runtime.Loader.loadStub]2. return the ProtoStub descriptor"),s=e;var t=e.sourcePackageURL;return"/sourcePackage"===t?e.sourcePackage:r.runtimeCatalogue.getSourcePackageFromURL(t)},h).catch(y).then(function(e){return!d&&(s&&s.constraints&&(p=s.constraints),oo.info("[Runtime.Loader.loadStub]3. return the ProtoStub Source Code"),c=e,r.registry.getSandbox(u,p))}).then(function(e){return!d&&(oo.info("[Runtime.Loader.loadStub]4. if the sandbox is registered then return the sandbox ",e),i=e,e)}).catch(function(e){return!d&&(oo.info("[Runtime.Loader.loadStub]5. Sandbox was not found, creating a new one ",e),r._runtimeFactory.createSandbox(p).then(function(e){return e.addListener("*",function(e){r.messageBus.postMessage(e)}),e}))}).then(function(n){return!d&&(oo.info("[Runtime.Loader.loadStub]6. return the sandbox instance and register",n,"to domain ",u),i=n,r.registry.registerStub(i,l,t,e,s))},h).then(function(e){if(d)return!1;oo.info("[Runtime.Loader.loadStub] 7. return the runtime protostub url: ",e),a=e.url;var n={};if(!C(s.configuration))try{n=Object.assign({},JSON.parse(s.configuration))}catch(e){n=s.configuration}if(t)try{n=Object.assign(n,JSON.parse(t))}catch(e){n=Object.assign(n,t)}n.runtimeURL=r._runtimeURL;try{return oo.info("[Runtime.Loader.loadStub] 8: adding sandbox listener to protostubURL : ",a),r.messageBus.addListener(a,function(e){i.postMessage(e)}),i.deployComponent(c.sourceCode,a,n)}catch(e){oo.error("[Runtime.Loader.loadStub] Error on deploy component:",e),o(e)}},h).then(function(){if(d)return!1;var e;t?(oo.log("[Runtime.Loader.loadStub] p2pConfig: ",t),t.hasOwnProperty("isHandlerStub")&&(e=r.registry.p2pHandlerStub[r._runtimeURL]),t.hasOwnProperty("p2pRequesterStub")&&(e=r.registry.p2pRequesterStub[t.remoteRuntimeURL])):e=r.registry.protostubsList[u],oo.log("[Runtime.Loader.loadStub] Stub: ",e),n(e),oo.info("[Runtime.Loader.loadStub]------------------- END ---------------------------\n")},h).catch(y)}})}},{key:"loadIdpProxy",value:function(e){var t=this;if(!this._readyToUse())return!1;if(!e)throw new Error("[Runtime.Loader] IdpProxy descriptor url parameter is needed");return new Promise(function(r,n){var o,i,s,a,c=U(e).domain;c||(c=e);var u=!1,l=function(e){u=!0,n(e)};oo.info("[Runtime.Loader] ------------------- IDP Proxy Deploy ---------------------------\n"),oo.info("[Runtime.Loader] Discover or Create a new IdpProxy for domain/URL: ",c);try{var f=t.registry.discoverIdpProxy(c);oo.info("[Runtime.Loader] 1. IDPProxy Discovered: ",f);var d=t.registry.idpProxyList[c];oo.log("Deployed: ",d),r(d),oo.info("[Runtime.Loader] ------------------- END ---------------------------\n")}catch(f){oo.info("[Runtime.Loader] 1. IdpProxy not found:",f),t.descriptors.getIdpProxyDescriptor(e).then(function(e){oo.info("[Runtime.Loader] 2. Return the IDPProxy descriptor"),i=e;var r=e.sourcePackageURL;return"/sourcePackage"===r?e.sourcePackage:t.runtimeCatalogue.getSourcePackageFromURL(r)},l).then(function(e){return!u&&(oo.info("[Runtime.Loader] 3. return the IDPProxy source package"),a=e,!0)},l).then(function(e){return!u&&t.registry.getSandbox(c)}).then(function(e){return!u&&(oo.info("[Runtime.Loader] 4. if the sandbox is registered then return the sandbox",e),o=e,e)}).catch(function(e){return!u&&(oo.info("[Runtime.Loader] 5. Sandbox was not found, creating a new one",e),i&&i.hasOwnProperty("capabilities")&&(i=i.stubCapabilities),t._runtimeFactory.createSandbox({}).then(function(e){return e.addListener("*",function(e){t.messageBus.postMessage(e)}),e}))}).then(function(e){return!u&&(oo.info("[Runtime.Loader] 6. return the sandbox instance and register",e,"to domain ",c),o=e,t.registry.registerIdpProxy(e,c))},l).then(function(e){if(u)return!1;oo.info("[Runtime.Loader] 7. Return the runtime Idp Proxy URL: ",e),s=e;var r={};if(!C(i.configuration))try{r=Object.assign({},JSON.parse(i.configuration))}catch(e){r=i.configuration}r.runtimeURL=t._runtimeURL;try{return t.messageBus.addListener(s,function(e){o.postMessage(e)}),o.deployComponent(a.sourceCode,e,r)}catch(e){oo.info("[Runtime.Loader] Error on deploy component:",e),n(e)}},l).then(function(){if(u)return!1;var e=t.registry.idpProxyList[c];oo.log("[Runtime.Loader.loadIdpProxy] 8: loaded: ",e),r(e),oo.info("[Runtime.Loader.loadIdpProxy] ------------------- END ---------------------------\n")},l).catch(function(e){oo.info("[Runtime.Loader] Something failed on the deploy of IdpProxy: ",e),n(e)})}})}},{key:"_readyToUse",value:function(){if(!this._runtimeURL)throw new Error("[Runtime.Loader] The loader need the runtime url address");if(!this._messagesBus)throw new Error("[Runtime.Loader] The loader need the messageBus component");if(!this._registry)throw new Error("[Runtime.Loader] The loader need the registry component");if(!this._runtimeFactory)throw new Error("[Runtime.Loader] The loader need the runtime factory component");return!0}},{key:"runtimeURL",set:function(e){this._runtimeURL=e},get:function(){return this._runtimeURL}},{key:"registry",set:function(e){this._registry=e;var t=mr.instance;this._addressAllocation=t,oo.log("[Loader - AddressAllocation] - ",t)},get:function(){return this._registry}},{key:"messageBus",set:function(e){this._messagesBus=e},get:function(){return this._messagesBus}},{key:"runtimeFactory",set:function(e){this._runtimeFactory=e},get:function(){return this._runtimeFactory}}]),e}(),so={};function ao(e,t,r,n){var o=arguments.length>4&&void 0!==arguments[4]&&arguments[4];if(!t)throw new Error("The runtime factory is a needed parameter");var i=o||Wr.remoteStorage;return t.storageManager(e,r,n,i)}function co(e,t){for(var r=0;r-1?s.body.resource=e:s.body.resource="/hyperty/idp-identifier/"+e,t.length>0&&(s.body.criteria||(s.body.criteria={}),s.body.criteria.dataSchemes=t),r.length>0&&(s.body.criteria||(s.body.criteria={}),s.body.criteria.resources=r),new Promise(function(e,t){i.messageBus.postMessage(s,function(r){if(200!==r.body.code&&500!==r.body.code)return t("No Hyperty was found");var n=r.body.value,o=[];for(var i in n)o.push(n[i]);if(!(o.length>0))return t("No Hyperty was found");e(o)})})}},{key:"discoverDataObjects",value:function(e,t,r,n){var o,i=this,s=[];return o=n||i.domain,new Promise(function(n,a){i.discoverHyperties(e,[],[],o).then(function(e){var c=[];for(var u in e)c.push(e[u]);var l=c.map(function(e){return new Promise(function(n,s){i.discoverDataObjectsPerReporter(e.hypertyID,t,r,o).then(function(e){n(e)}).catch(function(e){n([])})})});Promise.all(l).then(function(e){[].concat.apply([],e).forEach(function(e){s.push(e)});var t=[];for(var r in s)t.push(s[r]);if(0===t.length)return a("No dataObjects were found");n(t)})}).catch(function(e){return a(e)})})}},{key:"discoverHypertyPerURL",value:function(e,t){var r,n=this;r=t||n.domain;var o={type:"read",from:n.discoveryURL,to:"domain://registry."+r,body:{resource:e}};return new Promise(function(e,t){n.messageBus.postMessage(o,function(r){if(200!==r.body.code&&500!==r.body.code)return t("No Hyperty was found");var n=r.body.value;if(!n)return t("No Hyperty was found");e(n)})})}},{key:"discoverDataObjectPerURL",value:function(e,t){var r,n=this;r=t||n.domain;var o={type:"read",from:n.discoveryURL,to:"domain://registry."+r,body:{resource:e}};return new Promise(function(e,t){n.messageBus.postMessage(o,function(r){var n=r.body.value;if(!n)return t("DataObject not found");e(n)})})}},{key:"discoverDataObjectsPerName",value:function(e,t,r,n){var o,i=this;o=n||i.domain;var s={type:"read",from:i.discoveryURL,to:"domain://registry."+o,body:{resource:e}};return t.length>0&&(s.body.criteria||(s.body.criteria={}),s.body.criteria.dataSchemes=t),r.length>0&&(s.body.criteria||(s.body.criteria={}),s.body.criteria.resources=r),new Promise(function(e,t){i.messageBus.postMessage(s,function(r){var n=r.body.value,o=[];for(var i in n)o.push(n[i]);if(!(o.length>0))return t("No DataObject was found");e(o)})})}},{key:"discoverDataObjectsPerReporter",value:function(e,t,r,n){var o,i=this;o=n||i.domain;var s={type:"read",from:i.discoveryURL,to:"domain://registry."+o,body:{resource:"/comm",criteria:{reporter:e}}};return t.length>0&&(s.body.criteria.dataSchemes=t),r.length>0&&(s.body.criteria.resources=r),new Promise(function(e,t){i.messageBus.postMessage(s,function(r){var n=r.body.value,o=[];for(var i in n)o.push(n[i]);if(!(o.length>0))return t("No DataObject was found");e(o)})})}},{key:"discoverUserIdsPerGUID",value:function(e){var t=this;return new Promise(function(r,n){t.graphConnector.queryGlobalRegistry(e).then(function(e){if("string"==typeof e||!e)return n("Unsuccessful discover userIDs by GUID");var t=e.userIDs;if(0===t.length)return n("UserIDs not available");r(t)}).catch(function(e){return n(e)})})}},{key:"discoverGUIDPerUserIdentifier",value:function(e){var t=this;return new Promise(function(r,n){t.httpRequest.get("https://rethink.tlabscloud.com/discovery/rest/discover/lookup?searchquery="+e).then(function(e){var t=JSON.parse(e).results.filter(function(e){return null!=e.rethinkID});if(0===t.length)return n("Unsuccessful discover GUID by user identifier");var o=t.map(function(e){return e.rethinkID});return r(o)}).catch(function(e){return n(e)})})}},{key:"messageBus",get:function(){return this._messageBus},set:function(e){this._messageBus=e}}]),e}();function bo(e){return(bo="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function mo(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,o=arguments.length>3?arguments[3]:void 0;if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),!t)throw new Error("[Store Data Objects] - Needs the storageManager component");this._storageManager=t,this._storeDataObject=r,this._cache={},this._createSyncDB=ao,this._remotes={},this._factory=n,this._table="syncherManager:ObjectURLs",this._remoteStorageTable="dataObjectStorage",this._remoteSchema="url",this._runtimeStatusUpdate=o}return function(e,t,r){t&&mo(e.prototype,t)}(e,[{key:"loadRemote",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],r=this;return new Promise(function(n,o){var i=[],s=[];r._storageManager.get(null,null,"remotes").then(function(a){_o.info("[StoreDataObjects.loadRemote] remotes: ",a),a||n(),t||(r._remotes=a),_o.info("[StoreDataObjects.loadRemote] loading: ",r._remotes);var c=Object.keys(a);0===c.length&&n(),c.forEach(function(t){var n={},o=t.split("/")[3];n[o]=e._remoteSchema,r._remotes[t]=ao(t,e._factory,n,e._runtimeStatusUpdate),i.push(r._remotes[t].get(null,null,o))}),Promise.all(i).then(function(){_o.log("[StoreDataObjects.loadRemote] loaded. Starting init"),Object.keys(r._remotes).forEach(function(e){var t=e.split("/")[3];s.push(r._remotes[e].get(null,null,t))}),Promise.all(s).then(function(t){0===t.length&&n(),t.forEach(function(t){Object.keys(t).forEach(function(n){_o.log("[StoreDataObjects.loadRemote] loaded remote ",t[n]);var o=e._getTypeOfObject(t[n].isReporter);r._storeDataObject||(r._storeDataObject={}),r._storeDataObject.hasOwnProperty(o)||(r._storeDataObject[o]={}),r._storeDataObject[o][n]=t[n]})}),n(r._storeDataObject)},function(e){o(e)})})},function(e){o(e)}),n()})}},{key:"deleteRemotes",value:function(){var e=this;return new Promise(function(t,r){var n=[];e._storageManager.get(null,null,"remotes").then(function(r){_o.info("[StoreDataObjects.deleteRemotes] remotes: ",r),r||t();var o=Object.keys(e._remotes);0===o.length&&t(),o.forEach(function(t){n.push(e._remotes[t].disconnect()),n.push(e._remotes[t].delete())}),Promise.all(n).then(function(){_o.log("[StoreDataObjects.deleteRemotes] deleted."),t()},function(e){t()})}),t()})}},{key:"set",value:function(e){var t=this;return new Promise(function(r,n){var o=t._storeDataObject?t._storeDataObject:{},i=t._getTypeOfObject(e.isReporter);o.hasOwnProperty(i)||(o[i]={}),o[i].hasOwnProperty(e.url)||(o[i][e.url]={},o[i][e.url].subscriptions=[],o[i][e.url].subscriberUsers=[],o[i][e.url].childrenObjects={},o[i][e.url].data={}),Object.assign(o[i][e.url],e),delete o[i][e.url].subscriberUser,delete o[i][e.url].subscriberHyperty,o[i][e.url].backup=!!e.hasOwnProperty("backup")&&e.backup,e.subscriberHyperty&&!e.isReporter&&t._updateToArray(o[i],e.url,"subscriptions",e.subscriberHyperty),e.subscriberUser&&o[i][e.url].subscriberUsers.indexOf(e.subscriberUser)&&t._updateToArray(o[i],e.url,"subscriberUsers",e.subscriberUser),t._storeDataObject=o;var s=!!e.hasOwnProperty("backup")&&e.backup,a=s?e.url:t._table,c=s?a.split("/")[3]:t._table;if(s&&!t._remotes[a]){var u={};u[c]=t._remoteSchema,t._remotes[a]=ao(a,t._factory,u,t._runtimeStatusUpdate)}s&&t._storageManager.set(e.url,0,e.url,"remotes");var l=s?t._remotes[a]:t._storageManager;if(e.isReporter&&s){var f={table:c};l.connect(f).then(function(){l.set(a,0,o[i][e.url],c).then(function(){r(o[i][e.url])},function(n){_o.error("[DataObjectStorage.set] failed to save into remote storage: ",n),t._connectToRemoteThread(l,f,a,o[i][e.url],c),r(o[i][e.url])})},function(n){_o.error("[DataObjectStorage.set] failed to connect with remote storage: ",n," trying again..."),t._connectToRemoteThread(l,f,a,o[i][e.url],c),r(o[i][e.url])})}else l.set(a,1,t._filterRemotes(o),c).then(function(){r(o[i][e.url])})})}},{key:"_connectToRemoteThread",value:function(e,t,r,n,o){var i,s=!1;i=setInterval(function(){s||function(n){_o.error("[DataObjectStorage._connectToRemote] trying to connect to remote storage ... "),e.connect(t).then(function(){e.set(r,0,n,o).then(function(){s=!0,clearInterval(i)},function(e){_o.error("[DataObjectStorage._connectToRemote] failed to save into remote storage: ",e)})},function(e){_o.error("[DataObjectStorage._connectToRemote] failed to connect to remote storage: ",e)})}(n)},5e3)}},{key:"_filterRemotes",value:function(e){var t=Object.keys(this._remotes),r=A(e);return t.forEach(function(e){r.reporters[e]?delete r.reporters[e]:delete r.observers[e]}),console.log("[DataObjectStorage._filterRemotes] ",r),r}},{key:"saveData",value:function(e,t,r,n,o){var i=this._storeDataObject,s=this._getTypeOfObject(e);if(i&&i[s]&&i[s][t]){var a;_o.log("[StoreDataObjects - saveData] - ",e,s,t,r,n),i[s][t].hasOwnProperty("data")||(i[s][t].data={}),r?(a="object"===bo(n)?A(n):n,V(i[s][t].data,r,a)):i[s][t].data=A(n)||{},this._storeDataObject=i;var c=i[s][t].backup?i[s][t].url:"syncherManager:ObjectURLs",u=i[s][t].backup?this._remotes[c]:this._storageManager,l=i[s][t].backup?c.split("/")[3]:this._table,f=i[s][t].backup?i[s][t]:this._filterRemotes(i);u.set(c,1,f,l,o).then(function(){return i[s][t]},function(e){return console.error(e),i[s][t]})}else _o.log("[StoreDataObjects - save data] - not saved")}},{key:"saveChildrens",value:function(e,t,r,n){var o=this._storeDataObject,i=this._getTypeOfObject(e);if(o&&o[i]&&o[i][t]){o[i][t].hasOwnProperty("childrens")||(o[i][t].childrenObjects={}),r?V(o[i][t].childrenObjects,r,A(n)):o[i][t].childrenObjects=A(n)||{},this._storeDataObject=o;var s=o[i][t].backup?o[i][t].url:"syncherManager:ObjectURLs",a=o[i][t].backup?this._remotes[s]:this._storageManager,c=o[i][t].backup?s.split("/")[3]:this._table,u=o[i][t].backup?o[i][t]:this._filterRemotes(o);a.set(s,1,u,c).then(function(){return o[i][t]})}else _o.log("[StoreDataObjects - save childrens] - not saved")}},{key:"update",value:function(e,t,r,n,o){var i=this._storeDataObject,s=this._getTypeOfObject(e);if(i&&i[s]&&i[s][t]){if(_o.log("[StoreDataObjects - update] - ",e,s,t,r,n),i[s]&&i[s][t]&&t&&r&&n){if("subscriptions"===r||"subscriberUsers"===r){var a=!0;"subscriptions"===r&&(a=!this._isOwner(i[s][t],n)),a&&this._updateToArray(i[s],t,r,n)}else i[s][t][r]=n;this._storeDataObject=i;var c=i[s][t].backup?i[s][t].url:"syncherManager:ObjectURLs",u=i[s][t].backup?this._remotes[c]:this._storageManager,l=i[s][t].backup?c.split("/")[3]:this._table,f=i[s][t].backup?i[s][t]:this._filterRemotes(i);u.set(c,1,f,l,o).then(function(){return i[s][t]})}}else _o.log("[StoreDataObjects - update] - not saved")}},{key:"delete",value:function(e,t,r,n){var o=this._storeDataObject,i=this._getTypeOfObject(e);if(o&&o[i]&&o[i][t]){if(o[i]&&o[i][t]&&t&&r&&n){"subscriptions"===r||"subscriberUsers"===r?this._removeFromArray(o[i],t,r,n):delete o[i][t][r],this._storeDataObject=o;var s=o[i][t].backup?o[i][t].url:"syncherManager:ObjectURLs",a=o[i][t].backup?this._remotes[s]:this._storageManager,c=o[i][t].backup?s.split("/")[3]:this._table,u=o[i][t].backup?o[i][t]:this._filterRemotes(o);return a.set(s,1,u,c),o[i][t]}}else _o.log("[StoreDataObjects - delete] - not saved")}},{key:"deleteResource",value:function(e){var t=this,r=this;return new Promise(function(n,o){var i,s,a;if(e)return _o.info("[DataObjectStorage.deleteResource] deleting: ",e),r._storeDataObject.hasOwnProperty("observers")&&r._storeDataObject.observers.hasOwnProperty(e)&&(i=!!r._storeDataObject.observers[e].backup,s=i?r._storeDataObject.observers[e].url:"syncherManager:ObjectURLs",a=i?r._remotes[s]:r._storageManager,delete r._storeDataObject.observers[e]),r._storeDataObject.hasOwnProperty("reporters")&&r._storeDataObject.reporters.hasOwnProperty(e)&&(i=!!r._storeDataObject.reporters[e].backup,s=i?r._storeDataObject.reporters[e].url:"syncherManager:ObjectURLs",a=i?r._remotes[s]:r._storageManager,delete r._storeDataObject.reporters[e]),i&&a?a.delete().then(function(){delete r._remotes[s],r._storageManager.delete(e,null,"remotes")}):a.set(s,1,t._filterRemotes(r._storeDataObject)),n();o(new Error("[StoreDataObjects] - Can't delete this "+e))})}},{key:"getAll",value:function(){var e=this,t=this;return new Promise(function(r,n){t._storeDataObject=e._storageManager.get("syncherManager:ObjectURLs").then(function(e){t._storeDataObject=e,t.loadRemote(!0).then(function(e){r(t._storeDataObject)})})})}},{key:"sync",value:function(e,t){var r=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],n=this;if(n._remotes[e]){var o=e.split("/")[3];if(t)return n._sync(e,t,r,o);n._remotes[e].getBackupRevision(e).then(function(t){return n._sync(e,t,r,o)})}else{var i="[DataObjectStorage.sync] Info: "+e+" is not synched with remote storage.";_o.info(i)}}},{key:"_sync",value:function(e,t,r,n){var o=this;return console.log("[DataObjectStorage._sync] backupRevision: ",t),new Promise(function(i,s){var a={table:n,observer:!1,syncedRevision:t+3};o._remotes[e].connect(a).then(function(){_o.info("[DataObjectStorage.sync] connected with remote "),o._remotes[e].get(null,null,n).then(function(t){_o.info("[DataObjectStorage.sync] returning synched DO: ",t),r&&setTimeout(function(){o._remotes[e].disconnect().then(function(){_o.info("[DataObjectStorage.sync] disconnected ")},function(e){_o.error("[DataObjectStorage.sync] Error synching with remote storage"),s(e)})},2e3),i(t[e])},function(e){_o.error("[DataObjectStorage.sync] Error retrieving stored data object"),s(e)})},function(t){_o.error("[DataObjectStorage.sync] Error connecting to remote storage ",t),o._remotes[e].get(null,null,n).then(function(t){_o.info("[DataObjectStorage.sync] returning synched DO: ",t),i(t[e])})})})}},{key:"stopSync",value:function(e){this._remotes[e]&&this._remotes[e].disconnect()}},{key:"getDataObject",value:function(e){var t=this;return new Promise(function(r,n){var o,i=t._storeDataObject,s=i.hasOwnProperty("observers")?i.observers:{},a=i.hasOwnProperty("reporters")?i.reporters:{},c=Object.keys(a).find(function(t){return t===e}),u=Object.keys(s).find(function(t){return t===e});return u&&(o=i.observers[u]),c&&(o=i.reporters[c]),_o.info("[StoreDataObjects - getDataObject] - for observer: ",u),_o.info("[StoreDataObjects - getDataObject] - for reporters: ",c),_o.info("[StoreDataObjects - getDataObject] - resolve: ",o),o?r(o):n("No dataObject was found")})}},{key:"getResourcesByCriteria",value:function(e,t){var r=this;return new Promise(function(n){var o=r._getTypeOfObject(t),i=r._storeDataObject;if(!i)return _o.log("[DataObjectsStorage.getResourcesByCriteria] don't have stored data objects"),n(null);if(e.body&&e.body.hasOwnProperty("resume")&&!e.body.resume)return n(null);var s,a=[],c=r._hasSubscription(i[o],e.from),u=r._searchOwner(i[o],e.from),l=r._checkProtostubResume(i,e);if(_o.log("[StoredDataObjects - getResourcesByCriteria]:",i,e,c,u),!(e.hasOwnProperty("from")&&c||u||l))return n(null);s=u?r._getResourcesByOwner(i[o],e.from):r._getResourcesBySubscription(i[o],e.from);var f=[];e.body&&e.body.identity&&(f=r._getResourcesByIdentity(i[o],e.body.identity));var d=[];e.body&&e.body.schema&&(d=r._getResourcesBySchema(i[o],e.body.schema));var y=[];if(e.body&&e.body.value){var h=e.body.value;delete h.data,y=r._getResourcesByMetadata(i[o],h)}var p=[];if(e.body&&e.body.value&&e.body.value.data&&(p=r._getResourcesByData(i[o],e.body.value.data)),0==(a=r._intersection(s,f,d,p,y)).length&&l&&"observers"==o&&e.from.split("protostub").length>0){var v=i[o],g=U(e.from).domain;Object.keys(v).filter(function(e){v[e].subscriptions.forEach(function(t){U(t).domain==g&&a.push(e)})})}var b={};a.forEach(function(e){var t=i[o][e];return b[e]=t,b}),_o.log("[Store Data Objects] - ",b),n(b)})}},{key:"_getResourcesByIdentity",value:function(e,t){return e?Object.keys(e).filter(function(r){return e[r].subscriberUsers.filter(function(e){return e===t}).length}):[]}},{key:"_getResourcesByOwner",value:function(e,t){return e?Object.keys(e).filter(function(r){return e[r].reporter===t}):[]}},{key:"_getResourcesBySubscription",value:function(e,t){return e?Object.keys(e).filter(function(r){return e[r].subscriptions.filter(function(e){return e===t}).length}):[]}},{key:"_getResourcesBySchema",value:function(e,t){return Object.keys(e).filter(function(r){var n=e[r];return Object.keys(n).filter(function(e){return"schema"===e&&n[e]===t}).length})}},{key:"_getResourcesByMetadata",value:function(e,t){return t?Object.keys(e).filter(function(r){var n=e[r];return Object.keys(n).filter(function(e){return Object.keys(t).filter(function(r){return e===r&&n[e]===t[r]}).length}).length}):[]}},{key:"_getResourcesByData",value:function(e,t){return t?Object.keys(e).filter(function(r){var n=e[r].hasOwnProperty("data")?e[r].data:{};return Object.keys(n).filter(function(e){return Object.keys(t).filter(function(r){return e===r&&n[e]===t[r]}).length}).length}):[]}},{key:"_hasSubscription",value:function(e,t){return!!e&&Object.keys(e).filter(function(r){return e[r].subscriptions.filter(function(e){return e===t}).length}).length>0}},{key:"_searchOwner",value:function(e,t){return!!e&&Object.keys(e).filter(function(r){return e[r].reporter===t}).length>0}},{key:"_checkProtostubResume",value:function(e,t){if(!e)return!1;if(t.hasOwnProperty("body")&&t.body.hasOwnProperty("value")&&t.body.value.hasOwnProperty("reporter")){var r=t.body.value.reporter;if(e.hasOwnProperty("reporters")){var n=e.reporters;return Object.keys(n).filter(function(e){return n[e].reporter===r}).length>0}return!1}if(e.hasOwnProperty("observers")){var o=e.observers,i=U(t.from).domain;return Object.keys(o).filter(function(e){var t=!1;if(o[e].subscriptions.forEach(function(e){U(e).domain==i&&(t=!0)}),t)return!0}).length>0}}},{key:"_isOwner",value:function(e,t){return!!e&&e.reporter===t}},{key:"_intersection",value:function(){var e=Array.from(arguments).reduce(function(e,t){return e.concat(t)}).filter(function(e,t,r){return r.indexOf(e)===t});return _o.log("DataObjectsStorage._intersection] Result an unique array of strings: ",e),e}},{key:"_updateToArray",value:function(e,t,r,n){_o.log("[DataObjectsStorage] - _updateToArray: ",e,t,r,n),-1===e[t][r].indexOf(n)&&e[t][r].push(n)}},{key:"_removeFromArray",value:function(e,t,r,n){var o=e[t][r].indexOf(n);-1===o&&e[t][r].splice(o,1)}},{key:"_hasValue",value:function(e,t,r){return e.hasOwnProperty(t)&&e[t]===r}},{key:"_getTypeOfObject",value:function(e){return e?"reporters":"observers"}}]),e}();function Oo(e,t){for(var r=0;re.quota){var t="The storage do not have space to store that resource";throw s(t),Error(t)}var o=e.quota,i=e.usage+r.size;return!(e.percent>=n._storageLimit||i>o)||n._getOlderResources(r.size)}).then(function(){return n._storageManager.set(e,1,r)}).then(function(){var r={from:t.to,to:t.from,id:t.id,type:"response",body:{value:e,code:200}};return n._bus.postMessage(r),Po.log("Success"),o()}).catch(s)})}},{key:"_getOlderResources",value:function(e){var t=this;return new Promise(function(r,n){t._storageManager.get().then(function(o){var i=0,s=Object.keys(o).sort(function(e,t){return o[e].created0){var s=[];Object.keys(i).forEach(function(t){s.push(o._resumeCreate(e,i[t]))}),Promise.all(s).then(function(o){Do.log("[SyncherManager - Create Resumed]",o);var i=Object.values(o).filter(function(e){return!1!==e});Do.info("[SyncherManager.onCreate] returning resumed objects : ",i),t._bus.postMessage({id:e.id,type:"response",from:n,to:r,body:{code:200,value:A(i)}})})}else{var a={};a.id=e.id,a.from=e.to,a.to=e.from,a.type="response",a.body={code:404,desc:"No data objects reporters to be resumed"},t._bus.postMessage(a)}})}},{key:"_storeChildrens",value:function(e){var t=e.body.resource,r=e.body.attribute;"childrenObjects"===r?this._dataObjectsStorage.saveChildrens(!1,t,void 0,e.body.value):this._dataObjectsStorage.saveChildrens(!0,t,r,e.body.value)}},{key:"_newCreate",value:function(e){var t=this,r=this,n=e.from,o=U(e.from).domain;r._registry.isInterworkingProtoStub(e.from)&&(o=U(r.runtimeURL).domain);var i=!e.body.value.hasOwnProperty("domain_routing")||e.body.value.domain_routing;r._catalog.getDataSchemaDescriptor(e.body.schema).then(function(s){var a=s.sourcePackage.sourceCode.properties,c=a.scheme?a.scheme:"resource",u=a.childrens?a.childrens:[],l={name:e.body.value.name,schema:e.body.value.schema,reporter:e.body.value.reporter,resources:e.body.value.resources},f=e.body.value.resource;r._allocator.create(o,1,l,c,f).then(function(o){var s=A(e.body.value);s.url=o.address[0],s.authorise=e.body.authorise,s.childrens=u,delete s.data,Do.log("[SyncherManager._newCreate] ALLOCATOR CREATE:",o);var a=s.url+"/subscription";Do.log("[SyncherManager._newCreate] Subscription URL",a),Do.info("[SyncherManager._newCreate] Register Object: ",s),r._registry.registerDataObject(s).then(function(o){var c,l;if(Do.log("[SyncherManager._newCreate] DataObject successfully registered",o),t._reporters[s.url])c=t._reporters[s.url];else{var f=!!s.offline&&s.offline;c=new Co(r,n,s.url,u,f)}Do.log("[SyncherManager - new Create] - ",e),l=e.body.hasOwnProperty("identity")&&e.body.identity.userProfile&&e.body.identity.userProfile.userURL?e.body.identity.userProfile.userURL:r._registry.getHypertyOwner(e.from);var d=A(s);d.subscriberUser=l,d.isReporter=!0,e.body.hasOwnProperty("store")&&e.body.store&&(c.isToSaveData=!0,d.isToSaveData=!0,e.body.value.data&&(d.data=A(e.body.value.data))),r._dataObjectsStorage.set(d).then(function(t){if(d.offline){e.body.identity.guid=r._identityModule._identities.guid;var o={from:e.to,to:d.offline+"/register",type:"forward",body:e};o.body.body.resource=s.url,o.body.body.value=d,Do.log("[SyncherManager.newCreate] registering new object at offline manager ",o),r._bus.postMessage(o)}var l={id:e.id,type:"response",from:e.to,to:n,body:{code:200,resource:s.url,childrenResources:u}};i?c.forwardSubscribe([s.url,a]).then(function(){c.addChildrens().then(function(){r._reporters[s.url]=c,r._bus.postMessage(l)})}):c.addChildrens().then(function(){r._reporters[s.url]=c,r._bus.postMessage(l)})},function(e){Do.error(e)})},function(e){Do.error(e)})})}).catch(function(t){var o={id:e.id,type:"response",from:e.to,to:n,body:{code:500,desc:t}};r._bus.postMessage(o)})}},{key:"_resumeCreate",value:function(e,t){var r=this,n=this;return new Promise(function(o){var i=e.from,s=t.schema,a=t.url,c=!t.hasOwnProperty("domain_registration")||t.domain_registration;t.data,Do.log("[SyncherManager] - resume create",e,t),n._catalog.getDataSchemaDescriptor(s).then(function(s){var u,l,f=s.sourcePackage.sourceCode.properties,d=(f.scheme&&f.scheme.constant,f.childrens?f.childrens:[]);if(Do.log("[SyncherManager] - getDataSchemaDescriptor: ",s,d),r._reporters[a]?u=r._reporters[a]:(l=!!t.offline&&t.offline,u=new Co(n,i,a,d,l)),u.isToSaveData=t.isToSaveData,l){var y={from:n._url,to:l+"/register",type:"update",body:{}};Do.log("[SyncherManager._resumeCreate] update object at offline manager ",y),n._bus.postMessage(y)}c?u.forwardSubscribe([t.url]).then(function(){Do.log("[SyncherManager._resumeCreate] resumingReporterSubscription ",t),n._resumeReporterSubscriptions(e,t,u,d,c).then(function(e){Do.log("[SyncherManager._resumeCreate] resolved resumed object ",e),o(e)})}):o(n._resumeReporterSubscriptions(e,t,u,d,c))}).catch(function(e){Do.error("[SyncherManager - resume create] - fail on getDataSchemaDescriptor: ",e),o(!1)})})}},{key:"_resumeReporterSubscriptions",value:function(e,t,r,n,o){var i=this,s=t.url,a=A(e.body.value);return a.url=t.url,a.expires=t.expires,a.domain_registration=o,delete a.data,new Promise(function(e){r.addChildrens().then(function(){return r.resumeSubscriptions(t.subscriptions),i._reporters[s]=r,Do.info("[SyncherManager - resume create] - resolved resumed: ",t),i._decryptChildrens(t,n)}).then(function(t){Do.info("[SyncherManager._resumeReporterSubscriptions] Register Object: ",a),i._registry.registerDataObject(a).then(function(r){Do.log("[SyncherManager._resumeReporterSubscriptions] DataObject registration successfully updated",r),Do.log("[SyncherManager._resumeReporterSubscriptions] resolving object",t),e(t)})}).catch(function(t){Do.error("[SyncherManager - resume create] - fail on addChildrens: ",t),e(!1)})})}},{key:"_decryptChildrens",value:function(e,t){var r=A(e);return new Promise(function(e){t?(0===Object.keys(r.childrenObjects).length&&e(r),t.forEach(function(t){var n=r.childrenObjects;Do.log("[SyncherManager._decryptChildrens] dataObjectChilds to decrypt ",n);var o=[];Object.keys(n).forEach(function(e){var t=n[e],i=e.split("#")[0];if("string"==typeof t.value){Do.log("[SyncherManager._decryptChildrens] createdBy ",i," object: ",t.value);var s=ro.decryptDataObject(JSON.parse(t.value),r.url);o.push(s)}}),Promise.all(o).then(function(t){Do.log("[SyncherManager._decryptChildrens] returning decrypted ",t),t.forEach(function(e){var t=e.value.url;r.childrenObjects[t].value=e.value}),Do.log("[SyncherManager._decryptChildrens] storedObject ",r),e(r)}).catch(function(e){Do.warn("[SyncherManager._decryptChildrens] failed : ",e)})})):e(r)})}},{key:"_authorise",value:function(e){var t=this;if(!e.body.resource)throw new Error("[SyncherManager._authorise] invitation request without data object url:",e);var r=e.body.resource+"/subscription",n=!!e.body.p2p&&e.body.p2p;Do.log("[SyncherManager - authorise] - ",e),e.body.authorise&&e.body.authorise.forEach(function(o){t._bus.postMessage({type:"create",from:r,to:o,body:{p2p:n,identity:e.body.identity,source:e.from,value:e.body.value,schema:e.body.schema}},function(r){var n={from:e.to,to:e.from,id:e.id,type:r.type,body:r.body};t._bus.postMessage(n)})})}},{key:"_onDelete",value:function(e){var t=this,r=e.body.resource,n=t._reporters[r];if(n){if(n.offline){var o={from:e.to,to:n.offline+"/register",type:"forward",body:e};Do.log("[SyncherManager._onDelete] unregistering object from offline manager ",o),t._bus.postMessage(o)}n.delete(),this._dataObjectsStorage.deleteResource(r).then(function(n){Do.log("[SyncherManager - onDelete] - deleteResource: ",n),t._registry.unregisterDataObject(r),t._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:200}})})}}},{key:"_onLocalSubscribe",value:function(e){var t=this;e.body.hasOwnProperty("resume")&&e.body.resume?this._dataObjectsStorage.getResourcesByCriteria(e,!1).then(function(r){if(Do.info("[SyncherManager.onLocalSubscribe. resume]: ",e," result: ",r),r&&Object.keys(r).length>0){var n=[];Object.keys(r).forEach(function(o){Do.log("[SyncherManager - resume Subscribe] - reuse current object url: ",r[o]),n.push(t._resumeSubscription(e,r[o]))}),Promise.all(n).then(function(r){Do.log("[SyncherManager - Observers Resumed]",r);var n=Object.values(r).filter(function(e){return!1!==e}),o={id:e.id,type:"response",from:e.to,to:e.from,body:{code:200,value:n}};Do.log("[SyncherManager - Observers Resumed] replying ",o),t._bus.postMessage(o)})}else{var o={};o.id=e.id,o.from=e.to,o.to=e.from,o.type="response",o.body={code:404,desc:"No data objects observers to be resumed"},t._bus.postMessage(o)}}):(Do.log("[SyncherManager.onLocalSubscribe - new Subscribe] - ",e.body.schema,e.body.resource),this._newSubscription(e))}},{key:"_newSubscription",value:function(e){var t=this,r=e.body.resource,n=e.from,o=U(r).domain,i=!e.body.hasOwnProperty("domain_subscription")||e.body.domain_subscription,s=r+"/children/";t._catalog.getDataSchemaDescriptor(e.body.schema).then(function(a){var c=a.sourcePackage.sourceCode.properties,u=c.childrens?c.childrens:[],l=[];if(l.push(r+"/changes"),l.push(s),i){var f={type:"subscribe",from:t._url,to:"domain://msg-node."+o+"/sm",body:{identity:e.body.identity,resources:l,source:n}};t._bus.postMessage(f,function(o){Do.log("node-subscribe-response(observer): ",o),console.log("REUSETEST SyncherManager - node-subscribe-response(observer): ",o),200===o.body.code?t._newReporterSubscribe(e,n,r,u):t._bus.postMessage({id:e.id,type:"response",from:e.to,to:n,body:o.body})})}else t._newReporterSubscribe(e,n,r,u)})}},{key:"_newReporterSubscribe",value:function(e,t,r,n){var o=this,i=r+"/subscription";o._bus.postMessage({id:e.id,type:"response",from:e.to,to:t,body:{code:100,childrenResources:n,schema:e.body.schema,resource:e.body.resource}});var s={type:"subscribe",from:o._url,to:i,body:{identity:e.body.identity,subscriber:t}};e.body.hasOwnProperty("mutual")&&(s.body.mutual=e.body.mutual),Do.log("[SyncherManager._newSubscription]",s,e),console.log("REUSETEST SyncherManager - [SyncherManager._newSubscription]",s,e),o._bus.postMessage(s,function(i){Do.log("reporter-subscribe-response-new: ",i),console.log("REUSETEST SyncherManager - reporter-subscribe-response-new: ",i),200===i.body.code?o._processSuccessfullSubscription(i,t,r,n,e):e.body.offline&&o._processOfflineSubscription(s,e.body.offline,t,r,n,e)})}},{key:"_processOfflineSubscription",value:function(e,t,r,n,o,i){var s=this,a={from:e.from,type:"forward",to:t,body:e};console.log("[SyncherManager._processOfflineSubscription] forwading ",a),s._bus.postMessage(a,function(e){Do.log("[SyncherManager._processOfflineSubscription] reply ",e),200===e.body.code&&s._processSuccessfullSubscription(e,r,n,o,i)})}},{key:"_processSuccessfullSubscription",value:function(e,t,r,n,o){Do.log("[SyncherManager._newSubscription] - observers: ",this._observers,r,this._observers[r]),console.log("REUSETEST SyncherManager - 200 code[SyncherManager._newSubscription] - observers: ",this._observers,r,this._observers[r]);var i=this._observers[r];i||(i=new xo(this,r,n),Do.log("[SyncherManager._newSubscription] - observers: create new ObserverObject: ",i),this._observers[r]=i,i.addSubscription(t),i.addChildrens());var s,a=!1;o.body.hasOwnProperty("identity")&&o.body.identity.userProfile&&o.body.identity.userProfile.userURL?(s=o.body.identity.userProfile.userURL).includes("user://")||(a=!0):(s=this._registry.getHypertyOwner(o.from))||(a=!0);var c=A(e.body.value);delete c.data,delete c.childrenObjects,c.childrens=n,c.subscriberUser=s,c.isReporter=!1,c.subscriberHyperty=t,a||(this._dataObjectsStorage.set(c),(c.hasOwnProperty("store")&&c.store||c.hasOwnProperty("isToSaveData")&&c.isToSaveData)&&(i.isToSaveData=!0,this._dataObjectsStorage.update(!1,r,"isToSaveData",!0),this._dataObjectsStorage.saveData(!1,r,null,e.body.value.data))),e.id=o.id,e.from=this._url,e.to=t,e.body.schema=o.body.schema,e.body.resource=o.body.resource,o.body.hasOwnProperty("mutual")&&(e.body.mutual=o.body.mutual),Do.log("[subscribe] - new subscription: ",o,e,i),this._bus.postMessage(e)}},{key:"_resumeSubscription",value:function(e,t){var r=this;return new Promise(function(n){var o=t.url,i=t.schema,s=e.from,a=o+"/children/";Do.log("[SyncherManager - ReuseSubscription] - objURL: ",o," - schema:",i),r._catalog.getDataSchemaDescriptor(i).then(function(n){var c=n.sourcePackage.sourceCode.properties,u=c.childrens?c.childrens:[],l=[];l.push(o+"/changes"),l.push(a),r._bus.postMessage({id:e.id,type:"response",from:e.to,to:s,body:{code:100,childrenResources:u,schema:i,resource:o}});var f=r._observers[o];return f||((f=new xo(r,o,u)).isToSaveData=t.isToSaveData,r._observers[o]=f),f.addSubscription(s),f.addChildrens(),r._decryptChildrens(t,u)}).then(function(e){n(e)}).catch(function(e){Do.error("[SyncherManager - resume subscription] - fail on getDataSchemaDescriptor: ",e),n(!1)})})}},{key:"_onLocalUnSubscribe",value:function(e){e.from;var t=e.body.resource,r=this._observers[t];r&&(r.removeSubscription(e),this._bus.postMessage({id:e.id,type:"response",from:e.to,to:e.from,body:{code:200}}),this._dataObjectsStorage.deleteResource(t),delete this._observers[t])}},{key:"url",get:function(){return this._url}}]),e}();function No(e,t){for(var r=0;r1?t.idModule._getHypertyFromDataObject(e.from).then(function(t){t===e.body.source?r(e):n("The source of the message is not valid.")},function(e){n(e)}):r(e)})}},{key:"getMyEmails",value:function(){var e=this.idModule.getIdentities(),t=[];for(var r in e)t.push(T(e[r].identity));return t}},{key:"getMyHyperties",value:function(){var e=this.runtimeRegistry.hypertiesList,t=[];for(var r in e){var n=e[r].objectName;-1===t.indexOf(n)&&t.push(n)}return t}},{key:"getServiceProviderPolicy",value:function(e,t){var r;if(t){var n=this.runtimeRegistry.getHypertyName(e.to);r=this.serviceProviderPolicy[n]}else{var o=this.runtimeRegistry.getHypertyName(e.from);r=this.serviceProviderPolicy[o]}return r}},{key:"getURL",value:function(e){var t=e.split("/");return t[0]+"//"+t[2]+"/"+t[3]}},{key:"_loadUserPolicies",value:function(){var e=this,t=this;return new Promise(function(r,n){t.storageManager.get("rethink:userPolicies").then(function(t){var n=t;if(void 0!==n)for(var o in n)e.pep.addPolicy("USER",o,n[o]);r()})})}},{key:"_getLastComponentOfURL",value:function(e){var t=e.split("/");return t[t.length-1]}},{key:"_getPoliciesJSON",value:function(e){for(var t in e){var r=e[t].combiningAlgorithm;e[t].combiningAlgorithm=r instanceof bn?"blockOverrides":r instanceof vn?"allowOverrides":r instanceof _n?"firstApplicable":void 0}return e}},{key:"saveActivePolicy",value:function(){var e=this,t=this;return new Promise(function(r,n){t.storageManager.set("rethink:activePolicy",0,e.activeUserPolicy).then(function(){r()})})}},{key:"saveGroups",value:function(){var e=this,t=this;return new Promise(function(r,n){t.storageManager.set("rethink:groups",0,e.groups).then(function(){r()})})}},{key:"savePolicies",value:function(e,t,r){var n;switch(e){case"USER":n=JSON.stringify(this.userPolicies),n=this._getPoliciesJSON(JSON.parse(n)),this.storageManager.set("rethink:userPolicies",0,n);break;case"SERVICE_PROVIDER":void 0!==t&void 0!==r&&(this.serviceProviderPolicy[r]=t),n=JSON.stringify(this.serviceProviderPolicy),n=this._getPoliciesJSON(JSON.parse(n)),this.storageManager.set("rethink:spPolicies",0,n);break;default:throw Error("Unknown policy source: "+e)}}},{key:"getGroupsNames",value:function(){var e=this.groups,t=[];if(void 0!==e)for(var r in e)t.push(r);return t}},{key:"getGroup",value:function(e,t){var r=[];if("preauthorised"===e){var n=t.split("/");n.pop(),n=n[0]+"//"+n[2],r=this.runtimeRegistry.getPreAuthSubscribers(n)}else void 0!==this.groups[e]&&(r=this.groups[e]);return r}},{key:"createGroup",value:function(e){this.groups[e]=[],this.saveGroups()}},{key:"deleteGroup",value:function(e){delete this.groups[e],this.saveGroups()}},{key:"addToGroup",value:function(e,t){var r=this.groups;if(void 0===r[e])throw Error('Group "'+e+'" does not exist!');-1===r[e].indexOf(t)&&(r[e].push(t),this.saveGroups())}},{key:"removeFromGroup",value:function(e,t){var r=this.groups[e];r.splice(r.indexOf(t),1),this.saveGroups()}},{key:"pepURL",get:function(){return this._pepURL}},{key:"guiURL",get:function(){return this._guiURL}},{key:"runtimeURL",get:function(){return this._runtimeURL}},{key:"messageBus",get:function(){return this._messageBus},set:function(e){this._messageBus=e}},{key:"subscription",get:function(){return this._subscription},set:function(e){this._subscription=e.message.body.subscriber}}]),t}(),Qo=r(87),Zo=r.n(Qo);function ei(e,t){for(var r=0;r0)&&(console.warn("Object validation "+(t.valid?"succeeded, but schema contained references:":"failed:"),JSON.stringify(t,null,2)),console.log("Object:",JSON.stringify(this,null,2))),t.valid}}]),e}();function ri(e){return(ri="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ni(e,t){for(var r=0;r2&&void 0!==arguments[2])||arguments[2],o=arguments.length>3?arguments[3]:void 0;return zi.info("[RuntimeCatalogue] - getting descriptor from: ",e," with constraints: ",o),new Promise(function(i,s){r._runtimeFactory.isOnline()?i(r._getDescriptor(e,t,n,o)):r.storageManager.get("url",e).then(function(s){console.log("[RuntimeCatalogue] saved offline descriptor ",s),i(s?t.apply(r,[s,o]):r._getDescriptor(e,t,n,o))})})}},{key:"_getDescriptor",value:function(e,t){var r,n=this,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3?arguments[3]:void 0,s=!1,a=!1,c=r=(r=null!=i?Promise.all([this.httpRequest.post(e+"/version",{body:JSON.stringify(i)}),this.httpRequest.post(e+"/cguid",{body:JSON.stringify(i)})]):Promise.all([this.httpRequest.get(e+"/version"),this.httpRequest.get(e+"/cguid")])).then(function(t){var r=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=[],n=!0,o=!1,i=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(e){o=!0,i=e}finally{try{n||null==a.return||a.return()}finally{if(o)throw i}}return r}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}(t,2),o=r[0],a=r[1];return zi.log("[RuntimeCatalogue.getDescriptor] - got version ("+o+") and cguid ("+a+") for descriptor "+e),n.storageManager.getVersion("cguid",a).then(function(t){return t>=o?(zi.log("[RuntimeCatalogue.getDescriptor] local version is updated for ",e),s=!0,n.storageManager.get("cguid",a)):(zi.log("[RuntimeCatalogue.getDescriptor] local version not updated for ",e," retrieving from remote catalogue ..."),(null!=i?n.httpRequest.post(e,{body:JSON.stringify(i)}):n.httpRequest.get(e)).then(function(e){if((e=JSON.parse(e)).ERROR)throw new Error(e);return e}))})}).catch(function(t){var r="Unable to get descriptor for "+e+(null!=i?" with constraints "+i:"")+": "+t;throw zi.error(r),new Error(r)});return o&&(zi.log("adding promise to attach sourcePackage"),c=r.then(function(e){return e.sourcePackage?(a=!0,e):(a=!1,n.attachRawSourcePackage(e))})),c.then(function(r){return(!s||s&&!a&&o)&&(r.url=e,n.storageManager.set(r.cguid,r.version,r)),t.apply(n,[r,i])})}},{key:"attachRawSourcePackage",value:function(e,t){var r=this;return zi.log("attaching raw sourcePackage from:",e.sourcePackageURL),new Promise(function(n,o){(null!=t?r.httpRequest.post(e.sourcePackageURL,{body:JSON.stringify(t)}):r.httpRequest.get(e.sourcePackageURL)).then(function(t){t=JSON.parse(t),e.sourcePackage=t,n(e)}).catch(function(e){o(e)})})}},{key:"getHypertyDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createHyperty,t,r)}},{key:"getStubDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createStub,t,r)}},{key:"getRuntimeDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createRuntimeDescriptor,t,r)}},{key:"getDataSchemaDescriptor",value:function(e){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1],arguments.length>2&&arguments[2],new Promise(function(t){var r=e.split("/dataschema/")[1];zi.log("[RuntimeCatalogue.getDataSchemaDescriptor] schema ",r);var n={sourcePackage:{sourceCode:{properties:{}}}};switch(r){case"Context":case"ContextReporter":case"ContextObserver":n.sourcePackage.sourceCode.properties.scheme="context";break;case"Connection":n.sourcePackage.sourceCode.properties.scheme="connection";break;case"WalletData":n.sourcePackage.sourceCode.properties.scheme="walletData";break;case"Communication":n.sourcePackage.sourceCode.properties.scheme="comm",n.sourcePackage.sourceCode.properties.childrens=["resources"];break;case"HelloWorldDataSchema":n.sourcePackage.sourceCode.properties.scheme="hello";break;default:n.sourcePackage.sourceCode.properties.scheme="resource",n.sourcePackage.sourceCode.properties.childrens=[]}t(n)})}},{key:"getIdpProxyDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createIdpProxy,t,r)}},{key:"createHyperty",value:function(e){var t=this._factory.createHypertyDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.type||e.hypertyType,e.dataObjects);t.configuration=e.configuration,t.constraints=e.constraints,t.messageSchema=e.messageSchema,t.policies=e.policies,t.signature=e.signature;var r=e.sourcePackage;return r&&(t.sourcePackage=this.createSourcePackage(r)),t}},{key:"createStub",value:function(e){var t=this._factory.createProtoStubDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.messageSchemas,e.configuration,e.constraints,e.hypertyType,e.dataObjects,e.interworking,e.idpProxy,e.mutualAuthentication);t.signature=e.signature;var r=e.sourcePackage;return r&&(t.sourcePackage=this.createSourcePackage(r)),t}},{key:"createRuntimeDescriptor",value:function(e){try{e.hypertyCapabilities=JSON.parse(e.hypertyCapabilities),e.protocolCapabilities=JSON.parse(e.protocolCapabilities)}catch(e){}var t=this._factory.createHypertyRuntimeDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.type||e.runtimeType,e.hypertyCapabilities,e.protocolCapabilities,e.p2pHandlerStub,e.p2pRequesterStub);t.signature=e.signature;var r=e.sourcePackage;return r&&(t.sourcePackage=this.createSourcePackage(r)),t}},{key:"createDataSchema",value:function(e){var t;(t=e.accessControlPolicy&&e.scheme?this._factory.createHypertyDataObjectSchema(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.accessControlPolicy,e.scheme):this._factory.createMessageDataObjectSchema(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL)).signature=e.signature;var r=e.sourcePackage;if(r){t.sourcePackage=this.createSourcePackage(r);try{t.sourcePackage.sourceCode=JSON.parse(t.sourcePackage.sourceCode)}catch(e){zi.log("DataSchema Source code is already parsed")}return t}return t}},{key:"createIdpProxy",value:function(e){var t=this._factory.createProtoStubDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.messageSchemas,e.configuration,e.constraints,e.hypertyType,e.dataObjects,e.interworking,e.idpProxy,e.mutualAuthentication);t.signature=e.signature;var r=e.sourcePackage;return r&&(r=this.createSourcePackage(r),t.sourcePackage=r),t}},{key:"createSourcePackage",value:function(e){"base64"===e.encoding&&(e.sourceCode=this.atob(e.sourceCode),e.encoding="utf-8");var t=this._factory.createSourcePackage(e.sourceCodeClassname,e.sourceCode);return e.encoding&&(t.encoding=e.encoding),e.signature&&(t.signature=e.signature),t}},{key:"getSourcePackageFromURL",value:function(e){var t=this;return zi.log("getting sourcePackage from:",e),new Promise(function(r,n){t.httpRequest.get(e).then(function(e){if(e.ERROR)n(e);else{e=JSON.parse(e);var o=t.createSourcePackage(e);r(o)}}).catch(function(e){n(e)})})}},{key:"getSourceCodeFromDescriptor",value:function(e){var t=this;return new Promise(function(r,n){e.sourcePackage?r(e.sourcePackage.sourceCode):t.storageManager.getVersion(e.sourcePackageURL+"/sourceCode").then(function(o){o>=e.version?(zi.log("returning cached version from storageManager"),t.storageManager.get(e.sourcePackageURL+"/sourceCode").then(function(e){r(e)}).catch(function(e){n(e)})):t.httpRequest.get(e.sourcePackageURL+"/sourceCode").then(function(o){o.ERROR?n(o):(t.storageManager.set(e.sourcePackageURL+"/sourceCode",e.version,o),r(o))}).catch(function(e){n(e)})}).catch(function(e){n(e)})})}},{key:"getTypeList",value:function(e,t){var r=this;return new Promise(function(n,o){(null!=t?r.httpRequest.post(e,{body:JSON.stringify(t)}):r.httpRequest.get(e)).then(function(e){e=JSON.parse(e),n(e)}).catch(function(e){o(e)})})}},{key:"deleteFromPM",value:function(e){return this.storageManager.delete(e)}},{key:"runtimeURL",set:function(e){this._runtimeURL=e},get:function(){return this._runtimeURL}}]),e}();function Xi(e,t){for(var r=0;r1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2?arguments[2]:void 0;if(!e)throw new Error("Hyperty descriptor url parameter is needed");return this.loader.loadHyperty(e,t,r)}},{key:"loadStub",value:function(e){if(!e)throw new Error("ProtoStub descriptor url parameter is needed");return this.loader.loadStub(e)}},{key:"loadIdpProxy",value:function(e){if(Qi.log("ipdProxyCatalogueURL",e),!e)throw new Error("The IDP Proxy URL is a needed parameter, could be a DOMAIN or a URL");return this.loader.loadIdpProxy(e)}},{key:"close",value:function(e){console.log("Runtime core logout: ",e);var t=this;return!0===e&&this.identityHandler.reset(),Qi.info("Unregister all hyperties"),new Promise(function(e,r){t.registry.unregisterAllHyperties().then(function(t){Qi.info("All the hyperties are unregisted with Success:",t),e(!0)}).catch(function(e){Qi.error("Failed to unregister the hyperties",e),r(!1)})})}},{key:"reset",value:function(){var e=this;console.log("RuntimeUA.Runtime core reset: ");var t=[];return new Promise(function(r,n){e._dataObjectsStorage.deleteRemotes().then(function(){return r()}).then(function(){e.storages.identity.get(!1,!1,"identities").then(function(n){Object.keys(n).forEach(function(r){t.push(e.storages.identity.delete(r,!1,"identities"))}),t.push(e.storages.capabilities.delete("capabilities")),t.push(e.storages.cryptoManager.delete("userAsymmetricKey")),t.push(e.storages.hypertyResources.delete("hypertyResources")),t.push(e.storages.identity.delete("accessTokens")),t.push(e.storages.registry.delete("registry:DataObjectURLs")),t.push(e.storages.registry.delete("registry:HypertyURLs")),t.push(e.storages.runtime.delete("p2pHandler:URL")),t.push(e.storages.runtime.delete("runtime:URL")),t.push(e.storages.subscriptions.delete("subscriptions")),t.push(e.storages.syncherManager.delete("syncherManager:ObjectURLs")),t.push(e.storages.syncherManager.delete("remotes")),Promise.all(t).then(function(e){return Qi.info("[RuntimeUA.reset] reset with Success:",e),r(!0)}).catch(function(e){Qi.error("Failed to reset all DBs",e),r(!1)})})})})}}]),e}();t.default=Zi}])}); \ No newline at end of file diff --git a/dist/RuntimeCatalogue.js b/dist/RuntimeCatalogue.js index 475eefd2..0815b69e 100644 --- a/dist/RuntimeCatalogue.js +++ b/dist/RuntimeCatalogue.js @@ -1,5 +1,5 @@ // version: 0.16.0 -// date: Wed Jan 16 2019 10:39:53 GMT+0000 (GMT) +// date: Mon Mar 18 2019 14:21:50 GMT+0000 (Western European Standard Time) // licence: /** * Copyright 2016 PT Inovação e Sistemas SA @@ -25,4 +25,4 @@ **/ -!function(t,c){"object"==typeof exports&&"object"==typeof module?module.exports=c():"function"==typeof define&&define.amd?define("RuntimeCatalogue",[],c):"object"==typeof exports?exports.RuntimeCatalogue=c():t.RuntimeCatalogue=c()}(window,function(){return function(t){var c={};function e(n){if(c[n])return c[n].exports;var r=c[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,e),r.l=!0,r.exports}return e.m=t,e.c=c,e.d=function(t,c,n){e.o(t,c)||Object.defineProperty(t,c,{enumerable:!0,get:n})},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},e.t=function(t,c){if(1&c&&(t=e(t)),8&c)return t;if(4&c&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(e.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&c&&"string"!=typeof t)for(var r in t)e.d(n,r,function(c){return t[c]}.bind(null,r));return n},e.n=function(t){var c=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(c,"a",c),c},e.o=function(t,c){return Object.prototype.hasOwnProperty.call(t,c)},e.p="",e(e.s=22)}({1:function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n "use strict";\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(this, function () {\n "use strict";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = "undefined";\n\n var logMethods = [\n "trace",\n "debug",\n "info",\n "warn",\n "error"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === \'function\') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === \'debug\') {\n methodName = \'log\';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, \'log\');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn\'t present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n var storageKey = "loglevel";\n if (name) {\n storageKey += ":" + name;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || \'silent\').toUpperCase();\n\n if (typeof window === undefinedType) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + "=" + levelName + ";";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + "=");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3,\n "ERROR": 4, "SILENT": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return "No console available for logging";\n }\n } else {\n throw "log.setLevel() called with invalid level: " + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel == null ? "WARN" : defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== "string" || name === "") {\n throw new TypeError("You must supply a name when creating a logger.");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n return defaultLogger;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanM/NWM3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGVbbWV0aG9kTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgJ2xvZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGVzZSBwcml2YXRlIGZ1bmN0aW9ucyBhbHdheXMgbmVlZCBgdGhpc2AgdG8gYmUgc2V0IHByb3Blcmx5XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlTG9nZ2luZ01ldGhvZHMobGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2dNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IGxvZ01ldGhvZHNbaV07XG4gICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdID0gKGkgPCBsZXZlbCkgP1xuICAgICAgICAgICAgICAgIG5vb3AgOlxuICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgbG9nLmxvZyBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcbiAgICB9XG5cbiAgICAvLyBJbiBvbGQgSUUgdmVyc2lvbnMsIHRoZSBjb25zb2xlIGlzbid0IHByZXNlbnQgdW50aWwgeW91IGZpcnN0IG9wZW4gaXQuXG4gICAgLy8gV2UgYnVpbGQgcmVhbE1ldGhvZCgpIHJlcGxhY2VtZW50cyBoZXJlIHRoYXQgcmVnZW5lcmF0ZSBsb2dnaW5nIG1ldGhvZHNcbiAgICBmdW5jdGlvbiBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzKG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbCh0aGlzLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHVzZSBjbG9zZWx5IGJvdW5kIHJlYWwgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZSwgYW5kXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIGEgY29uc29sZSB0byBhcHBlYXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICBmdW5jdGlvbiBkZWZhdWx0TWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICByZXR1cm4gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB8fFxuICAgICAgICAgICAgICAgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvZ2dlcihuYW1lLCBkZWZhdWx0TGV2ZWwsIGZhY3RvcnkpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBjdXJyZW50TGV2ZWw7XG4gICAgICB2YXIgc3RvcmFnZUtleSA9IFwibG9nbGV2ZWxcIjtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICpcbiAgICAgICAqIFB1YmxpYyBsb2dnZXIgQVBJIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbCBmb3IgZGV0YWlsc1xuICAgICAgICpcbiAgICAgICAqL1xuXG4gICAgICBzZWxmLm5hbWUgPSBuYW1lO1xuXG4gICAgICBzZWxmLmxldmVscyA9IHsgXCJUUkFDRVwiOiAwLCBcIkRFQlVHXCI6IDEsIFwiSU5GT1wiOiAyLCBcIldBUk5cIjogMyxcbiAgICAgICAgICBcIkVSUk9SXCI6IDQsIFwiU0lMRU5UXCI6IDV9O1xuXG4gICAgICBzZWxmLm1ldGhvZEZhY3RvcnkgPSBmYWN0b3J5IHx8IGRlZmF1bHRNZXRob2RGYWN0b3J5O1xuXG4gICAgICBzZWxmLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50TGV2ZWw7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsLCBwZXJzaXN0KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gXCJzdHJpbmdcIiAmJiBzZWxmLmxldmVsc1tsZXZlbC50b1VwcGVyQ2FzZSgpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGxldmVsID0gc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwibnVtYmVyXCIgJiYgbGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgY3VycmVudExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgICAgIGlmIChwZXJzaXN0ICE9PSBmYWxzZSkgeyAgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgcGVyc2lzdExldmVsSWZQb3NzaWJsZShsZXZlbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZiwgbGV2ZWwsIG5hbWUpO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUgJiYgbGV2ZWwgPCBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIk5vIGNvbnNvbGUgYXZhaWxhYmxlIGZvciBsb2dnaW5nXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgbGV2ZWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXREZWZhdWx0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgICBpZiAoIWdldFBlcnNpc3RlZExldmVsKCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZW5hYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuVFJBQ0UsIHBlcnNpc3QpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5kaXNhYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuU0lMRU5ULCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEluaXRpYWxpemUgd2l0aCB0aGUgcmlnaHQgbGV2ZWxcbiAgICAgIHZhciBpbml0aWFsTGV2ZWwgPSBnZXRQZXJzaXN0ZWRMZXZlbCgpO1xuICAgICAgaWYgKGluaXRpYWxMZXZlbCA9PSBudWxsKSB7XG4gICAgICAgICAgaW5pdGlhbExldmVsID0gZGVmYXVsdExldmVsID09IG51bGwgPyBcIldBUk5cIiA6IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhIG5hbWUgd2hlbiBjcmVhdGluZyBhIGxvZ2dlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV07XG4gICAgICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgICAgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV0gPSBuZXcgTG9nZ2VyKFxuICAgICAgICAgICAgbmFtZSwgZGVmYXVsdExvZ2dlci5nZXRMZXZlbCgpLCBkZWZhdWx0TG9nZ2VyLm1ldGhvZEZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dnZXI7XG4gICAgfTtcblxuICAgIC8vIEdyYWIgdGhlIGN1cnJlbnQgZ2xvYmFsIGxvZyB2YXJpYWJsZSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuICAgIHZhciBfbG9nID0gKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUpID8gd2luZG93LmxvZyA6IHVuZGVmaW5lZDtcbiAgICBkZWZhdWx0TG9nZ2VyLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUgJiZcbiAgICAgICAgICAgICAgIHdpbmRvdy5sb2cgPT09IGRlZmF1bHRMb2dnZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2cgPSBfbG9nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG4gICAgfTtcblxuICAgIGRlZmF1bHRMb2dnZXIuZ2V0TG9nZ2VycyA9IGZ1bmN0aW9uIGdldExvZ2dlcnMoKSB7XG4gICAgICAgIHJldHVybiBfbG9nZ2Vyc0J5TmFtZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxhQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n')},18:function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\r\nAuthor: Geraint Luff and others\r\nYear: 2013\r\n\r\nThis code is released into the "public domain" by its author(s). Anybody may use, alter and distribute the code without restriction. The author makes no guarantees, and takes no liability of any kind for use of this code.\r\n\r\nIf you find a bug or make an improvement, it would be courteous to let the author know, but it is not compulsory.\r\n*/\r\n(function (global, factory) {\r\n if (true) {\r\n // AMD. Register as an anonymous module.\r\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n } else {}\r\n}(this, function () {\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FObject%2Fkeys\r\nif (!Object.keys) {\r\n\tObject.keys = (function () {\r\n\t\tvar hasOwnProperty = Object.prototype.hasOwnProperty,\r\n\t\t\thasDontEnumBug = !({toString: null}).propertyIsEnumerable(\'toString\'),\r\n\t\t\tdontEnums = [\r\n\t\t\t\t\'toString\',\r\n\t\t\t\t\'toLocaleString\',\r\n\t\t\t\t\'valueOf\',\r\n\t\t\t\t\'hasOwnProperty\',\r\n\t\t\t\t\'isPrototypeOf\',\r\n\t\t\t\t\'propertyIsEnumerable\',\r\n\t\t\t\t\'constructor\'\r\n\t\t\t],\r\n\t\t\tdontEnumsLength = dontEnums.length;\r\n\r\n\t\treturn function (obj) {\r\n\t\t\tif (typeof obj !== \'object\' && typeof obj !== \'function\' || obj === null) {\r\n\t\t\t\tthrow new TypeError(\'Object.keys called on non-object\');\r\n\t\t\t}\r\n\r\n\t\t\tvar result = [];\r\n\r\n\t\t\tfor (var prop in obj) {\r\n\t\t\t\tif (hasOwnProperty.call(obj, prop)) {\r\n\t\t\t\t\tresult.push(prop);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (hasDontEnumBug) {\r\n\t\t\t\tfor (var i=0; i < dontEnumsLength; i++) {\r\n\t\t\t\t\tif (hasOwnProperty.call(obj, dontEnums[i])) {\r\n\t\t\t\t\t\tresult.push(dontEnums[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t};\r\n\t})();\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create\r\nif (!Object.create) {\r\n\tObject.create = (function(){\r\n\t\tfunction F(){}\r\n\r\n\t\treturn function(o){\r\n\t\t\tif (arguments.length !== 1) {\r\n\t\t\t\tthrow new Error(\'Object.create implementation only accepts one parameter.\');\r\n\t\t\t}\r\n\t\t\tF.prototype = o;\r\n\t\t\treturn new F();\r\n\t\t};\r\n\t})();\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FisArray\r\nif(!Array.isArray) {\r\n\tArray.isArray = function (vArg) {\r\n\t\treturn Object.prototype.toString.call(vArg) === "[object Array]";\r\n\t};\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FindexOf\r\nif (!Array.prototype.indexOf) {\r\n\tArray.prototype.indexOf = function (searchElement /*, fromIndex */ ) {\r\n\t\tif (this === null) {\r\n\t\t\tthrow new TypeError();\r\n\t\t}\r\n\t\tvar t = Object(this);\r\n\t\tvar len = t.length >>> 0;\r\n\r\n\t\tif (len === 0) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tvar n = 0;\r\n\t\tif (arguments.length > 1) {\r\n\t\t\tn = Number(arguments[1]);\r\n\t\t\tif (n !== n) { // shortcut for verifying if it\'s NaN\r\n\t\t\t\tn = 0;\r\n\t\t\t} else if (n !== 0 && n !== Infinity && n !== -Infinity) {\r\n\t\t\t\tn = (n > 0 || -1) * Math.floor(Math.abs(n));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (n >= len) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tvar k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\r\n\t\tfor (; k < len; k++) {\r\n\t\t\tif (k in t && t[k] === searchElement) {\r\n\t\t\t\treturn k;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t};\r\n}\r\n\r\n// Grungey Object.isFrozen hack\r\nif (!Object.isFrozen) {\r\n\tObject.isFrozen = function (obj) {\r\n\t\tvar key = "tv4_test_frozen_key";\r\n\t\twhile (obj.hasOwnProperty(key)) {\r\n\t\t\tkey += Math.random();\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tobj[key] = true;\r\n\t\t\tdelete obj[key];\r\n\t\t\treturn false;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t};\r\n}\r\n// Based on: https://github.com/geraintluff/uri-templates, but with all the de-substitution stuff removed\r\n\r\nvar uriTemplateGlobalModifiers = {\r\n\t"+": true,\r\n\t"#": true,\r\n\t".": true,\r\n\t"/": true,\r\n\t";": true,\r\n\t"?": true,\r\n\t"&": true\r\n};\r\nvar uriTemplateSuffices = {\r\n\t"*": true\r\n};\r\n\r\nfunction notReallyPercentEncode(string) {\r\n\treturn encodeURI(string).replace(/%25[0-9][0-9]/g, function (doubleEncoded) {\r\n\t\treturn "%" + doubleEncoded.substring(3);\r\n\t});\r\n}\r\n\r\nfunction uriTemplateSubstitution(spec) {\r\n\tvar modifier = "";\r\n\tif (uriTemplateGlobalModifiers[spec.charAt(0)]) {\r\n\t\tmodifier = spec.charAt(0);\r\n\t\tspec = spec.substring(1);\r\n\t}\r\n\tvar separator = "";\r\n\tvar prefix = "";\r\n\tvar shouldEscape = true;\r\n\tvar showVariables = false;\r\n\tvar trimEmptyString = false;\r\n\tif (modifier === \'+\') {\r\n\t\tshouldEscape = false;\r\n\t} else if (modifier === ".") {\r\n\t\tprefix = ".";\r\n\t\tseparator = ".";\r\n\t} else if (modifier === "/") {\r\n\t\tprefix = "/";\r\n\t\tseparator = "/";\r\n\t} else if (modifier === \'#\') {\r\n\t\tprefix = "#";\r\n\t\tshouldEscape = false;\r\n\t} else if (modifier === \';\') {\r\n\t\tprefix = ";";\r\n\t\tseparator = ";";\r\n\t\tshowVariables = true;\r\n\t\ttrimEmptyString = true;\r\n\t} else if (modifier === \'?\') {\r\n\t\tprefix = "?";\r\n\t\tseparator = "&";\r\n\t\tshowVariables = true;\r\n\t} else if (modifier === \'&\') {\r\n\t\tprefix = "&";\r\n\t\tseparator = "&";\r\n\t\tshowVariables = true;\r\n\t}\r\n\r\n\tvar varNames = [];\r\n\tvar varList = spec.split(",");\r\n\tvar varSpecs = [];\r\n\tvar varSpecMap = {};\r\n\tfor (var i = 0; i < varList.length; i++) {\r\n\t\tvar varName = varList[i];\r\n\t\tvar truncate = null;\r\n\t\tif (varName.indexOf(":") !== -1) {\r\n\t\t\tvar parts = varName.split(":");\r\n\t\t\tvarName = parts[0];\r\n\t\t\ttruncate = parseInt(parts[1], 10);\r\n\t\t}\r\n\t\tvar suffices = {};\r\n\t\twhile (uriTemplateSuffices[varName.charAt(varName.length - 1)]) {\r\n\t\t\tsuffices[varName.charAt(varName.length - 1)] = true;\r\n\t\t\tvarName = varName.substring(0, varName.length - 1);\r\n\t\t}\r\n\t\tvar varSpec = {\r\n\t\t\ttruncate: truncate,\r\n\t\t\tname: varName,\r\n\t\t\tsuffices: suffices\r\n\t\t};\r\n\t\tvarSpecs.push(varSpec);\r\n\t\tvarSpecMap[varName] = varSpec;\r\n\t\tvarNames.push(varName);\r\n\t}\r\n\tvar subFunction = function (valueFunction) {\r\n\t\tvar result = "";\r\n\t\tvar startIndex = 0;\r\n\t\tfor (var i = 0; i < varSpecs.length; i++) {\r\n\t\t\tvar varSpec = varSpecs[i];\r\n\t\t\tvar value = valueFunction(varSpec.name);\r\n\t\t\tif (value === null || value === undefined || (Array.isArray(value) && value.length === 0) || (typeof value === \'object\' && Object.keys(value).length === 0)) {\r\n\t\t\t\tstartIndex++;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (i === startIndex) {\r\n\t\t\t\tresult += prefix;\r\n\t\t\t} else {\r\n\t\t\t\tresult += (separator || ",");\r\n\t\t\t}\r\n\t\t\tif (Array.isArray(value)) {\r\n\t\t\t\tif (showVariables) {\r\n\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t}\r\n\t\t\t\tfor (var j = 0; j < value.length; j++) {\r\n\t\t\t\t\tif (j > 0) {\r\n\t\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? (separator || ",") : ",";\r\n\t\t\t\t\t\tif (varSpec.suffices[\'*\'] && showVariables) {\r\n\t\t\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(value[j]).replace(/!/g, "%21") : notReallyPercentEncode(value[j]);\r\n\t\t\t\t}\r\n\t\t\t} else if (typeof value === "object") {\r\n\t\t\t\tif (showVariables && !varSpec.suffices[\'*\']) {\r\n\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t}\r\n\t\t\t\tvar first = true;\r\n\t\t\t\tfor (var key in value) {\r\n\t\t\t\t\tif (!first) {\r\n\t\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? (separator || ",") : ",";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfirst = false;\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(key).replace(/!/g, "%21") : notReallyPercentEncode(key);\r\n\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? \'=\' : ",";\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(value[key]).replace(/!/g, "%21") : notReallyPercentEncode(value[key]);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (showVariables) {\r\n\t\t\t\t\tresult += varSpec.name;\r\n\t\t\t\t\tif (!trimEmptyString || value !== "") {\r\n\t\t\t\t\t\tresult += "=";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (varSpec.truncate != null) {\r\n\t\t\t\t\tvalue = value.substring(0, varSpec.truncate);\r\n\t\t\t\t}\r\n\t\t\t\tresult += shouldEscape ? encodeURIComponent(value).replace(/!/g, "%21"): notReallyPercentEncode(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t};\r\n\tsubFunction.varNames = varNames;\r\n\treturn {\r\n\t\tprefix: prefix,\r\n\t\tsubstitution: subFunction\r\n\t};\r\n}\r\n\r\nfunction UriTemplate(template) {\r\n\tif (!(this instanceof UriTemplate)) {\r\n\t\treturn new UriTemplate(template);\r\n\t}\r\n\tvar parts = template.split("{");\r\n\tvar textParts = [parts.shift()];\r\n\tvar prefixes = [];\r\n\tvar substitutions = [];\r\n\tvar varNames = [];\r\n\twhile (parts.length > 0) {\r\n\t\tvar part = parts.shift();\r\n\t\tvar spec = part.split("}")[0];\r\n\t\tvar remainder = part.substring(spec.length + 1);\r\n\t\tvar funcs = uriTemplateSubstitution(spec);\r\n\t\tsubstitutions.push(funcs.substitution);\r\n\t\tprefixes.push(funcs.prefix);\r\n\t\ttextParts.push(remainder);\r\n\t\tvarNames = varNames.concat(funcs.substitution.varNames);\r\n\t}\r\n\tthis.fill = function (valueFunction) {\r\n\t\tvar result = textParts[0];\r\n\t\tfor (var i = 0; i < substitutions.length; i++) {\r\n\t\t\tvar substitution = substitutions[i];\r\n\t\t\tresult += substitution(valueFunction);\r\n\t\t\tresult += textParts[i + 1];\r\n\t\t}\r\n\t\treturn result;\r\n\t};\r\n\tthis.varNames = varNames;\r\n\tthis.template = template;\r\n}\r\nUriTemplate.prototype = {\r\n\ttoString: function () {\r\n\t\treturn this.template;\r\n\t},\r\n\tfillFromObject: function (obj) {\r\n\t\treturn this.fill(function (varName) {\r\n\t\t\treturn obj[varName];\r\n\t\t});\r\n\t}\r\n};\r\nvar ValidatorContext = function ValidatorContext(parent, collectMultiple, errorReporter, checkRecursive, trackUnknownProperties) {\r\n\tthis.missing = [];\r\n\tthis.missingMap = {};\r\n\tthis.formatValidators = parent ? Object.create(parent.formatValidators) : {};\r\n\tthis.schemas = parent ? Object.create(parent.schemas) : {};\r\n\tthis.collectMultiple = collectMultiple;\r\n\tthis.errors = [];\r\n\tthis.handleError = collectMultiple ? this.collectError : this.returnError;\r\n\tif (checkRecursive) {\r\n\t\tthis.checkRecursive = true;\r\n\t\tthis.scanned = [];\r\n\t\tthis.scannedFrozen = [];\r\n\t\tthis.scannedFrozenSchemas = [];\r\n\t\tthis.scannedFrozenValidationErrors = [];\r\n\t\tthis.validatedSchemasKey = \'tv4_validation_id\';\r\n\t\tthis.validationErrorsKey = \'tv4_validation_errors_id\';\r\n\t}\r\n\tif (trackUnknownProperties) {\r\n\t\tthis.trackUnknownProperties = true;\r\n\t\tthis.knownPropertyPaths = {};\r\n\t\tthis.unknownPropertyPaths = {};\r\n\t}\r\n\tthis.errorReporter = errorReporter || defaultErrorReporter(\'en\');\r\n\tif (typeof this.errorReporter === \'string\') {\r\n\t\tthrow new Error(\'debug\');\r\n\t}\r\n\tthis.definedKeywords = {};\r\n\tif (parent) {\r\n\t\tfor (var key in parent.definedKeywords) {\r\n\t\t\tthis.definedKeywords[key] = parent.definedKeywords[key].slice(0);\r\n\t\t}\r\n\t}\r\n};\r\nValidatorContext.prototype.defineKeyword = function (keyword, keywordFunction) {\r\n\tthis.definedKeywords[keyword] = this.definedKeywords[keyword] || [];\r\n\tthis.definedKeywords[keyword].push(keywordFunction);\r\n};\r\nValidatorContext.prototype.createError = function (code, messageParams, dataPath, schemaPath, subErrors, data, schema) {\r\n\tvar error = new ValidationError(code, messageParams, dataPath, schemaPath, subErrors);\r\n\terror.message = this.errorReporter(error, data, schema);\r\n\treturn error;\r\n};\r\nValidatorContext.prototype.returnError = function (error) {\r\n\treturn error;\r\n};\r\nValidatorContext.prototype.collectError = function (error) {\r\n\tif (error) {\r\n\t\tthis.errors.push(error);\r\n\t}\r\n\treturn null;\r\n};\r\nValidatorContext.prototype.prefixErrors = function (startIndex, dataPath, schemaPath) {\r\n\tfor (var i = startIndex; i < this.errors.length; i++) {\r\n\t\tthis.errors[i] = this.errors[i].prefixWith(dataPath, schemaPath);\r\n\t}\r\n\treturn this;\r\n};\r\nValidatorContext.prototype.banUnknownProperties = function (data, schema) {\r\n\tfor (var unknownPath in this.unknownPropertyPaths) {\r\n\t\tvar error = this.createError(ErrorCodes.UNKNOWN_PROPERTY, {path: unknownPath}, unknownPath, "", null, data, schema);\r\n\t\tvar result = this.handleError(error);\r\n\t\tif (result) {\r\n\t\t\treturn result;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.addFormat = function (format, validator) {\r\n\tif (typeof format === \'object\') {\r\n\t\tfor (var key in format) {\r\n\t\t\tthis.addFormat(key, format[key]);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\tthis.formatValidators[format] = validator;\r\n};\r\nValidatorContext.prototype.resolveRefs = function (schema, urlHistory) {\r\n\tif (schema[\'$ref\'] !== undefined) {\r\n\t\turlHistory = urlHistory || {};\r\n\t\tif (urlHistory[schema[\'$ref\']]) {\r\n\t\t\treturn this.createError(ErrorCodes.CIRCULAR_REFERENCE, {urls: Object.keys(urlHistory).join(\', \')}, \'\', \'\', null, undefined, schema);\r\n\t\t}\r\n\t\turlHistory[schema[\'$ref\']] = true;\r\n\t\tschema = this.getSchema(schema[\'$ref\'], urlHistory);\r\n\t}\r\n\treturn schema;\r\n};\r\nValidatorContext.prototype.getSchema = function (url, urlHistory) {\r\n\tvar schema;\r\n\tif (this.schemas[url] !== undefined) {\r\n\t\tschema = this.schemas[url];\r\n\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t}\r\n\tvar baseUrl = url;\r\n\tvar fragment = "";\r\n\tif (url.indexOf(\'#\') !== -1) {\r\n\t\tfragment = url.substring(url.indexOf("#") + 1);\r\n\t\tbaseUrl = url.substring(0, url.indexOf("#"));\r\n\t}\r\n\tif (typeof this.schemas[baseUrl] === \'object\') {\r\n\t\tschema = this.schemas[baseUrl];\r\n\t\tvar pointerPath = decodeURIComponent(fragment);\r\n\t\tif (pointerPath === "") {\r\n\t\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t\t} else if (pointerPath.charAt(0) !== "/") {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tvar parts = pointerPath.split("/").slice(1);\r\n\t\tfor (var i = 0; i < parts.length; i++) {\r\n\t\t\tvar component = parts[i].replace(/~1/g, "/").replace(/~0/g, "~");\r\n\t\t\tif (schema[component] === undefined) {\r\n\t\t\t\tschema = undefined;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tschema = schema[component];\r\n\t\t}\r\n\t\tif (schema !== undefined) {\r\n\t\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t\t}\r\n\t}\r\n\tif (this.missing[baseUrl] === undefined) {\r\n\t\tthis.missing.push(baseUrl);\r\n\t\tthis.missing[baseUrl] = baseUrl;\r\n\t\tthis.missingMap[baseUrl] = baseUrl;\r\n\t}\r\n};\r\nValidatorContext.prototype.searchSchemas = function (schema, url) {\r\n\tif (Array.isArray(schema)) {\r\n\t\tfor (var i = 0; i < schema.length; i++) {\r\n\t\t\tthis.searchSchemas(schema[i], url);\r\n\t\t}\r\n\t} else if (schema && typeof schema === "object") {\r\n\t\tif (typeof schema.id === "string") {\r\n\t\t\tif (isTrustedUrl(url, schema.id)) {\r\n\t\t\t\tif (this.schemas[schema.id] === undefined) {\r\n\t\t\t\t\tthis.schemas[schema.id] = schema;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (var key in schema) {\r\n\t\t\tif (key !== "enum") {\r\n\t\t\t\tif (typeof schema[key] === "object") {\r\n\t\t\t\t\tthis.searchSchemas(schema[key], url);\r\n\t\t\t\t} else if (key === "$ref") {\r\n\t\t\t\t\tvar uri = getDocumentUri(schema[key]);\r\n\t\t\t\t\tif (uri && this.schemas[uri] === undefined && this.missingMap[uri] === undefined) {\r\n\t\t\t\t\t\tthis.missingMap[uri] = uri;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\nValidatorContext.prototype.addSchema = function (url, schema) {\r\n\t//overload\r\n\tif (typeof url !== \'string\' || typeof schema === \'undefined\') {\r\n\t\tif (typeof url === \'object\' && typeof url.id === \'string\') {\r\n\t\t\tschema = url;\r\n\t\t\turl = schema.id;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\tif (url === getDocumentUri(url) + "#") {\r\n\t\t// Remove empty fragment\r\n\t\turl = getDocumentUri(url);\r\n\t}\r\n\tthis.schemas[url] = schema;\r\n\tdelete this.missingMap[url];\r\n\tnormSchema(schema, url);\r\n\tthis.searchSchemas(schema, url);\r\n};\r\n\r\nValidatorContext.prototype.getSchemaMap = function () {\r\n\tvar map = {};\r\n\tfor (var key in this.schemas) {\r\n\t\tmap[key] = this.schemas[key];\r\n\t}\r\n\treturn map;\r\n};\r\n\r\nValidatorContext.prototype.getSchemaUris = function (filterRegExp) {\r\n\tvar list = [];\r\n\tfor (var key in this.schemas) {\r\n\t\tif (!filterRegExp || filterRegExp.test(key)) {\r\n\t\t\tlist.push(key);\r\n\t\t}\r\n\t}\r\n\treturn list;\r\n};\r\n\r\nValidatorContext.prototype.getMissingUris = function (filterRegExp) {\r\n\tvar list = [];\r\n\tfor (var key in this.missingMap) {\r\n\t\tif (!filterRegExp || filterRegExp.test(key)) {\r\n\t\t\tlist.push(key);\r\n\t\t}\r\n\t}\r\n\treturn list;\r\n};\r\n\r\nValidatorContext.prototype.dropSchemas = function () {\r\n\tthis.schemas = {};\r\n\tthis.reset();\r\n};\r\nValidatorContext.prototype.reset = function () {\r\n\tthis.missing = [];\r\n\tthis.missingMap = {};\r\n\tthis.errors = [];\r\n};\r\n\r\nValidatorContext.prototype.validateAll = function (data, schema, dataPathParts, schemaPathParts, dataPointerPath) {\r\n\tvar topLevel;\r\n\tschema = this.resolveRefs(schema);\r\n\tif (!schema) {\r\n\t\treturn null;\r\n\t} else if (schema instanceof ValidationError) {\r\n\t\tthis.errors.push(schema);\r\n\t\treturn schema;\r\n\t}\r\n\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar frozenIndex, scannedFrozenSchemaIndex = null, scannedSchemasIndex = null;\r\n\tif (this.checkRecursive && data && typeof data === \'object\') {\r\n\t\ttopLevel = !this.scanned.length;\r\n\t\tif (data[this.validatedSchemasKey]) {\r\n\t\t\tvar schemaIndex = data[this.validatedSchemasKey].indexOf(schema);\r\n\t\t\tif (schemaIndex !== -1) {\r\n\t\t\t\tthis.errors = this.errors.concat(data[this.validationErrorsKey][schemaIndex]);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (Object.isFrozen(data)) {\r\n\t\t\tfrozenIndex = this.scannedFrozen.indexOf(data);\r\n\t\t\tif (frozenIndex !== -1) {\r\n\t\t\t\tvar frozenSchemaIndex = this.scannedFrozenSchemas[frozenIndex].indexOf(schema);\r\n\t\t\t\tif (frozenSchemaIndex !== -1) {\r\n\t\t\t\t\tthis.errors = this.errors.concat(this.scannedFrozenValidationErrors[frozenIndex][frozenSchemaIndex]);\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.scanned.push(data);\r\n\t\tif (Object.isFrozen(data)) {\r\n\t\t\tif (frozenIndex === -1) {\r\n\t\t\t\tfrozenIndex = this.scannedFrozen.length;\r\n\t\t\t\tthis.scannedFrozen.push(data);\r\n\t\t\t\tthis.scannedFrozenSchemas.push([]);\r\n\t\t\t}\r\n\t\t\tscannedFrozenSchemaIndex = this.scannedFrozenSchemas[frozenIndex].length;\r\n\t\t\tthis.scannedFrozenSchemas[frozenIndex][scannedFrozenSchemaIndex] = schema;\r\n\t\t\tthis.scannedFrozenValidationErrors[frozenIndex][scannedFrozenSchemaIndex] = [];\r\n\t\t} else {\r\n\t\t\tif (!data[this.validatedSchemasKey]) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tObject.defineProperty(data, this.validatedSchemasKey, {\r\n\t\t\t\t\t\tvalue: [],\r\n\t\t\t\t\t\tconfigurable: true\r\n\t\t\t\t\t});\r\n\t\t\t\t\tObject.defineProperty(data, this.validationErrorsKey, {\r\n\t\t\t\t\t\tvalue: [],\r\n\t\t\t\t\t\tconfigurable: true\r\n\t\t\t\t\t});\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\t//IE 7/8 workaround\r\n\t\t\t\t\tdata[this.validatedSchemasKey] = [];\r\n\t\t\t\t\tdata[this.validationErrorsKey] = [];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tscannedSchemasIndex = data[this.validatedSchemasKey].length;\r\n\t\t\tdata[this.validatedSchemasKey][scannedSchemasIndex] = schema;\r\n\t\t\tdata[this.validationErrorsKey][scannedSchemasIndex] = [];\r\n\t\t}\r\n\t}\r\n\r\n\tvar errorCount = this.errors.length;\r\n\tvar error = this.validateBasic(data, schema, dataPointerPath)\r\n\t\t|| this.validateNumeric(data, schema, dataPointerPath)\r\n\t\t|| this.validateString(data, schema, dataPointerPath)\r\n\t\t|| this.validateArray(data, schema, dataPointerPath)\r\n\t\t|| this.validateObject(data, schema, dataPointerPath)\r\n\t\t|| this.validateCombinations(data, schema, dataPointerPath)\r\n\t\t|| this.validateHypermedia(data, schema, dataPointerPath)\r\n\t\t|| this.validateFormat(data, schema, dataPointerPath)\r\n\t\t|| this.validateDefinedKeywords(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n\r\n\tif (topLevel) {\r\n\t\twhile (this.scanned.length) {\r\n\t\t\tvar item = this.scanned.pop();\r\n\t\t\tdelete item[this.validatedSchemasKey];\r\n\t\t}\r\n\t\tthis.scannedFrozen = [];\r\n\t\tthis.scannedFrozenSchemas = [];\r\n\t}\r\n\r\n\tif (error || errorCount !== this.errors.length) {\r\n\t\twhile ((dataPathParts && dataPathParts.length) || (schemaPathParts && schemaPathParts.length)) {\r\n\t\t\tvar dataPart = (dataPathParts && dataPathParts.length) ? "" + dataPathParts.pop() : null;\r\n\t\t\tvar schemaPart = (schemaPathParts && schemaPathParts.length) ? "" + schemaPathParts.pop() : null;\r\n\t\t\tif (error) {\r\n\t\t\t\terror = error.prefixWith(dataPart, schemaPart);\r\n\t\t\t}\r\n\t\t\tthis.prefixErrors(errorCount, dataPart, schemaPart);\r\n\t\t}\r\n\t}\r\n\r\n\tif (scannedFrozenSchemaIndex !== null) {\r\n\t\tthis.scannedFrozenValidationErrors[frozenIndex][scannedFrozenSchemaIndex] = this.errors.slice(startErrorCount);\r\n\t} else if (scannedSchemasIndex !== null) {\r\n\t\tdata[this.validationErrorsKey][scannedSchemasIndex] = this.errors.slice(startErrorCount);\r\n\t}\r\n\r\n\treturn this.handleError(error);\r\n};\r\nValidatorContext.prototype.validateFormat = function (data, schema) {\r\n\tif (typeof schema.format !== \'string\' || !this.formatValidators[schema.format]) {\r\n\t\treturn null;\r\n\t}\r\n\tvar errorMessage = this.formatValidators[schema.format].call(null, data, schema);\r\n\tif (typeof errorMessage === \'string\' || typeof errorMessage === \'number\') {\r\n\t\treturn this.createError(ErrorCodes.FORMAT_CUSTOM, {message: errorMessage}, \'\', \'/format\', null, data, schema);\r\n\t} else if (errorMessage && typeof errorMessage === \'object\') {\r\n\t\treturn this.createError(ErrorCodes.FORMAT_CUSTOM, {message: errorMessage.message || "?"}, errorMessage.dataPath || \'\', errorMessage.schemaPath || "/format", null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\nValidatorContext.prototype.validateDefinedKeywords = function (data, schema, dataPointerPath) {\r\n\tfor (var key in this.definedKeywords) {\r\n\t\tif (typeof schema[key] === \'undefined\') {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tvar validationFunctions = this.definedKeywords[key];\r\n\t\tfor (var i = 0; i < validationFunctions.length; i++) {\r\n\t\t\tvar func = validationFunctions[i];\r\n\t\t\tvar result = func(data, schema[key], schema, dataPointerPath);\r\n\t\t\tif (typeof result === \'string\' || typeof result === \'number\') {\r\n\t\t\t\treturn this.createError(ErrorCodes.KEYWORD_CUSTOM, {key: key, message: result}, \'\', \'\', null, data, schema).prefixWith(null, key);\r\n\t\t\t} else if (result && typeof result === \'object\') {\r\n\t\t\t\tvar code = result.code;\r\n\t\t\t\tif (typeof code === \'string\') {\r\n\t\t\t\t\tif (!ErrorCodes[code]) {\r\n\t\t\t\t\t\tthrow new Error(\'Undefined error code (use defineError): \' + code);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcode = ErrorCodes[code];\r\n\t\t\t\t} else if (typeof code !== \'number\') {\r\n\t\t\t\t\tcode = ErrorCodes.KEYWORD_CUSTOM;\r\n\t\t\t\t}\r\n\t\t\t\tvar messageParams = (typeof result.message === \'object\') ? result.message : {key: key, message: result.message || "?"};\r\n\t\t\t\tvar schemaPath = result.schemaPath || ("/" + key.replace(/~/g, \'~0\').replace(/\\//g, \'~1\'));\r\n\t\t\t\treturn this.createError(code, messageParams, result.dataPath || null, schemaPath, null, data, schema);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nfunction recursiveCompare(A, B) {\r\n\tif (A === B) {\r\n\t\treturn true;\r\n\t}\r\n\tif (A && B && typeof A === "object" && typeof B === "object") {\r\n\t\tif (Array.isArray(A) !== Array.isArray(B)) {\r\n\t\t\treturn false;\r\n\t\t} else if (Array.isArray(A)) {\r\n\t\t\tif (A.length !== B.length) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor (var i = 0; i < A.length; i++) {\r\n\t\t\t\tif (!recursiveCompare(A[i], B[i])) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvar key;\r\n\t\t\tfor (key in A) {\r\n\t\t\t\tif (B[key] === undefined && A[key] !== undefined) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (key in B) {\r\n\t\t\t\tif (A[key] === undefined && B[key] !== undefined) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (key in A) {\r\n\t\t\t\tif (!recursiveCompare(A[key], B[key])) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nValidatorContext.prototype.validateBasic = function validateBasic(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tif (error = this.validateType(data, schema, dataPointerPath)) {\r\n\t\treturn error.prefixWith(null, "type");\r\n\t}\r\n\tif (error = this.validateEnum(data, schema, dataPointerPath)) {\r\n\t\treturn error.prefixWith(null, "type");\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateType = function validateType(data, schema) {\r\n\tif (schema.type === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar dataType = typeof data;\r\n\tif (data === null) {\r\n\t\tdataType = "null";\r\n\t} else if (Array.isArray(data)) {\r\n\t\tdataType = "array";\r\n\t}\r\n\tvar allowedTypes = schema.type;\r\n\tif (!Array.isArray(allowedTypes)) {\r\n\t\tallowedTypes = [allowedTypes];\r\n\t}\r\n\r\n\tfor (var i = 0; i < allowedTypes.length; i++) {\r\n\t\tvar type = allowedTypes[i];\r\n\t\tif (type === dataType || (type === "integer" && dataType === "number" && (data % 1 === 0))) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\treturn this.createError(ErrorCodes.INVALID_TYPE, {type: dataType, expected: allowedTypes.join("/")}, \'\', \'\', null, data, schema);\r\n};\r\n\r\nValidatorContext.prototype.validateEnum = function validateEnum(data, schema) {\r\n\tif (schema["enum"] === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tfor (var i = 0; i < schema["enum"].length; i++) {\r\n\t\tvar enumVal = schema["enum"][i];\r\n\t\tif (recursiveCompare(data, enumVal)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\treturn this.createError(ErrorCodes.ENUM_MISMATCH, {value: (typeof JSON !== \'undefined\') ? JSON.stringify(data) : data}, \'\', \'\', null, data, schema);\r\n};\r\n\r\nValidatorContext.prototype.validateNumeric = function validateNumeric(data, schema, dataPointerPath) {\r\n\treturn this.validateMultipleOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateMinMax(data, schema, dataPointerPath)\r\n\t\t|| this.validateNaN(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nvar CLOSE_ENOUGH_LOW = Math.pow(2, -51);\r\nvar CLOSE_ENOUGH_HIGH = 1 - CLOSE_ENOUGH_LOW;\r\nValidatorContext.prototype.validateMultipleOf = function validateMultipleOf(data, schema) {\r\n\tvar multipleOf = schema.multipleOf || schema.divisibleBy;\r\n\tif (multipleOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tif (typeof data === "number") {\r\n\t\tvar remainder = (data/multipleOf)%1;\r\n\t\tif (remainder >= CLOSE_ENOUGH_LOW && remainder < CLOSE_ENOUGH_HIGH) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MULTIPLE_OF, {value: data, multipleOf: multipleOf}, \'\', \'\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateMinMax = function validateMinMax(data, schema) {\r\n\tif (typeof data !== "number") {\r\n\t\treturn null;\r\n\t}\r\n\tif (schema.minimum !== undefined) {\r\n\t\tif (data < schema.minimum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MINIMUM, {value: data, minimum: schema.minimum}, \'\', \'/minimum\', null, data, schema);\r\n\t\t}\r\n\t\tif (schema.exclusiveMinimum && data === schema.minimum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MINIMUM_EXCLUSIVE, {value: data, minimum: schema.minimum}, \'\', \'/exclusiveMinimum\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\tif (schema.maximum !== undefined) {\r\n\t\tif (data > schema.maximum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MAXIMUM, {value: data, maximum: schema.maximum}, \'\', \'/maximum\', null, data, schema);\r\n\t\t}\r\n\t\tif (schema.exclusiveMaximum && data === schema.maximum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MAXIMUM_EXCLUSIVE, {value: data, maximum: schema.maximum}, \'\', \'/exclusiveMaximum\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateNaN = function validateNaN(data, schema) {\r\n\tif (typeof data !== "number") {\r\n\t\treturn null;\r\n\t}\r\n\tif (isNaN(data) === true || data === Infinity || data === -Infinity) {\r\n\t\treturn this.createError(ErrorCodes.NUMBER_NOT_A_NUMBER, {value: data}, \'\', \'/type\', null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateString = function validateString(data, schema, dataPointerPath) {\r\n\treturn this.validateStringLength(data, schema, dataPointerPath)\r\n\t\t|| this.validateStringPattern(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateStringLength = function validateStringLength(data, schema) {\r\n\tif (typeof data !== "string") {\r\n\t\treturn null;\r\n\t}\r\n\tif (schema.minLength !== undefined) {\r\n\t\tif (data.length < schema.minLength) {\r\n\t\t\treturn this.createError(ErrorCodes.STRING_LENGTH_SHORT, {length: data.length, minimum: schema.minLength}, \'\', \'/minLength\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\tif (schema.maxLength !== undefined) {\r\n\t\tif (data.length > schema.maxLength) {\r\n\t\t\treturn this.createError(ErrorCodes.STRING_LENGTH_LONG, {length: data.length, maximum: schema.maxLength}, \'\', \'/maxLength\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateStringPattern = function validateStringPattern(data, schema) {\r\n\tif (typeof data !== "string" || (typeof schema.pattern !== "string" && !(schema.pattern instanceof RegExp))) {\r\n\t\treturn null;\r\n\t}\r\n\tvar regexp;\r\n\tif (schema.pattern instanceof RegExp) {\r\n\t regexp = schema.pattern;\r\n\t}\r\n\telse {\r\n\t var body, flags = \'\';\r\n\t // Check for regular expression literals\r\n\t // @see http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.5\r\n\t var literal = schema.pattern.match(/^\\/(.+)\\/([img]*)$/);\r\n\t if (literal) {\r\n\t body = literal[1];\r\n\t flags = literal[2];\r\n\t }\r\n\t else {\r\n\t body = schema.pattern;\r\n\t }\r\n\t regexp = new RegExp(body, flags);\r\n\t}\r\n\tif (!regexp.test(data)) {\r\n\t\treturn this.createError(ErrorCodes.STRING_PATTERN, {pattern: schema.pattern}, \'\', \'/pattern\', null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArray = function validateArray(data, schema, dataPointerPath) {\r\n\tif (!Array.isArray(data)) {\r\n\t\treturn null;\r\n\t}\r\n\treturn this.validateArrayLength(data, schema, dataPointerPath)\r\n\t\t|| this.validateArrayUniqueItems(data, schema, dataPointerPath)\r\n\t\t|| this.validateArrayItems(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayLength = function validateArrayLength(data, schema) {\r\n\tvar error;\r\n\tif (schema.minItems !== undefined) {\r\n\t\tif (data.length < schema.minItems) {\r\n\t\t\terror = this.createError(ErrorCodes.ARRAY_LENGTH_SHORT, {length: data.length, minimum: schema.minItems}, \'\', \'/minItems\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (schema.maxItems !== undefined) {\r\n\t\tif (data.length > schema.maxItems) {\r\n\t\t\terror = this.createError(ErrorCodes.ARRAY_LENGTH_LONG, {length: data.length, maximum: schema.maxItems}, \'\', \'/maxItems\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayUniqueItems = function validateArrayUniqueItems(data, schema) {\r\n\tif (schema.uniqueItems) {\r\n\t\tfor (var i = 0; i < data.length; i++) {\r\n\t\t\tfor (var j = i + 1; j < data.length; j++) {\r\n\t\t\t\tif (recursiveCompare(data[i], data[j])) {\r\n\t\t\t\t\tvar error = this.createError(ErrorCodes.ARRAY_UNIQUE, {match1: i, match2: j}, \'\', \'/uniqueItems\', null, data, schema);\r\n\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayItems = function validateArrayItems(data, schema, dataPointerPath) {\r\n\tif (schema.items === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error, i;\r\n\tif (Array.isArray(schema.items)) {\r\n\t\tfor (i = 0; i < data.length; i++) {\r\n\t\t\tif (i < schema.items.length) {\r\n\t\t\t\tif (error = this.validateAll(data[i], schema.items[i], [i], ["items", i], dataPointerPath + "/" + i)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t} else if (schema.additionalItems !== undefined) {\r\n\t\t\t\tif (typeof schema.additionalItems === "boolean") {\r\n\t\t\t\t\tif (!schema.additionalItems) {\r\n\t\t\t\t\t\terror = (this.createError(ErrorCodes.ARRAY_ADDITIONAL_ITEMS, {}, \'/\' + i, \'/additionalItems\', null, data, schema));\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (error = this.validateAll(data[i], schema.additionalItems, [i], ["additionalItems"], dataPointerPath + "/" + i)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tfor (i = 0; i < data.length; i++) {\r\n\t\t\tif (error = this.validateAll(data[i], schema.items, [i], ["items"], dataPointerPath + "/" + i)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObject = function validateObject(data, schema, dataPointerPath) {\r\n\tif (typeof data !== "object" || data === null || Array.isArray(data)) {\r\n\t\treturn null;\r\n\t}\r\n\treturn this.validateObjectMinMaxProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectRequiredProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectDependencies(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectMinMaxProperties = function validateObjectMinMaxProperties(data, schema) {\r\n\tvar keys = Object.keys(data);\r\n\tvar error;\r\n\tif (schema.minProperties !== undefined) {\r\n\t\tif (keys.length < schema.minProperties) {\r\n\t\t\terror = this.createError(ErrorCodes.OBJECT_PROPERTIES_MINIMUM, {propertyCount: keys.length, minimum: schema.minProperties}, \'\', \'/minProperties\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (schema.maxProperties !== undefined) {\r\n\t\tif (keys.length > schema.maxProperties) {\r\n\t\t\terror = this.createError(ErrorCodes.OBJECT_PROPERTIES_MAXIMUM, {propertyCount: keys.length, maximum: schema.maxProperties}, \'\', \'/maxProperties\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectRequiredProperties = function validateObjectRequiredProperties(data, schema) {\r\n\tif (schema.required !== undefined) {\r\n\t\tfor (var i = 0; i < schema.required.length; i++) {\r\n\t\t\tvar key = schema.required[i];\r\n\t\t\tif (data[key] === undefined) {\r\n\t\t\t\tvar error = this.createError(ErrorCodes.OBJECT_REQUIRED, {key: key}, \'\', \'/required/\' + i, null, data, schema);\r\n\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectProperties = function validateObjectProperties(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tfor (var key in data) {\r\n\t\tvar keyPointerPath = dataPointerPath + "/" + key.replace(/~/g, \'~0\').replace(/\\//g, \'~1\');\r\n\t\tvar foundMatch = false;\r\n\t\tif (schema.properties !== undefined && schema.properties[key] !== undefined) {\r\n\t\t\tfoundMatch = true;\r\n\t\t\tif (error = this.validateAll(data[key], schema.properties[key], [key], ["properties", key], keyPointerPath)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (schema.patternProperties !== undefined) {\r\n\t\t\tfor (var patternKey in schema.patternProperties) {\r\n\t\t\t\tvar regexp = new RegExp(patternKey);\r\n\t\t\t\tif (regexp.test(key)) {\r\n\t\t\t\t\tfoundMatch = true;\r\n\t\t\t\t\tif (error = this.validateAll(data[key], schema.patternProperties[patternKey], [key], ["patternProperties", patternKey], keyPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!foundMatch) {\r\n\t\t\tif (schema.additionalProperties !== undefined) {\r\n\t\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\t\tthis.knownPropertyPaths[keyPointerPath] = true;\r\n\t\t\t\t\tdelete this.unknownPropertyPaths[keyPointerPath];\r\n\t\t\t\t}\r\n\t\t\t\tif (typeof schema.additionalProperties === "boolean") {\r\n\t\t\t\t\tif (!schema.additionalProperties) {\r\n\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_ADDITIONAL_PROPERTIES, {key: key}, \'\', \'/additionalProperties\', null, data, schema).prefixWith(key, null);\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (error = this.validateAll(data[key], schema.additionalProperties, [key], ["additionalProperties"], keyPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (this.trackUnknownProperties && !this.knownPropertyPaths[keyPointerPath]) {\r\n\t\t\t\tthis.unknownPropertyPaths[keyPointerPath] = true;\r\n\t\t\t}\r\n\t\t} else if (this.trackUnknownProperties) {\r\n\t\t\tthis.knownPropertyPaths[keyPointerPath] = true;\r\n\t\t\tdelete this.unknownPropertyPaths[keyPointerPath];\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectDependencies = function validateObjectDependencies(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tif (schema.dependencies !== undefined) {\r\n\t\tfor (var depKey in schema.dependencies) {\r\n\t\t\tif (data[depKey] !== undefined) {\r\n\t\t\t\tvar dep = schema.dependencies[depKey];\r\n\t\t\t\tif (typeof dep === "string") {\r\n\t\t\t\t\tif (data[dep] === undefined) {\r\n\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_DEPENDENCY_KEY, {key: depKey, missing: dep}, \'\', \'\', null, data, schema).prefixWith(null, depKey).prefixWith(null, "dependencies");\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (Array.isArray(dep)) {\r\n\t\t\t\t\tfor (var i = 0; i < dep.length; i++) {\r\n\t\t\t\t\t\tvar requiredKey = dep[i];\r\n\t\t\t\t\t\tif (data[requiredKey] === undefined) {\r\n\t\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_DEPENDENCY_KEY, {key: depKey, missing: requiredKey}, \'\', \'/\' + i, null, data, schema).prefixWith(null, depKey).prefixWith(null, "dependencies");\r\n\t\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (error = this.validateAll(data, dep, [], ["dependencies", depKey], dataPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateCombinations = function validateCombinations(data, schema, dataPointerPath) {\r\n\treturn this.validateAllOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateAnyOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateOneOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateNot(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateAllOf = function validateAllOf(data, schema, dataPointerPath) {\r\n\tif (schema.allOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error;\r\n\tfor (var i = 0; i < schema.allOf.length; i++) {\r\n\t\tvar subSchema = schema.allOf[i];\r\n\t\tif (error = this.validateAll(data, subSchema, [], ["allOf", i], dataPointerPath)) {\r\n\t\t\treturn error;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateAnyOf = function validateAnyOf(data, schema, dataPointerPath) {\r\n\tif (schema.anyOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar errors = [];\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t}\r\n\tvar errorAtEnd = true;\r\n\tfor (var i = 0; i < schema.anyOf.length; i++) {\r\n\t\tif (this.trackUnknownProperties) {\r\n\t\t\tthis.unknownPropertyPaths = {};\r\n\t\t\tthis.knownPropertyPaths = {};\r\n\t\t}\r\n\t\tvar subSchema = schema.anyOf[i];\r\n\r\n\t\tvar errorCount = this.errors.length;\r\n\t\tvar error = this.validateAll(data, subSchema, [], ["anyOf", i], dataPointerPath);\r\n\r\n\t\tif (error === null && errorCount === this.errors.length) {\r\n\t\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\r\n\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\tfor (var knownKey in this.knownPropertyPaths) {\r\n\t\t\t\t\toldKnownPropertyPaths[knownKey] = true;\r\n\t\t\t\t\tdelete oldUnknownPropertyPaths[knownKey];\r\n\t\t\t\t}\r\n\t\t\t\tfor (var unknownKey in this.unknownPropertyPaths) {\r\n\t\t\t\t\tif (!oldKnownPropertyPaths[unknownKey]) {\r\n\t\t\t\t\t\toldUnknownPropertyPaths[unknownKey] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// We need to continue looping so we catch all the property definitions, but we don\'t want to return an error\r\n\t\t\t\terrorAtEnd = false;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tif (error) {\r\n\t\t\terrors.push(error.prefixWith(null, "" + i).prefixWith(null, "anyOf"));\r\n\t\t}\r\n\t}\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (errorAtEnd) {\r\n\t\terrors = errors.concat(this.errors.slice(startErrorCount));\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\treturn this.createError(ErrorCodes.ANY_OF_MISSING, {}, "", "/anyOf", errors, data, schema);\r\n\t}\r\n};\r\n\r\nValidatorContext.prototype.validateOneOf = function validateOneOf(data, schema, dataPointerPath) {\r\n\tif (schema.oneOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar validIndex = null;\r\n\tvar errors = [];\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t}\r\n\tfor (var i = 0; i < schema.oneOf.length; i++) {\r\n\t\tif (this.trackUnknownProperties) {\r\n\t\t\tthis.unknownPropertyPaths = {};\r\n\t\t\tthis.knownPropertyPaths = {};\r\n\t\t}\r\n\t\tvar subSchema = schema.oneOf[i];\r\n\r\n\t\tvar errorCount = this.errors.length;\r\n\t\tvar error = this.validateAll(data, subSchema, [], ["oneOf", i], dataPointerPath);\r\n\r\n\t\tif (error === null && errorCount === this.errors.length) {\r\n\t\t\tif (validIndex === null) {\r\n\t\t\t\tvalidIndex = i;\r\n\t\t\t} else {\r\n\t\t\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\t\t\treturn this.createError(ErrorCodes.ONE_OF_MULTIPLE, {index1: validIndex, index2: i}, "", "/oneOf", null, data, schema);\r\n\t\t\t}\r\n\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\tfor (var knownKey in this.knownPropertyPaths) {\r\n\t\t\t\t\toldKnownPropertyPaths[knownKey] = true;\r\n\t\t\t\t\tdelete oldUnknownPropertyPaths[knownKey];\r\n\t\t\t\t}\r\n\t\t\t\tfor (var unknownKey in this.unknownPropertyPaths) {\r\n\t\t\t\t\tif (!oldKnownPropertyPaths[unknownKey]) {\r\n\t\t\t\t\t\toldUnknownPropertyPaths[unknownKey] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (error) {\r\n\t\t\terrors.push(error);\r\n\t\t}\r\n\t}\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (validIndex === null) {\r\n\t\terrors = errors.concat(this.errors.slice(startErrorCount));\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\treturn this.createError(ErrorCodes.ONE_OF_MISSING, {}, "", "/oneOf", errors, data, schema);\r\n\t} else {\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateNot = function validateNot(data, schema, dataPointerPath) {\r\n\tif (schema.not === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar oldErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t\tthis.unknownPropertyPaths = {};\r\n\t\tthis.knownPropertyPaths = {};\r\n\t}\r\n\tvar error = this.validateAll(data, schema.not, null, null, dataPointerPath);\r\n\tvar notErrors = this.errors.slice(oldErrorCount);\r\n\tthis.errors = this.errors.slice(0, oldErrorCount);\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (error === null && notErrors.length === 0) {\r\n\t\treturn this.createError(ErrorCodes.NOT_PASSED, {}, "", "/not", null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateHypermedia = function validateCombinations(data, schema, dataPointerPath) {\r\n\tif (!schema.links) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error;\r\n\tfor (var i = 0; i < schema.links.length; i++) {\r\n\t\tvar ldo = schema.links[i];\r\n\t\tif (ldo.rel === "describedby") {\r\n\t\t\tvar template = new UriTemplate(ldo.href);\r\n\t\t\tvar allPresent = true;\r\n\t\t\tfor (var j = 0; j < template.varNames.length; j++) {\r\n\t\t\t\tif (!(template.varNames[j] in data)) {\r\n\t\t\t\t\tallPresent = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (allPresent) {\r\n\t\t\t\tvar schemaUrl = template.fillFromObject(data);\r\n\t\t\t\tvar subSchema = {"$ref": schemaUrl};\r\n\t\t\t\tif (error = this.validateAll(data, subSchema, [], ["links", i], dataPointerPath)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// parseURI() and resolveUrl() are from https://gist.github.com/1088850\r\n// - released as public domain by author ("Yaffle") - see comments on gist\r\n\r\nfunction parseURI(url) {\r\n\tvar m = String(url).replace(/^\\s+|\\s+$/g, \'\').match(/^([^:\\/?#]+:)?(\\/\\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\\/?#]*)(?::(\\d*))?))?([^?#]*)(\\?[^#]*)?(#[\\s\\S]*)?/);\r\n\t// authority = \'//\' + user + \':\' + pass \'@\' + hostname + \':\' port\r\n\treturn (m ? {\r\n\t\thref : m[0] || \'\',\r\n\t\tprotocol : m[1] || \'\',\r\n\t\tauthority: m[2] || \'\',\r\n\t\thost : m[3] || \'\',\r\n\t\thostname : m[4] || \'\',\r\n\t\tport : m[5] || \'\',\r\n\t\tpathname : m[6] || \'\',\r\n\t\tsearch : m[7] || \'\',\r\n\t\thash : m[8] || \'\'\r\n\t} : null);\r\n}\r\n\r\nfunction resolveUrl(base, href) {// RFC 3986\r\n\r\n\tfunction removeDotSegments(input) {\r\n\t\tvar output = [];\r\n\t\tinput.replace(/^(\\.\\.?(\\/|$))+/, \'\')\r\n\t\t\t.replace(/\\/(\\.(\\/|$))+/g, \'/\')\r\n\t\t\t.replace(/\\/\\.\\.$/, \'/../\')\r\n\t\t\t.replace(/\\/?[^\\/]*/g, function (p) {\r\n\t\t\t\tif (p === \'/..\') {\r\n\t\t\t\t\toutput.pop();\r\n\t\t\t\t} else {\r\n\t\t\t\t\toutput.push(p);\r\n\t\t\t\t}\r\n\t\t});\r\n\t\treturn output.join(\'\').replace(/^\\//, input.charAt(0) === \'/\' ? \'/\' : \'\');\r\n\t}\r\n\r\n\thref = parseURI(href || \'\');\r\n\tbase = parseURI(base || \'\');\r\n\r\n\treturn !href || !base ? null : (href.protocol || base.protocol) +\r\n\t\t(href.protocol || href.authority ? href.authority : base.authority) +\r\n\t\tremoveDotSegments(href.protocol || href.authority || href.pathname.charAt(0) === \'/\' ? href.pathname : (href.pathname ? ((base.authority && !base.pathname ? \'/\' : \'\') + base.pathname.slice(0, base.pathname.lastIndexOf(\'/\') + 1) + href.pathname) : base.pathname)) +\r\n\t\t(href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) +\r\n\t\thref.hash;\r\n}\r\n\r\nfunction getDocumentUri(uri) {\r\n\treturn uri.split(\'#\')[0];\r\n}\r\nfunction normSchema(schema, baseUri) {\r\n\tif (schema && typeof schema === "object") {\r\n\t\tif (baseUri === undefined) {\r\n\t\t\tbaseUri = schema.id;\r\n\t\t} else if (typeof schema.id === "string") {\r\n\t\t\tbaseUri = resolveUrl(baseUri, schema.id);\r\n\t\t\tschema.id = baseUri;\r\n\t\t}\r\n\t\tif (Array.isArray(schema)) {\r\n\t\t\tfor (var i = 0; i < schema.length; i++) {\r\n\t\t\t\tnormSchema(schema[i], baseUri);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (typeof schema[\'$ref\'] === "string") {\r\n\t\t\t\tschema[\'$ref\'] = resolveUrl(baseUri, schema[\'$ref\']);\r\n\t\t\t}\r\n\t\t\tfor (var key in schema) {\r\n\t\t\t\tif (key !== "enum") {\r\n\t\t\t\t\tnormSchema(schema[key], baseUri);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction defaultErrorReporter(language) {\r\n\tlanguage = language || \'en\';\r\n\r\n\tvar errorMessages = languages[language];\r\n\r\n\treturn function (error) {\r\n\t\tvar messageTemplate = errorMessages[error.code] || ErrorMessagesDefault[error.code];\r\n\t\tif (typeof messageTemplate !== \'string\') {\r\n\t\t\treturn "Unknown error code " + error.code + ": " + JSON.stringify(error.messageParams);\r\n\t\t}\r\n\t\tvar messageParams = error.params;\r\n\t\t// Adapted from Crockford\'s supplant()\r\n\t\treturn messageTemplate.replace(/\\{([^{}]*)\\}/g, function (whole, varName) {\r\n\t\t\tvar subValue = messageParams[varName];\r\n\t\t\treturn typeof subValue === \'string\' || typeof subValue === \'number\' ? subValue : whole;\r\n\t\t});\r\n\t};\r\n}\r\n\r\nvar ErrorCodes = {\r\n\tINVALID_TYPE: 0,\r\n\tENUM_MISMATCH: 1,\r\n\tANY_OF_MISSING: 10,\r\n\tONE_OF_MISSING: 11,\r\n\tONE_OF_MULTIPLE: 12,\r\n\tNOT_PASSED: 13,\r\n\t// Numeric errors\r\n\tNUMBER_MULTIPLE_OF: 100,\r\n\tNUMBER_MINIMUM: 101,\r\n\tNUMBER_MINIMUM_EXCLUSIVE: 102,\r\n\tNUMBER_MAXIMUM: 103,\r\n\tNUMBER_MAXIMUM_EXCLUSIVE: 104,\r\n\tNUMBER_NOT_A_NUMBER: 105,\r\n\t// String errors\r\n\tSTRING_LENGTH_SHORT: 200,\r\n\tSTRING_LENGTH_LONG: 201,\r\n\tSTRING_PATTERN: 202,\r\n\t// Object errors\r\n\tOBJECT_PROPERTIES_MINIMUM: 300,\r\n\tOBJECT_PROPERTIES_MAXIMUM: 301,\r\n\tOBJECT_REQUIRED: 302,\r\n\tOBJECT_ADDITIONAL_PROPERTIES: 303,\r\n\tOBJECT_DEPENDENCY_KEY: 304,\r\n\t// Array errors\r\n\tARRAY_LENGTH_SHORT: 400,\r\n\tARRAY_LENGTH_LONG: 401,\r\n\tARRAY_UNIQUE: 402,\r\n\tARRAY_ADDITIONAL_ITEMS: 403,\r\n\t// Custom/user-defined errors\r\n\tFORMAT_CUSTOM: 500,\r\n\tKEYWORD_CUSTOM: 501,\r\n\t// Schema structure\r\n\tCIRCULAR_REFERENCE: 600,\r\n\t// Non-standard validation options\r\n\tUNKNOWN_PROPERTY: 1000\r\n};\r\nvar ErrorCodeLookup = {};\r\nfor (var key in ErrorCodes) {\r\n\tErrorCodeLookup[ErrorCodes[key]] = key;\r\n}\r\nvar ErrorMessagesDefault = {\r\n\tINVALID_TYPE: "Invalid type: {type} (expected {expected})",\r\n\tENUM_MISMATCH: "No enum match for: {value}",\r\n\tANY_OF_MISSING: "Data does not match any schemas from \\"anyOf\\"",\r\n\tONE_OF_MISSING: "Data does not match any schemas from \\"oneOf\\"",\r\n\tONE_OF_MULTIPLE: "Data is valid against more than one schema from \\"oneOf\\": indices {index1} and {index2}",\r\n\tNOT_PASSED: "Data matches schema from \\"not\\"",\r\n\t// Numeric errors\r\n\tNUMBER_MULTIPLE_OF: "Value {value} is not a multiple of {multipleOf}",\r\n\tNUMBER_MINIMUM: "Value {value} is less than minimum {minimum}",\r\n\tNUMBER_MINIMUM_EXCLUSIVE: "Value {value} is equal to exclusive minimum {minimum}",\r\n\tNUMBER_MAXIMUM: "Value {value} is greater than maximum {maximum}",\r\n\tNUMBER_MAXIMUM_EXCLUSIVE: "Value {value} is equal to exclusive maximum {maximum}",\r\n\tNUMBER_NOT_A_NUMBER: "Value {value} is not a valid number",\r\n\t// String errors\r\n\tSTRING_LENGTH_SHORT: "String is too short ({length} chars), minimum {minimum}",\r\n\tSTRING_LENGTH_LONG: "String is too long ({length} chars), maximum {maximum}",\r\n\tSTRING_PATTERN: "String does not match pattern: {pattern}",\r\n\t// Object errors\r\n\tOBJECT_PROPERTIES_MINIMUM: "Too few properties defined ({propertyCount}), minimum {minimum}",\r\n\tOBJECT_PROPERTIES_MAXIMUM: "Too many properties defined ({propertyCount}), maximum {maximum}",\r\n\tOBJECT_REQUIRED: "Missing required property: {key}",\r\n\tOBJECT_ADDITIONAL_PROPERTIES: "Additional properties not allowed",\r\n\tOBJECT_DEPENDENCY_KEY: "Dependency failed - key must exist: {missing} (due to key: {key})",\r\n\t// Array errors\r\n\tARRAY_LENGTH_SHORT: "Array is too short ({length}), minimum {minimum}",\r\n\tARRAY_LENGTH_LONG: "Array is too long ({length}), maximum {maximum}",\r\n\tARRAY_UNIQUE: "Array items are not unique (indices {match1} and {match2})",\r\n\tARRAY_ADDITIONAL_ITEMS: "Additional items not allowed",\r\n\t// Format errors\r\n\tFORMAT_CUSTOM: "Format validation failed ({message})",\r\n\tKEYWORD_CUSTOM: "Keyword failed: {key} ({message})",\r\n\t// Schema structure\r\n\tCIRCULAR_REFERENCE: "Circular $refs: {urls}",\r\n\t// Non-standard validation options\r\n\tUNKNOWN_PROPERTY: "Unknown property (not in schema)"\r\n};\r\n\r\nfunction ValidationError(code, params, dataPath, schemaPath, subErrors) {\r\n\tError.call(this);\r\n\tif (code === undefined) {\r\n\t\tthrow new Error ("No error code supplied: " + schemaPath);\r\n\t}\r\n\tthis.message = \'\';\r\n\tthis.params = params;\r\n\tthis.code = code;\r\n\tthis.dataPath = dataPath || "";\r\n\tthis.schemaPath = schemaPath || "";\r\n\tthis.subErrors = subErrors || null;\r\n\r\n\tvar err = new Error(this.message);\r\n\tthis.stack = err.stack || err.stacktrace;\r\n\tif (!this.stack) {\r\n\t\ttry {\r\n\t\t\tthrow err;\r\n\t\t}\r\n\t\tcatch(err) {\r\n\t\t\tthis.stack = err.stack || err.stacktrace;\r\n\t\t}\r\n\t}\r\n}\r\nValidationError.prototype = Object.create(Error.prototype);\r\nValidationError.prototype.constructor = ValidationError;\r\nValidationError.prototype.name = \'ValidationError\';\r\n\r\nValidationError.prototype.prefixWith = function (dataPrefix, schemaPrefix) {\r\n\tif (dataPrefix !== null) {\r\n\t\tdataPrefix = dataPrefix.replace(/~/g, "~0").replace(/\\//g, "~1");\r\n\t\tthis.dataPath = "/" + dataPrefix + this.dataPath;\r\n\t}\r\n\tif (schemaPrefix !== null) {\r\n\t\tschemaPrefix = schemaPrefix.replace(/~/g, "~0").replace(/\\//g, "~1");\r\n\t\tthis.schemaPath = "/" + schemaPrefix + this.schemaPath;\r\n\t}\r\n\tif (this.subErrors !== null) {\r\n\t\tfor (var i = 0; i < this.subErrors.length; i++) {\r\n\t\t\tthis.subErrors[i].prefixWith(dataPrefix, schemaPrefix);\r\n\t\t}\r\n\t}\r\n\treturn this;\r\n};\r\n\r\nfunction isTrustedUrl(baseUrl, testUrl) {\r\n\tif(testUrl.substring(0, baseUrl.length) === baseUrl){\r\n\t\tvar remainder = testUrl.substring(baseUrl.length);\r\n\t\tif ((testUrl.length > 0 && testUrl.charAt(baseUrl.length - 1) === "/")\r\n\t\t\t|| remainder.charAt(0) === "#"\r\n\t\t\t|| remainder.charAt(0) === "?") {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nvar languages = {};\r\nfunction createApi(language) {\r\n\tvar globalContext = new ValidatorContext();\r\n\tvar currentLanguage;\r\n\tvar customErrorReporter;\r\n\tvar api = {\r\n\t\tsetErrorReporter: function (reporter) {\r\n\t\t\tif (typeof reporter === \'string\') {\r\n\t\t\t\treturn this.language(reporter);\r\n\t\t\t}\r\n\t\t\tcustomErrorReporter = reporter;\r\n\t\t\treturn true;\r\n\t\t},\r\n\t\taddFormat: function () {\r\n\t\t\tglobalContext.addFormat.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tlanguage: function (code) {\r\n\t\t\tif (!code) {\r\n\t\t\t\treturn currentLanguage;\r\n\t\t\t}\r\n\t\t\tif (!languages[code]) {\r\n\t\t\t\tcode = code.split(\'-\')[0]; // fall back to base language\r\n\t\t\t}\r\n\t\t\tif (languages[code]) {\r\n\t\t\t\tcurrentLanguage = code;\r\n\t\t\t\treturn code; // so you can tell if fall-back has happened\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t},\r\n\t\taddLanguage: function (code, messageMap) {\r\n\t\t\tvar key;\r\n\t\t\tfor (key in ErrorCodes) {\r\n\t\t\t\tif (messageMap[key] && !messageMap[ErrorCodes[key]]) {\r\n\t\t\t\t\tmessageMap[ErrorCodes[key]] = messageMap[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar rootCode = code.split(\'-\')[0];\r\n\t\t\tif (!languages[rootCode]) { // use for base language if not yet defined\r\n\t\t\t\tlanguages[code] = messageMap;\r\n\t\t\t\tlanguages[rootCode] = messageMap;\r\n\t\t\t} else {\r\n\t\t\t\tlanguages[code] = Object.create(languages[rootCode]);\r\n\t\t\t\tfor (key in messageMap) {\r\n\t\t\t\t\tif (typeof languages[rootCode][key] === \'undefined\') {\r\n\t\t\t\t\t\tlanguages[rootCode][key] = messageMap[key];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlanguages[code][key] = messageMap[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t},\r\n\t\tfreshApi: function (language) {\r\n\t\t\tvar result = createApi();\r\n\t\t\tif (language) {\r\n\t\t\t\tresult.language(language);\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\tvalidate: function (data, schema, checkRecursive, banUnknownProperties) {\r\n\t\t\tvar def = defaultErrorReporter(currentLanguage);\r\n\t\t\tvar errorReporter = customErrorReporter ? function (error, data, schema) {\r\n\t\t\t\treturn customErrorReporter(error, data, schema) || def(error, data, schema);\r\n\t\t\t} : def;\r\n\t\t\tvar context = new ValidatorContext(globalContext, false, errorReporter, checkRecursive, banUnknownProperties);\r\n\t\t\tif (typeof schema === "string") {\r\n\t\t\t\tschema = {"$ref": schema};\r\n\t\t\t}\r\n\t\t\tcontext.addSchema("", schema);\r\n\t\t\tvar error = context.validateAll(data, schema, null, null, "");\r\n\t\t\tif (!error && banUnknownProperties) {\r\n\t\t\t\terror = context.banUnknownProperties(data, schema);\r\n\t\t\t}\r\n\t\t\tthis.error = error;\r\n\t\t\tthis.missing = context.missing;\r\n\t\t\tthis.valid = (error === null);\r\n\t\t\treturn this.valid;\r\n\t\t},\r\n\t\tvalidateResult: function () {\r\n\t\t\tvar result = {toString: function () {\r\n\t\t\t\treturn this.valid ? \'valid\' : this.error.message;\r\n\t\t\t}};\r\n\t\t\tthis.validate.apply(result, arguments);\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\tvalidateMultiple: function (data, schema, checkRecursive, banUnknownProperties) {\r\n\t\t\tvar def = defaultErrorReporter(currentLanguage);\r\n\t\t\tvar errorReporter = customErrorReporter ? function (error, data, schema) {\r\n\t\t\t\treturn customErrorReporter(error, data, schema) || def(error, data, schema);\r\n\t\t\t} : def;\r\n\t\t\tvar context = new ValidatorContext(globalContext, true, errorReporter, checkRecursive, banUnknownProperties);\r\n\t\t\tif (typeof schema === "string") {\r\n\t\t\t\tschema = {"$ref": schema};\r\n\t\t\t}\r\n\t\t\tcontext.addSchema("", schema);\r\n\t\t\tcontext.validateAll(data, schema, null, null, "");\r\n\t\t\tif (banUnknownProperties) {\r\n\t\t\t\tcontext.banUnknownProperties(data, schema);\r\n\t\t\t}\r\n\t\t\tvar result = {toString: function () {\r\n\t\t\t\treturn this.valid ? \'valid\' : this.error.message;\r\n\t\t\t}};\r\n\t\t\tresult.errors = context.errors;\r\n\t\t\tresult.missing = context.missing;\r\n\t\t\tresult.valid = (result.errors.length === 0);\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\taddSchema: function () {\r\n\t\t\treturn globalContext.addSchema.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchema: function () {\r\n\t\t\treturn globalContext.getSchema.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchemaMap: function () {\r\n\t\t\treturn globalContext.getSchemaMap.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchemaUris: function () {\r\n\t\t\treturn globalContext.getSchemaUris.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetMissingUris: function () {\r\n\t\t\treturn globalContext.getMissingUris.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdropSchemas: function () {\r\n\t\t\tglobalContext.dropSchemas.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdefineKeyword: function () {\r\n\t\t\tglobalContext.defineKeyword.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdefineError: function (codeName, codeNumber, defaultMessage) {\r\n\t\t\tif (typeof codeName !== \'string\' || !/^[A-Z]+(_[A-Z]+)*$/.test(codeName)) {\r\n\t\t\t\tthrow new Error(\'Code name must be a string in UPPER_CASE_WITH_UNDERSCORES\');\r\n\t\t\t}\r\n\t\t\tif (typeof codeNumber !== \'number\' || codeNumber%1 !== 0 || codeNumber < 10000) {\r\n\t\t\t\tthrow new Error(\'Code number must be an integer > 10000\');\r\n\t\t\t}\r\n\t\t\tif (typeof ErrorCodes[codeName] !== \'undefined\') {\r\n\t\t\t\tthrow new Error(\'Error already defined: \' + codeName + \' as \' + ErrorCodes[codeName]);\r\n\t\t\t}\r\n\t\t\tif (typeof ErrorCodeLookup[codeNumber] !== \'undefined\') {\r\n\t\t\t\tthrow new Error(\'Error code already used: \' + ErrorCodeLookup[codeNumber] + \' as \' + codeNumber);\r\n\t\t\t}\r\n\t\t\tErrorCodes[codeName] = codeNumber;\r\n\t\t\tErrorCodeLookup[codeNumber] = codeName;\r\n\t\t\tErrorMessagesDefault[codeName] = ErrorMessagesDefault[codeNumber] = defaultMessage;\r\n\t\t\tfor (var langCode in languages) {\r\n\t\t\t\tvar language = languages[langCode];\r\n\t\t\t\tif (language[codeName]) {\r\n\t\t\t\t\tlanguage[codeNumber] = language[codeNumber] || language[codeName];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\treset: function () {\r\n\t\t\tglobalContext.reset();\r\n\t\t\tthis.error = null;\r\n\t\t\tthis.missing = [];\r\n\t\t\tthis.valid = true;\r\n\t\t},\r\n\t\tmissing: [],\r\n\t\terror: null,\r\n\t\tvalid: true,\r\n\t\tnormSchema: normSchema,\r\n\t\tresolveUrl: resolveUrl,\r\n\t\tgetDocumentUri: getDocumentUri,\r\n\t\terrorCodes: ErrorCodes\r\n\t};\r\n\tapi.language(language || \'en\');\r\n\treturn api;\r\n}\r\n\r\nvar tv4 = createApi();\r\ntv4.addLanguage(\'en-gb\', ErrorMessagesDefault);\r\n\r\n//legacy property\r\ntv4.tv4 = tv4;\r\n\r\nreturn tv4; // used by _header.js to globalise.\r\n\r\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvdHY0L3R2NC5qcz84ZTUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbkF1dGhvcjogR2VyYWludCBMdWZmIGFuZCBvdGhlcnNcclxuWWVhcjogMjAxM1xyXG5cclxuVGhpcyBjb2RlIGlzIHJlbGVhc2VkIGludG8gdGhlIFwicHVibGljIGRvbWFpblwiIGJ5IGl0cyBhdXRob3IocykuICBBbnlib2R5IG1heSB1c2UsIGFsdGVyIGFuZCBkaXN0cmlidXRlIHRoZSBjb2RlIHdpdGhvdXQgcmVzdHJpY3Rpb24uICBUaGUgYXV0aG9yIG1ha2VzIG5vIGd1YXJhbnRlZXMsIGFuZCB0YWtlcyBubyBsaWFiaWxpdHkgb2YgYW55IGtpbmQgZm9yIHVzZSBvZiB0aGlzIGNvZGUuXHJcblxyXG5JZiB5b3UgZmluZCBhIGJ1ZyBvciBtYWtlIGFuIGltcHJvdmVtZW50LCBpdCB3b3VsZCBiZSBjb3VydGVvdXMgdG8gbGV0IHRoZSBhdXRob3Iga25vdywgYnV0IGl0IGlzIG5vdCBjb21wdWxzb3J5LlxyXG4qL1xyXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xyXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcclxuICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cclxuICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XHJcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cyl7XHJcbiAgICAvLyBDb21tb25KUy4gRGVmaW5lIGV4cG9ydC5cclxuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBCcm93c2VyIGdsb2JhbHNcclxuICAgIGdsb2JhbC50djQgPSBmYWN0b3J5KCk7XHJcbiAgfVxyXG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcclxuXHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9rZXlzP3JlZGlyZWN0bG9jYWxlPWVuLVVTJnJlZGlyZWN0c2x1Zz1KYXZhU2NyaXB0JTJGUmVmZXJlbmNlJTJGR2xvYmFsX09iamVjdHMlMkZPYmplY3QlMkZrZXlzXHJcbmlmICghT2JqZWN0LmtleXMpIHtcclxuXHRPYmplY3Qua2V5cyA9IChmdW5jdGlvbiAoKSB7XHJcblx0XHR2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxyXG5cdFx0XHRoYXNEb250RW51bUJ1ZyA9ICEoe3RvU3RyaW5nOiBudWxsfSkucHJvcGVydHlJc0VudW1lcmFibGUoJ3RvU3RyaW5nJyksXHJcblx0XHRcdGRvbnRFbnVtcyA9IFtcclxuXHRcdFx0XHQndG9TdHJpbmcnLFxyXG5cdFx0XHRcdCd0b0xvY2FsZVN0cmluZycsXHJcblx0XHRcdFx0J3ZhbHVlT2YnLFxyXG5cdFx0XHRcdCdoYXNPd25Qcm9wZXJ0eScsXHJcblx0XHRcdFx0J2lzUHJvdG90eXBlT2YnLFxyXG5cdFx0XHRcdCdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXHJcblx0XHRcdFx0J2NvbnN0cnVjdG9yJ1xyXG5cdFx0XHRdLFxyXG5cdFx0XHRkb250RW51bXNMZW5ndGggPSBkb250RW51bXMubGVuZ3RoO1xyXG5cclxuXHRcdHJldHVybiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nIHx8IG9iaiA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBub24tb2JqZWN0Jyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHJcblx0XHRcdGZvciAodmFyIHByb3AgaW4gb2JqKSB7XHJcblx0XHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkge1xyXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2gocHJvcCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoaGFzRG9udEVudW1CdWcpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpPTA7IGkgPCBkb250RW51bXNMZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBkb250RW51bXNbaV0pKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGRvbnRFbnVtc1tpXSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9O1xyXG5cdH0pKCk7XHJcbn1cclxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2NyZWF0ZVxyXG5pZiAoIU9iamVjdC5jcmVhdGUpIHtcclxuXHRPYmplY3QuY3JlYXRlID0gKGZ1bmN0aW9uKCl7XHJcblx0XHRmdW5jdGlvbiBGKCl7fVxyXG5cclxuXHRcdHJldHVybiBmdW5jdGlvbihvKXtcclxuXHRcdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDEpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ09iamVjdC5jcmVhdGUgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG9uZSBwYXJhbWV0ZXIuJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ri5wcm90b3R5cGUgPSBvO1xyXG5cdFx0XHRyZXR1cm4gbmV3IEYoKTtcclxuXHRcdH07XHJcblx0fSkoKTtcclxufVxyXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5P3JlZGlyZWN0bG9jYWxlPWVuLVVTJnJlZGlyZWN0c2x1Zz1KYXZhU2NyaXB0JTJGUmVmZXJlbmNlJTJGR2xvYmFsX09iamVjdHMlMkZBcnJheSUyRmlzQXJyYXlcclxuaWYoIUFycmF5LmlzQXJyYXkpIHtcclxuXHRBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gKHZBcmcpIHtcclxuXHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodkFyZykgPT09IFwiW29iamVjdCBBcnJheV1cIjtcclxuXHR9O1xyXG59XHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2luZGV4T2Y/cmVkaXJlY3Rsb2NhbGU9ZW4tVVMmcmVkaXJlY3RzbHVnPUphdmFTY3JpcHQlMkZSZWZlcmVuY2UlMkZHbG9iYWxfT2JqZWN0cyUyRkFycmF5JTJGaW5kZXhPZlxyXG5pZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XHJcblx0QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ICovICkge1xyXG5cdFx0aWYgKHRoaXMgPT09IG51bGwpIHtcclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcigpO1xyXG5cdFx0fVxyXG5cdFx0dmFyIHQgPSBPYmplY3QodGhpcyk7XHJcblx0XHR2YXIgbGVuID0gdC5sZW5ndGggPj4+IDA7XHJcblxyXG5cdFx0aWYgKGxlbiA9PT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gLTE7XHJcblx0XHR9XHJcblx0XHR2YXIgbiA9IDA7XHJcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcclxuXHRcdFx0biA9IE51bWJlcihhcmd1bWVudHNbMV0pO1xyXG5cdFx0XHRpZiAobiAhPT0gbikgeyAvLyBzaG9ydGN1dCBmb3IgdmVyaWZ5aW5nIGlmIGl0J3MgTmFOXHJcblx0XHRcdFx0biA9IDA7XHJcblx0XHRcdH0gZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSBJbmZpbml0eSAmJiBuICE9PSAtSW5maW5pdHkpIHtcclxuXHRcdFx0XHRuID0gKG4gPiAwIHx8IC0xKSAqIE1hdGguZmxvb3IoTWF0aC5hYnMobikpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAobiA+PSBsZW4pIHtcclxuXHRcdFx0cmV0dXJuIC0xO1xyXG5cdFx0fVxyXG5cdFx0dmFyIGsgPSBuID49IDAgPyBuIDogTWF0aC5tYXgobGVuIC0gTWF0aC5hYnMobiksIDApO1xyXG5cdFx0Zm9yICg7IGsgPCBsZW47IGsrKykge1xyXG5cdFx0XHRpZiAoayBpbiB0ICYmIHRba10gPT09IHNlYXJjaEVsZW1lbnQpIHtcclxuXHRcdFx0XHRyZXR1cm4gaztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIC0xO1xyXG5cdH07XHJcbn1cclxuXHJcbi8vIEdydW5nZXkgT2JqZWN0LmlzRnJvemVuIGhhY2tcclxuaWYgKCFPYmplY3QuaXNGcm96ZW4pIHtcclxuXHRPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHR2YXIga2V5ID0gXCJ0djRfdGVzdF9mcm96ZW5fa2V5XCI7XHJcblx0XHR3aGlsZSAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuXHRcdFx0a2V5ICs9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRvYmpba2V5XSA9IHRydWU7XHJcblx0XHRcdGRlbGV0ZSBvYmpba2V5XTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcbi8vIEJhc2VkIG9uOiBodHRwczovL2dpdGh1Yi5jb20vZ2VyYWludGx1ZmYvdXJpLXRlbXBsYXRlcywgYnV0IHdpdGggYWxsIHRoZSBkZS1zdWJzdGl0dXRpb24gc3R1ZmYgcmVtb3ZlZFxyXG5cclxudmFyIHVyaVRlbXBsYXRlR2xvYmFsTW9kaWZpZXJzID0ge1xyXG5cdFwiK1wiOiB0cnVlLFxyXG5cdFwiI1wiOiB0cnVlLFxyXG5cdFwiLlwiOiB0cnVlLFxyXG5cdFwiL1wiOiB0cnVlLFxyXG5cdFwiO1wiOiB0cnVlLFxyXG5cdFwiP1wiOiB0cnVlLFxyXG5cdFwiJlwiOiB0cnVlXHJcbn07XHJcbnZhciB1cmlUZW1wbGF0ZVN1ZmZpY2VzID0ge1xyXG5cdFwiKlwiOiB0cnVlXHJcbn07XHJcblxyXG5mdW5jdGlvbiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKHN0cmluZykge1xyXG5cdHJldHVybiBlbmNvZGVVUkkoc3RyaW5nKS5yZXBsYWNlKC8lMjVbMC05XVswLTldL2csIGZ1bmN0aW9uIChkb3VibGVFbmNvZGVkKSB7XHJcblx0XHRyZXR1cm4gXCIlXCIgKyBkb3VibGVFbmNvZGVkLnN1YnN0cmluZygzKTtcclxuXHR9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXJpVGVtcGxhdGVTdWJzdGl0dXRpb24oc3BlYykge1xyXG5cdHZhciBtb2RpZmllciA9IFwiXCI7XHJcblx0aWYgKHVyaVRlbXBsYXRlR2xvYmFsTW9kaWZpZXJzW3NwZWMuY2hhckF0KDApXSkge1xyXG5cdFx0bW9kaWZpZXIgPSBzcGVjLmNoYXJBdCgwKTtcclxuXHRcdHNwZWMgPSBzcGVjLnN1YnN0cmluZygxKTtcclxuXHR9XHJcblx0dmFyIHNlcGFyYXRvciA9IFwiXCI7XHJcblx0dmFyIHByZWZpeCA9IFwiXCI7XHJcblx0dmFyIHNob3VsZEVzY2FwZSA9IHRydWU7XHJcblx0dmFyIHNob3dWYXJpYWJsZXMgPSBmYWxzZTtcclxuXHR2YXIgdHJpbUVtcHR5U3RyaW5nID0gZmFsc2U7XHJcblx0aWYgKG1vZGlmaWVyID09PSAnKycpIHtcclxuXHRcdHNob3VsZEVzY2FwZSA9IGZhbHNlO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09IFwiLlwiKSB7XHJcblx0XHRwcmVmaXggPSBcIi5cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiLlwiO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09IFwiL1wiKSB7XHJcblx0XHRwcmVmaXggPSBcIi9cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiL1wiO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICcjJykge1xyXG5cdFx0cHJlZml4ID0gXCIjXCI7XHJcblx0XHRzaG91bGRFc2NhcGUgPSBmYWxzZTtcclxuXHR9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnOycpIHtcclxuXHRcdHByZWZpeCA9IFwiO1wiO1xyXG5cdFx0c2VwYXJhdG9yID0gXCI7XCI7XHJcblx0XHRzaG93VmFyaWFibGVzID0gdHJ1ZTtcclxuXHRcdHRyaW1FbXB0eVN0cmluZyA9IHRydWU7XHJcblx0fSBlbHNlIGlmIChtb2RpZmllciA9PT0gJz8nKSB7XHJcblx0XHRwcmVmaXggPSBcIj9cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiJlwiO1xyXG5cdFx0c2hvd1ZhcmlhYmxlcyA9IHRydWU7XHJcblx0fSBlbHNlIGlmIChtb2RpZmllciA9PT0gJyYnKSB7XHJcblx0XHRwcmVmaXggPSBcIiZcIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiJlwiO1xyXG5cdFx0c2hvd1ZhcmlhYmxlcyA9IHRydWU7XHJcblx0fVxyXG5cclxuXHR2YXIgdmFyTmFtZXMgPSBbXTtcclxuXHR2YXIgdmFyTGlzdCA9IHNwZWMuc3BsaXQoXCIsXCIpO1xyXG5cdHZhciB2YXJTcGVjcyA9IFtdO1xyXG5cdHZhciB2YXJTcGVjTWFwID0ge307XHJcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB2YXJMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgdmFyTmFtZSA9IHZhckxpc3RbaV07XHJcblx0XHR2YXIgdHJ1bmNhdGUgPSBudWxsO1xyXG5cdFx0aWYgKHZhck5hbWUuaW5kZXhPZihcIjpcIikgIT09IC0xKSB7XHJcblx0XHRcdHZhciBwYXJ0cyA9IHZhck5hbWUuc3BsaXQoXCI6XCIpO1xyXG5cdFx0XHR2YXJOYW1lID0gcGFydHNbMF07XHJcblx0XHRcdHRydW5jYXRlID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcclxuXHRcdH1cclxuXHRcdHZhciBzdWZmaWNlcyA9IHt9O1xyXG5cdFx0d2hpbGUgKHVyaVRlbXBsYXRlU3VmZmljZXNbdmFyTmFtZS5jaGFyQXQodmFyTmFtZS5sZW5ndGggLSAxKV0pIHtcclxuXHRcdFx0c3VmZmljZXNbdmFyTmFtZS5jaGFyQXQodmFyTmFtZS5sZW5ndGggLSAxKV0gPSB0cnVlO1xyXG5cdFx0XHR2YXJOYW1lID0gdmFyTmFtZS5zdWJzdHJpbmcoMCwgdmFyTmFtZS5sZW5ndGggLSAxKTtcclxuXHRcdH1cclxuXHRcdHZhciB2YXJTcGVjID0ge1xyXG5cdFx0XHR0cnVuY2F0ZTogdHJ1bmNhdGUsXHJcblx0XHRcdG5hbWU6IHZhck5hbWUsXHJcblx0XHRcdHN1ZmZpY2VzOiBzdWZmaWNlc1xyXG5cdFx0fTtcclxuXHRcdHZhclNwZWNzLnB1c2godmFyU3BlYyk7XHJcblx0XHR2YXJTcGVjTWFwW3Zhck5hbWVdID0gdmFyU3BlYztcclxuXHRcdHZhck5hbWVzLnB1c2godmFyTmFtZSk7XHJcblx0fVxyXG5cdHZhciBzdWJGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZUZ1bmN0aW9uKSB7XHJcblx0XHR2YXIgcmVzdWx0ID0gXCJcIjtcclxuXHRcdHZhciBzdGFydEluZGV4ID0gMDtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdmFyU3BlY3MubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIHZhclNwZWMgPSB2YXJTcGVjc1tpXTtcclxuXHRcdFx0dmFyIHZhbHVlID0gdmFsdWVGdW5jdGlvbih2YXJTcGVjLm5hbWUpO1xyXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB8fCAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKSkge1xyXG5cdFx0XHRcdHN0YXJ0SW5kZXgrKztcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoaSA9PT0gc3RhcnRJbmRleCkge1xyXG5cdFx0XHRcdHJlc3VsdCArPSBwcmVmaXg7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmVzdWx0ICs9IChzZXBhcmF0b3IgfHwgXCIsXCIpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG5cdFx0XHRcdGlmIChzaG93VmFyaWFibGVzKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5uYW1lICsgXCI9XCI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdGlmIChqID4gMCkge1xyXG5cdFx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5zdWZmaWNlc1snKiddID8gKHNlcGFyYXRvciB8fCBcIixcIikgOiBcIixcIjtcclxuXHRcdFx0XHRcdFx0aWYgKHZhclNwZWMuc3VmZmljZXNbJyonXSAmJiBzaG93VmFyaWFibGVzKSB7XHJcblx0XHRcdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMubmFtZSArIFwiPVwiO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gc2hvdWxkRXNjYXBlID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2pdKS5yZXBsYWNlKC8hL2csIFwiJTIxXCIpIDogbm90UmVhbGx5UGVyY2VudEVuY29kZSh2YWx1ZVtqXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG5cdFx0XHRcdGlmIChzaG93VmFyaWFibGVzICYmICF2YXJTcGVjLnN1ZmZpY2VzWycqJ10pIHtcclxuXHRcdFx0XHRcdHJlc3VsdCArPSB2YXJTcGVjLm5hbWUgKyBcIj1cIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dmFyIGZpcnN0ID0gdHJ1ZTtcclxuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcclxuXHRcdFx0XHRcdGlmICghZmlyc3QpIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMuc3VmZmljZXNbJyonXSA/IChzZXBhcmF0b3IgfHwgXCIsXCIpIDogXCIsXCI7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRmaXJzdCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0cmVzdWx0ICs9IHNob3VsZEVzY2FwZSA/IGVuY29kZVVSSUNvbXBvbmVudChrZXkpLnJlcGxhY2UoLyEvZywgXCIlMjFcIikgOiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKGtleSk7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5zdWZmaWNlc1snKiddID8gJz0nIDogXCIsXCI7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gc2hvdWxkRXNjYXBlID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2tleV0pLnJlcGxhY2UoLyEvZywgXCIlMjFcIikgOiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKHZhbHVlW2tleV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAoc2hvd1ZhcmlhYmxlcykge1xyXG5cdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMubmFtZTtcclxuXHRcdFx0XHRcdGlmICghdHJpbUVtcHR5U3RyaW5nIHx8IHZhbHVlICE9PSBcIlwiKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdCArPSBcIj1cIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKHZhclNwZWMudHJ1bmNhdGUgIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFyU3BlYy50cnVuY2F0ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJlc3VsdCArPSBzaG91bGRFc2NhcGUgPyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoLyEvZywgXCIlMjFcIik6IG5vdFJlYWxseVBlcmNlbnRFbmNvZGUodmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH07XHJcblx0c3ViRnVuY3Rpb24udmFyTmFtZXMgPSB2YXJOYW1lcztcclxuXHRyZXR1cm4ge1xyXG5cdFx0cHJlZml4OiBwcmVmaXgsXHJcblx0XHRzdWJzdGl0dXRpb246IHN1YkZ1bmN0aW9uXHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gVXJpVGVtcGxhdGUodGVtcGxhdGUpIHtcclxuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgVXJpVGVtcGxhdGUpKSB7XHJcblx0XHRyZXR1cm4gbmV3IFVyaVRlbXBsYXRlKHRlbXBsYXRlKTtcclxuXHR9XHJcblx0dmFyIHBhcnRzID0gdGVtcGxhdGUuc3BsaXQoXCJ7XCIpO1xyXG5cdHZhciB0ZXh0UGFydHMgPSBbcGFydHMuc2hpZnQoKV07XHJcblx0dmFyIHByZWZpeGVzID0gW107XHJcblx0dmFyIHN1YnN0aXR1dGlvbnMgPSBbXTtcclxuXHR2YXIgdmFyTmFtZXMgPSBbXTtcclxuXHR3aGlsZSAocGFydHMubGVuZ3RoID4gMCkge1xyXG5cdFx0dmFyIHBhcnQgPSBwYXJ0cy5zaGlmdCgpO1xyXG5cdFx0dmFyIHNwZWMgPSBwYXJ0LnNwbGl0KFwifVwiKVswXTtcclxuXHRcdHZhciByZW1haW5kZXIgPSBwYXJ0LnN1YnN0cmluZyhzcGVjLmxlbmd0aCArIDEpO1xyXG5cdFx0dmFyIGZ1bmNzID0gdXJpVGVtcGxhdGVTdWJzdGl0dXRpb24oc3BlYyk7XHJcblx0XHRzdWJzdGl0dXRpb25zLnB1c2goZnVuY3Muc3Vic3RpdHV0aW9uKTtcclxuXHRcdHByZWZpeGVzLnB1c2goZnVuY3MucHJlZml4KTtcclxuXHRcdHRleHRQYXJ0cy5wdXNoKHJlbWFpbmRlcik7XHJcblx0XHR2YXJOYW1lcyA9IHZhck5hbWVzLmNvbmNhdChmdW5jcy5zdWJzdGl0dXRpb24udmFyTmFtZXMpO1xyXG5cdH1cclxuXHR0aGlzLmZpbGwgPSBmdW5jdGlvbiAodmFsdWVGdW5jdGlvbikge1xyXG5cdFx0dmFyIHJlc3VsdCA9IHRleHRQYXJ0c1swXTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic3RpdHV0aW9ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uc1tpXTtcclxuXHRcdFx0cmVzdWx0ICs9IHN1YnN0aXR1dGlvbih2YWx1ZUZ1bmN0aW9uKTtcclxuXHRcdFx0cmVzdWx0ICs9IHRleHRQYXJ0c1tpICsgMV07XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH07XHJcblx0dGhpcy52YXJOYW1lcyA9IHZhck5hbWVzO1xyXG5cdHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxufVxyXG5VcmlUZW1wbGF0ZS5wcm90b3R5cGUgPSB7XHJcblx0dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiB0aGlzLnRlbXBsYXRlO1xyXG5cdH0sXHJcblx0ZmlsbEZyb21PYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdHJldHVybiB0aGlzLmZpbGwoZnVuY3Rpb24gKHZhck5hbWUpIHtcclxuXHRcdFx0cmV0dXJuIG9ialt2YXJOYW1lXTtcclxuXHRcdH0pO1xyXG5cdH1cclxufTtcclxudmFyIFZhbGlkYXRvckNvbnRleHQgPSBmdW5jdGlvbiBWYWxpZGF0b3JDb250ZXh0KHBhcmVudCwgY29sbGVjdE11bHRpcGxlLCBlcnJvclJlcG9ydGVyLCBjaGVja1JlY3Vyc2l2ZSwgdHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdHRoaXMubWlzc2luZ01hcCA9IHt9O1xyXG5cdHRoaXMuZm9ybWF0VmFsaWRhdG9ycyA9IHBhcmVudCA/IE9iamVjdC5jcmVhdGUocGFyZW50LmZvcm1hdFZhbGlkYXRvcnMpIDoge307XHJcblx0dGhpcy5zY2hlbWFzID0gcGFyZW50ID8gT2JqZWN0LmNyZWF0ZShwYXJlbnQuc2NoZW1hcykgOiB7fTtcclxuXHR0aGlzLmNvbGxlY3RNdWx0aXBsZSA9IGNvbGxlY3RNdWx0aXBsZTtcclxuXHR0aGlzLmVycm9ycyA9IFtdO1xyXG5cdHRoaXMuaGFuZGxlRXJyb3IgPSBjb2xsZWN0TXVsdGlwbGUgPyB0aGlzLmNvbGxlY3RFcnJvciA6IHRoaXMucmV0dXJuRXJyb3I7XHJcblx0aWYgKGNoZWNrUmVjdXJzaXZlKSB7XHJcblx0XHR0aGlzLmNoZWNrUmVjdXJzaXZlID0gdHJ1ZTtcclxuXHRcdHRoaXMuc2Nhbm5lZCA9IFtdO1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuID0gW107XHJcblx0XHR0aGlzLnNjYW5uZWRGcm96ZW5TY2hlbWFzID0gW107XHJcblx0XHR0aGlzLnNjYW5uZWRGcm96ZW5WYWxpZGF0aW9uRXJyb3JzID0gW107XHJcblx0XHR0aGlzLnZhbGlkYXRlZFNjaGVtYXNLZXkgPSAndHY0X3ZhbGlkYXRpb25faWQnO1xyXG5cdFx0dGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5ID0gJ3R2NF92YWxpZGF0aW9uX2Vycm9yc19pZCc7XHJcblx0fVxyXG5cdGlmICh0cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHR0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMgPSB0cnVlO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSB7fTtcclxuXHRcdHRoaXMudW5rbm93blByb3BlcnR5UGF0aHMgPSB7fTtcclxuXHR9XHJcblx0dGhpcy5lcnJvclJlcG9ydGVyID0gZXJyb3JSZXBvcnRlciB8fCBkZWZhdWx0RXJyb3JSZXBvcnRlcignZW4nKTtcclxuXHRpZiAodHlwZW9mIHRoaXMuZXJyb3JSZXBvcnRlciA9PT0gJ3N0cmluZycpIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcignZGVidWcnKTtcclxuXHR9XHJcblx0dGhpcy5kZWZpbmVkS2V5d29yZHMgPSB7fTtcclxuXHRpZiAocGFyZW50KSB7XHJcblx0XHRmb3IgKHZhciBrZXkgaW4gcGFyZW50LmRlZmluZWRLZXl3b3Jkcykge1xyXG5cdFx0XHR0aGlzLmRlZmluZWRLZXl3b3Jkc1trZXldID0gcGFyZW50LmRlZmluZWRLZXl3b3Jkc1trZXldLnNsaWNlKDApO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuZGVmaW5lS2V5d29yZCA9IGZ1bmN0aW9uIChrZXl3b3JkLCBrZXl3b3JkRnVuY3Rpb24pIHtcclxuXHR0aGlzLmRlZmluZWRLZXl3b3Jkc1trZXl3b3JkXSA9IHRoaXMuZGVmaW5lZEtleXdvcmRzW2tleXdvcmRdIHx8IFtdO1xyXG5cdHRoaXMuZGVmaW5lZEtleXdvcmRzW2tleXdvcmRdLnB1c2goa2V5d29yZEZ1bmN0aW9uKTtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRXJyb3IgPSBmdW5jdGlvbiAoY29kZSwgbWVzc2FnZVBhcmFtcywgZGF0YVBhdGgsIHNjaGVtYVBhdGgsIHN1YkVycm9ycywgZGF0YSwgc2NoZW1hKSB7XHJcblx0dmFyIGVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihjb2RlLCBtZXNzYWdlUGFyYW1zLCBkYXRhUGF0aCwgc2NoZW1hUGF0aCwgc3ViRXJyb3JzKTtcclxuXHRlcnJvci5tZXNzYWdlID0gdGhpcy5lcnJvclJlcG9ydGVyKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdHJldHVybiBlcnJvcjtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUucmV0dXJuRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcclxuXHRyZXR1cm4gZXJyb3I7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmNvbGxlY3RFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xyXG5cdGlmIChlcnJvcikge1xyXG5cdFx0dGhpcy5lcnJvcnMucHVzaChlcnJvcik7XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5wcmVmaXhFcnJvcnMgPSBmdW5jdGlvbiAoc3RhcnRJbmRleCwgZGF0YVBhdGgsIHNjaGVtYVBhdGgpIHtcclxuXHRmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRoaXMuZXJyb3JzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR0aGlzLmVycm9yc1tpXSA9IHRoaXMuZXJyb3JzW2ldLnByZWZpeFdpdGgoZGF0YVBhdGgsIHNjaGVtYVBhdGgpO1xyXG5cdH1cclxuXHRyZXR1cm4gdGhpcztcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuYmFuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hKSB7XHJcblx0Zm9yICh2YXIgdW5rbm93blBhdGggaW4gdGhpcy51bmtub3duUHJvcGVydHlQYXRocykge1xyXG5cdFx0dmFyIGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLlVOS05PV05fUFJPUEVSVFksIHtwYXRoOiB1bmtub3duUGF0aH0sIHVua25vd25QYXRoLCBcIlwiLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG5cdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmFkZEZvcm1hdCA9IGZ1bmN0aW9uIChmb3JtYXQsIHZhbGlkYXRvcikge1xyXG5cdGlmICh0eXBlb2YgZm9ybWF0ID09PSAnb2JqZWN0Jykge1xyXG5cdFx0Zm9yICh2YXIga2V5IGluIGZvcm1hdCkge1xyXG5cdFx0XHR0aGlzLmFkZEZvcm1hdChrZXksIGZvcm1hdFtrZXldKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHR0aGlzLmZvcm1hdFZhbGlkYXRvcnNbZm9ybWF0XSA9IHZhbGlkYXRvcjtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUucmVzb2x2ZVJlZnMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1cmxIaXN0b3J5KSB7XHJcblx0aWYgKHNjaGVtYVsnJHJlZiddICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdHVybEhpc3RvcnkgPSB1cmxIaXN0b3J5IHx8IHt9O1xyXG5cdFx0aWYgKHVybEhpc3Rvcnlbc2NoZW1hWyckcmVmJ11dKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuQ0lSQ1VMQVJfUkVGRVJFTkNFLCB7dXJsczogT2JqZWN0LmtleXModXJsSGlzdG9yeSkuam9pbignLCAnKX0sICcnLCAnJywgbnVsbCwgdW5kZWZpbmVkLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdFx0dXJsSGlzdG9yeVtzY2hlbWFbJyRyZWYnXV0gPSB0cnVlO1xyXG5cdFx0c2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoc2NoZW1hWyckcmVmJ10sIHVybEhpc3RvcnkpO1xyXG5cdH1cclxuXHRyZXR1cm4gc2NoZW1hO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5nZXRTY2hlbWEgPSBmdW5jdGlvbiAodXJsLCB1cmxIaXN0b3J5KSB7XHJcblx0dmFyIHNjaGVtYTtcclxuXHRpZiAodGhpcy5zY2hlbWFzW3VybF0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0c2NoZW1hID0gdGhpcy5zY2hlbWFzW3VybF07XHJcblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlUmVmcyhzY2hlbWEsIHVybEhpc3RvcnkpO1xyXG5cdH1cclxuXHR2YXIgYmFzZVVybCA9IHVybDtcclxuXHR2YXIgZnJhZ21lbnQgPSBcIlwiO1xyXG5cdGlmICh1cmwuaW5kZXhPZignIycpICE9PSAtMSkge1xyXG5cdFx0ZnJhZ21lbnQgPSB1cmwuc3Vic3RyaW5nKHVybC5pbmRleE9mKFwiI1wiKSArIDEpO1xyXG5cdFx0YmFzZVVybCA9IHVybC5zdWJzdHJpbmcoMCwgdXJsLmluZGV4T2YoXCIjXCIpKTtcclxuXHR9XHJcblx0aWYgKHR5cGVvZiB0aGlzLnNjaGVtYXNbYmFzZVVybF0gPT09ICdvYmplY3QnKSB7XHJcblx0XHRzY2hlbWEgPSB0aGlzLnNjaGVtYXNbYmFzZVVybF07XHJcblx0XHR2YXIgcG9pbnRlclBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoZnJhZ21lbnQpO1xyXG5cdFx0aWYgKHBvaW50ZXJQYXRoID09PSBcIlwiKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVSZWZzKHNjaGVtYSwgdXJsSGlzdG9yeSk7XHJcblx0XHR9IGVsc2UgaWYgKHBvaW50ZXJQYXRoLmNoYXJBdCgwKSAhPT0gXCIvXCIpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHRcdHZhciBwYXJ0cyA9IHBvaW50ZXJQYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgxKTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIGNvbXBvbmVudCA9IHBhcnRzW2ldLnJlcGxhY2UoL34xL2csIFwiL1wiKS5yZXBsYWNlKC9+MC9nLCBcIn5cIik7XHJcblx0XHRcdGlmIChzY2hlbWFbY29tcG9uZW50XSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0c2NoZW1hID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdHNjaGVtYSA9IHNjaGVtYVtjb21wb25lbnRdO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVSZWZzKHNjaGVtYSwgdXJsSGlzdG9yeSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICh0aGlzLm1pc3NpbmdbYmFzZVVybF0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0dGhpcy5taXNzaW5nLnB1c2goYmFzZVVybCk7XHJcblx0XHR0aGlzLm1pc3NpbmdbYmFzZVVybF0gPSBiYXNlVXJsO1xyXG5cdFx0dGhpcy5taXNzaW5nTWFwW2Jhc2VVcmxdID0gYmFzZVVybDtcclxuXHR9XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnNlYXJjaFNjaGVtYXMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1cmwpIHtcclxuXHRpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XHJcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR0aGlzLnNlYXJjaFNjaGVtYXMoc2NoZW1hW2ldLCB1cmwpO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAoc2NoZW1hICYmIHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdGlmICh0eXBlb2Ygc2NoZW1hLmlkID09PSBcInN0cmluZ1wiKSB7XHJcblx0XHRcdGlmIChpc1RydXN0ZWRVcmwodXJsLCBzY2hlbWEuaWQpKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuc2NoZW1hc1tzY2hlbWEuaWRdID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2NoZW1hc1tzY2hlbWEuaWRdID0gc2NoZW1hO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Zm9yICh2YXIga2V5IGluIHNjaGVtYSkge1xyXG5cdFx0XHRpZiAoa2V5ICE9PSBcImVudW1cIikge1xyXG5cdFx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hW2tleV0gPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2VhcmNoU2NoZW1hcyhzY2hlbWFba2V5XSwgdXJsKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGtleSA9PT0gXCIkcmVmXCIpIHtcclxuXHRcdFx0XHRcdHZhciB1cmkgPSBnZXREb2N1bWVudFVyaShzY2hlbWFba2V5XSk7XHJcblx0XHRcdFx0XHRpZiAodXJpICYmIHRoaXMuc2NoZW1hc1t1cmldID09PSB1bmRlZmluZWQgJiYgdGhpcy5taXNzaW5nTWFwW3VyaV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLm1pc3NpbmdNYXBbdXJpXSA9IHVyaTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmFkZFNjaGVtYSA9IGZ1bmN0aW9uICh1cmwsIHNjaGVtYSkge1xyXG5cdC8vb3ZlcmxvYWRcclxuXHRpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHNjaGVtYSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdGlmICh0eXBlb2YgdXJsID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdXJsLmlkID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRzY2hlbWEgPSB1cmw7XHJcblx0XHRcdHVybCA9IHNjaGVtYS5pZDtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICh1cmwgPT09IGdldERvY3VtZW50VXJpKHVybCkgKyBcIiNcIikge1xyXG5cdFx0Ly8gUmVtb3ZlIGVtcHR5IGZyYWdtZW50XHJcblx0XHR1cmwgPSBnZXREb2N1bWVudFVyaSh1cmwpO1xyXG5cdH1cclxuXHR0aGlzLnNjaGVtYXNbdXJsXSA9IHNjaGVtYTtcclxuXHRkZWxldGUgdGhpcy5taXNzaW5nTWFwW3VybF07XHJcblx0bm9ybVNjaGVtYShzY2hlbWEsIHVybCk7XHJcblx0dGhpcy5zZWFyY2hTY2hlbWFzKHNjaGVtYSwgdXJsKTtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldFNjaGVtYU1hcCA9IGZ1bmN0aW9uICgpIHtcclxuXHR2YXIgbWFwID0ge307XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMuc2NoZW1hcykge1xyXG5cdFx0bWFwW2tleV0gPSB0aGlzLnNjaGVtYXNba2V5XTtcclxuXHR9XHJcblx0cmV0dXJuIG1hcDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldFNjaGVtYVVyaXMgPSBmdW5jdGlvbiAoZmlsdGVyUmVnRXhwKSB7XHJcblx0dmFyIGxpc3QgPSBbXTtcclxuXHRmb3IgKHZhciBrZXkgaW4gdGhpcy5zY2hlbWFzKSB7XHJcblx0XHRpZiAoIWZpbHRlclJlZ0V4cCB8fCBmaWx0ZXJSZWdFeHAudGVzdChrZXkpKSB7XHJcblx0XHRcdGxpc3QucHVzaChrZXkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbGlzdDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldE1pc3NpbmdVcmlzID0gZnVuY3Rpb24gKGZpbHRlclJlZ0V4cCkge1xyXG5cdHZhciBsaXN0ID0gW107XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMubWlzc2luZ01hcCkge1xyXG5cdFx0aWYgKCFmaWx0ZXJSZWdFeHAgfHwgZmlsdGVyUmVnRXhwLnRlc3Qoa2V5KSkge1xyXG5cdFx0XHRsaXN0LnB1c2goa2V5KTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGxpc3Q7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5kcm9wU2NoZW1hcyA9IGZ1bmN0aW9uICgpIHtcclxuXHR0aGlzLnNjaGVtYXMgPSB7fTtcclxuXHR0aGlzLnJlc2V0KCk7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xyXG5cdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdHRoaXMubWlzc2luZ01hcCA9IHt9O1xyXG5cdHRoaXMuZXJyb3JzID0gW107XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFsbCA9IGZ1bmN0aW9uIChkYXRhLCBzY2hlbWEsIGRhdGFQYXRoUGFydHMsIHNjaGVtYVBhdGhQYXJ0cywgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0dmFyIHRvcExldmVsO1xyXG5cdHNjaGVtYSA9IHRoaXMucmVzb2x2ZVJlZnMoc2NoZW1hKTtcclxuXHRpZiAoIXNjaGVtYSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fSBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcclxuXHRcdHRoaXMuZXJyb3JzLnB1c2goc2NoZW1hKTtcclxuXHRcdHJldHVybiBzY2hlbWE7XHJcblx0fVxyXG5cclxuXHR2YXIgc3RhcnRFcnJvckNvdW50ID0gdGhpcy5lcnJvcnMubGVuZ3RoO1xyXG5cdHZhciBmcm96ZW5JbmRleCwgc2Nhbm5lZEZyb3plblNjaGVtYUluZGV4ID0gbnVsbCwgc2Nhbm5lZFNjaGVtYXNJbmRleCA9IG51bGw7XHJcblx0aWYgKHRoaXMuY2hlY2tSZWN1cnNpdmUgJiYgZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdHRvcExldmVsID0gIXRoaXMuc2Nhbm5lZC5sZW5ndGg7XHJcblx0XHRpZiAoZGF0YVt0aGlzLnZhbGlkYXRlZFNjaGVtYXNLZXldKSB7XHJcblx0XHRcdHZhciBzY2hlbWFJbmRleCA9IGRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XS5pbmRleE9mKHNjaGVtYSk7XHJcblx0XHRcdGlmIChzY2hlbWFJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHR0aGlzLmVycm9ycyA9IHRoaXMuZXJyb3JzLmNvbmNhdChkYXRhW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV1bc2NoZW1hSW5kZXhdKTtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKE9iamVjdC5pc0Zyb3plbihkYXRhKSkge1xyXG5cdFx0XHRmcm96ZW5JbmRleCA9IHRoaXMuc2Nhbm5lZEZyb3plbi5pbmRleE9mKGRhdGEpO1xyXG5cdFx0XHRpZiAoZnJvemVuSW5kZXggIT09IC0xKSB7XHJcblx0XHRcdFx0dmFyIGZyb3plblNjaGVtYUluZGV4ID0gdGhpcy5zY2FubmVkRnJvemVuU2NoZW1hc1tmcm96ZW5JbmRleF0uaW5kZXhPZihzY2hlbWEpO1xyXG5cdFx0XHRcdGlmIChmcm96ZW5TY2hlbWFJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuY29uY2F0KHRoaXMuc2Nhbm5lZEZyb3plblZhbGlkYXRpb25FcnJvcnNbZnJvemVuSW5kZXhdW2Zyb3plblNjaGVtYUluZGV4XSk7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHRoaXMuc2Nhbm5lZC5wdXNoKGRhdGEpO1xyXG5cdFx0aWYgKE9iamVjdC5pc0Zyb3plbihkYXRhKSkge1xyXG5cdFx0XHRpZiAoZnJvemVuSW5kZXggPT09IC0xKSB7XHJcblx0XHRcdFx0ZnJvemVuSW5kZXggPSB0aGlzLnNjYW5uZWRGcm96ZW4ubGVuZ3RoO1xyXG5cdFx0XHRcdHRoaXMuc2Nhbm5lZEZyb3plbi5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdHRoaXMuc2Nhbm5lZEZyb3plblNjaGVtYXMucHVzaChbXSk7XHJcblx0XHRcdH1cclxuXHRcdFx0c2Nhbm5lZEZyb3plblNjaGVtYUluZGV4ID0gdGhpcy5zY2FubmVkRnJvemVuU2NoZW1hc1tmcm96ZW5JbmRleF0ubGVuZ3RoO1xyXG5cdFx0XHR0aGlzLnNjYW5uZWRGcm96ZW5TY2hlbWFzW2Zyb3plbkluZGV4XVtzY2FubmVkRnJvemVuU2NoZW1hSW5kZXhdID0gc2NoZW1hO1xyXG5cdFx0XHR0aGlzLnNjYW5uZWRGcm96ZW5WYWxpZGF0aW9uRXJyb3JzW2Zyb3plbkluZGV4XVtzY2FubmVkRnJvemVuU2NoZW1hSW5kZXhdID0gW107XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAoIWRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XSkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0YSwgdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5LCB7XHJcblx0XHRcdFx0XHRcdHZhbHVlOiBbXSxcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRhLCB0aGlzLnZhbGlkYXRpb25FcnJvcnNLZXksIHtcclxuXHRcdFx0XHRcdFx0dmFsdWU6IFtdLFxyXG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRcdC8vSUUgNy84IHdvcmthcm91bmRcclxuXHRcdFx0XHRcdGRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XSA9IFtdO1xyXG5cdFx0XHRcdFx0ZGF0YVt0aGlzLnZhbGlkYXRpb25FcnJvcnNLZXldID0gW107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHNjYW5uZWRTY2hlbWFzSW5kZXggPSBkYXRhW3RoaXMudmFsaWRhdGVkU2NoZW1hc0tleV0ubGVuZ3RoO1xyXG5cdFx0XHRkYXRhW3RoaXMudmFsaWRhdGVkU2NoZW1hc0tleV1bc2Nhbm5lZFNjaGVtYXNJbmRleF0gPSBzY2hlbWE7XHJcblx0XHRcdGRhdGFbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XVtzY2FubmVkU2NoZW1hc0luZGV4XSA9IFtdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dmFyIGVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIGVycm9yID0gdGhpcy52YWxpZGF0ZUJhc2ljKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU51bWVyaWMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlU3RyaW5nKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZUFycmF5KGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9iamVjdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVDb21iaW5hdGlvbnMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlSHlwZXJtZWRpYShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVGb3JtYXQoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlRGVmaW5lZEtleXdvcmRzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxuXHJcblx0aWYgKHRvcExldmVsKSB7XHJcblx0XHR3aGlsZSAodGhpcy5zY2FubmVkLmxlbmd0aCkge1xyXG5cdFx0XHR2YXIgaXRlbSA9IHRoaXMuc2Nhbm5lZC5wb3AoKTtcclxuXHRcdFx0ZGVsZXRlIGl0ZW1bdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XTtcclxuXHRcdH1cclxuXHRcdHRoaXMuc2Nhbm5lZEZyb3plbiA9IFtdO1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuU2NoZW1hcyA9IFtdO1xyXG5cdH1cclxuXHJcblx0aWYgKGVycm9yIHx8IGVycm9yQ291bnQgIT09IHRoaXMuZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0d2hpbGUgKChkYXRhUGF0aFBhcnRzICYmIGRhdGFQYXRoUGFydHMubGVuZ3RoKSB8fCAoc2NoZW1hUGF0aFBhcnRzICYmIHNjaGVtYVBhdGhQYXJ0cy5sZW5ndGgpKSB7XHJcblx0XHRcdHZhciBkYXRhUGFydCA9IChkYXRhUGF0aFBhcnRzICYmIGRhdGFQYXRoUGFydHMubGVuZ3RoKSA/IFwiXCIgKyBkYXRhUGF0aFBhcnRzLnBvcCgpIDogbnVsbDtcclxuXHRcdFx0dmFyIHNjaGVtYVBhcnQgPSAoc2NoZW1hUGF0aFBhcnRzICYmIHNjaGVtYVBhdGhQYXJ0cy5sZW5ndGgpID8gXCJcIiArIHNjaGVtYVBhdGhQYXJ0cy5wb3AoKSA6IG51bGw7XHJcblx0XHRcdGlmIChlcnJvcikge1xyXG5cdFx0XHRcdGVycm9yID0gZXJyb3IucHJlZml4V2l0aChkYXRhUGFydCwgc2NoZW1hUGFydCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5wcmVmaXhFcnJvcnMoZXJyb3JDb3VudCwgZGF0YVBhcnQsIHNjaGVtYVBhcnQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKHNjYW5uZWRGcm96ZW5TY2hlbWFJbmRleCAhPT0gbnVsbCkge1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuVmFsaWRhdGlvbkVycm9yc1tmcm96ZW5JbmRleF1bc2Nhbm5lZEZyb3plblNjaGVtYUluZGV4XSA9IHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCk7XHJcblx0fSBlbHNlIGlmIChzY2FubmVkU2NoZW1hc0luZGV4ICE9PSBudWxsKSB7XHJcblx0XHRkYXRhW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV1bc2Nhbm5lZFNjaGVtYXNJbmRleF0gPSB0aGlzLmVycm9ycy5zbGljZShzdGFydEVycm9yQ291bnQpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIChkYXRhLCBzY2hlbWEpIHtcclxuXHRpZiAodHlwZW9mIHNjaGVtYS5mb3JtYXQgIT09ICdzdHJpbmcnIHx8ICF0aGlzLmZvcm1hdFZhbGlkYXRvcnNbc2NoZW1hLmZvcm1hdF0pIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHR2YXIgZXJyb3JNZXNzYWdlID0gdGhpcy5mb3JtYXRWYWxpZGF0b3JzW3NjaGVtYS5mb3JtYXRdLmNhbGwobnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRpZiAodHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ251bWJlcicpIHtcclxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRk9STUFUX0NVU1RPTSwge21lc3NhZ2U6IGVycm9yTWVzc2FnZX0sICcnLCAnL2Zvcm1hdCcsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0fSBlbHNlIGlmIChlcnJvck1lc3NhZ2UgJiYgdHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRk9STUFUX0NVU1RPTSwge21lc3NhZ2U6IGVycm9yTWVzc2FnZS5tZXNzYWdlIHx8IFwiP1wifSwgZXJyb3JNZXNzYWdlLmRhdGFQYXRoIHx8ICcnLCBlcnJvck1lc3NhZ2Uuc2NoZW1hUGF0aCB8fCBcIi9mb3JtYXRcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlRGVmaW5lZEtleXdvcmRzID0gZnVuY3Rpb24gKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMuZGVmaW5lZEtleXdvcmRzKSB7XHJcblx0XHRpZiAodHlwZW9mIHNjaGVtYVtrZXldID09PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRjb250aW51ZTtcclxuXHRcdH1cclxuXHRcdHZhciB2YWxpZGF0aW9uRnVuY3Rpb25zID0gdGhpcy5kZWZpbmVkS2V5d29yZHNba2V5XTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdmFsaWRhdGlvbkZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgZnVuYyA9IHZhbGlkYXRpb25GdW5jdGlvbnNbaV07XHJcblx0XHRcdHZhciByZXN1bHQgPSBmdW5jKGRhdGEsIHNjaGVtYVtrZXldLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCk7XHJcblx0XHRcdGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuS0VZV09SRF9DVVNUT00sIHtrZXk6IGtleSwgbWVzc2FnZTogcmVzdWx0fSwgJycsICcnLCBudWxsLCBkYXRhLCBzY2hlbWEpLnByZWZpeFdpdGgobnVsbCwga2V5KTtcclxuXHRcdFx0fSBlbHNlIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHR2YXIgY29kZSA9IHJlc3VsdC5jb2RlO1xyXG5cdFx0XHRcdGlmICh0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRcdGlmICghRXJyb3JDb2Rlc1tjb2RlXSkge1xyXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuZGVmaW5lZCBlcnJvciBjb2RlICh1c2UgZGVmaW5lRXJyb3IpOiAnICsgY29kZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb2RlID0gRXJyb3JDb2Rlc1tjb2RlXTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb2RlICE9PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdFx0Y29kZSA9IEVycm9yQ29kZXMuS0VZV09SRF9DVVNUT007XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBtZXNzYWdlUGFyYW1zID0gKHR5cGVvZiByZXN1bHQubWVzc2FnZSA9PT0gJ29iamVjdCcpID8gcmVzdWx0Lm1lc3NhZ2UgOiB7a2V5OiBrZXksIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIHx8IFwiP1wifTtcclxuXHRcdFx0XHR2YXIgc2NoZW1hUGF0aCA9IHJlc3VsdC5zY2hlbWFQYXRoIHx8IChcIi9cIiArIGtleS5yZXBsYWNlKC9+L2csICd+MCcpLnJlcGxhY2UoL1xcLy9nLCAnfjEnKSk7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoY29kZSwgbWVzc2FnZVBhcmFtcywgcmVzdWx0LmRhdGFQYXRoIHx8IG51bGwsIHNjaGVtYVBhdGgsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5mdW5jdGlvbiByZWN1cnNpdmVDb21wYXJlKEEsIEIpIHtcclxuXHRpZiAoQSA9PT0gQikge1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cdGlmIChBICYmIEIgJiYgdHlwZW9mIEEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIEIgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdGlmIChBcnJheS5pc0FycmF5KEEpICE9PSBBcnJheS5pc0FycmF5KEIpKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShBKSkge1xyXG5cdFx0XHRpZiAoQS5sZW5ndGggIT09IEIubGVuZ3RoKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgQS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmICghcmVjdXJzaXZlQ29tcGFyZShBW2ldLCBCW2ldKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dmFyIGtleTtcclxuXHRcdFx0Zm9yIChrZXkgaW4gQSkge1xyXG5cdFx0XHRcdGlmIChCW2tleV0gPT09IHVuZGVmaW5lZCAmJiBBW2tleV0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGtleSBpbiBCKSB7XHJcblx0XHRcdFx0aWYgKEFba2V5XSA9PT0gdW5kZWZpbmVkICYmIEJba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAoa2V5IGluIEEpIHtcclxuXHRcdFx0XHRpZiAoIXJlY3Vyc2l2ZUNvbXBhcmUoQVtrZXldLCBCW2tleV0pKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblx0cmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUJhc2ljID0gZnVuY3Rpb24gdmFsaWRhdGVCYXNpYyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlVHlwZShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdHJldHVybiBlcnJvci5wcmVmaXhXaXRoKG51bGwsIFwidHlwZVwiKTtcclxuXHR9XHJcblx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUVudW0oZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpKSB7XHJcblx0XHRyZXR1cm4gZXJyb3IucHJlZml4V2l0aChudWxsLCBcInR5cGVcIik7XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVUeXBlID0gZnVuY3Rpb24gdmFsaWRhdGVUeXBlKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmIChzY2hlbWEudHlwZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGRhdGFUeXBlID0gdHlwZW9mIGRhdGE7XHJcblx0aWYgKGRhdGEgPT09IG51bGwpIHtcclxuXHRcdGRhdGFUeXBlID0gXCJudWxsXCI7XHJcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcblx0XHRkYXRhVHlwZSA9IFwiYXJyYXlcIjtcclxuXHR9XHJcblx0dmFyIGFsbG93ZWRUeXBlcyA9IHNjaGVtYS50eXBlO1xyXG5cdGlmICghQXJyYXkuaXNBcnJheShhbGxvd2VkVHlwZXMpKSB7XHJcblx0XHRhbGxvd2VkVHlwZXMgPSBbYWxsb3dlZFR5cGVzXTtcclxuXHR9XHJcblxyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYWxsb3dlZFR5cGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgdHlwZSA9IGFsbG93ZWRUeXBlc1tpXTtcclxuXHRcdGlmICh0eXBlID09PSBkYXRhVHlwZSB8fCAodHlwZSA9PT0gXCJpbnRlZ2VyXCIgJiYgZGF0YVR5cGUgPT09IFwibnVtYmVyXCIgJiYgKGRhdGEgJSAxID09PSAwKSkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuSU5WQUxJRF9UWVBFLCB7dHlwZTogZGF0YVR5cGUsIGV4cGVjdGVkOiBhbGxvd2VkVHlwZXMuam9pbihcIi9cIil9LCAnJywgJycsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUVudW0gPSBmdW5jdGlvbiB2YWxpZGF0ZUVudW0oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHNjaGVtYVtcImVudW1cIl0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hW1wiZW51bVwiXS5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIGVudW1WYWwgPSBzY2hlbWFbXCJlbnVtXCJdW2ldO1xyXG5cdFx0aWYgKHJlY3Vyc2l2ZUNvbXBhcmUoZGF0YSwgZW51bVZhbCkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRU5VTV9NSVNNQVRDSCwge3ZhbHVlOiAodHlwZW9mIEpTT04gIT09ICd1bmRlZmluZWQnKSA/IEpTT04uc3RyaW5naWZ5KGRhdGEpIDogZGF0YX0sICcnLCAnJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTnVtZXJpYyA9IGZ1bmN0aW9uIHZhbGlkYXRlTnVtZXJpYyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHJldHVybiB0aGlzLnZhbGlkYXRlTXVsdGlwbGVPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVNaW5NYXgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlTmFOKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcbnZhciBDTE9TRV9FTk9VR0hfTE9XID0gTWF0aC5wb3coMiwgLTUxKTtcclxudmFyIENMT1NFX0VOT1VHSF9ISUdIID0gMSAtIENMT1NFX0VOT1VHSF9MT1c7XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTXVsdGlwbGVPZiA9IGZ1bmN0aW9uIHZhbGlkYXRlTXVsdGlwbGVPZihkYXRhLCBzY2hlbWEpIHtcclxuXHR2YXIgbXVsdGlwbGVPZiA9IHNjaGVtYS5tdWx0aXBsZU9mIHx8IHNjaGVtYS5kaXZpc2libGVCeTtcclxuXHRpZiAobXVsdGlwbGVPZiA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiKSB7XHJcblx0XHR2YXIgcmVtYWluZGVyID0gKGRhdGEvbXVsdGlwbGVPZiklMTtcclxuXHRcdGlmIChyZW1haW5kZXIgPj0gQ0xPU0VfRU5PVUdIX0xPVyAmJiByZW1haW5kZXIgPCBDTE9TRV9FTk9VR0hfSElHSCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5VTUJFUl9NVUxUSVBMRV9PRiwge3ZhbHVlOiBkYXRhLCBtdWx0aXBsZU9mOiBtdWx0aXBsZU9mfSwgJycsICcnLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTWluTWF4ID0gZnVuY3Rpb24gdmFsaWRhdGVNaW5NYXgoZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKHNjaGVtYS5taW5pbXVtICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhIDwgc2NoZW1hLm1pbmltdW0pIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5OVU1CRVJfTUlOSU1VTSwge3ZhbHVlOiBkYXRhLCBtaW5pbXVtOiBzY2hlbWEubWluaW11bX0sICcnLCAnL21pbmltdW0nLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICYmIGRhdGEgPT09IHNjaGVtYS5taW5pbXVtKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuTlVNQkVSX01JTklNVU1fRVhDTFVTSVZFLCB7dmFsdWU6IGRhdGEsIG1pbmltdW06IHNjaGVtYS5taW5pbXVtfSwgJycsICcvZXhjbHVzaXZlTWluaW11bScsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWF4aW11bSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRpZiAoZGF0YSA+IHNjaGVtYS5tYXhpbXVtKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuTlVNQkVSX01BWElNVU0sIHt2YWx1ZTogZGF0YSwgbWF4aW11bTogc2NoZW1hLm1heGltdW19LCAnJywgJy9tYXhpbXVtJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdH1cclxuXHRcdGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAmJiBkYXRhID09PSBzY2hlbWEubWF4aW11bSkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5VTUJFUl9NQVhJTVVNX0VYQ0xVU0lWRSwge3ZhbHVlOiBkYXRhLCBtYXhpbXVtOiBzY2hlbWEubWF4aW11bX0sICcnLCAnL2V4Y2x1c2l2ZU1heGltdW0nLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTmFOID0gZnVuY3Rpb24gdmFsaWRhdGVOYU4oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKGlzTmFOKGRhdGEpID09PSB0cnVlIHx8IGRhdGEgPT09IEluZmluaXR5IHx8IGRhdGEgPT09IC1JbmZpbml0eSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5OVU1CRVJfTk9UX0FfTlVNQkVSLCB7dmFsdWU6IGRhdGF9LCAnJywgJy90eXBlJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZyA9IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0cmV0dXJuIHRoaXMudmFsaWRhdGVTdHJpbmdMZW5ndGgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlU3RyaW5nUGF0dGVybihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZ0xlbmd0aCA9IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nTGVuZ3RoKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWluTGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA8IHNjaGVtYS5taW5MZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5TVFJJTkdfTEVOR1RIX1NIT1JULCB7bGVuZ3RoOiBkYXRhLmxlbmd0aCwgbWluaW11bTogc2NoZW1hLm1pbkxlbmd0aH0sICcnLCAnL21pbkxlbmd0aCcsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA+IHNjaGVtYS5tYXhMZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5TVFJJTkdfTEVOR1RIX0xPTkcsIHtsZW5ndGg6IGRhdGEubGVuZ3RoLCBtYXhpbXVtOiBzY2hlbWEubWF4TGVuZ3RofSwgJycsICcvbWF4TGVuZ3RoJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZ1BhdHRlcm4gPSBmdW5jdGlvbiB2YWxpZGF0ZVN0cmluZ1BhdHRlcm4oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8ICh0eXBlb2Ygc2NoZW1hLnBhdHRlcm4gIT09IFwic3RyaW5nXCIgJiYgIShzY2hlbWEucGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkpKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIHJlZ2V4cDtcclxuXHRpZiAoc2NoZW1hLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcclxuXHQgIHJlZ2V4cCA9IHNjaGVtYS5wYXR0ZXJuO1xyXG5cdH1cclxuXHRlbHNlIHtcclxuXHQgIHZhciBib2R5LCBmbGFncyA9ICcnO1xyXG5cdCAgLy8gQ2hlY2sgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsc1xyXG5cdCAgLy8gQHNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtNy44LjVcclxuXHQgIHZhciBsaXRlcmFsID0gc2NoZW1hLnBhdHRlcm4ubWF0Y2goL15cXC8oLispXFwvKFtpbWddKikkLyk7XHJcblx0ICBpZiAobGl0ZXJhbCkge1xyXG5cdCAgICBib2R5ID0gbGl0ZXJhbFsxXTtcclxuXHQgICAgZmxhZ3MgPSBsaXRlcmFsWzJdO1xyXG5cdCAgfVxyXG5cdCAgZWxzZSB7XHJcblx0ICAgIGJvZHkgPSBzY2hlbWEucGF0dGVybjtcclxuXHQgIH1cclxuXHQgIHJlZ2V4cCA9IG5ldyBSZWdFeHAoYm9keSwgZmxhZ3MpO1xyXG5cdH1cclxuXHRpZiAoIXJlZ2V4cC50ZXN0KGRhdGEpKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLlNUUklOR19QQVRURVJOLCB7cGF0dGVybjogc2NoZW1hLnBhdHRlcm59LCAnJywgJy9wYXR0ZXJuJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFycmF5ID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLnZhbGlkYXRlQXJyYXlMZW5ndGgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlQXJyYXlVbmlxdWVJdGVtcyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVBcnJheUl0ZW1zKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQXJyYXlMZW5ndGggPSBmdW5jdGlvbiB2YWxpZGF0ZUFycmF5TGVuZ3RoKGRhdGEsIHNjaGVtYSkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoc2NoZW1hLm1pbkl0ZW1zICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA8IHNjaGVtYS5taW5JdGVtcykge1xyXG5cdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9MRU5HVEhfU0hPUlQsIHtsZW5ndGg6IGRhdGEubGVuZ3RoLCBtaW5pbXVtOiBzY2hlbWEubWluSXRlbXN9LCAnJywgJy9taW5JdGVtcycsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRpZiAoc2NoZW1hLm1heEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA+IHNjaGVtYS5tYXhJdGVtcykge1xyXG5cdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9MRU5HVEhfTE9ORywge2xlbmd0aDogZGF0YS5sZW5ndGgsIG1heGltdW06IHNjaGVtYS5tYXhJdGVtc30sICcnLCAnL21heEl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVBcnJheVVuaXF1ZUl0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheVVuaXF1ZUl0ZW1zKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmIChzY2hlbWEudW5pcXVlSXRlbXMpIHtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRmb3IgKHZhciBqID0gaSArIDE7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0aWYgKHJlY3Vyc2l2ZUNvbXBhcmUoZGF0YVtpXSwgZGF0YVtqXSkpIHtcclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9VTklRVUUsIHttYXRjaDE6IGksIG1hdGNoMjogan0sICcnLCAnL3VuaXF1ZUl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVBcnJheUl0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheUl0ZW1zKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0aWYgKHNjaGVtYS5pdGVtcyA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9yLCBpO1xyXG5cdGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmIChpIDwgc2NoZW1hLml0ZW1zLmxlbmd0aCkge1xyXG5cdFx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YVtpXSwgc2NoZW1hLml0ZW1zW2ldLCBbaV0sIFtcIml0ZW1zXCIsIGldLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcclxuXHRcdFx0XHRcdGlmICghc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykge1xyXG5cdFx0XHRcdFx0XHRlcnJvciA9ICh0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuQVJSQVlfQURESVRJT05BTF9JVEVNUywge30sICcvJyArIGksICcvYWRkaXRpb25hbEl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKSk7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFbaV0sIHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMsIFtpXSwgW1wiYWRkaXRpb25hbEl0ZW1zXCJdLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YVtpXSwgc2NoZW1hLml0ZW1zLCBbaV0sIFtcIml0ZW1zXCJdLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVPYmplY3QgPSBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICh0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBkYXRhID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHRyZXR1cm4gdGhpcy52YWxpZGF0ZU9iamVjdE1pbk1heFByb3BlcnRpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlT2JqZWN0UmVxdWlyZWRQcm9wZXJ0aWVzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9iamVjdFByb3BlcnRpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlT2JqZWN0RGVwZW5kZW5jaWVzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0TWluTWF4UHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0TWluTWF4UHJvcGVydGllcyhkYXRhLCBzY2hlbWEpIHtcclxuXHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoc2NoZW1hLm1pblByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0aWYgKGtleXMubGVuZ3RoIDwgc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcclxuXHRcdFx0ZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuT0JKRUNUX1BST1BFUlRJRVNfTUlOSU1VTSwge3Byb3BlcnR5Q291bnQ6IGtleXMubGVuZ3RoLCBtaW5pbXVtOiBzY2hlbWEubWluUHJvcGVydGllc30sICcnLCAnL21pblByb3BlcnRpZXMnLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHRpZiAodGhpcy5oYW5kbGVFcnJvcihlcnJvcikpIHtcclxuXHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHNjaGVtYS5tYXhQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChrZXlzLmxlbmd0aCA+IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XHJcblx0XHRcdGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9CSkVDVF9QUk9QRVJUSUVTX01BWElNVU0sIHtwcm9wZXJ0eUNvdW50OiBrZXlzLmxlbmd0aCwgbWF4aW11bTogc2NoZW1hLm1heFByb3BlcnRpZXN9LCAnJywgJy9tYXhQcm9wZXJ0aWVzJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVPYmplY3RSZXF1aXJlZFByb3BlcnRpZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdFJlcXVpcmVkUHJvcGVydGllcyhkYXRhLCBzY2hlbWEpIHtcclxuXHRpZiAoc2NoZW1hLnJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHZhciBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XHJcblx0XHRcdGlmIChkYXRhW2tleV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdHZhciBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PQkpFQ1RfUkVRVUlSRUQsIHtrZXk6IGtleX0sICcnLCAnL3JlcXVpcmVkLycgKyBpLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0UHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0UHJvcGVydGllcyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xyXG5cdFx0dmFyIGtleVBvaW50ZXJQYXRoID0gZGF0YVBvaW50ZXJQYXRoICsgXCIvXCIgKyBrZXkucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XHJcblx0XHR2YXIgZm91bmRNYXRjaCA9IGZhbHNlO1xyXG5cdFx0aWYgKHNjaGVtYS5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLnByb3BlcnRpZXNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGZvdW5kTWF0Y2ggPSB0cnVlO1xyXG5cdFx0XHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFba2V5XSwgc2NoZW1hLnByb3BlcnRpZXNba2V5XSwgW2tleV0sIFtcInByb3BlcnRpZXNcIiwga2V5XSwga2V5UG9pbnRlclBhdGgpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0Zm9yICh2YXIgcGF0dGVybktleSBpbiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHR2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cChwYXR0ZXJuS2V5KTtcclxuXHRcdFx0XHRpZiAocmVnZXhwLnRlc3Qoa2V5KSkge1xyXG5cdFx0XHRcdFx0Zm91bmRNYXRjaCA9IHRydWU7XHJcblx0XHRcdFx0XHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFba2V5XSwgc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5LZXldLCBba2V5XSwgW1wicGF0dGVyblByb3BlcnRpZXNcIiwgcGF0dGVybktleV0sIGtleVBvaW50ZXJQYXRoKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoIWZvdW5kTWF0Y2gpIHtcclxuXHRcdFx0aWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0XHRcdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzW2tleVBvaW50ZXJQYXRoXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKHR5cGVvZiBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiKSB7XHJcblx0XHRcdFx0XHRpZiAoIXNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcykge1xyXG5cdFx0XHRcdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PQkpFQ1RfQURESVRJT05BTF9QUk9QRVJUSUVTLCB7a2V5OiBrZXl9LCAnJywgJy9hZGRpdGlvbmFsUHJvcGVydGllcycsIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChrZXksIG51bGwpO1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5oYW5kbGVFcnJvcihlcnJvcikpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhW2tleV0sIHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcywgW2tleV0sIFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdLCBrZXlQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMgJiYgIXRoaXMua25vd25Qcm9wZXJ0eVBhdGhzW2tleVBvaW50ZXJQYXRoXSkge1xyXG5cdFx0XHRcdHRoaXMudW5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0ZGVsZXRlIHRoaXMudW5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0RGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gdmFsaWRhdGVPYmplY3REZXBlbmRlbmNpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHR2YXIgZXJyb3I7XHJcblx0aWYgKHNjaGVtYS5kZXBlbmRlbmNpZXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0Zm9yICh2YXIgZGVwS2V5IGluIHNjaGVtYS5kZXBlbmRlbmNpZXMpIHtcclxuXHRcdFx0aWYgKGRhdGFbZGVwS2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0dmFyIGRlcCA9IHNjaGVtYS5kZXBlbmRlbmNpZXNbZGVwS2V5XTtcclxuXHRcdFx0XHRpZiAodHlwZW9mIGRlcCA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdFx0aWYgKGRhdGFbZGVwXSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9CSkVDVF9ERVBFTkRFTkNZX0tFWSwge2tleTogZGVwS2V5LCBtaXNzaW5nOiBkZXB9LCAnJywgJycsIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChudWxsLCBkZXBLZXkpLnByZWZpeFdpdGgobnVsbCwgXCJkZXBlbmRlbmNpZXNcIik7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkZXApKSB7XHJcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHR2YXIgcmVxdWlyZWRLZXkgPSBkZXBbaV07XHJcblx0XHRcdFx0XHRcdGlmIChkYXRhW3JlcXVpcmVkS2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0ZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuT0JKRUNUX0RFUEVOREVOQ1lfS0VZLCB7a2V5OiBkZXBLZXksIG1pc3Npbmc6IHJlcXVpcmVkS2V5fSwgJycsICcvJyArIGksIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChudWxsLCBkZXBLZXkpLnByZWZpeFdpdGgobnVsbCwgXCJkZXBlbmRlbmNpZXNcIik7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgZGVwLCBbXSwgW1wiZGVwZW5kZW5jaWVzXCIsIGRlcEtleV0sIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQ29tYmluYXRpb25zID0gZnVuY3Rpb24gdmFsaWRhdGVDb21iaW5hdGlvbnMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHRyZXR1cm4gdGhpcy52YWxpZGF0ZUFsbE9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZUFueU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9uZU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU5vdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFsbE9mID0gZnVuY3Rpb24gdmFsaWRhdGVBbGxPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmIChzY2hlbWEuYWxsT2YgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHZhciBlcnJvcjtcclxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5hbGxPZi5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5hbGxPZltpXTtcclxuXHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgc3ViU2NoZW1hLCBbXSwgW1wiYWxsT2ZcIiwgaV0sIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQW55T2YgPSBmdW5jdGlvbiB2YWxpZGF0ZUFueU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0aWYgKHNjaGVtYS5hbnlPZiA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciBzdGFydEVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzLCBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0b2xkVW5rbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzID0gdGhpcy5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdHZhciBlcnJvckF0RW5kID0gdHJ1ZTtcclxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5hbnlPZi5sZW5ndGg7IGkrKykge1xyXG5cdFx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0XHR0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHRcdHRoaXMua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHR9XHJcblx0XHR2YXIgc3ViU2NoZW1hID0gc2NoZW1hLmFueU9mW2ldO1xyXG5cclxuXHRcdHZhciBlcnJvckNvdW50ID0gdGhpcy5lcnJvcnMubGVuZ3RoO1xyXG5cdFx0dmFyIGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhLCBzdWJTY2hlbWEsIFtdLCBbXCJhbnlPZlwiLCBpXSwgZGF0YVBvaW50ZXJQYXRoKTtcclxuXHJcblx0XHRpZiAoZXJyb3IgPT09IG51bGwgJiYgZXJyb3JDb3VudCA9PT0gdGhpcy5lcnJvcnMubGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgc3RhcnRFcnJvckNvdW50KTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBrbm93bktleSBpbiB0aGlzLmtub3duUHJvcGVydHlQYXRocykge1xyXG5cdFx0XHRcdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzW2tub3duS2V5XSA9IHRydWU7XHJcblx0XHRcdFx0XHRkZWxldGUgb2xkVW5rbm93blByb3BlcnR5UGF0aHNba25vd25LZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmb3IgKHZhciB1bmtub3duS2V5IGluIHRoaXMudW5rbm93blByb3BlcnR5UGF0aHMpIHtcclxuXHRcdFx0XHRcdGlmICghb2xkS25vd25Qcm9wZXJ0eVBhdGhzW3Vua25vd25LZXldKSB7XHJcblx0XHRcdFx0XHRcdG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzW3Vua25vd25LZXldID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBjb250aW51ZSBsb29waW5nIHNvIHdlIGNhdGNoIGFsbCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHJldHVybiBhbiBlcnJvclxyXG5cdFx0XHRcdGVycm9yQXRFbmQgPSBmYWxzZTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRpZiAoZXJyb3IpIHtcclxuXHRcdFx0ZXJyb3JzLnB1c2goZXJyb3IucHJlZml4V2l0aChudWxsLCBcIlwiICsgaSkucHJlZml4V2l0aChudWxsLCBcImFueU9mXCIpKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmIChlcnJvckF0RW5kKSB7XHJcblx0XHRlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCkpO1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BTllfT0ZfTUlTU0lORywge30sIFwiXCIsIFwiL2FueU9mXCIsIGVycm9ycywgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZU9uZU9mID0gZnVuY3Rpb24gdmFsaWRhdGVPbmVPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmIChzY2hlbWEub25lT2YgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHZhciB2YWxpZEluZGV4ID0gbnVsbDtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHN0YXJ0RXJyb3JDb3VudCA9IHRoaXMuZXJyb3JzLmxlbmd0aDtcclxuXHR2YXIgb2xkVW5rbm93blByb3BlcnR5UGF0aHMsIG9sZEtub3duUHJvcGVydHlQYXRocztcclxuXHRpZiAodGhpcy50cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRvbGRVbmtub3duUHJvcGVydHlQYXRocyA9IHRoaXMudW5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0XHRvbGRLbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLmtub3duUHJvcGVydHlQYXRocztcclxuXHR9XHJcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlbWEub25lT2YubGVuZ3RoOyBpKyspIHtcclxuXHRcdGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdFx0XHR0aGlzLmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdFx0fVxyXG5cdFx0dmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5vbmVPZltpXTtcclxuXHJcblx0XHR2YXIgZXJyb3JDb3VudCA9IHRoaXMuZXJyb3JzLmxlbmd0aDtcclxuXHRcdHZhciBlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgc3ViU2NoZW1hLCBbXSwgW1wib25lT2ZcIiwgaV0sIGRhdGFQb2ludGVyUGF0aCk7XHJcblxyXG5cdFx0aWYgKGVycm9yID09PSBudWxsICYmIGVycm9yQ291bnQgPT09IHRoaXMuZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRpZiAodmFsaWRJbmRleCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdHZhbGlkSW5kZXggPSBpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgc3RhcnRFcnJvckNvdW50KTtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9ORV9PRl9NVUxUSVBMRSwge2luZGV4MTogdmFsaWRJbmRleCwgaW5kZXgyOiBpfSwgXCJcIiwgXCIvb25lT2ZcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy50cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRcdFx0Zm9yICh2YXIga25vd25LZXkgaW4gdGhpcy5rbm93blByb3BlcnR5UGF0aHMpIHtcclxuXHRcdFx0XHRcdG9sZEtub3duUHJvcGVydHlQYXRoc1trbm93bktleV0gPSB0cnVlO1xyXG5cdFx0XHRcdFx0ZGVsZXRlIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzW2tub3duS2V5XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Zm9yICh2YXIgdW5rbm93bktleSBpbiB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzKSB7XHJcblx0XHRcdFx0XHRpZiAoIW9sZEtub3duUHJvcGVydHlQYXRoc1t1bmtub3duS2V5XSkge1xyXG5cdFx0XHRcdFx0XHRvbGRVbmtub3duUHJvcGVydHlQYXRoc1t1bmtub3duS2V5XSA9IHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGVycm9yKSB7XHJcblx0XHRcdGVycm9ycy5wdXNoKGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmICh2YWxpZEluZGV4ID09PSBudWxsKSB7XHJcblx0XHRlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCkpO1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PTkVfT0ZfTUlTU0lORywge30sIFwiXCIsIFwiL29uZU9mXCIsIGVycm9ycywgZGF0YSwgc2NoZW1hKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTm90ID0gZnVuY3Rpb24gdmFsaWRhdGVOb3QoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHRpZiAoc2NoZW1hLm5vdCA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIG9sZEVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzLCBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0b2xkVW5rbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzID0gdGhpcy5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0XHR0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHR0aGlzLmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdH1cclxuXHR2YXIgZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGEsIHNjaGVtYS5ub3QsIG51bGwsIG51bGwsIGRhdGFQb2ludGVyUGF0aCk7XHJcblx0dmFyIG5vdEVycm9ycyA9IHRoaXMuZXJyb3JzLnNsaWNlKG9sZEVycm9yQ291bnQpO1xyXG5cdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgb2xkRXJyb3JDb3VudCk7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmIChlcnJvciA9PT0gbnVsbCAmJiBub3RFcnJvcnMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5PVF9QQVNTRUQsIHt9LCBcIlwiLCBcIi9ub3RcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUh5cGVybWVkaWEgPSBmdW5jdGlvbiB2YWxpZGF0ZUNvbWJpbmF0aW9ucyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICghc2NoZW1hLmxpbmtzKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9yO1xyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hLmxpbmtzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgbGRvID0gc2NoZW1hLmxpbmtzW2ldO1xyXG5cdFx0aWYgKGxkby5yZWwgPT09IFwiZGVzY3JpYmVkYnlcIikge1xyXG5cdFx0XHR2YXIgdGVtcGxhdGUgPSBuZXcgVXJpVGVtcGxhdGUobGRvLmhyZWYpO1xyXG5cdFx0XHR2YXIgYWxsUHJlc2VudCA9IHRydWU7XHJcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdGVtcGxhdGUudmFyTmFtZXMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRpZiAoISh0ZW1wbGF0ZS52YXJOYW1lc1tqXSBpbiBkYXRhKSkge1xyXG5cdFx0XHRcdFx0YWxsUHJlc2VudCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChhbGxQcmVzZW50KSB7XHJcblx0XHRcdFx0dmFyIHNjaGVtYVVybCA9IHRlbXBsYXRlLmZpbGxGcm9tT2JqZWN0KGRhdGEpO1xyXG5cdFx0XHRcdHZhciBzdWJTY2hlbWEgPSB7XCIkcmVmXCI6IHNjaGVtYVVybH07XHJcblx0XHRcdFx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhLCBzdWJTY2hlbWEsIFtdLCBbXCJsaW5rc1wiLCBpXSwgZGF0YVBvaW50ZXJQYXRoKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbi8vIHBhcnNlVVJJKCkgYW5kIHJlc29sdmVVcmwoKSBhcmUgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xMDg4ODUwXHJcbi8vICAgLSAgcmVsZWFzZWQgYXMgcHVibGljIGRvbWFpbiBieSBhdXRob3IgKFwiWWFmZmxlXCIpIC0gc2VlIGNvbW1lbnRzIG9uIGdpc3RcclxuXHJcbmZ1bmN0aW9uIHBhcnNlVVJJKHVybCkge1xyXG5cdHZhciBtID0gU3RyaW5nKHVybCkucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpLm1hdGNoKC9eKFteOlxcLz8jXSs6KT8oXFwvXFwvKD86W146QF0qKD86OlteOkBdKik/QCk/KChbXjpcXC8/I10qKSg/OjooXFxkKikpPykpPyhbXj8jXSopKFxcP1teI10qKT8oI1tcXHNcXFNdKik/Lyk7XHJcblx0Ly8gYXV0aG9yaXR5ID0gJy8vJyArIHVzZXIgKyAnOicgKyBwYXNzICdAJyArIGhvc3RuYW1lICsgJzonIHBvcnRcclxuXHRyZXR1cm4gKG0gPyB7XHJcblx0XHRocmVmICAgICA6IG1bMF0gfHwgJycsXHJcblx0XHRwcm90b2NvbCA6IG1bMV0gfHwgJycsXHJcblx0XHRhdXRob3JpdHk6IG1bMl0gfHwgJycsXHJcblx0XHRob3N0ICAgICA6IG1bM10gfHwgJycsXHJcblx0XHRob3N0bmFtZSA6IG1bNF0gfHwgJycsXHJcblx0XHRwb3J0ICAgICA6IG1bNV0gfHwgJycsXHJcblx0XHRwYXRobmFtZSA6IG1bNl0gfHwgJycsXHJcblx0XHRzZWFyY2ggICA6IG1bN10gfHwgJycsXHJcblx0XHRoYXNoICAgICA6IG1bOF0gfHwgJydcclxuXHR9IDogbnVsbCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVVcmwoYmFzZSwgaHJlZikgey8vIFJGQyAzOTg2XHJcblxyXG5cdGZ1bmN0aW9uIHJlbW92ZURvdFNlZ21lbnRzKGlucHV0KSB7XHJcblx0XHR2YXIgb3V0cHV0ID0gW107XHJcblx0XHRpbnB1dC5yZXBsYWNlKC9eKFxcLlxcLj8oXFwvfCQpKSsvLCAnJylcclxuXHRcdFx0LnJlcGxhY2UoL1xcLyhcXC4oXFwvfCQpKSsvZywgJy8nKVxyXG5cdFx0XHQucmVwbGFjZSgvXFwvXFwuXFwuJC8sICcvLi4vJylcclxuXHRcdFx0LnJlcGxhY2UoL1xcLz9bXlxcL10qL2csIGZ1bmN0aW9uIChwKSB7XHJcblx0XHRcdFx0aWYgKHAgPT09ICcvLi4nKSB7XHJcblx0XHRcdFx0XHRvdXRwdXQucG9wKCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHApO1xyXG5cdFx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKS5yZXBsYWNlKC9eXFwvLywgaW5wdXQuY2hhckF0KDApID09PSAnLycgPyAnLycgOiAnJyk7XHJcblx0fVxyXG5cclxuXHRocmVmID0gcGFyc2VVUkkoaHJlZiB8fCAnJyk7XHJcblx0YmFzZSA9IHBhcnNlVVJJKGJhc2UgfHwgJycpO1xyXG5cclxuXHRyZXR1cm4gIWhyZWYgfHwgIWJhc2UgPyBudWxsIDogKGhyZWYucHJvdG9jb2wgfHwgYmFzZS5wcm90b2NvbCkgK1xyXG5cdFx0KGhyZWYucHJvdG9jb2wgfHwgaHJlZi5hdXRob3JpdHkgPyBocmVmLmF1dGhvcml0eSA6IGJhc2UuYXV0aG9yaXR5KSArXHJcblx0XHRyZW1vdmVEb3RTZWdtZW50cyhocmVmLnByb3RvY29sIHx8IGhyZWYuYXV0aG9yaXR5IHx8IGhyZWYucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycgPyBocmVmLnBhdGhuYW1lIDogKGhyZWYucGF0aG5hbWUgPyAoKGJhc2UuYXV0aG9yaXR5ICYmICFiYXNlLnBhdGhuYW1lID8gJy8nIDogJycpICsgYmFzZS5wYXRobmFtZS5zbGljZSgwLCBiYXNlLnBhdGhuYW1lLmxhc3RJbmRleE9mKCcvJykgKyAxKSArIGhyZWYucGF0aG5hbWUpIDogYmFzZS5wYXRobmFtZSkpICtcclxuXHRcdChocmVmLnByb3RvY29sIHx8IGhyZWYuYXV0aG9yaXR5IHx8IGhyZWYucGF0aG5hbWUgPyBocmVmLnNlYXJjaCA6IChocmVmLnNlYXJjaCB8fCBiYXNlLnNlYXJjaCkpICtcclxuXHRcdGhyZWYuaGFzaDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRVcmkodXJpKSB7XHJcblx0cmV0dXJuIHVyaS5zcGxpdCgnIycpWzBdO1xyXG59XHJcbmZ1bmN0aW9uIG5vcm1TY2hlbWEoc2NoZW1hLCBiYXNlVXJpKSB7XHJcblx0aWYgKHNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiKSB7XHJcblx0XHRpZiAoYmFzZVVyaSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGJhc2VVcmkgPSBzY2hlbWEuaWQ7XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzY2hlbWEuaWQgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0YmFzZVVyaSA9IHJlc29sdmVVcmwoYmFzZVVyaSwgc2NoZW1hLmlkKTtcclxuXHRcdFx0c2NoZW1hLmlkID0gYmFzZVVyaTtcclxuXHRcdH1cclxuXHRcdGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcclxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRub3JtU2NoZW1hKHNjaGVtYVtpXSwgYmFzZVVyaSk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hWyckcmVmJ10gPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRzY2hlbWFbJyRyZWYnXSA9IHJlc29sdmVVcmwoYmFzZVVyaSwgc2NoZW1hWyckcmVmJ10pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAodmFyIGtleSBpbiBzY2hlbWEpIHtcclxuXHRcdFx0XHRpZiAoa2V5ICE9PSBcImVudW1cIikge1xyXG5cdFx0XHRcdFx0bm9ybVNjaGVtYShzY2hlbWFba2V5XSwgYmFzZVVyaSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JSZXBvcnRlcihsYW5ndWFnZSkge1xyXG5cdGxhbmd1YWdlID0gbGFuZ3VhZ2UgfHwgJ2VuJztcclxuXHJcblx0dmFyIGVycm9yTWVzc2FnZXMgPSBsYW5ndWFnZXNbbGFuZ3VhZ2VdO1xyXG5cclxuXHRyZXR1cm4gZnVuY3Rpb24gKGVycm9yKSB7XHJcblx0XHR2YXIgbWVzc2FnZVRlbXBsYXRlID0gZXJyb3JNZXNzYWdlc1tlcnJvci5jb2RlXSB8fCBFcnJvck1lc3NhZ2VzRGVmYXVsdFtlcnJvci5jb2RlXTtcclxuXHRcdGlmICh0eXBlb2YgbWVzc2FnZVRlbXBsYXRlICE9PSAnc3RyaW5nJykge1xyXG5cdFx0XHRyZXR1cm4gXCJVbmtub3duIGVycm9yIGNvZGUgXCIgKyBlcnJvci5jb2RlICsgXCI6IFwiICsgSlNPTi5zdHJpbmdpZnkoZXJyb3IubWVzc2FnZVBhcmFtcyk7XHJcblx0XHR9XHJcblx0XHR2YXIgbWVzc2FnZVBhcmFtcyA9IGVycm9yLnBhcmFtcztcclxuXHRcdC8vIEFkYXB0ZWQgZnJvbSBDcm9ja2ZvcmQncyBzdXBwbGFudCgpXHJcblx0XHRyZXR1cm4gbWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoL1xceyhbXnt9XSopXFx9L2csIGZ1bmN0aW9uICh3aG9sZSwgdmFyTmFtZSkge1xyXG5cdFx0XHR2YXIgc3ViVmFsdWUgPSBtZXNzYWdlUGFyYW1zW3Zhck5hbWVdO1xyXG5cdFx0XHRyZXR1cm4gdHlwZW9mIHN1YlZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygc3ViVmFsdWUgPT09ICdudW1iZXInID8gc3ViVmFsdWUgOiB3aG9sZTtcclxuXHRcdH0pO1xyXG5cdH07XHJcbn1cclxuXHJcbnZhciBFcnJvckNvZGVzID0ge1xyXG5cdElOVkFMSURfVFlQRTogMCxcclxuXHRFTlVNX01JU01BVENIOiAxLFxyXG5cdEFOWV9PRl9NSVNTSU5HOiAxMCxcclxuXHRPTkVfT0ZfTUlTU0lORzogMTEsXHJcblx0T05FX09GX01VTFRJUExFOiAxMixcclxuXHROT1RfUEFTU0VEOiAxMyxcclxuXHQvLyBOdW1lcmljIGVycm9yc1xyXG5cdE5VTUJFUl9NVUxUSVBMRV9PRjogMTAwLFxyXG5cdE5VTUJFUl9NSU5JTVVNOiAxMDEsXHJcblx0TlVNQkVSX01JTklNVU1fRVhDTFVTSVZFOiAxMDIsXHJcblx0TlVNQkVSX01BWElNVU06IDEwMyxcclxuXHROVU1CRVJfTUFYSU1VTV9FWENMVVNJVkU6IDEwNCxcclxuXHROVU1CRVJfTk9UX0FfTlVNQkVSOiAxMDUsXHJcblx0Ly8gU3RyaW5nIGVycm9yc1xyXG5cdFNUUklOR19MRU5HVEhfU0hPUlQ6IDIwMCxcclxuXHRTVFJJTkdfTEVOR1RIX0xPTkc6IDIwMSxcclxuXHRTVFJJTkdfUEFUVEVSTjogMjAyLFxyXG5cdC8vIE9iamVjdCBlcnJvcnNcclxuXHRPQkpFQ1RfUFJPUEVSVElFU19NSU5JTVVNOiAzMDAsXHJcblx0T0JKRUNUX1BST1BFUlRJRVNfTUFYSU1VTTogMzAxLFxyXG5cdE9CSkVDVF9SRVFVSVJFRDogMzAyLFxyXG5cdE9CSkVDVF9BRERJVElPTkFMX1BST1BFUlRJRVM6IDMwMyxcclxuXHRPQkpFQ1RfREVQRU5ERU5DWV9LRVk6IDMwNCxcclxuXHQvLyBBcnJheSBlcnJvcnNcclxuXHRBUlJBWV9MRU5HVEhfU0hPUlQ6IDQwMCxcclxuXHRBUlJBWV9MRU5HVEhfTE9ORzogNDAxLFxyXG5cdEFSUkFZX1VOSVFVRTogNDAyLFxyXG5cdEFSUkFZX0FERElUSU9OQUxfSVRFTVM6IDQwMyxcclxuXHQvLyBDdXN0b20vdXNlci1kZWZpbmVkIGVycm9yc1xyXG5cdEZPUk1BVF9DVVNUT006IDUwMCxcclxuXHRLRVlXT1JEX0NVU1RPTTogNTAxLFxyXG5cdC8vIFNjaGVtYSBzdHJ1Y3R1cmVcclxuXHRDSVJDVUxBUl9SRUZFUkVOQ0U6IDYwMCxcclxuXHQvLyBOb24tc3RhbmRhcmQgdmFsaWRhdGlvbiBvcHRpb25zXHJcblx0VU5LTk9XTl9QUk9QRVJUWTogMTAwMFxyXG59O1xyXG52YXIgRXJyb3JDb2RlTG9va3VwID0ge307XHJcbmZvciAodmFyIGtleSBpbiBFcnJvckNvZGVzKSB7XHJcblx0RXJyb3JDb2RlTG9va3VwW0Vycm9yQ29kZXNba2V5XV0gPSBrZXk7XHJcbn1cclxudmFyIEVycm9yTWVzc2FnZXNEZWZhdWx0ID0ge1xyXG5cdElOVkFMSURfVFlQRTogXCJJbnZhbGlkIHR5cGU6IHt0eXBlfSAoZXhwZWN0ZWQge2V4cGVjdGVkfSlcIixcclxuXHRFTlVNX01JU01BVENIOiBcIk5vIGVudW0gbWF0Y2ggZm9yOiB7dmFsdWV9XCIsXHJcblx0QU5ZX09GX01JU1NJTkc6IFwiRGF0YSBkb2VzIG5vdCBtYXRjaCBhbnkgc2NoZW1hcyBmcm9tIFxcXCJhbnlPZlxcXCJcIixcclxuXHRPTkVfT0ZfTUlTU0lORzogXCJEYXRhIGRvZXMgbm90IG1hdGNoIGFueSBzY2hlbWFzIGZyb20gXFxcIm9uZU9mXFxcIlwiLFxyXG5cdE9ORV9PRl9NVUxUSVBMRTogXCJEYXRhIGlzIHZhbGlkIGFnYWluc3QgbW9yZSB0aGFuIG9uZSBzY2hlbWEgZnJvbSBcXFwib25lT2ZcXFwiOiBpbmRpY2VzIHtpbmRleDF9IGFuZCB7aW5kZXgyfVwiLFxyXG5cdE5PVF9QQVNTRUQ6IFwiRGF0YSBtYXRjaGVzIHNjaGVtYSBmcm9tIFxcXCJub3RcXFwiXCIsXHJcblx0Ly8gTnVtZXJpYyBlcnJvcnNcclxuXHROVU1CRVJfTVVMVElQTEVfT0Y6IFwiVmFsdWUge3ZhbHVlfSBpcyBub3QgYSBtdWx0aXBsZSBvZiB7bXVsdGlwbGVPZn1cIixcclxuXHROVU1CRVJfTUlOSU1VTTogXCJWYWx1ZSB7dmFsdWV9IGlzIGxlc3MgdGhhbiBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE5VTUJFUl9NSU5JTVVNX0VYQ0xVU0lWRTogXCJWYWx1ZSB7dmFsdWV9IGlzIGVxdWFsIHRvIGV4Y2x1c2l2ZSBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE5VTUJFUl9NQVhJTVVNOiBcIlZhbHVlIHt2YWx1ZX0gaXMgZ3JlYXRlciB0aGFuIG1heGltdW0ge21heGltdW19XCIsXHJcblx0TlVNQkVSX01BWElNVU1fRVhDTFVTSVZFOiBcIlZhbHVlIHt2YWx1ZX0gaXMgZXF1YWwgdG8gZXhjbHVzaXZlIG1heGltdW0ge21heGltdW19XCIsXHJcblx0TlVNQkVSX05PVF9BX05VTUJFUjogXCJWYWx1ZSB7dmFsdWV9IGlzIG5vdCBhIHZhbGlkIG51bWJlclwiLFxyXG5cdC8vIFN0cmluZyBlcnJvcnNcclxuXHRTVFJJTkdfTEVOR1RIX1NIT1JUOiBcIlN0cmluZyBpcyB0b28gc2hvcnQgKHtsZW5ndGh9IGNoYXJzKSwgbWluaW11bSB7bWluaW11bX1cIixcclxuXHRTVFJJTkdfTEVOR1RIX0xPTkc6IFwiU3RyaW5nIGlzIHRvbyBsb25nICh7bGVuZ3RofSBjaGFycyksIG1heGltdW0ge21heGltdW19XCIsXHJcblx0U1RSSU5HX1BBVFRFUk46IFwiU3RyaW5nIGRvZXMgbm90IG1hdGNoIHBhdHRlcm46IHtwYXR0ZXJufVwiLFxyXG5cdC8vIE9iamVjdCBlcnJvcnNcclxuXHRPQkpFQ1RfUFJPUEVSVElFU19NSU5JTVVNOiBcIlRvbyBmZXcgcHJvcGVydGllcyBkZWZpbmVkICh7cHJvcGVydHlDb3VudH0pLCBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE9CSkVDVF9QUk9QRVJUSUVTX01BWElNVU06IFwiVG9vIG1hbnkgcHJvcGVydGllcyBkZWZpbmVkICh7cHJvcGVydHlDb3VudH0pLCBtYXhpbXVtIHttYXhpbXVtfVwiLFxyXG5cdE9CSkVDVF9SRVFVSVJFRDogXCJNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5OiB7a2V5fVwiLFxyXG5cdE9CSkVDVF9BRERJVElPTkFMX1BST1BFUlRJRVM6IFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG5vdCBhbGxvd2VkXCIsXHJcblx0T0JKRUNUX0RFUEVOREVOQ1lfS0VZOiBcIkRlcGVuZGVuY3kgZmFpbGVkIC0ga2V5IG11c3QgZXhpc3Q6IHttaXNzaW5nfSAoZHVlIHRvIGtleToge2tleX0pXCIsXHJcblx0Ly8gQXJyYXkgZXJyb3JzXHJcblx0QVJSQVlfTEVOR1RIX1NIT1JUOiBcIkFycmF5IGlzIHRvbyBzaG9ydCAoe2xlbmd0aH0pLCBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdEFSUkFZX0xFTkdUSF9MT05HOiBcIkFycmF5IGlzIHRvbyBsb25nICh7bGVuZ3RofSksIG1heGltdW0ge21heGltdW19XCIsXHJcblx0QVJSQVlfVU5JUVVFOiBcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlIChpbmRpY2VzIHttYXRjaDF9IGFuZCB7bWF0Y2gyfSlcIixcclxuXHRBUlJBWV9BRERJVElPTkFMX0lURU1TOiBcIkFkZGl0aW9uYWwgaXRlbXMgbm90IGFsbG93ZWRcIixcclxuXHQvLyBGb3JtYXQgZXJyb3JzXHJcblx0Rk9STUFUX0NVU1RPTTogXCJGb3JtYXQgdmFsaWRhdGlvbiBmYWlsZWQgKHttZXNzYWdlfSlcIixcclxuXHRLRVlXT1JEX0NVU1RPTTogXCJLZXl3b3JkIGZhaWxlZDoge2tleX0gKHttZXNzYWdlfSlcIixcclxuXHQvLyBTY2hlbWEgc3RydWN0dXJlXHJcblx0Q0lSQ1VMQVJfUkVGRVJFTkNFOiBcIkNpcmN1bGFyICRyZWZzOiB7dXJsc31cIixcclxuXHQvLyBOb24tc3RhbmRhcmQgdmFsaWRhdGlvbiBvcHRpb25zXHJcblx0VU5LTk9XTl9QUk9QRVJUWTogXCJVbmtub3duIHByb3BlcnR5IChub3QgaW4gc2NoZW1hKVwiXHJcbn07XHJcblxyXG5mdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3IoY29kZSwgcGFyYW1zLCBkYXRhUGF0aCwgc2NoZW1hUGF0aCwgc3ViRXJyb3JzKSB7XHJcblx0RXJyb3IuY2FsbCh0aGlzKTtcclxuXHRpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiTm8gZXJyb3IgY29kZSBzdXBwbGllZDogXCIgKyBzY2hlbWFQYXRoKTtcclxuXHR9XHJcblx0dGhpcy5tZXNzYWdlID0gJyc7XHJcblx0dGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcblx0dGhpcy5jb2RlID0gY29kZTtcclxuXHR0aGlzLmRhdGFQYXRoID0gZGF0YVBhdGggfHwgXCJcIjtcclxuXHR0aGlzLnNjaGVtYVBhdGggPSBzY2hlbWFQYXRoIHx8IFwiXCI7XHJcblx0dGhpcy5zdWJFcnJvcnMgPSBzdWJFcnJvcnMgfHwgbnVsbDtcclxuXHJcblx0dmFyIGVyciA9IG5ldyBFcnJvcih0aGlzLm1lc3NhZ2UpO1xyXG5cdHRoaXMuc3RhY2sgPSBlcnIuc3RhY2sgfHwgZXJyLnN0YWNrdHJhY2U7XHJcblx0aWYgKCF0aGlzLnN0YWNrKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR0aHJvdyBlcnI7XHJcblx0XHR9XHJcblx0XHRjYXRjaChlcnIpIHtcclxuXHRcdFx0dGhpcy5zdGFjayA9IGVyci5zdGFjayB8fCBlcnIuc3RhY2t0cmFjZTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZhbGlkYXRpb25FcnJvcjtcclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZS5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcic7XHJcblxyXG5WYWxpZGF0aW9uRXJyb3IucHJvdG90eXBlLnByZWZpeFdpdGggPSBmdW5jdGlvbiAoZGF0YVByZWZpeCwgc2NoZW1hUHJlZml4KSB7XHJcblx0aWYgKGRhdGFQcmVmaXggIT09IG51bGwpIHtcclxuXHRcdGRhdGFQcmVmaXggPSBkYXRhUHJlZml4LnJlcGxhY2UoL34vZywgXCJ+MFwiKS5yZXBsYWNlKC9cXC8vZywgXCJ+MVwiKTtcclxuXHRcdHRoaXMuZGF0YVBhdGggPSBcIi9cIiArIGRhdGFQcmVmaXggKyB0aGlzLmRhdGFQYXRoO1xyXG5cdH1cclxuXHRpZiAoc2NoZW1hUHJlZml4ICE9PSBudWxsKSB7XHJcblx0XHRzY2hlbWFQcmVmaXggPSBzY2hlbWFQcmVmaXgucmVwbGFjZSgvfi9nLCBcIn4wXCIpLnJlcGxhY2UoL1xcLy9nLCBcIn4xXCIpO1xyXG5cdFx0dGhpcy5zY2hlbWFQYXRoID0gXCIvXCIgKyBzY2hlbWFQcmVmaXggKyB0aGlzLnNjaGVtYVBhdGg7XHJcblx0fVxyXG5cdGlmICh0aGlzLnN1YkVycm9ycyAhPT0gbnVsbCkge1xyXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YkVycm9ycy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR0aGlzLnN1YkVycm9yc1tpXS5wcmVmaXhXaXRoKGRhdGFQcmVmaXgsIHNjaGVtYVByZWZpeCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gaXNUcnVzdGVkVXJsKGJhc2VVcmwsIHRlc3RVcmwpIHtcclxuXHRpZih0ZXN0VXJsLnN1YnN0cmluZygwLCBiYXNlVXJsLmxlbmd0aCkgPT09IGJhc2VVcmwpe1xyXG5cdFx0dmFyIHJlbWFpbmRlciA9IHRlc3RVcmwuc3Vic3RyaW5nKGJhc2VVcmwubGVuZ3RoKTtcclxuXHRcdGlmICgodGVzdFVybC5sZW5ndGggPiAwICYmIHRlc3RVcmwuY2hhckF0KGJhc2VVcmwubGVuZ3RoIC0gMSkgPT09IFwiL1wiKVxyXG5cdFx0XHR8fCByZW1haW5kZXIuY2hhckF0KDApID09PSBcIiNcIlxyXG5cdFx0XHR8fCByZW1haW5kZXIuY2hhckF0KDApID09PSBcIj9cIikge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG52YXIgbGFuZ3VhZ2VzID0ge307XHJcbmZ1bmN0aW9uIGNyZWF0ZUFwaShsYW5ndWFnZSkge1xyXG5cdHZhciBnbG9iYWxDb250ZXh0ID0gbmV3IFZhbGlkYXRvckNvbnRleHQoKTtcclxuXHR2YXIgY3VycmVudExhbmd1YWdlO1xyXG5cdHZhciBjdXN0b21FcnJvclJlcG9ydGVyO1xyXG5cdHZhciBhcGkgPSB7XHJcblx0XHRzZXRFcnJvclJlcG9ydGVyOiBmdW5jdGlvbiAocmVwb3J0ZXIpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiByZXBvcnRlciA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5sYW5ndWFnZShyZXBvcnRlcik7XHJcblx0XHRcdH1cclxuXHRcdFx0Y3VzdG9tRXJyb3JSZXBvcnRlciA9IHJlcG9ydGVyO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHRhZGRGb3JtYXQ6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5hZGRGb3JtYXQuYXBwbHkoZ2xvYmFsQ29udGV4dCwgYXJndW1lbnRzKTtcclxuXHRcdH0sXHJcblx0XHRsYW5ndWFnZTogZnVuY3Rpb24gKGNvZGUpIHtcclxuXHRcdFx0aWYgKCFjb2RlKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRMYW5ndWFnZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIWxhbmd1YWdlc1tjb2RlXSkge1xyXG5cdFx0XHRcdGNvZGUgPSBjb2RlLnNwbGl0KCctJylbMF07IC8vIGZhbGwgYmFjayB0byBiYXNlIGxhbmd1YWdlXHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGxhbmd1YWdlc1tjb2RlXSkge1xyXG5cdFx0XHRcdGN1cnJlbnRMYW5ndWFnZSA9IGNvZGU7XHJcblx0XHRcdFx0cmV0dXJuIGNvZGU7IC8vIHNvIHlvdSBjYW4gdGVsbCBpZiBmYWxsLWJhY2sgaGFzIGhhcHBlbmVkXHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fSxcclxuXHRcdGFkZExhbmd1YWdlOiBmdW5jdGlvbiAoY29kZSwgbWVzc2FnZU1hcCkge1xyXG5cdFx0XHR2YXIga2V5O1xyXG5cdFx0XHRmb3IgKGtleSBpbiBFcnJvckNvZGVzKSB7XHJcblx0XHRcdFx0aWYgKG1lc3NhZ2VNYXBba2V5XSAmJiAhbWVzc2FnZU1hcFtFcnJvckNvZGVzW2tleV1dKSB7XHJcblx0XHRcdFx0XHRtZXNzYWdlTWFwW0Vycm9yQ29kZXNba2V5XV0gPSBtZXNzYWdlTWFwW2tleV07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHZhciByb290Q29kZSA9IGNvZGUuc3BsaXQoJy0nKVswXTtcclxuXHRcdFx0aWYgKCFsYW5ndWFnZXNbcm9vdENvZGVdKSB7IC8vIHVzZSBmb3IgYmFzZSBsYW5ndWFnZSBpZiBub3QgeWV0IGRlZmluZWRcclxuXHRcdFx0XHRsYW5ndWFnZXNbY29kZV0gPSBtZXNzYWdlTWFwO1xyXG5cdFx0XHRcdGxhbmd1YWdlc1tyb290Q29kZV0gPSBtZXNzYWdlTWFwO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGxhbmd1YWdlc1tjb2RlXSA9IE9iamVjdC5jcmVhdGUobGFuZ3VhZ2VzW3Jvb3RDb2RlXSk7XHJcblx0XHRcdFx0Zm9yIChrZXkgaW4gbWVzc2FnZU1hcCkge1xyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBsYW5ndWFnZXNbcm9vdENvZGVdW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XHJcblx0XHRcdFx0XHRcdGxhbmd1YWdlc1tyb290Q29kZV1ba2V5XSA9IG1lc3NhZ2VNYXBba2V5XTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxhbmd1YWdlc1tjb2RlXVtrZXldID0gbWVzc2FnZU1hcFtrZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdH0sXHJcblx0XHRmcmVzaEFwaTogZnVuY3Rpb24gKGxhbmd1YWdlKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSBjcmVhdGVBcGkoKTtcclxuXHRcdFx0aWYgKGxhbmd1YWdlKSB7XHJcblx0XHRcdFx0cmVzdWx0Lmxhbmd1YWdlKGxhbmd1YWdlKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fSxcclxuXHRcdHZhbGlkYXRlOiBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dmFyIGRlZiA9IGRlZmF1bHRFcnJvclJlcG9ydGVyKGN1cnJlbnRMYW5ndWFnZSk7XHJcblx0XHRcdHZhciBlcnJvclJlcG9ydGVyID0gY3VzdG9tRXJyb3JSZXBvcnRlciA/IGZ1bmN0aW9uIChlcnJvciwgZGF0YSwgc2NoZW1hKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1c3RvbUVycm9yUmVwb3J0ZXIoZXJyb3IsIGRhdGEsIHNjaGVtYSkgfHwgZGVmKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9IDogZGVmO1xyXG5cdFx0XHR2YXIgY29udGV4dCA9IG5ldyBWYWxpZGF0b3JDb250ZXh0KGdsb2JhbENvbnRleHQsIGZhbHNlLCBlcnJvclJlcG9ydGVyLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpO1xyXG5cdFx0XHRpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdHNjaGVtYSA9IHtcIiRyZWZcIjogc2NoZW1hfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb250ZXh0LmFkZFNjaGVtYShcIlwiLCBzY2hlbWEpO1xyXG5cdFx0XHR2YXIgZXJyb3IgPSBjb250ZXh0LnZhbGlkYXRlQWxsKGRhdGEsIHNjaGVtYSwgbnVsbCwgbnVsbCwgXCJcIik7XHJcblx0XHRcdGlmICghZXJyb3IgJiYgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHRlcnJvciA9IGNvbnRleHQuYmFuVW5rbm93blByb3BlcnRpZXMoZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmVycm9yID0gZXJyb3I7XHJcblx0XHRcdHRoaXMubWlzc2luZyA9IGNvbnRleHQubWlzc2luZztcclxuXHRcdFx0dGhpcy52YWxpZCA9IChlcnJvciA9PT0gbnVsbCk7XHJcblx0XHRcdHJldHVybiB0aGlzLnZhbGlkO1xyXG5cdFx0fSxcclxuXHRcdHZhbGlkYXRlUmVzdWx0OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZCA/ICd2YWxpZCcgOiB0aGlzLmVycm9yLm1lc3NhZ2U7XHJcblx0XHRcdH19O1xyXG5cdFx0XHR0aGlzLnZhbGlkYXRlLmFwcGx5KHJlc3VsdCwgYXJndW1lbnRzKTtcclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdH0sXHJcblx0XHR2YWxpZGF0ZU11bHRpcGxlOiBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dmFyIGRlZiA9IGRlZmF1bHRFcnJvclJlcG9ydGVyKGN1cnJlbnRMYW5ndWFnZSk7XHJcblx0XHRcdHZhciBlcnJvclJlcG9ydGVyID0gY3VzdG9tRXJyb3JSZXBvcnRlciA/IGZ1bmN0aW9uIChlcnJvciwgZGF0YSwgc2NoZW1hKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1c3RvbUVycm9yUmVwb3J0ZXIoZXJyb3IsIGRhdGEsIHNjaGVtYSkgfHwgZGVmKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9IDogZGVmO1xyXG5cdFx0XHR2YXIgY29udGV4dCA9IG5ldyBWYWxpZGF0b3JDb250ZXh0KGdsb2JhbENvbnRleHQsIHRydWUsIGVycm9yUmVwb3J0ZXIsIGNoZWNrUmVjdXJzaXZlLCBiYW5Vbmtub3duUHJvcGVydGllcyk7XHJcblx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XHJcblx0XHRcdFx0c2NoZW1hID0ge1wiJHJlZlwiOiBzY2hlbWF9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnRleHQuYWRkU2NoZW1hKFwiXCIsIHNjaGVtYSk7XHJcblx0XHRcdGNvbnRleHQudmFsaWRhdGVBbGwoZGF0YSwgc2NoZW1hLCBudWxsLCBudWxsLCBcIlwiKTtcclxuXHRcdFx0aWYgKGJhblVua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRcdFx0Y29udGV4dC5iYW5Vbmtub3duUHJvcGVydGllcyhkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhciByZXN1bHQgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZCA/ICd2YWxpZCcgOiB0aGlzLmVycm9yLm1lc3NhZ2U7XHJcblx0XHRcdH19O1xyXG5cdFx0XHRyZXN1bHQuZXJyb3JzID0gY29udGV4dC5lcnJvcnM7XHJcblx0XHRcdHJlc3VsdC5taXNzaW5nID0gY29udGV4dC5taXNzaW5nO1xyXG5cdFx0XHRyZXN1bHQudmFsaWQgPSAocmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDApO1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fSxcclxuXHRcdGFkZFNjaGVtYTogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRyZXR1cm4gZ2xvYmFsQ29udGV4dC5hZGRTY2hlbWEuYXBwbHkoZ2xvYmFsQ29udGV4dCwgYXJndW1lbnRzKTtcclxuXHRcdH0sXHJcblx0XHRnZXRTY2hlbWE6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIGdsb2JhbENvbnRleHQuZ2V0U2NoZW1hLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0Z2V0U2NoZW1hTWFwOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJldHVybiBnbG9iYWxDb250ZXh0LmdldFNjaGVtYU1hcC5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGdldFNjaGVtYVVyaXM6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIGdsb2JhbENvbnRleHQuZ2V0U2NoZW1hVXJpcy5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGdldE1pc3NpbmdVcmlzOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJldHVybiBnbG9iYWxDb250ZXh0LmdldE1pc3NpbmdVcmlzLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0ZHJvcFNjaGVtYXM6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5kcm9wU2NoZW1hcy5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGRlZmluZUtleXdvcmQ6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5kZWZpbmVLZXl3b3JkLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0ZGVmaW5lRXJyb3I6IGZ1bmN0aW9uIChjb2RlTmFtZSwgY29kZU51bWJlciwgZGVmYXVsdE1lc3NhZ2UpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiBjb2RlTmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW0EtWl0rKF9bQS1aXSspKiQvLnRlc3QoY29kZU5hbWUpKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDb2RlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBpbiBVUFBFUl9DQVNFX1dJVEhfVU5ERVJTQ09SRVMnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodHlwZW9mIGNvZGVOdW1iZXIgIT09ICdudW1iZXInIHx8IGNvZGVOdW1iZXIlMSAhPT0gMCB8fCBjb2RlTnVtYmVyIDwgMTAwMDApIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvZGUgbnVtYmVyIG11c3QgYmUgYW4gaW50ZWdlciA+IDEwMDAwJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHR5cGVvZiBFcnJvckNvZGVzW2NvZGVOYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGFscmVhZHkgZGVmaW5lZDogJyArIGNvZGVOYW1lICsgJyBhcyAnICsgRXJyb3JDb2Rlc1tjb2RlTmFtZV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0eXBlb2YgRXJyb3JDb2RlTG9va3VwW2NvZGVOdW1iZXJdICE9PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignRXJyb3IgY29kZSBhbHJlYWR5IHVzZWQ6ICcgKyBFcnJvckNvZGVMb29rdXBbY29kZU51bWJlcl0gKyAnIGFzICcgKyBjb2RlTnVtYmVyKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRFcnJvckNvZGVzW2NvZGVOYW1lXSA9IGNvZGVOdW1iZXI7XHJcblx0XHRcdEVycm9yQ29kZUxvb2t1cFtjb2RlTnVtYmVyXSA9IGNvZGVOYW1lO1xyXG5cdFx0XHRFcnJvck1lc3NhZ2VzRGVmYXVsdFtjb2RlTmFtZV0gPSBFcnJvck1lc3NhZ2VzRGVmYXVsdFtjb2RlTnVtYmVyXSA9IGRlZmF1bHRNZXNzYWdlO1xyXG5cdFx0XHRmb3IgKHZhciBsYW5nQ29kZSBpbiBsYW5ndWFnZXMpIHtcclxuXHRcdFx0XHR2YXIgbGFuZ3VhZ2UgPSBsYW5ndWFnZXNbbGFuZ0NvZGVdO1xyXG5cdFx0XHRcdGlmIChsYW5ndWFnZVtjb2RlTmFtZV0pIHtcclxuXHRcdFx0XHRcdGxhbmd1YWdlW2NvZGVOdW1iZXJdID0gbGFuZ3VhZ2VbY29kZU51bWJlcl0gfHwgbGFuZ3VhZ2VbY29kZU5hbWVdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGdsb2JhbENvbnRleHQucmVzZXQoKTtcclxuXHRcdFx0dGhpcy5lcnJvciA9IG51bGw7XHJcblx0XHRcdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdFx0XHR0aGlzLnZhbGlkID0gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHRtaXNzaW5nOiBbXSxcclxuXHRcdGVycm9yOiBudWxsLFxyXG5cdFx0dmFsaWQ6IHRydWUsXHJcblx0XHRub3JtU2NoZW1hOiBub3JtU2NoZW1hLFxyXG5cdFx0cmVzb2x2ZVVybDogcmVzb2x2ZVVybCxcclxuXHRcdGdldERvY3VtZW50VXJpOiBnZXREb2N1bWVudFVyaSxcclxuXHRcdGVycm9yQ29kZXM6IEVycm9yQ29kZXNcclxuXHR9O1xyXG5cdGFwaS5sYW5ndWFnZShsYW5ndWFnZSB8fCAnZW4nKTtcclxuXHRyZXR1cm4gYXBpO1xyXG59XHJcblxyXG52YXIgdHY0ID0gY3JlYXRlQXBpKCk7XHJcbnR2NC5hZGRMYW5ndWFnZSgnZW4tZ2InLCBFcnJvck1lc3NhZ2VzRGVmYXVsdCk7XHJcblxyXG4vL2xlZ2FjeSBwcm9wZXJ0eVxyXG50djQudHY0ID0gdHY0O1xyXG5cclxucmV0dXJuIHR2NDsgLy8gdXNlZCBieSBfaGVhZGVyLmpzIHRvIGdsb2JhbGlzZS5cclxuXHJcbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///18\n')},22:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/loglevel/lib/loglevel.js\nvar loglevel = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/tv4/tv4.js\nvar tv4 = __webpack_require__(18);\nvar tv4_default = /*#__PURE__*/__webpack_require__.n(tv4);\n\n// CONCATENATED MODULE: ./src/runtime-catalogue/RethinkObject.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the "License");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\nvar RethinkObject_RethinkObject =\n/*#__PURE__*/\nfunction () {\n function RethinkObject() {\n _classCallCheck(this, RethinkObject);\n }\n\n _createClass(RethinkObject, [{\n key: "validate",\n\n /**\r\n * Validates this RethinkObject against the provided schema.\r\n *\r\n * LIMITATIONS: The provided schema cannot contain references to other schemas, since they can\'t be resolved.\r\n * @param schema - schema to validate against\r\n * @returns {boolean} true if valid, false otherwise\r\n */\n value: function validate(schema) {\n // add schema itself so local references work\n tv4_default.a.addSchema(schema.id, schema); // JSON stringify -> parse needed to have proper validation\n\n var result = tv4_default.a.validateMultiple(JSON.parse(JSON.stringify(this)), schema); // delete error stacks to improve logging\n\n result.errors.forEach(function (error) {\n delete error.stack;\n }); // print more details about validation if it fails or schema contains $refs\n\n if (!result.valid || result.missing.length > 0) {\n console.warn("Object validation " + (result.valid ? "succeeded, but schema contained references:" : "failed:"), JSON.stringify(result, null, 2));\n console.log("Object:", JSON.stringify(this, null, 2));\n }\n\n return result.valid;\n }\n }]);\n\n return RethinkObject;\n}();\n/* harmony default export */ var runtime_catalogue_RethinkObject = (RethinkObject_RethinkObject);\n// CONCATENATED MODULE: ./src/runtime-catalogue/CatalogueDataObject.js\nfunction _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction CatalogueDataObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction CatalogueDataObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CatalogueDataObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) CatalogueDataObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) CatalogueDataObject_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the "License");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n/**\r\n * @author alice.cheambe[at]fokus.fraunhofer.de\r\n * The CatalogueDataObject class is the representation of the reTHINK Catalogue Data Model\r\n */\n\nvar CatalogueDataObject =\n/*#__PURE__*/\nfunction (_RethinkObject) {\n _inherits(CatalogueDataObject, _RethinkObject);\n\n /**\r\n * Creates the Catalogue Data Object\r\n * @param guid - Global Unique identifier of the Catalogue Object (e.g. Hyperty descriptor, ProtocolStub descriptor,\r\n * etc) enabling the same object to be stored and discovered in different Catalogues. That means, guid corresponds to\r\n * [resource-type-id] per BNF of Resource Path. Couldn\'t we have problems with too long URL paths?\r\n * @param type - indicates the type of Catalogue Data Object e.g. Hyperty, ProtocolStub, etc\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param objectName - human-understandable name of the catalogue object e.g. "My Awesome Hyperty"\r\n * @param description - description of the source package\r\n * @param language - the programming language used in the SourcePackage.SourceCode\r\n * @param sourcePackageURL - A string containing the URL from where the source code package of the corresponding\r\n * catalogue object, e.g. deployable packages containing executable code for Hyperties or ProtoStubs, can be downloaded\r\n */\n function CatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL) {\n var _this;\n\n CatalogueDataObject_classCallCheck(this, CatalogueDataObject);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(CatalogueDataObject).call(this));\n _this._guid = guid;\n _this._type = type;\n _this._version = version;\n _this._objectName = objectName;\n _this._description = description;\n _this._language = language;\n _this._sourcePackageURL = sourcePackageURL;\n _this._signature = null;\n _this._sourcePackage = null;\n return _this;\n } // Getters\n\n\n CatalogueDataObject_createClass(CatalogueDataObject, [{\n key: "guid",\n get: function get() {\n return this._guid;\n },\n set: function set(guid) {\n if (guid) this._guid = guid;\n }\n }, {\n key: "type",\n get: function get() {\n return this._type;\n },\n set: function set(type) {\n if (type) this._type = type;\n }\n }, {\n key: "version",\n get: function get() {\n return this._version;\n },\n set: function set(version) {\n if (version) {\n this._version = version;\n }\n }\n }, {\n key: "objectName",\n get: function get() {\n return this._objectName;\n },\n set: function set(objectName) {\n if (objectName) this._objectName = objectName;\n }\n }, {\n key: "description",\n get: function get() {\n return this._description;\n },\n set: function set(description) {\n if (description) this._description = description;\n }\n }, {\n key: "language",\n get: function get() {\n return this._language;\n },\n set: function set(language) {\n if (language) this._language = language;\n }\n }, {\n key: "signature",\n get: function get() {\n return this._signature;\n },\n // Setters\n\n /**\r\n * Set the signature to enables integrity and authenticity verification\r\n * @param signature\r\n */\n set: function set(signature) {\n if (signature) this._signature = signature;\n }\n }, {\n key: "sourcePackage",\n get: function get() {\n return this._sourcePackage;\n },\n set: function set(sourcePackage) {\n if (sourcePackage) this._sourcePackage = sourcePackage;\n }\n }, {\n key: "sourcePackageURL",\n get: function get() {\n return this._sourcePackageURL;\n },\n set: function set(sourcePackageURL) {\n if (sourcePackageURL) this._sourcePackageURL = sourcePackageURL;\n }\n }]);\n\n return CatalogueDataObject;\n}(runtime_catalogue_RethinkObject); //Alice: removed POLICY_ENFORCER: \'policy_enforcer\', DATA_SCHEMA: \'data_schema\' from the list\n//wrt: https://github.com/reTHINK-project/dev-service-framework/blob/develop/docs/datamodel/core/hyperty-catalogue/readme.md#data-object-schema\n\n\nvar CatalogueObjectType = {\n HYPERTY: \'hyperty\',\n PROTOSTUB: \'protostub\',\n HYPERTY_RUNTIME: \'hyperty_runtime\',\n HYPERTY_INTERCEPTOR: \'hyperty_inspector\',\n HYPERTY_DATA_OBJECT: \'hyperty_data_object\'\n};\nvar DataObjectSourceLanguage = {\n JAVASCRIPT_ECMA6: \'javascript_ecma6\',\n JAVASCRIPT_ECMA5: \'javascript_ecma5\',\n JSON_SCHEMA_V4: \'json_schema_v4\',\n PYTHON: \'python\',\n TYPESCRIPT: \'typescript\'\n};\n/* harmony default export */ var runtime_catalogue_CatalogueDataObject = (CatalogueDataObject);\n// CONCATENATED MODULE: ./src/runtime-catalogue/SourcePackage.js\nfunction SourcePackage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction SourcePackage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SourcePackage_createClass(Constructor, protoProps, staticProps) { if (protoProps) SourcePackage_defineProperties(Constructor.prototype, protoProps); if (staticProps) SourcePackage_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\nvar SourcePackage =\n/*#__PURE__*/\nfunction () {\n function SourcePackage(sourceCodeClassname, sourceCode) {\n SourcePackage_classCallCheck(this, SourcePackage);\n\n this._sourceCode = sourceCode;\n this._sourceCodeClassname = sourceCodeClassname;\n this._encoding = null;\n this._signature = null;\n }\n\n SourcePackage_createClass(SourcePackage, [{\n key: "sourceCode",\n get: function get() {\n return this._sourceCode;\n },\n set: function set(sourceCode) {\n if (sourceCode) this._sourceCode = sourceCode;\n }\n }, {\n key: "sourceCodeClassname",\n get: function get() {\n return this._sourceCodeClassname;\n },\n set: function set(sourceCodeClassname) {\n if (sourceCodeClassname) this._sourceCodeClassname = sourceCodeClassname;\n }\n }, {\n key: "encoding",\n get: function get() {\n return this._encoding;\n },\n set: function set(encoding) {\n if (encoding) this._encoding = encoding;\n }\n }, {\n key: "signature",\n get: function get() {\n return this._signature;\n },\n set: function set(sign) {\n if (sign) this._signature = sign;\n }\n }]);\n\n return SourcePackage;\n}();\n\n/* harmony default export */ var runtime_catalogue_SourcePackage = (SourcePackage);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyDescriptor.js\nfunction HypertyDescriptor_typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { HypertyDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return HypertyDescriptor_typeof(obj); }\n\nfunction HypertyDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction HypertyDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyDescriptor_typeof(call) === "object" || typeof call === "function")) { return call; } return HypertyDescriptor_assertThisInitialized(self); }\n\nfunction HypertyDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction HypertyDescriptor_getPrototypeOf(o) { HypertyDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyDescriptor_getPrototypeOf(o); }\n\nfunction HypertyDescriptor_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyDescriptor_setPrototypeOf(o, p) { HypertyDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\n\n\nvar HypertyDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyDescriptor_inherits(HypertyDescriptor, _CatalogueDataObject);\n\n /**\r\n *\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object enabling the same object to be\r\n * stored and discovered in different Catalogues. Guid corresponds to per BNF of Resource Path.\r\n * @param {CatalogueObjectType} catalogueType - \tIndicates the type of Catalogue Data Object\r\n * @param {string} version\r\n * @param {string} objectName\r\n * @param {string} description\r\n * @param {string} language\r\n * @param {string} sourcePackageURL\r\n * @param {HypertyResourceType[]} hypertyType A tag that identifies what type of hyperty is described in the object.\r\n * @param {URL.HypertyCatalogueURLList} dataObjectUrls - It defines the Data Object Schemas supported by the Hyperty\r\n * through a list of Catalogue URLs from where these schemas can be reached\r\n */\n function HypertyDescriptor(guid, catalogueType, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjectUrls) {\n var _this;\n\n HypertyDescriptor_classCallCheck(this, HypertyDescriptor);\n\n _this = HypertyDescriptor_possibleConstructorReturn(this, HypertyDescriptor_getPrototypeOf(HypertyDescriptor).call(this, guid, catalogueType, version, objectName, description, language, sourcePackageURL));\n _this._configuration = {};\n _this._constraints = {};\n _this._policies = {};\n _this._messageSchema = null;\n _this._hypertyType = hypertyType;\n _this._dataObjects = dataObjectUrls;\n return _this;\n }\n\n HypertyDescriptor_createClass(HypertyDescriptor, [{\n key: "hypertyType",\n get: function get() {\n return this._hypertyType;\n },\n set: function set(hType) {\n if (hType) this._hypertyType = hType;\n }\n }, {\n key: "dataObjects",\n get: function get() {\n return this._dataObjects;\n },\n set: function set(dataObjects) {\n if (dataObjects) this._dataObjects = dataObjects;\n }\n }, {\n key: "configuration",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n if (configuration) this._configuration = configuration;\n }\n }, {\n key: "constraints",\n get: function get() {\n return this._constraints;\n },\n set: function set(constraints) {\n if (constraints) this._constraints = constraints;\n }\n }, {\n key: "messageSchema",\n get: function get() {\n return this._messageSchema;\n },\n set: function set(messageSchema) {\n if (messageSchema) this._messageSchema = messageSchema;\n }\n }, {\n key: "policies",\n get: function get() {\n return this._policies;\n },\n set: function set(policies) {\n if (policies) this._policies = policies;\n }\n }]);\n\n return HypertyDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\nvar RuntimeHypertyCapabilityType = {};\nvar HypertyType = {\n COMMUNICATOR: \'communicator\',\n IDENTITY: \'identity\',\n CONTEXT: \'context\'\n};\nvar HypertyResourceType = {\n chat: \'CHAT\',\n audio: \'Audio\',\n video: \'Video\',\n av: \'AV\',\n screen: \'SCREEN\',\n file: \'FILe\',\n midi: \'MIDI\'\n};\n/* harmony default export */ var runtime_catalogue_HypertyDescriptor = (HypertyDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/ProtocolStubDescriptor.js\nfunction ProtocolStubDescriptor_typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ProtocolStubDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { ProtocolStubDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ProtocolStubDescriptor_typeof(obj); }\n\nfunction ProtocolStubDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction ProtocolStubDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ProtocolStubDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) ProtocolStubDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) ProtocolStubDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction ProtocolStubDescriptor_possibleConstructorReturn(self, call) { if (call && (ProtocolStubDescriptor_typeof(call) === "object" || typeof call === "function")) { return call; } return ProtocolStubDescriptor_assertThisInitialized(self); }\n\nfunction ProtocolStubDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction ProtocolStubDescriptor_getPrototypeOf(o) { ProtocolStubDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ProtocolStubDescriptor_getPrototypeOf(o); }\n\nfunction ProtocolStubDescriptor_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ProtocolStubDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction ProtocolStubDescriptor_setPrototypeOf(o, p) { ProtocolStubDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ProtocolStubDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the "License");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\n\n\nvar ProtocolStubDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n ProtocolStubDescriptor_inherits(ProtocolStubDescriptor, _CatalogueDataObject);\n\n function ProtocolStubDescriptor(guid, type, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication) {\n var _this;\n\n ProtocolStubDescriptor_classCallCheck(this, ProtocolStubDescriptor);\n\n _this = ProtocolStubDescriptor_possibleConstructorReturn(this, ProtocolStubDescriptor_getPrototypeOf(ProtocolStubDescriptor).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._messageSchemas = messageSchemas;\n if (configuration) _this._configuration = configuration;else _this._configuration = {};\n if (constraints) _this._constraints = constraints;else _this._constraints = {};\n _this._hypertyType = hypertyType;\n if (dataObjects) _this._dataObjects = dataObjects;else _this._dataObjects = [];\n _this._interworking = interworking;\n _this._idpProxy = idpProxy;\n _this._mutualAuthentication = mutualAuthentication;\n return _this;\n }\n\n ProtocolStubDescriptor_createClass(ProtocolStubDescriptor, [{\n key: "messageSchemas",\n get: function get() {\n return this._messageSchemas;\n },\n set: function set(messageSchemas) {\n if (messageSchemas) this._messageSchemas = messageSchemas;\n }\n }, {\n key: "constraints",\n get: function get() {\n return this._constraints;\n },\n set: function set(constraints) {\n if (constraints) this._constraints = constraints;\n }\n }, {\n key: "configuration",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n if (configuration) this._configuration = configuration;\n }\n }, {\n key: "hypertyType",\n get: function get() {\n return this._hypertyType;\n },\n set: function set(value) {\n this._hypertyType = value;\n }\n }, {\n key: "dataObjects",\n get: function get() {\n return this._dataObjects;\n },\n set: function set(value) {\n this._dataObjects = value;\n }\n }, {\n key: "interworking",\n get: function get() {\n return this._interworking;\n },\n set: function set(value) {\n this._interworking = value;\n }\n }, {\n key: "idpProxy",\n get: function get() {\n return this._idpProxy;\n },\n set: function set(value) {\n this._idpProxy = value;\n }\n }, {\n key: "mutualAuthentication",\n get: function get() {\n return this._mutualAuthentication;\n },\n set: function set(value) {\n this._mutualAuthentication = value;\n }\n }]);\n\n return ProtocolStubDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\n/* harmony default export */ var runtime_catalogue_ProtocolStubDescriptor = (ProtocolStubDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyRuntimeDescriptor.js\nfunction HypertyRuntimeDescriptor_typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { HypertyRuntimeDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyRuntimeDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return HypertyRuntimeDescriptor_typeof(obj); }\n\nfunction HypertyRuntimeDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction HypertyRuntimeDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyRuntimeDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyRuntimeDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyRuntimeDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyRuntimeDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyRuntimeDescriptor_typeof(call) === "object" || typeof call === "function")) { return call; } return HypertyRuntimeDescriptor_assertThisInitialized(self); }\n\nfunction HypertyRuntimeDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction HypertyRuntimeDescriptor_getPrototypeOf(o) { HypertyRuntimeDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyRuntimeDescriptor_getPrototypeOf(o); }\n\nfunction HypertyRuntimeDescriptor_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyRuntimeDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyRuntimeDescriptor_setPrototypeOf(o, p) { HypertyRuntimeDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyRuntimeDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the "License");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\n\n\nvar HypertyRuntimeDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyRuntimeDescriptor_inherits(HypertyRuntimeDescriptor, _CatalogueDataObject);\n\n function HypertyRuntimeDescriptor(guid, catalogueType, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub) {\n var _this;\n\n HypertyRuntimeDescriptor_classCallCheck(this, HypertyRuntimeDescriptor);\n\n _this = HypertyRuntimeDescriptor_possibleConstructorReturn(this, HypertyRuntimeDescriptor_getPrototypeOf(HypertyRuntimeDescriptor).call(this, guid, catalogueType, version, objectName, description, language, sourcePackageURL));\n _this._runtimeType = runtimeType;\n if (hypertyCapabilities) _this._hypertyCapabilities = hypertyCapabilities;else _this._hypertyCapabilities = new RuntimeHypertyCapability(true, false, false, false, false);\n if (protocolCapabilities) _this._protocolCapabilities = protocolCapabilities;else _this._protocolCapabilities = new RuntimeProtocolCapability(true, false, true, false, false, false);\n _this._p2pHandlerStub = p2pHandlerStub;\n _this._p2pRequesterStub = p2pRequesterStub;\n return _this;\n }\n\n HypertyRuntimeDescriptor_createClass(HypertyRuntimeDescriptor, [{\n key: "runtimeType",\n get: function get() {\n return this._runtimeType;\n },\n set: function set(runtimeType) {\n if (runtimeType) this._runtimeType = runtimeType;\n }\n }, {\n key: "hypertyCapabilities",\n get: function get() {\n return this._hypertyCapabilities;\n },\n set: function set(hypertyCapabilities) {\n if (hypertyCapabilities) this._hypertyCapabilities = hypertyCapabilities;\n }\n }, {\n key: "protocolCapabilities",\n get: function get() {\n return this._hypertyCapabilities;\n },\n set: function set(protocolCapabilities) {\n if (protocolCapabilities) this._protocolCapabilities = protocolCapabilities;\n }\n }, {\n key: "p2pHandlerStub",\n get: function get() {\n return this._p2pHandlerStub;\n },\n set: function set(value) {\n this._p2pHandlerStub = value;\n }\n }, {\n key: "p2pRequesterStub",\n get: function get() {\n return this._p2pRequesterStub;\n },\n set: function set(value) {\n this._p2pRequesterStub = value;\n }\n }]);\n\n return HypertyRuntimeDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n/**\r\n * A class representation of the capability set of the Runtime Hyperty\r\n */\n\n\nvar RuntimeHypertyCapability =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates an object of the Runtime Hyperty capability set\r\n * @param {boolean} isWebRTCSupported\r\n * @param {boolean} isMicSupported\r\n * @param {boolean} isCameraSupported\r\n * @param {boolean} isSensorSupported\r\n * @param {boolean} isORTCSupported\r\n */\n function RuntimeHypertyCapability(isWebRTCSupported, isMicSupported, isCameraSupported, isSensorSupported, isORTCSupported) {\n HypertyRuntimeDescriptor_classCallCheck(this, RuntimeHypertyCapability);\n\n this._isWebRTC = isWebRTCSupported;\n this._isMic = isMicSupported;\n this._isCamera = isCameraSupported;\n this._isSensor = isSensorSupported;\n this._isORTC = isORTCSupported;\n }\n\n HypertyRuntimeDescriptor_createClass(RuntimeHypertyCapability, [{\n key: "getCapabilitySet",\n value: function getCapabilitySet() {\n return JSON.stringify(this);\n }\n }, {\n key: "isMic",\n get: function get() {\n return this._isMic;\n }\n }, {\n key: "isCamera",\n get: function get() {\n return this._isCamera;\n }\n }, {\n key: "isSensor",\n get: function get() {\n return this._isSensor;\n }\n }, {\n key: "isWebRTC",\n get: function get() {\n return this._isWebRTC;\n }\n }, {\n key: "isORTCS",\n get: function get() {\n return this._isORTC;\n }\n }]);\n\n return RuntimeHypertyCapability;\n}();\n/**\r\n * A class representation of the protocol capability set of the Runtime Hyperty\r\n */\n\nvar RuntimeProtocolCapability =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates an object of the runtime protocol capability\r\n * @param {boolean} isHttp\r\n * @param {boolean} isHttps\r\n * @param {boolean} isWS\r\n * @param {boolean} isWSS\r\n * @param {boolean} isCoap\r\n * @param {boolean} isDataChannel\r\n */\n function RuntimeProtocolCapability(isHttp, isHttps, isWS, isWSS, isCoap, isDataChannel) {\n HypertyRuntimeDescriptor_classCallCheck(this, RuntimeProtocolCapability);\n\n this._isHttp = isHttp;\n this._isHttps = isHttps;\n this._isWS = isWS;\n this._isWSS = isWSS;\n this._isCoap = isCoap;\n this._isDataChannel = isDataChannel;\n }\n\n HypertyRuntimeDescriptor_createClass(RuntimeProtocolCapability, [{\n key: "isHttp",\n value: function isHttp() {\n return this._isHttp;\n }\n }, {\n key: "isHttps",\n value: function isHttps() {\n return this._isHttps;\n }\n }, {\n key: "isWS",\n value: function isWS() {\n return this._isWS;\n }\n }, {\n key: "isSensorSupported",\n value: function isSensorSupported() {\n return this._isSensor;\n }\n }, {\n key: "isWSS",\n value: function isWSS() {\n return this._isWSS;\n }\n }, {\n key: "isCoap",\n value: function isCoap() {\n return this._isCoap;\n }\n }, {\n key: "isDataChannel",\n value: function isDataChannel() {\n return this._isDataChannel;\n }\n }, {\n key: "getCapabilitySet",\n value: function getCapabilitySet() {\n return JSON.stringify(this);\n }\n }]);\n\n return RuntimeProtocolCapability;\n}();\nvar RuntimeType = {\n BROWSER: \'browser\',\n STANDALONE: \'standalone\',\n SERVER: \'server\',\n GATEWAY: \'gateway\'\n};\n/* harmony default export */ var runtime_catalogue_HypertyRuntimeDescriptor = (HypertyRuntimeDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyInterceptorDescriptor.js\nfunction HypertyInterceptorDescriptor_typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { HypertyInterceptorDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyInterceptorDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return HypertyInterceptorDescriptor_typeof(obj); }\n\nfunction HypertyInterceptorDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction HypertyInterceptorDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyInterceptorDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyInterceptorDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyInterceptorDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyInterceptorDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyInterceptorDescriptor_typeof(call) === "object" || typeof call === "function")) { return call; } return HypertyInterceptorDescriptor_assertThisInitialized(self); }\n\nfunction HypertyInterceptorDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction HypertyInterceptorDescriptor_getPrototypeOf(o) { HypertyInterceptorDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyInterceptorDescriptor_getPrototypeOf(o); }\n\nfunction HypertyInterceptorDescriptor_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyInterceptorDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyInterceptorDescriptor_setPrototypeOf(o, p) { HypertyInterceptorDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyInterceptorDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by pzu on 19.11.15.\r\n */\n\n\nvar PolicyEnforcerDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyInterceptorDescriptor_inherits(PolicyEnforcerDescriptor, _CatalogueDataObject);\n\n function PolicyEnforcerDescriptor(guid, type, version, objectName, description, language, sourcePackageURL, configuration, policies) {\n var _this;\n\n HypertyInterceptorDescriptor_classCallCheck(this, PolicyEnforcerDescriptor);\n\n _this = HypertyInterceptorDescriptor_possibleConstructorReturn(this, HypertyInterceptorDescriptor_getPrototypeOf(PolicyEnforcerDescriptor).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._configuration = configuration;\n _this._policies = policies;\n return _this;\n }\n\n HypertyInterceptorDescriptor_createClass(PolicyEnforcerDescriptor, [{\n key: "configuration",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n this._configuration = configuration;\n }\n }, {\n key: "policies",\n get: function get() {\n return this._policies;\n },\n set: function set(policies) {\n this._policies = policies;\n }\n }]);\n\n return PolicyEnforcerDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\n/* harmony default export */ var HypertyInterceptorDescriptor = (PolicyEnforcerDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/DataObjectSchema.js\nfunction DataObjectSchema_typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { DataObjectSchema_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectSchema_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return DataObjectSchema_typeof(obj); }\n\nfunction DataObjectSchema_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction DataObjectSchema_possibleConstructorReturn(self, call) { if (call && (DataObjectSchema_typeof(call) === "object" || typeof call === "function")) { return call; } return DataObjectSchema_assertThisInitialized(self); }\n\nfunction DataObjectSchema_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction DataObjectSchema_getPrototypeOf(o) { DataObjectSchema_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataObjectSchema_getPrototypeOf(o); }\n\nfunction DataObjectSchema_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DataObjectSchema_setPrototypeOf(subClass, superClass); }\n\nfunction DataObjectSchema_setPrototypeOf(o, p) { DataObjectSchema_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataObjectSchema_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by pzu on 19.11.15.\r\n */\n\nvar DataObjectSchema =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n DataObjectSchema_inherits(DataObjectSchema, _CatalogueDataObject);\n\n function DataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL) {\n DataObjectSchema_classCallCheck(this, DataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(DataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n }\n\n return DataObjectSchema;\n}(runtime_catalogue_CatalogueDataObject); //Children\n\nvar MessageDataObjectSchema =\n/*#__PURE__*/\nfunction (_DataObjectSchema) {\n DataObjectSchema_inherits(MessageDataObjectSchema, _DataObjectSchema);\n\n function MessageDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL) {\n DataObjectSchema_classCallCheck(this, MessageDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(MessageDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n }\n\n return MessageDataObjectSchema;\n}(DataObjectSchema);\nvar HypertyDataObjectSchema =\n/*#__PURE__*/\nfunction (_DataObjectSchema2) {\n DataObjectSchema_inherits(HypertyDataObjectSchema, _DataObjectSchema2);\n\n function HypertyDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy, dataUrlScheme) {\n var _this;\n\n DataObjectSchema_classCallCheck(this, HypertyDataObjectSchema);\n\n _this = DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(HypertyDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._accessControlPolicy = accessControlPolicy;\n _this._scheme = dataUrlScheme;\n return _this;\n }\n\n return HypertyDataObjectSchema;\n}(DataObjectSchema); //Children\n\nvar CommunicationDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch) {\n DataObjectSchema_inherits(CommunicationDataObjectSchema, _HypertyDataObjectSch);\n\n function CommunicationDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, CommunicationDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(CommunicationDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return CommunicationDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar ConnectionDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch2) {\n DataObjectSchema_inherits(ConnectionDataObjectSchema, _HypertyDataObjectSch2);\n\n function ConnectionDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, ConnectionDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(ConnectionDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return ConnectionDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar IdentityDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch3) {\n DataObjectSchema_inherits(IdentityDataObjectSchema, _HypertyDataObjectSch3);\n\n function IdentityDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, IdentityDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(IdentityDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return IdentityDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar ContextDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch4) {\n DataObjectSchema_inherits(ContextDataObjectSchema, _HypertyDataObjectSch4);\n\n function ContextDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, ContextDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(ContextDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return ContextDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar DataUrlScheme = {\n COMM: \'COMM\',\n CONNECTION: \'CONNECTION\',\n CTXT: \'CTXT\',\n IDENTITY: \'IDENTITY\'\n};\n/* harmony default export */ var runtime_catalogue_DataObjectSchema = (DataObjectSchema);\n// CONCATENATED MODULE: ./src/runtime-catalogue/CatalogueDataObjectFactory.js\nfunction CatalogueDataObjectFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction CatalogueDataObjectFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CatalogueDataObjectFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) CatalogueDataObjectFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) CatalogueDataObjectFactory_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the "License");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n\n\n\n\n\n\n\nvar CatalogueDataObjectFactory_CatalogueDataObjectFactory =\n/*#__PURE__*/\nfunction () {\n function CatalogueDataObjectFactory() {\n CatalogueDataObjectFactory_classCallCheck(this, CatalogueDataObjectFactory);\n }\n\n CatalogueDataObjectFactory_createClass(CatalogueDataObjectFactory, [{\n key: "createCatalogueDataObject",\n\n /**\r\n * Create CatalogueDataObject\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {CatalogueObjectType} type - Indicates the type of Catalogue Data Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @returns {CatalogueDataObject}\r\n */\n value: function createCatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === "undefined" || typeof type === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined") throw new Error("Invalid parameters!");\n return new runtime_catalogue_CatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL);\n }\n /**\r\n * Create HypertyDescriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object\r\n * can be downloaded.\r\n * @param {HypertyResourceType[]} hypertyType - An array of HypertyResourceType that identifies what type of hyperty\r\n * resources are handled by the object.\r\n * @param {URL.URLList} dataObjects - Defines the Data Object Schemas supported by the Hyperty through a list of Catalogue URLs from where these schemas can be reached.\r\n * @returns {HypertyDescriptor}\r\n */\n\n }, {\n key: "createHypertyDescriptorObject",\n value: function createHypertyDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjects) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined" || typeof hypertyType === "undefined" || typeof dataObjects === "undefined") throw new Error("Invalid parameters!");\n return new runtime_catalogue_HypertyDescriptor(guid, CatalogueObjectType.HYPERTY, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjects);\n }\n /**\r\n * Create ProtocolStubDescriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param {URL.URL} messageSchemas - Defines the Schema describing the Message Data Model used by the Hyperty through the Catalogue URL from where the Message schema can be reached. If not defined, by default it is assumed the standard Message Model is used.\r\n * @param configuration - Data required to configure the ProtocolStub\r\n * @param constraints - Describes capabilities required from the Hyperty Runtime in order to be able to execute the ProtocolStub\r\n * @param hypertyType\r\n * @param dataObjects\r\n * @param interworking\r\n * @param idpProxy\r\n * @param mutualAuthentication\r\n * @returns {ProtocolStubDescriptor}\r\n */\n\n }, {\n key: "createProtoStubDescriptorObject",\n value: function createProtoStubDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined" || typeof messageSchemas === "undefined" || typeof configuration === "undefined" || typeof constraints === "undefined") throw new Error("Invalid parameters!");\n return new runtime_catalogue_ProtocolStubDescriptor(guid, CatalogueObjectType.PROTOSTUB, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication);\n }\n /**\r\n * Create HypertyRuntimeDescriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param {RuntimeType}runtimeType\r\n * @param {RuntimeHypertyCapabilities} hypertyCapabilities - Supported capabilities to execute Hyperties\r\n * @param {RuntimeProtocolCapabilities} protocolCapabilities - Supported capabilities to execute Protocol Stubs\r\n * @param p2pHandlerStub\r\n * @param p2pRequesterStub\r\n * @returns {HypertyRuntimeDescriptor} the data object of the Hyperty Runtime Descriptor\r\n */\n\n }, {\n key: "createHypertyRuntimeDescriptorObject",\n value: function createHypertyRuntimeDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined" || typeof runtimeType === "undefined") throw new Error("Invalid parameters!");\n return new runtime_catalogue_HypertyRuntimeDescriptor(guid, CatalogueObjectType.HYPERTY_RUNTIME, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub);\n }\n /**\r\n * Create Hyperty Interceptor Descriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param configuration\r\n * @param policies\r\n * @returns {PolicyEnforcerDescriptor}\r\n */\n\n }, {\n key: "createHypertyInterceptorDescriptorObject",\n value: function createHypertyInterceptorDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, configuration, policies) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined") throw new Error("Invalid parameters!");\n return new HypertyInterceptorDescriptor(guid, CatalogueObjectType.HYPERTY_INTERCEPTOR, version, objectName, description, language, sourcePackageURL, configuration, policies);\n }\n /**\r\n * Create DataObjectSchema which in effect is the MessageDataObjectSchema\r\n * @deprecated Use either createMessageDataObjectSchema or createHypertyDataObjectSchema instead\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: "createDataObjectSchema",\n value: function createDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined") throw new Error("Invalid parameters!");\n return new DataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL);\n }\n /**\r\n * Create DataObjectSchema which in effect is the MessageDataObjectSchema\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: "createMessageDataObjectSchema",\n value: function createMessageDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined") throw new Error("Invalid parameters!");\n return new DataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL);\n }\n /**\r\n * Create HypertyDataObjectSchema\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param {string} accessControlPolicy - policy rule to access object (see Reporter-Observer Comm pattern)\r\n * @param {DataUrlScheme} scheme - identifies the data scheme (COMM, CONNECTION, CTXT or IDENTITY)\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: "createHypertyDataObjectSchema",\n value: function createHypertyDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL, accessControlPolicy, scheme) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined" || typeof scheme === "undefined" || typeof accessControlPolicy === "undefined") throw new Error("Invalid parameters!");\n if (scheme === DataUrlScheme.COMM) return new CommunicationDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.CONNECTION) return new ConnectionDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.CTXT) return new ContextDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.IDENTITY) return new IdentityDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);\n }\n /**\r\n * Create SourcePackage\r\n * @param sourceCodeClassname - The Class-name of the SourceCode\r\n * @param sourceCode - The source code of the catalogue object\r\n * @returns {SourcePackage}\r\n */\n\n }, {\n key: "createSourcePackage",\n value: function createSourcePackage(sourceCodeClassname, sourceCode) {\n if (typeof sourceCode === "undefined" || typeof sourceCodeClassname === "undefined") throw new Error("Invalid parameters!");\n return new runtime_catalogue_SourcePackage(sourceCodeClassname, sourceCode);\n }\n }]);\n\n return CatalogueDataObjectFactory;\n}();\n\n/* harmony default export */ var runtime_catalogue_CatalogueDataObjectFactory = (CatalogueDataObjectFactory_CatalogueDataObjectFactory);\n// CONCATENATED MODULE: ./src/runtime-catalogue/RuntimeCatalogue.js\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction RuntimeCatalogue_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction RuntimeCatalogue_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RuntimeCatalogue_createClass(Constructor, protoProps, staticProps) { if (protoProps) RuntimeCatalogue_defineProperties(Constructor.prototype, protoProps); if (staticProps) RuntimeCatalogue_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar log = loglevel["getLogger"](\'RuntimeCatalogue\');\n\n\nvar RuntimeCatalogue_RuntimeCatalogue =\n/*#__PURE__*/\nfunction () {\n function RuntimeCatalogue(runtimeFactory, name, schema) {\n RuntimeCatalogue_classCallCheck(this, RuntimeCatalogue);\n\n if (!runtimeFactory) throw Error(\'The catalogue needs the runtimeFactory\');\n this._factory = new runtime_catalogue_CatalogueDataObjectFactory();\n this.httpRequest = runtimeFactory.createHttpRequest();\n this.atob = runtimeFactory.atob ? runtimeFactory.atob : atob;\n var storageName = name ? name : \'runtimeCatalogue\';\n var storageSchema = schema ? schema : \'&cguid, accessControlPolicy, constraints, dataObjects, hypertyType, objectName, sourcePackage, version\';\n var schemas = {};\n schemas[storageName] = storageSchema;\n this.storageManager = runtimeFactory.storageManager(storageName, schemas);\n }\n /**\r\n * Get a Catalogue Data Object (Descriptor) from a URL, and construct it using the provided function\r\n * @param {String} descriptorURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty\r\n * @param {function} createFunc - e.g. createHyperty\r\n * @param {boolean} [getFull] - whether or not to get descriptor with sourcePackage, or only the descriptor part\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise} - Promise that fulfills with the requested descriptor in the appropriate type.\r\n * If constraints were provided, a descriptor is only returned if it meets the constraints, otherwise the promise will be rejected.\r\n */\n\n\n RuntimeCatalogue_createClass(RuntimeCatalogue, [{\n key: "getDescriptor",\n value: function getDescriptor(descriptorURL, createFunc) {\n var _this = this;\n\n var getFull = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n var constraints = arguments.length > 3 ? arguments[3] : undefined;\n log.info(\'[RuntimeCatalogue] - getting descriptor from: \', descriptorURL, \' with constraints: \', constraints); // some flags for optimization\n // (later the descriptor will not be saved in case both of these booleans are true)\n\n var isSavedDescriptor = false;\n var isCompleteDescriptor = false; // get raw descriptor\n // first checks if descriptor is already in localStorage (based on cguid and version)\n\n var descriptorPromise;\n\n if (constraints != undefined) {\n descriptorPromise = Promise.all([this.httpRequest.post(descriptorURL + \'/version\', {\n body: JSON.stringify(constraints)\n }), this.httpRequest.post(descriptorURL + \'/cguid\', {\n body: JSON.stringify(constraints)\n })]);\n } else {\n descriptorPromise = Promise.all([this.httpRequest.get(descriptorURL + \'/version\'), this.httpRequest.get(descriptorURL + \'/cguid\')]);\n }\n\n descriptorPromise = descriptorPromise.then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n version = _ref2[0],\n cguid = _ref2[1];\n\n log.log(\'[RuntimeCatalogue.getDescriptor] - got version (\' + version + \') and cguid (\' + cguid + \') for descriptor \' + descriptorURL); // check if same version is contained in localStorage\n\n return _this.storageManager.getVersion(\'cguid\', cguid).then(function (dbVersion) {\n if (dbVersion >= version) {\n log.log(\'[RuntimeCatalogue.getDescriptor] local version is updated for \', descriptorURL);\n isSavedDescriptor = true;\n return _this.storageManager.get(\'cguid\', cguid);\n } else {\n log.log(\'[RuntimeCatalogue.getDescriptor] local version not updated for \', descriptorURL, \' retrieving from remote catalogue ...\'); // no saved copy, proceed with retrieving descriptor\n\n var retrievePromise = constraints != undefined ? _this.httpRequest.post(descriptorURL, {\n body: JSON.stringify(constraints)\n }) : _this.httpRequest.get(descriptorURL);\n return retrievePromise.then(function (descriptor) {\n descriptor = JSON.parse(descriptor); //log.log("got descriptor:", JSON.stringify(descriptor, null, 2));\n\n if (descriptor[\'ERROR\']) {\n // TODO handle error properly\n throw new Error(descriptor);\n } else {\n return descriptor;\n }\n });\n }\n });\n }).catch(function (error) {\n var errorString = \'Unable to get descriptor for \' + descriptorURL + (constraints != undefined ? \' with constraints \' + constraints : \'\') + \': \' + error;\n log.error(errorString);\n throw new Error(errorString);\n });\n var returnPromise = descriptorPromise; // if getFull, attach sourcePackage\n\n if (getFull) {\n log.log(\'adding promise to attach sourcePackage\');\n returnPromise = descriptorPromise.then(function (descriptor) {\n if (descriptor.sourcePackage) {\n isCompleteDescriptor = true;\n return descriptor;\n } else {\n isCompleteDescriptor = false;\n return _this.attachRawSourcePackage(descriptor);\n }\n });\n } // finally create object\n\n\n returnPromise = returnPromise.then(function (descriptor) {\n // store if not saved before, or if full descriptor was requested and only partial descriptor was stored.\n if (!isSavedDescriptor || isSavedDescriptor && !isCompleteDescriptor && getFull) {\n _this.storageManager.set(descriptor.cguid, descriptor.version, descriptor);\n }\n\n return createFunc.apply(_this, [descriptor, constraints]);\n });\n return returnPromise;\n }\n /**\r\n * Uses the sourcePackageURL from the descriptor, requests the sourcePackage and attaches it to the descriptor.\r\n * @param {CatalogueDataObject} descriptor\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise} - fulfills with complete descriptor\r\n */\n\n }, {\n key: "attachRawSourcePackage",\n value: function attachRawSourcePackage(descriptor, constraints) {\n var _this2 = this;\n\n log.log(\'attaching raw sourcePackage from:\', descriptor.sourcePackageURL);\n return new Promise(function (resolve, reject) {\n var retrievePromise = constraints != undefined ? _this2.httpRequest.post(descriptor.sourcePackageURL, {\n body: JSON.stringify(constraints)\n }) : _this2.httpRequest.get(descriptor.sourcePackageURL);\n retrievePromise.then(function (sourcePackage) {\n sourcePackage = JSON.parse(sourcePackage); //delete descriptor.sourcePackageURL;\n //log.log("attaching sourcePackage:", sourcePackage);\n\n descriptor.sourcePackage = sourcePackage;\n resolve(descriptor);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n /**\r\n * Get HypertyDescriptor\r\n * @param hypertyURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getHypertyDescriptor",\n value: function getHypertyDescriptor(hypertyURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(hypertyURL, this.createHyperty, getFull, constraints);\n }\n /**\r\n * Get StubDescriptor\r\n * @param stubURL - e.g. mydomain.com/.well-known/protostub/MyProtostub\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getStubDescriptor",\n value: function getStubDescriptor(stubURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(stubURL, this.createStub, getFull, constraints);\n }\n /**\r\n * Get RuntimeDescriptor\r\n * @param runtimeURL - e.g. mydomain.com/.well-known/runtime/MyRuntime\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getRuntimeDescriptor",\n value: function getRuntimeDescriptor(runtimeURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(runtimeURL, this.createRuntimeDescriptor, getFull, constraints);\n }\n /**\r\n * Get DataSchemaDescriptor\r\n * @param dataSchemaURL - e.g. mydomain.com/.well-known/dataschema/MyDataSchema\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getDataSchemaDescriptor",\n value: function getDataSchemaDescriptor(dataSchemaURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n // return this.getDescriptor(dataSchemaURL, this.createDataSchema, getFull, constraints)\n return new Promise(function (resolve) {\n var schema = dataSchemaURL.split(\'/dataschema/\')[1];\n log.log(\'[RuntimeCatalogue.getDataSchemaDescriptor] schema \', schema);\n var descriptor = {\n sourcePackage: {\n sourceCode: {\n properties: {}\n }\n }\n }; // let scheme = properties.scheme ? properties.scheme.co : [];\n\n switch (schema) {\n case \'Context\':\n case \'ContextReporter\':\n case \'ContextObserver\':\n descriptor.sourcePackage.sourceCode.properties.scheme = \'context\';\n break;\n\n case \'Connection\':\n descriptor.sourcePackage.sourceCode.properties.scheme = \'connection\';\n break;\n\n case \'WalletData\':\n descriptor.sourcePackage.sourceCode.properties.scheme = \'walletData\';\n break;\n\n case \'Communication\':\n descriptor.sourcePackage.sourceCode.properties.scheme = \'comm\';\n descriptor.sourcePackage.sourceCode.properties.childrens = [\'resources\'];\n break;\n\n case \'HelloWorldDataSchema\':\n descriptor.sourcePackage.sourceCode.properties.scheme = \'hello\';\n break;\n\n default:\n descriptor.sourcePackage.sourceCode.properties.scheme = \'resource\';\n descriptor.sourcePackage.sourceCode.properties.childrens = [];\n break;\n }\n\n resolve(descriptor);\n });\n }\n /**\r\n * Get IDPProxyDescriptor\r\n * @param idpProxyURL - e.g. mydomain.com/.well-known/idp-proxy/MyProxy\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getIdpProxyDescriptor",\n value: function getIdpProxyDescriptor(idpProxyURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(idpProxyURL, this.createIdpProxy, getFull, constraints);\n }\n /**\r\n * Create HypertyDescriptor based on raw object that contains its attributes\r\n * @param {JSON} rawHyperty\r\n * @returns {HypertyDescriptor}\r\n */\n\n }, {\n key: "createHyperty",\n value: function createHyperty(rawHyperty) {\n //log.log("createHyperty:", rawHyperty);\n // create the descriptor\n var hyperty = this._factory.createHypertyDescriptorObject(rawHyperty[\'cguid\'], rawHyperty[\'version\'], rawHyperty[\'objectName\'], rawHyperty[\'description\'], rawHyperty[\'language\'], rawHyperty[\'sourcePackageURL\'], rawHyperty[\'type\'] || rawHyperty[\'hypertyType\'], rawHyperty[\'dataObjects\']); //log.log("factory returned:", hyperty);\n // optional fields\n\n\n hyperty.configuration = rawHyperty[\'configuration\'];\n hyperty.constraints = rawHyperty[\'constraints\'];\n hyperty.messageSchema = rawHyperty[\'messageSchema\'];\n hyperty.policies = rawHyperty[\'policies\'];\n hyperty.signature = rawHyperty[\'signature\']; // parse and attach sourcePackage\n\n var sourcePackage = rawHyperty[\'sourcePackage\'];\n\n if (sourcePackage) {\n hyperty.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return hyperty;\n }\n /**\r\n * Create ProtocolStubDescriptor based on raw object that contains its attributes\r\n * @param rawStub\r\n * @returns {ProtocolStubDescriptor}\r\n */\n\n }, {\n key: "createStub",\n value: function createStub(rawStub) {\n // log.log("creating stub descriptor based on: ", rawStub);\n // create the descriptor\n var stub = this._factory.createProtoStubDescriptorObject(rawStub[\'cguid\'], rawStub[\'version\'], rawStub[\'objectName\'], rawStub[\'description\'], rawStub[\'language\'], rawStub[\'sourcePackageURL\'], rawStub[\'messageSchemas\'], rawStub[\'configuration\'], rawStub[\'constraints\'], rawStub[\'hypertyType\'], rawStub[\'dataObjects\'], rawStub[\'interworking\'], rawStub[\'idpProxy\'], rawStub[\'mutualAuthentication\']); // optional fields\n\n\n stub.signature = rawStub[\'signature\']; // parse and attach the sourcePackage\n\n var sourcePackage = rawStub[\'sourcePackage\'];\n\n if (sourcePackage) {\n stub.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return stub;\n }\n /**\r\n * Create HypertyRuntimeDescriptor based on raw object that contains its attributes\r\n * @param rawRuntime\r\n * @returns {HypertyRuntimeDescriptor}\r\n */\n\n }, {\n key: "createRuntimeDescriptor",\n value: function createRuntimeDescriptor(rawRuntime) {\n // parse capabilities first\n try {\n rawRuntime[\'hypertyCapabilities\'] = JSON.parse(rawRuntime[\'hypertyCapabilities\']);\n rawRuntime[\'protocolCapabilities\'] = JSON.parse(rawRuntime[\'protocolCapabilities\']);\n } catch (e) {} // already json object\n //log.log("creating runtime descriptor based on: ", rawRuntime);\n // create the descriptor\n\n\n var runtime = this._factory.createHypertyRuntimeDescriptorObject(rawRuntime[\'cguid\'], rawRuntime[\'version\'], rawRuntime[\'objectName\'], rawRuntime[\'description\'], rawRuntime[\'language\'], rawRuntime[\'sourcePackageURL\'], rawRuntime[\'type\'] || rawRuntime[\'runtimeType\'], rawRuntime[\'hypertyCapabilities\'], rawRuntime[\'protocolCapabilities\'], rawRuntime[\'p2pHandlerStub\'], rawRuntime[\'p2pRequesterStub\']); // optional fields\n\n\n runtime.signature = rawRuntime[\'signature\']; // parse and attach sourcePackage\n\n var sourcePackage = rawRuntime[\'sourcePackage\'];\n\n if (sourcePackage) {\n // log.log("runtime has sourcePackage:", sourcePackage);\n runtime.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return runtime;\n }\n /**\r\n * Create DataObjectSchema based on raw object that contains its attributes\r\n * @param rawSchema\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: "createDataSchema",\n value: function createDataSchema(rawSchema) {\n //log.log("creating dataSchema based on: ", rawSchema);\n var dataSchema; //log.log(\'1. createMessageDataObjectSchema: \', rawSchema["accessControlPolicy"]);\n //log.log(\'2. createMessageDataObjectSchema: \', rawSchema["scheme"]);\n\n if (rawSchema[\'accessControlPolicy\'] && rawSchema[\'scheme\']) {\n dataSchema = this._factory.createHypertyDataObjectSchema(rawSchema[\'cguid\'], rawSchema[\'version\'], rawSchema[\'objectName\'], rawSchema[\'description\'], rawSchema[\'language\'], rawSchema[\'sourcePackageURL\'], rawSchema[\'accessControlPolicy\'], rawSchema[\'scheme\']);\n } else {\n //log.log(\'3. createMessageDataObjectSchema: \', rawSchema);\n dataSchema = this._factory.createMessageDataObjectSchema(rawSchema[\'cguid\'], rawSchema[\'version\'], rawSchema[\'objectName\'], rawSchema[\'description\'], rawSchema[\'language\'], rawSchema[\'sourcePackageURL\']);\n } // optional fields\n\n\n dataSchema.signature = rawSchema[\'signature\']; // parse and attach sourcePackage\n\n var sourcePackage = rawSchema[\'sourcePackage\'];\n\n if (sourcePackage) {\n //log.log("dataSchema has sourcePackage:", sourcePackage);\n dataSchema.sourcePackage = this.createSourcePackage(sourcePackage);\n\n try {\n dataSchema.sourcePackage.sourceCode = JSON.parse(dataSchema.sourcePackage.sourceCode);\n } catch (e) {\n log.log(\'DataSchema Source code is already parsed\');\n }\n\n return dataSchema;\n } //log.log("created dataSchema descriptor object:", dataSchema);\n\n\n return dataSchema;\n }\n /**\r\n * Create ProtocolStubDescriptor based on raw object that contains its attributes\r\n * @param rawProxy\r\n * @returns {ProtocolStubDescriptor}\r\n */\n\n }, {\n key: "createIdpProxy",\n value: function createIdpProxy(rawProxy) {\n // log.log("creating idpproxy descriptor based on: ", rawProxy);\n // create the descriptor\n var idpproxy = this._factory.createProtoStubDescriptorObject(rawProxy[\'cguid\'], rawProxy[\'version\'], rawProxy[\'objectName\'], rawProxy[\'description\'], rawProxy[\'language\'], rawProxy[\'sourcePackageURL\'], rawProxy[\'messageSchemas\'], rawProxy[\'configuration\'], rawProxy[\'constraints\'], rawProxy[\'hypertyType\'], rawProxy[\'dataObjects\'], rawProxy[\'interworking\'], rawProxy[\'idpProxy\'], rawProxy[\'mutualAuthentication\']); // optional fields\n\n\n idpproxy.signature = rawProxy[\'signature\']; // parse and attach the sourcePackage\n\n var sourcePackage = rawProxy[\'sourcePackage\'];\n\n if (sourcePackage) {\n sourcePackage = this.createSourcePackage(sourcePackage);\n idpproxy.sourcePackage = sourcePackage;\n }\n\n return idpproxy;\n }\n }, {\n key: "createSourcePackage",\n value: function createSourcePackage(sp) {\n //log.log("createSourcePackage:", sp);\n // check encoding\n if (sp[\'encoding\'] === \'base64\') {\n sp[\'sourceCode\'] = this.atob(sp[\'sourceCode\']);\n sp[\'encoding\'] = \'utf-8\';\n }\n\n var sourcePackage = this._factory.createSourcePackage(sp[\'sourceCodeClassname\'], sp[\'sourceCode\']);\n\n if (sp[\'encoding\']) sourcePackage.encoding = sp[\'encoding\'];\n if (sp[\'signature\']) sourcePackage.signature = sp[\'signature\'];\n return sourcePackage;\n }\n /**\r\n * Get source Package from a URL\r\n * @param sourcePackageURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty/sourcePackage\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getSourcePackageFromURL",\n value: function getSourcePackageFromURL(sourcePackageURL) {\n var _this3 = this;\n\n log.log(\'getting sourcePackage from:\', sourcePackageURL);\n return new Promise(function (resolve, reject) {\n _this3.httpRequest.get(sourcePackageURL).then(function (result) {\n //log.log("got raw sourcePackage:", result);\n if (result[\'ERROR\']) {\n // TODO handle error properly\n reject(result);\n } else {\n result = JSON.parse(result);\n\n var sourcePackage = _this3.createSourcePackage(result);\n\n resolve(sourcePackage);\n }\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n /**\r\n * Returns the sourceCode of a given descriptor\r\n * @param {CatalogueDataObject} descriptor - Catalogue Object that was retrieved using e.g. getHypertyDescriptor()\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getSourceCodeFromDescriptor",\n value: function getSourceCodeFromDescriptor(descriptor) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n if (descriptor.sourcePackage) {\n //log.log("descriptor has sourcePackage");\n //log.log("returning sourceCode:", descriptor.sourcePackage.sourceCode);\n resolve(descriptor.sourcePackage.sourceCode);\n } else {\n _this4.storageManager.getVersion(descriptor.sourcePackageURL + \'/sourceCode\').then(function (dbVersion) {\n if (dbVersion >= descriptor.version) {\n log.log(\'returning cached version from storageManager\');\n\n _this4.storageManager.get(descriptor.sourcePackageURL + \'/sourceCode\').then(function (sourceCode) {\n resolve(sourceCode);\n }).catch(function (reason) {\n reject(reason);\n });\n } else {\n _this4.httpRequest.get(descriptor.sourcePackageURL + \'/sourceCode\').then(function (sourceCode) {\n if (sourceCode[\'ERROR\']) {\n // TODO handle error properly\n reject(sourceCode);\n } else {\n _this4.storageManager.set(descriptor.sourcePackageURL + \'/sourceCode\', descriptor.version, sourceCode);\n\n resolve(sourceCode);\n }\n }).catch(function (reason) {\n reject(reason);\n });\n }\n }).catch(function (reason) {\n reject(reason);\n });\n }\n });\n }\n /**\r\n * Returns the list of available catalogue objects for the given "type URL",\r\n * i.e. a catalogue URL that specifies a type, but no catalogue object name.\r\n * @param typeURL - URL pointing to the catalogue object type you want a list of available objects for,\r\n * e.g. hyperty-catalogue://catalogue.fokus.fraunhofer.de/.well-known/idp-proxy\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise} typeListPromise - Promise that fulfills with the list of available catalogue object names for the requested type,\r\n * rejects on HTTP error or if the HTTP response is not in JSON.\r\n * If constraints were provided, then the list only contains those objects that meet the constraints\r\n */\n\n }, {\n key: "getTypeList",\n value: function getTypeList(typeURL, constraints) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n var requestPromise = constraints != undefined ? _this5.httpRequest.post(typeURL, {\n body: JSON.stringify(constraints)\n }) : _this5.httpRequest.get(typeURL);\n requestPromise.then(function (typeList) {\n typeList = JSON.parse(typeList);\n resolve(typeList);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: "deleteFromPM",\n value: function deleteFromPM(url) {\n return this.storageManager.delete(url);\n }\n }, {\n key: "runtimeURL",\n set: function set(runtimeURL) {\n this._runtimeURL = runtimeURL;\n },\n get: function get() {\n return this._runtimeURL;\n }\n }]);\n\n return RuntimeCatalogue;\n}();\n\n/* harmony default export */ var runtime_catalogue_RuntimeCatalogue = __webpack_exports__["default"] = (RuntimeCatalogue_RuntimeCatalogue);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvUmV0aGlua09iamVjdC5qcz9iOTBhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9DYXRhbG9ndWVEYXRhT2JqZWN0LmpzP2ZlMzEiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL1NvdXJjZVBhY2thZ2UuanM/YWUyOSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvSHlwZXJ0eURlc2NyaXB0b3IuanM/ZWE5YyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvUHJvdG9jb2xTdHViRGVzY3JpcHRvci5qcz9iMGNiIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9IeXBlcnR5UnVudGltZURlc2NyaXB0b3IuanM/ZWUyOCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvSHlwZXJ0eUludGVyY2VwdG9yRGVzY3JpcHRvci5qcz9jNjRiIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9EYXRhT2JqZWN0U2NoZW1hLmpzP2YxMjMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL0NhdGFsb2d1ZURhdGFPYmplY3RGYWN0b3J5LmpzPzZlMzQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL1J1bnRpbWVDYXRhbG9ndWUuanM/NDBhNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcbmltcG9ydCB0djQgZnJvbSBcInR2NFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJldGhpbmtPYmplY3Qge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGVzIHRoaXMgUmV0aGlua09iamVjdCBhZ2FpbnN0IHRoZSBwcm92aWRlZCBzY2hlbWEuXHJcbiAgICAgKlxyXG4gICAgICogTElNSVRBVElPTlM6IFRoZSBwcm92aWRlZCBzY2hlbWEgY2Fubm90IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBzY2hlbWFzLCBzaW5jZSB0aGV5IGNhbid0IGJlIHJlc29sdmVkLlxyXG4gICAgICogQHBhcmFtIHNjaGVtYSAtIHNjaGVtYSB0byB2YWxpZGF0ZSBhZ2FpbnN0XHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXRlKHNjaGVtYSkge1xyXG4gICAgICAgIC8vIGFkZCBzY2hlbWEgaXRzZWxmIHNvIGxvY2FsIHJlZmVyZW5jZXMgd29ya1xyXG4gICAgICAgIHR2NC5hZGRTY2hlbWEoc2NoZW1hLmlkLCBzY2hlbWEpO1xyXG5cclxuICAgICAgICAvLyBKU09OIHN0cmluZ2lmeSAtPiBwYXJzZSBuZWVkZWQgdG8gaGF2ZSBwcm9wZXIgdmFsaWRhdGlvblxyXG4gICAgICAgIGxldCByZXN1bHQgPSB0djQudmFsaWRhdGVNdWx0aXBsZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKSwgc2NoZW1hKTtcclxuXHJcbiAgICAgICAgLy8gZGVsZXRlIGVycm9yIHN0YWNrcyB0byBpbXByb3ZlIGxvZ2dpbmdcclxuICAgICAgICByZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBlcnJvci5zdGFjaztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gcHJpbnQgbW9yZSBkZXRhaWxzIGFib3V0IHZhbGlkYXRpb24gaWYgaXQgZmFpbHMgb3Igc2NoZW1hIGNvbnRhaW5zICRyZWZzXHJcbiAgICAgICAgaWYgKCFyZXN1bHQudmFsaWQgfHwgKHJlc3VsdC5taXNzaW5nLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk9iamVjdCB2YWxpZGF0aW9uIFwiICsgKHJlc3VsdC52YWxpZCA/IFwic3VjY2VlZGVkLCBidXQgc2NoZW1hIGNvbnRhaW5lZCByZWZlcmVuY2VzOlwiIDogXCJmYWlsZWQ6XCIpLCBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJPYmplY3Q6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsIDIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWxpZDtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJldGhpbmtPYmplY3Q7XHJcblxyXG4iLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcbmltcG9ydCBSZXRoaW5rT2JqZWN0IGZyb20gXCIuL1JldGhpbmtPYmplY3RcIjtcclxuXHJcbi8qKlxyXG4gKiBAYXV0aG9yIGFsaWNlLmNoZWFtYmVbYXRdZm9rdXMuZnJhdW5ob2Zlci5kZVxyXG4gKiBUaGUgQ2F0YWxvZ3VlRGF0YU9iamVjdCBjbGFzcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlVEhJTksgQ2F0YWxvZ3VlIERhdGEgTW9kZWxcclxuICovXHJcbmNsYXNzIENhdGFsb2d1ZURhdGFPYmplY3QgZXh0ZW5kcyBSZXRoaW5rT2JqZWN0IHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gZ3VpZCAtIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdCAoZS5nLiBIeXBlcnR5IGRlc2NyaXB0b3IsIFByb3RvY29sU3R1YiBkZXNjcmlwdG9yLFxyXG4gICAgICogZXRjKSBlbmFibGluZyB0aGUgc2FtZSBvYmplY3QgdG8gYmUgc3RvcmVkIGFuZCBkaXNjb3ZlcmVkIGluIGRpZmZlcmVudCBDYXRhbG9ndWVzLiBUaGF0IG1lYW5zLCBndWlkIGNvcnJlc3BvbmRzIHRvXHJcbiAgICAgKiBbcmVzb3VyY2UtdHlwZS1pZF0gcGVyIEJORiBvZiBSZXNvdXJjZSBQYXRoLiBDb3VsZG4ndCB3ZSBoYXZlIHByb2JsZW1zIHdpdGggdG9vIGxvbmcgVVJMIHBhdGhzP1xyXG4gICAgICogQHBhcmFtIHR5cGUgLSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0IGUuZy4gSHlwZXJ0eSwgUHJvdG9jb2xTdHViLCBldGNcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXHJcbiAgICAgKiBAcGFyYW0gb2JqZWN0TmFtZSAtIGh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3QgZS5nLiBcIk15IEF3ZXNvbWUgSHlwZXJ0eVwiXHJcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBkZXNjcmlwdGlvbiBvZiB0aGUgc291cmNlIHBhY2thZ2VcclxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSAtIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlLlNvdXJjZUNvZGVcclxuICAgICAqIEBwYXJhbSBzb3VyY2VQYWNrYWdlVVJMIC0gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmdcclxuICAgICAqIGNhdGFsb2d1ZSBvYmplY3QsIGUuZy4gZGVwbG95YWJsZSBwYWNrYWdlcyBjb250YWluaW5nIGV4ZWN1dGFibGUgY29kZSBmb3IgSHlwZXJ0aWVzIG9yIFByb3RvU3R1YnMsIGNhbiBiZSBkb3dubG9hZGVkXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fZ3VpZCA9IGd1aWQ7XHJcbiAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XHJcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XHJcbiAgICAgICAgdGhpcy5fb2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7XHJcbiAgICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLl9sYW5ndWFnZSA9IGxhbmd1YWdlO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZVBhY2thZ2VVUkwgPSBzb3VyY2VQYWNrYWdlVVJMO1xyXG5cclxuICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZVBhY2thZ2UgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldHRlcnNcclxuICAgIGdldCBndWlkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ndWlkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0eXBlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB2ZXJzaW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvYmplY3ROYW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vYmplY3ROYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhbmd1YWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lnbmF0dXJlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvdXJjZVBhY2thZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBhY2thZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvdXJjZVBhY2thZ2VVUkwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBhY2thZ2VVUkw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIFNldHRlcnNcclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzaWduYXR1cmUgdG8gZW5hYmxlcyBpbnRlZ3JpdHkgYW5kIGF1dGhlbnRpY2l0eSB2ZXJpZmljYXRpb25cclxuICAgICAqIEBwYXJhbSBzaWduYXR1cmVcclxuICAgICAqL1xyXG4gICAgc2V0IHNpZ25hdHVyZShzaWduYXR1cmUpIHtcclxuICAgICAgICBpZiAoc2lnbmF0dXJlKVxyXG4gICAgICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBzaWduYXR1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNvdXJjZVBhY2thZ2Uoc291cmNlUGFja2FnZSkge1xyXG4gICAgICAgIGlmIChzb3VyY2VQYWNrYWdlKVxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VQYWNrYWdlID0gc291cmNlUGFja2FnZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZ3VpZChndWlkKSB7XHJcbiAgICAgICAgaWYgKGd1aWQpXHJcbiAgICAgICAgICAgIHRoaXMuX2d1aWQgPSBndWlkO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCB0eXBlKHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZSlcclxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHZlcnNpb24odmVyc2lvbikge1xyXG4gICAgICAgIGlmICh2ZXJzaW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXQgb2JqZWN0TmFtZShvYmplY3ROYW1lKSB7XHJcbiAgICAgICAgaWYgKG9iamVjdE5hbWUpXHJcbiAgICAgICAgICAgIHRoaXMuX29iamVjdE5hbWUgPSBvYmplY3ROYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBkZXNjcmlwdGlvbihkZXNjcmlwdGlvbikge1xyXG4gICAgICAgIGlmIChkZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcclxuICAgICAgICBpZiAobGFuZ3VhZ2UpXHJcbiAgICAgICAgICAgIHRoaXMuX2xhbmd1YWdlID0gbGFuZ3VhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNvdXJjZVBhY2thZ2VVUkwoc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgICAgIGlmIChzb3VyY2VQYWNrYWdlVVJMKVxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VQYWNrYWdlVVJMID0gc291cmNlUGFja2FnZVVSTDtcclxuICAgIH1cclxufVxyXG4vL0FsaWNlOiByZW1vdmVkIFBPTElDWV9FTkZPUkNFUjogJ3BvbGljeV9lbmZvcmNlcicsIERBVEFfU0NIRU1BOiAnZGF0YV9zY2hlbWEnIGZyb20gdGhlIGxpc3RcclxuLy93cnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvZGV2LXNlcnZpY2UtZnJhbWV3b3JrL2Jsb2IvZGV2ZWxvcC9kb2NzL2RhdGFtb2RlbC9jb3JlL2h5cGVydHktY2F0YWxvZ3VlL3JlYWRtZS5tZCNkYXRhLW9iamVjdC1zY2hlbWFcclxuZXhwb3J0IGNvbnN0IENhdGFsb2d1ZU9iamVjdFR5cGUgPSB7XHJcbiAgICBIWVBFUlRZOiAnaHlwZXJ0eScsIFBST1RPU1RVQjogJ3Byb3Rvc3R1YicsIEhZUEVSVFlfUlVOVElNRTogJ2h5cGVydHlfcnVudGltZScsXHJcbiAgICBIWVBFUlRZX0lOVEVSQ0VQVE9SOiAnaHlwZXJ0eV9pbnNwZWN0b3InLCBIWVBFUlRZX0RBVEFfT0JKRUNUOiAnaHlwZXJ0eV9kYXRhX29iamVjdCdcclxufTtcclxuZXhwb3J0IGNvbnN0IERhdGFPYmplY3RTb3VyY2VMYW5ndWFnZSA9IHtcclxuICAgIEpBVkFTQ1JJUFRfRUNNQTY6ICdqYXZhc2NyaXB0X2VjbWE2JywgSkFWQVNDUklQVF9FQ01BNTogJ2phdmFzY3JpcHRfZWNtYTUnLFxyXG4gICAgSlNPTl9TQ0hFTUFfVjQ6ICdqc29uX3NjaGVtYV92NCcsIFBZVEhPTjogJ3B5dGhvbicsIFRZUEVTQ1JJUFQ6ICd0eXBlc2NyaXB0J1xyXG59O1xyXG5leHBvcnQgZGVmYXVsdCBDYXRhbG9ndWVEYXRhT2JqZWN0OyIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGFtbyBvbiAxNC8xMS8yMDE1LlxyXG4gKi9cclxuY2xhc3MgU291cmNlUGFja2FnZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2VDb2RlQ2xhc3NuYW1lLCBzb3VyY2VDb2RlKSB7XHJcbiAgICAgICAgdGhpcy5fc291cmNlQ29kZSA9IHNvdXJjZUNvZGU7XHJcbiAgICAgICAgdGhpcy5fc291cmNlQ29kZUNsYXNzbmFtZSA9IHNvdXJjZUNvZGVDbGFzc25hbWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2VuY29kaW5nID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3VyY2VDb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VDb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3VyY2VDb2RlQ2xhc3NuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VDb2RlQ2xhc3NuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbmNvZGluZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpZ25hdHVyZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmF0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBlbmNvZGluZyhlbmNvZGluZykge1xyXG4gICAgICAgIGlmIChlbmNvZGluZylcclxuICAgICAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgc2lnbmF0dXJlKHNpZ24pIHtcclxuICAgICAgICBpZiAoc2lnbilcclxuICAgICAgICAgICAgdGhpcy5fc2lnbmF0dXJlID0gc2lnbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgc291cmNlQ29kZShzb3VyY2VDb2RlKSB7XHJcbiAgICAgICAgaWYgKHNvdXJjZUNvZGUpXHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZUNvZGUgPSBzb3VyY2VDb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBzb3VyY2VDb2RlQ2xhc3NuYW1lKHNvdXJjZUNvZGVDbGFzc25hbWUpIHtcclxuICAgICAgICBpZiAoc291cmNlQ29kZUNsYXNzbmFtZSlcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlQ29kZUNsYXNzbmFtZSA9IHNvdXJjZUNvZGVDbGFzc25hbWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNvdXJjZVBhY2thZ2U7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGFtbyBvbiAxNC8xMS8yMDE1LlxyXG4gKi9cclxuaW1wb3J0IENhdGFsb2d1ZURhdGFPYmplY3QgZnJvbSAnLi9DYXRhbG9ndWVEYXRhT2JqZWN0JztcclxuXHJcbmNsYXNzIEh5cGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgQ2F0YWxvZ3VlRGF0YU9iamVjdCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0IGVuYWJsaW5nIHRoZSBzYW1lIG9iamVjdCB0byBiZVxyXG4gICAgICogc3RvcmVkIGFuZCBkaXNjb3ZlcmVkIGluIGRpZmZlcmVudCBDYXRhbG9ndWVzLiBHdWlkIGNvcnJlc3BvbmRzIHRvIDxyZXNvdXJjZS10eXBlLWlkPiBwZXIgQk5GIG9mIFJlc291cmNlIFBhdGguXHJcbiAgICAgKiBAcGFyYW0ge0NhdGFsb2d1ZU9iamVjdFR5cGV9IGNhdGFsb2d1ZVR5cGUgLSBcdEluZGljYXRlcyB0aGUgdHlwZSBvZiBDYXRhbG9ndWUgRGF0YSBPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMXHJcbiAgICAgKiBAcGFyYW0ge0h5cGVydHlSZXNvdXJjZVR5cGVbXX0gaHlwZXJ0eVR5cGUgQSB0YWcgdGhhdCBpZGVudGlmaWVzIHdoYXQgdHlwZSBvZiBoeXBlcnR5IGlzIGRlc2NyaWJlZCBpbiB0aGUgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtVUkwuSHlwZXJ0eUNhdGFsb2d1ZVVSTExpc3R9IGRhdGFPYmplY3RVcmxzIC0gSXQgZGVmaW5lcyB0aGUgRGF0YSBPYmplY3QgU2NoZW1hcyBzdXBwb3J0ZWQgYnkgdGhlIEh5cGVydHlcclxuICAgICAqIHRocm91Z2ggYSBsaXN0IG9mIENhdGFsb2d1ZSBVUkxzIGZyb20gd2hlcmUgdGhlc2Ugc2NoZW1hcyBjYW4gYmUgcmVhY2hlZFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCBjYXRhbG9ndWVUeXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0VXJscykge1xyXG4gICAgICAgIHN1cGVyKGd1aWQsIGNhdGFsb2d1ZVR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSB7fTtcclxuICAgICAgICB0aGlzLl9jb25zdHJhaW50cyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3BvbGljaWVzID0ge307XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNjaGVtYSA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuX2h5cGVydHlUeXBlID0gaHlwZXJ0eVR5cGU7XHJcbiAgICAgICAgdGhpcy5fZGF0YU9iamVjdHMgPSBkYXRhT2JqZWN0VXJscztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaHlwZXJ0eVR5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkYXRhT2JqZWN0cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YU9iamVjdHM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnN0cmFpbnRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdHJhaW50cztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWVzc2FnZVNjaGVtYSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZVNjaGVtYTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcG9saWNpZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvbGljaWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBoeXBlcnR5VHlwZShoVHlwZSkge1xyXG4gICAgICAgIGlmIChoVHlwZSlcclxuICAgICAgICAgICAgdGhpcy5faHlwZXJ0eVR5cGUgPSBoVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZGF0YU9iamVjdHMoZGF0YU9iamVjdHMpIHtcclxuICAgICAgICBpZiAoZGF0YU9iamVjdHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzID0gZGF0YU9iamVjdHM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY29uc3RyYWludHMoY29uc3RyYWludHMpIHtcclxuICAgICAgICBpZiAoY29uc3RyYWludHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG1lc3NhZ2VTY2hlbWEobWVzc2FnZVNjaGVtYSkge1xyXG4gICAgICAgIGlmIChtZXNzYWdlU2NoZW1hKVxyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2NoZW1hID0gbWVzc2FnZVNjaGVtYTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgcG9saWNpZXMocG9saWNpZXMpIHtcclxuICAgICAgICBpZiAocG9saWNpZXMpXHJcbiAgICAgICAgICAgIHRoaXMuX3BvbGljaWVzID0gcG9saWNpZXM7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IFJ1bnRpbWVIeXBlcnR5Q2FwYWJpbGl0eVR5cGUgPSB7fTtcclxuZXhwb3J0IGNvbnN0IEh5cGVydHlUeXBlID0ge0NPTU1VTklDQVRPUjogJ2NvbW11bmljYXRvcicsIElERU5USVRZOiAnaWRlbnRpdHknLCBDT05URVhUOiAnY29udGV4dCd9O1xyXG5leHBvcnQgY29uc3QgSHlwZXJ0eVJlc291cmNlVHlwZSA9IHtjaGF0OiAnQ0hBVCcsIGF1ZGlvOiAnQXVkaW8nLCB2aWRlbzogJ1ZpZGVvJywgYXY6ICdBVicsIHNjcmVlbjonU0NSRUVOJyxcclxuICAgIGZpbGU6ICdGSUxlJywgbWlkaTonTUlESSd9O1xyXG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5RGVzY3JpcHRvcjsiLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogQ3JlYXRlZCBieSBhbW8gb24gMTQvMTEvMjAxNS5cclxuICovXHJcblxyXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCBmcm9tIFwiLi9DYXRhbG9ndWVEYXRhT2JqZWN0XCI7XHJcblxyXG5jbGFzcyBQcm90b2NvbFN0dWJEZXNjcmlwdG9yIGV4dGVuZHMgQ2F0YWxvZ3VlRGF0YU9iamVjdCB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIG1lc3NhZ2VTY2hlbWFzLCBjb25maWd1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgY29uc3RyYWludHMsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0cywgaW50ZXJ3b3JraW5nLCBpZHBQcm94eSwgbXV0dWFsQXV0aGVudGljYXRpb24pIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG5cclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2NoZW1hcyA9IG1lc3NhZ2VTY2hlbWFzO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbilcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0ge307XHJcblxyXG4gICAgICAgIGlmIChjb25zdHJhaW50cylcclxuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWludHMgPSBjb25zdHJhaW50cztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbnRzID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuX2h5cGVydHlUeXBlID0gaHlwZXJ0eVR5cGU7XHJcblxyXG4gICAgICAgIGlmIChkYXRhT2JqZWN0cylcclxuICAgICAgICAgICAgdGhpcy5fZGF0YU9iamVjdHMgPSBkYXRhT2JqZWN0cztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzID0gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5faW50ZXJ3b3JraW5nID0gaW50ZXJ3b3JraW5nO1xyXG4gICAgICAgIHRoaXMuX2lkcFByb3h5ID0gaWRwUHJveHk7XHJcbiAgICAgICAgdGhpcy5fbXV0dWFsQXV0aGVudGljYXRpb24gPSBtdXR1YWxBdXRoZW50aWNhdGlvbjtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1lc3NhZ2VTY2hlbWFzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlU2NoZW1hcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29uc3RyYWludHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0cmFpbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWd1cmF0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBtZXNzYWdlU2NoZW1hcyhtZXNzYWdlU2NoZW1hcykge1xyXG4gICAgICAgIGlmIChtZXNzYWdlU2NoZW1hcylcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNjaGVtYXMgPSBtZXNzYWdlU2NoZW1hcztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY29uc3RyYWludHMoY29uc3RyYWludHMpIHtcclxuICAgICAgICBpZiAoY29uc3RyYWludHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaHlwZXJ0eVR5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBoeXBlcnR5VHlwZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2h5cGVydHlUeXBlID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRhdGFPYmplY3RzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhT2JqZWN0cztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZGF0YU9iamVjdHModmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9kYXRhT2JqZWN0cyA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbnRlcndvcmtpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVyd29ya2luZztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaW50ZXJ3b3JraW5nKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5faW50ZXJ3b3JraW5nID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlkcFByb3h5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pZHBQcm94eTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaWRwUHJveHkodmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9pZHBQcm94eSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtdXR1YWxBdXRoZW50aWNhdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbXV0dWFsQXV0aGVudGljYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG11dHVhbEF1dGhlbnRpY2F0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fbXV0dWFsQXV0aGVudGljYXRpb24gPSB2YWx1ZTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJvdG9jb2xTdHViRGVzY3JpcHRvcjsiLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogQ3JlYXRlZCBieSBhbW8gb24gMTQvMTEvMjAxNS5cclxuICovXHJcblxyXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCBmcm9tIFwiLi9DYXRhbG9ndWVEYXRhT2JqZWN0XCI7XHJcblxyXG5jbGFzcyBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IgZXh0ZW5kcyBDYXRhbG9ndWVEYXRhT2JqZWN0IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCBjYXRhbG9ndWVUeXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIHJ1bnRpbWVUeXBlLFxyXG4gICAgICAgICAgICAgICAgaHlwZXJ0eUNhcGFiaWxpdGllcywgcHJvdG9jb2xDYXBhYmlsaXRpZXMsIHAycEhhbmRsZXJTdHViLCBwMnBSZXF1ZXN0ZXJTdHViKSB7XHJcbiAgICAgICAgc3VwZXIoZ3VpZCwgY2F0YWxvZ3VlVHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcnVudGltZVR5cGUgPSBydW50aW1lVHlwZTtcclxuXHJcbiAgICAgICAgaWYgKGh5cGVydHlDYXBhYmlsaXRpZXMpXHJcbiAgICAgICAgICAgIHRoaXMuX2h5cGVydHlDYXBhYmlsaXRpZXMgPSBoeXBlcnR5Q2FwYWJpbGl0aWVzO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5faHlwZXJ0eUNhcGFiaWxpdGllcyA9IG5ldyBSdW50aW1lSHlwZXJ0eUNhcGFiaWxpdHkodHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChwcm90b2NvbENhcGFiaWxpdGllcylcclxuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xDYXBhYmlsaXRpZXMgPSBwcm90b2NvbENhcGFiaWxpdGllcztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sQ2FwYWJpbGl0aWVzID0gbmV3IFJ1bnRpbWVQcm90b2NvbENhcGFiaWxpdHkodHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLl9wMnBIYW5kbGVyU3R1YiA9IHAycEhhbmRsZXJTdHViO1xyXG4gICAgICAgIHRoaXMuX3AycFJlcXVlc3RlclN0dWIgPSBwMnBSZXF1ZXN0ZXJTdHViO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBydW50aW1lVHlwZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcnVudGltZVR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGh5cGVydHlDYXBhYmlsaXRpZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlDYXBhYmlsaXRpZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb3RvY29sQ2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9oeXBlcnR5Q2FwYWJpbGl0aWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBydW50aW1lVHlwZShydW50aW1lVHlwZSkge1xyXG4gICAgICAgIGlmIChydW50aW1lVHlwZSlcclxuICAgICAgICAgICAgdGhpcy5fcnVudGltZVR5cGUgPSBydW50aW1lVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaHlwZXJ0eUNhcGFiaWxpdGllcyhoeXBlcnR5Q2FwYWJpbGl0aWVzKSB7XHJcbiAgICAgICAgaWYgKGh5cGVydHlDYXBhYmlsaXRpZXMpXHJcbiAgICAgICAgICAgIHRoaXMuX2h5cGVydHlDYXBhYmlsaXRpZXMgPSBoeXBlcnR5Q2FwYWJpbGl0aWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBwcm90b2NvbENhcGFiaWxpdGllcyhwcm90b2NvbENhcGFiaWxpdGllcykge1xyXG4gICAgICAgIGlmIChwcm90b2NvbENhcGFiaWxpdGllcylcclxuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xDYXBhYmlsaXRpZXMgPSBwcm90b2NvbENhcGFiaWxpdGllcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcDJwSGFuZGxlclN0dWIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3AycEhhbmRsZXJTdHViO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBwMnBIYW5kbGVyU3R1Yih2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3AycEhhbmRsZXJTdHViID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHAycFJlcXVlc3RlclN0dWIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3AycFJlcXVlc3RlclN0dWI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHAycFJlcXVlc3RlclN0dWIodmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9wMnBSZXF1ZXN0ZXJTdHViID0gdmFsdWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjYXBhYmlsaXR5IHNldCBvZiB0aGUgUnVudGltZSBIeXBlcnR5XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUnVudGltZUh5cGVydHlDYXBhYmlsaXR5IHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgb2YgdGhlIFJ1bnRpbWUgSHlwZXJ0eSBjYXBhYmlsaXR5IHNldFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc1dlYlJUQ1N1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc01pY1N1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0NhbWVyYVN1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc1NlbnNvclN1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc09SVENTdXBwb3J0ZWRcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaXNXZWJSVENTdXBwb3J0ZWQsIGlzTWljU3VwcG9ydGVkLCBpc0NhbWVyYVN1cHBvcnRlZCwgaXNTZW5zb3JTdXBwb3J0ZWQsIGlzT1JUQ1N1cHBvcnRlZCkge1xyXG4gICAgICAgIHRoaXMuX2lzV2ViUlRDID0gaXNXZWJSVENTdXBwb3J0ZWQ7XHJcbiAgICAgICAgdGhpcy5faXNNaWMgPSBpc01pY1N1cHBvcnRlZDtcclxuICAgICAgICB0aGlzLl9pc0NhbWVyYSA9IGlzQ2FtZXJhU3VwcG9ydGVkO1xyXG4gICAgICAgIHRoaXMuX2lzU2Vuc29yID0gaXNTZW5zb3JTdXBwb3J0ZWQ7XHJcbiAgICAgICAgdGhpcy5faXNPUlRDID0gaXNPUlRDU3VwcG9ydGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc01pYygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNNaWM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzQ2FtZXJhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbWVyYTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNTZW5zb3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2Vuc29yO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc1dlYlJUQygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNXZWJSVEM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzT1JUQ1MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzT1JUQztcclxuICAgIH1cclxuXHJcbiAgICBnZXRDYXBhYmlsaXR5U2V0KCkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm90b2NvbCBjYXBhYmlsaXR5IHNldCBvZiB0aGUgUnVudGltZSBIeXBlcnR5XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUnVudGltZVByb3RvY29sQ2FwYWJpbGl0eSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBvZiB0aGUgcnVudGltZSBwcm90b2NvbCBjYXBhYmlsaXR5XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzSHR0cFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0h0dHBzXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzV1NcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNXU1NcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNDb2FwXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRGF0YUNoYW5uZWxcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaXNIdHRwLCBpc0h0dHBzLCBpc1dTLCBpc1dTUywgaXNDb2FwLCBpc0RhdGFDaGFubmVsKSB7XHJcbiAgICAgICAgdGhpcy5faXNIdHRwID0gaXNIdHRwO1xyXG4gICAgICAgIHRoaXMuX2lzSHR0cHMgPSBpc0h0dHBzO1xyXG4gICAgICAgIHRoaXMuX2lzV1MgPSBpc1dTO1xyXG4gICAgICAgIHRoaXMuX2lzV1NTID0gaXNXU1M7XHJcbiAgICAgICAgdGhpcy5faXNDb2FwID0gaXNDb2FwO1xyXG4gICAgICAgIHRoaXMuX2lzRGF0YUNoYW5uZWwgPSBpc0RhdGFDaGFubmVsO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSHR0cCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNIdHRwO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSHR0cHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzSHR0cHM7XHJcbiAgICB9XHJcblxyXG4gICAgaXNXUygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNXUztcclxuICAgIH1cclxuXHJcbiAgICBpc1NlbnNvclN1cHBvcnRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNTZW5zb3I7XHJcbiAgICB9XHJcblxyXG4gICAgaXNXU1MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzV1NTO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQ29hcCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNDb2FwO1xyXG4gICAgfVxyXG5cclxuICAgIGlzRGF0YUNoYW5uZWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGF0YUNoYW5uZWw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldENhcGFiaWxpdHlTZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUnVudGltZVR5cGUgPSB7QlJPV1NFUjogJ2Jyb3dzZXInLCBTVEFOREFMT05FOiAnc3RhbmRhbG9uZScsIFNFUlZFUjogJ3NlcnZlcicsIEdBVEVXQVk6ICdnYXRld2F5J307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5UnVudGltZURlc2NyaXB0b3I7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IHB6dSBvbiAxOS4xMS4xNS5cclxuICovXHJcbmltcG9ydCBDYXRhbG9ndWVEYXRhT2JqZWN0IGZyb20gJy4vQ2F0YWxvZ3VlRGF0YU9iamVjdCc7XHJcblxyXG5jbGFzcyBQb2xpY3lFbmZvcmNlckRlc2NyaXB0b3IgZXh0ZW5kcyBDYXRhbG9ndWVEYXRhT2JqZWN0IHtcclxuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgY29uZmlndXJhdGlvbiwgcG9saWNpZXMpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG5cclxuICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgICAgICB0aGlzLl9wb2xpY2llcyA9IHBvbGljaWVzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWd1cmF0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwb2xpY2llcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9saWNpZXM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHBvbGljaWVzKHBvbGljaWVzKSB7XHJcbiAgICAgICAgdGhpcy5fcG9saWNpZXMgPSBwb2xpY2llcztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvbGljeUVuZm9yY2VyRGVzY3JpcHRvcjsiLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuICogQ3JlYXRlZCBieSBwenUgb24gMTkuMTEuMTUuXHJcbiAqL1xyXG5cclxuaW1wb3J0IENhdGFsb2d1ZURhdGFPYmplY3QgZnJvbSAnLi9DYXRhbG9ndWVEYXRhT2JqZWN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgQ2F0YWxvZ3VlRGF0YU9iamVjdCB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuXHJcbi8vQ2hpbGRyZW5cclxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgRGF0YU9iamVjdFNjaGVtYSB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEgZXh0ZW5kcyBEYXRhT2JqZWN0U2NoZW1hIHtcclxuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgYWNjZXNzQ29udHJvbFBvbGljeSwgZGF0YVVybFNjaGVtZSkge1xyXG4gICAgICAgIHN1cGVyKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzQ29udHJvbFBvbGljeSA9IGFjY2Vzc0NvbnRyb2xQb2xpY3k7XHJcbiAgICAgICAgdGhpcy5fc2NoZW1lID0gZGF0YVVybFNjaGVtZTtcclxuICAgIH1cclxufVxyXG5cclxuLy9DaGlsZHJlblxyXG5leHBvcnQgY2xhc3MgQ29tbXVuaWNhdGlvbkRhdGFPYmplY3RTY2hlbWEgZXh0ZW5kcyBIeXBlcnR5RGF0YU9iamVjdFNjaGVtYSB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkRhdGFPYmplY3RTY2hlbWEgZXh0ZW5kcyBIeXBlcnR5RGF0YU9iamVjdFNjaGVtYSB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEge1xyXG4gICAgY29uc3RydWN0b3IoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KSB7XHJcbiAgICAgICAgc3VwZXIoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRleHREYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEge1xyXG4gICAgY29uc3RydWN0b3IoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KSB7XHJcbiAgICAgICAgc3VwZXIoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERhdGFVcmxTY2hlbWUgPSB7XHJcbiAgICBDT01NOiAnQ09NTScsIENPTk5FQ1RJT046ICdDT05ORUNUSU9OJywgQ1RYVDogJ0NUWFQnLCBJREVOVElUWTogJ0lERU5USVRZJ1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGF0YU9iamVjdFNjaGVtYTsiLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcblxyXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCwge0NhdGFsb2d1ZU9iamVjdFR5cGUsIERhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gZnJvbSBcIi4vQ2F0YWxvZ3VlRGF0YU9iamVjdFwiO1xyXG5pbXBvcnQgU291cmNlUGFja2FnZSBmcm9tIFwiLi9Tb3VyY2VQYWNrYWdlXCI7XHJcbmltcG9ydCBIeXBlcnR5RGVzY3JpcHRvciBmcm9tIFwiLi9IeXBlcnR5RGVzY3JpcHRvclwiO1xyXG5pbXBvcnQgUHJvdG9jb2xTdHViRGVzY3JpcHRvciBmcm9tIFwiLi9Qcm90b2NvbFN0dWJEZXNjcmlwdG9yXCI7XHJcbmltcG9ydCBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IsIHtSdW50aW1lVHlwZX0gZnJvbSBcIi4vSHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yXCI7XHJcbmltcG9ydCBIeXBlcnR5SW50ZXJjZXB0b3JEZXNjcmlwdG9yIGZyb20gXCIuL0h5cGVydHlJbnRlcmNlcHRvckRlc2NyaXB0b3JcIjtcclxuaW1wb3J0IHtcclxuICAgIERhdGFPYmplY3RTY2hlbWEsXHJcbiAgICBEYXRhVXJsU2NoZW1lLFxyXG4gICAgQ29tbXVuaWNhdGlvbkRhdGFPYmplY3RTY2hlbWEsXHJcbiAgICBDb25uZWN0aW9uRGF0YU9iamVjdFNjaGVtYSxcclxuICAgIENvbnRleHREYXRhT2JqZWN0U2NoZW1hLFxyXG4gICAgSWRlbnRpdHlEYXRhT2JqZWN0U2NoZW1hXHJcbn0gZnJvbSBcIi4vRGF0YU9iamVjdFNjaGVtYVwiO1xyXG5cclxuY2xhc3MgQ2F0YWxvZ3VlRGF0YU9iamVjdEZhY3Rvcnkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIENhdGFsb2d1ZURhdGFPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtDYXRhbG9ndWVPYmplY3RUeXBlfSB0eXBlIC0gSW5kaWNhdGVzIHRoZSB0eXBlIG9mIENhdGFsb2d1ZSBEYXRhIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBQcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3QgY2FuIGJlIGRvd25sb2FkZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7Q2F0YWxvZ3VlRGF0YU9iamVjdH1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlQ2F0YWxvZ3VlRGF0YU9iamVjdChndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiBndWlkID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB0eXBlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBvYmplY3ROYW1lID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBkZXNjcmlwdGlvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHNvdXJjZVBhY2thZ2VVUkwgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICApXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVycyFcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDYXRhbG9ndWVEYXRhT2JqZWN0KGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgSHlwZXJ0eURlc2NyaXB0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBQcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3RcclxuICAgICAqIGNhbiBiZSBkb3dubG9hZGVkLlxyXG4gICAgICogQHBhcmFtIHtIeXBlcnR5UmVzb3VyY2VUeXBlW119IGh5cGVydHlUeXBlIC0gQW4gYXJyYXkgb2YgSHlwZXJ0eVJlc291cmNlVHlwZSB0aGF0IGlkZW50aWZpZXMgd2hhdCB0eXBlIG9mIGh5cGVydHlcclxuICAgICAqIHJlc291cmNlcyBhcmUgaGFuZGxlZCBieSB0aGUgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtVUkwuVVJMTGlzdH0gZGF0YU9iamVjdHMgLSBEZWZpbmVzIHRoZSBEYXRhIE9iamVjdCBTY2hlbWFzIHN1cHBvcnRlZCBieSB0aGUgSHlwZXJ0eSB0aHJvdWdoIGEgbGlzdCBvZiBDYXRhbG9ndWUgVVJMcyBmcm9tIHdoZXJlIHRoZXNlIHNjaGVtYXMgY2FuIGJlIHJlYWNoZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eURlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUh5cGVydHlEZXNjcmlwdG9yT2JqZWN0KGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgaHlwZXJ0eVR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0cykge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHZlcnNpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIG9iamVjdE5hbWUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlUGFja2FnZVVSTCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgaHlwZXJ0eVR5cGUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRhdGFPYmplY3RzID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgSHlwZXJ0eURlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgUHJvdG9jb2xTdHViRGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cclxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cclxuICAgICAqIEBwYXJhbSB7VVJMLlVSTH0gbWVzc2FnZVNjaGVtYXMgLSBEZWZpbmVzIHRoZSBTY2hlbWEgZGVzY3JpYmluZyB0aGUgTWVzc2FnZSBEYXRhIE1vZGVsIHVzZWQgYnkgdGhlIEh5cGVydHkgdGhyb3VnaCB0aGUgQ2F0YWxvZ3VlIFVSTCBmcm9tIHdoZXJlIHRoZSBNZXNzYWdlIHNjaGVtYSBjYW4gYmUgcmVhY2hlZC4gSWYgbm90IGRlZmluZWQsIGJ5IGRlZmF1bHQgaXQgaXMgYXNzdW1lZCB0aGUgc3RhbmRhcmQgTWVzc2FnZSBNb2RlbCBpcyB1c2VkLlxyXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gLSBEYXRhIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUgUHJvdG9jb2xTdHViXHJcbiAgICAgKiBAcGFyYW0gY29uc3RyYWludHMgLSBEZXNjcmliZXMgY2FwYWJpbGl0aWVzIHJlcXVpcmVkIGZyb20gdGhlIEh5cGVydHkgUnVudGltZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGV4ZWN1dGUgdGhlIFByb3RvY29sU3R1YlxyXG4gICAgICogQHBhcmFtIGh5cGVydHlUeXBlXHJcbiAgICAgKiBAcGFyYW0gZGF0YU9iamVjdHNcclxuICAgICAqIEBwYXJhbSBpbnRlcndvcmtpbmdcclxuICAgICAqIEBwYXJhbSBpZHBQcm94eVxyXG4gICAgICogQHBhcmFtIG11dHVhbEF1dGhlbnRpY2F0aW9uXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvdG9jb2xTdHViRGVzY3JpcHRvcn1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlUHJvdG9TdHViRGVzY3JpcHRvck9iamVjdChndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIG1lc3NhZ2VTY2hlbWFzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLCBjb25zdHJhaW50cywgaHlwZXJ0eVR5cGUsIGRhdGFPYmplY3RzLCBpbnRlcndvcmtpbmcsIGlkcFByb3h5LCBtdXR1YWxBdXRoZW50aWNhdGlvbikge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHZlcnNpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIG9iamVjdE5hbWUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlUGFja2FnZVVSTCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgbWVzc2FnZVNjaGVtYXMgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGNvbmZpZ3VyYXRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGNvbnN0cmFpbnRzID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xTdHViRGVzY3JpcHRvcihndWlkLCBDYXRhbG9ndWVPYmplY3RUeXBlLlBST1RPU1RVQiwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBtZXNzYWdlU2NoZW1hcywgY29uZmlndXJhdGlvbiwgY29uc3RyYWludHMsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0cywgaW50ZXJ3b3JraW5nLCBpZHBQcm94eSwgbXV0dWFsQXV0aGVudGljYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlSdW50aW1lRGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cclxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cclxuICAgICAqIEBwYXJhbSB7UnVudGltZVR5cGV9cnVudGltZVR5cGVcclxuICAgICAqIEBwYXJhbSB7UnVudGltZUh5cGVydHlDYXBhYmlsaXRpZXN9IGh5cGVydHlDYXBhYmlsaXRpZXMgLSBTdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIHRvIGV4ZWN1dGUgSHlwZXJ0aWVzXHJcbiAgICAgKiBAcGFyYW0ge1J1bnRpbWVQcm90b2NvbENhcGFiaWxpdGllc30gcHJvdG9jb2xDYXBhYmlsaXRpZXMgLSBTdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIHRvIGV4ZWN1dGUgUHJvdG9jb2wgU3R1YnNcclxuICAgICAqIEBwYXJhbSBwMnBIYW5kbGVyU3R1YlxyXG4gICAgICogQHBhcmFtIHAycFJlcXVlc3RlclN0dWJcclxuICAgICAqIEByZXR1cm5zIHtIeXBlcnR5UnVudGltZURlc2NyaXB0b3J9IHRoZSBkYXRhIG9iamVjdCBvZiB0aGUgSHlwZXJ0eSBSdW50aW1lIERlc2NyaXB0b3JcclxuICAgICAqL1xyXG4gICAgY3JlYXRlSHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yT2JqZWN0KGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lVHlwZSwgaHlwZXJ0eUNhcGFiaWxpdGllcywgcHJvdG9jb2xDYXBhYmlsaXRpZXMsIHAycEhhbmRsZXJTdHViLCBwMnBSZXF1ZXN0ZXJTdHViKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgdmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGxhbmd1YWdlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBydW50aW1lVHlwZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX1JVTlRJTUUsIHZlcnNpb24sIG9iamVjdE5hbWUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgcnVudGltZVR5cGUsIGh5cGVydHlDYXBhYmlsaXRpZXMsIHByb3RvY29sQ2FwYWJpbGl0aWVzLCBwMnBIYW5kbGVyU3R1YiwgcDJwUmVxdWVzdGVyU3R1Yik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgSHlwZXJ0eSBJbnRlcmNlcHRvciBEZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCAtIENhdGFsb2d1ZSBHbG9iYWwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIENhdGFsb2d1ZSBPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSAtIEh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxyXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhY2thZ2VVUkwgLSBVUkwgZnJvbSB3aGVyZSB0aGUgc291cmNlIGNvZGUgcGFja2FnZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRhbG9ndWUgb2JqZWN0IGNhbiBiZSBkb3dubG9hZGVkLlxyXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25cclxuICAgICAqIEBwYXJhbSBwb2xpY2llc1xyXG4gICAgICogQHJldHVybnMge1BvbGljeUVuZm9yY2VyRGVzY3JpcHRvcn1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlSHlwZXJ0eUludGVyY2VwdG9yRGVzY3JpcHRvck9iamVjdChndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGNvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljaWVzKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgdmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGxhbmd1YWdlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IEh5cGVydHlJbnRlcmNlcHRvckRlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0lOVEVSQ0VQVE9SLCB2ZXJzaW9uLCBvYmplY3ROYW1lLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGNvbmZpZ3VyYXRpb24sIHBvbGljaWVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBEYXRhT2JqZWN0U2NoZW1hIHdoaWNoIGluIGVmZmVjdCBpcyB0aGUgTWVzc2FnZURhdGFPYmplY3RTY2hlbWFcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBlaXRoZXIgY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWEgb3IgY3JlYXRlSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEgaW5zdGVhZFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cclxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cclxuICAgICAqIEByZXR1cm5zIHtEYXRhT2JqZWN0U2NoZW1hfVxyXG4gICAgICovXHJcbiAgICBjcmVhdGVEYXRhT2JqZWN0U2NoZW1hKGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHZlcnNpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIG9iamVjdE5hbWUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlUGFja2FnZVVSTCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhT2JqZWN0U2NoZW1hKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWV9EQVRBX09CSkVDVCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLFxyXG4gICAgICAgICAgICBzb3VyY2VQYWNrYWdlVVJMKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBEYXRhT2JqZWN0U2NoZW1hIHdoaWNoIGluIGVmZmVjdCBpcyB0aGUgTWVzc2FnZURhdGFPYmplY3RTY2hlbWFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBQcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3QgY2FuIGJlIGRvd25sb2FkZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7RGF0YU9iamVjdFNjaGVtYX1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWEoZ3VpZCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgdmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGxhbmd1YWdlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IERhdGFPYmplY3RTY2hlbWEoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0RBVEFfT0JKRUNULCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsXHJcbiAgICAgICAgICAgIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlEYXRhT2JqZWN0U2NoZW1hXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCAtIENhdGFsb2d1ZSBHbG9iYWwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIENhdGFsb2d1ZSBPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSAtIEh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxyXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhY2thZ2VVUkwgLSBVUkwgZnJvbSB3aGVyZSB0aGUgc291cmNlIGNvZGUgcGFja2FnZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRhbG9ndWUgb2JqZWN0IGNhbiBiZSBkb3dubG9hZGVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFjY2Vzc0NvbnRyb2xQb2xpY3kgLSBwb2xpY3kgcnVsZSB0byBhY2Nlc3Mgb2JqZWN0IChzZWUgUmVwb3J0ZXItT2JzZXJ2ZXIgQ29tbSBwYXR0ZXJuKVxyXG4gICAgICogQHBhcmFtIHtEYXRhVXJsU2NoZW1lfSBzY2hlbWUgLSBpZGVudGlmaWVzIHRoZSBkYXRhIHNjaGVtZSAoQ09NTSwgQ09OTkVDVElPTiwgQ1RYVCBvciBJREVOVElUWSlcclxuICAgICAqIEByZXR1cm5zIHtEYXRhT2JqZWN0U2NoZW1hfVxyXG4gICAgICovXHJcbiAgICBjcmVhdGVIeXBlcnR5RGF0YU9iamVjdFNjaGVtYShndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NDb250cm9sUG9saWN5LCBzY2hlbWUpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiBndWlkID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBvYmplY3ROYW1lID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBkZXNjcmlwdGlvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHNvdXJjZVBhY2thZ2VVUkwgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHNjaGVtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgYWNjZXNzQ29udHJvbFBvbGljeSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtZSA9PT0gRGF0YVVybFNjaGVtZS5DT01NKVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbW11bmljYXRpb25EYXRhT2JqZWN0U2NoZW1hKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWV9EQVRBX09CSkVDVCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgc2NoZW1lLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcclxuICAgICAgICBlbHNlIGlmIChzY2hlbWUgPT09IERhdGFVcmxTY2hlbWUuQ09OTkVDVElPTilcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRGF0YU9iamVjdFNjaGVtYShndWlkLCBDYXRhbG9ndWVPYmplY3RUeXBlLkhZUEVSVFlfREFUQV9PQkpFQ1QsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIHNjaGVtZSwgYWNjZXNzQ29udHJvbFBvbGljeSk7XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1lID09PSBEYXRhVXJsU2NoZW1lLkNUWFQpXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGV4dERhdGFPYmplY3RTY2hlbWEoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0RBVEFfT0JKRUNULCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBzY2hlbWUsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtZSA9PT0gRGF0YVVybFNjaGVtZS5JREVOVElUWSlcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZGVudGl0eURhdGFPYmplY3RTY2hlbWEoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0RBVEFfT0JKRUNULCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBzY2hlbWUsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSBzb3VyY2VDb2RlQ2xhc3NuYW1lIC0gVGhlIENsYXNzLW5hbWUgb2YgdGhlIFNvdXJjZUNvZGVcclxuICAgICAqIEBwYXJhbSBzb3VyY2VDb2RlIC0gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7U291cmNlUGFja2FnZX1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VDb2RlQ2xhc3NuYW1lLCBzb3VyY2VDb2RlKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2Ygc291cmNlQ29kZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlQ29kZUNsYXNzbmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VQYWNrYWdlKHNvdXJjZUNvZGVDbGFzc25hbWUsIHNvdXJjZUNvZGUpO1xyXG5cclxuICAgIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBDYXRhbG9ndWVEYXRhT2JqZWN0RmFjdG9yeTtcclxuIiwiLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignUnVudGltZUNhdGFsb2d1ZScpO1xyXG5cclxuaW1wb3J0IENhdGFsb2d1ZUZhY3RvcnkgZnJvbSAnLi9DYXRhbG9ndWVEYXRhT2JqZWN0RmFjdG9yeSc7XHJcblxyXG5jbGFzcyBSdW50aW1lQ2F0YWxvZ3VlIHtcclxuXHJcbiAgY29uc3RydWN0b3IocnVudGltZUZhY3RvcnksIG5hbWUsIHNjaGVtYSkge1xyXG4gICAgaWYgKCFydW50aW1lRmFjdG9yeSkgdGhyb3cgRXJyb3IoJ1RoZSBjYXRhbG9ndWUgbmVlZHMgdGhlIHJ1bnRpbWVGYWN0b3J5Jyk7XHJcblxyXG4gICAgdGhpcy5fZmFjdG9yeSA9IG5ldyBDYXRhbG9ndWVGYWN0b3J5KCk7XHJcbiAgICB0aGlzLmh0dHBSZXF1ZXN0ID0gcnVudGltZUZhY3RvcnkuY3JlYXRlSHR0cFJlcXVlc3QoKTtcclxuICAgIHRoaXMuYXRvYiA9IHJ1bnRpbWVGYWN0b3J5LmF0b2IgPyBydW50aW1lRmFjdG9yeS5hdG9iIDogYXRvYjtcclxuXHJcbiAgICBjb25zdCBzdG9yYWdlTmFtZSA9IG5hbWUgPyBuYW1lIDogJ3J1bnRpbWVDYXRhbG9ndWUnO1xyXG4gICAgY29uc3Qgc3RvcmFnZVNjaGVtYSA9IHNjaGVtYSA/IHNjaGVtYSA6ICcmY2d1aWQsIGFjY2Vzc0NvbnRyb2xQb2xpY3ksIGNvbnN0cmFpbnRzLCBkYXRhT2JqZWN0cywgaHlwZXJ0eVR5cGUsIG9iamVjdE5hbWUsIHNvdXJjZVBhY2thZ2UsIHZlcnNpb24nO1xyXG5cclxuICAgIGNvbnN0IHNjaGVtYXMgPSB7fTtcclxuICAgIHNjaGVtYXNbc3RvcmFnZU5hbWVdID0gc3RvcmFnZVNjaGVtYTtcclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyID0gcnVudGltZUZhY3Rvcnkuc3RvcmFnZU1hbmFnZXIoc3RvcmFnZU5hbWUsIHNjaGVtYXMpO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IGEgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0IChEZXNjcmlwdG9yKSBmcm9tIGEgVVJMLCBhbmQgY29uc3RydWN0IGl0IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRlc2NyaXB0b3JVUkwgLSBlLmcuIG15ZG9tYWluLmNvbS8ud2VsbC1rbm93bi9oeXBlcnR5L015SHlwZXJ0eVxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY3JlYXRlRnVuYyAtIGUuZy4gY3JlYXRlSHlwZXJ0eVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZ2V0RnVsbF0gLSB3aGV0aGVyIG9yIG5vdCB0byBnZXQgZGVzY3JpcHRvciB3aXRoIHNvdXJjZVBhY2thZ2UsIG9yIG9ubHkgdGhlIGRlc2NyaXB0b3IgcGFydFxyXG4gICAgICogQHBhcmFtIHtKU09OfSBjb25zdHJhaW50cyAtIGNvbnN0cmFpbnRzIG9iamVjdFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IC0gUHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpdGggdGhlIHJlcXVlc3RlZCBkZXNjcmlwdG9yIGluIHRoZSBhcHByb3ByaWF0ZSB0eXBlLlxyXG4gICAgICogSWYgY29uc3RyYWludHMgd2VyZSBwcm92aWRlZCwgYSBkZXNjcmlwdG9yIGlzIG9ubHkgcmV0dXJuZWQgaWYgaXQgbWVldHMgdGhlIGNvbnN0cmFpbnRzLCBvdGhlcndpc2UgdGhlIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cclxuICAgICAqL1xyXG4gIGdldERlc2NyaXB0b3IoZGVzY3JpcHRvclVSTCwgY3JlYXRlRnVuYywgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICBsb2cuaW5mbygnW1J1bnRpbWVDYXRhbG9ndWVdIC0gZ2V0dGluZyBkZXNjcmlwdG9yIGZyb206ICcsIGRlc2NyaXB0b3JVUkwsICcgd2l0aCBjb25zdHJhaW50czogJywgY29uc3RyYWludHMpO1xyXG5cclxuICAgIC8vIHNvbWUgZmxhZ3MgZm9yIG9wdGltaXphdGlvblxyXG4gICAgLy8gKGxhdGVyIHRoZSBkZXNjcmlwdG9yIHdpbGwgbm90IGJlIHNhdmVkIGluIGNhc2UgYm90aCBvZiB0aGVzZSBib29sZWFucyBhcmUgdHJ1ZSlcclxuICAgIGxldCBpc1NhdmVkRGVzY3JpcHRvciA9IGZhbHNlO1xyXG4gICAgbGV0IGlzQ29tcGxldGVEZXNjcmlwdG9yID0gZmFsc2U7XHJcblxyXG4gICAgLy8gZ2V0IHJhdyBkZXNjcmlwdG9yXHJcbiAgICAvLyBmaXJzdCBjaGVja3MgaWYgZGVzY3JpcHRvciBpcyBhbHJlYWR5IGluIGxvY2FsU3RvcmFnZSAoYmFzZWQgb24gY2d1aWQgYW5kIHZlcnNpb24pXHJcbiAgICBsZXQgZGVzY3JpcHRvclByb21pc2U7XHJcbiAgICBpZiAoY29uc3RyYWludHMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGRlc2NyaXB0b3JQcm9taXNlID0gUHJvbWlzZS5hbGwoW3RoaXMuaHR0cFJlcXVlc3QucG9zdChkZXNjcmlwdG9yVVJMICsgJy92ZXJzaW9uJywge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pLCB0aGlzLmh0dHBSZXF1ZXN0LnBvc3QoZGVzY3JpcHRvclVSTCArICcvY2d1aWQnLCB7Ym9keTogSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpfSldKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGVzY3JpcHRvclByb21pc2UgPSBQcm9taXNlLmFsbChbdGhpcy5odHRwUmVxdWVzdC5nZXQoZGVzY3JpcHRvclVSTCArICcvdmVyc2lvbicpLCB0aGlzLmh0dHBSZXF1ZXN0LmdldChkZXNjcmlwdG9yVVJMICsgJy9jZ3VpZCcpXSlcclxuICAgIH1cclxuICAgIGRlc2NyaXB0b3JQcm9taXNlID0gZGVzY3JpcHRvclByb21pc2UudGhlbigoW3ZlcnNpb24sIGNndWlkXSkgPT4ge1xyXG4gICAgICBsb2cubG9nKCdbUnVudGltZUNhdGFsb2d1ZS5nZXREZXNjcmlwdG9yXSAtIGdvdCB2ZXJzaW9uICgnICsgdmVyc2lvbiArICcpIGFuZCBjZ3VpZCAoJyArIGNndWlkICsgJykgZm9yIGRlc2NyaXB0b3IgJyArIGRlc2NyaXB0b3JVUkwpO1xyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgc2FtZSB2ZXJzaW9uIGlzIGNvbnRhaW5lZCBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0VmVyc2lvbignY2d1aWQnLCBjZ3VpZCkudGhlbigoZGJWZXJzaW9uKSA9PiB7XHJcbiAgICAgICAgaWYgKGRiVmVyc2lvbiA+PSB2ZXJzaW9uKSB7XHJcbiAgICAgICAgICBsb2cubG9nKCdbUnVudGltZUNhdGFsb2d1ZS5nZXREZXNjcmlwdG9yXSBsb2NhbCB2ZXJzaW9uIGlzIHVwZGF0ZWQgZm9yICcsIGRlc2NyaXB0b3JVUkwpO1xyXG4gICAgICAgICAgaXNTYXZlZERlc2NyaXB0b3IgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdjZ3VpZCcsIGNndWlkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9nLmxvZygnW1J1bnRpbWVDYXRhbG9ndWUuZ2V0RGVzY3JpcHRvcl0gbG9jYWwgdmVyc2lvbiBub3QgdXBkYXRlZCBmb3IgJywgZGVzY3JpcHRvclVSTCwgJyByZXRyaWV2aW5nIGZyb20gcmVtb3RlIGNhdGFsb2d1ZSAuLi4nKTtcclxuXHJcbiAgICAgICAgICAvLyBubyBzYXZlZCBjb3B5LCBwcm9jZWVkIHdpdGggcmV0cmlldmluZyBkZXNjcmlwdG9yXHJcbiAgICAgICAgICBsZXQgcmV0cmlldmVQcm9taXNlID0gY29uc3RyYWludHMgIT0gdW5kZWZpbmVkID8gdGhpcy5odHRwUmVxdWVzdC5wb3N0KGRlc2NyaXB0b3JVUkwsIHtib2R5OiBKU09OLnN0cmluZ2lmeShjb25zdHJhaW50cyl9KSA6IHRoaXMuaHR0cFJlcXVlc3QuZ2V0KGRlc2NyaXB0b3JVUkwpO1xyXG4gICAgICAgICAgcmV0dXJuIHJldHJpZXZlUHJvbWlzZS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBKU09OLnBhcnNlKGRlc2NyaXB0b3IpO1xyXG5cclxuICAgICAgICAgICAgLy9sb2cubG9nKFwiZ290IGRlc2NyaXB0b3I6XCIsIEpTT04uc3RyaW5naWZ5KGRlc2NyaXB0b3IsIG51bGwsIDIpKTtcclxuICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JbJ0VSUk9SJ10pIHtcclxuICAgICAgICAgICAgICAvLyBUT0RPIGhhbmRsZSBlcnJvciBwcm9wZXJseVxyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkZXNjcmlwdG9yKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgIGxldCBlcnJvclN0cmluZyA9ICdVbmFibGUgdG8gZ2V0IGRlc2NyaXB0b3IgZm9yICcgKyBkZXNjcmlwdG9yVVJMICsgKGNvbnN0cmFpbnRzICE9IHVuZGVmaW5lZCA/ICcgd2l0aCBjb25zdHJhaW50cyAnICsgY29uc3RyYWludHMgOiAnJykgKyAnOiAnICsgZXJyb3I7XHJcbiAgICAgIGxvZy5lcnJvcihlcnJvclN0cmluZyk7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclN0cmluZyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgcmV0dXJuUHJvbWlzZSA9IGRlc2NyaXB0b3JQcm9taXNlO1xyXG5cclxuICAgIC8vIGlmIGdldEZ1bGwsIGF0dGFjaCBzb3VyY2VQYWNrYWdlXHJcbiAgICBpZiAoZ2V0RnVsbCkge1xyXG4gICAgICBsb2cubG9nKCdhZGRpbmcgcHJvbWlzZSB0byBhdHRhY2ggc291cmNlUGFja2FnZScpO1xyXG4gICAgICByZXR1cm5Qcm9taXNlID0gZGVzY3JpcHRvclByb21pc2UudGhlbigoZGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgIGlmIChkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2UpIHtcclxuICAgICAgICAgIGlzQ29tcGxldGVEZXNjcmlwdG9yID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpc0NvbXBsZXRlRGVzY3JpcHRvciA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoUmF3U291cmNlUGFja2FnZShkZXNjcmlwdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmluYWxseSBjcmVhdGUgb2JqZWN0XHJcbiAgICByZXR1cm5Qcm9taXNlID0gcmV0dXJuUHJvbWlzZS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgIC8vIHN0b3JlIGlmIG5vdCBzYXZlZCBiZWZvcmUsIG9yIGlmIGZ1bGwgZGVzY3JpcHRvciB3YXMgcmVxdWVzdGVkIGFuZCBvbmx5IHBhcnRpYWwgZGVzY3JpcHRvciB3YXMgc3RvcmVkLlxyXG4gICAgICBpZiAoIWlzU2F2ZWREZXNjcmlwdG9yIHx8IChpc1NhdmVkRGVzY3JpcHRvciAmJiAhaXNDb21wbGV0ZURlc2NyaXB0b3IgJiYgZ2V0RnVsbCkpIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldChkZXNjcmlwdG9yLmNndWlkLCBkZXNjcmlwdG9yLnZlcnNpb24sIGRlc2NyaXB0b3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjcmVhdGVGdW5jLmFwcGx5KHRoaXMsIFtkZXNjcmlwdG9yLCBjb25zdHJhaW50c10pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJldHVyblByb21pc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICAqIFVzZXMgdGhlIHNvdXJjZVBhY2thZ2VVUkwgZnJvbSB0aGUgZGVzY3JpcHRvciwgcmVxdWVzdHMgdGhlIHNvdXJjZVBhY2thZ2UgYW5kIGF0dGFjaGVzIGl0IHRvIHRoZSBkZXNjcmlwdG9yLlxyXG4gICAgICogQHBhcmFtIHtDYXRhbG9ndWVEYXRhT2JqZWN0fSBkZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gLSBmdWxmaWxscyB3aXRoIGNvbXBsZXRlIGRlc2NyaXB0b3JcclxuICAgICAqL1xyXG4gIGF0dGFjaFJhd1NvdXJjZVBhY2thZ2UoZGVzY3JpcHRvciwgY29uc3RyYWludHMpIHtcclxuICAgIGxvZy5sb2coJ2F0dGFjaGluZyByYXcgc291cmNlUGFja2FnZSBmcm9tOicsIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZXQgcmV0cmlldmVQcm9taXNlID0gY29uc3RyYWludHMgIT0gdW5kZWZpbmVkID8gdGhpcy5odHRwUmVxdWVzdC5wb3N0KGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCwge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pIDogdGhpcy5odHRwUmVxdWVzdC5nZXQoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMKTtcclxuICAgICAgcmV0cmlldmVQcm9taXNlLnRoZW4oKHNvdXJjZVBhY2thZ2UpID0+IHtcclxuICAgICAgICBzb3VyY2VQYWNrYWdlID0gSlNPTi5wYXJzZShzb3VyY2VQYWNrYWdlKTtcclxuXHJcbiAgICAgICAgLy9kZWxldGUgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMO1xyXG4gICAgICAgIC8vbG9nLmxvZyhcImF0dGFjaGluZyBzb3VyY2VQYWNrYWdlOlwiLCBzb3VyY2VQYWNrYWdlKTtcclxuICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2UgPSBzb3VyY2VQYWNrYWdlO1xyXG4gICAgICAgIHJlc29sdmUoZGVzY3JpcHRvcik7XHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IEh5cGVydHlEZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0gaHlwZXJ0eVVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL2h5cGVydHkvTXlIeXBlcnR5XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZXRGdWxsXSAtIGJvb2xlYW4gdG8gZGVjaWRlIHRvIGdldCB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZSBzb3VyY2VQYWNrYWdlIG9yIChwb3RlbnRpYWxseSkgd2l0aG91dFxyXG4gICAgICogQHBhcmFtIHtKU09OfSBjb25zdHJhaW50cyAtIGNvbnN0cmFpbnRzIG9iamVjdFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XHJcbiAgICAgKi9cclxuICBnZXRIeXBlcnR5RGVzY3JpcHRvcihoeXBlcnR5VVJMLCBnZXRGdWxsID0gdHJ1ZSwgY29uc3RyYWludHMpIHtcclxuICAgIHJldHVybiB0aGlzLmdldERlc2NyaXB0b3IoaHlwZXJ0eVVSTCwgdGhpcy5jcmVhdGVIeXBlcnR5LCBnZXRGdWxsLCBjb25zdHJhaW50cylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IFN0dWJEZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0gc3R1YlVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL3Byb3Rvc3R1Yi9NeVByb3Rvc3R1YlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZ2V0RnVsbF0gLSBib29sZWFuIHRvIGRlY2lkZSB0byBnZXQgdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGUgc291cmNlUGFja2FnZSBvciAocG90ZW50aWFsbHkpIHdpdGhvdXRcclxuICAgICAqIEBwYXJhbSB7SlNPTn0gY29uc3RyYWludHMgLSBjb25zdHJhaW50cyBvYmplY3RcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG4gICAgICovXHJcbiAgZ2V0U3R1YkRlc2NyaXB0b3Ioc3R1YlVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKHN0dWJVUkwsIHRoaXMuY3JlYXRlU3R1YiwgZ2V0RnVsbCwgY29uc3RyYWludHMpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICAqIEdldCBSdW50aW1lRGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIHJ1bnRpbWVVUkwgLSBlLmcuIG15ZG9tYWluLmNvbS8ud2VsbC1rbm93bi9ydW50aW1lL015UnVudGltZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZ2V0RnVsbF0gLSBib29sZWFuIHRvIGRlY2lkZSB0byBnZXQgdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGUgc291cmNlUGFja2FnZSBvciAocG90ZW50aWFsbHkpIHdpdGhvdXRcclxuICAgICAqIEBwYXJhbSB7SlNPTn0gY29uc3RyYWludHMgLSBjb25zdHJhaW50cyBvYmplY3RcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG4gICAgICovXHJcbiAgZ2V0UnVudGltZURlc2NyaXB0b3IocnVudGltZVVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKHJ1bnRpbWVVUkwsIHRoaXMuY3JlYXRlUnVudGltZURlc2NyaXB0b3IsIGdldEZ1bGwsIGNvbnN0cmFpbnRzKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAgKiBHZXQgRGF0YVNjaGVtYURlc2NyaXB0b3JcclxuICAgICAqIEBwYXJhbSBkYXRhU2NoZW1hVVJMIC0gZS5nLiBteWRvbWFpbi5jb20vLndlbGwta25vd24vZGF0YXNjaGVtYS9NeURhdGFTY2hlbWFcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dldEZ1bGxdIC0gYm9vbGVhbiB0byBkZWNpZGUgdG8gZ2V0IHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIHNvdXJjZVBhY2thZ2Ugb3IgKHBvdGVudGlhbGx5KSB3aXRob3V0XHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cclxuICAgICAqL1xyXG4gIGdldERhdGFTY2hlbWFEZXNjcmlwdG9yKGRhdGFTY2hlbWFVUkwsIGdldEZ1bGwgPSB0cnVlLCBjb25zdHJhaW50cykge1xyXG5cclxuICAgIC8vICAgIHJldHVybiB0aGlzLmdldERlc2NyaXB0b3IoZGF0YVNjaGVtYVVSTCwgdGhpcy5jcmVhdGVEYXRhU2NoZW1hLCBnZXRGdWxsLCBjb25zdHJhaW50cylcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PiB7XHJcbiAgICAgIGxldCBzY2hlbWEgPSBkYXRhU2NoZW1hVVJMLnNwbGl0KCcvZGF0YXNjaGVtYS8nKVsxXTtcclxuICAgICAgbG9nLmxvZygnW1J1bnRpbWVDYXRhbG9ndWUuZ2V0RGF0YVNjaGVtYURlc2NyaXB0b3JdIHNjaGVtYSAnLCBzY2hlbWEpO1xyXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IHtcclxuICAgICAgICBzb3VyY2VQYWNrYWdlOiB7XHJcbiAgICAgICAgICBzb3VyY2VDb2RlOiB7XHJcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAvLyAgICAgIGxldCBzY2hlbWUgPSBwcm9wZXJ0aWVzLnNjaGVtZSA/IHByb3BlcnRpZXMuc2NoZW1lLmNvIDogW107XHJcbiAgXHJcbiAgICAgIHN3aXRjaCAoc2NoZW1hKSB7XHJcbiAgICAgICAgY2FzZSAnQ29udGV4dCc6XHJcbiAgICAgICAgY2FzZSAnQ29udGV4dFJlcG9ydGVyJzpcclxuICAgICAgICBjYXNlICdDb250ZXh0T2JzZXJ2ZXInOlxyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5zY2hlbWUgPSAnY29udGV4dCc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdDb25uZWN0aW9uJzpcclxuICAgICAgICAgIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlLnByb3BlcnRpZXMuc2NoZW1lID0gJ2Nvbm5lY3Rpb24nO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnV2FsbGV0RGF0YSc6XHJcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLnNjaGVtZSA9ICd3YWxsZXREYXRhJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0NvbW11bmljYXRpb24nOlxyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5zY2hlbWUgPSAnY29tbSc7XHJcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLmNoaWxkcmVucyA9IFsncmVzb3VyY2VzJ107XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdIZWxsb1dvcmxkRGF0YVNjaGVtYSc6XHJcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLnNjaGVtZSA9ICdoZWxsbyc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5zY2hlbWUgPSAncmVzb3VyY2UnO1xyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5jaGlsZHJlbnMgPSBbXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc29sdmUoZGVzY3JpcHRvcik7XHJcblxyXG4gICAgfSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IElEUFByb3h5RGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIGlkcFByb3h5VVJMIC0gZS5nLiBteWRvbWFpbi5jb20vLndlbGwta25vd24vaWRwLXByb3h5L015UHJveHlcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dldEZ1bGxdIC0gYm9vbGVhbiB0byBkZWNpZGUgdG8gZ2V0IHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIHNvdXJjZVBhY2thZ2Ugb3IgKHBvdGVudGlhbGx5KSB3aXRob3V0XHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cclxuICAgICAqL1xyXG4gIGdldElkcFByb3h5RGVzY3JpcHRvcihpZHBQcm94eVVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKGlkcFByb3h5VVJMLCB0aGlzLmNyZWF0ZUlkcFByb3h5LCBnZXRGdWxsLCBjb25zdHJhaW50cylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlEZXNjcmlwdG9yIGJhc2VkIG9uIHJhdyBvYmplY3QgdGhhdCBjb250YWlucyBpdHMgYXR0cmlidXRlc1xyXG4gICAgICogQHBhcmFtIHtKU09OfSByYXdIeXBlcnR5XHJcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eURlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICBjcmVhdGVIeXBlcnR5KHJhd0h5cGVydHkpIHtcclxuICAgIC8vbG9nLmxvZyhcImNyZWF0ZUh5cGVydHk6XCIsIHJhd0h5cGVydHkpO1xyXG4gICAgLy8gY3JlYXRlIHRoZSBkZXNjcmlwdG9yXHJcbiAgICBsZXQgaHlwZXJ0eSA9IHRoaXMuX2ZhY3RvcnkuY3JlYXRlSHlwZXJ0eURlc2NyaXB0b3JPYmplY3QoXHJcbiAgICAgIHJhd0h5cGVydHlbJ2NndWlkJ10sXHJcbiAgICAgIHJhd0h5cGVydHlbJ3ZlcnNpb24nXSxcclxuICAgICAgcmF3SHlwZXJ0eVsnb2JqZWN0TmFtZSddLFxyXG4gICAgICByYXdIeXBlcnR5WydkZXNjcmlwdGlvbiddLFxyXG4gICAgICByYXdIeXBlcnR5WydsYW5ndWFnZSddLFxyXG4gICAgICByYXdIeXBlcnR5Wydzb3VyY2VQYWNrYWdlVVJMJ10sXHJcbiAgICAgIHJhd0h5cGVydHlbJ3R5cGUnXSB8fCByYXdIeXBlcnR5WydoeXBlcnR5VHlwZSddLFxyXG4gICAgICByYXdIeXBlcnR5WydkYXRhT2JqZWN0cyddXHJcbiAgICApO1xyXG5cclxuICAgIC8vbG9nLmxvZyhcImZhY3RvcnkgcmV0dXJuZWQ6XCIsIGh5cGVydHkpO1xyXG5cclxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xyXG4gICAgaHlwZXJ0eS5jb25maWd1cmF0aW9uID0gcmF3SHlwZXJ0eVsnY29uZmlndXJhdGlvbiddO1xyXG4gICAgaHlwZXJ0eS5jb25zdHJhaW50cyA9IHJhd0h5cGVydHlbJ2NvbnN0cmFpbnRzJ107XHJcbiAgICBoeXBlcnR5Lm1lc3NhZ2VTY2hlbWEgPSByYXdIeXBlcnR5WydtZXNzYWdlU2NoZW1hJ107XHJcbiAgICBoeXBlcnR5LnBvbGljaWVzID0gcmF3SHlwZXJ0eVsncG9saWNpZXMnXTtcclxuICAgIGh5cGVydHkuc2lnbmF0dXJlID0gcmF3SHlwZXJ0eVsnc2lnbmF0dXJlJ107XHJcblxyXG4gICAgLy8gcGFyc2UgYW5kIGF0dGFjaCBzb3VyY2VQYWNrYWdlXHJcbiAgICBsZXQgc291cmNlUGFja2FnZSA9IHJhd0h5cGVydHlbJ3NvdXJjZVBhY2thZ2UnXTtcclxuICAgIGlmIChzb3VyY2VQYWNrYWdlKSB7XHJcbiAgICAgIGh5cGVydHkuc291cmNlUGFja2FnZSA9IHRoaXMuY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VQYWNrYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaHlwZXJ0eTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIFByb3RvY29sU3R1YkRlc2NyaXB0b3IgYmFzZWQgb24gcmF3IG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0cyBhdHRyaWJ1dGVzXHJcbiAgICAgKiBAcGFyYW0gcmF3U3R1YlxyXG4gICAgICogQHJldHVybnMge1Byb3RvY29sU3R1YkRlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICBjcmVhdGVTdHViKHJhd1N0dWIpIHtcclxuICAgIC8vIGxvZy5sb2coXCJjcmVhdGluZyBzdHViIGRlc2NyaXB0b3IgYmFzZWQgb246IFwiLCByYXdTdHViKTtcclxuXHJcbiAgICAvLyBjcmVhdGUgdGhlIGRlc2NyaXB0b3JcclxuICAgIGxldCBzdHViID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVQcm90b1N0dWJEZXNjcmlwdG9yT2JqZWN0KFxyXG4gICAgICByYXdTdHViWydjZ3VpZCddLFxyXG4gICAgICByYXdTdHViWyd2ZXJzaW9uJ10sXHJcbiAgICAgIHJhd1N0dWJbJ29iamVjdE5hbWUnXSxcclxuICAgICAgcmF3U3R1YlsnZGVzY3JpcHRpb24nXSxcclxuICAgICAgcmF3U3R1YlsnbGFuZ3VhZ2UnXSxcclxuICAgICAgcmF3U3R1Ylsnc291cmNlUGFja2FnZVVSTCddLFxyXG4gICAgICByYXdTdHViWydtZXNzYWdlU2NoZW1hcyddLFxyXG4gICAgICByYXdTdHViWydjb25maWd1cmF0aW9uJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2NvbnN0cmFpbnRzJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2h5cGVydHlUeXBlJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2RhdGFPYmplY3RzJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2ludGVyd29ya2luZyddLFxyXG4gICAgICByYXdTdHViWydpZHBQcm94eSddLFxyXG4gICAgICByYXdTdHViWydtdXR1YWxBdXRoZW50aWNhdGlvbiddXHJcbiAgICApO1xyXG5cclxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xyXG4gICAgc3R1Yi5zaWduYXR1cmUgPSByYXdTdHViWydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHRoZSBzb3VyY2VQYWNrYWdlXHJcbiAgICBsZXQgc291cmNlUGFja2FnZSA9IHJhd1N0dWJbJ3NvdXJjZVBhY2thZ2UnXTtcclxuICAgIGlmIChzb3VyY2VQYWNrYWdlKSB7XHJcbiAgICAgIHN0dWIuc291cmNlUGFja2FnZSA9IHRoaXMuY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VQYWNrYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3R1YjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlSdW50aW1lRGVzY3JpcHRvciBiYXNlZCBvbiByYXcgb2JqZWN0IHRoYXQgY29udGFpbnMgaXRzIGF0dHJpYnV0ZXNcclxuICAgICAqIEBwYXJhbSByYXdSdW50aW1lXHJcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yfVxyXG4gICAgICovXHJcbiAgY3JlYXRlUnVudGltZURlc2NyaXB0b3IocmF3UnVudGltZSkge1xyXG4gICAgLy8gcGFyc2UgY2FwYWJpbGl0aWVzIGZpcnN0XHJcbiAgICB0cnkge1xyXG4gICAgICByYXdSdW50aW1lWydoeXBlcnR5Q2FwYWJpbGl0aWVzJ10gPSBKU09OLnBhcnNlKHJhd1J1bnRpbWVbJ2h5cGVydHlDYXBhYmlsaXRpZXMnXSk7XHJcbiAgICAgIHJhd1J1bnRpbWVbJ3Byb3RvY29sQ2FwYWJpbGl0aWVzJ10gPSBKU09OLnBhcnNlKHJhd1J1bnRpbWVbJ3Byb3RvY29sQ2FwYWJpbGl0aWVzJ10pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyBhbHJlYWR5IGpzb24gb2JqZWN0XHJcbiAgICB9XHJcblxyXG4gICAgLy9sb2cubG9nKFwiY3JlYXRpbmcgcnVudGltZSBkZXNjcmlwdG9yIGJhc2VkIG9uOiBcIiwgcmF3UnVudGltZSk7XHJcblxyXG5cclxuICAgIC8vIGNyZWF0ZSB0aGUgZGVzY3JpcHRvclxyXG4gICAgbGV0IHJ1bnRpbWUgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZUh5cGVydHlSdW50aW1lRGVzY3JpcHRvck9iamVjdChcclxuICAgICAgcmF3UnVudGltZVsnY2d1aWQnXSxcclxuICAgICAgcmF3UnVudGltZVsndmVyc2lvbiddLFxyXG4gICAgICByYXdSdW50aW1lWydvYmplY3ROYW1lJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ2Rlc2NyaXB0aW9uJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ2xhbmd1YWdlJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ3NvdXJjZVBhY2thZ2VVUkwnXSxcclxuICAgICAgcmF3UnVudGltZVsndHlwZSddIHx8IHJhd1J1bnRpbWVbJ3J1bnRpbWVUeXBlJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ2h5cGVydHlDYXBhYmlsaXRpZXMnXSxcclxuICAgICAgcmF3UnVudGltZVsncHJvdG9jb2xDYXBhYmlsaXRpZXMnXSxcclxuICAgICAgcmF3UnVudGltZVsncDJwSGFuZGxlclN0dWInXSxcclxuICAgICAgcmF3UnVudGltZVsncDJwUmVxdWVzdGVyU3R1YiddXHJcbiAgICApO1xyXG5cclxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xyXG4gICAgcnVudGltZS5zaWduYXR1cmUgPSByYXdSdW50aW1lWydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHNvdXJjZVBhY2thZ2VcclxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gcmF3UnVudGltZVsnc291cmNlUGFja2FnZSddO1xyXG4gICAgaWYgKHNvdXJjZVBhY2thZ2UpIHtcclxuICAgICAgLy8gbG9nLmxvZyhcInJ1bnRpbWUgaGFzIHNvdXJjZVBhY2thZ2U6XCIsIHNvdXJjZVBhY2thZ2UpO1xyXG4gICAgICBydW50aW1lLnNvdXJjZVBhY2thZ2UgPSB0aGlzLmNyZWF0ZVNvdXJjZVBhY2thZ2Uoc291cmNlUGFja2FnZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnVudGltZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIERhdGFPYmplY3RTY2hlbWEgYmFzZWQgb24gcmF3IG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0cyBhdHRyaWJ1dGVzXHJcbiAgICAgKiBAcGFyYW0gcmF3U2NoZW1hXHJcbiAgICAgKiBAcmV0dXJucyB7RGF0YU9iamVjdFNjaGVtYX1cclxuICAgICAqL1xyXG4gIGNyZWF0ZURhdGFTY2hlbWEocmF3U2NoZW1hKSB7XHJcbiAgICAvL2xvZy5sb2coXCJjcmVhdGluZyBkYXRhU2NoZW1hIGJhc2VkIG9uOiBcIiwgcmF3U2NoZW1hKTtcclxuXHJcbiAgICBsZXQgZGF0YVNjaGVtYTtcclxuXHJcbiAgICAvL2xvZy5sb2coJzEuIGNyZWF0ZU1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hOiAnLCByYXdTY2hlbWFbXCJhY2Nlc3NDb250cm9sUG9saWN5XCJdKTtcclxuICAgIC8vbG9nLmxvZygnMi4gY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWE6ICcsIHJhd1NjaGVtYVtcInNjaGVtZVwiXSk7XHJcbiAgICBpZiAocmF3U2NoZW1hWydhY2Nlc3NDb250cm9sUG9saWN5J10gJiYgcmF3U2NoZW1hWydzY2hlbWUnXSkge1xyXG4gICAgICBkYXRhU2NoZW1hID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVIeXBlcnR5RGF0YU9iamVjdFNjaGVtYShcclxuICAgICAgICByYXdTY2hlbWFbJ2NndWlkJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWyd2ZXJzaW9uJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWydvYmplY3ROYW1lJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWydkZXNjcmlwdGlvbiddLFxyXG4gICAgICAgIHJhd1NjaGVtYVsnbGFuZ3VhZ2UnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ3NvdXJjZVBhY2thZ2VVUkwnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ2FjY2Vzc0NvbnRyb2xQb2xpY3knXSxcclxuICAgICAgICByYXdTY2hlbWFbJ3NjaGVtZSddXHJcbiAgICAgIClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vbG9nLmxvZygnMy4gY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWE6ICcsIHJhd1NjaGVtYSk7XHJcbiAgICAgIGRhdGFTY2hlbWEgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZU1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hKFxyXG4gICAgICAgIHJhd1NjaGVtYVsnY2d1aWQnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ3ZlcnNpb24nXSxcclxuICAgICAgICByYXdTY2hlbWFbJ29iamVjdE5hbWUnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ2Rlc2NyaXB0aW9uJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWydsYW5ndWFnZSddLFxyXG4gICAgICAgIHJhd1NjaGVtYVsnc291cmNlUGFja2FnZVVSTCddXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvLyBvcHRpb25hbCBmaWVsZHNcclxuICAgIGRhdGFTY2hlbWEuc2lnbmF0dXJlID0gcmF3U2NoZW1hWydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHNvdXJjZVBhY2thZ2VcclxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gcmF3U2NoZW1hWydzb3VyY2VQYWNrYWdlJ107XHJcbiAgICBpZiAoc291cmNlUGFja2FnZSkge1xyXG4gICAgICAvL2xvZy5sb2coXCJkYXRhU2NoZW1hIGhhcyBzb3VyY2VQYWNrYWdlOlwiLCBzb3VyY2VQYWNrYWdlKTtcclxuICAgICAgZGF0YVNjaGVtYS5zb3VyY2VQYWNrYWdlID0gdGhpcy5jcmVhdGVTb3VyY2VQYWNrYWdlKHNvdXJjZVBhY2thZ2UpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBkYXRhU2NoZW1hLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZSA9IEpTT04ucGFyc2UoZGF0YVNjaGVtYS5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbG9nLmxvZygnRGF0YVNjaGVtYSBTb3VyY2UgY29kZSBpcyBhbHJlYWR5IHBhcnNlZCcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9sb2cubG9nKFwiY3JlYXRlZCBkYXRhU2NoZW1hIGRlc2NyaXB0b3Igb2JqZWN0OlwiLCBkYXRhU2NoZW1hKTtcclxuICAgIHJldHVybiBkYXRhU2NoZW1hO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAgKiBDcmVhdGUgUHJvdG9jb2xTdHViRGVzY3JpcHRvciBiYXNlZCBvbiByYXcgb2JqZWN0IHRoYXQgY29udGFpbnMgaXRzIGF0dHJpYnV0ZXNcclxuICAgICAqIEBwYXJhbSByYXdQcm94eVxyXG4gICAgICogQHJldHVybnMge1Byb3RvY29sU3R1YkRlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICBjcmVhdGVJZHBQcm94eShyYXdQcm94eSkge1xyXG4gICAgLy8gbG9nLmxvZyhcImNyZWF0aW5nIGlkcHByb3h5IGRlc2NyaXB0b3IgYmFzZWQgb246IFwiLCByYXdQcm94eSk7XHJcblxyXG4gICAgLy8gY3JlYXRlIHRoZSBkZXNjcmlwdG9yXHJcbiAgICBsZXQgaWRwcHJveHkgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZVByb3RvU3R1YkRlc2NyaXB0b3JPYmplY3QoXHJcbiAgICAgIHJhd1Byb3h5WydjZ3VpZCddLFxyXG4gICAgICByYXdQcm94eVsndmVyc2lvbiddLFxyXG4gICAgICByYXdQcm94eVsnb2JqZWN0TmFtZSddLFxyXG4gICAgICByYXdQcm94eVsnZGVzY3JpcHRpb24nXSxcclxuICAgICAgcmF3UHJveHlbJ2xhbmd1YWdlJ10sXHJcbiAgICAgIHJhd1Byb3h5Wydzb3VyY2VQYWNrYWdlVVJMJ10sXHJcbiAgICAgIHJhd1Byb3h5WydtZXNzYWdlU2NoZW1hcyddLFxyXG4gICAgICByYXdQcm94eVsnY29uZmlndXJhdGlvbiddLFxyXG4gICAgICByYXdQcm94eVsnY29uc3RyYWludHMnXSxcclxuICAgICAgcmF3UHJveHlbJ2h5cGVydHlUeXBlJ10sXHJcbiAgICAgIHJhd1Byb3h5WydkYXRhT2JqZWN0cyddLFxyXG4gICAgICByYXdQcm94eVsnaW50ZXJ3b3JraW5nJ10sXHJcbiAgICAgIHJhd1Byb3h5WydpZHBQcm94eSddLFxyXG4gICAgICByYXdQcm94eVsnbXV0dWFsQXV0aGVudGljYXRpb24nXVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBvcHRpb25hbCBmaWVsZHNcclxuICAgIGlkcHByb3h5LnNpZ25hdHVyZSA9IHJhd1Byb3h5WydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHRoZSBzb3VyY2VQYWNrYWdlXHJcbiAgICBsZXQgc291cmNlUGFja2FnZSA9IHJhd1Byb3h5Wydzb3VyY2VQYWNrYWdlJ107XHJcbiAgICBpZiAoc291cmNlUGFja2FnZSkge1xyXG4gICAgICBzb3VyY2VQYWNrYWdlID0gdGhpcy5jcmVhdGVTb3VyY2VQYWNrYWdlKHNvdXJjZVBhY2thZ2UpO1xyXG4gICAgICBpZHBwcm94eS5zb3VyY2VQYWNrYWdlID0gc291cmNlUGFja2FnZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaWRwcHJveHk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTb3VyY2VQYWNrYWdlKHNwKSB7XHJcbiAgICAvL2xvZy5sb2coXCJjcmVhdGVTb3VyY2VQYWNrYWdlOlwiLCBzcCk7XHJcblxyXG4gICAgLy8gY2hlY2sgZW5jb2RpbmdcclxuICAgIGlmIChzcFsnZW5jb2RpbmcnXSA9PT0gJ2Jhc2U2NCcpIHtcclxuICAgICAgc3BbJ3NvdXJjZUNvZGUnXSA9IHRoaXMuYXRvYihzcFsnc291cmNlQ29kZSddKTtcclxuICAgICAgc3BbJ2VuY29kaW5nJ10gPSAndXRmLTgnO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVTb3VyY2VQYWNrYWdlKHNwWydzb3VyY2VDb2RlQ2xhc3NuYW1lJ10sIHNwWydzb3VyY2VDb2RlJ10pO1xyXG4gICAgaWYgKHNwWydlbmNvZGluZyddKVxyXG4gICAgICBzb3VyY2VQYWNrYWdlLmVuY29kaW5nID0gc3BbJ2VuY29kaW5nJ107XHJcblxyXG4gICAgaWYgKHNwWydzaWduYXR1cmUnXSlcclxuICAgICAgc291cmNlUGFja2FnZS5zaWduYXR1cmUgPSBzcFsnc2lnbmF0dXJlJ107XHJcblxyXG4gICAgcmV0dXJuIHNvdXJjZVBhY2thZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICAqIEdldCBzb3VyY2UgUGFja2FnZSBmcm9tIGEgVVJMXHJcbiAgICAgKiBAcGFyYW0gc291cmNlUGFja2FnZVVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL2h5cGVydHkvTXlIeXBlcnR5L3NvdXJjZVBhY2thZ2VcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG4gICAgICovXHJcbiAgZ2V0U291cmNlUGFja2FnZUZyb21VUkwoc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgbG9nLmxvZygnZ2V0dGluZyBzb3VyY2VQYWNrYWdlIGZyb206Jywgc291cmNlUGFja2FnZVVSTCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5odHRwUmVxdWVzdC5nZXQoc291cmNlUGFja2FnZVVSTCkudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgLy9sb2cubG9nKFwiZ290IHJhdyBzb3VyY2VQYWNrYWdlOlwiLCByZXN1bHQpO1xyXG4gICAgICAgIGlmIChyZXN1bHRbJ0VSUk9SJ10pIHtcclxuICAgICAgICAgIC8vIFRPRE8gaGFuZGxlIGVycm9yIHByb3Blcmx5XHJcbiAgICAgICAgICByZWplY3QocmVzdWx0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xyXG4gICAgICAgICAgbGV0IHNvdXJjZVBhY2thZ2UgPSB0aGlzLmNyZWF0ZVNvdXJjZVBhY2thZ2UocmVzdWx0KTtcclxuICAgICAgICAgIHJlc29sdmUoc291cmNlUGFja2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlQ29kZSBvZiBhIGdpdmVuIGRlc2NyaXB0b3JcclxuICAgICAqIEBwYXJhbSB7Q2F0YWxvZ3VlRGF0YU9iamVjdH0gZGVzY3JpcHRvciAtIENhdGFsb2d1ZSBPYmplY3QgdGhhdCB3YXMgcmV0cmlldmVkIHVzaW5nIGUuZy4gZ2V0SHlwZXJ0eURlc2NyaXB0b3IoKVxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XHJcbiAgICAgKi9cclxuICBnZXRTb3VyY2VDb2RlRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZSkge1xyXG4gICAgICAgIC8vbG9nLmxvZyhcImRlc2NyaXB0b3IgaGFzIHNvdXJjZVBhY2thZ2VcIik7XHJcbiAgICAgICAgLy9sb2cubG9nKFwicmV0dXJuaW5nIHNvdXJjZUNvZGU6XCIsIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlKTtcclxuICAgICAgICByZXNvbHZlKGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldFZlcnNpb24oZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMICsgJy9zb3VyY2VDb2RlJykudGhlbigoZGJWZXJzaW9uKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGJWZXJzaW9uID49IGRlc2NyaXB0b3IudmVyc2lvbikge1xyXG4gICAgICAgICAgICBsb2cubG9nKCdyZXR1cm5pbmcgY2FjaGVkIHZlcnNpb24gZnJvbSBzdG9yYWdlTWFuYWdlcicpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldChkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2VVUkwgKyAnL3NvdXJjZUNvZGUnKS50aGVuKChzb3VyY2VDb2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShzb3VyY2VDb2RlKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHR0cFJlcXVlc3QuZ2V0KGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCArICcvc291cmNlQ29kZScpLnRoZW4oKHNvdXJjZUNvZGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoc291cmNlQ29kZVsnRVJST1InXSkge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBoYW5kbGUgZXJyb3IgcHJvcGVybHlcclxuICAgICAgICAgICAgICAgIHJlamVjdChzb3VyY2VDb2RlKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMICsgJy9zb3VyY2VDb2RlJywgZGVzY3JpcHRvci52ZXJzaW9uLCBzb3VyY2VDb2RlKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoc291cmNlQ29kZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY2F0YWxvZ3VlIG9iamVjdHMgZm9yIHRoZSBnaXZlbiBcInR5cGUgVVJMXCIsXHJcbiAgICAgKiBpLmUuIGEgY2F0YWxvZ3VlIFVSTCB0aGF0IHNwZWNpZmllcyBhIHR5cGUsIGJ1dCBubyBjYXRhbG9ndWUgb2JqZWN0IG5hbWUuXHJcbiAgICAgKiBAcGFyYW0gdHlwZVVSTCAtIFVSTCBwb2ludGluZyB0byB0aGUgY2F0YWxvZ3VlIG9iamVjdCB0eXBlIHlvdSB3YW50IGEgbGlzdCBvZiBhdmFpbGFibGUgb2JqZWN0cyBmb3IsXHJcbiAgICAgKiBlLmcuIGh5cGVydHktY2F0YWxvZ3VlOi8vY2F0YWxvZ3VlLmZva3VzLmZyYXVuaG9mZXIuZGUvLndlbGwta25vd24vaWRwLXByb3h5XHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gdHlwZUxpc3RQcm9taXNlIC0gUHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpdGggdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNhdGFsb2d1ZSBvYmplY3QgbmFtZXMgZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZSxcclxuICAgICAqIHJlamVjdHMgb24gSFRUUCBlcnJvciBvciBpZiB0aGUgSFRUUCByZXNwb25zZSBpcyBub3QgaW4gSlNPTi5cclxuICAgICAqIElmIGNvbnN0cmFpbnRzIHdlcmUgcHJvdmlkZWQsIHRoZW4gdGhlIGxpc3Qgb25seSBjb250YWlucyB0aG9zZSBvYmplY3RzIHRoYXQgbWVldCB0aGUgY29uc3RyYWludHNcclxuICAgICAqL1xyXG4gIGdldFR5cGVMaXN0KHR5cGVVUkwsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZXQgcmVxdWVzdFByb21pc2UgPSBjb25zdHJhaW50cyAhPSB1bmRlZmluZWQgPyB0aGlzLmh0dHBSZXF1ZXN0LnBvc3QodHlwZVVSTCwge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pIDogdGhpcy5odHRwUmVxdWVzdC5nZXQodHlwZVVSTCk7XHJcbiAgICAgIHJlcXVlc3RQcm9taXNlLnRoZW4oKHR5cGVMaXN0KSA9PiB7XHJcbiAgICAgICAgdHlwZUxpc3QgPSBKU09OLnBhcnNlKHR5cGVMaXN0KTtcclxuICAgICAgICByZXNvbHZlKHR5cGVMaXN0KTtcclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJ1bnRpbWVVUkwocnVudGltZVVSTCkge1xyXG4gICAgdGhpcy5fcnVudGltZVVSTCA9IHJ1bnRpbWVVUkw7XHJcbiAgfVxyXG5cclxuICBnZXQgcnVudGltZVVSTCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ydW50aW1lVVJMO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlRnJvbVBNKHVybCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZGVsZXRlKHVybCk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUnVudGltZUNhdGFsb2d1ZTtcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7O0FBRkE7QUFVQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQTNCQTtBQUNBO0FBREE7QUFBQTtBQStCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2REE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFFQTs7Ozs7QUFJQTs7Ozs7QUFDQTs7Ozs7Ozs7Ozs7OztBQWFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQVhBO0FBWUE7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFrREE7QUFDQTtBQUVBOzs7QUFuREE7QUFDQTtBQUNBO0FBbURBO0FBQ0E7QUFFQTs7O0FBcERBO0FBQ0E7QUFDQTtBQW9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUF0REE7QUFDQTtBQUNBO0FBc0RBO0FBQ0E7QUFFQTs7O0FBdkRBO0FBQ0E7QUFDQTtBQXVEQTtBQUNBO0FBRUE7OztBQXhEQTtBQUNBO0FBQ0E7QUF3REE7QUFDQTtBQUVBOzs7QUF6REE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUFBOzs7O0FBSUE7QUFDQTtBQUVBOzs7QUFqQkE7QUFDQTtBQUNBO0FBaUJBO0FBQ0E7QUFFQTs7O0FBbEJBO0FBQ0E7QUFDQTtBQWlEQTtBQUNBO0FBRUE7Ozs7QUFuSEE7QUFzSEE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRkE7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUlBOzs7Ozs7OztBQzNKQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7OztBQUdBOzs7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQXdCQTtBQUNBO0FBRUE7OztBQXpCQTtBQUNBO0FBQ0E7QUF5QkE7QUFDQTtBQUVBOzs7QUExQkE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBOzs7QUFQQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7Ozs7OztBQWFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFUQTtBQVVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQXNCQTtBQUNBO0FBRUE7OztBQXZCQTtBQUNBO0FBQ0E7QUF1QkE7QUFDQTtBQUVBOzs7QUF4QkE7QUFDQTtBQUNBO0FBd0JBO0FBQ0E7QUFFQTs7O0FBekJBO0FBQ0E7QUFDQTtBQXlCQTtBQUNBO0FBRUE7OztBQTFCQTtBQUNBO0FBQ0E7QUEwQkE7QUFDQTtBQUVBOzs7QUEzQkE7QUFDQTtBQUNBO0FBMkJBO0FBQ0E7QUFFQTs7OztBQWhGQTtBQUNBO0FBb0ZBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFEQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JIQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7OztBQUlBO0FBQ0E7QUFDQTs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBS0E7QUFLQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBeEJBO0FBMEJBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQVVBO0FBQ0E7QUFFQTs7O0FBWEE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUVBOzs7QUFaQTtBQUNBO0FBQ0E7QUFZQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBL0ZBO0FBQ0E7QUFpR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0hBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7O0FBSUE7QUFDQTtBQUNBOzs7OztBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFJQTtBQUtBO0FBQ0E7QUFmQTtBQWdCQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFVQTtBQUNBO0FBRUE7OztBQVhBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFFQTs7O0FBWkE7QUFDQTtBQUNBO0FBWUE7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQTlEQTtBQWlFQTs7Ozs7QUFHQTtBQUFBO0FBQUE7QUFDQTs7Ozs7Ozs7QUFRQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQTtBQUFBO0FBQUE7QUFzQ0E7QUFDQTtBQXZDQTtBQUFBO0FBQUE7QUFrQkE7QUFDQTtBQW5CQTtBQUFBO0FBQUE7QUFzQkE7QUFDQTtBQXZCQTtBQUFBO0FBQUE7QUEwQkE7QUFDQTtBQTNCQTtBQUFBO0FBQUE7QUE4QkE7QUFDQTtBQS9CQTtBQUFBO0FBQUE7QUFrQ0E7QUFDQTtBQW5DQTtBQUNBO0FBREE7QUFBQTtBQTJDQTs7OztBQUdBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7Ozs7QUFTQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbkJBO0FBQUE7QUFBQTtBQXFCQTtBQUNBO0FBdEJBO0FBQUE7QUFBQTtBQXlCQTtBQUNBO0FBMUJBO0FBQUE7QUFBQTtBQTZCQTtBQUNBO0FBOUJBO0FBQUE7QUFBQTtBQWlDQTtBQUNBO0FBbENBO0FBQUE7QUFBQTtBQXFDQTtBQUNBO0FBdENBO0FBQUE7QUFBQTtBQXlDQTtBQUNBO0FBMUNBO0FBQUE7QUFBQTtBQTZDQTtBQUNBO0FBOUNBO0FBQUE7QUFBQTtBQWtEQTtBQUNBO0FBbkRBO0FBQ0E7QUFEQTtBQUFBO0FBc0RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZNQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBSkE7QUFLQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7OztBQVZBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQWxCQTtBQUNBO0FBd0JBOzs7Ozs7Ozs7Ozs7Ozs7O0FDckRBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7O0FBSUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBSkE7QUFBQTtBQUNBO0FBUUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUpBO0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUhBO0FBSUE7QUFDQTtBQU5BO0FBQUE7QUFDQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFKQTtBQUFBO0FBTUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUpBO0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBSkE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFKQTtBQUFBO0FBTUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBSUE7Ozs7Ozs7O0FDakZBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTs7Ozs7Ozs7OztBQUVBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFVQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFFQTtBQVdBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBRUE7QUFZQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBRUE7QUFXQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQVlBO0FBRUE7QUFVQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQVVBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFVQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQVlBO0FBRUE7QUFZQTtBQVlBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFNQTtBQUVBOzs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQzVTQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7QUFTQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBREE7QUFEQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUF0QkE7QUFDQTtBQXVCQTtBQUVBO0FBR0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQWFBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFnQkE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQWFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFnQkE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBR0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FBVUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFVQTtBQUNBO0FBQ0E7OztBQVZBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7O0FBUUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///22\n')}})}); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("RuntimeCatalogue",[],t):"object"==typeof exports?exports.RuntimeCatalogue=t():e.RuntimeCatalogue=t()}(window,function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=22)}({1:function(e,t,r){var n,i;!function(o,a){"use strict";void 0===(i="function"==typeof(n=function(){var e=function(){},t="undefined",r=["trace","debug","info","warn","error"];function n(e,t){var r=e[t];if("function"==typeof r.bind)return r.bind(e);try{return Function.prototype.bind.call(r,e)}catch(t){return function(){return Function.prototype.apply.apply(r,[e,arguments])}}}function i(t,n){for(var i=0;i=0&&n<=u.levels.SILENT))throw"log.setLevel() called with invalid level: "+n;if(s=n,!1!==o&&function(e){var n=(r[e]||"silent").toUpperCase();if(typeof window!==t){try{return void(window.localStorage[c]=n)}catch(e){}try{window.document.cookie=encodeURIComponent(c)+"="+n+";"}catch(e){}}}(n),i.call(u,n,e),typeof console===t&&n>>0;if(0===r)return-1;var n=0;if(arguments.length>1&&((n=Number(arguments[1]))!=n?n=0:0!==n&&n!==1/0&&n!==-1/0&&(n=(n>0||-1)*Math.floor(Math.abs(n)))),n>=r)return-1;for(var i=n>=0?n:Math.max(r-Math.abs(n),0);i0&&(t+=l.suffices["*"]&&o||",",l.suffices["*"]&&u&&(t+=l.name+"=")),t+=s?encodeURIComponent(f[p]).replace(/!/g,"%21"):r(f[p])}else if("object"==typeof f){u&&!l.suffices["*"]&&(t+=l.name+"=");var y=!0;for(var d in f)y||(t+=l.suffices["*"]&&o||","),y=!1,t+=s?encodeURIComponent(d).replace(/!/g,"%21"):r(d),t+=l.suffices["*"]?"=":",",t+=s?encodeURIComponent(f[d]).replace(/!/g,"%21"):r(f[d])}else u&&(t+=l.name,c&&""===f||(t+="=")),null!=l.truncate&&(f=f.substring(0,l.truncate)),t+=s?encodeURIComponent(f).replace(/!/g,"%21"):r(f)}return t};return _.varNames=l,{prefix:a,substitution:_}}function i(e){if(!(this instanceof i))return new i(e);for(var t=e.split("{"),r=[t.shift()],o=[],a=[],s=[];t.length>0;){var u=t.shift(),c=u.split("}")[0],l=u.substring(c.length+1),f=n(c);a.push(f.substitution),o.push(f.prefix),r.push(l),s=s.concat(f.substitution.varNames)}this.fill=function(e){for(var t=r[0],n=0;n0&&"/"===t.charAt(e.length-1)||"#"===r.charAt(0)||"?"===r.charAt(0))return!0}return!1}(t,e.id)&&void 0===this.schemas[e.id]&&(this.schemas[e.id]=e),e)if("enum"!==n)if("object"==typeof e[n])this.searchSchemas(e[n],t);else if("$ref"===n){var i=f(e[n]);i&&void 0===this.schemas[i]&&void 0===this.missingMap[i]&&(this.missingMap[i]=i)}},o.prototype.addSchema=function(e,t){if("string"!=typeof e||void 0===t){if("object"!=typeof e||"string"!=typeof e.id)return;e=(t=e).id}e===f(e)+"#"&&(e=f(e)),this.schemas[e]=t,delete this.missingMap[e],h(t,e),this.searchSchemas(t,e)},o.prototype.getSchemaMap=function(){var e={};for(var t in this.schemas)e[t]=this.schemas[t];return e},o.prototype.getSchemaUris=function(e){var t=[];for(var r in this.schemas)e&&!e.test(r)||t.push(r);return t},o.prototype.getMissingUris=function(e){var t=[];for(var r in this.missingMap)e&&!e.test(r)||t.push(r);return t},o.prototype.dropSchemas=function(){this.schemas={},this.reset()},o.prototype.reset=function(){this.missing=[],this.missingMap={},this.errors=[]},o.prototype.validateAll=function(e,t,r,n,i){var o;if(!(t=this.resolveRefs(t)))return null;if(t instanceof v)return this.errors.push(t),t;var a,s=this.errors.length,u=null,c=null;if(this.checkRecursive&&e&&"object"==typeof e){if(o=!this.scanned.length,e[this.validatedSchemasKey]){var l=e[this.validatedSchemasKey].indexOf(t);if(-1!==l)return this.errors=this.errors.concat(e[this.validationErrorsKey][l]),null}if(Object.isFrozen(e)&&-1!==(a=this.scannedFrozen.indexOf(e))){var f=this.scannedFrozenSchemas[a].indexOf(t);if(-1!==f)return this.errors=this.errors.concat(this.scannedFrozenValidationErrors[a][f]),null}if(this.scanned.push(e),Object.isFrozen(e))-1===a&&(a=this.scannedFrozen.length,this.scannedFrozen.push(e),this.scannedFrozenSchemas.push([])),u=this.scannedFrozenSchemas[a].length,this.scannedFrozenSchemas[a][u]=t,this.scannedFrozenValidationErrors[a][u]=[];else{if(!e[this.validatedSchemasKey])try{Object.defineProperty(e,this.validatedSchemasKey,{value:[],configurable:!0}),Object.defineProperty(e,this.validationErrorsKey,{value:[],configurable:!0})}catch(t){e[this.validatedSchemasKey]=[],e[this.validationErrorsKey]=[]}c=e[this.validatedSchemasKey].length,e[this.validatedSchemasKey][c]=t,e[this.validationErrorsKey][c]=[]}}var h=this.errors.length,p=this.validateBasic(e,t,i)||this.validateNumeric(e,t,i)||this.validateString(e,t,i)||this.validateArray(e,t,i)||this.validateObject(e,t,i)||this.validateCombinations(e,t,i)||this.validateHypermedia(e,t,i)||this.validateFormat(e,t,i)||this.validateDefinedKeywords(e,t,i)||null;if(o){for(;this.scanned.length;){delete this.scanned.pop()[this.validatedSchemasKey]}this.scannedFrozen=[],this.scannedFrozenSchemas=[]}if(p||h!==this.errors.length)for(;r&&r.length||n&&n.length;){var y=r&&r.length?""+r.pop():null,d=n&&n.length?""+n.pop():null;p&&(p=p.prefixWith(y,d)),this.prefixErrors(h,y,d)}return null!==u?this.scannedFrozenValidationErrors[a][u]=this.errors.slice(s):null!==c&&(e[this.validationErrorsKey][c]=this.errors.slice(s)),this.handleError(p)},o.prototype.validateFormat=function(e,t){if("string"!=typeof t.format||!this.formatValidators[t.format])return null;var r=this.formatValidators[t.format].call(null,e,t);return"string"==typeof r||"number"==typeof r?this.createError(y.FORMAT_CUSTOM,{message:r},"","/format",null,e,t):r&&"object"==typeof r?this.createError(y.FORMAT_CUSTOM,{message:r.message||"?"},r.dataPath||"",r.schemaPath||"/format",null,e,t):null},o.prototype.validateDefinedKeywords=function(e,t,r){for(var n in this.definedKeywords)if(void 0!==t[n])for(var i=this.definedKeywords[n],o=0;o=s&&nt.maximum)return this.createError(y.NUMBER_MAXIMUM,{value:e,maximum:t.maximum},"","/maximum",null,e,t);if(t.exclusiveMaximum&&e===t.maximum)return this.createError(y.NUMBER_MAXIMUM_EXCLUSIVE,{value:e,maximum:t.maximum},"","/exclusiveMaximum",null,e,t)}return null},o.prototype.validateNaN=function(e,t){return"number"!=typeof e?null:!0===isNaN(e)||e===1/0||e===-1/0?this.createError(y.NUMBER_NOT_A_NUMBER,{value:e},"","/type",null,e,t):null},o.prototype.validateString=function(e,t,r){return this.validateStringLength(e,t,r)||this.validateStringPattern(e,t,r)||null},o.prototype.validateStringLength=function(e,t){return"string"!=typeof e?null:void 0!==t.minLength&&e.lengtht.maxLength?this.createError(y.STRING_LENGTH_LONG,{length:e.length,maximum:t.maxLength},"","/maxLength",null,e,t):null},o.prototype.validateStringPattern=function(e,t){if("string"!=typeof e||"string"!=typeof t.pattern&&!(t.pattern instanceof RegExp))return null;var r;if(t.pattern instanceof RegExp)r=t.pattern;else{var n,i="",o=t.pattern.match(/^\/(.+)\/([img]*)$/);o?(n=o[1],i=o[2]):n=t.pattern,r=new RegExp(n,i)}return r.test(e)?null:this.createError(y.STRING_PATTERN,{pattern:t.pattern},"","/pattern",null,e,t)},o.prototype.validateArray=function(e,t,r){return Array.isArray(e)&&(this.validateArrayLength(e,t,r)||this.validateArrayUniqueItems(e,t,r)||this.validateArrayItems(e,t,r))||null},o.prototype.validateArrayLength=function(e,t){var r;return void 0!==t.minItems&&e.lengtht.maxItems&&(r=this.createError(y.ARRAY_LENGTH_LONG,{length:e.length,maximum:t.maxItems},"","/maxItems",null,e,t),this.handleError(r))?r:null},o.prototype.validateArrayUniqueItems=function(e,t){if(t.uniqueItems)for(var r=0;rt.maxProperties&&(r=this.createError(y.OBJECT_PROPERTIES_MAXIMUM,{propertyCount:n.length,maximum:t.maxProperties},"","/maxProperties",null,e,t),this.handleError(r))?r:null},o.prototype.validateObjectRequiredProperties=function(e,t){if(void 0!==t.required)for(var r=0;r 10000");if(void 0!==y[e])throw new Error("Error already defined: "+e+" as "+y[e]);if(void 0!==d[t])throw new Error("Error code already used: "+d[t]+" as "+t);for(var n in y[e]=t,d[t]=e,m[e]=m[t]=r,b){var i=b[n];i[e]&&(i[t]=i[t]||i[e])}},reset:function(){i.reset(),this.error=null,this.missing=[],this.valid=!0},missing:[],error:null,valid:!0,normSchema:h,resolveUrl:l,getDocumentUri:f,errorCodes:y};return a.language(t||"en"),a}();return _.addLanguage("en-gb",m),_.tv4=_,_})?n.apply(t,[]):n)||(e.exports=i)},22:function(e,t,r){"use strict";r.r(t);var n=r(1),i=r(18),o=r.n(i);function a(e,t){for(var r=0;r0)&&(console.warn("Object validation "+(t.valid?"succeeded, but schema contained references:":"failed:"),JSON.stringify(t,null,2)),console.log("Object:",JSON.stringify(this,null,2))),t.valid}}]),e}();function u(e){return(u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function c(e,t){for(var r=0;r2&&void 0!==arguments[2])||arguments[2],i=arguments.length>3?arguments[3]:void 0;return re.info("[RuntimeCatalogue] - getting descriptor from: ",e," with constraints: ",i),new Promise(function(o,a){r._runtimeFactory.isOnline()?o(r._getDescriptor(e,t,n,i)):r.storageManager.get("url",e).then(function(a){console.log("[RuntimeCatalogue] saved offline descriptor ",a),o(a?t.apply(r,[a,i]):r._getDescriptor(e,t,n,i))})})}},{key:"_getDescriptor",value:function(e,t){var r,n=this,i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],o=arguments.length>3?arguments[3]:void 0,a=!1,s=!1,u=r=(r=null!=o?Promise.all([this.httpRequest.post(e+"/version",{body:JSON.stringify(o)}),this.httpRequest.post(e+"/cguid",{body:JSON.stringify(o)})]):Promise.all([this.httpRequest.get(e+"/version"),this.httpRequest.get(e+"/cguid")])).then(function(t){var r=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=[],n=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(n=(a=s.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,o=e}finally{try{n||null==s.return||s.return()}finally{if(i)throw o}}return r}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}(t,2),i=r[0],s=r[1];return re.log("[RuntimeCatalogue.getDescriptor] - got version ("+i+") and cguid ("+s+") for descriptor "+e),n.storageManager.getVersion("cguid",s).then(function(t){return t>=i?(re.log("[RuntimeCatalogue.getDescriptor] local version is updated for ",e),a=!0,n.storageManager.get("cguid",s)):(re.log("[RuntimeCatalogue.getDescriptor] local version not updated for ",e," retrieving from remote catalogue ..."),(null!=o?n.httpRequest.post(e,{body:JSON.stringify(o)}):n.httpRequest.get(e)).then(function(e){if((e=JSON.parse(e)).ERROR)throw new Error(e);return e}))})}).catch(function(t){var r="Unable to get descriptor for "+e+(null!=o?" with constraints "+o:"")+": "+t;throw re.error(r),new Error(r)});return i&&(re.log("adding promise to attach sourcePackage"),u=r.then(function(e){return e.sourcePackage?(s=!0,e):(s=!1,n.attachRawSourcePackage(e))})),u.then(function(r){return(!a||a&&!s&&i)&&(r.url=e,n.storageManager.set(r.cguid,r.version,r)),t.apply(n,[r,o])})}},{key:"attachRawSourcePackage",value:function(e,t){var r=this;return re.log("attaching raw sourcePackage from:",e.sourcePackageURL),new Promise(function(n,i){(null!=t?r.httpRequest.post(e.sourcePackageURL,{body:JSON.stringify(t)}):r.httpRequest.get(e.sourcePackageURL)).then(function(t){t=JSON.parse(t),e.sourcePackage=t,n(e)}).catch(function(e){i(e)})})}},{key:"getHypertyDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createHyperty,t,r)}},{key:"getStubDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createStub,t,r)}},{key:"getRuntimeDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createRuntimeDescriptor,t,r)}},{key:"getDataSchemaDescriptor",value:function(e){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1],arguments.length>2&&arguments[2],new Promise(function(t){var r=e.split("/dataschema/")[1];re.log("[RuntimeCatalogue.getDataSchemaDescriptor] schema ",r);var n={sourcePackage:{sourceCode:{properties:{}}}};switch(r){case"Context":case"ContextReporter":case"ContextObserver":n.sourcePackage.sourceCode.properties.scheme="context";break;case"Connection":n.sourcePackage.sourceCode.properties.scheme="connection";break;case"WalletData":n.sourcePackage.sourceCode.properties.scheme="walletData";break;case"Communication":n.sourcePackage.sourceCode.properties.scheme="comm",n.sourcePackage.sourceCode.properties.childrens=["resources"];break;case"HelloWorldDataSchema":n.sourcePackage.sourceCode.properties.scheme="hello";break;default:n.sourcePackage.sourceCode.properties.scheme="resource",n.sourcePackage.sourceCode.properties.childrens=[]}t(n)})}},{key:"getIdpProxyDescriptor",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;return this.getDescriptor(e,this.createIdpProxy,t,r)}},{key:"createHyperty",value:function(e){var t=this._factory.createHypertyDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.type||e.hypertyType,e.dataObjects);t.configuration=e.configuration,t.constraints=e.constraints,t.messageSchema=e.messageSchema,t.policies=e.policies,t.signature=e.signature;var r=e.sourcePackage;return r&&(t.sourcePackage=this.createSourcePackage(r)),t}},{key:"createStub",value:function(e){var t=this._factory.createProtoStubDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.messageSchemas,e.configuration,e.constraints,e.hypertyType,e.dataObjects,e.interworking,e.idpProxy,e.mutualAuthentication);t.signature=e.signature;var r=e.sourcePackage;return r&&(t.sourcePackage=this.createSourcePackage(r)),t}},{key:"createRuntimeDescriptor",value:function(e){try{e.hypertyCapabilities=JSON.parse(e.hypertyCapabilities),e.protocolCapabilities=JSON.parse(e.protocolCapabilities)}catch(e){}var t=this._factory.createHypertyRuntimeDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.type||e.runtimeType,e.hypertyCapabilities,e.protocolCapabilities,e.p2pHandlerStub,e.p2pRequesterStub);t.signature=e.signature;var r=e.sourcePackage;return r&&(t.sourcePackage=this.createSourcePackage(r)),t}},{key:"createDataSchema",value:function(e){var t;(t=e.accessControlPolicy&&e.scheme?this._factory.createHypertyDataObjectSchema(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.accessControlPolicy,e.scheme):this._factory.createMessageDataObjectSchema(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL)).signature=e.signature;var r=e.sourcePackage;if(r){t.sourcePackage=this.createSourcePackage(r);try{t.sourcePackage.sourceCode=JSON.parse(t.sourcePackage.sourceCode)}catch(e){re.log("DataSchema Source code is already parsed")}return t}return t}},{key:"createIdpProxy",value:function(e){var t=this._factory.createProtoStubDescriptorObject(e.cguid,e.version,e.objectName,e.description,e.language,e.sourcePackageURL,e.messageSchemas,e.configuration,e.constraints,e.hypertyType,e.dataObjects,e.interworking,e.idpProxy,e.mutualAuthentication);t.signature=e.signature;var r=e.sourcePackage;return r&&(r=this.createSourcePackage(r),t.sourcePackage=r),t}},{key:"createSourcePackage",value:function(e){"base64"===e.encoding&&(e.sourceCode=this.atob(e.sourceCode),e.encoding="utf-8");var t=this._factory.createSourcePackage(e.sourceCodeClassname,e.sourceCode);return e.encoding&&(t.encoding=e.encoding),e.signature&&(t.signature=e.signature),t}},{key:"getSourcePackageFromURL",value:function(e){var t=this;return re.log("getting sourcePackage from:",e),new Promise(function(r,n){t.httpRequest.get(e).then(function(e){if(e.ERROR)n(e);else{e=JSON.parse(e);var i=t.createSourcePackage(e);r(i)}}).catch(function(e){n(e)})})}},{key:"getSourceCodeFromDescriptor",value:function(e){var t=this;return new Promise(function(r,n){e.sourcePackage?r(e.sourcePackage.sourceCode):t.storageManager.getVersion(e.sourcePackageURL+"/sourceCode").then(function(i){i>=e.version?(re.log("returning cached version from storageManager"),t.storageManager.get(e.sourcePackageURL+"/sourceCode").then(function(e){r(e)}).catch(function(e){n(e)})):t.httpRequest.get(e.sourcePackageURL+"/sourceCode").then(function(i){i.ERROR?n(i):(t.storageManager.set(e.sourcePackageURL+"/sourceCode",e.version,i),r(i))}).catch(function(e){n(e)})}).catch(function(e){n(e)})})}},{key:"getTypeList",value:function(e,t){var r=this;return new Promise(function(n,i){(null!=t?r.httpRequest.post(e,{body:JSON.stringify(t)}):r.httpRequest.get(e)).then(function(e){e=JSON.parse(e),n(e)}).catch(function(e){i(e)})})}},{key:"deleteFromPM",value:function(e){return this.storageManager.delete(e)}},{key:"runtimeURL",set:function(e){this._runtimeURL=e},get:function(){return this._runtimeURL}}]),e}();t.default=ne}})}); \ No newline at end of file diff --git a/dist/StorageManager.js b/dist/StorageManager.js index 14445996..23105b8d 100644 --- a/dist/StorageManager.js +++ b/dist/StorageManager.js @@ -1,5 +1,5 @@ // version: 0.16.0 -// date: Wed Jan 16 2019 10:39:53 GMT+0000 (GMT) +// date: Mon Mar 18 2019 14:21:50 GMT+0000 (Western European Standard Time) // licence: /** * Copyright 2016 PT Inovação e Sistemas SA @@ -25,4 +25,4 @@ **/ -!function(g,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define("StorageManager",[],e):"object"==typeof exports?exports.StorageManager=e():g.StorageManager=e()}(window,function(){return function(g){var e={};function I(n){if(e[n])return e[n].exports;var t=e[n]={i:n,l:!1,exports:{}};return g[n].call(t.exports,t,t.exports,I),t.l=!0,t.exports}return I.m=g,I.c=e,I.d=function(g,e,n){I.o(g,e)||Object.defineProperty(g,e,{enumerable:!0,get:n})},I.r=function(g){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(g,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(g,"__esModule",{value:!0})},I.t=function(g,e){if(1&e&&(g=I(g)),8&e)return g;if(4&e&&"object"==typeof g&&g&&g.__esModule)return g;var n=Object.create(null);if(I.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:g}),2&e&&"string"!=typeof g)for(var t in g)I.d(n,t,function(e){return g[e]}.bind(null,t));return n},I.n=function(g){var e=g&&g.__esModule?function(){return g.default}:function(){return g};return I.d(e,"a",e),e},I.o=function(g,e){return Object.prototype.hasOwnProperty.call(g,e)},I.p="",I(I.s=21)}({1:function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n "use strict";\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(this, function () {\n "use strict";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = "undefined";\n\n var logMethods = [\n "trace",\n "debug",\n "info",\n "warn",\n "error"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === \'function\') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === \'debug\') {\n methodName = \'log\';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, \'log\');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn\'t present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n var storageKey = "loglevel";\n if (name) {\n storageKey += ":" + name;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || \'silent\').toUpperCase();\n\n if (typeof window === undefinedType) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + "=" + levelName + ";";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + "=");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3,\n "ERROR": 4, "SILENT": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return "No console available for logging";\n }\n } else {\n throw "log.setLevel() called with invalid level: " + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel == null ? "WARN" : defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== "string" || name === "") {\n throw new TypeError("You must supply a name when creating a logger.");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n return defaultLogger;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanM/NWM3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGVbbWV0aG9kTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgJ2xvZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGVzZSBwcml2YXRlIGZ1bmN0aW9ucyBhbHdheXMgbmVlZCBgdGhpc2AgdG8gYmUgc2V0IHByb3Blcmx5XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlTG9nZ2luZ01ldGhvZHMobGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2dNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IGxvZ01ldGhvZHNbaV07XG4gICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdID0gKGkgPCBsZXZlbCkgP1xuICAgICAgICAgICAgICAgIG5vb3AgOlxuICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgbG9nLmxvZyBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcbiAgICB9XG5cbiAgICAvLyBJbiBvbGQgSUUgdmVyc2lvbnMsIHRoZSBjb25zb2xlIGlzbid0IHByZXNlbnQgdW50aWwgeW91IGZpcnN0IG9wZW4gaXQuXG4gICAgLy8gV2UgYnVpbGQgcmVhbE1ldGhvZCgpIHJlcGxhY2VtZW50cyBoZXJlIHRoYXQgcmVnZW5lcmF0ZSBsb2dnaW5nIG1ldGhvZHNcbiAgICBmdW5jdGlvbiBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzKG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbCh0aGlzLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHVzZSBjbG9zZWx5IGJvdW5kIHJlYWwgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZSwgYW5kXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIGEgY29uc29sZSB0byBhcHBlYXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICBmdW5jdGlvbiBkZWZhdWx0TWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICByZXR1cm4gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB8fFxuICAgICAgICAgICAgICAgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvZ2dlcihuYW1lLCBkZWZhdWx0TGV2ZWwsIGZhY3RvcnkpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBjdXJyZW50TGV2ZWw7XG4gICAgICB2YXIgc3RvcmFnZUtleSA9IFwibG9nbGV2ZWxcIjtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICpcbiAgICAgICAqIFB1YmxpYyBsb2dnZXIgQVBJIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbCBmb3IgZGV0YWlsc1xuICAgICAgICpcbiAgICAgICAqL1xuXG4gICAgICBzZWxmLm5hbWUgPSBuYW1lO1xuXG4gICAgICBzZWxmLmxldmVscyA9IHsgXCJUUkFDRVwiOiAwLCBcIkRFQlVHXCI6IDEsIFwiSU5GT1wiOiAyLCBcIldBUk5cIjogMyxcbiAgICAgICAgICBcIkVSUk9SXCI6IDQsIFwiU0lMRU5UXCI6IDV9O1xuXG4gICAgICBzZWxmLm1ldGhvZEZhY3RvcnkgPSBmYWN0b3J5IHx8IGRlZmF1bHRNZXRob2RGYWN0b3J5O1xuXG4gICAgICBzZWxmLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50TGV2ZWw7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsLCBwZXJzaXN0KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gXCJzdHJpbmdcIiAmJiBzZWxmLmxldmVsc1tsZXZlbC50b1VwcGVyQ2FzZSgpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGxldmVsID0gc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwibnVtYmVyXCIgJiYgbGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgY3VycmVudExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgICAgIGlmIChwZXJzaXN0ICE9PSBmYWxzZSkgeyAgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgcGVyc2lzdExldmVsSWZQb3NzaWJsZShsZXZlbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZiwgbGV2ZWwsIG5hbWUpO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUgJiYgbGV2ZWwgPCBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIk5vIGNvbnNvbGUgYXZhaWxhYmxlIGZvciBsb2dnaW5nXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgbGV2ZWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXREZWZhdWx0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgICBpZiAoIWdldFBlcnNpc3RlZExldmVsKCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZW5hYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuVFJBQ0UsIHBlcnNpc3QpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5kaXNhYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuU0lMRU5ULCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEluaXRpYWxpemUgd2l0aCB0aGUgcmlnaHQgbGV2ZWxcbiAgICAgIHZhciBpbml0aWFsTGV2ZWwgPSBnZXRQZXJzaXN0ZWRMZXZlbCgpO1xuICAgICAgaWYgKGluaXRpYWxMZXZlbCA9PSBudWxsKSB7XG4gICAgICAgICAgaW5pdGlhbExldmVsID0gZGVmYXVsdExldmVsID09IG51bGwgPyBcIldBUk5cIiA6IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhIG5hbWUgd2hlbiBjcmVhdGluZyBhIGxvZ2dlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV07XG4gICAgICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgICAgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV0gPSBuZXcgTG9nZ2VyKFxuICAgICAgICAgICAgbmFtZSwgZGVmYXVsdExvZ2dlci5nZXRMZXZlbCgpLCBkZWZhdWx0TG9nZ2VyLm1ldGhvZEZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dnZXI7XG4gICAgfTtcblxuICAgIC8vIEdyYWIgdGhlIGN1cnJlbnQgZ2xvYmFsIGxvZyB2YXJpYWJsZSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuICAgIHZhciBfbG9nID0gKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUpID8gd2luZG93LmxvZyA6IHVuZGVmaW5lZDtcbiAgICBkZWZhdWx0TG9nZ2VyLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUgJiZcbiAgICAgICAgICAgICAgIHdpbmRvdy5sb2cgPT09IGRlZmF1bHRMb2dnZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2cgPSBfbG9nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG4gICAgfTtcblxuICAgIGRlZmF1bHRMb2dnZXIuZ2V0TG9nZ2VycyA9IGZ1bmN0aW9uIGdldExvZ2dlcnMoKSB7XG4gICAgICAgIHJldHVybiBfbG9nZ2Vyc0J5TmFtZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxhQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n')},21:function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__);\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar log = loglevel__WEBPACK_IMPORTED_MODULE_0__[\"getLogger\"]('StorageManager');\n\nvar StorageManager =\n/*#__PURE__*/\nfunction () {\n function StorageManager(db, storageName, schemas, runtimeUA) {\n var version = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;\n var remoteStorage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n _classCallCheck(this, StorageManager);\n\n if (!db) throw Error('The Storage Manager needs the database instance');\n if (!storageName) throw Error('The Storage Manager needs the storage name');\n var stores = {};\n\n if (schemas) {\n stores = schemas;\n } else {\n stores[storageName] = 'key,version,value';\n } // db.version(version).stores(stores);\n\n\n db.open().then(function (db) {\n log.info('Found database name ' + db.name + ' with version no: ' + db.verno);\n }).catch(log.error);\n this.db = db;\n this.storageName = storageName;\n this._remoteStorage = remoteStorage;\n this._runtimeUA = runtimeUA;\n } // set remoteStorage backup server URL\n\n\n _createClass(StorageManager, [{\n key: \"connect\",\n // start sync with remoteStorage server. Returns a promise that resolves if connection is performed otherwise it is rejected\n value: function connect(options) {\n return this.db.connect(this._remoteStorage, options);\n } // stop sync with remoteStorage server. Returns promise \n\n }, {\n key: \"disconnect\",\n value: function disconnect() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.db.disconnect(_this._remoteStorage).then(function () {\n resolve();\n }, function (error) {\n reject(error);\n });\n });\n } // to retrieve the last revision stored in the backup server\n\n }, {\n key: \"getBackupRevision\",\n value: function getBackupRevision(resource) {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n _this2.db._syncNodes.get({\n type: 'remote'\n }).then(function (status) {\n console.log('[StorageManager.getBackupRevision] retrieved status: ', status);\n\n if (status && status.hasOwnProperty('appliedRemoteRevision')) {\n if (status.appliedRemoteRevision === null) status.appliedRemoteRevision = 0;\n resolve(status.appliedRemoteRevision);\n }\n });\n });\n } // to retrieve the last revision stored in the backup server\n // and broadcast it\n\n }, {\n key: \"_updateBackupRevision\",\n value: function _updateBackupRevision(resource) {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n _this3.db._syncNodes.get({\n type: 'remote'\n }).then(function (status) {\n console.log('[StorageManager._updateBackupRevision] retrieved status: ', status);\n\n if (status && status.hasOwnProperty('appliedRemoteRevision')) {\n if (status.appliedRemoteRevision === null) status.appliedRemoteRevision = 0;\n\n _this3._runtimeUA._updateRuntimeStatus({\n resource: resource,\n value: {\n backupRevision: status.appliedRemoteRevision\n }\n });\n\n resolve(status.appliedRemoteRevision);\n }\n });\n });\n }\n }, {\n key: \"_checkKey\",\n value: function _checkKey(key) {\n if (typeof key !== 'string') return key.toString();\n return key;\n }\n }, {\n key: \"_getTable\",\n value: function _getTable(key) {\n var name;\n\n try {\n name = this.db.table(this.storageName).name;\n } catch (error) {\n // try {\n name = this.db.table(key).name;\n /* } catch (error) {\r\n log.error('[StorageManager._getTable] error ', error);\r\n name = false;\r\n }*/\n }\n\n return name;\n }\n }, {\n key: \"_getPrimaryKey\",\n value: function _getPrimaryKey(table) {\n return this.db.table(table).schema.primKey.name;\n }\n }, {\n key: \"_isDefaultSchema\",\n value: function _isDefaultSchema(table) {\n var name = this._getTable(table);\n\n var schema = this.db[name].schema.instanceTemplate;\n return schema.hasOwnProperty('value') && schema.hasOwnProperty('version') && schema.hasOwnProperty('key');\n }\n /**\r\n * Adds a new entry to the database for a given key, together with its version.\r\n * If an entry for the given key is already stored in the database, it will be updated.\r\n * @param {!string} key - key that can be used with {@link storageManager.get} to retrieve the value object\r\n * @param {!string} version - version descriptor for the given value\r\n * @param value - value stored in the database that is mapped to given key\r\n * @param {!string} table - table which should be looking for\r\n * @returns {Promise} result - Promise that will be fulfilled with the key if the entry was stored successfully,\r\n * otherwise it is rejected with an error.\r\n * @memberof StorageManager\r\n */\n\n }, {\n key: \"set\",\n value: function set(key, version, value, table) {\n var _this4 = this;\n\n var updateRuntimeStatus = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n return new Promise(function (resolve, reject) {\n log.info('[StorageManager] - set ', key, value);\n table = table ? table : key;\n\n var name = _this4._getTable(table);\n\n var primaryKey = _this4._getPrimaryKey(name); // Object.assign(value, {version: version});\n\n\n var data = value;\n\n if (_this4._isDefaultSchema(table)) {\n data = {\n key: key,\n version: version,\n value: value\n };\n } else {\n var tmp = {};\n tmp[primaryKey] = key;\n Object.assign(data, tmp);\n }\n\n _this4.db[name].put(data).then(function () {\n if (updateRuntimeStatus && data.backup && data.url) {\n _this4._updateBackupRevision(data.url).then(function () {\n resolve();\n });\n } else resolve();\n }, function () {\n resolve();\n });\n });\n }\n /**\r\n * Get a entry value from the database for a given key.\r\n * If no entry is found undefined is returned.\r\n * @param {!string} key - key that was stored using {@link storageManager.set}\r\n * @param {!any} value - value which should be found\r\n * @param {!string} table - table which should be looking for\r\n * @returns {Promise} result - Promise that will be fulfilled with the value.\r\n * @memberof StorageManager\r\n */\n\n }, {\n key: \"get\",\n value: function get(key, value, table) {\n var _this5 = this;\n\n console.info('[StorageManager] - get ', key, value);\n table = table ? table : key;\n\n var name = this._getTable(table);\n\n if (!name) return undefined;\n\n var primaryKey = this._getPrimaryKey(name);\n\n return this.db.transaction('rw!', this.db[name], function () {\n if (!key && !value) {\n return _this5.db[name].toArray().then(function (objects) {\n if (objects.length > 0) {\n return objects.reduce(function (acc, key) {\n acc[key[primaryKey]] = key;\n return acc;\n }, function () {\n return {};\n });\n } else return {};\n });\n }\n\n if (!value) {\n return _this5.db[name].where(primaryKey).equals(key).first().then(function (object) {\n if (object && object.hasOwnProperty('value')) {\n return object.value;\n } else {\n return object;\n }\n });\n } else {\n var type = _typeof(value);\n\n if (Array.isArray(value)) {\n type = 'array';\n }\n\n switch (type) {\n case 'string':\n return _this5.db[name].where(key).equals(value).first().then(function (object) {\n if (object && object.hasOwnProperty('value')) {\n return object.value;\n } else {\n return object;\n }\n });\n\n case 'object':\n {\n var strPath = 'value.' + Object.keys(value).toString();\n var strValue = Object.values(value);\n console.log(strPath, strValue);\n return _this5.db[name].where(strPath).anyOf(strValue).first().then(function (object) {\n if (object && object.hasOwnProperty('value')) {\n return object.value;\n } else {\n return object;\n }\n });\n }\n\n case 'array':\n console.log('ARRAY:', value);\n return _this5.db[name].where(value).then(function (object) {\n if (object && object.hasOwnProperty('value')) {\n return object.value;\n } else {\n return object;\n }\n });\n }\n }\n });\n }\n /**\r\n * Get a entry version from the database for a given key.\r\n * If no entry is found undefined is returned.\r\n * @param {!string} key - key that was stored using {@link storageManager.set}\r\n * @param {any} value - the value which sould be used to find the storage resource\r\n * @param {!string} table - table which should be looking for\r\n * @returns {Promise} result - Promise that will be fulfilled with the version.\r\n * @memberof StorageManager\r\n */\n\n }, {\n key: \"getVersion\",\n value: function getVersion(key, value, table) {\n var _this6 = this;\n\n log.info('[StorageManager] - getVersion for key ', key);\n table = table ? table : key;\n\n var name = this._getTable(table);\n\n var primaryKey = this._getPrimaryKey(name);\n\n var data = value;\n\n if (!value) {\n data = key;\n }\n\n return this.db.transaction('rw!', this.db[name], function () {\n return _this6.db[name].where(primaryKey).equals(data).first().then(function (object) {\n if (object && object.hasOwnProperty('version')) {\n return object.version;\n } else {\n return object;\n }\n }).catch(function (error) {\n log.info('error getting the version for ', key, ' with error: ', error);\n return undefined;\n });\n });\n }\n /**\r\n * Delete a entry from the database for a given key or the full DB in case the key is not provided.\r\n * @param {!string} key - key that was stored using {@link storageManager.set}\r\n * @param {!any} value - the value which sould be used to find the storage resource\r\n * @param {!string} table - table which should be looking for\r\n * @returns {Promise} result - Promise that will be fulfilled with the number of affected rows.\r\n * @memberof StorageManager\r\n */\n\n }, {\n key: \"delete\",\n value: function _delete(key, value, table) {\n if (key) {\n table = table ? table : key;\n\n var name = this._getTable(table);\n\n var primaryKey = this._getPrimaryKey(name);\n\n var data = value;\n\n if (!value) {\n data = key;\n }\n\n return this.db[name].where(primaryKey).equals(data).delete();\n } else return this.db.delete();\n }\n }, {\n key: \"remoteStorage\",\n set: function set(remoteStorage) {\n this._remoteStorage = remoteStorage;\n }\n }]);\n\n return StorageManager;\n}();\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (StorageManager);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3RvcmFnZS1tYW5hZ2VyL1N0b3JhZ2VNYW5hZ2VyLmpzPzhiMjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignU3RvcmFnZU1hbmFnZXInKTtcclxuXHJcbmNsYXNzIFN0b3JhZ2VNYW5hZ2VyIHtcclxuXHJcbiAgY29uc3RydWN0b3IoZGIsIHN0b3JhZ2VOYW1lLCBzY2hlbWFzLCBydW50aW1lVUEsIHZlcnNpb24gPSAxLCByZW1vdGVTdG9yYWdlID0gZmFsc2UpIHtcclxuICAgIGlmICghZGIpIHRocm93IEVycm9yKCdUaGUgU3RvcmFnZSBNYW5hZ2VyIG5lZWRzIHRoZSBkYXRhYmFzZSBpbnN0YW5jZScpO1xyXG4gICAgaWYgKCFzdG9yYWdlTmFtZSkgdGhyb3cgRXJyb3IoJ1RoZSBTdG9yYWdlIE1hbmFnZXIgbmVlZHMgdGhlIHN0b3JhZ2UgbmFtZScpO1xyXG5cclxuICAgIGxldCBzdG9yZXMgPSAge307XHJcblxyXG4gICAgaWYgKHNjaGVtYXMpIHtcclxuICAgICAgc3RvcmVzID0gc2NoZW1hcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0b3Jlc1tzdG9yYWdlTmFtZV0gPSAna2V5LHZlcnNpb24sdmFsdWUnO1xyXG4gICAgfVxyXG5cclxuLy8gICAgZGIudmVyc2lvbih2ZXJzaW9uKS5zdG9yZXMoc3RvcmVzKTtcclxuICAgIGRiLm9wZW4oKS50aGVuKChkYikgPT4ge1xyXG4gICAgICBsb2cuaW5mbygnRm91bmQgZGF0YWJhc2UgbmFtZSAnICsgZGIubmFtZSArICcgd2l0aCB2ZXJzaW9uIG5vOiAnICsgZGIudmVybm8pO1xyXG4gICAgfSkuY2F0Y2gobG9nLmVycm9yKTtcclxuXHJcbiAgICB0aGlzLmRiID0gZGI7XHJcbiAgICB0aGlzLnN0b3JhZ2VOYW1lID0gc3RvcmFnZU5hbWU7XHJcbiAgICB0aGlzLl9yZW1vdGVTdG9yYWdlID0gcmVtb3RlU3RvcmFnZTtcclxuICAgIHRoaXMuX3J1bnRpbWVVQSA9IHJ1bnRpbWVVQTtcclxuICB9XHJcblxyXG4gIC8vIHNldCByZW1vdGVTdG9yYWdlIGJhY2t1cCBzZXJ2ZXIgVVJMXHJcblxyXG4gIHNldCByZW1vdGVTdG9yYWdlKHJlbW90ZVN0b3JhZ2UpIHtcclxuICAgIHRoaXMuX3JlbW90ZVN0b3JhZ2UgPSByZW1vdGVTdG9yYWdlO1xyXG4gIH1cclxuXHJcbiAgLy8gc3RhcnQgc3luYyB3aXRoIHJlbW90ZVN0b3JhZ2Ugc2VydmVyLiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGlmIGNvbm5lY3Rpb24gaXMgcGVyZm9ybWVkIG90aGVyd2lzZSBpdCBpcyByZWplY3RlZFxyXG5cclxuICBjb25uZWN0KG9wdGlvbnMpIHtcclxuICAgIHJldHVybiB0aGlzLmRiLmNvbm5lY3QodGhpcy5fcmVtb3RlU3RvcmFnZSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvLyBzdG9wIHN5bmMgd2l0aCByZW1vdGVTdG9yYWdlIHNlcnZlci4gUmV0dXJucyBwcm9taXNlIFxyXG5cclxuICBkaXNjb25uZWN0KCkge1xyXG4gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIuZGlzY29ubmVjdCh0aGlzLl9yZW1vdGVTdG9yYWdlKS50aGVuKCgpPT4ge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4gIC8vIHRvIHJldHJpZXZlIHRoZSBsYXN0IHJldmlzaW9uIHN0b3JlZCBpbiB0aGUgYmFja3VwIHNlcnZlclxyXG5cclxuICBnZXRCYWNrdXBSZXZpc2lvbihyZXNvdXJjZSkge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PiB7XHJcbiAgICAgIHRoaXMuZGIuX3N5bmNOb2Rlcy5nZXQoe3R5cGU6ICdyZW1vdGUnfSkudGhlbigoc3RhdHVzKT0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW1N0b3JhZ2VNYW5hZ2VyLmdldEJhY2t1cFJldmlzaW9uXSByZXRyaWV2ZWQgc3RhdHVzOiAnLCBzdGF0dXMpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgJiYgc3RhdHVzLmhhc093blByb3BlcnR5KCdhcHBsaWVkUmVtb3RlUmV2aXNpb24nKSkge1xyXG4gICAgICAgICAgaWYgKHN0YXR1cy5hcHBsaWVkUmVtb3RlUmV2aXNpb24gPT09IG51bGwpIHN0YXR1cy5hcHBsaWVkUmVtb3RlUmV2aXNpb24gPSAwO1xyXG5cclxuICAgICAgICAgIHJlc29sdmUoc3RhdHVzLmFwcGxpZWRSZW1vdGVSZXZpc2lvbik7XHJcbiAgICAgICAgfSBcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4gIC8vIHRvIHJldHJpZXZlIHRoZSBsYXN0IHJldmlzaW9uIHN0b3JlZCBpbiB0aGUgYmFja3VwIHNlcnZlclxyXG4gIC8vIGFuZCBicm9hZGNhc3QgaXRcclxuXHJcbiAgX3VwZGF0ZUJhY2t1cFJldmlzaW9uKHJlc291cmNlKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKT0+IHtcclxuICAgICAgdGhpcy5kYi5fc3luY05vZGVzLmdldCh7dHlwZTogJ3JlbW90ZSd9KS50aGVuKChzdGF0dXMpPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbU3RvcmFnZU1hbmFnZXIuX3VwZGF0ZUJhY2t1cFJldmlzaW9uXSByZXRyaWV2ZWQgc3RhdHVzOiAnLCBzdGF0dXMpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgJiYgc3RhdHVzLmhhc093blByb3BlcnR5KCdhcHBsaWVkUmVtb3RlUmV2aXNpb24nKSkge1xyXG4gICAgICAgICAgaWYgKHN0YXR1cy5hcHBsaWVkUmVtb3RlUmV2aXNpb24gPT09IG51bGwpIHN0YXR1cy5hcHBsaWVkUmVtb3RlUmV2aXNpb24gPSAwO1xyXG5cclxuICAgICAgICAgIHRoaXMuX3J1bnRpbWVVQS5fdXBkYXRlUnVudGltZVN0YXR1cyhcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHJlc291cmNlOiByZXNvdXJjZSxcclxuICAgICAgICAgICAgICB2YWx1ZTogeyBiYWNrdXBSZXZpc2lvbjogc3RhdHVzLmFwcGxpZWRSZW1vdGVSZXZpc2lvbiB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIClcclxuICAgICAgICAgIHJlc29sdmUoc3RhdHVzLmFwcGxpZWRSZW1vdGVSZXZpc2lvbik7XHJcbiAgICAgICAgfSBcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4gIF9jaGVja0tleShrZXkpIHtcclxuICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykgcmV0dXJuIGtleS50b1N0cmluZygpO1xyXG4gICAgcmV0dXJuIGtleTtcclxuICB9XHJcblxyXG4gIF9nZXRUYWJsZShrZXkpIHtcclxuICAgIGxldCBuYW1lO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIG5hbWUgPSB0aGlzLmRiLnRhYmxlKHRoaXMuc3RvcmFnZU5hbWUpLm5hbWU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4vLyAgICAgIHRyeSB7XHJcbiAgICAgICAgbmFtZSA9IHRoaXMuZGIudGFibGUoa2V5KS5uYW1lO1xyXG4vKiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmVycm9yKCdbU3RvcmFnZU1hbmFnZXIuX2dldFRhYmxlXSBlcnJvciAnLCBlcnJvcik7XHJcbiAgICAgICAgbmFtZSA9IGZhbHNlO1xyXG4gICAgICB9Ki9cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIF9nZXRQcmltYXJ5S2V5KHRhYmxlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYi50YWJsZSh0YWJsZSkuc2NoZW1hLnByaW1LZXkubmFtZTtcclxuICB9XHJcblxyXG4gIF9pc0RlZmF1bHRTY2hlbWEodGFibGUpIHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9nZXRUYWJsZSh0YWJsZSk7XHJcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmRiW25hbWVdLnNjaGVtYS5pbnN0YW5jZVRlbXBsYXRlO1xyXG4gICAgcmV0dXJuIHNjaGVtYS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSAmJiBzY2hlbWEuaGFzT3duUHJvcGVydHkoJ3ZlcnNpb24nKSAmJiBzY2hlbWEuaGFzT3duUHJvcGVydHkoJ2tleScpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIG5ldyBlbnRyeSB0byB0aGUgZGF0YWJhc2UgZm9yIGEgZ2l2ZW4ga2V5LCB0b2dldGhlciB3aXRoIGl0cyB2ZXJzaW9uLlxyXG4gICAqIElmIGFuIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5IGlzIGFscmVhZHkgc3RvcmVkIGluIHRoZSBkYXRhYmFzZSwgaXQgd2lsbCBiZSB1cGRhdGVkLlxyXG4gICAqIEBwYXJhbSB7IXN0cmluZ30ga2V5IC0ga2V5IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB7QGxpbmsgc3RvcmFnZU1hbmFnZXIuZ2V0fSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHshc3RyaW5nfSB2ZXJzaW9uIC0gdmVyc2lvbiBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gdmFsdWVcclxuICAgKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlIHRoYXQgaXMgbWFwcGVkIHRvIGdpdmVuIGtleVxyXG4gICAqIEBwYXJhbSB7IXN0cmluZ30gdGFibGUgLSB0YWJsZSB3aGljaCBzaG91bGQgYmUgbG9va2luZyBmb3JcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gcmVzdWx0IC0gUHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdpdGggdGhlIGtleSBpZiB0aGUgZW50cnkgd2FzIHN0b3JlZCBzdWNjZXNzZnVsbHksXHJcbiAgICogb3RoZXJ3aXNlIGl0IGlzIHJlamVjdGVkIHdpdGggYW4gZXJyb3IuXHJcbiAgICogQG1lbWJlcm9mIFN0b3JhZ2VNYW5hZ2VyXHJcbiAgICovXHJcbiAgc2V0KGtleSwgdmVyc2lvbiwgdmFsdWUsIHRhYmxlLCB1cGRhdGVSdW50aW1lU3RhdHVzID0gdHJ1ZSkge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSAoKHJlc29sdmUsIHJlamVjdCk9PiB7XHJcbiAgICAgIGxvZy5pbmZvKCdbU3RvcmFnZU1hbmFnZXJdIC0gc2V0ICcsIGtleSwgdmFsdWUpO1xyXG4gICAgICB0YWJsZSA9IHRhYmxlID8gdGFibGUgOiBrZXk7XHJcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9nZXRUYWJsZSh0YWJsZSk7XHJcbiAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLl9nZXRQcmltYXJ5S2V5KG5hbWUpO1xyXG4gIFxyXG4gICAgICAvLyBPYmplY3QuYXNzaWduKHZhbHVlLCB7dmVyc2lvbjogdmVyc2lvbn0pO1xyXG4gIFxyXG4gICAgICBsZXQgZGF0YSA9IHZhbHVlO1xyXG4gIFxyXG4gICAgICBpZiAodGhpcy5faXNEZWZhdWx0U2NoZW1hKHRhYmxlKSkge1xyXG4gICAgICAgIGRhdGEgPSB7XHJcbiAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgIHZlcnNpb246IHZlcnNpb24sXHJcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHRtcCA9IHt9O1xyXG4gICAgICAgIHRtcFtwcmltYXJ5S2V5XSA9IGtleTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHRtcCk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgIHRoaXMuZGJbbmFtZV0ucHV0KGRhdGEpLnRoZW4oKCk9PntcclxuICAgICAgaWYgKHVwZGF0ZVJ1bnRpbWVTdGF0dXMgJiYgZGF0YS5iYWNrdXAgJiYgZGF0YS51cmwpIHtcclxuICAgICAgICB0aGlzLl91cGRhdGVCYWNrdXBSZXZpc2lvbihkYXRhLnVybCkudGhlbigoKT0+IHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHJlc29sdmUoKTtcclxuXHJcbiAgICAgICB9LCAoKT0+IHtcclxuICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgZW50cnkgdmFsdWUgZnJvbSB0aGUgZGF0YWJhc2UgZm9yIGEgZ2l2ZW4ga2V5LlxyXG4gICAqIElmIG5vIGVudHJ5IGlzIGZvdW5kIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cclxuICAgKiBAcGFyYW0geyFzdHJpbmd9IGtleSAtIGtleSB0aGF0IHdhcyBzdG9yZWQgdXNpbmcge0BsaW5rIHN0b3JhZ2VNYW5hZ2VyLnNldH1cclxuICAgKiBAcGFyYW0geyFhbnl9IHZhbHVlIC0gdmFsdWUgd2hpY2ggc2hvdWxkIGJlIGZvdW5kXHJcbiAgICogQHBhcmFtIHshc3RyaW5nfSB0YWJsZSAtIHRhYmxlIHdoaWNoIHNob3VsZCBiZSBsb29raW5nIGZvclxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSByZXN1bHQgLSBQcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2l0aCB0aGUgdmFsdWUuXHJcbiAgICogQG1lbWJlcm9mIFN0b3JhZ2VNYW5hZ2VyXHJcbiAgICovXHJcbiAgZ2V0KGtleSwgdmFsdWUsIHRhYmxlKSB7XHJcbiAgICBjb25zb2xlLmluZm8oJ1tTdG9yYWdlTWFuYWdlcl0gLSBnZXQgJywga2V5LCB2YWx1ZSk7XHJcbiAgICB0YWJsZSA9IHRhYmxlID8gdGFibGUgOiBrZXk7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5fZ2V0VGFibGUodGFibGUpO1xyXG4gICAgaWYgKCFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IHRoaXMuX2dldFByaW1hcnlLZXkobmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGIudHJhbnNhY3Rpb24oJ3J3IScsIHRoaXMuZGJbbmFtZV0sICgpID0+IHtcclxuXHJcbiAgICAgIGlmICgha2V5ICYmICF2YWx1ZSkgeyBcclxuICAgICAgICByZXR1cm4gdGhpcy5kYltuYW1lXS50b0FycmF5KCkudGhlbihvYmplY3RzID0+IHtcclxuICAgICAgICAgIGlmIChvYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdHMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgIGFjY1trZXlbcHJpbWFyeUtleV1dID0ga2V5O1xyXG4gICAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICAgIH0sICgpID0+e3JldHVybiB7fSB9KTtcclxuICAgICAgICAgIH0gZWxzZSByZXR1cm4ge307XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGJbbmFtZV0ud2hlcmUocHJpbWFyeUtleSkuZXF1YWxzKGtleSkuZmlyc3QoKVxyXG4gICAgICAgICAgLnRoZW4ob2JqZWN0ID0+IHtcclxuICAgICAgICAgICAgaWYgKG9iamVjdCAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgdHlwZSA9ICdhcnJheSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYltuYW1lXS53aGVyZShrZXkpLmVxdWFscyh2YWx1ZSkuZmlyc3QoKVxyXG4gICAgICAgICAgICAgIC50aGVuKG9iamVjdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBjYXNlICdvYmplY3QnOiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0clBhdGggPSAndmFsdWUuJyArIE9iamVjdC5rZXlzKHZhbHVlKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb25zdCBzdHJWYWx1ZSA9IE9iamVjdC52YWx1ZXModmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhzdHJQYXRoLCBzdHJWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYltuYW1lXS53aGVyZShzdHJQYXRoKS5hbnlPZihzdHJWYWx1ZSkuZmlyc3QoKVxyXG4gICAgICAgICAgICAgIC50aGVuKG9iamVjdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjYXNlICdhcnJheSc6XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBUlJBWTonLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRiW25hbWVdLndoZXJlKHZhbHVlKS50aGVuKG9iamVjdCA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKG9iamVjdCAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QudmFsdWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgZW50cnkgdmVyc2lvbiBmcm9tIHRoZSBkYXRhYmFzZSBmb3IgYSBnaXZlbiBrZXkuXHJcbiAgICogSWYgbm8gZW50cnkgaXMgZm91bmQgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxyXG4gICAqIEBwYXJhbSB7IXN0cmluZ30ga2V5IC0ga2V5IHRoYXQgd2FzIHN0b3JlZCB1c2luZyB7QGxpbmsgc3RvcmFnZU1hbmFnZXIuc2V0fVxyXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIHRoZSB2YWx1ZSB3aGljaCBzb3VsZCBiZSB1c2VkIHRvIGZpbmQgdGhlIHN0b3JhZ2UgcmVzb3VyY2VcclxuICAgKiBAcGFyYW0geyFzdHJpbmd9IHRhYmxlIC0gdGFibGUgd2hpY2ggc2hvdWxkIGJlIGxvb2tpbmcgZm9yXHJcbiAgICogQHJldHVybnMge1Byb21pc2V9IHJlc3VsdCAtIFByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCB3aXRoIHRoZSB2ZXJzaW9uLlxyXG4gICAqIEBtZW1iZXJvZiBTdG9yYWdlTWFuYWdlclxyXG4gICAqL1xyXG4gIGdldFZlcnNpb24oa2V5LCB2YWx1ZSwgdGFibGUpIHtcclxuICAgIGxvZy5pbmZvKCdbU3RvcmFnZU1hbmFnZXJdIC0gZ2V0VmVyc2lvbiBmb3Iga2V5ICcsIGtleSk7XHJcbiAgICB0YWJsZSA9IHRhYmxlID8gdGFibGUgOiBrZXk7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5fZ2V0VGFibGUodGFibGUpO1xyXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IHRoaXMuX2dldFByaW1hcnlLZXkobmFtZSk7XHJcblxyXG4gICAgbGV0IGRhdGEgPSB2YWx1ZTtcclxuXHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIGRhdGEgPSBrZXk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGIudHJhbnNhY3Rpb24oJ3J3IScsIHRoaXMuZGJbbmFtZV0sICgpID0+IHtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmRiW25hbWVdLndoZXJlKHByaW1hcnlLZXkpXHJcbiAgICAgICAgLmVxdWFscyhkYXRhKVxyXG4gICAgICAgIC5maXJzdCgpXHJcbiAgICAgICAgLnRoZW4oKG9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKG9iamVjdCAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkoJ3ZlcnNpb24nKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0LnZlcnNpb247XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgIGxvZy5pbmZvKCdlcnJvciBnZXR0aW5nIHRoZSB2ZXJzaW9uIGZvciAnLCBrZXksICcgd2l0aCBlcnJvcjogJywgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIGEgZW50cnkgZnJvbSB0aGUgZGF0YWJhc2UgZm9yIGEgZ2l2ZW4ga2V5IG9yIHRoZSBmdWxsIERCIGluIGNhc2UgdGhlIGtleSBpcyBub3QgcHJvdmlkZWQuXHJcbiAgICogQHBhcmFtIHshc3RyaW5nfSBrZXkgLSBrZXkgdGhhdCB3YXMgc3RvcmVkIHVzaW5nIHtAbGluayBzdG9yYWdlTWFuYWdlci5zZXR9XHJcbiAgICogQHBhcmFtIHshYW55fSB2YWx1ZSAtIHRoZSB2YWx1ZSB3aGljaCBzb3VsZCBiZSB1c2VkIHRvIGZpbmQgdGhlIHN0b3JhZ2UgcmVzb3VyY2VcclxuICAgKiBAcGFyYW0geyFzdHJpbmd9IHRhYmxlIC0gdGFibGUgd2hpY2ggc2hvdWxkIGJlIGxvb2tpbmcgZm9yXHJcbiAgICogQHJldHVybnMge1Byb21pc2V9IHJlc3VsdCAtIFByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCB3aXRoIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgcm93cy5cclxuICAgKiBAbWVtYmVyb2YgU3RvcmFnZU1hbmFnZXJcclxuICAgKi9cclxuICBkZWxldGUoa2V5LCB2YWx1ZSwgdGFibGUpIHtcclxuXHJcbiAgICBpZiAoa2V5KSB7XHJcbiAgICAgIHRhYmxlID0gdGFibGUgPyB0YWJsZSA6IGtleTtcclxuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuX2dldFRhYmxlKHRhYmxlKTtcclxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IHRoaXMuX2dldFByaW1hcnlLZXkobmFtZSk7XHJcbiAgXHJcbiAgICAgIGxldCBkYXRhID0gdmFsdWU7XHJcbiAgXHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICBkYXRhID0ga2V5O1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmRiW25hbWVdXHJcbiAgICAgICAgLndoZXJlKHByaW1hcnlLZXkpXHJcbiAgICAgICAgLmVxdWFscyhkYXRhKVxyXG4gICAgICAgIC5kZWxldGUoKTtcclxuICAgIH0gZWxzZSByZXR1cm4gdGhpcy5kYi5kZWxldGUoKTtcclxuICBcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlTWFuYWdlcjtcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7OztBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7OztBQVdBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7O0FBU0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5DQTtBQXFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7O0FBU0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7OztBQTFTQTtBQUNBO0FBQ0E7Ozs7OztBQTRTQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///21\n")}})}); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("StorageManager",[],t):"object"==typeof exports?exports.StorageManager=t():e.StorageManager=t()}(window,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=21)}({1:function(e,t,n){var r,o;!function(i,a){"use strict";void 0===(o="function"==typeof(r=function(){var e=function(){},t="undefined",n=["trace","debug","info","warn","error"];function r(e,t){var n=e[t];if("function"==typeof n.bind)return n.bind(e);try{return Function.prototype.bind.call(n,e)}catch(t){return function(){return Function.prototype.apply.apply(n,[e,arguments])}}}function o(t,r){for(var o=0;o=0&&r<=l.levels.SILENT))throw"log.setLevel() called with invalid level: "+r;if(u=r,!1!==i&&function(e){var r=(n[e]||"silent").toUpperCase();if(typeof window!==t){try{return void(window.localStorage[c]=r)}catch(e){}try{window.document.cookie=encodeURIComponent(c)+"="+r+";"}catch(e){}}}(r),o.call(l,r,e),typeof console===t&&r4&&void 0!==arguments[4]&&arguments[4];var a=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),!t)throw Error("The Storage Manager needs the database instance");if(!n)throw Error("The Storage Manager needs the storage name");var u={};r?u=r:u[n]="key,version,value",t.open().then(function(e){i.info("Found database name "+e.name+" with version no: "+e.verno)}).catch(i.error),this.db=t,this.storageName=n,this._remoteStorage=a,this._runtimeUA=o}return function(e,t,n){t&&o(e.prototype,t)}(e,[{key:"connect",value:function(e){return this.db.connect(this._remoteStorage,e)}},{key:"disconnect",value:function(){var e=this;return new Promise(function(t,n){e.db.disconnect(e._remoteStorage).then(function(){t()},function(e){n(e)})})}},{key:"getBackupRevision",value:function(e){var t=this;return new Promise(function(e){t.db._syncNodes.get({type:"remote"}).then(function(t){console.log("[StorageManager.getBackupRevision] retrieved status: ",t),t&&t.hasOwnProperty("appliedRemoteRevision")&&(null===t.appliedRemoteRevision&&(t.appliedRemoteRevision=0),e(t.appliedRemoteRevision))})})}},{key:"_updateBackupRevision",value:function(e){var t=this;return new Promise(function(n){t.db._syncNodes.get({type:"remote"}).then(function(r){console.log("[StorageManager._updateBackupRevision] retrieved status: ",r),r&&r.hasOwnProperty("appliedRemoteRevision")&&(null===r.appliedRemoteRevision&&(r.appliedRemoteRevision=0),t._runtimeUA._updateRuntimeStatus({resource:e,value:{backupRevision:r.appliedRemoteRevision}}),n(r.appliedRemoteRevision))})})}},{key:"_checkKey",value:function(e){return"string"!=typeof e?e.toString():e}},{key:"_getTable",value:function(e){var t;try{t=this.db.table(this.storageName).name}catch(n){t=this.db.table(e).name}return t}},{key:"_getPrimaryKey",value:function(e){return this.db.table(e).schema.primKey.name}},{key:"_isDefaultSchema",value:function(e){var t=this._getTable(e),n=this.db[t].schema.instanceTemplate;return n.hasOwnProperty("value")&&n.hasOwnProperty("version")&&n.hasOwnProperty("key")}},{key:"set",value:function(e,t,n,r){var o=this,a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];return new Promise(function(u,l){i.info("[StorageManager] - set ",e,n),r=r||e;var c=o._getTable(r),s=o._getPrimaryKey(c),f=n;if(o._isDefaultSchema(r))f={key:e,version:t,value:n};else{var v={};v[s]=e,Object.assign(f,v)}o.db[c].put(f).then(function(){a&&f.backup&&f.url?o._updateBackupRevision(f.url).then(function(){u()}):u()},function(){u()})})}},{key:"get",value:function(e,t,n){var o=this;console.info("[StorageManager] - get ",e,t),n=n||e;var i=this._getTable(n);if(i){var a=this._getPrimaryKey(i);return this.db.transaction("rw!",this.db[i],function(){if(!e&&!t)return o.db[i].toArray().then(function(e){return e.length>0?e.reduce(function(e,t){return e[t[a]]=t,e},function(){return{}}):{}});if(!t)return o.db[i].where(a).equals(e).first().then(function(e){return e&&e.hasOwnProperty("value")?e.value:e});var n=r(t);switch(Array.isArray(t)&&(n="array"),n){case"string":return o.db[i].where(e).equals(t).first().then(function(e){return e&&e.hasOwnProperty("value")?e.value:e});case"object":var u="value."+Object.keys(t).toString(),l=Object.values(t);return console.log(u,l),o.db[i].where(u).anyOf(l).first().then(function(e){return e&&e.hasOwnProperty("value")?e.value:e});case"array":return console.log("ARRAY:",t),o.db[i].where(t).then(function(e){return e&&e.hasOwnProperty("value")?e.value:e})}})}}},{key:"getVersion",value:function(e,t,n){var r=this;i.info("[StorageManager] - getVersion for key ",e),n=n||e;var o=this._getTable(n),a=this._getPrimaryKey(o),u=t;return t||(u=e),this.db.transaction("rw!",this.db[o],function(){return r.db[o].where(a).equals(u).first().then(function(e){return e&&e.hasOwnProperty("version")?e.version:e}).catch(function(t){i.info("error getting the version for ",e," with error: ",t)})})}},{key:"delete",value:function(e,t,n){if(e){n=n||e;var r=this._getTable(n),o=this._getPrimaryKey(r),i=t;return t||(i=e),this.db[r].where(o).equals(i).delete()}return this.db.delete()}},{key:"remoteStorage",set:function(e){this._remoteStorage=e}}]),e}();t.default=a}})}); \ No newline at end of file diff --git a/dist/minibus.js b/dist/minibus.js index 9739b2bd..829b4b73 100644 --- a/dist/minibus.js +++ b/dist/minibus.js @@ -1,5 +1,5 @@ // version: 0.16.0 -// date: Wed Jan 16 2019 10:39:53 GMT+0000 (GMT) +// date: Mon Mar 18 2019 14:21:50 GMT+0000 (Western European Standard Time) // licence: /** * Copyright 2016 PT Inovação e Sistemas SA @@ -25,4 +25,4 @@ **/ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("minibus",[],n):"object"==typeof exports?exports.minibus=n():e.minibus=n()}(window,function(){return function(e){var n={};function g(l){if(n[l])return n[l].exports;var I=n[l]={i:l,l:!1,exports:{}};return e[l].call(I.exports,I,I.exports,g),I.l=!0,I.exports}return g.m=e,g.c=n,g.d=function(e,n,l){g.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:l})},g.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},g.t=function(e,n){if(1&n&&(e=g(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var l=Object.create(null);if(g.r(l),Object.defineProperty(l,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var I in e)g.d(l,I,function(n){return e[n]}.bind(null,I));return l},g.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return g.d(n,"a",n),n},g.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},g.p="",g(g.s=29)}({1:function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n "use strict";\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(this, function () {\n "use strict";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = "undefined";\n\n var logMethods = [\n "trace",\n "debug",\n "info",\n "warn",\n "error"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === \'function\') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === \'debug\') {\n methodName = \'log\';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, \'log\');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn\'t present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n var storageKey = "loglevel";\n if (name) {\n storageKey += ":" + name;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || \'silent\').toUpperCase();\n\n if (typeof window === undefinedType) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + "=" + levelName + ";";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + "=");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3,\n "ERROR": 4, "SILENT": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return "No console available for logging";\n }\n } else {\n throw "log.setLevel() called with invalid level: " + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel == null ? "WARN" : defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== "string" || name === "") {\n throw new TypeError("You must supply a name when creating a logger.");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n return defaultLogger;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanM/NWM3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGVbbWV0aG9kTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgJ2xvZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGVzZSBwcml2YXRlIGZ1bmN0aW9ucyBhbHdheXMgbmVlZCBgdGhpc2AgdG8gYmUgc2V0IHByb3Blcmx5XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlTG9nZ2luZ01ldGhvZHMobGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2dNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IGxvZ01ldGhvZHNbaV07XG4gICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdID0gKGkgPCBsZXZlbCkgP1xuICAgICAgICAgICAgICAgIG5vb3AgOlxuICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgbG9nLmxvZyBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcbiAgICB9XG5cbiAgICAvLyBJbiBvbGQgSUUgdmVyc2lvbnMsIHRoZSBjb25zb2xlIGlzbid0IHByZXNlbnQgdW50aWwgeW91IGZpcnN0IG9wZW4gaXQuXG4gICAgLy8gV2UgYnVpbGQgcmVhbE1ldGhvZCgpIHJlcGxhY2VtZW50cyBoZXJlIHRoYXQgcmVnZW5lcmF0ZSBsb2dnaW5nIG1ldGhvZHNcbiAgICBmdW5jdGlvbiBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzKG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbCh0aGlzLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHVzZSBjbG9zZWx5IGJvdW5kIHJlYWwgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZSwgYW5kXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIGEgY29uc29sZSB0byBhcHBlYXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICBmdW5jdGlvbiBkZWZhdWx0TWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICByZXR1cm4gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB8fFxuICAgICAgICAgICAgICAgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvZ2dlcihuYW1lLCBkZWZhdWx0TGV2ZWwsIGZhY3RvcnkpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBjdXJyZW50TGV2ZWw7XG4gICAgICB2YXIgc3RvcmFnZUtleSA9IFwibG9nbGV2ZWxcIjtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICpcbiAgICAgICAqIFB1YmxpYyBsb2dnZXIgQVBJIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbCBmb3IgZGV0YWlsc1xuICAgICAgICpcbiAgICAgICAqL1xuXG4gICAgICBzZWxmLm5hbWUgPSBuYW1lO1xuXG4gICAgICBzZWxmLmxldmVscyA9IHsgXCJUUkFDRVwiOiAwLCBcIkRFQlVHXCI6IDEsIFwiSU5GT1wiOiAyLCBcIldBUk5cIjogMyxcbiAgICAgICAgICBcIkVSUk9SXCI6IDQsIFwiU0lMRU5UXCI6IDV9O1xuXG4gICAgICBzZWxmLm1ldGhvZEZhY3RvcnkgPSBmYWN0b3J5IHx8IGRlZmF1bHRNZXRob2RGYWN0b3J5O1xuXG4gICAgICBzZWxmLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50TGV2ZWw7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsLCBwZXJzaXN0KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gXCJzdHJpbmdcIiAmJiBzZWxmLmxldmVsc1tsZXZlbC50b1VwcGVyQ2FzZSgpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGxldmVsID0gc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwibnVtYmVyXCIgJiYgbGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgY3VycmVudExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgICAgIGlmIChwZXJzaXN0ICE9PSBmYWxzZSkgeyAgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgcGVyc2lzdExldmVsSWZQb3NzaWJsZShsZXZlbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZiwgbGV2ZWwsIG5hbWUpO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUgJiYgbGV2ZWwgPCBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIk5vIGNvbnNvbGUgYXZhaWxhYmxlIGZvciBsb2dnaW5nXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgbGV2ZWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXREZWZhdWx0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgICBpZiAoIWdldFBlcnNpc3RlZExldmVsKCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZW5hYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuVFJBQ0UsIHBlcnNpc3QpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5kaXNhYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuU0lMRU5ULCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEluaXRpYWxpemUgd2l0aCB0aGUgcmlnaHQgbGV2ZWxcbiAgICAgIHZhciBpbml0aWFsTGV2ZWwgPSBnZXRQZXJzaXN0ZWRMZXZlbCgpO1xuICAgICAgaWYgKGluaXRpYWxMZXZlbCA9PSBudWxsKSB7XG4gICAgICAgICAgaW5pdGlhbExldmVsID0gZGVmYXVsdExldmVsID09IG51bGwgPyBcIldBUk5cIiA6IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhIG5hbWUgd2hlbiBjcmVhdGluZyBhIGxvZ2dlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV07XG4gICAgICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgICAgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV0gPSBuZXcgTG9nZ2VyKFxuICAgICAgICAgICAgbmFtZSwgZGVmYXVsdExvZ2dlci5nZXRMZXZlbCgpLCBkZWZhdWx0TG9nZ2VyLm1ldGhvZEZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dnZXI7XG4gICAgfTtcblxuICAgIC8vIEdyYWIgdGhlIGN1cnJlbnQgZ2xvYmFsIGxvZyB2YXJpYWJsZSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuICAgIHZhciBfbG9nID0gKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUpID8gd2luZG93LmxvZyA6IHVuZGVmaW5lZDtcbiAgICBkZWZhdWx0TG9nZ2VyLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUgJiZcbiAgICAgICAgICAgICAgIHdpbmRvdy5sb2cgPT09IGRlZmF1bHRMb2dnZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2cgPSBfbG9nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG4gICAgfTtcblxuICAgIGRlZmF1bHRMb2dnZXIuZ2V0TG9nZ2VycyA9IGZ1bmN0aW9uIGdldExvZ2dlcnMoKSB7XG4gICAgICAgIHJldHVybiBfbG9nZ2Vyc0J5TmFtZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxhQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n')},29:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _bus_MiniBus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(6);\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/* harmony default export */ __webpack_exports__["default"] = (_bus_MiniBus__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"]);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvbWluaWJ1cy1wYWNrLmpzPzJmOTkiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5pbXBvcnQgTWluaUJ1cyBmcm9tICcuL2J1cy9NaW5pQnVzJztcclxuZXhwb3J0IGRlZmF1bHQgTWluaUJ1cztcclxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///29\n')},6:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var _Bus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7);\nfunction _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author micaelpedrosa@gmail.com\r\n* Message BUS Interface is an extension of the Bus\r\n* It is used mainly in the internal sandbox routing.\r\n*/\n\nvar MiniBus =\n/*#__PURE__*/\nfunction (_Bus) {\n _inherits(MiniBus, _Bus);\n\n function MiniBus() {\n _classCallCheck(this, MiniBus);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(MiniBus).call(this));\n }\n /**\r\n * Post a message for routing. Message is routed directly to the external routing _onPostMessage.\r\n * @param {Message} inMsg JSON with mandatory Message structure {id, type, from, to}\r\n * @param {Callback} responseCallback Optional callback if a response is expected from the request. A response will be always sent, even if it is a "Timeout".\r\n * @return {number} the Message id\r\n */\n\n\n _createClass(MiniBus, [{\n key: "postMessage",\n value: function postMessage(inMsg, responseCallback, timeout) {\n var _this = this;\n\n _this._genId(inMsg);\n\n _this._responseCallback(inMsg, responseCallback, timeout); //always send to external (to core MessageBus)\n\n\n _this._onPostMessage(inMsg);\n\n return inMsg.id;\n } //internal method used when a message is received by an external routing system\n\n }, {\n key: "_onMessage",\n value: function _onMessage(msg) {\n var _this = this;\n\n if (!_this._onResponse(msg)) {\n var itemList = _this._subscriptions[msg.to];\n\n if (itemList) {\n _this._publishOn(itemList, msg);\n\n if (!msg.to.startsWith(\'hyperty\')) {\n _this._publishOnDefault(msg);\n }\n } else {\n _this._publishOnDefault(msg);\n }\n }\n }\n }]);\n\n return MiniBus;\n}(_Bus__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"]);\n\n/* harmony default export */ __webpack_exports__["a"] = (MiniBus);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy9idXMvTWluaUJ1cy5qcz9kOWFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuaW1wb3J0IEJ1cyBmcm9tICcuL0J1cyc7XHJcblxyXG4vKipcclxuKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXHJcbiogTWVzc2FnZSBCVVMgSW50ZXJmYWNlIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgQnVzXHJcbiogSXQgaXMgdXNlZCBtYWlubHkgaW4gdGhlIGludGVybmFsIHNhbmRib3ggcm91dGluZy5cclxuKi9cclxuY2xhc3MgTWluaUJ1cyBleHRlbmRzIEJ1cyB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBvc3QgYSBtZXNzYWdlIGZvciByb3V0aW5nLiBNZXNzYWdlIGlzIHJvdXRlZCBkaXJlY3RseSB0byB0aGUgZXh0ZXJuYWwgcm91dGluZyBfb25Qb3N0TWVzc2FnZS5cclxuICAgKiBAcGFyYW0gIHtNZXNzYWdlfSBpbk1zZyAgICAgICAgICAgIEpTT04gd2l0aCBtYW5kYXRvcnkgTWVzc2FnZSBzdHJ1Y3R1cmUge2lkLCB0eXBlLCBmcm9tLCB0b31cclxuICAgKiBAcGFyYW0gIHtDYWxsYmFja30gcmVzcG9uc2VDYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayBpZiBhIHJlc3BvbnNlIGlzIGV4cGVjdGVkIGZyb20gdGhlIHJlcXVlc3QuIEEgcmVzcG9uc2Ugd2lsbCBiZSBhbHdheXMgc2VudCwgZXZlbiBpZiBpdCBpcyBhIFwiVGltZW91dFwiLlxyXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgICAgICAgICAgICB0aGUgTWVzc2FnZSBpZFxyXG4gICAqL1xyXG4gIHBvc3RNZXNzYWdlKGluTXNnLCByZXNwb25zZUNhbGxiYWNrLCB0aW1lb3V0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9nZW5JZChpbk1zZyk7XHJcbiAgICBfdGhpcy5fcmVzcG9uc2VDYWxsYmFjayhpbk1zZywgcmVzcG9uc2VDYWxsYmFjaywgdGltZW91dCk7XHJcblxyXG4gICAgLy9hbHdheXMgc2VuZCB0byBleHRlcm5hbCAodG8gY29yZSBNZXNzYWdlQnVzKVxyXG4gICAgX3RoaXMuX29uUG9zdE1lc3NhZ2UoaW5Nc2cpO1xyXG5cclxuICAgIHJldHVybiBpbk1zZy5pZDtcclxuICB9XHJcblxyXG4gIC8vaW50ZXJuYWwgbWV0aG9kIHVzZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYnkgYW4gZXh0ZXJuYWwgcm91dGluZyBzeXN0ZW1cclxuICBfb25NZXNzYWdlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoIV90aGlzLl9vblJlc3BvbnNlKG1zZykpIHtcclxuICAgICAgbGV0IGl0ZW1MaXN0ID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbbXNnLnRvXTtcclxuICAgICAgaWYgKGl0ZW1MaXN0KSB7XHJcbiAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbihpdGVtTGlzdCwgbXNnKTtcclxuICAgICAgICBpZiAoIW1zZy50by5zdGFydHNXaXRoKCdoeXBlcnR5JykpIHtcclxuICAgICAgICAgIF90aGlzLl9wdWJsaXNoT25EZWZhdWx0KG1zZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aGlzLl9wdWJsaXNoT25EZWZhdWx0KG1zZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNaW5pQnVzO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTtBQUVBOzs7Ozs7QUFLQTs7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQXZDQTtBQUNBO0FBMENBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6\n')},7:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log system\n\nvar log = loglevel__WEBPACK_IMPORTED_MODULE_0__["getLogger"](\'Bus\');\n/**\r\n* @author micaelpedrosa@gmail.com\r\n* Minimal interface and implementation to send and receive messages. It can be reused in many type of components.\r\n* Components that need a message system should receive this class as a dependency or extend it.\r\n* Extensions should implement the following private methods: _onPostMessage and _registerExternalListener\r\n*/\n\nvar Bus =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _msgId: number;\r\n _subscriptions: \r\n _responseTimeOut: number\r\n _responseCallbacks: void>\r\n */\n function Bus() {\n _classCallCheck(this, Bus);\n\n var _this = this;\n\n _this._msgId = 0;\n _this._subscriptions = {};\n _this._responseTimeOut = 15000; //default to 3s\n\n _this._responseCallbacks = {};\n\n _this._registerExternalListener();\n }\n /**\r\n * Register listener to receive message when "msg.to === url".\r\n * Special url "*" for default listener is accepted to intercept all messages.\r\n * @param {URL} url Address to intercept, tha is in the message "to"\r\n * @param {Listener} listener listener\r\n * @return {MsgListener} instance of MsgListener\r\n */\n\n\n _createClass(Bus, [{\n key: "addListener",\n value: function addListener(url, listener) {\n var _this = this;\n\n var item = new MsgListener(_this._subscriptions, url, listener);\n var itemList = _this._subscriptions[url];\n\n if (!itemList) {\n itemList = [];\n _this._subscriptions[url] = itemList;\n }\n\n itemList.push(item);\n return item;\n }\n /**\r\n * Manually add a response listener. Only one listener per message ID should exist.\r\n * ATENTION, there is no timeout for this listener.\r\n * The listener should be removed with a removeResponseListener, failing to do this will result in a unreleased memory problem.\r\n * @param {URL} url Origin address of the message sent, "msg.from".\r\n * @param {number} msgId Message ID that is returned from the postMessage.\r\n * @param {Function} responseListener Callback function for the response\r\n */\n\n }, {\n key: "addResponseListener",\n value: function addResponseListener(url, msgId, responseListener) {\n this._responseCallbacks[url + msgId] = responseListener;\n }\n /**\r\n * Remove the response listener.\r\n * @param {URL} url Origin address of the message sent, "msg.from".\r\n * @param {number} msgId Message ID that is returned from the postMessage\r\n */\n\n }, {\n key: "removeResponseListener",\n value: function removeResponseListener(url, msgId) {\n delete this._responseCallbacks[url + msgId];\n }\n /**\r\n * Remove all existent listeners for the URL\r\n * @param {URL} url Address registered\r\n */\n\n }, {\n key: "removeAllListenersOf",\n value: function removeAllListenersOf(url) {\n delete this._subscriptions[url];\n }\n /**\r\n * Helper method to bind listeners (in both directions) into other MiniBus target.\r\n * @param {URL} outUrl Outbound URL, register listener for url in direction "this -> target"\r\n * @param {URL} inUrl Inbound URL, register listener for url in direction "target -> this"\r\n * @param {MiniBus} target The other target MiniBus\r\n * @return {Bound} an object that contains the properties [thisListener, targetListener] and the unbind method.\r\n */\n\n }, {\n key: "bind",\n value: function bind(outUrl, inUrl, target) {\n var _this2 = this;\n\n var _this = this;\n\n var thisListn = _this.addListener(outUrl, function (msg) {\n target.postMessage(msg);\n });\n\n var targetListn = target.addListener(inUrl, function (msg) {\n _this.postMessage(msg);\n });\n return {\n thisListener: thisListn,\n targetListener: targetListn,\n unbind: function unbind() {\n _this2.thisListener.remove();\n\n _this2.targetListener.remove();\n }\n };\n } //publish on default listeners\n\n }, {\n key: "_publishOnDefault",\n value: function _publishOnDefault(msg) {\n //is there any "*" (default) listeners?\n var itemList = this._subscriptions[\'*\'];\n\n if (itemList) {\n this._publishOn(itemList, msg);\n }\n } //publish on a subscription list.\n\n }, {\n key: "_publishOn",\n value: function _publishOn(itemList, msg) {\n itemList.forEach(function (sub) {\n sub._callback(msg);\n });\n }\n }, {\n key: "_responseCallback",\n value: function _responseCallback(inMsg, responseCallback) {\n var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var _this = this; //automatic management of response handlers\n\n\n if (responseCallback) {\n var responseId = inMsg.from + inMsg.id;\n _this._responseCallbacks[responseId] = responseCallback;\n\n if (timeout) {\n setTimeout(function () {\n var responseFun = _this._responseCallbacks[responseId];\n delete _this._responseCallbacks[responseId];\n\n if (responseFun) {\n var errorMsg = {\n id: inMsg.id,\n type: \'response\',\n body: {\n code: 408,\n desc: \'Response timeout!\',\n value: inMsg\n }\n };\n responseFun(errorMsg);\n }\n }, _this._responseTimeOut);\n }\n }\n } //TODO: provisional responses should reset timeout\n\n }, {\n key: "_onResponse",\n value: function _onResponse(msg) {\n var _this = this;\n\n if (msg.type === \'response\') {\n var responseId = msg.to + msg.id;\n var responseFun = _this._responseCallbacks[responseId];\n\n if (msg.body.code >= 200) {\n //if it\'s a provisional response, don\'t delete response listener\n delete _this._responseCallbacks[responseId];\n }\n\n if (responseFun) {\n responseFun(msg);\n return true;\n }\n }\n\n return false;\n } //receive messages from external interface\n\n }, {\n key: "_onMessage",\n value: function _onMessage(msg) {\n var _this = this;\n\n if (!_this._onResponse(msg)) {\n var itemList = _this._subscriptions[msg.to];\n\n if (itemList) {\n _this._publishOn(itemList, msg);\n } else {\n _this._publishOnDefault(msg);\n }\n }\n }\n }, {\n key: "_genId",\n value: function _genId(inMsg) {\n //TODO: how do we manage message ID\'s? Should it be a global runtime counter, or per URL address?\n //Global counter will not work, because there will be multiple MiniBus instances!\n //Per URL, can be a lot of data to maintain!\n //Maybe a counter per MiniBus instance. This is the assumed solution for now.\n if (!inMsg.id || inMsg.id === 0) {\n this._msgId++;\n inMsg.id = this._msgId;\n }\n }\n /**\r\n * Send messages to local listeners, or if not exists to external listeners.\r\n * It\'s has an optional mechanism for automatic management of response handlers.\r\n * The response handler will be unregistered after receiving the response, or after response timeout (default to 3s).\r\n * @param {Message} msg Message to send. Message ID is automatically added to the message.\r\n * @param {Function} responseCallback Optional parameter, if the developer what\'s automatic response management.\r\n * @return {number} Returns the message ID, in case it should be needed for manual management of the response handler.\r\n */\n\n }, {\n key: "postMessage",\n value: function postMessage(inMsg, responseCallback) {}\n /**\r\n * Function to post messages with a number of retries in case timeouts occur.\r\n * @param {Message} msg Message to send. Message ID is automatically added to the message.\r\n * @param {Function} responseCallback Optional parameter, if the developer what\'s automatic response management.\r\n * @param {integer} retries number of retries when timeouts occur\r\n * @return {boolean} message delivery result;\r\n */\n\n }, {\n key: "postMessageWithRetries",\n value: function postMessageWithRetries(msg, retries, callback) {\n var _this = this;\n\n var retry = 0; //let timeout = true;\n\n var sendMsg = function sendMsg() {\n return new Promise(function (resolve, reject) {\n _this.postMessage(msg, function (reply) {\n if (reply.body.code === 408 || reply.body.code === 500) reject();else {\n log.info(\'[Bus.postMessageWithRetries] msg delivered: \', msg);\n callback(reply);\n resolve();\n }\n });\n });\n };\n\n var tryAgain = function tryAgain() {\n sendMsg().then(function () {\n //timeout = false;\n return;\n }, function () {\n log.warn("[Bus.postMessageWithRetries] Message Bounced (retry ".concat(retry, "): \'"), msg);\n\n if (retry++ < retries) {\n tryAgain(); // setTimeout(() => { tryAgain(); }, 1000);\n } else {\n var error = "[Error] Message Bounced (delivery attempts ".concat(retries, "): \'");\n throw new Error(error + msg);\n }\n });\n };\n\n tryAgain();\n }\n /**\r\n * Not public available, used by the class extension implementation, to process messages from the public "postMessage" without a registered listener.\r\n * Used to send the message to an external interface, like a WebWorker, IFrame, etc.\r\n * @param {Message.Message} msg Message\r\n */\n\n }, {\n key: "_onPostMessage",\n value: function _onPostMessage(msg) {}\n /*implementation will send message to external system*/\n\n /**\r\n * Not public available, used by the class extension implementation, to process all messages that enter the MiniBus from an external interface, like a WebWorker, IFrame, etc.\r\n * This method is called one time in the constructor to register external listeners.\r\n * The implementation will probably call the "_onMessage" method to publish in the local listeners.\r\n * DO NOT call "postMessage", there is a danger that the message enters in a cycle!\r\n */\n\n }, {\n key: "_registerExternalListener",\n value: function _registerExternalListener() {\n /*implementation will register external listener and call "this._onMessage(msg)" */\n }\n }]);\n\n return Bus;\n}();\n\nvar MsgListener =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _subscriptions: ;\r\n _url: string;\r\n _callback: (msg) => void;\r\n */\n function MsgListener(subscriptions, url, callback) {\n _classCallCheck(this, MsgListener);\n\n var _this = this;\n\n _this._subscriptions = subscriptions;\n _this._url = url;\n _this._callback = callback;\n }\n\n _createClass(MsgListener, [{\n key: "remove",\n\n /**\r\n * Remove this listener from the Bus\r\n */\n value: function remove() {\n var _this = this;\n\n var subs = _this._subscriptions[_this._url];\n\n if (subs) {\n var index = subs.indexOf(_this);\n subs.splice(index, 1); //if there are no listeners, remove the subscription entirely.\n\n if (subs.length === 0) {\n delete _this._subscriptions[_this._url];\n }\n }\n }\n }, {\n key: "url",\n get: function get() {\n return this._url;\n }\n }]);\n\n return MsgListener;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (Bus);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy9idXMvQnVzLmpzPzJlZjIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gTG9nIHN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQnVzJyk7XHJcblxyXG4vKipcclxuKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXHJcbiogTWluaW1hbCBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uIHRvIHNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMuIEl0IGNhbiBiZSByZXVzZWQgaW4gbWFueSB0eXBlIG9mIGNvbXBvbmVudHMuXHJcbiogQ29tcG9uZW50cyB0aGF0IG5lZWQgYSBtZXNzYWdlIHN5c3RlbSBzaG91bGQgcmVjZWl2ZSB0aGlzIGNsYXNzIGFzIGEgZGVwZW5kZW5jeSBvciBleHRlbmQgaXQuXHJcbiogRXh0ZW5zaW9ucyBzaG91bGQgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcHJpdmF0ZSBtZXRob2RzOiBfb25Qb3N0TWVzc2FnZSBhbmQgX3JlZ2lzdGVyRXh0ZXJuYWxMaXN0ZW5lclxyXG4qL1xyXG5jbGFzcyBCdXMge1xyXG4gIC8qIHByaXZhdGVcclxuICBfbXNnSWQ6IG51bWJlcjtcclxuICBfc3Vic2NyaXB0aW9uczogPHVybDogTXNnTGlzdGVuZXJbXT5cclxuXHJcbiAgX3Jlc3BvbnNlVGltZU91dDogbnVtYmVyXHJcbiAgX3Jlc3BvbnNlQ2FsbGJhY2tzOiA8dXJsK2lkOiAobXNnKSA9PiB2b2lkPlxyXG5cclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fbXNnSWQgPSAwO1xyXG4gICAgX3RoaXMuX3N1YnNjcmlwdGlvbnMgPSB7fTtcclxuXHJcbiAgICBfdGhpcy5fcmVzcG9uc2VUaW1lT3V0ID0gMTUwMDA7IC8vZGVmYXVsdCB0byAzc1xyXG4gICAgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzID0ge307XHJcblxyXG4gICAgX3RoaXMuX3JlZ2lzdGVyRXh0ZXJuYWxMaXN0ZW5lcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBSZWdpc3RlciBsaXN0ZW5lciB0byByZWNlaXZlIG1lc3NhZ2Ugd2hlbiBcIm1zZy50byA9PT0gdXJsXCIuXHJcbiAgKiBTcGVjaWFsIHVybCBcIipcIiBmb3IgZGVmYXVsdCBsaXN0ZW5lciBpcyBhY2NlcHRlZCB0byBpbnRlcmNlcHQgYWxsIG1lc3NhZ2VzLlxyXG4gICogQHBhcmFtIHtVUkx9IHVybCBBZGRyZXNzIHRvIGludGVyY2VwdCwgdGhhIGlzIGluIHRoZSBtZXNzYWdlIFwidG9cIlxyXG4gICogQHBhcmFtIHtMaXN0ZW5lcn0gbGlzdGVuZXIgbGlzdGVuZXJcclxuICAqIEByZXR1cm4ge01zZ0xpc3RlbmVyfSBpbnN0YW5jZSBvZiBNc2dMaXN0ZW5lclxyXG4gICovXHJcbiAgYWRkTGlzdGVuZXIodXJsLCBsaXN0ZW5lcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgaXRlbSA9IG5ldyBNc2dMaXN0ZW5lcihfdGhpcy5fc3Vic2NyaXB0aW9ucywgdXJsLCBsaXN0ZW5lcik7XHJcbiAgICBsZXQgaXRlbUxpc3QgPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1cmxdO1xyXG4gICAgaWYgKCFpdGVtTGlzdCkge1xyXG4gICAgICBpdGVtTGlzdCA9IFtdO1xyXG4gICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1cmxdID0gaXRlbUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaXRlbUxpc3QucHVzaChpdGVtKTtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFudWFsbHkgYWRkIGEgcmVzcG9uc2UgbGlzdGVuZXIuIE9ubHkgb25lIGxpc3RlbmVyIHBlciBtZXNzYWdlIElEIHNob3VsZCBleGlzdC5cclxuICAgKiBBVEVOVElPTiwgdGhlcmUgaXMgbm8gdGltZW91dCBmb3IgdGhpcyBsaXN0ZW5lci5cclxuICAgKiBUaGUgbGlzdGVuZXIgc2hvdWxkIGJlIHJlbW92ZWQgd2l0aCBhIHJlbW92ZVJlc3BvbnNlTGlzdGVuZXIsIGZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiBhIHVucmVsZWFzZWQgbWVtb3J5IHByb2JsZW0uXHJcbiAgICogQHBhcmFtIHtVUkx9IHVybCBPcmlnaW4gYWRkcmVzcyBvZiB0aGUgbWVzc2FnZSBzZW50LCBcIm1zZy5mcm9tXCIuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1zZ0lkIE1lc3NhZ2UgSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIHRoZSBwb3N0TWVzc2FnZS5cclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNwb25zZUxpc3RlbmVyIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgcmVzcG9uc2VcclxuICAgKi9cclxuICBhZGRSZXNwb25zZUxpc3RlbmVyKHVybCwgbXNnSWQsIHJlc3BvbnNlTGlzdGVuZXIpIHtcclxuICAgIHRoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3VybCArIG1zZ0lkXSA9IHJlc3BvbnNlTGlzdGVuZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdGhlIHJlc3BvbnNlIGxpc3RlbmVyLlxyXG4gICAqIEBwYXJhbSB7VVJMfSB1cmwgT3JpZ2luIGFkZHJlc3Mgb2YgdGhlIG1lc3NhZ2Ugc2VudCwgXCJtc2cuZnJvbVwiLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtc2dJZCAgTWVzc2FnZSBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gdGhlIHBvc3RNZXNzYWdlXHJcbiAgICovXHJcbiAgcmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcih1cmwsIG1zZ0lkKSB7XHJcbiAgICBkZWxldGUgdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbdXJsICsgbXNnSWRdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFsbCBleGlzdGVudCBsaXN0ZW5lcnMgZm9yIHRoZSBVUkxcclxuICAgKiBAcGFyYW0gIHtVUkx9IHVybCBBZGRyZXNzIHJlZ2lzdGVyZWRcclxuICAgKi9cclxuICByZW1vdmVBbGxMaXN0ZW5lcnNPZih1cmwpIHtcclxuICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpcHRpb25zW3VybF07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGJpbmQgbGlzdGVuZXJzIChpbiBib3RoIGRpcmVjdGlvbnMpIGludG8gb3RoZXIgTWluaUJ1cyB0YXJnZXQuXHJcbiAgICogQHBhcmFtICB7VVJMfSBvdXRVcmwgT3V0Ym91bmQgVVJMLCByZWdpc3RlciBsaXN0ZW5lciBmb3IgdXJsIGluIGRpcmVjdGlvbiBcInRoaXMgLT4gdGFyZ2V0XCJcclxuICAgKiBAcGFyYW0gIHtVUkx9IGluVXJsIEluYm91bmQgVVJMLCByZWdpc3RlciBsaXN0ZW5lciBmb3IgdXJsIGluIGRpcmVjdGlvbiBcInRhcmdldCAtPiB0aGlzXCJcclxuICAgKiBAcGFyYW0gIHtNaW5pQnVzfSB0YXJnZXQgVGhlIG90aGVyIHRhcmdldCBNaW5pQnVzXHJcbiAgICogQHJldHVybiB7Qm91bmR9IGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIFt0aGlzTGlzdGVuZXIsIHRhcmdldExpc3RlbmVyXSBhbmQgdGhlIHVuYmluZCBtZXRob2QuXHJcbiAgICovXHJcbiAgYmluZChvdXRVcmwsIGluVXJsLCB0YXJnZXQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IHRoaXNMaXN0biA9IF90aGlzLmFkZExpc3RlbmVyKG91dFVybCwgKG1zZykgPT4ge1xyXG4gICAgICB0YXJnZXQucG9zdE1lc3NhZ2UobXNnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCB0YXJnZXRMaXN0biA9IHRhcmdldC5hZGRMaXN0ZW5lcihpblVybCwgKG1zZykgPT4ge1xyXG4gICAgICBfdGhpcy5wb3N0TWVzc2FnZShtc2cpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGhpc0xpc3RlbmVyOiB0aGlzTGlzdG4sXHJcbiAgICAgIHRhcmdldExpc3RlbmVyOiB0YXJnZXRMaXN0bixcclxuICAgICAgdW5iaW5kOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50aGlzTGlzdGVuZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy50YXJnZXRMaXN0ZW5lci5yZW1vdmUoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vcHVibGlzaCBvbiBkZWZhdWx0IGxpc3RlbmVyc1xyXG4gIF9wdWJsaXNoT25EZWZhdWx0KG1zZykge1xyXG4gICAgLy9pcyB0aGVyZSBhbnkgXCIqXCIgKGRlZmF1bHQpIGxpc3RlbmVycz9cclxuICAgIGxldCBpdGVtTGlzdCA9IHRoaXMuX3N1YnNjcmlwdGlvbnNbJyonXTtcclxuICAgIGlmIChpdGVtTGlzdCkge1xyXG4gICAgICB0aGlzLl9wdWJsaXNoT24oaXRlbUxpc3QsIG1zZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL3B1Ymxpc2ggb24gYSBzdWJzY3JpcHRpb24gbGlzdC5cclxuICBfcHVibGlzaE9uKGl0ZW1MaXN0LCBtc2cpIHtcclxuICAgIGl0ZW1MaXN0LmZvckVhY2goKHN1YikgPT4ge1xyXG4gICAgICBzdWIuX2NhbGxiYWNrKG1zZyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9yZXNwb25zZUNhbGxiYWNrKGluTXNnLCByZXNwb25zZUNhbGxiYWNrLCB0aW1lb3V0ID0gdHJ1ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL2F1dG9tYXRpYyBtYW5hZ2VtZW50IG9mIHJlc3BvbnNlIGhhbmRsZXJzXHJcbiAgICBpZiAocmVzcG9uc2VDYWxsYmFjaykge1xyXG4gICAgICBsZXQgcmVzcG9uc2VJZCA9IGluTXNnLmZyb20gKyBpbk1zZy5pZDtcclxuICAgICAgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdID0gcmVzcG9uc2VDYWxsYmFjaztcclxuXHJcbiAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgcmVzcG9uc2VGdW4gPSBfdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbcmVzcG9uc2VJZF07XHJcbiAgICAgICAgICBkZWxldGUgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdO1xyXG5cclxuICAgICAgICAgIGlmIChyZXNwb25zZUZ1bikge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3JNc2cgPSB7XHJcbiAgICAgICAgICAgICAgaWQ6IGluTXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLFxyXG4gICAgICAgICAgICAgIGJvZHk6IHsgY29kZTogNDA4LCBkZXNjOiAnUmVzcG9uc2UgdGltZW91dCEnLCB2YWx1ZTogaW5Nc2cgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmVzcG9uc2VGdW4oZXJyb3JNc2cpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIF90aGlzLl9yZXNwb25zZVRpbWVPdXQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8vVE9ETzogcHJvdmlzaW9uYWwgcmVzcG9uc2VzIHNob3VsZCByZXNldCB0aW1lb3V0XHJcbiAgX29uUmVzcG9uc2UobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmIChtc2cudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xyXG4gICAgICBsZXQgcmVzcG9uc2VJZCA9IG1zZy50byArIG1zZy5pZDtcclxuICAgICAgbGV0IHJlc3BvbnNlRnVuID0gX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdO1xyXG5cclxuICAgICAgaWYgKG1zZy5ib2R5LmNvZGUgPj0gMjAwKSB7IC8vaWYgaXQncyBhIHByb3Zpc2lvbmFsIHJlc3BvbnNlLCBkb24ndCBkZWxldGUgcmVzcG9uc2UgbGlzdGVuZXJcclxuICAgICAgICBkZWxldGUgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVzcG9uc2VGdW4pIHtcclxuICAgICAgICByZXNwb25zZUZ1bihtc2cpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvL3JlY2VpdmUgbWVzc2FnZXMgZnJvbSBleHRlcm5hbCBpbnRlcmZhY2VcclxuICBfb25NZXNzYWdlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoIV90aGlzLl9vblJlc3BvbnNlKG1zZykpIHtcclxuICAgICAgbGV0IGl0ZW1MaXN0ID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbbXNnLnRvXTtcclxuICAgICAgaWYgKGl0ZW1MaXN0KSB7XHJcbiAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbihpdGVtTGlzdCwgbXNnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBfdGhpcy5fcHVibGlzaE9uRGVmYXVsdChtc2cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfZ2VuSWQoaW5Nc2cpIHtcclxuICAgIC8vVE9ETzogaG93IGRvIHdlIG1hbmFnZSBtZXNzYWdlIElEJ3M/IFNob3VsZCBpdCBiZSBhIGdsb2JhbCBydW50aW1lIGNvdW50ZXIsIG9yIHBlciBVUkwgYWRkcmVzcz9cclxuICAgIC8vR2xvYmFsIGNvdW50ZXIgd2lsbCBub3Qgd29yaywgYmVjYXVzZSB0aGVyZSB3aWxsIGJlIG11bHRpcGxlIE1pbmlCdXMgaW5zdGFuY2VzIVxyXG4gICAgLy9QZXIgVVJMLCBjYW4gYmUgYSBsb3Qgb2YgZGF0YSB0byBtYWludGFpbiFcclxuICAgIC8vTWF5YmUgYSBjb3VudGVyIHBlciBNaW5pQnVzIGluc3RhbmNlLiBUaGlzIGlzIHRoZSBhc3N1bWVkIHNvbHV0aW9uIGZvciBub3cuXHJcbiAgICBpZiAoIWluTXNnLmlkIHx8IGluTXNnLmlkID09PSAwKSB7XHJcbiAgICAgIHRoaXMuX21zZ0lkKys7XHJcbiAgICAgIGluTXNnLmlkID0gdGhpcy5fbXNnSWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNlbmQgbWVzc2FnZXMgdG8gbG9jYWwgbGlzdGVuZXJzLCBvciBpZiBub3QgZXhpc3RzIHRvIGV4dGVybmFsIGxpc3RlbmVycy5cclxuICAqIEl0J3MgaGFzIGFuIG9wdGlvbmFsIG1lY2hhbmlzbSBmb3IgYXV0b21hdGljIG1hbmFnZW1lbnQgb2YgcmVzcG9uc2UgaGFuZGxlcnMuXHJcbiAgKiBUaGUgcmVzcG9uc2UgaGFuZGxlciB3aWxsIGJlIHVucmVnaXN0ZXJlZCBhZnRlciByZWNlaXZpbmcgdGhlIHJlc3BvbnNlLCBvciBhZnRlciByZXNwb25zZSB0aW1lb3V0IChkZWZhdWx0IHRvIDNzKS5cclxuICAqIEBwYXJhbSAge01lc3NhZ2V9IG1zZyBNZXNzYWdlIHRvIHNlbmQuIE1lc3NhZ2UgSUQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgbWVzc2FnZS5cclxuICAqIEBwYXJhbSAge0Z1bmN0aW9ufSByZXNwb25zZUNhbGxiYWNrIE9wdGlvbmFsIHBhcmFtZXRlciwgaWYgdGhlIGRldmVsb3BlciB3aGF0J3MgYXV0b21hdGljIHJlc3BvbnNlIG1hbmFnZW1lbnQuXHJcbiAgKiBAcmV0dXJuIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lc3NhZ2UgSUQsIGluIGNhc2UgaXQgc2hvdWxkIGJlIG5lZWRlZCBmb3IgbWFudWFsIG1hbmFnZW1lbnQgb2YgdGhlIHJlc3BvbnNlIGhhbmRsZXIuXHJcbiAgKi9cclxuICBwb3N0TWVzc2FnZShpbk1zZywgcmVzcG9uc2VDYWxsYmFjaykgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIHBvc3QgbWVzc2FnZXMgd2l0aCBhIG51bWJlciBvZiByZXRyaWVzIGluIGNhc2UgdGltZW91dHMgb2NjdXIuXHJcbiAgICogQHBhcmFtICB7TWVzc2FnZX0gbXNnIE1lc3NhZ2UgdG8gc2VuZC4gTWVzc2FnZSBJRCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBtZXNzYWdlLlxyXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSByZXNwb25zZUNhbGxiYWNrIE9wdGlvbmFsIHBhcmFtZXRlciwgaWYgdGhlIGRldmVsb3BlciB3aGF0J3MgYXV0b21hdGljIHJlc3BvbnNlIG1hbmFnZW1lbnQuXHJcbiAgICogQHBhcmFtICB7aW50ZWdlcn0gcmV0cmllcyBudW1iZXIgb2YgcmV0cmllcyB3aGVuIHRpbWVvdXRzIG9jY3VyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gbWVzc2FnZSBkZWxpdmVyeSByZXN1bHQ7XHJcbiAgICovXHJcblxyXG5cclxuICBwb3N0TWVzc2FnZVdpdGhSZXRyaWVzKG1zZywgcmV0cmllcywgY2FsbGJhY2spIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCByZXRyeSA9IDA7XHJcbiAgICAvL2xldCB0aW1lb3V0ID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgc2VuZE1zZyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBfdGhpcy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gNDA4IHx8IHJlcGx5LmJvZHkuY29kZSA9PT0gNTAwKSByZWplY3QoKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsb2cuaW5mbygnW0J1cy5wb3N0TWVzc2FnZVdpdGhSZXRyaWVzXSBtc2cgZGVsaXZlcmVkOiAnLCBtc2cpO1xyXG4gICAgICAgICAgICBjYWxsYmFjayhyZXBseSk7XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCB0cnlBZ2FpbiA9ICgpID0+IHtcclxuICAgICAgc2VuZE1zZygpLnRoZW4oKCk9PntcclxuICAgICAgICAvL3RpbWVvdXQgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0sICgpPT57XHJcbiAgICAgICAgbG9nLndhcm4oYFtCdXMucG9zdE1lc3NhZ2VXaXRoUmV0cmllc10gTWVzc2FnZSBCb3VuY2VkIChyZXRyeSAke3JldHJ5fSk6ICdgLCBtc2cpO1xyXG4gICAgICAgIGlmIChyZXRyeSsrIDwgcmV0cmllcykge1xyXG4gICAgICAgICAgdHJ5QWdhaW4oKTtcclxuICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4geyB0cnlBZ2FpbigpOyB9LCAxMDAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBgW0Vycm9yXSBNZXNzYWdlIEJvdW5jZWQgKGRlbGl2ZXJ5IGF0dGVtcHRzICR7cmV0cmllc30pOiAnYDtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvciArIG1zZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICB0cnlBZ2FpbigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTm90IHB1YmxpYyBhdmFpbGFibGUsIHVzZWQgYnkgdGhlIGNsYXNzIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiwgdG8gcHJvY2VzcyBtZXNzYWdlcyBmcm9tIHRoZSBwdWJsaWMgXCJwb3N0TWVzc2FnZVwiIHdpdGhvdXQgYSByZWdpc3RlcmVkIGxpc3RlbmVyLlxyXG4gICAqIFVzZWQgdG8gc2VuZCB0aGUgbWVzc2FnZSB0byBhbiBleHRlcm5hbCBpbnRlcmZhY2UsIGxpa2UgYSBXZWJXb3JrZXIsIElGcmFtZSwgZXRjLlxyXG4gICAqIEBwYXJhbSAge01lc3NhZ2UuTWVzc2FnZX0gbXNnIE1lc3NhZ2VcclxuICAgKi9cclxuICBfb25Qb3N0TWVzc2FnZShtc2cpIHsgLyppbXBsZW1lbnRhdGlvbiB3aWxsIHNlbmQgbWVzc2FnZSB0byBleHRlcm5hbCBzeXN0ZW0qLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5vdCBwdWJsaWMgYXZhaWxhYmxlLCB1c2VkIGJ5IHRoZSBjbGFzcyBleHRlbnNpb24gaW1wbGVtZW50YXRpb24sIHRvIHByb2Nlc3MgYWxsIG1lc3NhZ2VzIHRoYXQgZW50ZXIgdGhlIE1pbmlCdXMgZnJvbSBhbiBleHRlcm5hbCBpbnRlcmZhY2UsIGxpa2UgYSBXZWJXb3JrZXIsIElGcmFtZSwgZXRjLlxyXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmUgdGltZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gcmVnaXN0ZXIgZXh0ZXJuYWwgbGlzdGVuZXJzLlxyXG4gICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIHByb2JhYmx5IGNhbGwgdGhlIFwiX29uTWVzc2FnZVwiIG1ldGhvZCB0byBwdWJsaXNoIGluIHRoZSBsb2NhbCBsaXN0ZW5lcnMuXHJcbiAgICogRE8gTk9UIGNhbGwgXCJwb3N0TWVzc2FnZVwiLCB0aGVyZSBpcyBhIGRhbmdlciB0aGF0IHRoZSBtZXNzYWdlIGVudGVycyBpbiBhIGN5Y2xlIVxyXG4gICAqL1xyXG4gIF9yZWdpc3RlckV4dGVybmFsTGlzdGVuZXIoKSB7IC8qaW1wbGVtZW50YXRpb24gd2lsbCByZWdpc3RlciBleHRlcm5hbCBsaXN0ZW5lciBhbmQgY2FsbCBcInRoaXMuX29uTWVzc2FnZShtc2cpXCIgKi8gfVxyXG5cclxufVxyXG5cclxuY2xhc3MgTXNnTGlzdGVuZXIge1xyXG4gIC8qIHByaXZhdGVcclxuICBfc3Vic2NyaXB0aW9uczogPHN0cmluZzogTXNnTGlzdGVuZXJbXT47XHJcbiAgX3VybDogc3RyaW5nO1xyXG4gIF9jYWxsYmFjazogKG1zZykgPT4gdm9pZDtcclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3RvcihzdWJzY3JpcHRpb25zLCB1cmwsIGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9zdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucztcclxuICAgIF90aGlzLl91cmwgPSB1cmw7XHJcbiAgICBfdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIGdldCB1cmwoKSB7IHJldHVybiB0aGlzLl91cmw7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHRoaXMgbGlzdGVuZXIgZnJvbSB0aGUgQnVzXHJcbiAgICovXHJcbiAgcmVtb3ZlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgc3VicyA9IF90aGlzLl9zdWJzY3JpcHRpb25zW190aGlzLl91cmxdO1xyXG4gICAgaWYgKHN1YnMpIHtcclxuICAgICAgbGV0IGluZGV4ID0gc3Vicy5pbmRleE9mKF90aGlzKTtcclxuICAgICAgc3Vicy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgLy9pZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLCByZW1vdmUgdGhlIHN1YnNjcmlwdGlvbiBlbnRpcmVseS5cclxuICAgICAgaWYgKHN1YnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgZGVsZXRlIF90aGlzLl9zdWJzY3JpcHRpb25zW190aGlzLl91cmxdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdXM7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU1BOzs7QUFDQTs7Ozs7O0FBU0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFOQTtBQVFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUVBOzs7Ozs7Ozs7O0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFNQTtBQUFBO0FBQUE7Ozs7OztBQUlBOzs7QUFDQTs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUdBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFsQkE7QUFBQTtBQUFBOzs7Ozs7QUFxQkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7\n')}})}); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("minibus",[],t):"object"==typeof exports?exports.minibus=t():e.minibus=t()}(window,function(){return function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=29)}({1:function(e,t,n){var o,i;!function(r,s){"use strict";void 0===(i="function"==typeof(o=function(){var e=function(){},t="undefined",n=["trace","debug","info","warn","error"];function o(e,t){var n=e[t];if("function"==typeof n.bind)return n.bind(e);try{return Function.prototype.bind.call(n,e)}catch(t){return function(){return Function.prototype.apply.apply(n,[e,arguments])}}}function i(t,o){for(var i=0;i=0&&o<=l.levels.SILENT))throw"log.setLevel() called with invalid level: "+o;if(u=o,!1!==r&&function(e){var o=(n[e]||"silent").toUpperCase();if(typeof window!==t){try{return void(window.localStorage[c]=o)}catch(e){}try{window.document.cookie=encodeURIComponent(c)+"="+o+";"}catch(e){}}}(o),i.call(l,o,e),typeof console===t&&o2&&void 0!==arguments[2])||arguments[2],o=this;if(t){var i=e.from+e.id;o._responseCallbacks[i]=t,n&&setTimeout(function(){var t=o._responseCallbacks[i];delete o._responseCallbacks[i],t&&t({id:e.id,type:"response",body:{code:408,desc:"Response timeout!",value:e}})},o._responseTimeOut)}}},{key:"_onResponse",value:function(e){if("response"===e.type){var t=e.to+e.id,n=this._responseCallbacks[t];if(e.body.code>=200&&delete this._responseCallbacks[t],n)return n(e),!0}return!1}},{key:"_onMessage",value:function(e){if(!this._onResponse(e)){var t=this._subscriptions[e.to];t?this._publishOn(t,e):this._publishOnDefault(e)}}},{key:"_genId",value:function(e){e.id&&0!==e.id||(this._msgId++,e.id=this._msgId)}},{key:"postMessage",value:function(e,t){}},{key:"postMessageWithRetries",value:function(e,t,n){var o=this,i=0;!function r(){new Promise(function(t,i){o.postMessage(e,function(o){408===o.body.code||500===o.body.code?i():(s.info("[Bus.postMessageWithRetries] msg delivered: ",e),n(o),t())})}).then(function(){},function(){if(s.warn("[Bus.postMessageWithRetries] Message Bounced (retry ".concat(i,"): '"),e),!(i++ 0 ? false : true;\n}\nfunction secondsSinceEpoch() {\n return Math.floor(Date.now() / 1000);\n}\n/**\r\n * Make a COPY of the original data\r\n * @param {Object} obj - object to be cloned\r\n * @return {Object}\r\n */\n\nfunction deepClone(obj) {\n //TODO: simple but inefficient JSON deep clone...\n if (obj) return JSON.parse(JSON.stringify(obj));\n}\nfunction removePathFromURL(url) {\n var splitURL = url.split('/');\n return splitURL[0] + '//' + splitURL[2] + '/' + splitURL[3];\n}\n/**\r\n * Obtains the user URL that corresponds to a given email\r\n * @param {string} userEmail The user email\r\n * @return {URL.URL} userURL The user URL\r\n */\n\nfunction getUserURLFromEmail(userEmail) {\n var indexOfAt = userEmail.indexOf('@');\n return 'user://' + userEmail.substring(indexOfAt + 1, userEmail.length) + '/' + userEmail.substring(0, indexOfAt);\n}\n/**\r\n * Obtains the user email that corresponds to a given URL\r\n * @param {URL.URL} userURL The user URL\r\n * @return {string} userEmail The user email\r\n */\n\nfunction getUserEmailFromURL(userURL) {\n var url = divideURL(userURL);\n return url.identity.replace('/', '') + '@' + url.domain; // identity field has '/exampleID' instead of 'exampleID'\n}\n/**\r\n * Check if the user identifier is already in the URL format, if not, convert to URL format\r\n * @param {string} identifier user identifier\r\n * @return {string} userURL the user URL\r\n */\n\nfunction convertToUserURL(identifier) {\n // check if the identifier is already in the url format\n if (identifier.substring(0, 7) === 'user://') {\n var dividedURL = divideURL(identifier); //check if the url is well formated\n\n if (dividedURL.domain && dividedURL.identity) {\n return identifier;\n } else {\n throw 'userURL with wrong format';\n } //if not, convert the user email to URL format\n\n } else {\n return getUserURLFromEmail(identifier);\n }\n}\nfunction isDataObjectURL(url) {\n var schemasToIgnore = ['domain-idp', 'runtime', 'domain', 'hyperty'];\n var splitURL = url.split('://');\n var urlSchema = splitURL[0];\n return schemasToIgnore.indexOf(urlSchema) === -1;\n}\nfunction isLegacy(url) {\n if (url.split('@').length > 1) {\n return true;\n } else {\n return false;\n }\n}\nfunction isURL(url) {\n return url.split('/').length >= 3;\n}\nfunction isUserURL(url) {\n return divideURL(url).type === 'user';\n}\nfunction isHypertyURL(url) {\n return divideURL(url).type === 'hyperty';\n}\n/**\r\n * get information relative each component configured on runtime configuration;\r\n * @param {object} configuration object with all configuration\r\n * @param {string} component string with the component to get the configuration, like, runtimeURLS, catalogueURLs, msgNodeURL, domainRegistryURL;\r\n * @param {string} resource type of resource to get, like, catalogue, runtimeUA, protocolstub, idpProxy\r\n * @return {object} return an object with all configurations;\r\n */\n\nfunction getConfigurationResources(configuration, component, resource) {\n var objectResource = configuration[component];\n var resourceType = objectResource[resource];\n return resourceType;\n}\n/**\r\n * Build a full url with the runtime configuration;\r\n * @param {object} configuration object with all configuration\r\n * @param {string} component string with the component to get the configuration, like, runtimeURLS, catalogueURLs, msgNodeURL, domainRegistryURL;\r\n * @param {string} resource type of resource to get, like, catalogue, runtimeUA, protocolstub, idpProxy\r\n * @param {string} type resource to get, like a hyperty name or protocolstub name;\r\n * @param {boolean} useFallback if true the function will check if have a fallback url;\r\n * @return {string} partial url to contact the resource;\r\n */\n\nfunction buildURL(configuration, component, resource, type) {\n var useFallback = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var objectResource = configuration[component];\n var url;\n\n if (!objectResource.hasOwnProperty(resource)) {\n throw Error('The configuration ' + JSON.stringify(objectResource, '', 2) + ' don\\'t have the ' + resource + ' resource you are looking for');\n }\n\n var resourceType = objectResource[resource];\n\n if (type) {\n url = resourceType.prefix + configuration.domain + resourceType.suffix + type;\n\n if (resourceType.hasOwnProperty('fallback') && useFallback) {\n if (resourceType.fallback.indexOf('%domain%')) {\n url = resourceType.fallback.replace(/(%domain%)/g, configuration.domain) + type;\n } else {\n url = resourceType.fallback + type;\n }\n }\n } else {\n url = resourceType.prefix + configuration.domain + resourceType.suffix;\n } // console.log(url);\n\n\n return url;\n}\n/**\r\n * Generate a Global Unique ID\r\n *\r\n * @returns String;\r\n */\n\nfunction generateGUID() {\n function s4() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);\n }\n\n return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();\n}\nfunction getUserIdentityDomain(url) {\n var dividedURL = divideURL(url);\n var splitedDomain = dividedURL.domain.split('.');\n var splitedLength = splitedDomain.length;\n\n if (splitedLength == 1) {\n return splitedDomain[splitedLength - 1];\n }\n\n var domain = splitedDomain[splitedLength - 2] + '.' + splitedDomain[splitedLength - 1];\n return domain;\n}\n/**\r\n * Check if URL is from a backend service\r\n * @param {string} url URL to be processed\r\n * @return {boolean}\r\n */\n\nfunction isBackendServiceURL(url) {\n var dividedURL = divideURL(url);\n var splitedDomain = dividedURL.domain.split('.');\n var backendSchemes = ['domain', 'global', 'domain-idp']; // should be defined in the runtime configuration\n\n var backendSubDomains = ['registry', 'msg-node']; // should be defined in the runtime configuration\n\n var subDomain;\n\n if (splitedDomain.length > 1) {\n subDomain = splitedDomain.filter(function (item) {\n return backendSubDomains.indexOf(item) !== -1;\n })[0];\n }\n\n if (subDomain && backendSubDomains.indexOf(subDomain) !== -1) {\n return true;\n }\n\n if (dividedURL.type) {\n return backendSchemes.indexOf(dividedURL.type) !== -1;\n }\n\n return false;\n}\nfunction divideEmail(email) {\n var indexOfAt = email.indexOf('@');\n var result = {\n username: email.substring(0, indexOfAt),\n domain: email.substring(indexOfAt + 1, email.length)\n };\n return result;\n}\nfunction assign(obj, keyPath, value) {\n if (!obj) obj = {};\n if (typeof keyPath === 'string') keyPath = parseAttributes(keyPath);\n var lastKeyIndex = keyPath.length - 1;\n\n for (var i = 0; i < lastKeyIndex; ++i) {\n var key = keyPath[i];\n\n if (!(key in obj)) {\n obj[key] = {};\n }\n\n obj = obj[key];\n }\n\n obj[keyPath[lastKeyIndex]] = value;\n}\nfunction splitObjectURL(dataObjectURL) {\n console.info('[utils - splitObjectURL]: ', dataObjectURL);\n var splitedURL = dataObjectURL.split('/');\n var url = splitedURL[0] + '//' + splitedURL[2] + '/' + splitedURL[3];\n var resource = splitedURL[5];\n var result = {\n url: url,\n resource: resource\n };\n console.info('[utils - splitObjectURL]: ', result);\n return result;\n}\nfunction checkAttribute(path) {\n var regex = /((([a-zA-Z]+):\\/\\/([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})\\/[a-zA-Z0-9.]+@[a-zA-Z0-9]+(-)?[a-zA-Z0-9]+(\\.)?[a-zA-Z0-9]{2,10}?\\.[a-zA-Z]{2,10})(.+(?=.identity))?/gm;\n var list = [];\n var final = [];\n var test = path.match(regex);\n\n if (test == null) {\n final = path.split('.');\n } else {\n var m;\n\n while ((m = regex.exec(path)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (m.index === regex.lastIndex) {\n regex.lastIndex++;\n } // The result can be accessed through the `m`-variable.\n\n\n m.forEach(function (match, groupIndex) {\n if (groupIndex === 0) {\n list.push(match);\n }\n });\n }\n\n var result;\n list.forEach(function (url) {\n result = path.replace(url, '*-*');\n final = result.split('.').map(function (item) {\n if (item === '*-*') {\n return url;\n }\n\n return item;\n });\n });\n }\n\n console.log('[RuntimeCore.Utils.checkAttribute]', final);\n return final;\n}\nfunction parseAttributes(path) {\n var regex = /([0-9a-zA-Z][-\\w]*):\\/\\//g;\n var string3 = 'identity';\n\n if (!path.includes('://')) {\n return path.split('.');\n } else {\n var string1 = path.split(regex)[0];\n var array1 = string1.split('.');\n var string2 = path.replace(string1, '');\n\n if (path.includes(string3)) {\n var array2 = string2.split(string3 + '.');\n console.log('array2 ' + array2);\n string2 = array2[0].slice('.', -1);\n array2 = array2[1].split('.');\n array1.push(string2, string3);\n array1 = array1.concat(array2);\n } else {\n array1.push(string2);\n }\n\n return array1.filter(Boolean);\n }\n}\nfunction isEmpty(obj) {\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n return false;\n }\n }\n\n return JSON.stringify(obj) === JSON.stringify({});\n}\nfunction chatkeysToStringCloner(sessionKeys) {\n var dataObjectSessionKeysClone = {};\n var fields = Object.keys(sessionKeys);\n\n if (fields) {\n try {\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n dataObjectSessionKeysClone[field] = {};\n dataObjectSessionKeysClone[field].sessionKey = sessionKeys[field].sessionKey.toString();\n dataObjectSessionKeysClone[field].isToEncrypt = sessionKeys[field].isToEncrypt;\n }\n } catch (err) {\n console.error('_chatkeysToStringCloner:err', err);\n }\n }\n\n return dataObjectSessionKeysClone;\n}\nfunction chatkeysToArrayCloner(sessionKeys) {\n var dataObjectSessionKeysClone = {};\n var fields = Object.keys(sessionKeys);\n\n if (fields) {\n try {\n for (var i = 0; i < fields.length; i++) {\n var field = fields[i];\n dataObjectSessionKeysClone[field] = {};\n var arrayValues = JSON.parse('[' + sessionKeys[field].sessionKey + ']');\n dataObjectSessionKeysClone[field].sessionKey = new Uint8Array(arrayValues);\n dataObjectSessionKeysClone[field].isToEncrypt = sessionKeys[field].isToEncrypt;\n }\n } catch (err) {\n console.error('_chatkeysToArrayCloner:err', err);\n }\n }\n\n return dataObjectSessionKeysClone;\n}\nfunction parseMessageURL(URL) {\n var splitedToURL = URL.split('/');\n\n if (splitedToURL.length <= 6) {\n return splitedToURL[0] + '//' + splitedToURL[2] + '/' + splitedToURL[3];\n } else {\n return splitedToURL[0] + '//' + splitedToURL[2] + '/' + splitedToURL[3] + '/' + splitedToURL[4];\n }\n}\nfunction availableSpace(usage, quota) {\n var available = (usage / quota).toFixed(2);\n return {\n quota: quota,\n usage: usage,\n percent: Number(available)\n };\n}\n/**\r\n* Encodes a JS object to base 64 encode\r\n* @param {Object} value byteArray value\r\n* @return {string} encoded value\r\n*/\n\nfunction encode(value) {\n try {\n var stringValue = stringify(value);\n return btoa(stringValue);\n } catch (err) {\n console.error('[Utils.encode:err] ' + err);\n throw err;\n }\n}\n/**\r\n * Decode a base64 string to object\r\n * @param {string_b64} value value encoded in base 64\r\n * @return {Object} decodedValue\r\n */\n\nfunction decode(value) {\n try {\n return JSON.parse(atob(value));\n } catch (err) {\n console.log('[Utils.decode:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Decode a base64 string to Uint8Array\r\n* @param {string_b64} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction decodeToUint8Array(value) {\n try {\n return new Uint8Array(decode(value));\n } catch (err) {\n console.error('[Utils.decodeToUint8Array:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Converts a JS object to string\r\n* NOTE: Special conversion for Uint8Arrays\r\n* @param {Object} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction stringify(value) {\n try {\n var stringValue;\n\n if (value.constructor === Uint8Array) {\n stringValue = '[' + value.toString() + ']'; // the [] is for JSON.parse compatibility\n } else {\n stringValue = JSON.stringify(value);\n }\n\n return stringValue;\n } catch (err) {\n console.error('[Utils.stringify:err] ' + err);\n throw err;\n }\n}\n/**\r\n* Converts a stringified object to object\r\n* @param {String} value byteArray value\r\n* @return {Object} encoded value\r\n*/\n\nfunction parse(value) {\n try {\n return JSON.parse(value);\n } catch (err) {\n console.error('[Utils.parse:err]' + err);\n console.trace();\n console.error('That that cause the error:', value);\n throw err;\n }\n}\n/**\r\n* Converts a stringified object to object\r\n* @param {String} value byteArray value\r\n* @return {Uint8Array} encoded value\r\n*/\n\nfunction parseToUint8Array(value) {\n try {\n return new Uint8Array(parse(value));\n } catch (err) {\n console.error('[Utils.parseToUint8Array:err]' + err);\n throw err;\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy91dGlscy91dGlscy5qcz9mYTdkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuLyoqXHJcbiAqIFN1cHBvcnQgbW9kdWxlIHdpdGggc29tZSBmdW5jdGlvbnMgd2lsbCBiZSB1c2VmdWxcclxuICogQG1vZHVsZSB1dGlsc1xyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAdHlwZWRlZiBkaXZpZGVVUkxcclxuICogQHR5cGUgT2JqZWN0XHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIFVSTFxyXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gb2YgVVJMXHJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZGVudGl0eSBUaGUgaWRlbnRpdHkgb2YgVVJMXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIERpdmlkZSBhbiB1cmwgaW4gdHlwZSwgZG9tYWluIGFuZCBpZGVudGl0eVxyXG4gKiBAcGFyYW0gIHtVUkwuVVJMfSB1cmwgLSB1cmwgYWRkcmVzc1xyXG4gKiBAcmV0dXJuIHtkaXZpZGVVUkx9IHRoZSByZXN1bHQgb2YgZGl2aWRlVVJMXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGl2aWRlVVJMKHVybCkge1xyXG5cclxuICBmdW5jdGlvbiByZWN1cnNlKHZhbHVlKSB7XHJcbiAgICBjb25zdCByZWdleCA9IC8oW2EtekEtWi1dKikoOlxcL1xcLyg/OlxcLik/fDopKFstYS16QS1aMC05QDolLl8rfiM9XXsyLDI1Nn0pKFstYS16QS1aMC05QDolLl8rfiM9L10qKS9naTtcclxuICAgIGNvbnN0IHN1YnN0ID0gJyQxLCQzLCQ0JztcclxuICAgIGxldCBwYXJ0cyA9IHZhbHVlLnJlcGxhY2UocmVnZXgsIHN1YnN0KS5zcGxpdCgnLCcpO1xyXG4gICAgcmV0dXJuIHBhcnRzO1xyXG4gIH1cclxuXHJcbiAgbGV0IHBhcnRzID0gcmVjdXJzZSh1cmwpO1xyXG5cclxuICAvLyBJZiB0aGUgdXJsIGhhcyBubyBzY2hlbWVcclxuICBpZiAocGFydHNbMF0gPT09IHVybCAmJiAhcGFydHNbMF0uaW5jbHVkZXMoJ0AnKSkge1xyXG5cclxuICAgIGxldCByZXN1bHQgPSB7XHJcbiAgICAgIHR5cGU6ICcnLFxyXG4gICAgICBkb21haW46IHVybCxcclxuICAgICAgaWRlbnRpdHk6ICcnXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnNvbGUud2FybignW0RpdmlkZVVSTF0gRGl2aWRlVVJMIGRvblxcJ3Qgc3VwcG9ydCB1cmwgd2l0aG91dCBzY2hlbWUuIFBsZWFzZSByZXZpZXcgeW91ciB1cmwgYWRkcmVzcycsIHVybCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8vIGNoZWNrIGlmIHRoZSB1cmwgaGFzIHRoZSBzY2hlbWUgYW5kIGluY2x1ZGVzIGFuIEBcclxuICBpZiAocGFydHNbMF0gPT09IHVybCAmJiBwYXJ0c1swXS5pbmNsdWRlcygnQCcpKSB7XHJcbiAgICBsZXQgc2NoZW1lID0gcGFydHNbMF0gPT09IHVybCA/ICdzbXRwJyA6IHBhcnRzWzBdO1xyXG4gICAgcGFydHMgPSByZWN1cnNlKHNjaGVtZSArICc6Ly8nICsgcGFydHNbMF0pO1xyXG4gIH1cclxuXHJcbiAgLy8gaWYgdGhlIGRvbWFpbiBpbmNsdWRlcyBhbiBALCBkaXZpZGUgaXQgdG8gZG9tYWluIGFuZCBpZGVudGl0eSByZXNwZWN0aXZlbHlcclxuICBpZiAocGFydHNbMV0uaW5jbHVkZXMoJ0AnKSkge1xyXG4gICAgcGFydHNbMl0gPSBwYXJ0c1swXSArICc6Ly8nICsgcGFydHNbMV07XHJcbiAgICBwYXJ0c1sxXSA9IHBhcnRzWzFdLnN1YnN0cihwYXJ0c1sxXS5pbmRleE9mKCdAJykgKyAxKTtcclxuICB9IFx0LyplbHNlIGlmIChwYXJ0c1syXS5pbmNsdWRlcygnLycpKSB7XHJcbiAgICBwYXJ0c1syXSA9IHBhcnRzWzJdLnN1YnN0cihwYXJ0c1syXS5sYXN0SW5kZXhPZignLycpKzEpO1xyXG4gIH0qL1xyXG5cclxuICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgdHlwZTogcGFydHNbMF0sXHJcbiAgICBkb21haW46IHBhcnRzWzFdLFxyXG4gICAgaWRlbnRpdHk6IHBhcnRzWzJdXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVjayBpZiBhbiBPYmplY3QgaXMgZW1wdHlcclxuICogQHBhcmFtICB7T2JqZWN0fSBvYmplY3QgT2JqZWN0IHRvIGJlIGNoZWNrZWRcclxuICogQHJldHVybiB7Qm9vbGVhbn0gICAgICAgc3RhdHVzIG9mIE9iamVjdCwgZW1wdHkgb3Igbm90ICh0cnVlfGZhbHNlKTtcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBlbXB0eU9iamVjdChvYmplY3QpIHtcclxuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KS5sZW5ndGggPiAwID8gZmFsc2UgOiB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2Vjb25kc1NpbmNlRXBvY2goKSB7XHJcbiAgcmV0dXJuIE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xyXG59XHJcblxyXG5cclxuLyoqXHJcbiAqIE1ha2UgYSBDT1BZIG9mIHRoZSBvcmlnaW5hbCBkYXRhXHJcbiAqIEBwYXJhbSAge09iamVjdH0gIG9iaiAtIG9iamVjdCB0byBiZSBjbG9uZWRcclxuICogQHJldHVybiB7T2JqZWN0fVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBDbG9uZShvYmopIHtcclxuICAvL1RPRE86IHNpbXBsZSBidXQgaW5lZmZpY2llbnQgSlNPTiBkZWVwIGNsb25lLi4uXHJcbiAgaWYgKG9iaikgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQYXRoRnJvbVVSTCh1cmwpIHtcclxuICBsZXQgc3BsaXRVUkwgPSB1cmwuc3BsaXQoJy8nKTtcclxuICByZXR1cm4gc3BsaXRVUkxbMF0gKyAnLy8nICsgc3BsaXRVUkxbMl0gKyAnLycgKyBzcGxpdFVSTFszXTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE9idGFpbnMgdGhlIHVzZXIgVVJMIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBlbWFpbFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVzZXJFbWFpbCBUaGUgdXNlciBlbWFpbFxyXG4gKiBAcmV0dXJuIHtVUkwuVVJMfSB1c2VyVVJMIFRoZSB1c2VyIFVSTFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJVUkxGcm9tRW1haWwodXNlckVtYWlsKSB7XHJcbiAgbGV0IGluZGV4T2ZBdCA9IHVzZXJFbWFpbC5pbmRleE9mKCdAJyk7XHJcbiAgcmV0dXJuICd1c2VyOi8vJyArIHVzZXJFbWFpbC5zdWJzdHJpbmcoaW5kZXhPZkF0ICsgMSwgdXNlckVtYWlsLmxlbmd0aCkgKyAnLycgKyB1c2VyRW1haWwuc3Vic3RyaW5nKDAsIGluZGV4T2ZBdCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBPYnRhaW5zIHRoZSB1c2VyIGVtYWlsIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBVUkxcclxuICogQHBhcmFtICB7VVJMLlVSTH0gdXNlclVSTCBUaGUgdXNlciBVUkxcclxuICogQHJldHVybiB7c3RyaW5nfSB1c2VyRW1haWwgVGhlIHVzZXIgZW1haWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRVc2VyRW1haWxGcm9tVVJMKHVzZXJVUkwpIHtcclxuICBsZXQgdXJsID0gZGl2aWRlVVJMKHVzZXJVUkwpO1xyXG4gIHJldHVybiB1cmwuaWRlbnRpdHkucmVwbGFjZSgnLycsICcnKSArICdAJyArIHVybC5kb21haW47IC8vIGlkZW50aXR5IGZpZWxkIGhhcyAnL2V4YW1wbGVJRCcgaW5zdGVhZCBvZiAnZXhhbXBsZUlEJ1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgdGhlIHVzZXIgaWRlbnRpZmllciBpcyBhbHJlYWR5IGluIHRoZSBVUkwgZm9ybWF0LCBpZiBub3QsIGNvbnZlcnQgdG8gVVJMIGZvcm1hdFxyXG4gKiBAcGFyYW0gIHtzdHJpbmd9ICAgaWRlbnRpZmllciAgdXNlciBpZGVudGlmaWVyXHJcbiAqIEByZXR1cm4ge3N0cmluZ30gICB1c2VyVVJMICAgIHRoZSB1c2VyIFVSTFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1VzZXJVUkwoaWRlbnRpZmllcikge1xyXG5cclxuICAvLyBjaGVjayBpZiB0aGUgaWRlbnRpZmllciBpcyBhbHJlYWR5IGluIHRoZSB1cmwgZm9ybWF0XHJcbiAgaWYgKGlkZW50aWZpZXIuc3Vic3RyaW5nKDAsIDcpID09PSAndXNlcjovLycpIHtcclxuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKGlkZW50aWZpZXIpO1xyXG5cclxuICAgIC8vY2hlY2sgaWYgdGhlIHVybCBpcyB3ZWxsIGZvcm1hdGVkXHJcbiAgICBpZiAoZGl2aWRlZFVSTC5kb21haW4gJiYgZGl2aWRlZFVSTC5pZGVudGl0eSkge1xyXG4gICAgICByZXR1cm4gaWRlbnRpZmllcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93ICd1c2VyVVJMIHdpdGggd3JvbmcgZm9ybWF0JztcclxuICAgIH1cclxuXHJcbiAgLy9pZiBub3QsIGNvbnZlcnQgdGhlIHVzZXIgZW1haWwgdG8gVVJMIGZvcm1hdFxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZ2V0VXNlclVSTEZyb21FbWFpbChpZGVudGlmaWVyKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFPYmplY3RVUkwodXJsKSB7XHJcbiAgbGV0IHNjaGVtYXNUb0lnbm9yZSA9IFsnZG9tYWluLWlkcCcsICdydW50aW1lJywgJ2RvbWFpbicsICdoeXBlcnR5J107XHJcbiAgbGV0IHNwbGl0VVJMID0gKHVybCkuc3BsaXQoJzovLycpO1xyXG4gIGxldCB1cmxTY2hlbWEgPSBzcGxpdFVSTFswXTtcclxuXHJcbiAgcmV0dXJuIHNjaGVtYXNUb0lnbm9yZS5pbmRleE9mKHVybFNjaGVtYSkgPT09IC0xO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNMZWdhY3kodXJsKSB7XHJcbiAgaWYgKHVybC5zcGxpdCgnQCcpLmxlbmd0aCA+IDEpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNVUkwodXJsKSB7XHJcbiAgcmV0dXJuICh1cmwpLnNwbGl0KCcvJykubGVuZ3RoID49IDM7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc1VzZXJVUkwodXJsKSB7XHJcbiAgcmV0dXJuIGRpdmlkZVVSTCh1cmwpLnR5cGUgPT09ICd1c2VyJztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzSHlwZXJ0eVVSTCh1cmwpIHtcclxuICByZXR1cm4gZGl2aWRlVVJMKHVybCkudHlwZSA9PT0gJ2h5cGVydHknO1xyXG59XHJcblxyXG4vKipcclxuICogZ2V0IGluZm9ybWF0aW9uIHJlbGF0aXZlIGVhY2ggY29tcG9uZW50IGNvbmZpZ3VyZWQgb24gcnVudGltZSBjb25maWd1cmF0aW9uO1xyXG4gKiBAcGFyYW0gIHtvYmplY3R9IGNvbmZpZ3VyYXRpb24gb2JqZWN0IHdpdGggYWxsIGNvbmZpZ3VyYXRpb25cclxuICogQHBhcmFtICB7c3RyaW5nfSBjb21wb25lbnQgICAgIHN0cmluZyB3aXRoIHRoZSBjb21wb25lbnQgdG8gZ2V0IHRoZSBjb25maWd1cmF0aW9uLCBsaWtlLCBydW50aW1lVVJMUywgY2F0YWxvZ3VlVVJMcywgbXNnTm9kZVVSTCwgZG9tYWluUmVnaXN0cnlVUkw7XHJcbiAqIEBwYXJhbSAge3N0cmluZ30gcmVzb3VyY2UgICAgICB0eXBlIG9mIHJlc291cmNlIHRvIGdldCwgbGlrZSwgY2F0YWxvZ3VlLCBydW50aW1lVUEsIHByb3RvY29sc3R1YiwgaWRwUHJveHlcclxuICogQHJldHVybiB7b2JqZWN0fSAgICAgICAgICAgICAgIHJldHVybiBhbiBvYmplY3Qgd2l0aCBhbGwgY29uZmlndXJhdGlvbnM7XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlndXJhdGlvblJlc291cmNlcyhjb25maWd1cmF0aW9uLCBjb21wb25lbnQsIHJlc291cmNlKSB7XHJcbiAgbGV0IG9iamVjdFJlc291cmNlID0gY29uZmlndXJhdGlvbltjb21wb25lbnRdO1xyXG4gIGxldCByZXNvdXJjZVR5cGUgPSBvYmplY3RSZXNvdXJjZVtyZXNvdXJjZV07XHJcblxyXG4gIHJldHVybiByZXNvdXJjZVR5cGU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZCBhIGZ1bGwgdXJsIHdpdGggdGhlIHJ1bnRpbWUgY29uZmlndXJhdGlvbjtcclxuICogQHBhcmFtICB7b2JqZWN0fSBjb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIGFsbCBjb25maWd1cmF0aW9uXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gY29tcG9uZW50ICAgICBzdHJpbmcgd2l0aCB0aGUgY29tcG9uZW50IHRvIGdldCB0aGUgY29uZmlndXJhdGlvbiwgbGlrZSwgcnVudGltZVVSTFMsIGNhdGFsb2d1ZVVSTHMsIG1zZ05vZGVVUkwsIGRvbWFpblJlZ2lzdHJ5VVJMO1xyXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHJlc291cmNlICAgICAgdHlwZSBvZiByZXNvdXJjZSB0byBnZXQsIGxpa2UsIGNhdGFsb2d1ZSwgcnVudGltZVVBLCBwcm90b2NvbHN0dWIsIGlkcFByb3h5XHJcbiAqIEBwYXJhbSAge3N0cmluZ30gdHlwZSAgICAgICAgICByZXNvdXJjZSB0byBnZXQsIGxpa2UgYSBoeXBlcnR5IG5hbWUgb3IgcHJvdG9jb2xzdHViIG5hbWU7XHJcbiAqIEBwYXJhbSAge2Jvb2xlYW59IHVzZUZhbGxiYWNrICBpZiB0cnVlIHRoZSBmdW5jdGlvbiB3aWxsIGNoZWNrIGlmIGhhdmUgYSBmYWxsYmFjayB1cmw7XHJcbiAqIEByZXR1cm4ge3N0cmluZ30gICAgICAgICAgICAgICBwYXJ0aWFsIHVybCB0byBjb250YWN0IHRoZSByZXNvdXJjZTtcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZFVSTChjb25maWd1cmF0aW9uLCBjb21wb25lbnQsIHJlc291cmNlLCB0eXBlLCB1c2VGYWxsYmFjayA9IGZhbHNlKSB7XHJcbiAgbGV0IG9iamVjdFJlc291cmNlID0gY29uZmlndXJhdGlvbltjb21wb25lbnRdO1xyXG4gIGxldCB1cmw7XHJcblxyXG4gIGlmICghb2JqZWN0UmVzb3VyY2UuaGFzT3duUHJvcGVydHkocmVzb3VyY2UpKSB7XHJcbiAgICB0aHJvdyBFcnJvcignVGhlIGNvbmZpZ3VyYXRpb24gJyArIEpTT04uc3RyaW5naWZ5KG9iamVjdFJlc291cmNlLCAnJywgMikgKyAnIGRvblxcJ3QgaGF2ZSB0aGUgJyArIHJlc291cmNlICsgJyByZXNvdXJjZSB5b3UgYXJlIGxvb2tpbmcgZm9yJyk7XHJcbiAgfVxyXG5cclxuICBsZXQgcmVzb3VyY2VUeXBlID0gb2JqZWN0UmVzb3VyY2VbcmVzb3VyY2VdO1xyXG5cclxuICBpZiAodHlwZSkge1xyXG4gICAgdXJsID0gcmVzb3VyY2VUeXBlLnByZWZpeCArIGNvbmZpZ3VyYXRpb24uZG9tYWluICsgcmVzb3VyY2VUeXBlLnN1ZmZpeCArIHR5cGU7XHJcbiAgICBpZiAocmVzb3VyY2VUeXBlLmhhc093blByb3BlcnR5KCdmYWxsYmFjaycpICYmIHVzZUZhbGxiYWNrKSB7XHJcbiAgICAgIGlmIChyZXNvdXJjZVR5cGUuZmFsbGJhY2suaW5kZXhPZignJWRvbWFpbiUnKSkge1xyXG4gICAgICAgIHVybCA9IHJlc291cmNlVHlwZS5mYWxsYmFjay5yZXBsYWNlKC8oJWRvbWFpbiUpL2csIGNvbmZpZ3VyYXRpb24uZG9tYWluKSArIHR5cGU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdXJsID0gcmVzb3VyY2VUeXBlLmZhbGxiYWNrICsgdHlwZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICB1cmwgPSByZXNvdXJjZVR5cGUucHJlZml4ICsgY29uZmlndXJhdGlvbi5kb21haW4gKyByZXNvdXJjZVR5cGUuc3VmZml4O1xyXG4gIH1cclxuXHJcbiAgLy8gY29uc29sZS5sb2codXJsKTtcclxuXHJcbiAgcmV0dXJuIHVybDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIGEgR2xvYmFsIFVuaXF1ZSBJRFxyXG4gKlxyXG4gKiBAcmV0dXJucyBTdHJpbmc7XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVHVUlEKCkge1xyXG5cclxuICBmdW5jdGlvbiBzNCgpIHtcclxuICAgIHJldHVybiBNYXRoLmZsb29yKCgxICsgTWF0aC5yYW5kb20oKSkgKiAweDEwMDAwKVxyXG4gICAgICAudG9TdHJpbmcoMTYpXHJcbiAgICAgIC5zdWJzdHJpbmcoMSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gczQoKSArIHM0KCkgKyAnLScgKyBzNCgpICsgJy0nICsgczQoKSArICctJyArIHM0KCkgKyAnLScgKyBzNCgpICsgczQoKSArIHM0KCk7XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlcklkZW50aXR5RG9tYWluKHVybCkge1xyXG4gIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKHVybCk7XHJcbiAgbGV0IHNwbGl0ZWREb21haW4gPSBkaXZpZGVkVVJMLmRvbWFpbi5zcGxpdCgnLicpO1xyXG4gIGxldCBzcGxpdGVkTGVuZ3RoID0gc3BsaXRlZERvbWFpbi5sZW5ndGg7XHJcbiAgaWYgKHNwbGl0ZWRMZW5ndGggPT0gMSkge1xyXG4gICAgcmV0dXJuIHNwbGl0ZWREb21haW5bc3BsaXRlZExlbmd0aCAtIDFdO1xyXG4gIH1cclxuICBsZXQgZG9tYWluID0gc3BsaXRlZERvbWFpbltzcGxpdGVkTGVuZ3RoIC0gMl0gKyAnLicgKyBzcGxpdGVkRG9tYWluW3NwbGl0ZWRMZW5ndGggLSAxXTtcclxuICByZXR1cm4gZG9tYWluO1xyXG59XHJcblxyXG4vKipcclxuICogQ2hlY2sgaWYgVVJMIGlzIGZyb20gYSBiYWNrZW5kIHNlcnZpY2VcclxuICogQHBhcmFtICB7c3RyaW5nfSB1cmwgICAgIFVSTCB0byBiZSBwcm9jZXNzZWRcclxuICogQHJldHVybiB7Ym9vbGVhbn1cclxuICovXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNCYWNrZW5kU2VydmljZVVSTCh1cmwpIHtcclxuICBsZXQgZGl2aWRlZFVSTCA9IGRpdmlkZVVSTCh1cmwpO1xyXG4gIGxldCBzcGxpdGVkRG9tYWluID0gZGl2aWRlZFVSTC5kb21haW4uc3BsaXQoJy4nKTtcclxuICBsZXQgYmFja2VuZFNjaGVtZXMgPSBbJ2RvbWFpbicsICdnbG9iYWwnLCAnZG9tYWluLWlkcCddOyAvLyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uXHJcbiAgbGV0IGJhY2tlbmRTdWJEb21haW5zID0gWydyZWdpc3RyeScsICdtc2ctbm9kZSddOyAvLyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uXHJcbiAgbGV0IHN1YkRvbWFpbjtcclxuXHJcbiAgaWYgKHNwbGl0ZWREb21haW4ubGVuZ3RoID4gMSkge1xyXG4gICAgc3ViRG9tYWluID0gc3BsaXRlZERvbWFpbi5maWx0ZXIoaXRlbSA9PiBiYWNrZW5kU3ViRG9tYWlucy5pbmRleE9mKGl0ZW0pICE9PSAtMSlbMF07XHJcbiAgfVxyXG5cclxuICBpZiAoc3ViRG9tYWluICYmIGJhY2tlbmRTdWJEb21haW5zLmluZGV4T2Yoc3ViRG9tYWluKSAhPT0gLTEpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgaWYgKGRpdmlkZWRVUkwudHlwZSkge1xyXG4gICAgcmV0dXJuIChiYWNrZW5kU2NoZW1lcy5pbmRleE9mKGRpdmlkZWRVUkwudHlwZSkgIT09IC0xKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRpdmlkZUVtYWlsKGVtYWlsKSB7XHJcbiAgbGV0IGluZGV4T2ZBdCA9IGVtYWlsLmluZGV4T2YoJ0AnKTtcclxuXHJcbiAgbGV0IHJlc3VsdCA9IHtcclxuICAgIHVzZXJuYW1lOiBlbWFpbC5zdWJzdHJpbmcoMCwgaW5kZXhPZkF0KSxcclxuICAgIGRvbWFpbjogZW1haWwuc3Vic3RyaW5nKGluZGV4T2ZBdCArIDEsIGVtYWlsLmxlbmd0aClcclxuICB9O1xyXG5cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFzc2lnbihvYmosIGtleVBhdGgsIHZhbHVlKSB7XHJcblxyXG4gIGlmICghb2JqKSBvYmogPSB7fTtcclxuICBpZiAodHlwZW9mKGtleVBhdGgpID09PSAnc3RyaW5nJykga2V5UGF0aCA9IHBhcnNlQXR0cmlidXRlcyhrZXlQYXRoKTtcclxuXHJcbiAgbGV0IGxhc3RLZXlJbmRleCA9IGtleVBhdGgubGVuZ3RoIC0gMTtcclxuXHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYXN0S2V5SW5kZXg7ICsraSkge1xyXG4gICAgbGV0IGtleSA9IGtleVBhdGhbaV07XHJcbiAgICBpZiAoIShrZXkgaW4gb2JqKSkge1xyXG4gICAgICBvYmpba2V5XSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIG9iaiA9IG9ialtrZXldO1xyXG5cclxuICB9XHJcblxyXG4gIG9ialtrZXlQYXRoW2xhc3RLZXlJbmRleF1dID0gdmFsdWU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzcGxpdE9iamVjdFVSTChkYXRhT2JqZWN0VVJMKSB7XHJcbiAgY29uc29sZS5pbmZvKCdbdXRpbHMgLSBzcGxpdE9iamVjdFVSTF06ICcsIGRhdGFPYmplY3RVUkwpO1xyXG5cclxuICBsZXQgc3BsaXRlZFVSTCA9IGRhdGFPYmplY3RVUkwuc3BsaXQoJy8nKTtcclxuICBsZXQgdXJsID0gc3BsaXRlZFVSTFswXSArICcvLycgKyBzcGxpdGVkVVJMWzJdICsgJy8nICsgc3BsaXRlZFVSTFszXTtcclxuICBsZXQgcmVzb3VyY2UgPSBzcGxpdGVkVVJMWzVdO1xyXG5cclxuICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgdXJsOiB1cmwsXHJcbiAgICByZXNvdXJjZTogcmVzb3VyY2VcclxuICB9O1xyXG5cclxuICBjb25zb2xlLmluZm8oJ1t1dGlscyAtIHNwbGl0T2JqZWN0VVJMXTogJywgcmVzdWx0KTtcclxuXHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQXR0cmlidXRlKHBhdGgpIHtcclxuXHJcbiAgbGV0IHJlZ2V4ID0gLygoKFthLXpBLVpdKyk6XFwvXFwvKFswLTlhLXpBLVpdWy1cXHddKlswLTlhLXpBLVpdXFwuKStbYS16QS1aXXsyLDl9KVxcL1thLXpBLVowLTkuXStAW2EtekEtWjAtOV0rKC0pP1thLXpBLVowLTldKyhcXC4pP1thLXpBLVowLTldezIsMTB9P1xcLlthLXpBLVpdezIsMTB9KSguKyg/PS5pZGVudGl0eSkpPy9nbTtcclxuXHJcbiAgbGV0IGxpc3QgPSBbXTtcclxuICBsZXQgZmluYWwgPSBbXTtcclxuICBsZXQgdGVzdCA9IHBhdGgubWF0Y2gocmVnZXgpO1xyXG5cclxuICBpZiAodGVzdCA9PSBudWxsKSB7XHJcbiAgICBmaW5hbCA9IHBhdGguc3BsaXQoJy4nKTtcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IG07XHJcbiAgICB3aGlsZSAoKG0gPSByZWdleC5leGVjKHBhdGgpKSAhPT0gbnVsbCkge1xyXG4gICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhdm9pZCBpbmZpbml0ZSBsb29wcyB3aXRoIHplcm8td2lkdGggbWF0Y2hlc1xyXG4gICAgICBpZiAobS5pbmRleCA9PT0gcmVnZXgubGFzdEluZGV4KSB7XHJcbiAgICAgICAgcmVnZXgubGFzdEluZGV4Kys7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFRoZSByZXN1bHQgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGBtYC12YXJpYWJsZS5cclxuICAgICAgbS5mb3JFYWNoKChtYXRjaCwgZ3JvdXBJbmRleCkgPT4ge1xyXG4gICAgICAgIGlmIChncm91cEluZGV4ID09PSAwKSB7XHJcbiAgICAgICAgICBsaXN0LnB1c2gobWF0Y2gpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzdWx0O1xyXG4gICAgbGlzdC5mb3JFYWNoKCh1cmwpID0+IHtcclxuXHJcbiAgICAgIHJlc3VsdCA9IHBhdGgucmVwbGFjZSh1cmwsICcqLSonKTtcclxuICAgICAgZmluYWwgPSByZXN1bHQuc3BsaXQoJy4nKS5tYXAoKGl0ZW0pID0+IHtcclxuXHJcbiAgICAgICAgaWYgKGl0ZW0gPT09ICcqLSonKSB7IHJldHVybiB1cmw7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25zb2xlLmxvZygnW1J1bnRpbWVDb3JlLlV0aWxzLmNoZWNrQXR0cmlidXRlXScsIGZpbmFsKTtcclxuICByZXR1cm4gZmluYWw7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF0dHJpYnV0ZXMocGF0aCkge1xyXG4gIGxldCByZWdleCA9IC8oWzAtOWEtekEtWl1bLVxcd10qKTpcXC9cXC8vZztcclxuXHJcbiAgbGV0IHN0cmluZzMgPSAnaWRlbnRpdHknO1xyXG5cclxuICBpZiAoIXBhdGguaW5jbHVkZXMoJzovLycpKSB7XHJcbiAgICByZXR1cm4gKHBhdGguc3BsaXQoJy4nKSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIGxldCBzdHJpbmcxID0gcGF0aC5zcGxpdChyZWdleClbMF07XHJcblxyXG4gICAgbGV0IGFycmF5MSA9IHN0cmluZzEuc3BsaXQoJy4nKTtcclxuXHJcbiAgICBsZXQgc3RyaW5nMiA9IHBhdGgucmVwbGFjZShzdHJpbmcxLCAnJyk7XHJcblxyXG4gICAgaWYgKHBhdGguaW5jbHVkZXMoc3RyaW5nMykpIHtcclxuXHJcbiAgICAgIGxldCBhcnJheTIgPSBzdHJpbmcyLnNwbGl0KHN0cmluZzMgKyAnLicpO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coJ2FycmF5MiAnICsgYXJyYXkyKTtcclxuXHJcbiAgICAgIHN0cmluZzIgPSBhcnJheTJbMF0uc2xpY2UoJy4nLCAtMSk7XHJcblxyXG4gICAgICBhcnJheTIgPSBhcnJheTJbMV0uc3BsaXQoJy4nKTtcclxuXHJcbiAgICAgIGFycmF5MS5wdXNoKHN0cmluZzIsIHN0cmluZzMpO1xyXG5cclxuICAgICAgYXJyYXkxID0gYXJyYXkxLmNvbmNhdChhcnJheTIpO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFycmF5MS5wdXNoKHN0cmluZzIpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGFycmF5MS5maWx0ZXIoQm9vbGVhbikpO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvYmopIHtcclxuICBmb3IgKHZhciBwcm9wIGluIG9iaikge1xyXG5cclxuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopID09PSBKU09OLnN0cmluZ2lmeSh7fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGF0a2V5c1RvU3RyaW5nQ2xvbmVyKHNlc3Npb25LZXlzKSB7XHJcbiAgbGV0IGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lID0ge307XHJcbiAgbGV0IGZpZWxkcyA9IE9iamVjdC5rZXlzKHNlc3Npb25LZXlzKTtcclxuICBpZiAoZmllbGRzKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgZmllbGQgPSBmaWVsZHNbaV07XHJcbiAgICAgICAgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmVbZmllbGRdID0ge307XHJcbiAgICAgICAgZGF0YU9iamVjdFNlc3Npb25LZXlzQ2xvbmVbZmllbGRdLnNlc3Npb25LZXkgPSBzZXNzaW9uS2V5c1tmaWVsZF0uc2Vzc2lvbktleS50b1N0cmluZygpO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXS5pc1RvRW5jcnlwdCA9IHNlc3Npb25LZXlzW2ZpZWxkXS5pc1RvRW5jcnlwdDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ19jaGF0a2V5c1RvU3RyaW5nQ2xvbmVyOmVycicsIGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoYXRrZXlzVG9BcnJheUNsb25lcihzZXNzaW9uS2V5cykge1xyXG4gIGxldCBkYXRhT2JqZWN0U2Vzc2lvbktleXNDbG9uZSA9IHt9O1xyXG4gIGxldCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzZXNzaW9uS2V5cyk7XHJcbiAgaWYgKGZpZWxkcykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAgZmllbGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGZpZWxkID0gZmllbGRzW2ldO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXSA9IHt9O1xyXG4gICAgICAgIGxldCBhcnJheVZhbHVlcyA9IEpTT04ucGFyc2UoJ1snICsgc2Vzc2lvbktleXNbZmllbGRdLnNlc3Npb25LZXkgKyAnXScpO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXS5zZXNzaW9uS2V5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlWYWx1ZXMpO1xyXG4gICAgICAgIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lW2ZpZWxkXS5pc1RvRW5jcnlwdCA9IHNlc3Npb25LZXlzW2ZpZWxkXS5pc1RvRW5jcnlwdDtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ19jaGF0a2V5c1RvQXJyYXlDbG9uZXI6ZXJyJywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIGRhdGFPYmplY3RTZXNzaW9uS2V5c0Nsb25lO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNZXNzYWdlVVJMKFVSTCkge1xyXG4gIGxldCBzcGxpdGVkVG9VUkwgPSBVUkwuc3BsaXQoJy8nKTtcclxuICBpZiAoc3BsaXRlZFRvVVJMLmxlbmd0aCA8PSA2KSB7XHJcbiAgICByZXR1cm4gc3BsaXRlZFRvVVJMWzBdICsgJy8vJyArIHNwbGl0ZWRUb1VSTFsyXSArICcvJyArIHNwbGl0ZWRUb1VSTFszXTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHNwbGl0ZWRUb1VSTFswXSArICcvLycgKyBzcGxpdGVkVG9VUkxbMl0gKyAnLycgKyBzcGxpdGVkVG9VUkxbM10gKyAnLycgKyBzcGxpdGVkVG9VUkxbNF07XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXZhaWxhYmxlU3BhY2UodXNhZ2UsIHF1b3RhKSB7XHJcbiAgY29uc3QgYXZhaWxhYmxlID0gKHVzYWdlIC8gcXVvdGEpLnRvRml4ZWQoMik7XHJcbiAgcmV0dXJuIHtcclxuICAgIHF1b3RhOiBxdW90YSxcclxuICAgIHVzYWdlOiB1c2FnZSxcclxuICAgIHBlcmNlbnQ6IE51bWJlcihhdmFpbGFibGUpXHJcbiAgfTtcclxufVxyXG5cclxuLyoqXHJcbiogRW5jb2RlcyBhIEpTIG9iamVjdCB0byBiYXNlIDY0IGVuY29kZVxyXG4qIEBwYXJhbSAgIHtPYmplY3R9ICAgIHZhbHVlICAgIGJ5dGVBcnJheSB2YWx1ZVxyXG4qIEByZXR1cm4gIHtzdHJpbmd9ICAgZW5jb2RlZCB2YWx1ZVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIGxldCBzdHJpbmdWYWx1ZSA9IHN0cmluZ2lmeSh2YWx1ZSk7XHJcbiAgICByZXR1cm4gYnRvYShzdHJpbmdWYWx1ZSk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMuZW5jb2RlOmVycl0gJyArIGVycik7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICAqIERlY29kZSBhIGJhc2U2NCBzdHJpbmcgdG8gb2JqZWN0XHJcbiAgKiBAcGFyYW0gICB7c3RyaW5nX2I2NH0gICAgdmFsdWUgICAgdmFsdWUgZW5jb2RlZCBpbiBiYXNlIDY0XHJcbiAgKiBAcmV0dXJuICB7T2JqZWN0fSBkZWNvZGVkVmFsdWVcclxuICAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlKHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKGF0b2IodmFsdWUpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUubG9nKCdbVXRpbHMuZGVjb2RlOmVycl0gJyArIGVycik7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIHRvIFVpbnQ4QXJyYXlcclxuKiBAcGFyYW0gICB7c3RyaW5nX2I2NH0gICAgdmFsdWUgICAgYnl0ZUFycmF5IHZhbHVlXHJcbiogQHJldHVybiAge1VpbnQ4QXJyYXl9ICAgZW5jb2RlZCB2YWx1ZVxyXG4qL1xyXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlVG9VaW50OEFycmF5KHZhbHVlKSB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWNvZGUodmFsdWUpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ1tVdGlscy5kZWNvZGVUb1VpbnQ4QXJyYXk6ZXJyXSAnICsgZXJyKTtcclxuICAgIHRocm93IGVycjtcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4qIENvbnZlcnRzIGEgSlMgb2JqZWN0IHRvIHN0cmluZ1xyXG4qIE5PVEU6IFNwZWNpYWwgY29udmVyc2lvbiBmb3IgVWludDhBcnJheXNcclxuKiBAcGFyYW0gICB7T2JqZWN0fSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcclxuKiBAcmV0dXJuICB7VWludDhBcnJheX0gICBlbmNvZGVkIHZhbHVlXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUpIHtcclxuICB0cnkge1xyXG4gICAgbGV0IHN0cmluZ1ZhbHVlO1xyXG4gICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBVaW50OEFycmF5KSB7XHJcbiAgICAgIHN0cmluZ1ZhbHVlID0gJ1snICsgdmFsdWUudG9TdHJpbmcoKSArICddJzsgLy8gdGhlIFtdIGlzIGZvciBKU09OLnBhcnNlIGNvbXBhdGliaWxpdHlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0cmluZ1ZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN0cmluZ1ZhbHVlO1xyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY29uc29sZS5lcnJvcignW1V0aWxzLnN0cmluZ2lmeTplcnJdICcgKyBlcnIpO1xyXG4gICAgdGhyb3cgZXJyO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiogQ29udmVydHMgYSBzdHJpbmdpZmllZCBvYmplY3QgdG8gb2JqZWN0XHJcbiogQHBhcmFtICAge1N0cmluZ30gICAgdmFsdWUgICAgYnl0ZUFycmF5IHZhbHVlXHJcbiogQHJldHVybiAge09iamVjdH0gICBlbmNvZGVkIHZhbHVlXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZSh2YWx1ZSkge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdbVXRpbHMucGFyc2U6ZXJyXScgKyBlcnIpO1xyXG4gICAgY29uc29sZS50cmFjZSgpO1xyXG4gICAgY29uc29sZS5lcnJvcignVGhhdCB0aGF0IGNhdXNlIHRoZSBlcnJvcjonLCB2YWx1ZSk7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuKiBDb252ZXJ0cyBhIHN0cmluZ2lmaWVkIG9iamVjdCB0byBvYmplY3RcclxuKiBAcGFyYW0gICB7U3RyaW5nfSAgICB2YWx1ZSAgICBieXRlQXJyYXkgdmFsdWVcclxuKiBAcmV0dXJuICB7VWludDhBcnJheX0gICBlbmNvZGVkIHZhbHVlXHJcbiovXHJcbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRvVWludDhBcnJheSh2YWx1ZSkge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocGFyc2UodmFsdWUpKTtcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ1tVdGlscy5wYXJzZVRvVWludDhBcnJheTplcnJdJyArIGVycik7XHJcbiAgICB0aHJvdyBlcnI7XHJcbiAgfVxyXG59XHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7Ozs7O0FBS0E7Ozs7Ozs7O0FBUUE7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFNQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFFQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQVNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUZBO0FBS0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///0\n")},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n "use strict";\n if (true) {\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (definition),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else {}\n}(this, function () {\n "use strict";\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function() {};\n var undefinedType = "undefined";\n\n var logMethods = [\n "trace",\n "debug",\n "info",\n "warn",\n "error"\n ];\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === \'function\') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function() {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === \'debug\') {\n methodName = \'log\';\n }\n\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, \'log\');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods(level, loggerName) {\n /*jshint validthis:true */\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = (i < level) ?\n noop :\n this.methodFactory(methodName, level, loggerName);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n }\n\n // In old IE versions, the console isn\'t present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this, level, loggerName);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, level, loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) ||\n enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n\n function Logger(name, defaultLevel, factory) {\n var self = this;\n var currentLevel;\n var storageKey = "loglevel";\n if (name) {\n storageKey += ":" + name;\n }\n\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || \'silent\').toUpperCase();\n\n if (typeof window === undefinedType) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie =\n encodeURIComponent(storageKey) + "=" + levelName + ";";\n } catch (ignore) {}\n }\n\n function getPersistedLevel() {\n var storedLevel;\n\n if (typeof window === undefinedType) return;\n\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var location = cookie.indexOf(\n encodeURIComponent(storageKey) + "=");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n\n return storedLevel;\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n\n self.levels = { "TRACE": 0, "DEBUG": 1, "INFO": 2, "WARN": 3,\n "ERROR": 4, "SILENT": 5};\n\n self.methodFactory = factory || defaultMethodFactory;\n\n self.getLevel = function () {\n return currentLevel;\n };\n\n self.setLevel = function (level, persist) {\n if (typeof level === "string" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === "number" && level >= 0 && level <= self.levels.SILENT) {\n currentLevel = level;\n if (persist !== false) { // defaults to true\n persistLevelIfPossible(level);\n }\n replaceLoggingMethods.call(self, level, name);\n if (typeof console === undefinedType && level < self.levels.SILENT) {\n return "No console available for logging";\n }\n } else {\n throw "log.setLevel() called with invalid level: " + level;\n }\n };\n\n self.setDefaultLevel = function (level) {\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n\n self.enableAll = function(persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n\n self.disableAll = function(persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n\n // Initialize with the right level\n var initialLevel = getPersistedLevel();\n if (initialLevel == null) {\n initialLevel = defaultLevel == null ? "WARN" : defaultLevel;\n }\n self.setLevel(initialLevel, false);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n var defaultLogger = new Logger();\n\n var _loggersByName = {};\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== "string" || name === "") {\n throw new TypeError("You must supply a name when creating a logger.");\n }\n\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(\n name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = (typeof window !== undefinedType) ? window.log : undefined;\n defaultLogger.noConflict = function() {\n if (typeof window !== undefinedType &&\n window.log === defaultLogger) {\n window.log = _log;\n }\n\n return defaultLogger;\n };\n\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n return defaultLogger;\n}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9sb2dsZXZlbC9saWIvbG9nbGV2ZWwuanM/NWM3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBsb2dsZXZlbCAtIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbFxuKlxuKiBDb3B5cmlnaHQgKGMpIDIwMTMgVGltIFBlcnJ5XG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiovXG4oZnVuY3Rpb24gKHJvb3QsIGRlZmluaXRpb24pIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIGRlZmluZShkZWZpbml0aW9uKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZGVmaW5pdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QubG9nID0gZGVmaW5pdGlvbigpO1xuICAgIH1cbn0odGhpcywgZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gU2xpZ2h0bHkgZHViaW91cyB0cmlja3MgdG8gY3V0IGRvd24gbWluaW1pemVkIGZpbGUgc2l6ZVxuICAgIHZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcbiAgICB2YXIgdW5kZWZpbmVkVHlwZSA9IFwidW5kZWZpbmVkXCI7XG5cbiAgICB2YXIgbG9nTWV0aG9kcyA9IFtcbiAgICAgICAgXCJ0cmFjZVwiLFxuICAgICAgICBcImRlYnVnXCIsXG4gICAgICAgIFwiaW5mb1wiLFxuICAgICAgICBcIndhcm5cIixcbiAgICAgICAgXCJlcnJvclwiXG4gICAgXTtcblxuICAgIC8vIENyb3NzLWJyb3dzZXIgYmluZCBlcXVpdmFsZW50IHRoYXQgd29ya3MgYXQgbGVhc3QgYmFjayB0byBJRTZcbiAgICBmdW5jdGlvbiBiaW5kTWV0aG9kKG9iaiwgbWV0aG9kTmFtZSkge1xuICAgICAgICB2YXIgbWV0aG9kID0gb2JqW21ldGhvZE5hbWVdO1xuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmJpbmQob2JqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwobWV0aG9kLCBvYmopO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIE1pc3NpbmcgYmluZCBzaGltIG9yIElFOCArIE1vZGVybml6ciwgZmFsbGJhY2sgdG8gd3JhcHBpbmdcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuYXBwbHkobWV0aG9kLCBbb2JqLCBhcmd1bWVudHNdKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlIGJlc3QgbG9nZ2luZyBtZXRob2QgcG9zc2libGUgZm9yIHRoaXMgZW52XG4gICAgLy8gV2hlcmV2ZXIgcG9zc2libGUgd2Ugd2FudCB0byBiaW5kLCBub3Qgd3JhcCwgdG8gcHJlc2VydmUgc3RhY2sgdHJhY2VzXG4gICAgZnVuY3Rpb24gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB7XG4gICAgICAgIGlmIChtZXRob2ROYW1lID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgICBtZXRob2ROYW1lID0gJ2xvZyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gTm8gbWV0aG9kIHBvc3NpYmxlLCBmb3Igbm93IC0gZml4ZWQgbGF0ZXIgYnkgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlc1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnNvbGVbbWV0aG9kTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgbWV0aG9kTmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGJpbmRNZXRob2QoY29uc29sZSwgJ2xvZycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGVzZSBwcml2YXRlIGZ1bmN0aW9ucyBhbHdheXMgbmVlZCBgdGhpc2AgdG8gYmUgc2V0IHByb3Blcmx5XG5cbiAgICBmdW5jdGlvbiByZXBsYWNlTG9nZ2luZ01ldGhvZHMobGV2ZWwsIGxvZ2dlck5hbWUpIHtcbiAgICAgICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2dNZXRob2RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWV0aG9kTmFtZSA9IGxvZ01ldGhvZHNbaV07XG4gICAgICAgICAgICB0aGlzW21ldGhvZE5hbWVdID0gKGkgPCBsZXZlbCkgP1xuICAgICAgICAgICAgICAgIG5vb3AgOlxuICAgICAgICAgICAgICAgIHRoaXMubWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgbG9nLmxvZyBhcyBhbiBhbGlhcyBmb3IgbG9nLmRlYnVnXG4gICAgICAgIHRoaXMubG9nID0gdGhpcy5kZWJ1ZztcbiAgICB9XG5cbiAgICAvLyBJbiBvbGQgSUUgdmVyc2lvbnMsIHRoZSBjb25zb2xlIGlzbid0IHByZXNlbnQgdW50aWwgeW91IGZpcnN0IG9wZW4gaXQuXG4gICAgLy8gV2UgYnVpbGQgcmVhbE1ldGhvZCgpIHJlcGxhY2VtZW50cyBoZXJlIHRoYXQgcmVnZW5lcmF0ZSBsb2dnaW5nIG1ldGhvZHNcbiAgICBmdW5jdGlvbiBlbmFibGVMb2dnaW5nV2hlbkNvbnNvbGVBcnJpdmVzKG1ldGhvZE5hbWUsIGxldmVsLCBsb2dnZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9nZ2luZ01ldGhvZHMuY2FsbCh0aGlzLCBsZXZlbCwgbG9nZ2VyTmFtZSk7XG4gICAgICAgICAgICAgICAgdGhpc1ttZXRob2ROYW1lXS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJ5IGRlZmF1bHQsIHdlIHVzZSBjbG9zZWx5IGJvdW5kIHJlYWwgbWV0aG9kcyB3aGVyZXZlciBwb3NzaWJsZSwgYW5kXG4gICAgLy8gb3RoZXJ3aXNlIHdlIHdhaXQgZm9yIGEgY29uc29sZSB0byBhcHBlYXIsIGFuZCB0aGVuIHRyeSBhZ2Fpbi5cbiAgICBmdW5jdGlvbiBkZWZhdWx0TWV0aG9kRmFjdG9yeShtZXRob2ROYW1lLCBsZXZlbCwgbG9nZ2VyTmFtZSkge1xuICAgICAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqL1xuICAgICAgICByZXR1cm4gcmVhbE1ldGhvZChtZXRob2ROYW1lKSB8fFxuICAgICAgICAgICAgICAgZW5hYmxlTG9nZ2luZ1doZW5Db25zb2xlQXJyaXZlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvZ2dlcihuYW1lLCBkZWZhdWx0TGV2ZWwsIGZhY3RvcnkpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBjdXJyZW50TGV2ZWw7XG4gICAgICB2YXIgc3RvcmFnZUtleSA9IFwibG9nbGV2ZWxcIjtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHN0b3JhZ2VLZXkgKz0gXCI6XCIgKyBuYW1lO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwZXJzaXN0TGV2ZWxJZlBvc3NpYmxlKGxldmVsTnVtKSB7XG4gICAgICAgICAgdmFyIGxldmVsTmFtZSA9IChsb2dNZXRob2RzW2xldmVsTnVtXSB8fCAnc2lsZW50JykudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSB1bmRlZmluZWRUeXBlKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBVc2UgbG9jYWxTdG9yYWdlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBsZXZlbE5hbWU7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBVc2Ugc2Vzc2lvbiBjb29raWUgYXMgZmFsbGJhY2tcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuY29va2llID1cbiAgICAgICAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoc3RvcmFnZUtleSkgKyBcIj1cIiArIGxldmVsTmFtZSArIFwiO1wiO1xuICAgICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkge31cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0UGVyc2lzdGVkTGV2ZWwoKSB7XG4gICAgICAgICAgdmFyIHN0b3JlZExldmVsO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IHVuZGVmaW5lZFR5cGUpIHJldHVybjtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHN0b3JlZExldmVsID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcbiAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG5cbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBjb29raWVzIGlmIGxvY2FsIHN0b3JhZ2UgZ2l2ZXMgdXMgbm90aGluZ1xuICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVkTGV2ZWwgPT09IHVuZGVmaW5lZFR5cGUpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHZhciBjb29raWUgPSB3aW5kb3cuZG9jdW1lbnQuY29va2llO1xuICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gY29va2llLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0b3JhZ2VLZXkpICsgXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZExldmVsID0gL14oW147XSspLy5leGVjKGNvb2tpZS5zbGljZShsb2NhdGlvbikpWzFdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChpZ25vcmUpIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgdGhlIHN0b3JlZCBsZXZlbCBpcyBub3QgdmFsaWQsIHRyZWF0IGl0IGFzIGlmIG5vdGhpbmcgd2FzIHN0b3JlZC5cbiAgICAgICAgICBpZiAoc2VsZi5sZXZlbHNbc3RvcmVkTGV2ZWxdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RvcmVkTGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHN0b3JlZExldmVsO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICpcbiAgICAgICAqIFB1YmxpYyBsb2dnZXIgQVBJIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waW10ZXJyeS9sb2dsZXZlbCBmb3IgZGV0YWlsc1xuICAgICAgICpcbiAgICAgICAqL1xuXG4gICAgICBzZWxmLm5hbWUgPSBuYW1lO1xuXG4gICAgICBzZWxmLmxldmVscyA9IHsgXCJUUkFDRVwiOiAwLCBcIkRFQlVHXCI6IDEsIFwiSU5GT1wiOiAyLCBcIldBUk5cIjogMyxcbiAgICAgICAgICBcIkVSUk9SXCI6IDQsIFwiU0lMRU5UXCI6IDV9O1xuXG4gICAgICBzZWxmLm1ldGhvZEZhY3RvcnkgPSBmYWN0b3J5IHx8IGRlZmF1bHRNZXRob2RGYWN0b3J5O1xuXG4gICAgICBzZWxmLmdldExldmVsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjdXJyZW50TGV2ZWw7XG4gICAgICB9O1xuXG4gICAgICBzZWxmLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsLCBwZXJzaXN0KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gXCJzdHJpbmdcIiAmJiBzZWxmLmxldmVsc1tsZXZlbC50b1VwcGVyQ2FzZSgpXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGxldmVsID0gc2VsZi5sZXZlbHNbbGV2ZWwudG9VcHBlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09IFwibnVtYmVyXCIgJiYgbGV2ZWwgPj0gMCAmJiBsZXZlbCA8PSBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgY3VycmVudExldmVsID0gbGV2ZWw7XG4gICAgICAgICAgICAgIGlmIChwZXJzaXN0ICE9PSBmYWxzZSkgeyAgLy8gZGVmYXVsdHMgdG8gdHJ1ZVxuICAgICAgICAgICAgICAgICAgcGVyc2lzdExldmVsSWZQb3NzaWJsZShsZXZlbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVwbGFjZUxvZ2dpbmdNZXRob2RzLmNhbGwoc2VsZiwgbGV2ZWwsIG5hbWUpO1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgPT09IHVuZGVmaW5lZFR5cGUgJiYgbGV2ZWwgPCBzZWxmLmxldmVscy5TSUxFTlQpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIk5vIGNvbnNvbGUgYXZhaWxhYmxlIGZvciBsb2dnaW5nXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBcImxvZy5zZXRMZXZlbCgpIGNhbGxlZCB3aXRoIGludmFsaWQgbGV2ZWw6IFwiICsgbGV2ZWw7XG4gICAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgc2VsZi5zZXREZWZhdWx0TGV2ZWwgPSBmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgICAgICBpZiAoIWdldFBlcnNpc3RlZExldmVsKCkpIHtcbiAgICAgICAgICAgICAgc2VsZi5zZXRMZXZlbChsZXZlbCwgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHNlbGYuZW5hYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuVFJBQ0UsIHBlcnNpc3QpO1xuICAgICAgfTtcblxuICAgICAgc2VsZi5kaXNhYmxlQWxsID0gZnVuY3Rpb24ocGVyc2lzdCkge1xuICAgICAgICAgIHNlbGYuc2V0TGV2ZWwoc2VsZi5sZXZlbHMuU0lMRU5ULCBwZXJzaXN0KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEluaXRpYWxpemUgd2l0aCB0aGUgcmlnaHQgbGV2ZWxcbiAgICAgIHZhciBpbml0aWFsTGV2ZWwgPSBnZXRQZXJzaXN0ZWRMZXZlbCgpO1xuICAgICAgaWYgKGluaXRpYWxMZXZlbCA9PSBudWxsKSB7XG4gICAgICAgICAgaW5pdGlhbExldmVsID0gZGVmYXVsdExldmVsID09IG51bGwgPyBcIldBUk5cIiA6IGRlZmF1bHRMZXZlbDtcbiAgICAgIH1cbiAgICAgIHNlbGYuc2V0TGV2ZWwoaW5pdGlhbExldmVsLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKlxuICAgICAqIFRvcC1sZXZlbCBBUElcbiAgICAgKlxuICAgICAqL1xuXG4gICAgdmFyIGRlZmF1bHRMb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG5cbiAgICB2YXIgX2xvZ2dlcnNCeU5hbWUgPSB7fTtcbiAgICBkZWZhdWx0TG9nZ2VyLmdldExvZ2dlciA9IGZ1bmN0aW9uIGdldExvZ2dlcihuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIiB8fCBuYW1lID09PSBcIlwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhIG5hbWUgd2hlbiBjcmVhdGluZyBhIGxvZ2dlci5cIik7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV07XG4gICAgICAgIGlmICghbG9nZ2VyKSB7XG4gICAgICAgICAgbG9nZ2VyID0gX2xvZ2dlcnNCeU5hbWVbbmFtZV0gPSBuZXcgTG9nZ2VyKFxuICAgICAgICAgICAgbmFtZSwgZGVmYXVsdExvZ2dlci5nZXRMZXZlbCgpLCBkZWZhdWx0TG9nZ2VyLm1ldGhvZEZhY3RvcnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2dnZXI7XG4gICAgfTtcblxuICAgIC8vIEdyYWIgdGhlIGN1cnJlbnQgZ2xvYmFsIGxvZyB2YXJpYWJsZSBpbiBjYXNlIG9mIG92ZXJ3cml0ZVxuICAgIHZhciBfbG9nID0gKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUpID8gd2luZG93LmxvZyA6IHVuZGVmaW5lZDtcbiAgICBkZWZhdWx0TG9nZ2VyLm5vQ29uZmxpY3QgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IHVuZGVmaW5lZFR5cGUgJiZcbiAgICAgICAgICAgICAgIHdpbmRvdy5sb2cgPT09IGRlZmF1bHRMb2dnZXIpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2cgPSBfbG9nO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG4gICAgfTtcblxuICAgIGRlZmF1bHRMb2dnZXIuZ2V0TG9nZ2VycyA9IGZ1bmN0aW9uIGdldExvZ2dlcnMoKSB7XG4gICAgICAgIHJldHVybiBfbG9nZ2Vyc0J5TmFtZTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlZmF1bHRMb2dnZXI7XG59KSk7XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQSxhQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///1\n')},function(module,exports,__webpack_require__){eval('/* WEBPACK VAR INJECTION */(function(global, setImmediate) {(function (global, factory) {\n true ? module.exports = factory() :\n undefined;\n}(this, (function () { \'use strict\';\n\n/*\r\n* Dexie.js - a minimalistic wrapper for IndexedDB\r\n* ===============================================\r\n*\r\n* By David Fahlander, david.fahlander@gmail.com\r\n*\r\n* Version 1.5.1, Tue Nov 01 2016\r\n* www.dexie.com\r\n* Apache License Version 2.0, January 2004, http://www.apache.org/licenses/\r\n*/\nvar keys = Object.keys;\nvar isArray = Array.isArray;\nvar _global = typeof self !== \'undefined\' ? self : typeof window !== \'undefined\' ? window : global;\n\nfunction extend(obj, extension) {\n if (typeof extension !== \'object\') return obj;\n keys(extension).forEach(function (key) {\n obj[key] = extension[key];\n });\n return obj;\n}\n\nvar getProto = Object.getPrototypeOf;\nvar _hasOwn = {}.hasOwnProperty;\nfunction hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\n\nfunction props(proto, extension) {\n if (typeof extension === \'function\') extension = extension(getProto(proto));\n keys(extension).forEach(function (key) {\n setProp(proto, key, extension[key]);\n });\n}\n\nfunction setProp(obj, prop, functionOrGetSet, options) {\n Object.defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, "get") && typeof functionOrGetSet.get === \'function\' ? { get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true } : { value: functionOrGetSet, configurable: true, writable: true }, options));\n}\n\nfunction derive(Child) {\n return {\n from: function (Parent) {\n Child.prototype = Object.create(Parent.prototype);\n setProp(Child.prototype, "constructor", Child);\n return {\n extend: props.bind(null, Child.prototype)\n };\n }\n };\n}\n\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nfunction getPropertyDescriptor(obj, prop) {\n var pd = getOwnPropertyDescriptor(obj, prop),\n proto;\n return pd || (proto = getProto(obj)) && getPropertyDescriptor(proto, prop);\n}\n\nvar _slice = [].slice;\nfunction slice(args, start, end) {\n return _slice.call(args, start, end);\n}\n\nfunction override(origFunc, overridedFactory) {\n return overridedFactory(origFunc);\n}\n\nfunction doFakeAutoComplete(fn) {\n var to = setTimeout(fn, 1000);\n clearTimeout(to);\n}\n\nfunction assert(b) {\n if (!b) throw new Error("Assertion Failed");\n}\n\nfunction asap(fn) {\n if (_global.setImmediate) setImmediate(fn);else setTimeout(fn, 0);\n}\n\n\n\n/** Generate an object (hash map) based on given array.\r\n * @param extractor Function taking an array item and its index and returning an array of 2 items ([key, value]) to\r\n * instert on the resulting object for each item in the array. If this function returns a falsy value, the\r\n * current item wont affect the resulting object.\r\n */\nfunction arrayToObject(array, extractor) {\n return array.reduce(function (result, item, i) {\n var nameAndValue = extractor(item, i);\n if (nameAndValue) result[nameAndValue[0]] = nameAndValue[1];\n return result;\n }, {});\n}\n\nfunction trycatcher(fn, reject) {\n return function () {\n try {\n fn.apply(this, arguments);\n } catch (e) {\n reject(e);\n }\n };\n}\n\nfunction tryCatch(fn, onerror, args) {\n try {\n fn.apply(null, args);\n } catch (ex) {\n onerror && onerror(ex);\n }\n}\n\nfunction getByKeyPath(obj, keyPath) {\n // http://www.w3.org/TR/IndexedDB/#steps-for-extracting-a-key-from-a-value-using-a-key-path\n if (hasOwn(obj, keyPath)) return obj[keyPath]; // This line is moved from last to first for optimization purpose.\n if (!keyPath) return obj;\n if (typeof keyPath !== \'string\') {\n var rv = [];\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n var val = getByKeyPath(obj, keyPath[i]);\n rv.push(val);\n }\n return rv;\n }\n var period = keyPath.indexOf(\'.\');\n if (period !== -1) {\n var innerObj = obj[keyPath.substr(0, period)];\n return innerObj === undefined ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1));\n }\n return undefined;\n}\n\nfunction setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined) return;\n if (\'isFrozen\' in Object && Object.isFrozen(obj)) return;\n if (typeof keyPath !== \'string\' && \'length\' in keyPath) {\n assert(typeof value !== \'string\' && \'length\' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n } else {\n var period = keyPath.indexOf(\'.\');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === "") {\n if (value === undefined) delete obj[currentKeyPath];else obj[currentKeyPath] = value;\n } else {\n var innerObj = obj[currentKeyPath];\n if (!innerObj) innerObj = obj[currentKeyPath] = {};\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n } else {\n if (value === undefined) delete obj[keyPath];else obj[keyPath] = value;\n }\n }\n}\n\nfunction delByKeyPath(obj, keyPath) {\n if (typeof keyPath === \'string\') setByKeyPath(obj, keyPath, undefined);else if (\'length\' in keyPath) [].map.call(keyPath, function (kp) {\n setByKeyPath(obj, kp, undefined);\n });\n}\n\nfunction shallowClone(obj) {\n var rv = {};\n for (var m in obj) {\n if (hasOwn(obj, m)) rv[m] = obj[m];\n }\n return rv;\n}\n\nfunction deepClone(any) {\n if (!any || typeof any !== \'object\') return any;\n var rv;\n if (isArray(any)) {\n rv = [];\n for (var i = 0, l = any.length; i < l; ++i) {\n rv.push(deepClone(any[i]));\n }\n } else if (any instanceof Date) {\n rv = new Date();\n rv.setTime(any.getTime());\n } else {\n rv = any.constructor ? Object.create(any.constructor.prototype) : {};\n for (var prop in any) {\n if (hasOwn(any, prop)) {\n rv[prop] = deepClone(any[prop]);\n }\n }\n }\n return rv;\n}\n\nfunction getObjectDiff(a, b, rv, prfx) {\n // Compares objects a and b and produces a diff object.\n rv = rv || {};\n prfx = prfx || \'\';\n keys(a).forEach(function (prop) {\n if (!hasOwn(b, prop)) rv[prfx + prop] = undefined; // Property removed\n else {\n var ap = a[prop],\n bp = b[prop];\n if (typeof ap === \'object\' && typeof bp === \'object\' && ap && bp && ap.constructor === bp.constructor)\n // Same type of object but its properties may have changed\n getObjectDiff(ap, bp, rv, prfx + prop + ".");else if (ap !== bp) rv[prfx + prop] = b[prop]; // Primitive value changed\n }\n });\n keys(b).forEach(function (prop) {\n if (!hasOwn(a, prop)) {\n rv[prfx + prop] = b[prop]; // Property added\n }\n });\n return rv;\n}\n\n// If first argument is iterable or array-like, return it as an array\nvar iteratorSymbol = typeof Symbol !== \'undefined\' && Symbol.iterator;\nvar getIteratorOf = iteratorSymbol ? function (x) {\n var i;\n return x != null && (i = x[iteratorSymbol]) && i.apply(x);\n} : function () {\n return null;\n};\n\nvar NO_CHAR_ARRAY = {};\n// Takes one or several arguments and returns an array based on the following criteras:\n// * If several arguments provided, return arguments converted to an array in a way that\n// still allows javascript engine to optimize the code.\n// * If single argument is an array, return a clone of it.\n// * If this-pointer equals NO_CHAR_ARRAY, don\'t accept strings as valid iterables as a special\n// case to the two bullets below.\n// * If single argument is an iterable, convert it to an array and return the resulting array.\n// * If single argument is array-like (has length of type number), convert it to an array.\nfunction getArrayOf(arrayLike) {\n var i, a, x, it;\n if (arguments.length === 1) {\n if (isArray(arrayLike)) return arrayLike.slice();\n if (this === NO_CHAR_ARRAY && typeof arrayLike === \'string\') return [arrayLike];\n if (it = getIteratorOf(arrayLike)) {\n a = [];\n while (x = it.next(), !x.done) {\n a.push(x.value);\n }return a;\n }\n if (arrayLike == null) return [arrayLike];\n i = arrayLike.length;\n if (typeof i === \'number\') {\n a = new Array(i);\n while (i--) {\n a[i] = arrayLike[i];\n }return a;\n }\n return [arrayLike];\n }\n i = arguments.length;\n a = new Array(i);\n while (i--) {\n a[i] = arguments[i];\n }return a;\n}\n\nvar concat = [].concat;\nfunction flatten(a) {\n return concat.apply([], a);\n}\n\nfunction nop() {}\nfunction mirror(val) {\n return val;\n}\nfunction pureFunctionChain(f1, f2) {\n // Enables chained events that takes ONE argument and returns it to the next function in chain.\n // This pattern is used in the hook("reading") event.\n if (f1 == null || f1 === mirror) return f2;\n return function (val) {\n return f2(f1(val));\n };\n}\n\nfunction callBoth(on1, on2) {\n return function () {\n on1.apply(this, arguments);\n on2.apply(this, arguments);\n };\n}\n\nfunction hookCreatingChain(f1, f2) {\n // Enables chained events that takes several arguments and may modify first argument by making a modification and then returning the same instance.\n // This pattern is used in the hook("creating") event.\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res !== undefined) arguments[0] = res;\n var onsuccess = this.onsuccess,\n // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res2 !== undefined ? res2 : res;\n };\n}\n\nfunction hookDeletingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n var onsuccess = this.onsuccess,\n // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = this.onerror = null;\n f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n };\n}\n\nfunction hookUpdatingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function (modifications) {\n var res = f1.apply(this, arguments);\n extend(modifications, res); // If f1 returns new modifications, extend caller\'s modifications with the result before calling next in chain.\n var onsuccess = this.onsuccess,\n // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res === undefined ? res2 === undefined ? undefined : res2 : extend(res, res2);\n };\n}\n\nfunction reverseStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n if (f2.apply(this, arguments) === false) return false;\n return f1.apply(this, arguments);\n };\n}\n\n\n\nfunction promisableChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res && typeof res.then === \'function\') {\n var thiz = this,\n i = arguments.length,\n args = new Array(i);\n while (i--) {\n args[i] = arguments[i];\n }return res.then(function () {\n return f2.apply(thiz, args);\n });\n }\n return f2.apply(this, arguments);\n };\n}\n\n// By default, debug will be true only if platform is a web platform and its page is served from localhost.\n// When debug = true, error\'s stacks will contain asyncronic long stacks.\nvar debug = typeof location !== \'undefined\' &&\n// By default, use debug mode if served from localhost.\n/^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);\n\nfunction setDebug(value, filter) {\n debug = value;\n libraryFilter = filter;\n}\n\nvar libraryFilter = function () {\n return true;\n};\n\nvar NEEDS_THROW_FOR_STACK = !new Error("").stack;\n\nfunction getErrorWithStack() {\n "use strict";\n\n if (NEEDS_THROW_FOR_STACK) try {\n // Doing something naughty in strict mode here to trigger a specific error\n // that can be explicitely ignored in debugger\'s exception settings.\n // If we\'d just throw new Error() here, IE\'s debugger\'s exception settings\n // will just consider it as "exception thrown by javascript code" which is\n // something you wouldn\'t want it to ignore.\n getErrorWithStack.arguments;\n throw new Error(); // Fallback if above line don\'t throw.\n } catch (e) {\n return e;\n }\n return new Error();\n}\n\nfunction prettyStack(exception, numIgnoredFrames) {\n var stack = exception.stack;\n if (!stack) return "";\n numIgnoredFrames = numIgnoredFrames || 0;\n if (stack.indexOf(exception.name) === 0) numIgnoredFrames += (exception.name + exception.message).split(\'\\n\').length;\n return stack.split(\'\\n\').slice(numIgnoredFrames).filter(libraryFilter).map(function (frame) {\n return "\\n" + frame;\n }).join(\'\');\n}\n\nfunction deprecated(what, fn) {\n return function () {\n console.warn(what + " is deprecated. See https://github.com/dfahlander/Dexie.js/wiki/Deprecations. " + prettyStack(getErrorWithStack(), 1));\n return fn.apply(this, arguments);\n };\n}\n\nvar dexieErrorNames = [\'Modify\', \'Bulk\', \'OpenFailed\', \'VersionChange\', \'Schema\', \'Upgrade\', \'InvalidTable\', \'MissingAPI\', \'NoSuchDatabase\', \'InvalidArgument\', \'SubTransaction\', \'Unsupported\', \'Internal\', \'DatabaseClosed\', \'IncompatiblePromise\'];\n\nvar idbDomErrorNames = [\'Unknown\', \'Constraint\', \'Data\', \'TransactionInactive\', \'ReadOnly\', \'Version\', \'NotFound\', \'InvalidState\', \'InvalidAccess\', \'Abort\', \'Timeout\', \'QuotaExceeded\', \'Syntax\', \'DataClone\'];\n\nvar errorList = dexieErrorNames.concat(idbDomErrorNames);\n\nvar defaultTexts = {\n VersionChanged: "Database version changed by other database connection",\n DatabaseClosed: "Database has been closed",\n Abort: "Transaction aborted",\n TransactionInactive: "Transaction has already completed or failed"\n};\n\n//\n// DexieError - base class of all out exceptions.\n//\nfunction DexieError(name, msg) {\n // Reason we don\'t use ES6 classes is because:\n // 1. It bloats transpiled code and increases size of minified code.\n // 2. It doesn\'t give us much in this case.\n // 3. It would require sub classes to call super(), which\n // is not needed when deriving from Error.\n this._e = getErrorWithStack();\n this.name = name;\n this.message = msg;\n}\n\nderive(DexieError).from(Error).extend({\n stack: {\n get: function () {\n return this._stack || (this._stack = this.name + ": " + this.message + prettyStack(this._e, 2));\n }\n },\n toString: function () {\n return this.name + ": " + this.message;\n }\n});\n\nfunction getMultiErrorMessage(msg, failures) {\n return msg + ". Errors: " + failures.map(function (f) {\n return f.toString();\n }).filter(function (v, i, s) {\n return s.indexOf(v) === i;\n }) // Only unique error strings\n .join(\'\\n\');\n}\n\n//\n// ModifyError - thrown in WriteableCollection.modify()\n// Specific constructor because it contains members failures and failedKeys.\n//\nfunction ModifyError(msg, failures, successCount, failedKeys) {\n this._e = getErrorWithStack();\n this.failures = failures;\n this.failedKeys = failedKeys;\n this.successCount = successCount;\n}\nderive(ModifyError).from(DexieError);\n\nfunction BulkError(msg, failures) {\n this._e = getErrorWithStack();\n this.name = "BulkError";\n this.failures = failures;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(BulkError).from(DexieError);\n\n//\n//\n// Dynamically generate error names and exception classes based\n// on the names in errorList.\n//\n//\n\n// Map of {ErrorName -> ErrorName + "Error"}\nvar errnames = errorList.reduce(function (obj, name) {\n return obj[name] = name + "Error", obj;\n}, {});\n\n// Need an alias for DexieError because we\'re gonna create subclasses with the same name.\nvar BaseException = DexieError;\n// Map of {ErrorName -> exception constructor}\nvar exceptions = errorList.reduce(function (obj, name) {\n // Let the name be "DexieError" because this name may\n // be shown in call stack and when debugging. DexieError is\n // the most true name because it derives from DexieError,\n // and we cannot change Function.name programatically without\n // dynamically create a Function object, which would be considered\n // \'eval-evil\'.\n var fullName = name + "Error";\n function DexieError(msgOrInner, inner) {\n this._e = getErrorWithStack();\n this.name = fullName;\n if (!msgOrInner) {\n this.message = defaultTexts[name] || fullName;\n this.inner = null;\n } else if (typeof msgOrInner === \'string\') {\n this.message = msgOrInner;\n this.inner = inner || null;\n } else if (typeof msgOrInner === \'object\') {\n this.message = msgOrInner.name + \' \' + msgOrInner.message;\n this.inner = msgOrInner;\n }\n }\n derive(DexieError).from(BaseException);\n obj[name] = DexieError;\n return obj;\n}, {});\n\n// Use ECMASCRIPT standard exceptions where applicable:\nexceptions.Syntax = SyntaxError;\nexceptions.Type = TypeError;\nexceptions.Range = RangeError;\n\nvar exceptionMap = idbDomErrorNames.reduce(function (obj, name) {\n obj[name + "Error"] = exceptions[name];\n return obj;\n}, {});\n\nfunction mapError(domError, message) {\n if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name]) return domError;\n var rv = new exceptionMap[domError.name](message || domError.message, domError);\n if ("stack" in domError) {\n // Derive stack from inner exception if it has a stack\n setProp(rv, "stack", { get: function () {\n return this.inner.stack;\n } });\n }\n return rv;\n}\n\nvar fullNameExceptions = errorList.reduce(function (obj, name) {\n if (["Syntax", "Type", "Range"].indexOf(name) === -1) obj[name + "Error"] = exceptions[name];\n return obj;\n}, {});\n\nfullNameExceptions.ModifyError = ModifyError;\nfullNameExceptions.DexieError = DexieError;\nfullNameExceptions.BulkError = BulkError;\n\nfunction Events(ctx) {\n var evs = {};\n var rv = function (eventName, subscriber) {\n if (subscriber) {\n // Subscribe. If additional arguments than just the subscriber was provided, forward them as well.\n var i = arguments.length,\n args = new Array(i - 1);\n while (--i) {\n args[i - 1] = arguments[i];\n }evs[eventName].subscribe.apply(null, args);\n return ctx;\n } else if (typeof eventName === \'string\') {\n // Return interface allowing to fire or unsubscribe from event\n return evs[eventName];\n }\n };\n rv.addEventType = add;\n\n for (var i = 1, l = arguments.length; i < l; ++i) {\n add(arguments[i]);\n }\n\n return rv;\n\n function add(eventName, chainFunction, defaultFunction) {\n if (typeof eventName === \'object\') return addConfiguredEvents(eventName);\n if (!chainFunction) chainFunction = reverseStoppableEventChain;\n if (!defaultFunction) defaultFunction = nop;\n\n var context = {\n subscribers: [],\n fire: defaultFunction,\n subscribe: function (cb) {\n if (context.subscribers.indexOf(cb) === -1) {\n context.subscribers.push(cb);\n context.fire = chainFunction(context.fire, cb);\n }\n },\n unsubscribe: function (cb) {\n context.subscribers = context.subscribers.filter(function (fn) {\n return fn !== cb;\n });\n context.fire = context.subscribers.reduce(chainFunction, defaultFunction);\n }\n };\n evs[eventName] = rv[eventName] = context;\n return context;\n }\n\n function addConfiguredEvents(cfg) {\n // events(this, {reading: [functionChain, nop]});\n keys(cfg).forEach(function (eventName) {\n var args = cfg[eventName];\n if (isArray(args)) {\n add(eventName, cfg[eventName][0], cfg[eventName][1]);\n } else if (args === \'asap\') {\n // Rather than approaching event subscription using a functional approach, we here do it in a for-loop where subscriber is executed in its own stack\n // enabling that any exception that occur wont disturb the initiator and also not nescessary be catched and forgotten.\n var context = add(eventName, mirror, function fire() {\n // Optimazation-safe cloning of arguments into args.\n var i = arguments.length,\n args = new Array(i);\n while (i--) {\n args[i] = arguments[i];\n } // All each subscriber:\n context.subscribers.forEach(function (fn) {\n asap(function fireEvent() {\n fn.apply(null, args);\n });\n });\n });\n } else throw new exceptions.InvalidArgument("Invalid event config");\n });\n }\n}\n\n//\n// Promise Class for Dexie library\n//\n// I started out writing this Promise class by copying promise-light (https://github.com/taylorhakes/promise-light) by\n// https://github.com/taylorhakes - an A+ and ECMASCRIPT 6 compliant Promise implementation.\n//\n// Modifications needed to be done to support indexedDB because it wont accept setTimeout()\n// (See discussion: https://github.com/promises-aplus/promises-spec/issues/45) .\n// This topic was also discussed in the following thread: https://github.com/promises-aplus/promises-spec/issues/45\n//\n// This implementation will not use setTimeout or setImmediate when it\'s not needed. The behavior is 100% Promise/A+ compliant since\n// the caller of new Promise() can be certain that the promise wont be triggered the lines after constructing the promise.\n//\n// In previous versions this was fixed by not calling setTimeout when knowing that the resolve() or reject() came from another\n// tick. In Dexie v1.4.0, I\'ve rewritten the Promise class entirely. Just some fragments of promise-light is left. I use\n// another strategy now that simplifies everything a lot: to always execute callbacks in a new tick, but have an own microTick\n// engine that is used instead of setImmediate() or setTimeout().\n// Promise class has also been optimized a lot with inspiration from bluebird - to avoid closures as much as possible.\n// Also with inspiration from bluebird, asyncronic stacks in debug mode.\n//\n// Specific non-standard features of this Promise class:\n// * Async static context support (Promise.PSD)\n// * Promise.follow() method built upon PSD, that allows user to track all promises created from current stack frame\n// and below + all promises that those promises creates or awaits.\n// * Detect any unhandled promise in a PSD-scope (PSD.onunhandled). \n//\n// David Fahlander, https://github.com/dfahlander\n//\n\n// Just a pointer that only this module knows about.\n// Used in Promise constructor to emulate a private constructor.\nvar INTERNAL = {};\n\n// Async stacks (long stacks) must not grow infinitely.\nvar LONG_STACKS_CLIP_LIMIT = 100;\nvar MAX_LONG_STACKS = 20;\nvar stack_being_generated = false;\n\n/* The default "nextTick" function used only for the very first promise in a promise chain.\r\n As soon as then promise is resolved or rejected, all next tasks will be executed in micro ticks\r\n emulated in this module. For indexedDB compatibility, this means that every method needs to \r\n execute at least one promise before doing an indexedDB operation. Dexie will always call \r\n db.ready().then() for every operation to make sure the indexedDB event is started in an\r\n emulated micro tick.\r\n*/\nvar schedulePhysicalTick = _global.setImmediate ?\n// setImmediate supported. Those modern platforms also supports Function.bind().\nsetImmediate.bind(null, physicalTick) : _global.MutationObserver ?\n// MutationObserver supported\nfunction () {\n var hiddenDiv = document.createElement("div");\n new MutationObserver(function () {\n physicalTick();\n hiddenDiv = null;\n }).observe(hiddenDiv, { attributes: true });\n hiddenDiv.setAttribute(\'i\', \'1\');\n} :\n// No support for setImmediate or MutationObserver. No worry, setTimeout is only called\n// once time. Every tick that follows will be our emulated micro tick.\n// Could have uses setTimeout.bind(null, 0, physicalTick) if it wasnt for that FF13 and below has a bug \nfunction () {\n setTimeout(physicalTick, 0);\n};\n\n// Confifurable through Promise.scheduler.\n// Don\'t export because it would be unsafe to let unknown\n// code call it unless they do try..catch within their callback.\n// This function can be retrieved through getter of Promise.scheduler though,\n// but users must not do Promise.scheduler (myFuncThatThrows exception)!\nvar asap$1 = function (callback, args) {\n microtickQueue.push([callback, args]);\n if (needsNewPhysicalTick) {\n schedulePhysicalTick();\n needsNewPhysicalTick = false;\n }\n};\n\nvar isOutsideMicroTick = true;\nvar needsNewPhysicalTick = true;\nvar unhandledErrors = [];\nvar rejectingErrors = [];\nvar currentFulfiller = null;\nvar rejectionMapper = mirror; // Remove in next major when removing error mapping of DOMErrors and DOMExceptions\n\nvar globalPSD = {\n global: true,\n ref: 0,\n unhandleds: [],\n onunhandled: globalError,\n //env: null, // Will be set whenever leaving a scope using wrappers.snapshot()\n finalize: function () {\n this.unhandleds.forEach(function (uh) {\n try {\n globalError(uh[0], uh[1]);\n } catch (e) {}\n });\n }\n};\n\nvar PSD = globalPSD;\n\nvar microtickQueue = []; // Callbacks to call in this or next physical tick.\nvar numScheduledCalls = 0; // Number of listener-calls left to do in this physical tick.\nvar tickFinalizers = []; // Finalizers to call when there are no more async calls scheduled within current physical tick.\n\n// Wrappers are not being used yet. Their framework is functioning and can be used\n// to replace environment during a PSD scope (a.k.a. \'zone\').\n/* **KEEP** export var wrappers = (() => {\r\n var wrappers = [];\r\n\r\n return {\r\n snapshot: () => {\r\n var i = wrappers.length,\r\n result = new Array(i);\r\n while (i--) result[i] = wrappers[i].snapshot();\r\n return result;\r\n },\r\n restore: values => {\r\n var i = wrappers.length;\r\n while (i--) wrappers[i].restore(values[i]);\r\n },\r\n wrap: () => wrappers.map(w => w.wrap()),\r\n add: wrapper => {\r\n wrappers.push(wrapper);\r\n }\r\n };\r\n})();\r\n*/\n\nfunction Promise(fn) {\n if (typeof this !== \'object\') throw new TypeError(\'Promises must be constructed via new\');\n this._listeners = [];\n this.onuncatched = nop; // Deprecate in next major. Not needed. Better to use global error handler.\n\n // A library may set `promise._lib = true;` after promise is created to make resolve() or reject()\n // execute the microtask engine implicitely within the call to resolve() or reject().\n // To remain A+ compliant, a library must only set `_lib=true` if it can guarantee that the stack\n // only contains library code when calling resolve() or reject().\n // RULE OF THUMB: ONLY set _lib = true for promises explicitely resolving/rejecting directly from\n // global scope (event handler, timer etc)!\n this._lib = false;\n // Current async scope\n var psd = this._PSD = PSD;\n\n if (debug) {\n this._stackHolder = getErrorWithStack();\n this._prev = null;\n this._numPrev = 0; // Number of previous promises (for long stacks)\n linkToPreviousPromise(this, currentFulfiller);\n }\n\n if (typeof fn !== \'function\') {\n if (fn !== INTERNAL) throw new TypeError(\'Not a function\');\n // Private constructor (INTERNAL, state, value).\n // Used internally by Promise.resolve() and Promise.reject().\n this._state = arguments[1];\n this._value = arguments[2];\n if (this._state === false) handleRejection(this, this._value); // Map error, set stack and addPossiblyUnhandledError().\n return;\n }\n\n this._state = null; // null (=pending), false (=rejected) or true (=resolved)\n this._value = null; // error or result\n ++psd.ref; // Refcounting current scope\n executePromiseTask(this, fn);\n}\n\nprops(Promise.prototype, {\n\n then: function (onFulfilled, onRejected) {\n var _this = this;\n\n var rv = new Promise(function (resolve, reject) {\n propagateToListener(_this, new Listener(onFulfilled, onRejected, resolve, reject));\n });\n debug && (!this._prev || this._state === null) && linkToPreviousPromise(rv, this);\n return rv;\n },\n\n _then: function (onFulfilled, onRejected) {\n // A little tinier version of then() that don\'t have to create a resulting promise.\n propagateToListener(this, new Listener(null, null, onFulfilled, onRejected));\n },\n\n catch: function (onRejected) {\n if (arguments.length === 1) return this.then(null, onRejected);\n // First argument is the Error type to catch\n var type = arguments[0],\n handler = arguments[1];\n return typeof type === \'function\' ? this.then(null, function (err) {\n return (\n // Catching errors by its constructor type (similar to java / c++ / c#)\n // Sample: promise.catch(TypeError, function (e) { ... });\n err instanceof type ? handler(err) : PromiseReject(err)\n );\n }) : this.then(null, function (err) {\n return (\n // Catching errors by the error.name property. Makes sense for indexedDB where error type\n // is always DOMError but where e.name tells the actual error type.\n // Sample: promise.catch(\'ConstraintError\', function (e) { ... });\n err && err.name === type ? handler(err) : PromiseReject(err)\n );\n });\n },\n\n finally: function (onFinally) {\n return this.then(function (value) {\n onFinally();\n return value;\n }, function (err) {\n onFinally();\n return PromiseReject(err);\n });\n },\n\n // Deprecate in next major. Needed only for db.on.error.\n uncaught: function (uncaughtHandler) {\n var _this2 = this;\n\n // Be backward compatible and use "onuncatched" as the event name on this.\n // Handle multiple subscribers through reverseStoppableEventChain(). If a handler returns `false`, bubbling stops.\n this.onuncatched = reverseStoppableEventChain(this.onuncatched, uncaughtHandler);\n // In case caller does this on an already rejected promise, assume caller wants to point out the error to this promise and not\n // a previous promise. Reason: the prevous promise may lack onuncatched handler. \n if (this._state === false && unhandledErrors.indexOf(this) === -1) {\n // Replace unhandled error\'s destinaion promise with this one!\n unhandledErrors.some(function (p, i, l) {\n return p._value === _this2._value && (l[i] = _this2);\n });\n // Actually we do this shit because we need to support db.on.error() correctly during db.open(). If we deprecate db.on.error, we could\n // take away this piece of code as well as the onuncatched and uncaught() method.\n }\n return this;\n },\n\n stack: {\n get: function () {\n if (this._stack) return this._stack;\n try {\n stack_being_generated = true;\n var stacks = getStack(this, [], MAX_LONG_STACKS);\n var stack = stacks.join("\\nFrom previous: ");\n if (this._state !== null) this._stack = stack; // Stack may be updated on reject.\n return stack;\n } finally {\n stack_being_generated = false;\n }\n }\n }\n});\n\nfunction Listener(onFulfilled, onRejected, resolve, reject) {\n this.onFulfilled = typeof onFulfilled === \'function\' ? onFulfilled : null;\n this.onRejected = typeof onRejected === \'function\' ? onRejected : null;\n this.resolve = resolve;\n this.reject = reject;\n this.psd = PSD;\n}\n\n// Promise Static Properties\nprops(Promise, {\n all: function () {\n var values = getArrayOf.apply(null, arguments); // Supports iterables, implicit arguments and array-like.\n return new Promise(function (resolve, reject) {\n if (values.length === 0) resolve([]);\n var remaining = values.length;\n values.forEach(function (a, i) {\n return Promise.resolve(a).then(function (x) {\n values[i] = x;\n if (! --remaining) resolve(values);\n }, reject);\n });\n });\n },\n\n resolve: function (value) {\n if (value instanceof Promise) return value;\n if (value && typeof value.then === \'function\') return new Promise(function (resolve, reject) {\n value.then(resolve, reject);\n });\n return new Promise(INTERNAL, true, value);\n },\n\n reject: PromiseReject,\n\n race: function () {\n var values = getArrayOf.apply(null, arguments);\n return new Promise(function (resolve, reject) {\n values.map(function (value) {\n return Promise.resolve(value).then(resolve, reject);\n });\n });\n },\n\n PSD: {\n get: function () {\n return PSD;\n },\n set: function (value) {\n return PSD = value;\n }\n },\n\n newPSD: newScope,\n\n usePSD: usePSD,\n\n scheduler: {\n get: function () {\n return asap$1;\n },\n set: function (value) {\n asap$1 = value;\n }\n },\n\n rejectionMapper: {\n get: function () {\n return rejectionMapper;\n },\n set: function (value) {\n rejectionMapper = value;\n } // Map reject failures\n },\n\n follow: function (fn) {\n return new Promise(function (resolve, reject) {\n return newScope(function (resolve, reject) {\n var psd = PSD;\n psd.unhandleds = []; // For unhandled standard- or 3rd party Promises. Checked at psd.finalize()\n psd.onunhandled = reject; // Triggered directly on unhandled promises of this library.\n psd.finalize = callBoth(function () {\n var _this3 = this;\n\n // Unhandled standard or 3rd part promises are put in PSD.unhandleds and\n // examined upon scope completion while unhandled rejections in this Promise\n // will trigger directly through psd.onunhandled\n run_at_end_of_this_or_next_physical_tick(function () {\n _this3.unhandleds.length === 0 ? resolve() : reject(_this3.unhandleds[0]);\n });\n }, psd.finalize);\n fn();\n }, resolve, reject);\n });\n },\n\n on: Events(null, { "error": [reverseStoppableEventChain, defaultErrorHandler] // Default to defaultErrorHandler\n })\n\n});\n\nvar PromiseOnError = Promise.on.error;\nPromiseOnError.subscribe = deprecated("Promise.on(\'error\')", PromiseOnError.subscribe);\nPromiseOnError.unsubscribe = deprecated("Promise.on(\'error\').unsubscribe", PromiseOnError.unsubscribe);\n\n/**\r\n* Take a potentially misbehaving resolver function and make sure\r\n* onFulfilled and onRejected are only called once.\r\n*\r\n* Makes no guarantees about asynchrony.\r\n*/\nfunction executePromiseTask(promise, fn) {\n // Promise Resolution Procedure:\n // https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n try {\n fn(function (value) {\n if (promise._state !== null) return;\n if (value === promise) throw new TypeError(\'A promise cannot be resolved with itself.\');\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n if (value && typeof value.then === \'function\') {\n executePromiseTask(promise, function (resolve, reject) {\n value instanceof Promise ? value._then(resolve, reject) : value.then(resolve, reject);\n });\n } else {\n promise._state = true;\n promise._value = value;\n propagateAllListeners(promise);\n }\n if (shouldExecuteTick) endMicroTickScope();\n }, handleRejection.bind(null, promise)); // If Function.bind is not supported. Exception is handled in catch below\n } catch (ex) {\n handleRejection(promise, ex);\n }\n}\n\nfunction handleRejection(promise, reason) {\n rejectingErrors.push(reason);\n if (promise._state !== null) return;\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n reason = rejectionMapper(reason);\n promise._state = false;\n promise._value = reason;\n debug && reason !== null && typeof reason === \'object\' && !reason._promise && tryCatch(function () {\n var origProp = getPropertyDescriptor(reason, "stack");\n reason._promise = promise;\n setProp(reason, "stack", {\n get: function () {\n return stack_being_generated ? origProp && (origProp.get ? origProp.get.apply(reason) : origProp.value) : promise.stack;\n }\n });\n });\n // Add the failure to a list of possibly uncaught errors\n addPossiblyUnhandledError(promise);\n propagateAllListeners(promise);\n if (shouldExecuteTick) endMicroTickScope();\n}\n\nfunction propagateAllListeners(promise) {\n //debug && linkToPreviousPromise(promise);\n var listeners = promise._listeners;\n promise._listeners = [];\n for (var i = 0, len = listeners.length; i < len; ++i) {\n propagateToListener(promise, listeners[i]);\n }\n var psd = promise._PSD;\n --psd.ref || psd.finalize(); // if psd.ref reaches zero, call psd.finalize();\n if (numScheduledCalls === 0) {\n // If numScheduledCalls is 0, it means that our stack is not in a callback of a scheduled call,\n // and that no deferreds where listening to this rejection or success.\n // Since there is a risk that our stack can contain application code that may\n // do stuff after this code is finished that may generate new calls, we cannot\n // call finalizers here.\n ++numScheduledCalls;\n asap$1(function () {\n if (--numScheduledCalls === 0) finalizePhysicalTick(); // Will detect unhandled errors\n }, []);\n }\n}\n\nfunction propagateToListener(promise, listener) {\n if (promise._state === null) {\n promise._listeners.push(listener);\n return;\n }\n\n var cb = promise._state ? listener.onFulfilled : listener.onRejected;\n if (cb === null) {\n // This Listener doesnt have a listener for the event being triggered (onFulfilled or onReject) so lets forward the event to any eventual listeners on the Promise instance returned by then() or catch()\n return (promise._state ? listener.resolve : listener.reject)(promise._value);\n }\n var psd = listener.psd;\n ++psd.ref;\n ++numScheduledCalls;\n asap$1(callListener, [cb, promise, listener]);\n}\n\nfunction callListener(cb, promise, listener) {\n var outerScope = PSD;\n var psd = listener.psd;\n try {\n if (psd !== outerScope) {\n // **KEEP** outerScope.env = wrappers.snapshot(); // Snapshot outerScope\'s environment.\n PSD = psd;\n // **KEEP** wrappers.restore(psd.env); // Restore PSD\'s environment.\n }\n\n // Set static variable currentFulfiller to the promise that is being fullfilled,\n // so that we connect the chain of promises (for long stacks support)\n currentFulfiller = promise;\n\n // Call callback and resolve our listener with it\'s return value.\n var value = promise._value,\n ret;\n if (promise._state) {\n ret = cb(value);\n } else {\n if (rejectingErrors.length) rejectingErrors = [];\n ret = cb(value);\n if (rejectingErrors.indexOf(value) === -1) markErrorAsHandled(promise); // Callback didnt do Promise.reject(err) nor reject(err) onto another promise.\n }\n listener.resolve(ret);\n } catch (e) {\n // Exception thrown in callback. Reject our listener.\n listener.reject(e);\n } finally {\n // Restore PSD, env and currentFulfiller.\n if (psd !== outerScope) {\n PSD = outerScope;\n // **KEEP** wrappers.restore(outerScope.env); // Restore outerScope\'s environment\n }\n currentFulfiller = null;\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n --psd.ref || psd.finalize();\n }\n}\n\nfunction getStack(promise, stacks, limit) {\n if (stacks.length === limit) return stacks;\n var stack = "";\n if (promise._state === false) {\n var failure = promise._value,\n errorName,\n message;\n\n if (failure != null) {\n errorName = failure.name || "Error";\n message = failure.message || failure;\n stack = prettyStack(failure, 0);\n } else {\n errorName = failure; // If error is undefined or null, show that.\n message = "";\n }\n stacks.push(errorName + (message ? ": " + message : "") + stack);\n }\n if (debug) {\n stack = prettyStack(promise._stackHolder, 2);\n if (stack && stacks.indexOf(stack) === -1) stacks.push(stack);\n if (promise._prev) getStack(promise._prev, stacks, limit);\n }\n return stacks;\n}\n\nfunction linkToPreviousPromise(promise, prev) {\n // Support long stacks by linking to previous completed promise.\n var numPrev = prev ? prev._numPrev + 1 : 0;\n if (numPrev < LONG_STACKS_CLIP_LIMIT) {\n // Prohibit infinite Promise loops to get an infinite long memory consuming "tail".\n promise._prev = prev;\n promise._numPrev = numPrev;\n }\n}\n\n/* The callback to schedule with setImmediate() or setTimeout().\r\n It runs a virtual microtick and executes any callback registered in microtickQueue.\r\n */\nfunction physicalTick() {\n beginMicroTickScope() && endMicroTickScope();\n}\n\nfunction beginMicroTickScope() {\n var wasRootExec = isOutsideMicroTick;\n isOutsideMicroTick = false;\n needsNewPhysicalTick = false;\n return wasRootExec;\n}\n\n/* Executes micro-ticks without doing try..catch.\r\n This can be possible because we only use this internally and\r\n the registered functions are exception-safe (they do try..catch\r\n internally before calling any external method). If registering\r\n functions in the microtickQueue that are not exception-safe, this\r\n would destroy the framework and make it instable. So we don\'t export\r\n our asap method.\r\n*/\nfunction endMicroTickScope() {\n var callbacks, i, l;\n do {\n while (microtickQueue.length > 0) {\n callbacks = microtickQueue;\n microtickQueue = [];\n l = callbacks.length;\n for (i = 0; i < l; ++i) {\n var item = callbacks[i];\n item[0].apply(null, item[1]);\n }\n }\n } while (microtickQueue.length > 0);\n isOutsideMicroTick = true;\n needsNewPhysicalTick = true;\n}\n\nfunction finalizePhysicalTick() {\n var unhandledErrs = unhandledErrors;\n unhandledErrors = [];\n unhandledErrs.forEach(function (p) {\n p._PSD.onunhandled.call(null, p._value, p);\n });\n var finalizers = tickFinalizers.slice(0); // Clone first because finalizer may remove itself from list.\n var i = finalizers.length;\n while (i) {\n finalizers[--i]();\n }\n}\n\nfunction run_at_end_of_this_or_next_physical_tick(fn) {\n function finalizer() {\n fn();\n tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1);\n }\n tickFinalizers.push(finalizer);\n ++numScheduledCalls;\n asap$1(function () {\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n }, []);\n}\n\nfunction addPossiblyUnhandledError(promise) {\n // Only add to unhandledErrors if not already there. The first one to add to this list\n // will be upon the first rejection so that the root cause (first promise in the\n // rejection chain) is the one listed.\n if (!unhandledErrors.some(function (p) {\n return p._value === promise._value;\n })) unhandledErrors.push(promise);\n}\n\nfunction markErrorAsHandled(promise) {\n // Called when a reject handled is actually being called.\n // Search in unhandledErrors for any promise whos _value is this promise_value (list\n // contains only rejected promises, and only one item per error)\n var i = unhandledErrors.length;\n while (i) {\n if (unhandledErrors[--i]._value === promise._value) {\n // Found a promise that failed with this same error object pointer,\n // Remove that since there is a listener that actually takes care of it.\n unhandledErrors.splice(i, 1);\n return;\n }\n }\n}\n\n// By default, log uncaught errors to the console\nfunction defaultErrorHandler(e) {\n console.warn(\'Unhandled rejection: \' + (e.stack || e));\n}\n\nfunction PromiseReject(reason) {\n return new Promise(INTERNAL, false, reason);\n}\n\nfunction wrap(fn, errorCatcher) {\n var psd = PSD;\n return function () {\n var wasRootExec = beginMicroTickScope(),\n outerScope = PSD;\n\n try {\n if (outerScope !== psd) {\n // **KEEP** outerScope.env = wrappers.snapshot(); // Snapshot outerScope\'s environment\n PSD = psd;\n // **KEEP** wrappers.restore(psd.env); // Restore PSD\'s environment.\n }\n return fn.apply(this, arguments);\n } catch (e) {\n errorCatcher && errorCatcher(e);\n } finally {\n if (outerScope !== psd) {\n PSD = outerScope;\n // **KEEP** wrappers.restore(outerScope.env); // Restore outerScope\'s environment\n }\n if (wasRootExec) endMicroTickScope();\n }\n };\n}\n\nfunction newScope(fn, a1, a2, a3) {\n var parent = PSD,\n psd = Object.create(parent);\n psd.parent = parent;\n psd.ref = 0;\n psd.global = false;\n // **KEEP** psd.env = wrappers.wrap(psd);\n\n // unhandleds and onunhandled should not be specifically set here.\n // Leave them on parent prototype.\n // unhandleds.push(err) will push to parent\'s prototype\n // onunhandled() will call parents onunhandled (with this scope\'s this-pointer though!)\n ++parent.ref;\n psd.finalize = function () {\n --this.parent.ref || this.parent.finalize();\n };\n var rv = usePSD(psd, fn, a1, a2, a3);\n if (psd.ref === 0) psd.finalize();\n return rv;\n}\n\nfunction usePSD(psd, fn, a1, a2, a3) {\n var outerScope = PSD;\n try {\n if (psd !== outerScope) {\n // **KEEP** outerScope.env = wrappers.snapshot(); // snapshot outerScope\'s environment.\n PSD = psd;\n // **KEEP** wrappers.restore(psd.env); // Restore PSD\'s environment.\n }\n return fn(a1, a2, a3);\n } finally {\n if (psd !== outerScope) {\n PSD = outerScope;\n // **KEEP** wrappers.restore(outerScope.env); // Restore outerScope\'s environment.\n }\n }\n}\n\nvar UNHANDLEDREJECTION = "unhandledrejection";\n\nfunction globalError(err, promise) {\n var rv;\n try {\n rv = promise.onuncatched(err);\n } catch (e) {}\n if (rv !== false) try {\n var event,\n eventData = { promise: promise, reason: err };\n if (_global.document && document.createEvent) {\n event = document.createEvent(\'Event\');\n event.initEvent(UNHANDLEDREJECTION, true, true);\n extend(event, eventData);\n } else if (_global.CustomEvent) {\n event = new CustomEvent(UNHANDLEDREJECTION, { detail: eventData });\n extend(event, eventData);\n }\n if (event && _global.dispatchEvent) {\n dispatchEvent(event);\n if (!_global.PromiseRejectionEvent && _global.onunhandledrejection)\n // No native support for PromiseRejectionEvent but user has set window.onunhandledrejection. Manually call it.\n try {\n _global.onunhandledrejection(event);\n } catch (_) {}\n }\n if (!event.defaultPrevented) {\n // Backward compatibility: fire to events registered at Promise.on.error\n Promise.on.error.fire(err, promise);\n }\n } catch (e) {}\n}\n\n/* **KEEP** \r\n\r\nexport function wrapPromise(PromiseClass) {\r\n var proto = PromiseClass.prototype;\r\n var origThen = proto.then;\r\n \r\n wrappers.add({\r\n snapshot: () => proto.then,\r\n restore: value => {proto.then = value;},\r\n wrap: () => patchedThen\r\n });\r\n\r\n function patchedThen (onFulfilled, onRejected) {\r\n var promise = this;\r\n var onFulfilledProxy = wrap(function(value){\r\n var rv = value;\r\n if (onFulfilled) {\r\n rv = onFulfilled(rv);\r\n if (rv && typeof rv.then === \'function\') rv.then(); // Intercept that promise as well.\r\n }\r\n --PSD.ref || PSD.finalize();\r\n return rv;\r\n });\r\n var onRejectedProxy = wrap(function(err){\r\n promise._$err = err;\r\n var unhandleds = PSD.unhandleds;\r\n var idx = unhandleds.length,\r\n rv;\r\n while (idx--) if (unhandleds[idx]._$err === err) break;\r\n if (onRejected) {\r\n if (idx !== -1) unhandleds.splice(idx, 1); // Mark as handled.\r\n rv = onRejected(err);\r\n if (rv && typeof rv.then === \'function\') rv.then(); // Intercept that promise as well.\r\n } else {\r\n if (idx === -1) unhandleds.push(promise);\r\n rv = PromiseClass.reject(err);\r\n rv._$nointercept = true; // Prohibit eternal loop.\r\n }\r\n --PSD.ref || PSD.finalize();\r\n return rv;\r\n });\r\n \r\n if (this._$nointercept) return origThen.apply(this, arguments);\r\n ++PSD.ref;\r\n return origThen.call(this, onFulfilledProxy, onRejectedProxy);\r\n }\r\n}\r\n\r\n// Global Promise wrapper\r\nif (_global.Promise) wrapPromise(_global.Promise);\r\n\r\n*/\n\ndoFakeAutoComplete(function () {\n // Simplify the job for VS Intellisense. This piece of code is one of the keys to the new marvellous intellisense support in Dexie.\n asap$1 = function (fn, args) {\n setTimeout(function () {\n fn.apply(null, args);\n }, 0);\n };\n});\n\nfunction rejection(err, uncaughtHandler) {\n // Get the call stack and return a rejected promise.\n var rv = Promise.reject(err);\n return uncaughtHandler ? rv.uncaught(uncaughtHandler) : rv;\n}\n\n/*\r\n * Dexie.js - a minimalistic wrapper for IndexedDB\r\n * ===============================================\r\n *\r\n * By David Fahlander, david.fahlander@gmail.com\r\n *\r\n * Version 1.5.1, Tue Nov 01 2016\r\n *\r\n * http://dexie.org\r\n *\r\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/\r\n */\n\nvar DEXIE_VERSION = \'1.5.1\';\nvar maxString = String.fromCharCode(65535);\nvar maxKey = function () {\n try {\n IDBKeyRange.only([[]]);return [[]];\n } catch (e) {\n return maxString;\n }\n}();\nvar INVALID_KEY_ARGUMENT = "Invalid key provided. Keys must be of type string, number, Date or Array.";\nvar STRING_EXPECTED = "String expected.";\nvar connections = [];\nvar isIEOrEdge = typeof navigator !== \'undefined\' && /(MSIE|Trident|Edge)/.test(navigator.userAgent);\nvar hasIEDeleteObjectStoreBug = isIEOrEdge;\nvar hangsOnDeleteLargeKeyRange = isIEOrEdge;\nvar dexieStackFrameFilter = function (frame) {\n return !/(dexie\\.js|dexie\\.min\\.js)/.test(frame);\n};\n\nsetDebug(debug, dexieStackFrameFilter);\n\nfunction Dexie(dbName, options) {\n /// Specify only if you wich to control which addons that should run on this instance\n var deps = Dexie.dependencies;\n var opts = extend({\n // Default Options\n addons: Dexie.addons, // Pick statically registered addons by default\n autoOpen: true, // Don\'t require db.open() explicitely.\n indexedDB: deps.indexedDB, // Backend IndexedDB api. Default to IDBShim or browser env.\n IDBKeyRange: deps.IDBKeyRange // Backend IDBKeyRange api. Default to IDBShim or browser env.\n }, options);\n var addons = opts.addons,\n autoOpen = opts.autoOpen,\n indexedDB = opts.indexedDB,\n IDBKeyRange = opts.IDBKeyRange;\n\n var globalSchema = this._dbSchema = {};\n var versions = [];\n var dbStoreNames = [];\n var allTables = {};\n ///\n var idbdb = null; // Instance of IDBDatabase\n var dbOpenError = null;\n var isBeingOpened = false;\n var openComplete = false;\n var READONLY = "readonly",\n READWRITE = "readwrite";\n var db = this;\n var dbReadyResolve,\n dbReadyPromise = new Promise(function (resolve) {\n dbReadyResolve = resolve;\n }),\n cancelOpen,\n openCanceller = new Promise(function (_, reject) {\n cancelOpen = reject;\n });\n var autoSchema = true;\n var hasNativeGetDatabaseNames = !!getNativeGetDatabaseNamesFn(indexedDB),\n hasGetAll;\n\n function init() {\n // Default subscribers to "versionchange" and "blocked".\n // Can be overridden by custom handlers. If custom handlers return false, these default\n // behaviours will be prevented.\n db.on("versionchange", function (ev) {\n // Default behavior for versionchange event is to close database connection.\n // Caller can override this behavior by doing db.on("versionchange", function(){ return false; });\n // Let\'s not block the other window from making it\'s delete() or open() call.\n // NOTE! This event is never fired in IE,Edge or Safari.\n if (ev.newVersion > 0) console.warn(\'Another connection wants to upgrade database \\\'\' + db.name + \'\\\'. Closing db now to resume the upgrade.\');else console.warn(\'Another connection wants to delete database \\\'\' + db.name + \'\\\'. Closing db now to resume the delete request.\');\n db.close();\n // In many web applications, it would be recommended to force window.reload()\n // when this event occurs. To do that, subscribe to the versionchange event\n // and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)\n // The reason for this is that your current web app obviously has old schema code that needs\n // to be updated. Another window got a newer version of the app and needs to upgrade DB but\n // your window is blocking it unless we close it here.\n });\n db.on("blocked", function (ev) {\n if (!ev.newVersion || ev.newVersion < ev.oldVersion) console.warn(\'Dexie.delete(\\\'\' + db.name + \'\\\') was blocked\');else console.warn(\'Upgrade \\\'\' + db.name + \'\\\' blocked by other connection holding version \' + ev.oldVersion / 10);\n });\n }\n\n //\n //\n //\n // ------------------------- Versioning Framework---------------------------\n //\n //\n //\n\n this.version = function (versionNumber) {\n /// \n /// \n if (idbdb || isBeingOpened) throw new exceptions.Schema("Cannot add version when database is open");\n this.verno = Math.max(this.verno, versionNumber);\n var versionInstance = versions.filter(function (v) {\n return v._cfg.version === versionNumber;\n })[0];\n if (versionInstance) return versionInstance;\n versionInstance = new Version(versionNumber);\n versions.push(versionInstance);\n versions.sort(lowerVersionFirst);\n return versionInstance;\n };\n\n function Version(versionNumber) {\n this._cfg = {\n version: versionNumber,\n storesSource: null,\n dbschema: {},\n tables: {},\n contentUpgrade: null\n };\n this.stores({}); // Derive earlier schemas by default.\n }\n\n extend(Version.prototype, {\n stores: function (stores) {\n /// \n /// Defines the schema for a particular version\n /// \n /// \n /// Example:
\n /// {users: "id++,first,last,&username,*email",
\n /// passwords: "id++,&username"}
\n ///
\n /// Syntax: {Table: "[primaryKey][++],[&][*]index1,[&][*]index2,..."}

\n /// Special characters:
\n /// "&" means unique key,
\n /// "*" means value is multiEntry,
\n /// "++" means auto-increment and only applicable for primary key
\n /// \n this._cfg.storesSource = this._cfg.storesSource ? extend(this._cfg.storesSource, stores) : stores;\n\n // Derive stores from earlier versions if they are not explicitely specified as null or a new syntax.\n var storesSpec = {};\n versions.forEach(function (version) {\n // \'versions\' is always sorted by lowest version first.\n extend(storesSpec, version._cfg.storesSource);\n });\n\n var dbschema = this._cfg.dbschema = {};\n this._parseStoresSpec(storesSpec, dbschema);\n // Update the latest schema to this version\n // Update API\n globalSchema = db._dbSchema = dbschema;\n removeTablesApi([allTables, db, Transaction.prototype]);\n setApiOnPlace([allTables, db, Transaction.prototype, this._cfg.tables], keys(dbschema), READWRITE, dbschema);\n dbStoreNames = keys(dbschema);\n return this;\n },\n upgrade: function (upgradeFunction) {\n /// Function that performs upgrading actions.\n var self = this;\n fakeAutoComplete(function () {\n upgradeFunction(db._createTransaction(READWRITE, keys(self._cfg.dbschema), self._cfg.dbschema)); // BUGBUG: No code completion for prev version\'s tables wont appear.\n });\n this._cfg.contentUpgrade = upgradeFunction;\n return this;\n },\n _parseStoresSpec: function (stores, outSchema) {\n keys(stores).forEach(function (tableName) {\n if (stores[tableName] !== null) {\n var instanceTemplate = {};\n var indexes = parseIndexSyntax(stores[tableName]);\n var primKey = indexes.shift();\n if (primKey.multi) throw new exceptions.Schema("Primary key cannot be multi-valued");\n if (primKey.keyPath) setByKeyPath(instanceTemplate, primKey.keyPath, primKey.auto ? 0 : primKey.keyPath);\n indexes.forEach(function (idx) {\n if (idx.auto) throw new exceptions.Schema("Only primary key can be marked as autoIncrement (++)");\n if (!idx.keyPath) throw new exceptions.Schema("Index must have a name and cannot be an empty string");\n setByKeyPath(instanceTemplate, idx.keyPath, idx.compound ? idx.keyPath.map(function () {\n return "";\n }) : "");\n });\n outSchema[tableName] = new TableSchema(tableName, primKey, indexes, instanceTemplate);\n }\n });\n }\n });\n\n function runUpgraders(oldVersion, idbtrans, reject) {\n var trans = db._createTransaction(READWRITE, dbStoreNames, globalSchema);\n trans.create(idbtrans);\n trans._completion.catch(reject);\n var rejectTransaction = trans._reject.bind(trans);\n newScope(function () {\n PSD.trans = trans;\n if (oldVersion === 0) {\n // Create tables:\n keys(globalSchema).forEach(function (tableName) {\n createTable(idbtrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes);\n });\n Promise.follow(function () {\n return db.on.populate.fire(trans);\n }).catch(rejectTransaction);\n } else updateTablesAndIndexes(oldVersion, trans, idbtrans).catch(rejectTransaction);\n });\n }\n\n function updateTablesAndIndexes(oldVersion, trans, idbtrans) {\n // Upgrade version to version, step-by-step from oldest to newest version.\n // Each transaction object will contain the table set that was current in that version (but also not-yet-deleted tables from its previous version)\n var queue = [];\n var oldVersionStruct = versions.filter(function (version) {\n return version._cfg.version === oldVersion;\n })[0];\n if (!oldVersionStruct) throw new exceptions.Upgrade("Dexie specification of currently installed DB version is missing");\n globalSchema = db._dbSchema = oldVersionStruct._cfg.dbschema;\n var anyContentUpgraderHasRun = false;\n\n var versToRun = versions.filter(function (v) {\n return v._cfg.version > oldVersion;\n });\n versToRun.forEach(function (version) {\n /// \n queue.push(function () {\n var oldSchema = globalSchema;\n var newSchema = version._cfg.dbschema;\n adjustToExistingIndexNames(oldSchema, idbtrans);\n adjustToExistingIndexNames(newSchema, idbtrans);\n globalSchema = db._dbSchema = newSchema;\n var diff = getSchemaDiff(oldSchema, newSchema);\n // Add tables \n diff.add.forEach(function (tuple) {\n createTable(idbtrans, tuple[0], tuple[1].primKey, tuple[1].indexes);\n });\n // Change tables\n diff.change.forEach(function (change) {\n if (change.recreate) {\n throw new exceptions.Upgrade("Not yet support for changing primary key");\n } else {\n var store = idbtrans.objectStore(change.name);\n // Add indexes\n change.add.forEach(function (idx) {\n addIndex(store, idx);\n });\n // Update indexes\n change.change.forEach(function (idx) {\n store.deleteIndex(idx.name);\n addIndex(store, idx);\n });\n // Delete indexes\n change.del.forEach(function (idxName) {\n store.deleteIndex(idxName);\n });\n }\n });\n if (version._cfg.contentUpgrade) {\n anyContentUpgraderHasRun = true;\n return Promise.follow(function () {\n version._cfg.contentUpgrade(trans);\n });\n }\n });\n queue.push(function (idbtrans) {\n if (!anyContentUpgraderHasRun || !hasIEDeleteObjectStoreBug) {\n // Dont delete old tables if ieBug is present and a content upgrader has run. Let tables be left in DB so far. This needs to be taken care of.\n var newSchema = version._cfg.dbschema;\n // Delete old tables\n deleteRemovedTables(newSchema, idbtrans);\n }\n });\n });\n\n // Now, create a queue execution engine\n function runQueue() {\n return queue.length ? Promise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) : Promise.resolve();\n }\n\n return runQueue().then(function () {\n createMissingTables(globalSchema, idbtrans); // At last, make sure to create any missing tables. (Needed by addons that add stores to DB without specifying version)\n });\n }\n\n function getSchemaDiff(oldSchema, newSchema) {\n var diff = {\n del: [], // Array of table names\n add: [], // Array of [tableName, newDefinition]\n change: [] // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}\n };\n for (var table in oldSchema) {\n if (!newSchema[table]) diff.del.push(table);\n }\n for (table in newSchema) {\n var oldDef = oldSchema[table],\n newDef = newSchema[table];\n if (!oldDef) {\n diff.add.push([table, newDef]);\n } else {\n var change = {\n name: table,\n def: newDef,\n recreate: false,\n del: [],\n add: [],\n change: []\n };\n if (oldDef.primKey.src !== newDef.primKey.src) {\n // Primary key has changed. Remove and re-add table.\n change.recreate = true;\n diff.change.push(change);\n } else {\n // Same primary key. Just find out what differs:\n var oldIndexes = oldDef.idxByName;\n var newIndexes = newDef.idxByName;\n for (var idxName in oldIndexes) {\n if (!newIndexes[idxName]) change.del.push(idxName);\n }\n for (idxName in newIndexes) {\n var oldIdx = oldIndexes[idxName],\n newIdx = newIndexes[idxName];\n if (!oldIdx) change.add.push(newIdx);else if (oldIdx.src !== newIdx.src) change.change.push(newIdx);\n }\n if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) {\n diff.change.push(change);\n }\n }\n }\n }\n return diff;\n }\n\n function createTable(idbtrans, tableName, primKey, indexes) {\n /// \n var store = idbtrans.db.createObjectStore(tableName, primKey.keyPath ? { keyPath: primKey.keyPath, autoIncrement: primKey.auto } : { autoIncrement: primKey.auto });\n indexes.forEach(function (idx) {\n addIndex(store, idx);\n });\n return store;\n }\n\n function createMissingTables(newSchema, idbtrans) {\n keys(newSchema).forEach(function (tableName) {\n if (!idbtrans.db.objectStoreNames.contains(tableName)) {\n createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes);\n }\n });\n }\n\n function deleteRemovedTables(newSchema, idbtrans) {\n for (var i = 0; i < idbtrans.db.objectStoreNames.length; ++i) {\n var storeName = idbtrans.db.objectStoreNames[i];\n if (newSchema[storeName] == null) {\n idbtrans.db.deleteObjectStore(storeName);\n }\n }\n }\n\n function addIndex(store, idx) {\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi });\n }\n\n function dbUncaught(err) {\n return db.on.error.fire(err);\n }\n\n //\n //\n // Dexie Protected API\n //\n //\n\n this._allTables = allTables;\n\n this._tableFactory = function createTable(mode, tableSchema) {\n /// \n if (mode === READONLY) return new Table(tableSchema.name, tableSchema, Collection);else return new WriteableTable(tableSchema.name, tableSchema);\n };\n\n this._createTransaction = function (mode, storeNames, dbschema, parentTransaction) {\n return new Transaction(mode, storeNames, dbschema, parentTransaction);\n };\n\n /* Generate a temporary transaction when db operations are done outside a transactino scope.\r\n */\n function tempTransaction(mode, storeNames, fn) {\n // Last argument is "writeLocked". But this doesnt apply to oneshot direct db operations, so we ignore it.\n if (!openComplete && !PSD.letThrough) {\n if (!isBeingOpened) {\n if (!autoOpen) return rejection(new exceptions.DatabaseClosed(), dbUncaught);\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n return dbReadyPromise.then(function () {\n return tempTransaction(mode, storeNames, fn);\n });\n } else {\n var trans = db._createTransaction(mode, storeNames, globalSchema);\n return trans._promise(mode, function (resolve, reject) {\n newScope(function () {\n // OPTIMIZATION POSSIBLE? newScope() not needed because it\'s already done in _promise.\n PSD.trans = trans;\n fn(resolve, reject, trans);\n });\n }).then(function (result) {\n // Instead of resolving value directly, wait with resolving it until transaction has completed.\n // Otherwise the data would not be in the DB if requesting it in the then() operation.\n // Specifically, to ensure that the following expression will work:\n //\n // db.friends.put({name: "Arne"}).then(function () {\n // db.friends.where("name").equals("Arne").count(function(count) {\n // assert (count === 1);\n // });\n // });\n //\n return trans._completion.then(function () {\n return result;\n });\n }); /*.catch(err => { // Don\'t do this as of now. If would affect bulk- and modify methods in a way that could be more intuitive. But wait! Maybe change in next major.\r\n trans._reject(err);\r\n return rejection(err);\r\n });*/\n }\n }\n\n this._whenReady = function (fn) {\n return new Promise(fake || openComplete || PSD.letThrough ? fn : function (resolve, reject) {\n if (!isBeingOpened) {\n if (!autoOpen) {\n reject(new exceptions.DatabaseClosed());\n return;\n }\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n dbReadyPromise.then(function () {\n fn(resolve, reject);\n });\n }).uncaught(dbUncaught);\n };\n\n //\n //\n //\n //\n // Dexie API\n //\n //\n //\n\n this.verno = 0;\n\n this.open = function () {\n if (isBeingOpened || idbdb) return dbReadyPromise.then(function () {\n return dbOpenError ? rejection(dbOpenError, dbUncaught) : db;\n });\n debug && (openCanceller._stackHolder = getErrorWithStack()); // Let stacks point to when open() was called rather than where new Dexie() was called.\n isBeingOpened = true;\n dbOpenError = null;\n openComplete = false;\n\n // Function pointers to call when the core opening process completes.\n var resolveDbReady = dbReadyResolve,\n\n // upgradeTransaction to abort on failure.\n upgradeTransaction = null;\n\n return Promise.race([openCanceller, new Promise(function (resolve, reject) {\n doFakeAutoComplete(function () {\n return resolve();\n });\n\n // Make sure caller has specified at least one version\n if (versions.length > 0) autoSchema = false;\n\n // Multiply db.verno with 10 will be needed to workaround upgrading bug in IE:\n // IE fails when deleting objectStore after reading from it.\n // A future version of Dexie.js will stopover an intermediate version to workaround this.\n // At that point, we want to be backward compatible. Could have been multiplied with 2, but by using 10, it is easier to map the number to the real version number.\n\n // If no API, throw!\n if (!indexedDB) throw new exceptions.MissingAPI("indexedDB API not found. If using IE10+, make sure to run your code on a server URL " + "(not locally). If using old Safari versions, make sure to include indexedDB polyfill.");\n\n var req = autoSchema ? indexedDB.open(dbName) : indexedDB.open(dbName, Math.round(db.verno * 10));\n if (!req) throw new exceptions.MissingAPI("IndexedDB API not available"); // May happen in Safari private mode, see https://github.com/dfahlander/Dexie.js/issues/134\n req.onerror = wrap(eventRejectHandler(reject));\n req.onblocked = wrap(fireOnBlocked);\n req.onupgradeneeded = wrap(function (e) {\n upgradeTransaction = req.transaction;\n if (autoSchema && !db._allowEmptyDB) {\n // Unless an addon has specified db._allowEmptyDB, lets make the call fail.\n // Caller did not specify a version or schema. Doing that is only acceptable for opening alread existing databases.\n // If onupgradeneeded is called it means database did not exist. Reject the open() promise and make sure that we\n // do not create a new database by accident here.\n req.onerror = preventDefault; // Prohibit onabort error from firing before we\'re done!\n upgradeTransaction.abort(); // Abort transaction (would hope that this would make DB disappear but it doesnt.)\n // Close database and delete it.\n req.result.close();\n var delreq = indexedDB.deleteDatabase(dbName); // The upgrade transaction is atomic, and javascript is single threaded - meaning that there is no risk that we delete someone elses database here!\n delreq.onsuccess = delreq.onerror = wrap(function () {\n reject(new exceptions.NoSuchDatabase(\'Database \' + dbName + \' doesnt exist\'));\n });\n } else {\n upgradeTransaction.onerror = wrap(eventRejectHandler(reject));\n var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; // Safari 8 fix.\n runUpgraders(oldVer / 10, upgradeTransaction, reject, req);\n }\n }, reject);\n\n req.onsuccess = wrap(function () {\n // Core opening procedure complete. Now let\'s just record some stuff.\n upgradeTransaction = null;\n idbdb = req.result;\n connections.push(db); // Used for emulating versionchange event on IE/Edge/Safari.\n\n if (autoSchema) readGlobalSchema();else if (idbdb.objectStoreNames.length > 0) {\n try {\n adjustToExistingIndexNames(globalSchema, idbdb.transaction(safariMultiStoreFix(idbdb.objectStoreNames), READONLY));\n } catch (e) {\n // Safari may bail out if > 1 store names. However, this shouldnt be a showstopper. Issue #120.\n }\n }\n\n idbdb.onversionchange = wrap(function (ev) {\n db._vcFired = true; // detect implementations that not support versionchange (IE/Edge/Safari)\n db.on("versionchange").fire(ev);\n });\n\n if (!hasNativeGetDatabaseNames) {\n // Update localStorage with list of database names\n globalDatabaseList(function (databaseNames) {\n if (databaseNames.indexOf(dbName) === -1) return databaseNames.push(dbName);\n });\n }\n\n resolve();\n }, reject);\n })]).then(function () {\n // Before finally resolving the dbReadyPromise and this promise,\n // call and await all on(\'ready\') subscribers:\n // Dexie.vip() makes subscribers able to use the database while being opened.\n // This is a must since these subscribers take part of the opening procedure.\n return Dexie.vip(db.on.ready.fire);\n }).then(function () {\n // Resolve the db.open() with the db instance.\n isBeingOpened = false;\n return db;\n }).catch(function (err) {\n try {\n // Did we fail within onupgradeneeded? Make sure to abort the upgrade transaction so it doesnt commit.\n upgradeTransaction && upgradeTransaction.abort();\n } catch (e) {}\n isBeingOpened = false; // Set before calling db.close() so that it doesnt reject openCanceller again (leads to unhandled rejection event).\n db.close(); // Closes and resets idbdb, removes connections, resets dbReadyPromise and openCanceller so that a later db.open() is fresh.\n // A call to db.close() may have made on-ready subscribers fail. Use dbOpenError if set, since err could be a follow-up error on that.\n dbOpenError = err; // Record the error. It will be used to reject further promises of db operations.\n return rejection(dbOpenError, dbUncaught); // dbUncaught will make sure any error that happened in any operation before will now bubble to db.on.error() thanks to the special handling in Promise.uncaught().\n }).finally(function () {\n openComplete = true;\n resolveDbReady(); // dbReadyPromise is resolved no matter if open() rejects or resolved. It\'s just to wake up waiters.\n });\n };\n\n this.close = function () {\n var idx = connections.indexOf(db);\n if (idx >= 0) connections.splice(idx, 1);\n if (idbdb) {\n try {\n idbdb.close();\n } catch (e) {}\n idbdb = null;\n }\n autoOpen = false;\n dbOpenError = new exceptions.DatabaseClosed();\n if (isBeingOpened) cancelOpen(dbOpenError);\n // Reset dbReadyPromise promise:\n dbReadyPromise = new Promise(function (resolve) {\n dbReadyResolve = resolve;\n });\n openCanceller = new Promise(function (_, reject) {\n cancelOpen = reject;\n });\n };\n\n this.delete = function () {\n var hasArguments = arguments.length > 0;\n return new Promise(function (resolve, reject) {\n if (hasArguments) throw new exceptions.InvalidArgument("Arguments not allowed in db.delete()");\n if (isBeingOpened) {\n dbReadyPromise.then(doDelete);\n } else {\n doDelete();\n }\n function doDelete() {\n db.close();\n var req = indexedDB.deleteDatabase(dbName);\n req.onsuccess = wrap(function () {\n if (!hasNativeGetDatabaseNames) {\n globalDatabaseList(function (databaseNames) {\n var pos = databaseNames.indexOf(dbName);\n if (pos >= 0) return databaseNames.splice(pos, 1);\n });\n }\n resolve();\n });\n req.onerror = wrap(eventRejectHandler(reject));\n req.onblocked = fireOnBlocked;\n }\n }).uncaught(dbUncaught);\n };\n\n this.backendDB = function () {\n return idbdb;\n };\n\n this.isOpen = function () {\n return idbdb !== null;\n };\n this.hasFailed = function () {\n return dbOpenError !== null;\n };\n this.dynamicallyOpened = function () {\n return autoSchema;\n };\n\n //\n // Properties\n //\n this.name = dbName;\n\n // db.tables - an array of all Table instances.\n setProp(this, "tables", {\n get: function () {\n /// \n return keys(allTables).map(function (name) {\n return allTables[name];\n });\n }\n });\n\n //\n // Events\n //\n this.on = Events(this, "error", "populate", "blocked", "versionchange", { ready: [promisableChain, nop] });\n this.on.error.subscribe = deprecated("Dexie.on.error", this.on.error.subscribe);\n this.on.error.unsubscribe = deprecated("Dexie.on.error.unsubscribe", this.on.error.unsubscribe);\n\n this.on.ready.subscribe = override(this.on.ready.subscribe, function (subscribe) {\n return function (subscriber, bSticky) {\n Dexie.vip(function () {\n if (openComplete) {\n // Database already open. Call subscriber asap.\n if (!dbOpenError) Promise.resolve().then(subscriber);\n // bSticky: Also subscribe to future open sucesses (after close / reopen) \n if (bSticky) subscribe(subscriber);\n } else {\n // Database not yet open. Subscribe to it.\n subscribe(subscriber);\n // If bSticky is falsy, make sure to unsubscribe subscriber when fired once.\n if (!bSticky) subscribe(function unsubscribe() {\n db.on.ready.unsubscribe(subscriber);\n db.on.ready.unsubscribe(unsubscribe);\n });\n }\n });\n };\n });\n\n fakeAutoComplete(function () {\n db.on("populate").fire(db._createTransaction(READWRITE, dbStoreNames, globalSchema));\n db.on("error").fire(new Error());\n });\n\n this.transaction = function (mode, tableInstances, scopeFunc) {\n /// \n ///\n /// \n /// "r" for readonly, or "rw" for readwrite\n /// Table instance, Array of Table instances, String or String Array of object stores to include in the transaction\n /// Function to execute with transaction\n\n // Let table arguments be all arguments between mode and last argument.\n var i = arguments.length;\n if (i < 2) throw new exceptions.InvalidArgument("Too few arguments");\n // Prevent optimzation killer (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments)\n // and clone arguments except the first one into local var \'args\'.\n var args = new Array(i - 1);\n while (--i) {\n args[i - 1] = arguments[i];\n } // Let scopeFunc be the last argument and pop it so that args now only contain the table arguments.\n scopeFunc = args.pop();\n var tables = flatten(args); // Support using array as middle argument, or a mix of arrays and non-arrays.\n var parentTransaction = PSD.trans;\n // Check if parent transactions is bound to this db instance, and if caller wants to reuse it\n if (!parentTransaction || parentTransaction.db !== db || mode.indexOf(\'!\') !== -1) parentTransaction = null;\n var onlyIfCompatible = mode.indexOf(\'?\') !== -1;\n mode = mode.replace(\'!\', \'\').replace(\'?\', \'\'); // Ok. Will change arguments[0] as well but we wont touch arguments henceforth.\n\n try {\n //\n // Get storeNames from arguments. Either through given table instances, or through given table names.\n //\n var storeNames = tables.map(function (table) {\n var storeName = table instanceof Table ? table.name : table;\n if (typeof storeName !== \'string\') throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed");\n return storeName;\n });\n\n //\n // Resolve mode. Allow shortcuts "r" and "rw".\n //\n if (mode == "r" || mode == READONLY) mode = READONLY;else if (mode == "rw" || mode == READWRITE) mode = READWRITE;else throw new exceptions.InvalidArgument("Invalid transaction mode: " + mode);\n\n if (parentTransaction) {\n // Basic checks\n if (parentTransaction.mode === READONLY && mode === READWRITE) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null;\n } else throw new exceptions.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY");\n }\n if (parentTransaction) {\n storeNames.forEach(function (storeName) {\n if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null;\n } else throw new exceptions.SubTransaction("Table " + storeName + " not included in parent transaction.");\n }\n });\n }\n }\n } catch (e) {\n return parentTransaction ? parentTransaction._promise(null, function (_, reject) {\n reject(e);\n }) : rejection(e, dbUncaught);\n }\n // If this is a sub-transaction, lock the parent and then launch the sub-transaction.\n return parentTransaction ? parentTransaction._promise(mode, enterTransactionScope, "lock") : db._whenReady(enterTransactionScope);\n\n function enterTransactionScope(resolve) {\n var parentPSD = PSD;\n resolve(Promise.resolve().then(function () {\n return newScope(function () {\n // Keep a pointer to last non-transactional PSD to use if someone calls Dexie.ignoreTransaction().\n PSD.transless = PSD.transless || parentPSD;\n // Our transaction.\n //return new Promise((resolve, reject) => {\n var trans = db._createTransaction(mode, storeNames, globalSchema, parentTransaction);\n // Let the transaction instance be part of a Promise-specific data (PSD) value.\n PSD.trans = trans;\n\n if (parentTransaction) {\n // Emulate transaction commit awareness for inner transaction (must \'commit\' when the inner transaction has no more operations ongoing)\n trans.idbtrans = parentTransaction.idbtrans;\n } else {\n trans.create(); // Create the backend transaction so that complete() or error() will trigger even if no operation is made upon it.\n }\n\n // Provide arguments to the scope function (for backward compatibility)\n var tableArgs = storeNames.map(function (name) {\n return allTables[name];\n });\n tableArgs.push(trans);\n\n var returnValue;\n return Promise.follow(function () {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = scopeFunc.apply(trans, tableArgs); // NOTE: returnValue is used in trans.on.complete() not as a returnValue to this func.\n if (returnValue) {\n if (typeof returnValue.next === \'function\' && typeof returnValue.throw === \'function\') {\n // scopeFunc returned an iterator with throw-support. Handle yield as await.\n returnValue = awaitIterator(returnValue);\n } else if (typeof returnValue.then === \'function\' && !hasOwn(returnValue, \'_PSD\')) {\n throw new exceptions.IncompatiblePromise("Incompatible Promise returned from transaction scope (read more at http://tinyurl.com/znyqjqc). Transaction scope: " + scopeFunc.toString());\n }\n }\n }).uncaught(dbUncaught).then(function () {\n if (parentTransaction) trans._resolve(); // sub transactions don\'t react to idbtrans.oncomplete. We must trigger a acompletion.\n return trans._completion; // Even if WE believe everything is fine. Await IDBTransaction\'s oncomplete or onerror as well.\n }).then(function () {\n return returnValue;\n }).catch(function (e) {\n //reject(e);\n trans._reject(e); // Yes, above then-handler were maybe not called because of an unhandled rejection in scopeFunc!\n return rejection(e);\n });\n //});\n });\n }));\n }\n };\n\n this.table = function (tableName) {\n /// \n if (fake && autoSchema) return new WriteableTable(tableName);\n if (!hasOwn(allTables, tableName)) {\n throw new exceptions.InvalidTable(\'Table \' + tableName + \' does not exist\');\n }\n return allTables[tableName];\n };\n\n //\n //\n //\n // Table Class\n //\n //\n //\n function Table(name, tableSchema, collClass) {\n /// \n this.name = name;\n this.schema = tableSchema;\n this.hook = allTables[name] ? allTables[name].hook : Events(null, {\n "creating": [hookCreatingChain, nop],\n "reading": [pureFunctionChain, mirror],\n "updating": [hookUpdatingChain, nop],\n "deleting": [hookDeletingChain, nop]\n });\n this._collClass = collClass || Collection;\n }\n\n props(Table.prototype, {\n\n //\n // Table Protected Methods\n //\n\n _trans: function getTransaction(mode, fn, writeLocked) {\n var trans = PSD.trans;\n return trans && trans.db === db ? trans._promise(mode, fn, writeLocked) : tempTransaction(mode, [this.name], fn);\n },\n _idbstore: function getIDBObjectStore(mode, fn, writeLocked) {\n if (fake) return new Promise(fn); // Simplify the work for Intellisense/Code completion.\n var trans = PSD.trans,\n tableName = this.name;\n function supplyIdbStore(resolve, reject, trans) {\n fn(resolve, reject, trans.idbtrans.objectStore(tableName), trans);\n }\n return trans && trans.db === db ? trans._promise(mode, supplyIdbStore, writeLocked) : tempTransaction(mode, [this.name], supplyIdbStore);\n },\n\n //\n // Table Public Methods\n //\n get: function (key, cb) {\n var self = this;\n return this._idbstore(READONLY, function (resolve, reject, idbstore) {\n fake && resolve(self.schema.instanceTemplate);\n var req = idbstore.get(key);\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = wrap(function () {\n resolve(self.hook.reading.fire(req.result));\n }, reject);\n }).then(cb);\n },\n where: function (indexName) {\n return new WhereClause(this, indexName);\n },\n count: function (cb) {\n return this.toCollection().count(cb);\n },\n offset: function (offset) {\n return this.toCollection().offset(offset);\n },\n limit: function (numRows) {\n return this.toCollection().limit(numRows);\n },\n reverse: function () {\n return this.toCollection().reverse();\n },\n filter: function (filterFunction) {\n return this.toCollection().and(filterFunction);\n },\n each: function (fn) {\n return this.toCollection().each(fn);\n },\n toArray: function (cb) {\n return this.toCollection().toArray(cb);\n },\n orderBy: function (index) {\n return new this._collClass(new WhereClause(this, index));\n },\n\n toCollection: function () {\n return new this._collClass(new WhereClause(this));\n },\n\n mapToClass: function (constructor, structure) {\n /// \n /// Map table to a javascript constructor function. Objects returned from the database will be instances of this class, making\n /// it possible to the instanceOf operator as well as extending the class using constructor.prototype.method = function(){...}.\n /// \n /// Constructor function representing the class.\n /// Helps IDE code completion by knowing the members that objects contain and not just the indexes. Also\n /// know what type each member has. Example: {name: String, emailAddresses: [String], password}\n this.schema.mappedClass = constructor;\n var instanceTemplate = Object.create(constructor.prototype);\n if (structure) {\n // structure and instanceTemplate is for IDE code competion only while constructor.prototype is for actual inheritance.\n applyStructure(instanceTemplate, structure);\n }\n this.schema.instanceTemplate = instanceTemplate;\n\n // Now, subscribe to the when("reading") event to make all objects that come out from this table inherit from given class\n // no matter which method to use for reading (Table.get() or Table.where(...)... )\n var readHook = function (obj) {\n if (!obj) return obj; // No valid object. (Value is null). Return as is.\n // Create a new object that derives from constructor:\n var res = Object.create(constructor.prototype);\n // Clone members:\n for (var m in obj) {\n if (hasOwn(obj, m)) try {\n res[m] = obj[m];\n } catch (_) {}\n }return res;\n };\n\n if (this.schema.readHook) {\n this.hook.reading.unsubscribe(this.schema.readHook);\n }\n this.schema.readHook = readHook;\n this.hook("reading", readHook);\n return constructor;\n },\n defineClass: function (structure) {\n /// \n /// Define all members of the class that represents the table. This will help code completion of when objects are read from the database\n /// as well as making it possible to extend the prototype of the returned constructor function.\n /// \n /// Helps IDE code completion by knowing the members that objects contain and not just the indexes. Also\n /// know what type each member has. Example: {name: String, emailAddresses: [String], properties: {shoeSize: Number}}\n return this.mapToClass(Dexie.defineClass(structure), structure);\n }\n });\n\n //\n //\n //\n // WriteableTable Class (extends Table)\n //\n //\n //\n function WriteableTable(name, tableSchema, collClass) {\n Table.call(this, name, tableSchema, collClass || WriteableCollection);\n }\n\n function BulkErrorHandlerCatchAll(errorList, done, supportHooks) {\n return (supportHooks ? hookedEventRejectHandler : eventRejectHandler)(function (e) {\n errorList.push(e);\n done && done();\n });\n }\n\n function bulkDelete(idbstore, trans, keysOrTuples, hasDeleteHook, deletingHook) {\n // If hasDeleteHook, keysOrTuples must be an array of tuples: [[key1, value2],[key2,value2],...],\n // else keysOrTuples must be just an array of keys: [key1, key2, ...].\n return new Promise(function (resolve, reject) {\n var len = keysOrTuples.length,\n lastItem = len - 1;\n if (len === 0) return resolve();\n if (!hasDeleteHook) {\n for (var i = 0; i < len; ++i) {\n var req = idbstore.delete(keysOrTuples[i]);\n req.onerror = wrap(eventRejectHandler(reject));\n if (i === lastItem) req.onsuccess = wrap(function () {\n return resolve();\n });\n }\n } else {\n var hookCtx,\n errorHandler = hookedEventRejectHandler(reject),\n successHandler = hookedEventSuccessHandler(null);\n tryCatch(function () {\n for (var i = 0; i < len; ++i) {\n hookCtx = { onsuccess: null, onerror: null };\n var tuple = keysOrTuples[i];\n deletingHook.call(hookCtx, tuple[0], tuple[1], trans);\n var req = idbstore.delete(tuple[0]);\n req._hookCtx = hookCtx;\n req.onerror = errorHandler;\n if (i === lastItem) req.onsuccess = hookedEventSuccessHandler(resolve);else req.onsuccess = successHandler;\n }\n }, function (err) {\n hookCtx.onerror && hookCtx.onerror(err);\n throw err;\n });\n }\n }).uncaught(dbUncaught);\n }\n\n derive(WriteableTable).from(Table).extend({\n bulkDelete: function (keys$$1) {\n if (this.hook.deleting.fire === nop) {\n return this._idbstore(READWRITE, function (resolve, reject, idbstore, trans) {\n resolve(bulkDelete(idbstore, trans, keys$$1, false, nop));\n });\n } else {\n return this.where(\':id\').anyOf(keys$$1).delete().then(function () {}); // Resolve with undefined.\n }\n },\n bulkPut: function (objects, keys$$1) {\n var _this = this;\n\n return this._idbstore(READWRITE, function (resolve, reject, idbstore) {\n if (!idbstore.keyPath && !_this.schema.primKey.auto && !keys$$1) throw new exceptions.InvalidArgument("bulkPut() with non-inbound keys requires keys array in second argument");\n if (idbstore.keyPath && keys$$1) throw new exceptions.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys");\n if (keys$$1 && keys$$1.length !== objects.length) throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length");\n if (objects.length === 0) return resolve(); // Caller provided empty list.\n var done = function (result) {\n if (errorList.length === 0) resolve(result);else reject(new BulkError(_this.name + \'.bulkPut(): \' + errorList.length + \' of \' + numObjs + \' operations failed\', errorList));\n };\n var req,\n errorList = [],\n errorHandler,\n numObjs = objects.length,\n table = _this;\n if (_this.hook.creating.fire === nop && _this.hook.updating.fire === nop) {\n //\n // Standard Bulk (no \'creating\' or \'updating\' hooks to care about)\n //\n errorHandler = BulkErrorHandlerCatchAll(errorList);\n for (var i = 0, l = objects.length; i < l; ++i) {\n req = keys$$1 ? idbstore.put(objects[i], keys$$1[i]) : idbstore.put(objects[i]);\n req.onerror = errorHandler;\n }\n // Only need to catch success or error on the last operation\n // according to the IDB spec.\n req.onerror = BulkErrorHandlerCatchAll(errorList, done);\n req.onsuccess = eventSuccessHandler(done);\n } else {\n var effectiveKeys = keys$$1 || idbstore.keyPath && objects.map(function (o) {\n return getByKeyPath(o, idbstore.keyPath);\n });\n // Generate map of {[key]: object}\n var objectLookup = effectiveKeys && arrayToObject(effectiveKeys, function (key, i) {\n return key != null && [key, objects[i]];\n });\n var promise = !effectiveKeys ?\n\n // Auto-incremented key-less objects only without any keys argument.\n table.bulkAdd(objects) :\n\n // Keys provided. Either as inbound in provided objects, or as a keys argument.\n // Begin with updating those that exists in DB:\n table.where(\':id\').anyOf(effectiveKeys.filter(function (key) {\n return key != null;\n })).modify(function () {\n this.value = objectLookup[this.primKey];\n objectLookup[this.primKey] = null; // Mark as "don\'t add this"\n }).catch(ModifyError, function (e) {\n errorList = e.failures; // No need to concat here. These are the first errors added.\n }).then(function () {\n // Now, let\'s examine which items didnt exist so we can add them:\n var objsToAdd = [],\n keysToAdd = keys$$1 && [];\n // Iterate backwards. Why? Because if same key was used twice, just add the last one.\n for (var i = effectiveKeys.length - 1; i >= 0; --i) {\n var key = effectiveKeys[i];\n if (key == null || objectLookup[key]) {\n objsToAdd.push(objects[i]);\n keys$$1 && keysToAdd.push(key);\n if (key != null) objectLookup[key] = null; // Mark as "dont add again"\n }\n }\n // The items are in reverse order so reverse them before adding.\n // Could be important in order to get auto-incremented keys the way the caller\n // would expect. Could have used unshift instead of push()/reverse(),\n // but: http://jsperf.com/unshift-vs-reverse\n objsToAdd.reverse();\n keys$$1 && keysToAdd.reverse();\n return table.bulkAdd(objsToAdd, keysToAdd);\n }).then(function (lastAddedKey) {\n // Resolve with key of the last object in given arguments to bulkPut():\n var lastEffectiveKey = effectiveKeys[effectiveKeys.length - 1]; // Key was provided.\n return lastEffectiveKey != null ? lastEffectiveKey : lastAddedKey;\n });\n\n promise.then(done).catch(BulkError, function (e) {\n // Concat failure from ModifyError and reject using our \'done\' method.\n errorList = errorList.concat(e.failures);\n done();\n }).catch(reject);\n }\n }, "locked"); // If called from transaction scope, lock transaction til all steps are done.\n },\n bulkAdd: function (objects, keys$$1) {\n var self = this,\n creatingHook = this.hook.creating.fire;\n return this._idbstore(READWRITE, function (resolve, reject, idbstore, trans) {\n if (!idbstore.keyPath && !self.schema.primKey.auto && !keys$$1) throw new exceptions.InvalidArgument("bulkAdd() with non-inbound keys requires keys array in second argument");\n if (idbstore.keyPath && keys$$1) throw new exceptions.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys");\n if (keys$$1 && keys$$1.length !== objects.length) throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length");\n if (objects.length === 0) return resolve(); // Caller provided empty list.\n function done(result) {\n if (errorList.length === 0) resolve(result);else reject(new BulkError(self.name + \'.bulkAdd(): \' + errorList.length + \' of \' + numObjs + \' operations failed\', errorList));\n }\n var req,\n errorList = [],\n errorHandler,\n successHandler,\n numObjs = objects.length;\n if (creatingHook !== nop) {\n //\n // There are subscribers to hook(\'creating\')\n // Must behave as documented.\n //\n var keyPath = idbstore.keyPath,\n hookCtx;\n errorHandler = BulkErrorHandlerCatchAll(errorList, null, true);\n successHandler = hookedEventSuccessHandler(null);\n\n tryCatch(function () {\n for (var i = 0, l = objects.length; i < l; ++i) {\n hookCtx = { onerror: null, onsuccess: null };\n var key = keys$$1 && keys$$1[i];\n var obj = objects[i],\n effectiveKey = keys$$1 ? key : keyPath ? getByKeyPath(obj, keyPath) : undefined,\n keyToUse = creatingHook.call(hookCtx, effectiveKey, obj, trans);\n if (effectiveKey == null && keyToUse != null) {\n if (keyPath) {\n obj = deepClone(obj);\n setByKeyPath(obj, keyPath, keyToUse);\n } else {\n key = keyToUse;\n }\n }\n req = key != null ? idbstore.add(obj, key) : idbstore.add(obj);\n req._hookCtx = hookCtx;\n if (i < l - 1) {\n req.onerror = errorHandler;\n if (hookCtx.onsuccess) req.onsuccess = successHandler;\n }\n }\n }, function (err) {\n hookCtx.onerror && hookCtx.onerror(err);\n throw err;\n });\n\n req.onerror = BulkErrorHandlerCatchAll(errorList, done, true);\n req.onsuccess = hookedEventSuccessHandler(done);\n } else {\n //\n // Standard Bulk (no \'creating\' hook to care about)\n //\n errorHandler = BulkErrorHandlerCatchAll(errorList);\n for (var i = 0, l = objects.length; i < l; ++i) {\n req = keys$$1 ? idbstore.add(objects[i], keys$$1[i]) : idbstore.add(objects[i]);\n req.onerror = errorHandler;\n }\n // Only need to catch success or error on the last operation\n // according to the IDB spec.\n req.onerror = BulkErrorHandlerCatchAll(errorList, done);\n req.onsuccess = eventSuccessHandler(done);\n }\n });\n },\n add: function (obj, key) {\n /// \n /// Add an object to the database. In case an object with same primary key already exists, the object will not be added.\n /// \n /// A javascript object to insert\n /// Primary key\n var creatingHook = this.hook.creating.fire;\n return this._idbstore(READWRITE, function (resolve, reject, idbstore, trans) {\n var hookCtx = { onsuccess: null, onerror: null };\n if (creatingHook !== nop) {\n var effectiveKey = key != null ? key : idbstore.keyPath ? getByKeyPath(obj, idbstore.keyPath) : undefined;\n var keyToUse = creatingHook.call(hookCtx, effectiveKey, obj, trans); // Allow subscribers to when("creating") to generate the key.\n if (effectiveKey == null && keyToUse != null) {\n // Using "==" and "!=" to check for either null or undefined!\n if (idbstore.keyPath) setByKeyPath(obj, idbstore.keyPath, keyToUse);else key = keyToUse;\n }\n }\n try {\n var req = key != null ? idbstore.add(obj, key) : idbstore.add(obj);\n req._hookCtx = hookCtx;\n req.onerror = hookedEventRejectHandler(reject);\n req.onsuccess = hookedEventSuccessHandler(function (result) {\n // TODO: Remove these two lines in next major release (2.0?)\n // It\'s no good practice to have side effects on provided parameters\n var keyPath = idbstore.keyPath;\n if (keyPath) setByKeyPath(obj, keyPath, result);\n resolve(result);\n });\n } catch (e) {\n if (hookCtx.onerror) hookCtx.onerror(e);\n throw e;\n }\n });\n },\n\n put: function (obj, key) {\n /// \n /// Add an object to the database but in case an object with same primary key alread exists, the existing one will get updated.\n /// \n /// A javascript object to insert or update\n /// Primary key\n var self = this,\n creatingHook = this.hook.creating.fire,\n updatingHook = this.hook.updating.fire;\n if (creatingHook !== nop || updatingHook !== nop) {\n //\n // People listens to when("creating") or when("updating") events!\n // We must know whether the put operation results in an CREATE or UPDATE.\n //\n return this._trans(READWRITE, function (resolve, reject, trans) {\n // Since key is optional, make sure we get it from obj if not provided\n var effectiveKey = key !== undefined ? key : self.schema.primKey.keyPath && getByKeyPath(obj, self.schema.primKey.keyPath);\n if (effectiveKey == null) {\n // "== null" means checking for either null or undefined.\n // No primary key. Must use add().\n self.add(obj).then(resolve, reject);\n } else {\n // Primary key exist. Lock transaction and try modifying existing. If nothing modified, call add().\n trans._lock(); // Needed because operation is splitted into modify() and add().\n // clone obj before this async call. If caller modifies obj the line after put(), the IDB spec requires that it should not affect operation.\n obj = deepClone(obj);\n self.where(":id").equals(effectiveKey).modify(function () {\n // Replace extisting value with our object\n // CRUD event firing handled in WriteableCollection.modify()\n this.value = obj;\n }).then(function (count) {\n if (count === 0) {\n // Object\'s key was not found. Add the object instead.\n // CRUD event firing will be done in add()\n return self.add(obj, key); // Resolving with another Promise. Returned Promise will then resolve with the new key.\n } else {\n return effectiveKey; // Resolve with the provided key.\n }\n }).finally(function () {\n trans._unlock();\n }).then(resolve, reject);\n }\n });\n } else {\n // Use the standard IDB put() method.\n return this._idbstore(READWRITE, function (resolve, reject, idbstore) {\n var req = key !== undefined ? idbstore.put(obj, key) : idbstore.put(obj);\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = function (ev) {\n var keyPath = idbstore.keyPath;\n if (keyPath) setByKeyPath(obj, keyPath, ev.target.result);\n resolve(req.result);\n };\n });\n }\n },\n\n \'delete\': function (key) {\n /// Primary key of the object to delete\n if (this.hook.deleting.subscribers.length) {\n // People listens to when("deleting") event. Must implement delete using WriteableCollection.delete() that will\n // call the CRUD event. Only WriteableCollection.delete() will know whether an object was actually deleted.\n return this.where(":id").equals(key).delete();\n } else {\n // No one listens. Use standard IDB delete() method.\n return this._idbstore(READWRITE, function (resolve, reject, idbstore) {\n var req = idbstore.delete(key);\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = function () {\n resolve(req.result);\n };\n });\n }\n },\n\n clear: function () {\n if (this.hook.deleting.subscribers.length) {\n // People listens to when("deleting") event. Must implement delete using WriteableCollection.delete() that will\n // call the CRUD event. Only WriteableCollection.delete() will knows which objects that are actually deleted.\n return this.toCollection().delete();\n } else {\n return this._idbstore(READWRITE, function (resolve, reject, idbstore) {\n var req = idbstore.clear();\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = function () {\n resolve(req.result);\n };\n });\n }\n },\n\n update: function (keyOrObject, modifications) {\n if (typeof modifications !== \'object\' || isArray(modifications)) throw new exceptions.InvalidArgument("Modifications must be an object.");\n if (typeof keyOrObject === \'object\' && !isArray(keyOrObject)) {\n // object to modify. Also modify given object with the modifications:\n keys(modifications).forEach(function (keyPath) {\n setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);\n });\n var key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);\n if (key === undefined) return rejection(new exceptions.InvalidArgument("Given object does not contain its primary key"), dbUncaught);\n return this.where(":id").equals(key).modify(modifications);\n } else {\n // key to modify\n return this.where(":id").equals(keyOrObject).modify(modifications);\n }\n }\n });\n\n //\n //\n //\n // Transaction Class\n //\n //\n //\n function Transaction(mode, storeNames, dbschema, parent) {\n var _this2 = this;\n\n /// \n /// Transaction class. Represents a database transaction. All operations on db goes through a Transaction.\n /// \n /// Any of "readwrite" or "readonly"\n /// Array of table names to operate on\n this.db = db;\n this.mode = mode;\n this.storeNames = storeNames;\n this.idbtrans = null;\n this.on = Events(this, "complete", "error", "abort");\n this.parent = parent || null;\n this.active = true;\n this._tables = null;\n this._reculock = 0;\n this._blockedFuncs = [];\n this._psd = null;\n this._dbschema = dbschema;\n this._resolve = null;\n this._reject = null;\n this._completion = new Promise(function (resolve, reject) {\n _this2._resolve = resolve;\n _this2._reject = reject;\n }).uncaught(dbUncaught);\n\n this._completion.then(function () {\n _this2.on.complete.fire();\n }, function (e) {\n _this2.on.error.fire(e);\n _this2.parent ? _this2.parent._reject(e) : _this2.active && _this2.idbtrans && _this2.idbtrans.abort();\n _this2.active = false;\n return rejection(e); // Indicate we actually DO NOT catch this error.\n });\n }\n\n props(Transaction.prototype, {\n //\n // Transaction Protected Methods (not required by API users, but needed internally and eventually by dexie extensions)\n //\n _lock: function () {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n // Temporary set all requests into a pending queue if they are called before database is ready.\n ++this._reculock; // Recursive read/write lock pattern using PSD (Promise Specific Data) instead of TLS (Thread Local Storage)\n if (this._reculock === 1 && !PSD.global) PSD.lockOwnerFor = this;\n return this;\n },\n _unlock: function () {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n if (--this._reculock === 0) {\n if (!PSD.global) PSD.lockOwnerFor = null;\n while (this._blockedFuncs.length > 0 && !this._locked()) {\n var fnAndPSD = this._blockedFuncs.shift();\n try {\n usePSD(fnAndPSD[1], fnAndPSD[0]);\n } catch (e) {}\n }\n }\n return this;\n },\n _locked: function () {\n // Checks if any write-lock is applied on this transaction.\n // To simplify the Dexie API for extension implementations, we support recursive locks.\n // This is accomplished by using "Promise Specific Data" (PSD).\n // PSD data is bound to a Promise and any child Promise emitted through then() or resolve( new Promise() ).\n // PSD is local to code executing on top of the call stacks of any of any code executed by Promise():\n // * callback given to the Promise() constructor (function (resolve, reject){...})\n // * callbacks given to then()/catch()/finally() methods (function (value){...})\n // If creating a new independant Promise instance from within a Promise call stack, the new Promise will derive the PSD from the call stack of the parent Promise.\n // Derivation is done so that the inner PSD __proto__ points to the outer PSD.\n // PSD.lockOwnerFor will point to current transaction object if the currently executing PSD scope owns the lock.\n return this._reculock && PSD.lockOwnerFor !== this;\n },\n create: function (idbtrans) {\n var _this3 = this;\n\n assert(!this.idbtrans);\n if (!idbtrans && !idbdb) {\n switch (dbOpenError && dbOpenError.name) {\n case "DatabaseClosedError":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.DatabaseClosed(dbOpenError);\n case "MissingAPIError":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError);\n default:\n // Make it clear that the user operation was not what caused the error - the error had occurred earlier on db.open()!\n throw new exceptions.OpenFailed(dbOpenError);\n }\n }\n if (!this.active) throw new exceptions.TransactionInactive();\n assert(this._completion._state === null);\n\n idbtrans = this.idbtrans = idbtrans || idbdb.transaction(safariMultiStoreFix(this.storeNames), this.mode);\n idbtrans.onerror = wrap(function (ev) {\n preventDefault(ev); // Prohibit default bubbling to window.error\n _this3._reject(idbtrans.error);\n });\n idbtrans.onabort = wrap(function (ev) {\n preventDefault(ev);\n _this3.active && _this3._reject(new exceptions.Abort());\n _this3.active = false;\n _this3.on("abort").fire(ev);\n });\n idbtrans.oncomplete = wrap(function () {\n _this3.active = false;\n _this3._resolve();\n });\n return this;\n },\n _promise: function (mode, fn, bWriteLock) {\n var self = this;\n var p = self._locked() ?\n // Read lock always. Transaction is write-locked. Wait for mutex.\n new Promise(function (resolve, reject) {\n self._blockedFuncs.push([function () {\n self._promise(mode, fn, bWriteLock).then(resolve, reject);\n }, PSD]);\n }) : newScope(function () {\n var p_ = self.active ? new Promise(function (resolve, reject) {\n if (mode === READWRITE && self.mode !== READWRITE) throw new exceptions.ReadOnly("Transaction is readonly");\n if (!self.idbtrans && mode) self.create();\n if (bWriteLock) self._lock(); // Write lock if write operation is requested\n fn(resolve, reject, self);\n }) : rejection(new exceptions.TransactionInactive());\n if (self.active && bWriteLock) p_.finally(function () {\n self._unlock();\n });\n return p_;\n });\n\n p._lib = true;\n return p.uncaught(dbUncaught);\n },\n\n //\n // Transaction Public Properties and Methods\n //\n abort: function () {\n this.active && this._reject(new exceptions.Abort());\n this.active = false;\n },\n\n tables: {\n get: deprecated("Transaction.tables", function () {\n return arrayToObject(this.storeNames, function (name) {\n return [name, allTables[name]];\n });\n }, "Use db.tables()")\n },\n\n complete: deprecated("Transaction.complete()", function (cb) {\n return this.on("complete", cb);\n }),\n\n error: deprecated("Transaction.error()", function (cb) {\n return this.on("error", cb);\n }),\n\n table: deprecated("Transaction.table()", function (name) {\n if (this.storeNames.indexOf(name) === -1) throw new exceptions.InvalidTable("Table " + name + " not in transaction");\n return allTables[name];\n })\n\n });\n\n //\n //\n //\n // WhereClause\n //\n //\n //\n function WhereClause(table, index, orCollection) {\n /// \n /// \n /// \n this._ctx = {\n table: table,\n index: index === ":id" ? null : index,\n collClass: table._collClass,\n or: orCollection\n };\n }\n\n props(WhereClause.prototype, function () {\n\n // WhereClause private methods\n\n function fail(collectionOrWhereClause, err, T) {\n var collection = collectionOrWhereClause instanceof WhereClause ? new collectionOrWhereClause._ctx.collClass(collectionOrWhereClause) : collectionOrWhereClause;\n\n collection._ctx.error = T ? new T(err) : new TypeError(err);\n return collection;\n }\n\n function emptyCollection(whereClause) {\n return new whereClause._ctx.collClass(whereClause, function () {\n return IDBKeyRange.only("");\n }).limit(0);\n }\n\n function upperFactory(dir) {\n return dir === "next" ? function (s) {\n return s.toUpperCase();\n } : function (s) {\n return s.toLowerCase();\n };\n }\n function lowerFactory(dir) {\n return dir === "next" ? function (s) {\n return s.toLowerCase();\n } : function (s) {\n return s.toUpperCase();\n };\n }\n function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) {\n var length = Math.min(key.length, lowerNeedle.length);\n var llp = -1;\n for (var i = 0; i < length; ++i) {\n var lwrKeyChar = lowerKey[i];\n if (lwrKeyChar !== lowerNeedle[i]) {\n if (cmp(key[i], upperNeedle[i]) < 0) return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1);\n if (cmp(key[i], lowerNeedle[i]) < 0) return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1);\n if (llp >= 0) return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1);\n return null;\n }\n if (cmp(key[i], lwrKeyChar) < 0) llp = i;\n }\n if (length < lowerNeedle.length && dir === "next") return key + upperNeedle.substr(key.length);\n if (length < key.length && dir === "prev") return key.substr(0, upperNeedle.length);\n return llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1);\n }\n\n function addIgnoreCaseAlgorithm(whereClause, match, needles, suffix) {\n /// \n var upper,\n lower,\n compare,\n upperNeedles,\n lowerNeedles,\n direction,\n nextKeySuffix,\n needlesLen = needles.length;\n if (!needles.every(function (s) {\n return typeof s === \'string\';\n })) {\n return fail(whereClause, STRING_EXPECTED);\n }\n function initDirection(dir) {\n upper = upperFactory(dir);\n lower = lowerFactory(dir);\n compare = dir === "next" ? simpleCompare : simpleCompareReverse;\n var needleBounds = needles.map(function (needle) {\n return { lower: lower(needle), upper: upper(needle) };\n }).sort(function (a, b) {\n return compare(a.lower, b.lower);\n });\n upperNeedles = needleBounds.map(function (nb) {\n return nb.upper;\n });\n lowerNeedles = needleBounds.map(function (nb) {\n return nb.lower;\n });\n direction = dir;\n nextKeySuffix = dir === "next" ? "" : suffix;\n }\n initDirection("next");\n\n var c = new whereClause._ctx.collClass(whereClause, function () {\n return IDBKeyRange.bound(upperNeedles[0], lowerNeedles[needlesLen - 1] + suffix);\n });\n\n c._ondirectionchange = function (direction) {\n // This event onlys occur before filter is called the first time.\n initDirection(direction);\n };\n\n var firstPossibleNeedle = 0;\n\n c._addAlgorithm(function (cursor, advance, resolve) {\n /// \n /// \n /// \n var key = cursor.key;\n if (typeof key !== \'string\') return false;\n var lowerKey = lower(key);\n if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) {\n return true;\n } else {\n var lowestPossibleCasing = null;\n for (var i = firstPossibleNeedle; i < needlesLen; ++i) {\n var casing = nextCasing(key, lowerKey, upperNeedles[i], lowerNeedles[i], compare, direction);\n if (casing === null && lowestPossibleCasing === null) firstPossibleNeedle = i + 1;else if (lowestPossibleCasing === null || compare(lowestPossibleCasing, casing) > 0) {\n lowestPossibleCasing = casing;\n }\n }\n if (lowestPossibleCasing !== null) {\n advance(function () {\n cursor.continue(lowestPossibleCasing + nextKeySuffix);\n });\n } else {\n advance(resolve);\n }\n return false;\n }\n });\n return c;\n }\n\n //\n // WhereClause public methods\n //\n return {\n between: function (lower, upper, includeLower, includeUpper) {\n /// \n /// Filter out records whose where-field lays between given lower and upper values. Applies to Strings, Numbers and Dates.\n /// \n /// \n /// \n /// Whether items that equals lower should be included. Default true.\n /// Whether items that equals upper should be included. Default false.\n /// \n includeLower = includeLower !== false; // Default to true\n includeUpper = includeUpper === true; // Default to false\n try {\n if (cmp(lower, upper) > 0 || cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)) return emptyCollection(this); // Workaround for idiotic W3C Specification that DataError must be thrown if lower > upper. The natural result would be to return an empty collection.\n return new this._ctx.collClass(this, function () {\n return IDBKeyRange.bound(lower, upper, !includeLower, !includeUpper);\n });\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n },\n equals: function (value) {\n return new this._ctx.collClass(this, function () {\n return IDBKeyRange.only(value);\n });\n },\n above: function (value) {\n return new this._ctx.collClass(this, function () {\n return IDBKeyRange.lowerBound(value, true);\n });\n },\n aboveOrEqual: function (value) {\n return new this._ctx.collClass(this, function () {\n return IDBKeyRange.lowerBound(value);\n });\n },\n below: function (value) {\n return new this._ctx.collClass(this, function () {\n return IDBKeyRange.upperBound(value, true);\n });\n },\n belowOrEqual: function (value) {\n return new this._ctx.collClass(this, function () {\n return IDBKeyRange.upperBound(value);\n });\n },\n startsWith: function (str) {\n /// \n if (typeof str !== \'string\') return fail(this, STRING_EXPECTED);\n return this.between(str, str + maxString, true, true);\n },\n startsWithIgnoreCase: function (str) {\n /// \n if (str === "") return this.startsWith(str);\n return addIgnoreCaseAlgorithm(this, function (x, a) {\n return x.indexOf(a[0]) === 0;\n }, [str], maxString);\n },\n equalsIgnoreCase: function (str) {\n /// \n return addIgnoreCaseAlgorithm(this, function (x, a) {\n return x === a[0];\n }, [str], "");\n },\n anyOfIgnoreCase: function () {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, function (x, a) {\n return a.indexOf(x) !== -1;\n }, set, "");\n },\n startsWithAnyOfIgnoreCase: function () {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, function (x, a) {\n return a.some(function (n) {\n return x.indexOf(n) === 0;\n });\n }, set, maxString);\n },\n anyOf: function () {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n var compare = ascending;\n try {\n set.sort(compare);\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n if (set.length === 0) return emptyCollection(this);\n var c = new this._ctx.collClass(this, function () {\n return IDBKeyRange.bound(set[0], set[set.length - 1]);\n });\n\n c._ondirectionchange = function (direction) {\n compare = direction === "next" ? ascending : descending;\n set.sort(compare);\n };\n var i = 0;\n c._addAlgorithm(function (cursor, advance, resolve) {\n var key = cursor.key;\n while (compare(key, set[i]) > 0) {\n // The cursor has passed beyond this key. Check next.\n ++i;\n if (i === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (compare(key, set[i]) === 0) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(function () {\n cursor.continue(set[i]);\n });\n return false;\n }\n });\n return c;\n },\n\n notEqual: function (value) {\n return this.inAnyRange([[-Infinity, value], [value, maxKey]], { includeLowers: false, includeUppers: false });\n },\n\n noneOf: function () {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return new this._ctx.collClass(this); // Return entire collection.\n try {\n set.sort(ascending);\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n // Transform ["a","b","c"] to a set of ranges for between/above/below: [[-Infinity,"a"], ["a","b"], ["b","c"], ["c",maxKey]]\n var ranges = set.reduce(function (res, val) {\n return res ? res.concat([[res[res.length - 1][1], val]]) : [[-Infinity, val]];\n }, null);\n ranges.push([set[set.length - 1], maxKey]);\n return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false });\n },\n\n /** Filter out values withing given set of ranges.\r\n * Example, give children and elders a rebate of 50%:\r\n *\r\n * db.friends.where(\'age\').inAnyRange([[0,18],[65,Infinity]]).modify({Rebate: 1/2});\r\n *\r\n * @param {(string|number|Date|Array)[][]} ranges\r\n * @param {{includeLowers: boolean, includeUppers: boolean}} options\r\n */\n inAnyRange: function (ranges, options) {\n var ctx = this._ctx;\n if (ranges.length === 0) return emptyCollection(this);\n if (!ranges.every(function (range) {\n return range[0] !== undefined && range[1] !== undefined && ascending(range[0], range[1]) <= 0;\n })) {\n return fail(this, "First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower", exceptions.InvalidArgument);\n }\n var includeLowers = !options || options.includeLowers !== false; // Default to true\n var includeUppers = options && options.includeUppers === true; // Default to false\n\n function addRange(ranges, newRange) {\n for (var i = 0, l = ranges.length; i < l; ++i) {\n var range = ranges[i];\n if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) {\n range[0] = min(range[0], newRange[0]);\n range[1] = max(range[1], newRange[1]);\n break;\n }\n }\n if (i === l) ranges.push(newRange);\n return ranges;\n }\n\n var sortDirection = ascending;\n function rangeSorter(a, b) {\n return sortDirection(a[0], b[0]);\n }\n\n // Join overlapping ranges\n var set;\n try {\n set = ranges.reduce(addRange, []);\n set.sort(rangeSorter);\n } catch (ex) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n\n var i = 0;\n var keyIsBeyondCurrentEntry = includeUppers ? function (key) {\n return ascending(key, set[i][1]) > 0;\n } : function (key) {\n return ascending(key, set[i][1]) >= 0;\n };\n\n var keyIsBeforeCurrentEntry = includeLowers ? function (key) {\n return descending(key, set[i][0]) > 0;\n } : function (key) {\n return descending(key, set[i][0]) >= 0;\n };\n\n function keyWithinCurrentRange(key) {\n return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key);\n }\n\n var checkKey = keyIsBeyondCurrentEntry;\n\n var c = new ctx.collClass(this, function () {\n return IDBKeyRange.bound(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers);\n });\n\n c._ondirectionchange = function (direction) {\n if (direction === "next") {\n checkKey = keyIsBeyondCurrentEntry;\n sortDirection = ascending;\n } else {\n checkKey = keyIsBeforeCurrentEntry;\n sortDirection = descending;\n }\n set.sort(rangeSorter);\n };\n\n c._addAlgorithm(function (cursor, advance, resolve) {\n var key = cursor.key;\n while (checkKey(key)) {\n // The cursor has passed beyond this key. Check next.\n ++i;\n if (i === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (keyWithinCurrentRange(key)) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else if (cmp(key, set[i][1]) === 0 || cmp(key, set[i][0]) === 0) {\n // includeUpper or includeLower is false so keyWithinCurrentRange() returns false even though we are at range border.\n // Continue to next key but don\'t include this one.\n return false;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(function () {\n if (sortDirection === ascending) cursor.continue(set[i][0]);else cursor.continue(set[i][1]);\n });\n return false;\n }\n });\n return c;\n },\n startsWithAnyOf: function () {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n\n if (!set.every(function (s) {\n return typeof s === \'string\';\n })) {\n return fail(this, "startsWithAnyOf() only works with strings");\n }\n if (set.length === 0) return emptyCollection(this);\n\n return this.inAnyRange(set.map(function (str) {\n return [str, str + maxString];\n }));\n }\n };\n });\n\n //\n //\n //\n // Collection Class\n //\n //\n //\n function Collection(whereClause, keyRangeGenerator) {\n /// \n ///\n /// \n /// Where clause instance\n /// \n var keyRange = null,\n error = null;\n if (keyRangeGenerator) try {\n keyRange = keyRangeGenerator();\n } catch (ex) {\n error = ex;\n }\n\n var whereCtx = whereClause._ctx,\n table = whereCtx.table;\n this._ctx = {\n table: table,\n index: whereCtx.index,\n isPrimKey: !whereCtx.index || table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name,\n range: keyRange,\n keysOnly: false,\n dir: "next",\n unique: "",\n algorithm: null,\n filter: null,\n replayFilter: null,\n justLimit: true, // True if a replayFilter is just a filter that performs a "limit" operation (or none at all)\n isMatch: null,\n offset: 0,\n limit: Infinity,\n error: error, // If set, any promise must be rejected with this error\n or: whereCtx.or,\n valueMapper: table.hook.reading.fire\n };\n }\n\n function isPlainKeyRange(ctx, ignoreLimitFilter) {\n return !(ctx.filter || ctx.algorithm || ctx.or) && (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter);\n }\n\n props(Collection.prototype, function () {\n\n //\n // Collection Private Functions\n //\n\n function addFilter(ctx, fn) {\n ctx.filter = combine(ctx.filter, fn);\n }\n\n function addReplayFilter(ctx, factory, isLimitFilter) {\n var curr = ctx.replayFilter;\n ctx.replayFilter = curr ? function () {\n return combine(curr(), factory());\n } : factory;\n ctx.justLimit = isLimitFilter && !curr;\n }\n\n function addMatchFilter(ctx, fn) {\n ctx.isMatch = combine(ctx.isMatch, fn);\n }\n\n /** @param ctx {\r\n * isPrimKey: boolean,\r\n * table: Table,\r\n * index: string\r\n * }\r\n * @param store IDBObjectStore\r\n **/\n function getIndexOrStore(ctx, store) {\n if (ctx.isPrimKey) return store;\n var indexSpec = ctx.table.schema.idxByName[ctx.index];\n if (!indexSpec) throw new exceptions.Schema("KeyPath " + ctx.index + " on object store " + store.name + " is not indexed");\n return store.index(indexSpec.name);\n }\n\n /** @param ctx {\r\n * isPrimKey: boolean,\r\n * table: Table,\r\n * index: string,\r\n * keysOnly: boolean,\r\n * range?: IDBKeyRange,\r\n * dir: "next" | "prev"\r\n * }\r\n */\n function openCursor(ctx, store) {\n var idxOrStore = getIndexOrStore(ctx, store);\n return ctx.keysOnly && \'openKeyCursor\' in idxOrStore ? idxOrStore.openKeyCursor(ctx.range || null, ctx.dir + ctx.unique) : idxOrStore.openCursor(ctx.range || null, ctx.dir + ctx.unique);\n }\n\n function iter(ctx, fn, resolve, reject, idbstore) {\n var filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter;\n if (!ctx.or) {\n iterate(openCursor(ctx, idbstore), combine(ctx.algorithm, filter), fn, resolve, reject, !ctx.keysOnly && ctx.valueMapper);\n } else (function () {\n var set = {};\n var resolved = 0;\n\n function resolveboth() {\n if (++resolved === 2) resolve(); // Seems like we just support or btwn max 2 expressions, but there are no limit because we do recursion.\n }\n\n function union(item, cursor, advance) {\n if (!filter || filter(cursor, advance, resolveboth, reject)) {\n var key = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\n if (!hasOwn(set, key)) {\n set[key] = true;\n fn(item, cursor, advance);\n }\n }\n }\n\n ctx.or._iterate(union, resolveboth, reject, idbstore);\n iterate(openCursor(ctx, idbstore), ctx.algorithm, union, resolveboth, reject, !ctx.keysOnly && ctx.valueMapper);\n })();\n }\n function getInstanceTemplate(ctx) {\n return ctx.table.schema.instanceTemplate;\n }\n\n return {\n\n //\n // Collection Protected Functions\n //\n\n _read: function (fn, cb) {\n var ctx = this._ctx;\n if (ctx.error) return ctx.table._trans(null, function rejector(resolve, reject) {\n reject(ctx.error);\n });else return ctx.table._idbstore(READONLY, fn).then(cb);\n },\n _write: function (fn) {\n var ctx = this._ctx;\n if (ctx.error) return ctx.table._trans(null, function rejector(resolve, reject) {\n reject(ctx.error);\n });else return ctx.table._idbstore(READWRITE, fn, "locked"); // When doing write operations on collections, always lock the operation so that upcoming operations gets queued.\n },\n _addAlgorithm: function (fn) {\n var ctx = this._ctx;\n ctx.algorithm = combine(ctx.algorithm, fn);\n },\n\n _iterate: function (fn, resolve, reject, idbstore) {\n return iter(this._ctx, fn, resolve, reject, idbstore);\n },\n\n clone: function (props$$1) {\n var rv = Object.create(this.constructor.prototype),\n ctx = Object.create(this._ctx);\n if (props$$1) extend(ctx, props$$1);\n rv._ctx = ctx;\n return rv;\n },\n\n raw: function () {\n this._ctx.valueMapper = null;\n return this;\n },\n\n //\n // Collection Public methods\n //\n\n each: function (fn) {\n var ctx = this._ctx;\n\n if (fake) {\n var item = getInstanceTemplate(ctx),\n primKeyPath = ctx.table.schema.primKey.keyPath,\n key = getByKeyPath(item, ctx.index ? ctx.table.schema.idxByName[ctx.index].keyPath : primKeyPath),\n primaryKey = getByKeyPath(item, primKeyPath);\n fn(item, { key: key, primaryKey: primaryKey });\n }\n\n return this._read(function (resolve, reject, idbstore) {\n iter(ctx, fn, resolve, reject, idbstore);\n });\n },\n\n count: function (cb) {\n if (fake) return Promise.resolve(0).then(cb);\n var ctx = this._ctx;\n\n if (isPlainKeyRange(ctx, true)) {\n // This is a plain key range. We can use the count() method if the index.\n return this._read(function (resolve, reject, idbstore) {\n var idx = getIndexOrStore(ctx, idbstore);\n var req = ctx.range ? idx.count(ctx.range) : idx.count();\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = function (e) {\n resolve(Math.min(e.target.result, ctx.limit));\n };\n }, cb);\n } else {\n // Algorithms, filters or expressions are applied. Need to count manually.\n var count = 0;\n return this._read(function (resolve, reject, idbstore) {\n iter(ctx, function () {\n ++count;return false;\n }, function () {\n resolve(count);\n }, reject, idbstore);\n }, cb);\n }\n },\n\n sortBy: function (keyPath, cb) {\n /// \n var parts = keyPath.split(\'.\').reverse(),\n lastPart = parts[0],\n lastIndex = parts.length - 1;\n function getval(obj, i) {\n if (i) return getval(obj[parts[i]], i - 1);\n return obj[lastPart];\n }\n var order = this._ctx.dir === "next" ? 1 : -1;\n\n function sorter(a, b) {\n var aVal = getval(a, lastIndex),\n bVal = getval(b, lastIndex);\n return aVal < bVal ? -order : aVal > bVal ? order : 0;\n }\n return this.toArray(function (a) {\n return a.sort(sorter);\n }).then(cb);\n },\n\n toArray: function (cb) {\n var ctx = this._ctx;\n return this._read(function (resolve, reject, idbstore) {\n fake && resolve([getInstanceTemplate(ctx)]);\n if (hasGetAll && ctx.dir === \'next\' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAll() or\n // IDBKeyRange.getAll():\n var readingHook = ctx.table.hook.reading.fire;\n var idxOrStore = getIndexOrStore(ctx, idbstore);\n var req = ctx.limit < Infinity ? idxOrStore.getAll(ctx.range, ctx.limit) : idxOrStore.getAll(ctx.range);\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = readingHook === mirror ? eventSuccessHandler(resolve) : wrap(eventSuccessHandler(function (res) {\n try {\n resolve(res.map(readingHook));\n } catch (e) {\n reject(e);\n }\n }));\n } else {\n // Getting array through a cursor.\n var a = [];\n iter(ctx, function (item) {\n a.push(item);\n }, function arrayComplete() {\n resolve(a);\n }, reject, idbstore);\n }\n }, cb);\n },\n\n offset: function (offset) {\n var ctx = this._ctx;\n if (offset <= 0) return this;\n ctx.offset += offset; // For count()\n if (isPlainKeyRange(ctx)) {\n addReplayFilter(ctx, function () {\n var offsetLeft = offset;\n return function (cursor, advance) {\n if (offsetLeft === 0) return true;\n if (offsetLeft === 1) {\n --offsetLeft;return false;\n }\n advance(function () {\n cursor.advance(offsetLeft);\n offsetLeft = 0;\n });\n return false;\n };\n });\n } else {\n addReplayFilter(ctx, function () {\n var offsetLeft = offset;\n return function () {\n return --offsetLeft < 0;\n };\n });\n }\n return this;\n },\n\n limit: function (numRows) {\n this._ctx.limit = Math.min(this._ctx.limit, numRows); // For count()\n addReplayFilter(this._ctx, function () {\n var rowsLeft = numRows;\n return function (cursor, advance, resolve) {\n if (--rowsLeft <= 0) advance(resolve); // Stop after this item has been included\n return rowsLeft >= 0; // If numRows is already below 0, return false because then 0 was passed to numRows initially. Otherwise we wouldnt come here.\n };\n }, true);\n return this;\n },\n\n until: function (filterFunction, bIncludeStopEntry) {\n var ctx = this._ctx;\n fake && filterFunction(getInstanceTemplate(ctx));\n addFilter(this._ctx, function (cursor, advance, resolve) {\n if (filterFunction(cursor.value)) {\n advance(resolve);\n return bIncludeStopEntry;\n } else {\n return true;\n }\n });\n return this;\n },\n\n first: function (cb) {\n return this.limit(1).toArray(function (a) {\n return a[0];\n }).then(cb);\n },\n\n last: function (cb) {\n return this.reverse().first(cb);\n },\n\n filter: function (filterFunction) {\n /// function(val){return true/false}\n fake && filterFunction(getInstanceTemplate(this._ctx));\n addFilter(this._ctx, function (cursor) {\n return filterFunction(cursor.value);\n });\n // match filters not used in Dexie.js but can be used by 3rd part libraries to test a\n // collection for a match without querying DB. Used by Dexie.Observable.\n addMatchFilter(this._ctx, filterFunction);\n return this;\n },\n\n and: function (filterFunction) {\n return this.filter(filterFunction);\n },\n\n or: function (indexName) {\n return new WhereClause(this._ctx.table, indexName, this);\n },\n\n reverse: function () {\n this._ctx.dir = this._ctx.dir === "prev" ? "next" : "prev";\n if (this._ondirectionchange) this._ondirectionchange(this._ctx.dir);\n return this;\n },\n\n desc: function () {\n return this.reverse();\n },\n\n eachKey: function (cb) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) {\n cb(cursor.key, cursor);\n });\n },\n\n eachUniqueKey: function (cb) {\n this._ctx.unique = "unique";\n return this.eachKey(cb);\n },\n\n eachPrimaryKey: function (cb) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) {\n cb(cursor.primaryKey, cursor);\n });\n },\n\n keys: function (cb) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.key);\n }).then(function () {\n return a;\n }).then(cb);\n },\n\n primaryKeys: function (cb) {\n var ctx = this._ctx;\n if (hasGetAll && ctx.dir === \'next\' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAllKeys() or\n // IDBKeyRange.getAllKeys():\n return this._read(function (resolve, reject, idbstore) {\n var idxOrStore = getIndexOrStore(ctx, idbstore);\n var req = ctx.limit < Infinity ? idxOrStore.getAllKeys(ctx.range, ctx.limit) : idxOrStore.getAllKeys(ctx.range);\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = eventSuccessHandler(resolve);\n }).then(cb);\n }\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.primaryKey);\n }).then(function () {\n return a;\n }).then(cb);\n },\n\n uniqueKeys: function (cb) {\n this._ctx.unique = "unique";\n return this.keys(cb);\n },\n\n firstKey: function (cb) {\n return this.limit(1).keys(function (a) {\n return a[0];\n }).then(cb);\n },\n\n lastKey: function (cb) {\n return this.reverse().firstKey(cb);\n },\n\n distinct: function () {\n var ctx = this._ctx,\n idx = ctx.index && ctx.table.schema.idxByName[ctx.index];\n if (!idx || !idx.multi) return this; // distinct() only makes differencies on multiEntry indexes.\n var set = {};\n addFilter(this._ctx, function (cursor) {\n var strKey = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\n var found = hasOwn(set, strKey);\n set[strKey] = true;\n return !found;\n });\n return this;\n }\n };\n });\n\n //\n //\n // WriteableCollection Class\n //\n //\n function WriteableCollection() {\n Collection.apply(this, arguments);\n }\n\n derive(WriteableCollection).from(Collection).extend({\n\n //\n // WriteableCollection Public Methods\n //\n\n modify: function (changes) {\n var self = this,\n ctx = this._ctx,\n hook = ctx.table.hook,\n updatingHook = hook.updating.fire,\n deletingHook = hook.deleting.fire;\n\n fake && typeof changes === \'function\' && changes.call({ value: ctx.table.schema.instanceTemplate }, ctx.table.schema.instanceTemplate);\n\n return this._write(function (resolve, reject, idbstore, trans) {\n var modifyer;\n if (typeof changes === \'function\') {\n // Changes is a function that may update, add or delete propterties or even require a deletion the object itself (delete this.item)\n if (updatingHook === nop && deletingHook === nop) {\n // Noone cares about what is being changed. Just let the modifier function be the given argument as is.\n modifyer = changes;\n } else {\n // People want to know exactly what is being modified or deleted.\n // Let modifyer be a proxy function that finds out what changes the caller is actually doing\n // and call the hooks accordingly!\n modifyer = function (item) {\n var origItem = deepClone(item); // Clone the item first so we can compare laters.\n if (changes.call(this, item, this) === false) return false; // Call the real modifyer function (If it returns false explicitely, it means it dont want to modify anyting on this object)\n if (!hasOwn(this, "value")) {\n // The real modifyer function requests a deletion of the object. Inform the deletingHook that a deletion is taking place.\n deletingHook.call(this, this.primKey, item, trans);\n } else {\n // No deletion. Check what was changed\n var objectDiff = getObjectDiff(origItem, this.value);\n var additionalChanges = updatingHook.call(this, objectDiff, this.primKey, origItem, trans);\n if (additionalChanges) {\n // Hook want to apply additional modifications. Make sure to fullfill the will of the hook.\n item = this.value;\n keys(additionalChanges).forEach(function (keyPath) {\n setByKeyPath(item, keyPath, additionalChanges[keyPath]); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\n });\n }\n }\n };\n }\n } else if (updatingHook === nop) {\n // changes is a set of {keyPath: value} and no one is listening to the updating hook.\n var keyPaths = keys(changes);\n var numKeys = keyPaths.length;\n modifyer = function (item) {\n var anythingModified = false;\n for (var i = 0; i < numKeys; ++i) {\n var keyPath = keyPaths[i],\n val = changes[keyPath];\n if (getByKeyPath(item, keyPath) !== val) {\n setByKeyPath(item, keyPath, val); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\n anythingModified = true;\n }\n }\n return anythingModified;\n };\n } else {\n // changes is a set of {keyPath: value} and people are listening to the updating hook so we need to call it and\n // allow it to add additional modifications to make.\n var origChanges = changes;\n changes = shallowClone(origChanges); // Let\'s work with a clone of the changes keyPath/value set so that we can restore it in case a hook extends it.\n modifyer = function (item) {\n var anythingModified = false;\n var additionalChanges = updatingHook.call(this, changes, this.primKey, deepClone(item), trans);\n if (additionalChanges) extend(changes, additionalChanges);\n keys(changes).forEach(function (keyPath) {\n var val = changes[keyPath];\n if (getByKeyPath(item, keyPath) !== val) {\n setByKeyPath(item, keyPath, val);\n anythingModified = true;\n }\n });\n if (additionalChanges) changes = shallowClone(origChanges); // Restore original changes for next iteration\n return anythingModified;\n };\n }\n\n var count = 0;\n var successCount = 0;\n var iterationComplete = false;\n var failures = [];\n var failKeys = [];\n var currentKey = null;\n\n function modifyItem(item, cursor) {\n currentKey = cursor.primaryKey;\n var thisContext = {\n primKey: cursor.primaryKey,\n value: item,\n onsuccess: null,\n onerror: null\n };\n\n function onerror(e) {\n failures.push(e);\n failKeys.push(thisContext.primKey);\n checkFinished();\n return true; // Catch these errors and let a final rejection decide whether or not to abort entire transaction\n }\n\n if (modifyer.call(thisContext, item, thisContext) !== false) {\n // If a callback explicitely returns false, do not perform the update!\n var bDelete = !hasOwn(thisContext, "value");\n ++count;\n tryCatch(function () {\n var req = bDelete ? cursor.delete() : cursor.update(thisContext.value);\n req._hookCtx = thisContext;\n req.onerror = hookedEventRejectHandler(onerror);\n req.onsuccess = hookedEventSuccessHandler(function () {\n ++successCount;\n checkFinished();\n });\n }, onerror);\n } else if (thisContext.onsuccess) {\n // Hook will expect either onerror or onsuccess to always be called!\n thisContext.onsuccess(thisContext.value);\n }\n }\n\n function doReject(e) {\n if (e) {\n failures.push(e);\n failKeys.push(currentKey);\n }\n return reject(new ModifyError("Error modifying one or more objects", failures, successCount, failKeys));\n }\n\n function checkFinished() {\n if (iterationComplete && successCount + failures.length === count) {\n if (failures.length > 0) doReject();else resolve(successCount);\n }\n }\n self.clone().raw()._iterate(modifyItem, function () {\n iterationComplete = true;\n checkFinished();\n }, doReject, idbstore);\n });\n },\n\n \'delete\': function () {\n var _this4 = this;\n\n var ctx = this._ctx,\n range = ctx.range,\n deletingHook = ctx.table.hook.deleting.fire,\n hasDeleteHook = deletingHook !== nop;\n if (!hasDeleteHook && isPlainKeyRange(ctx) && (ctx.isPrimKey && !hangsOnDeleteLargeKeyRange || !range)) // if no range, we\'ll use clear().\n {\n // May use IDBObjectStore.delete(IDBKeyRange) in this case (Issue #208)\n // For chromium, this is the way most optimized version.\n // For IE/Edge, this could hang the indexedDB engine and make operating system instable\n // (https://gist.github.com/dfahlander/5a39328f029de18222cf2125d56c38f7)\n return this._write(function (resolve, reject, idbstore) {\n // Our API contract is to return a count of deleted items, so we have to count() before delete().\n var onerror = eventRejectHandler(reject),\n countReq = range ? idbstore.count(range) : idbstore.count();\n countReq.onerror = onerror;\n countReq.onsuccess = function () {\n var count = countReq.result;\n tryCatch(function () {\n var delReq = range ? idbstore.delete(range) : idbstore.clear();\n delReq.onerror = onerror;\n delReq.onsuccess = function () {\n return resolve(count);\n };\n }, function (err) {\n return reject(err);\n });\n };\n });\n }\n\n // Default version to use when collection is not a vanilla IDBKeyRange on the primary key.\n // Divide into chunks to not starve RAM.\n // If has delete hook, we will have to collect not just keys but also objects, so it will use\n // more memory and need lower chunk size.\n var CHUNKSIZE = hasDeleteHook ? 2000 : 10000;\n\n return this._write(function (resolve, reject, idbstore, trans) {\n var totalCount = 0;\n // Clone collection and change its table and set a limit of CHUNKSIZE on the cloned Collection instance.\n var collection = _this4.clone({\n keysOnly: !ctx.isMatch && !hasDeleteHook }) // load just keys (unless filter() or and() or deleteHook has subscribers)\n .distinct() // In case multiEntry is used, never delete same key twice because resulting count\n // would become larger than actual delete count.\n .limit(CHUNKSIZE).raw(); // Don\'t filter through reading-hooks (like mapped classes etc)\n\n var keysOrTuples = [];\n\n // We\'re gonna do things on as many chunks that are needed.\n // Use recursion of nextChunk function:\n var nextChunk = function () {\n return collection.each(hasDeleteHook ? function (val, cursor) {\n // Somebody subscribes to hook(\'deleting\'). Collect all primary keys and their values,\n // so that the hook can be called with its values in bulkDelete().\n keysOrTuples.push([cursor.primaryKey, cursor.value]);\n } : function (val, cursor) {\n // No one subscribes to hook(\'deleting\'). Collect only primary keys:\n keysOrTuples.push(cursor.primaryKey);\n }).then(function () {\n // Chromium deletes faster when doing it in sort order.\n hasDeleteHook ? keysOrTuples.sort(function (a, b) {\n return ascending(a[0], b[0]);\n }) : keysOrTuples.sort(ascending);\n return bulkDelete(idbstore, trans, keysOrTuples, hasDeleteHook, deletingHook);\n }).then(function () {\n var count = keysOrTuples.length;\n totalCount += count;\n keysOrTuples = [];\n return count < CHUNKSIZE ? totalCount : nextChunk();\n });\n };\n\n resolve(nextChunk());\n });\n }\n });\n\n //\n //\n //\n // ------------------------- Help functions ---------------------------\n //\n //\n //\n\n function lowerVersionFirst(a, b) {\n return a._cfg.version - b._cfg.version;\n }\n\n function setApiOnPlace(objs, tableNames, mode, dbschema) {\n tableNames.forEach(function (tableName) {\n var tableInstance = db._tableFactory(mode, dbschema[tableName]);\n objs.forEach(function (obj) {\n tableName in obj || (obj[tableName] = tableInstance);\n });\n });\n }\n\n function removeTablesApi(objs) {\n objs.forEach(function (obj) {\n for (var key in obj) {\n if (obj[key] instanceof Table) delete obj[key];\n }\n });\n }\n\n function iterate(req, filter, fn, resolve, reject, valueMapper) {\n\n // Apply valueMapper (hook(\'reading\') or mappped class)\n var mappedFn = valueMapper ? function (x, c, a) {\n return fn(valueMapper(x), c, a);\n } : fn;\n // Wrap fn with PSD and microtick stuff from Promise.\n var wrappedFn = wrap(mappedFn, reject);\n\n if (!req.onerror) req.onerror = eventRejectHandler(reject);\n if (filter) {\n req.onsuccess = trycatcher(function filter_record() {\n var cursor = req.result;\n if (cursor) {\n var c = function () {\n cursor.continue();\n };\n if (filter(cursor, function (advancer) {\n c = advancer;\n }, resolve, reject)) wrappedFn(cursor.value, cursor, function (advancer) {\n c = advancer;\n });\n c();\n } else {\n resolve();\n }\n }, reject);\n } else {\n req.onsuccess = trycatcher(function filter_record() {\n var cursor = req.result;\n if (cursor) {\n var c = function () {\n cursor.continue();\n };\n wrappedFn(cursor.value, cursor, function (advancer) {\n c = advancer;\n });\n c();\n } else {\n resolve();\n }\n }, reject);\n }\n }\n\n function parseIndexSyntax(indexes) {\n /// \n /// \n var rv = [];\n indexes.split(\',\').forEach(function (index) {\n index = index.trim();\n var name = index.replace(/([&*]|\\+\\+)/g, ""); // Remove "&", "++" and "*"\n // Let keyPath of "[a+b]" be ["a","b"]:\n var keyPath = /^\\[/.test(name) ? name.match(/^\\[(.*)\\]$/)[1].split(\'+\') : name;\n\n rv.push(new IndexSpec(name, keyPath || null, /\\&/.test(index), /\\*/.test(index), /\\+\\+/.test(index), isArray(keyPath), /\\./.test(index)));\n });\n return rv;\n }\n\n function cmp(key1, key2) {\n return indexedDB.cmp(key1, key2);\n }\n\n function min(a, b) {\n return cmp(a, b) < 0 ? a : b;\n }\n\n function max(a, b) {\n return cmp(a, b) > 0 ? a : b;\n }\n\n function ascending(a, b) {\n return indexedDB.cmp(a, b);\n }\n\n function descending(a, b) {\n return indexedDB.cmp(b, a);\n }\n\n function simpleCompare(a, b) {\n return a < b ? -1 : a === b ? 0 : 1;\n }\n\n function simpleCompareReverse(a, b) {\n return a > b ? -1 : a === b ? 0 : 1;\n }\n\n function combine(filter1, filter2) {\n return filter1 ? filter2 ? function () {\n return filter1.apply(this, arguments) && filter2.apply(this, arguments);\n } : filter1 : filter2;\n }\n\n function readGlobalSchema() {\n db.verno = idbdb.version / 10;\n db._dbSchema = globalSchema = {};\n dbStoreNames = slice(idbdb.objectStoreNames, 0);\n if (dbStoreNames.length === 0) return; // Database contains no stores.\n var trans = idbdb.transaction(safariMultiStoreFix(dbStoreNames), \'readonly\');\n dbStoreNames.forEach(function (storeName) {\n var store = trans.objectStore(storeName),\n keyPath = store.keyPath,\n dotted = keyPath && typeof keyPath === \'string\' && keyPath.indexOf(\'.\') !== -1;\n var primKey = new IndexSpec(keyPath, keyPath || "", false, false, !!store.autoIncrement, keyPath && typeof keyPath !== \'string\', dotted);\n var indexes = [];\n for (var j = 0; j < store.indexNames.length; ++j) {\n var idbindex = store.index(store.indexNames[j]);\n keyPath = idbindex.keyPath;\n dotted = keyPath && typeof keyPath === \'string\' && keyPath.indexOf(\'.\') !== -1;\n var index = new IndexSpec(idbindex.name, keyPath, !!idbindex.unique, !!idbindex.multiEntry, false, keyPath && typeof keyPath !== \'string\', dotted);\n indexes.push(index);\n }\n globalSchema[storeName] = new TableSchema(storeName, primKey, indexes, {});\n });\n setApiOnPlace([allTables, Transaction.prototype], keys(globalSchema), READWRITE, globalSchema);\n }\n\n function adjustToExistingIndexNames(schema, idbtrans) {\n /// \n /// Issue #30 Problem with existing db - adjust to existing index names when migrating from non-dexie db\n /// \n /// Map between name and TableSchema\n /// \n var storeNames = idbtrans.db.objectStoreNames;\n for (var i = 0; i < storeNames.length; ++i) {\n var storeName = storeNames[i];\n var store = idbtrans.objectStore(storeName);\n hasGetAll = \'getAll\' in store;\n for (var j = 0; j < store.indexNames.length; ++j) {\n var indexName = store.indexNames[j];\n var keyPath = store.index(indexName).keyPath;\n var dexieName = typeof keyPath === \'string\' ? keyPath : "[" + slice(keyPath).join(\'+\') + "]";\n if (schema[storeName]) {\n var indexSpec = schema[storeName].idxByName[dexieName];\n if (indexSpec) indexSpec.name = indexName;\n }\n }\n }\n }\n\n function fireOnBlocked(ev) {\n db.on("blocked").fire(ev);\n // Workaround (not fully*) for missing "versionchange" event in IE,Edge and Safari:\n connections.filter(function (c) {\n return c.name === db.name && c !== db && !c._vcFired;\n }).map(function (c) {\n return c.on("versionchange").fire(ev);\n });\n }\n\n extend(this, {\n Collection: Collection,\n Table: Table,\n Transaction: Transaction,\n Version: Version,\n WhereClause: WhereClause,\n WriteableCollection: WriteableCollection,\n WriteableTable: WriteableTable\n });\n\n init();\n\n addons.forEach(function (fn) {\n fn(db);\n });\n}\n\nvar fakeAutoComplete = function () {}; // Will never be changed. We just fake for the IDE that we change it (see doFakeAutoComplete())\nvar fake = false; // Will never be changed. We just fake for the IDE that we change it (see doFakeAutoComplete())\n\nfunction parseType(type) {\n if (typeof type === \'function\') {\n return new type();\n } else if (isArray(type)) {\n return [parseType(type[0])];\n } else if (type && typeof type === \'object\') {\n var rv = {};\n applyStructure(rv, type);\n return rv;\n } else {\n return type;\n }\n}\n\nfunction applyStructure(obj, structure) {\n keys(structure).forEach(function (member) {\n var value = parseType(structure[member]);\n obj[member] = value;\n });\n return obj;\n}\n\nfunction eventSuccessHandler(done) {\n return function (ev) {\n done(ev.target.result);\n };\n}\n\nfunction hookedEventSuccessHandler(resolve) {\n // wrap() is needed when calling hooks because the rare scenario of:\n // * hook does a db operation that fails immediately (IDB throws exception)\n // For calling db operations on correct transaction, wrap makes sure to set PSD correctly.\n // wrap() will also execute in a virtual tick.\n // * If not wrapped in a virtual tick, direct exception will launch a new physical tick.\n // * If this was the last event in the bulk, the promise will resolve after a physical tick\n // and the transaction will have committed already.\n // If no hook, the virtual tick will be executed in the reject()/resolve of the final promise,\n // because it is always marked with _lib = true when created using Transaction._promise().\n return wrap(function (event) {\n var req = event.target,\n result = req.result,\n ctx = req._hookCtx,\n // Contains the hook error handler. Put here instead of closure to boost performance.\n hookSuccessHandler = ctx && ctx.onsuccess;\n hookSuccessHandler && hookSuccessHandler(result);\n resolve && resolve(result);\n }, resolve);\n}\n\nfunction eventRejectHandler(reject) {\n return function (event) {\n preventDefault(event);\n reject(event.target.error);\n return false;\n };\n}\n\nfunction hookedEventRejectHandler(reject) {\n return wrap(function (event) {\n // See comment on hookedEventSuccessHandler() why wrap() is needed only when supporting hooks.\n\n var req = event.target,\n err = req.error,\n ctx = req._hookCtx,\n // Contains the hook error handler. Put here instead of closure to boost performance.\n hookErrorHandler = ctx && ctx.onerror;\n hookErrorHandler && hookErrorHandler(err);\n preventDefault(event);\n reject(err);\n return false;\n });\n}\n\nfunction preventDefault(event) {\n if (event.stopPropagation) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.stopPropagation();\n if (event.preventDefault) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.preventDefault();\n}\n\nfunction globalDatabaseList(cb) {\n var val,\n localStorage = Dexie.dependencies.localStorage;\n if (!localStorage) return cb([]); // Envs without localStorage support\n try {\n val = JSON.parse(localStorage.getItem(\'Dexie.DatabaseNames\') || "[]");\n } catch (e) {\n val = [];\n }\n if (cb(val)) {\n localStorage.setItem(\'Dexie.DatabaseNames\', JSON.stringify(val));\n }\n}\n\nfunction awaitIterator(iterator) {\n var callNext = function (result) {\n return iterator.next(result);\n },\n doThrow = function (error) {\n return iterator.throw(error);\n },\n onSuccess = step(callNext),\n onError = step(doThrow);\n\n function step(getNext) {\n return function (val) {\n var next = getNext(val),\n value = next.value;\n\n return next.done ? value : !value || typeof value.then !== \'function\' ? isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) : value.then(onSuccess, onError);\n };\n }\n\n return step(callNext)();\n}\n\n//\n// IndexSpec struct\n//\nfunction IndexSpec(name, keyPath, unique, multi, auto, compound, dotted) {\n /// \n /// \n /// \n /// \n /// \n /// \n /// \n this.name = name;\n this.keyPath = keyPath;\n this.unique = unique;\n this.multi = multi;\n this.auto = auto;\n this.compound = compound;\n this.dotted = dotted;\n var keyPathSrc = typeof keyPath === \'string\' ? keyPath : keyPath && \'[\' + [].join.call(keyPath, \'+\') + \']\';\n this.src = (unique ? \'&\' : \'\') + (multi ? \'*\' : \'\') + (auto ? "++" : "") + keyPathSrc;\n}\n\n//\n// TableSchema struct\n//\nfunction TableSchema(name, primKey, indexes, instanceTemplate) {\n /// \n /// \n /// \n /// \n this.name = name;\n this.primKey = primKey || new IndexSpec();\n this.indexes = indexes || [new IndexSpec()];\n this.instanceTemplate = instanceTemplate;\n this.mappedClass = null;\n this.idxByName = arrayToObject(indexes, function (index) {\n return [index.name, index];\n });\n}\n\n// Used in when defining dependencies later...\n// (If IndexedDBShim is loaded, prefer it before standard indexedDB)\nvar idbshim = _global.idbModules && _global.idbModules.shimIndexedDB ? _global.idbModules : {};\n\nfunction safariMultiStoreFix(storeNames) {\n return storeNames.length === 1 ? storeNames[0] : storeNames;\n}\n\nfunction getNativeGetDatabaseNamesFn(indexedDB) {\n var fn = indexedDB && (indexedDB.getDatabaseNames || indexedDB.webkitGetDatabaseNames);\n return fn && fn.bind(indexedDB);\n}\n\n// Export Error classes\nprops(Dexie, fullNameExceptions); // Dexie.XXXError = class XXXError {...};\n\n//\n// Static methods and properties\n// \nprops(Dexie, {\n\n //\n // Static delete() method.\n //\n delete: function (databaseName) {\n var db = new Dexie(databaseName),\n promise = db.delete();\n promise.onblocked = function (fn) {\n db.on("blocked", fn);\n return this;\n };\n return promise;\n },\n\n //\n // Static exists() method.\n //\n exists: function (name) {\n return new Dexie(name).open().then(function (db) {\n db.close();\n return true;\n }).catch(Dexie.NoSuchDatabaseError, function () {\n return false;\n });\n },\n\n //\n // Static method for retrieving a list of all existing databases at current host.\n //\n getDatabaseNames: function (cb) {\n return new Promise(function (resolve, reject) {\n var getDatabaseNames = getNativeGetDatabaseNamesFn(indexedDB);\n if (getDatabaseNames) {\n // In case getDatabaseNames() becomes standard, let\'s prepare to support it:\n var req = getDatabaseNames();\n req.onsuccess = function (event) {\n resolve(slice(event.target.result, 0)); // Converst DOMStringList to Array\n };\n req.onerror = eventRejectHandler(reject);\n } else {\n globalDatabaseList(function (val) {\n resolve(val);\n return false;\n });\n }\n }).then(cb);\n },\n\n defineClass: function (structure) {\n /// \n /// Create a javascript constructor based on given template for which properties to expect in the class.\n /// Any property that is a constructor function will act as a type. So {name: String} will be equal to {name: new String()}.\n /// \n /// Helps IDE code completion by knowing the members that objects contain and not just the indexes. Also\n /// know what type each member has. Example: {name: String, emailAddresses: [String], properties: {shoeSize: Number}}\n\n // Default constructor able to copy given properties into this object.\n function Class(properties) {\n /// Properties to initialize object with.\n /// \n properties ? extend(this, properties) : fake && applyStructure(this, structure);\n }\n return Class;\n },\n\n applyStructure: applyStructure,\n\n ignoreTransaction: function (scopeFunc) {\n // In case caller is within a transaction but needs to create a separate transaction.\n // Example of usage:\n //\n // Let\'s say we have a logger function in our app. Other application-logic should be unaware of the\n // logger function and not need to include the \'logentries\' table in all transaction it performs.\n // The logging should always be done in a separate transaction and not be dependant on the current\n // running transaction context. Then you could use Dexie.ignoreTransaction() to run code that starts a new transaction.\n //\n // Dexie.ignoreTransaction(function() {\n // db.logentries.add(newLogEntry);\n // });\n //\n // Unless using Dexie.ignoreTransaction(), the above example would try to reuse the current transaction\n // in current Promise-scope.\n //\n // An alternative to Dexie.ignoreTransaction() would be setImmediate() or setTimeout(). The reason we still provide an\n // API for this because\n // 1) The intention of writing the statement could be unclear if using setImmediate() or setTimeout().\n // 2) setTimeout() would wait unnescessary until firing. This is however not the case with setImmediate().\n // 3) setImmediate() is not supported in the ES standard.\n // 4) You might want to keep other PSD state that was set in a parent PSD, such as PSD.letThrough.\n return PSD.trans ? usePSD(PSD.transless, scopeFunc) : // Use the closest parent that was non-transactional.\n scopeFunc(); // No need to change scope because there is no ongoing transaction.\n },\n\n vip: function (fn) {\n // To be used by subscribers to the on(\'ready\') event.\n // This will let caller through to access DB even when it is blocked while the db.ready() subscribers are firing.\n // This would have worked automatically if we were certain that the Provider was using Dexie.Promise for all asyncronic operations. The promise PSD\n // from the provider.connect() call would then be derived all the way to when provider would call localDatabase.applyChanges(). But since\n // the provider more likely is using non-promise async APIs or other thenable implementations, we cannot assume that.\n // Note that this method is only useful for on(\'ready\') subscribers that is returning a Promise from the event. If not using vip()\n // the database could deadlock since it wont open until the returned Promise is resolved, and any non-VIPed operation started by\n // the caller will not resolve until database is opened.\n return newScope(function () {\n PSD.letThrough = true; // Make sure we are let through if still blocking db due to onready is firing.\n return fn();\n });\n },\n\n async: function (generatorFn) {\n return function () {\n try {\n var rv = awaitIterator(generatorFn.apply(this, arguments));\n if (!rv || typeof rv.then !== \'function\') return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n };\n },\n\n spawn: function (generatorFn, args, thiz) {\n try {\n var rv = awaitIterator(generatorFn.apply(thiz, args || []));\n if (!rv || typeof rv.then !== \'function\') return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n },\n\n // Dexie.currentTransaction property\n currentTransaction: {\n get: function () {\n return PSD.trans || null;\n }\n },\n\n // Export our Promise implementation since it can be handy as a standalone Promise implementation\n Promise: Promise,\n\n // Dexie.debug proptery:\n // Dexie.debug = false\n // Dexie.debug = true\n // Dexie.debug = "dexie" - don\'t hide dexie\'s stack frames.\n debug: {\n get: function () {\n return debug;\n },\n set: function (value) {\n setDebug(value, value === \'dexie\' ? function () {\n return true;\n } : dexieStackFrameFilter);\n }\n },\n\n // Export our derive/extend/override methodology\n derive: derive,\n extend: extend,\n props: props,\n override: override,\n // Export our Events() function - can be handy as a toolkit\n Events: Events,\n events: { get: deprecated(function () {\n return Events;\n }) }, // Backward compatible lowercase version.\n // Utilities\n getByKeyPath: getByKeyPath,\n setByKeyPath: setByKeyPath,\n delByKeyPath: delByKeyPath,\n shallowClone: shallowClone,\n deepClone: deepClone,\n getObjectDiff: getObjectDiff,\n asap: asap,\n maxKey: maxKey,\n // Addon registry\n addons: [],\n // Global DB connection list\n connections: connections,\n\n MultiModifyError: exceptions.Modify, // Backward compatibility 0.9.8. Deprecate.\n errnames: errnames,\n\n // Export other static classes\n IndexSpec: IndexSpec,\n TableSchema: TableSchema,\n\n //\n // Dependencies\n //\n // These will automatically work in browsers with indexedDB support, or where an indexedDB polyfill has been included.\n //\n // In node.js, however, these properties must be set "manually" before instansiating a new Dexie().\n // For node.js, you need to require indexeddb-js or similar and then set these deps.\n //\n dependencies: {\n // Required:\n indexedDB: idbshim.shimIndexedDB || _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,\n IDBKeyRange: idbshim.IDBKeyRange || _global.IDBKeyRange || _global.webkitIDBKeyRange\n },\n\n // API Version Number: Type Number, make sure to always set a version number that can be comparable correctly. Example: 0.9, 0.91, 0.92, 1.0, 1.01, 1.1, 1.2, 1.21, etc.\n semVer: DEXIE_VERSION,\n version: DEXIE_VERSION.split(\'.\').map(function (n) {\n return parseInt(n);\n }).reduce(function (p, c, i) {\n return p + c / Math.pow(10, i * 2);\n }),\n fakeAutoComplete: fakeAutoComplete,\n\n // https://github.com/dfahlander/Dexie.js/issues/186\n // typescript compiler tsc in mode ts--\x3ees5 & commonJS, will expect require() to return\n // x.default. Workaround: Set Dexie.default = Dexie.\n default: Dexie\n});\n\ntryCatch(function () {\n // Optional dependencies\n // localStorage\n Dexie.dependencies.localStorage = (typeof chrome !== "undefined" && chrome !== null ? chrome.storage : void 0) != null ? null : _global.localStorage;\n});\n\n// Map DOMErrors and DOMExceptions to corresponding Dexie errors. May change in Dexie v2.0.\nPromise.rejectionMapper = mapError;\n\n// Fool IDE to improve autocomplete. Tested with Visual Studio 2013 and 2015.\ndoFakeAutoComplete(function () {\n Dexie.fakeAutoComplete = fakeAutoComplete = doFakeAutoComplete;\n Dexie.fake = fake = true;\n});\n\nreturn Dexie;\n\n})));\n//# sourceMappingURL=dexie.js.map\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(24), __webpack_require__(25).setImmediate))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL25vZGVfbW9kdWxlcy9kZXhpZS9kaXN0L2RleGllLmpzP2NkM2IiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gICAoZ2xvYmFsLkRleGllID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4vKlxyXG4qIERleGllLmpzIC0gYSBtaW5pbWFsaXN0aWMgd3JhcHBlciBmb3IgSW5kZXhlZERCXHJcbiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuKlxyXG4qIEJ5IERhdmlkIEZhaGxhbmRlciwgZGF2aWQuZmFobGFuZGVyQGdtYWlsLmNvbVxyXG4qXHJcbiogVmVyc2lvbiAxLjUuMSwgVHVlIE5vdiAwMSAyMDE2XHJcbiogd3d3LmRleGllLmNvbVxyXG4qIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQsIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9cclxuKi9cbnZhciBrZXlzID0gT2JqZWN0LmtleXM7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG52YXIgX2dsb2JhbCA9IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IGdsb2JhbDtcblxuZnVuY3Rpb24gZXh0ZW5kKG9iaiwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKHR5cGVvZiBleHRlbnNpb24gIT09ICdvYmplY3QnKSByZXR1cm4gb2JqO1xuICAgIGtleXMoZXh0ZW5zaW9uKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBleHRlbnNpb25ba2V5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xufVxuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG52YXIgX2hhc093biA9IHt9Lmhhc093blByb3BlcnR5O1xuZnVuY3Rpb24gaGFzT3duKG9iaiwgcHJvcCkge1xuICAgIHJldHVybiBfaGFzT3duLmNhbGwob2JqLCBwcm9wKTtcbn1cblxuZnVuY3Rpb24gcHJvcHMocHJvdG8sIGV4dGVuc2lvbikge1xuICAgIGlmICh0eXBlb2YgZXh0ZW5zaW9uID09PSAnZnVuY3Rpb24nKSBleHRlbnNpb24gPSBleHRlbnNpb24oZ2V0UHJvdG8ocHJvdG8pKTtcbiAgICBrZXlzKGV4dGVuc2lvbikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHNldFByb3AocHJvdG8sIGtleSwgZXh0ZW5zaW9uW2tleV0pO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzZXRQcm9wKG9iaiwgcHJvcCwgZnVuY3Rpb25PckdldFNldCwgb3B0aW9ucykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGV4dGVuZChmdW5jdGlvbk9yR2V0U2V0ICYmIGhhc093bihmdW5jdGlvbk9yR2V0U2V0LCBcImdldFwiKSAmJiB0eXBlb2YgZnVuY3Rpb25PckdldFNldC5nZXQgPT09ICdmdW5jdGlvbicgPyB7IGdldDogZnVuY3Rpb25PckdldFNldC5nZXQsIHNldDogZnVuY3Rpb25PckdldFNldC5zZXQsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IDogeyB2YWx1ZTogZnVuY3Rpb25PckdldFNldCwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSB9LCBvcHRpb25zKSk7XG59XG5cbmZ1bmN0aW9uIGRlcml2ZShDaGlsZCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGZyb206IGZ1bmN0aW9uIChQYXJlbnQpIHtcbiAgICAgICAgICAgIENoaWxkLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoUGFyZW50LnByb3RvdHlwZSk7XG4gICAgICAgICAgICBzZXRQcm9wKENoaWxkLnByb3RvdHlwZSwgXCJjb25zdHJ1Y3RvclwiLCBDaGlsZCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGV4dGVuZDogcHJvcHMuYmluZChudWxsLCBDaGlsZC5wcm90b3R5cGUpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfTtcbn1cblxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApIHtcbiAgICB2YXIgcGQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKSxcbiAgICAgICAgcHJvdG87XG4gICAgcmV0dXJuIHBkIHx8IChwcm90byA9IGdldFByb3RvKG9iaikpICYmIGdldFByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgcHJvcCk7XG59XG5cbnZhciBfc2xpY2UgPSBbXS5zbGljZTtcbmZ1bmN0aW9uIHNsaWNlKGFyZ3MsIHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gX3NsaWNlLmNhbGwoYXJncywgc3RhcnQsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIG92ZXJyaWRlKG9yaWdGdW5jLCBvdmVycmlkZWRGYWN0b3J5KSB7XG4gICAgcmV0dXJuIG92ZXJyaWRlZEZhY3Rvcnkob3JpZ0Z1bmMpO1xufVxuXG5mdW5jdGlvbiBkb0Zha2VBdXRvQ29tcGxldGUoZm4pIHtcbiAgICB2YXIgdG8gPSBzZXRUaW1lb3V0KGZuLCAxMDAwKTtcbiAgICBjbGVhclRpbWVvdXQodG8pO1xufVxuXG5mdW5jdGlvbiBhc3NlcnQoYikge1xuICAgIGlmICghYikgdGhyb3cgbmV3IEVycm9yKFwiQXNzZXJ0aW9uIEZhaWxlZFwiKTtcbn1cblxuZnVuY3Rpb24gYXNhcChmbikge1xuICAgIGlmIChfZ2xvYmFsLnNldEltbWVkaWF0ZSkgc2V0SW1tZWRpYXRlKGZuKTtlbHNlIHNldFRpbWVvdXQoZm4sIDApO1xufVxuXG5cblxuLyoqIEdlbmVyYXRlIGFuIG9iamVjdCAoaGFzaCBtYXApIGJhc2VkIG9uIGdpdmVuIGFycmF5LlxyXG4gKiBAcGFyYW0gZXh0cmFjdG9yIEZ1bmN0aW9uIHRha2luZyBhbiBhcnJheSBpdGVtIGFuZCBpdHMgaW5kZXggYW5kIHJldHVybmluZyBhbiBhcnJheSBvZiAyIGl0ZW1zIChba2V5LCB2YWx1ZV0pIHRvXHJcbiAqICAgICAgICBpbnN0ZXJ0IG9uIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZvciBlYWNoIGl0ZW0gaW4gdGhlIGFycmF5LiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBmYWxzeSB2YWx1ZSwgdGhlXHJcbiAqICAgICAgICBjdXJyZW50IGl0ZW0gd29udCBhZmZlY3QgdGhlIHJlc3VsdGluZyBvYmplY3QuXHJcbiAqL1xuZnVuY3Rpb24gYXJyYXlUb09iamVjdChhcnJheSwgZXh0cmFjdG9yKSB7XG4gICAgcmV0dXJuIGFycmF5LnJlZHVjZShmdW5jdGlvbiAocmVzdWx0LCBpdGVtLCBpKSB7XG4gICAgICAgIHZhciBuYW1lQW5kVmFsdWUgPSBleHRyYWN0b3IoaXRlbSwgaSk7XG4gICAgICAgIGlmIChuYW1lQW5kVmFsdWUpIHJlc3VsdFtuYW1lQW5kVmFsdWVbMF1dID0gbmFtZUFuZFZhbHVlWzFdO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gdHJ5Y2F0Y2hlcihmbiwgcmVqZWN0KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvbmVycm9yLCBhcmdzKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgb25lcnJvciAmJiBvbmVycm9yKGV4KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldEJ5S2V5UGF0aChvYmosIGtleVBhdGgpIHtcbiAgICAvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9JbmRleGVkREIvI3N0ZXBzLWZvci1leHRyYWN0aW5nLWEta2V5LWZyb20tYS12YWx1ZS11c2luZy1hLWtleS1wYXRoXG4gICAgaWYgKGhhc093bihvYmosIGtleVBhdGgpKSByZXR1cm4gb2JqW2tleVBhdGhdOyAvLyBUaGlzIGxpbmUgaXMgbW92ZWQgZnJvbSBsYXN0IHRvIGZpcnN0IGZvciBvcHRpbWl6YXRpb24gcHVycG9zZS5cbiAgICBpZiAoIWtleVBhdGgpIHJldHVybiBvYmo7XG4gICAgaWYgKHR5cGVvZiBrZXlQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgcnYgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBrZXlQYXRoLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IGdldEJ5S2V5UGF0aChvYmosIGtleVBhdGhbaV0pO1xuICAgICAgICAgICAgcnYucHVzaCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBydjtcbiAgICB9XG4gICAgdmFyIHBlcmlvZCA9IGtleVBhdGguaW5kZXhPZignLicpO1xuICAgIGlmIChwZXJpb2QgIT09IC0xKSB7XG4gICAgICAgIHZhciBpbm5lck9iaiA9IG9ialtrZXlQYXRoLnN1YnN0cigwLCBwZXJpb2QpXTtcbiAgICAgICAgcmV0dXJuIGlubmVyT2JqID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBnZXRCeUtleVBhdGgoaW5uZXJPYmosIGtleVBhdGguc3Vic3RyKHBlcmlvZCArIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gc2V0QnlLZXlQYXRoKG9iaiwga2V5UGF0aCwgdmFsdWUpIHtcbiAgICBpZiAoIW9iaiB8fCBrZXlQYXRoID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICBpZiAoJ2lzRnJvemVuJyBpbiBPYmplY3QgJiYgT2JqZWN0LmlzRnJvemVuKG9iaikpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGtleVBhdGggIT09ICdzdHJpbmcnICYmICdsZW5ndGgnIGluIGtleVBhdGgpIHtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgJiYgJ2xlbmd0aCcgaW4gdmFsdWUpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGtleVBhdGgubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBzZXRCeUtleVBhdGgob2JqLCBrZXlQYXRoW2ldLCB2YWx1ZVtpXSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcGVyaW9kID0ga2V5UGF0aC5pbmRleE9mKCcuJyk7XG4gICAgICAgIGlmIChwZXJpb2QgIT09IC0xKSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudEtleVBhdGggPSBrZXlQYXRoLnN1YnN0cigwLCBwZXJpb2QpO1xuICAgICAgICAgICAgdmFyIHJlbWFpbmluZ0tleVBhdGggPSBrZXlQYXRoLnN1YnN0cihwZXJpb2QgKyAxKTtcbiAgICAgICAgICAgIGlmIChyZW1haW5pbmdLZXlQYXRoID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGRlbGV0ZSBvYmpbY3VycmVudEtleVBhdGhdO2Vsc2Ugb2JqW2N1cnJlbnRLZXlQYXRoXSA9IHZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaW5uZXJPYmogPSBvYmpbY3VycmVudEtleVBhdGhdO1xuICAgICAgICAgICAgICAgIGlmICghaW5uZXJPYmopIGlubmVyT2JqID0gb2JqW2N1cnJlbnRLZXlQYXRoXSA9IHt9O1xuICAgICAgICAgICAgICAgIHNldEJ5S2V5UGF0aChpbm5lck9iaiwgcmVtYWluaW5nS2V5UGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGRlbGV0ZSBvYmpba2V5UGF0aF07ZWxzZSBvYmpba2V5UGF0aF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZGVsQnlLZXlQYXRoKG9iaiwga2V5UGF0aCkge1xuICAgIGlmICh0eXBlb2Yga2V5UGF0aCA9PT0gJ3N0cmluZycpIHNldEJ5S2V5UGF0aChvYmosIGtleVBhdGgsIHVuZGVmaW5lZCk7ZWxzZSBpZiAoJ2xlbmd0aCcgaW4ga2V5UGF0aCkgW10ubWFwLmNhbGwoa2V5UGF0aCwgZnVuY3Rpb24gKGtwKSB7XG4gICAgICAgIHNldEJ5S2V5UGF0aChvYmosIGtwLCB1bmRlZmluZWQpO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzaGFsbG93Q2xvbmUob2JqKSB7XG4gICAgdmFyIHJ2ID0ge307XG4gICAgZm9yICh2YXIgbSBpbiBvYmopIHtcbiAgICAgICAgaWYgKGhhc093bihvYmosIG0pKSBydlttXSA9IG9ialttXTtcbiAgICB9XG4gICAgcmV0dXJuIHJ2O1xufVxuXG5mdW5jdGlvbiBkZWVwQ2xvbmUoYW55KSB7XG4gICAgaWYgKCFhbnkgfHwgdHlwZW9mIGFueSAhPT0gJ29iamVjdCcpIHJldHVybiBhbnk7XG4gICAgdmFyIHJ2O1xuICAgIGlmIChpc0FycmF5KGFueSkpIHtcbiAgICAgICAgcnYgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhbnkubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBydi5wdXNoKGRlZXBDbG9uZShhbnlbaV0pKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYW55IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBydiA9IG5ldyBEYXRlKCk7XG4gICAgICAgIHJ2LnNldFRpbWUoYW55LmdldFRpbWUoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcnYgPSBhbnkuY29uc3RydWN0b3IgPyBPYmplY3QuY3JlYXRlKGFueS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpIDoge307XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gYW55KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duKGFueSwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBydltwcm9wXSA9IGRlZXBDbG9uZShhbnlbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBydjtcbn1cblxuZnVuY3Rpb24gZ2V0T2JqZWN0RGlmZihhLCBiLCBydiwgcHJmeCkge1xuICAgIC8vIENvbXBhcmVzIG9iamVjdHMgYSBhbmQgYiBhbmQgcHJvZHVjZXMgYSBkaWZmIG9iamVjdC5cbiAgICBydiA9IHJ2IHx8IHt9O1xuICAgIHByZnggPSBwcmZ4IHx8ICcnO1xuICAgIGtleXMoYSkuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICBpZiAoIWhhc093bihiLCBwcm9wKSkgcnZbcHJmeCArIHByb3BdID0gdW5kZWZpbmVkOyAvLyBQcm9wZXJ0eSByZW1vdmVkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBhcCA9IGFbcHJvcF0sXG4gICAgICAgICAgICAgICAgICAgIGJwID0gYltwcm9wXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFwID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgYnAgPT09ICdvYmplY3QnICYmIGFwICYmIGJwICYmIGFwLmNvbnN0cnVjdG9yID09PSBicC5jb25zdHJ1Y3RvcilcbiAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSB0eXBlIG9mIG9iamVjdCBidXQgaXRzIHByb3BlcnRpZXMgbWF5IGhhdmUgY2hhbmdlZFxuICAgICAgICAgICAgICAgICAgICBnZXRPYmplY3REaWZmKGFwLCBicCwgcnYsIHByZnggKyBwcm9wICsgXCIuXCIpO2Vsc2UgaWYgKGFwICE9PSBicCkgcnZbcHJmeCArIHByb3BdID0gYltwcm9wXTsgLy8gUHJpbWl0aXZlIHZhbHVlIGNoYW5nZWRcbiAgICAgICAgICAgIH1cbiAgICB9KTtcbiAgICBrZXlzKGIpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgaWYgKCFoYXNPd24oYSwgcHJvcCkpIHtcbiAgICAgICAgICAgIHJ2W3ByZnggKyBwcm9wXSA9IGJbcHJvcF07IC8vIFByb3BlcnR5IGFkZGVkXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcnY7XG59XG5cbi8vIElmIGZpcnN0IGFyZ3VtZW50IGlzIGl0ZXJhYmxlIG9yIGFycmF5LWxpa2UsIHJldHVybiBpdCBhcyBhbiBhcnJheVxudmFyIGl0ZXJhdG9yU3ltYm9sID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIGdldEl0ZXJhdG9yT2YgPSBpdGVyYXRvclN5bWJvbCA/IGZ1bmN0aW9uICh4KSB7XG4gICAgdmFyIGk7XG4gICAgcmV0dXJuIHggIT0gbnVsbCAmJiAoaSA9IHhbaXRlcmF0b3JTeW1ib2xdKSAmJiBpLmFwcGx5KHgpO1xufSA6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbnZhciBOT19DSEFSX0FSUkFZID0ge307XG4vLyBUYWtlcyBvbmUgb3Igc2V2ZXJhbCBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4gYXJyYXkgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJhczpcbi8vICogSWYgc2V2ZXJhbCBhcmd1bWVudHMgcHJvdmlkZWQsIHJldHVybiBhcmd1bWVudHMgY29udmVydGVkIHRvIGFuIGFycmF5IGluIGEgd2F5IHRoYXRcbi8vICAgc3RpbGwgYWxsb3dzIGphdmFzY3JpcHQgZW5naW5lIHRvIG9wdGltaXplIHRoZSBjb2RlLlxuLy8gKiBJZiBzaW5nbGUgYXJndW1lbnQgaXMgYW4gYXJyYXksIHJldHVybiBhIGNsb25lIG9mIGl0LlxuLy8gKiBJZiB0aGlzLXBvaW50ZXIgZXF1YWxzIE5PX0NIQVJfQVJSQVksIGRvbid0IGFjY2VwdCBzdHJpbmdzIGFzIHZhbGlkIGl0ZXJhYmxlcyBhcyBhIHNwZWNpYWxcbi8vICAgY2FzZSB0byB0aGUgdHdvIGJ1bGxldHMgYmVsb3cuXG4vLyAqIElmIHNpbmdsZSBhcmd1bWVudCBpcyBhbiBpdGVyYWJsZSwgY29udmVydCBpdCB0byBhbiBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgYXJyYXkuXG4vLyAqIElmIHNpbmdsZSBhcmd1bWVudCBpcyBhcnJheS1saWtlIChoYXMgbGVuZ3RoIG9mIHR5cGUgbnVtYmVyKSwgY29udmVydCBpdCB0byBhbiBhcnJheS5cbmZ1bmN0aW9uIGdldEFycmF5T2YoYXJyYXlMaWtlKSB7XG4gICAgdmFyIGksIGEsIHgsIGl0O1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGlmIChpc0FycmF5KGFycmF5TGlrZSkpIHJldHVybiBhcnJheUxpa2Uuc2xpY2UoKTtcbiAgICAgICAgaWYgKHRoaXMgPT09IE5PX0NIQVJfQVJSQVkgJiYgdHlwZW9mIGFycmF5TGlrZSA9PT0gJ3N0cmluZycpIHJldHVybiBbYXJyYXlMaWtlXTtcbiAgICAgICAgaWYgKGl0ID0gZ2V0SXRlcmF0b3JPZihhcnJheUxpa2UpKSB7XG4gICAgICAgICAgICBhID0gW107XG4gICAgICAgICAgICB3aGlsZSAoeCA9IGl0Lm5leHQoKSwgIXguZG9uZSkge1xuICAgICAgICAgICAgICAgIGEucHVzaCh4LnZhbHVlKTtcbiAgICAgICAgICAgIH1yZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJyYXlMaWtlID09IG51bGwpIHJldHVybiBbYXJyYXlMaWtlXTtcbiAgICAgICAgaSA9IGFycmF5TGlrZS5sZW5ndGg7XG4gICAgICAgIGlmICh0eXBlb2YgaSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGEgPSBuZXcgQXJyYXkoaSk7XG4gICAgICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGFycmF5TGlrZVtpXTtcbiAgICAgICAgICAgIH1yZXR1cm4gYTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2FycmF5TGlrZV07XG4gICAgfVxuICAgIGkgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGEgPSBuZXcgQXJyYXkoaSk7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBhW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1yZXR1cm4gYTtcbn1cblxudmFyIGNvbmNhdCA9IFtdLmNvbmNhdDtcbmZ1bmN0aW9uIGZsYXR0ZW4oYSkge1xuICAgIHJldHVybiBjb25jYXQuYXBwbHkoW10sIGEpO1xufVxuXG5mdW5jdGlvbiBub3AoKSB7fVxuZnVuY3Rpb24gbWlycm9yKHZhbCkge1xuICAgIHJldHVybiB2YWw7XG59XG5mdW5jdGlvbiBwdXJlRnVuY3Rpb25DaGFpbihmMSwgZjIpIHtcbiAgICAvLyBFbmFibGVzIGNoYWluZWQgZXZlbnRzIHRoYXQgdGFrZXMgT05FIGFyZ3VtZW50IGFuZCByZXR1cm5zIGl0IHRvIHRoZSBuZXh0IGZ1bmN0aW9uIGluIGNoYWluLlxuICAgIC8vIFRoaXMgcGF0dGVybiBpcyB1c2VkIGluIHRoZSBob29rKFwicmVhZGluZ1wiKSBldmVudC5cbiAgICBpZiAoZjEgPT0gbnVsbCB8fCBmMSA9PT0gbWlycm9yKSByZXR1cm4gZjI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgcmV0dXJuIGYyKGYxKHZhbCkpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNhbGxCb3RoKG9uMSwgb24yKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb24xLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIG9uMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhvb2tDcmVhdGluZ0NoYWluKGYxLCBmMikge1xuICAgIC8vIEVuYWJsZXMgY2hhaW5lZCBldmVudHMgdGhhdCB0YWtlcyBzZXZlcmFsIGFyZ3VtZW50cyBhbmQgbWF5IG1vZGlmeSBmaXJzdCBhcmd1bWVudCBieSBtYWtpbmcgYSBtb2RpZmljYXRpb24gYW5kIHRoZW4gcmV0dXJuaW5nIHRoZSBzYW1lIGluc3RhbmNlLlxuICAgIC8vIFRoaXMgcGF0dGVybiBpcyB1c2VkIGluIHRoZSBob29rKFwiY3JlYXRpbmdcIikgZXZlbnQuXG4gICAgaWYgKGYxID09PSBub3ApIHJldHVybiBmMjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzID0gZjEuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSBhcmd1bWVudHNbMF0gPSByZXM7XG4gICAgICAgIHZhciBvbnN1Y2Nlc3MgPSB0aGlzLm9uc3VjY2VzcyxcbiAgICAgICAgICAgIC8vIEluIGNhc2UgZXZlbnQgbGlzdGVuZXIgaGFzIHNldCB0aGlzLm9uc3VjY2Vzc1xuICAgICAgICBvbmVycm9yID0gdGhpcy5vbmVycm9yOyAvLyBJbiBjYXNlIGV2ZW50IGxpc3RlbmVyIGhhcyBzZXQgdGhpcy5vbmVycm9yXG4gICAgICAgIHRoaXMub25zdWNjZXNzID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgdmFyIHJlczIgPSBmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBpZiAob25zdWNjZXNzKSB0aGlzLm9uc3VjY2VzcyA9IHRoaXMub25zdWNjZXNzID8gY2FsbEJvdGgob25zdWNjZXNzLCB0aGlzLm9uc3VjY2VzcykgOiBvbnN1Y2Nlc3M7XG4gICAgICAgIGlmIChvbmVycm9yKSB0aGlzLm9uZXJyb3IgPSB0aGlzLm9uZXJyb3IgPyBjYWxsQm90aChvbmVycm9yLCB0aGlzLm9uZXJyb3IpIDogb25lcnJvcjtcbiAgICAgICAgcmV0dXJuIHJlczIgIT09IHVuZGVmaW5lZCA/IHJlczIgOiByZXM7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaG9va0RlbGV0aW5nQ2hhaW4oZjEsIGYyKSB7XG4gICAgaWYgKGYxID09PSBub3ApIHJldHVybiBmMjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBmMS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB2YXIgb25zdWNjZXNzID0gdGhpcy5vbnN1Y2Nlc3MsXG4gICAgICAgICAgICAvLyBJbiBjYXNlIGV2ZW50IGxpc3RlbmVyIGhhcyBzZXQgdGhpcy5vbnN1Y2Nlc3NcbiAgICAgICAgb25lcnJvciA9IHRoaXMub25lcnJvcjsgLy8gSW4gY2FzZSBldmVudCBsaXN0ZW5lciBoYXMgc2V0IHRoaXMub25lcnJvclxuICAgICAgICB0aGlzLm9uc3VjY2VzcyA9IHRoaXMub25lcnJvciA9IG51bGw7XG4gICAgICAgIGYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGlmIChvbnN1Y2Nlc3MpIHRoaXMub25zdWNjZXNzID0gdGhpcy5vbnN1Y2Nlc3MgPyBjYWxsQm90aChvbnN1Y2Nlc3MsIHRoaXMub25zdWNjZXNzKSA6IG9uc3VjY2VzcztcbiAgICAgICAgaWYgKG9uZXJyb3IpIHRoaXMub25lcnJvciA9IHRoaXMub25lcnJvciA/IGNhbGxCb3RoKG9uZXJyb3IsIHRoaXMub25lcnJvcikgOiBvbmVycm9yO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhvb2tVcGRhdGluZ0NoYWluKGYxLCBmMikge1xuICAgIGlmIChmMSA9PT0gbm9wKSByZXR1cm4gZjI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChtb2RpZmljYXRpb25zKSB7XG4gICAgICAgIHZhciByZXMgPSBmMS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBleHRlbmQobW9kaWZpY2F0aW9ucywgcmVzKTsgLy8gSWYgZjEgcmV0dXJucyBuZXcgbW9kaWZpY2F0aW9ucywgZXh0ZW5kIGNhbGxlcidzIG1vZGlmaWNhdGlvbnMgd2l0aCB0aGUgcmVzdWx0IGJlZm9yZSBjYWxsaW5nIG5leHQgaW4gY2hhaW4uXG4gICAgICAgIHZhciBvbnN1Y2Nlc3MgPSB0aGlzLm9uc3VjY2VzcyxcbiAgICAgICAgICAgIC8vIEluIGNhc2UgZXZlbnQgbGlzdGVuZXIgaGFzIHNldCB0aGlzLm9uc3VjY2Vzc1xuICAgICAgICBvbmVycm9yID0gdGhpcy5vbmVycm9yOyAvLyBJbiBjYXNlIGV2ZW50IGxpc3RlbmVyIGhhcyBzZXQgdGhpcy5vbmVycm9yXG4gICAgICAgIHRoaXMub25zdWNjZXNzID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbmVycm9yID0gbnVsbDtcbiAgICAgICAgdmFyIHJlczIgPSBmMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBpZiAob25zdWNjZXNzKSB0aGlzLm9uc3VjY2VzcyA9IHRoaXMub25zdWNjZXNzID8gY2FsbEJvdGgob25zdWNjZXNzLCB0aGlzLm9uc3VjY2VzcykgOiBvbnN1Y2Nlc3M7XG4gICAgICAgIGlmIChvbmVycm9yKSB0aGlzLm9uZXJyb3IgPSB0aGlzLm9uZXJyb3IgPyBjYWxsQm90aChvbmVycm9yLCB0aGlzLm9uZXJyb3IpIDogb25lcnJvcjtcbiAgICAgICAgcmV0dXJuIHJlcyA9PT0gdW5kZWZpbmVkID8gcmVzMiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVzMiA6IGV4dGVuZChyZXMsIHJlczIpO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIHJldmVyc2VTdG9wcGFibGVFdmVudENoYWluKGYxLCBmMikge1xuICAgIGlmIChmMSA9PT0gbm9wKSByZXR1cm4gZjI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGYyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBmMS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5cblxuXG5mdW5jdGlvbiBwcm9taXNhYmxlQ2hhaW4oZjEsIGYyKSB7XG4gICAgaWYgKGYxID09PSBub3ApIHJldHVybiBmMjtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmVzID0gZjEuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHJlcyAmJiB0eXBlb2YgcmVzLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHZhciB0aGl6ID0gdGhpcyxcbiAgICAgICAgICAgICAgICBpID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBhcmdzID0gbmV3IEFycmF5KGkpO1xuICAgICAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICB9cmV0dXJuIHJlcy50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZjIuYXBwbHkodGhpeiwgYXJncyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xufVxuXG4vLyBCeSBkZWZhdWx0LCBkZWJ1ZyB3aWxsIGJlIHRydWUgb25seSBpZiBwbGF0Zm9ybSBpcyBhIHdlYiBwbGF0Zm9ybSBhbmQgaXRzIHBhZ2UgaXMgc2VydmVkIGZyb20gbG9jYWxob3N0LlxuLy8gV2hlbiBkZWJ1ZyA9IHRydWUsIGVycm9yJ3Mgc3RhY2tzIHdpbGwgY29udGFpbiBhc3luY3JvbmljIGxvbmcgc3RhY2tzLlxudmFyIGRlYnVnID0gdHlwZW9mIGxvY2F0aW9uICE9PSAndW5kZWZpbmVkJyAmJlxuLy8gQnkgZGVmYXVsdCwgdXNlIGRlYnVnIG1vZGUgaWYgc2VydmVkIGZyb20gbG9jYWxob3N0LlxuL14oaHR0cHxodHRwcyk6XFwvXFwvKGxvY2FsaG9zdHwxMjdcXC4wXFwuMFxcLjEpLy50ZXN0KGxvY2F0aW9uLmhyZWYpO1xuXG5mdW5jdGlvbiBzZXREZWJ1Zyh2YWx1ZSwgZmlsdGVyKSB7XG4gICAgZGVidWcgPSB2YWx1ZTtcbiAgICBsaWJyYXJ5RmlsdGVyID0gZmlsdGVyO1xufVxuXG52YXIgbGlicmFyeUZpbHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbnZhciBORUVEU19USFJPV19GT1JfU1RBQ0sgPSAhbmV3IEVycm9yKFwiXCIpLnN0YWNrO1xuXG5mdW5jdGlvbiBnZXRFcnJvcldpdGhTdGFjaygpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmIChORUVEU19USFJPV19GT1JfU1RBQ0spIHRyeSB7XG4gICAgICAgIC8vIERvaW5nIHNvbWV0aGluZyBuYXVnaHR5IGluIHN0cmljdCBtb2RlIGhlcmUgdG8gdHJpZ2dlciBhIHNwZWNpZmljIGVycm9yXG4gICAgICAgIC8vIHRoYXQgY2FuIGJlIGV4cGxpY2l0ZWx5IGlnbm9yZWQgaW4gZGVidWdnZXIncyBleGNlcHRpb24gc2V0dGluZ3MuXG4gICAgICAgIC8vIElmIHdlJ2QganVzdCB0aHJvdyBuZXcgRXJyb3IoKSBoZXJlLCBJRSdzIGRlYnVnZ2VyJ3MgZXhjZXB0aW9uIHNldHRpbmdzXG4gICAgICAgIC8vIHdpbGwganVzdCBjb25zaWRlciBpdCBhcyBcImV4Y2VwdGlvbiB0aHJvd24gYnkgamF2YXNjcmlwdCBjb2RlXCIgd2hpY2ggaXNcbiAgICAgICAgLy8gc29tZXRoaW5nIHlvdSB3b3VsZG4ndCB3YW50IGl0IHRvIGlnbm9yZS5cbiAgICAgICAgZ2V0RXJyb3JXaXRoU3RhY2suYXJndW1lbnRzO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsgLy8gRmFsbGJhY2sgaWYgYWJvdmUgbGluZSBkb24ndCB0aHJvdy5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEVycm9yKCk7XG59XG5cbmZ1bmN0aW9uIHByZXR0eVN0YWNrKGV4Y2VwdGlvbiwgbnVtSWdub3JlZEZyYW1lcykge1xuICAgIHZhciBzdGFjayA9IGV4Y2VwdGlvbi5zdGFjaztcbiAgICBpZiAoIXN0YWNrKSByZXR1cm4gXCJcIjtcbiAgICBudW1JZ25vcmVkRnJhbWVzID0gbnVtSWdub3JlZEZyYW1lcyB8fCAwO1xuICAgIGlmIChzdGFjay5pbmRleE9mKGV4Y2VwdGlvbi5uYW1lKSA9PT0gMCkgbnVtSWdub3JlZEZyYW1lcyArPSAoZXhjZXB0aW9uLm5hbWUgKyBleGNlcHRpb24ubWVzc2FnZSkuc3BsaXQoJ1xcbicpLmxlbmd0aDtcbiAgICByZXR1cm4gc3RhY2suc3BsaXQoJ1xcbicpLnNsaWNlKG51bUlnbm9yZWRGcmFtZXMpLmZpbHRlcihsaWJyYXJ5RmlsdGVyKS5tYXAoZnVuY3Rpb24gKGZyYW1lKSB7XG4gICAgICAgIHJldHVybiBcIlxcblwiICsgZnJhbWU7XG4gICAgfSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZWQod2hhdCwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zb2xlLndhcm4od2hhdCArIFwiIGlzIGRlcHJlY2F0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZGZhaGxhbmRlci9EZXhpZS5qcy93aWtpL0RlcHJlY2F0aW9ucy4gXCIgKyBwcmV0dHlTdGFjayhnZXRFcnJvcldpdGhTdGFjaygpLCAxKSk7XG4gICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG59XG5cbnZhciBkZXhpZUVycm9yTmFtZXMgPSBbJ01vZGlmeScsICdCdWxrJywgJ09wZW5GYWlsZWQnLCAnVmVyc2lvbkNoYW5nZScsICdTY2hlbWEnLCAnVXBncmFkZScsICdJbnZhbGlkVGFibGUnLCAnTWlzc2luZ0FQSScsICdOb1N1Y2hEYXRhYmFzZScsICdJbnZhbGlkQXJndW1lbnQnLCAnU3ViVHJhbnNhY3Rpb24nLCAnVW5zdXBwb3J0ZWQnLCAnSW50ZXJuYWwnLCAnRGF0YWJhc2VDbG9zZWQnLCAnSW5jb21wYXRpYmxlUHJvbWlzZSddO1xuXG52YXIgaWRiRG9tRXJyb3JOYW1lcyA9IFsnVW5rbm93bicsICdDb25zdHJhaW50JywgJ0RhdGEnLCAnVHJhbnNhY3Rpb25JbmFjdGl2ZScsICdSZWFkT25seScsICdWZXJzaW9uJywgJ05vdEZvdW5kJywgJ0ludmFsaWRTdGF0ZScsICdJbnZhbGlkQWNjZXNzJywgJ0Fib3J0JywgJ1RpbWVvdXQnLCAnUXVvdGFFeGNlZWRlZCcsICdTeW50YXgnLCAnRGF0YUNsb25lJ107XG5cbnZhciBlcnJvckxpc3QgPSBkZXhpZUVycm9yTmFtZXMuY29uY2F0KGlkYkRvbUVycm9yTmFtZXMpO1xuXG52YXIgZGVmYXVsdFRleHRzID0ge1xuICAgIFZlcnNpb25DaGFuZ2VkOiBcIkRhdGFiYXNlIHZlcnNpb24gY2hhbmdlZCBieSBvdGhlciBkYXRhYmFzZSBjb25uZWN0aW9uXCIsXG4gICAgRGF0YWJhc2VDbG9zZWQ6IFwiRGF0YWJhc2UgaGFzIGJlZW4gY2xvc2VkXCIsXG4gICAgQWJvcnQ6IFwiVHJhbnNhY3Rpb24gYWJvcnRlZFwiLFxuICAgIFRyYW5zYWN0aW9uSW5hY3RpdmU6IFwiVHJhbnNhY3Rpb24gaGFzIGFscmVhZHkgY29tcGxldGVkIG9yIGZhaWxlZFwiXG59O1xuXG4vL1xuLy8gRGV4aWVFcnJvciAtIGJhc2UgY2xhc3Mgb2YgYWxsIG91dCBleGNlcHRpb25zLlxuLy9cbmZ1bmN0aW9uIERleGllRXJyb3IobmFtZSwgbXNnKSB7XG4gICAgLy8gUmVhc29uIHdlIGRvbid0IHVzZSBFUzYgY2xhc3NlcyBpcyBiZWNhdXNlOlxuICAgIC8vIDEuIEl0IGJsb2F0cyB0cmFuc3BpbGVkIGNvZGUgYW5kIGluY3JlYXNlcyBzaXplIG9mIG1pbmlmaWVkIGNvZGUuXG4gICAgLy8gMi4gSXQgZG9lc24ndCBnaXZlIHVzIG11Y2ggaW4gdGhpcyBjYXNlLlxuICAgIC8vIDMuIEl0IHdvdWxkIHJlcXVpcmUgc3ViIGNsYXNzZXMgdG8gY2FsbCBzdXBlcigpLCB3aGljaFxuICAgIC8vICAgIGlzIG5vdCBuZWVkZWQgd2hlbiBkZXJpdmluZyBmcm9tIEVycm9yLlxuICAgIHRoaXMuX2UgPSBnZXRFcnJvcldpdGhTdGFjaygpO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5tZXNzYWdlID0gbXNnO1xufVxuXG5kZXJpdmUoRGV4aWVFcnJvcikuZnJvbShFcnJvcikuZXh0ZW5kKHtcbiAgICBzdGFjazoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFjayB8fCAodGhpcy5fc3RhY2sgPSB0aGlzLm5hbWUgKyBcIjogXCIgKyB0aGlzLm1lc3NhZ2UgKyBwcmV0dHlTdGFjayh0aGlzLl9lLCAyKSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyBcIjogXCIgKyB0aGlzLm1lc3NhZ2U7XG4gICAgfVxufSk7XG5cbmZ1bmN0aW9uIGdldE11bHRpRXJyb3JNZXNzYWdlKG1zZywgZmFpbHVyZXMpIHtcbiAgICByZXR1cm4gbXNnICsgXCIuIEVycm9yczogXCIgKyBmYWlsdXJlcy5tYXAoZnVuY3Rpb24gKGYpIHtcbiAgICAgICAgcmV0dXJuIGYudG9TdHJpbmcoKTtcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKHYsIGksIHMpIHtcbiAgICAgICAgcmV0dXJuIHMuaW5kZXhPZih2KSA9PT0gaTtcbiAgICB9KSAvLyBPbmx5IHVuaXF1ZSBlcnJvciBzdHJpbmdzXG4gICAgLmpvaW4oJ1xcbicpO1xufVxuXG4vL1xuLy8gTW9kaWZ5RXJyb3IgLSB0aHJvd24gaW4gV3JpdGVhYmxlQ29sbGVjdGlvbi5tb2RpZnkoKVxuLy8gU3BlY2lmaWMgY29uc3RydWN0b3IgYmVjYXVzZSBpdCBjb250YWlucyBtZW1iZXJzIGZhaWx1cmVzIGFuZCBmYWlsZWRLZXlzLlxuLy9cbmZ1bmN0aW9uIE1vZGlmeUVycm9yKG1zZywgZmFpbHVyZXMsIHN1Y2Nlc3NDb3VudCwgZmFpbGVkS2V5cykge1xuICAgIHRoaXMuX2UgPSBnZXRFcnJvcldpdGhTdGFjaygpO1xuICAgIHRoaXMuZmFpbHVyZXMgPSBmYWlsdXJlcztcbiAgICB0aGlzLmZhaWxlZEtleXMgPSBmYWlsZWRLZXlzO1xuICAgIHRoaXMuc3VjY2Vzc0NvdW50ID0gc3VjY2Vzc0NvdW50O1xufVxuZGVyaXZlKE1vZGlmeUVycm9yKS5mcm9tKERleGllRXJyb3IpO1xuXG5mdW5jdGlvbiBCdWxrRXJyb3IobXNnLCBmYWlsdXJlcykge1xuICAgIHRoaXMuX2UgPSBnZXRFcnJvcldpdGhTdGFjaygpO1xuICAgIHRoaXMubmFtZSA9IFwiQnVsa0Vycm9yXCI7XG4gICAgdGhpcy5mYWlsdXJlcyA9IGZhaWx1cmVzO1xuICAgIHRoaXMubWVzc2FnZSA9IGdldE11bHRpRXJyb3JNZXNzYWdlKG1zZywgZmFpbHVyZXMpO1xufVxuZGVyaXZlKEJ1bGtFcnJvcikuZnJvbShEZXhpZUVycm9yKTtcblxuLy9cbi8vXG4vLyBEeW5hbWljYWxseSBnZW5lcmF0ZSBlcnJvciBuYW1lcyBhbmQgZXhjZXB0aW9uIGNsYXNzZXMgYmFzZWRcbi8vIG9uIHRoZSBuYW1lcyBpbiBlcnJvckxpc3QuXG4vL1xuLy9cblxuLy8gTWFwIG9mIHtFcnJvck5hbWUgLT4gRXJyb3JOYW1lICsgXCJFcnJvclwifVxudmFyIGVycm5hbWVzID0gZXJyb3JMaXN0LnJlZHVjZShmdW5jdGlvbiAob2JqLCBuYW1lKSB7XG4gICAgcmV0dXJuIG9ialtuYW1lXSA9IG5hbWUgKyBcIkVycm9yXCIsIG9iajtcbn0sIHt9KTtcblxuLy8gTmVlZCBhbiBhbGlhcyBmb3IgRGV4aWVFcnJvciBiZWNhdXNlIHdlJ3JlIGdvbm5hIGNyZWF0ZSBzdWJjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZS5cbnZhciBCYXNlRXhjZXB0aW9uID0gRGV4aWVFcnJvcjtcbi8vIE1hcCBvZiB7RXJyb3JOYW1lIC0+IGV4Y2VwdGlvbiBjb25zdHJ1Y3Rvcn1cbnZhciBleGNlcHRpb25zID0gZXJyb3JMaXN0LnJlZHVjZShmdW5jdGlvbiAob2JqLCBuYW1lKSB7XG4gICAgLy8gTGV0IHRoZSBuYW1lIGJlIFwiRGV4aWVFcnJvclwiIGJlY2F1c2UgdGhpcyBuYW1lIG1heVxuICAgIC8vIGJlIHNob3duIGluIGNhbGwgc3RhY2sgYW5kIHdoZW4gZGVidWdnaW5nLiBEZXhpZUVycm9yIGlzXG4gICAgLy8gdGhlIG1vc3QgdHJ1ZSBuYW1lIGJlY2F1c2UgaXQgZGVyaXZlcyBmcm9tIERleGllRXJyb3IsXG4gICAgLy8gYW5kIHdlIGNhbm5vdCBjaGFuZ2UgRnVuY3Rpb24ubmFtZSBwcm9ncmFtYXRpY2FsbHkgd2l0aG91dFxuICAgIC8vIGR5bmFtaWNhbGx5IGNyZWF0ZSBhIEZ1bmN0aW9uIG9iamVjdCwgd2hpY2ggd291bGQgYmUgY29uc2lkZXJlZFxuICAgIC8vICdldmFsLWV2aWwnLlxuICAgIHZhciBmdWxsTmFtZSA9IG5hbWUgKyBcIkVycm9yXCI7XG4gICAgZnVuY3Rpb24gRGV4aWVFcnJvcihtc2dPcklubmVyLCBpbm5lcikge1xuICAgICAgICB0aGlzLl9lID0gZ2V0RXJyb3JXaXRoU3RhY2soKTtcbiAgICAgICAgdGhpcy5uYW1lID0gZnVsbE5hbWU7XG4gICAgICAgIGlmICghbXNnT3JJbm5lcikge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gZGVmYXVsdFRleHRzW25hbWVdIHx8IGZ1bGxOYW1lO1xuICAgICAgICAgICAgdGhpcy5pbm5lciA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1zZ09ySW5uZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtc2dPcklubmVyO1xuICAgICAgICAgICAgdGhpcy5pbm5lciA9IGlubmVyIHx8IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG1zZ09ySW5uZXIgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtc2dPcklubmVyLm5hbWUgKyAnICcgKyBtc2dPcklubmVyLm1lc3NhZ2U7XG4gICAgICAgICAgICB0aGlzLmlubmVyID0gbXNnT3JJbm5lcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZXJpdmUoRGV4aWVFcnJvcikuZnJvbShCYXNlRXhjZXB0aW9uKTtcbiAgICBvYmpbbmFtZV0gPSBEZXhpZUVycm9yO1xuICAgIHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8vIFVzZSBFQ01BU0NSSVBUIHN0YW5kYXJkIGV4Y2VwdGlvbnMgd2hlcmUgYXBwbGljYWJsZTpcbmV4Y2VwdGlvbnMuU3ludGF4ID0gU3ludGF4RXJyb3I7XG5leGNlcHRpb25zLlR5cGUgPSBUeXBlRXJyb3I7XG5leGNlcHRpb25zLlJhbmdlID0gUmFuZ2VFcnJvcjtcblxudmFyIGV4Y2VwdGlvbk1hcCA9IGlkYkRvbUVycm9yTmFtZXMucmVkdWNlKGZ1bmN0aW9uIChvYmosIG5hbWUpIHtcbiAgICBvYmpbbmFtZSArIFwiRXJyb3JcIl0gPSBleGNlcHRpb25zW25hbWVdO1xuICAgIHJldHVybiBvYmo7XG59LCB7fSk7XG5cbmZ1bmN0aW9uIG1hcEVycm9yKGRvbUVycm9yLCBtZXNzYWdlKSB7XG4gICAgaWYgKCFkb21FcnJvciB8fCBkb21FcnJvciBpbnN0YW5jZW9mIERleGllRXJyb3IgfHwgZG9tRXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IgfHwgZG9tRXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvciB8fCAhZG9tRXJyb3IubmFtZSB8fCAhZXhjZXB0aW9uTWFwW2RvbUVycm9yLm5hbWVdKSByZXR1cm4gZG9tRXJyb3I7XG4gICAgdmFyIHJ2ID0gbmV3IGV4Y2VwdGlvbk1hcFtkb21FcnJvci5uYW1lXShtZXNzYWdlIHx8IGRvbUVycm9yLm1lc3NhZ2UsIGRvbUVycm9yKTtcbiAgICBpZiAoXCJzdGFja1wiIGluIGRvbUVycm9yKSB7XG4gICAgICAgIC8vIERlcml2ZSBzdGFjayBmcm9tIGlubmVyIGV4Y2VwdGlvbiBpZiBpdCBoYXMgYSBzdGFja1xuICAgICAgICBzZXRQcm9wKHJ2LCBcInN0YWNrXCIsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXIuc3RhY2s7XG4gICAgICAgICAgICB9IH0pO1xuICAgIH1cbiAgICByZXR1cm4gcnY7XG59XG5cbnZhciBmdWxsTmFtZUV4Y2VwdGlvbnMgPSBlcnJvckxpc3QucmVkdWNlKGZ1bmN0aW9uIChvYmosIG5hbWUpIHtcbiAgICBpZiAoW1wiU3ludGF4XCIsIFwiVHlwZVwiLCBcIlJhbmdlXCJdLmluZGV4T2YobmFtZSkgPT09IC0xKSBvYmpbbmFtZSArIFwiRXJyb3JcIl0gPSBleGNlcHRpb25zW25hbWVdO1xuICAgIHJldHVybiBvYmo7XG59LCB7fSk7XG5cbmZ1bGxOYW1lRXhjZXB0aW9ucy5Nb2RpZnlFcnJvciA9IE1vZGlmeUVycm9yO1xuZnVsbE5hbWVFeGNlcHRpb25zLkRleGllRXJyb3IgPSBEZXhpZUVycm9yO1xuZnVsbE5hbWVFeGNlcHRpb25zLkJ1bGtFcnJvciA9IEJ1bGtFcnJvcjtcblxuZnVuY3Rpb24gRXZlbnRzKGN0eCkge1xuICAgIHZhciBldnMgPSB7fTtcbiAgICB2YXIgcnYgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBzdWJzY3JpYmVyKSB7XG4gICAgICAgIGlmIChzdWJzY3JpYmVyKSB7XG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUuIElmIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYW4ganVzdCB0aGUgc3Vic2NyaWJlciB3YXMgcHJvdmlkZWQsIGZvcndhcmQgdGhlbSBhcyB3ZWxsLlxuICAgICAgICAgICAgdmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkoaSAtIDEpO1xuICAgICAgICAgICAgd2hpbGUgKC0taSkge1xuICAgICAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgfWV2c1tldmVudE5hbWVdLnN1YnNjcmliZS5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiBjdHg7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50TmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIFJldHVybiBpbnRlcmZhY2UgYWxsb3dpbmcgdG8gZmlyZSBvciB1bnN1YnNjcmliZSBmcm9tIGV2ZW50XG4gICAgICAgICAgICByZXR1cm4gZXZzW2V2ZW50TmFtZV07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJ2LmFkZEV2ZW50VHlwZSA9IGFkZDtcblxuICAgIGZvciAodmFyIGkgPSAxLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICBhZGQoYXJndW1lbnRzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcnY7XG5cbiAgICBmdW5jdGlvbiBhZGQoZXZlbnROYW1lLCBjaGFpbkZ1bmN0aW9uLCBkZWZhdWx0RnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBldmVudE5hbWUgPT09ICdvYmplY3QnKSByZXR1cm4gYWRkQ29uZmlndXJlZEV2ZW50cyhldmVudE5hbWUpO1xuICAgICAgICBpZiAoIWNoYWluRnVuY3Rpb24pIGNoYWluRnVuY3Rpb24gPSByZXZlcnNlU3RvcHBhYmxlRXZlbnRDaGFpbjtcbiAgICAgICAgaWYgKCFkZWZhdWx0RnVuY3Rpb24pIGRlZmF1bHRGdW5jdGlvbiA9IG5vcDtcblxuICAgICAgICB2YXIgY29udGV4dCA9IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXJzOiBbXSxcbiAgICAgICAgICAgIGZpcmU6IGRlZmF1bHRGdW5jdGlvbixcbiAgICAgICAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuc3Vic2NyaWJlcnMuaW5kZXhPZihjYikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3Vic2NyaWJlcnMucHVzaChjYik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZmlyZSA9IGNoYWluRnVuY3Rpb24oY29udGV4dC5maXJlLCBjYik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVuc3Vic2NyaWJlOiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LnN1YnNjcmliZXJzID0gY29udGV4dC5zdWJzY3JpYmVycy5maWx0ZXIoZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmbiAhPT0gY2I7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29udGV4dC5maXJlID0gY29udGV4dC5zdWJzY3JpYmVycy5yZWR1Y2UoY2hhaW5GdW5jdGlvbiwgZGVmYXVsdEZ1bmN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZXZzW2V2ZW50TmFtZV0gPSBydltldmVudE5hbWVdID0gY29udGV4dDtcbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkQ29uZmlndXJlZEV2ZW50cyhjZmcpIHtcbiAgICAgICAgLy8gZXZlbnRzKHRoaXMsIHtyZWFkaW5nOiBbZnVuY3Rpb25DaGFpbiwgbm9wXX0pO1xuICAgICAgICBrZXlzKGNmZykuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnROYW1lKSB7XG4gICAgICAgICAgICB2YXIgYXJncyA9IGNmZ1tldmVudE5hbWVdO1xuICAgICAgICAgICAgaWYgKGlzQXJyYXkoYXJncykpIHtcbiAgICAgICAgICAgICAgICBhZGQoZXZlbnROYW1lLCBjZmdbZXZlbnROYW1lXVswXSwgY2ZnW2V2ZW50TmFtZV1bMV0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzID09PSAnYXNhcCcpIHtcbiAgICAgICAgICAgICAgICAvLyBSYXRoZXIgdGhhbiBhcHByb2FjaGluZyBldmVudCBzdWJzY3JpcHRpb24gdXNpbmcgYSBmdW5jdGlvbmFsIGFwcHJvYWNoLCB3ZSBoZXJlIGRvIGl0IGluIGEgZm9yLWxvb3Agd2hlcmUgc3Vic2NyaWJlciBpcyBleGVjdXRlZCBpbiBpdHMgb3duIHN0YWNrXG4gICAgICAgICAgICAgICAgLy8gZW5hYmxpbmcgdGhhdCBhbnkgZXhjZXB0aW9uIHRoYXQgb2NjdXIgd29udCBkaXN0dXJiIHRoZSBpbml0aWF0b3IgYW5kIGFsc28gbm90IG5lc2Nlc3NhcnkgYmUgY2F0Y2hlZCBhbmQgZm9yZ290dGVuLlxuICAgICAgICAgICAgICAgIHZhciBjb250ZXh0ID0gYWRkKGV2ZW50TmFtZSwgbWlycm9yLCBmdW5jdGlvbiBmaXJlKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBPcHRpbWF6YXRpb24tc2FmZSBjbG9uaW5nIG9mIGFyZ3VtZW50cyBpbnRvIGFyZ3MuXG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkoaSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIH0gLy8gQWxsIGVhY2ggc3Vic2NyaWJlcjpcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zdWJzY3JpYmVycy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNhcChmdW5jdGlvbiBmaXJlRXZlbnQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuSW52YWxpZEFyZ3VtZW50KFwiSW52YWxpZCBldmVudCBjb25maWdcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy9cbi8vIFByb21pc2UgQ2xhc3MgZm9yIERleGllIGxpYnJhcnlcbi8vXG4vLyBJIHN0YXJ0ZWQgb3V0IHdyaXRpbmcgdGhpcyBQcm9taXNlIGNsYXNzIGJ5IGNvcHlpbmcgcHJvbWlzZS1saWdodCAoaHR0cHM6Ly9naXRodWIuY29tL3RheWxvcmhha2VzL3Byb21pc2UtbGlnaHQpIGJ5XG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGF5bG9yaGFrZXMgLSBhbiBBKyBhbmQgRUNNQVNDUklQVCA2IGNvbXBsaWFudCBQcm9taXNlIGltcGxlbWVudGF0aW9uLlxuLy9cbi8vIE1vZGlmaWNhdGlvbnMgbmVlZGVkIHRvIGJlIGRvbmUgdG8gc3VwcG9ydCBpbmRleGVkREIgYmVjYXVzZSBpdCB3b250IGFjY2VwdCBzZXRUaW1lb3V0KClcbi8vIChTZWUgZGlzY3Vzc2lvbjogaHR0cHM6Ly9naXRodWIuY29tL3Byb21pc2VzLWFwbHVzL3Byb21pc2VzLXNwZWMvaXNzdWVzLzQ1KSAuXG4vLyBUaGlzIHRvcGljIHdhcyBhbHNvIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nIHRocmVhZDogaHR0cHM6Ly9naXRodWIuY29tL3Byb21pc2VzLWFwbHVzL3Byb21pc2VzLXNwZWMvaXNzdWVzLzQ1XG4vL1xuLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIG5vdCB1c2Ugc2V0VGltZW91dCBvciBzZXRJbW1lZGlhdGUgd2hlbiBpdCdzIG5vdCBuZWVkZWQuIFRoZSBiZWhhdmlvciBpcyAxMDAlIFByb21pc2UvQSsgY29tcGxpYW50IHNpbmNlXG4vLyB0aGUgY2FsbGVyIG9mIG5ldyBQcm9taXNlKCkgY2FuIGJlIGNlcnRhaW4gdGhhdCB0aGUgcHJvbWlzZSB3b250IGJlIHRyaWdnZXJlZCB0aGUgbGluZXMgYWZ0ZXIgY29uc3RydWN0aW5nIHRoZSBwcm9taXNlLlxuLy9cbi8vIEluIHByZXZpb3VzIHZlcnNpb25zIHRoaXMgd2FzIGZpeGVkIGJ5IG5vdCBjYWxsaW5nIHNldFRpbWVvdXQgd2hlbiBrbm93aW5nIHRoYXQgdGhlIHJlc29sdmUoKSBvciByZWplY3QoKSBjYW1lIGZyb20gYW5vdGhlclxuLy8gdGljay4gSW4gRGV4aWUgdjEuNC4wLCBJJ3ZlIHJld3JpdHRlbiB0aGUgUHJvbWlzZSBjbGFzcyBlbnRpcmVseS4gSnVzdCBzb21lIGZyYWdtZW50cyBvZiBwcm9taXNlLWxpZ2h0IGlzIGxlZnQuIEkgdXNlXG4vLyBhbm90aGVyIHN0cmF0ZWd5IG5vdyB0aGF0IHNpbXBsaWZpZXMgZXZlcnl0aGluZyBhIGxvdDogdG8gYWx3YXlzIGV4ZWN1dGUgY2FsbGJhY2tzIGluIGEgbmV3IHRpY2ssIGJ1dCBoYXZlIGFuIG93biBtaWNyb1RpY2tcbi8vIGVuZ2luZSB0aGF0IGlzIHVzZWQgaW5zdGVhZCBvZiBzZXRJbW1lZGlhdGUoKSBvciBzZXRUaW1lb3V0KCkuXG4vLyBQcm9taXNlIGNsYXNzIGhhcyBhbHNvIGJlZW4gb3B0aW1pemVkIGEgbG90IHdpdGggaW5zcGlyYXRpb24gZnJvbSBibHVlYmlyZCAtIHRvIGF2b2lkIGNsb3N1cmVzIGFzIG11Y2ggYXMgcG9zc2libGUuXG4vLyBBbHNvIHdpdGggaW5zcGlyYXRpb24gZnJvbSBibHVlYmlyZCwgYXN5bmNyb25pYyBzdGFja3MgaW4gZGVidWcgbW9kZS5cbi8vXG4vLyBTcGVjaWZpYyBub24tc3RhbmRhcmQgZmVhdHVyZXMgb2YgdGhpcyBQcm9taXNlIGNsYXNzOlxuLy8gKiBBc3luYyBzdGF0aWMgY29udGV4dCBzdXBwb3J0IChQcm9taXNlLlBTRClcbi8vICogUHJvbWlzZS5mb2xsb3coKSBtZXRob2QgYnVpbHQgdXBvbiBQU0QsIHRoYXQgYWxsb3dzIHVzZXIgdG8gdHJhY2sgYWxsIHByb21pc2VzIGNyZWF0ZWQgZnJvbSBjdXJyZW50IHN0YWNrIGZyYW1lXG4vLyAgIGFuZCBiZWxvdyArIGFsbCBwcm9taXNlcyB0aGF0IHRob3NlIHByb21pc2VzIGNyZWF0ZXMgb3IgYXdhaXRzLlxuLy8gKiBEZXRlY3QgYW55IHVuaGFuZGxlZCBwcm9taXNlIGluIGEgUFNELXNjb3BlIChQU0Qub251bmhhbmRsZWQpLiBcbi8vXG4vLyBEYXZpZCBGYWhsYW5kZXIsIGh0dHBzOi8vZ2l0aHViLmNvbS9kZmFobGFuZGVyXG4vL1xuXG4vLyBKdXN0IGEgcG9pbnRlciB0aGF0IG9ubHkgdGhpcyBtb2R1bGUga25vd3MgYWJvdXQuXG4vLyBVc2VkIGluIFByb21pc2UgY29uc3RydWN0b3IgdG8gZW11bGF0ZSBhIHByaXZhdGUgY29uc3RydWN0b3IuXG52YXIgSU5URVJOQUwgPSB7fTtcblxuLy8gQXN5bmMgc3RhY2tzIChsb25nIHN0YWNrcykgbXVzdCBub3QgZ3JvdyBpbmZpbml0ZWx5LlxudmFyIExPTkdfU1RBQ0tTX0NMSVBfTElNSVQgPSAxMDA7XG52YXIgTUFYX0xPTkdfU1RBQ0tTID0gMjA7XG52YXIgc3RhY2tfYmVpbmdfZ2VuZXJhdGVkID0gZmFsc2U7XG5cbi8qIFRoZSBkZWZhdWx0IFwibmV4dFRpY2tcIiBmdW5jdGlvbiB1c2VkIG9ubHkgZm9yIHRoZSB2ZXJ5IGZpcnN0IHByb21pc2UgaW4gYSBwcm9taXNlIGNoYWluLlxyXG4gICBBcyBzb29uIGFzIHRoZW4gcHJvbWlzZSBpcyByZXNvbHZlZCBvciByZWplY3RlZCwgYWxsIG5leHQgdGFza3Mgd2lsbCBiZSBleGVjdXRlZCBpbiBtaWNybyB0aWNrc1xyXG4gICBlbXVsYXRlZCBpbiB0aGlzIG1vZHVsZS4gRm9yIGluZGV4ZWREQiBjb21wYXRpYmlsaXR5LCB0aGlzIG1lYW5zIHRoYXQgZXZlcnkgbWV0aG9kIG5lZWRzIHRvIFxyXG4gICBleGVjdXRlIGF0IGxlYXN0IG9uZSBwcm9taXNlIGJlZm9yZSBkb2luZyBhbiBpbmRleGVkREIgb3BlcmF0aW9uLiBEZXhpZSB3aWxsIGFsd2F5cyBjYWxsIFxyXG4gICBkYi5yZWFkeSgpLnRoZW4oKSBmb3IgZXZlcnkgb3BlcmF0aW9uIHRvIG1ha2Ugc3VyZSB0aGUgaW5kZXhlZERCIGV2ZW50IGlzIHN0YXJ0ZWQgaW4gYW5cclxuICAgZW11bGF0ZWQgbWljcm8gdGljay5cclxuKi9cbnZhciBzY2hlZHVsZVBoeXNpY2FsVGljayA9IF9nbG9iYWwuc2V0SW1tZWRpYXRlID9cbi8vIHNldEltbWVkaWF0ZSBzdXBwb3J0ZWQuIFRob3NlIG1vZGVybiBwbGF0Zm9ybXMgYWxzbyBzdXBwb3J0cyBGdW5jdGlvbi5iaW5kKCkuXG5zZXRJbW1lZGlhdGUuYmluZChudWxsLCBwaHlzaWNhbFRpY2spIDogX2dsb2JhbC5NdXRhdGlvbk9ic2VydmVyID9cbi8vIE11dGF0aW9uT2JzZXJ2ZXIgc3VwcG9ydGVkXG5mdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhpZGRlbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBwaHlzaWNhbFRpY2soKTtcbiAgICAgICAgaGlkZGVuRGl2ID0gbnVsbDtcbiAgICB9KS5vYnNlcnZlKGhpZGRlbkRpdiwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgIGhpZGRlbkRpdi5zZXRBdHRyaWJ1dGUoJ2knLCAnMScpO1xufSA6XG4vLyBObyBzdXBwb3J0IGZvciBzZXRJbW1lZGlhdGUgb3IgTXV0YXRpb25PYnNlcnZlci4gTm8gd29ycnksIHNldFRpbWVvdXQgaXMgb25seSBjYWxsZWRcbi8vIG9uY2UgdGltZS4gRXZlcnkgdGljayB0aGF0IGZvbGxvd3Mgd2lsbCBiZSBvdXIgZW11bGF0ZWQgbWljcm8gdGljay5cbi8vIENvdWxkIGhhdmUgdXNlcyBzZXRUaW1lb3V0LmJpbmQobnVsbCwgMCwgcGh5c2ljYWxUaWNrKSBpZiBpdCB3YXNudCBmb3IgdGhhdCBGRjEzIGFuZCBiZWxvdyBoYXMgYSBidWcgXG5mdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dChwaHlzaWNhbFRpY2ssIDApO1xufTtcblxuLy8gQ29uZmlmdXJhYmxlIHRocm91Z2ggUHJvbWlzZS5zY2hlZHVsZXIuXG4vLyBEb24ndCBleHBvcnQgYmVjYXVzZSBpdCB3b3VsZCBiZSB1bnNhZmUgdG8gbGV0IHVua25vd25cbi8vIGNvZGUgY2FsbCBpdCB1bmxlc3MgdGhleSBkbyB0cnkuLmNhdGNoIHdpdGhpbiB0aGVpciBjYWxsYmFjay5cbi8vIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIGdldHRlciBvZiBQcm9taXNlLnNjaGVkdWxlciB0aG91Z2gsXG4vLyBidXQgdXNlcnMgbXVzdCBub3QgZG8gUHJvbWlzZS5zY2hlZHVsZXIgKG15RnVuY1RoYXRUaHJvd3MgZXhjZXB0aW9uKSFcbnZhciBhc2FwJDEgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGFyZ3MpIHtcbiAgICBtaWNyb3RpY2tRdWV1ZS5wdXNoKFtjYWxsYmFjaywgYXJnc10pO1xuICAgIGlmIChuZWVkc05ld1BoeXNpY2FsVGljaykge1xuICAgICAgICBzY2hlZHVsZVBoeXNpY2FsVGljaygpO1xuICAgICAgICBuZWVkc05ld1BoeXNpY2FsVGljayA9IGZhbHNlO1xuICAgIH1cbn07XG5cbnZhciBpc091dHNpZGVNaWNyb1RpY2sgPSB0cnVlO1xudmFyIG5lZWRzTmV3UGh5c2ljYWxUaWNrID0gdHJ1ZTtcbnZhciB1bmhhbmRsZWRFcnJvcnMgPSBbXTtcbnZhciByZWplY3RpbmdFcnJvcnMgPSBbXTtcbnZhciBjdXJyZW50RnVsZmlsbGVyID0gbnVsbDtcbnZhciByZWplY3Rpb25NYXBwZXIgPSBtaXJyb3I7IC8vIFJlbW92ZSBpbiBuZXh0IG1ham9yIHdoZW4gcmVtb3ZpbmcgZXJyb3IgbWFwcGluZyBvZiBET01FcnJvcnMgYW5kIERPTUV4Y2VwdGlvbnNcblxudmFyIGdsb2JhbFBTRCA9IHtcbiAgICBnbG9iYWw6IHRydWUsXG4gICAgcmVmOiAwLFxuICAgIHVuaGFuZGxlZHM6IFtdLFxuICAgIG9udW5oYW5kbGVkOiBnbG9iYWxFcnJvcixcbiAgICAvL2VudjogbnVsbCwgLy8gV2lsbCBiZSBzZXQgd2hlbmV2ZXIgbGVhdmluZyBhIHNjb3BlIHVzaW5nIHdyYXBwZXJzLnNuYXBzaG90KClcbiAgICBmaW5hbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVuaGFuZGxlZHMuZm9yRWFjaChmdW5jdGlvbiAodWgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsRXJyb3IodWhbMF0sIHVoWzFdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbnZhciBQU0QgPSBnbG9iYWxQU0Q7XG5cbnZhciBtaWNyb3RpY2tRdWV1ZSA9IFtdOyAvLyBDYWxsYmFja3MgdG8gY2FsbCBpbiB0aGlzIG9yIG5leHQgcGh5c2ljYWwgdGljay5cbnZhciBudW1TY2hlZHVsZWRDYWxscyA9IDA7IC8vIE51bWJlciBvZiBsaXN0ZW5lci1jYWxscyBsZWZ0IHRvIGRvIGluIHRoaXMgcGh5c2ljYWwgdGljay5cbnZhciB0aWNrRmluYWxpemVycyA9IFtdOyAvLyBGaW5hbGl6ZXJzIHRvIGNhbGwgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBhc3luYyBjYWxscyBzY2hlZHVsZWQgd2l0aGluIGN1cnJlbnQgcGh5c2ljYWwgdGljay5cblxuLy8gV3JhcHBlcnMgYXJlIG5vdCBiZWluZyB1c2VkIHlldC4gVGhlaXIgZnJhbWV3b3JrIGlzIGZ1bmN0aW9uaW5nIGFuZCBjYW4gYmUgdXNlZFxuLy8gdG8gcmVwbGFjZSBlbnZpcm9ubWVudCBkdXJpbmcgYSBQU0Qgc2NvcGUgKGEuay5hLiAnem9uZScpLlxuLyogKipLRUVQKiogZXhwb3J0IHZhciB3cmFwcGVycyA9ICgoKSA9PiB7XHJcbiAgICB2YXIgd3JhcHBlcnMgPSBbXTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIHNuYXBzaG90OiAoKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBpID0gd3JhcHBlcnMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KGkpO1xyXG4gICAgICAgICAgICB3aGlsZSAoaS0tKSByZXN1bHRbaV0gPSB3cmFwcGVyc1tpXS5zbmFwc2hvdCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmVzdG9yZTogdmFsdWVzID0+IHtcclxuICAgICAgICAgICAgdmFyIGkgPSB3cmFwcGVycy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHdoaWxlIChpLS0pIHdyYXBwZXJzW2ldLnJlc3RvcmUodmFsdWVzW2ldKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIHdyYXA6ICgpID0+IHdyYXBwZXJzLm1hcCh3ID0+IHcud3JhcCgpKSxcclxuICAgICAgICBhZGQ6IHdyYXBwZXIgPT4ge1xyXG4gICAgICAgICAgICB3cmFwcGVycy5wdXNoKHdyYXBwZXIpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbn0pKCk7XHJcbiovXG5cbmZ1bmN0aW9uIFByb21pc2UoZm4pIHtcbiAgICBpZiAodHlwZW9mIHRoaXMgIT09ICdvYmplY3QnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdQcm9taXNlcyBtdXN0IGJlIGNvbnN0cnVjdGVkIHZpYSBuZXcnKTtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTtcbiAgICB0aGlzLm9udW5jYXRjaGVkID0gbm9wOyAvLyBEZXByZWNhdGUgaW4gbmV4dCBtYWpvci4gTm90IG5lZWRlZC4gQmV0dGVyIHRvIHVzZSBnbG9iYWwgZXJyb3IgaGFuZGxlci5cblxuICAgIC8vIEEgbGlicmFyeSBtYXkgc2V0IGBwcm9taXNlLl9saWIgPSB0cnVlO2AgYWZ0ZXIgcHJvbWlzZSBpcyBjcmVhdGVkIHRvIG1ha2UgcmVzb2x2ZSgpIG9yIHJlamVjdCgpXG4gICAgLy8gZXhlY3V0ZSB0aGUgbWljcm90YXNrIGVuZ2luZSBpbXBsaWNpdGVseSB3aXRoaW4gdGhlIGNhbGwgdG8gcmVzb2x2ZSgpIG9yIHJlamVjdCgpLlxuICAgIC8vIFRvIHJlbWFpbiBBKyBjb21wbGlhbnQsIGEgbGlicmFyeSBtdXN0IG9ubHkgc2V0IGBfbGliPXRydWVgIGlmIGl0IGNhbiBndWFyYW50ZWUgdGhhdCB0aGUgc3RhY2tcbiAgICAvLyBvbmx5IGNvbnRhaW5zIGxpYnJhcnkgY29kZSB3aGVuIGNhbGxpbmcgcmVzb2x2ZSgpIG9yIHJlamVjdCgpLlxuICAgIC8vIFJVTEUgT0YgVEhVTUI6IE9OTFkgc2V0IF9saWIgPSB0cnVlIGZvciBwcm9taXNlcyBleHBsaWNpdGVseSByZXNvbHZpbmcvcmVqZWN0aW5nIGRpcmVjdGx5IGZyb21cbiAgICAvLyBnbG9iYWwgc2NvcGUgKGV2ZW50IGhhbmRsZXIsIHRpbWVyIGV0YykhXG4gICAgdGhpcy5fbGliID0gZmFsc2U7XG4gICAgLy8gQ3VycmVudCBhc3luYyBzY29wZVxuICAgIHZhciBwc2QgPSB0aGlzLl9QU0QgPSBQU0Q7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgdGhpcy5fc3RhY2tIb2xkZXIgPSBnZXRFcnJvcldpdGhTdGFjaygpO1xuICAgICAgICB0aGlzLl9wcmV2ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fbnVtUHJldiA9IDA7IC8vIE51bWJlciBvZiBwcmV2aW91cyBwcm9taXNlcyAoZm9yIGxvbmcgc3RhY2tzKVxuICAgICAgICBsaW5rVG9QcmV2aW91c1Byb21pc2UodGhpcywgY3VycmVudEZ1bGZpbGxlcik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoZm4gIT09IElOVEVSTkFMKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdOb3QgYSBmdW5jdGlvbicpO1xuICAgICAgICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yIChJTlRFUk5BTCwgc3RhdGUsIHZhbHVlKS5cbiAgICAgICAgLy8gVXNlZCBpbnRlcm5hbGx5IGJ5IFByb21pc2UucmVzb2x2ZSgpIGFuZCBQcm9taXNlLnJlamVjdCgpLlxuICAgICAgICB0aGlzLl9zdGF0ZSA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBhcmd1bWVudHNbMl07XG4gICAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gZmFsc2UpIGhhbmRsZVJlamVjdGlvbih0aGlzLCB0aGlzLl92YWx1ZSk7IC8vIE1hcCBlcnJvciwgc2V0IHN0YWNrIGFuZCBhZGRQb3NzaWJseVVuaGFuZGxlZEVycm9yKCkuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0ZSA9IG51bGw7IC8vIG51bGwgKD1wZW5kaW5nKSwgZmFsc2UgKD1yZWplY3RlZCkgb3IgdHJ1ZSAoPXJlc29sdmVkKVxuICAgIHRoaXMuX3ZhbHVlID0gbnVsbDsgLy8gZXJyb3Igb3IgcmVzdWx0XG4gICAgKytwc2QucmVmOyAvLyBSZWZjb3VudGluZyBjdXJyZW50IHNjb3BlXG4gICAgZXhlY3V0ZVByb21pc2VUYXNrKHRoaXMsIGZuKTtcbn1cblxucHJvcHMoUHJvbWlzZS5wcm90b3R5cGUsIHtcblxuICAgIHRoZW46IGZ1bmN0aW9uIChvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIHZhciBydiA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHByb3BhZ2F0ZVRvTGlzdGVuZXIoX3RoaXMsIG5ldyBMaXN0ZW5lcihvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgcmVzb2x2ZSwgcmVqZWN0KSk7XG4gICAgICAgIH0pO1xuICAgICAgICBkZWJ1ZyAmJiAoIXRoaXMuX3ByZXYgfHwgdGhpcy5fc3RhdGUgPT09IG51bGwpICYmIGxpbmtUb1ByZXZpb3VzUHJvbWlzZShydiwgdGhpcyk7XG4gICAgICAgIHJldHVybiBydjtcbiAgICB9LFxuXG4gICAgX3RoZW46IGZ1bmN0aW9uIChvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xuICAgICAgICAvLyBBIGxpdHRsZSB0aW5pZXIgdmVyc2lvbiBvZiB0aGVuKCkgdGhhdCBkb24ndCBoYXZlIHRvIGNyZWF0ZSBhIHJlc3VsdGluZyBwcm9taXNlLlxuICAgICAgICBwcm9wYWdhdGVUb0xpc3RlbmVyKHRoaXMsIG5ldyBMaXN0ZW5lcihudWxsLCBudWxsLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkpO1xuICAgIH0sXG5cbiAgICBjYXRjaDogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHJldHVybiB0aGlzLnRoZW4obnVsbCwgb25SZWplY3RlZCk7XG4gICAgICAgIC8vIEZpcnN0IGFyZ3VtZW50IGlzIHRoZSBFcnJvciB0eXBlIHRvIGNhdGNoXG4gICAgICAgIHZhciB0eXBlID0gYXJndW1lbnRzWzBdLFxuICAgICAgICAgICAgaGFuZGxlciA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdGhpcy50aGVuKG51bGwsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgLy8gQ2F0Y2hpbmcgZXJyb3JzIGJ5IGl0cyBjb25zdHJ1Y3RvciB0eXBlIChzaW1pbGFyIHRvIGphdmEgLyBjKysgLyBjIylcbiAgICAgICAgICAgICAgICAvLyBTYW1wbGU6IHByb21pc2UuY2F0Y2goVHlwZUVycm9yLCBmdW5jdGlvbiAoZSkgeyAuLi4gfSk7XG4gICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgdHlwZSA/IGhhbmRsZXIoZXJyKSA6IFByb21pc2VSZWplY3QoZXJyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSkgOiB0aGlzLnRoZW4obnVsbCwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAvLyBDYXRjaGluZyBlcnJvcnMgYnkgdGhlIGVycm9yLm5hbWUgcHJvcGVydHkuIE1ha2VzIHNlbnNlIGZvciBpbmRleGVkREIgd2hlcmUgZXJyb3IgdHlwZVxuICAgICAgICAgICAgICAgIC8vIGlzIGFsd2F5cyBET01FcnJvciBidXQgd2hlcmUgZS5uYW1lIHRlbGxzIHRoZSBhY3R1YWwgZXJyb3IgdHlwZS5cbiAgICAgICAgICAgICAgICAvLyBTYW1wbGU6IHByb21pc2UuY2F0Y2goJ0NvbnN0cmFpbnRFcnJvcicsIGZ1bmN0aW9uIChlKSB7IC4uLiB9KTtcbiAgICAgICAgICAgICAgICBlcnIgJiYgZXJyLm5hbWUgPT09IHR5cGUgPyBoYW5kbGVyKGVycikgOiBQcm9taXNlUmVqZWN0KGVycilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBmaW5hbGx5OiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBvbkZpbmFsbHkoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgb25GaW5hbGx5KCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZVJlamVjdChlcnIpO1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gRGVwcmVjYXRlIGluIG5leHQgbWFqb3IuIE5lZWRlZCBvbmx5IGZvciBkYi5vbi5lcnJvci5cbiAgICB1bmNhdWdodDogZnVuY3Rpb24gKHVuY2F1Z2h0SGFuZGxlcikge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICAvLyBCZSBiYWNrd2FyZCBjb21wYXRpYmxlIGFuZCB1c2UgXCJvbnVuY2F0Y2hlZFwiIGFzIHRoZSBldmVudCBuYW1lIG9uIHRoaXMuXG4gICAgICAgIC8vIEhhbmRsZSBtdWx0aXBsZSBzdWJzY3JpYmVycyB0aHJvdWdoIHJldmVyc2VTdG9wcGFibGVFdmVudENoYWluKCkuIElmIGEgaGFuZGxlciByZXR1cm5zIGBmYWxzZWAsIGJ1YmJsaW5nIHN0b3BzLlxuICAgICAgICB0aGlzLm9udW5jYXRjaGVkID0gcmV2ZXJzZVN0b3BwYWJsZUV2ZW50Q2hhaW4odGhpcy5vbnVuY2F0Y2hlZCwgdW5jYXVnaHRIYW5kbGVyKTtcbiAgICAgICAgLy8gSW4gY2FzZSBjYWxsZXIgZG9lcyB0aGlzIG9uIGFuIGFscmVhZHkgcmVqZWN0ZWQgcHJvbWlzZSwgYXNzdW1lIGNhbGxlciB3YW50cyB0byBwb2ludCBvdXQgdGhlIGVycm9yIHRvIHRoaXMgcHJvbWlzZSBhbmQgbm90XG4gICAgICAgIC8vIGEgcHJldmlvdXMgcHJvbWlzZS4gUmVhc29uOiB0aGUgcHJldm91cyBwcm9taXNlIG1heSBsYWNrIG9udW5jYXRjaGVkIGhhbmRsZXIuIFxuICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT09IGZhbHNlICYmIHVuaGFuZGxlZEVycm9ycy5pbmRleE9mKHRoaXMpID09PSAtMSkge1xuICAgICAgICAgICAgLy8gUmVwbGFjZSB1bmhhbmRsZWQgZXJyb3IncyBkZXN0aW5haW9uIHByb21pc2Ugd2l0aCB0aGlzIG9uZSFcbiAgICAgICAgICAgIHVuaGFuZGxlZEVycm9ycy5zb21lKGZ1bmN0aW9uIChwLCBpLCBsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHAuX3ZhbHVlID09PSBfdGhpczIuX3ZhbHVlICYmIChsW2ldID0gX3RoaXMyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQWN0dWFsbHkgd2UgZG8gdGhpcyBzaGl0IGJlY2F1c2Ugd2UgbmVlZCB0byBzdXBwb3J0IGRiLm9uLmVycm9yKCkgY29ycmVjdGx5IGR1cmluZyBkYi5vcGVuKCkuIElmIHdlIGRlcHJlY2F0ZSBkYi5vbi5lcnJvciwgd2UgY291bGRcbiAgICAgICAgICAgIC8vIHRha2UgYXdheSB0aGlzIHBpZWNlIG9mIGNvZGUgYXMgd2VsbCBhcyB0aGUgb251bmNhdGNoZWQgYW5kIHVuY2F1Z2h0KCkgbWV0aG9kLlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBzdGFjazoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGFjaykgcmV0dXJuIHRoaXMuX3N0YWNrO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGFja19iZWluZ19nZW5lcmF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZhciBzdGFja3MgPSBnZXRTdGFjayh0aGlzLCBbXSwgTUFYX0xPTkdfU1RBQ0tTKTtcbiAgICAgICAgICAgICAgICB2YXIgc3RhY2sgPSBzdGFja3Muam9pbihcIlxcbkZyb20gcHJldmlvdXM6IFwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IG51bGwpIHRoaXMuX3N0YWNrID0gc3RhY2s7IC8vIFN0YWNrIG1heSBiZSB1cGRhdGVkIG9uIHJlamVjdC5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2s7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHN0YWNrX2JlaW5nX2dlbmVyYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSk7XG5cbmZ1bmN0aW9uIExpc3RlbmVyKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICB0aGlzLm9uRnVsZmlsbGVkID0gdHlwZW9mIG9uRnVsZmlsbGVkID09PSAnZnVuY3Rpb24nID8gb25GdWxmaWxsZWQgOiBudWxsO1xuICAgIHRoaXMub25SZWplY3RlZCA9IHR5cGVvZiBvblJlamVjdGVkID09PSAnZnVuY3Rpb24nID8gb25SZWplY3RlZCA6IG51bGw7XG4gICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB0aGlzLnJlamVjdCA9IHJlamVjdDtcbiAgICB0aGlzLnBzZCA9IFBTRDtcbn1cblxuLy8gUHJvbWlzZSBTdGF0aWMgUHJvcGVydGllc1xucHJvcHMoUHJvbWlzZSwge1xuICAgIGFsbDogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVzID0gZ2V0QXJyYXlPZi5hcHBseShudWxsLCBhcmd1bWVudHMpOyAvLyBTdXBwb3J0cyBpdGVyYWJsZXMsIGltcGxpY2l0IGFyZ3VtZW50cyBhbmQgYXJyYXktbGlrZS5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSByZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIHZhciByZW1haW5pbmcgPSB2YWx1ZXMubGVuZ3RoO1xuICAgICAgICAgICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKGEsIGkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGEpLnRoZW4oZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0geDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEgLS1yZW1haW5pbmcpIHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICByZXNvbHZlOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YWx1ZS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoSU5URVJOQUwsIHRydWUsIHZhbHVlKTtcbiAgICB9LFxuXG4gICAgcmVqZWN0OiBQcm9taXNlUmVqZWN0LFxuXG4gICAgcmFjZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdmFsdWVzID0gZ2V0QXJyYXlPZi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFsdWVzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIFBTRDoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBQU0Q7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gUFNEID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgbmV3UFNEOiBuZXdTY29wZSxcblxuICAgIHVzZVBTRDogdXNlUFNELFxuXG4gICAgc2NoZWR1bGVyOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGFzYXAkMTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGFzYXAkMSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHJlamVjdGlvbk1hcHBlcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3Rpb25NYXBwZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZWplY3Rpb25NYXBwZXIgPSB2YWx1ZTtcbiAgICAgICAgfSAvLyBNYXAgcmVqZWN0IGZhaWx1cmVzXG4gICAgfSxcblxuICAgIGZvbGxvdzogZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3U2NvcGUoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgIHZhciBwc2QgPSBQU0Q7XG4gICAgICAgICAgICAgICAgcHNkLnVuaGFuZGxlZHMgPSBbXTsgLy8gRm9yIHVuaGFuZGxlZCBzdGFuZGFyZC0gb3IgM3JkIHBhcnR5IFByb21pc2VzLiBDaGVja2VkIGF0IHBzZC5maW5hbGl6ZSgpXG4gICAgICAgICAgICAgICAgcHNkLm9udW5oYW5kbGVkID0gcmVqZWN0OyAvLyBUcmlnZ2VyZWQgZGlyZWN0bHkgb24gdW5oYW5kbGVkIHByb21pc2VzIG9mIHRoaXMgbGlicmFyeS5cbiAgICAgICAgICAgICAgICBwc2QuZmluYWxpemUgPSBjYWxsQm90aChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVuaGFuZGxlZCBzdGFuZGFyZCBvciAzcmQgcGFydCBwcm9taXNlcyBhcmUgcHV0IGluIFBTRC51bmhhbmRsZWRzIGFuZFxuICAgICAgICAgICAgICAgICAgICAvLyBleGFtaW5lZCB1cG9uIHNjb3BlIGNvbXBsZXRpb24gd2hpbGUgdW5oYW5kbGVkIHJlamVjdGlvbnMgaW4gdGhpcyBQcm9taXNlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgdHJpZ2dlciBkaXJlY3RseSB0aHJvdWdoIHBzZC5vbnVuaGFuZGxlZFxuICAgICAgICAgICAgICAgICAgICBydW5fYXRfZW5kX29mX3RoaXNfb3JfbmV4dF9waHlzaWNhbF90aWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzMy51bmhhbmRsZWRzLmxlbmd0aCA9PT0gMCA/IHJlc29sdmUoKSA6IHJlamVjdChfdGhpczMudW5oYW5kbGVkc1swXSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIHBzZC5maW5hbGl6ZSk7XG4gICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgIH0sIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBvbjogRXZlbnRzKG51bGwsIHsgXCJlcnJvclwiOiBbcmV2ZXJzZVN0b3BwYWJsZUV2ZW50Q2hhaW4sIGRlZmF1bHRFcnJvckhhbmRsZXJdIC8vIERlZmF1bHQgdG8gZGVmYXVsdEVycm9ySGFuZGxlclxuICAgIH0pXG5cbn0pO1xuXG52YXIgUHJvbWlzZU9uRXJyb3IgPSBQcm9taXNlLm9uLmVycm9yO1xuUHJvbWlzZU9uRXJyb3Iuc3Vic2NyaWJlID0gZGVwcmVjYXRlZChcIlByb21pc2Uub24oJ2Vycm9yJylcIiwgUHJvbWlzZU9uRXJyb3Iuc3Vic2NyaWJlKTtcblByb21pc2VPbkVycm9yLnVuc3Vic2NyaWJlID0gZGVwcmVjYXRlZChcIlByb21pc2Uub24oJ2Vycm9yJykudW5zdWJzY3JpYmVcIiwgUHJvbWlzZU9uRXJyb3IudW5zdWJzY3JpYmUpO1xuXG4vKipcclxuKiBUYWtlIGEgcG90ZW50aWFsbHkgbWlzYmVoYXZpbmcgcmVzb2x2ZXIgZnVuY3Rpb24gYW5kIG1ha2Ugc3VyZVxyXG4qIG9uRnVsZmlsbGVkIGFuZCBvblJlamVjdGVkIGFyZSBvbmx5IGNhbGxlZCBvbmNlLlxyXG4qXHJcbiogTWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCBhc3luY2hyb255LlxyXG4qL1xuZnVuY3Rpb24gZXhlY3V0ZVByb21pc2VUYXNrKHByb21pc2UsIGZuKSB7XG4gICAgLy8gUHJvbWlzZSBSZXNvbHV0aW9uIFByb2NlZHVyZTpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcHJvbWlzZXMtYXBsdXMvcHJvbWlzZXMtc3BlYyN0aGUtcHJvbWlzZS1yZXNvbHV0aW9uLXByb2NlZHVyZVxuICAgIHRyeSB7XG4gICAgICAgIGZuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBudWxsKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHByb21pc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgcHJvbWlzZSBjYW5ub3QgYmUgcmVzb2x2ZWQgd2l0aCBpdHNlbGYuJyk7XG4gICAgICAgICAgICB2YXIgc2hvdWxkRXhlY3V0ZVRpY2sgPSBwcm9taXNlLl9saWIgJiYgYmVnaW5NaWNyb1RpY2tTY29wZSgpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgZXhlY3V0ZVByb21pc2VUYXNrKHByb21pc2UsIGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlID8gdmFsdWUuX3RoZW4ocmVzb2x2ZSwgcmVqZWN0KSA6IHZhbHVlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5fc3RhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHByb21pc2UuX3ZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcHJvcGFnYXRlQWxsTGlzdGVuZXJzKHByb21pc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNob3VsZEV4ZWN1dGVUaWNrKSBlbmRNaWNyb1RpY2tTY29wZSgpO1xuICAgICAgICB9LCBoYW5kbGVSZWplY3Rpb24uYmluZChudWxsLCBwcm9taXNlKSk7IC8vIElmIEZ1bmN0aW9uLmJpbmQgaXMgbm90IHN1cHBvcnRlZC4gRXhjZXB0aW9uIGlzIGhhbmRsZWQgaW4gY2F0Y2ggYmVsb3dcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBoYW5kbGVSZWplY3Rpb24ocHJvbWlzZSwgZXgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlUmVqZWN0aW9uKHByb21pc2UsIHJlYXNvbikge1xuICAgIHJlamVjdGluZ0Vycm9ycy5wdXNoKHJlYXNvbik7XG4gICAgaWYgKHByb21pc2UuX3N0YXRlICE9PSBudWxsKSByZXR1cm47XG4gICAgdmFyIHNob3VsZEV4ZWN1dGVUaWNrID0gcHJvbWlzZS5fbGliICYmIGJlZ2luTWljcm9UaWNrU2NvcGUoKTtcbiAgICByZWFzb24gPSByZWplY3Rpb25NYXBwZXIocmVhc29uKTtcbiAgICBwcm9taXNlLl9zdGF0ZSA9IGZhbHNlO1xuICAgIHByb21pc2UuX3ZhbHVlID0gcmVhc29uO1xuICAgIGRlYnVnICYmIHJlYXNvbiAhPT0gbnVsbCAmJiB0eXBlb2YgcmVhc29uID09PSAnb2JqZWN0JyAmJiAhcmVhc29uLl9wcm9taXNlICYmIHRyeUNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG9yaWdQcm9wID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHJlYXNvbiwgXCJzdGFja1wiKTtcbiAgICAgICAgcmVhc29uLl9wcm9taXNlID0gcHJvbWlzZTtcbiAgICAgICAgc2V0UHJvcChyZWFzb24sIFwic3RhY2tcIiwge1xuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrX2JlaW5nX2dlbmVyYXRlZCA/IG9yaWdQcm9wICYmIChvcmlnUHJvcC5nZXQgPyBvcmlnUHJvcC5nZXQuYXBwbHkocmVhc29uKSA6IG9yaWdQcm9wLnZhbHVlKSA6IHByb21pc2Uuc3RhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIEFkZCB0aGUgZmFpbHVyZSB0byBhIGxpc3Qgb2YgcG9zc2libHkgdW5jYXVnaHQgZXJyb3JzXG4gICAgYWRkUG9zc2libHlVbmhhbmRsZWRFcnJvcihwcm9taXNlKTtcbiAgICBwcm9wYWdhdGVBbGxMaXN0ZW5lcnMocHJvbWlzZSk7XG4gICAgaWYgKHNob3VsZEV4ZWN1dGVUaWNrKSBlbmRNaWNyb1RpY2tTY29wZSgpO1xufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVBbGxMaXN0ZW5lcnMocHJvbWlzZSkge1xuICAgIC8vZGVidWcgJiYgbGlua1RvUHJldmlvdXNQcm9taXNlKHByb21pc2UpO1xuICAgIHZhciBsaXN0ZW5lcnMgPSBwcm9taXNlLl9saXN0ZW5lcnM7XG4gICAgcHJvbWlzZS5fbGlzdGVuZXJzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgICAgICBwcm9wYWdhdGVUb0xpc3RlbmVyKHByb21pc2UsIGxpc3RlbmVyc1tpXSk7XG4gICAgfVxuICAgIHZhciBwc2QgPSBwcm9taXNlLl9QU0Q7XG4gICAgLS1wc2QucmVmIHx8IHBzZC5maW5hbGl6ZSgpOyAvLyBpZiBwc2QucmVmIHJlYWNoZXMgemVybywgY2FsbCBwc2QuZmluYWxpemUoKTtcbiAgICBpZiAobnVtU2NoZWR1bGVkQ2FsbHMgPT09IDApIHtcbiAgICAgICAgLy8gSWYgbnVtU2NoZWR1bGVkQ2FsbHMgaXMgMCwgaXQgbWVhbnMgdGhhdCBvdXIgc3RhY2sgaXMgbm90IGluIGEgY2FsbGJhY2sgb2YgYSBzY2hlZHVsZWQgY2FsbCxcbiAgICAgICAgLy8gYW5kIHRoYXQgbm8gZGVmZXJyZWRzIHdoZXJlIGxpc3RlbmluZyB0byB0aGlzIHJlamVjdGlvbiBvciBzdWNjZXNzLlxuICAgICAgICAvLyBTaW5jZSB0aGVyZSBpcyBhIHJpc2sgdGhhdCBvdXIgc3RhY2sgY2FuIGNvbnRhaW4gYXBwbGljYXRpb24gY29kZSB0aGF0IG1heVxuICAgICAgICAvLyBkbyBzdHVmZiBhZnRlciB0aGlzIGNvZGUgaXMgZmluaXNoZWQgdGhhdCBtYXkgZ2VuZXJhdGUgbmV3IGNhbGxzLCB3ZSBjYW5ub3RcbiAgICAgICAgLy8gY2FsbCBmaW5hbGl6ZXJzIGhlcmUuXG4gICAgICAgICsrbnVtU2NoZWR1bGVkQ2FsbHM7XG4gICAgICAgIGFzYXAkMShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoLS1udW1TY2hlZHVsZWRDYWxscyA9PT0gMCkgZmluYWxpemVQaHlzaWNhbFRpY2soKTsgLy8gV2lsbCBkZXRlY3QgdW5oYW5kbGVkIGVycm9yc1xuICAgICAgICB9LCBbXSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwcm9wYWdhdGVUb0xpc3RlbmVyKHByb21pc2UsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHByb21pc2UuX3N0YXRlID09PSBudWxsKSB7XG4gICAgICAgIHByb21pc2UuX2xpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjYiA9IHByb21pc2UuX3N0YXRlID8gbGlzdGVuZXIub25GdWxmaWxsZWQgOiBsaXN0ZW5lci5vblJlamVjdGVkO1xuICAgIGlmIChjYiA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUaGlzIExpc3RlbmVyIGRvZXNudCBoYXZlIGEgbGlzdGVuZXIgZm9yIHRoZSBldmVudCBiZWluZyB0cmlnZ2VyZWQgKG9uRnVsZmlsbGVkIG9yIG9uUmVqZWN0KSBzbyBsZXRzIGZvcndhcmQgdGhlIGV2ZW50IHRvIGFueSBldmVudHVhbCBsaXN0ZW5lcnMgb24gdGhlIFByb21pc2UgaW5zdGFuY2UgcmV0dXJuZWQgYnkgdGhlbigpIG9yIGNhdGNoKClcbiAgICAgICAgcmV0dXJuIChwcm9taXNlLl9zdGF0ZSA/IGxpc3RlbmVyLnJlc29sdmUgOiBsaXN0ZW5lci5yZWplY3QpKHByb21pc2UuX3ZhbHVlKTtcbiAgICB9XG4gICAgdmFyIHBzZCA9IGxpc3RlbmVyLnBzZDtcbiAgICArK3BzZC5yZWY7XG4gICAgKytudW1TY2hlZHVsZWRDYWxscztcbiAgICBhc2FwJDEoY2FsbExpc3RlbmVyLCBbY2IsIHByb21pc2UsIGxpc3RlbmVyXSk7XG59XG5cbmZ1bmN0aW9uIGNhbGxMaXN0ZW5lcihjYiwgcHJvbWlzZSwgbGlzdGVuZXIpIHtcbiAgICB2YXIgb3V0ZXJTY29wZSA9IFBTRDtcbiAgICB2YXIgcHNkID0gbGlzdGVuZXIucHNkO1xuICAgIHRyeSB7XG4gICAgICAgIGlmIChwc2QgIT09IG91dGVyU2NvcGUpIHtcbiAgICAgICAgICAgIC8vICoqS0VFUCoqIG91dGVyU2NvcGUuZW52ID0gd3JhcHBlcnMuc25hcHNob3QoKTsgLy8gU25hcHNob3Qgb3V0ZXJTY29wZSdzIGVudmlyb25tZW50LlxuICAgICAgICAgICAgUFNEID0gcHNkO1xuICAgICAgICAgICAgLy8gKipLRUVQKiogd3JhcHBlcnMucmVzdG9yZShwc2QuZW52KTsgLy8gUmVzdG9yZSBQU0QncyBlbnZpcm9ubWVudC5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBzdGF0aWMgdmFyaWFibGUgY3VycmVudEZ1bGZpbGxlciB0byB0aGUgcHJvbWlzZSB0aGF0IGlzIGJlaW5nIGZ1bGxmaWxsZWQsXG4gICAgICAgIC8vIHNvIHRoYXQgd2UgY29ubmVjdCB0aGUgY2hhaW4gb2YgcHJvbWlzZXMgKGZvciBsb25nIHN0YWNrcyBzdXBwb3J0KVxuICAgICAgICBjdXJyZW50RnVsZmlsbGVyID0gcHJvbWlzZTtcblxuICAgICAgICAvLyBDYWxsIGNhbGxiYWNrIGFuZCByZXNvbHZlIG91ciBsaXN0ZW5lciB3aXRoIGl0J3MgcmV0dXJuIHZhbHVlLlxuICAgICAgICB2YXIgdmFsdWUgPSBwcm9taXNlLl92YWx1ZSxcbiAgICAgICAgICAgIHJldDtcbiAgICAgICAgaWYgKHByb21pc2UuX3N0YXRlKSB7XG4gICAgICAgICAgICByZXQgPSBjYih2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVqZWN0aW5nRXJyb3JzLmxlbmd0aCkgcmVqZWN0aW5nRXJyb3JzID0gW107XG4gICAgICAgICAgICByZXQgPSBjYih2YWx1ZSk7XG4gICAgICAgICAgICBpZiAocmVqZWN0aW5nRXJyb3JzLmluZGV4T2YodmFsdWUpID09PSAtMSkgbWFya0Vycm9yQXNIYW5kbGVkKHByb21pc2UpOyAvLyBDYWxsYmFjayBkaWRudCBkbyBQcm9taXNlLnJlamVjdChlcnIpIG5vciByZWplY3QoZXJyKSBvbnRvIGFub3RoZXIgcHJvbWlzZS5cbiAgICAgICAgfVxuICAgICAgICBsaXN0ZW5lci5yZXNvbHZlKHJldCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIGluIGNhbGxiYWNrLiBSZWplY3Qgb3VyIGxpc3RlbmVyLlxuICAgICAgICBsaXN0ZW5lci5yZWplY3QoZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgLy8gUmVzdG9yZSBQU0QsIGVudiBhbmQgY3VycmVudEZ1bGZpbGxlci5cbiAgICAgICAgaWYgKHBzZCAhPT0gb3V0ZXJTY29wZSkge1xuICAgICAgICAgICAgUFNEID0gb3V0ZXJTY29wZTtcbiAgICAgICAgICAgIC8vICoqS0VFUCoqIHdyYXBwZXJzLnJlc3RvcmUob3V0ZXJTY29wZS5lbnYpOyAvLyBSZXN0b3JlIG91dGVyU2NvcGUncyBlbnZpcm9ubWVudFxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRGdWxmaWxsZXIgPSBudWxsO1xuICAgICAgICBpZiAoLS1udW1TY2hlZHVsZWRDYWxscyA9PT0gMCkgZmluYWxpemVQaHlzaWNhbFRpY2soKTtcbiAgICAgICAgLS1wc2QucmVmIHx8IHBzZC5maW5hbGl6ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0U3RhY2socHJvbWlzZSwgc3RhY2tzLCBsaW1pdCkge1xuICAgIGlmIChzdGFja3MubGVuZ3RoID09PSBsaW1pdCkgcmV0dXJuIHN0YWNrcztcbiAgICB2YXIgc3RhY2sgPSBcIlwiO1xuICAgIGlmIChwcm9taXNlLl9zdGF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdmFyIGZhaWx1cmUgPSBwcm9taXNlLl92YWx1ZSxcbiAgICAgICAgICAgIGVycm9yTmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2U7XG5cbiAgICAgICAgaWYgKGZhaWx1cmUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXJyb3JOYW1lID0gZmFpbHVyZS5uYW1lIHx8IFwiRXJyb3JcIjtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBmYWlsdXJlLm1lc3NhZ2UgfHwgZmFpbHVyZTtcbiAgICAgICAgICAgIHN0YWNrID0gcHJldHR5U3RhY2soZmFpbHVyZSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvck5hbWUgPSBmYWlsdXJlOyAvLyBJZiBlcnJvciBpcyB1bmRlZmluZWQgb3IgbnVsbCwgc2hvdyB0aGF0LlxuICAgICAgICAgICAgbWVzc2FnZSA9IFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgc3RhY2tzLnB1c2goZXJyb3JOYW1lICsgKG1lc3NhZ2UgPyBcIjogXCIgKyBtZXNzYWdlIDogXCJcIikgKyBzdGFjayk7XG4gICAgfVxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBzdGFjayA9IHByZXR0eVN0YWNrKHByb21pc2UuX3N0YWNrSG9sZGVyLCAyKTtcbiAgICAgICAgaWYgKHN0YWNrICYmIHN0YWNrcy5pbmRleE9mKHN0YWNrKSA9PT0gLTEpIHN0YWNrcy5wdXNoKHN0YWNrKTtcbiAgICAgICAgaWYgKHByb21pc2UuX3ByZXYpIGdldFN0YWNrKHByb21pc2UuX3ByZXYsIHN0YWNrcywgbGltaXQpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhY2tzO1xufVxuXG5mdW5jdGlvbiBsaW5rVG9QcmV2aW91c1Byb21pc2UocHJvbWlzZSwgcHJldikge1xuICAgIC8vIFN1cHBvcnQgbG9uZyBzdGFja3MgYnkgbGlua2luZyB0byBwcmV2aW91cyBjb21wbGV0ZWQgcHJvbWlzZS5cbiAgICB2YXIgbnVtUHJldiA9IHByZXYgPyBwcmV2Ll9udW1QcmV2ICsgMSA6IDA7XG4gICAgaWYgKG51bVByZXYgPCBMT05HX1NUQUNLU19DTElQX0xJTUlUKSB7XG4gICAgICAgIC8vIFByb2hpYml0IGluZmluaXRlIFByb21pc2UgbG9vcHMgdG8gZ2V0IGFuIGluZmluaXRlIGxvbmcgbWVtb3J5IGNvbnN1bWluZyBcInRhaWxcIi5cbiAgICAgICAgcHJvbWlzZS5fcHJldiA9IHByZXY7XG4gICAgICAgIHByb21pc2UuX251bVByZXYgPSBudW1QcmV2O1xuICAgIH1cbn1cblxuLyogVGhlIGNhbGxiYWNrIHRvIHNjaGVkdWxlIHdpdGggc2V0SW1tZWRpYXRlKCkgb3Igc2V0VGltZW91dCgpLlxyXG4gICBJdCBydW5zIGEgdmlydHVhbCBtaWNyb3RpY2sgYW5kIGV4ZWN1dGVzIGFueSBjYWxsYmFjayByZWdpc3RlcmVkIGluIG1pY3JvdGlja1F1ZXVlLlxyXG4gKi9cbmZ1bmN0aW9uIHBoeXNpY2FsVGljaygpIHtcbiAgICBiZWdpbk1pY3JvVGlja1Njb3BlKCkgJiYgZW5kTWljcm9UaWNrU2NvcGUoKTtcbn1cblxuZnVuY3Rpb24gYmVnaW5NaWNyb1RpY2tTY29wZSgpIHtcbiAgICB2YXIgd2FzUm9vdEV4ZWMgPSBpc091dHNpZGVNaWNyb1RpY2s7XG4gICAgaXNPdXRzaWRlTWljcm9UaWNrID0gZmFsc2U7XG4gICAgbmVlZHNOZXdQaHlzaWNhbFRpY2sgPSBmYWxzZTtcbiAgICByZXR1cm4gd2FzUm9vdEV4ZWM7XG59XG5cbi8qIEV4ZWN1dGVzIG1pY3JvLXRpY2tzIHdpdGhvdXQgZG9pbmcgdHJ5Li5jYXRjaC5cclxuICAgVGhpcyBjYW4gYmUgcG9zc2libGUgYmVjYXVzZSB3ZSBvbmx5IHVzZSB0aGlzIGludGVybmFsbHkgYW5kXHJcbiAgIHRoZSByZWdpc3RlcmVkIGZ1bmN0aW9ucyBhcmUgZXhjZXB0aW9uLXNhZmUgKHRoZXkgZG8gdHJ5Li5jYXRjaFxyXG4gICBpbnRlcm5hbGx5IGJlZm9yZSBjYWxsaW5nIGFueSBleHRlcm5hbCBtZXRob2QpLiBJZiByZWdpc3RlcmluZ1xyXG4gICBmdW5jdGlvbnMgaW4gdGhlIG1pY3JvdGlja1F1ZXVlIHRoYXQgYXJlIG5vdCBleGNlcHRpb24tc2FmZSwgdGhpc1xyXG4gICB3b3VsZCBkZXN0cm95IHRoZSBmcmFtZXdvcmsgYW5kIG1ha2UgaXQgaW5zdGFibGUuIFNvIHdlIGRvbid0IGV4cG9ydFxyXG4gICBvdXIgYXNhcCBtZXRob2QuXHJcbiovXG5mdW5jdGlvbiBlbmRNaWNyb1RpY2tTY29wZSgpIHtcbiAgICB2YXIgY2FsbGJhY2tzLCBpLCBsO1xuICAgIGRvIHtcbiAgICAgICAgd2hpbGUgKG1pY3JvdGlja1F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1pY3JvdGlja1F1ZXVlO1xuICAgICAgICAgICAgbWljcm90aWNrUXVldWUgPSBbXTtcbiAgICAgICAgICAgIGwgPSBjYWxsYmFja3MubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gY2FsbGJhY2tzW2ldO1xuICAgICAgICAgICAgICAgIGl0ZW1bMF0uYXBwbHkobnVsbCwgaXRlbVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IHdoaWxlIChtaWNyb3RpY2tRdWV1ZS5sZW5ndGggPiAwKTtcbiAgICBpc091dHNpZGVNaWNyb1RpY2sgPSB0cnVlO1xuICAgIG5lZWRzTmV3UGh5c2ljYWxUaWNrID0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZmluYWxpemVQaHlzaWNhbFRpY2soKSB7XG4gICAgdmFyIHVuaGFuZGxlZEVycnMgPSB1bmhhbmRsZWRFcnJvcnM7XG4gICAgdW5oYW5kbGVkRXJyb3JzID0gW107XG4gICAgdW5oYW5kbGVkRXJycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICAgIHAuX1BTRC5vbnVuaGFuZGxlZC5jYWxsKG51bGwsIHAuX3ZhbHVlLCBwKTtcbiAgICB9KTtcbiAgICB2YXIgZmluYWxpemVycyA9IHRpY2tGaW5hbGl6ZXJzLnNsaWNlKDApOyAvLyBDbG9uZSBmaXJzdCBiZWNhdXNlIGZpbmFsaXplciBtYXkgcmVtb3ZlIGl0c2VsZiBmcm9tIGxpc3QuXG4gICAgdmFyIGkgPSBmaW5hbGl6ZXJzLmxlbmd0aDtcbiAgICB3aGlsZSAoaSkge1xuICAgICAgICBmaW5hbGl6ZXJzWy0taV0oKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHJ1bl9hdF9lbmRfb2ZfdGhpc19vcl9uZXh0X3BoeXNpY2FsX3RpY2soZm4pIHtcbiAgICBmdW5jdGlvbiBmaW5hbGl6ZXIoKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICAgIHRpY2tGaW5hbGl6ZXJzLnNwbGljZSh0aWNrRmluYWxpemVycy5pbmRleE9mKGZpbmFsaXplciksIDEpO1xuICAgIH1cbiAgICB0aWNrRmluYWxpemVycy5wdXNoKGZpbmFsaXplcik7XG4gICAgKytudW1TY2hlZHVsZWRDYWxscztcbiAgICBhc2FwJDEoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoLS1udW1TY2hlZHVsZWRDYWxscyA9PT0gMCkgZmluYWxpemVQaHlzaWNhbFRpY2soKTtcbiAgICB9LCBbXSk7XG59XG5cbmZ1bmN0aW9uIGFkZFBvc3NpYmx5VW5oYW5kbGVkRXJyb3IocHJvbWlzZSkge1xuICAgIC8vIE9ubHkgYWRkIHRvIHVuaGFuZGxlZEVycm9ycyBpZiBub3QgYWxyZWFkeSB0aGVyZS4gVGhlIGZpcnN0IG9uZSB0byBhZGQgdG8gdGhpcyBsaXN0XG4gICAgLy8gd2lsbCBiZSB1cG9uIHRoZSBmaXJzdCByZWplY3Rpb24gc28gdGhhdCB0aGUgcm9vdCBjYXVzZSAoZmlyc3QgcHJvbWlzZSBpbiB0aGVcbiAgICAvLyByZWplY3Rpb24gY2hhaW4pIGlzIHRoZSBvbmUgbGlzdGVkLlxuICAgIGlmICghdW5oYW5kbGVkRXJyb3JzLnNvbWUoZnVuY3Rpb24gKHApIHtcbiAgICAgICAgcmV0dXJuIHAuX3ZhbHVlID09PSBwcm9taXNlLl92YWx1ZTtcbiAgICB9KSkgdW5oYW5kbGVkRXJyb3JzLnB1c2gocHJvbWlzZSk7XG59XG5cbmZ1bmN0aW9uIG1hcmtFcnJvckFzSGFuZGxlZChwcm9taXNlKSB7XG4gICAgLy8gQ2FsbGVkIHdoZW4gYSByZWplY3QgaGFuZGxlZCBpcyBhY3R1YWxseSBiZWluZyBjYWxsZWQuXG4gICAgLy8gU2VhcmNoIGluIHVuaGFuZGxlZEVycm9ycyBmb3IgYW55IHByb21pc2Ugd2hvcyBfdmFsdWUgaXMgdGhpcyBwcm9taXNlX3ZhbHVlIChsaXN0XG4gICAgLy8gY29udGFpbnMgb25seSByZWplY3RlZCBwcm9taXNlcywgYW5kIG9ubHkgb25lIGl0ZW0gcGVyIGVycm9yKVxuICAgIHZhciBpID0gdW5oYW5kbGVkRXJyb3JzLmxlbmd0aDtcbiAgICB3aGlsZSAoaSkge1xuICAgICAgICBpZiAodW5oYW5kbGVkRXJyb3JzWy0taV0uX3ZhbHVlID09PSBwcm9taXNlLl92YWx1ZSkge1xuICAgICAgICAgICAgLy8gRm91bmQgYSBwcm9taXNlIHRoYXQgZmFpbGVkIHdpdGggdGhpcyBzYW1lIGVycm9yIG9iamVjdCBwb2ludGVyLFxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoYXQgc2luY2UgdGhlcmUgaXMgYSBsaXN0ZW5lciB0aGF0IGFjdHVhbGx5IHRha2VzIGNhcmUgb2YgaXQuXG4gICAgICAgICAgICB1bmhhbmRsZWRFcnJvcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBCeSBkZWZhdWx0LCBsb2cgdW5jYXVnaHQgZXJyb3JzIHRvIHRoZSBjb25zb2xlXG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JIYW5kbGVyKGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1VuaGFuZGxlZCByZWplY3Rpb246ICcgKyAoZS5zdGFjayB8fCBlKSk7XG59XG5cbmZ1bmN0aW9uIFByb21pc2VSZWplY3QocmVhc29uKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKElOVEVSTkFMLCBmYWxzZSwgcmVhc29uKTtcbn1cblxuZnVuY3Rpb24gd3JhcChmbiwgZXJyb3JDYXRjaGVyKSB7XG4gICAgdmFyIHBzZCA9IFBTRDtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd2FzUm9vdEV4ZWMgPSBiZWdpbk1pY3JvVGlja1Njb3BlKCksXG4gICAgICAgICAgICBvdXRlclNjb3BlID0gUFNEO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAob3V0ZXJTY29wZSAhPT0gcHNkKSB7XG4gICAgICAgICAgICAgICAgLy8gKipLRUVQKiogb3V0ZXJTY29wZS5lbnYgPSB3cmFwcGVycy5zbmFwc2hvdCgpOyAvLyBTbmFwc2hvdCBvdXRlclNjb3BlJ3MgZW52aXJvbm1lbnRcbiAgICAgICAgICAgICAgICBQU0QgPSBwc2Q7XG4gICAgICAgICAgICAgICAgLy8gKipLRUVQKiogd3JhcHBlcnMucmVzdG9yZShwc2QuZW52KTsgLy8gUmVzdG9yZSBQU0QncyBlbnZpcm9ubWVudC5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBlcnJvckNhdGNoZXIgJiYgZXJyb3JDYXRjaGVyKGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgaWYgKG91dGVyU2NvcGUgIT09IHBzZCkge1xuICAgICAgICAgICAgICAgIFBTRCA9IG91dGVyU2NvcGU7XG4gICAgICAgICAgICAgICAgLy8gKipLRUVQKiogd3JhcHBlcnMucmVzdG9yZShvdXRlclNjb3BlLmVudik7IC8vIFJlc3RvcmUgb3V0ZXJTY29wZSdzIGVudmlyb25tZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAod2FzUm9vdEV4ZWMpIGVuZE1pY3JvVGlja1Njb3BlKCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBuZXdTY29wZShmbiwgYTEsIGEyLCBhMykge1xuICAgIHZhciBwYXJlbnQgPSBQU0QsXG4gICAgICAgIHBzZCA9IE9iamVjdC5jcmVhdGUocGFyZW50KTtcbiAgICBwc2QucGFyZW50ID0gcGFyZW50O1xuICAgIHBzZC5yZWYgPSAwO1xuICAgIHBzZC5nbG9iYWwgPSBmYWxzZTtcbiAgICAvLyAqKktFRVAqKiBwc2QuZW52ID0gd3JhcHBlcnMud3JhcChwc2QpO1xuXG4gICAgLy8gdW5oYW5kbGVkcyBhbmQgb251bmhhbmRsZWQgc2hvdWxkIG5vdCBiZSBzcGVjaWZpY2FsbHkgc2V0IGhlcmUuXG4gICAgLy8gTGVhdmUgdGhlbSBvbiBwYXJlbnQgcHJvdG90eXBlLlxuICAgIC8vIHVuaGFuZGxlZHMucHVzaChlcnIpIHdpbGwgcHVzaCB0byBwYXJlbnQncyBwcm90b3R5cGVcbiAgICAvLyBvbnVuaGFuZGxlZCgpIHdpbGwgY2FsbCBwYXJlbnRzIG9udW5oYW5kbGVkICh3aXRoIHRoaXMgc2NvcGUncyB0aGlzLXBvaW50ZXIgdGhvdWdoISlcbiAgICArK3BhcmVudC5yZWY7XG4gICAgcHNkLmZpbmFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAtLXRoaXMucGFyZW50LnJlZiB8fCB0aGlzLnBhcmVudC5maW5hbGl6ZSgpO1xuICAgIH07XG4gICAgdmFyIHJ2ID0gdXNlUFNEKHBzZCwgZm4sIGExLCBhMiwgYTMpO1xuICAgIGlmIChwc2QucmVmID09PSAwKSBwc2QuZmluYWxpemUoKTtcbiAgICByZXR1cm4gcnY7XG59XG5cbmZ1bmN0aW9uIHVzZVBTRChwc2QsIGZuLCBhMSwgYTIsIGEzKSB7XG4gICAgdmFyIG91dGVyU2NvcGUgPSBQU0Q7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHBzZCAhPT0gb3V0ZXJTY29wZSkge1xuICAgICAgICAgICAgLy8gKipLRUVQKiogb3V0ZXJTY29wZS5lbnYgPSB3cmFwcGVycy5zbmFwc2hvdCgpOyAvLyBzbmFwc2hvdCBvdXRlclNjb3BlJ3MgZW52aXJvbm1lbnQuXG4gICAgICAgICAgICBQU0QgPSBwc2Q7XG4gICAgICAgICAgICAvLyAqKktFRVAqKiB3cmFwcGVycy5yZXN0b3JlKHBzZC5lbnYpOyAvLyBSZXN0b3JlIFBTRCdzIGVudmlyb25tZW50LlxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmbihhMSwgYTIsIGEzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAocHNkICE9PSBvdXRlclNjb3BlKSB7XG4gICAgICAgICAgICBQU0QgPSBvdXRlclNjb3BlO1xuICAgICAgICAgICAgLy8gKipLRUVQKiogd3JhcHBlcnMucmVzdG9yZShvdXRlclNjb3BlLmVudik7IC8vIFJlc3RvcmUgb3V0ZXJTY29wZSdzIGVudmlyb25tZW50LlxuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgVU5IQU5ETEVEUkVKRUNUSU9OID0gXCJ1bmhhbmRsZWRyZWplY3Rpb25cIjtcblxuZnVuY3Rpb24gZ2xvYmFsRXJyb3IoZXJyLCBwcm9taXNlKSB7XG4gICAgdmFyIHJ2O1xuICAgIHRyeSB7XG4gICAgICAgIHJ2ID0gcHJvbWlzZS5vbnVuY2F0Y2hlZChlcnIpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgaWYgKHJ2ICE9PSBmYWxzZSkgdHJ5IHtcbiAgICAgICAgdmFyIGV2ZW50LFxuICAgICAgICAgICAgZXZlbnREYXRhID0geyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IGVyciB9O1xuICAgICAgICBpZiAoX2dsb2JhbC5kb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgICAgICAgIGV2ZW50LmluaXRFdmVudChVTkhBTkRMRURSRUpFQ1RJT04sIHRydWUsIHRydWUpO1xuICAgICAgICAgICAgZXh0ZW5kKGV2ZW50LCBldmVudERhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKF9nbG9iYWwuQ3VzdG9tRXZlbnQpIHtcbiAgICAgICAgICAgIGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KFVOSEFORExFRFJFSkVDVElPTiwgeyBkZXRhaWw6IGV2ZW50RGF0YSB9KTtcbiAgICAgICAgICAgIGV4dGVuZChldmVudCwgZXZlbnREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQgJiYgX2dsb2JhbC5kaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgICAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICAgIGlmICghX2dsb2JhbC5Qcm9taXNlUmVqZWN0aW9uRXZlbnQgJiYgX2dsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbilcbiAgICAgICAgICAgICAgICAvLyBObyBuYXRpdmUgc3VwcG9ydCBmb3IgUHJvbWlzZVJlamVjdGlvbkV2ZW50IGJ1dCB1c2VyIGhhcyBzZXQgd2luZG93Lm9udW5oYW5kbGVkcmVqZWN0aW9uLiBNYW51YWxseSBjYWxsIGl0LlxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIF9nbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24oZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBmaXJlIHRvIGV2ZW50cyByZWdpc3RlcmVkIGF0IFByb21pc2Uub24uZXJyb3JcbiAgICAgICAgICAgIFByb21pc2Uub24uZXJyb3IuZmlyZShlcnIsIHByb21pc2UpO1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge31cbn1cblxuLyogKipLRUVQKiogXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gd3JhcFByb21pc2UoUHJvbWlzZUNsYXNzKSB7XHJcbiAgICB2YXIgcHJvdG8gPSBQcm9taXNlQ2xhc3MucHJvdG90eXBlO1xyXG4gICAgdmFyIG9yaWdUaGVuID0gcHJvdG8udGhlbjtcclxuICAgIFxyXG4gICAgd3JhcHBlcnMuYWRkKHtcclxuICAgICAgICBzbmFwc2hvdDogKCkgPT4gcHJvdG8udGhlbixcclxuICAgICAgICByZXN0b3JlOiB2YWx1ZSA9PiB7cHJvdG8udGhlbiA9IHZhbHVlO30sXHJcbiAgICAgICAgd3JhcDogKCkgPT4gcGF0Y2hlZFRoZW5cclxuICAgIH0pO1xyXG5cclxuICAgIGZ1bmN0aW9uIHBhdGNoZWRUaGVuIChvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCkge1xyXG4gICAgICAgIHZhciBwcm9taXNlID0gdGhpcztcclxuICAgICAgICB2YXIgb25GdWxmaWxsZWRQcm94eSA9IHdyYXAoZnVuY3Rpb24odmFsdWUpe1xyXG4gICAgICAgICAgICB2YXIgcnYgPSB2YWx1ZTtcclxuICAgICAgICAgICAgaWYgKG9uRnVsZmlsbGVkKSB7XHJcbiAgICAgICAgICAgICAgICBydiA9IG9uRnVsZmlsbGVkKHJ2KTtcclxuICAgICAgICAgICAgICAgIGlmIChydiAmJiB0eXBlb2YgcnYudGhlbiA9PT0gJ2Z1bmN0aW9uJykgcnYudGhlbigpOyAvLyBJbnRlcmNlcHQgdGhhdCBwcm9taXNlIGFzIHdlbGwuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLS1QU0QucmVmIHx8IFBTRC5maW5hbGl6ZSgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcnY7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdmFyIG9uUmVqZWN0ZWRQcm94eSA9IHdyYXAoZnVuY3Rpb24oZXJyKXtcclxuICAgICAgICAgICAgcHJvbWlzZS5fJGVyciA9IGVycjtcclxuICAgICAgICAgICAgdmFyIHVuaGFuZGxlZHMgPSBQU0QudW5oYW5kbGVkcztcclxuICAgICAgICAgICAgdmFyIGlkeCA9IHVuaGFuZGxlZHMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgcnY7XHJcbiAgICAgICAgICAgIHdoaWxlIChpZHgtLSkgaWYgKHVuaGFuZGxlZHNbaWR4XS5fJGVyciA9PT0gZXJyKSBicmVhaztcclxuICAgICAgICAgICAgaWYgKG9uUmVqZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpZHggIT09IC0xKSB1bmhhbmRsZWRzLnNwbGljZShpZHgsIDEpOyAvLyBNYXJrIGFzIGhhbmRsZWQuXHJcbiAgICAgICAgICAgICAgICBydiA9IG9uUmVqZWN0ZWQoZXJyKTtcclxuICAgICAgICAgICAgICAgIGlmIChydiAmJiB0eXBlb2YgcnYudGhlbiA9PT0gJ2Z1bmN0aW9uJykgcnYudGhlbigpOyAvLyBJbnRlcmNlcHQgdGhhdCBwcm9taXNlIGFzIHdlbGwuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSAtMSkgdW5oYW5kbGVkcy5wdXNoKHByb21pc2UpO1xyXG4gICAgICAgICAgICAgICAgcnYgPSBQcm9taXNlQ2xhc3MucmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICBydi5fJG5vaW50ZXJjZXB0ID0gdHJ1ZTsgLy8gUHJvaGliaXQgZXRlcm5hbCBsb29wLlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC0tUFNELnJlZiB8fCBQU0QuZmluYWxpemUoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJ2O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLl8kbm9pbnRlcmNlcHQpIHJldHVybiBvcmlnVGhlbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICsrUFNELnJlZjtcclxuICAgICAgICByZXR1cm4gb3JpZ1RoZW4uY2FsbCh0aGlzLCBvbkZ1bGZpbGxlZFByb3h5LCBvblJlamVjdGVkUHJveHkpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBHbG9iYWwgUHJvbWlzZSB3cmFwcGVyXHJcbmlmIChfZ2xvYmFsLlByb21pc2UpIHdyYXBQcm9taXNlKF9nbG9iYWwuUHJvbWlzZSk7XHJcblxyXG4qL1xuXG5kb0Zha2VBdXRvQ29tcGxldGUoZnVuY3Rpb24gKCkge1xuICAgIC8vIFNpbXBsaWZ5IHRoZSBqb2IgZm9yIFZTIEludGVsbGlzZW5zZS4gVGhpcyBwaWVjZSBvZiBjb2RlIGlzIG9uZSBvZiB0aGUga2V5cyB0byB0aGUgbmV3IG1hcnZlbGxvdXMgaW50ZWxsaXNlbnNlIHN1cHBvcnQgaW4gRGV4aWUuXG4gICAgYXNhcCQxID0gZnVuY3Rpb24gKGZuLCBhcmdzKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZm4uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgIH0sIDApO1xuICAgIH07XG59KTtcblxuZnVuY3Rpb24gcmVqZWN0aW9uKGVyciwgdW5jYXVnaHRIYW5kbGVyKSB7XG4gICAgLy8gR2V0IHRoZSBjYWxsIHN0YWNrIGFuZCByZXR1cm4gYSByZWplY3RlZCBwcm9taXNlLlxuICAgIHZhciBydiA9IFByb21pc2UucmVqZWN0KGVycik7XG4gICAgcmV0dXJuIHVuY2F1Z2h0SGFuZGxlciA/IHJ2LnVuY2F1Z2h0KHVuY2F1Z2h0SGFuZGxlcikgOiBydjtcbn1cblxuLypcclxuICogRGV4aWUuanMgLSBhIG1pbmltYWxpc3RpYyB3cmFwcGVyIGZvciBJbmRleGVkREJcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICpcclxuICogQnkgRGF2aWQgRmFobGFuZGVyLCBkYXZpZC5mYWhsYW5kZXJAZ21haWwuY29tXHJcbiAqXHJcbiAqIFZlcnNpb24gMS41LjEsIFR1ZSBOb3YgMDEgMjAxNlxyXG4gKlxyXG4gKiBodHRwOi8vZGV4aWUub3JnXHJcbiAqXHJcbiAqIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQsIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9cclxuICovXG5cbnZhciBERVhJRV9WRVJTSU9OID0gJzEuNS4xJztcbnZhciBtYXhTdHJpbmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDY1NTM1KTtcbnZhciBtYXhLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgSURCS2V5UmFuZ2Uub25seShbW11dKTtyZXR1cm4gW1tdXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBtYXhTdHJpbmc7XG4gICAgfVxufSgpO1xudmFyIElOVkFMSURfS0VZX0FSR1VNRU5UID0gXCJJbnZhbGlkIGtleSBwcm92aWRlZC4gS2V5cyBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLCBudW1iZXIsIERhdGUgb3IgQXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgRGF0ZT4uXCI7XG52YXIgU1RSSU5HX0VYUEVDVEVEID0gXCJTdHJpbmcgZXhwZWN0ZWQuXCI7XG52YXIgY29ubmVjdGlvbnMgPSBbXTtcbnZhciBpc0lFT3JFZGdlID0gdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgLyhNU0lFfFRyaWRlbnR8RWRnZSkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG52YXIgaGFzSUVEZWxldGVPYmplY3RTdG9yZUJ1ZyA9IGlzSUVPckVkZ2U7XG52YXIgaGFuZ3NPbkRlbGV0ZUxhcmdlS2V5UmFuZ2UgPSBpc0lFT3JFZGdlO1xudmFyIGRleGllU3RhY2tGcmFtZUZpbHRlciA9IGZ1bmN0aW9uIChmcmFtZSkge1xuICAgIHJldHVybiAhLyhkZXhpZVxcLmpzfGRleGllXFwubWluXFwuanMpLy50ZXN0KGZyYW1lKTtcbn07XG5cbnNldERlYnVnKGRlYnVnLCBkZXhpZVN0YWNrRnJhbWVGaWx0ZXIpO1xuXG5mdW5jdGlvbiBEZXhpZShkYk5hbWUsIG9wdGlvbnMpIHtcbiAgICAvLy8gPHBhcmFtIG5hbWU9XCJvcHRpb25zXCIgdHlwZT1cIk9iamVjdFwiIG9wdGlvbmFsPVwidHJ1ZVwiPlNwZWNpZnkgb25seSBpZiB5b3Ugd2ljaCB0byBjb250cm9sIHdoaWNoIGFkZG9ucyB0aGF0IHNob3VsZCBydW4gb24gdGhpcyBpbnN0YW5jZTwvcGFyYW0+XG4gICAgdmFyIGRlcHMgPSBEZXhpZS5kZXBlbmRlbmNpZXM7XG4gICAgdmFyIG9wdHMgPSBleHRlbmQoe1xuICAgICAgICAvLyBEZWZhdWx0IE9wdGlvbnNcbiAgICAgICAgYWRkb25zOiBEZXhpZS5hZGRvbnMsIC8vIFBpY2sgc3RhdGljYWxseSByZWdpc3RlcmVkIGFkZG9ucyBieSBkZWZhdWx0XG4gICAgICAgIGF1dG9PcGVuOiB0cnVlLCAvLyBEb24ndCByZXF1aXJlIGRiLm9wZW4oKSBleHBsaWNpdGVseS5cbiAgICAgICAgaW5kZXhlZERCOiBkZXBzLmluZGV4ZWREQiwgLy8gQmFja2VuZCBJbmRleGVkREIgYXBpLiBEZWZhdWx0IHRvIElEQlNoaW0gb3IgYnJvd3NlciBlbnYuXG4gICAgICAgIElEQktleVJhbmdlOiBkZXBzLklEQktleVJhbmdlIC8vIEJhY2tlbmQgSURCS2V5UmFuZ2UgYXBpLiBEZWZhdWx0IHRvIElEQlNoaW0gb3IgYnJvd3NlciBlbnYuXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgdmFyIGFkZG9ucyA9IG9wdHMuYWRkb25zLFxuICAgICAgICBhdXRvT3BlbiA9IG9wdHMuYXV0b09wZW4sXG4gICAgICAgIGluZGV4ZWREQiA9IG9wdHMuaW5kZXhlZERCLFxuICAgICAgICBJREJLZXlSYW5nZSA9IG9wdHMuSURCS2V5UmFuZ2U7XG5cbiAgICB2YXIgZ2xvYmFsU2NoZW1hID0gdGhpcy5fZGJTY2hlbWEgPSB7fTtcbiAgICB2YXIgdmVyc2lvbnMgPSBbXTtcbiAgICB2YXIgZGJTdG9yZU5hbWVzID0gW107XG4gICAgdmFyIGFsbFRhYmxlcyA9IHt9O1xuICAgIC8vLzx2YXIgdHlwZT1cIklEQkRhdGFiYXNlXCIgLz5cbiAgICB2YXIgaWRiZGIgPSBudWxsOyAvLyBJbnN0YW5jZSBvZiBJREJEYXRhYmFzZVxuICAgIHZhciBkYk9wZW5FcnJvciA9IG51bGw7XG4gICAgdmFyIGlzQmVpbmdPcGVuZWQgPSBmYWxzZTtcbiAgICB2YXIgb3BlbkNvbXBsZXRlID0gZmFsc2U7XG4gICAgdmFyIFJFQURPTkxZID0gXCJyZWFkb25seVwiLFxuICAgICAgICBSRUFEV1JJVEUgPSBcInJlYWR3cml0ZVwiO1xuICAgIHZhciBkYiA9IHRoaXM7XG4gICAgdmFyIGRiUmVhZHlSZXNvbHZlLFxuICAgICAgICBkYlJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIGRiUmVhZHlSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9KSxcbiAgICAgICAgY2FuY2VsT3BlbixcbiAgICAgICAgb3BlbkNhbmNlbGxlciA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChfLCByZWplY3QpIHtcbiAgICAgICAgY2FuY2VsT3BlbiA9IHJlamVjdDtcbiAgICB9KTtcbiAgICB2YXIgYXV0b1NjaGVtYSA9IHRydWU7XG4gICAgdmFyIGhhc05hdGl2ZUdldERhdGFiYXNlTmFtZXMgPSAhIWdldE5hdGl2ZUdldERhdGFiYXNlTmFtZXNGbihpbmRleGVkREIpLFxuICAgICAgICBoYXNHZXRBbGw7XG5cbiAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAvLyBEZWZhdWx0IHN1YnNjcmliZXJzIHRvIFwidmVyc2lvbmNoYW5nZVwiIGFuZCBcImJsb2NrZWRcIi5cbiAgICAgICAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgY3VzdG9tIGhhbmRsZXJzLiBJZiBjdXN0b20gaGFuZGxlcnMgcmV0dXJuIGZhbHNlLCB0aGVzZSBkZWZhdWx0XG4gICAgICAgIC8vIGJlaGF2aW91cnMgd2lsbCBiZSBwcmV2ZW50ZWQuXG4gICAgICAgIGRiLm9uKFwidmVyc2lvbmNoYW5nZVwiLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgZm9yIHZlcnNpb25jaGFuZ2UgZXZlbnQgaXMgdG8gY2xvc2UgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAgICAgICAgICAgIC8vIENhbGxlciBjYW4gb3ZlcnJpZGUgdGhpcyBiZWhhdmlvciBieSBkb2luZyBkYi5vbihcInZlcnNpb25jaGFuZ2VcIiwgZnVuY3Rpb24oKXsgcmV0dXJuIGZhbHNlOyB9KTtcbiAgICAgICAgICAgIC8vIExldCdzIG5vdCBibG9jayB0aGUgb3RoZXIgd2luZG93IGZyb20gbWFraW5nIGl0J3MgZGVsZXRlKCkgb3Igb3BlbigpIGNhbGwuXG4gICAgICAgICAgICAvLyBOT1RFISBUaGlzIGV2ZW50IGlzIG5ldmVyIGZpcmVkIGluIElFLEVkZ2Ugb3IgU2FmYXJpLlxuICAgICAgICAgICAgaWYgKGV2Lm5ld1ZlcnNpb24gPiAwKSBjb25zb2xlLndhcm4oJ0Fub3RoZXIgY29ubmVjdGlvbiB3YW50cyB0byB1cGdyYWRlIGRhdGFiYXNlIFxcJycgKyBkYi5uYW1lICsgJ1xcJy4gQ2xvc2luZyBkYiBub3cgdG8gcmVzdW1lIHRoZSB1cGdyYWRlLicpO2Vsc2UgY29uc29sZS53YXJuKCdBbm90aGVyIGNvbm5lY3Rpb24gd2FudHMgdG8gZGVsZXRlIGRhdGFiYXNlIFxcJycgKyBkYi5uYW1lICsgJ1xcJy4gQ2xvc2luZyBkYiBub3cgdG8gcmVzdW1lIHRoZSBkZWxldGUgcmVxdWVzdC4nKTtcbiAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAvLyBJbiBtYW55IHdlYiBhcHBsaWNhdGlvbnMsIGl0IHdvdWxkIGJlIHJlY29tbWVuZGVkIHRvIGZvcmNlIHdpbmRvdy5yZWxvYWQoKVxuICAgICAgICAgICAgLy8gd2hlbiB0aGlzIGV2ZW50IG9jY3Vycy4gVG8gZG8gdGhhdCwgc3Vic2NyaWJlIHRvIHRoZSB2ZXJzaW9uY2hhbmdlIGV2ZW50XG4gICAgICAgICAgICAvLyBhbmQgY2FsbCB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpIGlmIGV2Lm5ld1ZlcnNpb24gPiAwIChub3QgYSBkZWxldGlvbilcbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB5b3VyIGN1cnJlbnQgd2ViIGFwcCBvYnZpb3VzbHkgaGFzIG9sZCBzY2hlbWEgY29kZSB0aGF0IG5lZWRzXG4gICAgICAgICAgICAvLyB0byBiZSB1cGRhdGVkLiBBbm90aGVyIHdpbmRvdyBnb3QgYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBhcHAgYW5kIG5lZWRzIHRvIHVwZ3JhZGUgREIgYnV0XG4gICAgICAgICAgICAvLyB5b3VyIHdpbmRvdyBpcyBibG9ja2luZyBpdCB1bmxlc3Mgd2UgY2xvc2UgaXQgaGVyZS5cbiAgICAgICAgfSk7XG4gICAgICAgIGRiLm9uKFwiYmxvY2tlZFwiLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgIGlmICghZXYubmV3VmVyc2lvbiB8fCBldi5uZXdWZXJzaW9uIDwgZXYub2xkVmVyc2lvbikgY29uc29sZS53YXJuKCdEZXhpZS5kZWxldGUoXFwnJyArIGRiLm5hbWUgKyAnXFwnKSB3YXMgYmxvY2tlZCcpO2Vsc2UgY29uc29sZS53YXJuKCdVcGdyYWRlIFxcJycgKyBkYi5uYW1lICsgJ1xcJyBibG9ja2VkIGJ5IG90aGVyIGNvbm5lY3Rpb24gaG9sZGluZyB2ZXJzaW9uICcgKyBldi5vbGRWZXJzaW9uIC8gMTApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZlcnNpb25pbmcgRnJhbWV3b3JrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG5cbiAgICB0aGlzLnZlcnNpb24gPSBmdW5jdGlvbiAodmVyc2lvbk51bWJlcikge1xuICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJ2ZXJzaW9uTnVtYmVyXCIgdHlwZT1cIk51bWJlclwiPjwvcGFyYW0+XG4gICAgICAgIC8vLyA8cmV0dXJucyB0eXBlPVwiVmVyc2lvblwiPjwvcmV0dXJucz5cbiAgICAgICAgaWYgKGlkYmRiIHx8IGlzQmVpbmdPcGVuZWQpIHRocm93IG5ldyBleGNlcHRpb25zLlNjaGVtYShcIkNhbm5vdCBhZGQgdmVyc2lvbiB3aGVuIGRhdGFiYXNlIGlzIG9wZW5cIik7XG4gICAgICAgIHRoaXMudmVybm8gPSBNYXRoLm1heCh0aGlzLnZlcm5vLCB2ZXJzaW9uTnVtYmVyKTtcbiAgICAgICAgdmFyIHZlcnNpb25JbnN0YW5jZSA9IHZlcnNpb25zLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgcmV0dXJuIHYuX2NmZy52ZXJzaW9uID09PSB2ZXJzaW9uTnVtYmVyO1xuICAgICAgICB9KVswXTtcbiAgICAgICAgaWYgKHZlcnNpb25JbnN0YW5jZSkgcmV0dXJuIHZlcnNpb25JbnN0YW5jZTtcbiAgICAgICAgdmVyc2lvbkluc3RhbmNlID0gbmV3IFZlcnNpb24odmVyc2lvbk51bWJlcik7XG4gICAgICAgIHZlcnNpb25zLnB1c2godmVyc2lvbkluc3RhbmNlKTtcbiAgICAgICAgdmVyc2lvbnMuc29ydChsb3dlclZlcnNpb25GaXJzdCk7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uSW5zdGFuY2U7XG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIFZlcnNpb24odmVyc2lvbk51bWJlcikge1xuICAgICAgICB0aGlzLl9jZmcgPSB7XG4gICAgICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uTnVtYmVyLFxuICAgICAgICAgICAgc3RvcmVzU291cmNlOiBudWxsLFxuICAgICAgICAgICAgZGJzY2hlbWE6IHt9LFxuICAgICAgICAgICAgdGFibGVzOiB7fSxcbiAgICAgICAgICAgIGNvbnRlbnRVcGdyYWRlOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc3RvcmVzKHt9KTsgLy8gRGVyaXZlIGVhcmxpZXIgc2NoZW1hcyBieSBkZWZhdWx0LlxuICAgIH1cblxuICAgIGV4dGVuZChWZXJzaW9uLnByb3RvdHlwZSwge1xuICAgICAgICBzdG9yZXM6IGZ1bmN0aW9uIChzdG9yZXMpIHtcbiAgICAgICAgICAgIC8vLyA8c3VtbWFyeT5cbiAgICAgICAgICAgIC8vLyAgIERlZmluZXMgdGhlIHNjaGVtYSBmb3IgYSBwYXJ0aWN1bGFyIHZlcnNpb25cbiAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+XG4gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJzdG9yZXNcIiB0eXBlPVwiT2JqZWN0XCI+XG4gICAgICAgICAgICAvLy8gRXhhbXBsZTogPGJyLz5cbiAgICAgICAgICAgIC8vLyAgIHt1c2VyczogXCJpZCsrLGZpcnN0LGxhc3QsJmFtcDt1c2VybmFtZSwqZW1haWxcIiwgPGJyLz5cbiAgICAgICAgICAgIC8vLyAgIHBhc3N3b3JkczogXCJpZCsrLCZhbXA7dXNlcm5hbWVcIn08YnIvPlxuICAgICAgICAgICAgLy8vIDxici8+XG4gICAgICAgICAgICAvLy8gU3ludGF4OiB7VGFibGU6IFwiW3ByaW1hcnlLZXldWysrXSxbJmFtcDtdWypdaW5kZXgxLFsmYW1wO11bKl1pbmRleDIsLi4uXCJ9PGJyLz48YnIvPlxuICAgICAgICAgICAgLy8vIFNwZWNpYWwgY2hhcmFjdGVyczo8YnIvPlxuICAgICAgICAgICAgLy8vICBcIiZhbXA7XCIgIG1lYW5zIHVuaXF1ZSBrZXksIDxici8+XG4gICAgICAgICAgICAvLy8gIFwiKlwiICBtZWFucyB2YWx1ZSBpcyBtdWx0aUVudHJ5LCA8YnIvPlxuICAgICAgICAgICAgLy8vICBcIisrXCIgbWVhbnMgYXV0by1pbmNyZW1lbnQgYW5kIG9ubHkgYXBwbGljYWJsZSBmb3IgcHJpbWFyeSBrZXkgPGJyLz5cbiAgICAgICAgICAgIC8vLyA8L3BhcmFtPlxuICAgICAgICAgICAgdGhpcy5fY2ZnLnN0b3Jlc1NvdXJjZSA9IHRoaXMuX2NmZy5zdG9yZXNTb3VyY2UgPyBleHRlbmQodGhpcy5fY2ZnLnN0b3Jlc1NvdXJjZSwgc3RvcmVzKSA6IHN0b3JlcztcblxuICAgICAgICAgICAgLy8gRGVyaXZlIHN0b3JlcyBmcm9tIGVhcmxpZXIgdmVyc2lvbnMgaWYgdGhleSBhcmUgbm90IGV4cGxpY2l0ZWx5IHNwZWNpZmllZCBhcyBudWxsIG9yIGEgbmV3IHN5bnRheC5cbiAgICAgICAgICAgIHZhciBzdG9yZXNTcGVjID0ge307XG4gICAgICAgICAgICB2ZXJzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgLy8gJ3ZlcnNpb25zJyBpcyBhbHdheXMgc29ydGVkIGJ5IGxvd2VzdCB2ZXJzaW9uIGZpcnN0LlxuICAgICAgICAgICAgICAgIGV4dGVuZChzdG9yZXNTcGVjLCB2ZXJzaW9uLl9jZmcuc3RvcmVzU291cmNlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgZGJzY2hlbWEgPSB0aGlzLl9jZmcuZGJzY2hlbWEgPSB7fTtcbiAgICAgICAgICAgIHRoaXMuX3BhcnNlU3RvcmVzU3BlYyhzdG9yZXNTcGVjLCBkYnNjaGVtYSk7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGxhdGVzdCBzY2hlbWEgdG8gdGhpcyB2ZXJzaW9uXG4gICAgICAgICAgICAvLyBVcGRhdGUgQVBJXG4gICAgICAgICAgICBnbG9iYWxTY2hlbWEgPSBkYi5fZGJTY2hlbWEgPSBkYnNjaGVtYTtcbiAgICAgICAgICAgIHJlbW92ZVRhYmxlc0FwaShbYWxsVGFibGVzLCBkYiwgVHJhbnNhY3Rpb24ucHJvdG90eXBlXSk7XG4gICAgICAgICAgICBzZXRBcGlPblBsYWNlKFthbGxUYWJsZXMsIGRiLCBUcmFuc2FjdGlvbi5wcm90b3R5cGUsIHRoaXMuX2NmZy50YWJsZXNdLCBrZXlzKGRic2NoZW1hKSwgUkVBRFdSSVRFLCBkYnNjaGVtYSk7XG4gICAgICAgICAgICBkYlN0b3JlTmFtZXMgPSBrZXlzKGRic2NoZW1hKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICB1cGdyYWRlOiBmdW5jdGlvbiAodXBncmFkZUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJ1cGdyYWRlRnVuY3Rpb25cIiBvcHRpb25hbD1cInRydWVcIj5GdW5jdGlvbiB0aGF0IHBlcmZvcm1zIHVwZ3JhZGluZyBhY3Rpb25zLjwvcGFyYW0+XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICBmYWtlQXV0b0NvbXBsZXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB1cGdyYWRlRnVuY3Rpb24oZGIuX2NyZWF0ZVRyYW5zYWN0aW9uKFJFQURXUklURSwga2V5cyhzZWxmLl9jZmcuZGJzY2hlbWEpLCBzZWxmLl9jZmcuZGJzY2hlbWEpKTsgLy8gQlVHQlVHOiBObyBjb2RlIGNvbXBsZXRpb24gZm9yIHByZXYgdmVyc2lvbidzIHRhYmxlcyB3b250IGFwcGVhci5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fY2ZnLmNvbnRlbnRVcGdyYWRlID0gdXBncmFkZUZ1bmN0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIF9wYXJzZVN0b3Jlc1NwZWM6IGZ1bmN0aW9uIChzdG9yZXMsIG91dFNjaGVtYSkge1xuICAgICAgICAgICAga2V5cyhzdG9yZXMpLmZvckVhY2goZnVuY3Rpb24gKHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdG9yZXNbdGFibGVOYW1lXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5zdGFuY2VUZW1wbGF0ZSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXhlcyA9IHBhcnNlSW5kZXhTeW50YXgoc3RvcmVzW3RhYmxlTmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJpbUtleSA9IGluZGV4ZXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByaW1LZXkubXVsdGkpIHRocm93IG5ldyBleGNlcHRpb25zLlNjaGVtYShcIlByaW1hcnkga2V5IGNhbm5vdCBiZSBtdWx0aS12YWx1ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmltS2V5LmtleVBhdGgpIHNldEJ5S2V5UGF0aChpbnN0YW5jZVRlbXBsYXRlLCBwcmltS2V5LmtleVBhdGgsIHByaW1LZXkuYXV0byA/IDAgOiBwcmltS2V5LmtleVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVzLmZvckVhY2goZnVuY3Rpb24gKGlkeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeC5hdXRvKSB0aHJvdyBuZXcgZXhjZXB0aW9ucy5TY2hlbWEoXCJPbmx5IHByaW1hcnkga2V5IGNhbiBiZSBtYXJrZWQgYXMgYXV0b0luY3JlbWVudCAoKyspXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZHgua2V5UGF0aCkgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuU2NoZW1hKFwiSW5kZXggbXVzdCBoYXZlIGEgbmFtZSBhbmQgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEJ5S2V5UGF0aChpbnN0YW5jZVRlbXBsYXRlLCBpZHgua2V5UGF0aCwgaWR4LmNvbXBvdW5kID8gaWR4LmtleVBhdGgubWFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBvdXRTY2hlbWFbdGFibGVOYW1lXSA9IG5ldyBUYWJsZVNjaGVtYSh0YWJsZU5hbWUsIHByaW1LZXksIGluZGV4ZXMsIGluc3RhbmNlVGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBydW5VcGdyYWRlcnMob2xkVmVyc2lvbiwgaWRidHJhbnMsIHJlamVjdCkge1xuICAgICAgICB2YXIgdHJhbnMgPSBkYi5fY3JlYXRlVHJhbnNhY3Rpb24oUkVBRFdSSVRFLCBkYlN0b3JlTmFtZXMsIGdsb2JhbFNjaGVtYSk7XG4gICAgICAgIHRyYW5zLmNyZWF0ZShpZGJ0cmFucyk7XG4gICAgICAgIHRyYW5zLl9jb21wbGV0aW9uLmNhdGNoKHJlamVjdCk7XG4gICAgICAgIHZhciByZWplY3RUcmFuc2FjdGlvbiA9IHRyYW5zLl9yZWplY3QuYmluZCh0cmFucyk7XG4gICAgICAgIG5ld1Njb3BlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFBTRC50cmFucyA9IHRyYW5zO1xuICAgICAgICAgICAgaWYgKG9sZFZlcnNpb24gPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGFibGVzOlxuICAgICAgICAgICAgICAgIGtleXMoZ2xvYmFsU2NoZW1hKS5mb3JFYWNoKGZ1bmN0aW9uICh0YWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlVGFibGUoaWRidHJhbnMsIHRhYmxlTmFtZSwgZ2xvYmFsU2NoZW1hW3RhYmxlTmFtZV0ucHJpbUtleSwgZ2xvYmFsU2NoZW1hW3RhYmxlTmFtZV0uaW5kZXhlcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgUHJvbWlzZS5mb2xsb3coZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGIub24ucG9wdWxhdGUuZmlyZSh0cmFucyk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2gocmVqZWN0VHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgfSBlbHNlIHVwZGF0ZVRhYmxlc0FuZEluZGV4ZXMob2xkVmVyc2lvbiwgdHJhbnMsIGlkYnRyYW5zKS5jYXRjaChyZWplY3RUcmFuc2FjdGlvbik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZVRhYmxlc0FuZEluZGV4ZXMob2xkVmVyc2lvbiwgdHJhbnMsIGlkYnRyYW5zKSB7XG4gICAgICAgIC8vIFVwZ3JhZGUgdmVyc2lvbiB0byB2ZXJzaW9uLCBzdGVwLWJ5LXN0ZXAgZnJvbSBvbGRlc3QgdG8gbmV3ZXN0IHZlcnNpb24uXG4gICAgICAgIC8vIEVhY2ggdHJhbnNhY3Rpb24gb2JqZWN0IHdpbGwgY29udGFpbiB0aGUgdGFibGUgc2V0IHRoYXQgd2FzIGN1cnJlbnQgaW4gdGhhdCB2ZXJzaW9uIChidXQgYWxzbyBub3QteWV0LWRlbGV0ZWQgdGFibGVzIGZyb20gaXRzIHByZXZpb3VzIHZlcnNpb24pXG4gICAgICAgIHZhciBxdWV1ZSA9IFtdO1xuICAgICAgICB2YXIgb2xkVmVyc2lvblN0cnVjdCA9IHZlcnNpb25zLmZpbHRlcihmdW5jdGlvbiAodmVyc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24uX2NmZy52ZXJzaW9uID09PSBvbGRWZXJzaW9uO1xuICAgICAgICB9KVswXTtcbiAgICAgICAgaWYgKCFvbGRWZXJzaW9uU3RydWN0KSB0aHJvdyBuZXcgZXhjZXB0aW9ucy5VcGdyYWRlKFwiRGV4aWUgc3BlY2lmaWNhdGlvbiBvZiBjdXJyZW50bHkgaW5zdGFsbGVkIERCIHZlcnNpb24gaXMgbWlzc2luZ1wiKTtcbiAgICAgICAgZ2xvYmFsU2NoZW1hID0gZGIuX2RiU2NoZW1hID0gb2xkVmVyc2lvblN0cnVjdC5fY2ZnLmRic2NoZW1hO1xuICAgICAgICB2YXIgYW55Q29udGVudFVwZ3JhZGVySGFzUnVuID0gZmFsc2U7XG5cbiAgICAgICAgdmFyIHZlcnNUb1J1biA9IHZlcnNpb25zLmZpbHRlcihmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgcmV0dXJuIHYuX2NmZy52ZXJzaW9uID4gb2xkVmVyc2lvbjtcbiAgICAgICAgfSk7XG4gICAgICAgIHZlcnNUb1J1bi5mb3JFYWNoKGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJ2ZXJzaW9uXCIgdHlwZT1cIlZlcnNpb25cIj48L3BhcmFtPlxuICAgICAgICAgICAgcXVldWUucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG9sZFNjaGVtYSA9IGdsb2JhbFNjaGVtYTtcbiAgICAgICAgICAgICAgICB2YXIgbmV3U2NoZW1hID0gdmVyc2lvbi5fY2ZnLmRic2NoZW1hO1xuICAgICAgICAgICAgICAgIGFkanVzdFRvRXhpc3RpbmdJbmRleE5hbWVzKG9sZFNjaGVtYSwgaWRidHJhbnMpO1xuICAgICAgICAgICAgICAgIGFkanVzdFRvRXhpc3RpbmdJbmRleE5hbWVzKG5ld1NjaGVtYSwgaWRidHJhbnMpO1xuICAgICAgICAgICAgICAgIGdsb2JhbFNjaGVtYSA9IGRiLl9kYlNjaGVtYSA9IG5ld1NjaGVtYTtcbiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IGdldFNjaGVtYURpZmYob2xkU2NoZW1hLCBuZXdTY2hlbWEpO1xuICAgICAgICAgICAgICAgIC8vIEFkZCB0YWJsZXMgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGRpZmYuYWRkLmZvckVhY2goZnVuY3Rpb24gKHR1cGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRhYmxlKGlkYnRyYW5zLCB0dXBsZVswXSwgdHVwbGVbMV0ucHJpbUtleSwgdHVwbGVbMV0uaW5kZXhlcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHRhYmxlc1xuICAgICAgICAgICAgICAgIGRpZmYuY2hhbmdlLmZvckVhY2goZnVuY3Rpb24gKGNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLnJlY3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9ucy5VcGdyYWRlKFwiTm90IHlldCBzdXBwb3J0IGZvciBjaGFuZ2luZyBwcmltYXJ5IGtleVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZSA9IGlkYnRyYW5zLm9iamVjdFN0b3JlKGNoYW5nZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBpbmRleGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuYWRkLmZvckVhY2goZnVuY3Rpb24gKGlkeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEluZGV4KHN0b3JlLCBpZHgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgaW5kZXhlc1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlLmNoYW5nZS5mb3JFYWNoKGZ1bmN0aW9uIChpZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5kZWxldGVJbmRleChpZHgubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkSW5kZXgoc3RvcmUsIGlkeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBpbmRleGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuZGVsLmZvckVhY2goZnVuY3Rpb24gKGlkeE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5kZWxldGVJbmRleChpZHhOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24uX2NmZy5jb250ZW50VXBncmFkZSkge1xuICAgICAgICAgICAgICAgICAgICBhbnlDb250ZW50VXBncmFkZXJIYXNSdW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5mb2xsb3coZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi5fY2ZnLmNvbnRlbnRVcGdyYWRlKHRyYW5zKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBxdWV1ZS5wdXNoKGZ1bmN0aW9uIChpZGJ0cmFucykge1xuICAgICAgICAgICAgICAgIGlmICghYW55Q29udGVudFVwZ3JhZGVySGFzUnVuIHx8ICFoYXNJRURlbGV0ZU9iamVjdFN0b3JlQnVnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbnQgZGVsZXRlIG9sZCB0YWJsZXMgaWYgaWVCdWcgaXMgcHJlc2VudCBhbmQgYSBjb250ZW50IHVwZ3JhZGVyIGhhcyBydW4uIExldCB0YWJsZXMgYmUgbGVmdCBpbiBEQiBzbyBmYXIuIFRoaXMgbmVlZHMgdG8gYmUgdGFrZW4gY2FyZSBvZi5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1NjaGVtYSA9IHZlcnNpb24uX2NmZy5kYnNjaGVtYTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGVsZXRlIG9sZCB0YWJsZXNcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlUmVtb3ZlZFRhYmxlcyhuZXdTY2hlbWEsIGlkYnRyYW5zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTm93LCBjcmVhdGUgYSBxdWV1ZSBleGVjdXRpb24gZW5naW5lXG4gICAgICAgIGZ1bmN0aW9uIHJ1blF1ZXVlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHF1ZXVlLmxlbmd0aCA/IFByb21pc2UucmVzb2x2ZShxdWV1ZS5zaGlmdCgpKHRyYW5zLmlkYnRyYW5zKSkudGhlbihydW5RdWV1ZSkgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBydW5RdWV1ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY3JlYXRlTWlzc2luZ1RhYmxlcyhnbG9iYWxTY2hlbWEsIGlkYnRyYW5zKTsgLy8gQXQgbGFzdCwgbWFrZSBzdXJlIHRvIGNyZWF0ZSBhbnkgbWlzc2luZyB0YWJsZXMuIChOZWVkZWQgYnkgYWRkb25zIHRoYXQgYWRkIHN0b3JlcyB0byBEQiB3aXRob3V0IHNwZWNpZnlpbmcgdmVyc2lvbilcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2NoZW1hRGlmZihvbGRTY2hlbWEsIG5ld1NjaGVtYSkge1xuICAgICAgICB2YXIgZGlmZiA9IHtcbiAgICAgICAgICAgIGRlbDogW10sIC8vIEFycmF5IG9mIHRhYmxlIG5hbWVzXG4gICAgICAgICAgICBhZGQ6IFtdLCAvLyBBcnJheSBvZiBbdGFibGVOYW1lLCBuZXdEZWZpbml0aW9uXVxuICAgICAgICAgICAgY2hhbmdlOiBbXSAvLyBBcnJheSBvZiB7bmFtZTogdGFibGVOYW1lLCByZWNyZWF0ZTogbmV3RGVmaW5pdGlvbiwgZGVsOiBkZWxJbmRleE5hbWVzLCBhZGQ6IG5ld0luZGV4RGVmcywgY2hhbmdlOiBjaGFuZ2VkSW5kZXhEZWZzfVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKHZhciB0YWJsZSBpbiBvbGRTY2hlbWEpIHtcbiAgICAgICAgICAgIGlmICghbmV3U2NoZW1hW3RhYmxlXSkgZGlmZi5kZWwucHVzaCh0YWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh0YWJsZSBpbiBuZXdTY2hlbWEpIHtcbiAgICAgICAgICAgIHZhciBvbGREZWYgPSBvbGRTY2hlbWFbdGFibGVdLFxuICAgICAgICAgICAgICAgIG5ld0RlZiA9IG5ld1NjaGVtYVt0YWJsZV07XG4gICAgICAgICAgICBpZiAoIW9sZERlZikge1xuICAgICAgICAgICAgICAgIGRpZmYuYWRkLnB1c2goW3RhYmxlLCBuZXdEZWZdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGNoYW5nZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGFibGUsXG4gICAgICAgICAgICAgICAgICAgIGRlZjogbmV3RGVmLFxuICAgICAgICAgICAgICAgICAgICByZWNyZWF0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRlbDogW10sXG4gICAgICAgICAgICAgICAgICAgIGFkZDogW10sXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZTogW11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChvbGREZWYucHJpbUtleS5zcmMgIT09IG5ld0RlZi5wcmltS2V5LnNyYykge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmltYXJ5IGtleSBoYXMgY2hhbmdlZC4gUmVtb3ZlIGFuZCByZS1hZGQgdGFibGUuXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5yZWNyZWF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGRpZmYuY2hhbmdlLnB1c2goY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHByaW1hcnkga2V5LiBKdXN0IGZpbmQgb3V0IHdoYXQgZGlmZmVyczpcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9sZEluZGV4ZXMgPSBvbGREZWYuaWR4QnlOYW1lO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmV3SW5kZXhlcyA9IG5ld0RlZi5pZHhCeU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlkeE5hbWUgaW4gb2xkSW5kZXhlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdJbmRleGVzW2lkeE5hbWVdKSBjaGFuZ2UuZGVsLnB1c2goaWR4TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yIChpZHhOYW1lIGluIG5ld0luZGV4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvbGRJZHggPSBvbGRJbmRleGVzW2lkeE5hbWVdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lkeCA9IG5ld0luZGV4ZXNbaWR4TmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9sZElkeCkgY2hhbmdlLmFkZC5wdXNoKG5ld0lkeCk7ZWxzZSBpZiAob2xkSWR4LnNyYyAhPT0gbmV3SWR4LnNyYykgY2hhbmdlLmNoYW5nZS5wdXNoKG5ld0lkeCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5kZWwubGVuZ3RoID4gMCB8fCBjaGFuZ2UuYWRkLmxlbmd0aCA+IDAgfHwgY2hhbmdlLmNoYW5nZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaWZmLmNoYW5nZS5wdXNoKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVGFibGUoaWRidHJhbnMsIHRhYmxlTmFtZSwgcHJpbUtleSwgaW5kZXhlcykge1xuICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJpZGJ0cmFuc1wiIHR5cGU9XCJJREJUcmFuc2FjdGlvblwiPjwvcGFyYW0+XG4gICAgICAgIHZhciBzdG9yZSA9IGlkYnRyYW5zLmRiLmNyZWF0ZU9iamVjdFN0b3JlKHRhYmxlTmFtZSwgcHJpbUtleS5rZXlQYXRoID8geyBrZXlQYXRoOiBwcmltS2V5LmtleVBhdGgsIGF1dG9JbmNyZW1lbnQ6IHByaW1LZXkuYXV0byB9IDogeyBhdXRvSW5jcmVtZW50OiBwcmltS2V5LmF1dG8gfSk7XG4gICAgICAgIGluZGV4ZXMuZm9yRWFjaChmdW5jdGlvbiAoaWR4KSB7XG4gICAgICAgICAgICBhZGRJbmRleChzdG9yZSwgaWR4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzdG9yZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVNaXNzaW5nVGFibGVzKG5ld1NjaGVtYSwgaWRidHJhbnMpIHtcbiAgICAgICAga2V5cyhuZXdTY2hlbWEpLmZvckVhY2goZnVuY3Rpb24gKHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgaWYgKCFpZGJ0cmFucy5kYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVUYWJsZShpZGJ0cmFucywgdGFibGVOYW1lLCBuZXdTY2hlbWFbdGFibGVOYW1lXS5wcmltS2V5LCBuZXdTY2hlbWFbdGFibGVOYW1lXS5pbmRleGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVsZXRlUmVtb3ZlZFRhYmxlcyhuZXdTY2hlbWEsIGlkYnRyYW5zKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRidHJhbnMuZGIub2JqZWN0U3RvcmVOYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgdmFyIHN0b3JlTmFtZSA9IGlkYnRyYW5zLmRiLm9iamVjdFN0b3JlTmFtZXNbaV07XG4gICAgICAgICAgICBpZiAobmV3U2NoZW1hW3N0b3JlTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlkYnRyYW5zLmRiLmRlbGV0ZU9iamVjdFN0b3JlKHN0b3JlTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRJbmRleChzdG9yZSwgaWR4KSB7XG4gICAgICAgIHN0b3JlLmNyZWF0ZUluZGV4KGlkeC5uYW1lLCBpZHgua2V5UGF0aCwgeyB1bmlxdWU6IGlkeC51bmlxdWUsIG11bHRpRW50cnk6IGlkeC5tdWx0aSB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYlVuY2F1Z2h0KGVycikge1xuICAgICAgICByZXR1cm4gZGIub24uZXJyb3IuZmlyZShlcnIpO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICAvLyAgICAgIERleGllIFByb3RlY3RlZCBBUElcbiAgICAvL1xuICAgIC8vXG5cbiAgICB0aGlzLl9hbGxUYWJsZXMgPSBhbGxUYWJsZXM7XG5cbiAgICB0aGlzLl90YWJsZUZhY3RvcnkgPSBmdW5jdGlvbiBjcmVhdGVUYWJsZShtb2RlLCB0YWJsZVNjaGVtYSkge1xuICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJ0YWJsZVNjaGVtYVwiIHR5cGU9XCJUYWJsZVNjaGVtYVwiPjwvcGFyYW0+XG4gICAgICAgIGlmIChtb2RlID09PSBSRUFET05MWSkgcmV0dXJuIG5ldyBUYWJsZSh0YWJsZVNjaGVtYS5uYW1lLCB0YWJsZVNjaGVtYSwgQ29sbGVjdGlvbik7ZWxzZSByZXR1cm4gbmV3IFdyaXRlYWJsZVRhYmxlKHRhYmxlU2NoZW1hLm5hbWUsIHRhYmxlU2NoZW1hKTtcbiAgICB9O1xuXG4gICAgdGhpcy5fY3JlYXRlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAobW9kZSwgc3RvcmVOYW1lcywgZGJzY2hlbWEsIHBhcmVudFRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24obW9kZSwgc3RvcmVOYW1lcywgZGJzY2hlbWEsIHBhcmVudFRyYW5zYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgLyogR2VuZXJhdGUgYSB0ZW1wb3JhcnkgdHJhbnNhY3Rpb24gd2hlbiBkYiBvcGVyYXRpb25zIGFyZSBkb25lIG91dHNpZGUgYSB0cmFuc2FjdGlubyBzY29wZS5cclxuICAgICovXG4gICAgZnVuY3Rpb24gdGVtcFRyYW5zYWN0aW9uKG1vZGUsIHN0b3JlTmFtZXMsIGZuKSB7XG4gICAgICAgIC8vIExhc3QgYXJndW1lbnQgaXMgXCJ3cml0ZUxvY2tlZFwiLiBCdXQgdGhpcyBkb2VzbnQgYXBwbHkgdG8gb25lc2hvdCBkaXJlY3QgZGIgb3BlcmF0aW9ucywgc28gd2UgaWdub3JlIGl0LlxuICAgICAgICBpZiAoIW9wZW5Db21wbGV0ZSAmJiAhUFNELmxldFRocm91Z2gpIHtcbiAgICAgICAgICAgIGlmICghaXNCZWluZ09wZW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICghYXV0b09wZW4pIHJldHVybiByZWplY3Rpb24obmV3IGV4Y2VwdGlvbnMuRGF0YWJhc2VDbG9zZWQoKSwgZGJVbmNhdWdodCk7XG4gICAgICAgICAgICAgICAgZGIub3BlbigpLmNhdGNoKG5vcCk7IC8vIE9wZW4gaW4gYmFja2dyb3VuZC4gSWYgaWYgZmFpbHMsIGl0IHdpbGwgYmUgY2F0Y2hlZCBieSB0aGUgZmluYWwgcHJvbWlzZSBhbnl3YXkuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGJSZWFkeVByb21pc2UudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBUcmFuc2FjdGlvbihtb2RlLCBzdG9yZU5hbWVzLCBmbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciB0cmFucyA9IGRiLl9jcmVhdGVUcmFuc2FjdGlvbihtb2RlLCBzdG9yZU5hbWVzLCBnbG9iYWxTY2hlbWEpO1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zLl9wcm9taXNlKG1vZGUsIGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICBuZXdTY29wZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE9QVElNSVpBVElPTiBQT1NTSUJMRT8gbmV3U2NvcGUoKSBub3QgbmVlZGVkIGJlY2F1c2UgaXQncyBhbHJlYWR5IGRvbmUgaW4gX3Byb21pc2UuXG4gICAgICAgICAgICAgICAgICAgIFBTRC50cmFucyA9IHRyYW5zO1xuICAgICAgICAgICAgICAgICAgICBmbihyZXNvbHZlLCByZWplY3QsIHRyYW5zKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIC8vIEluc3RlYWQgb2YgcmVzb2x2aW5nIHZhbHVlIGRpcmVjdGx5LCB3YWl0IHdpdGggcmVzb2x2aW5nIGl0IHVudGlsIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBkYXRhIHdvdWxkIG5vdCBiZSBpbiB0aGUgREIgaWYgcmVxdWVzdGluZyBpdCBpbiB0aGUgdGhlbigpIG9wZXJhdGlvbi5cbiAgICAgICAgICAgICAgICAvLyBTcGVjaWZpY2FsbHksIHRvIGVuc3VyZSB0aGF0IHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiB3aWxsIHdvcms6XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyAgIGRiLmZyaWVuZHMucHV0KHtuYW1lOiBcIkFybmVcIn0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgIGRiLmZyaWVuZHMud2hlcmUoXCJuYW1lXCIpLmVxdWFscyhcIkFybmVcIikuY291bnQoZnVuY3Rpb24oY291bnQpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgYXNzZXJ0IChjb3VudCA9PT0gMSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gICB9KTtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFucy5fY29tcGxldGlvbi50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pOyAvKi5jYXRjaChlcnIgPT4geyAvLyBEb24ndCBkbyB0aGlzIGFzIG9mIG5vdy4gSWYgd291bGQgYWZmZWN0IGJ1bGstIGFuZCBtb2RpZnkgbWV0aG9kcyBpbiBhIHdheSB0aGF0IGNvdWxkIGJlIG1vcmUgaW50dWl0aXZlLiBCdXQgd2FpdCEgTWF5YmUgY2hhbmdlIGluIG5leHQgbWFqb3IuXHJcbiAgICAgICAgICAgICAgICAgdHJhbnMuX3JlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgIHJldHVybiByZWplY3Rpb24oZXJyKTtcclxuICAgICAgICAgICAgICAgIH0pOyovXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl93aGVuUmVhZHkgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZha2UgfHwgb3BlbkNvbXBsZXRlIHx8IFBTRC5sZXRUaHJvdWdoID8gZm4gOiBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICBpZiAoIWlzQmVpbmdPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWF1dG9PcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgZXhjZXB0aW9ucy5EYXRhYmFzZUNsb3NlZCgpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYi5vcGVuKCkuY2F0Y2gobm9wKTsgLy8gT3BlbiBpbiBiYWNrZ3JvdW5kLiBJZiBpZiBmYWlscywgaXQgd2lsbCBiZSBjYXRjaGVkIGJ5IHRoZSBmaW5hbCBwcm9taXNlIGFueXdheS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRiUmVhZHlQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGZuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkudW5jYXVnaHQoZGJVbmNhdWdodCk7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy8gICAgICBEZXhpZSBBUElcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cblxuICAgIHRoaXMudmVybm8gPSAwO1xuXG4gICAgdGhpcy5vcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNCZWluZ09wZW5lZCB8fCBpZGJkYikgcmV0dXJuIGRiUmVhZHlQcm9taXNlLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGRiT3BlbkVycm9yID8gcmVqZWN0aW9uKGRiT3BlbkVycm9yLCBkYlVuY2F1Z2h0KSA6IGRiO1xuICAgICAgICB9KTtcbiAgICAgICAgZGVidWcgJiYgKG9wZW5DYW5jZWxsZXIuX3N0YWNrSG9sZGVyID0gZ2V0RXJyb3JXaXRoU3RhY2soKSk7IC8vIExldCBzdGFja3MgcG9pbnQgdG8gd2hlbiBvcGVuKCkgd2FzIGNhbGxlZCByYXRoZXIgdGhhbiB3aGVyZSBuZXcgRGV4aWUoKSB3YXMgY2FsbGVkLlxuICAgICAgICBpc0JlaW5nT3BlbmVkID0gdHJ1ZTtcbiAgICAgICAgZGJPcGVuRXJyb3IgPSBudWxsO1xuICAgICAgICBvcGVuQ29tcGxldGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBGdW5jdGlvbiBwb2ludGVycyB0byBjYWxsIHdoZW4gdGhlIGNvcmUgb3BlbmluZyBwcm9jZXNzIGNvbXBsZXRlcy5cbiAgICAgICAgdmFyIHJlc29sdmVEYlJlYWR5ID0gZGJSZWFkeVJlc29sdmUsXG5cbiAgICAgICAgLy8gdXBncmFkZVRyYW5zYWN0aW9uIHRvIGFib3J0IG9uIGZhaWx1cmUuXG4gICAgICAgIHVwZ3JhZGVUcmFuc2FjdGlvbiA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmFjZShbb3BlbkNhbmNlbGxlciwgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgZG9GYWtlQXV0b0NvbXBsZXRlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBjYWxsZXIgaGFzIHNwZWNpZmllZCBhdCBsZWFzdCBvbmUgdmVyc2lvblxuICAgICAgICAgICAgaWYgKHZlcnNpb25zLmxlbmd0aCA+IDApIGF1dG9TY2hlbWEgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gTXVsdGlwbHkgZGIudmVybm8gd2l0aCAxMCB3aWxsIGJlIG5lZWRlZCB0byB3b3JrYXJvdW5kIHVwZ3JhZGluZyBidWcgaW4gSUU6XG4gICAgICAgICAgICAvLyBJRSBmYWlscyB3aGVuIGRlbGV0aW5nIG9iamVjdFN0b3JlIGFmdGVyIHJlYWRpbmcgZnJvbSBpdC5cbiAgICAgICAgICAgIC8vIEEgZnV0dXJlIHZlcnNpb24gb2YgRGV4aWUuanMgd2lsbCBzdG9wb3ZlciBhbiBpbnRlcm1lZGlhdGUgdmVyc2lvbiB0byB3b3JrYXJvdW5kIHRoaXMuXG4gICAgICAgICAgICAvLyBBdCB0aGF0IHBvaW50LCB3ZSB3YW50IHRvIGJlIGJhY2t3YXJkIGNvbXBhdGlibGUuIENvdWxkIGhhdmUgYmVlbiBtdWx0aXBsaWVkIHdpdGggMiwgYnV0IGJ5IHVzaW5nIDEwLCBpdCBpcyBlYXNpZXIgdG8gbWFwIHRoZSBudW1iZXIgdG8gdGhlIHJlYWwgdmVyc2lvbiBudW1iZXIuXG5cbiAgICAgICAgICAgIC8vIElmIG5vIEFQSSwgdGhyb3chXG4gICAgICAgICAgICBpZiAoIWluZGV4ZWREQikgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuTWlzc2luZ0FQSShcImluZGV4ZWREQiBBUEkgbm90IGZvdW5kLiBJZiB1c2luZyBJRTEwKywgbWFrZSBzdXJlIHRvIHJ1biB5b3VyIGNvZGUgb24gYSBzZXJ2ZXIgVVJMIFwiICsgXCIobm90IGxvY2FsbHkpLiBJZiB1c2luZyBvbGQgU2FmYXJpIHZlcnNpb25zLCBtYWtlIHN1cmUgdG8gaW5jbHVkZSBpbmRleGVkREIgcG9seWZpbGwuXCIpO1xuXG4gICAgICAgICAgICB2YXIgcmVxID0gYXV0b1NjaGVtYSA/IGluZGV4ZWREQi5vcGVuKGRiTmFtZSkgOiBpbmRleGVkREIub3BlbihkYk5hbWUsIE1hdGgucm91bmQoZGIudmVybm8gKiAxMCkpO1xuICAgICAgICAgICAgaWYgKCFyZXEpIHRocm93IG5ldyBleGNlcHRpb25zLk1pc3NpbmdBUEkoXCJJbmRleGVkREIgQVBJIG5vdCBhdmFpbGFibGVcIik7IC8vIE1heSBoYXBwZW4gaW4gU2FmYXJpIHByaXZhdGUgbW9kZSwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kZmFobGFuZGVyL0RleGllLmpzL2lzc3Vlcy8xMzRcbiAgICAgICAgICAgIHJlcS5vbmVycm9yID0gd3JhcChldmVudFJlamVjdEhhbmRsZXIocmVqZWN0KSk7XG4gICAgICAgICAgICByZXEub25ibG9ja2VkID0gd3JhcChmaXJlT25CbG9ja2VkKTtcbiAgICAgICAgICAgIHJlcS5vbnVwZ3JhZGVuZWVkZWQgPSB3cmFwKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgdXBncmFkZVRyYW5zYWN0aW9uID0gcmVxLnRyYW5zYWN0aW9uO1xuICAgICAgICAgICAgICAgIGlmIChhdXRvU2NoZW1hICYmICFkYi5fYWxsb3dFbXB0eURCKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVubGVzcyBhbiBhZGRvbiBoYXMgc3BlY2lmaWVkIGRiLl9hbGxvd0VtcHR5REIsIGxldHMgbWFrZSB0aGUgY2FsbCBmYWlsLlxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxsZXIgZGlkIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBvciBzY2hlbWEuIERvaW5nIHRoYXQgaXMgb25seSBhY2NlcHRhYmxlIGZvciBvcGVuaW5nIGFscmVhZCBleGlzdGluZyBkYXRhYmFzZXMuXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIG9udXBncmFkZW5lZWRlZCBpcyBjYWxsZWQgaXQgbWVhbnMgZGF0YWJhc2UgZGlkIG5vdCBleGlzdC4gUmVqZWN0IHRoZSBvcGVuKCkgcHJvbWlzZSBhbmQgbWFrZSBzdXJlIHRoYXQgd2VcbiAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBieSBhY2NpZGVudCBoZXJlLlxuICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IHByZXZlbnREZWZhdWx0OyAvLyBQcm9oaWJpdCBvbmFib3J0IGVycm9yIGZyb20gZmlyaW5nIGJlZm9yZSB3ZSdyZSBkb25lIVxuICAgICAgICAgICAgICAgICAgICB1cGdyYWRlVHJhbnNhY3Rpb24uYWJvcnQoKTsgLy8gQWJvcnQgdHJhbnNhY3Rpb24gKHdvdWxkIGhvcGUgdGhhdCB0aGlzIHdvdWxkIG1ha2UgREIgZGlzYXBwZWFyIGJ1dCBpdCBkb2VzbnQuKVxuICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBkYXRhYmFzZSBhbmQgZGVsZXRlIGl0LlxuICAgICAgICAgICAgICAgICAgICByZXEucmVzdWx0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWxyZXEgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoZGJOYW1lKTsgLy8gVGhlIHVwZ3JhZGUgdHJhbnNhY3Rpb24gaXMgYXRvbWljLCBhbmQgamF2YXNjcmlwdCBpcyBzaW5nbGUgdGhyZWFkZWQgLSBtZWFuaW5nIHRoYXQgdGhlcmUgaXMgbm8gcmlzayB0aGF0IHdlIGRlbGV0ZSBzb21lb25lIGVsc2VzIGRhdGFiYXNlIGhlcmUhXG4gICAgICAgICAgICAgICAgICAgIGRlbHJlcS5vbnN1Y2Nlc3MgPSBkZWxyZXEub25lcnJvciA9IHdyYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBleGNlcHRpb25zLk5vU3VjaERhdGFiYXNlKCdEYXRhYmFzZSAnICsgZGJOYW1lICsgJyBkb2VzbnQgZXhpc3QnKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVwZ3JhZGVUcmFuc2FjdGlvbi5vbmVycm9yID0gd3JhcChldmVudFJlamVjdEhhbmRsZXIocmVqZWN0KSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvbGRWZXIgPSBlLm9sZFZlcnNpb24gPiBNYXRoLnBvdygyLCA2MikgPyAwIDogZS5vbGRWZXJzaW9uOyAvLyBTYWZhcmkgOCBmaXguXG4gICAgICAgICAgICAgICAgICAgIHJ1blVwZ3JhZGVycyhvbGRWZXIgLyAxMCwgdXBncmFkZVRyYW5zYWN0aW9uLCByZWplY3QsIHJlcSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVqZWN0KTtcblxuICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IHdyYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIC8vIENvcmUgb3BlbmluZyBwcm9jZWR1cmUgY29tcGxldGUuIE5vdyBsZXQncyBqdXN0IHJlY29yZCBzb21lIHN0dWZmLlxuICAgICAgICAgICAgICAgIHVwZ3JhZGVUcmFuc2FjdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWRiZGIgPSByZXEucmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLnB1c2goZGIpOyAvLyBVc2VkIGZvciBlbXVsYXRpbmcgdmVyc2lvbmNoYW5nZSBldmVudCBvbiBJRS9FZGdlL1NhZmFyaS5cblxuICAgICAgICAgICAgICAgIGlmIChhdXRvU2NoZW1hKSByZWFkR2xvYmFsU2NoZW1hKCk7ZWxzZSBpZiAoaWRiZGIub2JqZWN0U3RvcmVOYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RUb0V4aXN0aW5nSW5kZXhOYW1lcyhnbG9iYWxTY2hlbWEsIGlkYmRiLnRyYW5zYWN0aW9uKHNhZmFyaU11bHRpU3RvcmVGaXgoaWRiZGIub2JqZWN0U3RvcmVOYW1lcyksIFJFQURPTkxZKSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBtYXkgYmFpbCBvdXQgaWYgPiAxIHN0b3JlIG5hbWVzLiBIb3dldmVyLCB0aGlzIHNob3VsZG50IGJlIGEgc2hvd3N0b3BwZXIuIElzc3VlICMxMjAuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZGJkYi5vbnZlcnNpb25jaGFuZ2UgPSB3cmFwKGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgICAgICAgICBkYi5fdmNGaXJlZCA9IHRydWU7IC8vIGRldGVjdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBub3Qgc3VwcG9ydCB2ZXJzaW9uY2hhbmdlIChJRS9FZGdlL1NhZmFyaSlcbiAgICAgICAgICAgICAgICAgICAgZGIub24oXCJ2ZXJzaW9uY2hhbmdlXCIpLmZpcmUoZXYpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNOYXRpdmVHZXREYXRhYmFzZU5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBsb2NhbFN0b3JhZ2Ugd2l0aCBsaXN0IG9mIGRhdGFiYXNlIG5hbWVzXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbERhdGFiYXNlTGlzdChmdW5jdGlvbiAoZGF0YWJhc2VOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFiYXNlTmFtZXMuaW5kZXhPZihkYk5hbWUpID09PSAtMSkgcmV0dXJuIGRhdGFiYXNlTmFtZXMucHVzaChkYk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9KV0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gQmVmb3JlIGZpbmFsbHkgcmVzb2x2aW5nIHRoZSBkYlJlYWR5UHJvbWlzZSBhbmQgdGhpcyBwcm9taXNlLFxuICAgICAgICAgICAgLy8gY2FsbCBhbmQgYXdhaXQgYWxsIG9uKCdyZWFkeScpIHN1YnNjcmliZXJzOlxuICAgICAgICAgICAgLy8gRGV4aWUudmlwKCkgbWFrZXMgc3Vic2NyaWJlcnMgYWJsZSB0byB1c2UgdGhlIGRhdGFiYXNlIHdoaWxlIGJlaW5nIG9wZW5lZC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBtdXN0IHNpbmNlIHRoZXNlIHN1YnNjcmliZXJzIHRha2UgcGFydCBvZiB0aGUgb3BlbmluZyBwcm9jZWR1cmUuXG4gICAgICAgICAgICByZXR1cm4gRGV4aWUudmlwKGRiLm9uLnJlYWR5LmZpcmUpO1xuICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIGRiLm9wZW4oKSB3aXRoIHRoZSBkYiBpbnN0YW5jZS5cbiAgICAgICAgICAgIGlzQmVpbmdPcGVuZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBkYjtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBEaWQgd2UgZmFpbCB3aXRoaW4gb251cGdyYWRlbmVlZGVkPyBNYWtlIHN1cmUgdG8gYWJvcnQgdGhlIHVwZ3JhZGUgdHJhbnNhY3Rpb24gc28gaXQgZG9lc250IGNvbW1pdC5cbiAgICAgICAgICAgICAgICB1cGdyYWRlVHJhbnNhY3Rpb24gJiYgdXBncmFkZVRyYW5zYWN0aW9uLmFib3J0KCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgaXNCZWluZ09wZW5lZCA9IGZhbHNlOyAvLyBTZXQgYmVmb3JlIGNhbGxpbmcgZGIuY2xvc2UoKSBzbyB0aGF0IGl0IGRvZXNudCByZWplY3Qgb3BlbkNhbmNlbGxlciBhZ2FpbiAobGVhZHMgdG8gdW5oYW5kbGVkIHJlamVjdGlvbiBldmVudCkuXG4gICAgICAgICAgICBkYi5jbG9zZSgpOyAvLyBDbG9zZXMgYW5kIHJlc2V0cyBpZGJkYiwgcmVtb3ZlcyBjb25uZWN0aW9ucywgcmVzZXRzIGRiUmVhZHlQcm9taXNlIGFuZCBvcGVuQ2FuY2VsbGVyIHNvIHRoYXQgYSBsYXRlciBkYi5vcGVuKCkgaXMgZnJlc2guXG4gICAgICAgICAgICAvLyBBIGNhbGwgdG8gZGIuY2xvc2UoKSBtYXkgaGF2ZSBtYWRlIG9uLXJlYWR5IHN1YnNjcmliZXJzIGZhaWwuIFVzZSBkYk9wZW5FcnJvciBpZiBzZXQsIHNpbmNlIGVyciBjb3VsZCBiZSBhIGZvbGxvdy11cCBlcnJvciBvbiB0aGF0LlxuICAgICAgICAgICAgZGJPcGVuRXJyb3IgPSBlcnI7IC8vIFJlY29yZCB0aGUgZXJyb3IuIEl0IHdpbGwgYmUgdXNlZCB0byByZWplY3QgZnVydGhlciBwcm9taXNlcyBvZiBkYiBvcGVyYXRpb25zLlxuICAgICAgICAgICAgcmV0dXJuIHJlamVjdGlvbihkYk9wZW5FcnJvciwgZGJVbmNhdWdodCk7IC8vIGRiVW5jYXVnaHQgd2lsbCBtYWtlIHN1cmUgYW55IGVycm9yIHRoYXQgaGFwcGVuZWQgaW4gYW55IG9wZXJhdGlvbiBiZWZvcmUgd2lsbCBub3cgYnViYmxlIHRvIGRiLm9uLmVycm9yKCkgdGhhbmtzIHRvIHRoZSBzcGVjaWFsIGhhbmRsaW5nIGluIFByb21pc2UudW5jYXVnaHQoKS5cbiAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBvcGVuQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgcmVzb2x2ZURiUmVhZHkoKTsgLy8gZGJSZWFkeVByb21pc2UgaXMgcmVzb2x2ZWQgbm8gbWF0dGVyIGlmIG9wZW4oKSByZWplY3RzIG9yIHJlc29sdmVkLiBJdCdzIGp1c3QgdG8gd2FrZSB1cCB3YWl0ZXJzLlxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGlkeCA9IGNvbm5lY3Rpb25zLmluZGV4T2YoZGIpO1xuICAgICAgICBpZiAoaWR4ID49IDApIGNvbm5lY3Rpb25zLnNwbGljZShpZHgsIDEpO1xuICAgICAgICBpZiAoaWRiZGIpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWRiZGIuY2xvc2UoKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICBpZGJkYiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgYXV0b09wZW4gPSBmYWxzZTtcbiAgICAgICAgZGJPcGVuRXJyb3IgPSBuZXcgZXhjZXB0aW9ucy5EYXRhYmFzZUNsb3NlZCgpO1xuICAgICAgICBpZiAoaXNCZWluZ09wZW5lZCkgY2FuY2VsT3BlbihkYk9wZW5FcnJvcik7XG4gICAgICAgIC8vIFJlc2V0IGRiUmVhZHlQcm9taXNlIHByb21pc2U6XG4gICAgICAgIGRiUmVhZHlQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIGRiUmVhZHlSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9wZW5DYW5jZWxsZXIgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoXywgcmVqZWN0KSB7XG4gICAgICAgICAgICBjYW5jZWxPcGVuID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5kZWxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBoYXNBcmd1bWVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMDtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGlmIChoYXNBcmd1bWVudHMpIHRocm93IG5ldyBleGNlcHRpb25zLkludmFsaWRBcmd1bWVudChcIkFyZ3VtZW50cyBub3QgYWxsb3dlZCBpbiBkYi5kZWxldGUoKVwiKTtcbiAgICAgICAgICAgIGlmIChpc0JlaW5nT3BlbmVkKSB7XG4gICAgICAgICAgICAgICAgZGJSZWFkeVByb21pc2UudGhlbihkb0RlbGV0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvRGVsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBkb0RlbGV0ZSgpIHtcbiAgICAgICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHZhciByZXEgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoZGJOYW1lKTtcbiAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gd3JhcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFzTmF0aXZlR2V0RGF0YWJhc2VOYW1lcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsRGF0YWJhc2VMaXN0KGZ1bmN0aW9uIChkYXRhYmFzZU5hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBvcyA9IGRhdGFiYXNlTmFtZXMuaW5kZXhPZihkYk5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gMCkgcmV0dXJuIGRhdGFiYXNlTmFtZXMuc3BsaWNlKHBvcywgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSB3cmFwKGV2ZW50UmVqZWN0SGFuZGxlcihyZWplY3QpKTtcbiAgICAgICAgICAgICAgICByZXEub25ibG9ja2VkID0gZmlyZU9uQmxvY2tlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudW5jYXVnaHQoZGJVbmNhdWdodCk7XG4gICAgfTtcblxuICAgIHRoaXMuYmFja2VuZERCID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaWRiZGI7XG4gICAgfTtcblxuICAgIHRoaXMuaXNPcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaWRiZGIgIT09IG51bGw7XG4gICAgfTtcbiAgICB0aGlzLmhhc0ZhaWxlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGRiT3BlbkVycm9yICE9PSBudWxsO1xuICAgIH07XG4gICAgdGhpcy5keW5hbWljYWxseU9wZW5lZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGF1dG9TY2hlbWE7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy8gUHJvcGVydGllc1xuICAgIC8vXG4gICAgdGhpcy5uYW1lID0gZGJOYW1lO1xuXG4gICAgLy8gZGIudGFibGVzIC0gYW4gYXJyYXkgb2YgYWxsIFRhYmxlIGluc3RhbmNlcy5cbiAgICBzZXRQcm9wKHRoaXMsIFwidGFibGVzXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLy8gPHJldHVybnMgdHlwZT1cIkFycmF5XCIgZWxlbWVudFR5cGU9XCJXcml0ZWFibGVUYWJsZVwiIC8+XG4gICAgICAgICAgICByZXR1cm4ga2V5cyhhbGxUYWJsZXMpLm1hcChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhbGxUYWJsZXNbbmFtZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvLyBFdmVudHNcbiAgICAvL1xuICAgIHRoaXMub24gPSBFdmVudHModGhpcywgXCJlcnJvclwiLCBcInBvcHVsYXRlXCIsIFwiYmxvY2tlZFwiLCBcInZlcnNpb25jaGFuZ2VcIiwgeyByZWFkeTogW3Byb21pc2FibGVDaGFpbiwgbm9wXSB9KTtcbiAgICB0aGlzLm9uLmVycm9yLnN1YnNjcmliZSA9IGRlcHJlY2F0ZWQoXCJEZXhpZS5vbi5lcnJvclwiLCB0aGlzLm9uLmVycm9yLnN1YnNjcmliZSk7XG4gICAgdGhpcy5vbi5lcnJvci51bnN1YnNjcmliZSA9IGRlcHJlY2F0ZWQoXCJEZXhpZS5vbi5lcnJvci51bnN1YnNjcmliZVwiLCB0aGlzLm9uLmVycm9yLnVuc3Vic2NyaWJlKTtcblxuICAgIHRoaXMub24ucmVhZHkuc3Vic2NyaWJlID0gb3ZlcnJpZGUodGhpcy5vbi5yZWFkeS5zdWJzY3JpYmUsIGZ1bmN0aW9uIChzdWJzY3JpYmUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdWJzY3JpYmVyLCBiU3RpY2t5KSB7XG4gICAgICAgICAgICBEZXhpZS52aXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChvcGVuQ29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRGF0YWJhc2UgYWxyZWFkeSBvcGVuLiBDYWxsIHN1YnNjcmliZXIgYXNhcC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYk9wZW5FcnJvcikgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gYlN0aWNreTogQWxzbyBzdWJzY3JpYmUgdG8gZnV0dXJlIG9wZW4gc3VjZXNzZXMgKGFmdGVyIGNsb3NlIC8gcmVvcGVuKSBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJTdGlja3kpIHN1YnNjcmliZShzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBEYXRhYmFzZSBub3QgeWV0IG9wZW4uIFN1YnNjcmliZSB0byBpdC5cbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlKHN1YnNjcmliZXIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBiU3RpY2t5IGlzIGZhbHN5LCBtYWtlIHN1cmUgdG8gdW5zdWJzY3JpYmUgc3Vic2NyaWJlciB3aGVuIGZpcmVkIG9uY2UuXG4gICAgICAgICAgICAgICAgICAgIGlmICghYlN0aWNreSkgc3Vic2NyaWJlKGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGIub24ucmVhZHkudW5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5vbi5yZWFkeS51bnN1YnNjcmliZSh1bnN1YnNjcmliZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgZmFrZUF1dG9Db21wbGV0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRiLm9uKFwicG9wdWxhdGVcIikuZmlyZShkYi5fY3JlYXRlVHJhbnNhY3Rpb24oUkVBRFdSSVRFLCBkYlN0b3JlTmFtZXMsIGdsb2JhbFNjaGVtYSkpO1xuICAgICAgICBkYi5vbihcImVycm9yXCIpLmZpcmUobmV3IEVycm9yKCkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IGZ1bmN0aW9uIChtb2RlLCB0YWJsZUluc3RhbmNlcywgc2NvcGVGdW5jKSB7XG4gICAgICAgIC8vLyA8c3VtbWFyeT5cbiAgICAgICAgLy8vXG4gICAgICAgIC8vLyA8L3N1bW1hcnk+XG4gICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cIm1vZGVcIiB0eXBlPVwiU3RyaW5nXCI+XCJyXCIgZm9yIHJlYWRvbmx5LCBvciBcInJ3XCIgZm9yIHJlYWR3cml0ZTwvcGFyYW0+XG4gICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cInRhYmxlSW5zdGFuY2VzXCI+VGFibGUgaW5zdGFuY2UsIEFycmF5IG9mIFRhYmxlIGluc3RhbmNlcywgU3RyaW5nIG9yIFN0cmluZyBBcnJheSBvZiBvYmplY3Qgc3RvcmVzIHRvIGluY2x1ZGUgaW4gdGhlIHRyYW5zYWN0aW9uPC9wYXJhbT5cbiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPVwic2NvcGVGdW5jXCIgdHlwZT1cIkZ1bmN0aW9uXCI+RnVuY3Rpb24gdG8gZXhlY3V0ZSB3aXRoIHRyYW5zYWN0aW9uPC9wYXJhbT5cblxuICAgICAgICAvLyBMZXQgdGFibGUgYXJndW1lbnRzIGJlIGFsbCBhcmd1bWVudHMgYmV0d2VlbiBtb2RlIGFuZCBsYXN0IGFyZ3VtZW50LlxuICAgICAgICB2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgIGlmIChpIDwgMikgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuSW52YWxpZEFyZ3VtZW50KFwiVG9vIGZldyBhcmd1bWVudHNcIik7XG4gICAgICAgIC8vIFByZXZlbnQgb3B0aW16YXRpb24ga2lsbGVyIChodHRwczovL2dpdGh1Yi5jb20vcGV0a2FhbnRvbm92L2JsdWViaXJkL3dpa2kvT3B0aW1pemF0aW9uLWtpbGxlcnMjMzItbGVha2luZy1hcmd1bWVudHMpXG4gICAgICAgIC8vIGFuZCBjbG9uZSBhcmd1bWVudHMgZXhjZXB0IHRoZSBmaXJzdCBvbmUgaW50byBsb2NhbCB2YXIgJ2FyZ3MnLlxuICAgICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShpIC0gMSk7XG4gICAgICAgIHdoaWxlICgtLWkpIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9IC8vIExldCBzY29wZUZ1bmMgYmUgdGhlIGxhc3QgYXJndW1lbnQgYW5kIHBvcCBpdCBzbyB0aGF0IGFyZ3Mgbm93IG9ubHkgY29udGFpbiB0aGUgdGFibGUgYXJndW1lbnRzLlxuICAgICAgICBzY29wZUZ1bmMgPSBhcmdzLnBvcCgpO1xuICAgICAgICB2YXIgdGFibGVzID0gZmxhdHRlbihhcmdzKTsgLy8gU3VwcG9ydCB1c2luZyBhcnJheSBhcyBtaWRkbGUgYXJndW1lbnQsIG9yIGEgbWl4IG9mIGFycmF5cyBhbmQgbm9uLWFycmF5cy5cbiAgICAgICAgdmFyIHBhcmVudFRyYW5zYWN0aW9uID0gUFNELnRyYW5zO1xuICAgICAgICAvLyBDaGVjayBpZiBwYXJlbnQgdHJhbnNhY3Rpb25zIGlzIGJvdW5kIHRvIHRoaXMgZGIgaW5zdGFuY2UsIGFuZCBpZiBjYWxsZXIgd2FudHMgdG8gcmV1c2UgaXRcbiAgICAgICAgaWYgKCFwYXJlbnRUcmFuc2FjdGlvbiB8fCBwYXJlbnRUcmFuc2FjdGlvbi5kYiAhPT0gZGIgfHwgbW9kZS5pbmRleE9mKCchJykgIT09IC0xKSBwYXJlbnRUcmFuc2FjdGlvbiA9IG51bGw7XG4gICAgICAgIHZhciBvbmx5SWZDb21wYXRpYmxlID0gbW9kZS5pbmRleE9mKCc/JykgIT09IC0xO1xuICAgICAgICBtb2RlID0gbW9kZS5yZXBsYWNlKCchJywgJycpLnJlcGxhY2UoJz8nLCAnJyk7IC8vIE9rLiBXaWxsIGNoYW5nZSBhcmd1bWVudHNbMF0gYXMgd2VsbCBidXQgd2Ugd29udCB0b3VjaCBhcmd1bWVudHMgaGVuY2Vmb3J0aC5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEdldCBzdG9yZU5hbWVzIGZyb20gYXJndW1lbnRzLiBFaXRoZXIgdGhyb3VnaCBnaXZlbiB0YWJsZSBpbnN0YW5jZXMsIG9yIHRocm91Z2ggZ2l2ZW4gdGFibGUgbmFtZXMuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdmFyIHN0b3JlTmFtZXMgPSB0YWJsZXMubWFwKGZ1bmN0aW9uICh0YWJsZSkge1xuICAgICAgICAgICAgICAgIHZhciBzdG9yZU5hbWUgPSB0YWJsZSBpbnN0YW5jZW9mIFRhYmxlID8gdGFibGUubmFtZSA6IHRhYmxlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RvcmVOYW1lICE9PSAnc3RyaW5nJykgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgdGFibGUgYXJndW1lbnQgdG8gRGV4aWUudHJhbnNhY3Rpb24oKS4gT25seSBUYWJsZSBvciBTdHJpbmcgYXJlIGFsbG93ZWRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlTmFtZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSBtb2RlLiBBbGxvdyBzaG9ydGN1dHMgXCJyXCIgYW5kIFwicndcIi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBpZiAobW9kZSA9PSBcInJcIiB8fCBtb2RlID09IFJFQURPTkxZKSBtb2RlID0gUkVBRE9OTFk7ZWxzZSBpZiAobW9kZSA9PSBcInJ3XCIgfHwgbW9kZSA9PSBSRUFEV1JJVEUpIG1vZGUgPSBSRUFEV1JJVEU7ZWxzZSB0aHJvdyBuZXcgZXhjZXB0aW9ucy5JbnZhbGlkQXJndW1lbnQoXCJJbnZhbGlkIHRyYW5zYWN0aW9uIG1vZGU6IFwiICsgbW9kZSk7XG5cbiAgICAgICAgICAgIGlmIChwYXJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIEJhc2ljIGNoZWNrc1xuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRUcmFuc2FjdGlvbi5tb2RlID09PSBSRUFET05MWSAmJiBtb2RlID09PSBSRUFEV1JJVEUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHlJZkNvbXBhdGlibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNwYXduIG5ldyB0cmFuc2FjdGlvbiBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50VHJhbnNhY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuU3ViVHJhbnNhY3Rpb24oXCJDYW5ub3QgZW50ZXIgYSBzdWItdHJhbnNhY3Rpb24gd2l0aCBSRUFEV1JJVEUgbW9kZSB3aGVuIHBhcmVudCB0cmFuc2FjdGlvbiBpcyBSRUFET05MWVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudFRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoc3RvcmVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50VHJhbnNhY3Rpb24gJiYgcGFyZW50VHJhbnNhY3Rpb24uc3RvcmVOYW1lcy5pbmRleE9mKHN0b3JlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9ubHlJZkNvbXBhdGlibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3Bhd24gbmV3IHRyYW5zYWN0aW9uIGluc3RlYWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFRyYW5zYWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuU3ViVHJhbnNhY3Rpb24oXCJUYWJsZSBcIiArIHN0b3JlTmFtZSArIFwiIG5vdCBpbmNsdWRlZCBpbiBwYXJlbnQgdHJhbnNhY3Rpb24uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRUcmFuc2FjdGlvbiA/IHBhcmVudFRyYW5zYWN0aW9uLl9wcm9taXNlKG51bGwsIGZ1bmN0aW9uIChfLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9KSA6IHJlamVjdGlvbihlLCBkYlVuY2F1Z2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViLXRyYW5zYWN0aW9uLCBsb2NrIHRoZSBwYXJlbnQgYW5kIHRoZW4gbGF1bmNoIHRoZSBzdWItdHJhbnNhY3Rpb24uXG4gICAgICAgIHJldHVybiBwYXJlbnRUcmFuc2FjdGlvbiA/IHBhcmVudFRyYW5zYWN0aW9uLl9wcm9taXNlKG1vZGUsIGVudGVyVHJhbnNhY3Rpb25TY29wZSwgXCJsb2NrXCIpIDogZGIuX3doZW5SZWFkeShlbnRlclRyYW5zYWN0aW9uU2NvcGUpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGVudGVyVHJhbnNhY3Rpb25TY29wZShyZXNvbHZlKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50UFNEID0gUFNEO1xuICAgICAgICAgICAgcmVzb2x2ZShQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3U2NvcGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBLZWVwIGEgcG9pbnRlciB0byBsYXN0IG5vbi10cmFuc2FjdGlvbmFsIFBTRCB0byB1c2UgaWYgc29tZW9uZSBjYWxscyBEZXhpZS5pZ25vcmVUcmFuc2FjdGlvbigpLlxuICAgICAgICAgICAgICAgICAgICBQU0QudHJhbnNsZXNzID0gUFNELnRyYW5zbGVzcyB8fCBwYXJlbnRQU0Q7XG4gICAgICAgICAgICAgICAgICAgIC8vIE91ciB0cmFuc2FjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdHJhbnMgPSBkYi5fY3JlYXRlVHJhbnNhY3Rpb24obW9kZSwgc3RvcmVOYW1lcywgZ2xvYmFsU2NoZW1hLCBwYXJlbnRUcmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIC8vIExldCB0aGUgdHJhbnNhY3Rpb24gaW5zdGFuY2UgYmUgcGFydCBvZiBhIFByb21pc2Utc3BlY2lmaWMgZGF0YSAoUFNEKSB2YWx1ZS5cbiAgICAgICAgICAgICAgICAgICAgUFNELnRyYW5zID0gdHJhbnM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudFRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFbXVsYXRlIHRyYW5zYWN0aW9uIGNvbW1pdCBhd2FyZW5lc3MgZm9yIGlubmVyIHRyYW5zYWN0aW9uIChtdXN0ICdjb21taXQnIHdoZW4gdGhlIGlubmVyIHRyYW5zYWN0aW9uIGhhcyBubyBtb3JlIG9wZXJhdGlvbnMgb25nb2luZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLmlkYnRyYW5zID0gcGFyZW50VHJhbnNhY3Rpb24uaWRidHJhbnM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5jcmVhdGUoKTsgLy8gQ3JlYXRlIHRoZSBiYWNrZW5kIHRyYW5zYWN0aW9uIHNvIHRoYXQgY29tcGxldGUoKSBvciBlcnJvcigpIHdpbGwgdHJpZ2dlciBldmVuIGlmIG5vIG9wZXJhdGlvbiBpcyBtYWRlIHVwb24gaXQuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBQcm92aWRlIGFyZ3VtZW50cyB0byB0aGUgc2NvcGUgZnVuY3Rpb24gKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgICAgICAgICB2YXIgdGFibGVBcmdzID0gc3RvcmVOYW1lcy5tYXAoZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxUYWJsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0YWJsZUFyZ3MucHVzaCh0cmFucyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblZhbHVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5mb2xsb3coZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluYWxseSwgY2FsbCB0aGUgc2NvcGUgZnVuY3Rpb24gd2l0aCBvdXIgdGFibGUgYW5kIHRyYW5zYWN0aW9uIGFyZ3VtZW50cy5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gc2NvcGVGdW5jLmFwcGx5KHRyYW5zLCB0YWJsZUFyZ3MpOyAvLyBOT1RFOiByZXR1cm5WYWx1ZSBpcyB1c2VkIGluIHRyYW5zLm9uLmNvbXBsZXRlKCkgbm90IGFzIGEgcmV0dXJuVmFsdWUgdG8gdGhpcyBmdW5jLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXR1cm5WYWx1ZS5uZXh0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiByZXR1cm5WYWx1ZS50aHJvdyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZUZ1bmMgcmV0dXJuZWQgYW4gaXRlcmF0b3Igd2l0aCB0aHJvdy1zdXBwb3J0LiBIYW5kbGUgeWllbGQgYXMgYXdhaXQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gYXdhaXRJdGVyYXRvcihyZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcmV0dXJuVmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJyAmJiAhaGFzT3duKHJldHVyblZhbHVlLCAnX1BTRCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBleGNlcHRpb25zLkluY29tcGF0aWJsZVByb21pc2UoXCJJbmNvbXBhdGlibGUgUHJvbWlzZSByZXR1cm5lZCBmcm9tIHRyYW5zYWN0aW9uIHNjb3BlIChyZWFkIG1vcmUgYXQgaHR0cDovL3Rpbnl1cmwuY29tL3pueXFqcWMpLiBUcmFuc2FjdGlvbiBzY29wZTogXCIgKyBzY29wZUZ1bmMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KS51bmNhdWdodChkYlVuY2F1Z2h0KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRUcmFuc2FjdGlvbikgdHJhbnMuX3Jlc29sdmUoKTsgLy8gc3ViIHRyYW5zYWN0aW9ucyBkb24ndCByZWFjdCB0byBpZGJ0cmFucy5vbmNvbXBsZXRlLiBXZSBtdXN0IHRyaWdnZXIgYSBhY29tcGxldGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFucy5fY29tcGxldGlvbjsgLy8gRXZlbiBpZiBXRSBiZWxpZXZlIGV2ZXJ5dGhpbmcgaXMgZmluZS4gQXdhaXQgSURCVHJhbnNhY3Rpb24ncyBvbmNvbXBsZXRlIG9yIG9uZXJyb3IgYXMgd2VsbC5cbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL3JlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLl9yZWplY3QoZSk7IC8vIFllcywgYWJvdmUgdGhlbi1oYW5kbGVyIHdlcmUgbWF5YmUgbm90IGNhbGxlZCBiZWNhdXNlIG9mIGFuIHVuaGFuZGxlZCByZWplY3Rpb24gaW4gc2NvcGVGdW5jIVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdGlvbihlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy50YWJsZSA9IGZ1bmN0aW9uICh0YWJsZU5hbWUpIHtcbiAgICAgICAgLy8vIDxyZXR1cm5zIHR5cGU9XCJXcml0ZWFibGVUYWJsZVwiPjwvcmV0dXJucz5cbiAgICAgICAgaWYgKGZha2UgJiYgYXV0b1NjaGVtYSkgcmV0dXJuIG5ldyBXcml0ZWFibGVUYWJsZSh0YWJsZU5hbWUpO1xuICAgICAgICBpZiAoIWhhc093bihhbGxUYWJsZXMsIHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBleGNlcHRpb25zLkludmFsaWRUYWJsZSgnVGFibGUgJyArIHRhYmxlTmFtZSArICcgZG9lcyBub3QgZXhpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsVGFibGVzW3RhYmxlTmFtZV07XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vIFRhYmxlIENsYXNzXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZnVuY3Rpb24gVGFibGUobmFtZSwgdGFibGVTY2hlbWEsIGNvbGxDbGFzcykge1xuICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJuYW1lXCIgdHlwZT1cIlN0cmluZ1wiPjwvcGFyYW0+XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gdGFibGVTY2hlbWE7XG4gICAgICAgIHRoaXMuaG9vayA9IGFsbFRhYmxlc1tuYW1lXSA/IGFsbFRhYmxlc1tuYW1lXS5ob29rIDogRXZlbnRzKG51bGwsIHtcbiAgICAgICAgICAgIFwiY3JlYXRpbmdcIjogW2hvb2tDcmVhdGluZ0NoYWluLCBub3BdLFxuICAgICAgICAgICAgXCJyZWFkaW5nXCI6IFtwdXJlRnVuY3Rpb25DaGFpbiwgbWlycm9yXSxcbiAgICAgICAgICAgIFwidXBkYXRpbmdcIjogW2hvb2tVcGRhdGluZ0NoYWluLCBub3BdLFxuICAgICAgICAgICAgXCJkZWxldGluZ1wiOiBbaG9va0RlbGV0aW5nQ2hhaW4sIG5vcF1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX2NvbGxDbGFzcyA9IGNvbGxDbGFzcyB8fCBDb2xsZWN0aW9uO1xuICAgIH1cblxuICAgIHByb3BzKFRhYmxlLnByb3RvdHlwZSwge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRhYmxlIFByb3RlY3RlZCBNZXRob2RzXG4gICAgICAgIC8vXG5cbiAgICAgICAgX3RyYW5zOiBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvbihtb2RlLCBmbiwgd3JpdGVMb2NrZWQpIHtcbiAgICAgICAgICAgIHZhciB0cmFucyA9IFBTRC50cmFucztcbiAgICAgICAgICAgIHJldHVybiB0cmFucyAmJiB0cmFucy5kYiA9PT0gZGIgPyB0cmFucy5fcHJvbWlzZShtb2RlLCBmbiwgd3JpdGVMb2NrZWQpIDogdGVtcFRyYW5zYWN0aW9uKG1vZGUsIFt0aGlzLm5hbWVdLCBmbik7XG4gICAgICAgIH0sXG4gICAgICAgIF9pZGJzdG9yZTogZnVuY3Rpb24gZ2V0SURCT2JqZWN0U3RvcmUobW9kZSwgZm4sIHdyaXRlTG9ja2VkKSB7XG4gICAgICAgICAgICBpZiAoZmFrZSkgcmV0dXJuIG5ldyBQcm9taXNlKGZuKTsgLy8gU2ltcGxpZnkgdGhlIHdvcmsgZm9yIEludGVsbGlzZW5zZS9Db2RlIGNvbXBsZXRpb24uXG4gICAgICAgICAgICB2YXIgdHJhbnMgPSBQU0QudHJhbnMsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICAgICAgZnVuY3Rpb24gc3VwcGx5SWRiU3RvcmUocmVzb2x2ZSwgcmVqZWN0LCB0cmFucykge1xuICAgICAgICAgICAgICAgIGZuKHJlc29sdmUsIHJlamVjdCwgdHJhbnMuaWRidHJhbnMub2JqZWN0U3RvcmUodGFibGVOYW1lKSwgdHJhbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRyYW5zICYmIHRyYW5zLmRiID09PSBkYiA/IHRyYW5zLl9wcm9taXNlKG1vZGUsIHN1cHBseUlkYlN0b3JlLCB3cml0ZUxvY2tlZCkgOiB0ZW1wVHJhbnNhY3Rpb24obW9kZSwgW3RoaXMubmFtZV0sIHN1cHBseUlkYlN0b3JlKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvL1xuICAgICAgICAvLyBUYWJsZSBQdWJsaWMgTWV0aG9kc1xuICAgICAgICAvL1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uIChrZXksIGNiKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faWRic3RvcmUoUkVBRE9OTFksIGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QsIGlkYnN0b3JlKSB7XG4gICAgICAgICAgICAgICAgZmFrZSAmJiByZXNvbHZlKHNlbGYuc2NoZW1hLmluc3RhbmNlVGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgIHZhciByZXEgPSBpZGJzdG9yZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGV2ZW50UmVqZWN0SGFuZGxlcihyZWplY3QpO1xuICAgICAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSB3cmFwKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxmLmhvb2sucmVhZGluZy5maXJlKHJlcS5yZXN1bHQpKTtcbiAgICAgICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICAgICAgfSkudGhlbihjYik7XG4gICAgICAgIH0sXG4gICAgICAgIHdoZXJlOiBmdW5jdGlvbiAoaW5kZXhOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFdoZXJlQ2xhdXNlKHRoaXMsIGluZGV4TmFtZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvdW50OiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvQ29sbGVjdGlvbigpLmNvdW50KGNiKTtcbiAgICAgICAgfSxcbiAgICAgICAgb2Zmc2V0OiBmdW5jdGlvbiAob2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0NvbGxlY3Rpb24oKS5vZmZzZXQob2Zmc2V0KTtcbiAgICAgICAgfSxcbiAgICAgICAgbGltaXQ6IGZ1bmN0aW9uIChudW1Sb3dzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0NvbGxlY3Rpb24oKS5saW1pdChudW1Sb3dzKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmV2ZXJzZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9Db2xsZWN0aW9uKCkucmV2ZXJzZSgpO1xuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIChmaWx0ZXJGdW5jdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9Db2xsZWN0aW9uKCkuYW5kKGZpbHRlckZ1bmN0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgZWFjaDogZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0NvbGxlY3Rpb24oKS5lYWNoKGZuKTtcbiAgICAgICAgfSxcbiAgICAgICAgdG9BcnJheTogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0NvbGxlY3Rpb24oKS50b0FycmF5KGNiKTtcbiAgICAgICAgfSxcbiAgICAgICAgb3JkZXJCeTogZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuX2NvbGxDbGFzcyhuZXcgV2hlcmVDbGF1c2UodGhpcywgaW5kZXgpKTtcbiAgICAgICAgfSxcblxuICAgICAgICB0b0NvbGxlY3Rpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5fY29sbENsYXNzKG5ldyBXaGVyZUNsYXVzZSh0aGlzKSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWFwVG9DbGFzczogZnVuY3Rpb24gKGNvbnN0cnVjdG9yLCBzdHJ1Y3R1cmUpIHtcbiAgICAgICAgICAgIC8vLyA8c3VtbWFyeT5cbiAgICAgICAgICAgIC8vLyAgICAgTWFwIHRhYmxlIHRvIGEgamF2YXNjcmlwdCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4gT2JqZWN0cyByZXR1cm5lZCBmcm9tIHRoZSBkYXRhYmFzZSB3aWxsIGJlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLCBtYWtpbmdcbiAgICAgICAgICAgIC8vLyAgICAgaXQgcG9zc2libGUgdG8gdGhlIGluc3RhbmNlT2Ygb3BlcmF0b3IgYXMgd2VsbCBhcyBleHRlbmRpbmcgdGhlIGNsYXNzIHVzaW5nIGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRob2QgPSBmdW5jdGlvbigpey4uLn0uXG4gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PlxuICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPVwiY29uc3RydWN0b3JcIj5Db25zdHJ1Y3RvciBmdW5jdGlvbiByZXByZXNlbnRpbmcgdGhlIGNsYXNzLjwvcGFyYW0+XG4gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJ1Y3R1cmVcIiBvcHRpb25hbD1cInRydWVcIj5IZWxwcyBJREUgY29kZSBjb21wbGV0aW9uIGJ5IGtub3dpbmcgdGhlIG1lbWJlcnMgdGhhdCBvYmplY3RzIGNvbnRhaW4gYW5kIG5vdCBqdXN0IHRoZSBpbmRleGVzLiBBbHNvXG4gICAgICAgICAgICAvLy8ga25vdyB3aGF0IHR5cGUgZWFjaCBtZW1iZXIgaGFzLiBFeGFtcGxlOiB7bmFtZTogU3RyaW5nLCBlbWFpbEFkZHJlc3NlczogW1N0cmluZ10sIHBhc3N3b3JkfTwvcGFyYW0+XG4gICAgICAgICAgICB0aGlzLnNjaGVtYS5tYXBwZWRDbGFzcyA9IGNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlVGVtcGxhdGUgPSBPYmplY3QuY3JlYXRlKGNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG4gICAgICAgICAgICBpZiAoc3RydWN0dXJlKSB7XG4gICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlIGFuZCBpbnN0YW5jZVRlbXBsYXRlIGlzIGZvciBJREUgY29kZSBjb21wZXRpb24gb25seSB3aGlsZSBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgaXMgZm9yIGFjdHVhbCBpbmhlcml0YW5jZS5cbiAgICAgICAgICAgICAgICBhcHBseVN0cnVjdHVyZShpbnN0YW5jZVRlbXBsYXRlLCBzdHJ1Y3R1cmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zY2hlbWEuaW5zdGFuY2VUZW1wbGF0ZSA9IGluc3RhbmNlVGVtcGxhdGU7XG5cbiAgICAgICAgICAgIC8vIE5vdywgc3Vic2NyaWJlIHRvIHRoZSB3aGVuKFwicmVhZGluZ1wiKSBldmVudCB0byBtYWtlIGFsbCBvYmplY3RzIHRoYXQgY29tZSBvdXQgZnJvbSB0aGlzIHRhYmxlIGluaGVyaXQgZnJvbSBnaXZlbiBjbGFzc1xuICAgICAgICAgICAgLy8gbm8gbWF0dGVyIHdoaWNoIG1ldGhvZCB0byB1c2UgZm9yIHJlYWRpbmcgKFRhYmxlLmdldCgpIG9yIFRhYmxlLndoZXJlKC4uLikuLi4gKVxuICAgICAgICAgICAgdmFyIHJlYWRIb29rID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIGlmICghb2JqKSByZXR1cm4gb2JqOyAvLyBObyB2YWxpZCBvYmplY3QuIChWYWx1ZSBpcyBudWxsKS4gUmV0dXJuIGFzIGlzLlxuICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBvYmplY3QgdGhhdCBkZXJpdmVzIGZyb20gY29uc3RydWN0b3I6XG4gICAgICAgICAgICAgICAgdmFyIHJlcyA9IE9iamVjdC5jcmVhdGUoY29uc3RydWN0b3IucHJvdG90eXBlKTtcbiAgICAgICAgICAgICAgICAvLyBDbG9uZSBtZW1iZXJzOlxuICAgICAgICAgICAgICAgIGZvciAodmFyIG0gaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNPd24ob2JqLCBtKSkgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1ttXSA9IG9ialttXTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgICAgICAgICB9cmV0dXJuIHJlcztcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNjaGVtYS5yZWFkSG9vaykge1xuICAgICAgICAgICAgICAgIHRoaXMuaG9vay5yZWFkaW5nLnVuc3Vic2NyaWJlKHRoaXMuc2NoZW1hLnJlYWRIb29rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2NoZW1hLnJlYWRIb29rID0gcmVhZEhvb2s7XG4gICAgICAgICAgICB0aGlzLmhvb2soXCJyZWFkaW5nXCIsIHJlYWRIb29rKTtcbiAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcjtcbiAgICAgICAgfSxcbiAgICAgICAgZGVmaW5lQ2xhc3M6IGZ1bmN0aW9uIChzdHJ1Y3R1cmUpIHtcbiAgICAgICAgICAgIC8vLyA8c3VtbWFyeT5cbiAgICAgICAgICAgIC8vLyAgICAgRGVmaW5lIGFsbCBtZW1iZXJzIG9mIHRoZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIHRhYmxlLiBUaGlzIHdpbGwgaGVscCBjb2RlIGNvbXBsZXRpb24gb2Ygd2hlbiBvYmplY3RzIGFyZSByZWFkIGZyb20gdGhlIGRhdGFiYXNlXG4gICAgICAgICAgICAvLy8gICAgIGFzIHdlbGwgYXMgbWFraW5nIGl0IHBvc3NpYmxlIHRvIGV4dGVuZCB0aGUgcHJvdG90eXBlIG9mIHRoZSByZXR1cm5lZCBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+XG4gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJ1Y3R1cmVcIj5IZWxwcyBJREUgY29kZSBjb21wbGV0aW9uIGJ5IGtub3dpbmcgdGhlIG1lbWJlcnMgdGhhdCBvYmplY3RzIGNvbnRhaW4gYW5kIG5vdCBqdXN0IHRoZSBpbmRleGVzLiBBbHNvXG4gICAgICAgICAgICAvLy8ga25vdyB3aGF0IHR5cGUgZWFjaCBtZW1iZXIgaGFzLiBFeGFtcGxlOiB7bmFtZTogU3RyaW5nLCBlbWFpbEFkZHJlc3NlczogW1N0cmluZ10sIHByb3BlcnRpZXM6IHtzaG9lU2l6ZTogTnVtYmVyfX08L3BhcmFtPlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwVG9DbGFzcyhEZXhpZS5kZWZpbmVDbGFzcyhzdHJ1Y3R1cmUpLCBzdHJ1Y3R1cmUpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvLyBXcml0ZWFibGVUYWJsZSBDbGFzcyAoZXh0ZW5kcyBUYWJsZSlcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmdW5jdGlvbiBXcml0ZWFibGVUYWJsZShuYW1lLCB0YWJsZVNjaGVtYSwgY29sbENsYXNzKSB7XG4gICAgICAgIFRhYmxlLmNhbGwodGhpcywgbmFtZSwgdGFibGVTY2hlbWEsIGNvbGxDbGFzcyB8fCBXcml0ZWFibGVDb2xsZWN0aW9uKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBCdWxrRXJyb3JIYW5kbGVyQ2F0Y2hBbGwoZXJyb3JMaXN0LCBkb25lLCBzdXBwb3J0SG9va3MpIHtcbiAgICAgICAgcmV0dXJuIChzdXBwb3J0SG9va3MgPyBob29rZWRFdmVudFJlamVjdEhhbmRsZXIgOiBldmVudFJlamVjdEhhbmRsZXIpKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBlcnJvckxpc3QucHVzaChlKTtcbiAgICAgICAgICAgIGRvbmUgJiYgZG9uZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBidWxrRGVsZXRlKGlkYnN0b3JlLCB0cmFucywga2V5c09yVHVwbGVzLCBoYXNEZWxldGVIb29rLCBkZWxldGluZ0hvb2spIHtcbiAgICAgICAgLy8gSWYgaGFzRGVsZXRlSG9vaywga2V5c09yVHVwbGVzIG11c3QgYmUgYW4gYXJyYXkgb2YgdHVwbGVzOiBbW2tleTEsIHZhbHVlMl0sW2tleTIsdmFsdWUyXSwuLi5dLFxuICAgICAgICAvLyBlbHNlIGtleXNPclR1cGxlcyBtdXN0IGJlIGp1c3QgYW4gYXJyYXkgb2Yga2V5czogW2tleTEsIGtleTIsIC4uLl0uXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgbGVuID0ga2V5c09yVHVwbGVzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBsYXN0SXRlbSA9IGxlbiAtIDE7XG4gICAgICAgICAgICBpZiAobGVuID09PSAwKSByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgaWYgKCFoYXNEZWxldGVIb29rKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0gaWRic3RvcmUuZGVsZXRlKGtleXNPclR1cGxlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gd3JhcChldmVudFJlamVjdEhhbmRsZXIocmVqZWN0KSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBsYXN0SXRlbSkgcmVxLm9uc3VjY2VzcyA9IHdyYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgaG9va0N0eCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyID0gaG9va2VkRXZlbnRSZWplY3RIYW5kbGVyKHJlamVjdCksXG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NIYW5kbGVyID0gaG9va2VkRXZlbnRTdWNjZXNzSGFuZGxlcihudWxsKTtcbiAgICAgICAgICAgICAgICB0cnlDYXRjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tDdHggPSB7IG9uc3VjY2VzczogbnVsbCwgb25lcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR1cGxlID0ga2V5c09yVHVwbGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpbmdIb29rLmNhbGwoaG9va0N0eCwgdHVwbGVbMF0sIHR1cGxlWzFdLCB0cmFucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0gaWRic3RvcmUuZGVsZXRlKHR1cGxlWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5faG9va0N0eCA9IGhvb2tDdHg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGVycm9ySGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBsYXN0SXRlbSkgcmVxLm9uc3VjY2VzcyA9IGhvb2tlZEV2ZW50U3VjY2Vzc0hhbmRsZXIocmVzb2x2ZSk7ZWxzZSByZXEub25zdWNjZXNzID0gc3VjY2Vzc0hhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvb2tDdHgub25lcnJvciAmJiBob29rQ3R4Lm9uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS51bmNhdWdodChkYlVuY2F1Z2h0KTtcbiAgICB9XG5cbiAgICBkZXJpdmUoV3JpdGVhYmxlVGFibGUpLmZyb20oVGFibGUpLmV4dGVuZCh7XG4gICAgICAgIGJ1bGtEZWxldGU6IGZ1bmN0aW9uIChrZXlzJCQxKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ob29rLmRlbGV0aW5nLmZpcmUgPT09IG5vcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pZGJzdG9yZShSRUFEV1JJVEUsIGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QsIGlkYnN0b3JlLCB0cmFucykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGJ1bGtEZWxldGUoaWRic3RvcmUsIHRyYW5zLCBrZXlzJCQxLCBmYWxzZSwgbm9wKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndoZXJlKCc6aWQnKS5hbnlPZihrZXlzJCQxKS5kZWxldGUoKS50aGVuKGZ1bmN0aW9uICgpIHt9KTsgLy8gUmVzb2x2ZSB3aXRoIHVuZGVmaW5lZC5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYnVsa1B1dDogZnVuY3Rpb24gKG9iamVjdHMsIGtleXMkJDEpIHtcbiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pZGJzdG9yZShSRUFEV1JJVEUsIGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QsIGlkYnN0b3JlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpZGJzdG9yZS5rZXlQYXRoICYmICFfdGhpcy5zY2hlbWEucHJpbUtleS5hdXRvICYmICFrZXlzJCQxKSB0aHJvdyBuZXcgZXhjZXB0aW9ucy5JbnZhbGlkQXJndW1lbnQoXCJidWxrUHV0KCkgd2l0aCBub24taW5ib3VuZCBrZXlzIHJlcXVpcmVzIGtleXMgYXJyYXkgaW4gc2Vjb25kIGFyZ3VtZW50XCIpO1xuICAgICAgICAgICAgICAgIGlmIChpZGJzdG9yZS5rZXlQYXRoICYmIGtleXMkJDEpIHRocm93IG5ldyBleGNlcHRpb25zLkludmFsaWRBcmd1bWVudChcImJ1bGtQdXQoKToga2V5cyBhcmd1bWVudCBpbnZhbGlkIG9uIHRhYmxlcyB3aXRoIGluYm91bmQga2V5c1wiKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5cyQkMSAmJiBrZXlzJCQxLmxlbmd0aCAhPT0gb2JqZWN0cy5sZW5ndGgpIHRocm93IG5ldyBleGNlcHRpb25zLkludmFsaWRBcmd1bWVudChcIkFyZ3VtZW50cyBvYmplY3RzIGFuZCBrZXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGhcIik7XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdHMubGVuZ3RoID09PSAwKSByZXR1cm4gcmVzb2x2ZSgpOyAvLyBDYWxsZXIgcHJvdmlkZWQgZW1wdHkgbGlzdC5cbiAgICAgICAgICAgICAgICB2YXIgZG9uZSA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yTGlzdC5sZW5ndGggPT09IDApIHJlc29sdmUocmVzdWx0KTtlbHNlIHJlamVjdChuZXcgQnVsa0Vycm9yKF90aGlzLm5hbWUgKyAnLmJ1bGtQdXQoKTogJyArIGVycm9yTGlzdC5sZW5ndGggKyAnIG9mICcgKyBudW1PYmpzICsgJyBvcGVyYXRpb25zIGZhaWxlZCcsIGVycm9yTGlzdCkpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdmFyIHJlcSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JMaXN0ID0gW10sXG4gICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgbnVtT2JqcyA9IG9iamVjdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IF90aGlzO1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5ob29rLmNyZWF0aW5nLmZpcmUgPT09IG5vcCAmJiBfdGhpcy5ob29rLnVwZGF0aW5nLmZpcmUgPT09IG5vcCkge1xuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGFuZGFyZCBCdWxrIChubyAnY3JlYXRpbmcnIG9yICd1cGRhdGluZycgaG9va3MgdG8gY2FyZSBhYm91dClcbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyID0gQnVsa0Vycm9ySGFuZGxlckNhdGNoQWxsKGVycm9yTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqZWN0cy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcSA9IGtleXMkJDEgPyBpZGJzdG9yZS5wdXQob2JqZWN0c1tpXSwga2V5cyQkMVtpXSkgOiBpZGJzdG9yZS5wdXQob2JqZWN0c1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGVycm9ySGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IG5lZWQgdG8gY2F0Y2ggc3VjY2VzcyBvciBlcnJvciBvbiB0aGUgbGFzdCBvcGVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBJREIgc3BlYy5cbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBCdWxrRXJyb3JIYW5kbGVyQ2F0Y2hBbGwoZXJyb3JMaXN0LCBkb25lKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGV2ZW50U3VjY2Vzc0hhbmRsZXIoZG9uZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVmZmVjdGl2ZUtleXMgPSBrZXlzJCQxIHx8IGlkYnN0b3JlLmtleVBhdGggJiYgb2JqZWN0cy5tYXAoZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRCeUtleVBhdGgobywgaWRic3RvcmUua2V5UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZSBtYXAgb2Yge1trZXldOiBvYmplY3R9XG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmplY3RMb29rdXAgPSBlZmZlY3RpdmVLZXlzICYmIGFycmF5VG9PYmplY3QoZWZmZWN0aXZlS2V5cywgZnVuY3Rpb24gKGtleSwgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleSAhPSBudWxsICYmIFtrZXksIG9iamVjdHNbaV1dO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSAhZWZmZWN0aXZlS2V5cyA/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQXV0by1pbmNyZW1lbnRlZCBrZXktbGVzcyBvYmplY3RzIG9ubHkgd2l0aG91dCBhbnkga2V5cyBhcmd1bWVudC5cbiAgICAgICAgICAgICAgICAgICAgdGFibGUuYnVsa0FkZChvYmplY3RzKSA6XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gS2V5cyBwcm92aWRlZC4gRWl0aGVyIGFzIGluYm91bmQgaW4gcHJvdmlkZWQgb2JqZWN0cywgb3IgYXMgYSBrZXlzIGFyZ3VtZW50LlxuICAgICAgICAgICAgICAgICAgICAvLyBCZWdpbiB3aXRoIHVwZGF0aW5nIHRob3NlIHRoYXQgZXhpc3RzIGluIERCOlxuICAgICAgICAgICAgICAgICAgICB0YWJsZS53aGVyZSgnOmlkJykuYW55T2YoZWZmZWN0aXZlS2V5cy5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleSAhPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9KSkubW9kaWZ5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBvYmplY3RMb29rdXBbdGhpcy5wcmltS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdExvb2t1cFt0aGlzLnByaW1LZXldID0gbnVsbDsgLy8gTWFyayBhcyBcImRvbid0IGFkZCB0aGlzXCJcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goTW9kaWZ5RXJyb3IsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3QgPSBlLmZhaWx1cmVzOyAvLyBObyBuZWVkIHRvIGNvbmNhdCBoZXJlLiBUaGVzZSBhcmUgdGhlIGZpcnN0IGVycm9ycyBhZGRlZC5cbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3csIGxldCdzIGV4YW1pbmUgd2hpY2ggaXRlbXMgZGlkbnQgZXhpc3Qgc28gd2UgY2FuIGFkZCB0aGVtOlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9ianNUb0FkZCA9IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNUb0FkZCA9IGtleXMkJDEgJiYgW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIGJhY2t3YXJkcy4gV2h5PyBCZWNhdXNlIGlmIHNhbWUga2V5IHdhcyB1c2VkIHR3aWNlLCBqdXN0IGFkZCB0aGUgbGFzdCBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gZWZmZWN0aXZlS2V5cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBlZmZlY3RpdmVLZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBvYmplY3RMb29rdXBba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpzVG9BZGQucHVzaChvYmplY3RzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cyQkMSAmJiBrZXlzVG9BZGQucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIG9iamVjdExvb2t1cFtrZXldID0gbnVsbDsgLy8gTWFyayBhcyBcImRvbnQgYWRkIGFnYWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaXRlbXMgYXJlIGluIHJldmVyc2Ugb3JkZXIgc28gcmV2ZXJzZSB0aGVtIGJlZm9yZSBhZGRpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3VsZCBiZSBpbXBvcnRhbnQgaW4gb3JkZXIgdG8gZ2V0IGF1dG8taW5jcmVtZW50ZWQga2V5cyB0aGUgd2F5IHRoZSBjYWxsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGV4cGVjdC4gQ291bGQgaGF2ZSB1c2VkIHVuc2hpZnQgaW5zdGVhZCBvZiBwdXNoKCkvcmV2ZXJzZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0OiBodHRwOi8vanNwZXJmLmNvbS91bnNoaWZ0LXZzLXJldmVyc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ianNUb0FkZC5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzJCQxICYmIGtleXNUb0FkZC5yZXZlcnNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGUuYnVsa0FkZChvYmpzVG9BZGQsIGtleXNUb0FkZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGxhc3RBZGRlZEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB3aXRoIGtleSBvZiB0aGUgbGFzdCBvYmplY3QgaW4gZ2l2ZW4gYXJndW1lbnRzIHRvIGJ1bGtQdXQoKTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYXN0RWZmZWN0aXZlS2V5ID0gZWZmZWN0aXZlS2V5c1tlZmZlY3RpdmVLZXlzLmxlbmd0aCAtIDFdOyAvLyBLZXkgd2FzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RFZmZlY3RpdmVLZXkgIT0gbnVsbCA/IGxhc3RFZmZlY3RpdmVLZXkgOiBsYXN0QWRkZWRLZXk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHByb21pc2UudGhlbihkb25lKS5jYXRjaChCdWxrRXJyb3IsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25jYXQgZmFpbHVyZSBmcm9tIE1vZGlmeUVycm9yIGFuZCByZWplY3QgdXNpbmcgb3VyICdkb25lJyBtZXRob2QuXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3QgPSBlcnJvckxpc3QuY29uY2F0KGUuZmFpbHVyZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIFwibG9ja2VkXCIpOyAvLyBJZiBjYWxsZWQgZnJvbSB0cmFuc2FjdGlvbiBzY29wZSwgbG9jayB0cmFuc2FjdGlvbiB0aWwgYWxsIHN0ZXBzIGFyZSBkb25lLlxuICAgICAgICB9LFxuICAgICAgICBidWxrQWRkOiBmdW5jdGlvbiAob2JqZWN0cywga2V5cyQkMSkge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzLFxuICAgICAgICAgICAgICAgIGNyZWF0aW5nSG9vayA9IHRoaXMuaG9vay5jcmVhdGluZy5maXJlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lkYnN0b3JlKFJFQURXUklURSwgZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUsIHRyYW5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpZGJzdG9yZS5rZXlQYXRoICYmICFzZWxmLnNjaGVtYS5wcmltS2V5LmF1dG8gJiYgIWtleXMkJDEpIHRocm93IG5ldyBleGNlcHRpb25zLkludmFsaWRBcmd1bWVudChcImJ1bGtBZGQoKSB3aXRoIG5vbi1pbmJvdW5kIGtleXMgcmVxdWlyZXMga2V5cyBhcnJheSBpbiBzZWNvbmQgYXJndW1lbnRcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkYnN0b3JlLmtleVBhdGggJiYga2V5cyQkMSkgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuSW52YWxpZEFyZ3VtZW50KFwiYnVsa0FkZCgpOiBrZXlzIGFyZ3VtZW50IGludmFsaWQgb24gdGFibGVzIHdpdGggaW5ib3VuZCBrZXlzXCIpO1xuICAgICAgICAgICAgICAgIGlmIChrZXlzJCQxICYmIGtleXMkJDEubGVuZ3RoICE9PSBvYmplY3RzLmxlbmd0aCkgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuSW52YWxpZEFyZ3VtZW50KFwiQXJndW1lbnRzIG9iamVjdHMgYW5kIGtleXMgbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aFwiKTtcbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0cy5sZW5ndGggPT09IDApIHJldHVybiByZXNvbHZlKCk7IC8vIENhbGxlciBwcm92aWRlZCBlbXB0eSBsaXN0LlxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvbmUocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckxpc3QubGVuZ3RoID09PSAwKSByZXNvbHZlKHJlc3VsdCk7ZWxzZSByZWplY3QobmV3IEJ1bGtFcnJvcihzZWxmLm5hbWUgKyAnLmJ1bGtBZGQoKTogJyArIGVycm9yTGlzdC5sZW5ndGggKyAnIG9mICcgKyBudW1PYmpzICsgJyBvcGVyYXRpb25zIGZhaWxlZCcsIGVycm9yTGlzdCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgcmVxLFxuICAgICAgICAgICAgICAgICAgICBlcnJvckxpc3QgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyLFxuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzSGFuZGxlcixcbiAgICAgICAgICAgICAgICAgICAgbnVtT2JqcyA9IG9iamVjdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGlmIChjcmVhdGluZ0hvb2sgIT09IG5vcCkge1xuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgc3Vic2NyaWJlcnMgdG8gaG9vaygnY3JlYXRpbmcnKVxuICAgICAgICAgICAgICAgICAgICAvLyBNdXN0IGJlaGF2ZSBhcyBkb2N1bWVudGVkLlxuICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5UGF0aCA9IGlkYnN0b3JlLmtleVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBob29rQ3R4O1xuICAgICAgICAgICAgICAgICAgICBlcnJvckhhbmRsZXIgPSBCdWxrRXJyb3JIYW5kbGVyQ2F0Y2hBbGwoZXJyb3JMaXN0LCBudWxsLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIgPSBob29rZWRFdmVudFN1Y2Nlc3NIYW5kbGVyKG51bGwpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyeUNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gb2JqZWN0cy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob29rQ3R4ID0geyBvbmVycm9yOiBudWxsLCBvbnN1Y2Nlc3M6IG51bGwgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0ga2V5cyQkMSAmJiBrZXlzJCQxW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBvYmplY3RzW2ldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVLZXkgPSBrZXlzJCQxID8ga2V5IDoga2V5UGF0aCA/IGdldEJ5S2V5UGF0aChvYmosIGtleVBhdGgpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlUb1VzZSA9IGNyZWF0aW5nSG9vay5jYWxsKGhvb2tDdHgsIGVmZmVjdGl2ZUtleSwgb2JqLCB0cmFucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUtleSA9PSBudWxsICYmIGtleVRvVXNlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IGRlZXBDbG9uZShvYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QnlLZXlQYXRoKG9iaiwga2V5UGF0aCwga2V5VG9Vc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5VG9Vc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxID0ga2V5ICE9IG51bGwgPyBpZGJzdG9yZS5hZGQob2JqLCBrZXkpIDogaWRic3RvcmUuYWRkKG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLl9ob29rQ3R4ID0gaG9va0N0eDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IGwgLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZXJyb3JIYW5kbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9va0N0eC5vbnN1Y2Nlc3MpIHJlcS5vbnN1Y2Nlc3MgPSBzdWNjZXNzSGFuZGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tDdHgub25lcnJvciAmJiBob29rQ3R4Lm9uZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBCdWxrRXJyb3JIYW5kbGVyQ2F0Y2hBbGwoZXJyb3JMaXN0LCBkb25lLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGhvb2tlZEV2ZW50U3VjY2Vzc0hhbmRsZXIoZG9uZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gU3RhbmRhcmQgQnVsayAobm8gJ2NyZWF0aW5nJyBob29rIHRvIGNhcmUgYWJvdXQpXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlciA9IEJ1bGtFcnJvckhhbmRsZXJDYXRjaEFsbChlcnJvckxpc3QpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXEgPSBrZXlzJCQxID8gaWRic3RvcmUuYWRkKG9iamVjdHNbaV0sIGtleXMkJDFbaV0pIDogaWRic3RvcmUuYWRkKG9iamVjdHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBlcnJvckhhbmRsZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBuZWVkIHRvIGNhdGNoIHN1Y2Nlc3Mgb3IgZXJyb3Igb24gdGhlIGxhc3Qgb3BlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byB0aGUgSURCIHNwZWMuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gQnVsa0Vycm9ySGFuZGxlckNhdGNoQWxsKGVycm9yTGlzdCwgZG9uZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBldmVudFN1Y2Nlc3NIYW5kbGVyKGRvbmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBhZGQ6IGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PlxuICAgICAgICAgICAgLy8vICAgQWRkIGFuIG9iamVjdCB0byB0aGUgZGF0YWJhc2UuIEluIGNhc2UgYW4gb2JqZWN0IHdpdGggc2FtZSBwcmltYXJ5IGtleSBhbHJlYWR5IGV4aXN0cywgdGhlIG9iamVjdCB3aWxsIG5vdCBiZSBhZGRlZC5cbiAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+XG4gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJvYmpcIiB0eXBlPVwiT2JqZWN0XCI+QSBqYXZhc2NyaXB0IG9iamVjdCB0byBpbnNlcnQ8L3BhcmFtPlxuICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPVwia2V5XCIgb3B0aW9uYWw9XCJ0cnVlXCI+UHJpbWFyeSBrZXk8L3BhcmFtPlxuICAgICAgICAgICAgdmFyIGNyZWF0aW5nSG9vayA9IHRoaXMuaG9vay5jcmVhdGluZy5maXJlO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lkYnN0b3JlKFJFQURXUklURSwgZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUsIHRyYW5zKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhvb2tDdHggPSB7IG9uc3VjY2VzczogbnVsbCwgb25lcnJvcjogbnVsbCB9O1xuICAgICAgICAgICAgICAgIGlmIChjcmVhdGluZ0hvb2sgIT09IG5vcCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWZmZWN0aXZlS2V5ID0ga2V5ICE9IG51bGwgPyBrZXkgOiBpZGJzdG9yZS5rZXlQYXRoID8gZ2V0QnlLZXlQYXRoKG9iaiwgaWRic3RvcmUua2V5UGF0aCkgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXlUb1VzZSA9IGNyZWF0aW5nSG9vay5jYWxsKGhvb2tDdHgsIGVmZmVjdGl2ZUtleSwgb2JqLCB0cmFucyk7IC8vIEFsbG93IHN1YnNjcmliZXJzIHRvIHdoZW4oXCJjcmVhdGluZ1wiKSB0byBnZW5lcmF0ZSB0aGUga2V5LlxuICAgICAgICAgICAgICAgICAgICBpZiAoZWZmZWN0aXZlS2V5ID09IG51bGwgJiYga2V5VG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNpbmcgXCI9PVwiIGFuZCBcIiE9XCIgdG8gY2hlY2sgZm9yIGVpdGhlciBudWxsIG9yIHVuZGVmaW5lZCFcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZGJzdG9yZS5rZXlQYXRoKSBzZXRCeUtleVBhdGgob2JqLCBpZGJzdG9yZS5rZXlQYXRoLCBrZXlUb1VzZSk7ZWxzZSBrZXkgPSBrZXlUb1VzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0ga2V5ICE9IG51bGwgPyBpZGJzdG9yZS5hZGQob2JqLCBrZXkpIDogaWRic3RvcmUuYWRkKG9iaik7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5faG9va0N0eCA9IGhvb2tDdHg7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gaG9va2VkRXZlbnRSZWplY3RIYW5kbGVyKHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBob29rZWRFdmVudFN1Y2Nlc3NIYW5kbGVyKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGVzZSB0d28gbGluZXMgaW4gbmV4dCBtYWpvciByZWxlYXNlICgyLjA/KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBubyBnb29kIHByYWN0aWNlIHRvIGhhdmUgc2lkZSBlZmZlY3RzIG9uIHByb3ZpZGVkIHBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlQYXRoID0gaWRic3RvcmUua2V5UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlQYXRoKSBzZXRCeUtleVBhdGgob2JqLCBrZXlQYXRoLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChob29rQ3R4Lm9uZXJyb3IpIGhvb2tDdHgub25lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBwdXQ6IGZ1bmN0aW9uIChvYmosIGtleSkge1xuICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PlxuICAgICAgICAgICAgLy8vICAgQWRkIGFuIG9iamVjdCB0byB0aGUgZGF0YWJhc2UgYnV0IGluIGNhc2UgYW4gb2JqZWN0IHdpdGggc2FtZSBwcmltYXJ5IGtleSBhbHJlYWQgZXhpc3RzLCB0aGUgZXhpc3Rpbmcgb25lIHdpbGwgZ2V0IHVwZGF0ZWQuXG4gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PlxuICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPVwib2JqXCIgdHlwZT1cIk9iamVjdFwiPkEgamF2YXNjcmlwdCBvYmplY3QgdG8gaW5zZXJ0IG9yIHVwZGF0ZTwvcGFyYW0+XG4gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJrZXlcIiBvcHRpb25hbD1cInRydWVcIj5QcmltYXJ5IGtleTwvcGFyYW0+XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgICAgICAgY3JlYXRpbmdIb29rID0gdGhpcy5ob29rLmNyZWF0aW5nLmZpcmUsXG4gICAgICAgICAgICAgICAgdXBkYXRpbmdIb29rID0gdGhpcy5ob29rLnVwZGF0aW5nLmZpcmU7XG4gICAgICAgICAgICBpZiAoY3JlYXRpbmdIb29rICE9PSBub3AgfHwgdXBkYXRpbmdIb29rICE9PSBub3ApIHtcbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIFBlb3BsZSBsaXN0ZW5zIHRvIHdoZW4oXCJjcmVhdGluZ1wiKSBvciB3aGVuKFwidXBkYXRpbmdcIikgZXZlbnRzIVxuICAgICAgICAgICAgICAgIC8vIFdlIG11c3Qga25vdyB3aGV0aGVyIHRoZSBwdXQgb3BlcmF0aW9uIHJlc3VsdHMgaW4gYW4gQ1JFQVRFIG9yIFVQREFURS5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFucyhSRUFEV1JJVEUsIGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QsIHRyYW5zKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIGtleSBpcyBvcHRpb25hbCwgbWFrZSBzdXJlIHdlIGdldCBpdCBmcm9tIG9iaiBpZiBub3QgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICAgICAgdmFyIGVmZmVjdGl2ZUtleSA9IGtleSAhPT0gdW5kZWZpbmVkID8ga2V5IDogc2VsZi5zY2hlbWEucHJpbUtleS5rZXlQYXRoICYmIGdldEJ5S2V5UGF0aChvYmosIHNlbGYuc2NoZW1hLnByaW1LZXkua2V5UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlZmZlY3RpdmVLZXkgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCI9PSBudWxsXCIgbWVhbnMgY2hlY2tpbmcgZm9yIGVpdGhlciBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHByaW1hcnkga2V5LiBNdXN0IHVzZSBhZGQoKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKG9iaikudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJpbWFyeSBrZXkgZXhpc3QuIExvY2sgdHJhbnNhY3Rpb24gYW5kIHRyeSBtb2RpZnlpbmcgZXhpc3RpbmcuIElmIG5vdGhpbmcgbW9kaWZpZWQsIGNhbGwgYWRkKCkuXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFucy5fbG9jaygpOyAvLyBOZWVkZWQgYmVjYXVzZSBvcGVyYXRpb24gaXMgc3BsaXR0ZWQgaW50byBtb2RpZnkoKSBhbmQgYWRkKCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9uZSBvYmogYmVmb3JlIHRoaXMgYXN5bmMgY2FsbC4gSWYgY2FsbGVyIG1vZGlmaWVzIG9iaiB0aGUgbGluZSBhZnRlciBwdXQoKSwgdGhlIElEQiBzcGVjIHJlcXVpcmVzIHRoYXQgaXQgc2hvdWxkIG5vdCBhZmZlY3Qgb3BlcmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gZGVlcENsb25lKG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndoZXJlKFwiOmlkXCIpLmVxdWFscyhlZmZlY3RpdmVLZXkpLm1vZGlmeShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVwbGFjZSBleHRpc3RpbmcgdmFsdWUgd2l0aCBvdXIgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ1JVRCBldmVudCBmaXJpbmcgaGFuZGxlZCBpbiBXcml0ZWFibGVDb2xsZWN0aW9uLm1vZGlmeSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG9iajtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGNvdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9iamVjdCdzIGtleSB3YXMgbm90IGZvdW5kLiBBZGQgdGhlIG9iamVjdCBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDUlVEIGV2ZW50IGZpcmluZyB3aWxsIGJlIGRvbmUgaW4gYWRkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuYWRkKG9iaiwga2V5KTsgLy8gUmVzb2x2aW5nIHdpdGggYW5vdGhlciBQcm9taXNlLiBSZXR1cm5lZCBQcm9taXNlIHdpbGwgdGhlbiByZXNvbHZlIHdpdGggdGhlIG5ldyBrZXkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVmZmVjdGl2ZUtleTsgLy8gUmVzb2x2ZSB3aXRoIHRoZSBwcm92aWRlZCBrZXkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMuX3VubG9jaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgc3RhbmRhcmQgSURCIHB1dCgpIG1ldGhvZC5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faWRic3RvcmUoUkVBRFdSSVRFLCBmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0LCBpZGJzdG9yZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0ga2V5ICE9PSB1bmRlZmluZWQgPyBpZGJzdG9yZS5wdXQob2JqLCBrZXkpIDogaWRic3RvcmUucHV0KG9iaik7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZXZlbnRSZWplY3RIYW5kbGVyKHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlQYXRoID0gaWRic3RvcmUua2V5UGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlQYXRoKSBzZXRCeUtleVBhdGgob2JqLCBrZXlQYXRoLCBldi50YXJnZXQucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVxLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cImtleVwiPlByaW1hcnkga2V5IG9mIHRoZSBvYmplY3QgdG8gZGVsZXRlPC9wYXJhbT5cbiAgICAgICAgICAgIGlmICh0aGlzLmhvb2suZGVsZXRpbmcuc3Vic2NyaWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gUGVvcGxlIGxpc3RlbnMgdG8gd2hlbihcImRlbGV0aW5nXCIpIGV2ZW50LiBNdXN0IGltcGxlbWVudCBkZWxldGUgdXNpbmcgV3JpdGVhYmxlQ29sbGVjdGlvbi5kZWxldGUoKSB0aGF0IHdpbGxcbiAgICAgICAgICAgICAgICAvLyBjYWxsIHRoZSBDUlVEIGV2ZW50LiBPbmx5IFdyaXRlYWJsZUNvbGxlY3Rpb24uZGVsZXRlKCkgd2lsbCBrbm93IHdoZXRoZXIgYW4gb2JqZWN0IHdhcyBhY3R1YWxseSBkZWxldGVkLlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLndoZXJlKFwiOmlkXCIpLmVxdWFscyhrZXkpLmRlbGV0ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBObyBvbmUgbGlzdGVucy4gVXNlIHN0YW5kYXJkIElEQiBkZWxldGUoKSBtZXRob2QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lkYnN0b3JlKFJFQURXUklURSwgZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IGlkYnN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGV2ZW50UmVqZWN0SGFuZGxlcihyZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXEucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBjbGVhcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaG9vay5kZWxldGluZy5zdWJzY3JpYmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyBQZW9wbGUgbGlzdGVucyB0byB3aGVuKFwiZGVsZXRpbmdcIikgZXZlbnQuIE11c3QgaW1wbGVtZW50IGRlbGV0ZSB1c2luZyBXcml0ZWFibGVDb2xsZWN0aW9uLmRlbGV0ZSgpIHRoYXQgd2lsbFxuICAgICAgICAgICAgICAgIC8vIGNhbGwgdGhlIENSVUQgZXZlbnQuIE9ubHkgV3JpdGVhYmxlQ29sbGVjdGlvbi5kZWxldGUoKSB3aWxsIGtub3dzIHdoaWNoIG9iamVjdHMgdGhhdCBhcmUgYWN0dWFsbHkgZGVsZXRlZC5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b0NvbGxlY3Rpb24oKS5kZWxldGUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lkYnN0b3JlKFJFQURXUklURSwgZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IGlkYnN0b3JlLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZXZlbnRSZWplY3RIYW5kbGVyKHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHVwZGF0ZTogZnVuY3Rpb24gKGtleU9yT2JqZWN0LCBtb2RpZmljYXRpb25zKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1vZGlmaWNhdGlvbnMgIT09ICdvYmplY3QnIHx8IGlzQXJyYXkobW9kaWZpY2F0aW9ucykpIHRocm93IG5ldyBleGNlcHRpb25zLkludmFsaWRBcmd1bWVudChcIk1vZGlmaWNhdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QuXCIpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXlPck9iamVjdCA9PT0gJ29iamVjdCcgJiYgIWlzQXJyYXkoa2V5T3JPYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0IHRvIG1vZGlmeS4gQWxzbyBtb2RpZnkgZ2l2ZW4gb2JqZWN0IHdpdGggdGhlIG1vZGlmaWNhdGlvbnM6XG4gICAgICAgICAgICAgICAga2V5cyhtb2RpZmljYXRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXlQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEJ5S2V5UGF0aChrZXlPck9iamVjdCwga2V5UGF0aCwgbW9kaWZpY2F0aW9uc1trZXlQYXRoXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGdldEJ5S2V5UGF0aChrZXlPck9iamVjdCwgdGhpcy5zY2hlbWEucHJpbUtleS5rZXlQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHJldHVybiByZWplY3Rpb24obmV3IGV4Y2VwdGlvbnMuSW52YWxpZEFyZ3VtZW50KFwiR2l2ZW4gb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gaXRzIHByaW1hcnkga2V5XCIpLCBkYlVuY2F1Z2h0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53aGVyZShcIjppZFwiKS5lcXVhbHMoa2V5KS5tb2RpZnkobW9kaWZpY2F0aW9ucyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGtleSB0byBtb2RpZnlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53aGVyZShcIjppZFwiKS5lcXVhbHMoa2V5T3JPYmplY3QpLm1vZGlmeShtb2RpZmljYXRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy8gVHJhbnNhY3Rpb24gQ2xhc3NcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmdW5jdGlvbiBUcmFuc2FjdGlvbihtb2RlLCBzdG9yZU5hbWVzLCBkYnNjaGVtYSwgcGFyZW50KSB7XG4gICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgIC8vLyA8c3VtbWFyeT5cbiAgICAgICAgLy8vICAgIFRyYW5zYWN0aW9uIGNsYXNzLiBSZXByZXNlbnRzIGEgZGF0YWJhc2UgdHJhbnNhY3Rpb24uIEFsbCBvcGVyYXRpb25zIG9uIGRiIGdvZXMgdGhyb3VnaCBhIFRyYW5zYWN0aW9uLlxuICAgICAgICAvLy8gPC9zdW1tYXJ5PlxuICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJtb2RlXCIgdHlwZT1cIlN0cmluZ1wiPkFueSBvZiBcInJlYWR3cml0ZVwiIG9yIFwicmVhZG9ubHlcIjwvcGFyYW0+XG4gICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cInN0b3JlTmFtZXNcIiB0eXBlPVwiQXJyYXlcIj5BcnJheSBvZiB0YWJsZSBuYW1lcyB0byBvcGVyYXRlIG9uPC9wYXJhbT5cbiAgICAgICAgdGhpcy5kYiA9IGRiO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgICB0aGlzLnN0b3JlTmFtZXMgPSBzdG9yZU5hbWVzO1xuICAgICAgICB0aGlzLmlkYnRyYW5zID0gbnVsbDtcbiAgICAgICAgdGhpcy5vbiA9IEV2ZW50cyh0aGlzLCBcImNvbXBsZXRlXCIsIFwiZXJyb3JcIiwgXCJhYm9ydFwiKTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQgfHwgbnVsbDtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB0aGlzLl90YWJsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWN1bG9jayA9IDA7XG4gICAgICAgIHRoaXMuX2Jsb2NrZWRGdW5jcyA9IFtdO1xuICAgICAgICB0aGlzLl9wc2QgPSBudWxsO1xuICAgICAgICB0aGlzLl9kYnNjaGVtYSA9IGRic2NoZW1hO1xuICAgICAgICB0aGlzLl9yZXNvbHZlID0gbnVsbDtcbiAgICAgICAgdGhpcy5fcmVqZWN0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY29tcGxldGlvbiA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIF90aGlzMi5fcmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICBfdGhpczIuX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSkudW5jYXVnaHQoZGJVbmNhdWdodCk7XG5cbiAgICAgICAgdGhpcy5fY29tcGxldGlvbi50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMi5vbi5jb21wbGV0ZS5maXJlKCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBfdGhpczIub24uZXJyb3IuZmlyZShlKTtcbiAgICAgICAgICAgIF90aGlzMi5wYXJlbnQgPyBfdGhpczIucGFyZW50Ll9yZWplY3QoZSkgOiBfdGhpczIuYWN0aXZlICYmIF90aGlzMi5pZGJ0cmFucyAmJiBfdGhpczIuaWRidHJhbnMuYWJvcnQoKTtcbiAgICAgICAgICAgIF90aGlzMi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3Rpb24oZSk7IC8vIEluZGljYXRlIHdlIGFjdHVhbGx5IERPIE5PVCBjYXRjaCB0aGlzIGVycm9yLlxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm9wcyhUcmFuc2FjdGlvbi5wcm90b3R5cGUsIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVHJhbnNhY3Rpb24gUHJvdGVjdGVkIE1ldGhvZHMgKG5vdCByZXF1aXJlZCBieSBBUEkgdXNlcnMsIGJ1dCBuZWVkZWQgaW50ZXJuYWxseSBhbmQgZXZlbnR1YWxseSBieSBkZXhpZSBleHRlbnNpb25zKVxuICAgICAgICAvL1xuICAgICAgICBfbG9jazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgYXNzZXJ0KCFQU0QuZ2xvYmFsKTsgLy8gTG9ja2luZyBhbmQgdW5sb2NraW5nIHJldWlyZXMgdG8gYmUgd2l0aGluIGEgUFNEIHNjb3BlLlxuICAgICAgICAgICAgLy8gVGVtcG9yYXJ5IHNldCBhbGwgcmVxdWVzdHMgaW50byBhIHBlbmRpbmcgcXVldWUgaWYgdGhleSBhcmUgY2FsbGVkIGJlZm9yZSBkYXRhYmFzZSBpcyByZWFkeS5cbiAgICAgICAgICAgICsrdGhpcy5fcmVjdWxvY2s7IC8vIFJlY3Vyc2l2ZSByZWFkL3dyaXRlIGxvY2sgcGF0dGVybiB1c2luZyBQU0QgKFByb21pc2UgU3BlY2lmaWMgRGF0YSkgaW5zdGVhZCBvZiBUTFMgKFRocmVhZCBMb2NhbCBTdG9yYWdlKVxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlY3Vsb2NrID09PSAxICYmICFQU0QuZ2xvYmFsKSBQU0QubG9ja093bmVyRm9yID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBfdW5sb2NrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBhc3NlcnQoIVBTRC5nbG9iYWwpOyAvLyBMb2NraW5nIGFuZCB1bmxvY2tpbmcgcmV1aXJlcyB0byBiZSB3aXRoaW4gYSBQU0Qgc2NvcGUuXG4gICAgICAgICAgICBpZiAoLS10aGlzLl9yZWN1bG9jayA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICghUFNELmdsb2JhbCkgUFNELmxvY2tPd25lckZvciA9IG51bGw7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2Jsb2NrZWRGdW5jcy5sZW5ndGggPiAwICYmICF0aGlzLl9sb2NrZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZm5BbmRQU0QgPSB0aGlzLl9ibG9ja2VkRnVuY3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBTRChmbkFuZFBTRFsxXSwgZm5BbmRQU0RbMF0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgICAgICBfbG9ja2VkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBDaGVja3MgaWYgYW55IHdyaXRlLWxvY2sgaXMgYXBwbGllZCBvbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAgICAgICAgLy8gVG8gc2ltcGxpZnkgdGhlIERleGllIEFQSSBmb3IgZXh0ZW5zaW9uIGltcGxlbWVudGF0aW9ucywgd2Ugc3VwcG9ydCByZWN1cnNpdmUgbG9ja3MuXG4gICAgICAgICAgICAvLyBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSB1c2luZyBcIlByb21pc2UgU3BlY2lmaWMgRGF0YVwiIChQU0QpLlxuICAgICAgICAgICAgLy8gUFNEIGRhdGEgaXMgYm91bmQgdG8gYSBQcm9taXNlIGFuZCBhbnkgY2hpbGQgUHJvbWlzZSBlbWl0dGVkIHRocm91Z2ggdGhlbigpIG9yIHJlc29sdmUoIG5ldyBQcm9taXNlKCkgKS5cbiAgICAgICAgICAgIC8vIFBTRCBpcyBsb2NhbCB0byBjb2RlIGV4ZWN1dGluZyBvbiB0b3Agb2YgdGhlIGNhbGwgc3RhY2tzIG9mIGFueSBvZiBhbnkgY29kZSBleGVjdXRlZCBieSBQcm9taXNlKCk6XG4gICAgICAgICAgICAvLyAgICAgICAgICogY2FsbGJhY2sgZ2l2ZW4gdG8gdGhlIFByb21pc2UoKSBjb25zdHJ1Y3RvciAgKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3Qpey4uLn0pXG4gICAgICAgICAgICAvLyAgICAgICAgICogY2FsbGJhY2tzIGdpdmVuIHRvIHRoZW4oKS9jYXRjaCgpL2ZpbmFsbHkoKSBtZXRob2RzIChmdW5jdGlvbiAodmFsdWUpey4uLn0pXG4gICAgICAgICAgICAvLyBJZiBjcmVhdGluZyBhIG5ldyBpbmRlcGVuZGFudCBQcm9taXNlIGluc3RhbmNlIGZyb20gd2l0aGluIGEgUHJvbWlzZSBjYWxsIHN0YWNrLCB0aGUgbmV3IFByb21pc2Ugd2lsbCBkZXJpdmUgdGhlIFBTRCBmcm9tIHRoZSBjYWxsIHN0YWNrIG9mIHRoZSBwYXJlbnQgUHJvbWlzZS5cbiAgICAgICAgICAgIC8vIERlcml2YXRpb24gaXMgZG9uZSBzbyB0aGF0IHRoZSBpbm5lciBQU0QgX19wcm90b19fIHBvaW50cyB0byB0aGUgb3V0ZXIgUFNELlxuICAgICAgICAgICAgLy8gUFNELmxvY2tPd25lckZvciB3aWxsIHBvaW50IHRvIGN1cnJlbnQgdHJhbnNhY3Rpb24gb2JqZWN0IGlmIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIFBTRCBzY29wZSBvd25zIHRoZSBsb2NrLlxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY3Vsb2NrICYmIFBTRC5sb2NrT3duZXJGb3IgIT09IHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZTogZnVuY3Rpb24gKGlkYnRyYW5zKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgICAgICAgYXNzZXJ0KCF0aGlzLmlkYnRyYW5zKTtcbiAgICAgICAgICAgIGlmICghaWRidHJhbnMgJiYgIWlkYmRiKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChkYk9wZW5FcnJvciAmJiBkYk9wZW5FcnJvci5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJEYXRhYmFzZUNsb3NlZEVycm9yXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvcnMgd2hlcmUgaXQgaXMgbm8gZGlmZmVyZW5jZSB3aGV0aGVyIGl0IHdhcyBjYXVzZWQgYnkgdGhlIHVzZXIgb3BlcmF0aW9uIG9yIGFuIGVhcmxpZXIgY2FsbCB0byBkYi5vcGVuKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBleGNlcHRpb25zLkRhdGFiYXNlQ2xvc2VkKGRiT3BlbkVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIk1pc3NpbmdBUElFcnJvclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3JzIHdoZXJlIGl0IGlzIG5vIGRpZmZlcmVuY2Ugd2hldGhlciBpdCB3YXMgY2F1c2VkIGJ5IHRoZSB1c2VyIG9wZXJhdGlvbiBvciBhbiBlYXJsaWVyIGNhbGwgdG8gZGIub3BlbigpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZXhjZXB0aW9ucy5NaXNzaW5nQVBJKGRiT3BlbkVycm9yLm1lc3NhZ2UsIGRiT3BlbkVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgaXQgY2xlYXIgdGhhdCB0aGUgdXNlciBvcGVyYXRpb24gd2FzIG5vdCB3aGF0IGNhdXNlZCB0aGUgZXJyb3IgLSB0aGUgZXJyb3IgaGFkIG9jY3VycmVkIGVhcmxpZXIgb24gZGIub3BlbigpIVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuT3BlbkZhaWxlZChkYk9wZW5FcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSkgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuVHJhbnNhY3Rpb25JbmFjdGl2ZSgpO1xuICAgICAgICAgICAgYXNzZXJ0KHRoaXMuX2NvbXBsZXRpb24uX3N0YXRlID09PSBudWxsKTtcblxuICAgICAgICAgICAgaWRidHJhbnMgPSB0aGlzLmlkYnRyYW5zID0gaWRidHJhbnMgfHwgaWRiZGIudHJhbnNhY3Rpb24oc2FmYXJpTXVsdGlTdG9yZUZpeCh0aGlzLnN0b3JlTmFtZXMpLCB0aGlzLm1vZGUpO1xuICAgICAgICAgICAgaWRidHJhbnMub25lcnJvciA9IHdyYXAoZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQoZXYpOyAvLyBQcm9oaWJpdCBkZWZhdWx0IGJ1YmJsaW5nIHRvIHdpbmRvdy5lcnJvclxuICAgICAgICAgICAgICAgIF90aGlzMy5fcmVqZWN0KGlkYnRyYW5zLmVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWRidHJhbnMub25hYm9ydCA9IHdyYXAoZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQoZXYpO1xuICAgICAgICAgICAgICAgIF90aGlzMy5hY3RpdmUgJiYgX3RoaXMzLl9yZWplY3QobmV3IGV4Y2VwdGlvbnMuQWJvcnQoKSk7XG4gICAgICAgICAgICAgICAgX3RoaXMzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIF90aGlzMy5vbihcImFib3J0XCIpLmZpcmUoZXYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZGJ0cmFucy5vbmNvbXBsZXRlID0gd3JhcChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIF90aGlzMy5fcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgX3Byb21pc2U6IGZ1bmN0aW9uIChtb2RlLCBmbiwgYldyaXRlTG9jaykge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgdmFyIHAgPSBzZWxmLl9sb2NrZWQoKSA/XG4gICAgICAgICAgICAvLyBSZWFkIGxvY2sgYWx3YXlzLiBUcmFuc2FjdGlvbiBpcyB3cml0ZS1sb2NrZWQuIFdhaXQgZm9yIG11dGV4LlxuICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgIHNlbGYuX2Jsb2NrZWRGdW5jcy5wdXNoKFtmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3Byb21pc2UobW9kZSwgZm4sIGJXcml0ZUxvY2spLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICB9LCBQU0RdKTtcbiAgICAgICAgICAgIH0pIDogbmV3U2NvcGUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBwXyA9IHNlbGYuYWN0aXZlID8gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gUkVBRFdSSVRFICYmIHNlbGYubW9kZSAhPT0gUkVBRFdSSVRFKSB0aHJvdyBuZXcgZXhjZXB0aW9ucy5SZWFkT25seShcIlRyYW5zYWN0aW9uIGlzIHJlYWRvbmx5XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuaWRidHJhbnMgJiYgbW9kZSkgc2VsZi5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJXcml0ZUxvY2spIHNlbGYuX2xvY2soKTsgLy8gV3JpdGUgbG9jayBpZiB3cml0ZSBvcGVyYXRpb24gaXMgcmVxdWVzdGVkXG4gICAgICAgICAgICAgICAgICAgIGZuKHJlc29sdmUsIHJlamVjdCwgc2VsZik7XG4gICAgICAgICAgICAgICAgfSkgOiByZWplY3Rpb24obmV3IGV4Y2VwdGlvbnMuVHJhbnNhY3Rpb25JbmFjdGl2ZSgpKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZi5hY3RpdmUgJiYgYldyaXRlTG9jaykgcF8uZmluYWxseShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuX3VubG9jaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwXztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBwLl9saWIgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIHAudW5jYXVnaHQoZGJVbmNhdWdodCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVHJhbnNhY3Rpb24gUHVibGljIFByb3BlcnRpZXMgYW5kIE1ldGhvZHNcbiAgICAgICAgLy9cbiAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlICYmIHRoaXMuX3JlamVjdChuZXcgZXhjZXB0aW9ucy5BYm9ydCgpKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdGFibGVzOiB7XG4gICAgICAgICAgICBnZXQ6IGRlcHJlY2F0ZWQoXCJUcmFuc2FjdGlvbi50YWJsZXNcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVRvT2JqZWN0KHRoaXMuc3RvcmVOYW1lcywgZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuYW1lLCBhbGxUYWJsZXNbbmFtZV1dO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgXCJVc2UgZGIudGFibGVzKClcIilcbiAgICAgICAgfSxcblxuICAgICAgICBjb21wbGV0ZTogZGVwcmVjYXRlZChcIlRyYW5zYWN0aW9uLmNvbXBsZXRlKClcIiwgZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vbihcImNvbXBsZXRlXCIsIGNiKTtcbiAgICAgICAgfSksXG5cbiAgICAgICAgZXJyb3I6IGRlcHJlY2F0ZWQoXCJUcmFuc2FjdGlvbi5lcnJvcigpXCIsIGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub24oXCJlcnJvclwiLCBjYik7XG4gICAgICAgIH0pLFxuXG4gICAgICAgIHRhYmxlOiBkZXByZWNhdGVkKFwiVHJhbnNhY3Rpb24udGFibGUoKVwiLCBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmVOYW1lcy5pbmRleE9mKG5hbWUpID09PSAtMSkgdGhyb3cgbmV3IGV4Y2VwdGlvbnMuSW52YWxpZFRhYmxlKFwiVGFibGUgXCIgKyBuYW1lICsgXCIgbm90IGluIHRyYW5zYWN0aW9uXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGFsbFRhYmxlc1tuYW1lXTtcbiAgICAgICAgfSlcblxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy8gV2hlcmVDbGF1c2VcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmdW5jdGlvbiBXaGVyZUNsYXVzZSh0YWJsZSwgaW5kZXgsIG9yQ29sbGVjdGlvbikge1xuICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJ0YWJsZVwiIHR5cGU9XCJUYWJsZVwiPjwvcGFyYW0+XG4gICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cImluZGV4XCIgdHlwZT1cIlN0cmluZ1wiIG9wdGlvbmFsPVwidHJ1ZVwiPjwvcGFyYW0+XG4gICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cIm9yQ29sbGVjdGlvblwiIHR5cGU9XCJDb2xsZWN0aW9uXCIgb3B0aW9uYWw9XCJ0cnVlXCI+PC9wYXJhbT5cbiAgICAgICAgdGhpcy5fY3R4ID0ge1xuICAgICAgICAgICAgdGFibGU6IHRhYmxlLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4ID09PSBcIjppZFwiID8gbnVsbCA6IGluZGV4LFxuICAgICAgICAgICAgY29sbENsYXNzOiB0YWJsZS5fY29sbENsYXNzLFxuICAgICAgICAgICAgb3I6IG9yQ29sbGVjdGlvblxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByb3BzKFdoZXJlQ2xhdXNlLnByb3RvdHlwZSwgZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIC8vIFdoZXJlQ2xhdXNlIHByaXZhdGUgbWV0aG9kc1xuXG4gICAgICAgIGZ1bmN0aW9uIGZhaWwoY29sbGVjdGlvbk9yV2hlcmVDbGF1c2UsIGVyciwgVCkge1xuICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uT3JXaGVyZUNsYXVzZSBpbnN0YW5jZW9mIFdoZXJlQ2xhdXNlID8gbmV3IGNvbGxlY3Rpb25PcldoZXJlQ2xhdXNlLl9jdHguY29sbENsYXNzKGNvbGxlY3Rpb25PcldoZXJlQ2xhdXNlKSA6IGNvbGxlY3Rpb25PcldoZXJlQ2xhdXNlO1xuXG4gICAgICAgICAgICBjb2xsZWN0aW9uLl9jdHguZXJyb3IgPSBUID8gbmV3IFQoZXJyKSA6IG5ldyBUeXBlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZW1wdHlDb2xsZWN0aW9uKHdoZXJlQ2xhdXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IHdoZXJlQ2xhdXNlLl9jdHguY29sbENsYXNzKHdoZXJlQ2xhdXNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLm9ubHkoXCJcIik7XG4gICAgICAgICAgICB9KS5saW1pdCgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHVwcGVyRmFjdG9yeShkaXIpIHtcbiAgICAgICAgICAgIHJldHVybiBkaXIgPT09IFwibmV4dFwiID8gZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfSA6IGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHMudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gbG93ZXJGYWN0b3J5KGRpcikge1xuICAgICAgICAgICAgcmV0dXJuIGRpciA9PT0gXCJuZXh0XCIgPyBmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9IDogZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcy50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBuZXh0Q2FzaW5nKGtleSwgbG93ZXJLZXksIHVwcGVyTmVlZGxlLCBsb3dlck5lZWRsZSwgY21wLCBkaXIpIHtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBNYXRoLm1pbihrZXkubGVuZ3RoLCBsb3dlck5lZWRsZS5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIGxscCA9IC0xO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHZhciBsd3JLZXlDaGFyID0gbG93ZXJLZXlbaV07XG4gICAgICAgICAgICAgICAgaWYgKGx3cktleUNoYXIgIT09IGxvd2VyTmVlZGxlW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjbXAoa2V5W2ldLCB1cHBlck5lZWRsZVtpXSkgPCAwKSByZXR1cm4ga2V5LnN1YnN0cigwLCBpKSArIHVwcGVyTmVlZGxlW2ldICsgdXBwZXJOZWVkbGUuc3Vic3RyKGkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNtcChrZXlbaV0sIGxvd2VyTmVlZGxlW2ldKSA8IDApIHJldHVybiBrZXkuc3Vic3RyKDAsIGkpICsgbG93ZXJOZWVkbGVbaV0gKyB1cHBlck5lZWRsZS5zdWJzdHIoaSArIDEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGxwID49IDApIHJldHVybiBrZXkuc3Vic3RyKDAsIGxscCkgKyBsb3dlcktleVtsbHBdICsgdXBwZXJOZWVkbGUuc3Vic3RyKGxscCArIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNtcChrZXlbaV0sIGx3cktleUNoYXIpIDwgMCkgbGxwID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZW5ndGggPCBsb3dlck5lZWRsZS5sZW5ndGggJiYgZGlyID09PSBcIm5leHRcIikgcmV0dXJuIGtleSArIHVwcGVyTmVlZGxlLnN1YnN0cihrZXkubGVuZ3RoKTtcbiAgICAgICAgICAgIGlmIChsZW5ndGggPCBrZXkubGVuZ3RoICYmIGRpciA9PT0gXCJwcmV2XCIpIHJldHVybiBrZXkuc3Vic3RyKDAsIHVwcGVyTmVlZGxlLmxlbmd0aCk7XG4gICAgICAgICAgICByZXR1cm4gbGxwIDwgMCA/IG51bGwgOiBrZXkuc3Vic3RyKDAsIGxscCkgKyBsb3dlck5lZWRsZVtsbHBdICsgdXBwZXJOZWVkbGUuc3Vic3RyKGxscCArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gYWRkSWdub3JlQ2FzZUFsZ29yaXRobSh3aGVyZUNsYXVzZSwgbWF0Y2gsIG5lZWRsZXMsIHN1ZmZpeCkge1xuICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPVwibmVlZGxlc1wiIHR5cGU9XCJBcnJheVwiIGVsZW1lbnRUeXBlPVwiU3RyaW5nXCI+PC9wYXJhbT5cbiAgICAgICAgICAgIHZhciB1cHBlcixcbiAgICAgICAgICAgICAgICBsb3dlcixcbiAgICAgICAgICAgICAgICBjb21wYXJlLFxuICAgICAgICAgICAgICAgIHVwcGVyTmVlZGxlcyxcbiAgICAgICAgICAgICAgICBsb3dlck5lZWRsZXMsXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIG5leHRLZXlTdWZmaXgsXG4gICAgICAgICAgICAgICAgbmVlZGxlc0xlbiA9IG5lZWRsZXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKCFuZWVkbGVzLmV2ZXJ5KGZ1bmN0aW9uIChzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBzID09PSAnc3RyaW5nJztcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwod2hlcmVDbGF1c2UsIFNUUklOR19FWFBFQ1RFRCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmdW5jdGlvbiBpbml0RGlyZWN0aW9uKGRpcikge1xuICAgICAgICAgICAgICAgIHVwcGVyID0gdXBwZXJGYWN0b3J5KGRpcik7XG4gICAgICAgICAgICAgICAgbG93ZXIgPSBsb3dlckZhY3RvcnkoZGlyKTtcbiAgICAgICAgICAgICAgICBjb21wYXJlID0gZGlyID09PSBcIm5leHRcIiA/IHNpbXBsZUNvbXBhcmUgOiBzaW1wbGVDb21wYXJlUmV2ZXJzZTtcbiAgICAgICAgICAgICAgICB2YXIgbmVlZGxlQm91bmRzID0gbmVlZGxlcy5tYXAoZnVuY3Rpb24gKG5lZWRsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBsb3dlcjogbG93ZXIobmVlZGxlKSwgdXBwZXI6IHVwcGVyKG5lZWRsZSkgfTtcbiAgICAgICAgICAgICAgICB9KS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKGEubG93ZXIsIGIubG93ZXIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHVwcGVyTmVlZGxlcyA9IG5lZWRsZUJvdW5kcy5tYXAoZnVuY3Rpb24gKG5iKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYi51cHBlcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsb3dlck5lZWRsZXMgPSBuZWVkbGVCb3VuZHMubWFwKGZ1bmN0aW9uIChuYikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmIubG93ZXI7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gZGlyO1xuICAgICAgICAgICAgICAgIG5leHRLZXlTdWZmaXggPSBkaXIgPT09IFwibmV4dFwiID8gXCJcIiA6IHN1ZmZpeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluaXREaXJlY3Rpb24oXCJuZXh0XCIpO1xuXG4gICAgICAgICAgICB2YXIgYyA9IG5ldyB3aGVyZUNsYXVzZS5fY3R4LmNvbGxDbGFzcyh3aGVyZUNsYXVzZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5ib3VuZCh1cHBlck5lZWRsZXNbMF0sIGxvd2VyTmVlZGxlc1tuZWVkbGVzTGVuIC0gMV0gKyBzdWZmaXgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGMuX29uZGlyZWN0aW9uY2hhbmdlID0gZnVuY3Rpb24gKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgZXZlbnQgb25seXMgb2NjdXIgYmVmb3JlIGZpbHRlciBpcyBjYWxsZWQgdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAgICAgICAgaW5pdERpcmVjdGlvbihkaXJlY3Rpb24pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdmFyIGZpcnN0UG9zc2libGVOZWVkbGUgPSAwO1xuXG4gICAgICAgICAgICBjLl9hZGRBbGdvcml0aG0oZnVuY3Rpb24gKGN1cnNvciwgYWR2YW5jZSwgcmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cImN1cnNvclwiIHR5cGU9XCJJREJDdXJzb3JcIj48L3BhcmFtPlxuICAgICAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cImFkdmFuY2VcIiB0eXBlPVwiRnVuY3Rpb25cIj48L3BhcmFtPlxuICAgICAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cInJlc29sdmVcIiB0eXBlPVwiRnVuY3Rpb25cIj48L3BhcmFtPlxuICAgICAgICAgICAgICAgIHZhciBrZXkgPSBjdXJzb3Iua2V5O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBsb3dlcktleSA9IGxvd2VyKGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoKGxvd2VyS2V5LCBsb3dlck5lZWRsZXMsIGZpcnN0UG9zc2libGVOZWVkbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsb3dlc3RQb3NzaWJsZUNhc2luZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBmaXJzdFBvc3NpYmxlTmVlZGxlOyBpIDwgbmVlZGxlc0xlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FzaW5nID0gbmV4dENhc2luZyhrZXksIGxvd2VyS2V5LCB1cHBlck5lZWRsZXNbaV0sIGxvd2VyTmVlZGxlc1tpXSwgY29tcGFyZSwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXNpbmcgPT09IG51bGwgJiYgbG93ZXN0UG9zc2libGVDYXNpbmcgPT09IG51bGwpIGZpcnN0UG9zc2libGVOZWVkbGUgPSBpICsgMTtlbHNlIGlmIChsb3dlc3RQb3NzaWJsZUNhc2luZyA9PT0gbnVsbCB8fCBjb21wYXJlKGxvd2VzdFBvc3NpYmxlQ2FzaW5nLCBjYXNpbmcpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VzdFBvc3NpYmxlQ2FzaW5nID0gY2FzaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb3dlc3RQb3NzaWJsZUNhc2luZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKGxvd2VzdFBvc3NpYmxlQ2FzaW5nICsgbmV4dEtleVN1ZmZpeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgIH1cblxuICAgICAgICAvL1xuICAgICAgICAvLyBXaGVyZUNsYXVzZSBwdWJsaWMgbWV0aG9kc1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYmV0d2VlbjogZnVuY3Rpb24gKGxvd2VyLCB1cHBlciwgaW5jbHVkZUxvd2VyLCBpbmNsdWRlVXBwZXIpIHtcbiAgICAgICAgICAgICAgICAvLy8gPHN1bW1hcnk+XG4gICAgICAgICAgICAgICAgLy8vICAgICBGaWx0ZXIgb3V0IHJlY29yZHMgd2hvc2Ugd2hlcmUtZmllbGQgbGF5cyBiZXR3ZWVuIGdpdmVuIGxvd2VyIGFuZCB1cHBlciB2YWx1ZXMuIEFwcGxpZXMgdG8gU3RyaW5ncywgTnVtYmVycyBhbmQgRGF0ZXMuXG4gICAgICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJsb3dlclwiPjwvcGFyYW0+XG4gICAgICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPVwidXBwZXJcIj48L3BhcmFtPlxuICAgICAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cImluY2x1ZGVMb3dlclwiIG9wdGlvbmFsPVwidHJ1ZVwiPldoZXRoZXIgaXRlbXMgdGhhdCBlcXVhbHMgbG93ZXIgc2hvdWxkIGJlIGluY2x1ZGVkLiBEZWZhdWx0IHRydWUuPC9wYXJhbT5cbiAgICAgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJpbmNsdWRlVXBwZXJcIiBvcHRpb25hbD1cInRydWVcIj5XaGV0aGVyIGl0ZW1zIHRoYXQgZXF1YWxzIHVwcGVyIHNob3VsZCBiZSBpbmNsdWRlZC4gRGVmYXVsdCBmYWxzZS48L3BhcmFtPlxuICAgICAgICAgICAgICAgIC8vLyA8cmV0dXJucyB0eXBlPVwiQ29sbGVjdGlvblwiPjwvcmV0dXJucz5cbiAgICAgICAgICAgICAgICBpbmNsdWRlTG93ZXIgPSBpbmNsdWRlTG93ZXIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRvIHRydWVcbiAgICAgICAgICAgICAgICBpbmNsdWRlVXBwZXIgPSBpbmNsdWRlVXBwZXIgPT09IHRydWU7IC8vIERlZmF1bHQgdG8gZmFsc2VcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY21wKGxvd2VyLCB1cHBlcikgPiAwIHx8IGNtcChsb3dlciwgdXBwZXIpID09PSAwICYmIChpbmNsdWRlTG93ZXIgfHwgaW5jbHVkZVVwcGVyKSAmJiAhKGluY2x1ZGVMb3dlciAmJiBpbmNsdWRlVXBwZXIpKSByZXR1cm4gZW1wdHlDb2xsZWN0aW9uKHRoaXMpOyAvLyBXb3JrYXJvdW5kIGZvciBpZGlvdGljIFczQyBTcGVjaWZpY2F0aW9uIHRoYXQgRGF0YUVycm9yIG11c3QgYmUgdGhyb3duIGlmIGxvd2VyID4gdXBwZXIuIFRoZSBuYXR1cmFsIHJlc3VsdCB3b3VsZCBiZSB0byByZXR1cm4gYW4gZW1wdHkgY29sbGVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLl9jdHguY29sbENsYXNzKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5ib3VuZChsb3dlciwgdXBwZXIsICFpbmNsdWRlTG93ZXIsICFpbmNsdWRlVXBwZXIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKHRoaXMsIElOVkFMSURfS0VZX0FSR1VNRU5UKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXF1YWxzOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHRoaXMuX2N0eC5jb2xsQ2xhc3ModGhpcywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2Uub25seSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWJvdmU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5fY3R4LmNvbGxDbGFzcyh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhYm92ZU9yRXF1YWw6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5fY3R4LmNvbGxDbGFzcyh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJREJLZXlSYW5nZS5sb3dlckJvdW5kKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBiZWxvdzogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLl9jdHguY29sbENsYXNzKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLnVwcGVyQm91bmQodmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJlbG93T3JFcXVhbDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzLl9jdHguY29sbENsYXNzKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLnVwcGVyQm91bmQodmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXJ0c1dpdGg6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIiB0eXBlPVwiU3RyaW5nXCI+PC9wYXJhbT5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHJldHVybiBmYWlsKHRoaXMsIFNUUklOR19FWFBFQ1RFRCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmV0d2VlbihzdHIsIHN0ciArIG1heFN0cmluZywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhcnRzV2l0aElnbm9yZUNhc2U6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJzdHJcIiB0eXBlPVwiU3RyaW5nXCI+PC9wYXJhbT5cbiAgICAgICAgICAgICAgICBpZiAoc3RyID09PSBcIlwiKSByZXR1cm4gdGhpcy5zdGFydHNXaXRoKHN0cik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZElnbm9yZUNhc2VBbGdvcml0aG0odGhpcywgZnVuY3Rpb24gKHgsIGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHguaW5kZXhPZihhWzBdKSA9PT0gMDtcbiAgICAgICAgICAgICAgICB9LCBbc3RyXSwgbWF4U3RyaW5nKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcXVhbHNJZ25vcmVDYXNlOiBmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPVwic3RyXCIgdHlwZT1cIlN0cmluZ1wiPjwvcGFyYW0+XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZElnbm9yZUNhc2VBbGdvcml0aG0odGhpcywgZnVuY3Rpb24gKHgsIGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggPT09IGFbMF07XG4gICAgICAgICAgICAgICAgfSwgW3N0cl0sIFwiXCIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFueU9mSWdub3JlQ2FzZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBzZXQgPSBnZXRBcnJheU9mLmFwcGx5KE5PX0NIQVJfQVJSQVksIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgaWYgKHNldC5sZW5ndGggPT09IDApIHJldHVybiBlbXB0eUNvbGxlY3Rpb24odGhpcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFkZElnbm9yZUNhc2VBbGdvcml0aG0odGhpcywgZnVuY3Rpb24gKHgsIGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXhPZih4KSAhPT0gLTE7XG4gICAgICAgICAgICAgICAgfSwgc2V0LCBcIlwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGFydHNXaXRoQW55T2ZJZ25vcmVDYXNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNldCA9IGdldEFycmF5T2YuYXBwbHkoTk9fQ0hBUl9BUlJBWSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpZiAoc2V0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVtcHR5Q29sbGVjdGlvbih0aGlzKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWRkSWdub3JlQ2FzZUFsZ29yaXRobSh0aGlzLCBmdW5jdGlvbiAoeCwgYSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5zb21lKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geC5pbmRleE9mKG4pID09PSAwO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCBzZXQsIG1heFN0cmluZyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYW55T2Y6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2V0ID0gZ2V0QXJyYXlPZi5hcHBseShOT19DSEFSX0FSUkFZLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgICAgIHZhciBjb21wYXJlID0gYXNjZW5kaW5nO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHNldC5zb3J0KGNvbXBhcmUpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwodGhpcywgSU5WQUxJRF9LRVlfQVJHVU1FTlQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVtcHR5Q29sbGVjdGlvbih0aGlzKTtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyB0aGlzLl9jdHguY29sbENsYXNzKHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElEQktleVJhbmdlLmJvdW5kKHNldFswXSwgc2V0W3NldC5sZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjLl9vbmRpcmVjdGlvbmNoYW5nZSA9IGZ1bmN0aW9uIChkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29tcGFyZSA9IGRpcmVjdGlvbiA9PT0gXCJuZXh0XCIgPyBhc2NlbmRpbmcgOiBkZXNjZW5kaW5nO1xuICAgICAgICAgICAgICAgICAgICBzZXQuc29ydChjb21wYXJlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgICAgICBjLl9hZGRBbGdvcml0aG0oZnVuY3Rpb24gKGN1cnNvciwgYWR2YW5jZSwgcmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gY3Vyc29yLmtleTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbXBhcmUoa2V5LCBzZXRbaV0pID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnNvciBoYXMgcGFzc2VkIGJleW9uZCB0aGlzIGtleS4gQ2hlY2sgbmV4dC5cbiAgICAgICAgICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmV4dC4gU3RvcCBzZWFyY2hpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZShyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmUoa2V5LCBzZXRbaV0pID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudCBjdXJzb3IgdmFsdWUgc2hvdWxkIGJlIGluY2x1ZGVkIGFuZCB3ZSBzaG91bGQgY29udGludWUgYSBzaW5nbGUgc3RlcCBpbiBjYXNlIG5leHQgaXRlbSBoYXMgdGhlIHNhbWUga2V5IG9yIHBvc3NpYmx5IG91ciBuZXh0IGtleSBpbiBzZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnNvci5rZXkgbm90IHlldCBhdCBzZXRbaV0uIEZvcndhcmQgY3Vyc29yIHRvIHRoZSBuZXh0IGtleSB0byBodW50IGZvci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jb250aW51ZShzZXRbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG5vdEVxdWFsOiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbkFueVJhbmdlKFtbLUluZmluaXR5LCB2YWx1ZV0sIFt2YWx1ZSwgbWF4S2V5XV0sIHsgaW5jbHVkZUxvd2VyczogZmFsc2UsIGluY2x1ZGVVcHBlcnM6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbm9uZU9mOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNldCA9IGdldEFycmF5T2YuYXBwbHkoTk9fQ0hBUl9BUlJBWSwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpZiAoc2V0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyB0aGlzLl9jdHguY29sbENsYXNzKHRoaXMpOyAvLyBSZXR1cm4gZW50aXJlIGNvbGxlY3Rpb24uXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0LnNvcnQoYXNjZW5kaW5nKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWlsKHRoaXMsIElOVkFMSURfS0VZX0FSR1VNRU5UKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIFtcImFcIixcImJcIixcImNcIl0gdG8gYSBzZXQgb2YgcmFuZ2VzIGZvciBiZXR3ZWVuL2Fib3ZlL2JlbG93OiBbWy1JbmZpbml0eSxcImFcIl0sIFtcImFcIixcImJcIl0sIFtcImJcIixcImNcIl0sIFtcImNcIixtYXhLZXldXVxuICAgICAgICAgICAgICAgIHZhciByYW5nZXMgPSBzZXQucmVkdWNlKGZ1bmN0aW9uIChyZXMsIHZhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzID8gcmVzLmNvbmNhdChbW3Jlc1tyZXMubGVuZ3RoIC0gMV1bMV0sIHZhbF1dKSA6IFtbLUluZmluaXR5LCB2YWxdXTtcbiAgICAgICAgICAgICAgICB9LCBudWxsKTtcbiAgICAgICAgICAgICAgICByYW5nZXMucHVzaChbc2V0W3NldC5sZW5ndGggLSAxXSwgbWF4S2V5XSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5BbnlSYW5nZShyYW5nZXMsIHsgaW5jbHVkZUxvd2VyczogZmFsc2UsIGluY2x1ZGVVcHBlcnM6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLyoqIEZpbHRlciBvdXQgdmFsdWVzIHdpdGhpbmcgZ2l2ZW4gc2V0IG9mIHJhbmdlcy5cclxuICAgICAgICAgICAgKiBFeGFtcGxlLCBnaXZlIGNoaWxkcmVuIGFuZCBlbGRlcnMgYSByZWJhdGUgb2YgNTAlOlxyXG4gICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICogICBkYi5mcmllbmRzLndoZXJlKCdhZ2UnKS5pbkFueVJhbmdlKFtbMCwxOF0sWzY1LEluZmluaXR5XV0pLm1vZGlmeSh7UmViYXRlOiAxLzJ9KTtcclxuICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXJ8RGF0ZXxBcnJheSlbXVtdfSByYW5nZXNcclxuICAgICAgICAgICAgKiBAcGFyYW0ge3tpbmNsdWRlTG93ZXJzOiBib29sZWFuLCBpbmNsdWRlVXBwZXJzOiBib29sZWFufX0gb3B0aW9uc1xyXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgaW5BbnlSYW5nZTogZnVuY3Rpb24gKHJhbmdlcywgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gICAgICAgICAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGggPT09IDApIHJldHVybiBlbXB0eUNvbGxlY3Rpb24odGhpcyk7XG4gICAgICAgICAgICAgICAgaWYgKCFyYW5nZXMuZXZlcnkoZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByYW5nZVswXSAhPT0gdW5kZWZpbmVkICYmIHJhbmdlWzFdICE9PSB1bmRlZmluZWQgJiYgYXNjZW5kaW5nKHJhbmdlWzBdLCByYW5nZVsxXSkgPD0gMDtcbiAgICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbCh0aGlzLCBcIkZpcnN0IGFyZ3VtZW50IHRvIGluQW55UmFuZ2UoKSBtdXN0IGJlIGFuIEFycmF5IG9mIHR3by12YWx1ZSBBcnJheXMgW2xvd2VyLHVwcGVyXSB3aGVyZSB1cHBlciBtdXN0IG5vdCBiZSBsb3dlciB0aGFuIGxvd2VyXCIsIGV4Y2VwdGlvbnMuSW52YWxpZEFyZ3VtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGluY2x1ZGVMb3dlcnMgPSAhb3B0aW9ucyB8fCBvcHRpb25zLmluY2x1ZGVMb3dlcnMgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRvIHRydWVcbiAgICAgICAgICAgICAgICB2YXIgaW5jbHVkZVVwcGVycyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5pbmNsdWRlVXBwZXJzID09PSB0cnVlOyAvLyBEZWZhdWx0IHRvIGZhbHNlXG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhZGRSYW5nZShyYW5nZXMsIG5ld1JhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gcmFuZ2VzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtcChuZXdSYW5nZVswXSwgcmFuZ2VbMV0pIDwgMCAmJiBjbXAobmV3UmFuZ2VbMV0sIHJhbmdlWzBdKSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZVswXSA9IG1pbihyYW5nZVswXSwgbmV3UmFuZ2VbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlWzFdID0gbWF4KHJhbmdlWzFdLCBuZXdSYW5nZVsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IGwpIHJhbmdlcy5wdXNoKG5ld1JhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlcztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgc29ydERpcmVjdGlvbiA9IGFzY2VuZGluZztcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiByYW5nZVNvcnRlcihhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3J0RGlyZWN0aW9uKGFbMF0sIGJbMF0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEpvaW4gb3ZlcmxhcHBpbmcgcmFuZ2VzXG4gICAgICAgICAgICAgICAgdmFyIHNldDtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzZXQgPSByYW5nZXMucmVkdWNlKGFkZFJhbmdlLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIHNldC5zb3J0KHJhbmdlU29ydGVyKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbCh0aGlzLCBJTlZBTElEX0tFWV9BUkdVTUVOVCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgICAgIHZhciBrZXlJc0JleW9uZEN1cnJlbnRFbnRyeSA9IGluY2x1ZGVVcHBlcnMgPyBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhc2NlbmRpbmcoa2V5LCBzZXRbaV1bMV0pID4gMDtcbiAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNjZW5kaW5nKGtleSwgc2V0W2ldWzFdKSA+PSAwO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB2YXIga2V5SXNCZWZvcmVDdXJyZW50RW50cnkgPSBpbmNsdWRlTG93ZXJzID8gZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZGluZyhrZXksIHNldFtpXVswXSkgPiAwO1xuICAgICAgICAgICAgICAgIH0gOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjZW5kaW5nKGtleSwgc2V0W2ldWzBdKSA+PSAwO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBrZXlXaXRoaW5DdXJyZW50UmFuZ2Uoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAha2V5SXNCZXlvbmRDdXJyZW50RW50cnkoa2V5KSAmJiAha2V5SXNCZWZvcmVDdXJyZW50RW50cnkoa2V5KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgY2hlY2tLZXkgPSBrZXlJc0JleW9uZEN1cnJlbnRFbnRyeTtcblxuICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IGN0eC5jb2xsQ2xhc3ModGhpcywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoc2V0WzBdWzBdLCBzZXRbc2V0Lmxlbmd0aCAtIDFdWzFdLCAhaW5jbHVkZUxvd2VycywgIWluY2x1ZGVVcHBlcnMpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgYy5fb25kaXJlY3Rpb25jaGFuZ2UgPSBmdW5jdGlvbiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0tleSA9IGtleUlzQmV5b25kQ3VycmVudEVudHJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgc29ydERpcmVjdGlvbiA9IGFzY2VuZGluZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrS2V5ID0ga2V5SXNCZWZvcmVDdXJyZW50RW50cnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0RGlyZWN0aW9uID0gZGVzY2VuZGluZztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXQuc29ydChyYW5nZVNvcnRlcik7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGMuX2FkZEFsZ29yaXRobShmdW5jdGlvbiAoY3Vyc29yLCBhZHZhbmNlLCByZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBjdXJzb3Iua2V5O1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2hlY2tLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnNvciBoYXMgcGFzc2VkIGJleW9uZCB0aGlzIGtleS4gQ2hlY2sgbmV4dC5cbiAgICAgICAgICAgICAgICAgICAgICAgICsraTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzZXQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmV4dC4gU3RvcCBzZWFyY2hpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZShyZXNvbHZlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleVdpdGhpbkN1cnJlbnRSYW5nZShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudCBjdXJzb3IgdmFsdWUgc2hvdWxkIGJlIGluY2x1ZGVkIGFuZCB3ZSBzaG91bGQgY29udGludWUgYSBzaW5nbGUgc3RlcCBpbiBjYXNlIG5leHQgaXRlbSBoYXMgdGhlIHNhbWUga2V5IG9yIHBvc3NpYmx5IG91ciBuZXh0IGtleSBpbiBzZXQuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbXAoa2V5LCBzZXRbaV1bMV0pID09PSAwIHx8IGNtcChrZXksIHNldFtpXVswXSkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2x1ZGVVcHBlciBvciBpbmNsdWRlTG93ZXIgaXMgZmFsc2Ugc28ga2V5V2l0aGluQ3VycmVudFJhbmdlKCkgcmV0dXJucyBmYWxzZSBldmVuIHRob3VnaCB3ZSBhcmUgYXQgcmFuZ2UgYm9yZGVyLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgdG8gbmV4dCBrZXkgYnV0IGRvbid0IGluY2x1ZGUgdGhpcyBvbmUuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJzb3Iua2V5IG5vdCB5ZXQgYXQgc2V0W2ldLiBGb3J3YXJkIGN1cnNvciB0byB0aGUgbmV4dCBrZXkgdG8gaHVudCBmb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29ydERpcmVjdGlvbiA9PT0gYXNjZW5kaW5nKSBjdXJzb3IuY29udGludWUoc2V0W2ldWzBdKTtlbHNlIGN1cnNvci5jb250aW51ZShzZXRbaV1bMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGFydHNXaXRoQW55T2Y6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2V0ID0gZ2V0QXJyYXlPZi5hcHBseShOT19DSEFSX0FSUkFZLCBhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFzZXQuZXZlcnkoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBzID09PSAnc3RyaW5nJztcbiAgICAgICAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFpbCh0aGlzLCBcInN0YXJ0c1dpdGhBbnlPZigpIG9ubHkgd29ya3Mgd2l0aCBzdHJpbmdzXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGVtcHR5Q29sbGVjdGlvbih0aGlzKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluQW55UmFuZ2Uoc2V0Lm1hcChmdW5jdGlvbiAoc3RyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbc3RyLCBzdHIgKyBtYXhTdHJpbmddO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vIENvbGxlY3Rpb24gQ2xhc3NcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmdW5jdGlvbiBDb2xsZWN0aW9uKHdoZXJlQ2xhdXNlLCBrZXlSYW5nZUdlbmVyYXRvcikge1xuICAgICAgICAvLy8gPHN1bW1hcnk+XG4gICAgICAgIC8vL1xuICAgICAgICAvLy8gPC9zdW1tYXJ5PlxuICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJ3aGVyZUNsYXVzZVwiIHR5cGU9XCJXaGVyZUNsYXVzZVwiPldoZXJlIGNsYXVzZSBpbnN0YW5jZTwvcGFyYW0+XG4gICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cImtleVJhbmdlR2VuZXJhdG9yXCIgdmFsdWU9XCJmdW5jdGlvbigpeyByZXR1cm4gSURCS2V5UmFuZ2UuYm91bmQoMCwxKTt9XCIgb3B0aW9uYWw9XCJ0cnVlXCI+PC9wYXJhbT5cbiAgICAgICAgdmFyIGtleVJhbmdlID0gbnVsbCxcbiAgICAgICAgICAgIGVycm9yID0gbnVsbDtcbiAgICAgICAgaWYgKGtleVJhbmdlR2VuZXJhdG9yKSB0cnkge1xuICAgICAgICAgICAga2V5UmFuZ2UgPSBrZXlSYW5nZUdlbmVyYXRvcigpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB3aGVyZUN0eCA9IHdoZXJlQ2xhdXNlLl9jdHgsXG4gICAgICAgICAgICB0YWJsZSA9IHdoZXJlQ3R4LnRhYmxlO1xuICAgICAgICB0aGlzLl9jdHggPSB7XG4gICAgICAgICAgICB0YWJsZTogdGFibGUsXG4gICAgICAgICAgICBpbmRleDogd2hlcmVDdHguaW5kZXgsXG4gICAgICAgICAgICBpc1ByaW1LZXk6ICF3aGVyZUN0eC5pbmRleCB8fCB0YWJsZS5zY2hlbWEucHJpbUtleS5rZXlQYXRoICYmIHdoZXJlQ3R4LmluZGV4ID09PSB0YWJsZS5zY2hlbWEucHJpbUtleS5uYW1lLFxuICAgICAgICAgICAgcmFuZ2U6IGtleVJhbmdlLFxuICAgICAgICAgICAga2V5c09ubHk6IGZhbHNlLFxuICAgICAgICAgICAgZGlyOiBcIm5leHRcIixcbiAgICAgICAgICAgIHVuaXF1ZTogXCJcIixcbiAgICAgICAgICAgIGFsZ29yaXRobTogbnVsbCxcbiAgICAgICAgICAgIGZpbHRlcjogbnVsbCxcbiAgICAgICAgICAgIHJlcGxheUZpbHRlcjogbnVsbCxcbiAgICAgICAgICAgIGp1c3RMaW1pdDogdHJ1ZSwgLy8gVHJ1ZSBpZiBhIHJlcGxheUZpbHRlciBpcyBqdXN0IGEgZmlsdGVyIHRoYXQgcGVyZm9ybXMgYSBcImxpbWl0XCIgb3BlcmF0aW9uIChvciBub25lIGF0IGFsbClcbiAgICAgICAgICAgIGlzTWF0Y2g6IG51bGwsXG4gICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICBsaW1pdDogSW5maW5pdHksXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IsIC8vIElmIHNldCwgYW55IHByb21pc2UgbXVzdCBiZSByZWplY3RlZCB3aXRoIHRoaXMgZXJyb3JcbiAgICAgICAgICAgIG9yOiB3aGVyZUN0eC5vcixcbiAgICAgICAgICAgIHZhbHVlTWFwcGVyOiB0YWJsZS5ob29rLnJlYWRpbmcuZmlyZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzUGxhaW5LZXlSYW5nZShjdHgsIGlnbm9yZUxpbWl0RmlsdGVyKSB7XG4gICAgICAgIHJldHVybiAhKGN0eC5maWx0ZXIgfHwgY3R4LmFsZ29yaXRobSB8fCBjdHgub3IpICYmIChpZ25vcmVMaW1pdEZpbHRlciA/IGN0eC5qdXN0TGltaXQgOiAhY3R4LnJlcGxheUZpbHRlcik7XG4gICAgfVxuXG4gICAgcHJvcHMoQ29sbGVjdGlvbi5wcm90b3R5cGUsIGZ1bmN0aW9uICgpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBDb2xsZWN0aW9uIFByaXZhdGUgRnVuY3Rpb25zXG4gICAgICAgIC8vXG5cbiAgICAgICAgZnVuY3Rpb24gYWRkRmlsdGVyKGN0eCwgZm4pIHtcbiAgICAgICAgICAgIGN0eC5maWx0ZXIgPSBjb21iaW5lKGN0eC5maWx0ZXIsIGZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGFkZFJlcGxheUZpbHRlcihjdHgsIGZhY3RvcnksIGlzTGltaXRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHZhciBjdXJyID0gY3R4LnJlcGxheUZpbHRlcjtcbiAgICAgICAgICAgIGN0eC5yZXBsYXlGaWx0ZXIgPSBjdXJyID8gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21iaW5lKGN1cnIoKSwgZmFjdG9yeSgpKTtcbiAgICAgICAgICAgIH0gOiBmYWN0b3J5O1xuICAgICAgICAgICAgY3R4Lmp1c3RMaW1pdCA9IGlzTGltaXRGaWx0ZXIgJiYgIWN1cnI7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhZGRNYXRjaEZpbHRlcihjdHgsIGZuKSB7XG4gICAgICAgICAgICBjdHguaXNNYXRjaCA9IGNvbWJpbmUoY3R4LmlzTWF0Y2gsIGZuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiBAcGFyYW0gY3R4IHtcclxuICAgICAgICAgKiAgICAgIGlzUHJpbUtleTogYm9vbGVhbixcclxuICAgICAgICAgKiAgICAgIHRhYmxlOiBUYWJsZSxcclxuICAgICAgICAgKiAgICAgIGluZGV4OiBzdHJpbmdcclxuICAgICAgICAgKiB9XHJcbiAgICAgICAgICogQHBhcmFtIHN0b3JlIElEQk9iamVjdFN0b3JlXHJcbiAgICAgICAgICoqL1xuICAgICAgICBmdW5jdGlvbiBnZXRJbmRleE9yU3RvcmUoY3R4LCBzdG9yZSkge1xuICAgICAgICAgICAgaWYgKGN0eC5pc1ByaW1LZXkpIHJldHVybiBzdG9yZTtcbiAgICAgICAgICAgIHZhciBpbmRleFNwZWMgPSBjdHgudGFibGUuc2NoZW1hLmlkeEJ5TmFtZVtjdHguaW5kZXhdO1xuICAgICAgICAgICAgaWYgKCFpbmRleFNwZWMpIHRocm93IG5ldyBleGNlcHRpb25zLlNjaGVtYShcIktleVBhdGggXCIgKyBjdHguaW5kZXggKyBcIiBvbiBvYmplY3Qgc3RvcmUgXCIgKyBzdG9yZS5uYW1lICsgXCIgaXMgbm90IGluZGV4ZWRcIik7XG4gICAgICAgICAgICByZXR1cm4gc3RvcmUuaW5kZXgoaW5kZXhTcGVjLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIEBwYXJhbSBjdHgge1xyXG4gICAgICAgICAqICAgICAgaXNQcmltS2V5OiBib29sZWFuLFxyXG4gICAgICAgICAqICAgICAgdGFibGU6IFRhYmxlLFxyXG4gICAgICAgICAqICAgICAgaW5kZXg6IHN0cmluZyxcclxuICAgICAgICAgKiAgICAgIGtleXNPbmx5OiBib29sZWFuLFxyXG4gICAgICAgICAqICAgICAgcmFuZ2U/OiBJREJLZXlSYW5nZSxcclxuICAgICAgICAgKiAgICAgIGRpcjogXCJuZXh0XCIgfCBcInByZXZcIlxyXG4gICAgICAgICAqIH1cclxuICAgICAgICAgKi9cbiAgICAgICAgZnVuY3Rpb24gb3BlbkN1cnNvcihjdHgsIHN0b3JlKSB7XG4gICAgICAgICAgICB2YXIgaWR4T3JTdG9yZSA9IGdldEluZGV4T3JTdG9yZShjdHgsIHN0b3JlKTtcbiAgICAgICAgICAgIHJldHVybiBjdHgua2V5c09ubHkgJiYgJ29wZW5LZXlDdXJzb3InIGluIGlkeE9yU3RvcmUgPyBpZHhPclN0b3JlLm9wZW5LZXlDdXJzb3IoY3R4LnJhbmdlIHx8IG51bGwsIGN0eC5kaXIgKyBjdHgudW5pcXVlKSA6IGlkeE9yU3RvcmUub3BlbkN1cnNvcihjdHgucmFuZ2UgfHwgbnVsbCwgY3R4LmRpciArIGN0eC51bmlxdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaXRlcihjdHgsIGZuLCByZXNvbHZlLCByZWplY3QsIGlkYnN0b3JlKSB7XG4gICAgICAgICAgICB2YXIgZmlsdGVyID0gY3R4LnJlcGxheUZpbHRlciA/IGNvbWJpbmUoY3R4LmZpbHRlciwgY3R4LnJlcGxheUZpbHRlcigpKSA6IGN0eC5maWx0ZXI7XG4gICAgICAgICAgICBpZiAoIWN0eC5vcikge1xuICAgICAgICAgICAgICAgIGl0ZXJhdGUob3BlbkN1cnNvcihjdHgsIGlkYnN0b3JlKSwgY29tYmluZShjdHguYWxnb3JpdGhtLCBmaWx0ZXIpLCBmbiwgcmVzb2x2ZSwgcmVqZWN0LCAhY3R4LmtleXNPbmx5ICYmIGN0eC52YWx1ZU1hcHBlcik7XG4gICAgICAgICAgICB9IGVsc2UgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2V0ID0ge307XG4gICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkID0gMDtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlc29sdmVib3RoKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKytyZXNvbHZlZCA9PT0gMikgcmVzb2x2ZSgpOyAvLyBTZWVtcyBsaWtlIHdlIGp1c3Qgc3VwcG9ydCBvciBidHduIG1heCAyIGV4cHJlc3Npb25zLCBidXQgdGhlcmUgYXJlIG5vIGxpbWl0IGJlY2F1c2Ugd2UgZG8gcmVjdXJzaW9uLlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHVuaW9uKGl0ZW0sIGN1cnNvciwgYWR2YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbHRlciB8fCBmaWx0ZXIoY3Vyc29yLCBhZHZhbmNlLCByZXNvbHZlYm90aCwgcmVqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGN1cnNvci5wcmltYXJ5S2V5LnRvU3RyaW5nKCk7IC8vIENvbnZlcnRzIGFueSBEYXRlIHRvIFN0cmluZywgU3RyaW5nIHRvIFN0cmluZywgTnVtYmVyIHRvIFN0cmluZyBhbmQgQXJyYXkgdG8gY29tbWEtc2VwYXJhdGVkIHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNPd24oc2V0LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0W2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuKGl0ZW0sIGN1cnNvciwgYWR2YW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjdHgub3IuX2l0ZXJhdGUodW5pb24sIHJlc29sdmVib3RoLCByZWplY3QsIGlkYnN0b3JlKTtcbiAgICAgICAgICAgICAgICBpdGVyYXRlKG9wZW5DdXJzb3IoY3R4LCBpZGJzdG9yZSksIGN0eC5hbGdvcml0aG0sIHVuaW9uLCByZXNvbHZlYm90aCwgcmVqZWN0LCAhY3R4LmtleXNPbmx5ICYmIGN0eC52YWx1ZU1hcHBlcik7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIGdldEluc3RhbmNlVGVtcGxhdGUoY3R4KSB7XG4gICAgICAgICAgICByZXR1cm4gY3R4LnRhYmxlLnNjaGVtYS5pbnN0YW5jZVRlbXBsYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIENvbGxlY3Rpb24gUHJvdGVjdGVkIEZ1bmN0aW9uc1xuICAgICAgICAgICAgLy9cblxuICAgICAgICAgICAgX3JlYWQ6IGZ1bmN0aW9uIChmbiwgY2IpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICAgICAgICAgICAgICAgIGlmIChjdHguZXJyb3IpIHJldHVybiBjdHgudGFibGUuX3RyYW5zKG51bGwsIGZ1bmN0aW9uIHJlamVjdG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoY3R4LmVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtlbHNlIHJldHVybiBjdHgudGFibGUuX2lkYnN0b3JlKFJFQURPTkxZLCBmbikudGhlbihjYik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgX3dyaXRlOiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICAgICAgICAgICAgICAgIGlmIChjdHguZXJyb3IpIHJldHVybiBjdHgudGFibGUuX3RyYW5zKG51bGwsIGZ1bmN0aW9uIHJlamVjdG9yKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoY3R4LmVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtlbHNlIHJldHVybiBjdHgudGFibGUuX2lkYnN0b3JlKFJFQURXUklURSwgZm4sIFwibG9ja2VkXCIpOyAvLyBXaGVuIGRvaW5nIHdyaXRlIG9wZXJhdGlvbnMgb24gY29sbGVjdGlvbnMsIGFsd2F5cyBsb2NrIHRoZSBvcGVyYXRpb24gc28gdGhhdCB1cGNvbWluZyBvcGVyYXRpb25zIGdldHMgcXVldWVkLlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9hZGRBbGdvcml0aG06IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gICAgICAgICAgICAgICAgY3R4LmFsZ29yaXRobSA9IGNvbWJpbmUoY3R4LmFsZ29yaXRobSwgZm4pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgX2l0ZXJhdGU6IGZ1bmN0aW9uIChmbiwgcmVzb2x2ZSwgcmVqZWN0LCBpZGJzdG9yZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKHRoaXMuX2N0eCwgZm4sIHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY2xvbmU6IGZ1bmN0aW9uIChwcm9wcyQkMSkge1xuICAgICAgICAgICAgICAgIHZhciBydiA9IE9iamVjdC5jcmVhdGUodGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpLFxuICAgICAgICAgICAgICAgICAgICBjdHggPSBPYmplY3QuY3JlYXRlKHRoaXMuX2N0eCk7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BzJCQxKSBleHRlbmQoY3R4LCBwcm9wcyQkMSk7XG4gICAgICAgICAgICAgICAgcnYuX2N0eCA9IGN0eDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnY7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByYXc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdHgudmFsdWVNYXBwZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIENvbGxlY3Rpb24gUHVibGljIG1ldGhvZHNcbiAgICAgICAgICAgIC8vXG5cbiAgICAgICAgICAgIGVhY2g6IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG5cbiAgICAgICAgICAgICAgICBpZiAoZmFrZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IGdldEluc3RhbmNlVGVtcGxhdGUoY3R4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByaW1LZXlQYXRoID0gY3R4LnRhYmxlLnNjaGVtYS5wcmltS2V5LmtleVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBnZXRCeUtleVBhdGgoaXRlbSwgY3R4LmluZGV4ID8gY3R4LnRhYmxlLnNjaGVtYS5pZHhCeU5hbWVbY3R4LmluZGV4XS5rZXlQYXRoIDogcHJpbUtleVBhdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUtleSA9IGdldEJ5S2V5UGF0aChpdGVtLCBwcmltS2V5UGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGZuKGl0ZW0sIHsga2V5OiBrZXksIHByaW1hcnlLZXk6IHByaW1hcnlLZXkgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWQoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlcihjdHgsIGZuLCByZXNvbHZlLCByZWplY3QsIGlkYnN0b3JlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNvdW50OiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmFrZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgwKS50aGVuKGNiKTtcbiAgICAgICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzUGxhaW5LZXlSYW5nZShjdHgsIHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBwbGFpbiBrZXkgcmFuZ2UuIFdlIGNhbiB1c2UgdGhlIGNvdW50KCkgbWV0aG9kIGlmIHRoZSBpbmRleC5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWQoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSBnZXRJbmRleE9yU3RvcmUoY3R4LCBpZGJzdG9yZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0gY3R4LnJhbmdlID8gaWR4LmNvdW50KGN0eC5yYW5nZSkgOiBpZHguY291bnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZXZlbnRSZWplY3RIYW5kbGVyKHJlamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKE1hdGgubWluKGUudGFyZ2V0LnJlc3VsdCwgY3R4LmxpbWl0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LCBjYik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQWxnb3JpdGhtcywgZmlsdGVycyBvciBleHByZXNzaW9ucyBhcmUgYXBwbGllZC4gTmVlZCB0byBjb3VudCBtYW51YWxseS5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWQoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIoY3R4LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjb3VudDtyZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb3VudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCByZWplY3QsIGlkYnN0b3JlKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgY2IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHNvcnRCeTogZnVuY3Rpb24gKGtleVBhdGgsIGNiKSB7XG4gICAgICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPVwia2V5UGF0aFwiIHR5cGU9XCJTdHJpbmdcIj48L3BhcmFtPlxuICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IGtleVBhdGguc3BsaXQoJy4nKS5yZXZlcnNlKCksXG4gICAgICAgICAgICAgICAgICAgIGxhc3RQYXJ0ID0gcGFydHNbMF0sXG4gICAgICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IHBhcnRzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0dmFsKG9iaiwgaSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSkgcmV0dXJuIGdldHZhbChvYmpbcGFydHNbaV1dLCBpIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpbbGFzdFBhcnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgb3JkZXIgPSB0aGlzLl9jdHguZGlyID09PSBcIm5leHRcIiA/IDEgOiAtMTtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNvcnRlcihhLCBiKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhVmFsID0gZ2V0dmFsKGEsIGxhc3RJbmRleCksXG4gICAgICAgICAgICAgICAgICAgICAgICBiVmFsID0gZ2V0dmFsKGIsIGxhc3RJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhVmFsIDwgYlZhbCA/IC1vcmRlciA6IGFWYWwgPiBiVmFsID8gb3JkZXIgOiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5KGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhLnNvcnQoc29ydGVyKTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKGNiKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHRvQXJyYXk6IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWQoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgZmFrZSAmJiByZXNvbHZlKFtnZXRJbnN0YW5jZVRlbXBsYXRlKGN0eCldKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0dldEFsbCAmJiBjdHguZGlyID09PSAnbmV4dCcgJiYgaXNQbGFpbktleVJhbmdlKGN0eCwgdHJ1ZSkgJiYgY3R4LmxpbWl0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBvcHRpbWF0aW9uIGlmIHdlIGNvdWxkIHVzZSBJREJPYmplY3RTdG9yZS5nZXRBbGwoKSBvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSURCS2V5UmFuZ2UuZ2V0QWxsKCk6XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVhZGluZ0hvb2sgPSBjdHgudGFibGUuaG9vay5yZWFkaW5nLmZpcmU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWR4T3JTdG9yZSA9IGdldEluZGV4T3JTdG9yZShjdHgsIGlkYnN0b3JlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBjdHgubGltaXQgPCBJbmZpbml0eSA/IGlkeE9yU3RvcmUuZ2V0QWxsKGN0eC5yYW5nZSwgY3R4LmxpbWl0KSA6IGlkeE9yU3RvcmUuZ2V0QWxsKGN0eC5yYW5nZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGV2ZW50UmVqZWN0SGFuZGxlcihyZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IHJlYWRpbmdIb29rID09PSBtaXJyb3IgPyBldmVudFN1Y2Nlc3NIYW5kbGVyKHJlc29sdmUpIDogd3JhcChldmVudFN1Y2Nlc3NIYW5kbGVyKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcy5tYXAocmVhZGluZ0hvb2spKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXR0aW5nIGFycmF5IHRocm91Z2ggYSBjdXJzb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcihjdHgsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gYXJyYXlDb21wbGV0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgcmVqZWN0LCBpZGJzdG9yZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBjYik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvZmZzZXQ6IGZ1bmN0aW9uIChvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPD0gMCkgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgY3R4Lm9mZnNldCArPSBvZmZzZXQ7IC8vIEZvciBjb3VudCgpXG4gICAgICAgICAgICAgICAgaWYgKGlzUGxhaW5LZXlSYW5nZShjdHgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZFJlcGxheUZpbHRlcihjdHgsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvZmZzZXRMZWZ0ID0gb2Zmc2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjdXJzb3IsIGFkdmFuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0TGVmdCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldExlZnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1vZmZzZXRMZWZ0O3JldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5hZHZhbmNlKG9mZnNldExlZnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRMZWZ0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhZGRSZXBsYXlGaWx0ZXIoY3R4LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0TGVmdCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0tb2Zmc2V0TGVmdCA8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBsaW1pdDogZnVuY3Rpb24gKG51bVJvd3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdHgubGltaXQgPSBNYXRoLm1pbih0aGlzLl9jdHgubGltaXQsIG51bVJvd3MpOyAvLyBGb3IgY291bnQoKVxuICAgICAgICAgICAgICAgIGFkZFJlcGxheUZpbHRlcih0aGlzLl9jdHgsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3NMZWZ0ID0gbnVtUm93cztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjdXJzb3IsIGFkdmFuY2UsIHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLXJvd3NMZWZ0IDw9IDApIGFkdmFuY2UocmVzb2x2ZSk7IC8vIFN0b3AgYWZ0ZXIgdGhpcyBpdGVtIGhhcyBiZWVuIGluY2x1ZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93c0xlZnQgPj0gMDsgLy8gSWYgbnVtUm93cyBpcyBhbHJlYWR5IGJlbG93IDAsIHJldHVybiBmYWxzZSBiZWNhdXNlIHRoZW4gMCB3YXMgcGFzc2VkIHRvIG51bVJvd3MgaW5pdGlhbGx5LiBPdGhlcndpc2Ugd2Ugd291bGRudCBjb21lIGhlcmUuXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1bnRpbDogZnVuY3Rpb24gKGZpbHRlckZ1bmN0aW9uLCBiSW5jbHVkZVN0b3BFbnRyeSkge1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gICAgICAgICAgICAgICAgZmFrZSAmJiBmaWx0ZXJGdW5jdGlvbihnZXRJbnN0YW5jZVRlbXBsYXRlKGN0eCkpO1xuICAgICAgICAgICAgICAgIGFkZEZpbHRlcih0aGlzLl9jdHgsIGZ1bmN0aW9uIChjdXJzb3IsIGFkdmFuY2UsIHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlckZ1bmN0aW9uKGN1cnNvci52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UocmVzb2x2ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYkluY2x1ZGVTdG9wRW50cnk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZmlyc3Q6IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxpbWl0KDEpLnRvQXJyYXkoZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFbMF07XG4gICAgICAgICAgICAgICAgfSkudGhlbihjYik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBsYXN0OiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmlyc3QoY2IpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZmlsdGVyOiBmdW5jdGlvbiAoZmlsdGVyRnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9XCJqc0Z1bmN0aW9uRmlsdGVyXCIgdHlwZT1cIkZ1bmN0aW9uXCI+ZnVuY3Rpb24odmFsKXtyZXR1cm4gdHJ1ZS9mYWxzZX08L3BhcmFtPlxuICAgICAgICAgICAgICAgIGZha2UgJiYgZmlsdGVyRnVuY3Rpb24oZ2V0SW5zdGFuY2VUZW1wbGF0ZSh0aGlzLl9jdHgpKTtcbiAgICAgICAgICAgICAgICBhZGRGaWx0ZXIodGhpcy5fY3R4LCBmdW5jdGlvbiAoY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJGdW5jdGlvbihjdXJzb3IudmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIG1hdGNoIGZpbHRlcnMgbm90IHVzZWQgaW4gRGV4aWUuanMgYnV0IGNhbiBiZSB1c2VkIGJ5IDNyZCBwYXJ0IGxpYnJhcmllcyB0byB0ZXN0IGFcbiAgICAgICAgICAgICAgICAvLyBjb2xsZWN0aW9uIGZvciBhIG1hdGNoIHdpdGhvdXQgcXVlcnlpbmcgREIuIFVzZWQgYnkgRGV4aWUuT2JzZXJ2YWJsZS5cbiAgICAgICAgICAgICAgICBhZGRNYXRjaEZpbHRlcih0aGlzLl9jdHgsIGZpbHRlckZ1bmN0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGFuZDogZnVuY3Rpb24gKGZpbHRlckZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKGZpbHRlckZ1bmN0aW9uKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG9yOiBmdW5jdGlvbiAoaW5kZXhOYW1lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXaGVyZUNsYXVzZSh0aGlzLl9jdHgudGFibGUsIGluZGV4TmFtZSwgdGhpcyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZXZlcnNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3R4LmRpciA9IHRoaXMuX2N0eC5kaXIgPT09IFwicHJldlwiID8gXCJuZXh0XCIgOiBcInByZXZcIjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25kaXJlY3Rpb25jaGFuZ2UpIHRoaXMuX29uZGlyZWN0aW9uY2hhbmdlKHRoaXMuX2N0eC5kaXIpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZGVzYzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVhY2hLZXk6IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gICAgICAgICAgICAgICAgY3R4LmtleXNPbmx5ID0gIWN0eC5pc01hdGNoO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKHZhbCwgY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKGN1cnNvci5rZXksIGN1cnNvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBlYWNoVW5pcXVlS2V5OiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdHgudW5pcXVlID0gXCJ1bmlxdWVcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoS2V5KGNiKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVhY2hQcmltYXJ5S2V5OiBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3R4ID0gdGhpcy5fY3R4O1xuICAgICAgICAgICAgICAgIGN0eC5rZXlzT25seSA9ICFjdHguaXNNYXRjaDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICh2YWwsIGN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICBjYihjdXJzb3IucHJpbWFyeUtleSwgY3Vyc29yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGtleXM6IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHg7XG4gICAgICAgICAgICAgICAgY3R4LmtleXNPbmx5ID0gIWN0eC5pc01hdGNoO1xuICAgICAgICAgICAgICAgIHZhciBhID0gW107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaXRlbSwgY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgIGEucHVzaChjdXJzb3Iua2V5KTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICAgICAgfSkudGhlbihjYik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBwcmltYXJ5S2V5czogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN0eCA9IHRoaXMuX2N0eDtcbiAgICAgICAgICAgICAgICBpZiAoaGFzR2V0QWxsICYmIGN0eC5kaXIgPT09ICduZXh0JyAmJiBpc1BsYWluS2V5UmFuZ2UoY3R4LCB0cnVlKSAmJiBjdHgubGltaXQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgb3B0aW1hdGlvbiBpZiB3ZSBjb3VsZCB1c2UgSURCT2JqZWN0U3RvcmUuZ2V0QWxsS2V5cygpIG9yXG4gICAgICAgICAgICAgICAgICAgIC8vIElEQktleVJhbmdlLmdldEFsbEtleXMoKTpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlYWQoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZHhPclN0b3JlID0gZ2V0SW5kZXhPclN0b3JlKGN0eCwgaWRic3RvcmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IGN0eC5saW1pdCA8IEluZmluaXR5ID8gaWR4T3JTdG9yZS5nZXRBbGxLZXlzKGN0eC5yYW5nZSwgY3R4LmxpbWl0KSA6IGlkeE9yU3RvcmUuZ2V0QWxsS2V5cyhjdHgucmFuZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBldmVudFJlamVjdEhhbmRsZXIocmVqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSBldmVudFN1Y2Nlc3NIYW5kbGVyKHJlc29sdmUpO1xuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGNiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3R4LmtleXNPbmx5ID0gIWN0eC5pc01hdGNoO1xuICAgICAgICAgICAgICAgIHZhciBhID0gW107XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoaXRlbSwgY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgIGEucHVzaChjdXJzb3IucHJpbWFyeUtleSk7XG4gICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICAgICAgICAgIH0pLnRoZW4oY2IpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdW5pcXVlS2V5czogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3R4LnVuaXF1ZSA9IFwidW5pcXVlXCI7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMua2V5cyhjYik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBmaXJzdEtleTogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGltaXQoMSkua2V5cyhmdW5jdGlvbiAoYSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYVswXTtcbiAgICAgICAgICAgICAgICB9KS50aGVuKGNiKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGxhc3RLZXk6IGZ1bmN0aW9uIChjYikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKS5maXJzdEtleShjYik7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBkaXN0aW5jdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLl9jdHgsXG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IGN0eC5pbmRleCAmJiBjdHgudGFibGUuc2NoZW1hLmlkeEJ5TmFtZVtjdHguaW5kZXhdO1xuICAgICAgICAgICAgICAgIGlmICghaWR4IHx8ICFpZHgubXVsdGkpIHJldHVybiB0aGlzOyAvLyBkaXN0aW5jdCgpIG9ubHkgbWFrZXMgZGlmZmVyZW5jaWVzIG9uIG11bHRpRW50cnkgaW5kZXhlcy5cbiAgICAgICAgICAgICAgICB2YXIgc2V0ID0ge307XG4gICAgICAgICAgICAgICAgYWRkRmlsdGVyKHRoaXMuX2N0eCwgZnVuY3Rpb24gKGN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RyS2V5ID0gY3Vyc29yLnByaW1hcnlLZXkudG9TdHJpbmcoKTsgLy8gQ29udmVydHMgYW55IERhdGUgdG8gU3RyaW5nLCBTdHJpbmcgdG8gU3RyaW5nLCBOdW1iZXIgdG8gU3RyaW5nIGFuZCBBcnJheSB0byBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IGhhc093bihzZXQsIHN0cktleSk7XG4gICAgICAgICAgICAgICAgICAgIHNldFtzdHJLZXldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFmb3VuZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvLyBXcml0ZWFibGVDb2xsZWN0aW9uIENsYXNzXG4gICAgLy9cbiAgICAvL1xuICAgIGZ1bmN0aW9uIFdyaXRlYWJsZUNvbGxlY3Rpb24oKSB7XG4gICAgICAgIENvbGxlY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBkZXJpdmUoV3JpdGVhYmxlQ29sbGVjdGlvbikuZnJvbShDb2xsZWN0aW9uKS5leHRlbmQoe1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdyaXRlYWJsZUNvbGxlY3Rpb24gUHVibGljIE1ldGhvZHNcbiAgICAgICAgLy9cblxuICAgICAgICBtb2RpZnk6IGZ1bmN0aW9uIChjaGFuZ2VzKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fY3R4LFxuICAgICAgICAgICAgICAgIGhvb2sgPSBjdHgudGFibGUuaG9vayxcbiAgICAgICAgICAgICAgICB1cGRhdGluZ0hvb2sgPSBob29rLnVwZGF0aW5nLmZpcmUsXG4gICAgICAgICAgICAgICAgZGVsZXRpbmdIb29rID0gaG9vay5kZWxldGluZy5maXJlO1xuXG4gICAgICAgICAgICBmYWtlICYmIHR5cGVvZiBjaGFuZ2VzID09PSAnZnVuY3Rpb24nICYmIGNoYW5nZXMuY2FsbCh7IHZhbHVlOiBjdHgudGFibGUuc2NoZW1hLmluc3RhbmNlVGVtcGxhdGUgfSwgY3R4LnRhYmxlLnNjaGVtYS5pbnN0YW5jZVRlbXBsYXRlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dyaXRlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QsIGlkYnN0b3JlLCB0cmFucykge1xuICAgICAgICAgICAgICAgIHZhciBtb2RpZnllcjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNoYW5nZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlcyBpcyBhIGZ1bmN0aW9uIHRoYXQgbWF5IHVwZGF0ZSwgYWRkIG9yIGRlbGV0ZSBwcm9wdGVydGllcyBvciBldmVuIHJlcXVpcmUgYSBkZWxldGlvbiB0aGUgb2JqZWN0IGl0c2VsZiAoZGVsZXRlIHRoaXMuaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0aW5nSG9vayA9PT0gbm9wICYmIGRlbGV0aW5nSG9vayA9PT0gbm9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb29uZSBjYXJlcyBhYm91dCB3aGF0IGlzIGJlaW5nIGNoYW5nZWQuIEp1c3QgbGV0IHRoZSBtb2RpZmllciBmdW5jdGlvbiBiZSB0aGUgZ2l2ZW4gYXJndW1lbnQgYXMgaXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnllciA9IGNoYW5nZXM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQZW9wbGUgd2FudCB0byBrbm93IGV4YWN0bHkgd2hhdCBpcyBiZWluZyBtb2RpZmllZCBvciBkZWxldGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IG1vZGlmeWVyIGJlIGEgcHJveHkgZnVuY3Rpb24gdGhhdCBmaW5kcyBvdXQgd2hhdCBjaGFuZ2VzIHRoZSBjYWxsZXIgaXMgYWN0dWFsbHkgZG9pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjYWxsIHRoZSBob29rcyBhY2NvcmRpbmdseSFcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeWVyID0gZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3JpZ0l0ZW0gPSBkZWVwQ2xvbmUoaXRlbSk7IC8vIENsb25lIHRoZSBpdGVtIGZpcnN0IHNvIHdlIGNhbiBjb21wYXJlIGxhdGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5jYWxsKHRoaXMsIGl0ZW0sIHRoaXMpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOyAvLyBDYWxsIHRoZSByZWFsIG1vZGlmeWVyIGZ1bmN0aW9uIChJZiBpdCByZXR1cm5zIGZhbHNlIGV4cGxpY2l0ZWx5LCBpdCBtZWFucyBpdCBkb250IHdhbnQgdG8gbW9kaWZ5IGFueXRpbmcgb24gdGhpcyBvYmplY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNPd24odGhpcywgXCJ2YWx1ZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVhbCBtb2RpZnllciBmdW5jdGlvbiByZXF1ZXN0cyBhIGRlbGV0aW9uIG9mIHRoZSBvYmplY3QuIEluZm9ybSB0aGUgZGVsZXRpbmdIb29rIHRoYXQgYSBkZWxldGlvbiBpcyB0YWtpbmcgcGxhY2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW5nSG9vay5jYWxsKHRoaXMsIHRoaXMucHJpbUtleSwgaXRlbSwgdHJhbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRlbGV0aW9uLiBDaGVjayB3aGF0IHdhcyBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmplY3REaWZmID0gZ2V0T2JqZWN0RGlmZihvcmlnSXRlbSwgdGhpcy52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsQ2hhbmdlcyA9IHVwZGF0aW5nSG9vay5jYWxsKHRoaXMsIG9iamVjdERpZmYsIHRoaXMucHJpbUtleSwgb3JpZ0l0ZW0sIHRyYW5zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIb29rIHdhbnQgdG8gYXBwbHkgYWRkaXRpb25hbCBtb2RpZmljYXRpb25zLiBNYWtlIHN1cmUgdG8gZnVsbGZpbGwgdGhlIHdpbGwgb2YgdGhlIGhvb2suXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMoYWRkaXRpb25hbENoYW5nZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleVBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRCeUtleVBhdGgoaXRlbSwga2V5UGF0aCwgYWRkaXRpb25hbENoYW5nZXNba2V5UGF0aF0pOyAvLyBBZGRpbmcge2tleVBhdGg6IHVuZGVmaW5lZH0gbWVhbnMgdGhhdCB0aGUga2V5UGF0aCBzaG91bGQgYmUgZGVsZXRlZC4gSGFuZGxlZCBieSBzZXRCeUtleVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXBkYXRpbmdIb29rID09PSBub3ApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBpcyBhIHNldCBvZiB7a2V5UGF0aDogdmFsdWV9IGFuZCBubyBvbmUgaXMgbGlzdGVuaW5nIHRvIHRoZSB1cGRhdGluZyBob29rLlxuICAgICAgICAgICAgICAgICAgICB2YXIga2V5UGF0aHMgPSBrZXlzKGNoYW5nZXMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbnVtS2V5cyA9IGtleVBhdGhzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgbW9kaWZ5ZXIgPSBmdW5jdGlvbiAoaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFueXRoaW5nTW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtS2V5czsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleVBhdGggPSBrZXlQYXRoc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gY2hhbmdlc1trZXlQYXRoXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0QnlLZXlQYXRoKGl0ZW0sIGtleVBhdGgpICE9PSB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QnlLZXlQYXRoKGl0ZW0sIGtleVBhdGgsIHZhbCk7IC8vIEFkZGluZyB7a2V5UGF0aDogdW5kZWZpbmVkfSBtZWFucyB0aGF0IHRoZSBrZXlQYXRoIHNob3VsZCBiZSBkZWxldGVkLiBIYW5kbGVkIGJ5IHNldEJ5S2V5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnl0aGluZ01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW55dGhpbmdNb2RpZmllZDtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIGlzIGEgc2V0IG9mIHtrZXlQYXRoOiB2YWx1ZX0gYW5kIHBlb3BsZSBhcmUgbGlzdGVuaW5nIHRvIHRoZSB1cGRhdGluZyBob29rIHNvIHdlIG5lZWQgdG8gY2FsbCBpdCBhbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgaXQgdG8gYWRkIGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9ucyB0byBtYWtlLlxuICAgICAgICAgICAgICAgICAgICB2YXIgb3JpZ0NoYW5nZXMgPSBjaGFuZ2VzO1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzID0gc2hhbGxvd0Nsb25lKG9yaWdDaGFuZ2VzKTsgLy8gTGV0J3Mgd29yayB3aXRoIGEgY2xvbmUgb2YgdGhlIGNoYW5nZXMga2V5UGF0aC92YWx1ZSBzZXQgc28gdGhhdCB3ZSBjYW4gcmVzdG9yZSBpdCBpbiBjYXNlIGEgaG9vayBleHRlbmRzIGl0LlxuICAgICAgICAgICAgICAgICAgICBtb2RpZnllciA9IGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYW55dGhpbmdNb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxDaGFuZ2VzID0gdXBkYXRpbmdIb29rLmNhbGwodGhpcywgY2hhbmdlcywgdGhpcy5wcmltS2V5LCBkZWVwQ2xvbmUoaXRlbSksIHRyYW5zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRpdGlvbmFsQ2hhbmdlcykgZXh0ZW5kKGNoYW5nZXMsIGFkZGl0aW9uYWxDaGFuZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMoY2hhbmdlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5UGF0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSBjaGFuZ2VzW2tleVBhdGhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRCeUtleVBhdGgoaXRlbSwga2V5UGF0aCkgIT09IHZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRCeUtleVBhdGgoaXRlbSwga2V5UGF0aCwgdmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55dGhpbmdNb2RpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbENoYW5nZXMpIGNoYW5nZXMgPSBzaGFsbG93Q2xvbmUob3JpZ0NoYW5nZXMpOyAvLyBSZXN0b3JlIG9yaWdpbmFsIGNoYW5nZXMgZm9yIG5leHQgaXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW55dGhpbmdNb2RpZmllZDtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICAgICAgICAgIHZhciBzdWNjZXNzQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIHZhciBpdGVyYXRpb25Db21wbGV0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHZhciBmYWlsdXJlcyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBmYWlsS2V5cyA9IFtdO1xuICAgICAgICAgICAgICAgIHZhciBjdXJyZW50S2V5ID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1vZGlmeUl0ZW0oaXRlbSwgY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBjdXJzb3IucHJpbWFyeUtleTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXNDb250ZXh0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbUtleTogY3Vyc29yLnByaW1hcnlLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uc3VjY2VzczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZXJyb3I6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvbmVycm9yKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsS2V5cy5wdXNoKHRoaXNDb250ZXh0LnByaW1LZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tGaW5pc2hlZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIENhdGNoIHRoZXNlIGVycm9ycyBhbmQgbGV0IGEgZmluYWwgcmVqZWN0aW9uIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byBhYm9ydCBlbnRpcmUgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZnllci5jYWxsKHRoaXNDb250ZXh0LCBpdGVtLCB0aGlzQ29udGV4dCkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIGNhbGxiYWNrIGV4cGxpY2l0ZWx5IHJldHVybnMgZmFsc2UsIGRvIG5vdCBwZXJmb3JtIHRoZSB1cGRhdGUhXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYkRlbGV0ZSA9ICFoYXNPd24odGhpc0NvbnRleHQsIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICArK2NvdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Q2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBiRGVsZXRlID8gY3Vyc29yLmRlbGV0ZSgpIDogY3Vyc29yLnVwZGF0ZSh0aGlzQ29udGV4dC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLl9ob29rQ3R4ID0gdGhpc0NvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uZXJyb3IgPSBob29rZWRFdmVudFJlamVjdEhhbmRsZXIob25lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGhvb2tlZEV2ZW50U3VjY2Vzc0hhbmRsZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3N1Y2Nlc3NDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tGaW5pc2hlZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgb25lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc0NvbnRleHQub25zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIb29rIHdpbGwgZXhwZWN0IGVpdGhlciBvbmVycm9yIG9yIG9uc3VjY2VzcyB0byBhbHdheXMgYmUgY2FsbGVkIVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc0NvbnRleHQub25zdWNjZXNzKHRoaXNDb250ZXh0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRvUmVqZWN0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWlsS2V5cy5wdXNoKGN1cnJlbnRLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IE1vZGlmeUVycm9yKFwiRXJyb3IgbW9kaWZ5aW5nIG9uZSBvciBtb3JlIG9iamVjdHNcIiwgZmFpbHVyZXMsIHN1Y2Nlc3NDb3VudCwgZmFpbEtleXMpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBjaGVja0ZpbmlzaGVkKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0aW9uQ29tcGxldGUgJiYgc3VjY2Vzc0NvdW50ICsgZmFpbHVyZXMubGVuZ3RoID09PSBjb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWx1cmVzLmxlbmd0aCA+IDApIGRvUmVqZWN0KCk7ZWxzZSByZXNvbHZlKHN1Y2Nlc3NDb3VudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2VsZi5jbG9uZSgpLnJhdygpLl9pdGVyYXRlKG1vZGlmeUl0ZW0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uQ29tcGxldGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjaGVja0ZpbmlzaGVkKCk7XG4gICAgICAgICAgICAgICAgfSwgZG9SZWplY3QsIGlkYnN0b3JlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgICAgICAgdmFyIGN0eCA9IHRoaXMuX2N0eCxcbiAgICAgICAgICAgICAgICByYW5nZSA9IGN0eC5yYW5nZSxcbiAgICAgICAgICAgICAgICBkZWxldGluZ0hvb2sgPSBjdHgudGFibGUuaG9vay5kZWxldGluZy5maXJlLFxuICAgICAgICAgICAgICAgIGhhc0RlbGV0ZUhvb2sgPSBkZWxldGluZ0hvb2sgIT09IG5vcDtcbiAgICAgICAgICAgIGlmICghaGFzRGVsZXRlSG9vayAmJiBpc1BsYWluS2V5UmFuZ2UoY3R4KSAmJiAoY3R4LmlzUHJpbUtleSAmJiAhaGFuZ3NPbkRlbGV0ZUxhcmdlS2V5UmFuZ2UgfHwgIXJhbmdlKSkgLy8gaWYgbm8gcmFuZ2UsIHdlJ2xsIHVzZSBjbGVhcigpLlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWF5IHVzZSBJREJPYmplY3RTdG9yZS5kZWxldGUoSURCS2V5UmFuZ2UpIGluIHRoaXMgY2FzZSAoSXNzdWUgIzIwOClcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGNocm9taXVtLCB0aGlzIGlzIHRoZSB3YXkgbW9zdCBvcHRpbWl6ZWQgdmVyc2lvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIElFL0VkZ2UsIHRoaXMgY291bGQgaGFuZyB0aGUgaW5kZXhlZERCIGVuZ2luZSBhbmQgbWFrZSBvcGVyYXRpbmcgc3lzdGVtIGluc3RhYmxlXG4gICAgICAgICAgICAgICAgICAgIC8vIChodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kZmFobGFuZGVyLzVhMzkzMjhmMDI5ZGUxODIyMmNmMjEyNWQ1NmMzOGY3KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGUoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE91ciBBUEkgY29udHJhY3QgaXMgdG8gcmV0dXJuIGEgY291bnQgb2YgZGVsZXRlZCBpdGVtcywgc28gd2UgaGF2ZSB0byBjb3VudCgpIGJlZm9yZSBkZWxldGUoKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvbmVycm9yID0gZXZlbnRSZWplY3RIYW5kbGVyKHJlamVjdCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRSZXEgPSByYW5nZSA/IGlkYnN0b3JlLmNvdW50KHJhbmdlKSA6IGlkYnN0b3JlLmNvdW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudFJlcS5vbmVycm9yID0gb25lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50UmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBjb3VudFJlcS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Q2F0Y2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsUmVxID0gcmFuZ2UgPyBpZGJzdG9yZS5kZWxldGUocmFuZ2UpIDogaWRic3RvcmUuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsUmVxLm9uZXJyb3IgPSBvbmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxSZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoY291bnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZWZhdWx0IHZlcnNpb24gdG8gdXNlIHdoZW4gY29sbGVjdGlvbiBpcyBub3QgYSB2YW5pbGxhIElEQktleVJhbmdlIG9uIHRoZSBwcmltYXJ5IGtleS5cbiAgICAgICAgICAgIC8vIERpdmlkZSBpbnRvIGNodW5rcyB0byBub3Qgc3RhcnZlIFJBTS5cbiAgICAgICAgICAgIC8vIElmIGhhcyBkZWxldGUgaG9vaywgd2Ugd2lsbCBoYXZlIHRvIGNvbGxlY3Qgbm90IGp1c3Qga2V5cyBidXQgYWxzbyBvYmplY3RzLCBzbyBpdCB3aWxsIHVzZVxuICAgICAgICAgICAgLy8gbW9yZSBtZW1vcnkgYW5kIG5lZWQgbG93ZXIgY2h1bmsgc2l6ZS5cbiAgICAgICAgICAgIHZhciBDSFVOS1NJWkUgPSBoYXNEZWxldGVIb29rID8gMjAwMCA6IDEwMDAwO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd3JpdGUoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCwgaWRic3RvcmUsIHRyYW5zKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvdGFsQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIC8vIENsb25lIGNvbGxlY3Rpb24gYW5kIGNoYW5nZSBpdHMgdGFibGUgYW5kIHNldCBhIGxpbWl0IG9mIENIVU5LU0laRSBvbiB0aGUgY2xvbmVkIENvbGxlY3Rpb24gaW5zdGFuY2UuXG4gICAgICAgICAgICAgICAgdmFyIGNvbGxlY3Rpb24gPSBfdGhpczQuY2xvbmUoe1xuICAgICAgICAgICAgICAgICAgICBrZXlzT25seTogIWN0eC5pc01hdGNoICYmICFoYXNEZWxldGVIb29rIH0pIC8vIGxvYWQganVzdCBrZXlzICh1bmxlc3MgZmlsdGVyKCkgb3IgYW5kKCkgb3IgZGVsZXRlSG9vayBoYXMgc3Vic2NyaWJlcnMpXG4gICAgICAgICAgICAgICAgLmRpc3RpbmN0KCkgLy8gSW4gY2FzZSBtdWx0aUVudHJ5IGlzIHVzZWQsIG5ldmVyIGRlbGV0ZSBzYW1lIGtleSB0d2ljZSBiZWNhdXNlIHJlc3VsdGluZyBjb3VudFxuICAgICAgICAgICAgICAgIC8vIHdvdWxkIGJlY29tZSBsYXJnZXIgdGhhbiBhY3R1YWwgZGVsZXRlIGNvdW50LlxuICAgICAgICAgICAgICAgIC5saW1pdChDSFVOS1NJWkUpLnJhdygpOyAvLyBEb24ndCBmaWx0ZXIgdGhyb3VnaCByZWFkaW5nLWhvb2tzIChsaWtlIG1hcHBlZCBjbGFzc2VzIGV0YylcblxuICAgICAgICAgICAgICAgIHZhciBrZXlzT3JUdXBsZXMgPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGdvbm5hIGRvIHRoaW5ncyBvbiBhcyBtYW55IGNodW5rcyB0aGF0IGFyZSBuZWVkZWQuXG4gICAgICAgICAgICAgICAgLy8gVXNlIHJlY3Vyc2lvbiBvZiBuZXh0Q2h1bmsgZnVuY3Rpb246XG4gICAgICAgICAgICAgICAgdmFyIG5leHRDaHVuayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uZWFjaChoYXNEZWxldGVIb29rID8gZnVuY3Rpb24gKHZhbCwgY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21lYm9keSBzdWJzY3JpYmVzIHRvIGhvb2soJ2RlbGV0aW5nJykuIENvbGxlY3QgYWxsIHByaW1hcnkga2V5cyBhbmQgdGhlaXIgdmFsdWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCB0aGUgaG9vayBjYW4gYmUgY2FsbGVkIHdpdGggaXRzIHZhbHVlcyBpbiBidWxrRGVsZXRlKCkuXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzT3JUdXBsZXMucHVzaChbY3Vyc29yLnByaW1hcnlLZXksIGN1cnNvci52YWx1ZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IDogZnVuY3Rpb24gKHZhbCwgY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBvbmUgc3Vic2NyaWJlcyB0byBob29rKCdkZWxldGluZycpLiBDb2xsZWN0IG9ubHkgcHJpbWFyeSBrZXlzOlxuICAgICAgICAgICAgICAgICAgICAgICAga2V5c09yVHVwbGVzLnB1c2goY3Vyc29yLnByaW1hcnlLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENocm9taXVtIGRlbGV0ZXMgZmFzdGVyIHdoZW4gZG9pbmcgaXQgaW4gc29ydCBvcmRlci5cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0RlbGV0ZUhvb2sgPyBrZXlzT3JUdXBsZXMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhc2NlbmRpbmcoYVswXSwgYlswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSA6IGtleXNPclR1cGxlcy5zb3J0KGFzY2VuZGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVsa0RlbGV0ZShpZGJzdG9yZSwgdHJhbnMsIGtleXNPclR1cGxlcywgaGFzRGVsZXRlSG9vaywgZGVsZXRpbmdIb29rKTtcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBrZXlzT3JUdXBsZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDb3VudCArPSBjb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXNPclR1cGxlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50IDwgQ0hVTktTSVpFID8gdG90YWxDb3VudCA6IG5leHRDaHVuaygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShuZXh0Q2h1bmsoKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIZWxwIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cblxuICAgIGZ1bmN0aW9uIGxvd2VyVmVyc2lvbkZpcnN0KGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEuX2NmZy52ZXJzaW9uIC0gYi5fY2ZnLnZlcnNpb247XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0QXBpT25QbGFjZShvYmpzLCB0YWJsZU5hbWVzLCBtb2RlLCBkYnNjaGVtYSkge1xuICAgICAgICB0YWJsZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgdmFyIHRhYmxlSW5zdGFuY2UgPSBkYi5fdGFibGVGYWN0b3J5KG1vZGUsIGRic2NoZW1hW3RhYmxlTmFtZV0pO1xuICAgICAgICAgICAgb2Jqcy5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWUgaW4gb2JqIHx8IChvYmpbdGFibGVOYW1lXSA9IHRhYmxlSW5zdGFuY2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZVRhYmxlc0FwaShvYmpzKSB7XG4gICAgICAgIG9ianMuZm9yRWFjaChmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9ialtrZXldIGluc3RhbmNlb2YgVGFibGUpIGRlbGV0ZSBvYmpba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXRlcmF0ZShyZXEsIGZpbHRlciwgZm4sIHJlc29sdmUsIHJlamVjdCwgdmFsdWVNYXBwZXIpIHtcblxuICAgICAgICAvLyBBcHBseSB2YWx1ZU1hcHBlciAoaG9vaygncmVhZGluZycpIG9yIG1hcHBwZWQgY2xhc3MpXG4gICAgICAgIHZhciBtYXBwZWRGbiA9IHZhbHVlTWFwcGVyID8gZnVuY3Rpb24gKHgsIGMsIGEpIHtcbiAgICAgICAgICAgIHJldHVybiBmbih2YWx1ZU1hcHBlcih4KSwgYywgYSk7XG4gICAgICAgIH0gOiBmbjtcbiAgICAgICAgLy8gV3JhcCBmbiB3aXRoIFBTRCBhbmQgbWljcm90aWNrIHN0dWZmIGZyb20gUHJvbWlzZS5cbiAgICAgICAgdmFyIHdyYXBwZWRGbiA9IHdyYXAobWFwcGVkRm4sIHJlamVjdCk7XG5cbiAgICAgICAgaWYgKCFyZXEub25lcnJvcikgcmVxLm9uZXJyb3IgPSBldmVudFJlamVjdEhhbmRsZXIocmVqZWN0KTtcbiAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IHRyeWNhdGNoZXIoZnVuY3Rpb24gZmlsdGVyX3JlY29yZCgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gcmVxLnJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmNvbnRpbnVlKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIoY3Vyc29yLCBmdW5jdGlvbiAoYWR2YW5jZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBhZHZhbmNlcjtcbiAgICAgICAgICAgICAgICAgICAgfSwgcmVzb2x2ZSwgcmVqZWN0KSkgd3JhcHBlZEZuKGN1cnNvci52YWx1ZSwgY3Vyc29yLCBmdW5jdGlvbiAoYWR2YW5jZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBhZHZhbmNlcjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcS5vbnN1Y2Nlc3MgPSB0cnljYXRjaGVyKGZ1bmN0aW9uIGZpbHRlcl9yZWNvcmQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IHJlcS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvci5jb250aW51ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB3cmFwcGVkRm4oY3Vyc29yLnZhbHVlLCBjdXJzb3IsIGZ1bmN0aW9uIChhZHZhbmNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGFkdmFuY2VyO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCByZWplY3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2VJbmRleFN5bnRheChpbmRleGVzKSB7XG4gICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cImluZGV4ZXNcIiB0eXBlPVwiU3RyaW5nXCI+PC9wYXJhbT5cbiAgICAgICAgLy8vIDxyZXR1cm5zIHR5cGU9XCJBcnJheVwiIGVsZW1lbnRUeXBlPVwiSW5kZXhTcGVjXCI+PC9yZXR1cm5zPlxuICAgICAgICB2YXIgcnYgPSBbXTtcbiAgICAgICAgaW5kZXhlcy5zcGxpdCgnLCcpLmZvckVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgICAgICBpbmRleCA9IGluZGV4LnRyaW0oKTtcbiAgICAgICAgICAgIHZhciBuYW1lID0gaW5kZXgucmVwbGFjZSgvKFsmKl18XFwrXFwrKS9nLCBcIlwiKTsgLy8gUmVtb3ZlIFwiJlwiLCBcIisrXCIgYW5kIFwiKlwiXG4gICAgICAgICAgICAvLyBMZXQga2V5UGF0aCBvZiBcIlthK2JdXCIgYmUgW1wiYVwiLFwiYlwiXTpcbiAgICAgICAgICAgIHZhciBrZXlQYXRoID0gL15cXFsvLnRlc3QobmFtZSkgPyBuYW1lLm1hdGNoKC9eXFxbKC4qKVxcXSQvKVsxXS5zcGxpdCgnKycpIDogbmFtZTtcblxuICAgICAgICAgICAgcnYucHVzaChuZXcgSW5kZXhTcGVjKG5hbWUsIGtleVBhdGggfHwgbnVsbCwgL1xcJi8udGVzdChpbmRleCksIC9cXCovLnRlc3QoaW5kZXgpLCAvXFwrXFwrLy50ZXN0KGluZGV4KSwgaXNBcnJheShrZXlQYXRoKSwgL1xcLi8udGVzdChpbmRleCkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBydjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbXAoa2V5MSwga2V5Mikge1xuICAgICAgICByZXR1cm4gaW5kZXhlZERCLmNtcChrZXkxLCBrZXkyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtaW4oYSwgYikge1xuICAgICAgICByZXR1cm4gY21wKGEsIGIpIDwgMCA/IGEgOiBiO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1heChhLCBiKSB7XG4gICAgICAgIHJldHVybiBjbXAoYSwgYikgPiAwID8gYSA6IGI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXNjZW5kaW5nKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ZWREQi5jbXAoYSwgYik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKSB7XG4gICAgICAgIHJldHVybiBpbmRleGVkREIuY21wKGIsIGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNpbXBsZUNvbXBhcmUoYSwgYikge1xuICAgICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPT09IGIgPyAwIDogMTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzaW1wbGVDb21wYXJlUmV2ZXJzZShhLCBiKSB7XG4gICAgICAgIHJldHVybiBhID4gYiA/IC0xIDogYSA9PT0gYiA/IDAgOiAxO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbWJpbmUoZmlsdGVyMSwgZmlsdGVyMikge1xuICAgICAgICByZXR1cm4gZmlsdGVyMSA/IGZpbHRlcjIgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyMS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICYmIGZpbHRlcjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSA6IGZpbHRlcjEgOiBmaWx0ZXIyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlYWRHbG9iYWxTY2hlbWEoKSB7XG4gICAgICAgIGRiLnZlcm5vID0gaWRiZGIudmVyc2lvbiAvIDEwO1xuICAgICAgICBkYi5fZGJTY2hlbWEgPSBnbG9iYWxTY2hlbWEgPSB7fTtcbiAgICAgICAgZGJTdG9yZU5hbWVzID0gc2xpY2UoaWRiZGIub2JqZWN0U3RvcmVOYW1lcywgMCk7XG4gICAgICAgIGlmIChkYlN0b3JlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm47IC8vIERhdGFiYXNlIGNvbnRhaW5zIG5vIHN0b3Jlcy5cbiAgICAgICAgdmFyIHRyYW5zID0gaWRiZGIudHJhbnNhY3Rpb24oc2FmYXJpTXVsdGlTdG9yZUZpeChkYlN0b3JlTmFtZXMpLCAncmVhZG9ubHknKTtcbiAgICAgICAgZGJTdG9yZU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKHN0b3JlTmFtZSkge1xuICAgICAgICAgICAgdmFyIHN0b3JlID0gdHJhbnMub2JqZWN0U3RvcmUoc3RvcmVOYW1lKSxcbiAgICAgICAgICAgICAgICBrZXlQYXRoID0gc3RvcmUua2V5UGF0aCxcbiAgICAgICAgICAgICAgICBkb3R0ZWQgPSBrZXlQYXRoICYmIHR5cGVvZiBrZXlQYXRoID09PSAnc3RyaW5nJyAmJiBrZXlQYXRoLmluZGV4T2YoJy4nKSAhPT0gLTE7XG4gICAgICAgICAgICB2YXIgcHJpbUtleSA9IG5ldyBJbmRleFNwZWMoa2V5UGF0aCwga2V5UGF0aCB8fCBcIlwiLCBmYWxzZSwgZmFsc2UsICEhc3RvcmUuYXV0b0luY3JlbWVudCwga2V5UGF0aCAmJiB0eXBlb2Yga2V5UGF0aCAhPT0gJ3N0cmluZycsIGRvdHRlZCk7XG4gICAgICAgICAgICB2YXIgaW5kZXhlcyA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdG9yZS5pbmRleE5hbWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlkYmluZGV4ID0gc3RvcmUuaW5kZXgoc3RvcmUuaW5kZXhOYW1lc1tqXSk7XG4gICAgICAgICAgICAgICAga2V5UGF0aCA9IGlkYmluZGV4LmtleVBhdGg7XG4gICAgICAgICAgICAgICAgZG90dGVkID0ga2V5UGF0aCAmJiB0eXBlb2Yga2V5UGF0aCA9PT0gJ3N0cmluZycgJiYga2V5UGF0aC5pbmRleE9mKCcuJykgIT09IC0xO1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IG5ldyBJbmRleFNwZWMoaWRiaW5kZXgubmFtZSwga2V5UGF0aCwgISFpZGJpbmRleC51bmlxdWUsICEhaWRiaW5kZXgubXVsdGlFbnRyeSwgZmFsc2UsIGtleVBhdGggJiYgdHlwZW9mIGtleVBhdGggIT09ICdzdHJpbmcnLCBkb3R0ZWQpO1xuICAgICAgICAgICAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBnbG9iYWxTY2hlbWFbc3RvcmVOYW1lXSA9IG5ldyBUYWJsZVNjaGVtYShzdG9yZU5hbWUsIHByaW1LZXksIGluZGV4ZXMsIHt9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNldEFwaU9uUGxhY2UoW2FsbFRhYmxlcywgVHJhbnNhY3Rpb24ucHJvdG90eXBlXSwga2V5cyhnbG9iYWxTY2hlbWEpLCBSRUFEV1JJVEUsIGdsb2JhbFNjaGVtYSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRqdXN0VG9FeGlzdGluZ0luZGV4TmFtZXMoc2NoZW1hLCBpZGJ0cmFucykge1xuICAgICAgICAvLy8gPHN1bW1hcnk+XG4gICAgICAgIC8vLyBJc3N1ZSAjMzAgUHJvYmxlbSB3aXRoIGV4aXN0aW5nIGRiIC0gYWRqdXN0IHRvIGV4aXN0aW5nIGluZGV4IG5hbWVzIHdoZW4gbWlncmF0aW5nIGZyb20gbm9uLWRleGllIGRiXG4gICAgICAgIC8vLyA8L3N1bW1hcnk+XG4gICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cInNjaGVtYVwiIHR5cGU9XCJPYmplY3RcIj5NYXAgYmV0d2VlbiBuYW1lIGFuZCBUYWJsZVNjaGVtYTwvcGFyYW0+XG4gICAgICAgIC8vLyA8cGFyYW0gbmFtZT1cImlkYnRyYW5zXCIgdHlwZT1cIklEQlRyYW5zYWN0aW9uXCI+PC9wYXJhbT5cbiAgICAgICAgdmFyIHN0b3JlTmFtZXMgPSBpZGJ0cmFucy5kYi5vYmplY3RTdG9yZU5hbWVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b3JlTmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBzdG9yZU5hbWUgPSBzdG9yZU5hbWVzW2ldO1xuICAgICAgICAgICAgdmFyIHN0b3JlID0gaWRidHJhbnMub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICAgICAgICAgIGhhc0dldEFsbCA9ICdnZXRBbGwnIGluIHN0b3JlO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdG9yZS5pbmRleE5hbWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4TmFtZSA9IHN0b3JlLmluZGV4TmFtZXNbal07XG4gICAgICAgICAgICAgICAgdmFyIGtleVBhdGggPSBzdG9yZS5pbmRleChpbmRleE5hbWUpLmtleVBhdGg7XG4gICAgICAgICAgICAgICAgdmFyIGRleGllTmFtZSA9IHR5cGVvZiBrZXlQYXRoID09PSAnc3RyaW5nJyA/IGtleVBhdGggOiBcIltcIiArIHNsaWNlKGtleVBhdGgpLmpvaW4oJysnKSArIFwiXVwiO1xuICAgICAgICAgICAgICAgIGlmIChzY2hlbWFbc3RvcmVOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXhTcGVjID0gc2NoZW1hW3N0b3JlTmFtZV0uaWR4QnlOYW1lW2RleGllTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleFNwZWMpIGluZGV4U3BlYy5uYW1lID0gaW5kZXhOYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZpcmVPbkJsb2NrZWQoZXYpIHtcbiAgICAgICAgZGIub24oXCJibG9ja2VkXCIpLmZpcmUoZXYpO1xuICAgICAgICAvLyBXb3JrYXJvdW5kIChub3QgZnVsbHkqKSBmb3IgbWlzc2luZyBcInZlcnNpb25jaGFuZ2VcIiBldmVudCBpbiBJRSxFZGdlIGFuZCBTYWZhcmk6XG4gICAgICAgIGNvbm5lY3Rpb25zLmZpbHRlcihmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgcmV0dXJuIGMubmFtZSA9PT0gZGIubmFtZSAmJiBjICE9PSBkYiAmJiAhYy5fdmNGaXJlZDtcbiAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChjKSB7XG4gICAgICAgICAgICByZXR1cm4gYy5vbihcInZlcnNpb25jaGFuZ2VcIikuZmlyZShldik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGV4dGVuZCh0aGlzLCB7XG4gICAgICAgIENvbGxlY3Rpb246IENvbGxlY3Rpb24sXG4gICAgICAgIFRhYmxlOiBUYWJsZSxcbiAgICAgICAgVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uLFxuICAgICAgICBWZXJzaW9uOiBWZXJzaW9uLFxuICAgICAgICBXaGVyZUNsYXVzZTogV2hlcmVDbGF1c2UsXG4gICAgICAgIFdyaXRlYWJsZUNvbGxlY3Rpb246IFdyaXRlYWJsZUNvbGxlY3Rpb24sXG4gICAgICAgIFdyaXRlYWJsZVRhYmxlOiBXcml0ZWFibGVUYWJsZVxuICAgIH0pO1xuXG4gICAgaW5pdCgpO1xuXG4gICAgYWRkb25zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIGZuKGRiKTtcbiAgICB9KTtcbn1cblxudmFyIGZha2VBdXRvQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7fTsgLy8gV2lsbCBuZXZlciBiZSBjaGFuZ2VkLiBXZSBqdXN0IGZha2UgZm9yIHRoZSBJREUgdGhhdCB3ZSBjaGFuZ2UgaXQgKHNlZSBkb0Zha2VBdXRvQ29tcGxldGUoKSlcbnZhciBmYWtlID0gZmFsc2U7IC8vIFdpbGwgbmV2ZXIgYmUgY2hhbmdlZC4gV2UganVzdCBmYWtlIGZvciB0aGUgSURFIHRoYXQgd2UgY2hhbmdlIGl0IChzZWUgZG9GYWtlQXV0b0NvbXBsZXRlKCkpXG5cbmZ1bmN0aW9uIHBhcnNlVHlwZSh0eXBlKSB7XG4gICAgaWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgdHlwZSgpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheSh0eXBlKSkge1xuICAgICAgICByZXR1cm4gW3BhcnNlVHlwZSh0eXBlWzBdKV07XG4gICAgfSBlbHNlIGlmICh0eXBlICYmIHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICB2YXIgcnYgPSB7fTtcbiAgICAgICAgYXBwbHlTdHJ1Y3R1cmUocnYsIHR5cGUpO1xuICAgICAgICByZXR1cm4gcnY7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhcHBseVN0cnVjdHVyZShvYmosIHN0cnVjdHVyZSkge1xuICAgIGtleXMoc3RydWN0dXJlKS5mb3JFYWNoKGZ1bmN0aW9uIChtZW1iZXIpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VUeXBlKHN0cnVjdHVyZVttZW1iZXJdKTtcbiAgICAgICAgb2JqW21lbWJlcl0gPSB2YWx1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBldmVudFN1Y2Nlc3NIYW5kbGVyKGRvbmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGRvbmUoZXYudGFyZ2V0LnJlc3VsdCk7XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gaG9va2VkRXZlbnRTdWNjZXNzSGFuZGxlcihyZXNvbHZlKSB7XG4gICAgLy8gd3JhcCgpIGlzIG5lZWRlZCB3aGVuIGNhbGxpbmcgaG9va3MgYmVjYXVzZSB0aGUgcmFyZSBzY2VuYXJpbyBvZjpcbiAgICAvLyAgKiBob29rIGRvZXMgYSBkYiBvcGVyYXRpb24gdGhhdCBmYWlscyBpbW1lZGlhdGVseSAoSURCIHRocm93cyBleGNlcHRpb24pXG4gICAgLy8gICAgRm9yIGNhbGxpbmcgZGIgb3BlcmF0aW9ucyBvbiBjb3JyZWN0IHRyYW5zYWN0aW9uLCB3cmFwIG1ha2VzIHN1cmUgdG8gc2V0IFBTRCBjb3JyZWN0bHkuXG4gICAgLy8gICAgd3JhcCgpIHdpbGwgYWxzbyBleGVjdXRlIGluIGEgdmlydHVhbCB0aWNrLlxuICAgIC8vICAqIElmIG5vdCB3cmFwcGVkIGluIGEgdmlydHVhbCB0aWNrLCBkaXJlY3QgZXhjZXB0aW9uIHdpbGwgbGF1bmNoIGEgbmV3IHBoeXNpY2FsIHRpY2suXG4gICAgLy8gICogSWYgdGhpcyB3YXMgdGhlIGxhc3QgZXZlbnQgaW4gdGhlIGJ1bGssIHRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSBhZnRlciBhIHBoeXNpY2FsIHRpY2tcbiAgICAvLyAgICBhbmQgdGhlIHRyYW5zYWN0aW9uIHdpbGwgaGF2ZSBjb21taXR0ZWQgYWxyZWFkeS5cbiAgICAvLyBJZiBubyBob29rLCB0aGUgdmlydHVhbCB0aWNrIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHJlamVjdCgpL3Jlc29sdmUgb2YgdGhlIGZpbmFsIHByb21pc2UsXG4gICAgLy8gYmVjYXVzZSBpdCBpcyBhbHdheXMgbWFya2VkIHdpdGggX2xpYiA9IHRydWUgd2hlbiBjcmVhdGVkIHVzaW5nIFRyYW5zYWN0aW9uLl9wcm9taXNlKCkuXG4gICAgcmV0dXJuIHdyYXAoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciByZXEgPSBldmVudC50YXJnZXQsXG4gICAgICAgICAgICByZXN1bHQgPSByZXEucmVzdWx0LFxuICAgICAgICAgICAgY3R4ID0gcmVxLl9ob29rQ3R4LFxuICAgICAgICAgICAgLy8gQ29udGFpbnMgdGhlIGhvb2sgZXJyb3IgaGFuZGxlci4gUHV0IGhlcmUgaW5zdGVhZCBvZiBjbG9zdXJlIHRvIGJvb3N0IHBlcmZvcm1hbmNlLlxuICAgICAgICBob29rU3VjY2Vzc0hhbmRsZXIgPSBjdHggJiYgY3R4Lm9uc3VjY2VzcztcbiAgICAgICAgaG9va1N1Y2Nlc3NIYW5kbGVyICYmIGhvb2tTdWNjZXNzSGFuZGxlcihyZXN1bHQpO1xuICAgICAgICByZXNvbHZlICYmIHJlc29sdmUocmVzdWx0KTtcbiAgICB9LCByZXNvbHZlKTtcbn1cblxuZnVuY3Rpb24gZXZlbnRSZWplY3RIYW5kbGVyKHJlamVjdCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcHJldmVudERlZmF1bHQoZXZlbnQpO1xuICAgICAgICByZWplY3QoZXZlbnQudGFyZ2V0LmVycm9yKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGhvb2tlZEV2ZW50UmVqZWN0SGFuZGxlcihyZWplY3QpIHtcbiAgICByZXR1cm4gd3JhcChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgLy8gU2VlIGNvbW1lbnQgb24gaG9va2VkRXZlbnRTdWNjZXNzSGFuZGxlcigpIHdoeSB3cmFwKCkgaXMgbmVlZGVkIG9ubHkgd2hlbiBzdXBwb3J0aW5nIGhvb2tzLlxuXG4gICAgICAgIHZhciByZXEgPSBldmVudC50YXJnZXQsXG4gICAgICAgICAgICBlcnIgPSByZXEuZXJyb3IsXG4gICAgICAgICAgICBjdHggPSByZXEuX2hvb2tDdHgsXG4gICAgICAgICAgICAvLyBDb250YWlucyB0aGUgaG9vayBlcnJvciBoYW5kbGVyLiBQdXQgaGVyZSBpbnN0ZWFkIG9mIGNsb3N1cmUgdG8gYm9vc3QgcGVyZm9ybWFuY2UuXG4gICAgICAgIGhvb2tFcnJvckhhbmRsZXIgPSBjdHggJiYgY3R4Lm9uZXJyb3I7XG4gICAgICAgIGhvb2tFcnJvckhhbmRsZXIgJiYgaG9va0Vycm9ySGFuZGxlcihlcnIpO1xuICAgICAgICBwcmV2ZW50RGVmYXVsdChldmVudCk7XG4gICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHByZXZlbnREZWZhdWx0KGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgLy8gSW5kZXhlZERCU2hpbSBkb2VzbnQgc3VwcG9ydCB0aGlzIG9uIFNhZmFyaSA4IGFuZCBiZWxvdy5cbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSAvLyBJbmRleGVkREJTaGltIGRvZXNudCBzdXBwb3J0IHRoaXMgb24gU2FmYXJpIDggYW5kIGJlbG93LlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuXG5mdW5jdGlvbiBnbG9iYWxEYXRhYmFzZUxpc3QoY2IpIHtcbiAgICB2YXIgdmFsLFxuICAgICAgICBsb2NhbFN0b3JhZ2UgPSBEZXhpZS5kZXBlbmRlbmNpZXMubG9jYWxTdG9yYWdlO1xuICAgIGlmICghbG9jYWxTdG9yYWdlKSByZXR1cm4gY2IoW10pOyAvLyBFbnZzIHdpdGhvdXQgbG9jYWxTdG9yYWdlIHN1cHBvcnRcbiAgICB0cnkge1xuICAgICAgICB2YWwgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdEZXhpZS5EYXRhYmFzZU5hbWVzJykgfHwgXCJbXVwiKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHZhbCA9IFtdO1xuICAgIH1cbiAgICBpZiAoY2IodmFsKSkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnRGV4aWUuRGF0YWJhc2VOYW1lcycsIEpTT04uc3RyaW5naWZ5KHZhbCkpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYXdhaXRJdGVyYXRvcihpdGVyYXRvcikge1xuICAgIHZhciBjYWxsTmV4dCA9IGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHQocmVzdWx0KTtcbiAgICB9LFxuICAgICAgICBkb1Rocm93ID0gZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvci50aHJvdyhlcnJvcik7XG4gICAgfSxcbiAgICAgICAgb25TdWNjZXNzID0gc3RlcChjYWxsTmV4dCksXG4gICAgICAgIG9uRXJyb3IgPSBzdGVwKGRvVGhyb3cpO1xuXG4gICAgZnVuY3Rpb24gc3RlcChnZXROZXh0KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICB2YXIgbmV4dCA9IGdldE5leHQodmFsKSxcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG5leHQudmFsdWU7XG5cbiAgICAgICAgICAgIHJldHVybiBuZXh0LmRvbmUgPyB2YWx1ZSA6ICF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUudGhlbiAhPT0gJ2Z1bmN0aW9uJyA/IGlzQXJyYXkodmFsdWUpID8gUHJvbWlzZS5hbGwodmFsdWUpLnRoZW4ob25TdWNjZXNzLCBvbkVycm9yKSA6IG9uU3VjY2Vzcyh2YWx1ZSkgOiB2YWx1ZS50aGVuKG9uU3VjY2Vzcywgb25FcnJvcik7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ZXAoY2FsbE5leHQpKCk7XG59XG5cbi8vXG4vLyBJbmRleFNwZWMgc3RydWN0XG4vL1xuZnVuY3Rpb24gSW5kZXhTcGVjKG5hbWUsIGtleVBhdGgsIHVuaXF1ZSwgbXVsdGksIGF1dG8sIGNvbXBvdW5kLCBkb3R0ZWQpIHtcbiAgICAvLy8gPHBhcmFtIG5hbWU9XCJuYW1lXCIgdHlwZT1cIlN0cmluZ1wiPjwvcGFyYW0+XG4gICAgLy8vIDxwYXJhbSBuYW1lPVwia2V5UGF0aFwiIHR5cGU9XCJTdHJpbmdcIj48L3BhcmFtPlxuICAgIC8vLyA8cGFyYW0gbmFtZT1cInVuaXF1ZVwiIHR5cGU9XCJCb29sZWFuXCI+PC9wYXJhbT5cbiAgICAvLy8gPHBhcmFtIG5hbWU9XCJtdWx0aVwiIHR5cGU9XCJCb29sZWFuXCI+PC9wYXJhbT5cbiAgICAvLy8gPHBhcmFtIG5hbWU9XCJhdXRvXCIgdHlwZT1cIkJvb2xlYW5cIj48L3BhcmFtPlxuICAgIC8vLyA8cGFyYW0gbmFtZT1cImNvbXBvdW5kXCIgdHlwZT1cIkJvb2xlYW5cIj48L3BhcmFtPlxuICAgIC8vLyA8cGFyYW0gbmFtZT1cImRvdHRlZFwiIHR5cGU9XCJCb29sZWFuXCI+PC9wYXJhbT5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMua2V5UGF0aCA9IGtleVBhdGg7XG4gICAgdGhpcy51bmlxdWUgPSB1bmlxdWU7XG4gICAgdGhpcy5tdWx0aSA9IG11bHRpO1xuICAgIHRoaXMuYXV0byA9IGF1dG87XG4gICAgdGhpcy5jb21wb3VuZCA9IGNvbXBvdW5kO1xuICAgIHRoaXMuZG90dGVkID0gZG90dGVkO1xuICAgIHZhciBrZXlQYXRoU3JjID0gdHlwZW9mIGtleVBhdGggPT09ICdzdHJpbmcnID8ga2V5UGF0aCA6IGtleVBhdGggJiYgJ1snICsgW10uam9pbi5jYWxsKGtleVBhdGgsICcrJykgKyAnXSc7XG4gICAgdGhpcy5zcmMgPSAodW5pcXVlID8gJyYnIDogJycpICsgKG11bHRpID8gJyonIDogJycpICsgKGF1dG8gPyBcIisrXCIgOiBcIlwiKSArIGtleVBhdGhTcmM7XG59XG5cbi8vXG4vLyBUYWJsZVNjaGVtYSBzdHJ1Y3Rcbi8vXG5mdW5jdGlvbiBUYWJsZVNjaGVtYShuYW1lLCBwcmltS2V5LCBpbmRleGVzLCBpbnN0YW5jZVRlbXBsYXRlKSB7XG4gICAgLy8vIDxwYXJhbSBuYW1lPVwibmFtZVwiIHR5cGU9XCJTdHJpbmdcIj48L3BhcmFtPlxuICAgIC8vLyA8cGFyYW0gbmFtZT1cInByaW1LZXlcIiB0eXBlPVwiSW5kZXhTcGVjXCI+PC9wYXJhbT5cbiAgICAvLy8gPHBhcmFtIG5hbWU9XCJpbmRleGVzXCIgdHlwZT1cIkFycmF5XCIgZWxlbWVudFR5cGU9XCJJbmRleFNwZWNcIj48L3BhcmFtPlxuICAgIC8vLyA8cGFyYW0gbmFtZT1cImluc3RhbmNlVGVtcGxhdGVcIiB0eXBlPVwiT2JqZWN0XCI+PC9wYXJhbT5cbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMucHJpbUtleSA9IHByaW1LZXkgfHwgbmV3IEluZGV4U3BlYygpO1xuICAgIHRoaXMuaW5kZXhlcyA9IGluZGV4ZXMgfHwgW25ldyBJbmRleFNwZWMoKV07XG4gICAgdGhpcy5pbnN0YW5jZVRlbXBsYXRlID0gaW5zdGFuY2VUZW1wbGF0ZTtcbiAgICB0aGlzLm1hcHBlZENsYXNzID0gbnVsbDtcbiAgICB0aGlzLmlkeEJ5TmFtZSA9IGFycmF5VG9PYmplY3QoaW5kZXhlcywgZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHJldHVybiBbaW5kZXgubmFtZSwgaW5kZXhdO1xuICAgIH0pO1xufVxuXG4vLyBVc2VkIGluIHdoZW4gZGVmaW5pbmcgZGVwZW5kZW5jaWVzIGxhdGVyLi4uXG4vLyAoSWYgSW5kZXhlZERCU2hpbSBpcyBsb2FkZWQsIHByZWZlciBpdCBiZWZvcmUgc3RhbmRhcmQgaW5kZXhlZERCKVxudmFyIGlkYnNoaW0gPSBfZ2xvYmFsLmlkYk1vZHVsZXMgJiYgX2dsb2JhbC5pZGJNb2R1bGVzLnNoaW1JbmRleGVkREIgPyBfZ2xvYmFsLmlkYk1vZHVsZXMgOiB7fTtcblxuZnVuY3Rpb24gc2FmYXJpTXVsdGlTdG9yZUZpeChzdG9yZU5hbWVzKSB7XG4gICAgcmV0dXJuIHN0b3JlTmFtZXMubGVuZ3RoID09PSAxID8gc3RvcmVOYW1lc1swXSA6IHN0b3JlTmFtZXM7XG59XG5cbmZ1bmN0aW9uIGdldE5hdGl2ZUdldERhdGFiYXNlTmFtZXNGbihpbmRleGVkREIpIHtcbiAgICB2YXIgZm4gPSBpbmRleGVkREIgJiYgKGluZGV4ZWREQi5nZXREYXRhYmFzZU5hbWVzIHx8IGluZGV4ZWREQi53ZWJraXRHZXREYXRhYmFzZU5hbWVzKTtcbiAgICByZXR1cm4gZm4gJiYgZm4uYmluZChpbmRleGVkREIpO1xufVxuXG4vLyBFeHBvcnQgRXJyb3IgY2xhc3Nlc1xucHJvcHMoRGV4aWUsIGZ1bGxOYW1lRXhjZXB0aW9ucyk7IC8vIERleGllLlhYWEVycm9yID0gY2xhc3MgWFhYRXJyb3Igey4uLn07XG5cbi8vXG4vLyBTdGF0aWMgbWV0aG9kcyBhbmQgcHJvcGVydGllc1xuLy8gXG5wcm9wcyhEZXhpZSwge1xuXG4gICAgLy9cbiAgICAvLyBTdGF0aWMgZGVsZXRlKCkgbWV0aG9kLlxuICAgIC8vXG4gICAgZGVsZXRlOiBmdW5jdGlvbiAoZGF0YWJhc2VOYW1lKSB7XG4gICAgICAgIHZhciBkYiA9IG5ldyBEZXhpZShkYXRhYmFzZU5hbWUpLFxuICAgICAgICAgICAgcHJvbWlzZSA9IGRiLmRlbGV0ZSgpO1xuICAgICAgICBwcm9taXNlLm9uYmxvY2tlZCA9IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAgICAgZGIub24oXCJibG9ja2VkXCIsIGZuKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9LFxuXG4gICAgLy9cbiAgICAvLyBTdGF0aWMgZXhpc3RzKCkgbWV0aG9kLlxuICAgIC8vXG4gICAgZXhpc3RzOiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICByZXR1cm4gbmV3IERleGllKG5hbWUpLm9wZW4oKS50aGVuKGZ1bmN0aW9uIChkYikge1xuICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KS5jYXRjaChEZXhpZS5Ob1N1Y2hEYXRhYmFzZUVycm9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvL1xuICAgIC8vIFN0YXRpYyBtZXRob2QgZm9yIHJldHJpZXZpbmcgYSBsaXN0IG9mIGFsbCBleGlzdGluZyBkYXRhYmFzZXMgYXQgY3VycmVudCBob3N0LlxuICAgIC8vXG4gICAgZ2V0RGF0YWJhc2VOYW1lczogZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgICB2YXIgZ2V0RGF0YWJhc2VOYW1lcyA9IGdldE5hdGl2ZUdldERhdGFiYXNlTmFtZXNGbihpbmRleGVkREIpO1xuICAgICAgICAgICAgaWYgKGdldERhdGFiYXNlTmFtZXMpIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGdldERhdGFiYXNlTmFtZXMoKSBiZWNvbWVzIHN0YW5kYXJkLCBsZXQncyBwcmVwYXJlIHRvIHN1cHBvcnQgaXQ6XG4gICAgICAgICAgICAgICAgdmFyIHJlcSA9IGdldERhdGFiYXNlTmFtZXMoKTtcbiAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2xpY2UoZXZlbnQudGFyZ2V0LnJlc3VsdCwgMCkpOyAvLyBDb252ZXJzdCBET01TdHJpbmdMaXN0IHRvIEFycmF5PFN0cmluZz5cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZXZlbnRSZWplY3RIYW5kbGVyKHJlamVjdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdsb2JhbERhdGFiYXNlTGlzdChmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS50aGVuKGNiKTtcbiAgICB9LFxuXG4gICAgZGVmaW5lQ2xhc3M6IGZ1bmN0aW9uIChzdHJ1Y3R1cmUpIHtcbiAgICAgICAgLy8vIDxzdW1tYXJ5PlxuICAgICAgICAvLy8gICAgIENyZWF0ZSBhIGphdmFzY3JpcHQgY29uc3RydWN0b3IgYmFzZWQgb24gZ2l2ZW4gdGVtcGxhdGUgZm9yIHdoaWNoIHByb3BlcnRpZXMgdG8gZXhwZWN0IGluIHRoZSBjbGFzcy5cbiAgICAgICAgLy8vICAgICBBbnkgcHJvcGVydHkgdGhhdCBpcyBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdpbGwgYWN0IGFzIGEgdHlwZS4gU28ge25hbWU6IFN0cmluZ30gd2lsbCBiZSBlcXVhbCB0byB7bmFtZTogbmV3IFN0cmluZygpfS5cbiAgICAgICAgLy8vIDwvc3VtbWFyeT5cbiAgICAgICAgLy8vIDxwYXJhbSBuYW1lPVwic3RydWN0dXJlXCI+SGVscHMgSURFIGNvZGUgY29tcGxldGlvbiBieSBrbm93aW5nIHRoZSBtZW1iZXJzIHRoYXQgb2JqZWN0cyBjb250YWluIGFuZCBub3QganVzdCB0aGUgaW5kZXhlcy4gQWxzb1xuICAgICAgICAvLy8ga25vdyB3aGF0IHR5cGUgZWFjaCBtZW1iZXIgaGFzLiBFeGFtcGxlOiB7bmFtZTogU3RyaW5nLCBlbWFpbEFkZHJlc3NlczogW1N0cmluZ10sIHByb3BlcnRpZXM6IHtzaG9lU2l6ZTogTnVtYmVyfX08L3BhcmFtPlxuXG4gICAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgYWJsZSB0byBjb3B5IGdpdmVuIHByb3BlcnRpZXMgaW50byB0aGlzIG9iamVjdC5cbiAgICAgICAgZnVuY3Rpb24gQ2xhc3MocHJvcGVydGllcykge1xuICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPVwicHJvcGVydGllc1wiIHR5cGU9XCJPYmplY3RcIiBvcHRpb25hbD1cInRydWVcIj5Qcm9wZXJ0aWVzIHRvIGluaXRpYWxpemUgb2JqZWN0IHdpdGguXG4gICAgICAgICAgICAvLy8gPC9wYXJhbT5cbiAgICAgICAgICAgIHByb3BlcnRpZXMgPyBleHRlbmQodGhpcywgcHJvcGVydGllcykgOiBmYWtlICYmIGFwcGx5U3RydWN0dXJlKHRoaXMsIHN0cnVjdHVyZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENsYXNzO1xuICAgIH0sXG5cbiAgICBhcHBseVN0cnVjdHVyZTogYXBwbHlTdHJ1Y3R1cmUsXG5cbiAgICBpZ25vcmVUcmFuc2FjdGlvbjogZnVuY3Rpb24gKHNjb3BlRnVuYykge1xuICAgICAgICAvLyBJbiBjYXNlIGNhbGxlciBpcyB3aXRoaW4gYSB0cmFuc2FjdGlvbiBidXQgbmVlZHMgdG8gY3JlYXRlIGEgc2VwYXJhdGUgdHJhbnNhY3Rpb24uXG4gICAgICAgIC8vIEV4YW1wbGUgb2YgdXNhZ2U6XG4gICAgICAgIC8vXG4gICAgICAgIC8vIExldCdzIHNheSB3ZSBoYXZlIGEgbG9nZ2VyIGZ1bmN0aW9uIGluIG91ciBhcHAuIE90aGVyIGFwcGxpY2F0aW9uLWxvZ2ljIHNob3VsZCBiZSB1bmF3YXJlIG9mIHRoZVxuICAgICAgICAvLyBsb2dnZXIgZnVuY3Rpb24gYW5kIG5vdCBuZWVkIHRvIGluY2x1ZGUgdGhlICdsb2dlbnRyaWVzJyB0YWJsZSBpbiBhbGwgdHJhbnNhY3Rpb24gaXQgcGVyZm9ybXMuXG4gICAgICAgIC8vIFRoZSBsb2dnaW5nIHNob3VsZCBhbHdheXMgYmUgZG9uZSBpbiBhIHNlcGFyYXRlIHRyYW5zYWN0aW9uIGFuZCBub3QgYmUgZGVwZW5kYW50IG9uIHRoZSBjdXJyZW50XG4gICAgICAgIC8vIHJ1bm5pbmcgdHJhbnNhY3Rpb24gY29udGV4dC4gVGhlbiB5b3UgY291bGQgdXNlIERleGllLmlnbm9yZVRyYW5zYWN0aW9uKCkgdG8gcnVuIGNvZGUgdGhhdCBzdGFydHMgYSBuZXcgdHJhbnNhY3Rpb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICBEZXhpZS5pZ25vcmVUcmFuc2FjdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gICAgICAgICBkYi5sb2dlbnRyaWVzLmFkZChuZXdMb2dFbnRyeSk7XG4gICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gVW5sZXNzIHVzaW5nIERleGllLmlnbm9yZVRyYW5zYWN0aW9uKCksIHRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIHRyeSB0byByZXVzZSB0aGUgY3VycmVudCB0cmFuc2FjdGlvblxuICAgICAgICAvLyBpbiBjdXJyZW50IFByb21pc2Utc2NvcGUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEFuIGFsdGVybmF0aXZlIHRvIERleGllLmlnbm9yZVRyYW5zYWN0aW9uKCkgd291bGQgYmUgc2V0SW1tZWRpYXRlKCkgb3Igc2V0VGltZW91dCgpLiBUaGUgcmVhc29uIHdlIHN0aWxsIHByb3ZpZGUgYW5cbiAgICAgICAgLy8gQVBJIGZvciB0aGlzIGJlY2F1c2VcbiAgICAgICAgLy8gIDEpIFRoZSBpbnRlbnRpb24gb2Ygd3JpdGluZyB0aGUgc3RhdGVtZW50IGNvdWxkIGJlIHVuY2xlYXIgaWYgdXNpbmcgc2V0SW1tZWRpYXRlKCkgb3Igc2V0VGltZW91dCgpLlxuICAgICAgICAvLyAgMikgc2V0VGltZW91dCgpIHdvdWxkIHdhaXQgdW5uZXNjZXNzYXJ5IHVudGlsIGZpcmluZy4gVGhpcyBpcyBob3dldmVyIG5vdCB0aGUgY2FzZSB3aXRoIHNldEltbWVkaWF0ZSgpLlxuICAgICAgICAvLyAgMykgc2V0SW1tZWRpYXRlKCkgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgRVMgc3RhbmRhcmQuXG4gICAgICAgIC8vICA0KSBZb3UgbWlnaHQgd2FudCB0byBrZWVwIG90aGVyIFBTRCBzdGF0ZSB0aGF0IHdhcyBzZXQgaW4gYSBwYXJlbnQgUFNELCBzdWNoIGFzIFBTRC5sZXRUaHJvdWdoLlxuICAgICAgICByZXR1cm4gUFNELnRyYW5zID8gdXNlUFNEKFBTRC50cmFuc2xlc3MsIHNjb3BlRnVuYykgOiAvLyBVc2UgdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgd2FzIG5vbi10cmFuc2FjdGlvbmFsLlxuICAgICAgICBzY29wZUZ1bmMoKTsgLy8gTm8gbmVlZCB0byBjaGFuZ2Ugc2NvcGUgYmVjYXVzZSB0aGVyZSBpcyBubyBvbmdvaW5nIHRyYW5zYWN0aW9uLlxuICAgIH0sXG5cbiAgICB2aXA6IGZ1bmN0aW9uIChmbikge1xuICAgICAgICAvLyBUbyBiZSB1c2VkIGJ5IHN1YnNjcmliZXJzIHRvIHRoZSBvbigncmVhZHknKSBldmVudC5cbiAgICAgICAgLy8gVGhpcyB3aWxsIGxldCBjYWxsZXIgdGhyb3VnaCB0byBhY2Nlc3MgREIgZXZlbiB3aGVuIGl0IGlzIGJsb2NrZWQgd2hpbGUgdGhlIGRiLnJlYWR5KCkgc3Vic2NyaWJlcnMgYXJlIGZpcmluZy5cbiAgICAgICAgLy8gVGhpcyB3b3VsZCBoYXZlIHdvcmtlZCBhdXRvbWF0aWNhbGx5IGlmIHdlIHdlcmUgY2VydGFpbiB0aGF0IHRoZSBQcm92aWRlciB3YXMgdXNpbmcgRGV4aWUuUHJvbWlzZSBmb3IgYWxsIGFzeW5jcm9uaWMgb3BlcmF0aW9ucy4gVGhlIHByb21pc2UgUFNEXG4gICAgICAgIC8vIGZyb20gdGhlIHByb3ZpZGVyLmNvbm5lY3QoKSBjYWxsIHdvdWxkIHRoZW4gYmUgZGVyaXZlZCBhbGwgdGhlIHdheSB0byB3aGVuIHByb3ZpZGVyIHdvdWxkIGNhbGwgbG9jYWxEYXRhYmFzZS5hcHBseUNoYW5nZXMoKS4gQnV0IHNpbmNlXG4gICAgICAgIC8vIHRoZSBwcm92aWRlciBtb3JlIGxpa2VseSBpcyB1c2luZyBub24tcHJvbWlzZSBhc3luYyBBUElzIG9yIG90aGVyIHRoZW5hYmxlIGltcGxlbWVudGF0aW9ucywgd2UgY2Fubm90IGFzc3VtZSB0aGF0LlxuICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgZm9yIG9uKCdyZWFkeScpIHN1YnNjcmliZXJzIHRoYXQgaXMgcmV0dXJuaW5nIGEgUHJvbWlzZSBmcm9tIHRoZSBldmVudC4gSWYgbm90IHVzaW5nIHZpcCgpXG4gICAgICAgIC8vIHRoZSBkYXRhYmFzZSBjb3VsZCBkZWFkbG9jayBzaW5jZSBpdCB3b250IG9wZW4gdW50aWwgdGhlIHJldHVybmVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGFuZCBhbnkgbm9uLVZJUGVkIG9wZXJhdGlvbiBzdGFydGVkIGJ5XG4gICAgICAgIC8vIHRoZSBjYWxsZXIgd2lsbCBub3QgcmVzb2x2ZSB1bnRpbCBkYXRhYmFzZSBpcyBvcGVuZWQuXG4gICAgICAgIHJldHVybiBuZXdTY29wZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBQU0QubGV0VGhyb3VnaCA9IHRydWU7IC8vIE1ha2Ugc3VyZSB3ZSBhcmUgbGV0IHRocm91Z2ggaWYgc3RpbGwgYmxvY2tpbmcgZGIgZHVlIHRvIG9ucmVhZHkgaXMgZmlyaW5nLlxuICAgICAgICAgICAgcmV0dXJuIGZuKCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBhc3luYzogZnVuY3Rpb24gKGdlbmVyYXRvckZuKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciBydiA9IGF3YWl0SXRlcmF0b3IoZ2VuZXJhdG9yRm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICAgICAgICAgICAgaWYgKCFydiB8fCB0eXBlb2YgcnYudGhlbiAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShydik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ2O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWplY3Rpb24oZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSxcblxuICAgIHNwYXduOiBmdW5jdGlvbiAoZ2VuZXJhdG9yRm4sIGFyZ3MsIHRoaXopIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBydiA9IGF3YWl0SXRlcmF0b3IoZ2VuZXJhdG9yRm4uYXBwbHkodGhpeiwgYXJncyB8fCBbXSkpO1xuICAgICAgICAgICAgaWYgKCFydiB8fCB0eXBlb2YgcnYudGhlbiAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIFByb21pc2UucmVzb2x2ZShydik7XG4gICAgICAgICAgICByZXR1cm4gcnY7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3Rpb24oZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gRGV4aWUuY3VycmVudFRyYW5zYWN0aW9uIHByb3BlcnR5XG4gICAgY3VycmVudFRyYW5zYWN0aW9uOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIFBTRC50cmFucyB8fCBudWxsO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEV4cG9ydCBvdXIgUHJvbWlzZSBpbXBsZW1lbnRhdGlvbiBzaW5jZSBpdCBjYW4gYmUgaGFuZHkgYXMgYSBzdGFuZGFsb25lIFByb21pc2UgaW1wbGVtZW50YXRpb25cbiAgICBQcm9taXNlOiBQcm9taXNlLFxuXG4gICAgLy8gRGV4aWUuZGVidWcgcHJvcHRlcnk6XG4gICAgLy8gRGV4aWUuZGVidWcgPSBmYWxzZVxuICAgIC8vIERleGllLmRlYnVnID0gdHJ1ZVxuICAgIC8vIERleGllLmRlYnVnID0gXCJkZXhpZVwiIC0gZG9uJ3QgaGlkZSBkZXhpZSdzIHN0YWNrIGZyYW1lcy5cbiAgICBkZWJ1Zzoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWJ1ZztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHNldERlYnVnKHZhbHVlLCB2YWx1ZSA9PT0gJ2RleGllJyA/IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gOiBkZXhpZVN0YWNrRnJhbWVGaWx0ZXIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEV4cG9ydCBvdXIgZGVyaXZlL2V4dGVuZC9vdmVycmlkZSBtZXRob2RvbG9neVxuICAgIGRlcml2ZTogZGVyaXZlLFxuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICBvdmVycmlkZTogb3ZlcnJpZGUsXG4gICAgLy8gRXhwb3J0IG91ciBFdmVudHMoKSBmdW5jdGlvbiAtIGNhbiBiZSBoYW5keSBhcyBhIHRvb2xraXRcbiAgICBFdmVudHM6IEV2ZW50cyxcbiAgICBldmVudHM6IHsgZ2V0OiBkZXByZWNhdGVkKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBFdmVudHM7XG4gICAgICAgIH0pIH0sIC8vIEJhY2t3YXJkIGNvbXBhdGlibGUgbG93ZXJjYXNlIHZlcnNpb24uXG4gICAgLy8gVXRpbGl0aWVzXG4gICAgZ2V0QnlLZXlQYXRoOiBnZXRCeUtleVBhdGgsXG4gICAgc2V0QnlLZXlQYXRoOiBzZXRCeUtleVBhdGgsXG4gICAgZGVsQnlLZXlQYXRoOiBkZWxCeUtleVBhdGgsXG4gICAgc2hhbGxvd0Nsb25lOiBzaGFsbG93Q2xvbmUsXG4gICAgZGVlcENsb25lOiBkZWVwQ2xvbmUsXG4gICAgZ2V0T2JqZWN0RGlmZjogZ2V0T2JqZWN0RGlmZixcbiAgICBhc2FwOiBhc2FwLFxuICAgIG1heEtleTogbWF4S2V5LFxuICAgIC8vIEFkZG9uIHJlZ2lzdHJ5XG4gICAgYWRkb25zOiBbXSxcbiAgICAvLyBHbG9iYWwgREIgY29ubmVjdGlvbiBsaXN0XG4gICAgY29ubmVjdGlvbnM6IGNvbm5lY3Rpb25zLFxuXG4gICAgTXVsdGlNb2RpZnlFcnJvcjogZXhjZXB0aW9ucy5Nb2RpZnksIC8vIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgMC45LjguIERlcHJlY2F0ZS5cbiAgICBlcnJuYW1lczogZXJybmFtZXMsXG5cbiAgICAvLyBFeHBvcnQgb3RoZXIgc3RhdGljIGNsYXNzZXNcbiAgICBJbmRleFNwZWM6IEluZGV4U3BlYyxcbiAgICBUYWJsZVNjaGVtYTogVGFibGVTY2hlbWEsXG5cbiAgICAvL1xuICAgIC8vIERlcGVuZGVuY2llc1xuICAgIC8vXG4gICAgLy8gVGhlc2Ugd2lsbCBhdXRvbWF0aWNhbGx5IHdvcmsgaW4gYnJvd3NlcnMgd2l0aCBpbmRleGVkREIgc3VwcG9ydCwgb3Igd2hlcmUgYW4gaW5kZXhlZERCIHBvbHlmaWxsIGhhcyBiZWVuIGluY2x1ZGVkLlxuICAgIC8vXG4gICAgLy8gSW4gbm9kZS5qcywgaG93ZXZlciwgdGhlc2UgcHJvcGVydGllcyBtdXN0IGJlIHNldCBcIm1hbnVhbGx5XCIgYmVmb3JlIGluc3RhbnNpYXRpbmcgYSBuZXcgRGV4aWUoKS5cbiAgICAvLyBGb3Igbm9kZS5qcywgeW91IG5lZWQgdG8gcmVxdWlyZSBpbmRleGVkZGItanMgb3Igc2ltaWxhciBhbmQgdGhlbiBzZXQgdGhlc2UgZGVwcy5cbiAgICAvL1xuICAgIGRlcGVuZGVuY2llczoge1xuICAgICAgICAvLyBSZXF1aXJlZDpcbiAgICAgICAgaW5kZXhlZERCOiBpZGJzaGltLnNoaW1JbmRleGVkREIgfHwgX2dsb2JhbC5pbmRleGVkREIgfHwgX2dsb2JhbC5tb3pJbmRleGVkREIgfHwgX2dsb2JhbC53ZWJraXRJbmRleGVkREIgfHwgX2dsb2JhbC5tc0luZGV4ZWREQixcbiAgICAgICAgSURCS2V5UmFuZ2U6IGlkYnNoaW0uSURCS2V5UmFuZ2UgfHwgX2dsb2JhbC5JREJLZXlSYW5nZSB8fCBfZ2xvYmFsLndlYmtpdElEQktleVJhbmdlXG4gICAgfSxcblxuICAgIC8vIEFQSSBWZXJzaW9uIE51bWJlcjogVHlwZSBOdW1iZXIsIG1ha2Ugc3VyZSB0byBhbHdheXMgc2V0IGEgdmVyc2lvbiBudW1iZXIgdGhhdCBjYW4gYmUgY29tcGFyYWJsZSBjb3JyZWN0bHkuIEV4YW1wbGU6IDAuOSwgMC45MSwgMC45MiwgMS4wLCAxLjAxLCAxLjEsIDEuMiwgMS4yMSwgZXRjLlxuICAgIHNlbVZlcjogREVYSUVfVkVSU0lPTixcbiAgICB2ZXJzaW9uOiBERVhJRV9WRVJTSU9OLnNwbGl0KCcuJykubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChuKTtcbiAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHAsIGMsIGkpIHtcbiAgICAgICAgcmV0dXJuIHAgKyBjIC8gTWF0aC5wb3coMTAsIGkgKiAyKTtcbiAgICB9KSxcbiAgICBmYWtlQXV0b0NvbXBsZXRlOiBmYWtlQXV0b0NvbXBsZXRlLFxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2RmYWhsYW5kZXIvRGV4aWUuanMvaXNzdWVzLzE4NlxuICAgIC8vIHR5cGVzY3JpcHQgY29tcGlsZXIgdHNjIGluIG1vZGUgdHMtLT5lczUgJiBjb21tb25KUywgd2lsbCBleHBlY3QgcmVxdWlyZSgpIHRvIHJldHVyblxuICAgIC8vIHguZGVmYXVsdC4gV29ya2Fyb3VuZDogU2V0IERleGllLmRlZmF1bHQgPSBEZXhpZS5cbiAgICBkZWZhdWx0OiBEZXhpZVxufSk7XG5cbnRyeUNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBPcHRpb25hbCBkZXBlbmRlbmNpZXNcbiAgICAvLyBsb2NhbFN0b3JhZ2VcbiAgICBEZXhpZS5kZXBlbmRlbmNpZXMubG9jYWxTdG9yYWdlID0gKHR5cGVvZiBjaHJvbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY2hyb21lICE9PSBudWxsID8gY2hyb21lLnN0b3JhZ2UgOiB2b2lkIDApICE9IG51bGwgPyBudWxsIDogX2dsb2JhbC5sb2NhbFN0b3JhZ2U7XG59KTtcblxuLy8gTWFwIERPTUVycm9ycyBhbmQgRE9NRXhjZXB0aW9ucyB0byBjb3JyZXNwb25kaW5nIERleGllIGVycm9ycy4gTWF5IGNoYW5nZSBpbiBEZXhpZSB2Mi4wLlxuUHJvbWlzZS5yZWplY3Rpb25NYXBwZXIgPSBtYXBFcnJvcjtcblxuLy8gRm9vbCBJREUgdG8gaW1wcm92ZSBhdXRvY29tcGxldGUuIFRlc3RlZCB3aXRoIFZpc3VhbCBTdHVkaW8gMjAxMyBhbmQgMjAxNS5cbmRvRmFrZUF1dG9Db21wbGV0ZShmdW5jdGlvbiAoKSB7XG4gICAgRGV4aWUuZmFrZUF1dG9Db21wbGV0ZSA9IGZha2VBdXRvQ29tcGxldGUgPSBkb0Zha2VBdXRvQ29tcGxldGU7XG4gICAgRGV4aWUuZmFrZSA9IGZha2UgPSB0cnVlO1xufSk7XG5cbnJldHVybiBEZXhpZTtcblxufSkpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRleGllLmpzLm1hcFxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EsWUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///2\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SandboxType; });\n/* harmony import */ var _SandboxRegistry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);\n/* harmony import */ var _bus_MiniBus__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6);\nfunction _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n\nvar SandboxType = {\n APP: \'app\',\n NORMAL: \'normal\',\n WINDOW: \'window\'\n};\n/**\r\n * @author micaelpedrosa@gmail.com\r\n * Base class to implement external sandbox component\r\n */\n\nvar Sandbox =\n/*#__PURE__*/\nfunction (_MiniBus) {\n _inherits(Sandbox, _MiniBus);\n\n function Sandbox(capabilities) {\n var _this2;\n\n _classCallCheck(this, Sandbox);\n\n _this2 = _possibleConstructorReturn(this, _getPrototypeOf(Sandbox).call(this));\n\n var _this = _assertThisInitialized(_assertThisInitialized(_this2));\n\n if (capabilities) {\n _this.capabilities = capabilities;\n }\n\n return _this2;\n }\n /**\r\n * Deploy an instance of the component into the sandbox.\r\n * @param {string} componentSourceCode Component source code (Hyperty, ProtoStub, etc)\r\n * @param {URL} componentURL Hyperty, ProtoStub, or any other component address.\r\n * @param {Config} configuration Config parameters of the component\r\n * @return {Promise} return deployed if successful, or any other string with an error\r\n */\n\n\n _createClass(Sandbox, [{\n key: "deployComponent",\n value: function deployComponent(componentSourceCode, componentURL, configuration) {\n var _this = this; // let messageFactory = _this.messageFactory;\n\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: deploy message for the internal SandboxRegistry -> _onDeploy\n var deployMessage = {\n type: \'create\',\n from: _SandboxRegistry__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].ExternalDeployAddress,\n to: _SandboxRegistry__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].InternalDeployAddress,\n body: {\n url: componentURL,\n sourceCode: componentSourceCode,\n config: configuration\n }\n }; //send message into the sandbox internals and wait for reply\n\n _this.postMessage(deployMessage, function (reply) {\n if (reply.body.code === 200) {\n //is this response complaint with the spec?\n resolve(\'deployed\');\n } else {\n reject(reply.body.desc);\n }\n });\n });\n }\n /**\r\n * Remove the instance of a previously deployed component.\r\n * @param {URL} componentURL Hyperty, ProtoStub, or any other component address.\r\n * @return {Promise} return undeployed if successful, or any other string with an error\r\n */\n\n }, {\n key: "removeComponent",\n value: function removeComponent(componentURL) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: un-deploy message for the internal SandboxRegistry -> _onRemove\n var removeMessage = {\n type: \'delete\',\n from: _SandboxRegistry__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].ExternalDeployAddress,\n to: _SandboxRegistry__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"].InternalDeployAddress,\n body: {\n url: componentURL\n }\n }; //send message into the sandbox internals and wait for reply\n\n _this.postMessage(removeMessage, function (reply) {\n if (reply.body.code === 200) {\n //is this response complaint with the spec?\n resolve(\'undeployed\');\n } else {\n reject(reply.body.desc);\n }\n });\n });\n }\n /**\r\n * Matches Sandbox capabilities against provided capabilities. Used to check if sandbox provides all required capabilities\r\n * @param {RuntimeCapabilities} constraints set of RuntimeCapabilities to match with.\r\n * @return {boolean} return true if constraints are matched false otherwise\r\n */\n\n }, {\n key: "matches",\n value: function matches(constraints) {\n var _this = this;\n\n var filtered = Object.keys(constraints).filter(function (key) {\n return !(_this.capabilities[key] && _this.capabilities[key] === constraints[key]);\n });\n\n if (filtered.length === 0) {\n return true;\n } else {\n return !constraints[filtered];\n }\n }\n }]);\n\n return Sandbox;\n}(_bus_MiniBus__WEBPACK_IMPORTED_MODULE_1__[/* default */ "a"]);\n\n/* harmony default export */ __webpack_exports__["b"] = (Sandbox);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy9zYW5kYm94L1NhbmRib3guanM/NzU2MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcbmltcG9ydCBTYW5kYm94UmVnaXN0cnkgZnJvbSAnLi9TYW5kYm94UmVnaXN0cnknO1xyXG5pbXBvcnQgTWluaUJ1cyBmcm9tICcuLi9idXMvTWluaUJ1cyc7XHJcblxyXG5cclxuZXhwb3J0IGxldCBTYW5kYm94VHlwZSA9IHtBUFA6ICdhcHAnLCBOT1JNQUw6ICdub3JtYWwnLCBXSU5ET1c6ICd3aW5kb3cnfTtcclxuXHJcbi8qKlxyXG4gKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXHJcbiAqIEJhc2UgY2xhc3MgdG8gaW1wbGVtZW50IGV4dGVybmFsIHNhbmRib3ggY29tcG9uZW50XHJcbiAqL1xyXG5jbGFzcyBTYW5kYm94IGV4dGVuZHMgTWluaUJ1cyB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNhcGFiaWxpdGllcykge1xyXG5cclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoY2FwYWJpbGl0aWVzKSAgICAgIHsgX3RoaXMuY2FwYWJpbGl0aWVzID0gY2FwYWJpbGl0aWVzOyB9XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlcGxveSBhbiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGludG8gdGhlIHNhbmRib3guXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSBjb21wb25lbnRTb3VyY2VDb2RlIENvbXBvbmVudCBzb3VyY2UgY29kZSAoSHlwZXJ0eSwgUHJvdG9TdHViLCBldGMpXHJcbiAgICogQHBhcmFtICB7VVJMfSBjb21wb25lbnRVUkwgSHlwZXJ0eSwgUHJvdG9TdHViLCBvciBhbnkgb3RoZXIgY29tcG9uZW50IGFkZHJlc3MuXHJcbiAgICogQHBhcmFtICB7Q29uZmlnfSBjb25maWd1cmF0aW9uIENvbmZpZyBwYXJhbWV0ZXJzIG9mIHRoZSBjb21wb25lbnRcclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IHJldHVybiBkZXBsb3llZCBpZiBzdWNjZXNzZnVsLCBvciBhbnkgb3RoZXIgc3RyaW5nIHdpdGggYW4gZXJyb3JcclxuICAgKi9cclxuICBkZXBsb3lDb21wb25lbnQoY29tcG9uZW50U291cmNlQ29kZSwgY29tcG9uZW50VVJMLCBjb25maWd1cmF0aW9uKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvLyBsZXQgbWVzc2FnZUZhY3RvcnkgPSBfdGhpcy5tZXNzYWdlRmFjdG9yeTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAvL0ZMT1ctT1VUOiBkZXBsb3kgbWVzc2FnZSBmb3IgdGhlIGludGVybmFsIFNhbmRib3hSZWdpc3RyeSAtPiBfb25EZXBsb3lcclxuICAgICAgbGV0IGRlcGxveU1lc3NhZ2UgPSB7XHJcbiAgICAgICAgdHlwZTogJ2NyZWF0ZScsIGZyb206IFNhbmRib3hSZWdpc3RyeS5FeHRlcm5hbERlcGxveUFkZHJlc3MsIHRvOiBTYW5kYm94UmVnaXN0cnkuSW50ZXJuYWxEZXBsb3lBZGRyZXNzLFxyXG4gICAgICAgIGJvZHk6IHsgdXJsOiBjb21wb25lbnRVUkwsIHNvdXJjZUNvZGU6IGNvbXBvbmVudFNvdXJjZUNvZGUsIGNvbmZpZzogY29uZmlndXJhdGlvbiB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvL3NlbmQgbWVzc2FnZSBpbnRvIHRoZSBzYW5kYm94IGludGVybmFscyBhbmQgd2FpdCBmb3IgcmVwbHlcclxuICAgICAgX3RoaXMucG9zdE1lc3NhZ2UoZGVwbG95TWVzc2FnZSwgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAvL2lzIHRoaXMgcmVzcG9uc2UgY29tcGxhaW50IHdpdGggdGhlIHNwZWM/XHJcbiAgICAgICAgICByZXNvbHZlKCdkZXBsb3llZCcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QocmVwbHkuYm9keS5kZXNjKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdGhlIGluc3RhbmNlIG9mIGEgcHJldmlvdXNseSBkZXBsb3llZCBjb21wb25lbnQuXHJcbiAgICogQHBhcmFtICB7VVJMfSBjb21wb25lbnRVUkwgSHlwZXJ0eSwgUHJvdG9TdHViLCBvciBhbnkgb3RoZXIgY29tcG9uZW50IGFkZHJlc3MuXHJcbiAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSByZXR1cm4gdW5kZXBsb3llZCBpZiBzdWNjZXNzZnVsLCBvciBhbnkgb3RoZXIgc3RyaW5nIHdpdGggYW4gZXJyb3JcclxuICAgKi9cclxuICByZW1vdmVDb21wb25lbnQoY29tcG9uZW50VVJMKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIC8vRkxPVy1PVVQ6IHVuLWRlcGxveSBtZXNzYWdlIGZvciB0aGUgaW50ZXJuYWwgU2FuZGJveFJlZ2lzdHJ5IC0+IF9vblJlbW92ZVxyXG4gICAgICBsZXQgcmVtb3ZlTWVzc2FnZSA9IHtcclxuICAgICAgICB0eXBlOiAnZGVsZXRlJywgZnJvbTogU2FuZGJveFJlZ2lzdHJ5LkV4dGVybmFsRGVwbG95QWRkcmVzcywgdG86IFNhbmRib3hSZWdpc3RyeS5JbnRlcm5hbERlcGxveUFkZHJlc3MsXHJcbiAgICAgICAgYm9keTogeyB1cmw6IGNvbXBvbmVudFVSTCB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvL3NlbmQgbWVzc2FnZSBpbnRvIHRoZSBzYW5kYm94IGludGVybmFscyBhbmQgd2FpdCBmb3IgcmVwbHlcclxuICAgICAgX3RoaXMucG9zdE1lc3NhZ2UocmVtb3ZlTWVzc2FnZSwgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAvL2lzIHRoaXMgcmVzcG9uc2UgY29tcGxhaW50IHdpdGggdGhlIHNwZWM/XHJcbiAgICAgICAgICByZXNvbHZlKCd1bmRlcGxveWVkJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmRlc2MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogTWF0Y2hlcyBTYW5kYm94IGNhcGFiaWxpdGllcyBhZ2FpbnN0IHByb3ZpZGVkIGNhcGFiaWxpdGllcy4gVXNlZCB0byBjaGVjayBpZiBzYW5kYm94IHByb3ZpZGVzIGFsbCByZXF1aXJlZCBjYXBhYmlsaXRpZXNcclxuICAqIEBwYXJhbSAge1J1bnRpbWVDYXBhYmlsaXRpZXN9IGNvbnN0cmFpbnRzIHNldCBvZiBSdW50aW1lQ2FwYWJpbGl0aWVzIHRvIG1hdGNoIHdpdGguXHJcbiAgKiBAcmV0dXJuIHtib29sZWFufSByZXR1cm4gdHJ1ZSBpZiBjb25zdHJhaW50cyBhcmUgbWF0Y2hlZCBmYWxzZSBvdGhlcndpc2VcclxuICAgKi9cclxuXHJcbiAgbWF0Y2hlcyhjb25zdHJhaW50cykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgZmlsdGVyZWQgPSBPYmplY3Qua2V5cyhjb25zdHJhaW50cykuZmlsdGVyKChrZXkpID0+IHtcclxuICAgICAgcmV0dXJuICEoX3RoaXMuY2FwYWJpbGl0aWVzW2tleV0gJiYgX3RoaXMuY2FwYWJpbGl0aWVzW2tleV0gPT09IGNvbnN0cmFpbnRzW2tleV0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkgICAgICB7IHJldHVybiB0cnVlOyB9ICAgIGVsc2UgICAgICB7IHJldHVybiAhKGNvbnN0cmFpbnRzW2ZpbHRlcmVkXSk7IH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTYW5kYm94O1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7Ozs7O0FBSUE7Ozs7O0FBRUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFQQTtBQVNBO0FBRUE7Ozs7Ozs7Ozs7O0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Ozs7QUF0RkE7QUFDQTtBQXlGQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///3\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var _SandboxFactory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(12);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * @author micaelpedrosa@gmail.com\r\n * Base class to implement internal deploy manager of components.\r\n */\n\n/**\r\n * @author micaelpedrosa@gmail.com\r\n * Internal component registry of all sandboxes.\r\n * Process internal request's for component deploy.\r\n */\n\nvar SandboxRegistry =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _components: \r\n */\n function SandboxRegistry(bus) {\n _classCallCheck(this, SandboxRegistry);\n\n var _this = this;\n\n _this._bus = bus;\n _this._factory = new _SandboxFactory__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"](bus);\n _this._components = {};\n bus.addListener(SandboxRegistry.InternalDeployAddress, function (msg) {\n console.log('SandboxRegistry-RCV: ', msg); // let responseMsg = {\n // id: msg.id, type: 'response', from: SandboxRegistry.InternalDeployAddress, to: SandboxRegistry.ExternalDeployAddress\n // };\n\n switch (msg.type) {\n case 'create':\n _this._onDeploy(msg);\n\n break;\n\n case 'delete':\n _this._onRemove(msg);\n\n break;\n }\n });\n }\n\n _createClass(SandboxRegistry, [{\n key: \"_responseMsg\",\n value: function _responseMsg(msg, code, value) {\n var _this = this; // let messageFactory = _this.messageFactory;\n //FLOW-OUT: generic response message to external Sandbox (deploy and un-deploy responses)\n\n\n var responseMsg = {\n id: msg.id,\n type: 'response',\n from: SandboxRegistry.InternalDeployAddress,\n to: SandboxRegistry.ExternalDeployAddress\n }; // Chanege the origin message, because the response;\n // msg.from = SandboxRegistry.InternalDeployAddress;\n // msg.to = SandboxRegistry.ExternalDeployAddress;\n\n var body = {};\n if (code) body.code = code;\n if (value) body.desc = value;\n responseMsg.body = body; // return messageFactory.createResponse(msg, code, value);\n\n return responseMsg;\n } //FLOW-IN: message from the runtime core Sandbox -> deployComponent\n\n }, {\n key: \"_onDeploy\",\n value: function _onDeploy(msg) {\n var _this = this;\n\n var config = msg.body.config;\n var componentURL = msg.body.url;\n var sourceCode = msg.body.sourceCode;\n var responseCode;\n var responseDesc;\n\n if (!_this._components.hasOwnProperty(componentURL)) {\n try {\n console.log('SandboxRegistry-onDeploy: ', msg);\n _this._components[componentURL] = _this._create(componentURL, sourceCode, config, _this._factory);\n responseCode = 200;\n } catch (error) {\n responseCode = 500;\n responseDesc = error;\n }\n } else {\n responseCode = 500;\n responseDesc = 'Instance ' + componentURL + ' already exist!';\n }\n\n var responseMsg = _this._responseMsg(msg, responseCode, responseDesc);\n\n _this._bus.postMessage(responseMsg);\n } //FLOW-IN: message from the runtime core Sandbox -> removeComponent\n\n }, {\n key: \"_onRemove\",\n value: function _onRemove(msg) {\n var _this = this;\n\n var componentURL = msg.body.url;\n var responseCode;\n var responseDesc;\n\n if (_this._components.hasOwnProperty(componentURL)) {\n //remove component from the pool and all listeners\n delete _this._components[componentURL];\n\n _this._bus.removeAllListenersOf(componentURL);\n\n responseCode = 200;\n } else {\n responseCode = 500;\n responseDesc = 'Instance ' + componentURL + ' doesn\\'t exist!';\n }\n\n var responseMsg = _this._responseMsg(msg, responseCode, responseDesc);\n\n _this._bus.postMessage(responseMsg);\n }\n /**\r\n * This method should be implemented by the internal sandbox code.\r\n * @param {ComponentURL} url URL used for the instance\r\n * @param {string} sourceCode Code of the component\r\n * @param {Config} config Configuration parameters\r\n * @return {Object} Returns instance of the component or throw an error \"throw 'error message'\"\r\n */\n\n }, {\n key: \"_create\",\n value: function _create(url, sourceCode, config, factory) {//implementation specific\n\n /* example code:\r\n eval(sourceCode);\r\n return activate(url, _this._bus, config);\r\n */\n }\n }, {\n key: \"components\",\n get: function get() {\n return this._components;\n }\n }]);\n\n return SandboxRegistry;\n}();\n\nSandboxRegistry.ExternalDeployAddress = 'hyperty-runtime://sandbox/external';\nSandboxRegistry.InternalDeployAddress = 'hyperty-runtime://sandbox/internal';\n/* harmony default export */ __webpack_exports__[\"a\"] = (SandboxRegistry);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy9zYW5kYm94L1NhbmRib3hSZWdpc3RyeS5qcz84YmU0Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuLyoqXHJcbiAqIEBhdXRob3IgbWljYWVscGVkcm9zYUBnbWFpbC5jb21cclxuICogQmFzZSBjbGFzcyB0byBpbXBsZW1lbnQgaW50ZXJuYWwgZGVwbG95IG1hbmFnZXIgb2YgY29tcG9uZW50cy5cclxuICovXHJcbmltcG9ydCBTYW5kYm94RmFjdG9yeSBmcm9tICcuL1NhbmRib3hGYWN0b3J5JztcclxuXHJcbi8qKlxyXG4gKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXHJcbiAqIEludGVybmFsIGNvbXBvbmVudCByZWdpc3RyeSBvZiBhbGwgc2FuZGJveGVzLlxyXG4gKiBQcm9jZXNzIGludGVybmFsIHJlcXVlc3QncyBmb3IgY29tcG9uZW50IGRlcGxveS5cclxuICovXHJcbmNsYXNzIFNhbmRib3hSZWdpc3RyeSB7XHJcbiAgLyogcHJpdmF0ZVxyXG4gIF9jb21wb25lbnRzOiA8dXJsOiBpbnN0YW5jZT5cclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3RvcihidXMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX2J1cyA9IGJ1cztcclxuICAgIF90aGlzLl9mYWN0b3J5ID0gbmV3IFNhbmRib3hGYWN0b3J5KGJ1cyk7XHJcbiAgICBfdGhpcy5fY29tcG9uZW50cyA9IHt9O1xyXG5cclxuICAgIGJ1cy5hZGRMaXN0ZW5lcihTYW5kYm94UmVnaXN0cnkuSW50ZXJuYWxEZXBsb3lBZGRyZXNzLCAobXNnKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdTYW5kYm94UmVnaXN0cnktUkNWOiAnLCBtc2cpO1xyXG4gICAgICAvLyBsZXQgcmVzcG9uc2VNc2cgPSB7XHJcbiAgICAgIC8vICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogU2FuZGJveFJlZ2lzdHJ5LkludGVybmFsRGVwbG95QWRkcmVzcywgdG86IFNhbmRib3hSZWdpc3RyeS5FeHRlcm5hbERlcGxveUFkZHJlc3NcclxuICAgICAgLy8gfTtcclxuXHJcbiAgICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcclxuICAgICAgICBjYXNlICdjcmVhdGUnOiBfdGhpcy5fb25EZXBsb3kobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZGVsZXRlJzogX3RoaXMuX29uUmVtb3ZlKG1zZyk7IGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBjb21wb25lbnRzKCkgeyByZXR1cm4gdGhpcy5fY29tcG9uZW50czsgfVxyXG5cclxuICBfcmVzcG9uc2VNc2cobXNnLCBjb2RlLCB2YWx1ZSkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy8gbGV0IG1lc3NhZ2VGYWN0b3J5ID0gX3RoaXMubWVzc2FnZUZhY3Rvcnk7XHJcblxyXG4gICAgLy9GTE9XLU9VVDogZ2VuZXJpYyByZXNwb25zZSBtZXNzYWdlIHRvIGV4dGVybmFsIFNhbmRib3ggKGRlcGxveSBhbmQgdW4tZGVwbG95IHJlc3BvbnNlcylcclxuICAgIGxldCByZXNwb25zZU1zZyA9IHtcclxuICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogU2FuZGJveFJlZ2lzdHJ5LkludGVybmFsRGVwbG95QWRkcmVzcywgdG86IFNhbmRib3hSZWdpc3RyeS5FeHRlcm5hbERlcGxveUFkZHJlc3NcclxuICAgIH07XHJcblxyXG4gICAgLy8gQ2hhbmVnZSB0aGUgb3JpZ2luIG1lc3NhZ2UsIGJlY2F1c2UgdGhlIHJlc3BvbnNlO1xyXG4gICAgLy8gbXNnLmZyb20gPSBTYW5kYm94UmVnaXN0cnkuSW50ZXJuYWxEZXBsb3lBZGRyZXNzO1xyXG4gICAgLy8gbXNnLnRvID0gU2FuZGJveFJlZ2lzdHJ5LkV4dGVybmFsRGVwbG95QWRkcmVzcztcclxuXHJcbiAgICBsZXQgYm9keSA9IHt9O1xyXG4gICAgaWYgKGNvZGUpIGJvZHkuY29kZSA9IGNvZGU7XHJcbiAgICBpZiAodmFsdWUpIGJvZHkuZGVzYyA9IHZhbHVlO1xyXG5cclxuICAgIHJlc3BvbnNlTXNnLmJvZHkgPSBib2R5O1xyXG5cclxuICAgIC8vIHJldHVybiBtZXNzYWdlRmFjdG9yeS5jcmVhdGVSZXNwb25zZShtc2csIGNvZGUsIHZhbHVlKTtcclxuICAgIHJldHVybiByZXNwb25zZU1zZztcclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSBmcm9tIHRoZSBydW50aW1lIGNvcmUgU2FuZGJveCAtPiBkZXBsb3lDb21wb25lbnRcclxuICBfb25EZXBsb3kobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGNvbmZpZyA9IG1zZy5ib2R5LmNvbmZpZztcclxuICAgIGxldCBjb21wb25lbnRVUkwgPSBtc2cuYm9keS51cmw7XHJcbiAgICBsZXQgc291cmNlQ29kZSA9IG1zZy5ib2R5LnNvdXJjZUNvZGU7XHJcbiAgICBsZXQgcmVzcG9uc2VDb2RlO1xyXG4gICAgbGV0IHJlc3BvbnNlRGVzYztcclxuXHJcbiAgICBpZiAoIV90aGlzLl9jb21wb25lbnRzLmhhc093blByb3BlcnR5KGNvbXBvbmVudFVSTCkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgY29uc29sZS5sb2coJ1NhbmRib3hSZWdpc3RyeS1vbkRlcGxveTogJywgbXNnKTtcclxuICAgICAgX3RoaXMuX2NvbXBvbmVudHNbY29tcG9uZW50VVJMXSA9IF90aGlzLl9jcmVhdGUoY29tcG9uZW50VVJMLCBzb3VyY2VDb2RlLCBjb25maWcsIF90aGlzLl9mYWN0b3J5ICk7XHJcbiAgICAgICAgcmVzcG9uc2VDb2RlID0gMjAwO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIHJlc3BvbnNlQ29kZSA9IDUwMDtcclxuICAgICAgICByZXNwb25zZURlc2MgPSBlcnJvcjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVzcG9uc2VDb2RlID0gNTAwO1xyXG4gICAgICByZXNwb25zZURlc2MgPSAnSW5zdGFuY2UgJyArIGNvbXBvbmVudFVSTCArICcgYWxyZWFkeSBleGlzdCEnO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNwb25zZU1zZyA9IF90aGlzLl9yZXNwb25zZU1zZyhtc2csIHJlc3BvbnNlQ29kZSwgcmVzcG9uc2VEZXNjKTtcclxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2VNc2cpO1xyXG4gIH1cclxuXHJcbiAgLy9GTE9XLUlOOiBtZXNzYWdlIGZyb20gdGhlIHJ1bnRpbWUgY29yZSBTYW5kYm94IC0+IHJlbW92ZUNvbXBvbmVudFxyXG4gIF9vblJlbW92ZShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgY29tcG9uZW50VVJMID0gbXNnLmJvZHkudXJsO1xyXG4gICAgbGV0IHJlc3BvbnNlQ29kZTtcclxuICAgIGxldCByZXNwb25zZURlc2M7XHJcblxyXG4gICAgaWYgKF90aGlzLl9jb21wb25lbnRzLmhhc093blByb3BlcnR5KGNvbXBvbmVudFVSTCkpIHtcclxuICAgICAgLy9yZW1vdmUgY29tcG9uZW50IGZyb20gdGhlIHBvb2wgYW5kIGFsbCBsaXN0ZW5lcnNcclxuICAgICAgZGVsZXRlIF90aGlzLl9jb21wb25lbnRzW2NvbXBvbmVudFVSTF07XHJcbiAgICAgIF90aGlzLl9idXMucmVtb3ZlQWxsTGlzdGVuZXJzT2YoY29tcG9uZW50VVJMKTtcclxuICAgICAgcmVzcG9uc2VDb2RlID0gMjAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVzcG9uc2VDb2RlID0gNTAwO1xyXG4gICAgICByZXNwb25zZURlc2MgPSAnSW5zdGFuY2UgJyArIGNvbXBvbmVudFVSTCArICcgZG9lc25cXCd0IGV4aXN0ISc7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHJlc3BvbnNlTXNnID0gX3RoaXMuX3Jlc3BvbnNlTXNnKG1zZywgcmVzcG9uc2VDb2RlLCByZXNwb25zZURlc2MpO1xyXG5cclxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2VNc2cpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBpbnRlcm5hbCBzYW5kYm94IGNvZGUuXHJcbiAgICogQHBhcmFtICB7Q29tcG9uZW50VVJMfSB1cmwgVVJMIHVzZWQgZm9yIHRoZSBpbnN0YW5jZVxyXG4gICAqIEBwYXJhbSAge3N0cmluZ30gc291cmNlQ29kZSBDb2RlIG9mIHRoZSBjb21wb25lbnRcclxuICAgKiBAcGFyYW0gIHtDb25maWd9IGNvbmZpZyBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnNcclxuICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCBvciB0aHJvdyBhbiBlcnJvciBcInRocm93ICdlcnJvciBtZXNzYWdlJ1wiXHJcbiAgICovXHJcbiAgX2NyZWF0ZSh1cmwsIHNvdXJjZUNvZGUsIGNvbmZpZywgZmFjdG9yeSkge1xyXG4gICAgLy9pbXBsZW1lbnRhdGlvbiBzcGVjaWZpY1xyXG4gICAgLyogZXhhbXBsZSBjb2RlOlxyXG4gICAgICBldmFsKHNvdXJjZUNvZGUpO1xyXG4gICAgICByZXR1cm4gYWN0aXZhdGUodXJsLCBfdGhpcy5fYnVzLCBjb25maWcpO1xyXG4gICAgKi9cclxuICB9XHJcbn1cclxuXHJcblNhbmRib3hSZWdpc3RyeS5FeHRlcm5hbERlcGxveUFkZHJlc3MgPSAnaHlwZXJ0eS1ydW50aW1lOi8vc2FuZGJveC9leHRlcm5hbCc7XHJcblNhbmRib3hSZWdpc3RyeS5JbnRlcm5hbERlcGxveUFkZHJlc3MgPSAnaHlwZXJ0eS1ydW50aW1lOi8vc2FuZGJveC9pbnRlcm5hbCc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTYW5kYm94UmVnaXN0cnk7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTs7OztBQUlBO0FBRUE7Ozs7OztBQUtBOzs7QUFDQTs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUZBO0FBSUE7QUFDQTtBQUNBOzs7QUFHQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTs7OztBQUlBOzs7QUF6RkE7QUFBQTtBQUFBOzs7Ozs7QUE0RkE7QUFDQTtBQUVBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///4\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(0);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar log = loglevel__WEBPACK_IMPORTED_MODULE_0__["getLogger"](\'RegistrationStatus\');\n\n/**\r\n* The RegistrationStatus lib allows to monitor registration status of an Hyperty or Data Object\r\n*\r\n*/\n\nvar RegistrationStatus =\n/*#__PURE__*/\nfunction () {\n /**\r\n * @param {URL} url URL address of the entity to be monitored\r\n * @param {URL} runtimeURL the current URL of the Runtime Instance used\r\n * @param {HypertyURL} owner the URL of the Hyperty instance that is using this lib\r\n * @param {MiniBus} owner the URL of the Hyperty instance that is using this lib\r\n *\r\n */\n function RegistrationStatus(url, runtimeURL, owner, msgBus) {\n _classCallCheck(this, RegistrationStatus);\n\n this._registryObjectURL = url;\n this._runtimeURL = runtimeURL;\n this._domain = Object(_utils_utils__WEBPACK_IMPORTED_MODULE_1__[/* divideURL */ "k"])(runtimeURL).domain;\n this._discoveredObjectURL = owner;\n this._messageBus = msgBus;\n this._subscriptionSet = false;\n this._subscribers = {\n live: {},\n disconnected: {}\n };\n }\n\n _createClass(RegistrationStatus, [{\n key: "onLive",\n value: function onLive(subscriber, callback) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (!_this._subscriptionSet) {\n _this._subscribe().then(function () {\n _this._subscribers.live[subscriber] = callback;\n resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n _this._subscribers.live[subscriber] = callback;\n resolve();\n }\n });\n }\n }, {\n key: "onDisconnected",\n value: function onDisconnected(subscriber, callback) {\n var _this2 = this;\n\n return new Promise(function (resolve, reject) {\n if (!_this2._subscriptionSet) {\n _this2._subscribe().then(function () {\n _this2._subscribers.disconnected[subscriber] = callback;\n resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n _this2._subscribers.disconnected[subscriber] = callback;\n resolve();\n }\n });\n }\n }, {\n key: "_subscribe",\n value: function _subscribe() {\n var _this3 = this;\n\n var msg = {\n type: \'subscribe\',\n from: this._discoveredObjectURL,\n to: this._runtimeURL + \'/subscriptions\',\n body: {\n resources: [this._registryObjectURL + \'/registration\']\n }\n };\n return new Promise(function (resolve, reject) {\n _this3._messageBus.postMessage(msg, function (reply) {\n log.log("[DiscoveredObject.subscribe] ".concat(_this3._registryObjectURL, " rcved reply "), reply);\n\n if (reply.body.code === 200) {\n _this3._generateListener(_this3._registryObjectURL + \'/registration\');\n\n _this3._subscriptionSet = true;\n resolve();\n } else {\n log.error(\'Error subscribing \', _this3._registryObjectURL);\n reject(\'Error subscribing \' + _this3._registryObjectURL);\n }\n });\n });\n }\n }, {\n key: "_generateListener",\n value: function _generateListener(notificationURL) {\n var _this4 = this;\n\n this._messageBus.addListener(notificationURL, function (msg) {\n log.log("[DiscoveredObject.notification] ".concat(_this4._registryObjectURL, ": "), msg);\n\n _this4._processNotification(msg);\n });\n }\n }, {\n key: "_processNotification",\n value: function _processNotification(msg) {\n var _this5 = this;\n\n var status = msg.body.value;\n setTimeout(function () {\n // Hack to give time for onLive Hyperties to get ready. To be removed when Hyperty State machaine is implemented\n Object.keys(_this5._subscribers[status]).forEach(function (subscriber) {\n return _this5._subscribers[status][subscriber]();\n });\n }, 5000);\n }\n }, {\n key: "_unsubscribe",\n value: function _unsubscribe() {\n var _this6 = this;\n\n var msg = {\n type: \'unsubscribe\',\n from: this._discoveredObjectURL,\n to: this._runtimeURL + \'/subscriptions\',\n body: {\n resource: this._registryObjectURL + \'/registration\'\n }\n };\n return new Promise(function (resolve, reject) {\n _this6._messageBus.postMessage(msg, function (reply) {\n log.log("[DiscoveredObject.unsubscribe] ".concat(_this6._registryObjectURL, " rcved reply "), reply);\n\n if (reply.body.code === 200) {\n resolve();\n } else {\n log.error(\'Error unsubscribing \', _this6._registryObjectURL);\n reject(\'Error unsubscribing \' + _this6._registryObjectURL);\n }\n });\n });\n }\n }, {\n key: "unsubscribeLive",\n value: function unsubscribeLive(subscriber) {\n var _this7 = this;\n\n return new Promise(function (resolve, reject) {\n if (subscriber in _this7._subscribers.live) {\n //TODO: unsubscribe outside this condition\n delete _this7._subscribers.live[subscriber];\n }\n\n if (_this7._areSubscriptionsEmpty()) {\n _this7._unsubscribe().then(function () {\n return resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n resolve();\n }\n /* } else {\r\n reject(`${subscriber} doesn\'t subscribe onLive for ${this._registryObjectURL}`);\r\n }*/\n\n });\n }\n }, {\n key: "unsubscribeDisconnected",\n value: function unsubscribeDisconnected(subscriber) {\n var _this8 = this;\n\n return new Promise(function (resolve, reject) {\n if (subscriber in _this8._subscribers.disconnected) {\n delete _this8._subscribers.disconnected[subscriber];\n\n if (_this8._areSubscriptionsEmpty()) {\n _this8._unsubscribe().then(function () {\n return resolve();\n }).catch(function (err) {\n return reject(err);\n });\n } else {\n resolve();\n }\n } else {\n reject("".concat(subscriber, " doesn\'t subscribe onDisconnected for ").concat(_this8._registryObjectURL));\n }\n });\n }\n }, {\n key: "_areSubscriptionsEmpty",\n value: function _areSubscriptionsEmpty() {\n return Object.keys(this._subscribers.live).length === 0 && Object.keys(this._subscribers.disconnected).length === 0;\n }\n }]);\n\n return RegistrationStatus;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (RegistrationStatus);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy9kaXNjb3ZlcnkvUmVnaXN0cmF0aW9uU3RhdHVzLmpzPzdjODUiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignUmVnaXN0cmF0aW9uU3RhdHVzJyk7XHJcblxyXG5pbXBvcnQgeyBkaXZpZGVVUkwgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKipcclxuKiBUaGUgUmVnaXN0cmF0aW9uU3RhdHVzIGxpYiBhbGxvd3MgdG8gbW9uaXRvciByZWdpc3RyYXRpb24gc3RhdHVzIG9mIGFuIEh5cGVydHkgb3IgRGF0YSBPYmplY3RcclxuKlxyXG4qL1xyXG5jbGFzcyBSZWdpc3RyYXRpb25TdGF0dXMge1xyXG5cclxuICAvKipcclxuICAqIEBwYXJhbSB7VVJMfSB1cmwgVVJMIGFkZHJlc3Mgb2YgdGhlIGVudGl0eSB0byBiZSBtb25pdG9yZWRcclxuICAqIEBwYXJhbSB7VVJMfSBydW50aW1lVVJMIHRoZSBjdXJyZW50IFVSTCBvZiB0aGUgUnVudGltZSBJbnN0YW5jZSB1c2VkXHJcbiAgKiBAcGFyYW0ge0h5cGVydHlVUkx9IG93bmVyIHRoZSBVUkwgb2YgdGhlIEh5cGVydHkgaW5zdGFuY2UgdGhhdCBpcyB1c2luZyB0aGlzIGxpYlxyXG4gICogQHBhcmFtIHtNaW5pQnVzfSBvd25lciB0aGUgVVJMIG9mIHRoZSBIeXBlcnR5IGluc3RhbmNlIHRoYXQgaXMgdXNpbmcgdGhpcyBsaWJcclxuICAqXHJcbiAgKi9cclxuXHJcbiAgY29uc3RydWN0b3IodXJsLCBydW50aW1lVVJMLCBvd25lciwgbXNnQnVzKSB7XHJcbiAgICB0aGlzLl9yZWdpc3RyeU9iamVjdFVSTCA9IHVybDtcclxuICAgIHRoaXMuX3J1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xyXG4gICAgdGhpcy5fZG9tYWluID0gZGl2aWRlVVJMKHJ1bnRpbWVVUkwpLmRvbWFpbjtcclxuICAgIHRoaXMuX2Rpc2NvdmVyZWRPYmplY3RVUkwgPSBvd25lcjtcclxuICAgIHRoaXMuX21lc3NhZ2VCdXMgPSBtc2dCdXM7XHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25TZXQgPSBmYWxzZTtcclxuICAgIHRoaXMuX3N1YnNjcmliZXJzID0ge1xyXG4gICAgICBsaXZlOiB7fSxcclxuICAgICAgZGlzY29ubmVjdGVkOiB7fVxyXG4gICAgfTtcclxuICB9XHJcblxyXG5cclxuICBvbkxpdmUoc3Vic2NyaWJlciwgY2FsbGJhY2spIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgaWYgKCF0aGlzLl9zdWJzY3JpcHRpb25TZXQpIHtcclxuICAgICAgICB0aGlzLl9zdWJzY3JpYmUoKVxyXG4gICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuX3N1YnNjcmliZXJzLmxpdmVbc3Vic2NyaWJlcl0gPSBjYWxsYmFjaztcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiByZWplY3QoZXJyKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlcnMubGl2ZVtzdWJzY3JpYmVyXSA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkRpc2Nvbm5lY3RlZChzdWJzY3JpYmVyLCBjYWxsYmFjaykge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuX3N1YnNjcmlwdGlvblNldCkge1xyXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZSgpXHJcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fc3Vic2NyaWJlcnMuZGlzY29ubmVjdGVkW3N1YnNjcmliZXJdID0gY2FsbGJhY2s7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGVycikgPT4gcmVqZWN0KGVycikpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZXJzLmRpc2Nvbm5lY3RlZFtzdWJzY3JpYmVyXSA9IGNhbGxiYWNrO1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfc3Vic2NyaWJlKCkge1xyXG5cclxuICAgIGNvbnN0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3N1YnNjcmliZScsXHJcbiAgICAgIGZyb206IHRoaXMuX2Rpc2NvdmVyZWRPYmplY3RVUkwsXHJcbiAgICAgIHRvOiB0aGlzLl9ydW50aW1lVVJMICsgJy9zdWJzY3JpcHRpb25zJyxcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlczogW3RoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMICsgJy9yZWdpc3RyYXRpb24nXVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICB0aGlzLl9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZyhgW0Rpc2NvdmVyZWRPYmplY3Quc3Vic2NyaWJlXSAke3RoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMfSByY3ZlZCByZXBseSBgLCByZXBseSk7XHJcblxyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5fZ2VuZXJhdGVMaXN0ZW5lcih0aGlzLl9yZWdpc3RyeU9iamVjdFVSTCArICcvcmVnaXN0cmF0aW9uJyk7XHJcbiAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25TZXQgPSB0cnVlO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsb2cuZXJyb3IoJ0Vycm9yIHN1YnNjcmliaW5nICcsIHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMKTtcclxuICAgICAgICAgIHJlamVjdCgnRXJyb3Igc3Vic2NyaWJpbmcgJyArIHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfZ2VuZXJhdGVMaXN0ZW5lcihub3RpZmljYXRpb25VUkwpIHtcclxuXHJcbiAgICB0aGlzLl9tZXNzYWdlQnVzLmFkZExpc3RlbmVyKG5vdGlmaWNhdGlvblVSTCwgKG1zZykgPT4ge1xyXG4gICAgICBsb2cubG9nKGBbRGlzY292ZXJlZE9iamVjdC5ub3RpZmljYXRpb25dICR7dGhpcy5fcmVnaXN0cnlPYmplY3RVUkx9OiBgLCBtc2cpO1xyXG4gICAgICB0aGlzLl9wcm9jZXNzTm90aWZpY2F0aW9uKG1zZyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9wcm9jZXNzTm90aWZpY2F0aW9uKG1zZykge1xyXG4gICAgY29uc3Qgc3RhdHVzID0gbXNnLmJvZHkudmFsdWU7XHJcblxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcblxyXG4gICAgICAvLyBIYWNrIHRvIGdpdmUgdGltZSBmb3Igb25MaXZlIEh5cGVydGllcyB0byBnZXQgcmVhZHkuIFRvIGJlIHJlbW92ZWQgd2hlbiBIeXBlcnR5IFN0YXRlIG1hY2hhaW5lIGlzIGltcGxlbWVudGVkXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3N1YnNjcmliZXJzW3N0YXR1c10pLmZvckVhY2goXHJcbiAgICAgICAgc3Vic2NyaWJlciA9PiB0aGlzLl9zdWJzY3JpYmVyc1tzdGF0dXNdW3N1YnNjcmliZXJdKClcclxuICAgICAgKTtcclxuXHJcbiAgICB9LCA1MDAwKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgX3Vuc3Vic2NyaWJlKCkge1xyXG5cclxuICAgIGNvbnN0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3Vuc3Vic2NyaWJlJyxcclxuICAgICAgZnJvbTogdGhpcy5fZGlzY292ZXJlZE9iamVjdFVSTCxcclxuICAgICAgdG86IHRoaXMuX3J1bnRpbWVVUkwgKyAnL3N1YnNjcmlwdGlvbnMnLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6IHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMICsgJy9yZWdpc3RyYXRpb24nXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKGBbRGlzY292ZXJlZE9iamVjdC51bnN1YnNjcmliZV0gJHt0aGlzLl9yZWdpc3RyeU9iamVjdFVSTH0gcmN2ZWQgcmVwbHkgYCwgcmVwbHkpO1xyXG5cclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB1bnN1YnNjcmliaW5nICcsIHRoaXMuX3JlZ2lzdHJ5T2JqZWN0VVJMKTtcclxuICAgICAgICAgIHJlamVjdCgnRXJyb3IgdW5zdWJzY3JpYmluZyAnICsgdGhpcy5fcmVnaXN0cnlPYmplY3RVUkwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVuc3Vic2NyaWJlTGl2ZShzdWJzY3JpYmVyKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgaWYgKHN1YnNjcmliZXIgaW4gdGhpcy5fc3Vic2NyaWJlcnMubGl2ZSkge1xyXG5cclxuICAgICAgICAgIC8vVE9ETzogdW5zdWJzY3JpYmUgb3V0c2lkZSB0aGlzIGNvbmRpdGlvblxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpYmVycy5saXZlW3N1YnNjcmliZXJdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5fYXJlU3Vic2NyaXB0aW9uc0VtcHR5KCkpIHtcclxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpXHJcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHJlc29sdmUoKSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnIpID0+IHJlamVjdChlcnIpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KGAke3N1YnNjcmliZXJ9IGRvZXNuJ3Qgc3Vic2NyaWJlIG9uTGl2ZSBmb3IgJHt0aGlzLl9yZWdpc3RyeU9iamVjdFVSTH1gKTtcclxuICAgICAgICB9Ki9cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdW5zdWJzY3JpYmVEaXNjb25uZWN0ZWQoc3Vic2NyaWJlcikge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGlmIChzdWJzY3JpYmVyIGluIHRoaXMuX3N1YnNjcmliZXJzLmRpc2Nvbm5lY3RlZCkge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpYmVycy5kaXNjb25uZWN0ZWRbc3Vic2NyaWJlcl07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9hcmVTdWJzY3JpcHRpb25zRW1wdHkoKSkge1xyXG4gICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoKVxyXG4gICAgICAgICAgLnRoZW4oKCkgPT4gcmVzb2x2ZSgpKVxyXG4gICAgICAgICAgLmNhdGNoKChlcnIpID0+IHJlamVjdChlcnIpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWplY3QoYCR7c3Vic2NyaWJlcn0gZG9lc24ndCBzdWJzY3JpYmUgb25EaXNjb25uZWN0ZWQgZm9yICR7dGhpcy5fcmVnaXN0cnlPYmplY3RVUkx9YCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2FyZVN1YnNjcmlwdGlvbnNFbXB0eSgpIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9zdWJzY3JpYmVycy5saXZlKS5sZW5ndGggPT09IDBcclxuICAgICAgJiYgT2JqZWN0LmtleXModGhpcy5fc3Vic2NyaWJlcnMuZGlzY29ubmVjdGVkKS5sZW5ndGggPT09IDA7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVnaXN0cmF0aW9uU3RhdHVzO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7O0FBSUE7OztBQUVBOzs7Ozs7O0FBUUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFFQTs7O0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFJQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///5\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var _Bus__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7);\nfunction _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author micaelpedrosa@gmail.com\r\n* Message BUS Interface is an extension of the Bus\r\n* It is used mainly in the internal sandbox routing.\r\n*/\n\nvar MiniBus =\n/*#__PURE__*/\nfunction (_Bus) {\n _inherits(MiniBus, _Bus);\n\n function MiniBus() {\n _classCallCheck(this, MiniBus);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(MiniBus).call(this));\n }\n /**\r\n * Post a message for routing. Message is routed directly to the external routing _onPostMessage.\r\n * @param {Message} inMsg JSON with mandatory Message structure {id, type, from, to}\r\n * @param {Callback} responseCallback Optional callback if a response is expected from the request. A response will be always sent, even if it is a "Timeout".\r\n * @return {number} the Message id\r\n */\n\n\n _createClass(MiniBus, [{\n key: "postMessage",\n value: function postMessage(inMsg, responseCallback, timeout) {\n var _this = this;\n\n _this._genId(inMsg);\n\n _this._responseCallback(inMsg, responseCallback, timeout); //always send to external (to core MessageBus)\n\n\n _this._onPostMessage(inMsg);\n\n return inMsg.id;\n } //internal method used when a message is received by an external routing system\n\n }, {\n key: "_onMessage",\n value: function _onMessage(msg) {\n var _this = this;\n\n if (!_this._onResponse(msg)) {\n var itemList = _this._subscriptions[msg.to];\n\n if (itemList) {\n _this._publishOn(itemList, msg);\n\n if (!msg.to.startsWith(\'hyperty\')) {\n _this._publishOnDefault(msg);\n }\n } else {\n _this._publishOnDefault(msg);\n }\n }\n }\n }]);\n\n return MiniBus;\n}(_Bus__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"]);\n\n/* harmony default export */ __webpack_exports__["a"] = (MiniBus);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNi5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy9idXMvTWluaUJ1cy5qcz9kOWFkIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuaW1wb3J0IEJ1cyBmcm9tICcuL0J1cyc7XHJcblxyXG4vKipcclxuKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXHJcbiogTWVzc2FnZSBCVVMgSW50ZXJmYWNlIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgQnVzXHJcbiogSXQgaXMgdXNlZCBtYWlubHkgaW4gdGhlIGludGVybmFsIHNhbmRib3ggcm91dGluZy5cclxuKi9cclxuY2xhc3MgTWluaUJ1cyBleHRlbmRzIEJ1cyB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBvc3QgYSBtZXNzYWdlIGZvciByb3V0aW5nLiBNZXNzYWdlIGlzIHJvdXRlZCBkaXJlY3RseSB0byB0aGUgZXh0ZXJuYWwgcm91dGluZyBfb25Qb3N0TWVzc2FnZS5cclxuICAgKiBAcGFyYW0gIHtNZXNzYWdlfSBpbk1zZyAgICAgICAgICAgIEpTT04gd2l0aCBtYW5kYXRvcnkgTWVzc2FnZSBzdHJ1Y3R1cmUge2lkLCB0eXBlLCBmcm9tLCB0b31cclxuICAgKiBAcGFyYW0gIHtDYWxsYmFja30gcmVzcG9uc2VDYWxsYmFjayBPcHRpb25hbCBjYWxsYmFjayBpZiBhIHJlc3BvbnNlIGlzIGV4cGVjdGVkIGZyb20gdGhlIHJlcXVlc3QuIEEgcmVzcG9uc2Ugd2lsbCBiZSBhbHdheXMgc2VudCwgZXZlbiBpZiBpdCBpcyBhIFwiVGltZW91dFwiLlxyXG4gICAqIEByZXR1cm4ge251bWJlcn0gICAgICAgICAgICAgICAgICB0aGUgTWVzc2FnZSBpZFxyXG4gICAqL1xyXG4gIHBvc3RNZXNzYWdlKGluTXNnLCByZXNwb25zZUNhbGxiYWNrLCB0aW1lb3V0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9nZW5JZChpbk1zZyk7XHJcbiAgICBfdGhpcy5fcmVzcG9uc2VDYWxsYmFjayhpbk1zZywgcmVzcG9uc2VDYWxsYmFjaywgdGltZW91dCk7XHJcblxyXG4gICAgLy9hbHdheXMgc2VuZCB0byBleHRlcm5hbCAodG8gY29yZSBNZXNzYWdlQnVzKVxyXG4gICAgX3RoaXMuX29uUG9zdE1lc3NhZ2UoaW5Nc2cpO1xyXG5cclxuICAgIHJldHVybiBpbk1zZy5pZDtcclxuICB9XHJcblxyXG4gIC8vaW50ZXJuYWwgbWV0aG9kIHVzZWQgd2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYnkgYW4gZXh0ZXJuYWwgcm91dGluZyBzeXN0ZW1cclxuICBfb25NZXNzYWdlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoIV90aGlzLl9vblJlc3BvbnNlKG1zZykpIHtcclxuICAgICAgbGV0IGl0ZW1MaXN0ID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbbXNnLnRvXTtcclxuICAgICAgaWYgKGl0ZW1MaXN0KSB7XHJcbiAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbihpdGVtTGlzdCwgbXNnKTtcclxuICAgICAgICBpZiAoIW1zZy50by5zdGFydHNXaXRoKCdoeXBlcnR5JykpIHtcclxuICAgICAgICAgIF90aGlzLl9wdWJsaXNoT25EZWZhdWx0KG1zZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aGlzLl9wdWJsaXNoT25EZWZhdWx0KG1zZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBNaW5pQnVzO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTtBQUVBOzs7Ozs7QUFLQTs7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQXZDQTtBQUNBO0FBMENBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///6\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log system\n\nvar log = loglevel__WEBPACK_IMPORTED_MODULE_0__["getLogger"](\'Bus\');\n/**\r\n* @author micaelpedrosa@gmail.com\r\n* Minimal interface and implementation to send and receive messages. It can be reused in many type of components.\r\n* Components that need a message system should receive this class as a dependency or extend it.\r\n* Extensions should implement the following private methods: _onPostMessage and _registerExternalListener\r\n*/\n\nvar Bus =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _msgId: number;\r\n _subscriptions: \r\n _responseTimeOut: number\r\n _responseCallbacks: void>\r\n */\n function Bus() {\n _classCallCheck(this, Bus);\n\n var _this = this;\n\n _this._msgId = 0;\n _this._subscriptions = {};\n _this._responseTimeOut = 15000; //default to 3s\n\n _this._responseCallbacks = {};\n\n _this._registerExternalListener();\n }\n /**\r\n * Register listener to receive message when "msg.to === url".\r\n * Special url "*" for default listener is accepted to intercept all messages.\r\n * @param {URL} url Address to intercept, tha is in the message "to"\r\n * @param {Listener} listener listener\r\n * @return {MsgListener} instance of MsgListener\r\n */\n\n\n _createClass(Bus, [{\n key: "addListener",\n value: function addListener(url, listener) {\n var _this = this;\n\n var item = new MsgListener(_this._subscriptions, url, listener);\n var itemList = _this._subscriptions[url];\n\n if (!itemList) {\n itemList = [];\n _this._subscriptions[url] = itemList;\n }\n\n itemList.push(item);\n return item;\n }\n /**\r\n * Manually add a response listener. Only one listener per message ID should exist.\r\n * ATENTION, there is no timeout for this listener.\r\n * The listener should be removed with a removeResponseListener, failing to do this will result in a unreleased memory problem.\r\n * @param {URL} url Origin address of the message sent, "msg.from".\r\n * @param {number} msgId Message ID that is returned from the postMessage.\r\n * @param {Function} responseListener Callback function for the response\r\n */\n\n }, {\n key: "addResponseListener",\n value: function addResponseListener(url, msgId, responseListener) {\n this._responseCallbacks[url + msgId] = responseListener;\n }\n /**\r\n * Remove the response listener.\r\n * @param {URL} url Origin address of the message sent, "msg.from".\r\n * @param {number} msgId Message ID that is returned from the postMessage\r\n */\n\n }, {\n key: "removeResponseListener",\n value: function removeResponseListener(url, msgId) {\n delete this._responseCallbacks[url + msgId];\n }\n /**\r\n * Remove all existent listeners for the URL\r\n * @param {URL} url Address registered\r\n */\n\n }, {\n key: "removeAllListenersOf",\n value: function removeAllListenersOf(url) {\n delete this._subscriptions[url];\n }\n /**\r\n * Helper method to bind listeners (in both directions) into other MiniBus target.\r\n * @param {URL} outUrl Outbound URL, register listener for url in direction "this -> target"\r\n * @param {URL} inUrl Inbound URL, register listener for url in direction "target -> this"\r\n * @param {MiniBus} target The other target MiniBus\r\n * @return {Bound} an object that contains the properties [thisListener, targetListener] and the unbind method.\r\n */\n\n }, {\n key: "bind",\n value: function bind(outUrl, inUrl, target) {\n var _this2 = this;\n\n var _this = this;\n\n var thisListn = _this.addListener(outUrl, function (msg) {\n target.postMessage(msg);\n });\n\n var targetListn = target.addListener(inUrl, function (msg) {\n _this.postMessage(msg);\n });\n return {\n thisListener: thisListn,\n targetListener: targetListn,\n unbind: function unbind() {\n _this2.thisListener.remove();\n\n _this2.targetListener.remove();\n }\n };\n } //publish on default listeners\n\n }, {\n key: "_publishOnDefault",\n value: function _publishOnDefault(msg) {\n //is there any "*" (default) listeners?\n var itemList = this._subscriptions[\'*\'];\n\n if (itemList) {\n this._publishOn(itemList, msg);\n }\n } //publish on a subscription list.\n\n }, {\n key: "_publishOn",\n value: function _publishOn(itemList, msg) {\n itemList.forEach(function (sub) {\n sub._callback(msg);\n });\n }\n }, {\n key: "_responseCallback",\n value: function _responseCallback(inMsg, responseCallback) {\n var timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var _this = this; //automatic management of response handlers\n\n\n if (responseCallback) {\n var responseId = inMsg.from + inMsg.id;\n _this._responseCallbacks[responseId] = responseCallback;\n\n if (timeout) {\n setTimeout(function () {\n var responseFun = _this._responseCallbacks[responseId];\n delete _this._responseCallbacks[responseId];\n\n if (responseFun) {\n var errorMsg = {\n id: inMsg.id,\n type: \'response\',\n body: {\n code: 408,\n desc: \'Response timeout!\',\n value: inMsg\n }\n };\n responseFun(errorMsg);\n }\n }, _this._responseTimeOut);\n }\n }\n } //TODO: provisional responses should reset timeout\n\n }, {\n key: "_onResponse",\n value: function _onResponse(msg) {\n var _this = this;\n\n if (msg.type === \'response\') {\n var responseId = msg.to + msg.id;\n var responseFun = _this._responseCallbacks[responseId];\n\n if (msg.body.code >= 200) {\n //if it\'s a provisional response, don\'t delete response listener\n delete _this._responseCallbacks[responseId];\n }\n\n if (responseFun) {\n responseFun(msg);\n return true;\n }\n }\n\n return false;\n } //receive messages from external interface\n\n }, {\n key: "_onMessage",\n value: function _onMessage(msg) {\n var _this = this;\n\n if (!_this._onResponse(msg)) {\n var itemList = _this._subscriptions[msg.to];\n\n if (itemList) {\n _this._publishOn(itemList, msg);\n } else {\n _this._publishOnDefault(msg);\n }\n }\n }\n }, {\n key: "_genId",\n value: function _genId(inMsg) {\n //TODO: how do we manage message ID\'s? Should it be a global runtime counter, or per URL address?\n //Global counter will not work, because there will be multiple MiniBus instances!\n //Per URL, can be a lot of data to maintain!\n //Maybe a counter per MiniBus instance. This is the assumed solution for now.\n if (!inMsg.id || inMsg.id === 0) {\n this._msgId++;\n inMsg.id = this._msgId;\n }\n }\n /**\r\n * Send messages to local listeners, or if not exists to external listeners.\r\n * It\'s has an optional mechanism for automatic management of response handlers.\r\n * The response handler will be unregistered after receiving the response, or after response timeout (default to 3s).\r\n * @param {Message} msg Message to send. Message ID is automatically added to the message.\r\n * @param {Function} responseCallback Optional parameter, if the developer what\'s automatic response management.\r\n * @return {number} Returns the message ID, in case it should be needed for manual management of the response handler.\r\n */\n\n }, {\n key: "postMessage",\n value: function postMessage(inMsg, responseCallback) {}\n /**\r\n * Function to post messages with a number of retries in case timeouts occur.\r\n * @param {Message} msg Message to send. Message ID is automatically added to the message.\r\n * @param {Function} responseCallback Optional parameter, if the developer what\'s automatic response management.\r\n * @param {integer} retries number of retries when timeouts occur\r\n * @return {boolean} message delivery result;\r\n */\n\n }, {\n key: "postMessageWithRetries",\n value: function postMessageWithRetries(msg, retries, callback) {\n var _this = this;\n\n var retry = 0; //let timeout = true;\n\n var sendMsg = function sendMsg() {\n return new Promise(function (resolve, reject) {\n _this.postMessage(msg, function (reply) {\n if (reply.body.code === 408 || reply.body.code === 500) reject();else {\n log.info(\'[Bus.postMessageWithRetries] msg delivered: \', msg);\n callback(reply);\n resolve();\n }\n });\n });\n };\n\n var tryAgain = function tryAgain() {\n sendMsg().then(function () {\n //timeout = false;\n return;\n }, function () {\n log.warn("[Bus.postMessageWithRetries] Message Bounced (retry ".concat(retry, "): \'"), msg);\n\n if (retry++ < retries) {\n tryAgain(); // setTimeout(() => { tryAgain(); }, 1000);\n } else {\n var error = "[Error] Message Bounced (delivery attempts ".concat(retries, "): \'");\n throw new Error(error + msg);\n }\n });\n };\n\n tryAgain();\n }\n /**\r\n * Not public available, used by the class extension implementation, to process messages from the public "postMessage" without a registered listener.\r\n * Used to send the message to an external interface, like a WebWorker, IFrame, etc.\r\n * @param {Message.Message} msg Message\r\n */\n\n }, {\n key: "_onPostMessage",\n value: function _onPostMessage(msg) {}\n /*implementation will send message to external system*/\n\n /**\r\n * Not public available, used by the class extension implementation, to process all messages that enter the MiniBus from an external interface, like a WebWorker, IFrame, etc.\r\n * This method is called one time in the constructor to register external listeners.\r\n * The implementation will probably call the "_onMessage" method to publish in the local listeners.\r\n * DO NOT call "postMessage", there is a danger that the message enters in a cycle!\r\n */\n\n }, {\n key: "_registerExternalListener",\n value: function _registerExternalListener() {\n /*implementation will register external listener and call "this._onMessage(msg)" */\n }\n }]);\n\n return Bus;\n}();\n\nvar MsgListener =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _subscriptions: ;\r\n _url: string;\r\n _callback: (msg) => void;\r\n */\n function MsgListener(subscriptions, url, callback) {\n _classCallCheck(this, MsgListener);\n\n var _this = this;\n\n _this._subscriptions = subscriptions;\n _this._url = url;\n _this._callback = callback;\n }\n\n _createClass(MsgListener, [{\n key: "remove",\n\n /**\r\n * Remove this listener from the Bus\r\n */\n value: function remove() {\n var _this = this;\n\n var subs = _this._subscriptions[_this._url];\n\n if (subs) {\n var index = subs.indexOf(_this);\n subs.splice(index, 1); //if there are no listeners, remove the subscription entirely.\n\n if (subs.length === 0) {\n delete _this._subscriptions[_this._url];\n }\n }\n }\n }, {\n key: "url",\n get: function get() {\n return this._url;\n }\n }]);\n\n return MsgListener;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (Bus);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy9idXMvQnVzLmpzPzJlZjIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gTG9nIHN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignQnVzJyk7XHJcblxyXG4vKipcclxuKiBAYXV0aG9yIG1pY2FlbHBlZHJvc2FAZ21haWwuY29tXHJcbiogTWluaW1hbCBpbnRlcmZhY2UgYW5kIGltcGxlbWVudGF0aW9uIHRvIHNlbmQgYW5kIHJlY2VpdmUgbWVzc2FnZXMuIEl0IGNhbiBiZSByZXVzZWQgaW4gbWFueSB0eXBlIG9mIGNvbXBvbmVudHMuXHJcbiogQ29tcG9uZW50cyB0aGF0IG5lZWQgYSBtZXNzYWdlIHN5c3RlbSBzaG91bGQgcmVjZWl2ZSB0aGlzIGNsYXNzIGFzIGEgZGVwZW5kZW5jeSBvciBleHRlbmQgaXQuXHJcbiogRXh0ZW5zaW9ucyBzaG91bGQgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcHJpdmF0ZSBtZXRob2RzOiBfb25Qb3N0TWVzc2FnZSBhbmQgX3JlZ2lzdGVyRXh0ZXJuYWxMaXN0ZW5lclxyXG4qL1xyXG5jbGFzcyBCdXMge1xyXG4gIC8qIHByaXZhdGVcclxuICBfbXNnSWQ6IG51bWJlcjtcclxuICBfc3Vic2NyaXB0aW9uczogPHVybDogTXNnTGlzdGVuZXJbXT5cclxuXHJcbiAgX3Jlc3BvbnNlVGltZU91dDogbnVtYmVyXHJcbiAgX3Jlc3BvbnNlQ2FsbGJhY2tzOiA8dXJsK2lkOiAobXNnKSA9PiB2b2lkPlxyXG5cclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fbXNnSWQgPSAwO1xyXG4gICAgX3RoaXMuX3N1YnNjcmlwdGlvbnMgPSB7fTtcclxuXHJcbiAgICBfdGhpcy5fcmVzcG9uc2VUaW1lT3V0ID0gMTUwMDA7IC8vZGVmYXVsdCB0byAzc1xyXG4gICAgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzID0ge307XHJcblxyXG4gICAgX3RoaXMuX3JlZ2lzdGVyRXh0ZXJuYWxMaXN0ZW5lcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBSZWdpc3RlciBsaXN0ZW5lciB0byByZWNlaXZlIG1lc3NhZ2Ugd2hlbiBcIm1zZy50byA9PT0gdXJsXCIuXHJcbiAgKiBTcGVjaWFsIHVybCBcIipcIiBmb3IgZGVmYXVsdCBsaXN0ZW5lciBpcyBhY2NlcHRlZCB0byBpbnRlcmNlcHQgYWxsIG1lc3NhZ2VzLlxyXG4gICogQHBhcmFtIHtVUkx9IHVybCBBZGRyZXNzIHRvIGludGVyY2VwdCwgdGhhIGlzIGluIHRoZSBtZXNzYWdlIFwidG9cIlxyXG4gICogQHBhcmFtIHtMaXN0ZW5lcn0gbGlzdGVuZXIgbGlzdGVuZXJcclxuICAqIEByZXR1cm4ge01zZ0xpc3RlbmVyfSBpbnN0YW5jZSBvZiBNc2dMaXN0ZW5lclxyXG4gICovXHJcbiAgYWRkTGlzdGVuZXIodXJsLCBsaXN0ZW5lcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgaXRlbSA9IG5ldyBNc2dMaXN0ZW5lcihfdGhpcy5fc3Vic2NyaXB0aW9ucywgdXJsLCBsaXN0ZW5lcik7XHJcbiAgICBsZXQgaXRlbUxpc3QgPSBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1cmxdO1xyXG4gICAgaWYgKCFpdGVtTGlzdCkge1xyXG4gICAgICBpdGVtTGlzdCA9IFtdO1xyXG4gICAgICBfdGhpcy5fc3Vic2NyaXB0aW9uc1t1cmxdID0gaXRlbUxpc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaXRlbUxpc3QucHVzaChpdGVtKTtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFudWFsbHkgYWRkIGEgcmVzcG9uc2UgbGlzdGVuZXIuIE9ubHkgb25lIGxpc3RlbmVyIHBlciBtZXNzYWdlIElEIHNob3VsZCBleGlzdC5cclxuICAgKiBBVEVOVElPTiwgdGhlcmUgaXMgbm8gdGltZW91dCBmb3IgdGhpcyBsaXN0ZW5lci5cclxuICAgKiBUaGUgbGlzdGVuZXIgc2hvdWxkIGJlIHJlbW92ZWQgd2l0aCBhIHJlbW92ZVJlc3BvbnNlTGlzdGVuZXIsIGZhaWxpbmcgdG8gZG8gdGhpcyB3aWxsIHJlc3VsdCBpbiBhIHVucmVsZWFzZWQgbWVtb3J5IHByb2JsZW0uXHJcbiAgICogQHBhcmFtIHtVUkx9IHVybCBPcmlnaW4gYWRkcmVzcyBvZiB0aGUgbWVzc2FnZSBzZW50LCBcIm1zZy5mcm9tXCIuXHJcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1zZ0lkIE1lc3NhZ2UgSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIHRoZSBwb3N0TWVzc2FnZS5cclxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSByZXNwb25zZUxpc3RlbmVyIENhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgcmVzcG9uc2VcclxuICAgKi9cclxuICBhZGRSZXNwb25zZUxpc3RlbmVyKHVybCwgbXNnSWQsIHJlc3BvbnNlTGlzdGVuZXIpIHtcclxuICAgIHRoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3VybCArIG1zZ0lkXSA9IHJlc3BvbnNlTGlzdGVuZXI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdGhlIHJlc3BvbnNlIGxpc3RlbmVyLlxyXG4gICAqIEBwYXJhbSB7VVJMfSB1cmwgT3JpZ2luIGFkZHJlc3Mgb2YgdGhlIG1lc3NhZ2Ugc2VudCwgXCJtc2cuZnJvbVwiLlxyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtc2dJZCAgTWVzc2FnZSBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gdGhlIHBvc3RNZXNzYWdlXHJcbiAgICovXHJcbiAgcmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcih1cmwsIG1zZ0lkKSB7XHJcbiAgICBkZWxldGUgdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbdXJsICsgbXNnSWRdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIGFsbCBleGlzdGVudCBsaXN0ZW5lcnMgZm9yIHRoZSBVUkxcclxuICAgKiBAcGFyYW0gIHtVUkx9IHVybCBBZGRyZXNzIHJlZ2lzdGVyZWRcclxuICAgKi9cclxuICByZW1vdmVBbGxMaXN0ZW5lcnNPZih1cmwpIHtcclxuICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpcHRpb25zW3VybF07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIZWxwZXIgbWV0aG9kIHRvIGJpbmQgbGlzdGVuZXJzIChpbiBib3RoIGRpcmVjdGlvbnMpIGludG8gb3RoZXIgTWluaUJ1cyB0YXJnZXQuXHJcbiAgICogQHBhcmFtICB7VVJMfSBvdXRVcmwgT3V0Ym91bmQgVVJMLCByZWdpc3RlciBsaXN0ZW5lciBmb3IgdXJsIGluIGRpcmVjdGlvbiBcInRoaXMgLT4gdGFyZ2V0XCJcclxuICAgKiBAcGFyYW0gIHtVUkx9IGluVXJsIEluYm91bmQgVVJMLCByZWdpc3RlciBsaXN0ZW5lciBmb3IgdXJsIGluIGRpcmVjdGlvbiBcInRhcmdldCAtPiB0aGlzXCJcclxuICAgKiBAcGFyYW0gIHtNaW5pQnVzfSB0YXJnZXQgVGhlIG90aGVyIHRhcmdldCBNaW5pQnVzXHJcbiAgICogQHJldHVybiB7Qm91bmR9IGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIFt0aGlzTGlzdGVuZXIsIHRhcmdldExpc3RlbmVyXSBhbmQgdGhlIHVuYmluZCBtZXRob2QuXHJcbiAgICovXHJcbiAgYmluZChvdXRVcmwsIGluVXJsLCB0YXJnZXQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IHRoaXNMaXN0biA9IF90aGlzLmFkZExpc3RlbmVyKG91dFVybCwgKG1zZykgPT4ge1xyXG4gICAgICB0YXJnZXQucG9zdE1lc3NhZ2UobXNnKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCB0YXJnZXRMaXN0biA9IHRhcmdldC5hZGRMaXN0ZW5lcihpblVybCwgKG1zZykgPT4ge1xyXG4gICAgICBfdGhpcy5wb3N0TWVzc2FnZShtc2cpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGhpc0xpc3RlbmVyOiB0aGlzTGlzdG4sXHJcbiAgICAgIHRhcmdldExpc3RlbmVyOiB0YXJnZXRMaXN0bixcclxuICAgICAgdW5iaW5kOiAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50aGlzTGlzdGVuZXIucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy50YXJnZXRMaXN0ZW5lci5yZW1vdmUoKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8vcHVibGlzaCBvbiBkZWZhdWx0IGxpc3RlbmVyc1xyXG4gIF9wdWJsaXNoT25EZWZhdWx0KG1zZykge1xyXG4gICAgLy9pcyB0aGVyZSBhbnkgXCIqXCIgKGRlZmF1bHQpIGxpc3RlbmVycz9cclxuICAgIGxldCBpdGVtTGlzdCA9IHRoaXMuX3N1YnNjcmlwdGlvbnNbJyonXTtcclxuICAgIGlmIChpdGVtTGlzdCkge1xyXG4gICAgICB0aGlzLl9wdWJsaXNoT24oaXRlbUxpc3QsIG1zZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL3B1Ymxpc2ggb24gYSBzdWJzY3JpcHRpb24gbGlzdC5cclxuICBfcHVibGlzaE9uKGl0ZW1MaXN0LCBtc2cpIHtcclxuICAgIGl0ZW1MaXN0LmZvckVhY2goKHN1YikgPT4ge1xyXG4gICAgICBzdWIuX2NhbGxiYWNrKG1zZyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9yZXNwb25zZUNhbGxiYWNrKGluTXNnLCByZXNwb25zZUNhbGxiYWNrLCB0aW1lb3V0ID0gdHJ1ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL2F1dG9tYXRpYyBtYW5hZ2VtZW50IG9mIHJlc3BvbnNlIGhhbmRsZXJzXHJcbiAgICBpZiAocmVzcG9uc2VDYWxsYmFjaykge1xyXG4gICAgICBsZXQgcmVzcG9uc2VJZCA9IGluTXNnLmZyb20gKyBpbk1zZy5pZDtcclxuICAgICAgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdID0gcmVzcG9uc2VDYWxsYmFjaztcclxuXHJcbiAgICAgIGlmICh0aW1lb3V0KSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICBsZXQgcmVzcG9uc2VGdW4gPSBfdGhpcy5fcmVzcG9uc2VDYWxsYmFja3NbcmVzcG9uc2VJZF07XHJcbiAgICAgICAgICBkZWxldGUgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdO1xyXG5cclxuICAgICAgICAgIGlmIChyZXNwb25zZUZ1bikge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3JNc2cgPSB7XHJcbiAgICAgICAgICAgICAgaWQ6IGluTXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLFxyXG4gICAgICAgICAgICAgIGJvZHk6IHsgY29kZTogNDA4LCBkZXNjOiAnUmVzcG9uc2UgdGltZW91dCEnLCB2YWx1ZTogaW5Nc2cgfVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgcmVzcG9uc2VGdW4oZXJyb3JNc2cpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIF90aGlzLl9yZXNwb25zZVRpbWVPdXQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbi8vVE9ETzogcHJvdmlzaW9uYWwgcmVzcG9uc2VzIHNob3VsZCByZXNldCB0aW1lb3V0XHJcbiAgX29uUmVzcG9uc2UobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmIChtc2cudHlwZSA9PT0gJ3Jlc3BvbnNlJykge1xyXG4gICAgICBsZXQgcmVzcG9uc2VJZCA9IG1zZy50byArIG1zZy5pZDtcclxuICAgICAgbGV0IHJlc3BvbnNlRnVuID0gX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdO1xyXG5cclxuICAgICAgaWYgKG1zZy5ib2R5LmNvZGUgPj0gMjAwKSB7IC8vaWYgaXQncyBhIHByb3Zpc2lvbmFsIHJlc3BvbnNlLCBkb24ndCBkZWxldGUgcmVzcG9uc2UgbGlzdGVuZXJcclxuICAgICAgICBkZWxldGUgX3RoaXMuX3Jlc3BvbnNlQ2FsbGJhY2tzW3Jlc3BvbnNlSWRdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVzcG9uc2VGdW4pIHtcclxuICAgICAgICByZXNwb25zZUZ1bihtc2cpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvL3JlY2VpdmUgbWVzc2FnZXMgZnJvbSBleHRlcm5hbCBpbnRlcmZhY2VcclxuICBfb25NZXNzYWdlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoIV90aGlzLl9vblJlc3BvbnNlKG1zZykpIHtcclxuICAgICAgbGV0IGl0ZW1MaXN0ID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbbXNnLnRvXTtcclxuICAgICAgaWYgKGl0ZW1MaXN0KSB7XHJcbiAgICAgICAgX3RoaXMuX3B1Ymxpc2hPbihpdGVtTGlzdCwgbXNnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBfdGhpcy5fcHVibGlzaE9uRGVmYXVsdChtc2cpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfZ2VuSWQoaW5Nc2cpIHtcclxuICAgIC8vVE9ETzogaG93IGRvIHdlIG1hbmFnZSBtZXNzYWdlIElEJ3M/IFNob3VsZCBpdCBiZSBhIGdsb2JhbCBydW50aW1lIGNvdW50ZXIsIG9yIHBlciBVUkwgYWRkcmVzcz9cclxuICAgIC8vR2xvYmFsIGNvdW50ZXIgd2lsbCBub3Qgd29yaywgYmVjYXVzZSB0aGVyZSB3aWxsIGJlIG11bHRpcGxlIE1pbmlCdXMgaW5zdGFuY2VzIVxyXG4gICAgLy9QZXIgVVJMLCBjYW4gYmUgYSBsb3Qgb2YgZGF0YSB0byBtYWludGFpbiFcclxuICAgIC8vTWF5YmUgYSBjb3VudGVyIHBlciBNaW5pQnVzIGluc3RhbmNlLiBUaGlzIGlzIHRoZSBhc3N1bWVkIHNvbHV0aW9uIGZvciBub3cuXHJcbiAgICBpZiAoIWluTXNnLmlkIHx8IGluTXNnLmlkID09PSAwKSB7XHJcbiAgICAgIHRoaXMuX21zZ0lkKys7XHJcbiAgICAgIGluTXNnLmlkID0gdGhpcy5fbXNnSWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNlbmQgbWVzc2FnZXMgdG8gbG9jYWwgbGlzdGVuZXJzLCBvciBpZiBub3QgZXhpc3RzIHRvIGV4dGVybmFsIGxpc3RlbmVycy5cclxuICAqIEl0J3MgaGFzIGFuIG9wdGlvbmFsIG1lY2hhbmlzbSBmb3IgYXV0b21hdGljIG1hbmFnZW1lbnQgb2YgcmVzcG9uc2UgaGFuZGxlcnMuXHJcbiAgKiBUaGUgcmVzcG9uc2UgaGFuZGxlciB3aWxsIGJlIHVucmVnaXN0ZXJlZCBhZnRlciByZWNlaXZpbmcgdGhlIHJlc3BvbnNlLCBvciBhZnRlciByZXNwb25zZSB0aW1lb3V0IChkZWZhdWx0IHRvIDNzKS5cclxuICAqIEBwYXJhbSAge01lc3NhZ2V9IG1zZyBNZXNzYWdlIHRvIHNlbmQuIE1lc3NhZ2UgSUQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgbWVzc2FnZS5cclxuICAqIEBwYXJhbSAge0Z1bmN0aW9ufSByZXNwb25zZUNhbGxiYWNrIE9wdGlvbmFsIHBhcmFtZXRlciwgaWYgdGhlIGRldmVsb3BlciB3aGF0J3MgYXV0b21hdGljIHJlc3BvbnNlIG1hbmFnZW1lbnQuXHJcbiAgKiBAcmV0dXJuIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lc3NhZ2UgSUQsIGluIGNhc2UgaXQgc2hvdWxkIGJlIG5lZWRlZCBmb3IgbWFudWFsIG1hbmFnZW1lbnQgb2YgdGhlIHJlc3BvbnNlIGhhbmRsZXIuXHJcbiAgKi9cclxuICBwb3N0TWVzc2FnZShpbk1zZywgcmVzcG9uc2VDYWxsYmFjaykgeyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIHBvc3QgbWVzc2FnZXMgd2l0aCBhIG51bWJlciBvZiByZXRyaWVzIGluIGNhc2UgdGltZW91dHMgb2NjdXIuXHJcbiAgICogQHBhcmFtICB7TWVzc2FnZX0gbXNnIE1lc3NhZ2UgdG8gc2VuZC4gTWVzc2FnZSBJRCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBtZXNzYWdlLlxyXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSByZXNwb25zZUNhbGxiYWNrIE9wdGlvbmFsIHBhcmFtZXRlciwgaWYgdGhlIGRldmVsb3BlciB3aGF0J3MgYXV0b21hdGljIHJlc3BvbnNlIG1hbmFnZW1lbnQuXHJcbiAgICogQHBhcmFtICB7aW50ZWdlcn0gcmV0cmllcyBudW1iZXIgb2YgcmV0cmllcyB3aGVuIHRpbWVvdXRzIG9jY3VyXHJcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gbWVzc2FnZSBkZWxpdmVyeSByZXN1bHQ7XHJcbiAgICovXHJcblxyXG5cclxuICBwb3N0TWVzc2FnZVdpdGhSZXRyaWVzKG1zZywgcmV0cmllcywgY2FsbGJhY2spIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCByZXRyeSA9IDA7XHJcbiAgICAvL2xldCB0aW1lb3V0ID0gdHJ1ZTtcclxuXHJcbiAgICBsZXQgc2VuZE1zZyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBfdGhpcy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gNDA4IHx8IHJlcGx5LmJvZHkuY29kZSA9PT0gNTAwKSByZWplY3QoKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsb2cuaW5mbygnW0J1cy5wb3N0TWVzc2FnZVdpdGhSZXRyaWVzXSBtc2cgZGVsaXZlcmVkOiAnLCBtc2cpO1xyXG4gICAgICAgICAgICBjYWxsYmFjayhyZXBseSk7XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCB0cnlBZ2FpbiA9ICgpID0+IHtcclxuICAgICAgc2VuZE1zZygpLnRoZW4oKCk9PntcclxuICAgICAgICAvL3RpbWVvdXQgPSBmYWxzZTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH0sICgpPT57XHJcbiAgICAgICAgbG9nLndhcm4oYFtCdXMucG9zdE1lc3NhZ2VXaXRoUmV0cmllc10gTWVzc2FnZSBCb3VuY2VkIChyZXRyeSAke3JldHJ5fSk6ICdgLCBtc2cpO1xyXG4gICAgICAgIGlmIChyZXRyeSsrIDwgcmV0cmllcykge1xyXG4gICAgICAgICAgdHJ5QWdhaW4oKTtcclxuICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4geyB0cnlBZ2FpbigpOyB9LCAxMDAwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBgW0Vycm9yXSBNZXNzYWdlIEJvdW5jZWQgKGRlbGl2ZXJ5IGF0dGVtcHRzICR7cmV0cmllc30pOiAnYDtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvciArIG1zZyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgICB0cnlBZ2FpbigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTm90IHB1YmxpYyBhdmFpbGFibGUsIHVzZWQgYnkgdGhlIGNsYXNzIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiwgdG8gcHJvY2VzcyBtZXNzYWdlcyBmcm9tIHRoZSBwdWJsaWMgXCJwb3N0TWVzc2FnZVwiIHdpdGhvdXQgYSByZWdpc3RlcmVkIGxpc3RlbmVyLlxyXG4gICAqIFVzZWQgdG8gc2VuZCB0aGUgbWVzc2FnZSB0byBhbiBleHRlcm5hbCBpbnRlcmZhY2UsIGxpa2UgYSBXZWJXb3JrZXIsIElGcmFtZSwgZXRjLlxyXG4gICAqIEBwYXJhbSAge01lc3NhZ2UuTWVzc2FnZX0gbXNnIE1lc3NhZ2VcclxuICAgKi9cclxuICBfb25Qb3N0TWVzc2FnZShtc2cpIHsgLyppbXBsZW1lbnRhdGlvbiB3aWxsIHNlbmQgbWVzc2FnZSB0byBleHRlcm5hbCBzeXN0ZW0qLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5vdCBwdWJsaWMgYXZhaWxhYmxlLCB1c2VkIGJ5IHRoZSBjbGFzcyBleHRlbnNpb24gaW1wbGVtZW50YXRpb24sIHRvIHByb2Nlc3MgYWxsIG1lc3NhZ2VzIHRoYXQgZW50ZXIgdGhlIE1pbmlCdXMgZnJvbSBhbiBleHRlcm5hbCBpbnRlcmZhY2UsIGxpa2UgYSBXZWJXb3JrZXIsIElGcmFtZSwgZXRjLlxyXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmUgdGltZSBpbiB0aGUgY29uc3RydWN0b3IgdG8gcmVnaXN0ZXIgZXh0ZXJuYWwgbGlzdGVuZXJzLlxyXG4gICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIHByb2JhYmx5IGNhbGwgdGhlIFwiX29uTWVzc2FnZVwiIG1ldGhvZCB0byBwdWJsaXNoIGluIHRoZSBsb2NhbCBsaXN0ZW5lcnMuXHJcbiAgICogRE8gTk9UIGNhbGwgXCJwb3N0TWVzc2FnZVwiLCB0aGVyZSBpcyBhIGRhbmdlciB0aGF0IHRoZSBtZXNzYWdlIGVudGVycyBpbiBhIGN5Y2xlIVxyXG4gICAqL1xyXG4gIF9yZWdpc3RlckV4dGVybmFsTGlzdGVuZXIoKSB7IC8qaW1wbGVtZW50YXRpb24gd2lsbCByZWdpc3RlciBleHRlcm5hbCBsaXN0ZW5lciBhbmQgY2FsbCBcInRoaXMuX29uTWVzc2FnZShtc2cpXCIgKi8gfVxyXG5cclxufVxyXG5cclxuY2xhc3MgTXNnTGlzdGVuZXIge1xyXG4gIC8qIHByaXZhdGVcclxuICBfc3Vic2NyaXB0aW9uczogPHN0cmluZzogTXNnTGlzdGVuZXJbXT47XHJcbiAgX3VybDogc3RyaW5nO1xyXG4gIF9jYWxsYmFjazogKG1zZykgPT4gdm9pZDtcclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3RvcihzdWJzY3JpcHRpb25zLCB1cmwsIGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9zdWJzY3JpcHRpb25zID0gc3Vic2NyaXB0aW9ucztcclxuICAgIF90aGlzLl91cmwgPSB1cmw7XHJcbiAgICBfdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIGdldCB1cmwoKSB7IHJldHVybiB0aGlzLl91cmw7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlIHRoaXMgbGlzdGVuZXIgZnJvbSB0aGUgQnVzXHJcbiAgICovXHJcbiAgcmVtb3ZlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgc3VicyA9IF90aGlzLl9zdWJzY3JpcHRpb25zW190aGlzLl91cmxdO1xyXG4gICAgaWYgKHN1YnMpIHtcclxuICAgICAgbGV0IGluZGV4ID0gc3Vicy5pbmRleE9mKF90aGlzKTtcclxuICAgICAgc3Vicy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgLy9pZiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLCByZW1vdmUgdGhlIHN1YnNjcmlwdGlvbiBlbnRpcmVseS5cclxuICAgICAgaWYgKHN1YnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgZGVsZXRlIF90aGlzLl9zdWJzY3JpcHRpb25zW190aGlzLl91cmxdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCdXM7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQU1BOzs7QUFDQTs7Ozs7O0FBU0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFOQTtBQVFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUVBOzs7Ozs7Ozs7O0FBU0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFNQTtBQUFBO0FBQUE7Ozs7OztBQUlBOzs7QUFDQTs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUdBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFsQkE7QUFBQTtBQUFBOzs7Ozs7QUFxQkEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///7\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * EventEmitter\r\n * All classes which extends this, can have addEventListener and trigger events;\r\n */\nvar EventEmitter =\n/*#__PURE__*/\nfunction () {\n function EventEmitter() {\n _classCallCheck(this, EventEmitter);\n }\n\n _createClass(EventEmitter, [{\n key: "addEventListener",\n\n /**\r\n * addEventListener listen for an eventType\r\n * @param {string} eventType - listening for this type of event\r\n * @param {Function} cb - callback function will be executed when the event it is invoked\r\n */\n value: function addEventListener(eventType, cb) {\n var _this = this;\n\n _this[eventType] = cb;\n }\n /**\r\n * Invoke the eventType\r\n * @param {string} eventType - event will be invoked\r\n * @param {object} params - parameters will be passed to the addEventListener\r\n */\n\n }, {\n key: "trigger",\n value: function trigger(eventType, params) {\n var _this = this;\n\n if (_this[eventType]) {\n _this[eventType](params);\n }\n }\n }]);\n\n return EventEmitter;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (EventEmitter);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy91dGlscy9FdmVudEVtaXR0ZXIuanM/OGE4YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcbi8qKlxyXG4gKiBFdmVudEVtaXR0ZXJcclxuICogQWxsIGNsYXNzZXMgd2hpY2ggZXh0ZW5kcyB0aGlzLCBjYW4gaGF2ZSBhZGRFdmVudExpc3RlbmVyIGFuZCB0cmlnZ2VyIGV2ZW50cztcclxuICovXHJcbmNsYXNzIEV2ZW50RW1pdHRlciB7XHJcblxyXG4gIC8qKlxyXG4gICAqIGFkZEV2ZW50TGlzdGVuZXIgbGlzdGVuIGZvciBhbiBldmVudFR5cGVcclxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgZXZlbnRUeXBlIC0gbGlzdGVuaW5nIGZvciB0aGlzIHR5cGUgb2YgZXZlbnRcclxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gICAgICAgY2IgICAgICAgIC0gY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBldmVudCBpdCBpcyBpbnZva2VkXHJcbiAgICovXHJcbiAgYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNiKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXNbZXZlbnRUeXBlXSA9IGNiO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW52b2tlIHRoZSBldmVudFR5cGVcclxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IGV2ZW50VHlwZSAtIGV2ZW50IHdpbGwgYmUgaW52b2tlZFxyXG4gICAqIEBwYXJhbSAge29iamVjdH0gcGFyYW1zIC0gcGFyYW1ldGVycyB3aWxsIGJlIHBhc3NlZCB0byB0aGUgYWRkRXZlbnRMaXN0ZW5lclxyXG4gICAqL1xyXG4gIHRyaWdnZXIoZXZlbnRUeXBlLCBwYXJhbXMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgaWYgKF90aGlzW2V2ZW50VHlwZV0pIHtcclxuICAgICAgX3RoaXNbZXZlbnRUeXBlXShwYXJhbXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEV2ZW50RW1pdHRlcjtcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7Ozs7QUFJQTs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBSUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* Core IdentityManager interface\r\n* Class to allow applications to search for Identities registered in runtime-core\r\n*/\n\nvar IdentityManager =\n/*#__PURE__*/\nfunction () {\n /**\r\n * To initialise the IdentityManager, which will provide the support for hyperties to\r\n * query about identities registered\r\n * @param {String} owner owner\r\n * @param {String} runtimeURL runtimeURL\r\n * @param {MessageBus} msgbus msgbus\r\n */\n function IdentityManager(owner, runtimeURL, msgBus) {\n _classCallCheck(this, IdentityManager);\n\n var _this = this;\n\n _this.messageBus = msgBus;\n _this.domain = Object(_utils_utils__WEBPACK_IMPORTED_MODULE_0__[/* divideURL */ \"k\"])(owner).domain;\n _this.owner = owner;\n _this.runtimeURL = runtimeURL;\n }\n /**\r\n * Function to query the runtime registry about the identity to which the hyperty was associated\r\n * @param {String} type (Optional) type of user info required\r\n * @param {String} owner (Optional) owner to search for\r\n * @return {Promise} userURL userURL associated to the hyperty\r\n */\n\n\n _createClass(IdentityManager, [{\n key: \"discoverUserRegistered\",\n value: function discoverUserRegistered(type, hyperty) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var activeHypertyURL; // if any type of search is selected query for that type, otherwise query for default user info\n\n var searchType = type ? type : '.';\n\n if (!hyperty) {\n activeHypertyURL = _this.owner;\n } else {\n activeHypertyURL = hyperty;\n }\n\n var msg = {\n type: 'read',\n from: activeHypertyURL,\n to: _this.runtimeURL + '/registry/',\n body: {\n resource: searchType,\n criteria: activeHypertyURL\n }\n };\n\n _this.messageBus.postMessage(msg, function (reply) {\n var userURL = reply.body.resource;\n\n if (userURL && reply.body.code === 200) {\n resolve(userURL);\n } else {\n reject('code: ' + reply.body.code + ' No user was found');\n }\n });\n });\n }\n /**\r\n * Function to query the Identity Module about authenticated identities from a certain domain\r\n * @param {String} idp idp domain of the identity to be discovered\r\n * @return {Promise} identity\r\n */\n\n }, {\n key: \"discoverIdentityPerIdP\",\n value: function discoverIdentityPerIdP(idp) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var msg = {\n type: 'read',\n from: this.owner,\n to: _this.runtimeURL + '/idm',\n body: {\n resource: idp,\n criteria: 'idp'\n }\n };\n\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n resolve(reply.body.value);\n } else {\n reject(reply.body.code + ' ' + reply.body.desc);\n }\n });\n });\n }\n }]);\n\n return IdentityManager;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (IdentityManager);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOS5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9JZGVudGl0eU1hbmFnZXIuanM/MTYzOCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcbmltcG9ydCB7ZGl2aWRlVVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG4vKipcclxuKiBDb3JlIElkZW50aXR5TWFuYWdlciBpbnRlcmZhY2VcclxuKiBDbGFzcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gc2VhcmNoIGZvciBJZGVudGl0aWVzIHJlZ2lzdGVyZWQgaW4gcnVudGltZS1jb3JlXHJcbiovXHJcbmNsYXNzIElkZW50aXR5TWFuYWdlciB7XHJcblxyXG4gIC8qKlxyXG4gICogVG8gaW5pdGlhbGlzZSB0aGUgSWRlbnRpdHlNYW5hZ2VyLCB3aGljaCB3aWxsIHByb3ZpZGUgdGhlIHN1cHBvcnQgZm9yIGh5cGVydGllcyB0b1xyXG4gICogcXVlcnkgYWJvdXQgaWRlbnRpdGllcyByZWdpc3RlcmVkXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgIG93bmVyICAgICAgICAgICAgb3duZXJcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgcnVudGltZVVSTCAgICAgICAgICAgIHJ1bnRpbWVVUkxcclxuICAqIEBwYXJhbSAge01lc3NhZ2VCdXN9ICAgICAgICAgIG1zZ2J1cyAgICAgICAgICAgICAgICBtc2didXNcclxuICAqL1xyXG4gIGNvbnN0cnVjdG9yKG93bmVyLCBydW50aW1lVVJMLCBtc2dCdXMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5tZXNzYWdlQnVzID0gbXNnQnVzO1xyXG5cclxuICAgIF90aGlzLmRvbWFpbiA9IGRpdmlkZVVSTChvd25lcikuZG9tYWluO1xyXG4gICAgX3RoaXMub3duZXIgPSBvd25lcjtcclxuICAgIF90aGlzLnJ1bnRpbWVVUkwgPSBydW50aW1lVVJMO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBGdW5jdGlvbiB0byBxdWVyeSB0aGUgcnVudGltZSByZWdpc3RyeSBhYm91dCB0aGUgaWRlbnRpdHkgdG8gd2hpY2ggdGhlIGh5cGVydHkgd2FzIGFzc29jaWF0ZWRcclxuICAqIEBwYXJhbSB7U3RyaW5nfSAgICAgICB0eXBlIChPcHRpb25hbCkgICAgICAgICB0eXBlIG9mIHVzZXIgaW5mbyByZXF1aXJlZFxyXG4gICogQHBhcmFtIHtTdHJpbmd9ICAgICAgIG93bmVyIChPcHRpb25hbCkgICBvd25lciB0byBzZWFyY2ggZm9yXHJcbiAgKiBAcmV0dXJuIHtQcm9taXNlfSAgICAgdXNlclVSTCAgICAgICB1c2VyVVJMIGFzc29jaWF0ZWQgdG8gdGhlIGh5cGVydHlcclxuICAqL1xyXG4gIGRpc2NvdmVyVXNlclJlZ2lzdGVyZWQodHlwZSwgaHlwZXJ0eSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsZXQgYWN0aXZlSHlwZXJ0eVVSTDtcclxuXHJcbiAgICAgIC8vIGlmIGFueSB0eXBlIG9mIHNlYXJjaCBpcyBzZWxlY3RlZCBxdWVyeSBmb3IgdGhhdCB0eXBlLCBvdGhlcndpc2UgcXVlcnkgZm9yIGRlZmF1bHQgdXNlciBpbmZvXHJcbiAgICAgIGxldCBzZWFyY2hUeXBlID0gKHR5cGUpID8gdHlwZSA6ICcuJztcclxuXHJcbiAgICAgIGlmICghaHlwZXJ0eSkge1xyXG4gICAgICAgIGFjdGl2ZUh5cGVydHlVUkwgPSBfdGhpcy5vd25lcjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhY3RpdmVIeXBlcnR5VVJMID0gaHlwZXJ0eTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IG1zZyA9IHtcclxuICAgICAgICB0eXBlOiAncmVhZCcsIGZyb206IGFjdGl2ZUh5cGVydHlVUkwsIHRvOiBfdGhpcy5ydW50aW1lVVJMICsgJy9yZWdpc3RyeS8nLCBib2R5OiB7IHJlc291cmNlOiBzZWFyY2hUeXBlLCBjcml0ZXJpYTogYWN0aXZlSHlwZXJ0eVVSTH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgbGV0IHVzZXJVUkwgPSByZXBseS5ib2R5LnJlc291cmNlO1xyXG5cclxuICAgICAgICBpZiAodXNlclVSTCAmJiByZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgcmVzb2x2ZSh1c2VyVVJMKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KCdjb2RlOiAnICsgcmVwbHkuYm9keS5jb2RlICsgJyBObyB1c2VyIHdhcyBmb3VuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRnVuY3Rpb24gdG8gcXVlcnkgdGhlIElkZW50aXR5IE1vZHVsZSBhYm91dCBhdXRoZW50aWNhdGVkIGlkZW50aXRpZXMgZnJvbSBhIGNlcnRhaW4gZG9tYWluXHJcbiAgKiBAcGFyYW0ge1N0cmluZ30gICAgICAgaWRwIGlkcCBkb21haW4gb2YgdGhlIGlkZW50aXR5IHRvIGJlIGRpc2NvdmVyZWRcclxuICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICBpZGVudGl0eVxyXG4gICovXHJcblxyXG4gIGRpc2NvdmVySWRlbnRpdHlQZXJJZFAoaWRwKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGxldCBtc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiB0aGlzLm93bmVyLCB0bzogX3RoaXMucnVudGltZVVSTCArICcvaWRtJywgYm9keTogeyByZXNvdXJjZTogaWRwLCBjcml0ZXJpYTogJ2lkcCd9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KHJlcGx5LmJvZHkuY29kZSArICcgJyArIHJlcGx5LmJvZHkuZGVzYyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSWRlbnRpdHlNYW5hZ2VyO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNCQTtBQUVBOzs7OztBQUlBOzs7QUFFQTs7Ozs7OztBQU9BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var _utils_EventEmitter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8);\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n//import IdentityManager from '../identityManager/IdentityManager';\n//import Syncher from '../syncher/Syncher.js';\n//import Discovery from '../discovery/Discovery.js';\n//import {divideURL} from '../utils/utils';\n//import Search from '../utils/Search';\n\n/**\r\n* Context Observer;\r\n* @author Paulo Chainho [paulo-g-chainho@alticelabs.com]\r\n*/\n\nvar ContextObserver =\n/*#__PURE__*/\nfunction (_EventEmitter) {\n _inherits(ContextObserver, _EventEmitter);\n\n function ContextObserver(hypertyURL, bus, configuration, contextResourceTypes, factory, syncher) {\n var _this2;\n\n _classCallCheck(this, ContextObserver);\n\n if (!hypertyURL) throw new Error('The hypertyURL is a needed parameter');\n if (!bus) throw new Error('The MiniBus is a needed parameter');\n if (!configuration) throw new Error('The configuration is a needed parameter ');\n if (!factory) throw new Error('The factory is a needed parameter ');\n _this2 = _possibleConstructorReturn(this, _getPrototypeOf(ContextObserver).call(this));\n\n var _this = _assertThisInitialized(_assertThisInitialized(_this2));\n\n _this._contextResourceTypes = contextResourceTypes;\n _this._url = hypertyURL;\n _this._discoverUsersPromises = {}; // object with promises executed at discoverUsers function\n\n _this._observePromises = {}; // object with promises executed at observe function\n //let identityManager = new IdentityManager(hypertyURL, configuration.runtimeURL, bus);\n\n console.log('[ContextObserver] started with hypertyURL->', hypertyURL);\n _this._domain = factory.divideURL(configuration.runtimeURL).domain;\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + _this._domain + '/.well-known/dataschema/Context';\n _this._users2observe = [];\n _this._observers = {};\n _this2._syncher = syncher ? syncher : factory.createSyncher(hypertyURL, bus, configuration);\n var discovery = factory.createDiscovery(hypertyURL, configuration.runtimeURL, bus);\n _this._discovery = discovery;\n _this._discoveries = {}; //list of discovered objects\n //_this.identityManager = identityManager;\n //_this.search = new Search(discovery, identityManager);\n\n window.discovery = _this._discovery;\n return _this2;\n }\n\n _createClass(ContextObserver, [{\n key: \"start\",\n value: function start(resumedContext, disconnectedCallBack) {\n var _this = this;\n\n console.log('[ContextObserver.start] ');\n return new Promise(function (resolve, reject) {\n _this._syncher.resumeObservers({\n store: true\n }).then(function (observers) {\n var observersList = Object.keys(observers);\n\n if (observersList.length > 0) {\n console.log('[ContextObserver.start] resuming: ', observers);\n /*observersList.forEach((i)=>{\r\n _this._users2observe.push(new UserAvailabilityController(observers[i]));\r\n });*/\n\n _this._observers = observers;\n resolve(observers);\n observersList.forEach(function (observer) {\n var Context = observers[observer]; // By default resumed context is set with resumedContext.\n\n if (resumedContext) context.data.values = resumedContext; // Context will will be updated with value synchronized with reporter if connected\n\n Context.sync(); //Add listener to be notified when reporter is abruptly disconnected\n\n if (disconnectedCallBack) Context.onDisconnected(disconnectedCallBack);\n });\n } else {\n resolve(false);\n }\n }).catch(function (reason) {\n console.info('[ContextObserver] Resume Observer failed | ', reason);\n resolve(false);\n });\n }).catch(function (reason) {\n reject('[ContextObserver] Start failed | ', reason);\n });\n }\n }, {\n key: \"resumeDiscoveries\",\n value: function resumeDiscoveries() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._discovery.resumeDiscoveries().then(function (discoveries) {\n console.log('[ContextObserver._resumeDiscoveries] found: ', discoveries);\n discoveries.forEach(function (discovery) {\n if (discovery.data.resources && discovery.data.resources[0] === _this._contextResourceTypes[0]) {\n console.log('[ContextObserver._resumeDiscoveries] resuming: ', discovery);\n\n if (discovery.data.status === 'live') {\n // previously discovered object is now live\n resolve([discovery.data]);\n discovery.unsubscribeLive(_this._url);\n } else {\n // previously discovered object is still disconnected\n discovery.onLive(_this._url, function () {\n console.log('[ContextObserver._resumeDiscoveries] disconnected Hyperty is back to live', discovery);\n resolve([discovery.data]);\n discovery.unsubscribeLive(_this._url);\n });\n }\n }\n });\n });\n }).catch(function (reason) {\n reject('[ContextObserver] resumeDiscoveries failed | ', reason);\n });\n }\n }, {\n key: \"onResumeObserver\",\n value: function onResumeObserver(callback) {\n var _this = this;\n\n _this._onResumeObserver = callback;\n }\n }, {\n key: \"discoverUsers\",\n value: function discoverUsers(email, domain) {\n var _this = this;\n\n var user = email + '@' + domain;\n\n if (!_this._discoverUsersPromises[user]) {\n _this._discoverUsersPromises[user] = new Promise(function (resolve, reject) {\n _this._discovery.discoverHypertiesDO(email, ['context'], _this._contextResourceTypes, domain).then(function (hyperties) {\n //_this.search.users([email], [domain], ['context'], ['Context_context']).then(function(a) {\n console.log('[ContextObserver.discoverUsers] discovery result->', hyperties);\n var discovered = [];\n var disconnected = [];\n hyperties.forEach(function (hyperty) {\n _this._discoveries[hyperty.data.hypertyID] = hyperty;\n\n if (hyperty.data.status === 'live') {\n discovered.push(hyperty.data);\n } else {\n disconnected.push(hyperty);\n }\n });\n\n if (discovered.length > 0) {\n console.log('[ContextObserver.discoverUsers] returning discovered hyperties data->', discovered);\n resolve(discovered);\n } else if (disconnected.length > 0) {\n console.log('[ContextObserver.discoverUsers] disconnected Hyperties ', disconnected); //resolve([]);\n\n disconnected[0].onLive(_this._url, function () {\n console.log('[ContextObserver.discoverUsers] disconnected Hyperty is back to live', disconnected[0]);\n discovered.push(disconnected[0].data);\n resolve(discovered);\n disconnected[0].unsubscribeLive(_this._url);\n });\n }\n });\n });\n }\n\n return _this._discoverUsersPromises[user];\n }\n /**\r\n * This function is used to start the user Context observation for a certain user Context reporter\r\n * @param {DiscoveredObject} hyperty Hyperty to be observed.\r\n * @return { DataObjectObserver} It returns as a Promise the UserAvailability Data Object Observer.\r\n */\n\n }, {\n key: \"observe\",\n value: function observe(hyperty) {\n var domainSubscription = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n var _this = this;\n\n if (!_this._observePromises[hyperty.hypertyID]) {\n _this._observePromises[hyperty.hypertyID] = new Promise(function (resolve, reject) {\n //check if we are already observing it\n _this._users2observe.forEach(function (Context) {\n if (Context._reporter === hyperty.hypertyID) return resolve(Context);\n });\n\n _this._discovery.discoverDataObjectsPerReporter(hyperty.hypertyID, ['context'], _this._contextResourceTypes, _this._domain).then(function (dataObjects) {\n console.log('[ContextObserver.discoverAvailability] discovered context objects ', dataObjects);\n var last = 0;\n var url;\n dataObjects.forEach(function (dataObject) {\n if (dataObject.hasOwnProperty('lastModified') && dataObject.hasOwnProperty('url') && Date.parse(dataObject.lastModified) > last) {\n last = dataObject.lastModified;\n url = dataObject.url; //console.log('URL DATA Object', url);\n }\n });\n\n if (last != 0 && url) {\n resolve(_this._subscribeContext(hyperty, url, domainSubscription));\n } else {\n reject('[ContextObserver.observe] discovered DataObjecs are invalid', dataObjects);\n }\n });\n });\n }\n\n return _this._observePromises[hyperty.hypertyID];\n }\n }, {\n key: \"_subscribeContext\",\n value: function _subscribeContext(hyperty, url) {\n var domainSubscription = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n\n var _this = this; // avoid duplicated subscriptions\n\n\n return new Promise(function (resolve, reject) {\n _this._users2observe.forEach(function (Context) {\n if (Context.url === url) return resolve(Context);\n });\n\n var input = {\n schema: _this._objectDescURL,\n resource: url,\n store: null,\n p2p: null,\n mutual: null,\n domain_subscription: domainSubscription\n };\n\n _this._syncher.subscribe(input).then(function (Context) {\n console.log('[ContextObserver._subscribeContext] observer object', Context); //let newUserAvailability = new UserAvailabilityController(Context, userID);\n\n _this._users2observe.push(Context); // When Object is disconnected set user Context status as unavailable\n\n\n Context.onDisconnected(function () {\n console.log('[ContextObserver.onDisconnected]: ', Context);\n Context.data.values[0].value = 'unavailable';\n Context.sync();\n });\n resolve(Context);\n });\n });\n }\n }, {\n key: \"_discoverAndSubscribeLegacyUsers\",\n value: function _discoverAndSubscribeLegacyUsers(name) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this._discovery.discoverDataObjectsPerName(name).then(function (result) {\n console.log('[ContextObserver._discoverAndSubscribeLegacyUsers] All DataObjects Result', result);\n result.forEach(function (obj) {\n if (obj.status === 'live') {\n console.log('Live obj', obj);\n\n if (!obj.hypertyID) {\n obj.hypertyID = obj.reporter;\n }\n\n _this._subscribeContext(obj.schema, obj.url).then(function (resultSubscribe) {\n console.log('[ContextObserver._discoverAndSubscribeLegacyUsers] _subscribeContext', resultSubscribe);\n return resolve(resultSubscribe);\n });\n }\n });\n }).catch(function (err) {\n console.log('error ', err);\n });\n });\n }\n /**\r\n * This function is used to stop the user Context observation for a certain user\r\n * @param {string} Context the UserAvailability Data Object Observer URL to be unobserved.\r\n */\n\n }, {\n key: \"unobserve\",\n value: function unobserve(Context) {\n var _this = this;\n\n _this._users2observe.forEach(function (user, index) {\n if (user.url === Context) {\n user.unsubscribe();\n\n _this._users2observe.splice(index, 1);\n }\n });\n }\n }]);\n\n return ContextObserver;\n}(_utils_EventEmitter__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (ContextObserver);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY29udGV4dE1hbmFnZXIvQ29udGV4dE9ic2VydmVyLmpzP2NjZjAiXSwic291cmNlc0NvbnRlbnQiOlsiLy9pbXBvcnQgSWRlbnRpdHlNYW5hZ2VyIGZyb20gJy4uL2lkZW50aXR5TWFuYWdlci9JZGVudGl0eU1hbmFnZXInO1xyXG4vL2ltcG9ydCBTeW5jaGVyIGZyb20gJy4uL3N5bmNoZXIvU3luY2hlci5qcyc7XHJcbi8vaW1wb3J0IERpc2NvdmVyeSBmcm9tICcuLi9kaXNjb3ZlcnkvRGlzY292ZXJ5LmpzJztcclxuLy9pbXBvcnQge2RpdmlkZVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuLy9pbXBvcnQgU2VhcmNoIGZyb20gJy4uL3V0aWxzL1NlYXJjaCc7XHJcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnLi4vdXRpbHMvRXZlbnRFbWl0dGVyJztcclxuXHJcbi8qKlxyXG4qIENvbnRleHQgT2JzZXJ2ZXI7XHJcbiogQGF1dGhvciBQYXVsbyBDaGFpbmhvIFtwYXVsby1nLWNoYWluaG9AYWx0aWNlbGFicy5jb21dXHJcbiovXHJcblxyXG5jbGFzcyBDb250ZXh0T2JzZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24sIGNvbnRleHRSZXNvdXJjZVR5cGVzLCBmYWN0b3J5LCBzeW5jaGVyKSB7XHJcbiAgICBpZiAoIWh5cGVydHlVUkwpIHRocm93IG5ldyBFcnJvcignVGhlIGh5cGVydHlVUkwgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XHJcbiAgICBpZiAoIWJ1cykgdGhyb3cgbmV3IEVycm9yKCdUaGUgTWluaUJ1cyBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKCdUaGUgY29uZmlndXJhdGlvbiBpcyBhIG5lZWRlZCBwYXJhbWV0ZXIgJyk7XHJcbiAgICBpZiAoIWZhY3RvcnkpIHRocm93IG5ldyBFcnJvcignVGhlIGZhY3RvcnkgaXMgYSBuZWVkZWQgcGFyYW1ldGVyICcpO1xyXG5cclxuICAgIHN1cGVyKCk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fY29udGV4dFJlc291cmNlVHlwZXMgPSBjb250ZXh0UmVzb3VyY2VUeXBlcztcclxuICAgIF90aGlzLl91cmwgPSBoeXBlcnR5VVJMO1xyXG4gICAgX3RoaXMuX2Rpc2NvdmVyVXNlcnNQcm9taXNlcyA9IHt9OyAvLyBvYmplY3Qgd2l0aCBwcm9taXNlcyBleGVjdXRlZCBhdCBkaXNjb3ZlclVzZXJzIGZ1bmN0aW9uXHJcbiAgICBfdGhpcy5fb2JzZXJ2ZVByb21pc2VzID0ge307IC8vIG9iamVjdCB3aXRoIHByb21pc2VzIGV4ZWN1dGVkIGF0IG9ic2VydmUgZnVuY3Rpb25cclxuXHJcblxyXG4gICAgLy9sZXQgaWRlbnRpdHlNYW5hZ2VyID0gbmV3IElkZW50aXR5TWFuYWdlcihoeXBlcnR5VVJMLCBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwsIGJ1cyk7XHJcbiAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlcl0gc3RhcnRlZCB3aXRoIGh5cGVydHlVUkwtPicsIGh5cGVydHlVUkwpO1xyXG4gICAgX3RoaXMuX2RvbWFpbiA9IGZhY3RvcnkuZGl2aWRlVVJMKGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTCkuZG9tYWluO1xyXG4gICAgX3RoaXMuX29iamVjdERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIF90aGlzLl9kb21haW4gKyAnLy53ZWxsLWtub3duL2RhdGFzY2hlbWEvQ29udGV4dCc7XHJcblxyXG4gICAgX3RoaXMuX3VzZXJzMm9ic2VydmUgPSBbXTtcclxuICAgIF90aGlzLl9vYnNlcnZlcnMgPSB7fTtcclxuXHJcbiAgICB0aGlzLl9zeW5jaGVyID0gc3luY2hlciA/IHN5bmNoZXIgOiBmYWN0b3J5LmNyZWF0ZVN5bmNoZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICBsZXQgZGlzY292ZXJ5ID0gZmFjdG9yeS5jcmVhdGVEaXNjb3ZlcnkoaHlwZXJ0eVVSTCwgY29uZmlndXJhdGlvbi5ydW50aW1lVVJMLCBidXMpO1xyXG4gICAgX3RoaXMuX2Rpc2NvdmVyeSA9IGRpc2NvdmVyeTtcclxuXHJcbiAgICBfdGhpcy5fZGlzY292ZXJpZXMgPSB7fTsgLy9saXN0IG9mIGRpc2NvdmVyZWQgb2JqZWN0c1xyXG4gICAgLy9fdGhpcy5pZGVudGl0eU1hbmFnZXIgPSBpZGVudGl0eU1hbmFnZXI7XHJcbiAgICAvL190aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2goZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpO1xyXG4gICAgd2luZG93LmRpc2NvdmVyeSA9IF90aGlzLl9kaXNjb3Zlcnk7XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RhcnQocmVzdW1lZENvbnRleHQsIGRpc2Nvbm5lY3RlZENhbGxCYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIuc3RhcnRdICcpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIF90aGlzLl9zeW5jaGVyLnJlc3VtZU9ic2VydmVycyh7c3RvcmU6IHRydWV9KS50aGVuKChvYnNlcnZlcnMpID0+IHtcclxuXHJcbiAgICAgICAgbGV0IG9ic2VydmVyc0xpc3QgPSBPYmplY3Qua2V5cyhvYnNlcnZlcnMpO1xyXG5cclxuICAgICAgICBpZiAob2JzZXJ2ZXJzTGlzdC5sZW5ndGggID4gMCkge1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLnN0YXJ0XSByZXN1bWluZzogJywgb2JzZXJ2ZXJzKTtcclxuXHJcbiAgICAgICAgICAvKm9ic2VydmVyc0xpc3QuZm9yRWFjaCgoaSk9PntcclxuICAgICAgICAgIF90aGlzLl91c2VyczJvYnNlcnZlLnB1c2gobmV3IFVzZXJBdmFpbGFiaWxpdHlDb250cm9sbGVyKG9ic2VydmVyc1tpXSkpO1xyXG4gICAgICAgIH0pOyovXHJcbiAgICAgICAgICBfdGhpcy5fb2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzO1xyXG5cclxuICAgICAgICAgIHJlc29sdmUob2JzZXJ2ZXJzKTtcclxuXHJcbiAgICAgICAgICBvYnNlcnZlcnNMaXN0LmZvckVhY2goKG9ic2VydmVyKSA9PntcclxuICAgICAgICAgICAgbGV0IENvbnRleHQgPSBvYnNlcnZlcnNbb2JzZXJ2ZXJdO1xyXG5cclxuICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCByZXN1bWVkIGNvbnRleHQgaXMgc2V0IHdpdGggcmVzdW1lZENvbnRleHQuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bWVkQ29udGV4dCkgY29udGV4dC5kYXRhLnZhbHVlcyA9IHJlc3VtZWRDb250ZXh0O1xyXG5cclxuICAgICAgICAgICAgLy8gQ29udGV4dCB3aWxsIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHZhbHVlIHN5bmNocm9uaXplZCB3aXRoIHJlcG9ydGVyIGlmIGNvbm5lY3RlZFxyXG4gICAgICAgICAgICBDb250ZXh0LnN5bmMoKTtcclxuXHJcbiAgICAgICAgICAgIC8vQWRkIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gcmVwb3J0ZXIgaXMgYWJydXB0bHkgZGlzY29ubmVjdGVkXHJcbiAgICAgICAgICAgIGlmIChkaXNjb25uZWN0ZWRDYWxsQmFjaykgQ29udGV4dC5vbkRpc2Nvbm5lY3RlZChkaXNjb25uZWN0ZWRDYWxsQmFjayk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ29udGV4dE9ic2VydmVyXSBSZXN1bWUgT2JzZXJ2ZXIgZmFpbGVkIHwgJywgcmVhc29uKTtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgIHJlamVjdCgnW0NvbnRleHRPYnNlcnZlcl0gU3RhcnQgZmFpbGVkIHwgJywgcmVhc29uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVzdW1lRGlzY292ZXJpZXMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIF90aGlzLl9kaXNjb3ZlcnkucmVzdW1lRGlzY292ZXJpZXMoKS50aGVuKChkaXNjb3ZlcmllcykgPT4ge1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5fcmVzdW1lRGlzY292ZXJpZXNdIGZvdW5kOiAnLCBkaXNjb3Zlcmllcyk7XHJcblxyXG4gICAgICAgIGRpc2NvdmVyaWVzLmZvckVhY2goKGRpc2NvdmVyeSkgPT57XHJcblxyXG4gICAgICAgICAgaWYgKGRpc2NvdmVyeS5kYXRhLnJlc291cmNlcyAmJiBkaXNjb3ZlcnkuZGF0YS5yZXNvdXJjZXNbMF0gPT09IF90aGlzLl9jb250ZXh0UmVzb3VyY2VUeXBlc1swXSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5fcmVzdW1lRGlzY292ZXJpZXNdIHJlc3VtaW5nOiAnLCBkaXNjb3ZlcnkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRpc2NvdmVyeS5kYXRhLnN0YXR1cyA9PT0gJ2xpdmUnKSB7IC8vIHByZXZpb3VzbHkgZGlzY292ZXJlZCBvYmplY3QgaXMgbm93IGxpdmVcclxuICAgICAgICAgICAgICByZXNvbHZlKFtkaXNjb3ZlcnkuZGF0YV0pO1xyXG4gICAgICAgICAgICAgIGRpc2NvdmVyeS51bnN1YnNjcmliZUxpdmUoX3RoaXMuX3VybCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIHByZXZpb3VzbHkgZGlzY292ZXJlZCBvYmplY3QgaXMgc3RpbGwgZGlzY29ubmVjdGVkXHJcbiAgICAgICAgICAgICAgZGlzY292ZXJ5Lm9uTGl2ZShfdGhpcy5fdXJsLCAoKT0+e1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIuX3Jlc3VtZURpc2NvdmVyaWVzXSBkaXNjb25uZWN0ZWQgSHlwZXJ0eSBpcyBiYWNrIHRvIGxpdmUnLCBkaXNjb3ZlcnkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShbZGlzY292ZXJ5LmRhdGFdKTtcclxuICAgICAgICAgICAgICAgIGRpc2NvdmVyeS51bnN1YnNjcmliZUxpdmUoX3RoaXMuX3VybCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgIHJlamVjdCgnW0NvbnRleHRPYnNlcnZlcl0gcmVzdW1lRGlzY292ZXJpZXMgZmFpbGVkIHwgJywgcmVhc29uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25SZXN1bWVPYnNlcnZlcihjYWxsYmFjaykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9vblJlc3VtZU9ic2VydmVyID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuXHJcbiAgZGlzY292ZXJVc2VycyhlbWFpbCwgZG9tYWluKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuXHJcbiAgICBsZXQgdXNlciA9IGVtYWlsICsgJ0AnICsgZG9tYWluO1xyXG5cclxuICAgIGlmICghX3RoaXMuX2Rpc2NvdmVyVXNlcnNQcm9taXNlc1t1c2VyXSkge1xyXG4gICAgICBfdGhpcy5fZGlzY292ZXJVc2Vyc1Byb21pc2VzW3VzZXJdID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICAgIF90aGlzLl9kaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNETyhlbWFpbCwgWydjb250ZXh0J10sIF90aGlzLl9jb250ZXh0UmVzb3VyY2VUeXBlcywgZG9tYWluKS50aGVuKGh5cGVydGllcyA9PntcclxuICAgICAgICAgIC8vX3RoaXMuc2VhcmNoLnVzZXJzKFtlbWFpbF0sIFtkb21haW5dLCBbJ2NvbnRleHQnXSwgWydDb250ZXh0X2NvbnRleHQnXSkudGhlbihmdW5jdGlvbihhKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5kaXNjb3ZlclVzZXJzXSBkaXNjb3ZlcnkgcmVzdWx0LT4nLCBoeXBlcnRpZXMpO1xyXG4gICAgICAgICAgbGV0IGRpc2NvdmVyZWQgPSBbXTtcclxuICAgICAgICAgIGxldCBkaXNjb25uZWN0ZWQgPSBbXTtcclxuICAgICAgICAgIGh5cGVydGllcy5mb3JFYWNoKGh5cGVydHkgPT57XHJcbiAgICAgICAgICAgIF90aGlzLl9kaXNjb3Zlcmllc1toeXBlcnR5LmRhdGEuaHlwZXJ0eUlEXSA9IGh5cGVydHk7XHJcbiAgICAgICAgICAgIGlmIChoeXBlcnR5LmRhdGEuc3RhdHVzID09PSAnbGl2ZScpIHtcclxuICAgICAgICAgICAgICBkaXNjb3ZlcmVkLnB1c2goaHlwZXJ0eS5kYXRhKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkaXNjb25uZWN0ZWQucHVzaChoeXBlcnR5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG5cclxuICAgICAgICAgIGlmIChkaXNjb3ZlcmVkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIuZGlzY292ZXJVc2Vyc10gcmV0dXJuaW5nIGRpc2NvdmVyZWQgaHlwZXJ0aWVzIGRhdGEtPicsIGRpc2NvdmVyZWQpO1xyXG4gICAgICAgICAgICByZXNvbHZlKGRpc2NvdmVyZWQpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChkaXNjb25uZWN0ZWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5kaXNjb3ZlclVzZXJzXSBkaXNjb25uZWN0ZWQgSHlwZXJ0aWVzICcsIGRpc2Nvbm5lY3RlZCk7XHJcblxyXG4gICAgICAgICAgICAvL3Jlc29sdmUoW10pO1xyXG5cclxuICAgICAgICAgICAgZGlzY29ubmVjdGVkWzBdLm9uTGl2ZShfdGhpcy5fdXJsLCAoKT0+e1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLmRpc2NvdmVyVXNlcnNdIGRpc2Nvbm5lY3RlZCBIeXBlcnR5IGlzIGJhY2sgdG8gbGl2ZScsIGRpc2Nvbm5lY3RlZFswXSk7XHJcblxyXG4gICAgICAgICAgICAgIGRpc2NvdmVyZWQucHVzaChkaXNjb25uZWN0ZWRbMF0uZGF0YSk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShkaXNjb3ZlcmVkKTtcclxuICAgICAgICAgICAgICBkaXNjb25uZWN0ZWRbMF0udW5zdWJzY3JpYmVMaXZlKF90aGlzLl91cmwpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX3RoaXMuX2Rpc2NvdmVyVXNlcnNQcm9taXNlc1t1c2VyXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdGFydCB0aGUgdXNlciBDb250ZXh0IG9ic2VydmF0aW9uIGZvciBhIGNlcnRhaW4gdXNlciBDb250ZXh0IHJlcG9ydGVyXHJcbiAgICogQHBhcmFtICB7RGlzY292ZXJlZE9iamVjdH0gaHlwZXJ0eSAgICAgICBIeXBlcnR5IHRvIGJlIG9ic2VydmVkLlxyXG4gICAqIEByZXR1cm4gezxQcm9taXNlPiBEYXRhT2JqZWN0T2JzZXJ2ZXJ9ICAgICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdGhlIFVzZXJBdmFpbGFiaWxpdHkgRGF0YSBPYmplY3QgT2JzZXJ2ZXIuXHJcbiAgICovXHJcblxyXG4gIG9ic2VydmUoaHlwZXJ0eSwgZG9tYWluU3Vic2NyaXB0aW9uID0gdHJ1ZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGlmICghX3RoaXMuX29ic2VydmVQcm9taXNlc1toeXBlcnR5Lmh5cGVydHlJRF0pIHtcclxuICAgICAgX3RoaXMuX29ic2VydmVQcm9taXNlc1toeXBlcnR5Lmh5cGVydHlJRF0gPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgLy9jaGVjayBpZiB3ZSBhcmUgYWxyZWFkeSBvYnNlcnZpbmcgaXRcclxuICAgICAgICBfdGhpcy5fdXNlcnMyb2JzZXJ2ZS5mb3JFYWNoKChDb250ZXh0KSA9PiB7XHJcbiAgICAgICAgICBpZiAoQ29udGV4dC5fcmVwb3J0ZXIgPT09IGh5cGVydHkuaHlwZXJ0eUlEKSByZXR1cm4gcmVzb2x2ZShDb250ZXh0KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgX3RoaXMuX2Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyUmVwb3J0ZXIoaHlwZXJ0eS5oeXBlcnR5SUQsIFsnY29udGV4dCddLCBfdGhpcy5fY29udGV4dFJlc291cmNlVHlwZXMsICBfdGhpcy5fZG9tYWluKS50aGVuKGZ1bmN0aW9uKGRhdGFPYmplY3RzKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5kaXNjb3ZlckF2YWlsYWJpbGl0eV0gZGlzY292ZXJlZCBjb250ZXh0IG9iamVjdHMgJywgZGF0YU9iamVjdHMpO1xyXG4gICAgICAgICAgbGV0IGxhc3QgPSAwO1xyXG4gICAgICAgICAgbGV0IHVybDtcclxuXHJcbiAgICAgICAgICBkYXRhT2JqZWN0cy5mb3JFYWNoKChkYXRhT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KCdsYXN0TW9kaWZpZWQnKSAmJiBkYXRhT2JqZWN0Lmhhc093blByb3BlcnR5KCd1cmwnKSAmJiBEYXRlLnBhcnNlKGRhdGFPYmplY3QubGFzdE1vZGlmaWVkKSA+IGxhc3QpIHtcclxuICAgICAgICAgICAgICBsYXN0ID0gZGF0YU9iamVjdC5sYXN0TW9kaWZpZWQ7XHJcbiAgICAgICAgICAgICAgdXJsID0gZGF0YU9iamVjdC51cmw7XHJcblxyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdVUkwgREFUQSBPYmplY3QnLCB1cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmIChsYXN0ICE9IDAgJiYgdXJsKSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoX3RoaXMuX3N1YnNjcmliZUNvbnRleHQoaHlwZXJ0eSwgdXJsLCBkb21haW5TdWJzY3JpcHRpb24pKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlamVjdCgnW0NvbnRleHRPYnNlcnZlci5vYnNlcnZlXSBkaXNjb3ZlcmVkIERhdGFPYmplY3MgYXJlIGludmFsaWQnLCBkYXRhT2JqZWN0cyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF90aGlzLl9vYnNlcnZlUHJvbWlzZXNbaHlwZXJ0eS5oeXBlcnR5SURdO1xyXG4gIH1cclxuXHJcbiAgX3N1YnNjcmliZUNvbnRleHQoaHlwZXJ0eSwgdXJsLCBkb21haW5TdWJzY3JpcHRpb24gPSB0cnVlKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIC8vIGF2b2lkIGR1cGxpY2F0ZWQgc3Vic2NyaXB0aW9uc1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgX3RoaXMuX3VzZXJzMm9ic2VydmUuZm9yRWFjaCgoQ29udGV4dCkgPT4ge1xyXG4gICAgICAgIGlmIChDb250ZXh0LnVybCA9PT0gdXJsKSByZXR1cm4gcmVzb2x2ZShDb250ZXh0KTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsZXQgaW5wdXQgPSB7XHJcbiAgICAgICAgc2NoZW1hOiBfdGhpcy5fb2JqZWN0RGVzY1VSTCxcclxuICAgICAgICByZXNvdXJjZTogdXJsLFxyXG4gICAgICAgIHN0b3JlOiBudWxsLFxyXG4gICAgICAgIHAycDogbnVsbCxcclxuICAgICAgICBtdXR1YWw6IG51bGwsXHJcbiAgICAgICAgZG9tYWluX3N1YnNjcmlwdGlvbjogZG9tYWluU3Vic2NyaXB0aW9uXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBfdGhpcy5fc3luY2hlci5zdWJzY3JpYmUoaW5wdXQpLnRoZW4oKENvbnRleHQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRPYnNlcnZlci5fc3Vic2NyaWJlQ29udGV4dF0gb2JzZXJ2ZXIgb2JqZWN0JywgQ29udGV4dCk7XHJcblxyXG4gICAgICAgIC8vbGV0IG5ld1VzZXJBdmFpbGFiaWxpdHkgPSBuZXcgVXNlckF2YWlsYWJpbGl0eUNvbnRyb2xsZXIoQ29udGV4dCwgdXNlcklEKTtcclxuXHJcbiAgICAgICAgX3RoaXMuX3VzZXJzMm9ic2VydmUucHVzaChDb250ZXh0KTtcclxuXHJcbiAgICAgICAgLy8gV2hlbiBPYmplY3QgaXMgZGlzY29ubmVjdGVkIHNldCB1c2VyIENvbnRleHQgc3RhdHVzIGFzIHVuYXZhaWxhYmxlXHJcbiAgICAgICAgQ29udGV4dC5vbkRpc2Nvbm5lY3RlZCgoKT0+e1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0T2JzZXJ2ZXIub25EaXNjb25uZWN0ZWRdOiAnLCBDb250ZXh0KTtcclxuXHJcbiAgICAgICAgICBDb250ZXh0LmRhdGEudmFsdWVzWzBdLnZhbHVlID0gJ3VuYXZhaWxhYmxlJztcclxuICAgICAgICAgIENvbnRleHQuc3luYygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXNvbHZlKENvbnRleHQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2Rpc2NvdmVyQW5kU3Vic2NyaWJlTGVnYWN5VXNlcnMobmFtZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgX3RoaXMuX2Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyTmFtZShuYW1lKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLl9kaXNjb3ZlckFuZFN1YnNjcmliZUxlZ2FjeVVzZXJzXSBBbGwgRGF0YU9iamVjdHMgUmVzdWx0JywgcmVzdWx0KTtcclxuICAgICAgICByZXN1bHQuZm9yRWFjaChmdW5jdGlvbihvYmopIHtcclxuICAgICAgICAgIGlmIChvYmouc3RhdHVzID09PSAnbGl2ZScpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0xpdmUgb2JqJywgb2JqKTtcclxuICAgICAgICAgICAgaWYgKCFvYmouaHlwZXJ0eUlEKSB7XHJcbiAgICAgICAgICAgICAgb2JqLmh5cGVydHlJRCA9IG9iai5yZXBvcnRlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fc3Vic2NyaWJlQ29udGV4dChvYmouc2NoZW1hLCBvYmoudXJsKS50aGVuKGZ1bmN0aW9uKHJlc3VsdFN1YnNjcmliZSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dE9ic2VydmVyLl9kaXNjb3ZlckFuZFN1YnNjcmliZUxlZ2FjeVVzZXJzXSBfc3Vic2NyaWJlQ29udGV4dCcsIHJlc3VsdFN1YnNjcmliZSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0U3Vic2NyaWJlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciAnLCBlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdG9wIHRoZSB1c2VyIENvbnRleHQgb2JzZXJ2YXRpb24gZm9yIGEgY2VydGFpbiB1c2VyXHJcbiAqIEBwYXJhbSAge3N0cmluZ30gQ29udGV4dCAgICAgICB0aGUgVXNlckF2YWlsYWJpbGl0eSBEYXRhIE9iamVjdCBPYnNlcnZlciBVUkwgdG8gYmUgdW5vYnNlcnZlZC5cclxuICovXHJcblxyXG4gIHVub2JzZXJ2ZShDb250ZXh0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl91c2VyczJvYnNlcnZlLmZvckVhY2goKHVzZXIsIGluZGV4KSA9PiB7XHJcbiAgICAgIGlmICh1c2VyLnVybCA9PT0gQ29udGV4dCkge1xyXG4gICAgICAgIHVzZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICBfdGhpcy5fdXNlcnMyb2JzZXJ2ZS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29udGV4dE9ic2VydmVyO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7QUFLQTs7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFoQ0E7QUFpQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7QUFHQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTs7OztBQTVSQTtBQUNBO0FBK1JBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///10\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var _utils_EventEmitter_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8);\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Service Framework\n//import Syncher from '../syncher/Syncher';\n// Utils\n //import {divideURL} from '../utils/utils.js';\n// import availability from './availability.js';\n\n/**\r\n* Context Reporter;\r\n* @author Paulo Chainho [paulo-g-chainho@alticelabs.com]\r\n*/\n\nvar ContextReporter =\n/*#__PURE__*/\nfunction (_EventEmitter) {\n _inherits(ContextReporter, _EventEmitter);\n\n function ContextReporter(hypertyURL, bus, configuration, factory, syncher) {\n var _this2;\n\n _classCallCheck(this, ContextReporter);\n\n if (!hypertyURL) throw new Error('The hypertyURL is a needed parameter');\n if (!bus) throw new Error('The MiniBus is a needed parameter');\n if (!configuration) throw new Error('The configuration is a needed parameter');\n _this2 = _possibleConstructorReturn(this, _getPrototypeOf(ContextReporter).call(this, hypertyURL, bus, configuration));\n\n var _this = _assertThisInitialized(_assertThisInitialized(_this2));\n\n console.info('[ContextReporter] started with url: ', hypertyURL);\n _this2.syncher = syncher ? syncher : factory.createSyncher(hypertyURL, bus, configuration); // this.discovery = new Discovery(hypertyURL, bus);\n\n _this2.domain = factory.divideURL(configuration.runtimeURL).domain;\n _this2.contexts = {};\n _this2.contextDescURL = 'hyperty-catalogue://catalogue.' + _this2.domain + '/.well-known/dataschema/Context'; // this.heartbeat = [];\n\n _this2.syncher.onNotification(function (event) {\n var _this = _assertThisInitialized(_assertThisInitialized(_this2));\n\n _this.onNotification(event);\n }); //TODO: uncomment when used with service framework develop branch\n\n\n _this2.syncher.onClose(function (event) {\n console.log('[ContextReporter.onClose]');\n\n var _this = _assertThisInitialized(_assertThisInitialized(_this2));\n\n _this.setStatus(event.id, 'unavailable');\n\n event.ack();\n });\n\n return _this2;\n } //TODO: move to User availability Reporter or to abstract HypertyContextReporter\n\n\n _createClass(ContextReporter, [{\n key: \"start\",\n value: function start() {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this3.syncher.resumeReporters({\n store: true\n }).then(function (reporters) {\n var reportersList = Object.keys(reporters);\n\n if (reportersList.length > 0) {\n console.log('[ContextReporter.start] resuming ', reporters[reportersList[0]]); // set availability to available\n\n _this.contexts = reporters; //TODO:\n\n reportersList.forEach(function (context) {\n _this._onSubscription(_this.contexts[context]);\n });\n resolve(_this.contexts);\n } else {\n console.log('[ContextReporter.start] nothing to resume ', reporters);\n resolve(false);\n }\n }).catch(function (reason) {\n console.error('[ContextReporter] Resume failed | ', reason);\n });\n }).catch(function (reason) {\n reject('[ContextReporter] Start failed | ', reason);\n });\n }\n }, {\n key: \"processNotification\",\n value: function processNotification(event) {\n var _this = this;\n\n console.log('[ContextReporter.processNotification: ', event);\n event.ack();\n }\n /**\r\n * This function is used to create a new status object syncher\r\n * @param {URL.UserURL} contacts List of Users\r\n * @return {Promise}\r\n */\n\n }, {\n key: \"create\",\n value: function create(id, init, resources) {\n var name = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'myContext';\n var reporter = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n var reuseURL = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;\n\n //debugger;\n var _this = this;\n\n var input;\n return new Promise(function (resolve, reject) {\n if (!reporter && !reuseURL) {\n input = {\n resources: resources,\n expires: 30\n };\n } else if (reporter && !reuseURL) {\n input = {\n resources: resources,\n expires: 30,\n reporter: reporter\n };\n } else if (!reporter && reuseURL) {\n input = {\n resources: resources,\n expires: 30,\n reuseURL: reuseURL\n };\n } else {\n input = {\n resources: resources,\n expires: 30,\n reuseURL: reuseURL,\n reporter: reporter\n };\n }\n\n console.info('[ContextReporter.create] lets create a new User availability Context Object ', input);\n\n _this.syncher.create(_this.contextDescURL, [], init, true, false, name, null, input).then(function (context) {\n _this.contexts[id] = context;\n\n _this._onSubscription(context);\n\n resolve(context);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"_onSubscription\",\n value: function _onSubscription(context) {\n context.onSubscription(function (event) {\n console.info('[ContextReporter._onSubscription] accepting: ', event);\n event.accept();\n });\n }\n }, {\n key: \"setContext\",\n value: function setContext(id, newContext) {\n var _this = this;\n\n console.log('THIS [ContextReporter.setContext] before change :', _this.contexts[id]);\n console.log('[ContextReporter.setContext] before change :', _this.contexts[id].data); // _this.contexts[id].data.values[0].value = newContext;\n\n _this.contexts[id].data.values = newContext;\n console.debug('[ContextReporter.setContext] after change :', _this.contexts[id].data);\n\n _this.trigger(id + '-context-update', newContext);\n }\n }]);\n\n return ContextReporter;\n}(_utils_EventEmitter_js__WEBPACK_IMPORTED_MODULE_0__[/* default */ \"a\"]);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (ContextReporter);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY29udGV4dE1hbmFnZXIvQ29udGV4dFJlcG9ydGVyLmpzPzJkZjgiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gU2VydmljZSBGcmFtZXdvcmtcclxuLy9pbXBvcnQgU3luY2hlciBmcm9tICcuLi9zeW5jaGVyL1N5bmNoZXInO1xyXG5cclxuLy8gVXRpbHNcclxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICcuLi91dGlscy9FdmVudEVtaXR0ZXIuanMnO1xyXG4vL2ltcG9ydCB7ZGl2aWRlVVJMfSBmcm9tICcuLi91dGlscy91dGlscy5qcyc7XHJcblxyXG4vLyBpbXBvcnQgYXZhaWxhYmlsaXR5IGZyb20gJy4vYXZhaWxhYmlsaXR5LmpzJztcclxuXHJcbi8qKlxyXG4qIENvbnRleHQgUmVwb3J0ZXI7XHJcbiogQGF1dGhvciBQYXVsbyBDaGFpbmhvIFtwYXVsby1nLWNoYWluaG9AYWx0aWNlbGFicy5jb21dXHJcbiovXHJcbmNsYXNzIENvbnRleHRSZXBvcnRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGh5cGVydHlVUkwsIGJ1cywgY29uZmlndXJhdGlvbiwgZmFjdG9yeSwgc3luY2hlcikge1xyXG4gICAgaWYgKCFoeXBlcnR5VVJMKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBoeXBlcnR5VVJMIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG4gICAgaWYgKCFidXMpIHRocm93IG5ldyBFcnJvcignVGhlIE1pbmlCdXMgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XHJcbiAgICBpZiAoIWNvbmZpZ3VyYXRpb24pIHRocm93IG5ldyBFcnJvcignVGhlIGNvbmZpZ3VyYXRpb24gaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XHJcblxyXG4gICAgc3VwZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWd1cmF0aW9uKTtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGNvbnNvbGUuaW5mbygnW0NvbnRleHRSZXBvcnRlcl0gc3RhcnRlZCB3aXRoIHVybDogJywgaHlwZXJ0eVVSTCk7XHJcblxyXG4gICAgdGhpcy5zeW5jaGVyID0gc3luY2hlciA/IHN5bmNoZXIgOiBmYWN0b3J5LmNyZWF0ZVN5bmNoZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWd1cmF0aW9uKTtcclxuXHJcblxyXG4gICAgLy8gICAgdGhpcy5kaXNjb3ZlcnkgPSBuZXcgRGlzY292ZXJ5KGh5cGVydHlVUkwsIGJ1cyk7XHJcbiAgICB0aGlzLmRvbWFpbiA9IGZhY3RvcnkuZGl2aWRlVVJMKGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTCkuZG9tYWluO1xyXG4gICAgdGhpcy5jb250ZXh0cyA9IHt9O1xyXG5cclxuICAgIHRoaXMuY29udGV4dERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIHRoaXMuZG9tYWluICsgJy8ud2VsbC1rbm93bi9kYXRhc2NoZW1hL0NvbnRleHQnO1xyXG5cclxuXHJcbiAgICAvLyAgICB0aGlzLmhlYXJ0YmVhdCA9IFtdO1xyXG5cclxuICAgIHRoaXMuc3luY2hlci5vbk5vdGlmaWNhdGlvbigoZXZlbnQpID0+IHtcclxuICAgICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgICAgX3RoaXMub25Ob3RpZmljYXRpb24oZXZlbnQpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy9UT0RPOiB1bmNvbW1lbnQgd2hlbiB1c2VkIHdpdGggc2VydmljZSBmcmFtZXdvcmsgZGV2ZWxvcCBicmFuY2hcclxuXHJcbiAgICB0aGlzLnN5bmNoZXIub25DbG9zZSgoZXZlbnQpID0+IHtcclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKCdbQ29udGV4dFJlcG9ydGVyLm9uQ2xvc2VdJyk7XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgIF90aGlzLnNldFN0YXR1cyhldmVudC5pZCwgJ3VuYXZhaWxhYmxlJyk7XHJcbiAgICAgIGV2ZW50LmFjaygpO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy9UT0RPOiBtb3ZlIHRvIFVzZXIgYXZhaWxhYmlsaXR5IFJlcG9ydGVyIG9yIHRvIGFic3RyYWN0IEh5cGVydHlDb250ZXh0UmVwb3J0ZXJcclxuXHJcbiAgc3RhcnQoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICB0aGlzLnN5bmNoZXIucmVzdW1lUmVwb3J0ZXJzKHtzdG9yZTogdHJ1ZX0pLnRoZW4oKHJlcG9ydGVycykgPT4ge1xyXG5cclxuICAgICAgICBsZXQgcmVwb3J0ZXJzTGlzdCA9IE9iamVjdC5rZXlzKHJlcG9ydGVycyk7XHJcblxyXG4gICAgICAgIGlmIChyZXBvcnRlcnNMaXN0Lmxlbmd0aCAgPiAwKSB7XHJcblxyXG4gICAgICAgICAgY29uc29sZS5sb2coJ1tDb250ZXh0UmVwb3J0ZXIuc3RhcnRdIHJlc3VtaW5nICcsIHJlcG9ydGVyc1tyZXBvcnRlcnNMaXN0WzBdXSk7XHJcblxyXG4gICAgICAgICAgLy8gc2V0IGF2YWlsYWJpbGl0eSB0byBhdmFpbGFibGVcclxuXHJcbiAgICAgICAgICBfdGhpcy5jb250ZXh0cyA9IHJlcG9ydGVycztcclxuXHJcbiAgICAgICAgICAvL1RPRE86XHJcbiAgICAgICAgICByZXBvcnRlcnNMaXN0LmZvckVhY2goKGNvbnRleHQpID0+IHtcclxuICAgICAgICAgICAgX3RoaXMuX29uU3Vic2NyaXB0aW9uKF90aGlzLmNvbnRleHRzW2NvbnRleHRdKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHJlc29sdmUoX3RoaXMuY29udGV4dHMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NvbnRleHRSZXBvcnRlci5zdGFydF0gbm90aGluZyB0byByZXN1bWUgJywgcmVwb3J0ZXJzKTtcclxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdbQ29udGV4dFJlcG9ydGVyXSBSZXN1bWUgZmFpbGVkIHwgJywgcmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgIHJlamVjdCgnW0NvbnRleHRSZXBvcnRlcl0gU3RhcnQgZmFpbGVkIHwgJywgcmVhc29uKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByb2Nlc3NOb3RpZmljYXRpb24oZXZlbnQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBjb25zb2xlLmxvZygnW0NvbnRleHRSZXBvcnRlci5wcm9jZXNzTm90aWZpY2F0aW9uOiAnLCBldmVudCk7XHJcblxyXG4gICAgZXZlbnQuYWNrKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBzdGF0dXMgb2JqZWN0IHN5bmNoZXJcclxuICAgKiBAcGFyYW0gIHtVUkwuVXNlclVSTH0gY29udGFjdHMgTGlzdCBvZiBVc2Vyc1xyXG4gICAqIEByZXR1cm4ge1Byb21pc2V9XHJcbiAgICovXHJcbiAgY3JlYXRlKGlkLCBpbml0LCByZXNvdXJjZXMsIG5hbWUgPSAnbXlDb250ZXh0JywgcmVwb3J0ZXIgPSBudWxsLCByZXVzZVVSTCA9IG51bGwpIHtcclxuICAgIC8vZGVidWdnZXI7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGlucHV0O1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKCFyZXBvcnRlciAmJiAhcmV1c2VVUkwpIHtcclxuICAgICAgICBpbnB1dCA9IHtyZXNvdXJjZXM6IHJlc291cmNlcywgZXhwaXJlczogMzB9O1xyXG4gICAgICB9IGVsc2UgaWYgKHJlcG9ydGVyICYmICFyZXVzZVVSTCkge1xyXG4gICAgICAgIGlucHV0ID0ge3Jlc291cmNlczogcmVzb3VyY2VzLCBleHBpcmVzOiAzMCwgcmVwb3J0ZXI6IHJlcG9ydGVyfTtcclxuICAgICAgfSBlbHNlIGlmICghcmVwb3J0ZXIgJiYgcmV1c2VVUkwpIHtcclxuICAgICAgICBpbnB1dCA9IHtyZXNvdXJjZXM6IHJlc291cmNlcywgZXhwaXJlczogMzAsIHJldXNlVVJMOiByZXVzZVVSTH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaW5wdXQgPSB7cmVzb3VyY2VzOiByZXNvdXJjZXMsIGV4cGlyZXM6IDMwLCByZXVzZVVSTDogcmV1c2VVUkwsIHJlcG9ydGVyOiByZXBvcnRlcn07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnNvbGUuaW5mbygnW0NvbnRleHRSZXBvcnRlci5jcmVhdGVdIGxldHMgY3JlYXRlIGEgbmV3IFVzZXIgYXZhaWxhYmlsaXR5IENvbnRleHQgT2JqZWN0ICcsIGlucHV0KTtcclxuICAgICAgX3RoaXMuc3luY2hlci5jcmVhdGUoX3RoaXMuY29udGV4dERlc2NVUkwsIFtdLCBpbml0LCB0cnVlLCBmYWxzZSwgbmFtZSwgbnVsbCwgaW5wdXQpXHJcbiAgICAgICAgLnRoZW4oKGNvbnRleHQpID0+IHtcclxuICAgICAgICAgIF90aGlzLmNvbnRleHRzW2lkXSA9IGNvbnRleHQ7XHJcblxyXG4gICAgICAgICAgX3RoaXMuX29uU3Vic2NyaXB0aW9uKGNvbnRleHQpO1xyXG4gICAgICAgICAgcmVzb2x2ZShjb250ZXh0KTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBfb25TdWJzY3JpcHRpb24oY29udGV4dCkge1xyXG4gICAgY29udGV4dC5vblN1YnNjcmlwdGlvbigoZXZlbnQpID0+IHtcclxuICAgICAgY29uc29sZS5pbmZvKCdbQ29udGV4dFJlcG9ydGVyLl9vblN1YnNjcmlwdGlvbl0gYWNjZXB0aW5nOiAnLCBldmVudCk7XHJcbiAgICAgIGV2ZW50LmFjY2VwdCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRDb250ZXh0KGlkLCBuZXdDb250ZXh0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgY29uc29sZS5sb2coJ1RISVMgW0NvbnRleHRSZXBvcnRlci5zZXRDb250ZXh0XSBiZWZvcmUgY2hhbmdlIDonLCBfdGhpcy5jb250ZXh0c1tpZF0pO1xyXG4gICAgY29uc29sZS5sb2coJ1tDb250ZXh0UmVwb3J0ZXIuc2V0Q29udGV4dF0gYmVmb3JlIGNoYW5nZSA6JywgX3RoaXMuY29udGV4dHNbaWRdLmRhdGEpO1xyXG5cclxuICAgIC8vICAgIF90aGlzLmNvbnRleHRzW2lkXS5kYXRhLnZhbHVlc1swXS52YWx1ZSA9IG5ld0NvbnRleHQ7XHJcblxyXG4gICAgX3RoaXMuY29udGV4dHNbaWRdLmRhdGEudmFsdWVzID0gbmV3Q29udGV4dDtcclxuICAgIGNvbnNvbGUuZGVidWcoJ1tDb250ZXh0UmVwb3J0ZXIuc2V0Q29udGV4dF0gYWZ0ZXIgY2hhbmdlIDonLCBfdGhpcy5jb250ZXh0c1tpZF0uZGF0YSk7XHJcbiAgICBfdGhpcy50cmlnZ2VyKGlkICsgJy1jb250ZXh0LXVwZGF0ZScsIG5ld0NvbnRleHQpO1xyXG5cclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29udGV4dFJlcG9ydGVyO1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUNBO0FBRUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTs7Ozs7QUFJQTs7Ozs7QUFFQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFyQ0E7QUFzQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFFQTs7OztBQS9JQTtBQUNBO0FBbUpBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///11\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXTERNAL MODULE: ./src/syncher/Syncher.js + 11 modules\nvar Syncher = __webpack_require__(13);\n\n// EXTERNAL MODULE: ./src/utils/utils.js\nvar utils = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./src/syncher/NotificationHandler.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* The Notitification Handler is used to handle notifications not processed by the syncher when running in a sandbox.\r\n*/\n\n\nvar NotificationHandler_NotificationHandler =\n/*#__PURE__*/\nfunction () {\n function NotificationHandler(bus) {\n _classCallCheck(this, NotificationHandler);\n\n if (!bus) throw Error('[NotificationHandler Constructor] bus input is mandatory');\n this._bus = bus;\n this._onNotificationHandler = {};\n }\n\n _createClass(NotificationHandler, [{\n key: \"onNotification\",\n value: function onNotification(scheme, callback) {\n this._onNotificationHandler[scheme] = callback;\n }\n }, {\n key: \"onCreate\",\n value: function onCreate(msg) {\n var _this = this; // let resource = msg.from.slice(0, -13); //remove \"/subscription\" from the URL\n\n\n var resource = msg.body.hasOwnProperty('resource') ? msg.body.resource : msg.from.slice(0, -13);\n var dividedURL = Object(utils[\"k\" /* divideURL */])(resource);\n var domain = dividedURL.domain;\n var scheme = resource.split('://')[0];\n\n var _error = function error(reason) {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 400,\n desc: 'Bad Request: ' + reason\n }\n });\n };\n\n if (!msg.body.hasOwnProperty('source')) {\n _error('Missing source');\n }\n\n if (!msg.body.hasOwnProperty('schema')) {\n _error('Missing schema');\n }\n\n if (!msg.body.hasOwnProperty('value')) {\n _error('Missing value');\n }\n\n if (!msg.body.hasOwnProperty('identity')) {\n _error('Missing identity');\n }\n\n var event = {\n type: msg.type,\n from: msg.body.source,\n url: resource,\n domain: domain,\n schema: msg.body.schema,\n value: msg.body.value,\n identity: msg.body.identity,\n to: msg.to,\n via: msg.body.via,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType\n }\n });\n },\n error: function error(reason) {\n _error(reason);\n }\n };\n\n if (_this._onNotificationHandler[scheme]) {\n console.info('[NotificationHandler] NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler[scheme](event);\n }\n }\n }, {\n key: \"onDelete\",\n value: function onDelete(msg) {\n var _this = this; //remove \"/subscription\" from the URL\n\n\n var resource = msg.body.resource;\n var object = _this._observers[resource];\n var unsubscribe = {\n from: _this.owner,\n to: _this._subURL,\n id: msg.id,\n type: 'unsubscribe',\n body: {\n resource: msg.body.resource\n }\n };\n\n _this._bus.postMessage(unsubscribe);\n\n delete _this._observers[resource];\n\n if (object) {\n var event = {\n type: msg.type,\n url: resource,\n identity: msg.body.identity,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //TODO: any other different options for the release process, like accept but nor release local?\n\n\n if (lType === 200) {\n object.delete();\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType,\n source: _this._owner\n }\n });\n }\n };\n\n if (_this._onNotificationHandler) {\n log.log('NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler(event);\n }\n } else {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 404,\n source: _this._owner\n }\n });\n }\n }\n }]);\n\n return NotificationHandler;\n}();\n\n/* harmony default export */ var syncher_NotificationHandler = (NotificationHandler_NotificationHandler);\n// EXTERNAL MODULE: ./src/identity/IdentityManager.js\nvar IdentityManager = __webpack_require__(9);\n\n// EXTERNAL MODULE: ./src/discovery/Discovery.js + 1 modules\nvar Discovery = __webpack_require__(14);\n\n// EXTERNAL MODULE: ./src/discovery/RegistrationStatus.js\nvar RegistrationStatus = __webpack_require__(5);\n\n// CONCATENATED MODULE: ./src/utils/Search.js\nfunction Search_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Search_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Search_createClass(Constructor, protoProps, staticProps) { if (protoProps) Search_defineProperties(Constructor.prototype, protoProps); if (staticProps) Search_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar Search =\n/*#__PURE__*/\nfunction () {\n function Search(discovery, identityManager) {\n Search_classCallCheck(this, Search);\n\n if (!discovery) throw new Error('The discovery component is a needed parameter');\n if (!identityManager) throw new Error('The identityManager component is a needed parameter');\n\n var _this = this;\n\n _this.discovery = discovery;\n _this.identityManager = identityManager;\n }\n\n Search_createClass(Search, [{\n key: \"myIdentity\",\n value: function myIdentity() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.identityManager.discoverUserRegistered().then(function (result) {\n resolve(result);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"hyperties\",\n value: function hyperties(users, schemes, resources) {\n var globalFlag = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n } //TODO: reuse users or the other way around\n\n /**\r\n * List of usersURL to search\r\n * @param {array} users List of UserUR, like this format user:///\r\n * @return {Promise}\r\n */\n\n }, {\n key: \"users\",\n value: function users(usersURLs, providedDomains, schemes, resources) {\n var globalFlag = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n if (!usersURLs) throw new Error('You need to provide a list of users');\n if (!providedDomains) throw new Error('You need to provide a list of domains');\n if (!resources) throw new Error('You need to provide a list of resources');\n if (!schemes) throw new Error('You need to provide a list of schemes');\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.info('[Search] Users: ', usersURLs, usersURLs.length);\n console.info('[Search] Domains: ', providedDomains, providedDomains.length);\n\n if (usersURLs.length === 0) {\n console.info('Don\\'t have users to discovery');\n resolve(usersURLs);\n } else {\n var getUsers = [];\n usersURLs.forEach(function (userURL, index) {\n var currentDomain = providedDomains[index];\n console.info('[Search] Search user ' + userURL + ' for provided domain:', currentDomain);\n\n if (!globalFlag) {\n getUsers.push(_this.discovery.discoverHyperties(userURL, schemes, resources, currentDomain));\n } else {\n getUsers.push(_this.discovery.discoverHypertiesPerUserProfileData(userURL, schemes, resources));\n }\n });\n console.info('Requests promises: ', getUsers);\n Promise.all(getUsers.map(function (promise) {\n return promise.then(function (hyperty) {\n return hyperty;\n }, function (error) {\n return error;\n });\n })).then(function (hyperties) {\n console.info('[Search] Hyperties from new Discovery', hyperties);\n var result = hyperties.map(function (hyperty) {\n if (hyperty.hasOwnProperty('hypertyID')) return hyperty;\n var recent = Object.keys(hyperty).reduceRight(function (a, b) {\n var hypertyDate = new Date(hyperty[b].lastModified);\n var hypertyDateP = new Date(hyperty[a].lastModified);\n\n if (hypertyDateP.getTime() < hypertyDate.getTime()) {\n return b;\n }\n\n return a;\n });\n return hyperty[recent];\n });\n var clean = result.filter(function (hyperty) {\n return hyperty.hasOwnProperty('hypertyID');\n });\n console.log('Requests result: ', clean);\n hyperties.forEach(function (entry) {\n if (entry !== 'No Hyperty was found') {\n return resolve(clean);\n }\n });\n reject('No Hyperty was found');\n }).catch(function (reason) {\n console.error(reason);\n resolve(usersURLs);\n });\n }\n });\n }\n }]);\n\n return Search;\n}();\n\n/* harmony default export */ var utils_Search = (Search);\n// EXTERNAL MODULE: ./src/contextManager/ContextObserver.js\nvar ContextObserver = __webpack_require__(10);\n\n// EXTERNAL MODULE: ./src/contextManager/ContextReporter.js\nvar ContextReporter = __webpack_require__(11);\n\n// CONCATENATED MODULE: ./src/identity/UserProfile.js\nfunction UserProfile_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\r\n* The UserProfile according to User Identity Data Model\r\n*/\nvar UserProfile = function UserProfile(username, userURL, picture, name, locale, profile) {\n UserProfile_classCallCheck(this, UserProfile);\n\n if (username) {\n this.preferred_username = username;\n }\n\n if (picture) {\n this.picture = picture;\n }\n\n if (name) {\n this.name = name;\n }\n\n if (locale) {\n this.locale = locale;\n }\n\n if (userURL) {\n this.userURL = userURL;\n }\n\n if (profile) Object.assign(this, profile);\n};\n\n/* harmony default export */ var identity_UserProfile = (UserProfile);\n// CONCATENATED MODULE: ./src/identity/MessageBodyIdentity.js\nfunction MessageBodyIdentity_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\r\n* The Identity info to be added to Message.Body.Identity\r\n*/\n\n\nvar MessageBodyIdentity_MessageBodyIdentity = function MessageBodyIdentity(username, userURL, picture, name, locale, idp, assertion, profile) {\n MessageBodyIdentity_classCallCheck(this, MessageBodyIdentity);\n\n if (!idp) throw new Error('IDP should be a parameter');\n if (!username) throw new Error('username should be a parameter');\n this.idp = idp;\n\n if (assertion) {\n this.assertion = assertion;\n }\n\n this.userProfile = new identity_UserProfile(username, userURL, picture, name, locale, profile);\n};\n\n/* harmony default export */ var identity_MessageBodyIdentity = (MessageBodyIdentity_MessageBodyIdentity);\n// CONCATENATED MODULE: ./src/chatManager/communication.js\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\nvar CommunicationStatus = {\n OPEN: 'open',\n PENDING: 'pending',\n CLOSED: 'closed',\n PAUSED: 'paused',\n FAILED: 'failed'\n};\nvar communicationObject = {\n startingTime: '',\n status: '',\n participants: {}\n};\nvar communicationChildren = {\n \"parent\": \"communication\",\n \"listener\": \"resources\",\n \"type\": \"HypertyResource\"\n};\n/*\r\nexport let communicationObject = {\r\n id: '',\r\n name: '',\r\n owner: '',\r\n scheme: 'comm',\r\n startingTime: '',\r\n lastModified: '',\r\n duration: '',\r\n status: '',\r\n participants: []\r\n};\r\n*/\n// CONCATENATED MODULE: ./src/chatManager/InvitationsHandler.js\nfunction InvitationsHandler_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction InvitationsHandler_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction InvitationsHandler_createClass(Constructor, protoProps, staticProps) { if (protoProps) InvitationsHandler_defineProperties(Constructor.prototype, protoProps); if (staticProps) InvitationsHandler_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* To manage Group Chat Invitations\r\n* @author Paulo Chainho [paulo-g-chainho@alticelabs.com]\r\n* @version 0.1.0\r\n*/\n// TODO: have an instance per ChatController\nvar InvitationsHandler =\n/*#__PURE__*/\nfunction () {\n function InvitationsHandler(hypertyURL) {\n InvitationsHandler_classCallCheck(this, InvitationsHandler);\n\n if (!hypertyURL) throw Error('hypertyURL is a necessary dependecy');\n\n var _this = this;\n\n _this._hypertyURL = hypertyURL;\n _this._pending = {}; // All pending invitations\n }\n\n InvitationsHandler_createClass(InvitationsHandler, [{\n key: \"inviteDisconnectedHyperties\",\n\n /**\r\n * This function is used to handle notifications for disconnected Hy+erties.\r\n * @param {DiscoveredObject[]} disconnected array of discovered hyperties that are disconnected\r\n * @param {DataObjectReporter} DataObjectReporter Data Object Reporter addressed by invitations\r\n */\n value: function inviteDisconnectedHyperties(disconnected, dataObjectReporter) {\n var _this = this;\n\n console.log('[GroupChatManager.InvitationsHandler.inviteDisconnectedHyperties] lets invite ', disconnected);\n disconnected.forEach(function (disconnectedHyperty) {\n if (!_this._pending[dataObjectReporter]) {\n _this._pending[dataObjectReporter] = {};\n }\n\n _this._pending[dataObjectReporter][disconnectedHyperty.data.hypertyID] = disconnectedHyperty;\n disconnectedHyperty.onLive(_this._hypertyURL, function () {\n console.log('[GroupChatManager.create] disconnected Hyperty is back to live', disconnectedHyperty);\n dataObjectReporter.inviteObservers([disconnectedHyperty.data.hypertyID]);\n disconnectedHyperty.unsubscribeLive(_this._hypertyURL);\n delete _this._pending[dataObjectReporter][disconnectedHyperty.data.hypertyID];\n });\n });\n }\n /**\r\n * This function is used to process sent invitations. In case invitations are not acknowledge by recipient it will be handled as a disconnected hyperty\r\n * @param {DiscoveredObject[]} live array of discovered hyperties that are or were live\r\n * @param {DataObjectReporter} DataObjectReporter Data Object Reporter addressed by invitations\r\n */\n\n }, {\n key: \"processInvitations\",\n value: function processInvitations(live, dataObjectReporter) {\n var _this2 = this;\n\n var _this = this;\n\n var invitations = dataObjectReporter.invitations || [];\n console.log('[GroupChatManager.InvitationsHandler.processInvitations] waiting for replies ', invitations, this._invitationsResponse);\n invitations.forEach(function (invitation) {\n invitation.then(function (result) {\n console.log('[GroupChatManager.InvitationsHandler.processInvitations] - OK: ', result, _this2._invitationsResponse);\n\n if (_this2._invitationsResponse) {\n _this2._invitationsResponse(result);\n }\n }).catch(function (result) {\n console.log('[GroupChatManager.InvitationsHandler.processInvitations] - NOT OK: ', result, _this2._invitationsResponse);\n\n if (_this2._invitationsResponse) {\n _this2._invitationsResponse(result);\n }\n\n _this.inviteDisconnectedHyperties([live[result.invited]], dataObjectReporter);\n });\n });\n }\n }, {\n key: \"resumeDiscoveries\",\n value: function resumeDiscoveries(discoveryEngine, groupChat) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var live = {};\n var liveHyperties = [];\n var disconnected = [];\n var unsubscriptonPromises = [];\n discoveryEngine.resumeDiscoveries().then(function (discoveries) {\n console.log('[GroupChatManager.InvitationsHandler.resumeDiscoveries] found: ', discoveries);\n discoveries.forEach(function (discovery) {\n if (discovery.data.resources && discovery.data.resources[0] === 'chat') {\n console.log('[GroupChatManager.InvitationsHandler.resumeDiscoveries] resuming: ', discovery);\n\n if (discovery.data.status === 'live') {\n // previously discovered object is now live\n live[discovery.data.hypertyID] = discovery;\n liveHyperties.push(discovery.data.hypertyID);\n unsubscriptonPromises.push(discovery.unsubscribeLive(_this._hypertyURL));\n } else {\n // previously discovered object is still disconnected\n disconnected.push(discovery);\n }\n }\n });\n if (disconnected.length > 0) _this.inviteDisconnectedHyperties(disconnected, groupChat);\n\n if (Object.keys(live).length > 0) {\n groupChat.inviteObservers(liveHyperties);\n if (groupChat.invitations.length > 0) _this.processInvitations(live, groupChat);\n Promise.all(unsubscriptonPromises).then(function () {\n resolve();\n });\n } else resolve();\n });\n }).catch(function (reason) {\n reject('[GroupChatManager.InvitationsHandler.resumeDiscoveries] failed | ', reason);\n });\n }\n /**\r\n * This function is used to remove and clean all pending invitations.\r\n * @param {DataObjectReporter} DataObjectReporter Data Object Reporter addressed by invitations\r\n * @return {Promise} return a promise when all unsubscriptons for pending invitations are finished\r\n */\n\n }, {\n key: \"cleanInvitations\",\n value: function cleanInvitations(dataObjectReporter) {\n var _this = this;\n\n var chatInvitations = _this._pending[dataObjectReporter];\n console.log('[GroupChatManager.InvitationsHandler.cleanInvitations] ', chatInvitations);\n\n if (chatInvitations) {\n return new Promise(function (resolve, reject) {\n var pendingInvitations = Object.keys(chatInvitations);\n var unsubscriptonPromises = [];\n pendingInvitations.forEach(function (invitation) {\n unsubscriptonPromises.push(chatInvitations[invitation].unsubscribeLive(_this._hypertyURL));\n });\n Promise.all(pendingInvitations).then(function () {\n resolve();\n });\n });\n } else return Promise.resolve();\n }\n }, {\n key: \"invitationResponse\",\n set: function set(callback) {\n this._invitationsResponse = callback;\n }\n }]);\n\n return InvitationsHandler;\n}();\n\n/* harmony default export */ var chatManager_InvitationsHandler = (InvitationsHandler);\n// CONCATENATED MODULE: ./src/chatManager/ChatController.js\nfunction ChatController_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ChatController_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ChatController_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChatController_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChatController_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* The Group Chat API is used to control a Group Chat instance.\r\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\r\n* @version 0.1.0\r\n*/\n//import { UserInfo } from './UserInfo';\n\n\n\nvar ChatController_ChatController =\n/*#__PURE__*/\nfunction () {\n function ChatController(syncher, discovery, domain, search, identity, manager) {\n ChatController_classCallCheck(this, ChatController);\n\n if (!syncher) throw Error('Syncher is a necessary dependecy');\n if (!discovery) throw Error('Discover is a necessary dependecy');\n if (!domain) throw Error('Domain is a necessary dependecy');\n if (!search) throw Error('Search is a necessary dependecy');\n\n var _this = this;\n\n _this._syncher = syncher;\n _this.discovery = discovery;\n _this.search = search;\n _this.myIdentity = identity;\n _this.controllerMode = 'reporter';\n _this.child_cseq = 0;\n _this.domain = domain;\n _this._manager = manager;\n var hypertyURL = syncher.owner;\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication';\n _this._invitationsHandler = new chatManager_InvitationsHandler(hypertyURL);\n }\n\n ChatController_createClass(ChatController, [{\n key: \"_setOnAddChildListener\",\n value: function _setOnAddChildListener(dataObject) {\n var _this = this;\n\n dataObject.onAddChild(function (child) {\n _this.child_cseq += 1;\n console.info('[ChatManager.ChatController._setOnAddChildListener] new Child received: ', child);\n if (_this._onMessage) _this._onMessage(child);\n });\n }\n }, {\n key: \"_onSubscribe\",\n value: function _onSubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n event.accept();\n console.log('[ChatManager.ChatController.onSubscribe] event', event, dataObjectReporter.url);\n console.log('[ChatManager.ChatController.onSubscribe] New user has subscribe this object: ', dataObjectReporter.data, event.identity);\n var identity = JSON.parse(JSON.stringify(event.identity));\n\n if (identity.hasOwnProperty('assertion')) {\n delete identity.assertion;\n }\n\n var userInfo = {\n hypertyURL: event.url,\n domain: event.domain,\n identity: identity\n };\n var userURL = event.identity.userProfile.guid;\n console.log('[ChatManager.ChatController.onSubscribe] new participant', userInfo);\n\n if (event.identity.legacy) {\n userInfo.legacy = event.identity.legacy;\n }\n\n dataObjectReporter.data.participants[userURL] = userInfo;\n console.log('[ChatManager.ChatController.onSubscribe] communicationObject OBJ chatcontroller', dataObjectReporter.data.participants);\n console.log('[ChatManager.ChatController.onSubscribe - onSubscription] ', userInfo); // console.log('[ChatManager.ChatController.onSubscribe - this._onUserAdded] ', this._onUserAdded);\n\n if (this._onUserAdded) this._onUserAdded(userInfo);\n }\n }, {\n key: \"_onUnsubscribe\",\n value: function _onUnsubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n console.log('[ChatManager.ChatController.onUnsubscribe] event', event, dataObjectReporter.url);\n var participant = event.identity.userProfile;\n console.log('[ChatManager.ChatController.onUnsubscribe] participant left', participant);\n\n if (event.identity.legacy) {\n participant.legacy = event.identity.legacy;\n }\n\n delete dataObjectReporter.data.participants[participant.userURL];\n console.log('[ChatManager.ChatController.onUnsubscribe - this._onUserRemoved] ', this.onUserRemoved);\n if (this._onUserRemoved) this._onUserRemoved(participant);\n }\n /**\r\n * This function is used to send a file.\r\n * @param {string} file Is the file to be sent.\r\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\r\n */\n\n }, {\n key: \"sendFile\",\n value: function sendFile(file) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n var identity = {\n userProfile: _this.myIdentity\n };\n dataObject.addHypertyResource('resources', 'file', file, identity).then(function (resourceFile) {\n var identity = {\n userProfile: _this.myIdentity\n };\n var fileSentEvt = {\n value: resourceFile,\n identity: identity,\n resource: resourceFile\n };\n var reporterStatus = new RegistrationStatus[\"a\" /* default */](dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus); // recursive function to sync with chat reporter\n\n var share2Reporter = function share2Reporter(file, subscriber, evt, status) {\n var statusOfReporter = status;\n file.sharingStatus.then(resolve(evt)).catch(function (result) {\n console.log('[ChatManager.ChatController.sendFile] share failed: ', result);\n statusOfReporter.onLive(subscriber, function () {\n statusOfReporter.unsubscribeLive(subscriber);\n file.share(true);\n share2Reporter(file, subscriber, evt, statusOfReporter);\n }); //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\n });\n };\n\n share2Reporter(resourceFile, _this._manager._hypertyURL, fileSentEvt, reporterStatus);\n });\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n }\n /**\r\n * This function is used to send a chat message.\r\n * @param {string} message Is the ChatMessage to be sent.\r\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\r\n */\n\n }, {\n key: \"send\",\n value: function send(message, identity) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n // let _dataObjectChild;\n _this.child_cseq += 1;\n var msg = {\n /* url: dataObject.data.url,\r\n cseq: _this.child_cseq,\r\n reporter: dataObject.data.reporter,\r\n schema: dataObject.data.schema,\r\n name: dataObject.data.name,\r\n created : new Date().toJSON(),*/\n type: 'chat',\n content: message\n };\n var sender = identity ? identity : {\n userProfile: _this.myIdentity\n }; // TODO: change chatmessages to resource - chat, file\n // TODO: change message to hypertyResource - https://github.com/reTHINK-project/dev-service-framework/tree/develop/docs/datamodel/data-objects/hyperty-resource\n // TODO: handle with multiple resources - if the \"message\" will be different for each type of resources\n\n dataObject.addChild(msg, sender).then(function (dataObjectChild) {\n console.log('[ChatManager.ChatController][addChild - Chat Message]: ', dataObjectChild); //resolve(dataObjectChild);\n //TODO: move to separate function\n\n var msg = {\n childId: dataObjectChild._childId,\n from: dataObjectChild._owner,\n value: dataObjectChild.data,\n type: 'create',\n identity: sender\n };\n var reporterStatus = new RegistrationStatus[\"a\" /* default */](dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus); // recursive function to sync with chat reporter\n\n var share2Reporter = function share2Reporter(child, subscriber, msg, status) {\n var statusOfReporter = status;\n child.sharingStatus.then(resolve(msg)).catch(function (result) {\n statusOfReporter.onLive(subscriber, function () {\n statusOfReporter.unsubscribeLive(subscriber);\n child.share(true);\n share2Reporter(child, subscriber, msg, statusOfReporter);\n }); //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\n });\n };\n\n share2Reporter(dataObjectChild, _this._manager._hypertyURL, msg, reporterStatus);\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n });\n }\n /**\r\n * [onChange description]\r\n * @param {Function} callback [description]\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onChange\",\n value: function onChange(callback) {\n var _this = this;\n\n _this._onChange = callback;\n }\n /**\r\n * This function is used to receive new messages.\r\n * @param {Function} callback Function to handle with new messages\r\n * @return {Communication.ChatMessage} m\r\n */\n\n }, {\n key: \"onMessage\",\n value: function onMessage(callback) {\n var _this = this;\n\n _this._onMessage = callback;\n }\n /**\r\n * [onUserAdded description]\r\n * @param {Function} callback [description]\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onUserAdded\",\n value: function onUserAdded(callback) {\n var _this = this;\n\n _this._onUserAdded = callback;\n }\n /**\r\n * When the an user was removed\r\n * @param {Function} callback Function handle with the removed user\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onUserRemoved\",\n value: function onUserRemoved(callback) {\n var _this = this;\n\n _this._onUserRemoved = callback;\n }\n /**\r\n * This function is used to receive requests to close the Group Chat instance.\r\n * @return {DeleteEvent} The DeleteEvent fired by the Syncher when the Chat is closed.\r\n */\n\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n var _this = this;\n\n _this._onClose = callback;\n }\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n var _this = this;\n\n _this._onResponse = callback;\n }\n /**\r\n * This function is used to add / invite new user on an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\r\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\r\n */\n\n }, {\n key: \"addUser\",\n value: function addUser(users) {\n var _this = this;\n\n var haveEmptyElements = function haveEmptyElements(element) {\n console.log('Element:', element.length);\n return element.length !== 0;\n };\n\n var notFoundElements = function notFoundElements(element) {\n console.log('user not found: ', element);\n return !(element instanceof String);\n };\n\n return new Promise(function (resolve, reject) {\n if (users.filter(haveEmptyElements).length === 0) {\n return reject('Don\\'t have users to invite');\n }\n\n console.info('[ChatManager.ChatController.addUsers ]: ', users);\n /*_this.search.users(users, domains, ['comm'], ['chat'])\r\n .then((hypertiesIDs) => {\r\n if (hypertiesIDs.filter(notFoundElements).length === 0) {\r\n throw 'User(s) not found';\r\n }\r\n let selectedHyperties = hypertiesIDs.map((hyperty) => {\r\n return hyperty.hypertyID;\r\n });*/\n\n var usersDiscovery = [];\n var disconnected = [];\n var live = {};\n users.forEach(function (user) {\n var userDiscoveryPromise = _this.discovery.discoverHypertiesDO(user.user, ['comm'], ['chat'], user.domain);\n\n usersDiscovery.push(userDiscoveryPromise);\n });\n Promise.all(usersDiscovery).then(function (userDiscoveryResults) {\n console.log('[ChatManager.ChatController.addUsers] Users Discovery Results->', userDiscoveryResults);\n var selectedHyperties = [];\n userDiscoveryResults.forEach(function (userDiscoveryResult) {\n userDiscoveryResult.forEach(function (discovered) {\n if (discovered.data.status === 'live') {\n selectedHyperties.push(discovered.data.hypertyID);\n live[discovered.data.hypertyID] = discovered;\n } else if (disconnected.length < 5) disconnected.push(discovered);\n });\n });\n console.info('[ChatManager.ChatController]------------------------ Syncher Create ---------------------- \\n');\n console.info('[ChatManager.ChatController]Selected Hyperties: !!! ', selectedHyperties);\n console.info(\"Have \".concat(selectedHyperties.length, \" users;\")); // console.info('[ChatManager] HypertiesIDs ', hypertiesIDs);\n\n var dataObject = _this.controllerMode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n if (disconnected.length > 0) _this._invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObject);\n dataObject.inviteObservers(selectedHyperties);\n if (dataObject.invitations.length > 0) _this._invitationsHandler.processInvitations(live, dataObject);\n return;\n }).then(function () {\n console.info('[ChatManager.ChatController]Are invited with success ' + users.length + ' users;');\n resolve(true);\n }).catch(function (reason) {\n console.error('An error occurred when trying to invite users;\\n', reason);\n reject(reason);\n });\n });\n }\n /**\r\n * This function is used to request the Reporter to add / invite new user on an existing Group Chat instance.\r\n * Only Observers are allowed to use this function.\r\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\r\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\r\n */\n\n }, {\n key: \"addUserReq\",\n value: function addUserReq(users) {\n var _this = this; //check is Observer and invoke observer.execute() with new promise\n\n\n var haveEmptyElements = function haveEmptyElements(element) {\n console.log('Element:', element.length);\n return element.length !== 0;\n };\n\n return new Promise(function (resolve, reject) {\n if (users.filter(haveEmptyElements).length === 0) {\n return reject('[ChatManager.ChatController.addUserReq] Don\\'t have users to add');\n }\n\n if (!_this.controllerMode === 'observer') {\n return reject('[ChatManager.ChatController.addUserReq] only allowed to Chat Observer');\n\n var addUser = _this.addUser(users);\n\n if (_this._dataObjectObserver) {\n addUser = _this._dataObjectObserver.execute('addUser', users);\n }\n\n addUser.then(function () {\n console.info('[ChatManager.ChatController.addUserReq] Request accepted by Reporter ');\n resolve(true);\n }).catch(function (reason) {\n console.error('[ChatManager.ChatController.addUserReq] Request rejected by Reporter;\\n', reason);\n reject(reason);\n });\n }\n });\n }\n }, {\n key: \"onInvitationResponse\",\n value: function onInvitationResponse(callback) {\n var _this = this;\n\n _this._onInvitationResponse = callback;\n _this._invitationsHandler.invitationResponse = callback;\n }\n /**\r\n * This function is used to remove a user from an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @return { boolean} Promise with the status\r\n */\n\n /**\r\n * This function is used to remove a user from an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @param {URL.UserURL} user User to be removed from the Group Chat that is identified with reTHINK User URL.\r\n * @return { boolean} It returns as a Promise true if successfully removed or false otherwise.\r\n */\n\n }, {\n key: \"removeUser\",\n value: function removeUser(user) {\n // TODO: implement the removeUser;\n console.log('[ChatManager.ChatController]Not yet implemented: ', user);\n }\n /**\r\n * This function is used to close an existing Group Chat instance.\r\n * Only available to Chat Group Reporters i.e. the Hyperty instance that created the Group Chat.\r\n * @return {Boolean} It returns as a Promise true if successfully closed or false otherwise.\r\n */\n\n }, {\n key: \"close\",\n value: function close() {\n var del = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n // TODO: the dataObjectReporter.delete should be a Promise;\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this.controllerMode === 'reporter') {\n // reporter\n _this._invitationsHandler.cleanInvitations(_this.dataObjectReporter).then(function () {\n if (!del) {\n _this._manager.communicationObject.status = 'closed';\n resolve(true);\n } else {\n try {\n delete _this._manager._reportersControllers[_this.dataObjectReporter.url];\n\n _this.dataObjectReporter.delete();\n\n resolve(true);\n if (_this._onClose) _this._onClose({\n code: 200,\n desc: 'deleted',\n url: _this.dataObjectReporter.url\n });\n } catch (e) {\n console.error(e);\n reject(false);\n }\n }\n });\n } else {\n // observer\n if (del) {\n try {\n delete _this._manager._observersControllers[_this.dataObjectObserver.url];\n\n _this.dataObjectObserver.unsubscribe();\n\n resolve(true);\n } catch (e) {\n console.error(e);\n reject(false);\n }\n } else {\n // TODO: send message \n resolve(true);\n }\n }\n });\n }\n }, {\n key: \"invitationsHandler\",\n get: function get() {\n return this._invitationsHandler;\n }\n }, {\n key: \"url\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter.url : this.dataObjectObserver.url;\n }\n }, {\n key: \"dataObjectReporter\",\n set: function set(dataObjectReporter) {\n if (!dataObjectReporter) throw new Error('[ChatController] The data object reporter is necessary parameter ');\n\n var _this = this;\n\n _this.controllerMode = 'reporter'; // Handler to process received files\n // dataObjectReporter.onResponse(function(event) {\n // console.log('[DataObjectReporter - onResponse]', event);\n // if (_this._onInvitationResponse) {\n // _this._onInvitationResponse(event);\n // }\n //\n // });\n\n dataObjectReporter.onSubscription(function (event) {\n switch (event.type) {\n case 'subscribe':\n _this._onSubscribe(event);\n\n break;\n\n case 'unsubscribe':\n _this._onUnsubscribe(event);\n\n break;\n }\n });\n\n _this._setOnAddChildListener(dataObjectReporter);\n\n dataObjectReporter.onRead(function (event) {\n event.accept();\n });\n dataObjectReporter.onExecute(function (event) {\n switch (event.method) {\n case 'addUser':\n _this.addUser(event.params[0]).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n case 'removeUser':\n _this.removeUser(event.params).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n default:\n event.reject('[ChatController.onExecute] Chat method execution not accepted by Reporter');\n break;\n }\n });\n _this._dataObjectReporter = dataObjectReporter;\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectReporter;\n }\n }, {\n key: \"messages\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this._dataObjectReporter._childrenObjects : this._dataObjectObserver._childrenObjects;\n }\n }, {\n key: \"dataObjectObserver\",\n set: function set(dataObjectObserver) {\n var _this = this;\n\n _this.controllerMode = 'observer';\n _this._dataObjectObserver = dataObjectObserver;\n dataObjectObserver.onChange('*', function (event) {\n console.info('[ChatManager.ChatController]Observer - onChange', event);\n\n if (event.field.includes('participants')) {\n switch (event.cType) {\n case 'add':\n if (_this._onUserAdded) _this._onUserAdded(event);\n break;\n\n case 'remove':\n if (_this._onUserRemoved) _this._onUserRemoved(event);\n break;\n }\n }\n\n if (_this._onChange) _this._onChange(event);\n });\n\n _this._setOnAddChildListener(dataObjectObserver); // let childrens = dataObjectObserver.childrens;\n // Object.keys(childrens).forEach((child) => {\n // if (_this._onMessage) _this._onMessage({\n // childId: child,\n // identity: childrens[child].identity,\n // value: childrens[child].data\n // });\n // })\n\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectObserver;\n }\n }, {\n key: \"dataObject\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter : this.dataObjectObserver;\n }\n }, {\n key: \"closeEvent\",\n set: function set(event) {\n var _this = this;\n\n _this._closeEvent = event;\n if (_this._onClose) _this._onClose(event);\n },\n get: function get() {\n var _this = this;\n\n return _this._closeEvent;\n }\n }]);\n\n return ChatController;\n}();\n\n/* harmony default export */ var chatManager_ChatController = (ChatController_ChatController);\n// CONCATENATED MODULE: ./src/chatManager/UserInfo.js\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction UserInfo_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\nvar UserInfo_UserInfo = function UserInfo(hypertyURL, domain, identity) {\n var _ref;\n\n UserInfo_classCallCheck(this, UserInfo);\n\n var completeIdentity = Object(utils[\"i\" /* deepClone */])(identity);\n\n if (!identity.hasOwnProperty('userProfile')) {\n completeIdentity['userProfile'] = identity;\n }\n\n return _ref = {\n hypertyURL: hypertyURL,\n domain: domain\n }, _defineProperty(_ref, \"domain\", domain), _defineProperty(_ref, \"identity\", completeIdentity), _ref;\n};\n// CONCATENATED MODULE: ./src/chatManager/ChatManager.js\nfunction ChatManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ChatManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ChatManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) ChatManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) ChatManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Service Framework\n//import IdentityManager from '../identityManager/IdentityManager';\n//import RegistrationStatus from '../discovery/RegistrationStatus';\n//import Discovery from '../discovery/Discovery';\n//import Syncher from '../syncher/Syncher';\n// Utils\n//import {divideURL} from '../utils/utils';\n//import Search from '../utils/Search';\n// Internals\n\n\n\n/**\r\n* Hyperty Group Chat Manager API (HypertyChat)\r\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\r\n* @version 0.1.0\r\n*/\n\nvar ChatManager_ChatManager =\n/*#__PURE__*/\nfunction () {\n function ChatManager(myUrl, bus, configuration, syncher, factory) {\n ChatManager_classCallCheck(this, ChatManager);\n\n if (!myUrl) throw new Error('[ChatManager.constructor] The myUrl is a needed parameter');\n if (!bus) throw new Error('[ChatManager.constructor] The MiniBus is a needed parameter');\n if (!configuration) throw new Error('[ChatManager.constructor] The configuration is a needed parameter');\n\n var _this = this;\n\n if (!syncher) {\n syncher = factory.createSyncher(myUrl, bus, configuration);\n }\n\n _this._runtimeURL = configuration.runtimeURL;\n var domain = factory.divideURL(_this._runtimeURL).domain;\n var discovery = factory.createDiscovery(myUrl, configuration.runtimeURL, bus);\n var identityManager = factory.createIdentityManager(myUrl, configuration.runtimeURL, bus);\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication';\n _this._reportersControllers = {};\n _this._observersControllers = {};\n _this._myUrl = myUrl;\n _this._bus = bus;\n _this._syncher = syncher;\n _this._domain = domain;\n _this.discovery = discovery;\n _this.identityManager = identityManager;\n _this.currentIdentity;\n _this.search = factory.createSearch(discovery, identityManager);\n _this.communicationObject = communicationObject;\n _this.communicationChildren = communicationChildren;\n console.log('[ChatManager] Discover ', discovery);\n console.log('[ChatManager] Identity Manager ', identityManager);\n }\n\n ChatManager_createClass(ChatManager, [{\n key: \"processNotification\",\n value: function processNotification(event) {\n var _this = this;\n\n console.log('[ChatManager.processNotification: ', event);\n\n if (event.type === 'create') {\n // TODO: replace the 100 for Message.Response\n // event.ack(200);\n if (_this._onInvitation) {\n _this._onInvitation(event);\n }\n }\n\n if (event.type === 'delete') {\n // TODO: replace the 200 for Message.Response\n event.ack(200);\n _this._observersControllers[event.url].closeEvent = event;\n delete _this._observersControllers[event.url];\n _this._observersControllers.closeEvent = event;\n _this.communicationObject = communicationObject;\n\n for (var url in this._reportersControllers) {\n this._reportersControllers[url].close(event);\n }\n\n for (var _url in this._observersControllers) {\n this._observersControllers[_url].close(event);\n }\n }\n }\n }, {\n key: \"myIdentity\",\n value: function myIdentity(identity) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.info('[ChatManager.myIdentity]');\n if (identity) return resolve(identity);\n\n if (_this._myUrl.includes('hyperty://')) {\n _this.identityManager.discoverUserRegistered().then(function (identity) {\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n } else {\n _this.identityManager.discoverIdentityPerIdP().then(function (identity) {\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n }\n });\n }\n /**\r\n * This function is used to create a new Group Chat providing the name and the identifiers of users to be invited.\r\n * @param {string} name Is a string to identify the Group Chat\r\n * @param {array} users Array of users to be invited to join the Group Chat. Users are identified with reTHINK User URL, like this format user:///\r\n * @return {ChatController} A ChatController object as a Promise.\r\n */\n\n }, {\n key: \"create\",\n value: function create(name, users) {\n var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var _this = this;\n\n var syncher = _this._syncher;\n return new Promise(function (resolve, reject) {\n _this.communicationObject = communicationObject;\n _this.communicationObject.cseq = 1;\n _this.communicationObject.startingTime = new Date().toJSON();\n _this.communicationObject.status = CommunicationStatus.OPEN;\n var myIdentity;\n\n _this.myIdentity().then(function (identity) {\n myIdentity = identity;\n console.log('[ChatManager.create ] My Identity', identity); // let url = _this.communicationObject.reporter;\n\n var userInfo = new UserInfo_UserInfo(_this._myUrl, _this._domain, identity); // Add my identity\n\n _this.communicationObject.participants[identity.guid] = userInfo;\n console.log('[ChatManager.create ] participants: ', _this.communicationObject.participants);\n console.log('[ChatManager.create ] communicationObject', _this.communicationObject);\n console.info('[ChatManager.create] searching ' + users); //let usersSearch = _this.search.users(users, domains, ['comm'], ['chat']);\n\n var usersDiscovery = [];\n var disconnected = [];\n var live = {};\n users.forEach(function (user) {\n var userDiscoveryPromise = _this.discovery.discoverHypertiesDO(user.user, ['comm'], ['chat'], user.domain);\n\n usersDiscovery.push(userDiscoveryPromise); //if (user.user.includes('://')) mutual = false;\n });\n Promise.all(usersDiscovery).then(function (userDiscoveryResults) {\n console.log('[ChatManager.create] Users Discovery Results->', userDiscoveryResults);\n var selectedHyperties = [];\n userDiscoveryResults.forEach(function (userDiscoveryResult) {\n userDiscoveryResult.forEach(function (discovered) {\n if (discovered.data.status === 'live') {\n selectedHyperties.push(discovered.data.hypertyID);\n live[discovered.data.hypertyID] = discovered;\n } else {\n // To control the number of subscriptions to disconnected devices\n if (disconnected.length < 5) {\n disconnected.push(discovered);\n }\n }\n });\n });\n /* return usersSearch;\r\n }).then((hypertiesIDs) => {\r\n let selectedHyperties = hypertiesIDs.map((hyperty) => {\r\n return hyperty.hypertyID;\r\n }); */\n\n console.info('[ChatManager] ---------------------- Syncher Create ---------------------- \\n');\n console.info('[ChatManager] Selected Hyperties: !!! ', selectedHyperties);\n console.info(\"Have \".concat(selectedHyperties.length, \" users;\"));\n var mutual = extra.mutual ? extra.mutual : true;\n var input = Object.assign({\n resources: ['chat'],\n mutual: mutual\n }, extra);\n delete input.name;\n if (_this.offline) input.offline = _this.offline;\n console.info('[ChatManager] input data:', input);\n return syncher.create(_this._objectDescURL, selectedHyperties, _this.communicationObject, true, false, name, {}, input);\n }).then(function (dataObjectReporter) {\n console.info('[ChatManager] 3. Return Create Data Object Reporter', dataObjectReporter);\n var chatController = new chatManager_ChatController(syncher, _this.discovery, _this._domain, _this.search, myIdentity, _this);\n chatController.dataObjectReporter = dataObjectReporter;\n _this._reportersControllers[dataObjectReporter.url] = chatController;\n console.log('[ChatManager] chatController invitationsHandler: ', chatController.invitationsHandler); // process invitations to handle not received invitations\n\n if (dataObjectReporter.invitations.length > 0) {\n chatController.invitationsHandler.processInvitations(live, dataObjectReporter);\n } // If any invited User is disconnected let's wait until it is connected again\n\n\n if (disconnected.length > 0) chatController.invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObjectReporter);\n resolve(chatController);\n }).catch(function (reason) {\n reject(reason);\n });\n }).catch(function (reason) {\n console.log('[ChatManager.create] MyIdentity Error:', reason);\n return reject(reason);\n });\n });\n }\n /**\r\n * This function is used to handle notifications about incoming invitations to join a Group Chat.\r\n * @param {Function} CreateEvent The CreateEvent fired by the Syncher when an invitaion is received\r\n */\n\n }, {\n key: \"onInvitation\",\n value: function onInvitation(callback) {\n var _this = this;\n\n _this._onInvitation = callback;\n }\n /**\r\n * This function is used to join a Group Chat.\r\n * @param {URL.CommunicationURL} invitationURL The Communication URL of the Group Chat to join that is provided in the invitation event\r\n * @return {ChatController} It returns the ChatController object as a Promise\r\n */\n\n }, {\n key: \"join\",\n value: function join(invitationURL) {\n var mutual = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var identity = arguments.length > 2 ? arguments[2] : undefined;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var syncher = _this._syncher;\n var myIdentity;\n console.info('[ChatManager] ------------------------ Syncher subscribe ---------------------- \\n');\n console.info('invitationURL', invitationURL);\n\n _this.myIdentity(identity).then(function (identity) {\n myIdentity = identity;\n var input = {\n schema: _this._objectDescURL,\n resource: invitationURL,\n store: true,\n p2p: false,\n mutual: mutual,\n domain_subscription: true,\n identity: identity\n };\n if (_this.offline) input.offline = _this.offline;\n return syncher.subscribe(input);\n }).then(function (dataObjectObserver) {\n console.info('Data Object Observer: ', dataObjectObserver);\n var chatController = new chatManager_ChatController(syncher, _this.discovery, _this._domain, _this.search, myIdentity, _this);\n resolve(chatController);\n chatController.dataObjectObserver = dataObjectObserver;\n _this._observersControllers[dataObjectObserver.url] = chatController;\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"offline\",\n set: function set(offline) {\n this._offline = offline;\n },\n get: function get() {\n return this._offline ? this._offline : false;\n }\n }]);\n\n return ChatManager;\n}();\n\n/* harmony default export */ var chatManager_ChatManager = (ChatManager_ChatManager);\n// CONCATENATED MODULE: ./src/chatManager/Chat.js\nfunction Chat_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Chat_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Chat_createClass(Constructor, protoProps, staticProps) { if (protoProps) Chat_defineProperties(Constructor.prototype, protoProps); if (staticProps) Chat_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* The Group Chat API is used to control a Group Chat instance.\r\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\r\n* @version 0.1.0\r\n*/\n//import { UserInfo } from './UserInfo';\n//import RegistrationStatus from '../discovery/RegistrationStatus';\n//import InvitationsHandler from './InvitationsHandler';\nvar Chat =\n/*#__PURE__*/\nfunction () {\n function Chat(syncher, domain, identity, manager) {\n Chat_classCallCheck(this, Chat);\n\n if (!syncher) throw Error('Syncher is a necessary dependecy'); // if (!discovery) throw Error('Discover is a necessary dependecy');\n\n if (!domain) throw Error('Domain is a necessary dependecy'); // if (!search) throw Error('Search is a necessary dependecy');\n\n var _this = this;\n\n _this._syncher = syncher; // _this.discovery = discovery;\n // _this.search = search;\n\n _this.myIdentity = identity;\n _this.controllerMode = 'reporter';\n _this.child_cseq = 0;\n _this.domain = domain;\n _this._manager = manager;\n var hypertyURL = syncher.owner;\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication'; // _this._invitationsHandler = new InvitationsHandler(hypertyURL);\n }\n /* get invitationsHandler() {\r\n return this._invitationsHandler;\r\n }*/\n\n\n Chat_createClass(Chat, [{\n key: \"_setOnAddChildListener\",\n value: function _setOnAddChildListener(dataObject) {\n var _this = this;\n\n dataObject.onAddChild(function (child) {\n _this.child_cseq += 1;\n console.info('[ChatManager.ChatController._setOnAddChildListener] new Child received: ', child);\n if (_this._onMessage) _this._onMessage(child);\n });\n }\n }, {\n key: \"_onSubscribe\",\n value: function _onSubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n event.accept();\n console.log('[ChatManager.ChatController.onSubscribe] event', event, dataObjectReporter.url);\n console.log('[ChatManager.ChatController.onSubscribe] New user has subscribe this object: ', dataObjectReporter.data, event.identity);\n var identity = JSON.parse(JSON.stringify(event.identity));\n\n if (identity.hasOwnProperty('assertion')) {\n delete identity.assertion;\n }\n\n var userInfo = {\n hypertyURL: event.url,\n domain: event.domain,\n identity: identity\n };\n var userURL = event.identity.userProfile.guid;\n console.log('[ChatManager.ChatController.onSubscribe] new participant', userInfo);\n\n if (event.identity.legacy) {\n userInfo.legacy = event.identity.legacy;\n }\n\n dataObjectReporter.data.participants[userURL] = userInfo;\n console.log('[ChatManager.ChatController.onSubscribe] communicationObject OBJ chatcontroller', dataObjectReporter.data.participants);\n console.log('[ChatManager.ChatController.onSubscribe - onSubscription] ', userInfo); // console.log('[ChatManager.ChatController.onSubscribe - this._onUserAdded] ', this._onUserAdded);\n\n if (this._onUserAdded) this._onUserAdded(userInfo);\n }\n }, {\n key: \"_onUnsubscribe\",\n value: function _onUnsubscribe(event) {\n var dataObjectReporter = this._dataObjectReporter;\n console.log('[ChatManager.ChatController.onUnsubscribe] event', event, dataObjectReporter.url);\n var participant = event.identity.userProfile;\n console.log('[ChatManager.ChatController.onUnsubscribe] participant left', participant);\n\n if (event.identity.legacy) {\n participant.legacy = event.identity.legacy;\n }\n\n delete dataObjectReporter.data.participants[participant.userURL];\n console.log('[ChatManager.ChatController.onUnsubscribe - this._onUserRemoved] ', this.onUserRemoved);\n if (this._onUserRemoved) this._onUserRemoved(participant);\n }\n /**\r\n * This function is used to send a file.\r\n * @param {string} file Is the file to be sent.\r\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\r\n */\n\n }, {\n key: \"sendFile\",\n value: function sendFile(file) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n var identity = {\n userProfile: _this.myIdentity\n };\n dataObject.addHypertyResource('resources', 'file', file, identity).then(function (resourceFile) {\n var identity = {\n userProfile: _this.myIdentity\n };\n var fileSentEvt = {\n value: resourceFile,\n identity: identity,\n resource: resourceFile\n };\n /* let reporterStatus = new RegistrationStatus(dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus );\r\n \r\n // recursive function to sync with chat reporter\r\n \r\n let share2Reporter = function(file, subscriber, evt, status) {\r\n let statusOfReporter = status;\r\n file.sharingStatus.then(resolve(evt)).catch((result)=>{\r\n console.log('[ChatManager.ChatController.sendFile] share failed: ', result);\r\n \r\n statusOfReporter.onLive( subscriber, () => {\r\n statusOfReporter.unsubscribeLive(subscriber);\r\n file.share(true);\r\n share2Reporter(file, subscriber, evt, statusOfReporter);\r\n });\r\n //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\r\n });\r\n }*/\n // resourceFile.share(true).then(()=>{\n\n resolve(fileSentEvt); // });\n // share2Reporter(resourceFile, _this._manager._hypertyURL, fileSentEvt, reporterStatus);\n });\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n }\n /**\r\n * This function is used to send a chat message.\r\n * @param {string} message Is the ChatMessage to be sent.\r\n * @return {Promise} It returns the ChatMessage child object created by the Syncher as a Promise.\r\n */\n\n }, {\n key: \"send\",\n value: function send(message, identity) {\n var _this = this;\n\n var mode = _this.controllerMode;\n var dataObject = mode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\n return new Promise(function (resolve, reject) {\n // let _dataObjectChild;\n _this.child_cseq += 1;\n var msg = {\n /* url: dataObject.data.url,\r\n cseq: _this.child_cseq,\r\n reporter: dataObject.data.reporter,\r\n schema: dataObject.data.schema,\r\n name: dataObject.data.name,\r\n created : new Date().toJSON(),*/\n type: 'chat',\n content: message\n };\n var sender = identity ? identity : {\n userProfile: _this.myIdentity\n }; // TODO: change chatmessages to resource - chat, file\n // TODO: change message to hypertyResource - https://github.com/reTHINK-project/dev-service-framework/tree/develop/docs/datamodel/data-objects/hyperty-resource\n // TODO: handle with multiple resources - if the \"message\" will be different for each type of resources\n\n dataObject.addChild(msg, sender).then(function (dataObjectChild) {\n console.log('[ChatManager.ChatController][addChild - Chat Message]: ', dataObjectChild); //resolve(dataObjectChild);\n //TODO: move to separate function\n\n var msg = {\n childId: dataObjectChild._childId,\n from: dataObjectChild._owner,\n value: dataObjectChild.data,\n type: 'create',\n identity: sender\n };\n /* let reporterStatus = new RegistrationStatus(dataObject.url, _this._manager._runtimeURL, _this._manager._hypertyURL, _this._manager._bus );\r\n \r\n // recursive function to sync with chat reporter\r\n \r\n let share2Reporter = function(child, subscriber, msg, status) {\r\n let statusOfReporter = status;\r\n child.sharingStatus.then(resolve(msg)).catch((result)=>{\r\n \r\n statusOfReporter.onLive( subscriber, () => {\r\n statusOfReporter.unsubscribeLive(subscriber);\r\n child.share(true);\r\n share2Reporter(child, subscriber, msg, statusOfReporter);\r\n });\r\n //TODO: subscribe to sync when reporter is live. New synched messages should trigger onMessage ie onChild\r\n });\r\n }*/\n // share2Reporter(dataObjectChild, _this._manager._hypertyURL, msg, reporterStatus);\n // dataObjectChild.share(true);\n\n resolve(msg);\n }).catch(function (reason) {\n console.error('Reason:', reason);\n reject(reason);\n });\n });\n }\n /**\r\n * [onChange description]\r\n * @param {Function} callback [description]\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onChange\",\n value: function onChange(callback) {\n var _this = this;\n\n _this._onChange = callback;\n }\n /**\r\n * This function is used to receive new messages.\r\n * @param {Function} callback Function to handle with new messages\r\n * @return {Communication.ChatMessage} m\r\n */\n\n }, {\n key: \"onMessage\",\n value: function onMessage(callback) {\n var _this = this;\n\n _this._onMessage = callback;\n }\n /**\r\n * [onUserAdded description]\r\n * @param {Function} callback [description]\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onUserAdded\",\n value: function onUserAdded(callback) {\n var _this = this;\n\n _this._onUserAdded = callback;\n }\n /**\r\n * When the an user was removed\r\n * @param {Function} callback Function handle with the removed user\r\n * @return {[type]} [description]\r\n */\n\n }, {\n key: \"onUserRemoved\",\n value: function onUserRemoved(callback) {\n var _this = this;\n\n _this._onUserRemoved = callback;\n }\n /**\r\n * This function is used to receive requests to close the Group Chat instance.\r\n * @return {DeleteEvent} The DeleteEvent fired by the Syncher when the Chat is closed.\r\n */\n\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n var _this = this;\n\n _this._onClose = callback;\n }\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n var _this = this;\n\n _this._onResponse = callback;\n }\n /**\r\n * This function is used to add / invite new user on an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\r\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\r\n */\n\n /* addUser(users) {\r\n \r\n let _this = this;\r\n \r\n let haveEmptyElements = (element) => {\r\n console.log('Element:', element.length);\r\n return element.length !== 0;\r\n };\r\n \r\n let notFoundElements = (element) => {\r\n console.log('user not found: ', element);\r\n return !(element instanceof String);\r\n };\r\n \r\n return new Promise(function(resolve, reject) {\r\n \r\n if (users.filter(haveEmptyElements).length === 0) {\r\n return reject('Don\\'t have users to invite');\r\n }\r\n \r\n console.info('[ChatManager.ChatController.addUsers ]: ', users);\r\n \r\n /*_this.search.users(users, domains, ['comm'], ['chat'])\r\n \r\n .then((hypertiesIDs) => {\r\n \r\n if (hypertiesIDs.filter(notFoundElements).length === 0) {\r\n throw 'User(s) not found';\r\n }\r\n \r\n let selectedHyperties = hypertiesIDs.map((hyperty) => {\r\n return hyperty.hypertyID;\r\n });*/\n\n /* let usersDiscovery = [];\r\n let disconnected = [];\r\n let live = {};\r\n \r\n users.forEach((user) => {\r\n let userDiscoveryPromise = _this.discovery.discoverHypertiesDO(user.user, ['comm'], ['chat'], user.domain);\r\n usersDiscovery.push(userDiscoveryPromise);\r\n });\r\n \r\n Promise.all(usersDiscovery).then((userDiscoveryResults) => {\r\n console.log('[ChatManager.ChatController.addUsers] Users Discovery Results->', userDiscoveryResults);\r\n \r\n let selectedHyperties = [];\r\n \r\n userDiscoveryResults.forEach((userDiscoveryResult) => {\r\n \r\n userDiscoveryResult.forEach((discovered)=>{\r\n if (discovered.data.status === 'live'){\r\n selectedHyperties.push(discovered.data.hypertyID);\r\n live[discovered.data.hypertyID] = discovered;\r\n }\r\n else if (disconnected.length < 5) disconnected.push(discovered);\r\n });\r\n \r\n });\r\n \r\n console.info('[ChatManager.ChatController]------------------------ Syncher Create ---------------------- \\n');\r\n console.info('[ChatManager.ChatController]Selected Hyperties: !!! ', selectedHyperties);\r\n console.info(`Have ${selectedHyperties.length} users;`);\r\n // console.info('[ChatManager] HypertiesIDs ', hypertiesIDs);\r\n \r\n let dataObject = _this.controllerMode === 'reporter' ? _this.dataObjectReporter : _this.dataObjectObserver;\r\n \r\n if (disconnected.length > 0) _this._invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObject);\r\n \r\n dataObject.inviteObservers(selectedHyperties);\r\n \r\n if (dataObject.invitations.length > 0) _this._invitationsHandler.processInvitations(live, dataObject);\r\n \r\n return;\r\n \r\n })\r\n .then(() => {\r\n console.info('[ChatManager.ChatController]Are invited with success ' + users.length + ' users;');\r\n resolve(true);\r\n \r\n \r\n \r\n }).catch((reason) => {\r\n console.error('An error occurred when trying to invite users;\\n', reason);\r\n reject(reason);\r\n });\r\n \r\n });\r\n \r\n }*/\n\n /**\r\n * This function is used to request the Reporter to add / invite new user on an existing Group Chat instance.\r\n * Only Observers are allowed to use this function.\r\n * @param {URL.UserURL} users User to be invited to join the Group Chat that is identified with reTHINK User URL.\r\n * @return {Promise} It returns as a Promise true if successfully invited or false otherwise.\r\n */\n\n /* addUserReq(users) {\r\n \r\n let _this = this;\r\n \r\n //check is Observer and invoke observer.execute() with new promise\r\n let haveEmptyElements = (element) => {\r\n console.log('Element:', element.length);\r\n return element.length !== 0;\r\n };\r\n \r\n return new Promise(function(resolve, reject) {\r\n \r\n if (users.filter(haveEmptyElements).length === 0) {\r\n return reject('[ChatManager.ChatController.addUserReq] Don\\'t have users to add');\r\n }\r\n if (!_this.controllerMode === 'observer') {\r\n return reject('[ChatManager.ChatController.addUserReq] only allowed to Chat Observer');\r\n \r\n let addUser = _this.addUser(users);\r\n \r\n if (_this._dataObjectObserver) {\r\n addUser = _this._dataObjectObserver.execute('addUser', users);\r\n }\r\n \r\n addUser.then(() => {\r\n console.info('[ChatManager.ChatController.addUserReq] Request accepted by Reporter ');\r\n resolve(true);\r\n }).catch((reason) => {\r\n console.error('[ChatManager.ChatController.addUserReq] Request rejected by Reporter;\\n', reason);\r\n reject(reason);\r\n });\r\n }\r\n \r\n });\r\n \r\n }*/\n\n }, {\n key: \"onInvitationResponse\",\n value: function onInvitationResponse(callback) {\n var _this = this;\n\n _this._onInvitationResponse = callback; // _this._invitationsHandler.invitationResponse = callback;\n }\n /**\r\n * This function is used to remove a user from an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @return { boolean} Promise with the status\r\n */\n\n /**\r\n * This function is used to remove a user from an existing Group Chat instance.\r\n * Only the Reporter, i.e. the Hyperty that has created the Group Chat, is allowed to use this function.\r\n * @param {URL.UserURL} user User to be removed from the Group Chat that is identified with reTHINK User URL.\r\n * @return { boolean} It returns as a Promise true if successfully removed or false otherwise.\r\n */\n\n }, {\n key: \"removeUser\",\n value: function removeUser(user) {\n // TODO: implement the removeUser;\n console.log('[ChatManager.ChatController]Not yet implemented: ', user);\n }\n /**\r\n * This function is used to close an existing Group Chat instance.\r\n * Only available to Chat Group Reporters i.e. the Hyperty instance that created the Group Chat.\r\n * @return {Boolean} It returns as a Promise true if successfully closed or false otherwise.\r\n */\n\n }, {\n key: \"close\",\n value: function close() {\n var del = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n // TODO: the dataObjectReporter.delete should be a Promise;\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n if (_this.controllerMode === 'reporter') {\n // reporter\n // _this._invitationsHandler.cleanInvitations(_this.dataObjectReporter).then(() => {\n if (!del) {\n _this._manager.communicationObject.status = 'closed';\n resolve(true);\n } else {\n try {\n delete _this._manager._reportersControllers[_this.dataObjectReporter.url];\n\n _this.dataObjectReporter.delete();\n\n resolve(true);\n if (_this._onClose) _this._onClose({\n code: 200,\n desc: 'deleted',\n url: _this.dataObjectReporter.url\n });\n } catch (e) {\n console.error(e);\n reject(false);\n }\n } // });\n\n } else {\n // observer\n if (del) {\n try {\n delete _this._manager._observersControllers[_this.dataObjectObserver.url];\n\n _this.dataObjectObserver.unsubscribe();\n\n resolve(true);\n } catch (e) {\n console.error(e);\n reject(false);\n }\n } else {\n // TODO: send message \n resolve(true);\n }\n }\n });\n }\n }, {\n key: \"url\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter.url : this.dataObjectObserver.url;\n }\n }, {\n key: \"dataObjectReporter\",\n set: function set(dataObjectReporter) {\n if (!dataObjectReporter) throw new Error('[ChatController] The data object reporter is necessary parameter ');\n\n var _this = this;\n\n _this.controllerMode = 'reporter'; // Handler to process received files\n // dataObjectReporter.onResponse(function(event) {\n // console.log('[DataObjectReporter - onResponse]', event);\n // if (_this._onInvitationResponse) {\n // _this._onInvitationResponse(event);\n // }\n //\n // });\n\n dataObjectReporter.onSubscription(function (event) {\n switch (event.type) {\n case 'subscribe':\n _this._onSubscribe(event);\n\n break;\n\n case 'unsubscribe':\n _this._onUnsubscribe(event);\n\n break;\n }\n });\n\n _this._setOnAddChildListener(dataObjectReporter);\n\n dataObjectReporter.onRead(function (event) {\n event.accept();\n });\n dataObjectReporter.onExecute(function (event) {\n switch (event.method) {\n case 'addUser':\n _this.addUser(event.params[0]).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n case 'removeUser':\n _this.removeUser(event.params).then(function () {\n event.accept();\n }).catch(function (reason) {\n console.error('Reason:', reason);\n event.reject(reason);\n });\n\n break;\n\n default:\n event.reject('[ChatController.onExecute] Chat method execution not accepted by Reporter');\n break;\n }\n });\n _this._dataObjectReporter = dataObjectReporter;\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectReporter;\n }\n }, {\n key: \"messages\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this._dataObjectReporter._childrenObjects : this._dataObjectObserver._childrenObjects;\n }\n }, {\n key: \"dataObjectObserver\",\n set: function set(dataObjectObserver) {\n var _this = this;\n\n _this.controllerMode = 'observer';\n _this._dataObjectObserver = dataObjectObserver;\n dataObjectObserver.onChange('*', function (event) {\n console.info('[ChatManager.ChatController]Observer - onChange', event);\n\n if (event.field.includes('participants')) {\n switch (event.cType) {\n case 'add':\n if (_this._onUserAdded) _this._onUserAdded(event);\n break;\n\n case 'remove':\n if (_this._onUserRemoved) _this._onUserRemoved(event);\n break;\n }\n }\n\n if (_this._onChange) _this._onChange(event);\n });\n\n _this._setOnAddChildListener(dataObjectObserver); // let childrens = dataObjectObserver.childrens;\n // Object.keys(childrens).forEach((child) => {\n // if (_this._onMessage) _this._onMessage({\n // childId: child,\n // identity: childrens[child].identity,\n // value: childrens[child].data\n // });\n // })\n\n },\n get: function get() {\n var _this = this;\n\n return _this._dataObjectObserver;\n }\n }, {\n key: \"dataObject\",\n get: function get() {\n return this.controllerMode === 'reporter' ? this.dataObjectReporter : this.dataObjectObserver;\n }\n }, {\n key: \"closeEvent\",\n set: function set(event) {\n var _this = this;\n\n _this._closeEvent = event;\n if (_this._onClose) _this._onClose(event);\n },\n get: function get() {\n var _this = this;\n\n return _this._closeEvent;\n }\n }]);\n\n return Chat;\n}();\n\n/* harmony default export */ var chatManager_Chat = (Chat);\n// CONCATENATED MODULE: ./src/chatManager/SimpleChatManager.js\nfunction SimpleChatManager_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SimpleChatManager_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SimpleChatManager_createClass(Constructor, protoProps, staticProps) { if (protoProps) SimpleChatManager_defineProperties(Constructor.prototype, protoProps); if (staticProps) SimpleChatManager_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Service Framework\n//import IdentityManager from '../identityManager/IdentityManager';\n//import RegistrationStatus from '../discovery/RegistrationStatus';\n//import Discovery from '../discovery/Discovery';\n//import Syncher from '../syncher/Syncher';\n// Utils\n//import {divideURL} from '../utils/utils';\n//import Search from '../utils/Search';\n// Internals\n\n\n\n/**\r\n* Hyperty Simple Group Chat Manager API \r\n* @author Vitor Silva [vitor-t-silva@telecom.pt]\r\n* @version 0.1.0\r\n*/\n\nvar SimpleChatManager_SimpleSimpleChatManager =\n/*#__PURE__*/\nfunction () {\n function SimpleSimpleChatManager(myUrl, bus, configuration, syncher, factory) {\n SimpleChatManager_classCallCheck(this, SimpleSimpleChatManager);\n\n if (!myUrl) throw new Error('[SimpleChatManager.constructor] The myUrl is a needed parameter');\n if (!bus) throw new Error('[SimpleChatManager.constructor] The MiniBus is a needed parameter');\n if (!configuration) throw new Error('[SimpleChatManager.constructor] The configuration is a needed parameter');\n\n var _this = this;\n\n if (!syncher) {\n syncher = factory.createSyncher(myUrl, bus, configuration);\n }\n\n _this._runtimeURL = configuration.runtimeURL;\n var domain = factory.divideURL(_this._runtimeURL).domain; // let discovery = factory.createDiscovery(myUrl, configuration.runtimeURL, bus);\n\n var identityManager = factory.createIdentityManager(myUrl, configuration.runtimeURL, bus);\n _this._objectDescURL = 'hyperty-catalogue://catalogue.' + domain + '/.well-known/dataschema/Communication';\n _this._reportersControllers = {};\n _this._observersControllers = {};\n _this._myUrl = myUrl;\n _this._bus = bus;\n _this._syncher = syncher;\n _this._domain = domain; // _this.discovery = discovery;\n\n _this.identityManager = identityManager;\n _this.currentIdentity; // _this.search = factory.createSearch(discovery, identityManager);\n\n _this.communicationObject = communicationObject;\n _this.communicationChildren = communicationChildren; // console.log('[SimpleChatManager] Discover ', discovery);\n\n console.log('[SimpleChatManager] Identity Manager ', identityManager);\n }\n\n SimpleChatManager_createClass(SimpleSimpleChatManager, [{\n key: \"processNotification\",\n value: function processNotification(event) {\n var _this = this;\n\n console.log('[SimpleChatManager.processNotification: ', event);\n\n if (event.type === 'create') {\n // TODO: replace the 100 for Message.Response\n // event.ack(200);\n if (_this._onInvitation) {\n _this._onInvitation(event);\n }\n }\n\n if (event.type === 'delete') {\n // TODO: replace the 200 for Message.Response\n event.ack(200);\n _this._observersControllers[event.url].closeEvent = event;\n delete _this._observersControllers[event.url];\n _this._observersControllers.closeEvent = event;\n _this.communicationObject = communicationObject;\n\n for (var url in this._reportersControllers) {\n this._reportersControllers[url].close(event);\n }\n\n for (var _url in this._observersControllers) {\n this._observersControllers[_url].close(event);\n }\n }\n }\n }, {\n key: \"myIdentity\",\n value: function myIdentity(identity) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n console.info('[SimpleChatManager.myIdentity]');\n if (identity) return resolve(identity);\n\n if (_this._myUrl.includes('hyperty://')) {\n _this.identityManager.discoverUserRegistered().then(function (identity) {\n _this.currentIdentity = identity;\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n } else {\n _this.identityManager.discoverIdentityPerIdP().then(function (identity) {\n _this.currentIdentity = identity;\n resolve(identity);\n }).catch(function (reason) {\n reject(reason);\n });\n }\n });\n }\n /**\r\n * This function is used to create a new Group Chat providing the name and the identifiers of users to be invited.\r\n * @param {string} name Is a string to identify the Group Chat\r\n * @param {array} hyperties Array of hyperties to be invited to join the Group Chat. Users are identified with reTHINK User URL, like this format user:///\r\n * @return {ChatController} A ChatController object as a Promise.\r\n */\n\n }, {\n key: \"create\",\n value: function create(name, hyperties) {\n var extra = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var _this = this;\n\n var syncher = _this._syncher;\n return new Promise(function (resolve, reject) {\n _this.communicationObject = communicationObject;\n _this.communicationObject.cseq = 1;\n _this.communicationObject.startingTime = new Date().toJSON();\n _this.communicationObject.status = CommunicationStatus.OPEN;\n var myIdentity;\n\n _this.myIdentity().then(function (identity) {\n myIdentity = identity;\n console.log('[SimpleChatManager.create ] My Identity', identity); // let url = _this.communicationObject.reporter;\n\n var userInfo = new UserInfo_UserInfo(_this._myUrl, _this._domain, identity); // Add my identity\n\n _this.communicationObject.participants[identity.guid] = userInfo;\n console.log('[SimpleChatManager.create ] participants: ', _this.communicationObject.participants);\n console.log('[SimpleChatManager.create ] communicationObject', _this.communicationObject);\n console.info('[SimpleChatManager] ---------------------- Syncher Create ---------------------- \\n');\n console.info('[SimpleChatManager] Selected Hyperties: !!! ', hyperties); // console.info(`Have ${hyperties.length} users;`);\n\n var mutual = extra.mutual ? extra.mutual : true;\n var input = Object.assign({\n resources: ['chat'],\n mutual: mutual\n }, extra);\n delete input.name;\n if (_this.offline) input.offline = _this.offline;\n if (_this.backup) input.backup = _this.backup;\n console.log('[SimpleChatManager] input data:', input);\n return syncher.create(_this._objectDescURL, hyperties, _this.communicationObject, true, false, name, {}, input);\n }).then(function (dataObjectReporter) {\n console.info('[SimpleChatManager] 3. Return Create Data Object Reporter', dataObjectReporter);\n var chat = new chatManager_Chat(syncher, _this._domain, myIdentity, _this);\n chat.dataObjectReporter = dataObjectReporter;\n _this._reportersControllers[dataObjectReporter.url] = chat; // console.log('[SimpleChatManager] chat invitationsHandler: ', chat.invitationsHandler);\n // process invitations to handle not received invitations\n\n /* if (dataObjectReporter.invitations.length > 0) {\r\n chat.invitationsHandler.processInvitations(live, dataObjectReporter);\r\n }\r\n \r\n // If any invited User is disconnected let's wait until it is connected again\r\n if (disconnected.length > 0) chat.invitationsHandler.inviteDisconnectedHyperties(disconnected, dataObjectReporter);\r\n */\n\n resolve(chat);\n }).catch(function (reason) {\n reject(reason);\n });\n }).catch(function (reason) {\n console.log('[SimpleChatManager.create] MyIdentity Error:', reason);\n return reject(reason);\n }); // });\n }\n /**\r\n * This function is used to handle notifications about incoming invitations to join a Group Chat.\r\n * @param {Function} CreateEvent The CreateEvent fired by the Syncher when an invitaion is received\r\n */\n\n }, {\n key: \"onInvitation\",\n value: function onInvitation(callback) {\n var _this = this;\n\n _this._onInvitation = callback;\n }\n /**\r\n * This function is used to join a Group Chat.\r\n * @param {URL.CommunicationURL} invitationURL The Communication URL of the Group Chat to join that is provided in the invitation event\r\n * @return {ChatController} It returns the ChatController object as a Promise\r\n */\n\n }, {\n key: \"join\",\n value: function join(invitationURL) {\n var mutual = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var identity = arguments.length > 2 ? arguments[2] : undefined;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var syncher = _this._syncher;\n var myIdentity;\n console.info('[SimpleChatManager] ------------------------ Syncher subscribe ---------------------- \\n');\n console.info('invitationURL', invitationURL);\n\n _this.myIdentity(identity).then(function (identity) {\n myIdentity = identity;\n var input = {\n schema: _this._objectDescURL,\n resource: invitationURL,\n store: true,\n p2p: false,\n mutual: mutual,\n domain_subscription: true,\n identity: identity\n };\n if (_this.offline) input.offline = _this.offline;\n return syncher.subscribe(input);\n }).then(function (dataObjectObserver) {\n console.info('Data Object Observer: ', dataObjectObserver);\n var chat = new chatManager_Chat(syncher, _this._domain, myIdentity, _this);\n resolve(chat);\n chat.dataObjectObserver = dataObjectObserver;\n _this._observersControllers[dataObjectObserver.url] = chat;\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: \"offline\",\n set: function set(offline) {\n this._offline = offline;\n },\n get: function get() {\n return this._offline ? this._offline : false;\n }\n }, {\n key: \"backup\",\n set: function set(backup) {\n this._backup = backup;\n },\n get: function get() {\n return this._backup ? this._backup : false;\n }\n }]);\n\n return SimpleSimpleChatManager;\n}();\n\n/* harmony default export */ var SimpleChatManager = (SimpleChatManager_SimpleSimpleChatManager);\n// CONCATENATED MODULE: ./src/sandbox/SandboxFactory.js\nfunction SandboxFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SandboxFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SandboxFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) SandboxFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) SandboxFactory_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\r\n * Internal component to instantiate framework functionalities.\r\n */\n\nvar SandboxFactory_SandboxFactory =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _components: \r\n */\n function SandboxFactory(bus) {\n SandboxFactory_classCallCheck(this, SandboxFactory);\n\n var _this = this;\n\n _this._bus = bus;\n _this._divideURL = utils[\"k\" /* divideURL */];\n }\n\n SandboxFactory_createClass(SandboxFactory, [{\n key: \"createSyncher\",\n value: function createSyncher(owner, bus, config) {\n return new Syncher[\"a\" /* default */](owner, bus, config);\n }\n }, {\n key: \"createIdentityManager\",\n value: function createIdentityManager(hypertyURL, runtimeURL, bus) {\n var _this = this;\n\n return new IdentityManager[\"a\" /* default */](hypertyURL, runtimeURL, bus);\n }\n }, {\n key: \"createDiscovery\",\n value: function createDiscovery(hypertyURL, runtimeURL, bus) {\n var _this = this;\n\n return new Discovery[\"a\" /* default */](hypertyURL, runtimeURL, bus);\n }\n }, {\n key: \"createSearch\",\n value: function createSearch(discovery, identityManager) {\n var _this = this;\n\n return new utils_Search(discovery, identityManager);\n }\n }, {\n key: \"createContextObserver\",\n value: function createContextObserver(hypertyURL, bus, config, schemes) {\n return new ContextObserver[\"a\" /* default */](hypertyURL, bus, config, schemes, this);\n }\n }, {\n key: \"createContextReporter\",\n value: function createContextReporter(hypertyURL, bus, config) {\n var _this = this;\n\n return new ContextReporter[\"a\" /* default */](hypertyURL, bus, config, this);\n }\n }, {\n key: \"createNotificationHandler\",\n value: function createNotificationHandler(bus) {\n var _this = this;\n\n return new syncher_NotificationHandler(bus);\n }\n }, {\n key: \"createMessageBodyIdentity\",\n value: function createMessageBodyIdentity(username, userURL, picture, name, locale, idp, assertion, profile) {\n return new identity_MessageBodyIdentity(username, userURL, picture, name, locale, idp, assertion, profile);\n }\n }, {\n key: \"createChatManager\",\n value: function createChatManager(hypertyURL, bus, configuration, syncher) {\n return new chatManager_ChatManager(hypertyURL, bus, configuration, syncher, this);\n }\n }, {\n key: \"createChatController\",\n value: function createChatController(syncher, discovery, domain, search, identity, manager) {\n return new chatManager_ChatController(syncher, discovery, domain, search, identity, manager);\n }\n }, {\n key: \"createSimpleChatManager\",\n value: function createSimpleChatManager(hypertyURL, bus, configuration, syncher) {\n return new SimpleChatManager(hypertyURL, bus, configuration, syncher, this);\n }\n }, {\n key: \"createChat\",\n value: function createChat(syncher, domain, identity, manager) {\n return new chatManager_Chat(syncher, domain, identity, manager);\n }\n }, {\n key: \"createRegistrationStatus\",\n value: function createRegistrationStatus(observer, runtimeURL, chatUrl, bus) {\n return new RegistrationStatus[\"a\" /* default */](observer, runtimeURL, chatUrl, bus);\n }\n }, {\n key: \"divideURL\",\n get: function get() {\n return this._divideURL;\n }\n }]);\n\n return SandboxFactory;\n}();\n\n/* harmony default export */ var sandbox_SandboxFactory = __webpack_exports__[\"a\"] = (SandboxFactory_SandboxFactory);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9Ob3RpZmljYXRpb25IYW5kbGVyLmpzPzI4YjIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3V0aWxzL1NlYXJjaC5qcz9mYzlhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9Vc2VyUHJvZmlsZS5qcz81ODU4Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9pZGVudGl0eS9NZXNzYWdlQm9keUlkZW50aXR5LmpzPzc1NDkiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL2NvbW11bmljYXRpb24uanM/Mzc5YiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY2hhdE1hbmFnZXIvSW52aXRhdGlvbnNIYW5kbGVyLmpzPzI3ZDAiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL0NoYXRDb250cm9sbGVyLmpzPzFkOWIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL1VzZXJJbmZvLmpzPzU3ZDQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL0NoYXRNYW5hZ2VyLmpzPzhkYWYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2NoYXRNYW5hZ2VyL0NoYXQuanM/MDBiZCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvY2hhdE1hbmFnZXIvU2ltcGxlQ2hhdE1hbmFnZXIuanM/YTk1NSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc2FuZGJveC9TYW5kYm94RmFjdG9yeS5qcz8wYTZhIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4qIFRoZSBOb3RpdGlmaWNhdGlvbiBIYW5kbGVyIGlzIHVzZWQgdG8gaGFuZGxlIG5vdGlmaWNhdGlvbnMgbm90IHByb2Nlc3NlZCBieSB0aGUgc3luY2hlciB3aGVuIHJ1bm5pbmcgaW4gYSBzYW5kYm94LlxyXG4qL1xyXG5cclxuaW1wb3J0IHsgZGl2aWRlVVJMIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuY2xhc3MgTm90aWZpY2F0aW9uSGFuZGxlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGJ1cykge1xyXG5cclxuICAgIGlmICghYnVzKSB0aHJvdyBFcnJvcignW05vdGlmaWNhdGlvbkhhbmRsZXIgQ29uc3RydWN0b3JdIGJ1cyBpbnB1dCBpcyBtYW5kYXRvcnknKTtcclxuICAgIHRoaXMuX2J1cyA9IGJ1cztcclxuICAgIHRoaXMuX29uTm90aWZpY2F0aW9uSGFuZGxlciA9IHt9O1xyXG4gIH1cclxuXHJcbiAgb25Ob3RpZmljYXRpb24oc2NoZW1lLCBjYWxsYmFjaykge1xyXG4gICAgdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyW3NjaGVtZV0gPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIG9uQ3JlYXRlKG1zZykge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgLy8gIGxldCByZXNvdXJjZSA9IG1zZy5mcm9tLnNsaWNlKDAsIC0xMyk7IC8vcmVtb3ZlIFwiL3N1YnNjcmlwdGlvblwiIGZyb20gdGhlIFVSTFxyXG5cclxuICAgIGxldCByZXNvdXJjZSA9IG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdyZXNvdXJjZScpID8gbXNnLmJvZHkucmVzb3VyY2UgOiBtc2cuZnJvbS5zbGljZSgwLCAtMTMpO1xyXG4gICAgbGV0IGRpdmlkZWRVUkwgPSBkaXZpZGVVUkwocmVzb3VyY2UpO1xyXG4gICAgbGV0IGRvbWFpbiA9IGRpdmlkZWRVUkwuZG9tYWluO1xyXG4gICAgbGV0IHNjaGVtZSA9IHJlc291cmNlLnNwbGl0KCc6Ly8nKVswXTtcclxuXHJcbiAgICBsZXQgZXJyb3IgPSAocmVhc29uKSA9PiB7XHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgIGJvZHk6IHsgY29kZTogNDAwLCBkZXNjOiAnQmFkIFJlcXVlc3Q6ICcgKyByZWFzb24gfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgaWYgKCFtc2cuYm9keS5oYXNPd25Qcm9wZXJ0eSgnc291cmNlJykpIHsgZXJyb3IoJ01pc3Npbmcgc291cmNlJyk7IH1cclxuICAgIGlmICghbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3NjaGVtYScpKSB7IGVycm9yKCdNaXNzaW5nIHNjaGVtYScpOyB9XHJcbiAgICBpZiAoIW1zZy5ib2R5Lmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7IGVycm9yKCdNaXNzaW5nIHZhbHVlJyk7IH1cclxuICAgIGlmICghbXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ2lkZW50aXR5JykpIHsgZXJyb3IoJ01pc3NpbmcgaWRlbnRpdHknKTsgfVxyXG5cclxuICAgIGxldCBldmVudCA9IHtcclxuICAgICAgdHlwZTogbXNnLnR5cGUsXHJcbiAgICAgIGZyb206IG1zZy5ib2R5LnNvdXJjZSxcclxuICAgICAgdXJsOiByZXNvdXJjZSxcclxuICAgICAgZG9tYWluOiBkb21haW4sXHJcbiAgICAgIHNjaGVtYTogbXNnLmJvZHkuc2NoZW1hLFxyXG4gICAgICB2YWx1ZTogbXNnLmJvZHkudmFsdWUsXHJcbiAgICAgIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSxcclxuICAgICAgdG86IG1zZy50byxcclxuICAgICAgdmlhOiBtc2cuYm9keS52aWEsXHJcblxyXG4gICAgICBhY2s6ICh0eXBlKSA9PiB7XHJcbiAgICAgICAgbGV0IGxUeXBlID0gMjAwO1xyXG4gICAgICAgIGlmICh0eXBlKSB7XHJcbiAgICAgICAgICBsVHlwZSA9IHR5cGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgIC8vc2VuZCBhY2sgcmVzcG9uc2UgbWVzc2FnZVxyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgICBib2R5OiB7IGNvZGU6IGxUeXBlIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChyZWFzb24pID0+IHtcclxuICAgICAgICBlcnJvcihyZWFzb24pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgaWYgKF90aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXJbc2NoZW1lXSkge1xyXG4gICAgICBjb25zb2xlLmluZm8oJ1tOb3RpZmljYXRpb25IYW5kbGVyXSBOT1RJRklDQVRJT04tRVZFTlQ6ICcsIGV2ZW50KTtcclxuICAgICAgX3RoaXMuX29uTm90aWZpY2F0aW9uSGFuZGxlcltzY2hlbWVdKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRGVsZXRlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgIC8vcmVtb3ZlIFwiL3N1YnNjcmlwdGlvblwiIGZyb20gdGhlIFVSTFxyXG4gICAgbGV0IHJlc291cmNlID0gbXNnLmJvZHkucmVzb3VyY2U7XHJcblxyXG4gICAgbGV0IG9iamVjdCA9IF90aGlzLl9vYnNlcnZlcnNbcmVzb3VyY2VdO1xyXG5cclxuICAgIGxldCB1bnN1YnNjcmliZSA9IHtcclxuICAgICAgZnJvbTogX3RoaXMub3duZXIsXHJcbiAgICAgIHRvOiBfdGhpcy5fc3ViVVJMLFxyXG4gICAgICBpZDogbXNnLmlkLFxyXG4gICAgICB0eXBlOiAndW5zdWJzY3JpYmUnLFxyXG4gICAgICBib2R5OiB7IHJlc291cmNlOiBtc2cuYm9keS5yZXNvdXJjZSB9XHJcbiAgICB9O1xyXG5cclxuICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UodW5zdWJzY3JpYmUpO1xyXG5cclxuICAgIGRlbGV0ZSBfdGhpcy5fb2JzZXJ2ZXJzW3Jlc291cmNlXTtcclxuXHJcbiAgICBpZiAob2JqZWN0KSB7XHJcbiAgICAgIGxldCBldmVudCA9IHtcclxuICAgICAgICB0eXBlOiBtc2cudHlwZSxcclxuICAgICAgICB1cmw6IHJlc291cmNlLFxyXG4gICAgICAgIGlkZW50aXR5OiBtc2cuYm9keS5pZGVudGl0eSxcclxuXHJcbiAgICAgICAgYWNrOiAodHlwZSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGxUeXBlID0gMjAwO1xyXG4gICAgICAgICAgaWYgKHR5cGUpIHtcclxuICAgICAgICAgICAgbFR5cGUgPSB0eXBlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgLy9UT0RPOiBhbnkgb3RoZXIgZGlmZmVyZW50IG9wdGlvbnMgZm9yIHRoZSByZWxlYXNlIHByb2Nlc3MsIGxpa2UgYWNjZXB0IGJ1dCBub3IgcmVsZWFzZSBsb2NhbD9cclxuICAgICAgICAgIGlmIChsVHlwZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIG9iamVjdC5kZWxldGUoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL3NlbmQgYWNrIHJlc3BvbnNlIG1lc3NhZ2VcclxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcclxuICAgICAgICAgICAgYm9keTogeyBjb2RlOiBsVHlwZSwgc291cmNlOiBfdGhpcy5fb3duZXIgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKF90aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcclxuICAgICAgICBsb2cubG9nKCdOT1RJRklDQVRJT04tRVZFTlQ6ICcsIGV2ZW50KTtcclxuICAgICAgICBfdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyKGV2ZW50KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgYm9keTogeyBjb2RlOiA0MDQsIHNvdXJjZTogX3RoaXMuX293bmVyIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBOb3RpZmljYXRpb25IYW5kbGVyO1xyXG4iLCJjbGFzcyBTZWFyY2gge1xyXG5cclxuICBjb25zdHJ1Y3RvcihkaXNjb3ZlcnksIGlkZW50aXR5TWFuYWdlcikge1xyXG5cclxuICAgIGlmICghZGlzY292ZXJ5KSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkaXNjb3ZlcnkgY29tcG9uZW50IGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG4gICAgaWYgKCFpZGVudGl0eU1hbmFnZXIpIHRocm93IG5ldyBFcnJvcignVGhlIGlkZW50aXR5TWFuYWdlciBjb21wb25lbnQgaXMgYSBuZWVkZWQgcGFyYW1ldGVyJyk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5kaXNjb3ZlcnkgPSBkaXNjb3Zlcnk7XHJcbiAgICBfdGhpcy5pZGVudGl0eU1hbmFnZXIgPSBpZGVudGl0eU1hbmFnZXI7XHJcblxyXG4gIH1cclxuXHJcbiAgbXlJZGVudGl0eSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyLmRpc2NvdmVyVXNlclJlZ2lzdGVyZWQoKS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgaHlwZXJ0aWVzKHVzZXJzLCBzY2hlbWVzLCByZXNvdXJjZXMsIGdsb2JhbEZsYWcgPSBmYWxzZSkge1xyXG4gICAgLy9UT0RPOiByZXVzZSB1c2VycyBvciB0aGUgb3RoZXIgd2F5IGFyb3VuZFxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3Qgb2YgdXNlcnNVUkwgdG8gc2VhcmNoXHJcbiAgICogQHBhcmFtICB7YXJyYXk8VVJMLnVzZXJVUkw+fSAgdXNlcnMgTGlzdCBvZiBVc2VyVVIsIGxpa2UgdGhpcyBmb3JtYXQgdXNlcjovLzxpcGRkb21haW4+Lzx1c2VyLWlkZW50aWZpZXI+XHJcbiAgICogQHJldHVybiB7UHJvbWlzZX1cclxuICAgKi9cclxuICB1c2Vycyh1c2Vyc1VSTHMsIHByb3ZpZGVkRG9tYWlucywgc2NoZW1lcywgcmVzb3VyY2VzLCBnbG9iYWxGbGFnID0gZmFsc2UpIHtcclxuXHJcbiAgICBpZiAoIXVzZXJzVVJMcykgdGhyb3cgbmV3IEVycm9yKCdZb3UgbmVlZCB0byBwcm92aWRlIGEgbGlzdCBvZiB1c2VycycpO1xyXG4gICAgaWYgKCFwcm92aWRlZERvbWFpbnMpIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgZG9tYWlucycpO1xyXG4gICAgaWYgKCFyZXNvdXJjZXMpIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgcmVzb3VyY2VzJyk7XHJcbiAgICBpZiAoIXNjaGVtZXMpIHRocm93IG5ldyBFcnJvcignWW91IG5lZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2Ygc2NoZW1lcycpO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgY29uc29sZS5pbmZvKCdbU2VhcmNoXSBVc2VyczogJywgdXNlcnNVUkxzLCB1c2Vyc1VSTHMubGVuZ3RoKTtcclxuICAgICAgY29uc29sZS5pbmZvKCdbU2VhcmNoXSBEb21haW5zOiAnLCBwcm92aWRlZERvbWFpbnMsIHByb3ZpZGVkRG9tYWlucy5sZW5ndGgpO1xyXG4gICAgICBpZiAodXNlcnNVUkxzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnRG9uXFwndCBoYXZlIHVzZXJzIHRvIGRpc2NvdmVyeScpO1xyXG4gICAgICAgIHJlc29sdmUodXNlcnNVUkxzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgZ2V0VXNlcnMgPSBbXTtcclxuXHJcbiAgICAgICAgdXNlcnNVUkxzLmZvckVhY2goKHVzZXJVUkwsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICBsZXQgY3VycmVudERvbWFpbiA9IHByb3ZpZGVkRG9tYWluc1tpbmRleF07XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tTZWFyY2hdIFNlYXJjaCB1c2VyICcgKyB1c2VyVVJMICsgJyBmb3IgcHJvdmlkZWQgZG9tYWluOicsIGN1cnJlbnREb21haW4pO1xyXG4gICAgICAgICAgaWYgKCFnbG9iYWxGbGFnKSB7XHJcbiAgICAgICAgICAgIGdldFVzZXJzLnB1c2goX3RoaXMuZGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0aWVzKHVzZXJVUkwsIHNjaGVtZXMsIHJlc291cmNlcywgY3VycmVudERvbWFpbikpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2V0VXNlcnMucHVzaChfdGhpcy5kaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGEodXNlclVSTCwgc2NoZW1lcywgcmVzb3VyY2VzKSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zb2xlLmluZm8oJ1JlcXVlc3RzIHByb21pc2VzOiAnLCBnZXRVc2Vycyk7XHJcblxyXG4gICAgICAgIFByb21pc2UuYWxsKGdldFVzZXJzLm1hcCgocHJvbWlzZSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoaHlwZXJ0eSkgPT4geyByZXR1cm4gaHlwZXJ0eTsgfSwgKGVycm9yKSA9PiB7IHJldHVybiBlcnJvcjsgfSk7XHJcbiAgICAgICAgfSkpLnRoZW4oKGh5cGVydGllcykgPT4ge1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW1NlYXJjaF0gSHlwZXJ0aWVzIGZyb20gbmV3IERpc2NvdmVyeScsIGh5cGVydGllcyk7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gaHlwZXJ0aWVzLm1hcChmdW5jdGlvbihoeXBlcnR5KSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoaHlwZXJ0eS5oYXNPd25Qcm9wZXJ0eSgnaHlwZXJ0eUlEJykpXHJcbiAgICAgICAgICAgICAgcmV0dXJuIGh5cGVydHk7XHJcbiAgICAgICAgICAgIGxldCByZWNlbnQgPSBPYmplY3Qua2V5cyhoeXBlcnR5KS5yZWR1Y2VSaWdodChmdW5jdGlvbihhLCBiKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGh5cGVydHlEYXRlID0gbmV3IERhdGUoaHlwZXJ0eVtiXS5sYXN0TW9kaWZpZWQpO1xyXG4gICAgICAgICAgICAgIGxldCBoeXBlcnR5RGF0ZVAgPSBuZXcgRGF0ZShoeXBlcnR5W2FdLmxhc3RNb2RpZmllZCk7XHJcbiAgICAgICAgICAgICAgaWYgKGh5cGVydHlEYXRlUC5nZXRUaW1lKCkgPCBoeXBlcnR5RGF0ZS5nZXRUaW1lKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBiO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gYTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gaHlwZXJ0eVtyZWNlbnRdO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgbGV0IGNsZWFuID0gcmVzdWx0LmZpbHRlcigoaHlwZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gaHlwZXJ0eS5oYXNPd25Qcm9wZXJ0eSgnaHlwZXJ0eUlEJyk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnUmVxdWVzdHMgcmVzdWx0OiAnLCBjbGVhbik7XHJcblxyXG4gICAgICAgICAgaHlwZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24oZW50cnkpIHtcclxuICAgICAgICAgICAgaWYgKGVudHJ5ICE9PSAnTm8gSHlwZXJ0eSB3YXMgZm91bmQnKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoY2xlYW4pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICByZWplY3QoJ05vIEh5cGVydHkgd2FzIGZvdW5kJyk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVhc29uKTtcclxuICAgICAgICAgIHJlc29sdmUodXNlcnNVUkxzKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTZWFyY2g7XHJcbiIsIi8qKlxyXG4qIFRoZSBVc2VyUHJvZmlsZSBhY2NvcmRpbmcgdG8gVXNlciBJZGVudGl0eSBEYXRhIE1vZGVsXHJcbiovXHJcblxyXG5cclxuY2xhc3MgVXNlclByb2ZpbGUge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih1c2VybmFtZSwgdXNlclVSTCwgcGljdHVyZSwgbmFtZSwgbG9jYWxlLCBwcm9maWxlKSB7XHJcblxyXG4gICAgaWYgKHVzZXJuYW1lKSB7IHRoaXMucHJlZmVycmVkX3VzZXJuYW1lID0gdXNlcm5hbWU7IH1cclxuICAgIGlmIChwaWN0dXJlKSB7IHRoaXMucGljdHVyZSA9IHBpY3R1cmU7IH1cclxuICAgIGlmIChuYW1lKSB7IHRoaXMubmFtZSA9IG5hbWU7IH1cclxuICAgIGlmIChsb2NhbGUpIHsgdGhpcy5sb2NhbGUgPSBsb2NhbGU7IH1cclxuICAgIGlmICh1c2VyVVJMKSB7IHRoaXMudXNlclVSTCA9IHVzZXJVUkw7IH1cclxuICAgIGlmIChwcm9maWxlKSBPYmplY3QuYXNzaWduKHRoaXMsIHByb2ZpbGUpO1xyXG5cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFVzZXJQcm9maWxlO1xyXG4iLCIvKipcclxuKiBUaGUgSWRlbnRpdHkgaW5mbyB0byBiZSBhZGRlZCB0byBNZXNzYWdlLkJvZHkuSWRlbnRpdHlcclxuKi9cclxuXHJcbmltcG9ydCBVc2VyUHJvZmlsZSBmcm9tICcuL1VzZXJQcm9maWxlJztcclxuXHJcbmNsYXNzIE1lc3NhZ2VCb2R5SWRlbnRpdHkge1xyXG5cclxuICBjb25zdHJ1Y3Rvcih1c2VybmFtZSwgdXNlclVSTCwgcGljdHVyZSwgbmFtZSwgbG9jYWxlLCBpZHAsIGFzc2VydGlvbiwgcHJvZmlsZSkge1xyXG5cclxuICAgIGlmICghaWRwKSB0aHJvdyBuZXcgRXJyb3IoJ0lEUCBzaG91bGQgYmUgYSBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghdXNlcm5hbWUpIHRocm93IG5ldyBFcnJvcigndXNlcm5hbWUgc2hvdWxkIGJlIGEgcGFyYW1ldGVyJyk7XHJcblxyXG4gICAgdGhpcy5pZHAgPSBpZHA7XHJcblxyXG4gICAgaWYgKGFzc2VydGlvbikgICAgICB7IHRoaXMuYXNzZXJ0aW9uID0gYXNzZXJ0aW9uOyB9XHJcbiAgICB0aGlzLnVzZXJQcm9maWxlID0gbmV3IFVzZXJQcm9maWxlKHVzZXJuYW1lLCB1c2VyVVJMLCBwaWN0dXJlLCBuYW1lLCBsb2NhbGUsIHByb2ZpbGUpO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTWVzc2FnZUJvZHlJZGVudGl0eTtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuZXhwb3J0IGNvbnN0IENvbW11bmljYXRpb25TdGF0dXMgPSB7XHJcbiAgT1BFTjogJ29wZW4nLFxyXG4gIFBFTkRJTkc6ICdwZW5kaW5nJyxcclxuICBDTE9TRUQ6ICdjbG9zZWQnLFxyXG4gIFBBVVNFRDogJ3BhdXNlZCcsXHJcbiAgRkFJTEVEOiAnZmFpbGVkJ1xyXG59O1xyXG5cclxuZXhwb3J0IGxldCBjb21tdW5pY2F0aW9uT2JqZWN0ID0ge1xyXG4gIHN0YXJ0aW5nVGltZTogJycsXHJcbiAgc3RhdHVzOiAnJyxcclxuICBwYXJ0aWNpcGFudHM6IHt9XHJcbn07XHJcblxyXG5leHBvcnQgbGV0IGNvbW11bmljYXRpb25DaGlsZHJlbiA9IHtcclxuICBcInBhcmVudFwiIDogXCJjb21tdW5pY2F0aW9uXCIsXHJcbiAgXCJsaXN0ZW5lclwiIDogXCJyZXNvdXJjZXNcIixcclxuICBcInR5cGVcIiA6IFwiSHlwZXJ0eVJlc291cmNlXCJcclxufTtcclxuXHJcbi8qXHJcbmV4cG9ydCBsZXQgY29tbXVuaWNhdGlvbk9iamVjdCA9IHtcclxuICBpZDogJycsXHJcbiAgbmFtZTogJycsXHJcbiAgb3duZXI6ICcnLFxyXG4gIHNjaGVtZTogJ2NvbW0nLFxyXG4gIHN0YXJ0aW5nVGltZTogJycsXHJcbiAgbGFzdE1vZGlmaWVkOiAnJyxcclxuICBkdXJhdGlvbjogJycsXHJcbiAgc3RhdHVzOiAnJyxcclxuICBwYXJ0aWNpcGFudHM6IFtdXHJcbn07XHJcbiovXHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4qIFRvIG1hbmFnZSBHcm91cCBDaGF0IEludml0YXRpb25zXHJcbiogQGF1dGhvciBQYXVsbyBDaGFpbmhvIFtwYXVsby1nLWNoYWluaG9AYWx0aWNlbGFicy5jb21dXHJcbiogQHZlcnNpb24gMC4xLjBcclxuKi9cclxuXHJcbi8vIFRPRE86IGhhdmUgYW4gaW5zdGFuY2UgcGVyIENoYXRDb250cm9sbGVyXHJcblxyXG5jbGFzcyBJbnZpdGF0aW9uc0hhbmRsZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihoeXBlcnR5VVJMKSB7XHJcblxyXG4gICAgaWYgKCFoeXBlcnR5VVJMKSB0aHJvdyBFcnJvcignaHlwZXJ0eVVSTCBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlY3knKTtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX2h5cGVydHlVUkwgPSBoeXBlcnR5VVJMO1xyXG5cclxuICAgIF90aGlzLl9wZW5kaW5nID0ge307IC8vIEFsbCBwZW5kaW5nIGludml0YXRpb25zXHJcbiAgfVxyXG5cclxuICBzZXQgaW52aXRhdGlvblJlc3BvbnNlKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9pbnZpdGF0aW9uc1Jlc3BvbnNlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaGFuZGxlIG5vdGlmaWNhdGlvbnMgZm9yIGRpc2Nvbm5lY3RlZCBIeStlcnRpZXMuXHJcbiAgICogQHBhcmFtICB7RGlzY292ZXJlZE9iamVjdFtdfSAgICBkaXNjb25uZWN0ZWQgIGFycmF5IG9mIGRpc2NvdmVyZWQgaHlwZXJ0aWVzIHRoYXQgYXJlIGRpc2Nvbm5lY3RlZFxyXG4gICAqIEBwYXJhbSAge0RhdGFPYmplY3RSZXBvcnRlcn0gICAgRGF0YU9iamVjdFJlcG9ydGVyICAgRGF0YSBPYmplY3QgUmVwb3J0ZXIgYWRkcmVzc2VkIGJ5IGludml0YXRpb25zXHJcbiAgICovXHJcblxyXG4gIGludml0ZURpc2Nvbm5lY3RlZEh5cGVydGllcyhkaXNjb25uZWN0ZWQsIGRhdGFPYmplY3RSZXBvcnRlcikge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBjb25zb2xlLmxvZygnW0dyb3VwQ2hhdE1hbmFnZXIuSW52aXRhdGlvbnNIYW5kbGVyLmludml0ZURpc2Nvbm5lY3RlZEh5cGVydGllc10gbGV0cyBpbnZpdGUgJywgZGlzY29ubmVjdGVkKTtcclxuXHJcbiAgICBkaXNjb25uZWN0ZWQuZm9yRWFjaCgoZGlzY29ubmVjdGVkSHlwZXJ0eSk9PntcclxuXHJcbiAgICAgIGlmICghX3RoaXMuX3BlbmRpbmdbZGF0YU9iamVjdFJlcG9ydGVyXSkge1xyXG4gICAgICAgIF90aGlzLl9wZW5kaW5nW2RhdGFPYmplY3RSZXBvcnRlcl0gPSB7fTtcclxuICAgICAgfVxyXG5cclxuICAgICAgX3RoaXMuX3BlbmRpbmdbZGF0YU9iamVjdFJlcG9ydGVyXVtkaXNjb25uZWN0ZWRIeXBlcnR5LmRhdGEuaHlwZXJ0eUlEXSA9IGRpc2Nvbm5lY3RlZEh5cGVydHk7XHJcblxyXG4gICAgICBkaXNjb25uZWN0ZWRIeXBlcnR5Lm9uTGl2ZShfdGhpcy5faHlwZXJ0eVVSTCwoKT0+e1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbR3JvdXBDaGF0TWFuYWdlci5jcmVhdGVdIGRpc2Nvbm5lY3RlZCBIeXBlcnR5IGlzIGJhY2sgdG8gbGl2ZScsIGRpc2Nvbm5lY3RlZEh5cGVydHkpO1xyXG5cclxuICAgICAgICBkYXRhT2JqZWN0UmVwb3J0ZXIuaW52aXRlT2JzZXJ2ZXJzKFtkaXNjb25uZWN0ZWRIeXBlcnR5LmRhdGEuaHlwZXJ0eUlEXSk7XHJcblxyXG4gICAgICAgIGRpc2Nvbm5lY3RlZEh5cGVydHkudW5zdWJzY3JpYmVMaXZlKF90aGlzLl9oeXBlcnR5VVJMKTtcclxuXHJcbiAgICAgICAgZGVsZXRlIF90aGlzLl9wZW5kaW5nW2RhdGFPYmplY3RSZXBvcnRlcl1bZGlzY29ubmVjdGVkSHlwZXJ0eS5kYXRhLmh5cGVydHlJRF07XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJvY2VzcyBzZW50IGludml0YXRpb25zLiBJbiBjYXNlIGludml0YXRpb25zIGFyZSBub3QgYWNrbm93bGVkZ2UgYnkgcmVjaXBpZW50IGl0IHdpbGwgYmUgaGFuZGxlZCBhcyBhIGRpc2Nvbm5lY3RlZCBoeXBlcnR5XHJcbiAgICogQHBhcmFtICB7RGlzY292ZXJlZE9iamVjdFtdfSAgICBsaXZlICBhcnJheSBvZiBkaXNjb3ZlcmVkIGh5cGVydGllcyB0aGF0IGFyZSBvciB3ZXJlIGxpdmVcclxuICAgKiBAcGFyYW0gIHtEYXRhT2JqZWN0UmVwb3J0ZXJ9ICAgIERhdGFPYmplY3RSZXBvcnRlciAgIERhdGEgT2JqZWN0IFJlcG9ydGVyIGFkZHJlc3NlZCBieSBpbnZpdGF0aW9uc1xyXG4gICAqL1xyXG5cclxuICBwcm9jZXNzSW52aXRhdGlvbnMobGl2ZSwgZGF0YU9iamVjdFJlcG9ydGVyKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBpbnZpdGF0aW9ucyA9IGRhdGFPYmplY3RSZXBvcnRlci5pbnZpdGF0aW9ucyB8fCBbXTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW0dyb3VwQ2hhdE1hbmFnZXIuSW52aXRhdGlvbnNIYW5kbGVyLnByb2Nlc3NJbnZpdGF0aW9uc10gd2FpdGluZyBmb3IgcmVwbGllcyAnLCBpbnZpdGF0aW9ucywgdGhpcy5faW52aXRhdGlvbnNSZXNwb25zZSk7XHJcblxyXG4gICAgaW52aXRhdGlvbnMuZm9yRWFjaCgoaW52aXRhdGlvbikgPT4ge1xyXG4gICAgICBpbnZpdGF0aW9uLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbR3JvdXBDaGF0TWFuYWdlci5JbnZpdGF0aW9uc0hhbmRsZXIucHJvY2Vzc0ludml0YXRpb25zXSAtIE9LOiAnLCByZXN1bHQsIHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLl9pbnZpdGF0aW9uc1Jlc3BvbnNlKSB7IHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UocmVzdWx0KTsgfVxyXG4gICAgICB9KS5jYXRjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5wcm9jZXNzSW52aXRhdGlvbnNdIC0gTk9UIE9LOiAnLCByZXN1bHQsIHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UpO1xyXG4gICAgICAgIGlmICh0aGlzLl9pbnZpdGF0aW9uc1Jlc3BvbnNlKSB7IHRoaXMuX2ludml0YXRpb25zUmVzcG9uc2UocmVzdWx0KTsgfVxyXG4gICAgICAgIF90aGlzLmludml0ZURpc2Nvbm5lY3RlZEh5cGVydGllcyhbbGl2ZVtyZXN1bHQuaW52aXRlZF1dLCBkYXRhT2JqZWN0UmVwb3J0ZXIpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHJlc3VtZURpc2NvdmVyaWVzKGRpc2NvdmVyeUVuZ2luZSwgZ3JvdXBDaGF0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgbGl2ZSA9IHt9O1xyXG4gICAgICBsZXQgbGl2ZUh5cGVydGllcyA9IFtdO1xyXG4gICAgICBsZXQgZGlzY29ubmVjdGVkID0gW107XHJcbiAgICAgIGxldCB1bnN1YnNjcmlwdG9uUHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgIGRpc2NvdmVyeUVuZ2luZS5yZXN1bWVEaXNjb3ZlcmllcygpLnRoZW4oKGRpc2NvdmVyaWVzKSA9PiB7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbR3JvdXBDaGF0TWFuYWdlci5JbnZpdGF0aW9uc0hhbmRsZXIucmVzdW1lRGlzY292ZXJpZXNdIGZvdW5kOiAnLCBkaXNjb3Zlcmllcyk7XHJcblxyXG4gICAgICAgIGRpc2NvdmVyaWVzLmZvckVhY2goKGRpc2NvdmVyeSkgPT57XHJcblxyXG4gICAgICAgICAgaWYgKGRpc2NvdmVyeS5kYXRhLnJlc291cmNlcyAmJiBkaXNjb3ZlcnkuZGF0YS5yZXNvdXJjZXNbMF0gPT09ICdjaGF0Jykge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW0dyb3VwQ2hhdE1hbmFnZXIuSW52aXRhdGlvbnNIYW5kbGVyLnJlc3VtZURpc2NvdmVyaWVzXSByZXN1bWluZzogJywgZGlzY292ZXJ5KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkaXNjb3ZlcnkuZGF0YS5zdGF0dXMgPT09ICdsaXZlJyApIHsvLyBwcmV2aW91c2x5IGRpc2NvdmVyZWQgb2JqZWN0IGlzIG5vdyBsaXZlXHJcbiAgICAgICAgICAgICAgbGl2ZVtkaXNjb3ZlcnkuZGF0YS5oeXBlcnR5SURdID0gZGlzY292ZXJ5O1xyXG4gICAgICAgICAgICAgIGxpdmVIeXBlcnRpZXMucHVzaChkaXNjb3ZlcnkuZGF0YS5oeXBlcnR5SUQpO1xyXG4gICAgICAgICAgICAgIHVuc3Vic2NyaXB0b25Qcm9taXNlcy5wdXNoKCBkaXNjb3ZlcnkudW5zdWJzY3JpYmVMaXZlKF90aGlzLl9oeXBlcnR5VVJMKSApO1xyXG4gICAgICAgICAgICB9IGVsc2Ugey8vIHByZXZpb3VzbHkgZGlzY292ZXJlZCBvYmplY3QgaXMgc3RpbGwgZGlzY29ubmVjdGVkXHJcbiAgICAgICAgICAgICAgZGlzY29ubmVjdGVkLnB1c2goZGlzY292ZXJ5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChkaXNjb25uZWN0ZWQubGVuZ3RoID4gMCkgX3RoaXMuaW52aXRlRGlzY29ubmVjdGVkSHlwZXJ0aWVzKGRpc2Nvbm5lY3RlZCwgZ3JvdXBDaGF0KTtcclxuXHJcbiAgICAgICAgaWYgKCBPYmplY3Qua2V5cyhsaXZlKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBncm91cENoYXQuaW52aXRlT2JzZXJ2ZXJzKGxpdmVIeXBlcnRpZXMpO1xyXG5cclxuICAgICAgICAgIGlmIChncm91cENoYXQuaW52aXRhdGlvbnMubGVuZ3RoID4gMCkgX3RoaXMucHJvY2Vzc0ludml0YXRpb25zKGxpdmUsIGdyb3VwQ2hhdCk7XHJcblxyXG4gICAgICAgICAgUHJvbWlzZS5hbGwodW5zdWJzY3JpcHRvblByb21pc2VzKS50aGVuKCgpPT57IHJlc29sdmUoKX0pO1xyXG5cclxuICAgICAgICB9IGVsc2UgcmVzb2x2ZSgpO1xyXG5cclxuICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICByZWplY3QoJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5yZXN1bWVEaXNjb3Zlcmllc10gZmFpbGVkIHwgJywgcmVhc29uKTtcclxuICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgYW5kIGNsZWFuIGFsbCBwZW5kaW5nIGludml0YXRpb25zLlxyXG4gICAqIEBwYXJhbSAge0RhdGFPYmplY3RSZXBvcnRlcn0gICAgRGF0YU9iamVjdFJlcG9ydGVyICAgRGF0YSBPYmplY3QgUmVwb3J0ZXIgYWRkcmVzc2VkIGJ5IGludml0YXRpb25zXHJcbiAgICogQHJldHVybiB7UHJvbWlzZX0gcmV0dXJuIGEgcHJvbWlzZSB3aGVuIGFsbCB1bnN1YnNjcmlwdG9ucyBmb3IgcGVuZGluZyBpbnZpdGF0aW9ucyBhcmUgZmluaXNoZWRcclxuICAgKi9cclxuXHJcbiAgY2xlYW5JbnZpdGF0aW9ucyhkYXRhT2JqZWN0UmVwb3J0ZXIpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGNoYXRJbnZpdGF0aW9ucyA9IF90aGlzLl9wZW5kaW5nW2RhdGFPYmplY3RSZXBvcnRlcl07XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tHcm91cENoYXRNYW5hZ2VyLkludml0YXRpb25zSGFuZGxlci5jbGVhbkludml0YXRpb25zXSAnLCBjaGF0SW52aXRhdGlvbnMpO1xyXG5cclxuICAgIGlmIChjaGF0SW52aXRhdGlvbnMpIHtcclxuXHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgbGV0IHBlbmRpbmdJbnZpdGF0aW9ucyA9IE9iamVjdC5rZXlzKGNoYXRJbnZpdGF0aW9ucyk7XHJcblxyXG4gICAgICAgIGxldCB1bnN1YnNjcmlwdG9uUHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgcGVuZGluZ0ludml0YXRpb25zLmZvckVhY2goKGludml0YXRpb24pPT57XHJcbiAgICAgICAgICB1bnN1YnNjcmlwdG9uUHJvbWlzZXMucHVzaCggY2hhdEludml0YXRpb25zW2ludml0YXRpb25dLnVuc3Vic2NyaWJlTGl2ZShfdGhpcy5faHlwZXJ0eVVSTCkgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgUHJvbWlzZS5hbGwocGVuZGluZ0ludml0YXRpb25zKS50aGVuKCgpPT57IHJlc29sdmUoKTsgfSk7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2UgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG5cclxuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSW52aXRhdGlvbnNIYW5kbGVyO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuKiBUaGUgR3JvdXAgQ2hhdCBBUEkgaXMgdXNlZCB0byBjb250cm9sIGEgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cclxuKiBAYXV0aG9yIFZpdG9yIFNpbHZhIFt2aXRvci10LXNpbHZhQHRlbGVjb20ucHRdXHJcbiogQHZlcnNpb24gMC4xLjBcclxuKi9cclxuXHJcbi8vaW1wb3J0IHsgVXNlckluZm8gfSBmcm9tICcuL1VzZXJJbmZvJztcclxuaW1wb3J0IFJlZ2lzdHJhdGlvblN0YXR1cyBmcm9tICcuLi9kaXNjb3ZlcnkvUmVnaXN0cmF0aW9uU3RhdHVzJztcclxuaW1wb3J0IEludml0YXRpb25zSGFuZGxlciBmcm9tICcuL0ludml0YXRpb25zSGFuZGxlcic7XHJcblxyXG5jbGFzcyBDaGF0Q29udHJvbGxlciB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHN5bmNoZXIsIGRpc2NvdmVyeSwgZG9tYWluLCBzZWFyY2gsIGlkZW50aXR5LCBtYW5hZ2VyKSB7XHJcblxyXG4gICAgaWYgKCFzeW5jaGVyKSB0aHJvdyBFcnJvcignU3luY2hlciBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlY3knKTtcclxuICAgIGlmICghZGlzY292ZXJ5KSB0aHJvdyBFcnJvcignRGlzY292ZXIgaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XHJcbiAgICBpZiAoIWRvbWFpbikgdGhyb3cgRXJyb3IoJ0RvbWFpbiBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlY3knKTtcclxuICAgIGlmICghc2VhcmNoKSB0aHJvdyBFcnJvcignU2VhcmNoIGlzIGEgbmVjZXNzYXJ5IGRlcGVuZGVjeScpO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fc3luY2hlciA9IHN5bmNoZXI7XHJcbiAgICBfdGhpcy5kaXNjb3ZlcnkgPSBkaXNjb3Zlcnk7XHJcbiAgICBfdGhpcy5zZWFyY2ggPSBzZWFyY2g7XHJcbiAgICBfdGhpcy5teUlkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdyZXBvcnRlcic7XHJcbiAgICBfdGhpcy5jaGlsZF9jc2VxID0gMDtcclxuICAgIF90aGlzLmRvbWFpbiA9IGRvbWFpbjtcclxuXHJcbiAgICBfdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XHJcblxyXG4gICAgY29uc3QgaHlwZXJ0eVVSTCA9IHN5bmNoZXIub3duZXI7XHJcblxyXG4gICAgX3RoaXMuX29iamVjdERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIGRvbWFpbiArICcvLndlbGwta25vd24vZGF0YXNjaGVtYS9Db21tdW5pY2F0aW9uJztcclxuXHJcbiAgICBfdGhpcy5faW52aXRhdGlvbnNIYW5kbGVyID0gbmV3IEludml0YXRpb25zSGFuZGxlcihoeXBlcnR5VVJMKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXQgaW52aXRhdGlvbnNIYW5kbGVyKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ludml0YXRpb25zSGFuZGxlcjtcclxuICB9XHJcblxyXG4gIGdldCB1cmwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuZGF0YU9iamVjdFJlcG9ydGVyLnVybCA6IHRoaXMuZGF0YU9iamVjdE9ic2VydmVyLnVybDtcclxuICB9XHJcblxyXG4gIHNldCBkYXRhT2JqZWN0UmVwb3J0ZXIoZGF0YU9iamVjdFJlcG9ydGVyKSB7XHJcblxyXG4gICAgaWYgKCFkYXRhT2JqZWN0UmVwb3J0ZXIpIHRocm93IG5ldyBFcnJvcignW0NoYXRDb250cm9sbGVyXSBUaGUgZGF0YSBvYmplY3QgcmVwb3J0ZXIgaXMgbmVjZXNzYXJ5IHBhcmFtZXRlciAnKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuY29udHJvbGxlck1vZGUgPSAncmVwb3J0ZXInO1xyXG5cclxuICAgIC8vIEhhbmRsZXIgdG8gcHJvY2VzcyByZWNlaXZlZCBmaWxlc1xyXG5cclxuICAgIC8vIGRhdGFPYmplY3RSZXBvcnRlci5vblJlc3BvbnNlKGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdFJlcG9ydGVyIC0gb25SZXNwb25zZV0nLCBldmVudCk7XHJcbiAgICAvLyAgIGlmIChfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UpIHtcclxuICAgIC8vICAgICBfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UoZXZlbnQpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvL1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgZGF0YU9iamVjdFJlcG9ydGVyLm9uU3Vic2NyaXB0aW9uKGZ1bmN0aW9uKGV2ZW50KSB7XHJcblxyXG4gICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlICdzdWJzY3JpYmUnOiBfdGhpcy5fb25TdWJzY3JpYmUoZXZlbnQpOyBicmVhaztcclxuICAgICAgICBjYXNlICd1bnN1YnNjcmliZSc6IF90aGlzLl9vblVuc3Vic2NyaWJlKGV2ZW50KTsgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIF90aGlzLl9zZXRPbkFkZENoaWxkTGlzdGVuZXIoZGF0YU9iamVjdFJlcG9ydGVyKTtcclxuXHJcbiAgICBkYXRhT2JqZWN0UmVwb3J0ZXIub25SZWFkKChldmVudCkgPT4ge1xyXG4gICAgICBldmVudC5hY2NlcHQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRhdGFPYmplY3RSZXBvcnRlci5vbkV4ZWN1dGUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZXZlbnQubWV0aG9kKSB7XHJcbiAgICAgICAgY2FzZSAnYWRkVXNlcic6XHJcbiAgICAgICAgICBfdGhpcy5hZGRVc2VyKGV2ZW50LnBhcmFtc1swXSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LmFjY2VwdCgpO1xyXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xyXG4gICAgICAgICAgICBldmVudC5yZWplY3QocmVhc29uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdyZW1vdmVVc2VyJzpcclxuICAgICAgICAgICAgX3RoaXMucmVtb3ZlVXNlcihldmVudC5wYXJhbXMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGV2ZW50LmFjY2VwdCgpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWFzb246JywgcmVhc29uKTtcclxuICAgICAgICAgICAgICBldmVudC5yZWplY3QocmVhc29uKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6IGV2ZW50LnJlamVjdCgnW0NoYXRDb250cm9sbGVyLm9uRXhlY3V0ZV0gQ2hhdCBtZXRob2QgZXhlY3V0aW9uIG5vdCBhY2NlcHRlZCBieSBSZXBvcnRlcicpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIF90aGlzLl9kYXRhT2JqZWN0UmVwb3J0ZXIgPSBkYXRhT2JqZWN0UmVwb3J0ZXI7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFPYmplY3RSZXBvcnRlcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuICB9XHJcblxyXG4gIGdldCBtZXNzYWdlcygpIHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlci5fY2hpbGRyZW5PYmplY3RzIDogdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyLl9jaGlsZHJlbk9iamVjdHM7XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0YU9iamVjdE9ic2VydmVyKGRhdGFPYmplY3RPYnNlcnZlcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdvYnNlcnZlcic7XHJcblxyXG4gICAgX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlciA9IGRhdGFPYmplY3RPYnNlcnZlcjtcclxuXHJcbiAgICBkYXRhT2JqZWN0T2JzZXJ2ZXIub25DaGFuZ2UoJyonLCBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1PYnNlcnZlciAtIG9uQ2hhbmdlJywgZXZlbnQpO1xyXG5cclxuICAgICAgaWYgKGV2ZW50LmZpZWxkLmluY2x1ZGVzKCdwYXJ0aWNpcGFudHMnKSkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY1R5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ2FkZCc6XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fb25Vc2VyQWRkZWQpIF90aGlzLl9vblVzZXJBZGRlZChldmVudCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgJ3JlbW92ZSc6XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fb25Vc2VyUmVtb3ZlZCkgX3RoaXMuX29uVXNlclJlbW92ZWQoZXZlbnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25DaGFuZ2UpIF90aGlzLl9vbkNoYW5nZShldmVudCk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgX3RoaXMuX3NldE9uQWRkQ2hpbGRMaXN0ZW5lcihkYXRhT2JqZWN0T2JzZXJ2ZXIpO1xyXG5cclxuICAgIC8vIGxldCBjaGlsZHJlbnMgPSBkYXRhT2JqZWN0T2JzZXJ2ZXIuY2hpbGRyZW5zO1xyXG4gICAgLy8gT2JqZWN0LmtleXMoY2hpbGRyZW5zKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgLy8gICBpZiAoX3RoaXMuX29uTWVzc2FnZSkgX3RoaXMuX29uTWVzc2FnZSh7XHJcbiAgICAvLyAgICAgY2hpbGRJZDogY2hpbGQsXHJcbiAgICAvLyAgICAgaWRlbnRpdHk6IGNoaWxkcmVuc1tjaGlsZF0uaWRlbnRpdHksXHJcbiAgICAvLyAgICAgdmFsdWU6IGNoaWxkcmVuc1tjaGlsZF0uZGF0YVxyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFPYmplY3RPYnNlcnZlcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlcjtcclxuICB9XHJcblxyXG4gIF9zZXRPbkFkZENoaWxkTGlzdGVuZXIoZGF0YU9iamVjdCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgZGF0YU9iamVjdC5vbkFkZENoaWxkKGZ1bmN0aW9uKGNoaWxkKSB7XHJcbiAgICAgIF90aGlzLmNoaWxkX2NzZXEgKz0xO1xyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5fc2V0T25BZGRDaGlsZExpc3RlbmVyXSBuZXcgQ2hpbGQgcmVjZWl2ZWQ6ICcsIGNoaWxkKTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25NZXNzYWdlKSBfdGhpcy5fb25NZXNzYWdlKGNoaWxkKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBnZXQgZGF0YU9iamVjdCgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInID8gdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIgOiB0aGlzLmRhdGFPYmplY3RPYnNlcnZlcjtcclxuICB9XHJcblxyXG4gIHNldCBjbG9zZUV2ZW50KGV2ZW50KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX2Nsb3NlRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICBpZiAoX3RoaXMuX29uQ2xvc2UpIF90aGlzLl9vbkNsb3NlKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGdldCBjbG9zZUV2ZW50KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fY2xvc2VFdmVudDtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgX29uU3Vic2NyaWJlKGV2ZW50KSB7XHJcblxyXG4gICAgbGV0IGRhdGFPYmplY3RSZXBvcnRlciA9IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuXHJcbiAgICBldmVudC5hY2NlcHQoKTtcclxuXHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZV0gZXZlbnQnLCBldmVudCwgZGF0YU9iamVjdFJlcG9ydGVyLnVybCk7XHJcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uU3Vic2NyaWJlXSBOZXcgdXNlciBoYXMgc3Vic2NyaWJlIHRoaXMgb2JqZWN0OiAnLCBkYXRhT2JqZWN0UmVwb3J0ZXIuZGF0YSwgZXZlbnQuaWRlbnRpdHkpO1xyXG5cclxuICAgIGxldCBpZGVudGl0eSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQuaWRlbnRpdHkpKTtcclxuXHJcbiAgICBpZiAoaWRlbnRpdHkuaGFzT3duUHJvcGVydHkoJ2Fzc2VydGlvbicpKSB7XHJcbiAgICAgIGRlbGV0ZSBpZGVudGl0eS5hc3NlcnRpb25cclxuICAgIH1cclxuXHJcbiAgICBsZXQgdXNlckluZm8gPSB7XHJcbiAgICAgIGh5cGVydHlVUkw6IGV2ZW50LnVybCxcclxuICAgICAgZG9tYWluOiBldmVudC5kb21haW4sXHJcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eVxyXG4gICAgfVxyXG4gICAgbGV0IHVzZXJVUkwgPSBldmVudC5pZGVudGl0eS51c2VyUHJvZmlsZS5ndWlkO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdICBuZXcgcGFydGljaXBhbnQnLCB1c2VySW5mbyk7XHJcbiAgICBpZiAoZXZlbnQuaWRlbnRpdHkubGVnYWN5KSB7XHJcbiAgICAgdXNlckluZm8ubGVnYWN5ID0gZXZlbnQuaWRlbnRpdHkubGVnYWN5O1xyXG4gICAgfVxyXG5cclxuICAgIGRhdGFPYmplY3RSZXBvcnRlci5kYXRhLnBhcnRpY2lwYW50c1t1c2VyVVJMXSA9IHVzZXJJbmZvO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdIGNvbW11bmljYXRpb25PYmplY3QgT0JKIGNoYXRjb250cm9sbGVyJywgZGF0YU9iamVjdFJlcG9ydGVyLmRhdGEucGFydGljaXBhbnRzKTtcclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmUgLSBvblN1YnNjcmlwdGlvbl0gJywgdXNlckluZm8pO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZSAtIHRoaXMuX29uVXNlckFkZGVkXSAnLCB0aGlzLl9vblVzZXJBZGRlZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX29uVXNlckFkZGVkKSB0aGlzLl9vblVzZXJBZGRlZCh1c2VySW5mbyk7XHJcbiAgfVxyXG5cclxuICBfb25VbnN1YnNjcmliZShldmVudCkge1xyXG4gICAgbGV0IGRhdGFPYmplY3RSZXBvcnRlciA9IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uVW5zdWJzY3JpYmVdIGV2ZW50JywgZXZlbnQsIGRhdGFPYmplY3RSZXBvcnRlci51cmwpO1xyXG5cclxuICAgIGxldCBwYXJ0aWNpcGFudCA9IGV2ZW50LmlkZW50aXR5LnVzZXJQcm9maWxlO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZV0gIHBhcnRpY2lwYW50IGxlZnQnLCBwYXJ0aWNpcGFudCk7XHJcbiAgICBpZiAoZXZlbnQuaWRlbnRpdHkubGVnYWN5KSB7XHJcbiAgICAgIHBhcnRpY2lwYW50LmxlZ2FjeSA9IGV2ZW50LmlkZW50aXR5LmxlZ2FjeTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGUgZGF0YU9iamVjdFJlcG9ydGVyLmRhdGEucGFydGljaXBhbnRzW3BhcnRpY2lwYW50LnVzZXJVUkxdO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZSAtIHRoaXMuX29uVXNlclJlbW92ZWRdICcsIHRoaXMub25Vc2VyUmVtb3ZlZCk7XHJcbiAgICBpZiAodGhpcy5fb25Vc2VyUmVtb3ZlZCkgdGhpcy5fb25Vc2VyUmVtb3ZlZChwYXJ0aWNpcGFudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGZpbGUuXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgIElzIHRoZSBmaWxlIHRvIGJlIHNlbnQuXHJcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb21tdW5pY2F0aW9uLkNoYXRNZXNzYWdlPn0gICAgICAgIEl0IHJldHVybnMgdGhlIENoYXRNZXNzYWdlIGNoaWxkIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBTeW5jaGVyIGFzIGEgUHJvbWlzZS5cclxuICAgKi9cclxuICBzZW5kRmlsZShmaWxlKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBtb2RlID0gX3RoaXMuY29udHJvbGxlck1vZGU7XHJcbiAgICBsZXQgZGF0YU9iamVjdCA9IG1vZGUgPT09ICdyZXBvcnRlcicgPyBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIgOiBfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXI7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IGlkZW50aXR5ID0ge1xyXG4gICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBkYXRhT2JqZWN0LmFkZEh5cGVydHlSZXNvdXJjZSgncmVzb3VyY2VzJywgJ2ZpbGUnLCAgZmlsZSwgaWRlbnRpdHkpLnRoZW4oZnVuY3Rpb24ocmVzb3VyY2VGaWxlKSB7XHJcblxyXG4gICAgICAgICAgbGV0IGlkZW50aXR5ID0ge1xyXG4gICAgICAgICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgbGV0IGZpbGVTZW50RXZ0ID0geyB2YWx1ZSA6IHJlc291cmNlRmlsZSwgaWRlbnRpdHk6IGlkZW50aXR5LCByZXNvdXJjZTogcmVzb3VyY2VGaWxlfTtcclxuXHJcbiAgICAgICAgICBsZXQgcmVwb3J0ZXJTdGF0dXMgPSBuZXcgUmVnaXN0cmF0aW9uU3RhdHVzKGRhdGFPYmplY3QudXJsLCBfdGhpcy5fbWFuYWdlci5fcnVudGltZVVSTCwgX3RoaXMuX21hbmFnZXIuX2h5cGVydHlVUkwsIF90aGlzLl9tYW5hZ2VyLl9idXMgKTtcclxuXHJcbiAgICAgICAgICAvLyByZWN1cnNpdmUgZnVuY3Rpb24gdG8gc3luYyB3aXRoIGNoYXQgcmVwb3J0ZXJcclxuXHJcbiAgICAgICAgICAgIGxldCBzaGFyZTJSZXBvcnRlciA9IGZ1bmN0aW9uKGZpbGUsIHN1YnNjcmliZXIsIGV2dCwgc3RhdHVzKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHN0YXR1c09mUmVwb3J0ZXIgPSBzdGF0dXM7XHJcbiAgICAgICAgICAgICAgZmlsZS5zaGFyaW5nU3RhdHVzLnRoZW4ocmVzb2x2ZShldnQpKS5jYXRjaCgocmVzdWx0KT0+e1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5zZW5kRmlsZV0gc2hhcmUgZmFpbGVkOiAnLCByZXN1bHQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHN0YXR1c09mUmVwb3J0ZXIub25MaXZlKCBzdWJzY3JpYmVyLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXNPZlJlcG9ydGVyLnVuc3Vic2NyaWJlTGl2ZShzdWJzY3JpYmVyKTtcclxuICAgICAgICAgICAgICAgIGZpbGUuc2hhcmUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzaGFyZTJSZXBvcnRlcihmaWxlLCBzdWJzY3JpYmVyLCBldnQsIHN0YXR1c09mUmVwb3J0ZXIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIC8vVE9ETzogc3Vic2NyaWJlIHRvIHN5bmMgd2hlbiByZXBvcnRlciBpcyBsaXZlLiBOZXcgc3luY2hlZCBtZXNzYWdlcyBzaG91bGQgdHJpZ2dlciBvbk1lc3NhZ2UgaWUgb25DaGlsZFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBzaGFyZTJSZXBvcnRlcihyZXNvdXJjZUZpbGUsIF90aGlzLl9tYW5hZ2VyLl9oeXBlcnR5VVJMLCBmaWxlU2VudEV2dCwgcmVwb3J0ZXJTdGF0dXMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xyXG4gICAgICByZWplY3QocmVhc29uKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZW5kIGEgY2hhdCBtZXNzYWdlLlxyXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICAgIG1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICBJcyB0aGUgQ2hhdE1lc3NhZ2UgdG8gYmUgc2VudC5cclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENvbW11bmljYXRpb24uQ2hhdE1lc3NhZ2U+fSAgICAgICAgSXQgcmV0dXJucyB0aGUgQ2hhdE1lc3NhZ2UgY2hpbGQgb2JqZWN0IGNyZWF0ZWQgYnkgdGhlIFN5bmNoZXIgYXMgYSBQcm9taXNlLlxyXG4gICAqL1xyXG4gIHNlbmQobWVzc2FnZSwgaWRlbnRpdHkpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IG1vZGUgPSBfdGhpcy5jb250cm9sbGVyTW9kZTtcclxuICAgIGxldCBkYXRhT2JqZWN0ID0gbW9kZSA9PT0gJ3JlcG9ydGVyJyA/IF90aGlzLmRhdGFPYmplY3RSZXBvcnRlciA6IF90aGlzLmRhdGFPYmplY3RPYnNlcnZlcjtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4vLyAgICAgIGxldCBfZGF0YU9iamVjdENoaWxkO1xyXG4gICAgICBfdGhpcy5jaGlsZF9jc2VxICs9IDE7XHJcbiAgICAgIGxldCBtc2cgPSB7XHJcblxyXG4vKiAgICAgICAgdXJsOiBkYXRhT2JqZWN0LmRhdGEudXJsLFxyXG4gICAgICAgIGNzZXE6IF90aGlzLmNoaWxkX2NzZXEsXHJcbiAgICAgICAgcmVwb3J0ZXI6IGRhdGFPYmplY3QuZGF0YS5yZXBvcnRlcixcclxuICAgICAgICBzY2hlbWE6IGRhdGFPYmplY3QuZGF0YS5zY2hlbWEsXHJcbiAgICAgICAgbmFtZTogZGF0YU9iamVjdC5kYXRhLm5hbWUsXHJcbiAgICAgICAgY3JlYXRlZCA6IG5ldyBEYXRlKCkudG9KU09OKCksKi9cclxuXHJcbiAgICAgICAgdHlwZTogJ2NoYXQnLFxyXG4gICAgICAgIGNvbnRlbnQ6IG1lc3NhZ2VcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHNlbmRlciA9IGlkZW50aXR5ID8gaWRlbnRpdHkgOiB7XHJcbiAgICAgICAgdXNlclByb2ZpbGU6IF90aGlzLm15SWRlbnRpdHlcclxuICAgICAgfTtcclxuXHJcblxyXG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgY2hhdG1lc3NhZ2VzIHRvIHJlc291cmNlIC0gY2hhdCwgZmlsZVxyXG4gICAgICAvLyBUT0RPOiBjaGFuZ2UgbWVzc2FnZSB0byBoeXBlcnR5UmVzb3VyY2UgLSBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L2Rldi1zZXJ2aWNlLWZyYW1ld29yay90cmVlL2RldmVsb3AvZG9jcy9kYXRhbW9kZWwvZGF0YS1vYmplY3RzL2h5cGVydHktcmVzb3VyY2VcclxuICAgICAgLy8gVE9ETzogaGFuZGxlIHdpdGggbXVsdGlwbGUgcmVzb3VyY2VzIC0gaWYgdGhlIFwibWVzc2FnZVwiIHdpbGwgYmUgZGlmZmVyZW50IGZvciBlYWNoIHR5cGUgb2YgcmVzb3VyY2VzXHJcbiAgICAgIGRhdGFPYmplY3QuYWRkQ2hpbGQobXNnLCBzZW5kZXIpLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdENoaWxkKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1bYWRkQ2hpbGQgLSBDaGF0IE1lc3NhZ2VdOiAnLCBkYXRhT2JqZWN0Q2hpbGQpO1xyXG4gICAgICAgIC8vcmVzb2x2ZShkYXRhT2JqZWN0Q2hpbGQpO1xyXG5cclxuICAgICAgICAvL1RPRE86IG1vdmUgdG8gc2VwYXJhdGUgZnVuY3Rpb25cclxuXHJcblxyXG4gICAgICAgIGxldCBtc2cgPSB7XHJcbiAgICAgICAgICBjaGlsZElkOiBkYXRhT2JqZWN0Q2hpbGQuX2NoaWxkSWQsXHJcbiAgICAgICAgICBmcm9tOiBkYXRhT2JqZWN0Q2hpbGQuX293bmVyLFxyXG4gICAgICAgICAgdmFsdWU6IGRhdGFPYmplY3RDaGlsZC5kYXRhLFxyXG4gICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXHJcbiAgICAgICAgICBpZGVudGl0eTogc2VuZGVyXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IHJlcG9ydGVyU3RhdHVzID0gbmV3IFJlZ2lzdHJhdGlvblN0YXR1cyhkYXRhT2JqZWN0LnVybCwgX3RoaXMuX21hbmFnZXIuX3J1bnRpbWVVUkwsIF90aGlzLl9tYW5hZ2VyLl9oeXBlcnR5VVJMLCBfdGhpcy5fbWFuYWdlci5fYnVzICk7XHJcblxyXG4gICAgICAgIC8vIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0byBzeW5jIHdpdGggY2hhdCByZXBvcnRlclxyXG5cclxuICAgICAgICAgIGxldCBzaGFyZTJSZXBvcnRlciA9IGZ1bmN0aW9uKGNoaWxkLCBzdWJzY3JpYmVyLCBtc2csIHN0YXR1cykge1xyXG4gICAgICAgICAgICBsZXQgc3RhdHVzT2ZSZXBvcnRlciA9IHN0YXR1cztcclxuICAgICAgICAgICAgY2hpbGQuc2hhcmluZ1N0YXR1cy50aGVuKHJlc29sdmUobXNnKSkuY2F0Y2goKHJlc3VsdCk9PntcclxuXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNPZlJlcG9ydGVyLm9uTGl2ZSggc3Vic2NyaWJlciwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBzdGF0dXNPZlJlcG9ydGVyLnVuc3Vic2NyaWJlTGl2ZShzdWJzY3JpYmVyKTtcclxuICAgICAgICAgICAgICAgICAgY2hpbGQuc2hhcmUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIHNoYXJlMlJlcG9ydGVyKGNoaWxkLCBzdWJzY3JpYmVyLCBtc2csIHN0YXR1c09mUmVwb3J0ZXIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAvL1RPRE86IHN1YnNjcmliZSB0byBzeW5jIHdoZW4gcmVwb3J0ZXIgaXMgbGl2ZS4gTmV3IHN5bmNoZWQgbWVzc2FnZXMgc2hvdWxkIHRyaWdnZXIgb25NZXNzYWdlIGllIG9uQ2hpbGRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc2hhcmUyUmVwb3J0ZXIoZGF0YU9iamVjdENoaWxkLCBfdGhpcy5fbWFuYWdlci5faHlwZXJ0eVVSTCwgbXNnLCByZXBvcnRlclN0YXR1cyk7XHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBbb25DaGFuZ2UgZGVzY3JpcHRpb25dXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIFtkZXNjcmlwdGlvbl1cclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uQ2hhbmdlKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uQ2hhbmdlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSBuZXcgbWVzc2FnZXMuXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGhhbmRsZSB3aXRoIG5ldyBtZXNzYWdlc1xyXG4gICAqIEByZXR1cm4ge0NvbW11bmljYXRpb24uQ2hhdE1lc3NhZ2V9IG1cclxuICAgKi9cclxuICBvbk1lc3NhZ2UoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25NZXNzYWdlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBbb25Vc2VyQWRkZWQgZGVzY3JpcHRpb25dXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIFtkZXNjcmlwdGlvbl1cclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uVXNlckFkZGVkKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uVXNlckFkZGVkID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIHRoZSBhbiB1c2VyIHdhcyByZW1vdmVkXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIGhhbmRsZSB3aXRoIHRoZSByZW1vdmVkIHVzZXJcclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uVXNlclJlbW92ZWQoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25Vc2VyUmVtb3ZlZCA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlY2VpdmUgcmVxdWVzdHMgdG8gY2xvc2UgdGhlIEdyb3VwIENoYXQgaW5zdGFuY2UuXHJcbiAgICogQHJldHVybiB7RGVsZXRlRXZlbnR9IFRoZSBEZWxldGVFdmVudCBmaXJlZCBieSB0aGUgU3luY2hlciB3aGVuIHRoZSBDaGF0IGlzIGNsb3NlZC5cclxuICAgKi9cclxuICBvbkNsb3NlKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uQ2xvc2UgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIG9uUmVzcG9uc2UoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25SZXNwb25zZSA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCAvIGludml0ZSBuZXcgdXNlciBvbiBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxyXG4gICAqIE9ubHkgdGhlIFJlcG9ydGVyLCBpLmUuIHRoZSBIeXBlcnR5IHRoYXQgaGFzIGNyZWF0ZWQgdGhlIEdyb3VwIENoYXQsIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIHtVUkwuVXNlclVSTH0gIHVzZXJzICBVc2VyIHRvIGJlIGludml0ZWQgdG8gam9pbiB0aGUgR3JvdXAgQ2hhdCB0aGF0IGlzIGlkZW50aWZpZWQgd2l0aCByZVRISU5LIFVzZXIgVVJMLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59ICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW52aXRlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYWRkVXNlcih1c2Vycykge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGhhdmVFbXB0eUVsZW1lbnRzID0gKGVsZW1lbnQpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ0VsZW1lbnQ6JywgZWxlbWVudC5sZW5ndGgpO1xyXG4gICAgICByZXR1cm4gZWxlbWVudC5sZW5ndGggIT09IDA7XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBub3RGb3VuZEVsZW1lbnRzID0gKGVsZW1lbnQpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ3VzZXIgbm90IGZvdW5kOiAnLCBlbGVtZW50KTtcclxuICAgICAgcmV0dXJuICEoZWxlbWVudCBpbnN0YW5jZW9mIFN0cmluZyk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGlmICh1c2Vycy5maWx0ZXIoaGF2ZUVtcHR5RWxlbWVudHMpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHJldHVybiByZWplY3QoJ0RvblxcJ3QgaGF2ZSB1c2VycyB0byBpbnZpdGUnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlcnMgXTogJywgdXNlcnMpO1xyXG5cclxuICAgICAgLypfdGhpcy5zZWFyY2gudXNlcnModXNlcnMsIGRvbWFpbnMsIFsnY29tbSddLCBbJ2NoYXQnXSlcclxuXHJcbiAgICAudGhlbigoaHlwZXJ0aWVzSURzKSA9PiB7XHJcblxyXG4gICAgICBpZiAoaHlwZXJ0aWVzSURzLmZpbHRlcihub3RGb3VuZEVsZW1lbnRzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0aHJvdyAnVXNlcihzKSBub3QgZm91bmQnO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc2VsZWN0ZWRIeXBlcnRpZXMgPSBoeXBlcnRpZXNJRHMubWFwKChoeXBlcnR5KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGh5cGVydHkuaHlwZXJ0eUlEO1xyXG4gICAgICB9KTsqL1xyXG5cclxuICAgICAgbGV0IHVzZXJzRGlzY292ZXJ5ID0gW107XHJcbiAgICAgIGxldCBkaXNjb25uZWN0ZWQgPSBbXTtcclxuICAgICAgbGV0IGxpdmUgPSB7fTtcclxuXHJcbiAgICAgIHVzZXJzLmZvckVhY2goKHVzZXIpID0+IHtcclxuICAgICAgICBsZXQgdXNlckRpc2NvdmVyeVByb21pc2UgPSBfdGhpcy5kaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNETyh1c2VyLnVzZXIsIFsnY29tbSddLCBbJ2NoYXQnXSwgdXNlci5kb21haW4pO1xyXG4gICAgICAgICAgdXNlcnNEaXNjb3ZlcnkucHVzaCh1c2VyRGlzY292ZXJ5UHJvbWlzZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICBQcm9taXNlLmFsbCh1c2Vyc0Rpc2NvdmVyeSkudGhlbigodXNlckRpc2NvdmVyeVJlc3VsdHMpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJzXSBVc2VycyBEaXNjb3ZlcnkgUmVzdWx0cy0+JywgdXNlckRpc2NvdmVyeVJlc3VsdHMpO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRIeXBlcnRpZXMgPSBbXTtcclxuXHJcbiAgICAgICAgIHVzZXJEaXNjb3ZlcnlSZXN1bHRzLmZvckVhY2goKHVzZXJEaXNjb3ZlcnlSZXN1bHQpID0+IHtcclxuXHJcbiAgICAgICAgICAgdXNlckRpc2NvdmVyeVJlc3VsdC5mb3JFYWNoKChkaXNjb3ZlcmVkKT0+e1xyXG4gICAgICAgICAgICAgaWYgKGRpc2NvdmVyZWQuZGF0YS5zdGF0dXMgPT09ICdsaXZlJyl7XHJcbiAgICAgICAgICAgICAgIHNlbGVjdGVkSHlwZXJ0aWVzLnB1c2goZGlzY292ZXJlZC5kYXRhLmh5cGVydHlJRCk7XHJcbiAgICAgICAgICAgICAgIGxpdmVbZGlzY292ZXJlZC5kYXRhLmh5cGVydHlJRF0gPSBkaXNjb3ZlcmVkO1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgZWxzZSBpZiAoZGlzY29ubmVjdGVkLmxlbmd0aCA8IDUpIGRpc2Nvbm5lY3RlZC5wdXNoKGRpc2NvdmVyZWQpO1xyXG4gICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXJdLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5bmNoZXIgQ3JlYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXFxuJyk7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXJdU2VsZWN0ZWQgSHlwZXJ0aWVzOiAhISEgJywgc2VsZWN0ZWRIeXBlcnRpZXMpO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgSGF2ZSAke3NlbGVjdGVkSHlwZXJ0aWVzLmxlbmd0aH0gdXNlcnM7YCk7XHJcbi8vICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlcl0gSHlwZXJ0aWVzSURzICcsIGh5cGVydGllc0lEcyk7XHJcblxyXG4gICAgICAgIGxldCBkYXRhT2JqZWN0ID0gX3RoaXMuY29udHJvbGxlck1vZGUgPT09ICdyZXBvcnRlcicgPyBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIgOiBfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXI7XHJcblxyXG4gICAgICAgIGlmIChkaXNjb25uZWN0ZWQubGVuZ3RoID4gMCkgX3RoaXMuX2ludml0YXRpb25zSGFuZGxlci5pbnZpdGVEaXNjb25uZWN0ZWRIeXBlcnRpZXMoZGlzY29ubmVjdGVkLCBkYXRhT2JqZWN0KTtcclxuXHJcbiAgICAgICAgZGF0YU9iamVjdC5pbnZpdGVPYnNlcnZlcnMoc2VsZWN0ZWRIeXBlcnRpZXMpO1xyXG5cclxuICAgICAgICBpZiAoZGF0YU9iamVjdC5pbnZpdGF0aW9ucy5sZW5ndGggPiAwKSBfdGhpcy5faW52aXRhdGlvbnNIYW5kbGVyLnByb2Nlc3NJbnZpdGF0aW9ucyhsaXZlLCBkYXRhT2JqZWN0KTtcclxuXHJcbiAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB9KVxyXG4gICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXUFyZSBpbnZpdGVkIHdpdGggc3VjY2VzcyAnICsgdXNlcnMubGVuZ3RoICsgJyB1c2VyczsnKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcblxyXG5cclxuXHJcbiAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB0cnlpbmcgdG8gaW52aXRlIHVzZXJzO1xcbicsIHJlYXNvbik7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVxdWVzdCB0aGUgUmVwb3J0ZXIgdG8gYWRkIC8gaW52aXRlIG5ldyB1c2VyIG9uIGFuIGV4aXN0aW5nIEdyb3VwIENoYXQgaW5zdGFuY2UuXHJcbiAgICogT25seSBPYnNlcnZlcnMgYXJlIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIHtVUkwuVXNlclVSTH0gIHVzZXJzICBVc2VyIHRvIGJlIGludml0ZWQgdG8gam9pbiB0aGUgR3JvdXAgQ2hhdCB0aGF0IGlzIGlkZW50aWZpZWQgd2l0aCByZVRISU5LIFVzZXIgVVJMLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59ICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW52aXRlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYWRkVXNlclJlcSh1c2Vycykge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy9jaGVjayBpcyBPYnNlcnZlciBhbmQgaW52b2tlIG9ic2VydmVyLmV4ZWN1dGUoKSB3aXRoIG5ldyBwcm9taXNlXHJcbiAgICBsZXQgaGF2ZUVtcHR5RWxlbWVudHMgPSAoZWxlbWVudCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnRWxlbWVudDonLCBlbGVtZW50Lmxlbmd0aCk7XHJcbiAgICAgIHJldHVybiBlbGVtZW50Lmxlbmd0aCAhPT0gMDtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgaWYgKHVzZXJzLmZpbHRlcihoYXZlRW1wdHlFbGVtZW50cykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIERvblxcJ3QgaGF2ZSB1c2VycyB0byBhZGQnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIV90aGlzLmNvbnRyb2xsZXJNb2RlID09PSAnb2JzZXJ2ZXInKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIG9ubHkgYWxsb3dlZCB0byBDaGF0IE9ic2VydmVyJyk7XHJcblxyXG4gICAgICBsZXQgYWRkVXNlciA9IF90aGlzLmFkZFVzZXIodXNlcnMpO1xyXG5cclxuICAgICAgaWYgKF90aGlzLl9kYXRhT2JqZWN0T2JzZXJ2ZXIpIHtcclxuICAgICAgICBhZGRVc2VyID0gX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlci5leGVjdXRlKCdhZGRVc2VyJywgdXNlcnMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhZGRVc2VyLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIFJlcXVlc3QgYWNjZXB0ZWQgYnkgUmVwb3J0ZXIgJyk7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5hZGRVc2VyUmVxXSBSZXF1ZXN0IHJlamVjdGVkIGJ5IFJlcG9ydGVyO1xcbicsIHJlYXNvbik7XHJcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9KTtcclxuXHJcbn1cclxuXHJcbiAgb25JbnZpdGF0aW9uUmVzcG9uc2UoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UgPSBjYWxsYmFjaztcclxuICAgIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIuaW52aXRhdGlvblJlc3BvbnNlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSBhIHVzZXIgZnJvbSBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxyXG4gICAqIE9ubHkgdGhlIFJlcG9ydGVyLCBpLmUuIHRoZSBIeXBlcnR5IHRoYXQgaGFzIGNyZWF0ZWQgdGhlIEdyb3VwIENoYXQsIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHJldHVybiB7PFByb21pc2U+IGJvb2xlYW59IFByb21pc2Ugd2l0aCB0aGUgc3RhdHVzXHJcbiAgICovXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgYSB1c2VyIGZyb20gYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cclxuICAgKiBPbmx5IHRoZSBSZXBvcnRlciwgaS5lLiB0aGUgSHlwZXJ0eSB0aGF0IGhhcyBjcmVhdGVkIHRoZSBHcm91cCBDaGF0LCBpcyBhbGxvd2VkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLlxyXG4gICAqIEBwYXJhbSAge1VSTC5Vc2VyVVJMfSB1c2VyICAgICAgIFVzZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBHcm91cCBDaGF0IHRoYXQgaXMgaWRlbnRpZmllZCB3aXRoIHJlVEhJTksgVXNlciBVUkwuXHJcbiAgICogQHJldHVybiB7PFByb21pc2U+IGJvb2xlYW59ICAgICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcmVtb3ZlVXNlcih1c2VyKSB7XHJcblxyXG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoZSByZW1vdmVVc2VyO1xyXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1Ob3QgeWV0IGltcGxlbWVudGVkOiAnLCB1c2VyKTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xvc2UgYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cclxuICAgKiBPbmx5IGF2YWlsYWJsZSB0byBDaGF0IEdyb3VwIFJlcG9ydGVycyBpLmUuIHRoZSBIeXBlcnR5IGluc3RhbmNlIHRoYXQgY3JlYXRlZCB0aGUgR3JvdXAgQ2hhdC5cclxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5Cb29sZWFufSBJdCByZXR1cm5zIGFzIGEgUHJvbWlzZSB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBjbG9zZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGNsb3NlKGRlbCA9IHRydWUpIHtcclxuICAgIC8vIFRPRE86IHRoZSBkYXRhT2JqZWN0UmVwb3J0ZXIuZGVsZXRlIHNob3VsZCBiZSBhIFByb21pc2U7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIFxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBcclxuICAgICAgaWYgKF90aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInKSB7XHJcbiAgICAgICAgLy8gcmVwb3J0ZXJcclxuICAgICAgICBfdGhpcy5faW52aXRhdGlvbnNIYW5kbGVyLmNsZWFuSW52aXRhdGlvbnMoX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIGlmICghZGVsKSB7XHJcbiAgICAgICAgICAgIF90aGlzLl9tYW5hZ2VyLmNvbW11bmljYXRpb25PYmplY3Quc3RhdHVzID0gJ2Nsb3NlZCc7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNle1xyXG5cclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICBkZWxldGUgX3RoaXMuX21hbmFnZXIuX3JlcG9ydGVyc0NvbnRyb2xsZXJzW190aGlzLmRhdGFPYmplY3RSZXBvcnRlci51cmxdO1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyLmRlbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fb25DbG9zZSkgX3RoaXMuX29uQ2xvc2Uoe1xyXG4gICAgICAgICAgICAgICAgICBjb2RlOiAyMDAsXHJcbiAgICAgICAgICAgICAgICAgIGRlc2M6ICdkZWxldGVkJyxcclxuICAgICAgICAgICAgICAgICAgdXJsOiBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIudXJsXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgICAgICByZWplY3QoZmFsc2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBvYnNlcnZlclxyXG4gICAgICAgIGlmKGRlbCl7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBkZWxldGUgX3RoaXMuX21hbmFnZXIuX29ic2VydmVyc0NvbnRyb2xsZXJzW190aGlzLmRhdGFPYmplY3RPYnNlcnZlci51cmxdO1xyXG4gICAgICAgICAgICBfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgcmVqZWN0KGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgIC8vIFRPRE86IHNlbmQgbWVzc2FnZSBcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfSBcclxuICAgICAgICBcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IENoYXRDb250cm9sbGVyO1xyXG4iLCJpbXBvcnQgeyBkZWVwQ2xvbmUgfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG5leHBvcnQgY2xhc3MgVXNlckluZm8ge1xyXG5cclxuICBjb25zdHJ1Y3RvcihoeXBlcnR5VVJMLCBkb21haW4sIGlkZW50aXR5KSB7XHJcblxyXG4gICAgbGV0IGNvbXBsZXRlSWRlbnRpdHkgPSBkZWVwQ2xvbmUoaWRlbnRpdHkpO1xyXG4gICAgaWYgKCFpZGVudGl0eS5oYXNPd25Qcm9wZXJ0eSgndXNlclByb2ZpbGUnKSkge1xyXG4gICAgICBjb21wbGV0ZUlkZW50aXR5Wyd1c2VyUHJvZmlsZSddID0gaWRlbnRpdHk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaHlwZXJ0eVVSTDogaHlwZXJ0eVVSTCxcclxuICAgICAgZG9tYWluLCBkb21haW4sXHJcbiAgICAgIGlkZW50aXR5OiBjb21wbGV0ZUlkZW50aXR5XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbn1cclxuIiwiXHJcbi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vIFNlcnZpY2UgRnJhbWV3b3JrXHJcbi8vaW1wb3J0IElkZW50aXR5TWFuYWdlciBmcm9tICcuLi9pZGVudGl0eU1hbmFnZXIvSWRlbnRpdHlNYW5hZ2VyJztcclxuLy9pbXBvcnQgUmVnaXN0cmF0aW9uU3RhdHVzIGZyb20gJy4uL2Rpc2NvdmVyeS9SZWdpc3RyYXRpb25TdGF0dXMnO1xyXG4vL2ltcG9ydCBEaXNjb3ZlcnkgZnJvbSAnLi4vZGlzY292ZXJ5L0Rpc2NvdmVyeSc7XHJcbi8vaW1wb3J0IFN5bmNoZXIgZnJvbSAnLi4vc3luY2hlci9TeW5jaGVyJztcclxuXHJcbi8vIFV0aWxzXHJcbi8vaW1wb3J0IHtkaXZpZGVVUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuLy9pbXBvcnQgU2VhcmNoIGZyb20gJy4uL3V0aWxzL1NlYXJjaCc7XHJcblxyXG4vLyBJbnRlcm5hbHNcclxuaW1wb3J0IHsgY29tbXVuaWNhdGlvbk9iamVjdCwgQ29tbXVuaWNhdGlvblN0YXR1cywgY29tbXVuaWNhdGlvbkNoaWxkcmVuIH0gZnJvbSAnLi9jb21tdW5pY2F0aW9uJztcclxuaW1wb3J0IENoYXRDb250cm9sbGVyIGZyb20gJy4vQ2hhdENvbnRyb2xsZXInO1xyXG5pbXBvcnQgeyBVc2VySW5mbyB9IGZyb20gJy4vVXNlckluZm8nO1xyXG5cclxuLyoqXHJcbiogSHlwZXJ0eSBHcm91cCBDaGF0IE1hbmFnZXIgQVBJIChIeXBlcnR5Q2hhdClcclxuKiBAYXV0aG9yIFZpdG9yIFNpbHZhIFt2aXRvci10LXNpbHZhQHRlbGVjb20ucHRdXHJcbiogQHZlcnNpb24gMC4xLjBcclxuKi9cclxuY2xhc3MgQ2hhdE1hbmFnZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihteVVybCwgYnVzLCBjb25maWd1cmF0aW9uLCBzeW5jaGVyLCBmYWN0b3J5KSB7XHJcbiAgICBpZiAoIW15VXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1tDaGF0TWFuYWdlci5jb25zdHJ1Y3Rvcl0gVGhlIG15VXJsIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG4gICAgaWYgKCFidXMpIHRocm93IG5ldyBFcnJvcignW0NoYXRNYW5hZ2VyLmNvbnN0cnVjdG9yXSBUaGUgTWluaUJ1cyBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKCdbQ2hhdE1hbmFnZXIuY29uc3RydWN0b3JdIFRoZSBjb25maWd1cmF0aW9uIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBpZiAoIXN5bmNoZXIpIHtcclxuICAgICAgc3luY2hlciA9IGZhY3RvcnkuY3JlYXRlU3luY2hlcihteVVybCwgYnVzLCBjb25maWd1cmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGhpcy5fcnVudGltZVVSTCA9IGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTDtcclxuXHJcbiAgICBsZXQgZG9tYWluID0gZmFjdG9yeS5kaXZpZGVVUkwoX3RoaXMuX3J1bnRpbWVVUkwpLmRvbWFpbjtcclxuICAgIGxldCBkaXNjb3ZlcnkgPSBmYWN0b3J5LmNyZWF0ZURpc2NvdmVyeShteVVybCwgY29uZmlndXJhdGlvbi5ydW50aW1lVVJMLCBidXMpO1xyXG4gICAgbGV0IGlkZW50aXR5TWFuYWdlciA9IGZhY3RvcnkuY3JlYXRlSWRlbnRpdHlNYW5hZ2VyKG15VXJsLCBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwsIGJ1cyk7XHJcblxyXG4gICAgX3RoaXMuX29iamVjdERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIGRvbWFpbiArICcvLndlbGwta25vd24vZGF0YXNjaGVtYS9Db21tdW5pY2F0aW9uJztcclxuXHJcbiAgICBfdGhpcy5fcmVwb3J0ZXJzQ29udHJvbGxlcnMgPSB7fTtcclxuICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVycyA9IHt9O1xyXG5cclxuICAgIF90aGlzLl9teVVybCA9IG15VXJsO1xyXG4gICAgX3RoaXMuX2J1cyA9IGJ1cztcclxuICAgIF90aGlzLl9zeW5jaGVyID0gc3luY2hlcjtcclxuICAgIF90aGlzLl9kb21haW4gPSBkb21haW47XHJcblxyXG4gICAgX3RoaXMuZGlzY292ZXJ5ID0gZGlzY292ZXJ5O1xyXG4gICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyID0gaWRlbnRpdHlNYW5hZ2VyO1xyXG4gICAgX3RoaXMuY3VycmVudElkZW50aXR5O1xyXG5cclxuICAgIF90aGlzLnNlYXJjaCA9IGZhY3RvcnkuY3JlYXRlU2VhcmNoKGRpc2NvdmVyeSwgaWRlbnRpdHlNYW5hZ2VyKTtcclxuXHJcbiAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcclxuXHJcbiAgICBfdGhpcy5jb21tdW5pY2F0aW9uQ2hpbGRyZW4gPSBjb21tdW5pY2F0aW9uQ2hpbGRyZW47XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlcl0gRGlzY292ZXIgJywgZGlzY292ZXJ5KTtcclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXJdIElkZW50aXR5IE1hbmFnZXIgJywgaWRlbnRpdHlNYW5hZ2VyKTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgc2V0IG9mZmxpbmUob2ZmbGluZSkge1xyXG4gICAgdGhpcy5fb2ZmbGluZSA9IG9mZmxpbmU7XHJcbiAgfVxyXG5cclxuICBnZXQgb2ZmbGluZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9vZmZsaW5lID8gdGhpcy5fb2ZmbGluZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIHByb2Nlc3NOb3RpZmljYXRpb24oZXZlbnQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLnByb2Nlc3NOb3RpZmljYXRpb246ICcsIGV2ZW50KTtcclxuXHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NyZWF0ZScpIHtcclxuXHJcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlIDEwMCBmb3IgTWVzc2FnZS5SZXNwb25zZVxyXG4gICAgICAvLyBldmVudC5hY2soMjAwKTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25JbnZpdGF0aW9uKSB7IF90aGlzLl9vbkludml0YXRpb24oZXZlbnQpOyB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkZWxldGUnKSB7XHJcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlIDIwMCBmb3IgTWVzc2FnZS5SZXNwb25zZVxyXG4gICAgICBldmVudC5hY2soMjAwKTtcclxuXHJcbiAgICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVyc1tldmVudC51cmxdLmNsb3NlRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgIGRlbGV0ZSBfdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbZXZlbnQudXJsXTtcclxuXHJcbiAgICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVycy5jbG9zZUV2ZW50ID0gZXZlbnQ7XHJcblxyXG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcclxuXHJcblxyXG4gICAgICBmb3IgKGxldCB1cmwgaW4gdGhpcy5fcmVwb3J0ZXJzQ29udHJvbGxlcnMpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlcnNDb250cm9sbGVyc1t1cmxdLmNsb3NlKGV2ZW50KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgdXJsIGluIHRoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzKSB7XHJcbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbdXJsXS5jbG9zZShldmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBteUlkZW50aXR5KGlkZW50aXR5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLm15SWRlbnRpdHldJyk7XHJcbiAgICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIHJlc29sdmUoaWRlbnRpdHkpO1xyXG5cclxuICAgICAgaWYgKF90aGlzLl9teVVybC5pbmNsdWRlcygnaHlwZXJ0eTovLycpKSB7XHJcbiAgICAgICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyLmRpc2NvdmVyVXNlclJlZ2lzdGVyZWQoKS50aGVuKChpZGVudGl0eSkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZShpZGVudGl0eSk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBfdGhpcy5pZGVudGl0eU1hbmFnZXIuZGlzY292ZXJJZGVudGl0eVBlcklkUCgpLnRoZW4oKGlkZW50aXR5KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKGlkZW50aXR5KTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgR3JvdXAgQ2hhdCBwcm92aWRpbmcgdGhlIG5hbWUgYW5kIHRoZSBpZGVudGlmaWVycyBvZiB1c2VycyB0byBiZSBpbnZpdGVkLlxyXG4gICAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgICAgICAgICAgICAgICBuYW1lICBJcyBhIHN0cmluZyB0byBpZGVudGlmeSB0aGUgR3JvdXAgQ2hhdFxyXG4gICAqIEBwYXJhbSAge2FycmF5PFVSTC51c2VyVVJMPn0gICAgICAgICB1c2VycyBBcnJheSBvZiB1c2VycyB0byBiZSBpbnZpdGVkIHRvIGpvaW4gdGhlIEdyb3VwIENoYXQuIFVzZXJzIGFyZSBpZGVudGlmaWVkIHdpdGggcmVUSElOSyBVc2VyIFVSTCwgbGlrZSB0aGlzIGZvcm1hdCB1c2VyOi8vPGlwZGRvbWFpbj4vPHVzZXItaWRlbnRpZmllcj5cclxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5DaGF0Q29udHJvbGxlcn0gICAgQSBDaGF0Q29udHJvbGxlciBvYmplY3QgYXMgYSBQcm9taXNlLlxyXG4gICAqL1xyXG4gIGNyZWF0ZShuYW1lLCB1c2VycywgZXh0cmEgPSB7fSkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgc3luY2hlciA9IF90aGlzLl9zeW5jaGVyO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcclxuICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5jc2VxID0gMTtcclxuICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5zdGFydGluZ1RpbWUgPSBuZXcgRGF0ZSgpLnRvSlNPTigpO1xyXG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0LnN0YXR1cyA9ICBDb21tdW5pY2F0aW9uU3RhdHVzLk9QRU47XHJcblxyXG4gICAgICBsZXQgbXlJZGVudGl0eTtcclxuXHJcbiAgICAgIF90aGlzLm15SWRlbnRpdHkoKS50aGVuKChpZGVudGl0eSkgPT4ge1xyXG4gICAgICAgIG15SWRlbnRpdHkgPSBpZGVudGl0eTtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLmNyZWF0ZSBdIE15IElkZW50aXR5JywgaWRlbnRpdHkpO1xyXG5cclxuICAgICAgICAvLyBsZXQgdXJsID0gX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5yZXBvcnRlcjtcclxuXHJcbiAgICAgICAgbGV0IHVzZXJJbmZvID0gbmV3IFVzZXJJbmZvKF90aGlzLl9teVVybCwgX3RoaXMuX2RvbWFpbiwgaWRlbnRpdHkpO1xyXG5cclxuICAgICAgICAvLyBBZGQgbXkgaWRlbnRpdHlcclxuICAgICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0LnBhcnRpY2lwYW50c1tpZGVudGl0eS5ndWlkXSA9IHVzZXJJbmZvO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLmNyZWF0ZSBdIHBhcnRpY2lwYW50czogJywgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5wYXJ0aWNpcGFudHMpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuY3JlYXRlIF0gY29tbXVuaWNhdGlvbk9iamVjdCcsIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QpO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLmNyZWF0ZV0gc2VhcmNoaW5nICcgKyB1c2Vycyk7XHJcblxyXG4gICAgICAgIC8vbGV0IHVzZXJzU2VhcmNoID0gX3RoaXMuc2VhcmNoLnVzZXJzKHVzZXJzLCBkb21haW5zLCBbJ2NvbW0nXSwgWydjaGF0J10pO1xyXG5cclxuICAgICAgICBsZXQgdXNlcnNEaXNjb3ZlcnkgPSBbXTtcclxuXHJcbiAgICAgICAgbGV0IGRpc2Nvbm5lY3RlZCA9IFtdO1xyXG4gICAgICAgIGxldCBsaXZlID0ge307XHJcblxyXG4gICAgICAgIHVzZXJzLmZvckVhY2goKHVzZXIpID0+IHtcclxuICAgICAgICAgIGxldCB1c2VyRGlzY292ZXJ5UHJvbWlzZSA9IF90aGlzLmRpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllc0RPKHVzZXIudXNlciwgWydjb21tJ10sIFsnY2hhdCddLCB1c2VyLmRvbWFpbik7XHJcbiAgICAgICAgICB1c2Vyc0Rpc2NvdmVyeS5wdXNoKHVzZXJEaXNjb3ZlcnlQcm9taXNlKTtcclxuXHJcbiAgICAgICAgICAvL2lmICh1c2VyLnVzZXIuaW5jbHVkZXMoJzovLycpKSBtdXR1YWwgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgUHJvbWlzZS5hbGwodXNlcnNEaXNjb3ZlcnkpLnRoZW4oKHVzZXJEaXNjb3ZlcnlSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLmNyZWF0ZV0gVXNlcnMgRGlzY292ZXJ5IFJlc3VsdHMtPicsIHVzZXJEaXNjb3ZlcnlSZXN1bHRzKTtcclxuXHJcbiAgICAgICAgICBsZXQgc2VsZWN0ZWRIeXBlcnRpZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICB1c2VyRGlzY292ZXJ5UmVzdWx0cy5mb3JFYWNoKCh1c2VyRGlzY292ZXJ5UmVzdWx0KSA9PiB7XHJcblxyXG4gICAgICAgICAgICB1c2VyRGlzY292ZXJ5UmVzdWx0LmZvckVhY2goKGRpc2NvdmVyZWQpPT57XHJcbiAgICAgICAgICAgICAgaWYgKGRpc2NvdmVyZWQuZGF0YS5zdGF0dXMgPT09ICdsaXZlJykge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRIeXBlcnRpZXMucHVzaChkaXNjb3ZlcmVkLmRhdGEuaHlwZXJ0eUlEKTtcclxuICAgICAgICAgICAgICAgIGxpdmVbZGlzY292ZXJlZC5kYXRhLmh5cGVydHlJRF0gPSBkaXNjb3ZlcmVkO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBUbyBjb250cm9sIHRoZSBudW1iZXIgb2Ygc3Vic2NyaXB0aW9ucyB0byBkaXNjb25uZWN0ZWQgZGV2aWNlc1xyXG4gICAgICAgICAgICAgICAgIGlmIChkaXNjb25uZWN0ZWQubGVuZ3RoIDwgNSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZC5wdXNoKGRpc2NvdmVyZWQpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB9KTtcclxuXHJcblxyXG4gICAgICAgICAgLyogICAgICAgIHJldHVybiB1c2Vyc1NlYXJjaDtcclxuICAgICAgfSkudGhlbigoaHlwZXJ0aWVzSURzKSA9PiB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkSHlwZXJ0aWVzID0gaHlwZXJ0aWVzSURzLm1hcCgoaHlwZXJ0eSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGh5cGVydHkuaHlwZXJ0eUlEO1xyXG4gICAgICAgIH0pOyAqL1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN5bmNoZXIgQ3JlYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXFxuJyk7XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlcl0gU2VsZWN0ZWQgSHlwZXJ0aWVzOiAhISEgJywgc2VsZWN0ZWRIeXBlcnRpZXMpO1xyXG4gICAgICAgICAgY29uc29sZS5pbmZvKGBIYXZlICR7c2VsZWN0ZWRIeXBlcnRpZXMubGVuZ3RofSB1c2VycztgKTtcclxuICAgICAgICAgIGxldCBtdXR1YWwgPSBleHRyYS5tdXR1YWwgPyBleHRyYS5tdXR1YWwgOiB0cnVlO1xyXG5cclxuICAgICAgICAgIGxldCBpbnB1dCA9IE9iamVjdC5hc3NpZ24oe3Jlc291cmNlczogWydjaGF0J10sIG11dHVhbDogbXV0dWFsfSwgZXh0cmEpO1xyXG4gICAgICAgICAgZGVsZXRlIGlucHV0Lm5hbWU7XHJcblxyXG4gICAgICAgICAgaWYgKF90aGlzLm9mZmxpbmUpIGlucHV0Lm9mZmxpbmUgPSBfdGhpcy5vZmZsaW5lO1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyXSBpbnB1dCBkYXRhOicsIGlucHV0KTtcclxuICAgICAgICAgIHJldHVybiBzeW5jaGVyLmNyZWF0ZShfdGhpcy5fb2JqZWN0RGVzY1VSTCwgc2VsZWN0ZWRIeXBlcnRpZXMsIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QsIHRydWUsIGZhbHNlLCBuYW1lLCB7fSwgaW5wdXQpO1xyXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdFJlcG9ydGVyKSB7XHJcblxyXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXJdIDMuIFJldHVybiBDcmVhdGUgRGF0YSBPYmplY3QgUmVwb3J0ZXInLCBkYXRhT2JqZWN0UmVwb3J0ZXIpO1xyXG5cclxuICAgICAgICAgIGxldCBjaGF0Q29udHJvbGxlciA9IG5ldyBDaGF0Q29udHJvbGxlcihzeW5jaGVyLCBfdGhpcy5kaXNjb3ZlcnksIF90aGlzLl9kb21haW4sIF90aGlzLnNlYXJjaCwgbXlJZGVudGl0eSwgX3RoaXMpO1xyXG4gICAgICAgICAgY2hhdENvbnRyb2xsZXIuZGF0YU9iamVjdFJlcG9ydGVyID0gZGF0YU9iamVjdFJlcG9ydGVyO1xyXG5cclxuICAgICAgICAgIF90aGlzLl9yZXBvcnRlcnNDb250cm9sbGVyc1tkYXRhT2JqZWN0UmVwb3J0ZXIudXJsXSA9IGNoYXRDb250cm9sbGVyO1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXJdIGNoYXRDb250cm9sbGVyIGludml0YXRpb25zSGFuZGxlcjogJywgICBjaGF0Q29udHJvbGxlci5pbnZpdGF0aW9uc0hhbmRsZXIpO1xyXG5cclxuICAgICAgICAgIC8vIHByb2Nlc3MgaW52aXRhdGlvbnMgdG8gaGFuZGxlIG5vdCByZWNlaXZlZCBpbnZpdGF0aW9uc1xyXG4gICAgICAgICAgaWYgKGRhdGFPYmplY3RSZXBvcnRlci5pbnZpdGF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNoYXRDb250cm9sbGVyLmludml0YXRpb25zSGFuZGxlci5wcm9jZXNzSW52aXRhdGlvbnMobGl2ZSwgZGF0YU9iamVjdFJlcG9ydGVyKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvLyBJZiBhbnkgaW52aXRlZCBVc2VyIGlzIGRpc2Nvbm5lY3RlZCBsZXQncyB3YWl0IHVudGlsIGl0IGlzIGNvbm5lY3RlZCBhZ2FpblxyXG4gICAgICAgICAgaWYgKGRpc2Nvbm5lY3RlZC5sZW5ndGggPiAwKSBjaGF0Q29udHJvbGxlci5pbnZpdGF0aW9uc0hhbmRsZXIuaW52aXRlRGlzY29ubmVjdGVkSHlwZXJ0aWVzKGRpc2Nvbm5lY3RlZCwgZGF0YU9iamVjdFJlcG9ydGVyKTtcclxuXHJcbiAgICAgICAgICByZXNvbHZlKGNoYXRDb250cm9sbGVyKTtcclxuXHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLmNyZWF0ZV0gTXlJZGVudGl0eSBFcnJvcjonLCByZWFzb24pO1xyXG4gICAgICAgIHJldHVybiByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGhhbmRsZSBub3RpZmljYXRpb25zIGFib3V0IGluY29taW5nIGludml0YXRpb25zIHRvIGpvaW4gYSBHcm91cCBDaGF0LlxyXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBDcmVhdGVFdmVudCBUaGUgQ3JlYXRlRXZlbnQgZmlyZWQgYnkgdGhlIFN5bmNoZXIgd2hlbiBhbiBpbnZpdGFpb24gaXMgcmVjZWl2ZWRcclxuICAgKi9cclxuICBvbkludml0YXRpb24oY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25JbnZpdGF0aW9uID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gam9pbiBhIEdyb3VwIENoYXQuXHJcbiAgICogQHBhcmFtICB7VVJMLkNvbW11bmljYXRpb25VUkx9IGludml0YXRpb25VUkwgIFRoZSBDb21tdW5pY2F0aW9uIFVSTCBvZiB0aGUgR3JvdXAgQ2hhdCB0byBqb2luIHRoYXQgaXMgcHJvdmlkZWQgaW4gdGhlIGludml0YXRpb24gZXZlbnRcclxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5DaGF0Q29udHJvbGxlcn0gICAgICAgICAgICAgSXQgcmV0dXJucyB0aGUgQ2hhdENvbnRyb2xsZXIgb2JqZWN0IGFzIGEgUHJvbWlzZVxyXG4gICAqL1xyXG4gIGpvaW4oaW52aXRhdGlvblVSTCwgbXV0dWFsID0gdHJ1ZSwgaWRlbnRpdHkpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBsZXQgc3luY2hlciA9IF90aGlzLl9zeW5jaGVyO1xyXG4gICAgICBsZXQgbXlJZGVudGl0eTtcclxuXHJcbiAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3luY2hlciBzdWJzY3JpYmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBcXG4nKTtcclxuICAgICAgY29uc29sZS5pbmZvKCdpbnZpdGF0aW9uVVJMJywgaW52aXRhdGlvblVSTCk7XHJcbiAgICAgIF90aGlzLm15SWRlbnRpdHkoaWRlbnRpdHkpLnRoZW4oKGlkZW50aXR5KSA9PiB7XHJcbiAgICAgICAgbXlJZGVudGl0eSA9IGlkZW50aXR5O1xyXG4gICAgICAgIGxldCBpbnB1dCA9IHtcclxuICAgICAgICAgIHNjaGVtYTogX3RoaXMuX29iamVjdERlc2NVUkwsXHJcbiAgICAgICAgICByZXNvdXJjZTogaW52aXRhdGlvblVSTCxcclxuICAgICAgICAgIHN0b3JlOiB0cnVlLFxyXG4gICAgICAgICAgcDJwOiBmYWxzZSxcclxuICAgICAgICAgIG11dHVhbDogbXV0dWFsLFxyXG4gICAgICAgICAgZG9tYWluX3N1YnNjcmlwdGlvbjogdHJ1ZSxcclxuICAgICAgICAgIGlkZW50aXR5OiBpZGVudGl0eVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChfdGhpcy5vZmZsaW5lKSBpbnB1dC5vZmZsaW5lID0gX3RoaXMub2ZmbGluZTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN5bmNoZXIuc3Vic2NyaWJlKGlucHV0KTtcclxuXHJcbiAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdE9ic2VydmVyKSB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdEYXRhIE9iamVjdCBPYnNlcnZlcjogJywgZGF0YU9iamVjdE9ic2VydmVyKTtcclxuXHJcbiAgICAgICAgbGV0IGNoYXRDb250cm9sbGVyID0gbmV3IENoYXRDb250cm9sbGVyKHN5bmNoZXIsIF90aGlzLmRpc2NvdmVyeSwgX3RoaXMuX2RvbWFpbiwgX3RoaXMuc2VhcmNoLCBteUlkZW50aXR5LCBfdGhpcyk7XHJcbiAgICAgICAgcmVzb2x2ZShjaGF0Q29udHJvbGxlcik7XHJcblxyXG4gICAgICAgIGNoYXRDb250cm9sbGVyLmRhdGFPYmplY3RPYnNlcnZlciA9IGRhdGFPYmplY3RPYnNlcnZlcjtcclxuXHJcbiAgICAgICAgX3RoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzW2RhdGFPYmplY3RPYnNlcnZlci51cmxdID0gY2hhdENvbnRyb2xsZXI7XHJcblxyXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ2hhdE1hbmFnZXI7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4qIFRoZSBHcm91cCBDaGF0IEFQSSBpcyB1c2VkIHRvIGNvbnRyb2wgYSBHcm91cCBDaGF0IGluc3RhbmNlLlxyXG4qIEBhdXRob3IgVml0b3IgU2lsdmEgW3ZpdG9yLXQtc2lsdmFAdGVsZWNvbS5wdF1cclxuKiBAdmVyc2lvbiAwLjEuMFxyXG4qL1xyXG5cclxuLy9pbXBvcnQgeyBVc2VySW5mbyB9IGZyb20gJy4vVXNlckluZm8nO1xyXG4vL2ltcG9ydCBSZWdpc3RyYXRpb25TdGF0dXMgZnJvbSAnLi4vZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cyc7XHJcbi8vaW1wb3J0IEludml0YXRpb25zSGFuZGxlciBmcm9tICcuL0ludml0YXRpb25zSGFuZGxlcic7XHJcblxyXG5jbGFzcyBDaGF0IHtcclxuXHJcbiAgY29uc3RydWN0b3Ioc3luY2hlciwgZG9tYWluLCBpZGVudGl0eSwgbWFuYWdlcikge1xyXG5cclxuICAgIGlmICghc3luY2hlcikgdGhyb3cgRXJyb3IoJ1N5bmNoZXIgaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XHJcbi8vICAgIGlmICghZGlzY292ZXJ5KSB0aHJvdyBFcnJvcignRGlzY292ZXIgaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XHJcbiAgICBpZiAoIWRvbWFpbikgdGhyb3cgRXJyb3IoJ0RvbWFpbiBpcyBhIG5lY2Vzc2FyeSBkZXBlbmRlY3knKTtcclxuLy8gICAgaWYgKCFzZWFyY2gpIHRocm93IEVycm9yKCdTZWFyY2ggaXMgYSBuZWNlc3NhcnkgZGVwZW5kZWN5Jyk7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9zeW5jaGVyID0gc3luY2hlcjtcclxuLy8gICAgX3RoaXMuZGlzY292ZXJ5ID0gZGlzY292ZXJ5O1xyXG4vLyAgICBfdGhpcy5zZWFyY2ggPSBzZWFyY2g7XHJcbiAgICBfdGhpcy5teUlkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdyZXBvcnRlcic7XHJcbiAgICBfdGhpcy5jaGlsZF9jc2VxID0gMDtcclxuICAgIF90aGlzLmRvbWFpbiA9IGRvbWFpbjtcclxuXHJcbiAgICBfdGhpcy5fbWFuYWdlciA9IG1hbmFnZXI7XHJcblxyXG4gICAgY29uc3QgaHlwZXJ0eVVSTCA9IHN5bmNoZXIub3duZXI7XHJcblxyXG4gICAgX3RoaXMuX29iamVjdERlc2NVUkwgPSAnaHlwZXJ0eS1jYXRhbG9ndWU6Ly9jYXRhbG9ndWUuJyArIGRvbWFpbiArICcvLndlbGwta25vd24vZGF0YXNjaGVtYS9Db21tdW5pY2F0aW9uJztcclxuXHJcbi8vICAgIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIgPSBuZXcgSW52aXRhdGlvbnNIYW5kbGVyKGh5cGVydHlVUkwpO1xyXG5cclxuICB9XHJcblxyXG4vKiAgZ2V0IGludml0YXRpb25zSGFuZGxlcigpIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXI7XHJcbiAgfSovXHJcblxyXG4gIGdldCB1cmwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuZGF0YU9iamVjdFJlcG9ydGVyLnVybCA6IHRoaXMuZGF0YU9iamVjdE9ic2VydmVyLnVybDtcclxuICB9XHJcblxyXG4gIHNldCBkYXRhT2JqZWN0UmVwb3J0ZXIoZGF0YU9iamVjdFJlcG9ydGVyKSB7XHJcblxyXG4gICAgaWYgKCFkYXRhT2JqZWN0UmVwb3J0ZXIpIHRocm93IG5ldyBFcnJvcignW0NoYXRDb250cm9sbGVyXSBUaGUgZGF0YSBvYmplY3QgcmVwb3J0ZXIgaXMgbmVjZXNzYXJ5IHBhcmFtZXRlciAnKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuY29udHJvbGxlck1vZGUgPSAncmVwb3J0ZXInO1xyXG5cclxuICAgIC8vIEhhbmRsZXIgdG8gcHJvY2VzcyByZWNlaXZlZCBmaWxlc1xyXG5cclxuICAgIC8vIGRhdGFPYmplY3RSZXBvcnRlci5vblJlc3BvbnNlKGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdFJlcG9ydGVyIC0gb25SZXNwb25zZV0nLCBldmVudCk7XHJcbiAgICAvLyAgIGlmIChfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UpIHtcclxuICAgIC8vICAgICBfdGhpcy5fb25JbnZpdGF0aW9uUmVzcG9uc2UoZXZlbnQpO1xyXG4gICAgLy8gICB9XHJcbiAgICAvL1xyXG4gICAgLy8gfSk7XHJcblxyXG4gICAgZGF0YU9iamVjdFJlcG9ydGVyLm9uU3Vic2NyaXB0aW9uKGZ1bmN0aW9uKGV2ZW50KSB7XHJcblxyXG4gICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcclxuICAgICAgICBjYXNlICdzdWJzY3JpYmUnOiBfdGhpcy5fb25TdWJzY3JpYmUoZXZlbnQpOyBicmVhaztcclxuICAgICAgICBjYXNlICd1bnN1YnNjcmliZSc6IF90aGlzLl9vblVuc3Vic2NyaWJlKGV2ZW50KTsgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIF90aGlzLl9zZXRPbkFkZENoaWxkTGlzdGVuZXIoZGF0YU9iamVjdFJlcG9ydGVyKTtcclxuXHJcbiAgICBkYXRhT2JqZWN0UmVwb3J0ZXIub25SZWFkKChldmVudCkgPT4ge1xyXG4gICAgICBldmVudC5hY2NlcHQoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGRhdGFPYmplY3RSZXBvcnRlci5vbkV4ZWN1dGUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIHN3aXRjaCAoZXZlbnQubWV0aG9kKSB7XHJcbiAgICAgICAgY2FzZSAnYWRkVXNlcic6XHJcbiAgICAgICAgICBfdGhpcy5hZGRVc2VyKGV2ZW50LnBhcmFtc1swXSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIGV2ZW50LmFjY2VwdCgpO1xyXG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xyXG4gICAgICAgICAgICBldmVudC5yZWplY3QocmVhc29uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBjYXNlICdyZW1vdmVVc2VyJzpcclxuICAgICAgICAgICAgX3RoaXMucmVtb3ZlVXNlcihldmVudC5wYXJhbXMpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIGV2ZW50LmFjY2VwdCgpO1xyXG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdSZWFzb246JywgcmVhc29uKTtcclxuICAgICAgICAgICAgICBldmVudC5yZWplY3QocmVhc29uKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6IGV2ZW50LnJlamVjdCgnW0NoYXRDb250cm9sbGVyLm9uRXhlY3V0ZV0gQ2hhdCBtZXRob2QgZXhlY3V0aW9uIG5vdCBhY2NlcHRlZCBieSBSZXBvcnRlcicpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIF90aGlzLl9kYXRhT2JqZWN0UmVwb3J0ZXIgPSBkYXRhT2JqZWN0UmVwb3J0ZXI7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFPYmplY3RSZXBvcnRlcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuICB9XHJcblxyXG4gIGdldCBtZXNzYWdlcygpIHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyTW9kZSA9PT0gJ3JlcG9ydGVyJyA/IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlci5fY2hpbGRyZW5PYmplY3RzIDogdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyLl9jaGlsZHJlbk9iamVjdHM7XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0YU9iamVjdE9ic2VydmVyKGRhdGFPYmplY3RPYnNlcnZlcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5jb250cm9sbGVyTW9kZSA9ICdvYnNlcnZlcic7XHJcblxyXG4gICAgX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlciA9IGRhdGFPYmplY3RPYnNlcnZlcjtcclxuXHJcbiAgICBkYXRhT2JqZWN0T2JzZXJ2ZXIub25DaGFuZ2UoJyonLCBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1PYnNlcnZlciAtIG9uQ2hhbmdlJywgZXZlbnQpO1xyXG5cclxuICAgICAgaWYgKGV2ZW50LmZpZWxkLmluY2x1ZGVzKCdwYXJ0aWNpcGFudHMnKSkge1xyXG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY1R5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ2FkZCc6XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fb25Vc2VyQWRkZWQpIF90aGlzLl9vblVzZXJBZGRlZChldmVudCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgJ3JlbW92ZSc6XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5fb25Vc2VyUmVtb3ZlZCkgX3RoaXMuX29uVXNlclJlbW92ZWQoZXZlbnQpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25DaGFuZ2UpIF90aGlzLl9vbkNoYW5nZShldmVudCk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgX3RoaXMuX3NldE9uQWRkQ2hpbGRMaXN0ZW5lcihkYXRhT2JqZWN0T2JzZXJ2ZXIpO1xyXG5cclxuICAgIC8vIGxldCBjaGlsZHJlbnMgPSBkYXRhT2JqZWN0T2JzZXJ2ZXIuY2hpbGRyZW5zO1xyXG4gICAgLy8gT2JqZWN0LmtleXMoY2hpbGRyZW5zKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgLy8gICBpZiAoX3RoaXMuX29uTWVzc2FnZSkgX3RoaXMuX29uTWVzc2FnZSh7XHJcbiAgICAvLyAgICAgY2hpbGRJZDogY2hpbGQsXHJcbiAgICAvLyAgICAgaWRlbnRpdHk6IGNoaWxkcmVuc1tjaGlsZF0uaWRlbnRpdHksXHJcbiAgICAvLyAgICAgdmFsdWU6IGNoaWxkcmVuc1tjaGlsZF0uZGF0YVxyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGFPYmplY3RPYnNlcnZlcigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlcjtcclxuICB9XHJcblxyXG4gIF9zZXRPbkFkZENoaWxkTGlzdGVuZXIoZGF0YU9iamVjdCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgZGF0YU9iamVjdC5vbkFkZENoaWxkKGZ1bmN0aW9uKGNoaWxkKSB7XHJcbiAgICAgIF90aGlzLmNoaWxkX2NzZXEgKz0xO1xyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5fc2V0T25BZGRDaGlsZExpc3RlbmVyXSBuZXcgQ2hpbGQgcmVjZWl2ZWQ6ICcsIGNoaWxkKTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25NZXNzYWdlKSBfdGhpcy5fb25NZXNzYWdlKGNoaWxkKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBnZXQgZGF0YU9iamVjdCgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInID8gdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIgOiB0aGlzLmRhdGFPYmplY3RPYnNlcnZlcjtcclxuICB9XHJcblxyXG4gIHNldCBjbG9zZUV2ZW50KGV2ZW50KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX2Nsb3NlRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICBpZiAoX3RoaXMuX29uQ2xvc2UpIF90aGlzLl9vbkNsb3NlKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGdldCBjbG9zZUV2ZW50KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fY2xvc2VFdmVudDtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgX29uU3Vic2NyaWJlKGV2ZW50KSB7XHJcblxyXG4gICAgbGV0IGRhdGFPYmplY3RSZXBvcnRlciA9IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuXHJcbiAgICBldmVudC5hY2NlcHQoKTtcclxuXHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZV0gZXZlbnQnLCBldmVudCwgZGF0YU9iamVjdFJlcG9ydGVyLnVybCk7XHJcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uU3Vic2NyaWJlXSBOZXcgdXNlciBoYXMgc3Vic2NyaWJlIHRoaXMgb2JqZWN0OiAnLCBkYXRhT2JqZWN0UmVwb3J0ZXIuZGF0YSwgZXZlbnQuaWRlbnRpdHkpO1xyXG5cclxuICAgIGxldCBpZGVudGl0eSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQuaWRlbnRpdHkpKTtcclxuXHJcbiAgICBpZiAoaWRlbnRpdHkuaGFzT3duUHJvcGVydHkoJ2Fzc2VydGlvbicpKSB7XHJcbiAgICAgIGRlbGV0ZSBpZGVudGl0eS5hc3NlcnRpb25cclxuICAgIH1cclxuXHJcbiAgICBsZXQgdXNlckluZm8gPSB7XHJcbiAgICAgIGh5cGVydHlVUkw6IGV2ZW50LnVybCxcclxuICAgICAgZG9tYWluOiBldmVudC5kb21haW4sXHJcbiAgICAgIGlkZW50aXR5OiBpZGVudGl0eVxyXG4gICAgfVxyXG4gICAgbGV0IHVzZXJVUkwgPSBldmVudC5pZGVudGl0eS51c2VyUHJvZmlsZS5ndWlkO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdICBuZXcgcGFydGljaXBhbnQnLCB1c2VySW5mbyk7XHJcbiAgICBpZiAoZXZlbnQuaWRlbnRpdHkubGVnYWN5KSB7XHJcbiAgICAgdXNlckluZm8ubGVnYWN5ID0gZXZlbnQuaWRlbnRpdHkubGVnYWN5O1xyXG4gICAgfVxyXG5cclxuICAgIGRhdGFPYmplY3RSZXBvcnRlci5kYXRhLnBhcnRpY2lwYW50c1t1c2VyVVJMXSA9IHVzZXJJbmZvO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmVdIGNvbW11bmljYXRpb25PYmplY3QgT0JKIGNoYXRjb250cm9sbGVyJywgZGF0YU9iamVjdFJlcG9ydGVyLmRhdGEucGFydGljaXBhbnRzKTtcclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25TdWJzY3JpYmUgLSBvblN1YnNjcmlwdGlvbl0gJywgdXNlckluZm8pO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5vblN1YnNjcmliZSAtIHRoaXMuX29uVXNlckFkZGVkXSAnLCB0aGlzLl9vblVzZXJBZGRlZCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX29uVXNlckFkZGVkKSB0aGlzLl9vblVzZXJBZGRlZCh1c2VySW5mbyk7XHJcbiAgfVxyXG5cclxuICBfb25VbnN1YnNjcmliZShldmVudCkge1xyXG4gICAgbGV0IGRhdGFPYmplY3RSZXBvcnRlciA9IHRoaXMuX2RhdGFPYmplY3RSZXBvcnRlcjtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLm9uVW5zdWJzY3JpYmVdIGV2ZW50JywgZXZlbnQsIGRhdGFPYmplY3RSZXBvcnRlci51cmwpO1xyXG5cclxuICAgIGxldCBwYXJ0aWNpcGFudCA9IGV2ZW50LmlkZW50aXR5LnVzZXJQcm9maWxlO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZV0gIHBhcnRpY2lwYW50IGxlZnQnLCBwYXJ0aWNpcGFudCk7XHJcbiAgICBpZiAoZXZlbnQuaWRlbnRpdHkubGVnYWN5KSB7XHJcbiAgICAgIHBhcnRpY2lwYW50LmxlZ2FjeSA9IGV2ZW50LmlkZW50aXR5LmxlZ2FjeTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGUgZGF0YU9iamVjdFJlcG9ydGVyLmRhdGEucGFydGljaXBhbnRzW3BhcnRpY2lwYW50LnVzZXJVUkxdO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIub25VbnN1YnNjcmliZSAtIHRoaXMuX29uVXNlclJlbW92ZWRdICcsIHRoaXMub25Vc2VyUmVtb3ZlZCk7XHJcbiAgICBpZiAodGhpcy5fb25Vc2VyUmVtb3ZlZCkgdGhpcy5fb25Vc2VyUmVtb3ZlZChwYXJ0aWNpcGFudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGZpbGUuXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgIElzIHRoZSBmaWxlIHRvIGJlIHNlbnQuXHJcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb21tdW5pY2F0aW9uLkNoYXRNZXNzYWdlPn0gICAgICAgIEl0IHJldHVybnMgdGhlIENoYXRNZXNzYWdlIGNoaWxkIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBTeW5jaGVyIGFzIGEgUHJvbWlzZS5cclxuICAgKi9cclxuICBzZW5kRmlsZShmaWxlKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBtb2RlID0gX3RoaXMuY29udHJvbGxlck1vZGU7XHJcbiAgICBsZXQgZGF0YU9iamVjdCA9IG1vZGUgPT09ICdyZXBvcnRlcicgPyBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIgOiBfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXI7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IGlkZW50aXR5ID0ge1xyXG4gICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBkYXRhT2JqZWN0LmFkZEh5cGVydHlSZXNvdXJjZSgncmVzb3VyY2VzJywgJ2ZpbGUnLCAgZmlsZSwgaWRlbnRpdHkpLnRoZW4oZnVuY3Rpb24ocmVzb3VyY2VGaWxlKSB7XHJcblxyXG4gICAgICAgICAgbGV0IGlkZW50aXR5ID0ge1xyXG4gICAgICAgICAgICAgIHVzZXJQcm9maWxlOiBfdGhpcy5teUlkZW50aXR5XHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgbGV0IGZpbGVTZW50RXZ0ID0geyB2YWx1ZSA6IHJlc291cmNlRmlsZSwgaWRlbnRpdHk6IGlkZW50aXR5LCByZXNvdXJjZTogcmVzb3VyY2VGaWxlfTtcclxuXHJcbi8qICAgICAgICAgIGxldCByZXBvcnRlclN0YXR1cyA9IG5ldyBSZWdpc3RyYXRpb25TdGF0dXMoZGF0YU9iamVjdC51cmwsIF90aGlzLl9tYW5hZ2VyLl9ydW50aW1lVVJMLCBfdGhpcy5fbWFuYWdlci5faHlwZXJ0eVVSTCwgX3RoaXMuX21hbmFnZXIuX2J1cyApO1xyXG5cclxuICAgICAgICAgIC8vIHJlY3Vyc2l2ZSBmdW5jdGlvbiB0byBzeW5jIHdpdGggY2hhdCByZXBvcnRlclxyXG5cclxuICAgICAgICAgICAgbGV0IHNoYXJlMlJlcG9ydGVyID0gZnVuY3Rpb24oZmlsZSwgc3Vic2NyaWJlciwgZXZ0LCBzdGF0dXMpIHtcclxuICAgICAgICAgICAgICBsZXQgc3RhdHVzT2ZSZXBvcnRlciA9IHN0YXR1cztcclxuICAgICAgICAgICAgICBmaWxlLnNoYXJpbmdTdGF0dXMudGhlbihyZXNvbHZlKGV2dCkpLmNhdGNoKChyZXN1bHQpPT57XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLnNlbmRGaWxlXSBzaGFyZSBmYWlsZWQ6ICcsIHJlc3VsdCk7XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhdHVzT2ZSZXBvcnRlci5vbkxpdmUoIHN1YnNjcmliZXIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1c09mUmVwb3J0ZXIudW5zdWJzY3JpYmVMaXZlKHN1YnNjcmliZXIpO1xyXG4gICAgICAgICAgICAgICAgZmlsZS5zaGFyZSh0cnVlKTtcclxuICAgICAgICAgICAgICAgIHNoYXJlMlJlcG9ydGVyKGZpbGUsIHN1YnNjcmliZXIsIGV2dCwgc3RhdHVzT2ZSZXBvcnRlcik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgLy9UT0RPOiBzdWJzY3JpYmUgdG8gc3luYyB3aGVuIHJlcG9ydGVyIGlzIGxpdmUuIE5ldyBzeW5jaGVkIG1lc3NhZ2VzIHNob3VsZCB0cmlnZ2VyIG9uTWVzc2FnZSBpZSBvbkNoaWxkXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0qL1xyXG5cclxuLy8gICAgICAgICAgICByZXNvdXJjZUZpbGUuc2hhcmUodHJ1ZSkudGhlbigoKT0+e1xyXG4gICAgICAgICAgICAgIHJlc29sdmUoZmlsZVNlbnRFdnQpO1xyXG4vLyAgICAgICAgICAgIH0pO1xyXG4vLyAgICAgICAgICAgIHNoYXJlMlJlcG9ydGVyKHJlc291cmNlRmlsZSwgX3RoaXMuX21hbmFnZXIuX2h5cGVydHlVUkwsIGZpbGVTZW50RXZ0LCByZXBvcnRlclN0YXR1cyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgY29uc29sZS5lcnJvcignUmVhc29uOicsIHJlYXNvbik7XHJcbiAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgYSBjaGF0IG1lc3NhZ2UuXHJcbiAgICogQHBhcmFtICB7c3RyaW5nfSAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgIElzIHRoZSBDaGF0TWVzc2FnZSB0byBiZSBzZW50LlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q29tbXVuaWNhdGlvbi5DaGF0TWVzc2FnZT59ICAgICAgICBJdCByZXR1cm5zIHRoZSBDaGF0TWVzc2FnZSBjaGlsZCBvYmplY3QgY3JlYXRlZCBieSB0aGUgU3luY2hlciBhcyBhIFByb21pc2UuXHJcbiAgICovXHJcbiAgc2VuZChtZXNzYWdlLCBpZGVudGl0eSkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgbW9kZSA9IF90aGlzLmNvbnRyb2xsZXJNb2RlO1xyXG4gICAgbGV0IGRhdGFPYmplY3QgPSBtb2RlID09PSAncmVwb3J0ZXInID8gX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyIDogX3RoaXMuZGF0YU9iamVjdE9ic2VydmVyO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbi8vICAgICAgbGV0IF9kYXRhT2JqZWN0Q2hpbGQ7XHJcbiAgICAgIF90aGlzLmNoaWxkX2NzZXEgKz0gMTtcclxuICAgICAgbGV0IG1zZyA9IHtcclxuXHJcbi8qICAgICAgICB1cmw6IGRhdGFPYmplY3QuZGF0YS51cmwsXHJcbiAgICAgICAgY3NlcTogX3RoaXMuY2hpbGRfY3NlcSxcclxuICAgICAgICByZXBvcnRlcjogZGF0YU9iamVjdC5kYXRhLnJlcG9ydGVyLFxyXG4gICAgICAgIHNjaGVtYTogZGF0YU9iamVjdC5kYXRhLnNjaGVtYSxcclxuICAgICAgICBuYW1lOiBkYXRhT2JqZWN0LmRhdGEubmFtZSxcclxuICAgICAgICBjcmVhdGVkIDogbmV3IERhdGUoKS50b0pTT04oKSwqL1xyXG5cclxuICAgICAgICB0eXBlOiAnY2hhdCcsXHJcbiAgICAgICAgY29udGVudDogbWVzc2FnZVxyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgc2VuZGVyID0gaWRlbnRpdHkgPyBpZGVudGl0eSA6IHtcclxuICAgICAgICB1c2VyUHJvZmlsZTogX3RoaXMubXlJZGVudGl0eVxyXG4gICAgICB9O1xyXG5cclxuXHJcbiAgICAgIC8vIFRPRE86IGNoYW5nZSBjaGF0bWVzc2FnZXMgdG8gcmVzb3VyY2UgLSBjaGF0LCBmaWxlXHJcbiAgICAgIC8vIFRPRE86IGNoYW5nZSBtZXNzYWdlIHRvIGh5cGVydHlSZXNvdXJjZSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvZGV2LXNlcnZpY2UtZnJhbWV3b3JrL3RyZWUvZGV2ZWxvcC9kb2NzL2RhdGFtb2RlbC9kYXRhLW9iamVjdHMvaHlwZXJ0eS1yZXNvdXJjZVxyXG4gICAgICAvLyBUT0RPOiBoYW5kbGUgd2l0aCBtdWx0aXBsZSByZXNvdXJjZXMgLSBpZiB0aGUgXCJtZXNzYWdlXCIgd2lsbCBiZSBkaWZmZXJlbnQgZm9yIGVhY2ggdHlwZSBvZiByZXNvdXJjZXNcclxuICAgICAgZGF0YU9iamVjdC5hZGRDaGlsZChtc2csIHNlbmRlcikudGhlbihmdW5jdGlvbihkYXRhT2JqZWN0Q2hpbGQpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXVthZGRDaGlsZCAtIENoYXQgTWVzc2FnZV06ICcsIGRhdGFPYmplY3RDaGlsZCk7XHJcbiAgICAgICAgLy9yZXNvbHZlKGRhdGFPYmplY3RDaGlsZCk7XHJcblxyXG4gICAgICAgIC8vVE9ETzogbW92ZSB0byBzZXBhcmF0ZSBmdW5jdGlvblxyXG5cclxuXHJcbiAgICAgICAgbGV0IG1zZyA9IHtcclxuICAgICAgICAgIGNoaWxkSWQ6IGRhdGFPYmplY3RDaGlsZC5fY2hpbGRJZCxcclxuICAgICAgICAgIGZyb206IGRhdGFPYmplY3RDaGlsZC5fb3duZXIsXHJcbiAgICAgICAgICB2YWx1ZTogZGF0YU9iamVjdENoaWxkLmRhdGEsXHJcbiAgICAgICAgICB0eXBlOiAnY3JlYXRlJyxcclxuICAgICAgICAgIGlkZW50aXR5OiBzZW5kZXJcclxuICAgICAgICB9O1xyXG5cclxuLyogICAgICAgIGxldCByZXBvcnRlclN0YXR1cyA9IG5ldyBSZWdpc3RyYXRpb25TdGF0dXMoZGF0YU9iamVjdC51cmwsIF90aGlzLl9tYW5hZ2VyLl9ydW50aW1lVVJMLCBfdGhpcy5fbWFuYWdlci5faHlwZXJ0eVVSTCwgX3RoaXMuX21hbmFnZXIuX2J1cyApO1xyXG5cclxuICAgICAgICAvLyByZWN1cnNpdmUgZnVuY3Rpb24gdG8gc3luYyB3aXRoIGNoYXQgcmVwb3J0ZXJcclxuXHJcbiAgICAgICAgICBsZXQgc2hhcmUyUmVwb3J0ZXIgPSBmdW5jdGlvbihjaGlsZCwgc3Vic2NyaWJlciwgbXNnLCBzdGF0dXMpIHtcclxuICAgICAgICAgICAgbGV0IHN0YXR1c09mUmVwb3J0ZXIgPSBzdGF0dXM7XHJcbiAgICAgICAgICAgIGNoaWxkLnNoYXJpbmdTdGF0dXMudGhlbihyZXNvbHZlKG1zZykpLmNhdGNoKChyZXN1bHQpPT57XHJcblxyXG4gICAgICAgICAgICAgICAgc3RhdHVzT2ZSZXBvcnRlci5vbkxpdmUoIHN1YnNjcmliZXIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgc3RhdHVzT2ZSZXBvcnRlci51bnN1YnNjcmliZUxpdmUoc3Vic2NyaWJlcik7XHJcbiAgICAgICAgICAgICAgICAgIGNoaWxkLnNoYXJlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICBzaGFyZTJSZXBvcnRlcihjaGlsZCwgc3Vic2NyaWJlciwgbXNnLCBzdGF0dXNPZlJlcG9ydGVyKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgLy9UT0RPOiBzdWJzY3JpYmUgdG8gc3luYyB3aGVuIHJlcG9ydGVyIGlzIGxpdmUuIE5ldyBzeW5jaGVkIG1lc3NhZ2VzIHNob3VsZCB0cmlnZ2VyIG9uTWVzc2FnZSBpZSBvbkNoaWxkXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSovXHJcblxyXG4vLyAgICAgICAgICBzaGFyZTJSZXBvcnRlcihkYXRhT2JqZWN0Q2hpbGQsIF90aGlzLl9tYW5hZ2VyLl9oeXBlcnR5VVJMLCBtc2csIHJlcG9ydGVyU3RhdHVzKTtcclxuLy8gICAgICAgIGRhdGFPYmplY3RDaGlsZC5zaGFyZSh0cnVlKTtcclxuICAgICAgICAgIHJlc29sdmUobXNnKTtcclxuXHJcblxyXG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1JlYXNvbjonLCByZWFzb24pO1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBbb25DaGFuZ2UgZGVzY3JpcHRpb25dXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIFtkZXNjcmlwdGlvbl1cclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uQ2hhbmdlKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uQ2hhbmdlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjZWl2ZSBuZXcgbWVzc2FnZXMuXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGhhbmRsZSB3aXRoIG5ldyBtZXNzYWdlc1xyXG4gICAqIEByZXR1cm4ge0NvbW11bmljYXRpb24uQ2hhdE1lc3NhZ2V9IG1cclxuICAgKi9cclxuICBvbk1lc3NhZ2UoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25NZXNzYWdlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBbb25Vc2VyQWRkZWQgZGVzY3JpcHRpb25dXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIFtkZXNjcmlwdGlvbl1cclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uVXNlckFkZGVkKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uVXNlckFkZGVkID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIHRoZSBhbiB1c2VyIHdhcyByZW1vdmVkXHJcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIEZ1bmN0aW9uIGhhbmRsZSB3aXRoIHRoZSByZW1vdmVkIHVzZXJcclxuICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAqL1xyXG4gIG9uVXNlclJlbW92ZWQoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25Vc2VyUmVtb3ZlZCA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlY2VpdmUgcmVxdWVzdHMgdG8gY2xvc2UgdGhlIEdyb3VwIENoYXQgaW5zdGFuY2UuXHJcbiAgICogQHJldHVybiB7RGVsZXRlRXZlbnR9IFRoZSBEZWxldGVFdmVudCBmaXJlZCBieSB0aGUgU3luY2hlciB3aGVuIHRoZSBDaGF0IGlzIGNsb3NlZC5cclxuICAgKi9cclxuICBvbkNsb3NlKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uQ2xvc2UgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIG9uUmVzcG9uc2UoY2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fb25SZXNwb25zZSA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCAvIGludml0ZSBuZXcgdXNlciBvbiBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxyXG4gICAqIE9ubHkgdGhlIFJlcG9ydGVyLCBpLmUuIHRoZSBIeXBlcnR5IHRoYXQgaGFzIGNyZWF0ZWQgdGhlIEdyb3VwIENoYXQsIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIHtVUkwuVXNlclVSTH0gIHVzZXJzICBVc2VyIHRvIGJlIGludml0ZWQgdG8gam9pbiB0aGUgR3JvdXAgQ2hhdCB0aGF0IGlzIGlkZW50aWZpZWQgd2l0aCByZVRISU5LIFVzZXIgVVJMLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59ICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW52aXRlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbi8qICBhZGRVc2VyKHVzZXJzKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgaGF2ZUVtcHR5RWxlbWVudHMgPSAoZWxlbWVudCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnRWxlbWVudDonLCBlbGVtZW50Lmxlbmd0aCk7XHJcbiAgICAgIHJldHVybiBlbGVtZW50Lmxlbmd0aCAhPT0gMDtcclxuICAgIH07XHJcblxyXG4gICAgbGV0IG5vdEZvdW5kRWxlbWVudHMgPSAoZWxlbWVudCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygndXNlciBub3QgZm91bmQ6ICcsIGVsZW1lbnQpO1xyXG4gICAgICByZXR1cm4gIShlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nKTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgaWYgKHVzZXJzLmZpbHRlcihoYXZlRW1wdHlFbGVtZW50cykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdCgnRG9uXFwndCBoYXZlIHVzZXJzIHRvIGludml0ZScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5hZGRVc2VycyBdOiAnLCB1c2Vycyk7XHJcblxyXG4gICAgICAvKl90aGlzLnNlYXJjaC51c2Vycyh1c2VycywgZG9tYWlucywgWydjb21tJ10sIFsnY2hhdCddKVxyXG5cclxuICAgIC50aGVuKChoeXBlcnRpZXNJRHMpID0+IHtcclxuXHJcbiAgICAgIGlmIChoeXBlcnRpZXNJRHMuZmlsdGVyKG5vdEZvdW5kRWxlbWVudHMpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHRocm93ICdVc2VyKHMpIG5vdCBmb3VuZCc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBzZWxlY3RlZEh5cGVydGllcyA9IGh5cGVydGllc0lEcy5tYXAoKGh5cGVydHkpID0+IHtcclxuICAgICAgICByZXR1cm4gaHlwZXJ0eS5oeXBlcnR5SUQ7XHJcbiAgICAgIH0pOyovXHJcblxyXG4vKiAgICAgIGxldCB1c2Vyc0Rpc2NvdmVyeSA9IFtdO1xyXG4gICAgICBsZXQgZGlzY29ubmVjdGVkID0gW107XHJcbiAgICAgIGxldCBsaXZlID0ge307XHJcblxyXG4gICAgICB1c2Vycy5mb3JFYWNoKCh1c2VyKSA9PiB7XHJcbiAgICAgICAgbGV0IHVzZXJEaXNjb3ZlcnlQcm9taXNlID0gX3RoaXMuZGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0aWVzRE8odXNlci51c2VyLCBbJ2NvbW0nXSwgWydjaGF0J10sIHVzZXIuZG9tYWluKTtcclxuICAgICAgICAgIHVzZXJzRGlzY292ZXJ5LnB1c2godXNlckRpc2NvdmVyeVByb21pc2UpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgUHJvbWlzZS5hbGwodXNlcnNEaXNjb3ZlcnkpLnRoZW4oKHVzZXJEaXNjb3ZlcnlSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlci5hZGRVc2Vyc10gVXNlcnMgRGlzY292ZXJ5IFJlc3VsdHMtPicsIHVzZXJEaXNjb3ZlcnlSZXN1bHRzKTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkSHlwZXJ0aWVzID0gW107XHJcblxyXG4gICAgICAgICB1c2VyRGlzY292ZXJ5UmVzdWx0cy5mb3JFYWNoKCh1c2VyRGlzY292ZXJ5UmVzdWx0KSA9PiB7XHJcblxyXG4gICAgICAgICAgIHVzZXJEaXNjb3ZlcnlSZXN1bHQuZm9yRWFjaCgoZGlzY292ZXJlZCk9PntcclxuICAgICAgICAgICAgIGlmIChkaXNjb3ZlcmVkLmRhdGEuc3RhdHVzID09PSAnbGl2ZScpe1xyXG4gICAgICAgICAgICAgICBzZWxlY3RlZEh5cGVydGllcy5wdXNoKGRpc2NvdmVyZWQuZGF0YS5oeXBlcnR5SUQpO1xyXG4gICAgICAgICAgICAgICBsaXZlW2Rpc2NvdmVyZWQuZGF0YS5oeXBlcnR5SURdID0gZGlzY292ZXJlZDtcclxuICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIGVsc2UgaWYgKGRpc2Nvbm5lY3RlZC5sZW5ndGggPCA1KSBkaXNjb25uZWN0ZWQucHVzaChkaXNjb3ZlcmVkKTtcclxuICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTeW5jaGVyIENyZWF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFxcbicpO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbygnW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyXVNlbGVjdGVkIEh5cGVydGllczogISEhICcsIHNlbGVjdGVkSHlwZXJ0aWVzKTtcclxuICAgICAgICBjb25zb2xlLmluZm8oYEhhdmUgJHtzZWxlY3RlZEh5cGVydGllcy5sZW5ndGh9IHVzZXJzO2ApO1xyXG4vLyAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXJdIEh5cGVydGllc0lEcyAnLCBoeXBlcnRpZXNJRHMpO1xyXG5cclxuICAgICAgICBsZXQgZGF0YU9iamVjdCA9IF90aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInID8gX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyIDogX3RoaXMuZGF0YU9iamVjdE9ic2VydmVyO1xyXG5cclxuICAgICAgICBpZiAoZGlzY29ubmVjdGVkLmxlbmd0aCA+IDApIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIuaW52aXRlRGlzY29ubmVjdGVkSHlwZXJ0aWVzKGRpc2Nvbm5lY3RlZCwgZGF0YU9iamVjdCk7XHJcblxyXG4gICAgICAgIGRhdGFPYmplY3QuaW52aXRlT2JzZXJ2ZXJzKHNlbGVjdGVkSHlwZXJ0aWVzKTtcclxuXHJcbiAgICAgICAgaWYgKGRhdGFPYmplY3QuaW52aXRhdGlvbnMubGVuZ3RoID4gMCkgX3RoaXMuX2ludml0YXRpb25zSGFuZGxlci5wcm9jZXNzSW52aXRhdGlvbnMobGl2ZSwgZGF0YU9iamVjdCk7XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1BcmUgaW52aXRlZCB3aXRoIHN1Y2Nlc3MgJyArIHVzZXJzLmxlbmd0aCArICcgdXNlcnM7Jyk7XHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG5cclxuXHJcblxyXG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHdoZW4gdHJ5aW5nIHRvIGludml0ZSB1c2VycztcXG4nLCByZWFzb24pO1xyXG4gICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH0qL1xyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVxdWVzdCB0aGUgUmVwb3J0ZXIgdG8gYWRkIC8gaW52aXRlIG5ldyB1c2VyIG9uIGFuIGV4aXN0aW5nIEdyb3VwIENoYXQgaW5zdGFuY2UuXHJcbiAgICogT25seSBPYnNlcnZlcnMgYXJlIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHBhcmFtIHtVUkwuVXNlclVSTH0gIHVzZXJzICBVc2VyIHRvIGJlIGludml0ZWQgdG8gam9pbiB0aGUgR3JvdXAgQ2hhdCB0aGF0IGlzIGlkZW50aWZpZWQgd2l0aCByZVRISU5LIFVzZXIgVVJMLlxyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59ICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgaW52aXRlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbi8qICBhZGRVc2VyUmVxKHVzZXJzKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL2NoZWNrIGlzIE9ic2VydmVyIGFuZCBpbnZva2Ugb2JzZXJ2ZXIuZXhlY3V0ZSgpIHdpdGggbmV3IHByb21pc2VcclxuICAgIGxldCBoYXZlRW1wdHlFbGVtZW50cyA9IChlbGVtZW50KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdFbGVtZW50OicsIGVsZW1lbnQubGVuZ3RoKTtcclxuICAgICAgcmV0dXJuIGVsZW1lbnQubGVuZ3RoICE9PSAwO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBpZiAodXNlcnMuZmlsdGVyKGhhdmVFbXB0eUVsZW1lbnRzKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm4gcmVqZWN0KCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlclJlcV0gRG9uXFwndCBoYXZlIHVzZXJzIHRvIGFkZCcpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghX3RoaXMuY29udHJvbGxlck1vZGUgPT09ICdvYnNlcnZlcicpIHtcclxuICAgICAgICByZXR1cm4gcmVqZWN0KCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlclJlcV0gb25seSBhbGxvd2VkIHRvIENoYXQgT2JzZXJ2ZXInKTtcclxuXHJcbiAgICAgIGxldCBhZGRVc2VyID0gX3RoaXMuYWRkVXNlcih1c2Vycyk7XHJcblxyXG4gICAgICBpZiAoX3RoaXMuX2RhdGFPYmplY3RPYnNlcnZlcikge1xyXG4gICAgICAgIGFkZFVzZXIgPSBfdGhpcy5fZGF0YU9iamVjdE9ic2VydmVyLmV4ZWN1dGUoJ2FkZFVzZXInLCB1c2Vycyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGFkZFVzZXIudGhlbigoKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdbQ2hhdE1hbmFnZXIuQ2hhdENvbnRyb2xsZXIuYWRkVXNlclJlcV0gUmVxdWVzdCBhY2NlcHRlZCBieSBSZXBvcnRlciAnKTtcclxuICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW0NoYXRNYW5hZ2VyLkNoYXRDb250cm9sbGVyLmFkZFVzZXJSZXFdIFJlcXVlc3QgcmVqZWN0ZWQgYnkgUmVwb3J0ZXI7XFxuJywgcmVhc29uKTtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gIH0pO1xyXG5cclxufSovXHJcblxyXG4gIG9uSW52aXRhdGlvblJlc3BvbnNlKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uSW52aXRhdGlvblJlc3BvbnNlID0gY2FsbGJhY2s7XHJcbi8vICAgIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIuaW52aXRhdGlvblJlc3BvbnNlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbW92ZSBhIHVzZXIgZnJvbSBhbiBleGlzdGluZyBHcm91cCBDaGF0IGluc3RhbmNlLlxyXG4gICAqIE9ubHkgdGhlIFJlcG9ydGVyLCBpLmUuIHRoZSBIeXBlcnR5IHRoYXQgaGFzIGNyZWF0ZWQgdGhlIEdyb3VwIENoYXQsIGlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24uXHJcbiAgICogQHJldHVybiB7PFByb21pc2U+IGJvb2xlYW59IFByb21pc2Ugd2l0aCB0aGUgc3RhdHVzXHJcbiAgICovXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgYSB1c2VyIGZyb20gYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cclxuICAgKiBPbmx5IHRoZSBSZXBvcnRlciwgaS5lLiB0aGUgSHlwZXJ0eSB0aGF0IGhhcyBjcmVhdGVkIHRoZSBHcm91cCBDaGF0LCBpcyBhbGxvd2VkIHRvIHVzZSB0aGlzIGZ1bmN0aW9uLlxyXG4gICAqIEBwYXJhbSAge1VSTC5Vc2VyVVJMfSB1c2VyICAgICAgIFVzZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBHcm91cCBDaGF0IHRoYXQgaXMgaWRlbnRpZmllZCB3aXRoIHJlVEhJTksgVXNlciBVUkwuXHJcbiAgICogQHJldHVybiB7PFByb21pc2U+IGJvb2xlYW59ICAgICAgSXQgcmV0dXJucyBhcyBhIFByb21pc2UgdHJ1ZSBpZiBzdWNjZXNzZnVsbHkgcmVtb3ZlZCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcmVtb3ZlVXNlcih1c2VyKSB7XHJcblxyXG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoZSByZW1vdmVVc2VyO1xyXG4gICAgY29uc29sZS5sb2coJ1tDaGF0TWFuYWdlci5DaGF0Q29udHJvbGxlcl1Ob3QgeWV0IGltcGxlbWVudGVkOiAnLCB1c2VyKTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xvc2UgYW4gZXhpc3RpbmcgR3JvdXAgQ2hhdCBpbnN0YW5jZS5cclxuICAgKiBPbmx5IGF2YWlsYWJsZSB0byBDaGF0IEdyb3VwIFJlcG9ydGVycyBpLmUuIHRoZSBIeXBlcnR5IGluc3RhbmNlIHRoYXQgY3JlYXRlZCB0aGUgR3JvdXAgQ2hhdC5cclxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5Cb29sZWFufSBJdCByZXR1cm5zIGFzIGEgUHJvbWlzZSB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBjbG9zZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGNsb3NlKGRlbCA9IHRydWUpIHtcclxuICAgIC8vIFRPRE86IHRoZSBkYXRhT2JqZWN0UmVwb3J0ZXIuZGVsZXRlIHNob3VsZCBiZSBhIFByb21pc2U7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIFxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICBcclxuICAgICAgaWYgKF90aGlzLmNvbnRyb2xsZXJNb2RlID09PSAncmVwb3J0ZXInKSB7XHJcbiAgICAgICAgLy8gcmVwb3J0ZXJcclxuLy8gICAgICAgIF90aGlzLl9pbnZpdGF0aW9uc0hhbmRsZXIuY2xlYW5JbnZpdGF0aW9ucyhfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFkZWwpIHtcclxuICAgICAgICAgICAgX3RoaXMuX21hbmFnZXIuY29tbXVuaWNhdGlvbk9iamVjdC5zdGF0dXMgPSAnY2xvc2VkJztcclxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2V7XHJcblxyXG4gICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5fbWFuYWdlci5fcmVwb3J0ZXJzQ29udHJvbGxlcnNbX3RoaXMuZGF0YU9iamVjdFJlcG9ydGVyLnVybF07XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5kYXRhT2JqZWN0UmVwb3J0ZXIuZGVsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLl9vbkNsb3NlKSBfdGhpcy5fb25DbG9zZSh7XHJcbiAgICAgICAgICAgICAgICAgIGNvZGU6IDIwMCxcclxuICAgICAgICAgICAgICAgICAgZGVzYzogJ2RlbGV0ZWQnLFxyXG4gICAgICAgICAgICAgICAgICB1cmw6IF90aGlzLmRhdGFPYmplY3RSZXBvcnRlci51cmxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gb2JzZXJ2ZXJcclxuICAgICAgICBpZihkZWwpe1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGVsZXRlIF90aGlzLl9tYW5hZ2VyLl9vYnNlcnZlcnNDb250cm9sbGVyc1tfdGhpcy5kYXRhT2JqZWN0T2JzZXJ2ZXIudXJsXTtcclxuICAgICAgICAgICAgX3RoaXMuZGF0YU9iamVjdE9ic2VydmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAvLyBUT0RPOiBzZW5kIG1lc3NhZ2UgXHJcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDaGF0O1xyXG4iLCJcclxuLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gU2VydmljZSBGcmFtZXdvcmtcclxuLy9pbXBvcnQgSWRlbnRpdHlNYW5hZ2VyIGZyb20gJy4uL2lkZW50aXR5TWFuYWdlci9JZGVudGl0eU1hbmFnZXInO1xyXG4vL2ltcG9ydCBSZWdpc3RyYXRpb25TdGF0dXMgZnJvbSAnLi4vZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cyc7XHJcbi8vaW1wb3J0IERpc2NvdmVyeSBmcm9tICcuLi9kaXNjb3ZlcnkvRGlzY292ZXJ5JztcclxuLy9pbXBvcnQgU3luY2hlciBmcm9tICcuLi9zeW5jaGVyL1N5bmNoZXInO1xyXG5cclxuLy8gVXRpbHNcclxuLy9pbXBvcnQge2RpdmlkZVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG4vL2ltcG9ydCBTZWFyY2ggZnJvbSAnLi4vdXRpbHMvU2VhcmNoJztcclxuXHJcbi8vIEludGVybmFsc1xyXG5pbXBvcnQgeyBjb21tdW5pY2F0aW9uT2JqZWN0LCBDb21tdW5pY2F0aW9uU3RhdHVzLCBjb21tdW5pY2F0aW9uQ2hpbGRyZW4gfSBmcm9tICcuL2NvbW11bmljYXRpb24nO1xyXG5pbXBvcnQgQ2hhdCBmcm9tICcuL0NoYXQnO1xyXG5pbXBvcnQgeyBVc2VySW5mbyB9IGZyb20gJy4vVXNlckluZm8nO1xyXG5cclxuLyoqXHJcbiogSHlwZXJ0eSBTaW1wbGUgR3JvdXAgQ2hhdCBNYW5hZ2VyIEFQSSBcclxuKiBAYXV0aG9yIFZpdG9yIFNpbHZhIFt2aXRvci10LXNpbHZhQHRlbGVjb20ucHRdXHJcbiogQHZlcnNpb24gMC4xLjBcclxuKi9cclxuY2xhc3MgU2ltcGxlU2ltcGxlQ2hhdE1hbmFnZXIge1xyXG5cclxuICBjb25zdHJ1Y3RvcihteVVybCwgYnVzLCBjb25maWd1cmF0aW9uLCBzeW5jaGVyLCBmYWN0b3J5KSB7XHJcbiAgICBpZiAoIW15VXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1tTaW1wbGVDaGF0TWFuYWdlci5jb25zdHJ1Y3Rvcl0gVGhlIG15VXJsIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG4gICAgaWYgKCFidXMpIHRocm93IG5ldyBFcnJvcignW1NpbXBsZUNoYXRNYW5hZ2VyLmNvbnN0cnVjdG9yXSBUaGUgTWluaUJ1cyBpcyBhIG5lZWRlZCBwYXJhbWV0ZXInKTtcclxuICAgIGlmICghY29uZmlndXJhdGlvbikgdGhyb3cgbmV3IEVycm9yKCdbU2ltcGxlQ2hhdE1hbmFnZXIuY29uc3RydWN0b3JdIFRoZSBjb25maWd1cmF0aW9uIGlzIGEgbmVlZGVkIHBhcmFtZXRlcicpO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBpZiAoIXN5bmNoZXIpIHtcclxuICAgICAgc3luY2hlciA9IGZhY3RvcnkuY3JlYXRlU3luY2hlcihteVVybCwgYnVzLCBjb25maWd1cmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGhpcy5fcnVudGltZVVSTCA9IGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTDtcclxuXHJcbiAgICBsZXQgZG9tYWluID0gZmFjdG9yeS5kaXZpZGVVUkwoX3RoaXMuX3J1bnRpbWVVUkwpLmRvbWFpbjtcclxuLy8gICAgbGV0IGRpc2NvdmVyeSA9IGZhY3RvcnkuY3JlYXRlRGlzY292ZXJ5KG15VXJsLCBjb25maWd1cmF0aW9uLnJ1bnRpbWVVUkwsIGJ1cyk7XHJcbiAgICBsZXQgaWRlbnRpdHlNYW5hZ2VyID0gZmFjdG9yeS5jcmVhdGVJZGVudGl0eU1hbmFnZXIobXlVcmwsIGNvbmZpZ3VyYXRpb24ucnVudGltZVVSTCwgYnVzKTtcclxuXHJcbiAgICBfdGhpcy5fb2JqZWN0RGVzY1VSTCA9ICdoeXBlcnR5LWNhdGFsb2d1ZTovL2NhdGFsb2d1ZS4nICsgZG9tYWluICsgJy8ud2VsbC1rbm93bi9kYXRhc2NoZW1hL0NvbW11bmljYXRpb24nO1xyXG5cclxuICAgIF90aGlzLl9yZXBvcnRlcnNDb250cm9sbGVycyA9IHt9O1xyXG4gICAgX3RoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzID0ge307XHJcblxyXG4gICAgX3RoaXMuX215VXJsID0gbXlVcmw7XHJcbiAgICBfdGhpcy5fYnVzID0gYnVzO1xyXG4gICAgX3RoaXMuX3N5bmNoZXIgPSBzeW5jaGVyO1xyXG4gICAgX3RoaXMuX2RvbWFpbiA9IGRvbWFpbjtcclxuXHJcbi8vICAgIF90aGlzLmRpc2NvdmVyeSA9IGRpc2NvdmVyeTtcclxuICAgIF90aGlzLmlkZW50aXR5TWFuYWdlciA9IGlkZW50aXR5TWFuYWdlcjtcclxuICAgIF90aGlzLmN1cnJlbnRJZGVudGl0eTtcclxuXHJcbi8vICAgIF90aGlzLnNlYXJjaCA9IGZhY3RvcnkuY3JlYXRlU2VhcmNoKGRpc2NvdmVyeSwgaWRlbnRpdHlNYW5hZ2VyKTtcclxuXHJcbiAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcclxuXHJcbiAgICBfdGhpcy5jb21tdW5pY2F0aW9uQ2hpbGRyZW4gPSBjb21tdW5pY2F0aW9uQ2hpbGRyZW47XHJcblxyXG4vLyAgICBjb25zb2xlLmxvZygnW1NpbXBsZUNoYXRNYW5hZ2VyXSBEaXNjb3ZlciAnLCBkaXNjb3ZlcnkpO1xyXG4gICAgY29uc29sZS5sb2coJ1tTaW1wbGVDaGF0TWFuYWdlcl0gSWRlbnRpdHkgTWFuYWdlciAnLCBpZGVudGl0eU1hbmFnZXIpO1xyXG5cclxuXHJcbiAgfVxyXG5cclxuICBzZXQgb2ZmbGluZShvZmZsaW5lKSB7XHJcbiAgICB0aGlzLl9vZmZsaW5lID0gb2ZmbGluZTtcclxuICB9XHJcblxyXG4gIGdldCBvZmZsaW5lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX29mZmxpbmUgPyB0aGlzLl9vZmZsaW5lIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZXQgYmFja3VwKGJhY2t1cCkge1xyXG4gICAgdGhpcy5fYmFja3VwID0gYmFja3VwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGJhY2t1cCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9iYWNrdXAgPyB0aGlzLl9iYWNrdXAgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByb2Nlc3NOb3RpZmljYXRpb24oZXZlbnQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBjb25zb2xlLmxvZygnW1NpbXBsZUNoYXRNYW5hZ2VyLnByb2Nlc3NOb3RpZmljYXRpb246ICcsIGV2ZW50KTtcclxuXHJcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NyZWF0ZScpIHtcclxuXHJcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlIDEwMCBmb3IgTWVzc2FnZS5SZXNwb25zZVxyXG4gICAgICAvLyBldmVudC5hY2soMjAwKTtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fb25JbnZpdGF0aW9uKSB7IF90aGlzLl9vbkludml0YXRpb24oZXZlbnQpOyB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdkZWxldGUnKSB7XHJcbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgdGhlIDIwMCBmb3IgTWVzc2FnZS5SZXNwb25zZVxyXG4gICAgICBldmVudC5hY2soMjAwKTtcclxuXHJcbiAgICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVyc1tldmVudC51cmxdLmNsb3NlRXZlbnQgPSBldmVudDtcclxuXHJcbiAgICAgIGRlbGV0ZSBfdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbZXZlbnQudXJsXTtcclxuXHJcbiAgICAgIF90aGlzLl9vYnNlcnZlcnNDb250cm9sbGVycy5jbG9zZUV2ZW50ID0gZXZlbnQ7XHJcblxyXG4gICAgICBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0ID0gY29tbXVuaWNhdGlvbk9iamVjdDtcclxuXHJcblxyXG4gICAgICBmb3IgKGxldCB1cmwgaW4gdGhpcy5fcmVwb3J0ZXJzQ29udHJvbGxlcnMpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlcnNDb250cm9sbGVyc1t1cmxdLmNsb3NlKGV2ZW50KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZm9yIChsZXQgdXJsIGluIHRoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzKSB7XHJcbiAgICAgICAgdGhpcy5fb2JzZXJ2ZXJzQ29udHJvbGxlcnNbdXJsXS5jbG9zZShldmVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBteUlkZW50aXR5KGlkZW50aXR5KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbygnW1NpbXBsZUNoYXRNYW5hZ2VyLm15SWRlbnRpdHldJyk7XHJcbiAgICAgIGlmIChpZGVudGl0eSkgcmV0dXJuIHJlc29sdmUoaWRlbnRpdHkpO1xyXG5cclxuICAgICAgaWYgKF90aGlzLl9teVVybC5pbmNsdWRlcygnaHlwZXJ0eTovLycpKSB7XHJcbiAgICAgICAgX3RoaXMuaWRlbnRpdHlNYW5hZ2VyLmRpc2NvdmVyVXNlclJlZ2lzdGVyZWQoKS50aGVuKChpZGVudGl0eSkgPT4ge1xyXG4gICAgICAgICAgX3RoaXMuY3VycmVudElkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICAgICAgICByZXNvbHZlKGlkZW50aXR5KTtcclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aGlzLmlkZW50aXR5TWFuYWdlci5kaXNjb3ZlcklkZW50aXR5UGVySWRQKCkudGhlbigoaWRlbnRpdHkpID0+IHtcclxuICAgICAgICAgIF90aGlzLmN1cnJlbnRJZGVudGl0eSA9IGlkZW50aXR5O1xyXG4gICAgICAgICAgcmVzb2x2ZShpZGVudGl0eSk7XHJcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IEdyb3VwIENoYXQgcHJvdmlkaW5nIHRoZSBuYW1lIGFuZCB0aGUgaWRlbnRpZmllcnMgb2YgdXNlcnMgdG8gYmUgaW52aXRlZC5cclxuICAgKiBAcGFyYW0gIHtzdHJpbmd9ICAgICAgICAgICAgICAgICAgICAgbmFtZSAgSXMgYSBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIEdyb3VwIENoYXRcclxuICAgKiBAcGFyYW0gIHthcnJheTxVUkwuSHlwZXJ0eVVSTD59ICAgICAgICAgaHlwZXJ0aWVzIEFycmF5IG9mIGh5cGVydGllcyB0byBiZSBpbnZpdGVkIHRvIGpvaW4gdGhlIEdyb3VwIENoYXQuIFVzZXJzIGFyZSBpZGVudGlmaWVkIHdpdGggcmVUSElOSyBVc2VyIFVSTCwgbGlrZSB0aGlzIGZvcm1hdCB1c2VyOi8vPGlwZGRvbWFpbj4vPHVzZXItaWRlbnRpZmllcj5cclxuICAgKiBAcmV0dXJuIHs8UHJvbWlzZT5DaGF0Q29udHJvbGxlcn0gICAgQSBDaGF0Q29udHJvbGxlciBvYmplY3QgYXMgYSBQcm9taXNlLlxyXG4gICAqL1xyXG4gIGNyZWF0ZShuYW1lLCBoeXBlcnRpZXMsIGV4dHJhID0ge30pIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IHN5bmNoZXIgPSBfdGhpcy5fc3luY2hlcjtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdCA9IGNvbW11bmljYXRpb25PYmplY3Q7XHJcbiAgICAgIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QuY3NlcSA9IDE7XHJcbiAgICAgIF90aGlzLmNvbW11bmljYXRpb25PYmplY3Quc3RhcnRpbmdUaW1lID0gbmV3IERhdGUoKS50b0pTT04oKTtcclxuICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5zdGF0dXMgPSAgQ29tbXVuaWNhdGlvblN0YXR1cy5PUEVOO1xyXG5cclxuICAgICAgbGV0IG15SWRlbnRpdHk7XHJcblxyXG4gICAgICBfdGhpcy5teUlkZW50aXR5KCkudGhlbigoaWRlbnRpdHkpID0+IHtcclxuICAgICAgICBteUlkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW1wbGVDaGF0TWFuYWdlci5jcmVhdGUgXSBNeSBJZGVudGl0eScsIGlkZW50aXR5KTtcclxuXHJcbiAgICAgICAgLy8gbGV0IHVybCA9IF90aGlzLmNvbW11bmljYXRpb25PYmplY3QucmVwb3J0ZXI7XHJcblxyXG4gICAgICAgIGxldCB1c2VySW5mbyA9IG5ldyBVc2VySW5mbyhfdGhpcy5fbXlVcmwsIF90aGlzLl9kb21haW4sIGlkZW50aXR5KTtcclxuXHJcbiAgICAgICAgLy8gQWRkIG15IGlkZW50aXR5XHJcbiAgICAgICAgX3RoaXMuY29tbXVuaWNhdGlvbk9iamVjdC5wYXJ0aWNpcGFudHNbaWRlbnRpdHkuZ3VpZF0gPSB1c2VySW5mbztcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tTaW1wbGVDaGF0TWFuYWdlci5jcmVhdGUgXSBwYXJ0aWNpcGFudHM6ICcsIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QucGFydGljaXBhbnRzKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnW1NpbXBsZUNoYXRNYW5hZ2VyLmNyZWF0ZSBdIGNvbW11bmljYXRpb25PYmplY3QnLCBfdGhpcy5jb21tdW5pY2F0aW9uT2JqZWN0KTtcclxuXHJcblxyXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3luY2hlciBDcmVhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBcXG4nKTtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW1NpbXBsZUNoYXRNYW5hZ2VyXSBTZWxlY3RlZCBIeXBlcnRpZXM6ICEhISAnLCBoeXBlcnRpZXMpO1xyXG4vLyAgICAgICAgICBjb25zb2xlLmluZm8oYEhhdmUgJHtoeXBlcnRpZXMubGVuZ3RofSB1c2VycztgKTtcclxuICAgICAgICAgIGxldCBtdXR1YWwgPSBleHRyYS5tdXR1YWwgPyBleHRyYS5tdXR1YWwgOiB0cnVlO1xyXG5cclxuICAgICAgICAgIGxldCBpbnB1dCA9IE9iamVjdC5hc3NpZ24oe3Jlc291cmNlczogWydjaGF0J10sIG11dHVhbDogbXV0dWFsfSwgZXh0cmEpO1xyXG4gICAgICAgICAgZGVsZXRlIGlucHV0Lm5hbWU7XHJcblxyXG4gICAgICAgICAgaWYgKF90aGlzLm9mZmxpbmUpIGlucHV0Lm9mZmxpbmUgPSBfdGhpcy5vZmZsaW5lO1xyXG4gICAgICAgICAgaWYgKF90aGlzLmJhY2t1cCkgaW5wdXQuYmFja3VwID0gX3RoaXMuYmFja3VwO1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIGlucHV0IGRhdGE6JywgaW5wdXQpO1xyXG4gICAgICAgICAgcmV0dXJuIHN5bmNoZXIuY3JlYXRlKF90aGlzLl9vYmplY3REZXNjVVJMLCBoeXBlcnRpZXMsIF90aGlzLmNvbW11bmljYXRpb25PYmplY3QsIHRydWUsIGZhbHNlLCBuYW1lLCB7fSwgaW5wdXQpO1xyXG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oZGF0YU9iamVjdFJlcG9ydGVyKSB7XHJcblxyXG4gICAgICAgICAgY29uc29sZS5pbmZvKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIDMuIFJldHVybiBDcmVhdGUgRGF0YSBPYmplY3QgUmVwb3J0ZXInLCBkYXRhT2JqZWN0UmVwb3J0ZXIpO1xyXG5cclxuICAgICAgICAgIGxldCBjaGF0ID0gbmV3IENoYXQoc3luY2hlciwgX3RoaXMuX2RvbWFpbiwgbXlJZGVudGl0eSwgX3RoaXMpO1xyXG4gICAgICAgICAgY2hhdC5kYXRhT2JqZWN0UmVwb3J0ZXIgPSBkYXRhT2JqZWN0UmVwb3J0ZXI7XHJcblxyXG4gICAgICAgICAgX3RoaXMuX3JlcG9ydGVyc0NvbnRyb2xsZXJzW2RhdGFPYmplY3RSZXBvcnRlci51cmxdID0gY2hhdDtcclxuXHJcbi8vICAgICAgICAgIGNvbnNvbGUubG9nKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIGNoYXQgaW52aXRhdGlvbnNIYW5kbGVyOiAnLCAgIGNoYXQuaW52aXRhdGlvbnNIYW5kbGVyKTtcclxuXHJcbiAgICAgICAgICAvLyBwcm9jZXNzIGludml0YXRpb25zIHRvIGhhbmRsZSBub3QgcmVjZWl2ZWQgaW52aXRhdGlvbnNcclxuLyogICAgICAgICAgaWYgKGRhdGFPYmplY3RSZXBvcnRlci5pbnZpdGF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNoYXQuaW52aXRhdGlvbnNIYW5kbGVyLnByb2Nlc3NJbnZpdGF0aW9ucyhsaXZlLCBkYXRhT2JqZWN0UmVwb3J0ZXIpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIElmIGFueSBpbnZpdGVkIFVzZXIgaXMgZGlzY29ubmVjdGVkIGxldCdzIHdhaXQgdW50aWwgaXQgaXMgY29ubmVjdGVkIGFnYWluXHJcbiAgICAgICAgICBpZiAoZGlzY29ubmVjdGVkLmxlbmd0aCA+IDApIGNoYXQuaW52aXRhdGlvbnNIYW5kbGVyLmludml0ZURpc2Nvbm5lY3RlZEh5cGVydGllcyhkaXNjb25uZWN0ZWQsIGRhdGFPYmplY3RSZXBvcnRlcik7XHJcbiovXHJcbiAgICAgICAgICByZXNvbHZlKGNoYXQpO1xyXG5cclxuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbihyZWFzb24pIHtcclxuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2ltcGxlQ2hhdE1hbmFnZXIuY3JlYXRlXSBNeUlkZW50aXR5IEVycm9yOicsIHJlYXNvbik7XHJcbiAgICAgICAgcmV0dXJuIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuLy8gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBoYW5kbGUgbm90aWZpY2F0aW9ucyBhYm91dCBpbmNvbWluZyBpbnZpdGF0aW9ucyB0byBqb2luIGEgR3JvdXAgQ2hhdC5cclxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gQ3JlYXRlRXZlbnQgVGhlIENyZWF0ZUV2ZW50IGZpcmVkIGJ5IHRoZSBTeW5jaGVyIHdoZW4gYW4gaW52aXRhaW9uIGlzIHJlY2VpdmVkXHJcbiAgICovXHJcbiAgb25JbnZpdGF0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuX29uSW52aXRhdGlvbiA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGpvaW4gYSBHcm91cCBDaGF0LlxyXG4gICAqIEBwYXJhbSAge1VSTC5Db21tdW5pY2F0aW9uVVJMfSBpbnZpdGF0aW9uVVJMICBUaGUgQ29tbXVuaWNhdGlvbiBVUkwgb2YgdGhlIEdyb3VwIENoYXQgdG8gam9pbiB0aGF0IGlzIHByb3ZpZGVkIGluIHRoZSBpbnZpdGF0aW9uIGV2ZW50XHJcbiAgICogQHJldHVybiB7PFByb21pc2U+Q2hhdENvbnRyb2xsZXJ9ICAgICAgICAgICAgIEl0IHJldHVybnMgdGhlIENoYXRDb250cm9sbGVyIG9iamVjdCBhcyBhIFByb21pc2VcclxuICAgKi9cclxuICBqb2luKGludml0YXRpb25VUkwsIG11dHVhbCA9IGZhbHNlLCBpZGVudGl0eSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgIGxldCBzeW5jaGVyID0gX3RoaXMuX3N5bmNoZXI7XHJcbiAgICAgIGxldCBteUlkZW50aXR5O1xyXG5cclxuICAgICAgY29uc29sZS5pbmZvKCdbU2ltcGxlQ2hhdE1hbmFnZXJdIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTeW5jaGVyIHN1YnNjcmliZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFxcbicpO1xyXG4gICAgICBjb25zb2xlLmluZm8oJ2ludml0YXRpb25VUkwnLCBpbnZpdGF0aW9uVVJMKTtcclxuICAgICAgX3RoaXMubXlJZGVudGl0eShpZGVudGl0eSkudGhlbigoaWRlbnRpdHkpID0+IHtcclxuICAgICAgICBteUlkZW50aXR5ID0gaWRlbnRpdHk7XHJcbiAgICAgICAgbGV0IGlucHV0ID0ge1xyXG4gICAgICAgICAgc2NoZW1hOiBfdGhpcy5fb2JqZWN0RGVzY1VSTCxcclxuICAgICAgICAgIHJlc291cmNlOiBpbnZpdGF0aW9uVVJMLFxyXG4gICAgICAgICAgc3RvcmU6IHRydWUsXHJcbiAgICAgICAgICBwMnA6IGZhbHNlLFxyXG4gICAgICAgICAgbXV0dWFsOiBtdXR1YWwsXHJcbiAgICAgICAgICBkb21haW5fc3Vic2NyaXB0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgaWRlbnRpdHk6IGlkZW50aXR5XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKF90aGlzLm9mZmxpbmUpIGlucHV0Lm9mZmxpbmUgPSBfdGhpcy5vZmZsaW5lO1xyXG5cclxuICAgICAgICByZXR1cm4gc3luY2hlci5zdWJzY3JpYmUoaW5wdXQpO1xyXG5cclxuICAgICAgfSkudGhlbihmdW5jdGlvbihkYXRhT2JqZWN0T2JzZXJ2ZXIpIHtcclxuICAgICAgICBjb25zb2xlLmluZm8oJ0RhdGEgT2JqZWN0IE9ic2VydmVyOiAnLCBkYXRhT2JqZWN0T2JzZXJ2ZXIpO1xyXG5cclxuICAgICAgICBsZXQgY2hhdCA9IG5ldyBDaGF0KHN5bmNoZXIsIF90aGlzLl9kb21haW4sIG15SWRlbnRpdHksIF90aGlzKTtcclxuICAgICAgICByZXNvbHZlKGNoYXQpO1xyXG5cclxuICAgICAgICBjaGF0LmRhdGFPYmplY3RPYnNlcnZlciA9IGRhdGFPYmplY3RPYnNlcnZlcjtcclxuXHJcbiAgICAgICAgX3RoaXMuX29ic2VydmVyc0NvbnRyb2xsZXJzW2RhdGFPYmplY3RPYnNlcnZlci51cmxdID0gY2hhdDtcclxuXHJcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKHJlYXNvbikge1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTaW1wbGVTaW1wbGVDaGF0TWFuYWdlcjtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5pbXBvcnQgU3luY2hlciBmcm9tICcuLi9zeW5jaGVyL1N5bmNoZXInO1xyXG5pbXBvcnQgTm90aWZpY2F0aW9uSGFuZGxlciBmcm9tICcuLi9zeW5jaGVyL05vdGlmaWNhdGlvbkhhbmRsZXInO1xyXG5pbXBvcnQge2RpdmlkZVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgSWRlbnRpdHlNYW5hZ2VyIGZyb20gJy4uL2lkZW50aXR5L0lkZW50aXR5TWFuYWdlcic7XHJcbmltcG9ydCBEaXNjb3ZlcnkgZnJvbSAnLi4vZGlzY292ZXJ5L0Rpc2NvdmVyeSc7XHJcbmltcG9ydCBSZWdpc3RyYXRpb25TdGF0dXMgZnJvbSAnLi4vZGlzY292ZXJ5L1JlZ2lzdHJhdGlvblN0YXR1cyc7XHJcbmltcG9ydCBTZWFyY2ggZnJvbSAnLi4vdXRpbHMvU2VhcmNoJztcclxuaW1wb3J0IENvbnRleHRPYnNlcnZlciBmcm9tICcuLi9jb250ZXh0TWFuYWdlci9Db250ZXh0T2JzZXJ2ZXInO1xyXG5pbXBvcnQgQ29udGV4dFJlcG9ydGVyIGZyb20gJy4uL2NvbnRleHRNYW5hZ2VyL0NvbnRleHRSZXBvcnRlcic7XHJcbmltcG9ydCBNZXNzYWdlQm9keUlkZW50aXR5IGZyb20gJy4uL2lkZW50aXR5L01lc3NhZ2VCb2R5SWRlbnRpdHknO1xyXG5pbXBvcnQgQ2hhdE1hbmFnZXIgZnJvbSAnLi4vY2hhdE1hbmFnZXIvQ2hhdE1hbmFnZXInO1xyXG5pbXBvcnQgQ2hhdENvbnRyb2xsZXIgZnJvbSAnLi4vY2hhdE1hbmFnZXIvQ2hhdENvbnRyb2xsZXInO1xyXG5pbXBvcnQgU2ltcGxlQ2hhdE1hbmFnZXIgZnJvbSAnLi4vY2hhdE1hbmFnZXIvU2ltcGxlQ2hhdE1hbmFnZXInO1xyXG5pbXBvcnQgQ2hhdCBmcm9tICcuLi9jaGF0TWFuYWdlci9DaGF0JztcclxuXHJcbi8qKlxyXG4gKiBJbnRlcm5hbCBjb21wb25lbnQgdG8gaW5zdGFudGlhdGUgZnJhbWV3b3JrIGZ1bmN0aW9uYWxpdGllcy5cclxuICovXHJcbmNsYXNzIFNhbmRib3hGYWN0b3J5IHtcclxuICAvKiBwcml2YXRlXHJcbiAgX2NvbXBvbmVudHM6IDx1cmw6IGluc3RhbmNlPlxyXG4gICovXHJcblxyXG4gIGNvbnN0cnVjdG9yKGJ1cykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9idXMgPSBidXM7XHJcbiAgICBfdGhpcy5fZGl2aWRlVVJMID0gZGl2aWRlVVJMO1xyXG5cclxuICB9XHJcblxyXG4gIGNyZWF0ZVN5bmNoZXIob3duZXIsIGJ1cywgY29uZmlnKSB7IFxyXG4gICAgcmV0dXJuIG5ldyBTeW5jaGVyKG93bmVyLCBidXMsIGNvbmZpZyk7XHJcbiAgIH1cclxuXHJcbiAgIGNyZWF0ZUlkZW50aXR5TWFuYWdlcihoeXBlcnR5VVJMLCBydW50aW1lVVJMLCBidXMpIHsgXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eU1hbmFnZXIoaHlwZXJ0eVVSTCwgcnVudGltZVVSTCwgYnVzKTtcclxuICAgfVxyXG5cclxuICAgY3JlYXRlRGlzY292ZXJ5KGh5cGVydHlVUkwsIHJ1bnRpbWVVUkwsIGJ1cykgeyBcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IERpc2NvdmVyeShoeXBlcnR5VVJMLCBydW50aW1lVVJMLCBidXMpO1xyXG4gICB9XHJcblxyXG4gICBjcmVhdGVTZWFyY2goZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpIHsgXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIG5ldyBTZWFyY2goZGlzY292ZXJ5LCBpZGVudGl0eU1hbmFnZXIpO1xyXG4gICB9XHJcblxyXG4gICBjcmVhdGVDb250ZXh0T2JzZXJ2ZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWcsIHNjaGVtZXMpIHsgXHJcbiAgICByZXR1cm4gbmV3IENvbnRleHRPYnNlcnZlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZywgc2NoZW1lcywgdGhpcyk7XHJcbiAgIH1cclxuXHJcbiAgIGNyZWF0ZUNvbnRleHRSZXBvcnRlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZykgeyBcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IENvbnRleHRSZXBvcnRlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZywgdGhpcyk7XHJcbiAgIH1cclxuXHJcbiAgIGNyZWF0ZU5vdGlmaWNhdGlvbkhhbmRsZXIoYnVzKSB7IFxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgTm90aWZpY2F0aW9uSGFuZGxlcihidXMpO1xyXG4gICB9XHJcblxyXG4gICBjcmVhdGVNZXNzYWdlQm9keUlkZW50aXR5KHVzZXJuYW1lLCB1c2VyVVJMLCBwaWN0dXJlLCBuYW1lLCBsb2NhbGUsIGlkcCwgYXNzZXJ0aW9uLCBwcm9maWxlKSB7IFxyXG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlQm9keUlkZW50aXR5KHVzZXJuYW1lLCB1c2VyVVJMLCBwaWN0dXJlLCBuYW1lLCBsb2NhbGUsIGlkcCwgYXNzZXJ0aW9uLCBwcm9maWxlKTtcclxuICAgfVxyXG5cclxuICAgY3JlYXRlQ2hhdE1hbmFnZXIoaHlwZXJ0eVVSTCwgYnVzLCBjb25maWd1cmF0aW9uLCBzeW5jaGVyKSB7IFxyXG4gICAgcmV0dXJuIG5ldyBDaGF0TWFuYWdlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24sIHN5bmNoZXIsIHRoaXMpO1xyXG4gICB9XHJcblxyXG4gICBjcmVhdGVDaGF0Q29udHJvbGxlcihzeW5jaGVyLCBkaXNjb3ZlcnksIGRvbWFpbiwgc2VhcmNoLCBpZGVudGl0eSwgbWFuYWdlcikgeyBcclxuICAgIHJldHVybiBuZXcgQ2hhdENvbnRyb2xsZXIoc3luY2hlciwgZGlzY292ZXJ5LCBkb21haW4sIHNlYXJjaCwgaWRlbnRpdHksIG1hbmFnZXIpO1xyXG4gICB9XHJcblxyXG4gICBjcmVhdGVTaW1wbGVDaGF0TWFuYWdlcihoeXBlcnR5VVJMLCBidXMsIGNvbmZpZ3VyYXRpb24sIHN5bmNoZXIpIHsgXHJcbiAgICByZXR1cm4gbmV3IFNpbXBsZUNoYXRNYW5hZ2VyKGh5cGVydHlVUkwsIGJ1cywgY29uZmlndXJhdGlvbiwgc3luY2hlciwgdGhpcyk7XHJcbiAgIH1cclxuXHJcbiAgIGNyZWF0ZUNoYXQoc3luY2hlciwgZG9tYWluLCBpZGVudGl0eSwgbWFuYWdlcikgeyBcclxuICAgIHJldHVybiBuZXcgQ2hhdChzeW5jaGVyLCBkb21haW4sIGlkZW50aXR5LCBtYW5hZ2VyKTtcclxuICAgfVxyXG4gICBnZXQgZGl2aWRlVVJMKCl7XHJcbiAgICAgcmV0dXJuIHRoaXMuX2RpdmlkZVVSTDtcclxuICAgfVxyXG5cclxuICAgY3JlYXRlUmVnaXN0cmF0aW9uU3RhdHVzKG9ic2VydmVyLCBydW50aW1lVVJMLCBjaGF0VXJsLCBidXMpIHtcclxuICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uU3RhdHVzKG9ic2VydmVyLCBydW50aW1lVVJMLCBjaGF0VXJsLCBidXMpO1xyXG5cclxuICB9XHJcblxyXG5cclxuXHJcbn1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBTYW5kYm94RmFjdG9yeTtcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBOzs7QUFJQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBekJBO0FBQ0E7QUEwQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBTEE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQXJCQTtBQUNBO0FBdUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcElBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7OztBQUVBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FBS0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBR0E7Ozs7Ozs7Ozs7QUNuSEE7OztBQUtBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTs7OztBQ25CQTs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFJQTs7QUN2QkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7O0FBTUE7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTs7OztBQUtBOzs7OztBQU1BO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBOzs7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUFBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUVBO0FBRUE7QUFHQTs7O0FBNUlBO0FBQ0E7QUFDQTs7Ozs7O0FBOElBOzs7Ozs7OztBQzNMQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTs7O0FBeUhBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBcUJBO0FBRUE7QUFFQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBREE7QUFJQTtBQUVBO0FBQ0E7QUFEQTtBQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7O0FBT0E7QUFDQTtBQVZBO0FBYUE7QUFDQTtBQURBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQVFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQVlBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBR0E7Ozs7OztBQU1BOzs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBeG1CQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFsQkE7QUFvQkE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFTQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFnQkE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7QUF3ZEE7Ozs7OztBQ3pxQkE7QUFFQTtBQUVBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFNQTs7Ozs7Ozs7QUNoQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTs7O0FBVUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFVQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBclBBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7O0FBbVBBOzs7Ozs7OztBQ2pWQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBSUE7QUFFQTs7Ozs7OztBQXdIQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7OztBQXFCQTtBQUVBO0FBRUE7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQURBO0FBSUE7QUFFQTtBQUNBO0FBREE7QUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQWlCQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFPQTtBQUNBO0FBVkE7QUFhQTtBQUNBO0FBREE7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBUUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBO0FBQ0E7QUFDQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7O0FBTUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5REE7Ozs7Ozs7QUFNQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9DQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBR0E7Ozs7OztBQU1BOzs7Ozs7Ozs7QUFNQTtBQUVBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7O0FBMW1CQTtBQUNBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBbEJBO0FBb0JBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBU0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBZ0JBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7O0FBOGRBOzs7Ozs7OztBQzlxQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTs7O0FBaUJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUFBOzs7Ozs7OztBQU9BO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUdBOzs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFVQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7O0FBck5BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7Ozs7QUEyTUE7Ozs7Ozs7O0FDalRBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7OztBQUdBOzs7QUFDQTs7O0FBSUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUtBO0FBQ0E7QUFFQTs7O0FBUEE7QUFDQTtBQUNBOzs7Ozs7QUFZQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///12\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXTERNAL MODULE: ./node_modules/loglevel/lib/loglevel.js\nvar loglevel = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./src/utils/utils.js\nvar utils = __webpack_require__(0);\n\n// EXTERNAL MODULE: ./node_modules/proxy-observe/index.js\nvar proxy_observe = __webpack_require__(19);\n\n// CONCATENATED MODULE: ./src/syncher/ProxyObject.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar objectType = {\n ARRAY: '[object Array]',\n OBJECT: '[object Object]'\n};\n/**\r\n * @access private\r\n * Main class that maintains a JSON object, and observes changes in this object, recursively.\r\n * Internal objects and arrays are also observed.\r\n */\n\nvar ProxyObject_SyncObject =\n/*#__PURE__*/\nfunction () {\n function SyncObject(initialData) {\n _classCallCheck(this, SyncObject);\n\n var _this = this;\n\n _this._observers = [];\n _this._filters = {};\n this._data = initialData || {};\n\n this._internalObserve(this._data);\n }\n\n _createClass(SyncObject, [{\n key: \"observe\",\n value: function observe(callback) {\n this._observers.push(callback);\n }\n }, {\n key: \"find\",\n value: function find(path) {\n var list = Object(utils[\"y\" /* parseAttributes */])(path);\n return this._findWithSplit(list);\n }\n }, {\n key: \"findBefore\",\n value: function findBefore(path) {\n var result = {};\n var list = Object(utils[\"y\" /* parseAttributes */])(path);\n result.last = list.pop();\n result.obj = this._findWithSplit(list);\n return result;\n }\n }, {\n key: \"_findWithSplit\",\n value: function _findWithSplit(list) {\n var obj = this._data;\n list.forEach(function (value) {\n obj = obj[value];\n });\n return obj;\n }\n }, {\n key: \"_internalObserve\",\n value: function _internalObserve(object) {\n var _this2 = this;\n\n var handler = function handler(changeset) {\n changeset.every(function (change) {\n _this2._onChanges(change);\n });\n };\n\n this._data = Object.deepObserve(object, handler);\n }\n }, {\n key: \"_fireEvent\",\n value: function _fireEvent(event) {\n this._observers.forEach(function (callback) {\n callback(event);\n });\n }\n }, {\n key: \"_onChanges\",\n value: function _onChanges(change) {\n var obj = change.object;\n var objType;\n\n if (obj.constructor === Object) {\n objType = ObjectType.OBJECT;\n }\n\n if (obj.constructor === Array) {\n objType = ObjectType.ARRAY;\n }\n\n var fieldString = change.keypath; // console.log('Field:', fieldString);\n // console.log('type:', change.type);\n //let oldValue = change.oldValue;\n\n var newValue = obj[change.name]; // console.info(change.type + ' | Field: ' + fieldString + ' | New Value:', JSON.stringify(newValue), fieldString.includes('length'));\n\n if (change.type === 'update' && !fieldString.includes('.length')) {\n this._fireEvent({\n cType: ChangeType.UPDATE,\n oType: objType,\n field: fieldString,\n data: newValue\n });\n }\n\n if (change.type === 'add') {\n this._fireEvent({\n cType: ChangeType.ADD,\n oType: objType,\n field: fieldString,\n data: newValue\n });\n }\n\n if (change.type === 'delete') {\n this._fireEvent({\n cType: ChangeType.REMOVE,\n oType: objType,\n field: fieldString\n });\n }\n }\n }, {\n key: \"data\",\n get: function get() {\n return this._data;\n }\n }]);\n\n return SyncObject;\n}();\n\nvar ChangeType = {\n UPDATE: 'update',\n ADD: 'add',\n REMOVE: 'remove'\n};\nvar ObjectType = {\n OBJECT: 'object',\n ARRAY: 'array'\n};\n/* harmony default export */ var ProxyObject = (ProxyObject_SyncObject);\n// CONCATENATED MODULE: ./src/syncher/DataObjectChild.js\nfunction DataObjectChild_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectChild_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectChild_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectChild_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectChild_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar log = loglevel[\"getLogger\"]('DataObjectChild');\n\n\n/**\r\n * The class returned from the DataObject addChildren call or from onAddChildren if remotely created.\r\n */\n\nvar DataObjectChild_DataObjectChild\n/* implements SyncStatus */\n=\n/*#__PURE__*/\nfunction () {\n /* private\r\n ----event handlers----\r\n _onResponseHandler: (event) => void\r\n */\n\n /**\r\n * @ignore\r\n * Should not be used directly by Hyperties. It's called by the DataObject.addChild\r\n */\n function DataObjectChild(input) {\n DataObjectChild_classCallCheck(this, DataObjectChild);\n\n var _this = this;\n\n function throwMandatoryParmMissingError(par) {\n throw '[DataObjectChild] ' + par + ' mandatory parameter is missing';\n }\n\n input.parent ? _this._parent = input.parent : throwMandatoryParmMissingError('parent');\n input.url ? _this._url = input.url : throwMandatoryParmMissingError('url');\n input.created ? _this._created = input.created : throwMandatoryParmMissingError('created');\n input.reporter ? _this._reporter = input.reporter : throwMandatoryParmMissingError('reporter');\n input.runtime ? _this._runtime = input.runtime : throwMandatoryParmMissingError('runtime');\n input.schema ? _this._schema = input.schema : throwMandatoryParmMissingError('schema');\n input.parentObject ? _this._parentObject = input.parentObject : throwMandatoryParmMissingError('parentObject');\n if (input.name) _this._name = input.name;\n if (input.description) _this._description = input.description;\n if (input.tags) _this._tags = input.tags;\n if (input.resources) _this._resources = input.resources;\n if (input.observerStorage) _this._observerStorage = input.observerStorage;\n if (input.publicObservation) _this._publicObservation = input.publicObservation;\n _this._childId = input.url;\n\n if (input.data) {\n _this._syncObj = new ProxyObject(input.data);\n } else {\n _this._syncObj = new ProxyObject({});\n }\n\n log.log('[DataObjectChild - Constructor] - ', _this._syncObj);\n _this._bus = _this._parentObject._bus;\n _this._owner = _this._parentObject._owner;\n\n _this._allocateListeners();\n\n _this._metadata = input; // delete _this._metadata.data;\n\n delete _this._metadata.parentObject;\n _this._sharingStatus = false;\n }\n\n DataObjectChild_createClass(DataObjectChild, [{\n key: \"share\",\n\n /**\r\n * This function is used to share the child Object among authorised Hyperties\r\n * @param {boolean} reporter If true the child object is only shared to Parent reporter\r\n * @return {Promise} It returns a promise with the sharing results.\r\n */\n value: function share(toReporter) {\n var _this = this;\n\n _this._sharingStatus = new Promise(function (resolve, reject) {\n var to;\n var reporter = toReporter;\n\n if (reporter) {\n to = _this.metadata.parent;\n } else to = _this.metadata.parent + '/children/';\n\n var childValue = _this.metadata;\n childValue.data = _this.data; //FLOW-OUT: this message will be sent directly to a resource child address: MessageBus\n\n var requestMsg = {\n type: 'create',\n from: _this.metadata.reporter,\n to: to,\n body: {\n resource: childValue.url,\n value: childValue\n }\n };\n\n if (_this.identity) {\n requestMsg.body.identity = _this.identity;\n } //to be used to disable mutual authentication for legacy users\n\n\n if (_this._parentObject.data.hasOwnProperty('mutual')) requestMsg.body.mutual = _this._parentObject.data.mutual;\n\n if (_this._parentObject.metadata.reporter === _this.metadata.reporter) {\n _this._bus.postMessage(Object(utils[\"i\" /* deepClone */])(requestMsg));\n\n return resolve();\n } else {\n var callback = function callback(reply) {\n if (reply.to === _this._reporter) {\n _this._bus.removeResponseListener(requestMsg.from, reply.id);\n\n log.log('[Syncher.DataObjectChild.share] Parent reporter reply ', reply);\n var result = {\n code: reply.body && reply.body.code ? reply.body.code : 500,\n desc: reply.body && reply.body.desc ? reply.body.desc : 'Unknown'\n };\n\n if (reply.body.code < 300) {\n return resolve(result);\n } else return reject(result);\n }\n };\n\n var id = _this._bus.postMessage(Object(utils[\"i\" /* deepClone */])(requestMsg), callback, false);\n\n setTimeout(function () {\n // If Reporter does not reply the promise is rejected\n _this._bus.removeResponseListener(requestMsg.from, id);\n\n var result = {\n code: 408,\n desc: 'timout'\n };\n return reject(result);\n }, 3000);\n }\n });\n }\n /**\r\n * This function is used to share the child Object among authorised Hyperties\r\n * @param {boolean} reporter If true the child object is only shared to Parent reporter\r\n * @return {Promise} It returns a promise with the sharing results.\r\n */\n\n }, {\n key: \"store\",\n value: function store() {\n var _this = this;\n\n var child = {};\n var key = _this.metadata.children + '.' + _this.metadata.url;\n child.value = _this.metadata;\n child.identity = _this.identity;\n var msg = {\n from: _this.metadata.reporter,\n to: _this._parentObject._syncher._subURL,\n type: 'create',\n body: {\n resource: _this.metadata.parent,\n attribute: key,\n value: child\n }\n };\n log.log('[DataObjectChild.store]:', msg);\n\n _this._bus.postMessage(msg);\n }\n }, {\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this = this; //this is only needed for children reporters\n\n\n if (_this._reporter === _this._owner) {\n _this._listener = _this._bus.addListener(_this._reporter, function (msg) {\n if (msg.type === 'response' && msg.id === _this._msgId) {\n log.log('DataObjectChild.onResponse:', msg);\n\n _this._onResponse(msg);\n }\n });\n }\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n if (_this._listener) {\n _this._listener.remove();\n }\n }\n /**\r\n * Release and delete object data\r\n */\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n _this._releaseListeners(); //TODO: send delete message ?\n // nothing to be done\n // return new Promise((resolve) => {\n // log.log('[DataObjectChild.delete]');\n // resolve();\n // });\n\n }\n /**\r\n * All Metadata about the Child Data Object\r\n * @type {Object} -\r\n */\n\n }, {\n key: \"onChange\",\n\n /**\r\n * Register the change listeners sent by the reporter child\r\n * @param {function(event: MsgEvent)} callback\r\n */\n value: function onChange(callback) {\n this._syncObj.observe(function (event) {\n log.log('[DataObjectChild - observer] - ', event);\n callback(event);\n });\n }\n /**\r\n * Setup the callback to process response notifications of the creates\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n this._onResponseHandler = callback;\n } //FLOW-IN: message received from a remote DataObject -> _onChildCreate\n\n }, {\n key: \"_onResponse\",\n value: function _onResponse(msg) {\n var _this = this;\n\n var event = {\n type: msg.type,\n url: msg.body.source,\n code: msg.body.code\n };\n\n if (_this._onResponseHandler) {\n _this._onResponseHandler(event);\n }\n }\n }, {\n key: \"shareable\",\n get: function get() {\n var shareable = this.metadata;\n shareable.data = this.data;\n return shareable;\n }\n }, {\n key: \"metadata\",\n get: function get() {\n return this._metadata;\n }\n /**\r\n * Children ID generated on addChildren. Unique identifier\r\n * @type {URL} - URL of the format #\r\n */\n\n }, {\n key: \"childId\",\n get: function get() {\n return this._childId;\n }\n /**\r\n * Data Structure to be synchronized.\r\n * @type {JSON} - JSON structure that should follow the defined schema, if any.\r\n */\n\n }, {\n key: \"sharingStatus\",\n get: function get() {\n return this._sharingStatus;\n }\n /**\r\n * Data Structure to be synchronized.\r\n * @type {JSON} - JSON structure that should follow the defined schema, if any.\r\n */\n\n }, {\n key: \"data\",\n get: function get() {\n return this._syncObj.data;\n }\n /**\r\n * Set for this dataObjectChild an identity\r\n * @method identity\r\n * @param {Identity} identity identity from who created the message\r\n */\n\n }, {\n key: \"identity\",\n set: function set(identity) {\n this._identity = identity;\n }\n /**\r\n * Get for this dataObjectChild an identity\r\n * @method identity\r\n * @return {Identity} identity from who created the message\r\n */\n ,\n get: function get() {\n return this._identity;\n }\n }]);\n\n return DataObjectChild;\n}();\n\n/* harmony default export */ var syncher_DataObjectChild = (DataObjectChild_DataObjectChild);\n// CONCATENATED MODULE: ./src/syncher/HeartBeat.js\nfunction HeartBeat_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HeartBeat_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HeartBeat_createClass(Constructor, protoProps, staticProps) { if (protoProps) HeartBeat_defineProperties(Constructor.prototype, protoProps); if (staticProps) HeartBeat_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/**\r\n * Class to handle Children Data Object Heart beats \r\n * required to manage synchronisation with remote storage servers.\r\n */\n\nvar HeartBeat_HeartBeat =\n/*#__PURE__*/\nfunction () {\n /* private\r\n */\n\n /**\r\n * @ignore\r\n * Should not be used directly by Hyperties. It's called by the DataObject constructor\r\n */\n function HeartBeat(bus, hypertyUrl, runtimeUrl, dataObject) {\n var heartBeatRate = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 60;\n\n HeartBeat_classCallCheck(this, HeartBeat);\n\n var _this = this;\n\n function throwMandatoryParmMissingError(par) {\n throw '[HeartBeat] ' + par + ' mandatory parameter is missing';\n }\n\n bus ? _this._bus = bus : throwMandatoryParmMissingError('bus');\n dataObject ? _this._dataObject = dataObject : throwMandatoryParmMissingError('dataObject');\n heartBeatRate ? _this._heartBeatRate = heartBeatRate : throwMandatoryParmMissingError('heartBeatRate');\n runtimeUrl ? _this._runtimeUrl = runtimeUrl : throwMandatoryParmMissingError('runtimeUrl');\n hypertyUrl ? _this._hypertyUrl = hypertyUrl : throwMandatoryParmMissingError('hypertyUrl');\n this.heartbeat = 0;\n _this._stop = {\n heartBeat: false,\n sync: function sync(bus) {\n var stopSyncMsg = {\n from: hypertyUrl,\n to: runtimeUrl + '/sm',\n type: 'execute',\n body: {\n method: 'stopSync',\n params: [dataObject.url]\n }\n };\n console.log('[Heartbeat.stop.sync()] sending msg:', stopSyncMsg);\n bus.postMessage(stopSyncMsg);\n }\n };\n }\n\n HeartBeat_createClass(HeartBeat, [{\n key: \"start\",\n value: function start(resume) {\n var _this2 = this;\n\n var isReporter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n console.log('[HeartBeat] starting. isReporter: ', isReporter);\n\n if (resume || !isReporter) {\n this._getLastHearBeat().then(function () {\n var isHeartBeatActive = _this2._isHeartBeatActive(_this2.heartBeat, _this2._heartBeatRate * 2);\n\n if (!isHeartBeatActive) {\n console.log('[HeartBeat] heart beats are disabled for ', _this2._dataObject); // Is disabled: lets start observer heart beat and start synching with remote storage server\n\n _this2._stop.heartBeat = _this2._startHeartBeat(_this2._heartBeatRate);\n console.log('[HeartBeat] ', _this2._hypertyUrl, ' started synching with remote storage server');\n\n _this2._startSync();\n } else {\n // heart beat is active, \n // it means the data object is already being synchronised with remote storage server\n // we only need to watch the heart beat and try to replace it in case it fails.\n _this2._watchHeartBeat(_this2._heartBeatRate, true, _this2._onHertbeatStopped);\n }\n });\n } else {\n this._startHeartBeat(this._heartBeatRate);\n\n this._startSync();\n }\n }\n }, {\n key: \"_getLastHearBeat\",\n value: function _getLastHearBeat() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n setTimeout(function () {\n console.log('[HeartBeat._getLastHearBeat] stop waiting ');\n resolve();\n }, _this3._heartBeatRate * 1000 * 1.5);\n });\n }\n }, {\n key: \"stop\",\n value: function stop() {\n if (this._stop.heartBeat) this._stop.heartBeat();\n\n this._stop.sync(this._bus);\n }\n }, {\n key: \"onNewHeartbeat\",\n value: function onNewHeartbeat(heartbeat) {\n this.heartbeat = heartbeat;\n }\n }, {\n key: \"_isHeartBeatActive\",\n value: function _isHeartBeatActive(lastHeartbeat, maxHeartBeatInterval) {\n var lastHeartPeriodInterval = Object(utils[\"C\" /* secondsSinceEpoch */])() - lastHeartbeat;\n console.log('[HeartBeat._isHeartBeatActive] now - lastHeartBeat', lastHeartPeriodInterval);\n console.log('[HeartBeat._isHeartBeatActive] ', !(lastHeartPeriodInterval > maxHeartBeatInterval * 2));\n return !(lastHeartPeriodInterval > maxHeartBeatInterval * 2);\n }\n }, {\n key: \"_startHeartBeat\",\n value: function _startHeartBeat(rate) {\n var _this = this;\n\n var msg = {\n from: _this._hypertyUrl,\n to: _this._dataObject.url + '/children/',\n type: 'create',\n body: {\n resource: 'heartbeat',\n mutual: false,\n value: Object(utils[\"C\" /* secondsSinceEpoch */])()\n }\n };\n console.log('[HeartBeat._startHeartBeat] starting ... ', msg.body.value);\n\n this._bus.postMessage(msg);\n\n this.heartbeat = Object(utils[\"C\" /* secondsSinceEpoch */])();\n var id = setInterval(function () {\n var msg = {\n from: _this._hypertyUrl,\n to: _this._dataObject.url + '/children/',\n type: 'create',\n body: {\n resource: 'heartbeat',\n mutual: false,\n value: Object(utils[\"C\" /* secondsSinceEpoch */])()\n }\n };\n console.log('[HeartBeat] ', msg);\n\n _this._bus.postMessage(msg);\n\n this.heartbeat = Object(utils[\"C\" /* secondsSinceEpoch */])();\n }, rate * 1000); // returns function to stop the heart beat\n\n return function () {\n clearInterval(id);\n };\n }\n }, {\n key: \"_startSync\",\n value: function _startSync() {\n console.log('[HeartBeat._startSync] starting observer sync ', this._dataObject.data);\n var backupRevision = this._dataObject.data.backupRevision;\n console.log('[HeartBeat._startSync] backupRevision ', backupRevision);\n var msg = {\n from: this._hypertyUrl,\n to: this._runtimeUrl + '/sm',\n type: 'execute',\n body: {\n method: 'sync',\n params: [this._dataObject.url, backupRevision]\n }\n };\n console.log('[HeartBeat._startSync] sending msg ', msg);\n\n this._bus.postMessage(msg);\n }\n }, {\n key: \"_watchHeartBeat\",\n value: function _watchHeartBeat(rate, onWatchingIsEnabled, callback) {\n // qdo o heartBeat terminar chama callback \n // usa heartBeat Rating para iniciar timer no respectivo \n // campo do DO chamando isHeartBeatActive()\n var _this = this;\n\n var syncFun = callback;\n console.log('[HeartBeat._watchHeartBeat] started watching ', _this.heartBeat); //let heartBeat = type + 'HeartBeat';\n\n var watcher = setInterval(function () {\n if (onWatchingIsEnabled && !_this._isHeartBeatActive(_this.heartBeat, _this._heartBeatRate)) {\n console.log('[HeartBeat._watchHeartBeat] has stopped ', _this._dataObject.data);\n clearInterval(watcher);\n syncFun(_this);\n } else if (!onWatchingIsEnabled && this._isHeartBeatActive(_this.heartBeat, _this._heartBeatRate)) {\n console.log('[HeartBeat._watchHeartBeat] has changed to disabled ', _this._dataObject.data);\n clearInterval(watcher);\n syncFun();\n }\n }, rate * 1000 * 2);\n }\n }, {\n key: \"_onHertbeatStopped\",\n value: function _onHertbeatStopped(_this) {\n _this._startHeartBeat(_this._heartBeatRate);\n\n _this._startSync();\n }\n }, {\n key: \"heartBeat\",\n get: function get() {\n if (this.heartbeat) return this.heartbeat;else return 0;\n }\n }]);\n\n return HeartBeat;\n}();\n\n/* harmony default export */ var syncher_HeartBeat = (HeartBeat_HeartBeat);\n// CONCATENATED MODULE: ./src/hyperty-resource/HypertyResource.js\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction HypertyResource_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyResource_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyResource_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyResource_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyResource_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* The Hyperty Resource Data Model is used to model resouces handled by Hyperties and Data Objects including chat messages, files, real time human audio and video..\r\n*\r\n*/\n// Log System\n\nvar HypertyResource_log = loglevel[\"getLogger\"]('HypertyResource');\n\n\n\nvar HypertyResource_HypertyResource =\n/*#__PURE__*/\nfunction (_DataObjectChild) {\n _inherits(HypertyResource, _DataObjectChild);\n\n /**\r\n * HypertyResource constructor\r\n *\r\n * @param {URL} localRuntimeURL RuntimeURL of local runtime\r\n * @param {URL} input.owner HypertyURL of the Hyperty handling this resource\r\n * @param {URL} input.runtime Runtime URL where this resource is hosted\r\n * @param {Bus} input.bus sandbox message bus\r\n * @param {DataObject} input.parent Parent Data Object where the HypertyResource is handled as a child\r\n * @param {Boolean} isSender indicates if parent is Reporter or an Observer\r\n * @param {Array} input optional input parameters\r\n */\n function HypertyResource(isSender, input) {\n var _this2;\n\n HypertyResource_classCallCheck(this, HypertyResource);\n\n _this2 = _possibleConstructorReturn(this, _getPrototypeOf(HypertyResource).call(this, input));\n\n var _this = _assertThisInitialized(_assertThisInitialized(_this2));\n\n _this.arraybufferSizeLimit = 5242880; //above this limit content is not saved as ArrayBuffer\n\n _this._isSender = isSender;\n _this._localStorageURL = _this._parentObject._syncher._runtimeUrl + '/storage';\n return _this2;\n }\n\n HypertyResource_createClass(HypertyResource, [{\n key: \"save\",\n\n /*\r\n set parent(parent) {\r\n let _this = this;\r\n _this._parent = parent;\r\n }*/\n value: function save() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var msg = {\n from: _this._owner,\n to: _this._localStorageURL,\n type: 'create',\n body: {\n value: Object(utils[\"i\" /* deepClone */])(_this._metadata)\n }\n };\n\n var callback = function callback(reply) {\n HypertyResource_log.info('[HypertyResource.save] reply: ', reply);\n\n _this._bus.removeResponseListener(_this._owner, reply.id);\n\n if (reply.body.code === 200) {\n if (reply.body.value) {\n if (!_this._metadata.contentURL) _this._metadata.contentURL = [];\n\n _this._metadata.contentURL.push(reply.body.value);\n }\n\n resolve();\n } else reject(reply.body.code + ' ' + reply.body.desc);\n };\n\n msg.body.value.content = _this._content;\n\n _this._bus.postMessage(msg, callback, false);\n });\n }\n /**\r\n * Function to Read HypertyResource\r\n *\r\n * @param {} callback callback to be called with progress information in terms of percentage\r\n * @return {Promise} input optional input parameters\r\n */\n\n }, {\n key: \"read\",\n value: function read(callback) {\n var _this = this;\n\n HypertyResource_log.info('[HypertyResource.read] ', this);\n return new Promise(function (resolve, reject) {\n if (_this.content) {\n resolve(_this);\n } else {\n //TODO: use an iteration to get online runtime storages when some are offline\n var storage = _this._getBestContentURL(_this._metadata.contentURL);\n\n HypertyResource_log.log('Storage:', storage);\n var msg = {\n from: _this._owner,\n to: storage.url,\n type: 'read',\n body: {\n resource: storage.url + '/' + storage.resource,\n p2p: true\n }\n };\n\n if (_this.metadata.p2pRequester && _this.metadata.p2pHandler) {\n msg.body.p2pRequester = _this.metadata.p2pRequester;\n msg.body.p2pHandler = _this.metadata.p2pHandler;\n } // get the resource first on the Local Hyperty Resource Storage;\n\n\n _this._getBestResource(msg, callback).then(function (reply) {\n HypertyResource_log.info('[HypertyResource] - get locally the resource:', reply);\n resolve(_this);\n }).catch(function (reply) {\n HypertyResource_log.warn('[HypertyResource] - get locally the resource fail', reply); // Generate new message to not use the same id of the last one;\n\n var msg = {\n from: _this._owner,\n to: storage.remoteURL,\n type: 'read',\n body: {\n resource: storage.remoteURL + '/' + storage.resource,\n p2p: true\n }\n };\n\n if (_this.metadata.p2pRequester && _this.metadata.p2pHandler) {\n msg.body.p2pRequester = _this.metadata.p2pRequester;\n msg.body.p2pHandler = _this.metadata.p2pHandler;\n } // get the resource on the Remote Hyperty Resource Storage;\n\n\n _this._getBestResource(msg, callback).then(function (reply) {\n HypertyResource_log.warn('[HypertyResource] - get remotely the resource', reply);\n resolve(_this);\n }).catch(function (reply) {\n HypertyResource_log.warn('[HypertyResource] - get remotely the resource fail', reply);\n reject(reply.body.code + ' ' + reply.body.desc);\n });\n });\n }\n });\n }\n }, {\n key: \"_getBestResource\",\n value: function _getBestResource(msg, inProgressCallback) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var waitForResponse = setTimeout(function () {\n // If Reporter does not reply the promise is rejected\n _this._bus.removeResponseListener(_this._owner, id);\n\n msg.body.code = 408;\n msg.body.desc = 'Response timeout';\n return reject(msg);\n }, 3000);\n\n var callback = function callback(reply) {\n HypertyResource_log.log('[HypertyResource.read] reply: ', reply);\n var id = reply.id;\n clearTimeout(waitForResponse);\n\n switch (reply.body.code) {\n case 200:\n _this._content = reply.body.value.content; // save locally if not too big\n\n if (reply.body.value.size < _this.arraybufferSizeLimit) {\n _this.save();\n }\n\n _this._bus.removeResponseListener(_this._owner, id);\n\n resolve(reply);\n break;\n\n case 183:\n inProgressCallback(reply.body.value);\n break;\n\n default:\n _this._bus.removeResponseListener(_this._owner, id);\n\n reject(reply);\n break;\n }\n };\n\n var id = _this._bus.postMessage(msg, callback, false);\n });\n } // Remove Hyperty from the local storage\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n HypertyResource_log.info('[HypertyResource.delete]', _this.metadata);\n var msg = {\n from: _this._owner,\n to: _this._localStorageURL,\n type: 'delete',\n body: {\n resources: _this.metadata.contentURL\n }\n };\n return new Promise(function (resolve) {\n _this._bus.postMessage(msg, function (reply) {\n if (reply.body.code < 300) resolve(true);else resolve(false);\n });\n });\n }\n }, {\n key: \"_getBestContentURL\",\n value: function _getBestContentURL(contentURLList) {\n var _this = this;\n\n var contentURL = contentURLList[0];\n var splitedResource = contentURL.substr(contentURL.lastIndexOf('/') + 1);\n var url = _this._localStorageURL; // contentURL.substr(0, contentURL.lastIndexOf('/'));\n\n var remoteResource = contentURL.substr(0, contentURL.lastIndexOf('/'));\n return {\n url: url,\n resource: splitedResource,\n remoteURL: remoteResource\n };\n }\n }, {\n key: \"resourceType\",\n get: function get() {\n var _this = this;\n\n return _this.metadata.resourceType;\n }\n }, {\n key: \"mimetype\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.type;\n }\n }, {\n key: \"content\",\n get: function get() {\n var _this = this;\n\n return _this._content;\n }\n }, {\n key: \"contentURL\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.contentURL;\n }\n }, {\n key: \"shareable\",\n get: function get() {\n var _this = this;\n\n var shareable = _get(_getPrototypeOf(HypertyResource.prototype), \"metadata\", this);\n\n shareable.resourceType = _this.resourceType;\n return shareable;\n }\n }]);\n\n return HypertyResource;\n}(syncher_DataObjectChild);\n\n/* harmony default export */ var hyperty_resource_HypertyResource = (HypertyResource_HypertyResource);\n// CONCATENATED MODULE: ./src/utils/ImageTools.js\nfunction ImageTools_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction ImageTools_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ImageTools_createClass(Constructor, protoProps, staticProps) { if (protoProps) ImageTools_defineProperties(Constructor.prototype, protoProps); if (staticProps) ImageTools_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar hasBlobConstructor = typeof Blob !== 'undefined' && function () {\n try {\n return Boolean(new Blob());\n } catch (e) {\n return false;\n }\n}();\n\nvar hasArrayBufferViewSupport = hasBlobConstructor && typeof Uint8Array !== 'undefined' && function () {\n try {\n return new Blob([new Uint8Array(100)]).size === 100;\n } catch (e) {\n return false;\n }\n}();\n\nvar hasToBlobSupport = typeof HTMLCanvasElement !== \"undefined\" ? HTMLCanvasElement.prototype.toBlob : false;\nvar hasBlobSupport = hasToBlobSupport || typeof Uint8Array !== 'undefined' && typeof ArrayBuffer !== 'undefined' && typeof atob !== 'undefined';\nvar hasReaderSupport = typeof FileReader !== 'undefined' || typeof URL !== 'undefined';\n\nvar ImageTools =\n/*#__PURE__*/\nfunction () {\n function ImageTools() {\n ImageTools_classCallCheck(this, ImageTools);\n }\n\n ImageTools_createClass(ImageTools, null, [{\n key: \"resize\",\n value: function resize(file, maxDimensions, callback) {\n if (typeof maxDimensions === 'function') {\n callback = maxDimensions;\n maxDimensions = {\n width: 640,\n height: 480\n };\n }\n\n var maxWidth = maxDimensions.width;\n var maxHeight = maxDimensions.height;\n\n if (!ImageTools.isSupported() || !file.type.match(/image.*/)) {\n callback(file, false);\n return false;\n }\n\n if (file.type.match(/image\\/gif/)) {\n // Not attempting, could be an animated gif\n callback(file, false); // TODO: use https://github.com/antimatter15/whammy to convert gif to webm\n\n return false;\n }\n\n var image = document.createElement('img');\n\n image.onload = function (imgEvt) {\n var width = image.width;\n var height = image.height;\n var isTooLarge = false;\n\n if (width >= height && width > maxDimensions.width) {\n // width is the largest dimension, and it's too big.\n height *= maxDimensions.width / width;\n width = maxDimensions.width;\n isTooLarge = true;\n } else if (height > maxDimensions.height) {\n // either width wasn't over-size or height is the largest dimension\n // and the height is over-size\n width *= maxDimensions.height / height;\n height = maxDimensions.height;\n isTooLarge = true;\n }\n\n if (!isTooLarge) {\n // early exit; no need to resize\n callback(file, false);\n return;\n }\n\n var canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n var ctx = canvas.getContext('2d');\n ctx.drawImage(image, 0, 0, width, height);\n\n if (hasToBlobSupport) {\n canvas.toBlob(function (blob) {\n callback(blob, true);\n }, file.type);\n } else {\n var blob = ImageTools._toBlob(canvas, file.type);\n\n callback(blob, true);\n }\n };\n\n ImageTools._loadImage(image, file);\n\n return true;\n }\n }, {\n key: \"_toBlob\",\n value: function _toBlob(canvas, type) {\n var dataURI = canvas.toDataURL(type);\n var dataURIParts = dataURI.split(',');\n var byteString;\n\n if (dataURIParts[0].indexOf('base64') >= 0) {\n // Convert base64 to raw binary data held in a string:\n byteString = atob(dataURIParts[1]);\n } else {\n // Convert base64/URLEncoded data component to raw binary data:\n byteString = decodeURIComponent(dataURIParts[1]);\n }\n\n var arrayBuffer = new ArrayBuffer(byteString.length);\n var intArray = new Uint8Array(arrayBuffer);\n\n for (var i = 0; i < byteString.length; i += 1) {\n intArray[i] = byteString.charCodeAt(i);\n }\n\n var mimeString = dataURIParts[0].split(':')[1].split(';')[0];\n var blob = null;\n\n if (hasBlobConstructor) {\n blob = new Blob([hasArrayBufferViewSupport ? intArray : arrayBuffer], {\n type: mimeString\n });\n } else {\n var bb = new BlobBuilder();\n bb.append(arrayBuffer);\n blob = bb.getBlob(mimeString);\n }\n\n return blob;\n }\n }, {\n key: \"_loadImage\",\n value: function _loadImage(image, file, callback) {\n if (typeof URL === 'undefined') {\n var reader = new FileReader();\n\n reader.onload = function (evt) {\n image.src = evt.target.result;\n\n if (callback) {\n callback();\n }\n };\n\n reader.readAsDataURL(file);\n } else {\n image.src = URL.createObjectURL(file);\n\n if (callback) {\n callback();\n }\n }\n }\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n return typeof HTMLCanvasElement !== 'undefined' && hasBlobSupport && hasReaderSupport;\n }\n }]);\n\n return ImageTools;\n}();\n\n\n// CONCATENATED MODULE: ./src/hyperty-resource/FileHypertyResource.js\nfunction FileHypertyResource_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { FileHypertyResource_typeof = function _typeof(obj) { return typeof obj; }; } else { FileHypertyResource_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return FileHypertyResource_typeof(obj); }\n\nfunction FileHypertyResource_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction FileHypertyResource_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction FileHypertyResource_createClass(Constructor, protoProps, staticProps) { if (protoProps) FileHypertyResource_defineProperties(Constructor.prototype, protoProps); if (staticProps) FileHypertyResource_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction FileHypertyResource_possibleConstructorReturn(self, call) { if (call && (FileHypertyResource_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return FileHypertyResource_assertThisInitialized(self); }\n\nfunction FileHypertyResource_getPrototypeOf(o) { FileHypertyResource_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return FileHypertyResource_getPrototypeOf(o); }\n\nfunction FileHypertyResource_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) FileHypertyResource_setPrototypeOf(subClass, superClass); }\n\nfunction FileHypertyResource_setPrototypeOf(o, p) { FileHypertyResource_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return FileHypertyResource_setPrototypeOf(o, p); }\n\nfunction FileHypertyResource_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* The Hyperty Resource Data Model is used to model resouces handled by Hyperties and Data Objects including chat messages, files, real time human audio and video..\r\n*\r\n*/\n// Log System\n\nvar FileHypertyResource_log = loglevel[\"getLogger\"]('FileHypertyResource');\n\n\n\n\nvar FileHypertyResource_FileHypertyResource =\n/*#__PURE__*/\nfunction (_HypertyResource) {\n FileHypertyResource_inherits(FileHypertyResource, _HypertyResource);\n\n /**\r\n * FileHypertyResource constructor\r\n *\r\n * @param {URL} owner HypertyURL of the Hyperty handling this resource\r\n * @param {URL} runtime Runtime URL where this resource is hosted\r\n * @param {Bus} bus sandbox message bus\r\n * @param {DataObject} parent Parent Data Object where the HypertyResource is handled as a child\r\n * @param {File} file file to be encoded as HypertyResource\r\n * @param {Boolean} isReporter indicates if parent is Reporter or an Observer\r\n * @param {Array} input optional input parameters\r\n */\n function FileHypertyResource(isSender, input) {\n var _this2;\n\n FileHypertyResource_classCallCheck(this, FileHypertyResource);\n\n _this2 = FileHypertyResource_possibleConstructorReturn(this, FileHypertyResource_getPrototypeOf(FileHypertyResource).call(this, isSender, input));\n\n var _this = FileHypertyResource_assertThisInitialized(FileHypertyResource_assertThisInitialized(_this2));\n\n _this.metadata.resourceType = 'file';\n return _this2;\n }\n\n FileHypertyResource_createClass(FileHypertyResource, [{\n key: \"init\",\n value: function init(file) {\n var _this = this;\n\n if (!file) throw new Error('[FileHypertyResource.constructor] missing mandatory *file* input ');\n return new Promise(function (resolve, reject) {\n _this._metadata.name = file.name;\n _this._metadata.lastModified = file.lastModified;\n _this._metadata.size = file.size;\n _this._metadata.mimetype = file.type;\n FileHypertyResource_log.log('[FileHypertyResource.init] file: ', file);\n\n if (_this._isSender) {\n var mimetype = file.type.split('/')[0];\n\n switch (mimetype) {\n case 'image':\n _this._getImagePreview(file).then(function (preview) {\n _this._metadata.preview = preview;\n _this._content = file;\n resolve();\n });\n\n break;\n\n default:\n _this._content = file;\n resolve();\n break;\n } // if too big lets store as File and asArray Buffer\n // if (file.size > _this.arraybufferSizeLimit) {\n\n /* } else {\r\n let reader = new FileReader();\r\n reader.onload = function(theFile) {\r\n log.log('[FileHypertyResource.init] file loaded ', theFile);\r\n _this._content = theFile.target.result;\r\n resolve();\r\n }\r\n reader.readAsArrayBuffer(file);\r\n }*/\n\n } else {\n _this._content = file.content;\n if (file.preview) _this._metadata.preview = file.preview;\n resolve();\n }\n });\n }\n }, {\n key: \"_getImagePreview\",\n value: function _getImagePreview(image) {\n var reader = new FileReader();\n return new Promise(function (resolve, reject) {\n ImageTools.resize(image, {\n width: 100,\n // maximum width\n height: 100 // maximum height\n\n }, function (blob, didItResize) {\n // didItResize will be true if it managed to resize it, otherwise false (and will return the original file as 'blob')\n if (didItResize) {\n reader.readAsDataURL(blob);\n\n reader.onload = function (theImage) {\n resolve(theImage.target.result);\n };\n } else {\n FileHypertyResource_log.warn('[FileHypertyResource._getImagePreview] unable to create image preview from original image ');\n resolve(undefined);\n }\n });\n });\n }\n }, {\n key: \"toMessage\",\n\n /**\r\n * Share file as a data object child of a data object parent\r\n *\r\n * @param {string} children Data Object Parent children name where the file is shared\r\n */\n\n /* share(children) {\r\n let _this = this;\r\n \r\n return new Promise(function(resolve, reject) {\r\n //to be improved and adapted\r\n \r\n if (!_this._isSender) return reject('[FileHypertyResource.share] Observers can not share files');\r\n \r\n let file2share = _this._metadata;\r\n file2share.type = _this._type;\r\n \r\n _this._parent.addChild(children, file2share).then(function(dataObjectChild) {\r\n log.log('[FileHypertyResource.share] object child: ', dataObjectChild);\r\n \r\n let sharedFile = dataObjectChild.data;\r\n \r\n resolve(sharedFile);\r\n \r\n }).catch(function(reason) {\r\n log.error('Reason:', reason);\r\n reject(reason);\r\n });\r\n \r\n });\r\n \r\n }*/\n\n /**\r\n * Returns file content optimised to be displayed in a message line\r\n *\r\n * @param {string} children Data Object Parent children name where the file is shared\r\n */\n value: function toMessage() {//TODO: to be implemented. It should return HTML with img attribute as a thumbnail plus the name.\n }\n }, {\n key: \"name\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.name;\n }\n }, {\n key: \"preview\",\n get: function get() {\n var _this = this;\n\n return _this._metadata.preview;\n }\n }]);\n\n return FileHypertyResource;\n}(hyperty_resource_HypertyResource);\n\n/* harmony default export */ var hyperty_resource_FileHypertyResource = (FileHypertyResource_FileHypertyResource);\n// CONCATENATED MODULE: ./src/hyperty-resource/HypertyResourceFactory.js\nfunction HypertyResourceFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction HypertyResourceFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyResourceFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyResourceFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyResourceFactory_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* The Hyperty Resource Data Model is used to model resouces handled by Hyperties and Data Objects including chat messages, files, real time human audio and video..\r\n*\r\n*/\n\n\nvar HypertyResourceFactory_HypertyResourceFactory =\n/*#__PURE__*/\nfunction () {\n /**\r\n * HypertyResourceFactory constructor\r\n *\r\n */\n function HypertyResourceFactory() {\n HypertyResourceFactory_classCallCheck(this, HypertyResourceFactory);\n }\n\n HypertyResourceFactory_createClass(HypertyResourceFactory, [{\n key: \"createHypertyResource\",\n value: function createHypertyResource(isSender, type, metadata) {\n var newHypertyResource;\n\n switch (type) {\n case 'file':\n newHypertyResource = new hyperty_resource_FileHypertyResource(isSender, metadata);\n break;\n\n default:\n throw new Error('[HypertyResourceFactory.createHypertyResource] not supported type: ', type);\n break;\n }\n\n return newHypertyResource;\n }\n }, {\n key: \"createHypertyResourceWithContent\",\n value: function createHypertyResourceWithContent(isSender, type, content, metadata) {\n var newHypertyResource;\n return new Promise(function (resolve) {\n switch (type) {\n case 'file':\n newHypertyResource = new hyperty_resource_FileHypertyResource(isSender, metadata);\n break;\n\n default:\n reject();\n break;\n }\n\n newHypertyResource.init(content).then(function () {\n return newHypertyResource.save(); // skip save?\n }).then(function () {\n resolve(newHypertyResource);\n });\n });\n }\n }]);\n\n return HypertyResourceFactory;\n}();\n\n/* harmony default export */ var hyperty_resource_HypertyResourceFactory = (HypertyResourceFactory_HypertyResourceFactory);\n// CONCATENATED MODULE: ./src/syncher/DataObject.js\nfunction DataObject_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObject_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObject_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObject_typeof(obj); }\n\nfunction DataObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObject_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar DataObject_log = loglevel[\"getLogger\"]('DataObject');\n\n\n\n\n\n/**\r\n * Main extension class for observers and reporters, with common properties and methods.\r\n * Children management is common for observers and reporters.\r\n */\n\nvar DataObject_DataObject =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _version: number\r\n _owner: HypertyURL\r\n _url: ObjectURL\r\n _schema: Schema\r\n _bus: MiniBus\r\n _status: on | paused\r\n _syncObj: SyncData\r\n _children: { id: DataObjectChild }\r\n _childrenListener: [MsgListener]\r\n ----event handlers----\r\n _onAddChildHandler: (event) => void\r\n */\n\n /**\r\n * @ignore\r\n * Should not be used directly by Hyperties. It's called by the Syncher create or subscribe method's\r\n */\n function DataObject(input) {\n DataObject_classCallCheck(this, DataObject);\n\n var _this = this;\n\n function throwMandatoryParmMissingError(par) {\n throw '[DataObject] ' + par + ' mandatory parameter is missing';\n }\n\n input.syncher ? _this._syncher = input.syncher : throwMandatoryParmMissingError('syncher');\n input.url ? _this._url = input.url : throwMandatoryParmMissingError('url');\n input.created ? _this._created = input.created : throwMandatoryParmMissingError('created');\n input.reporter ? _this._reporter = input.reporter : throwMandatoryParmMissingError('reporter');\n input.runtime ? _this._runtime = input.runtime : throwMandatoryParmMissingError('runtime');\n input.schema ? _this._schema = input.schema : throwMandatoryParmMissingError('schema');\n input.name ? _this._name = input.name : throwMandatoryParmMissingError('name');\n _this._status = input.status;\n\n if (input.data) {\n _this._syncObj = new ProxyObject(input.data);\n } else {\n _this._syncObj = new ProxyObject({});\n }\n\n _this._childrens = input.childrens; //TODO: For Further Study\n\n _this._mutual = input.mutual;\n _this._version = 0;\n _this._childId = 1;\n _this._childrenListener; //bus listener for children\n\n _this._onAddChildrenHandler; //Hyperty side handlers to process child objects created by remote Hyperties\n\n _this._resumed = input.resume;\n\n if (input.resume) {\n _this._version = input.version;\n }\n\n _this._owner = input.syncher._owner;\n _this._bus = input.syncher._bus;\n if (input.description) _this._description = input.description;\n if (input.tags) _this._tags = input.tags;\n if (input.resources) _this._resources = input.resources;\n if (input.observerStorage) _this._observerStorage = input.observerStorage;\n if (input.publicObservation) _this._publicObservation = input.publicObservation;\n _this._metadata = Object.assign(input); // console.log('[DataObject] mutual ', _this._metadata.mutual);\n\n if (!input.hasOwnProperty('resume') || input.hasOwnProperty('resume') && !input.resume) {\n _this._metadata.lastModified = _this._metadata.created;\n }\n\n delete _this._metadata.data;\n delete _this._metadata.syncher;\n delete _this._metadata.authorise;\n _this._hypertyResourceFactory = new hyperty_resource_HypertyResourceFactory();\n _this._childrenObjects = {};\n _this._sharedChilds = []; //childObjects that were not sent yet to Reporters\n\n if (input.backup && _this._childrens) {\n var lastHeartbeat = input.hasOwnProperty('childrenObjects') && input.childrenObjects.hasOwnProperty('heartbeat') ? input.childrenObjects.heartbeat : 0;\n _this._heartBeat = new syncher_HeartBeat(_this._bus, _this._owner, _this._syncher._runtimeUrl, this, 15, lastHeartbeat);\n if (_this._resumed) _this._heartBeat.start(true, _this.metadata.isReporter);else _this._heartBeat.start(false, _this.metadata.isReporter);\n }\n }\n\n DataObject_createClass(DataObject, [{\n key: \"_getLastChildId\",\n value: function _getLastChildId() {\n var _this = this;\n\n var childIdInt = 0;\n var childIdString = _this._owner + '#' + childIdInt;\n Object.keys(_this._childrens).filter(function (key) {\n if (_this._childrens[key].childId > childIdString) {\n childIdString = _this._childrens[key].childId;\n }\n });\n return childIdInt = Number(childIdString.split('#')[1]);\n }\n }, {\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this2 = this;\n\n var _this = this;\n\n var childBaseURL = _this._url + '/children/';\n DataObject_log.log('[Data Object - AllocateListeners] - ', _this._childrens);\n\n if (_this._childrens) {\n // _this._childrens.forEach((child) => {\n var childURL = childBaseURL;\n\n var listener = _this._bus.addListener(childURL, function (msg) {\n //ignore msg sent by himself\n if (msg.from !== _this2._owner) {\n DataObject_log.log('DataObject-Children-RCV: ', msg);\n\n switch (msg.type) {\n case 'create':\n _this._onChildCreate(msg);\n\n break;\n\n case 'delete':\n DataObject_log.log(msg);\n break;\n\n default:\n _this._changeChildren(msg);\n\n break;\n }\n } // });\n\n\n _this._childrenListener = listener;\n });\n }\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n if (_this._childrenListener) {\n _this._childrenListener.remove();\n\n Object.keys(_this._childrenObjects).forEach(function (child) {\n /* if (children === 'resources') {\r\n Object.keys(_this._childrenObjects[children]).forEach((child) => {\r\n _this._childrenObjects[children][child]._releaseListeners();\r\n });\r\n } else {*/\n _this._childrenObjects[child]._releaseListeners(); // }\n\n });\n }\n }\n /**\r\n * Sync Data Object Observer with last version of Data Object Reporter. Useful for Resumes\r\n */\n\n }, {\n key: \"sync\",\n value: function sync() {\n var _this3 = this;\n\n var _this = this;\n\n DataObject_log.info('[DataObject.sync] synchronising ');\n return new Promise(function (resolve, reject) {\n var criteria = {};\n if (_this3.metadata.backupRevision) criteria.backupRevision = _this3.metadata.backupRevision;\n\n _this._syncher.read(_this._metadata.url, criteria).then(function (value) {\n DataObject_log.info('[DataObject.sync] value to sync: ', value);\n Object.assign(_this.data, Object(utils[\"i\" /* deepClone */])(value.data));\n _this._version = value.version;\n _this._metadata.lastModified = value.lastModified; //TODO: check first if there are new childrenObjects to avoid overhead\n\n if (value.childrenObjects) {\n _this.resumeChildrens(value.childrenObjects);\n\n _this._storeChildrens();\n\n resolve(true);\n } else resolve(true);\n /*if (value.version != _this._version) {\r\n log.info('[DataObject.sync] updating existing data: ', _this.data);\r\n Object.assign(_this.data || {}, deepClone(value.data));\r\n _this._metadata = deepClone(value);\r\n delete _this._metadata.data;\r\n _this._version = value.version;\r\n } else {\r\n log.info('[DataObject.sync] existing data is updated: ', value);\r\n }*/\n\n }).catch(function (reason) {\n DataObject_log.info('[DataObject.sync] sync failed: ', reason);\n resolve(false);\n });\n });\n }\n /**\r\n *\r\n */\n\n }, {\n key: \"resumeChildrens\",\n value: function resumeChildrens(childrens) {\n var _this4 = this;\n\n var _this = this;\n\n var childIdString = this._owner.split('/')[3] + '#' + this._childId; //setup childrens data from subscription\n // Object.keys(childrens).forEach((childrenResource) => {\n // let children = childrens[childrenResource];\n\n\n var children = childrens; //_this._childrenObjects[childrenResource] = {};\n\n Object.keys(children).forEach(function (childId) {\n var newChild = false;\n /* if (!_this._childrenObjects.hasOwnProperty(childrenResource))\r\n _this._childrenObjects[childrenResource] = {};*/\n // check if it is the last heartbeat\n\n if (childId === 'heartbeat') {// _this._heartBeat.onNewHeartbeat(children[childId].value);\n // _this._heartBeat.start(true);\n } else if (children[childId].hasOwnProperty('value') && children[childId].value.resourceType && !_this._childrenObjects.hasOwnProperty(childId)) {\n _this._childrenObjects[childId] = _this._resumeHypertyResource(children[childId]);\n newChild = true;\n } else if (!_this._childrenObjects.hasOwnProperty(childId)) {\n _this._childrenObjects[childId] = _this._resumeChild(children[childId]);\n DataObject_log.log('[DataObject.resumeChildrens] new DataObjectChild: ', _this._childrenObjects[childId]);\n newChild = true;\n }\n\n if (newChild && childId > childIdString) {\n childIdString = childId;\n DataObject_log.log('[DataObjectReporter.resumeChildrens] - resuming: ', _this4._childrenObjects[childId]);\n }\n }); // });\n\n this._childId = Number(childIdString.split('#')[1]);\n }\n }, {\n key: \"_resumeChild\",\n value: function _resumeChild(input) {\n var _this = this;\n\n var childInput = input.value;\n childInput.parentObject = _this;\n childInput.parent = _this._url;\n var child = new syncher_DataObjectChild(childInput);\n child.identity = input.identity;\n var event = {\n type: 'create',\n from: child.reporter,\n url: child.parent,\n value: child.data,\n childId: child.url,\n identity: child.identity,\n child: child\n };\n\n if (child.resourceType) {\n event.resource = child;\n }\n\n if (_this._onAddChildrenHandler) _this._onAddChildrenHandler(event);\n return child;\n }\n }, {\n key: \"_resumeHypertyResource\",\n value: function _resumeHypertyResource(input) {\n var _this = this;\n\n var childInput = input.value;\n childInput.parentObject = _this;\n childInput.parent = _this._url;\n\n var hypertyResource = _this._hypertyResourceFactory.createHypertyResource(false, childInput.resourceType, childInput);\n\n hypertyResource.identity = input.identity;\n var event = {\n type: 'create',\n from: hypertyResource.reporter,\n url: hypertyResource.parent,\n value: hypertyResource.data,\n childId: hypertyResource.url,\n identity: hypertyResource.identity,\n child: hypertyResource\n };\n\n if (hypertyResource.resourceType) {\n event.resource = hypertyResource;\n }\n\n if (_this._onAddChildrenHandler) _this._onAddChildrenHandler(event);\n return hypertyResource;\n }\n /**\r\n * All Metadata about the Data Object\r\n * @type {Object} -\r\n */\n\n }, {\n key: \"pause\",\n\n /**\r\n * @ignore\r\n */\n value: function pause() {\n //TODO: this feature needs more analise\n throw 'Not implemented';\n }\n /**\r\n * @ignore\r\n */\n\n }, {\n key: \"resume\",\n value: function resume() {\n //TODO: this feature needs more analise\n throw 'Not implemented';\n }\n /**\r\n * @ignore\r\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n //TODO: should remove the subscription and send message unsubscribe?\n throw 'Not implemented';\n }\n /**\r\n * Create and add a DataObjectChild to a children collection.\r\n * @param {JSON} initialData - Initial data of the child\r\n * @param {MessageBodyIdentity} identity - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\r\n * @param {SyncChildMetadata} input - (optional) All additional metadata about the DataObjectChild.\r\n * @return {Promise} - Return Promise to a new DataObjectChild.\r\n */\n\n }, {\n key: \"addChild\",\n value: function addChild(initialData, identity, input) {\n var _this = this;\n\n var newChild; //returns promise, in the future, the API may change to asynchronous call\n\n return new Promise(function (resolve) {\n var msgChildPath = _this._url + '/children/';\n\n var childInput = _this._getChildInput(input);\n\n childInput.data = initialData; // childInput.children = children;\n\n newChild = new syncher_DataObjectChild(childInput);\n if (identity) newChild.identity = identity;\n newChild.share();\n console.log('[DataObject.addChild] added ', newChild);\n newChild.onChange(function (event) {\n _this._onChange(event, {\n path: msgChildPath,\n childId: childInput.url\n });\n }); // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[childInput.url] = newChild;\n resolve(newChild);\n });\n }\n }, {\n key: \"_deleteChildrens\",\n value: function _deleteChildrens() {\n var _this = this;\n\n var deletePromises = [];\n return new Promise(function (resolve) {\n if (_this.childrens) {\n DataObject_log.log('[DataObject.deleteChildrens]', _this.childrens);\n var child;\n\n for (child in _this.childrens) {\n // let child;\n\n /* if (children === 'resources') {\r\n for (child in _this.childrens[children]) {\r\n let childObj = _this.childrens[children][child];\r\n log.log('[DataObject._deleteChildrens] child',childObj);\r\n if (childObj.metadata.hasOwnProperty('resourceType'))\r\n deletePromises.push(_this.childrens[children][child].delete());\r\n }\r\n } else {*/\n var childObj = _this.childrens[child];\n DataObject_log.log('[DataObject._deleteChildrens] child', childObj);\n if (childObj.metadata.hasOwnProperty('resourceType')) deletePromises.push(_this.childrens[child].delete());\n } // }\n\n\n DataObject_log.log('[DataObject._deleteChildrens] promises ', deletePromises);\n\n if (deletePromises.length > 0) {\n Promise.all(deletePromises).then(function () {\n resolve('[DataObject._deleteChildrens] done');\n });\n } else resolve('[DataObject._deleteChildrens] nothing to delete');\n }\n });\n }\n }, {\n key: \"_getChildInput\",\n value: function _getChildInput(input) {\n var _this = this;\n\n var childInput = Object.assign({}, input);\n _this._childId++; //removing domain from childId to avoid backup issues with '.'\n\n childInput.url = _this._owner.split('/')[3] + '#' + _this._childId;\n childInput.parentObject = _this;\n childInput.reporter = _this._owner;\n childInput.created = new Date().toISOString();\n childInput.runtime = _this._syncher._runtimeUrl;\n childInput.p2pHandler = _this._syncher._p2pHandler;\n childInput.p2pRequester = _this._syncher._p2pRequester;\n childInput.schema = _this._schema;\n childInput.parent = _this.url;\n childInput.mutual = _this.metadata.mutual; // console.log('[DataObject._getChildInput] mutual ', childInput.mutual);\n\n return childInput;\n }\n }, {\n key: \"addHypertyResource\",\n value: function addHypertyResource(type, resource, identity, input) {\n var _this = this; //returns promise, in the future, the API may change to asynchronous call\n\n\n return new Promise(function (resolve) {\n var hypertyResource;\n var msgChildPath = _this._url + '/children/';\n\n var childInput = _this._getChildInput(input); // childInput.children = children;\n\n\n _this._hypertyResourceFactory.createHypertyResourceWithContent(true, type, resource, childInput).then(function (resource) {\n hypertyResource = resource;\n if (identity) hypertyResource.identity = identity;\n hypertyResource.share();\n DataObject_log.log('[DataObject.addHypertyResource] added ', hypertyResource);\n hypertyResource.onChange(function (event) {\n _this._onChange(event, {\n path: msgChildPath,\n childId: hypertyResource.childId\n });\n }); // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[hypertyResource.childId] = hypertyResource;\n resolve(hypertyResource);\n });\n });\n }\n /**\r\n * Setup the callback to process create and delete of childrens.\r\n * @param {function(event: MsgEvent)} callback\r\n * TODO: add childrenId to support different handlers per children\r\n */\n\n }, {\n key: \"onAddChild\",\n value: function onAddChild(callback) {\n this._onAddChildrenHandler = callback;\n } //FLOW-IN: message received from a remote DataObject -> addChild\n\n }, {\n key: \"_onChildCreate\",\n value: function _onChildCreate(msg) {\n var _this = this; // console.log('[DataObject._onChildCreate] receivedBy ' + _this._owner + ' : ', msg);\n // if this is an heartbeat msg foward it to heatbeat handler\n\n\n if (msg.body.resource === 'heartbeat') {\n console.log('[DataObject._onChildCreate] new heartbeat received ' + msg.body.value);\n\n this._heartBeat.onNewHeartbeat(msg.body.value);\n } else {\n console.log('[DataObject._onChildCreate] new child receivedBy ' + _this._owner + ' : ', msg);\n var response = {\n from: msg.to,\n to: msg.from,\n type: 'response',\n id: msg.id,\n body: {\n code: 100\n }\n };\n\n _this._bus.postMessage(response);\n\n if (msg.body.value.resourceType) {\n _this._onHypertyResourceAdded(msg);\n } else _this._onChildAdded(msg);\n }\n }\n }, {\n key: \"_onChildAdded\",\n value: function _onChildAdded(msg) {\n var _this = this;\n\n var childInput = Object(utils[\"i\" /* deepClone */])(msg.body.value);\n childInput.parentObject = _this; // let children = childInput.children;\n\n var newChild = new syncher_DataObjectChild(childInput);\n newChild.identity = msg.body.identity; // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[childInput.url] = newChild;\n if (msg.to === _this.metadata.url) newChild.store();\n\n _this._hypertyEvt(msg, newChild);\n }\n }, {\n key: \"_onHypertyResourceAdded\",\n value: function _onHypertyResourceAdded(msg) {\n var _this = this;\n\n var input = msg.body.value;\n var hypertyResource; // let children = input.children;\n\n input.parentObject = _this;\n hypertyResource = _this._hypertyResourceFactory.createHypertyResource(false, input.resourceType, input);\n hypertyResource.identity = msg.body.identity; // if (!_this._childrenObjects.hasOwnProperty(children)) _this._childrenObjects[children] = {};\n\n _this._childrenObjects[hypertyResource.childId] = hypertyResource;\n\n _this._hypertyEvt(msg, hypertyResource); // locally store messages that are directly sent to the hyperty\n // ie to sync with messages sent when offline\n\n\n if (msg.to === _this.metadata.url) hypertyResource.store();\n }\n }, {\n key: \"_hypertyEvt\",\n value: function _hypertyEvt(msg, child) {\n var _this = this;\n\n var event = {\n type: msg.type,\n from: msg.from,\n url: msg.to,\n value: child.data,\n childId: child.url,\n identity: msg.body.identity,\n child: child\n };\n\n if (child.resourceType) {\n event.resource = child;\n }\n\n if (_this._onAddChildrenHandler) _this._onAddChildrenHandler(event);\n } //send delta messages to subscriptions\n\n }, {\n key: \"_onChange\",\n value: function _onChange(event, childInfo) {\n var _this = this;\n\n _this._metadata.lastModified = new Date().toISOString();\n _this._version++;\n\n if (_this._status === 'live') {\n //FLOW-OUT: this message will be sent directly to a resource changes address: MessageBus\n var changeMsg = {\n type: 'update',\n from: _this._url,\n to: _this._url + '/changes',\n body: {\n version: _this._version,\n source: _this._owner,\n attribute: event.field,\n lastModified: _this._metadata.lastModified\n }\n };\n DataObject_log.log('[DataObject - _onChange] - ', event, childInfo, changeMsg);\n\n if (event.oType === ObjectType.OBJECT) {\n if (event.cType !== ChangeType.REMOVE) {\n changeMsg.body.value = Object(utils[\"i\" /* deepClone */])(event.data);\n }\n } else {\n changeMsg.body.attributeType = event.oType;\n changeMsg.body.value = event.data;\n\n if (event.cType !== ChangeType.UPDATE) {\n changeMsg.body.operation = event.cType;\n }\n } //childInfo must have (path, childId)\n\n\n if (childInfo) {\n changeMsg.to = childInfo.path;\n changeMsg.body.resource = childInfo.childId;\n } //TODO: For Further Study\n\n\n if (!_this.data._mutual) changeMsg.body.mutual = _this._mutual;\n\n _this._bus.postMessage(changeMsg);\n }\n } //FLOW-IN: delta message received from a remote DataObjectReporter or DataObjectChild when changing data\n\n }, {\n key: \"_changeObject\",\n value: function _changeObject(syncObj, msg) {\n var _this = this; //TODO: update version ?\n //how to handle an incorrect version ? Example: receive a version 3 when the observer is in version 1, where is the version 2 ?\n //will we need to confirm the reception ?\n\n\n if (_this._version + 1 <= msg.body.version) {\n _this._version = msg.body.version;\n var path = msg.body.attribute;\n var value;\n if (DataObject_typeof(msg.body.value) === 'object') value = Object(utils[\"i\" /* deepClone */])(msg.body.value);else value = msg.body.value;\n var findResult = syncObj.findBefore(path);\n\n if (msg.body.lastModified) {\n _this._metadata.lastModified = msg.body.lastModified;\n } else {\n _this._metadata.lastModified = new Date().toISOString();\n }\n\n if (msg.body.attributeType === ObjectType.ARRAY) {\n if (msg.body.operation === ChangeType.ADD) {\n var arr = findResult.obj;\n var index = findResult.last;\n Array.prototype.splice.apply(arr, [index, 0].concat(value));\n } else if (msg.body.operation === ChangeType.REMOVE) {\n var _arr = findResult.obj;\n var _index = findResult.last;\n\n _arr.splice(_index, value);\n } else {\n findResult.obj[findResult.last] = value; // UPDATE\n }\n } else {\n if (msg.body.hasOwnProperty('value')) {\n findResult.obj[findResult.last] = value; // UPDATE or ADD\n } else {\n delete findResult.obj[findResult.last]; // REMOVE\n }\n }\n } else {\n //TODO: how to handle unsynchronized versions?\n DataObject_log.log('UNSYNCHRONIZED VERSION: (data => ' + _this._version + ', msg => ' + msg.body.version + ')');\n }\n } //FLOW-IN: message received from a remote DataObjectChild when changing data\n\n }, {\n key: \"_changeChildren\",\n value: function _changeChildren(msg) {\n var _this = this;\n\n var dividedURL = Object(utils[\"k\" /* divideURL */])(msg.to);\n var identity = dividedURL.identity; // const resource = identity ? identity.substring(identity.lastIndexOf('/') + 1) : undefined;\n\n var childId = msg.body.resource;\n var children = _this._childrenObjects[childId];\n DataObject_log.log('Change children: ', _this._owner, msg, resource);\n\n if (children) {\n _this._changeObject(children._syncObj, msg);\n } else {\n DataObject_log.warn('No children found for: ', childId);\n }\n }\n }, {\n key: \"metadata\",\n get: function get() {\n return this._metadata;\n }\n /**\r\n * Object URL of reporter or observer\r\n * @type {ObjectURL}\r\n */\n\n }, {\n key: \"url\",\n get: function get() {\n return this._url;\n }\n /**\r\n * Object schema URL (this field is not yet stable, and is subsject to change)\r\n * @type {SchemaURL}\r\n */\n\n }, {\n key: \"schema\",\n get: function get() {\n return this._schema;\n }\n /**\r\n * Status of the reporter or observer connection (this field is not yet stable, and is subsject to change)\r\n * @type {Status} - Enum of: on | paused\r\n */\n\n }, {\n key: \"status\",\n get: function get() {\n return this._status;\n }\n /**\r\n * Data structure to be synchronized.\r\n * @type {JSON} - JSON structure that should follow the defined schema, if any.\r\n */\n\n }, {\n key: \"data\",\n get: function get() {\n return this._syncObj.data;\n }\n /**\r\n * All created children's since the subscription, doesn't contain all children's since reporter creation.\r\n * @type {Object}\r\n */\n\n }, {\n key: \"childrens\",\n get: function get() {\n return this._childrenObjects;\n }\n }]);\n\n return DataObject;\n}();\n\n/* harmony default export */ var syncher_DataObject = (DataObject_DataObject);\n// CONCATENATED MODULE: ./src/syncher/DataObjectReporter.js\nfunction DataObjectReporter_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObjectReporter_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectReporter_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObjectReporter_typeof(obj); }\n\nfunction DataObjectReporter_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectReporter_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectReporter_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectReporter_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectReporter_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction DataObjectReporter_possibleConstructorReturn(self, call) { if (call && (DataObjectReporter_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return DataObjectReporter_assertThisInitialized(self); }\n\nfunction DataObjectReporter_get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { DataObjectReporter_get = Reflect.get; } else { DataObjectReporter_get = function _get(target, property, receiver) { var base = DataObjectReporter_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return DataObjectReporter_get(target, property, receiver || target); }\n\nfunction DataObjectReporter_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DataObjectReporter_getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction DataObjectReporter_getPrototypeOf(o) { DataObjectReporter_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataObjectReporter_getPrototypeOf(o); }\n\nfunction DataObjectReporter_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DataObjectReporter_setPrototypeOf(subClass, superClass); }\n\nfunction DataObjectReporter_setPrototypeOf(o, p) { DataObjectReporter_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataObjectReporter_setPrototypeOf(o, p); }\n\nfunction DataObjectReporter_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar DataObjectReporter_log = loglevel[\"getLogger\"]('DataObjectReporter');\n\n\n/**\r\n * The class returned from the Syncher create call.\r\n * To be used as a reporter point, changes will be submited to DataObjectObserver instances.\r\n */\n\nvar DataObjectReporter_DataObjectReporter =\n/*#__PURE__*/\nfunction (_DataObject) {\n DataObjectReporter_inherits(DataObjectReporter, _DataObject);\n\n /* private\r\n _subscriptions: \r\n ----event handlers----\r\n _onSubscriptionHandler: (event) => void\r\n _onResponseHandler: (event) => void\r\n _onReadHandler: (event) => void\r\n */\n\n /**\r\n * @ignore\r\n * Should not be used directly by Hyperties. It's called by the Syncher.create method\r\n */\n //constructor(syncher, url, created, reporter, runtime, schema, name, initialStatus, initialData, childrens, mutual = true, resumed = false, description, tags, resources, observerStorage, publicObservation) {\n function DataObjectReporter(input) {\n var _this2;\n\n DataObjectReporter_classCallCheck(this, DataObjectReporter);\n\n _this2 = DataObjectReporter_possibleConstructorReturn(this, DataObjectReporter_getPrototypeOf(DataObjectReporter).call(this, input));\n\n var _this = DataObjectReporter_assertThisInitialized(DataObjectReporter_assertThisInitialized(_this2));\n\n _this._subscriptions = {};\n\n _this._syncObj.observe(function (event) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] ' + _this.url + ' publish change: ', event);\n\n _this._onChange(event);\n });\n\n _this._allocateListeners();\n\n _this.invitations = []; // array of promises with pending invitations\n\n _this._childrenSizeThreshold = 50000; // to be used when replying to sync requests to ensure each response msg is not too large\n\n return _this2;\n }\n\n DataObjectReporter_createClass(DataObjectReporter, [{\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n DataObjectReporter_get(DataObjectReporter_getPrototypeOf(DataObjectReporter.prototype), \"_allocateListeners\", this).call(this);\n\n var _this = this;\n\n _this._objectListener = _this._bus.addListener(_this._url, function (msg) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] listener ' + _this._url + ' Received: ', msg);\n\n switch (msg.type) {\n case 'response':\n _this._onResponse(msg);\n\n break;\n\n case 'read':\n _this._onRead(msg);\n\n break;\n\n case 'execute':\n _this._onExecute(msg);\n\n break;\n\n case 'create':\n _this._onChildCreate(msg);\n\n break;\n // to create child objects that were sent whenn offline\n }\n });\n _this._runtimeStatusListener = _this._bus.addListener(_this._syncher._runtimeUrl + '/status', function (evt) {\n console.log('[Syncher.DataObjectReporter] runtime status event received ' + evt);\n\n if (evt.body && evt.body.resource && evt.body.resource === _this._url && evt.body.value && evt.body.value.backupRevision) {\n // broadcast backupRevision update\n _this.data.backupRevision = evt.body.value.backupRevision;\n console.log('[Syncher.DataObjectReporter] DO updated with backup revision ' + _this.data.backupRevision);\n }\n });\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n DataObjectReporter_get(DataObjectReporter_getPrototypeOf(DataObjectReporter.prototype), \"_releaseListeners\", this).call(this);\n\n var _this = this;\n\n _this._objectListener.remove();\n }\n /**\r\n * Send invitations (create messages) to hyperties, observers list.\r\n * @param {HypertyURL[]} observers List of Hyperty URL's\r\n */\n\n }, {\n key: \"inviteObservers\",\n value: function inviteObservers(observers, p2p) {\n var _this = this; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onCreate\n // TODO: remove value and add resources? should similar to 1st create\n\n\n var toInvite = observers; // let invitePromises = [];\n\n /* observers.forEach((observer)=> {\r\n if (!_this.invitations[observer]) {\r\n toInvite.push(observer);\r\n _this.invitations[observer] = observer;\r\n }\r\n });*/\n\n if (toInvite.length > 0) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] InviteObservers ', toInvite, _this._metadata);\n toInvite.forEach(function (observer) {\n var invitation = new Promise(function (resolve, reject) {\n var inviteMsg = {\n type: 'create',\n from: _this._syncher._owner,\n to: _this._syncher._subURL,\n body: {\n resume: false,\n resource: _this._url,\n schema: _this._schema,\n value: _this._metadata,\n authorise: [observer]\n }\n };\n if (p2p) inviteMsg.body.p2p = p2p;\n if (!_this.data.mutual) inviteMsg.body.mutual = _this.data.mutual;\n\n _this._bus.postMessage(inviteMsg, function (reply) {\n DataObjectReporter_log.log('[Syncher.DataObjectReporter] Invitation reply ', reply);\n var result = {\n invited: observer,\n code: reply.body && reply.body.code ? reply.body.code : 500,\n desc: reply.body && reply.body.desc ? reply.body.desc : 'Unknown'\n };\n if (result.code < 300) resolve(result);\n /* else if (result.code >= 300) {\r\n if (_this.metadata.offline) {\r\n resolve(_this._processOfflineInvitation(inviteMsg));\r\n }*/\n else reject(result); // } \n });\n });\n\n _this.invitations.push(invitation);\n }); // return(invitePromises);\n }\n }\n /**\r\n * Release and delete object data\r\n */\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n if (_this._heartBeat) _this._heartBeat.stop();\n\n _this._deleteChildrens().then(function (result) {\n DataObjectReporter_log.log(result); //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onDelete\n\n var deleteMsg = {\n type: 'delete',\n from: _this._owner,\n to: _this._syncher._subURL,\n body: {\n resource: _this._url\n }\n };\n\n _this._bus.postMessage(deleteMsg, function (reply) {\n DataObjectReporter_log.log('DataObjectReporter-DELETE: ', reply);\n\n if (reply.body.code === 200) {\n _this._releaseListeners();\n\n delete _this._syncher._reporters[_this._url]; //_this._syncObj.unobserve();\n\n _this._syncObj = {};\n }\n });\n });\n }\n /**\r\n * Subscriptions requested and accepted to this reporter\r\n * @type {Object}\r\n */\n\n }, {\n key: \"onSubscription\",\n\n /**\r\n * Setup the callback to process subscribe and unsubscribe notifications\r\n * @param {function(event: MsgEvent)} callback function to receive events\r\n */\n value: function onSubscription(callback) {\n this._onSubscriptionHandler = callback;\n }\n /**\r\n * Setup the callback to process response notifications of the create's\r\n * @param {function(event: MsgEvent)} callback function to receive events\r\n */\n\n }, {\n key: \"onResponse\",\n value: function onResponse(callback) {\n this._onResponseHandler = callback;\n }\n /**\r\n * Setup the callback to process read notifications\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onRead\",\n value: function onRead(callback) {\n this._onReadHandler = callback;\n }\n /**\r\n * Setup the callback to process execute notifications\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onExecute\",\n value: function onExecute(callback) {\n this._onExecuteHandler = callback;\n } //FLOW-IN: message received from parent Syncher -> _onForward\n\n }, {\n key: \"_onForward\",\n value: function _onForward(msg) {\n var _this = this;\n\n DataObjectReporter_log.log('DataObjectReporter-RCV: ', msg);\n\n switch (msg.body.type) {\n case 'subscribe':\n _this._onSubscribe(msg);\n\n break;\n\n case 'unsubscribe':\n _this._onUnSubscribe(msg);\n\n break;\n }\n } //FLOW-IN: message received from this -> _onForward: emitted by a remote Syncher -> subscribe\n\n }, {\n key: \"_onSubscribe\",\n value: function _onSubscribe(msg) {\n var _this = this;\n\n var hypertyUrl = msg.body.from;\n var dividedURL = Object(utils[\"k\" /* divideURL */])(hypertyUrl);\n var domain = dividedURL.domain;\n var mutual = true;\n if (msg.body.hasOwnProperty('mutual') && !msg.body.mutual) mutual = false;\n console.log('[DataObjectReporter._onSubscribe]', msg, domain, dividedURL);\n var event = {\n type: msg.body.type,\n url: hypertyUrl,\n domain: domain,\n identity: msg.body.identity,\n nutual: mutual,\n accept: function accept() {\n //create new subscription\n var sub = {\n url: hypertyUrl,\n status: 'live'\n };\n _this._subscriptions[hypertyUrl] = sub;\n\n if (_this.metadata.subscriptions) {\n _this.metadata.subscriptions.push(sub.url);\n }\n\n var msgValue = Object(utils[\"i\" /* deepClone */])(_this._metadata);\n msgValue.data = Object(utils[\"i\" /* deepClone */])(_this.data);\n msgValue.version = _this._version; //process and send childrens data\n // let childrenValues = {};\n //\n // if (_this._childrenObjects) {\n // Object.keys(_this._childrenObjects).forEach((childrenId) => {\n // let childrenData = _this._childrenObjects[childrenId];\n // childrenValues[childrenId] = deepClone(childrenData);\n // });\n // msgValue.childrenObjects = childrenValues;\n // }\n\n var sendMsg = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n schema: _this._schema,\n value: msgValue\n }\n }; //TODO: For Further Study\n\n if (msg.body.hasOwnProperty('mutual') && !msg.body.mutual) {\n sendMsg.body.mutual = msg.body.mutual; // TODO: remove?\n\n _this.data.mutual = false;\n }\n\n if (_this._heartBeat) {\n sendMsg.body.value.childrenObjects = {};\n sendMsg.body.value.childrenObjects.heartbeat = _this._heartBeat.heartbeat;\n }\n\n console.log('[DataObjectReporter._onSubscribe.accept] sending response: ', sendMsg); //send ok response message\n\n _this._bus.postMessage(sendMsg);\n\n return sub;\n },\n reject: function reject(reason) {\n //send reject response message\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 403,\n desc: reason\n }\n });\n }\n };\n\n if (_this._onSubscriptionHandler) {\n DataObjectReporter_log.log('SUBSCRIPTION-EVENT: ', event);\n\n _this._onSubscriptionHandler(event);\n }\n } //FLOW-IN: message received from this -> _onForward: emitted by a remote DataObjectObserver -> unsubscribe\n\n }, {\n key: \"_onUnSubscribe\",\n value: function _onUnSubscribe(msg) {\n var _this = this;\n\n var hypertyUrl = msg.body.from;\n var dividedURL = Object(utils[\"k\" /* divideURL */])(hypertyUrl);\n var domain = dividedURL.domain;\n DataObjectReporter_log.log('[DataObjectReporter._onUnSubscribe]', msg, domain, dividedURL); //let sub = _this._subscriptions[hypertyUrl];\n\n delete _this._subscriptions[hypertyUrl];\n delete _this.invitations[hypertyUrl];\n var event = {\n type: msg.body.type,\n url: hypertyUrl,\n domain: domain,\n identity: msg.body.identity\n }; // TODO: check if the _onSubscriptionHandler it is the same of the subscriptions???\n\n if (_this._onSubscriptionHandler) {\n DataObjectReporter_log.log('UN-SUBSCRIPTION-EVENT: ', event);\n\n _this._onSubscriptionHandler(event);\n }\n } //FLOW-IN: message received from ReporterURL address: emited by a remote Syncher -> _onRemoteCreate -> event.ack\n\n }, {\n key: \"_onResponse\",\n value: function _onResponse(msg) {\n var _this = this;\n\n var event = {\n type: msg.type,\n url: msg.from,\n code: msg.body.code\n };\n\n if (_this._onResponseHandler) {\n DataObjectReporter_log.log('RESPONSE-EVENT: ', event);\n\n _this._onResponseHandler(event);\n }\n } //FLOW-IN: message received from ReporterURL address: emited by a remote Syncher -> read\n\n }, {\n key: \"_onRead\",\n value: function _onRead(msg) {\n var _this = this;\n\n var childrensSize = JSON.stringify(_this.childrensJSON).length;\n var largeObject = childrensSize > _this._childrenSizeThreshold ? true : false;\n var event = {\n type: msg.type,\n url: msg.from,\n accept: function accept() {\n if (largeObject) _this._syncReplyForLargeData(msg);else _this._syncReply(msg);\n },\n reject: function reject(reason) {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 401,\n desc: reason\n }\n });\n }\n }; // if the requester is an authorised observer, the data object is responded otherwise an event is triggered\n\n var subscriptions = [];\n\n if (_this.metadata.subscriptions) {\n subscriptions = _this.metadata.subscriptions;\n } else if (_this._subscriptions) {\n subscriptions = Object.keys(_this._subscriptions).map(function (key) {\n return _this._subscriptions[key].url;\n });\n }\n\n if (subscriptions.indexOf(msg.from) != -1) {\n if (largeObject) _this._syncReplyForLargeData(msg);else _this._syncReply(msg);\n } else if (_this._onReadHandler) {\n DataObjectReporter_log.log('READ-EVENT: ', event);\n\n _this._onReadHandler(event);\n }\n }\n }, {\n key: \"_syncReply\",\n value: function _syncReply(msg) {\n var _this = this;\n\n var objectValue = Object(utils[\"i\" /* deepClone */])(_this.metadata);\n objectValue.data = Object(utils[\"i\" /* deepClone */])(_this.data);\n objectValue.childrenObjects = Object(utils[\"i\" /* deepClone */])(_this.childrensJSON);\n objectValue.version = _this._version;\n var response = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200,\n value: objectValue\n }\n };\n\n _this._bus.postMessage(response);\n } // This function is only used if the data object to be synched has childrenOjects too large\n\n }, {\n key: \"_syncReplyForLargeData\",\n value: function _syncReplyForLargeData(msg) {\n //set attribute with number of spllited messages\n var _this = this; // lets set the initial message with no childObjects\n\n\n var objectValue = Object(utils[\"i\" /* deepClone */])(_this.metadata);\n objectValue.data = Object(utils[\"i\" /* deepClone */])(_this.data);\n objectValue.version = _this._version;\n delete objectValue.childrenObjects;\n var children;\n var values = []; // array of values to be sent in separated responses\n\n var childrenValue = {}; // value to be used in each response\n\n for (child in _this._childrenObjects) {\n // let child;\n childrenValue[child] = {}; // for (child in _this._childrenObjects[children]) {\n\n if (JSON.stringify(childrenValue).length > _this._childrenSizeThreshold) {\n //childrenValue big enough to be sent in a response message\n values.push(childrenValue); // childrenValue = {};\n // childrenValue[child] = {};\n }\n\n childrenValue[child] = {};\n childrenValue[child].value = _this._childrenObjects[child].metadata;\n childrenValue[child].identity = _this._childrenObjects[child].identity; // }\n }\n\n values.push(childrenValue);\n objectValue.responses = values.length + 1; //number of responses to be sent\n\n var initialResponse = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 100,\n value: objectValue\n }\n };\n\n _this._bus.postMessage(initialResponse);\n\n values.forEach(function (value) {\n var response = Object(utils[\"i\" /* deepClone */])(initialResponse);\n response.body.value = value;\n response.body.value.responses = objectValue.responses;\n setTimeout(function () {\n _this._bus.postMessage(response);\n }, 50); // should put a timeout?\n });\n } // Execute request received\n\n }, {\n key: \"_onExecute\",\n value: function _onExecute(msg) {\n var _this = this;\n\n if (!msg.body.method) throw '[DataObjectReporter._onExecute] method missing ', msg;\n var response = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n };\n var event = {\n type: msg.type,\n url: msg.from,\n method: msg.body.method,\n params: msg.body.params,\n accept: function accept() {\n _this._bus.postMessage(response);\n },\n reject: function reject(reason) {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 401,\n desc: reason\n }\n });\n }\n };\n\n if (_this._onExecuteHandler) {\n DataObjectReporter_log.log('[DataObjectReporter] EXECUTE-EVENT: ', event);\n\n _this._onExecuteHandler(event);\n }\n }\n }, {\n key: \"subscriptions\",\n get: function get() {\n return this._subscriptions;\n }\n }, {\n key: \"childrensJSON\",\n get: function get() {\n var _this = this;\n\n var childrens = {}; // let children;\n // for (children in _this._childrenObjects) {\n\n var child; // childrens[children] = {};\n\n for (child in _this._childrenObjects) {\n childrens[child] = {};\n childrens[child].value = _this._childrenObjects[child].metadata;\n childrens[child].identity = _this._childrenObjects[child].identity;\n } // }\n\n\n return childrens;\n }\n }]);\n\n return DataObjectReporter;\n}(syncher_DataObject\n/* implements SyncStatus */\n);\n\n/* harmony default export */ var syncher_DataObjectReporter = (DataObjectReporter_DataObjectReporter);\n// CONCATENATED MODULE: ./src/syncher/DataObjectObserver.js\nfunction DataObjectObserver_typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { DataObjectObserver_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectObserver_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return DataObjectObserver_typeof(obj); }\n\nfunction DataObjectObserver_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataObjectObserver_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataObjectObserver_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataObjectObserver_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataObjectObserver_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction DataObjectObserver_possibleConstructorReturn(self, call) { if (call && (DataObjectObserver_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return DataObjectObserver_assertThisInitialized(self); }\n\nfunction DataObjectObserver_get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { DataObjectObserver_get = Reflect.get; } else { DataObjectObserver_get = function _get(target, property, receiver) { var base = DataObjectObserver_superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return DataObjectObserver_get(target, property, receiver || target); }\n\nfunction DataObjectObserver_superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = DataObjectObserver_getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction DataObjectObserver_getPrototypeOf(o) { DataObjectObserver_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataObjectObserver_getPrototypeOf(o); }\n\nfunction DataObjectObserver_inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DataObjectObserver_setPrototypeOf(subClass, superClass); }\n\nfunction DataObjectObserver_setPrototypeOf(o, p) { DataObjectObserver_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataObjectObserver_setPrototypeOf(o, p); }\n\nfunction DataObjectObserver_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar DataObjectObserver_log = loglevel[\"getLogger\"]('DataObjectObserver');\n\n\nvar FilterType = {\n ANY: 'any',\n START: 'start',\n EXACT: 'exact'\n};\n/**\r\n * The class returned from the Syncher subscribe call.\r\n * To be used as an observation point from a DataObjectReporter change.\r\n */\n\nvar DataObjectObserver_DataObjectObserver =\n/*#__PURE__*/\nfunction (_DataObject) {\n DataObjectObserver_inherits(DataObjectObserver, _DataObject);\n\n /* private\r\n _changeListener: MsgListener\r\n ----event handlers----\r\n _filters: {: {type: , callback: } }\r\n */\n\n /**\r\n * @ignore\r\n * Should not be used directly by Hyperties. It's called by the Syncher.subscribe method\r\n */\n //TODO: For Further Study\n function DataObjectObserver(input) {\n var _this2;\n\n DataObjectObserver_classCallCheck(this, DataObjectObserver);\n\n //todo: check why\n //input.initialData = input.initialData.data;\n _this2 = DataObjectObserver_possibleConstructorReturn(this, DataObjectObserver_getPrototypeOf(DataObjectObserver).call(this, input));\n\n var _this = DataObjectObserver_assertThisInitialized(DataObjectObserver_assertThisInitialized(_this2));\n\n _this._version = input.version;\n _this._filters = {};\n\n _this._syncObj.observe(function (event) {\n _this._onFilter(event);\n });\n\n _this._allocateListeners();\n\n return _this2;\n }\n /**\r\n * Sync Data Object Observer with last version of Data Object Reporter. Useful for Resumes\r\n */\n\n\n DataObjectObserver_createClass(DataObjectObserver, [{\n key: \"sync\",\n value: function sync() {\n var _this = this;\n\n DataObjectObserver_log.info('[DataObjectObserver_sync] synchronising ');\n return new Promise(function (resolve, reject) {\n var criteria = {}; // if (this.metadata.backupRevision) criteria.backupRevision = this.metadata.backupRevision;\n\n _this._syncher.read(_this._metadata.url, criteria).then(function (value) {\n DataObjectObserver_log.info('[DataObjectObserver_sync] value to sync: ', value);\n Object.assign(_this.data, Object(utils[\"i\" /* deepClone */])(value.data));\n _this._version = value.version;\n _this._metadata.lastModified = value.lastModified; //TODO: check first if there are new childrenObjects to avoid overhead\n\n if (value.childrenObjects) {\n _this.resumeChildrens(value.childrenObjects);\n\n _this._storeChildrens();\n\n resolve(true);\n } else resolve(true);\n /*if (value.version != _this._version) {\r\n log.info('[DataObjectObserver_sync] updating existing data: ', _this.data);\r\n Object.assign(_this.data || {}, deepClone(value.data));\r\n _this._metadata = deepClone(value);\r\n delete _this._metadata.data;\r\n _this._version = value.version;\r\n } else {\r\n log.info('[DataObjectObserver_sync] existing data is updated: ', value);\r\n }*/\n\n }).catch(function (reason) {\n DataObjectObserver_log.info('[DataObjectObserver_sync] sync failed: ', reason);\n resolve(false);\n });\n });\n }\n }, {\n key: \"_storeChildrens\",\n value: function _storeChildrens() {\n var _this = this;\n\n var childrens = {}; //TODO: to be sent to HypertyResourceStorage when ready to handle Chat Messages\n\n Object.keys(_this._childrenObjects).forEach(function (childId) {\n var children = _this._childrenObjects; // childrens[childrenResource] = {};\n // Object.keys(children).forEach((childId) => {\n\n childrens[childId] = {};\n childrens[childId].value = children[childId].metadata;\n childrens[childId].identity = children[childId].identity; // });\n });\n var msg = {\n from: _this._owner,\n to: _this._syncher._subURL,\n type: 'create',\n body: {\n resource: _this._url,\n attribute: 'childrenObjects',\n value: childrens\n }\n };\n\n _this._bus.postMessage(msg);\n }\n }, {\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n DataObjectObserver_get(DataObjectObserver_getPrototypeOf(DataObjectObserver.prototype), \"_allocateListeners\", this).call(this);\n\n var _this = this;\n\n _this._changeListener = _this._bus.addListener(_this._url + '/changes', function (msg) {\n if (msg.type === 'update') {\n DataObjectObserver_log.log('DataObjectObserver-' + _this._url + '-RCV: ', msg);\n\n _this._changeObject(_this._syncObj, msg);\n }\n });\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n DataObjectObserver_get(DataObjectObserver_getPrototypeOf(DataObjectObserver.prototype), \"_releaseListeners\", this).call(this);\n\n var _this = this;\n\n _this._changeListener.remove();\n }\n /**\r\n * Release and delete object data\r\n */\n\n }, {\n key: \"delete\",\n value: function _delete() {\n var _this = this;\n\n if (_this._heartBeat) _this._heartBeat.stop();\n\n _this._deleteChildrens().then(function () {\n _this.unsubscribe();\n\n _this._releaseListeners();\n\n delete _this._syncher._observers[_this._url];\n });\n }\n /**\r\n * Release and delete object data\r\n */\n\n }, {\n key: \"unsubscribe\",\n value: function unsubscribe() {\n var _this = this; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onLocalUnSubscribe\n\n\n var unSubscribeMsg = {\n type: 'unsubscribe',\n from: _this._owner,\n to: _this._syncher._subURL,\n body: {\n resource: _this._url\n }\n };\n\n _this._bus.postMessage(unSubscribeMsg, function (reply) {\n DataObjectObserver_log.log('DataObjectObserver-UNSUBSCRIBE: ', reply);\n\n if (reply.body.code === 200) {\n _this._releaseListeners();\n\n delete _this._syncher._observers[_this._url];\n }\n });\n }\n /**\r\n * Register the change listeners sent by the reporter\r\n * @param {string} filter - Filter that identifies the field (separated dot path). Accepts * at the end for a more unrestricted filtering.\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onChange\",\n value: function onChange(filter, callback) {\n var key = filter;\n var filterObj = {\n type: FilterType.EXACT,\n callback: callback\n };\n var idx = filter.indexOf('*');\n\n if (idx === filter.length - 1) {\n if (idx === 0) {\n filterObj.type = FilterType.ANY;\n } else {\n filterObj.type = FilterType.START;\n key = filter.substr(0, filter.length - 1);\n }\n }\n\n this._filters[key] = filterObj;\n }\n }, {\n key: \"_onFilter\",\n value: function _onFilter(event) {\n var _this = this;\n\n Object.keys(_this._filters).forEach(function (key) {\n var filter = _this._filters[key];\n\n if (filter.type === FilterType.ANY) {\n //match anything\n filter.callback(event);\n } else if (filter.type === FilterType.START) {\n //if starts with filter...\n if (event.field.indexOf(key) === 0) {\n filter.callback(event);\n }\n } else if (filter.type === FilterType.EXACT) {\n //exact match\n if (event.field === key) {\n filter.callback(event);\n }\n }\n });\n }\n }, {\n key: \"onDisconnected\",\n value: function onDisconnected(callback) {\n var _this3 = this;\n\n return new Promise(function (resolve, reject) {\n _this3._subscribeRegistration().then(function () {\n _this3._onDisconnected = callback;\n resolve();\n }).catch(function (err) {\n return reject(err);\n });\n });\n }\n }, {\n key: \"_subscribeRegistration\",\n value: function _subscribeRegistration() {\n var _this4 = this;\n\n var msg = {\n type: 'subscribe',\n from: this._owner,\n to: this._syncher._runtimeUrl + '/subscriptions',\n body: {\n resources: [this._url + '/registration']\n }\n };\n return new Promise(function (resolve, reject) {\n _this4._bus.postMessage(msg, function (reply) {\n DataObjectObserver_log.log(\"[DataObjectObserver._subscribeRegistration] \".concat(_this4._url, \" rcved reply \"), reply);\n\n if (reply.body.code === 200) {\n _this4._generateListener(_this4._url + '/registration');\n\n resolve();\n } else {\n DataObjectObserver_log.error('Error subscribing registration status for ', _this4._url);\n reject('Error subscribing registration status for ' + _this4._url);\n }\n });\n });\n }\n }, {\n key: \"_generateListener\",\n value: function _generateListener(notificationURL) {\n var _this = this;\n\n _this._bus.addListener(notificationURL, function (msg) {\n DataObjectObserver_log.log(\"[DataObjectObserver.registrationNotification] \".concat(_this._url, \": \"), msg);\n\n if (msg.body.value && msg.body.value === 'disconnected' && _this._onDisconnected) {\n DataObjectObserver_log.log(\"[DataObjectObserver] \".concat(_this._url, \": was disconnected \"), msg);\n\n _this._onDisconnected();\n }\n });\n }\n /**\r\n * Requests the reporter to execute a method on the data object\r\n * @param {string} method - Name of the function to be executed.\r\n * @param {array} params - array of parameters for the requested function\r\n * @return {promise}\r\n */\n\n }, {\n key: \"execute\",\n value: function execute(method, params) {\n var _this5 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var msg = {\n type: 'execute',\n from: _this5._owner,\n to: _this._url,\n body: {\n method: method,\n params: params\n }\n };\n\n _this._bus.postMessage(msg, function (reply) {\n DataObjectObserver_log.log(\"[DataObjectObserver.execute] \".concat(_this._url, \" rcved reply \"), reply);\n\n if (reply.body.code === 200) {\n resolve();\n } else {\n DataObjectObserver_log.warn(\"[DataObjectObserver.execute] execution of method \".concat(method, \" was reject by reporter\"));\n reject(\"[DataObjectObserver.execute] execution of method \".concat(method, \" was reject by reporter\"));\n }\n });\n });\n }\n }]);\n\n return DataObjectObserver;\n}(syncher_DataObject\n/* implements SyncStatus */\n);\n\n/* harmony default export */ var syncher_DataObjectObserver = (DataObjectObserver_DataObjectObserver);\n// CONCATENATED MODULE: ./src/syncher/DataProvisional.js\nfunction DataProvisional_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction DataProvisional_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction DataProvisional_createClass(Constructor, protoProps, staticProps) { if (protoProps) DataProvisional_defineProperties(Constructor.prototype, protoProps); if (staticProps) DataProvisional_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * @access private\r\n * This class is responsible for collecting delta changes in remote objects, before the response of subscription reach the observer.\r\n * It's used in Syncher -> subscribe. The flow is defined as:\r\n * 1. (observer) --subscribe--\x3e (reporter)\r\n * 2. (observer) <--delta updates-- (reporter)\r\n * 3. (observer) <--subscribe response-- (reporter)\r\n * This means that there could be delta updates transferred before the subscription confirmation.\r\n * Since there is no DataObjectObserver before the ubscription confirmation, there should be some other object collecting the updates.\r\n * Provisional data is applied to the DataObjectObserver after confirmation. Or discarded if there is no confirmation.\r\n */\n// Log System\n\nvar DataProvisional_log = loglevel[\"getLogger\"]('DataProvisional');\n\nvar DataProvisional =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _childrenListeners: [MsgListener]\r\n _listener: MsgListener\r\n _changes: []\r\n */\n function DataProvisional(owner, url, bus, children) {\n DataProvisional_classCallCheck(this, DataProvisional);\n\n var _this = this;\n\n _this._owner = owner;\n _this._url = url;\n _this._bus = bus;\n _this._children = children;\n _this._changes = [];\n\n _this._allocateListeners();\n }\n\n DataProvisional_createClass(DataProvisional, [{\n key: \"_allocateListeners\",\n value: function _allocateListeners() {\n var _this = this;\n\n _this._listener = _this._bus.addListener(_this._url, function (msg) {\n DataProvisional_log.log('DataProvisional-' + _this._url + '-RCV: ', msg);\n\n _this._changes.push(msg);\n });\n /*\r\n _this._childrenListeners = [];\r\n if (_this._children) {\r\n let childBaseURL = url + '/children/';\r\n _this._children.forEach((child) => {\r\n let childURL = childBaseURL + child;\r\n let listener = _this._bus.addListener(childURL, (msg) => {\r\n //ignore msg sent by himself\r\n if (msg.from !== owner) {\r\n log.log(msg);\r\n }\r\n });\r\n _this._childrenListeners.push(listener);\r\n });\r\n }*/\n }\n }, {\n key: \"_releaseListeners\",\n value: function _releaseListeners() {\n var _this = this;\n\n _this._listener.remove();\n /*_this._childrenListeners.forEach((listener) => {\r\n listener.remove();\r\n });*/\n\n }\n }, {\n key: \"apply\",\n value: function apply(observer) {\n var _this = this;\n\n _this._changes.forEach(function (change) {\n observer._changeObject(observer._syncObj, change);\n });\n }\n }, {\n key: \"children\",\n get: function get() {\n return this._children;\n }\n }]);\n\n return DataProvisional;\n}();\n\n/* harmony default export */ var syncher_DataProvisional = (DataProvisional);\n// CONCATENATED MODULE: ./src/syncher/Syncher.js\nfunction Syncher_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Syncher_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Syncher_createClass(Constructor, protoProps, staticProps) { if (protoProps) Syncher_defineProperties(Constructor.prototype, protoProps); if (staticProps) Syncher_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar Syncher_log = loglevel[\"getLogger\"]('Syncher');\n\n\n\n\n/**\r\n* The main class for the syncher package.\r\n* The Syncher is a singleton class per Hyperty/URL and it is the owner of all created Data Sync Objects according to the Reporter - Observer pattern.\r\n* Main functionality is to create reporters and to subscribe to existing ones.\r\n*/\n\nvar Syncher_Syncher =\n/*#__PURE__*/\nfunction () {\n /* private\r\n _owner: URL\r\n _bus: MiniBus\r\n _subURL: URL\r\n _reporters: \r\n _observers: \r\n _provisionals: \r\n ----event handlers----\r\n _onNotificationHandler: (event) => void\r\n _onResume: (event) => void\r\n */\n\n /**\r\n * Constructor that should be used by the Hyperty owner\r\n * @param {HypertyURL} owner - Hyperty URL owner. An URL allocated by the runtime that uniquely identifies the Hyperty.\r\n * @param {MiniBus} bus - An instance of the MiniBus provided in the sandbox. When an object (Reporter or Observed) is created, the SyncherManager will add a listener in the MiniBus to receive/send Messages of that object.\r\n * @param {JSON} config - Configuration data. The only required field for now is the runtimeURL.\r\n */\n function Syncher(owner, bus, config) {\n Syncher_classCallCheck(this, Syncher);\n\n var _this = this;\n\n _this._owner = owner;\n _this._bus = bus;\n _this._subURL = config.runtimeURL + '/sm';\n _this._runtimeUrl = config.runtimeURL;\n _this._p2pHandler = config.p2pHandler;\n _this._p2pRequester = config.p2pRequester;\n _this._reporters = {};\n _this._observers = {};\n _this._provisionals = {};\n bus.addListener(owner, function (msg) {\n //ignore msg sent by himself\n if (msg.from !== owner) {\n Syncher_log.info('[Syncher] Syncher-RCV: ', msg, _this);\n\n switch (msg.type) {\n case 'forward':\n _this._onForward(msg);\n\n break;\n\n case 'create':\n _this._onRemoteCreate(msg);\n\n break;\n\n case 'delete':\n _this._onRemoteDelete(msg);\n\n break;\n\n case 'execute':\n _this._onExecute(msg);\n\n break;\n }\n }\n });\n }\n /**\r\n * The owner of the Syncher and all created reporters.\r\n * @type {HypertyURL}\r\n */\n\n\n Syncher_createClass(Syncher, [{\n key: \"create\",\n\n /**\r\n * Request a DataObjectReporter creation. The URL will be be requested by the allocation mechanism.\r\n * @param {SchemaURL} schema - Hyperty Catalogue URL address that can be used to retrieve the JSON-Schema describing the Data Object schema\r\n * @param {HypertyURL[]} observers - List of hyperties that are pre-authorized for subscription\r\n * @param {JSON} initialData - Initial data of the reporter\r\n * @param {boolean} store - (Optional) if true, object will be stored by the runtime\r\n * @param {boolean} p2p - (Optional) if true, data synchronisation stream will use p2p connection as much as possible\r\n * @param {string} name - (Optional) the name of the dataobject\r\n * @param {MessageBodyIdentity} identity - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\r\n * @param {SyncMetadata} input - (optional) all metadata required to sunc the Data Object.\r\n * @return {Promise} Return Promise to a new Reporter. The reporter can be accepted or rejected by the PEP\r\n */\n value: function create(schema, observers, initialData) {\n var store = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var p2p = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n var name = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'no name';\n var identity = arguments.length > 6 ? arguments[6] : undefined;\n var input = arguments.length > 7 ? arguments[7] : undefined;\n if (!schema) throw Error('[Syncher - Create] - You need specify the data object schema');\n if (!observers) throw Error('[Syncher - Create] -The observers should be defined');\n\n var _this = this;\n\n input = input || {};\n var createInput = Object.assign({}, input);\n createInput.p2p = p2p;\n createInput.store = store;\n createInput.schema = schema;\n createInput.authorise = observers;\n createInput.p2pHandler = _this._p2pHandler;\n createInput.p2pRequester = _this._p2pRequester;\n initialData ? createInput.data = Object(utils[\"i\" /* deepClone */])(initialData) : createInput.data = {};\n createInput.name = name.length === 0 ? 'no name' : name;\n createInput.reporter = input.hasOwnProperty('reporter') && typeof input.reporter !== 'boolean' ? input.reporter : _this._owner;\n createInput.resume = false;\n\n if (input) {\n createInput.mutual = input.hasOwnProperty('mutual') ? input.mutual : false;\n createInput.name = input.hasOwnProperty('name') ? input.name : createInput.name;\n } else {\n createInput.mutual = false;\n }\n\n if (input.hasOwnProperty('reuseURL')) {\n createInput.resource = input.reuseURL;\n }\n\n if (identity) {\n createInput.identity = identity;\n } //Object.assign(createInput, {resume: false});\n //debugger;\n // console.log('[syncher - create] - create Reporter - createInput: ', createInput);\n\n\n return _this._create(createInput);\n }\n /**\r\n * Request a DataObjectReporter creation. The URL will be be requested by the allocation mechanism.\r\n * @param {Object} criteria - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\r\n * @return {Promise[]} Return a promise with a list of DataObjectReporter to be resumed;\r\n */\n\n }, {\n key: \"resumeReporters\",\n value: function resumeReporters(criteria) {\n var _this = this;\n\n Syncher_log.log('[syncher - create] - resume Reporter - criteria: ', criteria);\n Object.assign(criteria, {\n resume: true\n });\n return _this._resumeCreate(criteria);\n }\n /**\r\n * Request a subscription to an existent reporter object.\r\n * @param {SchemaURL} schema - Hyperty Catalogue URL address that can be used to retrieve the JSON-Schema describing the Data Object schema\r\n * @param {ObjectURL} objURL - Address of the existent reporter object to be observed\r\n * @param {Boolean} [store=false] - Save the subscription on the Syncher Manager for further resume (Default is false)\r\n * @param {Boolean} [p2p=false] - Info about if should use p2p connection (Default is false)\r\n * @param {Boolean} [mutual=true] - Info about if messages of this object should be encrypted (Default is true)\r\n * @param {MessageBodyIdentity} identity - (optional) identity data to be added to identity the user reporter. To be used for legacy identities.\r\n * @return {Promise} Return Promise to a new observer. It's associated with the reporter.\r\n */\n\n }, {\n key: \"subscribe\",\n value: function subscribe(input) {\n /* let _this = this;\r\n let criteria = {};\r\n criteria.p2p = p2p;\r\n criteria.store = store;\r\n criteria.schema = schema;\r\n criteria.domain_subscription = domain_subscription;\r\n criteria.resource = objURL;\r\n if (identity) { criteria.identity = identity; }\r\n //TODO: For Further Study\r\n criteria.mutual = mutual;\r\n log.log('[syncher - subscribe] - subscribe criteria: ', criteria);\r\n Object.assign(criteria, {resume: false});*/\n return this._subscribe(input);\n }\n /**\r\n * Request a subscription to an existent reporter object.\r\n * @param {criteria} criteria - Information to discovery the observer object\r\n * @return {Promise} Return Promise to a new observer. It's associated with the reporter.\r\n */\n\n }, {\n key: \"resumeObservers\",\n value: function resumeObservers(criteria) {\n var _this = this;\n\n var _criteria = criteria || {};\n\n Object.assign(_criteria, {\n resume: true\n });\n return _this._resumeSubscribe(_criteria);\n }\n /**\r\n * Request a read action on the reporter object\r\n * @param {ObjectURL} objURL - URL of the reporter object to be read\r\n * @return {Promise} Return Promise to last available data of the reporter\r\n */\n\n }, {\n key: \"read\",\n value: function read(objURL, criteria) {\n var _this = this;\n\n console.log('[Syncher.read] ', objURL);\n return new Promise(function (resolve, reject) {\n // in case the object is synched in a remote storage, lets sync with it\n\n /* if (_this._observers[objURL] && _this._observers[objURL].metadata.hasOwnProperty('backup') && _this._observers[objURL].metadata.backup) {\r\n \r\n let readMsg = {\r\n type: 'read', from: _this._owner, to: _this._subURL, \r\n body: { resource: objURL}\r\n };\r\n \r\n if (criteria) readMsg.body.criteria = criteria;\r\n \r\n let callback = (reply) => {\r\n return _this._readCallBack(reply, resolve, reject);\r\n };\r\n \r\n _this._bus.postMessage(readMsg, callback, false);\r\n \r\n } else {*/\n _this._readReporter(objURL).then(function (result) {\n resolve(result);\n }); // }\n\n });\n }\n }, {\n key: \"_readCallBack\",\n value: function _readCallBack(reply, resolve, reject) {\n var _this = this;\n\n console.log('[Syncher.read] reply: ', reply);\n var childrens = {};\n var value = {};\n var n = 0;\n\n if (reply.body.code < 300) {\n if (!reply.body.value.hasOwnProperty('responses')) {\n _this._bus.removeResponseListener(reply.from, reply.id);\n\n resolve(reply.body.value);\n } else {\n //data object is sent in separated messages\n if (n === 0) {\n //initial response without childrens\n value = reply.body.value;\n ++n;\n } else {\n // received response contains childrens\n delete reply.body.value.responses;\n var children;\n\n for (children in reply.body.value) {\n if (!childrens.hasOwnProperty(children)) childrens[children] = {};\n Object.assign(childrens[children], reply.body.value[children]);\n }\n\n ++n;\n\n if (n === value.responses) {\n value.childrenObjects = childrens;\n delete value.responses;\n\n _this._bus.removeResponseListener(reply.from, reply.id);\n\n resolve(value);\n }\n }\n }\n } else {\n reject(reply.body.desc);\n }\n }\n }, {\n key: \"_readReporter\",\n value: function _readReporter(objURL) {\n var _this = this; //FLOW-OUT: this message will be sent directly to reporter object (maybe there is no listener available, so it will be resolved with MessageBus -> resolve)\n //will reach the remote object in DataObjectReporter -> _onRead\n\n\n var readMsg = {\n type: 'read',\n from: _this._owner,\n to: objURL\n };\n return new Promise(function (resolve, reject) {\n _this._bus.postMessage(readMsg, function (reply) {\n return _this._readCallBack(reply, resolve, reject);\n }, false);\n });\n }\n /**\r\n * Setup the callback to process create and delete events of remove Reporter objects.\r\n * This is releated to the messagens sent by create to the observers Hyperty array.\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onNotification\",\n value: function onNotification(callback) {\n this._onNotificationHandler = callback;\n }\n /**\r\n * Setup the callback to process close events from the runtime.\r\n * @param {function(event: MsgEvent)} callback\r\n */\n\n }, {\n key: \"onClose\",\n value: function onClose(callback) {\n this._onClose = callback;\n }\n }, {\n key: \"_create\",\n value: function _create(input) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var reporterInput = Object.assign({}, input);\n var resume = input.resume;\n reporterInput.created = new Date().toISOString();\n reporterInput.runtime = _this._runtimeUrl;\n var requestValue = Object(utils[\"i\" /* deepClone */])(reporterInput);\n delete requestValue.p2p;\n delete requestValue.store;\n delete requestValue.observers;\n delete requestValue.identity; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onCreate\n //debugger;\n\n var requestMsg = {\n type: 'create',\n from: _this._owner,\n to: _this._subURL,\n body: {\n resume: resume,\n value: requestValue\n }\n };\n requestMsg.body.schema = reporterInput.schema;\n if (reporterInput.p2p) requestMsg.body.p2p = reporterInput.p2p;\n if (reporterInput.store) requestMsg.body.store = reporterInput.store;\n if (reporterInput.identity) requestMsg.body.identity = reporterInput.identity;\n console.log('[syncher._create]: ', reporterInput, requestMsg); //request create to the allocation system. Can be rejected by the PolicyEngine.\n\n _this._bus.postMessage(requestMsg, function (reply) {\n Syncher_log.log('[syncher - create] - create-response: ', reply);\n\n if (reply.body.code === 200) {\n //reporter creation accepted\n reporterInput.url = reply.body.resource;\n /* if (reply.body.p2pHandler) reporterInput.p2pHandler = reply.body.p2pHandler;\r\n if (reply.body.p2pRequester) reporterInput.p2pRequester = reply.body.p2pRequester;*/\n\n reporterInput.status = 'live'; // pch: do we ned this?\n\n reporterInput.syncher = _this;\n reporterInput.childrens = reply.body.childrenResources;\n var newObj = _this._reporters[reporterInput.url];\n\n if (!newObj) {\n newObj = new syncher_DataObjectReporter(reporterInput);\n _this._reporters[reporterInput.url] = newObj;\n }\n\n newObj.inviteObservers(input.authorise, input.p2p);\n resolve(newObj);\n } else {\n //reporter creation rejected\n reject(reply.body.desc);\n }\n });\n });\n }\n }, {\n key: \"_resumeCreate\",\n value: function _resumeCreate(criteria) {\n var _this2 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var resume = criteria.resume; //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onCreate\n\n var requestMsg = {\n type: 'create',\n from: _this._owner,\n to: _this._subURL,\n body: {\n resume: resume\n }\n };\n Syncher_log.log('[syncher - create]: ', criteria, requestMsg);\n\n if (criteria) {\n requestMsg.body.value = criteria;\n\n if (criteria.hasOwnProperty('reporter')) {\n requestMsg.body.value.reporter = criteria.reporter;\n } else {\n requestMsg.body.value.reporter = _this._owner;\n }\n }\n\n if (criteria.p2p) requestMsg.body.p2p = criteria.p2p;\n if (criteria.store) requestMsg.body.store = criteria.store;\n if (criteria.observers) requestMsg.body.authorise = criteria.observers;\n if (criteria.identity) requestMsg.body.identity = criteria.identity;\n Syncher_log.log('[syncher._resumeCreate] - resume message: ', requestMsg); //debugger;\n //request create to the allocation system. Can be rejected by the PolicyEngine.\n\n _this._bus.postMessage(requestMsg, function (reply) {\n Syncher_log.log('[syncher._resumeCreate] - create-resumed-response: ', reply);\n\n if (reply.body.code === 200) {\n //debugger;\n var listOfReporters = reply.body.value;\n\n for (var index in listOfReporters) {\n var dataObject = listOfReporters[index]; //reporter creation accepted\n\n dataObject.data = Object(utils[\"i\" /* deepClone */])(dataObject.data) || {};\n\n if (dataObject.childrenObjects) {\n dataObject.childrenObjects = Object(utils[\"i\" /* deepClone */])(dataObject.childrenObjects);\n }\n\n dataObject.mutual = false;\n dataObject.resume = true;\n dataObject.status = 'live'; // pch: do we ned this?\n\n dataObject.syncher = _this;\n Syncher_log.log('[syncher._resumeCreate] - create-resumed-dataObjectReporter', dataObject);\n var newObj = new syncher_DataObjectReporter(dataObject);\n\n if (dataObject.childrenObjects) {\n newObj.resumeChildrens(dataObject.childrenObjects);\n }\n\n _this._reporters[dataObject.url] = newObj;\n }\n\n resolve(_this._reporters);\n if (_this2._onReportersResume) _this2._onReportersResume(_this2._reporters);\n } else if (reply.body.code === 404) {\n resolve({});\n } else {\n //reporter creation rejected\n reject(reply.body.desc);\n }\n });\n });\n }\n }, {\n key: \"_subscribe\",\n value: function _subscribe(input) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onLocalSubscribe\n var subscribeMsg = {\n type: 'subscribe',\n from: _this._owner,\n to: _this._subURL,\n body: input\n }; // Hyperty request to be an Observer\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#hyperty-request-to-be-an-observer\n // Resume Subscriptions for the same Hyperty URL\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-the-same-hyperty-url\n // Resume Subscriptions for a certain user and data schema independently of the Hyperty URL.\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-a-certain-user-and-data-schema-independently-of-the-hyperty-url\n\n /* if (input) {\r\n if (input.hasOwnProperty('p2p')) subscribeMsg.body.p2p = input.p2p;\r\n if (input.hasOwnProperty('store')) subscribeMsg.body.store = input.store;\r\n if (input.hasOwnProperty('schema')) subscribeMsg.body.schema = input.schema;\r\n if (input.hasOwnProperty('identity')) subscribeMsg.body.identity = input.identity;\r\n if (input.hasOwnProperty('resource')) subscribeMsg.body.resource = input.resource;\r\n if (input.hasOwnProperty('domain_subscription')) subscribeMsg.body.domain_subscription = input.domain_subscription;\r\n }\r\n \r\n \r\n subscribeMsg.body.resume = input.resume;\r\n \r\n //TODO: For Further Study\r\n if (input.hasOwnProperty('mutual')) subscribeMsg.body.mutual = input.mutual;*/\n\n Syncher_log.log('[syncher_subscribe] - subscribe message: ', input, subscribeMsg); //request subscription\n //Provisional data is applied to the DataObjectObserver after confirmation. Or discarded if there is no confirmation.\n //for more info see the DataProvisional class documentation.\n\n _this._bus.postMessage(subscribeMsg, function (reply) {\n Syncher_log.log('[syncher] - subscribe-response: ', reply);\n var objURL = reply.body.resource;\n var newProvisional = _this._provisionals[objURL];\n delete _this._provisionals[objURL];\n if (newProvisional) newProvisional._releaseListeners();\n\n if (reply.body.code < 200) {\n Syncher_log.log('[syncher] - new DataProvisional: ', reply.body.childrenResources, objURL);\n newProvisional = new syncher_DataProvisional(_this._owner, objURL, _this._bus, reply.body.childrenResources);\n _this._provisionals[objURL] = newProvisional;\n } else if (reply.body.code === 200) {\n Syncher_log.log('[syncher] - new Data Object Observer: ', reply, _this._provisionals);\n var observerInput = reply.body.value;\n observerInput.syncher = _this;\n observerInput.p2p = input.p2p;\n observerInput.store = input.store;\n observerInput.identity = input.identity;\n observerInput.resume = false; // todo: For Further Study\n\n observerInput.mutual = input.mutual; //observerInput.children = newProvisional.children;\n //TODO: mutual For Further Study\n\n var newObj = _this._observers[objURL];\n\n if (!newObj) {\n newObj = new syncher_DataObjectObserver(observerInput);\n _this._observers[objURL] = newObj;\n } else {\n newObj.sync();\n }\n\n Syncher_log.log('[syncher] - new Data Object Observer already exist: ', newObj);\n resolve(newObj);\n\n if (newProvisional) {\n newProvisional.apply(newObj);\n }\n } else {\n reject(reply.body.desc);\n }\n });\n });\n }\n /*\r\n _processOfflineSubscription(subscription, redirectTo) {\r\n let _this = this;\r\n \r\n let forward = {\r\n from: subscription.from,\r\n type: 'forward',\r\n to: redirectTo,\r\n body: subscription\r\n };\r\n \r\n console.log('[Syncher._processOfflineSubscription] forwading ', forward);\r\n \r\n _this._bus.postMessage(forward);\r\n \r\n let result = {\r\n code: 302,\r\n desc: \"Found \" + redirectTo\r\n };\r\n \r\n return(result);\r\n \r\n }*/\n\n }, {\n key: \"_resumeSubscribe\",\n value: function _resumeSubscribe(criteria) {\n var _this3 = this;\n\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n //FLOW-OUT: this message will be sent to the runtime instance of SyncherManager -> _onLocalSubscribe\n var subscribeMsg = {\n type: 'subscribe',\n from: _this._owner,\n to: _this._subURL,\n body: {}\n }; // Hyperty request to be an Observer\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#hyperty-request-to-be-an-observer\n // Resume Subscriptions for the same Hyperty URL\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-the-same-hyperty-url\n // Resume Subscriptions for a certain user and data schema independently of the Hyperty URL.\n // https://github.com/reTHINK-project/specs/blob/master/messages/data-sync-messages.md#resume-subscriptions-for-a-certain-user-and-data-schema-independently-of-the-hyperty-url\n\n if (criteria) {\n if (criteria.hasOwnProperty('p2p')) subscribeMsg.body.p2p = criteria.p2p;\n if (criteria.hasOwnProperty('store')) subscribeMsg.body.store = criteria.store;\n if (criteria.hasOwnProperty('schema')) subscribeMsg.body.schema = criteria.schema;\n if (criteria.hasOwnProperty('identity')) subscribeMsg.body.identity = criteria.identity;\n if (criteria.hasOwnProperty('resource')) subscribeMsg.body.resource = criteria.resource;\n }\n\n subscribeMsg.body.resume = criteria.resume; //TODO: For Further Study\n\n var mutual = criteria.mutual;\n if (criteria.hasOwnProperty('mutual')) subscribeMsg.body.mutual = mutual;\n console.log('[syncher] - subscribe message: ', criteria, subscribeMsg); //request subscription\n //Provisional data is applied to the DataObjectObserver after confirmation. Or discarded if there is no confirmation.\n //for more info see the DataProvisional class documentation.\n\n _this._bus.postMessage(subscribeMsg, function (reply) {\n console.log('[syncher] - subscribe-resumed-response: ', reply);\n var objURL = reply.body.resource;\n var newProvisional = _this._provisionals[objURL];\n delete _this._provisionals[objURL];\n if (newProvisional) newProvisional._releaseListeners();\n\n if (reply.body.code < 200) {\n // todo: check if this is needed for the resume\n Syncher_log.log('[syncher] - resume new DataProvisional: ', reply, objURL);\n newProvisional = new syncher_DataProvisional(_this._owner, objURL, _this._bus, reply.body.childrenResources);\n _this._provisionals[objURL] = newProvisional;\n } else if (reply.body.code === 200) {\n var listOfObservers = reply.body.value;\n\n for (var index in listOfObservers) {\n var dataObject = listOfObservers[index];\n console.log('[syncher] - Resume Object Observer: ', reply, dataObject, _this._provisionals);\n\n if (dataObject.childrenObjects) {\n dataObject.childrenObjects = Object(utils[\"i\" /* deepClone */])(dataObject.childrenObjects);\n }\n\n dataObject.data = Object(utils[\"i\" /* deepClone */])(dataObject.data) || {};\n dataObject.resume = true;\n dataObject.syncher = _this; //TODO: mutual For Further Study\n\n console.log('[syncher._resumeSubscribe] - create new dataObject: ', dataObject);\n var newObj = new syncher_DataObjectObserver(dataObject);\n\n if (dataObject.childrenObjects) {\n newObj.resumeChildrens(dataObject.childrenObjects);\n }\n\n Syncher_log.log('[syncher._resumeSubscribe] - new dataObject', newObj);\n _this._observers[newObj.url] = newObj;\n\n if (_this._provisionals[newObj.url]) {\n _this._provisionals[newObj.url].apply(newObj);\n } //lets sync with Reporter\n // it was commented to let hyperties decide when to sync\n //newObj.sync();\n\n }\n\n resolve(_this._observers);\n if (_this3._onObserversResume) _this3._onObserversResume(_this._observers);\n } else if (reply.body.code === 404) {\n resolve({});\n } else {\n reject(reply.body.desc);\n }\n });\n });\n } //FLOW-IN: message received from a local runtime ReporterObject -> _onRemoteSubscribe\n\n }, {\n key: \"_onForward\",\n value: function _onForward(msg) {\n var _this = this;\n\n var reporter = _this._reporters[msg.body.to];\n\n reporter._onForward(msg);\n } //FLOW-IN: message received from a remote Syncher -> create (this is actually an invitation to subscribe)\n\n }, {\n key: \"_onRemoteCreate\",\n value: function _onRemoteCreate(msg) {\n var _this = this;\n\n var resource = msg.from.slice(0, -13); //remove \"/subscription\" from the URL\n\n var dividedURL = Object(utils[\"k\" /* divideURL */])(resource);\n var domain = dividedURL.domain;\n var event = {\n type: msg.type,\n from: msg.body.source,\n url: resource,\n domain: domain,\n schema: msg.body.schema,\n value: msg.body.value,\n identity: msg.body.identity,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType\n }\n });\n }\n };\n\n if (_this._onNotificationHandler) {\n Syncher_log.info('[Syncher] NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler(event);\n }\n } //FLOW-IN: message received from a remote DataObjectReporter -> delete\n\n }, {\n key: \"_onRemoteDelete\",\n value: function _onRemoteDelete(msg) {\n var _this = this; //remove \"/subscription\" from the URL\n\n\n var resource = msg.body.resource;\n var object = _this._observers[resource];\n var unsubscribe = {\n from: _this.owner,\n to: _this._subURL,\n id: msg.id,\n type: 'unsubscribe',\n body: {\n resource: msg.body.resource\n }\n };\n\n _this._bus.postMessage(unsubscribe);\n\n delete _this._observers[resource];\n\n if (object) {\n var event = {\n type: msg.type,\n url: resource,\n identity: msg.body.identity,\n ack: function ack(type) {\n var lType = 200;\n\n if (type) {\n lType = type;\n } //TODO: any other different options for the release process, like accept but nor release local?\n\n\n if (lType === 200) {\n object.delete();\n } //send ack response message\n\n\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: lType,\n source: _this._owner\n }\n });\n }\n };\n\n if (_this._onNotificationHandler) {\n Syncher_log.log('NOTIFICATION-EVENT: ', event);\n\n _this._onNotificationHandler(event);\n }\n } else {\n _this._bus.postMessage({\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 404,\n source: _this._owner\n }\n });\n }\n } // close event received from runtime registry\n\n }, {\n key: \"_onExecute\",\n value: function _onExecute(msg) {\n var _this = this;\n\n var reply = {\n id: msg.id,\n type: 'response',\n from: msg.to,\n to: msg.from,\n body: {\n code: 200\n }\n };\n\n if ((msg.from === _this._runtimeUrl + '/registry/' || msg.from === _this._runtimeUrl + '/registry') && msg.body && msg.body.method && msg.body.method === 'close' && _this._onClose) {\n var event = {\n type: 'close',\n ack: function ack(type) {\n if (type) {\n reply.body.code = type;\n } //send ack response message\n\n\n _this._bus.postMessage(reply);\n }\n };\n Syncher_log.info('[Syncher] Close-EVENT: ', event);\n\n _this._onClose(event);\n } else {\n _this._bus.postMessage(reply);\n }\n }\n /**\r\n * Callback system to trigger the resumed reporters\r\n * @param {Function} callback - function callback which will be invoked\r\n * @return {Object} Return one object with all resumed reporters;\r\n */\n\n }, {\n key: \"onReportersResume\",\n value: function onReportersResume(callback) {\n this._onReportersResume = callback;\n }\n /**\r\n * Callback system to trigger the resumed observers\r\n * @param {Function} callback - function callback which will be invoked\r\n * @return {Object} Return one object with all resumed observers;\r\n */\n\n }, {\n key: \"onObserversResume\",\n value: function onObserversResume(callback) {\n this._onObserversResume = callback;\n }\n }, {\n key: \"owner\",\n get: function get() {\n return this._owner;\n }\n /**\r\n * All owned reporters, the ones that were created by a create\r\n * @type {Object}\r\n */\n\n }, {\n key: \"reporters\",\n get: function get() {\n return this._reporters;\n }\n /**\r\n * All owned observers, the ones that were created by a local subscription\r\n * @type {Object}\r\n */\n\n }, {\n key: \"observers\",\n get: function get() {\n return this._observers;\n }\n }]);\n\n return Syncher;\n}();\n\n/* harmony default export */ var syncher_Syncher = __webpack_exports__[\"a\"] = (Syncher_Syncher);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9Qcm94eU9iamVjdC5qcz80ZWViIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9zeW5jaGVyL0RhdGFPYmplY3RDaGlsZC5qcz8yMWUxIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9zeW5jaGVyL0hlYXJ0QmVhdC5qcz9iMTY3Iiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9oeXBlcnR5LXJlc291cmNlL0h5cGVydHlSZXNvdXJjZS5qcz9jYzZjIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy91dGlscy9JbWFnZVRvb2xzLmpzPzFlMDciLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2h5cGVydHktcmVzb3VyY2UvRmlsZUh5cGVydHlSZXNvdXJjZS5qcz81MzZmIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9oeXBlcnR5LXJlc291cmNlL0h5cGVydHlSZXNvdXJjZUZhY3RvcnkuanM/ZjA4MyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3luY2hlci9EYXRhT2JqZWN0LmpzPzlkMDIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvRGF0YU9iamVjdFJlcG9ydGVyLmpzPzIzZmYiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvRGF0YU9iamVjdE9ic2VydmVyLmpzP2M1YzMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvRGF0YVByb3Zpc2lvbmFsLmpzPzQwNDciLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3N5bmNoZXIvU3luY2hlci5qcz8xNmQ4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAncHJveHktb2JzZXJ2ZSc7XHJcbmltcG9ydCB7cGFyc2VBdHRyaWJ1dGVzfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcblxyXG5jb25zdCBvYmplY3RUeXBlID0ge0FSUkFZOiAnW29iamVjdCBBcnJheV0nLCBPQkpFQ1Q6ICdbb2JqZWN0IE9iamVjdF0nIH07XHJcblxyXG4vKipcclxuICogQGFjY2VzcyBwcml2YXRlXHJcbiAqIE1haW4gY2xhc3MgdGhhdCBtYWludGFpbnMgYSBKU09OIG9iamVjdCwgYW5kIG9ic2VydmVzIGNoYW5nZXMgaW4gdGhpcyBvYmplY3QsIHJlY3Vyc2l2ZWx5LlxyXG4gKiBJbnRlcm5hbCBvYmplY3RzIGFuZCBhcnJheXMgYXJlIGFsc28gb2JzZXJ2ZWQuXHJcbiAqL1xyXG5jbGFzcyBTeW5jT2JqZWN0IHtcclxuXHJcbiAgY29uc3RydWN0b3IoaW5pdGlhbERhdGEpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX29ic2VydmVycyA9IFtdO1xyXG4gICAgX3RoaXMuX2ZpbHRlcnMgPSB7fTtcclxuXHJcbiAgICB0aGlzLl9kYXRhID0gaW5pdGlhbERhdGEgfHwge307XHJcblxyXG4gICAgdGhpcy5faW50ZXJuYWxPYnNlcnZlKHRoaXMuX2RhdGEpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGEoKSB7IHJldHVybiB0aGlzLl9kYXRhOyB9XHJcblxyXG4gIG9ic2VydmUoY2FsbGJhY2spIHtcclxuICAgIHRoaXMuX29ic2VydmVycy5wdXNoKGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIGZpbmQocGF0aCkge1xyXG4gICAgbGV0IGxpc3QgPSBwYXJzZUF0dHJpYnV0ZXMocGF0aCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbmRXaXRoU3BsaXQobGlzdCk7XHJcbiAgfVxyXG5cclxuICBmaW5kQmVmb3JlKHBhdGgpIHtcclxuICAgIGxldCByZXN1bHQgPSB7fTtcclxuICAgIGxldCBsaXN0ID0gcGFyc2VBdHRyaWJ1dGVzKHBhdGgpO1xyXG4gICAgcmVzdWx0Lmxhc3QgPSBsaXN0LnBvcCgpO1xyXG4gICAgcmVzdWx0Lm9iaiA9IHRoaXMuX2ZpbmRXaXRoU3BsaXQobGlzdCk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIF9maW5kV2l0aFNwbGl0KGxpc3QpIHtcclxuICAgIGxldCBvYmogPSB0aGlzLl9kYXRhO1xyXG4gICAgbGlzdC5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICBvYmogPSBvYmpbdmFsdWVdO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIF9pbnRlcm5hbE9ic2VydmUob2JqZWN0KSB7XHJcblxyXG4gICAgbGV0IGhhbmRsZXIgPSAoY2hhbmdlc2V0KSA9PiB7XHJcblxyXG4gICAgICBjaGFuZ2VzZXQuZXZlcnkoKGNoYW5nZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlcyhjaGFuZ2UpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuX2RhdGEgPSBPYmplY3QuZGVlcE9ic2VydmUob2JqZWN0LCBoYW5kbGVyKTtcclxuXHJcbiAgfVxyXG5cclxuICBfZmlyZUV2ZW50KGV2ZW50KSB7XHJcbiAgICB0aGlzLl9vYnNlcnZlcnMuZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcclxuICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfb25DaGFuZ2VzKGNoYW5nZSkge1xyXG5cclxuICAgIGxldCBvYmogPSBjaGFuZ2Uub2JqZWN0O1xyXG4gICAgbGV0IG9ialR5cGU7XHJcblxyXG4gICAgaWYgKG9iai5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XHJcbiAgICAgIG9ialR5cGUgPSBPYmplY3RUeXBlLk9CSkVDVDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAob2JqLmNvbnN0cnVjdG9yID09PSBBcnJheSkge1xyXG4gICAgICBvYmpUeXBlID0gT2JqZWN0VHlwZS5BUlJBWTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZmllbGRTdHJpbmcgPSBjaGFuZ2Uua2V5cGF0aDtcclxuXHJcbiAgICAvLyBjb25zb2xlLmxvZygnRmllbGQ6JywgZmllbGRTdHJpbmcpO1xyXG4gICAgLy8gY29uc29sZS5sb2coJ3R5cGU6JywgY2hhbmdlLnR5cGUpO1xyXG5cclxuICAgIC8vbGV0IG9sZFZhbHVlID0gY2hhbmdlLm9sZFZhbHVlO1xyXG4gICAgbGV0IG5ld1ZhbHVlID0gb2JqW2NoYW5nZS5uYW1lXTtcclxuXHJcbiAgICAvLyBjb25zb2xlLmluZm8oY2hhbmdlLnR5cGUgKyAnIHwgRmllbGQ6ICcgKyBmaWVsZFN0cmluZyArICcgfCBOZXcgVmFsdWU6JywgSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpLCBmaWVsZFN0cmluZy5pbmNsdWRlcygnbGVuZ3RoJykpO1xyXG5cclxuICAgIGlmIChjaGFuZ2UudHlwZSA9PT0gJ3VwZGF0ZScgJiYgIWZpZWxkU3RyaW5nLmluY2x1ZGVzKCcubGVuZ3RoJykpIHtcclxuICAgICAgdGhpcy5fZmlyZUV2ZW50KHtcclxuICAgICAgICBjVHlwZTogQ2hhbmdlVHlwZS5VUERBVEUsXHJcbiAgICAgICAgb1R5cGU6IG9ialR5cGUsXHJcbiAgICAgICAgZmllbGQ6IGZpZWxkU3RyaW5nLFxyXG4gICAgICAgIGRhdGE6IG5ld1ZhbHVlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2UudHlwZSA9PT0gJ2FkZCcpIHtcclxuICAgICAgdGhpcy5fZmlyZUV2ZW50KHtcclxuICAgICAgICBjVHlwZTogQ2hhbmdlVHlwZS5BREQsXHJcbiAgICAgICAgb1R5cGU6IG9ialR5cGUsXHJcbiAgICAgICAgZmllbGQ6IGZpZWxkU3RyaW5nLFxyXG4gICAgICAgIGRhdGE6IG5ld1ZhbHVlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2UudHlwZSA9PT0gJ2RlbGV0ZScpIHtcclxuICAgICAgdGhpcy5fZmlyZUV2ZW50KHtcclxuICAgICAgICBjVHlwZTogQ2hhbmdlVHlwZS5SRU1PVkUsXHJcbiAgICAgICAgb1R5cGU6IG9ialR5cGUsXHJcbiAgICAgICAgZmllbGQ6IGZpZWxkU3RyaW5nXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBsZXQgQ2hhbmdlVHlwZSA9IHtVUERBVEU6ICd1cGRhdGUnLCBBREQ6ICdhZGQnLCBSRU1PVkU6ICdyZW1vdmUnfTtcclxuZXhwb3J0IGxldCBPYmplY3RUeXBlID0ge09CSkVDVDogJ29iamVjdCcsIEFSUkFZOiAnYXJyYXknfTtcclxuZXhwb3J0IGRlZmF1bHQgU3luY09iamVjdDtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG4vLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdEYXRhT2JqZWN0Q2hpbGQnKTtcclxuXHJcbmltcG9ydCBTeW5jT2JqZWN0IGZyb20gJy4vUHJveHlPYmplY3QnO1xyXG5cclxuaW1wb3J0IHsgZGVlcENsb25lIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjbGFzcyByZXR1cm5lZCBmcm9tIHRoZSBEYXRhT2JqZWN0IGFkZENoaWxkcmVuIGNhbGwgb3IgZnJvbSBvbkFkZENoaWxkcmVuIGlmIHJlbW90ZWx5IGNyZWF0ZWQuXHJcbiAqL1xyXG5jbGFzcyBEYXRhT2JqZWN0Q2hpbGQgLyogaW1wbGVtZW50cyBTeW5jU3RhdHVzICovIHtcclxuICAvKiBwcml2YXRlXHJcblxyXG4gIC0tLS1ldmVudCBoYW5kbGVycy0tLS1cclxuICBfb25SZXNwb25zZUhhbmRsZXI6IChldmVudCkgPT4gdm9pZFxyXG4gICovXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKiBTaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgSHlwZXJ0aWVzLiBJdCdzIGNhbGxlZCBieSB0aGUgRGF0YU9iamVjdC5hZGRDaGlsZFxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGZ1bmN0aW9uIHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcihwYXIpIHtcclxuICAgICAgdGhyb3cgJ1tEYXRhT2JqZWN0Q2hpbGRdICcgKyBwYXIgKyAnIG1hbmRhdG9yeSBwYXJhbWV0ZXIgaXMgbWlzc2luZyc7XHJcbiAgICB9XHJcblxyXG4gICAgaW5wdXQucGFyZW50ID8gIF90aGlzLl9wYXJlbnQgPSBpbnB1dC5wYXJlbnQgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3BhcmVudCcpO1xyXG4gICAgaW5wdXQudXJsID8gIF90aGlzLl91cmwgPSBpbnB1dC51cmwgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3VybCcpO1xyXG4gICAgaW5wdXQuY3JlYXRlZCA/IF90aGlzLl9jcmVhdGVkID0gaW5wdXQuY3JlYXRlZCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcignY3JlYXRlZCcpO1xyXG4gICAgaW5wdXQucmVwb3J0ZXIgPyBfdGhpcy5fcmVwb3J0ZXIgPSBpbnB1dC5yZXBvcnRlciA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcigncmVwb3J0ZXInKTtcclxuICAgIGlucHV0LnJ1bnRpbWUgPyBfdGhpcy5fcnVudGltZSA9IGlucHV0LnJ1bnRpbWUgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3J1bnRpbWUnKTtcclxuICAgIGlucHV0LnNjaGVtYSA/IF90aGlzLl9zY2hlbWEgPSBpbnB1dC5zY2hlbWEgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3NjaGVtYScpO1xyXG4gICAgaW5wdXQucGFyZW50T2JqZWN0ID8gX3RoaXMuX3BhcmVudE9iamVjdCA9IGlucHV0LnBhcmVudE9iamVjdCA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcigncGFyZW50T2JqZWN0Jyk7XHJcblxyXG4gICAgaWYgKGlucHV0Lm5hbWUpIF90aGlzLl9uYW1lID0gaW5wdXQubmFtZTtcclxuICAgIGlmIChpbnB1dC5kZXNjcmlwdGlvbikgX3RoaXMuX2Rlc2NyaXB0aW9uID0gaW5wdXQuZGVzY3JpcHRpb247XHJcbiAgICBpZiAoaW5wdXQudGFncykgX3RoaXMuX3RhZ3MgPSBpbnB1dC50YWdzO1xyXG4gICAgaWYgKGlucHV0LnJlc291cmNlcykgX3RoaXMuX3Jlc291cmNlcyA9IGlucHV0LnJlc291cmNlcztcclxuICAgIGlmIChpbnB1dC5vYnNlcnZlclN0b3JhZ2UpIF90aGlzLl9vYnNlcnZlclN0b3JhZ2UgPSBpbnB1dC5vYnNlcnZlclN0b3JhZ2U7XHJcbiAgICBpZiAoaW5wdXQucHVibGljT2JzZXJ2YXRpb24pIF90aGlzLl9wdWJsaWNPYnNlcnZhdGlvbiA9IGlucHV0LnB1YmxpY09ic2VydmF0aW9uO1xyXG5cclxuICAgIF90aGlzLl9jaGlsZElkID0gaW5wdXQudXJsO1xyXG5cclxuICAgIGlmIChpbnB1dC5kYXRhKSB7XHJcbiAgICAgIF90aGlzLl9zeW5jT2JqID0gbmV3IFN5bmNPYmplY3QoaW5wdXQuZGF0YSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfdGhpcy5fc3luY09iaiA9IG5ldyBTeW5jT2JqZWN0KHt9KTtcclxuICAgIH1cclxuXHJcbiAgICBsb2cubG9nKCdbRGF0YU9iamVjdENoaWxkIC0gIENvbnN0cnVjdG9yXSAtICcsIF90aGlzLl9zeW5jT2JqKTtcclxuXHJcbiAgICBfdGhpcy5fYnVzID0gX3RoaXMuX3BhcmVudE9iamVjdC5fYnVzO1xyXG4gICAgX3RoaXMuX293bmVyID0gX3RoaXMuX3BhcmVudE9iamVjdC5fb3duZXI7XHJcblxyXG4gICAgX3RoaXMuX2FsbG9jYXRlTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgX3RoaXMuX21ldGFkYXRhID0gaW5wdXQ7XHJcblxyXG4gICAgLy8gZGVsZXRlIF90aGlzLl9tZXRhZGF0YS5kYXRhO1xyXG4gICAgZGVsZXRlIF90aGlzLl9tZXRhZGF0YS5wYXJlbnRPYmplY3Q7XHJcblxyXG4gICAgX3RoaXMuX3NoYXJpbmdTdGF0dXMgPSBmYWxzZTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXQgc2hhcmVhYmxlKCkge1xyXG4gICAgbGV0IHNoYXJlYWJsZSA9IHRoaXMubWV0YWRhdGE7XHJcbiAgICBzaGFyZWFibGUuZGF0YSA9IHRoaXMuZGF0YTtcclxuXHJcbiAgICByZXR1cm4gc2hhcmVhYmxlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNoYXJlIHRoZSBjaGlsZCBPYmplY3QgYW1vbmcgYXV0aG9yaXNlZCBIeXBlcnRpZXNcclxuICAgKiBAcGFyYW0gIHtib29sZWFufSAgICAgcmVwb3J0ZXIgIElmIHRydWUgdGhlIGNoaWxkIG9iamVjdCBpcyBvbmx5IHNoYXJlZCB0byBQYXJlbnQgcmVwb3J0ZXJcclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEpTT04+fSAgICAgICAgSXQgcmV0dXJucyBhIHByb21pc2Ugd2l0aCB0aGUgc2hhcmluZyByZXN1bHRzLlxyXG4gICAqL1xyXG5cclxuICBzaGFyZSh0b1JlcG9ydGVyKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9zaGFyaW5nU3RhdHVzID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgbGV0IHRvO1xyXG4gICAgICBsZXQgcmVwb3J0ZXIgPSB0b1JlcG9ydGVyO1xyXG5cclxuICAgICAgaWYgKHJlcG9ydGVyKSB7XHJcbiAgICAgICAgdG8gPSBfdGhpcy5tZXRhZGF0YS5wYXJlbnQ7XHJcbiAgICAgIH0gZWxzZSB0byA9IF90aGlzLm1ldGFkYXRhLnBhcmVudCArICcvY2hpbGRyZW4vJztcclxuXHJcbiAgICAgIGxldCBjaGlsZFZhbHVlID0gX3RoaXMubWV0YWRhdGE7XHJcbiAgICAgIGNoaWxkVmFsdWUuZGF0YSA9IF90aGlzLmRhdGE7XHJcblxyXG4gICAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IGRpcmVjdGx5IHRvIGEgcmVzb3VyY2UgY2hpbGQgYWRkcmVzczogTWVzc2FnZUJ1c1xyXG4gICAgICBsZXQgcmVxdWVzdE1zZyA9IHtcclxuICAgICAgICB0eXBlOiAnY3JlYXRlJywgZnJvbTogX3RoaXMubWV0YWRhdGEucmVwb3J0ZXIsIHRvOiB0byxcclxuICAgICAgICBib2R5OiB7IHJlc291cmNlOiBjaGlsZFZhbHVlLnVybCwgdmFsdWU6IGNoaWxkVmFsdWUgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKF90aGlzLmlkZW50aXR5KSAgICAgIHtcclxuICAgICAgICByZXF1ZXN0TXNnLmJvZHkuaWRlbnRpdHkgPSBfdGhpcy5pZGVudGl0eTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy90byBiZSB1c2VkIHRvIGRpc2FibGUgbXV0dWFsIGF1dGhlbnRpY2F0aW9uIGZvciBsZWdhY3kgdXNlcnNcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fcGFyZW50T2JqZWN0LmRhdGEuaGFzT3duUHJvcGVydHkoJ211dHVhbCcpKSByZXF1ZXN0TXNnLmJvZHkubXV0dWFsID0gX3RoaXMuX3BhcmVudE9iamVjdC5kYXRhLm11dHVhbDtcclxuXHJcbiAgICAgIGlmIChfdGhpcy5fcGFyZW50T2JqZWN0Lm1ldGFkYXRhLnJlcG9ydGVyID09PSBfdGhpcy5tZXRhZGF0YS5yZXBvcnRlcikge1xyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UoZGVlcENsb25lKHJlcXVlc3RNc2cpKTtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICBsZXQgY2FsbGJhY2sgPSAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgICBpZiAocmVwbHkudG8gPT09IF90aGlzLl9yZXBvcnRlcikge1xyXG4gICAgICAgICAgICBfdGhpcy5fYnVzLnJlbW92ZVJlc3BvbnNlTGlzdGVuZXIocmVxdWVzdE1zZy5mcm9tLCByZXBseS5pZCk7XHJcblxyXG4gICAgICAgICAgICBsb2cubG9nKCdbU3luY2hlci5EYXRhT2JqZWN0Q2hpbGQuc2hhcmVdIFBhcmVudCByZXBvcnRlciByZXBseSAnLCByZXBseSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgIGNvZGU6IHJlcGx5LmJvZHkgJiYgcmVwbHkuYm9keS5jb2RlID8gcmVwbHkuYm9keS5jb2RlIDogNTAwLFxyXG4gICAgICAgICAgICAgIGRlc2M6IHJlcGx5LmJvZHkgJiYgcmVwbHkuYm9keS5kZXNjID8gcmVwbHkuYm9keS5kZXNjIDogJ1Vua25vd24nXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlIDwgMzAwKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgfSBlbHNlIHJldHVybiByZWplY3QocmVzdWx0KTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IGlkID0gX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShkZWVwQ2xvbmUocmVxdWVzdE1zZyksIGNhbGxiYWNrLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PiB7XHJcblxyXG4gICAgICAgICAgLy8gSWYgUmVwb3J0ZXIgZG9lcyAgbm90IHJlcGx5IHRoZSBwcm9taXNlIGlzIHJlamVjdGVkXHJcbiAgICAgICAgICBfdGhpcy5fYnVzLnJlbW92ZVJlc3BvbnNlTGlzdGVuZXIocmVxdWVzdE1zZy5mcm9tLCBpZCk7XHJcblxyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgY29kZTogNDA4LFxyXG4gICAgICAgICAgICBkZXNjOiAndGltb3V0J1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHJldHVybiByZWplY3QocmVzdWx0KTtcclxuXHJcbiAgICAgICAgfSwgMzAwMCk7XHJcblxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzaGFyZSB0aGUgY2hpbGQgT2JqZWN0IGFtb25nIGF1dGhvcmlzZWQgSHlwZXJ0aWVzXHJcbiAgICAgKiBAcGFyYW0gIHtib29sZWFufSAgICAgcmVwb3J0ZXIgIElmIHRydWUgdGhlIGNoaWxkIG9iamVjdCBpcyBvbmx5IHNoYXJlZCB0byBQYXJlbnQgcmVwb3J0ZXJcclxuICAgICAqIEByZXR1cm4ge1Byb21pc2U8SlNPTj59ICAgICAgICBJdCByZXR1cm5zIGEgcHJvbWlzZSB3aXRoIHRoZSBzaGFyaW5nIHJlc3VsdHMuXHJcbiAgICAgKi9cclxuXHJcbiAgc3RvcmUoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBjaGlsZCA9IHt9O1xyXG4gICAgbGV0IGtleSA9IF90aGlzLm1ldGFkYXRhLmNoaWxkcmVuICsgJy4nICsgX3RoaXMubWV0YWRhdGEudXJsO1xyXG5cclxuICAgIGNoaWxkLnZhbHVlID0gX3RoaXMubWV0YWRhdGE7XHJcbiAgICBjaGlsZC5pZGVudGl0eSA9IF90aGlzLmlkZW50aXR5O1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcblxyXG4gICAgICBmcm9tOiBfdGhpcy5tZXRhZGF0YS5yZXBvcnRlcixcclxuICAgICAgdG86IF90aGlzLl9wYXJlbnRPYmplY3QuX3N5bmNoZXIuX3N1YlVSTCxcclxuICAgICAgdHlwZTogJ2NyZWF0ZScsXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogX3RoaXMubWV0YWRhdGEucGFyZW50LFxyXG4gICAgICAgIGF0dHJpYnV0ZToga2V5LFxyXG4gICAgICAgIHZhbHVlOiBjaGlsZFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0Q2hpbGQuc3RvcmVdOicsIG1zZyk7XHJcblxyXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2cpO1xyXG4gIH1cclxuXHJcbiAgX2FsbG9jYXRlTGlzdGVuZXJzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL3RoaXMgaXMgb25seSBuZWVkZWQgZm9yIGNoaWxkcmVuIHJlcG9ydGVyc1xyXG4gICAgaWYgKF90aGlzLl9yZXBvcnRlciA9PT0gX3RoaXMuX293bmVyKSB7XHJcbiAgICAgIF90aGlzLl9saXN0ZW5lciA9IF90aGlzLl9idXMuYWRkTGlzdGVuZXIoX3RoaXMuX3JlcG9ydGVyLCAobXNnKSA9PiB7XHJcbiAgICAgICAgaWYgKG1zZy50eXBlID09PSAncmVzcG9uc2UnICYmIG1zZy5pZCA9PT0gX3RoaXMuX21zZ0lkKSB7XHJcbiAgICAgICAgICBsb2cubG9nKCdEYXRhT2JqZWN0Q2hpbGQub25SZXNwb25zZTonLCBtc2cpO1xyXG4gICAgICAgICAgX3RoaXMuX29uUmVzcG9uc2UobXNnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgX3JlbGVhc2VMaXN0ZW5lcnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGlmIChfdGhpcy5fbGlzdGVuZXIpIHtcclxuICAgICAgX3RoaXMuX2xpc3RlbmVyLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVsZWFzZSBhbmQgZGVsZXRlIG9iamVjdCBkYXRhXHJcbiAgICovXHJcbiAgZGVsZXRlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcblxyXG4gICAgX3RoaXMuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuXHJcbiAgICAvL1RPRE86IHNlbmQgZGVsZXRlIG1lc3NhZ2UgP1xyXG5cclxuICAgIC8vIG5vdGhpbmcgdG8gYmUgZG9uZVxyXG4gICAgLy8gcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAvLyAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0Q2hpbGQuZGVsZXRlXScpO1xyXG4gICAgLy8gICByZXNvbHZlKCk7XHJcbiAgICAvLyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFsbCBNZXRhZGF0YSBhYm91dCB0aGUgQ2hpbGQgRGF0YSBPYmplY3RcclxuICAgKiBAdHlwZSB7T2JqZWN0fSAtXHJcbiAgICovXHJcbiAgZ2V0IG1ldGFkYXRhKCkgeyByZXR1cm4gdGhpcy5fbWV0YWRhdGE7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hpbGRyZW4gSUQgZ2VuZXJhdGVkIG9uIGFkZENoaWxkcmVuLiBVbmlxdWUgaWRlbnRpZmllclxyXG4gICAqIEB0eXBlIHtVUkx9IC0gVVJMIG9mIHRoZSBmb3JtYXQgPEh5cGVydHlVUkw+IzxudW1lcmljLXNlcXVlbmNlPlxyXG4gICAqL1xyXG4gIGdldCBjaGlsZElkKCkgeyByZXR1cm4gdGhpcy5fY2hpbGRJZDsgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRhIFN0cnVjdHVyZSB0byBiZSBzeW5jaHJvbml6ZWQuXHJcbiAgICogQHR5cGUge0pTT059IC0gSlNPTiBzdHJ1Y3R1cmUgdGhhdCBzaG91bGQgZm9sbG93IHRoZSBkZWZpbmVkIHNjaGVtYSwgaWYgYW55LlxyXG4gICAqL1xyXG5cclxuICBnZXQgc2hhcmluZ1N0YXR1cygpIHtcclxuICAgIHJldHVybiB0aGlzLl9zaGFyaW5nU3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAqIERhdGEgU3RydWN0dXJlIHRvIGJlIHN5bmNocm9uaXplZC5cclxuICAgICogQHR5cGUge0pTT059IC0gSlNPTiBzdHJ1Y3R1cmUgdGhhdCBzaG91bGQgZm9sbG93IHRoZSBkZWZpbmVkIHNjaGVtYSwgaWYgYW55LlxyXG4gICAgKi9cclxuXHJcbiAgZ2V0IGRhdGEoKSB7IHJldHVybiB0aGlzLl9zeW5jT2JqLmRhdGE7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IGZvciB0aGlzIGRhdGFPYmplY3RDaGlsZCBhbiBpZGVudGl0eVxyXG4gICAqIEBtZXRob2QgaWRlbnRpdHlcclxuICAgKiBAcGFyYW0gIHtJZGVudGl0eX0gaWRlbnRpdHkgaWRlbnRpdHkgZnJvbSB3aG8gY3JlYXRlZCB0aGUgbWVzc2FnZVxyXG4gICAqL1xyXG4gIHNldCBpZGVudGl0eShpZGVudGl0eSkgeyB0aGlzLl9pZGVudGl0eSA9IGlkZW50aXR5OyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBmb3IgdGhpcyBkYXRhT2JqZWN0Q2hpbGQgYW4gaWRlbnRpdHlcclxuICAgKiBAbWV0aG9kIGlkZW50aXR5XHJcbiAgICogQHJldHVybiB7SWRlbnRpdHl9IGlkZW50aXR5IGZyb20gd2hvIGNyZWF0ZWQgdGhlIG1lc3NhZ2VcclxuICAgKi9cclxuICBnZXQgaWRlbnRpdHkoKSB7IHJldHVybiB0aGlzLl9pZGVudGl0eTsgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciB0aGUgY2hhbmdlIGxpc3RlbmVycyBzZW50IGJ5IHRoZSByZXBvcnRlciBjaGlsZFxyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQ6IE1zZ0V2ZW50KX0gY2FsbGJhY2tcclxuICAgKi9cclxuICBvbkNoYW5nZShjYWxsYmFjaykge1xyXG4gICAgdGhpcy5fc3luY09iai5vYnNlcnZlKChldmVudCkgPT4ge1xyXG4gICAgICBsb2cubG9nKCdbRGF0YU9iamVjdENoaWxkIC0gb2JzZXJ2ZXJdIC0gJywgZXZlbnQpO1xyXG4gICAgICBjYWxsYmFjayhldmVudCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIHJlc3BvbnNlIG5vdGlmaWNhdGlvbnMgb2YgdGhlIGNyZWF0ZXNcclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrXHJcbiAgICovXHJcbiAgb25SZXNwb25zZShjYWxsYmFjaykge1xyXG4gICAgdGhpcy5fb25SZXNwb25zZUhhbmRsZXIgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgcmVtb3RlIERhdGFPYmplY3QgLT4gX29uQ2hpbGRDcmVhdGVcclxuICBfb25SZXNwb25zZShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGV2ZW50ID0ge1xyXG4gICAgICB0eXBlOiBtc2cudHlwZSxcclxuICAgICAgdXJsOiBtc2cuYm9keS5zb3VyY2UsXHJcbiAgICAgIGNvZGU6IG1zZy5ib2R5LmNvZGVcclxuICAgIH07XHJcblxyXG4gICAgaWYgKF90aGlzLl9vblJlc3BvbnNlSGFuZGxlcikge1xyXG4gICAgICBfdGhpcy5fb25SZXNwb25zZUhhbmRsZXIoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERhdGFPYmplY3RDaGlsZDtcclxuIiwiXHJcblxyXG5pbXBvcnQgeyBzZWNvbmRzU2luY2VFcG9jaCB9IGZyb20gJy4uL3V0aWxzL3V0aWxzLmpzJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzcyB0byBoYW5kbGUgQ2hpbGRyZW4gRGF0YSBPYmplY3QgSGVhcnQgYmVhdHMgXHJcbiAqIHJlcXVpcmVkIHRvIG1hbmFnZSBzeW5jaHJvbmlzYXRpb24gd2l0aCByZW1vdGUgc3RvcmFnZSBzZXJ2ZXJzLlxyXG4gKi9cclxuY2xhc3MgSGVhcnRCZWF0IHtcclxuICAvKiBwcml2YXRlXHJcblxyXG4gICovXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKiBTaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgSHlwZXJ0aWVzLiBJdCdzIGNhbGxlZCBieSB0aGUgRGF0YU9iamVjdCBjb25zdHJ1Y3RvclxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKGJ1cywgaHlwZXJ0eVVybCwgcnVudGltZVVybCwgZGF0YU9iamVjdCwgaGVhcnRCZWF0UmF0ZSA9IDYwKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGZ1bmN0aW9uIHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcihwYXIpIHtcclxuICAgICAgdGhyb3cgJ1tIZWFydEJlYXRdICcgKyBwYXIgKyAnIG1hbmRhdG9yeSBwYXJhbWV0ZXIgaXMgbWlzc2luZyc7XHJcbiAgICB9XHJcblxyXG4gICAgYnVzID8gX3RoaXMuX2J1cyA9IGJ1cyA6IHRocm93TWFuZGF0b3J5UGFybU1pc3NpbmdFcnJvcignYnVzJyk7XHJcbiAgICBkYXRhT2JqZWN0ID8gX3RoaXMuX2RhdGFPYmplY3QgPSBkYXRhT2JqZWN0IDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdkYXRhT2JqZWN0Jyk7XHJcbiAgICBoZWFydEJlYXRSYXRlID8gX3RoaXMuX2hlYXJ0QmVhdFJhdGUgPSBoZWFydEJlYXRSYXRlIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdoZWFydEJlYXRSYXRlJyk7XHJcbiAgICBydW50aW1lVXJsID8gX3RoaXMuX3J1bnRpbWVVcmwgPSBydW50aW1lVXJsIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdydW50aW1lVXJsJyk7XHJcbiAgICBoeXBlcnR5VXJsID8gX3RoaXMuX2h5cGVydHlVcmwgPSBoeXBlcnR5VXJsIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdoeXBlcnR5VXJsJyk7XHJcbiAgICB0aGlzLmhlYXJ0YmVhdCA9IDA7XHJcblxyXG4gICAgX3RoaXMuX3N0b3AgPSB7XHJcbiAgICAgIGhlYXJ0QmVhdDogZmFsc2UsXHJcbiAgICAgIHN5bmM6IGZ1bmN0aW9uIChidXMpIHtcclxuICAgICAgICBsZXQgc3RvcFN5bmNNc2cgPSB7XHJcbiAgICAgICAgICBmcm9tOiBoeXBlcnR5VXJsLFxyXG4gICAgICAgICAgdG86IHJ1bnRpbWVVcmwgKyAnL3NtJyxcclxuICAgICAgICAgIHR5cGU6ICdleGVjdXRlJyxcclxuICAgICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgICAgbWV0aG9kOiAnc3RvcFN5bmMnLFxyXG4gICAgICAgICAgICBwYXJhbXM6IFtkYXRhT2JqZWN0LnVybF1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZygnW0hlYXJ0YmVhdC5zdG9wLnN5bmMoKV0gc2VuZGluZyBtc2c6Jywgc3RvcFN5bmNNc2cpO1xyXG5cclxuICAgICAgICBidXMucG9zdE1lc3NhZ2Uoc3RvcFN5bmNNc2cpO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gIH1cclxuXHJcbiAgc3RhcnQocmVzdW1lLCBpc1JlcG9ydGVyID0gZmFsc2UpIHtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdF0gc3RhcnRpbmcuIGlzUmVwb3J0ZXI6ICcsIGlzUmVwb3J0ZXIpO1xyXG5cclxuICAgIGlmIChyZXN1bWUgfHwgIWlzUmVwb3J0ZXIpIHtcclxuICAgICAgdGhpcy5fZ2V0TGFzdEhlYXJCZWF0KCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgbGV0IGlzSGVhcnRCZWF0QWN0aXZlID0gdGhpcy5faXNIZWFydEJlYXRBY3RpdmUodGhpcy5oZWFydEJlYXQsIHRoaXMuX2hlYXJ0QmVhdFJhdGUgKiAyKTtcclxuXHJcbiAgICAgICAgaWYgKCFpc0hlYXJ0QmVhdEFjdGl2ZSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXRdIGhlYXJ0IGJlYXRzIGFyZSBkaXNhYmxlZCBmb3IgJywgdGhpcy5fZGF0YU9iamVjdCk7XHJcblxyXG4gICAgICAgICAgLy8gSXMgZGlzYWJsZWQ6IGxldHMgc3RhcnQgb2JzZXJ2ZXIgaGVhcnQgYmVhdCBhbmQgc3RhcnQgc3luY2hpbmcgd2l0aCByZW1vdGUgc3RvcmFnZSBzZXJ2ZXJcclxuICAgICAgICAgIHRoaXMuX3N0b3AuaGVhcnRCZWF0ID0gdGhpcy5fc3RhcnRIZWFydEJlYXQodGhpcy5faGVhcnRCZWF0UmF0ZSk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdF0gICcsIHRoaXMuX2h5cGVydHlVcmwsICcgc3RhcnRlZCBzeW5jaGluZyB3aXRoIHJlbW90ZSBzdG9yYWdlIHNlcnZlcicpO1xyXG4gICAgICAgICAgdGhpcy5fc3RhcnRTeW5jKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vICBoZWFydCBiZWF0IGlzIGFjdGl2ZSwgXHJcbiAgICAgICAgICAvLyBpdCBtZWFucyB0aGUgZGF0YSBvYmplY3QgaXMgYWxyZWFkeSBiZWluZyBzeW5jaHJvbmlzZWQgd2l0aCByZW1vdGUgc3RvcmFnZSBzZXJ2ZXJcclxuICAgICAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byB3YXRjaCB0aGUgaGVhcnQgYmVhdCBhbmQgdHJ5IHRvIHJlcGxhY2UgaXQgaW4gY2FzZSBpdCBmYWlscy5cclxuICAgICAgICAgIHRoaXMuX3dhdGNoSGVhcnRCZWF0KHRoaXMuX2hlYXJ0QmVhdFJhdGUsIHRydWUsIHRoaXMuX29uSGVydGJlYXRTdG9wcGVkKTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zdGFydEhlYXJ0QmVhdCh0aGlzLl9oZWFydEJlYXRSYXRlKTtcclxuICAgICAgdGhpcy5fc3RhcnRTeW5jKCk7XHJcbiAgICB9IFxyXG5cclxuICB9XHJcblxyXG4gIF9nZXRMYXN0SGVhckJlYXQoKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgXHJcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll9nZXRMYXN0SGVhckJlYXRdIHN0b3Agd2FpdGluZyAnKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcblxyXG4gICAgICB9LCB0aGlzLl9oZWFydEJlYXRSYXRlICogMTAwMCAqIDEuNSk7XHJcbiAgXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBzdG9wKCkge1xyXG4gICAgaWYgKHRoaXMuX3N0b3AuaGVhcnRCZWF0KVxyXG4gICAgICB0aGlzLl9zdG9wLmhlYXJ0QmVhdCgpO1xyXG5cclxuICAgIHRoaXMuX3N0b3Auc3luYyh0aGlzLl9idXMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhlYXJ0QmVhdCgpIHtcclxuICAgIGlmICh0aGlzLmhlYXJ0YmVhdClcclxuICAgICAgcmV0dXJuIHRoaXMuaGVhcnRiZWF0O1xyXG4gICAgZWxzZSByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIG9uTmV3SGVhcnRiZWF0KGhlYXJ0YmVhdCkge1xyXG4gICAgdGhpcy5oZWFydGJlYXQgPSBoZWFydGJlYXQ7XHJcbiAgfVxyXG5cclxuICBfaXNIZWFydEJlYXRBY3RpdmUobGFzdEhlYXJ0YmVhdCwgbWF4SGVhcnRCZWF0SW50ZXJ2YWwpIHtcclxuICAgIGxldCBsYXN0SGVhcnRQZXJpb2RJbnRlcnZhbCA9IHNlY29uZHNTaW5jZUVwb2NoKCkgLSBsYXN0SGVhcnRiZWF0O1xyXG4gICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXQuX2lzSGVhcnRCZWF0QWN0aXZlXSBub3cgLSBsYXN0SGVhcnRCZWF0JywgbGFzdEhlYXJ0UGVyaW9kSW50ZXJ2YWwpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll9pc0hlYXJ0QmVhdEFjdGl2ZV0gJywgIShsYXN0SGVhcnRQZXJpb2RJbnRlcnZhbCA+IG1heEhlYXJ0QmVhdEludGVydmFsICogMikpO1xyXG4gICAgcmV0dXJuICghKGxhc3RIZWFydFBlcmlvZEludGVydmFsID4gbWF4SGVhcnRCZWF0SW50ZXJ2YWwgKiAyKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgX3N0YXJ0SGVhcnRCZWF0KHJhdGUpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgZnJvbTogX3RoaXMuX2h5cGVydHlVcmwsXHJcbiAgICAgIHRvOiBfdGhpcy5fZGF0YU9iamVjdC51cmwgKyAnL2NoaWxkcmVuLycsXHJcbiAgICAgIHR5cGU6ICdjcmVhdGUnLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6ICdoZWFydGJlYXQnLFxyXG4gICAgICAgIG11dHVhbDogZmFsc2UsXHJcbiAgICAgICAgdmFsdWU6IHNlY29uZHNTaW5jZUVwb2NoKCksXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll9zdGFydEhlYXJ0QmVhdF0gc3RhcnRpbmcgLi4uICcsIG1zZy5ib2R5LnZhbHVlKTtcclxuXHJcbiAgICB0aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnKTtcclxuXHJcbiAgICB0aGlzLmhlYXJ0YmVhdCA9IHNlY29uZHNTaW5jZUVwb2NoKCk7XHJcblxyXG4gICAgbGV0IGlkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgbGV0IG1zZyA9IHtcclxuICAgICAgICBmcm9tOiBfdGhpcy5faHlwZXJ0eVVybCxcclxuICAgICAgICB0bzogX3RoaXMuX2RhdGFPYmplY3QudXJsICsgJy9jaGlsZHJlbi8nLFxyXG4gICAgICAgIHR5cGU6ICdjcmVhdGUnLFxyXG4gICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgIHJlc291cmNlOiAnaGVhcnRiZWF0JyxcclxuICAgICAgICAgIG11dHVhbDogZmFsc2UsXHJcbiAgICAgICAgICB2YWx1ZTogc2Vjb25kc1NpbmNlRXBvY2goKSxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXRdICcsIG1zZyk7XHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnKTtcclxuICAgICAgdGhpcy5oZWFydGJlYXQgPSBzZWNvbmRzU2luY2VFcG9jaCgpO1xyXG5cclxuICAgIH0sIHJhdGUgKiAxMDAwKTtcclxuXHJcbiAgICAvLyByZXR1cm5zIGZ1bmN0aW9uIHRvIHN0b3AgdGhlIGhlYXJ0IGJlYXRcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xyXG4gICAgICBjbGVhckludGVydmFsKGlkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9zdGFydFN5bmMoKSB7XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXQuX3N0YXJ0U3luY10gc3RhcnRpbmcgb2JzZXJ2ZXIgc3luYyAnLCB0aGlzLl9kYXRhT2JqZWN0LmRhdGEpO1xyXG4gICAgbGV0IGJhY2t1cFJldmlzaW9uID0gdGhpcy5fZGF0YU9iamVjdC5kYXRhLmJhY2t1cFJldmlzaW9uO1xyXG4gICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXQuX3N0YXJ0U3luY10gYmFja3VwUmV2aXNpb24gJywgYmFja3VwUmV2aXNpb24pO1xyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgZnJvbTogdGhpcy5faHlwZXJ0eVVybCxcclxuICAgICAgdG86IHRoaXMuX3J1bnRpbWVVcmwgKyAnL3NtJyxcclxuICAgICAgdHlwZTogJ2V4ZWN1dGUnLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgbWV0aG9kOiAnc3luYycsXHJcbiAgICAgICAgcGFyYW1zOiBbdGhpcy5fZGF0YU9iamVjdC51cmwsIGJhY2t1cFJldmlzaW9uXVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXQuX3N0YXJ0U3luY10gc2VuZGluZyBtc2cgJywgbXNnKTtcclxuXHJcbiAgICB0aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnKTtcclxuXHJcbiAgfVxyXG5cclxuICBfd2F0Y2hIZWFydEJlYXQocmF0ZSwgb25XYXRjaGluZ0lzRW5hYmxlZCwgY2FsbGJhY2spIHtcclxuICAgIC8vICBxZG8gbyBoZWFydEJlYXQgdGVybWluYXIgY2hhbWEgY2FsbGJhY2sgXHJcbiAgICAvLyB1c2EgaGVhcnRCZWF0IFJhdGluZyBwYXJhIGluaWNpYXIgdGltZXIgbm8gcmVzcGVjdGl2byBcclxuICAgIC8vIGNhbXBvIGRvIERPIGNoYW1hbmRvIGlzSGVhcnRCZWF0QWN0aXZlKClcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IHN5bmNGdW4gPSBjYWxsYmFjaztcclxuICAgIGNvbnNvbGUubG9nKCdbSGVhcnRCZWF0Ll93YXRjaEhlYXJ0QmVhdF0gc3RhcnRlZCB3YXRjaGluZyAnLCBfdGhpcy5oZWFydEJlYXQpO1xyXG5cclxuICAgIC8vbGV0IGhlYXJ0QmVhdCA9IHR5cGUgKyAnSGVhcnRCZWF0JztcclxuXHJcbiAgICBsZXQgd2F0Y2hlciA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcclxuXHJcbiAgICAgIGlmIChvbldhdGNoaW5nSXNFbmFibGVkICYmICFfdGhpcy5faXNIZWFydEJlYXRBY3RpdmUoX3RoaXMuaGVhcnRCZWF0LCBfdGhpcy5faGVhcnRCZWF0UmF0ZSkpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW0hlYXJ0QmVhdC5fd2F0Y2hIZWFydEJlYXRdIGhhcyBzdG9wcGVkICcsIF90aGlzLl9kYXRhT2JqZWN0LmRhdGEpO1xyXG5cclxuICAgICAgICBjbGVhckludGVydmFsKHdhdGNoZXIpO1xyXG4gICAgICAgIHN5bmNGdW4oX3RoaXMpO1xyXG4gICAgICB9IGVsc2UgaWYgKCFvbldhdGNoaW5nSXNFbmFibGVkICYmIHRoaXMuX2lzSGVhcnRCZWF0QWN0aXZlKF90aGlzLmhlYXJ0QmVhdCwgX3RoaXMuX2hlYXJ0QmVhdFJhdGUpKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tIZWFydEJlYXQuX3dhdGNoSGVhcnRCZWF0XSBoYXMgY2hhbmdlZCB0byBkaXNhYmxlZCAnLCBfdGhpcy5fZGF0YU9iamVjdC5kYXRhKTtcclxuXHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh3YXRjaGVyKTtcclxuICAgICAgICBzeW5jRnVuKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9LCByYXRlICogMTAwMCAqIDIpO1xyXG5cclxuICB9XHJcblxyXG4gIF9vbkhlcnRiZWF0U3RvcHBlZChfdGhpcykge1xyXG5cclxuICAgIF90aGlzLl9zdGFydEhlYXJ0QmVhdChfdGhpcy5faGVhcnRCZWF0UmF0ZSk7XHJcbiAgICBfdGhpcy5fc3RhcnRTeW5jKCk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIZWFydEJlYXQ7XHJcbiIsIi8qKlxyXG4qIFRoZSBIeXBlcnR5IFJlc291cmNlIERhdGEgTW9kZWwgaXMgdXNlZCB0byBtb2RlbCByZXNvdWNlcyBoYW5kbGVkIGJ5IEh5cGVydGllcyBhbmQgRGF0YSBPYmplY3RzIGluY2x1ZGluZyBjaGF0IG1lc3NhZ2VzLCBmaWxlcywgcmVhbCB0aW1lIGh1bWFuIGF1ZGlvIGFuZCB2aWRlby4uXHJcbipcclxuKi9cclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0h5cGVydHlSZXNvdXJjZScpO1xyXG5cclxuaW1wb3J0IHsgZGVlcENsb25lIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuanMnO1xyXG5pbXBvcnQgRGF0YU9iamVjdENoaWxkIGZyb20gJy4uL3N5bmNoZXIvRGF0YU9iamVjdENoaWxkLmpzJztcclxuXHJcbmNsYXNzIEh5cGVydHlSZXNvdXJjZSBleHRlbmRzIERhdGFPYmplY3RDaGlsZCB7XHJcblxyXG4gIC8qKlxyXG4gICogSHlwZXJ0eVJlc291cmNlIGNvbnN0cnVjdG9yXHJcbiAgKlxyXG4gICogQHBhcmFtICB7VVJMfSBsb2NhbFJ1bnRpbWVVUkwgUnVudGltZVVSTCBvZiBsb2NhbCBydW50aW1lXHJcbiAgKiBAcGFyYW0gIHtVUkx9IGlucHV0Lm93bmVyIEh5cGVydHlVUkwgb2YgdGhlIEh5cGVydHkgaGFuZGxpbmcgdGhpcyByZXNvdXJjZVxyXG4gICogQHBhcmFtICB7VVJMfSBpbnB1dC5ydW50aW1lIFJ1bnRpbWUgVVJMIHdoZXJlIHRoaXMgcmVzb3VyY2UgaXMgaG9zdGVkXHJcbiAgKiBAcGFyYW0gIHtCdXN9IGlucHV0LmJ1cyBzYW5kYm94IG1lc3NhZ2UgYnVzXHJcbiAgKiBAcGFyYW0gIHtEYXRhT2JqZWN0fSBpbnB1dC5wYXJlbnQgUGFyZW50IERhdGEgT2JqZWN0IHdoZXJlIHRoZSBIeXBlcnR5UmVzb3VyY2UgaXMgaGFuZGxlZCBhcyBhIGNoaWxkXHJcbiAgKiBAcGFyYW0gIHtCb29sZWFufSBpc1NlbmRlciBpbmRpY2F0ZXMgaWYgcGFyZW50IGlzIFJlcG9ydGVyIG9yIGFuIE9ic2VydmVyXHJcbiAgKiBAcGFyYW0gIHtBcnJheX0gaW5wdXQgb3B0aW9uYWwgaW5wdXQgcGFyYW1ldGVyc1xyXG4gICovXHJcblxyXG4gIGNvbnN0cnVjdG9yKGlzU2VuZGVyLCBpbnB1dCkge1xyXG4gICAgc3VwZXIoaW5wdXQpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5hcnJheWJ1ZmZlclNpemVMaW1pdCA9IDUyNDI4ODA7IC8vYWJvdmUgdGhpcyBsaW1pdCBjb250ZW50IGlzIG5vdCBzYXZlZCBhcyBBcnJheUJ1ZmZlclxyXG5cclxuICAgIF90aGlzLl9pc1NlbmRlciA9IGlzU2VuZGVyO1xyXG5cclxuICAgIF90aGlzLl9sb2NhbFN0b3JhZ2VVUkwgPSBfdGhpcy5fcGFyZW50T2JqZWN0Ll9zeW5jaGVyLl9ydW50aW1lVXJsICsgJy9zdG9yYWdlJztcclxuXHJcbiAgfVxyXG5cclxuICBnZXQgcmVzb3VyY2VUeXBlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5tZXRhZGF0YS5yZXNvdXJjZVR5cGU7XHJcbiAgfVxyXG5cclxuICBnZXQgbWltZXR5cGUoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9tZXRhZGF0YS50eXBlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbnRlbnQoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9jb250ZW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbnRlbnRVUkwoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgcmV0dXJuIF90aGlzLl9tZXRhZGF0YS5jb250ZW50VVJMO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNoYXJlYWJsZSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgc2hhcmVhYmxlID0gc3VwZXIubWV0YWRhdGE7XHJcbiAgICBzaGFyZWFibGUucmVzb3VyY2VUeXBlID0gX3RoaXMucmVzb3VyY2VUeXBlO1xyXG4gICAgcmV0dXJuIHNoYXJlYWJsZTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgc2V0IHBhcmVudChwYXJlbnQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5fcGFyZW50ID0gcGFyZW50O1xyXG4gIH0qL1xyXG5cclxuICBzYXZlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsZXQgbXNnID0ge1xyXG4gICAgICAgIGZyb206IF90aGlzLl9vd25lcixcclxuICAgICAgICB0bzogX3RoaXMuX2xvY2FsU3RvcmFnZVVSTCxcclxuICAgICAgICB0eXBlOiAnY3JlYXRlJyxcclxuICAgICAgICBib2R5OiB7IHZhbHVlOiBkZWVwQ2xvbmUoX3RoaXMuX21ldGFkYXRhKSB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsZXQgY2FsbGJhY2sgPSAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cuaW5mbygnW0h5cGVydHlSZXNvdXJjZS5zYXZlXSByZXBseTogJywgcmVwbHkpO1xyXG4gICAgICAgIF90aGlzLl9idXMucmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcihfdGhpcy5fb3duZXIsIHJlcGx5LmlkKTtcclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGlmIChyZXBseS5ib2R5LnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlmICghX3RoaXMuX21ldGFkYXRhLmNvbnRlbnRVUkwpIF90aGlzLl9tZXRhZGF0YS5jb250ZW50VVJMID0gW107XHJcbiAgICAgICAgICAgIF90aGlzLl9tZXRhZGF0YS5jb250ZW50VVJMLnB1c2gocmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSBlbHNlIHJlamVjdChyZXBseS5ib2R5LmNvZGUgKyAnICcgKyByZXBseS5ib2R5LmRlc2MpO1xyXG5cclxuICAgICAgfTtcclxuXHJcbiAgICAgIG1zZy5ib2R5LnZhbHVlLmNvbnRlbnQgPSBfdGhpcy5fY29udGVudDtcclxuXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnLCBjYWxsYmFjaywgZmFsc2UpO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogRnVuY3Rpb24gdG8gUmVhZCBIeXBlcnR5UmVzb3VyY2VcclxuICAqXHJcbiAgKiBAcGFyYW0gIHt9IGNhbGxiYWNrIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aXRoIHByb2dyZXNzIGluZm9ybWF0aW9uIGluIHRlcm1zIG9mIHBlcmNlbnRhZ2VcclxuICAqIEByZXR1cm4gIHtQcm9taXNlfSAgaW5wdXQgb3B0aW9uYWwgaW5wdXQgcGFyYW1ldGVyc1xyXG4gICovXHJcblxyXG5cclxuICByZWFkKGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbG9nLmluZm8oJ1tIeXBlcnR5UmVzb3VyY2UucmVhZF0gJywgdGhpcyk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgaWYgKF90aGlzLmNvbnRlbnQpIHtcclxuICAgICAgICByZXNvbHZlKF90aGlzKTtcclxuICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgLy9UT0RPOiB1c2UgYW4gaXRlcmF0aW9uIHRvIGdldCBvbmxpbmUgcnVudGltZSBzdG9yYWdlcyB3aGVuIHNvbWUgYXJlIG9mZmxpbmVcclxuICAgICAgICBsZXQgc3RvcmFnZSA9IF90aGlzLl9nZXRCZXN0Q29udGVudFVSTChfdGhpcy5fbWV0YWRhdGEuY29udGVudFVSTCk7XHJcblxyXG4gICAgICAgIGxvZy5sb2coJ1N0b3JhZ2U6Jywgc3RvcmFnZSk7XHJcblxyXG4gICAgICAgIGxldCBtc2cgPSB7XHJcbiAgICAgICAgICBmcm9tOiBfdGhpcy5fb3duZXIsXHJcbiAgICAgICAgICB0bzogc3RvcmFnZS51cmwsXHJcbiAgICAgICAgICB0eXBlOiAncmVhZCcsXHJcbiAgICAgICAgICBib2R5OiB7IHJlc291cmNlOiBzdG9yYWdlLnVybCArICcvJyArIHN0b3JhZ2UucmVzb3VyY2UsIHAycDogdHJ1ZSB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKF90aGlzLm1ldGFkYXRhLnAycFJlcXVlc3RlciAmJiBfdGhpcy5tZXRhZGF0YS5wMnBIYW5kbGVyKSB7XHJcbiAgICAgICAgICBtc2cuYm9keS5wMnBSZXF1ZXN0ZXIgPSBfdGhpcy5tZXRhZGF0YS5wMnBSZXF1ZXN0ZXI7XHJcbiAgICAgICAgICBtc2cuYm9keS5wMnBIYW5kbGVyID0gX3RoaXMubWV0YWRhdGEucDJwSGFuZGxlcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGdldCB0aGUgcmVzb3VyY2UgZmlyc3Qgb24gdGhlIExvY2FsIEh5cGVydHkgUmVzb3VyY2UgU3RvcmFnZTtcclxuICAgICAgICBfdGhpcy5fZ2V0QmVzdFJlc291cmNlKG1zZywgY2FsbGJhY2spLnRoZW4oKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICBsb2cuaW5mbygnW0h5cGVydHlSZXNvdXJjZV0gLSBnZXQgbG9jYWxseSB0aGUgcmVzb3VyY2U6JywgcmVwbHkpO1xyXG4gICAgICAgICAgcmVzb2x2ZShfdGhpcyk7XHJcbiAgICAgICAgfSkuY2F0Y2goKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgICAgbG9nLndhcm4oJ1tIeXBlcnR5UmVzb3VyY2VdIC0gZ2V0IGxvY2FsbHkgdGhlIHJlc291cmNlIGZhaWwnLCByZXBseSk7XHJcblxyXG4gICAgICAgICAgLy8gR2VuZXJhdGUgbmV3IG1lc3NhZ2UgdG8gbm90IHVzZSB0aGUgc2FtZSBpZCBvZiB0aGUgbGFzdCBvbmU7XHJcbiAgICAgICAgICBsZXQgbXNnID0ge1xyXG4gICAgICAgICAgICBmcm9tOiBfdGhpcy5fb3duZXIsXHJcbiAgICAgICAgICAgIHRvOiBzdG9yYWdlLnJlbW90ZVVSTCxcclxuICAgICAgICAgICAgdHlwZTogJ3JlYWQnLFxyXG4gICAgICAgICAgICBib2R5OiB7IHJlc291cmNlOiBzdG9yYWdlLnJlbW90ZVVSTCArICcvJyArIHN0b3JhZ2UucmVzb3VyY2UsIHAycDogdHJ1ZSB9XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmIChfdGhpcy5tZXRhZGF0YS5wMnBSZXF1ZXN0ZXIgJiYgX3RoaXMubWV0YWRhdGEucDJwSGFuZGxlcikge1xyXG4gICAgICAgICAgICBtc2cuYm9keS5wMnBSZXF1ZXN0ZXIgPSBfdGhpcy5tZXRhZGF0YS5wMnBSZXF1ZXN0ZXI7XHJcbiAgICAgICAgICAgIG1zZy5ib2R5LnAycEhhbmRsZXIgPSBfdGhpcy5tZXRhZGF0YS5wMnBIYW5kbGVyO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIGdldCB0aGUgcmVzb3VyY2Ugb24gdGhlIFJlbW90ZSBIeXBlcnR5IFJlc291cmNlIFN0b3JhZ2U7XHJcbiAgICAgICAgICBfdGhpcy5fZ2V0QmVzdFJlc291cmNlKG1zZywgY2FsbGJhY2spLnRoZW4oKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKCdbSHlwZXJ0eVJlc291cmNlXSAtIGdldCByZW1vdGVseSB0aGUgcmVzb3VyY2UnLCByZXBseSk7XHJcbiAgICAgICAgICAgIHJlc29sdmUoX3RoaXMpO1xyXG4gICAgICAgICAgfSkuY2F0Y2goKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKCdbSHlwZXJ0eVJlc291cmNlXSAtIGdldCByZW1vdGVseSB0aGUgcmVzb3VyY2UgZmFpbCcsIHJlcGx5KTtcclxuICAgICAgICAgICAgcmVqZWN0KHJlcGx5LmJvZHkuY29kZSArICcgJyArIHJlcGx5LmJvZHkuZGVzYyk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9nZXRCZXN0UmVzb3VyY2UobXNnLCBpblByb2dyZXNzQ2FsbGJhY2spIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGxldCB3YWl0Rm9yUmVzcG9uc2UgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgLy8gSWYgUmVwb3J0ZXIgZG9lcyAgbm90IHJlcGx5IHRoZSBwcm9taXNlIGlzIHJlamVjdGVkXHJcbiAgICAgICAgX3RoaXMuX2J1cy5yZW1vdmVSZXNwb25zZUxpc3RlbmVyKF90aGlzLl9vd25lciwgaWQpO1xyXG5cclxuICAgICAgICBtc2cuYm9keS5jb2RlID0gNDA4O1xyXG4gICAgICAgIG1zZy5ib2R5LmRlc2MgPSAnUmVzcG9uc2UgdGltZW91dCdcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlamVjdChtc2cpO1xyXG5cclxuICAgICAgfSwgMzAwMCk7XHJcblxyXG4gICAgICBsZXQgY2FsbGJhY2sgPSAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdbSHlwZXJ0eVJlc291cmNlLnJlYWRdIHJlcGx5OiAnLCByZXBseSk7XHJcbiAgICAgICAgbGV0IGlkID0gcmVwbHkuaWQ7XHJcblxyXG4gICAgICAgIGNsZWFyVGltZW91dCh3YWl0Rm9yUmVzcG9uc2UpO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKHJlcGx5LmJvZHkuY29kZSkge1xyXG4gICAgICAgICAgY2FzZSAyMDA6XHJcbiAgICAgICAgICAgIF90aGlzLl9jb250ZW50ID0gcmVwbHkuYm9keS52YWx1ZS5jb250ZW50O1xyXG5cclxuICAgICAgICAgICAgLy8gc2F2ZSBsb2NhbGx5IGlmIG5vdCB0b28gYmlnXHJcbiAgICAgICAgICAgIGlmIChyZXBseS5ib2R5LnZhbHVlLnNpemUgPCBfdGhpcy5hcnJheWJ1ZmZlclNpemVMaW1pdCkge1xyXG4gICAgICAgICAgICAgIF90aGlzLnNhdmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgX3RoaXMuX2J1cy5yZW1vdmVSZXNwb25zZUxpc3RlbmVyKF90aGlzLl9vd25lciwgaWQpO1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlcGx5KTtcclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgMTgzOlxyXG4gICAgICAgICAgICBpblByb2dyZXNzQ2FsbGJhY2socmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIF90aGlzLl9idXMucmVtb3ZlUmVzcG9uc2VMaXN0ZW5lcihfdGhpcy5fb3duZXIsIGlkKTtcclxuICAgICAgICAgICAgcmVqZWN0KHJlcGx5KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGxldCBpZCA9IF90aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnLCBjYWxsYmFjaywgZmFsc2UpO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8vIFJlbW92ZSBIeXBlcnR5IGZyb20gdGhlIGxvY2FsIHN0b3JhZ2VcclxuXHJcbiAgZGVsZXRlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsb2cuaW5mbygnW0h5cGVydHlSZXNvdXJjZS5kZWxldGVdJywgX3RoaXMubWV0YWRhdGEpO1xyXG5cclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG4gICAgICBmcm9tOiBfdGhpcy5fb3duZXIsXHJcbiAgICAgIHRvOiBfdGhpcy5fbG9jYWxTdG9yYWdlVVJMLFxyXG4gICAgICB0eXBlOiAnZGVsZXRlJyxcclxuICAgICAgYm9keTogeyByZXNvdXJjZXM6IF90aGlzLm1ldGFkYXRhLmNvbnRlbnRVUkwgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPCAzMDApIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgZWxzZSByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9nZXRCZXN0Q29udGVudFVSTChjb250ZW50VVJMTGlzdCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgY29uc3QgY29udGVudFVSTCA9IGNvbnRlbnRVUkxMaXN0WzBdO1xyXG4gICAgY29uc3Qgc3BsaXRlZFJlc291cmNlID0gY29udGVudFVSTC5zdWJzdHIoY29udGVudFVSTC5sYXN0SW5kZXhPZignLycpICsgMSk7XHJcbiAgICBjb25zdCB1cmwgPSBfdGhpcy5fbG9jYWxTdG9yYWdlVVJMOyAvLyBjb250ZW50VVJMLnN1YnN0cigwLCBjb250ZW50VVJMLmxhc3RJbmRleE9mKCcvJykpO1xyXG4gICAgY29uc3QgcmVtb3RlUmVzb3VyY2UgPSBjb250ZW50VVJMLnN1YnN0cigwLCBjb250ZW50VVJMLmxhc3RJbmRleE9mKCcvJykpO1xyXG5cclxuICAgIHJldHVybiB7dXJsOiB1cmwsIHJlc291cmNlOiBzcGxpdGVkUmVzb3VyY2UsIHJlbW90ZVVSTDogcmVtb3RlUmVzb3VyY2UgfTtcclxuXHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEh5cGVydHlSZXNvdXJjZTtcclxuIiwibGV0IGhhc0Jsb2JDb25zdHJ1Y3RvciA9IHR5cGVvZihCbG9iKSAhPT0gJ3VuZGVmaW5lZCcgJiYgKGZ1bmN0aW9uICgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4obmV3IEJsb2IoKSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59KCkpO1xyXG5cclxubGV0IGhhc0FycmF5QnVmZmVyVmlld1N1cHBvcnQgPSBoYXNCbG9iQ29uc3RydWN0b3IgJiYgdHlwZW9mKFVpbnQ4QXJyYXkpICE9PSAndW5kZWZpbmVkJyAmJiAoZnVuY3Rpb24gKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR1cm4gbmV3IEJsb2IoW25ldyBVaW50OEFycmF5KDEwMCldKS5zaXplID09PSAxMDA7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG59KCkpO1xyXG5cclxubGV0IGhhc1RvQmxvYlN1cHBvcnQgPSAodHlwZW9mIEhUTUxDYW52YXNFbGVtZW50ICE9PSBcInVuZGVmaW5lZFwiID8gSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlLnRvQmxvYiA6IGZhbHNlKTtcclxuXHJcbmxldCBoYXNCbG9iU3VwcG9ydCA9IChoYXNUb0Jsb2JTdXBwb3J0IHx8ICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgYXRvYiAhPT0gJ3VuZGVmaW5lZCcpKTtcclxuXHJcbmxldCBoYXNSZWFkZXJTdXBwb3J0ID0gKHR5cGVvZiBGaWxlUmVhZGVyICE9PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgVVJMICE9PSAndW5kZWZpbmVkJyk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbWFnZVRvb2xzIHtcclxuICAgIHN0YXRpYyByZXNpemUoZmlsZSwgbWF4RGltZW5zaW9ucywgY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAodHlwZW9mIG1heERpbWVuc2lvbnMgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgY2FsbGJhY2sgPSBtYXhEaW1lbnNpb25zO1xyXG4gICAgICAgICAgICBtYXhEaW1lbnNpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgd2lkdGg6IDY0MCxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogNDgwXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbWF4V2lkdGggID0gbWF4RGltZW5zaW9ucy53aWR0aDtcclxuICAgICAgICBsZXQgbWF4SGVpZ2h0ID0gbWF4RGltZW5zaW9ucy5oZWlnaHQ7XHJcblxyXG4gICAgICAgIGlmICghSW1hZ2VUb29scy5pc1N1cHBvcnRlZCgpIHx8ICFmaWxlLnR5cGUubWF0Y2goL2ltYWdlLiovKSkge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhmaWxlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChmaWxlLnR5cGUubWF0Y2goL2ltYWdlXFwvZ2lmLykpIHtcclxuICAgICAgICAgICAgLy8gTm90IGF0dGVtcHRpbmcsIGNvdWxkIGJlIGFuIGFuaW1hdGVkIGdpZlxyXG4gICAgICAgICAgICBjYWxsYmFjayhmaWxlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIFRPRE86IHVzZSBodHRwczovL2dpdGh1Yi5jb20vYW50aW1hdHRlcjE1L3doYW1teSB0byBjb252ZXJ0IGdpZiB0byB3ZWJtXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICBpbWFnZS5vbmxvYWQgPSAoaW1nRXZ0KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCB3aWR0aCAgPSBpbWFnZS53aWR0aDtcclxuICAgICAgICAgICAgbGV0IGhlaWdodCA9IGltYWdlLmhlaWdodDtcclxuICAgICAgICAgICAgbGV0IGlzVG9vTGFyZ2UgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh3aWR0aCA+PSBoZWlnaHQgJiYgd2lkdGggPiBtYXhEaW1lbnNpb25zLndpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB3aWR0aCBpcyB0aGUgbGFyZ2VzdCBkaW1lbnNpb24sIGFuZCBpdCdzIHRvbyBiaWcuXHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgKj0gbWF4RGltZW5zaW9ucy53aWR0aCAvIHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgd2lkdGggPSBtYXhEaW1lbnNpb25zLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgaXNUb29MYXJnZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaGVpZ2h0ID4gbWF4RGltZW5zaW9ucy5oZWlnaHQpIHtcclxuICAgICAgICAgICAgICAgIC8vIGVpdGhlciB3aWR0aCB3YXNuJ3Qgb3Zlci1zaXplIG9yIGhlaWdodCBpcyB0aGUgbGFyZ2VzdCBkaW1lbnNpb25cclxuICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgaGVpZ2h0IGlzIG92ZXItc2l6ZVxyXG4gICAgICAgICAgICAgICAgd2lkdGggKj0gbWF4RGltZW5zaW9ucy5oZWlnaHQgLyBoZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBtYXhEaW1lbnNpb25zLmhlaWdodDtcclxuICAgICAgICAgICAgICAgIGlzVG9vTGFyZ2UgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoIWlzVG9vTGFyZ2UpIHtcclxuICAgICAgICAgICAgICAgIC8vIGVhcmx5IGV4aXQ7IG5vIG5lZWQgdG8gcmVzaXplXHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhmaWxlLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XHJcbiAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICBsZXQgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhc1RvQmxvYlN1cHBvcnQpIHtcclxuICAgICAgICAgICAgICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhibG9iLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0sIGZpbGUudHlwZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYmxvYiA9IEltYWdlVG9vbHMuX3RvQmxvYihjYW52YXMsIGZpbGUudHlwZSk7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhibG9iLCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgSW1hZ2VUb29scy5fbG9hZEltYWdlKGltYWdlLCBmaWxlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIF90b0Jsb2IoY2FudmFzLCB0eXBlKSB7XHJcbiAgICAgICAgbGV0IGRhdGFVUkkgPSBjYW52YXMudG9EYXRhVVJMKHR5cGUpO1xyXG4gICAgICAgIGxldCBkYXRhVVJJUGFydHMgPSBkYXRhVVJJLnNwbGl0KCcsJyk7XHJcbiAgICAgICAgbGV0IGJ5dGVTdHJpbmc7XHJcbiAgICAgICAgaWYgKGRhdGFVUklQYXJ0c1swXS5pbmRleE9mKCdiYXNlNjQnKSA+PSAwKSB7XHJcbiAgICAgICAgICAgIC8vIENvbnZlcnQgYmFzZTY0IHRvIHJhdyBiaW5hcnkgZGF0YSBoZWxkIGluIGEgc3RyaW5nOlxyXG4gICAgICAgICAgICBieXRlU3RyaW5nID0gYXRvYihkYXRhVVJJUGFydHNbMV0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIENvbnZlcnQgYmFzZTY0L1VSTEVuY29kZWQgZGF0YSBjb21wb25lbnQgdG8gcmF3IGJpbmFyeSBkYXRhOlxyXG4gICAgICAgICAgICBieXRlU3RyaW5nID0gZGVjb2RlVVJJQ29tcG9uZW50KGRhdGFVUklQYXJ0c1sxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XHJcbiAgICAgICAgbGV0IGludEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpICs9IDEpIHtcclxuICAgICAgICAgICAgaW50QXJyYXlbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbWltZVN0cmluZyA9IGRhdGFVUklQYXJ0c1swXS5zcGxpdCgnOicpWzFdLnNwbGl0KCc7JylbMF07XHJcbiAgICAgICAgbGV0IGJsb2IgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoaGFzQmxvYkNvbnN0cnVjdG9yKSB7XHJcbiAgICAgICAgICAgIGJsb2IgPSBuZXcgQmxvYihcclxuICAgICAgICAgICAgICAgIFtoYXNBcnJheUJ1ZmZlclZpZXdTdXBwb3J0ID8gaW50QXJyYXkgOiBhcnJheUJ1ZmZlcl0sXHJcbiAgICAgICAgICAgICAgICB7dHlwZTogbWltZVN0cmluZ31cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgYmIgPSBuZXcgQmxvYkJ1aWxkZXIoKTtcclxuICAgICAgICAgICAgYmIuYXBwZW5kKGFycmF5QnVmZmVyKTtcclxuICAgICAgICAgICAgYmxvYiA9IGJiLmdldEJsb2IobWltZVN0cmluZyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYmxvYjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgX2xvYWRJbWFnZShpbWFnZSwgZmlsZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBpZiAodHlwZW9mKFVSTCkgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZXZ0KSB7XHJcbiAgICAgICAgICAgICAgICBpbWFnZS5zcmMgPSBldnQudGFyZ2V0LnJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykgeyBjYWxsYmFjaygpOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaW1hZ2Uuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7IGNhbGxiYWNrKCk7IH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHN0YXRpYyBpc1N1cHBvcnRlZCgpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgICAodHlwZW9mKEhUTUxDYW52YXNFbGVtZW50KSAhPT0gJ3VuZGVmaW5lZCcpIFxyXG4gICAgICAgICAgICAmJiBoYXNCbG9iU3VwcG9ydFxyXG4gICAgICAgICAgICAmJiBoYXNSZWFkZXJTdXBwb3J0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG4iLCIvKipcclxuKiBUaGUgSHlwZXJ0eSBSZXNvdXJjZSBEYXRhIE1vZGVsIGlzIHVzZWQgdG8gbW9kZWwgcmVzb3VjZXMgaGFuZGxlZCBieSBIeXBlcnRpZXMgYW5kIERhdGEgT2JqZWN0cyBpbmNsdWRpbmcgY2hhdCBtZXNzYWdlcywgZmlsZXMsIHJlYWwgdGltZSBodW1hbiBhdWRpbyBhbmQgdmlkZW8uLlxyXG4qXHJcbiovXHJcblxyXG4vLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdGaWxlSHlwZXJ0eVJlc291cmNlJyk7XHJcblxyXG5pbXBvcnQgSHlwZXJ0eVJlc291cmNlIGZyb20gJy4vSHlwZXJ0eVJlc291cmNlJztcclxuaW1wb3J0IHsgZGVlcENsb25lIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuanMnO1xyXG5pbXBvcnQgSW1hZ2VUb29scyBmcm9tICcuLi91dGlscy9JbWFnZVRvb2xzLmpzJztcclxuXHJcblxyXG5jbGFzcyBGaWxlSHlwZXJ0eVJlc291cmNlIGV4dGVuZHMgSHlwZXJ0eVJlc291cmNlIHtcclxuXHJcbiAgLyoqXHJcbiAgKiBGaWxlSHlwZXJ0eVJlc291cmNlIGNvbnN0cnVjdG9yXHJcbiAgKlxyXG4gICogQHBhcmFtICB7VVJMfSBvd25lciBIeXBlcnR5VVJMIG9mIHRoZSBIeXBlcnR5IGhhbmRsaW5nIHRoaXMgcmVzb3VyY2VcclxuICAqIEBwYXJhbSAge1VSTH0gcnVudGltZSBSdW50aW1lIFVSTCB3aGVyZSB0aGlzIHJlc291cmNlIGlzIGhvc3RlZFxyXG4gICogQHBhcmFtICB7QnVzfSBidXMgc2FuZGJveCBtZXNzYWdlIGJ1c1xyXG4gICogQHBhcmFtICB7RGF0YU9iamVjdH0gcGFyZW50IFBhcmVudCBEYXRhIE9iamVjdCB3aGVyZSB0aGUgSHlwZXJ0eVJlc291cmNlIGlzIGhhbmRsZWQgYXMgYSBjaGlsZFxyXG4gICogQHBhcmFtICB7RmlsZX0gZmlsZSBmaWxlIHRvIGJlIGVuY29kZWQgYXMgSHlwZXJ0eVJlc291cmNlXHJcbiAgKiBAcGFyYW0gIHtCb29sZWFufSBpc1JlcG9ydGVyIGluZGljYXRlcyBpZiBwYXJlbnQgaXMgUmVwb3J0ZXIgb3IgYW4gT2JzZXJ2ZXJcclxuICAqIEBwYXJhbSAge0FycmF5fSBpbnB1dCBvcHRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzXHJcbiAgKi9cclxuXHJcbiAgY29uc3RydWN0b3IoaXNTZW5kZXIsIGlucHV0KSB7XHJcblxyXG4gICAgc3VwZXIoaXNTZW5kZXIsIGlucHV0KTtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLm1ldGFkYXRhLnJlc291cmNlVHlwZSA9ICdmaWxlJztcclxuXHJcbiAgfVxyXG5cclxuICBpbml0KGZpbGUpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgaWYgKCFmaWxlKSB0aHJvdyBuZXcgRXJyb3IoJ1tGaWxlSHlwZXJ0eVJlc291cmNlLmNvbnN0cnVjdG9yXSBtaXNzaW5nIG1hbmRhdG9yeSAqZmlsZSogaW5wdXQgJyk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgX3RoaXMuX21ldGFkYXRhLm5hbWUgPSBmaWxlLm5hbWU7XHJcbiAgICAgIF90aGlzLl9tZXRhZGF0YS5sYXN0TW9kaWZpZWQgPSBmaWxlLmxhc3RNb2RpZmllZDtcclxuICAgICAgX3RoaXMuX21ldGFkYXRhLnNpemUgPSBmaWxlLnNpemU7XHJcbiAgICAgIF90aGlzLl9tZXRhZGF0YS5taW1ldHlwZSA9IGZpbGUudHlwZTtcclxuXHJcbiAgICAgIGxvZy5sb2coJ1tGaWxlSHlwZXJ0eVJlc291cmNlLmluaXRdIGZpbGU6ICcsIGZpbGUpO1xyXG5cclxuICAgICAgaWYgKF90aGlzLl9pc1NlbmRlcikge1xyXG5cclxuICAgICAgICBsZXQgbWltZXR5cGUgPSBmaWxlLnR5cGUuc3BsaXQoJy8nKVswXTtcclxuXHJcbiAgICAgICAgc3dpdGNoIChtaW1ldHlwZSkge1xyXG4gICAgICAgICAgY2FzZSAnaW1hZ2UnIDpcclxuICAgICAgICAgICAgX3RoaXMuX2dldEltYWdlUHJldmlldyhmaWxlKS50aGVuKChwcmV2aWV3KT0+e1xyXG4gICAgICAgICAgICAgIF90aGlzLl9tZXRhZGF0YS5wcmV2aWV3ID0gcHJldmlldztcclxuICAgICAgICAgICAgICBfdGhpcy5fY29udGVudCA9IGZpbGU7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0IDpcclxuICAgICAgICAgICAgX3RoaXMuX2NvbnRlbnQgPSBmaWxlO1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgdG9vIGJpZyBsZXRzIHN0b3JlIGFzIEZpbGUgYW5kIGFzQXJyYXkgQnVmZmVyXHJcblxyXG4gICAgICAvLyAgaWYgKGZpbGUuc2l6ZSA+IF90aGlzLmFycmF5YnVmZmVyU2l6ZUxpbWl0KSB7XHJcbiAgICAgIC8qICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG5cclxuICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbih0aGVGaWxlKSB7XHJcblxyXG4gICAgICAgICAgICBsb2cubG9nKCdbRmlsZUh5cGVydHlSZXNvdXJjZS5pbml0XSBmaWxlIGxvYWRlZCAnLCB0aGVGaWxlKTtcclxuXHJcbiAgICAgICAgICAgIF90aGlzLl9jb250ZW50ID0gdGhlRmlsZS50YXJnZXQucmVzdWx0O1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcblxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcclxuXHJcbiAgICAgICAgfSovXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgIF90aGlzLl9jb250ZW50ID0gZmlsZS5jb250ZW50O1xyXG4gICAgICBpZiAoZmlsZS5wcmV2aWV3KSBfdGhpcy5fbWV0YWRhdGEucHJldmlldyA9IGZpbGUucHJldmlldztcclxuICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gX2dldEltYWdlUHJldmlldyhpbWFnZSl7XHJcbiAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e1xyXG5cclxuICAgSW1hZ2VUb29scy5yZXNpemUoaW1hZ2UsIHtcclxuICAgICAgICB3aWR0aDogMTAwLCAvLyBtYXhpbXVtIHdpZHRoXHJcbiAgICAgICAgaGVpZ2h0OiAxMDAgLy8gbWF4aW11bSBoZWlnaHRcclxuICAgIH0sIGZ1bmN0aW9uKGJsb2IsIGRpZEl0UmVzaXplKSB7XHJcbiAgICAgICAgLy8gZGlkSXRSZXNpemUgd2lsbCBiZSB0cnVlIGlmIGl0IG1hbmFnZWQgdG8gcmVzaXplIGl0LCBvdGhlcndpc2UgZmFsc2UgKGFuZCB3aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgZmlsZSBhcyAnYmxvYicpXHJcbiAgICAgICAgaWYgKGRpZEl0UmVzaXplKSB7XHJcbiAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuXHJcbiAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24odGhlSW1hZ2UpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh0aGVJbWFnZS50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxvZy53YXJuKCdbRmlsZUh5cGVydHlSZXNvdXJjZS5fZ2V0SW1hZ2VQcmV2aWV3XSB1bmFibGUgdG8gY3JlYXRlIGltYWdlIHByZXZpZXcgZnJvbSBvcmlnaW5hbCBpbWFnZSAnKTtcclxuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0pO1xyXG4gfVxyXG5cclxuXHJcblxyXG4gIGdldCBuYW1lKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fbWV0YWRhdGEubmFtZTtcclxuICB9XHJcblxyXG4gIGdldCBwcmV2aWV3KCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5fbWV0YWRhdGEucHJldmlldztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogU2hhcmUgZmlsZSBhcyBhIGRhdGEgb2JqZWN0IGNoaWxkIG9mIGEgZGF0YSBvYmplY3QgcGFyZW50XHJcbiAgKlxyXG4gICogQHBhcmFtICB7c3RyaW5nfSBjaGlsZHJlbiBEYXRhIE9iamVjdCBQYXJlbnQgY2hpbGRyZW4gbmFtZSB3aGVyZSB0aGUgZmlsZSBpcyBzaGFyZWRcclxuICAqL1xyXG5cclxuLyogIHNoYXJlKGNoaWxkcmVuKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgLy90byBiZSBpbXByb3ZlZCBhbmQgYWRhcHRlZFxyXG5cclxuICAgICAgaWYgKCFfdGhpcy5faXNTZW5kZXIpIHJldHVybiByZWplY3QoJ1tGaWxlSHlwZXJ0eVJlc291cmNlLnNoYXJlXSBPYnNlcnZlcnMgY2FuIG5vdCBzaGFyZSBmaWxlcycpO1xyXG5cclxuICAgICAgbGV0IGZpbGUyc2hhcmUgPSBfdGhpcy5fbWV0YWRhdGE7XHJcbiAgICAgIGZpbGUyc2hhcmUudHlwZSA9IF90aGlzLl90eXBlO1xyXG5cclxuICAgICAgX3RoaXMuX3BhcmVudC5hZGRDaGlsZChjaGlsZHJlbiwgZmlsZTJzaGFyZSkudGhlbihmdW5jdGlvbihkYXRhT2JqZWN0Q2hpbGQpIHtcclxuICAgICAgICBsb2cubG9nKCdbRmlsZUh5cGVydHlSZXNvdXJjZS5zaGFyZV0gb2JqZWN0IGNoaWxkOiAnLCBkYXRhT2JqZWN0Q2hpbGQpO1xyXG5cclxuICAgICAgICBsZXQgc2hhcmVkRmlsZSA9IGRhdGFPYmplY3RDaGlsZC5kYXRhO1xyXG5cclxuICAgICAgICByZXNvbHZlKHNoYXJlZEZpbGUpO1xyXG5cclxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24ocmVhc29uKSB7XHJcbiAgICAgICAgbG9nLmVycm9yKCdSZWFzb246JywgcmVhc29uKTtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH0qL1xyXG5cclxuICAvKipcclxuICAqIFJldHVybnMgZmlsZSBjb250ZW50IG9wdGltaXNlZCB0byBiZSBkaXNwbGF5ZWQgaW4gYSBtZXNzYWdlIGxpbmVcclxuICAqXHJcbiAgKiBAcGFyYW0gIHtzdHJpbmd9IGNoaWxkcmVuIERhdGEgT2JqZWN0IFBhcmVudCBjaGlsZHJlbiBuYW1lIHdoZXJlIHRoZSBmaWxlIGlzIHNoYXJlZFxyXG4gICovXHJcblxyXG4gIHRvTWVzc2FnZSgpIHtcclxuICAgIC8vVE9ETzogdG8gYmUgaW1wbGVtZW50ZWQuIEl0IHNob3VsZCByZXR1cm4gSFRNTCB3aXRoIGltZyBhdHRyaWJ1dGUgYXMgYSB0aHVtYm5haWwgcGx1cyB0aGUgbmFtZS5cclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRmlsZUh5cGVydHlSZXNvdXJjZTtcclxuIiwiLyoqXHJcbiogVGhlIEh5cGVydHkgUmVzb3VyY2UgRGF0YSBNb2RlbCBpcyB1c2VkIHRvIG1vZGVsIHJlc291Y2VzIGhhbmRsZWQgYnkgSHlwZXJ0aWVzIGFuZCBEYXRhIE9iamVjdHMgaW5jbHVkaW5nIGNoYXQgbWVzc2FnZXMsIGZpbGVzLCByZWFsIHRpbWUgaHVtYW4gYXVkaW8gYW5kIHZpZGVvLi5cclxuKlxyXG4qL1xyXG5cclxuaW1wb3J0IEZpbGVIeXBlcnR5UmVzb3VyY2UgZnJvbSAnLi9GaWxlSHlwZXJ0eVJlc291cmNlJztcclxuXHJcbmNsYXNzIEh5cGVydHlSZXNvdXJjZUZhY3Rvcnkge1xyXG5cclxuICAvKipcclxuICAqIEh5cGVydHlSZXNvdXJjZUZhY3RvcnkgY29uc3RydWN0b3JcclxuICAqXHJcbiAgKi9cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgY3JlYXRlSHlwZXJ0eVJlc291cmNlKGlzU2VuZGVyLCB0eXBlLCBtZXRhZGF0YSkge1xyXG4gICAgbGV0IG5ld0h5cGVydHlSZXNvdXJjZTtcclxuXHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSAnZmlsZSc6XHJcbiAgICAgICAgbmV3SHlwZXJ0eVJlc291cmNlID0gbmV3IEZpbGVIeXBlcnR5UmVzb3VyY2UoaXNTZW5kZXIsIG1ldGFkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tIeXBlcnR5UmVzb3VyY2VGYWN0b3J5LmNyZWF0ZUh5cGVydHlSZXNvdXJjZV0gbm90IHN1cHBvcnRlZCB0eXBlOiAnLCB0eXBlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuKG5ld0h5cGVydHlSZXNvdXJjZSk7XHJcblxyXG4gIH1cclxuXHJcbiAgY3JlYXRlSHlwZXJ0eVJlc291cmNlV2l0aENvbnRlbnQoaXNTZW5kZXIsIHR5cGUsIGNvbnRlbnQsIG1ldGFkYXRhKSB7XHJcbiAgICBsZXQgbmV3SHlwZXJ0eVJlc291cmNlO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG5cclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICdmaWxlJzpcclxuICAgICAgICBuZXdIeXBlcnR5UmVzb3VyY2UgPSBuZXcgRmlsZUh5cGVydHlSZXNvdXJjZShpc1NlbmRlciwgbWV0YWRhdGEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBuZXdIeXBlcnR5UmVzb3VyY2UuaW5pdChjb250ZW50KS50aGVuKCgpPT57XHJcbiAgICAgICAgcmV0dXJuIG5ld0h5cGVydHlSZXNvdXJjZS5zYXZlKCk7Ly8gc2tpcCBzYXZlP1xyXG4gICAgICB9KS50aGVuKCgpPT57XHJcbiAgICAgICAgcmVzb2x2ZShuZXdIeXBlcnR5UmVzb3VyY2UpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgfSk7XHJcblxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgSHlwZXJ0eVJlc291cmNlRmFjdG9yeTtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignRGF0YU9iamVjdCcpO1xyXG5cclxuaW1wb3J0IFN5bmNPYmplY3QsIHsgQ2hhbmdlVHlwZSwgT2JqZWN0VHlwZSB9IGZyb20gJy4vUHJveHlPYmplY3QnO1xyXG5pbXBvcnQgRGF0YU9iamVjdENoaWxkIGZyb20gJy4vRGF0YU9iamVjdENoaWxkJztcclxuaW1wb3J0IEhlYXJ0QmVhdCBmcm9tICcuL0hlYXJ0QmVhdCc7XHJcbmltcG9ydCB7IGRlZXBDbG9uZSwgZGl2aWRlVVJMIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuanMnO1xyXG5pbXBvcnQgSHlwZXJ0eVJlc291cmNlRmFjdG9yeSBmcm9tICcuLi9oeXBlcnR5LXJlc291cmNlL0h5cGVydHlSZXNvdXJjZUZhY3RvcnkuanMnO1xyXG5cclxuLyoqXHJcbiAqIE1haW4gZXh0ZW5zaW9uIGNsYXNzIGZvciBvYnNlcnZlcnMgYW5kIHJlcG9ydGVycywgd2l0aCBjb21tb24gcHJvcGVydGllcyBhbmQgbWV0aG9kcy5cclxuICogQ2hpbGRyZW4gbWFuYWdlbWVudCBpcyBjb21tb24gZm9yIG9ic2VydmVycyBhbmQgcmVwb3J0ZXJzLlxyXG4gKi9cclxuY2xhc3MgRGF0YU9iamVjdCB7XHJcbiAgLyogcHJpdmF0ZVxyXG4gIF92ZXJzaW9uOiBudW1iZXJcclxuXHJcbiAgX293bmVyOiBIeXBlcnR5VVJMXHJcbiAgX3VybDogT2JqZWN0VVJMXHJcbiAgX3NjaGVtYTogU2NoZW1hXHJcbiAgX2J1czogTWluaUJ1c1xyXG4gIF9zdGF0dXM6IG9uIHwgcGF1c2VkXHJcbiAgX3N5bmNPYmo6IFN5bmNEYXRhXHJcblxyXG4gIF9jaGlsZHJlbjogeyBpZDogRGF0YU9iamVjdENoaWxkIH1cclxuICBfY2hpbGRyZW5MaXN0ZW5lcjogW01zZ0xpc3RlbmVyXVxyXG5cclxuICAtLS0tZXZlbnQgaGFuZGxlcnMtLS0tXHJcbiAgX29uQWRkQ2hpbGRIYW5kbGVyOiAoZXZlbnQpID0+IHZvaWRcclxuICAqL1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICogU2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IEh5cGVydGllcy4gSXQncyBjYWxsZWQgYnkgdGhlIFN5bmNoZXIgY3JlYXRlIG9yIHN1YnNjcmliZSBtZXRob2Qnc1xyXG4gICAqL1xyXG5cclxuICBjb25zdHJ1Y3RvcihpbnB1dCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBmdW5jdGlvbiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IocGFyKSB7XHJcbiAgICAgIHRocm93ICdbRGF0YU9iamVjdF0gJyArIHBhciArICcgbWFuZGF0b3J5IHBhcmFtZXRlciBpcyBtaXNzaW5nJztcclxuICAgIH1cclxuXHJcbiAgICBpbnB1dC5zeW5jaGVyID8gX3RoaXMuX3N5bmNoZXIgPSBpbnB1dC5zeW5jaGVyIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdzeW5jaGVyJyk7XHJcbiAgICBpbnB1dC51cmwgPyBfdGhpcy5fdXJsID0gaW5wdXQudXJsIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCd1cmwnKTtcclxuICAgIGlucHV0LmNyZWF0ZWQgPyBfdGhpcy5fY3JlYXRlZCA9IGlucHV0LmNyZWF0ZWQgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ2NyZWF0ZWQnKTtcclxuICAgIGlucHV0LnJlcG9ydGVyID8gX3RoaXMuX3JlcG9ydGVyID0gaW5wdXQucmVwb3J0ZXIgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ3JlcG9ydGVyJyk7XHJcbiAgICBpbnB1dC5ydW50aW1lID8gX3RoaXMuX3J1bnRpbWUgPSBpbnB1dC5ydW50aW1lIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdydW50aW1lJyk7XHJcbiAgICBpbnB1dC5zY2hlbWEgPyBfdGhpcy5fc2NoZW1hID0gaW5wdXQuc2NoZW1hIDogdGhyb3dNYW5kYXRvcnlQYXJtTWlzc2luZ0Vycm9yKCdzY2hlbWEnKTtcclxuICAgIGlucHV0Lm5hbWUgPyBfdGhpcy5fbmFtZSA9IGlucHV0Lm5hbWUgOiB0aHJvd01hbmRhdG9yeVBhcm1NaXNzaW5nRXJyb3IoJ25hbWUnKTtcclxuXHJcblxyXG4gICAgX3RoaXMuX3N0YXR1cyA9IGlucHV0LnN0YXR1cztcclxuXHJcbiAgICBpZiAoaW5wdXQuZGF0YSkge1xyXG4gICAgICBfdGhpcy5fc3luY09iaiA9IG5ldyBTeW5jT2JqZWN0KGlucHV0LmRhdGEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgX3RoaXMuX3N5bmNPYmogPSBuZXcgU3luY09iamVjdCh7fSk7XHJcbiAgICB9XHJcbiAgICBfdGhpcy5fY2hpbGRyZW5zID0gaW5wdXQuY2hpbGRyZW5zO1xyXG5cclxuICAgIC8vVE9ETzogRm9yIEZ1cnRoZXIgU3R1ZHlcclxuICAgIF90aGlzLl9tdXR1YWwgPSBpbnB1dC5tdXR1YWw7XHJcblxyXG4gICAgX3RoaXMuX3ZlcnNpb24gPSAwO1xyXG4gICAgX3RoaXMuX2NoaWxkSWQgPSAxO1xyXG4gICAgX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXI7IC8vYnVzIGxpc3RlbmVyIGZvciBjaGlsZHJlblxyXG4gICAgX3RoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyOyAvL0h5cGVydHkgc2lkZSBoYW5kbGVycyB0byBwcm9jZXNzIGNoaWxkIG9iamVjdHMgY3JlYXRlZCBieSByZW1vdGUgSHlwZXJ0aWVzXHJcblxyXG4gICAgX3RoaXMuX3Jlc3VtZWQgPSBpbnB1dC5yZXN1bWU7XHJcblxyXG4gICAgaWYgKGlucHV0LnJlc3VtZSkgeyBfdGhpcy5fdmVyc2lvbiA9IGlucHV0LnZlcnNpb247IH1cclxuXHJcbiAgICBfdGhpcy5fb3duZXIgPSBpbnB1dC5zeW5jaGVyLl9vd25lcjtcclxuICAgIF90aGlzLl9idXMgPSBpbnB1dC5zeW5jaGVyLl9idXM7XHJcblxyXG4gICAgaWYgKGlucHV0LmRlc2NyaXB0aW9uKSBfdGhpcy5fZGVzY3JpcHRpb24gPSBpbnB1dC5kZXNjcmlwdGlvbjtcclxuICAgIGlmIChpbnB1dC50YWdzKSBfdGhpcy5fdGFncyA9IGlucHV0LnRhZ3M7XHJcbiAgICBpZiAoaW5wdXQucmVzb3VyY2VzKSBfdGhpcy5fcmVzb3VyY2VzID0gaW5wdXQucmVzb3VyY2VzO1xyXG4gICAgaWYgKGlucHV0Lm9ic2VydmVyU3RvcmFnZSkgX3RoaXMuX29ic2VydmVyU3RvcmFnZSA9IGlucHV0Lm9ic2VydmVyU3RvcmFnZTtcclxuICAgIGlmIChpbnB1dC5wdWJsaWNPYnNlcnZhdGlvbikgX3RoaXMuX3B1YmxpY09ic2VydmF0aW9uID0gaW5wdXQucHVibGljT2JzZXJ2YXRpb247XHJcblxyXG4gICAgX3RoaXMuX21ldGFkYXRhID0gT2JqZWN0LmFzc2lnbihpbnB1dCk7XHJcblxyXG4gICAgLy8gICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0XSBtdXR1YWwgJywgX3RoaXMuX21ldGFkYXRhLm11dHVhbCk7XHJcblxyXG4gICAgaWYgKCFpbnB1dC5oYXNPd25Qcm9wZXJ0eSgncmVzdW1lJykgfHwgKGlucHV0Lmhhc093blByb3BlcnR5KCdyZXN1bWUnKSAmJiAhaW5wdXQucmVzdW1lKSkge1xyXG4gICAgICBfdGhpcy5fbWV0YWRhdGEubGFzdE1vZGlmaWVkID0gX3RoaXMuX21ldGFkYXRhLmNyZWF0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlIF90aGlzLl9tZXRhZGF0YS5kYXRhO1xyXG4gICAgZGVsZXRlIF90aGlzLl9tZXRhZGF0YS5zeW5jaGVyO1xyXG4gICAgZGVsZXRlIF90aGlzLl9tZXRhZGF0YS5hdXRob3Jpc2U7XHJcblxyXG4gICAgX3RoaXMuX2h5cGVydHlSZXNvdXJjZUZhY3RvcnkgPSBuZXcgSHlwZXJ0eVJlc291cmNlRmFjdG9yeSgpO1xyXG4gICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0cyA9IHt9O1xyXG4gICAgX3RoaXMuX3NoYXJlZENoaWxkcyA9IFtdOyAvL2NoaWxkT2JqZWN0cyB0aGF0IHdlcmUgbm90IHNlbnQgeWV0IHRvIFJlcG9ydGVyc1xyXG5cclxuICAgIGlmIChpbnB1dC5iYWNrdXAgJiYgX3RoaXMuX2NoaWxkcmVucykge1xyXG4gICAgICBsZXQgbGFzdEhlYXJ0YmVhdCA9IChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgnY2hpbGRyZW5PYmplY3RzJykgJiYgaW5wdXQuY2hpbGRyZW5PYmplY3RzLmhhc093blByb3BlcnR5KCdoZWFydGJlYXQnKSlcclxuICAgICAgICA/IGlucHV0LmNoaWxkcmVuT2JqZWN0cy5oZWFydGJlYXQgOiAwO1xyXG4gICAgICBfdGhpcy5faGVhcnRCZWF0ID0gbmV3IEhlYXJ0QmVhdChfdGhpcy5fYnVzLCBfdGhpcy5fb3duZXIsIF90aGlzLl9zeW5jaGVyLl9ydW50aW1lVXJsLCB0aGlzLCAxNSwgbGFzdEhlYXJ0YmVhdCk7XHJcbiAgICAgIGlmIChfdGhpcy5fcmVzdW1lZCkgX3RoaXMuX2hlYXJ0QmVhdC5zdGFydCh0cnVlLCBfdGhpcy5tZXRhZGF0YS5pc1JlcG9ydGVyKTtcclxuICAgICAgZWxzZSBfdGhpcy5faGVhcnRCZWF0LnN0YXJ0KGZhbHNlLCBfdGhpcy5tZXRhZGF0YS5pc1JlcG9ydGVyKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfZ2V0TGFzdENoaWxkSWQoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBjaGlsZElkSW50ID0gMDtcclxuICAgIGxldCBjaGlsZElkU3RyaW5nID0gX3RoaXMuX293bmVyICsgJyMnICsgY2hpbGRJZEludDtcclxuXHJcblxyXG4gICAgT2JqZWN0LmtleXMoX3RoaXMuX2NoaWxkcmVucykuZmlsdGVyKChrZXkpID0+IHtcclxuICAgICAgaWYgKF90aGlzLl9jaGlsZHJlbnNba2V5XS5jaGlsZElkID4gY2hpbGRJZFN0cmluZykge1xyXG4gICAgICAgIGNoaWxkSWRTdHJpbmcgPSBfdGhpcy5fY2hpbGRyZW5zW2tleV0uY2hpbGRJZDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGNoaWxkSWRJbnQgPSBOdW1iZXIoY2hpbGRJZFN0cmluZy5zcGxpdCgnIycpWzFdKTtcclxuICB9XHJcblxyXG4gIF9hbGxvY2F0ZUxpc3RlbmVycygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGNoaWxkQmFzZVVSTCA9IF90aGlzLl91cmwgKyAnL2NoaWxkcmVuLyc7XHJcbiAgICBsb2cubG9nKCdbRGF0YSBPYmplY3QgLSBBbGxvY2F0ZUxpc3RlbmVyc10gLSAnLCBfdGhpcy5fY2hpbGRyZW5zKTtcclxuICAgIGlmIChfdGhpcy5fY2hpbGRyZW5zKSB7XHJcbiAgICAgIC8vICAgICAgX3RoaXMuX2NoaWxkcmVucy5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICBsZXQgY2hpbGRVUkwgPSBjaGlsZEJhc2VVUkw7XHJcbiAgICAgIGxldCBsaXN0ZW5lciA9IF90aGlzLl9idXMuYWRkTGlzdGVuZXIoY2hpbGRVUkwsIChtc2cpID0+IHtcclxuICAgICAgICAvL2lnbm9yZSBtc2cgc2VudCBieSBoaW1zZWxmXHJcbiAgICAgICAgaWYgKG1zZy5mcm9tICE9PSB0aGlzLl9vd25lcikge1xyXG4gICAgICAgICAgbG9nLmxvZygnRGF0YU9iamVjdC1DaGlsZHJlbi1SQ1Y6ICcsIG1zZyk7XHJcbiAgICAgICAgICBzd2l0Y2ggKG1zZy50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2NyZWF0ZSc6IF90aGlzLl9vbkNoaWxkQ3JlYXRlKG1zZyk7IGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICdkZWxldGUnOiBsb2cubG9nKG1zZyk7IGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OiBfdGhpcy5fY2hhbmdlQ2hpbGRyZW4obXNnKTsgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXIgPSBsaXN0ZW5lcjtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfcmVsZWFzZUxpc3RlbmVycygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgaWYgKF90aGlzLl9jaGlsZHJlbkxpc3RlbmVyKSB7XHJcbiAgICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVyLnJlbW92ZSgpO1xyXG5cclxuICAgICAgT2JqZWN0LmtleXMoX3RoaXMuX2NoaWxkcmVuT2JqZWN0cykuZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICAvKiAgICAgIGlmIChjaGlsZHJlbiA9PT0gJ3Jlc291cmNlcycpIHtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRyZW5dKS5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuXVtjaGlsZF0uX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7Ki9cclxuICAgICAgICBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkXS5fcmVsZWFzZUxpc3RlbmVycygpO1xyXG4gICAgICAgIC8vICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3luYyBEYXRhIE9iamVjdCBPYnNlcnZlciB3aXRoIGxhc3QgdmVyc2lvbiBvZiBEYXRhIE9iamVjdCBSZXBvcnRlci4gVXNlZnVsIGZvciBSZXN1bWVzXHJcbiAgICovXHJcbiAgc3luYygpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0LnN5bmNdIHN5bmNocm9uaXNpbmcgJyk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGxldCBjcml0ZXJpYSA9IHt9O1xyXG5cclxuICAgICAgaWYgKHRoaXMubWV0YWRhdGEuYmFja3VwUmV2aXNpb24pIGNyaXRlcmlhLmJhY2t1cFJldmlzaW9uID0gdGhpcy5tZXRhZGF0YS5iYWNrdXBSZXZpc2lvbjtcclxuXHJcbiAgICAgIF90aGlzLl9zeW5jaGVyLnJlYWQoX3RoaXMuX21ldGFkYXRhLnVybCwgY3JpdGVyaWEpLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0LnN5bmNdIHZhbHVlIHRvIHN5bmM6ICcsIHZhbHVlKTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihfdGhpcy5kYXRhLCBkZWVwQ2xvbmUodmFsdWUuZGF0YSkpO1xyXG5cclxuICAgICAgICBfdGhpcy5fdmVyc2lvbiA9IHZhbHVlLnZlcnNpb247XHJcblxyXG4gICAgICAgIF90aGlzLl9tZXRhZGF0YS5sYXN0TW9kaWZpZWQgPSB2YWx1ZS5sYXN0TW9kaWZpZWQ7XHJcblxyXG4gICAgICAgIC8vVE9ETzogY2hlY2sgZmlyc3QgaWYgdGhlcmUgYXJlIG5ldyBjaGlsZHJlbk9iamVjdHMgdG8gYXZvaWQgb3ZlcmhlYWRcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlLmNoaWxkcmVuT2JqZWN0cykge1xyXG4gICAgICAgICAgX3RoaXMucmVzdW1lQ2hpbGRyZW5zKHZhbHVlLmNoaWxkcmVuT2JqZWN0cyk7XHJcbiAgICAgICAgICBfdGhpcy5fc3RvcmVDaGlsZHJlbnMoKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHJlc29sdmUodHJ1ZSk7XHJcblxyXG5cclxuICAgICAgICAvKmlmICh2YWx1ZS52ZXJzaW9uICE9IF90aGlzLl92ZXJzaW9uKSB7XHJcbiAgICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3Quc3luY10gdXBkYXRpbmcgZXhpc3RpbmcgZGF0YTogJywgX3RoaXMuZGF0YSk7XHJcblxyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihfdGhpcy5kYXRhIHx8IHt9LCBkZWVwQ2xvbmUodmFsdWUuZGF0YSkpO1xyXG5cclxuICAgICAgICAgIF90aGlzLl9tZXRhZGF0YSA9IGRlZXBDbG9uZSh2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgZGVsZXRlIF90aGlzLl9tZXRhZGF0YS5kYXRhO1xyXG5cclxuICAgICAgICAgIF90aGlzLl92ZXJzaW9uID0gdmFsdWUudmVyc2lvbjtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdC5zeW5jXSBleGlzdGluZyBkYXRhIGlzIHVwZGF0ZWQ6ICcsIHZhbHVlKTtcclxuICAgICAgICB9Ki9cclxuXHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3Quc3luY10gc3luYyBmYWlsZWQ6ICcsIHJlYXNvbik7XHJcbiAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuXHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcbiAgcmVzdW1lQ2hpbGRyZW5zKGNoaWxkcmVucykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgY2hpbGRJZFN0cmluZyA9IHRoaXMuX293bmVyLnNwbGl0KCcvJylbM10gKyAnIycgKyB0aGlzLl9jaGlsZElkO1xyXG5cclxuICAgIC8vc2V0dXAgY2hpbGRyZW5zIGRhdGEgZnJvbSBzdWJzY3JpcHRpb25cclxuICAgIC8vICAgIE9iamVjdC5rZXlzKGNoaWxkcmVucykuZm9yRWFjaCgoY2hpbGRyZW5SZXNvdXJjZSkgPT4ge1xyXG4gICAgLy8gICAgICBsZXQgY2hpbGRyZW4gPSBjaGlsZHJlbnNbY2hpbGRyZW5SZXNvdXJjZV07XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBjaGlsZHJlbnM7XHJcblxyXG4gICAgLy9fdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuUmVzb3VyY2VdID0ge307XHJcbiAgICBPYmplY3Qua2V5cyhjaGlsZHJlbikuZm9yRWFjaCgoY2hpbGRJZCkgPT4ge1xyXG4gICAgICBsZXQgbmV3Q2hpbGQgPSBmYWxzZTtcclxuXHJcbi8qICAgICAgICBpZiAoIV90aGlzLl9jaGlsZHJlbk9iamVjdHMuaGFzT3duUHJvcGVydHkoY2hpbGRyZW5SZXNvdXJjZSkpXHJcbiAgICAgICAgICBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuUmVzb3VyY2VdID0ge307Ki9cclxuXHJcbiAgICAgICAgLy8gY2hlY2sgaWYgaXQgaXMgdGhlIGxhc3QgaGVhcnRiZWF0XHJcblxyXG4gICAgICAgIGlmIChjaGlsZElkID09PSAnaGVhcnRiZWF0Jykge1xyXG4vLyAgICAgICAgICBfdGhpcy5faGVhcnRCZWF0Lm9uTmV3SGVhcnRiZWF0KGNoaWxkcmVuW2NoaWxkSWRdLnZhbHVlKTtcclxuLy8gICAgICAgICAgX3RoaXMuX2hlYXJ0QmVhdC5zdGFydCh0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY2hpbGRyZW5bY2hpbGRJZF0uaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykgJiYgY2hpbGRyZW5bY2hpbGRJZF0udmFsdWUucmVzb3VyY2VUeXBlICYmICFfdGhpcy5fY2hpbGRyZW5PYmplY3RzLmhhc093blByb3BlcnR5KGNoaWxkSWQpKSB7XHJcbiAgICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZElkXSA9IF90aGlzLl9yZXN1bWVIeXBlcnR5UmVzb3VyY2UoY2hpbGRyZW5bY2hpbGRJZF0pO1xyXG4gICAgICAgIG5ld0NoaWxkID0gdHJ1ZTtcclxuICAgICAgfSBlbHNlIGlmICghX3RoaXMuX2NoaWxkcmVuT2JqZWN0cy5oYXNPd25Qcm9wZXJ0eShjaGlsZElkKSkge1xyXG5cclxuICAgICAgICBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkSWRdID0gX3RoaXMuX3Jlc3VtZUNoaWxkKGNoaWxkcmVuW2NoaWxkSWRdKTtcclxuICAgICAgICBsb2cubG9nKCdbRGF0YU9iamVjdC5yZXN1bWVDaGlsZHJlbnNdIG5ldyBEYXRhT2JqZWN0Q2hpbGQ6ICcsIF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRJZF0pO1xyXG4gICAgICAgIG5ld0NoaWxkID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5ld0NoaWxkICYmIGNoaWxkSWQgPiBjaGlsZElkU3RyaW5nKSB7XHJcbiAgICAgICAgY2hpbGRJZFN0cmluZyA9IGNoaWxkSWQ7XHJcbiAgICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3RSZXBvcnRlci5yZXN1bWVDaGlsZHJlbnNdIC0gcmVzdW1pbmc6ICcsIHRoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZElkXSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICAgIC8vICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX2NoaWxkSWQgPSBOdW1iZXIoY2hpbGRJZFN0cmluZy5zcGxpdCgnIycpWzFdKTtcclxuXHJcbiAgfVxyXG5cclxuICBfcmVzdW1lQ2hpbGQoaW5wdXQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgY2hpbGRJbnB1dCA9IGlucHV0LnZhbHVlO1xyXG4gICAgY2hpbGRJbnB1dC5wYXJlbnRPYmplY3QgPSBfdGhpcztcclxuICAgIGNoaWxkSW5wdXQucGFyZW50ID0gX3RoaXMuX3VybDtcclxuXHJcbiAgICBsZXQgY2hpbGQgPSBuZXcgRGF0YU9iamVjdENoaWxkKGNoaWxkSW5wdXQpO1xyXG5cclxuICAgIGNoaWxkLmlkZW50aXR5ID0gaW5wdXQuaWRlbnRpdHk7XHJcblxyXG4gICAgbGV0IGV2ZW50ID0ge1xyXG4gICAgICB0eXBlOiAnY3JlYXRlJyxcclxuICAgICAgZnJvbTogY2hpbGQucmVwb3J0ZXIsXHJcbiAgICAgIHVybDogY2hpbGQucGFyZW50LFxyXG4gICAgICB2YWx1ZTogY2hpbGQuZGF0YSxcclxuICAgICAgY2hpbGRJZDogY2hpbGQudXJsLFxyXG4gICAgICBpZGVudGl0eTogY2hpbGQuaWRlbnRpdHksXHJcbiAgICAgIGNoaWxkOiBjaGlsZFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoY2hpbGQucmVzb3VyY2VUeXBlKSB7XHJcbiAgICAgIGV2ZW50LnJlc291cmNlID0gY2hpbGQ7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlmIChfdGhpcy5fb25BZGRDaGlsZHJlbkhhbmRsZXIpIF90aGlzLl9vbkFkZENoaWxkcmVuSGFuZGxlcihldmVudCk7XHJcblxyXG4gICAgcmV0dXJuIGNoaWxkO1xyXG5cclxuICB9XHJcblxyXG4gIF9yZXN1bWVIeXBlcnR5UmVzb3VyY2UoaW5wdXQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgY2hpbGRJbnB1dCA9IGlucHV0LnZhbHVlO1xyXG4gICAgY2hpbGRJbnB1dC5wYXJlbnRPYmplY3QgPSBfdGhpcztcclxuICAgIGNoaWxkSW5wdXQucGFyZW50ID0gX3RoaXMuX3VybDtcclxuXHJcbiAgICBsZXQgaHlwZXJ0eVJlc291cmNlID0gX3RoaXMuX2h5cGVydHlSZXNvdXJjZUZhY3RvcnkuY3JlYXRlSHlwZXJ0eVJlc291cmNlKGZhbHNlLCBjaGlsZElucHV0LnJlc291cmNlVHlwZSwgY2hpbGRJbnB1dClcclxuXHJcbiAgICBoeXBlcnR5UmVzb3VyY2UuaWRlbnRpdHkgPSBpbnB1dC5pZGVudGl0eTtcclxuXHJcbiAgICBsZXQgZXZlbnQgPSB7XHJcbiAgICAgIHR5cGU6ICdjcmVhdGUnLFxyXG4gICAgICBmcm9tOiBoeXBlcnR5UmVzb3VyY2UucmVwb3J0ZXIsXHJcbiAgICAgIHVybDogaHlwZXJ0eVJlc291cmNlLnBhcmVudCxcclxuICAgICAgdmFsdWU6IGh5cGVydHlSZXNvdXJjZS5kYXRhLFxyXG4gICAgICBjaGlsZElkOiBoeXBlcnR5UmVzb3VyY2UudXJsLFxyXG4gICAgICBpZGVudGl0eTogaHlwZXJ0eVJlc291cmNlLmlkZW50aXR5LFxyXG4gICAgICBjaGlsZDogaHlwZXJ0eVJlc291cmNlXHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChoeXBlcnR5UmVzb3VyY2UucmVzb3VyY2VUeXBlKSB7XHJcbiAgICAgIGV2ZW50LnJlc291cmNlID0gaHlwZXJ0eVJlc291cmNlO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBpZiAoX3RoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyKSBfdGhpcy5fb25BZGRDaGlsZHJlbkhhbmRsZXIoZXZlbnQpO1xyXG5cclxuICAgIHJldHVybiBoeXBlcnR5UmVzb3VyY2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBbGwgTWV0YWRhdGEgYWJvdXQgdGhlIERhdGEgT2JqZWN0XHJcbiAgICogQHR5cGUge09iamVjdH0gLVxyXG4gICAqL1xyXG5cclxuICBnZXQgbWV0YWRhdGEoKSB7IHJldHVybiB0aGlzLl9tZXRhZGF0YTsgfVxyXG5cclxuICAvKipcclxuICAgKiBPYmplY3QgVVJMIG9mIHJlcG9ydGVyIG9yIG9ic2VydmVyXHJcbiAgICogQHR5cGUge09iamVjdFVSTH1cclxuICAgKi9cclxuICBnZXQgdXJsKCkgeyByZXR1cm4gdGhpcy5fdXJsOyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9iamVjdCBzY2hlbWEgVVJMICh0aGlzIGZpZWxkIGlzIG5vdCB5ZXQgc3RhYmxlLCBhbmQgaXMgc3Vic2plY3QgdG8gY2hhbmdlKVxyXG4gICAqIEB0eXBlIHtTY2hlbWFVUkx9XHJcbiAgICovXHJcbiAgZ2V0IHNjaGVtYSgpIHsgcmV0dXJuIHRoaXMuX3NjaGVtYTsgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGF0dXMgb2YgdGhlIHJlcG9ydGVyIG9yIG9ic2VydmVyIGNvbm5lY3Rpb24gKHRoaXMgZmllbGQgaXMgbm90IHlldCBzdGFibGUsIGFuZCBpcyBzdWJzamVjdCB0byBjaGFuZ2UpXHJcbiAgICogQHR5cGUge1N0YXR1c30gLSBFbnVtIG9mOiBvbiB8IHBhdXNlZFxyXG4gICAqL1xyXG4gIGdldCBzdGF0dXMoKSB7IHJldHVybiB0aGlzLl9zdGF0dXM7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGF0YSBzdHJ1Y3R1cmUgdG8gYmUgc3luY2hyb25pemVkLlxyXG4gICAqIEB0eXBlIHtKU09OfSAtIEpTT04gc3RydWN0dXJlIHRoYXQgc2hvdWxkIGZvbGxvdyB0aGUgZGVmaW5lZCBzY2hlbWEsIGlmIGFueS5cclxuICAgKi9cclxuICBnZXQgZGF0YSgpIHsgcmV0dXJuIHRoaXMuX3N5bmNPYmouZGF0YTsgfVxyXG5cclxuICAvKipcclxuICAgKiBBbGwgY3JlYXRlZCBjaGlsZHJlbidzIHNpbmNlIHRoZSBzdWJzY3JpcHRpb24sIGRvZXNuJ3QgY29udGFpbiBhbGwgY2hpbGRyZW4ncyBzaW5jZSByZXBvcnRlciBjcmVhdGlvbi5cclxuICAgKiBAdHlwZSB7T2JqZWN0PENoaWxkSWQsIERhdGFPYmplY3RDaGlsZD59XHJcbiAgICovXHJcbiAgZ2V0IGNoaWxkcmVucygpIHsgcmV0dXJuIHRoaXMuX2NoaWxkcmVuT2JqZWN0czsgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcGF1c2UoKSB7XHJcbiAgICAvL1RPRE86IHRoaXMgZmVhdHVyZSBuZWVkcyBtb3JlIGFuYWxpc2VcclxuICAgIHRocm93ICdOb3QgaW1wbGVtZW50ZWQnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHJlc3VtZSgpIHtcclxuICAgIC8vVE9ETzogdGhpcyBmZWF0dXJlIG5lZWRzIG1vcmUgYW5hbGlzZVxyXG4gICAgdGhyb3cgJ05vdCBpbXBsZW1lbnRlZCc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc3RvcCgpIHtcclxuICAgIC8vVE9ETzogc2hvdWxkIHJlbW92ZSB0aGUgc3Vic2NyaXB0aW9uIGFuZCBzZW5kIG1lc3NhZ2UgdW5zdWJzY3JpYmU/XHJcbiAgICB0aHJvdyAnTm90IGltcGxlbWVudGVkJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhbmQgYWRkIGEgRGF0YU9iamVjdENoaWxkIHRvIGEgY2hpbGRyZW4gY29sbGVjdGlvbi5cclxuICAgKiBAcGFyYW0ge0pTT059IGluaXRpYWxEYXRhIC0gSW5pdGlhbCBkYXRhIG9mIHRoZSBjaGlsZFxyXG4gICAqIEBwYXJhbSAge01lc3NhZ2VCb2R5SWRlbnRpdHl9IGlkZW50aXR5IC0gKG9wdGlvbmFsKSBpZGVudGl0eSBkYXRhIHRvIGJlIGFkZGVkIHRvIGlkZW50aXR5IHRoZSB1c2VyIHJlcG9ydGVyLiBUbyBiZSB1c2VkIGZvciBsZWdhY3kgaWRlbnRpdGllcy5cclxuICAgKiBAcGFyYW0gIHtTeW5jQ2hpbGRNZXRhZGF0YX0gaW5wdXQgLSAob3B0aW9uYWwpIEFsbCBhZGRpdGlvbmFsIG1ldGFkYXRhIGFib3V0IHRoZSBEYXRhT2JqZWN0Q2hpbGQuXHJcbiAgICogQHJldHVybiB7UHJvbWlzZTxEYXRhT2JqZWN0Q2hpbGQ+fSAtIFJldHVybiBQcm9taXNlIHRvIGEgbmV3IERhdGFPYmplY3RDaGlsZC5cclxuICAgKi9cclxuXHJcbiAgYWRkQ2hpbGQoaW5pdGlhbERhdGEsIGlkZW50aXR5LCBpbnB1dCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBuZXdDaGlsZDtcclxuXHJcbiAgICAvL3JldHVybnMgcHJvbWlzZSwgaW4gdGhlIGZ1dHVyZSwgdGhlIEFQSSBtYXkgY2hhbmdlIHRvIGFzeW5jaHJvbm91cyBjYWxsXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHJcbiAgICAgIGxldCBtc2dDaGlsZFBhdGggPSBfdGhpcy5fdXJsICsgJy9jaGlsZHJlbi8nO1xyXG5cclxuXHJcbiAgICAgIGxldCBjaGlsZElucHV0ID0gX3RoaXMuX2dldENoaWxkSW5wdXQoaW5wdXQpO1xyXG4gICAgICBjaGlsZElucHV0LmRhdGEgPSBpbml0aWFsRGF0YTtcclxuICAgICAgLy8gICAgICBjaGlsZElucHV0LmNoaWxkcmVuID0gY2hpbGRyZW47XHJcbiAgICAgIG5ld0NoaWxkID0gbmV3IERhdGFPYmplY3RDaGlsZChjaGlsZElucHV0KTtcclxuXHJcbiAgICAgIGlmIChpZGVudGl0eSkgbmV3Q2hpbGQuaWRlbnRpdHkgPSBpZGVudGl0eTtcclxuXHJcbiAgICAgIG5ld0NoaWxkLnNoYXJlKCk7XHJcblxyXG4gICAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3QuYWRkQ2hpbGRdIGFkZGVkICcsIG5ld0NoaWxkKTtcclxuXHJcbiAgICAgIG5ld0NoaWxkLm9uQ2hhbmdlKChldmVudCkgPT4ge1xyXG4gICAgICAgIF90aGlzLl9vbkNoYW5nZShldmVudCwgeyBwYXRoOiBtc2dDaGlsZFBhdGgsIGNoaWxkSWQ6IGNoaWxkSW5wdXQudXJsIH0pO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vICAgICBpZiAoIV90aGlzLl9jaGlsZHJlbk9iamVjdHMuaGFzT3duUHJvcGVydHkoY2hpbGRyZW4pKSBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuXSA9IHt9O1xyXG5cclxuICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZElucHV0LnVybF0gPSBuZXdDaGlsZDtcclxuXHJcbiAgICAgIHJlc29sdmUobmV3Q2hpbGQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfZGVsZXRlQ2hpbGRyZW5zKCkge1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgZGVsZXRlUHJvbWlzZXMgPSBbXTtcclxuXHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5jaGlsZHJlbnMpIHtcclxuICAgICAgICBsb2cubG9nKCdbRGF0YU9iamVjdC5kZWxldGVDaGlsZHJlbnNdJywgX3RoaXMuY2hpbGRyZW5zKTtcclxuICAgICAgICBsZXQgY2hpbGQ7XHJcblxyXG4gICAgICAgIGZvciAoY2hpbGQgaW4gX3RoaXMuY2hpbGRyZW5zKSB7XHJcbiAgICAgICAgICAvLyAgICAgICAgICBsZXQgY2hpbGQ7XHJcblxyXG4gICAgICAgICAgLyogICAgICAgICAgaWYgKGNoaWxkcmVuID09PSAncmVzb3VyY2VzJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjaGlsZCBpbiBfdGhpcy5jaGlsZHJlbnNbY2hpbGRyZW5dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZE9iaiA9IF90aGlzLmNoaWxkcmVuc1tjaGlsZHJlbl1bY2hpbGRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2cubG9nKCdbRGF0YU9iamVjdC5fZGVsZXRlQ2hpbGRyZW5zXSBjaGlsZCcsY2hpbGRPYmopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRPYmoubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoJ3Jlc291cmNlVHlwZScpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVByb21pc2VzLnB1c2goX3RoaXMuY2hpbGRyZW5zW2NoaWxkcmVuXVtjaGlsZF0uZGVsZXRlKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyovXHJcbiAgICAgICAgICBsZXQgY2hpbGRPYmogPSBfdGhpcy5jaGlsZHJlbnNbY2hpbGRdO1xyXG4gICAgICAgICAgbG9nLmxvZygnW0RhdGFPYmplY3QuX2RlbGV0ZUNoaWxkcmVuc10gY2hpbGQnLCBjaGlsZE9iaik7XHJcbiAgICAgICAgICBpZiAoY2hpbGRPYmoubWV0YWRhdGEuaGFzT3duUHJvcGVydHkoJ3Jlc291cmNlVHlwZScpKVxyXG4gICAgICAgICAgICBkZWxldGVQcm9taXNlcy5wdXNoKF90aGlzLmNoaWxkcmVuc1tjaGlsZF0uZGVsZXRlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2cubG9nKCdbRGF0YU9iamVjdC5fZGVsZXRlQ2hpbGRyZW5zXSBwcm9taXNlcyAnLCBkZWxldGVQcm9taXNlcyk7XHJcblxyXG4gICAgICAgIGlmIChkZWxldGVQcm9taXNlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBQcm9taXNlLmFsbChkZWxldGVQcm9taXNlcykudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoJ1tEYXRhT2JqZWN0Ll9kZWxldGVDaGlsZHJlbnNdIGRvbmUnKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSByZXNvbHZlKCdbRGF0YU9iamVjdC5fZGVsZXRlQ2hpbGRyZW5zXSBub3RoaW5nIHRvIGRlbGV0ZScpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgX2dldENoaWxkSW5wdXQoaW5wdXQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgY2hpbGRJbnB1dCA9IE9iamVjdC5hc3NpZ24oe30sIGlucHV0KTtcclxuXHJcbiAgICBfdGhpcy5fY2hpbGRJZCsrO1xyXG5cclxuICAgIC8vcmVtb3ZpbmcgZG9tYWluIGZyb20gY2hpbGRJZCB0byBhdm9pZCBiYWNrdXAgaXNzdWVzIHdpdGggJy4nXHJcblxyXG4gICAgY2hpbGRJbnB1dC51cmwgPSBfdGhpcy5fb3duZXIuc3BsaXQoJy8nKVszXSArICcjJyArIF90aGlzLl9jaGlsZElkO1xyXG5cclxuICAgIGNoaWxkSW5wdXQucGFyZW50T2JqZWN0ID0gX3RoaXM7XHJcbiAgICBjaGlsZElucHV0LnJlcG9ydGVyID0gX3RoaXMuX293bmVyO1xyXG4gICAgY2hpbGRJbnB1dC5jcmVhdGVkID0gKG5ldyBEYXRlKS50b0lTT1N0cmluZygpO1xyXG4gICAgY2hpbGRJbnB1dC5ydW50aW1lID0gX3RoaXMuX3N5bmNoZXIuX3J1bnRpbWVVcmw7XHJcbiAgICBjaGlsZElucHV0LnAycEhhbmRsZXIgPSBfdGhpcy5fc3luY2hlci5fcDJwSGFuZGxlcjtcclxuICAgIGNoaWxkSW5wdXQucDJwUmVxdWVzdGVyID0gX3RoaXMuX3N5bmNoZXIuX3AycFJlcXVlc3RlcjtcclxuICAgIGNoaWxkSW5wdXQuc2NoZW1hID0gX3RoaXMuX3NjaGVtYTtcclxuICAgIGNoaWxkSW5wdXQucGFyZW50ID0gX3RoaXMudXJsO1xyXG4gICAgY2hpbGRJbnB1dC5tdXR1YWwgPSBfdGhpcy5tZXRhZGF0YS5tdXR1YWw7XHJcbiAgICAvLyAgICBjb25zb2xlLmxvZygnW0RhdGFPYmplY3QuX2dldENoaWxkSW5wdXRdIG11dHVhbCAnLCBjaGlsZElucHV0Lm11dHVhbCk7XHJcblxyXG4gICAgcmV0dXJuIGNoaWxkSW5wdXQ7XHJcbiAgfVxyXG5cclxuICBhZGRIeXBlcnR5UmVzb3VyY2UodHlwZSwgcmVzb3VyY2UsIGlkZW50aXR5LCBpbnB1dCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL3JldHVybnMgcHJvbWlzZSwgaW4gdGhlIGZ1dHVyZSwgdGhlIEFQSSBtYXkgY2hhbmdlIHRvIGFzeW5jaHJvbm91cyBjYWxsXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuXHJcbiAgICAgIGxldCBoeXBlcnR5UmVzb3VyY2U7XHJcbiAgICAgIGxldCBtc2dDaGlsZFBhdGggPSBfdGhpcy5fdXJsICsgJy9jaGlsZHJlbi8nO1xyXG5cclxuICAgICAgbGV0IGNoaWxkSW5wdXQgPSBfdGhpcy5fZ2V0Q2hpbGRJbnB1dChpbnB1dCk7XHJcbiAgICAgIC8vICAgICAgY2hpbGRJbnB1dC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xyXG5cclxuICAgICAgX3RoaXMuX2h5cGVydHlSZXNvdXJjZUZhY3RvcnkuY3JlYXRlSHlwZXJ0eVJlc291cmNlV2l0aENvbnRlbnQodHJ1ZSwgdHlwZSwgcmVzb3VyY2UsIGNoaWxkSW5wdXQpLnRoZW4oKHJlc291cmNlKSA9PiB7XHJcbiAgICAgICAgaHlwZXJ0eVJlc291cmNlID0gcmVzb3VyY2U7XHJcblxyXG4gICAgICAgIGlmIChpZGVudGl0eSkgaHlwZXJ0eVJlc291cmNlLmlkZW50aXR5ID0gaWRlbnRpdHk7XHJcblxyXG4gICAgICAgIGh5cGVydHlSZXNvdXJjZS5zaGFyZSgpO1xyXG5cclxuICAgICAgICBsb2cubG9nKCdbRGF0YU9iamVjdC5hZGRIeXBlcnR5UmVzb3VyY2VdIGFkZGVkICcsIGh5cGVydHlSZXNvdXJjZSk7XHJcblxyXG4gICAgICAgIGh5cGVydHlSZXNvdXJjZS5vbkNoYW5nZSgoZXZlbnQpID0+IHtcclxuICAgICAgICAgIF90aGlzLl9vbkNoYW5nZShldmVudCwgeyBwYXRoOiBtc2dDaGlsZFBhdGgsIGNoaWxkSWQ6IGh5cGVydHlSZXNvdXJjZS5jaGlsZElkIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyAgICAgICAgaWYgKCFfdGhpcy5fY2hpbGRyZW5PYmplY3RzLmhhc093blByb3BlcnR5KGNoaWxkcmVuKSkgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlbl0gPSB7fTtcclxuXHJcbiAgICAgICAgX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1toeXBlcnR5UmVzb3VyY2UuY2hpbGRJZF0gPSBoeXBlcnR5UmVzb3VyY2U7XHJcblxyXG4gICAgICAgIHJlc29sdmUoaHlwZXJ0eVJlc291cmNlKTtcclxuICAgICAgfSk7XHJcblxyXG5cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgdGhlIGNhbGxiYWNrIHRvIHByb2Nlc3MgY3JlYXRlIGFuZCBkZWxldGUgb2YgY2hpbGRyZW5zLlxyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQ6IE1zZ0V2ZW50KX0gY2FsbGJhY2tcclxuICAgKiBUT0RPOiBhZGQgY2hpbGRyZW5JZCB0byBzdXBwb3J0IGRpZmZlcmVudCBoYW5kbGVycyBwZXIgY2hpbGRyZW5cclxuICAgKi9cclxuICBvbkFkZENoaWxkKGNhbGxiYWNrKSB7XHJcblxyXG4gICAgdGhpcy5fb25BZGRDaGlsZHJlbkhhbmRsZXIgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgcmVtb3RlIERhdGFPYmplY3QgLT4gYWRkQ2hpbGRcclxuICBfb25DaGlsZENyZWF0ZShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy8gICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0Ll9vbkNoaWxkQ3JlYXRlXSByZWNlaXZlZEJ5ICcgKyBfdGhpcy5fb3duZXIgKyAnIDogJywgbXNnKTtcclxuXHJcbiAgICAvLyBpZiB0aGlzIGlzIGFuIGhlYXJ0YmVhdCBtc2cgZm93YXJkIGl0IHRvIGhlYXRiZWF0IGhhbmRsZXJcclxuXHJcbiAgICBpZiAobXNnLmJvZHkucmVzb3VyY2UgPT09ICdoZWFydGJlYXQnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdC5fb25DaGlsZENyZWF0ZV0gbmV3IGhlYXJ0YmVhdCByZWNlaXZlZCAnICsgbXNnLmJvZHkudmFsdWUpO1xyXG4gICAgICB0aGlzLl9oZWFydEJlYXQub25OZXdIZWFydGJlYXQobXNnLmJvZHkudmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0Ll9vbkNoaWxkQ3JlYXRlXSBuZXcgY2hpbGQgcmVjZWl2ZWRCeSAnICsgX3RoaXMuX293bmVyICsgJyA6ICcsIG1zZyk7XHJcbiAgICAgIGxldCByZXNwb25zZSA9IHtcclxuICAgICAgICBmcm9tOiBtc2cudG8sXHJcbiAgICAgICAgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgIHR5cGU6ICdyZXNwb25zZScsXHJcbiAgICAgICAgaWQ6IG1zZy5pZCxcclxuICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICBjb2RlOiAxMDBcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xyXG5cclxuICAgICAgaWYgKG1zZy5ib2R5LnZhbHVlLnJlc291cmNlVHlwZSkge1xyXG4gICAgICAgIF90aGlzLl9vbkh5cGVydHlSZXNvdXJjZUFkZGVkKG1zZyk7XHJcbiAgICAgIH0gZWxzZSBfdGhpcy5fb25DaGlsZEFkZGVkKG1zZyk7XHJcblxyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIF9vbkNoaWxkQWRkZWQobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGNoaWxkSW5wdXQgPSBkZWVwQ2xvbmUobXNnLmJvZHkudmFsdWUpO1xyXG4gICAgY2hpbGRJbnB1dC5wYXJlbnRPYmplY3QgPSBfdGhpcztcclxuXHJcbiAgICAvLyAgICBsZXQgY2hpbGRyZW4gPSBjaGlsZElucHV0LmNoaWxkcmVuO1xyXG5cclxuICAgIGxldCBuZXdDaGlsZCA9IG5ldyBEYXRhT2JqZWN0Q2hpbGQoY2hpbGRJbnB1dCk7XHJcbiAgICBuZXdDaGlsZC5pZGVudGl0eSA9IG1zZy5ib2R5LmlkZW50aXR5O1xyXG5cclxuXHJcbiAgICAvLyAgICBpZiAoIV90aGlzLl9jaGlsZHJlbk9iamVjdHMuaGFzT3duUHJvcGVydHkoY2hpbGRyZW4pKSBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuXSA9IHt9O1xyXG5cclxuICAgIF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRJbnB1dC51cmxdID0gbmV3Q2hpbGQ7XHJcblxyXG4gICAgaWYgKG1zZy50byA9PT0gX3RoaXMubWV0YWRhdGEudXJsKSBuZXdDaGlsZC5zdG9yZSgpO1xyXG5cclxuICAgIF90aGlzLl9oeXBlcnR5RXZ0KG1zZywgbmV3Q2hpbGQpO1xyXG4gIH1cclxuXHJcbiAgX29uSHlwZXJ0eVJlc291cmNlQWRkZWQobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGlucHV0ID0gbXNnLmJvZHkudmFsdWU7XHJcbiAgICBsZXQgaHlwZXJ0eVJlc291cmNlO1xyXG5cclxuICAgIC8vICAgIGxldCBjaGlsZHJlbiA9IGlucHV0LmNoaWxkcmVuO1xyXG5cclxuICAgIGlucHV0LnBhcmVudE9iamVjdCA9IF90aGlzO1xyXG5cclxuICAgIGh5cGVydHlSZXNvdXJjZSA9IF90aGlzLl9oeXBlcnR5UmVzb3VyY2VGYWN0b3J5LmNyZWF0ZUh5cGVydHlSZXNvdXJjZShmYWxzZSwgaW5wdXQucmVzb3VyY2VUeXBlLCBpbnB1dCk7XHJcbiAgICBoeXBlcnR5UmVzb3VyY2UuaWRlbnRpdHkgPSBtc2cuYm9keS5pZGVudGl0eTtcclxuXHJcbiAgICAvLyAgICBpZiAoIV90aGlzLl9jaGlsZHJlbk9iamVjdHMuaGFzT3duUHJvcGVydHkoY2hpbGRyZW4pKSBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuXSA9IHt9O1xyXG5cclxuICAgIF90aGlzLl9jaGlsZHJlbk9iamVjdHNbaHlwZXJ0eVJlc291cmNlLmNoaWxkSWRdID0gaHlwZXJ0eVJlc291cmNlO1xyXG5cclxuICAgIF90aGlzLl9oeXBlcnR5RXZ0KG1zZywgaHlwZXJ0eVJlc291cmNlKTtcclxuXHJcbiAgICAvLyBsb2NhbGx5IHN0b3JlIG1lc3NhZ2VzIHRoYXQgYXJlIGRpcmVjdGx5IHNlbnQgdG8gdGhlIGh5cGVydHlcclxuICAgIC8vIGllIHRvIHN5bmMgd2l0aCBtZXNzYWdlcyBzZW50IHdoZW4gb2ZmbGluZVxyXG5cclxuICAgIGlmIChtc2cudG8gPT09IF90aGlzLm1ldGFkYXRhLnVybCkgaHlwZXJ0eVJlc291cmNlLnN0b3JlKCk7XHJcbiAgfVxyXG5cclxuICBfaHlwZXJ0eUV2dChtc2csIGNoaWxkKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBldmVudCA9IHtcclxuICAgICAgdHlwZTogbXNnLnR5cGUsXHJcbiAgICAgIGZyb206IG1zZy5mcm9tLFxyXG4gICAgICB1cmw6IG1zZy50byxcclxuICAgICAgdmFsdWU6IGNoaWxkLmRhdGEsXHJcbiAgICAgIGNoaWxkSWQ6IGNoaWxkLnVybCxcclxuICAgICAgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LFxyXG4gICAgICBjaGlsZDogY2hpbGRcclxuICAgIH07XHJcblxyXG4gICAgaWYgKGNoaWxkLnJlc291cmNlVHlwZSkge1xyXG4gICAgICBldmVudC5yZXNvdXJjZSA9IGNoaWxkO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBpZiAoX3RoaXMuX29uQWRkQ2hpbGRyZW5IYW5kbGVyKSBfdGhpcy5fb25BZGRDaGlsZHJlbkhhbmRsZXIoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLy9zZW5kIGRlbHRhIG1lc3NhZ2VzIHRvIHN1YnNjcmlwdGlvbnNcclxuICBfb25DaGFuZ2UoZXZlbnQsIGNoaWxkSW5mbykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fbWV0YWRhdGEubGFzdE1vZGlmaWVkID0gKG5ldyBEYXRlKS50b0lTT1N0cmluZygpO1xyXG5cclxuICAgIF90aGlzLl92ZXJzaW9uKys7XHJcblxyXG4gICAgaWYgKF90aGlzLl9zdGF0dXMgPT09ICdsaXZlJykge1xyXG4gICAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IGRpcmVjdGx5IHRvIGEgcmVzb3VyY2UgY2hhbmdlcyBhZGRyZXNzOiBNZXNzYWdlQnVzXHJcbiAgICAgIGxldCBjaGFuZ2VNc2cgPSB7XHJcbiAgICAgICAgdHlwZTogJ3VwZGF0ZScsIGZyb206IF90aGlzLl91cmwsIHRvOiBfdGhpcy5fdXJsICsgJy9jaGFuZ2VzJyxcclxuICAgICAgICBib2R5OiB7IHZlcnNpb246IF90aGlzLl92ZXJzaW9uLCBzb3VyY2U6IF90aGlzLl9vd25lciwgYXR0cmlidXRlOiBldmVudC5maWVsZCwgbGFzdE1vZGlmaWVkOiBfdGhpcy5fbWV0YWRhdGEubGFzdE1vZGlmaWVkIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGxvZy5sb2coJ1tEYXRhT2JqZWN0IC0gX29uQ2hhbmdlXSAtICcsIGV2ZW50LCBjaGlsZEluZm8sIGNoYW5nZU1zZyk7XHJcblxyXG4gICAgICBpZiAoZXZlbnQub1R5cGUgPT09IE9iamVjdFR5cGUuT0JKRUNUKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmNUeXBlICE9PSBDaGFuZ2VUeXBlLlJFTU9WRSkge1xyXG4gICAgICAgICAgY2hhbmdlTXNnLmJvZHkudmFsdWUgPSBkZWVwQ2xvbmUoZXZlbnQuZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNoYW5nZU1zZy5ib2R5LmF0dHJpYnV0ZVR5cGUgPSBldmVudC5vVHlwZTtcclxuICAgICAgICBjaGFuZ2VNc2cuYm9keS52YWx1ZSA9IGV2ZW50LmRhdGE7XHJcbiAgICAgICAgaWYgKGV2ZW50LmNUeXBlICE9PSBDaGFuZ2VUeXBlLlVQREFURSkge1xyXG4gICAgICAgICAgY2hhbmdlTXNnLmJvZHkub3BlcmF0aW9uID0gZXZlbnQuY1R5cGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvL2NoaWxkSW5mbyBtdXN0IGhhdmUgKHBhdGgsIGNoaWxkSWQpXHJcbiAgICAgIGlmIChjaGlsZEluZm8pIHtcclxuICAgICAgICBjaGFuZ2VNc2cudG8gPSBjaGlsZEluZm8ucGF0aDtcclxuICAgICAgICBjaGFuZ2VNc2cuYm9keS5yZXNvdXJjZSA9IGNoaWxkSW5mby5jaGlsZElkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL1RPRE86IEZvciBGdXJ0aGVyIFN0dWR5XHJcbiAgICAgIGlmICghX3RoaXMuZGF0YS5fbXV0dWFsKSBjaGFuZ2VNc2cuYm9keS5tdXR1YWwgPSBfdGhpcy5fbXV0dWFsO1xyXG5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShjaGFuZ2VNc2cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9GTE9XLUlOOiBkZWx0YSBtZXNzYWdlIHJlY2VpdmVkIGZyb20gYSByZW1vdGUgRGF0YU9iamVjdFJlcG9ydGVyIG9yIERhdGFPYmplY3RDaGlsZCB3aGVuIGNoYW5naW5nIGRhdGFcclxuICBfY2hhbmdlT2JqZWN0KHN5bmNPYmosIG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL1RPRE86IHVwZGF0ZSB2ZXJzaW9uID9cclxuICAgIC8vaG93IHRvIGhhbmRsZSBhbiBpbmNvcnJlY3QgdmVyc2lvbiA/IEV4YW1wbGU6IHJlY2VpdmUgYSB2ZXJzaW9uIDMgd2hlbiB0aGUgb2JzZXJ2ZXIgaXMgaW4gdmVyc2lvbiAxLCB3aGVyZSBpcyB0aGUgdmVyc2lvbiAyID9cclxuICAgIC8vd2lsbCB3ZSBuZWVkIHRvIGNvbmZpcm0gdGhlIHJlY2VwdGlvbiA/XHJcbiAgICBpZiAoX3RoaXMuX3ZlcnNpb24gKyAxIDw9IG1zZy5ib2R5LnZlcnNpb24pIHtcclxuICAgICAgX3RoaXMuX3ZlcnNpb24gPSBtc2cuYm9keS52ZXJzaW9uO1xyXG4gICAgICBsZXQgcGF0aCA9IG1zZy5ib2R5LmF0dHJpYnV0ZTtcclxuICAgICAgbGV0IHZhbHVlO1xyXG4gICAgICBpZiAodHlwZW9mIG1zZy5ib2R5LnZhbHVlID09PSAnb2JqZWN0JykgdmFsdWUgPSBkZWVwQ2xvbmUobXNnLmJvZHkudmFsdWUpO1xyXG4gICAgICBlbHNlIHZhbHVlID0gbXNnLmJvZHkudmFsdWU7XHJcblxyXG4gICAgICBsZXQgZmluZFJlc3VsdCA9IHN5bmNPYmouZmluZEJlZm9yZShwYXRoKTtcclxuXHJcbiAgICAgIGlmIChtc2cuYm9keS5sYXN0TW9kaWZpZWQpIHtcclxuICAgICAgICBfdGhpcy5fbWV0YWRhdGEubGFzdE1vZGlmaWVkID0gbXNnLmJvZHkubGFzdE1vZGlmaWVkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aGlzLl9tZXRhZGF0YS5sYXN0TW9kaWZpZWQgPSAobmV3IERhdGUpLnRvSVNPU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChtc2cuYm9keS5hdHRyaWJ1dGVUeXBlID09PSBPYmplY3RUeXBlLkFSUkFZKSB7XHJcbiAgICAgICAgaWYgKG1zZy5ib2R5Lm9wZXJhdGlvbiA9PT0gQ2hhbmdlVHlwZS5BREQpIHtcclxuICAgICAgICAgIGxldCBhcnIgPSBmaW5kUmVzdWx0Lm9iajtcclxuICAgICAgICAgIGxldCBpbmRleCA9IGZpbmRSZXN1bHQubGFzdDtcclxuICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkoYXJyLCBbaW5kZXgsIDBdLmNvbmNhdCh2YWx1ZSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobXNnLmJvZHkub3BlcmF0aW9uID09PSBDaGFuZ2VUeXBlLlJFTU9WRSkge1xyXG4gICAgICAgICAgbGV0IGFyciA9IGZpbmRSZXN1bHQub2JqO1xyXG4gICAgICAgICAgbGV0IGluZGV4ID0gZmluZFJlc3VsdC5sYXN0O1xyXG4gICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgdmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBmaW5kUmVzdWx0Lm9ialtmaW5kUmVzdWx0Lmxhc3RdID0gdmFsdWU7IC8vIFVQREFURVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAobXNnLmJvZHkuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcclxuICAgICAgICAgIGZpbmRSZXN1bHQub2JqW2ZpbmRSZXN1bHQubGFzdF0gPSB2YWx1ZTsgLy8gVVBEQVRFIG9yIEFERFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkZWxldGUgZmluZFJlc3VsdC5vYmpbZmluZFJlc3VsdC5sYXN0XTsgLy8gUkVNT1ZFXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvL1RPRE86IGhvdyB0byBoYW5kbGUgdW5zeW5jaHJvbml6ZWQgdmVyc2lvbnM/XHJcbiAgICAgIGxvZy5sb2coJ1VOU1lOQ0hST05JWkVEIFZFUlNJT046IChkYXRhID0+ICcgKyBfdGhpcy5fdmVyc2lvbiArICcsIG1zZyA9PiAnICsgbXNnLmJvZHkudmVyc2lvbiArICcpJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIHJlbW90ZSBEYXRhT2JqZWN0Q2hpbGQgd2hlbiBjaGFuZ2luZyBkYXRhXHJcbiAgX2NoYW5nZUNoaWxkcmVuKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGNvbnN0IGRpdmlkZWRVUkwgPSBkaXZpZGVVUkwobXNnLnRvKTtcclxuICAgIGNvbnN0IGlkZW50aXR5ID0gZGl2aWRlZFVSTC5pZGVudGl0eTtcclxuICAgIC8vICAgIGNvbnN0IHJlc291cmNlID0gaWRlbnRpdHkgPyBpZGVudGl0eS5zdWJzdHJpbmcoaWRlbnRpdHkubGFzdEluZGV4T2YoJy8nKSArIDEpIDogdW5kZWZpbmVkO1xyXG5cclxuICAgIGxldCBjaGlsZElkID0gbXNnLmJvZHkucmVzb3VyY2U7XHJcbiAgICBsZXQgY2hpbGRyZW4gPSBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkSWRdO1xyXG5cclxuICAgIGxvZy5sb2coJ0NoYW5nZSBjaGlsZHJlbjogJywgX3RoaXMuX293bmVyLCBtc2csIHJlc291cmNlKTtcclxuXHJcbiAgICBpZiAoY2hpbGRyZW4pIHtcclxuICAgICAgX3RoaXMuX2NoYW5nZU9iamVjdChjaGlsZHJlbi5fc3luY09iaiwgbXNnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxvZy53YXJuKCdObyBjaGlsZHJlbiBmb3VuZCBmb3I6ICcsIGNoaWxkSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERhdGFPYmplY3Q7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0RhdGFPYmplY3RSZXBvcnRlcicpO1xyXG5cclxuaW1wb3J0IERhdGFPYmplY3QgZnJvbSAnLi9EYXRhT2JqZWN0JztcclxuXHJcbmltcG9ydCB7IGRlZXBDbG9uZSwgZGl2aWRlVVJMIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMuanMnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBjbGFzcyByZXR1cm5lZCBmcm9tIHRoZSBTeW5jaGVyIGNyZWF0ZSBjYWxsLlxyXG4gKiBUbyBiZSB1c2VkIGFzIGEgcmVwb3J0ZXIgcG9pbnQsIGNoYW5nZXMgd2lsbCBiZSBzdWJtaXRlZCB0byBEYXRhT2JqZWN0T2JzZXJ2ZXIgaW5zdGFuY2VzLlxyXG4gKi9cclxuY2xhc3MgRGF0YU9iamVjdFJlcG9ydGVyIGV4dGVuZHMgRGF0YU9iamVjdCAvKiBpbXBsZW1lbnRzIFN5bmNTdGF0dXMgKi8ge1xyXG4gIC8qIHByaXZhdGVcclxuICBfc3Vic2NyaXB0aW9uczogPGh5cGVydHlVcmw6IHsgc3RhdHVzOiBzdHJpbmcgfSB9PlxyXG5cclxuICAtLS0tZXZlbnQgaGFuZGxlcnMtLS0tXHJcbiAgX29uU3Vic2NyaXB0aW9uSGFuZGxlcjogKGV2ZW50KSA9PiB2b2lkXHJcbiAgX29uUmVzcG9uc2VIYW5kbGVyOiAoZXZlbnQpID0+IHZvaWRcclxuICBfb25SZWFkSGFuZGxlcjogKGV2ZW50KSA9PiB2b2lkXHJcbiAgKi9cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqIFNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSBieSBIeXBlcnRpZXMuIEl0J3MgY2FsbGVkIGJ5IHRoZSBTeW5jaGVyLmNyZWF0ZSBtZXRob2RcclxuICAgKi9cclxuXHJcbiAgLy9jb25zdHJ1Y3RvcihzeW5jaGVyLCB1cmwsIGNyZWF0ZWQsIHJlcG9ydGVyLCBydW50aW1lLCBzY2hlbWEsIG5hbWUsIGluaXRpYWxTdGF0dXMsIGluaXRpYWxEYXRhLCBjaGlsZHJlbnMsIG11dHVhbCA9IHRydWUsIHJlc3VtZWQgPSBmYWxzZSwgZGVzY3JpcHRpb24sIHRhZ3MsIHJlc291cmNlcywgb2JzZXJ2ZXJTdG9yYWdlLCBwdWJsaWNPYnNlcnZhdGlvbikge1xyXG4gIGNvbnN0cnVjdG9yKGlucHV0KSB7XHJcblxyXG4gICAgc3VwZXIoaW5wdXQpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fc3Vic2NyaXB0aW9ucyA9IHt9O1xyXG5cclxuICAgIF90aGlzLl9zeW5jT2JqLm9ic2VydmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIGxvZy5sb2coJ1tTeW5jaGVyLkRhdGFPYmplY3RSZXBvcnRlcl0gJyArIF90aGlzLnVybCArICcgcHVibGlzaCBjaGFuZ2U6ICcsIGV2ZW50KTtcclxuICAgICAgX3RoaXMuX29uQ2hhbmdlKGV2ZW50KTtcclxuICAgIH0pO1xyXG5cclxuICAgIF90aGlzLl9hbGxvY2F0ZUxpc3RlbmVycygpO1xyXG5cclxuICAgIF90aGlzLmludml0YXRpb25zID0gW107IC8vIGFycmF5IG9mIHByb21pc2VzIHdpdGggcGVuZGluZyBpbnZpdGF0aW9uc1xyXG4gICAgX3RoaXMuX2NoaWxkcmVuU2l6ZVRocmVzaG9sZCA9IDUwMDAwOy8vIHRvIGJlIHVzZWQgd2hlbiByZXBseWluZyB0byBzeW5jIHJlcXVlc3RzIHRvIGVuc3VyZSBlYWNoIHJlc3BvbnNlIG1zZyBpcyBub3QgdG9vIGxhcmdlXHJcblxyXG4gIH1cclxuXHJcbiAgX2FsbG9jYXRlTGlzdGVuZXJzKCkge1xyXG4gICAgc3VwZXIuX2FsbG9jYXRlTGlzdGVuZXJzKCk7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9vYmplY3RMaXN0ZW5lciA9IF90aGlzLl9idXMuYWRkTGlzdGVuZXIoX3RoaXMuX3VybCwgKG1zZykgPT4ge1xyXG4gICAgICBsb2cubG9nKCdbU3luY2hlci5EYXRhT2JqZWN0UmVwb3J0ZXJdIGxpc3RlbmVyICcgKyBfdGhpcy5fdXJsICsgJyBSZWNlaXZlZDogJywgbXNnKTtcclxuICAgICAgc3dpdGNoIChtc2cudHlwZSkge1xyXG4gICAgICAgIGNhc2UgJ3Jlc3BvbnNlJzogX3RoaXMuX29uUmVzcG9uc2UobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAncmVhZCc6IF90aGlzLl9vblJlYWQobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnZXhlY3V0ZSc6IF90aGlzLl9vbkV4ZWN1dGUobXNnKTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnY3JlYXRlJzogX3RoaXMuX29uQ2hpbGRDcmVhdGUobXNnKTsgYnJlYWs7Ly8gdG8gY3JlYXRlIGNoaWxkIG9iamVjdHMgdGhhdCB3ZXJlIHNlbnQgd2hlbm4gb2ZmbGluZVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBfdGhpcy5fcnVudGltZVN0YXR1c0xpc3RlbmVyID0gX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihfdGhpcy5fc3luY2hlci5fcnVudGltZVVybCsnL3N0YXR1cycgLCAoZXZ0KSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbU3luY2hlci5EYXRhT2JqZWN0UmVwb3J0ZXJdIHJ1bnRpbWUgc3RhdHVzIGV2ZW50IHJlY2VpdmVkICcgKyBldnQpO1xyXG5cclxuICAgICAgaWYgKGV2dC5ib2R5ICYmIGV2dC5ib2R5LnJlc291cmNlICYmIGV2dC5ib2R5LnJlc291cmNlID09PSBfdGhpcy5fdXJsICYmIFxyXG4gICAgICAgIGV2dC5ib2R5LnZhbHVlICYmIGV2dC5ib2R5LnZhbHVlLmJhY2t1cFJldmlzaW9uICkge1xyXG4gICAgICAgICAgLy8gYnJvYWRjYXN0IGJhY2t1cFJldmlzaW9uIHVwZGF0ZVxyXG5cclxuICAgICAgICAgIF90aGlzLmRhdGEuYmFja3VwUmV2aXNpb24gPSBldnQuYm9keS52YWx1ZS5iYWNrdXBSZXZpc2lvbjtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdbU3luY2hlci5EYXRhT2JqZWN0UmVwb3J0ZXJdIERPIHVwZGF0ZWQgd2l0aCBiYWNrdXAgcmV2aXNpb24gJyArIF90aGlzLmRhdGEuYmFja3VwUmV2aXNpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIF9yZWxlYXNlTGlzdGVuZXJzKCkge1xyXG4gICAgc3VwZXIuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX29iamVjdExpc3RlbmVyLnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VuZCBpbnZpdGF0aW9ucyAoY3JlYXRlIG1lc3NhZ2VzKSB0byBoeXBlcnRpZXMsIG9ic2VydmVycyBsaXN0LlxyXG4gICAqIEBwYXJhbSAge0h5cGVydHlVUkxbXX0gb2JzZXJ2ZXJzIExpc3Qgb2YgSHlwZXJ0eSBVUkwnc1xyXG4gICAqL1xyXG4gIGludml0ZU9ic2VydmVycyhvYnNlcnZlcnMsIHAycCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcblxyXG4gICAgLy9GTE9XLU9VVDogdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcnVudGltZSBpbnN0YW5jZSBvZiBTeW5jaGVyTWFuYWdlciAtPiBfb25DcmVhdGVcclxuICAgIC8vIFRPRE86IHJlbW92ZSB2YWx1ZSBhbmQgYWRkIHJlc291cmNlcz8gc2hvdWxkIHNpbWlsYXIgdG8gMXN0IGNyZWF0ZVxyXG5cclxuICAgIGxldCB0b0ludml0ZSA9IG9ic2VydmVycztcclxuXHJcbiAgICAvLyBsZXQgaW52aXRlUHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAvKiAgb2JzZXJ2ZXJzLmZvckVhY2goKG9ic2VydmVyKT0+IHtcclxuICAgICAgaWYgKCFfdGhpcy5pbnZpdGF0aW9uc1tvYnNlcnZlcl0pIHtcclxuICAgICAgICB0b0ludml0ZS5wdXNoKG9ic2VydmVyKTtcclxuICAgICAgICBfdGhpcy5pbnZpdGF0aW9uc1tvYnNlcnZlcl0gPSBvYnNlcnZlcjtcclxuICAgICAgfVxyXG4gICAgfSk7Ki9cclxuXHJcblxyXG4gICAgaWYgKHRvSW52aXRlLmxlbmd0aCA+IDApIHtcclxuICAgICAgbG9nLmxvZygnW1N5bmNoZXIuRGF0YU9iamVjdFJlcG9ydGVyXSBJbnZpdGVPYnNlcnZlcnMgJywgdG9JbnZpdGUsIF90aGlzLl9tZXRhZGF0YSk7XHJcblxyXG4gICAgICB0b0ludml0ZS5mb3JFYWNoKChvYnNlcnZlcik9PntcclxuXHJcbiAgICAgICAgbGV0IGludml0YXRpb24gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICAgICAgbGV0IGludml0ZU1zZyA9IHtcclxuICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsIGZyb206IF90aGlzLl9zeW5jaGVyLl9vd25lciwgdG86IF90aGlzLl9zeW5jaGVyLl9zdWJVUkwsXHJcbiAgICAgICAgICAgIGJvZHk6IHsgcmVzdW1lOiBmYWxzZSwgcmVzb3VyY2U6IF90aGlzLl91cmwsIHNjaGVtYTogX3RoaXMuX3NjaGVtYSwgdmFsdWU6IF90aGlzLl9tZXRhZGF0YSwgYXV0aG9yaXNlOiBbb2JzZXJ2ZXJdIH1cclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgaWYgKHAycCkgaW52aXRlTXNnLmJvZHkucDJwID0gcDJwO1xyXG5cclxuICAgICAgICAgIGlmICghX3RoaXMuZGF0YS5tdXR1YWwpIGludml0ZU1zZy5ib2R5Lm11dHVhbCA9IF90aGlzLmRhdGEubXV0dWFsO1xyXG5cclxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UoaW52aXRlTXNnLCAocmVwbHkpPT57XHJcbiAgICAgICAgICAgIGxvZy5sb2coJ1tTeW5jaGVyLkRhdGFPYmplY3RSZXBvcnRlcl0gSW52aXRhdGlvbiByZXBseSAnLCByZXBseSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgIGludml0ZWQ6IG9ic2VydmVyLFxyXG4gICAgICAgICAgICAgIGNvZGU6IHJlcGx5LmJvZHkgJiYgcmVwbHkuYm9keS5jb2RlID8gcmVwbHkuYm9keS5jb2RlIDogNTAwLFxyXG4gICAgICAgICAgICAgIGRlc2M6IHJlcGx5LmJvZHkgJiYgcmVwbHkuYm9keS5kZXNjID8gcmVwbHkuYm9keS5kZXNjIDogJ1Vua25vd24nXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0LmNvZGUgPCAzMDApIHJlc29sdmUocmVzdWx0KTtcclxuLyogICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuY29kZSA+PSAzMDApIHtcclxuICAgICAgICAgICAgICBpZiAoX3RoaXMubWV0YWRhdGEub2ZmbGluZSkge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShfdGhpcy5fcHJvY2Vzc09mZmxpbmVJbnZpdGF0aW9uKGludml0ZU1zZykpO1xyXG4gICAgICAgICAgICAgIH0qLyBlbHNlIHJlamVjdChyZXN1bHQpO1xyXG4vLyAgICAgICAgICAgIH0gXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgX3RoaXMuaW52aXRhdGlvbnMucHVzaChpbnZpdGF0aW9uKTtcclxuXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gICAgICByZXR1cm4oaW52aXRlUHJvbWlzZXMpO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBSZWxlYXNlIGFuZCBkZWxldGUgb2JqZWN0IGRhdGFcclxuICAgKi9cclxuICBkZWxldGUoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgaWYoX3RoaXMuX2hlYXJ0QmVhdCkgX3RoaXMuX2hlYXJ0QmVhdC5zdG9wKCk7XHJcblxyXG4gICAgX3RoaXMuX2RlbGV0ZUNoaWxkcmVucygpLnRoZW4oKHJlc3VsdCk9PntcclxuICAgICAgbG9nLmxvZyhyZXN1bHQpO1xyXG4gICAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBydW50aW1lIGluc3RhbmNlIG9mIFN5bmNoZXJNYW5hZ2VyIC0+IF9vbkRlbGV0ZVxyXG4gICAgICBsZXQgZGVsZXRlTXNnID0ge1xyXG4gICAgICAgIHR5cGU6ICdkZWxldGUnLCBmcm9tOiBfdGhpcy5fb3duZXIsIHRvOiBfdGhpcy5fc3luY2hlci5fc3ViVVJMLFxyXG4gICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IF90aGlzLl91cmwgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShkZWxldGVNc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgIGxvZy5sb2coJ0RhdGFPYmplY3RSZXBvcnRlci1ERUxFVEU6ICcsIHJlcGx5KTtcclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIF90aGlzLl9yZWxlYXNlTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgICBkZWxldGUgX3RoaXMuX3N5bmNoZXIuX3JlcG9ydGVyc1tfdGhpcy5fdXJsXTtcclxuXHJcbiAgICAgICAgICAvL190aGlzLl9zeW5jT2JqLnVub2JzZXJ2ZSgpO1xyXG4gICAgICAgICAgX3RoaXMuX3N5bmNPYmogPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaXB0aW9ucyByZXF1ZXN0ZWQgYW5kIGFjY2VwdGVkIHRvIHRoaXMgcmVwb3J0ZXJcclxuICAgKiBAdHlwZSB7T2JqZWN0PEh5cGVydHlVUkwsIFN5bmNTdWJzY3JpcHRpb24+fVxyXG4gICAqL1xyXG4gIGdldCBzdWJzY3JpcHRpb25zKCkgeyByZXR1cm4gdGhpcy5fc3Vic2NyaXB0aW9uczsgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCB0aGUgY2FsbGJhY2sgdG8gcHJvY2VzcyBzdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIG5vdGlmaWNhdGlvbnNcclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlY2VpdmUgZXZlbnRzXHJcbiAgICovXHJcbiAgb25TdWJzY3JpcHRpb24oY2FsbGJhY2spIHtcclxuICAgIHRoaXMuX29uU3Vic2NyaXB0aW9uSGFuZGxlciA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgdGhlIGNhbGxiYWNrIHRvIHByb2Nlc3MgcmVzcG9uc2Ugbm90aWZpY2F0aW9ucyBvZiB0aGUgY3JlYXRlJ3NcclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlY2VpdmUgZXZlbnRzXHJcbiAgICovXHJcbiAgb25SZXNwb25zZShjYWxsYmFjaykge1xyXG4gICAgdGhpcy5fb25SZXNwb25zZUhhbmRsZXIgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHVwIHRoZSBjYWxsYmFjayB0byBwcm9jZXNzIHJlYWQgbm90aWZpY2F0aW9uc1xyXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQ6IE1zZ0V2ZW50KX0gY2FsbGJhY2tcclxuICAgKi9cclxuXHJcbiAgb25SZWFkKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9vblJlYWRIYW5kbGVyID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXR1cCB0aGUgY2FsbGJhY2sgdG8gcHJvY2VzcyBleGVjdXRlIG5vdGlmaWNhdGlvbnNcclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrXHJcbiAgICovXHJcblxyXG4gIG9uRXhlY3V0ZShjYWxsYmFjaykge1xyXG4gICAgdGhpcy5fb25FeGVjdXRlSGFuZGxlciA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbiAgLy9GTE9XLUlOOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gcGFyZW50IFN5bmNoZXIgLT4gX29uRm9yd2FyZFxyXG4gIF9vbkZvcndhcmQobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxvZy5sb2coJ0RhdGFPYmplY3RSZXBvcnRlci1SQ1Y6ICcsIG1zZyk7XHJcbiAgICBzd2l0Y2ggKG1zZy5ib2R5LnR5cGUpIHtcclxuICAgICAgY2FzZSAnc3Vic2NyaWJlJzogX3RoaXMuX29uU3Vic2NyaWJlKG1zZyk7IGJyZWFrO1xyXG4gICAgICBjYXNlICd1bnN1YnNjcmliZSc6IF90aGlzLl9vblVuU3Vic2NyaWJlKG1zZyk7IGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy9GTE9XLUlOOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhpcyAtPiBfb25Gb3J3YXJkOiBlbWl0dGVkIGJ5IGEgcmVtb3RlIFN5bmNoZXIgLT4gc3Vic2NyaWJlXHJcbiAgX29uU3Vic2NyaWJlKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBoeXBlcnR5VXJsID0gbXNnLmJvZHkuZnJvbTtcclxuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKGh5cGVydHlVcmwpO1xyXG4gICAgbGV0IGRvbWFpbiA9IGRpdmlkZWRVUkwuZG9tYWluO1xyXG4gICAgbGV0IG11dHVhbCA9IHRydWU7XHJcblxyXG4gICAgaWYgKG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSAmJiAhbXNnLmJvZHkubXV0dWFsKSBtdXR1YWwgPSBmYWxzZTtcclxuXHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tEYXRhT2JqZWN0UmVwb3J0ZXIuX29uU3Vic2NyaWJlXScsIG1zZywgZG9tYWluLCBkaXZpZGVkVVJMKTtcclxuXHJcbiAgICBsZXQgZXZlbnQgPSB7XHJcbiAgICAgIHR5cGU6IG1zZy5ib2R5LnR5cGUsXHJcbiAgICAgIHVybDogaHlwZXJ0eVVybCxcclxuXHJcbiAgICAgIGRvbWFpbjogZG9tYWluLFxyXG5cclxuICAgICAgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LFxyXG5cclxuICAgICAgbnV0dWFsOiBtdXR1YWwsXHJcblxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICAvL2NyZWF0ZSBuZXcgc3Vic2NyaXB0aW9uXHJcbiAgICAgICAgbGV0IHN1YiA9IHsgdXJsOiBoeXBlcnR5VXJsLCBzdGF0dXM6ICdsaXZlJyB9O1xyXG4gICAgICAgIF90aGlzLl9zdWJzY3JpcHRpb25zW2h5cGVydHlVcmxdID0gc3ViO1xyXG4gICAgICAgIGlmIChfdGhpcy5tZXRhZGF0YS5zdWJzY3JpcHRpb25zKSB7IF90aGlzLm1ldGFkYXRhLnN1YnNjcmlwdGlvbnMucHVzaChzdWIudXJsKTsgfVxyXG5cclxuICAgICAgICBsZXQgbXNnVmFsdWUgPSBkZWVwQ2xvbmUoX3RoaXMuX21ldGFkYXRhKTtcclxuICAgICAgICBtc2dWYWx1ZS5kYXRhID0gZGVlcENsb25lKF90aGlzLmRhdGEpO1xyXG4gICAgICAgIG1zZ1ZhbHVlLnZlcnNpb24gPSBfdGhpcy5fdmVyc2lvbjtcclxuXHJcbiAgICAgICAgLy9wcm9jZXNzIGFuZCBzZW5kIGNoaWxkcmVucyBkYXRhXHJcbiAgICAgICAgLy8gbGV0IGNoaWxkcmVuVmFsdWVzID0ge307XHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBpZiAoX3RoaXMuX2NoaWxkcmVuT2JqZWN0cykge1xyXG4gICAgICAgIC8vICAgT2JqZWN0LmtleXMoX3RoaXMuX2NoaWxkcmVuT2JqZWN0cykuZm9yRWFjaCgoY2hpbGRyZW5JZCkgPT4ge1xyXG4gICAgICAgIC8vICAgICBsZXQgY2hpbGRyZW5EYXRhID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZHJlbklkXTtcclxuICAgICAgICAvLyAgICAgY2hpbGRyZW5WYWx1ZXNbY2hpbGRyZW5JZF0gPSBkZWVwQ2xvbmUoY2hpbGRyZW5EYXRhKTtcclxuICAgICAgICAvLyAgIH0pO1xyXG4gICAgICAgIC8vICAgbXNnVmFsdWUuY2hpbGRyZW5PYmplY3RzID0gY2hpbGRyZW5WYWx1ZXM7XHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICBsZXQgc2VuZE1zZyA9IHtcclxuICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgYm9keTogeyBjb2RlOiAyMDAsIHNjaGVtYTogX3RoaXMuX3NjaGVtYSwgdmFsdWU6IG1zZ1ZhbHVlIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvL1RPRE86IEZvciBGdXJ0aGVyIFN0dWR5XHJcbiAgICAgICAgaWYgKG1zZy5ib2R5Lmhhc093blByb3BlcnR5KCdtdXR1YWwnKSAmJiAhbXNnLmJvZHkubXV0dWFsKSB7XHJcbiAgICAgICAgICBzZW5kTXNnLmJvZHkubXV0dWFsID0gbXNnLmJvZHkubXV0dWFsOy8vIFRPRE86IHJlbW92ZT9cclxuICAgICAgICAgIF90aGlzLmRhdGEubXV0dWFsID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoX3RoaXMuX2hlYXJ0QmVhdCkge1xyXG4gICAgICAgICAgc2VuZE1zZy5ib2R5LnZhbHVlLmNoaWxkcmVuT2JqZWN0cyA9IHt9O1xyXG4gICAgICAgICAgc2VuZE1zZy5ib2R5LnZhbHVlLmNoaWxkcmVuT2JqZWN0cy5oZWFydGJlYXQgPSBfdGhpcy5faGVhcnRCZWF0LmhlYXJ0YmVhdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbRGF0YU9iamVjdFJlcG9ydGVyLl9vblN1YnNjcmliZS5hY2NlcHRdIHNlbmRpbmcgcmVzcG9uc2U6ICcsIHNlbmRNc2cpXHJcblxyXG4gICAgICAgIC8vc2VuZCBvayByZXNwb25zZSBtZXNzYWdlXHJcbiAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShzZW5kTXNnKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHN1YjtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIHJlamVjdDogKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIC8vc2VuZCByZWplY3QgcmVzcG9uc2UgbWVzc2FnZVxyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgICBib2R5OiB7IGNvZGU6IDQwMywgZGVzYzogcmVhc29uIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoX3RoaXMuX29uU3Vic2NyaXB0aW9uSGFuZGxlcikge1xyXG4gICAgICBsb2cubG9nKCdTVUJTQ1JJUFRJT04tRVZFTlQ6ICcsIGV2ZW50KTtcclxuICAgICAgX3RoaXMuX29uU3Vic2NyaXB0aW9uSGFuZGxlcihldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSB0aGlzIC0+IF9vbkZvcndhcmQ6IGVtaXR0ZWQgYnkgYSByZW1vdGUgRGF0YU9iamVjdE9ic2VydmVyIC0+IHVuc3Vic2NyaWJlXHJcbiAgX29uVW5TdWJzY3JpYmUobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGh5cGVydHlVcmwgPSBtc2cuYm9keS5mcm9tO1xyXG4gICAgbGV0IGRpdmlkZWRVUkwgPSBkaXZpZGVVUkwoaHlwZXJ0eVVybCk7XHJcbiAgICBsZXQgZG9tYWluID0gZGl2aWRlZFVSTC5kb21haW47XHJcblxyXG4gICAgbG9nLmxvZygnW0RhdGFPYmplY3RSZXBvcnRlci5fb25VblN1YnNjcmliZV0nLCBtc2csIGRvbWFpbiwgZGl2aWRlZFVSTCk7XHJcblxyXG4gICAgLy9sZXQgc3ViID0gX3RoaXMuX3N1YnNjcmlwdGlvbnNbaHlwZXJ0eVVybF07XHJcbiAgICBkZWxldGUgX3RoaXMuX3N1YnNjcmlwdGlvbnNbaHlwZXJ0eVVybF07XHJcbiAgICBkZWxldGUgX3RoaXMuaW52aXRhdGlvbnNbaHlwZXJ0eVVybF07XHJcblxyXG4gICAgbGV0IGV2ZW50ID0ge1xyXG4gICAgICB0eXBlOiBtc2cuYm9keS50eXBlLFxyXG4gICAgICB1cmw6IGh5cGVydHlVcmwsXHJcbiAgICAgIGRvbWFpbjogZG9tYWluLFxyXG4gICAgICBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHlcclxuICAgIH07XHJcblxyXG4gICAgLy8gVE9ETzogY2hlY2sgaWYgdGhlIF9vblN1YnNjcmlwdGlvbkhhbmRsZXIgaXQgaXMgdGhlIHNhbWUgb2YgdGhlIHN1YnNjcmlwdGlvbnM/Pz9cclxuICAgIGlmIChfdGhpcy5fb25TdWJzY3JpcHRpb25IYW5kbGVyKSB7XHJcbiAgICAgIGxvZy5sb2coJ1VOLVNVQlNDUklQVElPTi1FVkVOVDogJywgZXZlbnQpO1xyXG4gICAgICBfdGhpcy5fb25TdWJzY3JpcHRpb25IYW5kbGVyKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIFJlcG9ydGVyVVJMIGFkZHJlc3M6IGVtaXRlZCBieSBhIHJlbW90ZSBTeW5jaGVyIC0+IF9vblJlbW90ZUNyZWF0ZSAtPiBldmVudC5hY2tcclxuICBfb25SZXNwb25zZShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGV2ZW50ID0ge1xyXG4gICAgICB0eXBlOiBtc2cudHlwZSxcclxuICAgICAgdXJsOiBtc2cuZnJvbSxcclxuICAgICAgY29kZTogbXNnLmJvZHkuY29kZVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoX3RoaXMuX29uUmVzcG9uc2VIYW5kbGVyKSB7XHJcbiAgICAgIGxvZy5sb2coJ1JFU1BPTlNFLUVWRU5UOiAnLCBldmVudCk7XHJcbiAgICAgIF90aGlzLl9vblJlc3BvbnNlSGFuZGxlcihldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL0ZMT1ctSU46IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBSZXBvcnRlclVSTCBhZGRyZXNzOiBlbWl0ZWQgYnkgYSByZW1vdGUgU3luY2hlciAtPiByZWFkXHJcbiAgX29uUmVhZChtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgY2hpbGRyZW5zU2l6ZSA9IEpTT04uc3RyaW5naWZ5KF90aGlzLmNoaWxkcmVuc0pTT04pLmxlbmd0aDtcclxuXHJcbiAgICBsZXQgbGFyZ2VPYmplY3QgPSAoY2hpbGRyZW5zU2l6ZSA+IF90aGlzLl9jaGlsZHJlblNpemVUaHJlc2hvbGQpID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxuICAgIGxldCBldmVudCA9IHtcclxuICAgICAgdHlwZTogbXNnLnR5cGUsXHJcbiAgICAgIHVybDogbXNnLmZyb20sXHJcblxyXG4gICAgICBhY2NlcHQ6ICgpID0+IHtcclxuICAgICAgICBpZiAobGFyZ2VPYmplY3QpIF90aGlzLl9zeW5jUmVwbHlGb3JMYXJnZURhdGEobXNnKTtcclxuICAgICAgICBlbHNlIF90aGlzLl9zeW5jUmVwbHkobXNnKTtcclxuICAgICAgfSxcclxuXHJcbiAgICAgIHJlamVjdDogKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgICBib2R5OiB7IGNvZGU6IDQwMSwgZGVzYzogcmVhc29uIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBpZiB0aGUgcmVxdWVzdGVyIGlzIGFuIGF1dGhvcmlzZWQgb2JzZXJ2ZXIsIHRoZSBkYXRhIG9iamVjdCBpcyByZXNwb25kZWQgb3RoZXJ3aXNlIGFuIGV2ZW50IGlzIHRyaWdnZXJlZFxyXG4gICAgbGV0IHN1YnNjcmlwdGlvbnMgPSBbXTtcclxuXHJcbiAgICBpZiAoX3RoaXMubWV0YWRhdGEuc3Vic2NyaXB0aW9ucykge1xyXG4gICAgICBzdWJzY3JpcHRpb25zID0gX3RoaXMubWV0YWRhdGEuc3Vic2NyaXB0aW9ucztcclxuICAgIH0gZWxzZSBpZiAoX3RoaXMuX3N1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgc3Vic2NyaXB0aW9ucyA9IE9iamVjdC5rZXlzKF90aGlzLl9zdWJzY3JpcHRpb25zKS5tYXAoZnVuY3Rpb24oa2V5KSB7IHJldHVybiBfdGhpcy5fc3Vic2NyaXB0aW9uc1trZXldLnVybDsgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHN1YnNjcmlwdGlvbnMuaW5kZXhPZihtc2cuZnJvbSkgIT0gLTEpIHtcclxuICAgICAgaWYgKGxhcmdlT2JqZWN0KSBfdGhpcy5fc3luY1JlcGx5Rm9yTGFyZ2VEYXRhKG1zZyk7XHJcbiAgICAgIGVsc2UgX3RoaXMuX3N5bmNSZXBseShtc2cpO1xyXG4gICAgfSBlbHNlIGlmIChfdGhpcy5fb25SZWFkSGFuZGxlcikge1xyXG4gICAgICBsb2cubG9nKCdSRUFELUVWRU5UOiAnLCBldmVudCk7XHJcbiAgICAgIF90aGlzLl9vblJlYWRIYW5kbGVyKGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBnZXQgY2hpbGRyZW5zSlNPTigpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgY2hpbGRyZW5zID0ge307XHJcblxyXG4vLyAgICBsZXQgY2hpbGRyZW47XHJcblxyXG4vLyAgICBmb3IgKGNoaWxkcmVuIGluIF90aGlzLl9jaGlsZHJlbk9iamVjdHMpIHtcclxuICAgICAgbGV0IGNoaWxkO1xyXG4vLyAgICAgIGNoaWxkcmVuc1tjaGlsZHJlbl0gPSB7fTtcclxuICAgICAgZm9yIChjaGlsZCBpbiBfdGhpcy5fY2hpbGRyZW5PYmplY3RzKSB7XHJcbiAgICAgICAgY2hpbGRyZW5zW2NoaWxkXSA9IHt9O1xyXG4gICAgICAgIGNoaWxkcmVuc1tjaGlsZF0udmFsdWUgPSBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkXS5tZXRhZGF0YTtcclxuICAgICAgICBjaGlsZHJlbnNbY2hpbGRdLmlkZW50aXR5ID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZF0uaWRlbnRpdHk7XHJcbiAgICAgIH1cclxuLy8gICAgfVxyXG5cclxuICAgIHJldHVybiBjaGlsZHJlbnM7XHJcbiAgfVxyXG5cclxuICBfc3luY1JlcGx5KG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgb2JqZWN0VmFsdWUgPSBkZWVwQ2xvbmUoX3RoaXMubWV0YWRhdGEpO1xyXG5cclxuICAgIG9iamVjdFZhbHVlLmRhdGEgPSBkZWVwQ2xvbmUoX3RoaXMuZGF0YSk7XHJcbiAgICBvYmplY3RWYWx1ZS5jaGlsZHJlbk9iamVjdHMgPSBkZWVwQ2xvbmUoX3RoaXMuY2hpbGRyZW5zSlNPTik7XHJcblxyXG4gICAgb2JqZWN0VmFsdWUudmVyc2lvbiA9IF90aGlzLl92ZXJzaW9uO1xyXG5cclxuICAgIGxldCByZXNwb25zZSA9IHtcclxuICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgIGJvZHk6IHsgY29kZTogMjAwLCB2YWx1ZTogb2JqZWN0VmFsdWUgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTtcclxuXHJcbiAgfVxyXG5cclxuICAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBpZiB0aGUgZGF0YSBvYmplY3QgdG8gYmUgc3luY2hlZCBoYXMgY2hpbGRyZW5PamVjdHMgdG9vIGxhcmdlXHJcblxyXG4gIF9zeW5jUmVwbHlGb3JMYXJnZURhdGEobXNnKSB7XHJcbiAgLy9zZXQgYXR0cmlidXRlIHdpdGggbnVtYmVyIG9mIHNwbGxpdGVkIG1lc3NhZ2VzXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIC8vIGxldHMgc2V0IHRoZSBpbml0aWFsIG1lc3NhZ2Ugd2l0aCBubyBjaGlsZE9iamVjdHNcclxuXHJcbiAgICBsZXQgb2JqZWN0VmFsdWUgPSBkZWVwQ2xvbmUoX3RoaXMubWV0YWRhdGEpO1xyXG5cclxuICAgIG9iamVjdFZhbHVlLmRhdGEgPSBkZWVwQ2xvbmUoX3RoaXMuZGF0YSk7XHJcblxyXG4gICAgb2JqZWN0VmFsdWUudmVyc2lvbiA9IF90aGlzLl92ZXJzaW9uO1xyXG5cclxuICAgIGRlbGV0ZSBvYmplY3RWYWx1ZS5jaGlsZHJlbk9iamVjdHM7XHJcblxyXG4gICAgbGV0IGNoaWxkcmVuO1xyXG4gICAgbGV0IHZhbHVlcyA9IFtdOyAvLyBhcnJheSBvZiB2YWx1ZXMgdG8gYmUgc2VudCBpbiBzZXBhcmF0ZWQgcmVzcG9uc2VzXHJcbiAgICBsZXQgY2hpbGRyZW5WYWx1ZSA9IHt9OyAvLyB2YWx1ZSB0byBiZSB1c2VkIGluIGVhY2ggcmVzcG9uc2VcclxuXHJcbiAgICBmb3IgKGNoaWxkIGluIF90aGlzLl9jaGlsZHJlbk9iamVjdHMpIHtcclxuLy8gICAgICBsZXQgY2hpbGQ7XHJcbiAgICAgIGNoaWxkcmVuVmFsdWVbY2hpbGRdID0ge307XHJcbi8vICAgICAgZm9yIChjaGlsZCBpbiBfdGhpcy5fY2hpbGRyZW5PYmplY3RzW2NoaWxkcmVuXSkge1xyXG4gICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShjaGlsZHJlblZhbHVlKS5sZW5ndGggPiBfdGhpcy5fY2hpbGRyZW5TaXplVGhyZXNob2xkKSB7XHJcbiAgICAgICAgICAvL2NoaWxkcmVuVmFsdWUgYmlnIGVub3VnaCB0byBiZSBzZW50IGluIGEgcmVzcG9uc2UgbWVzc2FnZVxyXG4gICAgICAgICAgdmFsdWVzLnB1c2goY2hpbGRyZW5WYWx1ZSk7XHJcbi8vICAgICAgICAgIGNoaWxkcmVuVmFsdWUgPSB7fTtcclxuLy8gICAgICAgICAgY2hpbGRyZW5WYWx1ZVtjaGlsZF0gPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2hpbGRyZW5WYWx1ZVtjaGlsZF0gPSB7fTtcclxuICAgICAgICBjaGlsZHJlblZhbHVlW2NoaWxkXS52YWx1ZSA9IF90aGlzLl9jaGlsZHJlbk9iamVjdHNbY2hpbGRdLm1ldGFkYXRhO1xyXG4gICAgICAgIGNoaWxkcmVuVmFsdWVbY2hpbGRdLmlkZW50aXR5ID0gX3RoaXMuX2NoaWxkcmVuT2JqZWN0c1tjaGlsZF0uaWRlbnRpdHk7XHJcbi8vICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhbHVlcy5wdXNoKGNoaWxkcmVuVmFsdWUpO1xyXG5cclxuICAgIG9iamVjdFZhbHVlLnJlc3BvbnNlcyA9IHZhbHVlcy5sZW5ndGggKyAxOyAvL251bWJlciBvZiByZXNwb25zZXMgdG8gYmUgc2VudFxyXG5cclxuICAgIGxldCBpbml0aWFsUmVzcG9uc2UgPSB7XHJcbiAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICBib2R5OiB7IGNvZGU6IDEwMCwgdmFsdWU6IG9iamVjdFZhbHVlIH1cclxuICAgIH07XHJcblxyXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShpbml0aWFsUmVzcG9uc2UpO1xyXG5cclxuICAgIHZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG5cclxuICAgICAgbGV0IHJlc3BvbnNlID0gZGVlcENsb25lKGluaXRpYWxSZXNwb25zZSk7XHJcblxyXG4gICAgICByZXNwb25zZS5ib2R5LnZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgICByZXNwb25zZS5ib2R5LnZhbHVlLnJlc3BvbnNlcyA9IG9iamVjdFZhbHVlLnJlc3BvbnNlcztcclxuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHJlc3BvbnNlKTsgfSwgNTApO1xyXG5cclxuICAgICAgLy8gc2hvdWxkIHB1dCBhIHRpbWVvdXQ/XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8gRXhlY3V0ZSByZXF1ZXN0IHJlY2VpdmVkXHJcbiAgX29uRXhlY3V0ZShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgaWYgKCFtc2cuYm9keS5tZXRob2QpIHRocm93ICdbRGF0YU9iamVjdFJlcG9ydGVyLl9vbkV4ZWN1dGVdIG1ldGhvZCBtaXNzaW5nICcsIG1zZztcclxuXHJcbiAgICBsZXQgcmVzcG9uc2UgPSB7XHJcbiAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICBib2R5OiB7IGNvZGU6IDIwMCB9XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldmVudCA9IHtcclxuICAgICAgdHlwZTogbXNnLnR5cGUsXHJcbiAgICAgIHVybDogbXNnLmZyb20sXHJcbiAgICAgIG1ldGhvZDogbXNnLmJvZHkubWV0aG9kLFxyXG4gICAgICBwYXJhbXM6IG1zZy5ib2R5LnBhcmFtcyxcclxuXHJcbiAgICAgIGFjY2VwdDogKCkgPT4ge1xyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVzcG9uc2UpO1xyXG4gICAgICB9LFxyXG5cclxuICAgICAgcmVqZWN0OiAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcclxuICAgICAgICAgIGJvZHk6IHsgY29kZTogNDAxLCBkZXNjOiByZWFzb24gfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmIChfdGhpcy5fb25FeGVjdXRlSGFuZGxlcikge1xyXG4gICAgICBsb2cubG9nKCdbRGF0YU9iamVjdFJlcG9ydGVyXSBFWEVDVVRFLUVWRU5UOiAnLCBldmVudCk7XHJcbiAgICAgIF90aGlzLl9vbkV4ZWN1dGVIYW5kbGVyKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEYXRhT2JqZWN0UmVwb3J0ZXI7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0RhdGFPYmplY3RPYnNlcnZlcicpO1xyXG5cclxuaW1wb3J0IHsgZGVlcENsb25lIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgRGF0YU9iamVjdCBmcm9tICcuL0RhdGFPYmplY3QnO1xyXG5cclxubGV0IEZpbHRlclR5cGUgPSB7QU5ZOiAnYW55JywgU1RBUlQ6ICdzdGFydCcsIEVYQUNUOiAnZXhhY3QnfTtcclxuXHJcbi8qKlxyXG4gKiBUaGUgY2xhc3MgcmV0dXJuZWQgZnJvbSB0aGUgU3luY2hlciBzdWJzY3JpYmUgY2FsbC5cclxuICogVG8gYmUgdXNlZCBhcyBhbiBvYnNlcnZhdGlvbiBwb2ludCBmcm9tIGEgRGF0YU9iamVjdFJlcG9ydGVyIGNoYW5nZS5cclxuICovXHJcbmNsYXNzIERhdGFPYmplY3RPYnNlcnZlciBleHRlbmRzIERhdGFPYmplY3QgLyogaW1wbGVtZW50cyBTeW5jU3RhdHVzICovIHtcclxuICAvKiBwcml2YXRlXHJcbiAgX2NoYW5nZUxpc3RlbmVyOiBNc2dMaXN0ZW5lclxyXG5cclxuICAtLS0tZXZlbnQgaGFuZGxlcnMtLS0tXHJcbiAgX2ZpbHRlcnM6IHs8ZmlsdGVyPjoge3R5cGU6IDxzdGFydCwgZXhhY3Q+LCBjYWxsYmFjazogPGZ1bmN0aW9uPn0gfVxyXG4gICovXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKiBTaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgSHlwZXJ0aWVzLiBJdCdzIGNhbGxlZCBieSB0aGUgU3luY2hlci5zdWJzY3JpYmUgbWV0aG9kXHJcbiAgICovXHJcblxyXG4gIC8vVE9ETzogRm9yIEZ1cnRoZXIgU3R1ZHlcclxuICBjb25zdHJ1Y3RvcihpbnB1dCkge1xyXG4gICAgLy90b2RvOiBjaGVjayB3aHlcclxuICAgIC8vaW5wdXQuaW5pdGlhbERhdGEgPSBpbnB1dC5pbml0aWFsRGF0YS5kYXRhO1xyXG5cclxuICAgIHN1cGVyKGlucHV0KTtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl92ZXJzaW9uID0gaW5wdXQudmVyc2lvbjtcclxuICAgIF90aGlzLl9maWx0ZXJzID0ge307XHJcblxyXG4gICAgX3RoaXMuX3N5bmNPYmoub2JzZXJ2ZSgoZXZlbnQpID0+IHtcclxuICAgICAgX3RoaXMuX29uRmlsdGVyKGV2ZW50KTtcclxuICAgIH0pO1xyXG5cclxuXHJcbiAgICBfdGhpcy5fYWxsb2NhdGVMaXN0ZW5lcnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN5bmMgRGF0YSBPYmplY3QgT2JzZXJ2ZXIgd2l0aCBsYXN0IHZlcnNpb24gb2YgRGF0YSBPYmplY3QgUmVwb3J0ZXIuIFVzZWZ1bCBmb3IgUmVzdW1lc1xyXG4gICAqL1xyXG4gIHN5bmMoKSB7XHJcblxyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdE9ic2VydmVyX3N5bmNdIHN5bmNocm9uaXNpbmcgJyk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGxldCBjcml0ZXJpYSA9IHt9O1xyXG5cclxuLy8gICAgICBpZiAodGhpcy5tZXRhZGF0YS5iYWNrdXBSZXZpc2lvbikgY3JpdGVyaWEuYmFja3VwUmV2aXNpb24gPSB0aGlzLm1ldGFkYXRhLmJhY2t1cFJldmlzaW9uO1xyXG5cclxuICAgICAgX3RoaXMuX3N5bmNoZXIucmVhZChfdGhpcy5fbWV0YWRhdGEudXJsLCBjcml0ZXJpYSkudGhlbigodmFsdWUpPT57XHJcbiAgICAgICAgbG9nLmluZm8oJ1tEYXRhT2JqZWN0T2JzZXJ2ZXJfc3luY10gdmFsdWUgdG8gc3luYzogJywgdmFsdWUpO1xyXG5cclxuICAgICAgICBPYmplY3QuYXNzaWduKF90aGlzLmRhdGEsIGRlZXBDbG9uZSh2YWx1ZS5kYXRhKSk7XHJcblxyXG4gICAgICAgIF90aGlzLl92ZXJzaW9uID0gdmFsdWUudmVyc2lvbjtcclxuXHJcbiAgICAgICAgX3RoaXMuX21ldGFkYXRhLmxhc3RNb2RpZmllZCA9IHZhbHVlLmxhc3RNb2RpZmllZDtcclxuXHJcbiAgICAgICAgLy9UT0RPOiBjaGVjayBmaXJzdCBpZiB0aGVyZSBhcmUgbmV3IGNoaWxkcmVuT2JqZWN0cyB0byBhdm9pZCBvdmVyaGVhZFxyXG5cclxuICAgICAgICBpZiAodmFsdWUuY2hpbGRyZW5PYmplY3RzKSB7XHJcbiAgICAgICAgICBfdGhpcy5yZXN1bWVDaGlsZHJlbnModmFsdWUuY2hpbGRyZW5PYmplY3RzKTtcclxuICAgICAgICAgIF90aGlzLl9zdG9yZUNoaWxkcmVucygpO1xyXG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9IGVsc2UgcmVzb2x2ZSh0cnVlKTtcclxuXHJcblxyXG4gICAgICAgIC8qaWYgKHZhbHVlLnZlcnNpb24gIT0gX3RoaXMuX3ZlcnNpb24pIHtcclxuICAgICAgICAgIGxvZy5pbmZvKCdbRGF0YU9iamVjdE9ic2VydmVyX3N5bmNdIHVwZGF0aW5nIGV4aXN0aW5nIGRhdGE6ICcsIF90aGlzLmRhdGEpO1xyXG5cclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oX3RoaXMuZGF0YSB8fCB7fSwgZGVlcENsb25lKHZhbHVlLmRhdGEpKTtcclxuXHJcbiAgICAgICAgICBfdGhpcy5fbWV0YWRhdGEgPSBkZWVwQ2xvbmUodmFsdWUpO1xyXG5cclxuICAgICAgICAgIGRlbGV0ZSBfdGhpcy5fbWV0YWRhdGEuZGF0YTtcclxuXHJcbiAgICAgICAgICBfdGhpcy5fdmVyc2lvbiA9IHZhbHVlLnZlcnNpb247XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3RPYnNlcnZlcl9zeW5jXSBleGlzdGluZyBkYXRhIGlzIHVwZGF0ZWQ6ICcsIHZhbHVlKTtcclxuICAgICAgICB9Ki9cclxuXHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICBsb2cuaW5mbygnW0RhdGFPYmplY3RPYnNlcnZlcl9zeW5jXSBzeW5jIGZhaWxlZDogJywgcmVhc29uKTtcclxuICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIF9zdG9yZUNoaWxkcmVucygpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgbGV0IGNoaWxkcmVucyA9IHt9O1xyXG5cclxuICAgIC8vVE9ETzogdG8gYmUgc2VudCB0byBIeXBlcnR5UmVzb3VyY2VTdG9yYWdlIHdoZW4gcmVhZHkgdG8gaGFuZGxlIENoYXQgTWVzc2FnZXNcclxuXHJcbiAgICBPYmplY3Qua2V5cyhfdGhpcy5fY2hpbGRyZW5PYmplY3RzKS5mb3JFYWNoKChjaGlsZElkKSA9PiB7XHJcbiAgICAgIGxldCBjaGlsZHJlbiA9IF90aGlzLl9jaGlsZHJlbk9iamVjdHM7XHJcbi8vICAgICAgY2hpbGRyZW5zW2NoaWxkcmVuUmVzb3VyY2VdID0ge307XHJcblxyXG4vLyAgICAgIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5mb3JFYWNoKChjaGlsZElkKSA9PiB7XHJcbiAgICAgICAgY2hpbGRyZW5zW2NoaWxkSWRdID0ge307XHJcbiAgICAgICAgY2hpbGRyZW5zW2NoaWxkSWRdLnZhbHVlID0gY2hpbGRyZW5bY2hpbGRJZF0ubWV0YWRhdGE7XHJcbiAgICAgICAgY2hpbGRyZW5zW2NoaWxkSWRdLmlkZW50aXR5ID0gY2hpbGRyZW5bY2hpbGRJZF0uaWRlbnRpdHk7XHJcbi8vICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAgIGxldCBtc2cgPSB7XHJcblxyXG4gICAgICAgIGZyb206IF90aGlzLl9vd25lcixcclxuICAgICAgICB0bzogX3RoaXMuX3N5bmNoZXIuX3N1YlVSTCxcclxuICAgICAgICB0eXBlOiAnY3JlYXRlJyxcclxuICAgICAgICBib2R5OiB7XHJcbiAgICAgICAgICByZXNvdXJjZTogX3RoaXMuX3VybCxcclxuICAgICAgICAgIGF0dHJpYnV0ZTogJ2NoaWxkcmVuT2JqZWN0cycsXHJcbiAgICAgICAgICB2YWx1ZTogY2hpbGRyZW5zXHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShtc2cpO1xyXG5cclxuICB9XHJcblxyXG4gIF9hbGxvY2F0ZUxpc3RlbmVycygpIHtcclxuICAgIHN1cGVyLl9hbGxvY2F0ZUxpc3RlbmVycygpO1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5fY2hhbmdlTGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKF90aGlzLl91cmwgKyAnL2NoYW5nZXMnLCAobXNnKSA9PiB7XHJcbiAgICAgIGlmIChtc2cudHlwZSA9PT0gJ3VwZGF0ZScpIHtcclxuICAgICAgICBsb2cubG9nKCdEYXRhT2JqZWN0T2JzZXJ2ZXItJyArIF90aGlzLl91cmwgKyAnLVJDVjogJywgbXNnKTtcclxuICAgICAgICBfdGhpcy5fY2hhbmdlT2JqZWN0KF90aGlzLl9zeW5jT2JqLCBtc2cpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9yZWxlYXNlTGlzdGVuZXJzKCkge1xyXG4gICAgc3VwZXIuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX2NoYW5nZUxpc3RlbmVyLnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVsZWFzZSBhbmQgZGVsZXRlIG9iamVjdCBkYXRhXHJcbiAgICovXHJcbiAgZGVsZXRlKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBpZiAoX3RoaXMuX2hlYXJ0QmVhdCkgX3RoaXMuX2hlYXJ0QmVhdC5zdG9wKCk7XHJcblxyXG4gICAgX3RoaXMuX2RlbGV0ZUNoaWxkcmVucygpLnRoZW4oKCk9PntcclxuICAgICAgX3RoaXMudW5zdWJzY3JpYmUoKTtcclxuICAgICAgX3RoaXMuX3JlbGVhc2VMaXN0ZW5lcnMoKTtcclxuICAgICAgZGVsZXRlIF90aGlzLl9zeW5jaGVyLl9vYnNlcnZlcnNbX3RoaXMuX3VybF07XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWxlYXNlIGFuZCBkZWxldGUgb2JqZWN0IGRhdGFcclxuICAgKi9cclxuICB1bnN1YnNjcmliZSgpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgLy9GTE9XLU9VVDogdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcnVudGltZSBpbnN0YW5jZSBvZiBTeW5jaGVyTWFuYWdlciAtPiBfb25Mb2NhbFVuU3Vic2NyaWJlXHJcbiAgICBsZXQgdW5TdWJzY3JpYmVNc2cgPSB7XHJcbiAgICAgIHR5cGU6ICd1bnN1YnNjcmliZScsIGZyb206IF90aGlzLl9vd25lciwgdG86IF90aGlzLl9zeW5jaGVyLl9zdWJVUkwsXHJcbiAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IF90aGlzLl91cmwgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHVuU3Vic2NyaWJlTXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgbG9nLmxvZygnRGF0YU9iamVjdE9ic2VydmVyLVVOU1VCU0NSSUJFOiAnLCByZXBseSk7XHJcbiAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgIF90aGlzLl9yZWxlYXNlTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgZGVsZXRlIF90aGlzLl9zeW5jaGVyLl9vYnNlcnZlcnNbX3RoaXMuX3VybF07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgdGhlIGNoYW5nZSBsaXN0ZW5lcnMgc2VudCBieSB0aGUgcmVwb3J0ZXJcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsdGVyIC0gRmlsdGVyIHRoYXQgaWRlbnRpZmllcyB0aGUgZmllbGQgKHNlcGFyYXRlZCBkb3QgcGF0aCkuIEFjY2VwdHMgKiBhdCB0aGUgZW5kIGZvciBhIG1vcmUgdW5yZXN0cmljdGVkIGZpbHRlcmluZy5cclxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrXHJcbiAgICovXHJcbiAgb25DaGFuZ2UoZmlsdGVyLCBjYWxsYmFjaykge1xyXG4gICAgbGV0IGtleSA9IGZpbHRlcjtcclxuICAgIGxldCBmaWx0ZXJPYmogPSB7XHJcbiAgICAgIHR5cGU6IEZpbHRlclR5cGUuRVhBQ1QsXHJcbiAgICAgIGNhbGxiYWNrOiBjYWxsYmFja1xyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgaWR4ID0gZmlsdGVyLmluZGV4T2YoJyonKTtcclxuICAgIGlmIChpZHggPT09IGZpbHRlci5sZW5ndGggLSAxKSB7XHJcbiAgICAgIGlmIChpZHggPT09IDApIHtcclxuICAgICAgICBmaWx0ZXJPYmoudHlwZSA9IEZpbHRlclR5cGUuQU5ZO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZpbHRlck9iai50eXBlID0gRmlsdGVyVHlwZS5TVEFSVDtcclxuICAgICAgICBrZXkgPSBmaWx0ZXIuc3Vic3RyKDAsIGZpbHRlci5sZW5ndGggLSAxKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2ZpbHRlcnNba2V5XSA9IGZpbHRlck9iajtcclxuICB9XHJcblxyXG4gIF9vbkZpbHRlcihldmVudCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBPYmplY3Qua2V5cyhfdGhpcy5fZmlsdGVycykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGxldCBmaWx0ZXIgPSBfdGhpcy5fZmlsdGVyc1trZXldO1xyXG4gICAgICBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuQU5ZKSB7XHJcbiAgICAgICAgLy9tYXRjaCBhbnl0aGluZ1xyXG4gICAgICAgIGZpbHRlci5jYWxsYmFjayhldmVudCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLnR5cGUgPT09IEZpbHRlclR5cGUuU1RBUlQpIHtcclxuICAgICAgICAvL2lmIHN0YXJ0cyB3aXRoIGZpbHRlci4uLlxyXG4gICAgICAgIGlmIChldmVudC5maWVsZC5pbmRleE9mKGtleSkgPT09IDApIHtcclxuICAgICAgICAgIGZpbHRlci5jYWxsYmFjayhldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGZpbHRlci50eXBlID09PSBGaWx0ZXJUeXBlLkVYQUNUKSB7XHJcbiAgICAgICAgLy9leGFjdCBtYXRjaFxyXG4gICAgICAgIGlmIChldmVudC5maWVsZCA9PT0ga2V5KSB7XHJcbiAgICAgICAgICBmaWx0ZXIuY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkRpc2Nvbm5lY3RlZChjYWxsYmFjaykge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICB0aGlzLl9zdWJzY3JpYmVSZWdpc3RyYXRpb24oKVxyXG4gICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fb25EaXNjb25uZWN0ZWQgPSBjYWxsYmFjaztcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiByZWplY3QoZXJyKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9zdWJzY3JpYmVSZWdpc3RyYXRpb24oKSB7XHJcblxyXG4gICAgY29uc3QgbXNnID0ge1xyXG4gICAgICB0eXBlOiAnc3Vic2NyaWJlJyxcclxuICAgICAgZnJvbTogdGhpcy5fb3duZXIsXHJcbiAgICAgIHRvOiB0aGlzLl9zeW5jaGVyLl9ydW50aW1lVXJsICsgJy9zdWJzY3JpcHRpb25zJyxcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlczogW3RoaXMuX3VybCArICcvcmVnaXN0cmF0aW9uJ11cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgdGhpcy5fYnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZyhgW0RhdGFPYmplY3RPYnNlcnZlci5fc3Vic2NyaWJlUmVnaXN0cmF0aW9uXSAke3RoaXMuX3VybH0gcmN2ZWQgcmVwbHkgYCwgcmVwbHkpO1xyXG5cclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMuX2dlbmVyYXRlTGlzdGVuZXIodGhpcy5fdXJsICsgJy9yZWdpc3RyYXRpb24nKTtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciBzdWJzY3JpYmluZyByZWdpc3RyYXRpb24gc3RhdHVzIGZvciAnLCB0aGlzLl91cmwpO1xyXG4gICAgICAgICAgcmVqZWN0KCdFcnJvciBzdWJzY3JpYmluZyByZWdpc3RyYXRpb24gc3RhdHVzIGZvciAnICsgdGhpcy5fdXJsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBfZ2VuZXJhdGVMaXN0ZW5lcihub3RpZmljYXRpb25VUkwpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX2J1cy5hZGRMaXN0ZW5lcihub3RpZmljYXRpb25VUkwsIChtc2cpID0+IHtcclxuICAgICAgbG9nLmxvZyhgW0RhdGFPYmplY3RPYnNlcnZlci5yZWdpc3RyYXRpb25Ob3RpZmljYXRpb25dICR7X3RoaXMuX3VybH06IGAsIG1zZyk7XHJcbiAgICAgIGlmIChtc2cuYm9keS52YWx1ZSAmJiBtc2cuYm9keS52YWx1ZSA9PT0gJ2Rpc2Nvbm5lY3RlZCcgJiYgX3RoaXMuX29uRGlzY29ubmVjdGVkKSB7XHJcbiAgICAgICAgbG9nLmxvZyhgW0RhdGFPYmplY3RPYnNlcnZlcl0gJHtfdGhpcy5fdXJsfTogd2FzIGRpc2Nvbm5lY3RlZCBgLCBtc2cpO1xyXG4gICAgICAgIF90aGlzLl9vbkRpc2Nvbm5lY3RlZCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXF1ZXN0cyB0aGUgcmVwb3J0ZXIgdG8gZXhlY3V0ZSBhIG1ldGhvZCBvbiB0aGUgZGF0YSBvYmplY3RcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kIC0gTmFtZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQuXHJcbiAgICogQHBhcmFtIHthcnJheX0gcGFyYW1zIC0gYXJyYXkgb2YgcGFyYW1ldGVycyBmb3IgdGhlIHJlcXVlc3RlZCBmdW5jdGlvblxyXG4gICAqIEByZXR1cm4ge3Byb21pc2V9XHJcbiAgICovXHJcblxyXG4gIGV4ZWN1dGUobWV0aG9kLCBwYXJhbXMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGNvbnN0IG1zZyA9IHtcclxuICAgICAgICB0eXBlOiAnZXhlY3V0ZScsXHJcbiAgICAgICAgZnJvbTogdGhpcy5fb3duZXIsXHJcbiAgICAgICAgdG86IF90aGlzLl91cmwsXHJcbiAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgbWV0aG9kOiBtZXRob2QsXHJcbiAgICAgICAgICBwYXJhbXM6IHBhcmFtc1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKGBbRGF0YU9iamVjdE9ic2VydmVyLmV4ZWN1dGVdICR7X3RoaXMuX3VybH0gcmN2ZWQgcmVwbHkgYCwgcmVwbHkpO1xyXG5cclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9nLndhcm4oYFtEYXRhT2JqZWN0T2JzZXJ2ZXIuZXhlY3V0ZV0gZXhlY3V0aW9uIG9mIG1ldGhvZCAke21ldGhvZH0gd2FzIHJlamVjdCBieSByZXBvcnRlcmApO1xyXG4gICAgICAgICAgcmVqZWN0KGBbRGF0YU9iamVjdE9ic2VydmVyLmV4ZWN1dGVdIGV4ZWN1dGlvbiBvZiBtZXRob2QgJHttZXRob2R9IHdhcyByZWplY3QgYnkgcmVwb3J0ZXJgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEYXRhT2JqZWN0T2JzZXJ2ZXI7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4gKiBAYWNjZXNzIHByaXZhdGVcclxuICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgY29sbGVjdGluZyBkZWx0YSBjaGFuZ2VzIGluIHJlbW90ZSBvYmplY3RzLCBiZWZvcmUgdGhlIHJlc3BvbnNlIG9mIHN1YnNjcmlwdGlvbiByZWFjaCB0aGUgb2JzZXJ2ZXIuXHJcbiAqIEl0J3MgdXNlZCBpbiBTeW5jaGVyIC0+IHN1YnNjcmliZS4gVGhlIGZsb3cgaXMgZGVmaW5lZCBhczpcclxuICogMS4gKG9ic2VydmVyKSAtLXN1YnNjcmliZS0tPiAocmVwb3J0ZXIpXHJcbiAqIDIuIChvYnNlcnZlcikgPC0tZGVsdGEgdXBkYXRlcy0tIChyZXBvcnRlcilcclxuICogMy4gKG9ic2VydmVyKSA8LS1zdWJzY3JpYmUgcmVzcG9uc2UtLSAocmVwb3J0ZXIpXHJcbiAqIFRoaXMgbWVhbnMgdGhhdCB0aGVyZSBjb3VsZCBiZSBkZWx0YSB1cGRhdGVzIHRyYW5zZmVycmVkIGJlZm9yZSB0aGUgc3Vic2NyaXB0aW9uIGNvbmZpcm1hdGlvbi5cclxuICogU2luY2UgdGhlcmUgaXMgbm8gRGF0YU9iamVjdE9ic2VydmVyIGJlZm9yZSB0aGUgdWJzY3JpcHRpb24gY29uZmlybWF0aW9uLCB0aGVyZSBzaG91bGQgYmUgc29tZSBvdGhlciBvYmplY3QgY29sbGVjdGluZyB0aGUgdXBkYXRlcy5cclxuICogUHJvdmlzaW9uYWwgZGF0YSBpcyBhcHBsaWVkIHRvIHRoZSBEYXRhT2JqZWN0T2JzZXJ2ZXIgYWZ0ZXIgY29uZmlybWF0aW9uLiBPciBkaXNjYXJkZWQgaWYgdGhlcmUgaXMgbm8gY29uZmlybWF0aW9uLlxyXG4gKi9cclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0RhdGFQcm92aXNpb25hbCcpO1xyXG5cclxuY2xhc3MgRGF0YVByb3Zpc2lvbmFsIHtcclxuICAvKiBwcml2YXRlXHJcbiAgX2NoaWxkcmVuTGlzdGVuZXJzOiBbTXNnTGlzdGVuZXJdXHJcbiAgX2xpc3RlbmVyOiBNc2dMaXN0ZW5lclxyXG5cclxuICBfY2hhbmdlczogW11cclxuICAqL1xyXG5cclxuICBjb25zdHJ1Y3Rvcihvd25lciwgdXJsLCBidXMsIGNoaWxkcmVuKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9vd25lciA9IG93bmVyO1xyXG4gICAgX3RoaXMuX3VybCA9IHVybDtcclxuICAgIF90aGlzLl9idXMgPSBidXM7XHJcbiAgICBfdGhpcy5fY2hpbGRyZW4gPSBjaGlsZHJlbjtcclxuXHJcbiAgICBfdGhpcy5fY2hhbmdlcyA9IFtdO1xyXG4gICAgX3RoaXMuX2FsbG9jYXRlTGlzdGVuZXJzKCk7XHJcbiAgfVxyXG5cclxuICBfYWxsb2NhdGVMaXN0ZW5lcnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9saXN0ZW5lciA9IF90aGlzLl9idXMuYWRkTGlzdGVuZXIoX3RoaXMuX3VybCwgKG1zZykgPT4ge1xyXG4gICAgICBsb2cubG9nKCdEYXRhUHJvdmlzaW9uYWwtJyArIF90aGlzLl91cmwgKyAnLVJDVjogJywgbXNnKTtcclxuICAgICAgX3RoaXMuX2NoYW5nZXMucHVzaChtc2cpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLypcclxuICAgIF90aGlzLl9jaGlsZHJlbkxpc3RlbmVycyA9IFtdO1xyXG4gICAgaWYgKF90aGlzLl9jaGlsZHJlbikge1xyXG4gICAgICBsZXQgY2hpbGRCYXNlVVJMID0gdXJsICsgJy9jaGlsZHJlbi8nO1xyXG4gICAgICBfdGhpcy5fY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgICBsZXQgY2hpbGRVUkwgPSBjaGlsZEJhc2VVUkwgKyBjaGlsZDtcclxuICAgICAgICBsZXQgbGlzdGVuZXIgPSBfdGhpcy5fYnVzLmFkZExpc3RlbmVyKGNoaWxkVVJMLCAobXNnKSA9PiB7XHJcbiAgICAgICAgICAvL2lnbm9yZSBtc2cgc2VudCBieSBoaW1zZWxmXHJcbiAgICAgICAgICBpZiAobXNnLmZyb20gIT09IG93bmVyKSB7XHJcbiAgICAgICAgICAgIGxvZy5sb2cobXNnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgX3RoaXMuX2NoaWxkcmVuTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xyXG4gICAgICB9KTtcclxuICAgIH0qL1xyXG4gIH1cclxuXHJcbiAgX3JlbGVhc2VMaXN0ZW5lcnMoKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIF90aGlzLl9saXN0ZW5lci5yZW1vdmUoKTtcclxuXHJcbiAgICAvKl90aGlzLl9jaGlsZHJlbkxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICBsaXN0ZW5lci5yZW1vdmUoKTtcclxuICAgIH0pOyovXHJcbiAgfVxyXG5cclxuICBnZXQgY2hpbGRyZW4oKSB7IHJldHVybiB0aGlzLl9jaGlsZHJlbjsgfVxyXG5cclxuICBhcHBseShvYnNlcnZlcikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIF90aGlzLl9jaGFuZ2VzLmZvckVhY2goKGNoYW5nZSkgPT4ge1xyXG4gICAgICBvYnNlcnZlci5fY2hhbmdlT2JqZWN0KG9ic2VydmVyLl9zeW5jT2JqLCBjaGFuZ2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEYXRhUHJvdmlzaW9uYWw7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vIExvZyBTeXN0ZW1cclxuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gJ2xvZ2xldmVsJztcclxubGV0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ1N5bmNoZXInKTtcclxuXHJcbmltcG9ydCB7IGRlZXBDbG9uZSwgZGl2aWRlVVJMIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuaW1wb3J0IERhdGFPYmplY3RSZXBvcnRlciBmcm9tICcuL0RhdGFPYmplY3RSZXBvcnRlcic7XHJcbmltcG9ydCBEYXRhT2JqZWN0T2JzZXJ2ZXIgZnJvbSAnLi9EYXRhT2JqZWN0T2JzZXJ2ZXInO1xyXG5pbXBvcnQgRGF0YVByb3Zpc2lvbmFsIGZyb20gJy4vRGF0YVByb3Zpc2lvbmFsJztcclxuXHJcbi8qKlxyXG4qIFRoZSBtYWluIGNsYXNzIGZvciB0aGUgc3luY2hlciBwYWNrYWdlLlxyXG4qIFRoZSBTeW5jaGVyIGlzIGEgc2luZ2xldG9uIGNsYXNzIHBlciBIeXBlcnR5L1VSTCBhbmQgaXQgaXMgdGhlIG93bmVyIG9mIGFsbCBjcmVhdGVkIERhdGEgU3luYyBPYmplY3RzIGFjY29yZGluZyB0byB0aGUgUmVwb3J0ZXIgLSBPYnNlcnZlciBwYXR0ZXJuLlxyXG4qIE1haW4gZnVuY3Rpb25hbGl0eSBpcyB0byBjcmVhdGUgcmVwb3J0ZXJzIGFuZCB0byBzdWJzY3JpYmUgdG8gZXhpc3Rpbmcgb25lcy5cclxuKi9cclxuY2xhc3MgU3luY2hlciB7XHJcbiAgLyogcHJpdmF0ZVxyXG4gIF9vd25lcjogVVJMXHJcbiAgX2J1czogTWluaUJ1c1xyXG5cclxuICBfc3ViVVJMOiBVUkxcclxuXHJcbiAgX3JlcG9ydGVyczogPHVybDogRGF0YU9iamVjdFJlcG9ydGVyPlxyXG4gIF9vYnNlcnZlcnM6IDx1cmw6IERhdGFPYmplY3RPYnNlcnZlcj5cclxuICBfcHJvdmlzaW9uYWxzOiA8dXJsOiBEYXRhUHJvdmlzaW9uYWw+XHJcblxyXG4gIC0tLS1ldmVudCBoYW5kbGVycy0tLS1cclxuICBfb25Ob3RpZmljYXRpb25IYW5kbGVyOiAoZXZlbnQpID0+IHZvaWRcclxuICBfb25SZXN1bWU6IChldmVudCkgPT4gdm9pZFxyXG4gICovXHJcblxyXG4gIC8qKlxyXG4gICogQ29uc3RydWN0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgSHlwZXJ0eSBvd25lclxyXG4gICogQHBhcmFtIHtIeXBlcnR5VVJMfSBvd25lciAtIEh5cGVydHkgVVJMIG93bmVyLiBBbiBVUkwgYWxsb2NhdGVkIGJ5IHRoZSBydW50aW1lIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgSHlwZXJ0eS5cclxuICAqIEBwYXJhbSB7TWluaUJ1c30gYnVzIC0gQW4gaW5zdGFuY2Ugb2YgdGhlIE1pbmlCdXMgcHJvdmlkZWQgaW4gdGhlIHNhbmRib3guIFdoZW4gYW4gb2JqZWN0IChSZXBvcnRlciBvciBPYnNlcnZlZCkgaXMgY3JlYXRlZCwgdGhlIFN5bmNoZXJNYW5hZ2VyIHdpbGwgYWRkIGEgbGlzdGVuZXIgaW4gdGhlIE1pbmlCdXMgdG8gcmVjZWl2ZS9zZW5kIE1lc3NhZ2VzIG9mIHRoYXQgb2JqZWN0LlxyXG4gICogQHBhcmFtIHtKU09OfSBjb25maWcgLSBDb25maWd1cmF0aW9uIGRhdGEuIFRoZSBvbmx5IHJlcXVpcmVkIGZpZWxkIGZvciBub3cgaXMgdGhlIHJ1bnRpbWVVUkwuXHJcbiAgKi9cclxuICBjb25zdHJ1Y3Rvcihvd25lciwgYnVzLCBjb25maWcpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMuX293bmVyID0gb3duZXI7XHJcbiAgICBfdGhpcy5fYnVzID0gYnVzO1xyXG5cclxuICAgIF90aGlzLl9zdWJVUkwgPSBjb25maWcucnVudGltZVVSTCArICcvc20nO1xyXG4gICAgX3RoaXMuX3J1bnRpbWVVcmwgPSBjb25maWcucnVudGltZVVSTDtcclxuXHJcbiAgICBfdGhpcy5fcDJwSGFuZGxlciA9IGNvbmZpZy5wMnBIYW5kbGVyO1xyXG4gICAgX3RoaXMuX3AycFJlcXVlc3RlciA9IGNvbmZpZy5wMnBSZXF1ZXN0ZXI7XHJcblxyXG4gICAgX3RoaXMuX3JlcG9ydGVycyA9IHt9O1xyXG4gICAgX3RoaXMuX29ic2VydmVycyA9IHt9O1xyXG4gICAgX3RoaXMuX3Byb3Zpc2lvbmFscyA9IHt9O1xyXG5cclxuICAgIGJ1cy5hZGRMaXN0ZW5lcihvd25lciwgKG1zZykgPT4ge1xyXG4gICAgICAvL2lnbm9yZSBtc2cgc2VudCBieSBoaW1zZWxmXHJcbiAgICAgIGlmIChtc2cuZnJvbSAhPT0gb3duZXIpIHtcclxuICAgICAgICBsb2cuaW5mbygnW1N5bmNoZXJdIFN5bmNoZXItUkNWOiAnLCBtc2csIF90aGlzKTtcclxuICAgICAgICBzd2l0Y2ggKG1zZy50eXBlKSB7XHJcbiAgICAgICAgICBjYXNlICdmb3J3YXJkJzogX3RoaXMuX29uRm9yd2FyZChtc2cpOyBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ2NyZWF0ZSc6IF90aGlzLl9vblJlbW90ZUNyZWF0ZShtc2cpOyBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6IF90aGlzLl9vblJlbW90ZURlbGV0ZShtc2cpOyBicmVhaztcclxuICAgICAgICAgIGNhc2UgJ2V4ZWN1dGUnOiBfdGhpcy5fb25FeGVjdXRlKG1zZyk7IGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFRoZSBvd25lciBvZiB0aGUgU3luY2hlciBhbmQgYWxsIGNyZWF0ZWQgcmVwb3J0ZXJzLlxyXG4gICogQHR5cGUge0h5cGVydHlVUkx9XHJcbiAgKi9cclxuICBnZXQgb3duZXIoKSB7IHJldHVybiB0aGlzLl9vd25lcjsgfVxyXG5cclxuICAvKipcclxuICAqIEFsbCBvd25lZCByZXBvcnRlcnMsIHRoZSBvbmVzIHRoYXQgd2VyZSBjcmVhdGVkIGJ5IGEgY3JlYXRlXHJcbiAgKiBAdHlwZSB7T2JqZWN0PFVSTCwgRGF0YU9iamVjdFJlcG9ydGVyPn1cclxuICAqL1xyXG4gIGdldCByZXBvcnRlcnMoKSB7IHJldHVybiB0aGlzLl9yZXBvcnRlcnM7IH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBbGwgb3duZWQgb2JzZXJ2ZXJzLCB0aGUgb25lcyB0aGF0IHdlcmUgY3JlYXRlZCBieSBhIGxvY2FsIHN1YnNjcmlwdGlvblxyXG4gICogQHR5cGUge09iamVjdDxVUkwsIERhdGFPYmplY3RPYnNlcnZlcj59XHJcbiAgKi9cclxuICBnZXQgb2JzZXJ2ZXJzKCkgeyByZXR1cm4gdGhpcy5fb2JzZXJ2ZXJzOyB9XHJcblxyXG4gIC8qKlxyXG4gICogUmVxdWVzdCBhIERhdGFPYmplY3RSZXBvcnRlciBjcmVhdGlvbi4gVGhlIFVSTCB3aWxsIGJlIGJlIHJlcXVlc3RlZCBieSB0aGUgYWxsb2NhdGlvbiBtZWNoYW5pc20uXHJcbiAgKiBAcGFyYW0gIHtTY2hlbWFVUkx9IHNjaGVtYSAtIEh5cGVydHkgQ2F0YWxvZ3VlIFVSTCBhZGRyZXNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIEpTT04tU2NoZW1hIGRlc2NyaWJpbmcgdGhlIERhdGEgT2JqZWN0IHNjaGVtYVxyXG4gICogQHBhcmFtICB7SHlwZXJ0eVVSTFtdfSBvYnNlcnZlcnMgLSBMaXN0IG9mIGh5cGVydGllcyB0aGF0IGFyZSBwcmUtYXV0aG9yaXplZCBmb3Igc3Vic2NyaXB0aW9uXHJcbiAgKiBAcGFyYW0gIHtKU09OfSBpbml0aWFsRGF0YSAtIEluaXRpYWwgZGF0YSBvZiB0aGUgcmVwb3J0ZXJcclxuICAqIEBwYXJhbSAge2Jvb2xlYW59IHN0b3JlIC0gKE9wdGlvbmFsKSBpZiB0cnVlLCBvYmplY3Qgd2lsbCBiZSBzdG9yZWQgYnkgdGhlIHJ1bnRpbWVcclxuICAqIEBwYXJhbSAge2Jvb2xlYW59IHAycCAtIChPcHRpb25hbCkgaWYgdHJ1ZSwgZGF0YSBzeW5jaHJvbmlzYXRpb24gc3RyZWFtIHdpbGwgdXNlIHAycCBjb25uZWN0aW9uIGFzIG11Y2ggYXMgcG9zc2libGVcclxuICAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSAtIChPcHRpb25hbCkgdGhlIG5hbWUgb2YgdGhlIGRhdGFvYmplY3RcclxuICAqIEBwYXJhbSAge01lc3NhZ2VCb2R5SWRlbnRpdHl9IGlkZW50aXR5IC0gKG9wdGlvbmFsKSBpZGVudGl0eSBkYXRhIHRvIGJlIGFkZGVkIHRvIGlkZW50aXR5IHRoZSB1c2VyIHJlcG9ydGVyLiBUbyBiZSB1c2VkIGZvciBsZWdhY3kgaWRlbnRpdGllcy5cclxuICAqIEBwYXJhbSAge1N5bmNNZXRhZGF0YX0gaW5wdXQgLSAob3B0aW9uYWwpIGFsbCBtZXRhZGF0YSByZXF1aXJlZCB0byBzdW5jIHRoZSBEYXRhIE9iamVjdC5cclxuICAqIEByZXR1cm4ge1Byb21pc2U8RGF0YU9iamVjdFJlcG9ydGVyPn0gUmV0dXJuIFByb21pc2UgdG8gYSBuZXcgUmVwb3J0ZXIuIFRoZSByZXBvcnRlciBjYW4gYmUgYWNjZXB0ZWQgb3IgcmVqZWN0ZWQgYnkgdGhlIFBFUFxyXG4gICovXHJcbiAgY3JlYXRlKHNjaGVtYSwgb2JzZXJ2ZXJzLCBpbml0aWFsRGF0YSwgc3RvcmUgPSBmYWxzZSwgcDJwID0gZmFsc2UsIG5hbWUgPSAnbm8gbmFtZScsIGlkZW50aXR5LCBpbnB1dCkge1xyXG5cclxuICAgIGlmICghc2NoZW1hKSB0aHJvdyBFcnJvcignW1N5bmNoZXIgLSBDcmVhdGVdIC0gWW91IG5lZWQgc3BlY2lmeSB0aGUgZGF0YSBvYmplY3Qgc2NoZW1hJyk7XHJcbiAgICBpZiAoIW9ic2VydmVycykgdGhyb3cgRXJyb3IoJ1tTeW5jaGVyIC0gQ3JlYXRlXSAtVGhlIG9ic2VydmVycyBzaG91bGQgYmUgZGVmaW5lZCcpO1xyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBpbnB1dCA9IGlucHV0IHx8IHt9O1xyXG4gICAgbGV0IGNyZWF0ZUlucHV0ICA9IE9iamVjdC5hc3NpZ24oe30sIGlucHV0KTtcclxuXHJcbiAgICBjcmVhdGVJbnB1dC5wMnAgPSBwMnA7XHJcbiAgICBjcmVhdGVJbnB1dC5zdG9yZSA9IHN0b3JlO1xyXG4gICAgY3JlYXRlSW5wdXQuc2NoZW1hID0gc2NoZW1hO1xyXG4gICAgY3JlYXRlSW5wdXQuYXV0aG9yaXNlID0gb2JzZXJ2ZXJzO1xyXG4gICAgY3JlYXRlSW5wdXQucDJwSGFuZGxlciA9IF90aGlzLl9wMnBIYW5kbGVyO1xyXG4gICAgY3JlYXRlSW5wdXQucDJwUmVxdWVzdGVyID0gX3RoaXMuX3AycFJlcXVlc3RlcjtcclxuICAgIChpbml0aWFsRGF0YSkgPyBjcmVhdGVJbnB1dC5kYXRhID0gZGVlcENsb25lKGluaXRpYWxEYXRhKSA6IGNyZWF0ZUlucHV0LmRhdGEgPSB7fTtcclxuICAgIGNyZWF0ZUlucHV0Lm5hbWUgPSBuYW1lLmxlbmd0aCA9PT0gMCA/ICdubyBuYW1lJyA6IG5hbWU7XHJcbiAgICBjcmVhdGVJbnB1dC5yZXBvcnRlciA9IChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgncmVwb3J0ZXInKSAmJiAoKHR5cGVvZiBpbnB1dC5yZXBvcnRlcikgIT09ICdib29sZWFuJykpID8gaW5wdXQucmVwb3J0ZXIgOiBfdGhpcy5fb3duZXI7XHJcbiAgICBjcmVhdGVJbnB1dC5yZXN1bWUgPSBmYWxzZTtcclxuICAgIGlmIChpbnB1dCkge1xyXG4gICAgICBjcmVhdGVJbnB1dC5tdXR1YWwgPSBpbnB1dC5oYXNPd25Qcm9wZXJ0eSgnbXV0dWFsJykgPyBpbnB1dC5tdXR1YWwgOiBmYWxzZTtcclxuICAgICAgY3JlYXRlSW5wdXQubmFtZSA9IGlucHV0Lmhhc093blByb3BlcnR5KCduYW1lJykgPyBpbnB1dC5uYW1lIDogY3JlYXRlSW5wdXQubmFtZTtcclxuICAgIH0gZWxzZSB7IGNyZWF0ZUlucHV0Lm11dHVhbCA9IGZhbHNlOyB9XHJcblxyXG4gICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCdyZXVzZVVSTCcpKSB7XHJcbiAgICAgIGNyZWF0ZUlucHV0LnJlc291cmNlID0gaW5wdXQucmV1c2VVUkw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGlkZW50aXR5KSAgICAgIHsgY3JlYXRlSW5wdXQuaWRlbnRpdHkgPSBpZGVudGl0eTsgfVxyXG5cclxuICAgIC8vT2JqZWN0LmFzc2lnbihjcmVhdGVJbnB1dCwge3Jlc3VtZTogZmFsc2V9KTtcclxuICAgIC8vZGVidWdnZXI7XHJcbi8vICAgIGNvbnNvbGUubG9nKCdbc3luY2hlciAtIGNyZWF0ZV0gLSBjcmVhdGUgUmVwb3J0ZXIgLSBjcmVhdGVJbnB1dDogJywgY3JlYXRlSW5wdXQpO1xyXG5cclxuICAgIHJldHVybiBfdGhpcy5fY3JlYXRlKGNyZWF0ZUlucHV0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogUmVxdWVzdCBhIERhdGFPYmplY3RSZXBvcnRlciBjcmVhdGlvbi4gVGhlIFVSTCB3aWxsIGJlIGJlIHJlcXVlc3RlZCBieSB0aGUgYWxsb2NhdGlvbiBtZWNoYW5pc20uXHJcbiAgKiBAcGFyYW0gIHtPYmplY3R9IGNyaXRlcmlhIC0gKG9wdGlvbmFsKSBpZGVudGl0eSBkYXRhIHRvIGJlIGFkZGVkIHRvIGlkZW50aXR5IHRoZSB1c2VyIHJlcG9ydGVyLiBUbyBiZSB1c2VkIGZvciBsZWdhY3kgaWRlbnRpdGllcy5cclxuICAqIEByZXR1cm4ge1Byb21pc2U8RGF0YU9iamVjdFJlcG9ydGVyPltdfSBSZXR1cm4gYSBwcm9taXNlIHdpdGggYSBsaXN0IG9mIERhdGFPYmplY3RSZXBvcnRlciB0byBiZSByZXN1bWVkO1xyXG4gICovXHJcbiAgcmVzdW1lUmVwb3J0ZXJzKGNyaXRlcmlhKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbG9nLmxvZygnW3N5bmNoZXIgLSBjcmVhdGVdIC0gcmVzdW1lIFJlcG9ydGVyIC0gY3JpdGVyaWE6ICcsIGNyaXRlcmlhKTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGNyaXRlcmlhLCB7cmVzdW1lOiB0cnVlfSk7XHJcblxyXG4gICAgcmV0dXJuIF90aGlzLl9yZXN1bWVDcmVhdGUoY3JpdGVyaWEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBSZXF1ZXN0IGEgc3Vic2NyaXB0aW9uIHRvIGFuIGV4aXN0ZW50IHJlcG9ydGVyIG9iamVjdC5cclxuICAqIEBwYXJhbSB7U2NoZW1hVVJMfSBzY2hlbWEgLSBIeXBlcnR5IENhdGFsb2d1ZSBVUkwgYWRkcmVzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBKU09OLVNjaGVtYSBkZXNjcmliaW5nIHRoZSBEYXRhIE9iamVjdCBzY2hlbWFcclxuICAqIEBwYXJhbSB7T2JqZWN0VVJMfSBvYmpVUkwgLSBBZGRyZXNzIG9mIHRoZSBleGlzdGVudCByZXBvcnRlciBvYmplY3QgdG8gYmUgb2JzZXJ2ZWRcclxuICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0b3JlPWZhbHNlXSAtIFNhdmUgdGhlIHN1YnNjcmlwdGlvbiBvbiB0aGUgU3luY2hlciBNYW5hZ2VyIGZvciBmdXJ0aGVyIHJlc3VtZSAoRGVmYXVsdCBpcyBmYWxzZSlcclxuICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3AycD1mYWxzZV0gLSBJbmZvIGFib3V0IGlmIHNob3VsZCB1c2UgcDJwIGNvbm5lY3Rpb24gKERlZmF1bHQgaXMgZmFsc2UpXHJcbiAgKiBAcGFyYW0ge0Jvb2xlYW59IFttdXR1YWw9dHJ1ZV0gLSBJbmZvIGFib3V0IGlmIG1lc3NhZ2VzIG9mIHRoaXMgb2JqZWN0IHNob3VsZCBiZSBlbmNyeXB0ZWQgKERlZmF1bHQgaXMgdHJ1ZSlcclxuICAqIEBwYXJhbSAge01lc3NhZ2VCb2R5SWRlbnRpdHl9IGlkZW50aXR5IC0gKG9wdGlvbmFsKSBpZGVudGl0eSBkYXRhIHRvIGJlIGFkZGVkIHRvIGlkZW50aXR5IHRoZSB1c2VyIHJlcG9ydGVyLiBUbyBiZSB1c2VkIGZvciBsZWdhY3kgaWRlbnRpdGllcy5cclxuICAqIEByZXR1cm4ge1Byb21pc2U8RGF0YU9iamVjdE9ic2VydmVyPn0gUmV0dXJuIFByb21pc2UgdG8gYSBuZXcgb2JzZXJ2ZXIuIEl0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXBvcnRlci5cclxuICAqL1xyXG5cclxuICBzdWJzY3JpYmUoaW5wdXQpIHtcclxuICAvKiAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBjcml0ZXJpYSA9IHt9O1xyXG5cclxuICAgIGNyaXRlcmlhLnAycCA9IHAycDtcclxuICAgIGNyaXRlcmlhLnN0b3JlID0gc3RvcmU7XHJcbiAgICBjcml0ZXJpYS5zY2hlbWEgPSBzY2hlbWE7XHJcbiAgICBjcml0ZXJpYS5kb21haW5fc3Vic2NyaXB0aW9uID0gZG9tYWluX3N1YnNjcmlwdGlvbjtcclxuXHJcbiAgICBjcml0ZXJpYS5yZXNvdXJjZSA9IG9ialVSTDtcclxuICAgIGlmIChpZGVudGl0eSkgICAgICB7IGNyaXRlcmlhLmlkZW50aXR5ID0gaWRlbnRpdHk7IH1cclxuXHJcbiAgICAvL1RPRE86IEZvciBGdXJ0aGVyIFN0dWR5XHJcbiAgICBjcml0ZXJpYS5tdXR1YWwgPSBtdXR1YWw7XHJcblxyXG4gICAgbG9nLmxvZygnW3N5bmNoZXIgLSBzdWJzY3JpYmVdIC0gc3Vic2NyaWJlIGNyaXRlcmlhOiAnLCBjcml0ZXJpYSk7XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihjcml0ZXJpYSwge3Jlc3VtZTogZmFsc2V9KTsqL1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9zdWJzY3JpYmUoaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBSZXF1ZXN0IGEgc3Vic2NyaXB0aW9uIHRvIGFuIGV4aXN0ZW50IHJlcG9ydGVyIG9iamVjdC5cclxuICAqIEBwYXJhbSB7Y3JpdGVyaWF9IGNyaXRlcmlhIC0gSW5mb3JtYXRpb24gdG8gZGlzY292ZXJ5IHRoZSBvYnNlcnZlciBvYmplY3RcclxuICAqIEByZXR1cm4ge1Byb21pc2U8RGF0YU9iamVjdE9ic2VydmVyPn0gUmV0dXJuIFByb21pc2UgdG8gYSBuZXcgb2JzZXJ2ZXIuIEl0J3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXBvcnRlci5cclxuICAqL1xyXG4gIHJlc3VtZU9ic2VydmVycyhjcml0ZXJpYSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBfY3JpdGVyaWEgPSBjcml0ZXJpYSB8fCB7fTtcclxuXHJcbiAgICBPYmplY3QuYXNzaWduKF9jcml0ZXJpYSwge3Jlc3VtZTogdHJ1ZX0pO1xyXG5cclxuICAgIHJldHVybiBfdGhpcy5fcmVzdW1lU3Vic2NyaWJlKF9jcml0ZXJpYSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFJlcXVlc3QgYSByZWFkIGFjdGlvbiBvbiB0aGUgcmVwb3J0ZXIgb2JqZWN0XHJcbiAgKiBAcGFyYW0ge09iamVjdFVSTH0gb2JqVVJMIC0gVVJMIG9mIHRoZSByZXBvcnRlciBvYmplY3QgdG8gYmUgcmVhZFxyXG4gICogQHJldHVybiB7UHJvbWlzZTxPYmplY3Q+fSBSZXR1cm4gUHJvbWlzZSB0byBsYXN0IGF2YWlsYWJsZSBkYXRhIG9mIHRoZSByZXBvcnRlclxyXG4gICovXHJcbiAgcmVhZChvYmpVUkwsIGNyaXRlcmlhKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgY29uc29sZS5sb2coJ1tTeW5jaGVyLnJlYWRdICcsIG9ialVSTCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAvLyBpbiBjYXNlIHRoZSBvYmplY3QgaXMgc3luY2hlZCBpbiBhIHJlbW90ZSBzdG9yYWdlLCBsZXRzIHN5bmMgd2l0aCBpdFxyXG4vKiAgICAgIGlmIChfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF0gJiYgX3RoaXMuX29ic2VydmVyc1tvYmpVUkxdLm1ldGFkYXRhLmhhc093blByb3BlcnR5KCdiYWNrdXAnKSAmJiBfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF0ubWV0YWRhdGEuYmFja3VwKSB7XHJcblxyXG4gICAgICAgIGxldCByZWFkTXNnID0ge1xyXG4gICAgICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBfdGhpcy5fb3duZXIsIHRvOiBfdGhpcy5fc3ViVVJMLCBcclxuICAgICAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IG9ialVSTH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoY3JpdGVyaWEpIHJlYWRNc2cuYm9keS5jcml0ZXJpYSA9IGNyaXRlcmlhO1xyXG5cclxuICAgICAgICAgIGxldCBjYWxsYmFjayA9IChyZXBseSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuX3JlYWRDYWxsQmFjayhyZXBseSwgcmVzb2x2ZSwgcmVqZWN0KTtcclxuICAgICAgICAgIH07XHJcbiAgICBcclxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVhZE1zZywgY2FsbGJhY2ssIGZhbHNlKTtcclxuICAgIFxyXG4gICAgICB9IGVsc2UgeyovXHJcbiAgICAgICAgX3RoaXMuX3JlYWRSZXBvcnRlcihvYmpVUkwpLnRoZW4oKHJlc3VsdCk9PiB7XHJcbiAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuLy8gICAgfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIF9yZWFkQ2FsbEJhY2socmVwbHksIHJlc29sdmUscmVqZWN0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coJ1tTeW5jaGVyLnJlYWRdIHJlcGx5OiAnLCByZXBseSk7XHJcblxyXG4gICAgICBsZXQgY2hpbGRyZW5zID0ge307XHJcbiAgICAgIGxldCB2YWx1ZSA9IHt9O1xyXG4gICAgICBsZXQgbiA9IDA7XHJcblxyXG4gICAgICBpZiAocmVwbHkuYm9keS5jb2RlIDwgMzAwKSB7XHJcbiAgICAgICAgaWYgKCFyZXBseS5ib2R5LnZhbHVlLmhhc093blByb3BlcnR5KCdyZXNwb25zZXMnKSkge1xyXG4gICAgICAgICAgX3RoaXMuX2J1cy5yZW1vdmVSZXNwb25zZUxpc3RlbmVyKHJlcGx5LmZyb20sIHJlcGx5LmlkKTtcclxuICAgICAgICAgIHJlc29sdmUocmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHsgLy9kYXRhIG9iamVjdCBpcyBzZW50IGluIHNlcGFyYXRlZCBtZXNzYWdlc1xyXG4gICAgICAgICAgaWYgKG4gPT09IDApIHsgLy9pbml0aWFsIHJlc3BvbnNlIHdpdGhvdXQgY2hpbGRyZW5zXHJcbiAgICAgICAgICAgIHZhbHVlID0gcmVwbHkuYm9keS52YWx1ZTtcclxuICAgICAgICAgICAgKytuO1xyXG4gICAgICAgICAgfSBlbHNlIHsgLy8gcmVjZWl2ZWQgcmVzcG9uc2UgY29udGFpbnMgY2hpbGRyZW5zXHJcbiAgICAgICAgICAgIGRlbGV0ZSByZXBseS5ib2R5LnZhbHVlLnJlc3BvbnNlcztcclxuICAgICAgICAgICAgbGV0IGNoaWxkcmVuO1xyXG4gICAgICAgICAgICBmb3IgKGNoaWxkcmVuIGluIHJlcGx5LmJvZHkudmFsdWUpIHtcclxuICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVucy5oYXNPd25Qcm9wZXJ0eShjaGlsZHJlbikpIGNoaWxkcmVuc1tjaGlsZHJlbl0gPSB7fTtcclxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNoaWxkcmVuc1tjaGlsZHJlbl0sIHJlcGx5LmJvZHkudmFsdWVbY2hpbGRyZW5dKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICArK247XHJcbiAgICAgICAgICAgIGlmIChuID09PSB2YWx1ZS5yZXNwb25zZXMpIHtcclxuICAgICAgICAgICAgICB2YWx1ZS5jaGlsZHJlbk9iamVjdHMgPSBjaGlsZHJlbnM7XHJcbiAgICAgICAgICAgICAgZGVsZXRlIHZhbHVlLnJlc3BvbnNlcztcclxuICAgICAgICAgICAgICBfdGhpcy5fYnVzLnJlbW92ZVJlc3BvbnNlTGlzdGVuZXIocmVwbHkuZnJvbSwgcmVwbHkuaWQpO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgcmVqZWN0KHJlcGx5LmJvZHkuZGVzYyk7XHJcbiAgICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBfcmVhZFJlcG9ydGVyKG9ialVSTCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IGRpcmVjdGx5IHRvIHJlcG9ydGVyIG9iamVjdCAobWF5YmUgdGhlcmUgaXMgbm8gbGlzdGVuZXIgYXZhaWxhYmxlLCBzbyBpdCB3aWxsIGJlIHJlc29sdmVkIHdpdGggTWVzc2FnZUJ1cyAtPiByZXNvbHZlKVxyXG4gICAgLy93aWxsIHJlYWNoIHRoZSByZW1vdGUgb2JqZWN0IGluIERhdGFPYmplY3RSZXBvcnRlciAtPiBfb25SZWFkXHJcbiAgICBsZXQgcmVhZE1zZyA9IHtcclxuICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBfdGhpcy5fb3duZXIsIHRvOiBvYmpVUkxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVhZE1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIF90aGlzLl9yZWFkQ2FsbEJhY2socmVwbHksIHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogU2V0dXAgdGhlIGNhbGxiYWNrIHRvIHByb2Nlc3MgY3JlYXRlIGFuZCBkZWxldGUgZXZlbnRzIG9mIHJlbW92ZSBSZXBvcnRlciBvYmplY3RzLlxyXG4gICogVGhpcyBpcyByZWxlYXRlZCB0byB0aGUgbWVzc2FnZW5zIHNlbnQgYnkgY3JlYXRlIHRvIHRoZSBvYnNlcnZlcnMgSHlwZXJ0eSBhcnJheS5cclxuICAqIEBwYXJhbSB7ZnVuY3Rpb24oZXZlbnQ6IE1zZ0V2ZW50KX0gY2FsbGJhY2tcclxuICAqL1xyXG4gIG9uTm90aWZpY2F0aW9uKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIgPSBjYWxsYmFjaztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogU2V0dXAgdGhlIGNhbGxiYWNrIHRvIHByb2Nlc3MgY2xvc2UgZXZlbnRzIGZyb20gdGhlIHJ1bnRpbWUuXHJcbiAgKiBAcGFyYW0ge2Z1bmN0aW9uKGV2ZW50OiBNc2dFdmVudCl9IGNhbGxiYWNrXHJcbiAgKi9cclxuICBvbkNsb3NlKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9vbkNsb3NlID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICBfY3JlYXRlKGlucHV0KSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgcmVwb3J0ZXJJbnB1dCAgPSBPYmplY3QuYXNzaWduKHt9LCBpbnB1dCk7XHJcblxyXG4gICAgICBsZXQgcmVzdW1lID0gaW5wdXQucmVzdW1lO1xyXG5cclxuICAgICAgcmVwb3J0ZXJJbnB1dC5jcmVhdGVkID0gKG5ldyBEYXRlKS50b0lTT1N0cmluZygpO1xyXG4gICAgICByZXBvcnRlcklucHV0LnJ1bnRpbWUgPSBfdGhpcy5fcnVudGltZVVybDtcclxuXHJcbiAgICAgIGxldCByZXF1ZXN0VmFsdWUgPSBkZWVwQ2xvbmUocmVwb3J0ZXJJbnB1dCk7XHJcblxyXG4gICAgICBkZWxldGUgcmVxdWVzdFZhbHVlLnAycDtcclxuICAgICAgZGVsZXRlIHJlcXVlc3RWYWx1ZS5zdG9yZTtcclxuICAgICAgZGVsZXRlIHJlcXVlc3RWYWx1ZS5vYnNlcnZlcnM7XHJcbiAgICAgIGRlbGV0ZSByZXF1ZXN0VmFsdWUuaWRlbnRpdHk7XHJcblxyXG4gICAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBydW50aW1lIGluc3RhbmNlIG9mIFN5bmNoZXJNYW5hZ2VyIC0+IF9vbkNyZWF0ZVxyXG4gICAgICAvL2RlYnVnZ2VyO1xyXG4gICAgICBsZXQgcmVxdWVzdE1zZyA9IHtcclxuICAgICAgICB0eXBlOiAnY3JlYXRlJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N1YlVSTCxcclxuICAgICAgICBib2R5OiB7IHJlc3VtZTogcmVzdW1lLCB2YWx1ZTogcmVxdWVzdFZhbHVlICB9XHJcbiAgICAgIH07XHJcblxyXG5cclxuICAgICAgcmVxdWVzdE1zZy5ib2R5LnNjaGVtYSA9IHJlcG9ydGVySW5wdXQuc2NoZW1hO1xyXG5cclxuICAgICAgaWYgKHJlcG9ydGVySW5wdXQucDJwKSByZXF1ZXN0TXNnLmJvZHkucDJwID0gcmVwb3J0ZXJJbnB1dC5wMnA7XHJcbiAgICAgIGlmIChyZXBvcnRlcklucHV0LnN0b3JlKSByZXF1ZXN0TXNnLmJvZHkuc3RvcmUgPSByZXBvcnRlcklucHV0LnN0b3JlO1xyXG4gICAgICBpZiAocmVwb3J0ZXJJbnB1dC5pZGVudGl0eSkgcmVxdWVzdE1zZy5ib2R5LmlkZW50aXR5ID0gcmVwb3J0ZXJJbnB1dC5pZGVudGl0eTtcclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKCdbc3luY2hlci5fY3JlYXRlXTogJywgcmVwb3J0ZXJJbnB1dCwgcmVxdWVzdE1zZyk7XHJcblxyXG4gICAgICAvL3JlcXVlc3QgY3JlYXRlIHRvIHRoZSBhbGxvY2F0aW9uIHN5c3RlbS4gQ2FuIGJlIHJlamVjdGVkIGJ5IHRoZSBQb2xpY3lFbmdpbmUuXHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVxdWVzdE1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmxvZygnW3N5bmNoZXIgLSBjcmVhdGVdIC0gY3JlYXRlLXJlc3BvbnNlOiAnLCByZXBseSk7XHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAvL3JlcG9ydGVyIGNyZWF0aW9uIGFjY2VwdGVkXHJcbiAgICAgICAgICByZXBvcnRlcklucHV0LnVybCA9IHJlcGx5LmJvZHkucmVzb3VyY2U7XHJcblxyXG4vKiAgICAgICAgICBpZiAocmVwbHkuYm9keS5wMnBIYW5kbGVyKSByZXBvcnRlcklucHV0LnAycEhhbmRsZXIgPSByZXBseS5ib2R5LnAycEhhbmRsZXI7XHJcbiAgICAgICAgICBpZiAocmVwbHkuYm9keS5wMnBSZXF1ZXN0ZXIpIHJlcG9ydGVySW5wdXQucDJwUmVxdWVzdGVyID0gcmVwbHkuYm9keS5wMnBSZXF1ZXN0ZXI7Ki9cclxuXHJcbiAgICAgICAgICByZXBvcnRlcklucHV0LnN0YXR1cyA9ICdsaXZlJzsvLyBwY2g6IGRvIHdlIG5lZCB0aGlzP1xyXG4gICAgICAgICAgcmVwb3J0ZXJJbnB1dC5zeW5jaGVyID0gX3RoaXM7XHJcbiAgICAgICAgICByZXBvcnRlcklucHV0LmNoaWxkcmVucyA9IHJlcGx5LmJvZHkuY2hpbGRyZW5SZXNvdXJjZXM7XHJcblxyXG4gICAgICAgICAgbGV0IG5ld09iaiA9IF90aGlzLl9yZXBvcnRlcnNbcmVwb3J0ZXJJbnB1dC51cmxdO1xyXG5cclxuICAgICAgICAgIGlmICghbmV3T2JqKSB7XHJcbiAgICAgICAgICAgIG5ld09iaiA9IG5ldyBEYXRhT2JqZWN0UmVwb3J0ZXIocmVwb3J0ZXJJbnB1dCk7XHJcbiAgICAgICAgICAgIF90aGlzLl9yZXBvcnRlcnNbcmVwb3J0ZXJJbnB1dC51cmxdID0gbmV3T2JqO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIG5ld09iai5pbnZpdGVPYnNlcnZlcnMoaW5wdXQuYXV0aG9yaXNlLCBpbnB1dC5wMnApO1xyXG5cclxuICAgICAgICAgIHJlc29sdmUobmV3T2JqKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vcmVwb3J0ZXIgY3JlYXRpb24gcmVqZWN0ZWRcclxuICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmRlc2MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBfcmVzdW1lQ3JlYXRlKGNyaXRlcmlhKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGxldCByZXN1bWUgPSBjcml0ZXJpYS5yZXN1bWU7XHJcblxyXG4gICAgICAvL0ZMT1ctT1VUOiB0aGlzIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSBydW50aW1lIGluc3RhbmNlIG9mIFN5bmNoZXJNYW5hZ2VyIC0+IF9vbkNyZWF0ZVxyXG4gICAgICBsZXQgcmVxdWVzdE1zZyA9IHtcclxuICAgICAgICB0eXBlOiAnY3JlYXRlJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N1YlVSTCxcclxuICAgICAgICBib2R5OiB7IHJlc3VtZTogcmVzdW1lIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGxvZy5sb2coJ1tzeW5jaGVyIC0gY3JlYXRlXTogJywgY3JpdGVyaWEsIHJlcXVlc3RNc2cpO1xyXG4gICAgICBpZiAoY3JpdGVyaWEpIHtcclxuICAgICAgICByZXF1ZXN0TXNnLmJvZHkudmFsdWUgPSBjcml0ZXJpYTtcclxuICAgICAgICBpZiAoY3JpdGVyaWEuaGFzT3duUHJvcGVydHkoJ3JlcG9ydGVyJykpIHtcclxuICAgICAgICAgIHJlcXVlc3RNc2cuYm9keS52YWx1ZS5yZXBvcnRlciA9IGNyaXRlcmlhLnJlcG9ydGVyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXF1ZXN0TXNnLmJvZHkudmFsdWUucmVwb3J0ZXIgPSBfdGhpcy5fb3duZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY3JpdGVyaWEucDJwKSByZXF1ZXN0TXNnLmJvZHkucDJwID0gY3JpdGVyaWEucDJwO1xyXG4gICAgICBpZiAoY3JpdGVyaWEuc3RvcmUpIHJlcXVlc3RNc2cuYm9keS5zdG9yZSA9IGNyaXRlcmlhLnN0b3JlO1xyXG4gICAgICBpZiAoY3JpdGVyaWEub2JzZXJ2ZXJzKSByZXF1ZXN0TXNnLmJvZHkuYXV0aG9yaXNlID0gY3JpdGVyaWEub2JzZXJ2ZXJzO1xyXG4gICAgICBpZiAoY3JpdGVyaWEuaWRlbnRpdHkpIHJlcXVlc3RNc2cuYm9keS5pZGVudGl0eSA9IGNyaXRlcmlhLmlkZW50aXR5O1xyXG5cclxuICAgICAgbG9nLmxvZygnW3N5bmNoZXIuX3Jlc3VtZUNyZWF0ZV0gLSByZXN1bWUgbWVzc2FnZTogJywgcmVxdWVzdE1zZyk7XHJcblxyXG4gICAgICAvL2RlYnVnZ2VyO1xyXG5cclxuICAgICAgLy9yZXF1ZXN0IGNyZWF0ZSB0byB0aGUgYWxsb2NhdGlvbiBzeXN0ZW0uIENhbiBiZSByZWplY3RlZCBieSB0aGUgUG9saWN5RW5naW5lLlxyXG5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShyZXF1ZXN0TXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdbc3luY2hlci5fcmVzdW1lQ3JlYXRlXSAtIGNyZWF0ZS1yZXN1bWVkLXJlc3BvbnNlOiAnLCByZXBseSk7XHJcbiAgICAgICAgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAvL2RlYnVnZ2VyO1xyXG4gICAgICAgICAgbGV0IGxpc3RPZlJlcG9ydGVycyA9IHJlcGx5LmJvZHkudmFsdWU7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaW5kZXggaW4gbGlzdE9mUmVwb3J0ZXJzKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGF0YU9iamVjdCA9IGxpc3RPZlJlcG9ydGVyc1tpbmRleF07XHJcblxyXG4gICAgICAgICAgICAvL3JlcG9ydGVyIGNyZWF0aW9uIGFjY2VwdGVkXHJcblxyXG4gICAgICAgICAgICBkYXRhT2JqZWN0LmRhdGEgPSBkZWVwQ2xvbmUoZGF0YU9iamVjdC5kYXRhKSB8fCB7fTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmNoaWxkcmVuT2JqZWN0cykgeyBkYXRhT2JqZWN0LmNoaWxkcmVuT2JqZWN0cyA9IGRlZXBDbG9uZShkYXRhT2JqZWN0LmNoaWxkcmVuT2JqZWN0cyk7IH1cclxuXHJcbiAgICAgICAgICAgIGRhdGFPYmplY3QubXV0dWFsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGRhdGFPYmplY3QucmVzdW1lID0gdHJ1ZTtcclxuICAgICAgICAgICAgZGF0YU9iamVjdC5zdGF0dXMgPSAnbGl2ZSc7Ly8gcGNoOiBkbyB3ZSBuZWQgdGhpcz9cclxuICAgICAgICAgICAgZGF0YU9iamVjdC5zeW5jaGVyID0gX3RoaXM7XHJcblxyXG4gICAgICAgICAgICBsb2cubG9nKCdbc3luY2hlci5fcmVzdW1lQ3JlYXRlXSAtIGNyZWF0ZS1yZXN1bWVkLWRhdGFPYmplY3RSZXBvcnRlcicsIGRhdGFPYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgbGV0IG5ld09iaiA9IG5ldyBEYXRhT2JqZWN0UmVwb3J0ZXIoZGF0YU9iamVjdCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpIHtcclxuICAgICAgICAgICAgICBuZXdPYmoucmVzdW1lQ2hpbGRyZW5zKGRhdGFPYmplY3QuY2hpbGRyZW5PYmplY3RzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXJzW2RhdGFPYmplY3QudXJsXSA9IG5ld09iajtcclxuXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVzb2x2ZShfdGhpcy5fcmVwb3J0ZXJzKTtcclxuICAgICAgICAgIGlmICh0aGlzLl9vblJlcG9ydGVyc1Jlc3VtZSkgdGhpcy5fb25SZXBvcnRlcnNSZXN1bWUodGhpcy5fcmVwb3J0ZXJzKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDQwNCkge1xyXG4gICAgICAgICAgcmVzb2x2ZSh7fSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vcmVwb3J0ZXIgY3JlYXRpb24gcmVqZWN0ZWRcclxuICAgICAgICAgIHJlamVjdChyZXBseS5ib2R5LmRlc2MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIF9zdWJzY3JpYmUoaW5wdXQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIC8vRkxPVy1PVVQ6IHRoaXMgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgaW5zdGFuY2Ugb2YgU3luY2hlck1hbmFnZXIgLT4gX29uTG9jYWxTdWJzY3JpYmVcclxuICAgICAgbGV0IHN1YnNjcmliZU1zZyA9IHtcclxuICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJywgZnJvbTogX3RoaXMuX293bmVyLCB0bzogX3RoaXMuX3N1YlVSTCxcclxuICAgICAgICBib2R5OiBpbnB1dFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgLy8gSHlwZXJ0eSByZXF1ZXN0IHRvIGJlIGFuIE9ic2VydmVyXHJcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3Qvc3BlY3MvYmxvYi9tYXN0ZXIvbWVzc2FnZXMvZGF0YS1zeW5jLW1lc3NhZ2VzLm1kI2h5cGVydHktcmVxdWVzdC10by1iZS1hbi1vYnNlcnZlclxyXG5cclxuICAgICAgLy8gUmVzdW1lIFN1YnNjcmlwdGlvbnMgZm9yIHRoZSBzYW1lIEh5cGVydHkgVVJMXHJcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3Qvc3BlY3MvYmxvYi9tYXN0ZXIvbWVzc2FnZXMvZGF0YS1zeW5jLW1lc3NhZ2VzLm1kI3Jlc3VtZS1zdWJzY3JpcHRpb25zLWZvci10aGUtc2FtZS1oeXBlcnR5LXVybFxyXG5cclxuICAgICAgLy8gUmVzdW1lIFN1YnNjcmlwdGlvbnMgZm9yIGEgY2VydGFpbiB1c2VyIGFuZCBkYXRhIHNjaGVtYSBpbmRlcGVuZGVudGx5IG9mIHRoZSBIeXBlcnR5IFVSTC5cclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9zcGVjcy9ibG9iL21hc3Rlci9tZXNzYWdlcy9kYXRhLXN5bmMtbWVzc2FnZXMubWQjcmVzdW1lLXN1YnNjcmlwdGlvbnMtZm9yLWEtY2VydGFpbi11c2VyLWFuZC1kYXRhLXNjaGVtYS1pbmRlcGVuZGVudGx5LW9mLXRoZS1oeXBlcnR5LXVybFxyXG4vKiAgICAgIGlmIChpbnB1dCkge1xyXG4gICAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgncDJwJykpIHN1YnNjcmliZU1zZy5ib2R5LnAycCA9IGlucHV0LnAycDtcclxuICAgICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ3N0b3JlJykpIHN1YnNjcmliZU1zZy5ib2R5LnN0b3JlID0gaW5wdXQuc3RvcmU7XHJcbiAgICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCdzY2hlbWEnKSkgc3Vic2NyaWJlTXNnLmJvZHkuc2NoZW1hID0gaW5wdXQuc2NoZW1hO1xyXG4gICAgICAgIGlmIChpbnB1dC5oYXNPd25Qcm9wZXJ0eSgnaWRlbnRpdHknKSkgc3Vic2NyaWJlTXNnLmJvZHkuaWRlbnRpdHkgPSBpbnB1dC5pZGVudGl0eTtcclxuICAgICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ3Jlc291cmNlJykpIHN1YnNjcmliZU1zZy5ib2R5LnJlc291cmNlID0gaW5wdXQucmVzb3VyY2U7XHJcbiAgICAgICAgaWYgKGlucHV0Lmhhc093blByb3BlcnR5KCdkb21haW5fc3Vic2NyaXB0aW9uJykpIHN1YnNjcmliZU1zZy5ib2R5LmRvbWFpbl9zdWJzY3JpcHRpb24gPSBpbnB1dC5kb21haW5fc3Vic2NyaXB0aW9uO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG5cclxuICAgICAgc3Vic2NyaWJlTXNnLmJvZHkucmVzdW1lID0gaW5wdXQucmVzdW1lO1xyXG5cclxuICAgICAgLy9UT0RPOiBGb3IgRnVydGhlciBTdHVkeVxyXG4gICAgICBpZiAoaW5wdXQuaGFzT3duUHJvcGVydHkoJ211dHVhbCcpKSBzdWJzY3JpYmVNc2cuYm9keS5tdXR1YWwgPSBpbnB1dC5tdXR1YWw7Ki9cclxuXHJcbiAgICAgIGxvZy5sb2coJ1tzeW5jaGVyX3N1YnNjcmliZV0gLSBzdWJzY3JpYmUgbWVzc2FnZTogJywgaW5wdXQsIHN1YnNjcmliZU1zZyk7XHJcblxyXG4gICAgICAvL3JlcXVlc3Qgc3Vic2NyaXB0aW9uXHJcbiAgICAgIC8vUHJvdmlzaW9uYWwgZGF0YSBpcyBhcHBsaWVkIHRvIHRoZSBEYXRhT2JqZWN0T2JzZXJ2ZXIgYWZ0ZXIgY29uZmlybWF0aW9uLiBPciBkaXNjYXJkZWQgaWYgdGhlcmUgaXMgbm8gY29uZmlybWF0aW9uLlxyXG4gICAgICAvL2ZvciBtb3JlIGluZm8gc2VlIHRoZSBEYXRhUHJvdmlzaW9uYWwgY2xhc3MgZG9jdW1lbnRhdGlvbi5cclxuICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZShzdWJzY3JpYmVNc2csIChyZXBseSkgPT4ge1xyXG4gICAgICAgIGxvZy5sb2coJ1tzeW5jaGVyXSAtIHN1YnNjcmliZS1yZXNwb25zZTogJywgcmVwbHkpO1xyXG5cclxuICAgICAgICBsZXQgb2JqVVJMID0gcmVwbHkuYm9keS5yZXNvdXJjZTtcclxuXHJcbiAgICAgICAgbGV0IG5ld1Byb3Zpc2lvbmFsID0gX3RoaXMuX3Byb3Zpc2lvbmFsc1tvYmpVUkxdO1xyXG4gICAgICAgIGRlbGV0ZSBfdGhpcy5fcHJvdmlzaW9uYWxzW29ialVSTF07XHJcbiAgICAgICAgaWYgKG5ld1Byb3Zpc2lvbmFsKSBuZXdQcm92aXNpb25hbC5fcmVsZWFzZUxpc3RlbmVycygpO1xyXG5cclxuICAgICAgICBpZiAocmVwbHkuYm9keS5jb2RlIDwgMjAwKSB7XHJcbiAgICAgICAgICBsb2cubG9nKCdbc3luY2hlcl0gLSBuZXcgRGF0YVByb3Zpc2lvbmFsOiAnLCByZXBseS5ib2R5LmNoaWxkcmVuUmVzb3VyY2VzLCBvYmpVUkwpO1xyXG4gICAgICAgICAgbmV3UHJvdmlzaW9uYWwgPSBuZXcgRGF0YVByb3Zpc2lvbmFsKF90aGlzLl9vd25lciwgb2JqVVJMLCBfdGhpcy5fYnVzLCByZXBseS5ib2R5LmNoaWxkcmVuUmVzb3VyY2VzKTtcclxuICAgICAgICAgIF90aGlzLl9wcm92aXNpb25hbHNbb2JqVVJMXSA9IG5ld1Byb3Zpc2lvbmFsO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIGxvZy5sb2coJ1tzeW5jaGVyXSAtIG5ldyBEYXRhIE9iamVjdCBPYnNlcnZlcjogJywgcmVwbHksIF90aGlzLl9wcm92aXNpb25hbHMpO1xyXG5cclxuICAgICAgICAgIGxldCBvYnNlcnZlcklucHV0ID0gcmVwbHkuYm9keS52YWx1ZTtcclxuXHJcbiAgICAgICAgICBvYnNlcnZlcklucHV0LnN5bmNoZXIgPSBfdGhpcztcclxuICAgICAgICAgIG9ic2VydmVySW5wdXQucDJwID0gaW5wdXQucDJwO1xyXG4gICAgICAgICAgb2JzZXJ2ZXJJbnB1dC5zdG9yZSA9IGlucHV0LnN0b3JlO1xyXG4gICAgICAgICAgb2JzZXJ2ZXJJbnB1dC5pZGVudGl0eSA9IGlucHV0LmlkZW50aXR5O1xyXG4gICAgICAgICAgb2JzZXJ2ZXJJbnB1dC5yZXN1bWUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAvLyB0b2RvOiBGb3IgRnVydGhlciBTdHVkeVxyXG4gICAgICAgICAgb2JzZXJ2ZXJJbnB1dC5tdXR1YWwgPSBpbnB1dC5tdXR1YWw7XHJcblxyXG4gICAgICAgICAgLy9vYnNlcnZlcklucHV0LmNoaWxkcmVuID0gbmV3UHJvdmlzaW9uYWwuY2hpbGRyZW47XHJcblxyXG4gICAgICAgICAgLy9UT0RPOiBtdXR1YWwgRm9yIEZ1cnRoZXIgU3R1ZHlcclxuICAgICAgICAgIGxldCBuZXdPYmogPSBfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF07XHJcbiAgICAgICAgICBpZiAoIW5ld09iaikge1xyXG4gICAgICAgICAgICBuZXdPYmogPSBuZXcgRGF0YU9iamVjdE9ic2VydmVyKG9ic2VydmVySW5wdXQpO1xyXG4gICAgICAgICAgICBfdGhpcy5fb2JzZXJ2ZXJzW29ialVSTF0gPSBuZXdPYmo7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBuZXdPYmouc3luYygpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxvZy5sb2coJ1tzeW5jaGVyXSAtIG5ldyBEYXRhIE9iamVjdCBPYnNlcnZlciBhbHJlYWR5IGV4aXN0OiAnLCBuZXdPYmopO1xyXG5cclxuICAgICAgICAgIHJlc29sdmUobmV3T2JqKTtcclxuXHJcbiAgICAgICAgICBpZiAobmV3UHJvdmlzaW9uYWwpIHsgbmV3UHJvdmlzaW9uYWwuYXBwbHkobmV3T2JqKTsgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KHJlcGx5LmJvZHkuZGVzYyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuLypcclxuICBfcHJvY2Vzc09mZmxpbmVTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uLCByZWRpcmVjdFRvKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBmb3J3YXJkID0ge1xyXG4gICAgICBmcm9tOiBzdWJzY3JpcHRpb24uZnJvbSxcclxuICAgICAgdHlwZTogJ2ZvcndhcmQnLFxyXG4gICAgICB0bzogcmVkaXJlY3RUbyxcclxuICAgICAgYm9keTogc3Vic2NyaXB0aW9uXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnNvbGUubG9nKCdbU3luY2hlci5fcHJvY2Vzc09mZmxpbmVTdWJzY3JpcHRpb25dIGZvcndhZGluZyAnLCBmb3J3YXJkKTtcclxuXHJcbiAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKGZvcndhcmQpO1xyXG5cclxuICAgIGxldCByZXN1bHQgPSB7XHJcbiAgICAgIGNvZGU6IDMwMixcclxuICAgICAgZGVzYzogXCJGb3VuZCBcIiArIHJlZGlyZWN0VG9cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuKHJlc3VsdCk7XHJcblxyXG4gIH0qL1xyXG5cclxuXHJcbiAgX3Jlc3VtZVN1YnNjcmliZShjcml0ZXJpYSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5cclxuICAgICAgLy9GTE9XLU9VVDogdGhpcyBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcnVudGltZSBpbnN0YW5jZSBvZiBTeW5jaGVyTWFuYWdlciAtPiBfb25Mb2NhbFN1YnNjcmliZVxyXG4gICAgICBsZXQgc3Vic2NyaWJlTXNnID0ge1xyXG4gICAgICAgIHR5cGU6ICdzdWJzY3JpYmUnLCBmcm9tOiBfdGhpcy5fb3duZXIsIHRvOiBfdGhpcy5fc3ViVVJMLFxyXG4gICAgICAgIGJvZHk6IHt9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICAvLyBIeXBlcnR5IHJlcXVlc3QgdG8gYmUgYW4gT2JzZXJ2ZXJcclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9zcGVjcy9ibG9iL21hc3Rlci9tZXNzYWdlcy9kYXRhLXN5bmMtbWVzc2FnZXMubWQjaHlwZXJ0eS1yZXF1ZXN0LXRvLWJlLWFuLW9ic2VydmVyXHJcblxyXG4gICAgICAvLyBSZXN1bWUgU3Vic2NyaXB0aW9ucyBmb3IgdGhlIHNhbWUgSHlwZXJ0eSBVUkxcclxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3JlVEhJTkstcHJvamVjdC9zcGVjcy9ibG9iL21hc3Rlci9tZXNzYWdlcy9kYXRhLXN5bmMtbWVzc2FnZXMubWQjcmVzdW1lLXN1YnNjcmlwdGlvbnMtZm9yLXRoZS1zYW1lLWh5cGVydHktdXJsXHJcblxyXG4gICAgICAvLyBSZXN1bWUgU3Vic2NyaXB0aW9ucyBmb3IgYSBjZXJ0YWluIHVzZXIgYW5kIGRhdGEgc2NoZW1hIGluZGVwZW5kZW50bHkgb2YgdGhlIEh5cGVydHkgVVJMLlxyXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcmVUSElOSy1wcm9qZWN0L3NwZWNzL2Jsb2IvbWFzdGVyL21lc3NhZ2VzL2RhdGEtc3luYy1tZXNzYWdlcy5tZCNyZXN1bWUtc3Vic2NyaXB0aW9ucy1mb3ItYS1jZXJ0YWluLXVzZXItYW5kLWRhdGEtc2NoZW1hLWluZGVwZW5kZW50bHktb2YtdGhlLWh5cGVydHktdXJsXHJcbiAgICAgIGlmIChjcml0ZXJpYSkge1xyXG4gICAgICAgIGlmIChjcml0ZXJpYS5oYXNPd25Qcm9wZXJ0eSgncDJwJykpIHN1YnNjcmliZU1zZy5ib2R5LnAycCA9IGNyaXRlcmlhLnAycDtcclxuICAgICAgICBpZiAoY3JpdGVyaWEuaGFzT3duUHJvcGVydHkoJ3N0b3JlJykpIHN1YnNjcmliZU1zZy5ib2R5LnN0b3JlID0gY3JpdGVyaWEuc3RvcmU7XHJcbiAgICAgICAgaWYgKGNyaXRlcmlhLmhhc093blByb3BlcnR5KCdzY2hlbWEnKSkgc3Vic2NyaWJlTXNnLmJvZHkuc2NoZW1hID0gY3JpdGVyaWEuc2NoZW1hO1xyXG4gICAgICAgIGlmIChjcml0ZXJpYS5oYXNPd25Qcm9wZXJ0eSgnaWRlbnRpdHknKSkgc3Vic2NyaWJlTXNnLmJvZHkuaWRlbnRpdHkgPSBjcml0ZXJpYS5pZGVudGl0eTtcclxuICAgICAgICBpZiAoY3JpdGVyaWEuaGFzT3duUHJvcGVydHkoJ3Jlc291cmNlJykpIHN1YnNjcmliZU1zZy5ib2R5LnJlc291cmNlID0gY3JpdGVyaWEucmVzb3VyY2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN1YnNjcmliZU1zZy5ib2R5LnJlc3VtZSA9IGNyaXRlcmlhLnJlc3VtZTtcclxuXHJcbiAgICAgIC8vVE9ETzogRm9yIEZ1cnRoZXIgU3R1ZHlcclxuICAgICAgbGV0IG11dHVhbCA9IGNyaXRlcmlhLm11dHVhbDtcclxuICAgICAgaWYgKGNyaXRlcmlhLmhhc093blByb3BlcnR5KCdtdXR1YWwnKSkgc3Vic2NyaWJlTXNnLmJvZHkubXV0dWFsID0gbXV0dWFsO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coJ1tzeW5jaGVyXSAtIHN1YnNjcmliZSBtZXNzYWdlOiAnLCBjcml0ZXJpYSwgc3Vic2NyaWJlTXNnKTtcclxuXHJcbiAgICAgIC8vcmVxdWVzdCBzdWJzY3JpcHRpb25cclxuICAgICAgLy9Qcm92aXNpb25hbCBkYXRhIGlzIGFwcGxpZWQgdG8gdGhlIERhdGFPYmplY3RPYnNlcnZlciBhZnRlciBjb25maXJtYXRpb24uIE9yIGRpc2NhcmRlZCBpZiB0aGVyZSBpcyBubyBjb25maXJtYXRpb24uXHJcbiAgICAgIC8vZm9yIG1vcmUgaW5mbyBzZWUgdGhlIERhdGFQcm92aXNpb25hbCBjbGFzcyBkb2N1bWVudGF0aW9uLlxyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHN1YnNjcmliZU1zZywgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tzeW5jaGVyXSAtIHN1YnNjcmliZS1yZXN1bWVkLXJlc3BvbnNlOiAnLCByZXBseSk7XHJcblxyXG4gICAgICAgIGxldCBvYmpVUkwgPSByZXBseS5ib2R5LnJlc291cmNlO1xyXG5cclxuICAgICAgICBsZXQgbmV3UHJvdmlzaW9uYWwgPSBfdGhpcy5fcHJvdmlzaW9uYWxzW29ialVSTF07XHJcbiAgICAgICAgZGVsZXRlIF90aGlzLl9wcm92aXNpb25hbHNbb2JqVVJMXTtcclxuICAgICAgICBpZiAobmV3UHJvdmlzaW9uYWwpIG5ld1Byb3Zpc2lvbmFsLl9yZWxlYXNlTGlzdGVuZXJzKCk7XHJcblxyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPCAyMDApIHsgLy8gdG9kbzogY2hlY2sgaWYgdGhpcyBpcyBuZWVkZWQgZm9yIHRoZSByZXN1bWVcclxuXHJcbiAgICAgICAgICBsb2cubG9nKCdbc3luY2hlcl0gLSByZXN1bWUgbmV3IERhdGFQcm92aXNpb25hbDogJywgcmVwbHksIG9ialVSTCk7XHJcbiAgICAgICAgICBuZXdQcm92aXNpb25hbCA9IG5ldyBEYXRhUHJvdmlzaW9uYWwoX3RoaXMuX293bmVyLCBvYmpVUkwsIF90aGlzLl9idXMsIHJlcGx5LmJvZHkuY2hpbGRyZW5SZXNvdXJjZXMpO1xyXG4gICAgICAgICAgX3RoaXMuX3Byb3Zpc2lvbmFsc1tvYmpVUkxdID0gbmV3UHJvdmlzaW9uYWw7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAocmVwbHkuYm9keS5jb2RlID09PSAyMDApIHtcclxuXHJcbiAgICAgICAgICBsZXQgbGlzdE9mT2JzZXJ2ZXJzID0gcmVwbHkuYm9keS52YWx1ZTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBpbmRleCBpbiBsaXN0T2ZPYnNlcnZlcnMpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCBkYXRhT2JqZWN0ID0gbGlzdE9mT2JzZXJ2ZXJzW2luZGV4XTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tzeW5jaGVyXSAtIFJlc3VtZSBPYmplY3QgT2JzZXJ2ZXI6ICcsIHJlcGx5LCBkYXRhT2JqZWN0LCBfdGhpcy5fcHJvdmlzaW9uYWxzKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmNoaWxkcmVuT2JqZWN0cykgeyBkYXRhT2JqZWN0LmNoaWxkcmVuT2JqZWN0cyA9IGRlZXBDbG9uZShkYXRhT2JqZWN0LmNoaWxkcmVuT2JqZWN0cyk7IH1cclxuXHJcbiAgICAgICAgICAgIGRhdGFPYmplY3QuZGF0YSA9IGRlZXBDbG9uZShkYXRhT2JqZWN0LmRhdGEpIHx8IHt9O1xyXG4gICAgICAgICAgICBkYXRhT2JqZWN0LnJlc3VtZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGRhdGFPYmplY3Quc3luY2hlciA9IF90aGlzO1xyXG5cclxuICAgICAgICAgICAgLy9UT0RPOiBtdXR1YWwgRm9yIEZ1cnRoZXIgU3R1ZHlcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tzeW5jaGVyLl9yZXN1bWVTdWJzY3JpYmVdIC0gY3JlYXRlIG5ldyBkYXRhT2JqZWN0OiAnLCBkYXRhT2JqZWN0KTtcclxuICAgICAgICAgICAgbGV0IG5ld09iaiA9IG5ldyBEYXRhT2JqZWN0T2JzZXJ2ZXIoZGF0YU9iamVjdCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5jaGlsZHJlbk9iamVjdHMpIHsgbmV3T2JqLnJlc3VtZUNoaWxkcmVucyhkYXRhT2JqZWN0LmNoaWxkcmVuT2JqZWN0cyk7IH1cclxuICAgICAgICAgICAgbG9nLmxvZygnW3N5bmNoZXIuX3Jlc3VtZVN1YnNjcmliZV0gLSBuZXcgZGF0YU9iamVjdCcsIG5ld09iaik7XHJcbiAgICAgICAgICAgIF90aGlzLl9vYnNlcnZlcnNbbmV3T2JqLnVybF0gPSBuZXdPYmo7XHJcblxyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX3Byb3Zpc2lvbmFsc1tuZXdPYmoudXJsXSkge1xyXG4gICAgICAgICAgICAgIF90aGlzLl9wcm92aXNpb25hbHNbbmV3T2JqLnVybF0uYXBwbHkobmV3T2JqKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy9sZXRzIHN5bmMgd2l0aCBSZXBvcnRlclxyXG4gICAgICAgICAgICAvLyBpdCB3YXMgY29tbWVudGVkIHRvIGxldCBoeXBlcnRpZXMgZGVjaWRlIHdoZW4gdG8gc3luY1xyXG4gICAgICAgICAgICAvL25ld09iai5zeW5jKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmVzb2x2ZShfdGhpcy5fb2JzZXJ2ZXJzKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fb25PYnNlcnZlcnNSZXN1bWUpIHRoaXMuX29uT2JzZXJ2ZXJzUmVzdW1lKF90aGlzLl9vYnNlcnZlcnMpO1xyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHJlcGx5LmJvZHkuY29kZSA9PT0gNDA0KSB7XHJcbiAgICAgICAgICByZXNvbHZlKHt9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KHJlcGx5LmJvZHkuZGVzYyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgbG9jYWwgcnVudGltZSBSZXBvcnRlck9iamVjdCAtPiBfb25SZW1vdGVTdWJzY3JpYmVcclxuICBfb25Gb3J3YXJkKG1zZykge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBsZXQgcmVwb3J0ZXIgPSBfdGhpcy5fcmVwb3J0ZXJzW21zZy5ib2R5LnRvXTtcclxuICAgIHJlcG9ydGVyLl9vbkZvcndhcmQobXNnKTtcclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgcmVtb3RlIFN5bmNoZXIgLT4gY3JlYXRlICh0aGlzIGlzIGFjdHVhbGx5IGFuIGludml0YXRpb24gdG8gc3Vic2NyaWJlKVxyXG4gIF9vblJlbW90ZUNyZWF0ZShtc2cpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgcmVzb3VyY2UgPSBtc2cuZnJvbS5zbGljZSgwLCAtMTMpOyAvL3JlbW92ZSBcIi9zdWJzY3JpcHRpb25cIiBmcm9tIHRoZSBVUkxcclxuICAgIGxldCBkaXZpZGVkVVJMID0gZGl2aWRlVVJMKHJlc291cmNlKTtcclxuICAgIGxldCBkb21haW4gPSBkaXZpZGVkVVJMLmRvbWFpbjtcclxuXHJcbiAgICBsZXQgZXZlbnQgPSB7XHJcbiAgICAgIHR5cGU6IG1zZy50eXBlLFxyXG4gICAgICBmcm9tOiBtc2cuYm9keS5zb3VyY2UsXHJcbiAgICAgIHVybDogcmVzb3VyY2UsXHJcbiAgICAgIGRvbWFpbjogZG9tYWluLFxyXG4gICAgICBzY2hlbWE6IG1zZy5ib2R5LnNjaGVtYSxcclxuICAgICAgdmFsdWU6IG1zZy5ib2R5LnZhbHVlLFxyXG4gICAgICBpZGVudGl0eTogbXNnLmJvZHkuaWRlbnRpdHksXHJcblxyXG4gICAgICBhY2s6ICh0eXBlKSA9PiB7XHJcbiAgICAgICAgbGV0IGxUeXBlID0gMjAwO1xyXG4gICAgICAgIGlmICh0eXBlKSB7XHJcbiAgICAgICAgICBsVHlwZSA9IHR5cGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgIC8vc2VuZCBhY2sgcmVzcG9uc2UgbWVzc2FnZVxyXG4gICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2Uoe1xyXG4gICAgICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgICAgICBib2R5OiB7IGNvZGU6IGxUeXBlIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoX3RoaXMuX29uTm90aWZpY2F0aW9uSGFuZGxlcikge1xyXG4gICAgICBsb2cuaW5mbygnW1N5bmNoZXJdIE5PVElGSUNBVElPTi1FVkVOVDogJywgZXZlbnQpO1xyXG4gICAgICBfdGhpcy5fb25Ob3RpZmljYXRpb25IYW5kbGVyKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vRkxPVy1JTjogbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgcmVtb3RlIERhdGFPYmplY3RSZXBvcnRlciAtPiBkZWxldGVcclxuICBfb25SZW1vdGVEZWxldGUobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgLy9yZW1vdmUgXCIvc3Vic2NyaXB0aW9uXCIgZnJvbSB0aGUgVVJMXHJcbiAgICBsZXQgcmVzb3VyY2UgPSBtc2cuYm9keS5yZXNvdXJjZTtcclxuXHJcbiAgICBsZXQgb2JqZWN0ID0gX3RoaXMuX29ic2VydmVyc1tyZXNvdXJjZV07XHJcblxyXG4gICAgbGV0IHVuc3Vic2NyaWJlID0ge1xyXG4gICAgICBmcm9tOiBfdGhpcy5vd25lcixcclxuICAgICAgdG86IF90aGlzLl9zdWJVUkwsXHJcbiAgICAgIGlkOiBtc2cuaWQsXHJcbiAgICAgIHR5cGU6ICd1bnN1YnNjcmliZScsXHJcbiAgICAgIGJvZHk6IHsgcmVzb3VyY2U6IG1zZy5ib2R5LnJlc291cmNlIH1cclxuICAgIH07XHJcblxyXG4gICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh1bnN1YnNjcmliZSk7XHJcblxyXG4gICAgZGVsZXRlIF90aGlzLl9vYnNlcnZlcnNbcmVzb3VyY2VdO1xyXG5cclxuICAgIGlmIChvYmplY3QpIHtcclxuICAgICAgbGV0IGV2ZW50ID0ge1xyXG4gICAgICAgIHR5cGU6IG1zZy50eXBlLFxyXG4gICAgICAgIHVybDogcmVzb3VyY2UsXHJcbiAgICAgICAgaWRlbnRpdHk6IG1zZy5ib2R5LmlkZW50aXR5LFxyXG5cclxuICAgICAgICBhY2s6ICh0eXBlKSA9PiB7XHJcbiAgICAgICAgICBsZXQgbFR5cGUgPSAyMDA7XHJcbiAgICAgICAgICBpZiAodHlwZSkge1xyXG4gICAgICAgICAgICBsVHlwZSA9IHR5cGU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAvL1RPRE86IGFueSBvdGhlciBkaWZmZXJlbnQgb3B0aW9ucyBmb3IgdGhlIHJlbGVhc2UgcHJvY2VzcywgbGlrZSBhY2NlcHQgYnV0IG5vciByZWxlYXNlIGxvY2FsP1xyXG4gICAgICAgICAgaWYgKGxUeXBlID09PSAyMDApIHtcclxuICAgICAgICAgICAgb2JqZWN0LmRlbGV0ZSgpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vc2VuZCBhY2sgcmVzcG9uc2UgbWVzc2FnZVxyXG4gICAgICAgICAgX3RoaXMuX2J1cy5wb3N0TWVzc2FnZSh7XHJcbiAgICAgICAgICAgIGlkOiBtc2cuaWQsIHR5cGU6ICdyZXNwb25zZScsIGZyb206IG1zZy50bywgdG86IG1zZy5mcm9tLFxyXG4gICAgICAgICAgICBib2R5OiB7IGNvZGU6IGxUeXBlLCBzb3VyY2U6IF90aGlzLl9vd25lciB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoX3RoaXMuX29uTm90aWZpY2F0aW9uSGFuZGxlcikge1xyXG4gICAgICAgIGxvZy5sb2coJ05PVElGSUNBVElPTi1FVkVOVDogJywgZXZlbnQpO1xyXG4gICAgICAgIF90aGlzLl9vbk5vdGlmaWNhdGlvbkhhbmRsZXIoZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfdGhpcy5fYnVzLnBvc3RNZXNzYWdlKHtcclxuICAgICAgICBpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCBmcm9tOiBtc2cudG8sIHRvOiBtc2cuZnJvbSxcclxuICAgICAgICBib2R5OiB7IGNvZGU6IDQwNCwgc291cmNlOiBfdGhpcy5fb3duZXIgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGNsb3NlIGV2ZW50IHJlY2VpdmVkIGZyb20gcnVudGltZSByZWdpc3RyeVxyXG4gIF9vbkV4ZWN1dGUobXNnKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCByZXBseSA9IHtcclxuICAgICAgaWQ6IG1zZy5pZCwgdHlwZTogJ3Jlc3BvbnNlJywgZnJvbTogbXNnLnRvLCB0bzogbXNnLmZyb20sXHJcbiAgICAgIGJvZHk6IHsgY29kZTogMjAwIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKChtc2cuZnJvbSA9PT0gX3RoaXMuX3J1bnRpbWVVcmwgKyAnL3JlZ2lzdHJ5LycgfHwgbXNnLmZyb20gPT09IF90aGlzLl9ydW50aW1lVXJsICsgJy9yZWdpc3RyeScpICYmIG1zZy5ib2R5ICYmIG1zZy5ib2R5Lm1ldGhvZCAmJiBtc2cuYm9keS5tZXRob2QgPT09ICdjbG9zZScgJiYgX3RoaXMuX29uQ2xvc2UpIHtcclxuICAgICAgbGV0IGV2ZW50ID0ge1xyXG4gICAgICAgIHR5cGU6ICdjbG9zZScsXHJcblxyXG4gICAgICAgIGFjazogKHR5cGUpID0+IHtcclxuICAgICAgICAgIGlmICh0eXBlKSB7XHJcbiAgICAgICAgICAgIHJlcGx5LmJvZHkuY29kZSA9IHR5cGU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAvL3NlbmQgYWNrIHJlc3BvbnNlIG1lc3NhZ2VcclxuICAgICAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVwbHkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGxvZy5pbmZvKCdbU3luY2hlcl0gQ2xvc2UtRVZFTlQ6ICcsIGV2ZW50KTtcclxuICAgICAgX3RoaXMuX29uQ2xvc2UoZXZlbnQpO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIF90aGlzLl9idXMucG9zdE1lc3NhZ2UocmVwbHkpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQ2FsbGJhY2sgc3lzdGVtIHRvIHRyaWdnZXIgdGhlIHJlc3VtZWQgcmVwb3J0ZXJzXHJcbiAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBmdW5jdGlvbiBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGludm9rZWRcclxuICAqIEByZXR1cm4ge09iamVjdDxVUkwsIERhdGFPYmplY3RSZXBvcnRlcj59IFJldHVybiBvbmUgb2JqZWN0IHdpdGggYWxsIHJlc3VtZWQgcmVwb3J0ZXJzO1xyXG4gICovXHJcbiAgb25SZXBvcnRlcnNSZXN1bWUoY2FsbGJhY2spIHtcclxuICAgIHRoaXMuX29uUmVwb3J0ZXJzUmVzdW1lID0gY2FsbGJhY2s7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIENhbGxiYWNrIHN5c3RlbSB0byB0cmlnZ2VyIHRoZSByZXN1bWVkIG9ic2VydmVyc1xyXG4gICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrIC0gZnVuY3Rpb24gY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBpbnZva2VkXHJcbiAgKiBAcmV0dXJuIHtPYmplY3Q8VVJMLCBEYXRhT2JqZWN0T2JzZXJ2ZXI+fSBSZXR1cm4gb25lIG9iamVjdCB3aXRoIGFsbCByZXN1bWVkIG9ic2VydmVycztcclxuICAqL1xyXG4gIG9uT2JzZXJ2ZXJzUmVzdW1lKGNhbGxiYWNrKSB7XHJcbiAgICB0aGlzLl9vbk9ic2VydmVyc1Jlc3VtZSA9IGNhbGxiYWNrO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFN5bmNoZXI7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7Ozs7O0FBS0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBOzs7QUFsR0E7QUFBQTtBQUFBOzs7Ozs7QUFzR0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7Ozs7Ozs7O0FDL0hBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc0JBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7OztBQUdBO0FBQUE7Ozs7QUFDQTs7Ozs7QUFNQTs7OztBQUlBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTs7OztBQVFBOzs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFMQTtBQVlBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7Ozs7Ozs7O0FBMENBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7OztBQXhPQTtBQUNBO0FBQ0E7QUFFQTtBQUNBOzs7QUE2SkE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFJQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUFBO0FBRUE7Ozs7OztBQUtBO0FBQUE7QUFBQTs7Ozs7O0FBc0NBOzs7Ozs7OztBQ3BVQTtBQUVBOzs7OztBQUlBOzs7QUFDQTs7O0FBSUE7Ozs7QUFJQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUpBO0FBVUE7QUFFQTtBQUVBO0FBakJBO0FBcUJBO0FBQ0E7OztBQUNBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQVFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFKQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUpBO0FBVUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSkE7QUFVQTtBQUNBO0FBQ0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUNBOzs7QUFySEE7QUFDQTtBQUdBOzs7Ozs7QUF1SEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JPQTs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUVBOzs7Ozs7Ozs7OztBQVlBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBUkE7QUFVQTtBQUNBOzs7O0FBNEJBOzs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFKQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7OztBQVFBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFKQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUpBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQXJCQTtBQXdCQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFKQTtBQU9BO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7O0FBbE9BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7QUFuREE7QUFDQTtBQWdRQTs7Ozs7Ozs7QUM3UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFLQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNySkE7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7OztBQUVBOzs7Ozs7Ozs7OztBQVlBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkE7QUFRQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBZ0JBO0FBQ0E7QUFBQTs7Ozs7Ozs7OztBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUhBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQWNBOzs7Ozs7QUFNQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkJBOzs7OztBQU1BO0FBRUE7OztBQW5EQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7O0FBdEhBO0FBQ0E7QUFxS0E7Ozs7Ozs7O0FDcExBOzs7O0FBS0E7QUFDQTtBQUNBOzs7QUFFQTs7OztBQUtBO0FBQUE7QUFFQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTkE7QUFDQTtBQVFBO0FBRUE7OztBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFOQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7OztBQUdBOzs7Ozs7Ozs7O0FDM0RBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7QUFJQTs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FBaUJBOzs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7Ozs7OztBQUdBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTtBQUNBOzs7Ozs7QUFHQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7O0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVBBO0FBQ0E7QUFTQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFDQTtBQVNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBcUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBR0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBTEE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFJQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFQQTtBQUNBO0FBU0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQTdaQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFJQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7O0FBSUE7QUFBQTtBQUFBOzs7Ozs7QUFtWUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzV3QkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBOzs7OztBQUlBOzs7OztBQUNBOzs7Ozs7OztBQVNBOzs7O0FBS0E7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBaEJBO0FBaUJBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFKQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUdBOzs7Ozs7O0FBUUE7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFLQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQU1BO0FBQ0E7Ozs7QUFEQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBR0E7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7Ozs7OztBQU1BOzs7O0FBSUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUZBO0FBSUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUdBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUZBO0FBSUE7QUE3REE7QUFDQTtBQStEQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQWRBO0FBQ0E7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7QUFxQkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFFQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFBQTtBQUlBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBRkE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBZkE7QUFDQTtBQWlCQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQTlWQTtBQUFBO0FBQUE7OztBQXdOQTtBQUNBO0FBQ0E7QUFBQTtBQUlBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBcFpBO0FBQUE7OztBQTZnQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2hqQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFFQTs7Ozs7QUFJQTs7Ozs7QUFDQTs7Ozs7O0FBT0E7Ozs7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFqQkE7QUFpQkE7QUFFQTs7Ozs7OztBQUdBO0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFHQTs7Ozs7Ozs7OztBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFHQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFMQTtBQUNBO0FBV0E7QUFFQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7Ozs7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFLQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQVNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUpBO0FBQ0E7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUF6VEE7QUFBQTs7O0FBNFRBOzs7Ozs7OztBQ2hXQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7Ozs7Ozs7O0FBWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7Ozs7O0FBT0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFHQTs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQVBBO0FBQUE7QUFBQTs7Ozs7O0FBVUE7Ozs7Ozs7O0FDekdBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBRUE7Ozs7OztBQUtBOzs7QUFDQTs7Ozs7Ozs7Ozs7O0FBZUE7Ozs7OztBQU1BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQWtCQTs7Ozs7Ozs7Ozs7O0FBWUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTs7Ozs7Ozs7Ozs7O0FBa0JBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFBQTtBQURBO0FBSUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7QUFJQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUtBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUZBO0FBTUE7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXlCQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFGQTtBQU1BO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBR0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBcEJBO0FBQ0E7QUFzQkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFMQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFGQTtBQUlBO0FBckJBO0FBQ0E7QUF1QkE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVZBO0FBYUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7OztBQXp1QkE7QUFBQTtBQUFBO0FBRUE7Ozs7Ozs7QUFJQTtBQUFBO0FBQUE7QUFFQTs7Ozs7OztBQUlBO0FBQUE7QUFBQTs7Ozs7O0FBaXVCQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///13\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXTERNAL MODULE: ./node_modules/loglevel/lib/loglevel.js\nvar loglevel = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./src/utils/utils.js\nvar utils = __webpack_require__(0);\n\n// EXTERNAL MODULE: ./src/discovery/RegistrationStatus.js\nvar RegistrationStatus = __webpack_require__(5);\n\n// CONCATENATED MODULE: ./src/discovery/DiscoveredObject.js\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n//import {divideURL, convertToUserURL} from '../utils/utils';\n\n/**\r\n* Discovered Object interface\r\n*/\n\nvar DiscoveredObject =\n/*#__PURE__*/\nfunction (_RegistrationStatus) {\n _inherits(DiscoveredObject, _RegistrationStatus);\n\n _createClass(DiscoveredObject, [{\n key: \"data\",\n get: function get() {\n return this._data;\n }\n }]);\n\n function DiscoveredObject(data, runtimeURL, discoveryURL, msgBus, discovery) {\n var _this2;\n\n _classCallCheck(this, DiscoveredObject);\n\n _this2 = _possibleConstructorReturn(this, _getPrototypeOf(DiscoveredObject).call(this, data.hypertyID || data.url, runtimeURL, discoveryURL, msgBus));\n _this2._data = data;\n _this2._discovery = discovery;\n return _this2;\n }\n /**\r\n * function to check the status of the DiscoveredObject.\r\n * Depending on existing subscribers it may trigger onLive or onDisconnected events.\r\n *\r\n */\n\n\n _createClass(DiscoveredObject, [{\n key: \"check\",\n value: function check() {\n // query DR for the status and call processNotification with msg received\n var _this = this;\n\n var message = {\n body: {}\n };\n\n if (_this._discoveredObjectURL.startsWith('hyperty://')) {\n _this._discovery.discoverHypertyPerURL(_this._discoveredObjectURL).then(function (registration) {\n message.body.status = registration.status;\n\n _this._processNotification(message);\n });\n } else {\n _this._discovery.discoverDataObjectsPerURL(_this._discoveredObjectURL).then(function (registration) {\n message.body.status = registration.status;\n\n _this._processNotification(message);\n });\n }\n }\n }]);\n\n return DiscoveredObject;\n}(RegistrationStatus[\"a\" /* default */]);\n\n/* harmony default export */ var discovery_DiscoveredObject = (DiscoveredObject);\n// CONCATENATED MODULE: ./src/discovery/Discovery.js\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); }\n\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance\"); }\n\nfunction _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === \"[object Arguments]\") return Array.from(iter); }\n\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } }\n\nfunction Discovery_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Discovery_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Discovery_createClass(Constructor, protoProps, staticProps) { if (protoProps) Discovery_defineProperties(Constructor.prototype, protoProps); if (staticProps) Discovery_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n// Log System\n\nvar log = loglevel[\"getLogger\"]('Discovery');\n\n\n/**\r\n* Core Discovery interface\r\n* Class to allow applications to search for hyperties and DataObjects using the message bus\r\n*/\n\nvar Discovery_Discovery =\n/*#__PURE__*/\nfunction () {\n /**\r\n * To initialise the HypertyDiscover, which will provide the support for hyperties to\r\n * query users registered in outside the internal core.\r\n * @param {MessageBus} msgbus msgbus\r\n * @param {RuntimeURL} runtimeURL runtimeURL\r\n */\n function Discovery(hypertyURL, runtimeURL, msgBus) {\n Discovery_classCallCheck(this, Discovery);\n\n var _this = this;\n\n _this.messageBus = msgBus;\n _this.runtimeURL = runtimeURL;\n _this.domain = Object(utils[\"k\" /* divideURL */])(hypertyURL).domain;\n _this.discoveryURL = hypertyURL;\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\r\n * @param {String} userIdentifier\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n\n Discovery_createClass(Discovery, [{\n key: \"_isLegacyUser\",\n value: function _isLegacyUser(userIdentifier) {\n if (userIdentifier.includes(':') && !userIdentifier.includes('user://')) {\n return true;\n } else {\n return false;\n }\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\r\n * @param {String} userIdentifier\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverHypertiesPerUserProfileData\",\n value: function discoverHypertiesPerUserProfileData(userIdentifier, schema, resources) {\n var _this = this;\n\n var filteredHyperties = [];\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/userprofile/' + userIdentifier\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n if (!_this._isLegacyUser(userIdentifier)) {\n // todo: to reomve when discovery of legcay users are supported\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n reply.body.value.map(function (hyperty) {\n if (hyperty.hypertyID != _this.discoveryURL) filteredHyperties.push(hyperty);\n });\n if (filteredHyperties.length === 0) resolve([]);else {\n log.log(\"[Discovery.discoverHypertiesPerUserProfileData] Reply log: \", filteredHyperties);\n resolve(filteredHyperties);\n }\n } else {\n log.warn(\"[Discovery.discoverHypertiesPerUserProfileData] Error Reply for \" + userIdentifier + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n } else {\n resolve([{\n hypertyID: userIdentifier,\n status: 'live'\n }]);\n }\n });\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some user identifier (eg email, name ...)\r\n * returns DiscoveredObject\r\n * @param {String} userIdentifier\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverHypertiesPerUserProfileDataDO\",\n value: function discoverHypertiesPerUserProfileDataDO(userIdentifier, schema, resources) {\n var _this2 = this,\n _arguments = arguments;\n\n return new Promise(function (resolve, reject) {\n _this2.discoverHypertiesPerUserProfileData.apply(_this2, _toConsumableArray(_arguments)).then(function (hyperties) {\n resolve(_this2._convertToDiscoveredObject(hyperties));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * Advanced Search for DataObjects registered in domain registry associated with some user identifier (eg email, name ...)\r\n * @param {String} userIdentifier\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverDataObjectsPerUserProfileData\",\n value: function discoverDataObjectsPerUserProfileData(userIdentifier, schema, resources) {\n var _this = this;\n\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/userprofile/' + userIdentifier\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n if (!_this._isLegacyUser(userIdentifier)) {\n // todo: to reomve when discovery of legcay users are supported\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n log.log(\"Reply log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n log.warn(\"[Discovery.discoverDataObjectsPerUserProfileData] Error Reply for \" + userIdentifier + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n } else {\n resolve([{\n hypertyID: userIdentifier,\n status: 'live'\n }]);\n }\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} guidURL guid URL e.g user-guid://\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjectsPerUserProfileDataDO\",\n value: function discoverDataObjectsPerUserProfileDataDO(guidURL, schema, resources) {\n var _this3 = this,\n _arguments2 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this3.discoverDataObjectsPerUserProfileData.apply(_this3, _toConsumableArray(_arguments2)).then(function (registryObjects) {\n return resolve(_this3._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some GUID\r\n * @param {String} guidURL guid URL e.g user-guid://\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverHypertiesPerGUID\",\n value: function discoverHypertiesPerGUID(guidURL, schema, resources) {\n var _this = this;\n\n var filteredHyperties = [];\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/guid/' + guidURL\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n reply.body.value.map(function (hyperty) {\n if (hyperty.hypertyID != _this.discoveryURL) filteredHyperties.push(hyperty);\n });\n if (filteredHyperties.length === 0) reject('No Hyperty was found');else {\n log.log(\"Reply log: \", filteredHyperties);\n resolve(filteredHyperties);\n }\n } else {\n log.warn(\"[Discovery.discoverHypertiesPerGUID] Error Reply for \" + guidURL + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * Advanced Search for Hyperties registered in domain registry associated with some GUID\r\n * returns DiscoveredObject\r\n * @param {String} guidURL guid URL e.g user-guid://\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n */\n\n }, {\n key: \"discoverHypertiesPerGUIDDO\",\n value: function discoverHypertiesPerGUIDDO(guidURL, schema, resources) {\n var _this4 = this,\n _arguments3 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this4.discoverHypertiesPerGUID.apply(_this4, _toConsumableArray(_arguments3)).then(function (hyperties) {\n resolve(_this4._convertToDiscoveredObject(hyperties));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * Advanced Search for DataObjects registered in domain registry associated with some GUID\r\n * @param {String} guidURL guid URL e.g user-guid://\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjectsPerGUID\",\n value: function discoverDataObjectsPerGUID(guidURL, schema, resources) {\n var _this = this;\n\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/guid/' + guidURL\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n log.log(\"Reply log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n log.warn(\"[Discovery.discoverDataObjectsPerGUID] Error Reply for \" + guidURL + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} guidURL guid URL e.g user-guid://\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjectsPerGUIDDO\",\n value: function discoverDataObjectsPerGUIDDO(guidURL, schema, resources) {\n var _this5 = this,\n _arguments4 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this5.discoverDataObjectsPerGUID.apply(_this5, _toConsumableArray(_arguments4)).then(function (registryObjects) {\n return resolve(_this5._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /** Advanced Search for Hyperties registered in domain registry\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverHyperties\",\n value: function discoverHyperties(user, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n var filteredHyperties = [];\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/user/' + user\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n if (!_this._isLegacyUser(user)) {\n // todo: to reomve when discovery of legcay users are supported\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200 || reply.body.code === 500) {\n reply.body.value.map(function (hyperty) {\n if (hyperty.hypertyID != _this.discoveryURL) filteredHyperties.push(hyperty);\n });\n /* if(filteredHyperties.length === 0)\r\n reject('No Hyperty was found');\r\n else {*/\n\n log.log(\"[Discovery.discoverHyperties] Reply : \", filteredHyperties);\n resolve(filteredHyperties); // }\n } else {\n log.warn(\"[Discovery.discoverHyperties] Error Reply for \" + user + \" Reason: \", reply.body.description);\n resolve(filteredHyperties);\n }\n });\n } else {\n resolve([{\n hypertyID: user,\n status: 'live'\n }]);\n }\n });\n }\n /** Advanced Search for Hyperties registered in domain registry,\r\n *returns DiscoveredObject\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverHypertiesDO\",\n value: function discoverHypertiesDO(user, schema, resources, domain) {\n var _this6 = this,\n _arguments5 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this6.discoverHyperties.apply(_this6, _toConsumableArray(_arguments5)).then(function (hyperties) {\n resolve(_this6._convertToDiscoveredObject(hyperties));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /** Advanced Search for DataObjects registered in domain registry\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjects\",\n value: function discoverDataObjects(user, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/user/' + user\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n log.warn(\"[Discovery.discoverDataObjects] Error Reply for \" + user + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObjectsDO\",\n value: function discoverDataObjectsDO(user, schema, resources, domain) {\n var _this7 = this,\n _arguments6 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this7.discoverDataObjects.apply(_this7, _toConsumableArray(_arguments6)).then(function (registryObjects) {\n return resolve(_this7._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * function to request about hyperties registered in domain registry, and\r\n * return the hyperty information, if found.\r\n * @param {String} url hyperty URL\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverHypertyPerURL\",\n value: function discoverHypertyPerURL(url, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/hyperty/url/' + url,\n criteria: {\n domain: activeDomain\n }\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n log.warn(\"[Discovery.discoverHypertyPerURL] Error Reply for \" + url + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about hyperties registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} url hyperty URL\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverHypertyPerURLDO\",\n value: function discoverHypertyPerURLDO(url, domain) {\n var _this8 = this,\n _arguments7 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this8.discoverHypertyPerURL.apply(_this8, _toConsumableArray(_arguments7)).then(function (hyperty) {\n return resolve(new discovery_DiscoveredObject(hyperty, _this8.runtimeURL, _this8.discoveryURL, _this8.messageBus, _this8));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * return the dataObject information, if found.\r\n * @param {String} url dataObject URL\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectPerURL\",\n value: function discoverDataObjectPerURL(url, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/url/' + url,\n criteria: {\n domain: activeDomain\n }\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n log.warn(\"[Discovery.discoverDataObjectPerURL] Error Reply for \" + url + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} url dataObject URL\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectPerURLDO\",\n value: function discoverDataObjectPerURLDO(url, domain) {\n var _this9 = this,\n _arguments8 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this9.discoverDataObjectPerURL.apply(_this9, _toConsumableArray(_arguments8)).then(function (registryObject) {\n return resolve(new discovery_DiscoveredObject(registryObject, _this9.runtimeURL, _this9.discoveryURL, _this9.messageBus, _this9));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * function to request about an dataObjects registered in domain registry with a given name, and\r\n * return the dataObjects information, if found.\r\n * @param {String} name dataObject URL\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectsPerName\",\n value: function discoverDataObjectsPerName(name, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/name/' + name\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n log.warn(\"[Discovery.discoverDataObjectsPerName] Error Reply for \" + name + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} name dataObject URL\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectsPerNameDO\",\n value: function discoverDataObjectsPerNameDO(name, schema, resources, domain) {\n var _this10 = this,\n _arguments9 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this10.discoverDataObjectsPerName.apply(_this10, _toConsumableArray(_arguments9)).then(function (registryObjects) {\n return resolve(_this10._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n /**\r\n * function to request about specific reporter dataObject registered in domain registry, and\r\n * return the dataObjects from that reporter.\r\n * @param {String} reporter dataObject reporter\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectsPerReporter\",\n value: function discoverDataObjectsPerReporter(reporter, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/discovery/',\n body: {\n resource: '/dataObject/reporter/' + reporter\n }\n };\n\n if (schema || resources) {\n msg.body['criteria'] = {\n resources: resources,\n dataSchemes: schema,\n domain: activeDomain\n };\n } else {\n msg.body['criteria'] = {\n domain: activeDomain\n };\n }\n\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n if (reply.body.code === 200) {\n log.log(\"Reply Value Log: \", reply.body.value);\n resolve(reply.body.value);\n } else {\n log.warn(\"[Discovery.discoverDataObjectsPerName] Error Reply for \" + reporter + \" Reason: \", reply.body.description);\n resolve([]);\n }\n });\n });\n }\n /**\r\n * function to request about dataObject registered in domain registry, and\r\n * returns discoveredObject.\r\n * @param {String} name dataObject URL\r\n * @param {Array} schema (Optional) types of dataObjects schemas\r\n * @param {Array} resources (Optional) types of dataObjects resources\r\n * @param {String} domain (Optional)\r\n */\n\n }, {\n key: \"discoverDataObjectsPerReporterDO\",\n value: function discoverDataObjectsPerReporterDO(reporter, schema, resources, domain) {\n var _this11 = this,\n _arguments10 = arguments;\n\n return new Promise(function (resolve, reject) {\n _this11.discoverDataObjectsPerReporter.apply(_this11, _toConsumableArray(_arguments10)).then(function (registryObjects) {\n return resolve(_this11._convertToDiscoveredObject(registryObjects));\n }).catch(function (error) {\n return reject(error);\n });\n });\n }\n }, {\n key: \"_convertToDiscoveredObject\",\n value: function _convertToDiscoveredObject(registryObjects) {\n var _this12 = this;\n\n return registryObjects.map(function (registryObject) {\n return new discovery_DiscoveredObject(registryObject, _this12.runtimeURL, _this12.discoveryURL, _this12.messageBus, _this12);\n });\n }\n /** Advanced Search for dataObjects registered in domain registry\r\n * @deprecated Deprecated. Use discoverDataObjectsPerName instead\r\n * @param {String} name name of the dataObject\r\n * @param {Array} schema (Optional) types of dataObject schemas\r\n * @param {Array} resources (Optional) types of dataObject resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverDataObject\",\n value: function discoverDataObject(name, schema, resources, domain) {\n var _this = this;\n\n var activeDomain; //let userIdentifier = convertToUserURL(user);\n\n activeDomain = !domain ? _this.domain : domain;\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: name,\n criteria: {\n resources: resources,\n dataSchemes: schema\n }\n }\n };\n return new Promise(function (resolve, reject) {\n _this.messageBus.postMessage(msg, function (reply) {\n log.log('[Discovery]', reply);\n\n if (reply.body.code > 299) {\n log.warn(\"[Discovery.discoverDataObject] Error Reply for \" + name + \" Reason: \", reply.body.description);\n return resolve([]);\n }\n\n var hyperties = reply.body.value;\n\n if (hyperties) {\n resolve(hyperties);\n } else {\n resolve([]);\n }\n });\n });\n }\n /** Advanced Search for Hyperties registered in domain registry\r\n * @deprecated Deprecated. Use discoverHyperties instead\r\n * @param {String} user user identifier, either in url or email format\r\n * @param {Array} schema (Optional) types of hyperties schemas\r\n * @param {Array} resources (Optional) types of hyperties resources\r\n * @param {String} domain (Optional) domain of the registry to search\r\n */\n\n }, {\n key: \"discoverHyperty\",\n value: function discoverHyperty(user, schema, resources, domain) {\n var _this = this;\n\n var activeDomain;\n var userIdentifier = Object(utils[\"f\" /* convertToUserURL */])(user);\n\n if (!domain) {\n activeDomain = _this.domain;\n } else {\n activeDomain = domain;\n }\n\n return new Promise(function (resolve, reject) {\n log.log('[Discovery.discoverHyperty] ACTIVE DOMAIN -> ', activeDomain, 'user->', user, 'schema->', schema, 'resources->', resources, 'domain->', domain);\n\n if (user.includes(':') && !user.includes('user://')) {\n log.log('[Discovery.discoverHyperty] ' + user + ' is legacy domain');\n var legacyUser = {\n userID: user,\n hypertyID: user,\n schema: schema,\n resources: resources\n };\n return resolve(legacyUser);\n }\n\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: userIdentifier,\n criteria: {\n resources: resources,\n dataSchemes: schema\n }\n }\n };\n log.info('[Discovery] msg to send->', msg);\n\n _this.messageBus.postMessage(msg, function (reply) {\n log.info('[Discovery] ON discoverHyperty->', reply);\n var hyperties = reply.body.value;\n\n if (hyperties) {\n resolve(hyperties);\n } else {\n reject('No Hyperty was found');\n }\n });\n });\n }\n /**\r\n * function to request about users registered in domain registry, and\r\n * return the last hyperty instance registered by the user.\r\n * @deprecated Deprecated. Use discoverHyperty instead\r\n * @param {email} email\r\n * @param {domain} domain (Optional)\r\n */\n\n }, {\n key: \"discoverHypertyPerUser\",\n value: function discoverHypertyPerUser(email, domain) {\n var _this = this;\n\n var activeDomain;\n return new Promise(function (resolve, reject) {\n // Hack for legacy users\n if (email.includes(':') && !email.includes('user://')) {\n log.log('[Discovery.discoverHyperty] ' + email + 'is legacy domain');\n var legacyUser = {\n id: email,\n hypertyURL: email,\n descriptor: 'unknown'\n };\n return resolve(legacyUser);\n }\n\n if (!domain) {\n activeDomain = _this.domain;\n } else {\n activeDomain = domain;\n }\n\n var identityURL = 'user://' + email.substring(email.indexOf('@') + 1, email.length) + '/' + email.substring(0, email.indexOf('@')); // message to query domain registry, asking for a user hyperty.\n\n var message = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: identityURL\n }\n };\n log.info('[Discovery] Message: ', message, activeDomain, identityURL); //log.info('[Discovery] message READ', message);\n\n _this.messageBus.postMessage(message, function (reply) {\n log.info('[Discovery] message reply', reply);\n var hyperty;\n var mostRecent;\n var lastHyperty;\n var value = reply.body.value;\n\n for (hyperty in value) {\n if (value[hyperty].lastModified !== undefined) {\n if (mostRecent === undefined) {\n mostRecent = new Date(value[hyperty].lastModified);\n lastHyperty = hyperty;\n } else {\n var hypertyDate = new Date(value[hyperty].lastModified);\n\n if (mostRecent.getTime() < hypertyDate.getTime()) {\n mostRecent = hypertyDate;\n lastHyperty = hyperty;\n }\n }\n }\n }\n\n log.info('[Discovery] Last Hyperty: ', lastHyperty, mostRecent);\n var hypertyURL = lastHyperty;\n\n if (hypertyURL === undefined) {\n return reject('User Hyperty not found');\n }\n\n var idPackage = {\n id: email,\n descriptor: value[hypertyURL].descriptor,\n hypertyURL: hypertyURL\n };\n log.info('[Discovery] ===> hypertyDiscovery messageBundle: ', idPackage);\n resolve(idPackage);\n });\n });\n }\n /**\r\n * function to request about users registered in domain registry, and\r\n * return the all the hyperties registered by the user\r\n * @deprecated Deprecated. Use discoverHyperty instead\r\n * @param {email} email\r\n * @param {domain} domain (Optional)\r\n */\n\n }, {\n key: \"discoverHypertiesPerUser\",\n value: function discoverHypertiesPerUser(email, domain) {\n var _this = this;\n\n var activeDomain;\n log.log('on Function->', email);\n return new Promise(function (resolve, reject) {\n if (email.includes(':') && !email.includes('user://')) {\n log.log('[Discovery.discoverHyperty] is legacy domain');\n var legacyUser = {\n userID: email,\n hypertyID: email,\n schema: schema,\n resources: resources\n };\n return resolve(legacyUser);\n }\n\n if (!domain) {\n activeDomain = _this.domain;\n } else {\n activeDomain = domain;\n }\n\n var identityURL = 'user://' + email.substring(email.indexOf('@') + 1, email.length) + '/' + email.substring(0, email.indexOf('@')); // message to query domain registry, asking for a user hyperty.\n\n var message = {\n type: 'read',\n from: _this.discoveryURL,\n to: 'domain://registry.' + activeDomain,\n body: {\n resource: identityURL\n }\n };\n log.log('[Discovery] Message discoverHypertiesPerUser: ', message, activeDomain, identityURL); //log.info('[Discovery] message READ', message);\n\n _this.messageBus.postMessage(message, function (reply) {\n log.info('[Discovery] discoverHypertiesPerUser reply', reply);\n var value = reply.body.value;\n\n if (!value) {\n return reject('User Hyperty not found');\n }\n\n resolve(value);\n });\n });\n }\n /**\r\n * function to request about users registered in domain registry, and\r\n * return the all the hyperties registered by the user\r\n * @deprecated Deprecated. Use discoverHyperty instead\r\n * @param {email} email\r\n * @param {domain} domain (Optional)\r\n */\n\n }, {\n key: \"resumeDiscoveries\",\n value: function resumeDiscoveries() {\n var _this = this;\n\n log.log('[Discovery] resumeDiscoveries');\n return new Promise(function (resolve, reject) {\n var msg = {\n type: 'read',\n from: _this.discoveryURL,\n to: _this.runtimeURL + '/subscriptions',\n body: {\n resource: _this.discoveryURL\n }\n };\n\n _this.messageBus.postMessage(msg, function (reply) {\n log.log('[Discovery.resumeDiscoveries] reply: ', reply);\n var notifications = [];\n\n if (reply.body.code === 200) {\n var urls = reply.body.value; // URLs to add listeners to\n //lets create one DiscoveryObject per notification\n\n urls.forEach(function (url) {\n var objectUrl = url.split('/registration')[0];\n var data = {};\n data.url = objectUrl;\n log.log('[Discovery.resumeDiscoveries] adding listener to: ', objectUrl);\n\n if (objectUrl.includes('hyperty://')) {\n notifications.push(_this.discoverHypertyPerURLDO(objectUrl));\n } else {\n notifications.push(_this.discoverDataObjectPerURLDO(objectUrl));\n }\n });\n Promise.all(notifications).then(function (values) {\n resolve(values);\n });\n } else {\n resolve([]);\n }\n });\n });\n }\n }]);\n\n return Discovery;\n}();\n\n/* harmony default export */ var discovery_Discovery = __webpack_exports__[\"a\"] = (Discovery_Discovery);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvZGlzY292ZXJ5L0Rpc2NvdmVyZWRPYmplY3QuanM/MDIzOSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvZGlzY292ZXJ5L0Rpc2NvdmVyeS5qcz80YTQ2Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8vaW1wb3J0IHtkaXZpZGVVUkwsIGNvbnZlcnRUb1VzZXJVUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IFJlZ2lzdHJhdGlvblN0YXR1cyBmcm9tICcuL1JlZ2lzdHJhdGlvblN0YXR1cyc7XHJcblxyXG4vKipcclxuKiBEaXNjb3ZlcmVkIE9iamVjdCBpbnRlcmZhY2VcclxuKi9cclxuY2xhc3MgRGlzY292ZXJlZE9iamVjdCBleHRlbmRzIFJlZ2lzdHJhdGlvblN0YXR1cyB7XHJcblxyXG4gIGdldCBkYXRhKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihkYXRhLCBydW50aW1lVVJMLCBkaXNjb3ZlcnlVUkwsIG1zZ0J1cywgZGlzY292ZXJ5KSB7XHJcbiAgICBzdXBlcihkYXRhLmh5cGVydHlJRCB8fCBkYXRhLnVybCwgcnVudGltZVVSTCwgZGlzY292ZXJ5VVJMLCBtc2dCdXMpO1xyXG5cclxuICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xyXG4gICAgdGhpcy5fZGlzY292ZXJ5ID0gZGlzY292ZXJ5O1xyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byBjaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBEaXNjb3ZlcmVkT2JqZWN0LlxyXG4gICogRGVwZW5kaW5nIG9uIGV4aXN0aW5nIHN1YnNjcmliZXJzIGl0IG1heSB0cmlnZ2VyIG9uTGl2ZSBvciBvbkRpc2Nvbm5lY3RlZCBldmVudHMuXHJcbiAgKlxyXG4gICovXHJcblxyXG4gIGNoZWNrKCkge1xyXG4gICAgLy8gcXVlcnkgRFIgZm9yIHRoZSBzdGF0dXMgYW5kIGNhbGwgcHJvY2Vzc05vdGlmaWNhdGlvbiB3aXRoIG1zZyByZWNlaXZlZFxyXG5cclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgbWVzc2FnZSA9IHtcclxuICAgICAgYm9keToge31cclxuICAgIH07XHJcblxyXG4gICAgaWYgKF90aGlzLl9kaXNjb3ZlcmVkT2JqZWN0VVJMLnN0YXJ0c1dpdGgoJ2h5cGVydHk6Ly8nKSApIHtcclxuICAgICAgX3RoaXMuX2Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydHlQZXJVUkwoX3RoaXMuX2Rpc2NvdmVyZWRPYmplY3RVUkwpLnRoZW4oKHJlZ2lzdHJhdGlvbik9PntcclxuICAgICAgICBtZXNzYWdlLmJvZHkuc3RhdHVzID0gcmVnaXN0cmF0aW9uLnN0YXR1cztcclxuICAgICAgICBfdGhpcy5fcHJvY2Vzc05vdGlmaWNhdGlvbihtZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBfdGhpcy5fZGlzY292ZXJ5LmRpc2NvdmVyRGF0YU9iamVjdHNQZXJVUkwoX3RoaXMuX2Rpc2NvdmVyZWRPYmplY3RVUkwpLnRoZW4oKHJlZ2lzdHJhdGlvbik9PntcclxuICAgICAgICBtZXNzYWdlLmJvZHkuc3RhdHVzID0gcmVnaXN0cmF0aW9uLnN0YXR1cztcclxuICAgICAgICBfdGhpcy5fcHJvY2Vzc05vdGlmaWNhdGlvbihtZXNzYWdlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBEaXNjb3ZlcmVkT2JqZWN0O1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vLyBMb2cgU3lzdGVtXHJcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICdsb2dsZXZlbCc7XHJcbmxldCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdEaXNjb3ZlcnknKTtcclxuXHJcbmltcG9ydCB7ZGl2aWRlVVJMLCBjb252ZXJ0VG9Vc2VyVVJMfSBmcm9tICcuLi91dGlscy91dGlscyc7XHJcbmltcG9ydCBEaXNjb3ZlcmVkT2JqZWN0IGZyb20gJy4vRGlzY292ZXJlZE9iamVjdCc7XHJcblxyXG4vKipcclxuKiBDb3JlIERpc2NvdmVyeSBpbnRlcmZhY2VcclxuKiBDbGFzcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gc2VhcmNoIGZvciBoeXBlcnRpZXMgYW5kIERhdGFPYmplY3RzIHVzaW5nIHRoZSBtZXNzYWdlIGJ1c1xyXG4qL1xyXG5jbGFzcyBEaXNjb3Zlcnkge1xyXG5cclxuICAvKipcclxuICAqIFRvIGluaXRpYWxpc2UgdGhlIEh5cGVydHlEaXNjb3Zlciwgd2hpY2ggd2lsbCBwcm92aWRlIHRoZSBzdXBwb3J0IGZvciBoeXBlcnRpZXMgdG9cclxuICAqIHF1ZXJ5IHVzZXJzIHJlZ2lzdGVyZWQgaW4gb3V0c2lkZSB0aGUgaW50ZXJuYWwgY29yZS5cclxuICAqIEBwYXJhbSAge01lc3NhZ2VCdXN9ICAgICAgICAgIG1zZ2J1cyAgICAgICAgICAgICAgICBtc2didXNcclxuICAqIEBwYXJhbSAge1J1bnRpbWVVUkx9ICAgICAgICAgIHJ1bnRpbWVVUkwgICAgICAgICAgICBydW50aW1lVVJMXHJcbiAgKi9cclxuICBjb25zdHJ1Y3RvcihoeXBlcnR5VVJMLCBydW50aW1lVVJMLCBtc2dCdXMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBfdGhpcy5tZXNzYWdlQnVzID0gbXNnQnVzO1xyXG4gICAgX3RoaXMucnVudGltZVVSTCA9IHJ1bnRpbWVVUkw7XHJcblxyXG4gICAgX3RoaXMuZG9tYWluID0gZGl2aWRlVVJMKGh5cGVydHlVUkwpLmRvbWFpbjtcclxuICAgIF90aGlzLmRpc2NvdmVyeVVSTCA9IGh5cGVydHlVUkw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIHVzZXIgaWRlbnRpZmllciAoZWcgZW1haWwsIG5hbWUgLi4uKVxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlcklkZW50aWZpZXJcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqL1xyXG4gIF9pc0xlZ2FjeVVzZXIodXNlcklkZW50aWZpZXIpIHtcclxuICAgIGlmICh1c2VySWRlbnRpZmllci5pbmNsdWRlcygnOicpICYmICF1c2VySWRlbnRpZmllci5pbmNsdWRlcygndXNlcjovLycpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBZHZhbmNlZCBTZWFyY2ggZm9yIEh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggc29tZSB1c2VyIGlkZW50aWZpZXIgKGVnIGVtYWlsLCBuYW1lIC4uLilcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXJJZGVudGlmaWVyXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXHJcbiAgKi9cclxuICBkaXNjb3Zlckh5cGVydGllc1BlclVzZXJQcm9maWxlRGF0YSh1c2VySWRlbnRpZmllciwgc2NoZW1hLCByZXNvdXJjZXMpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgZmlsdGVyZWRIeXBlcnRpZXMgPSBbXTtcclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG4gICAgICB0eXBlOiAncmVhZCcsXHJcbiAgICAgIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCxcclxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6ICcvaHlwZXJ0eS91c2VycHJvZmlsZS8nICsgdXNlcklkZW50aWZpZXIsXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYgKHNjaGVtYSB8fCByZXNvdXJjZXMpIHtcclxuICAgICAgbXNnLmJvZHlbJ2NyaXRlcmlhJ10gPSB7XHJcbiAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsXHJcbiAgICAgICAgZGF0YVNjaGVtZXM6IHNjaGVtYVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGlmICghX3RoaXMuX2lzTGVnYWN5VXNlcih1c2VySWRlbnRpZmllcikpIHsvLyB0b2RvOiB0byByZW9tdmUgd2hlbiBkaXNjb3Zlcnkgb2YgbGVnY2F5IHVzZXJzIGFyZSBzdXBwb3J0ZWRcclxuXHJcbiAgICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKXtcclxuICAgICAgICAgICAgcmVwbHkuYm9keS52YWx1ZS5tYXAoZnVuY3Rpb24oaHlwZXJ0eSkge1xyXG4gICAgICAgICAgICAgICBpZihoeXBlcnR5Lmh5cGVydHlJRCAhPSBfdGhpcy5kaXNjb3ZlcnlVUkwpXHJcbiAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEh5cGVydGllcy5wdXNoKGh5cGVydHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYoZmlsdGVyZWRIeXBlcnRpZXMubGVuZ3RoID09PSAwKVxyXG4gICAgICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBsb2cubG9nKFwiW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllc1BlclVzZXJQcm9maWxlRGF0YV0gUmVwbHkgbG9nOiBcIixmaWx0ZXJlZEh5cGVydGllcyk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShmaWx0ZXJlZEh5cGVydGllcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGFdIEVycm9yIFJlcGx5IGZvciBcIiArIHVzZXJJZGVudGlmaWVyICsgXCIgUmVhc29uOiBcIiwgcmVwbHkuYm9keS5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoW3toeXBlcnR5SUQ6IHVzZXJJZGVudGlmaWVyLCBzdGF0dXM6ICdsaXZlJ31dKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIHVzZXIgaWRlbnRpZmllciAoZWcgZW1haWwsIG5hbWUgLi4uKVxyXG4gICogcmV0dXJucyBEaXNjb3ZlcmVkT2JqZWN0XHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICB1c2VySWRlbnRpZmllclxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xyXG4gICovXHJcbiAgZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyUHJvZmlsZURhdGFETyh1c2VySWRlbnRpZmllciwgc2NoZW1hLCByZXNvdXJjZXMpIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRpc2NvdmVySHlwZXJ0aWVzUGVyVXNlclByb2ZpbGVEYXRhKC4uLmFyZ3VtZW50cylcclxuICAgICAgLnRoZW4oaHlwZXJ0aWVzID0+IHtcclxuICAgICAgICByZXNvbHZlKHRoaXMuX2NvbnZlcnRUb0Rpc2NvdmVyZWRPYmplY3QoaHlwZXJ0aWVzKSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBBZHZhbmNlZCBTZWFyY2ggZm9yIERhdGFPYmplY3RzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIHVzZXIgaWRlbnRpZmllciAoZWcgZW1haWwsIG5hbWUgLi4uKVxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgdXNlcklkZW50aWZpZXJcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqL1xyXG4gIGRpc2NvdmVyRGF0YU9iamVjdHNQZXJVc2VyUHJvZmlsZURhdGEodXNlcklkZW50aWZpZXIsIHNjaGVtYSwgcmVzb3VyY2VzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxyXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogJy9kYXRhT2JqZWN0L3VzZXJwcm9maWxlLycgKyB1c2VySWRlbnRpZmllcixcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZihzY2hlbWEgfHwgcmVzb3VyY2VzKSB7XHJcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xyXG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLFxyXG4gICAgICAgIGRhdGFTY2hlbWVzOiBzY2hlbWFcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBpZiAoIV90aGlzLl9pc0xlZ2FjeVVzZXIodXNlcklkZW50aWZpZXIpKSB7Ly8gdG9kbzogdG8gcmVvbXZlIHdoZW4gZGlzY292ZXJ5IG9mIGxlZ2NheSB1c2VycyBhcmUgc3VwcG9ydGVkXHJcblxyXG4gICAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCl7XHJcbiAgICAgICAgICAgIGxvZy5sb2coXCJSZXBseSBsb2c6IFwiLHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyVXNlclByb2ZpbGVEYXRhXSBFcnJvciBSZXBseSBmb3IgXCIgKyB1c2VySWRlbnRpZmllciArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xyXG4gICAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc29sdmUoW3toeXBlcnR5SUQ6IHVzZXJJZGVudGlmaWVyLCBzdGF0dXM6ICdsaXZlJ31dKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBkYXRhT2JqZWN0IHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcclxuICAqIHJldHVybnMgZGlzY292ZXJlZE9iamVjdC5cclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGd1aWRVUkwgICAgICAgICAgICAgICAgZ3VpZCBVUkwgZS5nIHVzZXItZ3VpZDovLzx1bmlxdWUtdXNlci1pZGVudGlmaWVyPlxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyVXNlclByb2ZpbGVEYXRhRE8oZ3VpZFVSTCwgc2NoZW1hLCByZXNvdXJjZXMpIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRpc2NvdmVyRGF0YU9iamVjdHNQZXJVc2VyUHJvZmlsZURhdGEoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIC50aGVuKHJlZ2lzdHJ5T2JqZWN0cyA9PiByZXNvbHZlKHRoaXMuX2NvbnZlcnRUb0Rpc2NvdmVyZWRPYmplY3QocmVnaXN0cnlPYmplY3RzKSkpXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgSHlwZXJ0aWVzIHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5IGFzc29jaWF0ZWQgd2l0aCBzb21lIEdVSURcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGd1aWRVUkwgICAgICAgICAgICAgICAgZ3VpZCBVUkwgZS5nIHVzZXItZ3VpZDovLzx1bmlxdWUtdXNlci1pZGVudGlmaWVyPlxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xyXG4gICovXHJcbiAgZGlzY292ZXJIeXBlcnRpZXNQZXJHVUlEKGd1aWRVUkwsIHNjaGVtYSwgcmVzb3VyY2VzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGZpbHRlcmVkSHlwZXJ0aWVzID0gW107XHJcblxyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3JlYWQnLFxyXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXHJcbiAgICAgIHRvOiBfdGhpcy5ydW50aW1lVVJMICsgJy9kaXNjb3ZlcnkvJyxcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlOiAnL2h5cGVydHkvZ3VpZC8nICsgZ3VpZFVSTCxcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZihzY2hlbWEgfHwgcmVzb3VyY2VzKSB7XHJcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xyXG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLFxyXG4gICAgICAgIGRhdGFTY2hlbWVzOiBzY2hlbWFcclxuICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKXtcclxuICAgICAgICAgIHJlcGx5LmJvZHkudmFsdWUubWFwKGZ1bmN0aW9uKGh5cGVydHkpIHtcclxuICAgICAgICAgICAgIGlmKGh5cGVydHkuaHlwZXJ0eUlEICE9IF90aGlzLmRpc2NvdmVyeVVSTClcclxuICAgICAgICAgICAgICAgICBmaWx0ZXJlZEh5cGVydGllcy5wdXNoKGh5cGVydHkpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBpZihmaWx0ZXJlZEh5cGVydGllcy5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgIHJlamVjdCgnTm8gSHlwZXJ0eSB3YXMgZm91bmQnKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBsb2cubG9nKFwiUmVwbHkgbG9nOiBcIixmaWx0ZXJlZEh5cGVydGllcyk7XHJcbiAgICAgICAgICAgIHJlc29sdmUoZmlsdGVyZWRIeXBlcnRpZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydGllc1BlckdVSURdIEVycm9yIFJlcGx5IGZvciBcIiArIGd1aWRVUkwgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgR1VJRFxyXG4gICogcmV0dXJucyBEaXNjb3ZlcmVkT2JqZWN0XHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBndWlkVVJMICAgICAgICAgICAgICAgIGd1aWQgVVJMIGUuZyB1c2VyLWd1aWQ6Ly88dW5pcXVlLXVzZXItaWRlbnRpZmllcj5cclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqL1xyXG4gIGRpc2NvdmVySHlwZXJ0aWVzUGVyR1VJRERPKGd1aWRVUkwsIHNjaGVtYSwgcmVzb3VyY2VzKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kaXNjb3Zlckh5cGVydGllc1BlckdVSUQoLi4uYXJndW1lbnRzKVxyXG4gICAgICAudGhlbihoeXBlcnRpZXMgPT4ge1xyXG4gICAgICAgIHJlc29sdmUodGhpcy5fY29udmVydFRvRGlzY292ZXJlZE9iamVjdChoeXBlcnRpZXMpKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFkdmFuY2VkIFNlYXJjaCBmb3IgRGF0YU9iamVjdHMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgYXNzb2NpYXRlZCB3aXRoIHNvbWUgR1VJRFxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZ3VpZFVSTCAgICAgICAgICAgICAgICBndWlkIFVSTCBlLmcgdXNlci1ndWlkOi8vPHVuaXF1ZS11c2VyLWlkZW50aWZpZXI+XHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKSAgICAgZG9tYWluIG9mIHRoZSByZWdpc3RyeSB0byBzZWFyY2hcclxuICAqL1xyXG4gIGRpc2NvdmVyRGF0YU9iamVjdHNQZXJHVUlEKGd1aWRVUkwsIHNjaGVtYSwgcmVzb3VyY2VzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxyXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogJy9kYXRhT2JqZWN0L2d1aWQvJyArIGd1aWRVUkwsXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYoc2NoZW1hIHx8IHJlc291cmNlcykge1xyXG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcclxuICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcclxuICAgICAgICBkYXRhU2NoZW1lczogc2NoZW1hXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCl7XHJcbiAgICAgICAgICBsb2cubG9nKFwiUmVwbHkgbG9nOiBcIixyZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgIHJlc29sdmUocmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbG9nLndhcm4oXCJbRGlzY292ZXJ5LmRpc2NvdmVyRGF0YU9iamVjdHNQZXJHVUlEXSBFcnJvciBSZXBseSBmb3IgXCIgKyBndWlkVVJMICsgXCIgUmVhc29uOiBcIiwgcmVwbHkuYm9keS5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXHJcbiAgKiByZXR1cm5zIGRpc2NvdmVyZWRPYmplY3QuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBndWlkVVJMICAgICAgICAgICAgICAgIGd1aWQgVVJMIGUuZyB1c2VyLWd1aWQ6Ly88dW5pcXVlLXVzZXItaWRlbnRpZmllcj5cclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBoeXBlcnRpZXMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGh5cGVydGllcyByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxyXG4gICovXHJcbiAgZGlzY292ZXJEYXRhT2JqZWN0c1BlckdVSURETyhndWlkVVJMLCBzY2hlbWEsIHJlc291cmNlcykge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzY292ZXJEYXRhT2JqZWN0c1BlckdVSUQoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIC50aGVuKHJlZ2lzdHJ5T2JqZWN0cyA9PiByZXNvbHZlKHRoaXMuX2NvbnZlcnRUb0Rpc2NvdmVyZWRPYmplY3QocmVnaXN0cnlPYmplY3RzKSkpXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnlcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXIgICAgICAgICAgICAgICAgICB1c2VyIGlkZW50aWZpZXIsIGVpdGhlciBpbiB1cmwgb3IgZW1haWwgZm9ybWF0XHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgaHlwZXJ0aWVzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBoeXBlcnRpZXMgcmVzb3VyY2VzXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKSAgICAgZG9tYWluIG9mIHRoZSByZWdpc3RyeSB0byBzZWFyY2hcclxuICAqL1xyXG4gIGRpc2NvdmVySHlwZXJ0aWVzKHVzZXIsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xyXG4gICAgbGV0IGZpbHRlcmVkSHlwZXJ0aWVzID0gW107XHJcblxyXG4gICAgYWN0aXZlRG9tYWluID0gKCFkb21haW4pID8gX3RoaXMuZG9tYWluIDogZG9tYWluO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxyXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogJy9oeXBlcnR5L3VzZXIvJyArIHVzZXIsXHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgaWYoc2NoZW1hIHx8IHJlc291cmNlcykge1xyXG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcclxuICAgICAgICByZXNvdXJjZXM6IHJlc291cmNlcyxcclxuICAgICAgICBkYXRhU2NoZW1lczogc2NoZW1hLFxyXG4gICAgICAgIGRvbWFpbjogYWN0aXZlRG9tYWluXHJcbiAgICAgIH07XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xyXG4gICAgICAgIGRvbWFpbjogYWN0aXZlRG9tYWluXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBpZiAoIV90aGlzLl9pc0xlZ2FjeVVzZXIodXNlcikpIHsvLyB0b2RvOiB0byByZW9tdmUgd2hlbiBkaXNjb3Zlcnkgb2YgbGVnY2F5IHVzZXJzIGFyZSBzdXBwb3J0ZWRcclxuXHJcbiAgICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwIHx8IHJlcGx5LmJvZHkuY29kZSA9PT0gNTAwKXtcclxuICAgICAgICAgICAgcmVwbHkuYm9keS52YWx1ZS5tYXAoZnVuY3Rpb24oaHlwZXJ0eSkge1xyXG4gICAgICAgICAgICAgICBpZihoeXBlcnR5Lmh5cGVydHlJRCAhPSBfdGhpcy5kaXNjb3ZlcnlVUkwpXHJcbiAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEh5cGVydGllcy5wdXNoKGh5cGVydHkpO1xyXG4gICAgICAgICAgICB9KTtcclxuLyogICAgICAgICAgICBpZihmaWx0ZXJlZEh5cGVydGllcy5sZW5ndGggPT09IDApXHJcbiAgICAgICAgICAgICAgcmVqZWN0KCdObyBIeXBlcnR5IHdhcyBmb3VuZCcpO1xyXG4gICAgICAgICAgICBlbHNlIHsqL1xyXG4gICAgICAgICAgICAgIGxvZy5sb2coXCJbRGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0aWVzXSBSZXBseSA6IFwiLGZpbHRlcmVkSHlwZXJ0aWVzKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKGZpbHRlcmVkSHlwZXJ0aWVzKTtcclxuLy8gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbG9nLndhcm4oXCJbRGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0aWVzXSBFcnJvciBSZXBseSBmb3IgXCIgKyB1c2VyICsgXCIgUmVhc29uOiBcIiwgcmVwbHkuYm9keS5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgIHJlc29sdmUoZmlsdGVyZWRIeXBlcnRpZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc29sdmUoW3toeXBlcnR5SUQ6IHVzZXIsIHN0YXR1czogJ2xpdmUnfV0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBBZHZhbmNlZCBTZWFyY2ggZm9yIEh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSxcclxuICAqcmV0dXJucyBEaXNjb3ZlcmVkT2JqZWN0XHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICB1c2VyICAgICAgICAgICAgICAgICAgdXNlciBpZGVudGlmaWVyLCBlaXRoZXIgaW4gdXJsIG9yIGVtYWlsIGZvcm1hdFxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXHJcbiAgKi9cclxuICBkaXNjb3Zlckh5cGVydGllc0RPKHVzZXIsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRpc2NvdmVySHlwZXJ0aWVzKC4uLmFyZ3VtZW50cylcclxuICAgICAgLnRoZW4oaHlwZXJ0aWVzID0+IHtcclxuICAgICAgICByZXNvbHZlKHRoaXMuX2NvbnZlcnRUb0Rpc2NvdmVyZWRPYmplY3QoaHlwZXJ0aWVzKSk7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFkdmFuY2VkIFNlYXJjaCBmb3IgRGF0YU9iamVjdHMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnlcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXIgICAgICAgICAgICAgICAgICB1c2VyIGlkZW50aWZpZXIsIGVpdGhlciBpbiB1cmwgb3IgZW1haWwgZm9ybWF0XHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdHMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzKHVzZXIsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xyXG5cclxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG4gICAgICB0eXBlOiAncmVhZCcsXHJcbiAgICAgIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCxcclxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6ICcvZGF0YU9iamVjdC91c2VyLycgKyB1c2VyLFxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGlmKHNjaGVtYSB8fCByZXNvdXJjZXMpIHtcclxuICAgICAgbXNnLmJvZHlbJ2NyaXRlcmlhJ10gPSB7XHJcbiAgICAgICAgcmVzb3VyY2VzOiByZXNvdXJjZXMsXHJcbiAgICAgICAgZGF0YVNjaGVtZXM6IHNjaGVtYSxcclxuICAgICAgICBkb21haW46IGFjdGl2ZURvbWFpblxyXG4gICAgICB9O1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBtc2cuYm9keVsnY3JpdGVyaWEnXSA9IHtcclxuICAgICAgICBkb21haW46IGFjdGl2ZURvbWFpblxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICBpZihyZXBseS5ib2R5LmNvZGUgPT09IDIwMCl7XHJcbiAgICAgICAgICBsb2cubG9nKFwiUmVwbHkgVmFsdWUgTG9nOiBcIixyZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICAgIHJlc29sdmUocmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgbG9nLndhcm4oXCJbRGlzY292ZXJ5LmRpc2NvdmVyRGF0YU9iamVjdHNdIEVycm9yIFJlcGx5IGZvciBcIiArIHVzZXIgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBkYXRhT2JqZWN0IHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcclxuICAqIHJldHVybnMgZGlzY292ZXJlZE9iamVjdC5cclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHVzZXIgICAgICAgICAgICAgICAgICB1c2VyIGlkZW50aWZpZXIsIGVpdGhlciBpbiB1cmwgb3IgZW1haWwgZm9ybWF0XHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdHMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzRE8odXNlciwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzY292ZXJEYXRhT2JqZWN0cyguLi5hcmd1bWVudHMpXHJcbiAgICAgICAgLnRoZW4ocmVnaXN0cnlPYmplY3RzID0+IHJlc29sdmUodGhpcy5fY29udmVydFRvRGlzY292ZXJlZE9iamVjdChyZWdpc3RyeU9iamVjdHMpKSlcclxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBoeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxyXG4gICogcmV0dXJuIHRoZSBoeXBlcnR5IGluZm9ybWF0aW9uLCBpZiBmb3VuZC5cclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgIHVybCAgaHlwZXJ0eSBVUkxcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKVxyXG4gICovXHJcbiAgZGlzY292ZXJIeXBlcnR5UGVyVVJMKHVybCwgZG9tYWluKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgbGV0IGFjdGl2ZURvbWFpbjtcclxuXHJcbiAgICBhY3RpdmVEb21haW4gPSAoIWRvbWFpbikgPyBfdGhpcy5kb21haW4gOiBkb21haW47XHJcblxyXG4gICAgbGV0IG1zZyA9IHtcclxuICAgICAgdHlwZTogJ3JlYWQnLFxyXG4gICAgICBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsXHJcbiAgICAgIHRvOiBfdGhpcy5ydW50aW1lVVJMICsgJy9kaXNjb3ZlcnkvJyxcclxuICAgICAgYm9keToge1xyXG4gICAgICAgIHJlc291cmNlOiAnL2h5cGVydHkvdXJsLycgKyB1cmwsXHJcbiAgICAgICAgY3JpdGVyaWE6IHtcclxuICAgICAgICAgIGRvbWFpbjogYWN0aXZlRG9tYWluXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgaWYocmVwbHkuYm9keS5jb2RlID09PSAyMDApe1xyXG4gICAgICAgICAgbG9nLmxvZyhcIlJlcGx5IFZhbHVlIExvZzogXCIscmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgICByZXNvbHZlKHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydHlQZXJVUkxdIEVycm9yIFJlcGx5IGZvciBcIiArIHVybCArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xyXG4gICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IGh5cGVydGllcyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXHJcbiAgKiByZXR1cm5zIGRpc2NvdmVyZWRPYmplY3QuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICB1cmwgIGh5cGVydHkgVVJMXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcclxuICAqL1xyXG4gIGRpc2NvdmVySHlwZXJ0eVBlclVSTERPKHVybCwgZG9tYWluKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5kaXNjb3Zlckh5cGVydHlQZXJVUkwoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIC50aGVuKGh5cGVydHkgPT4gcmVzb2x2ZShuZXcgRGlzY292ZXJlZE9iamVjdChoeXBlcnR5LCB0aGlzLnJ1bnRpbWVVUkwsIHRoaXMuZGlzY292ZXJ5VVJMLCB0aGlzLm1lc3NhZ2VCdXMsIHRoaXMpKSlcclxuICAgICAgICAuY2F0Y2goZXJyb3IgPT4gcmVqZWN0KGVycm9yKSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBkYXRhT2JqZWN0IHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcclxuICAqIHJldHVybiB0aGUgZGF0YU9iamVjdCBpbmZvcm1hdGlvbiwgaWYgZm91bmQuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICB1cmwgIGRhdGFPYmplY3QgVVJMXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcclxuICAqL1xyXG4gIGRpc2NvdmVyRGF0YU9iamVjdFBlclVSTCh1cmwsIGRvbWFpbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhY3RpdmVEb21haW47XHJcblxyXG4gICAgYWN0aXZlRG9tYWluID0gKCFkb21haW4pID8gX3RoaXMuZG9tYWluIDogZG9tYWluO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxyXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogJy9kYXRhT2JqZWN0L3VybC8nICsgdXJsLFxyXG4gICAgICAgIGNyaXRlcmlhOiB7XHJcbiAgICAgICAgICBkb21haW46IGFjdGl2ZURvbWFpblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KSA9PiB7XHJcblxyXG4gICAgICAgIGlmKHJlcGx5LmJvZHkuY29kZSA9PT0gMjAwKXtcclxuICAgICAgICAgIGxvZy5sb2coXCJSZXBseSBWYWx1ZSBMb2c6IFwiLHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXBseS5ib2R5LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0UGVyVVJMXSBFcnJvciBSZXBseSBmb3IgXCIgKyB1cmwgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBkYXRhT2JqZWN0IHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcclxuICAqIHJldHVybnMgZGlzY292ZXJlZE9iamVjdC5cclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgIHVybCAgZGF0YU9iamVjdCBVUkxcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKVxyXG4gICovXHJcbiAgZGlzY292ZXJEYXRhT2JqZWN0UGVyVVJMRE8odXJsLCBkb21haW4pIHtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmRpc2NvdmVyRGF0YU9iamVjdFBlclVSTCguLi5hcmd1bWVudHMpXHJcbiAgICAgICAgLnRoZW4ocmVnaXN0cnlPYmplY3QgPT4gcmVzb2x2ZShuZXcgRGlzY292ZXJlZE9iamVjdChyZWdpc3RyeU9iamVjdCwgdGhpcy5ydW50aW1lVVJMLCB0aGlzLmRpc2NvdmVyeVVSTCwgdGhpcy5tZXNzYWdlQnVzLCB0aGlzKSkpXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgYW4gZGF0YU9iamVjdHMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnkgd2l0aCBhIGdpdmVuIG5hbWUsIGFuZFxyXG4gICogcmV0dXJuIHRoZSBkYXRhT2JqZWN0cyBpbmZvcm1hdGlvbiwgaWYgZm91bmQuXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgICBuYW1lICBkYXRhT2JqZWN0IFVSTFxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHNjaGVtYXNcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHJlc291cmNlcyAoT3B0aW9uYWwpICB0eXBlcyBvZiBkYXRhT2JqZWN0cyByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKVxyXG4gICovXHJcbiAgZGlzY292ZXJEYXRhT2JqZWN0c1Blck5hbWUobmFtZSwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhY3RpdmVEb21haW47XHJcblxyXG4gICAgYWN0aXZlRG9tYWluID0gKCFkb21haW4pID8gX3RoaXMuZG9tYWluIDogZG9tYWluO1xyXG5cclxuICAgIGxldCBtc2cgPSB7XHJcbiAgICAgIHR5cGU6ICdyZWFkJyxcclxuICAgICAgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLFxyXG4gICAgICB0bzogX3RoaXMucnVudGltZVVSTCArICcvZGlzY292ZXJ5LycsXHJcbiAgICAgIGJvZHk6IHtcclxuICAgICAgICByZXNvdXJjZTogJy9kYXRhT2JqZWN0L25hbWUvJyArIG5hbWVcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZihzY2hlbWEgfHwgcmVzb3VyY2VzKSB7XHJcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xyXG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLFxyXG4gICAgICAgIGRhdGFTY2hlbWVzOiBzY2hlbWEsXHJcbiAgICAgICAgZG9tYWluOiBhY3RpdmVEb21haW5cclxuICAgICAgfTtcclxuICAgIH1lbHNlIHtcclxuICAgICAgbXNnLmJvZHlbJ2NyaXRlcmlhJ10gPSB7XHJcbiAgICAgICAgZG9tYWluOiBhY3RpdmVEb21haW5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgaWYocmVwbHkuYm9keS5jb2RlID09PSAyMDApe1xyXG4gICAgICAgICAgbG9nLmxvZyhcIlJlcGx5IFZhbHVlIExvZzogXCIscmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgICByZXNvbHZlKHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyTmFtZV0gRXJyb3IgUmVwbHkgZm9yIFwiICsgbmFtZSArIFwiIFJlYXNvbjogXCIsIHJlcGx5LmJvZHkuZGVzY3JpcHRpb24pO1xyXG4gICAgICAgICAgcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBmdW5jdGlvbiB0byByZXF1ZXN0IGFib3V0IGRhdGFPYmplY3QgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxyXG4gICogcmV0dXJucyBkaXNjb3ZlcmVkT2JqZWN0LlxyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgICAgbmFtZSAgZGF0YU9iamVjdCBVUkxcclxuICAqIEBwYXJhbSAge0FycmF5PHN0cmluZz59ICAgIHNjaGVtYSAoT3B0aW9uYWwpICAgICB0eXBlcyBvZiBkYXRhT2JqZWN0cyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgZGF0YU9iamVjdHMgcmVzb3VyY2VzXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcclxuICAqL1xyXG4gIGRpc2NvdmVyRGF0YU9iamVjdHNQZXJOYW1lRE8obmFtZSwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzY292ZXJEYXRhT2JqZWN0c1Blck5hbWUoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIC50aGVuKHJlZ2lzdHJ5T2JqZWN0cyA9PiByZXNvbHZlKHRoaXMuX2NvbnZlcnRUb0Rpc2NvdmVyZWRPYmplY3QocmVnaXN0cnlPYmplY3RzKSkpXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHJlamVjdChlcnJvcikpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgc3BlY2lmaWMgcmVwb3J0ZXIgZGF0YU9iamVjdCByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXHJcbiAgKiByZXR1cm4gdGhlIGRhdGFPYmplY3RzIGZyb20gdGhhdCByZXBvcnRlci5cclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIHJlcG9ydGVyICAgICBkYXRhT2JqZWN0IHJlcG9ydGVyXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdHMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluICAgICAgIChPcHRpb25hbClcclxuICAqL1xyXG4gIGRpc2NvdmVyRGF0YU9iamVjdHNQZXJSZXBvcnRlcihyZXBvcnRlciwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhY3RpdmVEb21haW47XHJcblxyXG4gICAgYWN0aXZlRG9tYWluID0gKCFkb21haW4pID8gX3RoaXMuZG9tYWluIDogZG9tYWluO1xyXG5cclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG4gICAgICB0eXBlOiAncmVhZCcsXHJcbiAgICAgIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCxcclxuICAgICAgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL2Rpc2NvdmVyeS8nLFxyXG4gICAgICBib2R5OiB7XHJcbiAgICAgICAgcmVzb3VyY2U6ICcvZGF0YU9iamVjdC9yZXBvcnRlci8nICsgcmVwb3J0ZXJcclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBpZihzY2hlbWEgfHwgcmVzb3VyY2VzKSB7XHJcbiAgICAgIG1zZy5ib2R5Wydjcml0ZXJpYSddID0ge1xyXG4gICAgICAgIHJlc291cmNlczogcmVzb3VyY2VzLFxyXG4gICAgICAgIGRhdGFTY2hlbWVzOiBzY2hlbWEsXHJcbiAgICAgICAgZG9tYWluOiBhY3RpdmVEb21haW5cclxuICAgICAgfTtcclxuICAgIH1lbHNlIHtcclxuICAgICAgbXNnLmJvZHlbJ2NyaXRlcmlhJ10gPSB7XHJcbiAgICAgICAgZG9tYWluOiBhY3RpdmVEb21haW5cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuXHJcbiAgICAgICAgaWYocmVwbHkuYm9keS5jb2RlID09PSAyMDApe1xyXG4gICAgICAgICAgbG9nLmxvZyhcIlJlcGx5IFZhbHVlIExvZzogXCIscmVwbHkuYm9keS52YWx1ZSk7XHJcbiAgICAgICAgICByZXNvbHZlKHJlcGx5LmJvZHkudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGxvZy53YXJuKFwiW0Rpc2NvdmVyeS5kaXNjb3ZlckRhdGFPYmplY3RzUGVyTmFtZV0gRXJyb3IgUmVwbHkgZm9yIFwiICsgcmVwb3J0ZXIgKyBcIiBSZWFzb246IFwiLCByZXBseS5ib2R5LmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCBkYXRhT2JqZWN0IHJlZ2lzdGVyZWQgaW4gZG9tYWluIHJlZ2lzdHJ5LCBhbmRcclxuICAqIHJldHVybnMgZGlzY292ZXJlZE9iamVjdC5cclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgICAgIG5hbWUgIGRhdGFPYmplY3QgVVJMXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdHMgc2NoZW1hc1xyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgcmVzb3VyY2VzIChPcHRpb25hbCkgIHR5cGVzIG9mIGRhdGFPYmplY3RzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXHJcbiAgKi9cclxuICBkaXNjb3ZlckRhdGFPYmplY3RzUGVyUmVwb3J0ZXJETyhyZXBvcnRlciwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGlzY292ZXJEYXRhT2JqZWN0c1BlclJlcG9ydGVyKC4uLmFyZ3VtZW50cylcclxuICAgICAgICAudGhlbihyZWdpc3RyeU9iamVjdHMgPT4gcmVzb2x2ZSh0aGlzLl9jb252ZXJ0VG9EaXNjb3ZlcmVkT2JqZWN0KHJlZ2lzdHJ5T2JqZWN0cykpKVxyXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiByZWplY3QoZXJyb3IpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2NvbnZlcnRUb0Rpc2NvdmVyZWRPYmplY3QocmVnaXN0cnlPYmplY3RzKSB7XHJcbiAgICByZXR1cm4gcmVnaXN0cnlPYmplY3RzLm1hcCgocmVnaXN0cnlPYmplY3QpID0+IHtcclxuICAgICAgcmV0dXJuIG5ldyBEaXNjb3ZlcmVkT2JqZWN0KHJlZ2lzdHJ5T2JqZWN0LCB0aGlzLnJ1bnRpbWVVUkwsIHRoaXMuZGlzY292ZXJ5VVJMLCB0aGlzLm1lc3NhZ2VCdXMsIHRoaXMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQWR2YW5jZWQgU2VhcmNoIGZvciBkYXRhT2JqZWN0cyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeVxyXG4gICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZC4gVXNlIGRpc2NvdmVyRGF0YU9iamVjdHNQZXJOYW1lIGluc3RlYWRcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAgICBuYW1lIG9mIHRoZSBkYXRhT2JqZWN0XHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICBzY2hlbWEgKE9wdGlvbmFsKSAgICAgdHlwZXMgb2YgZGF0YU9iamVjdCBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgZGF0YU9iamVjdCByZXNvdXJjZXNcclxuICAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpICAgICBkb21haW4gb2YgdGhlIHJlZ2lzdHJ5IHRvIHNlYXJjaFxyXG4gICovXHJcbiAgZGlzY292ZXJEYXRhT2JqZWN0KG5hbWUsIHNjaGVtYSwgcmVzb3VyY2VzLCBkb21haW4pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xyXG4gICAgLy9sZXQgdXNlcklkZW50aWZpZXIgPSBjb252ZXJ0VG9Vc2VyVVJMKHVzZXIpO1xyXG5cclxuICAgIGFjdGl2ZURvbWFpbiA9ICghZG9tYWluKSA/IF90aGlzLmRvbWFpbiA6IGRvbWFpbjtcclxuXHJcbiAgICBsZXQgbXNnID0ge1xyXG4gICAgICB0eXBlOiAncmVhZCcsIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCwgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgYWN0aXZlRG9tYWluLCBib2R5OiB7IHJlc291cmNlOiBuYW1lLFxyXG4gICAgICBjcml0ZXJpYToge3Jlc291cmNlczogcmVzb3VyY2VzLCBkYXRhU2NoZW1lczogc2NoZW1hfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobXNnLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cubG9nKCdbRGlzY292ZXJ5XScsIHJlcGx5KVxyXG5cclxuICAgICAgICBpZihyZXBseS5ib2R5LmNvZGU+Mjk5KSB7XHJcbiAgICAgICAgICBsb2cud2FybihcIltEaXNjb3ZlcnkuZGlzY292ZXJEYXRhT2JqZWN0XSBFcnJvciBSZXBseSBmb3IgXCIgKyBuYW1lICsgXCIgUmVhc29uOiBcIiwgcmVwbHkuYm9keS5kZXNjcmlwdGlvbik7XHJcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShbXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgaHlwZXJ0aWVzID0gcmVwbHkuYm9keS52YWx1ZTtcclxuXHJcbiAgICAgICAgaWYgKGh5cGVydGllcykge1xyXG4gICAgICAgICAgcmVzb2x2ZShoeXBlcnRpZXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQWR2YW5jZWQgU2VhcmNoIGZvciBIeXBlcnRpZXMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnlcclxuICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQuIFVzZSBkaXNjb3Zlckh5cGVydGllcyBpbnN0ZWFkXHJcbiAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgICAgICB1c2VyICAgICAgICAgICAgICAgICAgdXNlciBpZGVudGlmaWVyLCBlaXRoZXIgaW4gdXJsIG9yIGVtYWlsIGZvcm1hdFxyXG4gICogQHBhcmFtICB7QXJyYXk8c3RyaW5nPn0gICAgc2NoZW1hIChPcHRpb25hbCkgICAgIHR5cGVzIG9mIGh5cGVydGllcyBzY2hlbWFzXHJcbiAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSAgICByZXNvdXJjZXMgKE9wdGlvbmFsKSAgdHlwZXMgb2YgaHlwZXJ0aWVzIHJlc291cmNlc1xyXG4gICogQHBhcmFtICB7U3RyaW5nfSAgICAgICAgICAgZG9tYWluIChPcHRpb25hbCkgICAgIGRvbWFpbiBvZiB0aGUgcmVnaXN0cnkgdG8gc2VhcmNoXHJcbiAgKi9cclxuICBkaXNjb3Zlckh5cGVydHkodXNlciwgc2NoZW1hLCByZXNvdXJjZXMsIGRvbWFpbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhY3RpdmVEb21haW47XHJcbiAgICBsZXQgdXNlcklkZW50aWZpZXIgPSBjb252ZXJ0VG9Vc2VyVVJMKHVzZXIpO1xyXG5cclxuICAgIGlmICghZG9tYWluKSB7XHJcbiAgICAgIGFjdGl2ZURvbWFpbiA9IF90aGlzLmRvbWFpbjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGFjdGl2ZURvbWFpbiA9IGRvbWFpbjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7XHJcblxyXG4gICAgICBsb2cubG9nKCdbRGlzY292ZXJ5LmRpc2NvdmVySHlwZXJ0eV0gQUNUSVZFIERPTUFJTiAtPiAnLCBhY3RpdmVEb21haW4sICd1c2VyLT4nLCB1c2VyLCAnc2NoZW1hLT4nLCBzY2hlbWEsICdyZXNvdXJjZXMtPicsIHJlc291cmNlcywgJ2RvbWFpbi0+JywgZG9tYWluKTtcclxuICAgICAgaWYgKHVzZXIuaW5jbHVkZXMoJzonKSAmJiAhdXNlci5pbmNsdWRlcygndXNlcjovLycpKSB7XHJcbiAgICAgICAgbG9nLmxvZygnW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydHldICcgKyB1c2VyICsgJyBpcyBsZWdhY3kgZG9tYWluJyk7XHJcbiAgICAgICAgbGV0IGxlZ2FjeVVzZXIgPSB7IHVzZXJJRDogdXNlciwgaHlwZXJ0eUlEOiB1c2VyLCBzY2hlbWE6IHNjaGVtYSwgcmVzb3VyY2VzOiByZXNvdXJjZXMgfTtcclxuICAgICAgICByZXR1cm4gcmVzb2x2ZShsZWdhY3lVc2VyKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgbXNnID0ge1xyXG4gICAgICAgIHR5cGU6ICdyZWFkJywgZnJvbTogX3RoaXMuZGlzY292ZXJ5VVJMLCB0bzogJ2RvbWFpbjovL3JlZ2lzdHJ5LicgKyBhY3RpdmVEb21haW4sIGJvZHk6IHsgcmVzb3VyY2U6IHVzZXJJZGVudGlmaWVyLFxyXG4gICAgICAgIGNyaXRlcmlhOiB7cmVzb3VyY2VzOiByZXNvdXJjZXMsIGRhdGFTY2hlbWVzOiBzY2hlbWF9XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgbG9nLmluZm8oJ1tEaXNjb3ZlcnldIG1zZyB0byBzZW5kLT4nLCBtc2cpO1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtc2csIChyZXBseSkgPT4ge1xyXG5cclxuICAgICAgICBsb2cuaW5mbygnW0Rpc2NvdmVyeV0gT04gZGlzY292ZXJIeXBlcnR5LT4nLCByZXBseSk7XHJcbiAgICAgICAgbGV0IGh5cGVydGllcyA9IHJlcGx5LmJvZHkudmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChoeXBlcnRpZXMpIHtcclxuICAgICAgICAgIHJlc29sdmUoaHlwZXJ0aWVzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVqZWN0KCdObyBIeXBlcnR5IHdhcyBmb3VuZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCB1c2VycyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXHJcbiAgKiByZXR1cm4gdGhlIGxhc3QgaHlwZXJ0eSBpbnN0YW5jZSByZWdpc3RlcmVkIGJ5IHRoZSB1c2VyLlxyXG4gICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZC4gVXNlIGRpc2NvdmVySHlwZXJ0eSBpbnN0ZWFkXHJcbiAgKiBAcGFyYW0gIHtlbWFpbH0gICAgICAgICAgICAgIGVtYWlsXHJcbiAgKiBAcGFyYW0gIHtkb21haW59ICAgICAgICAgICAgZG9tYWluIChPcHRpb25hbClcclxuICAqL1xyXG4gIGRpc2NvdmVySHlwZXJ0eVBlclVzZXIoZW1haWwsIGRvbWFpbikge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIGxldCBhY3RpdmVEb21haW47XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgLy8gSGFjayBmb3IgbGVnYWN5IHVzZXJzXHJcbiAgICAgIGlmIChlbWFpbC5pbmNsdWRlcygnOicpICYmICFlbWFpbC5pbmNsdWRlcygndXNlcjovLycpKSB7XHJcbiAgICAgICAgbG9nLmxvZygnW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydHldICcgKyBlbWFpbCArJ2lzIGxlZ2FjeSBkb21haW4nKTtcclxuICAgICAgICBsZXQgbGVnYWN5VXNlciA9IHsgaWQ6IGVtYWlsLCBoeXBlcnR5VVJMOiBlbWFpbCwgZGVzY3JpcHRvcjogJ3Vua25vd24nIH07XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUobGVnYWN5VXNlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghZG9tYWluKSB7XHJcbiAgICAgICAgYWN0aXZlRG9tYWluID0gX3RoaXMuZG9tYWluO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFjdGl2ZURvbWFpbiA9IGRvbWFpbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGlkZW50aXR5VVJMID0gJ3VzZXI6Ly8nICsgZW1haWwuc3Vic3RyaW5nKGVtYWlsLmluZGV4T2YoJ0AnKSArIDEsIGVtYWlsLmxlbmd0aCkgKyAnLycgKyBlbWFpbC5zdWJzdHJpbmcoMCwgZW1haWwuaW5kZXhPZignQCcpKTtcclxuXHJcblxyXG4gICAgICAvLyBtZXNzYWdlIHRvIHF1ZXJ5IGRvbWFpbiByZWdpc3RyeSwgYXNraW5nIGZvciBhIHVzZXIgaHlwZXJ0eS5cclxuICAgICAgbGV0IG1lc3NhZ2UgPSB7XHJcbiAgICAgICAgdHlwZTogJ3JlYWQnLCBmcm9tOiBfdGhpcy5kaXNjb3ZlcnlVUkwsIHRvOiAnZG9tYWluOi8vcmVnaXN0cnkuJyArIGFjdGl2ZURvbWFpbiwgYm9keTogeyByZXNvdXJjZTogaWRlbnRpdHlVUkx9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBsb2cuaW5mbygnW0Rpc2NvdmVyeV0gTWVzc2FnZTogJywgbWVzc2FnZSwgYWN0aXZlRG9tYWluLCBpZGVudGl0eVVSTCk7XHJcblxyXG4gICAgICAvL2xvZy5pbmZvKCdbRGlzY292ZXJ5XSBtZXNzYWdlIFJFQUQnLCBtZXNzYWdlKTtcclxuXHJcbiAgICAgIF90aGlzLm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UobWVzc2FnZSwgKHJlcGx5KSA9PiB7XHJcbiAgICAgICAgbG9nLmluZm8oJ1tEaXNjb3ZlcnldIG1lc3NhZ2UgcmVwbHknLCByZXBseSk7XHJcblxyXG4gICAgICAgIGxldCBoeXBlcnR5O1xyXG4gICAgICAgIGxldCBtb3N0UmVjZW50O1xyXG4gICAgICAgIGxldCBsYXN0SHlwZXJ0eTtcclxuICAgICAgICBsZXQgdmFsdWUgPSByZXBseS5ib2R5LnZhbHVlO1xyXG5cclxuICAgICAgICBmb3IgKGh5cGVydHkgaW4gdmFsdWUpIHtcclxuICAgICAgICAgIGlmICh2YWx1ZVtoeXBlcnR5XS5sYXN0TW9kaWZpZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAobW9zdFJlY2VudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgbW9zdFJlY2VudCA9IG5ldyBEYXRlKHZhbHVlW2h5cGVydHldLmxhc3RNb2RpZmllZCk7XHJcbiAgICAgICAgICAgICAgbGFzdEh5cGVydHkgPSBoeXBlcnR5O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxldCBoeXBlcnR5RGF0ZSA9IG5ldyBEYXRlKHZhbHVlW2h5cGVydHldLmxhc3RNb2RpZmllZCk7XHJcbiAgICAgICAgICAgICAgaWYgKG1vc3RSZWNlbnQuZ2V0VGltZSgpIDwgaHlwZXJ0eURhdGUuZ2V0VGltZSgpKSB7XHJcbiAgICAgICAgICAgICAgICBtb3N0UmVjZW50ID0gaHlwZXJ0eURhdGU7XHJcbiAgICAgICAgICAgICAgICBsYXN0SHlwZXJ0eSA9IGh5cGVydHk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsb2cuaW5mbygnW0Rpc2NvdmVyeV0gTGFzdCBIeXBlcnR5OiAnLCBsYXN0SHlwZXJ0eSwgbW9zdFJlY2VudCk7XHJcblxyXG4gICAgICAgIGxldCBoeXBlcnR5VVJMID0gbGFzdEh5cGVydHk7XHJcblxyXG4gICAgICAgIGlmIChoeXBlcnR5VVJMID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHJldHVybiByZWplY3QoJ1VzZXIgSHlwZXJ0eSBub3QgZm91bmQnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBpZFBhY2thZ2UgPSB7XHJcbiAgICAgICAgICBpZDogZW1haWwsXHJcbiAgICAgICAgICBkZXNjcmlwdG9yOiB2YWx1ZVtoeXBlcnR5VVJMXS5kZXNjcmlwdG9yLFxyXG4gICAgICAgICAgaHlwZXJ0eVVSTDogaHlwZXJ0eVVSTFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxvZy5pbmZvKCdbRGlzY292ZXJ5XSA9PT0+IGh5cGVydHlEaXNjb3ZlcnkgbWVzc2FnZUJ1bmRsZTogJywgaWRQYWNrYWdlKTtcclxuICAgICAgICByZXNvbHZlKGlkUGFja2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGZ1bmN0aW9uIHRvIHJlcXVlc3QgYWJvdXQgdXNlcnMgcmVnaXN0ZXJlZCBpbiBkb21haW4gcmVnaXN0cnksIGFuZFxyXG4gICogcmV0dXJuIHRoZSBhbGwgdGhlIGh5cGVydGllcyByZWdpc3RlcmVkIGJ5IHRoZSB1c2VyXHJcbiAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkLiBVc2UgZGlzY292ZXJIeXBlcnR5IGluc3RlYWRcclxuICAqIEBwYXJhbSAge2VtYWlsfSAgICAgICAgICAgICAgZW1haWxcclxuICAqIEBwYXJhbSAge2RvbWFpbn0gICAgICAgICAgICBkb21haW4gKE9wdGlvbmFsKVxyXG4gICovXHJcbiAgZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyKGVtYWlsLCBkb21haW4pIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBsZXQgYWN0aXZlRG9tYWluO1xyXG4gICAgbG9nLmxvZygnb24gRnVuY3Rpb24tPicsIGVtYWlsKTtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHJcbiAgICAgIGlmIChlbWFpbC5pbmNsdWRlcygnOicpICYmICFlbWFpbC5pbmNsdWRlcygndXNlcjovLycpKSB7XHJcbiAgICAgICAgbG9nLmxvZygnW0Rpc2NvdmVyeS5kaXNjb3Zlckh5cGVydHldIGlzIGxlZ2FjeSBkb21haW4nKTtcclxuICAgICAgICBsZXQgbGVnYWN5VXNlciA9IHsgdXNlcklEOiBlbWFpbCwgaHlwZXJ0eUlEOiBlbWFpbCwgc2NoZW1hOiBzY2hlbWEsIHJlc291cmNlczogcmVzb3VyY2VzIH07XHJcbiAgICAgICAgcmV0dXJuIHJlc29sdmUobGVnYWN5VXNlcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghZG9tYWluKSB7XHJcbiAgICAgICAgYWN0aXZlRG9tYWluID0gX3RoaXMuZG9tYWluO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFjdGl2ZURvbWFpbiA9IGRvbWFpbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IGlkZW50aXR5VVJMID0gJ3VzZXI6Ly8nICsgZW1haWwuc3Vic3RyaW5nKGVtYWlsLmluZGV4T2YoJ0AnKSArIDEsIGVtYWlsLmxlbmd0aCkgKyAnLycgKyBlbWFpbC5zdWJzdHJpbmcoMCwgZW1haWwuaW5kZXhPZignQCcpKTtcclxuXHJcbiAgICAgIC8vIG1lc3NhZ2UgdG8gcXVlcnkgZG9tYWluIHJlZ2lzdHJ5LCBhc2tpbmcgZm9yIGEgdXNlciBoeXBlcnR5LlxyXG4gICAgICBsZXQgbWVzc2FnZSA9IHtcclxuICAgICAgICB0eXBlOiAncmVhZCcsIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCwgdG86ICdkb21haW46Ly9yZWdpc3RyeS4nICsgYWN0aXZlRG9tYWluLCBib2R5OiB7IHJlc291cmNlOiBpZGVudGl0eVVSTH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGxvZy5sb2coJ1tEaXNjb3ZlcnldIE1lc3NhZ2UgZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyOiAnLCBtZXNzYWdlLCBhY3RpdmVEb21haW4sIGlkZW50aXR5VVJMKTtcclxuXHJcbiAgICAgIC8vbG9nLmluZm8oJ1tEaXNjb3ZlcnldIG1lc3NhZ2UgUkVBRCcsIG1lc3NhZ2UpO1xyXG5cclxuICAgICAgX3RoaXMubWVzc2FnZUJ1cy5wb3N0TWVzc2FnZShtZXNzYWdlLCAocmVwbHkpID0+IHtcclxuICAgICAgICBsb2cuaW5mbygnW0Rpc2NvdmVyeV0gZGlzY292ZXJIeXBlcnRpZXNQZXJVc2VyIHJlcGx5JywgcmVwbHkpO1xyXG5cclxuICAgICAgICBsZXQgdmFsdWUgPSByZXBseS5ib2R5LnZhbHVlO1xyXG5cclxuICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KCdVc2VyIEh5cGVydHkgbm90IGZvdW5kJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXNvbHZlKHZhbHVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZnVuY3Rpb24gdG8gcmVxdWVzdCBhYm91dCB1c2VycyByZWdpc3RlcmVkIGluIGRvbWFpbiByZWdpc3RyeSwgYW5kXHJcbiAgKiByZXR1cm4gdGhlIGFsbCB0aGUgaHlwZXJ0aWVzIHJlZ2lzdGVyZWQgYnkgdGhlIHVzZXJcclxuICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQuIFVzZSBkaXNjb3Zlckh5cGVydHkgaW5zdGVhZFxyXG4gICogQHBhcmFtICB7ZW1haWx9ICAgICAgICAgICAgICBlbWFpbFxyXG4gICogQHBhcmFtICB7ZG9tYWlufSAgICAgICAgICAgIGRvbWFpbiAoT3B0aW9uYWwpXHJcbiAgKi9cclxuICByZXN1bWVEaXNjb3ZlcmllcygpIHtcclxuXHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG5cclxuICAgIGxvZy5sb2coJ1tEaXNjb3ZlcnldIHJlc3VtZURpc2NvdmVyaWVzJyk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xyXG5cclxuICAgICAgbGV0IG1zZyA9IHtcclxuICAgICAgICB0eXBlOiAncmVhZCcsIGZyb206IF90aGlzLmRpc2NvdmVyeVVSTCwgdG86IF90aGlzLnJ1bnRpbWVVUkwgKyAnL3N1YnNjcmlwdGlvbnMnLCBib2R5OiB7IHJlc291cmNlOiBfdGhpcy5kaXNjb3ZlcnlVUkx9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBfdGhpcy5tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1zZywgKHJlcGx5KT0+e1xyXG4gICAgICAgIGxvZy5sb2coJ1tEaXNjb3ZlcnkucmVzdW1lRGlzY292ZXJpZXNdIHJlcGx5OiAnLCByZXBseSk7XHJcblxyXG4gICAgICAgIGxldCBub3RpZmljYXRpb25zID0gW107XHJcblxyXG4gICAgICAgIGlmIChyZXBseS5ib2R5LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgbGV0IHVybHMgPSByZXBseS5ib2R5LnZhbHVlOy8vIFVSTHMgdG8gYWRkIGxpc3RlbmVycyB0b1xyXG5cclxuICAgICAgICAgIC8vbGV0cyBjcmVhdGUgb25lIERpc2NvdmVyeU9iamVjdCBwZXIgbm90aWZpY2F0aW9uXHJcbiAgICAgICAgICB1cmxzLmZvckVhY2goKHVybCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgb2JqZWN0VXJsID0gdXJsLnNwbGl0KCcvcmVnaXN0cmF0aW9uJylbMF07XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0ge307XHJcbiAgICAgICAgICAgIGRhdGEudXJsID0gb2JqZWN0VXJsO1xyXG4gICAgICAgICAgICBsb2cubG9nKCdbRGlzY292ZXJ5LnJlc3VtZURpc2NvdmVyaWVzXSBhZGRpbmcgbGlzdGVuZXIgdG86ICcsIG9iamVjdFVybCk7XHJcblxyXG4gICAgICAgICAgICBpZiAob2JqZWN0VXJsLmluY2x1ZGVzKCdoeXBlcnR5Oi8vJykpIHtcclxuICAgICAgICAgICAgICBub3RpZmljYXRpb25zLnB1c2goX3RoaXMuZGlzY292ZXJIeXBlcnR5UGVyVVJMRE8ob2JqZWN0VXJsKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbm90aWZpY2F0aW9ucy5wdXNoKF90aGlzLmRpc2NvdmVyRGF0YU9iamVjdFBlclVSTERPKG9iamVjdFVybCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIFByb21pc2UuYWxsKG5vdGlmaWNhdGlvbnMpLnRoZW4odmFsdWVzPT57IHJlc29sdmUodmFsdWVzKTsgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc29sdmUoW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGlzY292ZXJ5O1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUVBOzs7O0FBR0E7Ozs7Ozs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFKQTtBQUtBO0FBS0E7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7O0FBekNBO0FBQ0E7QUE4Q0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUM1RUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7OztBQUlBOzs7QUFFQTs7Ozs7O0FBTUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUpBO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7QUFHQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFGQTtBQUpBO0FBWUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBRkE7QUFKQTtBQVlBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUFRQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFKQTtBQUNBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FBUUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBSkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFEQTtBQU1BO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7QUFPQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQURBO0FBTUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFEQTtBQUlBO0FBQ0E7QUFHQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBSUE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBREE7QUFDQTtBQUdBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7OztBQUdBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///14\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\r\n*/\nvar AllowOverrides =\n/*#__PURE__*/\nfunction () {\n function AllowOverrides() {\n _classCallCheck(this, AllowOverrides);\n }\n\n _createClass(AllowOverrides, [{\n key: "combine",\n\n /**\r\n * Given an array of individual authorization decisions, prioritizes a positive one.\r\n * @param {boolean[]} decisions\r\n * @returns {boolean}\r\n */\n value: function combine(decisions) {\n if (decisions.indexOf(true) !== -1) {\n return true;\n } else {\n if (decisions.indexOf(false) !== -1) {\n return false;\n } else {\n return \'Not Applicable\';\n }\n }\n }\n }]);\n\n return AllowOverrides;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (AllowOverrides);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvQWxsb3dPdmVycmlkZXMuanM/MGQxNyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuKiBAYXV0aG9yIEFuYSBDYWxkZWlyYSA8YW5hLmNhbGRlaXJhQHRlY25pY28udWxpc2JvYS5wdD5cclxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIGNvbWJpbmUgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb25zIHRoYXQgcmVzdWx0IGZyb20gcnVsZXMgZXZhbHVhdGlvbi5cclxuKi9cclxuY2xhc3MgQWxsb3dPdmVycmlkZXMge1xyXG5cclxuICAvKipcclxuICAqIEdpdmVuIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgYXV0aG9yaXphdGlvbiBkZWNpc2lvbnMsIHByaW9yaXRpemVzIGEgcG9zaXRpdmUgb25lLlxyXG4gICogQHBhcmFtICAgIHtib29sZWFuW119ICAgZGVjaXNpb25zXHJcbiAgKiBAcmV0dXJucyAge2Jvb2xlYW59XHJcbiAgKi9cclxuICBjb21iaW5lKGRlY2lzaW9ucykge1xyXG4gICAgaWYgKGRlY2lzaW9ucy5pbmRleE9mKHRydWUpICE9PSAtMSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChkZWNpc2lvbnMuaW5kZXhPZihmYWxzZSkgIT09IC0xKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnTm90IEFwcGxpY2FibGUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQWxsb3dPdmVycmlkZXM7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7O0FBSUE7Ozs7Ozs7Ozs7QUFFQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFJQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///15\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\r\n*/\nvar BlockOverrides =\n/*#__PURE__*/\nfunction () {\n function BlockOverrides() {\n _classCallCheck(this, BlockOverrides);\n }\n\n _createClass(BlockOverrides, [{\n key: "combine",\n\n /**\r\n * Given an array of individual authorisation decisions, prioritises a negative one.\r\n * @param {boolean[]} decisions\r\n * @returns {boolean}\r\n */\n value: function combine(decisions) {\n if (decisions.indexOf(false) !== -1) {\n return false;\n } else {\n if (decisions.indexOf(true) !== -1) {\n return true;\n } else {\n return \'Not Applicable\';\n }\n }\n }\n }]);\n\n return BlockOverrides;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (BlockOverrides);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvQmxvY2tPdmVycmlkZXMuanM/N2Q2NyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuKiBAYXV0aG9yIEFuYSBDYWxkZWlyYSA8YW5hLmNhbGRlaXJhQHRlY25pY28udWxpc2JvYS5wdD5cclxuKiBAY2xhc3NkZXNjIENsYXNzIHRvIGNvbWJpbmUgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb25zIHRoYXQgcmVzdWx0IGZyb20gcnVsZXMgZXZhbHVhdGlvbi5cclxuKi9cclxuY2xhc3MgQmxvY2tPdmVycmlkZXMge1xyXG5cclxuICAvKipcclxuICAqIEdpdmVuIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgYXV0aG9yaXNhdGlvbiBkZWNpc2lvbnMsIHByaW9yaXRpc2VzIGEgbmVnYXRpdmUgb25lLlxyXG4gICogQHBhcmFtICAgIHtib29sZWFuW119ICAgZGVjaXNpb25zXHJcbiAgKiBAcmV0dXJucyAge2Jvb2xlYW59XHJcbiAgKi9cclxuICBjb21iaW5lKGRlY2lzaW9ucykge1xyXG4gICAgaWYgKGRlY2lzaW9ucy5pbmRleE9mKGZhbHNlKSAhPT0gLTEpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGRlY2lzaW9ucy5pbmRleE9mKHRydWUpICE9PSAtMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnTm90IEFwcGxpY2FibGUnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmxvY2tPdmVycmlkZXM7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBOzs7O0FBSUE7Ozs7Ozs7Ozs7QUFFQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUFJQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///16\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to combine the authorization decisions that result from rules evaluation.\r\n*/\nvar FirstApplicable =\n/*#__PURE__*/\nfunction () {\n function FirstApplicable() {\n _classCallCheck(this, FirstApplicable);\n }\n\n _createClass(FirstApplicable, [{\n key: "combine",\n\n /**\r\n * Given an array of individual authorisation decisions, returns the first one different from \'Not Applicable\', either positive or negative.\r\n * @param {boolean[]} decisions\r\n * @returns {boolean}\r\n */\n value: function combine(decisions) {\n for (var i in decisions) {\n if (decisions[i] !== \'Not Applicable\') {\n return decisions[i];\n }\n }\n\n return \'Not Applicable\';\n }\n }]);\n\n return FirstApplicable;\n}();\n\n/* harmony default export */ __webpack_exports__["a"] = (FirstApplicable);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTcuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbWJpbmluZ0FsZ29yaXRobXMvRmlyc3RBcHBsaWNhYmxlLmpzP2ExMzIiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuLyoqXHJcbiogQGF1dGhvciBBbmEgQ2FsZGVpcmEgPGFuYS5jYWxkZWlyYUB0ZWNuaWNvLnVsaXNib2EucHQ+XHJcbiogQGNsYXNzZGVzYyBDbGFzcyB0byBjb21iaW5lIHRoZSBhdXRob3JpemF0aW9uIGRlY2lzaW9ucyB0aGF0IHJlc3VsdCBmcm9tIHJ1bGVzIGV2YWx1YXRpb24uXHJcbiovXHJcbmNsYXNzIEZpcnN0QXBwbGljYWJsZSB7XHJcblxyXG4gIC8qKlxyXG4gICogR2l2ZW4gYW4gYXJyYXkgb2YgaW5kaXZpZHVhbCBhdXRob3Jpc2F0aW9uIGRlY2lzaW9ucywgcmV0dXJucyB0aGUgZmlyc3Qgb25lIGRpZmZlcmVudCBmcm9tICdOb3QgQXBwbGljYWJsZScsIGVpdGhlciBwb3NpdGl2ZSBvciBuZWdhdGl2ZS5cclxuICAqIEBwYXJhbSAgICB7Ym9vbGVhbltdfSAgICAgZGVjaXNpb25zXHJcbiAgKiBAcmV0dXJucyAge2Jvb2xlYW59XHJcbiAgKi9cclxuICBjb21iaW5lKGRlY2lzaW9ucykge1xyXG4gICAgZm9yIChsZXQgaSBpbiBkZWNpc2lvbnMpIHtcclxuICAgICAgaWYgKGRlY2lzaW9uc1tpXSAhPT0gJ05vdCBBcHBsaWNhYmxlJykge1xyXG4gICAgICAgIHJldHVybiBkZWNpc2lvbnNbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiAnTm90IEFwcGxpY2FibGUnO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IEZpcnN0QXBwbGljYWJsZTtcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7Ozs7QUFJQTs7Ozs7Ozs7OztBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7Ozs7O0FBSUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///17\n')},function(module,exports,__webpack_require__){eval('var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\r\nAuthor: Geraint Luff and others\r\nYear: 2013\r\n\r\nThis code is released into the "public domain" by its author(s). Anybody may use, alter and distribute the code without restriction. The author makes no guarantees, and takes no liability of any kind for use of this code.\r\n\r\nIf you find a bug or make an improvement, it would be courteous to let the author know, but it is not compulsory.\r\n*/\r\n(function (global, factory) {\r\n if (true) {\r\n // AMD. Register as an anonymous module.\r\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === \'function\' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n } else {}\r\n}(this, function () {\r\n\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FObject%2Fkeys\r\nif (!Object.keys) {\r\n\tObject.keys = (function () {\r\n\t\tvar hasOwnProperty = Object.prototype.hasOwnProperty,\r\n\t\t\thasDontEnumBug = !({toString: null}).propertyIsEnumerable(\'toString\'),\r\n\t\t\tdontEnums = [\r\n\t\t\t\t\'toString\',\r\n\t\t\t\t\'toLocaleString\',\r\n\t\t\t\t\'valueOf\',\r\n\t\t\t\t\'hasOwnProperty\',\r\n\t\t\t\t\'isPrototypeOf\',\r\n\t\t\t\t\'propertyIsEnumerable\',\r\n\t\t\t\t\'constructor\'\r\n\t\t\t],\r\n\t\t\tdontEnumsLength = dontEnums.length;\r\n\r\n\t\treturn function (obj) {\r\n\t\t\tif (typeof obj !== \'object\' && typeof obj !== \'function\' || obj === null) {\r\n\t\t\t\tthrow new TypeError(\'Object.keys called on non-object\');\r\n\t\t\t}\r\n\r\n\t\t\tvar result = [];\r\n\r\n\t\t\tfor (var prop in obj) {\r\n\t\t\t\tif (hasOwnProperty.call(obj, prop)) {\r\n\t\t\t\t\tresult.push(prop);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (hasDontEnumBug) {\r\n\t\t\t\tfor (var i=0; i < dontEnumsLength; i++) {\r\n\t\t\t\t\tif (hasOwnProperty.call(obj, dontEnums[i])) {\r\n\t\t\t\t\t\tresult.push(dontEnums[i]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t};\r\n\t})();\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create\r\nif (!Object.create) {\r\n\tObject.create = (function(){\r\n\t\tfunction F(){}\r\n\r\n\t\treturn function(o){\r\n\t\t\tif (arguments.length !== 1) {\r\n\t\t\t\tthrow new Error(\'Object.create implementation only accepts one parameter.\');\r\n\t\t\t}\r\n\t\t\tF.prototype = o;\r\n\t\t\treturn new F();\r\n\t\t};\r\n\t})();\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FisArray\r\nif(!Array.isArray) {\r\n\tArray.isArray = function (vArg) {\r\n\t\treturn Object.prototype.toString.call(vArg) === "[object Array]";\r\n\t};\r\n}\r\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FArray%2FindexOf\r\nif (!Array.prototype.indexOf) {\r\n\tArray.prototype.indexOf = function (searchElement /*, fromIndex */ ) {\r\n\t\tif (this === null) {\r\n\t\t\tthrow new TypeError();\r\n\t\t}\r\n\t\tvar t = Object(this);\r\n\t\tvar len = t.length >>> 0;\r\n\r\n\t\tif (len === 0) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tvar n = 0;\r\n\t\tif (arguments.length > 1) {\r\n\t\t\tn = Number(arguments[1]);\r\n\t\t\tif (n !== n) { // shortcut for verifying if it\'s NaN\r\n\t\t\t\tn = 0;\r\n\t\t\t} else if (n !== 0 && n !== Infinity && n !== -Infinity) {\r\n\t\t\t\tn = (n > 0 || -1) * Math.floor(Math.abs(n));\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (n >= len) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tvar k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\r\n\t\tfor (; k < len; k++) {\r\n\t\t\tif (k in t && t[k] === searchElement) {\r\n\t\t\t\treturn k;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t};\r\n}\r\n\r\n// Grungey Object.isFrozen hack\r\nif (!Object.isFrozen) {\r\n\tObject.isFrozen = function (obj) {\r\n\t\tvar key = "tv4_test_frozen_key";\r\n\t\twhile (obj.hasOwnProperty(key)) {\r\n\t\t\tkey += Math.random();\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tobj[key] = true;\r\n\t\t\tdelete obj[key];\r\n\t\t\treturn false;\r\n\t\t} catch (e) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t};\r\n}\r\n// Based on: https://github.com/geraintluff/uri-templates, but with all the de-substitution stuff removed\r\n\r\nvar uriTemplateGlobalModifiers = {\r\n\t"+": true,\r\n\t"#": true,\r\n\t".": true,\r\n\t"/": true,\r\n\t";": true,\r\n\t"?": true,\r\n\t"&": true\r\n};\r\nvar uriTemplateSuffices = {\r\n\t"*": true\r\n};\r\n\r\nfunction notReallyPercentEncode(string) {\r\n\treturn encodeURI(string).replace(/%25[0-9][0-9]/g, function (doubleEncoded) {\r\n\t\treturn "%" + doubleEncoded.substring(3);\r\n\t});\r\n}\r\n\r\nfunction uriTemplateSubstitution(spec) {\r\n\tvar modifier = "";\r\n\tif (uriTemplateGlobalModifiers[spec.charAt(0)]) {\r\n\t\tmodifier = spec.charAt(0);\r\n\t\tspec = spec.substring(1);\r\n\t}\r\n\tvar separator = "";\r\n\tvar prefix = "";\r\n\tvar shouldEscape = true;\r\n\tvar showVariables = false;\r\n\tvar trimEmptyString = false;\r\n\tif (modifier === \'+\') {\r\n\t\tshouldEscape = false;\r\n\t} else if (modifier === ".") {\r\n\t\tprefix = ".";\r\n\t\tseparator = ".";\r\n\t} else if (modifier === "/") {\r\n\t\tprefix = "/";\r\n\t\tseparator = "/";\r\n\t} else if (modifier === \'#\') {\r\n\t\tprefix = "#";\r\n\t\tshouldEscape = false;\r\n\t} else if (modifier === \';\') {\r\n\t\tprefix = ";";\r\n\t\tseparator = ";";\r\n\t\tshowVariables = true;\r\n\t\ttrimEmptyString = true;\r\n\t} else if (modifier === \'?\') {\r\n\t\tprefix = "?";\r\n\t\tseparator = "&";\r\n\t\tshowVariables = true;\r\n\t} else if (modifier === \'&\') {\r\n\t\tprefix = "&";\r\n\t\tseparator = "&";\r\n\t\tshowVariables = true;\r\n\t}\r\n\r\n\tvar varNames = [];\r\n\tvar varList = spec.split(",");\r\n\tvar varSpecs = [];\r\n\tvar varSpecMap = {};\r\n\tfor (var i = 0; i < varList.length; i++) {\r\n\t\tvar varName = varList[i];\r\n\t\tvar truncate = null;\r\n\t\tif (varName.indexOf(":") !== -1) {\r\n\t\t\tvar parts = varName.split(":");\r\n\t\t\tvarName = parts[0];\r\n\t\t\ttruncate = parseInt(parts[1], 10);\r\n\t\t}\r\n\t\tvar suffices = {};\r\n\t\twhile (uriTemplateSuffices[varName.charAt(varName.length - 1)]) {\r\n\t\t\tsuffices[varName.charAt(varName.length - 1)] = true;\r\n\t\t\tvarName = varName.substring(0, varName.length - 1);\r\n\t\t}\r\n\t\tvar varSpec = {\r\n\t\t\ttruncate: truncate,\r\n\t\t\tname: varName,\r\n\t\t\tsuffices: suffices\r\n\t\t};\r\n\t\tvarSpecs.push(varSpec);\r\n\t\tvarSpecMap[varName] = varSpec;\r\n\t\tvarNames.push(varName);\r\n\t}\r\n\tvar subFunction = function (valueFunction) {\r\n\t\tvar result = "";\r\n\t\tvar startIndex = 0;\r\n\t\tfor (var i = 0; i < varSpecs.length; i++) {\r\n\t\t\tvar varSpec = varSpecs[i];\r\n\t\t\tvar value = valueFunction(varSpec.name);\r\n\t\t\tif (value === null || value === undefined || (Array.isArray(value) && value.length === 0) || (typeof value === \'object\' && Object.keys(value).length === 0)) {\r\n\t\t\t\tstartIndex++;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (i === startIndex) {\r\n\t\t\t\tresult += prefix;\r\n\t\t\t} else {\r\n\t\t\t\tresult += (separator || ",");\r\n\t\t\t}\r\n\t\t\tif (Array.isArray(value)) {\r\n\t\t\t\tif (showVariables) {\r\n\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t}\r\n\t\t\t\tfor (var j = 0; j < value.length; j++) {\r\n\t\t\t\t\tif (j > 0) {\r\n\t\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? (separator || ",") : ",";\r\n\t\t\t\t\t\tif (varSpec.suffices[\'*\'] && showVariables) {\r\n\t\t\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(value[j]).replace(/!/g, "%21") : notReallyPercentEncode(value[j]);\r\n\t\t\t\t}\r\n\t\t\t} else if (typeof value === "object") {\r\n\t\t\t\tif (showVariables && !varSpec.suffices[\'*\']) {\r\n\t\t\t\t\tresult += varSpec.name + "=";\r\n\t\t\t\t}\r\n\t\t\t\tvar first = true;\r\n\t\t\t\tfor (var key in value) {\r\n\t\t\t\t\tif (!first) {\r\n\t\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? (separator || ",") : ",";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfirst = false;\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(key).replace(/!/g, "%21") : notReallyPercentEncode(key);\r\n\t\t\t\t\tresult += varSpec.suffices[\'*\'] ? \'=\' : ",";\r\n\t\t\t\t\tresult += shouldEscape ? encodeURIComponent(value[key]).replace(/!/g, "%21") : notReallyPercentEncode(value[key]);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (showVariables) {\r\n\t\t\t\t\tresult += varSpec.name;\r\n\t\t\t\t\tif (!trimEmptyString || value !== "") {\r\n\t\t\t\t\t\tresult += "=";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (varSpec.truncate != null) {\r\n\t\t\t\t\tvalue = value.substring(0, varSpec.truncate);\r\n\t\t\t\t}\r\n\t\t\t\tresult += shouldEscape ? encodeURIComponent(value).replace(/!/g, "%21"): notReallyPercentEncode(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn result;\r\n\t};\r\n\tsubFunction.varNames = varNames;\r\n\treturn {\r\n\t\tprefix: prefix,\r\n\t\tsubstitution: subFunction\r\n\t};\r\n}\r\n\r\nfunction UriTemplate(template) {\r\n\tif (!(this instanceof UriTemplate)) {\r\n\t\treturn new UriTemplate(template);\r\n\t}\r\n\tvar parts = template.split("{");\r\n\tvar textParts = [parts.shift()];\r\n\tvar prefixes = [];\r\n\tvar substitutions = [];\r\n\tvar varNames = [];\r\n\twhile (parts.length > 0) {\r\n\t\tvar part = parts.shift();\r\n\t\tvar spec = part.split("}")[0];\r\n\t\tvar remainder = part.substring(spec.length + 1);\r\n\t\tvar funcs = uriTemplateSubstitution(spec);\r\n\t\tsubstitutions.push(funcs.substitution);\r\n\t\tprefixes.push(funcs.prefix);\r\n\t\ttextParts.push(remainder);\r\n\t\tvarNames = varNames.concat(funcs.substitution.varNames);\r\n\t}\r\n\tthis.fill = function (valueFunction) {\r\n\t\tvar result = textParts[0];\r\n\t\tfor (var i = 0; i < substitutions.length; i++) {\r\n\t\t\tvar substitution = substitutions[i];\r\n\t\t\tresult += substitution(valueFunction);\r\n\t\t\tresult += textParts[i + 1];\r\n\t\t}\r\n\t\treturn result;\r\n\t};\r\n\tthis.varNames = varNames;\r\n\tthis.template = template;\r\n}\r\nUriTemplate.prototype = {\r\n\ttoString: function () {\r\n\t\treturn this.template;\r\n\t},\r\n\tfillFromObject: function (obj) {\r\n\t\treturn this.fill(function (varName) {\r\n\t\t\treturn obj[varName];\r\n\t\t});\r\n\t}\r\n};\r\nvar ValidatorContext = function ValidatorContext(parent, collectMultiple, errorReporter, checkRecursive, trackUnknownProperties) {\r\n\tthis.missing = [];\r\n\tthis.missingMap = {};\r\n\tthis.formatValidators = parent ? Object.create(parent.formatValidators) : {};\r\n\tthis.schemas = parent ? Object.create(parent.schemas) : {};\r\n\tthis.collectMultiple = collectMultiple;\r\n\tthis.errors = [];\r\n\tthis.handleError = collectMultiple ? this.collectError : this.returnError;\r\n\tif (checkRecursive) {\r\n\t\tthis.checkRecursive = true;\r\n\t\tthis.scanned = [];\r\n\t\tthis.scannedFrozen = [];\r\n\t\tthis.scannedFrozenSchemas = [];\r\n\t\tthis.scannedFrozenValidationErrors = [];\r\n\t\tthis.validatedSchemasKey = \'tv4_validation_id\';\r\n\t\tthis.validationErrorsKey = \'tv4_validation_errors_id\';\r\n\t}\r\n\tif (trackUnknownProperties) {\r\n\t\tthis.trackUnknownProperties = true;\r\n\t\tthis.knownPropertyPaths = {};\r\n\t\tthis.unknownPropertyPaths = {};\r\n\t}\r\n\tthis.errorReporter = errorReporter || defaultErrorReporter(\'en\');\r\n\tif (typeof this.errorReporter === \'string\') {\r\n\t\tthrow new Error(\'debug\');\r\n\t}\r\n\tthis.definedKeywords = {};\r\n\tif (parent) {\r\n\t\tfor (var key in parent.definedKeywords) {\r\n\t\t\tthis.definedKeywords[key] = parent.definedKeywords[key].slice(0);\r\n\t\t}\r\n\t}\r\n};\r\nValidatorContext.prototype.defineKeyword = function (keyword, keywordFunction) {\r\n\tthis.definedKeywords[keyword] = this.definedKeywords[keyword] || [];\r\n\tthis.definedKeywords[keyword].push(keywordFunction);\r\n};\r\nValidatorContext.prototype.createError = function (code, messageParams, dataPath, schemaPath, subErrors, data, schema) {\r\n\tvar error = new ValidationError(code, messageParams, dataPath, schemaPath, subErrors);\r\n\terror.message = this.errorReporter(error, data, schema);\r\n\treturn error;\r\n};\r\nValidatorContext.prototype.returnError = function (error) {\r\n\treturn error;\r\n};\r\nValidatorContext.prototype.collectError = function (error) {\r\n\tif (error) {\r\n\t\tthis.errors.push(error);\r\n\t}\r\n\treturn null;\r\n};\r\nValidatorContext.prototype.prefixErrors = function (startIndex, dataPath, schemaPath) {\r\n\tfor (var i = startIndex; i < this.errors.length; i++) {\r\n\t\tthis.errors[i] = this.errors[i].prefixWith(dataPath, schemaPath);\r\n\t}\r\n\treturn this;\r\n};\r\nValidatorContext.prototype.banUnknownProperties = function (data, schema) {\r\n\tfor (var unknownPath in this.unknownPropertyPaths) {\r\n\t\tvar error = this.createError(ErrorCodes.UNKNOWN_PROPERTY, {path: unknownPath}, unknownPath, "", null, data, schema);\r\n\t\tvar result = this.handleError(error);\r\n\t\tif (result) {\r\n\t\t\treturn result;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.addFormat = function (format, validator) {\r\n\tif (typeof format === \'object\') {\r\n\t\tfor (var key in format) {\r\n\t\t\tthis.addFormat(key, format[key]);\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\tthis.formatValidators[format] = validator;\r\n};\r\nValidatorContext.prototype.resolveRefs = function (schema, urlHistory) {\r\n\tif (schema[\'$ref\'] !== undefined) {\r\n\t\turlHistory = urlHistory || {};\r\n\t\tif (urlHistory[schema[\'$ref\']]) {\r\n\t\t\treturn this.createError(ErrorCodes.CIRCULAR_REFERENCE, {urls: Object.keys(urlHistory).join(\', \')}, \'\', \'\', null, undefined, schema);\r\n\t\t}\r\n\t\turlHistory[schema[\'$ref\']] = true;\r\n\t\tschema = this.getSchema(schema[\'$ref\'], urlHistory);\r\n\t}\r\n\treturn schema;\r\n};\r\nValidatorContext.prototype.getSchema = function (url, urlHistory) {\r\n\tvar schema;\r\n\tif (this.schemas[url] !== undefined) {\r\n\t\tschema = this.schemas[url];\r\n\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t}\r\n\tvar baseUrl = url;\r\n\tvar fragment = "";\r\n\tif (url.indexOf(\'#\') !== -1) {\r\n\t\tfragment = url.substring(url.indexOf("#") + 1);\r\n\t\tbaseUrl = url.substring(0, url.indexOf("#"));\r\n\t}\r\n\tif (typeof this.schemas[baseUrl] === \'object\') {\r\n\t\tschema = this.schemas[baseUrl];\r\n\t\tvar pointerPath = decodeURIComponent(fragment);\r\n\t\tif (pointerPath === "") {\r\n\t\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t\t} else if (pointerPath.charAt(0) !== "/") {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tvar parts = pointerPath.split("/").slice(1);\r\n\t\tfor (var i = 0; i < parts.length; i++) {\r\n\t\t\tvar component = parts[i].replace(/~1/g, "/").replace(/~0/g, "~");\r\n\t\t\tif (schema[component] === undefined) {\r\n\t\t\t\tschema = undefined;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tschema = schema[component];\r\n\t\t}\r\n\t\tif (schema !== undefined) {\r\n\t\t\treturn this.resolveRefs(schema, urlHistory);\r\n\t\t}\r\n\t}\r\n\tif (this.missing[baseUrl] === undefined) {\r\n\t\tthis.missing.push(baseUrl);\r\n\t\tthis.missing[baseUrl] = baseUrl;\r\n\t\tthis.missingMap[baseUrl] = baseUrl;\r\n\t}\r\n};\r\nValidatorContext.prototype.searchSchemas = function (schema, url) {\r\n\tif (Array.isArray(schema)) {\r\n\t\tfor (var i = 0; i < schema.length; i++) {\r\n\t\t\tthis.searchSchemas(schema[i], url);\r\n\t\t}\r\n\t} else if (schema && typeof schema === "object") {\r\n\t\tif (typeof schema.id === "string") {\r\n\t\t\tif (isTrustedUrl(url, schema.id)) {\r\n\t\t\t\tif (this.schemas[schema.id] === undefined) {\r\n\t\t\t\t\tthis.schemas[schema.id] = schema;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (var key in schema) {\r\n\t\t\tif (key !== "enum") {\r\n\t\t\t\tif (typeof schema[key] === "object") {\r\n\t\t\t\t\tthis.searchSchemas(schema[key], url);\r\n\t\t\t\t} else if (key === "$ref") {\r\n\t\t\t\t\tvar uri = getDocumentUri(schema[key]);\r\n\t\t\t\t\tif (uri && this.schemas[uri] === undefined && this.missingMap[uri] === undefined) {\r\n\t\t\t\t\t\tthis.missingMap[uri] = uri;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\nValidatorContext.prototype.addSchema = function (url, schema) {\r\n\t//overload\r\n\tif (typeof url !== \'string\' || typeof schema === \'undefined\') {\r\n\t\tif (typeof url === \'object\' && typeof url.id === \'string\') {\r\n\t\t\tschema = url;\r\n\t\t\turl = schema.id;\r\n\t\t}\r\n\t\telse {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\tif (url === getDocumentUri(url) + "#") {\r\n\t\t// Remove empty fragment\r\n\t\turl = getDocumentUri(url);\r\n\t}\r\n\tthis.schemas[url] = schema;\r\n\tdelete this.missingMap[url];\r\n\tnormSchema(schema, url);\r\n\tthis.searchSchemas(schema, url);\r\n};\r\n\r\nValidatorContext.prototype.getSchemaMap = function () {\r\n\tvar map = {};\r\n\tfor (var key in this.schemas) {\r\n\t\tmap[key] = this.schemas[key];\r\n\t}\r\n\treturn map;\r\n};\r\n\r\nValidatorContext.prototype.getSchemaUris = function (filterRegExp) {\r\n\tvar list = [];\r\n\tfor (var key in this.schemas) {\r\n\t\tif (!filterRegExp || filterRegExp.test(key)) {\r\n\t\t\tlist.push(key);\r\n\t\t}\r\n\t}\r\n\treturn list;\r\n};\r\n\r\nValidatorContext.prototype.getMissingUris = function (filterRegExp) {\r\n\tvar list = [];\r\n\tfor (var key in this.missingMap) {\r\n\t\tif (!filterRegExp || filterRegExp.test(key)) {\r\n\t\t\tlist.push(key);\r\n\t\t}\r\n\t}\r\n\treturn list;\r\n};\r\n\r\nValidatorContext.prototype.dropSchemas = function () {\r\n\tthis.schemas = {};\r\n\tthis.reset();\r\n};\r\nValidatorContext.prototype.reset = function () {\r\n\tthis.missing = [];\r\n\tthis.missingMap = {};\r\n\tthis.errors = [];\r\n};\r\n\r\nValidatorContext.prototype.validateAll = function (data, schema, dataPathParts, schemaPathParts, dataPointerPath) {\r\n\tvar topLevel;\r\n\tschema = this.resolveRefs(schema);\r\n\tif (!schema) {\r\n\t\treturn null;\r\n\t} else if (schema instanceof ValidationError) {\r\n\t\tthis.errors.push(schema);\r\n\t\treturn schema;\r\n\t}\r\n\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar frozenIndex, scannedFrozenSchemaIndex = null, scannedSchemasIndex = null;\r\n\tif (this.checkRecursive && data && typeof data === \'object\') {\r\n\t\ttopLevel = !this.scanned.length;\r\n\t\tif (data[this.validatedSchemasKey]) {\r\n\t\t\tvar schemaIndex = data[this.validatedSchemasKey].indexOf(schema);\r\n\t\t\tif (schemaIndex !== -1) {\r\n\t\t\t\tthis.errors = this.errors.concat(data[this.validationErrorsKey][schemaIndex]);\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (Object.isFrozen(data)) {\r\n\t\t\tfrozenIndex = this.scannedFrozen.indexOf(data);\r\n\t\t\tif (frozenIndex !== -1) {\r\n\t\t\t\tvar frozenSchemaIndex = this.scannedFrozenSchemas[frozenIndex].indexOf(schema);\r\n\t\t\t\tif (frozenSchemaIndex !== -1) {\r\n\t\t\t\t\tthis.errors = this.errors.concat(this.scannedFrozenValidationErrors[frozenIndex][frozenSchemaIndex]);\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.scanned.push(data);\r\n\t\tif (Object.isFrozen(data)) {\r\n\t\t\tif (frozenIndex === -1) {\r\n\t\t\t\tfrozenIndex = this.scannedFrozen.length;\r\n\t\t\t\tthis.scannedFrozen.push(data);\r\n\t\t\t\tthis.scannedFrozenSchemas.push([]);\r\n\t\t\t}\r\n\t\t\tscannedFrozenSchemaIndex = this.scannedFrozenSchemas[frozenIndex].length;\r\n\t\t\tthis.scannedFrozenSchemas[frozenIndex][scannedFrozenSchemaIndex] = schema;\r\n\t\t\tthis.scannedFrozenValidationErrors[frozenIndex][scannedFrozenSchemaIndex] = [];\r\n\t\t} else {\r\n\t\t\tif (!data[this.validatedSchemasKey]) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tObject.defineProperty(data, this.validatedSchemasKey, {\r\n\t\t\t\t\t\tvalue: [],\r\n\t\t\t\t\t\tconfigurable: true\r\n\t\t\t\t\t});\r\n\t\t\t\t\tObject.defineProperty(data, this.validationErrorsKey, {\r\n\t\t\t\t\t\tvalue: [],\r\n\t\t\t\t\t\tconfigurable: true\r\n\t\t\t\t\t});\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\t//IE 7/8 workaround\r\n\t\t\t\t\tdata[this.validatedSchemasKey] = [];\r\n\t\t\t\t\tdata[this.validationErrorsKey] = [];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tscannedSchemasIndex = data[this.validatedSchemasKey].length;\r\n\t\t\tdata[this.validatedSchemasKey][scannedSchemasIndex] = schema;\r\n\t\t\tdata[this.validationErrorsKey][scannedSchemasIndex] = [];\r\n\t\t}\r\n\t}\r\n\r\n\tvar errorCount = this.errors.length;\r\n\tvar error = this.validateBasic(data, schema, dataPointerPath)\r\n\t\t|| this.validateNumeric(data, schema, dataPointerPath)\r\n\t\t|| this.validateString(data, schema, dataPointerPath)\r\n\t\t|| this.validateArray(data, schema, dataPointerPath)\r\n\t\t|| this.validateObject(data, schema, dataPointerPath)\r\n\t\t|| this.validateCombinations(data, schema, dataPointerPath)\r\n\t\t|| this.validateHypermedia(data, schema, dataPointerPath)\r\n\t\t|| this.validateFormat(data, schema, dataPointerPath)\r\n\t\t|| this.validateDefinedKeywords(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n\r\n\tif (topLevel) {\r\n\t\twhile (this.scanned.length) {\r\n\t\t\tvar item = this.scanned.pop();\r\n\t\t\tdelete item[this.validatedSchemasKey];\r\n\t\t}\r\n\t\tthis.scannedFrozen = [];\r\n\t\tthis.scannedFrozenSchemas = [];\r\n\t}\r\n\r\n\tif (error || errorCount !== this.errors.length) {\r\n\t\twhile ((dataPathParts && dataPathParts.length) || (schemaPathParts && schemaPathParts.length)) {\r\n\t\t\tvar dataPart = (dataPathParts && dataPathParts.length) ? "" + dataPathParts.pop() : null;\r\n\t\t\tvar schemaPart = (schemaPathParts && schemaPathParts.length) ? "" + schemaPathParts.pop() : null;\r\n\t\t\tif (error) {\r\n\t\t\t\terror = error.prefixWith(dataPart, schemaPart);\r\n\t\t\t}\r\n\t\t\tthis.prefixErrors(errorCount, dataPart, schemaPart);\r\n\t\t}\r\n\t}\r\n\r\n\tif (scannedFrozenSchemaIndex !== null) {\r\n\t\tthis.scannedFrozenValidationErrors[frozenIndex][scannedFrozenSchemaIndex] = this.errors.slice(startErrorCount);\r\n\t} else if (scannedSchemasIndex !== null) {\r\n\t\tdata[this.validationErrorsKey][scannedSchemasIndex] = this.errors.slice(startErrorCount);\r\n\t}\r\n\r\n\treturn this.handleError(error);\r\n};\r\nValidatorContext.prototype.validateFormat = function (data, schema) {\r\n\tif (typeof schema.format !== \'string\' || !this.formatValidators[schema.format]) {\r\n\t\treturn null;\r\n\t}\r\n\tvar errorMessage = this.formatValidators[schema.format].call(null, data, schema);\r\n\tif (typeof errorMessage === \'string\' || typeof errorMessage === \'number\') {\r\n\t\treturn this.createError(ErrorCodes.FORMAT_CUSTOM, {message: errorMessage}, \'\', \'/format\', null, data, schema);\r\n\t} else if (errorMessage && typeof errorMessage === \'object\') {\r\n\t\treturn this.createError(ErrorCodes.FORMAT_CUSTOM, {message: errorMessage.message || "?"}, errorMessage.dataPath || \'\', errorMessage.schemaPath || "/format", null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\nValidatorContext.prototype.validateDefinedKeywords = function (data, schema, dataPointerPath) {\r\n\tfor (var key in this.definedKeywords) {\r\n\t\tif (typeof schema[key] === \'undefined\') {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tvar validationFunctions = this.definedKeywords[key];\r\n\t\tfor (var i = 0; i < validationFunctions.length; i++) {\r\n\t\t\tvar func = validationFunctions[i];\r\n\t\t\tvar result = func(data, schema[key], schema, dataPointerPath);\r\n\t\t\tif (typeof result === \'string\' || typeof result === \'number\') {\r\n\t\t\t\treturn this.createError(ErrorCodes.KEYWORD_CUSTOM, {key: key, message: result}, \'\', \'\', null, data, schema).prefixWith(null, key);\r\n\t\t\t} else if (result && typeof result === \'object\') {\r\n\t\t\t\tvar code = result.code;\r\n\t\t\t\tif (typeof code === \'string\') {\r\n\t\t\t\t\tif (!ErrorCodes[code]) {\r\n\t\t\t\t\t\tthrow new Error(\'Undefined error code (use defineError): \' + code);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcode = ErrorCodes[code];\r\n\t\t\t\t} else if (typeof code !== \'number\') {\r\n\t\t\t\t\tcode = ErrorCodes.KEYWORD_CUSTOM;\r\n\t\t\t\t}\r\n\t\t\t\tvar messageParams = (typeof result.message === \'object\') ? result.message : {key: key, message: result.message || "?"};\r\n\t\t\t\tvar schemaPath = result.schemaPath || ("/" + key.replace(/~/g, \'~0\').replace(/\\//g, \'~1\'));\r\n\t\t\t\treturn this.createError(code, messageParams, result.dataPath || null, schemaPath, null, data, schema);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nfunction recursiveCompare(A, B) {\r\n\tif (A === B) {\r\n\t\treturn true;\r\n\t}\r\n\tif (A && B && typeof A === "object" && typeof B === "object") {\r\n\t\tif (Array.isArray(A) !== Array.isArray(B)) {\r\n\t\t\treturn false;\r\n\t\t} else if (Array.isArray(A)) {\r\n\t\t\tif (A.length !== B.length) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tfor (var i = 0; i < A.length; i++) {\r\n\t\t\t\tif (!recursiveCompare(A[i], B[i])) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvar key;\r\n\t\t\tfor (key in A) {\r\n\t\t\t\tif (B[key] === undefined && A[key] !== undefined) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (key in B) {\r\n\t\t\t\tif (A[key] === undefined && B[key] !== undefined) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (key in A) {\r\n\t\t\t\tif (!recursiveCompare(A[key], B[key])) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nValidatorContext.prototype.validateBasic = function validateBasic(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tif (error = this.validateType(data, schema, dataPointerPath)) {\r\n\t\treturn error.prefixWith(null, "type");\r\n\t}\r\n\tif (error = this.validateEnum(data, schema, dataPointerPath)) {\r\n\t\treturn error.prefixWith(null, "type");\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateType = function validateType(data, schema) {\r\n\tif (schema.type === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar dataType = typeof data;\r\n\tif (data === null) {\r\n\t\tdataType = "null";\r\n\t} else if (Array.isArray(data)) {\r\n\t\tdataType = "array";\r\n\t}\r\n\tvar allowedTypes = schema.type;\r\n\tif (!Array.isArray(allowedTypes)) {\r\n\t\tallowedTypes = [allowedTypes];\r\n\t}\r\n\r\n\tfor (var i = 0; i < allowedTypes.length; i++) {\r\n\t\tvar type = allowedTypes[i];\r\n\t\tif (type === dataType || (type === "integer" && dataType === "number" && (data % 1 === 0))) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\treturn this.createError(ErrorCodes.INVALID_TYPE, {type: dataType, expected: allowedTypes.join("/")}, \'\', \'\', null, data, schema);\r\n};\r\n\r\nValidatorContext.prototype.validateEnum = function validateEnum(data, schema) {\r\n\tif (schema["enum"] === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tfor (var i = 0; i < schema["enum"].length; i++) {\r\n\t\tvar enumVal = schema["enum"][i];\r\n\t\tif (recursiveCompare(data, enumVal)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\treturn this.createError(ErrorCodes.ENUM_MISMATCH, {value: (typeof JSON !== \'undefined\') ? JSON.stringify(data) : data}, \'\', \'\', null, data, schema);\r\n};\r\n\r\nValidatorContext.prototype.validateNumeric = function validateNumeric(data, schema, dataPointerPath) {\r\n\treturn this.validateMultipleOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateMinMax(data, schema, dataPointerPath)\r\n\t\t|| this.validateNaN(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nvar CLOSE_ENOUGH_LOW = Math.pow(2, -51);\r\nvar CLOSE_ENOUGH_HIGH = 1 - CLOSE_ENOUGH_LOW;\r\nValidatorContext.prototype.validateMultipleOf = function validateMultipleOf(data, schema) {\r\n\tvar multipleOf = schema.multipleOf || schema.divisibleBy;\r\n\tif (multipleOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tif (typeof data === "number") {\r\n\t\tvar remainder = (data/multipleOf)%1;\r\n\t\tif (remainder >= CLOSE_ENOUGH_LOW && remainder < CLOSE_ENOUGH_HIGH) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MULTIPLE_OF, {value: data, multipleOf: multipleOf}, \'\', \'\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateMinMax = function validateMinMax(data, schema) {\r\n\tif (typeof data !== "number") {\r\n\t\treturn null;\r\n\t}\r\n\tif (schema.minimum !== undefined) {\r\n\t\tif (data < schema.minimum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MINIMUM, {value: data, minimum: schema.minimum}, \'\', \'/minimum\', null, data, schema);\r\n\t\t}\r\n\t\tif (schema.exclusiveMinimum && data === schema.minimum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MINIMUM_EXCLUSIVE, {value: data, minimum: schema.minimum}, \'\', \'/exclusiveMinimum\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\tif (schema.maximum !== undefined) {\r\n\t\tif (data > schema.maximum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MAXIMUM, {value: data, maximum: schema.maximum}, \'\', \'/maximum\', null, data, schema);\r\n\t\t}\r\n\t\tif (schema.exclusiveMaximum && data === schema.maximum) {\r\n\t\t\treturn this.createError(ErrorCodes.NUMBER_MAXIMUM_EXCLUSIVE, {value: data, maximum: schema.maximum}, \'\', \'/exclusiveMaximum\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateNaN = function validateNaN(data, schema) {\r\n\tif (typeof data !== "number") {\r\n\t\treturn null;\r\n\t}\r\n\tif (isNaN(data) === true || data === Infinity || data === -Infinity) {\r\n\t\treturn this.createError(ErrorCodes.NUMBER_NOT_A_NUMBER, {value: data}, \'\', \'/type\', null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateString = function validateString(data, schema, dataPointerPath) {\r\n\treturn this.validateStringLength(data, schema, dataPointerPath)\r\n\t\t|| this.validateStringPattern(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateStringLength = function validateStringLength(data, schema) {\r\n\tif (typeof data !== "string") {\r\n\t\treturn null;\r\n\t}\r\n\tif (schema.minLength !== undefined) {\r\n\t\tif (data.length < schema.minLength) {\r\n\t\t\treturn this.createError(ErrorCodes.STRING_LENGTH_SHORT, {length: data.length, minimum: schema.minLength}, \'\', \'/minLength\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\tif (schema.maxLength !== undefined) {\r\n\t\tif (data.length > schema.maxLength) {\r\n\t\t\treturn this.createError(ErrorCodes.STRING_LENGTH_LONG, {length: data.length, maximum: schema.maxLength}, \'\', \'/maxLength\', null, data, schema);\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateStringPattern = function validateStringPattern(data, schema) {\r\n\tif (typeof data !== "string" || (typeof schema.pattern !== "string" && !(schema.pattern instanceof RegExp))) {\r\n\t\treturn null;\r\n\t}\r\n\tvar regexp;\r\n\tif (schema.pattern instanceof RegExp) {\r\n\t regexp = schema.pattern;\r\n\t}\r\n\telse {\r\n\t var body, flags = \'\';\r\n\t // Check for regular expression literals\r\n\t // @see http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.5\r\n\t var literal = schema.pattern.match(/^\\/(.+)\\/([img]*)$/);\r\n\t if (literal) {\r\n\t body = literal[1];\r\n\t flags = literal[2];\r\n\t }\r\n\t else {\r\n\t body = schema.pattern;\r\n\t }\r\n\t regexp = new RegExp(body, flags);\r\n\t}\r\n\tif (!regexp.test(data)) {\r\n\t\treturn this.createError(ErrorCodes.STRING_PATTERN, {pattern: schema.pattern}, \'\', \'/pattern\', null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArray = function validateArray(data, schema, dataPointerPath) {\r\n\tif (!Array.isArray(data)) {\r\n\t\treturn null;\r\n\t}\r\n\treturn this.validateArrayLength(data, schema, dataPointerPath)\r\n\t\t|| this.validateArrayUniqueItems(data, schema, dataPointerPath)\r\n\t\t|| this.validateArrayItems(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayLength = function validateArrayLength(data, schema) {\r\n\tvar error;\r\n\tif (schema.minItems !== undefined) {\r\n\t\tif (data.length < schema.minItems) {\r\n\t\t\terror = this.createError(ErrorCodes.ARRAY_LENGTH_SHORT, {length: data.length, minimum: schema.minItems}, \'\', \'/minItems\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (schema.maxItems !== undefined) {\r\n\t\tif (data.length > schema.maxItems) {\r\n\t\t\terror = this.createError(ErrorCodes.ARRAY_LENGTH_LONG, {length: data.length, maximum: schema.maxItems}, \'\', \'/maxItems\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayUniqueItems = function validateArrayUniqueItems(data, schema) {\r\n\tif (schema.uniqueItems) {\r\n\t\tfor (var i = 0; i < data.length; i++) {\r\n\t\t\tfor (var j = i + 1; j < data.length; j++) {\r\n\t\t\t\tif (recursiveCompare(data[i], data[j])) {\r\n\t\t\t\t\tvar error = this.createError(ErrorCodes.ARRAY_UNIQUE, {match1: i, match2: j}, \'\', \'/uniqueItems\', null, data, schema);\r\n\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateArrayItems = function validateArrayItems(data, schema, dataPointerPath) {\r\n\tif (schema.items === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error, i;\r\n\tif (Array.isArray(schema.items)) {\r\n\t\tfor (i = 0; i < data.length; i++) {\r\n\t\t\tif (i < schema.items.length) {\r\n\t\t\t\tif (error = this.validateAll(data[i], schema.items[i], [i], ["items", i], dataPointerPath + "/" + i)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t} else if (schema.additionalItems !== undefined) {\r\n\t\t\t\tif (typeof schema.additionalItems === "boolean") {\r\n\t\t\t\t\tif (!schema.additionalItems) {\r\n\t\t\t\t\t\terror = (this.createError(ErrorCodes.ARRAY_ADDITIONAL_ITEMS, {}, \'/\' + i, \'/additionalItems\', null, data, schema));\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (error = this.validateAll(data[i], schema.additionalItems, [i], ["additionalItems"], dataPointerPath + "/" + i)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t} else {\r\n\t\tfor (i = 0; i < data.length; i++) {\r\n\t\t\tif (error = this.validateAll(data[i], schema.items, [i], ["items"], dataPointerPath + "/" + i)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObject = function validateObject(data, schema, dataPointerPath) {\r\n\tif (typeof data !== "object" || data === null || Array.isArray(data)) {\r\n\t\treturn null;\r\n\t}\r\n\treturn this.validateObjectMinMaxProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectRequiredProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectProperties(data, schema, dataPointerPath)\r\n\t\t|| this.validateObjectDependencies(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectMinMaxProperties = function validateObjectMinMaxProperties(data, schema) {\r\n\tvar keys = Object.keys(data);\r\n\tvar error;\r\n\tif (schema.minProperties !== undefined) {\r\n\t\tif (keys.length < schema.minProperties) {\r\n\t\t\terror = this.createError(ErrorCodes.OBJECT_PROPERTIES_MINIMUM, {propertyCount: keys.length, minimum: schema.minProperties}, \'\', \'/minProperties\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (schema.maxProperties !== undefined) {\r\n\t\tif (keys.length > schema.maxProperties) {\r\n\t\t\terror = this.createError(ErrorCodes.OBJECT_PROPERTIES_MAXIMUM, {propertyCount: keys.length, maximum: schema.maxProperties}, \'\', \'/maxProperties\', null, data, schema);\r\n\t\t\tif (this.handleError(error)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectRequiredProperties = function validateObjectRequiredProperties(data, schema) {\r\n\tif (schema.required !== undefined) {\r\n\t\tfor (var i = 0; i < schema.required.length; i++) {\r\n\t\t\tvar key = schema.required[i];\r\n\t\t\tif (data[key] === undefined) {\r\n\t\t\t\tvar error = this.createError(ErrorCodes.OBJECT_REQUIRED, {key: key}, \'\', \'/required/\' + i, null, data, schema);\r\n\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectProperties = function validateObjectProperties(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tfor (var key in data) {\r\n\t\tvar keyPointerPath = dataPointerPath + "/" + key.replace(/~/g, \'~0\').replace(/\\//g, \'~1\');\r\n\t\tvar foundMatch = false;\r\n\t\tif (schema.properties !== undefined && schema.properties[key] !== undefined) {\r\n\t\t\tfoundMatch = true;\r\n\t\t\tif (error = this.validateAll(data[key], schema.properties[key], [key], ["properties", key], keyPointerPath)) {\r\n\t\t\t\treturn error;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (schema.patternProperties !== undefined) {\r\n\t\t\tfor (var patternKey in schema.patternProperties) {\r\n\t\t\t\tvar regexp = new RegExp(patternKey);\r\n\t\t\t\tif (regexp.test(key)) {\r\n\t\t\t\t\tfoundMatch = true;\r\n\t\t\t\t\tif (error = this.validateAll(data[key], schema.patternProperties[patternKey], [key], ["patternProperties", patternKey], keyPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!foundMatch) {\r\n\t\t\tif (schema.additionalProperties !== undefined) {\r\n\t\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\t\tthis.knownPropertyPaths[keyPointerPath] = true;\r\n\t\t\t\t\tdelete this.unknownPropertyPaths[keyPointerPath];\r\n\t\t\t\t}\r\n\t\t\t\tif (typeof schema.additionalProperties === "boolean") {\r\n\t\t\t\t\tif (!schema.additionalProperties) {\r\n\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_ADDITIONAL_PROPERTIES, {key: key}, \'\', \'/additionalProperties\', null, data, schema).prefixWith(key, null);\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (error = this.validateAll(data[key], schema.additionalProperties, [key], ["additionalProperties"], keyPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (this.trackUnknownProperties && !this.knownPropertyPaths[keyPointerPath]) {\r\n\t\t\t\tthis.unknownPropertyPaths[keyPointerPath] = true;\r\n\t\t\t}\r\n\t\t} else if (this.trackUnknownProperties) {\r\n\t\t\tthis.knownPropertyPaths[keyPointerPath] = true;\r\n\t\t\tdelete this.unknownPropertyPaths[keyPointerPath];\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateObjectDependencies = function validateObjectDependencies(data, schema, dataPointerPath) {\r\n\tvar error;\r\n\tif (schema.dependencies !== undefined) {\r\n\t\tfor (var depKey in schema.dependencies) {\r\n\t\t\tif (data[depKey] !== undefined) {\r\n\t\t\t\tvar dep = schema.dependencies[depKey];\r\n\t\t\t\tif (typeof dep === "string") {\r\n\t\t\t\t\tif (data[dep] === undefined) {\r\n\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_DEPENDENCY_KEY, {key: depKey, missing: dep}, \'\', \'\', null, data, schema).prefixWith(null, depKey).prefixWith(null, "dependencies");\r\n\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (Array.isArray(dep)) {\r\n\t\t\t\t\tfor (var i = 0; i < dep.length; i++) {\r\n\t\t\t\t\t\tvar requiredKey = dep[i];\r\n\t\t\t\t\t\tif (data[requiredKey] === undefined) {\r\n\t\t\t\t\t\t\terror = this.createError(ErrorCodes.OBJECT_DEPENDENCY_KEY, {key: depKey, missing: requiredKey}, \'\', \'/\' + i, null, data, schema).prefixWith(null, depKey).prefixWith(null, "dependencies");\r\n\t\t\t\t\t\t\tif (this.handleError(error)) {\r\n\t\t\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (error = this.validateAll(data, dep, [], ["dependencies", depKey], dataPointerPath)) {\r\n\t\t\t\t\t\treturn error;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateCombinations = function validateCombinations(data, schema, dataPointerPath) {\r\n\treturn this.validateAllOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateAnyOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateOneOf(data, schema, dataPointerPath)\r\n\t\t|| this.validateNot(data, schema, dataPointerPath)\r\n\t\t|| null;\r\n};\r\n\r\nValidatorContext.prototype.validateAllOf = function validateAllOf(data, schema, dataPointerPath) {\r\n\tif (schema.allOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error;\r\n\tfor (var i = 0; i < schema.allOf.length; i++) {\r\n\t\tvar subSchema = schema.allOf[i];\r\n\t\tif (error = this.validateAll(data, subSchema, [], ["allOf", i], dataPointerPath)) {\r\n\t\t\treturn error;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateAnyOf = function validateAnyOf(data, schema, dataPointerPath) {\r\n\tif (schema.anyOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar errors = [];\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t}\r\n\tvar errorAtEnd = true;\r\n\tfor (var i = 0; i < schema.anyOf.length; i++) {\r\n\t\tif (this.trackUnknownProperties) {\r\n\t\t\tthis.unknownPropertyPaths = {};\r\n\t\t\tthis.knownPropertyPaths = {};\r\n\t\t}\r\n\t\tvar subSchema = schema.anyOf[i];\r\n\r\n\t\tvar errorCount = this.errors.length;\r\n\t\tvar error = this.validateAll(data, subSchema, [], ["anyOf", i], dataPointerPath);\r\n\r\n\t\tif (error === null && errorCount === this.errors.length) {\r\n\t\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\r\n\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\tfor (var knownKey in this.knownPropertyPaths) {\r\n\t\t\t\t\toldKnownPropertyPaths[knownKey] = true;\r\n\t\t\t\t\tdelete oldUnknownPropertyPaths[knownKey];\r\n\t\t\t\t}\r\n\t\t\t\tfor (var unknownKey in this.unknownPropertyPaths) {\r\n\t\t\t\t\tif (!oldKnownPropertyPaths[unknownKey]) {\r\n\t\t\t\t\t\toldUnknownPropertyPaths[unknownKey] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// We need to continue looping so we catch all the property definitions, but we don\'t want to return an error\r\n\t\t\t\terrorAtEnd = false;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tif (error) {\r\n\t\t\terrors.push(error.prefixWith(null, "" + i).prefixWith(null, "anyOf"));\r\n\t\t}\r\n\t}\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (errorAtEnd) {\r\n\t\terrors = errors.concat(this.errors.slice(startErrorCount));\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\treturn this.createError(ErrorCodes.ANY_OF_MISSING, {}, "", "/anyOf", errors, data, schema);\r\n\t}\r\n};\r\n\r\nValidatorContext.prototype.validateOneOf = function validateOneOf(data, schema, dataPointerPath) {\r\n\tif (schema.oneOf === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar validIndex = null;\r\n\tvar errors = [];\r\n\tvar startErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t}\r\n\tfor (var i = 0; i < schema.oneOf.length; i++) {\r\n\t\tif (this.trackUnknownProperties) {\r\n\t\t\tthis.unknownPropertyPaths = {};\r\n\t\t\tthis.knownPropertyPaths = {};\r\n\t\t}\r\n\t\tvar subSchema = schema.oneOf[i];\r\n\r\n\t\tvar errorCount = this.errors.length;\r\n\t\tvar error = this.validateAll(data, subSchema, [], ["oneOf", i], dataPointerPath);\r\n\r\n\t\tif (error === null && errorCount === this.errors.length) {\r\n\t\t\tif (validIndex === null) {\r\n\t\t\t\tvalidIndex = i;\r\n\t\t\t} else {\r\n\t\t\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\t\t\treturn this.createError(ErrorCodes.ONE_OF_MULTIPLE, {index1: validIndex, index2: i}, "", "/oneOf", null, data, schema);\r\n\t\t\t}\r\n\t\t\tif (this.trackUnknownProperties) {\r\n\t\t\t\tfor (var knownKey in this.knownPropertyPaths) {\r\n\t\t\t\t\toldKnownPropertyPaths[knownKey] = true;\r\n\t\t\t\t\tdelete oldUnknownPropertyPaths[knownKey];\r\n\t\t\t\t}\r\n\t\t\t\tfor (var unknownKey in this.unknownPropertyPaths) {\r\n\t\t\t\t\tif (!oldKnownPropertyPaths[unknownKey]) {\r\n\t\t\t\t\t\toldUnknownPropertyPaths[unknownKey] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (error) {\r\n\t\t\terrors.push(error);\r\n\t\t}\r\n\t}\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (validIndex === null) {\r\n\t\terrors = errors.concat(this.errors.slice(startErrorCount));\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t\treturn this.createError(ErrorCodes.ONE_OF_MISSING, {}, "", "/oneOf", errors, data, schema);\r\n\t} else {\r\n\t\tthis.errors = this.errors.slice(0, startErrorCount);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateNot = function validateNot(data, schema, dataPointerPath) {\r\n\tif (schema.not === undefined) {\r\n\t\treturn null;\r\n\t}\r\n\tvar oldErrorCount = this.errors.length;\r\n\tvar oldUnknownPropertyPaths, oldKnownPropertyPaths;\r\n\tif (this.trackUnknownProperties) {\r\n\t\toldUnknownPropertyPaths = this.unknownPropertyPaths;\r\n\t\toldKnownPropertyPaths = this.knownPropertyPaths;\r\n\t\tthis.unknownPropertyPaths = {};\r\n\t\tthis.knownPropertyPaths = {};\r\n\t}\r\n\tvar error = this.validateAll(data, schema.not, null, null, dataPointerPath);\r\n\tvar notErrors = this.errors.slice(oldErrorCount);\r\n\tthis.errors = this.errors.slice(0, oldErrorCount);\r\n\tif (this.trackUnknownProperties) {\r\n\t\tthis.unknownPropertyPaths = oldUnknownPropertyPaths;\r\n\t\tthis.knownPropertyPaths = oldKnownPropertyPaths;\r\n\t}\r\n\tif (error === null && notErrors.length === 0) {\r\n\t\treturn this.createError(ErrorCodes.NOT_PASSED, {}, "", "/not", null, data, schema);\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nValidatorContext.prototype.validateHypermedia = function validateCombinations(data, schema, dataPointerPath) {\r\n\tif (!schema.links) {\r\n\t\treturn null;\r\n\t}\r\n\tvar error;\r\n\tfor (var i = 0; i < schema.links.length; i++) {\r\n\t\tvar ldo = schema.links[i];\r\n\t\tif (ldo.rel === "describedby") {\r\n\t\t\tvar template = new UriTemplate(ldo.href);\r\n\t\t\tvar allPresent = true;\r\n\t\t\tfor (var j = 0; j < template.varNames.length; j++) {\r\n\t\t\t\tif (!(template.varNames[j] in data)) {\r\n\t\t\t\t\tallPresent = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (allPresent) {\r\n\t\t\t\tvar schemaUrl = template.fillFromObject(data);\r\n\t\t\t\tvar subSchema = {"$ref": schemaUrl};\r\n\t\t\t\tif (error = this.validateAll(data, subSchema, [], ["links", i], dataPointerPath)) {\r\n\t\t\t\t\treturn error;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// parseURI() and resolveUrl() are from https://gist.github.com/1088850\r\n// - released as public domain by author ("Yaffle") - see comments on gist\r\n\r\nfunction parseURI(url) {\r\n\tvar m = String(url).replace(/^\\s+|\\s+$/g, \'\').match(/^([^:\\/?#]+:)?(\\/\\/(?:[^:@]*(?::[^:@]*)?@)?(([^:\\/?#]*)(?::(\\d*))?))?([^?#]*)(\\?[^#]*)?(#[\\s\\S]*)?/);\r\n\t// authority = \'//\' + user + \':\' + pass \'@\' + hostname + \':\' port\r\n\treturn (m ? {\r\n\t\thref : m[0] || \'\',\r\n\t\tprotocol : m[1] || \'\',\r\n\t\tauthority: m[2] || \'\',\r\n\t\thost : m[3] || \'\',\r\n\t\thostname : m[4] || \'\',\r\n\t\tport : m[5] || \'\',\r\n\t\tpathname : m[6] || \'\',\r\n\t\tsearch : m[7] || \'\',\r\n\t\thash : m[8] || \'\'\r\n\t} : null);\r\n}\r\n\r\nfunction resolveUrl(base, href) {// RFC 3986\r\n\r\n\tfunction removeDotSegments(input) {\r\n\t\tvar output = [];\r\n\t\tinput.replace(/^(\\.\\.?(\\/|$))+/, \'\')\r\n\t\t\t.replace(/\\/(\\.(\\/|$))+/g, \'/\')\r\n\t\t\t.replace(/\\/\\.\\.$/, \'/../\')\r\n\t\t\t.replace(/\\/?[^\\/]*/g, function (p) {\r\n\t\t\t\tif (p === \'/..\') {\r\n\t\t\t\t\toutput.pop();\r\n\t\t\t\t} else {\r\n\t\t\t\t\toutput.push(p);\r\n\t\t\t\t}\r\n\t\t});\r\n\t\treturn output.join(\'\').replace(/^\\//, input.charAt(0) === \'/\' ? \'/\' : \'\');\r\n\t}\r\n\r\n\thref = parseURI(href || \'\');\r\n\tbase = parseURI(base || \'\');\r\n\r\n\treturn !href || !base ? null : (href.protocol || base.protocol) +\r\n\t\t(href.protocol || href.authority ? href.authority : base.authority) +\r\n\t\tremoveDotSegments(href.protocol || href.authority || href.pathname.charAt(0) === \'/\' ? href.pathname : (href.pathname ? ((base.authority && !base.pathname ? \'/\' : \'\') + base.pathname.slice(0, base.pathname.lastIndexOf(\'/\') + 1) + href.pathname) : base.pathname)) +\r\n\t\t(href.protocol || href.authority || href.pathname ? href.search : (href.search || base.search)) +\r\n\t\thref.hash;\r\n}\r\n\r\nfunction getDocumentUri(uri) {\r\n\treturn uri.split(\'#\')[0];\r\n}\r\nfunction normSchema(schema, baseUri) {\r\n\tif (schema && typeof schema === "object") {\r\n\t\tif (baseUri === undefined) {\r\n\t\t\tbaseUri = schema.id;\r\n\t\t} else if (typeof schema.id === "string") {\r\n\t\t\tbaseUri = resolveUrl(baseUri, schema.id);\r\n\t\t\tschema.id = baseUri;\r\n\t\t}\r\n\t\tif (Array.isArray(schema)) {\r\n\t\t\tfor (var i = 0; i < schema.length; i++) {\r\n\t\t\t\tnormSchema(schema[i], baseUri);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (typeof schema[\'$ref\'] === "string") {\r\n\t\t\t\tschema[\'$ref\'] = resolveUrl(baseUri, schema[\'$ref\']);\r\n\t\t\t}\r\n\t\t\tfor (var key in schema) {\r\n\t\t\t\tif (key !== "enum") {\r\n\t\t\t\t\tnormSchema(schema[key], baseUri);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction defaultErrorReporter(language) {\r\n\tlanguage = language || \'en\';\r\n\r\n\tvar errorMessages = languages[language];\r\n\r\n\treturn function (error) {\r\n\t\tvar messageTemplate = errorMessages[error.code] || ErrorMessagesDefault[error.code];\r\n\t\tif (typeof messageTemplate !== \'string\') {\r\n\t\t\treturn "Unknown error code " + error.code + ": " + JSON.stringify(error.messageParams);\r\n\t\t}\r\n\t\tvar messageParams = error.params;\r\n\t\t// Adapted from Crockford\'s supplant()\r\n\t\treturn messageTemplate.replace(/\\{([^{}]*)\\}/g, function (whole, varName) {\r\n\t\t\tvar subValue = messageParams[varName];\r\n\t\t\treturn typeof subValue === \'string\' || typeof subValue === \'number\' ? subValue : whole;\r\n\t\t});\r\n\t};\r\n}\r\n\r\nvar ErrorCodes = {\r\n\tINVALID_TYPE: 0,\r\n\tENUM_MISMATCH: 1,\r\n\tANY_OF_MISSING: 10,\r\n\tONE_OF_MISSING: 11,\r\n\tONE_OF_MULTIPLE: 12,\r\n\tNOT_PASSED: 13,\r\n\t// Numeric errors\r\n\tNUMBER_MULTIPLE_OF: 100,\r\n\tNUMBER_MINIMUM: 101,\r\n\tNUMBER_MINIMUM_EXCLUSIVE: 102,\r\n\tNUMBER_MAXIMUM: 103,\r\n\tNUMBER_MAXIMUM_EXCLUSIVE: 104,\r\n\tNUMBER_NOT_A_NUMBER: 105,\r\n\t// String errors\r\n\tSTRING_LENGTH_SHORT: 200,\r\n\tSTRING_LENGTH_LONG: 201,\r\n\tSTRING_PATTERN: 202,\r\n\t// Object errors\r\n\tOBJECT_PROPERTIES_MINIMUM: 300,\r\n\tOBJECT_PROPERTIES_MAXIMUM: 301,\r\n\tOBJECT_REQUIRED: 302,\r\n\tOBJECT_ADDITIONAL_PROPERTIES: 303,\r\n\tOBJECT_DEPENDENCY_KEY: 304,\r\n\t// Array errors\r\n\tARRAY_LENGTH_SHORT: 400,\r\n\tARRAY_LENGTH_LONG: 401,\r\n\tARRAY_UNIQUE: 402,\r\n\tARRAY_ADDITIONAL_ITEMS: 403,\r\n\t// Custom/user-defined errors\r\n\tFORMAT_CUSTOM: 500,\r\n\tKEYWORD_CUSTOM: 501,\r\n\t// Schema structure\r\n\tCIRCULAR_REFERENCE: 600,\r\n\t// Non-standard validation options\r\n\tUNKNOWN_PROPERTY: 1000\r\n};\r\nvar ErrorCodeLookup = {};\r\nfor (var key in ErrorCodes) {\r\n\tErrorCodeLookup[ErrorCodes[key]] = key;\r\n}\r\nvar ErrorMessagesDefault = {\r\n\tINVALID_TYPE: "Invalid type: {type} (expected {expected})",\r\n\tENUM_MISMATCH: "No enum match for: {value}",\r\n\tANY_OF_MISSING: "Data does not match any schemas from \\"anyOf\\"",\r\n\tONE_OF_MISSING: "Data does not match any schemas from \\"oneOf\\"",\r\n\tONE_OF_MULTIPLE: "Data is valid against more than one schema from \\"oneOf\\": indices {index1} and {index2}",\r\n\tNOT_PASSED: "Data matches schema from \\"not\\"",\r\n\t// Numeric errors\r\n\tNUMBER_MULTIPLE_OF: "Value {value} is not a multiple of {multipleOf}",\r\n\tNUMBER_MINIMUM: "Value {value} is less than minimum {minimum}",\r\n\tNUMBER_MINIMUM_EXCLUSIVE: "Value {value} is equal to exclusive minimum {minimum}",\r\n\tNUMBER_MAXIMUM: "Value {value} is greater than maximum {maximum}",\r\n\tNUMBER_MAXIMUM_EXCLUSIVE: "Value {value} is equal to exclusive maximum {maximum}",\r\n\tNUMBER_NOT_A_NUMBER: "Value {value} is not a valid number",\r\n\t// String errors\r\n\tSTRING_LENGTH_SHORT: "String is too short ({length} chars), minimum {minimum}",\r\n\tSTRING_LENGTH_LONG: "String is too long ({length} chars), maximum {maximum}",\r\n\tSTRING_PATTERN: "String does not match pattern: {pattern}",\r\n\t// Object errors\r\n\tOBJECT_PROPERTIES_MINIMUM: "Too few properties defined ({propertyCount}), minimum {minimum}",\r\n\tOBJECT_PROPERTIES_MAXIMUM: "Too many properties defined ({propertyCount}), maximum {maximum}",\r\n\tOBJECT_REQUIRED: "Missing required property: {key}",\r\n\tOBJECT_ADDITIONAL_PROPERTIES: "Additional properties not allowed",\r\n\tOBJECT_DEPENDENCY_KEY: "Dependency failed - key must exist: {missing} (due to key: {key})",\r\n\t// Array errors\r\n\tARRAY_LENGTH_SHORT: "Array is too short ({length}), minimum {minimum}",\r\n\tARRAY_LENGTH_LONG: "Array is too long ({length}), maximum {maximum}",\r\n\tARRAY_UNIQUE: "Array items are not unique (indices {match1} and {match2})",\r\n\tARRAY_ADDITIONAL_ITEMS: "Additional items not allowed",\r\n\t// Format errors\r\n\tFORMAT_CUSTOM: "Format validation failed ({message})",\r\n\tKEYWORD_CUSTOM: "Keyword failed: {key} ({message})",\r\n\t// Schema structure\r\n\tCIRCULAR_REFERENCE: "Circular $refs: {urls}",\r\n\t// Non-standard validation options\r\n\tUNKNOWN_PROPERTY: "Unknown property (not in schema)"\r\n};\r\n\r\nfunction ValidationError(code, params, dataPath, schemaPath, subErrors) {\r\n\tError.call(this);\r\n\tif (code === undefined) {\r\n\t\tthrow new Error ("No error code supplied: " + schemaPath);\r\n\t}\r\n\tthis.message = \'\';\r\n\tthis.params = params;\r\n\tthis.code = code;\r\n\tthis.dataPath = dataPath || "";\r\n\tthis.schemaPath = schemaPath || "";\r\n\tthis.subErrors = subErrors || null;\r\n\r\n\tvar err = new Error(this.message);\r\n\tthis.stack = err.stack || err.stacktrace;\r\n\tif (!this.stack) {\r\n\t\ttry {\r\n\t\t\tthrow err;\r\n\t\t}\r\n\t\tcatch(err) {\r\n\t\t\tthis.stack = err.stack || err.stacktrace;\r\n\t\t}\r\n\t}\r\n}\r\nValidationError.prototype = Object.create(Error.prototype);\r\nValidationError.prototype.constructor = ValidationError;\r\nValidationError.prototype.name = \'ValidationError\';\r\n\r\nValidationError.prototype.prefixWith = function (dataPrefix, schemaPrefix) {\r\n\tif (dataPrefix !== null) {\r\n\t\tdataPrefix = dataPrefix.replace(/~/g, "~0").replace(/\\//g, "~1");\r\n\t\tthis.dataPath = "/" + dataPrefix + this.dataPath;\r\n\t}\r\n\tif (schemaPrefix !== null) {\r\n\t\tschemaPrefix = schemaPrefix.replace(/~/g, "~0").replace(/\\//g, "~1");\r\n\t\tthis.schemaPath = "/" + schemaPrefix + this.schemaPath;\r\n\t}\r\n\tif (this.subErrors !== null) {\r\n\t\tfor (var i = 0; i < this.subErrors.length; i++) {\r\n\t\t\tthis.subErrors[i].prefixWith(dataPrefix, schemaPrefix);\r\n\t\t}\r\n\t}\r\n\treturn this;\r\n};\r\n\r\nfunction isTrustedUrl(baseUrl, testUrl) {\r\n\tif(testUrl.substring(0, baseUrl.length) === baseUrl){\r\n\t\tvar remainder = testUrl.substring(baseUrl.length);\r\n\t\tif ((testUrl.length > 0 && testUrl.charAt(baseUrl.length - 1) === "/")\r\n\t\t\t|| remainder.charAt(0) === "#"\r\n\t\t\t|| remainder.charAt(0) === "?") {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nvar languages = {};\r\nfunction createApi(language) {\r\n\tvar globalContext = new ValidatorContext();\r\n\tvar currentLanguage;\r\n\tvar customErrorReporter;\r\n\tvar api = {\r\n\t\tsetErrorReporter: function (reporter) {\r\n\t\t\tif (typeof reporter === \'string\') {\r\n\t\t\t\treturn this.language(reporter);\r\n\t\t\t}\r\n\t\t\tcustomErrorReporter = reporter;\r\n\t\t\treturn true;\r\n\t\t},\r\n\t\taddFormat: function () {\r\n\t\t\tglobalContext.addFormat.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tlanguage: function (code) {\r\n\t\t\tif (!code) {\r\n\t\t\t\treturn currentLanguage;\r\n\t\t\t}\r\n\t\t\tif (!languages[code]) {\r\n\t\t\t\tcode = code.split(\'-\')[0]; // fall back to base language\r\n\t\t\t}\r\n\t\t\tif (languages[code]) {\r\n\t\t\t\tcurrentLanguage = code;\r\n\t\t\t\treturn code; // so you can tell if fall-back has happened\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t},\r\n\t\taddLanguage: function (code, messageMap) {\r\n\t\t\tvar key;\r\n\t\t\tfor (key in ErrorCodes) {\r\n\t\t\t\tif (messageMap[key] && !messageMap[ErrorCodes[key]]) {\r\n\t\t\t\t\tmessageMap[ErrorCodes[key]] = messageMap[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar rootCode = code.split(\'-\')[0];\r\n\t\t\tif (!languages[rootCode]) { // use for base language if not yet defined\r\n\t\t\t\tlanguages[code] = messageMap;\r\n\t\t\t\tlanguages[rootCode] = messageMap;\r\n\t\t\t} else {\r\n\t\t\t\tlanguages[code] = Object.create(languages[rootCode]);\r\n\t\t\t\tfor (key in messageMap) {\r\n\t\t\t\t\tif (typeof languages[rootCode][key] === \'undefined\') {\r\n\t\t\t\t\t\tlanguages[rootCode][key] = messageMap[key];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlanguages[code][key] = messageMap[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t},\r\n\t\tfreshApi: function (language) {\r\n\t\t\tvar result = createApi();\r\n\t\t\tif (language) {\r\n\t\t\t\tresult.language(language);\r\n\t\t\t}\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\tvalidate: function (data, schema, checkRecursive, banUnknownProperties) {\r\n\t\t\tvar def = defaultErrorReporter(currentLanguage);\r\n\t\t\tvar errorReporter = customErrorReporter ? function (error, data, schema) {\r\n\t\t\t\treturn customErrorReporter(error, data, schema) || def(error, data, schema);\r\n\t\t\t} : def;\r\n\t\t\tvar context = new ValidatorContext(globalContext, false, errorReporter, checkRecursive, banUnknownProperties);\r\n\t\t\tif (typeof schema === "string") {\r\n\t\t\t\tschema = {"$ref": schema};\r\n\t\t\t}\r\n\t\t\tcontext.addSchema("", schema);\r\n\t\t\tvar error = context.validateAll(data, schema, null, null, "");\r\n\t\t\tif (!error && banUnknownProperties) {\r\n\t\t\t\terror = context.banUnknownProperties(data, schema);\r\n\t\t\t}\r\n\t\t\tthis.error = error;\r\n\t\t\tthis.missing = context.missing;\r\n\t\t\tthis.valid = (error === null);\r\n\t\t\treturn this.valid;\r\n\t\t},\r\n\t\tvalidateResult: function () {\r\n\t\t\tvar result = {toString: function () {\r\n\t\t\t\treturn this.valid ? \'valid\' : this.error.message;\r\n\t\t\t}};\r\n\t\t\tthis.validate.apply(result, arguments);\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\tvalidateMultiple: function (data, schema, checkRecursive, banUnknownProperties) {\r\n\t\t\tvar def = defaultErrorReporter(currentLanguage);\r\n\t\t\tvar errorReporter = customErrorReporter ? function (error, data, schema) {\r\n\t\t\t\treturn customErrorReporter(error, data, schema) || def(error, data, schema);\r\n\t\t\t} : def;\r\n\t\t\tvar context = new ValidatorContext(globalContext, true, errorReporter, checkRecursive, banUnknownProperties);\r\n\t\t\tif (typeof schema === "string") {\r\n\t\t\t\tschema = {"$ref": schema};\r\n\t\t\t}\r\n\t\t\tcontext.addSchema("", schema);\r\n\t\t\tcontext.validateAll(data, schema, null, null, "");\r\n\t\t\tif (banUnknownProperties) {\r\n\t\t\t\tcontext.banUnknownProperties(data, schema);\r\n\t\t\t}\r\n\t\t\tvar result = {toString: function () {\r\n\t\t\t\treturn this.valid ? \'valid\' : this.error.message;\r\n\t\t\t}};\r\n\t\t\tresult.errors = context.errors;\r\n\t\t\tresult.missing = context.missing;\r\n\t\t\tresult.valid = (result.errors.length === 0);\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\taddSchema: function () {\r\n\t\t\treturn globalContext.addSchema.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchema: function () {\r\n\t\t\treturn globalContext.getSchema.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchemaMap: function () {\r\n\t\t\treturn globalContext.getSchemaMap.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetSchemaUris: function () {\r\n\t\t\treturn globalContext.getSchemaUris.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tgetMissingUris: function () {\r\n\t\t\treturn globalContext.getMissingUris.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdropSchemas: function () {\r\n\t\t\tglobalContext.dropSchemas.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdefineKeyword: function () {\r\n\t\t\tglobalContext.defineKeyword.apply(globalContext, arguments);\r\n\t\t},\r\n\t\tdefineError: function (codeName, codeNumber, defaultMessage) {\r\n\t\t\tif (typeof codeName !== \'string\' || !/^[A-Z]+(_[A-Z]+)*$/.test(codeName)) {\r\n\t\t\t\tthrow new Error(\'Code name must be a string in UPPER_CASE_WITH_UNDERSCORES\');\r\n\t\t\t}\r\n\t\t\tif (typeof codeNumber !== \'number\' || codeNumber%1 !== 0 || codeNumber < 10000) {\r\n\t\t\t\tthrow new Error(\'Code number must be an integer > 10000\');\r\n\t\t\t}\r\n\t\t\tif (typeof ErrorCodes[codeName] !== \'undefined\') {\r\n\t\t\t\tthrow new Error(\'Error already defined: \' + codeName + \' as \' + ErrorCodes[codeName]);\r\n\t\t\t}\r\n\t\t\tif (typeof ErrorCodeLookup[codeNumber] !== \'undefined\') {\r\n\t\t\t\tthrow new Error(\'Error code already used: \' + ErrorCodeLookup[codeNumber] + \' as \' + codeNumber);\r\n\t\t\t}\r\n\t\t\tErrorCodes[codeName] = codeNumber;\r\n\t\t\tErrorCodeLookup[codeNumber] = codeName;\r\n\t\t\tErrorMessagesDefault[codeName] = ErrorMessagesDefault[codeNumber] = defaultMessage;\r\n\t\t\tfor (var langCode in languages) {\r\n\t\t\t\tvar language = languages[langCode];\r\n\t\t\t\tif (language[codeName]) {\r\n\t\t\t\t\tlanguage[codeNumber] = language[codeNumber] || language[codeName];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\treset: function () {\r\n\t\t\tglobalContext.reset();\r\n\t\t\tthis.error = null;\r\n\t\t\tthis.missing = [];\r\n\t\t\tthis.valid = true;\r\n\t\t},\r\n\t\tmissing: [],\r\n\t\terror: null,\r\n\t\tvalid: true,\r\n\t\tnormSchema: normSchema,\r\n\t\tresolveUrl: resolveUrl,\r\n\t\tgetDocumentUri: getDocumentUri,\r\n\t\terrorCodes: ErrorCodes\r\n\t};\r\n\tapi.language(language || \'en\');\r\n\treturn api;\r\n}\r\n\r\nvar tv4 = createApi();\r\ntv4.addLanguage(\'en-gb\', ErrorMessagesDefault);\r\n\r\n//legacy property\r\ntv4.tv4 = tv4;\r\n\r\nreturn tv4; // used by _header.js to globalise.\r\n\r\n}));//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTguanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvdHY0L3R2NC5qcz84ZTUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbkF1dGhvcjogR2VyYWludCBMdWZmIGFuZCBvdGhlcnNcclxuWWVhcjogMjAxM1xyXG5cclxuVGhpcyBjb2RlIGlzIHJlbGVhc2VkIGludG8gdGhlIFwicHVibGljIGRvbWFpblwiIGJ5IGl0cyBhdXRob3IocykuICBBbnlib2R5IG1heSB1c2UsIGFsdGVyIGFuZCBkaXN0cmlidXRlIHRoZSBjb2RlIHdpdGhvdXQgcmVzdHJpY3Rpb24uICBUaGUgYXV0aG9yIG1ha2VzIG5vIGd1YXJhbnRlZXMsIGFuZCB0YWtlcyBubyBsaWFiaWxpdHkgb2YgYW55IGtpbmQgZm9yIHVzZSBvZiB0aGlzIGNvZGUuXHJcblxyXG5JZiB5b3UgZmluZCBhIGJ1ZyBvciBtYWtlIGFuIGltcHJvdmVtZW50LCBpdCB3b3VsZCBiZSBjb3VydGVvdXMgdG8gbGV0IHRoZSBhdXRob3Iga25vdywgYnV0IGl0IGlzIG5vdCBjb21wdWxzb3J5LlxyXG4qL1xyXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xyXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcclxuICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS5cclxuICAgIGRlZmluZShbXSwgZmFjdG9yeSk7XHJcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cyl7XHJcbiAgICAvLyBDb21tb25KUy4gRGVmaW5lIGV4cG9ydC5cclxuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICAvLyBCcm93c2VyIGdsb2JhbHNcclxuICAgIGdsb2JhbC50djQgPSBmYWN0b3J5KCk7XHJcbiAgfVxyXG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcclxuXHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9rZXlzP3JlZGlyZWN0bG9jYWxlPWVuLVVTJnJlZGlyZWN0c2x1Zz1KYXZhU2NyaXB0JTJGUmVmZXJlbmNlJTJGR2xvYmFsX09iamVjdHMlMkZPYmplY3QlMkZrZXlzXHJcbmlmICghT2JqZWN0LmtleXMpIHtcclxuXHRPYmplY3Qua2V5cyA9IChmdW5jdGlvbiAoKSB7XHJcblx0XHR2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxyXG5cdFx0XHRoYXNEb250RW51bUJ1ZyA9ICEoe3RvU3RyaW5nOiBudWxsfSkucHJvcGVydHlJc0VudW1lcmFibGUoJ3RvU3RyaW5nJyksXHJcblx0XHRcdGRvbnRFbnVtcyA9IFtcclxuXHRcdFx0XHQndG9TdHJpbmcnLFxyXG5cdFx0XHRcdCd0b0xvY2FsZVN0cmluZycsXHJcblx0XHRcdFx0J3ZhbHVlT2YnLFxyXG5cdFx0XHRcdCdoYXNPd25Qcm9wZXJ0eScsXHJcblx0XHRcdFx0J2lzUHJvdG90eXBlT2YnLFxyXG5cdFx0XHRcdCdwcm9wZXJ0eUlzRW51bWVyYWJsZScsXHJcblx0XHRcdFx0J2NvbnN0cnVjdG9yJ1xyXG5cdFx0XHRdLFxyXG5cdFx0XHRkb250RW51bXNMZW5ndGggPSBkb250RW51bXMubGVuZ3RoO1xyXG5cclxuXHRcdHJldHVybiBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHRcdGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyAmJiB0eXBlb2Ygb2JqICE9PSAnZnVuY3Rpb24nIHx8IG9iaiA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5rZXlzIGNhbGxlZCBvbiBub24tb2JqZWN0Jyk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcclxuXHJcblx0XHRcdGZvciAodmFyIHByb3AgaW4gb2JqKSB7XHJcblx0XHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkge1xyXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2gocHJvcCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoaGFzRG9udEVudW1CdWcpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpPTA7IGkgPCBkb250RW51bXNMZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqLCBkb250RW51bXNbaV0pKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGRvbnRFbnVtc1tpXSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHJldHVybiByZXN1bHQ7XHJcblx0XHR9O1xyXG5cdH0pKCk7XHJcbn1cclxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2NyZWF0ZVxyXG5pZiAoIU9iamVjdC5jcmVhdGUpIHtcclxuXHRPYmplY3QuY3JlYXRlID0gKGZ1bmN0aW9uKCl7XHJcblx0XHRmdW5jdGlvbiBGKCl7fVxyXG5cclxuXHRcdHJldHVybiBmdW5jdGlvbihvKXtcclxuXHRcdFx0aWYgKGFyZ3VtZW50cy5sZW5ndGggIT09IDEpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ09iamVjdC5jcmVhdGUgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG9uZSBwYXJhbWV0ZXIuJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0Ri5wcm90b3R5cGUgPSBvO1xyXG5cdFx0XHRyZXR1cm4gbmV3IEYoKTtcclxuXHRcdH07XHJcblx0fSkoKTtcclxufVxyXG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pc0FycmF5P3JlZGlyZWN0bG9jYWxlPWVuLVVTJnJlZGlyZWN0c2x1Zz1KYXZhU2NyaXB0JTJGUmVmZXJlbmNlJTJGR2xvYmFsX09iamVjdHMlMkZBcnJheSUyRmlzQXJyYXlcclxuaWYoIUFycmF5LmlzQXJyYXkpIHtcclxuXHRBcnJheS5pc0FycmF5ID0gZnVuY3Rpb24gKHZBcmcpIHtcclxuXHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodkFyZykgPT09IFwiW29iamVjdCBBcnJheV1cIjtcclxuXHR9O1xyXG59XHJcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2luZGV4T2Y/cmVkaXJlY3Rsb2NhbGU9ZW4tVVMmcmVkaXJlY3RzbHVnPUphdmFTY3JpcHQlMkZSZWZlcmVuY2UlMkZHbG9iYWxfT2JqZWN0cyUyRkFycmF5JTJGaW5kZXhPZlxyXG5pZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XHJcblx0QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiAoc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4ICovICkge1xyXG5cdFx0aWYgKHRoaXMgPT09IG51bGwpIHtcclxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcigpO1xyXG5cdFx0fVxyXG5cdFx0dmFyIHQgPSBPYmplY3QodGhpcyk7XHJcblx0XHR2YXIgbGVuID0gdC5sZW5ndGggPj4+IDA7XHJcblxyXG5cdFx0aWYgKGxlbiA9PT0gMCkge1xyXG5cdFx0XHRyZXR1cm4gLTE7XHJcblx0XHR9XHJcblx0XHR2YXIgbiA9IDA7XHJcblx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcclxuXHRcdFx0biA9IE51bWJlcihhcmd1bWVudHNbMV0pO1xyXG5cdFx0XHRpZiAobiAhPT0gbikgeyAvLyBzaG9ydGN1dCBmb3IgdmVyaWZ5aW5nIGlmIGl0J3MgTmFOXHJcblx0XHRcdFx0biA9IDA7XHJcblx0XHRcdH0gZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSBJbmZpbml0eSAmJiBuICE9PSAtSW5maW5pdHkpIHtcclxuXHRcdFx0XHRuID0gKG4gPiAwIHx8IC0xKSAqIE1hdGguZmxvb3IoTWF0aC5hYnMobikpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAobiA+PSBsZW4pIHtcclxuXHRcdFx0cmV0dXJuIC0xO1xyXG5cdFx0fVxyXG5cdFx0dmFyIGsgPSBuID49IDAgPyBuIDogTWF0aC5tYXgobGVuIC0gTWF0aC5hYnMobiksIDApO1xyXG5cdFx0Zm9yICg7IGsgPCBsZW47IGsrKykge1xyXG5cdFx0XHRpZiAoayBpbiB0ICYmIHRba10gPT09IHNlYXJjaEVsZW1lbnQpIHtcclxuXHRcdFx0XHRyZXR1cm4gaztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIC0xO1xyXG5cdH07XHJcbn1cclxuXHJcbi8vIEdydW5nZXkgT2JqZWN0LmlzRnJvemVuIGhhY2tcclxuaWYgKCFPYmplY3QuaXNGcm96ZW4pIHtcclxuXHRPYmplY3QuaXNGcm96ZW4gPSBmdW5jdGlvbiAob2JqKSB7XHJcblx0XHR2YXIga2V5ID0gXCJ0djRfdGVzdF9mcm96ZW5fa2V5XCI7XHJcblx0XHR3aGlsZSAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuXHRcdFx0a2V5ICs9IE1hdGgucmFuZG9tKCk7XHJcblx0XHR9XHJcblx0XHR0cnkge1xyXG5cdFx0XHRvYmpba2V5XSA9IHRydWU7XHJcblx0XHRcdGRlbGV0ZSBvYmpba2V5XTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fSBjYXRjaCAoZSkge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHR9O1xyXG59XHJcbi8vIEJhc2VkIG9uOiBodHRwczovL2dpdGh1Yi5jb20vZ2VyYWludGx1ZmYvdXJpLXRlbXBsYXRlcywgYnV0IHdpdGggYWxsIHRoZSBkZS1zdWJzdGl0dXRpb24gc3R1ZmYgcmVtb3ZlZFxyXG5cclxudmFyIHVyaVRlbXBsYXRlR2xvYmFsTW9kaWZpZXJzID0ge1xyXG5cdFwiK1wiOiB0cnVlLFxyXG5cdFwiI1wiOiB0cnVlLFxyXG5cdFwiLlwiOiB0cnVlLFxyXG5cdFwiL1wiOiB0cnVlLFxyXG5cdFwiO1wiOiB0cnVlLFxyXG5cdFwiP1wiOiB0cnVlLFxyXG5cdFwiJlwiOiB0cnVlXHJcbn07XHJcbnZhciB1cmlUZW1wbGF0ZVN1ZmZpY2VzID0ge1xyXG5cdFwiKlwiOiB0cnVlXHJcbn07XHJcblxyXG5mdW5jdGlvbiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKHN0cmluZykge1xyXG5cdHJldHVybiBlbmNvZGVVUkkoc3RyaW5nKS5yZXBsYWNlKC8lMjVbMC05XVswLTldL2csIGZ1bmN0aW9uIChkb3VibGVFbmNvZGVkKSB7XHJcblx0XHRyZXR1cm4gXCIlXCIgKyBkb3VibGVFbmNvZGVkLnN1YnN0cmluZygzKTtcclxuXHR9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gdXJpVGVtcGxhdGVTdWJzdGl0dXRpb24oc3BlYykge1xyXG5cdHZhciBtb2RpZmllciA9IFwiXCI7XHJcblx0aWYgKHVyaVRlbXBsYXRlR2xvYmFsTW9kaWZpZXJzW3NwZWMuY2hhckF0KDApXSkge1xyXG5cdFx0bW9kaWZpZXIgPSBzcGVjLmNoYXJBdCgwKTtcclxuXHRcdHNwZWMgPSBzcGVjLnN1YnN0cmluZygxKTtcclxuXHR9XHJcblx0dmFyIHNlcGFyYXRvciA9IFwiXCI7XHJcblx0dmFyIHByZWZpeCA9IFwiXCI7XHJcblx0dmFyIHNob3VsZEVzY2FwZSA9IHRydWU7XHJcblx0dmFyIHNob3dWYXJpYWJsZXMgPSBmYWxzZTtcclxuXHR2YXIgdHJpbUVtcHR5U3RyaW5nID0gZmFsc2U7XHJcblx0aWYgKG1vZGlmaWVyID09PSAnKycpIHtcclxuXHRcdHNob3VsZEVzY2FwZSA9IGZhbHNlO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09IFwiLlwiKSB7XHJcblx0XHRwcmVmaXggPSBcIi5cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiLlwiO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09IFwiL1wiKSB7XHJcblx0XHRwcmVmaXggPSBcIi9cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiL1wiO1xyXG5cdH0gZWxzZSBpZiAobW9kaWZpZXIgPT09ICcjJykge1xyXG5cdFx0cHJlZml4ID0gXCIjXCI7XHJcblx0XHRzaG91bGRFc2NhcGUgPSBmYWxzZTtcclxuXHR9IGVsc2UgaWYgKG1vZGlmaWVyID09PSAnOycpIHtcclxuXHRcdHByZWZpeCA9IFwiO1wiO1xyXG5cdFx0c2VwYXJhdG9yID0gXCI7XCI7XHJcblx0XHRzaG93VmFyaWFibGVzID0gdHJ1ZTtcclxuXHRcdHRyaW1FbXB0eVN0cmluZyA9IHRydWU7XHJcblx0fSBlbHNlIGlmIChtb2RpZmllciA9PT0gJz8nKSB7XHJcblx0XHRwcmVmaXggPSBcIj9cIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiJlwiO1xyXG5cdFx0c2hvd1ZhcmlhYmxlcyA9IHRydWU7XHJcblx0fSBlbHNlIGlmIChtb2RpZmllciA9PT0gJyYnKSB7XHJcblx0XHRwcmVmaXggPSBcIiZcIjtcclxuXHRcdHNlcGFyYXRvciA9IFwiJlwiO1xyXG5cdFx0c2hvd1ZhcmlhYmxlcyA9IHRydWU7XHJcblx0fVxyXG5cclxuXHR2YXIgdmFyTmFtZXMgPSBbXTtcclxuXHR2YXIgdmFyTGlzdCA9IHNwZWMuc3BsaXQoXCIsXCIpO1xyXG5cdHZhciB2YXJTcGVjcyA9IFtdO1xyXG5cdHZhciB2YXJTcGVjTWFwID0ge307XHJcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCB2YXJMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgdmFyTmFtZSA9IHZhckxpc3RbaV07XHJcblx0XHR2YXIgdHJ1bmNhdGUgPSBudWxsO1xyXG5cdFx0aWYgKHZhck5hbWUuaW5kZXhPZihcIjpcIikgIT09IC0xKSB7XHJcblx0XHRcdHZhciBwYXJ0cyA9IHZhck5hbWUuc3BsaXQoXCI6XCIpO1xyXG5cdFx0XHR2YXJOYW1lID0gcGFydHNbMF07XHJcblx0XHRcdHRydW5jYXRlID0gcGFyc2VJbnQocGFydHNbMV0sIDEwKTtcclxuXHRcdH1cclxuXHRcdHZhciBzdWZmaWNlcyA9IHt9O1xyXG5cdFx0d2hpbGUgKHVyaVRlbXBsYXRlU3VmZmljZXNbdmFyTmFtZS5jaGFyQXQodmFyTmFtZS5sZW5ndGggLSAxKV0pIHtcclxuXHRcdFx0c3VmZmljZXNbdmFyTmFtZS5jaGFyQXQodmFyTmFtZS5sZW5ndGggLSAxKV0gPSB0cnVlO1xyXG5cdFx0XHR2YXJOYW1lID0gdmFyTmFtZS5zdWJzdHJpbmcoMCwgdmFyTmFtZS5sZW5ndGggLSAxKTtcclxuXHRcdH1cclxuXHRcdHZhciB2YXJTcGVjID0ge1xyXG5cdFx0XHR0cnVuY2F0ZTogdHJ1bmNhdGUsXHJcblx0XHRcdG5hbWU6IHZhck5hbWUsXHJcblx0XHRcdHN1ZmZpY2VzOiBzdWZmaWNlc1xyXG5cdFx0fTtcclxuXHRcdHZhclNwZWNzLnB1c2godmFyU3BlYyk7XHJcblx0XHR2YXJTcGVjTWFwW3Zhck5hbWVdID0gdmFyU3BlYztcclxuXHRcdHZhck5hbWVzLnB1c2godmFyTmFtZSk7XHJcblx0fVxyXG5cdHZhciBzdWJGdW5jdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZUZ1bmN0aW9uKSB7XHJcblx0XHR2YXIgcmVzdWx0ID0gXCJcIjtcclxuXHRcdHZhciBzdGFydEluZGV4ID0gMDtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdmFyU3BlY3MubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIHZhclNwZWMgPSB2YXJTcGVjc1tpXTtcclxuXHRcdFx0dmFyIHZhbHVlID0gdmFsdWVGdW5jdGlvbih2YXJTcGVjLm5hbWUpO1xyXG5cdFx0XHRpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB8fCAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKSkge1xyXG5cdFx0XHRcdHN0YXJ0SW5kZXgrKztcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoaSA9PT0gc3RhcnRJbmRleCkge1xyXG5cdFx0XHRcdHJlc3VsdCArPSBwcmVmaXg7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cmVzdWx0ICs9IChzZXBhcmF0b3IgfHwgXCIsXCIpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG5cdFx0XHRcdGlmIChzaG93VmFyaWFibGVzKSB7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5uYW1lICsgXCI9XCI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdmFsdWUubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdGlmIChqID4gMCkge1xyXG5cdFx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5zdWZmaWNlc1snKiddID8gKHNlcGFyYXRvciB8fCBcIixcIikgOiBcIixcIjtcclxuXHRcdFx0XHRcdFx0aWYgKHZhclNwZWMuc3VmZmljZXNbJyonXSAmJiBzaG93VmFyaWFibGVzKSB7XHJcblx0XHRcdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMubmFtZSArIFwiPVwiO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gc2hvdWxkRXNjYXBlID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2pdKS5yZXBsYWNlKC8hL2csIFwiJTIxXCIpIDogbm90UmVhbGx5UGVyY2VudEVuY29kZSh2YWx1ZVtqXSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xyXG5cdFx0XHRcdGlmIChzaG93VmFyaWFibGVzICYmICF2YXJTcGVjLnN1ZmZpY2VzWycqJ10pIHtcclxuXHRcdFx0XHRcdHJlc3VsdCArPSB2YXJTcGVjLm5hbWUgKyBcIj1cIjtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0dmFyIGZpcnN0ID0gdHJ1ZTtcclxuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcclxuXHRcdFx0XHRcdGlmICghZmlyc3QpIHtcclxuXHRcdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMuc3VmZmljZXNbJyonXSA/IChzZXBhcmF0b3IgfHwgXCIsXCIpIDogXCIsXCI7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRmaXJzdCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0cmVzdWx0ICs9IHNob3VsZEVzY2FwZSA/IGVuY29kZVVSSUNvbXBvbmVudChrZXkpLnJlcGxhY2UoLyEvZywgXCIlMjFcIikgOiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKGtleSk7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gdmFyU3BlYy5zdWZmaWNlc1snKiddID8gJz0nIDogXCIsXCI7XHJcblx0XHRcdFx0XHRyZXN1bHQgKz0gc2hvdWxkRXNjYXBlID8gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlW2tleV0pLnJlcGxhY2UoLyEvZywgXCIlMjFcIikgOiBub3RSZWFsbHlQZXJjZW50RW5jb2RlKHZhbHVlW2tleV0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRpZiAoc2hvd1ZhcmlhYmxlcykge1xyXG5cdFx0XHRcdFx0cmVzdWx0ICs9IHZhclNwZWMubmFtZTtcclxuXHRcdFx0XHRcdGlmICghdHJpbUVtcHR5U3RyaW5nIHx8IHZhbHVlICE9PSBcIlwiKSB7XHJcblx0XHRcdFx0XHRcdHJlc3VsdCArPSBcIj1cIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKHZhclNwZWMudHJ1bmNhdGUgIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFyU3BlYy50cnVuY2F0ZSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJlc3VsdCArPSBzaG91bGRFc2NhcGUgPyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoLyEvZywgXCIlMjFcIik6IG5vdFJlYWxseVBlcmNlbnRFbmNvZGUodmFsdWUpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH07XHJcblx0c3ViRnVuY3Rpb24udmFyTmFtZXMgPSB2YXJOYW1lcztcclxuXHRyZXR1cm4ge1xyXG5cdFx0cHJlZml4OiBwcmVmaXgsXHJcblx0XHRzdWJzdGl0dXRpb246IHN1YkZ1bmN0aW9uXHJcblx0fTtcclxufVxyXG5cclxuZnVuY3Rpb24gVXJpVGVtcGxhdGUodGVtcGxhdGUpIHtcclxuXHRpZiAoISh0aGlzIGluc3RhbmNlb2YgVXJpVGVtcGxhdGUpKSB7XHJcblx0XHRyZXR1cm4gbmV3IFVyaVRlbXBsYXRlKHRlbXBsYXRlKTtcclxuXHR9XHJcblx0dmFyIHBhcnRzID0gdGVtcGxhdGUuc3BsaXQoXCJ7XCIpO1xyXG5cdHZhciB0ZXh0UGFydHMgPSBbcGFydHMuc2hpZnQoKV07XHJcblx0dmFyIHByZWZpeGVzID0gW107XHJcblx0dmFyIHN1YnN0aXR1dGlvbnMgPSBbXTtcclxuXHR2YXIgdmFyTmFtZXMgPSBbXTtcclxuXHR3aGlsZSAocGFydHMubGVuZ3RoID4gMCkge1xyXG5cdFx0dmFyIHBhcnQgPSBwYXJ0cy5zaGlmdCgpO1xyXG5cdFx0dmFyIHNwZWMgPSBwYXJ0LnNwbGl0KFwifVwiKVswXTtcclxuXHRcdHZhciByZW1haW5kZXIgPSBwYXJ0LnN1YnN0cmluZyhzcGVjLmxlbmd0aCArIDEpO1xyXG5cdFx0dmFyIGZ1bmNzID0gdXJpVGVtcGxhdGVTdWJzdGl0dXRpb24oc3BlYyk7XHJcblx0XHRzdWJzdGl0dXRpb25zLnB1c2goZnVuY3Muc3Vic3RpdHV0aW9uKTtcclxuXHRcdHByZWZpeGVzLnB1c2goZnVuY3MucHJlZml4KTtcclxuXHRcdHRleHRQYXJ0cy5wdXNoKHJlbWFpbmRlcik7XHJcblx0XHR2YXJOYW1lcyA9IHZhck5hbWVzLmNvbmNhdChmdW5jcy5zdWJzdGl0dXRpb24udmFyTmFtZXMpO1xyXG5cdH1cclxuXHR0aGlzLmZpbGwgPSBmdW5jdGlvbiAodmFsdWVGdW5jdGlvbikge1xyXG5cdFx0dmFyIHJlc3VsdCA9IHRleHRQYXJ0c1swXTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3Vic3RpdHV0aW9ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgc3Vic3RpdHV0aW9uID0gc3Vic3RpdHV0aW9uc1tpXTtcclxuXHRcdFx0cmVzdWx0ICs9IHN1YnN0aXR1dGlvbih2YWx1ZUZ1bmN0aW9uKTtcclxuXHRcdFx0cmVzdWx0ICs9IHRleHRQYXJ0c1tpICsgMV07XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH07XHJcblx0dGhpcy52YXJOYW1lcyA9IHZhck5hbWVzO1xyXG5cdHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxufVxyXG5VcmlUZW1wbGF0ZS5wcm90b3R5cGUgPSB7XHJcblx0dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdHJldHVybiB0aGlzLnRlbXBsYXRlO1xyXG5cdH0sXHJcblx0ZmlsbEZyb21PYmplY3Q6IGZ1bmN0aW9uIChvYmopIHtcclxuXHRcdHJldHVybiB0aGlzLmZpbGwoZnVuY3Rpb24gKHZhck5hbWUpIHtcclxuXHRcdFx0cmV0dXJuIG9ialt2YXJOYW1lXTtcclxuXHRcdH0pO1xyXG5cdH1cclxufTtcclxudmFyIFZhbGlkYXRvckNvbnRleHQgPSBmdW5jdGlvbiBWYWxpZGF0b3JDb250ZXh0KHBhcmVudCwgY29sbGVjdE11bHRpcGxlLCBlcnJvclJlcG9ydGVyLCBjaGVja1JlY3Vyc2l2ZSwgdHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdHRoaXMubWlzc2luZ01hcCA9IHt9O1xyXG5cdHRoaXMuZm9ybWF0VmFsaWRhdG9ycyA9IHBhcmVudCA/IE9iamVjdC5jcmVhdGUocGFyZW50LmZvcm1hdFZhbGlkYXRvcnMpIDoge307XHJcblx0dGhpcy5zY2hlbWFzID0gcGFyZW50ID8gT2JqZWN0LmNyZWF0ZShwYXJlbnQuc2NoZW1hcykgOiB7fTtcclxuXHR0aGlzLmNvbGxlY3RNdWx0aXBsZSA9IGNvbGxlY3RNdWx0aXBsZTtcclxuXHR0aGlzLmVycm9ycyA9IFtdO1xyXG5cdHRoaXMuaGFuZGxlRXJyb3IgPSBjb2xsZWN0TXVsdGlwbGUgPyB0aGlzLmNvbGxlY3RFcnJvciA6IHRoaXMucmV0dXJuRXJyb3I7XHJcblx0aWYgKGNoZWNrUmVjdXJzaXZlKSB7XHJcblx0XHR0aGlzLmNoZWNrUmVjdXJzaXZlID0gdHJ1ZTtcclxuXHRcdHRoaXMuc2Nhbm5lZCA9IFtdO1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuID0gW107XHJcblx0XHR0aGlzLnNjYW5uZWRGcm96ZW5TY2hlbWFzID0gW107XHJcblx0XHR0aGlzLnNjYW5uZWRGcm96ZW5WYWxpZGF0aW9uRXJyb3JzID0gW107XHJcblx0XHR0aGlzLnZhbGlkYXRlZFNjaGVtYXNLZXkgPSAndHY0X3ZhbGlkYXRpb25faWQnO1xyXG5cdFx0dGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5ID0gJ3R2NF92YWxpZGF0aW9uX2Vycm9yc19pZCc7XHJcblx0fVxyXG5cdGlmICh0cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHR0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMgPSB0cnVlO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSB7fTtcclxuXHRcdHRoaXMudW5rbm93blByb3BlcnR5UGF0aHMgPSB7fTtcclxuXHR9XHJcblx0dGhpcy5lcnJvclJlcG9ydGVyID0gZXJyb3JSZXBvcnRlciB8fCBkZWZhdWx0RXJyb3JSZXBvcnRlcignZW4nKTtcclxuXHRpZiAodHlwZW9mIHRoaXMuZXJyb3JSZXBvcnRlciA9PT0gJ3N0cmluZycpIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcignZGVidWcnKTtcclxuXHR9XHJcblx0dGhpcy5kZWZpbmVkS2V5d29yZHMgPSB7fTtcclxuXHRpZiAocGFyZW50KSB7XHJcblx0XHRmb3IgKHZhciBrZXkgaW4gcGFyZW50LmRlZmluZWRLZXl3b3Jkcykge1xyXG5cdFx0XHR0aGlzLmRlZmluZWRLZXl3b3Jkc1trZXldID0gcGFyZW50LmRlZmluZWRLZXl3b3Jkc1trZXldLnNsaWNlKDApO1xyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuZGVmaW5lS2V5d29yZCA9IGZ1bmN0aW9uIChrZXl3b3JkLCBrZXl3b3JkRnVuY3Rpb24pIHtcclxuXHR0aGlzLmRlZmluZWRLZXl3b3Jkc1trZXl3b3JkXSA9IHRoaXMuZGVmaW5lZEtleXdvcmRzW2tleXdvcmRdIHx8IFtdO1xyXG5cdHRoaXMuZGVmaW5lZEtleXdvcmRzW2tleXdvcmRdLnB1c2goa2V5d29yZEZ1bmN0aW9uKTtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlRXJyb3IgPSBmdW5jdGlvbiAoY29kZSwgbWVzc2FnZVBhcmFtcywgZGF0YVBhdGgsIHNjaGVtYVBhdGgsIHN1YkVycm9ycywgZGF0YSwgc2NoZW1hKSB7XHJcblx0dmFyIGVycm9yID0gbmV3IFZhbGlkYXRpb25FcnJvcihjb2RlLCBtZXNzYWdlUGFyYW1zLCBkYXRhUGF0aCwgc2NoZW1hUGF0aCwgc3ViRXJyb3JzKTtcclxuXHRlcnJvci5tZXNzYWdlID0gdGhpcy5lcnJvclJlcG9ydGVyKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdHJldHVybiBlcnJvcjtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUucmV0dXJuRXJyb3IgPSBmdW5jdGlvbiAoZXJyb3IpIHtcclxuXHRyZXR1cm4gZXJyb3I7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmNvbGxlY3RFcnJvciA9IGZ1bmN0aW9uIChlcnJvcikge1xyXG5cdGlmIChlcnJvcikge1xyXG5cdFx0dGhpcy5lcnJvcnMucHVzaChlcnJvcik7XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5wcmVmaXhFcnJvcnMgPSBmdW5jdGlvbiAoc3RhcnRJbmRleCwgZGF0YVBhdGgsIHNjaGVtYVBhdGgpIHtcclxuXHRmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRoaXMuZXJyb3JzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR0aGlzLmVycm9yc1tpXSA9IHRoaXMuZXJyb3JzW2ldLnByZWZpeFdpdGgoZGF0YVBhdGgsIHNjaGVtYVBhdGgpO1xyXG5cdH1cclxuXHRyZXR1cm4gdGhpcztcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUuYmFuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hKSB7XHJcblx0Zm9yICh2YXIgdW5rbm93blBhdGggaW4gdGhpcy51bmtub3duUHJvcGVydHlQYXRocykge1xyXG5cdFx0dmFyIGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLlVOS05PV05fUFJPUEVSVFksIHtwYXRoOiB1bmtub3duUGF0aH0sIHVua25vd25QYXRoLCBcIlwiLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG5cdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmFkZEZvcm1hdCA9IGZ1bmN0aW9uIChmb3JtYXQsIHZhbGlkYXRvcikge1xyXG5cdGlmICh0eXBlb2YgZm9ybWF0ID09PSAnb2JqZWN0Jykge1xyXG5cdFx0Zm9yICh2YXIga2V5IGluIGZvcm1hdCkge1xyXG5cdFx0XHR0aGlzLmFkZEZvcm1hdChrZXksIGZvcm1hdFtrZXldKTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxuXHR0aGlzLmZvcm1hdFZhbGlkYXRvcnNbZm9ybWF0XSA9IHZhbGlkYXRvcjtcclxufTtcclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUucmVzb2x2ZVJlZnMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1cmxIaXN0b3J5KSB7XHJcblx0aWYgKHNjaGVtYVsnJHJlZiddICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdHVybEhpc3RvcnkgPSB1cmxIaXN0b3J5IHx8IHt9O1xyXG5cdFx0aWYgKHVybEhpc3Rvcnlbc2NoZW1hWyckcmVmJ11dKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuQ0lSQ1VMQVJfUkVGRVJFTkNFLCB7dXJsczogT2JqZWN0LmtleXModXJsSGlzdG9yeSkuam9pbignLCAnKX0sICcnLCAnJywgbnVsbCwgdW5kZWZpbmVkLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdFx0dXJsSGlzdG9yeVtzY2hlbWFbJyRyZWYnXV0gPSB0cnVlO1xyXG5cdFx0c2NoZW1hID0gdGhpcy5nZXRTY2hlbWEoc2NoZW1hWyckcmVmJ10sIHVybEhpc3RvcnkpO1xyXG5cdH1cclxuXHRyZXR1cm4gc2NoZW1hO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5nZXRTY2hlbWEgPSBmdW5jdGlvbiAodXJsLCB1cmxIaXN0b3J5KSB7XHJcblx0dmFyIHNjaGVtYTtcclxuXHRpZiAodGhpcy5zY2hlbWFzW3VybF0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0c2NoZW1hID0gdGhpcy5zY2hlbWFzW3VybF07XHJcblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlUmVmcyhzY2hlbWEsIHVybEhpc3RvcnkpO1xyXG5cdH1cclxuXHR2YXIgYmFzZVVybCA9IHVybDtcclxuXHR2YXIgZnJhZ21lbnQgPSBcIlwiO1xyXG5cdGlmICh1cmwuaW5kZXhPZignIycpICE9PSAtMSkge1xyXG5cdFx0ZnJhZ21lbnQgPSB1cmwuc3Vic3RyaW5nKHVybC5pbmRleE9mKFwiI1wiKSArIDEpO1xyXG5cdFx0YmFzZVVybCA9IHVybC5zdWJzdHJpbmcoMCwgdXJsLmluZGV4T2YoXCIjXCIpKTtcclxuXHR9XHJcblx0aWYgKHR5cGVvZiB0aGlzLnNjaGVtYXNbYmFzZVVybF0gPT09ICdvYmplY3QnKSB7XHJcblx0XHRzY2hlbWEgPSB0aGlzLnNjaGVtYXNbYmFzZVVybF07XHJcblx0XHR2YXIgcG9pbnRlclBhdGggPSBkZWNvZGVVUklDb21wb25lbnQoZnJhZ21lbnQpO1xyXG5cdFx0aWYgKHBvaW50ZXJQYXRoID09PSBcIlwiKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVSZWZzKHNjaGVtYSwgdXJsSGlzdG9yeSk7XHJcblx0XHR9IGVsc2UgaWYgKHBvaW50ZXJQYXRoLmNoYXJBdCgwKSAhPT0gXCIvXCIpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHRcdHZhciBwYXJ0cyA9IHBvaW50ZXJQYXRoLnNwbGl0KFwiL1wiKS5zbGljZSgxKTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0dmFyIGNvbXBvbmVudCA9IHBhcnRzW2ldLnJlcGxhY2UoL34xL2csIFwiL1wiKS5yZXBsYWNlKC9+MC9nLCBcIn5cIik7XHJcblx0XHRcdGlmIChzY2hlbWFbY29tcG9uZW50XSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0c2NoZW1hID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHR9XHJcblx0XHRcdHNjaGVtYSA9IHNjaGVtYVtjb21wb25lbnRdO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLnJlc29sdmVSZWZzKHNjaGVtYSwgdXJsSGlzdG9yeSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICh0aGlzLm1pc3NpbmdbYmFzZVVybF0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0dGhpcy5taXNzaW5nLnB1c2goYmFzZVVybCk7XHJcblx0XHR0aGlzLm1pc3NpbmdbYmFzZVVybF0gPSBiYXNlVXJsO1xyXG5cdFx0dGhpcy5taXNzaW5nTWFwW2Jhc2VVcmxdID0gYmFzZVVybDtcclxuXHR9XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnNlYXJjaFNjaGVtYXMgPSBmdW5jdGlvbiAoc2NoZW1hLCB1cmwpIHtcclxuXHRpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEpKSB7XHJcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR0aGlzLnNlYXJjaFNjaGVtYXMoc2NoZW1hW2ldLCB1cmwpO1xyXG5cdFx0fVxyXG5cdH0gZWxzZSBpZiAoc2NoZW1hICYmIHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdGlmICh0eXBlb2Ygc2NoZW1hLmlkID09PSBcInN0cmluZ1wiKSB7XHJcblx0XHRcdGlmIChpc1RydXN0ZWRVcmwodXJsLCBzY2hlbWEuaWQpKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMuc2NoZW1hc1tzY2hlbWEuaWRdID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2NoZW1hc1tzY2hlbWEuaWRdID0gc2NoZW1hO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0Zm9yICh2YXIga2V5IGluIHNjaGVtYSkge1xyXG5cdFx0XHRpZiAoa2V5ICE9PSBcImVudW1cIikge1xyXG5cdFx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hW2tleV0gPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdFx0XHRcdHRoaXMuc2VhcmNoU2NoZW1hcyhzY2hlbWFba2V5XSwgdXJsKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGtleSA9PT0gXCIkcmVmXCIpIHtcclxuXHRcdFx0XHRcdHZhciB1cmkgPSBnZXREb2N1bWVudFVyaShzY2hlbWFba2V5XSk7XHJcblx0XHRcdFx0XHRpZiAodXJpICYmIHRoaXMuc2NoZW1hc1t1cmldID09PSB1bmRlZmluZWQgJiYgdGhpcy5taXNzaW5nTWFwW3VyaV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLm1pc3NpbmdNYXBbdXJpXSA9IHVyaTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmFkZFNjaGVtYSA9IGZ1bmN0aW9uICh1cmwsIHNjaGVtYSkge1xyXG5cdC8vb3ZlcmxvYWRcclxuXHRpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIHNjaGVtYSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdGlmICh0eXBlb2YgdXJsID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdXJsLmlkID09PSAnc3RyaW5nJykge1xyXG5cdFx0XHRzY2hlbWEgPSB1cmw7XHJcblx0XHRcdHVybCA9IHNjaGVtYS5pZDtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmICh1cmwgPT09IGdldERvY3VtZW50VXJpKHVybCkgKyBcIiNcIikge1xyXG5cdFx0Ly8gUmVtb3ZlIGVtcHR5IGZyYWdtZW50XHJcblx0XHR1cmwgPSBnZXREb2N1bWVudFVyaSh1cmwpO1xyXG5cdH1cclxuXHR0aGlzLnNjaGVtYXNbdXJsXSA9IHNjaGVtYTtcclxuXHRkZWxldGUgdGhpcy5taXNzaW5nTWFwW3VybF07XHJcblx0bm9ybVNjaGVtYShzY2hlbWEsIHVybCk7XHJcblx0dGhpcy5zZWFyY2hTY2hlbWFzKHNjaGVtYSwgdXJsKTtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldFNjaGVtYU1hcCA9IGZ1bmN0aW9uICgpIHtcclxuXHR2YXIgbWFwID0ge307XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMuc2NoZW1hcykge1xyXG5cdFx0bWFwW2tleV0gPSB0aGlzLnNjaGVtYXNba2V5XTtcclxuXHR9XHJcblx0cmV0dXJuIG1hcDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldFNjaGVtYVVyaXMgPSBmdW5jdGlvbiAoZmlsdGVyUmVnRXhwKSB7XHJcblx0dmFyIGxpc3QgPSBbXTtcclxuXHRmb3IgKHZhciBrZXkgaW4gdGhpcy5zY2hlbWFzKSB7XHJcblx0XHRpZiAoIWZpbHRlclJlZ0V4cCB8fCBmaWx0ZXJSZWdFeHAudGVzdChrZXkpKSB7XHJcblx0XHRcdGxpc3QucHVzaChrZXkpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbGlzdDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLmdldE1pc3NpbmdVcmlzID0gZnVuY3Rpb24gKGZpbHRlclJlZ0V4cCkge1xyXG5cdHZhciBsaXN0ID0gW107XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMubWlzc2luZ01hcCkge1xyXG5cdFx0aWYgKCFmaWx0ZXJSZWdFeHAgfHwgZmlsdGVyUmVnRXhwLnRlc3Qoa2V5KSkge1xyXG5cdFx0XHRsaXN0LnB1c2goa2V5KTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGxpc3Q7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS5kcm9wU2NoZW1hcyA9IGZ1bmN0aW9uICgpIHtcclxuXHR0aGlzLnNjaGVtYXMgPSB7fTtcclxuXHR0aGlzLnJlc2V0KCk7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xyXG5cdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdHRoaXMubWlzc2luZ01hcCA9IHt9O1xyXG5cdHRoaXMuZXJyb3JzID0gW107XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFsbCA9IGZ1bmN0aW9uIChkYXRhLCBzY2hlbWEsIGRhdGFQYXRoUGFydHMsIHNjaGVtYVBhdGhQYXJ0cywgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0dmFyIHRvcExldmVsO1xyXG5cdHNjaGVtYSA9IHRoaXMucmVzb2x2ZVJlZnMoc2NoZW1hKTtcclxuXHRpZiAoIXNjaGVtYSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fSBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpIHtcclxuXHRcdHRoaXMuZXJyb3JzLnB1c2goc2NoZW1hKTtcclxuXHRcdHJldHVybiBzY2hlbWE7XHJcblx0fVxyXG5cclxuXHR2YXIgc3RhcnRFcnJvckNvdW50ID0gdGhpcy5lcnJvcnMubGVuZ3RoO1xyXG5cdHZhciBmcm96ZW5JbmRleCwgc2Nhbm5lZEZyb3plblNjaGVtYUluZGV4ID0gbnVsbCwgc2Nhbm5lZFNjaGVtYXNJbmRleCA9IG51bGw7XHJcblx0aWYgKHRoaXMuY2hlY2tSZWN1cnNpdmUgJiYgZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdHRvcExldmVsID0gIXRoaXMuc2Nhbm5lZC5sZW5ndGg7XHJcblx0XHRpZiAoZGF0YVt0aGlzLnZhbGlkYXRlZFNjaGVtYXNLZXldKSB7XHJcblx0XHRcdHZhciBzY2hlbWFJbmRleCA9IGRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XS5pbmRleE9mKHNjaGVtYSk7XHJcblx0XHRcdGlmIChzY2hlbWFJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHR0aGlzLmVycm9ycyA9IHRoaXMuZXJyb3JzLmNvbmNhdChkYXRhW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV1bc2NoZW1hSW5kZXhdKTtcclxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0aWYgKE9iamVjdC5pc0Zyb3plbihkYXRhKSkge1xyXG5cdFx0XHRmcm96ZW5JbmRleCA9IHRoaXMuc2Nhbm5lZEZyb3plbi5pbmRleE9mKGRhdGEpO1xyXG5cdFx0XHRpZiAoZnJvemVuSW5kZXggIT09IC0xKSB7XHJcblx0XHRcdFx0dmFyIGZyb3plblNjaGVtYUluZGV4ID0gdGhpcy5zY2FubmVkRnJvemVuU2NoZW1hc1tmcm96ZW5JbmRleF0uaW5kZXhPZihzY2hlbWEpO1xyXG5cdFx0XHRcdGlmIChmcm96ZW5TY2hlbWFJbmRleCAhPT0gLTEpIHtcclxuXHRcdFx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuY29uY2F0KHRoaXMuc2Nhbm5lZEZyb3plblZhbGlkYXRpb25FcnJvcnNbZnJvemVuSW5kZXhdW2Zyb3plblNjaGVtYUluZGV4XSk7XHJcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHRoaXMuc2Nhbm5lZC5wdXNoKGRhdGEpO1xyXG5cdFx0aWYgKE9iamVjdC5pc0Zyb3plbihkYXRhKSkge1xyXG5cdFx0XHRpZiAoZnJvemVuSW5kZXggPT09IC0xKSB7XHJcblx0XHRcdFx0ZnJvemVuSW5kZXggPSB0aGlzLnNjYW5uZWRGcm96ZW4ubGVuZ3RoO1xyXG5cdFx0XHRcdHRoaXMuc2Nhbm5lZEZyb3plbi5wdXNoKGRhdGEpO1xyXG5cdFx0XHRcdHRoaXMuc2Nhbm5lZEZyb3plblNjaGVtYXMucHVzaChbXSk7XHJcblx0XHRcdH1cclxuXHRcdFx0c2Nhbm5lZEZyb3plblNjaGVtYUluZGV4ID0gdGhpcy5zY2FubmVkRnJvemVuU2NoZW1hc1tmcm96ZW5JbmRleF0ubGVuZ3RoO1xyXG5cdFx0XHR0aGlzLnNjYW5uZWRGcm96ZW5TY2hlbWFzW2Zyb3plbkluZGV4XVtzY2FubmVkRnJvemVuU2NoZW1hSW5kZXhdID0gc2NoZW1hO1xyXG5cdFx0XHR0aGlzLnNjYW5uZWRGcm96ZW5WYWxpZGF0aW9uRXJyb3JzW2Zyb3plbkluZGV4XVtzY2FubmVkRnJvemVuU2NoZW1hSW5kZXhdID0gW107XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRpZiAoIWRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XSkge1xyXG5cdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0YSwgdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5LCB7XHJcblx0XHRcdFx0XHRcdHZhbHVlOiBbXSxcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRhLCB0aGlzLnZhbGlkYXRpb25FcnJvcnNLZXksIHtcclxuXHRcdFx0XHRcdFx0dmFsdWU6IFtdLFxyXG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRcdC8vSUUgNy84IHdvcmthcm91bmRcclxuXHRcdFx0XHRcdGRhdGFbdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XSA9IFtdO1xyXG5cdFx0XHRcdFx0ZGF0YVt0aGlzLnZhbGlkYXRpb25FcnJvcnNLZXldID0gW107XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHNjYW5uZWRTY2hlbWFzSW5kZXggPSBkYXRhW3RoaXMudmFsaWRhdGVkU2NoZW1hc0tleV0ubGVuZ3RoO1xyXG5cdFx0XHRkYXRhW3RoaXMudmFsaWRhdGVkU2NoZW1hc0tleV1bc2Nhbm5lZFNjaGVtYXNJbmRleF0gPSBzY2hlbWE7XHJcblx0XHRcdGRhdGFbdGhpcy52YWxpZGF0aW9uRXJyb3JzS2V5XVtzY2FubmVkU2NoZW1hc0luZGV4XSA9IFtdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0dmFyIGVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIGVycm9yID0gdGhpcy52YWxpZGF0ZUJhc2ljKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU51bWVyaWMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlU3RyaW5nKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZUFycmF5KGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9iamVjdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVDb21iaW5hdGlvbnMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlSHlwZXJtZWRpYShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVGb3JtYXQoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlRGVmaW5lZEtleXdvcmRzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxuXHJcblx0aWYgKHRvcExldmVsKSB7XHJcblx0XHR3aGlsZSAodGhpcy5zY2FubmVkLmxlbmd0aCkge1xyXG5cdFx0XHR2YXIgaXRlbSA9IHRoaXMuc2Nhbm5lZC5wb3AoKTtcclxuXHRcdFx0ZGVsZXRlIGl0ZW1bdGhpcy52YWxpZGF0ZWRTY2hlbWFzS2V5XTtcclxuXHRcdH1cclxuXHRcdHRoaXMuc2Nhbm5lZEZyb3plbiA9IFtdO1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuU2NoZW1hcyA9IFtdO1xyXG5cdH1cclxuXHJcblx0aWYgKGVycm9yIHx8IGVycm9yQ291bnQgIT09IHRoaXMuZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0d2hpbGUgKChkYXRhUGF0aFBhcnRzICYmIGRhdGFQYXRoUGFydHMubGVuZ3RoKSB8fCAoc2NoZW1hUGF0aFBhcnRzICYmIHNjaGVtYVBhdGhQYXJ0cy5sZW5ndGgpKSB7XHJcblx0XHRcdHZhciBkYXRhUGFydCA9IChkYXRhUGF0aFBhcnRzICYmIGRhdGFQYXRoUGFydHMubGVuZ3RoKSA/IFwiXCIgKyBkYXRhUGF0aFBhcnRzLnBvcCgpIDogbnVsbDtcclxuXHRcdFx0dmFyIHNjaGVtYVBhcnQgPSAoc2NoZW1hUGF0aFBhcnRzICYmIHNjaGVtYVBhdGhQYXJ0cy5sZW5ndGgpID8gXCJcIiArIHNjaGVtYVBhdGhQYXJ0cy5wb3AoKSA6IG51bGw7XHJcblx0XHRcdGlmIChlcnJvcikge1xyXG5cdFx0XHRcdGVycm9yID0gZXJyb3IucHJlZml4V2l0aChkYXRhUGFydCwgc2NoZW1hUGFydCk7XHJcblx0XHRcdH1cclxuXHRcdFx0dGhpcy5wcmVmaXhFcnJvcnMoZXJyb3JDb3VudCwgZGF0YVBhcnQsIHNjaGVtYVBhcnQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0aWYgKHNjYW5uZWRGcm96ZW5TY2hlbWFJbmRleCAhPT0gbnVsbCkge1xyXG5cdFx0dGhpcy5zY2FubmVkRnJvemVuVmFsaWRhdGlvbkVycm9yc1tmcm96ZW5JbmRleF1bc2Nhbm5lZEZyb3plblNjaGVtYUluZGV4XSA9IHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCk7XHJcblx0fSBlbHNlIGlmIChzY2FubmVkU2NoZW1hc0luZGV4ICE9PSBudWxsKSB7XHJcblx0XHRkYXRhW3RoaXMudmFsaWRhdGlvbkVycm9yc0tleV1bc2Nhbm5lZFNjaGVtYXNJbmRleF0gPSB0aGlzLmVycm9ycy5zbGljZShzdGFydEVycm9yQ291bnQpO1xyXG5cdH1cclxuXHJcblx0cmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpO1xyXG59O1xyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIChkYXRhLCBzY2hlbWEpIHtcclxuXHRpZiAodHlwZW9mIHNjaGVtYS5mb3JtYXQgIT09ICdzdHJpbmcnIHx8ICF0aGlzLmZvcm1hdFZhbGlkYXRvcnNbc2NoZW1hLmZvcm1hdF0pIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHR2YXIgZXJyb3JNZXNzYWdlID0gdGhpcy5mb3JtYXRWYWxpZGF0b3JzW3NjaGVtYS5mb3JtYXRdLmNhbGwobnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRpZiAodHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ251bWJlcicpIHtcclxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRk9STUFUX0NVU1RPTSwge21lc3NhZ2U6IGVycm9yTWVzc2FnZX0sICcnLCAnL2Zvcm1hdCcsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0fSBlbHNlIGlmIChlcnJvck1lc3NhZ2UgJiYgdHlwZW9mIGVycm9yTWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcclxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRk9STUFUX0NVU1RPTSwge21lc3NhZ2U6IGVycm9yTWVzc2FnZS5tZXNzYWdlIHx8IFwiP1wifSwgZXJyb3JNZXNzYWdlLmRhdGFQYXRoIHx8ICcnLCBlcnJvck1lc3NhZ2Uuc2NoZW1hUGF0aCB8fCBcIi9mb3JtYXRcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlRGVmaW5lZEtleXdvcmRzID0gZnVuY3Rpb24gKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0Zm9yICh2YXIga2V5IGluIHRoaXMuZGVmaW5lZEtleXdvcmRzKSB7XHJcblx0XHRpZiAodHlwZW9mIHNjaGVtYVtrZXldID09PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRjb250aW51ZTtcclxuXHRcdH1cclxuXHRcdHZhciB2YWxpZGF0aW9uRnVuY3Rpb25zID0gdGhpcy5kZWZpbmVkS2V5d29yZHNba2V5XTtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdmFsaWRhdGlvbkZ1bmN0aW9ucy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR2YXIgZnVuYyA9IHZhbGlkYXRpb25GdW5jdGlvbnNbaV07XHJcblx0XHRcdHZhciByZXN1bHQgPSBmdW5jKGRhdGEsIHNjaGVtYVtrZXldLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCk7XHJcblx0XHRcdGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgcmVzdWx0ID09PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuS0VZV09SRF9DVVNUT00sIHtrZXk6IGtleSwgbWVzc2FnZTogcmVzdWx0fSwgJycsICcnLCBudWxsLCBkYXRhLCBzY2hlbWEpLnByZWZpeFdpdGgobnVsbCwga2V5KTtcclxuXHRcdFx0fSBlbHNlIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcclxuXHRcdFx0XHR2YXIgY29kZSA9IHJlc3VsdC5jb2RlO1xyXG5cdFx0XHRcdGlmICh0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRcdGlmICghRXJyb3JDb2Rlc1tjb2RlXSkge1xyXG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuZGVmaW5lZCBlcnJvciBjb2RlICh1c2UgZGVmaW5lRXJyb3IpOiAnICsgY29kZSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRjb2RlID0gRXJyb3JDb2Rlc1tjb2RlXTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb2RlICE9PSAnbnVtYmVyJykge1xyXG5cdFx0XHRcdFx0Y29kZSA9IEVycm9yQ29kZXMuS0VZV09SRF9DVVNUT007XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBtZXNzYWdlUGFyYW1zID0gKHR5cGVvZiByZXN1bHQubWVzc2FnZSA9PT0gJ29iamVjdCcpID8gcmVzdWx0Lm1lc3NhZ2UgOiB7a2V5OiBrZXksIG1lc3NhZ2U6IHJlc3VsdC5tZXNzYWdlIHx8IFwiP1wifTtcclxuXHRcdFx0XHR2YXIgc2NoZW1hUGF0aCA9IHJlc3VsdC5zY2hlbWFQYXRoIHx8IChcIi9cIiArIGtleS5yZXBsYWNlKC9+L2csICd+MCcpLnJlcGxhY2UoL1xcLy9nLCAnfjEnKSk7XHJcblx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoY29kZSwgbWVzc2FnZVBhcmFtcywgcmVzdWx0LmRhdGFQYXRoIHx8IG51bGwsIHNjaGVtYVBhdGgsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5mdW5jdGlvbiByZWN1cnNpdmVDb21wYXJlKEEsIEIpIHtcclxuXHRpZiAoQSA9PT0gQikge1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fVxyXG5cdGlmIChBICYmIEIgJiYgdHlwZW9mIEEgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIEIgPT09IFwib2JqZWN0XCIpIHtcclxuXHRcdGlmIChBcnJheS5pc0FycmF5KEEpICE9PSBBcnJheS5pc0FycmF5KEIpKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShBKSkge1xyXG5cdFx0XHRpZiAoQS5sZW5ndGggIT09IEIubGVuZ3RoKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgQS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdGlmICghcmVjdXJzaXZlQ29tcGFyZShBW2ldLCBCW2ldKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dmFyIGtleTtcclxuXHRcdFx0Zm9yIChrZXkgaW4gQSkge1xyXG5cdFx0XHRcdGlmIChCW2tleV0gPT09IHVuZGVmaW5lZCAmJiBBW2tleV0gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRmb3IgKGtleSBpbiBCKSB7XHJcblx0XHRcdFx0aWYgKEFba2V5XSA9PT0gdW5kZWZpbmVkICYmIEJba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAoa2V5IGluIEEpIHtcclxuXHRcdFx0XHRpZiAoIXJlY3Vyc2l2ZUNvbXBhcmUoQVtrZXldLCBCW2tleV0pKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblx0cmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUJhc2ljID0gZnVuY3Rpb24gdmFsaWRhdGVCYXNpYyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlVHlwZShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdHJldHVybiBlcnJvci5wcmVmaXhXaXRoKG51bGwsIFwidHlwZVwiKTtcclxuXHR9XHJcblx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUVudW0oZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpKSB7XHJcblx0XHRyZXR1cm4gZXJyb3IucHJlZml4V2l0aChudWxsLCBcInR5cGVcIik7XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVUeXBlID0gZnVuY3Rpb24gdmFsaWRhdGVUeXBlKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmIChzY2hlbWEudHlwZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGRhdGFUeXBlID0gdHlwZW9mIGRhdGE7XHJcblx0aWYgKGRhdGEgPT09IG51bGwpIHtcclxuXHRcdGRhdGFUeXBlID0gXCJudWxsXCI7XHJcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcblx0XHRkYXRhVHlwZSA9IFwiYXJyYXlcIjtcclxuXHR9XHJcblx0dmFyIGFsbG93ZWRUeXBlcyA9IHNjaGVtYS50eXBlO1xyXG5cdGlmICghQXJyYXkuaXNBcnJheShhbGxvd2VkVHlwZXMpKSB7XHJcblx0XHRhbGxvd2VkVHlwZXMgPSBbYWxsb3dlZFR5cGVzXTtcclxuXHR9XHJcblxyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgYWxsb3dlZFR5cGVzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgdHlwZSA9IGFsbG93ZWRUeXBlc1tpXTtcclxuXHRcdGlmICh0eXBlID09PSBkYXRhVHlwZSB8fCAodHlwZSA9PT0gXCJpbnRlZ2VyXCIgJiYgZGF0YVR5cGUgPT09IFwibnVtYmVyXCIgJiYgKGRhdGEgJSAxID09PSAwKSkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuSU5WQUxJRF9UWVBFLCB7dHlwZTogZGF0YVR5cGUsIGV4cGVjdGVkOiBhbGxvd2VkVHlwZXMuam9pbihcIi9cIil9LCAnJywgJycsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUVudW0gPSBmdW5jdGlvbiB2YWxpZGF0ZUVudW0oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHNjaGVtYVtcImVudW1cIl0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hW1wiZW51bVwiXS5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIGVudW1WYWwgPSBzY2hlbWFbXCJlbnVtXCJdW2ldO1xyXG5cdFx0aWYgKHJlY3Vyc2l2ZUNvbXBhcmUoZGF0YSwgZW51bVZhbCkpIHtcclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuRU5VTV9NSVNNQVRDSCwge3ZhbHVlOiAodHlwZW9mIEpTT04gIT09ICd1bmRlZmluZWQnKSA/IEpTT04uc3RyaW5naWZ5KGRhdGEpIDogZGF0YX0sICcnLCAnJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTnVtZXJpYyA9IGZ1bmN0aW9uIHZhbGlkYXRlTnVtZXJpYyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHJldHVybiB0aGlzLnZhbGlkYXRlTXVsdGlwbGVPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVNaW5NYXgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlTmFOKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcbnZhciBDTE9TRV9FTk9VR0hfTE9XID0gTWF0aC5wb3coMiwgLTUxKTtcclxudmFyIENMT1NFX0VOT1VHSF9ISUdIID0gMSAtIENMT1NFX0VOT1VHSF9MT1c7XHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTXVsdGlwbGVPZiA9IGZ1bmN0aW9uIHZhbGlkYXRlTXVsdGlwbGVPZihkYXRhLCBzY2hlbWEpIHtcclxuXHR2YXIgbXVsdGlwbGVPZiA9IHNjaGVtYS5tdWx0aXBsZU9mIHx8IHNjaGVtYS5kaXZpc2libGVCeTtcclxuXHRpZiAobXVsdGlwbGVPZiA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiKSB7XHJcblx0XHR2YXIgcmVtYWluZGVyID0gKGRhdGEvbXVsdGlwbGVPZiklMTtcclxuXHRcdGlmIChyZW1haW5kZXIgPj0gQ0xPU0VfRU5PVUdIX0xPVyAmJiByZW1haW5kZXIgPCBDTE9TRV9FTk9VR0hfSElHSCkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5VTUJFUl9NVUxUSVBMRV9PRiwge3ZhbHVlOiBkYXRhLCBtdWx0aXBsZU9mOiBtdWx0aXBsZU9mfSwgJycsICcnLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTWluTWF4ID0gZnVuY3Rpb24gdmFsaWRhdGVNaW5NYXgoZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKHNjaGVtYS5taW5pbXVtICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhIDwgc2NoZW1hLm1pbmltdW0pIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5OVU1CRVJfTUlOSU1VTSwge3ZhbHVlOiBkYXRhLCBtaW5pbXVtOiBzY2hlbWEubWluaW11bX0sICcnLCAnL21pbmltdW0nLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdFx0aWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICYmIGRhdGEgPT09IHNjaGVtYS5taW5pbXVtKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuTlVNQkVSX01JTklNVU1fRVhDTFVTSVZFLCB7dmFsdWU6IGRhdGEsIG1pbmltdW06IHNjaGVtYS5taW5pbXVtfSwgJycsICcvZXhjbHVzaXZlTWluaW11bScsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWF4aW11bSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRpZiAoZGF0YSA+IHNjaGVtYS5tYXhpbXVtKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuTlVNQkVSX01BWElNVU0sIHt2YWx1ZTogZGF0YSwgbWF4aW11bTogc2NoZW1hLm1heGltdW19LCAnJywgJy9tYXhpbXVtJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdH1cclxuXHRcdGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAmJiBkYXRhID09PSBzY2hlbWEubWF4aW11bSkge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5VTUJFUl9NQVhJTVVNX0VYQ0xVU0lWRSwge3ZhbHVlOiBkYXRhLCBtYXhpbXVtOiBzY2hlbWEubWF4aW11bX0sICcnLCAnL2V4Y2x1c2l2ZU1heGltdW0nLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTmFOID0gZnVuY3Rpb24gdmFsaWRhdGVOYU4oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0aWYgKGlzTmFOKGRhdGEpID09PSB0cnVlIHx8IGRhdGEgPT09IEluZmluaXR5IHx8IGRhdGEgPT09IC1JbmZpbml0eSkge1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5OVU1CRVJfTk9UX0FfTlVNQkVSLCB7dmFsdWU6IGRhdGF9LCAnJywgJy90eXBlJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZyA9IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0cmV0dXJuIHRoaXMudmFsaWRhdGVTdHJpbmdMZW5ndGgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlU3RyaW5nUGF0dGVybihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZ0xlbmd0aCA9IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nTGVuZ3RoKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWluTGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA8IHNjaGVtYS5taW5MZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5TVFJJTkdfTEVOR1RIX1NIT1JULCB7bGVuZ3RoOiBkYXRhLmxlbmd0aCwgbWluaW11bTogc2NoZW1hLm1pbkxlbmd0aH0sICcnLCAnL21pbkxlbmd0aCcsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHR9XHJcblx0fVxyXG5cdGlmIChzY2hlbWEubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA+IHNjaGVtYS5tYXhMZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5TVFJJTkdfTEVOR1RIX0xPTkcsIHtsZW5ndGg6IGRhdGEubGVuZ3RoLCBtYXhpbXVtOiBzY2hlbWEubWF4TGVuZ3RofSwgJycsICcvbWF4TGVuZ3RoJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZVN0cmluZ1BhdHRlcm4gPSBmdW5jdGlvbiB2YWxpZGF0ZVN0cmluZ1BhdHRlcm4oZGF0YSwgc2NoZW1hKSB7XHJcblx0aWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8ICh0eXBlb2Ygc2NoZW1hLnBhdHRlcm4gIT09IFwic3RyaW5nXCIgJiYgIShzY2hlbWEucGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkpKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIHJlZ2V4cDtcclxuXHRpZiAoc2NoZW1hLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApIHtcclxuXHQgIHJlZ2V4cCA9IHNjaGVtYS5wYXR0ZXJuO1xyXG5cdH1cclxuXHRlbHNlIHtcclxuXHQgIHZhciBib2R5LCBmbGFncyA9ICcnO1xyXG5cdCAgLy8gQ2hlY2sgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaXRlcmFsc1xyXG5cdCAgLy8gQHNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtNy44LjVcclxuXHQgIHZhciBsaXRlcmFsID0gc2NoZW1hLnBhdHRlcm4ubWF0Y2goL15cXC8oLispXFwvKFtpbWddKikkLyk7XHJcblx0ICBpZiAobGl0ZXJhbCkge1xyXG5cdCAgICBib2R5ID0gbGl0ZXJhbFsxXTtcclxuXHQgICAgZmxhZ3MgPSBsaXRlcmFsWzJdO1xyXG5cdCAgfVxyXG5cdCAgZWxzZSB7XHJcblx0ICAgIGJvZHkgPSBzY2hlbWEucGF0dGVybjtcclxuXHQgIH1cclxuXHQgIHJlZ2V4cCA9IG5ldyBSZWdFeHAoYm9keSwgZmxhZ3MpO1xyXG5cdH1cclxuXHRpZiAoIXJlZ2V4cC50ZXN0KGRhdGEpKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLlNUUklOR19QQVRURVJOLCB7cGF0dGVybjogc2NoZW1hLnBhdHRlcm59LCAnJywgJy9wYXR0ZXJuJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFycmF5ID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheShkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHJldHVybiB0aGlzLnZhbGlkYXRlQXJyYXlMZW5ndGgoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlQXJyYXlVbmlxdWVJdGVtcyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IHRoaXMudmFsaWRhdGVBcnJheUl0ZW1zKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQXJyYXlMZW5ndGggPSBmdW5jdGlvbiB2YWxpZGF0ZUFycmF5TGVuZ3RoKGRhdGEsIHNjaGVtYSkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoc2NoZW1hLm1pbkl0ZW1zICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA8IHNjaGVtYS5taW5JdGVtcykge1xyXG5cdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9MRU5HVEhfU0hPUlQsIHtsZW5ndGg6IGRhdGEubGVuZ3RoLCBtaW5pbXVtOiBzY2hlbWEubWluSXRlbXN9LCAnJywgJy9taW5JdGVtcycsIG51bGwsIGRhdGEsIHNjaGVtYSk7XHJcblx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRpZiAoc2NoZW1hLm1heEl0ZW1zICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChkYXRhLmxlbmd0aCA+IHNjaGVtYS5tYXhJdGVtcykge1xyXG5cdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9MRU5HVEhfTE9ORywge2xlbmd0aDogZGF0YS5sZW5ndGgsIG1heGltdW06IHNjaGVtYS5tYXhJdGVtc30sICcnLCAnL21heEl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVBcnJheVVuaXF1ZUl0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheVVuaXF1ZUl0ZW1zKGRhdGEsIHNjaGVtYSkge1xyXG5cdGlmIChzY2hlbWEudW5pcXVlSXRlbXMpIHtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRmb3IgKHZhciBqID0gaSArIDE7IGogPCBkYXRhLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0aWYgKHJlY3Vyc2l2ZUNvbXBhcmUoZGF0YVtpXSwgZGF0YVtqXSkpIHtcclxuXHRcdFx0XHRcdHZhciBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BUlJBWV9VTklRVUUsIHttYXRjaDE6IGksIG1hdGNoMjogan0sICcnLCAnL3VuaXF1ZUl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVBcnJheUl0ZW1zID0gZnVuY3Rpb24gdmFsaWRhdGVBcnJheUl0ZW1zKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0aWYgKHNjaGVtYS5pdGVtcyA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9yLCBpO1xyXG5cdGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5pdGVtcykpIHtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmIChpIDwgc2NoZW1hLml0ZW1zLmxlbmd0aCkge1xyXG5cdFx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YVtpXSwgc2NoZW1hLml0ZW1zW2ldLCBbaV0sIFtcIml0ZW1zXCIsIGldLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2UgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hLmFkZGl0aW9uYWxJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcclxuXHRcdFx0XHRcdGlmICghc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykge1xyXG5cdFx0XHRcdFx0XHRlcnJvciA9ICh0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuQVJSQVlfQURESVRJT05BTF9JVEVNUywge30sICcvJyArIGksICcvYWRkaXRpb25hbEl0ZW1zJywgbnVsbCwgZGF0YSwgc2NoZW1hKSk7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFbaV0sIHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMsIFtpXSwgW1wiYWRkaXRpb25hbEl0ZW1zXCJdLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YVtpXSwgc2NoZW1hLml0ZW1zLCBbaV0sIFtcIml0ZW1zXCJdLCBkYXRhUG9pbnRlclBhdGggKyBcIi9cIiArIGkpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVPYmplY3QgPSBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICh0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCBkYXRhID09PSBudWxsIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuXHRcdHJldHVybiBudWxsO1xyXG5cdH1cclxuXHRyZXR1cm4gdGhpcy52YWxpZGF0ZU9iamVjdE1pbk1heFByb3BlcnRpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlT2JqZWN0UmVxdWlyZWRQcm9wZXJ0aWVzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9iamVjdFByb3BlcnRpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpXHJcblx0XHR8fCB0aGlzLnZhbGlkYXRlT2JqZWN0RGVwZW5kZW5jaWVzKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0TWluTWF4UHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0TWluTWF4UHJvcGVydGllcyhkYXRhLCBzY2hlbWEpIHtcclxuXHR2YXIga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xyXG5cdHZhciBlcnJvcjtcclxuXHRpZiAoc2NoZW1hLm1pblByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0aWYgKGtleXMubGVuZ3RoIDwgc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcclxuXHRcdFx0ZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuT0JKRUNUX1BST1BFUlRJRVNfTUlOSU1VTSwge3Byb3BlcnR5Q291bnQ6IGtleXMubGVuZ3RoLCBtaW5pbXVtOiBzY2hlbWEubWluUHJvcGVydGllc30sICcnLCAnL21pblByb3BlcnRpZXMnLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHRpZiAodGhpcy5oYW5kbGVFcnJvcihlcnJvcikpIHtcclxuXHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHNjaGVtYS5tYXhQcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGlmIChrZXlzLmxlbmd0aCA+IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XHJcblx0XHRcdGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9CSkVDVF9QUk9QRVJUSUVTX01BWElNVU0sIHtwcm9wZXJ0eUNvdW50OiBrZXlzLmxlbmd0aCwgbWF4aW11bTogc2NoZW1hLm1heFByb3BlcnRpZXN9LCAnJywgJy9tYXhQcm9wZXJ0aWVzJywgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuVmFsaWRhdG9yQ29udGV4dC5wcm90b3R5cGUudmFsaWRhdGVPYmplY3RSZXF1aXJlZFByb3BlcnRpZXMgPSBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdFJlcXVpcmVkUHJvcGVydGllcyhkYXRhLCBzY2hlbWEpIHtcclxuXHRpZiAoc2NoZW1hLnJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdHZhciBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XHJcblx0XHRcdGlmIChkYXRhW2tleV0gPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdHZhciBlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PQkpFQ1RfUkVRVUlSRUQsIHtrZXk6IGtleX0sICcnLCAnL3JlcXVpcmVkLycgKyBpLCBudWxsLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0UHJvcGVydGllcyA9IGZ1bmN0aW9uIHZhbGlkYXRlT2JqZWN0UHJvcGVydGllcyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdHZhciBlcnJvcjtcclxuXHRmb3IgKHZhciBrZXkgaW4gZGF0YSkge1xyXG5cdFx0dmFyIGtleVBvaW50ZXJQYXRoID0gZGF0YVBvaW50ZXJQYXRoICsgXCIvXCIgKyBrZXkucmVwbGFjZSgvfi9nLCAnfjAnKS5yZXBsYWNlKC9cXC8vZywgJ34xJyk7XHJcblx0XHR2YXIgZm91bmRNYXRjaCA9IGZhbHNlO1xyXG5cdFx0aWYgKHNjaGVtYS5wcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLnByb3BlcnRpZXNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGZvdW5kTWF0Y2ggPSB0cnVlO1xyXG5cdFx0XHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFba2V5XSwgc2NoZW1hLnByb3BlcnRpZXNba2V5XSwgW2tleV0sIFtcInByb3BlcnRpZXNcIiwga2V5XSwga2V5UG9pbnRlclBhdGgpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0Zm9yICh2YXIgcGF0dGVybktleSBpbiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHR2YXIgcmVnZXhwID0gbmV3IFJlZ0V4cChwYXR0ZXJuS2V5KTtcclxuXHRcdFx0XHRpZiAocmVnZXhwLnRlc3Qoa2V5KSkge1xyXG5cdFx0XHRcdFx0Zm91bmRNYXRjaCA9IHRydWU7XHJcblx0XHRcdFx0XHRpZiAoZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGFba2V5XSwgc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5LZXldLCBba2V5XSwgW1wicGF0dGVyblByb3BlcnRpZXNcIiwgcGF0dGVybktleV0sIGtleVBvaW50ZXJQYXRoKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRpZiAoIWZvdW5kTWF0Y2gpIHtcclxuXHRcdFx0aWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0XHRcdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzW2tleVBvaW50ZXJQYXRoXTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0aWYgKHR5cGVvZiBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IFwiYm9vbGVhblwiKSB7XHJcblx0XHRcdFx0XHRpZiAoIXNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcykge1xyXG5cdFx0XHRcdFx0XHRlcnJvciA9IHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PQkpFQ1RfQURESVRJT05BTF9QUk9QRVJUSUVTLCB7a2V5OiBrZXl9LCAnJywgJy9hZGRpdGlvbmFsUHJvcGVydGllcycsIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChrZXksIG51bGwpO1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5oYW5kbGVFcnJvcihlcnJvcikpIHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhW2tleV0sIHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcywgW2tleV0sIFtcImFkZGl0aW9uYWxQcm9wZXJ0aWVzXCJdLCBrZXlQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSBlbHNlIGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMgJiYgIXRoaXMua25vd25Qcm9wZXJ0eVBhdGhzW2tleVBvaW50ZXJQYXRoXSkge1xyXG5cdFx0XHRcdHRoaXMudW5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0fVxyXG5cdFx0fSBlbHNlIGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdID0gdHJ1ZTtcclxuXHRcdFx0ZGVsZXRlIHRoaXMudW5rbm93blByb3BlcnR5UGF0aHNba2V5UG9pbnRlclBhdGhdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlT2JqZWN0RGVwZW5kZW5jaWVzID0gZnVuY3Rpb24gdmFsaWRhdGVPYmplY3REZXBlbmRlbmNpZXMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHR2YXIgZXJyb3I7XHJcblx0aWYgKHNjaGVtYS5kZXBlbmRlbmNpZXMgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0Zm9yICh2YXIgZGVwS2V5IGluIHNjaGVtYS5kZXBlbmRlbmNpZXMpIHtcclxuXHRcdFx0aWYgKGRhdGFbZGVwS2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0dmFyIGRlcCA9IHNjaGVtYS5kZXBlbmRlbmNpZXNbZGVwS2V5XTtcclxuXHRcdFx0XHRpZiAodHlwZW9mIGRlcCA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdFx0aWYgKGRhdGFbZGVwXSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdGVycm9yID0gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9CSkVDVF9ERVBFTkRFTkNZX0tFWSwge2tleTogZGVwS2V5LCBtaXNzaW5nOiBkZXB9LCAnJywgJycsIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChudWxsLCBkZXBLZXkpLnByZWZpeFdpdGgobnVsbCwgXCJkZXBlbmRlbmNpZXNcIik7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmhhbmRsZUVycm9yKGVycm9yKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBlcnJvcjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkZXApKSB7XHJcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcC5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHR2YXIgcmVxdWlyZWRLZXkgPSBkZXBbaV07XHJcblx0XHRcdFx0XHRcdGlmIChkYXRhW3JlcXVpcmVkS2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0ZXJyb3IgPSB0aGlzLmNyZWF0ZUVycm9yKEVycm9yQ29kZXMuT0JKRUNUX0RFUEVOREVOQ1lfS0VZLCB7a2V5OiBkZXBLZXksIG1pc3Npbmc6IHJlcXVpcmVkS2V5fSwgJycsICcvJyArIGksIG51bGwsIGRhdGEsIHNjaGVtYSkucHJlZml4V2l0aChudWxsLCBkZXBLZXkpLnByZWZpeFdpdGgobnVsbCwgXCJkZXBlbmRlbmNpZXNcIik7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXJyb3I7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgZGVwLCBbXSwgW1wiZGVwZW5kZW5jaWVzXCIsIGRlcEtleV0sIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQ29tYmluYXRpb25zID0gZnVuY3Rpb24gdmFsaWRhdGVDb21iaW5hdGlvbnMoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHRyZXR1cm4gdGhpcy52YWxpZGF0ZUFsbE9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZUFueU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU9uZU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKVxyXG5cdFx0fHwgdGhpcy52YWxpZGF0ZU5vdChkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aClcclxuXHRcdHx8IG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUFsbE9mID0gZnVuY3Rpb24gdmFsaWRhdGVBbGxPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmIChzY2hlbWEuYWxsT2YgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHZhciBlcnJvcjtcclxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5hbGxPZi5sZW5ndGg7IGkrKykge1xyXG5cdFx0dmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5hbGxPZltpXTtcclxuXHRcdGlmIChlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgc3ViU2NoZW1hLCBbXSwgW1wiYWxsT2ZcIiwgaV0sIGRhdGFQb2ludGVyUGF0aCkpIHtcclxuXHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0fVxyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlQW55T2YgPSBmdW5jdGlvbiB2YWxpZGF0ZUFueU9mKGRhdGEsIHNjaGVtYSwgZGF0YVBvaW50ZXJQYXRoKSB7XHJcblx0aWYgKHNjaGVtYS5hbnlPZiA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9ycyA9IFtdO1xyXG5cdHZhciBzdGFydEVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzLCBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0b2xkVW5rbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzID0gdGhpcy5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdHZhciBlcnJvckF0RW5kID0gdHJ1ZTtcclxuXHRmb3IgKHZhciBpID0gMDsgaSA8IHNjaGVtYS5hbnlPZi5sZW5ndGg7IGkrKykge1xyXG5cdFx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0XHR0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHRcdHRoaXMua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHR9XHJcblx0XHR2YXIgc3ViU2NoZW1hID0gc2NoZW1hLmFueU9mW2ldO1xyXG5cclxuXHRcdHZhciBlcnJvckNvdW50ID0gdGhpcy5lcnJvcnMubGVuZ3RoO1xyXG5cdFx0dmFyIGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhLCBzdWJTY2hlbWEsIFtdLCBbXCJhbnlPZlwiLCBpXSwgZGF0YVBvaW50ZXJQYXRoKTtcclxuXHJcblx0XHRpZiAoZXJyb3IgPT09IG51bGwgJiYgZXJyb3JDb3VudCA9PT0gdGhpcy5lcnJvcnMubGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgc3RhcnRFcnJvckNvdW50KTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBrbm93bktleSBpbiB0aGlzLmtub3duUHJvcGVydHlQYXRocykge1xyXG5cdFx0XHRcdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzW2tub3duS2V5XSA9IHRydWU7XHJcblx0XHRcdFx0XHRkZWxldGUgb2xkVW5rbm93blByb3BlcnR5UGF0aHNba25vd25LZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRmb3IgKHZhciB1bmtub3duS2V5IGluIHRoaXMudW5rbm93blByb3BlcnR5UGF0aHMpIHtcclxuXHRcdFx0XHRcdGlmICghb2xkS25vd25Qcm9wZXJ0eVBhdGhzW3Vua25vd25LZXldKSB7XHJcblx0XHRcdFx0XHRcdG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzW3Vua25vd25LZXldID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Ly8gV2UgbmVlZCB0byBjb250aW51ZSBsb29waW5nIHNvIHdlIGNhdGNoIGFsbCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbnMsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHJldHVybiBhbiBlcnJvclxyXG5cdFx0XHRcdGVycm9yQXRFbmQgPSBmYWxzZTtcclxuXHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIG51bGw7XHJcblx0XHR9XHJcblx0XHRpZiAoZXJyb3IpIHtcclxuXHRcdFx0ZXJyb3JzLnB1c2goZXJyb3IucHJlZml4V2l0aChudWxsLCBcIlwiICsgaSkucHJlZml4V2l0aChudWxsLCBcImFueU9mXCIpKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmIChlcnJvckF0RW5kKSB7XHJcblx0XHRlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCkpO1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5BTllfT0ZfTUlTU0lORywge30sIFwiXCIsIFwiL2FueU9mXCIsIGVycm9ycywgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZU9uZU9mID0gZnVuY3Rpb24gdmFsaWRhdGVPbmVPZihkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmIChzY2hlbWEub25lT2YgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cdHZhciB2YWxpZEluZGV4ID0gbnVsbDtcclxuXHR2YXIgZXJyb3JzID0gW107XHJcblx0dmFyIHN0YXJ0RXJyb3JDb3VudCA9IHRoaXMuZXJyb3JzLmxlbmd0aDtcclxuXHR2YXIgb2xkVW5rbm93blByb3BlcnR5UGF0aHMsIG9sZEtub3duUHJvcGVydHlQYXRocztcclxuXHRpZiAodGhpcy50cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRvbGRVbmtub3duUHJvcGVydHlQYXRocyA9IHRoaXMudW5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0XHRvbGRLbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLmtub3duUHJvcGVydHlQYXRocztcclxuXHR9XHJcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlbWEub25lT2YubGVuZ3RoOyBpKyspIHtcclxuXHRcdGlmICh0aGlzLnRyYWNrVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdFx0XHR0aGlzLmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdFx0fVxyXG5cdFx0dmFyIHN1YlNjaGVtYSA9IHNjaGVtYS5vbmVPZltpXTtcclxuXHJcblx0XHR2YXIgZXJyb3JDb3VudCA9IHRoaXMuZXJyb3JzLmxlbmd0aDtcclxuXHRcdHZhciBlcnJvciA9IHRoaXMudmFsaWRhdGVBbGwoZGF0YSwgc3ViU2NoZW1hLCBbXSwgW1wib25lT2ZcIiwgaV0sIGRhdGFQb2ludGVyUGF0aCk7XHJcblxyXG5cdFx0aWYgKGVycm9yID09PSBudWxsICYmIGVycm9yQ291bnQgPT09IHRoaXMuZXJyb3JzLmxlbmd0aCkge1xyXG5cdFx0XHRpZiAodmFsaWRJbmRleCA9PT0gbnVsbCkge1xyXG5cdFx0XHRcdHZhbGlkSW5kZXggPSBpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgc3RhcnRFcnJvckNvdW50KTtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk9ORV9PRl9NVUxUSVBMRSwge2luZGV4MTogdmFsaWRJbmRleCwgaW5kZXgyOiBpfSwgXCJcIiwgXCIvb25lT2ZcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodGhpcy50cmFja1Vua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRcdFx0Zm9yICh2YXIga25vd25LZXkgaW4gdGhpcy5rbm93blByb3BlcnR5UGF0aHMpIHtcclxuXHRcdFx0XHRcdG9sZEtub3duUHJvcGVydHlQYXRoc1trbm93bktleV0gPSB0cnVlO1xyXG5cdFx0XHRcdFx0ZGVsZXRlIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzW2tub3duS2V5XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0Zm9yICh2YXIgdW5rbm93bktleSBpbiB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzKSB7XHJcblx0XHRcdFx0XHRpZiAoIW9sZEtub3duUHJvcGVydHlQYXRoc1t1bmtub3duS2V5XSkge1xyXG5cdFx0XHRcdFx0XHRvbGRVbmtub3duUHJvcGVydHlQYXRoc1t1bmtub3duS2V5XSA9IHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2UgaWYgKGVycm9yKSB7XHJcblx0XHRcdGVycm9ycy5wdXNoKGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmICh2YWxpZEluZGV4ID09PSBudWxsKSB7XHJcblx0XHRlcnJvcnMgPSBlcnJvcnMuY29uY2F0KHRoaXMuZXJyb3JzLnNsaWNlKHN0YXJ0RXJyb3JDb3VudCkpO1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlRXJyb3IoRXJyb3JDb2Rlcy5PTkVfT0ZfTUlTU0lORywge30sIFwiXCIsIFwiL29uZU9mXCIsIGVycm9ycywgZGF0YSwgc2NoZW1hKTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0dGhpcy5lcnJvcnMgPSB0aGlzLmVycm9ycy5zbGljZSgwLCBzdGFydEVycm9yQ291bnQpO1xyXG5cdH1cclxuXHRyZXR1cm4gbnVsbDtcclxufTtcclxuXHJcblZhbGlkYXRvckNvbnRleHQucHJvdG90eXBlLnZhbGlkYXRlTm90ID0gZnVuY3Rpb24gdmFsaWRhdGVOb3QoZGF0YSwgc2NoZW1hLCBkYXRhUG9pbnRlclBhdGgpIHtcclxuXHRpZiAoc2NoZW1hLm5vdCA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIG9sZEVycm9yQ291bnQgPSB0aGlzLmVycm9ycy5sZW5ndGg7XHJcblx0dmFyIG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzLCBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0b2xkVW5rbm93blByb3BlcnR5UGF0aHMgPSB0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0b2xkS25vd25Qcm9wZXJ0eVBhdGhzID0gdGhpcy5rbm93blByb3BlcnR5UGF0aHM7XHJcblx0XHR0aGlzLnVua25vd25Qcm9wZXJ0eVBhdGhzID0ge307XHJcblx0XHR0aGlzLmtub3duUHJvcGVydHlQYXRocyA9IHt9O1xyXG5cdH1cclxuXHR2YXIgZXJyb3IgPSB0aGlzLnZhbGlkYXRlQWxsKGRhdGEsIHNjaGVtYS5ub3QsIG51bGwsIG51bGwsIGRhdGFQb2ludGVyUGF0aCk7XHJcblx0dmFyIG5vdEVycm9ycyA9IHRoaXMuZXJyb3JzLnNsaWNlKG9sZEVycm9yQ291bnQpO1xyXG5cdHRoaXMuZXJyb3JzID0gdGhpcy5lcnJvcnMuc2xpY2UoMCwgb2xkRXJyb3JDb3VudCk7XHJcblx0aWYgKHRoaXMudHJhY2tVbmtub3duUHJvcGVydGllcykge1xyXG5cdFx0dGhpcy51bmtub3duUHJvcGVydHlQYXRocyA9IG9sZFVua25vd25Qcm9wZXJ0eVBhdGhzO1xyXG5cdFx0dGhpcy5rbm93blByb3BlcnR5UGF0aHMgPSBvbGRLbm93blByb3BlcnR5UGF0aHM7XHJcblx0fVxyXG5cdGlmIChlcnJvciA9PT0gbnVsbCAmJiBub3RFcnJvcnMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVFcnJvcihFcnJvckNvZGVzLk5PVF9QQVNTRUQsIHt9LCBcIlwiLCBcIi9ub3RcIiwgbnVsbCwgZGF0YSwgc2NoZW1hKTtcclxuXHR9XHJcblx0cmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5WYWxpZGF0b3JDb250ZXh0LnByb3RvdHlwZS52YWxpZGF0ZUh5cGVybWVkaWEgPSBmdW5jdGlvbiB2YWxpZGF0ZUNvbWJpbmF0aW9ucyhkYXRhLCBzY2hlbWEsIGRhdGFQb2ludGVyUGF0aCkge1xyXG5cdGlmICghc2NoZW1hLmxpbmtzKSB7XHJcblx0XHRyZXR1cm4gbnVsbDtcclxuXHR9XHJcblx0dmFyIGVycm9yO1xyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hLmxpbmtzLmxlbmd0aDsgaSsrKSB7XHJcblx0XHR2YXIgbGRvID0gc2NoZW1hLmxpbmtzW2ldO1xyXG5cdFx0aWYgKGxkby5yZWwgPT09IFwiZGVzY3JpYmVkYnlcIikge1xyXG5cdFx0XHR2YXIgdGVtcGxhdGUgPSBuZXcgVXJpVGVtcGxhdGUobGRvLmhyZWYpO1xyXG5cdFx0XHR2YXIgYWxsUHJlc2VudCA9IHRydWU7XHJcblx0XHRcdGZvciAodmFyIGogPSAwOyBqIDwgdGVtcGxhdGUudmFyTmFtZXMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRpZiAoISh0ZW1wbGF0ZS52YXJOYW1lc1tqXSBpbiBkYXRhKSkge1xyXG5cdFx0XHRcdFx0YWxsUHJlc2VudCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChhbGxQcmVzZW50KSB7XHJcblx0XHRcdFx0dmFyIHNjaGVtYVVybCA9IHRlbXBsYXRlLmZpbGxGcm9tT2JqZWN0KGRhdGEpO1xyXG5cdFx0XHRcdHZhciBzdWJTY2hlbWEgPSB7XCIkcmVmXCI6IHNjaGVtYVVybH07XHJcblx0XHRcdFx0aWYgKGVycm9yID0gdGhpcy52YWxpZGF0ZUFsbChkYXRhLCBzdWJTY2hlbWEsIFtdLCBbXCJsaW5rc1wiLCBpXSwgZGF0YVBvaW50ZXJQYXRoKSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGVycm9yO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufTtcclxuXHJcbi8vIHBhcnNlVVJJKCkgYW5kIHJlc29sdmVVcmwoKSBhcmUgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xMDg4ODUwXHJcbi8vICAgLSAgcmVsZWFzZWQgYXMgcHVibGljIGRvbWFpbiBieSBhdXRob3IgKFwiWWFmZmxlXCIpIC0gc2VlIGNvbW1lbnRzIG9uIGdpc3RcclxuXHJcbmZ1bmN0aW9uIHBhcnNlVVJJKHVybCkge1xyXG5cdHZhciBtID0gU3RyaW5nKHVybCkucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpLm1hdGNoKC9eKFteOlxcLz8jXSs6KT8oXFwvXFwvKD86W146QF0qKD86OlteOkBdKik/QCk/KChbXjpcXC8/I10qKSg/OjooXFxkKikpPykpPyhbXj8jXSopKFxcP1teI10qKT8oI1tcXHNcXFNdKik/Lyk7XHJcblx0Ly8gYXV0aG9yaXR5ID0gJy8vJyArIHVzZXIgKyAnOicgKyBwYXNzICdAJyArIGhvc3RuYW1lICsgJzonIHBvcnRcclxuXHRyZXR1cm4gKG0gPyB7XHJcblx0XHRocmVmICAgICA6IG1bMF0gfHwgJycsXHJcblx0XHRwcm90b2NvbCA6IG1bMV0gfHwgJycsXHJcblx0XHRhdXRob3JpdHk6IG1bMl0gfHwgJycsXHJcblx0XHRob3N0ICAgICA6IG1bM10gfHwgJycsXHJcblx0XHRob3N0bmFtZSA6IG1bNF0gfHwgJycsXHJcblx0XHRwb3J0ICAgICA6IG1bNV0gfHwgJycsXHJcblx0XHRwYXRobmFtZSA6IG1bNl0gfHwgJycsXHJcblx0XHRzZWFyY2ggICA6IG1bN10gfHwgJycsXHJcblx0XHRoYXNoICAgICA6IG1bOF0gfHwgJydcclxuXHR9IDogbnVsbCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVVcmwoYmFzZSwgaHJlZikgey8vIFJGQyAzOTg2XHJcblxyXG5cdGZ1bmN0aW9uIHJlbW92ZURvdFNlZ21lbnRzKGlucHV0KSB7XHJcblx0XHR2YXIgb3V0cHV0ID0gW107XHJcblx0XHRpbnB1dC5yZXBsYWNlKC9eKFxcLlxcLj8oXFwvfCQpKSsvLCAnJylcclxuXHRcdFx0LnJlcGxhY2UoL1xcLyhcXC4oXFwvfCQpKSsvZywgJy8nKVxyXG5cdFx0XHQucmVwbGFjZSgvXFwvXFwuXFwuJC8sICcvLi4vJylcclxuXHRcdFx0LnJlcGxhY2UoL1xcLz9bXlxcL10qL2csIGZ1bmN0aW9uIChwKSB7XHJcblx0XHRcdFx0aWYgKHAgPT09ICcvLi4nKSB7XHJcblx0XHRcdFx0XHRvdXRwdXQucG9wKCk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHApO1xyXG5cdFx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKS5yZXBsYWNlKC9eXFwvLywgaW5wdXQuY2hhckF0KDApID09PSAnLycgPyAnLycgOiAnJyk7XHJcblx0fVxyXG5cclxuXHRocmVmID0gcGFyc2VVUkkoaHJlZiB8fCAnJyk7XHJcblx0YmFzZSA9IHBhcnNlVVJJKGJhc2UgfHwgJycpO1xyXG5cclxuXHRyZXR1cm4gIWhyZWYgfHwgIWJhc2UgPyBudWxsIDogKGhyZWYucHJvdG9jb2wgfHwgYmFzZS5wcm90b2NvbCkgK1xyXG5cdFx0KGhyZWYucHJvdG9jb2wgfHwgaHJlZi5hdXRob3JpdHkgPyBocmVmLmF1dGhvcml0eSA6IGJhc2UuYXV0aG9yaXR5KSArXHJcblx0XHRyZW1vdmVEb3RTZWdtZW50cyhocmVmLnByb3RvY29sIHx8IGhyZWYuYXV0aG9yaXR5IHx8IGhyZWYucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycgPyBocmVmLnBhdGhuYW1lIDogKGhyZWYucGF0aG5hbWUgPyAoKGJhc2UuYXV0aG9yaXR5ICYmICFiYXNlLnBhdGhuYW1lID8gJy8nIDogJycpICsgYmFzZS5wYXRobmFtZS5zbGljZSgwLCBiYXNlLnBhdGhuYW1lLmxhc3RJbmRleE9mKCcvJykgKyAxKSArIGhyZWYucGF0aG5hbWUpIDogYmFzZS5wYXRobmFtZSkpICtcclxuXHRcdChocmVmLnByb3RvY29sIHx8IGhyZWYuYXV0aG9yaXR5IHx8IGhyZWYucGF0aG5hbWUgPyBocmVmLnNlYXJjaCA6IChocmVmLnNlYXJjaCB8fCBiYXNlLnNlYXJjaCkpICtcclxuXHRcdGhyZWYuaGFzaDtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRVcmkodXJpKSB7XHJcblx0cmV0dXJuIHVyaS5zcGxpdCgnIycpWzBdO1xyXG59XHJcbmZ1bmN0aW9uIG5vcm1TY2hlbWEoc2NoZW1hLCBiYXNlVXJpKSB7XHJcblx0aWYgKHNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiKSB7XHJcblx0XHRpZiAoYmFzZVVyaSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGJhc2VVcmkgPSBzY2hlbWEuaWQ7XHJcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBzY2hlbWEuaWQgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0YmFzZVVyaSA9IHJlc29sdmVVcmwoYmFzZVVyaSwgc2NoZW1hLmlkKTtcclxuXHRcdFx0c2NoZW1hLmlkID0gYmFzZVVyaTtcclxuXHRcdH1cclxuXHRcdGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcclxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlbWEubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRub3JtU2NoZW1hKHNjaGVtYVtpXSwgYmFzZVVyaSk7XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hWyckcmVmJ10gPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRzY2hlbWFbJyRyZWYnXSA9IHJlc29sdmVVcmwoYmFzZVVyaSwgc2NoZW1hWyckcmVmJ10pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAodmFyIGtleSBpbiBzY2hlbWEpIHtcclxuXHRcdFx0XHRpZiAoa2V5ICE9PSBcImVudW1cIikge1xyXG5cdFx0XHRcdFx0bm9ybVNjaGVtYShzY2hlbWFba2V5XSwgYmFzZVVyaSk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBkZWZhdWx0RXJyb3JSZXBvcnRlcihsYW5ndWFnZSkge1xyXG5cdGxhbmd1YWdlID0gbGFuZ3VhZ2UgfHwgJ2VuJztcclxuXHJcblx0dmFyIGVycm9yTWVzc2FnZXMgPSBsYW5ndWFnZXNbbGFuZ3VhZ2VdO1xyXG5cclxuXHRyZXR1cm4gZnVuY3Rpb24gKGVycm9yKSB7XHJcblx0XHR2YXIgbWVzc2FnZVRlbXBsYXRlID0gZXJyb3JNZXNzYWdlc1tlcnJvci5jb2RlXSB8fCBFcnJvck1lc3NhZ2VzRGVmYXVsdFtlcnJvci5jb2RlXTtcclxuXHRcdGlmICh0eXBlb2YgbWVzc2FnZVRlbXBsYXRlICE9PSAnc3RyaW5nJykge1xyXG5cdFx0XHRyZXR1cm4gXCJVbmtub3duIGVycm9yIGNvZGUgXCIgKyBlcnJvci5jb2RlICsgXCI6IFwiICsgSlNPTi5zdHJpbmdpZnkoZXJyb3IubWVzc2FnZVBhcmFtcyk7XHJcblx0XHR9XHJcblx0XHR2YXIgbWVzc2FnZVBhcmFtcyA9IGVycm9yLnBhcmFtcztcclxuXHRcdC8vIEFkYXB0ZWQgZnJvbSBDcm9ja2ZvcmQncyBzdXBwbGFudCgpXHJcblx0XHRyZXR1cm4gbWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoL1xceyhbXnt9XSopXFx9L2csIGZ1bmN0aW9uICh3aG9sZSwgdmFyTmFtZSkge1xyXG5cdFx0XHR2YXIgc3ViVmFsdWUgPSBtZXNzYWdlUGFyYW1zW3Zhck5hbWVdO1xyXG5cdFx0XHRyZXR1cm4gdHlwZW9mIHN1YlZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygc3ViVmFsdWUgPT09ICdudW1iZXInID8gc3ViVmFsdWUgOiB3aG9sZTtcclxuXHRcdH0pO1xyXG5cdH07XHJcbn1cclxuXHJcbnZhciBFcnJvckNvZGVzID0ge1xyXG5cdElOVkFMSURfVFlQRTogMCxcclxuXHRFTlVNX01JU01BVENIOiAxLFxyXG5cdEFOWV9PRl9NSVNTSU5HOiAxMCxcclxuXHRPTkVfT0ZfTUlTU0lORzogMTEsXHJcblx0T05FX09GX01VTFRJUExFOiAxMixcclxuXHROT1RfUEFTU0VEOiAxMyxcclxuXHQvLyBOdW1lcmljIGVycm9yc1xyXG5cdE5VTUJFUl9NVUxUSVBMRV9PRjogMTAwLFxyXG5cdE5VTUJFUl9NSU5JTVVNOiAxMDEsXHJcblx0TlVNQkVSX01JTklNVU1fRVhDTFVTSVZFOiAxMDIsXHJcblx0TlVNQkVSX01BWElNVU06IDEwMyxcclxuXHROVU1CRVJfTUFYSU1VTV9FWENMVVNJVkU6IDEwNCxcclxuXHROVU1CRVJfTk9UX0FfTlVNQkVSOiAxMDUsXHJcblx0Ly8gU3RyaW5nIGVycm9yc1xyXG5cdFNUUklOR19MRU5HVEhfU0hPUlQ6IDIwMCxcclxuXHRTVFJJTkdfTEVOR1RIX0xPTkc6IDIwMSxcclxuXHRTVFJJTkdfUEFUVEVSTjogMjAyLFxyXG5cdC8vIE9iamVjdCBlcnJvcnNcclxuXHRPQkpFQ1RfUFJPUEVSVElFU19NSU5JTVVNOiAzMDAsXHJcblx0T0JKRUNUX1BST1BFUlRJRVNfTUFYSU1VTTogMzAxLFxyXG5cdE9CSkVDVF9SRVFVSVJFRDogMzAyLFxyXG5cdE9CSkVDVF9BRERJVElPTkFMX1BST1BFUlRJRVM6IDMwMyxcclxuXHRPQkpFQ1RfREVQRU5ERU5DWV9LRVk6IDMwNCxcclxuXHQvLyBBcnJheSBlcnJvcnNcclxuXHRBUlJBWV9MRU5HVEhfU0hPUlQ6IDQwMCxcclxuXHRBUlJBWV9MRU5HVEhfTE9ORzogNDAxLFxyXG5cdEFSUkFZX1VOSVFVRTogNDAyLFxyXG5cdEFSUkFZX0FERElUSU9OQUxfSVRFTVM6IDQwMyxcclxuXHQvLyBDdXN0b20vdXNlci1kZWZpbmVkIGVycm9yc1xyXG5cdEZPUk1BVF9DVVNUT006IDUwMCxcclxuXHRLRVlXT1JEX0NVU1RPTTogNTAxLFxyXG5cdC8vIFNjaGVtYSBzdHJ1Y3R1cmVcclxuXHRDSVJDVUxBUl9SRUZFUkVOQ0U6IDYwMCxcclxuXHQvLyBOb24tc3RhbmRhcmQgdmFsaWRhdGlvbiBvcHRpb25zXHJcblx0VU5LTk9XTl9QUk9QRVJUWTogMTAwMFxyXG59O1xyXG52YXIgRXJyb3JDb2RlTG9va3VwID0ge307XHJcbmZvciAodmFyIGtleSBpbiBFcnJvckNvZGVzKSB7XHJcblx0RXJyb3JDb2RlTG9va3VwW0Vycm9yQ29kZXNba2V5XV0gPSBrZXk7XHJcbn1cclxudmFyIEVycm9yTWVzc2FnZXNEZWZhdWx0ID0ge1xyXG5cdElOVkFMSURfVFlQRTogXCJJbnZhbGlkIHR5cGU6IHt0eXBlfSAoZXhwZWN0ZWQge2V4cGVjdGVkfSlcIixcclxuXHRFTlVNX01JU01BVENIOiBcIk5vIGVudW0gbWF0Y2ggZm9yOiB7dmFsdWV9XCIsXHJcblx0QU5ZX09GX01JU1NJTkc6IFwiRGF0YSBkb2VzIG5vdCBtYXRjaCBhbnkgc2NoZW1hcyBmcm9tIFxcXCJhbnlPZlxcXCJcIixcclxuXHRPTkVfT0ZfTUlTU0lORzogXCJEYXRhIGRvZXMgbm90IG1hdGNoIGFueSBzY2hlbWFzIGZyb20gXFxcIm9uZU9mXFxcIlwiLFxyXG5cdE9ORV9PRl9NVUxUSVBMRTogXCJEYXRhIGlzIHZhbGlkIGFnYWluc3QgbW9yZSB0aGFuIG9uZSBzY2hlbWEgZnJvbSBcXFwib25lT2ZcXFwiOiBpbmRpY2VzIHtpbmRleDF9IGFuZCB7aW5kZXgyfVwiLFxyXG5cdE5PVF9QQVNTRUQ6IFwiRGF0YSBtYXRjaGVzIHNjaGVtYSBmcm9tIFxcXCJub3RcXFwiXCIsXHJcblx0Ly8gTnVtZXJpYyBlcnJvcnNcclxuXHROVU1CRVJfTVVMVElQTEVfT0Y6IFwiVmFsdWUge3ZhbHVlfSBpcyBub3QgYSBtdWx0aXBsZSBvZiB7bXVsdGlwbGVPZn1cIixcclxuXHROVU1CRVJfTUlOSU1VTTogXCJWYWx1ZSB7dmFsdWV9IGlzIGxlc3MgdGhhbiBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE5VTUJFUl9NSU5JTVVNX0VYQ0xVU0lWRTogXCJWYWx1ZSB7dmFsdWV9IGlzIGVxdWFsIHRvIGV4Y2x1c2l2ZSBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE5VTUJFUl9NQVhJTVVNOiBcIlZhbHVlIHt2YWx1ZX0gaXMgZ3JlYXRlciB0aGFuIG1heGltdW0ge21heGltdW19XCIsXHJcblx0TlVNQkVSX01BWElNVU1fRVhDTFVTSVZFOiBcIlZhbHVlIHt2YWx1ZX0gaXMgZXF1YWwgdG8gZXhjbHVzaXZlIG1heGltdW0ge21heGltdW19XCIsXHJcblx0TlVNQkVSX05PVF9BX05VTUJFUjogXCJWYWx1ZSB7dmFsdWV9IGlzIG5vdCBhIHZhbGlkIG51bWJlclwiLFxyXG5cdC8vIFN0cmluZyBlcnJvcnNcclxuXHRTVFJJTkdfTEVOR1RIX1NIT1JUOiBcIlN0cmluZyBpcyB0b28gc2hvcnQgKHtsZW5ndGh9IGNoYXJzKSwgbWluaW11bSB7bWluaW11bX1cIixcclxuXHRTVFJJTkdfTEVOR1RIX0xPTkc6IFwiU3RyaW5nIGlzIHRvbyBsb25nICh7bGVuZ3RofSBjaGFycyksIG1heGltdW0ge21heGltdW19XCIsXHJcblx0U1RSSU5HX1BBVFRFUk46IFwiU3RyaW5nIGRvZXMgbm90IG1hdGNoIHBhdHRlcm46IHtwYXR0ZXJufVwiLFxyXG5cdC8vIE9iamVjdCBlcnJvcnNcclxuXHRPQkpFQ1RfUFJPUEVSVElFU19NSU5JTVVNOiBcIlRvbyBmZXcgcHJvcGVydGllcyBkZWZpbmVkICh7cHJvcGVydHlDb3VudH0pLCBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdE9CSkVDVF9QUk9QRVJUSUVTX01BWElNVU06IFwiVG9vIG1hbnkgcHJvcGVydGllcyBkZWZpbmVkICh7cHJvcGVydHlDb3VudH0pLCBtYXhpbXVtIHttYXhpbXVtfVwiLFxyXG5cdE9CSkVDVF9SRVFVSVJFRDogXCJNaXNzaW5nIHJlcXVpcmVkIHByb3BlcnR5OiB7a2V5fVwiLFxyXG5cdE9CSkVDVF9BRERJVElPTkFMX1BST1BFUlRJRVM6IFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG5vdCBhbGxvd2VkXCIsXHJcblx0T0JKRUNUX0RFUEVOREVOQ1lfS0VZOiBcIkRlcGVuZGVuY3kgZmFpbGVkIC0ga2V5IG11c3QgZXhpc3Q6IHttaXNzaW5nfSAoZHVlIHRvIGtleToge2tleX0pXCIsXHJcblx0Ly8gQXJyYXkgZXJyb3JzXHJcblx0QVJSQVlfTEVOR1RIX1NIT1JUOiBcIkFycmF5IGlzIHRvbyBzaG9ydCAoe2xlbmd0aH0pLCBtaW5pbXVtIHttaW5pbXVtfVwiLFxyXG5cdEFSUkFZX0xFTkdUSF9MT05HOiBcIkFycmF5IGlzIHRvbyBsb25nICh7bGVuZ3RofSksIG1heGltdW0ge21heGltdW19XCIsXHJcblx0QVJSQVlfVU5JUVVFOiBcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlIChpbmRpY2VzIHttYXRjaDF9IGFuZCB7bWF0Y2gyfSlcIixcclxuXHRBUlJBWV9BRERJVElPTkFMX0lURU1TOiBcIkFkZGl0aW9uYWwgaXRlbXMgbm90IGFsbG93ZWRcIixcclxuXHQvLyBGb3JtYXQgZXJyb3JzXHJcblx0Rk9STUFUX0NVU1RPTTogXCJGb3JtYXQgdmFsaWRhdGlvbiBmYWlsZWQgKHttZXNzYWdlfSlcIixcclxuXHRLRVlXT1JEX0NVU1RPTTogXCJLZXl3b3JkIGZhaWxlZDoge2tleX0gKHttZXNzYWdlfSlcIixcclxuXHQvLyBTY2hlbWEgc3RydWN0dXJlXHJcblx0Q0lSQ1VMQVJfUkVGRVJFTkNFOiBcIkNpcmN1bGFyICRyZWZzOiB7dXJsc31cIixcclxuXHQvLyBOb24tc3RhbmRhcmQgdmFsaWRhdGlvbiBvcHRpb25zXHJcblx0VU5LTk9XTl9QUk9QRVJUWTogXCJVbmtub3duIHByb3BlcnR5IChub3QgaW4gc2NoZW1hKVwiXHJcbn07XHJcblxyXG5mdW5jdGlvbiBWYWxpZGF0aW9uRXJyb3IoY29kZSwgcGFyYW1zLCBkYXRhUGF0aCwgc2NoZW1hUGF0aCwgc3ViRXJyb3JzKSB7XHJcblx0RXJyb3IuY2FsbCh0aGlzKTtcclxuXHRpZiAoY29kZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IgKFwiTm8gZXJyb3IgY29kZSBzdXBwbGllZDogXCIgKyBzY2hlbWFQYXRoKTtcclxuXHR9XHJcblx0dGhpcy5tZXNzYWdlID0gJyc7XHJcblx0dGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcblx0dGhpcy5jb2RlID0gY29kZTtcclxuXHR0aGlzLmRhdGFQYXRoID0gZGF0YVBhdGggfHwgXCJcIjtcclxuXHR0aGlzLnNjaGVtYVBhdGggPSBzY2hlbWFQYXRoIHx8IFwiXCI7XHJcblx0dGhpcy5zdWJFcnJvcnMgPSBzdWJFcnJvcnMgfHwgbnVsbDtcclxuXHJcblx0dmFyIGVyciA9IG5ldyBFcnJvcih0aGlzLm1lc3NhZ2UpO1xyXG5cdHRoaXMuc3RhY2sgPSBlcnIuc3RhY2sgfHwgZXJyLnN0YWNrdHJhY2U7XHJcblx0aWYgKCF0aGlzLnN0YWNrKSB7XHJcblx0XHR0cnkge1xyXG5cdFx0XHR0aHJvdyBlcnI7XHJcblx0XHR9XHJcblx0XHRjYXRjaChlcnIpIHtcclxuXHRcdFx0dGhpcy5zdGFjayA9IGVyci5zdGFjayB8fCBlcnIuc3RhY2t0cmFjZTtcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTtcclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZhbGlkYXRpb25FcnJvcjtcclxuVmFsaWRhdGlvbkVycm9yLnByb3RvdHlwZS5uYW1lID0gJ1ZhbGlkYXRpb25FcnJvcic7XHJcblxyXG5WYWxpZGF0aW9uRXJyb3IucHJvdG90eXBlLnByZWZpeFdpdGggPSBmdW5jdGlvbiAoZGF0YVByZWZpeCwgc2NoZW1hUHJlZml4KSB7XHJcblx0aWYgKGRhdGFQcmVmaXggIT09IG51bGwpIHtcclxuXHRcdGRhdGFQcmVmaXggPSBkYXRhUHJlZml4LnJlcGxhY2UoL34vZywgXCJ+MFwiKS5yZXBsYWNlKC9cXC8vZywgXCJ+MVwiKTtcclxuXHRcdHRoaXMuZGF0YVBhdGggPSBcIi9cIiArIGRhdGFQcmVmaXggKyB0aGlzLmRhdGFQYXRoO1xyXG5cdH1cclxuXHRpZiAoc2NoZW1hUHJlZml4ICE9PSBudWxsKSB7XHJcblx0XHRzY2hlbWFQcmVmaXggPSBzY2hlbWFQcmVmaXgucmVwbGFjZSgvfi9nLCBcIn4wXCIpLnJlcGxhY2UoL1xcLy9nLCBcIn4xXCIpO1xyXG5cdFx0dGhpcy5zY2hlbWFQYXRoID0gXCIvXCIgKyBzY2hlbWFQcmVmaXggKyB0aGlzLnNjaGVtYVBhdGg7XHJcblx0fVxyXG5cdGlmICh0aGlzLnN1YkVycm9ycyAhPT0gbnVsbCkge1xyXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnN1YkVycm9ycy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHR0aGlzLnN1YkVycm9yc1tpXS5wcmVmaXhXaXRoKGRhdGFQcmVmaXgsIHNjaGVtYVByZWZpeCk7XHJcblx0XHR9XHJcblx0fVxyXG5cdHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gaXNUcnVzdGVkVXJsKGJhc2VVcmwsIHRlc3RVcmwpIHtcclxuXHRpZih0ZXN0VXJsLnN1YnN0cmluZygwLCBiYXNlVXJsLmxlbmd0aCkgPT09IGJhc2VVcmwpe1xyXG5cdFx0dmFyIHJlbWFpbmRlciA9IHRlc3RVcmwuc3Vic3RyaW5nKGJhc2VVcmwubGVuZ3RoKTtcclxuXHRcdGlmICgodGVzdFVybC5sZW5ndGggPiAwICYmIHRlc3RVcmwuY2hhckF0KGJhc2VVcmwubGVuZ3RoIC0gMSkgPT09IFwiL1wiKVxyXG5cdFx0XHR8fCByZW1haW5kZXIuY2hhckF0KDApID09PSBcIiNcIlxyXG5cdFx0XHR8fCByZW1haW5kZXIuY2hhckF0KDApID09PSBcIj9cIikge1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH1cclxuXHR9XHJcblx0cmV0dXJuIGZhbHNlO1xyXG59XHJcblxyXG52YXIgbGFuZ3VhZ2VzID0ge307XHJcbmZ1bmN0aW9uIGNyZWF0ZUFwaShsYW5ndWFnZSkge1xyXG5cdHZhciBnbG9iYWxDb250ZXh0ID0gbmV3IFZhbGlkYXRvckNvbnRleHQoKTtcclxuXHR2YXIgY3VycmVudExhbmd1YWdlO1xyXG5cdHZhciBjdXN0b21FcnJvclJlcG9ydGVyO1xyXG5cdHZhciBhcGkgPSB7XHJcblx0XHRzZXRFcnJvclJlcG9ydGVyOiBmdW5jdGlvbiAocmVwb3J0ZXIpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiByZXBvcnRlciA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy5sYW5ndWFnZShyZXBvcnRlcik7XHJcblx0XHRcdH1cclxuXHRcdFx0Y3VzdG9tRXJyb3JSZXBvcnRlciA9IHJlcG9ydGVyO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHRhZGRGb3JtYXQ6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5hZGRGb3JtYXQuYXBwbHkoZ2xvYmFsQ29udGV4dCwgYXJndW1lbnRzKTtcclxuXHRcdH0sXHJcblx0XHRsYW5ndWFnZTogZnVuY3Rpb24gKGNvZGUpIHtcclxuXHRcdFx0aWYgKCFjb2RlKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1cnJlbnRMYW5ndWFnZTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIWxhbmd1YWdlc1tjb2RlXSkge1xyXG5cdFx0XHRcdGNvZGUgPSBjb2RlLnNwbGl0KCctJylbMF07IC8vIGZhbGwgYmFjayB0byBiYXNlIGxhbmd1YWdlXHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKGxhbmd1YWdlc1tjb2RlXSkge1xyXG5cdFx0XHRcdGN1cnJlbnRMYW5ndWFnZSA9IGNvZGU7XHJcblx0XHRcdFx0cmV0dXJuIGNvZGU7IC8vIHNvIHlvdSBjYW4gdGVsbCBpZiBmYWxsLWJhY2sgaGFzIGhhcHBlbmVkXHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0fSxcclxuXHRcdGFkZExhbmd1YWdlOiBmdW5jdGlvbiAoY29kZSwgbWVzc2FnZU1hcCkge1xyXG5cdFx0XHR2YXIga2V5O1xyXG5cdFx0XHRmb3IgKGtleSBpbiBFcnJvckNvZGVzKSB7XHJcblx0XHRcdFx0aWYgKG1lc3NhZ2VNYXBba2V5XSAmJiAhbWVzc2FnZU1hcFtFcnJvckNvZGVzW2tleV1dKSB7XHJcblx0XHRcdFx0XHRtZXNzYWdlTWFwW0Vycm9yQ29kZXNba2V5XV0gPSBtZXNzYWdlTWFwW2tleV07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdHZhciByb290Q29kZSA9IGNvZGUuc3BsaXQoJy0nKVswXTtcclxuXHRcdFx0aWYgKCFsYW5ndWFnZXNbcm9vdENvZGVdKSB7IC8vIHVzZSBmb3IgYmFzZSBsYW5ndWFnZSBpZiBub3QgeWV0IGRlZmluZWRcclxuXHRcdFx0XHRsYW5ndWFnZXNbY29kZV0gPSBtZXNzYWdlTWFwO1xyXG5cdFx0XHRcdGxhbmd1YWdlc1tyb290Q29kZV0gPSBtZXNzYWdlTWFwO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGxhbmd1YWdlc1tjb2RlXSA9IE9iamVjdC5jcmVhdGUobGFuZ3VhZ2VzW3Jvb3RDb2RlXSk7XHJcblx0XHRcdFx0Zm9yIChrZXkgaW4gbWVzc2FnZU1hcCkge1xyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBsYW5ndWFnZXNbcm9vdENvZGVdW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XHJcblx0XHRcdFx0XHRcdGxhbmd1YWdlc1tyb290Q29kZV1ba2V5XSA9IG1lc3NhZ2VNYXBba2V5XTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdGxhbmd1YWdlc1tjb2RlXVtrZXldID0gbWVzc2FnZU1hcFtrZXldO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdGhpcztcclxuXHRcdH0sXHJcblx0XHRmcmVzaEFwaTogZnVuY3Rpb24gKGxhbmd1YWdlKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSBjcmVhdGVBcGkoKTtcclxuXHRcdFx0aWYgKGxhbmd1YWdlKSB7XHJcblx0XHRcdFx0cmVzdWx0Lmxhbmd1YWdlKGxhbmd1YWdlKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fSxcclxuXHRcdHZhbGlkYXRlOiBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dmFyIGRlZiA9IGRlZmF1bHRFcnJvclJlcG9ydGVyKGN1cnJlbnRMYW5ndWFnZSk7XHJcblx0XHRcdHZhciBlcnJvclJlcG9ydGVyID0gY3VzdG9tRXJyb3JSZXBvcnRlciA/IGZ1bmN0aW9uIChlcnJvciwgZGF0YSwgc2NoZW1hKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1c3RvbUVycm9yUmVwb3J0ZXIoZXJyb3IsIGRhdGEsIHNjaGVtYSkgfHwgZGVmKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9IDogZGVmO1xyXG5cdFx0XHR2YXIgY29udGV4dCA9IG5ldyBWYWxpZGF0b3JDb250ZXh0KGdsb2JhbENvbnRleHQsIGZhbHNlLCBlcnJvclJlcG9ydGVyLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpO1xyXG5cdFx0XHRpZiAodHlwZW9mIHNjaGVtYSA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0XHRcdHNjaGVtYSA9IHtcIiRyZWZcIjogc2NoZW1hfTtcclxuXHRcdFx0fVxyXG5cdFx0XHRjb250ZXh0LmFkZFNjaGVtYShcIlwiLCBzY2hlbWEpO1xyXG5cdFx0XHR2YXIgZXJyb3IgPSBjb250ZXh0LnZhbGlkYXRlQWxsKGRhdGEsIHNjaGVtYSwgbnVsbCwgbnVsbCwgXCJcIik7XHJcblx0XHRcdGlmICghZXJyb3IgJiYgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0XHRlcnJvciA9IGNvbnRleHQuYmFuVW5rbm93blByb3BlcnRpZXMoZGF0YSwgc2NoZW1hKTtcclxuXHRcdFx0fVxyXG5cdFx0XHR0aGlzLmVycm9yID0gZXJyb3I7XHJcblx0XHRcdHRoaXMubWlzc2luZyA9IGNvbnRleHQubWlzc2luZztcclxuXHRcdFx0dGhpcy52YWxpZCA9IChlcnJvciA9PT0gbnVsbCk7XHJcblx0XHRcdHJldHVybiB0aGlzLnZhbGlkO1xyXG5cdFx0fSxcclxuXHRcdHZhbGlkYXRlUmVzdWx0OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHZhciByZXN1bHQgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZCA/ICd2YWxpZCcgOiB0aGlzLmVycm9yLm1lc3NhZ2U7XHJcblx0XHRcdH19O1xyXG5cdFx0XHR0aGlzLnZhbGlkYXRlLmFwcGx5KHJlc3VsdCwgYXJndW1lbnRzKTtcclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdH0sXHJcblx0XHR2YWxpZGF0ZU11bHRpcGxlOiBmdW5jdGlvbiAoZGF0YSwgc2NoZW1hLCBjaGVja1JlY3Vyc2l2ZSwgYmFuVW5rbm93blByb3BlcnRpZXMpIHtcclxuXHRcdFx0dmFyIGRlZiA9IGRlZmF1bHRFcnJvclJlcG9ydGVyKGN1cnJlbnRMYW5ndWFnZSk7XHJcblx0XHRcdHZhciBlcnJvclJlcG9ydGVyID0gY3VzdG9tRXJyb3JSZXBvcnRlciA/IGZ1bmN0aW9uIChlcnJvciwgZGF0YSwgc2NoZW1hKSB7XHJcblx0XHRcdFx0cmV0dXJuIGN1c3RvbUVycm9yUmVwb3J0ZXIoZXJyb3IsIGRhdGEsIHNjaGVtYSkgfHwgZGVmKGVycm9yLCBkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9IDogZGVmO1xyXG5cdFx0XHR2YXIgY29udGV4dCA9IG5ldyBWYWxpZGF0b3JDb250ZXh0KGdsb2JhbENvbnRleHQsIHRydWUsIGVycm9yUmVwb3J0ZXIsIGNoZWNrUmVjdXJzaXZlLCBiYW5Vbmtub3duUHJvcGVydGllcyk7XHJcblx0XHRcdGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XHJcblx0XHRcdFx0c2NoZW1hID0ge1wiJHJlZlwiOiBzY2hlbWF9O1xyXG5cdFx0XHR9XHJcblx0XHRcdGNvbnRleHQuYWRkU2NoZW1hKFwiXCIsIHNjaGVtYSk7XHJcblx0XHRcdGNvbnRleHQudmFsaWRhdGVBbGwoZGF0YSwgc2NoZW1hLCBudWxsLCBudWxsLCBcIlwiKTtcclxuXHRcdFx0aWYgKGJhblVua25vd25Qcm9wZXJ0aWVzKSB7XHJcblx0XHRcdFx0Y29udGV4dC5iYW5Vbmtub3duUHJvcGVydGllcyhkYXRhLCBzY2hlbWEpO1xyXG5cdFx0XHR9XHJcblx0XHRcdHZhciByZXN1bHQgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0XHRyZXR1cm4gdGhpcy52YWxpZCA/ICd2YWxpZCcgOiB0aGlzLmVycm9yLm1lc3NhZ2U7XHJcblx0XHRcdH19O1xyXG5cdFx0XHRyZXN1bHQuZXJyb3JzID0gY29udGV4dC5lcnJvcnM7XHJcblx0XHRcdHJlc3VsdC5taXNzaW5nID0gY29udGV4dC5taXNzaW5nO1xyXG5cdFx0XHRyZXN1bHQudmFsaWQgPSAocmVzdWx0LmVycm9ycy5sZW5ndGggPT09IDApO1xyXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdFx0fSxcclxuXHRcdGFkZFNjaGVtYTogZnVuY3Rpb24gKCkge1xyXG5cdFx0XHRyZXR1cm4gZ2xvYmFsQ29udGV4dC5hZGRTY2hlbWEuYXBwbHkoZ2xvYmFsQ29udGV4dCwgYXJndW1lbnRzKTtcclxuXHRcdH0sXHJcblx0XHRnZXRTY2hlbWE6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIGdsb2JhbENvbnRleHQuZ2V0U2NoZW1hLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0Z2V0U2NoZW1hTWFwOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJldHVybiBnbG9iYWxDb250ZXh0LmdldFNjaGVtYU1hcC5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGdldFNjaGVtYVVyaXM6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0cmV0dXJuIGdsb2JhbENvbnRleHQuZ2V0U2NoZW1hVXJpcy5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGdldE1pc3NpbmdVcmlzOiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdHJldHVybiBnbG9iYWxDb250ZXh0LmdldE1pc3NpbmdVcmlzLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0ZHJvcFNjaGVtYXM6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5kcm9wU2NoZW1hcy5hcHBseShnbG9iYWxDb250ZXh0LCBhcmd1bWVudHMpO1xyXG5cdFx0fSxcclxuXHRcdGRlZmluZUtleXdvcmQ6IGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Z2xvYmFsQ29udGV4dC5kZWZpbmVLZXl3b3JkLmFwcGx5KGdsb2JhbENvbnRleHQsIGFyZ3VtZW50cyk7XHJcblx0XHR9LFxyXG5cdFx0ZGVmaW5lRXJyb3I6IGZ1bmN0aW9uIChjb2RlTmFtZSwgY29kZU51bWJlciwgZGVmYXVsdE1lc3NhZ2UpIHtcclxuXHRcdFx0aWYgKHR5cGVvZiBjb2RlTmFtZSAhPT0gJ3N0cmluZycgfHwgIS9eW0EtWl0rKF9bQS1aXSspKiQvLnRlc3QoY29kZU5hbWUpKSB7XHJcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDb2RlIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBpbiBVUFBFUl9DQVNFX1dJVEhfVU5ERVJTQ09SRVMnKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAodHlwZW9mIGNvZGVOdW1iZXIgIT09ICdudW1iZXInIHx8IGNvZGVOdW1iZXIlMSAhPT0gMCB8fCBjb2RlTnVtYmVyIDwgMTAwMDApIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NvZGUgbnVtYmVyIG11c3QgYmUgYW4gaW50ZWdlciA+IDEwMDAwJyk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHR5cGVvZiBFcnJvckNvZGVzW2NvZGVOYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGFscmVhZHkgZGVmaW5lZDogJyArIGNvZGVOYW1lICsgJyBhcyAnICsgRXJyb3JDb2Rlc1tjb2RlTmFtZV0pO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmICh0eXBlb2YgRXJyb3JDb2RlTG9va3VwW2NvZGVOdW1iZXJdICE9PSAndW5kZWZpbmVkJykge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignRXJyb3IgY29kZSBhbHJlYWR5IHVzZWQ6ICcgKyBFcnJvckNvZGVMb29rdXBbY29kZU51bWJlcl0gKyAnIGFzICcgKyBjb2RlTnVtYmVyKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRFcnJvckNvZGVzW2NvZGVOYW1lXSA9IGNvZGVOdW1iZXI7XHJcblx0XHRcdEVycm9yQ29kZUxvb2t1cFtjb2RlTnVtYmVyXSA9IGNvZGVOYW1lO1xyXG5cdFx0XHRFcnJvck1lc3NhZ2VzRGVmYXVsdFtjb2RlTmFtZV0gPSBFcnJvck1lc3NhZ2VzRGVmYXVsdFtjb2RlTnVtYmVyXSA9IGRlZmF1bHRNZXNzYWdlO1xyXG5cdFx0XHRmb3IgKHZhciBsYW5nQ29kZSBpbiBsYW5ndWFnZXMpIHtcclxuXHRcdFx0XHR2YXIgbGFuZ3VhZ2UgPSBsYW5ndWFnZXNbbGFuZ0NvZGVdO1xyXG5cdFx0XHRcdGlmIChsYW5ndWFnZVtjb2RlTmFtZV0pIHtcclxuXHRcdFx0XHRcdGxhbmd1YWdlW2NvZGVOdW1iZXJdID0gbGFuZ3VhZ2VbY29kZU51bWJlcl0gfHwgbGFuZ3VhZ2VbY29kZU5hbWVdO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XHJcblx0XHRcdGdsb2JhbENvbnRleHQucmVzZXQoKTtcclxuXHRcdFx0dGhpcy5lcnJvciA9IG51bGw7XHJcblx0XHRcdHRoaXMubWlzc2luZyA9IFtdO1xyXG5cdFx0XHR0aGlzLnZhbGlkID0gdHJ1ZTtcclxuXHRcdH0sXHJcblx0XHRtaXNzaW5nOiBbXSxcclxuXHRcdGVycm9yOiBudWxsLFxyXG5cdFx0dmFsaWQ6IHRydWUsXHJcblx0XHRub3JtU2NoZW1hOiBub3JtU2NoZW1hLFxyXG5cdFx0cmVzb2x2ZVVybDogcmVzb2x2ZVVybCxcclxuXHRcdGdldERvY3VtZW50VXJpOiBnZXREb2N1bWVudFVyaSxcclxuXHRcdGVycm9yQ29kZXM6IEVycm9yQ29kZXNcclxuXHR9O1xyXG5cdGFwaS5sYW5ndWFnZShsYW5ndWFnZSB8fCAnZW4nKTtcclxuXHRyZXR1cm4gYXBpO1xyXG59XHJcblxyXG52YXIgdHY0ID0gY3JlYXRlQXBpKCk7XHJcbnR2NC5hZGRMYW5ndWFnZSgnZW4tZ2InLCBFcnJvck1lc3NhZ2VzRGVmYXVsdCk7XHJcblxyXG4vL2xlZ2FjeSBwcm9wZXJ0eVxyXG50djQudHY0ID0gdHY0O1xyXG5cclxucmV0dXJuIHR2NDsgLy8gdXNlZCBieSBfaGVhZGVyLmpzIHRvIGdsb2JhbGlzZS5cclxuXHJcbn0pKTsiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBLFdBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///18\n')},function(module,exports){eval('// proxy-observe v0.0.18\r\n// Copyright (c) 2015, 2016 Simon Y. Blackwell, AnyWhichWay\r\n// MIT License - http://opensource.org/licenses/mit-license.php\r\n(function() {\r\n\t"use strict";\r\n\t// Creates and returns a Proxy wrapping a target so that all changes can be trapped and forwarded to\r\n\t// a callback. The callback takes an array of changes just like the traditional original Chrome Object.observe\r\n\t// {object:,name:,type:add|update|delete|reconfigure|preventExtensions|setPrototype,oldValue:}\r\n\t// The acceptlist can be add|update|delete|reconfigure|preventExtensions|setPrototype.\r\n\t// v 0.0.10 to support pausing and restarting observation two additional constructor arguments are available to Object.observe:\r\n\t// pausable - create the Observer so it can be paused\r\n\t// pause - create observer in paused state\r\n\t// if pausable is true then an additional method deliver(ignorePrevious) is available to start delivery\r\n\t// to pause delivery set a property called pause on the function deliver to true\r\n\t// pausable is optional to reduce the chance of shadowing a property or method on any existing code called deliver\r\n\tif(!Object.observe && typeof(Proxy)==="function") {\r\n\t\tfunction Observer(target,callback,acceptlist,pausable,pause,delay) {\r\n\t \tvar me = this, proxy;\r\n\t \tfunction deliver(ignorePrevious,delay) {\r\n\t \t\tdeliver.delay = delay;\r\n\t \t\tif(!deliver.pause) {\r\n\t \t\tif(me.changeset.length>0) {\r\n\t \t\t\tif(!ignorePrevious) {\r\n\t\t \t \t\tvar changes = me.changeset.filter(function(change) { return !acceptlist || acceptlist.indexOf(change.type)>=0; });\r\n\t\t \t\t\tif(changes.length>0) {\r\n\t\t \t\t\t\tcallback(changes);\r\n\t\t \t\t\t}\r\n\t \t\t\t}\r\n\t \t\t\tme.changeset = [];\r\n\t \t\t}\r\n\t \t\t}\r\n\t \t}\r\n\t \tdeliver.pause = pause;\r\n\t \tdeliver.delay = delay;\r\n\t\t me.get = function(target, property) {\r\n\t\t \tif(property==="__observer__") {\r\n\t\t \t\treturn me;\r\n\t\t \t}\r\n\t\t \tif(property==="unobserve") {\r\n\t\t \t\treturn function() {\r\n\t\t \t\t\tObject.unobserve(target);\r\n\t\t \t\t\treturn target;\r\n\t\t \t\t};\r\n\t\t \t}\r\n\t\t \tif(property==="deliver") {\r\n\t\t \t\treturn deliver;\r\n\t\t \t}\r\n\t\t \treturn target[property];\r\n\t\t }\r\n\t \tme.target = target;\r\n\t \tme.changeset = [];\r\n\t \tif(!me.target.__observerCallbacks__) {\r\n\t \t\t// __observerCallbacks__ is used as an index to get at the proxy which is the observer, so we can unobserve\r\n\t \t\tObject.defineProperty(target,"__observerCallbacks__",{enumerable:false,configurable:true,writable:false,value:[]});\r\n\t \t\tObject.defineProperty(target,"__observers__",{enumerable:false,configurable:true,writable:false,value:[]});\r\n\t \t}\r\n\t \tme.target.__observerCallbacks__.push(callback);\r\n\t \tme.target.__observers__.push(this);\r\n\t \tproxy = new Proxy(target,me);\r\n\t \tdeliver(false,delay);\r\n\t \treturn proxy;\r\n\t }\r\n\t\tObserver.prototype.deliver = function() {\r\n\t\t\treturn this.get(null,"deliver");\r\n\t\t}\r\n\t Observer.prototype.set = function(target, property, value) { // , receiver\r\n\t \tvar oldvalue = target[property];\r\n\t \tvar type = (oldvalue===undefined ? "add" : "update");\r\n\t \ttarget[property] = value;\r\n\t \tif(target.__observers__.indexOf(this)>=0 && (!this.acceptlist || this.acceptlist.indexOf(type)>=0)) {\r\n\t \tvar change = {object:target,name:property,type:type},\r\n\t \t\tstart = this.changeset.length === 0,\r\n\t \t\tdeliver = this.deliver();\r\n\t \tif(type==="update") {\r\n\t \t\tchange.oldValue = oldvalue;\r\n\t \t}\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.deleteProperty = function(target, property) {\r\n\t \tvar oldvalue = target[property];\r\n\t \t//if(typeof(oldvalue)!=="undefined") {\r\n\t\t \tdelete target[property];\r\n\t\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("delete")>=0) {\r\n\t\t \tvar change = {object:target,name:property,type:"delete",oldValue:oldvalue},\r\n\t\t \t\tstart = this.changeset.length === 0,\r\n\t\t \t\tdeliver = this.deliver();\r\n\t\t \tthis.changeset.push(change);\r\n\t\t \tif(start) {\r\n\t\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t\t \t}\r\n\t\t \t}\r\n\t \t//}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.defineProperty = function(target, property, descriptor) {\r\n\t \tObject.defineProperty(target, property, descriptor);\r\n\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("reconfigure")>=0) {\r\n\t \tvar change = {object:target,name:property,type:"reconfigure"},\r\n \t\t\tstart = this.changeset.length === 0,\r\n \t\t\tdeliver = this.deliver();\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.setPrototypeOf = function(target, prototype) {\r\n\t \tvar oldvalue = Object.getPrototypeOf(target);\r\n\t \tObject.setPrototypeOf(target, prototype);\r\n\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("setPrototype")>=0) {\r\n\t \tvar change = {object:target,name:"__proto__",type:"setPrototype",oldValue:oldvalue},\r\n \t\t\t\tstart = this.changeset.length === 0,\r\n \t\t\t\tdeliver = this.deliver();\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Observer.prototype.preventExtensions = function(target) {\r\n\t Object.preventExtensions(target);\r\n\t \tif(target.__observers__.indexOf(this)>=0 && !this.acceptlist || this.acceptlist.indexOf("preventExtensions")>=0) {\r\n\t \tvar change = {object:target,type:"preventExtensions"},\r\n\t\t\t\t\tstart = this.changeset.length === 0,\r\n\t\t\t\t\tdeliver = this.deliver();\r\n\t \tthis.changeset.push(change);\r\n\t \tif(start) {\r\n\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t}\r\n\t \t}\r\n\t \treturn true;\r\n\t };\r\n\t Object.observe = function(object,callback,acceptlist,pausable,pause,delay) {\r\n\t \treturn new Observer(object,callback,acceptlist,pausable,pause,delay);\r\n\t };\r\n\t Object.unobserve = function(object,callback) {\r\n\t \tif(object.__observerCallbacks__) {\r\n\t \t\tif(!callback) {\r\n\t \t\t\tobject.__observerCallbacks__.splice(0,object.__observerCallbacks__.length);\r\n\t \t\t\tobject.__observers__.splice(0,object.__observers__.length);\r\n\t \t\t\treturn;\r\n\t \t\t}\r\n\t \t\tobject.__observerCallbacks__.forEach(function(observercallback,i) {\r\n\t \t\t\tif(callback===observercallback) {\r\n\t \t\t\t\tobject.__observerCallbacks__.splice(i,1);\r\n\t \t\t\t\tdelete object.__observers__[i].callback;\r\n\t \t\t\t\tobject.__observers__.splice(i,1);\r\n\t \t\t\t}\r\n\t \t\t});\r\n\t \t}\r\n\t };\r\n\t Array.observe = function(object,callback,acceptlist,pausable,pause,delay) {\r\n\t \tif(!(object instanceof Array) && !Array.isArray(object)) {\r\n\t \t\tthrow new TypeError("First argument to Array.observer is not an Array");\r\n\t \t}\r\n \tacceptlist = acceptlist || ["add", "update", "delete", "splice"];\r\n\t \tvar arrayproxy = new Proxy(object,{get: function(target,property) {\r\n\t \t\tif(property==="unobserve") {\r\n\t\t \t\treturn function(callback) {\r\n\t\t \t\t\tif(callback) {\r\n\t\t \t\t\t\treturn Object.unobserve(target,callback);\r\n\t\t \t\t\t}\r\n\t\t \t\t\treturn target.unobserve();\r\n\t\t \t\t};\r\n\t\t \t}\r\n\t \t\tif(property==="splice") {\r\n\t \t\t\treturn function(start,end) {\r\n\t \t\t\t\tif(typeof(start)!=="number" || typeof(end)!=="number") {\r\n\t \t\t\t\t\tthrow new TypeError("First two arguments to Array splice are not number, number");\r\n\t \t\t\t\t}\r\n\t \t \t\tvar removed = this.slice(start,start+end),\r\n\t \t \t\t\taddedCount = (arguments.length > 1 ? arguments.length-2 : 0),\r\n\t \t \t\t\tchange = {object:object,type:"splice",index:start,removed:removed,addedCount:addedCount};\r\n\t \t \t\ttarget.splice.apply(target,arguments);\r\n\t \t \t\tif(acceptlist.indexOf("splice")>=0) {\r\n\t \t \t\t\tvar start = proxy.__observer__.changeset.length === 0,\r\n\t \t \t\t\tdeliver = proxy.__observer__.deliver();\r\n\t \t \t\t\tproxy.__observer__.changeset.push(change);\r\n\t \t \t\t\tif(start) {\r\n\t \t\t \t\tdeliver(false,(typeof(deliver.delay)==="number" ? deliver.delay : 10));\r\n\t \t\t \t}\r\n\t \t \t\t}\r\n\t \t \t}\r\n\t \t\t}\r\n\t \t\tif(property==="push") {\r\n\t \t\t\t return function(item) {\r\n\t \t\t \treturn this.splice(this.length,0,item);\r\n\t \t\t }\r\n\t \t\t}\r\n\t \t\tif(property==="pop") {\r\n\t \t\t\t return function() {\r\n\t \t\t \treturn this.splice(this.length-1,1);\r\n\t \t\t }\r\n\t \t\t}\r\n\t \t\tif(property==="unshift") {\r\n\t \t\t\t return function(item) {\r\n \t\t \t\treturn this.splice(0,0,item);\r\n \t\t \t}\r\n\t \t\t}\r\n\t \t\tif(property==="shift") {\r\n\t \t\t\treturn function() {\r\n\t \t \t\treturn this.splice(0,1);\r\n\t \t \t}\r\n\t \t\t}\r\n\t \t\treturn target[property];\r\n\t \t}});\r\n\t \tvar proxy = Object.observe(arrayproxy,function(changeset) { \r\n\t \t\tvar changes = changeset.filter(function(change) { return change.name!=="length" && change.name!=="add" && (!acceptlist || acceptlist.indexOf(change.type)>=0); });\r\n\t \t\tif(changes.length>0) {\r\n\t \t\t\tcallback(changes);\r\n\t \t\t}\r\n\t \t},acceptlist,pausable,pause,delay);\r\n\t \treturn proxy;\r\n\t };\r\n\t Array.unobserve = function(object,callback) {\r\n\t\t return object.unobserve(callback);\r\n\t }\r\n\t}\r\n\tObject.deepObserve = function(object,callback,parts) {\r\n\r\n\t\tparts = (parts ? parts : []);\r\n\r\n\t\tvar toTypeName = function(obj) {\r\n\t\t\treturn ({}).toString.call(obj).match(/\\s([a-zA-Z]+)/)[1].toLowerCase()\r\n\t\t}\r\n\r\n\t\tfunction reobserve(value, parts) {\r\n\t\t\tvar keys = Object.keys(value);\r\n\t\t\tkeys.forEach(function(key) {\r\n\t\t\t\tif((toTypeName(value[key]) === \'object\' || toTypeName(value[key]) === \'array\') && !value[key].hasOwnProperty(\'__observers__\')) {\r\n\t\t\t\t\tvar newparts = parts.slice(0);\r\n\t\t\t\t\tnewparts.push(key);\r\n\t\t\t\t\tvalue[key] = Object.deepObserve(value[key],callback,newparts);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treobserve(object, parts);\r\n\r\n\t\tvar observed = Object.observe(object,function(changeset) {\r\n\t\t\tvar changes = [];\r\n\t\t\tfunction recurse(name,rootObject,oldObject,newObject,path) {\r\n\t\t\t\tif(newObject instanceof Object) {\r\n\t\t\t\t\tvar newkeys = Object.keys(newObject);\r\n\t\t\t\t\tnewkeys.forEach(function(key) {\r\n\t\t\t\t\t\tif(!oldObject || (oldObject[key]!==newObject[key])) {\r\n\t\t\t\t\t\t\tvar oldvalue = (oldObject && oldObject[key]!==undefined ? oldObject[key] : undefined),\r\n\t\t\t\t\t\t\t\tchange = (oldvalue===undefined ? "add" : "update"),\r\n\t\t\t\t\t\t\t\tkeypath = path + "." + key;\r\n\r\n\t\t\t\t\t\t\tchanges.push({name:name,object:rootObject,type:change,oldValue:oldvalue,newValue:newObject[key],keypath:keypath});\r\n\t\t\t\t\t\t\trecurse(name,rootObject,oldvalue,newObject[key],keypath);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t} else if(oldObject instanceof Object) {\r\n\t\t\t\t\tvar oldkeys = Object.keys(oldObject);\r\n\t\t\t\t\toldkeys.forEach(function(key) {\r\n\t\t\t\t\t\tvar change = (newObject===null ? "update" : "delete"),\r\n\t\t\t\t\t\t\tkeypath = path + "." + key;\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\tchanges.push({name:name,object:rootObject,type:change,oldValue:oldObject[key],newValue:newObject,keypath:keypath});\r\n\t\t\t\t\t\trecurse(name,rootObject,oldObject[key],undefined,keypath);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tchangeset.forEach(function(change) {\r\n\t\t\t\tvar keypath = (parts.length>0 ? parts.join(".") + "." : "") + change.name;\r\n\r\n\t\t\t\tif (change.type === "update" || change.type === "add") { \r\n\t\t\t\t\treobserve(change.object, parts);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tchanges.push({name:change.name,object:change.object,type:change.type,oldValue:change.oldValue,newValue:change.object[change.name],keypath:keypath});\r\n\t\t\t\trecurse(change.name,change.object,change.oldValue,change.object[change.name],keypath);\r\n\t\t\t});\r\n\t\t\tcallback(changes);\r\n\t\t});\r\n\t\treturn observed;\r\n\t};\r\n})();\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTkuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvcHJveHktb2JzZXJ2ZS9pbmRleC5qcz85NWViIl0sInNvdXJjZXNDb250ZW50IjpbIi8vICAgICBwcm94eS1vYnNlcnZlIHYwLjAuMThcclxuLy8gICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxNiBTaW1vbiBZLiBCbGFja3dlbGwsIEFueVdoaWNoV2F5XHJcbi8vICAgICBNSVQgTGljZW5zZSAtIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcclxuKGZ1bmN0aW9uKCkge1xyXG5cdFwidXNlIHN0cmljdFwiO1xyXG5cdC8vIENyZWF0ZXMgYW5kIHJldHVybnMgYSBQcm94eSB3cmFwcGluZyBhIHRhcmdldCBzbyB0aGF0IGFsbCBjaGFuZ2VzIGNhbiBiZSB0cmFwcGVkIGFuZCBmb3J3YXJkZWQgdG9cclxuXHQvLyBhIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgdGFrZXMgYW4gYXJyYXkgb2YgY2hhbmdlcyBqdXN0IGxpa2UgdGhlIHRyYWRpdGlvbmFsIG9yaWdpbmFsIENocm9tZSBPYmplY3Qub2JzZXJ2ZVxyXG5cdC8vIHtvYmplY3Q6PG9iamVjdCBjaGFuZ2VkPixuYW1lOjxmaWVsZCBjaGFuZ2VkPix0eXBlOmFkZHx1cGRhdGV8ZGVsZXRlfHJlY29uZmlndXJlfHByZXZlbnRFeHRlbnNpb25zfHNldFByb3RvdHlwZSxvbGRWYWx1ZTo8b2xkIHZhbHVlIGlmIHVwZGF0ZSB8IGRlbGV0ZT59XHJcblx0Ly8gVGhlIGFjY2VwdGxpc3QgY2FuIGJlIGFkZHx1cGRhdGV8ZGVsZXRlfHJlY29uZmlndXJlfHByZXZlbnRFeHRlbnNpb25zfHNldFByb3RvdHlwZS5cclxuXHQvLyB2IDAuMC4xMCB0byBzdXBwb3J0IHBhdXNpbmcgYW5kIHJlc3RhcnRpbmcgb2JzZXJ2YXRpb24gdHdvIGFkZGl0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIGFyZSBhdmFpbGFibGUgdG8gT2JqZWN0Lm9ic2VydmU6XHJcblx0Ly8gcGF1c2FibGUgLSBjcmVhdGUgdGhlIE9ic2VydmVyIHNvIGl0IGNhbiBiZSBwYXVzZWRcclxuXHQvLyBwYXVzZSAtIGNyZWF0ZSBvYnNlcnZlciBpbiBwYXVzZWQgc3RhdGVcclxuXHQvLyBpZiBwYXVzYWJsZSBpcyB0cnVlIHRoZW4gYW4gYWRkaXRpb25hbCBtZXRob2QgZGVsaXZlcihpZ25vcmVQcmV2aW91cykgaXMgYXZhaWxhYmxlIHRvIHN0YXJ0IGRlbGl2ZXJ5XHJcblx0Ly8gdG8gcGF1c2UgZGVsaXZlcnkgc2V0IGEgcHJvcGVydHkgY2FsbGVkIHBhdXNlIG9uIHRoZSBmdW5jdGlvbiBkZWxpdmVyIHRvIHRydWVcclxuXHQvLyBwYXVzYWJsZSBpcyBvcHRpb25hbCB0byByZWR1Y2UgdGhlIGNoYW5jZSBvZiBzaGFkb3dpbmcgYSBwcm9wZXJ0eSBvciBtZXRob2Qgb24gYW55IGV4aXN0aW5nIGNvZGUgY2FsbGVkIGRlbGl2ZXJcclxuXHRpZighT2JqZWN0Lm9ic2VydmUgJiYgdHlwZW9mKFByb3h5KT09PVwiZnVuY3Rpb25cIikge1xyXG5cdFx0ZnVuY3Rpb24gT2JzZXJ2ZXIodGFyZ2V0LGNhbGxiYWNrLGFjY2VwdGxpc3QscGF1c2FibGUscGF1c2UsZGVsYXkpIHtcclxuXHQgICAgXHR2YXIgbWUgPSB0aGlzLCBwcm94eTtcclxuXHQgICAgXHRmdW5jdGlvbiBkZWxpdmVyKGlnbm9yZVByZXZpb3VzLGRlbGF5KSB7XHJcblx0ICAgIFx0XHRkZWxpdmVyLmRlbGF5ID0gZGVsYXk7XHJcblx0ICAgIFx0XHRpZighZGVsaXZlci5wYXVzZSkge1xyXG5cdCAgICAgICAgXHRcdGlmKG1lLmNoYW5nZXNldC5sZW5ndGg+MCkge1xyXG5cdCAgICAgICAgXHRcdFx0aWYoIWlnbm9yZVByZXZpb3VzKSB7XHJcblx0XHQgICAgXHQgICAgXHRcdHZhciBjaGFuZ2VzID0gbWUuY2hhbmdlc2V0LmZpbHRlcihmdW5jdGlvbihjaGFuZ2UpIHsgcmV0dXJuICFhY2NlcHRsaXN0IHx8IGFjY2VwdGxpc3QuaW5kZXhPZihjaGFuZ2UudHlwZSk+PTA7IH0pO1xyXG5cdFx0ICAgICAgICBcdFx0XHRpZihjaGFuZ2VzLmxlbmd0aD4wKSB7XHJcblx0XHQgICAgICAgIFx0XHRcdFx0Y2FsbGJhY2soY2hhbmdlcyk7XHJcblx0XHQgICAgICAgIFx0XHRcdH1cclxuXHQgICAgICAgIFx0XHRcdH1cclxuXHQgICAgICAgIFx0XHRcdG1lLmNoYW5nZXNldCA9IFtdO1xyXG5cdCAgICAgICAgXHRcdH1cclxuXHQgICAgXHRcdH1cclxuXHQgICAgXHR9XHJcblx0ICAgIFx0ZGVsaXZlci5wYXVzZSA9IHBhdXNlO1xyXG5cdCAgICBcdGRlbGl2ZXIuZGVsYXkgPSBkZWxheTtcclxuXHRcdCAgICBtZS5nZXQgPSBmdW5jdGlvbih0YXJnZXQsIHByb3BlcnR5KSB7XHJcblx0XHQgICAgXHRpZihwcm9wZXJ0eT09PVwiX19vYnNlcnZlcl9fXCIpIHtcclxuXHRcdCAgICBcdFx0cmV0dXJuIG1lO1xyXG5cdFx0ICAgIFx0fVxyXG5cdFx0ICAgIFx0aWYocHJvcGVydHk9PT1cInVub2JzZXJ2ZVwiKSB7XHJcblx0XHQgICAgXHRcdHJldHVybiBmdW5jdGlvbigpIHtcclxuXHRcdCAgICBcdFx0XHRPYmplY3QudW5vYnNlcnZlKHRhcmdldCk7XHJcblx0XHQgICAgXHRcdFx0cmV0dXJuIHRhcmdldDtcclxuXHRcdCAgICBcdFx0fTtcclxuXHRcdCAgICBcdH1cclxuXHRcdCAgICBcdGlmKHByb3BlcnR5PT09XCJkZWxpdmVyXCIpIHtcclxuXHRcdCAgICBcdFx0cmV0dXJuIGRlbGl2ZXI7XHJcblx0XHQgICAgXHR9XHJcblx0XHQgICAgXHRyZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XTtcclxuXHRcdCAgICB9XHJcblx0ICAgIFx0bWUudGFyZ2V0ID0gdGFyZ2V0O1xyXG5cdCAgICBcdG1lLmNoYW5nZXNldCA9IFtdO1xyXG5cdCAgICBcdGlmKCFtZS50YXJnZXQuX19vYnNlcnZlckNhbGxiYWNrc19fKSB7XHJcblx0ICAgIFx0XHQvLyBfX29ic2VydmVyQ2FsbGJhY2tzX18gaXMgdXNlZCBhcyBhbiBpbmRleCB0byBnZXQgYXQgdGhlIHByb3h5IHdoaWNoIGlzIHRoZSBvYnNlcnZlciwgc28gd2UgY2FuIHVub2JzZXJ2ZVxyXG5cdCAgICBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCxcIl9fb2JzZXJ2ZXJDYWxsYmFja3NfX1wiLHtlbnVtZXJhYmxlOmZhbHNlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOmZhbHNlLHZhbHVlOltdfSk7XHJcblx0ICAgIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LFwiX19vYnNlcnZlcnNfX1wiLHtlbnVtZXJhYmxlOmZhbHNlLGNvbmZpZ3VyYWJsZTp0cnVlLHdyaXRhYmxlOmZhbHNlLHZhbHVlOltdfSk7XHJcblx0ICAgIFx0fVxyXG5cdCAgICBcdG1lLnRhcmdldC5fX29ic2VydmVyQ2FsbGJhY2tzX18ucHVzaChjYWxsYmFjayk7XHJcblx0ICAgIFx0bWUudGFyZ2V0Ll9fb2JzZXJ2ZXJzX18ucHVzaCh0aGlzKTtcclxuXHQgICAgXHRwcm94eSA9IG5ldyBQcm94eSh0YXJnZXQsbWUpO1xyXG5cdCAgICBcdGRlbGl2ZXIoZmFsc2UsZGVsYXkpO1xyXG5cdCAgICBcdHJldHVybiBwcm94eTtcclxuXHQgICAgfVxyXG5cdFx0T2JzZXJ2ZXIucHJvdG90eXBlLmRlbGl2ZXIgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KG51bGwsXCJkZWxpdmVyXCIpO1xyXG5cdFx0fVxyXG5cdCAgICBPYnNlcnZlci5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24odGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUpIHsgLy8gLCByZWNlaXZlclxyXG5cdCAgICBcdHZhciBvbGR2YWx1ZSA9IHRhcmdldFtwcm9wZXJ0eV07XHJcblx0ICAgIFx0dmFyIHR5cGUgPSAob2xkdmFsdWU9PT11bmRlZmluZWQgPyBcImFkZFwiIDogXCJ1cGRhdGVcIik7XHJcblx0ICAgIFx0dGFyZ2V0W3Byb3BlcnR5XSA9IHZhbHVlO1xyXG5cdCAgICBcdGlmKHRhcmdldC5fX29ic2VydmVyc19fLmluZGV4T2YodGhpcyk+PTAgJiYgKCF0aGlzLmFjY2VwdGxpc3QgfHwgdGhpcy5hY2NlcHRsaXN0LmluZGV4T2YodHlwZSk+PTApKSB7XHJcblx0ICAgICAgICBcdHZhciBjaGFuZ2UgPSB7b2JqZWN0OnRhcmdldCxuYW1lOnByb3BlcnR5LHR5cGU6dHlwZX0sXHJcblx0ICAgICAgICBcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcblx0ICAgICAgICBcdFx0ZGVsaXZlciA9IHRoaXMuZGVsaXZlcigpO1xyXG5cdCAgICAgICAgXHRpZih0eXBlPT09XCJ1cGRhdGVcIikge1xyXG5cdCAgICAgICAgXHRcdGNoYW5nZS5vbGRWYWx1ZSA9IG9sZHZhbHVlO1xyXG5cdCAgICAgICAgXHR9XHJcblx0ICAgICAgICBcdHRoaXMuY2hhbmdlc2V0LnB1c2goY2hhbmdlKTtcclxuXHQgICAgICAgIFx0aWYoc3RhcnQpIHtcclxuXHQgICAgICAgIFx0XHRkZWxpdmVyKGZhbHNlLCh0eXBlb2YoZGVsaXZlci5kZWxheSk9PT1cIm51bWJlclwiID8gZGVsaXZlci5kZWxheSA6IDEwKSk7XHJcblx0ICAgICAgICBcdH1cclxuXHQgICAgXHR9XHJcblx0ICAgIFx0cmV0dXJuIHRydWU7XHJcblx0ICAgIH07XHJcblx0ICAgIE9ic2VydmVyLnByb3RvdHlwZS5kZWxldGVQcm9wZXJ0eSA9IGZ1bmN0aW9uKHRhcmdldCwgcHJvcGVydHkpIHtcclxuXHQgICAgXHR2YXIgb2xkdmFsdWUgPSB0YXJnZXRbcHJvcGVydHldO1xyXG5cdCAgICBcdC8vaWYodHlwZW9mKG9sZHZhbHVlKSE9PVwidW5kZWZpbmVkXCIpIHtcclxuXHRcdCAgICBcdGRlbGV0ZSB0YXJnZXRbcHJvcGVydHldO1xyXG5cdFx0ICAgIFx0aWYodGFyZ2V0Ll9fb2JzZXJ2ZXJzX18uaW5kZXhPZih0aGlzKT49MCAmJiAhdGhpcy5hY2NlcHRsaXN0IHx8IHRoaXMuYWNjZXB0bGlzdC5pbmRleE9mKFwiZGVsZXRlXCIpPj0wKSB7XHJcblx0XHQgICAgICAgIFx0dmFyIGNoYW5nZSA9IHtvYmplY3Q6dGFyZ2V0LG5hbWU6cHJvcGVydHksdHlwZTpcImRlbGV0ZVwiLG9sZFZhbHVlOm9sZHZhbHVlfSxcclxuXHRcdCAgICAgICAgXHRcdHN0YXJ0ID0gdGhpcy5jaGFuZ2VzZXQubGVuZ3RoID09PSAwLFxyXG5cdFx0ICAgICAgICBcdFx0ZGVsaXZlciA9IHRoaXMuZGVsaXZlcigpO1xyXG5cdFx0ICAgICAgICBcdHRoaXMuY2hhbmdlc2V0LnB1c2goY2hhbmdlKTtcclxuXHRcdCAgICAgICAgXHRpZihzdGFydCkge1xyXG5cdFx0ICAgICAgICBcdFx0ZGVsaXZlcihmYWxzZSwodHlwZW9mKGRlbGl2ZXIuZGVsYXkpPT09XCJudW1iZXJcIiA/IGRlbGl2ZXIuZGVsYXkgOiAxMCkpO1xyXG5cdFx0ICAgICAgICBcdH1cclxuXHRcdCAgICBcdH1cclxuXHQgICAgXHQvL31cclxuXHQgICAgXHRyZXR1cm4gdHJ1ZTtcclxuXHQgICAgfTtcclxuXHQgICAgT2JzZXJ2ZXIucHJvdG90eXBlLmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24odGFyZ2V0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvcikge1xyXG5cdCAgICBcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCBkZXNjcmlwdG9yKTtcclxuXHQgICAgXHRpZih0YXJnZXQuX19vYnNlcnZlcnNfXy5pbmRleE9mKHRoaXMpPj0wICYmICF0aGlzLmFjY2VwdGxpc3QgfHwgdGhpcy5hY2NlcHRsaXN0LmluZGV4T2YoXCJyZWNvbmZpZ3VyZVwiKT49MCkge1xyXG5cdCAgICAgICAgXHR2YXIgY2hhbmdlID0ge29iamVjdDp0YXJnZXQsbmFtZTpwcm9wZXJ0eSx0eXBlOlwicmVjb25maWd1cmVcIn0sXHJcbiAgICAgICAgXHRcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcbiAgICAgICAgXHRcdFx0ZGVsaXZlciA9IHRoaXMuZGVsaXZlcigpO1xyXG5cdCAgICAgICAgXHR0aGlzLmNoYW5nZXNldC5wdXNoKGNoYW5nZSk7XHJcblx0ICAgICAgICBcdGlmKHN0YXJ0KSB7XHJcblx0ICAgICAgICBcdFx0ZGVsaXZlcihmYWxzZSwodHlwZW9mKGRlbGl2ZXIuZGVsYXkpPT09XCJudW1iZXJcIiA/IGRlbGl2ZXIuZGVsYXkgOiAxMCkpO1xyXG5cdCAgICAgICAgXHR9XHJcblx0ICAgIFx0fVxyXG5cdCAgICBcdHJldHVybiB0cnVlO1xyXG5cdCAgICB9O1xyXG5cdCAgICBPYnNlcnZlci5wcm90b3R5cGUuc2V0UHJvdG90eXBlT2YgPSBmdW5jdGlvbih0YXJnZXQsIHByb3RvdHlwZSkge1xyXG5cdCAgICBcdHZhciBvbGR2YWx1ZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0YXJnZXQpO1xyXG5cdCAgICBcdE9iamVjdC5zZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvdHlwZSk7XHJcblx0ICAgIFx0aWYodGFyZ2V0Ll9fb2JzZXJ2ZXJzX18uaW5kZXhPZih0aGlzKT49MCAmJiAhdGhpcy5hY2NlcHRsaXN0IHx8IHRoaXMuYWNjZXB0bGlzdC5pbmRleE9mKFwic2V0UHJvdG90eXBlXCIpPj0wKSB7XHJcblx0ICAgICAgICBcdHZhciBjaGFuZ2UgPSB7b2JqZWN0OnRhcmdldCxuYW1lOlwiX19wcm90b19fXCIsdHlwZTpcInNldFByb3RvdHlwZVwiLG9sZFZhbHVlOm9sZHZhbHVlfSxcclxuICAgIFx0XHRcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcbiAgICBcdFx0XHRcdGRlbGl2ZXIgPSB0aGlzLmRlbGl2ZXIoKTtcclxuXHQgICAgICAgIFx0dGhpcy5jaGFuZ2VzZXQucHVzaChjaGFuZ2UpO1xyXG5cdCAgICAgICAgXHRpZihzdGFydCkge1xyXG5cdCAgICAgICAgXHRcdGRlbGl2ZXIoZmFsc2UsKHR5cGVvZihkZWxpdmVyLmRlbGF5KT09PVwibnVtYmVyXCIgPyBkZWxpdmVyLmRlbGF5IDogMTApKTtcclxuXHQgICAgICAgIFx0fVxyXG5cdCAgICBcdH1cclxuXHQgICAgXHRyZXR1cm4gdHJ1ZTtcclxuXHQgICAgfTtcclxuXHQgICAgT2JzZXJ2ZXIucHJvdG90eXBlLnByZXZlbnRFeHRlbnNpb25zID0gZnVuY3Rpb24odGFyZ2V0KSB7XHJcblx0ICAgICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnModGFyZ2V0KTtcclxuXHQgICAgXHRpZih0YXJnZXQuX19vYnNlcnZlcnNfXy5pbmRleE9mKHRoaXMpPj0wICYmICF0aGlzLmFjY2VwdGxpc3QgfHwgdGhpcy5hY2NlcHRsaXN0LmluZGV4T2YoXCJwcmV2ZW50RXh0ZW5zaW9uc1wiKT49MCkge1xyXG5cdCAgICAgICAgXHR2YXIgY2hhbmdlID0ge29iamVjdDp0YXJnZXQsdHlwZTpcInByZXZlbnRFeHRlbnNpb25zXCJ9LFxyXG5cdFx0XHRcdFx0c3RhcnQgPSB0aGlzLmNoYW5nZXNldC5sZW5ndGggPT09IDAsXHJcblx0XHRcdFx0XHRkZWxpdmVyID0gdGhpcy5kZWxpdmVyKCk7XHJcblx0ICAgICAgICBcdHRoaXMuY2hhbmdlc2V0LnB1c2goY2hhbmdlKTtcclxuXHQgICAgICAgIFx0aWYoc3RhcnQpIHtcclxuXHQgICAgICAgIFx0XHRkZWxpdmVyKGZhbHNlLCh0eXBlb2YoZGVsaXZlci5kZWxheSk9PT1cIm51bWJlclwiID8gZGVsaXZlci5kZWxheSA6IDEwKSk7XHJcblx0ICAgICAgICBcdH1cclxuXHQgICAgXHR9XHJcblx0ICAgIFx0cmV0dXJuIHRydWU7XHJcblx0ICAgIH07XHJcblx0ICAgIE9iamVjdC5vYnNlcnZlID0gZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrLGFjY2VwdGxpc3QscGF1c2FibGUscGF1c2UsZGVsYXkpIHtcclxuXHQgICAgXHRyZXR1cm4gbmV3IE9ic2VydmVyKG9iamVjdCxjYWxsYmFjayxhY2NlcHRsaXN0LHBhdXNhYmxlLHBhdXNlLGRlbGF5KTtcclxuXHQgICAgfTtcclxuXHQgICAgT2JqZWN0LnVub2JzZXJ2ZSA9IGZ1bmN0aW9uKG9iamVjdCxjYWxsYmFjaykge1xyXG5cdCAgICBcdGlmKG9iamVjdC5fX29ic2VydmVyQ2FsbGJhY2tzX18pIHtcclxuXHQgICAgXHRcdGlmKCFjYWxsYmFjaykge1xyXG5cdCAgICBcdFx0XHRvYmplY3QuX19vYnNlcnZlckNhbGxiYWNrc19fLnNwbGljZSgwLG9iamVjdC5fX29ic2VydmVyQ2FsbGJhY2tzX18ubGVuZ3RoKTtcclxuXHQgICAgXHRcdFx0b2JqZWN0Ll9fb2JzZXJ2ZXJzX18uc3BsaWNlKDAsb2JqZWN0Ll9fb2JzZXJ2ZXJzX18ubGVuZ3RoKTtcclxuXHQgICAgXHRcdFx0cmV0dXJuO1xyXG5cdCAgICBcdFx0fVxyXG5cdCAgICBcdFx0b2JqZWN0Ll9fb2JzZXJ2ZXJDYWxsYmFja3NfXy5mb3JFYWNoKGZ1bmN0aW9uKG9ic2VydmVyY2FsbGJhY2ssaSkge1xyXG5cdCAgICBcdFx0XHRpZihjYWxsYmFjaz09PW9ic2VydmVyY2FsbGJhY2spIHtcclxuXHQgICAgXHRcdFx0XHRvYmplY3QuX19vYnNlcnZlckNhbGxiYWNrc19fLnNwbGljZShpLDEpO1xyXG5cdCAgICBcdFx0XHRcdGRlbGV0ZSBvYmplY3QuX19vYnNlcnZlcnNfX1tpXS5jYWxsYmFjaztcclxuXHQgICAgXHRcdFx0XHRvYmplY3QuX19vYnNlcnZlcnNfXy5zcGxpY2UoaSwxKTtcclxuXHQgICAgXHRcdFx0fVxyXG5cdCAgICBcdFx0fSk7XHJcblx0ICAgIFx0fVxyXG5cdCAgICB9O1xyXG5cdCAgICBBcnJheS5vYnNlcnZlID0gZnVuY3Rpb24ob2JqZWN0LGNhbGxiYWNrLGFjY2VwdGxpc3QscGF1c2FibGUscGF1c2UsZGVsYXkpIHtcclxuXHQgICAgXHRpZighKG9iamVjdCBpbnN0YW5jZW9mIEFycmF5KSAmJiAhQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XHJcblx0ICAgIFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKFwiRmlyc3QgYXJndW1lbnQgdG8gQXJyYXkub2JzZXJ2ZXIgaXMgbm90IGFuIEFycmF5XCIpO1xyXG5cdCAgICBcdH1cclxuICAgICAgICAgICAgXHRhY2NlcHRsaXN0ID0gYWNjZXB0bGlzdCB8fCBbXCJhZGRcIiwgXCJ1cGRhdGVcIiwgXCJkZWxldGVcIiwgXCJzcGxpY2VcIl07XHJcblx0ICAgIFx0dmFyIGFycmF5cHJveHkgPSBuZXcgUHJveHkob2JqZWN0LHtnZXQ6IGZ1bmN0aW9uKHRhcmdldCxwcm9wZXJ0eSkge1xyXG5cdCAgICBcdFx0aWYocHJvcGVydHk9PT1cInVub2JzZXJ2ZVwiKSB7XHJcblx0XHQgICAgXHRcdHJldHVybiBmdW5jdGlvbihjYWxsYmFjaykge1xyXG5cdFx0ICAgIFx0XHRcdGlmKGNhbGxiYWNrKSB7XHJcblx0XHQgICAgXHRcdFx0XHRyZXR1cm4gT2JqZWN0LnVub2JzZXJ2ZSh0YXJnZXQsY2FsbGJhY2spO1xyXG5cdFx0ICAgIFx0XHRcdH1cclxuXHRcdCAgICBcdFx0XHRyZXR1cm4gdGFyZ2V0LnVub2JzZXJ2ZSgpO1xyXG5cdFx0ICAgIFx0XHR9O1xyXG5cdFx0ICAgIFx0fVxyXG5cdCAgICBcdFx0aWYocHJvcGVydHk9PT1cInNwbGljZVwiKSB7XHJcblx0ICAgIFx0XHRcdHJldHVybiBmdW5jdGlvbihzdGFydCxlbmQpIHtcclxuXHQgICAgXHRcdFx0XHRpZih0eXBlb2Yoc3RhcnQpIT09XCJudW1iZXJcIiB8fCB0eXBlb2YoZW5kKSE9PVwibnVtYmVyXCIpIHtcclxuXHQgICAgXHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCB0d28gYXJndW1lbnRzIHRvIEFycmF5IHNwbGljZSBhcmUgbm90IG51bWJlciwgbnVtYmVyXCIpO1xyXG5cdCAgICBcdFx0XHRcdH1cclxuXHQgICAgXHQgICAgXHRcdHZhciByZW1vdmVkID0gdGhpcy5zbGljZShzdGFydCxzdGFydCtlbmQpLFxyXG5cdCAgICBcdCAgICBcdFx0XHRhZGRlZENvdW50ID0gKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzLmxlbmd0aC0yIDogMCksXHJcblx0ICAgIFx0ICAgIFx0XHRcdGNoYW5nZSA9ICB7b2JqZWN0Om9iamVjdCx0eXBlOlwic3BsaWNlXCIsaW5kZXg6c3RhcnQscmVtb3ZlZDpyZW1vdmVkLGFkZGVkQ291bnQ6YWRkZWRDb3VudH07XHJcblx0ICAgIFx0ICAgIFx0XHR0YXJnZXQuc3BsaWNlLmFwcGx5KHRhcmdldCxhcmd1bWVudHMpO1xyXG5cdCAgICBcdCAgICBcdFx0aWYoYWNjZXB0bGlzdC5pbmRleE9mKFwic3BsaWNlXCIpPj0wKSB7XHJcblx0ICAgIFx0ICAgIFx0XHRcdHZhciBzdGFydCA9IHByb3h5Ll9fb2JzZXJ2ZXJfXy5jaGFuZ2VzZXQubGVuZ3RoID09PSAwLFxyXG5cdCAgICBcdCAgICAgICAgXHRcdFx0ZGVsaXZlciA9IHByb3h5Ll9fb2JzZXJ2ZXJfXy5kZWxpdmVyKCk7XHJcblx0ICAgIFx0ICAgIFx0XHRcdHByb3h5Ll9fb2JzZXJ2ZXJfXy5jaGFuZ2VzZXQucHVzaChjaGFuZ2UpO1xyXG5cdCAgICBcdCAgICBcdFx0XHRpZihzdGFydCkge1xyXG5cdCAgICBcdFx0ICAgICAgICBcdFx0ZGVsaXZlcihmYWxzZSwodHlwZW9mKGRlbGl2ZXIuZGVsYXkpPT09XCJudW1iZXJcIiA/IGRlbGl2ZXIuZGVsYXkgOiAxMCkpO1xyXG5cdCAgICBcdFx0ICAgICAgICBcdH1cclxuXHQgICAgXHQgICAgXHRcdH1cclxuXHQgICAgXHQgICAgXHR9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRpZihwcm9wZXJ0eT09PVwicHVzaFwiKSB7XHJcblx0ICAgIFx0XHRcdCByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xyXG5cdCAgICBcdFx0ICAgIFx0cmV0dXJuIHRoaXMuc3BsaWNlKHRoaXMubGVuZ3RoLDAsaXRlbSk7XHJcblx0ICAgIFx0XHQgICAgfVxyXG5cdCAgICBcdFx0fVxyXG5cdCAgICBcdFx0aWYocHJvcGVydHk9PT1cInBvcFwiKSB7XHJcblx0ICAgIFx0XHRcdCByZXR1cm4gZnVuY3Rpb24oKSB7XHJcblx0ICAgIFx0XHQgICAgXHRyZXR1cm4gdGhpcy5zcGxpY2UodGhpcy5sZW5ndGgtMSwxKTtcclxuXHQgICAgXHRcdCAgICB9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRpZihwcm9wZXJ0eT09PVwidW5zaGlmdFwiKSB7XHJcblx0ICAgIFx0XHRcdCByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xyXG4gICAgXHRcdCAgICBcdFx0cmV0dXJuIHRoaXMuc3BsaWNlKDAsMCxpdGVtKTtcclxuICAgIFx0XHQgICAgXHR9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRpZihwcm9wZXJ0eT09PVwic2hpZnRcIikge1xyXG5cdCAgICBcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XHJcblx0ICAgIFx0ICAgIFx0XHRyZXR1cm4gdGhpcy5zcGxpY2UoMCwxKTtcclxuXHQgICAgXHQgICAgXHR9XHJcblx0ICAgIFx0XHR9XHJcblx0ICAgIFx0XHRyZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XTtcclxuXHQgICAgXHR9fSk7XHJcblx0ICAgIFx0dmFyIHByb3h5ID0gT2JqZWN0Lm9ic2VydmUoYXJyYXlwcm94eSxmdW5jdGlvbihjaGFuZ2VzZXQpIHsgXHJcblx0ICAgIFx0XHR2YXIgY2hhbmdlcyA9IGNoYW5nZXNldC5maWx0ZXIoZnVuY3Rpb24oY2hhbmdlKSB7IHJldHVybiBjaGFuZ2UubmFtZSE9PVwibGVuZ3RoXCIgJiYgY2hhbmdlLm5hbWUhPT1cImFkZFwiICYmICghYWNjZXB0bGlzdCB8fCBhY2NlcHRsaXN0LmluZGV4T2YoY2hhbmdlLnR5cGUpPj0wKTsgfSk7XHJcblx0ICAgIFx0XHRpZihjaGFuZ2VzLmxlbmd0aD4wKSB7XHJcblx0ICAgIFx0XHRcdGNhbGxiYWNrKGNoYW5nZXMpO1xyXG5cdCAgICBcdFx0fVxyXG5cdCAgICBcdH0sYWNjZXB0bGlzdCxwYXVzYWJsZSxwYXVzZSxkZWxheSk7XHJcblx0ICAgIFx0cmV0dXJuIHByb3h5O1xyXG5cdCAgICB9O1xyXG5cdCAgICBBcnJheS51bm9ic2VydmUgPSBmdW5jdGlvbihvYmplY3QsY2FsbGJhY2spIHtcclxuXHRcdCAgcmV0dXJuIG9iamVjdC51bm9ic2VydmUoY2FsbGJhY2spO1xyXG5cdCAgICB9XHJcblx0fVxyXG5cdE9iamVjdC5kZWVwT2JzZXJ2ZSA9IGZ1bmN0aW9uKG9iamVjdCxjYWxsYmFjayxwYXJ0cykge1xyXG5cclxuXHRcdHBhcnRzID0gKHBhcnRzID8gcGFydHMgOiBbXSk7XHJcblxyXG5cdFx0dmFyIHRvVHlwZU5hbWUgPSBmdW5jdGlvbihvYmopIHtcclxuXHRcdFx0cmV0dXJuICh7fSkudG9TdHJpbmcuY2FsbChvYmopLm1hdGNoKC9cXHMoW2EtekEtWl0rKS8pWzFdLnRvTG93ZXJDYXNlKClcclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiByZW9ic2VydmUodmFsdWUsIHBhcnRzKSB7XHJcblx0XHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xyXG5cdFx0XHRrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XHJcblx0XHRcdFx0aWYoKHRvVHlwZU5hbWUodmFsdWVba2V5XSkgPT09ICdvYmplY3QnIHx8IHRvVHlwZU5hbWUodmFsdWVba2V5XSkgPT09ICdhcnJheScpICYmICF2YWx1ZVtrZXldLmhhc093blByb3BlcnR5KCdfX29ic2VydmVyc19fJykpIHtcclxuXHRcdFx0XHRcdHZhciBuZXdwYXJ0cyA9IHBhcnRzLnNsaWNlKDApO1xyXG5cdFx0XHRcdFx0bmV3cGFydHMucHVzaChrZXkpO1xyXG5cdFx0XHRcdFx0dmFsdWVba2V5XSA9IE9iamVjdC5kZWVwT2JzZXJ2ZSh2YWx1ZVtrZXldLGNhbGxiYWNrLG5ld3BhcnRzKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJlb2JzZXJ2ZShvYmplY3QsIHBhcnRzKTtcclxuXHJcblx0XHR2YXIgb2JzZXJ2ZWQgPSBPYmplY3Qub2JzZXJ2ZShvYmplY3QsZnVuY3Rpb24oY2hhbmdlc2V0KSB7XHJcblx0XHRcdHZhciBjaGFuZ2VzID0gW107XHJcblx0XHRcdGZ1bmN0aW9uIHJlY3Vyc2UobmFtZSxyb290T2JqZWN0LG9sZE9iamVjdCxuZXdPYmplY3QscGF0aCkge1xyXG5cdFx0XHRcdGlmKG5ld09iamVjdCBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG5cdFx0XHRcdFx0dmFyIG5ld2tleXMgPSBPYmplY3Qua2V5cyhuZXdPYmplY3QpO1xyXG5cdFx0XHRcdFx0bmV3a2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xyXG5cdFx0XHRcdFx0XHRpZighb2xkT2JqZWN0IHx8IChvbGRPYmplY3Rba2V5XSE9PW5ld09iamVjdFtrZXldKSkge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBvbGR2YWx1ZSA9IChvbGRPYmplY3QgJiYgb2xkT2JqZWN0W2tleV0hPT11bmRlZmluZWQgPyBvbGRPYmplY3Rba2V5XSA6IHVuZGVmaW5lZCksXHJcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2UgPSAob2xkdmFsdWU9PT11bmRlZmluZWQgPyBcImFkZFwiIDogXCJ1cGRhdGVcIiksXHJcblx0XHRcdFx0XHRcdFx0XHRrZXlwYXRoID0gcGF0aCArIFwiLlwiICsga2V5O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzLnB1c2goe25hbWU6bmFtZSxvYmplY3Q6cm9vdE9iamVjdCx0eXBlOmNoYW5nZSxvbGRWYWx1ZTpvbGR2YWx1ZSxuZXdWYWx1ZTpuZXdPYmplY3Rba2V5XSxrZXlwYXRoOmtleXBhdGh9KTtcclxuXHRcdFx0XHRcdFx0XHRyZWN1cnNlKG5hbWUscm9vdE9iamVjdCxvbGR2YWx1ZSxuZXdPYmplY3Rba2V5XSxrZXlwYXRoKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSBlbHNlIGlmKG9sZE9iamVjdCBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG5cdFx0XHRcdFx0dmFyIG9sZGtleXMgPSBPYmplY3Qua2V5cyhvbGRPYmplY3QpO1xyXG5cdFx0XHRcdFx0b2xka2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xyXG5cdFx0XHRcdFx0XHR2YXIgY2hhbmdlID0gKG5ld09iamVjdD09PW51bGwgPyBcInVwZGF0ZVwiIDogXCJkZWxldGVcIiksXHJcblx0XHRcdFx0XHRcdFx0a2V5cGF0aCA9IHBhdGggKyBcIi5cIiArIGtleTtcclxuXHRcdFx0XHRcdFx0XHRcclxuXHRcdFx0XHRcdFx0Y2hhbmdlcy5wdXNoKHtuYW1lOm5hbWUsb2JqZWN0OnJvb3RPYmplY3QsdHlwZTpjaGFuZ2Usb2xkVmFsdWU6b2xkT2JqZWN0W2tleV0sbmV3VmFsdWU6bmV3T2JqZWN0LGtleXBhdGg6a2V5cGF0aH0pO1xyXG5cdFx0XHRcdFx0XHRyZWN1cnNlKG5hbWUscm9vdE9iamVjdCxvbGRPYmplY3Rba2V5XSx1bmRlZmluZWQsa2V5cGF0aCk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0Y2hhbmdlc2V0LmZvckVhY2goZnVuY3Rpb24oY2hhbmdlKSB7XHJcblx0XHRcdFx0dmFyIGtleXBhdGggPSAocGFydHMubGVuZ3RoPjAgPyBwYXJ0cy5qb2luKFwiLlwiKSArIFwiLlwiIDogXCJcIikgKyBjaGFuZ2UubmFtZTtcclxuXHJcblx0XHRcdFx0aWYgKGNoYW5nZS50eXBlID09PSBcInVwZGF0ZVwiIHx8IGNoYW5nZS50eXBlID09PSBcImFkZFwiKSB7IFxyXG5cdFx0XHRcdFx0cmVvYnNlcnZlKGNoYW5nZS5vYmplY3QsIHBhcnRzKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGNoYW5nZXMucHVzaCh7bmFtZTpjaGFuZ2UubmFtZSxvYmplY3Q6Y2hhbmdlLm9iamVjdCx0eXBlOmNoYW5nZS50eXBlLG9sZFZhbHVlOmNoYW5nZS5vbGRWYWx1ZSxuZXdWYWx1ZTpjaGFuZ2Uub2JqZWN0W2NoYW5nZS5uYW1lXSxrZXlwYXRoOmtleXBhdGh9KTtcclxuXHRcdFx0XHRyZWN1cnNlKGNoYW5nZS5uYW1lLGNoYW5nZS5vYmplY3QsY2hhbmdlLm9sZFZhbHVlLGNoYW5nZS5vYmplY3RbY2hhbmdlLm5hbWVdLGtleXBhdGgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0Y2FsbGJhY2soY2hhbmdlcyk7XHJcblx0XHR9KTtcclxuXHRcdHJldHVybiBvYnNlcnZlZDtcclxuXHR9O1xyXG59KSgpO1xyXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///19\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _utils_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\nvar ReThinkCtx =\n/*#__PURE__*/\nfunction () {\n function ReThinkCtx() {\n _classCallCheck(this, ReThinkCtx);\n\n this.defaultBehaviour = true;\n this.groups = {};\n }\n\n _createClass(ReThinkCtx, [{\n key: "scheme",\n get: function get() {\n return this._scheme;\n },\n set: function set(params) {\n var from = params.message.from;\n\n if (Object(_utils_utils__WEBPACK_IMPORTED_MODULE_0__[/* isDataObjectURL */ "s"])(from)) {\n this._scheme = Object(_utils_utils__WEBPACK_IMPORTED_MODULE_0__[/* divideURL */ "k"])(from).type;\n } else {\n this._scheme = undefined;\n }\n }\n }, {\n key: "date",\n get: function get() {\n return this._date;\n },\n set: function set(now) {\n var date = new Date();\n var day = String(date.getDate());\n\n if (day.length === 1) {\n day = \'0\' + day;\n }\n\n var month = String(date.getMonth() + 1);\n\n if (month.length === 1) {\n month = \'0\' + month;\n }\n\n this._date = day + \'/\' + month + \'/\' + date.getFullYear();\n }\n }, {\n key: "domain",\n get: function get() {\n return this._domain;\n },\n set: function set(params) {\n if (params.message.body.identity !== undefined) {\n this._domain = Object(_utils_utils__WEBPACK_IMPORTED_MODULE_0__[/* divideEmail */ "j"])(params.message.body.identity.userProfile.username).domain;\n }\n }\n }, {\n key: "type",\n get: function get() {\n return this._type;\n },\n set: function set(params) {\n var message = params.message;\n\n if (message.body.value !== undefined) {\n this._type = message.body.value.resourceType;\n }\n }\n }, {\n key: "source",\n get: function get() {\n return this._source;\n },\n set: function set(params) {\n if (params.message.body.identity !== undefined) {\n this._source = params.message.body.identity.userProfile.username;\n }\n }\n }, {\n key: "time",\n get: function get() {\n return this._time;\n },\n set: function set(now) {\n now = new Date();\n var minutes = String(now.getMinutes());\n\n if (minutes.length === 1) {\n minutes = \'0\' + minutes;\n }\n\n this._time = parseInt(String(now.getHours()) + minutes);\n }\n }, {\n key: "weekday",\n get: function get() {\n return this._weekday;\n },\n set: function set(now) {\n this._weekday = String(new Date().getDay());\n }\n }]);\n\n return ReThinkCtx;\n}();\n\n/* harmony default export */ __webpack_exports__["default"] = (ReThinkCtx);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L1JlVGhpbmtDdHguanM/Y2MzMSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2RpdmlkZUVtYWlsLCBkaXZpZGVVUkwsIGlzRGF0YU9iamVjdFVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5cclxuY2xhc3MgUmVUaGlua0N0eCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5kZWZhdWx0QmVoYXZpb3VyID0gdHJ1ZTtcclxuICAgIHRoaXMuZ3JvdXBzID0ge307XHJcbiAgfVxyXG5cclxuICBnZXQgc2NoZW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NjaGVtZTtcclxuICB9XHJcblxyXG4gIGdldCBkYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGU7XHJcbiAgfVxyXG5cclxuICBnZXQgZG9tYWluKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpbjtcclxuICB9XHJcblxyXG4gIGdldCB0eXBlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XHJcbiAgfVxyXG5cclxuICBnZXQgc291cmNlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcclxuICB9XHJcblxyXG4gIGdldCB0aW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RpbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgd2Vla2RheSgpIHtcclxuICAgIHJldHVybiB0aGlzLl93ZWVrZGF5O1xyXG4gIH1cclxuXHJcbiAgc2V0IHNjaGVtZShwYXJhbXMpIHtcclxuICAgIGxldCBmcm9tID0gcGFyYW1zLm1lc3NhZ2UuZnJvbTtcclxuICAgIGlmIChpc0RhdGFPYmplY3RVUkwoZnJvbSkpIHtcclxuICAgICAgdGhpcy5fc2NoZW1lID0gZGl2aWRlVVJMKGZyb20pLnR5cGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zY2hlbWUgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXQgZGF0ZShub3cpIHtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIGxldCBkYXkgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgaWYgKGRheS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgZGF5ID0gJzAnICsgZGF5O1xyXG4gICAgfVxyXG4gICAgbGV0IG1vbnRoID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xyXG4gICAgaWYgKG1vbnRoLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICBtb250aCA9ICcwJyArIG1vbnRoO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGF0ZSA9IGRheSArICcvJyArIG1vbnRoICsgJy8nICsgZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRvbWFpbihwYXJhbXMpIHtcclxuICAgIGlmIChwYXJhbXMubWVzc2FnZS5ib2R5LmlkZW50aXR5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fZG9tYWluID0gZGl2aWRlRW1haWwocGFyYW1zLm1lc3NhZ2UuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZS51c2VybmFtZSkuZG9tYWluO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IHR5cGUocGFyYW1zKSB7XHJcbiAgICBsZXQgbWVzc2FnZSA9IHBhcmFtcy5tZXNzYWdlO1xyXG4gICAgaWYgKG1lc3NhZ2UuYm9keS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuX3R5cGUgPSBtZXNzYWdlLmJvZHkudmFsdWUucmVzb3VyY2VUeXBlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0IHNvdXJjZShwYXJhbXMpIHtcclxuICAgIGlmIChwYXJhbXMubWVzc2FnZS5ib2R5LmlkZW50aXR5ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fc291cmNlID0gcGFyYW1zLm1lc3NhZ2UuYm9keS5pZGVudGl0eS51c2VyUHJvZmlsZS51c2VybmFtZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCB0aW1lKG5vdykge1xyXG4gICAgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIGxldCBtaW51dGVzID0gU3RyaW5nKG5vdy5nZXRNaW51dGVzKCkpO1xyXG4gICAgaWYgKG1pbnV0ZXMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgIG1pbnV0ZXMgPSAnMCcgKyBtaW51dGVzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGltZSA9IHBhcnNlSW50KFN0cmluZyhub3cuZ2V0SG91cnMoKSkgKyBtaW51dGVzKTtcclxuICB9XHJcblxyXG4gIHNldCB3ZWVrZGF5KG5vdykge1xyXG4gICAgdGhpcy5fd2Vla2RheSA9IFN0cmluZyhuZXcgRGF0ZSgpLmdldERheSgpKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSZVRoaW5rQ3R4O1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBMEJBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBL0JBO0FBQ0E7QUFDQTtBQStCQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTs7O0FBeENBO0FBQ0E7QUFDQTtBQXdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUExQ0E7QUFDQTtBQUNBO0FBMENBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBOzs7QUE3Q0E7QUFDQTtBQUNBO0FBNkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQS9DQTtBQUNBO0FBQ0E7QUErQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQXBEQTtBQUNBO0FBQ0E7QUFvREE7QUFDQTtBQUNBOzs7Ozs7QUFJQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///20\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);\n/* harmony import */ var loglevel__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(loglevel__WEBPACK_IMPORTED_MODULE_0__);\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar log = loglevel__WEBPACK_IMPORTED_MODULE_0__[\"getLogger\"]('StorageManager');\n\nvar StorageManager =\n/*#__PURE__*/\nfunction () {\n function StorageManager(db, storageName, schemas, runtimeUA) {\n var version = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 1;\n var remoteStorage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n _classCallCheck(this, StorageManager);\n\n if (!db) throw Error('The Storage Manager needs the database instance');\n if (!storageName) throw Error('The Storage Manager needs the storage name');\n var stores = {};\n\n if (schemas) {\n stores = schemas;\n } else {\n stores[storageName] = 'key,version,value';\n } // db.version(version).stores(stores);\n\n\n db.open().then(function (db) {\n log.info('Found database name ' + db.name + ' with version no: ' + db.verno);\n }).catch(log.error);\n this.db = db;\n this.storageName = storageName;\n this._remoteStorage = remoteStorage;\n this._runtimeUA = runtimeUA;\n } // set remoteStorage backup server URL\n\n\n _createClass(StorageManager, [{\n key: \"connect\",\n // start sync with remoteStorage server. Returns a promise that resolves if connection is performed otherwise it is rejected\n value: function connect(options) {\n return this.db.connect(this._remoteStorage, options);\n } // stop sync with remoteStorage server. Returns promise \n\n }, {\n key: \"disconnect\",\n value: function disconnect() {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n _this.db.disconnect(_this._remoteStorage).then(function () {\n resolve();\n }, function (error) {\n reject(error);\n });\n });\n } // to retrieve the last revision stored in the backup server\n\n }, {\n key: \"getBackupRevision\",\n value: function getBackupRevision(resource) {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n _this2.db._syncNodes.get({\n type: 'remote'\n }).then(function (status) {\n console.log('[StorageManager.getBackupRevision] retrieved status: ', status);\n\n if (status && status.hasOwnProperty('appliedRemoteRevision')) {\n if (status.appliedRemoteRevision === null) status.appliedRemoteRevision = 0;\n resolve(status.appliedRemoteRevision);\n }\n });\n });\n } // to retrieve the last revision stored in the backup server\n // and broadcast it\n\n }, {\n key: \"_updateBackupRevision\",\n value: function _updateBackupRevision(resource) {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n _this3.db._syncNodes.get({\n type: 'remote'\n }).then(function (status) {\n console.log('[StorageManager._updateBackupRevision] retrieved status: ', status);\n\n if (status && status.hasOwnProperty('appliedRemoteRevision')) {\n if (status.appliedRemoteRevision === null) status.appliedRemoteRevision = 0;\n\n _this3._runtimeUA._updateRuntimeStatus({\n resource: resource,\n value: {\n backupRevision: status.appliedRemoteRevision\n }\n });\n\n resolve(status.appliedRemoteRevision);\n }\n });\n });\n }\n }, {\n key: \"_checkKey\",\n value: function _checkKey(key) {\n if (typeof key !== 'string') return key.toString();\n return key;\n }\n }, {\n key: \"_getTable\",\n value: function _getTable(key) {\n var name;\n\n try {\n name = this.db.table(this.storageName).name;\n } catch (error) {\n // try {\n name = this.db.table(key).name;\n /* } catch (error) {\r\n log.error('[StorageManager._getTable] error ', error);\r\n name = false;\r\n }*/\n }\n\n return name;\n }\n }, {\n key: \"_getPrimaryKey\",\n value: function _getPrimaryKey(table) {\n return this.db.table(table).schema.primKey.name;\n }\n }, {\n key: \"_isDefaultSchema\",\n value: function _isDefaultSchema(table) {\n var name = this._getTable(table);\n\n var schema = this.db[name].schema.instanceTemplate;\n return schema.hasOwnProperty('value') && schema.hasOwnProperty('version') && schema.hasOwnProperty('key');\n }\n /**\r\n * Adds a new entry to the database for a given key, together with its version.\r\n * If an entry for the given key is already stored in the database, it will be updated.\r\n * @param {!string} key - key that can be used with {@link storageManager.get} to retrieve the value object\r\n * @param {!string} version - version descriptor for the given value\r\n * @param value - value stored in the database that is mapped to given key\r\n * @param {!string} table - table which should be looking for\r\n * @returns {Promise} result - Promise that will be fulfilled with the key if the entry was stored successfully,\r\n * otherwise it is rejected with an error.\r\n * @memberof StorageManager\r\n */\n\n }, {\n key: \"set\",\n value: function set(key, version, value, table) {\n var _this4 = this;\n\n var updateRuntimeStatus = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n return new Promise(function (resolve, reject) {\n log.info('[StorageManager] - set ', key, value);\n table = table ? table : key;\n\n var name = _this4._getTable(table);\n\n var primaryKey = _this4._getPrimaryKey(name); // Object.assign(value, {version: version});\n\n\n var data = value;\n\n if (_this4._isDefaultSchema(table)) {\n data = {\n key: key,\n version: version,\n value: value\n };\n } else {\n var tmp = {};\n tmp[primaryKey] = key;\n Object.assign(data, tmp);\n }\n\n _this4.db[name].put(data).then(function () {\n if (updateRuntimeStatus && data.backup && data.url) {\n _this4._updateBackupRevision(data.url).then(function () {\n resolve();\n });\n } else resolve();\n }, function () {\n resolve();\n });\n });\n }\n /**\r\n * Get a entry value from the database for a given key.\r\n * If no entry is found undefined is returned.\r\n * @param {!string} key - key that was stored using {@link storageManager.set}\r\n * @param {!any} value - value which should be found\r\n * @param {!string} table - table which should be looking for\r\n * @returns {Promise} result - Promise that will be fulfilled with the value.\r\n * @memberof StorageManager\r\n */\n\n }, {\n key: \"get\",\n value: function get(key, value, table) {\n var _this5 = this;\n\n console.info('[StorageManager] - get ', key, value);\n table = table ? table : key;\n\n var name = this._getTable(table);\n\n if (!name) return undefined;\n\n var primaryKey = this._getPrimaryKey(name);\n\n return this.db.transaction('rw!', this.db[name], function () {\n if (!key && !value) {\n return _this5.db[name].toArray().then(function (objects) {\n if (objects.length > 0) {\n return objects.reduce(function (acc, key) {\n acc[key[primaryKey]] = key;\n return acc;\n }, function () {\n return {};\n });\n } else return {};\n });\n }\n\n if (!value) {\n return _this5.db[name].where(primaryKey).equals(key).first().then(function (object) {\n if (object && object.hasOwnProperty('value')) {\n return object.value;\n } else {\n return object;\n }\n });\n } else {\n var type = _typeof(value);\n\n if (Array.isArray(value)) {\n type = 'array';\n }\n\n switch (type) {\n case 'string':\n return _this5.db[name].where(key).equals(value).first().then(function (object) {\n if (object && object.hasOwnProperty('value')) {\n return object.value;\n } else {\n return object;\n }\n });\n\n case 'object':\n {\n var strPath = 'value.' + Object.keys(value).toString();\n var strValue = Object.values(value);\n console.log(strPath, strValue);\n return _this5.db[name].where(strPath).anyOf(strValue).first().then(function (object) {\n if (object && object.hasOwnProperty('value')) {\n return object.value;\n } else {\n return object;\n }\n });\n }\n\n case 'array':\n console.log('ARRAY:', value);\n return _this5.db[name].where(value).then(function (object) {\n if (object && object.hasOwnProperty('value')) {\n return object.value;\n } else {\n return object;\n }\n });\n }\n }\n });\n }\n /**\r\n * Get a entry version from the database for a given key.\r\n * If no entry is found undefined is returned.\r\n * @param {!string} key - key that was stored using {@link storageManager.set}\r\n * @param {any} value - the value which sould be used to find the storage resource\r\n * @param {!string} table - table which should be looking for\r\n * @returns {Promise} result - Promise that will be fulfilled with the version.\r\n * @memberof StorageManager\r\n */\n\n }, {\n key: \"getVersion\",\n value: function getVersion(key, value, table) {\n var _this6 = this;\n\n log.info('[StorageManager] - getVersion for key ', key);\n table = table ? table : key;\n\n var name = this._getTable(table);\n\n var primaryKey = this._getPrimaryKey(name);\n\n var data = value;\n\n if (!value) {\n data = key;\n }\n\n return this.db.transaction('rw!', this.db[name], function () {\n return _this6.db[name].where(primaryKey).equals(data).first().then(function (object) {\n if (object && object.hasOwnProperty('version')) {\n return object.version;\n } else {\n return object;\n }\n }).catch(function (error) {\n log.info('error getting the version for ', key, ' with error: ', error);\n return undefined;\n });\n });\n }\n /**\r\n * Delete a entry from the database for a given key or the full DB in case the key is not provided.\r\n * @param {!string} key - key that was stored using {@link storageManager.set}\r\n * @param {!any} value - the value which sould be used to find the storage resource\r\n * @param {!string} table - table which should be looking for\r\n * @returns {Promise} result - Promise that will be fulfilled with the number of affected rows.\r\n * @memberof StorageManager\r\n */\n\n }, {\n key: \"delete\",\n value: function _delete(key, value, table) {\n if (key) {\n table = table ? table : key;\n\n var name = this._getTable(table);\n\n var primaryKey = this._getPrimaryKey(name);\n\n var data = value;\n\n if (!value) {\n data = key;\n }\n\n return this.db[name].where(primaryKey).equals(data).delete();\n } else return this.db.delete();\n }\n }, {\n key: \"remoteStorage\",\n set: function set(remoteStorage) {\n this._remoteStorage = remoteStorage;\n }\n }]);\n\n return StorageManager;\n}();\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (StorageManager);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjEuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvc3RvcmFnZS1tYW5hZ2VyL1N0b3JhZ2VNYW5hZ2VyLmpzPzhiMjEiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignU3RvcmFnZU1hbmFnZXInKTtcclxuXHJcbmNsYXNzIFN0b3JhZ2VNYW5hZ2VyIHtcclxuXHJcbiAgY29uc3RydWN0b3IoZGIsIHN0b3JhZ2VOYW1lLCBzY2hlbWFzLCBydW50aW1lVUEsIHZlcnNpb24gPSAxLCByZW1vdGVTdG9yYWdlID0gZmFsc2UpIHtcclxuICAgIGlmICghZGIpIHRocm93IEVycm9yKCdUaGUgU3RvcmFnZSBNYW5hZ2VyIG5lZWRzIHRoZSBkYXRhYmFzZSBpbnN0YW5jZScpO1xyXG4gICAgaWYgKCFzdG9yYWdlTmFtZSkgdGhyb3cgRXJyb3IoJ1RoZSBTdG9yYWdlIE1hbmFnZXIgbmVlZHMgdGhlIHN0b3JhZ2UgbmFtZScpO1xyXG5cclxuICAgIGxldCBzdG9yZXMgPSAge307XHJcblxyXG4gICAgaWYgKHNjaGVtYXMpIHtcclxuICAgICAgc3RvcmVzID0gc2NoZW1hcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0b3Jlc1tzdG9yYWdlTmFtZV0gPSAna2V5LHZlcnNpb24sdmFsdWUnO1xyXG4gICAgfVxyXG5cclxuLy8gICAgZGIudmVyc2lvbih2ZXJzaW9uKS5zdG9yZXMoc3RvcmVzKTtcclxuICAgIGRiLm9wZW4oKS50aGVuKChkYikgPT4ge1xyXG4gICAgICBsb2cuaW5mbygnRm91bmQgZGF0YWJhc2UgbmFtZSAnICsgZGIubmFtZSArICcgd2l0aCB2ZXJzaW9uIG5vOiAnICsgZGIudmVybm8pO1xyXG4gICAgfSkuY2F0Y2gobG9nLmVycm9yKTtcclxuXHJcbiAgICB0aGlzLmRiID0gZGI7XHJcbiAgICB0aGlzLnN0b3JhZ2VOYW1lID0gc3RvcmFnZU5hbWU7XHJcbiAgICB0aGlzLl9yZW1vdGVTdG9yYWdlID0gcmVtb3RlU3RvcmFnZTtcclxuICAgIHRoaXMuX3J1bnRpbWVVQSA9IHJ1bnRpbWVVQTtcclxuICB9XHJcblxyXG4gIC8vIHNldCByZW1vdGVTdG9yYWdlIGJhY2t1cCBzZXJ2ZXIgVVJMXHJcblxyXG4gIHNldCByZW1vdGVTdG9yYWdlKHJlbW90ZVN0b3JhZ2UpIHtcclxuICAgIHRoaXMuX3JlbW90ZVN0b3JhZ2UgPSByZW1vdGVTdG9yYWdlO1xyXG4gIH1cclxuXHJcbiAgLy8gc3RhcnQgc3luYyB3aXRoIHJlbW90ZVN0b3JhZ2Ugc2VydmVyLiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGlmIGNvbm5lY3Rpb24gaXMgcGVyZm9ybWVkIG90aGVyd2lzZSBpdCBpcyByZWplY3RlZFxyXG5cclxuICBjb25uZWN0KG9wdGlvbnMpIHtcclxuICAgIHJldHVybiB0aGlzLmRiLmNvbm5lY3QodGhpcy5fcmVtb3RlU3RvcmFnZSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvLyBzdG9wIHN5bmMgd2l0aCByZW1vdGVTdG9yYWdlIHNlcnZlci4gUmV0dXJucyBwcm9taXNlIFxyXG5cclxuICBkaXNjb25uZWN0KCkge1xyXG4gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuZGIuZGlzY29ubmVjdCh0aGlzLl9yZW1vdGVTdG9yYWdlKS50aGVuKCgpPT4ge1xyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICB9KTtcclxuICB9KTtcclxufVxyXG4gIC8vIHRvIHJldHJpZXZlIHRoZSBsYXN0IHJldmlzaW9uIHN0b3JlZCBpbiB0aGUgYmFja3VwIHNlcnZlclxyXG5cclxuICBnZXRCYWNrdXBSZXZpc2lvbihyZXNvdXJjZSkge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PiB7XHJcbiAgICAgIHRoaXMuZGIuX3N5bmNOb2Rlcy5nZXQoe3R5cGU6ICdyZW1vdGUnfSkudGhlbigoc3RhdHVzKT0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygnW1N0b3JhZ2VNYW5hZ2VyLmdldEJhY2t1cFJldmlzaW9uXSByZXRyaWV2ZWQgc3RhdHVzOiAnLCBzdGF0dXMpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgJiYgc3RhdHVzLmhhc093blByb3BlcnR5KCdhcHBsaWVkUmVtb3RlUmV2aXNpb24nKSkge1xyXG4gICAgICAgICAgaWYgKHN0YXR1cy5hcHBsaWVkUmVtb3RlUmV2aXNpb24gPT09IG51bGwpIHN0YXR1cy5hcHBsaWVkUmVtb3RlUmV2aXNpb24gPSAwO1xyXG5cclxuICAgICAgICAgIHJlc29sdmUoc3RhdHVzLmFwcGxpZWRSZW1vdGVSZXZpc2lvbik7XHJcbiAgICAgICAgfSBcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4gIC8vIHRvIHJldHJpZXZlIHRoZSBsYXN0IHJldmlzaW9uIHN0b3JlZCBpbiB0aGUgYmFja3VwIHNlcnZlclxyXG4gIC8vIGFuZCBicm9hZGNhc3QgaXRcclxuXHJcbiAgX3VwZGF0ZUJhY2t1cFJldmlzaW9uKHJlc291cmNlKSB7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKT0+IHtcclxuICAgICAgdGhpcy5kYi5fc3luY05vZGVzLmdldCh7dHlwZTogJ3JlbW90ZSd9KS50aGVuKChzdGF0dXMpPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbU3RvcmFnZU1hbmFnZXIuX3VwZGF0ZUJhY2t1cFJldmlzaW9uXSByZXRyaWV2ZWQgc3RhdHVzOiAnLCBzdGF0dXMpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgJiYgc3RhdHVzLmhhc093blByb3BlcnR5KCdhcHBsaWVkUmVtb3RlUmV2aXNpb24nKSkge1xyXG4gICAgICAgICAgaWYgKHN0YXR1cy5hcHBsaWVkUmVtb3RlUmV2aXNpb24gPT09IG51bGwpIHN0YXR1cy5hcHBsaWVkUmVtb3RlUmV2aXNpb24gPSAwO1xyXG5cclxuICAgICAgICAgIHRoaXMuX3J1bnRpbWVVQS5fdXBkYXRlUnVudGltZVN0YXR1cyhcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIHJlc291cmNlOiByZXNvdXJjZSxcclxuICAgICAgICAgICAgICB2YWx1ZTogeyBiYWNrdXBSZXZpc2lvbjogc3RhdHVzLmFwcGxpZWRSZW1vdGVSZXZpc2lvbiB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIClcclxuICAgICAgICAgIHJlc29sdmUoc3RhdHVzLmFwcGxpZWRSZW1vdGVSZXZpc2lvbik7XHJcbiAgICAgICAgfSBcclxuICAgIH0pO1xyXG4gIH0pO1xyXG59XHJcblxyXG4gIF9jaGVja0tleShrZXkpIHtcclxuICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykgcmV0dXJuIGtleS50b1N0cmluZygpO1xyXG4gICAgcmV0dXJuIGtleTtcclxuICB9XHJcblxyXG4gIF9nZXRUYWJsZShrZXkpIHtcclxuICAgIGxldCBuYW1lO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIG5hbWUgPSB0aGlzLmRiLnRhYmxlKHRoaXMuc3RvcmFnZU5hbWUpLm5hbWU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4vLyAgICAgIHRyeSB7XHJcbiAgICAgICAgbmFtZSA9IHRoaXMuZGIudGFibGUoa2V5KS5uYW1lO1xyXG4vKiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmVycm9yKCdbU3RvcmFnZU1hbmFnZXIuX2dldFRhYmxlXSBlcnJvciAnLCBlcnJvcik7XHJcbiAgICAgICAgbmFtZSA9IGZhbHNlO1xyXG4gICAgICB9Ki9cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIF9nZXRQcmltYXJ5S2V5KHRhYmxlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYi50YWJsZSh0YWJsZSkuc2NoZW1hLnByaW1LZXkubmFtZTtcclxuICB9XHJcblxyXG4gIF9pc0RlZmF1bHRTY2hlbWEodGFibGUpIHtcclxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9nZXRUYWJsZSh0YWJsZSk7XHJcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmRiW25hbWVdLnNjaGVtYS5pbnN0YW5jZVRlbXBsYXRlO1xyXG4gICAgcmV0dXJuIHNjaGVtYS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSAmJiBzY2hlbWEuaGFzT3duUHJvcGVydHkoJ3ZlcnNpb24nKSAmJiBzY2hlbWEuaGFzT3duUHJvcGVydHkoJ2tleScpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIG5ldyBlbnRyeSB0byB0aGUgZGF0YWJhc2UgZm9yIGEgZ2l2ZW4ga2V5LCB0b2dldGhlciB3aXRoIGl0cyB2ZXJzaW9uLlxyXG4gICAqIElmIGFuIGVudHJ5IGZvciB0aGUgZ2l2ZW4ga2V5IGlzIGFscmVhZHkgc3RvcmVkIGluIHRoZSBkYXRhYmFzZSwgaXQgd2lsbCBiZSB1cGRhdGVkLlxyXG4gICAqIEBwYXJhbSB7IXN0cmluZ30ga2V5IC0ga2V5IHRoYXQgY2FuIGJlIHVzZWQgd2l0aCB7QGxpbmsgc3RvcmFnZU1hbmFnZXIuZ2V0fSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgb2JqZWN0XHJcbiAgICogQHBhcmFtIHshc3RyaW5nfSB2ZXJzaW9uIC0gdmVyc2lvbiBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gdmFsdWVcclxuICAgKiBAcGFyYW0gdmFsdWUgLSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlIHRoYXQgaXMgbWFwcGVkIHRvIGdpdmVuIGtleVxyXG4gICAqIEBwYXJhbSB7IXN0cmluZ30gdGFibGUgLSB0YWJsZSB3aGljaCBzaG91bGQgYmUgbG9va2luZyBmb3JcclxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gcmVzdWx0IC0gUHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIHdpdGggdGhlIGtleSBpZiB0aGUgZW50cnkgd2FzIHN0b3JlZCBzdWNjZXNzZnVsbHksXHJcbiAgICogb3RoZXJ3aXNlIGl0IGlzIHJlamVjdGVkIHdpdGggYW4gZXJyb3IuXHJcbiAgICogQG1lbWJlcm9mIFN0b3JhZ2VNYW5hZ2VyXHJcbiAgICovXHJcbiAgc2V0KGtleSwgdmVyc2lvbiwgdmFsdWUsIHRhYmxlLCB1cGRhdGVSdW50aW1lU3RhdHVzID0gdHJ1ZSkge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSAoKHJlc29sdmUsIHJlamVjdCk9PiB7XHJcbiAgICAgIGxvZy5pbmZvKCdbU3RvcmFnZU1hbmFnZXJdIC0gc2V0ICcsIGtleSwgdmFsdWUpO1xyXG4gICAgICB0YWJsZSA9IHRhYmxlID8gdGFibGUgOiBrZXk7XHJcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9nZXRUYWJsZSh0YWJsZSk7XHJcbiAgICAgIGNvbnN0IHByaW1hcnlLZXkgPSB0aGlzLl9nZXRQcmltYXJ5S2V5KG5hbWUpO1xyXG4gIFxyXG4gICAgICAvLyBPYmplY3QuYXNzaWduKHZhbHVlLCB7dmVyc2lvbjogdmVyc2lvbn0pO1xyXG4gIFxyXG4gICAgICBsZXQgZGF0YSA9IHZhbHVlO1xyXG4gIFxyXG4gICAgICBpZiAodGhpcy5faXNEZWZhdWx0U2NoZW1hKHRhYmxlKSkge1xyXG4gICAgICAgIGRhdGEgPSB7XHJcbiAgICAgICAgICBrZXk6IGtleSxcclxuICAgICAgICAgIHZlcnNpb246IHZlcnNpb24sXHJcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHRtcCA9IHt9O1xyXG4gICAgICAgIHRtcFtwcmltYXJ5S2V5XSA9IGtleTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHRtcCk7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgIHRoaXMuZGJbbmFtZV0ucHV0KGRhdGEpLnRoZW4oKCk9PntcclxuICAgICAgaWYgKHVwZGF0ZVJ1bnRpbWVTdGF0dXMgJiYgZGF0YS5iYWNrdXAgJiYgZGF0YS51cmwpIHtcclxuICAgICAgICB0aGlzLl91cGRhdGVCYWNrdXBSZXZpc2lvbihkYXRhLnVybCkudGhlbigoKT0+IHtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHJlc29sdmUoKTtcclxuXHJcbiAgICAgICB9LCAoKT0+IHtcclxuICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgZW50cnkgdmFsdWUgZnJvbSB0aGUgZGF0YWJhc2UgZm9yIGEgZ2l2ZW4ga2V5LlxyXG4gICAqIElmIG5vIGVudHJ5IGlzIGZvdW5kIHVuZGVmaW5lZCBpcyByZXR1cm5lZC5cclxuICAgKiBAcGFyYW0geyFzdHJpbmd9IGtleSAtIGtleSB0aGF0IHdhcyBzdG9yZWQgdXNpbmcge0BsaW5rIHN0b3JhZ2VNYW5hZ2VyLnNldH1cclxuICAgKiBAcGFyYW0geyFhbnl9IHZhbHVlIC0gdmFsdWUgd2hpY2ggc2hvdWxkIGJlIGZvdW5kXHJcbiAgICogQHBhcmFtIHshc3RyaW5nfSB0YWJsZSAtIHRhYmxlIHdoaWNoIHNob3VsZCBiZSBsb29raW5nIGZvclxyXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfSByZXN1bHQgLSBQcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgd2l0aCB0aGUgdmFsdWUuXHJcbiAgICogQG1lbWJlcm9mIFN0b3JhZ2VNYW5hZ2VyXHJcbiAgICovXHJcbiAgZ2V0KGtleSwgdmFsdWUsIHRhYmxlKSB7XHJcbiAgICBjb25zb2xlLmluZm8oJ1tTdG9yYWdlTWFuYWdlcl0gLSBnZXQgJywga2V5LCB2YWx1ZSk7XHJcbiAgICB0YWJsZSA9IHRhYmxlID8gdGFibGUgOiBrZXk7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5fZ2V0VGFibGUodGFibGUpO1xyXG4gICAgaWYgKCFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IHRoaXMuX2dldFByaW1hcnlLZXkobmFtZSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGIudHJhbnNhY3Rpb24oJ3J3IScsIHRoaXMuZGJbbmFtZV0sICgpID0+IHtcclxuXHJcbiAgICAgIGlmICgha2V5ICYmICF2YWx1ZSkgeyBcclxuICAgICAgICByZXR1cm4gdGhpcy5kYltuYW1lXS50b0FycmF5KCkudGhlbihvYmplY3RzID0+IHtcclxuICAgICAgICAgIGlmIChvYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iamVjdHMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgIGFjY1trZXlbcHJpbWFyeUtleV1dID0ga2V5O1xyXG4gICAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICAgIH0sICgpID0+e3JldHVybiB7fSB9KTtcclxuICAgICAgICAgIH0gZWxzZSByZXR1cm4ge307XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGJbbmFtZV0ud2hlcmUocHJpbWFyeUtleSkuZXF1YWxzKGtleSkuZmlyc3QoKVxyXG4gICAgICAgICAgLnRoZW4ob2JqZWN0ID0+IHtcclxuICAgICAgICAgICAgaWYgKG9iamVjdCAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgbGV0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XHJcblxyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xyXG4gICAgICAgICAgdHlwZSA9ICdhcnJheSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYltuYW1lXS53aGVyZShrZXkpLmVxdWFscyh2YWx1ZSkuZmlyc3QoKVxyXG4gICAgICAgICAgICAgIC50aGVuKG9iamVjdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBjYXNlICdvYmplY3QnOiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0clBhdGggPSAndmFsdWUuJyArIE9iamVjdC5rZXlzKHZhbHVlKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICBjb25zdCBzdHJWYWx1ZSA9IE9iamVjdC52YWx1ZXModmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhzdHJQYXRoLCBzdHJWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYltuYW1lXS53aGVyZShzdHJQYXRoKS5hbnlPZihzdHJWYWx1ZSkuZmlyc3QoKVxyXG4gICAgICAgICAgICAgIC50aGVuKG9iamVjdCA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKSkge1xyXG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjYXNlICdhcnJheSc6XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBUlJBWTonLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRiW25hbWVdLndoZXJlKHZhbHVlKS50aGVuKG9iamVjdCA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKG9iamVjdCAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJykpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QudmFsdWU7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGEgZW50cnkgdmVyc2lvbiBmcm9tIHRoZSBkYXRhYmFzZSBmb3IgYSBnaXZlbiBrZXkuXHJcbiAgICogSWYgbm8gZW50cnkgaXMgZm91bmQgdW5kZWZpbmVkIGlzIHJldHVybmVkLlxyXG4gICAqIEBwYXJhbSB7IXN0cmluZ30ga2V5IC0ga2V5IHRoYXQgd2FzIHN0b3JlZCB1c2luZyB7QGxpbmsgc3RvcmFnZU1hbmFnZXIuc2V0fVxyXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIHRoZSB2YWx1ZSB3aGljaCBzb3VsZCBiZSB1c2VkIHRvIGZpbmQgdGhlIHN0b3JhZ2UgcmVzb3VyY2VcclxuICAgKiBAcGFyYW0geyFzdHJpbmd9IHRhYmxlIC0gdGFibGUgd2hpY2ggc2hvdWxkIGJlIGxvb2tpbmcgZm9yXHJcbiAgICogQHJldHVybnMge1Byb21pc2V9IHJlc3VsdCAtIFByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCB3aXRoIHRoZSB2ZXJzaW9uLlxyXG4gICAqIEBtZW1iZXJvZiBTdG9yYWdlTWFuYWdlclxyXG4gICAqL1xyXG4gIGdldFZlcnNpb24oa2V5LCB2YWx1ZSwgdGFibGUpIHtcclxuICAgIGxvZy5pbmZvKCdbU3RvcmFnZU1hbmFnZXJdIC0gZ2V0VmVyc2lvbiBmb3Iga2V5ICcsIGtleSk7XHJcbiAgICB0YWJsZSA9IHRhYmxlID8gdGFibGUgOiBrZXk7XHJcbiAgICBjb25zdCBuYW1lID0gdGhpcy5fZ2V0VGFibGUodGFibGUpO1xyXG4gICAgY29uc3QgcHJpbWFyeUtleSA9IHRoaXMuX2dldFByaW1hcnlLZXkobmFtZSk7XHJcblxyXG4gICAgbGV0IGRhdGEgPSB2YWx1ZTtcclxuXHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIGRhdGEgPSBrZXk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGIudHJhbnNhY3Rpb24oJ3J3IScsIHRoaXMuZGJbbmFtZV0sICgpID0+IHtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmRiW25hbWVdLndoZXJlKHByaW1hcnlLZXkpXHJcbiAgICAgICAgLmVxdWFscyhkYXRhKVxyXG4gICAgICAgIC5maXJzdCgpXHJcbiAgICAgICAgLnRoZW4oKG9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKG9iamVjdCAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkoJ3ZlcnNpb24nKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0LnZlcnNpb247XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgIGxvZy5pbmZvKCdlcnJvciBnZXR0aW5nIHRoZSB2ZXJzaW9uIGZvciAnLCBrZXksICcgd2l0aCBlcnJvcjogJywgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIGEgZW50cnkgZnJvbSB0aGUgZGF0YWJhc2UgZm9yIGEgZ2l2ZW4ga2V5IG9yIHRoZSBmdWxsIERCIGluIGNhc2UgdGhlIGtleSBpcyBub3QgcHJvdmlkZWQuXHJcbiAgICogQHBhcmFtIHshc3RyaW5nfSBrZXkgLSBrZXkgdGhhdCB3YXMgc3RvcmVkIHVzaW5nIHtAbGluayBzdG9yYWdlTWFuYWdlci5zZXR9XHJcbiAgICogQHBhcmFtIHshYW55fSB2YWx1ZSAtIHRoZSB2YWx1ZSB3aGljaCBzb3VsZCBiZSB1c2VkIHRvIGZpbmQgdGhlIHN0b3JhZ2UgcmVzb3VyY2VcclxuICAgKiBAcGFyYW0geyFzdHJpbmd9IHRhYmxlIC0gdGFibGUgd2hpY2ggc2hvdWxkIGJlIGxvb2tpbmcgZm9yXHJcbiAgICogQHJldHVybnMge1Byb21pc2V9IHJlc3VsdCAtIFByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCB3aXRoIHRoZSBudW1iZXIgb2YgYWZmZWN0ZWQgcm93cy5cclxuICAgKiBAbWVtYmVyb2YgU3RvcmFnZU1hbmFnZXJcclxuICAgKi9cclxuICBkZWxldGUoa2V5LCB2YWx1ZSwgdGFibGUpIHtcclxuXHJcbiAgICBpZiAoa2V5KSB7XHJcbiAgICAgIHRhYmxlID0gdGFibGUgPyB0YWJsZSA6IGtleTtcclxuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuX2dldFRhYmxlKHRhYmxlKTtcclxuICAgICAgY29uc3QgcHJpbWFyeUtleSA9IHRoaXMuX2dldFByaW1hcnlLZXkobmFtZSk7XHJcbiAgXHJcbiAgICAgIGxldCBkYXRhID0gdmFsdWU7XHJcbiAgXHJcbiAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICBkYXRhID0ga2V5O1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmRiW25hbWVdXHJcbiAgICAgICAgLndoZXJlKHByaW1hcnlLZXkpXHJcbiAgICAgICAgLmVxdWFscyhkYXRhKVxyXG4gICAgICAgIC5kZWxldGUoKTtcclxuICAgIH0gZWxzZSByZXR1cm4gdGhpcy5kYi5kZWxldGUoKTtcclxuICBcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlTWFuYWdlcjtcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7OztBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7OztBQVdBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7O0FBU0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW5DQTtBQXFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7O0FBU0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7OztBQVFBO0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBRUE7OztBQTFTQTtBQUNBO0FBQ0E7Ozs7OztBQTRTQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///21\n")},function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/loglevel/lib/loglevel.js\nvar loglevel = __webpack_require__(1);\n\n// EXTERNAL MODULE: ./node_modules/tv4/tv4.js\nvar tv4 = __webpack_require__(18);\nvar tv4_default = /*#__PURE__*/__webpack_require__.n(tv4);\n\n// CONCATENATED MODULE: ./src/runtime-catalogue/RethinkObject.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the "License");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\nvar RethinkObject_RethinkObject =\n/*#__PURE__*/\nfunction () {\n function RethinkObject() {\n _classCallCheck(this, RethinkObject);\n }\n\n _createClass(RethinkObject, [{\n key: "validate",\n\n /**\r\n * Validates this RethinkObject against the provided schema.\r\n *\r\n * LIMITATIONS: The provided schema cannot contain references to other schemas, since they can\'t be resolved.\r\n * @param schema - schema to validate against\r\n * @returns {boolean} true if valid, false otherwise\r\n */\n value: function validate(schema) {\n // add schema itself so local references work\n tv4_default.a.addSchema(schema.id, schema); // JSON stringify -> parse needed to have proper validation\n\n var result = tv4_default.a.validateMultiple(JSON.parse(JSON.stringify(this)), schema); // delete error stacks to improve logging\n\n result.errors.forEach(function (error) {\n delete error.stack;\n }); // print more details about validation if it fails or schema contains $refs\n\n if (!result.valid || result.missing.length > 0) {\n console.warn("Object validation " + (result.valid ? "succeeded, but schema contained references:" : "failed:"), JSON.stringify(result, null, 2));\n console.log("Object:", JSON.stringify(this, null, 2));\n }\n\n return result.valid;\n }\n }]);\n\n return RethinkObject;\n}();\n/* harmony default export */ var runtime_catalogue_RethinkObject = (RethinkObject_RethinkObject);\n// CONCATENATED MODULE: ./src/runtime-catalogue/CatalogueDataObject.js\nfunction _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }\n\nfunction CatalogueDataObject_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction CatalogueDataObject_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CatalogueDataObject_createClass(Constructor, protoProps, staticProps) { if (protoProps) CatalogueDataObject_defineProperties(Constructor.prototype, protoProps); if (staticProps) CatalogueDataObject_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the "License");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n/**\r\n * @author alice.cheambe[at]fokus.fraunhofer.de\r\n * The CatalogueDataObject class is the representation of the reTHINK Catalogue Data Model\r\n */\n\nvar CatalogueDataObject =\n/*#__PURE__*/\nfunction (_RethinkObject) {\n _inherits(CatalogueDataObject, _RethinkObject);\n\n /**\r\n * Creates the Catalogue Data Object\r\n * @param guid - Global Unique identifier of the Catalogue Object (e.g. Hyperty descriptor, ProtocolStub descriptor,\r\n * etc) enabling the same object to be stored and discovered in different Catalogues. That means, guid corresponds to\r\n * [resource-type-id] per BNF of Resource Path. Couldn\'t we have problems with too long URL paths?\r\n * @param type - indicates the type of Catalogue Data Object e.g. Hyperty, ProtocolStub, etc\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param objectName - human-understandable name of the catalogue object e.g. "My Awesome Hyperty"\r\n * @param description - description of the source package\r\n * @param language - the programming language used in the SourcePackage.SourceCode\r\n * @param sourcePackageURL - A string containing the URL from where the source code package of the corresponding\r\n * catalogue object, e.g. deployable packages containing executable code for Hyperties or ProtoStubs, can be downloaded\r\n */\n function CatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL) {\n var _this;\n\n CatalogueDataObject_classCallCheck(this, CatalogueDataObject);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(CatalogueDataObject).call(this));\n _this._guid = guid;\n _this._type = type;\n _this._version = version;\n _this._objectName = objectName;\n _this._description = description;\n _this._language = language;\n _this._sourcePackageURL = sourcePackageURL;\n _this._signature = null;\n _this._sourcePackage = null;\n return _this;\n } // Getters\n\n\n CatalogueDataObject_createClass(CatalogueDataObject, [{\n key: "guid",\n get: function get() {\n return this._guid;\n },\n set: function set(guid) {\n if (guid) this._guid = guid;\n }\n }, {\n key: "type",\n get: function get() {\n return this._type;\n },\n set: function set(type) {\n if (type) this._type = type;\n }\n }, {\n key: "version",\n get: function get() {\n return this._version;\n },\n set: function set(version) {\n if (version) {\n this._version = version;\n }\n }\n }, {\n key: "objectName",\n get: function get() {\n return this._objectName;\n },\n set: function set(objectName) {\n if (objectName) this._objectName = objectName;\n }\n }, {\n key: "description",\n get: function get() {\n return this._description;\n },\n set: function set(description) {\n if (description) this._description = description;\n }\n }, {\n key: "language",\n get: function get() {\n return this._language;\n },\n set: function set(language) {\n if (language) this._language = language;\n }\n }, {\n key: "signature",\n get: function get() {\n return this._signature;\n },\n // Setters\n\n /**\r\n * Set the signature to enables integrity and authenticity verification\r\n * @param signature\r\n */\n set: function set(signature) {\n if (signature) this._signature = signature;\n }\n }, {\n key: "sourcePackage",\n get: function get() {\n return this._sourcePackage;\n },\n set: function set(sourcePackage) {\n if (sourcePackage) this._sourcePackage = sourcePackage;\n }\n }, {\n key: "sourcePackageURL",\n get: function get() {\n return this._sourcePackageURL;\n },\n set: function set(sourcePackageURL) {\n if (sourcePackageURL) this._sourcePackageURL = sourcePackageURL;\n }\n }]);\n\n return CatalogueDataObject;\n}(runtime_catalogue_RethinkObject); //Alice: removed POLICY_ENFORCER: \'policy_enforcer\', DATA_SCHEMA: \'data_schema\' from the list\n//wrt: https://github.com/reTHINK-project/dev-service-framework/blob/develop/docs/datamodel/core/hyperty-catalogue/readme.md#data-object-schema\n\n\nvar CatalogueObjectType = {\n HYPERTY: \'hyperty\',\n PROTOSTUB: \'protostub\',\n HYPERTY_RUNTIME: \'hyperty_runtime\',\n HYPERTY_INTERCEPTOR: \'hyperty_inspector\',\n HYPERTY_DATA_OBJECT: \'hyperty_data_object\'\n};\nvar DataObjectSourceLanguage = {\n JAVASCRIPT_ECMA6: \'javascript_ecma6\',\n JAVASCRIPT_ECMA5: \'javascript_ecma5\',\n JSON_SCHEMA_V4: \'json_schema_v4\',\n PYTHON: \'python\',\n TYPESCRIPT: \'typescript\'\n};\n/* harmony default export */ var runtime_catalogue_CatalogueDataObject = (CatalogueDataObject);\n// CONCATENATED MODULE: ./src/runtime-catalogue/SourcePackage.js\nfunction SourcePackage_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction SourcePackage_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SourcePackage_createClass(Constructor, protoProps, staticProps) { if (protoProps) SourcePackage_defineProperties(Constructor.prototype, protoProps); if (staticProps) SourcePackage_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\nvar SourcePackage =\n/*#__PURE__*/\nfunction () {\n function SourcePackage(sourceCodeClassname, sourceCode) {\n SourcePackage_classCallCheck(this, SourcePackage);\n\n this._sourceCode = sourceCode;\n this._sourceCodeClassname = sourceCodeClassname;\n this._encoding = null;\n this._signature = null;\n }\n\n SourcePackage_createClass(SourcePackage, [{\n key: "sourceCode",\n get: function get() {\n return this._sourceCode;\n },\n set: function set(sourceCode) {\n if (sourceCode) this._sourceCode = sourceCode;\n }\n }, {\n key: "sourceCodeClassname",\n get: function get() {\n return this._sourceCodeClassname;\n },\n set: function set(sourceCodeClassname) {\n if (sourceCodeClassname) this._sourceCodeClassname = sourceCodeClassname;\n }\n }, {\n key: "encoding",\n get: function get() {\n return this._encoding;\n },\n set: function set(encoding) {\n if (encoding) this._encoding = encoding;\n }\n }, {\n key: "signature",\n get: function get() {\n return this._signature;\n },\n set: function set(sign) {\n if (sign) this._signature = sign;\n }\n }]);\n\n return SourcePackage;\n}();\n\n/* harmony default export */ var runtime_catalogue_SourcePackage = (SourcePackage);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyDescriptor.js\nfunction HypertyDescriptor_typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { HypertyDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return HypertyDescriptor_typeof(obj); }\n\nfunction HypertyDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction HypertyDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyDescriptor_typeof(call) === "object" || typeof call === "function")) { return call; } return HypertyDescriptor_assertThisInitialized(self); }\n\nfunction HypertyDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction HypertyDescriptor_getPrototypeOf(o) { HypertyDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyDescriptor_getPrototypeOf(o); }\n\nfunction HypertyDescriptor_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyDescriptor_setPrototypeOf(o, p) { HypertyDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\n\n\nvar HypertyDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyDescriptor_inherits(HypertyDescriptor, _CatalogueDataObject);\n\n /**\r\n *\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object enabling the same object to be\r\n * stored and discovered in different Catalogues. Guid corresponds to per BNF of Resource Path.\r\n * @param {CatalogueObjectType} catalogueType - \tIndicates the type of Catalogue Data Object\r\n * @param {string} version\r\n * @param {string} objectName\r\n * @param {string} description\r\n * @param {string} language\r\n * @param {string} sourcePackageURL\r\n * @param {HypertyResourceType[]} hypertyType A tag that identifies what type of hyperty is described in the object.\r\n * @param {URL.HypertyCatalogueURLList} dataObjectUrls - It defines the Data Object Schemas supported by the Hyperty\r\n * through a list of Catalogue URLs from where these schemas can be reached\r\n */\n function HypertyDescriptor(guid, catalogueType, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjectUrls) {\n var _this;\n\n HypertyDescriptor_classCallCheck(this, HypertyDescriptor);\n\n _this = HypertyDescriptor_possibleConstructorReturn(this, HypertyDescriptor_getPrototypeOf(HypertyDescriptor).call(this, guid, catalogueType, version, objectName, description, language, sourcePackageURL));\n _this._configuration = {};\n _this._constraints = {};\n _this._policies = {};\n _this._messageSchema = null;\n _this._hypertyType = hypertyType;\n _this._dataObjects = dataObjectUrls;\n return _this;\n }\n\n HypertyDescriptor_createClass(HypertyDescriptor, [{\n key: "hypertyType",\n get: function get() {\n return this._hypertyType;\n },\n set: function set(hType) {\n if (hType) this._hypertyType = hType;\n }\n }, {\n key: "dataObjects",\n get: function get() {\n return this._dataObjects;\n },\n set: function set(dataObjects) {\n if (dataObjects) this._dataObjects = dataObjects;\n }\n }, {\n key: "configuration",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n if (configuration) this._configuration = configuration;\n }\n }, {\n key: "constraints",\n get: function get() {\n return this._constraints;\n },\n set: function set(constraints) {\n if (constraints) this._constraints = constraints;\n }\n }, {\n key: "messageSchema",\n get: function get() {\n return this._messageSchema;\n },\n set: function set(messageSchema) {\n if (messageSchema) this._messageSchema = messageSchema;\n }\n }, {\n key: "policies",\n get: function get() {\n return this._policies;\n },\n set: function set(policies) {\n if (policies) this._policies = policies;\n }\n }]);\n\n return HypertyDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\nvar RuntimeHypertyCapabilityType = {};\nvar HypertyType = {\n COMMUNICATOR: \'communicator\',\n IDENTITY: \'identity\',\n CONTEXT: \'context\'\n};\nvar HypertyResourceType = {\n chat: \'CHAT\',\n audio: \'Audio\',\n video: \'Video\',\n av: \'AV\',\n screen: \'SCREEN\',\n file: \'FILe\',\n midi: \'MIDI\'\n};\n/* harmony default export */ var runtime_catalogue_HypertyDescriptor = (HypertyDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/ProtocolStubDescriptor.js\nfunction ProtocolStubDescriptor_typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { ProtocolStubDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { ProtocolStubDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return ProtocolStubDescriptor_typeof(obj); }\n\nfunction ProtocolStubDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction ProtocolStubDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction ProtocolStubDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) ProtocolStubDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) ProtocolStubDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction ProtocolStubDescriptor_possibleConstructorReturn(self, call) { if (call && (ProtocolStubDescriptor_typeof(call) === "object" || typeof call === "function")) { return call; } return ProtocolStubDescriptor_assertThisInitialized(self); }\n\nfunction ProtocolStubDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction ProtocolStubDescriptor_getPrototypeOf(o) { ProtocolStubDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return ProtocolStubDescriptor_getPrototypeOf(o); }\n\nfunction ProtocolStubDescriptor_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) ProtocolStubDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction ProtocolStubDescriptor_setPrototypeOf(o, p) { ProtocolStubDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return ProtocolStubDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the "License");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\n\n\nvar ProtocolStubDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n ProtocolStubDescriptor_inherits(ProtocolStubDescriptor, _CatalogueDataObject);\n\n function ProtocolStubDescriptor(guid, type, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication) {\n var _this;\n\n ProtocolStubDescriptor_classCallCheck(this, ProtocolStubDescriptor);\n\n _this = ProtocolStubDescriptor_possibleConstructorReturn(this, ProtocolStubDescriptor_getPrototypeOf(ProtocolStubDescriptor).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._messageSchemas = messageSchemas;\n if (configuration) _this._configuration = configuration;else _this._configuration = {};\n if (constraints) _this._constraints = constraints;else _this._constraints = {};\n _this._hypertyType = hypertyType;\n if (dataObjects) _this._dataObjects = dataObjects;else _this._dataObjects = [];\n _this._interworking = interworking;\n _this._idpProxy = idpProxy;\n _this._mutualAuthentication = mutualAuthentication;\n return _this;\n }\n\n ProtocolStubDescriptor_createClass(ProtocolStubDescriptor, [{\n key: "messageSchemas",\n get: function get() {\n return this._messageSchemas;\n },\n set: function set(messageSchemas) {\n if (messageSchemas) this._messageSchemas = messageSchemas;\n }\n }, {\n key: "constraints",\n get: function get() {\n return this._constraints;\n },\n set: function set(constraints) {\n if (constraints) this._constraints = constraints;\n }\n }, {\n key: "configuration",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n if (configuration) this._configuration = configuration;\n }\n }, {\n key: "hypertyType",\n get: function get() {\n return this._hypertyType;\n },\n set: function set(value) {\n this._hypertyType = value;\n }\n }, {\n key: "dataObjects",\n get: function get() {\n return this._dataObjects;\n },\n set: function set(value) {\n this._dataObjects = value;\n }\n }, {\n key: "interworking",\n get: function get() {\n return this._interworking;\n },\n set: function set(value) {\n this._interworking = value;\n }\n }, {\n key: "idpProxy",\n get: function get() {\n return this._idpProxy;\n },\n set: function set(value) {\n this._idpProxy = value;\n }\n }, {\n key: "mutualAuthentication",\n get: function get() {\n return this._mutualAuthentication;\n },\n set: function set(value) {\n this._mutualAuthentication = value;\n }\n }]);\n\n return ProtocolStubDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\n/* harmony default export */ var runtime_catalogue_ProtocolStubDescriptor = (ProtocolStubDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyRuntimeDescriptor.js\nfunction HypertyRuntimeDescriptor_typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { HypertyRuntimeDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyRuntimeDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return HypertyRuntimeDescriptor_typeof(obj); }\n\nfunction HypertyRuntimeDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction HypertyRuntimeDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyRuntimeDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyRuntimeDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyRuntimeDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyRuntimeDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyRuntimeDescriptor_typeof(call) === "object" || typeof call === "function")) { return call; } return HypertyRuntimeDescriptor_assertThisInitialized(self); }\n\nfunction HypertyRuntimeDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction HypertyRuntimeDescriptor_getPrototypeOf(o) { HypertyRuntimeDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyRuntimeDescriptor_getPrototypeOf(o); }\n\nfunction HypertyRuntimeDescriptor_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyRuntimeDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyRuntimeDescriptor_setPrototypeOf(o, p) { HypertyRuntimeDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyRuntimeDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the "License");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n/**\r\n * Created by amo on 14/11/2015.\r\n */\n\n\nvar HypertyRuntimeDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyRuntimeDescriptor_inherits(HypertyRuntimeDescriptor, _CatalogueDataObject);\n\n function HypertyRuntimeDescriptor(guid, catalogueType, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub) {\n var _this;\n\n HypertyRuntimeDescriptor_classCallCheck(this, HypertyRuntimeDescriptor);\n\n _this = HypertyRuntimeDescriptor_possibleConstructorReturn(this, HypertyRuntimeDescriptor_getPrototypeOf(HypertyRuntimeDescriptor).call(this, guid, catalogueType, version, objectName, description, language, sourcePackageURL));\n _this._runtimeType = runtimeType;\n if (hypertyCapabilities) _this._hypertyCapabilities = hypertyCapabilities;else _this._hypertyCapabilities = new RuntimeHypertyCapability(true, false, false, false, false);\n if (protocolCapabilities) _this._protocolCapabilities = protocolCapabilities;else _this._protocolCapabilities = new RuntimeProtocolCapability(true, false, true, false, false, false);\n _this._p2pHandlerStub = p2pHandlerStub;\n _this._p2pRequesterStub = p2pRequesterStub;\n return _this;\n }\n\n HypertyRuntimeDescriptor_createClass(HypertyRuntimeDescriptor, [{\n key: "runtimeType",\n get: function get() {\n return this._runtimeType;\n },\n set: function set(runtimeType) {\n if (runtimeType) this._runtimeType = runtimeType;\n }\n }, {\n key: "hypertyCapabilities",\n get: function get() {\n return this._hypertyCapabilities;\n },\n set: function set(hypertyCapabilities) {\n if (hypertyCapabilities) this._hypertyCapabilities = hypertyCapabilities;\n }\n }, {\n key: "protocolCapabilities",\n get: function get() {\n return this._hypertyCapabilities;\n },\n set: function set(protocolCapabilities) {\n if (protocolCapabilities) this._protocolCapabilities = protocolCapabilities;\n }\n }, {\n key: "p2pHandlerStub",\n get: function get() {\n return this._p2pHandlerStub;\n },\n set: function set(value) {\n this._p2pHandlerStub = value;\n }\n }, {\n key: "p2pRequesterStub",\n get: function get() {\n return this._p2pRequesterStub;\n },\n set: function set(value) {\n this._p2pRequesterStub = value;\n }\n }]);\n\n return HypertyRuntimeDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n/**\r\n * A class representation of the capability set of the Runtime Hyperty\r\n */\n\n\nvar RuntimeHypertyCapability =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates an object of the Runtime Hyperty capability set\r\n * @param {boolean} isWebRTCSupported\r\n * @param {boolean} isMicSupported\r\n * @param {boolean} isCameraSupported\r\n * @param {boolean} isSensorSupported\r\n * @param {boolean} isORTCSupported\r\n */\n function RuntimeHypertyCapability(isWebRTCSupported, isMicSupported, isCameraSupported, isSensorSupported, isORTCSupported) {\n HypertyRuntimeDescriptor_classCallCheck(this, RuntimeHypertyCapability);\n\n this._isWebRTC = isWebRTCSupported;\n this._isMic = isMicSupported;\n this._isCamera = isCameraSupported;\n this._isSensor = isSensorSupported;\n this._isORTC = isORTCSupported;\n }\n\n HypertyRuntimeDescriptor_createClass(RuntimeHypertyCapability, [{\n key: "getCapabilitySet",\n value: function getCapabilitySet() {\n return JSON.stringify(this);\n }\n }, {\n key: "isMic",\n get: function get() {\n return this._isMic;\n }\n }, {\n key: "isCamera",\n get: function get() {\n return this._isCamera;\n }\n }, {\n key: "isSensor",\n get: function get() {\n return this._isSensor;\n }\n }, {\n key: "isWebRTC",\n get: function get() {\n return this._isWebRTC;\n }\n }, {\n key: "isORTCS",\n get: function get() {\n return this._isORTC;\n }\n }]);\n\n return RuntimeHypertyCapability;\n}();\n/**\r\n * A class representation of the protocol capability set of the Runtime Hyperty\r\n */\n\nvar RuntimeProtocolCapability =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates an object of the runtime protocol capability\r\n * @param {boolean} isHttp\r\n * @param {boolean} isHttps\r\n * @param {boolean} isWS\r\n * @param {boolean} isWSS\r\n * @param {boolean} isCoap\r\n * @param {boolean} isDataChannel\r\n */\n function RuntimeProtocolCapability(isHttp, isHttps, isWS, isWSS, isCoap, isDataChannel) {\n HypertyRuntimeDescriptor_classCallCheck(this, RuntimeProtocolCapability);\n\n this._isHttp = isHttp;\n this._isHttps = isHttps;\n this._isWS = isWS;\n this._isWSS = isWSS;\n this._isCoap = isCoap;\n this._isDataChannel = isDataChannel;\n }\n\n HypertyRuntimeDescriptor_createClass(RuntimeProtocolCapability, [{\n key: "isHttp",\n value: function isHttp() {\n return this._isHttp;\n }\n }, {\n key: "isHttps",\n value: function isHttps() {\n return this._isHttps;\n }\n }, {\n key: "isWS",\n value: function isWS() {\n return this._isWS;\n }\n }, {\n key: "isSensorSupported",\n value: function isSensorSupported() {\n return this._isSensor;\n }\n }, {\n key: "isWSS",\n value: function isWSS() {\n return this._isWSS;\n }\n }, {\n key: "isCoap",\n value: function isCoap() {\n return this._isCoap;\n }\n }, {\n key: "isDataChannel",\n value: function isDataChannel() {\n return this._isDataChannel;\n }\n }, {\n key: "getCapabilitySet",\n value: function getCapabilitySet() {\n return JSON.stringify(this);\n }\n }]);\n\n return RuntimeProtocolCapability;\n}();\nvar RuntimeType = {\n BROWSER: \'browser\',\n STANDALONE: \'standalone\',\n SERVER: \'server\',\n GATEWAY: \'gateway\'\n};\n/* harmony default export */ var runtime_catalogue_HypertyRuntimeDescriptor = (HypertyRuntimeDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/HypertyInterceptorDescriptor.js\nfunction HypertyInterceptorDescriptor_typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { HypertyInterceptorDescriptor_typeof = function _typeof(obj) { return typeof obj; }; } else { HypertyInterceptorDescriptor_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return HypertyInterceptorDescriptor_typeof(obj); }\n\nfunction HypertyInterceptorDescriptor_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction HypertyInterceptorDescriptor_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction HypertyInterceptorDescriptor_createClass(Constructor, protoProps, staticProps) { if (protoProps) HypertyInterceptorDescriptor_defineProperties(Constructor.prototype, protoProps); if (staticProps) HypertyInterceptorDescriptor_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction HypertyInterceptorDescriptor_possibleConstructorReturn(self, call) { if (call && (HypertyInterceptorDescriptor_typeof(call) === "object" || typeof call === "function")) { return call; } return HypertyInterceptorDescriptor_assertThisInitialized(self); }\n\nfunction HypertyInterceptorDescriptor_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction HypertyInterceptorDescriptor_getPrototypeOf(o) { HypertyInterceptorDescriptor_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return HypertyInterceptorDescriptor_getPrototypeOf(o); }\n\nfunction HypertyInterceptorDescriptor_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) HypertyInterceptorDescriptor_setPrototypeOf(subClass, superClass); }\n\nfunction HypertyInterceptorDescriptor_setPrototypeOf(o, p) { HypertyInterceptorDescriptor_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return HypertyInterceptorDescriptor_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by pzu on 19.11.15.\r\n */\n\n\nvar PolicyEnforcerDescriptor =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n HypertyInterceptorDescriptor_inherits(PolicyEnforcerDescriptor, _CatalogueDataObject);\n\n function PolicyEnforcerDescriptor(guid, type, version, objectName, description, language, sourcePackageURL, configuration, policies) {\n var _this;\n\n HypertyInterceptorDescriptor_classCallCheck(this, PolicyEnforcerDescriptor);\n\n _this = HypertyInterceptorDescriptor_possibleConstructorReturn(this, HypertyInterceptorDescriptor_getPrototypeOf(PolicyEnforcerDescriptor).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._configuration = configuration;\n _this._policies = policies;\n return _this;\n }\n\n HypertyInterceptorDescriptor_createClass(PolicyEnforcerDescriptor, [{\n key: "configuration",\n get: function get() {\n return this._configuration;\n },\n set: function set(configuration) {\n this._configuration = configuration;\n }\n }, {\n key: "policies",\n get: function get() {\n return this._policies;\n },\n set: function set(policies) {\n this._policies = policies;\n }\n }]);\n\n return PolicyEnforcerDescriptor;\n}(runtime_catalogue_CatalogueDataObject);\n\n/* harmony default export */ var HypertyInterceptorDescriptor = (PolicyEnforcerDescriptor);\n// CONCATENATED MODULE: ./src/runtime-catalogue/DataObjectSchema.js\nfunction DataObjectSchema_typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { DataObjectSchema_typeof = function _typeof(obj) { return typeof obj; }; } else { DataObjectSchema_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return DataObjectSchema_typeof(obj); }\n\nfunction DataObjectSchema_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction DataObjectSchema_possibleConstructorReturn(self, call) { if (call && (DataObjectSchema_typeof(call) === "object" || typeof call === "function")) { return call; } return DataObjectSchema_assertThisInitialized(self); }\n\nfunction DataObjectSchema_assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called"); } return self; }\n\nfunction DataObjectSchema_getPrototypeOf(o) { DataObjectSchema_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return DataObjectSchema_getPrototypeOf(o); }\n\nfunction DataObjectSchema_inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) DataObjectSchema_setPrototypeOf(subClass, superClass); }\n\nfunction DataObjectSchema_setPrototypeOf(o, p) { DataObjectSchema_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return DataObjectSchema_setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the "License");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an "AS IS" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n * Created by pzu on 19.11.15.\r\n */\n\nvar DataObjectSchema =\n/*#__PURE__*/\nfunction (_CatalogueDataObject) {\n DataObjectSchema_inherits(DataObjectSchema, _CatalogueDataObject);\n\n function DataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL) {\n DataObjectSchema_classCallCheck(this, DataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(DataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n }\n\n return DataObjectSchema;\n}(runtime_catalogue_CatalogueDataObject); //Children\n\nvar MessageDataObjectSchema =\n/*#__PURE__*/\nfunction (_DataObjectSchema) {\n DataObjectSchema_inherits(MessageDataObjectSchema, _DataObjectSchema);\n\n function MessageDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL) {\n DataObjectSchema_classCallCheck(this, MessageDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(MessageDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n }\n\n return MessageDataObjectSchema;\n}(DataObjectSchema);\nvar HypertyDataObjectSchema =\n/*#__PURE__*/\nfunction (_DataObjectSchema2) {\n DataObjectSchema_inherits(HypertyDataObjectSchema, _DataObjectSchema2);\n\n function HypertyDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy, dataUrlScheme) {\n var _this;\n\n DataObjectSchema_classCallCheck(this, HypertyDataObjectSchema);\n\n _this = DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(HypertyDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL));\n _this._accessControlPolicy = accessControlPolicy;\n _this._scheme = dataUrlScheme;\n return _this;\n }\n\n return HypertyDataObjectSchema;\n}(DataObjectSchema); //Children\n\nvar CommunicationDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch) {\n DataObjectSchema_inherits(CommunicationDataObjectSchema, _HypertyDataObjectSch);\n\n function CommunicationDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, CommunicationDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(CommunicationDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return CommunicationDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar ConnectionDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch2) {\n DataObjectSchema_inherits(ConnectionDataObjectSchema, _HypertyDataObjectSch2);\n\n function ConnectionDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, ConnectionDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(ConnectionDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return ConnectionDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar IdentityDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch3) {\n DataObjectSchema_inherits(IdentityDataObjectSchema, _HypertyDataObjectSch3);\n\n function IdentityDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, IdentityDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(IdentityDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return IdentityDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar ContextDataObjectSchema =\n/*#__PURE__*/\nfunction (_HypertyDataObjectSch4) {\n DataObjectSchema_inherits(ContextDataObjectSchema, _HypertyDataObjectSch4);\n\n function ContextDataObjectSchema(guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy) {\n DataObjectSchema_classCallCheck(this, ContextDataObjectSchema);\n\n return DataObjectSchema_possibleConstructorReturn(this, DataObjectSchema_getPrototypeOf(ContextDataObjectSchema).call(this, guid, type, version, objectName, description, language, sourcePackageURL, accessControlPolicy));\n }\n\n return ContextDataObjectSchema;\n}(HypertyDataObjectSchema);\nvar DataUrlScheme = {\n COMM: \'COMM\',\n CONNECTION: \'CONNECTION\',\n CTXT: \'CTXT\',\n IDENTITY: \'IDENTITY\'\n};\n/* harmony default export */ var runtime_catalogue_DataObjectSchema = (DataObjectSchema);\n// CONCATENATED MODULE: ./src/runtime-catalogue/CatalogueDataObjectFactory.js\nfunction CatalogueDataObjectFactory_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction CatalogueDataObjectFactory_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction CatalogueDataObjectFactory_createClass(Constructor, protoProps, staticProps) { if (protoProps) CatalogueDataObjectFactory_defineProperties(Constructor.prototype, protoProps); if (staticProps) CatalogueDataObjectFactory_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n * Copyright 2016 PT Inovação e Sistemas SA\r\n * Copyright 2016 INESC-ID\r\n * Copyright 2016 QUOBIS NETWORKS SL\r\n * Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n * Copyright 2016 ORANGE SA\r\n * Copyright 2016 Deutsche Telekom AG\r\n * Copyright 2016 Apizee\r\n * Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the "License");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an "AS IS" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n **/\n\n\n\n\n\n\n\n\nvar CatalogueDataObjectFactory_CatalogueDataObjectFactory =\n/*#__PURE__*/\nfunction () {\n function CatalogueDataObjectFactory() {\n CatalogueDataObjectFactory_classCallCheck(this, CatalogueDataObjectFactory);\n }\n\n CatalogueDataObjectFactory_createClass(CatalogueDataObjectFactory, [{\n key: "createCatalogueDataObject",\n\n /**\r\n * Create CatalogueDataObject\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {CatalogueObjectType} type - Indicates the type of Catalogue Data Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @returns {CatalogueDataObject}\r\n */\n value: function createCatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === "undefined" || typeof type === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined") throw new Error("Invalid parameters!");\n return new runtime_catalogue_CatalogueDataObject(guid, type, version, objectName, description, language, sourcePackageURL);\n }\n /**\r\n * Create HypertyDescriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object\r\n * can be downloaded.\r\n * @param {HypertyResourceType[]} hypertyType - An array of HypertyResourceType that identifies what type of hyperty\r\n * resources are handled by the object.\r\n * @param {URL.URLList} dataObjects - Defines the Data Object Schemas supported by the Hyperty through a list of Catalogue URLs from where these schemas can be reached.\r\n * @returns {HypertyDescriptor}\r\n */\n\n }, {\n key: "createHypertyDescriptorObject",\n value: function createHypertyDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjects) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined" || typeof hypertyType === "undefined" || typeof dataObjects === "undefined") throw new Error("Invalid parameters!");\n return new runtime_catalogue_HypertyDescriptor(guid, CatalogueObjectType.HYPERTY, version, objectName, description, language, sourcePackageURL, hypertyType, dataObjects);\n }\n /**\r\n * Create ProtocolStubDescriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param {URL.URL} messageSchemas - Defines the Schema describing the Message Data Model used by the Hyperty through the Catalogue URL from where the Message schema can be reached. If not defined, by default it is assumed the standard Message Model is used.\r\n * @param configuration - Data required to configure the ProtocolStub\r\n * @param constraints - Describes capabilities required from the Hyperty Runtime in order to be able to execute the ProtocolStub\r\n * @param hypertyType\r\n * @param dataObjects\r\n * @param interworking\r\n * @param idpProxy\r\n * @param mutualAuthentication\r\n * @returns {ProtocolStubDescriptor}\r\n */\n\n }, {\n key: "createProtoStubDescriptorObject",\n value: function createProtoStubDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined" || typeof messageSchemas === "undefined" || typeof configuration === "undefined" || typeof constraints === "undefined") throw new Error("Invalid parameters!");\n return new runtime_catalogue_ProtocolStubDescriptor(guid, CatalogueObjectType.PROTOSTUB, version, objectName, description, language, sourcePackageURL, messageSchemas, configuration, constraints, hypertyType, dataObjects, interworking, idpProxy, mutualAuthentication);\n }\n /**\r\n * Create HypertyRuntimeDescriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param {RuntimeType}runtimeType\r\n * @param {RuntimeHypertyCapabilities} hypertyCapabilities - Supported capabilities to execute Hyperties\r\n * @param {RuntimeProtocolCapabilities} protocolCapabilities - Supported capabilities to execute Protocol Stubs\r\n * @param p2pHandlerStub\r\n * @param p2pRequesterStub\r\n * @returns {HypertyRuntimeDescriptor} the data object of the Hyperty Runtime Descriptor\r\n */\n\n }, {\n key: "createHypertyRuntimeDescriptorObject",\n value: function createHypertyRuntimeDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined" || typeof runtimeType === "undefined") throw new Error("Invalid parameters!");\n return new runtime_catalogue_HypertyRuntimeDescriptor(guid, CatalogueObjectType.HYPERTY_RUNTIME, version, objectName, description, language, sourcePackageURL, runtimeType, hypertyCapabilities, protocolCapabilities, p2pHandlerStub, p2pRequesterStub);\n }\n /**\r\n * Create Hyperty Interceptor Descriptor\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param configuration\r\n * @param policies\r\n * @returns {PolicyEnforcerDescriptor}\r\n */\n\n }, {\n key: "createHypertyInterceptorDescriptorObject",\n value: function createHypertyInterceptorDescriptorObject(guid, version, objectName, description, language, sourcePackageURL, configuration, policies) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined") throw new Error("Invalid parameters!");\n return new HypertyInterceptorDescriptor(guid, CatalogueObjectType.HYPERTY_INTERCEPTOR, version, objectName, description, language, sourcePackageURL, configuration, policies);\n }\n /**\r\n * Create DataObjectSchema which in effect is the MessageDataObjectSchema\r\n * @deprecated Use either createMessageDataObjectSchema or createHypertyDataObjectSchema instead\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: "createDataObjectSchema",\n value: function createDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined") throw new Error("Invalid parameters!");\n return new DataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL);\n }\n /**\r\n * Create DataObjectSchema which in effect is the MessageDataObjectSchema\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: "createMessageDataObjectSchema",\n value: function createMessageDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined") throw new Error("Invalid parameters!");\n return new DataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL);\n }\n /**\r\n * Create HypertyDataObjectSchema\r\n * @param {string} guid - Catalogue Global Unique identifier of the Catalogue Object\r\n * @param {string} version - Indicates the version of Catalogue Data\r\n * @param {string} objectName - Human-understandable name of the catalogue object\r\n * @param {string} description\r\n * @param {DataObjectSourceLanguage} language - Programming language used in the SourcePackage\r\n * @param {string} sourcePackageURL - URL from where the source code package of the corresponding catalogue object can be downloaded.\r\n * @param {string} accessControlPolicy - policy rule to access object (see Reporter-Observer Comm pattern)\r\n * @param {DataUrlScheme} scheme - identifies the data scheme (COMM, CONNECTION, CTXT or IDENTITY)\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: "createHypertyDataObjectSchema",\n value: function createHypertyDataObjectSchema(guid, version, objectName, description, language, sourcePackageURL, accessControlPolicy, scheme) {\n if (typeof guid === "undefined" || typeof version === "undefined" || typeof objectName === "undefined" || typeof description === "undefined" || typeof language === "undefined" || typeof sourcePackageURL === "undefined" || typeof scheme === "undefined" || typeof accessControlPolicy === "undefined") throw new Error("Invalid parameters!");\n if (scheme === DataUrlScheme.COMM) return new CommunicationDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.CONNECTION) return new ConnectionDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.CTXT) return new ContextDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);else if (scheme === DataUrlScheme.IDENTITY) return new IdentityDataObjectSchema(guid, CatalogueObjectType.HYPERTY_DATA_OBJECT, version, objectName, description, language, sourcePackageURL, scheme, accessControlPolicy);\n }\n /**\r\n * Create SourcePackage\r\n * @param sourceCodeClassname - The Class-name of the SourceCode\r\n * @param sourceCode - The source code of the catalogue object\r\n * @returns {SourcePackage}\r\n */\n\n }, {\n key: "createSourcePackage",\n value: function createSourcePackage(sourceCodeClassname, sourceCode) {\n if (typeof sourceCode === "undefined" || typeof sourceCodeClassname === "undefined") throw new Error("Invalid parameters!");\n return new runtime_catalogue_SourcePackage(sourceCodeClassname, sourceCode);\n }\n }]);\n\n return CatalogueDataObjectFactory;\n}();\n\n/* harmony default export */ var runtime_catalogue_CatalogueDataObjectFactory = (CatalogueDataObjectFactory_CatalogueDataObjectFactory);\n// CONCATENATED MODULE: ./src/runtime-catalogue/RuntimeCatalogue.js\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }\n\nfunction _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nfunction RuntimeCatalogue_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }\n\nfunction RuntimeCatalogue_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction RuntimeCatalogue_createClass(Constructor, protoProps, staticProps) { if (protoProps) RuntimeCatalogue_defineProperties(Constructor.prototype, protoProps); if (staticProps) RuntimeCatalogue_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar log = loglevel["getLogger"](\'RuntimeCatalogue\');\n\n\nvar RuntimeCatalogue_RuntimeCatalogue =\n/*#__PURE__*/\nfunction () {\n function RuntimeCatalogue(runtimeFactory, name, schema) {\n RuntimeCatalogue_classCallCheck(this, RuntimeCatalogue);\n\n if (!runtimeFactory) throw Error(\'The catalogue needs the runtimeFactory\');\n this._factory = new runtime_catalogue_CatalogueDataObjectFactory();\n this.httpRequest = runtimeFactory.createHttpRequest();\n this.atob = runtimeFactory.atob ? runtimeFactory.atob : atob;\n var storageName = name ? name : \'runtimeCatalogue\';\n var storageSchema = schema ? schema : \'&cguid, accessControlPolicy, constraints, dataObjects, hypertyType, objectName, sourcePackage, version\';\n var schemas = {};\n schemas[storageName] = storageSchema;\n this.storageManager = runtimeFactory.storageManager(storageName, schemas);\n }\n /**\r\n * Get a Catalogue Data Object (Descriptor) from a URL, and construct it using the provided function\r\n * @param {String} descriptorURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty\r\n * @param {function} createFunc - e.g. createHyperty\r\n * @param {boolean} [getFull] - whether or not to get descriptor with sourcePackage, or only the descriptor part\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise} - Promise that fulfills with the requested descriptor in the appropriate type.\r\n * If constraints were provided, a descriptor is only returned if it meets the constraints, otherwise the promise will be rejected.\r\n */\n\n\n RuntimeCatalogue_createClass(RuntimeCatalogue, [{\n key: "getDescriptor",\n value: function getDescriptor(descriptorURL, createFunc) {\n var _this = this;\n\n var getFull = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n var constraints = arguments.length > 3 ? arguments[3] : undefined;\n log.info(\'[RuntimeCatalogue] - getting descriptor from: \', descriptorURL, \' with constraints: \', constraints); // some flags for optimization\n // (later the descriptor will not be saved in case both of these booleans are true)\n\n var isSavedDescriptor = false;\n var isCompleteDescriptor = false; // get raw descriptor\n // first checks if descriptor is already in localStorage (based on cguid and version)\n\n var descriptorPromise;\n\n if (constraints != undefined) {\n descriptorPromise = Promise.all([this.httpRequest.post(descriptorURL + \'/version\', {\n body: JSON.stringify(constraints)\n }), this.httpRequest.post(descriptorURL + \'/cguid\', {\n body: JSON.stringify(constraints)\n })]);\n } else {\n descriptorPromise = Promise.all([this.httpRequest.get(descriptorURL + \'/version\'), this.httpRequest.get(descriptorURL + \'/cguid\')]);\n }\n\n descriptorPromise = descriptorPromise.then(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n version = _ref2[0],\n cguid = _ref2[1];\n\n log.log(\'[RuntimeCatalogue.getDescriptor] - got version (\' + version + \') and cguid (\' + cguid + \') for descriptor \' + descriptorURL); // check if same version is contained in localStorage\n\n return _this.storageManager.getVersion(\'cguid\', cguid).then(function (dbVersion) {\n if (dbVersion >= version) {\n log.log(\'[RuntimeCatalogue.getDescriptor] local version is updated for \', descriptorURL);\n isSavedDescriptor = true;\n return _this.storageManager.get(\'cguid\', cguid);\n } else {\n log.log(\'[RuntimeCatalogue.getDescriptor] local version not updated for \', descriptorURL, \' retrieving from remote catalogue ...\'); // no saved copy, proceed with retrieving descriptor\n\n var retrievePromise = constraints != undefined ? _this.httpRequest.post(descriptorURL, {\n body: JSON.stringify(constraints)\n }) : _this.httpRequest.get(descriptorURL);\n return retrievePromise.then(function (descriptor) {\n descriptor = JSON.parse(descriptor); //log.log("got descriptor:", JSON.stringify(descriptor, null, 2));\n\n if (descriptor[\'ERROR\']) {\n // TODO handle error properly\n throw new Error(descriptor);\n } else {\n return descriptor;\n }\n });\n }\n });\n }).catch(function (error) {\n var errorString = \'Unable to get descriptor for \' + descriptorURL + (constraints != undefined ? \' with constraints \' + constraints : \'\') + \': \' + error;\n log.error(errorString);\n throw new Error(errorString);\n });\n var returnPromise = descriptorPromise; // if getFull, attach sourcePackage\n\n if (getFull) {\n log.log(\'adding promise to attach sourcePackage\');\n returnPromise = descriptorPromise.then(function (descriptor) {\n if (descriptor.sourcePackage) {\n isCompleteDescriptor = true;\n return descriptor;\n } else {\n isCompleteDescriptor = false;\n return _this.attachRawSourcePackage(descriptor);\n }\n });\n } // finally create object\n\n\n returnPromise = returnPromise.then(function (descriptor) {\n // store if not saved before, or if full descriptor was requested and only partial descriptor was stored.\n if (!isSavedDescriptor || isSavedDescriptor && !isCompleteDescriptor && getFull) {\n _this.storageManager.set(descriptor.cguid, descriptor.version, descriptor);\n }\n\n return createFunc.apply(_this, [descriptor, constraints]);\n });\n return returnPromise;\n }\n /**\r\n * Uses the sourcePackageURL from the descriptor, requests the sourcePackage and attaches it to the descriptor.\r\n * @param {CatalogueDataObject} descriptor\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise} - fulfills with complete descriptor\r\n */\n\n }, {\n key: "attachRawSourcePackage",\n value: function attachRawSourcePackage(descriptor, constraints) {\n var _this2 = this;\n\n log.log(\'attaching raw sourcePackage from:\', descriptor.sourcePackageURL);\n return new Promise(function (resolve, reject) {\n var retrievePromise = constraints != undefined ? _this2.httpRequest.post(descriptor.sourcePackageURL, {\n body: JSON.stringify(constraints)\n }) : _this2.httpRequest.get(descriptor.sourcePackageURL);\n retrievePromise.then(function (sourcePackage) {\n sourcePackage = JSON.parse(sourcePackage); //delete descriptor.sourcePackageURL;\n //log.log("attaching sourcePackage:", sourcePackage);\n\n descriptor.sourcePackage = sourcePackage;\n resolve(descriptor);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n /**\r\n * Get HypertyDescriptor\r\n * @param hypertyURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getHypertyDescriptor",\n value: function getHypertyDescriptor(hypertyURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(hypertyURL, this.createHyperty, getFull, constraints);\n }\n /**\r\n * Get StubDescriptor\r\n * @param stubURL - e.g. mydomain.com/.well-known/protostub/MyProtostub\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getStubDescriptor",\n value: function getStubDescriptor(stubURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(stubURL, this.createStub, getFull, constraints);\n }\n /**\r\n * Get RuntimeDescriptor\r\n * @param runtimeURL - e.g. mydomain.com/.well-known/runtime/MyRuntime\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getRuntimeDescriptor",\n value: function getRuntimeDescriptor(runtimeURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(runtimeURL, this.createRuntimeDescriptor, getFull, constraints);\n }\n /**\r\n * Get DataSchemaDescriptor\r\n * @param dataSchemaURL - e.g. mydomain.com/.well-known/dataschema/MyDataSchema\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getDataSchemaDescriptor",\n value: function getDataSchemaDescriptor(dataSchemaURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n // return this.getDescriptor(dataSchemaURL, this.createDataSchema, getFull, constraints)\n return new Promise(function (resolve) {\n var schema = dataSchemaURL.split(\'/dataschema/\')[1];\n log.log(\'[RuntimeCatalogue.getDataSchemaDescriptor] schema \', schema);\n var descriptor = {\n sourcePackage: {\n sourceCode: {\n properties: {}\n }\n }\n }; // let scheme = properties.scheme ? properties.scheme.co : [];\n\n switch (schema) {\n case \'Context\':\n case \'ContextReporter\':\n case \'ContextObserver\':\n descriptor.sourcePackage.sourceCode.properties.scheme = \'context\';\n break;\n\n case \'Connection\':\n descriptor.sourcePackage.sourceCode.properties.scheme = \'connection\';\n break;\n\n case \'WalletData\':\n descriptor.sourcePackage.sourceCode.properties.scheme = \'walletData\';\n break;\n\n case \'Communication\':\n descriptor.sourcePackage.sourceCode.properties.scheme = \'comm\';\n descriptor.sourcePackage.sourceCode.properties.childrens = [\'resources\'];\n break;\n\n case \'HelloWorldDataSchema\':\n descriptor.sourcePackage.sourceCode.properties.scheme = \'hello\';\n break;\n\n default:\n descriptor.sourcePackage.sourceCode.properties.scheme = \'resource\';\n descriptor.sourcePackage.sourceCode.properties.childrens = [];\n break;\n }\n\n resolve(descriptor);\n });\n }\n /**\r\n * Get IDPProxyDescriptor\r\n * @param idpProxyURL - e.g. mydomain.com/.well-known/idp-proxy/MyProxy\r\n * @param {boolean} [getFull] - boolean to decide to get the descriptor with the sourcePackage or (potentially) without\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getIdpProxyDescriptor",\n value: function getIdpProxyDescriptor(idpProxyURL) {\n var getFull = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var constraints = arguments.length > 2 ? arguments[2] : undefined;\n return this.getDescriptor(idpProxyURL, this.createIdpProxy, getFull, constraints);\n }\n /**\r\n * Create HypertyDescriptor based on raw object that contains its attributes\r\n * @param {JSON} rawHyperty\r\n * @returns {HypertyDescriptor}\r\n */\n\n }, {\n key: "createHyperty",\n value: function createHyperty(rawHyperty) {\n //log.log("createHyperty:", rawHyperty);\n // create the descriptor\n var hyperty = this._factory.createHypertyDescriptorObject(rawHyperty[\'cguid\'], rawHyperty[\'version\'], rawHyperty[\'objectName\'], rawHyperty[\'description\'], rawHyperty[\'language\'], rawHyperty[\'sourcePackageURL\'], rawHyperty[\'type\'] || rawHyperty[\'hypertyType\'], rawHyperty[\'dataObjects\']); //log.log("factory returned:", hyperty);\n // optional fields\n\n\n hyperty.configuration = rawHyperty[\'configuration\'];\n hyperty.constraints = rawHyperty[\'constraints\'];\n hyperty.messageSchema = rawHyperty[\'messageSchema\'];\n hyperty.policies = rawHyperty[\'policies\'];\n hyperty.signature = rawHyperty[\'signature\']; // parse and attach sourcePackage\n\n var sourcePackage = rawHyperty[\'sourcePackage\'];\n\n if (sourcePackage) {\n hyperty.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return hyperty;\n }\n /**\r\n * Create ProtocolStubDescriptor based on raw object that contains its attributes\r\n * @param rawStub\r\n * @returns {ProtocolStubDescriptor}\r\n */\n\n }, {\n key: "createStub",\n value: function createStub(rawStub) {\n // log.log("creating stub descriptor based on: ", rawStub);\n // create the descriptor\n var stub = this._factory.createProtoStubDescriptorObject(rawStub[\'cguid\'], rawStub[\'version\'], rawStub[\'objectName\'], rawStub[\'description\'], rawStub[\'language\'], rawStub[\'sourcePackageURL\'], rawStub[\'messageSchemas\'], rawStub[\'configuration\'], rawStub[\'constraints\'], rawStub[\'hypertyType\'], rawStub[\'dataObjects\'], rawStub[\'interworking\'], rawStub[\'idpProxy\'], rawStub[\'mutualAuthentication\']); // optional fields\n\n\n stub.signature = rawStub[\'signature\']; // parse and attach the sourcePackage\n\n var sourcePackage = rawStub[\'sourcePackage\'];\n\n if (sourcePackage) {\n stub.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return stub;\n }\n /**\r\n * Create HypertyRuntimeDescriptor based on raw object that contains its attributes\r\n * @param rawRuntime\r\n * @returns {HypertyRuntimeDescriptor}\r\n */\n\n }, {\n key: "createRuntimeDescriptor",\n value: function createRuntimeDescriptor(rawRuntime) {\n // parse capabilities first\n try {\n rawRuntime[\'hypertyCapabilities\'] = JSON.parse(rawRuntime[\'hypertyCapabilities\']);\n rawRuntime[\'protocolCapabilities\'] = JSON.parse(rawRuntime[\'protocolCapabilities\']);\n } catch (e) {} // already json object\n //log.log("creating runtime descriptor based on: ", rawRuntime);\n // create the descriptor\n\n\n var runtime = this._factory.createHypertyRuntimeDescriptorObject(rawRuntime[\'cguid\'], rawRuntime[\'version\'], rawRuntime[\'objectName\'], rawRuntime[\'description\'], rawRuntime[\'language\'], rawRuntime[\'sourcePackageURL\'], rawRuntime[\'type\'] || rawRuntime[\'runtimeType\'], rawRuntime[\'hypertyCapabilities\'], rawRuntime[\'protocolCapabilities\'], rawRuntime[\'p2pHandlerStub\'], rawRuntime[\'p2pRequesterStub\']); // optional fields\n\n\n runtime.signature = rawRuntime[\'signature\']; // parse and attach sourcePackage\n\n var sourcePackage = rawRuntime[\'sourcePackage\'];\n\n if (sourcePackage) {\n // log.log("runtime has sourcePackage:", sourcePackage);\n runtime.sourcePackage = this.createSourcePackage(sourcePackage);\n }\n\n return runtime;\n }\n /**\r\n * Create DataObjectSchema based on raw object that contains its attributes\r\n * @param rawSchema\r\n * @returns {DataObjectSchema}\r\n */\n\n }, {\n key: "createDataSchema",\n value: function createDataSchema(rawSchema) {\n //log.log("creating dataSchema based on: ", rawSchema);\n var dataSchema; //log.log(\'1. createMessageDataObjectSchema: \', rawSchema["accessControlPolicy"]);\n //log.log(\'2. createMessageDataObjectSchema: \', rawSchema["scheme"]);\n\n if (rawSchema[\'accessControlPolicy\'] && rawSchema[\'scheme\']) {\n dataSchema = this._factory.createHypertyDataObjectSchema(rawSchema[\'cguid\'], rawSchema[\'version\'], rawSchema[\'objectName\'], rawSchema[\'description\'], rawSchema[\'language\'], rawSchema[\'sourcePackageURL\'], rawSchema[\'accessControlPolicy\'], rawSchema[\'scheme\']);\n } else {\n //log.log(\'3. createMessageDataObjectSchema: \', rawSchema);\n dataSchema = this._factory.createMessageDataObjectSchema(rawSchema[\'cguid\'], rawSchema[\'version\'], rawSchema[\'objectName\'], rawSchema[\'description\'], rawSchema[\'language\'], rawSchema[\'sourcePackageURL\']);\n } // optional fields\n\n\n dataSchema.signature = rawSchema[\'signature\']; // parse and attach sourcePackage\n\n var sourcePackage = rawSchema[\'sourcePackage\'];\n\n if (sourcePackage) {\n //log.log("dataSchema has sourcePackage:", sourcePackage);\n dataSchema.sourcePackage = this.createSourcePackage(sourcePackage);\n\n try {\n dataSchema.sourcePackage.sourceCode = JSON.parse(dataSchema.sourcePackage.sourceCode);\n } catch (e) {\n log.log(\'DataSchema Source code is already parsed\');\n }\n\n return dataSchema;\n } //log.log("created dataSchema descriptor object:", dataSchema);\n\n\n return dataSchema;\n }\n /**\r\n * Create ProtocolStubDescriptor based on raw object that contains its attributes\r\n * @param rawProxy\r\n * @returns {ProtocolStubDescriptor}\r\n */\n\n }, {\n key: "createIdpProxy",\n value: function createIdpProxy(rawProxy) {\n // log.log("creating idpproxy descriptor based on: ", rawProxy);\n // create the descriptor\n var idpproxy = this._factory.createProtoStubDescriptorObject(rawProxy[\'cguid\'], rawProxy[\'version\'], rawProxy[\'objectName\'], rawProxy[\'description\'], rawProxy[\'language\'], rawProxy[\'sourcePackageURL\'], rawProxy[\'messageSchemas\'], rawProxy[\'configuration\'], rawProxy[\'constraints\'], rawProxy[\'hypertyType\'], rawProxy[\'dataObjects\'], rawProxy[\'interworking\'], rawProxy[\'idpProxy\'], rawProxy[\'mutualAuthentication\']); // optional fields\n\n\n idpproxy.signature = rawProxy[\'signature\']; // parse and attach the sourcePackage\n\n var sourcePackage = rawProxy[\'sourcePackage\'];\n\n if (sourcePackage) {\n sourcePackage = this.createSourcePackage(sourcePackage);\n idpproxy.sourcePackage = sourcePackage;\n }\n\n return idpproxy;\n }\n }, {\n key: "createSourcePackage",\n value: function createSourcePackage(sp) {\n //log.log("createSourcePackage:", sp);\n // check encoding\n if (sp[\'encoding\'] === \'base64\') {\n sp[\'sourceCode\'] = this.atob(sp[\'sourceCode\']);\n sp[\'encoding\'] = \'utf-8\';\n }\n\n var sourcePackage = this._factory.createSourcePackage(sp[\'sourceCodeClassname\'], sp[\'sourceCode\']);\n\n if (sp[\'encoding\']) sourcePackage.encoding = sp[\'encoding\'];\n if (sp[\'signature\']) sourcePackage.signature = sp[\'signature\'];\n return sourcePackage;\n }\n /**\r\n * Get source Package from a URL\r\n * @param sourcePackageURL - e.g. mydomain.com/.well-known/hyperty/MyHyperty/sourcePackage\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getSourcePackageFromURL",\n value: function getSourcePackageFromURL(sourcePackageURL) {\n var _this3 = this;\n\n log.log(\'getting sourcePackage from:\', sourcePackageURL);\n return new Promise(function (resolve, reject) {\n _this3.httpRequest.get(sourcePackageURL).then(function (result) {\n //log.log("got raw sourcePackage:", result);\n if (result[\'ERROR\']) {\n // TODO handle error properly\n reject(result);\n } else {\n result = JSON.parse(result);\n\n var sourcePackage = _this3.createSourcePackage(result);\n\n resolve(sourcePackage);\n }\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n /**\r\n * Returns the sourceCode of a given descriptor\r\n * @param {CatalogueDataObject} descriptor - Catalogue Object that was retrieved using e.g. getHypertyDescriptor()\r\n * @returns {Promise}\r\n */\n\n }, {\n key: "getSourceCodeFromDescriptor",\n value: function getSourceCodeFromDescriptor(descriptor) {\n var _this4 = this;\n\n return new Promise(function (resolve, reject) {\n if (descriptor.sourcePackage) {\n //log.log("descriptor has sourcePackage");\n //log.log("returning sourceCode:", descriptor.sourcePackage.sourceCode);\n resolve(descriptor.sourcePackage.sourceCode);\n } else {\n _this4.storageManager.getVersion(descriptor.sourcePackageURL + \'/sourceCode\').then(function (dbVersion) {\n if (dbVersion >= descriptor.version) {\n log.log(\'returning cached version from storageManager\');\n\n _this4.storageManager.get(descriptor.sourcePackageURL + \'/sourceCode\').then(function (sourceCode) {\n resolve(sourceCode);\n }).catch(function (reason) {\n reject(reason);\n });\n } else {\n _this4.httpRequest.get(descriptor.sourcePackageURL + \'/sourceCode\').then(function (sourceCode) {\n if (sourceCode[\'ERROR\']) {\n // TODO handle error properly\n reject(sourceCode);\n } else {\n _this4.storageManager.set(descriptor.sourcePackageURL + \'/sourceCode\', descriptor.version, sourceCode);\n\n resolve(sourceCode);\n }\n }).catch(function (reason) {\n reject(reason);\n });\n }\n }).catch(function (reason) {\n reject(reason);\n });\n }\n });\n }\n /**\r\n * Returns the list of available catalogue objects for the given "type URL",\r\n * i.e. a catalogue URL that specifies a type, but no catalogue object name.\r\n * @param typeURL - URL pointing to the catalogue object type you want a list of available objects for,\r\n * e.g. hyperty-catalogue://catalogue.fokus.fraunhofer.de/.well-known/idp-proxy\r\n * @param {JSON} constraints - constraints object\r\n * @returns {Promise} typeListPromise - Promise that fulfills with the list of available catalogue object names for the requested type,\r\n * rejects on HTTP error or if the HTTP response is not in JSON.\r\n * If constraints were provided, then the list only contains those objects that meet the constraints\r\n */\n\n }, {\n key: "getTypeList",\n value: function getTypeList(typeURL, constraints) {\n var _this5 = this;\n\n return new Promise(function (resolve, reject) {\n var requestPromise = constraints != undefined ? _this5.httpRequest.post(typeURL, {\n body: JSON.stringify(constraints)\n }) : _this5.httpRequest.get(typeURL);\n requestPromise.then(function (typeList) {\n typeList = JSON.parse(typeList);\n resolve(typeList);\n }).catch(function (reason) {\n reject(reason);\n });\n });\n }\n }, {\n key: "deleteFromPM",\n value: function deleteFromPM(url) {\n return this.storageManager.delete(url);\n }\n }, {\n key: "runtimeURL",\n set: function set(runtimeURL) {\n this._runtimeURL = runtimeURL;\n },\n get: function get() {\n return this._runtimeURL;\n }\n }]);\n\n return RuntimeCatalogue;\n}();\n\n/* harmony default export */ var runtime_catalogue_RuntimeCatalogue = __webpack_exports__["default"] = (RuntimeCatalogue_RuntimeCatalogue);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjIuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvUmV0aGlua09iamVjdC5qcz9iOTBhIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9DYXRhbG9ndWVEYXRhT2JqZWN0LmpzP2ZlMzEiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL1NvdXJjZVBhY2thZ2UuanM/YWUyOSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvSHlwZXJ0eURlc2NyaXB0b3IuanM/ZWE5YyIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvUHJvdG9jb2xTdHViRGVzY3JpcHRvci5qcz9iMGNiIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9IeXBlcnR5UnVudGltZURlc2NyaXB0b3IuanM/ZWUyOCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcnVudGltZS1jYXRhbG9ndWUvSHlwZXJ0eUludGVyY2VwdG9yRGVzY3JpcHRvci5qcz9jNjRiIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9ydW50aW1lLWNhdGFsb2d1ZS9EYXRhT2JqZWN0U2NoZW1hLmpzP2YxMjMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL0NhdGFsb2d1ZURhdGFPYmplY3RGYWN0b3J5LmpzPzZlMzQiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3J1bnRpbWUtY2F0YWxvZ3VlL1J1bnRpbWVDYXRhbG9ndWUuanM/NDBhNiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcbmltcG9ydCB0djQgZnJvbSBcInR2NFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJldGhpbmtPYmplY3Qge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdGVzIHRoaXMgUmV0aGlua09iamVjdCBhZ2FpbnN0IHRoZSBwcm92aWRlZCBzY2hlbWEuXHJcbiAgICAgKlxyXG4gICAgICogTElNSVRBVElPTlM6IFRoZSBwcm92aWRlZCBzY2hlbWEgY2Fubm90IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBzY2hlbWFzLCBzaW5jZSB0aGV5IGNhbid0IGJlIHJlc29sdmVkLlxyXG4gICAgICogQHBhcmFtIHNjaGVtYSAtIHNjaGVtYSB0byB2YWxpZGF0ZSBhZ2FpbnN0XHJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlXHJcbiAgICAgKi9cclxuICAgIHZhbGlkYXRlKHNjaGVtYSkge1xyXG4gICAgICAgIC8vIGFkZCBzY2hlbWEgaXRzZWxmIHNvIGxvY2FsIHJlZmVyZW5jZXMgd29ya1xyXG4gICAgICAgIHR2NC5hZGRTY2hlbWEoc2NoZW1hLmlkLCBzY2hlbWEpO1xyXG5cclxuICAgICAgICAvLyBKU09OIHN0cmluZ2lmeSAtPiBwYXJzZSBuZWVkZWQgdG8gaGF2ZSBwcm9wZXIgdmFsaWRhdGlvblxyXG4gICAgICAgIGxldCByZXN1bHQgPSB0djQudmFsaWRhdGVNdWx0aXBsZShKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKSwgc2NoZW1hKTtcclxuXHJcbiAgICAgICAgLy8gZGVsZXRlIGVycm9yIHN0YWNrcyB0byBpbXByb3ZlIGxvZ2dpbmdcclxuICAgICAgICByZXN1bHQuZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBlcnJvci5zdGFjaztcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gcHJpbnQgbW9yZSBkZXRhaWxzIGFib3V0IHZhbGlkYXRpb24gaWYgaXQgZmFpbHMgb3Igc2NoZW1hIGNvbnRhaW5zICRyZWZzXHJcbiAgICAgICAgaWYgKCFyZXN1bHQudmFsaWQgfHwgKHJlc3VsdC5taXNzaW5nLmxlbmd0aCA+IDApKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIk9iamVjdCB2YWxpZGF0aW9uIFwiICsgKHJlc3VsdC52YWxpZCA/IFwic3VjY2VlZGVkLCBidXQgc2NoZW1hIGNvbnRhaW5lZCByZWZlcmVuY2VzOlwiIDogXCJmYWlsZWQ6XCIpLCBKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJPYmplY3Q6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMsIG51bGwsIDIpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWxpZDtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFJldGhpbmtPYmplY3Q7XHJcblxyXG4iLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcbmltcG9ydCBSZXRoaW5rT2JqZWN0IGZyb20gXCIuL1JldGhpbmtPYmplY3RcIjtcclxuXHJcbi8qKlxyXG4gKiBAYXV0aG9yIGFsaWNlLmNoZWFtYmVbYXRdZm9rdXMuZnJhdW5ob2Zlci5kZVxyXG4gKiBUaGUgQ2F0YWxvZ3VlRGF0YU9iamVjdCBjbGFzcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlVEhJTksgQ2F0YWxvZ3VlIERhdGEgTW9kZWxcclxuICovXHJcbmNsYXNzIENhdGFsb2d1ZURhdGFPYmplY3QgZXh0ZW5kcyBSZXRoaW5rT2JqZWN0IHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0gZ3VpZCAtIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdCAoZS5nLiBIeXBlcnR5IGRlc2NyaXB0b3IsIFByb3RvY29sU3R1YiBkZXNjcmlwdG9yLFxyXG4gICAgICogZXRjKSBlbmFibGluZyB0aGUgc2FtZSBvYmplY3QgdG8gYmUgc3RvcmVkIGFuZCBkaXNjb3ZlcmVkIGluIGRpZmZlcmVudCBDYXRhbG9ndWVzLiBUaGF0IG1lYW5zLCBndWlkIGNvcnJlc3BvbmRzIHRvXHJcbiAgICAgKiBbcmVzb3VyY2UtdHlwZS1pZF0gcGVyIEJORiBvZiBSZXNvdXJjZSBQYXRoLiBDb3VsZG4ndCB3ZSBoYXZlIHByb2JsZW1zIHdpdGggdG9vIGxvbmcgVVJMIHBhdGhzP1xyXG4gICAgICogQHBhcmFtIHR5cGUgLSBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0IGUuZy4gSHlwZXJ0eSwgUHJvdG9jb2xTdHViLCBldGNcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXHJcbiAgICAgKiBAcGFyYW0gb2JqZWN0TmFtZSAtIGh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3QgZS5nLiBcIk15IEF3ZXNvbWUgSHlwZXJ0eVwiXHJcbiAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gLSBkZXNjcmlwdGlvbiBvZiB0aGUgc291cmNlIHBhY2thZ2VcclxuICAgICAqIEBwYXJhbSBsYW5ndWFnZSAtIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlLlNvdXJjZUNvZGVcclxuICAgICAqIEBwYXJhbSBzb3VyY2VQYWNrYWdlVVJMIC0gQSBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmdcclxuICAgICAqIGNhdGFsb2d1ZSBvYmplY3QsIGUuZy4gZGVwbG95YWJsZSBwYWNrYWdlcyBjb250YWluaW5nIGV4ZWN1dGFibGUgY29kZSBmb3IgSHlwZXJ0aWVzIG9yIFByb3RvU3R1YnMsIGNhbiBiZSBkb3dubG9hZGVkXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fZ3VpZCA9IGd1aWQ7XHJcbiAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XHJcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XHJcbiAgICAgICAgdGhpcy5fb2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7XHJcbiAgICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICAgICAgICB0aGlzLl9sYW5ndWFnZSA9IGxhbmd1YWdlO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZVBhY2thZ2VVUkwgPSBzb3VyY2VQYWNrYWdlVVJMO1xyXG5cclxuICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZVBhY2thZ2UgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldHRlcnNcclxuICAgIGdldCBndWlkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ndWlkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0eXBlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90eXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB2ZXJzaW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvYmplY3ROYW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9vYmplY3ROYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxhbmd1YWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lnbmF0dXJlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvdXJjZVBhY2thZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBhY2thZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvdXJjZVBhY2thZ2VVUkwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBhY2thZ2VVUkw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8vIFNldHRlcnNcclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBzaWduYXR1cmUgdG8gZW5hYmxlcyBpbnRlZ3JpdHkgYW5kIGF1dGhlbnRpY2l0eSB2ZXJpZmljYXRpb25cclxuICAgICAqIEBwYXJhbSBzaWduYXR1cmVcclxuICAgICAqL1xyXG4gICAgc2V0IHNpZ25hdHVyZShzaWduYXR1cmUpIHtcclxuICAgICAgICBpZiAoc2lnbmF0dXJlKVxyXG4gICAgICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBzaWduYXR1cmU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNvdXJjZVBhY2thZ2Uoc291cmNlUGFja2FnZSkge1xyXG4gICAgICAgIGlmIChzb3VyY2VQYWNrYWdlKVxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VQYWNrYWdlID0gc291cmNlUGFja2FnZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZ3VpZChndWlkKSB7XHJcbiAgICAgICAgaWYgKGd1aWQpXHJcbiAgICAgICAgICAgIHRoaXMuX2d1aWQgPSBndWlkO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCB0eXBlKHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZSlcclxuICAgICAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHZlcnNpb24odmVyc2lvbikge1xyXG4gICAgICAgIGlmICh2ZXJzaW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXQgb2JqZWN0TmFtZShvYmplY3ROYW1lKSB7XHJcbiAgICAgICAgaWYgKG9iamVjdE5hbWUpXHJcbiAgICAgICAgICAgIHRoaXMuX29iamVjdE5hbWUgPSBvYmplY3ROYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBkZXNjcmlwdGlvbihkZXNjcmlwdGlvbikge1xyXG4gICAgICAgIGlmIChkZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgbGFuZ3VhZ2UobGFuZ3VhZ2UpIHtcclxuICAgICAgICBpZiAobGFuZ3VhZ2UpXHJcbiAgICAgICAgICAgIHRoaXMuX2xhbmd1YWdlID0gbGFuZ3VhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNvdXJjZVBhY2thZ2VVUkwoc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgICAgIGlmIChzb3VyY2VQYWNrYWdlVVJMKVxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VQYWNrYWdlVVJMID0gc291cmNlUGFja2FnZVVSTDtcclxuICAgIH1cclxufVxyXG4vL0FsaWNlOiByZW1vdmVkIFBPTElDWV9FTkZPUkNFUjogJ3BvbGljeV9lbmZvcmNlcicsIERBVEFfU0NIRU1BOiAnZGF0YV9zY2hlbWEnIGZyb20gdGhlIGxpc3RcclxuLy93cnQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9yZVRISU5LLXByb2plY3QvZGV2LXNlcnZpY2UtZnJhbWV3b3JrL2Jsb2IvZGV2ZWxvcC9kb2NzL2RhdGFtb2RlbC9jb3JlL2h5cGVydHktY2F0YWxvZ3VlL3JlYWRtZS5tZCNkYXRhLW9iamVjdC1zY2hlbWFcclxuZXhwb3J0IGNvbnN0IENhdGFsb2d1ZU9iamVjdFR5cGUgPSB7XHJcbiAgICBIWVBFUlRZOiAnaHlwZXJ0eScsIFBST1RPU1RVQjogJ3Byb3Rvc3R1YicsIEhZUEVSVFlfUlVOVElNRTogJ2h5cGVydHlfcnVudGltZScsXHJcbiAgICBIWVBFUlRZX0lOVEVSQ0VQVE9SOiAnaHlwZXJ0eV9pbnNwZWN0b3InLCBIWVBFUlRZX0RBVEFfT0JKRUNUOiAnaHlwZXJ0eV9kYXRhX29iamVjdCdcclxufTtcclxuZXhwb3J0IGNvbnN0IERhdGFPYmplY3RTb3VyY2VMYW5ndWFnZSA9IHtcclxuICAgIEpBVkFTQ1JJUFRfRUNNQTY6ICdqYXZhc2NyaXB0X2VjbWE2JywgSkFWQVNDUklQVF9FQ01BNTogJ2phdmFzY3JpcHRfZWNtYTUnLFxyXG4gICAgSlNPTl9TQ0hFTUFfVjQ6ICdqc29uX3NjaGVtYV92NCcsIFBZVEhPTjogJ3B5dGhvbicsIFRZUEVTQ1JJUFQ6ICd0eXBlc2NyaXB0J1xyXG59O1xyXG5leHBvcnQgZGVmYXVsdCBDYXRhbG9ndWVEYXRhT2JqZWN0OyIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGFtbyBvbiAxNC8xMS8yMDE1LlxyXG4gKi9cclxuY2xhc3MgU291cmNlUGFja2FnZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2VDb2RlQ2xhc3NuYW1lLCBzb3VyY2VDb2RlKSB7XHJcbiAgICAgICAgdGhpcy5fc291cmNlQ29kZSA9IHNvdXJjZUNvZGU7XHJcbiAgICAgICAgdGhpcy5fc291cmNlQ29kZUNsYXNzbmFtZSA9IHNvdXJjZUNvZGVDbGFzc25hbWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2VuY29kaW5nID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zaWduYXR1cmUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3VyY2VDb2RlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VDb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3VyY2VDb2RlQ2xhc3NuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2VDb2RlQ2xhc3NuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbmNvZGluZygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNpZ25hdHVyZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2lnbmF0dXJlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBlbmNvZGluZyhlbmNvZGluZykge1xyXG4gICAgICAgIGlmIChlbmNvZGluZylcclxuICAgICAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgc2lnbmF0dXJlKHNpZ24pIHtcclxuICAgICAgICBpZiAoc2lnbilcclxuICAgICAgICAgICAgdGhpcy5fc2lnbmF0dXJlID0gc2lnbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgc291cmNlQ29kZShzb3VyY2VDb2RlKSB7XHJcbiAgICAgICAgaWYgKHNvdXJjZUNvZGUpXHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZUNvZGUgPSBzb3VyY2VDb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBzb3VyY2VDb2RlQ2xhc3NuYW1lKHNvdXJjZUNvZGVDbGFzc25hbWUpIHtcclxuICAgICAgICBpZiAoc291cmNlQ29kZUNsYXNzbmFtZSlcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlQ29kZUNsYXNzbmFtZSA9IHNvdXJjZUNvZGVDbGFzc25hbWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFNvdXJjZVBhY2thZ2U7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGFtbyBvbiAxNC8xMS8yMDE1LlxyXG4gKi9cclxuaW1wb3J0IENhdGFsb2d1ZURhdGFPYmplY3QgZnJvbSAnLi9DYXRhbG9ndWVEYXRhT2JqZWN0JztcclxuXHJcbmNsYXNzIEh5cGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgQ2F0YWxvZ3VlRGF0YU9iamVjdCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0IGVuYWJsaW5nIHRoZSBzYW1lIG9iamVjdCB0byBiZVxyXG4gICAgICogc3RvcmVkIGFuZCBkaXNjb3ZlcmVkIGluIGRpZmZlcmVudCBDYXRhbG9ndWVzLiBHdWlkIGNvcnJlc3BvbmRzIHRvIDxyZXNvdXJjZS10eXBlLWlkPiBwZXIgQk5GIG9mIFJlc291cmNlIFBhdGguXHJcbiAgICAgKiBAcGFyYW0ge0NhdGFsb2d1ZU9iamVjdFR5cGV9IGNhdGFsb2d1ZVR5cGUgLSBcdEluZGljYXRlcyB0aGUgdHlwZSBvZiBDYXRhbG9ndWUgRGF0YSBPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMXHJcbiAgICAgKiBAcGFyYW0ge0h5cGVydHlSZXNvdXJjZVR5cGVbXX0gaHlwZXJ0eVR5cGUgQSB0YWcgdGhhdCBpZGVudGlmaWVzIHdoYXQgdHlwZSBvZiBoeXBlcnR5IGlzIGRlc2NyaWJlZCBpbiB0aGUgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtVUkwuSHlwZXJ0eUNhdGFsb2d1ZVVSTExpc3R9IGRhdGFPYmplY3RVcmxzIC0gSXQgZGVmaW5lcyB0aGUgRGF0YSBPYmplY3QgU2NoZW1hcyBzdXBwb3J0ZWQgYnkgdGhlIEh5cGVydHlcclxuICAgICAqIHRocm91Z2ggYSBsaXN0IG9mIENhdGFsb2d1ZSBVUkxzIGZyb20gd2hlcmUgdGhlc2Ugc2NoZW1hcyBjYW4gYmUgcmVhY2hlZFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCBjYXRhbG9ndWVUeXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0VXJscykge1xyXG4gICAgICAgIHN1cGVyKGd1aWQsIGNhdGFsb2d1ZVR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSB7fTtcclxuICAgICAgICB0aGlzLl9jb25zdHJhaW50cyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3BvbGljaWVzID0ge307XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNjaGVtYSA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuX2h5cGVydHlUeXBlID0gaHlwZXJ0eVR5cGU7XHJcbiAgICAgICAgdGhpcy5fZGF0YU9iamVjdHMgPSBkYXRhT2JqZWN0VXJscztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaHlwZXJ0eVR5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkYXRhT2JqZWN0cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YU9iamVjdHM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbmZpZ3VyYXRpb24oKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnN0cmFpbnRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdHJhaW50cztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbWVzc2FnZVNjaGVtYSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZVNjaGVtYTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcG9saWNpZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BvbGljaWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBoeXBlcnR5VHlwZShoVHlwZSkge1xyXG4gICAgICAgIGlmIChoVHlwZSlcclxuICAgICAgICAgICAgdGhpcy5faHlwZXJ0eVR5cGUgPSBoVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZGF0YU9iamVjdHMoZGF0YU9iamVjdHMpIHtcclxuICAgICAgICBpZiAoZGF0YU9iamVjdHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzID0gZGF0YU9iamVjdHM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY29uc3RyYWludHMoY29uc3RyYWludHMpIHtcclxuICAgICAgICBpZiAoY29uc3RyYWludHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG1lc3NhZ2VTY2hlbWEobWVzc2FnZVNjaGVtYSkge1xyXG4gICAgICAgIGlmIChtZXNzYWdlU2NoZW1hKVxyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2NoZW1hID0gbWVzc2FnZVNjaGVtYTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgcG9saWNpZXMocG9saWNpZXMpIHtcclxuICAgICAgICBpZiAocG9saWNpZXMpXHJcbiAgICAgICAgICAgIHRoaXMuX3BvbGljaWVzID0gcG9saWNpZXM7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IFJ1bnRpbWVIeXBlcnR5Q2FwYWJpbGl0eVR5cGUgPSB7fTtcclxuZXhwb3J0IGNvbnN0IEh5cGVydHlUeXBlID0ge0NPTU1VTklDQVRPUjogJ2NvbW11bmljYXRvcicsIElERU5USVRZOiAnaWRlbnRpdHknLCBDT05URVhUOiAnY29udGV4dCd9O1xyXG5leHBvcnQgY29uc3QgSHlwZXJ0eVJlc291cmNlVHlwZSA9IHtjaGF0OiAnQ0hBVCcsIGF1ZGlvOiAnQXVkaW8nLCB2aWRlbzogJ1ZpZGVvJywgYXY6ICdBVicsIHNjcmVlbjonU0NSRUVOJyxcclxuICAgIGZpbGU6ICdGSUxlJywgbWlkaTonTUlESSd9O1xyXG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5RGVzY3JpcHRvcjsiLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogQ3JlYXRlZCBieSBhbW8gb24gMTQvMTEvMjAxNS5cclxuICovXHJcblxyXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCBmcm9tIFwiLi9DYXRhbG9ndWVEYXRhT2JqZWN0XCI7XHJcblxyXG5jbGFzcyBQcm90b2NvbFN0dWJEZXNjcmlwdG9yIGV4dGVuZHMgQ2F0YWxvZ3VlRGF0YU9iamVjdCB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIG1lc3NhZ2VTY2hlbWFzLCBjb25maWd1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgY29uc3RyYWludHMsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0cywgaW50ZXJ3b3JraW5nLCBpZHBQcm94eSwgbXV0dWFsQXV0aGVudGljYXRpb24pIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG5cclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2NoZW1hcyA9IG1lc3NhZ2VTY2hlbWFzO1xyXG5cclxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbilcclxuICAgICAgICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0ge307XHJcblxyXG4gICAgICAgIGlmIChjb25zdHJhaW50cylcclxuICAgICAgICAgICAgdGhpcy5fY29uc3RyYWludHMgPSBjb25zdHJhaW50cztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbnRzID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuX2h5cGVydHlUeXBlID0gaHlwZXJ0eVR5cGU7XHJcblxyXG4gICAgICAgIGlmIChkYXRhT2JqZWN0cylcclxuICAgICAgICAgICAgdGhpcy5fZGF0YU9iamVjdHMgPSBkYXRhT2JqZWN0cztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGFPYmplY3RzID0gW107XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy5faW50ZXJ3b3JraW5nID0gaW50ZXJ3b3JraW5nO1xyXG4gICAgICAgIHRoaXMuX2lkcFByb3h5ID0gaWRwUHJveHk7XHJcbiAgICAgICAgdGhpcy5fbXV0dWFsQXV0aGVudGljYXRpb24gPSBtdXR1YWxBdXRoZW50aWNhdGlvbjtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG1lc3NhZ2VTY2hlbWFzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlU2NoZW1hcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29uc3RyYWludHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0cmFpbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWd1cmF0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBtZXNzYWdlU2NoZW1hcyhtZXNzYWdlU2NoZW1hcykge1xyXG4gICAgICAgIGlmIChtZXNzYWdlU2NoZW1hcylcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNjaGVtYXMgPSBtZXNzYWdlU2NoZW1hcztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY29uc3RyYWludHMoY29uc3RyYWludHMpIHtcclxuICAgICAgICBpZiAoY29uc3RyYWludHMpXHJcbiAgICAgICAgICAgIHRoaXMuX2NvbnN0cmFpbnRzID0gY29uc3RyYWludHM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xyXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uKVxyXG4gICAgICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaHlwZXJ0eVR5cGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlUeXBlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBoeXBlcnR5VHlwZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2h5cGVydHlUeXBlID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRhdGFPYmplY3RzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kYXRhT2JqZWN0cztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgZGF0YU9iamVjdHModmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9kYXRhT2JqZWN0cyA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpbnRlcndvcmtpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ludGVyd29ya2luZztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaW50ZXJ3b3JraW5nKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5faW50ZXJ3b3JraW5nID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlkcFByb3h5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pZHBQcm94eTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaWRwUHJveHkodmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9pZHBQcm94eSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBtdXR1YWxBdXRoZW50aWNhdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbXV0dWFsQXV0aGVudGljYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IG11dHVhbEF1dGhlbnRpY2F0aW9uKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fbXV0dWFsQXV0aGVudGljYXRpb24gPSB2YWx1ZTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJvdG9jb2xTdHViRGVzY3JpcHRvcjsiLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcblxyXG4vKipcclxuICogQ3JlYXRlZCBieSBhbW8gb24gMTQvMTEvMjAxNS5cclxuICovXHJcblxyXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCBmcm9tIFwiLi9DYXRhbG9ndWVEYXRhT2JqZWN0XCI7XHJcblxyXG5jbGFzcyBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IgZXh0ZW5kcyBDYXRhbG9ndWVEYXRhT2JqZWN0IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCBjYXRhbG9ndWVUeXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIHJ1bnRpbWVUeXBlLFxyXG4gICAgICAgICAgICAgICAgaHlwZXJ0eUNhcGFiaWxpdGllcywgcHJvdG9jb2xDYXBhYmlsaXRpZXMsIHAycEhhbmRsZXJTdHViLCBwMnBSZXF1ZXN0ZXJTdHViKSB7XHJcbiAgICAgICAgc3VwZXIoZ3VpZCwgY2F0YWxvZ3VlVHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcnVudGltZVR5cGUgPSBydW50aW1lVHlwZTtcclxuXHJcbiAgICAgICAgaWYgKGh5cGVydHlDYXBhYmlsaXRpZXMpXHJcbiAgICAgICAgICAgIHRoaXMuX2h5cGVydHlDYXBhYmlsaXRpZXMgPSBoeXBlcnR5Q2FwYWJpbGl0aWVzO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5faHlwZXJ0eUNhcGFiaWxpdGllcyA9IG5ldyBSdW50aW1lSHlwZXJ0eUNhcGFiaWxpdHkodHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG4gICAgICAgIGlmIChwcm90b2NvbENhcGFiaWxpdGllcylcclxuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xDYXBhYmlsaXRpZXMgPSBwcm90b2NvbENhcGFiaWxpdGllcztcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sQ2FwYWJpbGl0aWVzID0gbmV3IFJ1bnRpbWVQcm90b2NvbENhcGFiaWxpdHkodHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICB0aGlzLl9wMnBIYW5kbGVyU3R1YiA9IHAycEhhbmRsZXJTdHViO1xyXG4gICAgICAgIHRoaXMuX3AycFJlcXVlc3RlclN0dWIgPSBwMnBSZXF1ZXN0ZXJTdHViO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBydW50aW1lVHlwZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcnVudGltZVR5cGU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGh5cGVydHlDYXBhYmlsaXRpZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h5cGVydHlDYXBhYmlsaXRpZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByb3RvY29sQ2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9oeXBlcnR5Q2FwYWJpbGl0aWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBydW50aW1lVHlwZShydW50aW1lVHlwZSkge1xyXG4gICAgICAgIGlmIChydW50aW1lVHlwZSlcclxuICAgICAgICAgICAgdGhpcy5fcnVudGltZVR5cGUgPSBydW50aW1lVHlwZTtcclxuICAgIH1cclxuXHJcbiAgICBzZXQgaHlwZXJ0eUNhcGFiaWxpdGllcyhoeXBlcnR5Q2FwYWJpbGl0aWVzKSB7XHJcbiAgICAgICAgaWYgKGh5cGVydHlDYXBhYmlsaXRpZXMpXHJcbiAgICAgICAgICAgIHRoaXMuX2h5cGVydHlDYXBhYmlsaXRpZXMgPSBoeXBlcnR5Q2FwYWJpbGl0aWVzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBwcm90b2NvbENhcGFiaWxpdGllcyhwcm90b2NvbENhcGFiaWxpdGllcykge1xyXG4gICAgICAgIGlmIChwcm90b2NvbENhcGFiaWxpdGllcylcclxuICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2xDYXBhYmlsaXRpZXMgPSBwcm90b2NvbENhcGFiaWxpdGllcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcDJwSGFuZGxlclN0dWIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3AycEhhbmRsZXJTdHViO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBwMnBIYW5kbGVyU3R1Yih2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3AycEhhbmRsZXJTdHViID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHAycFJlcXVlc3RlclN0dWIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3AycFJlcXVlc3RlclN0dWI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHAycFJlcXVlc3RlclN0dWIodmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9wMnBSZXF1ZXN0ZXJTdHViID0gdmFsdWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjYXBhYmlsaXR5IHNldCBvZiB0aGUgUnVudGltZSBIeXBlcnR5XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUnVudGltZUh5cGVydHlDYXBhYmlsaXR5IHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhbiBvYmplY3Qgb2YgdGhlIFJ1bnRpbWUgSHlwZXJ0eSBjYXBhYmlsaXR5IHNldFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc1dlYlJUQ1N1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc01pY1N1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0NhbWVyYVN1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc1NlbnNvclN1cHBvcnRlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc09SVENTdXBwb3J0ZWRcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaXNXZWJSVENTdXBwb3J0ZWQsIGlzTWljU3VwcG9ydGVkLCBpc0NhbWVyYVN1cHBvcnRlZCwgaXNTZW5zb3JTdXBwb3J0ZWQsIGlzT1JUQ1N1cHBvcnRlZCkge1xyXG4gICAgICAgIHRoaXMuX2lzV2ViUlRDID0gaXNXZWJSVENTdXBwb3J0ZWQ7XHJcbiAgICAgICAgdGhpcy5faXNNaWMgPSBpc01pY1N1cHBvcnRlZDtcclxuICAgICAgICB0aGlzLl9pc0NhbWVyYSA9IGlzQ2FtZXJhU3VwcG9ydGVkO1xyXG4gICAgICAgIHRoaXMuX2lzU2Vuc29yID0gaXNTZW5zb3JTdXBwb3J0ZWQ7XHJcbiAgICAgICAgdGhpcy5faXNPUlRDID0gaXNPUlRDU3VwcG9ydGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc01pYygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNNaWM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzQ2FtZXJhKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbWVyYTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNTZW5zb3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU2Vuc29yO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc1dlYlJUQygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNXZWJSVEM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzT1JUQ1MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzT1JUQztcclxuICAgIH1cclxuXHJcbiAgICBnZXRDYXBhYmlsaXR5U2V0KCkge1xyXG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBBIGNsYXNzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm90b2NvbCBjYXBhYmlsaXR5IHNldCBvZiB0aGUgUnVudGltZSBIeXBlcnR5XHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUnVudGltZVByb3RvY29sQ2FwYWJpbGl0eSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBvZiB0aGUgcnVudGltZSBwcm90b2NvbCBjYXBhYmlsaXR5XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzSHR0cFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpc0h0dHBzXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzV1NcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNXU1NcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNDb2FwXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzRGF0YUNoYW5uZWxcclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoaXNIdHRwLCBpc0h0dHBzLCBpc1dTLCBpc1dTUywgaXNDb2FwLCBpc0RhdGFDaGFubmVsKSB7XHJcbiAgICAgICAgdGhpcy5faXNIdHRwID0gaXNIdHRwO1xyXG4gICAgICAgIHRoaXMuX2lzSHR0cHMgPSBpc0h0dHBzO1xyXG4gICAgICAgIHRoaXMuX2lzV1MgPSBpc1dTO1xyXG4gICAgICAgIHRoaXMuX2lzV1NTID0gaXNXU1M7XHJcbiAgICAgICAgdGhpcy5faXNDb2FwID0gaXNDb2FwO1xyXG4gICAgICAgIHRoaXMuX2lzRGF0YUNoYW5uZWwgPSBpc0RhdGFDaGFubmVsO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSHR0cCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNIdHRwO1xyXG4gICAgfVxyXG5cclxuICAgIGlzSHR0cHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzSHR0cHM7XHJcbiAgICB9XHJcblxyXG4gICAgaXNXUygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNXUztcclxuICAgIH1cclxuXHJcbiAgICBpc1NlbnNvclN1cHBvcnRlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNTZW5zb3I7XHJcbiAgICB9XHJcblxyXG4gICAgaXNXU1MoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzV1NTO1xyXG4gICAgfVxyXG5cclxuICAgIGlzQ29hcCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNDb2FwO1xyXG4gICAgfVxyXG5cclxuICAgIGlzRGF0YUNoYW5uZWwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGF0YUNoYW5uZWw7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldENhcGFiaWxpdHlTZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUnVudGltZVR5cGUgPSB7QlJPV1NFUjogJ2Jyb3dzZXInLCBTVEFOREFMT05FOiAnc3RhbmRhbG9uZScsIFNFUlZFUjogJ3NlcnZlcicsIEdBVEVXQVk6ICdnYXRld2F5J307XHJcblxyXG5leHBvcnQgZGVmYXVsdCBIeXBlcnR5UnVudGltZURlc2NyaXB0b3I7XHJcbiIsIi8qKlxyXG4qIENvcHlyaWdodCAyMDE2IFBUIElub3Zhw6fDo28gZSBTaXN0ZW1hcyBTQVxyXG4qIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiogQ29weXJpZ2h0IDIwMTYgUVVPQklTIE5FVFdPUktTIFNMXHJcbiogQ29weXJpZ2h0IDIwMTYgRlJBVU5IT0ZFUi1HRVNFTExTQ0hBRlQgWlVSIEZPRVJERVJVTkcgREVSIEFOR0VXQU5EVEVOIEZPUlNDSFVORyBFLlZcclxuKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBEZXV0c2NoZSBUZWxla29tIEFHXHJcbiogQ29weXJpZ2h0IDIwMTYgQXBpemVlXHJcbiogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuKlxyXG4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XHJcbiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4qXHJcbiogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuKlxyXG4qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcclxuKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXHJcbiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxyXG4qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4qKi9cclxuXHJcbi8qKlxyXG4gKiBDcmVhdGVkIGJ5IHB6dSBvbiAxOS4xMS4xNS5cclxuICovXHJcbmltcG9ydCBDYXRhbG9ndWVEYXRhT2JqZWN0IGZyb20gJy4vQ2F0YWxvZ3VlRGF0YU9iamVjdCc7XHJcblxyXG5jbGFzcyBQb2xpY3lFbmZvcmNlckRlc2NyaXB0b3IgZXh0ZW5kcyBDYXRhbG9ndWVEYXRhT2JqZWN0IHtcclxuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgY29uZmlndXJhdGlvbiwgcG9saWNpZXMpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG5cclxuICAgICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcclxuICAgICAgICB0aGlzLl9wb2xpY2llcyA9IHBvbGljaWVzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWd1cmF0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwb2xpY2llcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9saWNpZXM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHBvbGljaWVzKHBvbGljaWVzKSB7XHJcbiAgICAgICAgdGhpcy5fcG9saWNpZXMgPSBwb2xpY2llcztcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvbGljeUVuZm9yY2VyRGVzY3JpcHRvcjsiLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG4vKipcclxuICogQ3JlYXRlZCBieSBwenUgb24gMTkuMTEuMTUuXHJcbiAqL1xyXG5cclxuaW1wb3J0IENhdGFsb2d1ZURhdGFPYmplY3QgZnJvbSAnLi9DYXRhbG9ndWVEYXRhT2JqZWN0JztcclxuXHJcbmV4cG9ydCBjbGFzcyBEYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgQ2F0YWxvZ3VlRGF0YU9iamVjdCB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuXHJcbi8vQ2hpbGRyZW5cclxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgRGF0YU9iamVjdFNjaGVtYSB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEgZXh0ZW5kcyBEYXRhT2JqZWN0U2NoZW1hIHtcclxuICAgIGNvbnN0cnVjdG9yKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgYWNjZXNzQ29udHJvbFBvbGljeSwgZGF0YVVybFNjaGVtZSkge1xyXG4gICAgICAgIHN1cGVyKGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XHJcbiAgICAgICAgdGhpcy5fYWNjZXNzQ29udHJvbFBvbGljeSA9IGFjY2Vzc0NvbnRyb2xQb2xpY3k7XHJcbiAgICAgICAgdGhpcy5fc2NoZW1lID0gZGF0YVVybFNjaGVtZTtcclxuICAgIH1cclxufVxyXG5cclxuLy9DaGlsZHJlblxyXG5leHBvcnQgY2xhc3MgQ29tbXVuaWNhdGlvbkRhdGFPYmplY3RTY2hlbWEgZXh0ZW5kcyBIeXBlcnR5RGF0YU9iamVjdFNjaGVtYSB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbkRhdGFPYmplY3RTY2hlbWEgZXh0ZW5kcyBIeXBlcnR5RGF0YU9iamVjdFNjaGVtYSB7XHJcbiAgICBjb25zdHJ1Y3RvcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpIHtcclxuICAgICAgICBzdXBlcihndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlEYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEge1xyXG4gICAgY29uc3RydWN0b3IoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KSB7XHJcbiAgICAgICAgc3VwZXIoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIENvbnRleHREYXRhT2JqZWN0U2NoZW1hIGV4dGVuZHMgSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEge1xyXG4gICAgY29uc3RydWN0b3IoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KSB7XHJcbiAgICAgICAgc3VwZXIoZ3VpZCwgdHlwZSwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERhdGFVcmxTY2hlbWUgPSB7XHJcbiAgICBDT01NOiAnQ09NTScsIENPTk5FQ1RJT046ICdDT05ORUNUSU9OJywgQ1RYVDogJ0NUWFQnLCBJREVOVElUWTogJ0lERU5USVRZJ1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgRGF0YU9iamVjdFNjaGVtYTsiLCIvKipcclxuICogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiAqIENvcHlyaWdodCAyMDE2IElORVNDLUlEXHJcbiAqIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4gKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4gKiBDb3B5cmlnaHQgMjAxNiBPUkFOR0UgU0FcclxuICogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4gKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuICogQ29weXJpZ2h0IDIwMTYgVEVDSE5JU0NIRSBVTklWRVJTSVRBVCBCRVJMSU5cclxuICpcclxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxyXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuICpcclxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuICpcclxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXHJcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxyXG4gKiovXHJcblxyXG5pbXBvcnQgQ2F0YWxvZ3VlRGF0YU9iamVjdCwge0NhdGFsb2d1ZU9iamVjdFR5cGUsIERhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gZnJvbSBcIi4vQ2F0YWxvZ3VlRGF0YU9iamVjdFwiO1xyXG5pbXBvcnQgU291cmNlUGFja2FnZSBmcm9tIFwiLi9Tb3VyY2VQYWNrYWdlXCI7XHJcbmltcG9ydCBIeXBlcnR5RGVzY3JpcHRvciBmcm9tIFwiLi9IeXBlcnR5RGVzY3JpcHRvclwiO1xyXG5pbXBvcnQgUHJvdG9jb2xTdHViRGVzY3JpcHRvciBmcm9tIFwiLi9Qcm90b2NvbFN0dWJEZXNjcmlwdG9yXCI7XHJcbmltcG9ydCBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IsIHtSdW50aW1lVHlwZX0gZnJvbSBcIi4vSHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yXCI7XHJcbmltcG9ydCBIeXBlcnR5SW50ZXJjZXB0b3JEZXNjcmlwdG9yIGZyb20gXCIuL0h5cGVydHlJbnRlcmNlcHRvckRlc2NyaXB0b3JcIjtcclxuaW1wb3J0IHtcclxuICAgIERhdGFPYmplY3RTY2hlbWEsXHJcbiAgICBEYXRhVXJsU2NoZW1lLFxyXG4gICAgQ29tbXVuaWNhdGlvbkRhdGFPYmplY3RTY2hlbWEsXHJcbiAgICBDb25uZWN0aW9uRGF0YU9iamVjdFNjaGVtYSxcclxuICAgIENvbnRleHREYXRhT2JqZWN0U2NoZW1hLFxyXG4gICAgSWRlbnRpdHlEYXRhT2JqZWN0U2NoZW1hXHJcbn0gZnJvbSBcIi4vRGF0YU9iamVjdFNjaGVtYVwiO1xyXG5cclxuY2xhc3MgQ2F0YWxvZ3VlRGF0YU9iamVjdEZhY3Rvcnkge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIENhdGFsb2d1ZURhdGFPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtDYXRhbG9ndWVPYmplY3RUeXBlfSB0eXBlIC0gSW5kaWNhdGVzIHRoZSB0eXBlIG9mIENhdGFsb2d1ZSBEYXRhIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBQcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3QgY2FuIGJlIGRvd25sb2FkZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7Q2F0YWxvZ3VlRGF0YU9iamVjdH1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlQ2F0YWxvZ3VlRGF0YU9iamVjdChndWlkLCB0eXBlLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiBndWlkID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB0eXBlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBvYmplY3ROYW1lID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBkZXNjcmlwdGlvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHNvdXJjZVBhY2thZ2VVUkwgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICApXHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgcGFyYW1ldGVycyFcIik7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDYXRhbG9ndWVEYXRhT2JqZWN0KGd1aWQsIHR5cGUsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgSHlwZXJ0eURlc2NyaXB0b3JcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBQcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3RcclxuICAgICAqIGNhbiBiZSBkb3dubG9hZGVkLlxyXG4gICAgICogQHBhcmFtIHtIeXBlcnR5UmVzb3VyY2VUeXBlW119IGh5cGVydHlUeXBlIC0gQW4gYXJyYXkgb2YgSHlwZXJ0eVJlc291cmNlVHlwZSB0aGF0IGlkZW50aWZpZXMgd2hhdCB0eXBlIG9mIGh5cGVydHlcclxuICAgICAqIHJlc291cmNlcyBhcmUgaGFuZGxlZCBieSB0aGUgb2JqZWN0LlxyXG4gICAgICogQHBhcmFtIHtVUkwuVVJMTGlzdH0gZGF0YU9iamVjdHMgLSBEZWZpbmVzIHRoZSBEYXRhIE9iamVjdCBTY2hlbWFzIHN1cHBvcnRlZCBieSB0aGUgSHlwZXJ0eSB0aHJvdWdoIGEgbGlzdCBvZiBDYXRhbG9ndWUgVVJMcyBmcm9tIHdoZXJlIHRoZXNlIHNjaGVtYXMgY2FuIGJlIHJlYWNoZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eURlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICAgIGNyZWF0ZUh5cGVydHlEZXNjcmlwdG9yT2JqZWN0KGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgaHlwZXJ0eVR5cGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0cykge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHZlcnNpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIG9iamVjdE5hbWUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlUGFja2FnZVVSTCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgaHlwZXJ0eVR5cGUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRhdGFPYmplY3RzID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgSHlwZXJ0eURlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgUHJvdG9jb2xTdHViRGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cclxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cclxuICAgICAqIEBwYXJhbSB7VVJMLlVSTH0gbWVzc2FnZVNjaGVtYXMgLSBEZWZpbmVzIHRoZSBTY2hlbWEgZGVzY3JpYmluZyB0aGUgTWVzc2FnZSBEYXRhIE1vZGVsIHVzZWQgYnkgdGhlIEh5cGVydHkgdGhyb3VnaCB0aGUgQ2F0YWxvZ3VlIFVSTCBmcm9tIHdoZXJlIHRoZSBNZXNzYWdlIHNjaGVtYSBjYW4gYmUgcmVhY2hlZC4gSWYgbm90IGRlZmluZWQsIGJ5IGRlZmF1bHQgaXQgaXMgYXNzdW1lZCB0aGUgc3RhbmRhcmQgTWVzc2FnZSBNb2RlbCBpcyB1c2VkLlxyXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gLSBEYXRhIHJlcXVpcmVkIHRvIGNvbmZpZ3VyZSB0aGUgUHJvdG9jb2xTdHViXHJcbiAgICAgKiBAcGFyYW0gY29uc3RyYWludHMgLSBEZXNjcmliZXMgY2FwYWJpbGl0aWVzIHJlcXVpcmVkIGZyb20gdGhlIEh5cGVydHkgUnVudGltZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGV4ZWN1dGUgdGhlIFByb3RvY29sU3R1YlxyXG4gICAgICogQHBhcmFtIGh5cGVydHlUeXBlXHJcbiAgICAgKiBAcGFyYW0gZGF0YU9iamVjdHNcclxuICAgICAqIEBwYXJhbSBpbnRlcndvcmtpbmdcclxuICAgICAqIEBwYXJhbSBpZHBQcm94eVxyXG4gICAgICogQHBhcmFtIG11dHVhbEF1dGhlbnRpY2F0aW9uXHJcbiAgICAgKiBAcmV0dXJucyB7UHJvdG9jb2xTdHViRGVzY3JpcHRvcn1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlUHJvdG9TdHViRGVzY3JpcHRvck9iamVjdChndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIG1lc3NhZ2VTY2hlbWFzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLCBjb25zdHJhaW50cywgaHlwZXJ0eVR5cGUsIGRhdGFPYmplY3RzLCBpbnRlcndvcmtpbmcsIGlkcFByb3h5LCBtdXR1YWxBdXRoZW50aWNhdGlvbikge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHZlcnNpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIG9iamVjdE5hbWUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlUGFja2FnZVVSTCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgbWVzc2FnZVNjaGVtYXMgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGNvbmZpZ3VyYXRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGNvbnN0cmFpbnRzID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xTdHViRGVzY3JpcHRvcihndWlkLCBDYXRhbG9ndWVPYmplY3RUeXBlLlBST1RPU1RVQiwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBtZXNzYWdlU2NoZW1hcywgY29uZmlndXJhdGlvbiwgY29uc3RyYWludHMsIGh5cGVydHlUeXBlLCBkYXRhT2JqZWN0cywgaW50ZXJ3b3JraW5nLCBpZHBQcm94eSwgbXV0dWFsQXV0aGVudGljYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlSdW50aW1lRGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cclxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cclxuICAgICAqIEBwYXJhbSB7UnVudGltZVR5cGV9cnVudGltZVR5cGVcclxuICAgICAqIEBwYXJhbSB7UnVudGltZUh5cGVydHlDYXBhYmlsaXRpZXN9IGh5cGVydHlDYXBhYmlsaXRpZXMgLSBTdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIHRvIGV4ZWN1dGUgSHlwZXJ0aWVzXHJcbiAgICAgKiBAcGFyYW0ge1J1bnRpbWVQcm90b2NvbENhcGFiaWxpdGllc30gcHJvdG9jb2xDYXBhYmlsaXRpZXMgLSBTdXBwb3J0ZWQgY2FwYWJpbGl0aWVzIHRvIGV4ZWN1dGUgUHJvdG9jb2wgU3R1YnNcclxuICAgICAqIEBwYXJhbSBwMnBIYW5kbGVyU3R1YlxyXG4gICAgICogQHBhcmFtIHAycFJlcXVlc3RlclN0dWJcclxuICAgICAqIEByZXR1cm5zIHtIeXBlcnR5UnVudGltZURlc2NyaXB0b3J9IHRoZSBkYXRhIG9iamVjdCBvZiB0aGUgSHlwZXJ0eSBSdW50aW1lIERlc2NyaXB0b3JcclxuICAgICAqL1xyXG4gICAgY3JlYXRlSHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yT2JqZWN0KGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lVHlwZSwgaHlwZXJ0eUNhcGFiaWxpdGllcywgcHJvdG9jb2xDYXBhYmlsaXRpZXMsIHAycEhhbmRsZXJTdHViLCBwMnBSZXF1ZXN0ZXJTdHViKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgdmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGxhbmd1YWdlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBydW50aW1lVHlwZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBIeXBlcnR5UnVudGltZURlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX1JVTlRJTUUsIHZlcnNpb24sIG9iamVjdE5hbWUsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgcnVudGltZVR5cGUsIGh5cGVydHlDYXBhYmlsaXRpZXMsIHByb3RvY29sQ2FwYWJpbGl0aWVzLCBwMnBIYW5kbGVyU3R1YiwgcDJwUmVxdWVzdGVyU3R1Yik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgSHlwZXJ0eSBJbnRlcmNlcHRvciBEZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCAtIENhdGFsb2d1ZSBHbG9iYWwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIENhdGFsb2d1ZSBPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSAtIEh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxyXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhY2thZ2VVUkwgLSBVUkwgZnJvbSB3aGVyZSB0aGUgc291cmNlIGNvZGUgcGFja2FnZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRhbG9ndWUgb2JqZWN0IGNhbiBiZSBkb3dubG9hZGVkLlxyXG4gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb25cclxuICAgICAqIEBwYXJhbSBwb2xpY2llc1xyXG4gICAgICogQHJldHVybnMge1BvbGljeUVuZm9yY2VyRGVzY3JpcHRvcn1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlSHlwZXJ0eUludGVyY2VwdG9yRGVzY3JpcHRvck9iamVjdChndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGNvbmZpZ3VyYXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljaWVzKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgdmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGxhbmd1YWdlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IEh5cGVydHlJbnRlcmNlcHRvckRlc2NyaXB0b3IoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0lOVEVSQ0VQVE9SLCB2ZXJzaW9uLCBvYmplY3ROYW1lLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIGNvbmZpZ3VyYXRpb24sIHBvbGljaWVzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBEYXRhT2JqZWN0U2NoZW1hIHdoaWNoIGluIGVmZmVjdCBpcyB0aGUgTWVzc2FnZURhdGFPYmplY3RTY2hlbWFcclxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBlaXRoZXIgY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWEgb3IgY3JlYXRlSHlwZXJ0eURhdGFPYmplY3RTY2hlbWEgaW5zdGVhZFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGd1aWQgLSBDYXRhbG9ndWUgR2xvYmFsIFVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBDYXRhbG9ndWUgT2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiBDYXRhbG9ndWUgRGF0YVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdE5hbWUgLSBIdW1hbi11bmRlcnN0YW5kYWJsZSBuYW1lIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cclxuICAgICAqIEBwYXJhbSB7RGF0YU9iamVjdFNvdXJjZUxhbmd1YWdlfSBsYW5ndWFnZSAtIFByb2dyYW1taW5nIGxhbmd1YWdlIHVzZWQgaW4gdGhlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYWNrYWdlVVJMIC0gVVJMIGZyb20gd2hlcmUgdGhlIHNvdXJjZSBjb2RlIHBhY2thZ2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2F0YWxvZ3VlIG9iamVjdCBjYW4gYmUgZG93bmxvYWRlZC5cclxuICAgICAqIEByZXR1cm5zIHtEYXRhT2JqZWN0U2NoZW1hfVxyXG4gICAgICovXHJcbiAgICBjcmVhdGVEYXRhT2JqZWN0U2NoZW1hKGd1aWQsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLCBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mIGd1aWQgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHZlcnNpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIG9iamVjdE5hbWUgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGRlc2NyaXB0aW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBsYW5ndWFnZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlUGFja2FnZVVSTCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRhT2JqZWN0U2NoZW1hKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWV9EQVRBX09CSkVDVCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLFxyXG4gICAgICAgICAgICBzb3VyY2VQYWNrYWdlVVJMKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBEYXRhT2JqZWN0U2NoZW1hIHdoaWNoIGluIGVmZmVjdCBpcyB0aGUgTWVzc2FnZURhdGFPYmplY3RTY2hlbWFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBndWlkIC0gQ2F0YWxvZ3VlIEdsb2JhbCBVbmlxdWUgaWRlbnRpZmllciBvZiB0aGUgQ2F0YWxvZ3VlIE9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBJbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgQ2F0YWxvZ3VlIERhdGFcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvYmplY3ROYW1lIC0gSHVtYW4tdW5kZXJzdGFuZGFibGUgbmFtZSBvZiB0aGUgY2F0YWxvZ3VlIG9iamVjdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXHJcbiAgICAgKiBAcGFyYW0ge0RhdGFPYmplY3RTb3VyY2VMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBQcm9ncmFtbWluZyBsYW5ndWFnZSB1c2VkIGluIHRoZSBTb3VyY2VQYWNrYWdlXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGFja2FnZVVSTCAtIFVSTCBmcm9tIHdoZXJlIHRoZSBzb3VyY2UgY29kZSBwYWNrYWdlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhdGFsb2d1ZSBvYmplY3QgY2FuIGJlIGRvd25sb2FkZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7RGF0YU9iamVjdFNjaGVtYX1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWEoZ3VpZCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgZ3VpZCA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgdmVyc2lvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygb2JqZWN0TmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgZGVzY3JpcHRpb24gPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIGxhbmd1YWdlID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBzb3VyY2VQYWNrYWdlVVJMID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgKVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHBhcmFtZXRlcnMhXCIpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3IERhdGFPYmplY3RTY2hlbWEoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0RBVEFfT0JKRUNULCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsXHJcbiAgICAgICAgICAgIHNvdXJjZVBhY2thZ2VVUkwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlEYXRhT2JqZWN0U2NoZW1hXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3VpZCAtIENhdGFsb2d1ZSBHbG9iYWwgVW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIENhdGFsb2d1ZSBPYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIC0gSW5kaWNhdGVzIHRoZSB2ZXJzaW9uIG9mIENhdGFsb2d1ZSBEYXRhXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TmFtZSAtIEh1bWFuLXVuZGVyc3RhbmRhYmxlIG5hbWUgb2YgdGhlIGNhdGFsb2d1ZSBvYmplY3RcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxyXG4gICAgICogQHBhcmFtIHtEYXRhT2JqZWN0U291cmNlTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gUHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdXNlZCBpbiB0aGUgU291cmNlUGFja2FnZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVBhY2thZ2VVUkwgLSBVUkwgZnJvbSB3aGVyZSB0aGUgc291cmNlIGNvZGUgcGFja2FnZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjYXRhbG9ndWUgb2JqZWN0IGNhbiBiZSBkb3dubG9hZGVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFjY2Vzc0NvbnRyb2xQb2xpY3kgLSBwb2xpY3kgcnVsZSB0byBhY2Nlc3Mgb2JqZWN0IChzZWUgUmVwb3J0ZXItT2JzZXJ2ZXIgQ29tbSBwYXR0ZXJuKVxyXG4gICAgICogQHBhcmFtIHtEYXRhVXJsU2NoZW1lfSBzY2hlbWUgLSBpZGVudGlmaWVzIHRoZSBkYXRhIHNjaGVtZSAoQ09NTSwgQ09OTkVDVElPTiwgQ1RYVCBvciBJREVOVElUWSlcclxuICAgICAqIEByZXR1cm5zIHtEYXRhT2JqZWN0U2NoZW1hfVxyXG4gICAgICovXHJcbiAgICBjcmVhdGVIeXBlcnR5RGF0YU9iamVjdFNjaGVtYShndWlkLCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbiwgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NDb250cm9sUG9saWN5LCBzY2hlbWUpIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHR5cGVvZiBndWlkID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiB2ZXJzaW9uID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBvYmplY3ROYW1lID09PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgIHx8IHR5cGVvZiBkZXNjcmlwdGlvbiA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgbGFuZ3VhZ2UgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHNvdXJjZVBhY2thZ2VVUkwgPT09IFwidW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgfHwgdHlwZW9mIHNjaGVtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2YgYWNjZXNzQ29udHJvbFBvbGljeSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgaWYgKHNjaGVtZSA9PT0gRGF0YVVybFNjaGVtZS5DT01NKVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENvbW11bmljYXRpb25EYXRhT2JqZWN0U2NoZW1hKGd1aWQsIENhdGFsb2d1ZU9iamVjdFR5cGUuSFlQRVJUWV9EQVRBX09CSkVDVCwgdmVyc2lvbiwgb2JqZWN0TmFtZSwgZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICBsYW5ndWFnZSwgc291cmNlUGFja2FnZVVSTCwgc2NoZW1lLCBhY2Nlc3NDb250cm9sUG9saWN5KTtcclxuICAgICAgICBlbHNlIGlmIChzY2hlbWUgPT09IERhdGFVcmxTY2hlbWUuQ09OTkVDVElPTilcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uRGF0YU9iamVjdFNjaGVtYShndWlkLCBDYXRhbG9ndWVPYmplY3RUeXBlLkhZUEVSVFlfREFUQV9PQkpFQ1QsIHZlcnNpb24sIG9iamVjdE5hbWUsIGRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2UsIHNvdXJjZVBhY2thZ2VVUkwsIHNjaGVtZSwgYWNjZXNzQ29udHJvbFBvbGljeSk7XHJcbiAgICAgICAgZWxzZSBpZiAoc2NoZW1lID09PSBEYXRhVXJsU2NoZW1lLkNUWFQpXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGV4dERhdGFPYmplY3RTY2hlbWEoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0RBVEFfT0JKRUNULCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBzY2hlbWUsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgICAgIGVsc2UgaWYgKHNjaGVtZSA9PT0gRGF0YVVybFNjaGVtZS5JREVOVElUWSlcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJZGVudGl0eURhdGFPYmplY3RTY2hlbWEoZ3VpZCwgQ2F0YWxvZ3VlT2JqZWN0VHlwZS5IWVBFUlRZX0RBVEFfT0JKRUNULCB2ZXJzaW9uLCBvYmplY3ROYW1lLCBkZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgIGxhbmd1YWdlLCBzb3VyY2VQYWNrYWdlVVJMLCBzY2hlbWUsIGFjY2Vzc0NvbnRyb2xQb2xpY3kpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIFNvdXJjZVBhY2thZ2VcclxuICAgICAqIEBwYXJhbSBzb3VyY2VDb2RlQ2xhc3NuYW1lIC0gVGhlIENsYXNzLW5hbWUgb2YgdGhlIFNvdXJjZUNvZGVcclxuICAgICAqIEBwYXJhbSBzb3VyY2VDb2RlIC0gVGhlIHNvdXJjZSBjb2RlIG9mIHRoZSBjYXRhbG9ndWUgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7U291cmNlUGFja2FnZX1cclxuICAgICAqL1xyXG4gICAgY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VDb2RlQ2xhc3NuYW1lLCBzb3VyY2VDb2RlKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2Ygc291cmNlQ29kZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICB8fCB0eXBlb2Ygc291cmNlQ29kZUNsYXNzbmFtZSA9PT0gXCJ1bmRlZmluZWRcIlxyXG4gICAgICAgIClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYXJhbWV0ZXJzIVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VQYWNrYWdlKHNvdXJjZUNvZGVDbGFzc25hbWUsIHNvdXJjZUNvZGUpO1xyXG5cclxuICAgIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBDYXRhbG9ndWVEYXRhT2JqZWN0RmFjdG9yeTtcclxuIiwiLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignUnVudGltZUNhdGFsb2d1ZScpO1xyXG5cclxuaW1wb3J0IENhdGFsb2d1ZUZhY3RvcnkgZnJvbSAnLi9DYXRhbG9ndWVEYXRhT2JqZWN0RmFjdG9yeSc7XHJcblxyXG5jbGFzcyBSdW50aW1lQ2F0YWxvZ3VlIHtcclxuXHJcbiAgY29uc3RydWN0b3IocnVudGltZUZhY3RvcnksIG5hbWUsIHNjaGVtYSkge1xyXG4gICAgaWYgKCFydW50aW1lRmFjdG9yeSkgdGhyb3cgRXJyb3IoJ1RoZSBjYXRhbG9ndWUgbmVlZHMgdGhlIHJ1bnRpbWVGYWN0b3J5Jyk7XHJcblxyXG4gICAgdGhpcy5fZmFjdG9yeSA9IG5ldyBDYXRhbG9ndWVGYWN0b3J5KCk7XHJcbiAgICB0aGlzLmh0dHBSZXF1ZXN0ID0gcnVudGltZUZhY3RvcnkuY3JlYXRlSHR0cFJlcXVlc3QoKTtcclxuICAgIHRoaXMuYXRvYiA9IHJ1bnRpbWVGYWN0b3J5LmF0b2IgPyBydW50aW1lRmFjdG9yeS5hdG9iIDogYXRvYjtcclxuXHJcbiAgICBjb25zdCBzdG9yYWdlTmFtZSA9IG5hbWUgPyBuYW1lIDogJ3J1bnRpbWVDYXRhbG9ndWUnO1xyXG4gICAgY29uc3Qgc3RvcmFnZVNjaGVtYSA9IHNjaGVtYSA/IHNjaGVtYSA6ICcmY2d1aWQsIGFjY2Vzc0NvbnRyb2xQb2xpY3ksIGNvbnN0cmFpbnRzLCBkYXRhT2JqZWN0cywgaHlwZXJ0eVR5cGUsIG9iamVjdE5hbWUsIHNvdXJjZVBhY2thZ2UsIHZlcnNpb24nO1xyXG5cclxuICAgIGNvbnN0IHNjaGVtYXMgPSB7fTtcclxuICAgIHNjaGVtYXNbc3RvcmFnZU5hbWVdID0gc3RvcmFnZVNjaGVtYTtcclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyID0gcnVudGltZUZhY3Rvcnkuc3RvcmFnZU1hbmFnZXIoc3RvcmFnZU5hbWUsIHNjaGVtYXMpO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IGEgQ2F0YWxvZ3VlIERhdGEgT2JqZWN0IChEZXNjcmlwdG9yKSBmcm9tIGEgVVJMLCBhbmQgY29uc3RydWN0IGl0IHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRlc2NyaXB0b3JVUkwgLSBlLmcuIG15ZG9tYWluLmNvbS8ud2VsbC1rbm93bi9oeXBlcnR5L015SHlwZXJ0eVxyXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gY3JlYXRlRnVuYyAtIGUuZy4gY3JlYXRlSHlwZXJ0eVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZ2V0RnVsbF0gLSB3aGV0aGVyIG9yIG5vdCB0byBnZXQgZGVzY3JpcHRvciB3aXRoIHNvdXJjZVBhY2thZ2UsIG9yIG9ubHkgdGhlIGRlc2NyaXB0b3IgcGFydFxyXG4gICAgICogQHBhcmFtIHtKU09OfSBjb25zdHJhaW50cyAtIGNvbnN0cmFpbnRzIG9iamVjdFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IC0gUHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpdGggdGhlIHJlcXVlc3RlZCBkZXNjcmlwdG9yIGluIHRoZSBhcHByb3ByaWF0ZSB0eXBlLlxyXG4gICAgICogSWYgY29uc3RyYWludHMgd2VyZSBwcm92aWRlZCwgYSBkZXNjcmlwdG9yIGlzIG9ubHkgcmV0dXJuZWQgaWYgaXQgbWVldHMgdGhlIGNvbnN0cmFpbnRzLCBvdGhlcndpc2UgdGhlIHByb21pc2Ugd2lsbCBiZSByZWplY3RlZC5cclxuICAgICAqL1xyXG4gIGdldERlc2NyaXB0b3IoZGVzY3JpcHRvclVSTCwgY3JlYXRlRnVuYywgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICBsb2cuaW5mbygnW1J1bnRpbWVDYXRhbG9ndWVdIC0gZ2V0dGluZyBkZXNjcmlwdG9yIGZyb206ICcsIGRlc2NyaXB0b3JVUkwsICcgd2l0aCBjb25zdHJhaW50czogJywgY29uc3RyYWludHMpO1xyXG5cclxuICAgIC8vIHNvbWUgZmxhZ3MgZm9yIG9wdGltaXphdGlvblxyXG4gICAgLy8gKGxhdGVyIHRoZSBkZXNjcmlwdG9yIHdpbGwgbm90IGJlIHNhdmVkIGluIGNhc2UgYm90aCBvZiB0aGVzZSBib29sZWFucyBhcmUgdHJ1ZSlcclxuICAgIGxldCBpc1NhdmVkRGVzY3JpcHRvciA9IGZhbHNlO1xyXG4gICAgbGV0IGlzQ29tcGxldGVEZXNjcmlwdG9yID0gZmFsc2U7XHJcblxyXG4gICAgLy8gZ2V0IHJhdyBkZXNjcmlwdG9yXHJcbiAgICAvLyBmaXJzdCBjaGVja3MgaWYgZGVzY3JpcHRvciBpcyBhbHJlYWR5IGluIGxvY2FsU3RvcmFnZSAoYmFzZWQgb24gY2d1aWQgYW5kIHZlcnNpb24pXHJcbiAgICBsZXQgZGVzY3JpcHRvclByb21pc2U7XHJcbiAgICBpZiAoY29uc3RyYWludHMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGRlc2NyaXB0b3JQcm9taXNlID0gUHJvbWlzZS5hbGwoW3RoaXMuaHR0cFJlcXVlc3QucG9zdChkZXNjcmlwdG9yVVJMICsgJy92ZXJzaW9uJywge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pLCB0aGlzLmh0dHBSZXF1ZXN0LnBvc3QoZGVzY3JpcHRvclVSTCArICcvY2d1aWQnLCB7Ym9keTogSlNPTi5zdHJpbmdpZnkoY29uc3RyYWludHMpfSldKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZGVzY3JpcHRvclByb21pc2UgPSBQcm9taXNlLmFsbChbdGhpcy5odHRwUmVxdWVzdC5nZXQoZGVzY3JpcHRvclVSTCArICcvdmVyc2lvbicpLCB0aGlzLmh0dHBSZXF1ZXN0LmdldChkZXNjcmlwdG9yVVJMICsgJy9jZ3VpZCcpXSlcclxuICAgIH1cclxuICAgIGRlc2NyaXB0b3JQcm9taXNlID0gZGVzY3JpcHRvclByb21pc2UudGhlbigoW3ZlcnNpb24sIGNndWlkXSkgPT4ge1xyXG4gICAgICBsb2cubG9nKCdbUnVudGltZUNhdGFsb2d1ZS5nZXREZXNjcmlwdG9yXSAtIGdvdCB2ZXJzaW9uICgnICsgdmVyc2lvbiArICcpIGFuZCBjZ3VpZCAoJyArIGNndWlkICsgJykgZm9yIGRlc2NyaXB0b3IgJyArIGRlc2NyaXB0b3JVUkwpO1xyXG5cclxuICAgICAgLy8gY2hlY2sgaWYgc2FtZSB2ZXJzaW9uIGlzIGNvbnRhaW5lZCBpbiBsb2NhbFN0b3JhZ2VcclxuICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0VmVyc2lvbignY2d1aWQnLCBjZ3VpZCkudGhlbigoZGJWZXJzaW9uKSA9PiB7XHJcbiAgICAgICAgaWYgKGRiVmVyc2lvbiA+PSB2ZXJzaW9uKSB7XHJcbiAgICAgICAgICBsb2cubG9nKCdbUnVudGltZUNhdGFsb2d1ZS5nZXREZXNjcmlwdG9yXSBsb2NhbCB2ZXJzaW9uIGlzIHVwZGF0ZWQgZm9yICcsIGRlc2NyaXB0b3JVUkwpO1xyXG4gICAgICAgICAgaXNTYXZlZERlc2NyaXB0b3IgPSB0cnVlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZ2V0KCdjZ3VpZCcsIGNndWlkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbG9nLmxvZygnW1J1bnRpbWVDYXRhbG9ndWUuZ2V0RGVzY3JpcHRvcl0gbG9jYWwgdmVyc2lvbiBub3QgdXBkYXRlZCBmb3IgJywgZGVzY3JpcHRvclVSTCwgJyByZXRyaWV2aW5nIGZyb20gcmVtb3RlIGNhdGFsb2d1ZSAuLi4nKTtcclxuXHJcbiAgICAgICAgICAvLyBubyBzYXZlZCBjb3B5LCBwcm9jZWVkIHdpdGggcmV0cmlldmluZyBkZXNjcmlwdG9yXHJcbiAgICAgICAgICBsZXQgcmV0cmlldmVQcm9taXNlID0gY29uc3RyYWludHMgIT0gdW5kZWZpbmVkID8gdGhpcy5odHRwUmVxdWVzdC5wb3N0KGRlc2NyaXB0b3JVUkwsIHtib2R5OiBKU09OLnN0cmluZ2lmeShjb25zdHJhaW50cyl9KSA6IHRoaXMuaHR0cFJlcXVlc3QuZ2V0KGRlc2NyaXB0b3JVUkwpO1xyXG4gICAgICAgICAgcmV0dXJuIHJldHJpZXZlUHJvbWlzZS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBKU09OLnBhcnNlKGRlc2NyaXB0b3IpO1xyXG5cclxuICAgICAgICAgICAgLy9sb2cubG9nKFwiZ290IGRlc2NyaXB0b3I6XCIsIEpTT04uc3RyaW5naWZ5KGRlc2NyaXB0b3IsIG51bGwsIDIpKTtcclxuICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JbJ0VSUk9SJ10pIHtcclxuICAgICAgICAgICAgICAvLyBUT0RPIGhhbmRsZSBlcnJvciBwcm9wZXJseVxyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkZXNjcmlwdG9yKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgIGxldCBlcnJvclN0cmluZyA9ICdVbmFibGUgdG8gZ2V0IGRlc2NyaXB0b3IgZm9yICcgKyBkZXNjcmlwdG9yVVJMICsgKGNvbnN0cmFpbnRzICE9IHVuZGVmaW5lZCA/ICcgd2l0aCBjb25zdHJhaW50cyAnICsgY29uc3RyYWludHMgOiAnJykgKyAnOiAnICsgZXJyb3I7XHJcbiAgICAgIGxvZy5lcnJvcihlcnJvclN0cmluZyk7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvclN0cmluZyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgcmV0dXJuUHJvbWlzZSA9IGRlc2NyaXB0b3JQcm9taXNlO1xyXG5cclxuICAgIC8vIGlmIGdldEZ1bGwsIGF0dGFjaCBzb3VyY2VQYWNrYWdlXHJcbiAgICBpZiAoZ2V0RnVsbCkge1xyXG4gICAgICBsb2cubG9nKCdhZGRpbmcgcHJvbWlzZSB0byBhdHRhY2ggc291cmNlUGFja2FnZScpO1xyXG4gICAgICByZXR1cm5Qcm9taXNlID0gZGVzY3JpcHRvclByb21pc2UudGhlbigoZGVzY3JpcHRvcikgPT4ge1xyXG4gICAgICAgIGlmIChkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2UpIHtcclxuICAgICAgICAgIGlzQ29tcGxldGVEZXNjcmlwdG9yID0gdHJ1ZTtcclxuICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpc0NvbXBsZXRlRGVzY3JpcHRvciA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoUmF3U291cmNlUGFja2FnZShkZXNjcmlwdG9yKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmluYWxseSBjcmVhdGUgb2JqZWN0XHJcbiAgICByZXR1cm5Qcm9taXNlID0gcmV0dXJuUHJvbWlzZS50aGVuKChkZXNjcmlwdG9yKSA9PiB7XHJcbiAgICAgIC8vIHN0b3JlIGlmIG5vdCBzYXZlZCBiZWZvcmUsIG9yIGlmIGZ1bGwgZGVzY3JpcHRvciB3YXMgcmVxdWVzdGVkIGFuZCBvbmx5IHBhcnRpYWwgZGVzY3JpcHRvciB3YXMgc3RvcmVkLlxyXG4gICAgICBpZiAoIWlzU2F2ZWREZXNjcmlwdG9yIHx8IChpc1NhdmVkRGVzY3JpcHRvciAmJiAhaXNDb21wbGV0ZURlc2NyaXB0b3IgJiYgZ2V0RnVsbCkpIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLnNldChkZXNjcmlwdG9yLmNndWlkLCBkZXNjcmlwdG9yLnZlcnNpb24sIGRlc2NyaXB0b3IpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjcmVhdGVGdW5jLmFwcGx5KHRoaXMsIFtkZXNjcmlwdG9yLCBjb25zdHJhaW50c10pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJldHVyblByb21pc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICAqIFVzZXMgdGhlIHNvdXJjZVBhY2thZ2VVUkwgZnJvbSB0aGUgZGVzY3JpcHRvciwgcmVxdWVzdHMgdGhlIHNvdXJjZVBhY2thZ2UgYW5kIGF0dGFjaGVzIGl0IHRvIHRoZSBkZXNjcmlwdG9yLlxyXG4gICAgICogQHBhcmFtIHtDYXRhbG9ndWVEYXRhT2JqZWN0fSBkZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gLSBmdWxmaWxscyB3aXRoIGNvbXBsZXRlIGRlc2NyaXB0b3JcclxuICAgICAqL1xyXG4gIGF0dGFjaFJhd1NvdXJjZVBhY2thZ2UoZGVzY3JpcHRvciwgY29uc3RyYWludHMpIHtcclxuICAgIGxvZy5sb2coJ2F0dGFjaGluZyByYXcgc291cmNlUGFja2FnZSBmcm9tOicsIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCk7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZXQgcmV0cmlldmVQcm9taXNlID0gY29uc3RyYWludHMgIT0gdW5kZWZpbmVkID8gdGhpcy5odHRwUmVxdWVzdC5wb3N0KGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCwge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pIDogdGhpcy5odHRwUmVxdWVzdC5nZXQoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMKTtcclxuICAgICAgcmV0cmlldmVQcm9taXNlLnRoZW4oKHNvdXJjZVBhY2thZ2UpID0+IHtcclxuICAgICAgICBzb3VyY2VQYWNrYWdlID0gSlNPTi5wYXJzZShzb3VyY2VQYWNrYWdlKTtcclxuXHJcbiAgICAgICAgLy9kZWxldGUgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMO1xyXG4gICAgICAgIC8vbG9nLmxvZyhcImF0dGFjaGluZyBzb3VyY2VQYWNrYWdlOlwiLCBzb3VyY2VQYWNrYWdlKTtcclxuICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2UgPSBzb3VyY2VQYWNrYWdlO1xyXG4gICAgICAgIHJlc29sdmUoZGVzY3JpcHRvcik7XHJcbiAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICByZWplY3QocmVhc29uKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IEh5cGVydHlEZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0gaHlwZXJ0eVVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL2h5cGVydHkvTXlIeXBlcnR5XHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZXRGdWxsXSAtIGJvb2xlYW4gdG8gZGVjaWRlIHRvIGdldCB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZSBzb3VyY2VQYWNrYWdlIG9yIChwb3RlbnRpYWxseSkgd2l0aG91dFxyXG4gICAgICogQHBhcmFtIHtKU09OfSBjb25zdHJhaW50cyAtIGNvbnN0cmFpbnRzIG9iamVjdFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XHJcbiAgICAgKi9cclxuICBnZXRIeXBlcnR5RGVzY3JpcHRvcihoeXBlcnR5VVJMLCBnZXRGdWxsID0gdHJ1ZSwgY29uc3RyYWludHMpIHtcclxuICAgIHJldHVybiB0aGlzLmdldERlc2NyaXB0b3IoaHlwZXJ0eVVSTCwgdGhpcy5jcmVhdGVIeXBlcnR5LCBnZXRGdWxsLCBjb25zdHJhaW50cylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IFN0dWJEZXNjcmlwdG9yXHJcbiAgICAgKiBAcGFyYW0gc3R1YlVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL3Byb3Rvc3R1Yi9NeVByb3Rvc3R1YlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZ2V0RnVsbF0gLSBib29sZWFuIHRvIGRlY2lkZSB0byBnZXQgdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGUgc291cmNlUGFja2FnZSBvciAocG90ZW50aWFsbHkpIHdpdGhvdXRcclxuICAgICAqIEBwYXJhbSB7SlNPTn0gY29uc3RyYWludHMgLSBjb25zdHJhaW50cyBvYmplY3RcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG4gICAgICovXHJcbiAgZ2V0U3R1YkRlc2NyaXB0b3Ioc3R1YlVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKHN0dWJVUkwsIHRoaXMuY3JlYXRlU3R1YiwgZ2V0RnVsbCwgY29uc3RyYWludHMpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICAqIEdldCBSdW50aW1lRGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIHJ1bnRpbWVVUkwgLSBlLmcuIG15ZG9tYWluLmNvbS8ud2VsbC1rbm93bi9ydW50aW1lL015UnVudGltZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZ2V0RnVsbF0gLSBib29sZWFuIHRvIGRlY2lkZSB0byBnZXQgdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGUgc291cmNlUGFja2FnZSBvciAocG90ZW50aWFsbHkpIHdpdGhvdXRcclxuICAgICAqIEBwYXJhbSB7SlNPTn0gY29uc3RyYWludHMgLSBjb25zdHJhaW50cyBvYmplY3RcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG4gICAgICovXHJcbiAgZ2V0UnVudGltZURlc2NyaXB0b3IocnVudGltZVVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKHJ1bnRpbWVVUkwsIHRoaXMuY3JlYXRlUnVudGltZURlc2NyaXB0b3IsIGdldEZ1bGwsIGNvbnN0cmFpbnRzKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAgKiBHZXQgRGF0YVNjaGVtYURlc2NyaXB0b3JcclxuICAgICAqIEBwYXJhbSBkYXRhU2NoZW1hVVJMIC0gZS5nLiBteWRvbWFpbi5jb20vLndlbGwta25vd24vZGF0YXNjaGVtYS9NeURhdGFTY2hlbWFcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dldEZ1bGxdIC0gYm9vbGVhbiB0byBkZWNpZGUgdG8gZ2V0IHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIHNvdXJjZVBhY2thZ2Ugb3IgKHBvdGVudGlhbGx5KSB3aXRob3V0XHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cclxuICAgICAqL1xyXG4gIGdldERhdGFTY2hlbWFEZXNjcmlwdG9yKGRhdGFTY2hlbWFVUkwsIGdldEZ1bGwgPSB0cnVlLCBjb25zdHJhaW50cykge1xyXG5cclxuICAgIC8vICAgIHJldHVybiB0aGlzLmdldERlc2NyaXB0b3IoZGF0YVNjaGVtYVVSTCwgdGhpcy5jcmVhdGVEYXRhU2NoZW1hLCBnZXRGdWxsLCBjb25zdHJhaW50cylcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk9PiB7XHJcbiAgICAgIGxldCBzY2hlbWEgPSBkYXRhU2NoZW1hVVJMLnNwbGl0KCcvZGF0YXNjaGVtYS8nKVsxXTtcclxuICAgICAgbG9nLmxvZygnW1J1bnRpbWVDYXRhbG9ndWUuZ2V0RGF0YVNjaGVtYURlc2NyaXB0b3JdIHNjaGVtYSAnLCBzY2hlbWEpO1xyXG4gICAgICBsZXQgZGVzY3JpcHRvciA9IHtcclxuICAgICAgICBzb3VyY2VQYWNrYWdlOiB7XHJcbiAgICAgICAgICBzb3VyY2VDb2RlOiB7XHJcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAvLyAgICAgIGxldCBzY2hlbWUgPSBwcm9wZXJ0aWVzLnNjaGVtZSA/IHByb3BlcnRpZXMuc2NoZW1lLmNvIDogW107XHJcbiAgXHJcbiAgICAgIHN3aXRjaCAoc2NoZW1hKSB7XHJcbiAgICAgICAgY2FzZSAnQ29udGV4dCc6XHJcbiAgICAgICAgY2FzZSAnQ29udGV4dFJlcG9ydGVyJzpcclxuICAgICAgICBjYXNlICdDb250ZXh0T2JzZXJ2ZXInOlxyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5zY2hlbWUgPSAnY29udGV4dCc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdDb25uZWN0aW9uJzpcclxuICAgICAgICAgIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlLnByb3BlcnRpZXMuc2NoZW1lID0gJ2Nvbm5lY3Rpb24nO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAnV2FsbGV0RGF0YSc6XHJcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLnNjaGVtZSA9ICd3YWxsZXREYXRhJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ0NvbW11bmljYXRpb24nOlxyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5zY2hlbWUgPSAnY29tbSc7XHJcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLmNoaWxkcmVucyA9IFsncmVzb3VyY2VzJ107XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdIZWxsb1dvcmxkRGF0YVNjaGVtYSc6XHJcbiAgICAgICAgICBkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZS5wcm9wZXJ0aWVzLnNjaGVtZSA9ICdoZWxsbyc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5zY2hlbWUgPSAncmVzb3VyY2UnO1xyXG4gICAgICAgICAgZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUucHJvcGVydGllcy5jaGlsZHJlbnMgPSBbXTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc29sdmUoZGVzY3JpcHRvcik7XHJcblxyXG4gICAgfSk7XHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogR2V0IElEUFByb3h5RGVzY3JpcHRvclxyXG4gICAgICogQHBhcmFtIGlkcFByb3h5VVJMIC0gZS5nLiBteWRvbWFpbi5jb20vLndlbGwta25vd24vaWRwLXByb3h5L015UHJveHlcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dldEZ1bGxdIC0gYm9vbGVhbiB0byBkZWNpZGUgdG8gZ2V0IHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIHNvdXJjZVBhY2thZ2Ugb3IgKHBvdGVudGlhbGx5KSB3aXRob3V0XHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cclxuICAgICAqL1xyXG4gIGdldElkcFByb3h5RGVzY3JpcHRvcihpZHBQcm94eVVSTCwgZ2V0RnVsbCA9IHRydWUsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXREZXNjcmlwdG9yKGlkcFByb3h5VVJMLCB0aGlzLmNyZWF0ZUlkcFByb3h5LCBnZXRGdWxsLCBjb25zdHJhaW50cylcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlEZXNjcmlwdG9yIGJhc2VkIG9uIHJhdyBvYmplY3QgdGhhdCBjb250YWlucyBpdHMgYXR0cmlidXRlc1xyXG4gICAgICogQHBhcmFtIHtKU09OfSByYXdIeXBlcnR5XHJcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eURlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICBjcmVhdGVIeXBlcnR5KHJhd0h5cGVydHkpIHtcclxuICAgIC8vbG9nLmxvZyhcImNyZWF0ZUh5cGVydHk6XCIsIHJhd0h5cGVydHkpO1xyXG4gICAgLy8gY3JlYXRlIHRoZSBkZXNjcmlwdG9yXHJcbiAgICBsZXQgaHlwZXJ0eSA9IHRoaXMuX2ZhY3RvcnkuY3JlYXRlSHlwZXJ0eURlc2NyaXB0b3JPYmplY3QoXHJcbiAgICAgIHJhd0h5cGVydHlbJ2NndWlkJ10sXHJcbiAgICAgIHJhd0h5cGVydHlbJ3ZlcnNpb24nXSxcclxuICAgICAgcmF3SHlwZXJ0eVsnb2JqZWN0TmFtZSddLFxyXG4gICAgICByYXdIeXBlcnR5WydkZXNjcmlwdGlvbiddLFxyXG4gICAgICByYXdIeXBlcnR5WydsYW5ndWFnZSddLFxyXG4gICAgICByYXdIeXBlcnR5Wydzb3VyY2VQYWNrYWdlVVJMJ10sXHJcbiAgICAgIHJhd0h5cGVydHlbJ3R5cGUnXSB8fCByYXdIeXBlcnR5WydoeXBlcnR5VHlwZSddLFxyXG4gICAgICByYXdIeXBlcnR5WydkYXRhT2JqZWN0cyddXHJcbiAgICApO1xyXG5cclxuICAgIC8vbG9nLmxvZyhcImZhY3RvcnkgcmV0dXJuZWQ6XCIsIGh5cGVydHkpO1xyXG5cclxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xyXG4gICAgaHlwZXJ0eS5jb25maWd1cmF0aW9uID0gcmF3SHlwZXJ0eVsnY29uZmlndXJhdGlvbiddO1xyXG4gICAgaHlwZXJ0eS5jb25zdHJhaW50cyA9IHJhd0h5cGVydHlbJ2NvbnN0cmFpbnRzJ107XHJcbiAgICBoeXBlcnR5Lm1lc3NhZ2VTY2hlbWEgPSByYXdIeXBlcnR5WydtZXNzYWdlU2NoZW1hJ107XHJcbiAgICBoeXBlcnR5LnBvbGljaWVzID0gcmF3SHlwZXJ0eVsncG9saWNpZXMnXTtcclxuICAgIGh5cGVydHkuc2lnbmF0dXJlID0gcmF3SHlwZXJ0eVsnc2lnbmF0dXJlJ107XHJcblxyXG4gICAgLy8gcGFyc2UgYW5kIGF0dGFjaCBzb3VyY2VQYWNrYWdlXHJcbiAgICBsZXQgc291cmNlUGFja2FnZSA9IHJhd0h5cGVydHlbJ3NvdXJjZVBhY2thZ2UnXTtcclxuICAgIGlmIChzb3VyY2VQYWNrYWdlKSB7XHJcbiAgICAgIGh5cGVydHkuc291cmNlUGFja2FnZSA9IHRoaXMuY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VQYWNrYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaHlwZXJ0eTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIFByb3RvY29sU3R1YkRlc2NyaXB0b3IgYmFzZWQgb24gcmF3IG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0cyBhdHRyaWJ1dGVzXHJcbiAgICAgKiBAcGFyYW0gcmF3U3R1YlxyXG4gICAgICogQHJldHVybnMge1Byb3RvY29sU3R1YkRlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICBjcmVhdGVTdHViKHJhd1N0dWIpIHtcclxuICAgIC8vIGxvZy5sb2coXCJjcmVhdGluZyBzdHViIGRlc2NyaXB0b3IgYmFzZWQgb246IFwiLCByYXdTdHViKTtcclxuXHJcbiAgICAvLyBjcmVhdGUgdGhlIGRlc2NyaXB0b3JcclxuICAgIGxldCBzdHViID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVQcm90b1N0dWJEZXNjcmlwdG9yT2JqZWN0KFxyXG4gICAgICByYXdTdHViWydjZ3VpZCddLFxyXG4gICAgICByYXdTdHViWyd2ZXJzaW9uJ10sXHJcbiAgICAgIHJhd1N0dWJbJ29iamVjdE5hbWUnXSxcclxuICAgICAgcmF3U3R1YlsnZGVzY3JpcHRpb24nXSxcclxuICAgICAgcmF3U3R1YlsnbGFuZ3VhZ2UnXSxcclxuICAgICAgcmF3U3R1Ylsnc291cmNlUGFja2FnZVVSTCddLFxyXG4gICAgICByYXdTdHViWydtZXNzYWdlU2NoZW1hcyddLFxyXG4gICAgICByYXdTdHViWydjb25maWd1cmF0aW9uJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2NvbnN0cmFpbnRzJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2h5cGVydHlUeXBlJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2RhdGFPYmplY3RzJ10sXHJcbiAgICAgIHJhd1N0dWJbJ2ludGVyd29ya2luZyddLFxyXG4gICAgICByYXdTdHViWydpZHBQcm94eSddLFxyXG4gICAgICByYXdTdHViWydtdXR1YWxBdXRoZW50aWNhdGlvbiddXHJcbiAgICApO1xyXG5cclxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xyXG4gICAgc3R1Yi5zaWduYXR1cmUgPSByYXdTdHViWydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHRoZSBzb3VyY2VQYWNrYWdlXHJcbiAgICBsZXQgc291cmNlUGFja2FnZSA9IHJhd1N0dWJbJ3NvdXJjZVBhY2thZ2UnXTtcclxuICAgIGlmIChzb3VyY2VQYWNrYWdlKSB7XHJcbiAgICAgIHN0dWIuc291cmNlUGFja2FnZSA9IHRoaXMuY3JlYXRlU291cmNlUGFja2FnZShzb3VyY2VQYWNrYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3R1YjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIEh5cGVydHlSdW50aW1lRGVzY3JpcHRvciBiYXNlZCBvbiByYXcgb2JqZWN0IHRoYXQgY29udGFpbnMgaXRzIGF0dHJpYnV0ZXNcclxuICAgICAqIEBwYXJhbSByYXdSdW50aW1lXHJcbiAgICAgKiBAcmV0dXJucyB7SHlwZXJ0eVJ1bnRpbWVEZXNjcmlwdG9yfVxyXG4gICAgICovXHJcbiAgY3JlYXRlUnVudGltZURlc2NyaXB0b3IocmF3UnVudGltZSkge1xyXG4gICAgLy8gcGFyc2UgY2FwYWJpbGl0aWVzIGZpcnN0XHJcbiAgICB0cnkge1xyXG4gICAgICByYXdSdW50aW1lWydoeXBlcnR5Q2FwYWJpbGl0aWVzJ10gPSBKU09OLnBhcnNlKHJhd1J1bnRpbWVbJ2h5cGVydHlDYXBhYmlsaXRpZXMnXSk7XHJcbiAgICAgIHJhd1J1bnRpbWVbJ3Byb3RvY29sQ2FwYWJpbGl0aWVzJ10gPSBKU09OLnBhcnNlKHJhd1J1bnRpbWVbJ3Byb3RvY29sQ2FwYWJpbGl0aWVzJ10pO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyBhbHJlYWR5IGpzb24gb2JqZWN0XHJcbiAgICB9XHJcblxyXG4gICAgLy9sb2cubG9nKFwiY3JlYXRpbmcgcnVudGltZSBkZXNjcmlwdG9yIGJhc2VkIG9uOiBcIiwgcmF3UnVudGltZSk7XHJcblxyXG5cclxuICAgIC8vIGNyZWF0ZSB0aGUgZGVzY3JpcHRvclxyXG4gICAgbGV0IHJ1bnRpbWUgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZUh5cGVydHlSdW50aW1lRGVzY3JpcHRvck9iamVjdChcclxuICAgICAgcmF3UnVudGltZVsnY2d1aWQnXSxcclxuICAgICAgcmF3UnVudGltZVsndmVyc2lvbiddLFxyXG4gICAgICByYXdSdW50aW1lWydvYmplY3ROYW1lJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ2Rlc2NyaXB0aW9uJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ2xhbmd1YWdlJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ3NvdXJjZVBhY2thZ2VVUkwnXSxcclxuICAgICAgcmF3UnVudGltZVsndHlwZSddIHx8IHJhd1J1bnRpbWVbJ3J1bnRpbWVUeXBlJ10sXHJcbiAgICAgIHJhd1J1bnRpbWVbJ2h5cGVydHlDYXBhYmlsaXRpZXMnXSxcclxuICAgICAgcmF3UnVudGltZVsncHJvdG9jb2xDYXBhYmlsaXRpZXMnXSxcclxuICAgICAgcmF3UnVudGltZVsncDJwSGFuZGxlclN0dWInXSxcclxuICAgICAgcmF3UnVudGltZVsncDJwUmVxdWVzdGVyU3R1YiddXHJcbiAgICApO1xyXG5cclxuICAgIC8vIG9wdGlvbmFsIGZpZWxkc1xyXG4gICAgcnVudGltZS5zaWduYXR1cmUgPSByYXdSdW50aW1lWydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHNvdXJjZVBhY2thZ2VcclxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gcmF3UnVudGltZVsnc291cmNlUGFja2FnZSddO1xyXG4gICAgaWYgKHNvdXJjZVBhY2thZ2UpIHtcclxuICAgICAgLy8gbG9nLmxvZyhcInJ1bnRpbWUgaGFzIHNvdXJjZVBhY2thZ2U6XCIsIHNvdXJjZVBhY2thZ2UpO1xyXG4gICAgICBydW50aW1lLnNvdXJjZVBhY2thZ2UgPSB0aGlzLmNyZWF0ZVNvdXJjZVBhY2thZ2Uoc291cmNlUGFja2FnZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcnVudGltZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogQ3JlYXRlIERhdGFPYmplY3RTY2hlbWEgYmFzZWQgb24gcmF3IG9iamVjdCB0aGF0IGNvbnRhaW5zIGl0cyBhdHRyaWJ1dGVzXHJcbiAgICAgKiBAcGFyYW0gcmF3U2NoZW1hXHJcbiAgICAgKiBAcmV0dXJucyB7RGF0YU9iamVjdFNjaGVtYX1cclxuICAgICAqL1xyXG4gIGNyZWF0ZURhdGFTY2hlbWEocmF3U2NoZW1hKSB7XHJcbiAgICAvL2xvZy5sb2coXCJjcmVhdGluZyBkYXRhU2NoZW1hIGJhc2VkIG9uOiBcIiwgcmF3U2NoZW1hKTtcclxuXHJcbiAgICBsZXQgZGF0YVNjaGVtYTtcclxuXHJcbiAgICAvL2xvZy5sb2coJzEuIGNyZWF0ZU1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hOiAnLCByYXdTY2hlbWFbXCJhY2Nlc3NDb250cm9sUG9saWN5XCJdKTtcclxuICAgIC8vbG9nLmxvZygnMi4gY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWE6ICcsIHJhd1NjaGVtYVtcInNjaGVtZVwiXSk7XHJcbiAgICBpZiAocmF3U2NoZW1hWydhY2Nlc3NDb250cm9sUG9saWN5J10gJiYgcmF3U2NoZW1hWydzY2hlbWUnXSkge1xyXG4gICAgICBkYXRhU2NoZW1hID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVIeXBlcnR5RGF0YU9iamVjdFNjaGVtYShcclxuICAgICAgICByYXdTY2hlbWFbJ2NndWlkJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWyd2ZXJzaW9uJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWydvYmplY3ROYW1lJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWydkZXNjcmlwdGlvbiddLFxyXG4gICAgICAgIHJhd1NjaGVtYVsnbGFuZ3VhZ2UnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ3NvdXJjZVBhY2thZ2VVUkwnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ2FjY2Vzc0NvbnRyb2xQb2xpY3knXSxcclxuICAgICAgICByYXdTY2hlbWFbJ3NjaGVtZSddXHJcbiAgICAgIClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vbG9nLmxvZygnMy4gY3JlYXRlTWVzc2FnZURhdGFPYmplY3RTY2hlbWE6ICcsIHJhd1NjaGVtYSk7XHJcbiAgICAgIGRhdGFTY2hlbWEgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZU1lc3NhZ2VEYXRhT2JqZWN0U2NoZW1hKFxyXG4gICAgICAgIHJhd1NjaGVtYVsnY2d1aWQnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ3ZlcnNpb24nXSxcclxuICAgICAgICByYXdTY2hlbWFbJ29iamVjdE5hbWUnXSxcclxuICAgICAgICByYXdTY2hlbWFbJ2Rlc2NyaXB0aW9uJ10sXHJcbiAgICAgICAgcmF3U2NoZW1hWydsYW5ndWFnZSddLFxyXG4gICAgICAgIHJhd1NjaGVtYVsnc291cmNlUGFja2FnZVVSTCddXHJcbiAgICAgIClcclxuICAgIH1cclxuXHJcbiAgICAvLyBvcHRpb25hbCBmaWVsZHNcclxuICAgIGRhdGFTY2hlbWEuc2lnbmF0dXJlID0gcmF3U2NoZW1hWydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHNvdXJjZVBhY2thZ2VcclxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gcmF3U2NoZW1hWydzb3VyY2VQYWNrYWdlJ107XHJcbiAgICBpZiAoc291cmNlUGFja2FnZSkge1xyXG4gICAgICAvL2xvZy5sb2coXCJkYXRhU2NoZW1hIGhhcyBzb3VyY2VQYWNrYWdlOlwiLCBzb3VyY2VQYWNrYWdlKTtcclxuICAgICAgZGF0YVNjaGVtYS5zb3VyY2VQYWNrYWdlID0gdGhpcy5jcmVhdGVTb3VyY2VQYWNrYWdlKHNvdXJjZVBhY2thZ2UpO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBkYXRhU2NoZW1hLnNvdXJjZVBhY2thZ2Uuc291cmNlQ29kZSA9IEpTT04ucGFyc2UoZGF0YVNjaGVtYS5zb3VyY2VQYWNrYWdlLnNvdXJjZUNvZGUpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbG9nLmxvZygnRGF0YVNjaGVtYSBTb3VyY2UgY29kZSBpcyBhbHJlYWR5IHBhcnNlZCcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLy9sb2cubG9nKFwiY3JlYXRlZCBkYXRhU2NoZW1hIGRlc2NyaXB0b3Igb2JqZWN0OlwiLCBkYXRhU2NoZW1hKTtcclxuICAgIHJldHVybiBkYXRhU2NoZW1hO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAgKiBDcmVhdGUgUHJvdG9jb2xTdHViRGVzY3JpcHRvciBiYXNlZCBvbiByYXcgb2JqZWN0IHRoYXQgY29udGFpbnMgaXRzIGF0dHJpYnV0ZXNcclxuICAgICAqIEBwYXJhbSByYXdQcm94eVxyXG4gICAgICogQHJldHVybnMge1Byb3RvY29sU3R1YkRlc2NyaXB0b3J9XHJcbiAgICAgKi9cclxuICBjcmVhdGVJZHBQcm94eShyYXdQcm94eSkge1xyXG4gICAgLy8gbG9nLmxvZyhcImNyZWF0aW5nIGlkcHByb3h5IGRlc2NyaXB0b3IgYmFzZWQgb246IFwiLCByYXdQcm94eSk7XHJcblxyXG4gICAgLy8gY3JlYXRlIHRoZSBkZXNjcmlwdG9yXHJcbiAgICBsZXQgaWRwcHJveHkgPSB0aGlzLl9mYWN0b3J5LmNyZWF0ZVByb3RvU3R1YkRlc2NyaXB0b3JPYmplY3QoXHJcbiAgICAgIHJhd1Byb3h5WydjZ3VpZCddLFxyXG4gICAgICByYXdQcm94eVsndmVyc2lvbiddLFxyXG4gICAgICByYXdQcm94eVsnb2JqZWN0TmFtZSddLFxyXG4gICAgICByYXdQcm94eVsnZGVzY3JpcHRpb24nXSxcclxuICAgICAgcmF3UHJveHlbJ2xhbmd1YWdlJ10sXHJcbiAgICAgIHJhd1Byb3h5Wydzb3VyY2VQYWNrYWdlVVJMJ10sXHJcbiAgICAgIHJhd1Byb3h5WydtZXNzYWdlU2NoZW1hcyddLFxyXG4gICAgICByYXdQcm94eVsnY29uZmlndXJhdGlvbiddLFxyXG4gICAgICByYXdQcm94eVsnY29uc3RyYWludHMnXSxcclxuICAgICAgcmF3UHJveHlbJ2h5cGVydHlUeXBlJ10sXHJcbiAgICAgIHJhd1Byb3h5WydkYXRhT2JqZWN0cyddLFxyXG4gICAgICByYXdQcm94eVsnaW50ZXJ3b3JraW5nJ10sXHJcbiAgICAgIHJhd1Byb3h5WydpZHBQcm94eSddLFxyXG4gICAgICByYXdQcm94eVsnbXV0dWFsQXV0aGVudGljYXRpb24nXVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBvcHRpb25hbCBmaWVsZHNcclxuICAgIGlkcHByb3h5LnNpZ25hdHVyZSA9IHJhd1Byb3h5WydzaWduYXR1cmUnXTtcclxuXHJcbiAgICAvLyBwYXJzZSBhbmQgYXR0YWNoIHRoZSBzb3VyY2VQYWNrYWdlXHJcbiAgICBsZXQgc291cmNlUGFja2FnZSA9IHJhd1Byb3h5Wydzb3VyY2VQYWNrYWdlJ107XHJcbiAgICBpZiAoc291cmNlUGFja2FnZSkge1xyXG4gICAgICBzb3VyY2VQYWNrYWdlID0gdGhpcy5jcmVhdGVTb3VyY2VQYWNrYWdlKHNvdXJjZVBhY2thZ2UpO1xyXG4gICAgICBpZHBwcm94eS5zb3VyY2VQYWNrYWdlID0gc291cmNlUGFja2FnZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaWRwcHJveHk7XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTb3VyY2VQYWNrYWdlKHNwKSB7XHJcbiAgICAvL2xvZy5sb2coXCJjcmVhdGVTb3VyY2VQYWNrYWdlOlwiLCBzcCk7XHJcblxyXG4gICAgLy8gY2hlY2sgZW5jb2RpbmdcclxuICAgIGlmIChzcFsnZW5jb2RpbmcnXSA9PT0gJ2Jhc2U2NCcpIHtcclxuICAgICAgc3BbJ3NvdXJjZUNvZGUnXSA9IHRoaXMuYXRvYihzcFsnc291cmNlQ29kZSddKTtcclxuICAgICAgc3BbJ2VuY29kaW5nJ10gPSAndXRmLTgnO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzb3VyY2VQYWNrYWdlID0gdGhpcy5fZmFjdG9yeS5jcmVhdGVTb3VyY2VQYWNrYWdlKHNwWydzb3VyY2VDb2RlQ2xhc3NuYW1lJ10sIHNwWydzb3VyY2VDb2RlJ10pO1xyXG4gICAgaWYgKHNwWydlbmNvZGluZyddKVxyXG4gICAgICBzb3VyY2VQYWNrYWdlLmVuY29kaW5nID0gc3BbJ2VuY29kaW5nJ107XHJcblxyXG4gICAgaWYgKHNwWydzaWduYXR1cmUnXSlcclxuICAgICAgc291cmNlUGFja2FnZS5zaWduYXR1cmUgPSBzcFsnc2lnbmF0dXJlJ107XHJcblxyXG4gICAgcmV0dXJuIHNvdXJjZVBhY2thZ2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgICAqIEdldCBzb3VyY2UgUGFja2FnZSBmcm9tIGEgVVJMXHJcbiAgICAgKiBAcGFyYW0gc291cmNlUGFja2FnZVVSTCAtIGUuZy4gbXlkb21haW4uY29tLy53ZWxsLWtub3duL2h5cGVydHkvTXlIeXBlcnR5L3NvdXJjZVBhY2thZ2VcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlfVxyXG4gICAgICovXHJcbiAgZ2V0U291cmNlUGFja2FnZUZyb21VUkwoc291cmNlUGFja2FnZVVSTCkge1xyXG4gICAgbG9nLmxvZygnZ2V0dGluZyBzb3VyY2VQYWNrYWdlIGZyb206Jywgc291cmNlUGFja2FnZVVSTCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5odHRwUmVxdWVzdC5nZXQoc291cmNlUGFja2FnZVVSTCkudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgLy9sb2cubG9nKFwiZ290IHJhdyBzb3VyY2VQYWNrYWdlOlwiLCByZXN1bHQpO1xyXG4gICAgICAgIGlmIChyZXN1bHRbJ0VSUk9SJ10pIHtcclxuICAgICAgICAgIC8vIFRPRE8gaGFuZGxlIGVycm9yIHByb3Blcmx5XHJcbiAgICAgICAgICByZWplY3QocmVzdWx0KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xyXG4gICAgICAgICAgbGV0IHNvdXJjZVBhY2thZ2UgPSB0aGlzLmNyZWF0ZVNvdXJjZVBhY2thZ2UocmVzdWx0KTtcclxuICAgICAgICAgIHJlc29sdmUoc291cmNlUGFja2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgc291cmNlQ29kZSBvZiBhIGdpdmVuIGRlc2NyaXB0b3JcclxuICAgICAqIEBwYXJhbSB7Q2F0YWxvZ3VlRGF0YU9iamVjdH0gZGVzY3JpcHRvciAtIENhdGFsb2d1ZSBPYmplY3QgdGhhdCB3YXMgcmV0cmlldmVkIHVzaW5nIGUuZy4gZ2V0SHlwZXJ0eURlc2NyaXB0b3IoKVxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9XHJcbiAgICAgKi9cclxuICBnZXRTb3VyY2VDb2RlRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZSkge1xyXG4gICAgICAgIC8vbG9nLmxvZyhcImRlc2NyaXB0b3IgaGFzIHNvdXJjZVBhY2thZ2VcIik7XHJcbiAgICAgICAgLy9sb2cubG9nKFwicmV0dXJuaW5nIHNvdXJjZUNvZGU6XCIsIGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlKTtcclxuICAgICAgICByZXNvbHZlKGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZS5zb3VyY2VDb2RlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldFZlcnNpb24oZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMICsgJy9zb3VyY2VDb2RlJykudGhlbigoZGJWZXJzaW9uKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGJWZXJzaW9uID49IGRlc2NyaXB0b3IudmVyc2lvbikge1xyXG4gICAgICAgICAgICBsb2cubG9nKCdyZXR1cm5pbmcgY2FjaGVkIHZlcnNpb24gZnJvbSBzdG9yYWdlTWFuYWdlcicpO1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VNYW5hZ2VyLmdldChkZXNjcmlwdG9yLnNvdXJjZVBhY2thZ2VVUkwgKyAnL3NvdXJjZUNvZGUnKS50aGVuKChzb3VyY2VDb2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZShzb3VyY2VDb2RlKTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaHR0cFJlcXVlc3QuZ2V0KGRlc2NyaXB0b3Iuc291cmNlUGFja2FnZVVSTCArICcvc291cmNlQ29kZScpLnRoZW4oKHNvdXJjZUNvZGUpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoc291cmNlQ29kZVsnRVJST1InXSkge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBoYW5kbGUgZXJyb3IgcHJvcGVybHlcclxuICAgICAgICAgICAgICAgIHJlamVjdChzb3VyY2VDb2RlKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlTWFuYWdlci5zZXQoZGVzY3JpcHRvci5zb3VyY2VQYWNrYWdlVVJMICsgJy9zb3VyY2VDb2RlJywgZGVzY3JpcHRvci52ZXJzaW9uLCBzb3VyY2VDb2RlKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoc291cmNlQ29kZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5jYXRjaCgocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChyZWFzb24pID0+IHtcclxuICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY2F0YWxvZ3VlIG9iamVjdHMgZm9yIHRoZSBnaXZlbiBcInR5cGUgVVJMXCIsXHJcbiAgICAgKiBpLmUuIGEgY2F0YWxvZ3VlIFVSTCB0aGF0IHNwZWNpZmllcyBhIHR5cGUsIGJ1dCBubyBjYXRhbG9ndWUgb2JqZWN0IG5hbWUuXHJcbiAgICAgKiBAcGFyYW0gdHlwZVVSTCAtIFVSTCBwb2ludGluZyB0byB0aGUgY2F0YWxvZ3VlIG9iamVjdCB0eXBlIHlvdSB3YW50IGEgbGlzdCBvZiBhdmFpbGFibGUgb2JqZWN0cyBmb3IsXHJcbiAgICAgKiBlLmcuIGh5cGVydHktY2F0YWxvZ3VlOi8vY2F0YWxvZ3VlLmZva3VzLmZyYXVuaG9mZXIuZGUvLndlbGwta25vd24vaWRwLXByb3h5XHJcbiAgICAgKiBAcGFyYW0ge0pTT059IGNvbnN0cmFpbnRzIC0gY29uc3RyYWludHMgb2JqZWN0XHJcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gdHlwZUxpc3RQcm9taXNlIC0gUHJvbWlzZSB0aGF0IGZ1bGZpbGxzIHdpdGggdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNhdGFsb2d1ZSBvYmplY3QgbmFtZXMgZm9yIHRoZSByZXF1ZXN0ZWQgdHlwZSxcclxuICAgICAqIHJlamVjdHMgb24gSFRUUCBlcnJvciBvciBpZiB0aGUgSFRUUCByZXNwb25zZSBpcyBub3QgaW4gSlNPTi5cclxuICAgICAqIElmIGNvbnN0cmFpbnRzIHdlcmUgcHJvdmlkZWQsIHRoZW4gdGhlIGxpc3Qgb25seSBjb250YWlucyB0aG9zZSBvYmplY3RzIHRoYXQgbWVldCB0aGUgY29uc3RyYWludHNcclxuICAgICAqL1xyXG4gIGdldFR5cGVMaXN0KHR5cGVVUkwsIGNvbnN0cmFpbnRzKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBsZXQgcmVxdWVzdFByb21pc2UgPSBjb25zdHJhaW50cyAhPSB1bmRlZmluZWQgPyB0aGlzLmh0dHBSZXF1ZXN0LnBvc3QodHlwZVVSTCwge2JvZHk6IEpTT04uc3RyaW5naWZ5KGNvbnN0cmFpbnRzKX0pIDogdGhpcy5odHRwUmVxdWVzdC5nZXQodHlwZVVSTCk7XHJcbiAgICAgIHJlcXVlc3RQcm9taXNlLnRoZW4oKHR5cGVMaXN0KSA9PiB7XHJcbiAgICAgICAgdHlwZUxpc3QgPSBKU09OLnBhcnNlKHR5cGVMaXN0KTtcclxuICAgICAgICByZXNvbHZlKHR5cGVMaXN0KTtcclxuICAgICAgfSkuY2F0Y2goKHJlYXNvbikgPT4ge1xyXG4gICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJ1bnRpbWVVUkwocnVudGltZVVSTCkge1xyXG4gICAgdGhpcy5fcnVudGltZVVSTCA9IHJ1bnRpbWVVUkw7XHJcbiAgfVxyXG5cclxuICBnZXQgcnVudGltZVVSTCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9ydW50aW1lVVJMO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlRnJvbVBNKHVybCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZU1hbmFnZXIuZGVsZXRlKHVybCk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUnVudGltZUNhdGFsb2d1ZTtcclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQUNBOzs7Ozs7O0FBRkE7QUFVQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQTNCQTtBQUNBO0FBREE7QUFBQTtBQStCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN2REE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkE7QUFFQTs7Ozs7QUFJQTs7Ozs7QUFDQTs7Ozs7Ozs7Ozs7OztBQWFBO0FBQUE7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQVhBO0FBWUE7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFrREE7QUFDQTtBQUVBOzs7QUFuREE7QUFDQTtBQUNBO0FBbURBO0FBQ0E7QUFFQTs7O0FBcERBO0FBQ0E7QUFDQTtBQW9EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUF0REE7QUFDQTtBQUNBO0FBc0RBO0FBQ0E7QUFFQTs7O0FBdkRBO0FBQ0E7QUFDQTtBQXVEQTtBQUNBO0FBRUE7OztBQXhEQTtBQUNBO0FBQ0E7QUF3REE7QUFDQTtBQUVBOzs7QUF6REE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUFBOzs7O0FBSUE7QUFDQTtBQUVBOzs7QUFqQkE7QUFDQTtBQUNBO0FBaUJBO0FBQ0E7QUFFQTs7O0FBbEJBO0FBQ0E7QUFDQTtBQWlEQTtBQUNBO0FBRUE7Ozs7QUFuSEE7QUFzSEE7QUFDQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBRkE7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFGQTtBQUlBOzs7Ozs7OztBQzNKQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7OztBQUdBOzs7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQXdCQTtBQUNBO0FBRUE7OztBQXpCQTtBQUNBO0FBQ0E7QUF5QkE7QUFDQTtBQUVBOzs7QUExQkE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUVBOzs7QUFQQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBRUE7Ozs7OztBQWFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUFjQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFUQTtBQVVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQXNCQTtBQUNBO0FBRUE7OztBQXZCQTtBQUNBO0FBQ0E7QUF1QkE7QUFDQTtBQUVBOzs7QUF4QkE7QUFDQTtBQUNBO0FBd0JBO0FBQ0E7QUFFQTs7O0FBekJBO0FBQ0E7QUFDQTtBQXlCQTtBQUNBO0FBRUE7OztBQTFCQTtBQUNBO0FBQ0E7QUEwQkE7QUFDQTtBQUVBOzs7QUEzQkE7QUFDQTtBQUNBO0FBMkJBO0FBQ0E7QUFFQTs7OztBQWhGQTtBQUNBO0FBb0ZBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFEQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JIQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7OztBQUlBO0FBQ0E7QUFDQTs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFFQTtBQUVBO0FBS0E7QUFLQTtBQUVBO0FBS0E7QUFDQTtBQUNBO0FBeEJBO0FBMEJBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQVVBO0FBQ0E7QUFFQTs7O0FBWEE7QUFDQTtBQUNBO0FBV0E7QUFDQTtBQUVBOzs7QUFaQTtBQUNBO0FBQ0E7QUFZQTtBQUNBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOzs7O0FBL0ZBO0FBQ0E7QUFpR0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDL0hBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7O0FBSUE7QUFDQTtBQUNBOzs7OztBQUVBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFBQTtBQUVBO0FBRUE7QUFJQTtBQUtBO0FBQ0E7QUFmQTtBQWdCQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFVQTtBQUNBO0FBRUE7OztBQVhBO0FBQ0E7QUFDQTtBQVdBO0FBQ0E7QUFFQTs7O0FBWkE7QUFDQTtBQUNBO0FBWUE7QUFDQTtBQUVBOzs7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQTlEQTtBQWlFQTs7Ozs7QUFHQTtBQUFBO0FBQUE7QUFDQTs7Ozs7Ozs7QUFRQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWhCQTtBQUFBO0FBQUE7QUFzQ0E7QUFDQTtBQXZDQTtBQUFBO0FBQUE7QUFrQkE7QUFDQTtBQW5CQTtBQUFBO0FBQUE7QUFzQkE7QUFDQTtBQXZCQTtBQUFBO0FBQUE7QUEwQkE7QUFDQTtBQTNCQTtBQUFBO0FBQUE7QUE4QkE7QUFDQTtBQS9CQTtBQUFBO0FBQUE7QUFrQ0E7QUFDQTtBQW5DQTtBQUNBO0FBREE7QUFBQTtBQTJDQTs7OztBQUdBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7Ozs7QUFTQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBbkJBO0FBQUE7QUFBQTtBQXFCQTtBQUNBO0FBdEJBO0FBQUE7QUFBQTtBQXlCQTtBQUNBO0FBMUJBO0FBQUE7QUFBQTtBQTZCQTtBQUNBO0FBOUJBO0FBQUE7QUFBQTtBQWlDQTtBQUNBO0FBbENBO0FBQUE7QUFBQTtBQXFDQTtBQUNBO0FBdENBO0FBQUE7QUFBQTtBQXlDQTtBQUNBO0FBMUNBO0FBQUE7QUFBQTtBQTZDQTtBQUNBO0FBOUNBO0FBQUE7QUFBQTtBQWtEQTtBQUNBO0FBbkRBO0FBQ0E7QUFEQTtBQUFBO0FBc0RBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZNQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7OztBQUdBO0FBQ0E7QUFDQTs7Ozs7QUFDQTtBQUFBO0FBQ0E7QUFEQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBSkE7QUFLQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7OztBQVZBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7OztBQWxCQTtBQUNBO0FBd0JBOzs7Ozs7Ozs7Ozs7Ozs7O0FDckRBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTs7O0FBSUE7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBSkE7QUFBQTtBQUNBO0FBUUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUpBO0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUhBO0FBSUE7QUFDQTtBQU5BO0FBQUE7QUFDQTtBQVFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFKQTtBQUFBO0FBTUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFDQTtBQUpBO0FBQUE7QUFNQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFFQTtBQUNBO0FBSkE7QUFBQTtBQU1BO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUVBO0FBQ0E7QUFKQTtBQUFBO0FBTUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQURBO0FBSUE7Ozs7Ozs7O0FDakZBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFRQTs7Ozs7Ozs7OztBQUVBOzs7Ozs7Ozs7OztBQVdBO0FBQ0E7QUFVQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY0E7QUFFQTtBQVdBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0JBO0FBRUE7QUFZQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWVBO0FBRUE7QUFXQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQVlBO0FBRUE7QUFVQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7O0FBV0E7QUFDQTtBQVVBO0FBRUE7QUFFQTs7Ozs7Ozs7Ozs7OztBQVVBO0FBQ0E7QUFVQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7OztBQVlBO0FBRUE7QUFZQTtBQVlBO0FBRUE7Ozs7Ozs7OztBQU1BO0FBQ0E7QUFNQTtBQUVBOzs7Ozs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQzVTQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7Ozs7Ozs7QUFTQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7Ozs7QUFNQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFBQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBREE7QUFEQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUF0QkE7QUFDQTtBQXVCQTtBQUVBO0FBR0E7QUFFQTs7Ozs7Ozs7OztBQU9BO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQWFBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFnQkE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFDQTtBQWFBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFHQTtBQUNBO0FBQUE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFLQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFnQkE7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUdBO0FBR0E7QUFDQTtBQUVBOzs7Ozs7OztBQUtBO0FBQUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7Ozs7Ozs7O0FBS0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7Ozs7O0FBVUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFVQTtBQUNBO0FBQ0E7OztBQVZBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7Ozs7O0FBUUEiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///22\n')},function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n\n// EXTERNAL MODULE: ./node_modules/loglevel/lib/loglevel.js\nvar loglevel = __webpack_require__(1);\n\n// CONCATENATED MODULE: ./src/policy/ActionsService.js\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nvar ActionsService =\n/*#__PURE__*/\nfunction () {\n function ActionsService(context) {\n _classCallCheck(this, ActionsService);\n\n this.context = context;\n }\n\n _createClass(ActionsService, [{\n key: \"enforcePolicies\",\n value: function enforcePolicies(message, isIncomingMessage) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var policies = _this.context.getPolicies(message, isIncomingMessage);\n\n if (policies !== undefined) {\n if (policies.serviceProviderPolicy !== undefined) {\n policies.serviceProviderPolicy.enforceActions(_this.context, message).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n if (policies.userPolicy !== undefined) {\n policies.userPolicy.enforceActions(_this.context, message).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve([message]);\n }\n }\n } else {\n resolve([message]);\n }\n });\n }\n }, {\n key: \"forwardToID\",\n value: function forwardToID(message, email) {\n var _this = this;\n\n if (!_this.context.runtimeRegistry) throw new Error('forward message to given ID is unsupported in this environment');\n return new Promise(function (resolve, reject) {\n if (_this.context.runtimeRegistry.hypertiesList[0].hypertyURL === message.to) {\n var splitTo = message.to.split('://');\n\n if (splitTo[0] !== 'runtime') {\n _this.context.runtimeRegistry.discoverHypertyPerUser(email).then(function (result) {\n message.to = result.hypertyURL;\n message.body.via = undefined;\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(message);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve(message);\n }\n } else {\n resolve(message);\n }\n });\n }\n }, {\n key: \"forwardToHyperty\",\n value: function forwardToHyperty(message, hypertyURL) {\n var _this = this;\n\n if (!_this.context.runtimeRegistry) throw new Error('forward message to given ID is unsupported in this environment');\n return new Promise(function (resolve) {\n if (_this.context.runtimeRegistry.hypertiesList[0].hypertyURL === message.to) {\n var splitTo = message.to.split('://');\n\n if (splitTo[0] !== 'runtime') {\n message.to = hypertyURL;\n message.body.via = undefined;\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(message);\n } else {\n resolve(message);\n }\n } else {\n resolve(message);\n }\n });\n }\n }, {\n key: \"sendAutomaticMessage\",\n value: function sendAutomaticMessage(message, text) {\n var _this = this;\n\n return new Promise(function (resolve) {\n var automaticMessage = {\n from: message.to,\n to: message.from,\n body: {\n value: text\n },\n type: message.type\n };\n resolve(message);\n\n _this.context.runtimeRegistry._messageBus.postMessage(automaticMessage);\n });\n }\n }]);\n\n return ActionsService;\n}();\n\n/* harmony default export */ var policy_ActionsService = (ActionsService);\n// CONCATENATED MODULE: ./src/policy/Operators.js\nfunction Operators_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Operators_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Operators_createClass(Constructor, protoProps, staticProps) { if (protoProps) Operators_defineProperties(Constructor.prototype, protoProps); if (staticProps) Operators_defineProperties(Constructor, staticProps); return Constructor; }\n\nvar Operators =\n/*#__PURE__*/\nfunction () {\n function Operators() {\n Operators_classCallCheck(this, Operators);\n }\n\n Operators_createClass(Operators, [{\n key: \"and\",\n value: function and(params) {\n return params[0] && params[1];\n }\n }, {\n key: \"between\",\n value: function between(params) {\n var start = parseInt(params[0][0]);\n var end = parseInt(params[0][1]);\n var now = params[1];\n\n if (end < start) {\n now = now < start ? now += 2400 : now;\n end += 2400;\n }\n\n return now > start && now < end;\n }\n }, {\n key: \"equals\",\n value: function equals(params) {\n return String(params[0]) === '*' || String(params[0]) === String(params[1]);\n }\n }, {\n key: \"greaterThan\",\n value: function greaterThan(params) {\n return params[1] > params[0];\n }\n }, {\n key: \"in\",\n value: function _in(params) {\n return params[0].indexOf(params[1]) > -1;\n }\n }, {\n key: \"lessThan\",\n value: function lessThan(params) {\n return params[1] < params[0];\n }\n }, {\n key: \"not\",\n value: function not(params) {\n return !params[0];\n }\n }, {\n key: \"or\",\n value: function or(params) {\n return params[0] || params[1];\n }\n }]);\n\n return Operators;\n}();\n\n/* harmony default export */ var policy_Operators = (Operators);\n// CONCATENATED MODULE: ./src/policy/PDP.js\nfunction PDP_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction PDP_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction PDP_createClass(Constructor, protoProps, staticProps) { if (protoProps) PDP_defineProperties(Constructor.prototype, protoProps); if (staticProps) PDP_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n/**\r\n* The Policy Decision Point (PDP) decides if a message is to be authorised by checking a set of\r\n* policies. The resource to be verified is specified in the first word of the 'condition' field of\r\n* a Policy object. The implementation that verifies if the message is compliant with a policy is\r\n* specified in a hashtable to allow dynamic definition of the implementation, providing\r\n* extensibility to the Policy Engine functionalities.\r\n*/\n\nvar PDP_PDP =\n/*#__PURE__*/\nfunction () {\n function PDP(context) {\n PDP_classCallCheck(this, PDP);\n\n this.context = context;\n this.operators = new policy_Operators();\n }\n\n PDP_createClass(PDP, [{\n key: \"evaluatePolicies\",\n value: function evaluatePolicies(message, isIncomingMessage) {\n var policies = this.context.getPolicies(message, isIncomingMessage);\n var result = 'Not Applicable';\n\n if (policies !== undefined) {\n result = this.evaluatePolicy(message, policies.serviceProviderPolicy, isIncomingMessage);\n\n if (result || result === 'Not Applicable') {\n var userResult = this.evaluatePolicy(message, policies.userPolicy, isIncomingMessage);\n\n if (userResult !== 'Not Applicable') {\n result = userResult;\n }\n }\n }\n\n return result;\n }\n }, {\n key: \"evaluatePolicy\",\n value: function evaluatePolicy(message, policy, isIncoming) {\n var result = 'Not Applicable';\n\n if (policy) {\n result = policy.evaluateRules(this.context, message, isIncoming);\n }\n\n return result;\n }\n }]);\n\n return PDP;\n}();\n\n/* harmony default export */ var policy_PDP = (PDP_PDP);\n// EXTERNAL MODULE: ./src/policy/combiningAlgorithms/AllowOverrides.js\nvar AllowOverrides = __webpack_require__(15);\n\n// EXTERNAL MODULE: ./src/policy/combiningAlgorithms/BlockOverrides.js\nvar BlockOverrides = __webpack_require__(16);\n\n// EXTERNAL MODULE: ./src/policy/combiningAlgorithms/FirstApplicable.js\nvar FirstApplicable = __webpack_require__(17);\n\n// CONCATENATED MODULE: ./src/policy/conditions/Condition.js\nfunction Condition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Condition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Condition_createClass(Constructor, protoProps, staticProps) { if (protoProps) Condition_defineProperties(Constructor.prototype, protoProps); if (staticProps) Condition_defineProperties(Constructor, staticProps); return Constructor; }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to represent a condition and evaluate its applicability.\r\n*/\n\nvar Condition_Condition =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates a new Condition.\r\n * @class\r\n * @param {string} attribute\r\n * @param {string} operator\r\n * @param {*} params\r\n */\n function Condition(attribute, operator, params) {\n Condition_classCallCheck(this, Condition);\n\n this.attribute = attribute;\n this.operator = operator;\n this.params = params;\n this.operators = new policy_Operators();\n }\n /**\r\n * Verifies if the condition is applicable to the message. First, the system value that corresponds to the attribute is retrieved; then, that value is compared with the parameter specified in the condition by executing the operator implementation. If the operator is 'in' and the name of a group is given, then the array holding the members of the group is retrieved before the comparison.\r\n * @param {Object} context environment where the Policy Engine is being used\r\n * @param {Object} message\r\n */\n\n\n Condition_createClass(Condition, [{\n key: \"isApplicable\",\n value: function isApplicable(context, message) {\n context[this.attribute] = {\n message: message\n };\n var value = context[this.attribute];\n var tempParam;\n\n if (this.operator === 'in') {\n if (!Array.isArray(this.params)) {\n tempParam = context.getGroup(this.params, message.to);\n return this.operators[this.operator]([tempParam, value]);\n }\n }\n\n return this.operators[this.operator]([this.params, value]);\n }\n }]);\n\n return Condition;\n}();\n\n/* harmony default export */ var conditions_Condition = (Condition_Condition);\n// CONCATENATED MODULE: ./src/policy/conditions/SubscriptionCondition.js\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction SubscriptionCondition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction SubscriptionCondition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction SubscriptionCondition_createClass(Constructor, protoProps, staticProps) { if (protoProps) SubscriptionCondition_defineProperties(Constructor.prototype, protoProps); if (staticProps) SubscriptionCondition_defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _get(target, property, receiver) { if (typeof Reflect !== \"undefined\" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); }\n\nfunction _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n/**\r\n* Copyright 2016 PT Inovação e Sistemas SA\r\n* Copyright 2016 INESC-ID\r\n* Copyright 2016 QUOBIS NETWORKS SL\r\n* Copyright 2016 FRAUNHOFER-GESELLSCHAFT ZUR FOERDERUNG DER ANGEWANDTEN FORSCHUNG E.V\r\n* Copyright 2016 ORANGE SA\r\n* Copyright 2016 Deutsche Telekom AG\r\n* Copyright 2016 Apizee\r\n* Copyright 2016 TECHNISCHE UNIVERSITAT BERLIN\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n**/\n\n/**\r\n* @author Ana Caldeira \r\n* @classdesc Class to represent a subscription condition and evaluate its applicability.\r\n*/\n\nvar SubscriptionCondition =\n/*#__PURE__*/\nfunction (_Condition) {\n _inherits(SubscriptionCondition, _Condition);\n\n /**\r\n * Creates a new SubscriptionCondition.\r\n * @class\r\n * @param {string} attribute\r\n * @param {string} operator\r\n * @param {*} params\r\n */\n function SubscriptionCondition(attribute, operator, params) {\n SubscriptionCondition_classCallCheck(this, SubscriptionCondition);\n\n return _possibleConstructorReturn(this, _getPrototypeOf(SubscriptionCondition).call(this, attribute, operator, params));\n }\n /**\r\n * Verifies if the subscription condition is applicable to the message. First, verifies if the message is of the subscription type; second, verifies if the message is from a remote runtime to guarantee that the subscription is being validated in the destination runtime; third, verifies if the subscription preference is met.\r\n * @param {Object} context environment where the Policy Engine is being used\r\n * @param {Object} message\r\n */\n\n\n SubscriptionCondition_createClass(SubscriptionCondition, [{\n key: \"isApplicable\",\n value: function isApplicable(context, message) {\n var isSubscription = message.type === 'subscribe';\n var isFromRemoteSM = context.isFromRemoteSM(message.from);\n\n if (isSubscription & isFromRemoteSM) {\n return _get(_getPrototypeOf(SubscriptionCondition.prototype), \"isApplicable\", this).call(this, context, message);\n } else {\n return false;\n }\n }\n }]);\n\n return SubscriptionCondition;\n}(conditions_Condition);\n\n/* harmony default export */ var conditions_SubscriptionCondition = (SubscriptionCondition);\n// CONCATENATED MODULE: ./src/policy/conditions/AdvancedCondition.js\nfunction AdvancedCondition_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction AdvancedCondition_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction AdvancedCondition_createClass(Constructor, protoProps, staticProps) { if (protoProps) AdvancedCondition_defineProperties(Constructor.prototype, protoProps); if (staticProps) AdvancedCondition_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\nvar AdvancedCondition_AdvancedCondition =\n/*#__PURE__*/\nfunction () {\n function AdvancedCondition(condition) {\n AdvancedCondition_classCallCheck(this, AdvancedCondition);\n\n this.operators = new policy_Operators();\n\n if (condition.operators !== undefined) {\n condition = condition.condition;\n }\n\n condition = this.buildCondition(condition);\n this.condition = condition;\n }\n\n AdvancedCondition_createClass(AdvancedCondition, [{\n key: \"buildCondition\",\n value: function buildCondition(condition) {\n if (Array.isArray(condition[1])) {\n condition[1] = this.buildCondition(condition[1]);\n } else {\n if (condition[1].attribute === 'subscription') {\n condition[1] = new conditions_SubscriptionCondition(condition[1].attribute, condition[1].operator, condition[1].params);\n } else {\n condition[1] = new conditions_Condition(condition[1].attribute, condition[1].operator, condition[1].params);\n }\n }\n\n if (condition[2] !== undefined) {\n if (Array.isArray(condition[2])) {\n condition[2] = this.buildCondition(condition[2]);\n } else {\n if (condition[2].attribute === 'subscription') {\n condition[2] = new conditions_SubscriptionCondition(condition[2].attribute, condition[2].operator, condition[2].params);\n } else {\n condition[2] = new conditions_Condition(condition[2].attribute, condition[2].operator, condition[2].params);\n }\n }\n }\n\n return condition;\n }\n }, {\n key: \"isApplicable\",\n value: function isApplicable(context, message, scope, target, operator, left, right) {\n if (!operator) {\n operator = this.condition[0];\n left = this.condition[1];\n right = this.condition[2];\n }\n\n while (!(left instanceof conditions_Condition) & !(left instanceof conditions_SubscriptionCondition) & typeof left !== 'boolean') {\n left = this.isApplicable(context, message, scope, target, left[0], left[1], left[2]);\n }\n\n if (right !== undefined) {\n while (!(right instanceof conditions_Condition) & !(right instanceof conditions_SubscriptionCondition) & typeof right !== 'boolean') {\n right = this.isApplicable(context, message, scope, target, right[0], right[1], right[2]);\n }\n }\n\n var resultLeft = typeof left === 'boolean' ? left : left.isApplicable(context, message, scope, target);\n var resultRight;\n\n if (right !== undefined) {\n resultRight = typeof right === 'boolean' ? right : right.isApplicable(context, message, scope, target);\n }\n\n return this.operators[operator]([resultLeft, resultRight]);\n }\n }]);\n\n return AdvancedCondition;\n}();\n\n/* harmony default export */ var conditions_AdvancedCondition = (AdvancedCondition_AdvancedCondition);\n// EXTERNAL MODULE: ./src/utils/utils.js\nvar utils = __webpack_require__(0);\n\n// CONCATENATED MODULE: ./src/policy/Rule.js\nfunction Rule_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Rule_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Rule_createClass(Constructor, protoProps, staticProps) { if (protoProps) Rule_defineProperties(Constructor.prototype, protoProps); if (staticProps) Rule_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\nvar Rule_Rule =\n/*#__PURE__*/\nfunction () {\n function Rule(decision, condition, scope, target, priority) {\n Rule_classCallCheck(this, Rule);\n\n this.decision = decision;\n this.setCondition(condition);\n this.priority = priority;\n this.scope = scope;\n this.target = target;\n }\n\n Rule_createClass(Rule, [{\n key: \"setCondition\",\n value: function setCondition(condition) {\n if (!(condition instanceof conditions_Condition || condition instanceof conditions_AdvancedCondition || condition instanceof conditions_AdvancedCondition)) {\n var attribute = condition.attribute;\n\n switch (attribute) {\n case 'subscription':\n this.condition = new conditions_AdvancedCondition(condition.attribute, condition.operator, condition.params);\n break;\n\n case undefined:\n this.condition = new conditions_AdvancedCondition(condition);\n break;\n\n default:\n this.condition = new conditions_Condition(condition.attribute, condition.operator, condition.params);\n }\n } else {\n this.condition = condition;\n }\n }\n }, {\n key: \"evaluate\",\n value: function evaluate(context, message, isIncoming) {\n var field = isIncoming ? message.to : message.from;\n var hypertyName;\n\n switch (this.scope) {\n case 'global':\n break;\n\n case 'hyperty':\n if (Object(utils[\"s\" /* isDataObjectURL */])(field)) {\n var reporter = context.runtimeRegistry.getReporterURLSynchonous(Object(utils[\"B\" /* removePathFromURL */])(field));\n\n if (reporter !== undefined) {\n hypertyName = context.runtimeRegistry.getHypertyName(reporter);\n }\n } else {\n if (field.split('://')[0] === 'hyperty') {\n hypertyName = context.runtimeRegistry.getHypertyName(Object(utils[\"B\" /* removePathFromURL */])(field));\n }\n }\n\n if (hypertyName === this.target) {\n break;\n }\n\n return 'Not Applicable';\n\n case 'identity':\n var owner;\n\n if (Object(utils[\"s\" /* isDataObjectURL */])(field)) {\n var _reporter = context.runtimeRegistry.getReporterURLSynchonous(Object(utils[\"B\" /* removePathFromURL */])(field));\n\n owner = context.runtimeRegistry.getHypertyOwner(_reporter);\n } else {\n if (field.split('://')[0] === 'hyperty') {\n owner = context.runtimeRegistry.getHypertyOwner(Object(utils[\"B\" /* removePathFromURL */])(field));\n }\n }\n\n if (owner !== undefined) {\n owner = Object(utils[\"p\" /* getUserEmailFromURL */])(owner);\n }\n\n if (owner === this.target) {\n break;\n }\n\n return 'Not Applicable';\n }\n\n if (this.condition.isApplicable(context, message, this.scope, this.target)) {\n return this.decision;\n } else {\n return 'Not Applicable';\n }\n }\n }]);\n\n return Rule;\n}();\n\n/* harmony default export */ var policy_Rule = (Rule_Rule);\n// CONCATENATED MODULE: ./src/policy/Policy.js\nfunction Policy_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction Policy_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction Policy_createClass(Constructor, protoProps, staticProps) { if (protoProps) Policy_defineProperties(Constructor.prototype, protoProps); if (staticProps) Policy_defineProperties(Constructor, staticProps); return Constructor; }\n\n\n\n\n\n\nvar Policy_Policy =\n/*#__PURE__*/\nfunction () {\n function Policy(key, rules, actions, combiningAlgorithm) {\n Policy_classCallCheck(this, Policy);\n\n if (!key) throw new Error('key is not defined');\n if (!actions) throw new Error('actions are not defined');\n this.actions = actions;\n this.key = key;\n\n this._setRules(rules);\n\n this._setCombiningAlgorithm(combiningAlgorithm);\n }\n\n Policy_createClass(Policy, [{\n key: \"addAction\",\n value: function addAction(method, param) {\n this.actions.push({\n method: method,\n param: param\n });\n }\n }, {\n key: \"createRule\",\n value: function createRule(decision, condition, scope, target, priority) {\n if (priority === undefined) {\n priority = this.getLastPriority() + 1;\n }\n\n var rule = new policy_Rule(decision, condition, scope, target, priority);\n this.rules.push(rule);\n }\n }, {\n key: \"deleteRule\",\n value: function deleteRule(rule) {\n var indexToRemove = this.rules.indexOf(rule);\n this.rules.splice(indexToRemove, 1);\n }\n }, {\n key: \"enforceActions\",\n value: function enforceActions(context, message) {\n var _this = this;\n\n return new Promise(function (resolve, reject) {\n var results = [];\n\n if (_this.actions.length !== 0) {\n for (var i in _this.actions) {\n var result = context.pep.actionsService[_this.actions[i].method](message, _this.actions[i].param);\n\n results.push(result);\n }\n\n Promise.all(results).then(function (messages) {\n resolve(messages);\n }, function (error) {\n reject(error);\n });\n } else {\n resolve([message]);\n }\n });\n }\n }, {\n key: \"evaluateRules\",\n value: function evaluateRules(context, message, isIncoming) {\n var results = [];\n\n for (var i in this.rules) {\n results.push(this.rules[i].evaluate(context, message, isIncoming));\n }\n\n return this.combiningAlgorithm.combine(results);\n }\n }, {\n key: \"getLastPriority\",\n value: function getLastPriority() {\n var priorities = [];\n\n if (this.rules.length !== 0) {\n for (var i in this.rules) {\n priorities.push(this.rules[i].priority);\n }\n\n return Math.max.apply(Math, priorities);\n } else {\n return -1;\n }\n }\n }, {\n key: \"getRuleByPriority\",\n value: function getRuleByPriority(priority) {\n for (var i in this.rules) {\n if (String(this.rules[i].priority) === String(priority)) {\n return this.rules[i];\n }\n }\n\n throw Error('Rule with priority ' + priority + ' does not exist!');\n }\n }, {\n key: \"_setCombiningAlgorithm\",\n value: function _setCombiningAlgorithm(combiningAlgorithm) {\n if (!combiningAlgorithm) {\n combiningAlgorithm = 'blockOverrides';\n }\n\n switch (combiningAlgorithm) {\n case 'blockOverrides':\n this.combiningAlgorithm = new BlockOverrides[\"a\" /* default */]();\n break;\n\n case 'allowOverrides':\n this.combiningAlgorithm = new AllowOverrides[\"a\" /* default */]();\n break;\n\n case 'firstApplicable':\n this.combiningAlgorithm = new FirstApplicable[\"a\" /* default */]();\n break;\n\n default:\n throw Error('Unknown algorithm: ' + combiningAlgorithm);\n }\n }\n }, {\n key: \"_setRules\",\n value: function _setRules(rules) {\n this.rules = [];\n\n for (var i in rules) {\n var rule = rules[i];\n\n if (rule.priority === undefined) {\n rule.priority = this.getLastPriority() + 1;\n }\n\n if (!(rule instanceof policy_Rule)) {\n rule = new policy_Rule(rule.decision, rule.condition, rule.scope, rule.target, rule.priority);\n }\n\n this.rules.push(rule);\n }\n }\n }, {\n key: \"sortRules\",\n value: function sortRules() {\n return this.rules.sort(function (a, b) {\n var x = a.priority;\n var y = b.priority;\n return x < y ? -1 : x > y ? 1 : 0;\n });\n }\n }]);\n\n return Policy;\n}();\n\n/* harmony default export */ var policy_Policy = (Policy_Policy);\n// CONCATENATED MODULE: ./src/policy/PEP.js\nfunction PEP_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction PEP_defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction PEP_createClass(Constructor, protoProps, staticProps) { if (protoProps) PEP_defineProperties(Constructor.prototype, protoProps); if (staticProps) PEP_defineProperties(Constructor, staticProps); return Constructor; }\n\n// Log System\n\nvar log = loglevel[\"getLogger\"]('PEP');\n\n\n\n\n\nvar PEP_PEP =\n/*#__PURE__*/\nfunction () {\n /**\r\n * Creates a Policy Enforcement Point (PEP) instance\r\n * @param {Object} context\r\n */\n function PEP(context) {\n PEP_classCallCheck(this, PEP);\n\n var _this = this;\n\n _this.pdp = new policy_PDP(context);\n _this.actionsService = new policy_ActionsService(context);\n _this.context = context;\n context.pep = _this; //TODO should be added a trigger to verify when the loadConfigurations is successfully completed\n\n context.loadConfigurations();\n }\n /**\r\n * return the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n\n\n PEP_createClass(PEP, [{\n key: \"addGUIListeners\",\n value: function addGUIListeners() {\n var _this = this;\n\n _this.context.messageBus.addListener(_this.context.pepURL, function (msg) {\n var funcName = msg.body.method;\n var returnedValue;\n\n if (funcName === 'addToGroup') {\n var groupName = msg.body.params.groupName;\n var userEmail = msg.body.params.userEmail;\n returnedValue = _this.context.addToGroup(groupName, userEmail);\n } else if (funcName === 'createGroup') {\n var _groupName = msg.body.params.groupName;\n returnedValue = _this.context.createGroup(_groupName);\n } else if (funcName === 'addPolicy') {\n var source = msg.body.params.source;\n var key = msg.body.params.key;\n var policy = msg.body.params.policy;\n var combiningAlgorithm = msg.body.params.combiningAlgorithm;\n returnedValue = _this.addPolicy(source, key, policy, combiningAlgorithm);\n } else if (funcName === 'deleteGroup') {\n var _groupName2 = msg.body.params.groupName;\n returnedValue = _this.context.deleteGroup(_groupName2);\n } else if (funcName === 'removePolicy') {\n var _source = msg.body.params.source;\n var _key = msg.body.params.key;\n returnedValue = _this.removePolicy(_source, _key);\n } else if (funcName === 'savePolicies') {\n var _source2 = msg.body.params.source;\n returnedValue = _this.context.savePolicies(_source2);\n } else if (funcName === 'userPolicies') {\n returnedValue = _this.context.userPolicies;\n } else if (funcName === 'activeUserPolicy') {\n var userPolicy = msg.body.params.userPolicy;\n\n if (userPolicy) {\n _this.context.activeUserPolicy = userPolicy;\n }\n\n returnedValue = _this.context.activeUserPolicy;\n } else if (funcName === 'userPolicy') {\n var _key2 = msg.body.params.key;\n returnedValue = _this.context.userPolicies[_key2];\n } else if (funcName === 'saveActivePolicy') {\n returnedValue = _this.context.saveActivePolicy();\n } else if (funcName === 'getMyEmails') {\n returnedValue = _this.context.getMyEmails();\n } else if (funcName === 'getMyHyperties') {\n returnedValue = _this.context.getMyHyperties();\n } else if (funcName === 'groups') {\n returnedValue = _this.context.groups;\n } else if (funcName === 'getGroupsNames') {\n returnedValue = _this.context.getGroupsNames();\n }\n\n if (funcName === 'removeFromGroup') {\n var _groupName3 = msg.body.params.groupName;\n var _userEmail = msg.body.params.userEmail;\n returnedValue = _this.context.removeFromGroup(_groupName3, _userEmail);\n }\n\n var value = {\n type: 'execute',\n value: returnedValue,\n code: 200\n };\n var replyMsg = {\n id: msg.id,\n type: 'response',\n to: msg.from,\n from: msg.to,\n body: value\n };\n\n _this.context.messageBus.postMessage(replyMsg);\n });\n }\n /**\r\n * Adds a policy to the Policy Enforcement Point (PEP). The policy can be created by the service\r\n * provider or by the user.\r\n * @param {String} source\r\n * @param {String} key\r\n * @param {Object} policy\r\n */\n\n }, {\n key: \"addPolicy\",\n value: function addPolicy(source, key, policy, combiningAlgorithm) {\n if (!source) throw new Error('source is not defined');\n if (!key) throw new Error('key is not defined');\n\n if (policy === undefined) {\n policy = new policy_Policy(key, [], [], combiningAlgorithm);\n } else {\n if (!(policy instanceof policy_Policy)) {\n policy = new policy_Policy(policy.key, policy.rules, policy.actions, policy.combiningAlgorithm);\n }\n }\n\n switch (source) {\n case 'SERVICE_PROVIDER':\n this.context.savePolicies(source, policy, key);\n break;\n\n case 'USER':\n this.context.userPolicies[key] = policy;\n this.context.savePolicies(source);\n break;\n\n default:\n throw Error('Unknown policy source: ' + source);\n }\n }\n }, {\n key: \"authorise\",\n value: function authorise(message, isIncoming) {\n var _this2 = this;\n\n // log.log('[Policy.PEP Authorise] ', message);\n // log.log(message);\n if (!message) throw new Error('message is not defined');\n if (!message.from) throw new Error('message.from is not defined');\n if (!message.to) throw new Error('message.to is not defined');\n if (!message.type) throw new Error('message.type is not defined');\n message.body = message.body || {};\n return new Promise(function (resolve, reject) {\n message.body = message.body || {};\n var _this = _this2;\n\n var result = _this.pdp.evaluatePolicies(message, isIncoming);\n\n if (result === 'Not Applicable') {\n result = _this.context.defaultBehaviour;\n message.body.auth = false;\n }\n\n _this.actionsService.enforcePolicies(message, isIncoming).then(function (messages) {\n for (var i in messages) {\n message = messages[i];\n\n if (result) {\n message.body.auth = message.body.auth === undefined ? true : message.body.auth;\n resolve(message);\n } else {\n var errorMessage = {\n body: {\n code: 403,\n description: 'Blocked by policy'\n },\n from: message.to,\n to: message.from,\n type: 'response'\n };\n reject(errorMessage);\n }\n }\n }, function (error) {\n reject(error);\n });\n });\n }\n }, {\n key: \"authoriseSync\",\n value: function authoriseSync(message) {\n var result;\n message.body = message.body || {};\n result = this.pdp.evaluatePolicies(message, true);\n\n if (result === 'Not Applicable') {\n result = this.context.defaultBehaviour;\n }\n\n return result;\n }\n }, {\n key: \"removePolicy\",\n value: function removePolicy(source, key) {\n if (!source) throw new Error('source is not defined');\n if (source !== '*' && !key) throw new Error('key is not defined');\n\n switch (source) {\n case '*':\n this.context.serviceProviderPolicy = {};\n this.context.userPolicies = {};\n this.context.activeUserPolicy = undefined;\n this.context.savePolicies('USER');\n this.context.savePolicies('SERVICE_PROVIDER');\n this.context.saveActivePolicy();\n break;\n\n case 'SERVICE_PROVIDER':\n delete this.context.serviceProviderPolicy[key];\n this.context.savePolicies();\n break;\n\n case 'USER':\n delete this.context.userPolicies[key];\n\n if (key === this.context.activeUserPolicy) {\n this.context.activeUserPolicy = undefined;\n this.context.saveActivePolicy();\n }\n\n this.context.savePolicies('USER');\n break;\n\n default:\n throw Error('Unknown policy source: ' + source);\n }\n }\n }, {\n key: \"messageBus\",\n get: function get() {\n var _this = this;\n\n return _this.context.messageBus;\n }\n /**\r\n * Set the messageBus in this Registry\r\n * @param {MessageBus} messageBus\r\n */\n ,\n set: function set(messageBus) {\n var _this = this;\n\n _this.context.messageBus = messageBus;\n\n _this.addGUIListeners();\n }\n }]);\n\n return PEP;\n}();\n\n/* harmony default export */ var policy_PEP = __webpack_exports__[\"default\"] = (PEP_PEP);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L0FjdGlvbnNTZXJ2aWNlLmpzPzllNzIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9PcGVyYXRvcnMuanM/M2IyZiIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L1BEUC5qcz8yMmVkIiwid2VicGFjazovL1tuYW1lXS8uL3NyYy9wb2xpY3kvY29uZGl0aW9ucy9Db25kaXRpb24uanM/MzMxNSIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L2NvbmRpdGlvbnMvU3Vic2NyaXB0aW9uQ29uZGl0aW9uLmpzPzdlMWIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9jb25kaXRpb25zL0FkdmFuY2VkQ29uZGl0aW9uLmpzPzljMzIiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9SdWxlLmpzPzVkZDgiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL3BvbGljeS9Qb2xpY3kuanM/ZDFhZCIsIndlYnBhY2s6Ly9bbmFtZV0vLi9zcmMvcG9saWN5L1BFUC5qcz85YTFmIl0sInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEFjdGlvbnNTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoY29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICB9XHJcblxyXG4gIGVuZm9yY2VQb2xpY2llcyhtZXNzYWdlLCBpc0luY29taW5nTWVzc2FnZSkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBsZXQgcG9saWNpZXMgPSBfdGhpcy5jb250ZXh0LmdldFBvbGljaWVzKG1lc3NhZ2UsIGlzSW5jb21pbmdNZXNzYWdlKTtcclxuXHJcbiAgICAgIGlmIChwb2xpY2llcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHBvbGljaWVzLnNlcnZpY2VQcm92aWRlclBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBwb2xpY2llcy5zZXJ2aWNlUHJvdmlkZXJQb2xpY3kuZW5mb3JjZUFjdGlvbnMoX3RoaXMuY29udGV4dCwgbWVzc2FnZSkudGhlbihtZXNzYWdlcyA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZXMpO1xyXG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHBvbGljaWVzLnVzZXJQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBwb2xpY2llcy51c2VyUG9saWN5LmVuZm9yY2VBY3Rpb25zKF90aGlzLmNvbnRleHQsIG1lc3NhZ2UpLnRoZW4obWVzc2FnZXMgPT4ge1xyXG4gICAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZXMpO1xyXG4gICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoW21lc3NhZ2VdKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShbbWVzc2FnZV0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGZvcndhcmRUb0lEKG1lc3NhZ2UsIGVtYWlsKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgaWYgKCFfdGhpcy5jb250ZXh0LnJ1bnRpbWVSZWdpc3RyeSkgdGhyb3cgbmV3IEVycm9yKCdmb3J3YXJkIG1lc3NhZ2UgdG8gZ2l2ZW4gSUQgaXMgdW5zdXBwb3J0ZWQgaW4gdGhpcyBlbnZpcm9ubWVudCcpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5jb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5oeXBlcnRpZXNMaXN0WzBdLmh5cGVydHlVUkwgPT09IG1lc3NhZ2UudG8pIHtcclxuICAgICAgICBsZXQgc3BsaXRUbyA9IChtZXNzYWdlLnRvKS5zcGxpdCgnOi8vJyk7XHJcbiAgICAgICAgaWYgKHNwbGl0VG9bMF0gIT09ICdydW50aW1lJykge1xyXG4gICAgICAgICAgX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZGlzY292ZXJIeXBlcnR5UGVyVXNlcihlbWFpbCkudGhlbihyZXN1bHQgPT4ge1xyXG4gICAgICAgICAgICBtZXNzYWdlLnRvID0gcmVzdWx0Lmh5cGVydHlVUkw7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UuYm9keS52aWEgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHJlc29sdmUobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIF90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5Ll9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBmb3J3YXJkVG9IeXBlcnR5KG1lc3NhZ2UsIGh5cGVydHlVUkwpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICBpZiAoIV90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5KSB0aHJvdyBuZXcgRXJyb3IoJ2ZvcndhcmQgbWVzc2FnZSB0byBnaXZlbiBJRCBpcyB1bnN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50Jyk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGlmIChfdGhpcy5jb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5oeXBlcnRpZXNMaXN0WzBdLmh5cGVydHlVUkwgPT09IG1lc3NhZ2UudG8pIHtcclxuICAgICAgICBsZXQgc3BsaXRUbyA9IChtZXNzYWdlLnRvKS5zcGxpdCgnOi8vJyk7XHJcbiAgICAgICAgaWYgKHNwbGl0VG9bMF0gIT09ICdydW50aW1lJykge1xyXG4gICAgICAgICAgbWVzc2FnZS50byA9IGh5cGVydHlVUkw7XHJcbiAgICAgICAgICBtZXNzYWdlLmJvZHkudmlhID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgICAgIF90aGlzLmNvbnRleHQucnVudGltZVJlZ2lzdHJ5Ll9tZXNzYWdlQnVzLnBvc3RNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXNvbHZlKG1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbmRBdXRvbWF0aWNNZXNzYWdlKG1lc3NhZ2UsIHRleHQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgbGV0IGF1dG9tYXRpY01lc3NhZ2UgPSB7XHJcbiAgICAgICAgZnJvbTogbWVzc2FnZS50byxcclxuICAgICAgICB0bzogbWVzc2FnZS5mcm9tLFxyXG4gICAgICAgIGJvZHk6IHtcclxuICAgICAgICAgIHZhbHVlOiB0ZXh0XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0eXBlOiBtZXNzYWdlLnR5cGVcclxuICAgICAgfTtcclxuICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgX3RoaXMuY29udGV4dC5ydW50aW1lUmVnaXN0cnkuX21lc3NhZ2VCdXMucG9zdE1lc3NhZ2UoYXV0b21hdGljTWVzc2FnZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBY3Rpb25zU2VydmljZTtcclxuIiwiY2xhc3MgT3BlcmF0b3JzIHtcclxuXHJcbiAgYW5kKHBhcmFtcykge1xyXG4gICAgcmV0dXJuIHBhcmFtc1swXSAmJiBwYXJhbXNbMV07XHJcbiAgfVxyXG5cclxuICBiZXR3ZWVuKHBhcmFtcykge1xyXG4gICAgbGV0IHN0YXJ0ID0gcGFyc2VJbnQocGFyYW1zWzBdWzBdKTtcclxuICAgIGxldCBlbmQgPSBwYXJzZUludChwYXJhbXNbMF1bMV0pO1xyXG4gICAgbGV0IG5vdyA9IHBhcmFtc1sxXTtcclxuXHJcbiAgICBpZiAoZW5kIDwgc3RhcnQpIHtcclxuICAgICAgbm93ID0gKG5vdyA8IHN0YXJ0KSA/IG5vdyArPSAyNDAwIDogbm93O1xyXG4gICAgICBlbmQgKz0gMjQwMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKG5vdyA+IHN0YXJ0ICYmIG5vdyA8IGVuZCk7XHJcbiAgfVxyXG5cclxuICBlcXVhbHMocGFyYW1zKSB7XHJcbiAgICByZXR1cm4gU3RyaW5nKHBhcmFtc1swXSkgPT09ICcqJyB8fCBTdHJpbmcocGFyYW1zWzBdKSA9PT0gU3RyaW5nKHBhcmFtc1sxXSk7XHJcbiAgfVxyXG5cclxuICBncmVhdGVyVGhhbihwYXJhbXMpIHtcclxuICAgIHJldHVybiBwYXJhbXNbMV0gPiBwYXJhbXNbMF07XHJcbiAgfVxyXG5cclxuICBpbihwYXJhbXMpIHtcclxuICAgIHJldHVybiBwYXJhbXNbMF0uaW5kZXhPZihwYXJhbXNbMV0pID4gLTE7XHJcbiAgfVxyXG5cclxuICBsZXNzVGhhbihwYXJhbXMpIHtcclxuICAgIHJldHVybiBwYXJhbXNbMV0gPCBwYXJhbXNbMF07XHJcbiAgfVxyXG5cclxuICBub3QocGFyYW1zKSB7XHJcbiAgICByZXR1cm4gIXBhcmFtc1swXTtcclxuICB9XHJcblxyXG4gIG9yKHBhcmFtcykge1xyXG4gICAgcmV0dXJuIHBhcmFtc1swXSB8fCBwYXJhbXNbMV07XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgT3BlcmF0b3JzO1xyXG4iLCJpbXBvcnQgT3BlcmF0b3JzIGZyb20gJy4vT3BlcmF0b3JzJztcclxuXHJcbi8qKlxyXG4qIFRoZSBQb2xpY3kgRGVjaXNpb24gUG9pbnQgKFBEUCkgZGVjaWRlcyBpZiBhIG1lc3NhZ2UgaXMgdG8gYmUgYXV0aG9yaXNlZCBieSBjaGVja2luZyBhIHNldCBvZlxyXG4qIHBvbGljaWVzLiBUaGUgcmVzb3VyY2UgdG8gYmUgdmVyaWZpZWQgaXMgc3BlY2lmaWVkIGluIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSAnY29uZGl0aW9uJyBmaWVsZCBvZlxyXG4qIGEgUG9saWN5IG9iamVjdC4gVGhlIGltcGxlbWVudGF0aW9uIHRoYXQgdmVyaWZpZXMgaWYgdGhlIG1lc3NhZ2UgaXMgY29tcGxpYW50IHdpdGggYSBwb2xpY3kgaXNcclxuKiBzcGVjaWZpZWQgaW4gYSBoYXNodGFibGUgdG8gYWxsb3cgZHluYW1pYyBkZWZpbml0aW9uIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgcHJvdmlkaW5nXHJcbiogZXh0ZW5zaWJpbGl0eSB0byB0aGUgUG9saWN5IEVuZ2luZSBmdW5jdGlvbmFsaXRpZXMuXHJcbiovXHJcbmNsYXNzIFBEUCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLm9wZXJhdG9ycyA9IG5ldyBPcGVyYXRvcnMoKTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlUG9saWNpZXMobWVzc2FnZSwgaXNJbmNvbWluZ01lc3NhZ2UpIHtcclxuICAgIGxldCBwb2xpY2llcyA9IHRoaXMuY29udGV4dC5nZXRQb2xpY2llcyhtZXNzYWdlLCBpc0luY29taW5nTWVzc2FnZSk7XHJcbiAgICBsZXQgcmVzdWx0ID0gJ05vdCBBcHBsaWNhYmxlJztcclxuICAgIGlmIChwb2xpY2llcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuZXZhbHVhdGVQb2xpY3kobWVzc2FnZSwgcG9saWNpZXMuc2VydmljZVByb3ZpZGVyUG9saWN5LCBpc0luY29taW5nTWVzc2FnZSk7XHJcbiAgICAgIGlmIChyZXN1bHQgfHwgcmVzdWx0ID09PSAnTm90IEFwcGxpY2FibGUnKSB7XHJcbiAgICAgICAgbGV0IHVzZXJSZXN1bHQgPSB0aGlzLmV2YWx1YXRlUG9saWN5KG1lc3NhZ2UsIHBvbGljaWVzLnVzZXJQb2xpY3ksIGlzSW5jb21pbmdNZXNzYWdlKTtcclxuICAgICAgICBpZiAodXNlclJlc3VsdCAhPT0gJ05vdCBBcHBsaWNhYmxlJykge1xyXG4gICAgICAgICAgcmVzdWx0ID0gdXNlclJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgZXZhbHVhdGVQb2xpY3kobWVzc2FnZSwgcG9saWN5LCBpc0luY29taW5nKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gJ05vdCBBcHBsaWNhYmxlJztcclxuICAgIGlmIChwb2xpY3kpIHtcclxuICAgICAgcmVzdWx0ID0gcG9saWN5LmV2YWx1YXRlUnVsZXModGhpcy5jb250ZXh0LCBtZXNzYWdlLCBpc0luY29taW5nKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBEUDtcclxuIiwiLyoqXHJcbiogQ29weXJpZ2h0IDIwMTYgUFQgSW5vdmHDp8OjbyBlIFNpc3RlbWFzIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgSU5FU0MtSURcclxuKiBDb3B5cmlnaHQgMjAxNiBRVU9CSVMgTkVUV09SS1MgU0xcclxuKiBDb3B5cmlnaHQgMjAxNiBGUkFVTkhPRkVSLUdFU0VMTFNDSEFGVCBaVVIgRk9FUkRFUlVORyBERVIgQU5HRVdBTkRURU4gRk9SU0NIVU5HIEUuVlxyXG4qIENvcHlyaWdodCAyMDE2IE9SQU5HRSBTQVxyXG4qIENvcHlyaWdodCAyMDE2IERldXRzY2hlIFRlbGVrb20gQUdcclxuKiBDb3B5cmlnaHQgMjAxNiBBcGl6ZWVcclxuKiBDb3B5cmlnaHQgMjAxNiBURUNITklTQ0hFIFVOSVZFUlNJVEFUIEJFUkxJTlxyXG4qXHJcbiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcclxuKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXHJcbiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XHJcbipcclxuKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxyXG4qXHJcbiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxyXG4qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcclxuKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cclxuKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXHJcbiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXHJcbioqL1xyXG5cclxuaW1wb3J0IE9wZXJhdG9ycyBmcm9tICcuLi9PcGVyYXRvcnMnO1xyXG5cclxuLyoqXHJcbiogQGF1dGhvciBBbmEgQ2FsZGVpcmEgPGFuYS5jYWxkZWlyYUB0ZWNuaWNvLnVsaXNib2EucHQ+XHJcbiogQGNsYXNzZGVzYyBDbGFzcyB0byByZXByZXNlbnQgYSBjb25kaXRpb24gYW5kIGV2YWx1YXRlIGl0cyBhcHBsaWNhYmlsaXR5LlxyXG4qL1xyXG5jbGFzcyBDb25kaXRpb24ge1xyXG5cclxuICAvKipcclxuICAqIENyZWF0ZXMgYSBuZXcgQ29uZGl0aW9uLlxyXG4gICogQGNsYXNzXHJcbiAgKiBAcGFyYW0gIHtzdHJpbmd9ICBhdHRyaWJ1dGVcclxuICAqIEBwYXJhbSAge3N0cmluZ30gIG9wZXJhdG9yXHJcbiAgKiBAcGFyYW0gIHsqfSAgICAgICBwYXJhbXNcclxuICAqL1xyXG4gIGNvbnN0cnVjdG9yKGF0dHJpYnV0ZSwgb3BlcmF0b3IsIHBhcmFtcykge1xyXG4gICAgdGhpcy5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7XHJcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3I7XHJcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcclxuICAgIHRoaXMub3BlcmF0b3JzID0gbmV3IE9wZXJhdG9ycygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBWZXJpZmllcyBpZiB0aGUgY29uZGl0aW9uIGlzIGFwcGxpY2FibGUgdG8gdGhlIG1lc3NhZ2UuIEZpcnN0LCB0aGUgc3lzdGVtIHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGF0dHJpYnV0ZSBpcyByZXRyaWV2ZWQ7IHRoZW4sIHRoYXQgdmFsdWUgaXMgY29tcGFyZWQgd2l0aCB0aGUgcGFyYW1ldGVyIHNwZWNpZmllZCBpbiB0aGUgY29uZGl0aW9uIGJ5IGV4ZWN1dGluZyB0aGUgb3BlcmF0b3IgaW1wbGVtZW50YXRpb24uIElmIHRoZSBvcGVyYXRvciBpcyAnaW4nIGFuZCB0aGUgbmFtZSBvZiBhIGdyb3VwIGlzIGdpdmVuLCB0aGVuIHRoZSBhcnJheSBob2xkaW5nIHRoZSBtZW1iZXJzIG9mIHRoZSBncm91cCBpcyByZXRyaWV2ZWQgYmVmb3JlIHRoZSBjb21wYXJpc29uLlxyXG4gICogQHBhcmFtICB7T2JqZWN0fSAgICBjb250ZXh0ICAgZW52aXJvbm1lbnQgd2hlcmUgdGhlIFBvbGljeSBFbmdpbmUgaXMgYmVpbmcgdXNlZFxyXG4gICogQHBhcmFtICB7T2JqZWN0fSAgICBtZXNzYWdlXHJcbiAgKi9cclxuICBpc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSkge1xyXG4gICAgY29udGV4dFt0aGlzLmF0dHJpYnV0ZV0gPSB7IG1lc3NhZ2U6IG1lc3NhZ2UgfTtcclxuICAgIGxldCB2YWx1ZSA9IGNvbnRleHRbdGhpcy5hdHRyaWJ1dGVdO1xyXG4gICAgbGV0IHRlbXBQYXJhbTtcclxuXHJcbiAgICBpZiAodGhpcy5vcGVyYXRvciA9PT0gJ2luJykge1xyXG4gICAgICBpZiAoIShBcnJheS5pc0FycmF5KHRoaXMucGFyYW1zKSkpIHtcclxuICAgICAgICB0ZW1wUGFyYW0gPSBjb250ZXh0LmdldEdyb3VwKHRoaXMucGFyYW1zLCBtZXNzYWdlLnRvKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcGVyYXRvcnNbdGhpcy5vcGVyYXRvcl0oW3RlbXBQYXJhbSwgdmFsdWVdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLm9wZXJhdG9yc1t0aGlzLm9wZXJhdG9yXShbdGhpcy5wYXJhbXMsIHZhbHVlXSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29uZGl0aW9uO1xyXG4iLCIvKipcclxuKiBDb3B5cmlnaHQgMjAxNiBQVCBJbm92YcOnw6NvIGUgU2lzdGVtYXMgU0FcclxuKiBDb3B5cmlnaHQgMjAxNiBJTkVTQy1JRFxyXG4qIENvcHlyaWdodCAyMDE2IFFVT0JJUyBORVRXT1JLUyBTTFxyXG4qIENvcHlyaWdodCAyMDE2IEZSQVVOSE9GRVItR0VTRUxMU0NIQUZUIFpVUiBGT0VSREVSVU5HIERFUiBBTkdFV0FORFRFTiBGT1JTQ0hVTkcgRS5WXHJcbiogQ29weXJpZ2h0IDIwMTYgT1JBTkdFIFNBXHJcbiogQ29weXJpZ2h0IDIwMTYgRGV1dHNjaGUgVGVsZWtvbSBBR1xyXG4qIENvcHlyaWdodCAyMDE2IEFwaXplZVxyXG4qIENvcHlyaWdodCAyMDE2IFRFQ0hOSVNDSEUgVU5JVkVSU0lUQVQgQkVSTElOXHJcbipcclxuKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xyXG4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cclxuKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcclxuKlxyXG4qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXHJcbipcclxuKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXHJcbiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxyXG4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxyXG4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcclxuKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKiovXHJcblxyXG5pbXBvcnQgQ29uZGl0aW9uIGZyb20gJy4vQ29uZGl0aW9uJztcclxuXHJcbi8qKlxyXG4qIEBhdXRob3IgQW5hIENhbGRlaXJhIDxhbmEuY2FsZGVpcmFAdGVjbmljby51bGlzYm9hLnB0PlxyXG4qIEBjbGFzc2Rlc2MgQ2xhc3MgdG8gcmVwcmVzZW50IGEgc3Vic2NyaXB0aW9uIGNvbmRpdGlvbiBhbmQgZXZhbHVhdGUgaXRzIGFwcGxpY2FiaWxpdHkuXHJcbiovXHJcbmNsYXNzIFN1YnNjcmlwdGlvbkNvbmRpdGlvbiBleHRlbmRzIENvbmRpdGlvbiB7XHJcblxyXG4gIC8qKlxyXG4gICogQ3JlYXRlcyBhIG5ldyBTdWJzY3JpcHRpb25Db25kaXRpb24uXHJcbiAgKiBAY2xhc3NcclxuICAqIEBwYXJhbSAge3N0cmluZ30gIGF0dHJpYnV0ZVxyXG4gICogQHBhcmFtICB7c3RyaW5nfSAgb3BlcmF0b3JcclxuICAqIEBwYXJhbSAgeyp9ICAgICAgIHBhcmFtc1xyXG4gICovXHJcbiAgY29uc3RydWN0b3IoYXR0cmlidXRlLCBvcGVyYXRvciwgcGFyYW1zKSB7XHJcbiAgICBzdXBlcihhdHRyaWJ1dGUsIG9wZXJhdG9yLCBwYXJhbXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBWZXJpZmllcyBpZiB0aGUgc3Vic2NyaXB0aW9uIGNvbmRpdGlvbiBpcyBhcHBsaWNhYmxlIHRvIHRoZSBtZXNzYWdlLiBGaXJzdCwgdmVyaWZpZXMgaWYgdGhlIG1lc3NhZ2UgaXMgb2YgdGhlIHN1YnNjcmlwdGlvbiB0eXBlOyBzZWNvbmQsIHZlcmlmaWVzIGlmIHRoZSBtZXNzYWdlIGlzIGZyb20gYSByZW1vdGUgcnVudGltZSB0byBndWFyYW50ZWUgdGhhdCB0aGUgc3Vic2NyaXB0aW9uIGlzIGJlaW5nIHZhbGlkYXRlZCBpbiB0aGUgZGVzdGluYXRpb24gcnVudGltZTsgdGhpcmQsIHZlcmlmaWVzIGlmIHRoZSBzdWJzY3JpcHRpb24gcHJlZmVyZW5jZSBpcyBtZXQuXHJcbiAgKiBAcGFyYW0gIHtPYmplY3R9ICAgIGNvbnRleHQgICBlbnZpcm9ubWVudCB3aGVyZSB0aGUgUG9saWN5IEVuZ2luZSBpcyBiZWluZyB1c2VkXHJcbiAgKiBAcGFyYW0gIHtPYmplY3R9ICAgIG1lc3NhZ2VcclxuICAqL1xyXG4gIGlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlKSB7XHJcbiAgICBsZXQgaXNTdWJzY3JpcHRpb24gPSBtZXNzYWdlLnR5cGUgPT09ICdzdWJzY3JpYmUnO1xyXG4gICAgbGV0IGlzRnJvbVJlbW90ZVNNID0gY29udGV4dC5pc0Zyb21SZW1vdGVTTShtZXNzYWdlLmZyb20pO1xyXG4gICAgaWYgKGlzU3Vic2NyaXB0aW9uICYgaXNGcm9tUmVtb3RlU00pIHtcclxuICAgICAgcmV0dXJuIHN1cGVyLmlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTdWJzY3JpcHRpb25Db25kaXRpb247XHJcbiIsImltcG9ydCBDb25kaXRpb24gZnJvbSAnLi9Db25kaXRpb24nO1xyXG5pbXBvcnQgT3BlcmF0b3JzIGZyb20gJy4uL09wZXJhdG9ycyc7XHJcbmltcG9ydCBTdWJzY3JpcHRpb25Db25kaXRpb24gZnJvbSAnLi9TdWJzY3JpcHRpb25Db25kaXRpb24nO1xyXG5cclxuY2xhc3MgQWR2YW5jZWRDb25kaXRpb24ge1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb25kaXRpb24pIHtcclxuICAgIHRoaXMub3BlcmF0b3JzID0gbmV3IE9wZXJhdG9ycygpO1xyXG4gICAgaWYgKGNvbmRpdGlvbi5vcGVyYXRvcnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBjb25kaXRpb24gPSBjb25kaXRpb24uY29uZGl0aW9uO1xyXG4gICAgfVxyXG4gICAgY29uZGl0aW9uID0gdGhpcy5idWlsZENvbmRpdGlvbihjb25kaXRpb24pO1xyXG4gICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XHJcbiAgfVxyXG5cclxuICBidWlsZENvbmRpdGlvbihjb25kaXRpb24pIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmRpdGlvblsxXSkpIHtcclxuICAgICAgY29uZGl0aW9uWzFdID0gdGhpcy5idWlsZENvbmRpdGlvbihjb25kaXRpb25bMV0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGNvbmRpdGlvblsxXS5hdHRyaWJ1dGUgPT09ICdzdWJzY3JpcHRpb24nKSB7XHJcbiAgICAgICAgY29uZGl0aW9uWzFdID0gbmV3IFN1YnNjcmlwdGlvbkNvbmRpdGlvbihjb25kaXRpb25bMV0uYXR0cmlidXRlLCBjb25kaXRpb25bMV0ub3BlcmF0b3IsIGNvbmRpdGlvblsxXS5wYXJhbXMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbmRpdGlvblsxXSA9IG5ldyBDb25kaXRpb24oY29uZGl0aW9uWzFdLmF0dHJpYnV0ZSwgY29uZGl0aW9uWzFdLm9wZXJhdG9yLCBjb25kaXRpb25bMV0ucGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25kaXRpb25bMl0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25kaXRpb25bMl0pKSB7XHJcbiAgICAgICAgY29uZGl0aW9uWzJdID0gdGhpcy5idWlsZENvbmRpdGlvbihjb25kaXRpb25bMl0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChjb25kaXRpb25bMl0uYXR0cmlidXRlID09PSAnc3Vic2NyaXB0aW9uJykge1xyXG4gICAgICAgICAgY29uZGl0aW9uWzJdID0gbmV3IFN1YnNjcmlwdGlvbkNvbmRpdGlvbihjb25kaXRpb25bMl0uYXR0cmlidXRlLCBjb25kaXRpb25bMl0ub3BlcmF0b3IsIGNvbmRpdGlvblsyXS5wYXJhbXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25kaXRpb25bMl0gPSBuZXcgQ29uZGl0aW9uKGNvbmRpdGlvblsyXS5hdHRyaWJ1dGUsIGNvbmRpdGlvblsyXS5vcGVyYXRvciwgY29uZGl0aW9uWzJdLnBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29uZGl0aW9uO1xyXG4gIH1cclxuXHJcbiAgaXNBcHBsaWNhYmxlKGNvbnRleHQsIG1lc3NhZ2UsIHNjb3BlLCB0YXJnZXQsIG9wZXJhdG9yLCBsZWZ0LCByaWdodCkge1xyXG4gICAgaWYgKCFvcGVyYXRvcikge1xyXG4gICAgICBvcGVyYXRvciA9IHRoaXMuY29uZGl0aW9uWzBdO1xyXG4gICAgICBsZWZ0ID0gdGhpcy5jb25kaXRpb25bMV07XHJcbiAgICAgIHJpZ2h0ID0gdGhpcy5jb25kaXRpb25bMl07XHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUgKCEobGVmdCBpbnN0YW5jZW9mIENvbmRpdGlvbikgJiAhKGxlZnQgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb25Db25kaXRpb24pICYgKHR5cGVvZiBsZWZ0ICE9PSAnYm9vbGVhbicpKSB7XHJcbiAgICAgIGxlZnQgPSB0aGlzLmlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlLCBzY29wZSwgdGFyZ2V0LCBsZWZ0WzBdLCBsZWZ0WzFdLCBsZWZ0WzJdKTtcclxuICAgIH1cclxuICAgIGlmIChyaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHdoaWxlICghKHJpZ2h0IGluc3RhbmNlb2YgQ29uZGl0aW9uKSAmICEocmlnaHQgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb25Db25kaXRpb24pICYgKHR5cGVvZiByaWdodCAhPT0gJ2Jvb2xlYW4nKSkge1xyXG4gICAgICAgIHJpZ2h0ID0gdGhpcy5pc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSwgc2NvcGUsIHRhcmdldCwgcmlnaHRbMF0sIHJpZ2h0WzFdLCByaWdodFsyXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0TGVmdCA9ICh0eXBlb2YgbGVmdCA9PT0gJ2Jvb2xlYW4nKSA/IGxlZnQgOiBsZWZ0LmlzQXBwbGljYWJsZShjb250ZXh0LCBtZXNzYWdlLCBzY29wZSwgdGFyZ2V0KTtcclxuICAgIGxldCByZXN1bHRSaWdodDtcclxuICAgIGlmIChyaWdodCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJlc3VsdFJpZ2h0ID0gKHR5cGVvZiByaWdodCA9PT0gJ2Jvb2xlYW4nKSA/IHJpZ2h0IDogcmlnaHQuaXNBcHBsaWNhYmxlKGNvbnRleHQsIG1lc3NhZ2UsIHNjb3BlLCB0YXJnZXQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMub3BlcmF0b3JzW29wZXJhdG9yXShbcmVzdWx0TGVmdCwgcmVzdWx0UmlnaHRdKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBBZHZhbmNlZENvbmRpdGlvbjtcclxuIiwiaW1wb3J0IEFkdmFuY2VkQ29uZGl0aW9uIGZyb20gJy4vY29uZGl0aW9ucy9BZHZhbmNlZENvbmRpdGlvbic7XHJcbmltcG9ydCBDb25kaXRpb24gZnJvbSAnLi9jb25kaXRpb25zL0NvbmRpdGlvbic7XHJcbmltcG9ydCB7Z2V0VXNlckVtYWlsRnJvbVVSTCwgaXNEYXRhT2JqZWN0VVJMLCByZW1vdmVQYXRoRnJvbVVSTH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xyXG5pbXBvcnQgU3Vic2NyaXB0aW9uQ29uZGl0aW9uIGZyb20gJy4vY29uZGl0aW9ucy9BZHZhbmNlZENvbmRpdGlvbic7XHJcblxyXG5jbGFzcyBSdWxlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoZGVjaXNpb24sIGNvbmRpdGlvbiwgc2NvcGUsIHRhcmdldCwgcHJpb3JpdHkpIHtcclxuICAgIHRoaXMuZGVjaXNpb24gPSBkZWNpc2lvbjtcclxuICAgIHRoaXMuc2V0Q29uZGl0aW9uKGNvbmRpdGlvbik7XHJcbiAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7XHJcbiAgICB0aGlzLnNjb3BlID0gc2NvcGU7XHJcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICB9XHJcblxyXG4gIHNldENvbmRpdGlvbihjb25kaXRpb24pIHtcclxuICAgIGlmICghKGNvbmRpdGlvbiBpbnN0YW5jZW9mIENvbmRpdGlvbiB8fCBjb25kaXRpb24gaW5zdGFuY2VvZiBTdWJzY3JpcHRpb25Db25kaXRpb24gfHwgY29uZGl0aW9uIGluc3RhbmNlb2YgQWR2YW5jZWRDb25kaXRpb24pKSB7XHJcbiAgICAgIGxldCBhdHRyaWJ1dGUgPSBjb25kaXRpb24uYXR0cmlidXRlO1xyXG4gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkge1xyXG4gICAgICAgIGNhc2UgJ3N1YnNjcmlwdGlvbic6XHJcbiAgICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IG5ldyBTdWJzY3JpcHRpb25Db25kaXRpb24oY29uZGl0aW9uLmF0dHJpYnV0ZSwgY29uZGl0aW9uLm9wZXJhdG9yLCBjb25kaXRpb24ucGFyYW1zKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgdW5kZWZpbmVkOlxyXG4gICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBuZXcgQWR2YW5jZWRDb25kaXRpb24oY29uZGl0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IG5ldyBDb25kaXRpb24oY29uZGl0aW9uLmF0dHJpYnV0ZSwgY29uZGl0aW9uLm9wZXJhdG9yLCBjb25kaXRpb24ucGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBldmFsdWF0ZShjb250ZXh0LCBtZXNzYWdlLCBpc0luY29taW5nKSB7XHJcbiAgICBsZXQgZmllbGQgPSAoaXNJbmNvbWluZykgPyBtZXNzYWdlLnRvIDogbWVzc2FnZS5mcm9tO1xyXG4gICAgbGV0IGh5cGVydHlOYW1lO1xyXG4gICAgc3dpdGNoICh0aGlzLnNjb3BlKSB7XHJcbiAgICAgIGNhc2UgJ2dsb2JhbCc6XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdoeXBlcnR5JzpcclxuICAgICAgICBpZiAoaXNEYXRhT2JqZWN0VVJMKGZpZWxkKSkge1xyXG4gICAgICAgICAgbGV0IHJlcG9ydGVyID0gY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZ2V0UmVwb3J0ZXJVUkxTeW5jaG9ub3VzKHJlbW92ZVBhdGhGcm9tVVJMKGZpZWxkKSk7XHJcbiAgICAgICAgICBpZiAocmVwb3J0ZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBoeXBlcnR5TmFtZSA9IGNvbnRleHQucnVudGltZVJlZ2lzdHJ5LmdldEh5cGVydHlOYW1lKHJlcG9ydGVyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGZpZWxkLnNwbGl0KCc6Ly8nKVswXSA9PT0gJ2h5cGVydHknKSB7XHJcbiAgICAgICAgICAgIGh5cGVydHlOYW1lID0gY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZ2V0SHlwZXJ0eU5hbWUocmVtb3ZlUGF0aEZyb21VUkwoZmllbGQpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGh5cGVydHlOYW1lID09PSB0aGlzLnRhcmdldCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gJ05vdCBBcHBsaWNhYmxlJztcclxuXHJcbiAgICAgIGNhc2UgJ2lkZW50aXR5JzpcclxuICAgICAgICBsZXQgb3duZXI7XHJcblxyXG4gICAgICAgIGlmIChpc0RhdGFPYmplY3RVUkwoZmllbGQpKSB7XHJcbiAgICAgICAgICBsZXQgcmVwb3J0ZXIgPSBjb250ZXh0LnJ1bnRpbWVSZWdpc3RyeS5nZXRSZXBvcnRlclVSTFN5bmNob25vdXMocmVtb3ZlUGF0aEZyb21VUkwoZmllbGQpKTtcclxuICAgICAgICAgIG93bmVyID0gY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKHJlcG9ydGVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGZpZWxkLnNwbGl0KCc6Ly8nKVswXSA9PT0gJ2h5cGVydHknKSB7XHJcbiAgICAgICAgICAgIG93bmVyID0gY29udGV4dC5ydW50aW1lUmVnaXN0cnkuZ2V0SHlwZXJ0eU93bmVyKHJlbW92ZVBhdGhGcm9tVVJMKGZpZWxkKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvd25lciAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBvd25lciA9IGdldFVzZXJFbWFpbEZyb21VUkwob3duZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3duZXIgPT09IHRoaXMudGFyZ2V0KSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAnTm90IEFwcGxpY2FibGUnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmRpdGlvbi5pc0FwcGxpY2FibGUoY29udGV4dCwgbWVzc2FnZSwgdGhpcy5zY29wZSwgdGhpcy50YXJnZXQpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlY2lzaW9uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICdOb3QgQXBwbGljYWJsZSc7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBSdWxlO1xyXG4iLCJpbXBvcnQgQWxsb3dPdmVycmlkZXMgZnJvbSAnLi9jb21iaW5pbmdBbGdvcml0aG1zL0FsbG93T3ZlcnJpZGVzJztcclxuaW1wb3J0IEJsb2NrT3ZlcnJpZGVzIGZyb20gJy4vY29tYmluaW5nQWxnb3JpdGhtcy9CbG9ja092ZXJyaWRlcyc7XHJcbmltcG9ydCBGaXJzdEFwcGxpY2FibGUgZnJvbSAnLi9jb21iaW5pbmdBbGdvcml0aG1zL0ZpcnN0QXBwbGljYWJsZSc7XHJcbmltcG9ydCBSdWxlIGZyb20gJy4vUnVsZSc7XHJcblxyXG5jbGFzcyBQb2xpY3kge1xyXG5cclxuICBjb25zdHJ1Y3RvcihrZXksIHJ1bGVzLCBhY3Rpb25zLCBjb21iaW5pbmdBbGdvcml0aG0pIHtcclxuICAgIGlmICgha2V5KSB0aHJvdyBuZXcgRXJyb3IoJ2tleSBpcyBub3QgZGVmaW5lZCcpO1xyXG4gICAgaWYgKCFhY3Rpb25zKSB0aHJvdyBuZXcgRXJyb3IoJ2FjdGlvbnMgYXJlIG5vdCBkZWZpbmVkJyk7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25zID0gYWN0aW9ucztcclxuICAgIHRoaXMua2V5ID0ga2V5O1xyXG4gICAgdGhpcy5fc2V0UnVsZXMocnVsZXMpO1xyXG4gICAgdGhpcy5fc2V0Q29tYmluaW5nQWxnb3JpdGhtKGNvbWJpbmluZ0FsZ29yaXRobSk7XHJcbiAgfVxyXG5cclxuICBhZGRBY3Rpb24obWV0aG9kLCBwYXJhbSkge1xyXG4gICAgdGhpcy5hY3Rpb25zLnB1c2goeyBtZXRob2Q6IG1ldGhvZCwgcGFyYW06IHBhcmFtIH0pO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlUnVsZShkZWNpc2lvbiwgY29uZGl0aW9uLCBzY29wZSwgdGFyZ2V0LCBwcmlvcml0eSkge1xyXG4gICAgaWYgKHByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcHJpb3JpdHkgPSB0aGlzLmdldExhc3RQcmlvcml0eSgpICsgMTtcclxuICAgIH1cclxuICAgIGxldCBydWxlID0gbmV3IFJ1bGUoZGVjaXNpb24sIGNvbmRpdGlvbiwgc2NvcGUsIHRhcmdldCwgcHJpb3JpdHkpO1xyXG4gICAgdGhpcy5ydWxlcy5wdXNoKHJ1bGUpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlUnVsZShydWxlKSB7XHJcbiAgICBsZXQgaW5kZXhUb1JlbW92ZSA9IHRoaXMucnVsZXMuaW5kZXhPZihydWxlKTtcclxuICAgIHRoaXMucnVsZXMuc3BsaWNlKGluZGV4VG9SZW1vdmUsIDEpO1xyXG4gIH1cclxuXHJcbiAgZW5mb3JjZUFjdGlvbnMoY29udGV4dCwgbWVzc2FnZSkge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcclxuICAgICAgaWYgKHRoaXMuYWN0aW9ucy5sZW5ndGggIT09IDApIHtcclxuICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMuYWN0aW9ucykge1xyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IGNvbnRleHQucGVwLmFjdGlvbnNTZXJ2aWNlW3RoaXMuYWN0aW9uc1tpXS5tZXRob2RdKG1lc3NhZ2UsIHRoaXMuYWN0aW9uc1tpXS5wYXJhbSk7XHJcbiAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgUHJvbWlzZS5hbGwocmVzdWx0cykudGhlbigobWVzc2FnZXMpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUobWVzc2FnZXMpO1xyXG4gICAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzb2x2ZShbbWVzc2FnZV0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV2YWx1YXRlUnVsZXMoY29udGV4dCwgbWVzc2FnZSwgaXNJbmNvbWluZykge1xyXG4gICAgbGV0IHJlc3VsdHMgPSBbXTtcclxuICAgIGZvciAobGV0IGkgaW4gdGhpcy5ydWxlcykge1xyXG4gICAgICByZXN1bHRzLnB1c2godGhpcy5ydWxlc1tpXS5ldmFsdWF0ZShjb250ZXh0LCBtZXNzYWdlLCBpc0luY29taW5nKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29tYmluaW5nQWxnb3JpdGhtLmNvbWJpbmUocmVzdWx0cyk7XHJcbiAgfVxyXG5cclxuICBnZXRMYXN0UHJpb3JpdHkoKSB7XHJcbiAgICBsZXQgcHJpb3JpdGllcyA9IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLnJ1bGVzLmxlbmd0aCAhPT0gMCkge1xyXG4gICAgICBmb3IgKGxldCBpIGluIHRoaXMucnVsZXMpIHtcclxuICAgICAgICBwcmlvcml0aWVzLnB1c2godGhpcy5ydWxlc1tpXS5wcmlvcml0eSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIE1hdGgubWF4LmFwcGx5KE1hdGgsIHByaW9yaXRpZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0UnVsZUJ5UHJpb3JpdHkocHJpb3JpdHkpIHtcclxuICAgIGZvciAobGV0IGkgaW4gdGhpcy5ydWxlcykge1xyXG4gICAgICBpZiAoU3RyaW5nKHRoaXMucnVsZXNbaV0ucHJpb3JpdHkpID09PSBTdHJpbmcocHJpb3JpdHkpKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucnVsZXNbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRocm93IEVycm9yKCdSdWxlIHdpdGggcHJpb3JpdHkgJyArIHByaW9yaXR5ICsgJyBkb2VzIG5vdCBleGlzdCEnKTtcclxuICB9XHJcblxyXG4gIF9zZXRDb21iaW5pbmdBbGdvcml0aG0oY29tYmluaW5nQWxnb3JpdGhtKSB7XHJcbiAgICBpZiAoIWNvbWJpbmluZ0FsZ29yaXRobSkge1xyXG4gICAgICBjb21iaW5pbmdBbGdvcml0aG0gPSAnYmxvY2tPdmVycmlkZXMnO1xyXG4gICAgfVxyXG4gICAgc3dpdGNoIChjb21iaW5pbmdBbGdvcml0aG0pIHtcclxuICAgICAgY2FzZSAnYmxvY2tPdmVycmlkZXMnOlxyXG4gICAgICAgIHRoaXMuY29tYmluaW5nQWxnb3JpdGhtID0gbmV3IEJsb2NrT3ZlcnJpZGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2FsbG93T3ZlcnJpZGVzJzpcclxuICAgICAgICB0aGlzLmNvbWJpbmluZ0FsZ29yaXRobSA9IG5ldyBBbGxvd092ZXJyaWRlcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdmaXJzdEFwcGxpY2FibGUnOlxyXG4gICAgICAgIHRoaXMuY29tYmluaW5nQWxnb3JpdGhtID0gbmV3IEZpcnN0QXBwbGljYWJsZSgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIGFsZ29yaXRobTogJyArIGNvbWJpbmluZ0FsZ29yaXRobSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfc2V0UnVsZXMocnVsZXMpIHtcclxuICAgIHRoaXMucnVsZXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBpIGluIHJ1bGVzKSB7XHJcbiAgICAgIGxldCBydWxlID0gcnVsZXNbaV07XHJcbiAgICAgIGlmIChydWxlLnByaW9yaXR5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBydWxlLnByaW9yaXR5ID0gdGhpcy5nZXRMYXN0UHJpb3JpdHkoKSArIDE7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCEocnVsZSBpbnN0YW5jZW9mIFJ1bGUpKSB7XHJcbiAgICAgICAgcnVsZSA9IG5ldyBSdWxlKHJ1bGUuZGVjaXNpb24sIHJ1bGUuY29uZGl0aW9uLCBydWxlLnNjb3BlLCBydWxlLnRhcmdldCwgcnVsZS5wcmlvcml0eSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5ydWxlcy5wdXNoKHJ1bGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc29ydFJ1bGVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucnVsZXMuc29ydChmdW5jdGlvbihhLCBiKSB7XHJcbiAgICAgIGxldCB4ID0gYS5wcmlvcml0eTsgbGV0IHkgPSBiLnByaW9yaXR5O1xyXG4gICAgICByZXR1cm4gKCh4IDwgeSkgPyAtMSA6ICgoeCA+IHkpID8gMSA6IDApKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFBvbGljeTtcclxuIiwiLy8gTG9nIFN5c3RlbVxyXG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnbG9nbGV2ZWwnO1xyXG5sZXQgbG9nID0gbG9nZ2VyLmdldExvZ2dlcignUEVQJyk7XHJcblxyXG5pbXBvcnQgQWN0aW9uc1NlcnZpY2UgZnJvbSAnLi9BY3Rpb25zU2VydmljZSc7XHJcbmltcG9ydCBQRFAgZnJvbSAnLi9QRFAnO1xyXG5pbXBvcnQgUG9saWN5IGZyb20gJy4vUG9saWN5JztcclxuaW1wb3J0IHtpc0h5cGVydHlVUkx9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuXHJcbmNsYXNzIFBFUCB7XHJcblxyXG4gIC8qKlxyXG4gICogQ3JlYXRlcyBhIFBvbGljeSBFbmZvcmNlbWVudCBQb2ludCAoUEVQKSBpbnN0YW5jZVxyXG4gICogQHBhcmFtICAgIHtPYmplY3R9ICAgIGNvbnRleHRcclxuICAqL1xyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQpIHtcclxuICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgX3RoaXMucGRwID0gbmV3IFBEUChjb250ZXh0KTtcclxuICAgIF90aGlzLmFjdGlvbnNTZXJ2aWNlID0gbmV3IEFjdGlvbnNTZXJ2aWNlKGNvbnRleHQpO1xyXG4gICAgX3RoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICBjb250ZXh0LnBlcCA9IF90aGlzO1xyXG5cclxuICAgIC8vVE9ETyBzaG91bGQgYmUgYWRkZWQgYSB0cmlnZ2VyIHRvIHZlcmlmeSB3aGVuIHRoZSBsb2FkQ29uZmlndXJhdGlvbnMgaXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZFxyXG4gICAgY29udGV4dC5sb2FkQ29uZmlndXJhdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogcmV0dXJuIHRoZSBtZXNzYWdlQnVzIGluIHRoaXMgUmVnaXN0cnlcclxuICAqIEBwYXJhbSB7TWVzc2FnZUJ1c30gICAgICAgICAgIG1lc3NhZ2VCdXNcclxuICAqL1xyXG4gIGdldCBtZXNzYWdlQnVzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuICAgIHJldHVybiBfdGhpcy5jb250ZXh0Lm1lc3NhZ2VCdXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIFNldCB0aGUgbWVzc2FnZUJ1cyBpbiB0aGlzIFJlZ2lzdHJ5XHJcbiAgKiBAcGFyYW0ge01lc3NhZ2VCdXN9ICAgICAgICAgICBtZXNzYWdlQnVzXHJcbiAgKi9cclxuICBzZXQgbWVzc2FnZUJ1cyhtZXNzYWdlQnVzKSB7XHJcbiAgICBsZXQgX3RoaXMgPSB0aGlzO1xyXG4gICAgX3RoaXMuY29udGV4dC5tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcclxuICAgIF90aGlzLmFkZEdVSUxpc3RlbmVycygpO1xyXG4gIH1cclxuXHJcbiAgYWRkR1VJTGlzdGVuZXJzKCkge1xyXG4gICAgbGV0IF90aGlzID0gdGhpcztcclxuXHJcbiAgICBfdGhpcy5jb250ZXh0Lm1lc3NhZ2VCdXMuYWRkTGlzdGVuZXIoX3RoaXMuY29udGV4dC5wZXBVUkwsIChtc2cpID0+IHtcclxuICAgICAgbGV0IGZ1bmNOYW1lID0gbXNnLmJvZHkubWV0aG9kO1xyXG5cclxuICAgICAgbGV0IHJldHVybmVkVmFsdWU7XHJcbiAgICAgIGlmIChmdW5jTmFtZSA9PT0gJ2FkZFRvR3JvdXAnKSB7XHJcbiAgICAgICAgbGV0IGdyb3VwTmFtZSA9IG1zZy5ib2R5LnBhcmFtcy5ncm91cE5hbWU7XHJcbiAgICAgICAgbGV0IHVzZXJFbWFpbCA9IG1zZy5ib2R5LnBhcmFtcy51c2VyRW1haWw7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuYWRkVG9Hcm91cChncm91cE5hbWUsIHVzZXJFbWFpbCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdjcmVhdGVHcm91cCcpIHtcclxuICAgICAgICBsZXQgZ3JvdXBOYW1lID0gbXNnLmJvZHkucGFyYW1zLmdyb3VwTmFtZTtcclxuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC5jcmVhdGVHcm91cChncm91cE5hbWUpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnYWRkUG9saWN5Jykge1xyXG4gICAgICAgIGxldCBzb3VyY2UgPSBtc2cuYm9keS5wYXJhbXMuc291cmNlO1xyXG4gICAgICAgIGxldCBrZXkgPSBtc2cuYm9keS5wYXJhbXMua2V5O1xyXG4gICAgICAgIGxldCBwb2xpY3kgPSBtc2cuYm9keS5wYXJhbXMucG9saWN5O1xyXG4gICAgICAgIGxldCBjb21iaW5pbmdBbGdvcml0aG0gPSBtc2cuYm9keS5wYXJhbXMuY29tYmluaW5nQWxnb3JpdGhtO1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5hZGRQb2xpY3koc291cmNlLCBrZXksIHBvbGljeSwgY29tYmluaW5nQWxnb3JpdGhtKTtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2RlbGV0ZUdyb3VwJykge1xyXG4gICAgICAgIGxldCBncm91cE5hbWUgPSBtc2cuYm9keS5wYXJhbXMuZ3JvdXBOYW1lO1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LmRlbGV0ZUdyb3VwKGdyb3VwTmFtZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdyZW1vdmVQb2xpY3knKSB7XHJcbiAgICAgICAgbGV0IHNvdXJjZSA9IG1zZy5ib2R5LnBhcmFtcy5zb3VyY2U7XHJcbiAgICAgICAgbGV0IGtleSA9IG1zZy5ib2R5LnBhcmFtcy5rZXk7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLnJlbW92ZVBvbGljeShzb3VyY2UsIGtleSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdzYXZlUG9saWNpZXMnKSB7XHJcbiAgICAgICAgbGV0IHNvdXJjZSA9IG1zZy5ib2R5LnBhcmFtcy5zb3VyY2U7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuc2F2ZVBvbGljaWVzKHNvdXJjZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICd1c2VyUG9saWNpZXMnKSB7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQudXNlclBvbGljaWVzO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnYWN0aXZlVXNlclBvbGljeScpIHtcclxuICAgICAgICBsZXQgdXNlclBvbGljeSA9IG1zZy5ib2R5LnBhcmFtcy51c2VyUG9saWN5O1xyXG4gICAgICAgIGlmICh1c2VyUG9saWN5KSB7IF90aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeSA9IHVzZXJQb2xpY3k7IH1cclxuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC5hY3RpdmVVc2VyUG9saWN5O1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAndXNlclBvbGljeScpIHtcclxuICAgICAgICBsZXQga2V5ID0gbXNnLmJvZHkucGFyYW1zLmtleTtcclxuICAgICAgICByZXR1cm5lZFZhbHVlID0gX3RoaXMuY29udGV4dC51c2VyUG9saWNpZXNba2V5XTtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ3NhdmVBY3RpdmVQb2xpY3knKSB7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuc2F2ZUFjdGl2ZVBvbGljeSgpO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnZ2V0TXlFbWFpbHMnKSB7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuZ2V0TXlFbWFpbHMoKTtcclxuICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZSA9PT0gJ2dldE15SHlwZXJ0aWVzJykge1xyXG4gICAgICAgIHJldHVybmVkVmFsdWUgPSBfdGhpcy5jb250ZXh0LmdldE15SHlwZXJ0aWVzKCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZnVuY05hbWUgPT09ICdncm91cHMnKSB7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuZ3JvdXBzO1xyXG4gICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lID09PSAnZ2V0R3JvdXBzTmFtZXMnKSB7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQuZ2V0R3JvdXBzTmFtZXMoKTtcclxuICAgICAgfSBpZiAoZnVuY05hbWUgPT09ICdyZW1vdmVGcm9tR3JvdXAnKSB7XHJcbiAgICAgICAgbGV0IGdyb3VwTmFtZSA9IG1zZy5ib2R5LnBhcmFtcy5ncm91cE5hbWU7XHJcbiAgICAgICAgbGV0IHVzZXJFbWFpbCA9IG1zZy5ib2R5LnBhcmFtcy51c2VyRW1haWw7XHJcbiAgICAgICAgcmV0dXJuZWRWYWx1ZSA9IF90aGlzLmNvbnRleHQucmVtb3ZlRnJvbUdyb3VwKGdyb3VwTmFtZSwgdXNlckVtYWlsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHZhbHVlID0ge3R5cGU6ICdleGVjdXRlJywgdmFsdWU6IHJldHVybmVkVmFsdWUsIGNvZGU6IDIwMH07XHJcbiAgICAgIGxldCByZXBseU1zZyA9IHtpZDogbXNnLmlkLCB0eXBlOiAncmVzcG9uc2UnLCB0bzogbXNnLmZyb20sIGZyb206IG1zZy50bywgYm9keTogdmFsdWV9O1xyXG4gICAgICBfdGhpcy5jb250ZXh0Lm1lc3NhZ2VCdXMucG9zdE1lc3NhZ2UocmVwbHlNc2cpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEFkZHMgYSBwb2xpY3kgdG8gdGhlIFBvbGljeSBFbmZvcmNlbWVudCBQb2ludCAoUEVQKS4gVGhlIHBvbGljeSBjYW4gYmUgY3JlYXRlZCBieSB0aGUgc2VydmljZVxyXG4gICogcHJvdmlkZXIgb3IgYnkgdGhlIHVzZXIuXHJcbiAgKiBAcGFyYW0gICAge1N0cmluZ30gICAgc291cmNlXHJcbiAgKiBAcGFyYW0gICAge1N0cmluZ30gICAga2V5XHJcbiAgKiBAcGFyYW0gICAge09iamVjdH0gICAgcG9saWN5XHJcbiAgKi9cclxuICBhZGRQb2xpY3koc291cmNlLCBrZXksIHBvbGljeSwgY29tYmluaW5nQWxnb3JpdGhtKSB7XHJcbiAgICBpZiAoIXNvdXJjZSkgdGhyb3cgbmV3IEVycm9yKCdzb3VyY2UgaXMgbm90IGRlZmluZWQnKTtcclxuICAgIGlmICgha2V5KSB0aHJvdyBuZXcgRXJyb3IoJ2tleSBpcyBub3QgZGVmaW5lZCcpO1xyXG5cclxuICAgIGlmIChwb2xpY3kgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBwb2xpY3kgPSBuZXcgUG9saWN5KGtleSwgW10sIFtdLCBjb21iaW5pbmdBbGdvcml0aG0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCEocG9saWN5IGluc3RhbmNlb2YgUG9saWN5KSkge1xyXG4gICAgICAgIHBvbGljeSA9IG5ldyBQb2xpY3kocG9saWN5LmtleSwgcG9saWN5LnJ1bGVzLCBwb2xpY3kuYWN0aW9ucywgcG9saWN5LmNvbWJpbmluZ0FsZ29yaXRobSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHNvdXJjZSkge1xyXG4gICAgICBjYXNlICdTRVJWSUNFX1BST1ZJREVSJzpcclxuICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZVBvbGljaWVzKHNvdXJjZSwgcG9saWN5LCBrZXkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdVU0VSJzpcclxuICAgICAgICB0aGlzLmNvbnRleHQudXNlclBvbGljaWVzW2tleV0gPSBwb2xpY3k7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcyhzb3VyY2UpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIHBvbGljeSBzb3VyY2U6ICcgKyBzb3VyY2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXV0aG9yaXNlKG1lc3NhZ2UsIGlzSW5jb21pbmcpIHtcclxuICAgIC8vIGxvZy5sb2coJ1tQb2xpY3kuUEVQIEF1dGhvcmlzZV0gJywgbWVzc2FnZSk7XHJcbiAgICAvLyBsb2cubG9nKG1lc3NhZ2UpO1xyXG4gICAgaWYgKCFtZXNzYWdlKSB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgaXMgbm90IGRlZmluZWQnKTtcclxuICAgIGlmICghbWVzc2FnZS5mcm9tKSB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UuZnJvbSBpcyBub3QgZGVmaW5lZCcpO1xyXG4gICAgaWYgKCFtZXNzYWdlLnRvKSB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UudG8gaXMgbm90IGRlZmluZWQnKTtcclxuICAgIGlmICghbWVzc2FnZS50eXBlKSB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UudHlwZSBpcyBub3QgZGVmaW5lZCcpO1xyXG4gICAgbWVzc2FnZS5ib2R5ID0gbWVzc2FnZS5ib2R5IHx8IHt9O1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBtZXNzYWdlLmJvZHkgPSBtZXNzYWdlLmJvZHkgfHwge307XHJcbiAgICAgIGxldCBfdGhpcyA9IHRoaXM7XHJcblxyXG4gICAgICBsZXQgcmVzdWx0ID0gX3RoaXMucGRwLmV2YWx1YXRlUG9saWNpZXMobWVzc2FnZSwgaXNJbmNvbWluZyk7XHJcbiAgICAgIGlmIChyZXN1bHQgPT09ICdOb3QgQXBwbGljYWJsZScpIHtcclxuICAgICAgICByZXN1bHQgPSBfdGhpcy5jb250ZXh0LmRlZmF1bHRCZWhhdmlvdXI7XHJcbiAgICAgICAgbWVzc2FnZS5ib2R5LmF1dGggPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBfdGhpcy5hY3Rpb25zU2VydmljZS5lbmZvcmNlUG9saWNpZXMobWVzc2FnZSwgaXNJbmNvbWluZykudGhlbihtZXNzYWdlcyA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSBpbiBtZXNzYWdlcykge1xyXG4gICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldO1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICBtZXNzYWdlLmJvZHkuYXV0aCA9IChtZXNzYWdlLmJvZHkuYXV0aCA9PT0gdW5kZWZpbmVkKSA/IHRydWUgOiBtZXNzYWdlLmJvZHkuYXV0aDtcclxuICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSB7IGJvZHk6IHsgY29kZTogNDAzLCBkZXNjcmlwdGlvbjogJ0Jsb2NrZWQgYnkgcG9saWN5JyB9LCBmcm9tOiBtZXNzYWdlLnRvLCB0bzogbWVzc2FnZS5mcm9tLCB0eXBlOiAncmVzcG9uc2UnIH07XHJcbiAgICAgICAgICAgIHJlamVjdChlcnJvck1lc3NhZ2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGF1dGhvcmlzZVN5bmMobWVzc2FnZSkge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIG1lc3NhZ2UuYm9keSA9IG1lc3NhZ2UuYm9keSB8fCB7fTtcclxuICAgIHJlc3VsdCA9IHRoaXMucGRwLmV2YWx1YXRlUG9saWNpZXMobWVzc2FnZSwgdHJ1ZSk7XHJcbiAgICBpZiAocmVzdWx0ID09PSAnTm90IEFwcGxpY2FibGUnKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRoaXMuY29udGV4dC5kZWZhdWx0QmVoYXZpb3VyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgfVxyXG5cclxuICByZW1vdmVQb2xpY3koc291cmNlLCBrZXkpIHtcclxuICAgIGlmICghc291cmNlKSB0aHJvdyBuZXcgRXJyb3IoJ3NvdXJjZSBpcyBub3QgZGVmaW5lZCcpO1xyXG4gICAgaWYgKHNvdXJjZSAhPT0gJyonICYmICFrZXkpIHRocm93IG5ldyBFcnJvcigna2V5IGlzIG5vdCBkZWZpbmVkJyk7XHJcblxyXG4gICAgc3dpdGNoIChzb3VyY2UpIHtcclxuICAgICAgY2FzZSAnKic6XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNlcnZpY2VQcm92aWRlclBvbGljeSA9IHt9O1xyXG4gICAgICAgIHRoaXMuY29udGV4dC51c2VyUG9saWNpZXMgPSB7fTtcclxuICAgICAgICB0aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZVBvbGljaWVzKCdVU0VSJyk7XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcygnU0VSVklDRV9QUk9WSURFUicpO1xyXG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlQWN0aXZlUG9saWN5KCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1NFUlZJQ0VfUFJPVklERVInOlxyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmNvbnRleHQuc2VydmljZVByb3ZpZGVyUG9saWN5W2tleV07XHJcbiAgICAgICAgdGhpcy5jb250ZXh0LnNhdmVQb2xpY2llcygpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdVU0VSJzpcclxuICAgICAgICBkZWxldGUgdGhpcy5jb250ZXh0LnVzZXJQb2xpY2llc1trZXldO1xyXG4gICAgICAgIGlmIChrZXkgPT09IHRoaXMuY29udGV4dC5hY3RpdmVVc2VyUG9saWN5KSB7XHJcbiAgICAgICAgICB0aGlzLmNvbnRleHQuYWN0aXZlVXNlclBvbGljeSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIHRoaXMuY29udGV4dC5zYXZlQWN0aXZlUG9saWN5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY29udGV4dC5zYXZlUG9saWNpZXMoJ1VTRVInKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBwb2xpY3kgc291cmNlOiAnICsgc291cmNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQRVA7XHJcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFOQTtBQVFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQ3BHQTs7Ozs7Ozs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7OztBQzdDQTtBQUVBOzs7Ozs7OztBQU9BOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7OztBQzNDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVCQTtBQUVBOzs7OztBQUlBOzs7QUFFQTs7Ozs7OztBQU9BO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7O0FBS0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUlBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkE7QUFFQTs7Ozs7QUFJQTs7Ozs7QUFFQTs7Ozs7OztBQU9BO0FBQUE7QUFDQTtBQURBO0FBRUE7QUFFQTs7Ozs7Ozs7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUExQkE7QUFDQTtBQTZCQTs7Ozs7Ozs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBOzs7Ozs7QUFJQTs7Ozs7Ozs7Ozs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBUkE7QUFVQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF2Q0E7QUFDQTtBQXlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQUdBOzs7Ozs7OztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFYQTtBQWFBOzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBOzs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FBSUE7Ozs7Ozs7O0FDL0hBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBRUE7Ozs7QUFJQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7Ozs7QUFtQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBVEE7QUFXQTs7O0FBRUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7OztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUF0QkE7QUF3QkE7OztBQXZMQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7Ozs7OztBQThLQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///23\n")},function(module,exports){eval('var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function("return this")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === "object") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it\'s\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vKHdlYnBhY2spL2J1aWxkaW4vZ2xvYmFsLmpzP2NkMDAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOyIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///24\n')},function(module,exports,__webpack_require__){eval('/* WEBPACK VAR INJECTION */(function(global) {var scope = (typeof global !== "undefined" && global) ||\n (typeof self !== "undefined" && self) ||\n window;\nvar apply = Function.prototype.apply;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, scope, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, scope, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) {\n if (timeout) {\n timeout.close();\n }\n};\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(scope, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// setimmediate attaches itself to the global object\n__webpack_require__(30);\n// On some exotic environments, it\'s not clear which object `setimmediate` was\n// able to install onto. Search each possibility in the same order as the\n// `setimmediate` library.\nexports.setImmediate = (typeof self !== "undefined" && self.setImmediate) ||\n (typeof global !== "undefined" && global.setImmediate) ||\n (this && this.setImmediate);\nexports.clearImmediate = (typeof self !== "undefined" && self.clearImmediate) ||\n (typeof global !== "undefined" && global.clearImmediate) ||\n (this && this.clearImmediate);\n\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(24)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcz81MTE4Il0sInNvdXJjZXNDb250ZW50IjpbInZhciBzY29wZSA9ICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbCkgfHxcbiAgICAgICAgICAgICh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmKSB8fFxuICAgICAgICAgICAgd2luZG93O1xudmFyIGFwcGx5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgc2NvcGUsIGFyZ3VtZW50cyksIGNsZWFySW50ZXJ2YWwpO1xufTtcbmV4cG9ydHMuY2xlYXJUaW1lb3V0ID1cbmV4cG9ydHMuY2xlYXJJbnRlcnZhbCA9IGZ1bmN0aW9uKHRpbWVvdXQpIHtcbiAgaWYgKHRpbWVvdXQpIHtcbiAgICB0aW1lb3V0LmNsb3NlKCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwoc2NvcGUsIHRoaXMuX2lkKTtcbn07XG5cbi8vIERvZXMgbm90IHN0YXJ0IHRoZSB0aW1lLCBqdXN0IHNldHMgdXAgdGhlIG1lbWJlcnMgbmVlZGVkLlxuZXhwb3J0cy5lbnJvbGwgPSBmdW5jdGlvbihpdGVtLCBtc2Vjcykge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gbXNlY3M7XG59O1xuXG5leHBvcnRzLnVuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG4gIGl0ZW0uX2lkbGVUaW1lb3V0ID0gLTE7XG59O1xuXG5leHBvcnRzLl91bnJlZkFjdGl2ZSA9IGV4cG9ydHMuYWN0aXZlID0gZnVuY3Rpb24oaXRlbSkge1xuICBjbGVhclRpbWVvdXQoaXRlbS5faWRsZVRpbWVvdXRJZCk7XG5cbiAgdmFyIG1zZWNzID0gaXRlbS5faWRsZVRpbWVvdXQ7XG4gIGlmIChtc2VjcyA+PSAwKSB7XG4gICAgaXRlbS5faWRsZVRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gb25UaW1lb3V0KCkge1xuICAgICAgaWYgKGl0ZW0uX29uVGltZW91dClcbiAgICAgICAgaXRlbS5fb25UaW1lb3V0KCk7XG4gICAgfSwgbXNlY3MpO1xuICB9XG59O1xuXG4vLyBzZXRpbW1lZGlhdGUgYXR0YWNoZXMgaXRzZWxmIHRvIHRoZSBnbG9iYWwgb2JqZWN0XG5yZXF1aXJlKFwic2V0aW1tZWRpYXRlXCIpO1xuLy8gT24gc29tZSBleG90aWMgZW52aXJvbm1lbnRzLCBpdCdzIG5vdCBjbGVhciB3aGljaCBvYmplY3QgYHNldGltbWVkaWF0ZWAgd2FzXG4vLyBhYmxlIHRvIGluc3RhbGwgb250by4gIFNlYXJjaCBlYWNoIHBvc3NpYmlsaXR5IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZVxuLy8gYHNldGltbWVkaWF0ZWAgbGlicmFyeS5cbmV4cG9ydHMuc2V0SW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuc2V0SW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAodGhpcyAmJiB0aGlzLnNldEltbWVkaWF0ZSk7XG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGYuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgJiYgZ2xvYmFsLmNsZWFySW1tZWRpYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuY2xlYXJJbW1lZGlhdGUpO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///25\n')},function(module,exports){eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9bbmFtZV0vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzP2YyOGMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Iiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///26\n")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(setImmediate, clearImmediate) {module.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \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/******/\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// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\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, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\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/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 135);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nvar core = module.exports = { version: '2.5.3' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(32)('wks');\nvar uid = __webpack_require__(22);\nvar Symbol = __webpack_require__(1).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(1);\nvar core = __webpack_require__(0);\nvar ctx = __webpack_require__(10);\nvar hide = __webpack_require__(9);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var IS_WRAP = type & $export.W;\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE];\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n var key, own, out;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if (own && key in exports) continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? ctx(out, global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function (C) {\n var F = function (a, b, c) {\n if (this instanceof C) {\n switch (arguments.length) {\n case 0: return new C();\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if (IS_PROTO) {\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(7);\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(4);\nvar IE8_DOM_DEFINE = __webpack_require__(44);\nvar toPrimitive = __webpack_require__(35);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(6) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(11)(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(5);\nvar createDesc = __webpack_require__(16);\nmodule.exports = __webpack_require__(6) ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(18);\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(45);\nvar defined = __webpack_require__(25);\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(53);\nvar enumBugKeys = __webpack_require__(27);\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(25);\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports) {\n\nmodule.exports = true;\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(5).f;\nvar has = __webpack_require__(8);\nvar TAG = __webpack_require__(2)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(global, setImmediate) {/*\r\n * Dexie.js - a minimalistic wrapper for IndexedDB\r\n * ===============================================\r\n *\r\n * By David Fahlander, david.fahlander@gmail.com\r\n *\r\n * Version {version}, {date}\r\n *\r\n * http://dexie.org\r\n *\r\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/\r\n */\r\n \nvar keys = Object.keys;\r\nvar isArray = Array.isArray;\r\nvar _global = typeof self !== 'undefined' ? self :\r\n typeof window !== 'undefined' ? window :\r\n global;\r\nfunction extend(obj, extension) {\r\n if (typeof extension !== 'object')\r\n return obj;\r\n keys(extension).forEach(function (key) {\r\n obj[key] = extension[key];\r\n });\r\n return obj;\r\n}\r\nvar getProto = Object.getPrototypeOf;\r\nvar _hasOwn = {}.hasOwnProperty;\r\nfunction hasOwn(obj, prop) {\r\n return _hasOwn.call(obj, prop);\r\n}\r\nfunction props(proto, extension) {\r\n if (typeof extension === 'function')\r\n extension = extension(getProto(proto));\r\n keys(extension).forEach(function (key) {\r\n setProp(proto, key, extension[key]);\r\n });\r\n}\r\nvar defineProperty = Object.defineProperty;\r\nfunction setProp(obj, prop, functionOrGetSet, options) {\r\n defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, \"get\") && typeof functionOrGetSet.get === 'function' ?\r\n { get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true } :\r\n { value: functionOrGetSet, configurable: true, writable: true }, options));\r\n}\r\nfunction derive(Child) {\r\n return {\r\n from: function (Parent) {\r\n Child.prototype = Object.create(Parent.prototype);\r\n setProp(Child.prototype, \"constructor\", Child);\r\n return {\r\n extend: props.bind(null, Child.prototype)\r\n };\r\n }\r\n };\r\n}\r\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\r\nfunction getPropertyDescriptor(obj, prop) {\r\n var pd = getOwnPropertyDescriptor(obj, prop), proto;\r\n return pd || (proto = getProto(obj)) && getPropertyDescriptor(proto, prop);\r\n}\r\nvar _slice = [].slice;\r\nfunction slice(args, start, end) {\r\n return _slice.call(args, start, end);\r\n}\r\nfunction override(origFunc, overridedFactory) {\r\n return overridedFactory(origFunc);\r\n}\r\nfunction doFakeAutoComplete(fn) {\r\n var to = setTimeout(fn, 1000);\r\n clearTimeout(to);\r\n}\r\nfunction assert(b) {\r\n if (!b)\r\n throw new Error(\"Assertion Failed\");\r\n}\r\nfunction asap(fn) {\r\n if (_global.setImmediate)\r\n setImmediate(fn);\r\n else\r\n setTimeout(fn, 0);\r\n}\r\n\r\n/** Generate an object (hash map) based on given array.\r\n * @param extractor Function taking an array item and its index and returning an array of 2 items ([key, value]) to\r\n * instert on the resulting object for each item in the array. If this function returns a falsy value, the\r\n * current item wont affect the resulting object.\r\n */\r\nfunction arrayToObject(array, extractor) {\r\n return array.reduce(function (result, item, i) {\r\n var nameAndValue = extractor(item, i);\r\n if (nameAndValue)\r\n result[nameAndValue[0]] = nameAndValue[1];\r\n return result;\r\n }, {});\r\n}\r\nfunction trycatcher(fn, reject) {\r\n return function () {\r\n try {\r\n fn.apply(this, arguments);\r\n }\r\n catch (e) {\r\n reject(e);\r\n }\r\n };\r\n}\r\nfunction tryCatch(fn, onerror, args) {\r\n try {\r\n fn.apply(null, args);\r\n }\r\n catch (ex) {\r\n onerror && onerror(ex);\r\n }\r\n}\r\nfunction getByKeyPath(obj, keyPath) {\r\n // http://www.w3.org/TR/IndexedDB/#steps-for-extracting-a-key-from-a-value-using-a-key-path\r\n if (hasOwn(obj, keyPath))\r\n return obj[keyPath]; // This line is moved from last to first for optimization purpose.\r\n if (!keyPath)\r\n return obj;\r\n if (typeof keyPath !== 'string') {\r\n var rv = [];\r\n for (var i = 0, l = keyPath.length; i < l; ++i) {\r\n var val = getByKeyPath(obj, keyPath[i]);\r\n rv.push(val);\r\n }\r\n return rv;\r\n }\r\n var period = keyPath.indexOf('.');\r\n if (period !== -1) {\r\n var innerObj = obj[keyPath.substr(0, period)];\r\n return innerObj === undefined ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1));\r\n }\r\n return undefined;\r\n}\r\nfunction setByKeyPath(obj, keyPath, value) {\r\n if (!obj || keyPath === undefined)\r\n return;\r\n if ('isFrozen' in Object && Object.isFrozen(obj))\r\n return;\r\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\r\n assert(typeof value !== 'string' && 'length' in value);\r\n for (var i = 0, l = keyPath.length; i < l; ++i) {\r\n setByKeyPath(obj, keyPath[i], value[i]);\r\n }\r\n }\r\n else {\r\n var period = keyPath.indexOf('.');\r\n if (period !== -1) {\r\n var currentKeyPath = keyPath.substr(0, period);\r\n var remainingKeyPath = keyPath.substr(period + 1);\r\n if (remainingKeyPath === \"\")\r\n if (value === undefined)\r\n delete obj[currentKeyPath];\r\n else\r\n obj[currentKeyPath] = value;\r\n else {\r\n var innerObj = obj[currentKeyPath];\r\n if (!innerObj)\r\n innerObj = (obj[currentKeyPath] = {});\r\n setByKeyPath(innerObj, remainingKeyPath, value);\r\n }\r\n }\r\n else {\r\n if (value === undefined)\r\n delete obj[keyPath];\r\n else\r\n obj[keyPath] = value;\r\n }\r\n }\r\n}\r\nfunction delByKeyPath(obj, keyPath) {\r\n if (typeof keyPath === 'string')\r\n setByKeyPath(obj, keyPath, undefined);\r\n else if ('length' in keyPath)\r\n [].map.call(keyPath, function (kp) {\r\n setByKeyPath(obj, kp, undefined);\r\n });\r\n}\r\nfunction shallowClone(obj) {\r\n var rv = {};\r\n for (var m in obj) {\r\n if (hasOwn(obj, m))\r\n rv[m] = obj[m];\r\n }\r\n return rv;\r\n}\r\nvar concat = [].concat;\r\nfunction flatten(a) {\r\n return concat.apply([], a);\r\n}\r\n//https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\r\nvar intrinsicTypes = \"Boolean,String,Date,RegExp,Blob,File,FileList,ArrayBuffer,DataView,Uint8ClampedArray,ImageData,Map,Set\"\r\n .split(',').concat(flatten([8, 16, 32, 64].map(function (num) { return [\"Int\", \"Uint\", \"Float\"].map(function (t) { return t + num + \"Array\"; }); }))).filter(function (t) { return _global[t]; }).map(function (t) { return _global[t]; });\r\nfunction deepClone(any) {\r\n if (!any || typeof any !== 'object')\r\n return any;\r\n var rv;\r\n if (isArray(any)) {\r\n rv = [];\r\n for (var i = 0, l = any.length; i < l; ++i) {\r\n rv.push(deepClone(any[i]));\r\n }\r\n }\r\n else if (intrinsicTypes.indexOf(any.constructor) >= 0) {\r\n rv = any;\r\n }\r\n else {\r\n rv = any.constructor ? Object.create(any.constructor.prototype) : {};\r\n for (var prop in any) {\r\n if (hasOwn(any, prop)) {\r\n rv[prop] = deepClone(any[prop]);\r\n }\r\n }\r\n }\r\n return rv;\r\n}\r\nfunction getObjectDiff(a, b, rv, prfx) {\r\n // Compares objects a and b and produces a diff object.\r\n rv = rv || {};\r\n prfx = prfx || '';\r\n keys(a).forEach(function (prop) {\r\n if (!hasOwn(b, prop))\r\n rv[prfx + prop] = undefined; // Property removed\r\n else {\r\n var ap = a[prop], bp = b[prop];\r\n if (typeof ap === 'object' && typeof bp === 'object' &&\r\n ap && bp &&\r\n // Now compare constructors are same (not equal because wont work in Safari)\r\n ('' + ap.constructor) === ('' + bp.constructor))\r\n // Same type of object but its properties may have changed\r\n getObjectDiff(ap, bp, rv, prfx + prop + \".\");\r\n else if (ap !== bp)\r\n rv[prfx + prop] = b[prop]; // Primitive value changed\r\n }\r\n });\r\n keys(b).forEach(function (prop) {\r\n if (!hasOwn(a, prop)) {\r\n rv[prfx + prop] = b[prop]; // Property added\r\n }\r\n });\r\n return rv;\r\n}\r\n// If first argument is iterable or array-like, return it as an array\r\nvar iteratorSymbol = typeof Symbol !== 'undefined' && Symbol.iterator;\r\nvar getIteratorOf = iteratorSymbol ? function (x) {\r\n var i;\r\n return x != null && (i = x[iteratorSymbol]) && i.apply(x);\r\n} : function () { return null; };\r\nvar NO_CHAR_ARRAY = {};\r\n// Takes one or several arguments and returns an array based on the following criteras:\r\n// * If several arguments provided, return arguments converted to an array in a way that\r\n// still allows javascript engine to optimize the code.\r\n// * If single argument is an array, return a clone of it.\r\n// * If this-pointer equals NO_CHAR_ARRAY, don't accept strings as valid iterables as a special\r\n// case to the two bullets below.\r\n// * If single argument is an iterable, convert it to an array and return the resulting array.\r\n// * If single argument is array-like (has length of type number), convert it to an array.\r\nfunction getArrayOf(arrayLike) {\r\n var i, a, x, it;\r\n if (arguments.length === 1) {\r\n if (isArray(arrayLike))\r\n return arrayLike.slice();\r\n if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string')\r\n return [arrayLike];\r\n if ((it = getIteratorOf(arrayLike))) {\r\n a = [];\r\n while ((x = it.next()), !x.done)\r\n a.push(x.value);\r\n return a;\r\n }\r\n if (arrayLike == null)\r\n return [arrayLike];\r\n i = arrayLike.length;\r\n if (typeof i === 'number') {\r\n a = new Array(i);\r\n while (i--)\r\n a[i] = arrayLike[i];\r\n return a;\r\n }\r\n return [arrayLike];\r\n }\r\n i = arguments.length;\r\n a = new Array(i);\r\n while (i--)\r\n a[i] = arguments[i];\r\n return a;\r\n}\n\n// By default, debug will be true only if platform is a web platform and its page is served from localhost.\r\n// When debug = true, error's stacks will contain asyncronic long stacks.\r\n// By default, debug will be true only if platform is a web platform and its page is served from localhost.\r\nvar debug = typeof location !== 'undefined' &&\r\n // By default, use debug mode if served from localhost.\r\n /^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);\r\nfunction setDebug(value, filter) {\r\n debug = value;\r\n libraryFilter = filter;\r\n}\r\nvar libraryFilter = function () { return true; };\r\nvar NEEDS_THROW_FOR_STACK = !new Error(\"\").stack;\r\nfunction getErrorWithStack() {\r\n \"use strict\";\r\n if (NEEDS_THROW_FOR_STACK)\r\n try {\r\n // Doing something naughty in strict mode here to trigger a specific error\r\n // that can be explicitely ignored in debugger's exception settings.\r\n // If we'd just throw new Error() here, IE's debugger's exception settings\r\n // will just consider it as \"exception thrown by javascript code\" which is\r\n // something you wouldn't want it to ignore.\r\n getErrorWithStack.arguments;\r\n throw new Error(); // Fallback if above line don't throw.\r\n }\r\n catch (e) {\r\n return e;\r\n }\r\n return new Error();\r\n}\r\nfunction prettyStack(exception, numIgnoredFrames) {\r\n var stack = exception.stack;\r\n if (!stack)\r\n return \"\";\r\n numIgnoredFrames = (numIgnoredFrames || 0);\r\n if (stack.indexOf(exception.name) === 0)\r\n numIgnoredFrames += (exception.name + exception.message).split('\\n').length;\r\n return stack.split('\\n')\r\n .slice(numIgnoredFrames)\r\n .filter(libraryFilter)\r\n .map(function (frame) { return \"\\n\" + frame; })\r\n .join('');\r\n}\r\nfunction deprecated(what, fn) {\r\n return function () {\r\n console.warn(what + \" is deprecated. See https://github.com/dfahlander/Dexie.js/wiki/Deprecations. \" + prettyStack(getErrorWithStack(), 1));\r\n return fn.apply(this, arguments);\r\n };\r\n}\n\nvar dexieErrorNames = [\r\n 'Modify',\r\n 'Bulk',\r\n 'OpenFailed',\r\n 'VersionChange',\r\n 'Schema',\r\n 'Upgrade',\r\n 'InvalidTable',\r\n 'MissingAPI',\r\n 'NoSuchDatabase',\r\n 'InvalidArgument',\r\n 'SubTransaction',\r\n 'Unsupported',\r\n 'Internal',\r\n 'DatabaseClosed',\r\n 'PrematureCommit',\r\n 'ForeignAwait'\r\n];\r\nvar idbDomErrorNames = [\r\n 'Unknown',\r\n 'Constraint',\r\n 'Data',\r\n 'TransactionInactive',\r\n 'ReadOnly',\r\n 'Version',\r\n 'NotFound',\r\n 'InvalidState',\r\n 'InvalidAccess',\r\n 'Abort',\r\n 'Timeout',\r\n 'QuotaExceeded',\r\n 'Syntax',\r\n 'DataClone'\r\n];\r\nvar errorList = dexieErrorNames.concat(idbDomErrorNames);\r\nvar defaultTexts = {\r\n VersionChanged: \"Database version changed by other database connection\",\r\n DatabaseClosed: \"Database has been closed\",\r\n Abort: \"Transaction aborted\",\r\n TransactionInactive: \"Transaction has already completed or failed\"\r\n};\r\n//\r\n// DexieError - base class of all out exceptions.\r\n//\r\nfunction DexieError(name, msg) {\r\n // Reason we don't use ES6 classes is because:\r\n // 1. It bloats transpiled code and increases size of minified code.\r\n // 2. It doesn't give us much in this case.\r\n // 3. It would require sub classes to call super(), which\r\n // is not needed when deriving from Error.\r\n this._e = getErrorWithStack();\r\n this.name = name;\r\n this.message = msg;\r\n}\r\nderive(DexieError).from(Error).extend({\r\n stack: {\r\n get: function () {\r\n return this._stack ||\r\n (this._stack = this.name + \": \" + this.message + prettyStack(this._e, 2));\r\n }\r\n },\r\n toString: function () { return this.name + \": \" + this.message; }\r\n});\r\nfunction getMultiErrorMessage(msg, failures) {\r\n return msg + \". Errors: \" + failures\r\n .map(function (f) { return f.toString(); })\r\n .filter(function (v, i, s) { return s.indexOf(v) === i; }) // Only unique error strings\r\n .join('\\n');\r\n}\r\n//\r\n// ModifyError - thrown in Collection.modify()\r\n// Specific constructor because it contains members failures and failedKeys.\r\n//\r\nfunction ModifyError(msg, failures, successCount, failedKeys) {\r\n this._e = getErrorWithStack();\r\n this.failures = failures;\r\n this.failedKeys = failedKeys;\r\n this.successCount = successCount;\r\n}\r\nderive(ModifyError).from(DexieError);\r\nfunction BulkError(msg, failures) {\r\n this._e = getErrorWithStack();\r\n this.name = \"BulkError\";\r\n this.failures = failures;\r\n this.message = getMultiErrorMessage(msg, failures);\r\n}\r\nderive(BulkError).from(DexieError);\r\n//\r\n//\r\n// Dynamically generate error names and exception classes based\r\n// on the names in errorList.\r\n//\r\n//\r\n// Map of {ErrorName -> ErrorName + \"Error\"}\r\nvar errnames = errorList.reduce(function (obj, name) { return (obj[name] = name + \"Error\", obj); }, {});\r\n// Need an alias for DexieError because we're gonna create subclasses with the same name.\r\nvar BaseException = DexieError;\r\n// Map of {ErrorName -> exception constructor}\r\nvar exceptions = errorList.reduce(function (obj, name) {\r\n // Let the name be \"DexieError\" because this name may\r\n // be shown in call stack and when debugging. DexieError is\r\n // the most true name because it derives from DexieError,\r\n // and we cannot change Function.name programatically without\r\n // dynamically create a Function object, which would be considered\r\n // 'eval-evil'.\r\n var fullName = name + \"Error\";\r\n function DexieError(msgOrInner, inner) {\r\n this._e = getErrorWithStack();\r\n this.name = fullName;\r\n if (!msgOrInner) {\r\n this.message = defaultTexts[name] || fullName;\r\n this.inner = null;\r\n }\r\n else if (typeof msgOrInner === 'string') {\r\n this.message = msgOrInner;\r\n this.inner = inner || null;\r\n }\r\n else if (typeof msgOrInner === 'object') {\r\n this.message = msgOrInner.name + \" \" + msgOrInner.message;\r\n this.inner = msgOrInner;\r\n }\r\n }\r\n derive(DexieError).from(BaseException);\r\n obj[name] = DexieError;\r\n return obj;\r\n}, {});\r\n// Use ECMASCRIPT standard exceptions where applicable:\r\nexceptions.Syntax = SyntaxError;\r\nexceptions.Type = TypeError;\r\nexceptions.Range = RangeError;\r\nvar exceptionMap = idbDomErrorNames.reduce(function (obj, name) {\r\n obj[name + \"Error\"] = exceptions[name];\r\n return obj;\r\n}, {});\r\nfunction mapError(domError, message) {\r\n if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name])\r\n return domError;\r\n var rv = new exceptionMap[domError.name](message || domError.message, domError);\r\n if (\"stack\" in domError) {\r\n // Derive stack from inner exception if it has a stack\r\n setProp(rv, \"stack\", { get: function () {\r\n return this.inner.stack;\r\n } });\r\n }\r\n return rv;\r\n}\r\nvar fullNameExceptions = errorList.reduce(function (obj, name) {\r\n if ([\"Syntax\", \"Type\", \"Range\"].indexOf(name) === -1)\r\n obj[name + \"Error\"] = exceptions[name];\r\n return obj;\r\n}, {});\r\nfullNameExceptions.ModifyError = ModifyError;\r\nfullNameExceptions.DexieError = DexieError;\r\nfullNameExceptions.BulkError = BulkError;\n\nfunction nop() { }\r\nfunction mirror(val) { return val; }\r\nfunction pureFunctionChain(f1, f2) {\r\n // Enables chained events that takes ONE argument and returns it to the next function in chain.\r\n // This pattern is used in the hook(\"reading\") event.\r\n if (f1 == null || f1 === mirror)\r\n return f2;\r\n return function (val) {\r\n return f2(f1(val));\r\n };\r\n}\r\nfunction callBoth(on1, on2) {\r\n return function () {\r\n on1.apply(this, arguments);\r\n on2.apply(this, arguments);\r\n };\r\n}\r\nfunction hookCreatingChain(f1, f2) {\r\n // Enables chained events that takes several arguments and may modify first argument by making a modification and then returning the same instance.\r\n // This pattern is used in the hook(\"creating\") event.\r\n if (f1 === nop)\r\n return f2;\r\n return function () {\r\n var res = f1.apply(this, arguments);\r\n if (res !== undefined)\r\n arguments[0] = res;\r\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\r\n onerror = this.onerror; // In case event listener has set this.onerror\r\n this.onsuccess = null;\r\n this.onerror = null;\r\n var res2 = f2.apply(this, arguments);\r\n if (onsuccess)\r\n this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\r\n if (onerror)\r\n this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\r\n return res2 !== undefined ? res2 : res;\r\n };\r\n}\r\nfunction hookDeletingChain(f1, f2) {\r\n if (f1 === nop)\r\n return f2;\r\n return function () {\r\n f1.apply(this, arguments);\r\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\r\n onerror = this.onerror; // In case event listener has set this.onerror\r\n this.onsuccess = this.onerror = null;\r\n f2.apply(this, arguments);\r\n if (onsuccess)\r\n this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\r\n if (onerror)\r\n this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\r\n };\r\n}\r\nfunction hookUpdatingChain(f1, f2) {\r\n if (f1 === nop)\r\n return f2;\r\n return function (modifications) {\r\n var res = f1.apply(this, arguments);\r\n extend(modifications, res); // If f1 returns new modifications, extend caller's modifications with the result before calling next in chain.\r\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\r\n onerror = this.onerror; // In case event listener has set this.onerror\r\n this.onsuccess = null;\r\n this.onerror = null;\r\n var res2 = f2.apply(this, arguments);\r\n if (onsuccess)\r\n this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\r\n if (onerror)\r\n this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\r\n return res === undefined ?\r\n (res2 === undefined ? undefined : res2) :\r\n (extend(res, res2));\r\n };\r\n}\r\nfunction reverseStoppableEventChain(f1, f2) {\r\n if (f1 === nop)\r\n return f2;\r\n return function () {\r\n if (f2.apply(this, arguments) === false)\r\n return false;\r\n return f1.apply(this, arguments);\r\n };\r\n}\r\n\r\nfunction promisableChain(f1, f2) {\r\n if (f1 === nop)\r\n return f2;\r\n return function () {\r\n var res = f1.apply(this, arguments);\r\n if (res && typeof res.then === 'function') {\r\n var thiz = this, i = arguments.length, args = new Array(i);\r\n while (i--)\r\n args[i] = arguments[i];\r\n return res.then(function () {\r\n return f2.apply(thiz, args);\r\n });\r\n }\r\n return f2.apply(this, arguments);\r\n };\r\n}\n\n//\r\n// Promise and Zone (PSD) for Dexie library\r\n//\r\n// I started out writing this Promise class by copying promise-light (https://github.com/taylorhakes/promise-light) by\r\n// https://github.com/taylorhakes - an A+ and ECMASCRIPT 6 compliant Promise implementation.\r\n//\r\n// In previous versions this was fixed by not calling setTimeout when knowing that the resolve() or reject() came from another\r\n// tick. In Dexie v1.4.0, I've rewritten the Promise class entirely. Just some fragments of promise-light is left. I use\r\n// another strategy now that simplifies everything a lot: to always execute callbacks in a new micro-task, but have an own micro-task\r\n// engine that is indexedDB compliant across all browsers.\r\n// Promise class has also been optimized a lot with inspiration from bluebird - to avoid closures as much as possible.\r\n// Also with inspiration from bluebird, asyncronic stacks in debug mode.\r\n//\r\n// Specific non-standard features of this Promise class:\r\n// * Custom zone support (a.k.a. PSD) with ability to keep zones also when using native promises as well as\r\n// native async / await.\r\n// * Promise.follow() method built upon the custom zone engine, that allows user to track all promises created from current stack frame\r\n// and below + all promises that those promises creates or awaits.\r\n// * Detect any unhandled promise in a PSD-scope (PSD.onunhandled). \r\n//\r\n// David Fahlander, https://github.com/dfahlander\r\n//\r\n// Just a pointer that only this module knows about.\r\n// Used in Promise constructor to emulate a private constructor.\r\nvar INTERNAL = {};\r\n// Async stacks (long stacks) must not grow infinitely.\r\nvar LONG_STACKS_CLIP_LIMIT = 100;\nvar MAX_LONG_STACKS = 20;\nvar ZONE_ECHO_LIMIT = 7;\nvar nativePromiseInstanceAndProto = (function () {\r\n try {\r\n // Be able to patch native async functions\r\n return new Function(\"let F=async ()=>{},p=F();return [p,Object.getPrototypeOf(p),Promise.resolve(),F.constructor];\")();\r\n }\r\n catch (e) {\r\n var P = _global.Promise;\r\n return P ?\r\n [P.resolve(), P.prototype, P.resolve()] :\r\n [];\r\n }\r\n})();\nvar resolvedNativePromise = nativePromiseInstanceAndProto[0];\nvar nativePromiseProto = nativePromiseInstanceAndProto[1];\nvar resolvedGlobalPromise = nativePromiseInstanceAndProto[2];\nvar nativePromiseThen = nativePromiseProto && nativePromiseProto.then;\r\nvar NativePromise = resolvedNativePromise && resolvedNativePromise.constructor;\r\nvar AsyncFunction = nativePromiseInstanceAndProto[3];\r\nvar patchGlobalPromise = !!resolvedGlobalPromise;\r\nvar stack_being_generated = false;\r\n/* The default function used only for the very first promise in a promise chain.\r\n As soon as then promise is resolved or rejected, all next tasks will be executed in micro ticks\r\n emulated in this module. For indexedDB compatibility, this means that every method needs to\r\n execute at least one promise before doing an indexedDB operation. Dexie will always call\r\n db.ready().then() for every operation to make sure the indexedDB event is started in an\r\n indexedDB-compatible emulated micro task loop.\r\n*/\r\nvar schedulePhysicalTick = resolvedGlobalPromise ?\r\n function () { resolvedGlobalPromise.then(physicalTick); }\r\n :\r\n _global.setImmediate ?\r\n // setImmediate supported. Those modern platforms also supports Function.bind().\r\n setImmediate.bind(null, physicalTick) :\r\n _global.MutationObserver ?\r\n // MutationObserver supported\r\n function () {\r\n var hiddenDiv = document.createElement(\"div\");\r\n (new MutationObserver(function () {\r\n physicalTick();\r\n hiddenDiv = null;\r\n })).observe(hiddenDiv, { attributes: true });\r\n hiddenDiv.setAttribute('i', '1');\r\n } :\r\n // No support for setImmediate or MutationObserver. No worry, setTimeout is only called\r\n // once time. Every tick that follows will be our emulated micro tick.\r\n // Could have uses setTimeout.bind(null, 0, physicalTick) if it wasnt for that FF13 and below has a bug \r\n function () { setTimeout(physicalTick, 0); };\r\n// Configurable through Promise.scheduler.\r\n// Don't export because it would be unsafe to let unknown\r\n// code call it unless they do try..catch within their callback.\r\n// This function can be retrieved through getter of Promise.scheduler though,\r\n// but users must not do Promise.scheduler = myFuncThatThrowsException\r\nvar asap$1 = function (callback, args) {\r\n microtickQueue.push([callback, args]);\r\n if (needsNewPhysicalTick) {\r\n schedulePhysicalTick();\r\n needsNewPhysicalTick = false;\r\n }\r\n};\r\nvar isOutsideMicroTick = true;\nvar needsNewPhysicalTick = true;\nvar unhandledErrors = [];\nvar rejectingErrors = [];\nvar currentFulfiller = null;\nvar rejectionMapper = mirror; // Remove in next major when removing error mapping of DOMErrors and DOMExceptions\r\n// Remove in next major when removing error mapping of DOMErrors and DOMExceptions\r\nvar globalPSD = {\r\n id: 'global',\r\n global: true,\r\n ref: 0,\r\n unhandleds: [],\r\n onunhandled: globalError,\r\n pgp: false,\r\n env: {},\r\n finalize: function () {\r\n this.unhandleds.forEach(function (uh) {\r\n try {\r\n globalError(uh[0], uh[1]);\r\n }\r\n catch (e) { }\r\n });\r\n }\r\n};\r\nvar PSD = globalPSD;\r\nvar microtickQueue = []; // Callbacks to call in this or next physical tick.\r\n// Callbacks to call in this or next physical tick.\r\nvar numScheduledCalls = 0; // Number of listener-calls left to do in this physical tick.\r\n// Number of listener-calls left to do in this physical tick.\r\nvar tickFinalizers = []; // Finalizers to call when there are no more async calls scheduled within current physical tick.\r\n// Finalizers to call when there are no more async calls scheduled within current physical tick.\r\nfunction Promise(fn) {\r\n if (typeof this !== 'object')\r\n throw new TypeError('Promises must be constructed via new');\r\n this._listeners = [];\r\n this.onuncatched = nop; // Deprecate in next major. Not needed. Better to use global error handler.\r\n // A library may set `promise._lib = true;` after promise is created to make resolve() or reject()\r\n // execute the microtask engine implicitely within the call to resolve() or reject().\r\n // To remain A+ compliant, a library must only set `_lib=true` if it can guarantee that the stack\r\n // only contains library code when calling resolve() or reject().\r\n // RULE OF THUMB: ONLY set _lib = true for promises explicitely resolving/rejecting directly from\r\n // global scope (event handler, timer etc)!\r\n this._lib = false;\r\n // Current async scope\r\n var psd = (this._PSD = PSD);\r\n if (debug) {\r\n this._stackHolder = getErrorWithStack();\r\n this._prev = null;\r\n this._numPrev = 0; // Number of previous promises (for long stacks)\r\n }\r\n if (typeof fn !== 'function') {\r\n if (fn !== INTERNAL)\r\n throw new TypeError('Not a function');\r\n // Private constructor (INTERNAL, state, value).\r\n // Used internally by Promise.resolve() and Promise.reject().\r\n this._state = arguments[1];\r\n this._value = arguments[2];\r\n if (this._state === false)\r\n handleRejection(this, this._value); // Map error, set stack and addPossiblyUnhandledError().\r\n return;\r\n }\r\n this._state = null; // null (=pending), false (=rejected) or true (=resolved)\r\n this._value = null; // error or result\r\n ++psd.ref; // Refcounting current scope\r\n executePromiseTask(this, fn);\r\n}\r\n// Prepare a property descriptor to put onto Promise.prototype.then\r\nvar thenProp = {\r\n get: function () {\r\n var psd = PSD, microTaskId = totalEchoes;\r\n function then(onFulfilled, onRejected) {\r\n var _this = this;\r\n var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes);\r\n if (possibleAwait)\r\n decrementExpectedAwaits();\r\n var rv = new Promise(function (resolve, reject) {\r\n propagateToListener(_this, new Listener(nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait), nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait), resolve, reject, psd));\r\n });\r\n debug && linkToPreviousPromise(rv, this);\r\n return rv;\r\n }\r\n then.prototype = INTERNAL; // For idempotense, see setter below.\r\n return then;\r\n },\r\n // Be idempotent and allow another framework (such as zone.js or another instance of a Dexie.Promise module) to replace Promise.prototype.then\r\n // and when that framework wants to restore the original property, we must identify that and restore the original property descriptor.\r\n set: function (value) {\r\n setProp(this, 'then', value && value.prototype === INTERNAL ?\r\n thenProp :\r\n {\r\n get: function () {\r\n return value; // Getter returning provided value (behaves like value is just changed)\r\n },\r\n set: thenProp.set // Keep a setter that is prepared to restore original.\r\n });\r\n }\r\n};\r\nprops(Promise.prototype, {\r\n then: thenProp,\r\n _then: function (onFulfilled, onRejected) {\r\n // A little tinier version of then() that don't have to create a resulting promise.\r\n propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD));\r\n },\r\n catch: function (onRejected) {\r\n if (arguments.length === 1)\r\n return this.then(null, onRejected);\r\n // First argument is the Error type to catch\r\n var type = arguments[0], handler = arguments[1];\r\n return typeof type === 'function' ? this.then(null, function (err) {\r\n // Catching errors by its constructor type (similar to java / c++ / c#)\r\n // Sample: promise.catch(TypeError, function (e) { ... });\r\n return err instanceof type ? handler(err) : PromiseReject(err);\r\n })\r\n : this.then(null, function (err) {\r\n // Catching errors by the error.name property. Makes sense for indexedDB where error type\r\n // is always DOMError but where e.name tells the actual error type.\r\n // Sample: promise.catch('ConstraintError', function (e) { ... });\r\n return err && err.name === type ? handler(err) : PromiseReject(err);\r\n });\r\n },\r\n finally: function (onFinally) {\r\n return this.then(function (value) {\r\n onFinally();\r\n return value;\r\n }, function (err) {\r\n onFinally();\r\n return PromiseReject(err);\r\n });\r\n },\r\n stack: {\r\n get: function () {\r\n if (this._stack)\r\n return this._stack;\r\n try {\r\n stack_being_generated = true;\r\n var stacks = getStack(this, [], MAX_LONG_STACKS);\r\n var stack = stacks.join(\"\\nFrom previous: \");\r\n if (this._state !== null)\r\n this._stack = stack; // Stack may be updated on reject.\r\n return stack;\r\n }\r\n finally {\r\n stack_being_generated = false;\r\n }\r\n }\r\n },\r\n timeout: function (ms, msg) {\r\n var _this = this;\r\n return ms < Infinity ?\r\n new Promise(function (resolve, reject) {\r\n var handle = setTimeout(function () { return reject(new exceptions.Timeout(msg)); }, ms);\r\n _this.then(resolve, reject).finally(clearTimeout.bind(null, handle));\r\n }) : this;\r\n }\r\n});\r\nif (typeof Symbol !== 'undefined' && Symbol.toStringTag)\r\n setProp(Promise.prototype, Symbol.toStringTag, 'Promise');\r\n// Now that Promise.prototype is defined, we have all it takes to set globalPSD.env.\r\n// Environment globals snapshotted on leaving global zone\r\nglobalPSD.env = snapShot();\r\nfunction Listener(onFulfilled, onRejected, resolve, reject, zone) {\r\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\r\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\r\n this.resolve = resolve;\r\n this.reject = reject;\r\n this.psd = zone;\r\n}\r\n// Promise Static Properties\r\nprops(Promise, {\r\n all: function () {\r\n var values = getArrayOf.apply(null, arguments) // Supports iterables, implicit arguments and array-like.\r\n .map(onPossibleParallellAsync); // Handle parallell async/awaits \r\n return new Promise(function (resolve, reject) {\r\n if (values.length === 0)\r\n resolve([]);\r\n var remaining = values.length;\r\n values.forEach(function (a, i) { return Promise.resolve(a).then(function (x) {\r\n values[i] = x;\r\n if (!--remaining)\r\n resolve(values);\r\n }, reject); });\r\n });\r\n },\r\n resolve: function (value) {\r\n if (value instanceof Promise)\r\n return value;\r\n if (value && typeof value.then === 'function')\r\n return new Promise(function (resolve, reject) {\r\n value.then(resolve, reject);\r\n });\r\n var rv = new Promise(INTERNAL, true, value);\r\n linkToPreviousPromise(rv, currentFulfiller);\r\n return rv;\r\n },\r\n reject: PromiseReject,\r\n race: function () {\r\n var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\r\n return new Promise(function (resolve, reject) {\r\n values.map(function (value) { return Promise.resolve(value).then(resolve, reject); });\r\n });\r\n },\r\n PSD: {\r\n get: function () { return PSD; },\r\n set: function (value) { return PSD = value; }\r\n },\r\n //totalEchoes: {get: ()=>totalEchoes},\r\n //task: {get: ()=>task},\r\n newPSD: newScope,\r\n usePSD: usePSD,\r\n scheduler: {\r\n get: function () { return asap$1; },\r\n set: function (value) { asap$1 = value; }\r\n },\r\n rejectionMapper: {\r\n get: function () { return rejectionMapper; },\r\n set: function (value) { rejectionMapper = value; } // Map reject failures\r\n },\r\n follow: function (fn, zoneProps) {\r\n return new Promise(function (resolve, reject) {\r\n return newScope(function (resolve, reject) {\r\n var psd = PSD;\r\n psd.unhandleds = []; // For unhandled standard- or 3rd party Promises. Checked at psd.finalize()\r\n psd.onunhandled = reject; // Triggered directly on unhandled promises of this library.\r\n psd.finalize = callBoth(function () {\r\n var _this = this;\r\n // Unhandled standard or 3rd part promises are put in PSD.unhandleds and\r\n // examined upon scope completion while unhandled rejections in this Promise\r\n // will trigger directly through psd.onunhandled\r\n run_at_end_of_this_or_next_physical_tick(function () {\r\n _this.unhandleds.length === 0 ? resolve() : reject(_this.unhandleds[0]);\r\n });\r\n }, psd.finalize);\r\n fn();\r\n }, zoneProps, resolve, reject);\r\n });\r\n }\r\n});\r\n/**\r\n* Take a potentially misbehaving resolver function and make sure\r\n* onFulfilled and onRejected are only called once.\r\n*\r\n* Makes no guarantees about asynchrony.\r\n*/\r\nfunction executePromiseTask(promise, fn) {\r\n // Promise Resolution Procedure:\r\n // https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\r\n try {\r\n fn(function (value) {\r\n if (promise._state !== null)\r\n return; // Already settled\r\n if (value === promise)\r\n throw new TypeError('A promise cannot be resolved with itself.');\r\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\r\n if (value && typeof value.then === 'function') {\r\n executePromiseTask(promise, function (resolve, reject) {\r\n value instanceof Promise ?\r\n value._then(resolve, reject) :\r\n value.then(resolve, reject);\r\n });\r\n }\r\n else {\r\n promise._state = true;\r\n promise._value = value;\r\n propagateAllListeners(promise);\r\n }\r\n if (shouldExecuteTick)\r\n endMicroTickScope();\r\n }, handleRejection.bind(null, promise)); // If Function.bind is not supported. Exception is handled in catch below\r\n }\r\n catch (ex) {\r\n handleRejection(promise, ex);\r\n }\r\n}\r\nfunction handleRejection(promise, reason) {\r\n rejectingErrors.push(reason);\r\n if (promise._state !== null)\r\n return;\r\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\r\n reason = rejectionMapper(reason);\r\n promise._state = false;\r\n promise._value = reason;\r\n debug && reason !== null && typeof reason === 'object' && !reason._promise && tryCatch(function () {\r\n var origProp = getPropertyDescriptor(reason, \"stack\");\r\n reason._promise = promise;\r\n setProp(reason, \"stack\", {\r\n get: function () {\r\n return stack_being_generated ?\r\n origProp && (origProp.get ?\r\n origProp.get.apply(reason) :\r\n origProp.value) :\r\n promise.stack;\r\n }\r\n });\r\n });\r\n // Add the failure to a list of possibly uncaught errors\r\n addPossiblyUnhandledError(promise);\r\n propagateAllListeners(promise);\r\n if (shouldExecuteTick)\r\n endMicroTickScope();\r\n}\r\nfunction propagateAllListeners(promise) {\r\n //debug && linkToPreviousPromise(promise);\r\n var listeners = promise._listeners;\r\n promise._listeners = [];\r\n for (var i = 0, len = listeners.length; i < len; ++i) {\r\n propagateToListener(promise, listeners[i]);\r\n }\r\n var psd = promise._PSD;\r\n --psd.ref || psd.finalize(); // if psd.ref reaches zero, call psd.finalize();\r\n if (numScheduledCalls === 0) {\r\n // If numScheduledCalls is 0, it means that our stack is not in a callback of a scheduled call,\r\n // and that no deferreds where listening to this rejection or success.\r\n // Since there is a risk that our stack can contain application code that may\r\n // do stuff after this code is finished that may generate new calls, we cannot\r\n // call finalizers here.\r\n ++numScheduledCalls;\r\n asap$1(function () {\r\n if (--numScheduledCalls === 0)\r\n finalizePhysicalTick(); // Will detect unhandled errors\r\n }, []);\r\n }\r\n}\r\nfunction propagateToListener(promise, listener) {\r\n if (promise._state === null) {\r\n promise._listeners.push(listener);\r\n return;\r\n }\r\n var cb = promise._state ? listener.onFulfilled : listener.onRejected;\r\n if (cb === null) {\r\n // This Listener doesnt have a listener for the event being triggered (onFulfilled or onReject) so lets forward the event to any eventual listeners on the Promise instance returned by then() or catch()\r\n return (promise._state ? listener.resolve : listener.reject)(promise._value);\r\n }\r\n ++listener.psd.ref;\r\n ++numScheduledCalls;\r\n asap$1(callListener, [cb, promise, listener]);\r\n}\r\nfunction callListener(cb, promise, listener) {\r\n try {\r\n // Set static variable currentFulfiller to the promise that is being fullfilled,\r\n // so that we connect the chain of promises (for long stacks support)\r\n currentFulfiller = promise;\r\n // Call callback and resolve our listener with it's return value.\r\n var ret, value = promise._value;\r\n if (promise._state) {\r\n // cb is onResolved\r\n ret = cb(value);\r\n }\r\n else {\r\n // cb is onRejected\r\n if (rejectingErrors.length)\r\n rejectingErrors = [];\r\n ret = cb(value);\r\n if (rejectingErrors.indexOf(value) === -1)\r\n markErrorAsHandled(promise); // Callback didnt do Promise.reject(err) nor reject(err) onto another promise.\r\n }\r\n listener.resolve(ret);\r\n }\r\n catch (e) {\r\n // Exception thrown in callback. Reject our listener.\r\n listener.reject(e);\r\n }\r\n finally {\r\n // Restore env and currentFulfiller.\r\n currentFulfiller = null;\r\n if (--numScheduledCalls === 0)\r\n finalizePhysicalTick();\r\n --listener.psd.ref || listener.psd.finalize();\r\n }\r\n}\r\nfunction getStack(promise, stacks, limit) {\r\n if (stacks.length === limit)\r\n return stacks;\r\n var stack = \"\";\r\n if (promise._state === false) {\r\n var failure = promise._value, errorName, message;\r\n if (failure != null) {\r\n errorName = failure.name || \"Error\";\r\n message = failure.message || failure;\r\n stack = prettyStack(failure, 0);\r\n }\r\n else {\r\n errorName = failure; // If error is undefined or null, show that.\r\n message = \"\";\r\n }\r\n stacks.push(errorName + (message ? \": \" + message : \"\") + stack);\r\n }\r\n if (debug) {\r\n stack = prettyStack(promise._stackHolder, 2);\r\n if (stack && stacks.indexOf(stack) === -1)\r\n stacks.push(stack);\r\n if (promise._prev)\r\n getStack(promise._prev, stacks, limit);\r\n }\r\n return stacks;\r\n}\r\nfunction linkToPreviousPromise(promise, prev) {\r\n // Support long stacks by linking to previous completed promise.\r\n var numPrev = prev ? prev._numPrev + 1 : 0;\r\n if (numPrev < LONG_STACKS_CLIP_LIMIT) {\r\n promise._prev = prev;\r\n promise._numPrev = numPrev;\r\n }\r\n}\r\n/* The callback to schedule with setImmediate() or setTimeout().\r\n It runs a virtual microtick and executes any callback registered in microtickQueue.\r\n */\r\nfunction physicalTick() {\r\n beginMicroTickScope() && endMicroTickScope();\r\n}\r\nfunction beginMicroTickScope() {\r\n var wasRootExec = isOutsideMicroTick;\r\n isOutsideMicroTick = false;\r\n needsNewPhysicalTick = false;\r\n return wasRootExec;\r\n}\r\n/* Executes micro-ticks without doing try..catch.\r\n This can be possible because we only use this internally and\r\n the registered functions are exception-safe (they do try..catch\r\n internally before calling any external method). If registering\r\n functions in the microtickQueue that are not exception-safe, this\r\n would destroy the framework and make it instable. So we don't export\r\n our asap method.\r\n*/\r\nfunction endMicroTickScope() {\r\n var callbacks, i, l;\r\n do {\r\n while (microtickQueue.length > 0) {\r\n callbacks = microtickQueue;\r\n microtickQueue = [];\r\n l = callbacks.length;\r\n for (i = 0; i < l; ++i) {\r\n var item = callbacks[i];\r\n item[0].apply(null, item[1]);\r\n }\r\n }\r\n } while (microtickQueue.length > 0);\r\n isOutsideMicroTick = true;\r\n needsNewPhysicalTick = true;\r\n}\r\nfunction finalizePhysicalTick() {\r\n var unhandledErrs = unhandledErrors;\r\n unhandledErrors = [];\r\n unhandledErrs.forEach(function (p) {\r\n p._PSD.onunhandled.call(null, p._value, p);\r\n });\r\n var finalizers = tickFinalizers.slice(0); // Clone first because finalizer may remove itself from list.\r\n var i = finalizers.length;\r\n while (i)\r\n finalizers[--i]();\r\n}\r\nfunction run_at_end_of_this_or_next_physical_tick(fn) {\r\n function finalizer() {\r\n fn();\r\n tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1);\r\n }\r\n tickFinalizers.push(finalizer);\r\n ++numScheduledCalls;\r\n asap$1(function () {\r\n if (--numScheduledCalls === 0)\r\n finalizePhysicalTick();\r\n }, []);\r\n}\r\nfunction addPossiblyUnhandledError(promise) {\r\n // Only add to unhandledErrors if not already there. The first one to add to this list\r\n // will be upon the first rejection so that the root cause (first promise in the\r\n // rejection chain) is the one listed.\r\n if (!unhandledErrors.some(function (p) { return p._value === promise._value; }))\r\n unhandledErrors.push(promise);\r\n}\r\nfunction markErrorAsHandled(promise) {\r\n // Called when a reject handled is actually being called.\r\n // Search in unhandledErrors for any promise whos _value is this promise_value (list\r\n // contains only rejected promises, and only one item per error)\r\n var i = unhandledErrors.length;\r\n while (i)\r\n if (unhandledErrors[--i]._value === promise._value) {\r\n // Found a promise that failed with this same error object pointer,\r\n // Remove that since there is a listener that actually takes care of it.\r\n unhandledErrors.splice(i, 1);\r\n return;\r\n }\r\n}\r\nfunction PromiseReject(reason) {\r\n return new Promise(INTERNAL, false, reason);\r\n}\r\nfunction wrap(fn, errorCatcher) {\r\n var psd = PSD;\r\n return function () {\r\n var wasRootExec = beginMicroTickScope(), outerScope = PSD;\r\n try {\r\n switchToZone(psd, true);\r\n return fn.apply(this, arguments);\r\n }\r\n catch (e) {\r\n errorCatcher && errorCatcher(e);\r\n }\r\n finally {\r\n switchToZone(outerScope, false);\r\n if (wasRootExec)\r\n endMicroTickScope();\r\n }\r\n };\r\n}\r\n//\r\n// variables used for native await support\r\n//\r\nvar task = { awaits: 0, echoes: 0, id: 0 }; // The ongoing macro-task when using zone-echoing.\r\nvar taskCounter = 0; // ID counter for macro tasks.\r\nvar zoneStack = []; // Stack of left zones to restore asynchronically.\r\nvar zoneEchoes = 0; // zoneEchoes is a must in order to persist zones between native await expressions.\r\nvar totalEchoes = 0; // ID counter for micro-tasks. Used to detect possible native await in our Promise.prototype.then.\r\nvar zone_id_counter = 0;\r\nfunction newScope(fn, props$$1, a1, a2) {\r\n var parent = PSD, psd = Object.create(parent);\r\n psd.parent = parent;\r\n psd.ref = 0;\r\n psd.global = false;\r\n psd.id = ++zone_id_counter;\r\n // Prepare for promise patching (done in usePSD):\r\n var globalEnv = globalPSD.env;\r\n psd.env = patchGlobalPromise ? {\r\n Promise: Promise,\r\n PromiseProp: { value: Promise, configurable: true, writable: true },\r\n all: Promise.all,\r\n race: Promise.race,\r\n resolve: Promise.resolve,\r\n reject: Promise.reject,\r\n nthen: getPatchedPromiseThen(globalEnv.nthen, psd),\r\n gthen: getPatchedPromiseThen(globalEnv.gthen, psd) // global then\r\n } : {};\r\n if (props$$1)\r\n extend(psd, props$$1);\r\n // unhandleds and onunhandled should not be specifically set here.\r\n // Leave them on parent prototype.\r\n // unhandleds.push(err) will push to parent's prototype\r\n // onunhandled() will call parents onunhandled (with this scope's this-pointer though!)\r\n ++parent.ref;\r\n psd.finalize = function () {\r\n --this.parent.ref || this.parent.finalize();\r\n };\r\n var rv = usePSD(psd, fn, a1, a2);\r\n if (psd.ref === 0)\r\n psd.finalize();\r\n return rv;\r\n}\r\n// Function to call if scopeFunc returns NativePromise\r\n// Also for each NativePromise in the arguments to Promise.all()\r\nfunction incrementExpectedAwaits() {\r\n if (!task.id)\r\n task.id = ++taskCounter;\r\n ++task.awaits;\r\n task.echoes += ZONE_ECHO_LIMIT;\r\n return task.id;\r\n}\r\n// Function to call when 'then' calls back on a native promise where onAwaitExpected() had been called.\r\n// Also call this when a native await calls then method on a promise. In that case, don't supply\r\n// sourceTaskId because we already know it refers to current task.\r\nfunction decrementExpectedAwaits(sourceTaskId) {\r\n if (!task.awaits || (sourceTaskId && sourceTaskId !== task.id))\r\n return;\r\n if (--task.awaits === 0)\r\n task.id = 0;\r\n task.echoes = task.awaits * ZONE_ECHO_LIMIT; // Will reset echoes to 0 if awaits is 0.\r\n}\r\n// Call from Promise.all() and Promise.race()\r\nfunction onPossibleParallellAsync(possiblePromise) {\r\n if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) {\r\n incrementExpectedAwaits();\r\n return possiblePromise.then(function (x) {\r\n decrementExpectedAwaits();\r\n return x;\r\n }, function (e) {\r\n decrementExpectedAwaits();\r\n return rejection(e);\r\n });\r\n }\r\n return possiblePromise;\r\n}\r\nfunction zoneEnterEcho(targetZone) {\r\n ++totalEchoes;\r\n if (!task.echoes || --task.echoes === 0) {\r\n task.echoes = task.id = 0; // Cancel zone echoing.\r\n }\r\n zoneStack.push(PSD);\r\n switchToZone(targetZone, true);\r\n}\r\nfunction zoneLeaveEcho() {\r\n var zone = zoneStack[zoneStack.length - 1];\r\n zoneStack.pop();\r\n switchToZone(zone, false);\r\n}\r\nfunction switchToZone(targetZone, bEnteringZone) {\r\n var currentZone = PSD;\r\n if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) {\r\n // Enter or leave zone asynchronically as well, so that tasks initiated during current tick\r\n // will be surrounded by the zone when they are invoked.\r\n enqueueNativeMicroTask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);\r\n }\r\n if (targetZone === PSD)\r\n return;\r\n PSD = targetZone; // The actual zone switch occurs at this line.\r\n // Snapshot on every leave from global zone.\r\n if (currentZone === globalPSD)\r\n globalPSD.env = snapShot();\r\n if (patchGlobalPromise) {\r\n // Let's patch the global and native Promises (may be same or may be different)\r\n var GlobalPromise = globalPSD.env.Promise;\r\n // Swich environments (may be PSD-zone or the global zone. Both apply.)\r\n var targetEnv = targetZone.env;\r\n // Change Promise.prototype.then for native and global Promise (they MAY differ on polyfilled environments, but both can be accessed)\r\n // Must be done on each zone change because the patched method contains targetZone in its closure.\r\n nativePromiseProto.then = targetEnv.nthen;\r\n GlobalPromise.prototype.then = targetEnv.gthen;\r\n if (currentZone.global || targetZone.global) {\r\n // Leaving or entering global zone. It's time to patch / restore global Promise.\r\n // Set this Promise to window.Promise so that transiled async functions will work on Firefox, Safari and IE, as well as with Zonejs and angular.\r\n Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp);\r\n // Support Promise.all() etc to work indexedDB-safe also when people are including es6-promise as a module (they might\r\n // not be accessing global.Promise but a local reference to it)\r\n GlobalPromise.all = targetEnv.all;\r\n GlobalPromise.race = targetEnv.race;\r\n GlobalPromise.resolve = targetEnv.resolve;\r\n GlobalPromise.reject = targetEnv.reject;\r\n }\r\n }\r\n}\r\nfunction snapShot() {\r\n var GlobalPromise = _global.Promise;\r\n return patchGlobalPromise ? {\r\n Promise: GlobalPromise,\r\n PromiseProp: Object.getOwnPropertyDescriptor(_global, \"Promise\"),\r\n all: GlobalPromise.all,\r\n race: GlobalPromise.race,\r\n resolve: GlobalPromise.resolve,\r\n reject: GlobalPromise.reject,\r\n nthen: nativePromiseProto.then,\r\n gthen: GlobalPromise.prototype.then\r\n } : {};\r\n}\r\nfunction usePSD(psd, fn, a1, a2, a3) {\r\n var outerScope = PSD;\r\n try {\r\n switchToZone(psd, true);\r\n return fn(a1, a2, a3);\r\n }\r\n finally {\r\n switchToZone(outerScope, false);\r\n }\r\n}\r\nfunction enqueueNativeMicroTask(job) {\r\n //\r\n // Precondition: nativePromiseThen !== undefined\r\n //\r\n nativePromiseThen.call(resolvedNativePromise, job);\r\n}\r\nfunction nativeAwaitCompatibleWrap(fn, zone, possibleAwait) {\r\n return typeof fn !== 'function' ? fn : function () {\r\n var outerZone = PSD;\r\n if (possibleAwait)\r\n incrementExpectedAwaits();\r\n switchToZone(zone, true);\r\n try {\r\n return fn.apply(this, arguments);\r\n }\r\n finally {\r\n switchToZone(outerZone, false);\r\n }\r\n };\r\n}\r\nfunction getPatchedPromiseThen(origThen, zone) {\r\n return function (onResolved, onRejected) {\r\n return origThen.call(this, nativeAwaitCompatibleWrap(onResolved, zone, false), nativeAwaitCompatibleWrap(onRejected, zone, false));\r\n };\r\n}\r\nvar UNHANDLEDREJECTION = \"unhandledrejection\";\r\nfunction globalError(err, promise) {\r\n var rv;\r\n try {\r\n rv = promise.onuncatched(err);\r\n }\r\n catch (e) { }\r\n if (rv !== false)\r\n try {\r\n var event, eventData = { promise: promise, reason: err };\r\n if (_global.document && document.createEvent) {\r\n event = document.createEvent('Event');\r\n event.initEvent(UNHANDLEDREJECTION, true, true);\r\n extend(event, eventData);\r\n }\r\n else if (_global.CustomEvent) {\r\n event = new CustomEvent(UNHANDLEDREJECTION, { detail: eventData });\r\n extend(event, eventData);\r\n }\r\n if (event && _global.dispatchEvent) {\r\n dispatchEvent(event);\r\n if (!_global.PromiseRejectionEvent && _global.onunhandledrejection)\r\n // No native support for PromiseRejectionEvent but user has set window.onunhandledrejection. Manually call it.\r\n try {\r\n _global.onunhandledrejection(event);\r\n }\r\n catch (_) { }\r\n }\r\n if (!event.defaultPrevented) {\r\n console.warn(\"Unhandled rejection: \" + (err.stack || err));\r\n }\r\n }\r\n catch (e) { }\r\n}\r\ndoFakeAutoComplete(function () {\r\n // Simplify the job for VS Intellisense. This piece of code is one of the keys to the new marvellous intellisense support in Dexie.\r\n asap$1 = function (fn, args) {\r\n setTimeout(function () { fn.apply(null, args); }, 0);\r\n };\r\n});\r\nvar rejection = Promise.reject;\n\nfunction Events(ctx) {\r\n var evs = {};\r\n var rv = function (eventName, subscriber) {\r\n if (subscriber) {\r\n // Subscribe. If additional arguments than just the subscriber was provided, forward them as well.\r\n var i = arguments.length, args = new Array(i - 1);\r\n while (--i)\r\n args[i - 1] = arguments[i];\r\n evs[eventName].subscribe.apply(null, args);\r\n return ctx;\r\n }\r\n else if (typeof (eventName) === 'string') {\r\n // Return interface allowing to fire or unsubscribe from event\r\n return evs[eventName];\r\n }\r\n };\r\n rv.addEventType = add;\r\n for (var i = 1, l = arguments.length; i < l; ++i) {\r\n add(arguments[i]);\r\n }\r\n return rv;\r\n function add(eventName, chainFunction, defaultFunction) {\r\n if (typeof eventName === 'object')\r\n return addConfiguredEvents(eventName);\r\n if (!chainFunction)\r\n chainFunction = reverseStoppableEventChain;\r\n if (!defaultFunction)\r\n defaultFunction = nop;\r\n var context = {\r\n subscribers: [],\r\n fire: defaultFunction,\r\n subscribe: function (cb) {\r\n if (context.subscribers.indexOf(cb) === -1) {\r\n context.subscribers.push(cb);\r\n context.fire = chainFunction(context.fire, cb);\r\n }\r\n },\r\n unsubscribe: function (cb) {\r\n context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; });\r\n context.fire = context.subscribers.reduce(chainFunction, defaultFunction);\r\n }\r\n };\r\n evs[eventName] = rv[eventName] = context;\r\n return context;\r\n }\r\n function addConfiguredEvents(cfg) {\r\n // events(this, {reading: [functionChain, nop]});\r\n keys(cfg).forEach(function (eventName) {\r\n var args = cfg[eventName];\r\n if (isArray(args)) {\r\n add(eventName, cfg[eventName][0], cfg[eventName][1]);\r\n }\r\n else if (args === 'asap') {\r\n // Rather than approaching event subscription using a functional approach, we here do it in a for-loop where subscriber is executed in its own stack\r\n // enabling that any exception that occur wont disturb the initiator and also not nescessary be catched and forgotten.\r\n var context = add(eventName, mirror, function fire() {\r\n // Optimazation-safe cloning of arguments into args.\r\n var i = arguments.length, args = new Array(i);\r\n while (i--)\r\n args[i] = arguments[i];\r\n // All each subscriber:\r\n context.subscribers.forEach(function (fn) {\r\n asap(function fireEvent() {\r\n fn.apply(null, args);\r\n });\r\n });\r\n });\r\n }\r\n else\r\n throw new exceptions.InvalidArgument(\"Invalid event config\");\r\n });\r\n }\r\n}\n\n/*\r\n * Dexie.js - a minimalistic wrapper for IndexedDB\r\n * ===============================================\r\n *\r\n * By David Fahlander, david.fahlander@gmail.com\r\n *\r\n * Version {version}, {date}\r\n *\r\n * http://dexie.org\r\n *\r\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/\r\n */\r\nvar DEXIE_VERSION = '{version}';\nvar maxString = String.fromCharCode(65535);\nvar maxKey = (function () { try {\r\n IDBKeyRange.only([[]]);\r\n return [[]];\r\n}\r\ncatch (e) {\r\n return maxString;\r\n} })();\nvar minKey = -Infinity;\nvar INVALID_KEY_ARGUMENT = \"Invalid key provided. Keys must be of type string, number, Date or Array.\";\nvar STRING_EXPECTED = \"String expected.\";\nvar connections = [];\nvar isIEOrEdge = typeof navigator !== 'undefined' && /(MSIE|Trident|Edge)/.test(navigator.userAgent);\nvar hasIEDeleteObjectStoreBug = isIEOrEdge;\nvar hangsOnDeleteLargeKeyRange = isIEOrEdge;\nvar dexieStackFrameFilter = function (frame) { return !/(dexie\\.js|dexie\\.min\\.js)/.test(frame); };\nvar dbNamesDB; // Global database for backing Dexie.getDatabaseNames() on browser without indexedDB.webkitGetDatabaseNames() \r\n// Init debug\r\nsetDebug(debug, dexieStackFrameFilter);\r\nfunction Dexie(dbName, options) {\r\n /// Specify only if you wich to control which addons that should run on this instance\r\n var deps = Dexie.dependencies;\r\n var opts = extend({\r\n // Default Options\r\n addons: Dexie.addons,\r\n autoOpen: true,\r\n indexedDB: deps.indexedDB,\r\n IDBKeyRange: deps.IDBKeyRange // Backend IDBKeyRange api. Default to browser env.\r\n }, options);\r\n var addons = opts.addons, autoOpen = opts.autoOpen, indexedDB = opts.indexedDB, IDBKeyRange = opts.IDBKeyRange;\r\n var globalSchema = this._dbSchema = {};\r\n var versions = [];\r\n var dbStoreNames = [];\r\n var allTables = {};\r\n ///\r\n var idbdb = null; // Instance of IDBDatabase\r\n var dbOpenError = null;\r\n var isBeingOpened = false;\r\n var onReadyBeingFired = null;\r\n var openComplete = false;\r\n var READONLY = \"readonly\", READWRITE = \"readwrite\";\r\n var db = this;\r\n var dbReadyResolve, dbReadyPromise = new Promise(function (resolve) {\r\n dbReadyResolve = resolve;\r\n }), cancelOpen, openCanceller = new Promise(function (_, reject) {\r\n cancelOpen = reject;\r\n });\r\n var autoSchema = true;\r\n var hasNativeGetDatabaseNames = !!getNativeGetDatabaseNamesFn(indexedDB), hasGetAll;\r\n function init() {\r\n // Default subscribers to \"versionchange\" and \"blocked\".\r\n // Can be overridden by custom handlers. If custom handlers return false, these default\r\n // behaviours will be prevented.\r\n db.on(\"versionchange\", function (ev) {\r\n // Default behavior for versionchange event is to close database connection.\r\n // Caller can override this behavior by doing db.on(\"versionchange\", function(){ return false; });\r\n // Let's not block the other window from making it's delete() or open() call.\r\n // NOTE! This event is never fired in IE,Edge or Safari.\r\n if (ev.newVersion > 0)\r\n console.warn(\"Another connection wants to upgrade database '\" + db.name + \"'. Closing db now to resume the upgrade.\");\r\n else\r\n console.warn(\"Another connection wants to delete database '\" + db.name + \"'. Closing db now to resume the delete request.\");\r\n db.close();\r\n // In many web applications, it would be recommended to force window.reload()\r\n // when this event occurs. To do that, subscribe to the versionchange event\r\n // and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)\r\n // The reason for this is that your current web app obviously has old schema code that needs\r\n // to be updated. Another window got a newer version of the app and needs to upgrade DB but\r\n // your window is blocking it unless we close it here.\r\n });\r\n db.on(\"blocked\", function (ev) {\r\n if (!ev.newVersion || ev.newVersion < ev.oldVersion)\r\n console.warn(\"Dexie.delete('\" + db.name + \"') was blocked\");\r\n else\r\n console.warn(\"Upgrade '\" + db.name + \"' blocked by other connection holding version \" + ev.oldVersion / 10);\r\n });\r\n }\r\n //\r\n //\r\n //\r\n // ------------------------- Versioning Framework---------------------------\r\n //\r\n //\r\n //\r\n this.version = function (versionNumber) {\r\n /// \r\n /// \r\n if (idbdb || isBeingOpened)\r\n throw new exceptions.Schema(\"Cannot add version when database is open\");\r\n this.verno = Math.max(this.verno, versionNumber);\r\n var versionInstance = versions.filter(function (v) { return v._cfg.version === versionNumber; })[0];\r\n if (versionInstance)\r\n return versionInstance;\r\n versionInstance = new Version(versionNumber);\r\n versions.push(versionInstance);\r\n versions.sort(lowerVersionFirst);\r\n // Disable autoschema mode, as at least one version is specified.\r\n autoSchema = false;\r\n return versionInstance;\r\n };\r\n function Version(versionNumber) {\r\n this._cfg = {\r\n version: versionNumber,\r\n storesSource: null,\r\n dbschema: {},\r\n tables: {},\r\n contentUpgrade: null\r\n };\r\n this.stores({}); // Derive earlier schemas by default.\r\n }\r\n extend(Version.prototype, {\r\n stores: function (stores) {\r\n /// \r\n /// Defines the schema for a particular version\r\n /// \r\n /// \r\n /// Example:
\r\n /// {users: \"id++,first,last,&username,*email\",
\r\n /// passwords: \"id++,&username\"}
\r\n ///
\r\n /// Syntax: {Table: \"[primaryKey][++],[&][*]index1,[&][*]index2,...\"}

\r\n /// Special characters:
\r\n /// \"&\" means unique key,
\r\n /// \"*\" means value is multiEntry,
\r\n /// \"++\" means auto-increment and only applicable for primary key
\r\n /// \r\n this._cfg.storesSource = this._cfg.storesSource ? extend(this._cfg.storesSource, stores) : stores;\r\n // Derive stores from earlier versions if they are not explicitely specified as null or a new syntax.\r\n var storesSpec = {};\r\n versions.forEach(function (version) {\r\n extend(storesSpec, version._cfg.storesSource);\r\n });\r\n var dbschema = (this._cfg.dbschema = {});\r\n this._parseStoresSpec(storesSpec, dbschema);\r\n // Update the latest schema to this version\r\n // Update API\r\n globalSchema = db._dbSchema = dbschema;\r\n removeTablesApi([allTables, db, Transaction.prototype]); // Keep Transaction.prototype even though it should be depr.\r\n setApiOnPlace([allTables, db, Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema);\r\n dbStoreNames = keys(dbschema);\r\n return this;\r\n },\r\n upgrade: function (upgradeFunction) {\r\n /// Function that performs upgrading actions.\r\n var self = this;\r\n fakeAutoComplete(function () {\r\n upgradeFunction(db._createTransaction(READWRITE, keys(self._cfg.dbschema), self._cfg.dbschema)); // BUGBUG: No code completion for prev version's tables wont appear.\r\n });\r\n this._cfg.contentUpgrade = upgradeFunction;\r\n return this;\r\n },\r\n _parseStoresSpec: function (stores, outSchema) {\r\n keys(stores).forEach(function (tableName) {\r\n if (stores[tableName] !== null) {\r\n var instanceTemplate = {};\r\n var indexes = parseIndexSyntax(stores[tableName]);\r\n var primKey = indexes.shift();\r\n if (primKey.multi)\r\n throw new exceptions.Schema(\"Primary key cannot be multi-valued\");\r\n if (primKey.keyPath)\r\n setByKeyPath(instanceTemplate, primKey.keyPath, primKey.auto ? 0 : primKey.keyPath);\r\n indexes.forEach(function (idx) {\r\n if (idx.auto)\r\n throw new exceptions.Schema(\"Only primary key can be marked as autoIncrement (++)\");\r\n if (!idx.keyPath)\r\n throw new exceptions.Schema(\"Index must have a name and cannot be an empty string\");\r\n setByKeyPath(instanceTemplate, idx.keyPath, idx.compound ? idx.keyPath.map(function () { return \"\"; }) : \"\");\r\n });\r\n outSchema[tableName] = new TableSchema(tableName, primKey, indexes, instanceTemplate);\r\n }\r\n });\r\n }\r\n });\r\n function runUpgraders(oldVersion, idbtrans, reject) {\r\n var trans = db._createTransaction(READWRITE, dbStoreNames, globalSchema);\r\n trans.create(idbtrans);\r\n trans._completion.catch(reject);\r\n var rejectTransaction = trans._reject.bind(trans);\r\n newScope(function () {\r\n PSD.trans = trans;\r\n if (oldVersion === 0) {\r\n // Create tables:\r\n keys(globalSchema).forEach(function (tableName) {\r\n createTable(idbtrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes);\r\n });\r\n Promise.follow(function () { return db.on.populate.fire(trans); }).catch(rejectTransaction);\r\n }\r\n else\r\n updateTablesAndIndexes(oldVersion, trans, idbtrans).catch(rejectTransaction);\r\n });\r\n }\r\n function updateTablesAndIndexes(oldVersion, trans, idbtrans) {\r\n // Upgrade version to version, step-by-step from oldest to newest version.\r\n // Each transaction object will contain the table set that was current in that version (but also not-yet-deleted tables from its previous version)\r\n var queue = [];\r\n var oldVersionStruct = versions.filter(function (version) { return version._cfg.version === oldVersion; })[0];\r\n if (!oldVersionStruct)\r\n throw new exceptions.Upgrade(\"Dexie specification of currently installed DB version is missing\");\r\n globalSchema = db._dbSchema = oldVersionStruct._cfg.dbschema;\r\n var anyContentUpgraderHasRun = false;\r\n var versToRun = versions.filter(function (v) { return v._cfg.version > oldVersion; });\r\n versToRun.forEach(function (version) {\r\n /// \r\n queue.push(function () {\r\n var oldSchema = globalSchema;\r\n var newSchema = version._cfg.dbschema;\r\n adjustToExistingIndexNames(oldSchema, idbtrans);\r\n adjustToExistingIndexNames(newSchema, idbtrans);\r\n globalSchema = db._dbSchema = newSchema;\r\n var diff = getSchemaDiff(oldSchema, newSchema);\r\n // Add tables \r\n diff.add.forEach(function (tuple) {\r\n createTable(idbtrans, tuple[0], tuple[1].primKey, tuple[1].indexes);\r\n });\r\n // Change tables\r\n diff.change.forEach(function (change) {\r\n if (change.recreate) {\r\n throw new exceptions.Upgrade(\"Not yet support for changing primary key\");\r\n }\r\n else {\r\n var store = idbtrans.objectStore(change.name);\r\n // Add indexes\r\n change.add.forEach(function (idx) {\r\n addIndex(store, idx);\r\n });\r\n // Update indexes\r\n change.change.forEach(function (idx) {\r\n store.deleteIndex(idx.name);\r\n addIndex(store, idx);\r\n });\r\n // Delete indexes\r\n change.del.forEach(function (idxName) {\r\n store.deleteIndex(idxName);\r\n });\r\n }\r\n });\r\n if (version._cfg.contentUpgrade) {\r\n anyContentUpgraderHasRun = true;\r\n return Promise.follow(function () {\r\n version._cfg.contentUpgrade(trans);\r\n });\r\n }\r\n });\r\n queue.push(function (idbtrans) {\r\n if (!anyContentUpgraderHasRun || !hasIEDeleteObjectStoreBug) {\r\n var newSchema = version._cfg.dbschema;\r\n // Delete old tables\r\n deleteRemovedTables(newSchema, idbtrans);\r\n }\r\n });\r\n });\r\n // Now, create a queue execution engine\r\n function runQueue() {\r\n return queue.length ? Promise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) :\r\n Promise.resolve();\r\n }\r\n return runQueue().then(function () {\r\n createMissingTables(globalSchema, idbtrans); // At last, make sure to create any missing tables. (Needed by addons that add stores to DB without specifying version)\r\n });\r\n }\r\n function getSchemaDiff(oldSchema, newSchema) {\r\n var diff = {\r\n del: [],\r\n add: [],\r\n change: [] // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}\r\n };\r\n for (var table in oldSchema) {\r\n if (!newSchema[table])\r\n diff.del.push(table);\r\n }\r\n for (table in newSchema) {\r\n var oldDef = oldSchema[table], newDef = newSchema[table];\r\n if (!oldDef) {\r\n diff.add.push([table, newDef]);\r\n }\r\n else {\r\n var change = {\r\n name: table,\r\n def: newDef,\r\n recreate: false,\r\n del: [],\r\n add: [],\r\n change: []\r\n };\r\n if (oldDef.primKey.src !== newDef.primKey.src) {\r\n // Primary key has changed. Remove and re-add table.\r\n change.recreate = true;\r\n diff.change.push(change);\r\n }\r\n else {\r\n // Same primary key. Just find out what differs:\r\n var oldIndexes = oldDef.idxByName;\r\n var newIndexes = newDef.idxByName;\r\n for (var idxName in oldIndexes) {\r\n if (!newIndexes[idxName])\r\n change.del.push(idxName);\r\n }\r\n for (idxName in newIndexes) {\r\n var oldIdx = oldIndexes[idxName], newIdx = newIndexes[idxName];\r\n if (!oldIdx)\r\n change.add.push(newIdx);\r\n else if (oldIdx.src !== newIdx.src)\r\n change.change.push(newIdx);\r\n }\r\n if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) {\r\n diff.change.push(change);\r\n }\r\n }\r\n }\r\n }\r\n return diff;\r\n }\r\n function createTable(idbtrans, tableName, primKey, indexes) {\r\n /// \r\n var store = idbtrans.db.createObjectStore(tableName, primKey.keyPath ? { keyPath: primKey.keyPath, autoIncrement: primKey.auto } : { autoIncrement: primKey.auto });\r\n indexes.forEach(function (idx) { addIndex(store, idx); });\r\n return store;\r\n }\r\n function createMissingTables(newSchema, idbtrans) {\r\n keys(newSchema).forEach(function (tableName) {\r\n if (!idbtrans.db.objectStoreNames.contains(tableName)) {\r\n createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes);\r\n }\r\n });\r\n }\r\n function deleteRemovedTables(newSchema, idbtrans) {\r\n for (var i = 0; i < idbtrans.db.objectStoreNames.length; ++i) {\r\n var storeName = idbtrans.db.objectStoreNames[i];\r\n if (newSchema[storeName] == null) {\r\n idbtrans.db.deleteObjectStore(storeName);\r\n }\r\n }\r\n }\r\n function addIndex(store, idx) {\r\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi });\r\n }\r\n //\r\n //\r\n // Dexie Protected API\r\n //\r\n //\r\n this._allTables = allTables;\r\n this._createTransaction = function (mode, storeNames, dbschema, parentTransaction) {\r\n return new Transaction(mode, storeNames, dbschema, parentTransaction);\r\n };\r\n /* Generate a temporary transaction when db operations are done outside a transaction scope.\r\n */\r\n function tempTransaction(mode, storeNames, fn) {\r\n if (!openComplete && (!PSD.letThrough)) {\r\n if (!isBeingOpened) {\r\n if (!autoOpen)\r\n return rejection(new exceptions.DatabaseClosed());\r\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\r\n }\r\n return dbReadyPromise.then(function () { return tempTransaction(mode, storeNames, fn); });\r\n }\r\n else {\r\n var trans = db._createTransaction(mode, storeNames, globalSchema);\r\n try {\r\n trans.create();\r\n }\r\n catch (ex) {\r\n return rejection(ex);\r\n }\r\n return trans._promise(mode, function (resolve, reject) {\r\n return newScope(function () {\r\n PSD.trans = trans;\r\n return fn(resolve, reject, trans);\r\n });\r\n }).then(function (result) {\r\n // Instead of resolving value directly, wait with resolving it until transaction has completed.\r\n // Otherwise the data would not be in the DB if requesting it in the then() operation.\r\n // Specifically, to ensure that the following expression will work:\r\n //\r\n // db.friends.put({name: \"Arne\"}).then(function () {\r\n // db.friends.where(\"name\").equals(\"Arne\").count(function(count) {\r\n // assert (count === 1);\r\n // });\r\n // });\r\n //\r\n return trans._completion.then(function () { return result; });\r\n }); /*.catch(err => { // Don't do this as of now. If would affect bulk- and modify methods in a way that could be more intuitive. But wait! Maybe change in next major.\r\n trans._reject(err);\r\n return rejection(err);\r\n });*/\r\n }\r\n }\r\n this._whenReady = function (fn) {\r\n return fake || openComplete || PSD.letThrough ? fn() : new Promise(function (resolve, reject) {\r\n if (!isBeingOpened) {\r\n if (!autoOpen) {\r\n reject(new exceptions.DatabaseClosed());\r\n return;\r\n }\r\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\r\n }\r\n dbReadyPromise.then(resolve, reject);\r\n }).then(fn);\r\n };\r\n //\r\n //\r\n //\r\n //\r\n // Dexie API\r\n //\r\n //\r\n //\r\n this.verno = 0;\r\n this.open = function () {\r\n if (isBeingOpened || idbdb)\r\n return dbReadyPromise.then(function () { return dbOpenError ? rejection(dbOpenError) : db; });\r\n debug && (openCanceller._stackHolder = getErrorWithStack()); // Let stacks point to when open() was called rather than where new Dexie() was called.\r\n isBeingOpened = true;\r\n dbOpenError = null;\r\n openComplete = false;\r\n // Function pointers to call when the core opening process completes.\r\n var resolveDbReady = dbReadyResolve, \r\n // upgradeTransaction to abort on failure.\r\n upgradeTransaction = null;\r\n return Promise.race([openCanceller, new Promise(function (resolve, reject) {\r\n doFakeAutoComplete(function () { return resolve(); });\r\n // Multiply db.verno with 10 will be needed to workaround upgrading bug in IE:\r\n // IE fails when deleting objectStore after reading from it.\r\n // A future version of Dexie.js will stopover an intermediate version to workaround this.\r\n // At that point, we want to be backward compatible. Could have been multiplied with 2, but by using 10, it is easier to map the number to the real version number.\r\n // If no API, throw!\r\n if (!indexedDB)\r\n throw new exceptions.MissingAPI(\"indexedDB API not found. If using IE10+, make sure to run your code on a server URL \" +\r\n \"(not locally). If using old Safari versions, make sure to include indexedDB polyfill.\");\r\n var req = autoSchema ? indexedDB.open(dbName) : indexedDB.open(dbName, Math.round(db.verno * 10));\r\n if (!req)\r\n throw new exceptions.MissingAPI(\"IndexedDB API not available\"); // May happen in Safari private mode, see https://github.com/dfahlander/Dexie.js/issues/134\r\n req.onerror = eventRejectHandler(reject);\r\n req.onblocked = wrap(fireOnBlocked);\r\n req.onupgradeneeded = wrap(function (e) {\r\n upgradeTransaction = req.transaction;\r\n if (autoSchema && !db._allowEmptyDB) {\r\n // Caller did not specify a version or schema. Doing that is only acceptable for opening alread existing databases.\r\n // If onupgradeneeded is called it means database did not exist. Reject the open() promise and make sure that we\r\n // do not create a new database by accident here.\r\n req.onerror = preventDefault; // Prohibit onabort error from firing before we're done!\r\n upgradeTransaction.abort(); // Abort transaction (would hope that this would make DB disappear but it doesnt.)\r\n // Close database and delete it.\r\n req.result.close();\r\n var delreq = indexedDB.deleteDatabase(dbName); // The upgrade transaction is atomic, and javascript is single threaded - meaning that there is no risk that we delete someone elses database here!\r\n delreq.onsuccess = delreq.onerror = wrap(function () {\r\n reject(new exceptions.NoSuchDatabase(\"Database \" + dbName + \" doesnt exist\"));\r\n });\r\n }\r\n else {\r\n upgradeTransaction.onerror = eventRejectHandler(reject);\r\n var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; // Safari 8 fix.\r\n runUpgraders(oldVer / 10, upgradeTransaction, reject, req);\r\n }\r\n }, reject);\r\n req.onsuccess = wrap(function () {\r\n // Core opening procedure complete. Now let's just record some stuff.\r\n upgradeTransaction = null;\r\n idbdb = req.result;\r\n connections.push(db); // Used for emulating versionchange event on IE/Edge/Safari.\r\n if (autoSchema)\r\n readGlobalSchema();\r\n else if (idbdb.objectStoreNames.length > 0) {\r\n try {\r\n adjustToExistingIndexNames(globalSchema, idbdb.transaction(safariMultiStoreFix(idbdb.objectStoreNames), READONLY));\r\n }\r\n catch (e) {\r\n }\r\n }\r\n idbdb.onversionchange = wrap(function (ev) {\r\n db._vcFired = true; // detect implementations that not support versionchange (IE/Edge/Safari)\r\n db.on(\"versionchange\").fire(ev);\r\n });\r\n if (!hasNativeGetDatabaseNames && dbName !== '__dbnames') {\r\n dbNamesDB.dbnames.put({ name: dbName }).catch(nop);\r\n }\r\n resolve();\r\n }, reject);\r\n })]).then(function () {\r\n // Before finally resolving the dbReadyPromise and this promise,\r\n // call and await all on('ready') subscribers:\r\n // Dexie.vip() makes subscribers able to use the database while being opened.\r\n // This is a must since these subscribers take part of the opening procedure.\r\n onReadyBeingFired = [];\r\n return Promise.resolve(Dexie.vip(db.on.ready.fire)).then(function fireRemainders() {\r\n if (onReadyBeingFired.length > 0) {\r\n // In case additional subscribers to db.on('ready') were added during the time db.on.ready.fire was executed.\r\n var remainders = onReadyBeingFired.reduce(promisableChain, nop);\r\n onReadyBeingFired = [];\r\n return Promise.resolve(Dexie.vip(remainders)).then(fireRemainders);\r\n }\r\n });\r\n }).finally(function () {\r\n onReadyBeingFired = null;\r\n }).then(function () {\r\n // Resolve the db.open() with the db instance.\r\n isBeingOpened = false;\r\n return db;\r\n }).catch(function (err) {\r\n try {\r\n // Did we fail within onupgradeneeded? Make sure to abort the upgrade transaction so it doesnt commit.\r\n upgradeTransaction && upgradeTransaction.abort();\r\n }\r\n catch (e) { }\r\n isBeingOpened = false; // Set before calling db.close() so that it doesnt reject openCanceller again (leads to unhandled rejection event).\r\n db.close(); // Closes and resets idbdb, removes connections, resets dbReadyPromise and openCanceller so that a later db.open() is fresh.\r\n // A call to db.close() may have made on-ready subscribers fail. Use dbOpenError if set, since err could be a follow-up error on that.\r\n dbOpenError = err; // Record the error. It will be used to reject further promises of db operations.\r\n return rejection(dbOpenError);\r\n }).finally(function () {\r\n openComplete = true;\r\n resolveDbReady(); // dbReadyPromise is resolved no matter if open() rejects or resolved. It's just to wake up waiters.\r\n });\r\n };\r\n this.close = function () {\r\n var idx = connections.indexOf(db);\r\n if (idx >= 0)\r\n connections.splice(idx, 1);\r\n if (idbdb) {\r\n try {\r\n idbdb.close();\r\n }\r\n catch (e) { }\r\n idbdb = null;\r\n }\r\n autoOpen = false;\r\n dbOpenError = new exceptions.DatabaseClosed();\r\n if (isBeingOpened)\r\n cancelOpen(dbOpenError);\r\n // Reset dbReadyPromise promise:\r\n dbReadyPromise = new Promise(function (resolve) {\r\n dbReadyResolve = resolve;\r\n });\r\n openCanceller = new Promise(function (_, reject) {\r\n cancelOpen = reject;\r\n });\r\n };\r\n this.delete = function () {\r\n var hasArguments = arguments.length > 0;\r\n return new Promise(function (resolve, reject) {\r\n if (hasArguments)\r\n throw new exceptions.InvalidArgument(\"Arguments not allowed in db.delete()\");\r\n if (isBeingOpened) {\r\n dbReadyPromise.then(doDelete);\r\n }\r\n else {\r\n doDelete();\r\n }\r\n function doDelete() {\r\n db.close();\r\n var req = indexedDB.deleteDatabase(dbName);\r\n req.onsuccess = wrap(function () {\r\n if (!hasNativeGetDatabaseNames) {\r\n dbNamesDB.dbnames.delete(dbName).catch(nop);\r\n }\r\n resolve();\r\n });\r\n req.onerror = eventRejectHandler(reject);\r\n req.onblocked = fireOnBlocked;\r\n }\r\n });\r\n };\r\n this.backendDB = function () {\r\n return idbdb;\r\n };\r\n this.isOpen = function () {\r\n return idbdb !== null;\r\n };\r\n this.hasBeenClosed = function () {\r\n return dbOpenError && (dbOpenError instanceof exceptions.DatabaseClosed);\r\n };\r\n this.hasFailed = function () {\r\n return dbOpenError !== null;\r\n };\r\n this.dynamicallyOpened = function () {\r\n return autoSchema;\r\n };\r\n //\r\n // Properties\r\n //\r\n this.name = dbName;\r\n // db.tables - an array of all Table instances.\r\n props(this, {\r\n tables: {\r\n get: function () {\r\n /// \r\n return keys(allTables).map(function (name) { return allTables[name]; });\r\n }\r\n }\r\n });\r\n //\r\n // Events\r\n //\r\n this.on = Events(this, \"populate\", \"blocked\", \"versionchange\", { ready: [promisableChain, nop] });\r\n this.on.ready.subscribe = override(this.on.ready.subscribe, function (subscribe) {\r\n return function (subscriber, bSticky) {\r\n Dexie.vip(function () {\r\n if (openComplete) {\r\n // Database already open. Call subscriber asap.\r\n if (!dbOpenError)\r\n Promise.resolve().then(subscriber);\r\n // bSticky: Also subscribe to future open sucesses (after close / reopen) \r\n if (bSticky)\r\n subscribe(subscriber);\r\n }\r\n else if (onReadyBeingFired) {\r\n // db.on('ready') subscribers are currently being executed and have not yet resolved or rejected\r\n onReadyBeingFired.push(subscriber);\r\n if (bSticky)\r\n subscribe(subscriber);\r\n }\r\n else {\r\n // Database not yet open. Subscribe to it.\r\n subscribe(subscriber);\r\n // If bSticky is falsy, make sure to unsubscribe subscriber when fired once.\r\n if (!bSticky)\r\n subscribe(function unsubscribe() {\r\n db.on.ready.unsubscribe(subscriber);\r\n db.on.ready.unsubscribe(unsubscribe);\r\n });\r\n }\r\n });\r\n };\r\n });\r\n fakeAutoComplete(function () {\r\n db.on(\"populate\").fire(db._createTransaction(READWRITE, dbStoreNames, globalSchema));\r\n });\r\n this.transaction = function () {\r\n /// \r\n ///\r\n /// \r\n /// \"r\" for readonly, or \"rw\" for readwrite\r\n /// Table instance, Array of Table instances, String or String Array of object stores to include in the transaction\r\n /// Function to execute with transaction\r\n var args = extractTransactionArgs.apply(this, arguments);\r\n return this._transaction.apply(this, args);\r\n };\r\n function extractTransactionArgs(mode, _tableArgs_, scopeFunc) {\r\n // Let table arguments be all arguments between mode and last argument.\r\n var i = arguments.length;\r\n if (i < 2)\r\n throw new exceptions.InvalidArgument(\"Too few arguments\");\r\n // Prevent optimzation killer (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments)\r\n // and clone arguments except the first one into local var 'args'.\r\n var args = new Array(i - 1);\r\n while (--i)\r\n args[i - 1] = arguments[i];\r\n // Let scopeFunc be the last argument and pop it so that args now only contain the table arguments.\r\n scopeFunc = args.pop();\r\n var tables = flatten(args); // Support using array as middle argument, or a mix of arrays and non-arrays.\r\n return [mode, tables, scopeFunc];\r\n }\r\n this._transaction = function (mode, tables, scopeFunc) {\r\n var parentTransaction = PSD.trans;\r\n // Check if parent transactions is bound to this db instance, and if caller wants to reuse it\r\n if (!parentTransaction || parentTransaction.db !== db || mode.indexOf('!') !== -1)\r\n parentTransaction = null;\r\n var onlyIfCompatible = mode.indexOf('?') !== -1;\r\n mode = mode.replace('!', '').replace('?', ''); // Ok. Will change arguments[0] as well but we wont touch arguments henceforth.\r\n try {\r\n //\r\n // Get storeNames from arguments. Either through given table instances, or through given table names.\r\n //\r\n var storeNames = tables.map(function (table) {\r\n var storeName = table instanceof Table ? table.name : table;\r\n if (typeof storeName !== 'string')\r\n throw new TypeError(\"Invalid table argument to Dexie.transaction(). Only Table or String are allowed\");\r\n return storeName;\r\n });\r\n //\r\n // Resolve mode. Allow shortcuts \"r\" and \"rw\".\r\n //\r\n if (mode == \"r\" || mode == READONLY)\r\n mode = READONLY;\r\n else if (mode == \"rw\" || mode == READWRITE)\r\n mode = READWRITE;\r\n else\r\n throw new exceptions.InvalidArgument(\"Invalid transaction mode: \" + mode);\r\n if (parentTransaction) {\r\n // Basic checks\r\n if (parentTransaction.mode === READONLY && mode === READWRITE) {\r\n if (onlyIfCompatible) {\r\n // Spawn new transaction instead.\r\n parentTransaction = null;\r\n }\r\n else\r\n throw new exceptions.SubTransaction(\"Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY\");\r\n }\r\n if (parentTransaction) {\r\n storeNames.forEach(function (storeName) {\r\n if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) {\r\n if (onlyIfCompatible) {\r\n // Spawn new transaction instead.\r\n parentTransaction = null;\r\n }\r\n else\r\n throw new exceptions.SubTransaction(\"Table \" + storeName +\r\n \" not included in parent transaction.\");\r\n }\r\n });\r\n }\r\n if (onlyIfCompatible && parentTransaction && !parentTransaction.active) {\r\n // '?' mode should not keep using an inactive transaction.\r\n parentTransaction = null;\r\n }\r\n }\r\n }\r\n catch (e) {\r\n return parentTransaction ?\r\n parentTransaction._promise(null, function (_, reject) { reject(e); }) :\r\n rejection(e);\r\n }\r\n // If this is a sub-transaction, lock the parent and then launch the sub-transaction.\r\n return (parentTransaction ?\r\n parentTransaction._promise(mode, enterTransactionScope, \"lock\") :\r\n PSD.trans ?\r\n // no parent transaction despite PSD.trans exists. Make sure also\r\n // that the zone we create is not a sub-zone of current, because\r\n // Promise.follow() should not wait for it if so.\r\n usePSD(PSD.transless, function () { return db._whenReady(enterTransactionScope); }) :\r\n db._whenReady(enterTransactionScope));\r\n function enterTransactionScope() {\r\n return Promise.resolve().then(function () {\r\n // Keep a pointer to last non-transactional PSD to use if someone calls Dexie.ignoreTransaction().\r\n var transless = PSD.transless || PSD;\r\n // Our transaction.\r\n //return new Promise((resolve, reject) => {\r\n var trans = db._createTransaction(mode, storeNames, globalSchema, parentTransaction);\r\n // Let the transaction instance be part of a Promise-specific data (PSD) value.\r\n var zoneProps = {\r\n trans: trans,\r\n transless: transless\r\n };\r\n if (parentTransaction) {\r\n // Emulate transaction commit awareness for inner transaction (must 'commit' when the inner transaction has no more operations ongoing)\r\n trans.idbtrans = parentTransaction.idbtrans;\r\n }\r\n else {\r\n trans.create(); // Create the backend transaction so that complete() or error() will trigger even if no operation is made upon it.\r\n }\r\n // Support for native async await.\r\n if (scopeFunc.constructor === AsyncFunction) {\r\n incrementExpectedAwaits();\r\n }\r\n var returnValue;\r\n var promiseFollowed = Promise.follow(function () {\r\n // Finally, call the scope function with our table and transaction arguments.\r\n returnValue = scopeFunc.call(trans, trans);\r\n if (returnValue) {\r\n if (returnValue.constructor === NativePromise) {\r\n var decrementor = decrementExpectedAwaits.bind(null, null);\r\n returnValue.then(decrementor, decrementor);\r\n }\r\n else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') {\r\n // scopeFunc returned an iterator with throw-support. Handle yield as await.\r\n returnValue = awaitIterator(returnValue);\r\n }\r\n }\r\n }, zoneProps);\r\n return (returnValue && typeof returnValue.then === 'function' ?\r\n // Promise returned. User uses promise-style transactions.\r\n Promise.resolve(returnValue).then(function (x) { return trans.active ?\r\n x // Transaction still active. Continue.\r\n : rejection(new exceptions.PrematureCommit(\"Transaction committed too early. See http://bit.ly/2kdckMn\")); })\r\n : promiseFollowed.then(function () { return returnValue; })).then(function (x) {\r\n // sub transactions don't react to idbtrans.oncomplete. We must trigger a completion:\r\n if (parentTransaction)\r\n trans._resolve();\r\n // wait for trans._completion\r\n // (if root transaction, this means 'complete' event. If sub-transaction, we've just fired it ourselves)\r\n return trans._completion.then(function () { return x; });\r\n }).catch(function (e) {\r\n trans._reject(e); // Yes, above then-handler were maybe not called because of an unhandled rejection in scopeFunc!\r\n return rejection(e);\r\n });\r\n });\r\n }\r\n };\r\n this.table = function (tableName) {\r\n /// \r\n if (fake && autoSchema)\r\n return new Table(tableName);\r\n if (!hasOwn(allTables, tableName)) {\r\n throw new exceptions.InvalidTable(\"Table \" + tableName + \" does not exist\");\r\n }\r\n return allTables[tableName];\r\n };\r\n //\r\n //\r\n //\r\n // Table Class\r\n //\r\n //\r\n //\r\n function Table(name, tableSchema, optionalTrans) {\r\n /// \r\n this.name = name;\r\n this.schema = tableSchema;\r\n this._tx = optionalTrans;\r\n this.hook = allTables[name] ? allTables[name].hook : Events(null, {\r\n \"creating\": [hookCreatingChain, nop],\r\n \"reading\": [pureFunctionChain, mirror],\r\n \"updating\": [hookUpdatingChain, nop],\r\n \"deleting\": [hookDeletingChain, nop]\r\n });\r\n }\r\n function BulkErrorHandlerCatchAll(errorList, done, supportHooks) {\r\n return (supportHooks ? hookedEventRejectHandler : eventRejectHandler)(function (e) {\r\n errorList.push(e);\r\n done && done();\r\n });\r\n }\r\n function bulkDelete(idbstore, trans, keysOrTuples, hasDeleteHook, deletingHook) {\r\n // If hasDeleteHook, keysOrTuples must be an array of tuples: [[key1, value2],[key2,value2],...],\r\n // else keysOrTuples must be just an array of keys: [key1, key2, ...].\r\n return new Promise(function (resolve, reject) {\r\n var len = keysOrTuples.length, lastItem = len - 1;\r\n if (len === 0)\r\n return resolve();\r\n if (!hasDeleteHook) {\r\n for (var i = 0; i < len; ++i) {\r\n var req = idbstore.delete(keysOrTuples[i]);\r\n req.onerror = eventRejectHandler(reject);\r\n if (i === lastItem)\r\n req.onsuccess = wrap(function () { return resolve(); });\r\n }\r\n }\r\n else {\r\n var hookCtx, errorHandler = hookedEventRejectHandler(reject), successHandler = hookedEventSuccessHandler(null);\r\n tryCatch(function () {\r\n for (var i = 0; i < len; ++i) {\r\n hookCtx = { onsuccess: null, onerror: null };\r\n var tuple = keysOrTuples[i];\r\n deletingHook.call(hookCtx, tuple[0], tuple[1], trans);\r\n var req = idbstore.delete(tuple[0]);\r\n req._hookCtx = hookCtx;\r\n req.onerror = errorHandler;\r\n if (i === lastItem)\r\n req.onsuccess = hookedEventSuccessHandler(resolve);\r\n else\r\n req.onsuccess = successHandler;\r\n }\r\n }, function (err) {\r\n hookCtx.onerror && hookCtx.onerror(err);\r\n throw err;\r\n });\r\n }\r\n });\r\n }\r\n props(Table.prototype, {\r\n //\r\n // Table Protected Methods\r\n //\r\n _trans: function getTransaction(mode, fn, writeLocked) {\r\n var trans = this._tx || PSD.trans;\r\n return trans && trans.db === db ?\r\n trans === PSD.trans ?\r\n trans._promise(mode, fn, writeLocked) :\r\n newScope(function () { return trans._promise(mode, fn, writeLocked); }, { trans: trans, transless: PSD.transless || PSD }) :\r\n tempTransaction(mode, [this.name], fn);\r\n },\r\n _idbstore: function getIDBObjectStore(mode, fn, writeLocked) {\r\n if (fake)\r\n return new Promise(fn); // Simplify the work for Intellisense/Code completion.\r\n var tableName = this.name;\r\n function supplyIdbStore(resolve, reject, trans) {\r\n if (trans.storeNames.indexOf(tableName) === -1)\r\n throw new exceptions.NotFound(\"Table\" + tableName + \" not part of transaction\");\r\n return fn(resolve, reject, trans.idbtrans.objectStore(tableName), trans);\r\n }\r\n return this._trans(mode, supplyIdbStore, writeLocked);\r\n },\r\n //\r\n // Table Public Methods\r\n //\r\n get: function (keyOrCrit, cb) {\r\n if (keyOrCrit && keyOrCrit.constructor === Object)\r\n return this.where(keyOrCrit).first(cb);\r\n var self = this;\r\n return this._idbstore(READONLY, function (resolve, reject, idbstore) {\r\n fake && resolve(self.schema.instanceTemplate);\r\n var req = idbstore.get(keyOrCrit);\r\n req.onerror = eventRejectHandler(reject);\r\n req.onsuccess = wrap(function () {\r\n resolve(self.hook.reading.fire(req.result));\r\n }, reject);\r\n }).then(cb);\r\n },\r\n where: function (indexOrCrit) {\r\n if (typeof indexOrCrit === 'string')\r\n return new WhereClause(this, indexOrCrit);\r\n if (isArray(indexOrCrit))\r\n return new WhereClause(this, \"[\" + indexOrCrit.join('+') + \"]\");\r\n // indexOrCrit is an object map of {[keyPath]:value} \r\n var keyPaths = keys(indexOrCrit);\r\n if (keyPaths.length === 1)\r\n // Only one critera. This was the easy case:\r\n return this\r\n .where(keyPaths[0])\r\n .equals(indexOrCrit[keyPaths[0]]);\r\n // Multiple criterias.\r\n // Let's try finding a compound index that matches all keyPaths in\r\n // arbritary order:\r\n var compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(function (ix) {\r\n return ix.compound &&\r\n keyPaths.every(function (keyPath) { return ix.keyPath.indexOf(keyPath) >= 0; }) &&\r\n ix.keyPath.every(function (keyPath) { return keyPaths.indexOf(keyPath) >= 0; });\r\n })[0];\r\n if (compoundIndex && maxKey !== maxString)\r\n // Cool! We found such compound index\r\n // and this browser supports compound indexes (maxKey !== maxString)!\r\n return this\r\n .where(compoundIndex.name)\r\n .equals(compoundIndex.keyPath.map(function (kp) { return indexOrCrit[kp]; }));\r\n if (!compoundIndex)\r\n console.warn(\"The query \" + JSON.stringify(indexOrCrit) + \" on \" + this.name + \" would benefit of a \" +\r\n (\"compound index [\" + keyPaths.join('+') + \"]\"));\r\n // Ok, now let's fallback to finding at least one matching index\r\n // and filter the rest.\r\n var idxByName = this.schema.idxByName;\r\n var simpleIndex = keyPaths.reduce(function (r, keyPath) { return [\r\n r[0] || idxByName[keyPath],\r\n r[0] || !idxByName[keyPath] ?\r\n combine(r[1], function (x) { return '' + getByKeyPath(x, keyPath) ==\r\n '' + indexOrCrit[keyPath]; })\r\n : r[1]\r\n ]; }, [null, null]);\r\n var idx = simpleIndex[0];\r\n return idx ?\r\n this.where(idx.name).equals(indexOrCrit[idx.keyPath])\r\n .filter(simpleIndex[1]) :\r\n compoundIndex ?\r\n this.filter(simpleIndex[1]) :\r\n this.where(keyPaths).equals(''); // No index at all. Fail lazily.\r\n },\r\n count: function (cb) {\r\n return this.toCollection().count(cb);\r\n },\r\n offset: function (offset) {\r\n return this.toCollection().offset(offset);\r\n },\r\n limit: function (numRows) {\r\n return this.toCollection().limit(numRows);\r\n },\r\n reverse: function () {\r\n return this.toCollection().reverse();\r\n },\r\n filter: function (filterFunction) {\r\n return this.toCollection().and(filterFunction);\r\n },\r\n each: function (fn) {\r\n return this.toCollection().each(fn);\r\n },\r\n toArray: function (cb) {\r\n return this.toCollection().toArray(cb);\r\n },\r\n orderBy: function (index) {\r\n return new Collection(new WhereClause(this, isArray(index) ?\r\n \"[\" + index.join('+') + \"]\" :\r\n index));\r\n },\r\n toCollection: function () {\r\n return new Collection(new WhereClause(this));\r\n },\r\n mapToClass: function (constructor, structure) {\r\n /// \r\n /// Map table to a javascript constructor function. Objects returned from the database will be instances of this class, making\r\n /// it possible to the instanceOf operator as well as extending the class using constructor.prototype.method = function(){...}.\r\n /// \r\n /// Constructor function representing the class.\r\n /// Helps IDE code completion by knowing the members that objects contain and not just the indexes. Also\r\n /// know what type each member has. Example: {name: String, emailAddresses: [String], password}\r\n this.schema.mappedClass = constructor;\r\n var instanceTemplate = Object.create(constructor.prototype);\r\n if (structure) {\r\n // structure and instanceTemplate is for IDE code competion only while constructor.prototype is for actual inheritance.\r\n applyStructure(instanceTemplate, structure);\r\n }\r\n this.schema.instanceTemplate = instanceTemplate;\r\n // Now, subscribe to the when(\"reading\") event to make all objects that come out from this table inherit from given class\r\n // no matter which method to use for reading (Table.get() or Table.where(...)... )\r\n var readHook = function (obj) {\r\n if (!obj)\r\n return obj; // No valid object. (Value is null). Return as is.\r\n // Create a new object that derives from constructor:\r\n var res = Object.create(constructor.prototype);\r\n // Clone members:\r\n for (var m in obj)\r\n if (hasOwn(obj, m))\r\n try {\r\n res[m] = obj[m];\r\n }\r\n catch (_) { }\r\n return res;\r\n };\r\n if (this.schema.readHook) {\r\n this.hook.reading.unsubscribe(this.schema.readHook);\r\n }\r\n this.schema.readHook = readHook;\r\n this.hook(\"reading\", readHook);\r\n return constructor;\r\n },\r\n defineClass: function (structure) {\r\n /// \r\n /// Define all members of the class that represents the table. This will help code completion of when objects are read from the database\r\n /// as well as making it possible to extend the prototype of the returned constructor function.\r\n /// \r\n /// Helps IDE code completion by knowing the members that objects contain and not just the indexes. Also\r\n /// know what type each member has. Example: {name: String, emailAddresses: [String], properties: {shoeSize: Number}}\r\n return this.mapToClass(Dexie.defineClass(structure), structure);\r\n },\r\n bulkDelete: function (keys$$1) {\r\n if (this.hook.deleting.fire === nop) {\r\n return this._idbstore(READWRITE, function (resolve, reject, idbstore, trans) {\r\n resolve(bulkDelete(idbstore, trans, keys$$1, false, nop));\r\n });\r\n }\r\n else {\r\n return this\r\n .where(':id')\r\n .anyOf(keys$$1)\r\n .delete()\r\n .then(function () { }); // Resolve with undefined.\r\n }\r\n },\r\n bulkPut: function (objects, keys$$1) {\r\n var _this = this;\r\n return this._idbstore(READWRITE, function (resolve, reject, idbstore) {\r\n if (!idbstore.keyPath && !_this.schema.primKey.auto && !keys$$1)\r\n throw new exceptions.InvalidArgument(\"bulkPut() with non-inbound keys requires keys array in second argument\");\r\n if (idbstore.keyPath && keys$$1)\r\n throw new exceptions.InvalidArgument(\"bulkPut(): keys argument invalid on tables with inbound keys\");\r\n if (keys$$1 && keys$$1.length !== objects.length)\r\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\r\n if (objects.length === 0)\r\n return resolve(); // Caller provided empty list.\r\n var done = function (result) {\r\n if (errorList.length === 0)\r\n resolve(result);\r\n else\r\n reject(new BulkError(_this.name + \".bulkPut(): \" + errorList.length + \" of \" + numObjs + \" operations failed\", errorList));\r\n };\r\n var req, errorList = [], errorHandler, numObjs = objects.length, table = _this;\r\n if (_this.hook.creating.fire === nop && _this.hook.updating.fire === nop) {\r\n //\r\n // Standard Bulk (no 'creating' or 'updating' hooks to care about)\r\n //\r\n errorHandler = BulkErrorHandlerCatchAll(errorList);\r\n for (var i = 0, l = objects.length; i < l; ++i) {\r\n req = keys$$1 ? idbstore.put(objects[i], keys$$1[i]) : idbstore.put(objects[i]);\r\n req.onerror = errorHandler;\r\n }\r\n // Only need to catch success or error on the last operation\r\n // according to the IDB spec.\r\n req.onerror = BulkErrorHandlerCatchAll(errorList, done);\r\n req.onsuccess = eventSuccessHandler(done);\r\n }\r\n else {\r\n var effectiveKeys = keys$$1 || idbstore.keyPath && objects.map(function (o) { return getByKeyPath(o, idbstore.keyPath); });\r\n // Generate map of {[key]: object}\r\n var objectLookup = effectiveKeys && arrayToObject(effectiveKeys, function (key, i) { return key != null && [key, objects[i]]; });\r\n var promise = !effectiveKeys ?\r\n // Auto-incremented key-less objects only without any keys argument.\r\n table.bulkAdd(objects) :\r\n // Keys provided. Either as inbound in provided objects, or as a keys argument.\r\n // Begin with updating those that exists in DB:\r\n table.where(':id').anyOf(effectiveKeys.filter(function (key) { return key != null; })).modify(function () {\r\n this.value = objectLookup[this.primKey];\r\n objectLookup[this.primKey] = null; // Mark as \"don't add this\"\r\n }).catch(ModifyError, function (e) {\r\n errorList = e.failures; // No need to concat here. These are the first errors added.\r\n }).then(function () {\r\n // Now, let's examine which items didnt exist so we can add them:\r\n var objsToAdd = [], keysToAdd = keys$$1 && [];\r\n // Iterate backwards. Why? Because if same key was used twice, just add the last one.\r\n for (var i = effectiveKeys.length - 1; i >= 0; --i) {\r\n var key = effectiveKeys[i];\r\n if (key == null || objectLookup[key]) {\r\n objsToAdd.push(objects[i]);\r\n keys$$1 && keysToAdd.push(key);\r\n if (key != null)\r\n objectLookup[key] = null; // Mark as \"dont add again\"\r\n }\r\n }\r\n // The items are in reverse order so reverse them before adding.\r\n // Could be important in order to get auto-incremented keys the way the caller\r\n // would expect. Could have used unshift instead of push()/reverse(),\r\n // but: http://jsperf.com/unshift-vs-reverse\r\n objsToAdd.reverse();\r\n keys$$1 && keysToAdd.reverse();\r\n return table.bulkAdd(objsToAdd, keysToAdd);\r\n }).then(function (lastAddedKey) {\r\n // Resolve with key of the last object in given arguments to bulkPut():\r\n var lastEffectiveKey = effectiveKeys[effectiveKeys.length - 1]; // Key was provided.\r\n return lastEffectiveKey != null ? lastEffectiveKey : lastAddedKey;\r\n });\r\n promise.then(done).catch(BulkError, function (e) {\r\n // Concat failure from ModifyError and reject using our 'done' method.\r\n errorList = errorList.concat(e.failures);\r\n done();\r\n }).catch(reject);\r\n }\r\n }, \"locked\"); // If called from transaction scope, lock transaction til all steps are done.\r\n },\r\n bulkAdd: function (objects, keys$$1) {\r\n var self = this, creatingHook = this.hook.creating.fire;\r\n return this._idbstore(READWRITE, function (resolve, reject, idbstore, trans) {\r\n if (!idbstore.keyPath && !self.schema.primKey.auto && !keys$$1)\r\n throw new exceptions.InvalidArgument(\"bulkAdd() with non-inbound keys requires keys array in second argument\");\r\n if (idbstore.keyPath && keys$$1)\r\n throw new exceptions.InvalidArgument(\"bulkAdd(): keys argument invalid on tables with inbound keys\");\r\n if (keys$$1 && keys$$1.length !== objects.length)\r\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\r\n if (objects.length === 0)\r\n return resolve(); // Caller provided empty list.\r\n function done(result) {\r\n if (errorList.length === 0)\r\n resolve(result);\r\n else\r\n reject(new BulkError(self.name + \".bulkAdd(): \" + errorList.length + \" of \" + numObjs + \" operations failed\", errorList));\r\n }\r\n var req, errorList = [], errorHandler, successHandler, numObjs = objects.length;\r\n if (creatingHook !== nop) {\r\n //\r\n // There are subscribers to hook('creating')\r\n // Must behave as documented.\r\n //\r\n var keyPath = idbstore.keyPath, hookCtx;\r\n errorHandler = BulkErrorHandlerCatchAll(errorList, null, true);\r\n successHandler = hookedEventSuccessHandler(null);\r\n tryCatch(function () {\r\n for (var i = 0, l = objects.length; i < l; ++i) {\r\n hookCtx = { onerror: null, onsuccess: null };\r\n var key = keys$$1 && keys$$1[i];\r\n var obj = objects[i], effectiveKey = keys$$1 ? key : keyPath ? getByKeyPath(obj, keyPath) : undefined, keyToUse = creatingHook.call(hookCtx, effectiveKey, obj, trans);\r\n if (effectiveKey == null && keyToUse != null) {\r\n if (keyPath) {\r\n obj = deepClone(obj);\r\n setByKeyPath(obj, keyPath, keyToUse);\r\n }\r\n else {\r\n key = keyToUse;\r\n }\r\n }\r\n req = key != null ? idbstore.add(obj, key) : idbstore.add(obj);\r\n req._hookCtx = hookCtx;\r\n if (i < l - 1) {\r\n req.onerror = errorHandler;\r\n if (hookCtx.onsuccess)\r\n req.onsuccess = successHandler;\r\n }\r\n }\r\n }, function (err) {\r\n hookCtx.onerror && hookCtx.onerror(err);\r\n throw err;\r\n });\r\n req.onerror = BulkErrorHandlerCatchAll(errorList, done, true);\r\n req.onsuccess = hookedEventSuccessHandler(done);\r\n }\r\n else {\r\n //\r\n // Standard Bulk (no 'creating' hook to care about)\r\n //\r\n errorHandler = BulkErrorHandlerCatchAll(errorList);\r\n for (var i = 0, l = objects.length; i < l; ++i) {\r\n req = keys$$1 ? idbstore.add(objects[i], keys$$1[i]) : idbstore.add(objects[i]);\r\n req.onerror = errorHandler;\r\n }\r\n // Only need to catch success or error on the last operation\r\n // according to the IDB spec.\r\n req.onerror = BulkErrorHandlerCatchAll(errorList, done);\r\n req.onsuccess = eventSuccessHandler(done);\r\n }\r\n });\r\n },\r\n add: function (obj, key) {\r\n /// \r\n /// Add an object to the database. In case an object with same primary key already exists, the object will not be added.\r\n /// \r\n /// A javascript object to insert\r\n /// Primary key\r\n var creatingHook = this.hook.creating.fire;\r\n return this._idbstore(READWRITE, function (resolve, reject, idbstore, trans) {\r\n var hookCtx = { onsuccess: null, onerror: null };\r\n if (creatingHook !== nop) {\r\n var effectiveKey = (key != null) ? key : (idbstore.keyPath ? getByKeyPath(obj, idbstore.keyPath) : undefined);\r\n var keyToUse = creatingHook.call(hookCtx, effectiveKey, obj, trans); // Allow subscribers to when(\"creating\") to generate the key.\r\n if (effectiveKey == null && keyToUse != null) {\r\n if (idbstore.keyPath)\r\n setByKeyPath(obj, idbstore.keyPath, keyToUse);\r\n else\r\n key = keyToUse;\r\n }\r\n }\r\n try {\r\n var req = key != null ? idbstore.add(obj, key) : idbstore.add(obj);\r\n req._hookCtx = hookCtx;\r\n req.onerror = hookedEventRejectHandler(reject);\r\n req.onsuccess = hookedEventSuccessHandler(function (result) {\r\n // TODO: Remove these two lines in next major release (2.0?)\r\n // It's no good practice to have side effects on provided parameters\r\n var keyPath = idbstore.keyPath;\r\n if (keyPath)\r\n setByKeyPath(obj, keyPath, result);\r\n resolve(result);\r\n });\r\n }\r\n catch (e) {\r\n if (hookCtx.onerror)\r\n hookCtx.onerror(e);\r\n throw e;\r\n }\r\n });\r\n },\r\n put: function (obj, key) {\r\n var _this = this;\r\n /// \r\n /// Add an object to the database but in case an object with same primary key alread exists, the existing one will get updated.\r\n /// \r\n /// A javascript object to insert or update\r\n /// Primary key\r\n var creatingHook = this.hook.creating.fire, updatingHook = this.hook.updating.fire;\r\n if (creatingHook !== nop || updatingHook !== nop) {\r\n //\r\n // People listens to when(\"creating\") or when(\"updating\") events!\r\n // We must know whether the put operation results in an CREATE or UPDATE.\r\n //\r\n var keyPath = this.schema.primKey.keyPath;\r\n var effectiveKey = (key !== undefined) ? key : (keyPath && getByKeyPath(obj, keyPath));\r\n if (effectiveKey == null)\r\n return this.add(obj);\r\n // Since key is optional, make sure we get it from obj if not provided\r\n // Primary key exist. Lock transaction and try modifying existing. If nothing modified, call add().\r\n // clone obj before this async call. If caller modifies obj the line after put(), the IDB spec requires that it should not affect operation.\r\n obj = deepClone(obj);\r\n return this._trans(READWRITE, function () {\r\n return _this.where(\":id\").equals(effectiveKey).modify(function () {\r\n // Replace extisting value with our object\r\n // CRUD event firing handled in Collection.modify()\r\n this.value = obj;\r\n }).then(function (count) { return count === 0 ? _this.add(obj, key) : effectiveKey; });\r\n }, \"locked\"); // Lock needed because operation is splitted into modify() and add().\r\n }\r\n else {\r\n // Use the standard IDB put() method.\r\n return this._idbstore(READWRITE, function (resolve, reject, idbstore) {\r\n var req = key !== undefined ? idbstore.put(obj, key) : idbstore.put(obj);\r\n req.onerror = eventRejectHandler(reject);\r\n req.onsuccess = wrap(function (ev) {\r\n var keyPath = idbstore.keyPath;\r\n if (keyPath)\r\n setByKeyPath(obj, keyPath, ev.target.result);\r\n resolve(req.result);\r\n });\r\n });\r\n }\r\n },\r\n 'delete': function (key) {\r\n /// Primary key of the object to delete\r\n if (this.hook.deleting.subscribers.length) {\r\n // People listens to when(\"deleting\") event. Must implement delete using Collection.delete() that will\r\n // call the CRUD event. Only Collection.delete() will know whether an object was actually deleted.\r\n return this.where(\":id\").equals(key).delete();\r\n }\r\n else {\r\n // No one listens. Use standard IDB delete() method.\r\n return this._idbstore(READWRITE, function (resolve, reject, idbstore) {\r\n var req = idbstore.delete(key);\r\n req.onerror = eventRejectHandler(reject);\r\n req.onsuccess = wrap(function () {\r\n resolve(req.result);\r\n });\r\n });\r\n }\r\n },\r\n clear: function () {\r\n if (this.hook.deleting.subscribers.length) {\r\n // People listens to when(\"deleting\") event. Must implement delete using Collection.delete() that will\r\n // call the CRUD event. Only Collection.delete() will knows which objects that are actually deleted.\r\n return this.toCollection().delete();\r\n }\r\n else {\r\n return this._idbstore(READWRITE, function (resolve, reject, idbstore) {\r\n var req = idbstore.clear();\r\n req.onerror = eventRejectHandler(reject);\r\n req.onsuccess = wrap(function () {\r\n resolve(req.result);\r\n });\r\n });\r\n }\r\n },\r\n update: function (keyOrObject, modifications) {\r\n if (typeof modifications !== 'object' || isArray(modifications))\r\n throw new exceptions.InvalidArgument(\"Modifications must be an object.\");\r\n if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) {\r\n // object to modify. Also modify given object with the modifications:\r\n keys(modifications).forEach(function (keyPath) {\r\n setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);\r\n });\r\n var key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);\r\n if (key === undefined)\r\n return rejection(new exceptions.InvalidArgument(\"Given object does not contain its primary key\"));\r\n return this.where(\":id\").equals(key).modify(modifications);\r\n }\r\n else {\r\n // key to modify\r\n return this.where(\":id\").equals(keyOrObject).modify(modifications);\r\n }\r\n }\r\n });\r\n //\r\n //\r\n //\r\n // Transaction Class\r\n //\r\n //\r\n //\r\n function Transaction(mode, storeNames, dbschema, parent) {\r\n var _this = this;\r\n /// \r\n /// Transaction class. Represents a database transaction. All operations on db goes through a Transaction.\r\n /// \r\n /// Any of \"readwrite\" or \"readonly\"\r\n /// Array of table names to operate on\r\n this.db = db;\r\n this.mode = mode;\r\n this.storeNames = storeNames;\r\n this.idbtrans = null;\r\n this.on = Events(this, \"complete\", \"error\", \"abort\");\r\n this.parent = parent || null;\r\n this.active = true;\r\n this._reculock = 0;\r\n this._blockedFuncs = [];\r\n this._resolve = null;\r\n this._reject = null;\r\n this._waitingFor = null;\r\n this._waitingQueue = null;\r\n this._spinCount = 0; // Just for debugging waitFor()\r\n this._completion = new Promise(function (resolve, reject) {\r\n _this._resolve = resolve;\r\n _this._reject = reject;\r\n });\r\n this._completion.then(function () {\r\n _this.active = false;\r\n _this.on.complete.fire();\r\n }, function (e) {\r\n var wasActive = _this.active;\r\n _this.active = false;\r\n _this.on.error.fire(e);\r\n _this.parent ?\r\n _this.parent._reject(e) :\r\n wasActive && _this.idbtrans && _this.idbtrans.abort();\r\n return rejection(e); // Indicate we actually DO NOT catch this error.\r\n });\r\n }\r\n props(Transaction.prototype, {\r\n //\r\n // Transaction Protected Methods (not required by API users, but needed internally and eventually by dexie extensions)\r\n //\r\n _lock: function () {\r\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\r\n // Temporary set all requests into a pending queue if they are called before database is ready.\r\n ++this._reculock; // Recursive read/write lock pattern using PSD (Promise Specific Data) instead of TLS (Thread Local Storage)\r\n if (this._reculock === 1 && !PSD.global)\r\n PSD.lockOwnerFor = this;\r\n return this;\r\n },\r\n _unlock: function () {\r\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\r\n if (--this._reculock === 0) {\r\n if (!PSD.global)\r\n PSD.lockOwnerFor = null;\r\n while (this._blockedFuncs.length > 0 && !this._locked()) {\r\n var fnAndPSD = this._blockedFuncs.shift();\r\n try {\r\n usePSD(fnAndPSD[1], fnAndPSD[0]);\r\n }\r\n catch (e) { }\r\n }\r\n }\r\n return this;\r\n },\r\n _locked: function () {\r\n // Checks if any write-lock is applied on this transaction.\r\n // To simplify the Dexie API for extension implementations, we support recursive locks.\r\n // This is accomplished by using \"Promise Specific Data\" (PSD).\r\n // PSD data is bound to a Promise and any child Promise emitted through then() or resolve( new Promise() ).\r\n // PSD is local to code executing on top of the call stacks of any of any code executed by Promise():\r\n // * callback given to the Promise() constructor (function (resolve, reject){...})\r\n // * callbacks given to then()/catch()/finally() methods (function (value){...})\r\n // If creating a new independant Promise instance from within a Promise call stack, the new Promise will derive the PSD from the call stack of the parent Promise.\r\n // Derivation is done so that the inner PSD __proto__ points to the outer PSD.\r\n // PSD.lockOwnerFor will point to current transaction object if the currently executing PSD scope owns the lock.\r\n return this._reculock && PSD.lockOwnerFor !== this;\r\n },\r\n create: function (idbtrans) {\r\n var _this = this;\r\n if (!this.mode)\r\n return this;\r\n assert(!this.idbtrans);\r\n if (!idbtrans && !idbdb) {\r\n switch (dbOpenError && dbOpenError.name) {\r\n case \"DatabaseClosedError\":\r\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\r\n throw new exceptions.DatabaseClosed(dbOpenError);\r\n case \"MissingAPIError\":\r\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\r\n throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError);\r\n default:\r\n // Make it clear that the user operation was not what caused the error - the error had occurred earlier on db.open()!\r\n throw new exceptions.OpenFailed(dbOpenError);\r\n }\r\n }\r\n if (!this.active)\r\n throw new exceptions.TransactionInactive();\r\n assert(this._completion._state === null);\r\n idbtrans = this.idbtrans = idbtrans || idbdb.transaction(safariMultiStoreFix(this.storeNames), this.mode);\r\n idbtrans.onerror = wrap(function (ev) {\r\n preventDefault(ev); // Prohibit default bubbling to window.error\r\n _this._reject(idbtrans.error);\r\n });\r\n idbtrans.onabort = wrap(function (ev) {\r\n preventDefault(ev);\r\n _this.active && _this._reject(new exceptions.Abort(idbtrans.error));\r\n _this.active = false;\r\n _this.on(\"abort\").fire(ev);\r\n });\r\n idbtrans.oncomplete = wrap(function () {\r\n _this.active = false;\r\n _this._resolve();\r\n });\r\n return this;\r\n },\r\n _promise: function (mode, fn, bWriteLock) {\r\n var _this = this;\r\n if (mode === READWRITE && this.mode !== READWRITE)\r\n return rejection(new exceptions.ReadOnly(\"Transaction is readonly\"));\r\n if (!this.active)\r\n return rejection(new exceptions.TransactionInactive());\r\n if (this._locked()) {\r\n return new Promise(function (resolve, reject) {\r\n _this._blockedFuncs.push([function () {\r\n _this._promise(mode, fn, bWriteLock).then(resolve, reject);\r\n }, PSD]);\r\n });\r\n }\r\n else if (bWriteLock) {\r\n return newScope(function () {\r\n var p = new Promise(function (resolve, reject) {\r\n _this._lock();\r\n var rv = fn(resolve, reject, _this);\r\n if (rv && rv.then)\r\n rv.then(resolve, reject);\r\n });\r\n p.finally(function () { return _this._unlock(); });\r\n p._lib = true;\r\n return p;\r\n });\r\n }\r\n else {\r\n var p = new Promise(function (resolve, reject) {\r\n var rv = fn(resolve, reject, _this);\r\n if (rv && rv.then)\r\n rv.then(resolve, reject);\r\n });\r\n p._lib = true;\r\n return p;\r\n }\r\n },\r\n _root: function () {\r\n return this.parent ? this.parent._root() : this;\r\n },\r\n waitFor: function (promise) {\r\n // Always operate on the root transaction (in case this is a sub stransaction)\r\n var root = this._root();\r\n // For stability reasons, convert parameter to promise no matter what type is passed to waitFor().\r\n // (We must be able to call .then() on it.)\r\n promise = Promise.resolve(promise);\r\n if (root._waitingFor) {\r\n // Already called waitFor(). Wait for both to complete.\r\n root._waitingFor = root._waitingFor.then(function () { return promise; });\r\n }\r\n else {\r\n // We're not in waiting state. Start waiting state.\r\n root._waitingFor = promise;\r\n root._waitingQueue = [];\r\n // Start interacting with indexedDB until promise completes:\r\n var store = root.idbtrans.objectStore(root.storeNames[0]);\r\n (function spin() {\r\n ++root._spinCount; // For debugging only\r\n while (root._waitingQueue.length)\r\n (root._waitingQueue.shift())();\r\n if (root._waitingFor)\r\n store.get(-Infinity).onsuccess = spin;\r\n }());\r\n }\r\n var currentWaitPromise = root._waitingFor;\r\n return new Promise(function (resolve, reject) {\r\n promise.then(function (res) { return root._waitingQueue.push(wrap(resolve.bind(null, res))); }, function (err) { return root._waitingQueue.push(wrap(reject.bind(null, err))); }).finally(function () {\r\n if (root._waitingFor === currentWaitPromise) {\r\n // No one added a wait after us. Safe to stop the spinning.\r\n root._waitingFor = null;\r\n }\r\n });\r\n });\r\n },\r\n //\r\n // Transaction Public Properties and Methods\r\n //\r\n abort: function () {\r\n this.active && this._reject(new exceptions.Abort());\r\n this.active = false;\r\n },\r\n tables: {\r\n get: deprecated(\"Transaction.tables\", function () { return allTables; })\r\n },\r\n table: function (name) {\r\n var table = db.table(name); // Don't check that table is part of transaction. It must fail lazily!\r\n return new Table(name, table.schema, this);\r\n }\r\n });\r\n //\r\n //\r\n //\r\n // WhereClause\r\n //\r\n //\r\n //\r\n function WhereClause(table, index, orCollection) {\r\n /// \r\n /// \r\n /// \r\n this._ctx = {\r\n table: table,\r\n index: index === \":id\" ? null : index,\r\n or: orCollection\r\n };\r\n }\r\n props(WhereClause.prototype, function () {\r\n // WhereClause private methods\r\n function fail(collectionOrWhereClause, err, T) {\r\n var collection = collectionOrWhereClause instanceof WhereClause ?\r\n new Collection(collectionOrWhereClause) :\r\n collectionOrWhereClause;\r\n collection._ctx.error = T ? new T(err) : new TypeError(err);\r\n return collection;\r\n }\r\n function emptyCollection(whereClause) {\r\n return new Collection(whereClause, function () { return IDBKeyRange.only(\"\"); }).limit(0);\r\n }\r\n function upperFactory(dir) {\r\n return dir === \"next\" ? function (s) { return s.toUpperCase(); } : function (s) { return s.toLowerCase(); };\r\n }\r\n function lowerFactory(dir) {\r\n return dir === \"next\" ? function (s) { return s.toLowerCase(); } : function (s) { return s.toUpperCase(); };\r\n }\r\n function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) {\r\n var length = Math.min(key.length, lowerNeedle.length);\r\n var llp = -1;\r\n for (var i = 0; i < length; ++i) {\r\n var lwrKeyChar = lowerKey[i];\r\n if (lwrKeyChar !== lowerNeedle[i]) {\r\n if (cmp(key[i], upperNeedle[i]) < 0)\r\n return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1);\r\n if (cmp(key[i], lowerNeedle[i]) < 0)\r\n return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1);\r\n if (llp >= 0)\r\n return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1);\r\n return null;\r\n }\r\n if (cmp(key[i], lwrKeyChar) < 0)\r\n llp = i;\r\n }\r\n if (length < lowerNeedle.length && dir === \"next\")\r\n return key + upperNeedle.substr(key.length);\r\n if (length < key.length && dir === \"prev\")\r\n return key.substr(0, upperNeedle.length);\r\n return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1));\r\n }\r\n function addIgnoreCaseAlgorithm(whereClause, match, needles, suffix) {\r\n /// \r\n var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix, needlesLen = needles.length;\r\n if (!needles.every(function (s) { return typeof s === 'string'; })) {\r\n return fail(whereClause, STRING_EXPECTED);\r\n }\r\n function initDirection(dir) {\r\n upper = upperFactory(dir);\r\n lower = lowerFactory(dir);\r\n compare = (dir === \"next\" ? simpleCompare : simpleCompareReverse);\r\n var needleBounds = needles.map(function (needle) {\r\n return { lower: lower(needle), upper: upper(needle) };\r\n }).sort(function (a, b) {\r\n return compare(a.lower, b.lower);\r\n });\r\n upperNeedles = needleBounds.map(function (nb) { return nb.upper; });\r\n lowerNeedles = needleBounds.map(function (nb) { return nb.lower; });\r\n direction = dir;\r\n nextKeySuffix = (dir === \"next\" ? \"\" : suffix);\r\n }\r\n initDirection(\"next\");\r\n var c = new Collection(whereClause, function () {\r\n return IDBKeyRange.bound(upperNeedles[0], lowerNeedles[needlesLen - 1] + suffix);\r\n });\r\n c._ondirectionchange = function (direction) {\r\n // This event onlys occur before filter is called the first time.\r\n initDirection(direction);\r\n };\r\n var firstPossibleNeedle = 0;\r\n c._addAlgorithm(function (cursor, advance, resolve) {\r\n /// \r\n /// \r\n /// \r\n var key = cursor.key;\r\n if (typeof key !== 'string')\r\n return false;\r\n var lowerKey = lower(key);\r\n if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) {\r\n return true;\r\n }\r\n else {\r\n var lowestPossibleCasing = null;\r\n for (var i = firstPossibleNeedle; i < needlesLen; ++i) {\r\n var casing = nextCasing(key, lowerKey, upperNeedles[i], lowerNeedles[i], compare, direction);\r\n if (casing === null && lowestPossibleCasing === null)\r\n firstPossibleNeedle = i + 1;\r\n else if (lowestPossibleCasing === null || compare(lowestPossibleCasing, casing) > 0) {\r\n lowestPossibleCasing = casing;\r\n }\r\n }\r\n if (lowestPossibleCasing !== null) {\r\n advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); });\r\n }\r\n else {\r\n advance(resolve);\r\n }\r\n return false;\r\n }\r\n });\r\n return c;\r\n }\r\n //\r\n // WhereClause public methods\r\n //\r\n return {\r\n between: function (lower, upper, includeLower, includeUpper) {\r\n /// \r\n /// Filter out records whose where-field lays between given lower and upper values. Applies to Strings, Numbers and Dates.\r\n /// \r\n /// \r\n /// \r\n /// Whether items that equals lower should be included. Default true.\r\n /// Whether items that equals upper should be included. Default false.\r\n /// \r\n includeLower = includeLower !== false; // Default to true\r\n includeUpper = includeUpper === true; // Default to false\r\n try {\r\n if ((cmp(lower, upper) > 0) ||\r\n (cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)))\r\n return emptyCollection(this); // Workaround for idiotic W3C Specification that DataError must be thrown if lower > upper. The natural result would be to return an empty collection.\r\n return new Collection(this, function () { return IDBKeyRange.bound(lower, upper, !includeLower, !includeUpper); });\r\n }\r\n catch (e) {\r\n return fail(this, INVALID_KEY_ARGUMENT);\r\n }\r\n },\r\n equals: function (value) {\r\n return new Collection(this, function () { return IDBKeyRange.only(value); });\r\n },\r\n above: function (value) {\r\n return new Collection(this, function () { return IDBKeyRange.lowerBound(value, true); });\r\n },\r\n aboveOrEqual: function (value) {\r\n return new Collection(this, function () { return IDBKeyRange.lowerBound(value); });\r\n },\r\n below: function (value) {\r\n return new Collection(this, function () { return IDBKeyRange.upperBound(value, true); });\r\n },\r\n belowOrEqual: function (value) {\r\n return new Collection(this, function () { return IDBKeyRange.upperBound(value); });\r\n },\r\n startsWith: function (str) {\r\n /// \r\n if (typeof str !== 'string')\r\n return fail(this, STRING_EXPECTED);\r\n return this.between(str, str + maxString, true, true);\r\n },\r\n startsWithIgnoreCase: function (str) {\r\n /// \r\n if (str === \"\")\r\n return this.startsWith(str);\r\n return addIgnoreCaseAlgorithm(this, function (x, a) { return x.indexOf(a[0]) === 0; }, [str], maxString);\r\n },\r\n equalsIgnoreCase: function (str) {\r\n /// \r\n return addIgnoreCaseAlgorithm(this, function (x, a) { return x === a[0]; }, [str], \"\");\r\n },\r\n anyOfIgnoreCase: function () {\r\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\r\n if (set.length === 0)\r\n return emptyCollection(this);\r\n return addIgnoreCaseAlgorithm(this, function (x, a) { return a.indexOf(x) !== -1; }, set, \"\");\r\n },\r\n startsWithAnyOfIgnoreCase: function () {\r\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\r\n if (set.length === 0)\r\n return emptyCollection(this);\r\n return addIgnoreCaseAlgorithm(this, function (x, a) {\r\n return a.some(function (n) {\r\n return x.indexOf(n) === 0;\r\n });\r\n }, set, maxString);\r\n },\r\n anyOf: function () {\r\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\r\n var compare = ascending;\r\n try {\r\n set.sort(compare);\r\n }\r\n catch (e) {\r\n return fail(this, INVALID_KEY_ARGUMENT);\r\n }\r\n if (set.length === 0)\r\n return emptyCollection(this);\r\n var c = new Collection(this, function () { return IDBKeyRange.bound(set[0], set[set.length - 1]); });\r\n c._ondirectionchange = function (direction) {\r\n compare = (direction === \"next\" ? ascending : descending);\r\n set.sort(compare);\r\n };\r\n var i = 0;\r\n c._addAlgorithm(function (cursor, advance, resolve) {\r\n var key = cursor.key;\r\n while (compare(key, set[i]) > 0) {\r\n // The cursor has passed beyond this key. Check next.\r\n ++i;\r\n if (i === set.length) {\r\n // There is no next. Stop searching.\r\n advance(resolve);\r\n return false;\r\n }\r\n }\r\n if (compare(key, set[i]) === 0) {\r\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\r\n return true;\r\n }\r\n else {\r\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\r\n advance(function () { cursor.continue(set[i]); });\r\n return false;\r\n }\r\n });\r\n return c;\r\n },\r\n notEqual: function (value) {\r\n return this.inAnyRange([[minKey, value], [value, maxKey]], { includeLowers: false, includeUppers: false });\r\n },\r\n noneOf: function () {\r\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\r\n if (set.length === 0)\r\n return new Collection(this); // Return entire collection.\r\n try {\r\n set.sort(ascending);\r\n }\r\n catch (e) {\r\n return fail(this, INVALID_KEY_ARGUMENT);\r\n }\r\n // Transform [\"a\",\"b\",\"c\"] to a set of ranges for between/above/below: [[minKey,\"a\"], [\"a\",\"b\"], [\"b\",\"c\"], [\"c\",maxKey]]\r\n var ranges = set.reduce(function (res, val) { return res ? res.concat([[res[res.length - 1][1], val]]) : [[minKey, val]]; }, null);\r\n ranges.push([set[set.length - 1], maxKey]);\r\n return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false });\r\n },\r\n /** Filter out values withing given set of ranges.\r\n * Example, give children and elders a rebate of 50%:\r\n *\r\n * db.friends.where('age').inAnyRange([[0,18],[65,Infinity]]).modify({Rebate: 1/2});\r\n *\r\n * @param {(string|number|Date|Array)[][]} ranges\r\n * @param {{includeLowers: boolean, includeUppers: boolean}} options\r\n */\r\n inAnyRange: function (ranges, options) {\r\n if (ranges.length === 0)\r\n return emptyCollection(this);\r\n if (!ranges.every(function (range) { return range[0] !== undefined && range[1] !== undefined && ascending(range[0], range[1]) <= 0; })) {\r\n return fail(this, \"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower\", exceptions.InvalidArgument);\r\n }\r\n var includeLowers = !options || options.includeLowers !== false; // Default to true\r\n var includeUppers = options && options.includeUppers === true; // Default to false\r\n function addRange(ranges, newRange) {\r\n for (var i = 0, l = ranges.length; i < l; ++i) {\r\n var range = ranges[i];\r\n if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) {\r\n range[0] = min(range[0], newRange[0]);\r\n range[1] = max(range[1], newRange[1]);\r\n break;\r\n }\r\n }\r\n if (i === l)\r\n ranges.push(newRange);\r\n return ranges;\r\n }\r\n var sortDirection = ascending;\r\n function rangeSorter(a, b) { return sortDirection(a[0], b[0]); }\r\n // Join overlapping ranges\r\n var set;\r\n try {\r\n set = ranges.reduce(addRange, []);\r\n set.sort(rangeSorter);\r\n }\r\n catch (ex) {\r\n return fail(this, INVALID_KEY_ARGUMENT);\r\n }\r\n var i = 0;\r\n var keyIsBeyondCurrentEntry = includeUppers ?\r\n function (key) { return ascending(key, set[i][1]) > 0; } :\r\n function (key) { return ascending(key, set[i][1]) >= 0; };\r\n var keyIsBeforeCurrentEntry = includeLowers ?\r\n function (key) { return descending(key, set[i][0]) > 0; } :\r\n function (key) { return descending(key, set[i][0]) >= 0; };\r\n function keyWithinCurrentRange(key) {\r\n return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key);\r\n }\r\n var checkKey = keyIsBeyondCurrentEntry;\r\n var c = new Collection(this, function () {\r\n return IDBKeyRange.bound(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers);\r\n });\r\n c._ondirectionchange = function (direction) {\r\n if (direction === \"next\") {\r\n checkKey = keyIsBeyondCurrentEntry;\r\n sortDirection = ascending;\r\n }\r\n else {\r\n checkKey = keyIsBeforeCurrentEntry;\r\n sortDirection = descending;\r\n }\r\n set.sort(rangeSorter);\r\n };\r\n c._addAlgorithm(function (cursor, advance, resolve) {\r\n var key = cursor.key;\r\n while (checkKey(key)) {\r\n // The cursor has passed beyond this key. Check next.\r\n ++i;\r\n if (i === set.length) {\r\n // There is no next. Stop searching.\r\n advance(resolve);\r\n return false;\r\n }\r\n }\r\n if (keyWithinCurrentRange(key)) {\r\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\r\n return true;\r\n }\r\n else if (cmp(key, set[i][1]) === 0 || cmp(key, set[i][0]) === 0) {\r\n // includeUpper or includeLower is false so keyWithinCurrentRange() returns false even though we are at range border.\r\n // Continue to next key but don't include this one.\r\n return false;\r\n }\r\n else {\r\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\r\n advance(function () {\r\n if (sortDirection === ascending)\r\n cursor.continue(set[i][0]);\r\n else\r\n cursor.continue(set[i][1]);\r\n });\r\n return false;\r\n }\r\n });\r\n return c;\r\n },\r\n startsWithAnyOf: function () {\r\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\r\n if (!set.every(function (s) { return typeof s === 'string'; })) {\r\n return fail(this, \"startsWithAnyOf() only works with strings\");\r\n }\r\n if (set.length === 0)\r\n return emptyCollection(this);\r\n return this.inAnyRange(set.map(function (str) {\r\n return [str, str + maxString];\r\n }));\r\n }\r\n };\r\n });\r\n //\r\n //\r\n //\r\n // Collection Class\r\n //\r\n //\r\n //\r\n function Collection(whereClause, keyRangeGenerator) {\r\n /// \r\n ///\r\n /// \r\n /// Where clause instance\r\n /// \r\n var keyRange = null, error = null;\r\n if (keyRangeGenerator)\r\n try {\r\n keyRange = keyRangeGenerator();\r\n }\r\n catch (ex) {\r\n error = ex;\r\n }\r\n var whereCtx = whereClause._ctx, table = whereCtx.table;\r\n this._ctx = {\r\n table: table,\r\n index: whereCtx.index,\r\n isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)),\r\n range: keyRange,\r\n keysOnly: false,\r\n dir: \"next\",\r\n unique: \"\",\r\n algorithm: null,\r\n filter: null,\r\n replayFilter: null,\r\n justLimit: true,\r\n isMatch: null,\r\n offset: 0,\r\n limit: Infinity,\r\n error: error,\r\n or: whereCtx.or,\r\n valueMapper: table.hook.reading.fire\r\n };\r\n }\r\n function isPlainKeyRange(ctx, ignoreLimitFilter) {\r\n return !(ctx.filter || ctx.algorithm || ctx.or) &&\r\n (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter);\r\n }\r\n props(Collection.prototype, function () {\r\n //\r\n // Collection Private Functions\r\n //\r\n function addFilter(ctx, fn) {\r\n ctx.filter = combine(ctx.filter, fn);\r\n }\r\n function addReplayFilter(ctx, factory, isLimitFilter) {\r\n var curr = ctx.replayFilter;\r\n ctx.replayFilter = curr ? function () { return combine(curr(), factory()); } : factory;\r\n ctx.justLimit = isLimitFilter && !curr;\r\n }\r\n function addMatchFilter(ctx, fn) {\r\n ctx.isMatch = combine(ctx.isMatch, fn);\r\n }\r\n /** @param ctx {\r\n * isPrimKey: boolean,\r\n * table: Table,\r\n * index: string\r\n * }\r\n * @param store IDBObjectStore\r\n **/\r\n function getIndexOrStore(ctx, store) {\r\n if (ctx.isPrimKey)\r\n return store;\r\n var indexSpec = ctx.table.schema.idxByName[ctx.index];\r\n if (!indexSpec)\r\n throw new exceptions.Schema(\"KeyPath \" + ctx.index + \" on object store \" + store.name + \" is not indexed\");\r\n return store.index(indexSpec.name);\r\n }\r\n /** @param ctx {\r\n * isPrimKey: boolean,\r\n * table: Table,\r\n * index: string,\r\n * keysOnly: boolean,\r\n * range?: IDBKeyRange,\r\n * dir: \"next\" | \"prev\"\r\n * }\r\n */\r\n function openCursor(ctx, store) {\r\n var idxOrStore = getIndexOrStore(ctx, store);\r\n return ctx.keysOnly && 'openKeyCursor' in idxOrStore ?\r\n idxOrStore.openKeyCursor(ctx.range || null, ctx.dir + ctx.unique) :\r\n idxOrStore.openCursor(ctx.range || null, ctx.dir + ctx.unique);\r\n }\r\n function iter(ctx, fn, resolve, reject, idbstore) {\r\n var filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter;\r\n if (!ctx.or) {\r\n iterate(openCursor(ctx, idbstore), combine(ctx.algorithm, filter), fn, resolve, reject, !ctx.keysOnly && ctx.valueMapper);\r\n }\r\n else\r\n (function () {\r\n var set = {};\r\n var resolved = 0;\r\n function resolveboth() {\r\n if (++resolved === 2)\r\n resolve(); // Seems like we just support or btwn max 2 expressions, but there are no limit because we do recursion.\r\n }\r\n function union(item, cursor, advance) {\r\n if (!filter || filter(cursor, advance, resolveboth, reject)) {\r\n var primaryKey = cursor.primaryKey;\r\n var key = '' + primaryKey;\r\n if (key === '[object ArrayBuffer]')\r\n key = '' + new Uint8Array(primaryKey);\r\n if (!hasOwn(set, key)) {\r\n set[key] = true;\r\n fn(item, cursor, advance);\r\n }\r\n }\r\n }\r\n ctx.or._iterate(union, resolveboth, reject, idbstore);\r\n iterate(openCursor(ctx, idbstore), ctx.algorithm, union, resolveboth, reject, !ctx.keysOnly && ctx.valueMapper);\r\n })();\r\n }\r\n function getInstanceTemplate(ctx) {\r\n return ctx.table.schema.instanceTemplate;\r\n }\r\n return {\r\n //\r\n // Collection Protected Functions\r\n //\r\n _read: function (fn, cb) {\r\n var ctx = this._ctx;\r\n return ctx.error ?\r\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\r\n ctx.table._idbstore(READONLY, fn).then(cb);\r\n },\r\n _write: function (fn) {\r\n var ctx = this._ctx;\r\n return ctx.error ?\r\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\r\n ctx.table._idbstore(READWRITE, fn, \"locked\"); // When doing write operations on collections, always lock the operation so that upcoming operations gets queued.\r\n },\r\n _addAlgorithm: function (fn) {\r\n var ctx = this._ctx;\r\n ctx.algorithm = combine(ctx.algorithm, fn);\r\n },\r\n _iterate: function (fn, resolve, reject, idbstore) {\r\n return iter(this._ctx, fn, resolve, reject, idbstore);\r\n },\r\n clone: function (props$$1) {\r\n var rv = Object.create(this.constructor.prototype), ctx = Object.create(this._ctx);\r\n if (props$$1)\r\n extend(ctx, props$$1);\r\n rv._ctx = ctx;\r\n return rv;\r\n },\r\n raw: function () {\r\n this._ctx.valueMapper = null;\r\n return this;\r\n },\r\n //\r\n // Collection Public methods\r\n //\r\n each: function (fn) {\r\n var ctx = this._ctx;\r\n if (fake) {\r\n var item = getInstanceTemplate(ctx), primKeyPath = ctx.table.schema.primKey.keyPath, key = getByKeyPath(item, ctx.index ? ctx.table.schema.idxByName[ctx.index].keyPath : primKeyPath), primaryKey = getByKeyPath(item, primKeyPath);\r\n fn(item, { key: key, primaryKey: primaryKey });\r\n }\r\n return this._read(function (resolve, reject, idbstore) {\r\n iter(ctx, fn, resolve, reject, idbstore);\r\n });\r\n },\r\n count: function (cb) {\r\n if (fake)\r\n return Promise.resolve(0).then(cb);\r\n var ctx = this._ctx;\r\n if (isPlainKeyRange(ctx, true)) {\r\n // This is a plain key range. We can use the count() method if the index.\r\n return this._read(function (resolve, reject, idbstore) {\r\n var idx = getIndexOrStore(ctx, idbstore);\r\n var req = (ctx.range ? idx.count(ctx.range) : idx.count());\r\n req.onerror = eventRejectHandler(reject);\r\n req.onsuccess = function (e) {\r\n resolve(Math.min(e.target.result, ctx.limit));\r\n };\r\n }, cb);\r\n }\r\n else {\r\n // Algorithms, filters or expressions are applied. Need to count manually.\r\n var count = 0;\r\n return this._read(function (resolve, reject, idbstore) {\r\n iter(ctx, function () { ++count; return false; }, function () { resolve(count); }, reject, idbstore);\r\n }, cb);\r\n }\r\n },\r\n sortBy: function (keyPath, cb) {\r\n /// \r\n var parts = keyPath.split('.').reverse(), lastPart = parts[0], lastIndex = parts.length - 1;\r\n function getval(obj, i) {\r\n if (i)\r\n return getval(obj[parts[i]], i - 1);\r\n return obj[lastPart];\r\n }\r\n var order = this._ctx.dir === \"next\" ? 1 : -1;\r\n function sorter(a, b) {\r\n var aVal = getval(a, lastIndex), bVal = getval(b, lastIndex);\r\n return aVal < bVal ? -order : aVal > bVal ? order : 0;\r\n }\r\n return this.toArray(function (a) {\r\n return a.sort(sorter);\r\n }).then(cb);\r\n },\r\n toArray: function (cb) {\r\n var ctx = this._ctx;\r\n return this._read(function (resolve, reject, idbstore) {\r\n fake && resolve([getInstanceTemplate(ctx)]);\r\n if (hasGetAll && ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\r\n // Special optimation if we could use IDBObjectStore.getAll() or\r\n // IDBKeyRange.getAll():\r\n var readingHook = ctx.table.hook.reading.fire;\r\n var idxOrStore = getIndexOrStore(ctx, idbstore);\r\n var req = ctx.limit < Infinity ?\r\n idxOrStore.getAll(ctx.range, ctx.limit) :\r\n idxOrStore.getAll(ctx.range);\r\n req.onerror = eventRejectHandler(reject);\r\n req.onsuccess = readingHook === mirror ?\r\n eventSuccessHandler(resolve) :\r\n eventSuccessHandler(function (res) {\r\n try {\r\n resolve(res.map(readingHook));\r\n }\r\n catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n else {\r\n // Getting array through a cursor.\r\n var a = [];\r\n iter(ctx, function (item) { a.push(item); }, function arrayComplete() {\r\n resolve(a);\r\n }, reject, idbstore);\r\n }\r\n }, cb);\r\n },\r\n offset: function (offset) {\r\n var ctx = this._ctx;\r\n if (offset <= 0)\r\n return this;\r\n ctx.offset += offset; // For count()\r\n if (isPlainKeyRange(ctx)) {\r\n addReplayFilter(ctx, function () {\r\n var offsetLeft = offset;\r\n return function (cursor, advance) {\r\n if (offsetLeft === 0)\r\n return true;\r\n if (offsetLeft === 1) {\r\n --offsetLeft;\r\n return false;\r\n }\r\n advance(function () {\r\n cursor.advance(offsetLeft);\r\n offsetLeft = 0;\r\n });\r\n return false;\r\n };\r\n });\r\n }\r\n else {\r\n addReplayFilter(ctx, function () {\r\n var offsetLeft = offset;\r\n return function () { return (--offsetLeft < 0); };\r\n });\r\n }\r\n return this;\r\n },\r\n limit: function (numRows) {\r\n this._ctx.limit = Math.min(this._ctx.limit, numRows); // For count()\r\n addReplayFilter(this._ctx, function () {\r\n var rowsLeft = numRows;\r\n return function (cursor, advance, resolve) {\r\n if (--rowsLeft <= 0)\r\n advance(resolve); // Stop after this item has been included\r\n return rowsLeft >= 0; // If numRows is already below 0, return false because then 0 was passed to numRows initially. Otherwise we wouldnt come here.\r\n };\r\n }, true);\r\n return this;\r\n },\r\n until: function (filterFunction, bIncludeStopEntry) {\r\n var ctx = this._ctx;\r\n fake && filterFunction(getInstanceTemplate(ctx));\r\n addFilter(this._ctx, function (cursor, advance, resolve) {\r\n if (filterFunction(cursor.value)) {\r\n advance(resolve);\r\n return bIncludeStopEntry;\r\n }\r\n else {\r\n return true;\r\n }\r\n });\r\n return this;\r\n },\r\n first: function (cb) {\r\n return this.limit(1).toArray(function (a) { return a[0]; }).then(cb);\r\n },\r\n last: function (cb) {\r\n return this.reverse().first(cb);\r\n },\r\n filter: function (filterFunction) {\r\n /// function(val){return true/false}\r\n fake && filterFunction(getInstanceTemplate(this._ctx));\r\n addFilter(this._ctx, function (cursor) {\r\n return filterFunction(cursor.value);\r\n });\r\n // match filters not used in Dexie.js but can be used by 3rd part libraries to test a\r\n // collection for a match without querying DB. Used by Dexie.Observable.\r\n addMatchFilter(this._ctx, filterFunction);\r\n return this;\r\n },\r\n and: function (filterFunction) {\r\n return this.filter(filterFunction);\r\n },\r\n or: function (indexName) {\r\n return new WhereClause(this._ctx.table, indexName, this);\r\n },\r\n reverse: function () {\r\n this._ctx.dir = (this._ctx.dir === \"prev\" ? \"next\" : \"prev\");\r\n if (this._ondirectionchange)\r\n this._ondirectionchange(this._ctx.dir);\r\n return this;\r\n },\r\n desc: function () {\r\n return this.reverse();\r\n },\r\n eachKey: function (cb) {\r\n var ctx = this._ctx;\r\n ctx.keysOnly = !ctx.isMatch;\r\n return this.each(function (val, cursor) { cb(cursor.key, cursor); });\r\n },\r\n eachUniqueKey: function (cb) {\r\n this._ctx.unique = \"unique\";\r\n return this.eachKey(cb);\r\n },\r\n eachPrimaryKey: function (cb) {\r\n var ctx = this._ctx;\r\n ctx.keysOnly = !ctx.isMatch;\r\n return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); });\r\n },\r\n keys: function (cb) {\r\n var ctx = this._ctx;\r\n ctx.keysOnly = !ctx.isMatch;\r\n var a = [];\r\n return this.each(function (item, cursor) {\r\n a.push(cursor.key);\r\n }).then(function () {\r\n return a;\r\n }).then(cb);\r\n },\r\n primaryKeys: function (cb) {\r\n var ctx = this._ctx;\r\n if (hasGetAll && ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\r\n // Special optimation if we could use IDBObjectStore.getAllKeys() or\r\n // IDBKeyRange.getAllKeys():\r\n return this._read(function (resolve, reject, idbstore) {\r\n var idxOrStore = getIndexOrStore(ctx, idbstore);\r\n var req = ctx.limit < Infinity ?\r\n idxOrStore.getAllKeys(ctx.range, ctx.limit) :\r\n idxOrStore.getAllKeys(ctx.range);\r\n req.onerror = eventRejectHandler(reject);\r\n req.onsuccess = eventSuccessHandler(resolve);\r\n }).then(cb);\r\n }\r\n ctx.keysOnly = !ctx.isMatch;\r\n var a = [];\r\n return this.each(function (item, cursor) {\r\n a.push(cursor.primaryKey);\r\n }).then(function () {\r\n return a;\r\n }).then(cb);\r\n },\r\n uniqueKeys: function (cb) {\r\n this._ctx.unique = \"unique\";\r\n return this.keys(cb);\r\n },\r\n firstKey: function (cb) {\r\n return this.limit(1).keys(function (a) { return a[0]; }).then(cb);\r\n },\r\n lastKey: function (cb) {\r\n return this.reverse().firstKey(cb);\r\n },\r\n distinct: function () {\r\n var ctx = this._ctx, idx = ctx.index && ctx.table.schema.idxByName[ctx.index];\r\n if (!idx || !idx.multi)\r\n return this; // distinct() only makes differencies on multiEntry indexes.\r\n var set = {};\r\n addFilter(this._ctx, function (cursor) {\r\n var strKey = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\r\n var found = hasOwn(set, strKey);\r\n set[strKey] = true;\r\n return !found;\r\n });\r\n return this;\r\n },\r\n //\r\n // Methods that mutate storage\r\n //\r\n modify: function (changes) {\r\n var self = this, ctx = this._ctx, hook = ctx.table.hook, updatingHook = hook.updating.fire, deletingHook = hook.deleting.fire;\r\n fake && typeof changes === 'function' && changes.call({ value: ctx.table.schema.instanceTemplate }, ctx.table.schema.instanceTemplate);\r\n return this._write(function (resolve, reject, idbstore, trans) {\r\n var modifyer;\r\n if (typeof changes === 'function') {\r\n // Changes is a function that may update, add or delete propterties or even require a deletion the object itself (delete this.item)\r\n if (updatingHook === nop && deletingHook === nop) {\r\n // Noone cares about what is being changed. Just let the modifier function be the given argument as is.\r\n modifyer = changes;\r\n }\r\n else {\r\n // People want to know exactly what is being modified or deleted.\r\n // Let modifyer be a proxy function that finds out what changes the caller is actually doing\r\n // and call the hooks accordingly!\r\n modifyer = function (item) {\r\n var origItem = deepClone(item); // Clone the item first so we can compare laters.\r\n if (changes.call(this, item, this) === false)\r\n return false; // Call the real modifyer function (If it returns false explicitely, it means it dont want to modify anyting on this object)\r\n if (!hasOwn(this, \"value\")) {\r\n // The real modifyer function requests a deletion of the object. Inform the deletingHook that a deletion is taking place.\r\n deletingHook.call(this, this.primKey, item, trans);\r\n }\r\n else {\r\n // No deletion. Check what was changed\r\n var objectDiff = getObjectDiff(origItem, this.value);\r\n var additionalChanges = updatingHook.call(this, objectDiff, this.primKey, origItem, trans);\r\n if (additionalChanges) {\r\n // Hook want to apply additional modifications. Make sure to fullfill the will of the hook.\r\n item = this.value;\r\n keys(additionalChanges).forEach(function (keyPath) {\r\n setByKeyPath(item, keyPath, additionalChanges[keyPath]); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\r\n });\r\n }\r\n }\r\n };\r\n }\r\n }\r\n else if (updatingHook === nop) {\r\n // changes is a set of {keyPath: value} and no one is listening to the updating hook.\r\n var keyPaths = keys(changes);\r\n var numKeys = keyPaths.length;\r\n modifyer = function (item) {\r\n var anythingModified = false;\r\n for (var i = 0; i < numKeys; ++i) {\r\n var keyPath = keyPaths[i], val = changes[keyPath];\r\n if (getByKeyPath(item, keyPath) !== val) {\r\n setByKeyPath(item, keyPath, val); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\r\n anythingModified = true;\r\n }\r\n }\r\n return anythingModified;\r\n };\r\n }\r\n else {\r\n // changes is a set of {keyPath: value} and people are listening to the updating hook so we need to call it and\r\n // allow it to add additional modifications to make.\r\n var origChanges = changes;\r\n changes = shallowClone(origChanges); // Let's work with a clone of the changes keyPath/value set so that we can restore it in case a hook extends it.\r\n modifyer = function (item) {\r\n var anythingModified = false;\r\n var additionalChanges = updatingHook.call(this, changes, this.primKey, deepClone(item), trans);\r\n if (additionalChanges)\r\n extend(changes, additionalChanges);\r\n keys(changes).forEach(function (keyPath) {\r\n var val = changes[keyPath];\r\n if (getByKeyPath(item, keyPath) !== val) {\r\n setByKeyPath(item, keyPath, val);\r\n anythingModified = true;\r\n }\r\n });\r\n if (additionalChanges)\r\n changes = shallowClone(origChanges); // Restore original changes for next iteration\r\n return anythingModified;\r\n };\r\n }\r\n var count = 0;\r\n var successCount = 0;\r\n var iterationComplete = false;\r\n var failures = [];\r\n var failKeys = [];\r\n var currentKey = null;\r\n function modifyItem(item, cursor) {\r\n currentKey = cursor.primaryKey;\r\n var thisContext = {\r\n primKey: cursor.primaryKey,\r\n value: item,\r\n onsuccess: null,\r\n onerror: null\r\n };\r\n function onerror(e) {\r\n failures.push(e);\r\n failKeys.push(thisContext.primKey);\r\n checkFinished();\r\n return true; // Catch these errors and let a final rejection decide whether or not to abort entire transaction\r\n }\r\n if (modifyer.call(thisContext, item, thisContext) !== false) {\r\n var bDelete = !hasOwn(thisContext, \"value\");\r\n ++count;\r\n tryCatch(function () {\r\n var req = (bDelete ? cursor.delete() : cursor.update(thisContext.value));\r\n req._hookCtx = thisContext;\r\n req.onerror = hookedEventRejectHandler(onerror);\r\n req.onsuccess = hookedEventSuccessHandler(function () {\r\n ++successCount;\r\n checkFinished();\r\n });\r\n }, onerror);\r\n }\r\n else if (thisContext.onsuccess) {\r\n // Hook will expect either onerror or onsuccess to always be called!\r\n thisContext.onsuccess(thisContext.value);\r\n }\r\n }\r\n function doReject(e) {\r\n if (e) {\r\n failures.push(e);\r\n failKeys.push(currentKey);\r\n }\r\n return reject(new ModifyError(\"Error modifying one or more objects\", failures, successCount, failKeys));\r\n }\r\n function checkFinished() {\r\n if (iterationComplete && successCount + failures.length === count) {\r\n if (failures.length > 0)\r\n doReject();\r\n else\r\n resolve(successCount);\r\n }\r\n }\r\n self.clone().raw()._iterate(modifyItem, function () {\r\n iterationComplete = true;\r\n checkFinished();\r\n }, doReject, idbstore);\r\n });\r\n },\r\n 'delete': function () {\r\n var _this = this;\r\n var ctx = this._ctx, range = ctx.range, deletingHook = ctx.table.hook.deleting.fire, hasDeleteHook = deletingHook !== nop;\r\n if (!hasDeleteHook &&\r\n isPlainKeyRange(ctx) &&\r\n ((ctx.isPrimKey && !hangsOnDeleteLargeKeyRange) || !range)) {\r\n // May use IDBObjectStore.delete(IDBKeyRange) in this case (Issue #208)\r\n // For chromium, this is the way most optimized version.\r\n // For IE/Edge, this could hang the indexedDB engine and make operating system instable\r\n // (https://gist.github.com/dfahlander/5a39328f029de18222cf2125d56c38f7)\r\n return this._write(function (resolve, reject, idbstore) {\r\n // Our API contract is to return a count of deleted items, so we have to count() before delete().\r\n var onerror = eventRejectHandler(reject), countReq = (range ? idbstore.count(range) : idbstore.count());\r\n countReq.onerror = onerror;\r\n countReq.onsuccess = function () {\r\n var count = countReq.result;\r\n tryCatch(function () {\r\n var delReq = (range ? idbstore.delete(range) : idbstore.clear());\r\n delReq.onerror = onerror;\r\n delReq.onsuccess = function () { return resolve(count); };\r\n }, function (err) { return reject(err); });\r\n };\r\n });\r\n }\r\n // Default version to use when collection is not a vanilla IDBKeyRange on the primary key.\r\n // Divide into chunks to not starve RAM.\r\n // If has delete hook, we will have to collect not just keys but also objects, so it will use\r\n // more memory and need lower chunk size.\r\n var CHUNKSIZE = hasDeleteHook ? 2000 : 10000;\r\n return this._write(function (resolve, reject, idbstore, trans) {\r\n var totalCount = 0;\r\n // Clone collection and change its table and set a limit of CHUNKSIZE on the cloned Collection instance.\r\n var collection = _this\r\n .clone({\r\n keysOnly: !ctx.isMatch && !hasDeleteHook\r\n }) // load just keys (unless filter() or and() or deleteHook has subscribers)\r\n .distinct() // In case multiEntry is used, never delete same key twice because resulting count\r\n .limit(CHUNKSIZE)\r\n .raw(); // Don't filter through reading-hooks (like mapped classes etc)\r\n var keysOrTuples = [];\r\n // We're gonna do things on as many chunks that are needed.\r\n // Use recursion of nextChunk function:\r\n var nextChunk = function () { return collection.each(hasDeleteHook ? function (val, cursor) {\r\n // Somebody subscribes to hook('deleting'). Collect all primary keys and their values,\r\n // so that the hook can be called with its values in bulkDelete().\r\n keysOrTuples.push([cursor.primaryKey, cursor.value]);\r\n } : function (val, cursor) {\r\n // No one subscribes to hook('deleting'). Collect only primary keys:\r\n keysOrTuples.push(cursor.primaryKey);\r\n }).then(function () {\r\n // Chromium deletes faster when doing it in sort order.\r\n hasDeleteHook ?\r\n keysOrTuples.sort(function (a, b) { return ascending(a[0], b[0]); }) :\r\n keysOrTuples.sort(ascending);\r\n return bulkDelete(idbstore, trans, keysOrTuples, hasDeleteHook, deletingHook);\r\n }).then(function () {\r\n var count = keysOrTuples.length;\r\n totalCount += count;\r\n keysOrTuples = [];\r\n return count < CHUNKSIZE ? totalCount : nextChunk();\r\n }); };\r\n resolve(nextChunk());\r\n });\r\n }\r\n };\r\n });\r\n //\r\n //\r\n //\r\n // ------------------------- Help functions ---------------------------\r\n //\r\n //\r\n //\r\n function lowerVersionFirst(a, b) {\r\n return a._cfg.version - b._cfg.version;\r\n }\r\n function setApiOnPlace(objs, tableNames, dbschema) {\r\n tableNames.forEach(function (tableName) {\r\n var schema = dbschema[tableName];\r\n objs.forEach(function (obj) {\r\n if (!(tableName in obj)) {\r\n if (obj === Transaction.prototype || obj instanceof Transaction) {\r\n // obj is a Transaction prototype (or prototype of a subclass to Transaction)\r\n // Make the API a getter that returns this.table(tableName)\r\n setProp(obj, tableName, { get: function () { return this.table(tableName); } });\r\n }\r\n else {\r\n // Table will not be bound to a transaction (will use Dexie.currentTransaction)\r\n obj[tableName] = new Table(tableName, schema);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n function removeTablesApi(objs) {\r\n objs.forEach(function (obj) {\r\n for (var key in obj) {\r\n if (obj[key] instanceof Table)\r\n delete obj[key];\r\n }\r\n });\r\n }\r\n function iterate(req, filter, fn, resolve, reject, valueMapper) {\r\n // Apply valueMapper (hook('reading') or mappped class)\r\n var mappedFn = valueMapper ? function (x, c, a) { return fn(valueMapper(x), c, a); } : fn;\r\n // Wrap fn with PSD and microtick stuff from Promise.\r\n var wrappedFn = wrap(mappedFn, reject);\r\n if (!req.onerror)\r\n req.onerror = eventRejectHandler(reject);\r\n if (filter) {\r\n req.onsuccess = trycatcher(function filter_record() {\r\n var cursor = req.result;\r\n if (cursor) {\r\n var c = function () { cursor.continue(); };\r\n if (filter(cursor, function (advancer) { c = advancer; }, resolve, reject))\r\n wrappedFn(cursor.value, cursor, function (advancer) { c = advancer; });\r\n c();\r\n }\r\n else {\r\n resolve();\r\n }\r\n }, reject);\r\n }\r\n else {\r\n req.onsuccess = trycatcher(function filter_record() {\r\n var cursor = req.result;\r\n if (cursor) {\r\n var c = function () { cursor.continue(); };\r\n wrappedFn(cursor.value, cursor, function (advancer) { c = advancer; });\r\n c();\r\n }\r\n else {\r\n resolve();\r\n }\r\n }, reject);\r\n }\r\n }\r\n function parseIndexSyntax(indexes) {\r\n /// \r\n /// \r\n var rv = [];\r\n indexes.split(',').forEach(function (index) {\r\n index = index.trim();\r\n var name = index.replace(/([&*]|\\+\\+)/g, \"\"); // Remove \"&\", \"++\" and \"*\"\r\n // Let keyPath of \"[a+b]\" be [\"a\",\"b\"]:\r\n var keyPath = /^\\[/.test(name) ? name.match(/^\\[(.*)\\]$/)[1].split('+') : name;\r\n rv.push(new IndexSpec(name, keyPath || null, /\\&/.test(index), /\\*/.test(index), /\\+\\+/.test(index), isArray(keyPath), /\\./.test(index)));\r\n });\r\n return rv;\r\n }\r\n function cmp(key1, key2) {\r\n return indexedDB.cmp(key1, key2);\r\n }\r\n function min(a, b) {\r\n return cmp(a, b) < 0 ? a : b;\r\n }\r\n function max(a, b) {\r\n return cmp(a, b) > 0 ? a : b;\r\n }\r\n function ascending(a, b) {\r\n return indexedDB.cmp(a, b);\r\n }\r\n function descending(a, b) {\r\n return indexedDB.cmp(b, a);\r\n }\r\n function simpleCompare(a, b) {\r\n return a < b ? -1 : a === b ? 0 : 1;\r\n }\r\n function simpleCompareReverse(a, b) {\r\n return a > b ? -1 : a === b ? 0 : 1;\r\n }\r\n function combine(filter1, filter2) {\r\n return filter1 ?\r\n filter2 ?\r\n function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } :\r\n filter1 :\r\n filter2;\r\n }\r\n function readGlobalSchema() {\r\n db.verno = idbdb.version / 10;\r\n db._dbSchema = globalSchema = {};\r\n dbStoreNames = slice(idbdb.objectStoreNames, 0);\r\n if (dbStoreNames.length === 0)\r\n return; // Database contains no stores.\r\n var trans = idbdb.transaction(safariMultiStoreFix(dbStoreNames), 'readonly');\r\n dbStoreNames.forEach(function (storeName) {\r\n var store = trans.objectStore(storeName), keyPath = store.keyPath, dotted = keyPath && typeof keyPath === 'string' && keyPath.indexOf('.') !== -1;\r\n var primKey = new IndexSpec(keyPath, keyPath || \"\", false, false, !!store.autoIncrement, keyPath && typeof keyPath !== 'string', dotted);\r\n var indexes = [];\r\n for (var j = 0; j < store.indexNames.length; ++j) {\r\n var idbindex = store.index(store.indexNames[j]);\r\n keyPath = idbindex.keyPath;\r\n dotted = keyPath && typeof keyPath === 'string' && keyPath.indexOf('.') !== -1;\r\n var index = new IndexSpec(idbindex.name, keyPath, !!idbindex.unique, !!idbindex.multiEntry, false, keyPath && typeof keyPath !== 'string', dotted);\r\n indexes.push(index);\r\n }\r\n globalSchema[storeName] = new TableSchema(storeName, primKey, indexes, {});\r\n });\r\n setApiOnPlace([allTables], keys(globalSchema), globalSchema);\r\n }\r\n function adjustToExistingIndexNames(schema, idbtrans) {\r\n /// \r\n /// Issue #30 Problem with existing db - adjust to existing index names when migrating from non-dexie db\r\n /// \r\n /// Map between name and TableSchema\r\n /// \r\n var storeNames = idbtrans.db.objectStoreNames;\r\n for (var i = 0; i < storeNames.length; ++i) {\r\n var storeName = storeNames[i];\r\n var store = idbtrans.objectStore(storeName);\r\n hasGetAll = 'getAll' in store;\r\n for (var j = 0; j < store.indexNames.length; ++j) {\r\n var indexName = store.indexNames[j];\r\n var keyPath = store.index(indexName).keyPath;\r\n var dexieName = typeof keyPath === 'string' ? keyPath : \"[\" + slice(keyPath).join('+') + \"]\";\r\n if (schema[storeName]) {\r\n var indexSpec = schema[storeName].idxByName[dexieName];\r\n if (indexSpec)\r\n indexSpec.name = indexName;\r\n }\r\n }\r\n }\r\n // Bug with getAll() on Safari ver<604 on Workers only, see discussion following PR #579\r\n if (/Safari/.test(navigator.userAgent) &&\r\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\r\n _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope &&\r\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604) {\r\n hasGetAll = false;\r\n }\r\n }\r\n function fireOnBlocked(ev) {\r\n db.on(\"blocked\").fire(ev);\r\n // Workaround (not fully*) for missing \"versionchange\" event in IE,Edge and Safari:\r\n connections\r\n .filter(function (c) { return c.name === db.name && c !== db && !c._vcFired; })\r\n .map(function (c) { return c.on(\"versionchange\").fire(ev); });\r\n }\r\n extend(this, {\r\n Collection: Collection,\r\n Table: Table,\r\n Transaction: Transaction,\r\n Version: Version,\r\n WhereClause: WhereClause\r\n });\r\n init();\r\n addons.forEach(function (fn) {\r\n fn(db);\r\n });\r\n}\r\nvar fakeAutoComplete = function () { }; // Will never be changed. We just fake for the IDE that we change it (see doFakeAutoComplete())\r\nvar fake = false; // Will never be changed. We just fake for the IDE that we change it (see doFakeAutoComplete())\r\nfunction parseType(type) {\r\n if (typeof type === 'function') {\r\n return new type();\r\n }\r\n else if (isArray(type)) {\r\n return [parseType(type[0])];\r\n }\r\n else if (type && typeof type === 'object') {\r\n var rv = {};\r\n applyStructure(rv, type);\r\n return rv;\r\n }\r\n else {\r\n return type;\r\n }\r\n}\r\nfunction applyStructure(obj, structure) {\r\n keys(structure).forEach(function (member) {\r\n var value = parseType(structure[member]);\r\n obj[member] = value;\r\n });\r\n return obj;\r\n}\r\nfunction hookedEventSuccessHandler(resolve) {\r\n // wrap() is needed when calling hooks because the rare scenario of:\r\n // * hook does a db operation that fails immediately (IDB throws exception)\r\n // For calling db operations on correct transaction, wrap makes sure to set PSD correctly.\r\n // wrap() will also execute in a virtual tick.\r\n // * If not wrapped in a virtual tick, direct exception will launch a new physical tick.\r\n // * If this was the last event in the bulk, the promise will resolve after a physical tick\r\n // and the transaction will have committed already.\r\n // If no hook, the virtual tick will be executed in the reject()/resolve of the final promise,\r\n // because it is always marked with _lib = true when created using Transaction._promise().\r\n return wrap(function (event) {\r\n var req = event.target, result = req.result, ctx = req._hookCtx, // Contains the hook error handler. Put here instead of closure to boost performance.\r\n hookSuccessHandler = ctx && ctx.onsuccess;\r\n hookSuccessHandler && hookSuccessHandler(result);\r\n resolve && resolve(result);\r\n }, resolve);\r\n}\r\nfunction eventRejectHandler(reject) {\r\n return wrap(function (event) {\r\n preventDefault(event);\r\n reject(event.target.error);\r\n return false;\r\n });\r\n}\r\nfunction eventSuccessHandler(resolve) {\r\n return wrap(function (event) {\r\n resolve(event.target.result);\r\n });\r\n}\r\nfunction hookedEventRejectHandler(reject) {\r\n return wrap(function (event) {\r\n // See comment on hookedEventSuccessHandler() why wrap() is needed only when supporting hooks.\r\n var req = event.target, err = req.error, ctx = req._hookCtx, // Contains the hook error handler. Put here instead of closure to boost performance.\r\n hookErrorHandler = ctx && ctx.onerror;\r\n hookErrorHandler && hookErrorHandler(err);\r\n preventDefault(event);\r\n reject(err);\r\n return false;\r\n });\r\n}\r\nfunction preventDefault(event) {\r\n if (event.stopPropagation)\r\n event.stopPropagation();\r\n if (event.preventDefault)\r\n event.preventDefault();\r\n}\r\nfunction awaitIterator(iterator) {\r\n var callNext = function (result) { return iterator.next(result); }, doThrow = function (error) { return iterator.throw(error); }, onSuccess = step(callNext), onError = step(doThrow);\r\n function step(getNext) {\r\n return function (val) {\r\n var next = getNext(val), value = next.value;\r\n return next.done ? value :\r\n (!value || typeof value.then !== 'function' ?\r\n isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) :\r\n value.then(onSuccess, onError));\r\n };\r\n }\r\n return step(callNext)();\r\n}\r\n//\r\n// IndexSpec struct\r\n//\r\nfunction IndexSpec(name, keyPath, unique, multi, auto, compound, dotted) {\r\n /// \r\n /// \r\n /// \r\n /// \r\n /// \r\n /// \r\n /// \r\n this.name = name;\r\n this.keyPath = keyPath;\r\n this.unique = unique;\r\n this.multi = multi;\r\n this.auto = auto;\r\n this.compound = compound;\r\n this.dotted = dotted;\r\n var keyPathSrc = typeof keyPath === 'string' ? keyPath : keyPath && ('[' + [].join.call(keyPath, '+') + ']');\r\n this.src = (unique ? '&' : '') + (multi ? '*' : '') + (auto ? \"++\" : \"\") + keyPathSrc;\r\n}\r\n//\r\n// TableSchema struct\r\n//\r\nfunction TableSchema(name, primKey, indexes, instanceTemplate) {\r\n /// \r\n /// \r\n /// \r\n /// \r\n this.name = name;\r\n this.primKey = primKey || new IndexSpec();\r\n this.indexes = indexes || [new IndexSpec()];\r\n this.instanceTemplate = instanceTemplate;\r\n this.mappedClass = null;\r\n this.idxByName = arrayToObject(indexes, function (index) { return [index.name, index]; });\r\n}\r\nfunction safariMultiStoreFix(storeNames) {\r\n return storeNames.length === 1 ? storeNames[0] : storeNames;\r\n}\r\nfunction getNativeGetDatabaseNamesFn(indexedDB) {\r\n var fn = indexedDB && (indexedDB.getDatabaseNames || indexedDB.webkitGetDatabaseNames);\r\n return fn && fn.bind(indexedDB);\r\n}\r\n// Export Error classes\r\nprops(Dexie, fullNameExceptions); // Dexie.XXXError = class XXXError {...};\r\n//\r\n// Static methods and properties\r\n// \r\nprops(Dexie, {\r\n //\r\n // Static delete() method.\r\n //\r\n delete: function (databaseName) {\r\n var db = new Dexie(databaseName), promise = db.delete();\r\n promise.onblocked = function (fn) {\r\n db.on(\"blocked\", fn);\r\n return this;\r\n };\r\n return promise;\r\n },\r\n //\r\n // Static exists() method.\r\n //\r\n exists: function (name) {\r\n return new Dexie(name).open().then(function (db) {\r\n db.close();\r\n return true;\r\n }).catch(Dexie.NoSuchDatabaseError, function () { return false; });\r\n },\r\n //\r\n // Static method for retrieving a list of all existing databases at current host.\r\n //\r\n getDatabaseNames: function (cb) {\r\n var getDatabaseNames = getNativeGetDatabaseNamesFn(Dexie.dependencies.indexedDB);\r\n return getDatabaseNames ? new Promise(function (resolve, reject) {\r\n var req = getDatabaseNames();\r\n req.onsuccess = function (event) {\r\n resolve(slice(event.target.result, 0)); // Converst DOMStringList to Array\r\n };\r\n req.onerror = eventRejectHandler(reject);\r\n }).then(cb) : dbNamesDB.dbnames.toCollection().primaryKeys(cb);\r\n },\r\n defineClass: function (structure) {\r\n /// \r\n /// Create a javascript constructor based on given template for which properties to expect in the class.\r\n /// Any property that is a constructor function will act as a type. So {name: String} will be equal to {name: new String()}.\r\n /// \r\n /// Helps IDE code completion by knowing the members that objects contain and not just the indexes. Also\r\n /// know what type each member has. Example: {name: String, emailAddresses: [String], properties: {shoeSize: Number}}\r\n // Default constructor able to copy given properties into this object.\r\n function Class(properties) {\r\n /// Properties to initialize object with.\r\n /// \r\n properties ? extend(this, properties) : fake && applyStructure(this, structure);\r\n }\r\n return Class;\r\n },\r\n applyStructure: applyStructure,\r\n ignoreTransaction: function (scopeFunc) {\r\n // In case caller is within a transaction but needs to create a separate transaction.\r\n // Example of usage:\r\n //\r\n // Let's say we have a logger function in our app. Other application-logic should be unaware of the\r\n // logger function and not need to include the 'logentries' table in all transaction it performs.\r\n // The logging should always be done in a separate transaction and not be dependant on the current\r\n // running transaction context. Then you could use Dexie.ignoreTransaction() to run code that starts a new transaction.\r\n //\r\n // Dexie.ignoreTransaction(function() {\r\n // db.logentries.add(newLogEntry);\r\n // });\r\n //\r\n // Unless using Dexie.ignoreTransaction(), the above example would try to reuse the current transaction\r\n // in current Promise-scope.\r\n //\r\n // An alternative to Dexie.ignoreTransaction() would be setImmediate() or setTimeout(). The reason we still provide an\r\n // API for this because\r\n // 1) The intention of writing the statement could be unclear if using setImmediate() or setTimeout().\r\n // 2) setTimeout() would wait unnescessary until firing. This is however not the case with setImmediate().\r\n // 3) setImmediate() is not supported in the ES standard.\r\n // 4) You might want to keep other PSD state that was set in a parent PSD, such as PSD.letThrough.\r\n return PSD.trans ?\r\n usePSD(PSD.transless, scopeFunc) :\r\n scopeFunc(); // No need to change scope because there is no ongoing transaction.\r\n },\r\n vip: function (fn) {\r\n // To be used by subscribers to the on('ready') event.\r\n // This will let caller through to access DB even when it is blocked while the db.ready() subscribers are firing.\r\n // This would have worked automatically if we were certain that the Provider was using Dexie.Promise for all asyncronic operations. The promise PSD\r\n // from the provider.connect() call would then be derived all the way to when provider would call localDatabase.applyChanges(). But since\r\n // the provider more likely is using non-promise async APIs or other thenable implementations, we cannot assume that.\r\n // Note that this method is only useful for on('ready') subscribers that is returning a Promise from the event. If not using vip()\r\n // the database could deadlock since it wont open until the returned Promise is resolved, and any non-VIPed operation started by\r\n // the caller will not resolve until database is opened.\r\n return newScope(function () {\r\n PSD.letThrough = true; // Make sure we are let through if still blocking db due to onready is firing.\r\n return fn();\r\n });\r\n },\r\n async: function (generatorFn) {\r\n return function () {\r\n try {\r\n var rv = awaitIterator(generatorFn.apply(this, arguments));\r\n if (!rv || typeof rv.then !== 'function')\r\n return Promise.resolve(rv);\r\n return rv;\r\n }\r\n catch (e) {\r\n return rejection(e);\r\n }\r\n };\r\n },\r\n spawn: function (generatorFn, args, thiz) {\r\n try {\r\n var rv = awaitIterator(generatorFn.apply(thiz, args || []));\r\n if (!rv || typeof rv.then !== 'function')\r\n return Promise.resolve(rv);\r\n return rv;\r\n }\r\n catch (e) {\r\n return rejection(e);\r\n }\r\n },\r\n // Dexie.currentTransaction property\r\n currentTransaction: {\r\n get: function () { return PSD.trans || null; }\r\n },\r\n waitFor: function (promiseOrFunction, optionalTimeout) {\r\n // If a function is provided, invoke it and pass the returning value to Transaction.waitFor()\r\n var promise = Promise.resolve(typeof promiseOrFunction === 'function' ? Dexie.ignoreTransaction(promiseOrFunction) : promiseOrFunction)\r\n .timeout(optionalTimeout || 60000); // Default the timeout to one minute. Caller may specify Infinity if required. \r\n // Run given promise on current transaction. If no current transaction, just return a Dexie promise based\r\n // on given value.\r\n return PSD.trans ? PSD.trans.waitFor(promise) : promise;\r\n },\r\n // Export our Promise implementation since it can be handy as a standalone Promise implementation\r\n Promise: Promise,\r\n // Dexie.debug proptery:\r\n // Dexie.debug = false\r\n // Dexie.debug = true\r\n // Dexie.debug = \"dexie\" - don't hide dexie's stack frames.\r\n debug: {\r\n get: function () { return debug; },\r\n set: function (value) {\r\n setDebug(value, value === 'dexie' ? function () { return true; } : dexieStackFrameFilter);\r\n }\r\n },\r\n // Export our derive/extend/override methodology\r\n derive: derive,\r\n extend: extend,\r\n props: props,\r\n override: override,\r\n // Export our Events() function - can be handy as a toolkit\r\n Events: Events,\r\n // Utilities\r\n getByKeyPath: getByKeyPath,\r\n setByKeyPath: setByKeyPath,\r\n delByKeyPath: delByKeyPath,\r\n shallowClone: shallowClone,\r\n deepClone: deepClone,\r\n getObjectDiff: getObjectDiff,\r\n asap: asap,\r\n maxKey: maxKey,\r\n minKey: minKey,\r\n // Addon registry\r\n addons: [],\r\n // Global DB connection list\r\n connections: connections,\r\n MultiModifyError: exceptions.Modify,\r\n errnames: errnames,\r\n // Export other static classes\r\n IndexSpec: IndexSpec,\r\n TableSchema: TableSchema,\r\n //\r\n // Dependencies\r\n //\r\n // These will automatically work in browsers with indexedDB support, or where an indexedDB polyfill has been included.\r\n //\r\n // In node.js, however, these properties must be set \"manually\" before instansiating a new Dexie().\r\n // For node.js, you need to require indexeddb-js or similar and then set these deps.\r\n //\r\n dependencies: {\r\n // Required:\r\n indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,\r\n IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange\r\n },\r\n // API Version Number: Type Number, make sure to always set a version number that can be comparable correctly. Example: 0.9, 0.91, 0.92, 1.0, 1.01, 1.1, 1.2, 1.21, etc.\r\n semVer: DEXIE_VERSION,\r\n version: DEXIE_VERSION.split('.')\r\n .map(function (n) { return parseInt(n); })\r\n .reduce(function (p, c, i) { return p + (c / Math.pow(10, i * 2)); }),\r\n fakeAutoComplete: fakeAutoComplete,\r\n // https://github.com/dfahlander/Dexie.js/issues/186\r\n // typescript compiler tsc in mode ts--\x3ees5 & commonJS, will expect require() to return\r\n // x.default. Workaround: Set Dexie.default = Dexie.\r\n default: Dexie,\r\n // Make it possible to import {Dexie} (non-default import)\r\n // Reason 1: May switch to that in future.\r\n // Reason 2: We declare it both default and named exported in d.ts to make it possible\r\n // to let addons extend the Dexie interface with Typescript 2.1 (works only when explicitely\r\n // exporting the symbol, not just default exporting)\r\n Dexie: Dexie\r\n});\r\n// Map DOMErrors and DOMExceptions to corresponding Dexie errors. May change in Dexie v2.0.\r\nPromise.rejectionMapper = mapError;\r\n// Fool IDE to improve autocomplete. Tested with Visual Studio 2013 and 2015.\r\ndoFakeAutoComplete(function () {\r\n Dexie.fakeAutoComplete = fakeAutoComplete = doFakeAutoComplete;\r\n Dexie.fake = fake = true;\r\n});\r\n// Initialize dbNamesDB (won't ever be opened on chromium browsers')\r\ndbNamesDB = new Dexie('__dbnames');\r\ndbNamesDB.version(1).stores({ dbnames: 'name' });\r\n(function () {\r\n // Migrate from Dexie 1.x database names stored in localStorage:\r\n var DBNAMES = 'Dexie.DatabaseNames';\r\n if (typeof localStorage !== undefined && _global.document !== undefined)\r\n try {\r\n // Have localStorage and is not executing in a worker. Lets migrate from Dexie 1.x.\r\n JSON.parse(localStorage.getItem(DBNAMES) || \"[]\")\r\n .forEach(function (name) { return dbNamesDB.dbnames.put({ name: name }).catch(nop); });\r\n localStorage.removeItem(DBNAMES);\r\n }\r\n catch (_e) { }\r\n})();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = Dexie;\n//# sourceMappingURL=dexie.es.js.map\n\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(63), __webpack_require__(133).setImmediate))\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(93), __esModule: true };\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(7);\nvar document = __webpack_require__(1).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(18);\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(4);\nvar dPs = __webpack_require__(109);\nvar enumBugKeys = __webpack_require__(27);\nvar IE_PROTO = __webpack_require__(31)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = __webpack_require__(26)('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n __webpack_require__(43).appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(32)('keys');\nvar uid = __webpack_require__(22);\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(1);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n return store[key] || (store[key] = {});\n};\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(33);\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(7);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(1);\nvar core = __webpack_require__(0);\nvar LIBRARY = __webpack_require__(19);\nvar wksExt = __webpack_require__(37);\nvar defineProperty = __webpack_require__(5).f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\nexports.f = __webpack_require__(2);\n\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $at = __webpack_require__(114)(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\n__webpack_require__(48)(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n\n\n/***/ }),\n/* 39 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_dexie__ = __webpack_require__(23);\n/* ========================================================================== \r\n * dexie-observable.js\r\n * ==========================================================================\r\n *\r\n * Dexie addon for observing database changes not just on local db instance\r\n * but also on other instances, tabs and windows.\r\n *\r\n * Comprises a base framework for dexie-syncable.js\r\n *\r\n * By David Fahlander, david.fahlander@gmail.com,\r\n * Nikolas Poniros, https://github.com/nponiros\r\n *\r\n * ==========================================================================\r\n *\r\n * Version {version}, {date}\r\n *\r\n * http://dexie.org\r\n *\r\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/\r\n * \r\n */\r\n\n\n\nfunction nop() { }\r\nfunction promisableChain(f1, f2) {\r\n if (f1 === nop)\r\n return f2;\r\n return function () {\r\n var res = f1.apply(this, arguments);\r\n if (res && typeof res.then === 'function') {\r\n var thiz = this, args = arguments;\r\n return res.then(function () {\r\n return f2.apply(thiz, args);\r\n });\r\n }\r\n return f2.apply(this, arguments);\r\n };\r\n}\r\nfunction createUUID() {\r\n // Decent solution from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript\r\n var d = Date.now();\r\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = (d + Math.random() * 16) % 16 | 0;\r\n d = Math.floor(d / 16);\r\n return (c === 'x' ? r : (r & 0x7 | 0x8)).toString(16);\r\n });\r\n return uuid;\r\n}\n\nfunction initOverrideCreateTransaction(db, wakeupObservers) {\r\n return function overrideCreateTransaction(origFunc) {\r\n return function (mode, storenames, dbschema, parent) {\r\n if (db.dynamicallyOpened())\r\n return origFunc.apply(this, arguments); // Don't observe dynamically opened databases.\r\n var addChanges = false;\r\n if (mode === 'readwrite' && storenames.some(function (storeName) {\r\n return dbschema[storeName] && dbschema[storeName].observable;\r\n })) {\r\n // At least one included store is a observable store. Make sure to also include the _changes store.\r\n addChanges = true;\r\n storenames = storenames.slice(0); // Clone\r\n if (storenames.indexOf(\"_changes\") === -1)\r\n storenames.push(\"_changes\"); // Otherwise, firefox will hang... (I've reported the bug to Mozilla@Bugzilla)\r\n }\r\n // Call original db._createTransaction()\r\n var trans = origFunc.call(this, mode, storenames, dbschema, parent);\r\n // If this transaction is bound to any observable table, make sure to add changes when transaction completes.\r\n if (addChanges) {\r\n trans._lastWrittenRevision = 0;\r\n trans.on('complete', function () {\r\n if (trans._lastWrittenRevision) {\r\n // Changes were written in this transaction.\r\n if (!parent) {\r\n // This is root-level transaction, i.e. a physical commit has happened.\r\n // Delay-trigger a wakeup call:\r\n if (wakeupObservers.timeoutHandle)\r\n clearTimeout(wakeupObservers.timeoutHandle);\r\n wakeupObservers.timeoutHandle = setTimeout(function () {\r\n delete wakeupObservers.timeoutHandle;\r\n wakeupObservers(trans._lastWrittenRevision);\r\n }, 25);\r\n }\r\n else {\r\n // This is just a virtual commit of a sub transaction.\r\n // Wait with waking up observers until root transaction has committed.\r\n // Make sure to mark root transaction so that it will wakeup observers upon commit.\r\n var rootTransaction = (function findRootTransaction(trans) {\r\n return trans.parent ? findRootTransaction(trans.parent) : trans;\r\n })(parent);\r\n rootTransaction._lastWrittenRevision = Math.max(trans._lastWrittenRevision, rootTransaction.lastWrittenRevision || 0);\r\n }\r\n }\r\n });\r\n // Derive \"source\" property from parent transaction by default\r\n if (trans.parent && trans.parent.source)\r\n trans.source = trans.parent.source;\r\n }\r\n return trans;\r\n };\r\n };\r\n}\n\nfunction initWakeupObservers(db, Observable, localStorage) {\r\n return function wakeupObservers(lastWrittenRevision) {\r\n // Make sure Observable.latestRevision[db.name] is still below our value, now when some time has elapsed and other db instances in same window possibly could have made changes too.\r\n if (Observable.latestRevision[db.name] < lastWrittenRevision) {\r\n // Set the static property lastRevision[db.name] to the revision of the last written change.\r\n Observable.latestRevision[db.name] = lastWrittenRevision;\r\n // Wakeup ourselves, and any other db instances on this window:\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].ignoreTransaction(function () {\r\n Observable.on('latestRevisionIncremented').fire(db.name, lastWrittenRevision);\r\n });\r\n // Observable.on.latestRevisionIncremented will only wakeup db's in current window.\r\n // We need a storage event to wakeup other windwos.\r\n // Since indexedDB lacks storage events, let's use the storage event from WebStorage just for\r\n // the purpose to wakeup db instances in other windows.\r\n if (localStorage)\r\n localStorage.setItem('Dexie.Observable/latestRevision/' + db.name, lastWrittenRevision); // In IE, this will also wakeup our own window. However, onLatestRevisionIncremented will work around this by only running once per revision id.\r\n }\r\n };\r\n}\n\n// Change Types\r\n// Change Types\r\nvar CREATE = 1;\r\nvar UPDATE = 2;\r\nvar DELETE = 3;\n\nfunction initCreatingHook(db, table) {\r\n return function creatingHook(primKey, obj, trans) {\r\n /// \r\n var rv = undefined;\r\n if (primKey === undefined && table.schema.primKey.uuid) {\r\n primKey = rv = createUUID();\r\n if (table.schema.primKey.keyPath) {\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].setByKeyPath(obj, table.schema.primKey.keyPath, primKey);\r\n }\r\n }\r\n var change = {\r\n source: trans.source || null,\r\n table: table.name,\r\n key: primKey === undefined ? null : primKey,\r\n type: CREATE,\r\n obj: obj\r\n };\r\n var promise = db._changes.add(change).then(function (rev) {\r\n trans._lastWrittenRevision = Math.max(trans._lastWrittenRevision, rev);\r\n return rev;\r\n });\r\n // Wait for onsuccess so that we have the primKey if it is auto-incremented and update the change item if so.\r\n this.onsuccess = function (resultKey) {\r\n if (primKey != resultKey)\r\n promise._then(function () {\r\n change.key = resultKey;\r\n db._changes.put(change);\r\n });\r\n };\r\n this.onerror = function () {\r\n // If the main operation fails, make sure to regret the change\r\n promise._then(function (rev) {\r\n // Will only happen if app code catches the main operation error to prohibit transaction from aborting.\r\n db._changes.delete(rev);\r\n });\r\n };\r\n return rv;\r\n };\r\n}\n\nfunction initUpdatingHook(db, tableName) {\r\n return function updatingHook(mods, primKey, oldObj, trans) {\r\n /// \r\n // mods may contain property paths with undefined as value if the property\r\n // is being deleted. Since we cannot persist undefined we need to act\r\n // like those changes is setting the value to null instead.\r\n var modsWithoutUndefined = {};\r\n // As of current Dexie version (1.0.3) hook may be called even if it wouldn't really change.\r\n // Therefore we may do that kind of optimization here - to not add change entries if\r\n // there's nothing to change.\r\n var anythingChanged = false;\r\n var newObj = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].deepClone(oldObj);\r\n for (var propPath in mods) {\r\n var mod = mods[propPath];\r\n if (typeof mod === 'undefined') {\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].delByKeyPath(newObj, propPath);\r\n modsWithoutUndefined[propPath] = null; // Null is as close we could come to deleting a property when not allowing undefined.\r\n anythingChanged = true;\r\n }\r\n else {\r\n var currentValue = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].getByKeyPath(oldObj, propPath);\r\n if (mod !== currentValue && JSON.stringify(mod) !== JSON.stringify(currentValue)) {\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].setByKeyPath(newObj, propPath, mod);\r\n modsWithoutUndefined[propPath] = mod;\r\n anythingChanged = true;\r\n }\r\n }\r\n }\r\n if (anythingChanged) {\r\n var change = {\r\n source: trans.source || null,\r\n table: tableName,\r\n key: primKey,\r\n type: UPDATE,\r\n mods: modsWithoutUndefined,\r\n oldObj: oldObj,\r\n obj: newObj\r\n };\r\n var promise = db._changes.add(change); // Just so we get the correct revision order of the update...\r\n this.onsuccess = function () {\r\n promise._then(function (rev) {\r\n trans._lastWrittenRevision = Math.max(trans._lastWrittenRevision, rev);\r\n });\r\n };\r\n this.onerror = function () {\r\n // If the main operation fails, make sure to regret the change.\r\n promise._then(function (rev) {\r\n // Will only happen if app code catches the main operation error to prohibit transaction from aborting.\r\n db._changes.delete(rev);\r\n });\r\n };\r\n }\r\n };\r\n}\n\nfunction initDeletingHook(db, tableName) {\r\n return function deletingHook(primKey, obj, trans) {\r\n /// \r\n var promise = db._changes.add({\r\n source: trans.source || null,\r\n table: tableName,\r\n key: primKey,\r\n type: DELETE,\r\n oldObj: obj\r\n }).then(function (rev) {\r\n trans._lastWrittenRevision = Math.max(trans._lastWrittenRevision, rev);\r\n return rev;\r\n })\r\n .catch(function (e) {\r\n console.log(obj);\r\n console.log(e.stack);\r\n });\r\n this.onerror = function () {\r\n // If the main operation fails, make sure to regret the change.\r\n // Using _then because if promise is already fullfilled, the standard then() would\r\n // do setTimeout() and we would loose the transaction.\r\n promise._then(function (rev) {\r\n // Will only happen if app code catches the main operation error to prohibit transaction from aborting.\r\n db._changes.delete(rev);\r\n });\r\n };\r\n };\r\n}\n\nfunction initCrudMonitor(db) {\r\n //\r\n // The Creating/Updating/Deleting hook will make sure any change is stored to the changes table\r\n //\r\n return function crudMonitor(table) {\r\n /// \r\n if (table.hook._observing)\r\n return;\r\n table.hook._observing = true;\r\n var tableName = table.name;\r\n table.hook('creating').subscribe(initCreatingHook(db, table));\r\n table.hook('updating').subscribe(initUpdatingHook(db, tableName));\r\n table.hook('deleting').subscribe(initDeletingHook(db, tableName));\r\n };\r\n}\n\nfunction initOnStorage(Observable) {\r\n return function onStorage(event) {\r\n // We use the onstorage event to trigger onLatestRevisionIncremented since we will wake up when other windows modify the DB as well!\r\n if (event.key.indexOf(\"Dexie.Observable/\") === 0) {\r\n var parts = event.key.split('/');\r\n var prop = parts[1];\r\n var dbname = parts[2];\r\n if (prop === 'latestRevision') {\r\n var rev = parseInt(event.newValue, 10);\r\n if (!isNaN(rev) && rev > Observable.latestRevision[dbname]) {\r\n Observable.latestRevision[dbname] = rev;\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].ignoreTransaction(function () {\r\n Observable.on('latestRevisionIncremented').fire(dbname, rev);\r\n });\r\n }\r\n }\r\n else if (prop.indexOf(\"deadnode:\") === 0) {\r\n var nodeID = parseInt(prop.split(':')[1], 10);\r\n if (event.newValue) {\r\n Observable.on.suicideNurseCall.fire(dbname, nodeID);\r\n }\r\n }\r\n else if (prop === 'intercomm') {\r\n if (event.newValue) {\r\n Observable.on.intercomm.fire(dbname);\r\n }\r\n }\r\n }\r\n };\r\n}\n\nfunction initOverrideOpen(db, SyncNode, crudMonitor) {\r\n return function overrideOpen(origOpen) {\r\n return function () {\r\n //\r\n // Make sure to subscribe to \"creating\", \"updating\" and \"deleting\" hooks for all observable tables that were created in the stores() method.\r\n //\r\n Object.keys(db._allTables).forEach(function (tableName) {\r\n var table = db._allTables[tableName];\r\n if (table.schema.observable) {\r\n crudMonitor(table);\r\n }\r\n if (table.name === \"_syncNodes\") {\r\n table.mapToClass(SyncNode);\r\n }\r\n });\r\n return origOpen.apply(this, arguments);\r\n };\r\n };\r\n}\n\nvar Promise$1 = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Promise;\r\nfunction initIntercomm(db, Observable, SyncNode, mySyncNode, localStorage) {\r\n //\r\n // Intercommunication between nodes\r\n //\r\n // Enable inter-process communication between browser windows using localStorage storage event (is registered in Dexie.Observable)\r\n var requestsWaitingForReply = {};\r\n /**\r\n * @param {string} type Type of message\r\n * @param message Message to send\r\n * @param {number} destinationNode ID of destination node\r\n * @param {{wantReply: boolean, isFailure: boolean, requestId: number}} options If {wantReply: true}, the returned promise will complete with the reply from remote. Otherwise it will complete when message has been successfully sent.\r\n */\r\n db.observable.sendMessage = function (type, message, destinationNode, options) {\r\n /// Type of message\r\n /// Message to send\r\n /// ID of destination node\r\n /// {wantReply: Boolean, isFailure: Boolean, requestId: Number}. If wantReply, the returned promise will complete with the reply from remote. Otherwise it will complete when message has been successfully sent.\r\n options = options || {};\r\n if (!mySyncNode.node)\r\n return options.wantReply ?\r\n Promise$1.reject(new __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].DatabaseClosedError()) :\r\n Promise$1.resolve(); // If caller doesn't want a reply, it won't catch errors either.\r\n var msg = { message: message, destinationNode: destinationNode, sender: mySyncNode.node.id, type: type };\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].extend(msg, options); // wantReply: wantReply, success: !isFailure, requestId: ...\r\n return __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].ignoreTransaction(function () {\r\n var tables = [\"_intercomm\"];\r\n if (options.wantReply)\r\n tables.push(\"_syncNodes\"); // If caller wants a reply, include \"_syncNodes\" in transaction to check that there's a receiver there. Otherwise, new master will get it.\r\n var promise = db.transaction('rw', tables, function () {\r\n if (options.wantReply) {\r\n // Check that there is a receiver there to take the request.\r\n return db._syncNodes.where('id').equals(destinationNode).count(function (receiverAlive) {\r\n if (receiverAlive)\r\n return db._intercomm.add(msg);\r\n else\r\n return db._syncNodes.where('isMaster').above(0).first(function (masterNode) {\r\n msg.destinationNode = masterNode.id;\r\n return db._intercomm.add(msg);\r\n });\r\n });\r\n }\r\n else {\r\n // If caller doesn't need a response, we don't have to make sure that it gets one.\r\n return db._intercomm.add(msg);\r\n }\r\n }).then(function (messageId) {\r\n var rv = null;\r\n if (options.wantReply) {\r\n rv = new Promise$1(function (resolve, reject) {\r\n requestsWaitingForReply[messageId.toString()] = { resolve: resolve, reject: reject };\r\n });\r\n }\r\n if (localStorage) {\r\n localStorage.setItem(\"Dexie.Observable/intercomm/\" + db.name, messageId.toString());\r\n }\r\n Observable.on.intercomm.fire(db.name);\r\n return rv;\r\n });\r\n if (!options.wantReply) {\r\n promise.catch(function () {\r\n });\r\n return;\r\n }\r\n else {\r\n // Forward rejection to caller if it waits for reply.\r\n return promise;\r\n }\r\n });\r\n };\r\n // Send a message to all local _syncNodes\r\n db.observable.broadcastMessage = function (type, message, bIncludeSelf) {\r\n if (!mySyncNode.node)\r\n return;\r\n var mySyncNodeId = mySyncNode.node.id;\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].ignoreTransaction(function () {\r\n db._syncNodes.toArray(function (nodes) {\r\n return Promise$1.all(nodes\r\n .filter(function (node) { return node.type === 'local' && (bIncludeSelf || node.id !== mySyncNodeId); })\r\n .map(function (node) { return db.observable.sendMessage(type, message, node.id); }));\r\n }).catch(function () {\r\n });\r\n });\r\n };\r\n function consumeIntercommMessages() {\r\n // Check if we got messages:\r\n if (!mySyncNode.node)\r\n return Promise$1.reject(new __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].DatabaseClosedError());\r\n return __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].ignoreTransaction(function () {\r\n return db.transaction('rw', '_intercomm', function () {\r\n return db._intercomm.where({ destinationNode: mySyncNode.node.id }).toArray(function (messages) {\r\n messages.forEach(function (msg) { return consumeMessage(msg); });\r\n return db._intercomm.where('id').anyOf(messages.map(function (msg) { return msg.id; })).delete();\r\n });\r\n });\r\n });\r\n }\r\n function consumeMessage(msg) {\r\n if (msg.type === 'response') {\r\n // This is a response. Lookup pending request and fulfill its promise.\r\n var request = requestsWaitingForReply[msg.requestId.toString()];\r\n if (request) {\r\n if (msg.isFailure) {\r\n request.reject(msg.message.error);\r\n }\r\n else {\r\n request.resolve(msg.message.result);\r\n }\r\n delete requestsWaitingForReply[msg.requestId.toString()];\r\n }\r\n }\r\n else {\r\n // This is a message or request. Fire the event and add an API for the subscriber to use if reply is requested\r\n msg.resolve = function (result) {\r\n db.observable.sendMessage('response', { result: result }, msg.sender, { requestId: msg.id });\r\n };\r\n msg.reject = function (error) {\r\n db.observable.sendMessage('response', { error: error.toString() }, msg.sender, { isFailure: true, requestId: msg.id });\r\n };\r\n db.on.message.fire(msg);\r\n }\r\n }\r\n // Listener for 'intercomm' events\r\n // Gets fired when we get a 'storage' event from local storage or when sendMessage is called\r\n // 'storage' is used to communicate between tabs (sendMessage changes the localStorage to trigger the event)\r\n // sendMessage is used to communicate in the same tab and to trigger a storage event\r\n function onIntercomm(dbname) {\r\n // When storage event trigger us to check\r\n if (dbname === db.name) {\r\n consumeIntercommMessages().catch('DatabaseClosedError', function () { });\r\n }\r\n }\r\n return {\r\n onIntercomm: onIntercomm,\r\n consumeIntercommMessages: consumeIntercommMessages\r\n };\r\n}\n\nfunction overrideParseStoresSpec(origFunc) {\r\n return function (stores, dbSchema) {\r\n // Create the _changes and _syncNodes tables\r\n stores[\"_changes\"] = \"++rev\";\r\n stores[\"_syncNodes\"] = \"++id,myRevision,lastHeartBeat,&url,isMaster,type,status\";\r\n stores[\"_intercomm\"] = \"++id,destinationNode\";\r\n stores[\"_uncommittedChanges\"] = \"++id,node\"; // For remote syncing when server returns a partial result.\r\n // Call default implementation. Will populate the dbSchema structures.\r\n origFunc.call(this, stores, dbSchema);\r\n // Allow UUID primary keys using $$ prefix on primary key or indexes\r\n Object.keys(dbSchema).forEach(function (tableName) {\r\n var schema = dbSchema[tableName];\r\n if (schema.primKey.name.indexOf('$$') === 0) {\r\n schema.primKey.uuid = true;\r\n schema.primKey.name = schema.primKey.name.substr(2);\r\n schema.primKey.keyPath = schema.primKey.keyPath.substr(2);\r\n }\r\n });\r\n // Now mark all observable tables\r\n Object.keys(dbSchema).forEach(function (tableName) {\r\n // Marked observable tables with \"observable\" in their TableSchema.\r\n if (tableName.indexOf('_') !== 0 && tableName.indexOf('$') !== 0) {\r\n dbSchema[tableName].observable = true;\r\n }\r\n });\r\n };\r\n}\n\nfunction deleteOldChanges(db) {\r\n // This is a background job and should never be done within\r\n // a caller's transaction. Use Dexie.ignoreTransaction() to ensure that.\r\n // We should not return the Promise but catch it ourselves instead.\r\n // To prohibit starving the database we want to lock transactions as short as possible\r\n // and since we're not in a hurry, we could do this job in chunks and reschedule a\r\n // continuation every 500 ms.\r\n var CHUNK_SIZE = 100;\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].ignoreTransaction(function () {\r\n return db._syncNodes.orderBy(\"myRevision\").first(function (oldestNode) {\r\n return db._changes\r\n .where(\"rev\").below(oldestNode.myRevision)\r\n .limit(CHUNK_SIZE)\r\n .primaryKeys();\r\n }).then(function (keysToDelete) {\r\n if (keysToDelete.length === 0)\r\n return; // Done.\r\n return db._changes.bulkDelete(keysToDelete).then(function () {\r\n // If not done garbage collecting, reschedule a continuation of it until done.\r\n if (keysToDelete.length === CHUNK_SIZE) {\r\n // Limit reached. Changes are there are more job to do. Schedule again:\r\n setTimeout(function () { return db.isOpen() && deleteOldChanges(db); }, 500);\r\n }\r\n });\r\n });\r\n }).catch(function () {\r\n // The operation is not crucial. A failure could almost only be due to that database has been closed.\r\n // No need to log this.\r\n });\r\n}\n\n/* ==========================================================================\r\n * dexie-observable.js\r\n * ==========================================================================\r\n *\r\n * Dexie addon for observing database changes not just on local db instance\r\n * but also on other instances, tabs and windows.\r\n *\r\n * Comprises a base framework for dexie-syncable.js\r\n *\r\n * By David Fahlander, david.fahlander@gmail.com,\r\n * Nikolas Poniros, https://github.com/nponiros\r\n *\r\n * ==========================================================================\r\n *\r\n * Version {version}, {date}\r\n *\r\n * http://dexie.org\r\n *\r\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/\r\n *\r\n */\r\nvar global = self;\r\n/** class DatabaseChange\r\n *\r\n * Object contained by the _changes table.\r\n */\r\nvar DatabaseChange = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].defineClass({\r\n rev: Number,\r\n source: String,\r\n table: String,\r\n key: Object,\r\n type: Number,\r\n obj: Object,\r\n mods: Object,\r\n oldObj: Object // DELETE: oldObj contains the object deleted. UPDATE: oldObj contains the old object before updates applied.\r\n});\r\n// Import some usable helper functions\r\nvar override = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].override;\r\nvar Promise = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Promise;\r\nvar browserIsShuttingDown = false;\r\nfunction Observable(db) {\r\n /// \r\n /// Extension to Dexie providing Syncronization capabilities to Dexie.\r\n /// \r\n /// \r\n var NODE_TIMEOUT = 20000, // 20 seconds before local db instances are timed out. This is so that old changes can be deleted when not needed and to garbage collect old _syncNodes objects.\r\n HIBERNATE_GRACE_PERIOD = 20000, // 20 seconds\r\n // LOCAL_POLL: The time to wait before polling local db for changes and cleaning up old nodes. \r\n // Polling for changes is a fallback only needed in certain circomstances (when the onstorage event doesnt reach all listeners - when different browser windows doesnt share the same process)\r\n LOCAL_POLL = 500, // 500 ms. In real-world there will be this value + the time it takes to poll(). A small value is needed in Workers where we cannot rely on storage event.\r\n HEARTBEAT_INTERVAL = NODE_TIMEOUT - 5000;\r\n var localStorage = Observable.localStorageImpl;\r\n /** class SyncNode\r\n *\r\n * Object contained in the _syncNodes table.\r\n */\r\n var SyncNode = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].defineClass({\r\n //id: Number,\r\n myRevision: Number,\r\n type: String,\r\n lastHeartBeat: Number,\r\n deleteTimeStamp: Number,\r\n url: String,\r\n isMaster: Number,\r\n // Below properties should be extended in Dexie.Syncable. Not here. They apply to remote nodes only (type == \"remote\"):\r\n syncProtocol: String,\r\n syncContext: null,\r\n syncOptions: Object,\r\n connected: false,\r\n status: Number,\r\n appliedRemoteRevision: null,\r\n remoteBaseRevisions: [{ local: Number, remote: null }],\r\n dbUploadState: {\r\n tablesToUpload: [String],\r\n currentTable: String,\r\n currentKey: null,\r\n localBaseRevision: Number\r\n }\r\n });\r\n db.observable = {};\r\n db.observable.SyncNode = SyncNode;\r\n var wakeupObservers = initWakeupObservers(db, Observable, localStorage);\r\n var overrideCreateTransaction = initOverrideCreateTransaction(db, wakeupObservers);\r\n var crudMonitor = initCrudMonitor(db);\r\n var overrideOpen = initOverrideOpen(db, SyncNode, crudMonitor);\r\n var mySyncNode = { node: null };\r\n var intercomm = initIntercomm(db, Observable, SyncNode, mySyncNode, localStorage);\r\n var onIntercomm = intercomm.onIntercomm;\r\n var consumeIntercommMessages = intercomm.consumeIntercommMessages;\r\n // Allow other addons to access the local sync node. May be needed by Dexie.Syncable.\r\n Object.defineProperty(db, \"_localSyncNode\", {\r\n get: function () { return mySyncNode.node; }\r\n });\r\n var pollHandle = null, heartbeatHandle = null;\r\n if (__WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].fake) {\r\n // This code will never run.\r\n // It's here just to enable auto-complete in visual studio - helps a lot when writing code.\r\n db.version(1).stores({\r\n _syncNodes: \"++id,myRevision,lastHeartBeat\",\r\n _changes: \"++rev\",\r\n _intercomm: \"++id,destinationNode\",\r\n _uncommittedChanges: \"++id,node\"\r\n });\r\n db._syncNodes.mapToClass(SyncNode);\r\n db._changes.mapToClass(DatabaseChange);\r\n mySyncNode.node = new SyncNode({\r\n myRevision: 0,\r\n type: \"local\",\r\n lastHeartBeat: Date.now(),\r\n deleteTimeStamp: null\r\n });\r\n }\r\n //\r\n // Override parsing the stores to add \"_changes\" and \"_syncNodes\" tables.\r\n // It also adds UUID support for the primary key and sets tables as observable tables.\r\n //\r\n db.Version.prototype._parseStoresSpec = override(db.Version.prototype._parseStoresSpec, overrideParseStoresSpec);\r\n // changes event on db:\r\n db.on.addEventType({\r\n changes: 'asap',\r\n cleanup: [promisableChain, nop],\r\n message: 'asap'\r\n });\r\n //\r\n // Override transaction creation to always include the \"_changes\" store when any observable store is involved.\r\n //\r\n db._createTransaction = override(db._createTransaction, overrideCreateTransaction);\r\n // If Observable.latestRevsion[db.name] is undefined, set it to 0 so that comparing against it always works.\r\n // You might think that it will always be undefined before this call, but in case another Dexie instance in the same\r\n // window with the same database name has been created already, this static property will already be set correctly.\r\n Observable.latestRevision[db.name] = Observable.latestRevision[db.name] || 0;\r\n //\r\n // Override open to setup hooks for db changes and map the _syncNodes table to class\r\n //\r\n db.open = override(db.open, overrideOpen);\r\n db.close = override(db.close, function (origClose) {\r\n return function () {\r\n if (db.dynamicallyOpened())\r\n return origClose.apply(this, arguments); // Don't observe dynamically opened databases.\r\n // Teardown our framework.\r\n if (wakeupObservers.timeoutHandle) {\r\n clearTimeout(wakeupObservers.timeoutHandle);\r\n delete wakeupObservers.timeoutHandle;\r\n }\r\n Observable.on('latestRevisionIncremented').unsubscribe(onLatestRevisionIncremented);\r\n Observable.on('suicideNurseCall').unsubscribe(onSuicide);\r\n Observable.on('intercomm').unsubscribe(onIntercomm);\r\n Observable.on('beforeunload').unsubscribe(onBeforeUnload);\r\n // Inform other db instances in same window that we are dying:\r\n if (mySyncNode.node && mySyncNode.node.id) {\r\n Observable.on.suicideNurseCall.fire(db.name, mySyncNode.node.id);\r\n // Inform other windows as well:\r\n if (localStorage) {\r\n localStorage.setItem('Dexie.Observable/deadnode:' + mySyncNode.node.id.toString() + '/' + db.name, \"dead\"); // In IE, this will also wakeup our own window. cleanup() may trigger twice per other db instance. But that doesnt to anything.\r\n }\r\n mySyncNode.node.deleteTimeStamp = 1; // One millisecond after 1970. Makes it occur in the past but still keeps it truthy.\r\n mySyncNode.node.lastHeartBeat = 0;\r\n db._syncNodes.put(mySyncNode.node); // This async operation may be cancelled since the browser is closing down now.\r\n mySyncNode.node = null;\r\n }\r\n if (pollHandle)\r\n clearTimeout(pollHandle);\r\n pollHandle = null;\r\n if (heartbeatHandle)\r\n clearTimeout(heartbeatHandle);\r\n heartbeatHandle = null;\r\n return origClose.apply(this, arguments);\r\n };\r\n });\r\n // Override Dexie.delete() in order to delete Observable.latestRevision[db.name].\r\n db.delete = override(db.delete, function (origDelete) {\r\n return function () {\r\n return origDelete.apply(this, arguments).then(function (result) {\r\n // Reset Observable.latestRevision[db.name]\r\n Observable.latestRevision[db.name] = 0;\r\n return result;\r\n });\r\n };\r\n });\r\n // When db opens, make sure to start monitor any changes before other db operations will start.\r\n db.on(\"ready\", function startObserving() {\r\n if (db.dynamicallyOpened())\r\n return db; // Don't observe dynamically opened databases.\r\n return db.table(\"_changes\").orderBy(\"rev\").last(function (lastChange) {\r\n // Since startObserving() is called before database open() method, this will be the first database operation enqueued to db.\r\n // Therefore we know that the retrieved value will be This query will\r\n var latestRevision = (lastChange ? lastChange.rev : 0);\r\n mySyncNode.node = new SyncNode({\r\n myRevision: latestRevision,\r\n type: \"local\",\r\n lastHeartBeat: Date.now(),\r\n deleteTimeStamp: null,\r\n isMaster: 0\r\n });\r\n if (Observable.latestRevision[db.name] < latestRevision) {\r\n // Side track . For correctness whenever setting Observable.latestRevision[db.name] we must make sure the event is fired if increased:\r\n // There are other db instances in same window that hasnt yet been informed about a new revision\r\n Observable.latestRevision[db.name] = latestRevision;\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].ignoreTransaction(function () {\r\n Observable.on.latestRevisionIncremented.fire(latestRevision);\r\n });\r\n }\r\n // Add new sync node or if this is a reopening of the database after a close() call, update it.\r\n return db.transaction('rw', '_syncNodes', function () {\r\n return db._syncNodes\r\n .where('isMaster').equals(1)\r\n .first(function (currentMaster) {\r\n if (!currentMaster) {\r\n // There's no master. We must be the master\r\n mySyncNode.node.isMaster = 1;\r\n }\r\n else if (currentMaster.lastHeartBeat < Date.now() - NODE_TIMEOUT) {\r\n // Master have been inactive for too long\r\n // Take over mastership\r\n mySyncNode.node.isMaster = 1;\r\n currentMaster.isMaster = 0;\r\n return db._syncNodes.put(currentMaster);\r\n }\r\n }).then(function () {\r\n // Add our node to DB and start subscribing to events\r\n return db._syncNodes.add(mySyncNode.node).then(function () {\r\n Observable.on('latestRevisionIncremented', onLatestRevisionIncremented); // Wakeup when a new revision is available.\r\n Observable.on('beforeunload', onBeforeUnload);\r\n Observable.on('suicideNurseCall', onSuicide);\r\n Observable.on('intercomm', onIntercomm);\r\n // Start polling for changes and do cleanups:\r\n pollHandle = setTimeout(poll, LOCAL_POLL);\r\n // Start heartbeat\r\n heartbeatHandle = setTimeout(heartbeat, HEARTBEAT_INTERVAL);\r\n });\r\n });\r\n }).then(function () {\r\n cleanup();\r\n });\r\n });\r\n }, true); // True means the on(ready) event will survive a db reopening (db.close() / db.open()).\r\n var handledRevision = 0;\r\n function onLatestRevisionIncremented(dbname, latestRevision) {\r\n if (dbname === db.name) {\r\n if (handledRevision >= latestRevision)\r\n return; // Make sure to only run once per revision. (Workaround for IE triggering storage event on same window)\r\n handledRevision = latestRevision;\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].vip(function () {\r\n readChanges(latestRevision).catch('DatabaseClosedError', function () {\r\n // Handle database closed error gracefully while reading changes.\r\n // Don't trigger 'unhandledrejection'.\r\n // Even though we intercept the close() method, it might be called when in the middle of\r\n // reading changes and then that flow will cancel with DatabaseClosedError.\r\n });\r\n });\r\n }\r\n }\r\n function readChanges(latestRevision, recursion, wasPartial) {\r\n // Whenever changes are read, fire db.on(\"changes\") with the array of changes. Eventually, limit the array to 1000 entries or so (an entire database is\r\n // downloaded from server AFTER we are initiated. For example, if first sync call fails, then after a while we get reconnected. However, that scenario\r\n // should be handled in case database is totally empty we should fail if sync is not available)\r\n if (!recursion && readChanges.ongoingOperation) {\r\n // We are already reading changes. Prohibit a parallell execution of this which would lead to duplicate trigging of 'changes' event.\r\n // Instead, the callback in toArray() will always check Observable.latestRevision[db.name] to see if it has changed and if so, re-launch readChanges().\r\n // The caller should get the Promise instance from the ongoing operation so that the then() method will resolve when operation is finished.\r\n return readChanges.ongoingOperation;\r\n }\r\n var partial = false;\r\n var ourSyncNode = mySyncNode.node; // Because mySyncNode can suddenly be set to null on database close, and worse, can be set to a new value if database is reopened.\r\n if (!ourSyncNode) {\r\n return Promise.reject(new __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].DatabaseClosedError());\r\n }\r\n var LIMIT = 1000;\r\n var promise = db._changes.where(\"rev\").above(ourSyncNode.myRevision).limit(LIMIT).toArray(function (changes) {\r\n if (changes.length > 0) {\r\n var lastChange = changes[changes.length - 1];\r\n partial = (changes.length === LIMIT);\r\n db.on('changes').fire(changes, partial);\r\n ourSyncNode.myRevision = lastChange.rev;\r\n }\r\n else if (wasPartial) {\r\n // No more changes, BUT since we have triggered on('changes') with partial = true,\r\n // we HAVE TO trigger changes again with empty list and partial = false\r\n db.on('changes').fire([], false);\r\n }\r\n var ourNodeStillExists = false;\r\n return db._syncNodes.where(':id').equals(ourSyncNode.id).modify(function (syncNode) {\r\n ourNodeStillExists = true;\r\n syncNode.lastHeartBeat = Date.now(); // Update heart beat (not nescessary, but why not!)\r\n syncNode.deleteTimeStamp = null; // Reset \"deleteTimeStamp\" flag if it was there.\r\n syncNode.myRevision = Math.max(syncNode.myRevision, ourSyncNode.myRevision);\r\n }).then(function () { return ourNodeStillExists; });\r\n }).then(function (ourNodeStillExists) {\r\n if (!ourNodeStillExists) {\r\n // My node has been deleted. We must have been lazy and got removed by another node.\r\n if (browserIsShuttingDown) {\r\n throw new Error(\"Browser is shutting down\");\r\n }\r\n else {\r\n db.close();\r\n console.error(\"Out of sync\"); // TODO: What to do? Reload the page?\r\n if (global.location)\r\n global.location.reload(true);\r\n throw new Error(\"Out of sync\"); // Will make current promise reject\r\n }\r\n }\r\n // Check if more changes have come since we started reading changes in the first place. If so, relaunch readChanges and let the ongoing promise not\r\n // resolve until all changes have been read.\r\n if (partial || Observable.latestRevision[db.name] > ourSyncNode.myRevision) {\r\n // Either there were more than 1000 changes or additional changes where added while we were reading these changes,\r\n // In either case, call readChanges() again until we're done.\r\n return readChanges(Observable.latestRevision[db.name], (recursion || 0) + 1, partial);\r\n }\r\n }).finally(function () {\r\n delete readChanges.ongoingOperation;\r\n });\r\n if (!recursion) {\r\n readChanges.ongoingOperation = promise;\r\n }\r\n return promise;\r\n }\r\n /**\r\n * The reason we need heartbeat in parallell with poll() is due to the risk of long-running\r\n * transactions while syncing changes from server to client in Dexie.Syncable. That transaction will\r\n * include _changes (which will block readChanges()) but not _syncNodes. So this heartbeat will go on\r\n * during that changes are being applied and update our lastHeartBeat property while poll() is waiting.\r\n * When cleanup() (who also is blocked by the sync) wakes up, it won't kill the master node because this\r\n * heartbeat job will have updated the master node's heartbeat during the long-running sync transaction.\r\n *\r\n * If we did not have this heartbeat, and a server send lots of changes that took more than NODE_TIMEOUT\r\n * (20 seconds), another node waking up after the sync would kill the master node and take over because\r\n * it would believe it was dead.\r\n */\r\n function heartbeat() {\r\n heartbeatHandle = null;\r\n var currentInstance = mySyncNode.node && mySyncNode.node.id;\r\n if (!currentInstance)\r\n return;\r\n db.transaction('rw!', db._syncNodes, function () {\r\n db._syncNodes.where({ id: currentInstance }).first(function (ourSyncNode) {\r\n if (!ourSyncNode) {\r\n // We do not exist anymore. Call db.close() to teardown polls etc.\r\n if (db.isOpen())\r\n db.close();\r\n return;\r\n }\r\n ourSyncNode.lastHeartBeat = Date.now();\r\n ourSyncNode.deleteTimeStamp = null; // Reset \"deleteTimeStamp\" flag if it was there.\r\n return db._syncNodes.put(ourSyncNode);\r\n });\r\n }).catch('DatabaseClosedError', function () {\r\n // Ignore silently\r\n }).finally(function () {\r\n if (mySyncNode.node && mySyncNode.node.id === currentInstance && db.isOpen()) {\r\n heartbeatHandle = setTimeout(heartbeat, HEARTBEAT_INTERVAL);\r\n }\r\n });\r\n }\r\n function poll() {\r\n pollHandle = null;\r\n var currentInstance = mySyncNode.node && mySyncNode.node.id;\r\n if (!currentInstance)\r\n return;\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].vip(function () {\r\n readChanges(Observable.latestRevision[db.name]).then(cleanup).then(consumeIntercommMessages)\r\n .catch('DatabaseClosedError', function () {\r\n // Handle database closed error gracefully while reading changes.\r\n // Don't trigger 'unhandledrejection'.\r\n // Even though we intercept the close() method, it might be called when in the middle of\r\n // reading changes and then that flow will cancel with DatabaseClosedError.\r\n })\r\n .finally(function () {\r\n // Poll again in given interval:\r\n if (mySyncNode.node && mySyncNode.node.id === currentInstance && db.isOpen()) {\r\n pollHandle = setTimeout(poll, LOCAL_POLL);\r\n }\r\n });\r\n });\r\n }\r\n function cleanup() {\r\n var ourSyncNode = mySyncNode.node;\r\n if (!ourSyncNode)\r\n return Promise.reject(new __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].DatabaseClosedError());\r\n return db.transaction('rw', '_syncNodes', '_changes', '_intercomm', function () {\r\n // Cleanup dead local nodes that has no heartbeat for over a minute\r\n // Dont do the following:\r\n //nodes.where(\"lastHeartBeat\").below(Date.now() - NODE_TIMEOUT).and(function (node) { return node.type == \"local\"; }).delete();\r\n // Because client may have been in hybernate mode and recently woken up. That would lead to deletion of all nodes.\r\n // Instead, we should mark any old nodes for deletion in a minute or so. If they still dont wakeup after that minute we could consider them dead.\r\n var weBecameMaster = false;\r\n db._syncNodes.where(\"lastHeartBeat\").below(Date.now() - NODE_TIMEOUT).filter(function (node) { return node.type === 'local'; }).modify(function (node) {\r\n if (node.deleteTimeStamp && node.deleteTimeStamp < Date.now()) {\r\n // Delete the node.\r\n delete this.value;\r\n // Cleanup localStorage \"deadnode:\" entry for this node (localStorage API was used to wakeup other windows (onstorage event) - an event type missing in indexedDB.)\r\n if (localStorage) {\r\n localStorage.removeItem('Dexie.Observable/deadnode:' + node.id + '/' + db.name);\r\n }\r\n // Check if we are deleting a master node\r\n if (node.isMaster) {\r\n // The node we are deleting is master. We must take over that role.\r\n // OK to call nodes.update(). No need to call Dexie.vip() because nodes is opened in existing transaction!\r\n db._syncNodes.update(ourSyncNode, { isMaster: 1 });\r\n weBecameMaster = true;\r\n }\r\n // Cleanup intercomm messages destinated to the node being deleted.\r\n // Those that waits for reply should be redirected to us.\r\n db._intercomm.where({ destinationNode: node.id }).modify(function (msg) {\r\n if (msg.wantReply)\r\n msg.destinationNode = ourSyncNode.id;\r\n else\r\n // Delete the message from DB and if someone is waiting for reply, let ourselved answer the request.\r\n delete this.value;\r\n });\r\n }\r\n else if (!node.deleteTimeStamp) {\r\n // Mark the node for deletion\r\n node.deleteTimeStamp = Date.now() + HIBERNATE_GRACE_PERIOD;\r\n }\r\n }).then(function () {\r\n // Cleanup old revisions that no node is interested of.\r\n Observable.deleteOldChanges(db);\r\n return db.on(\"cleanup\").fire(weBecameMaster);\r\n });\r\n });\r\n }\r\n function onBeforeUnload() {\r\n // Mark our own sync node for deletion.\r\n if (!mySyncNode.node)\r\n return;\r\n browserIsShuttingDown = true;\r\n mySyncNode.node.deleteTimeStamp = 1; // One millisecond after 1970. Makes it occur in the past but still keeps it truthy.\r\n mySyncNode.node.lastHeartBeat = 0;\r\n db._syncNodes.put(mySyncNode.node); // This async operation may be cancelled since the browser is closing down now.\r\n Observable.wereTheOneDying = true; // If other nodes in same window wakes up by this call, make sure they dont start taking over mastership and stuff...\r\n // Inform other windows that we're gone, so that they may take over our role if needed. Setting localStorage item below will trigger Observable.onStorage, which will trigger onSuicie() below:\r\n if (localStorage) {\r\n localStorage.setItem('Dexie.Observable/deadnode:' + mySyncNode.node.id.toString() + '/' + db.name, \"dead\"); // In IE, this will also wakeup our own window. However, that is doublechecked in nursecall subscriber below.\r\n }\r\n }\r\n function onSuicide(dbname, nodeID) {\r\n if (dbname === db.name && !Observable.wereTheOneDying) {\r\n // Make sure it's dead indeed. Second bullet. Why? Because it has marked itself for deletion in the onbeforeunload event, which is fired just before window dies.\r\n // It's own call to put() may have been cancelled.\r\n // Note also that in IE, this event may be called twice, but that doesnt harm!\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].vip(function () {\r\n db._syncNodes.update(nodeID, { deleteTimeStamp: 1, lastHeartBeat: 0 }).then(cleanup);\r\n });\r\n }\r\n }\r\n}\r\n//\r\n// Static properties and methods\r\n// \r\nObservable.latestRevision = {}; // Latest revision PER DATABASE. Example: Observable.latestRevision.FriendsDB = 37;\r\nObservable.on = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Events(null, \"latestRevisionIncremented\", \"suicideNurseCall\", \"intercomm\", \"beforeunload\"); // fire(dbname, value);\r\nObservable.createUUID = createUUID;\r\nObservable.deleteOldChanges = deleteOldChanges;\r\nObservable._onStorage = initOnStorage(Observable);\r\nObservable._onBeforeUnload = function () {\r\n Observable.on.beforeunload.fire();\r\n};\r\ntry {\r\n Observable.localStorageImpl = global.localStorage;\r\n}\r\ncatch (ex) { }\r\n//\r\n// Map window events to static events in Dexie.Observable:\r\n//\r\nif (global.addEventListener) {\r\n global.addEventListener(\"storage\", Observable._onStorage);\r\n global.addEventListener(\"beforeunload\", Observable._onBeforeUnload);\r\n}\r\n// Register addon:\r\n__WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Observable = Observable;\r\n__WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].addons.push(Observable);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = Observable;\n//# sourceMappingURL=dexie-observable.es.js.map\n\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(89), __esModule: true };\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _iterator = __webpack_require__(78);\n\nvar _iterator2 = _interopRequireDefault(_iterator);\n\nvar _symbol = __webpack_require__(77);\n\nvar _symbol2 = _interopRequireDefault(_symbol);\n\nvar _typeof = typeof _symbol2.default === \"function\" && typeof _iterator2.default === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj; };\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = typeof _symbol2.default === \"function\" && _typeof(_iterator2.default) === \"symbol\" ? function (obj) {\n return typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n} : function (obj) {\n return obj && typeof _symbol2.default === \"function\" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n};\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(13);\nvar TAG = __webpack_require__(2)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar document = __webpack_require__(1).document;\nmodule.exports = document && document.documentElement;\n\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(6) && !__webpack_require__(11)(function () {\n return Object.defineProperty(__webpack_require__(26)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(13);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// check on default Array iterator\nvar Iterators = __webpack_require__(14);\nvar ITERATOR = __webpack_require__(2)('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(4);\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(19);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(57);\nvar hide = __webpack_require__(9);\nvar has = __webpack_require__(8);\nvar Iterators = __webpack_require__(14);\nvar $iterCreate = __webpack_require__(104);\nvar setToStringTag = __webpack_require__(21);\nvar getPrototypeOf = __webpack_require__(52);\nvar ITERATOR = __webpack_require__(2)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = (!BUGGY && $native) || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ITERATOR = __webpack_require__(2)('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pIE = __webpack_require__(20);\nvar createDesc = __webpack_require__(16);\nvar toIObject = __webpack_require__(12);\nvar toPrimitive = __webpack_require__(35);\nvar has = __webpack_require__(8);\nvar IE8_DOM_DEFINE = __webpack_require__(44);\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = __webpack_require__(6) ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = __webpack_require__(53);\nvar hiddenKeys = __webpack_require__(27).concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(8);\nvar toObject = __webpack_require__(17);\nvar IE_PROTO = __webpack_require__(31)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(8);\nvar toIObject = __webpack_require__(12);\nvar arrayIndexOf = __webpack_require__(98)(false);\nvar IE_PROTO = __webpack_require__(31)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// most Object methods by ES6 should accept primitives\nvar $export = __webpack_require__(3);\nvar core = __webpack_require__(0);\nvar fails = __webpack_require__(11);\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(4);\nvar isObject = __webpack_require__(7);\nvar newPromiseCapability = __webpack_require__(28);\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(9);\n\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(4);\nvar aFunction = __webpack_require__(18);\nvar SPECIES = __webpack_require__(2)('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(10);\nvar invoke = __webpack_require__(102);\nvar html = __webpack_require__(43);\nvar cel = __webpack_require__(26);\nvar global = __webpack_require__(1);\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (__webpack_require__(13)(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(42);\nvar ITERATOR = __webpack_require__(2)('iterator');\nvar Iterators = __webpack_require__(14);\nmodule.exports = __webpack_require__(0).getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(117);\nvar global = __webpack_require__(1);\nvar hide = __webpack_require__(9);\nvar Iterators = __webpack_require__(14);\nvar TO_STRING_TAG = __webpack_require__(2)('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n 'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n var NAME = DOMIterables[i];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = Iterators.Array;\n}\n\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 64 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise__ = __webpack_require__(24);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise__);\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = initConnectionStatus;\n\nvar CONNECTION_CHECK_PATH = 'check';\n\nfunction initConnectionStatus(global) {\n function checkServerConnection(url) {\n return global.fetch(url, { method: 'HEAD' });\n }\n\n function isOnline(url) {\n // If we have no URL we are offline\n if (!url) {\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default.a.resolve(false);\n }\n var serverUrl = url[url.length - 1] === '/' ? '' + url + CONNECTION_CHECK_PATH : url + '/' + CONNECTION_CHECK_PATH;\n\n if (global.navigator.onLine) {\n return checkServerConnection(serverUrl).then(function () {\n return true;\n }).catch(function () {\n return false;\n });\n }\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default.a.resolve(false);\n }\n\n function onlineStatusChanged(url, cb) {\n global.addEventListener('online', function () {\n isOnline(url).then(function (status) {\n cb(status);\n });\n });\n\n global.addEventListener('offline', function () {\n cb(false);\n });\n\n // Set initial status\n isOnline(url).then(function (status) {\n cb(status);\n });\n }\n\n return { isOnline: isOnline, onlineStatusChanged: onlineStatusChanged };\n}\n\n/***/ }),\n/* 65 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* eslint guard-for-in:0, no-unused-vars: 0 */\n/**\n * cuid.js\n * Collision-resistant UID generator for browsers and node.\n * Sequential for fast db lookups and recency sorting.\n * Safe for element IDs and server-side lookups.\n *\n * Extracted from CLCTR\n *\n * Copyright (c) Eric Elliott 2012\n * MIT License\n */\n// The file was modified to use ES2015\nvar c = 0;\nvar blockSize = 4;\nvar base = 36;\nvar discreteValues = Math.pow(base, blockSize);\n\nfunction pad(num, size) {\n var s = '000000000' + num;\n return s.substr(s.length - size);\n}\n\nfunction randomBlock() {\n return pad((Math.random() * discreteValues << 0).toString(base), blockSize);\n}\n\nfunction safeCounter() {\n c = c < discreteValues ? c : 0;\n c++; // this is not subliminal\n return c - 1;\n}\n\n// We want to cache the results of this\nvar cache = function calc() {\n var count = 0;\n\n for (var i in window) {\n count++;\n }\n\n return count;\n}();\n\nfunction globalCount() {\n return cache;\n}\n\nfunction browserPrint() {\n var mimeTypesUAString = (navigator.mimeTypes.length + navigator.userAgent.length).toString(base);\n return pad(mimeTypesUAString + globalCount().toString(base), 4);\n}\n\nfunction cuid() {\n // Starting with a lowercase letter makes\n // it HTML element ID friendly.\n var letter = 'c'; // hard-coded allows for sequential access\n\n // timestamp\n // warning: this exposes the exact date and time\n // that the uid was created.\n var timestamp = new Date().getTime().toString(base);\n\n // A few chars to generate distinct ids for different\n // clients (so different computers are far less\n // likely to generate the same id)\n var fingerprint = browserPrint();\n\n // Grab some more chars from Math.random()\n var random = randomBlock() + randomBlock();\n\n // Prevent same-machine collisions.\n var counter = pad(safeCounter().toString(base), blockSize);\n\n return letter + timestamp + counter + fingerprint + random;\n}\n\n/* harmony default export */ __webpack_exports__[\"a\"] = cuid;\n\n/***/ }),\n/* 66 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = initSync;\n/*\n * Implementation of the ISyncProtocol\n * https://github.com/dfahlander/Dexie.js/wiki/Dexie.Syncable.ISyncProtocol\n */\nfunction initSync(serverComm, isOnline) {\n return function sync(context, url, options, baseRevision, syncedRevision, changes, partial, applyRemoteChanges, onChangesAccepted, onSuccess, onError) {\n var request = {\n // Will not be defined the first time we call the server\n clientIdentity: context.clientIdentity,\n baseRevision: baseRevision,\n partial: partial,\n changes: changes,\n syncedRevision: syncedRevision\n };\n\n serverComm(url, request, options).then(function (data) {\n if (!data.success) {\n // Server didn't accept our changes. Stop trying to sync\n onError(data.errorMessage, Infinity);\n } else {\n // If we have no clientIdentity yet, then this was the first call\n // Make sure we save the clientIdentity and then schedule the next call\n if (!context.clientIdentity) {\n context.clientIdentity = data.clientIdentity;\n context.save().then(function () {\n applyRemoteChanges(data.changes, data.currentRevision, data.partial, false);\n onChangesAccepted();\n onSuccess({ again: options.pollInterval });\n }).catch(function (e) {\n // We failed to save the clientIdentity. Stop trying to sync\n // We would not be able to get/send any partial data\n onError(e, Infinity);\n });\n // This is a subsequent call.\n // We already have a clientIdentity so we can just schedule the next call\n } else {\n applyRemoteChanges(data.changes, data.currentRevision, data.partial, false);\n onChangesAccepted();\n onSuccess({ again: options.pollInterval });\n }\n }\n }).catch(function (e) {\n isOnline(url).then(function (status) {\n if (status) {\n // We were temporarily offline -> retry\n onError(e, options.pollInterval);\n } else {\n // Was probably not just a temp thing -> stop retrying\n // Synable will automatically disconnect us with an ERROR\n // and we will have to manually reconnect\n onError(e, Infinity);\n }\n });\n });\n };\n}\n\n/***/ }),\n/* 67 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise__ = __webpack_require__(24);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__ = __webpack_require__(71);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_isomorphic_fetch__ = __webpack_require__(130);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_isomorphic_fetch___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_isomorphic_fetch__);\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = serverComm;\n\n\n\n\nfunction serverComm(url, data, options) {\n var headers = new Headers();\n headers.set('Content-Type', 'application/json');\n var opts = {\n headers: headers,\n method: 'POST',\n body: __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_json_stringify___default()(data),\n mode: 'cors',\n credentials: options.credentials\n };\n return __WEBPACK_IMPORTED_MODULE_2_isomorphic_fetch___default()(url, opts).then(function (response) {\n if (response.ok) {\n // status 200-299\n return response.json();\n }\n return {\n success: false,\n errorMessage: 'Some server error occurred'\n };\n }, function (error) {\n // Network failure\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_core_js_promise___default.a.reject(error);\n });\n}\n\n/***/ }),\n/* 68 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_defineProperty__ = __webpack_require__(81);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_defineProperty___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_defineProperty__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_keys__ = __webpack_require__(75);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_keys___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_keys__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_promise__ = __webpack_require__(24);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_promise___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_promise__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_core_js_object_assign__ = __webpack_require__(72);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_babel_runtime_core_js_object_assign___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_babel_runtime_core_js_object_assign__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_toConsumableArray__ = __webpack_require__(84);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_toConsumableArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_toConsumableArray__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_babel_runtime_core_js_object_get_prototype_of__ = __webpack_require__(74);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_babel_runtime_core_js_object_get_prototype_of___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_babel_runtime_core_js_object_get_prototype_of__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_classCallCheck__ = __webpack_require__(79);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_classCallCheck___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_classCallCheck__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_babel_runtime_helpers_createClass__ = __webpack_require__(80);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7_babel_runtime_helpers_createClass___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_babel_runtime_helpers_createClass__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8_babel_runtime_helpers_possibleConstructorReturn__ = __webpack_require__(83);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8_babel_runtime_helpers_possibleConstructorReturn___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_babel_runtime_helpers_possibleConstructorReturn__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9_babel_runtime_helpers_inherits__ = __webpack_require__(82);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9_babel_runtime_helpers_inherits___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_9_babel_runtime_helpers_inherits__);\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = initSyncClient;\n\n\n\n\n\n\n\n\n\n\nvar SYNCABLE_PROTOCOL = 'sync_client_protocol';\nvar defaultSyncOptions = {\n pollInterval: 10000, // Poll every 10 seconds\n credentials: 'omit'\n};\n\nfunction initSyncClient(_ref) {\n var Dexie = _ref.Dexie,\n observable = _ref.observable,\n syncable = _ref.syncable,\n sync = _ref.sync,\n isOnline = _ref.isOnline,\n onlineStatusChanged = _ref.onlineStatusChanged,\n cuid = _ref.cuid;\n\n var SyncClient = function (_Dexie) {\n __WEBPACK_IMPORTED_MODULE_9_babel_runtime_helpers_inherits___default()(SyncClient, _Dexie);\n\n /*\n * dbName: string, name for the database\n * dbVersions: {version: number, stores: Array}\n * https://github.com/dfahlander/Dexie.js/wiki/Version.stores()\n */\n function SyncClient(dbName, dbVersions) {\n var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n __WEBPACK_IMPORTED_MODULE_6_babel_runtime_helpers_classCallCheck___default()(this, SyncClient);\n\n var _this = __WEBPACK_IMPORTED_MODULE_8_babel_runtime_helpers_possibleConstructorReturn___default()(this, (SyncClient.__proto__ || __WEBPACK_IMPORTED_MODULE_5_babel_runtime_core_js_object_get_prototype_of___default()(SyncClient)).call(this, dbName, { addons: [observable, syncable].concat(__WEBPACK_IMPORTED_MODULE_4_babel_runtime_helpers_toConsumableArray___default()(opts.addons ? opts.addons : [])) }));\n\n dbVersions.forEach(function (version) {\n if (version.upgrader) {\n _this.version(version.version).stores(version.stores).upgrade(version.upgrader);\n } else {\n _this.version(version.version).stores(version.stores);\n }\n });\n\n var protocolImplementation = {\n sync: sync,\n partialsThreshold: opts.partialsThreshold\n };\n Dexie.Syncable.registerSyncProtocol(SYNCABLE_PROTOCOL, protocolImplementation);\n\n _this.options = {};\n _this.urls = [];\n _this.statusChangeListeners = {};\n\n _this.syncable.on('statusChanged', function (status, url) {\n var cb = _this.statusChangeListeners[url];\n if (cb) {\n cb(Dexie.Syncable.StatusTexts[status]);\n }\n });\n return _this;\n }\n\n __WEBPACK_IMPORTED_MODULE_7_babel_runtime_helpers_createClass___default()(SyncClient, [{\n key: '_connect',\n value: function _connect(url, options) {\n var _this2 = this;\n\n return this.syncable.connect(SYNCABLE_PROTOCOL, url, options).catch(function (e) {\n // disconnect when onError is called\n _this2.disconnect(url);\n throw e;\n });\n }\n\n /*\n * options:\n * pollInterval: number -> How often to resync\n */\n\n }, {\n key: 'connect',\n value: function connect(url, options) {\n var _this3 = this;\n\n // First call to connect\n // Setup onlineStatusChanged\n // Check isOnline before trying to connect using Dexie.Syncable\n if (this.urls.indexOf(url) === -1) {\n this.options[url] = __WEBPACK_IMPORTED_MODULE_3_babel_runtime_core_js_object_assign___default()({}, options, defaultSyncOptions);\n\n return isOnline(url).then(function (status) {\n if (status) {\n return _this3._connect(url, _this3.options[url]).then(function () {\n // Make sure we managed to connect before adding URL\n // and listener\n _this3.urls.push(url);\n\n onlineStatusChanged(url, function (newStatus) {\n if (newStatus) {\n _this3._connect(url, _this3.options[url]);\n } else {\n _this3.disconnect(url);\n }\n });\n });\n }\n return __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_promise___default.a.reject(new Error('Is not online'));\n });\n }\n return __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_promise___default.a.resolve();\n }\n }, {\n key: 'disconnect',\n value: function disconnect(url) {\n var _this4 = this;\n\n return this.syncable.disconnect(url).then(function () {\n _this4.urls = _this4.urls.filter(function (u) {\n return u !== url;\n });\n });\n }\n }, {\n key: 'removeUrl',\n value: function removeUrl(url) {\n var _this5 = this;\n\n return this.syncable.delete(url).then(function () {\n _this5.urls = _this5.urls.filter(function (u) {\n return u !== url;\n });\n _this5.statusChangeListeners[url] = undefined;\n });\n }\n }, {\n key: 'statusChange',\n value: function statusChange(url, cb) {\n this.statusChangeListeners[url] = cb;\n }\n\n /*\n * Returns a Promise>\n */\n\n }, {\n key: 'getStatuses',\n value: function getStatuses() {\n var _this6 = this;\n\n return this.syncable.list().then(function (urls) {\n var promises = urls.map(function (url) {\n return _this6.syncable.getStatus(url);\n });\n return __WEBPACK_IMPORTED_MODULE_2_babel_runtime_core_js_promise___default.a.all(promises).then(function (statuses) {\n return urls.map(function (url, index) {\n return {\n url: url,\n status: Dexie.Syncable.StatusTexts[statuses[index]]\n };\n });\n });\n });\n }\n }, {\n key: 'getStatus',\n value: function getStatus(url) {\n return this.syncable.getStatus(url).then(function (status) {\n return Dexie.Syncable.StatusTexts[status];\n });\n }\n }, {\n key: 'getID',\n value: function getID() {\n return SyncClient.getID();\n }\n }], [{\n key: 'getID',\n value: function getID() {\n return cuid();\n }\n }]);\n\n return SyncClient;\n }(Dexie);\n\n SyncClient.statuses = __WEBPACK_IMPORTED_MODULE_1_babel_runtime_core_js_object_keys___default()(Dexie.Syncable.Statuses).reduce(function (statuses, statusKey) {\n return __WEBPACK_IMPORTED_MODULE_3_babel_runtime_core_js_object_assign___default()(statuses, __WEBPACK_IMPORTED_MODULE_0_babel_runtime_helpers_defineProperty___default()({}, statusKey, statusKey));\n }, {});\n\n return SyncClient;\n}\n\n/***/ }),\n/* 69 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_dexie__ = __webpack_require__(23);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_dexie_observable__ = __webpack_require__(39);\n/* ========================================================================== \r\n * dexie-syncable.js\r\n * ==========================================================================\r\n *\r\n * Dexie addon for syncing indexedDB with remote endpoints.\r\n *\r\n * By David Fahlander, david.fahlander@gmail.com,\r\n * Nikolas Poniros, https://github.com/nponiros\r\n *\r\n * ==========================================================================\r\n *\r\n * Version {version}, {date}\r\n *\r\n * http://dexie.org\r\n *\r\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/\r\n * \r\n */\r\n\n\n\n\nvar Promise$1 = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Promise;\r\nfunction initSyncableConnect(db, connect) {\r\n return function syncableConnect(protocolInstance, protocolName, url, options) {\r\n if (db.isOpen()) {\r\n // Database is open\r\n if (!db._localSyncNode)\r\n throw new Error(\"Precondition failed: local sync node is missing. Make sure Dexie.Observable is active!\");\r\n if (db._localSyncNode.isMaster) {\r\n // We are master node\r\n return connect(protocolInstance, protocolName, url, options, db._localSyncNode.id);\r\n }\r\n else {\r\n // We are not master node\r\n // Request master node to do the connect:\r\n return db.table('_syncNodes').where('isMaster').above(0).first(function (masterNode) {\r\n // There will always be a master node. In theory we may self have become master node when we come here. But that's ok. We'll request ourselves.\r\n return db.observable.sendMessage('connect', {\r\n protocolName: protocolName,\r\n url: url,\r\n options: options\r\n }, masterNode.id, { wantReply: true });\r\n });\r\n }\r\n }\r\n else if (db.hasBeenClosed()) {\r\n // Database has been closed.\r\n return Promise$1.reject(new __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].DatabaseClosedError());\r\n }\r\n else if (db.hasFailed()) {\r\n // Database has failed to open\r\n return Promise$1.reject(new __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].InvalidStateError(\"Dexie.Syncable: Cannot connect. Database has failed to open\"));\r\n }\r\n else {\r\n // Database not yet open. It may be on its way to open, or open() hasn't yet been called.\r\n // Wait for it to open, then connect.\r\n var promise = new Promise$1(function (resolve, reject) {\r\n db.on(\"ready\", function () {\r\n // First, check if this is the very first time we connect to given URL.\r\n // Need to know, because if it is, we should stall the promise returned to\r\n // db.on('ready') to not be fulfilled until the initial sync has succeeded.\r\n return db._syncNodes.get({ url: url }, function (node) {\r\n // Ok, now we know whether we should await the connect promise or not.\r\n // No matter, we should now connect (will maybe create the SyncNode instance\r\n // representing the given URL)\r\n var connectPromise = db.syncable.connect(protocolName, url, options);\r\n connectPromise.then(resolve, reject); // Resolve the returned promise when connected.\r\n // Ok, so let's see if we should suspend DB queries until connected or not:\r\n if (node && node.appliedRemoteRevision) {\r\n // The very first initial sync has been done so we need not wait\r\n // for the connect promise to complete. It can continue in background.\r\n // Returning here will resume db.on('ready') and resume all queries that\r\n // the application has put to the database.\r\n return;\r\n }\r\n // This was the very first time we connect to the remote server,\r\n // we must make sure that the initial sync request succeeeds before resuming\r\n // database queries that the application code puts onto the database.\r\n // If OFFLINE or other error, don't allow the application to proceed.\r\n // We are assuming that an initial sync is essential for the application to\r\n // function correctly.\r\n return connectPromise;\r\n });\r\n });\r\n // Force open() to happen. Otherwise connect() may stall forever.\r\n db.open().catch(function (ex) {\r\n // If open fails, db.on('ready') may not have been called and we must\r\n // reject promise with InvalidStateError\r\n reject(new __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].InvalidStateError(\"Dexie.Syncable: Couldn't connect. Database failed to open\", ex));\r\n });\r\n });\r\n return promise;\r\n }\r\n };\r\n}\n\nfunction initPersistedContext(node) {\r\n //\r\n // PersistedContext : IPersistedContext\r\n //\r\n return (function () {\r\n function PersistedContext(nodeID, otherProps) {\r\n this.nodeID = nodeID;\r\n if (otherProps)\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].extend(this, otherProps);\r\n }\r\n PersistedContext.prototype.save = function () {\r\n // Store this instance in the syncContext property of the node it belongs to.\r\n return __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].vip(function () {\r\n return node.save();\r\n });\r\n };\r\n return PersistedContext;\r\n }());\r\n}\n\nfunction initGetOrCreateSyncNode(db, protocolName, url) {\r\n return function getOrCreateSyncNode(options) {\r\n return db.transaction('rw', db._syncNodes, db._changes, function () {\r\n if (!url)\r\n throw new Error(\"Url cannot be empty\");\r\n // Returning a promise from transaction scope will make the transaction promise resolve with the value of that promise.\r\n return db._syncNodes.where(\"url\").equalsIgnoreCase(url).first(function (node) {\r\n // If we found a node it will be instanceof SyncNode as Dexie.Observable\r\n // maps to class\r\n if (node) {\r\n var PersistedContext = initPersistedContext(node);\r\n // Node already there. Make syncContext become an instance of PersistedContext:\r\n node.syncContext = new PersistedContext(node.id, node.syncContext);\r\n node.syncProtocol = protocolName; // In case it was changed (would be very strange but...) could happen...\r\n node.syncOptions = options; // Options could have been changed\r\n db._syncNodes.put(node);\r\n }\r\n else {\r\n // Create new node and sync everything\r\n node = new db.observable.SyncNode();\r\n node.myRevision = -1;\r\n node.appliedRemoteRevision = null;\r\n node.remoteBaseRevisions = [];\r\n node.type = \"remote\";\r\n node.syncProtocol = protocolName;\r\n node.url = url;\r\n node.syncOptions = options;\r\n node.lastHeartBeat = Date.now();\r\n node.dbUploadState = null;\r\n var PersistedContext_1 = initPersistedContext(node);\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Promise.resolve(function () {\r\n // If options.initialUpload is explicitely false, set myRevision to currentRevision.\r\n if (options.initialUpload === false)\r\n return db._changes.toCollection().lastKey(function (currentRevision) {\r\n node.myRevision = currentRevision;\r\n });\r\n }()).then(function () {\r\n db._syncNodes.add(node).then(function (nodeID) {\r\n node.syncContext = new PersistedContext_1(nodeID); // Update syncContext in db with correct nodeId.\r\n db._syncNodes.put(node);\r\n });\r\n });\r\n }\r\n return node; // returning node will make the db.transaction()-promise resolve with this value.\r\n });\r\n });\r\n };\r\n}\n\nfunction initEnqueue(db) {\r\n return function enqueue(context, fn, instanceID) {\r\n function _enqueue() {\r\n if (!context.ongoingOperation) {\r\n context.ongoingOperation = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].ignoreTransaction(function () {\r\n return __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].vip(function () {\r\n return fn();\r\n });\r\n }).finally(function () {\r\n delete context.ongoingOperation;\r\n });\r\n }\r\n else {\r\n context.ongoingOperation = context.ongoingOperation.then(function () {\r\n return enqueue(context, fn, instanceID);\r\n });\r\n }\r\n return context.ongoingOperation;\r\n }\r\n if (!instanceID) {\r\n // Caller wants to enqueue it until database becomes open.\r\n if (db.isOpen()) {\r\n return _enqueue();\r\n }\r\n else {\r\n return __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Promise.reject(new __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].DatabaseClosedError());\r\n }\r\n }\r\n else if (db._localSyncNode && instanceID === db._localSyncNode.id) {\r\n // DB is already open but queue doesn't want it to be queued if database has been closed (request bound to current instance of DB)\r\n return _enqueue();\r\n }\r\n else {\r\n return __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Promise.reject(new __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].DatabaseClosedError());\r\n }\r\n };\r\n}\n\nfunction initSaveToUncommittedChanges(db, node) {\r\n return function saveToUncommittedChanges(changes, remoteRevision) {\r\n return db.transaction('rw!', db._uncommittedChanges, function () {\r\n return db._uncommittedChanges.bulkAdd(changes.map(function (change) {\r\n var changeWithNodeId = {\r\n node: node.id,\r\n type: change.type,\r\n table: change.table,\r\n key: change.key\r\n };\r\n if (change.obj)\r\n changeWithNodeId.obj = change.obj;\r\n if (change.mods)\r\n changeWithNodeId.mods = change.mods;\r\n return changeWithNodeId;\r\n }));\r\n }).then(function () {\r\n node.appliedRemoteRevision = remoteRevision;\r\n return node.save();\r\n });\r\n };\r\n}\n\n// Change Types\r\n// Change Types\r\nvar CREATE = 1;\r\nvar UPDATE = 2;\r\nvar DELETE = 3;\n\nfunction bulkUpdate(table, changes) {\r\n var keys = changes.map(function (c) { return c.key; });\r\n var map = {};\r\n // Retrieve current object of each change to update and map each\r\n // found object's primary key to the existing object:\r\n return table.where(':id').anyOf(keys).raw().each(function (obj, cursor) {\r\n map[cursor.primaryKey + ''] = obj;\r\n }).then(function () {\r\n // Filter away changes whose key wasn't found in the local database\r\n // (we can't update them if we do not know the existing values)\r\n var updatesThatApply = changes.filter(function (c) { return map.hasOwnProperty(c.key + ''); });\r\n // Apply modifications onto each existing object (in memory)\r\n // and generate array of resulting objects to put using bulkPut():\r\n var objsToPut = updatesThatApply.map(function (c) {\r\n var curr = map[c.key + ''];\r\n Object.keys(c.mods).forEach(function (keyPath) {\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].setByKeyPath(curr, keyPath, c.mods[keyPath]);\r\n });\r\n return curr;\r\n });\r\n return table.bulkPut(objsToPut);\r\n });\r\n}\n\nfunction initApplyChanges(db) {\r\n return function applyChanges(changes) {\r\n var collectedChanges = {};\r\n changes.forEach(function (change) {\r\n if (!collectedChanges.hasOwnProperty(change.table)) {\r\n collectedChanges[change.table] = (_a = {}, _a[CREATE] = [], _a[DELETE] = [], _a[UPDATE] = [], _a);\r\n }\r\n collectedChanges[change.table][change.type].push(change);\r\n var _a;\r\n });\r\n var table_names = Object.keys(collectedChanges);\r\n var tables = table_names.map(function (table) { return db.table(table); });\r\n return db.transaction(\"rw\", tables, function () {\r\n table_names.forEach(function (table_name) {\r\n var table = db.table(table_name);\r\n var specifyKeys = !table.schema.primKey.keyPath;\r\n var createChangesToApply = collectedChanges[table_name][CREATE];\r\n var deleteChangesToApply = collectedChanges[table_name][DELETE];\r\n var updateChangesToApply = collectedChanges[table_name][UPDATE];\r\n if (createChangesToApply.length > 0)\r\n table.bulkPut(createChangesToApply.map(function (c) { return c.obj; }), specifyKeys ?\r\n createChangesToApply.map(function (c) { return c.key; }) : undefined);\r\n if (updateChangesToApply.length > 0)\r\n bulkUpdate(table, updateChangesToApply);\r\n if (deleteChangesToApply.length > 0)\r\n table.bulkDelete(deleteChangesToApply.map(function (c) { return c.key; }));\r\n });\r\n });\r\n };\r\n}\n\nfunction initFinallyCommitAllChanges(db, node) {\r\n var applyChanges = initApplyChanges(db);\r\n return function finallyCommitAllChanges(changes, remoteRevision) {\r\n // 1. Open a write transaction on all tables in DB\r\n var tablesToIncludeInTrans = db.tables.filter(function (table) { return table.name === '_changes' ||\r\n table.name === '_uncommittedChanges' ||\r\n table.schema.observable; });\r\n return db.transaction('rw!', tablesToIncludeInTrans, function () {\r\n var trans = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].currentTransaction;\r\n var localRevisionBeforeChanges = 0;\r\n return db._changes.orderBy('rev').last(function (lastChange) {\r\n // Store what revision we were at before committing the changes\r\n localRevisionBeforeChanges = (lastChange && lastChange.rev) || 0;\r\n }).then(function () {\r\n // Specify the source. Important for the change consumer to ignore changes originated from self!\r\n trans.source = node.id;\r\n // 2. Apply uncommitted changes and delete each uncommitted change\r\n return db._uncommittedChanges.where('node').equals(node.id).toArray();\r\n }).then(function (uncommittedChanges) {\r\n return applyChanges(uncommittedChanges);\r\n }).then(function () {\r\n return db._uncommittedChanges.where('node').equals(node.id).delete();\r\n }).then(function () {\r\n // 3. Apply last chunk of changes\r\n return applyChanges(changes);\r\n }).then(function () {\r\n // Get what revision we are at now:\r\n return db._changes.orderBy('rev').last();\r\n }).then(function (lastChange) {\r\n var currentLocalRevision = (lastChange && lastChange.rev) || 0;\r\n // 4. Update node states (appliedRemoteRevision, remoteBaseRevisions and eventually myRevision)\r\n node.appliedRemoteRevision = remoteRevision;\r\n node.remoteBaseRevisions.push({ remote: remoteRevision, local: currentLocalRevision });\r\n if (node.myRevision === localRevisionBeforeChanges) {\r\n // If server was up-to-date before we added new changes from the server, update myRevision to last change\r\n // because server is still up-to-date! This is also important in order to prohibit getLocalChangesForNode() from\r\n // ever sending an empty change list to server, which would otherwise be done every second time it would send changes.\r\n node.myRevision = currentLocalRevision;\r\n }\r\n // Garbage collect remoteBaseRevisions not in use anymore:\r\n if (node.remoteBaseRevisions.length > 1) {\r\n for (var i = node.remoteBaseRevisions.length - 1; i > 0; --i) {\r\n if (node.myRevision >= node.remoteBaseRevisions[i].local) {\r\n node.remoteBaseRevisions.splice(0, i);\r\n break;\r\n }\r\n }\r\n }\r\n // We are not including _syncNodes in transaction, so this save() call will execute in its own transaction.\r\n node.save().catch(function (err) {\r\n console.warn(\"Dexie.Syncable: Unable to save SyncNode after applying remote changes: \" + (err.stack || err));\r\n });\r\n });\r\n });\r\n };\r\n}\n\nfunction getBaseRevisionAndMaxClientRevision(node) {\r\n /// \r\n if (node.remoteBaseRevisions.length === 0)\r\n return {\r\n // No remoteBaseRevisions have arrived yet. No limit on clientRevision and provide null as remoteBaseRevision:\r\n maxClientRevision: Infinity,\r\n remoteBaseRevision: null\r\n };\r\n for (var i = node.remoteBaseRevisions.length - 1; i >= 0; --i) {\r\n if (node.myRevision >= node.remoteBaseRevisions[i].local) {\r\n // Found a remoteBaseRevision that fits node.myRevision. Return remoteBaseRevision and eventually a roof maxClientRevision pointing out where next remoteBaseRevision bases its changes on.\r\n return {\r\n maxClientRevision: i === node.remoteBaseRevisions.length - 1 ? Infinity : node.remoteBaseRevisions[i + 1].local,\r\n remoteBaseRevision: node.remoteBaseRevisions[i].remote\r\n };\r\n }\r\n }\r\n // There are at least one item in the list but the server hasn't yet become up-to-date with the 0 revision from client.\r\n return {\r\n maxClientRevision: node.remoteBaseRevisions[0].local,\r\n remoteBaseRevision: null\r\n };\r\n}\n\nfunction combineCreateAndUpdate(prevChange, nextChange) {\r\n var clonedChange = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].deepClone(prevChange); // Clone object before modifying since the earlier change in db.changes[] would otherwise be altered.\r\n Object.keys(nextChange.mods).forEach(function (keyPath) {\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].setByKeyPath(clonedChange.obj, keyPath, nextChange.mods[keyPath]);\r\n });\r\n return clonedChange;\r\n}\n\nfunction combineUpdateAndUpdate(prevChange, nextChange) {\r\n var clonedChange = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].deepClone(prevChange); // Clone object before modifying since the earlier change in db.changes[] would otherwise be altered.\r\n Object.keys(nextChange.mods).forEach(function (keyPath) {\r\n // If prev-change was changing a parent path of this keyPath, we must update the parent path rather than adding this keyPath\r\n var hadParentPath = false;\r\n Object.keys(prevChange.mods).filter(function (parentPath) { return keyPath.indexOf(parentPath + '.') === 0; }).forEach(function (parentPath) {\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].setByKeyPath(clonedChange.mods[parentPath], keyPath.substr(parentPath.length + 1), nextChange.mods[keyPath]);\r\n hadParentPath = true;\r\n });\r\n if (!hadParentPath) {\r\n // Add or replace this keyPath and its new value\r\n clonedChange.mods[keyPath] = nextChange.mods[keyPath];\r\n }\r\n // In case prevChange contained sub-paths to the new keyPath, we must make sure that those sub-paths are removed since\r\n // we must mimic what would happen if applying the two changes after each other:\r\n Object.keys(prevChange.mods).filter(function (subPath) { return subPath.indexOf(keyPath + '.') === 0; }).forEach(function (subPath) {\r\n delete clonedChange.mods[subPath];\r\n });\r\n });\r\n return clonedChange;\r\n}\n\nfunction mergeChange(prevChange, nextChange) {\r\n switch (prevChange.type) {\r\n case CREATE:\r\n switch (nextChange.type) {\r\n case CREATE:\r\n return nextChange; // Another CREATE replaces previous CREATE.\r\n case UPDATE:\r\n return combineCreateAndUpdate(prevChange, nextChange); // Apply nextChange.mods into prevChange.obj\r\n case DELETE:\r\n return nextChange; // Object created and then deleted. If it wasnt for that we MUST handle resent changes, we would skip entire change here. But what if the CREATE was sent earlier, and then CREATE/DELETE at later stage? It would become a ghost object in DB. Therefore, we MUST keep the delete change! If object doesnt exist, it wont harm!\r\n }\r\n break;\r\n case UPDATE:\r\n switch (nextChange.type) {\r\n case CREATE:\r\n return nextChange; // Another CREATE replaces previous update.\r\n case UPDATE:\r\n return combineUpdateAndUpdate(prevChange, nextChange); // Add the additional modifications to existing modification set.\r\n case DELETE:\r\n return nextChange; // Only send the delete change. What was updated earlier is no longer of interest.\r\n }\r\n break;\r\n case DELETE:\r\n switch (nextChange.type) {\r\n case CREATE:\r\n return nextChange; // A resurection occurred. Only create change is of interest.\r\n case UPDATE:\r\n return prevChange; // Nothing to do. We cannot update an object that doesnt exist. Leave the delete change there.\r\n case DELETE:\r\n return prevChange; // Still a delete change. Leave as is.\r\n }\r\n break;\r\n }\r\n}\n\nfunction initGetChangesSinceRevision(db, node, hasMoreToGive) {\r\n return function getChangesSinceRevision(revision, maxChanges, maxRevision, cb) {\r\n /// Callback that will retrieve next chunk of changes and a boolean telling if it's a partial result or not. If truthy, result is partial and there are more changes to come. If falsy, these changes are the final result.\r\n var changeSet = {};\r\n var numChanges = 0;\r\n var partial = false;\r\n var ignoreSource = node.id;\r\n var nextRevision = revision;\r\n return db.transaction('r', db._changes, function () {\r\n var query = db._changes.where('rev').between(revision, maxRevision, false, true);\r\n return query.until(function () {\r\n if (numChanges === maxChanges) {\r\n partial = true;\r\n return true;\r\n }\r\n }).each(function (change) {\r\n // Note the revision in nextRevision:\r\n nextRevision = change.rev;\r\n // change.source is set based on currentTransaction.source\r\n if (change.source === ignoreSource)\r\n return;\r\n // Our _changes table contains more info than required (old objs, source etc). Just make sure to include the necessary info:\r\n var changeToSend = {\r\n type: change.type,\r\n table: change.table,\r\n key: change.key\r\n };\r\n if (change.type === CREATE)\r\n changeToSend.obj = change.obj;\r\n else if (change.type === UPDATE)\r\n changeToSend.mods = change.mods;\r\n var id = change.table + \":\" + change.key;\r\n var prevChange = changeSet[id];\r\n if (!prevChange) {\r\n // This is the first change on this key. Add it unless it comes from the source that we are working against\r\n changeSet[id] = changeToSend;\r\n ++numChanges;\r\n }\r\n else {\r\n // Merge the oldchange with the new change\r\n var nextChange = changeToSend;\r\n var mergedChange = mergeChange(prevChange, nextChange);\r\n changeSet[id] = mergedChange;\r\n }\r\n });\r\n }).then(function () {\r\n var changes = Object.keys(changeSet).map(function (key) {\r\n return changeSet[key];\r\n });\r\n hasMoreToGive.hasMoreToGive = partial;\r\n return cb(changes, partial, { myRevision: nextRevision });\r\n });\r\n };\r\n}\n\nfunction initGetTableObjectsAsChanges(db, node, MAX_CHANGES_PER_CHUNK, getChangesSinceRevision, hasMoreToGive, cb) {\r\n return function getTableObjectsAsChanges(state, changes, collection) {\r\n /// \r\n /// \r\n /// \r\n var limitReached = false;\r\n return collection.until(function () {\r\n if (changes.length === MAX_CHANGES_PER_CHUNK) {\r\n limitReached = true;\r\n return true;\r\n }\r\n }).each(function (item, cursor) {\r\n changes.push({\r\n type: CREATE,\r\n table: state.currentTable,\r\n key: cursor.key,\r\n obj: cursor.value\r\n });\r\n state.currentKey = cursor.key;\r\n }).then(function () {\r\n if (limitReached) {\r\n // Limit reached. Send partial result.\r\n hasMoreToGive.hasMoreToGive = true;\r\n return cb(changes, null, true, { dbUploadState: state });\r\n }\r\n else {\r\n // Done iterating this table. Check if there are more tables to go through:\r\n if (state.tablesToUpload.length === 0) {\r\n // Done iterating all tables\r\n // Now append changes occurred during our dbUpload:\r\n var brmcr = getBaseRevisionAndMaxClientRevision(node);\r\n return getChangesSinceRevision(state.localBaseRevision, MAX_CHANGES_PER_CHUNK - changes.length, brmcr.maxClientRevision, function (additionalChanges, partial, nodeModificationsOnAck) {\r\n changes = changes.concat(additionalChanges);\r\n nodeModificationsOnAck.dbUploadState = null;\r\n return cb(changes, brmcr.remoteBaseRevision, partial, nodeModificationsOnAck);\r\n });\r\n }\r\n else {\r\n // Not done iterating all tables. Continue on next table:\r\n state.currentTable = state.tablesToUpload.shift();\r\n return getTableObjectsAsChanges(state, changes, db.table(state.currentTable).orderBy(':id'));\r\n }\r\n }\r\n });\r\n };\r\n}\n\nfunction initGetLocalChangesForNode(db, hasMoreToGive, partialsThreshold) {\r\n var MAX_CHANGES_PER_CHUNK = partialsThreshold;\r\n return function getLocalChangesForNode(node, cb) {\r\n /// \r\n /// Based on given node's current revision and state, this function makes sure to retrieve next chunk of changes\r\n /// for that node.\r\n /// \r\n /// \r\n /// Callback that will retrieve next chunk of changes and a boolean telling if it's a partial result or not. If truthy, result is partial and there are more changes to come. If falsy, these changes are the final result.\r\n var getChangesSinceRevision = initGetChangesSinceRevision(db, node, hasMoreToGive);\r\n var getTableObjectsAsChanges = initGetTableObjectsAsChanges(db, node, MAX_CHANGES_PER_CHUNK, getChangesSinceRevision, hasMoreToGive, cb);\r\n // Only a \"remote\" SyncNode created by Dexie.Syncable\r\n // could not pass this test (remote nodes have myRevision: -1 on instantiation)\r\n if (node.myRevision >= 0) {\r\n // Node is based on a revision in our local database and will just need to get the changes that have occurred since that revision.\r\n var brmcr = getBaseRevisionAndMaxClientRevision(node);\r\n return getChangesSinceRevision(node.myRevision, MAX_CHANGES_PER_CHUNK, brmcr.maxClientRevision, function (changes, partial, nodeModificationsOnAck) {\r\n return cb(changes, brmcr.remoteBaseRevision, partial, nodeModificationsOnAck);\r\n });\r\n }\r\n else {\r\n // Node hasn't got anything from our local database yet. We will need to upload the entire DB to the node in the form of CREATE changes.\r\n // Check if we're in the middle of already doing that:\r\n if (node.dbUploadState === null) {\r\n // Initialize dbUploadState\r\n var tablesToUpload = db.tables.filter(function (table) {\r\n return table.schema.observable;\r\n }).map(function (table) {\r\n return table.name;\r\n });\r\n if (tablesToUpload.length === 0)\r\n return __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Promise.resolve(cb([], null, false, {})); // There are no synced tables at all.\r\n var dbUploadState = {\r\n tablesToUpload: tablesToUpload,\r\n currentTable: tablesToUpload.shift(),\r\n currentKey: null\r\n };\r\n return db._changes.orderBy('rev').last(function (lastChange) {\r\n dbUploadState.localBaseRevision = (lastChange && lastChange.rev) || 0;\r\n var collection = db.table(dbUploadState.currentTable).orderBy(':id');\r\n return getTableObjectsAsChanges(dbUploadState, [], collection);\r\n });\r\n }\r\n else if (node.dbUploadState.currentKey) {\r\n var collection = db.table(node.dbUploadState.currentTable).where(':id').above(node.dbUploadState.currentKey);\r\n return getTableObjectsAsChanges(__WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].deepClone(node.dbUploadState), [], collection);\r\n }\r\n else {\r\n var collection = db.table(dbUploadState.currentTable).orderBy(':id');\r\n return getTableObjectsAsChanges(__WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].deepClone(node.dbUploadState), [], collection);\r\n }\r\n }\r\n };\r\n}\n\nvar Statuses = {\r\n ERROR: -1,\r\n OFFLINE: 0,\r\n CONNECTING: 1,\r\n ONLINE: 2,\r\n SYNCING: 3,\r\n ERROR_WILL_RETRY: 4 // An error occurred such as net down but the sync provider will retry to connect.\r\n};\r\nvar StatusTexts = {\r\n \"-1\": \"ERROR\",\r\n \"0\": \"OFFLINE\",\r\n \"1\": \"CONNECTING\",\r\n \"2\": \"ONLINE\",\r\n \"3\": \"SYNCING\",\r\n \"4\": \"ERROR_WILL_RETRY\"\r\n};\n\nvar Promise$2 = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Promise;\r\nfunction initConnectProtocol(db, protocolInstance, dbAliveID, options, rejectConnectPromise) {\r\n var enqueue = initEnqueue(db);\r\n var hasMoreToGive = { hasMoreToGive: true };\r\n function stillAlive() {\r\n // A better method than doing db.isOpen() because the same db instance may have been reopened, but then this sync call should be dead\r\n // because the new instance should be considered a fresh instance and will have another local node.\r\n return db._localSyncNode && db._localSyncNode.id === dbAliveID;\r\n }\r\n return function connectProtocol(node, activePeer) {\r\n /// \r\n var getLocalChangesForNode = initGetLocalChangesForNode(db, hasMoreToGive, protocolInstance.partialsThreshold);\r\n var url = activePeer.url;\r\n function changeStatusTo(newStatus) {\r\n if (node.status !== newStatus) {\r\n node.status = newStatus;\r\n node.save().then(function () {\r\n db.syncable.on.statusChanged.fire(newStatus, url);\r\n // Also broadcast message to other nodes about the status\r\n db.observable.broadcastMessage(\"syncStatusChanged\", { newStatus: newStatus, url: url }, false);\r\n }).catch('DatabaseClosedError', function () {\r\n });\r\n }\r\n }\r\n activePeer.on('disconnect', function (newStatus) {\r\n if (!isNaN(newStatus))\r\n changeStatusTo(newStatus);\r\n });\r\n var connectedContinuation;\r\n changeStatusTo(Statuses.CONNECTING);\r\n return doSync();\r\n function doSync() {\r\n // Use enqueue() to ensure only a single promise execution at a time.\r\n return enqueue(doSync, function () {\r\n // By returning the Promise returned by getLocalChangesForNode() a final catch() on the sync() method will also catch error occurring in entire sequence.\r\n return getLocalChangesForNode_autoAckIfEmpty(node, sendChangesToProvider);\r\n }, dbAliveID);\r\n }\r\n function sendChangesToProvider(changes, remoteBaseRevision, partial, nodeModificationsOnAck) {\r\n // Create a final Promise for the entire sync() operation that will resolve when provider calls onSuccess().\r\n // By creating finalPromise before calling protocolInstance.sync() it is possible for provider to call onError() immediately if it wants.\r\n var finalSyncPromise = new Promise$2(function (resolve, reject) {\r\n rejectConnectPromise.p = function (err) {\r\n reject(err);\r\n };\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].asap(function () {\r\n try {\r\n protocolInstance.sync(node.syncContext, url, options, remoteBaseRevision, node.appliedRemoteRevision, changes, partial, applyRemoteChanges, onChangesAccepted, function (continuation) {\r\n resolve(continuation);\r\n }, onError);\r\n }\r\n catch (ex) {\r\n onError(ex, Infinity);\r\n }\r\n function onError(error, again) {\r\n reject(error);\r\n if (stillAlive()) {\r\n if (!isNaN(again) && again < Infinity) {\r\n setTimeout(function () {\r\n if (stillAlive()) {\r\n changeStatusTo(Statuses.SYNCING);\r\n doSync().catch('DatabaseClosedError', abortTheProvider);\r\n }\r\n }, again);\r\n changeStatusTo(Statuses.ERROR_WILL_RETRY, error);\r\n if (connectedContinuation && connectedContinuation.disconnect)\r\n connectedContinuation.disconnect();\r\n connectedContinuation = null;\r\n }\r\n else {\r\n abortTheProvider(error); // Will fire ERROR on statusChanged event.\r\n }\r\n }\r\n }\r\n });\r\n });\r\n return finalSyncPromise.then(function () {\r\n // Resolve caller of db.syncable.connect() with undefined. Not with continuation!\r\n return undefined;\r\n }).finally(function () {\r\n // In case error happens after connect, don't try reject the connect promise anymore.\r\n // This is important. A Dexie unit test that verifies unhandled rejections will fail when Dexie.Syncable addon\r\n // is active and this happens. It would fire unhandledrejection but that we do not want.\r\n rejectConnectPromise.p = null;\r\n });\r\n function onChangesAccepted() {\r\n Object.keys(nodeModificationsOnAck).forEach(function (keyPath) {\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].setByKeyPath(node, keyPath, nodeModificationsOnAck[keyPath]);\r\n });\r\n // We dont know if onSuccess() was called by provider yet. If it's already called, finalPromise.then() will execute immediately,\r\n // otherwise it will execute when finalSyncPromise resolves.\r\n finalSyncPromise.then(continueSendingChanges);\r\n return node.save();\r\n }\r\n }\r\n function abortTheProvider(error) {\r\n activePeer.disconnect(Statuses.ERROR, error);\r\n }\r\n function getLocalChangesForNode_autoAckIfEmpty(node, cb) {\r\n return getLocalChangesForNode(node, function autoAck(changes, remoteBaseRevision, partial, nodeModificationsOnAck) {\r\n if (changes.length === 0 && 'myRevision' in nodeModificationsOnAck && nodeModificationsOnAck.myRevision !== node.myRevision) {\r\n Object.keys(nodeModificationsOnAck).forEach(function (keyPath) {\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].setByKeyPath(node, keyPath, nodeModificationsOnAck[keyPath]);\r\n });\r\n node.save().catch('DatabaseClosedError', function () {\r\n });\r\n return getLocalChangesForNode(node, autoAck);\r\n }\r\n else {\r\n return cb(changes, remoteBaseRevision, partial, nodeModificationsOnAck);\r\n }\r\n });\r\n }\r\n function applyRemoteChanges(remoteChanges, remoteRevision, partial /*, clear*/) {\r\n var saveToUncommittedChanges = initSaveToUncommittedChanges(db, node);\r\n var finallyCommitAllChanges = initFinallyCommitAllChanges(db, node);\r\n return enqueue(applyRemoteChanges, function () {\r\n if (!stillAlive())\r\n return Promise$2.reject(new __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].DatabaseClosedError());\r\n // FIXTHIS: Check what to do if clear() is true!\r\n return (partial ? saveToUncommittedChanges(remoteChanges, remoteRevision) : finallyCommitAllChanges(remoteChanges, remoteRevision))\r\n .catch(function (error) {\r\n abortTheProvider(error);\r\n return Promise$2.reject(error);\r\n });\r\n }, dbAliveID);\r\n }\r\n //\r\n //\r\n // Continuation Patterns Follows\r\n //\r\n //\r\n function continueSendingChanges(continuation) {\r\n if (!stillAlive()) {\r\n if (continuation.disconnect)\r\n continuation.disconnect();\r\n return;\r\n }\r\n connectedContinuation = continuation;\r\n activePeer.on('disconnect', function () {\r\n if (connectedContinuation) {\r\n if (connectedContinuation.react) {\r\n try {\r\n // react pattern must provide a disconnect function.\r\n connectedContinuation.disconnect();\r\n }\r\n catch (e) {\r\n }\r\n }\r\n connectedContinuation = null; // Stop poll() pattern from polling again and abortTheProvider() from being called twice.\r\n }\r\n });\r\n if (continuation.react) {\r\n continueUsingReactPattern(continuation);\r\n }\r\n else {\r\n continueUsingPollPattern(continuation);\r\n }\r\n }\r\n // React Pattern (eager)\r\n function continueUsingReactPattern(continuation) {\r\n var changesWaiting, // Boolean\r\n isWaitingForServer; // Boolean\r\n function onChanges() {\r\n if (connectedContinuation) {\r\n changeStatusTo(Statuses.SYNCING);\r\n if (isWaitingForServer)\r\n changesWaiting = true;\r\n else {\r\n reactToChanges();\r\n }\r\n }\r\n }\r\n db.on('changes', onChanges);\r\n activePeer.on('disconnect', function () {\r\n db.on.changes.unsubscribe(onChanges);\r\n });\r\n function reactToChanges() {\r\n if (!connectedContinuation)\r\n return;\r\n changesWaiting = false;\r\n isWaitingForServer = true;\r\n getLocalChangesForNode_autoAckIfEmpty(node, function (changes, remoteBaseRevision, partial, nodeModificationsOnAck) {\r\n if (!connectedContinuation)\r\n return;\r\n if (changes.length > 0) {\r\n continuation.react(changes, remoteBaseRevision, partial, function onChangesAccepted() {\r\n Object.keys(nodeModificationsOnAck).forEach(function (keyPath) {\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].setByKeyPath(node, keyPath, nodeModificationsOnAck[keyPath]);\r\n });\r\n node.save().catch('DatabaseClosedError', function () {\r\n });\r\n // More changes may be waiting:\r\n reactToChanges();\r\n });\r\n }\r\n else {\r\n isWaitingForServer = false;\r\n if (changesWaiting) {\r\n // A change jumped in between the time-spot of quering _changes and getting called back with zero changes.\r\n // This is an expreemely rare scenario, and eventually impossible. But need to be here because it could happen in theory.\r\n reactToChanges();\r\n }\r\n else {\r\n changeStatusTo(Statuses.ONLINE);\r\n }\r\n }\r\n }).catch(function (ex) {\r\n console.error(\"Got \" + ex.message + \" caught by reactToChanges\");\r\n abortTheProvider(ex);\r\n });\r\n }\r\n reactToChanges();\r\n }\r\n // Poll Pattern\r\n function continueUsingPollPattern() {\r\n function syncAgain() {\r\n getLocalChangesForNode_autoAckIfEmpty(node, function (changes, remoteBaseRevision, partial, nodeModificationsOnAck) {\r\n protocolInstance.sync(node.syncContext, url, options, remoteBaseRevision, node.appliedRemoteRevision, changes, partial, applyRemoteChanges, onChangesAccepted, onSuccess, onError);\r\n function onChangesAccepted() {\r\n Object.keys(nodeModificationsOnAck).forEach(function (keyPath) {\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].setByKeyPath(node, keyPath, nodeModificationsOnAck[keyPath]);\r\n });\r\n node.save().catch('DatabaseClosedError', function () {\r\n });\r\n }\r\n function onSuccess(continuation) {\r\n if (!connectedContinuation) {\r\n // Got disconnected before succeeding. Quit.\r\n return;\r\n }\r\n connectedContinuation = continuation;\r\n if (partial) {\r\n // We only sent partial changes. Need to do another round asap.\r\n syncAgain();\r\n }\r\n else {\r\n // We've sent all changes now (in sync!)\r\n if (!isNaN(continuation.again) && continuation.again < Infinity) {\r\n // Provider wants to keep polling. Set Status to ONLINE.\r\n changeStatusTo(Statuses.ONLINE);\r\n setTimeout(function () {\r\n if (connectedContinuation) {\r\n changeStatusTo(Statuses.SYNCING);\r\n syncAgain();\r\n }\r\n }, continuation.again);\r\n }\r\n else {\r\n // Provider seems finished polling. Since we are never going to poll again,\r\n // disconnect provider and set status to OFFLINE until another call to db.syncable.connect().\r\n activePeer.disconnect(Statuses.OFFLINE);\r\n }\r\n }\r\n }\r\n function onError(error, again) {\r\n if (!isNaN(again) && again < Infinity) {\r\n if (connectedContinuation) {\r\n setTimeout(function () {\r\n if (connectedContinuation) {\r\n changeStatusTo(Statuses.SYNCING);\r\n syncAgain();\r\n }\r\n }, again);\r\n changeStatusTo(Statuses.ERROR_WILL_RETRY);\r\n } // else status is already changed since we got disconnected.\r\n }\r\n else {\r\n abortTheProvider(error); // Will fire ERROR on onStatusChanged.\r\n }\r\n }\r\n }).catch(abortTheProvider);\r\n }\r\n if (hasMoreToGive.hasMoreToGive) {\r\n syncAgain();\r\n }\r\n else if (connectedContinuation && !isNaN(connectedContinuation.again) && connectedContinuation.again < Infinity) {\r\n changeStatusTo(Statuses.ONLINE);\r\n setTimeout(function () {\r\n if (connectedContinuation) {\r\n changeStatusTo(Statuses.SYNCING);\r\n syncAgain();\r\n }\r\n }, connectedContinuation.again);\r\n }\r\n else {\r\n // Provider seems finished polling. Since we are never going to poll again,\r\n // disconnect provider and set status to OFFLINE until another call to db.syncable.connect().\r\n activePeer.disconnect(Statuses.OFFLINE);\r\n }\r\n }\r\n };\r\n}\n\nfunction initConnectFn(db, activePeers) {\r\n return function connect(protocolInstance, protocolName, url, options, dbAliveID) {\r\n /// \r\n var existingPeer = activePeers.filter(function (peer) {\r\n return peer.url === url;\r\n });\r\n if (existingPeer.length > 0) {\r\n var activePeer = existingPeer[0];\r\n var diffObject = {};\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].getObjectDiff(activePeer.syncOptions, options, diffObject);\r\n // Options have been changed\r\n // We need to disconnect and reconnect\r\n if (Object.keys(diffObject).length !== 0) {\r\n return db.syncable.disconnect(url)\r\n .then(function () {\r\n return execConnect();\r\n });\r\n }\r\n else {\r\n // Never create multiple syncNodes with same protocolName and url. Instead, let the next call to connect() return the same promise that\r\n // have already been started and eventually also resolved. If promise has already resolved (node connected), calling existing promise.then() will give a callback directly.\r\n return existingPeer[0].connectPromise;\r\n }\r\n }\r\n function execConnect() {\r\n // Use an object otherwise we wouldn't be able to get the reject promise from\r\n // connectProtocol\r\n var rejectConnectPromise = { p: null };\r\n var connectProtocol = initConnectProtocol(db, protocolInstance, dbAliveID, options, rejectConnectPromise);\r\n var getOrCreateSyncNode = initGetOrCreateSyncNode(db, protocolName, url);\r\n var connectPromise = getOrCreateSyncNode(options).then(function (node) {\r\n return connectProtocol(node, activePeer);\r\n });\r\n var disconnected = false;\r\n var activePeer = {\r\n url: url,\r\n status: Statuses.OFFLINE,\r\n connectPromise: connectPromise,\r\n syncOptions: options,\r\n on: __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Events(null, \"disconnect\"),\r\n disconnect: function (newStatus, error) {\r\n var pos = activePeers.indexOf(activePeer);\r\n if (pos >= 0)\r\n activePeers.splice(pos, 1);\r\n if (error && rejectConnectPromise.p)\r\n rejectConnectPromise.p(error);\r\n if (!disconnected) {\r\n activePeer.on.disconnect.fire(newStatus, error);\r\n }\r\n disconnected = true;\r\n }\r\n };\r\n activePeers.push(activePeer);\r\n return connectPromise;\r\n }\r\n return execConnect();\r\n };\r\n}\n\n/* ==========================================================================\r\n * dexie-syncable.js\r\n * ==========================================================================\r\n *\r\n * Dexie addon for syncing indexedDB with remote endpoints.\r\n *\r\n * By David Fahlander, david.fahlander@gmail.com,\r\n * Nikolas Poniros, https://github.com/nponiros\r\n *\r\n * ==========================================================================\r\n *\r\n * Version {version}, {date}\r\n *\r\n * http://dexie.org\r\n *\r\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/\r\n *\r\n */\r\n// Depend on 'dexie-observable'\r\n// To support both ES6,AMD,CJS and UMD (plain script), we just import it and then access it as \"Dexie.Observable\".\r\n// That way, our plugin works in all UMD cases.\r\n// If target platform would only be module based (ES6/AMD/CJS), we could have done 'import Observable from \"dexie-observable\"'.\r\nvar override = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].override;\nvar Promise = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Promise;\nvar Observable = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Observable;\r\nfunction Syncable(db) {\r\n /// \r\n var activePeers = [];\r\n var connectFn = initConnectFn(db, activePeers);\r\n var syncableConnect = initSyncableConnect(db, connectFn);\r\n db.on('message', function (msg) {\r\n // Message from other local node arrives...\r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].vip(function () {\r\n if (msg.type === 'connect') {\r\n // We are master node and another non-master node wants us to do the connect.\r\n db.syncable.connect(msg.message.protocolName, msg.message.url, msg.message.options).then(msg.resolve, msg.reject);\r\n }\r\n else if (msg.type === 'disconnect') {\r\n db.syncable.disconnect(msg.message.url).then(msg.resolve, msg.reject);\r\n }\r\n else if (msg.type === 'syncStatusChanged') {\r\n // We are client and a master node informs us about syncStatus change.\r\n // Lookup the connectedProvider and call its event\r\n db.syncable.on.statusChanged.fire(msg.message.newStatus, msg.message.url);\r\n }\r\n });\r\n });\r\n db.on('cleanup', function (weBecameMaster) {\r\n // A cleanup (done in Dexie.Observable) may result in that a master node is removed and we become master.\r\n if (weBecameMaster) {\r\n // We took over the master role in Observable's cleanup method.\r\n // We should connect to remote servers now.\r\n // At this point, also reconnect servers with status ERROR_WILL_RETRY as well as plain ERROR.\r\n // Reason to reconnect to those with plain \"ERROR\" is that the ERROR state may occur when a database\r\n // connection has been closed. The new master would then be expected to reconnect.\r\n // Also, this is not an infinite poll(). This is rare event that a new browser tab takes over from\r\n // an old closed one. \r\n __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].ignoreTransaction(function () { return __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].vip(function () {\r\n return db._syncNodes.where({ type: 'remote' })\r\n .filter(function (node) { return node.status !== Statuses.OFFLINE; })\r\n .toArray(function (connectedRemoteNodes) { return Promise.all(connectedRemoteNodes.map(function (node) {\r\n return db.syncable.connect(node.syncProtocol, node.url, node.syncOptions).catch(function (e) {\r\n console.warn(\"Dexie.Syncable: Could not connect to \" + node.url + \". \" + (e.stack || e));\r\n });\r\n })); });\r\n }); }).catch('DatabaseClosedError', function () { });\r\n }\r\n });\r\n // \"ready\" subscriber for the master node that makes sure it will always connect to sync server\r\n // when the database opens. It will not wait for the connection to complete, just initiate the\r\n // connection so that it will continue syncing as long as the database is open.\r\n // Dexie.Observable's 'ready' subscriber will have been invoked prior to this, making sure\r\n // that db._localSyncNode exists and persisted before this subscriber kicks in.\r\n db.on('ready', function onReady() {\r\n // Again, in onReady: If we ARE master, make sure to connect to remote servers that is in a connected state.\r\n if (db._localSyncNode && db._localSyncNode.isMaster) {\r\n // Make sure to connect to remote servers that is in a connected state (NOT OFFLINE or ERROR!)\r\n // This \"ready\" subscriber will never be the one performing the initial sync request, because\r\n // even after calling db.syncable.connect(), there won't exist any \"remote\" sync node yet.\r\n // Instead, db.syncable.connect() will subscribe to \"ready\" also, and that subscriber will be\r\n // called after this one. There, in that subscriber, the initial sync request will take place\r\n // and the \"remote\" node will be created so that this \"ready\" subscriber can auto-connect the\r\n // next time this database is opened.\r\n // CONCLUSION: We can always assume that the local DB has been in sync with the server at least\r\n // once in the past for each \"connectedRemoteNode\" we find in query below.\r\n // Don't halt db.ready while connecting (i.e. we do not return a promise here!)\r\n db._syncNodes\r\n .where('type').equals('remote')\r\n .and(function (node) { return node.status !== Statuses.OFFLINE; })\r\n .toArray(function (connectedRemoteNodes) {\r\n // There are connected remote nodes that we must manage (or take over to manage)\r\n connectedRemoteNodes.forEach(function (node) { return db.syncable.connect(node.syncProtocol, node.url, node.syncOptions)\r\n .catch(function () { }); } // A failure will be triggered in on('statusChanged'). We can ignore.\r\n );\r\n }).catch('DatabaseClosedError', function () { });\r\n }\r\n }, true); // True means the ready event will survive a db reopen - db.close()/db.open()\r\n db.syncable = {};\r\n db.syncable.getStatus = function (url, cb) {\r\n if (db.isOpen()) {\r\n return __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].vip(function () {\r\n return db._syncNodes.where('url').equals(url).first(function (node) {\r\n return node ? node.status : Statuses.OFFLINE;\r\n });\r\n }).then(cb);\r\n }\r\n else {\r\n return Promise.resolve(Syncable.Statuses.OFFLINE).then(cb);\r\n }\r\n };\r\n db.syncable.getOptions = function (url, cb) {\r\n return db.transaction('r?', db._syncNodes, function () {\r\n return db._syncNodes.where('url').equals(url).first(function (node) {\r\n return node.syncOptions;\r\n }).then(cb);\r\n });\r\n };\r\n db.syncable.list = function () {\r\n return db.transaction('r?', db._syncNodes, function () {\r\n return db._syncNodes.where('type').equals('remote').toArray(function (a) {\r\n return a.map(function (node) { return node.url; });\r\n });\r\n });\r\n };\r\n db.syncable.on = __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Events(db, { statusChanged: \"asap\" });\r\n db.syncable.disconnect = function (url) {\r\n return __WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].ignoreTransaction(function () {\r\n return Promise.resolve().then(function () {\r\n if (db._localSyncNode && db._localSyncNode.isMaster) {\r\n return Promise.all(activePeers.filter(function (peer) { return peer.url === url; }).map(function (peer) {\r\n return peer.disconnect(Statuses.OFFLINE);\r\n }));\r\n }\r\n else {\r\n return db._syncNodes.where('isMaster').above(0).first(function (masterNode) {\r\n return db.observable.sendMessage('disconnect', { url: url }, masterNode.id, { wantReply: true });\r\n });\r\n }\r\n }).then(function () {\r\n return db._syncNodes.where(\"url\").equals(url).modify(function (node) {\r\n node.status = Statuses.OFFLINE;\r\n });\r\n });\r\n });\r\n };\r\n db.syncable.connect = function (protocolName, url, options) {\r\n options = options || {}; // Make sure options is always an object because 1) Provider expects it to be. 2) We'll be persisting it and you cannot persist undefined.\r\n var protocolInstance = Syncable.registeredProtocols[protocolName];\r\n if (protocolInstance) {\r\n return syncableConnect(protocolInstance, protocolName, url, options);\r\n }\r\n else {\r\n return Promise.reject(new Error(\"ISyncProtocol '\" + protocolName + \"' is not registered in Dexie.Syncable.registerSyncProtocol()\"));\r\n }\r\n };\r\n db.syncable.delete = function (url) {\r\n return db.syncable.disconnect(url).then(function () {\r\n return db.transaction('rw!', db._syncNodes, db._changes, db._uncommittedChanges, function () {\r\n // Find the node(s)\r\n // Several can be found, as detected by @martindiphoorn,\r\n // let's delete them and cleanup _uncommittedChanges and _changes \r\n // accordingly.\r\n var nodeIDsToDelete;\r\n return db._syncNodes\r\n .where(\"url\").equals(url)\r\n .toArray(function (nodes) { return nodes.map(function (node) { return node.id; }); })\r\n .then(function (nodeIDs) {\r\n nodeIDsToDelete = nodeIDs;\r\n // Delete the syncNode that represents the remote endpoint.\r\n return db._syncNodes.where('id').anyOf(nodeIDs).delete();\r\n })\r\n .then(function () {\r\n // In case there were uncommittedChanges belonging to this, delete them as well\r\n return db._uncommittedChanges.where('node').anyOf(nodeIDsToDelete).delete();\r\n });\r\n }).then(function () {\r\n // Spawn background job to delete old changes, now that a node has been deleted,\r\n // there might be changes in _changes table that is not needed to keep anymore.\r\n // This is done in its own transaction, or possible several transaction to prohibit\r\n // starvation\r\n Observable.deleteOldChanges(db);\r\n });\r\n });\r\n };\r\n db.syncable.unsyncedChanges = function (url) {\r\n return db._syncNodes.where(\"url\").equals(url).first(function (node) {\r\n return db._changes.where('rev').above(node.myRevision).toArray();\r\n });\r\n };\r\n db.close = override(db.close, function (origClose) {\r\n return function () {\r\n activePeers.forEach(function (peer) {\r\n peer.disconnect();\r\n });\r\n return origClose.apply(this, arguments);\r\n };\r\n });\r\n Object.defineProperty(db.observable.SyncNode.prototype, 'save', {\r\n enumerable: false,\r\n configurable: true,\r\n writable: true,\r\n value: function () {\r\n var _this = this;\r\n return db.transaction('rw?', db._syncNodes, function () {\r\n return db._syncNodes.put(_this);\r\n });\r\n }\r\n });\r\n}\r\nSyncable.Statuses = Statuses;\r\nSyncable.StatusTexts = StatusTexts;\r\nSyncable.registeredProtocols = {}; // Map when key is the provider name.\r\nSyncable.registerSyncProtocol = function (name, protocolInstance) {\r\n /// \r\n /// Register a synchronization protocol that can synchronize databases with remote servers.\r\n /// \r\n /// Provider name\r\n /// Implementation of ISyncProtocol\r\n var partialsThreshold = protocolInstance.partialsThreshold;\r\n if (typeof partialsThreshold === 'number') {\r\n // Don't allow NaN or negative threshold\r\n if (isNaN(partialsThreshold) || partialsThreshold < 0) {\r\n throw new Error('The given number for the threshold is not supported');\r\n }\r\n }\r\n else {\r\n // Use Infinity as the default so simple protocols don't have to care about partial synchronization\r\n protocolInstance.partialsThreshold = Infinity;\r\n }\r\n Syncable.registeredProtocols[name] = protocolInstance;\r\n};\r\n// Register addon in Dexie:\r\n__WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].Syncable = Syncable;\r\n__WEBPACK_IMPORTED_MODULE_0_dexie__[\"a\" /* default */].addons.push(Syncable);\n\n/* harmony default export */ __webpack_exports__[\"a\"] = Syncable;\n//# sourceMappingURL=dexie-syncable.es.js.map\n\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(85), __esModule: true };\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(86), __esModule: true };\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(87), __esModule: true };\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(88), __esModule: true };\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(90), __esModule: true };\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(91), __esModule: true };\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(92), __esModule: true };\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(94), __esModule: true };\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(95), __esModule: true };\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nexports.default = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _defineProperty = __webpack_require__(40);\n\nvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n (0, _defineProperty2.default)(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _defineProperty = __webpack_require__(40);\n\nvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (obj, key, value) {\n if (key in obj) {\n (0, _defineProperty2.default)(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n};\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _setPrototypeOf = __webpack_require__(76);\n\nvar _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);\n\nvar _create = __webpack_require__(73);\n\nvar _create2 = _interopRequireDefault(_create);\n\nvar _typeof2 = __webpack_require__(41);\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + (typeof superClass === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(superClass)));\n }\n\n subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _typeof2 = __webpack_require__(41);\n\nvar _typeof3 = _interopRequireDefault(_typeof2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && ((typeof call === \"undefined\" ? \"undefined\" : (0, _typeof3.default)(call)) === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _from = __webpack_require__(70);\n\nvar _from2 = _interopRequireDefault(_from);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n } else {\n return (0, _from2.default)(arr);\n }\n};\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(38);\n__webpack_require__(116);\nmodule.exports = __webpack_require__(0).Array.from;\n\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar core = __webpack_require__(0);\nvar $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });\nmodule.exports = function stringify(it) { // eslint-disable-line no-unused-vars\n return $JSON.stringify.apply($JSON, arguments);\n};\n\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(118);\nmodule.exports = __webpack_require__(0).Object.assign;\n\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(119);\nvar $Object = __webpack_require__(0).Object;\nmodule.exports = function create(P, D) {\n return $Object.create(P, D);\n};\n\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(120);\nvar $Object = __webpack_require__(0).Object;\nmodule.exports = function defineProperty(it, key, desc) {\n return $Object.defineProperty(it, key, desc);\n};\n\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(121);\nmodule.exports = __webpack_require__(0).Object.getPrototypeOf;\n\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(122);\nmodule.exports = __webpack_require__(0).Object.keys;\n\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(123);\nmodule.exports = __webpack_require__(0).Object.setPrototypeOf;\n\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(61);\n__webpack_require__(38);\n__webpack_require__(62);\n__webpack_require__(124);\n__webpack_require__(126);\n__webpack_require__(127);\nmodule.exports = __webpack_require__(0).Promise;\n\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(125);\n__webpack_require__(61);\n__webpack_require__(128);\n__webpack_require__(129);\nmodule.exports = __webpack_require__(0).Symbol;\n\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(38);\n__webpack_require__(62);\nmodule.exports = __webpack_require__(37).f('iterator');\n\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports) {\n\nmodule.exports = function () { /* empty */ };\n\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = __webpack_require__(12);\nvar toLength = __webpack_require__(34);\nvar toAbsoluteIndex = __webpack_require__(115);\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $defineProperty = __webpack_require__(5);\nvar createDesc = __webpack_require__(16);\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// all enumerable object keys, includes symbols\nvar getKeys = __webpack_require__(15);\nvar gOPS = __webpack_require__(30);\nvar pIE = __webpack_require__(20);\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(10);\nvar call = __webpack_require__(47);\nvar isArrayIter = __webpack_require__(46);\nvar anObject = __webpack_require__(4);\nvar toLength = __webpack_require__(34);\nvar getIterFn = __webpack_require__(60);\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports) {\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.2.2 IsArray(argument)\nvar cof = __webpack_require__(13);\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar create = __webpack_require__(29);\nvar descriptor = __webpack_require__(16);\nvar setToStringTag = __webpack_require__(21);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(9)(IteratorPrototype, __webpack_require__(2)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar META = __webpack_require__(22)('meta');\nvar isObject = __webpack_require__(7);\nvar has = __webpack_require__(8);\nvar setDesc = __webpack_require__(5).f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !__webpack_require__(11)(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(1);\nvar macrotask = __webpack_require__(59).set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(13)(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n var promise = Promise.resolve();\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = __webpack_require__(15);\nvar gOPS = __webpack_require__(30);\nvar pIE = __webpack_require__(20);\nvar toObject = __webpack_require__(17);\nvar IObject = __webpack_require__(45);\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(11)(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n } return T;\n} : $assign;\n\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(5);\nvar anObject = __webpack_require__(4);\nvar getKeys = __webpack_require__(15);\n\nmodule.exports = __webpack_require__(6) ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = __webpack_require__(12);\nvar gOPN = __webpack_require__(51).f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar hide = __webpack_require__(9);\nmodule.exports = function (target, src, safe) {\n for (var key in src) {\n if (safe && target[key]) target[key] = src[key];\n else hide(target, key, src[key]);\n } return target;\n};\n\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = __webpack_require__(7);\nvar anObject = __webpack_require__(4);\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = __webpack_require__(10)(Function.call, __webpack_require__(50).f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(1);\nvar core = __webpack_require__(0);\nvar dP = __webpack_require__(5);\nvar DESCRIPTORS = __webpack_require__(6);\nvar SPECIES = __webpack_require__(2)('species');\n\nmodule.exports = function (KEY) {\n var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(33);\nvar defined = __webpack_require__(25);\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(33);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar ctx = __webpack_require__(10);\nvar $export = __webpack_require__(3);\nvar toObject = __webpack_require__(17);\nvar call = __webpack_require__(47);\nvar isArrayIter = __webpack_require__(46);\nvar toLength = __webpack_require__(34);\nvar createProperty = __webpack_require__(99);\nvar getIterFn = __webpack_require__(60);\n\n$export($export.S + $export.F * !__webpack_require__(49)(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar addToUnscopables = __webpack_require__(96);\nvar step = __webpack_require__(105);\nvar Iterators = __webpack_require__(14);\nvar toIObject = __webpack_require__(12);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(48)(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(3);\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(108) });\n\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: __webpack_require__(29) });\n\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar $export = __webpack_require__(3);\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !__webpack_require__(6), 'Object', { defineProperty: __webpack_require__(5).f });\n\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = __webpack_require__(17);\nvar $getPrototypeOf = __webpack_require__(52);\n\n__webpack_require__(54)('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = __webpack_require__(17);\nvar $keys = __webpack_require__(15);\n\n__webpack_require__(54)('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = __webpack_require__(3);\n$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(112).set });\n\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(19);\nvar global = __webpack_require__(1);\nvar ctx = __webpack_require__(10);\nvar classof = __webpack_require__(42);\nvar $export = __webpack_require__(3);\nvar isObject = __webpack_require__(7);\nvar aFunction = __webpack_require__(18);\nvar anInstance = __webpack_require__(97);\nvar forOf = __webpack_require__(101);\nvar speciesConstructor = __webpack_require__(58);\nvar task = __webpack_require__(59).set;\nvar microtask = __webpack_require__(107)();\nvar newPromiseCapabilityModule = __webpack_require__(28);\nvar perform = __webpack_require__(55);\nvar promiseResolve = __webpack_require__(56);\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[__webpack_require__(2)('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value);\n if (domain) domain.exit();\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = __webpack_require__(111)($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(21)($Promise, PROMISE);\n__webpack_require__(113)(PROMISE);\nWrapper = __webpack_require__(0)[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(49)(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// ECMAScript 6 symbols shim\nvar global = __webpack_require__(1);\nvar has = __webpack_require__(8);\nvar DESCRIPTORS = __webpack_require__(6);\nvar $export = __webpack_require__(3);\nvar redefine = __webpack_require__(57);\nvar META = __webpack_require__(106).KEY;\nvar $fails = __webpack_require__(11);\nvar shared = __webpack_require__(32);\nvar setToStringTag = __webpack_require__(21);\nvar uid = __webpack_require__(22);\nvar wks = __webpack_require__(2);\nvar wksExt = __webpack_require__(37);\nvar wksDefine = __webpack_require__(36);\nvar enumKeys = __webpack_require__(100);\nvar isArray = __webpack_require__(103);\nvar anObject = __webpack_require__(4);\nvar isObject = __webpack_require__(7);\nvar toIObject = __webpack_require__(12);\nvar toPrimitive = __webpack_require__(35);\nvar createDesc = __webpack_require__(16);\nvar _create = __webpack_require__(29);\nvar gOPNExt = __webpack_require__(110);\nvar $GOPD = __webpack_require__(50);\nvar $DP = __webpack_require__(5);\nvar $keys = __webpack_require__(15);\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function';\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n __webpack_require__(51).f = gOPNExt.f = $getOwnPropertyNames;\n __webpack_require__(20).f = $propertyIsEnumerable;\n __webpack_require__(30).f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !__webpack_require__(19)) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(9)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// https://github.com/tc39/proposal-promise-finally\n\nvar $export = __webpack_require__(3);\nvar core = __webpack_require__(0);\nvar global = __webpack_require__(1);\nvar speciesConstructor = __webpack_require__(58);\nvar promiseResolve = __webpack_require__(56);\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n var C = speciesConstructor(this, core.Promise || global.Promise);\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n} });\n\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-promise-try\nvar $export = __webpack_require__(3);\nvar newPromiseCapability = __webpack_require__(28);\nvar perform = __webpack_require__(55);\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n var promiseCapability = newPromiseCapability.f(this);\n var result = perform(callbackfn);\n (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n return promiseCapability.promise;\n} });\n\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(36)('asyncIterator');\n\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(36)('observable');\n\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// the whatwg-fetch polyfill installs the fetch() function\n// on the global object (window or self)\n//\n// Return that as the export for use in Webpack, Browserify etc.\n__webpack_require__(134);\nmodule.exports = self.fetch.bind(self);\n\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports) {\n\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global, process) {(function (global, undefined) {\n \"use strict\";\n\n if (global.setImmediate) {\n return;\n }\n\n var nextHandle = 1; // Spec says greater than zero\n var tasksByHandle = {};\n var currentlyRunningATask = false;\n var doc = global.document;\n var registerImmediate;\n\n function setImmediate(callback) {\n // Callback can either be a function or a string\n if (typeof callback !== \"function\") {\n callback = new Function(\"\" + callback);\n }\n // Copy function arguments\n var args = new Array(arguments.length - 1);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i + 1];\n }\n // Store and register the task\n var task = { callback: callback, args: args };\n tasksByHandle[nextHandle] = task;\n registerImmediate(nextHandle);\n return nextHandle++;\n }\n\n function clearImmediate(handle) {\n delete tasksByHandle[handle];\n }\n\n function run(task) {\n var callback = task.callback;\n var args = task.args;\n switch (args.length) {\n case 0:\n callback();\n break;\n case 1:\n callback(args[0]);\n break;\n case 2:\n callback(args[0], args[1]);\n break;\n case 3:\n callback(args[0], args[1], args[2]);\n break;\n default:\n callback.apply(undefined, args);\n break;\n }\n }\n\n function runIfPresent(handle) {\n // From the spec: \"Wait until any invocations of this algorithm started before this one have completed.\"\n // So if we're currently running a task, we'll need to delay this invocation.\n if (currentlyRunningATask) {\n // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n // \"too much recursion\" error.\n setTimeout(runIfPresent, 0, handle);\n } else {\n var task = tasksByHandle[handle];\n if (task) {\n currentlyRunningATask = true;\n try {\n run(task);\n } finally {\n clearImmediate(handle);\n currentlyRunningATask = false;\n }\n }\n }\n }\n\n function installNextTickImplementation() {\n registerImmediate = function(handle) {\n process.nextTick(function () { runIfPresent(handle); });\n };\n }\n\n function canUsePostMessage() {\n // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n // where `global.postMessage` means something completely different and can't be used for this purpose.\n if (global.postMessage && !global.importScripts) {\n var postMessageIsAsynchronous = true;\n var oldOnMessage = global.onmessage;\n global.onmessage = function() {\n postMessageIsAsynchronous = false;\n };\n global.postMessage(\"\", \"*\");\n global.onmessage = oldOnMessage;\n return postMessageIsAsynchronous;\n }\n }\n\n function installPostMessageImplementation() {\n // Installs an event handler on `global` for the `message` event: see\n // * https://developer.mozilla.org/en/DOM/window.postMessage\n // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n\n var messagePrefix = \"setImmediate$\" + Math.random() + \"$\";\n var onGlobalMessage = function(event) {\n if (event.source === global &&\n typeof event.data === \"string\" &&\n event.data.indexOf(messagePrefix) === 0) {\n runIfPresent(+event.data.slice(messagePrefix.length));\n }\n };\n\n if (global.addEventListener) {\n global.addEventListener(\"message\", onGlobalMessage, false);\n } else {\n global.attachEvent(\"onmessage\", onGlobalMessage);\n }\n\n registerImmediate = function(handle) {\n global.postMessage(messagePrefix + handle, \"*\");\n };\n }\n\n function installMessageChannelImplementation() {\n var channel = new MessageChannel();\n channel.port1.onmessage = function(event) {\n var handle = event.data;\n runIfPresent(handle);\n };\n\n registerImmediate = function(handle) {\n channel.port2.postMessage(handle);\n };\n }\n\n function installReadyStateChangeImplementation() {\n var html = doc.documentElement;\n registerImmediate = function(handle) {\n // Create a